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

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2021-03-12 19:26:10 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2021-03-12 19:26:10 +0300
commit6653ccc011dec86e5140a5d09ea3b2357eab6714 (patch)
tree897193f37bcd98152a0ac214f80a3c4cfe1047c5
parentbff35a05aed6a31380a73c39113808fd262c2c37 (diff)
Add latest changes from gitlab-org/gitlab@13-10-stable-eev13.10.0-rc41
-rw-r--r--.eslintignore6
-rw-r--r--.eslintrc.yml12
-rw-r--r--.gitignore3
-rw-r--r--.gitlab-ci.yml2
-rw-r--r--.gitlab/CODEOWNERS27
-rw-r--r--.gitlab/ci/cache-repo.gitlab-ci.yml2
-rw-r--r--.gitlab/ci/frontend.gitlab-ci.yml20
-rw-r--r--.gitlab/ci/global.gitlab-ci.yml4
-rw-r--r--.gitlab/ci/graphql.gitlab-ci.yml1
-rw-r--r--.gitlab/ci/rails.gitlab-ci.yml42
-rw-r--r--.gitlab/ci/reports.gitlab-ci.yml2
-rw-r--r--.gitlab/ci/rules.gitlab-ci.yml64
-rw-r--r--.gitlab/ci/verify-lockfile.gitlab-ci.yml11
-rw-r--r--.gitlab/ci/workhorse.gitlab-ci.yml12
-rw-r--r--.gitlab/issue_templates/Adoption Engineering.md14
-rw-r--r--.gitlab/issue_templates/Experiment Successful Cleanup.md5
-rw-r--r--.gitlab/issue_templates/Experimentation.md25
-rw-r--r--.gitlab/issue_templates/Query Performance Investigation.md8
-rw-r--r--.gitlab/issue_templates/experiment_tracking_template.md94
-rw-r--r--.haml-lint_todo.yml8
-rw-r--r--.prettierignore2
-rw-r--r--.rubocop.yml40
-rw-r--r--.rubocop_manual_todo.yml161
-rw-r--r--.rubocop_todo.yml299
-rw-r--r--.scss-lint.yml277
-rw-r--r--.stylelintrc95
-rw-r--r--CHANGELOG.md23
-rw-r--r--GITALY_SERVER_VERSION2
l---------[-rw-r--r--]GITLAB_WORKHORSE_VERSION2
-rw-r--r--Gemfile32
-rw-r--r--Gemfile.lock140
-rw-r--r--PROCESS.md4
-rw-r--r--app/assets/images/learn_gitlab/code_owners_enabled.svg5
-rw-r--r--app/assets/images/learn_gitlab/git_write.svg16
-rw-r--r--app/assets/images/learn_gitlab/merge_request_created.svg107
-rw-r--r--app/assets/images/learn_gitlab/pipeline_created.svg38
-rw-r--r--app/assets/images/learn_gitlab/required_mr_approvals_enabled.svg70
-rw-r--r--app/assets/images/learn_gitlab/security_scan_enabled.svg36
-rw-r--r--app/assets/images/learn_gitlab/trial_started.svg9
-rw-r--r--app/assets/images/learn_gitlab/user_added.svg4
-rw-r--r--app/assets/javascripts/access_tokens/components/projects_field.vue69
-rw-r--r--app/assets/javascripts/access_tokens/components/projects_token_selector.vue158
-rw-r--r--app/assets/javascripts/access_tokens/graphql/queries/get_projects.query.graphql28
-rw-r--r--app/assets/javascripts/access_tokens/index.js62
-rw-r--r--app/assets/javascripts/admin/dev_ops_report/devops_adoption.js2
-rw-r--r--app/assets/javascripts/admin/users/tabs.js11
-rw-r--r--app/assets/javascripts/alert_management/components/alert_management_table.vue20
-rw-r--r--app/assets/javascripts/alerts_settings/components/alert_mapping_builder.vue43
-rw-r--r--app/assets/javascripts/alerts_settings/components/alerts_integrations_list.vue15
-rw-r--r--app/assets/javascripts/alerts_settings/components/alerts_settings_form.vue636
-rw-r--r--app/assets/javascripts/alerts_settings/components/alerts_settings_wrapper.vue189
-rw-r--r--app/assets/javascripts/alerts_settings/components/mocks/parsedMapping.json95
-rw-r--r--app/assets/javascripts/alerts_settings/constants.js152
-rw-r--r--app/assets/javascripts/alerts_settings/graphql.js16
-rw-r--r--app/assets/javascripts/alerts_settings/graphql/fragments/http_integration_item.fragment.graphql7
-rw-r--r--app/assets/javascripts/alerts_settings/graphql/fragments/http_integration_payload_data.fragment.graphql3
-rw-r--r--app/assets/javascripts/alerts_settings/graphql/mutations/create_http_integration.mutation.graphql22
-rw-r--r--app/assets/javascripts/alerts_settings/graphql/mutations/destroy_http_integration.mutation.graphql4
-rw-r--r--app/assets/javascripts/alerts_settings/graphql/mutations/reset_http_token.mutation.graphql4
-rw-r--r--app/assets/javascripts/alerts_settings/graphql/mutations/update_current_http_integration.mutation.graphql25
-rw-r--r--app/assets/javascripts/alerts_settings/graphql/mutations/update_current_intergration.mutation.graphql19
-rw-r--r--app/assets/javascripts/alerts_settings/graphql/mutations/update_current_prometheus_integration.mutation.graphql21
-rw-r--r--app/assets/javascripts/alerts_settings/graphql/mutations/update_http_integration.mutation.graphql4
-rw-r--r--app/assets/javascripts/alerts_settings/graphql/queries/get_http_integrations.query.graphql12
-rw-r--r--app/assets/javascripts/alerts_settings/graphql/queries/parse_sample_payload.query.graphql9
-rw-r--r--app/assets/javascripts/alerts_settings/index.js5
-rw-r--r--app/assets/javascripts/alerts_settings/utils/cache_updates.js34
-rw-r--r--app/assets/javascripts/alerts_settings/utils/error_messages.js2
-rw-r--r--app/assets/javascripts/alerts_settings/utils/mapping_transformations.js28
-rw-r--r--app/assets/javascripts/analytics/devops_report/components/usage_ping_disabled.vue (renamed from app/assets/javascripts/admin/dev_ops_report/components/usage_ping_disabled.vue)0
-rw-r--r--app/assets/javascripts/analytics/devops_report/devops_score_empty_state.js (renamed from app/assets/javascripts/admin/dev_ops_report/devops_score_empty_state.js)0
-rw-r--r--app/assets/javascripts/analytics/instance_statistics/components/app.vue48
-rw-r--r--app/assets/javascripts/analytics/instance_statistics/components/charts_config.js87
-rw-r--r--app/assets/javascripts/analytics/instance_statistics/components/instance_counts.vue64
-rw-r--r--app/assets/javascripts/analytics/instance_statistics/components/instance_statistics_count_chart.vue206
-rw-r--r--app/assets/javascripts/analytics/instance_statistics/components/projects_and_groups_chart.vue224
-rw-r--r--app/assets/javascripts/analytics/instance_statistics/components/users_chart.vue143
-rw-r--r--app/assets/javascripts/analytics/instance_statistics/graphql/fragments/count.fragment.graphql4
-rw-r--r--app/assets/javascripts/analytics/instance_statistics/graphql/queries/groups.query.graphql13
-rw-r--r--app/assets/javascripts/analytics/instance_statistics/graphql/queries/instance_count.query.graphql13
-rw-r--r--app/assets/javascripts/analytics/instance_statistics/graphql/queries/instance_statistics_count.query.graphql34
-rw-r--r--app/assets/javascripts/analytics/instance_statistics/graphql/queries/projects.query.graphql13
-rw-r--r--app/assets/javascripts/analytics/instance_statistics/graphql/queries/users.query.graphql13
-rw-r--r--app/assets/javascripts/analytics/instance_statistics/index.js24
-rw-r--r--app/assets/javascripts/analytics/instance_statistics/utils.js68
-rw-r--r--app/assets/javascripts/analytics/usage_trends/components/app.vue41
-rw-r--r--app/assets/javascripts/analytics/usage_trends/components/charts_config.js106
-rw-r--r--app/assets/javascripts/analytics/usage_trends/components/usage_counts.vue63
-rw-r--r--app/assets/javascripts/analytics/usage_trends/components/usage_trends_count_chart.vue206
-rw-r--r--app/assets/javascripts/analytics/usage_trends/components/users_chart.vue143
-rw-r--r--app/assets/javascripts/analytics/usage_trends/constants.js (renamed from app/assets/javascripts/analytics/instance_statistics/constants.js)0
-rw-r--r--app/assets/javascripts/analytics/usage_trends/graphql/fragments/count.fragment.graphql4
-rw-r--r--app/assets/javascripts/analytics/usage_trends/graphql/queries/usage_count.query.graphql13
-rw-r--r--app/assets/javascripts/analytics/usage_trends/graphql/queries/usage_trends_count.query.graphql34
-rw-r--r--app/assets/javascripts/analytics/usage_trends/graphql/queries/users.query.graphql13
-rw-r--r--app/assets/javascripts/analytics/usage_trends/index.js24
-rw-r--r--app/assets/javascripts/analytics/usage_trends/utils.js68
-rw-r--r--app/assets/javascripts/api.js39
-rw-r--r--app/assets/javascripts/authentication/two_factor_auth/components/recovery_codes.vue2
-rw-r--r--app/assets/javascripts/awards_handler.js9
-rw-r--r--app/assets/javascripts/badges/components/badge.vue2
-rw-r--r--app/assets/javascripts/badges/components/badge_form.vue4
-rw-r--r--app/assets/javascripts/batch_comments/stores/modules/batch_comments/actions.js22
-rw-r--r--app/assets/javascripts/behaviors/copy_to_clipboard.js38
-rw-r--r--app/assets/javascripts/behaviors/toggler_behavior.js2
-rw-r--r--app/assets/javascripts/blob/blob_file_dropzone.js4
-rw-r--r--app/assets/javascripts/blob/viewer/index.js9
-rw-r--r--app/assets/javascripts/blob_edit/blob_bundle.js2
-rw-r--r--app/assets/javascripts/boards/boards_util.js28
-rw-r--r--app/assets/javascripts/boards/components/board_add_new_column.vue143
-rw-r--r--app/assets/javascripts/boards/components/board_add_new_column_form.vue131
-rw-r--r--app/assets/javascripts/boards/components/board_add_new_column_trigger.vue2
-rw-r--r--app/assets/javascripts/boards/components/board_card.vue83
-rw-r--r--app/assets/javascripts/boards/components/board_card_deprecated.vue61
-rw-r--r--app/assets/javascripts/boards/components/board_card_inner.vue268
-rw-r--r--app/assets/javascripts/boards/components/board_card_layout.vue98
-rw-r--r--app/assets/javascripts/boards/components/board_card_layout_deprecated.vue3
-rw-r--r--app/assets/javascripts/boards/components/board_column.vue21
-rw-r--r--app/assets/javascripts/boards/components/board_content.vue31
-rw-r--r--app/assets/javascripts/boards/components/board_form.vue75
-rw-r--r--app/assets/javascripts/boards/components/board_list.vue68
-rw-r--r--app/assets/javascripts/boards/components/board_list_deprecated.vue2
-rw-r--r--app/assets/javascripts/boards/components/board_list_header.vue47
-rw-r--r--app/assets/javascripts/boards/components/board_new_issue.vue7
-rw-r--r--app/assets/javascripts/boards/components/board_new_issue_deprecated.vue6
-rw-r--r--app/assets/javascripts/boards/components/board_sidebar.js6
-rw-r--r--app/assets/javascripts/boards/components/boards_selector.vue43
-rw-r--r--app/assets/javascripts/boards/components/boards_selector_deprecated.vue7
-rw-r--r--app/assets/javascripts/boards/components/config_toggle.vue64
-rw-r--r--app/assets/javascripts/boards/components/filtered_search.vue54
-rw-r--r--app/assets/javascripts/boards/components/issue_card_inner.vue262
-rw-r--r--app/assets/javascripts/boards/components/issue_card_inner_deprecated.vue6
-rw-r--r--app/assets/javascripts/boards/components/issue_due_date.vue6
-rw-r--r--app/assets/javascripts/boards/components/issue_time_estimate.vue2
-rw-r--r--app/assets/javascripts/boards/components/modal/list.vue6
-rw-r--r--app/assets/javascripts/boards/components/sidebar/remove_issue.vue88
-rw-r--r--app/assets/javascripts/boards/config_toggle.js25
-rw-r--r--app/assets/javascripts/boards/constants.js5
-rw-r--r--app/assets/javascripts/boards/filtered_search.js25
-rw-r--r--app/assets/javascripts/boards/graphql/board_labels.query.graphql4
-rw-r--r--app/assets/javascripts/boards/graphql/board_list_create.mutation.graphql20
-rw-r--r--app/assets/javascripts/boards/graphql/users_search.query.graphql11
-rw-r--r--app/assets/javascripts/boards/index.js26
-rw-r--r--app/assets/javascripts/boards/mixins/board_card_inner.js8
-rw-r--r--app/assets/javascripts/boards/mixins/issue_card_inner.js10
-rw-r--r--app/assets/javascripts/boards/mount_multiple_boards_switcher.js6
-rw-r--r--app/assets/javascripts/boards/stores/actions.js104
-rw-r--r--app/assets/javascripts/boards/stores/getters.js20
-rw-r--r--app/assets/javascripts/boards/stores/mutation_types.js10
-rw-r--r--app/assets/javascripts/boards/stores/mutations.js113
-rw-r--r--app/assets/javascripts/boards/stores/state.js14
-rw-r--r--app/assets/javascripts/captcha/captcha_modal.vue10
-rw-r--r--app/assets/javascripts/captcha/captcha_modal_axios_interceptor.js37
-rw-r--r--app/assets/javascripts/captcha/unsolved_captcha_error.js10
-rw-r--r--app/assets/javascripts/captcha/wait_for_captcha_to_be_solved.js53
-rw-r--r--app/assets/javascripts/ci_variable_list/components/ci_environments_dropdown.vue12
-rw-r--r--app/assets/javascripts/ci_variable_list/components/ci_variable_table.vue2
-rw-r--r--app/assets/javascripts/clusters/components/fluentd_output_settings.vue20
-rw-r--r--app/assets/javascripts/clusters/components/ingress_modsecurity_settings.vue12
-rw-r--r--app/assets/javascripts/clusters_list/store/actions.js2
-rw-r--r--app/assets/javascripts/commit/pipelines/pipelines_bundle.js2
-rw-r--r--app/assets/javascripts/commit/pipelines/pipelines_table.vue11
-rw-r--r--app/assets/javascripts/commons/bootstrap.js67
-rw-r--r--app/assets/javascripts/commons/vue.js2
-rw-r--r--app/assets/javascripts/create_cluster/eks_cluster/constants.js5
-rw-r--r--app/assets/javascripts/cycle_analytics/components/base.vue288
-rw-r--r--app/assets/javascripts/cycle_analytics/cycle_analytics_bundle.js156
-rw-r--r--app/assets/javascripts/cycle_analytics/index.js32
-rw-r--r--app/assets/javascripts/deprecated_jquery_dropdown/gl_dropdown.js43
-rw-r--r--app/assets/javascripts/design_management/components/delete_button.vue16
-rw-r--r--app/assets/javascripts/design_management/components/design_destroyer.vue1
-rw-r--r--app/assets/javascripts/design_management/components/design_notes/design_discussion.vue6
-rw-r--r--app/assets/javascripts/design_management/components/list/item.vue1
-rw-r--r--app/assets/javascripts/design_management/components/toolbar/index.vue2
-rw-r--r--app/assets/javascripts/design_management/components/upload/button.vue2
-rw-r--r--app/assets/javascripts/design_management/pages/index.vue5
-rw-r--r--app/assets/javascripts/diffs/components/app.vue14
-rw-r--r--app/assets/javascripts/diffs/components/diff_discussion_reply.vue5
-rw-r--r--app/assets/javascripts/diffs/components/diff_file.vue14
-rw-r--r--app/assets/javascripts/diffs/components/diff_file_header.vue6
-rw-r--r--app/assets/javascripts/diffs/components/settings_dropdown.vue46
-rw-r--r--app/assets/javascripts/diffs/constants.js1
-rw-r--r--app/assets/javascripts/diffs/i18n.js1
-rw-r--r--app/assets/javascripts/diffs/index.js2
-rw-r--r--app/assets/javascripts/diffs/store/actions.js5
-rw-r--r--app/assets/javascripts/diffs/store/utils.js2
-rw-r--r--app/assets/javascripts/diffs/utils/file_reviews.js7
-rw-r--r--app/assets/javascripts/diffs/utils/preferences.js13
-rw-r--r--app/assets/javascripts/editor/constants.js3
-rw-r--r--app/assets/javascripts/editor/extensions/editor_lite_webide_ext.js164
-rw-r--r--app/assets/javascripts/emoji/components/category.vue61
-rw-r--r--app/assets/javascripts/emoji/components/emoji_group.vue35
-rw-r--r--app/assets/javascripts/emoji/components/emoji_list.vue44
-rw-r--r--app/assets/javascripts/emoji/components/picker.vue121
-rw-r--r--app/assets/javascripts/emoji/components/utils.js27
-rw-r--r--app/assets/javascripts/emoji/constants.js14
-rw-r--r--app/assets/javascripts/emoji/index.js16
-rw-r--r--app/assets/javascripts/environments/components/environments_app.vue6
-rw-r--r--app/assets/javascripts/environments/mixins/environments_pagination_api_mixin.js2
-rw-r--r--app/assets/javascripts/environments/services/environments_service.js4
-rw-r--r--app/assets/javascripts/experimentation/constants.js1
-rw-r--r--app/assets/javascripts/experimentation/experiment_tracking.js24
-rw-r--r--app/assets/javascripts/experimentation/utils.js10
-rw-r--r--app/assets/javascripts/feature_flags/components/configure_feature_flags_modal.vue13
-rw-r--r--app/assets/javascripts/feature_flags/components/edit_feature_flag.vue2
-rw-r--r--app/assets/javascripts/feature_flags/components/feature_flags.vue8
-rw-r--r--app/assets/javascripts/flash.js2
-rw-r--r--app/assets/javascripts/gfm_auto_complete.js78
-rw-r--r--app/assets/javascripts/graphql_shared/fragments/alert.fragment.graphql6
-rw-r--r--app/assets/javascripts/graphql_shared/queries/project_user_members_search.query.graphql14
-rw-r--r--app/assets/javascripts/graphql_shared/queries/users_search.query.graphql12
-rw-r--r--app/assets/javascripts/graphql_shared/utils.js34
-rw-r--r--app/assets/javascripts/groups/components/group_item.vue43
-rw-r--r--app/assets/javascripts/groups/components/invite_members_banner.vue4
-rw-r--r--app/assets/javascripts/groups/components/item_caret.vue4
-rw-r--r--app/assets/javascripts/groups_select.js30
-rw-r--r--app/assets/javascripts/helpers/cve_id_request_helper.js50
-rw-r--r--app/assets/javascripts/ide/components/branches/item.vue2
-rw-r--r--app/assets/javascripts/ide/components/branches/search_list.vue7
-rw-r--r--app/assets/javascripts/ide/components/file_templates/bar.vue4
-rw-r--r--app/assets/javascripts/ide/components/merge_requests/item.vue2
-rw-r--r--app/assets/javascripts/ide/components/merge_requests/list.vue9
-rw-r--r--app/assets/javascripts/ide/components/nav_form.vue25
-rw-r--r--app/assets/javascripts/ide/components/pipelines/list.vue3
-rw-r--r--app/assets/javascripts/ide/components/preview/navigator.vue2
-rw-r--r--app/assets/javascripts/ide/components/repo_editor.vue81
-rw-r--r--app/assets/javascripts/ide/components/repo_tab.vue46
-rw-r--r--app/assets/javascripts/ide/components/repo_tabs.vue6
-rw-r--r--app/assets/javascripts/ide/components/shared/tokened_input.vue4
-rw-r--r--app/assets/javascripts/ide/index.js1
-rw-r--r--app/assets/javascripts/import_entities/components/import_status.vue2
-rw-r--r--app/assets/javascripts/import_entities/constants.js6
-rw-r--r--app/assets/javascripts/import_entities/import_groups/components/import_table.vue92
-rw-r--r--app/assets/javascripts/import_entities/import_groups/components/import_table_row.vue147
-rw-r--r--app/assets/javascripts/import_entities/import_groups/graphql/client_factory.js78
-rw-r--r--app/assets/javascripts/import_entities/import_groups/graphql/queries/group.query.graphql5
-rw-r--r--app/assets/javascripts/import_entities/import_groups/graphql/services/source_groups_manager.js83
-rw-r--r--app/assets/javascripts/import_entities/import_groups/graphql/services/status_poller.js12
-rw-r--r--app/assets/javascripts/import_entities/import_groups/index.js3
-rw-r--r--app/assets/javascripts/incidents_settings/constants.js4
-rw-r--r--app/assets/javascripts/integrations/edit/components/active_checkbox.vue2
-rw-r--r--app/assets/javascripts/integrations/edit/components/confirmation_modal.vue2
-rw-r--r--app/assets/javascripts/integrations/edit/components/integration_form.vue17
-rw-r--r--app/assets/javascripts/invite_members/components/group_select.vue103
-rw-r--r--app/assets/javascripts/invite_members/components/invite_group_trigger.vue34
-rw-r--r--app/assets/javascripts/invite_members/components/invite_members_modal.vue148
-rw-r--r--app/assets/javascripts/invite_members/components/invite_members_trigger.vue29
-rw-r--r--app/assets/javascripts/invite_members/components/members_token_select.vue4
-rw-r--r--app/assets/javascripts/invite_members/constants.js2
-rw-r--r--app/assets/javascripts/invite_members/init_invite_group_trigger.js20
-rw-r--r--app/assets/javascripts/invite_members/init_invite_members_form.js7
-rw-r--r--app/assets/javascripts/invite_members/init_invite_members_modal.js1
-rw-r--r--app/assets/javascripts/issuable/components/csv_export_modal.vue100
-rw-r--r--app/assets/javascripts/issuable/components/csv_import_export_buttons.vue87
-rw-r--r--app/assets/javascripts/issuable/components/csv_import_modal.vue86
-rw-r--r--app/assets/javascripts/issuable/constants.js6
-rw-r--r--app/assets/javascripts/issuable/init_csv_import_export_buttons.js43
-rw-r--r--app/assets/javascripts/issuable_form.js6
-rw-r--r--app/assets/javascripts/issuable_list/components/issuable_item.vue8
-rw-r--r--app/assets/javascripts/issuable_list/components/issuable_list_root.vue8
-rw-r--r--app/assets/javascripts/issuable_show/components/issuable_discussion.vue15
-rw-r--r--app/assets/javascripts/issuable_show/components/issuable_show_root.vue10
-rw-r--r--app/assets/javascripts/issue.js9
-rw-r--r--app/assets/javascripts/issue_show/components/app.vue51
-rw-r--r--app/assets/javascripts/issue_show/components/description.vue15
-rw-r--r--app/assets/javascripts/issue_show/components/edit_actions.vue16
-rw-r--r--app/assets/javascripts/issue_show/components/fields/description_template.vue4
-rw-r--r--app/assets/javascripts/issue_show/components/form.vue6
-rw-r--r--app/assets/javascripts/issue_show/components/header_actions.vue3
-rw-r--r--app/assets/javascripts/issue_show/services/index.js2
-rw-r--r--app/assets/javascripts/issue_show/stores/index.js2
-rw-r--r--app/assets/javascripts/issue_show/utils/parse_data.js2
-rw-r--r--app/assets/javascripts/issues_list/components/issuable.vue31
-rw-r--r--app/assets/javascripts/issues_list/components/jira_issues_import_status_app.vue112
-rw-r--r--app/assets/javascripts/issues_list/components/jira_issues_list_root.vue112
-rw-r--r--app/assets/javascripts/issues_list/index.js8
-rw-r--r--app/assets/javascripts/jira_connect/components/app.vue48
-rw-r--r--app/assets/javascripts/jira_connect/components/groups_list_item.vue11
-rw-r--r--app/assets/javascripts/jira_connect/constants.js1
-rw-r--r--app/assets/javascripts/jira_connect/index.js5
-rw-r--r--app/assets/javascripts/jira_connect/store/mutation_types.js2
-rw-r--r--app/assets/javascripts/jira_connect/store/mutations.js6
-rw-r--r--app/assets/javascripts/jira_connect/store/state.js2
-rw-r--r--app/assets/javascripts/jira_connect/utils.js33
-rw-r--r--app/assets/javascripts/jobs/components/artifacts_block.vue2
-rw-r--r--app/assets/javascripts/jobs/components/commit_block.vue11
-rw-r--r--app/assets/javascripts/jobs/components/job_container_item.vue2
-rw-r--r--app/assets/javascripts/jobs/components/job_log_controllers.vue15
-rw-r--r--app/assets/javascripts/jobs/components/job_sidebar_retry_button.vue4
-rw-r--r--app/assets/javascripts/jobs/components/sidebar.vue74
-rw-r--r--app/assets/javascripts/jobs/components/sidebar_job_details_container.vue2
-rw-r--r--app/assets/javascripts/jobs/components/stages_dropdown.vue2
-rw-r--r--app/assets/javascripts/jobs/components/trigger_block.vue2
-rw-r--r--app/assets/javascripts/jobs/store/getters.js2
-rw-r--r--app/assets/javascripts/jobs/svg/scroll_down.svg4
-rw-r--r--app/assets/javascripts/lib/chrome_84_icon_fix.js78
-rw-r--r--app/assets/javascripts/lib/graphql.js3
-rw-r--r--app/assets/javascripts/lib/utils/experimentation.js3
-rw-r--r--app/assets/javascripts/lib/utils/http_status.js1
-rw-r--r--app/assets/javascripts/lib/utils/number_utils.js21
-rw-r--r--app/assets/javascripts/lib/utils/select2_utils.js25
-rw-r--r--app/assets/javascripts/lib/utils/text_markdown.js6
-rw-r--r--app/assets/javascripts/lib/utils/unit_format/formatter_factory.js70
-rw-r--r--app/assets/javascripts/lib/utils/unit_format/index.js342
-rw-r--r--app/assets/javascripts/lib/utils/url_utility.js5
-rw-r--r--app/assets/javascripts/locale/index.js20
-rw-r--r--app/assets/javascripts/members.js111
-rw-r--r--app/assets/javascripts/members/components/avatars/user_avatar.vue8
-rw-r--r--app/assets/javascripts/members/utils.js4
-rw-r--r--app/assets/javascripts/merge_conflicts/components/diff_file_editor.js115
-rw-r--r--app/assets/javascripts/merge_conflicts/components/diff_file_editor.vue128
-rw-r--r--app/assets/javascripts/merge_conflicts/components/inline_conflict_lines.js22
-rw-r--r--app/assets/javascripts/merge_conflicts/components/inline_conflict_lines.vue47
-rw-r--r--app/assets/javascripts/merge_conflicts/components/parallel_conflict_lines.js37
-rw-r--r--app/assets/javascripts/merge_conflicts/components/parallel_conflict_lines.vue47
-rw-r--r--app/assets/javascripts/merge_conflicts/constants.js20
-rw-r--r--app/assets/javascripts/merge_conflicts/merge_conflict_resolver_app.vue217
-rw-r--r--app/assets/javascripts/merge_conflicts/merge_conflicts_bundle.js26
-rw-r--r--app/assets/javascripts/merge_conflicts/store/actions.js120
-rw-r--r--app/assets/javascripts/merge_conflicts/store/getters.js117
-rw-r--r--app/assets/javascripts/merge_conflicts/store/index.js16
-rw-r--r--app/assets/javascripts/merge_conflicts/store/mutation_types.js8
-rw-r--r--app/assets/javascripts/merge_conflicts/store/mutations.js40
-rw-r--r--app/assets/javascripts/merge_conflicts/store/state.js13
-rw-r--r--app/assets/javascripts/merge_conflicts/utils.js228
-rw-r--r--app/assets/javascripts/merge_request_tabs.js2
-rw-r--r--app/assets/javascripts/milestone.js27
-rw-r--r--app/assets/javascripts/milestone_select.js2
-rw-r--r--app/assets/javascripts/monitoring/stores/actions.js2
-rw-r--r--app/assets/javascripts/monitoring/stores/embed_group/index.js2
-rw-r--r--app/assets/javascripts/notes/components/comment_form.vue208
-rw-r--r--app/assets/javascripts/notes/components/discussion_actions.vue4
-rw-r--r--app/assets/javascripts/notes/components/discussion_notes_replies_wrapper.vue2
-rw-r--r--app/assets/javascripts/notes/components/discussion_reply_placeholder.vue29
-rw-r--r--app/assets/javascripts/notes/components/note_actions.vue92
-rw-r--r--app/assets/javascripts/notes/components/note_form.vue4
-rw-r--r--app/assets/javascripts/notes/components/noteable_note.vue9
-rw-r--r--app/assets/javascripts/notes/components/notes_app.vue3
-rw-r--r--app/assets/javascripts/notes/components/sidebar_subscription.vue58
-rw-r--r--app/assets/javascripts/notes/i18n.js26
-rw-r--r--app/assets/javascripts/notes/stores/actions.js44
-rw-r--r--app/assets/javascripts/notes/stores/utils.js4
-rw-r--r--app/assets/javascripts/notifications/components/custom_notifications_modal.vue17
-rw-r--r--app/assets/javascripts/notifications/components/notifications_dropdown.vue71
-rw-r--r--app/assets/javascripts/notifications/components/notifications_dropdown_item.vue8
-rw-r--r--app/assets/javascripts/notifications/constants.js5
-rw-r--r--app/assets/javascripts/notifications_dropdown.js35
-rw-r--r--app/assets/javascripts/notifications_form.js48
-rw-r--r--app/assets/javascripts/packages/details/components/composer_installation.vue5
-rw-r--r--app/assets/javascripts/packages/details/components/conan_installation.vue5
-rw-r--r--app/assets/javascripts/packages/details/components/installation_title.vue38
-rw-r--r--app/assets/javascripts/packages/details/components/maven_installation.vue128
-rw-r--r--app/assets/javascripts/packages/details/components/npm_installation.vue5
-rw-r--r--app/assets/javascripts/packages/details/components/nuget_installation.vue6
-rw-r--r--app/assets/javascripts/packages/details/components/pypi_installation.vue5
-rw-r--r--app/assets/javascripts/packages/details/constants.js3
-rw-r--r--app/assets/javascripts/packages/details/store/getters.js16
-rw-r--r--app/assets/javascripts/packages/list/constants.js2
-rw-r--r--app/assets/javascripts/packages/shared/components/package_list_row.vue2
-rw-r--r--app/assets/javascripts/packages/shared/utils.js2
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/group/components/group_settings_app.vue5
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/group/components/maven_settings.vue3
-rw-r--r--app/assets/javascripts/pages/admin/admin.js32
-rw-r--r--app/assets/javascripts/pages/admin/dev_ops_report/index.js4
-rw-r--r--app/assets/javascripts/pages/admin/impersonation_tokens/index.js4
-rw-r--r--app/assets/javascripts/pages/admin/instance_statistics/index.js3
-rw-r--r--app/assets/javascripts/pages/admin/usage_trends/index.js3
-rw-r--r--app/assets/javascripts/pages/dashboard/issues/index.js16
-rw-r--r--app/assets/javascripts/pages/dashboard/milestones/show/index.js2
-rw-r--r--app/assets/javascripts/pages/dashboard/projects/index/index.js7
-rw-r--r--app/assets/javascripts/pages/dashboard/todos/index/index.js2
-rw-r--r--app/assets/javascripts/pages/groups/activity/index.js3
-rw-r--r--app/assets/javascripts/pages/groups/edit/index.js3
-rw-r--r--app/assets/javascripts/pages/groups/group_members/index.js9
-rw-r--r--app/assets/javascripts/pages/groups/milestones/show/index.js2
-rw-r--r--app/assets/javascripts/pages/groups/new/index.js14
-rw-r--r--app/assets/javascripts/pages/groups/settings/ci_cd/show/index.js27
-rw-r--r--app/assets/javascripts/pages/groups/settings/integrations/edit/index.js16
-rw-r--r--app/assets/javascripts/pages/groups/settings/packages_and_registries/index.js3
-rw-r--r--app/assets/javascripts/pages/groups/settings/repository/show/index.js11
-rw-r--r--app/assets/javascripts/pages/groups/shared/group_details.js13
-rw-r--r--app/assets/javascripts/pages/groups/show/index.js6
-rw-r--r--app/assets/javascripts/pages/profiles/index.js28
-rw-r--r--app/assets/javascripts/pages/profiles/index/index.js7
-rw-r--r--app/assets/javascripts/pages/profiles/notifications/show/index.js4
-rw-r--r--app/assets/javascripts/pages/profiles/personal_access_tokens/index.js5
-rw-r--r--app/assets/javascripts/pages/projects/blob/edit/index.js2
-rw-r--r--app/assets/javascripts/pages/projects/blob/new/index.js2
-rw-r--r--app/assets/javascripts/pages/projects/blob/show/index.js98
-rw-r--r--app/assets/javascripts/pages/projects/boards/index.js8
-rw-r--r--app/assets/javascripts/pages/projects/branches/index/index.js8
-rw-r--r--app/assets/javascripts/pages/projects/branches/new/index.js11
-rw-r--r--app/assets/javascripts/pages/projects/compare/show/index.js3
-rw-r--r--app/assets/javascripts/pages/projects/cycle_analytics/show/index.js2
-rw-r--r--app/assets/javascripts/pages/projects/feature_flags_user_lists/edit/index.js22
-rw-r--r--app/assets/javascripts/pages/projects/feature_flags_user_lists/new/index.js28
-rw-r--r--app/assets/javascripts/pages/projects/feature_flags_user_lists/show/index.js19
-rw-r--r--app/assets/javascripts/pages/projects/forks/new/components/app.vue72
-rw-r--r--app/assets/javascripts/pages/projects/forks/new/components/fork_form.vue304
-rw-r--r--app/assets/javascripts/pages/projects/forks/new/components/fork_groups_list_item.vue20
-rw-r--r--app/assets/javascripts/pages/projects/forks/new/index.js48
-rw-r--r--app/assets/javascripts/pages/projects/imports/show/index.js4
-rw-r--r--app/assets/javascripts/pages/projects/issues/index/index.js2
-rw-r--r--app/assets/javascripts/pages/projects/jobs/index/index.js30
-rw-r--r--app/assets/javascripts/pages/projects/labels/edit/index.js2
-rw-r--r--app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_a.vue8
-rw-r--r--app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_b.vue109
-rw-r--r--app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_info_card.vue70
-rw-r--r--app/assets/javascripts/pages/projects/learn_gitlab/constants/index.js56
-rw-r--r--app/assets/javascripts/pages/projects/logs/index.js2
-rw-r--r--app/assets/javascripts/pages/projects/merge_requests/edit/index.js6
-rw-r--r--app/assets/javascripts/pages/projects/merge_requests/index/index.js2
-rw-r--r--app/assets/javascripts/pages/projects/milestones/edit/index.js4
-rw-r--r--app/assets/javascripts/pages/projects/milestones/index/index.js2
-rw-r--r--app/assets/javascripts/pages/projects/milestones/new/index.js2
-rw-r--r--app/assets/javascripts/pages/projects/milestones/show/index.js6
-rw-r--r--app/assets/javascripts/pages/projects/new/index.js42
-rw-r--r--app/assets/javascripts/pages/projects/project_members/index.js110
-rw-r--r--app/assets/javascripts/pages/projects/prometheus/metrics/edit/index.js4
-rw-r--r--app/assets/javascripts/pages/projects/prometheus/metrics/new/index.js4
-rw-r--r--app/assets/javascripts/pages/projects/settings/access_tokens/index.js2
-rw-r--r--app/assets/javascripts/pages/projects/settings/ci_cd/show/index.js3
-rw-r--r--app/assets/javascripts/pages/projects/settings/operations/show/index.js5
-rw-r--r--app/assets/javascripts/pages/projects/settings/repository/show/index.js3
-rw-r--r--app/assets/javascripts/pages/projects/shared/permissions/components/settings_panel.vue36
-rw-r--r--app/assets/javascripts/pages/projects/shared/permissions/constants.js6
-rw-r--r--app/assets/javascripts/pages/projects/show/index.js21
-rw-r--r--app/assets/javascripts/pages/projects/tags/new/index.js8
-rw-r--r--app/assets/javascripts/pages/projects/tags/releases/index.js6
-rw-r--r--app/assets/javascripts/pages/search/show/index.js4
-rw-r--r--app/assets/javascripts/pages/shared/wikis/components/wiki_alert.vue31
-rw-r--r--app/assets/javascripts/pages/shared/wikis/index.js28
-rw-r--r--app/assets/javascripts/pages/users/index.js10
-rw-r--r--app/assets/javascripts/performance/constants.js21
-rw-r--r--app/assets/javascripts/performance_bar/components/performance_bar_app.vue9
-rw-r--r--app/assets/javascripts/performance_bar/index.js2
-rw-r--r--app/assets/javascripts/pipeline_editor/components/commit/commit_form.vue16
-rw-r--r--app/assets/javascripts/pipeline_editor/components/commit/commit_section.vue18
-rw-r--r--app/assets/javascripts/pipeline_editor/components/editor/ci_config_merged_preview.vue2
-rw-r--r--app/assets/javascripts/pipeline_editor/components/header/pipeline_editor_header.vue47
-rw-r--r--app/assets/javascripts/pipeline_editor/components/header/pipeline_status.vue120
-rw-r--r--app/assets/javascripts/pipeline_editor/components/header/validation_segment.vue18
-rw-r--r--app/assets/javascripts/pipeline_editor/components/ui/pipeline_editor_empty_state.vue56
-rw-r--r--app/assets/javascripts/pipeline_editor/constants.js1
-rw-r--r--app/assets/javascripts/pipeline_editor/graphql/queries/client/current_branch.graphql3
-rw-r--r--app/assets/javascripts/pipeline_editor/graphql/queries/client/pipeline.graphql17
-rw-r--r--app/assets/javascripts/pipeline_editor/graphql/resolvers.js23
-rw-r--r--app/assets/javascripts/pipeline_editor/index.js4
-rw-r--r--app/assets/javascripts/pipeline_editor/pipeline_editor_app.vue77
-rw-r--r--app/assets/javascripts/pipeline_editor/pipeline_editor_home.vue1
-rw-r--r--app/assets/javascripts/pipeline_new/components/pipeline_new_form.vue189
-rw-r--r--app/assets/javascripts/pipeline_new/components/refs_dropdown.vue113
-rw-r--r--app/assets/javascripts/pipeline_new/constants.js1
-rw-r--r--app/assets/javascripts/pipeline_new/index.js14
-rw-r--r--app/assets/javascripts/pipelines/components/graph/graph_component.vue24
-rw-r--r--app/assets/javascripts/pipelines/components/graph/graph_component_wrapper.vue63
-rw-r--r--app/assets/javascripts/pipelines/components/graph/linked_pipelines_column.vue33
-rw-r--r--app/assets/javascripts/pipelines/components/graph/utils.js97
-rw-r--r--app/assets/javascripts/pipelines/components/graph_shared/api.js8
-rw-r--r--app/assets/javascripts/pipelines/components/graph_shared/links_inner.vue72
-rw-r--r--app/assets/javascripts/pipelines/components/graph_shared/links_layer.vue7
-rw-r--r--app/assets/javascripts/pipelines/components/pipeline_graph/pipeline_graph.vue15
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/empty_state.vue12
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipeline_mini_graph.vue54
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipeline_operations.vue119
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipeline_stage.vue152
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipeline_triggerer.vue12
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipeline_url.vue92
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipelines.vue10
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipelines_actions.vue102
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipelines_artifacts.vue2
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipelines_commit.vue85
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipelines_manual_actions.vue103
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipelines_status_badge.vue37
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipelines_table.vue212
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipelines_table_row.vue61
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/stage.vue234
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/time_ago.vue41
-rw-r--r--app/assets/javascripts/pipelines/constants.js3
-rw-r--r--app/assets/javascripts/pipelines/pipeline_details_bundle.js3
-rw-r--r--app/assets/javascripts/pipelines/pipeline_details_graph.js9
-rw-r--r--app/assets/javascripts/pipelines/pipelines_index.js4
-rw-r--r--app/assets/javascripts/profile/account/components/update_username.vue8
-rw-r--r--app/assets/javascripts/profile/preferences/components/profile_preferences.vue26
-rw-r--r--app/assets/javascripts/profile/profile.js1
-rw-r--r--app/assets/javascripts/projects/commits/store/actions.js2
-rw-r--r--app/assets/javascripts/projects/compare/components/app.vue79
-rw-r--r--app/assets/javascripts/projects/compare/components/app_legacy.vue89
-rw-r--r--app/assets/javascripts/projects/compare/components/repo_dropdown.vue93
-rw-r--r--app/assets/javascripts/projects/compare/components/revision_card.vue65
-rw-r--r--app/assets/javascripts/projects/compare/components/revision_dropdown.vue115
-rw-r--r--app/assets/javascripts/projects/compare/components/revision_dropdown_legacy.vue145
-rw-r--r--app/assets/javascripts/projects/compare/index.js42
-rw-r--r--app/assets/javascripts/projects/details/upload_button.vue49
-rw-r--r--app/assets/javascripts/projects/experiment_new_project_creation/components/new_project_push_tip_popover.vue66
-rw-r--r--app/assets/javascripts/projects/experiment_new_project_creation/components/welcome.vue14
-rw-r--r--app/assets/javascripts/projects/experiment_new_project_creation/index.js6
-rw-r--r--app/assets/javascripts/projects/feature_flags_user_lists/show/index.js23
-rw-r--r--app/assets/javascripts/projects/pipelines/charts/components/pipeline_charts.vue6
-rw-r--r--app/assets/javascripts/projects/project_new.js35
-rw-r--r--app/assets/javascripts/projects/settings_service_desk/components/service_desk_root.vue2
-rw-r--r--app/assets/javascripts/projects/settings_service_desk/components/service_desk_setting.vue2
-rw-r--r--app/assets/javascripts/projects/upload_file_experiment.js24
-rw-r--r--app/assets/javascripts/protected_branches/protected_branch_create.js7
-rw-r--r--app/assets/javascripts/protected_branches/protected_branch_edit.js21
-rw-r--r--app/assets/javascripts/ref/components/ref_results_section.vue8
-rw-r--r--app/assets/javascripts/ref/components/ref_selector.vue239
-rw-r--r--app/assets/javascripts/ref/constants.js5
-rw-r--r--app/assets/javascripts/ref/stores/actions.js17
-rw-r--r--app/assets/javascripts/ref/stores/mutation_types.js2
-rw-r--r--app/assets/javascripts/ref/stores/mutations.js3
-rw-r--r--app/assets/javascripts/ref/stores/state.js25
-rw-r--r--app/assets/javascripts/registry/explorer/components/delete_button.vue1
-rw-r--r--app/assets/javascripts/registry/explorer/components/details_page/details_header.vue32
-rw-r--r--app/assets/javascripts/registry/explorer/components/details_page/tags_list_row.vue1
-rw-r--r--app/assets/javascripts/registry/explorer/components/list_page/image_list.vue1
-rw-r--r--app/assets/javascripts/registry/explorer/components/list_page/image_list_row.vue7
-rw-r--r--app/assets/javascripts/registry/explorer/components/list_page/registry_header.vue19
-rw-r--r--app/assets/javascripts/registry/explorer/constants/common.js3
-rw-r--r--app/assets/javascripts/registry/explorer/constants/details.js8
-rw-r--r--app/assets/javascripts/registry/explorer/constants/expiration_policies.js3
-rw-r--r--app/assets/javascripts/registry/explorer/constants/index.js1
-rw-r--r--app/assets/javascripts/registry/explorer/pages/details.vue7
-rw-r--r--app/assets/javascripts/registry/explorer/pages/list.vue1
-rw-r--r--app/assets/javascripts/related_issues/components/related_issuable_input.vue1
-rw-r--r--app/assets/javascripts/releases/components/app_edit_new.vue11
-rw-r--r--app/assets/javascripts/releases/components/asset_links_form.vue3
-rw-r--r--app/assets/javascripts/releases/components/tag_field_new.vue70
-rw-r--r--app/assets/javascripts/reports/components/grouped_issues_list.vue13
-rw-r--r--app/assets/javascripts/reports/components/grouped_test_reports_app.vue42
-rw-r--r--app/assets/javascripts/reports/components/issues_list.vue13
-rw-r--r--app/assets/javascripts/reports/components/report_section.vue2
-rw-r--r--app/assets/javascripts/reports/components/summary_row.vue32
-rw-r--r--app/assets/javascripts/reports/components/test_issue_body.vue74
-rw-r--r--app/assets/javascripts/repository/components/upload_blob_modal.vue218
-rw-r--r--app/assets/javascripts/repository/index.js19
-rw-r--r--app/assets/javascripts/right_sidebar.js3
-rw-r--r--app/assets/javascripts/security_configuration/components/configuration_table.vue23
-rw-r--r--app/assets/javascripts/security_configuration/components/features_constants.js112
-rw-r--r--app/assets/javascripts/security_configuration/components/manage_sast.vue8
-rw-r--r--app/assets/javascripts/security_configuration/components/scanners_constants.js136
-rw-r--r--app/assets/javascripts/security_configuration/components/upgrade.vue10
-rw-r--r--app/assets/javascripts/security_configuration/index.js3
-rw-r--r--app/assets/javascripts/sentry/sentry_config.js2
-rw-r--r--app/assets/javascripts/sentry/wrapper.js26
-rw-r--r--app/assets/javascripts/shared/popover.js33
-rw-r--r--app/assets/javascripts/sidebar/components/assignees/issuable_assignees.vue9
-rw-r--r--app/assets/javascripts/sidebar/components/assignees/sidebar_assignees_widget.vue50
-rw-r--r--app/assets/javascripts/sidebar/components/assignees/uncollapsed_assignee_list.vue2
-rw-r--r--app/assets/javascripts/sidebar/components/confidential/confidential_issue_sidebar.vue113
-rw-r--r--app/assets/javascripts/sidebar/components/confidential/edit_form.vue64
-rw-r--r--app/assets/javascripts/sidebar/components/confidential/edit_form_buttons.vue81
-rw-r--r--app/assets/javascripts/sidebar/components/confidential/mutations/update_issue_confidential.mutation.graphql8
-rw-r--r--app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_content.vue64
-rw-r--r--app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_form.vue136
-rw-r--r--app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_widget.vue143
-rw-r--r--app/assets/javascripts/sidebar/components/reviewers/uncollapsed_reviewer_list.vue16
-rw-r--r--app/assets/javascripts/sidebar/components/sidebar_editable_item.vue37
-rw-r--r--app/assets/javascripts/sidebar/components/subscriptions/subscriptions.vue2
-rw-r--r--app/assets/javascripts/sidebar/components/time_tracking/help_state.vue6
-rw-r--r--app/assets/javascripts/sidebar/constants.js17
-rw-r--r--app/assets/javascripts/sidebar/graphql.js8
-rw-r--r--app/assets/javascripts/sidebar/mount_sidebar.js69
-rw-r--r--app/assets/javascripts/sidebar/queries/epic_confidential.query.graphql10
-rw-r--r--app/assets/javascripts/sidebar/queries/issue_confidential.query.graphql10
-rw-r--r--app/assets/javascripts/sidebar/queries/sidebarDetailsMR.query.graphql7
-rw-r--r--app/assets/javascripts/sidebar/queries/update_epic_confidential.mutation.graphql9
-rw-r--r--app/assets/javascripts/sidebar/queries/update_issue_confidential.mutation.graphql9
-rw-r--r--app/assets/javascripts/sidebar/services/sidebar_service.js15
-rw-r--r--app/assets/javascripts/sidebar/sidebar_mediator.js1
-rw-r--r--app/assets/javascripts/single_file_diff.js2
-rw-r--r--app/assets/javascripts/snippets/components/edit.vue5
-rw-r--r--app/assets/javascripts/snippets/components/snippet_visibility_edit.vue7
-rw-r--r--app/assets/javascripts/static_site_editor/constants.js2
-rw-r--r--app/assets/javascripts/tooltips/components/tooltips.vue6
-rw-r--r--app/assets/javascripts/tooltips/index.js1
-rw-r--r--app/assets/javascripts/tracking.js62
-rw-r--r--app/assets/javascripts/user_popovers.js26
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/deployment/deployment_list.vue92
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/mr_collapsible_extension.vue25
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/mr_widget_how_to_merge_modal.vue12
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline.vue37
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline_container.vue48
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_auto_merge_enabled.vue2
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_conflicts.vue82
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/states/nothing_to_merge.vue36
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/states/ready_to_merge.vue85
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/states/squash_before_merge.vue2
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/states/work_in_progress.vue5
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/mixins/mr_widget_pipeline.js5
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/queries/toggle_wip.mutation.graphql1
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js2
-rw-r--r--app/assets/javascripts/vue_shared/alert_details/components/alert_details.vue10
-rw-r--r--app/assets/javascripts/vue_shared/alert_details/components/alert_metrics.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/awards_list.vue22
-rw-r--r--app/assets/javascripts/vue_shared/components/changed_file_icon.vue8
-rw-r--r--app/assets/javascripts/vue_shared/components/ci_icon.vue8
-rw-r--r--app/assets/javascripts/vue_shared/components/clipboard_button.vue12
-rw-r--r--app/assets/javascripts/vue_shared/components/diff_viewer/viewers/renamed.vue8
-rw-r--r--app/assets/javascripts/vue_shared/components/file_icon.vue3
-rw-r--r--app/assets/javascripts/vue_shared/components/header_ci_component.vue10
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/suggestion_diff_header.vue22
-rw-r--r--app/assets/javascripts/vue_shared/components/notes/timeline_icon.vue3
-rw-r--r--app/assets/javascripts/vue_shared/components/registry/code_instruction.vue40
-rw-r--r--app/assets/javascripts/vue_shared/components/registry/list_item.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/registry/persisted_dropdown_selection.vue59
-rw-r--r--app/assets/javascripts/vue_shared/components/select2_select.vue6
-rw-r--r--app/assets/javascripts/vue_shared/components/settings/settings_block.vue7
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_value.vue5
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/labels_select_root.vue6
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/multiselect_dropdown.vue11
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/queries/get_issue_participants.query.graphql4
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/queries/get_mr_participants.query.graphql2
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/queries/update_issue_assignees.mutation.graphql4
-rw-r--r--app/assets/javascripts/vue_shared/components/tabs/tab.vue47
-rw-r--r--app/assets/javascripts/vue_shared/components/tabs/tabs.js76
-rw-r--r--app/assets/javascripts/vue_shared/components/tooltip_on_truncate.vue7
-rw-r--r--app/assets/javascripts/vue_shared/components/upload_dropzone/upload_dropzone.vue21
-rw-r--r--app/assets/javascripts/vue_shared/components/user_access_role_badge.vue22
-rw-r--r--app/assets/javascripts/vue_shared/directives/tooltip.js35
-rw-r--r--app/assets/javascripts/vue_shared/gl_feature_flags_plugin.js7
-rw-r--r--app/assets/javascripts/vue_shared/security_reports/components/help_icon.vue2
-rw-r--r--app/assets/javascripts/vue_shared/security_reports/constants.js3
-rw-r--r--app/assets/stylesheets/_page_specific_files.scss2
-rw-r--r--app/assets/stylesheets/bootstrap_migration.scss23
-rw-r--r--app/assets/stylesheets/components/avatar.scss5
-rw-r--r--app/assets/stylesheets/components/milestone_combobox.scss18
-rw-r--r--app/assets/stylesheets/components/ref_selector.scss16
-rw-r--r--app/assets/stylesheets/disable_animations.scss6
-rw-r--r--app/assets/stylesheets/framework.scss1
-rw-r--r--app/assets/stylesheets/framework/awards.scss2
-rw-r--r--app/assets/stylesheets/framework/buttons.scss40
-rw-r--r--app/assets/stylesheets/framework/diffs.scss1
-rw-r--r--app/assets/stylesheets/framework/dropdowns.scss26
-rw-r--r--app/assets/stylesheets/framework/editor-lite.scss5
-rw-r--r--app/assets/stylesheets/framework/emojis.scss23
-rw-r--r--app/assets/stylesheets/framework/filters.scss3
-rw-r--r--app/assets/stylesheets/framework/forms.scss3
-rw-r--r--app/assets/stylesheets/framework/layout.scss3
-rw-r--r--app/assets/stylesheets/framework/lists.scss11
-rw-r--r--app/assets/stylesheets/framework/mixins.scss1
-rw-r--r--app/assets/stylesheets/framework/modal.scss16
-rw-r--r--app/assets/stylesheets/framework/tooltips.scss6
-rw-r--r--app/assets/stylesheets/framework/typography.scss21
-rw-r--r--app/assets/stylesheets/framework/variables.scss6
-rw-r--r--app/assets/stylesheets/highlight/conflict_colors.scss2
-rw-r--r--app/assets/stylesheets/highlight/themes/dark.scss2
-rw-r--r--app/assets/stylesheets/highlight/themes/monokai.scss2
-rw-r--r--app/assets/stylesheets/highlight/white_base.scss6
-rw-r--r--app/assets/stylesheets/lazy_bundles/select2_overrides.scss16
-rw-r--r--app/assets/stylesheets/mailer_client_specific.scss1
-rw-r--r--app/assets/stylesheets/mailers/highlighted_diff_email.scss6
-rw-r--r--app/assets/stylesheets/page_bundles/boards.scss11
-rw-r--r--app/assets/stylesheets/page_bundles/build.scss29
-rw-r--r--app/assets/stylesheets/page_bundles/cycle_analytics.scss32
-rw-r--r--app/assets/stylesheets/page_bundles/ide.scss3
-rw-r--r--app/assets/stylesheets/page_bundles/ide_themes/_solarized-light.scss8
-rw-r--r--app/assets/stylesheets/page_bundles/import.scss7
-rw-r--r--app/assets/stylesheets/page_bundles/jira_connect.scss56
-rw-r--r--app/assets/stylesheets/page_bundles/learn_gitlab.scss3
-rw-r--r--app/assets/stylesheets/page_bundles/members.scss255
-rw-r--r--app/assets/stylesheets/page_bundles/oncall_schedules.scss7
-rw-r--r--app/assets/stylesheets/page_bundles/pipelines.scss19
-rw-r--r--app/assets/stylesheets/page_bundles/reports.scss5
-rw-r--r--app/assets/stylesheets/page_bundles/signup.scss5
-rw-r--r--app/assets/stylesheets/pages/clusters.scss1
-rw-r--r--app/assets/stylesheets/pages/groups.scss4
-rw-r--r--app/assets/stylesheets/pages/login.scss11
-rw-r--r--app/assets/stylesheets/pages/members.scss253
-rw-r--r--app/assets/stylesheets/pages/merge_requests.scss27
-rw-r--r--app/assets/stylesheets/pages/note_form.scss41
-rw-r--r--app/assets/stylesheets/pages/projects.scss71
-rw-r--r--app/assets/stylesheets/pages/trials.scss15
-rw-r--r--app/assets/stylesheets/startup/startup-signin.scss5
-rw-r--r--app/assets/stylesheets/test_environment.scss11
-rw-r--r--app/assets/stylesheets/themes/theme_helper.scss5
-rw-r--r--app/assets/stylesheets/themes/theme_light.scss20
-rw-r--r--app/assets/stylesheets/utilities.scss15
-rw-r--r--app/assets/stylesheets/vendors/atwho.scss5
-rw-r--r--app/controllers/admin/application_settings_controller.rb5
-rw-r--r--app/controllers/admin/instance_statistics_controller.rb18
-rw-r--r--app/controllers/admin/usage_trends_controller.rb12
-rw-r--r--app/controllers/application_controller.rb12
-rw-r--r--app/controllers/concerns/boards_responses.rb4
-rw-r--r--app/controllers/concerns/check_rate_limit.rb23
-rw-r--r--app/controllers/concerns/comment_and_close_flag.rb11
-rw-r--r--app/controllers/concerns/multiple_boards_actions.rb2
-rw-r--r--app/controllers/concerns/notes_actions.rb8
-rw-r--r--app/controllers/concerns/security_and_compliance_permissions.rb15
-rw-r--r--app/controllers/concerns/spammable_actions.rb15
-rw-r--r--app/controllers/concerns/wiki_actions.rb3
-rw-r--r--app/controllers/dashboard/todos_controller.rb2
-rw-r--r--app/controllers/explore/projects_controller.rb2
-rw-r--r--app/controllers/graphql_controller.rb14
-rw-r--r--app/controllers/groups/boards_controller.rb7
-rw-r--r--app/controllers/groups/dependency_proxy_for_containers_controller.rb13
-rw-r--r--app/controllers/groups_controller.rb1
-rw-r--r--app/controllers/help_controller.rb1
-rw-r--r--app/controllers/ide_controller.rb24
-rw-r--r--app/controllers/import/bulk_imports_controller.rb13
-rw-r--r--app/controllers/import/gitlab_groups_controller.rb7
-rw-r--r--app/controllers/jira_connect/subscriptions_controller.rb3
-rw-r--r--app/controllers/notification_settings_controller.rb61
-rw-r--r--app/controllers/profiles/personal_access_tokens_controller.rb4
-rw-r--r--app/controllers/profiles/preferences_controller.rb3
-rw-r--r--app/controllers/projects/blob_controller.rb10
-rw-r--r--app/controllers/projects/boards_controller.rb6
-rw-r--r--app/controllers/projects/ci/daily_build_group_report_results_controller.rb49
-rw-r--r--app/controllers/projects/ci/pipeline_editor_controller.rb3
-rw-r--r--app/controllers/projects/commit_controller.rb9
-rw-r--r--app/controllers/projects/compare_controller.rb56
-rw-r--r--app/controllers/projects/forks_controller.rb4
-rw-r--r--app/controllers/projects/graphs_controller.rb2
-rw-r--r--app/controllers/projects/issues_controller.rb3
-rw-r--r--app/controllers/projects/merge_requests_controller.rb7
-rw-r--r--app/controllers/projects/notes_controller.rb17
-rw-r--r--app/controllers/projects/pipelines/tests_controller.rb2
-rw-r--r--app/controllers/projects/pipelines_controller.rb5
-rw-r--r--app/controllers/projects/project_members_controller.rb4
-rw-r--r--app/controllers/projects/protected_branches_controller.rb1
-rw-r--r--app/controllers/projects/security/configuration_controller.rb2
-rw-r--r--app/controllers/projects/services_controller.rb2
-rw-r--r--app/controllers/projects/settings/operations_controller.rb4
-rw-r--r--app/controllers/projects/templates_controller.rb2
-rw-r--r--app/controllers/projects_controller.rb40
-rw-r--r--app/controllers/repositories/git_http_controller.rb6
-rw-r--r--app/controllers/root_controller.rb4
-rw-r--r--app/controllers/search_controller.rb8
-rw-r--r--app/controllers/user_callouts_controller.rb11
-rw-r--r--app/experiments/application_experiment.rb78
-rw-r--r--app/finders/admin/plans_finder.rb24
-rw-r--r--app/finders/boards/boards_finder.rb32
-rw-r--r--app/finders/ci/daily_build_group_report_results_finder.rb103
-rw-r--r--app/finders/ci/testing/daily_build_group_report_results_finder.rb88
-rw-r--r--app/finders/issuable_finder.rb52
-rw-r--r--app/finders/issuable_finder/params.rb27
-rw-r--r--app/finders/issuables/author_filter.rb41
-rw-r--r--app/finders/issuables/base_filter.rb36
-rw-r--r--app/finders/merge_request_target_project_finder.rb11
-rw-r--r--app/finders/merge_requests/oldest_per_commit_finder.rb32
-rw-r--r--app/finders/namespaces/projects_finder.rb64
-rw-r--r--app/finders/packages/maven/package_finder.rb5
-rw-r--r--app/finders/packages/npm/package_finder.rb38
-rw-r--r--app/finders/projects/groups_finder.rb68
-rw-r--r--app/finders/repositories/changelog_commits_finder.rb101
-rw-r--r--app/finders/repositories/commits_with_trailer_finder.rb82
-rw-r--r--app/finders/repositories/previous_tag_finder.rb12
-rw-r--r--app/finders/security/license_compliance_jobs_finder.rb2
-rw-r--r--app/finders/template_finder.rb16
-rw-r--r--app/finders/users_finder.rb9
-rw-r--r--app/graphql/gitlab_schema.rb2
-rw-r--r--app/graphql/mutations/boards/create.rb4
-rw-r--r--app/graphql/mutations/boards/destroy.rb2
-rw-r--r--app/graphql/mutations/boards/issues/issue_move_list.rb45
-rw-r--r--app/graphql/mutations/boards/lists/create.rb2
-rw-r--r--app/graphql/mutations/boards/lists/destroy.rb2
-rw-r--r--app/graphql/mutations/boards/lists/update.rb4
-rw-r--r--app/graphql/mutations/boards/update.rb2
-rw-r--r--app/graphql/mutations/branches/create.rb2
-rw-r--r--app/graphql/mutations/concerns/mutations/can_mutate_spammable.rb21
-rw-r--r--app/graphql/mutations/custom_emoji/create.rb1
-rw-r--r--app/graphql/mutations/merge_requests/accept.rb88
-rw-r--r--app/graphql/mutations/merge_requests/set_wip.rb2
-rw-r--r--app/graphql/mutations/notes/create/diff_note.rb16
-rw-r--r--app/graphql/mutations/notes/update/base.rb12
-rw-r--r--app/graphql/mutations/notes/update/image_diff_note.rb23
-rw-r--r--app/graphql/mutations/notes/update/note.rb13
-rw-r--r--app/graphql/mutations/release_asset_links/base.rb17
-rw-r--r--app/graphql/mutations/release_asset_links/create.rb36
-rw-r--r--app/graphql/mutations/snippets/create.rb2
-rw-r--r--app/graphql/mutations/snippets/update.rb2
-rw-r--r--app/graphql/mutations/todos/restore_many.rb2
-rw-r--r--app/graphql/mutations/user_callouts/create.rb30
-rw-r--r--app/graphql/resolvers/admin/analytics/instance_statistics/measurements_resolver.rb47
-rw-r--r--app/graphql/resolvers/admin/analytics/usage_trends/measurements_resolver.rb47
-rw-r--r--app/graphql/resolvers/alert_management/alert_resolver.rb3
-rw-r--r--app/graphql/resolvers/alert_management/http_integrations_resolver.rb23
-rw-r--r--app/graphql/resolvers/base_resolver.rb11
-rw-r--r--app/graphql/resolvers/board_lists_resolver.rb2
-rw-r--r--app/graphql/resolvers/board_resolver.rb2
-rw-r--r--app/graphql/resolvers/boards_resolver.rb2
-rw-r--r--app/graphql/resolvers/branch_commit_resolver.rb3
-rw-r--r--app/graphql/resolvers/ci/config_resolver.rb2
-rw-r--r--app/graphql/resolvers/concerns/resolves_snippets.rb2
-rw-r--r--app/graphql/resolvers/full_path_resolver.rb2
-rw-r--r--app/graphql/resolvers/group_packages_resolver.rb27
-rw-r--r--app/graphql/resolvers/last_commit_resolver.rb2
-rw-r--r--app/graphql/resolvers/metrics/dashboard_resolver.rb21
-rw-r--r--app/graphql/resolvers/namespace_projects_resolver.rb35
-rw-r--r--app/graphql/resolvers/packages_resolver.rb19
-rw-r--r--app/graphql/resolvers/project_merge_requests_resolver.rb2
-rw-r--r--app/graphql/resolvers/project_packages_resolver.rb19
-rw-r--r--app/graphql/resolvers/project_pipeline_resolver.rb32
-rw-r--r--app/graphql/resolvers/snippets/blobs_resolver.rb1
-rw-r--r--app/graphql/resolvers/tree_resolver.rb2
-rw-r--r--app/graphql/types/access_level_enum.rb13
-rw-r--r--app/graphql/types/admin/analytics/instance_statistics/measurement_identifier_enum.rb25
-rw-r--r--app/graphql/types/admin/analytics/instance_statistics/measurement_type.rb26
-rw-r--r--app/graphql/types/admin/analytics/usage_trends/measurement_identifier_enum.rb25
-rw-r--r--app/graphql/types/admin/analytics/usage_trends/measurement_type.rb26
-rw-r--r--app/graphql/types/alert_management/alert_sort_enum.rb28
-rw-r--r--app/graphql/types/alert_management/alert_type.rb6
-rw-r--r--app/graphql/types/alert_management/domain_filter_enum.rb4
-rw-r--r--app/graphql/types/alert_management/http_integration_type.rb2
-rw-r--r--app/graphql/types/alert_management/integration_type_enum.rb4
-rw-r--r--app/graphql/types/base_argument.rb1
-rw-r--r--app/graphql/types/base_field.rb55
-rw-r--r--app/graphql/types/blob_viewers/type_enum.rb6
-rw-r--r--app/graphql/types/board_list_type.rb8
-rw-r--r--app/graphql/types/board_type.rb4
-rw-r--r--app/graphql/types/boards/board_issue_input_base_type.rb2
-rw-r--r--app/graphql/types/boards/board_issue_input_type.rb2
-rw-r--r--app/graphql/types/ci/config/status_enum.rb4
-rw-r--r--app/graphql/types/ci/job_artifact_file_type_enum.rb3
-rw-r--r--app/graphql/types/ci/job_type.rb4
-rw-r--r--app/graphql/types/ci/pipeline_type.rb7
-rw-r--r--app/graphql/types/ci_configuration/sast/analyzers_entity_input_type.rb1
-rw-r--r--app/graphql/types/ci_configuration/sast/entity_input_type.rb1
-rw-r--r--app/graphql/types/ci_configuration/sast/input_type.rb2
-rw-r--r--app/graphql/types/ci_configuration/sast/ui_component_size_enum.rb6
-rw-r--r--app/graphql/types/commit_action_mode_enum.rb10
-rw-r--r--app/graphql/types/commit_action_type.rb2
-rw-r--r--app/graphql/types/commit_encoding_enum.rb4
-rw-r--r--app/graphql/types/concerns/gitlab_style_deprecations.rb2
-rw-r--r--app/graphql/types/container_repository_sort_enum.rb4
-rw-r--r--app/graphql/types/current_user_todos.rb5
-rw-r--r--app/graphql/types/design_management/design_version_event_enum.rb2
-rw-r--r--app/graphql/types/diff_paths_input_type.rb2
-rw-r--r--app/graphql/types/error_tracking/sentry_error_status_enum.rb8
-rw-r--r--app/graphql/types/global_id_type.rb5
-rw-r--r--app/graphql/types/group_type.rb4
-rw-r--r--app/graphql/types/issuable_sort_enum.rb12
-rw-r--r--app/graphql/types/issuable_state_enum.rb8
-rw-r--r--app/graphql/types/issue_sort_enum.rb10
-rw-r--r--app/graphql/types/issue_state_event_enum.rb4
-rw-r--r--app/graphql/types/jira_users_mapping_input_type.rb2
-rw-r--r--app/graphql/types/label_type.rb4
-rw-r--r--app/graphql/types/merge_request_sort_enum.rb4
-rw-r--r--app/graphql/types/merge_request_state_enum.rb2
-rw-r--r--app/graphql/types/merge_request_type.rb6
-rw-r--r--app/graphql/types/merge_strategy_enum.rb9
-rw-r--r--app/graphql/types/milestone_state_enum.rb4
-rw-r--r--app/graphql/types/mutation_operation_mode_enum.rb6
-rw-r--r--app/graphql/types/mutation_type.rb14
-rw-r--r--app/graphql/types/notes/diff_image_position_input_type.rb2
-rw-r--r--app/graphql/types/notes/diff_position_base_input_type.rb2
-rw-r--r--app/graphql/types/notes/diff_position_input_type.rb4
-rw-r--r--app/graphql/types/notes/position_type_enum.rb4
-rw-r--r--app/graphql/types/notes/update_diff_image_position_input_type.rb3
-rw-r--r--app/graphql/types/project_type.rb8
-rw-r--r--app/graphql/types/projects/namespace_project_sort_enum.rb4
-rw-r--r--app/graphql/types/query_type.rb12
-rw-r--r--app/graphql/types/range_input_type.rb2
-rw-r--r--app/graphql/types/release_asset_link_input_type.rb17
-rw-r--r--app/graphql/types/release_asset_link_shared_input_arguments.rb25
-rw-r--r--app/graphql/types/release_assets_input_type.rb1
-rw-r--r--app/graphql/types/release_sort_enum.rb8
-rw-r--r--app/graphql/types/snippets/blob_action_input_type.rb2
-rw-r--r--app/graphql/types/snippets/blob_type.rb1
-rw-r--r--app/graphql/types/sort_enum.rb16
-rw-r--r--app/graphql/types/timeframe_input_type.rb2
-rw-r--r--app/graphql/types/todo_action_enum.rb16
-rw-r--r--app/graphql/types/todo_state_enum.rb4
-rw-r--r--app/graphql/types/todo_target_enum.rb10
-rw-r--r--app/graphql/types/tree/blob_type.rb1
-rw-r--r--app/graphql/types/user_callout_feature_name_enum.rb12
-rw-r--r--app/graphql/types/user_callout_type.rb12
-rw-r--r--app/graphql/types/user_state_enum.rb6
-rw-r--r--app/graphql/types/user_type.rb4
-rw-r--r--app/graphql/types/visibility_levels_enum.rb2
-rw-r--r--app/helpers/analytics/navbar_helper.rb2
-rw-r--r--app/helpers/application_settings_helper.rb10
-rw-r--r--app/helpers/auth_helper.rb24
-rw-r--r--app/helpers/avatars_helper.rb29
-rw-r--r--app/helpers/blob_helper.rb4
-rw-r--r--app/helpers/ci/pipeline_editor_helper.rb3
-rw-r--r--app/helpers/commits_helper.rb4
-rw-r--r--app/helpers/compare_helper.rb37
-rw-r--r--app/helpers/diff_helper.rb6
-rw-r--r--app/helpers/gitlab_routing_helper.rb5
-rw-r--r--app/helpers/ide_helper.rb33
-rw-r--r--app/helpers/in_product_marketing_helper.rb2
-rw-r--r--app/helpers/invite_members_helper.rb10
-rw-r--r--app/helpers/issuables_description_templates_helper.rb17
-rw-r--r--app/helpers/issuables_helper.rb5
-rw-r--r--app/helpers/jira_connect_helper.rb6
-rw-r--r--app/helpers/learn_gitlab_helper.rb17
-rw-r--r--app/helpers/merge_requests_helper.rb12
-rw-r--r--app/helpers/notifications_helper.rb46
-rw-r--r--app/helpers/preferences_helper.rb1
-rw-r--r--app/helpers/projects/project_members_helper.rb4
-rw-r--r--app/helpers/projects/security/configuration_helper.rb13
-rw-r--r--app/helpers/projects_helper.rb15
-rw-r--r--app/helpers/search_helper.rb2
-rw-r--r--app/helpers/stat_anchors_helper.rb3
-rw-r--r--app/helpers/user_callouts_helper.rb2
-rw-r--r--app/helpers/visibility_level_helper.rb4
-rw-r--r--app/helpers/wiki_helper.rb18
-rw-r--r--app/helpers/workhorse_helper.rb10
-rw-r--r--app/mailers/emails/merge_requests.rb8
-rw-r--r--app/mailers/emails/pipelines.rb2
-rw-r--r--app/mailers/emails/profile.rb5
-rw-r--r--app/mailers/previews/notify_preview.rb14
-rw-r--r--app/models/analytics/instance_statistics.rb9
-rw-r--r--app/models/analytics/instance_statistics/measurement.rb61
-rw-r--r--app/models/analytics/usage_trends/measurement.rb61
-rw-r--r--app/models/application_setting.rb12
-rw-r--r--app/models/application_setting_implementation.rb21
-rw-r--r--app/models/bulk_imports/entity.rb9
-rw-r--r--app/models/ci/build.rb26
-rw-r--r--app/models/ci/daily_build_group_report_result.rb14
-rw-r--r--app/models/ci/group.rb2
-rw-r--r--app/models/ci/group_variable.rb4
-rw-r--r--app/models/ci/job_artifact.rb6
-rw-r--r--app/models/ci/legacy_stage.rb2
-rw-r--r--app/models/ci/pipeline.rb33
-rw-r--r--app/models/ci/processable.rb4
-rw-r--r--app/models/ci/ref.rb2
-rw-r--r--app/models/ci/runner.rb40
-rw-r--r--app/models/ci/runner_namespace.rb9
-rw-r--r--app/models/ci/stage.rb4
-rw-r--r--app/models/ci/variable.rb1
-rw-r--r--app/models/clusters/agent_token.rb5
-rw-r--r--app/models/clusters/applications/runner.rb2
-rw-r--r--app/models/clusters/instance.rb4
-rw-r--r--app/models/commit_status.rb11
-rw-r--r--app/models/commit_with_pipeline.rb38
-rw-r--r--app/models/concerns/analytics/cycle_analytics/stage.rb19
-rw-r--r--app/models/concerns/avatarable.rb8
-rw-r--r--app/models/concerns/boards/listable.rb20
-rw-r--r--app/models/concerns/ci/contextable.rb16
-rw-r--r--app/models/concerns/ci/has_status.rb6
-rw-r--r--app/models/concerns/ci/has_variable.rb1
-rw-r--r--app/models/concerns/issuable.rb1
-rw-r--r--app/models/concerns/project_features_compatibility.rb12
-rw-r--r--app/models/custom_emoji.rb2
-rw-r--r--app/models/dependency_proxy.rb1
-rw-r--r--app/models/dependency_proxy/manifest.rb7
-rw-r--r--app/models/environment.rb30
-rw-r--r--app/models/error_tracking/project_error_tracking_setting.rb10
-rw-r--r--app/models/experiment.rb20
-rw-r--r--app/models/group.rb57
-rw-r--r--app/models/hooks/web_hook_log.rb2
-rw-r--r--app/models/hooks/web_hook_log_partitioned.rb17
-rw-r--r--app/models/issue.rb4
-rw-r--r--app/models/issue_email_participant.rb2
-rw-r--r--app/models/iteration.rb136
-rw-r--r--app/models/label.rb4
-rw-r--r--app/models/list.rb21
-rw-r--r--app/models/merge_request.rb90
-rw-r--r--app/models/namespace.rb39
-rw-r--r--app/models/namespace/root_storage_statistics.rb5
-rw-r--r--app/models/note.rb12
-rw-r--r--app/models/notification_setting.rb3
-rw-r--r--app/models/onboarding_progress.rb8
-rw-r--r--app/models/packages/nuget.rb2
-rw-r--r--app/models/packages/package.rb34
-rw-r--r--app/models/packages/package_file.rb4
-rw-r--r--app/models/packages/rubygems.rb10
-rw-r--r--app/models/packages/rubygems/metadatum.rb1
-rw-r--r--app/models/pages/lookup_path.rb6
-rw-r--r--app/models/personal_access_token.rb5
-rw-r--r--app/models/project.rb43
-rw-r--r--app/models/project_feature.rb37
-rw-r--r--app/models/project_repository_storage_move.rb41
-rw-r--r--app/models/project_services/chat_notification_service.rb15
-rw-r--r--app/models/project_services/discord_service.rb3
-rw-r--r--app/models/project_services/mattermost_service.rb2
-rw-r--r--app/models/project_services/prometheus_service.rb12
-rw-r--r--app/models/project_services/slack_mattermost/notifier.rb24
-rw-r--r--app/models/project_services/slack_service.rb34
-rw-r--r--app/models/project_services/unify_circuit_service.rb2
-rw-r--r--app/models/project_services/webex_teams_service.rb2
-rw-r--r--app/models/projects/repository_storage_move.rb38
-rw-r--r--app/models/protected_branch.rb9
-rw-r--r--app/models/snippet.rb8
-rw-r--r--app/models/snippet_repository_storage_move.rb35
-rw-r--r--app/models/snippets/repository_storage_move.rb32
-rw-r--r--app/models/todo.rb1
-rw-r--r--app/models/user.rb23
-rw-r--r--app/models/user_callout.rb2
-rw-r--r--app/models/user_preference.rb1
-rw-r--r--app/models/wiki.rb2
-rw-r--r--app/models/wiki_page.rb5
-rw-r--r--app/models/zoom_meeting.rb2
-rw-r--r--app/policies/analytics/instance_statistics/measurement_policy.rb9
-rw-r--r--app/policies/analytics/usage_trends/measurement_policy.rb9
-rw-r--r--app/policies/base_policy.rb11
-rw-r--r--app/policies/concerns/readonly_abilities.rb2
-rw-r--r--app/policies/global_policy.rb2
-rw-r--r--app/policies/group_policy.rb8
-rw-r--r--app/policies/merge_request_policy.rb11
-rw-r--r--app/policies/note_policy.rb4
-rw-r--r--app/policies/project_policy.rb25
-rw-r--r--app/presenters/ci/build_runner_presenter.rb4
-rw-r--r--app/presenters/ci/pipeline_presenter.rb2
-rw-r--r--app/presenters/dev_ops_report/metric_presenter.rb2
-rw-r--r--app/presenters/packages/composer/packages_presenter.rb15
-rw-r--r--app/presenters/project_presenter.rb86
-rw-r--r--app/serializers/base_discussion_entity.rb2
-rw-r--r--app/serializers/build_details_entity.rb2
-rw-r--r--app/serializers/ci/pipeline_entity.rb6
-rw-r--r--app/serializers/current_board_entity.rb2
-rw-r--r--app/serializers/merge_request_user_entity.rb12
-rw-r--r--app/serializers/merge_request_widget_entity.rb2
-rw-r--r--app/serializers/merge_requests/pipeline_entity.rb2
-rw-r--r--app/serializers/pipeline_serializer.rb5
-rw-r--r--app/serializers/test_suite_comparer_entity.rb12
-rw-r--r--app/services/alert_management/create_alert_issue_service.rb11
-rw-r--r--app/services/authorized_project_update/periodic_recalculate_service.rb4
-rw-r--r--app/services/boards/base_item_move_service.rb72
-rw-r--r--app/services/boards/base_items_list_service.rb16
-rw-r--r--app/services/boards/issues/list_service.rb16
-rw-r--r--app/services/boards/issues/move_service.rb75
-rw-r--r--app/services/boards/list_service.rb32
-rw-r--r--app/services/boards/lists/list_service.rb21
-rw-r--r--app/services/boards/lists/update_service.rb4
-rw-r--r--app/services/boards/update_service.rb11
-rw-r--r--app/services/bulk_import_service.rb7
-rw-r--r--app/services/ci/create_downstream_pipeline_service.rb2
-rw-r--r--app/services/ci/create_pipeline_service.rb4
-rw-r--r--app/services/ci/expire_pipeline_cache_service.rb33
-rw-r--r--app/services/ci/pipeline_processing/atomic_processing_service.rb4
-rw-r--r--app/services/ci/pipeline_processing/atomic_processing_service/status_collection.rb2
-rw-r--r--app/services/ci/process_pipeline_service.rb2
-rw-r--r--app/services/ci/register_job_service.rb193
-rw-r--r--app/services/ci/retry_build_service.rb4
-rw-r--r--app/services/ci/retry_pipeline_service.rb2
-rw-r--r--app/services/ci/update_build_queue_service.rb11
-rw-r--r--app/services/clusters/kubernetes.rb2
-rw-r--r--app/services/clusters/kubernetes/create_or_update_service_account_service.rb32
-rw-r--r--app/services/concerns/alert_management/alert_processing.rb19
-rw-r--r--app/services/dependency_proxy/find_or_create_manifest_service.rb7
-rw-r--r--app/services/dependency_proxy/head_manifest_service.rb6
-rw-r--r--app/services/dependency_proxy/pull_manifest_service.rb4
-rw-r--r--app/services/deployments/older_deployments_drop_service.rb2
-rw-r--r--app/services/deployments/update_environment_service.rb21
-rw-r--r--app/services/groups/create_service.rb2
-rw-r--r--app/services/groups/destroy_service.rb4
-rw-r--r--app/services/groups/group_links/create_service.rb2
-rw-r--r--app/services/groups/group_links/destroy_service.rb2
-rw-r--r--app/services/groups/group_links/update_service.rb2
-rw-r--r--app/services/import/github_service.rb34
-rw-r--r--app/services/issuable/clone/base_service.rb11
-rw-r--r--app/services/issuable/process_assignees.rb36
-rw-r--r--app/services/issue_rebalancing_service.rb5
-rw-r--r--app/services/issues/clone_service.rb1
-rw-r--r--app/services/issues/create_service.rb1
-rw-r--r--app/services/issues/move_service.rb15
-rw-r--r--app/services/members/invite_service.rb97
-rw-r--r--app/services/merge_requests/after_create_service.rb10
-rw-r--r--app/services/merge_requests/base_service.rb2
-rw-r--r--app/services/merge_requests/build_service.rb16
-rw-r--r--app/services/merge_requests/merge_service.rb3
-rw-r--r--app/services/merge_requests/post_merge_service.rb29
-rw-r--r--app/services/merge_requests/refresh_service.rb13
-rw-r--r--app/services/merge_requests/retarget_chain_service.rb34
-rw-r--r--app/services/merge_requests/update_service.rb191
-rw-r--r--app/services/notes/build_service.rb30
-rw-r--r--app/services/notes/update_service.rb16
-rw-r--r--app/services/notification_service.rb50
-rw-r--r--app/services/onboarding_progress_service.rb18
-rw-r--r--app/services/packages/composer/create_package_service.rb2
-rw-r--r--app/services/packages/conan/search_service.rb2
-rw-r--r--app/services/packages/create_event_service.rb14
-rw-r--r--app/services/packages/create_temporary_package_service.rb21
-rw-r--r--app/services/packages/debian/find_or_create_incoming_service.rb11
-rw-r--r--app/services/packages/debian/find_or_create_package_service.rb33
-rw-r--r--app/services/packages/debian/get_or_create_incoming_service.rb11
-rw-r--r--app/services/packages/maven/find_or_create_package_service.rb3
-rw-r--r--app/services/packages/maven/metadata.rb13
-rw-r--r--app/services/packages/maven/metadata/append_package_file_service.rb88
-rw-r--r--app/services/packages/maven/metadata/create_versions_xml_service.rb186
-rw-r--r--app/services/packages/maven/metadata/sync_service.rb78
-rw-r--r--app/services/packages/nuget/create_package_service.rb23
-rw-r--r--app/services/packages/nuget/update_package_from_metadata_service.rb3
-rw-r--r--app/services/packages/rubygems/dependency_resolver_service.rb43
-rw-r--r--app/services/pages/legacy_storage_lease.rb9
-rw-r--r--app/services/projects/autocomplete_service.rb2
-rw-r--r--app/services/projects/create_service.rb2
-rw-r--r--app/services/projects/destroy_service.rb7
-rw-r--r--app/services/projects/schedule_bulk_repository_shard_moves_service.rb2
-rw-r--r--app/services/projects/update_pages_configuration_service.rb2
-rw-r--r--app/services/projects/update_pages_service.rb1
-rw-r--r--app/services/protected_branches/api_service.rb5
-rw-r--r--app/services/repositories/changelog_service.rb6
-rw-r--r--app/services/security/vulnerability_uuid.rb9
-rw-r--r--app/services/snippets/schedule_bulk_repository_shard_moves_service.rb2
-rw-r--r--app/services/spam/spam_action_service.rb8
-rw-r--r--app/services/system_hooks_service.rb32
-rw-r--r--app/services/system_note_service.rb10
-rw-r--r--app/services/system_notes/alert_management_service.rb15
-rw-r--r--app/services/system_notes/issuables_service.rb8
-rw-r--r--app/services/system_notes/merge_requests_service.rb4
-rw-r--r--app/services/terraform/remote_state_handler.rb2
-rw-r--r--app/services/users/build_service.rb3
-rw-r--r--app/services/users/dismiss_user_callout_service.rb11
-rw-r--r--app/services/users/refresh_authorized_projects_service.rb13
-rw-r--r--app/uploaders/dependency_proxy/file_uploader.rb12
-rw-r--r--app/validators/gitlab/utils/zoom_url_validator.rb22
-rw-r--r--app/validators/json_schemas/security_scan_info.json28
-rw-r--r--app/validators/json_schemas/vulnerability_finding_details.json266
-rw-r--r--app/validators/zoom_url_validator.rb18
-rw-r--r--app/views/abuse_reports/new.html.haml2
-rw-r--r--app/views/admin/appearances/_form.html.haml2
-rw-r--r--app/views/admin/appearances/preview_sign_in.html.haml2
-rw-r--r--app/views/admin/application_settings/_abuse.html.haml2
-rw-r--r--app/views/admin/application_settings/_account_and_limit.html.haml2
-rw-r--r--app/views/admin/application_settings/_ci_cd.html.haml2
-rw-r--r--app/views/admin/application_settings/_diff_limits.html.haml2
-rw-r--r--app/views/admin/application_settings/_eks.html.haml6
-rw-r--r--app/views/admin/application_settings/_email.html.haml10
-rw-r--r--app/views/admin/application_settings/_external_authorization_service_form.html.haml2
-rw-r--r--app/views/admin/application_settings/_gitaly.html.haml2
-rw-r--r--app/views/admin/application_settings/_gitpod.html.haml2
-rw-r--r--app/views/admin/application_settings/_grafana.html.haml2
-rw-r--r--app/views/admin/application_settings/_help_page.html.haml2
-rw-r--r--app/views/admin/application_settings/_import_export_limits.html.haml2
-rw-r--r--app/views/admin/application_settings/_initial_branch_name.html.haml2
-rw-r--r--app/views/admin/application_settings/_ip_limits.html.haml2
-rw-r--r--app/views/admin/application_settings/_issue_limits.html.haml2
-rw-r--r--app/views/admin/application_settings/_kroki.html.haml2
-rw-r--r--app/views/admin/application_settings/_localization.html.haml2
-rw-r--r--app/views/admin/application_settings/_note_limits.html.haml2
-rw-r--r--app/views/admin/application_settings/_outbound.html.haml2
-rw-r--r--app/views/admin/application_settings/_package_registry.html.haml4
-rw-r--r--app/views/admin/application_settings/_pages.html.haml2
-rw-r--r--app/views/admin/application_settings/_performance.html.haml2
-rw-r--r--app/views/admin/application_settings/_performance_bar.html.haml2
-rw-r--r--app/views/admin/application_settings/_plantuml.html.haml2
-rw-r--r--app/views/admin/application_settings/_prometheus.html.haml2
-rw-r--r--app/views/admin/application_settings/_protected_paths.html.haml2
-rw-r--r--app/views/admin/application_settings/_realtime.html.haml2
-rw-r--r--app/views/admin/application_settings/_registry.html.haml2
-rw-r--r--app/views/admin/application_settings/_repository_check.html.haml2
-rw-r--r--app/views/admin/application_settings/_repository_mirrors_form.html.haml2
-rw-r--r--app/views/admin/application_settings/_repository_static_objects.html.haml2
-rw-r--r--app/views/admin/application_settings/_repository_storage.html.haml11
-rw-r--r--app/views/admin/application_settings/_signin.html.haml2
-rw-r--r--app/views/admin/application_settings/_signup.html.haml2
-rw-r--r--app/views/admin/application_settings/_snowplow.html.haml2
-rw-r--r--app/views/admin/application_settings/_sourcegraph.html.haml4
-rw-r--r--app/views/admin/application_settings/_spam.html.haml2
-rw-r--r--app/views/admin/application_settings/_terminal.html.haml2
-rw-r--r--app/views/admin/application_settings/_terms.html.haml2
-rw-r--r--app/views/admin/application_settings/_third_party_offers.html.haml2
-rw-r--r--app/views/admin/application_settings/_usage.html.haml4
-rw-r--r--app/views/admin/application_settings/_visibility_and_access.html.haml2
-rw-r--r--app/views/admin/application_settings/general.html.haml12
-rw-r--r--app/views/admin/applications/_form.html.haml4
-rw-r--r--app/views/admin/applications/index.html.haml2
-rw-r--r--app/views/admin/broadcast_messages/_form.html.haml4
-rw-r--r--app/views/admin/dashboard/index.html.haml2
-rw-r--r--app/views/admin/deploy_keys/edit.html.haml4
-rw-r--r--app/views/admin/deploy_keys/index.html.haml2
-rw-r--r--app/views/admin/deploy_keys/new.html.haml4
-rw-r--r--app/views/admin/dev_ops_report/_report.html.haml4
-rw-r--r--app/views/admin/groups/_form.html.haml4
-rw-r--r--app/views/admin/groups/_group.html.haml2
-rw-r--r--app/views/admin/groups/index.html.haml2
-rw-r--r--app/views/admin/groups/show.html.haml3
-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/instance_statistics/index.html.haml4
-rw-r--r--app/views/admin/labels/_form.html.haml4
-rw-r--r--app/views/admin/labels/index.html.haml2
-rw-r--r--app/views/admin/projects/_projects.html.haml2
-rw-r--r--app/views/admin/projects/index.html.haml2
-rw-r--r--app/views/admin/projects/show.html.haml1
-rw-r--r--app/views/admin/serverless/domains/_form.html.haml2
-rw-r--r--app/views/admin/usage_trends/index.html.haml4
-rw-r--r--app/views/admin/users/_cohorts_table.html.haml2
-rw-r--r--app/views/admin/users/_form.html.haml8
-rw-r--r--app/views/admin/users/_users.html.haml2
-rw-r--r--app/views/admin/users/index.html.haml2
-rw-r--r--app/views/ci/variables/_header.html.haml2
-rw-r--r--app/views/clusters/clusters/_advanced_settings.html.haml2
-rw-r--r--app/views/clusters/clusters/_cluster_list.html.haml4
-rw-r--r--app/views/clusters/clusters/_empty_state.html.haml2
-rw-r--r--app/views/clusters/clusters/_provider_details_form.html.haml2
-rw-r--r--app/views/clusters/clusters/gcp/_form.html.haml2
-rw-r--r--app/views/clusters/clusters/user/_form.html.haml2
-rw-r--r--app/views/dashboard/_groups_head.html.haml2
-rw-r--r--app/views/dashboard/_projects_head.html.haml2
-rw-r--r--app/views/dashboard/_snippets_head.html.haml2
-rw-r--r--app/views/dashboard/activity.html.haml2
-rw-r--r--app/views/dashboard/groups/index.html.haml2
-rw-r--r--app/views/dashboard/issues.html.haml2
-rw-r--r--app/views/dashboard/merge_requests.html.haml2
-rw-r--r--app/views/dashboard/projects/_projects.html.haml2
-rw-r--r--app/views/dashboard/projects/index.html.haml2
-rw-r--r--app/views/dashboard/projects/shared/_common.html.haml2
-rw-r--r--app/views/dashboard/todos/index.html.haml2
-rw-r--r--app/views/devise/confirmations/almost_there.haml16
-rw-r--r--app/views/devise/confirmations/new.html.haml2
-rw-r--r--app/views/devise/sessions/_new_base.html.haml2
-rw-r--r--app/views/devise/sessions/_new_crowd.html.haml2
-rw-r--r--app/views/devise/sessions/_new_ldap.html.haml2
-rw-r--r--app/views/devise/sessions/two_factor.html.haml2
-rw-r--r--app/views/devise/shared/_omniauth_box.html.haml2
-rw-r--r--app/views/devise/shared/_signup_box.html.haml2
-rw-r--r--app/views/devise/shared/_signup_omniauth_providers_top.haml2
-rw-r--r--app/views/devise/unlocks/new.html.haml2
-rw-r--r--app/views/doorkeeper/applications/_form.html.haml2
-rw-r--r--app/views/doorkeeper/authorizations/new.html.haml2
-rw-r--r--app/views/events/event/_push.html.haml7
-rw-r--r--app/views/explore/groups/index.html.haml2
-rw-r--r--app/views/explore/projects/index.html.haml2
-rw-r--r--app/views/explore/projects/page_out_of_bounds.html.haml2
-rw-r--r--app/views/explore/projects/starred.html.haml2
-rw-r--r--app/views/explore/projects/trending.html.haml2
-rw-r--r--app/views/groups/_home_panel.html.haml11
-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.haml6
-rw-r--r--app/views/groups/_new_group_fields.html.haml2
-rw-r--r--app/views/groups/group_members/index.html.haml6
-rw-r--r--app/views/groups/milestones/_form.html.haml4
-rw-r--r--app/views/groups/milestones/index.html.haml2
-rw-r--r--app/views/groups/projects.html.haml2
-rw-r--r--app/views/groups/registry/repositories/index.html.haml1
-rw-r--r--app/views/groups/settings/_advanced.html.haml2
-rw-r--r--app/views/groups/settings/_general.html.haml4
-rw-r--r--app/views/groups/settings/_pages_settings.html.haml2
-rw-r--r--app/views/groups/settings/_permissions.html.haml2
-rw-r--r--app/views/groups/settings/ci_cd/_auto_devops_form.html.haml2
-rw-r--r--app/views/groups/settings/ci_cd/_form.html.haml2
-rw-r--r--app/views/groups/settings/ci_cd/show.html.haml6
-rw-r--r--app/views/groups/settings/packages_and_registries/index.html.haml2
-rw-r--r--app/views/groups/settings/repository/_initial_branch_name.html.haml2
-rw-r--r--app/views/groups/settings/repository/show.html.haml2
-rw-r--r--app/views/groups/show.html.haml5
-rw-r--r--app/views/groups/sidebar/_packages_settings.html.haml2
-rw-r--r--app/views/import/bulk_imports/status.html.haml3
-rw-r--r--app/views/import/github/new.html.haml4
-rw-r--r--app/views/import/shared/_new_project_form.html.haml4
-rw-r--r--app/views/jira_connect/subscriptions/index.html.haml78
-rw-r--r--app/views/layouts/_head.html.haml5
-rw-r--r--app/views/layouts/_snowplow.html.haml3
-rw-r--r--app/views/layouts/jira_connect.html.haml6
-rw-r--r--app/views/layouts/nav/groups_dropdown/_show.html.haml6
-rw-r--r--app/views/layouts/nav/projects_dropdown/_show.html.haml11
-rw-r--r--app/views/layouts/nav/sidebar/_admin.html.haml9
-rw-r--r--app/views/layouts/nav/sidebar/_group.html.haml6
-rw-r--r--app/views/layouts/nav/sidebar/_profile.html.haml2
-rw-r--r--app/views/layouts/nav/sidebar/_project.html.haml14
-rw-r--r--app/views/notify/_users_list.html.haml10
-rw-r--r--app/views/notify/access_token_about_to_expire_email.html.haml8
-rw-r--r--app/views/notify/access_token_about_to_expire_email.text.erb6
-rw-r--r--app/views/notify/change_in_merge_request_draft_status_email.html.haml2
-rw-r--r--app/views/notify/change_in_merge_request_draft_status_email.text.erb1
-rw-r--r--app/views/notify/closed_merge_request_email.text.haml1
-rw-r--r--app/views/notify/merge_request_status_email.text.haml1
-rw-r--r--app/views/notify/merge_request_unmergeable_email.text.haml1
-rw-r--r--app/views/notify/merge_when_pipeline_succeeds_email.html.haml18
-rw-r--r--app/views/notify/merge_when_pipeline_succeeds_email.text.haml1
-rw-r--r--app/views/notify/merged_merge_request_email.text.haml1
-rw-r--r--app/views/notify/new_mention_in_merge_request_email.text.erb3
-rw-r--r--app/views/notify/new_merge_request_email.html.haml7
-rw-r--r--app/views/notify/new_merge_request_email.text.erb1
-rw-r--r--app/views/notify/unknown_sign_in_email.html.haml5
-rw-r--r--app/views/peek/_bar.html.haml1
-rw-r--r--app/views/profiles/notifications/_group_settings.html.haml7
-rw-r--r--app/views/profiles/notifications/_project_settings.html.haml7
-rw-r--r--app/views/profiles/notifications/show.html.haml7
-rw-r--r--app/views/profiles/preferences/show.html.haml9
-rw-r--r--app/views/profiles/show.html.haml6
-rw-r--r--app/views/profiles/two_factor_auths/show.html.haml2
-rw-r--r--app/views/projects/_home_panel.html.haml19
-rw-r--r--app/views/projects/_invite_members_link.html.haml4
-rw-r--r--app/views/projects/_invite_members_modal.html.haml2
-rw-r--r--app/views/projects/_merge_request_merge_method_settings.html.haml2
-rw-r--r--app/views/projects/_new_project_fields.html.haml4
-rw-r--r--app/views/projects/_new_project_push_tip.html.haml11
-rw-r--r--app/views/projects/_service_desk_settings.html.haml2
-rw-r--r--app/views/projects/artifacts/browse.html.haml2
-rw-r--r--app/views/projects/blame/_age_map_legend.html.haml12
-rw-r--r--app/views/projects/blame/_blame_group.html.haml26
-rw-r--r--app/views/projects/blame/show.html.haml52
-rw-r--r--app/views/projects/blob/_template_selectors.html.haml2
-rw-r--r--app/views/projects/blob/_upload.html.haml2
-rw-r--r--app/views/projects/branches/_branch.html.haml4
-rw-r--r--app/views/projects/buttons/_clone.html.haml10
-rw-r--r--app/views/projects/buttons/_fork.html.haml13
-rw-r--r--app/views/projects/buttons/_star.html.haml18
-rw-r--r--app/views/projects/ci/pipeline_editor/show.html.haml10
-rw-r--r--app/views/projects/cleanup/_show.html.haml4
-rw-r--r--app/views/projects/commit/_pipelines_list.haml2
-rw-r--r--app/views/projects/commits/_commit.html.haml2
-rw-r--r--app/views/projects/commits/show.html.haml4
-rw-r--r--app/views/projects/compare/_form.html.haml28
-rw-r--r--app/views/projects/compare/index.html.haml6
-rw-r--r--app/views/projects/compare/show.html.haml3
-rw-r--r--app/views/projects/cycle_analytics/_empty_stage.html.haml7
-rw-r--r--app/views/projects/cycle_analytics/_no_access.html.haml7
-rw-r--r--app/views/projects/cycle_analytics/show.html.haml66
-rw-r--r--app/views/projects/default_branch/_show.html.haml4
-rw-r--r--app/views/projects/diffs/_diffs.html.haml2
-rw-r--r--app/views/projects/diffs/_file.html.haml5
-rw-r--r--app/views/projects/edit.html.haml14
-rw-r--r--app/views/projects/empty.html.haml8
-rw-r--r--app/views/projects/forks/_fork_button.html.haml2
-rw-r--r--app/views/projects/forks/new.html.haml45
-rw-r--r--app/views/projects/issues/_form.html.haml2
-rw-r--r--app/views/projects/issues/_issue.html.haml2
-rw-r--r--app/views/projects/issues/_nav_btns.html.haml17
-rw-r--r--app/views/projects/issues/import_csv/_modal.html.haml4
-rw-r--r--app/views/projects/issues/index.html.haml2
-rw-r--r--app/views/projects/issues/new.html.haml4
-rw-r--r--app/views/projects/learn_gitlab/index.html.haml1
-rw-r--r--app/views/projects/merge_requests/_nav_btns.html.haml12
-rw-r--r--app/views/projects/merge_requests/conflicts/_commit_stats.html.haml11
-rw-r--r--app/views/projects/merge_requests/conflicts/_file_actions.html.haml12
-rw-r--r--app/views/projects/merge_requests/conflicts/_submit_form.html.haml24
-rw-r--r--app/views/projects/merge_requests/conflicts/components/_diff_file_editor.html.haml10
-rw-r--r--app/views/projects/merge_requests/conflicts/components/_inline_conflict_lines.html.haml14
-rw-r--r--app/views/projects/merge_requests/conflicts/show.html.haml32
-rw-r--r--app/views/projects/mirrors/_mirror_repos.html.haml4
-rw-r--r--app/views/projects/new.html.haml5
-rw-r--r--app/views/projects/no_repo.html.haml2
-rw-r--r--app/views/projects/pipeline_schedules/_pipeline_schedule.html.haml6
-rw-r--r--app/views/projects/pipelines/charts.html.haml2
-rw-r--r--app/views/projects/pipelines/index.html.haml2
-rw-r--r--app/views/projects/pipelines/new.html.haml5
-rw-r--r--app/views/projects/pipelines/show.html.haml2
-rw-r--r--app/views/projects/project_members/_groups.html.haml11
-rw-r--r--app/views/projects/project_members/_team.html.haml22
-rw-r--r--app/views/projects/project_members/index.html.haml54
-rw-r--r--app/views/projects/project_templates/_project_fields_form.html.haml2
-rw-r--r--app/views/projects/protected_branches/shared/_branches_list.html.haml6
-rw-r--r--app/views/projects/protected_branches/shared/_create_protected_branch.html.haml9
-rw-r--r--app/views/projects/protected_branches/shared/_index.html.haml4
-rw-r--r--app/views/projects/protected_tags/shared/_index.html.haml4
-rw-r--r--app/views/projects/registry/repositories/index.html.haml1
-rw-r--r--app/views/projects/runners/_runner.html.haml2
-rw-r--r--app/views/projects/security/configuration/show.html.haml2
-rw-r--r--app/views/projects/services/prometheus/_configuration_banner.html.haml6
-rw-r--r--app/views/projects/services/prometheus/_help.html.haml2
-rw-r--r--app/views/projects/settings/_general.html.haml7
-rw-r--r--app/views/projects/settings/ci_cd/_badge.html.haml6
-rw-r--r--app/views/projects/settings/ci_cd/_form.html.haml2
-rw-r--r--app/views/projects/settings/ci_cd/show.html.haml20
-rw-r--r--app/views/projects/settings/operations/_configuration_banner.html.haml6
-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/repository/show.html.haml2
-rw-r--r--app/views/projects/show.html.haml3
-rw-r--r--app/views/projects/tags/_tag.html.haml2
-rw-r--r--app/views/projects/tree/_tree_header.html.haml2
-rw-r--r--app/views/projects/update.js.haml10
-rw-r--r--app/views/shared/_confirm_fork_modal.html.haml4
-rw-r--r--app/views/shared/_group_form.html.haml2
-rw-r--r--app/views/shared/_mobile_clone_panel.html.haml4
-rw-r--r--app/views/shared/_new_commit_form.html.haml7
-rw-r--r--app/views/shared/_new_project_item_select.html.haml4
-rw-r--r--app/views/shared/_recaptcha_form.html.haml2
-rw-r--r--app/views/shared/access_tokens/_form.html.haml6
-rw-r--r--app/views/shared/boards/_show.html.haml2
-rw-r--r--app/views/shared/boards/_switcher.html.haml2
-rw-r--r--app/views/shared/boards/components/_sidebar.html.haml4
-rw-r--r--app/views/shared/deploy_keys/_index.html.haml4
-rw-r--r--app/views/shared/deploy_keys/_project_group_form.html.haml2
-rw-r--r--app/views/shared/deploy_tokens/_form.html.haml2
-rw-r--r--app/views/shared/deploy_tokens/_index.html.haml4
-rw-r--r--app/views/shared/empty_states/_deploy_keys.html.haml2
-rw-r--r--app/views/shared/empty_states/_issues.html.haml8
-rw-r--r--app/views/shared/empty_states/_labels.html.haml6
-rw-r--r--app/views/shared/empty_states/_merge_requests.html.haml6
-rw-r--r--app/views/shared/empty_states/_profile_tabs.html.haml4
-rw-r--r--app/views/shared/empty_states/_snippets.html.haml2
-rw-r--r--app/views/shared/empty_states/_wikis.html.haml4
-rw-r--r--app/views/shared/form_elements/_apply_template_warning.html.haml4
-rw-r--r--app/views/shared/gitpod/_enable_gitpod_modal.html.haml4
-rw-r--r--app/views/shared/groups/_empty_state.html.haml2
-rw-r--r--app/views/shared/issuable/_form.html.haml8
-rw-r--r--app/views/shared/issuable/_label_page_create.html.haml2
-rw-r--r--app/views/shared/issuable/_search_bar.html.haml338
-rw-r--r--app/views/shared/issuable/_sidebar.html.haml12
-rw-r--r--app/views/shared/issuable/_sidebar_assignees.html.haml3
-rw-r--r--app/views/shared/issuable/_sidebar_reviewers.html.haml15
-rw-r--r--app/views/shared/issuable/csv_export/_modal.html.haml8
-rw-r--r--app/views/shared/labels/_form.html.haml6
-rw-r--r--app/views/shared/labels/_nav.html.haml4
-rw-r--r--app/views/shared/members/_invite_group.html.haml2
-rw-r--r--app/views/shared/members/_invite_member.html.haml2
-rw-r--r--app/views/shared/members/_member.html.haml2
-rw-r--r--app/views/shared/milestones/_milestone.html.haml6
-rw-r--r--app/views/shared/notifications/_button.html.haml37
-rw-r--r--app/views/shared/notifications/_custom_notifications.html.haml34
-rw-r--r--app/views/shared/notifications/_new_button.html.haml35
-rw-r--r--app/views/shared/notifications/_notification_dropdown.html.haml12
-rw-r--r--app/views/shared/projects/_list.html.haml3
-rw-r--r--app/views/shared/projects/_project.html.haml9
-rw-r--r--app/views/shared/projects/_search_bar.html.haml2
-rw-r--r--app/views/shared/projects/protected_branches/_update_protected_branch.html.haml3
-rw-r--r--app/views/shared/wikis/_form.html.haml4
-rw-r--r--app/views/shared/wikis/_main_links.html.haml2
-rw-r--r--app/views/shared/wikis/edit.html.haml3
-rw-r--r--app/views/users/show.html.haml14
-rw-r--r--app/workers/all_queues.yml116
-rw-r--r--app/workers/analytics/instance_statistics/count_job_trigger_worker.rb18
-rw-r--r--app/workers/analytics/instance_statistics/counter_job_worker.rb22
-rw-r--r--app/workers/analytics/usage_trends/count_job_trigger_worker.rb34
-rw-r--r--app/workers/analytics/usage_trends/counter_job_worker.rb35
-rw-r--r--app/workers/archive_trace_worker.rb2
-rw-r--r--app/workers/build_finished_worker.rb3
-rw-r--r--app/workers/chat_notification_worker.rb1
-rw-r--r--app/workers/concerns/worker_attributes.rb8
-rw-r--r--app/workers/emails_on_push_worker.rb2
-rw-r--r--app/workers/error_tracking_issue_link_worker.rb4
-rw-r--r--app/workers/expire_build_instance_artifacts_worker.rb1
-rw-r--r--app/workers/expire_job_cache_worker.rb10
-rw-r--r--app/workers/expire_pipeline_cache_worker.rb2
-rw-r--r--app/workers/merge_requests/delete_source_branch_worker.rb24
-rw-r--r--app/workers/namespaces/in_product_marketing_emails_worker.rb1
-rw-r--r--app/workers/namespaces/onboarding_issue_created_worker.rb20
-rw-r--r--app/workers/namespaces/onboarding_progress_worker.rb20
-rw-r--r--app/workers/packages/composer/cache_update_worker.rb23
-rw-r--r--app/workers/packages/maven/metadata/sync_worker.rb59
-rw-r--r--app/workers/pages_update_configuration_worker.rb6
-rw-r--r--app/workers/personal_access_tokens/expiring_worker.rb19
-rw-r--r--app/workers/post_receive.rb1
-rw-r--r--app/workers/project_schedule_bulk_repository_shard_moves_worker.rb18
-rw-r--r--app/workers/project_update_repository_storage_worker.rb32
-rw-r--r--app/workers/projects/schedule_bulk_repository_shard_moves_worker.rb15
-rw-r--r--app/workers/projects/update_repository_storage_worker.rb25
-rw-r--r--app/workers/releases/create_evidence_worker.rb1
-rw-r--r--app/workers/snippet_schedule_bulk_repository_shard_moves_worker.rb17
-rw-r--r--app/workers/snippet_update_repository_storage_worker.rb32
-rw-r--r--app/workers/snippets/schedule_bulk_repository_shard_moves_worker.rb15
-rw-r--r--app/workers/snippets/update_repository_storage_worker.rb25
-rw-r--r--app/workers/stuck_ci_jobs_worker.rb2
-rw-r--r--babel.config.js2
-rw-r--r--changelogs/unreleased/11424-background-worker-for-updating-the-maven-metadata-xml-file.yml5
-rw-r--r--changelogs/unreleased/118597-improve-autofill-suggestions-for-usernames.yml5
-rw-r--r--changelogs/unreleased/15332-add-draft-status-change-email.yml5
-rw-r--r--changelogs/unreleased/15332-notify-when-merge-request-draft-status-changes.yml5
-rw-r--r--changelogs/unreleased/18792-add-container_registry_access_level.yml5
-rw-r--r--changelogs/unreleased/198562-merge-request-user-interface-encourages-accidentally-closing-the-r.yml5
-rw-r--r--changelogs/unreleased/205484-01-project-settings-headers-cicd.yml5
-rw-r--r--changelogs/unreleased/205484-03-project-settings-headers-cicd-variables.yml5
-rw-r--r--changelogs/unreleased/205484-04-project-settings-headers-repo-default-branch.yml5
-rw-r--r--changelogs/unreleased/205484-05-project-settings-headers-repository-mirroring-repositories.yml5
-rw-r--r--changelogs/unreleased/205484-06-project-settings-headers-repository-protected-branches.yml5
-rw-r--r--changelogs/unreleased/205484-07-project-settings-headers-repository-protected-tags.yml5
-rw-r--r--changelogs/unreleased/205484-08-project-settings-headers-repository-cleanup.yml5
-rw-r--r--changelogs/unreleased/205484-09-project-settings-headers-repository-deploy-tokens.yml5
-rw-r--r--changelogs/unreleased/205484-10-project-settings-headers-repository-deploy-keys.yml5
-rw-r--r--changelogs/unreleased/207467-add-gradle-setup-and-install-commands-to-the-package-details-page-.yml5
-rw-r--r--changelogs/unreleased/209061-remove-dashboard-pipeline-status-ff.yml5
-rw-r--r--changelogs/unreleased/20917-do-not-show-button-to-resolve-discussion-opening-an-issue-when-issu.yml5
-rw-r--r--changelogs/unreleased/212322-update-existing-vulnerabilities-occurrences-uuids.yml5
-rw-r--r--changelogs/unreleased/21759-add-loading-indicator-to-update-username-button.yml5
-rw-r--r--changelogs/unreleased/218964-downstream-pipeline-caching.yml5
-rw-r--r--changelogs/unreleased/221296-skip_orphaned_pool_repositories_on_restore.yml5
-rw-r--r--changelogs/unreleased/225309-add-invite_email-quick-action.yml5
-rw-r--r--changelogs/unreleased/227257-replace-bootstrap-popover-with-gitlab-ui-popover-in-merge-conflict.yml5
-rw-r--r--changelogs/unreleased/228733-alert-issue-status.yml5
-rw-r--r--changelogs/unreleased/22901-add-predefined-variable.yml5
-rw-r--r--changelogs/unreleased/229507-graphql-mutation-to-remove-issue-from-board.yml5
-rw-r--r--changelogs/unreleased/230465-fj-add-columns-to-track-group-wiki-storage.yml5
-rw-r--r--changelogs/unreleased/231064-update-settings-buttons-to-pajamas.yml5
-rw-r--r--changelogs/unreleased/231126-yo-gitlab-ui.yml6
-rw-r--r--changelogs/unreleased/235909-make-it-clearer-what-to-do-after-adding-a-namespace.yml5
-rw-r--r--changelogs/unreleased/241058-mg-update-reply-placeholder.yml5
-rw-r--r--changelogs/unreleased/241735-add-import-options-to-projects-and-groups-dropdown.yml5
-rw-r--r--changelogs/unreleased/246959-msj-opened-created-ui.yml5
-rw-r--r--changelogs/unreleased/247636-fix-logging-search-scope.yml5
-rw-r--r--changelogs/unreleased/247918-add-user-preference-to-turn-off-keystroke-formatting.yml5
-rw-r--r--changelogs/unreleased/24908-user-2fa-status-should-not-be-publicly-shown.yml5
-rw-r--r--changelogs/unreleased/254267-replace-bootstrap-modal-in-app-views-projects-issues-export_csv-_b.yml5
-rw-r--r--changelogs/unreleased/255913-webex-teams-pipeline-notifications.yml5
-rw-r--r--changelogs/unreleased/259840-composer-v2-metadata-url.yml5
-rw-r--r--changelogs/unreleased/262859-restrict-oncall-rotation-to-interval.yml5
-rw-r--r--changelogs/unreleased/262862-add-deleted-at-to-oncall-rotation-participant.yml5
-rw-r--r--changelogs/unreleased/263442_remove_recursive_approach_for_all_projects_feature_flag.yml5
-rw-r--r--changelogs/unreleased/267511-approval-gate-rule-type.yml5
-rw-r--r--changelogs/unreleased/268207_exclude_duplicates_from_emails_on_push_recipients_when_sending.yml5
-rw-r--r--changelogs/unreleased/273286-update-project-view-buttons.yml5
-rw-r--r--changelogs/unreleased/273292-fy21q4-foundations-kr2-audit-and-update-buttons-on-sessionscontrol.yml6
-rw-r--r--changelogs/unreleased/273294-fy21q4-foundations-kr2-audit-and-update-buttons-on-groupscontrolle.yml6
-rw-r--r--changelogs/unreleased/273295-fy21q4-foundations-kr2-audit-and-update-buttons-on-userscontroller.yml5
-rw-r--r--changelogs/unreleased/273296-fy21q4-foundations-kr2-audit-and-update-buttons-on-projects-jobsco.yml5
-rw-r--r--changelogs/unreleased/273574-fix-bad-projects-has_external_issue_tracker-data.yml5
-rw-r--r--changelogs/unreleased/275169-remove-service-desk-issue-prefix.yml5
-rw-r--r--changelogs/unreleased/275818-be-add-info-error-messages-to-security-widget-summary-diverged.yml6
-rw-r--r--changelogs/unreleased/277327-fix-background-migration-argument-type.yml5
-rw-r--r--changelogs/unreleased/284116-sync-or-remove-single-file-mode-user-preference.yml5
-rw-r--r--changelogs/unreleased/284392-use-info-style-for-merged-instead-of-primary.yml5
-rw-r--r--changelogs/unreleased/285438-rename-instance-statistics-to-usage-trends.yml6
-rw-r--r--changelogs/unreleased/285467-package-registry-graphql-api.yml5
-rw-r--r--changelogs/unreleased/288326-wiki-edit-page-title-s-styling-mismatch-2.yml5
-rw-r--r--changelogs/unreleased/28902_extend_group_api.yml5
-rw-r--r--changelogs/unreleased/290254-override-approvers-setting-does-not-reflect-actual-behavior.yml5
-rw-r--r--changelogs/unreleased/290288-composer-cache-build-pages-task.yml5
-rw-r--r--changelogs/unreleased/290288-composer-cache-hooks.yml5
-rw-r--r--changelogs/unreleased/292128-fix-icon-spacing.yml5
-rw-r--r--changelogs/unreleased/292239-schedule-duplicate-findings-removal.yml5
-rw-r--r--changelogs/unreleased/292498-webid-extension.yml5
-rw-r--r--changelogs/unreleased/292602-remove-fetch_mirror_check_tags_changed-ff.yml5
-rw-r--r--changelogs/unreleased/292824-track-assignee-reviewer-changes.yml5
-rw-r--r--changelogs/unreleased/292824-track-label-milestone-change.yml5
-rw-r--r--changelogs/unreleased/292824-track-mr-lock-changes.yml5
-rw-r--r--changelogs/unreleased/292824-track-mr-time-changes.yml5
-rw-r--r--changelogs/unreleased/293655-de-emphasize-nested-reports-in-mr-widget.yml5
-rw-r--r--changelogs/unreleased/293921-wrap-iterations.yml5
-rw-r--r--changelogs/unreleased/294436-create-project-required-fields.yml5
-rw-r--r--changelogs/unreleased/294443-move-wiki-helper-error-to-vue.yml5
-rw-r--r--changelogs/unreleased/294482-conan-anonymous.yml5
-rw-r--r--changelogs/unreleased/295665-fix-sidekiq-check.yml5
-rw-r--r--changelogs/unreleased/296125-show-timeline-for-devops-score.yml5
-rw-r--r--changelogs/unreleased/296945-update-the-container-registry-ui-header-copy-to-remove-expiration-.yml5
-rw-r--r--changelogs/unreleased/297020-linux-distribution-details-in-usage-ping.yml5
-rw-r--r--changelogs/unreleased/297240-enable-skip_dag_manual_and_delayed_jobs.yml5
-rw-r--r--changelogs/unreleased/297404-remove-suggestions-custom-commit-ff.yml5
-rw-r--r--changelogs/unreleased/297428-code-owner-optional-section.yml5
-rw-r--r--changelogs/unreleased/298827-graphql-getting-mr-diff-discussions-often-returns-500.yml5
-rw-r--r--changelogs/unreleased/299034-group-group-links-project-authorizations-refresh-can-be-limited-to.yml6
-rw-r--r--changelogs/unreleased/299884_remove_diff_highlighting_feature_flag.yml5
-rw-r--r--changelogs/unreleased/299895-experiment-cleanup-customize_homepage-banner.yml5
-rw-r--r--changelogs/unreleased/300021-rollout-serving-migrated-data-feature-flag-pages_serve_from_migrat.yml5
-rw-r--r--changelogs/unreleased/30010-graphql-doc.yml5
-rw-r--r--changelogs/unreleased/300150-cache-search-tab-counters.yml5
-rw-r--r--changelogs/unreleased/300302-db-constraint-terraform-name.yml5
-rw-r--r--changelogs/unreleased/300417-agent-token-description.yml5
-rw-r--r--changelogs/unreleased/300435-add-label.yml5
-rw-r--r--changelogs/unreleased/300443-add-label.yml5
-rw-r--r--changelogs/unreleased/300458-send-gitlab_standard-context-with-requirements-events-from-the-fro.yml5
-rw-r--r--changelogs/unreleased/300479-change-prefilled-mr-title-description.yml5
-rw-r--r--changelogs/unreleased/300617-aqualls-prometheus-settings.yml5
-rw-r--r--changelogs/unreleased/300654-refactor-confidentiality-sidebar-component-to-use-vue-apollo.yml5
-rw-r--r--changelogs/unreleased/300714-provide-name-of-expiring-token-in-personal-access-token-expiration.yml5
-rw-r--r--changelogs/unreleased/300750-add-missing-reviewers-information-to-closed-merge-request-email.yml5
-rw-r--r--changelogs/unreleased/300750-add-missing-reviewers-information-to-merge-request-email-notificat.yml5
-rw-r--r--changelogs/unreleased/300750-add-missing-reviewers-information-to-merge_request_status_email.yml5
-rw-r--r--changelogs/unreleased/300750-add-missing-reviewers-information-to-merge_request_unmergeable_ema.yml5
-rw-r--r--changelogs/unreleased/300750-add-missing-reviewers-information-to-merged-merge-request-email.yml5
-rw-r--r--changelogs/unreleased/300750-add-missing-reviewers-information-to-new_mention_in_merge_request_.yml5
-rw-r--r--changelogs/unreleased/300750-merge-request-email-notifications-don-t-include-reviewer-informati.yml5
-rw-r--r--changelogs/unreleased/300787-clean-up-block-class-for-jobs-feature.yml5
-rw-r--r--changelogs/unreleased/300827-alerts-integrations-UX-cleanup-2nd-part.yml5
-rw-r--r--changelogs/unreleased/300827-split-alert-integrations-form.yml5
-rw-r--r--changelogs/unreleased/300853-convert-compare-show-to-vue.yml5
-rw-r--r--changelogs/unreleased/300865-default-confidentiality-of-replies.yml5
-rw-r--r--changelogs/unreleased/301018-cablett-collapsed-epic-board-list.yml5
-rw-r--r--changelogs/unreleased/301032-license-creation-via-api.yml5
-rw-r--r--changelogs/unreleased/301056-make-the-geo-oauth-application-trusted-by-default.yml5
-rw-r--r--changelogs/unreleased/320746-update-the-package-list-item-ui-make-action-buttons-in-list-items-.yml5
-rw-r--r--changelogs/unreleased/320901-container-page-says-image-repository-not-found.yml5
-rw-r--r--changelogs/unreleased/320949-ci-help-path-remove-prop.yml5
-rw-r--r--changelogs/unreleased/321027-enable-ci_trigger_payload_into_pipeline.yml5
-rw-r--r--changelogs/unreleased/321054-enable-quick-actions-usage-data.yml5
-rw-r--r--changelogs/unreleased/321057-refine-the-user-interface-related-to-package-lists-and-the-search-.yml5
-rw-r--r--changelogs/unreleased/321185-experiment-cleanup-invite_members_version_a-add-invite-members-to-.yml5
-rw-r--r--changelogs/unreleased/321283-update-kubernetes-version-supported.yml5
-rw-r--r--changelogs/unreleased/321297-load-only-metadata-for-markdown-video-include.yml5
-rw-r--r--changelogs/unreleased/321372-feature-flag-rollout-of-vue_notification_dropdown.yml5
-rw-r--r--changelogs/unreleased/321420-spell-npm-with-lowercase-letters-in-package-registry-ui.yml5
-rw-r--r--changelogs/unreleased/321488-mr-changes-view-render-version-dropdowns-above-navbar.yml5
-rw-r--r--changelogs/unreleased/321514-fix-clipboard-buttons.yml5
-rw-r--r--changelogs/unreleased/321593-hide-issue-counts-in-project-list-where-issues-disabled.yml5
-rw-r--r--changelogs/unreleased/321659-handle-discord-errors.yml5
-rw-r--r--changelogs/unreleased/321667-follow-first.yml5
-rw-r--r--changelogs/unreleased/321677-enable-pages-zip-file-protocol-by-default.yml5
-rw-r--r--changelogs/unreleased/321745-remove-temporary-index-idx_on_issues_where_service_desk_reply_to_i.yml5
-rw-r--r--changelogs/unreleased/321752-cablett-delete-epic-warning.yml5
-rw-r--r--changelogs/unreleased/321788-fix-n-plus-1s.yml5
-rw-r--r--changelogs/unreleased/321790-load-refs-on-demand.yml5
-rw-r--r--changelogs/unreleased/321827-fix-n-1-in-runner-validations.yml5
-rw-r--r--changelogs/unreleased/321834-fj-remove-nil-values-from-snippet-blobs.yml5
-rw-r--r--changelogs/unreleased/321845-performance-pipeline-table-dropdowns.yml5
-rw-r--r--changelogs/unreleased/321862_fix_long_commit_messages_error.yml5
-rw-r--r--changelogs/unreleased/321917_introduce_info_column_for_the_security_scans_table.yml5
-rw-r--r--changelogs/unreleased/321929-fix-dark-mode-app-header-on-profile-preferences-page.yml5
-rw-r--r--changelogs/unreleased/321939-fix-error-when-rendering-project-pipeline.yml5
-rw-r--r--changelogs/unreleased/321958-fix-npm-instance-level-api-with-scoped-packages.yml5
-rw-r--r--changelogs/unreleased/322019-iterations-list-and-report-views-missing-left-sidebar-status.yml5
-rw-r--r--changelogs/unreleased/322059-remove-api_v3_repos_events_optimization-flag.yml5
-rw-r--r--changelogs/unreleased/322082-fix-invite-member-modal-dropdown-styling.yml5
-rw-r--r--changelogs/unreleased/322098-limit-projectauthorizations-refresh-jobs-to-distinct-users.yml6
-rw-r--r--changelogs/unreleased/322099-harden-addition-for-template-repositoriu.yml5
-rw-r--r--changelogs/unreleased/322099-sql-definition-for-template_repositories.yml5
-rw-r--r--changelogs/unreleased/322103-optimize-the-dictionary-view-to-not-repeat-same-columns.yml5
-rw-r--r--changelogs/unreleased/322125-add-prometheus-histo-on-retries.yml5
-rw-r--r--changelogs/unreleased/322125-log-optimistic-locking-retries.yml5
-rw-r--r--changelogs/unreleased/322128-token-used-field.yml5
-rw-r--r--changelogs/unreleased/322424-btn-confirm.yml5
-rw-r--r--changelogs/unreleased/322598-skip_client_authentication_for_password_grant.yml5
-rw-r--r--changelogs/unreleased/322626-use-grouped-list-for-test-report-widget.yml5
-rw-r--r--changelogs/unreleased/322663-remove-deprecated-button-variant-on-integration-configuration-view.yml5
-rw-r--r--changelogs/unreleased/322724-fix-compare-page-dropdown-loading.yml5
-rw-r--r--changelogs/unreleased/322745-add-missing-token-names.yml5
-rw-r--r--changelogs/unreleased/322770-change-security-mr-widget-icon.yml5
-rw-r--r--changelogs/unreleased/322782-increase-contrast-of-solarized-light-in-web-ide.yml5
-rw-r--r--changelogs/unreleased/322901-fix-pagerduty-webhook.yml5
-rw-r--r--changelogs/unreleased/322960-degredation-in-assigning-team-members-on-boards-view.yml5
-rw-r--r--changelogs/unreleased/323015-fix-empty-field-in-custom-notification-events-modal.yml5
-rw-r--r--changelogs/unreleased/323059-batch-load-findings-by-uuid.yml5
-rw-r--r--changelogs/unreleased/323088-expose-project-access-token-value-with-create-api.yml5
-rw-r--r--changelogs/unreleased/323163-restore-gitlab_database_transaction_seconds_sum-for-sidekiq.yml5
-rw-r--r--changelogs/unreleased/323175-database-timeout-in-pages-migration-task.yml5
-rw-r--r--changelogs/unreleased/323376-security-configuration-ui-strings-ssot.yml5
-rw-r--r--changelogs/unreleased/323474-update-incident-setting-copy.yml5
-rw-r--r--changelogs/unreleased/323555-disable-gc-compacting-via-monkey-patch.yml5
-rw-r--r--changelogs/unreleased/323674-initiate-web-hook-logs-partitioning.yml5
-rw-r--r--changelogs/unreleased/323848-fix-diff-comment-hidden-menu.yml5
-rw-r--r--changelogs/unreleased/33283-remove-svg.yml5
-rw-r--r--changelogs/unreleased/33685-lift-npm-package-naming-convention-for-project-level-api.yml5
-rw-r--r--changelogs/unreleased/33748-dont-close-auto-suggest-select-boxes-if-only-mouseup-outside-box.yml5
-rw-r--r--changelogs/unreleased/35579-remove-graphql_logging-feature-flag.yml5
-rw-r--r--changelogs/unreleased/51727-allow-job-identiy-self.yml5
-rw-r--r--changelogs/unreleased/55412-typo-in-pipeline-status-email.yml5
-rw-r--r--changelogs/unreleased/6utzeit-de-master-patch-15431.yml5
-rw-r--r--changelogs/unreleased/ab-index-rename.yml5
-rw-r--r--changelogs/unreleased/add-allow-force-push-option.yml5
-rw-r--r--changelogs/unreleased/add-client-id-application-context-metadata.yml5
-rw-r--r--changelogs/unreleased/add-enable-in-product-marketing-emails-application-setting.yml5
-rw-r--r--changelogs/unreleased/add-environment-job-pipeline-hooks.yml5
-rw-r--r--changelogs/unreleased/add-graphql-etag-caching.yml5
-rw-r--r--changelogs/unreleased/add-kas-api-url-config.yml5
-rw-r--r--changelogs/unreleased/add-not-null-constraint-to-gitlab-subscriptions-namespace-id.yml5
-rw-r--r--changelogs/unreleased/add-ollowed-user-activity-as-dashboard-user-choices.yml5
-rw-r--r--changelogs/unreleased/add-pages-cache-settings-to-docs.yml5
-rw-r--r--changelogs/unreleased/add-rails-application-config-hosts.yml5
-rw-r--r--changelogs/unreleased/add-space-download-icon.yml5
-rw-r--r--changelogs/unreleased/add_request_cve_issue.yml5
-rw-r--r--changelogs/unreleased/add_role_and_rolebinding_for_cilium_network_policies.yml5
-rw-r--r--changelogs/unreleased/admin-dashboard-typo.yml5
-rw-r--r--changelogs/unreleased/afontaine-collapse-deployments-in-merge-requests.yml5
-rw-r--r--changelogs/unreleased/ajk-graphql-accept-mr.yml5
-rw-r--r--changelogs/unreleased/ajk-reviewer-widget-approved.yml5
-rw-r--r--changelogs/unreleased/alert-incident-url-follow.yml5
-rw-r--r--changelogs/unreleased/alexpooley-remove_shared_group_membership_auth_ff.yml5
-rw-r--r--changelogs/unreleased/align-mr-conflict-center.yml5
-rw-r--r--changelogs/unreleased/auto-devops-default-branch-deploy.yml5
-rw-r--r--changelogs/unreleased/auto-scroll-pipeline-editor-on-commit.yml5
-rw-r--r--changelogs/unreleased/blame-performance.yml5
-rw-r--r--changelogs/unreleased/board_args_consolidation.yml5
-rw-r--r--changelogs/unreleased/btn-confirm-abuse-reports.yml5
-rw-r--r--changelogs/unreleased/btn-confirm-admin-appearances.yml5
-rw-r--r--changelogs/unreleased/btn-confirm-admin-application-settings.yml5
-rw-r--r--changelogs/unreleased/btn-confirm-admin-applications.yml5
-rw-r--r--changelogs/unreleased/btn-confirm-admin-broadcast-messages.yml5
-rw-r--r--changelogs/unreleased/btn-confirm-admin-deploy-keys.yml5
-rw-r--r--changelogs/unreleased/btn-confirm-admin-groups.yml5
-rw-r--r--changelogs/unreleased/btn-confirm-admin-hooks.yml5
-rw-r--r--changelogs/unreleased/btn-confirm-admin-labels.yml5
-rw-r--r--changelogs/unreleased/btn-confirm-admin-projects.yml5
-rw-r--r--changelogs/unreleased/btn-confirm-admin-serverless.yml5
-rw-r--r--changelogs/unreleased/btn-confirm-admin-users.yml5
-rw-r--r--changelogs/unreleased/btn-confirm-auth.yml5
-rw-r--r--changelogs/unreleased/btn-confirm-clusters.yml5
-rw-r--r--changelogs/unreleased/btn-confirm-doorkeeper.yml5
-rw-r--r--changelogs/unreleased/btn-confirm-empty-states.yml5
-rw-r--r--changelogs/unreleased/btn-confirm-envs.yml5
-rw-r--r--changelogs/unreleased/btn-confirm-group-milestones.yml5
-rw-r--r--changelogs/unreleased/btn-confirm-group-settings.yml5
-rw-r--r--changelogs/unreleased/btn-confirm-group.yml5
-rw-r--r--changelogs/unreleased/btn-confirm-home.yml5
-rw-r--r--changelogs/unreleased/btn-confirm-js-2fa.yml5
-rw-r--r--changelogs/unreleased/btn-confirm-js-badges.yml5
-rw-r--r--changelogs/unreleased/btn-confirm-shared-access-tokens.yml5
-rw-r--r--changelogs/unreleased/btn-confirm-shared-deploy-keys.yml5
-rw-r--r--changelogs/unreleased/btn-confirm-shared-deploy-tokens.yml5
-rw-r--r--changelogs/unreleased/btn-confirm-shared-gitpod.yml5
-rw-r--r--changelogs/unreleased/btn-confirm-shared-groups.yml5
-rw-r--r--changelogs/unreleased/btn-confirm-shared-members.yml5
-rw-r--r--changelogs/unreleased/btn-confirm-shared-wikis.yml5
-rw-r--r--changelogs/unreleased/btn-confirm-shared.yml5
-rw-r--r--changelogs/unreleased/btn-confirm-subs-banner.yml5
-rw-r--r--changelogs/unreleased/btn-default-admin-edit.yml5
-rw-r--r--changelogs/unreleased/btn-default-admin-general-settings.yml5
-rw-r--r--changelogs/unreleased/btn-default-mr-cancel.yml5
-rw-r--r--changelogs/unreleased/btn-icon-commit-action.yml5
-rw-r--r--changelogs/unreleased/btn-icon-schedules.yml5
-rw-r--r--changelogs/unreleased/bugfix-linked-issue-autocomplete.yml5
-rw-r--r--changelogs/unreleased/bump-reliable-fetch.yml5
-rw-r--r--changelogs/unreleased/bump_auto_deploy_image_version.yml4
-rw-r--r--changelogs/unreleased/bvl-fix-create-release-worker-is-not-cron.yml5
-rw-r--r--changelogs/unreleased/cablett-restore-database-structure.yml5
-rw-r--r--changelogs/unreleased/changelog-api-to-optional.yml5
-rw-r--r--changelogs/unreleased/changelog-commits-without-description.yml5
-rw-r--r--changelogs/unreleased/changelog-ignore-reverted-commits.yml5
-rw-r--r--changelogs/unreleased/changelog-include-merge-commits.yml5
-rw-r--r--changelogs/unreleased/chore-bump-swagger-ui-dist.yml5
-rw-r--r--changelogs/unreleased/chore-unknown-sign-in-info-text.yml5
-rw-r--r--changelogs/unreleased/ci_register_job_service_one_by_one.yml5
-rw-r--r--changelogs/unreleased/ci_temporary_lock.yml5
-rw-r--r--changelogs/unreleased/ck3g-remove-MergeRequestAssigneesMigrationProgressCheck-background-migrat.yml5
-rw-r--r--changelogs/unreleased/cmiskell-upgrade-sidekiq-reliable-fetch.yml6
-rw-r--r--changelogs/unreleased/cngo-convert-tab-to-gl-tab.yml5
-rw-r--r--changelogs/unreleased/cngo-convert-threat-monitoring-environment-picker-to-gl-dropdown.yml5
-rw-r--r--changelogs/unreleased/cngo-fix-autocomplete-selecting-loading.yml5
-rw-r--r--changelogs/unreleased/cngo-rename-comment-form-textarea-label.yml5
-rw-r--r--changelogs/unreleased/cq-template-0-85-23.yml5
-rw-r--r--changelogs/unreleased/cwoolley-gitlab-master-patch-20932.yml5
-rw-r--r--changelogs/unreleased/dblessing_bypass_2fa_setup_help.yml5
-rw-r--r--changelogs/unreleased/dblessing_migrate_delayed_project_removal.yml5
-rw-r--r--changelogs/unreleased/default-enabled-api_always_use_application_json.yml5
-rw-r--r--changelogs/unreleased/denys-fj-ide-routes.yml5
-rw-r--r--changelogs/unreleased/design-management-minor-fixe.yml5
-rw-r--r--changelogs/unreleased/dictionary-md-generated-links.yml5
-rw-r--r--changelogs/unreleased/document-propagate-correlation-id-for-pages.yml5
-rw-r--r--changelogs/unreleased/dora-metrics-modeling.yml5
-rw-r--r--changelogs/unreleased/dry-up-notes-build-service-spec.yml5
-rw-r--r--changelogs/unreleased/dz-fix-fork-thumbnail-height.yml5
-rw-r--r--changelogs/unreleased/ellipsis-expand-state-commits.yml5
-rw-r--r--changelogs/unreleased/emilyring-clustertoken-name.yml5
-rw-r--r--changelogs/unreleased/enable-trace_memory_allocations.yml5
-rw-r--r--changelogs/unreleased/environment-scoped-group-variables.yml5
-rw-r--r--changelogs/unreleased/environment-tier.yml5
-rw-r--r--changelogs/unreleased/epic_count_query.yml6
-rw-r--r--changelogs/unreleased/expand-stopped-env.yml5
-rw-r--r--changelogs/unreleased/expose-failure-reasons-features.yml5
-rw-r--r--changelogs/unreleased/expose_project_container_registry_url.yml5
-rw-r--r--changelogs/unreleased/feat-api-application-settings-package-file-size-limits.yml5
-rw-r--r--changelogs/unreleased/feat-auto-enable-admin-mode-rake-runtime.yml5
-rw-r--r--changelogs/unreleased/feature-230726-repo-tabs.yml5
-rw-r--r--changelogs/unreleased/feature-gb-improve-builds-queueing.yml5
-rw-r--r--changelogs/unreleased/fix-edited-timestamp.yml5
-rw-r--r--changelogs/unreleased/fix-include-external-users-in-user-search.yml5
-rw-r--r--changelogs/unreleased/fix-iteration-migr.yml5
-rw-r--r--changelogs/unreleased/fix-locked-job-artifacts-expired-api.yml5
-rw-r--r--changelogs/unreleased/fix-overflowing-width-at-mention-selector.yml5
-rw-r--r--changelogs/unreleased/fix-project-import-visibility-error.yml5
-rw-r--r--changelogs/unreleased/fix-relative-position-on-move-and-copy-issue.yml5
-rw-r--r--changelogs/unreleased/fix-web-url-jira.yml5
-rw-r--r--changelogs/unreleased/fix_repo_storage_weights_admin.yml5
-rw-r--r--changelogs/unreleased/fp-reduce-queries-when-ticking-runner-queue.yml5
-rw-r--r--changelogs/unreleased/fp-reduce-runners-queries-when-picking-builds.yml5
-rw-r--r--changelogs/unreleased/georgekoltsov-bulk-import-migrate-milestones.yml5
-rw-r--r--changelogs/unreleased/georgekoltsov-fix-project-export-web-rate-limit.yml5
-rw-r--r--changelogs/unreleased/gl-badge-runners.yml5
-rw-r--r--changelogs/unreleased/gl-button-apply-template.yml5
-rw-r--r--changelogs/unreleased/gl-button-audit-events.yml5
-rw-r--r--changelogs/unreleased/gl-button-email-request.yml5
-rw-r--r--changelogs/unreleased/gl-button-gh-import.yml5
-rw-r--r--changelogs/unreleased/gl-button-labels.yml5
-rw-r--r--changelogs/unreleased/gl-button-reaction.yml5
-rw-r--r--changelogs/unreleased/gl-button-repository-settings.yml5
-rw-r--r--changelogs/unreleased/gl-button-time-tracking.yml5
-rw-r--r--changelogs/unreleased/hchouraria-notify-email-html-link-to-mr-on-top.yml5
-rw-r--r--changelogs/unreleased/id-move-delete-branch-to-workers.yml5
-rw-r--r--changelogs/unreleased/ignore-unstable-changelog-tags.yml5
-rw-r--r--changelogs/unreleased/improve-retarget-merge-requests.yml5
-rw-r--r--changelogs/unreleased/improve_vuln_tracking-backend_store_only.yml5
-rw-r--r--changelogs/unreleased/issue_227753-remove_backup_labels_table.yml5
-rw-r--r--changelogs/unreleased/iterations-dates-validations.yml5
-rw-r--r--changelogs/unreleased/iterations-in-the-past.yml5
-rw-r--r--changelogs/unreleased/jira-connect-app-style-cleanup.yml5
-rw-r--r--changelogs/unreleased/jivanvl-add-duration-finished-at-fields-job-type.yml5
-rw-r--r--changelogs/unreleased/john_long-composer-package-relative-url.yml5
-rw-r--r--changelogs/unreleased/kassio-bulkimports-better-destination-validation-error-message.yml5
-rw-r--r--changelogs/unreleased/kassio-bulkimports-filter-group-labels.yml5
-rw-r--r--changelogs/unreleased/kassio-bulkimports-import-group-label-timestamps.yml5
-rw-r--r--changelogs/unreleased/kassio-githubimporter-avoid-approval-exception.yml5
-rw-r--r--changelogs/unreleased/kassio-githubimporter-import-merged-at.yml5
-rw-r--r--changelogs/unreleased/kassio-githubimporter-validate-repository-size.yml5
-rw-r--r--changelogs/unreleased/kassio-graphql-expose-label-create-at-updated-at.yml5
-rw-r--r--changelogs/unreleased/kerrizor-remove-oprhaned-feature-flag-yml.yml5
-rw-r--r--changelogs/unreleased/kp-sort-milestone-autocomplete.yml5
-rw-r--r--changelogs/unreleased/ld-graphql-version-bump-gem-for-argument-deprecations.yml7
-rw-r--r--changelogs/unreleased/ld-handle-gids-for-unknown-objects.yml5
-rw-r--r--changelogs/unreleased/leipert-remove-chrome-84-workaround.yml5
-rw-r--r--changelogs/unreleased/lm-add-short-sha-and-path-to-pipeline.yml5
-rw-r--r--changelogs/unreleased/lm-multiple-cache-per-file.yml5
-rw-r--r--changelogs/unreleased/mc-backstage-reschedule-artifact-expiry-backfill.yml5
-rw-r--r--changelogs/unreleased/mc-bug-reduce-ci-minute-namespace-notification-db-load.yml5
-rw-r--r--changelogs/unreleased/mc-bug-remove-reliance-on-branch-context.yml5
-rw-r--r--changelogs/unreleased/mc-feature-add-user-callout-graphql.yml5
-rw-r--r--changelogs/unreleased/mf-test-report-parsing-errors-frontend.yml5
-rw-r--r--changelogs/unreleased/mg-fix-firefox-textarea-styling.yml5
-rw-r--r--changelogs/unreleased/mo-enable-cq-comparision-backend.yml5
-rw-r--r--changelogs/unreleased/mo-filter-group-projects-by-ids-graphql.yml5
-rw-r--r--changelogs/unreleased/mo-refactor-coverage-finder.yml5
-rw-r--r--changelogs/unreleased/move-cancel-btn-integrations.yml5
-rw-r--r--changelogs/unreleased/move_ci_config_path_project_variable.yml5
-rw-r--r--changelogs/unreleased/mvanremmerden-master-patch-70791.yml5
-rw-r--r--changelogs/unreleased/mwps-settings.yml5
-rw-r--r--changelogs/unreleased/nakayoshi-default-enabled.yml5
-rw-r--r--changelogs/unreleased/nfriend-add-release-asset-link-create-mutation.yml5
-rw-r--r--changelogs/unreleased/nfriend-allow-release-creation-on-existing-tag-through-ui.yml5
-rw-r--r--changelogs/unreleased/nfriend-fix-gl-dropdown-double-scrollbars.yml5
-rw-r--r--changelogs/unreleased/nfriend-fix-milestone-combobox-double-scrollbar.yml5
-rw-r--r--changelogs/unreleased/nfriend-fix-ref-selector-double-dropdown.yml5
-rw-r--r--changelogs/unreleased/nfriend-ref-selector-dropdown-cleanup.yml5
-rw-r--r--changelogs/unreleased/nfriend-turn-off-ref-selector-autocomplete.yml5
-rw-r--r--changelogs/unreleased/nicolasdular-record-issue-creation-onboarding-progress.yml5
-rw-r--r--changelogs/unreleased/ntepluhina-fix-design-management-reply-placeholder.yml5
-rw-r--r--changelogs/unreleased/pb-store-bare-class-name-for-batched-migrations.yml6
-rw-r--r--changelogs/unreleased/pb-track-background-job-executions.yml5
-rw-r--r--changelogs/unreleased/peterhegman-remove-vue_project_members_list-feature-flag.yml5
-rw-r--r--changelogs/unreleased/ph-282476-fixGraphQLDiffComments.yml5
-rw-r--r--changelogs/unreleased/ph-284212-moveCodeownersTipToVueApp.yml5
-rw-r--r--changelogs/unreleased/ph-defaultEnableWidgetGraphqlFlag.yml5
-rw-r--r--changelogs/unreleased/philipcunningham-add-branch-to-dast-profile-322526.yml5
-rw-r--r--changelogs/unreleased/pipeline-editor-branch-param.yml5
-rw-r--r--changelogs/unreleased/pipeline-editor-empty-state.yml5
-rw-r--r--changelogs/unreleased/pks-checks-skip-integrity-lfs-deletions.yml5
-rw-r--r--changelogs/unreleased/preload-environments-for-ci-cd-variables.yml5
-rw-r--r--changelogs/unreleased/preload-runner-tags.yml5
-rw-r--r--changelogs/unreleased/ps-fix-heading-style-email-diffs.yml5
-rw-r--r--changelogs/unreleased/psi-boards-scrollbar.yml5
-rw-r--r--changelogs/unreleased/qmnguyen0711-825-limit-the-size-of-sidekiq-jobs.yml5
-rw-r--r--changelogs/unreleased/qmnguyen0711-846-sentry-merge-sentry-s-contexts-and-users-into-applicatio.yml5
-rw-r--r--changelogs/unreleased/qmnguyen0711-remove-latest-report-results-preloading.yml5
-rw-r--r--changelogs/unreleased/reenable-sentry-pipeline-graph-only.yml5
-rw-r--r--changelogs/unreleased/refactor-use-policies-framework-for-admin.yml5
-rw-r--r--changelogs/unreleased/relax-changelog-tag-restriction.yml5
-rw-r--r--changelogs/unreleased/remove-bootstrap-dropdowns-from-note-components.yml6
-rw-r--r--changelogs/unreleased/remove-ci_jwt_include_environment-feature-flag.yml5
-rw-r--r--changelogs/unreleased/remove-commit-paginate-ff.yml5
-rw-r--r--changelogs/unreleased/remove-deprecated-columns.yml5
-rw-r--r--changelogs/unreleased/remove-index-add-index.yml5
-rw-r--r--changelogs/unreleased/remove-margin-status.yml5
-rw-r--r--changelogs/unreleased/remove-merge-request-count-with-merged-at-ff.yml5
-rw-r--r--changelogs/unreleased/remove-new_jira_connect_ui-feature-flag.yml5
-rw-r--r--changelogs/unreleased/remove-pipeline-editor-section-feature-flag.yml5
-rw-r--r--changelogs/unreleased/remove-pkg-event-redis-feature-flag.yml5
-rw-r--r--changelogs/unreleased/remove-scroll-merge-instruction.yml5
-rw-r--r--changelogs/unreleased/remove-transactionless-destroy-feature-flag.yml5
-rw-r--r--changelogs/unreleased/rename-vuln-fingerprint-indexes.yml5
-rw-r--r--changelogs/unreleased/revert_sort_order_explore_projects.yml5
-rw-r--r--changelogs/unreleased/runners-api-context-metadata.yml5
-rw-r--r--changelogs/unreleased/sanddown.yml5
-rw-r--r--changelogs/unreleased/security-jv-workhorse-router.yml5
-rw-r--r--changelogs/unreleased/security-workhorse-validate-path-logging-removal.yml5
-rw-r--r--changelogs/unreleased/selected-state-commit-view.yml5
-rw-r--r--changelogs/unreleased/sh-add-path-lock-confirmation.yml5
-rw-r--r--changelogs/unreleased/sh-azure-ad-v2-omniauth.yml5
-rw-r--r--changelogs/unreleased/sh-azure-blob-utf8-fix.yml5
-rw-r--r--changelogs/unreleased/sh-improve-api-marginalia-comments.yml5
-rw-r--r--changelogs/unreleased/sh-log-large-multipart-files-com.yml5
-rw-r--r--changelogs/unreleased/sh-update-batchloader-2-0-0.yml5
-rw-r--r--changelogs/unreleased/sh-update-fog-aws-3-9.yml5
-rw-r--r--changelogs/unreleased/sh-use-gitlab-fog-google.yml5
-rw-r--r--changelogs/unreleased/show-nested-env.yml5
-rw-r--r--changelogs/unreleased/sidebar-user-avatar.yml5
-rw-r--r--changelogs/unreleased/simplify-notifications-dropdown.yml5
-rw-r--r--changelogs/unreleased/slack_service_usage_data.yml5
-rw-r--r--changelogs/unreleased/ssarka-master-patch-39936.yml5
-rw-r--r--changelogs/unreleased/switch-order-of-buttons-configure-feature-flag-modal.yml5
-rw-r--r--changelogs/unreleased/sy-add-end-date-to-rotations.yml5
-rw-r--r--changelogs/unreleased/sy-system-note-for-resolving-alert.yml5
-rw-r--r--changelogs/unreleased/sy-update-alert-title.yml5
-rw-r--r--changelogs/unreleased/sy-update-operations-visibility-text.yml6
-rw-r--r--changelogs/unreleased/tc-add-custom-emoji-creator.yml5
-rw-r--r--changelogs/unreleased/test_update_merge_request_worker_performance_2.yml5
-rw-r--r--changelogs/unreleased/test_update_merge_request_worker_performance_3.yml5
-rw-r--r--changelogs/unreleased/tor-defect-file-viewed-reviews-convert-to-vuex.yml5
-rw-r--r--changelogs/unreleased/tor-defect-missing-popovers-from-async-DOM.yml6
-rw-r--r--changelogs/unreleased/tor-defect-mr-cog-checkboxes.yml5
-rw-r--r--changelogs/unreleased/tor-defect-network-error-message-show-api-errors.yml5
-rw-r--r--changelogs/unreleased/tor-defect-out-of-place-bold-label-in-diffs-dropdown-menu.yml5
-rw-r--r--changelogs/unreleased/trial-button-confirm.yml5
-rw-r--r--changelogs/unreleased/update-ci-template-default-branch-1.yml5
-rw-r--r--changelogs/unreleased/update-ci-template-default-branch-3.yml5
-rw-r--r--changelogs/unreleased/update-cicd-naming.yml5
-rw-r--r--changelogs/unreleased/update-gitlab-runner-helm-chart-to-0-26-0.yml5
-rw-r--r--changelogs/unreleased/update-mr-page-buttons.yml5
-rw-r--r--changelogs/unreleased/update-terraform-states-user-foreign-key.yml5
-rw-r--r--changelogs/unreleased/update-validate-url-gem.yml5
-rw-r--r--changelogs/unreleased/update_latex_template.yml5
-rw-r--r--changelogs/unreleased/usage-ping-dictionary-whitespace.yml5
-rw-r--r--changelogs/unreleased/user-access-role-badge-component.yml5
-rw-r--r--changelogs/unreleased/user-auth-bmiller-return-early-if-user-is-nil.yml5
-rw-r--r--changelogs/unreleased/uusijani-gitlab-uusijani-master-patch-65195.yml5
-rw-r--r--changelogs/unreleased/vs-break-long-code-line-in-markdown.yml5
-rw-r--r--changelogs/unreleased/vs-enable-gitlab-stylelint-config.yml5
-rw-r--r--changelogs/unreleased/vs-wrap-code-lines-blocks-properly.yml5
-rw-r--r--changelogs/unreleased/x509-cert-loading.yml5
-rw-r--r--changelogs/unreleased/xanf-allow-top-level-bulk-imports.yml5
-rw-r--r--changelogs/unreleased/yo-btn-confirm-shared-issuable.yml5
-rw-r--r--changelogs/unreleased/yo-btn-confirm-shared-labels.yml5
-rw-r--r--config/application.rb5
-rw-r--r--config/feature_categories.yml7
-rw-r--r--config/feature_flags/development/allow_force_push_to_protected_branches.yml8
-rw-r--r--config/feature_flags/development/api_always_use_application_json.yml2
-rw-r--r--config/feature_flags/development/application_settings_tokens_optional_encryption.yml6
-rw-r--r--config/feature_flags/development/attachment_with_filename.yml8
-rw-r--r--config/feature_flags/development/auto_devops_banner_disabled.yml2
-rw-r--r--config/feature_flags/development/avatar_cache_for_email.yml8
-rw-r--r--config/feature_flags/development/boards_filtered_search.yml8
-rw-r--r--config/feature_flags/development/chatops.yml6
-rw-r--r--config/feature_flags/development/ci_fix_commit_status_retried.yml8
-rw-r--r--config/feature_flags/development/ci_fix_pipeline_status_for_dag_needs_manual.yml8
-rw-r--r--config/feature_flags/development/ci_jwt_include_environment.yml8
-rw-r--r--config/feature_flags/development/ci_mini_pipeline_gl_dropdown.yml8
-rw-r--r--config/feature_flags/development/ci_pipeline_editor_page.yml8
-rw-r--r--config/feature_flags/development/ci_preload_runner_tags.yml8
-rw-r--r--config/feature_flags/development/ci_reduce_queries_when_ticking_runner_queue.yml8
-rw-r--r--config/feature_flags/development/ci_register_job_service_one_by_one.yml8
-rw-r--r--config/feature_flags/development/ci_register_job_temporary_lock.yml8
-rw-r--r--config/feature_flags/development/ci_remove_update_retried_from_process_pipeline.yml8
-rw-r--r--config/feature_flags/development/ci_rules_variables.yml8
-rw-r--r--config/feature_flags/development/ci_runners_short_circuit_assignable_for.yml8
-rw-r--r--config/feature_flags/development/ci_trigger_payload_into_pipeline.yml2
-rw-r--r--config/feature_flags/development/clear_status_with_quick_options.yml8
-rw-r--r--config/feature_flags/development/codequality_backend_comparison.yml2
-rw-r--r--config/feature_flags/development/collect_package_events_redis.yml7
-rw-r--r--config/feature_flags/development/compare_repo_dropdown.yml8
-rw-r--r--config/feature_flags/development/coverage_data_new_finder.yml8
-rw-r--r--config/feature_flags/development/customize_homepage.yml8
-rw-r--r--config/feature_flags/development/dashboard_pipeline_status.yml8
-rw-r--r--config/feature_flags/development/design_management_allow_dangerous_images.yml2
-rw-r--r--config/feature_flags/development/dora_daily_metrics.yml8
-rw-r--r--config/feature_flags/development/environment_tier.yml8
-rw-r--r--config/feature_flags/development/fork_project_form.yml8
-rw-r--r--config/feature_flags/development/gitlab_ci_builds_queue_limit.yml8
-rw-r--r--config/feature_flags/development/gitlab_ci_builds_queuing_metrics.yml8
-rw-r--r--config/feature_flags/development/graphql_logging.yml8
-rw-r--r--config/feature_flags/development/group_devops_adoption.yml8
-rw-r--r--config/feature_flags/development/groups_tokens_optional_encryption.yml6
-rw-r--r--config/feature_flags/development/improved_emoji_picker.yml8
-rw-r--r--config/feature_flags/development/improved_merge_diff_highlighting.yml8
-rw-r--r--config/feature_flags/development/inherited_issuable_templates.yml8
-rw-r--r--config/feature_flags/development/instance_statistics.yml8
-rw-r--r--config/feature_flags/development/introduce_marker_ranges.yml8
-rw-r--r--config/feature_flags/development/issue_email_participants.yml8
-rw-r--r--config/feature_flags/development/json_wrapper_legacy_mode.yml6
-rw-r--r--config/feature_flags/development/merge_request_widget_graphql.yml2
-rw-r--r--config/feature_flags/development/migrate_delayed_project_removal.yml8
-rw-r--r--config/feature_flags/development/multiple_cache_per_job.yml8
-rw-r--r--config/feature_flags/development/multiple_http_integrations_custom_mapping.yml8
-rw-r--r--config/feature_flags/development/new_jira_connect_ui.yml8
-rw-r--r--config/feature_flags/development/new_pipelines_table.yml8
-rw-r--r--config/feature_flags/development/new_route_ci_minutes_purchase.yml8
-rw-r--r--config/feature_flags/development/notes_create_service_tracking.yml6
-rw-r--r--config/feature_flags/development/optimized_merge_request_count_with_merged_at_filter.yml8
-rw-r--r--config/feature_flags/development/or_issuable_queries.yml8
-rw-r--r--config/feature_flags/development/pages_serve_from_deployments.yml8
-rw-r--r--config/feature_flags/development/pages_serve_from_migrated_zip.yml2
-rw-r--r--config/feature_flags/development/pages_serve_with_zip_file_protocol.yml2
-rw-r--r--config/feature_flags/development/pages_use_legacy_storage_lease.yml8
-rw-r--r--config/feature_flags/development/paginate_commit_view.yml8
-rw-r--r--config/feature_flags/development/personal_access_tokens_scoped_to_projects.yml8
-rw-r--r--config/feature_flags/development/pipeline_editor_empty_state_action.yml8
-rw-r--r--config/feature_flags/development/pipeline_status_for_pipeline_editor.yml8
-rw-r--r--config/feature_flags/development/pipelines_security_report_summary.yml8
-rw-r--r--config/feature_flags/development/product_intelligence_metrics_names_suggestions.yml8
-rw-r--r--config/feature_flags/development/project_statistics_sync.yml6
-rw-r--r--config/feature_flags/development/project_transactionless_destroy.yml8
-rw-r--r--config/feature_flags/development/projects_tokens_optional_encryption.yml6
-rw-r--r--config/feature_flags/development/query_deploymenys_via_finished_at_in_vsa.yml8
-rw-r--r--config/feature_flags/development/recursive_approach_for_all_projects.yml8
-rw-r--r--config/feature_flags/development/recursive_namespace_lookup_as_inner_join.yml8
-rw-r--r--config/feature_flags/development/remove_comment_close_reopen.yml8
-rw-r--r--config/feature_flags/development/retarget_merge_requests.yml2
-rw-r--r--config/feature_flags/development/saas_add_seats_button.yml8
-rw-r--r--config/feature_flags/development/saml_group_links.yml8
-rw-r--r--config/feature_flags/development/scoped_group_variables.yml8
-rw-r--r--config/feature_flags/development/security_on_demand_scans_site_validation.yml8
-rw-r--r--config/feature_flags/development/security_orchestration_policies_configuration.yml8
-rw-r--r--config/feature_flags/development/shared_group_membership_auth.yml8
-rw-r--r--config/feature_flags/development/skip_dag_manual_and_delayed_jobs.yml2
-rw-r--r--config/feature_flags/development/suggestions_custom_commit.yml8
-rw-r--r--config/feature_flags/development/trace_memory_allocations.yml2
-rw-r--r--config/feature_flags/development/usage_data_code_review_aggregation.yml8
-rw-r--r--config/feature_flags/development/usage_data_design_action.yml2
-rw-r--r--config/feature_flags/development/usage_data_i_analytics_cohorts.yml8
-rw-r--r--config/feature_flags/development/usage_data_i_code_review_user_assignees_changed.yml8
-rw-r--r--config/feature_flags/development/usage_data_i_code_review_user_labels_changed.yml8
-rw-r--r--config/feature_flags/development/usage_data_i_code_review_user_milestone_changed.yml8
-rw-r--r--config/feature_flags/development/usage_data_i_code_review_user_mr_discussion_locked.yml8
-rw-r--r--config/feature_flags/development/usage_data_i_code_review_user_mr_discussion_unlocked.yml8
-rw-r--r--config/feature_flags/development/usage_data_i_code_review_user_reviewers_changed.yml8
-rw-r--r--config/feature_flags/development/usage_data_i_code_review_user_time_estimate_changed.yml8
-rw-r--r--config/feature_flags/development/usage_data_i_code_review_user_time_spent_changed.yml8
-rw-r--r--config/feature_flags/development/usage_data_i_source_code_code_intelligence.yml8
-rw-r--r--config/feature_flags/development/usage_data_o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile.yml8
-rw-r--r--config/feature_flags/development/usage_data_track_ecosystem_slack_service.yml8
-rw-r--r--config/feature_flags/development/usage_data_track_quickactions.yml4
-rw-r--r--config/feature_flags/development/validate_namespace_parent_type.yml8
-rw-r--r--config/feature_flags/development/vue_notification_dropdown.yml8
-rw-r--r--config/feature_flags/development/vue_project_members_list.yml8
-rw-r--r--config/feature_flags/experiment/ci_syntax_templates_b_experiment_percentage.yml8
-rw-r--r--config/feature_flags/experiment/ci_syntax_templates_experiment_percentage.yml8
-rw-r--r--config/feature_flags/experiment/customize_homepage_experiment_percentage.yml8
-rw-r--r--config/feature_flags/experiment/empty_repo_upload.yml8
-rw-r--r--config/feature_flags/experiment/invite_members_version_a_experiment_percentage.yml8
-rw-r--r--config/feature_flags/experiment/repo_integrations_link.yml8
-rw-r--r--config/feature_flags/ops/marginalia.yml8
-rw-r--r--config/gitlab.yml.example9
-rw-r--r--config/helpers/incremental_webpack_compiler.js3
-rw-r--r--config/helpers/is_eslint.js2
-rw-r--r--config/helpers/vendor_dll_hash.js2
-rw-r--r--config/initializers/0_marginalia.rb15
-rw-r--r--config/initializers/1_settings.rb15
-rw-r--r--config/initializers/doorkeeper.rb6
-rw-r--r--config/initializers/gitlab_experiment.rb4
-rw-r--r--config/initializers/postgres_partitioning.rb1
-rw-r--r--config/initializers/rack_multipart_patch.rb44
-rw-r--r--config/initializers/rails_host_authorization.rb5
-rw-r--r--config/initializers/validate_puma.rb4
-rw-r--r--config/initializers_before_autoloader/000_inflections.rb1
-rw-r--r--config/initializers_before_autoloader/003_gc_compact.rb21
-rw-r--r--config/karma.config.js19
-rw-r--r--config/metrics/counts_28d/20210201124930_deployments.yml2
-rw-r--r--config/metrics/counts_28d/20210216174910_analytics_unique_visits_for_any_target_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216174914_g_analytics_contribution_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216174918_g_analytics_insights_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216174921_g_analytics_issues_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216174926_g_analytics_productivity_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216174929_g_analytics_valuestream_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216174933_p_analytics_pipelines_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216174937_p_analytics_code_reviews_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216174941_p_analytics_valuestream_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216174945_p_analytics_insights_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216174949_p_analytics_issues_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216174953_p_analytics_repo_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216174956_i_analytics_cohorts_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216175000_i_analytics_dev_ops_score_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216175004_g_analytics_merge_request_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216175008_p_analytics_merge_request_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216175012_i_analytics_instance_statistics_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216175016_analytics_total_unique_counts_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216175055_merge_requests.yml16
-rw-r--r--config/metrics/counts_28d/20210216175057_projects_with_disable_overriding_approvers_per_merge_request.yml17
-rw-r--r--config/metrics/counts_28d/20210216175059_projects_without_disable_overriding_approvers_per_merge_request.yml17
-rw-r--r--config/metrics/counts_28d/20210216175101_merge_requests_users.yml16
-rw-r--r--config/metrics/counts_28d/20210216175109_suggestions.yml16
-rw-r--r--config/metrics/counts_28d/20210216175113_merge_request_action_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216175117_i_source_code_code_intelligence_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216175120_i_code_review_mr_diffs_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216175124_i_code_review_user_single_file_diffs_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216175128_i_code_review_mr_single_file_diffs_monthly.yml17
-rw-r--r--config/metrics/counts_28d/20210216175132_i_code_review_user_create_mr_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216175136_i_code_review_user_close_mr_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216175140_i_code_review_user_reopen_mr_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216175144_i_code_review_user_merge_mr_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216175148_i_code_review_user_create_mr_comment_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216175152_i_code_review_user_edit_mr_comment_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216175156_i_code_review_user_remove_mr_comment_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216175159_i_code_review_user_add_suggestion_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216175203_i_code_review_user_apply_suggestion_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216175405_clusters_applications_cert_managers.yml19
-rw-r--r--config/metrics/counts_28d/20210216175407_clusters_applications_helm.yml19
-rw-r--r--config/metrics/counts_28d/20210216175409_clusters_applications_ingress.yml19
-rw-r--r--config/metrics/counts_28d/20210216175411_clusters_applications_knative.yml19
-rw-r--r--config/metrics/counts_28d/20210216175413_clusters_management_project.yml19
-rw-r--r--config/metrics/counts_28d/20210216175415_clusters_disabled.yml19
-rw-r--r--config/metrics/counts_28d/20210216175417_clusters_enabled.yml19
-rw-r--r--config/metrics/counts_28d/20210216175419_clusters_platforms_gke.yml19
-rw-r--r--config/metrics/counts_28d/20210216175420_clusters_platforms_eks.yml19
-rw-r--r--config/metrics/counts_28d/20210216175422_clusters_platforms_user.yml19
-rw-r--r--config/metrics/counts_28d/20210216175424_instance_clusters_disabled.yml19
-rw-r--r--config/metrics/counts_28d/20210216175426_instance_clusters_enabled.yml19
-rw-r--r--config/metrics/counts_28d/20210216175428_group_clusters_disabled.yml19
-rw-r--r--config/metrics/counts_28d/20210216175430_group_clusters_enabled.yml19
-rw-r--r--config/metrics/counts_28d/20210216175432_project_clusters_disabled.yml19
-rw-r--r--config/metrics/counts_28d/20210216175434_project_clusters_enabled.yml19
-rw-r--r--config/metrics/counts_28d/20210216175542_ci_builds.yml16
-rw-r--r--config/metrics/counts_28d/20210216175544_ci_external_pipelines.yml16
-rw-r--r--config/metrics/counts_28d/20210216175546_ci_internal_pipelines.yml16
-rw-r--r--config/metrics/counts_28d/20210216175548_ci_pipeline_config_auto_devops.yml16
-rw-r--r--config/metrics/counts_28d/20210216175550_ci_pipeline_config_repository.yml16
-rw-r--r--config/metrics/counts_28d/20210216175552_ci_pipeline_schedules.yml16
-rw-r--r--config/metrics/counts_28d/20210216175554_ci_pipelines.yml17
-rw-r--r--config/metrics/counts_28d/20210216175556_ci_triggers.yml19
-rw-r--r--config/metrics/counts_28d/20210216175616_user_dast_jobs.yml16
-rw-r--r--config/metrics/counts_28d/20210216175618_dast_pipeline.yml16
-rw-r--r--config/metrics/counts_28d/20210216180308_personal_snippets.yml19
-rw-r--r--config/metrics/counts_28d/20210216180310_project_snippets.yml19
-rw-r--r--config/metrics/counts_28d/20210216180312_snippets.yml19
-rw-r--r--config/metrics/counts_28d/20210216180317_snippets.yml19
-rw-r--r--config/metrics/counts_28d/20210216180319_action_monthly_active_users_web_ide_edit.yml16
-rw-r--r--config/metrics/counts_28d/20210216180321_action_monthly_active_users_sfe_edit.yml16
-rw-r--r--config/metrics/counts_28d/20210216180323_action_monthly_active_users_snippet_editor_edit.yml16
-rw-r--r--config/metrics/counts_28d/20210216180325_action_monthly_active_users_sse_edit.yml16
-rw-r--r--config/metrics/counts_28d/20210216180327_action_monthly_active_users_ide_edit.yml16
-rw-r--r--config/metrics/counts_28d/20210216180330_g_edit_by_web_ide_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216180334_g_edit_by_sfe_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216180338_g_edit_by_snippet_ide_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216180341_ide_edit_total_unique_counts_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216180355_user_api_fuzzing_jobs.yml16
-rw-r--r--config/metrics/counts_28d/20210216180357_user_api_fuzzing_dnd_jobs.yml16
-rw-r--r--config/metrics/counts_28d/20210216180424_i_search_total_monthly.yml18
-rw-r--r--config/metrics/counts_28d/20210216180431_search_total_unique_counts_monthly.yml18
-rw-r--r--config/metrics/counts_28d/20210216180509_incident_management_alerts_total_unique_counts.yml16
-rw-r--r--config/metrics/counts_28d/20210216180511_incident_management_incidents_total_unique_counts.yml16
-rw-r--r--config/metrics/counts_28d/20210216180524_projects_with_incidents.yml16
-rw-r--r--config/metrics/counts_28d/20210216180526_projects_with_alert_incidents.yml17
-rw-r--r--config/metrics/counts_28d/20210216180530_incident_management_alert_status_changed_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216180533_incident_management_alert_assigned_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216180537_incident_management_alert_todo_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216180541_incident_management_incident_created_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216180545_incident_management_incident_reopened_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216180548_incident_management_incident_closed_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216180552_incident_management_incident_assigned_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216180556_incident_management_incident_todo_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216180559_incident_management_incident_comment_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216180607_incident_management_incident_published_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216180611_incident_management_incident_relate_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216180614_incident_management_incident_unrelate_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216180618_incident_management_incident_change_confidential_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216180622_incident_management_total_unique_counts_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216180625_incident_management_alert_create_incident_monthly.yml17
-rw-r--r--config/metrics/counts_28d/20210216180731_projects_imported_from_github.yml16
-rw-r--r--config/metrics/counts_28d/20210216180745_action_monthly_active_users_design_management.yml16
-rw-r--r--config/metrics/counts_28d/20210216180747_action_monthly_active_users_wiki_repo.yml16
-rw-r--r--config/metrics/counts_28d/20210216180814_events.yml17
-rw-r--r--config/metrics/counts_28d/20210216180816_groups.yml16
-rw-r--r--config/metrics/counts_28d/20210216180818_users_created.yml17
-rw-r--r--config/metrics/counts_28d/20210216180820_ldap_keys.yml16
-rw-r--r--config/metrics/counts_28d/20210216180822_ldap_users.yml16
-rw-r--r--config/metrics/counts_28d/20210216180955_projects_with_prometheus_alerts.yml16
-rw-r--r--config/metrics/counts_28d/20210216180956_clusters.yml16
-rw-r--r--config/metrics/counts_28d/20210216180958_clusters_applications_prometheus.yml16
-rw-r--r--config/metrics/counts_28d/20210216181000_operations_dashboard_default_dashboard.yml16
-rw-r--r--config/metrics/counts_28d/20210216181002_projects_with_tracing_enabled.yml16
-rw-r--r--config/metrics/counts_28d/20210216181004_projects_with_error_tracking_enabled.yml16
-rw-r--r--config/metrics/counts_28d/20210216181006_operations_dashboard_users_with_projects_added.yml16
-rw-r--r--config/metrics/counts_28d/20210216181050_packages.yml16
-rw-r--r--config/metrics/counts_28d/20210216181057_projects_with_packages.yml16
-rw-r--r--config/metrics/counts_28d/20210216181139_issues.yml16
-rw-r--r--config/metrics/counts_28d/20210216181141_notes.yml16
-rw-r--r--config/metrics/counts_28d/20210216181143_projects.yml16
-rw-r--r--config/metrics/counts_28d/20210216181145_todos.yml16
-rw-r--r--config/metrics/counts_28d/20210216181147_service_desk_enabled_projects.yml17
-rw-r--r--config/metrics/counts_28d/20210216181148_service_desk_issues.yml17
-rw-r--r--config/metrics/counts_28d/20210216181150_projects_jira_active.yml16
-rw-r--r--config/metrics/counts_28d/20210216181152_projects_jira_dvcs_cloud_active.yml16
-rw-r--r--config/metrics/counts_28d/20210216181154_projects_jira_dvcs_server_active.yml16
-rw-r--r--config/metrics/counts_28d/20210216181158_epics.yml16
-rw-r--r--config/metrics/counts_28d/20210216181200_label_lists.yml16
-rw-r--r--config/metrics/counts_28d/20210216181201_milestone_lists.yml16
-rw-r--r--config/metrics/counts_28d/20210216181304_g_project_management_issue_title_changed_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181308_g_project_management_issue_description_changed_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181315_g_project_management_issue_made_confidential_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181319_g_project_management_issue_made_visible_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181323_g_project_management_issue_created_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181326_g_project_management_issue_closed_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181330_g_project_management_issue_reopened_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181334_g_project_management_issue_label_changed_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181337_g_project_management_issue_milestone_changed_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181341_g_project_management_issue_iteration_changed_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181345_g_project_management_issue_weight_changed_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181348_g_project_management_issue_cross_referenced_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181352_g_project_management_issue_moved_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181356_g_project_management_issue_related_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181400_g_project_management_issue_unrelated_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181403_g_project_management_issue_marked_as_duplicate_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181407_g_project_management_issue_locked_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181411_g_project_management_issue_unlocked_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181414_g_project_management_issue_added_to_epic_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181416_g_project_management_issue_removed_from_epic_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181420_g_project_management_issue_changed_epic_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181424_g_project_management_issue_designs_added_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181427_g_project_management_issue_designs_modified_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181431_g_project_management_issue_designs_removed_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181435_g_project_management_issue_due_date_changed_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181438_g_project_management_issue_time_estimate_changed_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181442_g_project_management_issue_time_spent_changed_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181446_g_project_management_issue_comment_added_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181450_g_project_management_issue_comment_edited_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181453_g_project_management_issue_comment_removed_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181457_g_project_management_issue_health_status_changed_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181501_g_project_management_issue_cloned_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181504_issues_edit_total_unique_counts_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181508_i_quickactions_approve_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181512_i_quickactions_assign_single_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181516_i_quickactions_assign_multiple_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181519_i_quickactions_assign_self_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181523_i_quickactions_assign_reviewer_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181527_i_quickactions_award_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181530_i_quickactions_board_move_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181534_i_quickactions_child_epic_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181538_i_quickactions_clear_weight_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181541_i_quickactions_clone_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181545_i_quickactions_close_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181549_i_quickactions_confidential_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181553_i_quickactions_copy_metadata_merge_request_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181556_i_quickactions_copy_metadata_issue_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181600_i_quickactions_create_merge_request_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181604_i_quickactions_done_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181607_i_quickactions_draft_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181611_i_quickactions_due_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181615_i_quickactions_duplicate_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181618_i_quickactions_epic_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181622_i_quickactions_estimate_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181626_i_quickactions_iteration_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181629_i_quickactions_label_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181633_i_quickactions_lock_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181637_i_quickactions_merge_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181641_i_quickactions_milestone_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181644_i_quickactions_move_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181648_i_quickactions_parent_epic_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181652_i_quickactions_promote_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181655_i_quickactions_publish_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181659_i_quickactions_reassign_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181703_i_quickactions_reassign_reviewer_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181707_i_quickactions_rebase_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181710_i_quickactions_relabel_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181714_i_quickactions_relate_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181718_i_quickactions_remove_child_epic_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181721_i_quickactions_remove_due_date_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181725_i_quickactions_remove_epic_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181729_i_quickactions_remove_estimate_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181732_i_quickactions_remove_iteration_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181736_i_quickactions_remove_milestone_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181740_i_quickactions_remove_parent_epic_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181744_i_quickactions_remove_time_spent_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181747_i_quickactions_remove_zoom_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181751_i_quickactions_reopen_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181755_i_quickactions_shrug_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181758_i_quickactions_spend_subtract_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181802_i_quickactions_spend_add_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181806_i_quickactions_submit_review_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181809_i_quickactions_subscribe_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181813_i_quickactions_tableflip_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181817_i_quickactions_tag_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181821_i_quickactions_target_branch_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181824_i_quickactions_title_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181828_i_quickactions_todo_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181832_i_quickactions_unassign_specific_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181835_i_quickactions_unassign_all_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181839_i_quickactions_unassign_reviewer_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181843_i_quickactions_unlabel_specific_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181846_i_quickactions_unlabel_all_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181850_i_quickactions_unlock_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181854_i_quickactions_unsubscribe_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181857_i_quickactions_weight_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181901_i_quickactions_wip_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181905_i_quickactions_zoom_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181923_successful_deployments.yml16
-rw-r--r--config/metrics/counts_28d/20210216181924_failed_deployments.yml16
-rw-r--r--config/metrics/counts_28d/20210216181935_deployments.yml16
-rw-r--r--config/metrics/counts_28d/20210216181937_failed_deployments.yml16
-rw-r--r--config/metrics/counts_28d/20210216181939_releases.yml16
-rw-r--r--config/metrics/counts_28d/20210216181941_successful_deployments.yml16
-rw-r--r--config/metrics/counts_28d/20210216181943_projects_mirrored_with_pipelines_enabled.yml16
-rw-r--r--config/metrics/counts_28d/20210216181951_clusters_applications_runner.yml19
-rw-r--r--config/metrics/counts_28d/20210216181956_user_unique_users_all_secure_scanners.yml16
-rw-r--r--config/metrics/counts_28d/20210216182034_deploy_keys.yml16
-rw-r--r--config/metrics/counts_28d/20210216182036_keys.yml16
-rw-r--r--config/metrics/counts_28d/20210216182038_remote_mirrors.yml16
-rw-r--r--config/metrics/counts_28d/20210216182040_action_monthly_active_users_project_repo.yml16
-rw-r--r--config/metrics/counts_28d/20210216182041_action_monthly_active_users_git_write.yml16
-rw-r--r--config/metrics/counts_28d/20210216182043_projects_enforcing_code_owner_approval.yml16
-rw-r--r--config/metrics/counts_28d/20210216182045_projects_with_sectional_code_owner_rules.yml16
-rw-r--r--config/metrics/counts_28d/20210216182049_projects_with_repositories_enabled.yml16
-rw-r--r--config/metrics/counts_28d/20210216182051_protected_branches.yml16
-rw-r--r--config/metrics/counts_28d/20210216182102_wiki_action_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216182106_design_action_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216182109_project_action_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216182125_user_sast_jobs.yml19
-rw-r--r--config/metrics/counts_28d/20210216182127_user_secret_detection_jobs.yml19
-rw-r--r--config/metrics/counts_28d/20210216182129_sast_pipeline.yml19
-rw-r--r--config/metrics/counts_28d/20210216182131_secret_detection_pipeline.yml19
-rw-r--r--config/metrics/counts_28d/20210216182136_i_testing_test_case_parsed_monthly.yml20
-rw-r--r--config/metrics/counts_28d/20210216182200_i_testing_metrics_report_artifact_uploaders_monthly.yml20
-rw-r--r--config/metrics/counts_28d/20210216182209_user_preferences_group_overview_security_dashboard.yml18
-rw-r--r--config/metrics/counts_28d/20210216183159_projects_with_alerts_created.yml16
-rw-r--r--config/metrics/counts_28d/20210216183201_compliance_features_track_unique_visits_union.yml16
-rw-r--r--config/metrics/counts_28d/20210216183203_product_analytics_test_metrics_union.yml16
-rw-r--r--config/metrics/counts_28d/20210216183205_product_analytics_test_metrics_intersection.yml16
-rw-r--r--config/metrics/counts_28d/20210216183209_i_testing_paid_monthly_active_user_total.yml16
-rw-r--r--config/metrics/counts_28d/20210216183613_total_number_of_path_locks.yml16
-rw-r--r--config/metrics/counts_28d/20210216183614_total_number_of_locked_files.yml16
-rw-r--r--config/metrics/counts_28d/20210216183618_approval_project_rules_with_more_approvers_than_required.yml16
-rw-r--r--config/metrics/counts_28d/20210216183620_approval_project_rules_with_less_approvers_than_required.yml16
-rw-r--r--config/metrics/counts_28d/20210216183622_approval_project_rules_with_exact_required_approvers.yml16
-rw-r--r--config/metrics/counts_28d/20210216183627_omniauth_providers.yml16
-rw-r--r--config/metrics/counts_28d/20210216183629_two-factor.yml16
-rw-r--r--config/metrics/counts_28d/20210216183631_two-factor-via-u2f-device.yml16
-rw-r--r--config/metrics/counts_28d/20210216183633_two-factor-via-webauthn-device.yml16
-rw-r--r--config/metrics/counts_28d/20210216183634_standard.yml16
-rw-r--r--config/metrics/counts_28d/20210216183636_google_oauth2.yml16
-rw-r--r--config/metrics/counts_28d/20210216183638_unique_users_all_imports.yml16
-rw-r--r--config/metrics/counts_28d/20210216183640_gitlab.yml16
-rw-r--r--config/metrics/counts_28d/20210216183642_gitlab_v1.yml16
-rw-r--r--config/metrics/counts_28d/20210216183644_gitlab_project.yml16
-rw-r--r--config/metrics/counts_28d/20210216183646_gitlab.yml16
-rw-r--r--config/metrics/counts_28d/20210216183648_github.yml16
-rw-r--r--config/metrics/counts_28d/20210216183650_bitbucket.yml16
-rw-r--r--config/metrics/counts_28d/20210216183652_bitbucket_server.yml16
-rw-r--r--config/metrics/counts_28d/20210216183653_gitea.yml16
-rw-r--r--config/metrics/counts_28d/20210216183655_git.yml16
-rw-r--r--config/metrics/counts_28d/20210216183657_manifest.yml16
-rw-r--r--config/metrics/counts_28d/20210216183659_gitlab_migration.yml16
-rw-r--r--config/metrics/counts_28d/20210216183701_jira.yml16
-rw-r--r--config/metrics/counts_28d/20210216183703_fogbugz.yml16
-rw-r--r--config/metrics/counts_28d/20210216183705_phabricator.yml16
-rw-r--r--config/metrics/counts_28d/20210216183707_csv.yml16
-rw-r--r--config/metrics/counts_28d/20210216183709_group_import.yml16
-rw-r--r--config/metrics/counts_28d/20210216183711_gitlab_migration.yml16
-rw-r--r--config/metrics/counts_28d/20210216183712_total.yml16
-rw-r--r--config/metrics/counts_28d/20210216183714_gitlab_project.yml16
-rw-r--r--config/metrics/counts_28d/20210216183716_gitlab.yml16
-rw-r--r--config/metrics/counts_28d/20210216183718_github.yml16
-rw-r--r--config/metrics/counts_28d/20210216183720_bitbucket.yml16
-rw-r--r--config/metrics/counts_28d/20210216183722_bitbucket_server.yml16
-rw-r--r--config/metrics/counts_28d/20210216183724_gitea.yml16
-rw-r--r--config/metrics/counts_28d/20210216183726_git.yml16
-rw-r--r--config/metrics/counts_28d/20210216183728_manifest.yml16
-rw-r--r--config/metrics/counts_28d/20210216183730_jira.yml16
-rw-r--r--config/metrics/counts_28d/20210216183731_fogbugz.yml16
-rw-r--r--config/metrics/counts_28d/20210216183733_phabricator.yml16
-rw-r--r--config/metrics/counts_28d/20210216183735_csv.yml16
-rw-r--r--config/metrics/counts_28d/20210216183737_groups_imported.yml16
-rw-r--r--config/metrics/counts_28d/20210216183753_projects_incident_sla_enabled.yml16
-rw-r--r--config/metrics/counts_28d/20210216183817_user_coverage_fuzzing_jobs.yml16
-rw-r--r--config/metrics/counts_28d/20210216183826_sast_scans.yml16
-rw-r--r--config/metrics/counts_28d/20210216183828_dependency_scanning_scans.yml16
-rw-r--r--config/metrics/counts_28d/20210216183830_container_scanning_scans.yml16
-rw-r--r--config/metrics/counts_28d/20210216183832_dast_scans.yml16
-rw-r--r--config/metrics/counts_28d/20210216183834_secret_detection_scans.yml16
-rw-r--r--config/metrics/counts_28d/20210216183836_coverage_fuzzing_scans.yml16
-rw-r--r--config/metrics/counts_28d/20210216183838_api_fuzzing_scans.yml16
-rw-r--r--config/metrics/counts_28d/20210216183916_compliance_unique_visits_for_any_target_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216183922_search_unique_visits_for_any_target_monthly.yml18
-rw-r--r--config/metrics/counts_28d/20210216183926_g_compliance_dashboard_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216183930_g_compliance_audit_events_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216183934_i_compliance_audit_events_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216183938_i_compliance_credential_inventory_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216183942_a_compliance_audit_events_api_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216183946_compliance_total_unique_counts_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184024_g_edit_by_sse_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184047_git_write_action_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184140_testing_total_unique_counts_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184251_i_ci_secrets_management_vault_build_created_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184255_i_snippets_show_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184259_p_terraform_state_api_unique_users_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184303_o_pipeline_authoring_unique_users_committing_ciconfigfile_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184312_i_code_review_user_toggled_task_item_status_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184322_i_code_review_user_approve_mr_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184326_i_code_review_user_unapprove_mr_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184330_i_code_review_user_resolve_thread_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184334_i_code_review_user_unresolve_thread_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184338_i_code_review_edit_mr_title_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184342_i_code_review_edit_mr_desc_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184353_i_code_review_user_create_review_note_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184357_i_code_review_user_publish_review_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184401_i_code_review_user_create_multiline_mr_comment_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184405_i_code_review_user_edit_multiline_mr_comment_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184409_i_code_review_user_remove_multiline_mr_comment_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184418_i_code_review_user_assigned_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184422_i_code_review_user_marked_as_draft_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184426_i_code_review_user_unmarked_as_draft_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184430_i_code_review_user_review_requested_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184434_i_code_review_user_approval_rule_added_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184438_i_code_review_user_approval_rule_deleted_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184442_i_code_review_user_approval_rule_edited_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184446_i_code_review_user_vs_code_api_request_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184450_i_code_review_user_create_mr_from_issue_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184454_code_review_total_unique_counts_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184458_p_ci_templates_implicit_auto_devops_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184502_p_ci_templates_implicit_auto_devops_build_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184506_p_ci_templates_implicit_auto_devops_deploy_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184510_p_ci_templates_implicit_security_sast_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184513_p_ci_templates_implicit_security_secret_detection_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184517_p_ci_templates_5_min_production_app_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184523_p_ci_templates_auto_devops_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184526_p_ci_templates_aws_cf_deploy_ec2_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184530_p_ci_templates_aws_deploy_ecs_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184534_p_ci_templates_auto_devops_build_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184538_p_ci_templates_auto_devops_deploy_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184542_p_ci_templates_auto_devops_deploy_latest_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184546_p_ci_templates_security_sast_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184551_p_ci_templates_security_secret_detection_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184555_p_ci_templates_terraform_base_latest_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184559_ci_templates_total_unique_counts_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184803_quickactions_total_unique_counts_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184806_i_package_composer_deploy_token_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184810_i_package_conan_deploy_token_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184814_i_package_container_deploy_token_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184818_i_package_debian_deploy_token_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184822_i_package_generic_deploy_token_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184826_i_package_golang_deploy_token_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184830_i_package_maven_deploy_token_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184834_i_package_npm_deploy_token_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184838_i_package_nuget_deploy_token_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184842_i_package_pypi_deploy_token_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184846_i_package_tag_deploy_token_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184850_deploy_token_packages_total_unique_counts_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184854_i_package_composer_user_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184858_i_package_conan_user_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184902_i_package_container_user_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184906_i_package_debian_user_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184910_i_package_generic_user_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184913_i_package_golang_user_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184917_i_package_maven_user_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184921_i_package_npm_user_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184925_i_package_nuget_user_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184929_i_package_pypi_user_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184933_i_package_tag_user_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184937_user_packages_total_unique_counts_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184941_i_ecosystem_jira_service_close_issue_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184945_i_ecosystem_jira_service_cross_reference_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184949_i_ecosystem_jira_service_list_issues_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184953_i_ecosystem_jira_service_create_issue_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184957_ecosystem_total_unique_counts_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210222041219_i_quickactions_invite_email_single_monthly.yml18
-rw-r--r--config/metrics/counts_28d/20210222041235_i_quickactions_invite_email_multiple_monthly.yml18
-rw-r--r--config/metrics/counts_28d/20210301102134_i_code_review_user_time_estimate_changed_monthly.yml20
-rw-r--r--config/metrics/counts_28d/20210301102204_i_code_review_user_time_spent_changed_monthly.yml20
-rw-r--r--config/metrics/counts_28d/20210301103859_i_code_review_user_mr_discussion_locked_monthly.yml20
-rw-r--r--config/metrics/counts_28d/20210301103925_i_code_review_user_mr_discussion_unlocked_monthly.yml20
-rw-r--r--config/metrics/counts_28d/20210301144228_o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile_monthly.yml20
-rw-r--r--config/metrics/counts_28d/20210302110520_i_code_review_user_milestone_changed_monthly.yml20
-rw-r--r--config/metrics/counts_28d/20210302110607_i_code_review_user_labels_changed_monthly.yml20
-rw-r--r--config/metrics/counts_28d/20210302114145_i_code_review_user_assignees_changed_monthly.yml20
-rw-r--r--config/metrics/counts_28d/20210302114219_i_code_review_user_reviewers_changed_monthly.yml20
-rw-r--r--config/metrics/counts_28d/20210303150507_i_ecosystem_slack_service_issue_notification_monthly.yml20
-rw-r--r--config/metrics/counts_28d/20210303150654_i_ecosystem_slack_service_push_notification_monthly.yml20
-rw-r--r--config/metrics/counts_28d/20210303150912_i_ecosystem_slack_service_deployment_notification_monthly.yml20
-rw-r--r--config/metrics/counts_28d/20210303151609_i_ecosystem_slack_service_wiki_page_notification_monthly.yml20
-rw-r--r--config/metrics/counts_28d/20210303151831_i_ecosystem_slack_service_merge_request_notification_monthly.yml20
-rw-r--r--config/metrics/counts_28d/20210303151946_i_ecosystem_slack_service_note_notification_monthly.yml20
-rw-r--r--config/metrics/counts_28d/20210303152049_i_ecosystem_slack_service_tag_push_notification_monthly.yml20
-rw-r--r--config/metrics/counts_28d/20210303152144_i_ecosystem_slack_service_confidential_note_notification_monthly.yml20
-rw-r--r--config/metrics/counts_28d/20210303152233_i_ecosystem_slack_service_confidential_issue_notification_monthly.yml20
-rw-r--r--config/metrics/counts_7d/20210201124931_g_project_management_issue_title_changed_weekly.yml6
-rw-r--r--config/metrics/counts_7d/20210216180422_i_search_total_weekly.yml18
-rw-r--r--config/metrics/counts_7d/20210216180429_search_total_unique_counts_weekly.yml18
-rw-r--r--config/metrics/counts_7d/20210216182134_i_testing_test_case_parsed_weekly.yml20
-rw-r--r--config/metrics/counts_7d/20210216182158_i_testing_metrics_report_artifact_uploaders_weekly.yml20
-rw-r--r--config/metrics/counts_7d/20210301144209_o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile_weekly.yml20
-rw-r--r--config/metrics/counts_7d/20210302103002_i_ecosystem_slack_service_issue_notification_weekly.yml20
-rw-r--r--config/metrics/counts_7d/20210302103539_i_code_review_user_time_estimate_changed_weekly.yml20
-rw-r--r--config/metrics/counts_7d/20210302103615_i_code_review_user_time_spent_changed_weekly.yml20
-rw-r--r--config/metrics/counts_7d/20210302103629_i_ecosystem_slack_service_push_notification_weekly.yml20
-rw-r--r--config/metrics/counts_7d/20210302103755_i_ecosystem_slack_service_deployment_notification_weekly.yml20
-rw-r--r--config/metrics/counts_7d/20210302103907_i_ecosystem_slack_service_wiki_page_notification_weekly.yml20
-rw-r--r--config/metrics/counts_7d/20210302104007_i_ecosystem_slack_service_merge_request_notification_weekly.yml20
-rw-r--r--config/metrics/counts_7d/20210302104047_i_ecosystem_slack_service_note_notification_weekly.yml20
-rw-r--r--config/metrics/counts_7d/20210302104144_i_ecosystem_slack_service_tag_push_notification_weekly.yml20
-rw-r--r--config/metrics/counts_7d/20210302104556_i_ecosystem_slack_service_confidential_note_notification_weekly.yml20
-rw-r--r--config/metrics/counts_7d/20210302104814_i_ecosystem_slack_service_confidential_issue_notification_weekly.yml20
-rw-r--r--config/metrics/counts_7d/20210302105258_i_code_review_user_mr_discussion_unlocked_weekly.yml20
-rw-r--r--config/metrics/counts_7d/20210302105318_i_code_review_user_mr_discussion_locked_weekly.yml20
-rw-r--r--config/metrics/counts_7d/20210302110403_i_code_review_user_milestone_changed_weekly.yml20
-rw-r--r--config/metrics/counts_7d/20210302110548_i_code_review_user_labels_changed_weekly.yml20
-rw-r--r--config/metrics/counts_7d/20210302114202_i_code_review_user_assignees_changed_weekly.yml20
-rw-r--r--config/metrics/counts_7d/20210302114235_i_code_review_user_reviewers_changed_weekly.yml20
-rw-r--r--config/metrics/counts_all/20210201124934_deployments.yml2
-rw-r--r--config/metrics/counts_all/20210204124930_servers.yml6
-rw-r--r--config/metrics/counts_all/20210204124932_clusters.yml6
-rw-r--r--config/metrics/counts_all/20210216174826_ldap_users.yml19
-rw-r--r--config/metrics/counts_all/20210216174829_smtp_server.yml19
-rw-r--r--config/metrics/counts_all/20210216174832_cycle_analytics_views.yml16
-rw-r--r--config/metrics/counts_all/20210216174834_productivity_analytics_views.yml16
-rw-r--r--config/metrics/counts_all/20210216174836_g_analytics_contribution.yml16
-rw-r--r--config/metrics/counts_all/20210216174838_g_analytics_insights.yml16
-rw-r--r--config/metrics/counts_all/20210216174840_g_analytics_issues.yml16
-rw-r--r--config/metrics/counts_all/20210216174842_g_analytics_productivity.yml16
-rw-r--r--config/metrics/counts_all/20210216174844_g_analytics_valuestream.yml16
-rw-r--r--config/metrics/counts_all/20210216174846_p_analytics_pipelines.yml16
-rw-r--r--config/metrics/counts_all/20210216174848_p_analytics_code_reviews.yml16
-rw-r--r--config/metrics/counts_all/20210216174850_p_analytics_valuestream.yml16
-rw-r--r--config/metrics/counts_all/20210216174852_p_analytics_insights.yml16
-rw-r--r--config/metrics/counts_all/20210216174854_p_analytics_issues.yml16
-rw-r--r--config/metrics/counts_all/20210216174856_p_analytics_repo.yml16
-rw-r--r--config/metrics/counts_all/20210216174858_i_analytics_cohorts.yml16
-rw-r--r--config/metrics/counts_all/20210216174900_i_analytics_dev_ops_score.yml16
-rw-r--r--config/metrics/counts_all/20210216174902_g_analytics_merge_request.yml16
-rw-r--r--config/metrics/counts_all/20210216174904_p_analytics_merge_request.yml16
-rw-r--r--config/metrics/counts_all/20210216174906_i_analytics_instance_statistics.yml16
-rw-r--r--config/metrics/counts_all/20210216174908_analytics_unique_visits_for_any_target.yml16
-rw-r--r--config/metrics/counts_all/20210216175019_projects_with_prometheus_alerts.yml16
-rw-r--r--config/metrics/counts_all/20210216175021_pod_logs_usages_total.yml16
-rw-r--r--config/metrics/counts_all/20210216175024_service_desk_enabled_projects.yml17
-rw-r--r--config/metrics/counts_all/20210216175026_service_desk_issues.yml17
-rw-r--r--config/metrics/counts_all/20210216175028_requirements_created.yml16
-rw-r--r--config/metrics/counts_all/20210216175037_suggestions.yml16
-rw-r--r--config/metrics/counts_all/20210216175039_merge_requests.yml16
-rw-r--r--config/metrics/counts_all/20210216175041_merge_request_comment.yml16
-rw-r--r--config/metrics/counts_all/20210216175043_merge_request_create.yml16
-rw-r--r--config/metrics/counts_all/20210216175045_merge_requests.yml16
-rw-r--r--config/metrics/counts_all/20210216175053_suggestions.yml16
-rw-r--r--config/metrics/counts_all/20210216175206_merged_merge_requests_using_approval_rules.yml16
-rw-r--r--config/metrics/counts_all/20210216175229_auto_devops_enabled.yml16
-rw-r--r--config/metrics/counts_all/20210216175231_auto_devops_disabled.yml16
-rw-r--r--config/metrics/counts_all/20210216175232_clusters.yml19
-rw-r--r--config/metrics/counts_all/20210216175234_clusters_enabled.yml19
-rw-r--r--config/metrics/counts_all/20210216175236_project_clusters_enabled.yml19
-rw-r--r--config/metrics/counts_all/20210216175238_group_clusters_enabled.yml19
-rw-r--r--config/metrics/counts_all/20210216175240_instance_clusters_enabled.yml19
-rw-r--r--config/metrics/counts_all/20210216175242_clusters_disabled.yml19
-rw-r--r--config/metrics/counts_all/20210216175244_project_clusters_disabled.yml19
-rw-r--r--config/metrics/counts_all/20210216175246_group_clusters_disabled.yml19
-rw-r--r--config/metrics/counts_all/20210216175248_instance_clusters_disabled.yml19
-rw-r--r--config/metrics/counts_all/20210216175250_clusters_platforms_eks.yml19
-rw-r--r--config/metrics/counts_all/20210216175251_clusters_platforms_gke.yml19
-rw-r--r--config/metrics/counts_all/20210216175253_clusters_platforms_user.yml19
-rw-r--r--config/metrics/counts_all/20210216175255_clusters_applications_helm.yml19
-rw-r--r--config/metrics/counts_all/20210216175257_clusters_applications_ingress.yml19
-rw-r--r--config/metrics/counts_all/20210216175259_clusters_applications_cert_managers.yml19
-rw-r--r--config/metrics/counts_all/20210216175301_clusters_applications_crossplane.yml19
-rw-r--r--config/metrics/counts_all/20210216175303_clusters_applications_prometheus.yml19
-rw-r--r--config/metrics/counts_all/20210216175305_clusters_applications_runner.yml19
-rw-r--r--config/metrics/counts_all/20210216175307_clusters_applications_knative.yml19
-rw-r--r--config/metrics/counts_all/20210216175309_clusters_applications_elastic_stack.yml19
-rw-r--r--config/metrics/counts_all/20210216175310_clusters_applications_jupyter.yml19
-rw-r--r--config/metrics/counts_all/20210216175312_clusters_applications_cilium.yml19
-rw-r--r--config/metrics/counts_all/20210216175314_clusters_management_project.yml19
-rw-r--r--config/metrics/counts_all/20210216175320_projects_with_terraform_reports.yml16
-rw-r--r--config/metrics/counts_all/20210216175322_projects_with_terraform_states.yml16
-rw-r--r--config/metrics/counts_all/20210216175324_terraform_reports.yml16
-rw-r--r--config/metrics/counts_all/20210216175326_terraform_states.yml16
-rw-r--r--config/metrics/counts_all/20210216175329_clusters_applications_cert_managers.yml19
-rw-r--r--config/metrics/counts_all/20210216175331_clusters_applications_helm.yml19
-rw-r--r--config/metrics/counts_all/20210216175333_clusters_applications_ingress.yml19
-rw-r--r--config/metrics/counts_all/20210216175335_clusters_applications_knative.yml19
-rw-r--r--config/metrics/counts_all/20210216175337_clusters_management_project.yml19
-rw-r--r--config/metrics/counts_all/20210216175339_clusters_disabled.yml19
-rw-r--r--config/metrics/counts_all/20210216175341_clusters_enabled.yml19
-rw-r--r--config/metrics/counts_all/20210216175343_clusters_platforms_gke.yml19
-rw-r--r--config/metrics/counts_all/20210216175345_clusters_platforms_eks.yml19
-rw-r--r--config/metrics/counts_all/20210216175346_clusters_platforms_user.yml19
-rw-r--r--config/metrics/counts_all/20210216175348_instance_clusters_disabled.yml19
-rw-r--r--config/metrics/counts_all/20210216175350_instance_clusters_enabled.yml19
-rw-r--r--config/metrics/counts_all/20210216175352_group_clusters_disabled.yml19
-rw-r--r--config/metrics/counts_all/20210216175354_group_clusters_enabled.yml19
-rw-r--r--config/metrics/counts_all/20210216175356_project_clusters_disabled.yml19
-rw-r--r--config/metrics/counts_all/20210216175358_project_clusters_enabled.yml19
-rw-r--r--config/metrics/counts_all/20210216175403_projects_with_prometheus_alerts.yml19
-rw-r--r--config/metrics/counts_all/20210216175442_ingress_modsecurity_packets_processed.yml20
-rw-r--r--config/metrics/counts_all/20210216175444_ingress_modsecurity_packets_anomalous.yml20
-rw-r--r--config/metrics/counts_all/20210216175446_network_policy_forwards.yml20
-rw-r--r--config/metrics/counts_all/20210216175448_network_policy_drops.yml20
-rw-r--r--config/metrics/counts_all/20210216175450_ingress_modsecurity_logging.yml19
-rw-r--r--config/metrics/counts_all/20210216175452_ingress_modsecurity_blocking.yml19
-rw-r--r--config/metrics/counts_all/20210216175454_ingress_modsecurity_disabled.yml19
-rw-r--r--config/metrics/counts_all/20210216175456_ingress_modsecurity_not_installed.yml19
-rw-r--r--config/metrics/counts_all/20210216175510_ci_builds.yml16
-rw-r--r--config/metrics/counts_all/20210216175512_ci_internal_pipelines.yml16
-rw-r--r--config/metrics/counts_all/20210216175514_ci_external_pipelines.yml16
-rw-r--r--config/metrics/counts_all/20210216175516_ci_pipeline_config_auto_devops.yml16
-rw-r--r--config/metrics/counts_all/20210216175518_ci_pipeline_config_repository.yml16
-rw-r--r--config/metrics/counts_all/20210216175520_ci_runners.yml16
-rw-r--r--config/metrics/counts_all/20210216175521_ci_triggers.yml16
-rw-r--r--config/metrics/counts_all/20210216175523_ci_pipeline_schedules.yml16
-rw-r--r--config/metrics/counts_all/20210216175525_ci_builds.yml16
-rw-r--r--config/metrics/counts_all/20210216175527_ci_external_pipelines.yml16
-rw-r--r--config/metrics/counts_all/20210216175529_ci_internal_pipelines.yml16
-rw-r--r--config/metrics/counts_all/20210216175531_ci_pipeline_config_auto_devops.yml16
-rw-r--r--config/metrics/counts_all/20210216175533_ci_pipeline_config_repository.yml16
-rw-r--r--config/metrics/counts_all/20210216175535_ci_pipeline_schedules.yml16
-rw-r--r--config/metrics/counts_all/20210216175537_ci_pipelines.yml17
-rw-r--r--config/metrics/counts_all/20210216175539_ci_triggers.yml16
-rw-r--r--config/metrics/counts_all/20210216175612_dast_jobs.yml16
-rw-r--r--config/metrics/counts_all/20210216175614_user_dast_jobs.yml16
-rw-r--r--config/metrics/counts_all/20210216175621_web_hooks.yml16
-rw-r--r--config/metrics/counts_all/20210216175623_projects_asana_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175625_groups_asana_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175627_templates_asana_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175628_instances_asana_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175630_projects_inheriting_asana_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175632_groups_inheriting_asana_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175634_projects_assembla_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175636_groups_assembla_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175638_templates_assembla_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175640_instances_assembla_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175642_projects_inheriting_assembla_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175644_groups_inheriting_assembla_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175645_projects_bamboo_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175647_groups_bamboo_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175649_templates_bamboo_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175651_instances_bamboo_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175653_projects_inheriting_bamboo_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175655_groups_inheriting_bamboo_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175657_projects_bugzilla_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175659_groups_bugzilla_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175701_templates_bugzilla_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175702_instances_bugzilla_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175704_projects_inheriting_bugzilla_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175706_groups_inheriting_bugzilla_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175708_projects_buildkite_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175710_groups_buildkite_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175712_templates_buildkite_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175714_instances_buildkite_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175716_projects_inheriting_buildkite_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175717_groups_inheriting_buildkite_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175719_projects_campfire_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175721_groups_campfire_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175723_templates_campfire_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175725_instances_campfire_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175727_projects_inheriting_campfire_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175729_groups_inheriting_campfire_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175731_projects_confluence_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175733_groups_confluence_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175734_templates_confluence_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175736_instances_confluence_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175738_projects_inheriting_confluence_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175740_groups_inheriting_confluence_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175742_projects_custom_issue_tracker_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175744_groups_custom_issue_tracker_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175745_templates_custom_issue_tracker_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175747_instances_custom_issue_tracker_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175749_projects_inheriting_custom_issue_tracker_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175751_groups_inheriting_custom_issue_tracker_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175753_projects_discord_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175755_groups_discord_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175756_templates_discord_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175758_instances_discord_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175800_projects_inheriting_discord_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175802_groups_inheriting_discord_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175804_projects_drone_ci_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175806_groups_drone_ci_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175807_templates_drone_ci_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175809_instances_drone_ci_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175811_projects_inheriting_drone_ci_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175813_groups_inheriting_drone_ci_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175815_projects_emails_on_push_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175817_groups_emails_on_push_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175818_templates_emails_on_push_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175820_instances_emails_on_push_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175822_projects_inheriting_emails_on_push_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175824_groups_inheriting_emails_on_push_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175826_projects_external_wiki_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175828_groups_external_wiki_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175829_templates_external_wiki_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175831_instances_external_wiki_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175833_projects_inheriting_external_wiki_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175835_groups_inheriting_external_wiki_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175837_projects_flowdock_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175839_groups_flowdock_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175840_templates_flowdock_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175842_instances_flowdock_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175844_projects_inheriting_flowdock_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175846_groups_inheriting_flowdock_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175848_projects_github_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175850_groups_github_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175851_templates_github_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175853_instances_github_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175855_projects_inheriting_github_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175857_groups_inheriting_github_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175859_projects_hangouts_chat_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175901_groups_hangouts_chat_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175902_templates_hangouts_chat_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175904_instances_hangouts_chat_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175906_projects_inheriting_hangouts_chat_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175908_groups_inheriting_hangouts_chat_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175910_projects_hipchat_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175912_groups_hipchat_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175913_templates_hipchat_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175915_instances_hipchat_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175917_projects_inheriting_hipchat_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175919_groups_inheriting_hipchat_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175921_projects_irker_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175923_groups_irker_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175924_templates_irker_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175926_instances_irker_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175928_projects_inheriting_irker_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175930_groups_inheriting_irker_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175932_projects_jenkins_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175934_groups_jenkins_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175935_templates_jenkins_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175937_instances_jenkins_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175939_projects_inheriting_jenkins_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175941_groups_inheriting_jenkins_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175943_projects_jira_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175945_groups_jira_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175946_templates_jira_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175948_instances_jira_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175950_projects_inheriting_jira_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175952_groups_inheriting_jira_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175954_projects_mattermost_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175956_groups_mattermost_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175957_templates_mattermost_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175959_instances_mattermost_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180001_projects_inheriting_mattermost_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180003_groups_inheriting_mattermost_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180005_projects_mattermost_slash_commands_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180006_groups_mattermost_slash_commands_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180008_templates_mattermost_slash_commands_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180010_instances_mattermost_slash_commands_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180012_projects_inheriting_mattermost_slash_commands_active.yml20
-rw-r--r--config/metrics/counts_all/20210216180014_groups_inheriting_mattermost_slash_commands_active.yml20
-rw-r--r--config/metrics/counts_all/20210216180016_projects_microsoft_teams_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180018_groups_microsoft_teams_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180019_templates_microsoft_teams_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180021_instances_microsoft_teams_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180023_projects_inheriting_microsoft_teams_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180025_groups_inheriting_microsoft_teams_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180027_projects_packagist_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180029_groups_packagist_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180030_templates_packagist_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180032_instances_packagist_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180034_projects_inheriting_packagist_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180036_groups_inheriting_packagist_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180038_projects_pipelines_email_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180040_groups_pipelines_email_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180041_templates_pipelines_email_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180043_instances_pipelines_email_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180045_projects_inheriting_pipelines_email_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180047_groups_inheriting_pipelines_email_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180049_projects_pivotaltracker_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180051_groups_pivotaltracker_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180052_templates_pivotaltracker_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180054_instances_pivotaltracker_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180056_projects_inheriting_pivotaltracker_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180058_groups_inheriting_pivotaltracker_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180100_projects_pushover_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180102_groups_pushover_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180104_templates_pushover_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180105_instances_pushover_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180107_projects_inheriting_pushover_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180109_groups_inheriting_pushover_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180111_projects_redmine_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180113_groups_redmine_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180115_templates_redmine_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180116_instances_redmine_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180118_projects_inheriting_redmine_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180120_groups_inheriting_redmine_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180122_projects_slack_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180124_groups_slack_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180126_templates_slack_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180127_instances_slack_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180129_projects_inheriting_slack_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180131_groups_inheriting_slack_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180133_projects_slack_slash_commands_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180135_groups_slack_slash_commands_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180137_templates_slack_slash_commands_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180138_instances_slack_slash_commands_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180140_projects_inheriting_slack_slash_commands_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180142_groups_inheriting_slack_slash_commands_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180144_projects_teamcity_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180146_groups_teamcity_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180148_templates_teamcity_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180149_instances_teamcity_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180151_projects_inheriting_teamcity_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180153_groups_inheriting_teamcity_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180155_projects_unify_circuit_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180157_groups_unify_circuit_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180159_templates_unify_circuit_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180201_instances_unify_circuit_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180203_projects_inheriting_unify_circuit_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180204_groups_inheriting_unify_circuit_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180206_projects_webex_teams_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180208_groups_webex_teams_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180210_templates_webex_teams_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180212_instances_webex_teams_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180214_projects_inheriting_webex_teams_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180215_groups_inheriting_webex_teams_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180217_projects_youtrack_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180219_groups_youtrack_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180221_templates_youtrack_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180223_instances_youtrack_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180225_projects_inheriting_youtrack_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180226_groups_inheriting_youtrack_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180228_projects_jira_server_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180230_projects_jira_cloud_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180232_projects_jira_dvcs_cloud_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180234_projects_jira_dvcs_server_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180239_personal_snippets.yml19
-rw-r--r--config/metrics/counts_all/20210216180241_project_snippets.yml19
-rw-r--r--config/metrics/counts_all/20210216180242_web_ide_commits.yml19
-rw-r--r--config/metrics/counts_all/20210216180244_web_ide_views.yml19
-rw-r--r--config/metrics/counts_all/20210216180246_web_ide_merge_requests.yml19
-rw-r--r--config/metrics/counts_all/20210216180248_web_ide_previews.yml19
-rw-r--r--config/metrics/counts_all/20210216180250_web_ide_terminals.yml19
-rw-r--r--config/metrics/counts_all/20210216180252_web_ide_pipelines.yml19
-rw-r--r--config/metrics/counts_all/20210216180253_snippet_comment.yml19
-rw-r--r--config/metrics/counts_all/20210216180255_snippet_create.yml19
-rw-r--r--config/metrics/counts_all/20210216180257_snippet_update.yml19
-rw-r--r--config/metrics/counts_all/20210216180259_static_site_editor_views.yml19
-rw-r--r--config/metrics/counts_all/20210216180301_static_site_editor_commits.yml16
-rw-r--r--config/metrics/counts_all/20210216180303_static_site_editor_merge_requests.yml16
-rw-r--r--config/metrics/counts_all/20210216180304_user_preferences_user_gitpod_enabled.yml19
-rw-r--r--config/metrics/counts_all/20210216180306_snippets.yml19
-rw-r--r--config/metrics/counts_all/20210216180316_snippets.yml19
-rw-r--r--config/metrics/counts_all/20210216180344_api_fuzzing_jobs.yml16
-rw-r--r--config/metrics/counts_all/20210216180346_api_fuzzing_dnd_jobs.yml16
-rw-r--r--config/metrics/counts_all/20210216180348_user_api_fuzzing_jobs.yml16
-rw-r--r--config/metrics/counts_all/20210216180350_user_api_fuzzing_dnd_jobs.yml16
-rw-r--r--config/metrics/counts_all/20210216180410_pool_repositories.yml19
-rw-r--r--config/metrics/counts_all/20210216180413_all_searches.yml19
-rw-r--r--config/metrics/counts_all/20210216180414_navbar_searches.yml19
-rw-r--r--config/metrics/counts_all/20210216180416_i_search_total.yml18
-rw-r--r--config/metrics/counts_all/20210216180434_issues_created_from_gitlab_error_tracking_ui.yml16
-rw-r--r--config/metrics/counts_all/20210216180436_issues_with_associated_zoom_link.yml19
-rw-r--r--config/metrics/counts_all/20210216180438_issues_using_zoom_quick_actions.yml20
-rw-r--r--config/metrics/counts_all/20210216180440_issues_with_embedded_grafana_charts_approx.yml19
-rw-r--r--config/metrics/counts_all/20210216180441_issues_created_from_alerts.yml19
-rw-r--r--config/metrics/counts_all/20210216180443_issues_created_gitlab_alerts.yml19
-rw-r--r--config/metrics/counts_all/20210216180445_issues_created_manually_from_alerts.yml19
-rw-r--r--config/metrics/counts_all/20210216180447_incident_issues.yml19
-rw-r--r--config/metrics/counts_all/20210216180449_alert_bot_incident_issues.yml19
-rw-r--r--config/metrics/counts_all/20210216180451_incident_labeled_issues.yml19
-rw-r--r--config/metrics/counts_all/20210216180453_projects_creating_incidents.yml16
-rw-r--r--config/metrics/counts_all/20210216180454_projects_with_error_tracking_enabled.yml19
-rw-r--r--config/metrics/counts_all/20210216180456_projects_with_alerts_service_enabled.yml19
-rw-r--r--config/metrics/counts_all/20210216180458_projects_with_alerts_created.yml16
-rw-r--r--config/metrics/counts_all/20210216180500_projects_with_enabled_alert_integrations.yml16
-rw-r--r--config/metrics/counts_all/20210216180502_status_page_incident_publishes.yml16
-rw-r--r--config/metrics/counts_all/20210216180504_status_page_incident_unpublishes.yml16
-rw-r--r--config/metrics/counts_all/20210216180506_status_page_projects.yml16
-rw-r--r--config/metrics/counts_all/20210216180507_status_page_issues.yml16
-rw-r--r--config/metrics/counts_all/20210216180517_projects_with_error_tracking_enabled.yml16
-rw-r--r--config/metrics/counts_all/20210216180518_projects_with_incidents.yml16
-rw-r--r--config/metrics/counts_all/20210216180520_projects_with_alert_incidents.yml16
-rw-r--r--config/metrics/counts_all/20210216180522_projects_incident_sla_enabled.yml16
-rw-r--r--config/metrics/counts_all/20210216180628_projects_imported_from_github.yml16
-rw-r--r--config/metrics/counts_all/20210216180630_projects_imported_from_github.yml16
-rw-r--r--config/metrics/counts_all/20210216180632_unique_users_all_imports.yml16
-rw-r--r--config/metrics/counts_all/20210216180634_gitlab.yml17
-rw-r--r--config/metrics/counts_all/20210216180636_gitlab_v1.yml16
-rw-r--r--config/metrics/counts_all/20210216180638_gitlab_project.yml16
-rw-r--r--config/metrics/counts_all/20210216180639_gitlab.yml16
-rw-r--r--config/metrics/counts_all/20210216180641_github.yml16
-rw-r--r--config/metrics/counts_all/20210216180643_bitbucket.yml16
-rw-r--r--config/metrics/counts_all/20210216180645_bitbucket_server.yml16
-rw-r--r--config/metrics/counts_all/20210216180647_gitea.yml16
-rw-r--r--config/metrics/counts_all/20210216180649_git.yml16
-rw-r--r--config/metrics/counts_all/20210216180650_manifest.yml16
-rw-r--r--config/metrics/counts_all/20210216180652_gitlab_migration.yml16
-rw-r--r--config/metrics/counts_all/20210216180654_jira.yml16
-rw-r--r--config/metrics/counts_all/20210216180656_fogbugz.yml16
-rw-r--r--config/metrics/counts_all/20210216180658_phabricator.yml16
-rw-r--r--config/metrics/counts_all/20210216180700_csv.yml16
-rw-r--r--config/metrics/counts_all/20210216180702_group_import.yml16
-rw-r--r--config/metrics/counts_all/20210216180703_gitlab_migration.yml16
-rw-r--r--config/metrics/counts_all/20210216180705_total.yml16
-rw-r--r--config/metrics/counts_all/20210216180707_gitlab_project.yml16
-rw-r--r--config/metrics/counts_all/20210216180709_gitlab.yml16
-rw-r--r--config/metrics/counts_all/20210216180711_github.yml16
-rw-r--r--config/metrics/counts_all/20210216180713_bitbucket.yml16
-rw-r--r--config/metrics/counts_all/20210216180715_bitbucket_server.yml16
-rw-r--r--config/metrics/counts_all/20210216180716_gitea.yml16
-rw-r--r--config/metrics/counts_all/20210216180718_git.yml16
-rw-r--r--config/metrics/counts_all/20210216180720_manifest.yml16
-rw-r--r--config/metrics/counts_all/20210216180722_jira.yml16
-rw-r--r--config/metrics/counts_all/20210216180724_fogbugz.yml16
-rw-r--r--config/metrics/counts_all/20210216180726_phabricator.yml16
-rw-r--r--config/metrics/counts_all/20210216180727_csv.yml17
-rw-r--r--config/metrics/counts_all/20210216180729_groups_imported.yml16
-rw-r--r--config/metrics/counts_all/20210216180734_wiki_pages_create.yml16
-rw-r--r--config/metrics/counts_all/20210216180736_wiki_pages_update.yml16
-rw-r--r--config/metrics/counts_all/20210216180738_wiki_pages_delete.yml16
-rw-r--r--config/metrics/counts_all/20210216180740_design_management_designs_create.yml16
-rw-r--r--config/metrics/counts_all/20210216180741_design_management_designs_update.yml16
-rw-r--r--config/metrics/counts_all/20210216180743_design_management_designs_delete.yml16
-rw-r--r--config/metrics/counts_all/20210216180750_groups.yml19
-rw-r--r--config/metrics/counts_all/20210216180752_keys.yml16
-rw-r--r--config/metrics/counts_all/20210216180754_events.yml17
-rw-r--r--config/metrics/counts_all/20210216180756_groups.yml16
-rw-r--r--config/metrics/counts_all/20210216180758_users_created.yml16
-rw-r--r--config/metrics/counts_all/20210216180800_ldap_keys.yml16
-rw-r--r--config/metrics/counts_all/20210216180801_ldap_users.yml16
-rw-r--r--config/metrics/counts_all/20210216180843_provider.yml19
-rw-r--r--config/metrics/counts_all/20210216180852_provider.yml19
-rw-r--r--config/metrics/counts_all/20210216180902_provider.yml19
-rw-r--r--config/metrics/counts_all/20210216180903_enabled.yml19
-rw-r--r--config/metrics/counts_all/20210216180911_provider.yml19
-rw-r--r--config/metrics/counts_all/20210216180920_provider.yml19
-rw-r--r--config/metrics/counts_all/20210216180922_duration_s.yml19
-rw-r--r--config/metrics/counts_all/20210216180924_failures.yml19
-rw-r--r--config/metrics/counts_all/20210216180927_grafana_integrated_projects.yml16
-rw-r--r--config/metrics/counts_all/20210216180929_projects_with_tracing_enabled.yml16
-rw-r--r--config/metrics/counts_all/20210216180931_projects_prometheus_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180933_groups_prometheus_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180934_templates_prometheus_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180936_instances_prometheus_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180938_projects_inheriting_prometheus_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180940_groups_inheriting_prometheus_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180942_operations_dashboard_default_dashboard.yml16
-rw-r--r--config/metrics/counts_all/20210216180944_operations_dashboard_users_with_projects_added.yml16
-rw-r--r--config/metrics/counts_all/20210216180945_clusters.yml16
-rw-r--r--config/metrics/counts_all/20210216180947_clusters_applications_prometheus.yml16
-rw-r--r--config/metrics/counts_all/20210216180949_operations_dashboard_default_dashboard.yml16
-rw-r--r--config/metrics/counts_all/20210216180951_projects_with_tracing_enabled.yml16
-rw-r--r--config/metrics/counts_all/20210216180953_operations_dashboard_users_with_projects_added.yml16
-rw-r--r--config/metrics/counts_all/20210216181009_lfs_objects.yml16
-rw-r--r--config/metrics/counts_all/20210216181011_projects_with_packages.yml17
-rw-r--r--config/metrics/counts_all/20210216181012_packages.yml16
-rw-r--r--config/metrics/counts_all/20210216181014_projects_with_expiration_policy_disabled.yml16
-rw-r--r--config/metrics/counts_all/20210216181016_projects_with_expiration_policy_enabled.yml16
-rw-r--r--config/metrics/counts_all/20210216181029_projects_with_expiration_policy_enabled_with_cadence_set_to_1d.yml16
-rw-r--r--config/metrics/counts_all/20210216181031_projects_with_expiration_policy_enabled_with_cadence_set_to_7d.yml16
-rw-r--r--config/metrics/counts_all/20210216181033_projects_with_expiration_policy_enabled_with_cadence_set_to_14d.yml16
-rw-r--r--config/metrics/counts_all/20210216181035_projects_with_expiration_policy_enabled_with_cadence_set_to_1month.yml16
-rw-r--r--config/metrics/counts_all/20210216181037_projects_with_expiration_policy_enabled_with_cadence_set_to_3month.yml16
-rw-r--r--config/metrics/counts_all/20210216181038_projects_with_expiration_policy_enabled_with_older_than_set_to_7d.yml16
-rw-r--r--config/metrics/counts_all/20210216181040_projects_with_expiration_policy_enabled_with_older_than_set_to_14d.yml16
-rw-r--r--config/metrics/counts_all/20210216181042_projects_with_expiration_policy_enabled_with_older_than_set_to_30d.yml16
-rw-r--r--config/metrics/counts_all/20210216181044_projects_with_expiration_policy_enabled_with_older_than_set_to_90d.yml16
-rw-r--r--config/metrics/counts_all/20210216181048_projects_with_expiration_policy_enabled_with_older_than_unset.yml16
-rw-r--r--config/metrics/counts_all/20210216181051_vendor.yml17
-rw-r--r--config/metrics/counts_all/20210216181055_projects_with_packages.yml16
-rw-r--r--config/metrics/counts_all/20210216181102_issues.yml19
-rw-r--r--config/metrics/counts_all/20210216181104_label_lists.yml16
-rw-r--r--config/metrics/counts_all/20210216181106_milestone_lists.yml16
-rw-r--r--config/metrics/counts_all/20210216181108_milestones.yml16
-rw-r--r--config/metrics/counts_all/20210216181109_uploads.yml19
-rw-r--r--config/metrics/counts_all/20210216181111_labels.yml19
-rw-r--r--config/metrics/counts_all/20210216181113_notes.yml19
-rw-r--r--config/metrics/counts_all/20210216181115_issues.yml16
-rw-r--r--config/metrics/counts_all/20210216181117_notes.yml16
-rw-r--r--config/metrics/counts_all/20210216181119_projects.yml16
-rw-r--r--config/metrics/counts_all/20210216181121_todos.yml16
-rw-r--r--config/metrics/counts_all/20210216181122_service_desk_enabled_projects.yml17
-rw-r--r--config/metrics/counts_all/20210216181124_service_desk_issues.yml17
-rw-r--r--config/metrics/counts_all/20210216181126_projects_jira_active.yml16
-rw-r--r--config/metrics/counts_all/20210216181128_projects_jira_dvcs_cloud_active.yml16
-rw-r--r--config/metrics/counts_all/20210216181130_projects_jira_dvcs_server_active.yml16
-rw-r--r--config/metrics/counts_all/20210216181134_epics.yml16
-rw-r--r--config/metrics/counts_all/20210216181135_label_lists.yml16
-rw-r--r--config/metrics/counts_all/20210216181137_milestone_lists.yml16
-rw-r--r--config/metrics/counts_all/20210216181205_confidential_epics.yml16
-rw-r--r--config/metrics/counts_all/20210216181206_epics.yml16
-rw-r--r--config/metrics/counts_all/20210216181210_issues_with_health_status.yml16
-rw-r--r--config/metrics/counts_all/20210216181249_feature_flags.yml16
-rw-r--r--config/metrics/counts_all/20210216181252_boards.yml16
-rw-r--r--config/metrics/counts_all/20210216181254_projects.yml16
-rw-r--r--config/metrics/counts_all/20210216181256_todos.yml19
-rw-r--r--config/metrics/counts_all/20210216181258_jira_imports_total_imported_count.yml19
-rw-r--r--config/metrics/counts_all/20210216181259_jira_imports_projects_count.yml19
-rw-r--r--config/metrics/counts_all/20210216181301_jira_imports_total_imported_issues_count.yml19
-rw-r--r--config/metrics/counts_all/20210216181908_deploy_keys.yml16
-rw-r--r--config/metrics/counts_all/20210216181911_successful_deployments.yml16
-rw-r--r--config/metrics/counts_all/20210216181912_failed_deployments.yml16
-rw-r--r--config/metrics/counts_all/20210216181914_environments.yml16
-rw-r--r--config/metrics/counts_all/20210216181916_in_review_folder.yml16
-rw-r--r--config/metrics/counts_all/20210216181918_releases.yml16
-rw-r--r--config/metrics/counts_all/20210216181920_projects_mirrored_with_pipelines_enabled.yml16
-rw-r--r--config/metrics/counts_all/20210216181926_deployments.yml16
-rw-r--r--config/metrics/counts_all/20210216181928_failed_deployments.yml16
-rw-r--r--config/metrics/counts_all/20210216181930_releases.yml16
-rw-r--r--config/metrics/counts_all/20210216181932_successful_deployments.yml16
-rw-r--r--config/metrics/counts_all/20210216181934_projects_mirrored_with_pipelines_enabled.yml16
-rw-r--r--config/metrics/counts_all/20210216181946_pages_domains.yml16
-rw-r--r--config/metrics/counts_all/20210216181949_clusters_applications_runner.yml19
-rw-r--r--config/metrics/counts_all/20210216181954_user_unique_users_all_secure_scanners.yml16
-rw-r--r--config/metrics/counts_all/20210216181959_projects_with_repositories_enabled.yml16
-rw-r--r--config/metrics/counts_all/20210216182001_protected_branches.yml16
-rw-r--r--config/metrics/counts_all/20210216182002_remote_mirrors.yml16
-rw-r--r--config/metrics/counts_all/20210216182004_commit_comment.yml16
-rw-r--r--config/metrics/counts_all/20210216182006_source_code_pushes.yml16
-rw-r--r--config/metrics/counts_all/20210216182008_template_repositories.yml16
-rw-r--r--config/metrics/counts_all/20210216182010_deploy_keys.yml16
-rw-r--r--config/metrics/counts_all/20210216182012_keys.yml16
-rw-r--r--config/metrics/counts_all/20210216182014_projects_with_disable_overriding_approvers_per_merge_request.yml17
-rw-r--r--config/metrics/counts_all/20210216182015_projects_without_disable_overriding_approvers_per_merge_request.yml17
-rw-r--r--config/metrics/counts_all/20210216182017_remote_mirrors.yml16
-rw-r--r--config/metrics/counts_all/20210216182019_projects_enforcing_code_owner_approval.yml16
-rw-r--r--config/metrics/counts_all/20210216182021_projects_with_sectional_code_owner_rules.yml16
-rw-r--r--config/metrics/counts_all/20210216182023_projects_with_repositories_enabled.yml16
-rw-r--r--config/metrics/counts_all/20210216182025_protected_branches.yml16
-rw-r--r--config/metrics/counts_all/20210216182027_total_number_of_path_locks.yml16
-rw-r--r--config/metrics/counts_all/20210216182028_total_number_of_locked_files.yml16
-rw-r--r--config/metrics/counts_all/20210216182112_sast_jobs.yml19
-rw-r--r--config/metrics/counts_all/20210216182114_secret_detection_jobs.yml19
-rw-r--r--config/metrics/counts_all/20210216182116_user_sast_jobs.yml19
-rw-r--r--config/metrics/counts_all/20210216182118_user_secret_detection_jobs.yml19
-rw-r--r--config/metrics/counts_all/20210216182203_user_preferences_group_overview_details.yml18
-rw-r--r--config/metrics/counts_all/20210216182205_user_preferences_group_overview_security_dashboard.yml18
-rw-r--r--config/metrics/counts_all/20210216182207_user_preferences_group_overview_security_dashboard.yml17
-rw-r--r--config/metrics/counts_all/20210216182454_protected_branches_except_default.yml16
-rw-r--r--config/metrics/counts_all/20210216182547_projects_datadog_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182549_groups_datadog_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182551_templates_datadog_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182553_instances_datadog_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182555_projects_inheriting_datadog_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182557_groups_inheriting_datadog_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182614_projects_ewm_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182616_groups_ewm_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182618_templates_ewm_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182620_instances_ewm_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182622_projects_inheriting_ewm_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182623_groups_inheriting_ewm_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182722_projects_mock_ci_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182724_groups_mock_ci_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182726_templates_mock_ci_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182728_instances_mock_ci_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182730_projects_inheriting_mock_ci_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182732_groups_inheriting_mock_ci_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182734_projects_mock_monitoring_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182736_groups_mock_monitoring_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182738_templates_mock_monitoring_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182739_instances_mock_monitoring_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182741_projects_inheriting_mock_monitoring_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182743_groups_inheriting_mock_monitoring_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182855_package_events_i_package_composer_delete_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182857_package_events_i_package_composer_pull_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182859_package_events_i_package_composer_push_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182901_package_events_i_package_conan_delete_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182903_package_events_i_package_conan_pull_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182905_package_events_i_package_conan_push_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182907_package_events_i_package_container_delete_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182909_package_events_i_package_container_pull_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182911_package_events_i_package_container_push_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182913_package_events_i_package_debian_delete_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182915_package_events_i_package_debian_pull_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182917_package_events_i_package_debian_push_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182919_package_events_i_package_delete_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182921_package_events_i_package_delete_package_by_deploy_token.yml16
-rw-r--r--config/metrics/counts_all/20210216182923_package_events_i_package_delete_package_by_guest.yml16
-rw-r--r--config/metrics/counts_all/20210216182925_package_events_i_package_delete_package_by_user.yml16
-rw-r--r--config/metrics/counts_all/20210216182927_package_events_i_package_generic_delete_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182929_package_events_i_package_generic_pull_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182931_package_events_i_package_generic_push_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182933_package_events_i_package_golang_delete_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182934_package_events_i_package_golang_pull_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182936_package_events_i_package_golang_push_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182938_package_events_i_package_maven_delete_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182940_package_events_i_package_maven_pull_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182942_package_events_i_package_maven_push_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182944_package_events_i_package_npm_delete_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182946_package_events_i_package_npm_pull_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182948_package_events_i_package_npm_push_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182950_package_events_i_package_nuget_delete_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182952_package_events_i_package_nuget_pull_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182954_package_events_i_package_nuget_push_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182956_package_events_i_package_pull_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182958_package_events_i_package_pull_package_by_deploy_token.yml16
-rw-r--r--config/metrics/counts_all/20210216183000_package_events_i_package_pull_package_by_guest.yml16
-rw-r--r--config/metrics/counts_all/20210216183002_package_events_i_package_pull_package_by_user.yml16
-rw-r--r--config/metrics/counts_all/20210216183004_package_events_i_package_push_package.yml16
-rw-r--r--config/metrics/counts_all/20210216183005_package_events_i_package_push_package_by_deploy_token.yml16
-rw-r--r--config/metrics/counts_all/20210216183007_package_events_i_package_push_package_by_guest.yml16
-rw-r--r--config/metrics/counts_all/20210216183009_package_events_i_package_push_package_by_user.yml16
-rw-r--r--config/metrics/counts_all/20210216183011_package_events_i_package_pypi_delete_package.yml16
-rw-r--r--config/metrics/counts_all/20210216183013_package_events_i_package_pypi_pull_package.yml16
-rw-r--r--config/metrics/counts_all/20210216183015_package_events_i_package_pypi_push_package.yml16
-rw-r--r--config/metrics/counts_all/20210216183017_package_events_i_package_tag_delete_package.yml16
-rw-r--r--config/metrics/counts_all/20210216183019_package_events_i_package_tag_pull_package.yml16
-rw-r--r--config/metrics/counts_all/20210216183021_package_events_i_package_tag_push_package.yml16
-rw-r--r--config/metrics/counts_all/20210216183023_wiki_pages_view.yml16
-rw-r--r--config/metrics/counts_all/20210216183146_coverage_fuzzing_jobs.yml16
-rw-r--r--config/metrics/counts_all/20210216183149_dast_on_demand_pipelines.yml16
-rw-r--r--config/metrics/counts_all/20210216183241_filesystems.yml16
-rw-r--r--config/metrics/counts_all/20210216183248_pg_system_id.yml16
-rw-r--r--config/metrics/counts_all/20210216183339_merge_requests_with_overridden_project_rules.yml16
-rw-r--r--config/metrics/counts_all/20210216183344_users_using_path_locks.yml16
-rw-r--r--config/metrics/counts_all/20210216183346_users_using_lfs_locks.yml16
-rw-r--r--config/metrics/counts_all/20210216183352_approval_project_rules_with_more_approvers_than_required.yml16
-rw-r--r--config/metrics/counts_all/20210216183354_approval_project_rules_with_less_approvers_than_required.yml16
-rw-r--r--config/metrics/counts_all/20210216183355_approval_project_rules_with_exact_required_approvers.yml16
-rw-r--r--config/metrics/counts_all/20210216183400_omniauth_providers.yml16
-rw-r--r--config/metrics/counts_all/20210216183402_two-factor.yml16
-rw-r--r--config/metrics/counts_all/20210216183404_two-factor-via-u2f-device.yml16
-rw-r--r--config/metrics/counts_all/20210216183406_two-factor-via-webauthn-device.yml16
-rw-r--r--config/metrics/counts_all/20210216183408_standard.yml16
-rw-r--r--config/metrics/counts_all/20210216183410_google_oauth2.yml16
-rw-r--r--config/metrics/counts_all/20210216183514_user_coverage_fuzzing_jobs.yml16
-rw-r--r--config/metrics/counts_all/20210216183904_g_compliance_dashboard.yml16
-rw-r--r--config/metrics/counts_all/20210216183906_g_compliance_audit_events.yml16
-rw-r--r--config/metrics/counts_all/20210216183908_i_compliance_audit_events.yml16
-rw-r--r--config/metrics/counts_all/20210216183910_i_compliance_credential_inventory.yml16
-rw-r--r--config/metrics/counts_all/20210216183912_a_compliance_audit_events_api.yml16
-rw-r--r--config/metrics/counts_all/20210216183914_compliance_unique_visits_for_any_target.yml16
-rw-r--r--config/metrics/license/20210201124932_recorded_at.yml2
-rw-r--r--config/metrics/license/20210201124933_uuid.yml2
-rw-r--r--config/metrics/license/20210204124854_license_management_jobs.yml3
-rw-r--r--config/metrics/license/20210204124926_license_trial_ends_on.yml6
-rw-r--r--config/metrics/license/20210204124928_version.yml6
-rw-r--r--config/metrics/license/20210204124936_version.yml6
-rw-r--r--config/metrics/license/20210204124938_recording_ce_finished_at.yml3
-rw-r--r--config/metrics/license/20210216175601_version.yml19
-rw-r--r--config/metrics/license/20210216175602_installation_type.yml19
-rw-r--r--config/metrics/license/20210216175604_edition.yml19
-rw-r--r--config/metrics/license/20210216175609_version.yml16
-rw-r--r--config/metrics/license/20210216181053_version.yml16
-rw-r--r--config/metrics/license/20210216183237_version.yml16
-rw-r--r--config/metrics/schema.json10
-rw-r--r--config/metrics/settings/20210204124856_instance_auto_devops_enabled.yml6
-rw-r--r--config/metrics/settings/20210204124858_container_registry_enabled.yml6
-rw-r--r--config/metrics/settings/20210204124900_dependency_proxy_enabled.yml6
-rw-r--r--config/metrics/settings/20210204124902_gitlab_shared_runners_enabled.yml6
-rw-r--r--config/metrics/settings/20210204124904_gravatar_enabled.yml6
-rw-r--r--config/metrics/settings/20210204124906_ldap_enabled.yml6
-rw-r--r--config/metrics/settings/20210204124908_mattermost_enabled.yml6
-rw-r--r--config/metrics/settings/20210204124910_omniauth_enabled.yml6
-rw-r--r--config/metrics/settings/20210204124912_prometheus_enabled.yml6
-rw-r--r--config/metrics/settings/20210204124914_prometheus_metrics_enabled.yml6
-rw-r--r--config/metrics/settings/20210204124916_reply_by_email_enabled.yml6
-rw-r--r--config/metrics/settings/20210204124918_signup_enabled.yml6
-rw-r--r--config/metrics/settings/20210204124920_web_ide_clientside_preview_enabled.yml6
-rw-r--r--config/metrics/settings/20210204124922_grafana_link_enabled.yml6
-rw-r--r--config/metrics/settings/20210204124924_elasticsearch_enabled.yml14
-rw-r--r--config/metrics/settings/20210204124934_enabled.yml6
-rw-r--r--config/metrics/settings/20210216175459_ingress_modsecurity_enabled.yml19
-rw-r--r--config/metrics/settings/20210216175606_ldap_encrypted_secrets_enabled.yml19
-rw-r--r--config/metrics/settings/20210216180314_gitpod_enabled.yml19
-rw-r--r--config/metrics/settings/20210216180836_enabled.yml19
-rw-r--r--config/metrics/settings/20210216180838_enabled.yml19
-rw-r--r--config/metrics/settings/20210216180840_direct_upload.yml19
-rw-r--r--config/metrics/settings/20210216180841_background_upload.yml19
-rw-r--r--config/metrics/settings/20210216180845_enabled.yml19
-rw-r--r--config/metrics/settings/20210216180847_enabled.yml19
-rw-r--r--config/metrics/settings/20210216180849_direct_upload.yml19
-rw-r--r--config/metrics/settings/20210216180851_background_upload.yml20
-rw-r--r--config/metrics/settings/20210216180854_enabled.yml19
-rw-r--r--config/metrics/settings/20210216180856_enabled.yml19
-rw-r--r--config/metrics/settings/20210216180858_direct_upload.yml19
-rw-r--r--config/metrics/settings/20210216180900_background_upload.yml19
-rw-r--r--config/metrics/settings/20210216180905_enabled.yml19
-rw-r--r--config/metrics/settings/20210216180907_direct_upload.yml19
-rw-r--r--config/metrics/settings/20210216180909_background_upload.yml19
-rw-r--r--config/metrics/settings/20210216180913_enabled.yml19
-rw-r--r--config/metrics/settings/20210216180915_enabled.yml19
-rw-r--r--config/metrics/settings/20210216180916_direct_upload.yml19
-rw-r--r--config/metrics/settings/20210216180918_background_upload.yml19
-rw-r--r--config/metrics/settings/20210225045628_operating_system.yml20
-rw-r--r--config/puma.example.development.rb2
-rw-r--r--config/puma.rb.example2
-rw-r--r--config/puma_actioncable.example.development.rb2
-rw-r--r--config/routes.rb25
-rw-r--r--config/routes/admin.rb3
-rw-r--r--config/routes/api.rb2
-rw-r--r--config/sidekiq_queues.yml24
-rw-r--r--config/webpack.config.js65
-rw-r--r--config/webpack.vendor.config.js2
-rw-r--r--danger/changelog/Dangerfile6
-rw-r--r--danger/changes_size/Dangerfile4
-rw-r--r--danger/documentation/Dangerfile3
-rw-r--r--danger/feature_flag/Dangerfile2
-rw-r--r--danger/product_intelligence/Dangerfile49
-rw-r--r--db/fixtures/development/26_packages.rb6
-rw-r--r--db/fixtures/development/29_instance_statistics.rb39
-rw-r--r--db/fixtures/development/29_usage_trends.rb40
-rw-r--r--db/fixtures/development/30_composer_packages.rb8
-rw-r--r--db/migrate/20200816133024_add_cve_id_request_project_setting.rb13
-rw-r--r--db/migrate/20201209163113_recreate_index_issue_email_participants_on_issue_id_and_email.rb23
-rw-r--r--db/migrate/20201228110136_create_iterations_cadence.rb29
-rw-r--r--db/migrate/20201228110238_add_iterations_cadence_to_sprints.rb22
-rw-r--r--db/migrate/20210106191305_rename_indexes_on_git_lab_com.rb57
-rw-r--r--db/migrate/20210127152613_add_iterations_cadence_date_range_constraint.rb30
-rw-r--r--db/migrate/20210127202613_remove_iteration_group_date_range_constraint.rb30
-rw-r--r--db/migrate/20210128172149_create_background_migration_tracking_tables.rb59
-rw-r--r--db/migrate/20210201034649_add_active_periods_to_on_call_rotations.rb10
-rw-r--r--db/migrate/20210205134213_add_creator_id_to_custom_emoji.rb23
-rw-r--r--db/migrate/20210208103243_add_issue_created_at_to_onboarding_progress.rb9
-rw-r--r--db/migrate/20210208200914_add_ends_at_to_oncall_rotations.rb9
-rw-r--r--db/migrate/20210209110019_create_external_approval_rules.rb44
-rw-r--r--db/migrate/20210209232508_add_markdown_surround_selection_to_user_preferences.rb21
-rw-r--r--db/migrate/20210212153934_make_the_geo_oauth_application_trusted_by_default.rb20
-rw-r--r--db/migrate/20210212163231_add_merge_when_pipeline_succeeds_to_notification_settings.rb12
-rw-r--r--db/migrate/20210214201118_add_delayed_project_removal_to_namespace_settings.rb9
-rw-r--r--db/migrate/20210214205155_add_index_to_namespaces_delayed_project_removal.rb18
-rw-r--r--db/migrate/20210216122140_add_in_product_marketing_emails_enabled_setting.rb9
-rw-r--r--db/migrate/20210216193620_add_description_to_cluster_token.rb21
-rw-r--r--db/migrate/20210216223335_remove_index_on_issues_where_service_desk_reply_to_is_not_null.rb21
-rw-r--r--db/migrate/20210217101901_create_epic_list_user_preferences.rb20
-rw-r--r--db/migrate/20210218040814_add_environment_scope_to_group_variables.rb45
-rw-r--r--db/migrate/20210218142626_change_finding_fingerprint_enum.rb15
-rw-r--r--db/migrate/20210218144056_add_sprints_start_date_not_null_check_constraint.rb17
-rw-r--r--db/migrate/20210218144656_add_sprints_due_date_not_null_check_constraint.rb17
-rw-r--r--db/migrate/20210219100137_add_creator_foreign_key_to_custom_emoji.rb23
-rw-r--r--db/migrate/20210219111040_add_epic_issue_composite_index.rb18
-rw-r--r--db/migrate/20210222030537_add_is_removed_to_oncall_participant.rb19
-rw-r--r--db/migrate/20210222042745_add_is_removed_index_to_oncall_participant.rb21
-rw-r--r--db/migrate/20210222070356_add_storage_size_to_namespace_statistics.rb19
-rw-r--r--db/migrate/20210222070413_add_wiki_size_to_namespace_statistics.rb19
-rw-r--r--db/migrate/20210222085529_add_epic_board_user_preference_user_fk.rb19
-rw-r--r--db/migrate/20210222085551_add_epic_board_user_preference_epic_list_fk.rb19
-rw-r--r--db/migrate/20210222105120_add_container_registry_access_level.rb25
-rw-r--r--db/migrate/20210223053451_add_branch_name_to_dast_profile.rb23
-rw-r--r--db/migrate/20210223132934_add_foreign_key_to_external_approval_rules.rb18
-rw-r--r--db/migrate/20210223133116_add_foreign_key_to_external_approval_rules_protected_branches.rb18
-rw-r--r--db/migrate/20210224132547_add_null_constraint_to_terraform_state_name.rb11
-rw-r--r--db/migrate/20210224133337_add_name_field_to_cluster_agent_token.rb12
-rw-r--r--db/migrate/20210225090801_create_dora_daily_metrics.rb31
-rw-r--r--db/migrate/20210225135533_limit_cluster_token_size.rb17
-rw-r--r--db/migrate/20210225153522_add_allow_force_push_to_protected_branches.rb19
-rw-r--r--db/migrate/20210301150451_add_tier_to_environments.rb19
-rw-r--r--db/migrate/20210301200601_rename_asset_proxy_allowlist_on_application_settings.rb8
-rw-r--r--db/migrate/20210302103851_add_deployed_deployment_id_index_to_project_pages_metadata.rb19
-rw-r--r--db/migrate/20210302155904_remove_index_for_security_orchestration_policy.rb18
-rw-r--r--db/migrate/20210302160544_add_index_to_security_orchestration_policy.rb18
-rw-r--r--db/migrate/20210302212623_rename_vuln_fingerprints_indexes.rb35
-rw-r--r--db/migrate/20210303053341_add_last_edited_at_and_last_edited_by_id_to_notes.rb19
-rw-r--r--db/migrate/20210303091651_add_index_to_environments_tier.rb19
-rw-r--r--db/migrate/20210303165201_add_index_for_succeeded_deployments.rb18
-rw-r--r--db/migrate/20210303165301_add_not_null_constraint_to_cluster_token_name.rb18
-rw-r--r--db/migrate/20210305002016_update_terraform_states_locked_by_user_id_foreign_key.rb29
-rw-r--r--db/migrate/20210305013509_add_text_limit_to_group_ci_variables_environment_scope.rb17
-rw-r--r--db/migrate/20210306121300_partition_web_hook_logs.rb19
-rw-r--r--db/migrate/20210308125742_add_info_column_into_security_scans_table.rb9
-rw-r--r--db/migrate/20210308190413_change_batched_background_migrations_batch_class_name_default.rb10
-rw-r--r--db/migrate/20210309181019_add_last_used_at_to_cluster_agent_token.rb9
-rw-r--r--db/post_migrate/20190402224749_schedule_merge_request_assignees_migration_progress_check.rb18
-rw-r--r--db/post_migrate/20201112130715_schedule_recalculate_uuid_on_vulnerabilities_occurrences.rb37
-rw-r--r--db/post_migrate/20201231133921_schedule_set_default_iteration_cadences.rb26
-rw-r--r--db/post_migrate/20210105052229_clean_up_asset_proxy_whitelist_rename_on_application_settings.rb10
-rw-r--r--db/post_migrate/20210111075105_schedule_uuid_population_for_security_findings.rb8
-rw-r--r--db/post_migrate/20210111075206_schedule_uuid_population_for_security_findings2.rb34
-rw-r--r--db/post_migrate/20210210093901_backfill_updated_at_after_repository_storage_move.rb6
-rw-r--r--db/post_migrate/20210210221006_cleanup_projects_with_bad_has_external_issue_tracker_data.rb84
-rw-r--r--db/post_migrate/20210215095328_migrate_delayed_project_removal_from_namespaces_to_namespace_settings.rb28
-rw-r--r--db/post_migrate/20210215144909_migrate_usage_trends_sidekiq_queue.rb19
-rw-r--r--db/post_migrate/20210217100728_move_create_release_evidence_queue_out_of_cronjob_namespace.rb16
-rw-r--r--db/post_migrate/20210218105431_remove_deprecated_ci_builds_columns.rb36
-rw-r--r--db/post_migrate/20210218110552_remove_deprecated_ci_runner_column.rb22
-rw-r--r--db/post_migrate/20210219102900_reschedule_set_default_iteration_cadences.rb30
-rw-r--r--db/post_migrate/20210222185538_remove_backup_labels_foreign_keys.rb21
-rw-r--r--db/post_migrate/20210222192144_remove_backup_labels_table.rb36
-rw-r--r--db/post_migrate/20210224150506_reschedule_artifact_expiry_backfill.rb44
-rw-r--r--db/post_migrate/20210302074524_backfill_namespace_statistics_with_wiki_size.rb29
-rw-r--r--db/post_migrate/20210303064112_add_not_null_constraints_to_gitlab_subscriptions_namespace_id.rb19
-rw-r--r--db/post_migrate/20210303064142_cleanup_gitlab_subscriptions_with_null_namespace_id.rb24
-rw-r--r--db/post_migrate/20210303165302_cleanup_cluster_tokens_with_null_name.rb25
-rw-r--r--db/post_migrate/20210304133508_schedule_remove_duplicate_vulnerabilities_findings2.rb32
-rw-r--r--db/post_migrate/20210306121310_backfill_partitioned_web_hook_logs.rb17
-rw-r--r--db/schema_migrations/201904022247491
-rw-r--r--db/schema_migrations/202008161330241
-rw-r--r--db/schema_migrations/202011121307151
-rw-r--r--db/schema_migrations/202012091631131
-rw-r--r--db/schema_migrations/202012281101361
-rw-r--r--db/schema_migrations/202012281102381
-rw-r--r--db/schema_migrations/202012311339211
-rw-r--r--db/schema_migrations/202101061913051
-rw-r--r--db/schema_migrations/202101110752061
-rw-r--r--db/schema_migrations/202101271526131
-rw-r--r--db/schema_migrations/202101272026131
-rw-r--r--db/schema_migrations/202101281721491
-rw-r--r--db/schema_migrations/202102010346491
-rw-r--r--db/schema_migrations/202102051342131
-rw-r--r--db/schema_migrations/202102081032431
-rw-r--r--db/schema_migrations/202102082009141
-rw-r--r--db/schema_migrations/202102091100191
-rw-r--r--db/schema_migrations/202102092325081
-rw-r--r--db/schema_migrations/202102102210061
-rw-r--r--db/schema_migrations/202102121539341
-rw-r--r--db/schema_migrations/202102121632311
-rw-r--r--db/schema_migrations/202102142011181
-rw-r--r--db/schema_migrations/202102142051551
-rw-r--r--db/schema_migrations/202102150953281
-rw-r--r--db/schema_migrations/202102151449091
-rw-r--r--db/schema_migrations/202102161221401
-rw-r--r--db/schema_migrations/202102161936201
-rw-r--r--db/schema_migrations/202102162233351
-rw-r--r--db/schema_migrations/202102171007281
-rw-r--r--db/schema_migrations/202102171019011
-rw-r--r--db/schema_migrations/202102180408141
-rw-r--r--db/schema_migrations/202102181054311
-rw-r--r--db/schema_migrations/202102181105521
-rw-r--r--db/schema_migrations/202102181426261
-rw-r--r--db/schema_migrations/202102181440561
-rw-r--r--db/schema_migrations/202102181446561
-rw-r--r--db/schema_migrations/202102191001371
-rw-r--r--db/schema_migrations/202102191029001
-rw-r--r--db/schema_migrations/202102191110401
-rw-r--r--db/schema_migrations/202102220305371
-rw-r--r--db/schema_migrations/202102220427451
-rw-r--r--db/schema_migrations/202102220703561
-rw-r--r--db/schema_migrations/202102220704131
-rw-r--r--db/schema_migrations/202102220855291
-rw-r--r--db/schema_migrations/202102220855511
-rw-r--r--db/schema_migrations/202102221051201
-rw-r--r--db/schema_migrations/202102221855381
-rw-r--r--db/schema_migrations/202102221921441
-rw-r--r--db/schema_migrations/202102230534511
-rw-r--r--db/schema_migrations/202102231329341
-rw-r--r--db/schema_migrations/202102231331161
-rw-r--r--db/schema_migrations/202102241325471
-rw-r--r--db/schema_migrations/202102241333371
-rw-r--r--db/schema_migrations/202102241505061
-rw-r--r--db/schema_migrations/202102250908011
-rw-r--r--db/schema_migrations/202102251355331
-rw-r--r--db/schema_migrations/202102251535221
-rw-r--r--db/schema_migrations/202103011504511
-rw-r--r--db/schema_migrations/202103020745241
-rw-r--r--db/schema_migrations/202103021038511
-rw-r--r--db/schema_migrations/202103021559041
-rw-r--r--db/schema_migrations/202103021605441
-rw-r--r--db/schema_migrations/202103022126231
-rw-r--r--db/schema_migrations/202103030533411
-rw-r--r--db/schema_migrations/202103030641121
-rw-r--r--db/schema_migrations/202103030641421
-rw-r--r--db/schema_migrations/202103030916511
-rw-r--r--db/schema_migrations/202103031652011
-rw-r--r--db/schema_migrations/202103031653011
-rw-r--r--db/schema_migrations/202103031653021
-rw-r--r--db/schema_migrations/202103041335081
-rw-r--r--db/schema_migrations/202103050020161
-rw-r--r--db/schema_migrations/202103050135091
-rw-r--r--db/schema_migrations/202103061213001
-rw-r--r--db/schema_migrations/202103061213101
-rw-r--r--db/schema_migrations/202103081257421
-rw-r--r--db/schema_migrations/202103081904131
-rw-r--r--db/schema_migrations/202103091810191
-rw-r--r--db/structure.sql468
-rw-r--r--doc/.vale/gitlab/Admin.yml2
-rw-r--r--doc/.vale/gitlab/AlertBoxStyle.yml2
-rw-r--r--doc/.vale/gitlab/BadgeCapitalization.yml33
-rw-r--r--doc/.vale/gitlab/DefaultBranch.yml14
-rw-r--r--doc/.vale/gitlab/RelativeLinksDoubleSlashes.yml13
-rw-r--r--doc/.vale/gitlab/SubstitutionSuggestions.yml1
-rw-r--r--doc/.vale/gitlab/spelling-exceptions.txt31
-rw-r--r--doc/README.md2
-rw-r--r--doc/administration/audit_events.md2
-rw-r--r--doc/administration/auth/img/okta_admin_panel.pngbin26164 -> 0 bytes
-rw-r--r--doc/administration/auth/ldap/google_secure_ldap.md2
-rw-r--r--doc/administration/auth/ldap/index.md17
-rw-r--r--doc/administration/auth/ldap/ldap-troubleshooting.md6
-rw-r--r--doc/administration/compliance.md2
-rw-r--r--doc/administration/consul.md2
-rw-r--r--doc/administration/feature_flags.md2
-rw-r--r--doc/administration/geo/disaster_recovery/background_verification.md10
-rw-r--r--doc/administration/geo/disaster_recovery/planned_failover.md2
-rw-r--r--doc/administration/geo/glossary.md2
-rw-r--r--doc/administration/geo/replication/configuration.md2
-rw-r--r--doc/administration/geo/replication/datatypes.md26
-rw-r--r--doc/administration/geo/replication/location_aware_git_url.md4
-rw-r--r--doc/administration/geo/replication/remove_geo_node.md2
-rw-r--r--doc/administration/geo/replication/troubleshooting.md2
-rw-r--r--doc/administration/geo/replication/version_specific_updates.md8
-rw-r--r--doc/administration/geo/setup/database.md2
-rw-r--r--doc/administration/geo/setup/external_database.md2
-rw-r--r--doc/administration/gitaly/configure_gitaly.md943
-rw-r--r--doc/administration/gitaly/img/gitaly_network_13_9.pngbin0 -> 9791 bytes
-rw-r--r--doc/administration/gitaly/index.md935
-rw-r--r--doc/administration/gitaly/praefect.md4
-rw-r--r--doc/administration/gitaly/reference.md2
-rw-r--r--doc/administration/index.md4
-rw-r--r--doc/administration/instance_limits.md4
-rw-r--r--doc/administration/integration/kroki.md2
-rw-r--r--doc/administration/integration/plantuml.md297
-rw-r--r--doc/administration/integration/terminal.md2
-rw-r--r--doc/administration/invalidate_markdown_cache.md4
-rw-r--r--doc/administration/issue_closing_pattern.md6
-rw-r--r--doc/administration/logs.md8
-rw-r--r--doc/administration/maintenance_mode/index.md2
-rw-r--r--doc/administration/monitoring/gitlab_self_monitoring_project/index.md4
-rw-r--r--doc/administration/monitoring/index.md22
-rw-r--r--doc/administration/monitoring/performance/gitlab_configuration.md2
-rw-r--r--doc/administration/monitoring/performance/grafana_configuration.md2
-rw-r--r--doc/administration/monitoring/performance/performance_bar.md6
-rw-r--r--doc/administration/monitoring/performance/request_profiling.md2
-rw-r--r--doc/administration/monitoring/prometheus/gitlab_metrics.md190
-rw-r--r--doc/administration/nfs.md23
-rw-r--r--doc/administration/object_storage.md16
-rw-r--r--doc/administration/operations/fast_ssh_key_lookup.md5
-rw-r--r--doc/administration/operations/moving_repositories.md2
-rw-r--r--doc/administration/operations/rails_console.md20
-rw-r--r--doc/administration/packages/container_registry.md98
-rw-r--r--doc/administration/packages/dependency_proxy.md4
-rw-r--r--doc/administration/packages/index.md4
-rw-r--r--doc/administration/pages/index.md202
-rw-r--r--doc/administration/postgresql/replication_and_failover.md7
-rw-r--r--doc/administration/pseudonymizer.md4
-rw-r--r--doc/administration/raketasks/check.md6
-rw-r--r--doc/administration/raketasks/github_import.md4
-rw-r--r--doc/administration/raketasks/maintenance.md7
-rw-r--r--doc/administration/reference_architectures/10k_users.md81
-rw-r--r--doc/administration/reference_architectures/25k_users.md886
-rw-r--r--doc/administration/reference_architectures/2k_users.md39
-rw-r--r--doc/administration/reference_architectures/3k_users.md863
-rw-r--r--doc/administration/reference_architectures/50k_users.md900
-rw-r--r--doc/administration/reference_architectures/5k_users.md841
-rw-r--r--doc/administration/reference_architectures/index.md4
-rw-r--r--doc/administration/reference_architectures/troubleshooting.md4
-rw-r--r--doc/administration/repository_checks.md2
-rw-r--r--doc/administration/repository_storage_paths.md38
-rw-r--r--doc/administration/repository_storage_types.md266
-rw-r--r--doc/administration/server_hooks.md12
-rw-r--r--doc/administration/static_objects_external_storage.md4
-rw-r--r--doc/administration/terraform_state.md29
-rw-r--r--doc/administration/troubleshooting/debug.md6
-rw-r--r--doc/administration/troubleshooting/elasticsearch.md23
-rw-r--r--doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md61
-rw-r--r--doc/administration/troubleshooting/log_parsing.md14
-rw-r--r--doc/administration/uploads.md2
-rw-r--r--doc/api/README.md16
-rw-r--r--doc/api/api_resources.md2
-rw-r--r--doc/api/branches.md4
-rw-r--r--doc/api/commits.md28
-rw-r--r--doc/api/deployments.md4
-rw-r--r--doc/api/discussions.md23
-rw-r--r--doc/api/dora4_group_analytics.md6
-rw-r--r--doc/api/dora4_project_analytics.md2
-rw-r--r--doc/api/feature_flags.md2
-rw-r--r--doc/api/geo_nodes.md14
-rw-r--r--doc/api/graphql/index.md52
-rw-r--r--doc/api/graphql/reference/gitlab_schema.graphql29539
-rw-r--r--doc/api/graphql/reference/gitlab_schema.json85944
-rw-r--r--doc/api/graphql/reference/index.md1994
-rw-r--r--doc/api/graphql/removed_items.md2
-rw-r--r--doc/api/group_repository_storage_moves.md4
-rw-r--r--doc/api/groups.md2
-rw-r--r--doc/api/invitations.md32
-rw-r--r--doc/api/issues.md2
-rw-r--r--doc/api/jobs.md70
-rw-r--r--doc/api/members.md23
-rw-r--r--doc/api/merge_request_approvals.md132
-rw-r--r--doc/api/merge_request_context_commits.md2
-rw-r--r--doc/api/merge_requests.md15
-rw-r--r--doc/api/merge_trains.md2
-rw-r--r--doc/api/notification_settings.md3
-rw-r--r--doc/api/oauth2.md21
-rw-r--r--doc/api/openapi/openapi_interactive.md2
-rw-r--r--doc/api/plan_limits.md81
-rw-r--r--doc/api/project_badges.md12
-rw-r--r--doc/api/project_import_export.md10
-rw-r--r--doc/api/project_repository_storage_moves.md4
-rw-r--r--doc/api/project_snippets.md2
-rw-r--r--doc/api/project_templates.md6
-rw-r--r--doc/api/project_vulnerabilities.md8
-rw-r--r--doc/api/projects.md91
-rw-r--r--doc/api/protected_branches.md23
-rw-r--r--doc/api/releases/index.md6
-rw-r--r--doc/api/remote_mirrors.md4
-rw-r--r--doc/api/repositories.md88
-rw-r--r--doc/api/repository_submodules.md2
-rw-r--r--doc/api/resource_access_tokens.md3
-rw-r--r--doc/api/search.md30
-rw-r--r--doc/api/services.md2
-rw-r--r--doc/api/settings.md9
-rw-r--r--doc/api/snippet_repository_storage_moves.md4
-rw-r--r--doc/api/snippets.md12
-rw-r--r--doc/api/tags.md7
-rw-r--r--doc/api/users.md31
-rw-r--r--doc/api/vulnerability_findings.md2
-rw-r--r--doc/api/wikis.md2
-rw-r--r--doc/architecture/blueprints/container_registry_metadata_database/index.md359
-rw-r--r--doc/ci/README.md3
-rw-r--r--doc/ci/ci_cd_for_external_repos/github_integration.md2
-rw-r--r--doc/ci/cloud_deployment/ecs/img/container-name.pngbin0 -> 8813 bytes
-rw-r--r--doc/ci/cloud_deployment/ecs/img/container-port-mapping.pngbin0 -> 8994 bytes
-rw-r--r--doc/ci/cloud_deployment/ecs/img/ecs-launch-status.pngbin0 -> 13587 bytes
-rw-r--r--doc/ci/cloud_deployment/ecs/img/ecs-policy.pngbin0 -> 10342 bytes
-rw-r--r--doc/ci/cloud_deployment/ecs/img/ecs-task-definitions.pngbin0 -> 10367 bytes
-rw-r--r--doc/ci/cloud_deployment/ecs/img/initial-pipeline.pngbin0 -> 8114 bytes
-rw-r--r--doc/ci/cloud_deployment/ecs/img/rails-template.pngbin0 -> 13497 bytes
-rw-r--r--doc/ci/cloud_deployment/ecs/img/registry.pngbin0 -> 5647 bytes
-rw-r--r--doc/ci/cloud_deployment/ecs/img/service-parameter.pngbin0 -> 8170 bytes
-rw-r--r--doc/ci/cloud_deployment/ecs/img/service-running.pngbin0 -> 5207 bytes
-rw-r--r--doc/ci/cloud_deployment/ecs/img/view-running-app-2.pngbin0 -> 5082 bytes
-rw-r--r--doc/ci/cloud_deployment/ecs/img/view-running-app.pngbin0 -> 5181 bytes
-rw-r--r--doc/ci/cloud_deployment/ecs/quick_start_guide.md250
-rw-r--r--doc/ci/cloud_deployment/index.md9
-rw-r--r--doc/ci/docker/index.md19
-rw-r--r--doc/ci/docker/using_docker_build.md101
-rw-r--r--doc/ci/docker/using_docker_images.md30
-rw-r--r--doc/ci/docker/using_kaniko.md2
-rw-r--r--doc/ci/environments/deployment_safety.md8
-rw-r--r--doc/ci/environments/img/deployments_list.pngbin0 -> 18119 bytes
-rw-r--r--doc/ci/environments/img/environment_auto_stop_v13_10.pngbin0 -> 53602 bytes
-rw-r--r--doc/ci/environments/img/environments_dynamic_groups_v13_10.pngbin0 -> 57387 bytes
-rw-r--r--doc/ci/environments/img/environments_list.pngbin0 -> 17379 bytes
-rw-r--r--doc/ci/environments/img/environments_terminal_button_on_index_v13_10.pngbin0 -> 42113 bytes
-rw-r--r--doc/ci/environments/img/environments_terminal_button_on_show_v13_10.pngbin0 -> 53590 bytes
-rw-r--r--doc/ci/environments/index.md848
-rw-r--r--doc/ci/environments/protected_environments.md16
-rw-r--r--doc/ci/examples/README.md6
-rw-r--r--doc/ci/examples/authenticating-with-hashicorp-vault/index.md6
-rw-r--r--doc/ci/examples/deployment/README.md4
-rw-r--r--doc/ci/examples/deployment/composer-npm-deploy.md2
-rw-r--r--doc/ci/examples/end_to_end_testing_webdriverio/index.md22
-rw-r--r--doc/ci/examples/laravel_with_gitlab_and_envoy/index.md4
-rw-r--r--doc/ci/examples/semantic-release.md4
-rw-r--r--doc/ci/examples/test-and-deploy-python-application-to-heroku.md101
-rw-r--r--doc/ci/examples/test-and-deploy-ruby-application-to-heroku.md97
-rw-r--r--doc/ci/examples/test-clojure-application.md46
-rw-r--r--doc/ci/git_submodules.md96
-rw-r--r--doc/ci/img/deployments_view.pngbin23501 -> 12385 bytes
-rw-r--r--doc/ci/img/environment_auto_stop_v12_8.pngbin16587 -> 0 bytes
-rw-r--r--doc/ci/img/environments_available_13_10.pngbin0 -> 13245 bytes
-rw-r--r--doc/ci/img/environments_available_13_7.pngbin29124 -> 0 bytes
-rw-r--r--doc/ci/img/environments_dynamic_groups.pngbin21902 -> 0 bytes
-rw-r--r--doc/ci/img/environments_manual_action_deployments.pngbin12635 -> 0 bytes
-rw-r--r--doc/ci/img/environments_manual_action_environments.pngbin9485 -> 0 bytes
-rw-r--r--doc/ci/img/environments_manual_action_jobs.pngbin8446 -> 0 bytes
-rw-r--r--doc/ci/img/environments_manual_action_pipelines.pngbin14979 -> 0 bytes
-rw-r--r--doc/ci/img/environments_manual_action_single_pipeline.pngbin10273 -> 0 bytes
-rw-r--r--doc/ci/img/environments_terminal_button_on_index.pngbin11080 -> 0 bytes
-rw-r--r--doc/ci/img/environments_terminal_button_on_show.pngbin7642 -> 0 bytes
-rw-r--r--doc/ci/jobs/index.md4
-rw-r--r--doc/ci/merge_request_pipelines/index.md2
-rw-r--r--doc/ci/merge_request_pipelines/pipelines_for_merged_results/index.md2
-rw-r--r--doc/ci/metrics_reports.md10
-rw-r--r--doc/ci/multi_project_pipelines.md2
-rw-r--r--doc/ci/pipeline_editor/index.md39
-rw-r--r--doc/ci/pipelines/img/pipelines_settings_test_coverage.pngbin2549 -> 0 bytes
-rw-r--r--doc/ci/pipelines/index.md8
-rw-r--r--doc/ci/pipelines/schedules.md2
-rw-r--r--doc/ci/pipelines/settings.md106
-rw-r--r--doc/ci/quick_start/index.md15
-rw-r--r--doc/ci/review_apps/index.md16
-rw-r--r--doc/ci/runners/README.md4
-rw-r--r--doc/ci/ssh_keys/index.md6
-rw-r--r--doc/ci/test_cases/img/test_case_list_v13_6.pngbin70726 -> 0 bytes
-rw-r--r--doc/ci/test_cases/img/test_case_show_v13_10.pngbin0 -> 27067 bytes
-rw-r--r--doc/ci/test_cases/img/test_case_show_v13_6.pngbin63772 -> 0 bytes
-rw-r--r--doc/ci/test_cases/index.md12
-rw-r--r--doc/ci/triggers/README.md22
-rw-r--r--doc/ci/troubleshooting.md10
-rw-r--r--doc/ci/unit_test_reports.md6
-rw-r--r--doc/ci/variables/README.md4
-rw-r--r--doc/ci/variables/predefined_variables.md284
-rw-r--r--doc/ci/variables/where_variables_can_be_used.md1
-rw-r--r--doc/ci/yaml/README.md1021
-rw-r--r--doc/ci/yaml/gitlab_ci_yaml.md3
-rw-r--r--doc/ci/yaml/script.md35
-rw-r--r--doc/development/README.md3
-rw-r--r--doc/development/agent/user_stories.md2
-rw-r--r--doc/development/api_graphql_styleguide.md54
-rw-r--r--doc/development/application_limits.md12
-rw-r--r--doc/development/appsec/index.md32
-rw-r--r--doc/development/architecture.md18
-rw-r--r--doc/development/auto_devops.md6
-rw-r--r--doc/development/build_test_package.md4
-rw-r--r--doc/development/changelog.md5
-rw-r--r--doc/development/chatops_on_gitlabcom.md2
-rw-r--r--doc/development/cicd/templates.md6
-rw-r--r--doc/development/code_intelligence/index.md2
-rw-r--r--doc/development/code_review.md10
-rw-r--r--doc/development/contributing/issue_workflow.md2
-rw-r--r--doc/development/contributing/merge_request_workflow.md5
-rw-r--r--doc/development/contributing/style_guides.md16
-rw-r--r--doc/development/database/client_side_connection_pool.md2
-rw-r--r--doc/development/database/index.md1
-rw-r--r--doc/development/database/setting_multiple_values.md59
-rw-r--r--doc/development/database_query_comments.md17
-rw-r--r--doc/development/directory_structure.md58
-rw-r--r--doc/development/distributed_tracing.md2
-rw-r--r--doc/development/documentation/feature_flags.md6
-rw-r--r--doc/development/documentation/site_architecture/index.md4
-rw-r--r--doc/development/documentation/site_architecture/release_process.md228
-rw-r--r--doc/development/documentation/styleguide.md8
-rw-r--r--doc/development/documentation/styleguide/index.md37
-rw-r--r--doc/development/documentation/testing.md6
-rw-r--r--doc/development/elasticsearch.md105
-rw-r--r--doc/development/experiment_guide/experimentation.md399
-rw-r--r--doc/development/experiment_guide/gitlab_experiment.md547
-rw-r--r--doc/development/experiment_guide/index.md397
-rw-r--r--doc/development/export_csv.md2
-rw-r--r--doc/development/fe_guide/accessibility.md193
-rw-r--r--doc/development/fe_guide/architecture.md7
-rw-r--r--doc/development/fe_guide/dark_mode.md4
-rw-r--r--doc/development/fe_guide/dependencies.md2
-rw-r--r--doc/development/fe_guide/editor_lite.md222
-rw-r--r--doc/development/fe_guide/graphql.md61
-rw-r--r--doc/development/fe_guide/index.md2
-rw-r--r--doc/development/fe_guide/security.md2
-rw-r--r--doc/development/fe_guide/style/html.md23
-rw-r--r--doc/development/fe_guide/style/index.md2
-rw-r--r--doc/development/fe_guide/style/javascript.md23
-rw-r--r--doc/development/fe_guide/style/scss.md12
-rw-r--r--doc/development/fe_guide/style/vue.md36
-rw-r--r--doc/development/fe_guide/tooling.md91
-rw-r--r--doc/development/fe_guide/vue.md8
-rw-r--r--doc/development/fe_guide/vuex.md11
-rw-r--r--doc/development/fe_guide/widgets.md143
-rw-r--r--doc/development/feature_flags/controls.md18
-rw-r--r--doc/development/feature_flags/development.md594
-rw-r--r--doc/development/feature_flags/index.md657
-rw-r--r--doc/development/feature_flags/process.md177
-rw-r--r--doc/development/features_inside_dot_gitlab.md4
-rw-r--r--doc/development/gemfile.md55
-rw-r--r--doc/development/git_object_deduplication.md5
-rw-r--r--doc/development/go_guide/index.md16
-rw-r--r--doc/development/graphql_guide/graphql_pro.md4
-rw-r--r--doc/development/graphql_guide/index.md2
-rw-r--r--doc/development/i18n/translation.md12
-rw-r--r--doc/development/image_scaling.md2
-rw-r--r--doc/development/integrations/jenkins.md58
-rw-r--r--doc/development/integrations/jira_connect.md2
-rw-r--r--doc/development/integrations/secure.md34
-rw-r--r--doc/development/integrations/secure_partner_integration.md4
-rw-r--r--doc/development/internal_api.md16
-rw-r--r--doc/development/licensed_feature_availability.md10
-rw-r--r--doc/development/maintenance_mode.md2
-rw-r--r--doc/development/merge_request_performance_guidelines.md2
-rw-r--r--doc/development/migration_style_guide.md33
-rw-r--r--doc/development/multi_version_compatibility.md2
-rw-r--r--doc/development/namespaces_storage_statistics.md6
-rw-r--r--doc/development/new_fe_guide/development/components.md2
-rw-r--r--doc/development/new_fe_guide/tips.md8
-rw-r--r--doc/development/packages.md60
-rw-r--r--doc/development/performance.md111
-rw-r--r--doc/development/pipelines.md35
-rw-r--r--doc/development/product_analytics/usage_ping.md4
-rw-r--r--doc/development/prometheus.md8
-rw-r--r--doc/development/query_performance.md4
-rw-r--r--doc/development/rake_tasks.md4
-rw-r--r--doc/development/redis.md9
-rw-r--r--doc/development/secure_coding_guidelines.md2
-rw-r--r--doc/development/service_measurement.md2
-rw-r--r--doc/development/sidekiq_style_guide.md2
-rw-r--r--doc/development/snowplow.md7
-rw-r--r--doc/development/sql.md14
-rw-r--r--doc/development/testing_guide/best_practices.md16
-rw-r--r--doc/development/testing_guide/end_to_end/best_practices.md6
-rw-r--r--doc/development/testing_guide/end_to_end/dynamic_element_validation.md6
-rw-r--r--doc/development/testing_guide/end_to_end/environment_selection.md2
-rw-r--r--doc/development/testing_guide/end_to_end/feature_flags.md4
-rw-r--r--doc/development/testing_guide/end_to_end/page_objects.md2
-rw-r--r--doc/development/testing_guide/end_to_end/running_tests_that_require_special_setup.md2
-rw-r--r--doc/development/testing_guide/end_to_end/style_guide.md2
-rw-r--r--doc/development/testing_guide/frontend_testing.md161
-rw-r--r--doc/development/testing_guide/review_apps.md4
-rw-r--r--doc/development/transient/prevention-patterns.md2
-rw-r--r--doc/development/usage_ping.md1189
-rw-r--r--doc/development/usage_ping/dictionary.md18038
-rw-r--r--doc/development/usage_ping/index.md1337
-rw-r--r--doc/development/usage_ping/metrics_dictionary.md33
-rw-r--r--doc/development/usage_ping/product_intelligence_review.md80
-rw-r--r--doc/development/wikis.md2
-rw-r--r--doc/gitlab-basics/create-branch.md2
-rw-r--r--doc/gitlab-basics/feature_branch_workflow.md2
-rw-r--r--doc/gitlab-basics/index.md6
-rw-r--r--doc/gitlab-basics/start-using-git.md61
-rw-r--r--doc/install/aws/index.md29
-rw-r--r--doc/install/azure/index.md6
-rw-r--r--doc/install/digitaloceandocker.md2
-rw-r--r--doc/install/docker.md2
-rw-r--r--doc/install/google_cloud_platform/index.md2
-rw-r--r--doc/install/index.md105
-rw-r--r--doc/install/installation.md15
-rw-r--r--doc/install/openshift_and_gitlab/index.md4
-rw-r--r--doc/install/postgresql_extensions.md10
-rw-r--r--doc/install/relative_url.md2
-rw-r--r--doc/install/requirements.md29
-rw-r--r--doc/integration/README.md5
-rw-r--r--doc/integration/akismet.md2
-rw-r--r--doc/integration/auth0.md2
-rw-r--r--doc/integration/azure.md106
-rw-r--r--doc/integration/bitbucket.md11
-rw-r--r--doc/integration/cas.md2
-rw-r--r--doc/integration/elasticsearch.md85
-rw-r--r--doc/integration/external-issue-tracker.md2
-rw-r--r--doc/integration/facebook.md2
-rw-r--r--doc/integration/github.md17
-rw-r--r--doc/integration/gitlab.md2
-rw-r--r--doc/integration/gitpod.md7
-rw-r--r--doc/integration/gmail_action_buttons_for_gitlab.md2
-rw-r--r--doc/integration/google.md2
-rw-r--r--doc/integration/img/oauth_provider_admin_application.pngbin17071 -> 0 bytes
-rw-r--r--doc/integration/jenkins.md14
-rw-r--r--doc/integration/jenkins_deprecated.md4
-rw-r--r--doc/integration/oauth2_generic.md2
-rw-r--r--doc/integration/omniauth.md3
-rw-r--r--doc/integration/openid_connect_provider.md2
-rw-r--r--doc/integration/recaptcha.md2
-rw-r--r--doc/integration/salesforce.md2
-rw-r--r--doc/integration/saml.md20
-rw-r--r--doc/integration/shibboleth.md2
-rw-r--r--doc/integration/slash_commands.md2
-rw-r--r--doc/integration/trello_power_up.md2
-rw-r--r--doc/integration/twitter.md2
-rw-r--r--doc/intro/index.md2
-rw-r--r--doc/operations/feature_flags.md6
-rw-r--r--doc/operations/incident_management/incidents.md2
-rw-r--r--doc/operations/incident_management/integrations.md4
-rw-r--r--doc/operations/incident_management/paging.md12
-rw-r--r--doc/operations/incident_management/status_page.md2
-rw-r--r--doc/operations/metrics/dashboards/variables.md2
-rw-r--r--doc/operations/metrics/embed.md4
-rw-r--r--doc/raketasks/backup_restore.md6
-rw-r--r--doc/raketasks/index.md2
-rw-r--r--doc/security/README.md1
-rw-r--r--doc/security/token_overview.md108
-rw-r--r--doc/security/two_factor_authentication.md13
-rw-r--r--doc/ssh/README.md312
-rw-r--r--doc/subscriptions/bronze_starter.md15
-rw-r--r--doc/subscriptions/gitlab_com/index.md4
-rw-r--r--doc/topics/autodevops/customize.md66
-rw-r--r--doc/topics/autodevops/img/alexj_autodevops_min_v13_8.pngbin20836 -> 0 bytes
-rw-r--r--doc/topics/autodevops/img/kai_autodevops_min_v13_8.pngbin39770 -> 0 bytes
-rw-r--r--doc/topics/autodevops/index.md510
-rw-r--r--doc/topics/autodevops/quick_start_guide.md8
-rw-r--r--doc/topics/autodevops/requirements.md12
-rw-r--r--doc/topics/autodevops/stages.md108
-rw-r--r--doc/topics/autodevops/troubleshooting.md247
-rw-r--r--doc/topics/autodevops/upgrading_auto_deploy_dependencies.md10
-rw-r--r--doc/topics/autodevops/upgrading_postgresql.md4
-rw-r--r--doc/topics/git/cherry_picking.md53
-rw-r--r--doc/topics/git/feature_branch_development.md6
-rw-r--r--doc/topics/git/how_to_install_git/index.md4
-rw-r--r--doc/topics/git/index.md8
-rw-r--r--doc/topics/git/lfs/index.md43
-rw-r--r--doc/topics/git/numerous_undo_possibilities_in_git/index.md2
-rw-r--r--doc/topics/git/partial_clone.md14
-rw-r--r--doc/topics/git/tags.md41
-rw-r--r--doc/topics/git/troubleshooting_git.md2
-rw-r--r--doc/topics/gitlab_flow.md2
-rw-r--r--doc/university/index.md6
-rw-r--r--doc/university/training/gitlab_flow/feature_branches.pngbin6202 -> 0 bytes
-rw-r--r--doc/university/training/index.md1
-rw-r--r--doc/university/training/topics/cherry_picking.md36
-rw-r--r--doc/university/training/topics/tags.md52
-rw-r--r--doc/update/index.md70
-rw-r--r--doc/update/upgrading_from_ce_to_ee.md4
-rw-r--r--doc/update/upgrading_from_source.md163
-rw-r--r--doc/user/abuse_reports.md4
-rw-r--r--doc/user/admin_area/analytics/index.md1
-rw-r--r--doc/user/admin_area/analytics/instance_statistics.md8
-rw-r--r--doc/user/admin_area/analytics/usage_trends.md19
-rw-r--r--doc/user/admin_area/analytics/user_cohorts.md36
-rw-r--r--doc/user/admin_area/approving_users.md49
-rw-r--r--doc/user/admin_area/credentials_inventory.md44
-rw-r--r--doc/user/admin_area/img/cohorts_v13_9.png (renamed from doc/user/admin_area/analytics/img/cohorts_v13_9.png)bin62434 -> 62434 bytes
-rw-r--r--doc/user/admin_area/img/credentials_inventory_gpg_keys_v13_10.pngbin0 -> 62501 bytes
-rw-r--r--doc/user/admin_area/img/credentials_inventory_v13_10.pngbin0 -> 100241 bytes
-rw-r--r--doc/user/admin_area/img/credentials_inventory_v13_4.pngbin28945 -> 0 bytes
-rw-r--r--doc/user/admin_area/index.md24
-rw-r--r--doc/user/admin_area/license.md2
-rw-r--r--doc/user/admin_area/settings/account_and_limit_settings.md28
-rw-r--r--doc/user/admin_area/settings/continuous_integration.md17
-rw-r--r--doc/user/admin_area/settings/index.md2
-rw-r--r--doc/user/admin_area/settings/instance_template_repository.md12
-rw-r--r--doc/user/admin_area/settings/project_integration_management.md2
-rw-r--r--doc/user/admin_area/settings/push_event_activities_limit.md2
-rw-r--r--doc/user/admin_area/settings/sign_up_restrictions.md25
-rw-r--r--doc/user/admin_area/settings/usage_statistics.md2
-rw-r--r--doc/user/admin_area/settings/visibility_and_access_controls.md6
-rw-r--r--doc/user/admin_area/user_cohorts.md36
-rw-r--r--doc/user/analytics/img/mr_mean_time_to_merge_metric_v13_9.pngbin0 -> 12299 bytes
-rw-r--r--doc/user/analytics/index.md2
-rw-r--r--doc/user/analytics/merge_request_analytics.md9
-rw-r--r--doc/user/application_security/api_fuzzing/img/api_fuzzing_postman_collection_edit_variable.pngbin0 -> 22389 bytes
-rw-r--r--doc/user/application_security/api_fuzzing/img/api_fuzzing_postman_environment_edit_variable.pngbin0 -> 17801 bytes
-rw-r--r--doc/user/application_security/api_fuzzing/img/api_fuzzing_postman_request_edit.pngbin0 -> 21915 bytes
-rw-r--r--doc/user/application_security/api_fuzzing/index.md196
-rw-r--r--doc/user/application_security/configuration/index.md49
-rw-r--r--doc/user/application_security/container_scanning/index.md6
-rw-r--r--doc/user/application_security/coverage_fuzzing/index.md2
-rw-r--r--doc/user/application_security/dast/img/dast_single_v13_0.pngbin135324 -> 0 bytes
-rw-r--r--doc/user/application_security/dast/index.md229
-rw-r--r--doc/user/application_security/dependency_scanning/index.md37
-rw-r--r--doc/user/application_security/img/create_mr_from_vulnerability_v13_4.pngbin33743 -> 49215 bytes
-rw-r--r--doc/user/application_security/img/vulnerability_page_merge_request_button_v13_1.pngbin15394 -> 0 bytes
-rw-r--r--doc/user/application_security/img/vulnerability_related_issues_add_button_v13_2.pngbin33345 -> 0 bytes
-rw-r--r--doc/user/application_security/img/vulnerability_related_issues_remove_v13_2.gifbin35842 -> 0 bytes
-rw-r--r--doc/user/application_security/index.md171
-rw-r--r--doc/user/application_security/offline_deployments/index.md4
-rw-r--r--doc/user/application_security/sast/index.md50
-rw-r--r--doc/user/application_security/secret_detection/index.md11
-rw-r--r--doc/user/application_security/security_dashboard/img/pipeline_security_dashboard_v13_10.pngbin0 -> 80367 bytes
-rw-r--r--doc/user/application_security/security_dashboard/index.md20
-rw-r--r--doc/user/application_security/threat_monitoring/index.md4
-rw-r--r--doc/user/application_security/vulnerabilities/index.md33
-rw-r--r--doc/user/application_security/vulnerability_report/img/project_security_dashboard_dismissal_v13_9.pngbin37066 -> 0 bytes
-rw-r--r--doc/user/application_security/vulnerability_report/img/project_security_dashboard_status_change_v13_9.pngbin0 -> 41154 bytes
-rw-r--r--doc/user/application_security/vulnerability_report/img/vulnerability_details_create_issue_v13_7.pngbin31816 -> 0 bytes
-rw-r--r--doc/user/application_security/vulnerability_report/index.md149
-rw-r--r--doc/user/asciidoc.md6
-rw-r--r--doc/user/clusters/agent/index.md214
-rw-r--r--doc/user/clusters/applications.md27
-rw-r--r--doc/user/compliance/license_compliance/index.md13
-rw-r--r--doc/user/discussions/index.md204
-rw-r--r--doc/user/group/custom_project_templates.md4
-rw-r--r--doc/user/group/epics/index.md2
-rw-r--r--doc/user/group/epics/manage_epics.md5
-rw-r--r--doc/user/group/img/access_requests_management.pngbin22616 -> 0 bytes
-rw-r--r--doc/user/group/img/add_new_members_v13_7.pngbin58897 -> 0 bytes
-rw-r--r--doc/user/group/img/create_new_group_info.pngbin27101 -> 0 bytes
-rw-r--r--doc/user/group/img/create_new_project_from_group_v13_6.pngbin40062 -> 0 bytes
-rw-r--r--doc/user/group/img/group_activity_analytics_v12_10.pngbin56709 -> 0 bytes
-rw-r--r--doc/user/group/img/group_activity_analytics_v13_10.pngbin0 -> 12597 bytes
-rw-r--r--doc/user/group/img/group_file_template_dropdown.pngbin9516 -> 0 bytes
-rw-r--r--doc/user/group/img/group_members_filter_2fa_disabled_13_7.pngbin39226 -> 0 bytes
-rw-r--r--doc/user/group/img/group_members_filter_2fa_enabled_13_7.pngbin41497 -> 0 bytes
-rw-r--r--doc/user/group/img/group_members_filter_direct_13_7.pngbin40549 -> 0 bytes
-rw-r--r--doc/user/group/img/group_members_filter_inherited_13_7.pngbin43436 -> 0 bytes
-rw-r--r--doc/user/group/img/group_members_search_13_7.pngbin28622 -> 0 bytes
-rw-r--r--doc/user/group/img/group_members_sort_13_7.pngbin41897 -> 0 bytes
-rw-r--r--doc/user/group/img/group_settings.pngbin51335 -> 0 bytes
-rw-r--r--doc/user/group/img/groups.pngbin61507 -> 0 bytes
-rw-r--r--doc/user/group/img/ldap_sync_cn_v13_1.pngbin38094 -> 0 bytes
-rw-r--r--doc/user/group/img/ldap_sync_filter_v13_1.pngbin44302 -> 0 bytes
-rw-r--r--doc/user/group/img/manual_permissions_v13_7.pngbin69289 -> 0 bytes
-rw-r--r--doc/user/group/img/member_lock.pngbin3168 -> 0 bytes
-rw-r--r--doc/user/group/img/new_group_from_groups.pngbin25256 -> 0 bytes
-rw-r--r--doc/user/group/img/new_group_from_other_pages.pngbin21593 -> 0 bytes
-rw-r--r--doc/user/group/img/request_access_button.pngbin36258 -> 0 bytes
-rw-r--r--doc/user/group/img/select_group_dropdown.pngbin64359 -> 0 bytes
-rw-r--r--doc/user/group/img/select_group_dropdown_13_10.pngbin0 -> 11986 bytes
-rw-r--r--doc/user/group/img/share_with_group_lock.pngbin7493 -> 0 bytes
-rw-r--r--doc/user/group/img/withdraw_access_request_button.pngbin36782 -> 0 bytes
-rw-r--r--doc/user/group/import/index.md38
-rw-r--r--doc/user/group/index.md854
-rw-r--r--doc/user/group/repositories_analytics/index.md3
-rw-r--r--doc/user/group/roadmap/index.md2
-rw-r--r--doc/user/group/saml_sso/group_managed_accounts.md12
-rw-r--r--doc/user/group/saml_sso/index.md33
-rw-r--r--doc/user/group/saml_sso/scim_setup.md9
-rw-r--r--doc/user/group/subgroups/index.md6
-rw-r--r--doc/user/img/gitlab_snippet_v13_0.pngbin28925 -> 0 bytes
-rw-r--r--doc/user/img/gitlab_snippet_v13_5.pngbin20563 -> 0 bytes
-rw-r--r--doc/user/img/new_personal_snippet_from_project_v12_10.pngbin77106 -> 0 bytes
-rw-r--r--doc/user/img/new_personal_snippet_v12_10.pngbin39878 -> 0 bytes
-rw-r--r--doc/user/index.md6
-rw-r--r--doc/user/infrastructure/index.md4
-rw-r--r--doc/user/infrastructure/terraform_state.md14
-rw-r--r--doc/user/markdown.md49
-rw-r--r--doc/user/packages/conan_repository/index.md9
-rw-r--r--doc/user/packages/container_registry/index.md6
-rw-r--r--doc/user/packages/dependency_proxy/index.md18
-rw-r--r--doc/user/packages/generic_packages/index.md22
-rw-r--r--doc/user/packages/go_proxy/index.md2
-rw-r--r--doc/user/packages/index.md4
-rw-r--r--doc/user/packages/npm_registry/index.md26
-rw-r--r--doc/user/packages/nuget_repository/index.md2
-rw-r--r--doc/user/packages/package_registry/index.md2
-rw-r--r--doc/user/packages/pypi_repository/index.md18
-rw-r--r--doc/user/packages/workflows/monorepo.md9
-rw-r--r--doc/user/packages/workflows/project_registry.md5
-rw-r--r--doc/user/permissions.md12
-rw-r--r--doc/user/profile/account/two_factor_authentication.md14
-rw-r--r--doc/user/profile/img/busy_indicator_note_header_v13_9.pngbin0 -> 24006 bytes
-rw-r--r--doc/user/profile/img/busy_indicator_notes_v13_9.pngbin0 -> 41947 bytes
-rw-r--r--doc/user/profile/img/busy_indicator_profile_page_v13_6.pngbin0 -> 25119 bytes
-rw-r--r--doc/user/profile/img/busy_indicator_settings_menu_v13_6.pngbin0 -> 26843 bytes
-rw-r--r--doc/user/profile/img/busy_indicator_sidebar_collapsed_v13_9.pngbin0 -> 6190 bytes
-rw-r--r--doc/user/profile/img/busy_indicator_sidebar_v13_9.pngbin0 -> 21914 bytes
-rw-r--r--doc/user/profile/img/busy_indicator_user_popovers_v13_6.pngbin0 -> 32158 bytes
-rw-r--r--doc/user/profile/index.md26
-rw-r--r--doc/user/profile/notifications.md3
-rw-r--r--doc/user/profile/personal_access_tokens.md2
-rw-r--r--doc/user/profile/preferences.md11
-rw-r--r--doc/user/project/autocomplete_characters.md47
-rw-r--r--doc/user/project/badges.md6
-rw-r--r--doc/user/project/clusters/add_eks_clusters.md10
-rw-r--r--doc/user/project/clusters/index.md21
-rw-r--r--doc/user/project/clusters/protect/container_host_security/quick_start_guide.md4
-rw-r--r--doc/user/project/clusters/protect/container_network_security/quick_start_guide.md4
-rw-r--r--doc/user/project/clusters/serverless/aws.md9
-rw-r--r--doc/user/project/clusters/serverless/index.md8
-rw-r--r--doc/user/project/code_intelligence.md7
-rw-r--r--doc/user/project/deploy_boards.md12
-rw-r--r--doc/user/project/deploy_tokens/index.md29
-rw-r--r--doc/user/project/description_templates.md77
-rw-r--r--doc/user/project/file_lock.md32
-rw-r--r--doc/user/project/git_attributes.md2
-rw-r--r--doc/user/project/img/autocomplete_characters_example1_v12_0.pngbin17510 -> 0 bytes
-rw-r--r--doc/user/project/img/autocomplete_characters_example2_v12_0.pngbin14623 -> 0 bytes
-rw-r--r--doc/user/project/img/code_owners_approval_new_protected_branch_v12_4.pngbin41386 -> 0 bytes
-rw-r--r--doc/user/project/img/code_owners_approval_new_protected_branch_v13_10.pngbin0 -> 30238 bytes
-rw-r--r--doc/user/project/img/code_owners_approval_protected_branch_v12_4.pngbin16195 -> 0 bytes
-rw-r--r--doc/user/project/img/code_owners_approval_protected_branch_v13_10.pngbin0 -> 17263 bytes
-rw-r--r--doc/user/project/img/issue_boards_remove_issue_v13_6.pngbin27886 -> 0 bytes
-rw-r--r--doc/user/project/import/github.md9
-rw-r--r--doc/user/project/index.md4
-rw-r--r--doc/user/project/integrations/bamboo.md2
-rw-r--r--doc/user/project/integrations/bugzilla.md2
-rw-r--r--doc/user/project/integrations/custom_issue_tracker.md2
-rw-r--r--doc/user/project/integrations/discord_notifications.md2
-rw-r--r--doc/user/project/integrations/emails_on_push.md2
-rw-r--r--doc/user/project/integrations/github.md2
-rw-r--r--doc/user/project/integrations/hangouts_chat.md2
-rw-r--r--doc/user/project/integrations/hipchat.md2
-rw-r--r--doc/user/project/integrations/img/mattermost_config_help.pngbin102890 -> 0 bytes
-rw-r--r--doc/user/project/integrations/img/mattermost_console_integrations.pngbin114618 -> 0 bytes
-rw-r--r--doc/user/project/integrations/img/mattermost_goto_console.pngbin7746 -> 0 bytes
-rw-r--r--doc/user/project/integrations/img/mattermost_slash_command_configuration.pngbin24162 -> 0 bytes
-rw-r--r--doc/user/project/integrations/img/mattermost_slash_command_token.pngbin8624 -> 0 bytes
-rw-r--r--doc/user/project/integrations/img/mattermost_team_integrations.pngbin4757 -> 0 bytes
-rw-r--r--doc/user/project/integrations/index.md2
-rw-r--r--doc/user/project/integrations/irker.md2
-rw-r--r--doc/user/project/integrations/jira.md2
-rw-r--r--doc/user/project/integrations/jira_cloud_configuration.md2
-rw-r--r--doc/user/project/integrations/jira_integrations.md2
-rw-r--r--doc/user/project/integrations/jira_server_configuration.md2
-rw-r--r--doc/user/project/integrations/mattermost.md2
-rw-r--r--doc/user/project/integrations/mattermost_slash_commands.md161
-rw-r--r--doc/user/project/integrations/microsoft_teams.md2
-rw-r--r--doc/user/project/integrations/mock_ci.md2
-rw-r--r--doc/user/project/integrations/overview.md2
-rw-r--r--doc/user/project/integrations/prometheus_library/cloudwatch.md35
-rw-r--r--doc/user/project/integrations/redmine.md2
-rw-r--r--doc/user/project/integrations/servicenow.md2
-rw-r--r--doc/user/project/integrations/services_templates.md2
-rw-r--r--doc/user/project/integrations/slack.md2
-rw-r--r--doc/user/project/integrations/unify_circuit.md2
-rw-r--r--doc/user/project/integrations/webex_teams.md2
-rw-r--r--doc/user/project/integrations/webhooks.md24
-rw-r--r--doc/user/project/integrations/youtrack.md2
-rw-r--r--doc/user/project/issue_board.md101
-rw-r--r--doc/user/project/issues/associate_zoom_meeting.md2
-rw-r--r--doc/user/project/issues/index.md10
-rw-r--r--doc/user/project/issues/issue_data_and_actions.md8
-rw-r--r--doc/user/project/issues/managing_issues.md4
-rw-r--r--doc/user/project/members/img/project_members_filter_v12_6.pngbin6381 -> 0 bytes
-rw-r--r--doc/user/project/members/index.md29
-rw-r--r--doc/user/project/members/share_project_with_groups.md2
-rw-r--r--doc/user/project/merge_requests/allow_collaboration.md12
-rw-r--r--doc/user/project/merge_requests/authorization_for_merge_requests.md2
-rw-r--r--doc/user/project/merge_requests/browser_performance_testing.md9
-rw-r--r--doc/user/project/merge_requests/code_quality.md18
-rw-r--r--doc/user/project/merge_requests/creating_merge_requests.md17
-rw-r--r--doc/user/project/merge_requests/drafts.md99
-rw-r--r--doc/user/project/merge_requests/fast_forward_merge.md8
-rw-r--r--doc/user/project/merge_requests/getting_started.md70
-rw-r--r--doc/user/project/merge_requests/img/comment-on-any-diff-line.pngbin33199 -> 0 bytes
-rw-r--r--doc/user/project/merge_requests/img/comment-on-any-diff-line_v13_10.pngbin0 -> 21304 bytes
-rw-r--r--doc/user/project/merge_requests/img/draft_blocked_merge_button_v13_10.pngbin0 -> 4958 bytes
-rw-r--r--doc/user/project/merge_requests/img/draft_blocked_merge_button_v13_2.pngbin11774 -> 0 bytes
-rw-r--r--doc/user/project/merge_requests/img/filter_draft_merge_requests_v13_10.pngbin0 -> 3453 bytes
-rw-r--r--doc/user/project/merge_requests/img/filter_wip_merge_requests.pngbin11017 -> 0 bytes
-rw-r--r--doc/user/project/merge_requests/img/multiline-comment-highlighted.pngbin38822 -> 0 bytes
-rw-r--r--doc/user/project/merge_requests/img/scoped_to_protected_branch_v12_8.pngbin32970 -> 0 bytes
-rw-r--r--doc/user/project/merge_requests/img/scoped_to_protected_branch_v13_10.pngbin0 -> 39889 bytes
-rw-r--r--doc/user/project/merge_requests/img/update_approval_rule_v13_10.pngbin0 -> 42956 bytes
-rw-r--r--doc/user/project/merge_requests/img/update_approval_rule_v13_4.pngbin32006 -> 0 bytes
-rw-r--r--doc/user/project/merge_requests/index.md35
-rw-r--r--doc/user/project/merge_requests/load_performance_testing.md6
-rw-r--r--doc/user/project/merge_requests/merge_request_approvals.md13
-rw-r--r--doc/user/project/merge_requests/merge_request_dependencies.md7
-rw-r--r--doc/user/project/merge_requests/merge_when_pipeline_succeeds.md4
-rw-r--r--doc/user/project/merge_requests/resolve_conflicts.md2
-rw-r--r--doc/user/project/merge_requests/revert_changes.md26
-rw-r--r--doc/user/project/merge_requests/reviewing_and_managing_merge_requests.md28
-rw-r--r--doc/user/project/merge_requests/squash_and_merge.md20
-rw-r--r--doc/user/project/merge_requests/test_coverage_visualization.md29
-rw-r--r--doc/user/project/merge_requests/versions.md2
-rw-r--r--doc/user/project/merge_requests/work_in_progress_merge_requests.md78
-rw-r--r--doc/user/project/milestones/burndown_charts.md8
-rw-r--r--doc/user/project/pages/getting_started/pages_ci_cd_template.md2
-rw-r--r--doc/user/project/pages/getting_started/pages_from_scratch.md4
-rw-r--r--doc/user/project/pages/index.md4
-rw-r--r--doc/user/project/protected_branches.md60
-rw-r--r--doc/user/project/push_options.md10
-rw-r--r--doc/user/project/quick_actions.md199
-rw-r--r--doc/user/project/releases/index.md17
-rw-r--r--doc/user/project/repository/branches/img/branch_filter_search_box.pngbin23522 -> 0 bytes
-rw-r--r--doc/user/project/repository/branches/img/branch_filter_search_box_v13_10.pngbin0 -> 48672 bytes
-rw-r--r--doc/user/project/repository/branches/img/compare_branches.pngbin62436 -> 0 bytes
-rw-r--r--doc/user/project/repository/branches/img/compare_branches_v13_10.pngbin0 -> 82538 bytes
-rw-r--r--doc/user/project/repository/branches/img/repository_filter_search_box_v13_10.pngbin0 -> 17166 bytes
-rw-r--r--doc/user/project/repository/branches/index.md28
-rw-r--r--doc/user/project/repository/file_finder.md2
-rw-r--r--doc/user/project/repository/forking_workflow.md16
-rw-r--r--doc/user/project/repository/git_blame.md9
-rw-r--r--doc/user/project/repository/git_history.md9
-rw-r--r--doc/user/project/repository/gpg_signed_commits/index.md11
-rw-r--r--doc/user/project/repository/index.md53
-rw-r--r--doc/user/project/repository/jupyter_notebooks/index.md4
-rw-r--r--doc/user/project/repository/repository_mirroring.md211
-rw-r--r--doc/user/project/repository/web_editor.md4
-rw-r--r--doc/user/project/repository/x509_signed_commits/index.md4
-rw-r--r--doc/user/project/requirements/index.md10
-rw-r--r--doc/user/project/service_desk.md6
-rw-r--r--doc/user/project/settings/import_export.md4
-rw-r--r--doc/user/project/settings/index.md16
-rw-r--r--doc/user/project/settings/project_access_tokens.md30
-rw-r--r--doc/user/project/static_site_editor/index.md2
-rw-r--r--doc/user/project/time_tracking.md3
-rw-r--r--doc/user/project/web_ide/img/solarized_dark_theme_v13_1.pngbin117131 -> 43014 bytes
-rw-r--r--doc/user/project/web_ide/img/solarized_light_theme_v13_0.pngbin99981 -> 0 bytes
-rw-r--r--doc/user/project/web_ide/index.md19
-rw-r--r--doc/user/project/wiki/index.md72
-rw-r--r--doc/user/project/working_with_projects.md4
-rw-r--r--doc/user/search/advanced_global_search.md70
-rw-r--r--doc/user/search/advanced_search.md115
-rw-r--r--doc/user/search/advanced_search_syntax.md90
-rw-r--r--doc/user/search/img/advanced_global_search.pngbin15017 -> 0 bytes
-rw-r--r--doc/user/search/img/advanced_search_v13.10.pngbin0 -> 46767 bytes
-rw-r--r--doc/user/search/index.md23
-rw-r--r--doc/user/shortcuts.md117
-rw-r--r--doc/user/snippets.md278
-rw-r--r--generator_templates/usage_metric_definition/metric_definition.yml4
-rw-r--r--jest.config.base.js2
-rw-r--r--lefthook.yml24
-rw-r--r--lib/api/admin/plan_limits.rb57
-rw-r--r--lib/api/api.rb4
-rw-r--r--lib/api/boards.rb20
-rw-r--r--lib/api/ci/runner.rb27
-rw-r--r--lib/api/commit_statuses.rb7
-rw-r--r--lib/api/composer_packages.rb14
-rw-r--r--lib/api/concerns/packages/conan_endpoints.rb6
-rw-r--r--lib/api/concerns/packages/npm_endpoints.rb14
-rw-r--r--lib/api/entities/job_request/response.rb2
-rw-r--r--lib/api/entities/plan_limit.rb14
-rw-r--r--lib/api/entities/project.rb2
-rw-r--r--lib/api/entities/project_repository_storage_move.rb9
-rw-r--r--lib/api/entities/projects/repository_storage_move.rb11
-rw-r--r--lib/api/entities/protected_branch.rb1
-rw-r--r--lib/api/entities/public_group_details.rb12
-rw-r--r--lib/api/entities/snippets/repository_storage_move.rb11
-rw-r--r--lib/api/group_boards.rb16
-rw-r--r--lib/api/helpers.rb2
-rw-r--r--lib/api/helpers/issues_helpers.rb5
-rw-r--r--lib/api/helpers/packages/conan/api_helpers.rb2
-rw-r--r--lib/api/helpers/packages/npm.rb23
-rw-r--r--lib/api/helpers/runner.rb9
-rw-r--r--lib/api/helpers/services_helpers.rb2
-rw-r--r--lib/api/invitations.rb33
-rw-r--r--lib/api/issues.rb25
-rw-r--r--lib/api/job_artifacts.rb2
-rw-r--r--lib/api/jobs.rb21
-rw-r--r--lib/api/nuget_project_packages.rb5
-rw-r--r--lib/api/project_packages.rb6
-rw-r--r--lib/api/project_repository_storage_moves.rb24
-rw-r--r--lib/api/projects.rb30
-rw-r--r--lib/api/protected_branches.rb3
-rw-r--r--lib/api/repositories.rb2
-rw-r--r--lib/api/resource_access_tokens.rb2
-rw-r--r--lib/api/rubygem_packages.rb71
-rw-r--r--lib/api/settings.rb1
-rw-r--r--lib/api/snippet_repository_storage_moves.rb24
-rw-r--r--lib/api/users.rb9
-rw-r--r--lib/api/v3/github.rb3
-rw-r--r--lib/api/wikis.rb2
-rw-r--r--lib/backup/repositories.rb7
-rw-r--r--lib/banzai/filter/autolink_filter.rb2
-rw-r--r--lib/banzai/filter/markdown_pre_escape_filter.rb6
-rw-r--r--lib/banzai/filter/sanitization_filter.rb8
-rw-r--r--lib/banzai/filter/spaced_link_filter.rb2
-rw-r--r--lib/banzai/filter/video_link_filter.rb2
-rw-r--r--lib/bitbucket/collection.rb8
-rw-r--r--lib/bitbucket_server/collection.rb8
-rw-r--r--lib/bulk_imports/common/loaders/entity_loader.rb15
-rw-r--r--lib/bulk_imports/common/transformers/award_emoji_transformer.rb27
-rw-r--r--lib/bulk_imports/common/transformers/prohibited_attributes_transformer.rb6
-rw-r--r--lib/bulk_imports/common/transformers/user_reference_transformer.rb39
-rw-r--r--lib/bulk_imports/groups/extractors/subgroups_extractor.rb2
-rw-r--r--lib/bulk_imports/groups/graphql/get_labels_query.rb4
-rw-r--r--lib/bulk_imports/groups/graphql/get_milestones_query.rb54
-rw-r--r--lib/bulk_imports/groups/loaders/group_loader.rb4
-rw-r--r--lib/bulk_imports/groups/loaders/labels_loader.rb15
-rw-r--r--lib/bulk_imports/groups/loaders/members_loader.rb17
-rw-r--r--lib/bulk_imports/groups/pipelines/labels_pipeline.rb4
-rw-r--r--lib/bulk_imports/groups/pipelines/members_pipeline.rb6
-rw-r--r--lib/bulk_imports/groups/pipelines/milestones_pipeline.rb42
-rw-r--r--lib/bulk_imports/groups/pipelines/subgroup_entities_pipeline.rb5
-rw-r--r--lib/bulk_imports/groups/transformers/group_attributes_transformer.rb13
-rw-r--r--lib/bulk_imports/groups/transformers/member_attributes_transformer.rb2
-rw-r--r--lib/bulk_imports/groups/transformers/subgroup_to_entity_transformer.rb2
-rw-r--r--lib/bulk_imports/importers/group_importer.rb3
-rw-r--r--lib/bulk_imports/pipeline.rb88
-rw-r--r--lib/bulk_imports/pipeline/runner.rb41
-rw-r--r--lib/csv_builder.rb5
-rw-r--r--lib/declarative_policy/policy_dsl.rb2
-rw-r--r--lib/error_tracking/sentry_client.rb100
-rw-r--r--lib/error_tracking/sentry_client/api_urls.rb41
-rw-r--r--lib/error_tracking/sentry_client/event.rb36
-rw-r--r--lib/error_tracking/sentry_client/issue.rb184
-rw-r--r--lib/error_tracking/sentry_client/issue_link.rb52
-rw-r--r--lib/error_tracking/sentry_client/pagination_parser.rb25
-rw-r--r--lib/error_tracking/sentry_client/projects.rb39
-rw-r--r--lib/error_tracking/sentry_client/repo.rb38
-rw-r--r--lib/expand_variables.rb3
-rw-r--r--lib/feature/shared.rb12
-rw-r--r--lib/generators/gitlab/usage_metric_definition_generator.rb28
-rw-r--r--lib/gitlab.rb4
-rw-r--r--lib/gitlab/alert_management/payload/generic.rb2
-rw-r--r--lib/gitlab/analytics/cycle_analytics/average.rb48
-rw-r--r--lib/gitlab/analytics/cycle_analytics/data_collector.rb6
-rw-r--r--lib/gitlab/analytics/cycle_analytics/records_fetcher.rb6
-rw-r--r--lib/gitlab/analytics/cycle_analytics/sorting.rb27
-rw-r--r--lib/gitlab/analytics/cycle_analytics/stage_events.rb4
-rw-r--r--lib/gitlab/analytics/cycle_analytics/stage_events/stage_event.rb4
-rw-r--r--lib/gitlab/analytics/cycle_analytics/stage_query_helpers.rb4
-rw-r--r--lib/gitlab/analytics/instance_statistics/workers_argument_builder.rb47
-rw-r--r--lib/gitlab/analytics/usage_trends/workers_argument_builder.rb47
-rw-r--r--lib/gitlab/application_context.rb52
-rw-r--r--lib/gitlab/application_rate_limiter.rb2
-rw-r--r--lib/gitlab/auth/current_user_mode.rb7
-rw-r--r--lib/gitlab/auth/o_auth/provider.rb11
-rw-r--r--lib/gitlab/auth/o_auth/user.rb3
-rw-r--r--lib/gitlab/avatar_cache.rb86
-rw-r--r--lib/gitlab/background_migration/backfill_project_updated_at_after_repository_storage_move.rb2
-rw-r--r--lib/gitlab/background_migration/batching_strategies/primary_key_batching_strategy.rb38
-rw-r--r--lib/gitlab/background_migration/copy_column_using_background_migration_job.rb28
-rw-r--r--lib/gitlab/background_migration/merge_request_assignees_migration_progress_check.rb43
-rw-r--r--lib/gitlab/background_migration/populate_finding_uuid_for_vulnerability_feedback.rb16
-rw-r--r--lib/gitlab/background_migration/populate_namespace_statistics.rb16
-rw-r--r--lib/gitlab/background_migration/populate_uuids_for_security_findings.rb2
-rw-r--r--lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid.rb79
-rw-r--r--lib/gitlab/background_migration/set_default_iteration_cadences.rb60
-rw-r--r--lib/gitlab/blame.rb8
-rw-r--r--lib/gitlab/checks/branch_check.rb2
-rw-r--r--lib/gitlab/checks/lfs_check.rb1
-rw-r--r--lib/gitlab/ci/build/context/build.rb2
-rw-r--r--lib/gitlab/ci/build/context/global.rb3
-rw-r--r--lib/gitlab/ci/build/credentials/registry/dependency_proxy.rb2
-rw-r--r--lib/gitlab/ci/config.rb10
-rw-r--r--lib/gitlab/ci/config/entry/cache.rb112
-rw-r--r--lib/gitlab/ci/config/entry/environment.rb11
-rw-r--r--lib/gitlab/ci/features.rb16
-rw-r--r--lib/gitlab/ci/jwt.rb6
-rw-r--r--lib/gitlab/ci/lint.rb2
-rw-r--r--lib/gitlab/ci/pipeline/chain/cancel_pending_pipelines.rb2
-rw-r--r--lib/gitlab/ci/pipeline/expression/statement.rb4
-rw-r--r--lib/gitlab/ci/pipeline/seed/build.rb48
-rw-r--r--lib/gitlab/ci/pipeline/seed/build/cache.rb22
-rw-r--r--lib/gitlab/ci/pipeline/seed/environment.rb6
-rw-r--r--lib/gitlab/ci/queue/metrics.rb210
-rw-r--r--lib/gitlab/ci/reports/codequality_reports_comparer.rb8
-rw-r--r--lib/gitlab/ci/reports/reports_comparer.rb13
-rw-r--r--lib/gitlab/ci/status/composite.rb16
-rw-r--r--lib/gitlab/ci/templates/Chef.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Jobs/Code-Quality.gitlab-ci.yml2
-rw-r--r--lib/gitlab/ci/templates/Jobs/Deploy.gitlab-ci.yml20
-rw-r--r--lib/gitlab/ci/templates/Jobs/Deploy.latest.gitlab-ci.yml22
-rw-r--r--lib/gitlab/ci/templates/Jobs/Deploy/EC2.gitlab-ci.yml4
-rw-r--r--lib/gitlab/ci/templates/Jobs/Deploy/ECS.gitlab-ci.yml12
-rw-r--r--lib/gitlab/ci/templates/LaTeX.gitlab-ci.yml17
-rw-r--r--lib/gitlab/ci/templates/Pages/Brunch.gitlab-ci.yml4
-rw-r--r--lib/gitlab/ci/templates/Pages/Doxygen.gitlab-ci.yml4
-rw-r--r--lib/gitlab/ci/templates/Pages/Gatsby.gitlab-ci.yml4
-rw-r--r--lib/gitlab/ci/templates/Pages/HTML.gitlab-ci.yml4
-rw-r--r--lib/gitlab/ci/templates/Pages/Harp.gitlab-ci.yml4
-rw-r--r--lib/gitlab/ci/templates/Pages/Hexo.gitlab-ci.yml4
-rw-r--r--lib/gitlab/ci/templates/Pages/Hugo.gitlab-ci.yml6
-rw-r--r--lib/gitlab/ci/templates/Pages/Hyde.gitlab-ci.yml6
-rw-r--r--lib/gitlab/ci/templates/Pages/Jekyll.gitlab-ci.yml6
-rw-r--r--lib/gitlab/ci/templates/Pages/Jigsaw.gitlab-ci.yml4
-rw-r--r--lib/gitlab/ci/templates/Pages/Lektor.gitlab-ci.yml4
-rw-r--r--lib/gitlab/ci/templates/Pages/Metalsmith.gitlab-ci.yml4
-rw-r--r--lib/gitlab/ci/templates/Pages/Middleman.gitlab-ci.yml7
-rw-r--r--lib/gitlab/ci/templates/Pages/Nanoc.gitlab-ci.yml4
-rw-r--r--lib/gitlab/ci/templates/Pages/Octopress.gitlab-ci.yml4
-rw-r--r--lib/gitlab/ci/templates/Pages/SwaggerUI.gitlab-ci.yml4
-rw-r--r--lib/gitlab/ci/templates/Security/API-Fuzzing.gitlab-ci.yml18
-rw-r--r--lib/gitlab/ci/templates/Security/Container-Scanning.gitlab-ci.yml3
-rw-r--r--lib/gitlab/ci/templates/Security/Dependency-Scanning.gitlab-ci.yml15
-rw-r--r--lib/gitlab/ci/templates/Security/SAST.gitlab-ci.yml53
-rw-r--r--lib/gitlab/ci/templates/Security/Secret-Detection.gitlab-ci.yml2
-rw-r--r--lib/gitlab/ci/templates/Terraform/Base.latest.gitlab-ci.yml3
-rw-r--r--lib/gitlab/ci/variables/collection.rb33
-rw-r--r--lib/gitlab/ci/variables/collection/item.rb25
-rw-r--r--lib/gitlab/ci/variables/collection/sort.rb64
-rw-r--r--lib/gitlab/ci/variables/collection/sorted.rb78
-rw-r--r--lib/gitlab/cycle_analytics/summary/deploy.rb14
-rw-r--r--lib/gitlab/data_builder/build.rb13
-rw-r--r--lib/gitlab/data_builder/pipeline.rb12
-rw-r--r--lib/gitlab/database.rb30
-rw-r--r--lib/gitlab/database/background_migration/batched_job.rb23
-rw-r--r--lib/gitlab/database/background_migration/batched_migration.rb56
-rw-r--r--lib/gitlab/database/background_migration/batched_migration_wrapper.rb46
-rw-r--r--lib/gitlab/database/background_migration/scheduler.rb60
-rw-r--r--lib/gitlab/database/migration_helpers.rb2
-rw-r--r--lib/gitlab/database/migrations/background_migration_helpers.rb87
-rw-r--r--lib/gitlab/database/migrations/observation.rb3
-rw-r--r--lib/gitlab/database/migrations/observers.rb3
-rw-r--r--lib/gitlab/database/migrations/observers/query_statistics.rb38
-rw-r--r--lib/gitlab/database/partitioning_migration_helpers/table_management_helpers.rb2
-rw-r--r--lib/gitlab/database/similarity_score.rb7
-rw-r--r--lib/gitlab/dependency_linker/base_linker.rb2
-rw-r--r--lib/gitlab/dependency_linker/go_mod_linker.rb2
-rw-r--r--lib/gitlab/dependency_linker/go_sum_linker.rb2
-rw-r--r--lib/gitlab/diff/char_diff.rb4
-rw-r--r--lib/gitlab/diff/highlight.rb8
-rw-r--r--lib/gitlab/diff/highlight_cache.rb18
-rw-r--r--lib/gitlab/diff/inline_diff.rb100
-rw-r--r--lib/gitlab/diff/inline_diff_markdown_marker.rb4
-rw-r--r--lib/gitlab/diff/inline_diff_marker.rb4
-rw-r--r--lib/gitlab/diff/pair_selector.rb58
-rw-r--r--lib/gitlab/email/handler/service_desk_handler.rb8
-rw-r--r--lib/gitlab/error_tracking.rb60
-rw-r--r--lib/gitlab/error_tracking/context_payload_generator.rb66
-rw-r--r--lib/gitlab/error_tracking/detailed_error.rb2
-rw-r--r--lib/gitlab/error_tracking/error.rb2
-rw-r--r--lib/gitlab/error_tracking/error_collection.rb2
-rw-r--r--lib/gitlab/error_tracking/error_event.rb2
-rw-r--r--lib/gitlab/error_tracking/log_formatter.rb55
-rw-r--r--lib/gitlab/error_tracking/processor/context_payload_processor.rb18
-rw-r--r--lib/gitlab/error_tracking/project.rb2
-rw-r--r--lib/gitlab/error_tracking/repo.rb2
-rw-r--r--lib/gitlab/error_tracking/stack_trace_highlight_decorator.rb2
-rw-r--r--lib/gitlab/etag_caching/middleware.rb8
-rw-r--r--lib/gitlab/etag_caching/router.rb105
-rw-r--r--lib/gitlab/etag_caching/router/graphql.rb41
-rw-r--r--lib/gitlab/etag_caching/router/restful.rb112
-rw-r--r--lib/gitlab/etag_caching/store.rb23
-rw-r--r--lib/gitlab/exception_log_formatter.rb10
-rw-r--r--lib/gitlab/experimentation.rb24
-rw-r--r--lib/gitlab/experimentation/controller_concern.rb16
-rw-r--r--lib/gitlab/git/blame.rb9
-rw-r--r--lib/gitlab/git/commit.rb1
-rw-r--r--lib/gitlab/gitaly_client.rb4
-rw-r--r--lib/gitlab/gitaly_client/storage_settings.rb3
-rw-r--r--lib/gitlab/github_import/importer/pull_request_merged_by_importer.rb33
-rw-r--r--lib/gitlab/github_import/importer/pull_request_review_importer.rb18
-rw-r--r--lib/gitlab/gon_helper.rb15
-rw-r--r--lib/gitlab/graphql/calls_gitaly.rb15
-rw-r--r--lib/gitlab/graphql/calls_gitaly/field_extension.rb87
-rw-r--r--lib/gitlab/graphql/calls_gitaly/instrumentation.rb40
-rw-r--r--lib/gitlab/graphql/docs/helper.rb12
-rw-r--r--lib/gitlab/graphql/docs/templates/default.md.haml18
-rw-r--r--lib/gitlab/graphql/extensions/externally_paginated_array_extension.rb2
-rw-r--r--lib/gitlab/graphql/pagination/keyset/connection.rb1
-rw-r--r--lib/gitlab/graphql/pagination/keyset/generic_keyset_pagination.rb47
-rw-r--r--lib/gitlab/graphql/pagination/keyset/last_items.rb38
-rw-r--r--lib/gitlab/graphql/pagination/keyset/order_info.rb7
-rw-r--r--lib/gitlab/graphql/present.rb23
-rw-r--r--lib/gitlab/graphql/present/field_extension.rb36
-rw-r--r--lib/gitlab/graphql/present/instrumentation.rb49
-rw-r--r--lib/gitlab/graphql/query_analyzers/logger_analyzer.rb4
-rw-r--r--lib/gitlab/hook_data/project_member_builder.rb66
-rw-r--r--lib/gitlab/http_connection_adapter.rb31
-rw-r--r--lib/gitlab/marginalia.rb9
-rw-r--r--lib/gitlab/marginalia/active_record_instrumentation.rb12
-rw-r--r--lib/gitlab/marginalia/comment.rb4
-rw-r--r--lib/gitlab/marker_range.rb29
-rw-r--r--lib/gitlab/memory/instrumentation.rb2
-rw-r--r--lib/gitlab/metrics/background_transaction.rb49
-rw-r--r--lib/gitlab/metrics/samplers/ruby_sampler.rb2
-rw-r--r--lib/gitlab/metrics/subscribers/active_record.rb56
-rw-r--r--lib/gitlab/optimistic_locking.rb61
-rw-r--r--lib/gitlab/pagination/keyset/column_order_definition.rb224
-rw-r--r--lib/gitlab/pagination/keyset/order.rb248
-rw-r--r--lib/gitlab/performance_bar/redis_adapter_when_peek_enabled.rb8
-rw-r--r--lib/gitlab/query_limiting.rb11
-rw-r--r--lib/gitlab/query_limiting/active_support_subscriber.rb7
-rw-r--r--lib/gitlab/query_limiting/transaction.rb11
-rw-r--r--lib/gitlab/quick_actions/issue_actions.rb29
-rw-r--r--lib/gitlab/regex.rb4
-rw-r--r--lib/gitlab/relative_positioning/closed_range.rb13
-rw-r--r--lib/gitlab/relative_positioning/ending_at.rb18
-rw-r--r--lib/gitlab/relative_positioning/range.rb34
-rw-r--r--lib/gitlab/relative_positioning/starting_from.rb18
-rw-r--r--lib/gitlab/runtime.rb5
-rw-r--r--lib/gitlab/setup_helper.rb2
-rw-r--r--lib/gitlab/sidekiq_middleware.rb2
-rw-r--r--lib/gitlab/sidekiq_middleware/server_metrics.rb3
-rw-r--r--lib/gitlab/sidekiq_middleware/size_limiter/client.rb19
-rw-r--r--lib/gitlab/sidekiq_middleware/size_limiter/exceed_limit_error.rb29
-rw-r--r--lib/gitlab/sidekiq_middleware/size_limiter/validator.rb97
-rw-r--r--lib/gitlab/string_range_marker.rb18
-rw-r--r--lib/gitlab/template/base_template.rb4
-rw-r--r--lib/gitlab/template/issue_template.rb4
-rw-r--r--lib/gitlab/template/merge_request_template.rb4
-rw-r--r--lib/gitlab/tracking/standard_context.rb8
-rw-r--r--lib/gitlab/tree_summary.rb10
-rw-r--r--lib/gitlab/usage/docs/helper.rb35
-rw-r--r--lib/gitlab/usage/docs/templates/default.md.haml24
-rw-r--r--lib/gitlab/usage/docs/value_formatter.rb6
-rw-r--r--lib/gitlab/usage/metric_definition.rb5
-rw-r--r--lib/gitlab/usage/metrics/aggregates/aggregate.rb24
-rw-r--r--lib/gitlab/usage/metrics/aggregates/sources/postgres_hll.rb6
-rw-r--r--lib/gitlab/usage/metrics/names_suggestions/generator.rb61
-rw-r--r--lib/gitlab/usage_data.rb47
-rw-r--r--lib/gitlab/usage_data_counters/aggregated_metrics/code_review.yml108
-rw-r--r--lib/gitlab/usage_data_counters/aggregated_metrics/common.yml24
-rw-r--r--lib/gitlab/usage_data_counters/counter_events/package_events.yml3
-rw-r--r--lib/gitlab/usage_data_counters/hll_redis_counter.rb6
-rw-r--r--lib/gitlab/usage_data_counters/known_events/code_review_events.yml40
-rw-r--r--lib/gitlab/usage_data_counters/known_events/common.yml15
-rw-r--r--lib/gitlab/usage_data_counters/known_events/ecosystem.yml46
-rw-r--r--lib/gitlab/usage_data_counters/known_events/package_events.yml30
-rw-r--r--lib/gitlab/usage_data_counters/known_events/quickactions.yml10
-rw-r--r--lib/gitlab/usage_data_counters/merge_request_activity_unique_counter.rb48
-rw-r--r--lib/gitlab/usage_data_counters/quick_action_activity_unique_counter.rb14
-rw-r--r--lib/gitlab/usage_data_queries.rb4
-rw-r--r--lib/gitlab/utils/usage_data.rb21
-rw-r--r--lib/gitlab/visibility_level.rb13
-rw-r--r--lib/gitlab/word_diff/chunk_collection.rb23
-rw-r--r--lib/gitlab/word_diff/line_processor.rb45
-rw-r--r--lib/gitlab/word_diff/parser.rb57
-rw-r--r--lib/gitlab/word_diff/positions_counter.rb30
-rw-r--r--lib/gitlab/word_diff/segments/chunk.rb36
-rw-r--r--lib/gitlab/word_diff/segments/diff_hunk.rb40
-rw-r--r--lib/gitlab/word_diff/segments/newline.rb13
-rw-r--r--lib/gitlab/x509/signature.rb6
-rw-r--r--lib/pager_duty/webhook_payload_parser.rb4
-rw-r--r--lib/peek/views/active_record.rb20
-rw-r--r--lib/quality/test_level.rb1
-rw-r--r--lib/release_highlights/validator/entry.rb2
-rw-r--r--lib/rspec_flaky/config.rb21
-rw-r--r--lib/rspec_flaky/example.rb48
-rw-r--r--lib/rspec_flaky/flaky_example.rb38
-rw-r--r--lib/rspec_flaky/listener.rb63
-rw-r--r--lib/rspec_flaky/report.rb56
-rw-r--r--lib/sentry/api_urls.rb39
-rw-r--r--lib/sentry/client.rb100
-rw-r--r--lib/sentry/client/event.rb36
-rw-r--r--lib/sentry/client/issue.rb184
-rw-r--r--lib/sentry/client/issue_link.rb52
-rw-r--r--lib/sentry/client/projects.rb39
-rw-r--r--lib/sentry/client/repo.rb38
-rw-r--r--lib/sentry/pagination_parser.rb23
-rw-r--r--lib/spam/concerns/has_spam_action_response_fields.rb37
-rw-r--r--lib/system_check/sidekiq_check.rb24
-rw-r--r--lib/tasks/eslint.rake2
-rw-r--r--lib/tasks/gitlab/graphql.rake17
-rw-r--r--lib/tasks/gitlab/packages/composer.rake20
-rw-r--r--lib/tasks/gitlab/packages/events.rake3
-rw-r--r--lib/tasks/lint.rake1
-rw-r--r--lib/tasks/scss-lint.rake12
-rw-r--r--locale/am_ET/gitlab.po2526
-rw-r--r--locale/ar_SA/gitlab.po2554
-rw-r--r--locale/as_IN/gitlab.po2526
-rw-r--r--locale/az_AZ/gitlab.po2526
-rw-r--r--locale/ba_RU/gitlab.po2519
-rw-r--r--locale/bg/gitlab.po2528
-rw-r--r--locale/bn_BD/gitlab.po2526
-rw-r--r--locale/bn_IN/gitlab.po2526
-rw-r--r--locale/br_FR/gitlab.po36990
-rw-r--r--locale/bs_BA/gitlab.po2533
-rw-r--r--locale/ca_ES/gitlab.po2532
-rw-r--r--locale/cs_CZ/gitlab.po2546
-rw-r--r--locale/cy_GB/gitlab.po2554
-rw-r--r--locale/da_DK/gitlab.po2526
-rw-r--r--locale/de/gitlab.po2666
-rw-r--r--locale/el_GR/gitlab.po2526
-rw-r--r--locale/eo/gitlab.po2528
-rw-r--r--locale/es/gitlab.po2958
-rw-r--r--locale/et_EE/gitlab.po2526
-rw-r--r--locale/fa_IR/gitlab.po2526
-rw-r--r--locale/fi_FI/gitlab.po2526
-rw-r--r--locale/fil_PH/gitlab.po2526
-rw-r--r--locale/fr/gitlab.po2584
-rw-r--r--locale/gitlab.pot1642
-rw-r--r--locale/gl_ES/gitlab.po2526
-rw-r--r--locale/he_IL/gitlab.po2540
-rw-r--r--locale/hi_IN/gitlab.po2526
-rw-r--r--locale/hr_HR/gitlab.po2533
-rw-r--r--locale/hu_HU/gitlab.po2526
-rw-r--r--locale/hy_AM/gitlab.po2526
-rw-r--r--locale/id_ID/gitlab.po2519
-rw-r--r--locale/ig_NG/gitlab.po2519
-rw-r--r--locale/is_IS/gitlab.po2526
-rw-r--r--locale/it/gitlab.po2528
-rw-r--r--locale/ja/gitlab.po2909
-rw-r--r--locale/ka_GE/gitlab.po2526
-rw-r--r--locale/kab/gitlab.po2526
-rw-r--r--locale/ko/gitlab.po2585
-rw-r--r--locale/ku_TR/gitlab.po2526
-rw-r--r--locale/ky_KG/gitlab.po2526
-rw-r--r--locale/lt_LT/gitlab.po2540
-rw-r--r--locale/mk_MK/gitlab.po2526
-rw-r--r--locale/mn_MN/gitlab.po2526
-rw-r--r--locale/nb_NO/gitlab.po2622
-rw-r--r--locale/nl_NL/gitlab.po2526
-rw-r--r--locale/pa_IN/gitlab.po2526
-rw-r--r--locale/pl_PL/gitlab.po2540
-rw-r--r--locale/pt_BR/gitlab.po2630
-rw-r--r--locale/pt_PT/gitlab.po2534
-rw-r--r--locale/ro_RO/gitlab.po2533
-rw-r--r--locale/ru/gitlab.po2658
-rw-r--r--locale/si_LK/gitlab.po2526
-rw-r--r--locale/sk_SK/gitlab.po2540
-rw-r--r--locale/sl_SI/gitlab.po2540
-rw-r--r--locale/sq_AL/gitlab.po2526
-rw-r--r--locale/sr_CS/gitlab.po2533
-rw-r--r--locale/sr_SP/gitlab.po2533
-rw-r--r--locale/sv_SE/gitlab.po2526
-rw-r--r--locale/sw_KE/gitlab.po2526
-rw-r--r--locale/tr_TR/gitlab.po2620
-rw-r--r--locale/uk/gitlab.po2690
-rw-r--r--locale/unfound_translations.rb1
-rw-r--r--locale/ur_PK/gitlab.po2526
-rw-r--r--locale/uz_UZ/gitlab.po2526
-rw-r--r--locale/vi_VN/gitlab.po2519
-rw-r--r--locale/zh_CN/gitlab.po2807
-rw-r--r--locale/zh_HK/gitlab.po2523
-rw-r--r--locale/zh_TW/gitlab.po2523
-rw-r--r--package.json65
-rw-r--r--qa/Dockerfile8
-rw-r--r--qa/Gemfile1
-rw-r--r--qa/Gemfile.lock22
-rw-r--r--qa/qa.rb7
-rw-r--r--qa/qa/page/component/invite_members_modal.rb80
-rw-r--r--qa/qa/page/component/issue_board/show.rb8
-rw-r--r--qa/qa/page/component/new_snippet.rb6
-rw-r--r--qa/qa/page/component/note.rb3
-rw-r--r--qa/qa/page/dashboard/snippet/edit.rb6
-rw-r--r--qa/qa/page/group/members.rb29
-rw-r--r--qa/qa/page/group/menu.rb13
-rw-r--r--qa/qa/page/group/settings/package_registries.rb42
-rw-r--r--qa/qa/page/main/login.rb2
-rw-r--r--qa/qa/page/merge_request/show.rb32
-rw-r--r--qa/qa/page/project/import/github.rb8
-rw-r--r--qa/qa/page/project/issue/index.rb15
-rw-r--r--qa/qa/page/project/members.rb35
-rw-r--r--qa/qa/page/project/operations/kubernetes/index.rb4
-rw-r--r--qa/qa/page/project/registry/show.rb40
-rw-r--r--qa/qa/page/project/settings/main.rb13
-rw-r--r--qa/qa/page/project/settings/merge_request.rb8
-rw-r--r--qa/qa/page/project/sub_menus/packages.rb19
-rw-r--r--qa/qa/page/project/sub_menus/settings.rb2
-rw-r--r--qa/qa/resource/clusters/agent_token.rb2
-rw-r--r--qa/qa/resource/members.rb13
-rw-r--r--qa/qa/resource/merge_request.rb10
-rw-r--r--qa/qa/resource/personal_access_token.rb52
-rw-r--r--qa/qa/resource/project.rb14
-rw-r--r--qa/qa/resource/project_imported_from_github.rb4
-rw-r--r--qa/qa/resource/project_snippet.rb6
-rw-r--r--qa/qa/resource/registry_repository.rb53
-rw-r--r--qa/qa/resource/snippet.rb37
-rw-r--r--qa/qa/resource/user.rb15
-rw-r--r--qa/qa/runtime/api/client.rb38
-rw-r--r--qa/qa/runtime/api/repository_storage_moves.rb22
-rw-r--r--qa/qa/runtime/env.rb26
-rw-r--r--qa/qa/service/praefect_manager.rb42
-rw-r--r--qa/qa/specs/features/api/3_create/gitaly/backend_node_recovery_spec.rb15
-rw-r--r--qa/qa/specs/features/api/3_create/merge_request/push_options_remove_source_branch_spec.rb6
-rw-r--r--qa/qa/specs/features/api/3_create/snippet/snippet_repository_storage_move_spec.rb45
-rw-r--r--qa/qa/specs/features/api/4_verify/.gitkeep0
-rw-r--r--qa/qa/specs/features/api/4_verify/pipeline_deletion_spec.rb82
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/group/transfer_project_spec.rb3
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/login/2fa_recovery_spec.rb1
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/login/log_in_with_2fa_spec.rb1
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/login/register_spec.rb1
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/project/add_project_member_spec.rb12
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/project/dashboard_images_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/project/import_github_repo_spec.rb1
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/project/protected_tags_spec.rb7
-rw-r--r--qa/qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb6
-rw-r--r--qa/qa/specs/features/browser_ui/2_plan/issue/check_mentions_for_xss_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/2_plan/issue/mentions_spec.rb4
-rw-r--r--qa/qa/specs/features/browser_ui/2_plan/issue/real_time_assignee_spec.rb1
-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/merge_merge_request_from_fork_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/merge_request/merge_when_pipeline_succeeds_spec.rb84
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/merge_request/rebase_merge_request_spec.rb4
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/repository/clone_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/repository/move_project_create_fork_spec.rb1
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/repository/push_http_private_token_spec.rb4
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/repository/push_over_http_file_size_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/repository/push_over_http_spec.rb4
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/repository/push_over_ssh_spec.rb3
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/repository/push_protected_branch_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/snippet/add_comment_to_snippet_spec.rb5
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/snippet/add_file_to_snippet_spec.rb7
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/snippet/clone_push_pull_personal_snippet_spec.rb4
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/snippet/clone_push_pull_project_snippet_spec.rb6
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/snippet/copy_snippet_file_contents_spec.rb5
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/snippet/create_personal_snippet_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/snippet/delete_file_from_snippet_spec.rb7
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/snippet/share_snippet_spec.rb4
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/container_registry_spec.rb77
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/maven_gradle_repository_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/maven_repository_spec.rb149
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/npm_registry_spec.rb6
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/nuget_repository_spec.rb12
-rw-r--r--qa/qa/specs/features/browser_ui/7_configure/auto_devops/create_project_with_auto_devops_spec.rb4
-rw-r--r--qa/qa/specs/features/browser_ui/non_devops/performance_bar_spec.rb2
-rw-r--r--qa/qa/support/api.rb1
-rw-r--r--qa/qa/tools/initialize_gitlab_auth.rb2
-rw-r--r--qa/spec/runtime/api/client_spec.rb2
-rw-r--r--qa/spec/runtime/env_spec.rb1
-rw-r--r--qa/spec/specs/helpers/quarantine_spec.rb73
-rw-r--r--qa/spec/support/matchers/have_matcher.rb1
-rw-r--r--qa/tls_certificates/authority/ca.crt32
-rw-r--r--qa/tls_certificates/authority/ca.key51
-rw-r--r--qa/tls_certificates/authority/ca.pem83
-rw-r--r--rubocop/cop/graphql/authorize_types.rb5
-rw-r--r--rubocop/cop/graphql/descriptions.rb52
-rw-r--r--rubocop/cop/migration/add_columns_to_wide_tables.rb4
-rw-r--r--rubocop/cop/migration/with_lock_retries_disallowed_method.rb1
-rw-r--r--rubocop/rubocop-migrations.yml1
-rw-r--r--rubocop/rubocop-usage-data.yml1
-rwxr-xr-xscripts/flaky_examples/prune-old-flaky-examples9
-rw-r--r--scripts/frontend/block_dependencies.js8
-rwxr-xr-xscripts/frontend/check_page_bundle_mixins_css_for_sideeffects.js2
-rwxr-xr-xscripts/frontend/execute-on-staged-files.sh25
-rw-r--r--scripts/frontend/extract_gettext_all.js39
-rwxr-xr-xscripts/frontend/file_test_coverage.js44
-rw-r--r--scripts/frontend/frontend_script_utils.js20
-rw-r--r--scripts/frontend/merge_coverage_frontend.js13
-rw-r--r--scripts/frontend/parallel_ci_sequencer.js24
-rw-r--r--scripts/frontend/prettier.js121
-rw-r--r--scripts/frontend/stylelint/stylelint-duplicate-selectors.js6
-rw-r--r--scripts/frontend/stylelint/stylelint-utility-classes.js5
-rw-r--r--scripts/frontend/stylelint/stylelint-utility-map.js30
-rw-r--r--scripts/frontend/stylelint/stylelint-utils.js11
-rwxr-xr-xscripts/frontend/webpack_dev_server.js12
-rwxr-xr-xscripts/lint-doc.sh2
-rw-r--r--scripts/review_apps/base-config.yaml20
-rwxr-xr-xscripts/review_apps/review-apps.sh2
-rwxr-xr-xscripts/static-analysis7
-rwxr-xr-xscripts/update-workhorse59
-rwxr-xr-xscripts/validate_migration_schema2
-rwxr-xr-xscripts/verify-tff-mapping6
-rw-r--r--spec/bin/feature_flag_spec.rb11
-rw-r--r--spec/controllers/admin/application_settings_controller_spec.rb4
-rw-r--r--spec/controllers/admin/instance_statistics_controller_spec.rb17
-rw-r--r--spec/controllers/admin/usage_trends_controller_spec.rb17
-rw-r--r--spec/controllers/concerns/spammable_actions_spec.rb33
-rw-r--r--spec/controllers/explore/projects_controller_spec.rb17
-rw-r--r--spec/controllers/groups/boards_controller_spec.rb6
-rw-r--r--spec/controllers/groups/clusters/applications_controller_spec.rb3
-rw-r--r--spec/controllers/groups/clusters_controller_spec.rb33
-rw-r--r--spec/controllers/groups/dependency_proxy_for_containers_controller_spec.rb14
-rw-r--r--spec/controllers/groups_controller_spec.rb28
-rw-r--r--spec/controllers/help_controller_spec.rb27
-rw-r--r--spec/controllers/import/bulk_imports_controller_spec.rb31
-rw-r--r--spec/controllers/notification_settings_controller_spec.rb202
-rw-r--r--spec/controllers/projects/blob_controller_spec.rb72
-rw-r--r--spec/controllers/projects/boards_controller_spec.rb8
-rw-r--r--spec/controllers/projects/branches_controller_spec.rb8
-rw-r--r--spec/controllers/projects/ci/daily_build_group_report_results_controller_spec.rb52
-rw-r--r--spec/controllers/projects/ci/pipeline_editor_controller_spec.rb13
-rw-r--r--spec/controllers/projects/compare_controller_spec.rb243
-rw-r--r--spec/controllers/projects/design_management/designs/raw_images_controller_spec.rb15
-rw-r--r--spec/controllers/projects/issues_controller_spec.rb21
-rw-r--r--spec/controllers/projects/notes_controller_spec.rb50
-rw-r--r--spec/controllers/projects/snippets_controller_spec.rb6
-rw-r--r--spec/controllers/projects/templates_controller_spec.rb27
-rw-r--r--spec/controllers/projects/web_ide_schemas_controller_spec.rb4
-rw-r--r--spec/controllers/projects_controller_spec.rb33
-rw-r--r--spec/controllers/repositories/git_http_controller_spec.rb19
-rw-r--r--spec/controllers/root_controller_spec.rb22
-rw-r--r--spec/controllers/search_controller_spec.rb40
-rw-r--r--spec/controllers/snippets/notes_controller_spec.rb16
-rw-r--r--spec/db/schema_spec.rb10
-rw-r--r--spec/deprecation_toolkit_env.rb1
-rw-r--r--spec/experiments/application_experiment/cache_spec.rb54
-rw-r--r--spec/experiments/application_experiment_spec.rb64
-rw-r--r--spec/factories/alert_management/alerts.rb6
-rw-r--r--spec/factories/analytics/instance_statistics/measurement.rb25
-rw-r--r--spec/factories/analytics/usage_trends/measurement.rb25
-rw-r--r--spec/factories/ci/build_trace_chunks.rb2
-rw-r--r--spec/factories/ci/builds.rb2
-rw-r--r--spec/factories/ci/pipelines.rb8
-rw-r--r--spec/factories/clusters/agent_tokens.rb2
-rw-r--r--spec/factories/custom_emoji.rb1
-rw-r--r--spec/factories/dependency_proxy.rb3
-rw-r--r--spec/factories/design_management/versions.rb5
-rw-r--r--spec/factories/environments.rb16
-rw-r--r--spec/factories/gitlab/database/background_migration/batched_jobs.rb12
-rw-r--r--spec/factories/gitlab/database/background_migration/batched_migrations.rb13
-rw-r--r--spec/factories/go_module_commits.rb10
-rw-r--r--spec/factories/go_module_versions.rb40
-rw-r--r--spec/factories/go_modules.rb2
-rw-r--r--spec/factories/groups.rb32
-rw-r--r--spec/factories/iterations.rb66
-rw-r--r--spec/factories/namespaces.rb40
-rw-r--r--spec/factories/packages.rb9
-rw-r--r--spec/factories/project_repository_storage_moves.rb12
-rw-r--r--spec/factories/projects.rb2
-rw-r--r--spec/factories/prometheus_alert_event.rb5
-rw-r--r--spec/factories/self_managed_prometheus_alert_event.rb11
-rw-r--r--spec/factories/snippet_repository_storage_moves.rb12
-rw-r--r--spec/factories_spec.rb57
-rw-r--r--spec/features/admin/admin_projects_spec.rb97
-rw-r--r--spec/features/admin/admin_settings_spec.rb15
-rw-r--r--spec/features/alerts_settings/user_views_alerts_settings_spec.rb7
-rw-r--r--spec/features/boards/boards_spec.rb18
-rw-r--r--spec/features/boards/sidebar_spec.rb30
-rw-r--r--spec/features/boards/user_adds_lists_to_board_spec.rb92
-rw-r--r--spec/features/commit_spec.rb16
-rw-r--r--spec/features/dashboard/group_spec.rb2
-rw-r--r--spec/features/dashboard/projects_spec.rb8
-rw-r--r--spec/features/discussion_comments/commit_spec.rb2
-rw-r--r--spec/features/discussion_comments/issue_spec.rb4
-rw-r--r--spec/features/discussion_comments/merge_request_spec.rb3
-rw-r--r--spec/features/discussion_comments/snippets_spec.rb4
-rw-r--r--spec/features/expand_collapse_diffs_spec.rb10
-rw-r--r--spec/features/groups/container_registry_spec.rb8
-rw-r--r--spec/features/groups/members/list_members_spec.rb42
-rw-r--r--spec/features/groups/members/manage_members_spec.rb12
-rw-r--r--spec/features/groups/settings/user_searches_in_settings_spec.rb36
-rw-r--r--spec/features/groups/show_spec.rb5
-rw-r--r--spec/features/groups_spec.rb22
-rw-r--r--spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb2
-rw-r--r--spec/features/issues/csv_spec.rb4
-rw-r--r--spec/features/issues/gfm_autocomplete_spec.rb682
-rw-r--r--spec/features/issues/issue_state_spec.rb26
-rw-r--r--spec/features/issues/user_interacts_with_awards_spec.rb8
-rw-r--r--spec/features/labels_hierarchy_spec.rb2
-rw-r--r--spec/features/merge_request/batch_comments_spec.rb2
-rw-r--r--spec/features/merge_request/user_closes_reopens_merge_request_state_spec.rb33
-rw-r--r--spec/features/merge_request/user_posts_diff_notes_spec.rb2
-rw-r--r--spec/features/merge_request/user_posts_notes_spec.rb5
-rw-r--r--spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb10
-rw-r--r--spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb6
-rw-r--r--spec/features/merge_request/user_sees_discussions_spec.rb2
-rw-r--r--spec/features/merge_request/user_sees_merge_request_pipelines_spec.rb1
-rw-r--r--spec/features/merge_request/user_sees_merge_widget_spec.rb2
-rw-r--r--spec/features/merge_request/user_sees_mini_pipeline_graph_spec.rb217
-rw-r--r--spec/features/merge_request/user_sees_notes_from_forked_project_spec.rb2
-rw-r--r--spec/features/merge_request/user_selects_branches_for_new_mr_spec.rb8
-rw-r--r--spec/features/merge_request/user_suggests_changes_on_diff_spec.rb2
-rw-r--r--spec/features/merge_request/user_toggles_whitespace_changes_spec.rb4
-rw-r--r--spec/features/merge_requests/user_exports_as_csv_spec.rb6
-rw-r--r--spec/features/participants_autocomplete_spec.rb1
-rw-r--r--spec/features/profiles/personal_access_tokens_spec.rb6
-rw-r--r--spec/features/profiles/user_visits_notifications_tab_spec.rb9
-rw-r--r--spec/features/project_group_variables_spec.rb2
-rw-r--r--spec/features/project_variables_spec.rb3
-rw-r--r--spec/features/projects/active_tabs_spec.rb6
-rw-r--r--spec/features/projects/ci/lint_spec.rb2
-rw-r--r--spec/features/projects/container_registry_spec.rb8
-rw-r--r--spec/features/projects/environments/environments_spec.rb80
-rw-r--r--spec/features/projects/feature_flags/user_sees_feature_flag_list_spec.rb2
-rw-r--r--spec/features/projects/files/gitlab_ci_syntax_yml_dropdown_spec.rb54
-rw-r--r--spec/features/projects/fork_spec.rb270
-rw-r--r--spec/features/projects/members/anonymous_user_sees_members_spec.rb22
-rw-r--r--spec/features/projects/members/group_members_spec.rb244
-rw-r--r--spec/features/projects/members/groups_with_access_list_spec.rb176
-rw-r--r--spec/features/projects/members/invite_group_spec.rb77
-rw-r--r--spec/features/projects/members/list_spec.rb254
-rw-r--r--spec/features/projects/members/master_adds_member_with_expiration_date_spec.rb110
-rw-r--r--spec/features/projects/members/sorting_spec.rb186
-rw-r--r--spec/features/projects/members/tabs_spec.rb72
-rw-r--r--spec/features/projects/merge_request_button_spec.rb64
-rw-r--r--spec/features/projects/new_project_spec.rb48
-rw-r--r--spec/features/projects/pages/user_edits_settings_spec.rb4
-rw-r--r--spec/features/projects/pipelines/pipelines_spec.rb90
-rw-r--r--spec/features/projects/releases/user_creates_release_spec.rb31
-rw-r--r--spec/features/projects/settings/operations_settings_spec.rb2
-rw-r--r--spec/features/projects/settings/service_desk_setting_spec.rb45
-rw-r--r--spec/features/projects/settings/user_manages_merge_requests_settings_spec.rb8
-rw-r--r--spec/features/projects/settings/user_manages_project_members_spec.rb129
-rw-r--r--spec/features/projects/settings/user_searches_in_settings_spec.rb42
-rw-r--r--spec/features/projects/show/user_manages_notifications_spec.rb34
-rw-r--r--spec/features/projects/show/user_uploads_files_spec.rb20
-rw-r--r--spec/features/projects/user_sees_sidebar_spec.rb4
-rw-r--r--spec/features/projects/user_uses_shortcuts_spec.rb4
-rw-r--r--spec/features/projects_spec.rb2
-rw-r--r--spec/features/security/group/internal_access_spec.rb35
-rw-r--r--spec/features/security/group/private_access_spec.rb42
-rw-r--r--spec/features/security/group/public_access_spec.rb35
-rw-r--r--spec/features/sentry_js_spec.rb2
-rw-r--r--spec/features/task_lists_spec.rb8
-rw-r--r--spec/features/uploads/user_uploads_avatar_to_profile_spec.rb3
-rw-r--r--spec/features/user_can_display_performance_bar_spec.rb24
-rw-r--r--spec/finders/admin/plans_finder_spec.rb54
-rw-r--r--spec/finders/boards/boards_finder_spec.rb24
-rw-r--r--spec/finders/ci/daily_build_group_report_results_finder_spec.rb91
-rw-r--r--spec/finders/ci/testing/daily_build_group_report_results_finder_spec.rb99
-rw-r--r--spec/finders/issues_finder_spec.rb59
-rw-r--r--spec/finders/merge_request_target_project_finder_spec.rb11
-rw-r--r--spec/finders/merge_requests/oldest_per_commit_finder_spec.rb61
-rw-r--r--spec/finders/merge_requests_finder_spec.rb55
-rw-r--r--spec/finders/namespaces/projects_finder_spec.rb83
-rw-r--r--spec/finders/packages/group_packages_finder_spec.rb2
-rw-r--r--spec/finders/packages/npm/package_finder_spec.rb130
-rw-r--r--spec/finders/packages/package_finder_spec.rb2
-rw-r--r--spec/finders/packages/packages_finder_spec.rb2
-rw-r--r--spec/finders/projects/groups_finder_spec.rb103
-rw-r--r--spec/finders/repositories/changelog_commits_finder_spec.rb93
-rw-r--r--spec/finders/repositories/commits_with_trailer_finder_spec.rb38
-rw-r--r--spec/finders/repositories/previous_tag_finder_spec.rb8
-rw-r--r--spec/finders/security/license_compliance_jobs_finder_spec.rb5
-rw-r--r--spec/finders/users_finder_spec.rb20
-rw-r--r--spec/fixtures/api/schemas/entities/test_suite_comparer.json9
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/packages/composer/index.json5
-rw-r--r--spec/fixtures/dependency_proxy/manifest44
-rw-r--r--spec/fixtures/lib/gitlab/import_export/complex/project.json3
-rw-r--r--spec/fixtures/security_reports/master/gl-sast-report.json16
-rw-r--r--spec/frontend/.eslintrc.yml1
-rw-r--r--spec/frontend/__helpers__/fake_date/fixtures.js4
-rw-r--r--spec/frontend/__helpers__/fake_date/index.js1
-rw-r--r--spec/frontend/__helpers__/vue_test_utils_helper.js13
-rw-r--r--spec/frontend/__helpers__/vue_test_utils_helper_spec.js17
-rw-r--r--spec/frontend/__mocks__/@gitlab/ui.js5
-rw-r--r--spec/frontend/access_tokens/components/projects_field_spec.js131
-rw-r--r--spec/frontend/access_tokens/components/projects_token_selector_spec.js269
-rw-r--r--spec/frontend/access_tokens/index_spec.js74
-rw-r--r--spec/frontend/admin/users/tabs_spec.js37
-rw-r--r--spec/frontend/alert_management/components/alert_management_table_spec.js82
-rw-r--r--spec/frontend/alerts_settings/components/__snapshots__/alerts_settings_form_spec.js.snap700
-rw-r--r--spec/frontend/alerts_settings/components/alert_mapping_builder_spec.js28
-rw-r--r--spec/frontend/alerts_settings/components/alerts_settings_form_spec.js227
-rw-r--r--spec/frontend/alerts_settings/components/alerts_settings_wrapper_spec.js231
-rw-r--r--spec/frontend/alerts_settings/components/mocks/apollo_mock.js17
-rw-r--r--spec/frontend/alerts_settings/mocks/alert_fields.json (renamed from spec/frontend/alerts_settings/mocks/alertFields.json)0
-rw-r--r--spec/frontend/alerts_settings/mocks/parsed_mapping.json122
-rw-r--r--spec/frontend/alerts_settings/utils/mapping_transformations_spec.js34
-rw-r--r--spec/frontend/analytics/instance_statistics/components/__snapshots__/instance_statistics_count_chart_spec.js.snap41
-rw-r--r--spec/frontend/analytics/instance_statistics/components/app_spec.js45
-rw-r--r--spec/frontend/analytics/instance_statistics/components/instance_counts_spec.js54
-rw-r--r--spec/frontend/analytics/instance_statistics/components/instance_statistics_count_chart_spec.js177
-rw-r--r--spec/frontend/analytics/instance_statistics/components/projects_and_groups_chart_spec.js215
-rw-r--r--spec/frontend/analytics/instance_statistics/components/users_chart_spec.js174
-rw-r--r--spec/frontend/analytics/instance_statistics/mock_data.js35
-rw-r--r--spec/frontend/analytics/instance_statistics/utils_spec.js81
-rw-r--r--spec/frontend/analytics/usage_trends/apollo_mock_data.js (renamed from spec/frontend/analytics/instance_statistics/apollo_mock_data.js)0
-rw-r--r--spec/frontend/analytics/usage_trends/components/__snapshots__/usage_trends_count_chart_spec.js.snap41
-rw-r--r--spec/frontend/analytics/usage_trends/components/app_spec.js40
-rw-r--r--spec/frontend/analytics/usage_trends/components/instance_counts_spec.js54
-rw-r--r--spec/frontend/analytics/usage_trends/components/usage_trends_count_chart_spec.js177
-rw-r--r--spec/frontend/analytics/usage_trends/components/users_chart_spec.js174
-rw-r--r--spec/frontend/analytics/usage_trends/mock_data.js35
-rw-r--r--spec/frontend/analytics/usage_trends/utils_spec.js81
-rw-r--r--spec/frontend/api_spec.js62
-rw-r--r--spec/frontend/artifacts_settings/components/__snapshots__/keep_latest_artifact_checkbox_spec.js.snap1
-rw-r--r--spec/frontend/authentication/u2f/authenticate_spec.js2
-rw-r--r--spec/frontend/authentication/u2f/register_spec.js2
-rw-r--r--spec/frontend/authentication/webauthn/authenticate_spec.js1
-rw-r--r--spec/frontend/authentication/webauthn/register_spec.js1
-rw-r--r--spec/frontend/awards_handler_spec.js15
-rw-r--r--spec/frontend/batch_comments/stores/modules/batch_comments/actions_spec.js59
-rw-r--r--spec/frontend/behaviors/quick_submit_spec.js2
-rw-r--r--spec/frontend/behaviors/requires_input_spec.js1
-rw-r--r--spec/frontend/behaviors/shortcuts/shortcuts_issuable_spec.js2
-rw-r--r--spec/frontend/blob/blob_file_dropzone_spec.js14
-rw-r--r--spec/frontend/blob/sketch/index_spec.js2
-rw-r--r--spec/frontend/blob/viewer/index_spec.js8
-rw-r--r--spec/frontend/boards/board_card_inner_spec.js371
-rw-r--r--spec/frontend/boards/board_list_spec.js43
-rw-r--r--spec/frontend/boards/board_new_issue_deprecated_spec.js8
-rw-r--r--spec/frontend/boards/components/board_add_new_column_form_spec.js166
-rw-r--r--spec/frontend/boards/components/board_add_new_column_spec.js115
-rw-r--r--spec/frontend/boards/components/board_card_deprecated_spec.js219
-rw-r--r--spec/frontend/boards/components/board_card_layout_deprecated_spec.js2
-rw-r--r--spec/frontend/boards/components/board_card_layout_spec.js116
-rw-r--r--spec/frontend/boards/components/board_card_spec.js265
-rw-r--r--spec/frontend/boards/components/board_form_spec.js9
-rw-r--r--spec/frontend/boards/components/board_list_header_spec.js76
-rw-r--r--spec/frontend/boards/components/board_new_issue_spec.js3
-rw-r--r--spec/frontend/boards/components/filtered_search_spec.js65
-rw-r--r--spec/frontend/boards/components/sidebar/board_sidebar_due_date_spec.js8
-rw-r--r--spec/frontend/boards/components/sidebar/board_sidebar_issue_title_spec.js6
-rw-r--r--spec/frontend/boards/components/sidebar/board_sidebar_labels_select_spec.js4
-rw-r--r--spec/frontend/boards/components/sidebar/board_sidebar_milestone_select_spec.js6
-rw-r--r--spec/frontend/boards/components/sidebar/board_sidebar_subscription_spec.js2
-rw-r--r--spec/frontend/boards/components/sidebar/remove_issue_spec.js28
-rw-r--r--spec/frontend/boards/issue_card_inner_spec.js372
-rw-r--r--spec/frontend/boards/stores/actions_spec.js206
-rw-r--r--spec/frontend/boards/stores/getters_spec.js59
-rw-r--r--spec/frontend/boards/stores/mutations_spec.js135
-rw-r--r--spec/frontend/bootstrap_linked_tabs_spec.js2
-rw-r--r--spec/frontend/captcha/captcha_modal_axios_interceptor_spec.js119
-rw-r--r--spec/frontend/captcha/wait_for_captcha_to_be_solved_spec.js56
-rw-r--r--spec/frontend/ci_variable_list/ci_variable_list/ci_variable_list_spec.js3
-rw-r--r--spec/frontend/ci_variable_list/ci_variable_list/native_form_variable_list_spec.js2
-rw-r--r--spec/frontend/ci_variable_list/components/ci_environments_dropdown_spec.js27
-rw-r--r--spec/frontend/clusters_list/components/clusters_spec.js2
-rw-r--r--spec/frontend/clusters_list/store/actions_spec.js2
-rw-r--r--spec/frontend/collapsed_sidebar_todo_spec.js3
-rw-r--r--spec/frontend/commit/pipelines/pipelines_spec.js4
-rw-r--r--spec/frontend/create_item_dropdown_spec.js2
-rw-r--r--spec/frontend/deprecated_jquery_dropdown_spec.js2
-rw-r--r--spec/frontend/design_management/components/delete_button_spec.js4
-rw-r--r--spec/frontend/design_management/components/design_notes/design_discussion_spec.js10
-rw-r--r--spec/frontend/design_management/components/list/item_spec.js2
-rw-r--r--spec/frontend/design_management/components/toolbar/index_spec.js4
-rw-r--r--spec/frontend/design_management/components/upload/__snapshots__/button_spec.js.snap4
-rw-r--r--spec/frontend/design_management/pages/index_spec.js6
-rw-r--r--spec/frontend/diffs/components/app_spec.js22
-rw-r--r--spec/frontend/diffs/components/settings_dropdown_spec.js160
-rw-r--r--spec/frontend/diffs/mock_data/diff_with_commit.js2
-rw-r--r--spec/frontend/diffs/store/utils_spec.js6
-rw-r--r--spec/frontend/diffs/utils/file_reviews_spec.js10
-rw-r--r--spec/frontend/diffs/utils/preferences_spec.js35
-rw-r--r--spec/frontend/emoji/components/category_spec.js49
-rw-r--r--spec/frontend/emoji/components/emoji_group_spec.js56
-rw-r--r--spec/frontend/emoji/components/emoji_list_spec.js73
-rw-r--r--spec/frontend/environments/environments_app_spec.js12
-rw-r--r--spec/frontend/environments/folder/environments_folder_view_spec.js14
-rw-r--r--spec/frontend/experimentation/experiment_tracking_spec.js80
-rw-r--r--spec/frontend/experimentation/utils_spec.js38
-rw-r--r--spec/frontend/feature_flags/components/configure_feature_flags_modal_spec.js23
-rw-r--r--spec/frontend/feature_flags/components/edit_feature_flag_spec.js7
-rw-r--r--spec/frontend/filtered_search/dropdown_user_spec.js1
-rw-r--r--spec/frontend/filtered_search/dropdown_utils_spec.js1
-rw-r--r--spec/frontend/filtered_search/visual_token_value_spec.js2
-rw-r--r--spec/frontend/fixtures/issues.rb2
-rw-r--r--spec/frontend/fixtures/pipelines.rb32
-rw-r--r--spec/frontend/fixtures/projects.rb33
-rw-r--r--spec/frontend/fixtures/test_report.rb29
-rw-r--r--spec/frontend/gfm_auto_complete_spec.js132
-rw-r--r--spec/frontend/gl_field_errors_spec.js2
-rw-r--r--spec/frontend/graphql_shared/utils_spec.js34
-rw-r--r--spec/frontend/groups/components/group_item_spec.js5
-rw-r--r--spec/frontend/header_spec.js1
-rw-r--r--spec/frontend/ide/components/pipelines/__snapshots__/list_spec.js.snap1
-rw-r--r--spec/frontend/ide/components/pipelines/list_spec.js1
-rw-r--r--spec/frontend/ide/components/repo_editor_spec.js1106
-rw-r--r--spec/frontend/ide/components/repo_tab_spec.js19
-rw-r--r--spec/frontend/import_entities/import_groups/components/import_table_row_spec.js109
-rw-r--r--spec/frontend/import_entities/import_groups/components/import_table_spec.js50
-rw-r--r--spec/frontend/import_entities/import_groups/graphql/client_factory_spec.js90
-rw-r--r--spec/frontend/import_entities/import_groups/graphql/services/source_groups_manager_spec.js55
-rw-r--r--spec/frontend/import_entities/import_groups/graphql/services/status_poller_spec.js21
-rw-r--r--spec/frontend/incidents/mocks/incidents.json2
-rw-r--r--spec/frontend/incidents_settings/components/__snapshots__/alerts_form_spec.js.snap4
-rw-r--r--spec/frontend/integrations/edit/components/integration_form_spec.js21
-rw-r--r--spec/frontend/integrations/integration_settings_form_spec.js1
-rw-r--r--spec/frontend/invite_members/components/group_select_spec.js90
-rw-r--r--spec/frontend/invite_members/components/invite_group_trigger_spec.js50
-rw-r--r--spec/frontend/invite_members/components/invite_members_modal_spec.js141
-rw-r--r--spec/frontend/invite_members/components/invite_members_trigger_spec.js31
-rw-r--r--spec/frontend/invite_members/components/members_token_select_spec.js2
-rw-r--r--spec/frontend/issuable/components/csv_export_modal_spec.js91
-rw-r--r--spec/frontend/issuable/components/csv_import_export_buttons_spec.js161
-rw-r--r--spec/frontend/issuable/components/csv_import_modal_spec.js86
-rw-r--r--spec/frontend/issuable_list/components/issuable_item_spec.js2
-rw-r--r--spec/frontend/issue_show/components/app_spec.js47
-rw-r--r--spec/frontend/issue_show/components/description_spec.js31
-rw-r--r--spec/frontend/issue_show/components/fields/description_template_spec.js39
-rw-r--r--spec/frontend/issue_show/components/form_spec.js12
-rw-r--r--spec/frontend/issue_spec.js121
-rw-r--r--spec/frontend/issues_list/components/issuable_spec.js35
-rw-r--r--spec/frontend/issues_list/components/jira_issues_import_status_app_spec.js115
-rw-r--r--spec/frontend/issues_list/components/jira_issues_list_root_spec.js115
-rw-r--r--spec/frontend/jira_connect/components/app_spec.js106
-rw-r--r--spec/frontend/jira_connect/components/groups_list_item_spec.js12
-rw-r--r--spec/frontend/jira_connect/store/mutations_spec.js18
-rw-r--r--spec/frontend/jira_connect/utils_spec.js32
-rw-r--r--spec/frontend/jobs/components/job_sidebar_retry_button_spec.js2
-rw-r--r--spec/frontend/jobs/components/jobs_container_spec.js70
-rw-r--r--spec/frontend/lib/utils/experimentation_spec.js20
-rw-r--r--spec/frontend/lib/utils/number_utility_spec.js22
-rw-r--r--spec/frontend/lib/utils/select2_utils_spec.js100
-rw-r--r--spec/frontend/lib/utils/text_markdown_spec.js53
-rw-r--r--spec/frontend/lib/utils/unit_format/index_spec.js304
-rw-r--r--spec/frontend/lib/utils/url_utility_spec.js8
-rw-r--r--spec/frontend/line_highlighter_spec.js1
-rw-r--r--spec/frontend/locale/index_spec.js66
-rw-r--r--spec/frontend/members/components/avatars/user_avatar_spec.js26
-rw-r--r--spec/frontend/members/mock_data.js2
-rw-r--r--spec/frontend/members/utils_spec.js37
-rw-r--r--spec/frontend/merge_conflicts/store/actions_spec.js257
-rw-r--r--spec/frontend/merge_request_spec.js1
-rw-r--r--spec/frontend/merge_request_tabs_spec.js5
-rw-r--r--spec/frontend/mini_pipeline_graph_dropdown_spec.js2
-rw-r--r--spec/frontend/monitoring/components/dashboard_panel_builder_spec.js2
-rw-r--r--spec/frontend/monitoring/components/duplicate_dashboard_form_spec.js2
-rw-r--r--spec/frontend/monitoring/requests/index_spec.js6
-rw-r--r--spec/frontend/new_branch_spec.js2
-rw-r--r--spec/frontend/notes/components/comment_form_spec.js134
-rw-r--r--spec/frontend/notes/components/diff_discussion_header_spec.js4
-rw-r--r--spec/frontend/notes/components/discussion_actions_spec.js2
-rw-r--r--spec/frontend/notes/components/discussion_reply_placeholder_spec.js14
-rw-r--r--spec/frontend/notes/components/note_actions_spec.js11
-rw-r--r--spec/frontend/notes/components/note_form_spec.js2
-rw-r--r--spec/frontend/notes/components/noteable_discussion_spec.js4
-rw-r--r--spec/frontend/notes/components/noteable_note_spec.js214
-rw-r--r--spec/frontend/notes/components/notes_app_spec.js4
-rw-r--r--spec/frontend/notes/stores/actions_spec.js66
-rw-r--r--spec/frontend/notes/stores/getters_spec.js2
-rw-r--r--spec/frontend/notifications/components/custom_notifications_modal_spec.js4
-rw-r--r--spec/frontend/notifications/components/notifications_dropdown_spec.js38
-rw-r--r--spec/frontend/oauth_remember_me_spec.js2
-rw-r--r--spec/frontend/packages/details/components/__snapshots__/conan_installation_spec.js.snap9
-rw-r--r--spec/frontend/packages/details/components/__snapshots__/maven_installation_spec.js.snap40
-rw-r--r--spec/frontend/packages/details/components/__snapshots__/npm_installation_spec.js.snap9
-rw-r--r--spec/frontend/packages/details/components/__snapshots__/nuget_installation_spec.js.snap9
-rw-r--r--spec/frontend/packages/details/components/__snapshots__/pypi_installation_spec.js.snap9
-rw-r--r--spec/frontend/packages/details/components/composer_installation_spec.js15
-rw-r--r--spec/frontend/packages/details/components/conan_installation_spec.js14
-rw-r--r--spec/frontend/packages/details/components/installation_title_spec.js58
-rw-r--r--spec/frontend/packages/details/components/maven_installation_spec.js120
-rw-r--r--spec/frontend/packages/details/components/npm_installation_spec.js14
-rw-r--r--spec/frontend/packages/details/components/nuget_installation_spec.js14
-rw-r--r--spec/frontend/packages/details/components/pypi_installation_spec.js14
-rw-r--r--spec/frontend/packages/details/store/getters_spec.js28
-rw-r--r--spec/frontend/packages/shared/components/__snapshots__/package_list_row_spec.js.snap4
-rw-r--r--spec/frontend/packages/shared/components/package_list_row_spec.js20
-rw-r--r--spec/frontend/packages/shared/utils_spec.js2
-rw-r--r--spec/frontend/pages/admin/abuse_reports/abuse_reports_spec.js2
-rw-r--r--spec/frontend/pages/admin/application_settings/account_and_limits_spec.js1
-rw-r--r--spec/frontend/pages/admin/users/new/index_spec.js2
-rw-r--r--spec/frontend/pages/dashboard/todos/index/todos_spec.js1
-rw-r--r--spec/frontend/pages/projects/forks/new/components/app_spec.js42
-rw-r--r--spec/frontend/pages/projects/forks/new/components/fork_form_spec.js275
-rw-r--r--spec/frontend/pages/projects/learn_gitlab/components/__snapshots__/learn_gitlab_a_spec.js.snap16
-rw-r--r--spec/frontend/pages/projects/learn_gitlab/components/__snapshots__/learn_gitlab_b_spec.js.snap569
-rw-r--r--spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_a_spec.js45
-rw-r--r--spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_b_spec.js75
-rw-r--r--spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_info_card_spec.js57
-rw-r--r--spec/frontend/pages/projects/learn_gitlab/components/mock_data.js42
-rw-r--r--spec/frontend/pages/projects/pipeline_schedules/shared/components/timezone_dropdown_spec.js2
-rw-r--r--spec/frontend/pages/projects/shared/permissions/components/settings_panel_spec.js1
-rw-r--r--spec/frontend/pages/sessions/new/preserve_url_fragment_spec.js2
-rw-r--r--spec/frontend/pages/sessions/new/signin_tabs_memoizer_spec.js2
-rw-r--r--spec/frontend/pages/shared/wikis/wiki_alert_spec.js40
-rw-r--r--spec/frontend/performance_bar/components/performance_bar_app_spec.js1
-rw-r--r--spec/frontend/performance_bar/index_spec.js1
-rw-r--r--spec/frontend/pipeline_editor/components/commit/commit_form_spec.js8
-rw-r--r--spec/frontend/pipeline_editor/components/commit/commit_section_spec.js4
-rw-r--r--spec/frontend/pipeline_editor/components/header/pipeline_editor_header_spec.js37
-rw-r--r--spec/frontend/pipeline_editor/components/header/pipeline_status_spec.js150
-rw-r--r--spec/frontend/pipeline_editor/components/header/validation_segment_spec.js21
-rw-r--r--spec/frontend/pipeline_editor/components/ui/pipeline_editor_empty_state_spec.js79
-rw-r--r--spec/frontend/pipeline_editor/graphql/resolvers_spec.js18
-rw-r--r--spec/frontend/pipeline_editor/mock_data.js16
-rw-r--r--spec/frontend/pipeline_editor/pipeline_editor_app_spec.js118
-rw-r--r--spec/frontend/pipeline_new/components/pipeline_new_form_spec.js141
-rw-r--r--spec/frontend/pipeline_new/components/refs_dropdown_spec.js182
-rw-r--r--spec/frontend/pipeline_new/mock_data.js20
-rw-r--r--spec/frontend/pipelines/components/pipelines_list/pipeline_mini_graph_spec.js83
-rw-r--r--spec/frontend/pipelines/components/pipelines_list/pipeline_stage_spec.js210
-rw-r--r--spec/frontend/pipelines/empty_state_spec.js3
-rw-r--r--spec/frontend/pipelines/graph/graph_component_spec.js4
-rw-r--r--spec/frontend/pipelines/graph/graph_component_wrapper_spec.js53
-rw-r--r--spec/frontend/pipelines/graph/linked_pipelines_column_spec.js4
-rw-r--r--spec/frontend/pipelines/graph_shared/links_inner_spec.js149
-rw-r--r--spec/frontend/pipelines/graph_shared/links_layer_spec.js18
-rw-r--r--spec/frontend/pipelines/mock_data.js322
-rw-r--r--spec/frontend/pipelines/pipeline_triggerer_spec.js4
-rw-r--r--spec/frontend/pipelines/pipeline_url_spec.js34
-rw-r--r--spec/frontend/pipelines/pipelines_actions_spec.js10
-rw-r--r--spec/frontend/pipelines/pipelines_artifacts_spec.js17
-rw-r--r--spec/frontend/pipelines/pipelines_spec.js29
-rw-r--r--spec/frontend/pipelines/pipelines_table_row_spec.js35
-rw-r--r--spec/frontend/pipelines/pipelines_table_spec.js223
-rw-r--r--spec/frontend/pipelines/stage_spec.js297
-rw-r--r--spec/frontend/pipelines/time_ago_spec.js14
-rw-r--r--spec/frontend/pipelines_spec.js2
-rw-r--r--spec/frontend/profile/account/components/update_username_spec.js33
-rw-r--r--spec/frontend/profile/preferences/components/profile_preferences_spec.js147
-rw-r--r--spec/frontend/profile/preferences/mock_data.js12
-rw-r--r--spec/frontend/project_select_combo_button_spec.js2
-rw-r--r--spec/frontend/projects/compare/components/app_legacy_spec.js116
-rw-r--r--spec/frontend/projects/compare/components/app_spec.js10
-rw-r--r--spec/frontend/projects/compare/components/repo_dropdown_spec.js98
-rw-r--r--spec/frontend/projects/compare/components/revision_card_spec.js49
-rw-r--r--spec/frontend/projects/compare/components/revision_dropdown_legacy_spec.js106
-rw-r--r--spec/frontend/projects/compare/components/revision_dropdown_spec.js18
-rw-r--r--spec/frontend/projects/details/upload_button_spec.js54
-rw-r--r--spec/frontend/projects/experiment_new_project_creation/components/new_project_push_tip_popover_spec.js75
-rw-r--r--spec/frontend/projects/experiment_new_project_creation/components/welcome_spec.js10
-rw-r--r--spec/frontend/projects/settings_service_desk/components/service_desk_root_spec.js2
-rw-r--r--spec/frontend/projects/upload_file_experiment_spec.js52
-rw-r--r--spec/frontend/prometheus_metrics/custom_metrics_spec.js1
-rw-r--r--spec/frontend/prometheus_metrics/prometheus_metrics_spec.js1
-rw-r--r--spec/frontend/protected_branches/protected_branch_edit_spec.js88
-rw-r--r--spec/frontend/read_more_spec.js2
-rw-r--r--spec/frontend/ref/components/__snapshots__/ref_selector_spec.js.snap70
-rw-r--r--spec/frontend/ref/components/ref_selector_spec.js211
-rw-r--r--spec/frontend/ref/stores/actions_spec.js22
-rw-r--r--spec/frontend/ref/stores/mutations_spec.js11
-rw-r--r--spec/frontend/registry/explorer/components/delete_button_spec.js1
-rw-r--r--spec/frontend/registry/explorer/components/details_page/details_header_spec.js51
-rw-r--r--spec/frontend/registry/explorer/components/list_page/image_list_row_spec.js11
-rw-r--r--spec/frontend/registry/explorer/components/list_page/registry_header_spec.js37
-rw-r--r--spec/frontend/registry/explorer/pages/details_spec.js22
-rw-r--r--spec/frontend/related_issues/components/related_issuable_input_spec.js117
-rw-r--r--spec/frontend/releases/components/tag_field_new_spec.js115
-rw-r--r--spec/frontend/reports/components/grouped_test_reports_app_spec.js49
-rw-r--r--spec/frontend/reports/components/summary_row_spec.js24
-rw-r--r--spec/frontend/reports/components/test_issue_body_spec.js117
-rw-r--r--spec/frontend/reports/mock_data/mock_data.js16
-rw-r--r--spec/frontend/reports/store/mutations_spec.js12
-rw-r--r--spec/frontend/repository/components/upload_blob_modal_spec.js193
-rw-r--r--spec/frontend/right_sidebar_spec.js1
-rw-r--r--spec/frontend/search/highlight_blob_search_result_spec.js2
-rw-r--r--spec/frontend/search_autocomplete_spec.js1
-rw-r--r--spec/frontend/security_configuration/configuration_table_spec.js42
-rw-r--r--spec/frontend/security_configuration/upgrade_spec.js19
-rw-r--r--spec/frontend/sentry/sentry_config_spec.js2
-rw-r--r--spec/frontend/settings_panels_spec.js2
-rw-r--r--spec/frontend/shared/popover_spec.js166
-rw-r--r--spec/frontend/shortcuts_spec.js2
-rw-r--r--spec/frontend/sidebar/__snapshots__/confidential_issue_sidebar_spec.js.snap199
-rw-r--r--spec/frontend/sidebar/components/confidential/sidebar_confidentiality_content_spec.js71
-rw-r--r--spec/frontend/sidebar/components/confidential/sidebar_confidentiality_form_spec.js173
-rw-r--r--spec/frontend/sidebar/components/confidential/sidebar_confidentiality_widget_spec.js159
-rw-r--r--spec/frontend/sidebar/components/reviewers/uncollapsed_reviewer_list_spec.js18
-rw-r--r--spec/frontend/sidebar/confidential/__snapshots__/edit_form_spec.js.snap50
-rw-r--r--spec/frontend/sidebar/confidential/edit_form_buttons_spec.js146
-rw-r--r--spec/frontend/sidebar/confidential/edit_form_spec.js48
-rw-r--r--spec/frontend/sidebar/confidential_issue_sidebar_spec.js159
-rw-r--r--spec/frontend/sidebar/mock_data.js13
-rw-r--r--spec/frontend/sidebar/subscriptions_spec.js9
-rw-r--r--spec/frontend/sidebar/user_data_mock.js1
-rw-r--r--spec/frontend/single_file_diff_spec.js96
-rw-r--r--spec/frontend/snippets/components/__snapshots__/snippet_visibility_edit_spec.js.snap6
-rw-r--r--spec/frontend/test_setup.js5
-rw-r--r--spec/frontend/tooltips/components/tooltips_spec.js10
-rw-r--r--spec/frontend/tracking_spec.js92
-rw-r--r--spec/frontend/user_popovers_spec.js27
-rw-r--r--spec/frontend/vue_mr_widget/components/artifacts_list_app_spec.js2
-rw-r--r--spec/frontend/vue_mr_widget/components/mr_collapsible_extension_spec.js14
-rw-r--r--spec/frontend/vue_mr_widget/components/mr_widget_pipeline_container_spec.js8
-rw-r--r--spec/frontend/vue_mr_widget/components/mr_widget_pipeline_spec.js38
-rw-r--r--spec/frontend/vue_mr_widget/components/states/__snapshots__/mr_widget_auto_merge_enabled_spec.js.snap2
-rw-r--r--spec/frontend/vue_mr_widget/components/states/mr_widget_conflicts_spec.js109
-rw-r--r--spec/frontend/vue_mr_widget/components/states/mr_widget_nothing_to_merge_spec.js12
-rw-r--r--spec/frontend/vue_mr_widget/deployment/deployment_list_spec.js101
-rw-r--r--spec/frontend/vue_shared/alert_details/alert_details_spec.js24
-rw-r--r--spec/frontend/vue_shared/alert_details/mocks/alerts.json2
-rw-r--r--spec/frontend/vue_shared/components/markdown/suggestion_diff_header_spec.js5
-rw-r--r--spec/frontend/vue_shared/components/multiselect_dropdown_spec.js4
-rw-r--r--spec/frontend/vue_shared/components/registry/__snapshots__/code_instruction_spec.js.snap90
-rw-r--r--spec/frontend/vue_shared/components/registry/persisted_dropdown_selection_spec.js122
-rw-r--r--spec/frontend/vue_shared/components/settings/__snapshots__/settings_block_spec.js.snap2
-rw-r--r--spec/frontend/vue_shared/components/settings/settings_block_spec.js21
-rw-r--r--spec/frontend/vue_shared/components/sidebar/labels_select_vue/dropdown_value_spec.js44
-rw-r--r--spec/frontend/vue_shared/components/sidebar/labels_select_vue/mock_data.js1
-rw-r--r--spec/frontend/vue_shared/components/tabs/tab_spec.js32
-rw-r--r--spec/frontend/vue_shared/components/tabs/tabs_spec.js61
-rw-r--r--spec/frontend/vue_shared/components/tooltip_on_truncate_spec.js11
-rw-r--r--spec/frontend/vue_shared/components/upload_dropzone/__snapshots__/upload_dropzone_spec.js.snap67
-rw-r--r--spec/frontend/vue_shared/components/upload_dropzone/upload_dropzone_spec.js34
-rw-r--r--spec/frontend/vue_shared/components/user_access_role_badge_spec.js26
-rw-r--r--spec/frontend/vue_shared/components/user_popover/user_popover_spec.js1
-rw-r--r--spec/frontend/vue_shared/directives/tooltip_spec.js157
-rw-r--r--spec/frontend/vue_shared/gl_feature_flags_plugin_spec.js8
-rw-r--r--spec/frontend/zen_mode_spec.js2
-rw-r--r--spec/frontend_integration/ide/helpers/ide_helper.js3
-rw-r--r--spec/frontend_integration/ide/helpers/mock_data.js1
-rw-r--r--spec/frontend_integration/ide/helpers/start.js11
-rw-r--r--spec/frontend_integration/ide/ide_integration_spec.js27
-rw-r--r--spec/frontend_integration/ide/user_opens_mr_spec.js6
-rw-r--r--spec/frontend_integration/test_helpers/mock_server/graphql.js8
-rw-r--r--spec/generator_helper.rb15
-rw-r--r--spec/graphql/features/authorization_spec.rb37
-rw-r--r--spec/graphql/features/feature_flag_spec.rb3
-rw-r--r--spec/graphql/gitlab_schema_spec.rb25
-rw-r--r--spec/graphql/mutations/boards/update_spec.rb57
-rw-r--r--spec/graphql/mutations/concerns/mutations/can_mutate_spammable_spec.rb2
-rw-r--r--spec/graphql/mutations/custom_emoji/create_spec.rb27
-rw-r--r--spec/graphql/mutations/merge_requests/accept_spec.rb171
-rw-r--r--spec/graphql/mutations/release_asset_links/create_spec.rb105
-rw-r--r--spec/graphql/mutations/user_callouts/create_spec.rb42
-rw-r--r--spec/graphql/resolvers/admin/analytics/instance_statistics/measurements_resolver_spec.rb100
-rw-r--r--spec/graphql/resolvers/admin/analytics/usage_trends/measurements_resolver_spec.rb100
-rw-r--r--spec/graphql/resolvers/alert_management/http_integrations_resolver_spec.rb51
-rw-r--r--spec/graphql/resolvers/board_resolver_spec.rb4
-rw-r--r--spec/graphql/resolvers/boards_resolver_spec.rb4
-rw-r--r--spec/graphql/resolvers/branch_commit_resolver_spec.rb4
-rw-r--r--spec/graphql/resolvers/concerns/caching_array_resolver_spec.rb3
-rw-r--r--spec/graphql/resolvers/error_tracking/sentry_errors_resolver_spec.rb6
-rw-r--r--spec/graphql/resolvers/group_labels_resolver_spec.rb2
-rw-r--r--spec/graphql/resolvers/group_packages_resolver_spec.rb18
-rw-r--r--spec/graphql/resolvers/issues_resolver_spec.rb8
-rw-r--r--spec/graphql/resolvers/labels_resolver_spec.rb36
-rw-r--r--spec/graphql/resolvers/merge_requests_resolver_spec.rb2
-rw-r--r--spec/graphql/resolvers/namespace_projects_resolver_spec.rb57
-rw-r--r--spec/graphql/resolvers/packages_resolver_spec.rb17
-rw-r--r--spec/graphql/resolvers/project_packages_resolver_spec.rb17
-rw-r--r--spec/graphql/resolvers/project_pipeline_resolver_spec.rb37
-rw-r--r--spec/graphql/resolvers/release_milestones_resolver_spec.rb2
-rw-r--r--spec/graphql/types/access_level_enum_spec.rb2
-rw-r--r--spec/graphql/types/admin/analytics/instance_statistics/measurement_identifier_enum_spec.rb16
-rw-r--r--spec/graphql/types/admin/analytics/instance_statistics/measurement_type_spec.rb55
-rw-r--r--spec/graphql/types/admin/analytics/usage_trends/measurement_identifier_enum_spec.rb16
-rw-r--r--spec/graphql/types/admin/analytics/usage_trends/measurement_type_spec.rb55
-rw-r--r--spec/graphql/types/alert_management/alert_type_spec.rb3
-rw-r--r--spec/graphql/types/base_argument_spec.rb17
-rw-r--r--spec/graphql/types/board_type_spec.rb2
-rw-r--r--spec/graphql/types/ci/job_type_spec.rb2
-rw-r--r--spec/graphql/types/ci/pipeline_type_spec.rb4
-rw-r--r--spec/graphql/types/global_id_type_spec.rb23
-rw-r--r--spec/graphql/types/group_type_spec.rb1
-rw-r--r--spec/graphql/types/label_type_spec.rb11
-rw-r--r--spec/graphql/types/merge_request_type_spec.rb31
-rw-r--r--spec/graphql/types/query_type_spec.rb10
-rw-r--r--spec/graphql/types/snippet_type_spec.rb10
-rw-r--r--spec/graphql/types/snippets/blob_type_spec.rb47
-rw-r--r--spec/graphql/types/user_callout_feature_name_enum_spec.rb11
-rw-r--r--spec/graphql/types/user_callout_type_spec.rb11
-rw-r--r--spec/graphql/types/user_type_spec.rb9
-rw-r--r--spec/helpers/application_settings_helper_spec.rb15
-rw-r--r--spec/helpers/auth_helper_spec.rb8
-rw-r--r--spec/helpers/avatars_helper_spec.rb65
-rw-r--r--spec/helpers/boards_helper_spec.rb71
-rw-r--r--spec/helpers/ci/pipeline_editor_helper_spec.rb7
-rw-r--r--spec/helpers/commits_helper_spec.rb10
-rw-r--r--spec/helpers/gitlab_routing_helper_spec.rb10
-rw-r--r--spec/helpers/ide_helper_spec.rb47
-rw-r--r--spec/helpers/invite_members_helper_spec.rb25
-rw-r--r--spec/helpers/issuables_description_templates_helper_spec.rb104
-rw-r--r--spec/helpers/learn_gitlab_helper_spec.rb6
-rw-r--r--spec/helpers/merge_requests_helper_spec.rb53
-rw-r--r--spec/helpers/namespaces_helper_spec.rb36
-rw-r--r--spec/helpers/notifications_helper_spec.rb16
-rw-r--r--spec/helpers/preferences_helper_spec.rb1
-rw-r--r--spec/helpers/projects/project_members_helper_spec.rb4
-rw-r--r--spec/helpers/projects/security/configuration_helper_spec.rb13
-rw-r--r--spec/helpers/search_helper_spec.rb2
-rw-r--r--spec/helpers/services_helper_spec.rb46
-rw-r--r--spec/helpers/stat_anchors_helper_spec.rb18
-rw-r--r--spec/helpers/timeboxes_helper_spec.rb9
-rw-r--r--spec/helpers/visibility_level_helper_spec.rb16
-rw-r--r--spec/initializers/rack_multipart_patch_spec.rb79
-rw-r--r--spec/lib/api/entities/plan_limit_spec.rb24
-rw-r--r--spec/lib/api/entities/project_repository_storage_move_spec.rb21
-rw-r--r--spec/lib/api/entities/projects/repository_storage_move_spec.rb21
-rw-r--r--spec/lib/api/entities/public_group_details_spec.rb24
-rw-r--r--spec/lib/api/entities/snippet_repository_storage_move_spec.rb25
-rw-r--r--spec/lib/api/entities/snippets/repository_storage_move_spec.rb25
-rw-r--r--spec/lib/backup/repositories_spec.rb10
-rw-r--r--spec/lib/banzai/filter/custom_emoji_filter_spec.rb29
-rw-r--r--spec/lib/banzai/filter/emoji_filter_spec.rb27
-rw-r--r--spec/lib/banzai/filter/sanitization_filter_spec.rb28
-rw-r--r--spec/lib/banzai/filter/video_link_filter_spec.rb1
-rw-r--r--spec/lib/banzai/pipeline/full_pipeline_spec.rb7
-rw-r--r--spec/lib/banzai/pipeline/plain_markdown_pipeline_spec.rb80
-rw-r--r--spec/lib/bulk_imports/common/loaders/entity_loader_spec.rb30
-rw-r--r--spec/lib/bulk_imports/common/transformers/award_emoji_transformer_spec.rb48
-rw-r--r--spec/lib/bulk_imports/common/transformers/prohibited_attributes_transformer_spec.rb6
-rw-r--r--spec/lib/bulk_imports/common/transformers/user_reference_transformer_spec.rb69
-rw-r--r--spec/lib/bulk_imports/groups/graphql/get_labels_query_spec.rb21
-rw-r--r--spec/lib/bulk_imports/groups/graphql/get_milestones_query_spec.rb35
-rw-r--r--spec/lib/bulk_imports/groups/loaders/labels_loader_spec.rb30
-rw-r--r--spec/lib/bulk_imports/groups/loaders/members_loader_spec.rb42
-rw-r--r--spec/lib/bulk_imports/groups/pipelines/labels_pipeline_spec.rb41
-rw-r--r--spec/lib/bulk_imports/groups/pipelines/members_pipeline_spec.rb32
-rw-r--r--spec/lib/bulk_imports/groups/pipelines/milestones_pipeline_spec.rb151
-rw-r--r--spec/lib/bulk_imports/groups/pipelines/subgroup_entities_pipeline_spec.rb40
-rw-r--r--spec/lib/bulk_imports/groups/transformers/group_attributes_transformer_spec.rb4
-rw-r--r--spec/lib/bulk_imports/importers/group_importer_spec.rb3
-rw-r--r--spec/lib/bulk_imports/pipeline/runner_spec.rb162
-rw-r--r--spec/lib/bulk_imports/pipeline_spec.rb114
-rw-r--r--spec/lib/error_tracking/sentry_client/api_urls_spec.rb85
-rw-r--r--spec/lib/error_tracking/sentry_client/event_spec.rb75
-rw-r--r--spec/lib/error_tracking/sentry_client/issue_link_spec.rb65
-rw-r--r--spec/lib/error_tracking/sentry_client/issue_spec.rb330
-rw-r--r--spec/lib/error_tracking/sentry_client/pagination_parser_spec.rb60
-rw-r--r--spec/lib/error_tracking/sentry_client/projects_spec.rb100
-rw-r--r--spec/lib/error_tracking/sentry_client/repo_spec.rb39
-rw-r--r--spec/lib/error_tracking/sentry_client_spec.rb17
-rw-r--r--spec/lib/expand_variables_spec.rb7
-rw-r--r--spec/lib/feature_spec.rb2
-rw-r--r--spec/lib/generators/gitlab/usage_metric_definition_generator_spec.rb75
-rw-r--r--spec/lib/gitlab/alert_management/payload/generic_spec.rb2
-rw-r--r--spec/lib/gitlab/analytics/cycle_analytics/average_spec.rb66
-rw-r--r--spec/lib/gitlab/analytics/cycle_analytics/sorting_spec.rb58
-rw-r--r--spec/lib/gitlab/analytics/instance_statistics/workers_argument_builder_spec.rb81
-rw-r--r--spec/lib/gitlab/analytics/usage_trends/workers_argument_builder_spec.rb81
-rw-r--r--spec/lib/gitlab/application_context_spec.rb30
-rw-r--r--spec/lib/gitlab/auth/o_auth/user_spec.rb17
-rw-r--r--spec/lib/gitlab/avatar_cache_spec.rb101
-rw-r--r--spec/lib/gitlab/background_migration/batching_strategies/primary_key_batching_strategy_spec.rb45
-rw-r--r--spec/lib/gitlab/background_migration/copy_column_using_background_migration_job_spec.rb29
-rw-r--r--spec/lib/gitlab/background_migration/merge_request_assignees_migration_progress_check_spec.rb99
-rw-r--r--spec/lib/gitlab/background_migration/migrate_legacy_artifacts_spec.rb2
-rw-r--r--spec/lib/gitlab/background_migration/populate_finding_uuid_for_vulnerability_feedback_spec.rb33
-rw-r--r--spec/lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid_spec.rb149
-rw-r--r--spec/lib/gitlab/background_migration/set_default_iteration_cadences_spec.rb80
-rw-r--r--spec/lib/gitlab/checks/branch_check_spec.rb76
-rw-r--r--spec/lib/gitlab/checks/lfs_check_spec.rb23
-rw-r--r--spec/lib/gitlab/ci/build/context/build_spec.rb4
-rw-r--r--spec/lib/gitlab/ci/build/context/global_spec.rb4
-rw-r--r--spec/lib/gitlab/ci/build/policy/variables_spec.rb4
-rw-r--r--spec/lib/gitlab/ci/build/rules/rule_spec.rb2
-rw-r--r--spec/lib/gitlab/ci/build/rules_spec.rb2
-rw-r--r--spec/lib/gitlab/ci/charts_spec.rb7
-rw-r--r--spec/lib/gitlab/ci/config/entry/cache_spec.rb344
-rw-r--r--spec/lib/gitlab/ci/config/entry/environment_spec.rb33
-rw-r--r--spec/lib/gitlab/ci/config/entry/job_spec.rb40
-rw-r--r--spec/lib/gitlab/ci/config/entry/root_spec.rb229
-rw-r--r--spec/lib/gitlab/ci/jwt_spec.rb11
-rw-r--r--spec/lib/gitlab/ci/pipeline/expression/statement_spec.rb17
-rw-r--r--spec/lib/gitlab/ci/pipeline/seed/build/cache_spec.rb287
-rw-r--r--spec/lib/gitlab/ci/pipeline/seed/build_spec.rb263
-rw-r--r--spec/lib/gitlab/ci/pipeline/seed/environment_spec.rb59
-rw-r--r--spec/lib/gitlab/ci/reports/codequality_reports_comparer_spec.rb56
-rw-r--r--spec/lib/gitlab/ci/reports/reports_comparer_spec.rb34
-rw-r--r--spec/lib/gitlab/ci/status/composite_spec.rb21
-rw-r--r--spec/lib/gitlab/ci/status/factory_spec.rb10
-rw-r--r--spec/lib/gitlab/ci/templates/auto_devops_gitlab_ci_yaml_spec.rb372
-rw-r--r--spec/lib/gitlab/ci/trace_spec.rb2
-rw-r--r--spec/lib/gitlab/ci/variables/collection/item_spec.rb84
-rw-r--r--spec/lib/gitlab/ci/variables/collection/sort_spec.rb322
-rw-r--r--spec/lib/gitlab/ci/variables/collection/sorted_spec.rb259
-rw-r--r--spec/lib/gitlab/ci/variables/collection_spec.rb117
-rw-r--r--spec/lib/gitlab/ci/yaml_processor_spec.rb237
-rw-r--r--spec/lib/gitlab/cycle_analytics/stage_summary_spec.rb33
-rw-r--r--spec/lib/gitlab/data_builder/build_spec.rb8
-rw-r--r--spec/lib/gitlab/data_builder/pipeline_spec.rb8
-rw-r--r--spec/lib/gitlab/database/background_migration/batched_job_spec.rb50
-rw-r--r--spec/lib/gitlab/database/background_migration/batched_migration_spec.rb160
-rw-r--r--spec/lib/gitlab/database/background_migration/batched_migration_wrapper_spec.rb70
-rw-r--r--spec/lib/gitlab/database/background_migration/scheduler_spec.rb182
-rw-r--r--spec/lib/gitlab/database/bulk_update_spec.rb36
-rw-r--r--spec/lib/gitlab/database/migration_helpers_spec.rb2
-rw-r--r--spec/lib/gitlab/database/migrations/background_migration_helpers_spec.rb116
-rw-r--r--spec/lib/gitlab/database/migrations/observers/query_statistics_spec.rb68
-rw-r--r--spec/lib/gitlab/database/rename_reserved_paths_migration/v1/rename_base_spec.rb31
-rw-r--r--spec/lib/gitlab/database/similarity_score_spec.rb2
-rw-r--r--spec/lib/gitlab/database_spec.rb108
-rw-r--r--spec/lib/gitlab/diff/highlight_cache_spec.rb8
-rw-r--r--spec/lib/gitlab/diff/highlight_spec.rb16
-rw-r--r--spec/lib/gitlab/diff/inline_diff_markdown_marker_spec.rb4
-rw-r--r--spec/lib/gitlab/diff/inline_diff_spec.rb11
-rw-r--r--spec/lib/gitlab/diff/pair_selector_spec.rb84
-rw-r--r--spec/lib/gitlab/email/handler/service_desk_handler_spec.rb2
-rw-r--r--spec/lib/gitlab/error_tracking/context_payload_generator_spec.rb176
-rw-r--r--spec/lib/gitlab/error_tracking/log_formatter_spec.rb71
-rw-r--r--spec/lib/gitlab/error_tracking/processor/context_payload_processor_spec.rb45
-rw-r--r--spec/lib/gitlab/error_tracking_spec.rb219
-rw-r--r--spec/lib/gitlab/etag_caching/router/graphql_spec.rb50
-rw-r--r--spec/lib/gitlab/etag_caching/router/restful_spec.rb124
-rw-r--r--spec/lib/gitlab/etag_caching/router_spec.rb147
-rw-r--r--spec/lib/gitlab/etag_caching/store_spec.rb84
-rw-r--r--spec/lib/gitlab/experimentation/controller_concern_spec.rb74
-rw-r--r--spec/lib/gitlab/experimentation_spec.rb6
-rw-r--r--spec/lib/gitlab/git/push_spec.rb2
-rw-r--r--spec/lib/gitlab/github_import/importer/pull_request_merged_by_importer_spec.rb41
-rw-r--r--spec/lib/gitlab/github_import/importer/pull_request_review_importer_spec.rb14
-rw-r--r--spec/lib/gitlab/graphql/calls_gitaly/field_extension_spec.rb87
-rw-r--r--spec/lib/gitlab/graphql/calls_gitaly/instrumentation_spec.rb23
-rw-r--r--spec/lib/gitlab/graphql/docs/renderer_spec.rb48
-rw-r--r--spec/lib/gitlab/graphql/pagination/keyset/last_items_spec.rb2
-rw-r--r--spec/lib/gitlab/graphql/pagination/keyset/order_info_spec.rb12
-rw-r--r--spec/lib/gitlab/graphql/pagination/keyset/query_builder_spec.rb38
-rw-r--r--spec/lib/gitlab/graphql/present/field_extension_spec.rb143
-rw-r--r--spec/lib/gitlab/graphql/query_analyzers/logger_analyzer_spec.rb56
-rw-r--r--spec/lib/gitlab/hook_data/project_member_builder_spec.rb58
-rw-r--r--spec/lib/gitlab/http_connection_adapter_spec.rb231
-rw-r--r--spec/lib/gitlab/import_export/all_models.yml1
-rw-r--r--spec/lib/gitlab/import_export/import_export_spec.rb4
-rw-r--r--spec/lib/gitlab/import_export/project/tree_saver_spec.rb20
-rw-r--r--spec/lib/gitlab/import_export/safe_model_attributes.yml3
-rw-r--r--spec/lib/gitlab/marker_range_spec.rb71
-rw-r--r--spec/lib/gitlab/metrics/background_transaction_spec.rb67
-rw-r--r--spec/lib/gitlab/metrics/subscribers/active_record_spec.rb315
-rw-r--r--spec/lib/gitlab/optimistic_locking_spec.rb109
-rw-r--r--spec/lib/gitlab/pagination/keyset/column_order_definition_spec.rb188
-rw-r--r--spec/lib/gitlab/pagination/keyset/order_spec.rb420
-rw-r--r--spec/lib/gitlab/query_limiting/active_support_subscriber_spec.rb12
-rw-r--r--spec/lib/gitlab/query_limiting/transaction_spec.rb24
-rw-r--r--spec/lib/gitlab/query_limiting_spec.rb14
-rw-r--r--spec/lib/gitlab/regex_spec.rb29
-rw-r--r--spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb10
-rw-r--r--spec/lib/gitlab/sidekiq_middleware/size_limiter/client_spec.rb99
-rw-r--r--spec/lib/gitlab/sidekiq_middleware/size_limiter/exceed_limit_error_spec.rb35
-rw-r--r--spec/lib/gitlab/sidekiq_middleware/size_limiter/validator_spec.rb253
-rw-r--r--spec/lib/gitlab/sidekiq_middleware_spec.rb1
-rw-r--r--spec/lib/gitlab/string_range_marker_spec.rb2
-rw-r--r--spec/lib/gitlab/string_regex_marker_spec.rb4
-rw-r--r--spec/lib/gitlab/tracking/standard_context_spec.rb20
-rw-r--r--spec/lib/gitlab/tree_summary_spec.rb31
-rw-r--r--spec/lib/gitlab/url_blocker_spec.rb4
-rw-r--r--spec/lib/gitlab/usage/docs/renderer_spec.rb10
-rw-r--r--spec/lib/gitlab/usage/docs/value_formatter_spec.rb6
-rw-r--r--spec/lib/gitlab/usage/metrics/aggregates/aggregate_spec.rb243
-rw-r--r--spec/lib/gitlab/usage/metrics/aggregates/sources/postgres_hll_spec.rb6
-rw-r--r--spec/lib/gitlab/usage/metrics/names_suggestions/generator_spec.rb49
-rw-r--r--spec/lib/gitlab/usage_data_counters/aggregated_metrics_spec.rb24
-rw-r--r--spec/lib/gitlab/usage_data_counters/code_review_events_spec.rb23
-rw-r--r--spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb12
-rw-r--r--spec/lib/gitlab/usage_data_counters/issue_activity_unique_counter_spec.rb52
-rw-r--r--spec/lib/gitlab/usage_data_counters/merge_request_activity_unique_counter_spec.rb102
-rw-r--r--spec/lib/gitlab/usage_data_counters/package_event_counter_spec.rb2
-rw-r--r--spec/lib/gitlab/usage_data_counters/quick_action_activity_unique_counter_spec.rb20
-rw-r--r--spec/lib/gitlab/usage_data_queries_spec.rb8
-rw-r--r--spec/lib/gitlab/usage_data_spec.rb55
-rw-r--r--spec/lib/gitlab/utils/usage_data_spec.rb57
-rw-r--r--spec/lib/gitlab/visibility_level_spec.rb25
-rw-r--r--spec/lib/gitlab/word_diff/chunk_collection_spec.rb44
-rw-r--r--spec/lib/gitlab/word_diff/line_processor_spec.rb46
-rw-r--r--spec/lib/gitlab/word_diff/parser_spec.rb67
-rw-r--r--spec/lib/gitlab/word_diff/positions_counter_spec.rb35
-rw-r--r--spec/lib/gitlab/word_diff/segments/chunk_spec.rb53
-rw-r--r--spec/lib/gitlab/word_diff/segments/diff_hunk_spec.rb51
-rw-r--r--spec/lib/gitlab/word_diff/segments/newline_spec.rb13
-rw-r--r--spec/lib/gitlab/x509/signature_spec.rb122
-rw-r--r--spec/lib/marginalia_spec.rb83
-rw-r--r--spec/lib/object_storage/direct_upload_spec.rb11
-rw-r--r--spec/lib/pager_duty/webhook_payload_parser_spec.rb3
-rw-r--r--spec/lib/peek/views/active_record_spec.rb71
-rw-r--r--spec/lib/quality/test_level_spec.rb4
-rw-r--r--spec/lib/release_highlights/validator/entry_spec.rb19
-rw-r--r--spec/lib/release_highlights/validator_spec.rb5
-rw-r--r--spec/lib/rspec_flaky/config_spec.rb106
-rw-r--r--spec/lib/rspec_flaky/example_spec.rb92
-rw-r--r--spec/lib/rspec_flaky/flaky_example_spec.rb165
-rw-r--r--spec/lib/rspec_flaky/flaky_examples_collection_spec.rb74
-rw-r--r--spec/lib/rspec_flaky/listener_spec.rb219
-rw-r--r--spec/lib/rspec_flaky/report_spec.rb129
-rw-r--r--spec/lib/sentry/api_urls_spec.rb85
-rw-r--r--spec/lib/sentry/client/event_spec.rb75
-rw-r--r--spec/lib/sentry/client/issue_link_spec.rb65
-rw-r--r--spec/lib/sentry/client/issue_spec.rb330
-rw-r--r--spec/lib/sentry/client/projects_spec.rb100
-rw-r--r--spec/lib/sentry/client/repo_spec.rb39
-rw-r--r--spec/lib/sentry/client_spec.rb17
-rw-r--r--spec/lib/sentry/pagination_parser_spec.rb60
-rw-r--r--spec/lib/system_check/sidekiq_check_spec.rb81
-rw-r--r--spec/mailers/emails/merge_requests_spec.rb200
-rw-r--r--spec/mailers/emails/pipelines_spec.rb2
-rw-r--r--spec/mailers/emails/profile_spec.rb9
-rw-r--r--spec/mailers/notify_spec.rb109
-rw-r--r--spec/migrations/20201112130715_schedule_recalculate_uuid_on_vulnerabilities_occurrences_spec.rb138
-rw-r--r--spec/migrations/20210218040814_add_environment_scope_to_group_variables_spec.rb46
-rw-r--r--spec/migrations/cleanup_projects_with_bad_has_external_issue_tracker_data_spec.rb94
-rw-r--r--spec/migrations/migrate_delayed_project_removal_from_namespaces_to_namespace_settings_spec.rb30
-rw-r--r--spec/migrations/reschedule_artifact_expiry_backfill_spec.rb38
-rw-r--r--spec/migrations/reschedule_set_default_iteration_cadences_spec.rb41
-rw-r--r--spec/migrations/schedule_merge_request_assignees_migration_progress_check_spec.rb16
-rw-r--r--spec/migrations/schedule_populate_personal_snippet_statistics_spec.rb10
-rw-r--r--spec/models/analytics/instance_statistics/measurement_spec.rb118
-rw-r--r--spec/models/analytics/usage_trends/measurement_spec.rb118
-rw-r--r--spec/models/application_setting_spec.rb31
-rw-r--r--spec/models/bulk_imports/entity_spec.rb18
-rw-r--r--spec/models/ci/bridge_spec.rb6
-rw-r--r--spec/models/ci/build_spec.rb143
-rw-r--r--spec/models/ci/daily_build_group_report_result_spec.rb34
-rw-r--r--spec/models/ci/group_variable_spec.rb12
-rw-r--r--spec/models/ci/pipeline_spec.rb728
-rw-r--r--spec/models/ci/runner_spec.rb112
-rw-r--r--spec/models/ci/variable_spec.rb9
-rw-r--r--spec/models/clusters/agent_token_spec.rb5
-rw-r--r--spec/models/concerns/ci/has_variable_spec.rb11
-rw-r--r--spec/models/concerns/project_features_compatibility_spec.rb4
-rw-r--r--spec/models/custom_emoji_spec.rb6
-rw-r--r--spec/models/dependency_proxy/manifest_spec.rb20
-rw-r--r--spec/models/email_spec.rb2
-rw-r--r--spec/models/environment_spec.rb89
-rw-r--r--spec/models/error_tracking/project_error_tracking_setting_spec.rb14
-rw-r--r--spec/models/experiment_spec.rb157
-rw-r--r--spec/models/group_spec.rb301
-rw-r--r--spec/models/issue_email_participant_spec.rb11
-rw-r--r--spec/models/issue_spec.rb8
-rw-r--r--spec/models/iteration_spec.rb335
-rw-r--r--spec/models/list_spec.rb71
-rw-r--r--spec/models/member_spec.rb8
-rw-r--r--spec/models/merge_request_spec.rb273
-rw-r--r--spec/models/namespace/traversal_hierarchy_spec.rb16
-rw-r--r--spec/models/namespace_spec.rb246
-rw-r--r--spec/models/note_spec.rb19
-rw-r--r--spec/models/notification_recipient_spec.rb33
-rw-r--r--spec/models/notification_setting_spec.rb3
-rw-r--r--spec/models/onboarding_progress_spec.rb26
-rw-r--r--spec/models/packages/package_file_spec.rb15
-rw-r--r--spec/models/packages/package_spec.rb93
-rw-r--r--spec/models/pages/lookup_path_spec.rb8
-rw-r--r--spec/models/project_feature_spec.rb2
-rw-r--r--spec/models/project_repository_storage_move_spec.rb2
-rw-r--r--spec/models/project_services/discord_service_spec.rb22
-rw-r--r--spec/models/project_services/hangouts_chat_service_spec.rb6
-rw-r--r--spec/models/project_services/jira_service_spec.rb130
-rw-r--r--spec/models/project_services/prometheus_service_spec.rb10
-rw-r--r--spec/models/project_services/slack_service_spec.rb112
-rw-r--r--spec/models/project_services/unify_circuit_service_spec.rb8
-rw-r--r--spec/models/project_services/webex_teams_service_spec.rb6
-rw-r--r--spec/models/project_spec.rb58
-rw-r--r--spec/models/projects/repository_storage_move_spec.rb35
-rw-r--r--spec/models/prometheus_alert_event_spec.rb2
-rw-r--r--spec/models/protected_branch_spec.rb22
-rw-r--r--spec/models/snippet_repository_spec.rb1
-rw-r--r--spec/models/snippet_repository_storage_move_spec.rb2
-rw-r--r--spec/models/snippet_spec.rb12
-rw-r--r--spec/models/snippets/repository_storage_move_spec.rb13
-rw-r--r--spec/models/todo_spec.rb17
-rw-r--r--spec/models/upload_spec.rb2
-rw-r--r--spec/models/user_spec.rb218
-rw-r--r--spec/policies/base_policy_spec.rb6
-rw-r--r--spec/policies/group_policy_spec.rb38
-rw-r--r--spec/policies/project_policy_spec.rb94
-rw-r--r--spec/presenters/ci/build_runner_presenter_spec.rb24
-rw-r--r--spec/presenters/packages/composer/packages_presenter_spec.rb7
-rw-r--r--spec/presenters/project_presenter_spec.rb70
-rw-r--r--spec/presenters/projects/import_export/project_export_presenter_spec.rb20
-rw-r--r--spec/presenters/snippet_presenter_spec.rb2
-rw-r--r--spec/requests/api/admin/plan_limits_spec.rb177
-rw-r--r--spec/requests/api/api_spec.rb24
-rw-r--r--spec/requests/api/ci/runner/jobs_artifacts_spec.rb16
-rw-r--r--spec/requests/api/ci/runner/jobs_put_spec.rb5
-rw-r--r--spec/requests/api/ci/runner/jobs_request_post_spec.rb58
-rw-r--r--spec/requests/api/ci/runner/jobs_trace_spec.rb5
-rw-r--r--spec/requests/api/ci/runner/runners_delete_spec.rb8
-rw-r--r--spec/requests/api/ci/runner/runners_post_spec.rb64
-rw-r--r--spec/requests/api/ci/runner/runners_verify_post_spec.rb8
-rw-r--r--spec/requests/api/commit_statuses_spec.rb40
-rw-r--r--spec/requests/api/composer_packages_spec.rb46
-rw-r--r--spec/requests/api/graphql/container_repository/container_repository_details_spec.rb2
-rw-r--r--spec/requests/api/graphql/group/container_repositories_spec.rb2
-rw-r--r--spec/requests/api/graphql/group/packages_spec.rb78
-rw-r--r--spec/requests/api/graphql/instance_statistics_measurements_spec.rb35
-rw-r--r--spec/requests/api/graphql/issue/issue_spec.rb13
-rw-r--r--spec/requests/api/graphql/mutations/alert_management/alerts/create_alert_issue_spec.rb6
-rw-r--r--spec/requests/api/graphql/mutations/merge_requests/accept_spec.rb44
-rw-r--r--spec/requests/api/graphql/mutations/notes/create/diff_note_spec.rb23
-rw-r--r--spec/requests/api/graphql/mutations/release_asset_links/create_spec.rb59
-rw-r--r--spec/requests/api/graphql/mutations/user_callouts/create_spec.rb29
-rw-r--r--spec/requests/api/graphql/namespace/projects_spec.rb2
-rw-r--r--spec/requests/api/graphql/packages/package_spec.rb2
-rw-r--r--spec/requests/api/graphql/project/alert_management/alert/issue_spec.rb71
-rw-r--r--spec/requests/api/graphql/project/alert_management/alerts_spec.rb4
-rw-r--r--spec/requests/api/graphql/project/container_repositories_spec.rb2
-rw-r--r--spec/requests/api/graphql/project/merge_request/diff_notes_spec.rb2
-rw-r--r--spec/requests/api/graphql/project/merge_request_spec.rb2
-rw-r--r--spec/requests/api/graphql/project/merge_requests_spec.rb249
-rw-r--r--spec/requests/api/graphql/project/packages_spec.rb71
-rw-r--r--spec/requests/api/graphql/project/pipeline_spec.rb12
-rw-r--r--spec/requests/api/graphql/snippets_spec.rb25
-rw-r--r--spec/requests/api/graphql/usage_trends_measurements_spec.rb35
-rw-r--r--spec/requests/api/helpers_spec.rb20
-rw-r--r--spec/requests/api/invitations_spec.rb112
-rw-r--r--spec/requests/api/jobs_spec.rb184
-rw-r--r--spec/requests/api/lint_spec.rb18
-rw-r--r--spec/requests/api/merge_requests_spec.rb4
-rw-r--r--spec/requests/api/npm_instance_packages_spec.rb5
-rw-r--r--spec/requests/api/npm_project_packages_spec.rb95
-rw-r--r--spec/requests/api/oauth_tokens_spec.rb8
-rw-r--r--spec/requests/api/project_attributes.yml5
-rw-r--r--spec/requests/api/project_packages_spec.rb17
-rw-r--r--spec/requests/api/project_repository_storage_moves_spec.rb2
-rw-r--r--spec/requests/api/projects_spec.rb131
-rw-r--r--spec/requests/api/protected_branches_spec.rb18
-rw-r--r--spec/requests/api/repositories_spec.rb34
-rw-r--r--spec/requests/api/resource_access_tokens_spec.rb19
-rw-r--r--spec/requests/api/rubygem_packages_spec.rb294
-rw-r--r--spec/requests/api/snippet_repository_storage_moves_spec.rb2
-rw-r--r--spec/requests/api/users_spec.rb43
-rw-r--r--spec/requests/api/v3/github_spec.rb13
-rw-r--r--spec/requests/api/wikis_spec.rb15
-rw-r--r--spec/requests/ide_controller_spec.rb174
-rw-r--r--spec/requests/projects/merge_requests/content_spec.rb41
-rw-r--r--spec/requests/projects/noteable_notes_spec.rb11
-rw-r--r--spec/rubocop/code_reuse_helpers_spec.rb1
-rw-r--r--spec/rubocop/cop/active_record_association_reload_spec.rb1
-rw-r--r--spec/rubocop/cop/api/base_spec.rb1
-rw-r--r--spec/rubocop/cop/api/grape_array_missing_coerce_spec.rb1
-rw-r--r--spec/rubocop/cop/avoid_becomes_spec.rb1
-rw-r--r--spec/rubocop/cop/avoid_break_from_strong_memoize_spec.rb1
-rw-r--r--spec/rubocop/cop/avoid_keyword_arguments_in_sidekiq_workers_spec.rb1
-rw-r--r--spec/rubocop/cop/avoid_return_from_blocks_spec.rb13
-rw-r--r--spec/rubocop/cop/avoid_route_redirect_leading_slash_spec.rb13
-rw-r--r--spec/rubocop/cop/ban_catch_throw_spec.rb1
-rw-r--r--spec/rubocop/cop/code_reuse/finder_spec.rb1
-rw-r--r--spec/rubocop/cop/code_reuse/presenter_spec.rb1
-rw-r--r--spec/rubocop/cop/code_reuse/serializer_spec.rb1
-rw-r--r--spec/rubocop/cop/code_reuse/service_class_spec.rb1
-rw-r--r--spec/rubocop/cop/code_reuse/worker_spec.rb1
-rw-r--r--spec/rubocop/cop/default_scope_spec.rb1
-rw-r--r--spec/rubocop/cop/destroy_all_spec.rb1
-rw-r--r--spec/rubocop/cop/filename_length_spec.rb1
-rw-r--r--spec/rubocop/cop/gitlab/avoid_uploaded_file_from_params_spec.rb1
-rw-r--r--spec/rubocop/cop/gitlab/bulk_insert_spec.rb1
-rw-r--r--spec/rubocop/cop/gitlab/change_timezone_spec.rb1
-rw-r--r--spec/rubocop/cop/gitlab/const_get_inherit_false_spec.rb1
-rw-r--r--spec/rubocop/cop/gitlab/duplicate_spec_location_spec.rb1
-rw-r--r--spec/rubocop/cop/gitlab/except_spec.rb1
-rw-r--r--spec/rubocop/cop/gitlab/finder_with_find_by_spec.rb1
-rw-r--r--spec/rubocop/cop/gitlab/httparty_spec.rb1
-rw-r--r--spec/rubocop/cop/gitlab/intersect_spec.rb1
-rw-r--r--spec/rubocop/cop/gitlab/json_spec.rb1
-rw-r--r--spec/rubocop/cop/gitlab/module_with_instance_variables_spec.rb1
-rw-r--r--spec/rubocop/cop/gitlab/namespaced_class_spec.rb1
-rw-r--r--spec/rubocop/cop/gitlab/policy_rule_boolean_spec.rb1
-rw-r--r--spec/rubocop/cop/gitlab/predicate_memoization_spec.rb1
-rw-r--r--spec/rubocop/cop/gitlab/rails_logger_spec.rb1
-rw-r--r--spec/rubocop/cop/gitlab/union_spec.rb1
-rw-r--r--spec/rubocop/cop/graphql/authorize_types_spec.rb31
-rw-r--r--spec/rubocop/cop/graphql/descriptions_spec.rb45
-rw-r--r--spec/rubocop/cop/graphql/gid_expected_type_spec.rb1
-rw-r--r--spec/rubocop/cop/graphql/id_type_spec.rb1
-rw-r--r--spec/rubocop/cop/graphql/json_type_spec.rb1
-rw-r--r--spec/rubocop/cop/graphql/resolver_type_spec.rb1
-rw-r--r--spec/rubocop/cop/group_public_or_visible_to_user_spec.rb1
-rw-r--r--spec/rubocop/cop/ignored_columns_spec.rb11
-rw-r--r--spec/rubocop/cop/include_sidekiq_worker_spec.rb1
-rw-r--r--spec/rubocop/cop/inject_enterprise_edition_module_spec.rb1
-rw-r--r--spec/rubocop/cop/lint/last_keyword_argument_spec.rb1
-rw-r--r--spec/rubocop/cop/migration/add_column_with_default_spec.rb11
-rw-r--r--spec/rubocop/cop/migration/add_columns_to_wide_tables_spec.rb15
-rw-r--r--spec/rubocop/cop/migration/add_concurrent_foreign_key_spec.rb31
-rw-r--r--spec/rubocop/cop/migration/add_concurrent_index_spec.rb27
-rw-r--r--spec/rubocop/cop/migration/add_index_spec.rb3
-rw-r--r--spec/rubocop/cop/migration/add_limit_to_text_columns_spec.rb41
-rw-r--r--spec/rubocop/cop/migration/add_reference_spec.rb9
-rw-r--r--spec/rubocop/cop/migration/add_timestamps_spec.rb46
-rw-r--r--spec/rubocop/cop/migration/complex_indexes_require_name_spec.rb23
-rw-r--r--spec/rubocop/cop/migration/create_table_with_foreign_keys_spec.rb5
-rw-r--r--spec/rubocop/cop/migration/datetime_spec.rb149
-rw-r--r--spec/rubocop/cop/migration/drop_table_spec.rb15
-rw-r--r--spec/rubocop/cop/migration/hash_index_spec.rb47
-rw-r--r--spec/rubocop/cop/migration/prevent_strings_spec.rb23
-rw-r--r--spec/rubocop/cop/migration/refer_to_index_by_name_spec.rb21
-rw-r--r--spec/rubocop/cop/migration/remove_column_spec.rb45
-rw-r--r--spec/rubocop/cop/migration/remove_concurrent_index_spec.rb23
-rw-r--r--spec/rubocop/cop/migration/remove_index_spec.rb23
-rw-r--r--spec/rubocop/cop/migration/safer_boolean_column_spec.rb30
-rw-r--r--spec/rubocop/cop/migration/schedule_async_spec.rb97
-rw-r--r--spec/rubocop/cop/migration/timestamps_spec.rb45
-rw-r--r--spec/rubocop/cop/migration/update_column_in_batches_spec.rb35
-rw-r--r--spec/rubocop/cop/migration/with_lock_retries_disallowed_method_spec.rb68
-rw-r--r--spec/rubocop/cop/migration/with_lock_retries_with_change_spec.rb35
-rw-r--r--spec/rubocop/cop/performance/ar_count_each_spec.rb1
-rw-r--r--spec/rubocop/cop/performance/ar_exists_and_present_blank_spec.rb1
-rw-r--r--spec/rubocop/cop/performance/readlines_each_spec.rb1
-rw-r--r--spec/rubocop/cop/prefer_class_methods_over_module_spec.rb43
-rw-r--r--spec/rubocop/cop/project_path_helper_spec.rb1
-rw-r--r--spec/rubocop/cop/put_group_routes_under_scope_spec.rb13
-rw-r--r--spec/rubocop/cop/put_project_routes_under_scope_spec.rb1
-rw-r--r--spec/rubocop/cop/qa/ambiguous_page_object_name_spec.rb1
-rw-r--r--spec/rubocop/cop/qa/element_with_pattern_spec.rb1
-rw-r--r--spec/rubocop/cop/rspec/be_success_matcher_spec.rb1
-rw-r--r--spec/rubocop/cop/rspec/env_assignment_spec.rb1
-rw-r--r--spec/rubocop/cop/rspec/expect_gitlab_tracking_spec.rb1
-rw-r--r--spec/rubocop/cop/rspec/factories_in_migration_specs_spec.rb1
-rw-r--r--spec/rubocop/cop/rspec/factory_bot/inline_association_spec.rb1
-rw-r--r--spec/rubocop/cop/rspec/have_gitlab_http_status_spec.rb1
-rw-r--r--spec/rubocop/cop/rspec/modify_sidekiq_middleware_spec.rb1
-rw-r--r--spec/rubocop/cop/rspec/timecop_freeze_spec.rb1
-rw-r--r--spec/rubocop/cop/rspec/timecop_travel_spec.rb1
-rw-r--r--spec/rubocop/cop/rspec/top_level_describe_path_spec.rb1
-rw-r--r--spec/rubocop/cop/ruby_interpolation_in_translation_spec.rb1
-rw-r--r--spec/rubocop/cop/safe_params_spec.rb1
-rw-r--r--spec/rubocop/cop/scalability/bulk_perform_with_context_spec.rb1
-rw-r--r--spec/rubocop/cop/scalability/cron_worker_context_spec.rb1
-rw-r--r--spec/rubocop/cop/scalability/file_uploads_spec.rb1
-rw-r--r--spec/rubocop/cop/scalability/idempotent_worker_spec.rb1
-rw-r--r--spec/rubocop/cop/sidekiq_options_queue_spec.rb20
-rw-r--r--spec/rubocop/cop/static_translation_definition_spec.rb1
-rw-r--r--spec/rubocop/cop/usage_data/distinct_count_by_large_foreign_key_spec.rb1
-rw-r--r--spec/rubocop/cop/usage_data/large_table_spec.rb1
-rw-r--r--spec/rubocop/migration_helpers_spec.rb1
-rw-r--r--spec/rubocop/qa_helpers_spec.rb1
-rw-r--r--spec/serializers/base_discussion_entity_spec.rb9
-rw-r--r--spec/serializers/merge_request_user_entity_spec.rb53
-rw-r--r--spec/serializers/pipeline_serializer_spec.rb16
-rw-r--r--spec/serializers/test_suite_comparer_entity_spec.rb44
-rw-r--r--spec/services/alert_management/create_alert_issue_service_spec.rb27
-rw-r--r--spec/services/alert_management/process_prometheus_alert_service_spec.rb16
-rw-r--r--spec/services/boards/issues/list_service_spec.rb78
-rw-r--r--spec/services/boards/list_service_spec.rb24
-rw-r--r--spec/services/boards/lists/list_service_spec.rb22
-rw-r--r--spec/services/bulk_import_service_spec.rb17
-rw-r--r--spec/services/ci/create_pipeline_service/environment_spec.rb48
-rw-r--r--spec/services/ci/create_pipeline_service/rules_spec.rb20
-rw-r--r--spec/services/ci/create_pipeline_service_spec.rb2
-rw-r--r--spec/services/ci/expire_pipeline_cache_service_spec.rb41
-rw-r--r--spec/services/ci/pipeline_processing/shared_processing_service.rb20
-rw-r--r--spec/services/ci/pipeline_processing/test_cases/dag_build_succeds_test_manual_allow_failure_true_deploy_needs_both.yml6
-rw-r--r--spec/services/ci/pipeline_processing/test_cases/dag_build_succeds_test_manual_allow_failure_true_deploy_needs_test.yml6
-rw-r--r--spec/services/ci/pipeline_processing/test_cases/dag_build_test_manual_review_deploy.yml22
-rw-r--r--spec/services/ci/pipeline_processing/test_cases/dag_test_manual_allow_failure_true.yml23
-rw-r--r--spec/services/ci/pipeline_processing/test_cases/dag_test_manual_allow_failure_true_deploy_always.yml9
-rw-r--r--spec/services/ci/pipeline_processing/test_cases/dag_test_manual_allow_failure_true_deploy_on_failure.yml13
-rw-r--r--spec/services/ci/pipeline_processing/test_cases/dag_test_manual_allow_failure_true_other_test_succeeds_deploy_needs_both.yml13
-rw-r--r--spec/services/ci/process_pipeline_service_spec.rb53
-rw-r--r--spec/services/ci/register_job_service_spec.rb933
-rw-r--r--spec/services/ci/update_build_queue_service_spec.rb58
-rw-r--r--spec/services/clusters/kubernetes/create_or_update_namespace_service_spec.rb2
-rw-r--r--spec/services/clusters/kubernetes/create_or_update_service_account_service_spec.rb43
-rw-r--r--spec/services/dependency_proxy/find_or_create_manifest_service_spec.rb46
-rw-r--r--spec/services/dependency_proxy/head_manifest_service_spec.rb9
-rw-r--r--spec/services/dependency_proxy/pull_manifest_service_spec.rb6
-rw-r--r--spec/services/deployments/update_environment_service_spec.rb65
-rw-r--r--spec/services/groups/destroy_service_spec.rb6
-rw-r--r--spec/services/groups/group_links/create_service_spec.rb56
-rw-r--r--spec/services/groups/group_links/destroy_service_spec.rb4
-rw-r--r--spec/services/groups/group_links/update_service_spec.rb8
-rw-r--r--spec/services/groups/import_export/import_service_spec.rb28
-rw-r--r--spec/services/import/github_service_spec.rb64
-rw-r--r--spec/services/issuable/bulk_update_service_spec.rb45
-rw-r--r--spec/services/issuable/process_assignees_spec.rb71
-rw-r--r--spec/services/issues/clone_service_spec.rb6
-rw-r--r--spec/services/issues/create_service_spec.rb6
-rw-r--r--spec/services/issues/move_service_spec.rb6
-rw-r--r--spec/services/labels/promote_service_spec.rb66
-rw-r--r--spec/services/members/invite_service_spec.rb173
-rw-r--r--spec/services/merge_requests/after_create_service_spec.rb26
-rw-r--r--spec/services/merge_requests/build_service_spec.rb123
-rw-r--r--spec/services/merge_requests/merge_service_spec.rb13
-rw-r--r--spec/services/merge_requests/post_merge_service_spec.rb134
-rw-r--r--spec/services/merge_requests/refresh_service_spec.rb27
-rw-r--r--spec/services/merge_requests/retarget_chain_service_spec.rb154
-rw-r--r--spec/services/merge_requests/update_service_spec.rb179
-rw-r--r--spec/services/namespaces/in_product_marketing_emails_service_spec.rb39
-rw-r--r--spec/services/notes/build_service_spec.rb140
-rw-r--r--spec/services/notes/update_service_spec.rb34
-rw-r--r--spec/services/notification_service_spec.rb172
-rw-r--r--spec/services/onboarding_progress_service_spec.rb54
-rw-r--r--spec/services/packages/composer/create_package_service_spec.rb8
-rw-r--r--spec/services/packages/create_event_service_spec.rb24
-rw-r--r--spec/services/packages/create_temporary_package_service_spec.rb44
-rw-r--r--spec/services/packages/debian/find_or_create_incoming_service_spec.rb36
-rw-r--r--spec/services/packages/debian/find_or_create_package_service_spec.rb54
-rw-r--r--spec/services/packages/debian/get_or_create_incoming_service_spec.rb36
-rw-r--r--spec/services/packages/maven/metadata/append_package_file_service_spec.rb59
-rw-r--r--spec/services/packages/maven/metadata/create_versions_xml_service_spec.rb277
-rw-r--r--spec/services/packages/maven/metadata/sync_service_spec.rb154
-rw-r--r--spec/services/packages/npm/create_package_service_spec.rb51
-rw-r--r--spec/services/packages/nuget/create_package_service_spec.rb37
-rw-r--r--spec/services/packages/nuget/update_package_from_metadata_service_spec.rb5
-rw-r--r--spec/services/packages/rubygems/dependency_resolver_service_spec.rb100
-rw-r--r--spec/services/pages/legacy_storage_lease_spec.rb8
-rw-r--r--spec/services/projects/alerting/notify_service_spec.rb8
-rw-r--r--spec/services/projects/branches_by_mode_service_spec.rb4
-rw-r--r--spec/services/projects/create_service_spec.rb43
-rw-r--r--spec/services/projects/destroy_service_spec.rb503
-rw-r--r--spec/services/projects/schedule_bulk_repository_shard_moves_service_spec.rb4
-rw-r--r--spec/services/projects/update_pages_configuration_service_spec.rb17
-rw-r--r--spec/services/projects/update_pages_service_spec.rb35
-rw-r--r--spec/services/projects/update_service_spec.rb2
-rw-r--r--spec/services/quick_actions/interpret_service_spec.rb94
-rw-r--r--spec/services/repositories/changelog_service_spec.rb118
-rw-r--r--spec/services/snippets/schedule_bulk_repository_shard_moves_service_spec.rb4
-rw-r--r--spec/services/system_hooks_service_spec.rb3
-rw-r--r--spec/services/system_note_service_spec.rb13
-rw-r--r--spec/services/system_notes/alert_management_service_spec.rb13
-rw-r--r--spec/services/system_notes/merge_requests_service_spec.rb2
-rw-r--r--spec/services/users/dismiss_user_callout_service_spec.rb27
-rw-r--r--spec/services/users/refresh_authorized_projects_service_spec.rb8
-rw-r--r--spec/spam/concerns/has_spam_action_response_fields_spec.rb35
-rw-r--r--spec/spec_helper.rb11
-rw-r--r--spec/support/capybara.rb24
-rw-r--r--spec/support/gitlab_experiment.rb21
-rw-r--r--spec/support/graphql/resolver_factories.rb40
-rw-r--r--spec/support/helpers/cycle_analytics_helpers.rb4
-rw-r--r--spec/support/helpers/dependency_proxy_helpers.rb4
-rw-r--r--spec/support/helpers/design_management_test_helpers.rb2
-rw-r--r--spec/support/helpers/features/releases_helpers.rb105
-rw-r--r--spec/support/helpers/gpg_helpers.rb4
-rw-r--r--spec/support/helpers/graphql_helpers.rb200
-rw-r--r--spec/support/helpers/javascript_fixtures_helpers.rb1
-rw-r--r--spec/support/helpers/notification_helpers.rb4
-rw-r--r--spec/support/helpers/stub_object_storage.rb2
-rw-r--r--spec/support/helpers/test_env.rb24
-rw-r--r--spec/support/matchers/background_migrations_matchers.rb20
-rw-r--r--spec/support/matchers/email_matcher.rb19
-rw-r--r--spec/support/matchers/graphql_matchers.rb9
-rw-r--r--spec/support/services/issues/move_and_clone_services_shared_examples.rb22
-rw-r--r--spec/support/services/service_response_shared_examples.rb25
-rw-r--r--spec/support/shared_contexts/features/error_tracking_shared_context.rb2
-rw-r--r--spec/support/shared_contexts/issuable/merge_request_shared_context.rb64
-rw-r--r--spec/support/shared_contexts/navbar_structure_context.rb11
-rw-r--r--spec/support/shared_contexts/policies/group_policy_shared_context.rb4
-rw-r--r--spec/support/shared_contexts/policies/project_policy_shared_context.rb6
-rw-r--r--spec/support/shared_contexts/policies/project_policy_table_shared_context.rb2
-rw-r--r--spec/support/shared_contexts/requests/api/npm_packages_shared_context.rb9
-rw-r--r--spec/support/shared_contexts/security_and_compliance_permissions_shared_context.rb33
-rw-r--r--spec/support/shared_examples/alert_notification_service_shared_examples.rb15
-rw-r--r--spec/support/shared_examples/banzai/filters/emoji_shared_examples.rb46
-rw-r--r--spec/support/shared_examples/boards/multiple_issue_boards_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/controllers/create_notes_rate_limit_shared_examples.rb44
-rw-r--r--spec/support/shared_examples/controllers/snippet_blob_shared_examples.rb32
-rw-r--r--spec/support/shared_examples/features/comment_and_close_button_shared_examples.rb29
-rw-r--r--spec/support/shared_examples/features/discussion_comments_shared_example.rb216
-rw-r--r--spec/support/shared_examples/features/issuable_invite_members_shared_examples.rb10
-rw-r--r--spec/support/shared_examples/features/project_upload_files_shared_examples.rb36
-rw-r--r--spec/support/shared_examples/features/variable_list_shared_examples.rb26
-rw-r--r--spec/support/shared_examples/graphql/mutation_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/graphql/mutations/boards_create_shared_examples.rb6
-rw-r--r--spec/support/shared_examples/graphql/mutations/can_mutate_spammable_examples.rb8
-rw-r--r--spec/support/shared_examples/graphql/notes_on_noteables_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/graphql/types/gitlab_style_deprecations_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/helpers/issuable_description_templates_shared_examples.rb4
-rw-r--r--spec/support/shared_examples/lib/gitlab/cycle_analytics/event_shared_examples.rb1
-rw-r--r--spec/support/shared_examples/lib/gitlab/usage_data_counters/issuable_activity_shared_examples.rb37
-rw-r--r--spec/support/shared_examples/lib/gitlab/usage_data_counters/issue_activity_shared_examples.rb27
-rw-r--r--spec/support/shared_examples/lib/sentry/client_shared_examples.rb4
-rw-r--r--spec/support/shared_examples/metrics/active_record_subscriber_shared_examples.rb137
-rw-r--r--spec/support/shared_examples/models/application_setting_shared_examples.rb15
-rw-r--r--spec/support/shared_examples/models/boards/user_preferences_shared_examples.rb68
-rw-r--r--spec/support/shared_examples/models/chat_service_shared_examples.rb11
-rw-r--r--spec/support/shared_examples/models/concerns/timebox_shared_examples.rb4
-rw-r--r--spec/support/shared_examples/models/email_format_shared_examples.rb4
-rw-r--r--spec/support/shared_examples/models/slack_mattermost_notifications_shared_examples.rb241
-rw-r--r--spec/support/shared_examples/quick_actions/issuable/time_tracking_quick_action_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/requests/api/conan_packages_shared_examples.rb106
-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/graphql/packages/group_and_project_packages_list_shared_examples.rb51
-rw-r--r--spec/support/shared_examples/requests/api/logging_application_context_shared_examples.rb16
-rw-r--r--spec/support/shared_examples/requests/api/npm_packages_shared_examples.rb593
-rw-r--r--spec/support/shared_examples/requests/api/rubygems_packages_shared_examples.rb194
-rw-r--r--spec/support/shared_examples/service_desk_issue_templates_examples.rb12
-rw-r--r--spec/support/shared_examples/services/boards/update_boards_shared_examples.rb83
-rw-r--r--spec/support/snowplow.rb19
-rw-r--r--spec/support/stub_snowplow.rb23
-rw-r--r--spec/tasks/admin_mode_spec.rb32
-rw-r--r--spec/tasks/gitlab/packages/composer_rake_spec.rb28
-rw-r--r--spec/tooling/danger/changelog_spec.rb182
-rw-r--r--spec/tooling/danger/helper_spec.rb127
-rw-r--r--spec/tooling/rspec_flaky/config_spec.rb106
-rw-r--r--spec/tooling/rspec_flaky/example_spec.rb92
-rw-r--r--spec/tooling/rspec_flaky/flaky_example_spec.rb185
-rw-r--r--spec/tooling/rspec_flaky/flaky_examples_collection_spec.rb74
-rw-r--r--spec/tooling/rspec_flaky/listener_spec.rb227
-rw-r--r--spec/tooling/rspec_flaky/report_spec.rb135
-rw-r--r--spec/uploaders/dependency_proxy/file_uploader_spec.rb46
-rw-r--r--spec/validators/gitlab/utils/zoom_url_validator_spec.rb36
-rw-r--r--spec/validators/zoom_url_validator_spec.rb36
-rw-r--r--spec/views/admin/application_settings/_package_registry.html.haml_spec.rb12
-rw-r--r--spec/views/admin/application_settings/_repository_storage.html.haml_spec.rb47
-rw-r--r--spec/views/groups/show.html.haml_spec.rb52
-rw-r--r--spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb4
-rw-r--r--spec/views/notify/change_in_merge_request_draft_status_email.html.haml_spec.rb19
-rw-r--r--spec/views/notify/change_in_merge_request_draft_status_email.text.erb_spec.rb20
-rw-r--r--spec/views/projects/_home_panel.html.haml_spec.rb10
-rw-r--r--spec/views/projects/empty.html.haml_spec.rb37
-rw-r--r--spec/views/projects/merge_requests/show.html.haml_spec.rb38
-rw-r--r--spec/views/projects/settings/operations/show.html.haml_spec.rb4
-rw-r--r--spec/views/projects/show.html.haml_spec.rb51
-rw-r--r--spec/workers/analytics/instance_statistics/count_job_trigger_worker_spec.rb4
-rw-r--r--spec/workers/analytics/instance_statistics/counter_job_worker_spec.rb14
-rw-r--r--spec/workers/analytics/usage_trends/count_job_trigger_worker_spec.rb17
-rw-r--r--spec/workers/analytics/usage_trends/counter_job_worker_spec.rb70
-rw-r--r--spec/workers/emails_on_push_worker_spec.rb36
-rw-r--r--spec/workers/error_tracking_issue_link_worker_spec.rb12
-rw-r--r--spec/workers/expire_job_cache_worker_spec.rb8
-rw-r--r--spec/workers/expire_pipeline_cache_worker_spec.rb9
-rw-r--r--spec/workers/jira_connect/sync_project_worker_spec.rb2
-rw-r--r--spec/workers/merge_requests/delete_source_branch_worker_spec.rb63
-rw-r--r--spec/workers/merge_worker_spec.rb2
-rw-r--r--spec/workers/namespaces/in_product_marketing_emails_worker_spec.rb36
-rw-r--r--spec/workers/namespaces/onboarding_issue_created_worker_spec.rb28
-rw-r--r--spec/workers/namespaces/onboarding_progress_worker_spec.rb22
-rw-r--r--spec/workers/new_issue_worker_spec.rb43
-rw-r--r--spec/workers/new_merge_request_worker_spec.rb45
-rw-r--r--spec/workers/packages/composer/cache_update_worker_spec.rb48
-rw-r--r--spec/workers/packages/maven/metadata/sync_worker_spec.rb133
-rw-r--r--spec/workers/pages_update_configuration_worker_spec.rb22
-rw-r--r--spec/workers/personal_access_tokens/expiring_worker_spec.rb15
-rw-r--r--spec/workers/post_receive_spec.rb25
-rw-r--r--spec/workers/project_schedule_bulk_repository_shard_moves_worker_spec.rb4
-rw-r--r--spec/workers/project_update_repository_storage_worker_spec.rb2
-rw-r--r--spec/workers/projects/schedule_bulk_repository_shard_moves_worker_spec.rb12
-rw-r--r--spec/workers/projects/update_repository_storage_worker_spec.rb15
-rw-r--r--spec/workers/purge_dependency_proxy_cache_worker_spec.rb22
-rw-r--r--spec/workers/snippet_schedule_bulk_repository_shard_moves_worker_spec.rb4
-rw-r--r--spec/workers/snippet_update_repository_storage_worker_spec.rb2
-rw-r--r--spec/workers/snippets/schedule_bulk_repository_shard_moves_worker_spec.rb12
-rw-r--r--spec/workers/snippets/update_repository_storage_worker_spec.rb15
-rw-r--r--tests.yml4
-rw-r--r--tooling/danger/changelog.rb41
-rw-r--r--tooling/danger/helper.rb99
-rw-r--r--tooling/overcommit/Gemfile1
-rw-r--r--tooling/overcommit/Gemfile.lock14
-rw-r--r--tooling/rspec_flaky/config.rb27
-rw-r--r--tooling/rspec_flaky/example.rb53
-rw-r--r--tooling/rspec_flaky/flaky_example.rb40
-rw-r--r--tooling/rspec_flaky/flaky_examples_collection.rb (renamed from lib/rspec_flaky/flaky_examples_collection.rb)0
-rw-r--r--tooling/rspec_flaky/listener.rb67
-rw-r--r--tooling/rspec_flaky/report.rb56
-rw-r--r--vendor/aws/cloudformation/eks_cluster.yaml7
-rw-r--r--[-rwxr-xr-x]vendor/gitignore/C++.gitignore0
-rw-r--r--[-rwxr-xr-x]vendor/gitignore/Java.gitignore0
-rw-r--r--vendor/project_templates/dotnetcore.tar.gzbin4924 -> 4923 bytes
-rw-r--r--vendor/project_templates/express.tar.gzbin17921 -> 17923 bytes
-rw-r--r--vendor/project_templates/learn_gitlab_ultimate_trial.tar.gz (renamed from vendor/project_templates/learn_gitlab_gold_trial.tar.gz)bin115096 -> 115096 bytes
-rw-r--r--workhorse/CHANGELOG16
-rw-r--r--workhorse/PROCESS.md4
-rw-r--r--workhorse/README.md14
l---------[-rw-r--r--]workhorse/VERSION2
-rw-r--r--workhorse/config_test.go2
-rw-r--r--workhorse/go.mod2
-rw-r--r--workhorse/go.sum2
-rw-r--r--workhorse/internal/errortracker/sentry.go60
-rw-r--r--workhorse/internal/helper/helpers.go43
-rw-r--r--workhorse/internal/helper/raven.go58
-rw-r--r--workhorse/internal/imageresizer/image_resizer.go10
-rw-r--r--workhorse/internal/log/logging.go6
-rw-r--r--workhorse/internal/upstream/upstream.go3
-rw-r--r--workhorse/main.go7
-rw-r--r--workhorse/raven.go40
-rw-r--r--yarn.lock1976
5707 files changed, 286582 insertions, 210886 deletions
diff --git a/.eslintignore b/.eslintignore
index c41556f6aae..73e11dfd974 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -1,15 +1,9 @@
/app/assets/javascripts/locale/**/app.js
-/config/
/builds/
/coverage/
/coverage-frontend/
/coverage-javascript/
/node_modules/
/public/
-/scripts/
/tmp/
/vendor/
-jest.config.js
-jest.config.*.js
-karma.config.js
-webpack.config.js
diff --git a/.eslintrc.yml b/.eslintrc.yml
index 75c52ac1319..678750c085b 100644
--- a/.eslintrc.yml
+++ b/.eslintrc.yml
@@ -89,3 +89,15 @@ overrides:
rules:
'@gitlab/require-i18n-strings': off
'@gitlab/no-runtime-template-compiler': off
+ - files:
+ - 'config/**/*'
+ - 'scripts/**/*'
+ - '*.config.js'
+ - 'jest.*.js'
+ rules:
+ '@gitlab/require-i18n-strings': off
+ import/no-extraneous-dependencies: off
+ import/no-commonjs: off
+ import/no-nodejs-modules: off
+ filenames/match-regex: off
+ no-console: off
diff --git a/.gitignore b/.gitignore
index 93fb0b1144b..388718898e4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -19,8 +19,8 @@ eslint-report.html
/.ruby-version
/.tool-versions
/.rvmrc
-.sass-cache/
/.secret
+.sass-cache/
/.vagrant
/.yarn-cache
/.byebug_history
@@ -104,3 +104,4 @@ ee/changelogs/unreleased-ee
/sitespeed-result
tags.lock
tags.temp
+.stylelintcache
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index e38e2f765bd..8bb09825e67 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -111,4 +111,4 @@ include:
- local: .gitlab/ci/dast.gitlab-ci.yml
- local: .gitlab/ci/workhorse.gitlab-ci.yml
- local: .gitlab/ci/graphql.gitlab-ci.yml
- - local: .gitlab/ci/verify-lockfile.gitlab-ci.yml
+ - remote: 'https://gitlab.com/gitlab-org/frontend/untamper-my-lockfile/-/raw/main/.gitlab-ci-template.yml'
diff --git a/.gitlab/CODEOWNERS b/.gitlab/CODEOWNERS
index 0d34eeccf8c..2eda1a890d9 100644
--- a/.gitlab/CODEOWNERS
+++ b/.gitlab/CODEOWNERS
@@ -24,7 +24,6 @@
/doc/administration/troubleshooting @axil @marcia @mjang1
/doc/ci/ @marcel.amirault @sselhorn
/doc/ci/environments/ @axil
-/doc/ci/release/ @axil
/doc/ci/services/ @sselhorn
/doc/ci/test_cases/ @msedlakjakubowski
/doc/development/ @marcia @mjang1
@@ -101,6 +100,7 @@
/doc/api/repository_files.md @aqualls
/doc/api/repository_submodules.md @aqualls
/doc/api/search.md @aqualls
+/doc/api/services.md @aqualls
/doc/api/snippets.md @aqualls
/doc/api/suggestions.md @aqualls
/doc/api/tags.md @aqualls
@@ -110,6 +110,7 @@
/doc/topics/gitlab_flow.md @aqualls
/doc/user/admin_area/settings/account_and_limit_settings.md @aqualls
/doc/user/admin_area/settings/instance_template_repository.md @aqualls
+/doc/user/admin_area/settings/project_integration_management.md @aqualls
/doc/user/admin_area/settings/push_event_activities_limit.md @aqualls
/doc/user/admin_area/settings/visibility_and_access_controls.md @aqualls
/doc/user/asciidoc.md @aqualls
@@ -129,6 +130,15 @@
/doc/user/project/settings/import_export.md @aqualls
/doc/user/snippets.md @aqualls
+[Docs Growth]
+/doc/administration/instance_review.md @aqualls
+/doc/api/invitations.md @aqualls
+/doc/api/experiments.md @aqualls
+/doc/development/experiment_guide/ @aqualls
+/doc/development/snowplow.md @aqualls
+/doc/development/usage_ping/ @aqualls
+/doc/user/admin_area/license.md @aqualls
+
[Frontend]
*.scss @annabeldunstone @gitlab-org/maintainers/frontend
*.js @gitlab-org/maintainers/frontend
@@ -170,6 +180,11 @@ 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]
+.rubocop*.yml @dstull @splattael @gl-quality/eng-prod
+/rubocop/ @dstull @splattael @gl-quality/eng-prod
+/spec/rubocop/ @dstull @splattael @gl-quality/eng-prod
+
[End-to-end]
/qa/ @gl-quality
@@ -189,15 +204,16 @@ Dangerfile @gl-quality/eng-prod
# Secure & Threat Management ownership delineation
# https://about.gitlab.com/handbook/engineering/development/threat-management/delineate-secure-threat-management.html#technical-boundaries
[Threat Insights]
+/app/models/vulnerability.rb @gitlab-org/secure/threat-insights-backend-team
/ee/app/finders/security/ @gitlab-org/secure/threat-insights-backend-team
/ee/app/models/security/ @gitlab-org/secure/threat-insights-backend-team
/ee/app/models/vulnerabilities/ @gitlab-org/secure/threat-insights-backend-team
-/ee/app/models/vulnerability.rb @gitlab-org/secure/threat-insights-backend-team
/ee/app/policies/vulnerabilities/ @gitlab-org/secure/threat-insights-backend-team
/ee/app/policies/vulnerability*.rb @gitlab-org/secure/threat-insights-backend-team
/ee/lib/api/vulnerabilit*.rb @gitlab-org/secure/threat-insights-backend-team
/ee/spec/policies/vulnerabilities/ @gitlab-org/secure/threat-insights-backend-team
-/ee/spec/policies/vulnerabilities/vulnerability*.rb @gitlab-org/secure/threat-insights-backend-team
+/ee/spec/policies/vulnerability*.rb @gitlab-org/secure/threat-insights-backend-team
+
[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
@@ -244,9 +260,7 @@ Dangerfile @gl-quality/eng-prod
[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/grafana_embed_usage_data.rb @gitlab-org/growth/product-intelligence/engineers
/lib/gitlab/usage_data.rb @gitlab-org/growth/product_intelligence/engineers
-/lib/gitlab/cycle_analytics/usage_data.rb @gitlab-org/growth/product-intelligence/engineers
/lib/gitlab/usage_data_counters/ @gitlab-org/growth/product-intelligence/engineers
[Growth Experiments]
@@ -266,3 +280,6 @@ Dangerfile @gl-quality/eng-prod
[Legal]
/config/dependency_decisions.yml @gitlab-org/legal-reviewers
+
+[Workhorse]
+/workhorse/ @jacobvosmaer-gitlab @nick.thomas @nolith @patrickbajao
diff --git a/.gitlab/ci/cache-repo.gitlab-ci.yml b/.gitlab/ci/cache-repo.gitlab-ci.yml
index 18e1ca1644d..324c8615083 100644
--- a/.gitlab/ci/cache-repo.gitlab-ci.yml
+++ b/.gitlab/ci/cache-repo.gitlab-ci.yml
@@ -29,6 +29,7 @@ cache-repo:
- '[ -z "$CI_REPO_CACHE_CREDENTIALS" ] || gcloud auth activate-service-account --key-file=$CI_REPO_CACHE_CREDENTIALS'
script:
# Enable shallow repo caching only if the $ENABLE_SHALLOW_REPO_CACHING variable exists
+ # The `git repack` call works around a Git bug with shallow clones: https://gitlab.com/gitlab-org/git/-/issues/86
- if [ -n "$ENABLE_SHALLOW_REPO_CACHING" ]; then
cd .. && rm -rf $CI_PROJECT_NAME;
today=$(date +%Y-%m-%d);
@@ -38,6 +39,7 @@ cache-repo:
echo "Cloning $CI_REPOSITORY_URL into $CI_PROJECT_NAME with commits from $one_year_ago.";
time git clone --progress --no-checkout --shallow-since=$one_year_ago $CI_REPOSITORY_URL $CI_PROJECT_NAME;
cd $CI_PROJECT_NAME;
+ time git repack -d;
echo "Archiving $CI_PROJECT_NAME into /tmp/$SHALLOW_CLONE_TAR_FILENAME.";
time tar cf /tmp/$SHALLOW_CLONE_TAR_FILENAME .;
echo "GZipping /tmp/$SHALLOW_CLONE_TAR_FILENAME.";
diff --git a/.gitlab/ci/frontend.gitlab-ci.yml b/.gitlab/ci/frontend.gitlab-ci.yml
index 1b4b8a12772..910a58bcd0e 100644
--- a/.gitlab/ci/frontend.gitlab-ci.yml
+++ b/.gitlab/ci/frontend.gitlab-ci.yml
@@ -131,6 +131,24 @@ rspec-ee frontend_fixture:
- .frontend:rules:default-frontend-jobs
parallel: 2
+graphql-schema-dump:
+ variables:
+ SETUP_DB: "false"
+ extends:
+ - .default-retry
+ - .rails-cache
+ - .default-before_script
+ - .frontend:rules:default-frontend-jobs
+ stage: fixtures
+ needs: []
+ script:
+ - bundle exec rake gitlab:graphql:schema:dump
+ artifacts:
+ name: graphql-schema
+ paths:
+ - tmp/tests/graphql/gitlab_schema.graphql
+ - tmp/tests/graphql/gitlab_schema.json
+
.frontend-test-base:
extends:
- .frontend-base
@@ -214,7 +232,7 @@ jest-integration:
- *yarn-install
- run_timed_command "yarn jest:integration --ci"
# Don't use `needs` since `rspec-ee frontend_fixture` doesn't exist in `gitlab-foss` pipelines.
- dependencies: ["rspec frontend_fixture", "rspec-ee frontend_fixture"]
+ dependencies: ["rspec frontend_fixture", "rspec-ee frontend_fixture", "graphql-schema-dump"]
jest-as-if-foss:
extends:
diff --git a/.gitlab/ci/global.gitlab-ci.yml b/.gitlab/ci/global.gitlab-ci.yml
index 5de8a6bc250..274629f9c60 100644
--- a/.gitlab/ci/global.gitlab-ci.yml
+++ b/.gitlab/ci/global.gitlab-ci.yml
@@ -102,7 +102,7 @@
- name: postgres:11.6
command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
- name: redis:5.0-alpine
- - name: elasticsearch:7.10.1
+ - name: elasticsearch:7.11.1
command: ["elasticsearch", "-E", "discovery.type=single-node"]
variables:
POSTGRES_HOST_AUTH_METHOD: trust
@@ -113,7 +113,7 @@
- name: postgres:12
command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
- name: redis:5.0-alpine
- - name: elasticsearch:7.10.1
+ - name: elasticsearch:7.11.1
command: ["elasticsearch", "-E", "discovery.type=single-node"]
variables:
POSTGRES_HOST_AUTH_METHOD: trust
diff --git a/.gitlab/ci/graphql.gitlab-ci.yml b/.gitlab/ci/graphql.gitlab-ci.yml
index 4aff0ef6306..1a05f68b178 100644
--- a/.gitlab/ci/graphql.gitlab-ci.yml
+++ b/.gitlab/ci/graphql.gitlab-ci.yml
@@ -11,4 +11,3 @@ graphql-verify:
script:
- bundle exec rake gitlab:graphql:validate
- bundle exec rake gitlab:graphql:check_docs
- - bundle exec rake gitlab:graphql:check_schema
diff --git a/.gitlab/ci/rails.gitlab-ci.yml b/.gitlab/ci/rails.gitlab-ci.yml
index 22aa92779ea..e1ddefca99e 100644
--- a/.gitlab/ci/rails.gitlab-ci.yml
+++ b/.gitlab/ci/rails.gitlab-ci.yml
@@ -6,12 +6,17 @@
- .default-before_script
- .rails-cache
-.base-script: &base-script
- # Only install knapsack after bundle install! Otherwise oddly some native
- # gems could not be found under some circumstance. No idea why, hours wasted.
- - run_timed_command "gem install knapsack --no-document"
- - run_timed_command "scripts/gitaly-test-spawn"
- - source ./scripts/rspec_helpers.sh
+.minimal-bundle-install:
+ script:
+ - run_timed_command "bundle install --jobs=$(nproc) --path=vendor --retry=3 --quiet --without default development test production puma unicorn kerberos metrics omnibus ed25519"
+
+.base-script:
+ script:
+ # Only install knapsack after bundle install! Otherwise oddly some native
+ # gems could not be found under some circumstance. No idea why, hours wasted.
+ - run_timed_command "gem install knapsack --no-document"
+ - run_timed_command "scripts/gitaly-test-spawn"
+ - source ./scripts/rspec_helpers.sh
.minimal-rspec-tests:
variables:
@@ -27,7 +32,7 @@
RECORD_DEPRECATIONS: "true"
needs: ["setup-test-env", "retrieve-tests-metadata", "compile-test-assets", "detect-tests"]
script:
- - *base-script
+ - !reference [.base-script, script]
- rspec_paralellized_job "--tag ~quarantine --tag ~geo --tag ~level:migration"
artifacts:
expire_in: 31d
@@ -49,7 +54,7 @@
.rspec-base-migration:
extends: .rails:rules:ee-and-foss-migration
script:
- - *base-script
+ - !reference [.base-script, script]
- rspec_paralellized_job "--tag ~quarantine --tag ~geo --tag level:migration"
.rspec-base-pg11:
@@ -82,7 +87,7 @@
.rspec-ee-base-geo:
extends: .rspec-base
script:
- - *base-script
+ - !reference [.base-script, script]
- rspec_paralellized_job "--tag ~quarantine --tag geo"
.rspec-ee-base-geo-pg11:
@@ -142,7 +147,7 @@ setup-test-env:
extends:
- .rails-job-base
- .setup-test-env-cache
- - .rails:rules:default-refs-code-backstage-qa
+ - .rails:rules:code-backstage-qa
- .use-pg11
stage: prepare
variables:
@@ -162,6 +167,7 @@ setup-test-env:
- tmp/tests/gitaly/gitaly-lfs-smudge
- tmp/tests/gitaly/gitaly-ssh
- tmp/tests/gitaly/internal/
+ - tmp/tests/gitaly/internal_gitaly2/
- tmp/tests/gitaly/internal_sockets/
- tmp/tests/gitaly/Makefile
- tmp/tests/gitaly/praefect
@@ -212,7 +218,7 @@ update-coverage-cache:
- .shared:rules:update-cache
stage: prepare
script:
- - run_timed_command "bundle install --jobs=$(nproc) --path=vendor --retry=3 --quiet --without default development test production puma unicorn kerberos metrics omnibus ed25519"
+ - !reference [.minimal-bundle-install, script]
cache:
policy: push # We want to rebuild the cache from scratch to ensure stale dependencies are cleaned up.
@@ -243,7 +249,7 @@ update-static-analysis-cache:
static-analysis:
extends:
- .static-analysis-base
- - .rails:rules:default-refs-code-backstage-qa
+ - .rails:rules:code-backstage-qa
stage: test
parallel: 4
script:
@@ -316,7 +322,7 @@ rspec db-library-code pg12:
- .rspec-base-pg12
- .rails:rules:ee-and-foss-db-library-code
script:
- - *base-script
+ - !reference [.base-script, script]
- rspec_db_library_code
rspec fast_spec_helper:
@@ -405,7 +411,7 @@ gitlab:setup:
# db/fixtures/development/04_project.rb thanks to SIZE=1 below
- git clone https://gitlab.com/gitlab-org/gitlab-test.git
/home/git/repositories/gitlab-org/gitlab-test.git
- - *base-script
+ - !reference [.base-script, script]
- force=yes SIZE=1 FIXTURE_PATH="db/fixtures/development" bundle exec rake gitlab:setup
artifacts:
when: on_failure
@@ -485,7 +491,7 @@ rspec:coverage:
- memory-static
- memory-on-boot
script:
- - run_timed_command "bundle install --jobs=$(nproc) --path=vendor --retry=3 --quiet --without default development test production puma unicorn kerberos metrics omnibus ed25519"
+ - !reference [.minimal-bundle-install, script]
- run_timed_command "bundle exec scripts/merge-simplecov"
- run_timed_command "bundle exec scripts/gather-test-memory-data"
coverage: '/LOC \((\d+\.\d+%)\) covered.$/'
@@ -522,7 +528,7 @@ rspec:feature-flags:
- memory-static
- memory-on-boot
script:
- - run_timed_command "bundle install --jobs=$(nproc) --path=vendor --retry=3 --quiet --without default development test production puma unicorn kerberos metrics omnibus ed25519"
+ - !reference [.minimal-bundle-install, script]
- if [ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]; then
run_timed_command "bundle exec scripts/used-feature-flags" || (scripts/slack master-broken "â˜ ï¸ \`${CI_JOB_NAME}\` failed! â˜ ï¸ See ${CI_JOB_URL}" ci_failing "GitLab Bot" && exit 1);
else
@@ -762,7 +768,7 @@ rspec fail-fast:
stage: test
needs: ["setup-test-env", "retrieve-tests-metadata", "compile-test-assets", "detect-tests"]
script:
- - *base-script
+ - !reference [.base-script, script]
- rspec_fail_fast tmp/matching_tests.txt "--tag ~quarantine"
artifacts:
expire_in: 7d
@@ -775,7 +781,7 @@ rspec foss-impact:
- .rails:rules:rspec-foss-impact
needs: ["setup-test-env", "retrieve-tests-metadata", "compile-test-assets as-if-foss", "detect-tests as-if-foss"]
script:
- - *base-script
+ - !reference [.base-script, script]
- rspec_matched_foss_tests tmp/matching_foss_tests.txt "--tag ~quarantine"
artifacts:
expire_in: 7d
diff --git a/.gitlab/ci/reports.gitlab-ci.yml b/.gitlab/ci/reports.gitlab-ci.yml
index 77ada89aa6a..4d54380cefe 100644
--- a/.gitlab/ci/reports.gitlab-ci.yml
+++ b/.gitlab/ci/reports.gitlab-ci.yml
@@ -15,7 +15,7 @@ code_quality:
stage: test
needs: []
variables:
- CODE_QUALITY_IMAGE: "registry.gitlab.com/gitlab-org/ci-cd/codequality:0.85.18"
+ CODE_QUALITY_IMAGE: "registry.gitlab.com/gitlab-org/ci-cd/codequality:0.85.23"
script:
- |
if ! docker info &>/dev/null; then
diff --git a/.gitlab/ci/rules.gitlab-ci.yml b/.gitlab/ci/rules.gitlab-ci.yml
index 1eafd024f5e..e76b0f2d07f 100644
--- a/.gitlab/ci/rules.gitlab-ci.yml
+++ b/.gitlab/ci/rules.gitlab-ci.yml
@@ -11,25 +11,25 @@
if: '$CI_PROJECT_NAME != "gitlab-foss" && $CI_PROJECT_NAME != "gitlab-ce" && $CI_PROJECT_NAME != "gitlabhq"'
.if-default-refs: &if-default-refs
- if: '$CI_COMMIT_REF_NAME == "master" || $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'
+ if: '$CI_COMMIT_REF_NAME == "master" || $CI_COMMIT_REF_NAME == "main" || $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'
.if-master-refs: &if-master-refs
- if: '$CI_COMMIT_REF_NAME == "master"'
+ if: '$CI_COMMIT_REF_NAME == "master" || $CI_COMMIT_REF_NAME == "main"'
.if-master-push: &if-master-push
- if: '$CI_COMMIT_BRANCH == "master" && $CI_PIPELINE_SOURCE == "push"'
+ if: '($CI_COMMIT_BRANCH == "master" || $CI_COMMIT_REF_NAME == "main") && $CI_PIPELINE_SOURCE == "push"'
.if-master-schedule-2-hourly: &if-master-schedule-2-hourly
- if: '$CI_COMMIT_BRANCH == "master" && $CI_PIPELINE_SOURCE == "schedule" && $FREQUENCY == "2-hourly"'
+ if: '($CI_COMMIT_BRANCH == "master" || $CI_COMMIT_REF_NAME == "main") && $CI_PIPELINE_SOURCE == "schedule" && $FREQUENCY == "2-hourly"'
.if-master-schedule-nightly: &if-master-schedule-nightly
- if: '$CI_COMMIT_BRANCH == "master" && $CI_PIPELINE_SOURCE == "schedule" && $FREQUENCY == "nightly"'
+ if: '($CI_COMMIT_BRANCH == "master" || $CI_COMMIT_REF_NAME == "main") && $CI_PIPELINE_SOURCE == "schedule" && $FREQUENCY == "nightly"'
.if-auto-deploy-branches: &if-auto-deploy-branches
if: '$CI_COMMIT_BRANCH =~ /^\d+-\d+-auto-deploy-\d+$/'
.if-master-or-tag: &if-master-or-tag
- if: '$CI_COMMIT_REF_NAME == "master" || $CI_COMMIT_TAG'
+ if: '$CI_COMMIT_REF_NAME == "master" || $CI_COMMIT_REF_NAME == "main" || $CI_COMMIT_TAG'
.if-merge-request: &if-merge-request
if: '$CI_MERGE_REQUEST_IID'
@@ -53,7 +53,7 @@
if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_NAMESPACE == "gitlab-org" && $CI_PIPELINE_SOURCE == "schedule"'
.if-dot-com-gitlab-org-master: &if-dot-com-gitlab-org-master
- if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_NAMESPACE == "gitlab-org" && $CI_COMMIT_REF_NAME == "master"'
+ if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_NAMESPACE == "gitlab-org" && ($CI_COMMIT_REF_NAME == "master" || $CI_COMMIT_REF_NAME == "main")'
.if-dot-com-gitlab-org-merge-request: &if-dot-com-gitlab-org-merge-request
if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_NAMESPACE == "gitlab-org" && $CI_MERGE_REQUEST_IID'
@@ -149,6 +149,7 @@
- "{,ee/}{app/channels,app/controllers,app/finders,app/graphql,app/helpers,app/mailers,app/models,app/policies,app/presenters,app/serializers,app/services,app/uploaders,app/validators,app/views,app/workers}/**/*"
- "{,ee/}{bin,cable,config,db,lib}/**/*"
- "{,ee/}spec/**/*.rb"
+ # CI changes
- ".gitlab-ci.yml"
- ".gitlab/ci/**/*"
- "*_VERSION"
@@ -162,6 +163,9 @@
- "{,ee/}spec/support/helpers/database/**/*"
- "config/prometheus/common_metrics.yml" # Used by Gitlab::DatabaseImporters::CommonMetrics::Importer
- "{,ee/}app/models/project_statistics.rb" # Used to calculate sizes in migration specs
+ # CI changes
+ - ".gitlab-ci.yml"
+ - ".gitlab/ci/**/*"
.db-library-patterns: &db-library-patterns
- "{,ee/}{,spec/}lib/{,ee/}gitlab/database/**/*"
@@ -183,9 +187,11 @@
- ".csscomb.json"
- "Dockerfile.assets"
- "vendor/assets/**/*"
+ # CI changes
+ - ".gitlab-ci.yml"
- ".gitlab/ci/**/*"
- ".{eslintignore,gitattributes,nvmrc,prettierrc,stylelintrc,yamllint}"
- - ".{codeclimate,eslintrc,gitlab-ci,haml-lint,haml-lint_todo,rubocop,rubocop_todo,rubocop_manual_todo,scss-lint}.yml"
+ - ".{codeclimate,eslintrc,gitlab-ci,haml-lint,haml-lint_todo,rubocop,rubocop_todo,rubocop_manual_todo}.yml"
- "*_VERSION"
- "Gemfile{,.lock}"
- "Rakefile"
@@ -193,6 +199,7 @@
- "config.ru"
- "{,ee/}{app,bin,config,db,haml_lint,lib,locale,public,scripts,symbol,vendor}/**/*"
- "doc/api/graphql/reference/*" # Files in this folder are auto-generated
+ - "data/whats_new/*.yml"
.qa-patterns: &qa-patterns
- ".dockerignore"
@@ -205,9 +212,11 @@
- ".csscomb.json"
- "Dockerfile.assets"
- "vendor/assets/**/*"
+ # CI changes
+ - ".gitlab-ci.yml"
- ".gitlab/ci/**/*"
- ".{eslintignore,gitattributes,nvmrc,prettierrc,stylelintrc,yamllint}"
- - ".{codeclimate,eslintrc,gitlab-ci,haml-lint,haml-lint_todo,rubocop,rubocop_todo,rubocop_manual_todo,scss-lint}.yml"
+ - ".{codeclimate,eslintrc,gitlab-ci,haml-lint,haml-lint_todo,rubocop,rubocop_todo,rubocop_manual_todo}.yml"
- "*_VERSION"
- "Gemfile{,.lock}"
- "Rakefile"
@@ -215,6 +224,7 @@
- "config.ru"
- "{,ee/}{app,bin,config,db,haml_lint,lib,locale,public,scripts,symbol,vendor}/**/*"
- "doc/api/graphql/reference/*" # Files in this folder are auto-generated
+ - "data/whats_new/*.yml"
# Backstage changes
- "Dangerfile"
- "danger/**/*"
@@ -230,9 +240,11 @@
- ".csscomb.json"
- "Dockerfile.assets"
- "vendor/assets/**/*"
+ # CI changes
+ - ".gitlab-ci.yml"
- ".gitlab/ci/**/*"
- ".{eslintignore,gitattributes,nvmrc,prettierrc,stylelintrc,yamllint}"
- - ".{codeclimate,eslintrc,gitlab-ci,haml-lint,haml-lint_todo,rubocop,rubocop_todo,rubocop_manual_todo,scss-lint}.yml"
+ - ".{codeclimate,eslintrc,gitlab-ci,haml-lint,haml-lint_todo,rubocop,rubocop_todo,rubocop_manual_todo}.yml"
- "*_VERSION"
- "Gemfile{,.lock}"
- "Rakefile"
@@ -240,6 +252,7 @@
- "config.ru"
- "{,ee/}{app,bin,config,db,haml_lint,lib,locale,public,scripts,symbol,vendor}/**/*"
- "doc/api/graphql/reference/*" # Files in this folder are auto-generated
+ - "data/whats_new/*.yml"
# QA changes
- ".dockerignore"
- "qa/**/*"
@@ -251,9 +264,11 @@
- ".csscomb.json"
- "Dockerfile.assets"
- "vendor/assets/**/*"
+ # CI changes
+ - ".gitlab-ci.yml"
- ".gitlab/ci/**/*"
- ".{eslintignore,gitattributes,nvmrc,prettierrc,stylelintrc,yamllint}"
- - ".{codeclimate,eslintrc,gitlab-ci,haml-lint,haml-lint_todo,rubocop,rubocop_todo,rubocop_manual_todo,scss-lint}.yml"
+ - ".{codeclimate,eslintrc,gitlab-ci,haml-lint,haml-lint_todo,rubocop,rubocop_todo,rubocop_manual_todo}.yml"
- "*_VERSION"
- "Gemfile{,.lock}"
- "Rakefile"
@@ -261,6 +276,7 @@
- "config.ru"
- "{,ee/}{app,bin,config,db,haml_lint,lib,locale,public,scripts,symbol,vendor}/**/*"
- "doc/api/graphql/reference/*" # Files in this folder are auto-generated
+ - "data/whats_new/*.yml"
# Backstage changes
- "Dangerfile"
- "danger/**/*"
@@ -405,6 +421,7 @@
- <<: *if-security-merge-request
changes: *code-backstage-patterns
- <<: *if-merge-request-title-as-if-foss
+ - <<: *if-merge-request-title-run-all-rspec
- <<: *if-merge-request
changes: *ci-patterns
@@ -445,7 +462,9 @@
.frontend:rules:bundle-size-review:
rules:
- - if: '$DANGER_GITLAB_API_TOKEN && $CI_MERGE_REQUEST_IID && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master"'
+ - <<: *if-not-canonical-namespace
+ when: never
+ - if: '$DANGER_GITLAB_API_TOKEN && $CI_MERGE_REQUEST_IID && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main")'
changes: *frontend-patterns
allow_failure: true
@@ -483,6 +502,7 @@
- <<: *if-security-merge-request
changes: *code-qa-patterns
- <<: *if-merge-request-title-as-if-foss
+ - <<: *if-merge-request-title-run-all-rspec
- <<: *if-merge-request
changes: *ci-patterns
@@ -602,10 +622,9 @@
- <<: *if-merge-request
changes: ["config/**/*"]
-.rails:rules:default-refs-code-backstage-qa:
+.rails:rules:code-backstage-qa:
rules:
- - <<: *if-default-refs
- changes: *code-backstage-qa-patterns
+ - changes: *code-backstage-qa-patterns
- <<: *if-merge-request-title-run-all-rspec
.rails:rules:ee-only-migration:
@@ -700,6 +719,7 @@
changes: *db-patterns
- <<: *if-merge-request-title-as-if-foss
changes: *db-patterns
+ - <<: *if-merge-request-title-run-all-rspec
- <<: *if-merge-request
changes: *ci-patterns
@@ -716,6 +736,7 @@
changes: *db-patterns
- <<: *if-merge-request-title-as-if-foss
changes: *db-patterns
+ - <<: *if-merge-request-title-run-all-rspec
.rails:rules:as-if-foss-unit:
rules:
@@ -725,6 +746,7 @@
changes: *backend-patterns
- <<: *if-merge-request-title-as-if-foss
changes: *backend-patterns
+ - <<: *if-merge-request-title-run-all-rspec
- <<: *if-merge-request
changes: *ci-patterns
@@ -741,6 +763,7 @@
changes: *backend-patterns
- <<: *if-merge-request-title-as-if-foss
changes: *backend-patterns
+ - <<: *if-merge-request-title-run-all-rspec
.rails:rules:as-if-foss-integration:
rules:
@@ -750,6 +773,7 @@
changes: *backend-patterns
- <<: *if-merge-request-title-as-if-foss
changes: *backend-patterns
+ - <<: *if-merge-request-title-run-all-rspec
- <<: *if-merge-request
changes: *ci-patterns
@@ -766,6 +790,7 @@
changes: *backend-patterns
- <<: *if-merge-request-title-as-if-foss
changes: *backend-patterns
+ - <<: *if-merge-request-title-run-all-rspec
.rails:rules:as-if-foss-system:
rules:
@@ -775,6 +800,7 @@
changes: *code-backstage-patterns
- <<: *if-merge-request-title-as-if-foss
changes: *code-backstage-patterns
+ - <<: *if-merge-request-title-run-all-rspec
- <<: *if-merge-request
changes: *ci-patterns
@@ -791,6 +817,7 @@
changes: *code-backstage-patterns
- <<: *if-merge-request-title-as-if-foss
changes: *code-backstage-patterns
+ - <<: *if-merge-request-title-run-all-rspec
.rails:rules:ee-and-foss-db-library-code:
rules:
@@ -809,8 +836,7 @@
.rails:rules:detect-tests:
rules:
- - <<: *if-default-refs
- changes: *code-backstage-patterns
+ - changes: *code-backstage-patterns
- <<: *if-merge-request-title-run-all-rspec
.rails:rules:rspec-foss-impact:
@@ -1123,8 +1149,7 @@
#######################
.test-metadata:rules:retrieve-tests-metadata:
rules:
- - <<: *if-default-refs
- changes: *code-backstage-patterns
+ - changes: *code-backstage-patterns
when: on_success
- <<: *if-merge-request-title-run-all-rspec
@@ -1136,7 +1161,6 @@
- ".gitlab/ci/test-metadata.gitlab-ci.yml"
- "scripts/rspec_helpers.sh"
- <<: *if-dot-com-ee-schedule
- changes: *code-backstage-patterns
###################
# workhorse rules #
diff --git a/.gitlab/ci/verify-lockfile.gitlab-ci.yml b/.gitlab/ci/verify-lockfile.gitlab-ci.yml
deleted file mode 100644
index 6336a428b4b..00000000000
--- a/.gitlab/ci/verify-lockfile.gitlab-ci.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-verify_lockfile:
- stage: test
- image: registry.gitlab.com/gitlab-org/gitlab-build-images:ruby-2.7.2-git-2.29-lfs-2.9-node-14.15-yarn-1.22-graphicsmagick-1.3.34
- needs: []
- rules:
- - changes:
- - yarn.lock
- script:
- - npm config set @dappelt:registry https://gitlab.com/api/v4/projects/22564149/packages/npm/
- - npx lockfile-lint@4.3.7 --path yarn.lock --allowed-hosts yarn --validate-https
- - npx @dappelt/untamper-my-lockfile --lockfile yarn.lock
diff --git a/.gitlab/ci/workhorse.gitlab-ci.yml b/.gitlab/ci/workhorse.gitlab-ci.yml
index a40eebd131b..8361d20d2b7 100644
--- a/.gitlab/ci/workhorse.gitlab-ci.yml
+++ b/.gitlab/ci/workhorse.gitlab-ci.yml
@@ -1,20 +1,10 @@
-workhorse:
- extends: .workhorse:rules:workhorse
- image: ${GITLAB_DEPENDENCY_PROXY}golang:1.14
- stage: test
- needs: []
- script:
- - rm .git/hooks/post-checkout
- - git checkout .
- - scripts/update-workhorse check
- - make -C workhorse
-
workhorse:verify:
extends: .workhorse:rules:workhorse
image: ${GITLAB_DEPENDENCY_PROXY}golang:1.15
stage: test
needs: []
script:
+ - make -C workhorse # test build
- make -C workhorse verify
.workhorse:test:
diff --git a/.gitlab/issue_templates/Adoption Engineering.md b/.gitlab/issue_templates/Adoption Engineering.md
deleted file mode 100644
index 01e9d0ea033..00000000000
--- a/.gitlab/issue_templates/Adoption Engineering.md
+++ /dev/null
@@ -1,14 +0,0 @@
-#Design
-<!-- This should include the contexts that determine the reproducibility (stickiness) of an experiment. This means that if you want the same behavior for a user, the context would be user, or if you want all users when viewing a specific project, the context would be the project being viewed, etc. -->
-
-
-#Rollout strategy
-<!-- This is currently called A/B test, which isn't accurate for multi-variants. Let's call this rollout strategy. It should outline the percentages for variants and if there's more than one step to this, each of those steps and the timing for those steps (e.g. 30 days after initial rollout). -->
-
-#Inclusions and exclusions
-<!-- These would be the rules for which given context (and are limited to context or resolvable at experiment time details) is included or excluded from the test. An example of this would be to only run an experiment on groups less than N number of days old. -->
-
-#Segmentation
-<!-- Rules for always saying context with these criteria always get this variant. For instance, if you want to always give groups less than N number of days old the experiment experience, they are specified here. This is different from the exclusion rules above. -->
-
-#Tracking
diff --git a/.gitlab/issue_templates/Experiment Successful Cleanup.md b/.gitlab/issue_templates/Experiment Successful Cleanup.md
index 3f148ec00b1..afe4793cdfc 100644
--- a/.gitlab/issue_templates/Experiment Successful Cleanup.md
+++ b/.gitlab/issue_templates/Experiment Successful Cleanup.md
@@ -10,9 +10,10 @@ The changes need to become an official part of the product.
- [ ] Determine whether the feature should apply to SaaS and/or self-managed
- [ ] Determine whether the feature should apply to EE - and which tiers - and/or Core
- [ ] Determine if tracking should be kept as is, removed, or modified.
-- [ ] Migrate experiment to a default enabled [feature flag](https://docs.gitlab.com/ee/development/feature_flags/development.html) for one milestone and add a changelog. Converting to a feature flag can be skipped at the ICs discretion if risk is deemed low with consideration to both SaaS and (if applicable) self managed.
- [ ] Ensure any relevant documentation has been updated.
-- [ ] In the next milestone, [remove the feature flag](https://docs.gitlab.com/ee/development/feature_flags/controls.html#cleaning-up).
+- [ ] Consider changes to any `feature_category:` introduced by the experiment if ownership is changing (PM for Growth and PM for the new category as DRIs)
+- [ ] Optional: Migrate experiment to a default enabled [feature flag](https://docs.gitlab.com/ee/development/feature_flags) for one milestone and add a changelog. Converting to a feature flag can be skipped at the ICs discretion if risk is deemed low with consideration to both SaaS and (if applicable) self managed
+- [ ] In the next milestone, [remove the feature flag](https://docs.gitlab.com/ee/development/feature_flags/controls.html#cleaning-up) if applicable
- [ ] After the flag removal is deployed, [clean up the feature/experiment feature flags](https://docs.gitlab.com/ee/development/feature_flags/controls.html#cleaning-up) by running chatops command in `#production` channel
/label ~"feature" ~"feature::maintenance" ~"workflow::scheduling" ~"growth experiment" ~"feature flag"
diff --git a/.gitlab/issue_templates/Experimentation.md b/.gitlab/issue_templates/Experimentation.md
new file mode 100644
index 00000000000..f84c4305c2c
--- /dev/null
+++ b/.gitlab/issue_templates/Experimentation.md
@@ -0,0 +1,25 @@
+<!-- Title suggestion: Experiment: [description] -->
+
+# Experiment Summary
+<!-- Quick rundown of what is being done -->
+
+# Design
+<!-- This should include the contexts that determine the reproducibility (stickiness) of an experiment. This means that if you want the same behavior for a user, the context would be user, or if you want all users when viewing a specific project, the context would be the project being viewed, etc. -->
+
+# Rollout strategy
+<!-- This is currently called A/B test, which isn't accurate for multi-variants. Let's call this rollout strategy. It should outline the percentages for variants and if there's more than one step to this, each of those steps and the timing for those steps (e.g. 30 days after initial rollout). -->
+
+# Inclusions and exclusions
+<!-- These would be the rules for which given context (and are limited to context or resolvable at experiment time details) is included or excluded from the test. An example of this would be to only run an experiment on groups less than N number of days old. -->
+
+# Segmentation
+<!-- Rules for always saying context with these criteria always get this variant. For instance, if you want to always give groups less than N number of days old the experiment experience, they are specified here. This is different from the exclusion rules above. -->
+
+# Tracking Details
+
+- [json schema](https://gitlab.com/gitlab-org/iglu/-/blob/master/public/schemas/com.gitlab/gitlab_experiment/jsonschema/0-3-0) used in `gitlab-experiment` tracking.
+- see [taxonomy](https://docs.gitlab.com/ee/development/snowplow.html#structured-event-taxonomy) for a guide.
+
+| activity | category | action | label | context | property | value |
+| -------- | -------- | ------ | ----- | ------- | -------- | ----- |
+| | | | | json schema | | |
diff --git a/.gitlab/issue_templates/Query Performance Investigation.md b/.gitlab/issue_templates/Query Performance Investigation.md
index 3f2a6361d64..ddd361e4f2f 100644
--- a/.gitlab/issue_templates/Query Performance Investigation.md
+++ b/.gitlab/issue_templates/Query Performance Investigation.md
@@ -1,6 +1,6 @@
## Description
-As the name implies, the purpose of the template is to detail underperforming queries for futher investigation.
+As the name implies, the purpose of the template is to detail underperforming queries for further investigation.
### Steps
@@ -14,8 +14,10 @@ As the name implies, the purpose of the template is to detail underperforming qu
Please provide as many of these fields as possible when submitting a query performance report.
-- TPS
-- Duration
+- Queries per second (on average or peak)
+- Number of calls per second and relative to total number of calls
+- Query timings (on average or peak)
+- Database time relative to total database time
- Source of calls (Sidekiq, WebAPI, etc)
- Query ID
- SQL Statement
diff --git a/.gitlab/issue_templates/experiment_tracking_template.md b/.gitlab/issue_templates/experiment_tracking_template.md
new file mode 100644
index 00000000000..432ae57e594
--- /dev/null
+++ b/.gitlab/issue_templates/experiment_tracking_template.md
@@ -0,0 +1,94 @@
+<!-- Title suggestion: [Experiment Tracking] experiment-key - description of experiment -->
+
+## What
+
+Track the status of an experiment through to removal.
+
+1. Experiment key: `<experiment-key>`
+1. Framework: `experimentation.rb` | `gitlab_experiment`
+1. Feature flag name: <experiment-key>_experiment_percentage` | `<experiment-key>`
+
+This is an experiment tracking issue for: `<issue or epic link>`
+using the scoped [experiment label](https://about.gitlab.com/handbook/engineering/development/growth/#experiment-tracking-issue).
+
+As well as defining the experiment rollout and cleanup, this issue incorporates the relevant
+[`Feature Flag Roll Out`](https://gitlab.com/gitlab-org/gitlab/-/edit/master/.gitlab/issue_templates/Feature%20Flag%20Roll%20Out.md) steps.
+
+## Owners
+
+- Team: `group::TEAM_NAME`
+- Most appropriate slack channel to reach out to: `#g_TEAM_NAME`
+- Best individual to reach out to: NAME
+
+## Expectations
+
+### What are we expecting to happen?
+
+### What might happen if this goes wrong?
+
+### What can we monitor to detect problems with this?
+<!-- Which dashboards from https://dashboards.gitlab.net are most relevant? Sentry errors reports can alse be useful to review -->
+
+### Tracked data
+<!-- brief description or link to issue or Sisense dashboard -->
+
+ Note: you can utilize [CXL calculator](https://cxl.com/ab-test-calculator/) to determine if your experiment has reached signifigance, it also includes an estimate for how much longer an experiment will need to run for before reaching signifigance.
+
+### Staging Test
+<!-- For experiments using `experimentation.rb`: To force this experiment on staging use `?force_experiment=<experiment-key>` -->
+<!-- list any steps required to setup this experiment, and link to a separate Staging environment test issue is applicable -->
+
+<!-- uncomment if testing with specific groups/projects on GitLab.com
+## Beta groups/projects
+
+If applicable, any groups/projects that are happy to have this feature turned on early. Some organizations may wish to test big changes they are interested in with a small subset of users ahead of time for example.
+
+- `gitlab-org/gitlab` project
+- `gitlab-org`/`gitlab-com` groups
+- ...
+-->
+
+### Experiment tracking log
+<!-- Add an overview and method for modifying the feature flag
+
+* Runtime: 30 days or until we reach statistical significance
+* We will roll this out behind a feature flag and expose this to 20% of users to start then ramp it up from there.
+* feature flag based on experiment key `<experiment-key>` (see `experimentation.rb` in GitLab, append '_experiment_percentage')
+
+`/chatops run feature set <experiment-key>_experiment_percentage <INITIAL_PERCENTAGE>`
+-->
+<!-- Add bullet points to track changes to the rollout of this experiment (feature flag changes)
+
+* YYYY-MM-DD UTC - initial rollout to 20% of users
+* TBD - review - increase to 50% of users
+-->
+
+### Experiment Results
+<!-- update when experiment in/validated, set the scoped `~experiment::` status accordingly -->
+
+## Roll Out Steps
+
+- [ ] Confirm that QA tests pass with the feature flag enabled (if you're unsure how, contact the relevant [stable counterpart in the Quality department](https://about.gitlab.com/handbook/engineering/quality/#individual-contributors))
+- [ ] Enable on staging (`/chatops run feature set feature_name true --staging`)
+- [ ] Test on staging
+- [ ] Ensure that documentation has been updated
+- [ ] Enable on GitLab.com for individual groups/projects listed above and verify behaviour (`/chatops run feature set --project=gitlab-org/gitlab feature_name true`)
+- [ ] Coordinate a time to enable the flag with the SRE oncall and release managers
+ - In `#production` mention `@sre-oncall` and `@release-managers`. Once an SRE on call and Release Manager on call confirm, you can proceed with the rollout
+- [ ] Announce on the issue an estimated time this will be enabled on GitLab.com
+- [ ] Enable on GitLab.com by running chatops command in `#production` (`/chatops run feature set feature_name true`)
+- [ ] Cross post chatops Slack command to `#support_gitlab-com` ([more guidance when this is necessary in the dev docs](https://docs.gitlab.com/ee/development/feature_flags/controls.html#where-to-run-commands)) and in your team channel
+- [ ] Announce on the issue that the flag has been enabled
+- [ ] Remove experiment code and feature flag and add changelog entry - a separate [cleanup issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new?issuable_template=Experiment%20Successful%20Cleanup) might be required
+- [ ] After the flag removal is deployed, [clean up the feature flag](https://docs.gitlab.com/ee/development/feature_flags/controls.html#cleaning-up) by running chatops command in `#production` channel
+
+## Rollback Steps
+
+- [ ] This feature can be disabled by running the following Chatops command:
+
+```
+/chatops run feature set feature_name false
+```
+
+/label ~"feature flag" ~"devops::growth" ~"growth experiment" ~"experiment tracking" ~Engineering ~"workflow::scheduling" ~"experiment::pending"
+
diff --git a/.haml-lint_todo.yml b/.haml-lint_todo.yml
index 5b92863b91e..555f2645d6b 100644
--- a/.haml-lint_todo.yml
+++ b/.haml-lint_todo.yml
@@ -213,12 +213,6 @@ linters:
- 'app/views/projects/mattermosts/new.html.haml'
- 'app/views/projects/merge_requests/_commits.html.haml'
- 'app/views/projects/merge_requests/_mr_title.html.haml'
- - 'app/views/projects/merge_requests/conflicts/_commit_stats.html.haml'
- - 'app/views/projects/merge_requests/conflicts/_file_actions.html.haml'
- - 'app/views/projects/merge_requests/conflicts/_submit_form.html.haml'
- - 'app/views/projects/merge_requests/conflicts/components/_diff_file_editor.html.haml'
- - 'app/views/projects/merge_requests/conflicts/components/_inline_conflict_lines.html.haml'
- - 'app/views/projects/merge_requests/conflicts/show.html.haml'
- 'app/views/projects/merge_requests/creations/_diffs.html.haml'
- 'app/views/projects/merge_requests/creations/_new_compare.html.haml'
- 'app/views/projects/merge_requests/creations/_new_submit.html.haml'
@@ -297,8 +291,6 @@ linters:
- 'app/views/shared/milestones/_sidebar.html.haml'
- 'app/views/shared/milestones/_top.html.haml'
- 'app/views/shared/notes/_hints.html.haml'
- - 'app/views/shared/notifications/_button.html.haml'
- - 'app/views/shared/notifications/_new_button.html.haml'
- 'app/views/shared/runners/_runner_description.html.haml'
- 'app/views/shared/runners/show.html.haml'
- 'app/views/shared/snippets/_header.html.haml'
diff --git a/.prettierignore b/.prettierignore
index ff8188bbda4..ea7e6268b93 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -1,9 +1,9 @@
/app/assets/javascripts/locale/**/app.js
+/fixtures/lib/gitlab/graphql/
/node_modules/
/public/
/vendor/
/tmp/
-doc/api/graphql/reference/gitlab_schema.graphql
# ignore stylesheets for now as this clashes with our linter
*.css
diff --git a/.rubocop.yml b/.rubocop.yml
index 7a4b53b5aa5..8f5407c64c5 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -7,8 +7,10 @@ require:
- rubocop-rspec
inherit_from:
- - .rubocop_manual_todo.yml
- - .rubocop_todo.yml
+ <% unless ENV['REVEAL_RUBOCOP_TODO'] == '1' %>
+ - '.rubocop_manual_todo.yml'
+ - '.rubocop_todo.yml'
+ <% end %>
- ./rubocop/rubocop-migrations.yml
- ./rubocop/rubocop-usage-data.yml
- ./rubocop/rubocop-code_reuse.yml
@@ -16,6 +18,7 @@ inherit_from:
inherit_mode:
merge:
- Include
+ - Exclude
AllCops:
TargetRubyVersion: 2.7
@@ -87,6 +90,17 @@ RSpec/FilePath:
- 'ee/spec/frontend/fixtures/*'
- 'spec/requests/api/v3/*'
+# Configuration parameters: AllowSubject.
+RSpec/MultipleMemoizedHelpers:
+ Max: 28
+ AllowSubject: true
+ Exclude:
+ - 'spec/migrations/**/*.rb'
+ - 'spec/lib/gitlab/background_migration/populate_project_snippet_statistics_spec.rb'
+ - 'spec/lib/gitlab/background_migration/populate_finding_uuid_for_vulnerability_feedback_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/populate_uuids_for_security_findings_spec.rb'
+ - 'ee/spec/lib/gitlab/background_migration/user_mentions/create_resource_user_mention_spec.rb'
+
Naming/FileName:
ExpectMatchingDefinition: true
Exclude:
@@ -240,7 +254,7 @@ Gitlab/Json:
- 'db/**/*'
- 'qa/**/*'
- 'scripts/**/*'
- - 'lib/rspec_flaky/**/*'
+ - 'tooling/rspec_flaky/**/*'
- 'lib/quality/**/*'
- 'tooling/danger/**/*'
@@ -595,3 +609,23 @@ FactoryBot/InlineAssociation:
Include:
- 'spec/factories/**/*.rb'
- 'ee/spec/factories/**/*.rb'
+
+# WIP: https://gitlab.com/gitlab-org/gitlab/-/issues/321982
+Gitlab/NamespacedClass:
+ Exclude:
+ - 'config/**/*.rb'
+ - 'db/**/*.rb'
+ - 'ee/bin/**/*'
+ - 'ee/db/**/*.rb'
+ - 'ee/elastic/**/*.rb'
+ - 'scripts/**/*'
+ - 'spec/migrations/**/*.rb'
+
+Lint/HashCompareByIdentity:
+ Enabled: true
+
+Lint/RedundantSafeNavigation:
+ Enabled: true
+
+Style/ClassEqualityComparison:
+ Enabled: true
diff --git a/.rubocop_manual_todo.yml b/.rubocop_manual_todo.yml
index 477d9adec40..4572078e721 100644
--- a/.rubocop_manual_todo.yml
+++ b/.rubocop_manual_todo.yml
@@ -10,10 +10,40 @@
# - guidelines for use found in
# https://docs.gitlab.com/ee/development/contributing/style_guides.html#resolving-rubocop-exceptions.
+# WIP See https://gitlab.com/gitlab-org/gitlab/-/issues/322903
+Graphql/Descriptions:
+ Exclude:
+ - 'app/graphql/types/access_level_enum.rb'
+ - 'app/graphql/types/base_enum.rb'
+ - 'app/graphql/types/ci/pipeline_config_source_enum.rb'
+ - 'app/graphql/types/ci/pipeline_status_enum.rb'
+ - 'app/graphql/types/container_expiration_policy_cadence_enum.rb'
+ - 'app/graphql/types/container_expiration_policy_keep_enum.rb'
+ - 'app/graphql/types/container_expiration_policy_older_than_enum.rb'
+ - 'app/graphql/types/notes/position_type_enum.rb'
+ - 'app/graphql/types/packages/package_type_enum.rb'
+ - 'app/graphql/types/snippets/blob_action_enum.rb'
+ - 'app/graphql/types/snippets/type_enum.rb'
+ - 'app/graphql/types/snippets/visibility_scopes_enum.rb'
+ - 'app/graphql/types/todo_action_enum.rb'
+ - 'app/graphql/types/tree/type_enum.rb'
+ - 'ee/app/graphql/ee/types/list_limit_metric_enum.rb'
+ - 'ee/app/graphql/types/alert_management/payload_alert_field_name_enum.rb'
+ - 'ee/app/graphql/types/epic_state_enum.rb'
+ - 'ee/app/graphql/types/health_status_enum.rb'
+ - 'ee/app/graphql/types/iteration_state_enum.rb'
+ - 'ee/app/graphql/types/requirements_management/requirement_state_enum.rb'
+ - 'ee/app/graphql/types/requirements_management/test_report_state_enum.rb'
+ - 'ee/app/graphql/types/security_scanner_type_enum.rb'
+ - 'ee/app/graphql/types/vulnerability/issue_link_type_enum.rb'
+ - 'ee/app/graphql/types/vulnerability_grade_enum.rb'
+ - 'ee/app/graphql/types/vulnerability_report_type_enum.rb'
+ - 'ee/app/graphql/types/vulnerability_severity_enum.rb'
+ - 'ee/app/graphql/types/vulnerability_state_enum.rb'
+
+# WIP See https://gitlab.com/gitlab-org/gitlab/-/issues/267606
FactoryBot/InlineAssociation:
Exclude:
- - 'ee/spec/factories/analytics/cycle_analytics/group_stages.rb'
- - 'ee/spec/factories/geo/event_log.rb'
- 'ee/spec/factories/merge_request_blocks.rb'
- 'ee/spec/factories/vulnerabilities/feedback.rb'
- 'spec/factories/atlassian_identities.rb'
@@ -25,42 +55,8 @@ FactoryBot/InlineAssociation:
- 'spec/factories/go_modules.rb'
- 'spec/factories/group_group_links.rb'
- 'spec/factories/import_export_uploads.rb'
- - 'spec/factories/uploads.rb'
- - 'spec/factories/wiki_pages.rb'
-
-InternalAffairs/DeprecateCopHelper: # issue to resolve: https://gitlab.com/gitlab-org/gitlab/-/issues/276734
- Exclude:
- - 'spec/rubocop/cop/migration/safer_boolean_column_spec.rb'
- - 'spec/rubocop/cop/migration/remove_index_spec.rb'
- - 'spec/rubocop/cop/migration/add_index_spec.rb'
- - 'spec/rubocop/cop/migration/drop_table_spec.rb'
- - 'spec/rubocop/cop/migration/hash_index_spec.rb'
- - 'spec/rubocop/cop/migration/datetime_spec.rb'
- - 'spec/rubocop/cop/migration/add_column_with_default_spec.rb'
- - 'spec/rubocop/cop/migration/prevent_strings_spec.rb'
- - 'spec/rubocop/cop/migration/add_timestamps_spec.rb'
- - 'spec/rubocop/cop/migration/add_concurrent_index_spec.rb'
- - 'spec/rubocop/cop/migration/update_column_in_batches_spec.rb'
- - 'spec/rubocop/cop/migration/complex_indexes_require_name_spec.rb'
- - 'spec/rubocop/cop/migration/refer_to_index_by_name_spec.rb'
- - 'spec/rubocop/cop/migration/schedule_async_spec.rb'
- - 'spec/rubocop/cop/migration/timestamps_spec.rb'
- - 'spec/rubocop/cop/migration/remove_concurrent_index_spec.rb'
- - 'spec/rubocop/cop/migration/add_columns_to_wide_tables_spec.rb'
- - 'spec/rubocop/cop/migration/with_lock_retries_disallowed_method_spec.rb'
- - 'spec/rubocop/cop/migration/add_reference_spec.rb'
- - 'spec/rubocop/cop/migration/remove_column_spec.rb'
- - 'spec/rubocop/cop/migration/create_table_with_foreign_keys_spec.rb'
- - 'spec/rubocop/cop/migration/add_concurrent_foreign_key_spec.rb'
- - 'spec/rubocop/cop/migration/with_lock_retries_with_change_spec.rb'
- - 'spec/rubocop/cop/migration/add_limit_to_text_columns_spec.rb'
- - 'spec/rubocop/cop/avoid_return_from_blocks_spec.rb'
- - 'spec/rubocop/cop/avoid_route_redirect_leading_slash_spec.rb'
- - 'spec/rubocop/cop/put_group_routes_under_scope_spec.rb'
- - 'spec/rubocop/cop/sidekiq_options_queue_spec.rb'
- - 'spec/rubocop/cop/ignored_columns_spec.rb'
- - 'spec/rubocop/cop/prefer_class_methods_over_module_spec.rb'
+# WIP: See https://gitlab.com/gitlab-org/gitlab/-/issues/220040
Rails/SaveBang:
Exclude:
- 'ee/spec/controllers/projects/merge_requests_controller_spec.rb'
@@ -516,8 +512,8 @@ Rails/TimeZone:
- 'lib/json_web_token/token.rb'
- 'lib/object_storage/direct_upload.rb'
- 'lib/quality/seeders/issues.rb'
- - 'lib/rspec_flaky/flaky_example.rb'
- - 'lib/rspec_flaky/report.rb'
+ - 'tooling/rspec_flaky/flaky_example.rb'
+ - 'tooling/rspec_flaky/report.rb'
- 'lib/tasks/gitlab/assets.rake'
- 'lib/tasks/gitlab/backup.rake'
- 'lib/tasks/gitlab/cleanup.rake'
@@ -583,9 +579,9 @@ Rails/TimeZone:
- 'spec/lib/gitlab/x509/signature_spec.rb'
- 'spec/lib/grafana/time_window_spec.rb'
- 'spec/lib/json_web_token/hmac_token_spec.rb'
- - 'spec/lib/rspec_flaky/flaky_example_spec.rb'
- - 'spec/lib/rspec_flaky/listener_spec.rb'
- - 'spec/lib/rspec_flaky/report_spec.rb'
+ - 'spec/tooling/rspec_flaky/flaky_example_spec.rb'
+ - 'spec/tooling/rspec_flaky/listener_spec.rb'
+ - 'spec/tooling/rspec_flaky/report_spec.rb'
RSpec/TimecopFreeze:
Exclude:
@@ -658,8 +654,8 @@ RSpec/TimecopFreeze:
- 'spec/lib/gitlab/puma_logging/json_formatter_spec.rb'
- 'spec/lib/gitlab/sidekiq_logging/structured_logger_spec.rb'
- 'spec/lib/json_web_token/hmac_token_spec.rb'
- - 'spec/lib/rspec_flaky/flaky_example_spec.rb'
- - 'spec/lib/rspec_flaky/listener_spec.rb'
+ - 'spec/tooling/rspec_flaky/flaky_example_spec.rb'
+ - 'spec/tooling/rspec_flaky/listener_spec.rb'
- 'spec/models/active_session_spec.rb'
- 'spec/serializers/entity_date_helper_spec.rb'
- 'spec/support/cycle_analytics_helpers/test_generation.rb'
@@ -812,7 +808,7 @@ RSpec/AnyInstanceOf:
- 'ee/spec/services/slash_commands/global_slack_handler_spec.rb'
- 'ee/spec/support/helpers/ee/stub_configuration.rb'
- 'ee/spec/support/shared_examples/controllers/analytics/cycle_analytics/shared_stage_shared_examples.rb'
- - 'ee/spec/support/shared_examples/features/gold_trial_callout_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/features/ultimate_trial_callout_shared_examples.rb'
- 'ee/spec/support/shared_examples/lib/gitlab/geo/geo_logs_event_source_info_shared_examples.rb'
- 'ee/spec/support/shared_examples/models/member_shared_examples.rb'
- 'ee/spec/support/shared_examples/services/base_sync_service_shared_examples.rb'
@@ -1207,22 +1203,9 @@ RSpec/AnyInstanceOf:
- 'spec/workers/wait_for_cluster_creation_worker_spec.rb'
- 'ee/spec/workers/security/auto_fix_worker_spec.rb'
+# WIP: https://gitlab.com/gitlab-org/gitlab/-/issues/321982
Gitlab/NamespacedClass:
Exclude:
- - 'config/**/*.rb'
- - 'db/**/*.rb'
- - 'ee/bin/**/*'
- - 'ee/db/**/*.rb'
- - 'ee/elastic/**/*.rb'
- - 'scripts/**/*'
- - 'spec/migrations/**/*.rb'
- # The list above represents the permanent exclusions for this rule
- # due to the fact these files are related to infrastructure code.
- # This list should eventually be moved to .rubocop.yml after all TODOs
- # are addressed.
- #
- # The list below represents the classes that require
- # a namespace as they make the domain related code.
- 'app/channels/issues_channel.rb'
- 'app/controllers/abuse_reports_controller.rb'
- 'app/controllers/acme_challenges_controller.rb'
@@ -2021,7 +2004,6 @@ Gitlab/NamespacedClass:
- 'app/validators/untrusted_regexp_validator.rb'
- 'app/validators/nested_attributes_duplicates_validator.rb'
- 'app/validators/x509_certificate_credentials_validator.rb'
- - 'app/validators/zoom_url_validator.rb'
- 'app/workers/admin_email_worker.rb'
- 'app/workers/approve_blocked_pending_approval_users_worker.rb'
- 'app/workers/archive_trace_worker.rb'
@@ -2296,6 +2278,7 @@ Gitlab/NamespacedClass:
- 'ee/app/policies/instance_security_dashboard_policy.rb'
- 'ee/app/policies/issuable_metric_image_policy.rb'
- 'ee/app/policies/iteration_policy.rb'
+ - 'ee/app/policies/push_rule_policy.rb'
- 'ee/app/policies/saml_provider_policy.rb'
- 'ee/app/policies/timelog_policy.rb'
- 'ee/app/policies/vulnerability_policy.rb'
@@ -2372,7 +2355,6 @@ Gitlab/NamespacedClass:
- 'ee/app/serializers/vulnerability_note_serializer.rb'
- 'ee/app/serializers/vulnerability_serializer.rb'
- 'ee/app/services/clear_namespace_shared_runners_minutes_service.rb'
- - 'ee/app/services/fetch_subscription_plans_service.rb'
- 'ee/app/services/ldap_group_reset_service.rb'
- 'ee/app/services/start_pull_mirroring_service.rb'
- 'ee/app/services/timebox_report_service.rb'
@@ -2473,3 +2455,60 @@ Gitlab/NamespacedClass:
- 'spec/support/sidekiq_middleware.rb'
- 'spec/tasks/gitlab/task_helpers_spec.rb'
- 'spec/uploaders/object_storage_spec.rb'
+
+# WIP: https://gitlab.com/gitlab-org/gitlab/-/issues/322739
+Style/HashTransformation:
+ Exclude:
+ - 'app/controllers/projects/branches_controller.rb'
+ - 'app/finders/ci/commit_statuses_finder.rb'
+ - 'app/helpers/learn_gitlab_helper.rb'
+ - 'app/models/ci/build_trace_chunk.rb'
+ - 'app/models/concerns/cache_markdown_field.rb'
+ - 'app/models/gpg_key.rb'
+ - 'app/presenters/packages/npm/package_presenter.rb'
+ - 'app/services/ci/pipeline_processing/atomic_processing_service/status_collection.rb'
+ - 'app/services/ci/retry_build_service.rb'
+ - 'app/services/packages/nuget/create_dependency_service.rb'
+ - 'ee/app/models/ee/ci/build.rb'
+ - 'ee/app/models/productivity_analytics.rb'
+ - 'ee/app/models/sca/license_compliance.rb'
+ - 'ee/app/services/security/store_report_service.rb'
+ - 'ee/lib/ee/gitlab/auth/ldap/sync/group.rb'
+ - 'ee/lib/ee/gitlab/usage_data.rb'
+ - 'ee/lib/gitlab/custom_file_templates.rb'
+ - 'ee/spec/elastic_integration/global_search_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/application_context_spec.rb'
+ - 'lib/api/helpers/packages/conan/api_helpers.rb'
+ - 'lib/api/projects.rb'
+ - 'lib/atlassian/jira_connect/client.rb'
+ - 'lib/banzai/filter/repository_link_filter.rb'
+ - 'lib/gitlab/ci/config/entry/product/variables.rb'
+ - 'lib/gitlab/ci/config/entry/variables.rb'
+ - 'lib/gitlab/ci/variables/collection.rb'
+ - 'lib/gitlab/ci/variables/helpers.rb'
+ - 'lib/gitlab/git/commit.rb'
+ - 'lib/gitlab/import_sources.rb'
+ - 'lib/gitlab/language_detection.rb'
+ - 'lib/gitlab/metrics/samplers/database_sampler.rb'
+ - 'lib/gitlab/metrics/subscribers/active_record.rb'
+ - 'lib/gitlab/phabricator_import/project_creator.rb'
+ - 'lib/gitlab/prometheus_client.rb'
+ - 'lib/gitlab/repository_hash_cache.rb'
+ - 'lib/gitlab/static_site_editor/config/file_config.rb'
+ - 'lib/gitlab/template/base_template.rb'
+ - 'lib/gitlab/usage_data_counters/base_counter.rb'
+ - 'lib/gitlab/usage_data_counters/note_counter.rb'
+ - 'spec/lib/atlassian/jira_connect/serializers/pull_request_entity_spec.rb'
+ - 'spec/lib/gitlab/ci/status/composite_spec.rb'
+ - 'spec/lib/gitlab/conflict/file_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/tree_restorer_spec.rb'
+ - 'spec/models/concerns/featurable_spec.rb'
+ - 'spec/models/event_spec.rb'
+ - 'spec/models/packages/dependency_spec.rb'
+ - 'spec/requests/api/graphql/project/alert_management/alert/assignees_spec.rb'
+ - 'spec/requests/api/graphql/project/alert_management/alert/notes_spec.rb'
+ - 'spec/requests/api/graphql/project/alert_management/alert/todos_spec.rb'
+ - 'spec/requests/api/projects_spec.rb'
+ - 'spec/support/helpers/graphql_helpers.rb'
+ - 'spec/support/import_export/project_tree_expectations.rb'
+ - 'spec/support/shared_contexts/services/projects/container_repository/delete_tags_service_shared_context.rb'
diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml
index 0189a3d6372..deb7f287f76 100644
--- a/.rubocop_todo.yml
+++ b/.rubocop_todo.yml
@@ -1,17 +1,17 @@
# This configuration was generated by
# `rubocop --auto-gen-config`
-# on 2021-01-11 15:49:32 UTC using RuboCop version 0.91.1.
+# on 2021-02-24 14:52:20 UTC using RuboCop version 0.93.1.
# The point is for the user to remove these configuration records
# one by one as the offenses are removed from the code base.
# Note that changes in the inspected code, or installation of new
# versions of RuboCop, may require this file to be generated again.
-# Offense count: 313
+# Offense count: 314
# Cop supports --auto-correct.
Capybara/CurrentPathExpectation:
Enabled: false
-# Offense count: 218
+# Offense count: 221
Capybara/VisibilityMatcher:
Enabled: false
@@ -25,7 +25,7 @@ Graphql/IDType:
Exclude:
- 'app/graphql/mutations/boards/issues/issue_move_list.rb'
-# Offense count: 2054
+# Offense count: 2270
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, IndentationWidth.
# SupportedStyles: with_first_argument, with_fixed_indentation
@@ -50,28 +50,28 @@ Layout/BeginEndAlignment:
- 'lib/gitlab/phabricator_import/project_creator.rb'
- 'scripts/gitaly_test.rb'
-# Offense count: 52
+# Offense count: 54
# Cop supports --auto-correct.
# Configuration parameters: AllowAliasSyntax, AllowedMethods.
# AllowedMethods: alias_method, public, protected, private
Layout/EmptyLinesAroundAttributeAccessor:
Enabled: false
-# Offense count: 721
+# Offense count: 771
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, IndentationWidth.
# SupportedStyles: special_inside_parentheses, consistent, align_brackets
Layout/FirstArrayElementIndentation:
Enabled: false
-# Offense count: 1592
+# Offense count: 1684
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, IndentationWidth.
# SupportedStyles: special_inside_parentheses, consistent, align_braces
Layout/FirstHashElementIndentation:
Enabled: false
-# Offense count: 3019
+# Offense count: 3233
# Cop supports --auto-correct.
# Configuration parameters: AllowMultipleStyles, EnforcedHashRocketStyle, EnforcedColonStyle, EnforcedLastArgumentHashStyle.
# SupportedHashRocketStyles: key, separator, table
@@ -80,14 +80,14 @@ Layout/FirstHashElementIndentation:
Layout/HashAlignment:
Enabled: false
-# Offense count: 73
+# Offense count: 14544
# Cop supports --auto-correct.
# Configuration parameters: AutoCorrect, AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
# URISchemes: http, https
Layout/LineLength:
Max: 1313
-# Offense count: 163
+# Offense count: 170
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, IndentationWidth.
# SupportedStyles: aligned, indented
@@ -113,22 +113,23 @@ Layout/RescueEnsureAlignment:
Layout/SpaceAroundMethodCallOperator:
Enabled: false
-# Offense count: 725
+# Offense count: 754
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: require_no_space, require_space
Layout/SpaceInLambdaLiteral:
Enabled: false
-# Offense count: 218
+# Offense count: 1209
# Cop supports --auto-correct.
-# Configuration parameters: EnforcedStyle, EnforcedStyleForEmptyBraces, SpaceBeforeBlockParameters.
+# Configuration parameters: EnforcedStyleForEmptyBraces, SpaceBeforeBlockParameters.
# SupportedStyles: space, no_space
# SupportedStylesForEmptyBraces: space, no_space
Layout/SpaceInsideBlockBraces:
Enabled: false
+ EnforcedStyle: space
-# Offense count: 559
+# Offense count: 585
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: space, no_space
@@ -141,7 +142,6 @@ Lint/BinaryOperatorWithIdenticalOperands:
- 'ee/spec/lib/ee/gitlab/application_context_spec.rb'
- 'spec/helpers/visibility_level_helper_spec.rb'
- 'spec/lib/gitlab/conan_token_spec.rb'
- - 'spec/tooling/danger/sidekiq_queues_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'
@@ -150,8 +150,9 @@ Lint/BinaryOperatorWithIdenticalOperands:
- '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: 83
+# Offense count: 84
Lint/ConstantDefinitionInBlock:
Enabled: false
@@ -174,12 +175,12 @@ Lint/IdentityComparison:
- 'spec/tooling/danger/weightage/maintainers_spec.rb'
- 'spec/tooling/danger/weightage/reviewers_spec.rb'
-# Offense count: 184
+# Offense count: 208
# Configuration parameters: MaximumRangeSize.
Lint/MissingCopEnableDirective:
Enabled: false
-# Offense count: 14
+# Offense count: 13
Lint/MixedRegexpCaptureTypes:
Exclude:
- 'app/models/alert_management/alert.rb'
@@ -188,7 +189,6 @@ Lint/MixedRegexpCaptureTypes:
- 'ee/lib/gitlab/code_owners/reference_extractor.rb'
- 'lib/gitlab/ci/pipeline/expression/lexeme/string.rb'
- 'lib/gitlab/dependency_linker/gemfile_linker.rb'
- - 'lib/gitlab/diff/inline_diff.rb'
- 'lib/gitlab/diff/suggestions_parser.rb'
- 'lib/gitlab/github_import/representation/note.rb'
- 'lib/gitlab/metrics/system.rb'
@@ -197,11 +197,26 @@ Lint/MixedRegexpCaptureTypes:
- 'lib/gitlab/slash_commands/issue_new.rb'
- 'lib/gitlab/slash_commands/run.rb'
-# Offense count: 141
+# Offense count: 200
# Cop supports --auto-correct.
Lint/RedundantCopDisableDirective:
Enabled: false
+# Offense count: 9
+# Cop supports --auto-correct.
+# Configuration parameters: AllowedMethods.
+# AllowedMethods: instance_of?, kind_of?, is_a?, eql?, respond_to?, equal?
+Lint/RedundantSafeNavigation:
+ Exclude:
+ - 'app/controllers/concerns/labels_as_hash.rb'
+ - 'app/policies/note_policy.rb'
+ - 'app/services/users/update_canonical_email_service.rb'
+ - 'ee/app/presenters/iteration_presenter.rb'
+ - 'ee/app/services/ee/members/destroy_service.rb'
+ - 'ee/lib/ee/gitlab/email/handler/reply_processing.rb'
+ - 'qa/qa/specs/helpers/quarantine.rb'
+ - 'spec/controllers/boards/issues_controller_spec.rb'
+
# Offense count: 1
Lint/SelfAssignment:
Exclude:
@@ -225,57 +240,20 @@ Lint/UnreachableLoop:
Lint/UselessMethodDefinition:
Enabled: false
-# Offense count: 7
-# Configuration parameters: IgnoredMethods, Max.
+# Offense count: 5
+# Configuration parameters: IgnoredMethods.
Metrics/AbcSize:
- Exclude:
- - 'app/helpers/issuables_helper.rb'
- - 'app/services/merge_requests/build_service.rb'
- - 'app/services/projects/create_service.rb'
- - 'lib/api/helpers.rb'
- - 'lib/gitlab/lograge/custom_options.rb'
- - 'lib/gitlab/rack_attack.rb'
- - 'qa/qa/resource/repository/push.rb'
+ Max: 61
-# Offense count: 15
-# Configuration parameters: IgnoredMethods, Max.
+# Offense count: 13
+# Configuration parameters: IgnoredMethods.
Metrics/CyclomaticComplexity:
- Exclude:
- - 'app/services/projects/create_service.rb'
- - 'app/services/system_hooks_service.rb'
- - 'ee/app/controllers/ee/groups_controller.rb'
- - 'ee/app/helpers/ee/groups_helper.rb'
- - 'ee/lib/security/ci_configuration/sast_build_actions.rb'
- - 'lib/banzai/filter/abstract_reference_filter.rb'
- - 'lib/declarative_policy/runner.rb'
- - 'lib/gitlab/conflict/file.rb'
- - 'tooling/danger/roulette.rb'
- - 'lib/gitlab/diff/parser.rb'
- - 'lib/gitlab/rack_attack.rb'
- - 'lib/gitlab/sidekiq_cluster/cli.rb'
- - 'lib/gitlab/utils/merge_hash.rb'
- - 'lib/kramdown/parser/atlassian_document_format.rb'
- - 'spec/support/cycle_analytics_helpers/test_generation.rb'
+ Max: 25
-# Offense count: 15
-# Configuration parameters: IgnoredMethods, Max.
+# Offense count: 14
+# Configuration parameters: IgnoredMethods.
Metrics/PerceivedComplexity:
- Exclude:
- - 'app/helpers/submodule_helper.rb'
- - 'app/helpers/tab_helper.rb'
- - 'app/services/projects/create_service.rb'
- - 'ee/app/controllers/ee/groups_controller.rb'
- - 'ee/app/helpers/ee/groups_helper.rb'
- - 'ee/lib/security/ci_configuration/sast_build_actions.rb'
- - 'lib/banzai/filter/abstract_reference_filter.rb'
- - 'lib/banzai/renderer.rb'
- - 'lib/declarative_policy/runner.rb'
- - 'lib/gitlab/conflict/file.rb'
- - 'tooling/danger/roulette.rb'
- - 'lib/gitlab/rack_attack.rb'
- - 'lib/gitlab/sidekiq_cluster/cli.rb'
- - 'lib/gitlab/utils/merge_hash.rb'
- - 'spec/support/cycle_analytics_helpers/test_generation.rb'
+ Max: 25
# Offense count: 1
# Cop supports --auto-correct.
@@ -283,7 +261,7 @@ Migration/DepartmentName:
Exclude:
- 'app/models/commit.rb'
-# Offense count: 184
+# Offense count: 196
# Configuration parameters: ExpectMatchingDefinition, CheckDefinitionPathHierarchy, Regex, IgnoreExecutableScripts, AllowedAcronyms.
# AllowedAcronyms: CLI, DSL, ACL, API, ASCII, CPU, CSS, DNS, EOF, GUID, HTML, HTTP, HTTPS, ID, IP, JSON, LHS, QPS, RAM, RHS, RPC, SLA, SMTP, SQL, SSH, TCP, TLS, TTL, UDP, UI, UID, UUID, URI, URL, UTF8, VM, XML, XMPP, XSRF, XSS
Naming/FileName:
@@ -300,7 +278,7 @@ Naming/HeredocDelimiterCase:
- 'spec/support/helpers/repo_helpers.rb'
- 'spec/support/helpers/seed_repo.rb'
-# Offense count: 308
+# Offense count: 321
# Configuration parameters: ForbiddenDelimiters.
# ForbiddenDelimiters: (?-mix:(^|\s)(EO[A-Z]{1}|END)(\s|$))
Naming/HeredocDelimiterNaming:
@@ -314,7 +292,7 @@ Naming/MethodParameterName:
- 'lib/gitlab/diff/inline_diff.rb'
- 'spec/support/helpers/key_generator_helper.rb'
-# Offense count: 206
+# Offense count: 218
# Cop supports --auto-correct.
# Configuration parameters: PreferredName.
Naming/RescuedExceptionsVariableName:
@@ -326,17 +304,17 @@ Performance/AncestorsInclude:
Exclude:
- 'lib/gitlab/ci/config/extendable/entry.rb'
-# Offense count: 39
+# Offense count: 40
# Cop supports --auto-correct.
Performance/BlockGivenWithExplicitBlock:
Enabled: false
-# Offense count: 28
+# Offense count: 29
# Configuration parameters: MinSize.
Performance/CollectionLiteralInLoop:
Enabled: false
-# Offense count: 37
+# Offense count: 41
# Cop supports --auto-correct.
Performance/ConstantRegexp:
Enabled: false
@@ -382,7 +360,6 @@ Performance/DeleteSuffix:
- 'app/workers/concerns/application_worker.rb'
- 'ee/app/models/geo/upload_registry.rb'
- 'ee/app/workers/geo/file_download_dispatch_worker/attachment_job_finder.rb'
- - 'lib/sentry/client/issue.rb'
# Offense count: 13
# Cop supports --auto-correct.
@@ -395,7 +372,7 @@ Performance/Detect:
- 'spec/lib/gitlab/import_export/project/tree_restorer_spec.rb'
- 'spec/models/event_spec.rb'
-# Offense count: 116
+# Offense count: 121
Performance/MethodObjectAsBlock:
Enabled: false
@@ -439,7 +416,7 @@ Performance/Sum:
- 'lib/peek/views/detailed_view.rb'
- 'spec/models/namespace/root_storage_statistics_spec.rb'
-# Offense count: 14717
+# Offense count: 15209
# Configuration parameters: Prefixes.
# Prefixes: when, with, without
RSpec/ContextWording:
@@ -452,22 +429,17 @@ RSpec/EmptyExampleGroup:
- 'ee/spec/services/personal_access_tokens/revoke_invalid_tokens_spec.rb'
- 'spec/services/projects/prometheus/alerts/notify_service_spec.rb'
-# Offense count: 1365
+# Offense count: 1428
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: method_call, block
RSpec/ExpectChange:
Enabled: false
-# Offense count: 889
+# Offense count: 930
RSpec/ExpectInHook:
Enabled: false
-# Offense count: 16403
-# Configuration parameters: AllowSubject.
-RSpec/MultipleMemoizedHelpers:
- Max: 40
-
# Offense count: 2352
# Cop supports --auto-correct.
# Configuration parameters: Strict, EnforcedStyle, AllowedExplicitMatchers.
@@ -475,27 +447,27 @@ RSpec/MultipleMemoizedHelpers:
RSpec/PredicateMatcher:
Enabled: false
-# Offense count: 112
+# Offense count: 118
RSpec/RepeatedExampleGroupBody:
Enabled: false
-# Offense count: 219
+# Offense count: 225
RSpec/RepeatedExampleGroupDescription:
Enabled: false
-# Offense count: 655
+# Offense count: 667
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: and_return, block
RSpec/ReturnFromStub:
Enabled: false
-# Offense count: 596
+# Offense count: 610
# Cop supports --auto-correct.
RSpec/ScatteredLet:
Enabled: false
-# Offense count: 6
+# Offense count: 4
RSpec/ScatteredSetup:
Exclude:
- 'spec/requests/api/jobs_spec.rb'
@@ -520,7 +492,7 @@ RSpec/VariableName:
- '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: 25
+# Offense count: 26
# Cop supports --auto-correct.
# Configuration parameters: Include.
# Include: app/models/**/*.rb
@@ -549,25 +521,25 @@ Rails/BelongsTo:
- 'app/models/deployment.rb'
- 'app/models/environment.rb'
-# Offense count: 90
+# Offense count: 93
# Configuration parameters: Database, Include.
# SupportedDatabases: mysql, postgresql
# Include: db/migrate/*.rb
Rails/BulkChangeTable:
Enabled: false
-# Offense count: 153
+# Offense count: 155
# Cop supports --auto-correct.
Rails/ContentTag:
Enabled: false
-# Offense count: 300
+# Offense count: 313
# Configuration parameters: Include.
# Include: db/migrate/*.rb
Rails/CreateTableWithTimestamps:
Enabled: false
-# Offense count: 347
+# Offense count: 361
# Configuration parameters: EnforcedStyle.
# SupportedStyles: slashes, arguments
Rails/FilePath:
@@ -589,13 +561,13 @@ Rails/FindById:
- 'spec/finders/concerns/finder_methods_spec.rb'
- 'spec/finders/concerns/finder_with_cross_project_access_spec.rb'
-# Offense count: 346
+# Offense count: 354
# Configuration parameters: Include.
# Include: app/models/**/*.rb
Rails/HasManyOrHasOneDependent:
Enabled: false
-# Offense count: 539
+# Offense count: 537
# Configuration parameters: Include.
# Include: app/helpers/**/*.rb
Rails/HelperInstanceVariable:
@@ -615,11 +587,11 @@ Rails/IndexBy:
- 'ee/lib/gitlab/analytics/type_of_work/tasks_by_type.rb'
- 'ee/lib/gitlab/elastic/document_reference.rb'
- 'ee/lib/gitlab/group_plans_preloader.rb'
- - 'tooling/danger/sidekiq_queues.rb'
- 'lib/gitlab/database/count/reltuples_count_strategy.rb'
- 'lib/gitlab/language_detection.rb'
+ - 'tooling/danger/sidekiq_queues.rb'
-# Offense count: 45
+# Offense count: 47
# Cop supports --auto-correct.
Rails/IndexWith:
Enabled: false
@@ -629,24 +601,23 @@ Rails/Inquiry:
Exclude:
- 'spec/helpers/labels_helper_spec.rb'
-# Offense count: 115
+# Offense count: 118
# Configuration parameters: Include.
# Include: app/models/**/*.rb
Rails/InverseOf:
Enabled: false
-# Offense count: 60
+# Offense count: 62
# Configuration parameters: Include.
# Include: app/controllers/**/*.rb
Rails/LexicallyScopedActionFilter:
Enabled: false
-# Offense count: 3
+# Offense count: 2
# Cop supports --auto-correct.
Rails/LinkToBlank:
Exclude:
- 'app/helpers/projects_helper.rb'
- - 'app/helpers/wiki_helper.rb'
- 'ee/app/helpers/ee/user_callouts_helper.rb'
# Offense count: 1
@@ -662,12 +633,12 @@ Rails/MailerName:
Rails/NegateInclude:
Enabled: false
-# Offense count: 44
+# Offense count: 46
# Cop supports --auto-correct.
Rails/Pick:
Enabled: false
-# Offense count: 110
+# Offense count: 123
# Cop supports --auto-correct.
Rails/Pluck:
Enabled: false
@@ -679,7 +650,7 @@ Rails/Pluck:
Rails/RakeEnvironment:
Enabled: false
-# Offense count: 58
+# Offense count: 62
# Cop supports --auto-correct.
Rails/RedundantForeignKey:
Enabled: false
@@ -699,23 +670,23 @@ Rails/ShortI18n:
- 'app/uploaders/content_type_whitelist.rb'
- 'spec/views/shared/runners/show.html.haml_spec.rb'
-# Offense count: 1080
+# Offense count: 1144
# Configuration parameters: ForbiddenMethods, AllowedMethods.
# ForbiddenMethods: decrement!, decrement_counter, increment!, increment_counter, insert, insert!, insert_all, insert_all!, toggle!, touch, touch_all, update_all, update_attribute, update_column, update_columns, update_counters, upsert, upsert_all
Rails/SkipsModelValidations:
Enabled: false
-# Offense count: 251
+# Offense count: 278
# Cop supports --auto-correct.
Rails/SquishedSQLHeredocs:
Enabled: false
-# Offense count: 45
+# Offense count: 44
# Cop supports --auto-correct.
Rails/WhereEquals:
Enabled: false
-# Offense count: 40
+# Offense count: 44
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: exists, where
@@ -744,7 +715,7 @@ Security/YAMLLoad:
Style/AccessorGrouping:
Enabled: false
-# Offense count: 12
+# Offense count: 11
# Cop supports --auto-correct.
Style/ArrayCoercion:
Exclude:
@@ -756,12 +727,11 @@ Style/ArrayCoercion:
- '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/blob_verification_secondary_service.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: 183
+# Offense count: 188
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: percent_q, bare_percent
@@ -775,20 +745,35 @@ Style/BisectedAttrAccessor:
- 'lib/system_check/base_check.rb'
- 'qa/qa/resource/api_fabricator.rb'
-# Offense count: 36
+# Offense count: 42
# Cop supports --auto-correct.
Style/CaseLikeIf:
Enabled: false
-# Offense count: 15
+# Offense count: 10
+# Cop supports --auto-correct.
+# Configuration parameters: IgnoredMethods.
+# IgnoredMethods: ==, equal?, eql?
+Style/ClassEqualityComparison:
+ Exclude:
+ - 'app/finders/security/jobs_finder.rb'
+ - 'app/services/projects/overwrite_project_service.rb'
+ - 'app/uploaders/dependency_proxy/file_uploader.rb'
+ - 'ee/app/graphql/resolvers/vulnerabilities/issue_links_resolver.rb'
+ - 'lib/gitlab/background_migration/user_mentions/models/note.rb'
+ - 'lib/gitlab/diff/file.rb'
+ - 'lib/gitlab/git.rb'
+ - 'lib/gitlab/import_export/relation_tree_restorer.rb'
+ - 'spec/requests/api/services_spec.rb'
+ - 'spec/support/shared_examples/lib/gitlab/import_export/relation_factory_shared_examples.rb'
+
+# Offense count: 13
Style/CombinableLoops:
Exclude:
- - 'app/models/application_setting.rb'
- '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'
- - 'rubocop/code_reuse_helpers.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'
@@ -814,14 +799,14 @@ Style/EachWithObject:
- 'lib/gitlab/i18n/po_linter.rb'
- 'lib/gitlab/import_export/members_mapper.rb'
-# Offense count: 53
+# Offense count: 55
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: empty, nil, both
Style/EmptyElse:
Enabled: false
-# Offense count: 197
+# Offense count: 205
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: compact, expanded
@@ -835,66 +820,75 @@ Style/ExpandPathArguments:
- 'cable/config.ru'
- 'config.ru'
-# Offense count: 116
+# Offense count: 118
# Cop supports --auto-correct.
Style/ExplicitBlockArgument:
Enabled: false
-# Offense count: 555
+# Offense count: 581
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: format, sprintf, percent
Style/FormatString:
Enabled: false
-# Offense count: 61
+# Offense count: 67
# Cop supports --auto-correct.
Style/GlobalStdStream:
Enabled: false
-# Offense count: 879
+# Offense count: 897
# Configuration parameters: MinBodyLength.
Style/GuardClause:
Enabled: false
-# Offense count: 56
+# Offense count: 59
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: braces, no_braces
Style/HashAsLastArrayItem:
Enabled: false
-# Offense count: 66
+# Offense count: 70
# Cop supports --auto-correct.
Style/HashEachMethods:
Enabled: false
-# Offense count: 33
+# Offense count: 34
# Configuration parameters: AllowIfModifier.
Style/IfInsideElse:
Enabled: false
-# Offense count: 1888
+# Offense count: 1934
# Cop supports --auto-correct.
Style/IfUnlessModifier:
Enabled: false
-# Offense count: 68
+# Offense count: 64
# Cop supports --auto-correct.
Style/KeywordParametersOrder:
Enabled: false
-# Offense count: 431
+# Offense count: 458
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: line_count_dependent, lambda, literal
Style/Lambda:
Enabled: false
-# Offense count: 20
+# Offense count: 21
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.
@@ -902,36 +896,44 @@ Style/MissingRespondToMissing:
Style/Next:
Enabled: false
-# Offense count: 98
+# Offense count: 101
# Cop supports --auto-correct.
# Configuration parameters: EnforcedOctalStyle.
# SupportedOctalStyles: zero_with_o, zero_only
Style/NumericLiteralPrefix:
Enabled: false
-# Offense count: 135
+# Offense count: 140
# Cop supports --auto-correct.
Style/ParallelAssignment:
Enabled: false
-# Offense count: 2601
+# Offense count: 2698
# Cop supports --auto-correct.
# Configuration parameters: PreferredDelimiters.
Style/PercentLiteralDelimiters:
Enabled: false
-# Offense count: 1
+# Offense count: 247
# Cop supports --auto-correct.
-# Configuration parameters: EnforcedStyle.
+# Configuration parameters: .
# SupportedStyles: compact, exploded
Style/RaiseArgs:
Enabled: false
+ EnforcedStyle: exploded
-# Offense count: 65
+# Offense count: 73
# Cop supports --auto-correct.
Style/RedundantAssignment:
Enabled: false
+# Offense count: 2
+# Cop supports --auto-correct.
+Style/RedundantBegin:
+ Exclude:
+ - 'app/services/clusters/applications/check_installation_progress_service.rb'
+ - 'lib/gitlab/database/postgres_hll/batch_distinct_counter.rb'
+
# Offense count: 26
# Cop supports --auto-correct.
# Configuration parameters: SafeForConstants.
@@ -949,21 +951,23 @@ Style/RedundantFetchBlock:
Style/RedundantFileExtensionInRequire:
Enabled: false
-# Offense count: 220
+# Offense count: 248
# Cop supports --auto-correct.
Style/RedundantFreeze:
Enabled: false
-# Offense count: 182
+# Offense count: 206
# Cop supports --auto-correct.
Style/RedundantInterpolation:
Enabled: false
-# Offense count: 8
+# Offense count: 10
# Cop supports --auto-correct.
Style/RedundantRegexpCharacterClass:
Exclude:
- 'app/models/concerns/taskable.rb'
+ - 'ee/app/models/saml_provider.rb'
+ - 'lib/banzai/filter/markdown_pre_escape_filter.rb'
- 'lib/gitlab/authorized_keys.rb'
- 'lib/gitlab/fogbugz_import/repository.rb'
- 'lib/gitlab/quick_actions/substitution_definition.rb'
@@ -971,12 +975,12 @@ Style/RedundantRegexpCharacterClass:
- 'spec/features/merge_request/user_views_open_merge_request_spec.rb'
- 'spec/tasks/gitlab/usage_data_rake_spec.rb'
-# Offense count: 270
+# Offense count: 279
# Cop supports --auto-correct.
Style/RedundantRegexpEscape:
Enabled: false
-# Offense count: 920
+# Offense count: 968
# Cop supports --auto-correct.
Style/RedundantSelf:
Enabled: false
@@ -988,26 +992,26 @@ Style/RedundantSelfAssignment:
- 'app/models/concerns/issuable.rb'
- 'spec/db/schema_spec.rb'
-# Offense count: 196
+# Offense count: 213
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, AllowInnerSlashes.
# SupportedStyles: slashes, percent_r, mixed
Style/RegexpLiteral:
Enabled: false
-# Offense count: 50
+# Offense count: 53
# Cop supports --auto-correct.
Style/RescueModifier:
Enabled: false
-# Offense count: 346
+# Offense count: 359
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: implicit, explicit
Style/RescueStandardError:
Enabled: false
-# Offense count: 115
+# Offense count: 123
# Cop supports --auto-correct.
Style/SingleArgumentDig:
Enabled: false
@@ -1017,34 +1021,33 @@ Style/SingleArgumentDig:
Style/SlicingWithRange:
Enabled: false
-# Offense count: 61
+# Offense count: 63
# Configuration parameters: AllowModifier.
Style/SoleNestedConditional:
Enabled: false
-# Offense count: 121
+# Offense count: 120
# Cop supports --auto-correct.
# Configuration parameters: .
# SupportedStyles: use_perl_names, use_english_names
Style/SpecialGlobalVars:
EnforcedStyle: use_perl_names
-# Offense count: 545
+# Offense count: 562
# Cop supports --auto-correct.
Style/StringConcatenation:
Enabled: false
-# Offense count: 108
+# Offense count: 109
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: single_quotes, double_quotes
Style/StringLiteralsInInterpolation:
Enabled: false
-# Offense count: 292
+# Offense count: 293
# Cop supports --auto-correct.
# Configuration parameters: IgnoredMethods.
# IgnoredMethods: respond_to, define_method
Style/SymbolProc:
Enabled: false
-
diff --git a/.scss-lint.yml b/.scss-lint.yml
deleted file mode 100644
index ec193e2a3db..00000000000
--- a/.scss-lint.yml
+++ /dev/null
@@ -1,277 +0,0 @@
-# Linter Documentation:
-# https://github.com/brigade/scss-lint/blob/master/lib/scss_lint/linter/README.md
-
-scss_files:
- - 'app/assets/stylesheets/**/*.scss'
- - 'ee/app/assets/stylesheets/**/*.scss'
-
-exclude:
- - 'app/assets/stylesheets/pages/emojis.scss'
- - 'app/assets/stylesheets/startup/startup-*.scss'
- - 'app/assets/stylesheets/lazy_bundles/select2.scss'
-
-linters:
- # Reports when you use improper spacing around ! (the "bang") in !default,
- # !global, !important, and !optional flags.
- BangFormat:
- enabled: true
-
- # Whether or not to prefer `border: 0` over `border: none`.
- BorderZero:
- enabled: true
-
- # Reports when you define a rule set using a selector with chained classes
- # (a.k.a. adjoining classes).
- ChainedClasses:
- enabled: false
-
- # Prefer hexadecimal color codes over color keywords.
- # (e.g. `color: green` is a color keyword)
- ColorKeyword:
- enabled: false
-
- # Prefer color literals (keywords or hexadecimal codes) to be used only in
- # variable declarations. They should be referred to via variables everywhere
- # else.
- ColorVariable:
- enabled: true
-
- # Which form of comments to prefer in CSS.
- Comment:
- enabled: false
-
- # Reports @debug statements (which you probably left behind accidentally).
- DebugStatement:
- enabled: false
-
- # Rule sets should be ordered as follows:
- # - @extend declarations
- # - @include declarations without inner @content
- # - properties
- # - @include declarations with inner @content
- # - nested rule sets.
- # Disabled to minimize Bootstrap migration footprint
- DeclarationOrder:
- enabled: false
-
- # `scss-lint:disable` control comments should be preceded by a comment
- # explaining why these linters are being disabled for this file.
- # See https://github.com/brigade/scss-lint#disabling-linters-via-source for
- # more information.
- DisableLinterReason:
- enabled: true
-
- # Reports when you define the same property twice in a single rule set.
- DuplicateProperty:
- enabled: true
- ignore_consecutive:
- - cursor
-
- # Separate rule, function, and mixin declarations with empty lines.
- EmptyLineBetweenBlocks:
- enabled: true
-
- # Reports when you have an empty rule set.
- EmptyRule:
- enabled: true
-
- # Reports when you have an @extend directive.
- ExtendDirective:
- enabled: false
-
- # Files should always have a final newline. This results in better diffs
- # when adding lines to the file, since SCM systems such as git won't
- # think that you touched the last line.
- FinalNewline:
- enabled: true
-
- # HEX colors should use three-character values where possible.
- HexLength:
- enabled: false
-
- # HEX color values should use lower-case colors to differentiate between
- # letters and numbers, e.g. `#E3E3E3` vs. `#e3e3e3`.
- HexNotation:
- enabled: true
-
- # Avoid using ID selectors.
- IdSelector:
- enabled: false
-
- # The basenames of @imported SCSS partials should not begin with an
- # underscore and should not include the filename extension.
- ImportPath:
- enabled: true
-
- # Avoid using !important in properties. It is usually indicative of a
- # misunderstanding of CSS specificity and can lead to brittle code.
- ImportantRule:
- enabled: false
-
- # Indentation should always be done in increments of 2 spaces.
- Indentation:
- enabled: true
- width: 2
-
- # Don't write leading zeros for numeric values with a decimal point.
- LeadingZero:
- enabled: false
-
- # Reports when you define the same selector twice in a single sheet.
- MergeableSelector:
- enabled: true
-
- # Functions, mixins, variables, and placeholders should be declared
- # with all lowercase letters and hyphens instead of underscores.
- NameFormat:
- enabled: false
-
- # Avoid nesting selectors too deeply.
- NestingDepth:
- enabled: true
- max_depth: 6
-
- # Always use placeholder selectors in @extend.
- PlaceholderInExtend:
- enabled: false
-
- # Sort properties in a strict order.
- PropertySortOrder:
- enabled: false
-
- # Reports when you use an unknown or disabled CSS property
- # (ignoring vendor-prefixed properties).
- PropertySpelling:
- enabled: true
-
- # Configure which units are allowed for property values.
- PropertyUnits:
- enabled: false
-
- # Pseudo-elements, like ::before, and ::first-letter, should be declared
- # with two colons. Pseudo-classes, like :hover and :first-child, should
- # be declared with one colon.
- PseudoElement:
- enabled: true
-
- # Avoid qualifying elements in selectors (also known as "tag-qualifying").
- QualifyingElement:
- enabled: false
-
- # Don't write selectors with a depth of applicability greater than 3.
- SelectorDepth:
- enabled: false
-
- # Selectors should always use hyphenated-lowercase, rather than camelCase or
- # snake_case.
- SelectorFormat:
- enabled: false
- convention: hyphenated_lowercase
-
- # Prefer the shortest shorthand form possible for properties that support it.
- Shorthand:
- enabled: true
-
- # Each property should have its own line, except in the special case of
- # single line rulesets.
- SingleLinePerProperty:
- enabled: true
- allow_single_line_rule_sets: true
-
- # Split selectors onto separate lines after each comma, and have each
- # individual selector occupy a single line.
- SingleLinePerSelector:
- enabled: true
-
- # Commas in lists should be followed by a space.
- SpaceAfterComma:
- enabled: true
-
- # Comment literals should be followed by a space.
- SpaceAfterComment:
- enabled: false
-
- # Properties should be formatted with a single space separating the colon
- # from the property's value.
- SpaceAfterPropertyColon:
- enabled: true
-
- # Properties should be formatted with no space between the name and the
- # colon.
- SpaceAfterPropertyName:
- enabled: true
-
- # Variables should be formatted with a single space separating the colon
- # from the variable's value.
- SpaceAfterVariableColon:
- enabled: true
-
- # Variables should be formatted with no space between the name and the
- # colon.
- SpaceAfterVariableName:
- enabled: false
-
- # Operators should be formatted with a single space on both sides of an
- # infix operator.
- SpaceAroundOperator:
- enabled: true
-
- # Opening braces should be preceded by a single space.
- SpaceBeforeBrace:
- enabled: true
-
- # Parentheses should not be padded with spaces.
- SpaceBetweenParens:
- enabled: false
-
- # Enforces that string literals should be written with a consistent form
- # of quotes (single or double).
- StringQuotes:
- enabled: false
-
- # Property values, @extend, @include, and @import directives, and variable
- # declarations should always end with a semicolon.
- TrailingSemicolon:
- enabled: true
-
- # Reports lines containing trailing whitespace.
- TrailingWhitespace:
- enabled: true
-
- # Don't write trailing zeros for numeric values with a decimal point.
- TrailingZero:
- enabled: false
-
- # Don't use the `all` keyword to specify transition properties.
- TransitionAll:
- enabled: false
-
- # Numeric values should not contain unnecessary fractional portions.
- UnnecessaryMantissa:
- enabled: true
-
- # Do not use parent selector references (&) when they would otherwise
- # be unnecessary.
- UnnecessaryParentReference:
- enabled: true
-
- # URLs should be valid and not contain protocols or domain names.
- UrlFormat:
- enabled: true
-
- # URLs should always be enclosed within quotes.
- UrlQuotes:
- enabled: true
-
- # Properties, like color and font, are easier to read and maintain
- # when defined using variables rather than literals.
- VariableForProperty:
- enabled: false
-
- # Avoid vendor prefixes. Or rather: don't write them yourself.
- VendorPrefix:
- enabled: false
-
- # Omit length units on zero values, e.g. `0px` vs. `0`.
- ZeroUnit:
- enabled: true
diff --git a/.stylelintrc b/.stylelintrc
index b9174d1dca1..c383d75cb03 100644
--- a/.stylelintrc
+++ b/.stylelintrc
@@ -1,58 +1,18 @@
{
+ "extends": ["@gitlab/stylelint-config"],
"ignoreFiles": [
"app/assets/stylesheets/pages/emojis.scss",
"app/assets/stylesheets/startup/startup-*.scss",
"app/assets/stylesheets/lazy_bundles/select2.scss",
- "app/assets/stylesheets/highlight/themes/*.scss"
+ "app/assets/stylesheets/highlight/themes/*.scss",
+ "app/assets/stylesheets/lazy_bundles/cropper.css"
],
"plugins":[
"./scripts/frontend/stylelint/stylelint-duplicate-selectors.js",
"./scripts/frontend/stylelint/stylelint-utility-classes.js",
- "stylelint-scss"
],
"rules":{
- "at-rule-blacklist":[
- "debug"
- ],
- "at-rule-no-unknown":null,
- "at-rule-no-vendor-prefix":true,
- "block-no-empty":true,
- "block-opening-brace-space-before":"always",
- "color-hex-case":"lower",
- "color-hex-length":"short",
- "color-named":"never",
- "color-no-invalid-hex":true,
- "declaration-bang-space-after":"never",
- "declaration-bang-space-before":"always",
- "declaration-block-semicolon-newline-after":"always",
- "declaration-block-semicolon-space-before":"never",
- "declaration-block-single-line-max-declarations":1,
- "declaration-block-trailing-semicolon":"always",
- "declaration-colon-space-after":"always-single-line",
- "declaration-colon-space-before":"never",
- "declaration-property-value-blacklist":{
- "border":[
- "none"
- ],
- "border-top":[
- "none"
- ],
- "border-right":[
- "none"
- ],
- "border-bottom":[
- "none"
- ],
- "border-left":[
- "none"
- ]
- },
- "function-comma-space-after":"always-single-line",
- "function-parentheses-space-inside":"never",
- "function-url-quotes":"always",
- "indentation":2,
- "length-zero-no-unit":true,
- "max-nesting-depth":[
+ "max-nesting-depth": [
6,
{
"ignoreAtRules":[
@@ -64,54 +24,7 @@
"severity":"warning"
}
],
- "media-feature-name-no-vendor-prefix":true,
- "media-feature-parentheses-space-inside":"never",
- "no-missing-end-of-source-newline":true,
- "number-leading-zero":"always",
- "number-no-trailing-zeros":true,
- "property-no-unknown":true,
- "property-no-vendor-prefix": [true, { "ignoreProperties": ["user-select"] }],
- "rule-empty-line-before":[
- "always-multi-line",
- {
- "except":[
- "first-nested"
- ],
- "ignore":[
- "after-comment"
- ]
- }
- ],
- "scss/at-extend-no-missing-placeholder":[true,{ "severity": "warning" }],
- "scss/at-function-pattern":"^[a-z]+([a-z0-9-]+[a-z0-9]+)?$",
- "scss/at-import-no-partial-leading-underscore":true,
- "scss/at-import-partial-extension-blacklist":[
- "scss"
- ],
- "scss/at-mixin-pattern":"^[a-z]+([a-z0-9-]+[a-z0-9]+)?$",
- "scss/at-rule-no-unknown":true,
- "scss/dollar-variable-colon-space-after":"always",
- "scss/dollar-variable-colon-space-before":"never",
- "scss/dollar-variable-pattern":"^[_]?[a-z]+([a-z0-9-]+[a-z0-9]+)?$",
- "scss/percent-placeholder-pattern":"^[a-z]+([a-z0-9-]+[a-z0-9]+)?$",
- "scss/selector-no-redundant-nesting-selector":true,
- "selector-class-pattern":[
- "^[a-z0-9\\-]+$",
- {
- "message":"Selector should be written in lowercase with hyphens (selector-class-pattern)",
- "severity": "warning"
- }
- ],
- "selector-list-comma-newline-after":"always",
"selector-max-compound-selectors":[6, { "severity": "warning" }],
- "selector-max-id":1,
- "selector-no-vendor-prefix":true,
- "selector-pseudo-element-colon-notation":"double",
- "selector-pseudo-element-no-unknown":true,
- "shorthand-property-no-redundant-values":true,
- "string-quotes":"single",
- "value-no-vendor-prefix": [true, { "ignoreValues": ["sticky"] }],
- "stylelint-gitlab/duplicate-selectors":[true,{ "severity": "warning" }],
"stylelint-gitlab/utility-classes":[true,{ "severity": "warning" }],
"declaration-block-no-duplicate-properties": [
true,
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ce665eb7fcc..742a3a2d972 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -610,6 +610,18 @@ entry.
- Apply new GitLab UI for buttons in pipeline schedules.
+## 13.8.5 (2021-03-04)
+
+### Security (6 changes)
+
+- Fix XSS in wiki author email and name.
+- Bump thrift gem to 0.14.0.
+- Allow only owners to manage group variables.
+- Do not store marshalled sessions ids in Redis.
+- Workhorse: prevent escaped router path traversal.
+- Fix XSS vulnerability for swagger file viewer.
+
+
## 13.8.4 (2021-02-11)
### Security (9 changes)
@@ -1010,6 +1022,17 @@ entry.
- Add verbiage + link sast to show it's in core. !51935
+## 13.7.8 (2021-03-04)
+
+### Security (5 changes)
+
+- Bump thrift gem to 0.14.0.
+- Allow only owners to manage group variables.
+- Do not store marshalled sessions ids in Redis.
+- Workhorse: prevent escaped router path traversal.
+- Fix XSS vulnerability for swagger file viewer.
+
+
## 13.7.7 (2021-02-11)
### Security (9 changes)
diff --git a/GITALY_SERVER_VERSION b/GITALY_SERVER_VERSION
index 353780b610a..37333735f60 100644
--- a/GITALY_SERVER_VERSION
+++ b/GITALY_SERVER_VERSION
@@ -1 +1 @@
-13.9.3 \ No newline at end of file
+ac2235fe44c106e9f69b6614ecb72b67421fd402
diff --git a/GITLAB_WORKHORSE_VERSION b/GITLAB_WORKHORSE_VERSION
index 48309c07a55..974cf28e008 100644..120000
--- a/GITLAB_WORKHORSE_VERSION
+++ b/GITLAB_WORKHORSE_VERSION
@@ -1 +1 @@
-8.63.2
+VERSION \ No newline at end of file
diff --git a/Gemfile b/Gemfile
index ec253c37b3a..dd1054080ea 100644
--- a/Gemfile
+++ b/Gemfile
@@ -17,7 +17,7 @@ gem 'default_value_for', '~> 3.4.0'
# Supported DBs
gem 'pg', '~> 1.1'
-gem 'rugged', '~> 1.0.1'
+gem 'rugged', '~> 1.1'
gem 'grape-path-helpers', '~> 1.6.1'
gem 'faraday', '~> 1.0'
@@ -25,13 +25,13 @@ gem 'marginalia', '~> 1.10.0'
# Authentication libraries
gem 'devise', '~> 4.7.2'
-# TODO: verify ARM compile issue on 3.1.13+ version (see https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18828)
-gem 'bcrypt', '3.1.12'
+gem 'bcrypt', '~> 3.1', '>= 3.1.14'
gem 'doorkeeper', '~> 5.5.0.rc2'
gem 'doorkeeper-openid_connect', '~> 1.7.5'
gem 'omniauth', '~> 1.8'
gem 'omniauth-auth0', '~> 2.0.0'
-gem 'omniauth-azure-oauth2', '~> 0.0.9'
+gem 'omniauth-azure-activedirectory-v2', '~> 0.1'
+gem 'omniauth-azure-oauth2', '~> 0.0.9' # Deprecated v1 version
gem 'omniauth-cas3', '~> 1.1.4'
gem 'omniauth-facebook', '~> 4.0.0'
gem 'omniauth-github', '~> 1.4'
@@ -73,6 +73,9 @@ gem 'acme-client', '~> 2.0', '>= 2.0.6'
# Browser detection
gem 'browser', '~> 4.2'
+# OS detection for usage ping
+gem 'ohai', '~> 16.10'
+
# GPG
gem 'gpgme', '~> 2.0.19'
@@ -88,7 +91,7 @@ gem 'grape-entity', '~> 0.7.1'
gem 'rack-cors', '~> 1.0.6', require: 'rack/cors'
# GraphQL API
-gem 'graphql', '~> 1.11.4'
+gem 'graphql', '~> 1.11.8'
# NOTE: graphiql-rails v1.5+ doesn't work: https://gitlab.com/gitlab-org/gitlab/issues/31771
# TODO: remove app/views/graphiql/rails/editors/show.html.erb when https://github.com/rmosolgo/graphiql-rails/pull/71 is released:
# https://gitlab.com/gitlab-org/gitlab/issues/31747
@@ -112,16 +115,16 @@ gem 'carrierwave', '~> 1.3'
gem 'mini_magick', '~> 4.10.1'
# for backups
-gem 'fog-aws', '~> 3.8'
+gem 'fog-aws', '~> 3.9'
# Locked until fog-google resolves https://github.com/fog/fog-google/issues/421.
# Also see config/initializers/fog_core_patch.rb.
gem 'fog-core', '= 2.1.0'
-gem 'fog-google', '~> 1.12'
+gem 'gitlab-fog-google', '~> 1.13', require: 'fog/google'
gem 'fog-local', '~> 0.6'
gem 'fog-openstack', '~> 1.0'
gem 'fog-rackspace', '~> 0.1.1'
gem 'fog-aliyun', '~> 0.3'
-gem 'gitlab-fog-azure-rm', '~> 1.0', require: false
+gem 'gitlab-fog-azure-rm', '~> 1.0.1', require: false
# for Google storage
gem 'google-api-client', '~> 0.33'
@@ -195,7 +198,7 @@ gem 'acts-as-taggable-on', '~> 7.0'
gem 'sidekiq', '~> 5.2.7'
gem 'sidekiq-cron', '~> 1.0'
gem 'redis-namespace', '~> 1.7.0'
-gem 'gitlab-sidekiq-fetcher', '0.5.2', require: 'sidekiq-reliable-fetch'
+gem 'gitlab-sidekiq-fetcher', '0.5.5', require: 'sidekiq-reliable-fetch'
# Cron Parser
gem 'fugit', '~> 1.2.1'
@@ -233,7 +236,7 @@ gem 'connection_pool', '~> 2.0'
gem 'redis-rails', '~> 5.0.2'
# Discord integration
-gem 'discordrb-webhooks-blackst0ne', '~> 3.3', require: false
+gem 'discordrb-webhooks', '~> 3.4', require: false
# HipChat integration
gem 'hipchat', '~> 1.5.0'
@@ -309,7 +312,7 @@ gem 'pg_query', '~> 1.3.0'
gem 'premailer-rails', '~> 1.10.3'
# LabKit: Tracing and Correlation
-gem 'gitlab-labkit', '0.14.0'
+gem 'gitlab-labkit', '~> 0.16.1'
# Thrift is a dependency of gitlab-labkit, we want a version higher than 0.14.0
# because of https://gitlab.com/gitlab-org/gitlab/-/issues/321900
gem 'thrift', '>= 0.14.0'
@@ -321,7 +324,7 @@ gem 'gettext_i18n_rails', '~> 1.8.0'
gem 'gettext_i18n_rails_js', '~> 1.3'
gem 'gettext', '~> 3.3', require: false, group: :development
-gem 'batch-loader', '~> 1.4.0'
+gem 'batch-loader', '~> 2.0.1'
# Perf bar
gem 'peek', '~> 1.1'
@@ -375,9 +378,8 @@ group :development, :test do
gem 'spring', '~> 2.1.0'
gem 'spring-commands-rspec', '~> 1.0.4'
- gem 'gitlab-styles', '~> 6.0.0', require: false
+ gem 'gitlab-styles', '~> 6.1.0', require: false
- gem 'scss_lint', '~> 0.59.0', require: false
gem 'haml_lint', '~> 0.36.0', require: false
gem 'bundler-audit', '~> 0.7.0.1', require: false
@@ -482,7 +484,7 @@ gem 'flipper', '~> 0.17.1'
gem 'flipper-active_record', '~> 0.17.1'
gem 'flipper-active_support_cache_store', '~> 0.17.1'
gem 'unleash', '~> 0.1.5'
-gem 'gitlab-experiment', '~> 0.4.9'
+gem 'gitlab-experiment', '~> 0.5.0'
# Structured logging
gem 'lograge', '~> 0.5'
diff --git a/Gemfile.lock b/Gemfile.lock
index 1b6701e8e3d..9a5c0bc10d4 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -88,7 +88,7 @@ GEM
asciidoctor (~> 2.0)
asciidoctor-plantuml (0.0.12)
asciidoctor (>= 1.5.6, < 3.0.0)
- ast (2.4.1)
+ ast (2.4.2)
atlassian-jwt (0.2.0)
jwt (~> 2.1.0)
attr_encrypted (3.1.0)
@@ -127,8 +127,8 @@ GEM
nokogiri (~> 1.11.0.rc2)
babosa (1.0.2)
base32 (0.3.2)
- batch-loader (1.4.0)
- bcrypt (3.1.12)
+ batch-loader (2.0.1)
+ bcrypt (3.1.16)
bcrypt_pbkdf (1.0.0)
benchmark-ips (2.3.0)
benchmark-memory (0.1.2)
@@ -172,6 +172,14 @@ GEM
cbor (0.5.9.6)
character_set (1.4.0)
charlock_holmes (0.7.7)
+ chef-config (16.10.17)
+ addressable
+ chef-utils (= 16.10.17)
+ fuzzyurl
+ mixlib-config (>= 2.2.12, < 4.0)
+ mixlib-shellout (>= 2.0, < 4.0)
+ tomlrb (~> 1.2)
+ chef-utils (16.10.17)
childprocess (3.0.0)
chunky_png (1.3.5)
citrus (3.0.2)
@@ -187,7 +195,7 @@ GEM
concord (0.1.5)
adamantium (~> 0.2.0)
equalizer (~> 0.0.9)
- concurrent-ruby (1.1.7)
+ concurrent-ruby (1.1.8)
connection_pool (2.2.2)
contracts (0.11.0)
cork (0.3.0)
@@ -257,8 +265,8 @@ GEM
diff-lcs (1.4.4)
diff_match_patch (0.1.0)
diffy (3.3.0)
- discordrb-webhooks-blackst0ne (3.3.0)
- rest-client (~> 2.0)
+ discordrb-webhooks (3.4.2)
+ rest-client (>= 2.0.0)
docile (1.3.2)
domain_name (0.5.20190701)
unf (>= 0.0.5, < 1.0.0)
@@ -348,6 +356,8 @@ GEM
ffi-compiler (1.0.1)
ffi (>= 1.0.0)
rake
+ ffi-yajl (2.3.4)
+ libyajl2 (~> 1.2)
flipper (0.17.1)
flipper-active_record (0.17.1)
activerecord (>= 4.2, < 7)
@@ -363,7 +373,7 @@ GEM
fog-json
ipaddress (~> 0.8)
xml-simple (~> 1.1)
- fog-aws (3.8.0)
+ fog-aws (3.9.0)
fog-core (~> 2.1)
fog-json (~> 1.1)
fog-xml (~> 0.1)
@@ -373,12 +383,6 @@ GEM
excon (~> 0.58)
formatador (~> 0.2)
mime-types
- fog-google (1.12.0)
- fog-core (<= 2.1.0)
- fog-json (~> 1.2)
- fog-xml (~> 0.1.0)
- google-api-client (>= 0.44.2, < 0.51)
- google-cloud-env (~> 1.2)
fog-json (1.2.0)
fog-core
multi_json (~> 1.10)
@@ -403,6 +407,7 @@ GEM
fuubar (2.2.0)
rspec-core (~> 3.0)
ruby-progressbar (~> 1.4)
+ fuzzyurl (0.9.0)
gemoji (3.0.1)
gemojione (3.3.0)
json
@@ -425,36 +430,42 @@ GEM
github-markup (1.7.0)
gitlab-chronic (0.10.5)
numerizer (~> 0.2)
- gitlab-experiment (0.4.9)
+ gitlab-experiment (0.5.0)
activesupport (>= 3.0)
scientist (~> 1.5, >= 1.5.0)
- gitlab-fog-azure-rm (1.0.0)
+ gitlab-fog-azure-rm (1.0.1)
azure-storage-blob (~> 2.0)
azure-storage-common (~> 2.0)
fog-core (= 2.1.0)
fog-json (~> 1.2.0)
mime-types
ms_rest_azure (~> 0.12.0)
- gitlab-labkit (0.14.0)
+ gitlab-fog-google (1.13.0)
+ addressable (>= 2.7.0)
+ fog-core (<= 2.1.0)
+ fog-json (~> 1.2)
+ fog-xml (~> 0.1.0)
+ google-api-client (>= 0.44.2, < 0.51)
+ google-cloud-env (~> 1.2)
+ gitlab-labkit (0.16.1)
actionpack (>= 5.0.0, < 7.0.0)
activesupport (>= 5.0.0, < 7.0.0)
- gitlab-pg_query (~> 1.3)
grpc (~> 1.19)
jaeger-client (~> 1.1)
opentracing (~> 0.4)
+ pg_query (~> 1.3)
redis (> 3.0.0, < 5.0.0)
- gitlab-license (1.3.0)
+ gitlab-license (1.3.1)
gitlab-mail_room (0.0.8)
gitlab-markup (1.7.1)
gitlab-net-dns (0.9.1)
- gitlab-pg_query (1.3.1)
gitlab-pry-byebug (3.9.0)
byebug (~> 11.0)
pry (~> 0.13.0)
- gitlab-sidekiq-fetcher (0.5.2)
+ gitlab-sidekiq-fetcher (0.5.5)
sidekiq (~> 5)
- gitlab-styles (6.0.0)
- rubocop (~> 0.91.1)
+ gitlab-styles (6.1.0)
+ rubocop (~> 0.91, >= 0.91.1)
rubocop-gitlab-security (~> 0.1.1)
rubocop-performance (~> 1.9.2)
rubocop-rails (~> 2.9)
@@ -520,7 +531,7 @@ GEM
faraday (>= 1.0)
faraday_middleware
graphql-client
- graphql (1.11.4)
+ graphql (1.11.8)
graphql-client (0.16.0)
activesupport (>= 3.0)
graphql (~> 1.8)
@@ -598,7 +609,7 @@ GEM
mime-types (~> 3.0)
multi_xml (>= 0.5.2)
httpclient (2.8.3)
- i18n (1.8.7)
+ i18n (1.8.9)
concurrent-ruby (~> 1.0)
i18n_data (0.8.0)
icalendar (2.4.1)
@@ -668,6 +679,7 @@ GEM
actionmailer (>= 3.2)
letter_opener (~> 1.0)
railties (>= 3.2)
+ libyajl2 (1.2.0)
license_finder (6.0.0)
bundler
rubyzip (>= 1, < 3)
@@ -717,6 +729,12 @@ GEM
mini_mime (1.0.2)
mini_portile2 (2.5.0)
minitest (5.11.3)
+ mixlib-cli (2.1.8)
+ mixlib-config (3.0.9)
+ tomlrb
+ mixlib-log (3.0.9)
+ mixlib-shellout (3.2.5)
+ chef-utils
ms_rest (0.7.6)
concurrent-ruby (~> 1.0)
faraday (>= 0.9, < 2.0.0)
@@ -737,10 +755,12 @@ GEM
mustermann (>= 1.0.0)
nap (1.1.0)
nenv (0.3.0)
- net-http-persistent (4.0.0)
+ net-http-persistent (4.0.1)
connection_pool (~> 2.2)
net-ldap (0.16.3)
net-ntp (2.1.3)
+ net-scp (3.0.0)
+ net-ssh (>= 2.6.5, < 7.0.0)
net-ssh (6.0.0)
netrc (0.11.0)
nio4r (2.5.4)
@@ -764,6 +784,19 @@ GEM
octokit (4.20.0)
faraday (>= 0.9)
sawyer (~> 0.8.0, >= 0.5.3)
+ ohai (16.10.6)
+ chef-config (>= 12.8, < 17)
+ chef-utils (>= 16.0, < 17)
+ ffi (~> 1.9)
+ ffi-yajl (~> 2.2)
+ ipaddress
+ mixlib-cli (>= 1.7.0)
+ mixlib-config (>= 2.0, < 4.0)
+ mixlib-log (>= 2.0.1, < 4.0)
+ mixlib-shellout (>= 2.0, < 4.0)
+ plist (~> 3.1)
+ train-core
+ wmi-lite (~> 1.0)
oj (3.10.6)
omniauth (1.9.0)
hashie (>= 3.4.6, < 3.7.0)
@@ -776,6 +809,8 @@ GEM
omniauth-authentiq (0.3.3)
jwt (>= 1.5)
omniauth-oauth2 (>= 1.5)
+ omniauth-azure-activedirectory-v2 (0.1.1)
+ omniauth-oauth2
omniauth-azure-oauth2 (0.0.10)
jwt (>= 1.0, < 3.0)
omniauth (~> 1.0)
@@ -855,6 +890,7 @@ GEM
railties (>= 4.0.0)
pg (1.2.3)
pg_query (1.3.0)
+ plist (3.6.0)
png_quantizator (0.2.1)
po_to_json (1.0.1)
json (>= 1.6.0)
@@ -1041,16 +1077,16 @@ GEM
pg
rails
sqlite3
- rubocop (0.91.1)
+ rubocop (0.93.1)
parallel (~> 1.10)
- parser (>= 2.7.1.1)
+ parser (>= 2.7.1.5)
rainbow (>= 2.2.2, < 4.0)
- regexp_parser (>= 1.7)
+ regexp_parser (>= 1.8)
rexml
- rubocop-ast (>= 0.4.0, < 1.0)
+ rubocop-ast (>= 0.6.0)
ruby-progressbar (~> 1.7)
unicode-display_width (>= 1.4.0, < 2.0)
- rubocop-ast (0.8.0)
+ rubocop-ast (1.4.1)
parser (>= 2.7.1.5)
rubocop-gitlab-security (0.1.1)
rubocop (>= 0.51)
@@ -1079,7 +1115,7 @@ GEM
rubyntlm (0.6.2)
rubypants (0.2.0)
rubyzip (2.0.0)
- rugged (1.0.1)
+ rugged (1.1.0)
safe_yaml (1.0.4)
safety_net_attestation (0.4.0)
jwt (~> 2.0)
@@ -1104,9 +1140,7 @@ GEM
sawyer (0.8.2)
addressable (>= 2.3.5)
faraday (> 0.8, < 2.0)
- scientist (1.5.0)
- scss_lint (0.59.0)
- sass (~> 3.5, >= 3.5.5)
+ scientist (1.6.0)
securecompare (1.0.0)
seed-fu (2.3.7)
activerecord (>= 3.1)
@@ -1196,9 +1230,17 @@ GEM
parslet (~> 1.8.0)
toml-rb (1.0.0)
citrus (~> 3.0, > 3.0)
+ tomlrb (1.3.0)
tpm-key_attestation (0.9.0)
bindata (~> 2.4)
openssl-signature_algorithm (~> 0.4.0)
+ train-core (3.4.9)
+ addressable (~> 2.5)
+ ffi (!= 1.13.0)
+ json (>= 1.8, < 3.0)
+ mixlib-shellout (>= 2.0, < 4.0)
+ net-scp (>= 1.2, < 4.0)
+ net-ssh (>= 2.9, < 7.0)
truncato (0.7.11)
htmlentities (~> 4.3.1)
nokogiri (>= 1.7.0, <= 2.0)
@@ -1235,7 +1277,7 @@ GEM
validate_email (0.1.6)
activemodel (>= 3.0)
mail (>= 2.2.5)
- validate_url (1.0.8)
+ validate_url (1.0.13)
activemodel (>= 3.0.0)
public_suffix
validates_hostname (1.0.11)
@@ -1271,6 +1313,7 @@ GEM
expression_parser
rinku
with_env (1.1.0)
+ wmi-lite (1.0.5)
xml-simple (1.1.5)
xpath (3.2.0)
nokogiri (~> 1.8)
@@ -1302,8 +1345,8 @@ DEPENDENCIES
aws-sdk-s3 (~> 1)
babosa (~> 1.0.2)
base32 (~> 0.3.0)
- batch-loader (~> 1.4.0)
- bcrypt (= 3.1.12)
+ batch-loader (~> 2.0.1)
+ bcrypt (~> 3.1, >= 3.1.14)
bcrypt_pbkdf (~> 1.0)
benchmark-ips (~> 2.3.0)
benchmark-memory (~> 0.1)
@@ -1335,7 +1378,7 @@ DEPENDENCIES
devise-two-factor (~> 3.1.0)
diff_match_patch (~> 0.1.0)
diffy (~> 3.3)
- discordrb-webhooks-blackst0ne (~> 3.3)
+ discordrb-webhooks (~> 3.4)
doorkeeper (~> 5.5.0.rc2)
doorkeeper-openid_connect (~> 1.7.5)
ed25519 (~> 1.2)
@@ -1356,9 +1399,8 @@ DEPENDENCIES
flipper-active_support_cache_store (~> 0.17.1)
flowdock (~> 0.7)
fog-aliyun (~> 0.3)
- fog-aws (~> 3.8)
+ fog-aws (~> 3.9)
fog-core (= 2.1.0)
- fog-google (~> 1.12)
fog-local (~> 0.6)
fog-openstack (~> 1.0)
fog-rackspace (~> 0.1.1)
@@ -1371,16 +1413,17 @@ DEPENDENCIES
gitaly (~> 13.9.0.pre.rc1)
github-markup (~> 1.7.0)
gitlab-chronic (~> 0.10.5)
- gitlab-experiment (~> 0.4.9)
- gitlab-fog-azure-rm (~> 1.0)
- gitlab-labkit (= 0.14.0)
+ gitlab-experiment (~> 0.5.0)
+ gitlab-fog-azure-rm (~> 1.0.1)
+ gitlab-fog-google (~> 1.13)
+ gitlab-labkit (~> 0.16.1)
gitlab-license (~> 1.3)
gitlab-mail_room (~> 0.0.8)
gitlab-markup (~> 1.7.1)
gitlab-net-dns (~> 0.9.1)
gitlab-pry-byebug
- gitlab-sidekiq-fetcher (= 0.5.2)
- gitlab-styles (~> 6.0.0)
+ gitlab-sidekiq-fetcher (= 0.5.5)
+ gitlab-styles (~> 6.1.0)
gitlab_chronic_duration (~> 0.10.6.2)
gitlab_omniauth-ldap (~> 2.1.1)
gon (~> 6.2)
@@ -1393,7 +1436,7 @@ DEPENDENCIES
grape_logging (~> 1.7)
graphiql-rails (~> 1.4.10)
graphlient (~> 0.4.0)
- graphql (~> 1.11.4)
+ graphql (~> 1.11.8)
graphql-docs (~> 1.6.0)
grpc (~> 1.30.2)
gssapi
@@ -1443,11 +1486,13 @@ DEPENDENCIES
nokogiri (~> 1.11.1)
oauth2 (~> 1.4)
octokit (~> 4.15)
+ ohai (~> 16.10)
oj (~> 3.10.6)
omniauth (~> 1.8)
omniauth-atlassian-oauth2 (~> 0.2.0)
omniauth-auth0 (~> 2.0.0)
omniauth-authentiq (~> 0.3.3)
+ omniauth-azure-activedirectory-v2 (~> 0.1)
omniauth-azure-oauth2 (~> 0.0.9)
omniauth-cas3 (~> 1.1.4)
omniauth-facebook (~> 4.0.0)
@@ -1509,10 +1554,9 @@ DEPENDENCIES
ruby-progressbar (~> 1.10)
ruby_parser (~> 3.15)
rubyzip (~> 2.0.0)
- rugged (~> 1.0.1)
+ rugged (~> 1.1)
sanitize (~> 5.2.1)
sassc-rails (~> 2.1.0)
- scss_lint (~> 0.59.0)
seed-fu (~> 2.3.7)
selenium-webdriver (~> 3.142)
sentry-raven (~> 3.0)
diff --git a/PROCESS.md b/PROCESS.md
index 820f19a290b..67abe2f0a98 100644
--- a/PROCESS.md
+++ b/PROCESS.md
@@ -77,9 +77,9 @@ star, smile, etc.). Some good tips about code reviews can be found in our
## Feature flags
-Overview and details of feature flag processes in development of GitLab itself is described in [feature flags process documentation](https://docs.gitlab.com/ee/development/feature_flags/process.html).
+Overview and details of feature flag processes in development of GitLab itself is described in [feature flags process documentation](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle/).
-Guides on how to include feature flags in your backend/frontend code while developing GitLab are described in [developing with feature flags documentation](https://docs.gitlab.com/ee/development/feature_flags/development.html).
+Guides on how to include feature flags in your backend/frontend code while developing GitLab are described in [developing with feature flags documentation](https://docs.gitlab.com/ee/development/feature_flags).
Getting access and how to expose the feature to users is detailed in [controlling feature flags documentation](https://docs.gitlab.com/ee/development/feature_flags/controls.html).
diff --git a/app/assets/images/learn_gitlab/code_owners_enabled.svg b/app/assets/images/learn_gitlab/code_owners_enabled.svg
new file mode 100644
index 00000000000..019d74c64cc
--- /dev/null
+++ b/app/assets/images/learn_gitlab/code_owners_enabled.svg
@@ -0,0 +1,5 @@
+<svg width="26" height="26" viewBox="0 0 26 26" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M13 25C19.6274 25 25 19.6274 25 13C25 6.37258 19.6274 1 13 1C6.37258 1 1 6.37258 1 13C1 19.6274 6.37258 25 13 25Z" fill="white" stroke="#C2B7E6" stroke-width="2"/>
+<path d="M1.16748 12.3359C2.88075 11.7701 4.4618 10.8635 5.81545 9.67055C7.16911 8.47763 8.26738 7.02313 9.04415 5.39461M6.94481 2.60461C9.28681 6.43995 13.5115 8.99995 18.3335 8.99995C20.2715 8.99995 22.1135 8.58661 23.7748 7.84261L6.94481 2.60461Z" stroke="#C2B7E6"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M10.1176 15.8941H15.7647C15.7647 17.447 14.4941 18.7176 12.9412 18.7176C11.3882 18.7176 10.1176 17.447 10.1176 15.8941ZM9.05882 15.1882C8.47294 15.1882 8 14.7153 8 14.1294C8 13.5435 8.47294 13.0706 9.05882 13.0706C9.64471 13.0706 10.1176 13.5435 10.1176 14.1294C10.1176 14.7153 9.64471 15.1882 9.05882 15.1882ZM16.8235 15.1882C16.2376 15.1882 15.7647 14.7153 15.7647 14.1294C15.7647 13.5435 16.2376 13.0706 16.8235 13.0706C17.4094 13.0706 17.8824 13.5435 17.8824 14.1294C17.8824 14.7153 17.4094 15.1882 16.8235 15.1882Z" fill="#6B4FBB"/>
+</svg>
diff --git a/app/assets/images/learn_gitlab/git_write.svg b/app/assets/images/learn_gitlab/git_write.svg
new file mode 100644
index 00000000000..ad87b3f3b12
--- /dev/null
+++ b/app/assets/images/learn_gitlab/git_write.svg
@@ -0,0 +1,16 @@
+<svg width="40" height="39" viewBox="0 0 40 39" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0)">
+<path d="M32.2886 3.99573H37.8624C38.1834 3.99573 38.4435 4.25587 38.4435 4.57679V33.9598C38.4435 34.2808 38.1834 34.5409 37.8624 34.5409H32.2886V3.99573Z" fill="#F0F0F0" stroke="#DBDBDB" stroke-width="2"/>
+<path d="M10.757 9.4011L10.7363 4.92686C10.7337 4.35386 11.1491 3.86447 11.7148 3.77395L30.908 0.703095C31.614 0.590124 32.2537 1.13556 32.2537 1.85062V37.0106C32.2537 37.723 31.6184 38.2678 30.9143 38.1591L11.8555 35.2171C11.2908 35.13 10.8733 34.6453 10.8707 34.074L10.8502 29.6368" stroke="#DBDBDB" stroke-width="2"/>
+<path d="M11.2195 29.7561C16.877 29.7561 21.4634 25.1698 21.4634 19.5122C21.4634 13.8547 16.877 9.26831 11.2195 9.26831C5.56194 9.26831 0.975586 13.8547 0.975586 19.5122C0.975586 25.1698 5.56194 29.7561 11.2195 29.7561Z" stroke="#6E49CB"/>
+<path d="M11.2194 27.8048C15.7994 27.8048 19.5121 24.0921 19.5121 19.5122C19.5121 14.9322 15.7994 11.2195 11.2194 11.2195C6.63952 11.2195 2.92676 14.9322 2.92676 19.5122C2.92676 24.0921 6.63952 27.8048 11.2194 27.8048Z" fill="#6E49CB"/>
+<path d="M11.2194 27.8048C15.7994 27.8048 19.5121 24.0921 19.5121 19.5122C19.5121 14.9322 15.7994 11.2195 11.2194 11.2195C6.63952 11.2195 2.92676 14.9322 2.92676 19.5122C2.92676 24.0921 6.63952 27.8048 11.2194 27.8048Z" fill="white" fill-opacity="0.9"/>
+<path d="M10.8843 23.4146V16.276" stroke="#6E49CB" stroke-linecap="round"/>
+<path d="M7.31689 19.6609H14.634" stroke="#6E49CB" stroke-linecap="round"/>
+</g>
+<defs>
+<clipPath id="clip0">
+<rect width="40" height="39.0244" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/assets/images/learn_gitlab/merge_request_created.svg b/app/assets/images/learn_gitlab/merge_request_created.svg
new file mode 100644
index 00000000000..b8137a60f06
--- /dev/null
+++ b/app/assets/images/learn_gitlab/merge_request_created.svg
@@ -0,0 +1,107 @@
+<svg width="79" height="47" viewBox="0 0 79 47" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0)">
+<path d="M27.0655 1.96289H5.80354C4.48549 1.96289 3.41699 3.03139 3.41699 4.34944C3.41699 5.6675 4.48549 6.73599 5.80354 6.73599H27.0655C28.3836 6.73599 29.4521 5.6675 29.4521 4.34944C29.4521 3.03139 28.3836 1.96289 27.0655 1.96289Z" fill="#F9F9F9"/>
+<path d="M23.1603 11.5092H-0.705247C-2.0233 11.5092 -3.0918 12.5776 -3.0918 13.8957C-3.0918 15.2138 -2.0233 16.2823 -0.705247 16.2823H23.1603C24.4783 16.2823 25.5468 15.2138 25.5468 13.8957C25.5468 12.5776 24.4783 11.5092 23.1603 11.5092Z" fill="#F9F9F9"/>
+<path d="M80.8713 16.2822H44.4222C43.1041 16.2822 42.0356 17.3507 42.0356 18.6688C42.0356 19.9868 43.1041 21.0553 44.4222 21.0553H80.8713C82.1894 21.0553 83.2579 19.9868 83.2579 18.6688C83.2579 17.3507 82.1894 16.2822 80.8713 16.2822Z" fill="#F9F9F9"/>
+<path d="M56.789 44.7039H27.2825C25.9645 44.7039 24.896 45.7724 24.896 47.0904C24.896 48.4085 25.9645 49.477 27.2825 49.477H56.789C58.107 49.477 59.1755 48.4085 59.1755 47.0904C59.1755 45.7724 58.107 44.7039 56.789 44.7039Z" fill="#F9F9F9"/>
+<path d="M43.1205 35.3746H13.6141C12.296 35.3746 11.2275 36.4431 11.2275 37.7612C11.2275 39.0792 12.296 40.1477 13.6141 40.1477H43.1205C44.4386 40.1477 45.5071 39.0792 45.5071 37.7612C45.5071 36.4431 44.4386 35.3746 43.1205 35.3746Z" fill="#F9F9F9"/>
+<path d="M77.1829 25.8284H6.02034C4.70228 25.8284 3.63379 26.8969 3.63379 28.2149C3.63379 29.533 4.70228 30.6015 6.02034 30.6015H77.1829C78.501 30.6015 79.5695 29.533 79.5695 28.2149C79.5695 26.8969 78.501 25.8284 77.1829 25.8284Z" fill="#F9F9F9"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M30.103 6.73596H1.46436H6.12898C7.43073 6.73596 8.51553 7.82076 8.51553 9.12251C8.51553 10.4243 7.43073 11.5091 6.12898 11.5091H1.46436H30.103H22.1839C20.8822 11.5091 19.7974 10.4243 19.7974 9.12251C19.7974 7.82076 20.8822 6.73596 22.1839 6.73596H30.103ZM84.7766 21.0553H59.3924H67.3114C68.6132 21.0553 69.698 22.1401 69.698 23.4418C69.698 24.7436 68.6132 25.8284 67.3114 25.8284H59.3924H84.7766H76.8576C75.5559 25.8284 74.4711 24.7436 74.4711 23.4418C74.4711 22.1401 75.5559 21.0553 76.8576 21.0553H84.7766ZM31.8386 30.6015H6.45441H14.3734C15.6752 30.6015 16.76 31.6862 16.76 32.988C16.76 34.2898 15.6752 35.3746 14.3734 35.3746H6.45441H31.8386H23.9196C22.6179 35.3746 21.5331 34.2898 21.5331 32.988C21.5331 31.6862 22.6179 30.6015 23.9196 30.6015H31.8386ZM48.1106 40.1477H22.7263H27.391C28.6927 40.1477 29.7775 41.2324 29.7775 42.5342C29.7775 43.836 28.6927 44.9207 27.391 44.9207H22.7263H48.1106H36.9372C35.6354 44.9207 34.5506 43.836 34.5506 42.5342C34.5506 41.2324 35.6354 40.1477 36.9372 40.1477H48.1106Z" fill="#F9F9F9"/>
+<path d="M68.0708 4.78333H12.0954C10.8971 4.78333 9.92578 5.75468 9.92578 6.95292V41.4494C9.92578 42.6476 10.8971 43.619 12.0954 43.619H68.0708C69.269 43.619 70.2404 42.6476 70.2404 41.4494V6.95292C70.2404 5.75468 69.269 4.78333 68.0708 4.78333Z" fill="white" stroke="#EEEEEE" stroke-width="2"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M10.7935 11.0751H69.5894V11.9429H10.7935V11.0751Z" fill="#EEEEEE"/>
+<path d="M18.387 18.0178H17.5192C17.3994 18.0178 17.3022 18.115 17.3022 18.2348C17.3022 18.3546 17.3994 18.4517 17.5192 18.4517H18.387C18.5069 18.4517 18.604 18.3546 18.604 18.2348C18.604 18.115 18.5069 18.0178 18.387 18.0178Z" fill="#B5A7DD"/>
+<path d="M23.3771 17.8009H20.9906C20.7509 17.8009 20.5566 17.9952 20.5566 18.2348C20.5566 18.4745 20.7509 18.6687 20.9906 18.6687H23.3771C23.6167 18.6687 23.811 18.4745 23.811 18.2348C23.811 17.9952 23.6167 17.8009 23.3771 17.8009Z" fill="#EEEEEE"/>
+<path d="M35.7438 17.8009H33.3573C33.1176 17.8009 32.9233 17.9952 32.9233 18.2348C32.9233 18.4745 33.1176 18.6687 33.3573 18.6687H35.7438C35.9835 18.6687 36.1777 18.4745 36.1777 18.2348C36.1777 17.9952 35.9835 17.8009 35.7438 17.8009Z" fill="#EEEEEE"/>
+<path d="M28.5841 22.574H26.1976C25.9579 22.574 25.7637 22.7682 25.7637 23.0079C25.7637 23.2475 25.9579 23.4418 26.1976 23.4418H28.5841C28.8238 23.4418 29.0181 23.2475 29.0181 23.0079C29.0181 22.7682 28.8238 22.574 28.5841 22.574Z" fill="#EEEEEE"/>
+<path d="M31.6217 20.1875H29.2352C28.9955 20.1875 28.8013 20.3818 28.8013 20.6214C28.8013 20.8611 28.9955 21.0553 29.2352 21.0553H31.6217C31.8614 21.0553 32.0557 20.8611 32.0557 20.6214C32.0557 20.3818 31.8614 20.1875 31.6217 20.1875Z" fill="#FC6D26"/>
+<path opacity="0.5" d="M31.6216 17.8009H28.1502C27.9106 17.8009 27.7163 17.9952 27.7163 18.2348C27.7163 18.4745 27.9106 18.6687 28.1502 18.6687H31.6216C31.8612 18.6687 32.0555 18.4745 32.0555 18.2348C32.0555 17.9952 31.8612 17.8009 31.6216 17.8009Z" fill="#FC6D26"/>
+<path d="M24.4619 22.574H20.9906C20.7509 22.574 20.5566 22.7682 20.5566 23.0079C20.5566 23.2475 20.7509 23.4418 20.9906 23.4418H24.4619C24.7016 23.4418 24.8958 23.2475 24.8958 23.0079C24.8958 22.7682 24.7016 22.574 24.4619 22.574Z" fill="#EEEEEE"/>
+<path d="M27.4995 20.1875H24.0282C23.7885 20.1875 23.5942 20.3818 23.5942 20.6214C23.5942 20.8611 23.7885 21.0553 24.0282 21.0553H27.4995C27.7392 21.0553 27.9334 20.8611 27.9334 20.6214C27.9334 20.3818 27.7392 20.1875 27.4995 20.1875Z" fill="#EEEEEE"/>
+<path d="M26.4144 17.8009H25.1126C24.873 17.8009 24.6787 17.9952 24.6787 18.2348C24.6787 18.4745 24.873 18.6687 25.1126 18.6687H26.4144C26.654 18.6687 26.8483 18.4745 26.8483 18.2348C26.8483 17.9952 26.654 17.8009 26.4144 17.8009Z" fill="#FC6D26"/>
+<path d="M22.2923 20.1875H20.9906C20.7509 20.1875 20.5566 20.3818 20.5566 20.6214C20.5566 20.8611 20.7509 21.0553 20.9906 21.0553H22.2923C22.532 21.0553 22.7262 20.8611 22.7262 20.6214C22.7262 20.3818 22.532 20.1875 22.2923 20.1875Z" fill="#EEEEEE"/>
+<path d="M18.387 20.4044H17.5192C17.3994 20.4044 17.3022 20.5016 17.3022 20.6214C17.3022 20.7412 17.3994 20.8383 17.5192 20.8383H18.387C18.5069 20.8383 18.604 20.7412 18.604 20.6214C18.604 20.5016 18.5069 20.4044 18.387 20.4044Z" fill="#B5A7DD"/>
+<path d="M18.387 22.791H17.5192C17.3994 22.791 17.3022 22.8882 17.3022 23.008C17.3022 23.1278 17.3994 23.2249 17.5192 23.2249H18.387C18.5069 23.2249 18.604 23.1278 18.604 23.008C18.604 22.8882 18.5069 22.791 18.387 22.791Z" fill="#B5A7DD"/>
+<path d="M18.387 25.1774H17.5192C17.3994 25.1774 17.3022 25.2745 17.3022 25.3943C17.3022 25.5142 17.3994 25.6113 17.5192 25.6113H18.387C18.5069 25.6113 18.604 25.5142 18.604 25.3943C18.604 25.2745 18.5069 25.1774 18.387 25.1774Z" fill="#B5A7DD"/>
+<path d="M23.3771 24.9604H20.9906C20.7509 24.9604 20.5566 25.1547 20.5566 25.3944C20.5566 25.634 20.7509 25.8283 20.9906 25.8283H23.3771C23.6167 25.8283 23.811 25.634 23.811 25.3944C23.811 25.1547 23.6167 24.9604 23.3771 24.9604Z" fill="#FC6D26"/>
+<path d="M35.7438 24.9604H33.3573C33.1176 24.9604 32.9233 25.1547 32.9233 25.3944C32.9233 25.634 33.1176 25.8283 33.3573 25.8283H35.7438C35.9835 25.8283 36.1777 25.634 36.1777 25.3944C36.1777 25.1547 35.9835 24.9604 35.7438 24.9604Z" fill="#EEEEEE"/>
+<path opacity="0.5" d="M28.5841 29.7335H26.1976C25.9579 29.7335 25.7637 29.9278 25.7637 30.1674C25.7637 30.4071 25.9579 30.6014 26.1976 30.6014H28.5841C28.8238 30.6014 29.0181 30.4071 29.0181 30.1674C29.0181 29.9278 28.8238 29.7335 28.5841 29.7335Z" fill="#FC6D26"/>
+<path d="M31.6217 27.347H29.2352C28.9955 27.347 28.8013 27.5413 28.8013 27.781C28.8013 28.0206 28.9955 28.2149 29.2352 28.2149H31.6217C31.8614 28.2149 32.0557 28.0206 32.0557 27.781C32.0557 27.5413 31.8614 27.347 31.6217 27.347Z" fill="#EEEEEE"/>
+<path d="M31.6216 24.9604H28.1502C27.9106 24.9604 27.7163 25.1547 27.7163 25.3944C27.7163 25.634 27.9106 25.8283 28.1502 25.8283H31.6216C31.8612 25.8283 32.0555 25.634 32.0555 25.3944C32.0555 25.1547 31.8612 24.9604 31.6216 24.9604Z" fill="#FC6D26"/>
+<path d="M24.4619 29.7335H20.9906C20.7509 29.7335 20.5566 29.9278 20.5566 30.1674C20.5566 30.4071 20.7509 30.6014 20.9906 30.6014H24.4619C24.7016 30.6014 24.8958 30.4071 24.8958 30.1674C24.8958 29.9278 24.7016 29.7335 24.4619 29.7335Z" fill="#FC6D26"/>
+<path d="M27.4995 27.347H24.0282C23.7885 27.347 23.5942 27.5413 23.5942 27.781C23.5942 28.0206 23.7885 28.2149 24.0282 28.2149H27.4995C27.7392 28.2149 27.9334 28.0206 27.9334 27.781C27.9334 27.5413 27.7392 27.347 27.4995 27.347Z" fill="#EEEEEE"/>
+<path opacity="0.5" d="M26.4144 24.9604H25.1126C24.873 24.9604 24.6787 25.1547 24.6787 25.3944C24.6787 25.634 24.873 25.8283 25.1126 25.8283H26.4144C26.654 25.8283 26.8483 25.634 26.8483 25.3944C26.8483 25.1547 26.654 24.9604 26.4144 24.9604Z" fill="#FC6D26"/>
+<path d="M22.2923 27.347H20.9906C20.7509 27.347 20.5566 27.5413 20.5566 27.781C20.5566 28.0206 20.7509 28.2149 20.9906 28.2149H22.2923C22.532 28.2149 22.7262 28.0206 22.7262 27.781C22.7262 27.5413 22.532 27.347 22.2923 27.347Z" fill="#EEEEEE"/>
+<path d="M18.387 27.564H17.5192C17.3994 27.564 17.3022 27.6611 17.3022 27.7809C17.3022 27.9007 17.3994 27.9979 17.5192 27.9979H18.387C18.5069 27.9979 18.604 27.9007 18.604 27.7809C18.604 27.6611 18.5069 27.564 18.387 27.564Z" fill="#B5A7DD"/>
+<path d="M18.387 29.9506H17.5192C17.3994 29.9506 17.3022 30.0477 17.3022 30.1675C17.3022 30.2873 17.3994 30.3845 17.5192 30.3845H18.387C18.5069 30.3845 18.604 30.2873 18.604 30.1675C18.604 30.0477 18.5069 29.9506 18.387 29.9506Z" fill="#B5A7DD"/>
+<path d="M18.387 32.337H17.5192C17.3994 32.337 17.3022 32.4342 17.3022 32.554C17.3022 32.6738 17.3994 32.771 17.5192 32.771H18.387C18.5069 32.771 18.604 32.6738 18.604 32.554C18.604 32.4342 18.5069 32.337 18.387 32.337Z" fill="#B5A7DD"/>
+<path d="M23.3771 32.1201H20.9906C20.7509 32.1201 20.5566 32.3144 20.5566 32.554C20.5566 32.7937 20.7509 32.988 20.9906 32.988H23.3771C23.6167 32.988 23.811 32.7937 23.811 32.554C23.811 32.3144 23.6167 32.1201 23.3771 32.1201Z" fill="#EEEEEE"/>
+<path d="M35.7438 32.1201H33.3573C33.1176 32.1201 32.9233 32.3144 32.9233 32.554C32.9233 32.7937 33.1176 32.988 33.3573 32.988H35.7438C35.9835 32.988 36.1777 32.7937 36.1777 32.554C36.1777 32.3144 35.9835 32.1201 35.7438 32.1201Z" fill="#EEEEEE"/>
+<path d="M28.5841 36.8932H26.1976C25.9579 36.8932 25.7637 37.0875 25.7637 37.3271C25.7637 37.5668 25.9579 37.761 26.1976 37.761H28.5841C28.8238 37.761 29.0181 37.5668 29.0181 37.3271C29.0181 37.0875 28.8238 36.8932 28.5841 36.8932Z" fill="#EEEEEE"/>
+<path d="M31.6217 34.5067H29.2352C28.9955 34.5067 28.8013 34.701 28.8013 34.9406C28.8013 35.1803 28.9955 35.3745 29.2352 35.3745H31.6217C31.8614 35.3745 32.0557 35.1803 32.0557 34.9406C32.0557 34.701 31.8614 34.5067 31.6217 34.5067Z" fill="#EEEEEE"/>
+<path d="M31.6216 32.1201H28.1502C27.9106 32.1201 27.7163 32.3144 27.7163 32.554C27.7163 32.7937 27.9106 32.988 28.1502 32.988H31.6216C31.8612 32.988 32.0555 32.7937 32.0555 32.554C32.0555 32.3144 31.8612 32.1201 31.6216 32.1201Z" fill="#FC6D26"/>
+<path d="M24.4619 36.8932H20.9906C20.7509 36.8932 20.5566 37.0875 20.5566 37.3271C20.5566 37.5668 20.7509 37.761 20.9906 37.761H24.4619C24.7016 37.761 24.8958 37.5668 24.8958 37.3271C24.8958 37.0875 24.7016 36.8932 24.4619 36.8932Z" fill="#EEEEEE"/>
+<path d="M27.4995 34.5067H24.0282C23.7885 34.5067 23.5942 34.701 23.5942 34.9406C23.5942 35.1803 23.7885 35.3745 24.0282 35.3745H27.4995C27.7392 35.3745 27.9334 35.1803 27.9334 34.9406C27.9334 34.701 27.7392 34.5067 27.4995 34.5067Z" fill="#EEEEEE"/>
+<path opacity="0.5" d="M26.4144 32.1201H25.1126C24.873 32.1201 24.6787 32.3144 24.6787 32.554C24.6787 32.7937 24.873 32.988 25.1126 32.988H26.4144C26.654 32.988 26.8483 32.7937 26.8483 32.554C26.8483 32.3144 26.654 32.1201 26.4144 32.1201Z" fill="#FC6D26"/>
+<path d="M22.2923 34.5067H20.9906C20.7509 34.5067 20.5566 34.701 20.5566 34.9406C20.5566 35.1803 20.7509 35.3745 20.9906 35.3745H22.2923C22.532 35.3745 22.7262 35.1803 22.7262 34.9406C22.7262 34.701 22.532 34.5067 22.2923 34.5067Z" fill="#EEEEEE"/>
+<path d="M18.387 34.7236H17.5192C17.3994 34.7236 17.3022 34.8208 17.3022 34.9406C17.3022 35.0604 17.3994 35.1575 17.5192 35.1575H18.387C18.5069 35.1575 18.604 35.0604 18.604 34.9406C18.604 34.8208 18.5069 34.7236 18.387 34.7236Z" fill="#B5A7DD"/>
+<path d="M18.387 37.1102H17.5192C17.3994 37.1102 17.3022 37.2074 17.3022 37.3272C17.3022 37.447 17.3994 37.5442 17.5192 37.5442H18.387C18.5069 37.5442 18.604 37.447 18.604 37.3272C18.604 37.2074 18.5069 37.1102 18.387 37.1102Z" fill="#B5A7DD"/>
+<path d="M45.073 17.8008H44.2052C44.0854 17.8008 43.9883 17.8979 43.9883 18.0177C43.9883 18.1376 44.0854 18.2347 44.2052 18.2347H45.073C45.1929 18.2347 45.29 18.1376 45.29 18.0177C45.29 17.8979 45.1929 17.8008 45.073 17.8008Z" fill="#FDE5D8"/>
+<path d="M50.0631 17.5839H47.6766C47.4369 17.5839 47.2427 17.7781 47.2427 18.0178C47.2427 18.2574 47.4369 18.4517 47.6766 18.4517H50.0631C50.3028 18.4517 50.4971 18.2574 50.4971 18.0178C50.4971 17.7781 50.3028 17.5839 50.0631 17.5839Z" fill="#EEEEEE"/>
+<path d="M62.4299 17.5839H60.0433C59.8036 17.5839 59.6094 17.7781 59.6094 18.0178C59.6094 18.2574 59.8036 18.4517 60.0433 18.4517H62.4299C62.6695 18.4517 62.8638 18.2574 62.8638 18.0178C62.8638 17.7781 62.6695 17.5839 62.4299 17.5839Z" fill="#EEEEEE"/>
+<path opacity="0.5" d="M55.2702 22.3569H52.8836C52.644 22.3569 52.4497 22.5512 52.4497 22.7909C52.4497 23.0305 52.644 23.2248 52.8836 23.2248H55.2702C55.5098 23.2248 55.7041 23.0305 55.7041 22.7909C55.7041 22.5512 55.5098 22.3569 55.2702 22.3569Z" fill="#6B4FBB"/>
+<path d="M58.3078 19.9705H55.9212C55.6816 19.9705 55.4873 20.1647 55.4873 20.4044C55.4873 20.644 55.6816 20.8383 55.9212 20.8383H58.3078C58.5474 20.8383 58.7417 20.644 58.7417 20.4044C58.7417 20.1647 58.5474 19.9705 58.3078 19.9705Z" fill="#6B4FBB"/>
+<path opacity="0.5" d="M58.3076 17.5839H54.8363C54.5966 17.5839 54.4023 17.7781 54.4023 18.0178C54.4023 18.2574 54.5966 18.4517 54.8363 18.4517H58.3076C58.5473 18.4517 58.7415 18.2574 58.7415 18.0178C58.7415 17.7781 58.5473 17.5839 58.3076 17.5839Z" fill="#6B4FBB"/>
+<path d="M51.1479 22.3569H47.6766C47.4369 22.3569 47.2427 22.5512 47.2427 22.7909C47.2427 23.0305 47.4369 23.2248 47.6766 23.2248H51.1479C51.3876 23.2248 51.5819 23.0305 51.5819 22.7909C51.5819 22.5512 51.3876 22.3569 51.1479 22.3569Z" fill="#6B4FBB"/>
+<path d="M54.1855 19.9705H50.7142C50.4745 19.9705 50.2803 20.1647 50.2803 20.4044C50.2803 20.644 50.4745 20.8383 50.7142 20.8383H54.1855C54.4252 20.8383 54.6195 20.644 54.6195 20.4044C54.6195 20.1647 54.4252 19.9705 54.1855 19.9705Z" fill="#EEEEEE"/>
+<path d="M53.1004 17.5839H51.7987C51.559 17.5839 51.3647 17.7781 51.3647 18.0178C51.3647 18.2574 51.559 18.4517 51.7987 18.4517H53.1004C53.3401 18.4517 53.5343 18.2574 53.5343 18.0178C53.5343 17.7781 53.3401 17.5839 53.1004 17.5839Z" fill="#6B4FBB"/>
+<path d="M48.9783 19.9705H47.6766C47.4369 19.9705 47.2427 20.1647 47.2427 20.4044C47.2427 20.644 47.4369 20.8383 47.6766 20.8383H48.9783C49.218 20.8383 49.4123 20.644 49.4123 20.4044C49.4123 20.1647 49.218 19.9705 48.9783 19.9705Z" fill="#EEEEEE"/>
+<path d="M45.073 20.1874H44.2052C44.0854 20.1874 43.9883 20.2845 43.9883 20.4043C43.9883 20.5242 44.0854 20.6213 44.2052 20.6213H45.073C45.1929 20.6213 45.29 20.5242 45.29 20.4043C45.29 20.2845 45.1929 20.1874 45.073 20.1874Z" fill="#FDE5D8"/>
+<path d="M45.073 22.574H44.2052C44.0854 22.574 43.9883 22.6711 43.9883 22.7909C43.9883 22.9108 44.0854 23.0079 44.2052 23.0079H45.073C45.1929 23.0079 45.29 22.9108 45.29 22.7909C45.29 22.6711 45.1929 22.574 45.073 22.574Z" fill="#FDE5D8"/>
+<path d="M45.073 24.9604H44.2052C44.0854 24.9604 43.9883 25.0576 43.9883 25.1774C43.9883 25.2972 44.0854 25.3944 44.2052 25.3944H45.073C45.1929 25.3944 45.29 25.2972 45.29 25.1774C45.29 25.0576 45.1929 24.9604 45.073 24.9604Z" fill="#FDE5D8"/>
+<path d="M50.0631 24.7435H47.6766C47.4369 24.7435 47.2427 24.9378 47.2427 25.1774C47.2427 25.4171 47.4369 25.6114 47.6766 25.6114H50.0631C50.3028 25.6114 50.4971 25.4171 50.4971 25.1774C50.4971 24.9378 50.3028 24.7435 50.0631 24.7435Z" fill="#EEEEEE"/>
+<path d="M59.3922 22.3569H57.0057C56.766 22.3569 56.5718 22.5512 56.5718 22.7909C56.5718 23.0305 56.766 23.2248 57.0057 23.2248H59.3922C59.6319 23.2248 59.8262 23.0305 59.8262 22.7909C59.8262 22.5512 59.6319 22.3569 59.3922 22.3569Z" fill="#EEEEEE"/>
+<path opacity="0.5" d="M55.2702 29.5166H52.8836C52.644 29.5166 52.4497 29.7109 52.4497 29.9505C52.4497 30.1902 52.644 30.3844 52.8836 30.3844H55.2702C55.5098 30.3844 55.7041 30.1902 55.7041 29.9505C55.7041 29.7109 55.5098 29.5166 55.2702 29.5166Z" fill="#6B4FBB"/>
+<path d="M53.1007 27.1301H50.7142C50.4745 27.1301 50.2803 27.3244 50.2803 27.564C50.2803 27.8037 50.4745 27.998 50.7142 27.998H53.1007C53.3404 27.998 53.5347 27.8037 53.5347 27.564C53.5347 27.3244 53.3404 27.1301 53.1007 27.1301Z" fill="#6B4FBB"/>
+<path d="M58.3076 24.7435H54.8363C54.5966 24.7435 54.4023 24.9378 54.4023 25.1774C54.4023 25.4171 54.5966 25.6114 54.8363 25.6114H58.3076C58.5473 25.6114 58.7415 25.4171 58.7415 25.1774C58.7415 24.9378 58.5473 24.7435 58.3076 24.7435Z" fill="#6B4FBB"/>
+<path d="M51.1479 29.5166H47.6766C47.4369 29.5166 47.2427 29.7109 47.2427 29.9505C47.2427 30.1902 47.4369 30.3844 47.6766 30.3844H51.1479C51.3876 30.3844 51.5819 30.1902 51.5819 29.9505C51.5819 29.7109 51.3876 29.5166 51.1479 29.5166Z" fill="#EEEEEE"/>
+<path d="M53.1004 24.7435H51.7987C51.559 24.7435 51.3647 24.9378 51.3647 25.1774C51.3647 25.4171 51.559 25.6114 51.7987 25.6114H53.1004C53.3401 25.6114 53.5343 25.4171 53.5343 25.1774C53.5343 24.9378 53.3401 24.7435 53.1004 24.7435Z" fill="#EEEEEE"/>
+<path d="M48.9783 27.1301H47.6766C47.4369 27.1301 47.2427 27.3244 47.2427 27.564C47.2427 27.8037 47.4369 27.998 47.6766 27.998H48.9783C49.218 27.998 49.4123 27.8037 49.4123 27.564C49.4123 27.3244 49.218 27.1301 48.9783 27.1301Z" fill="#EEEEEE"/>
+<path d="M56.138 27.1301H54.8363C54.5966 27.1301 54.4023 27.3244 54.4023 27.564C54.4023 27.8037 54.5966 27.998 54.8363 27.998H56.138C56.3777 27.998 56.5719 27.8037 56.5719 27.564C56.5719 27.3244 56.3777 27.1301 56.138 27.1301Z" fill="#EEEEEE"/>
+<path d="M59.1756 27.1301H57.8739C57.6342 27.1301 57.4399 27.3244 57.4399 27.564C57.4399 27.8037 57.6342 27.998 57.8739 27.998H59.1756C59.4153 27.998 59.6095 27.8037 59.6095 27.564C59.6095 27.3244 59.4153 27.1301 59.1756 27.1301Z" fill="#EEEEEE"/>
+<path d="M62.43 22.3569H61.1283C60.8886 22.3569 60.6943 22.5512 60.6943 22.7909C60.6943 23.0305 60.8886 23.2248 61.1283 23.2248H62.43C62.6697 23.2248 62.8639 23.0305 62.8639 22.7909C62.8639 22.5512 62.6697 22.3569 62.43 22.3569Z" fill="#EEEEEE"/>
+<path d="M45.073 27.347H44.2052C44.0854 27.347 43.9883 27.4442 43.9883 27.564C43.9883 27.6838 44.0854 27.781 44.2052 27.781H45.073C45.1929 27.781 45.29 27.6838 45.29 27.564C45.29 27.4442 45.1929 27.347 45.073 27.347Z" fill="#FDE5D8"/>
+<path d="M45.073 29.7335H44.2052C44.0854 29.7335 43.9883 29.8307 43.9883 29.9505C43.9883 30.0703 44.0854 30.1674 44.2052 30.1674H45.073C45.1929 30.1674 45.29 30.0703 45.29 29.9505C45.29 29.8307 45.1929 29.7335 45.073 29.7335Z" fill="#FDE5D8"/>
+<path d="M45.073 32.1201H44.2052C44.0854 32.1201 43.9883 32.2173 43.9883 32.3371C43.9883 32.4569 44.0854 32.554 44.2052 32.554H45.073C45.1929 32.554 45.29 32.4569 45.29 32.3371C45.29 32.2173 45.1929 32.1201 45.073 32.1201Z" fill="#FDE5D8"/>
+<path d="M50.0631 31.9032H47.6766C47.4369 31.9032 47.2427 32.0975 47.2427 32.3371C47.2427 32.5768 47.4369 32.771 47.6766 32.771H50.0631C50.3028 32.771 50.4971 32.5768 50.4971 32.3371C50.4971 32.0975 50.3028 31.9032 50.0631 31.9032Z" fill="#6B4FBB"/>
+<path d="M55.2702 36.6763H52.8836C52.644 36.6763 52.4497 36.8705 52.4497 37.1102C52.4497 37.3498 52.644 37.5441 52.8836 37.5441H55.2702C55.5098 37.5441 55.7041 37.3498 55.7041 37.1102C55.7041 36.8705 55.5098 36.6763 55.2702 36.6763Z" fill="#EEEEEE"/>
+<path opacity="0.5" d="M58.3078 34.2897H55.9212C55.6816 34.2897 55.4873 34.4839 55.4873 34.7236C55.4873 34.9632 55.6816 35.1575 55.9212 35.1575H58.3078C58.5474 35.1575 58.7417 34.9632 58.7417 34.7236C58.7417 34.4839 58.5474 34.2897 58.3078 34.2897Z" fill="#6B4FBB"/>
+<path d="M51.1479 36.6763H47.6766C47.4369 36.6763 47.2427 36.8705 47.2427 37.1102C47.2427 37.3498 47.4369 37.5441 47.6766 37.5441H51.1479C51.3876 37.5441 51.5819 37.3498 51.5819 37.1102C51.5819 36.8705 51.3876 36.6763 51.1479 36.6763Z" fill="#EEEEEE"/>
+<path d="M54.1855 34.2897H50.7142C50.4745 34.2897 50.2803 34.4839 50.2803 34.7236C50.2803 34.9632 50.4745 35.1575 50.7142 35.1575H54.1855C54.4252 35.1575 54.6195 34.9632 54.6195 34.7236C54.6195 34.4839 54.4252 34.2897 54.1855 34.2897Z" fill="#6B4FBB"/>
+<path d="M53.1004 31.9032H51.7987C51.559 31.9032 51.3647 32.0975 51.3647 32.3371C51.3647 32.5768 51.559 32.771 51.7987 32.771H53.1004C53.3401 32.771 53.5343 32.5768 53.5343 32.3371C53.5343 32.0975 53.3401 31.9032 53.1004 31.9032Z" fill="#EEEEEE"/>
+<path d="M61.3451 34.2897H60.0433C59.8036 34.2897 59.6094 34.4839 59.6094 34.7236C59.6094 34.9632 59.8036 35.1575 60.0433 35.1575H61.3451C61.5847 35.1575 61.779 34.9632 61.779 34.7236C61.779 34.4839 61.5847 34.2897 61.3451 34.2897Z" fill="#EEEEEE"/>
+<path d="M48.9783 34.2897H47.6766C47.4369 34.2897 47.2427 34.4839 47.2427 34.7236C47.2427 34.9632 47.4369 35.1575 47.6766 35.1575H48.9783C49.218 35.1575 49.4123 34.9632 49.4123 34.7236C49.4123 34.4839 49.218 34.2897 48.9783 34.2897Z" fill="#EEEEEE"/>
+<path d="M45.073 34.5067H44.2052C44.0854 34.5067 43.9883 34.6039 43.9883 34.7237C43.9883 34.8435 44.0854 34.9406 44.2052 34.9406H45.073C45.1929 34.9406 45.29 34.8435 45.29 34.7237C45.29 34.6039 45.1929 34.5067 45.073 34.5067Z" fill="#FDE5D8"/>
+<path d="M45.073 36.8932H44.2052C44.0854 36.8932 43.9883 36.9903 43.9883 37.1101C43.9883 37.23 44.0854 37.3271 44.2052 37.3271H45.073C45.1929 37.3271 45.29 37.23 45.29 37.1101C45.29 36.9903 45.1929 36.8932 45.073 36.8932Z" fill="#FDE5D8"/>
+<path d="M66.0312 11.2921H75.4472C76.6405 11.2921 77.6168 10.3158 77.6168 9.12254V2.83072C77.6168 1.63745 76.6405 0.661133 75.4472 0.661133H65.2502C64.0569 0.661133 63.0806 1.63745 63.0806 2.83072V11.943C63.0806 13.1363 63.7748 13.4617 64.6427 12.5939L66.0312 11.2921Z" fill="white" stroke="#FDE5D8" stroke-width="2"/>
+<path d="M72.0845 3.69861H66.4436C66.2639 3.69861 66.1182 3.84431 66.1182 4.02405C66.1182 4.20378 66.2639 4.34949 66.4436 4.34949H72.0845C72.2643 4.34949 72.41 4.20378 72.41 4.02405C72.41 3.84431 72.2643 3.69861 72.0845 3.69861Z" fill="#FDB692"/>
+<path d="M74.2541 5.65125H66.4436C66.2639 5.65125 66.1182 5.79695 66.1182 5.97668C66.1182 6.15642 66.2639 6.30212 66.4436 6.30212H74.2541C74.4339 6.30212 74.5796 6.15642 74.5796 5.97668C74.5796 5.79695 74.4339 5.65125 74.2541 5.65125Z" fill="#FDB692"/>
+<path d="M72.0845 7.60388H66.4436C66.2639 7.60388 66.1182 7.74959 66.1182 7.92932C66.1182 8.10906 66.2639 8.25476 66.4436 8.25476H72.0845C72.2643 8.25476 72.41 8.10906 72.41 7.92932C72.41 7.74959 72.2643 7.60388 72.0845 7.60388Z" fill="#FDB692"/>
+<path d="M64.1655 21.0553C65.9629 21.0553 67.4199 19.5982 67.4199 17.8009C67.4199 16.0035 65.9629 14.5465 64.1655 14.5465C62.3682 14.5465 60.9111 16.0035 60.9111 17.8009C60.9111 19.5982 62.3682 21.0553 64.1655 21.0553Z" fill="#FFF7F4" stroke="#FC6D26"/>
+<path d="M62.3867 15.1974C63.0376 16.1303 64.079 16.7161 65.2506 16.7161C65.9665 16.7161 66.6174 16.4991 67.2032 16.1303" stroke="#FC6D26" stroke-width="0.5"/>
+<path d="M62.9724 18.6687C63.1521 18.6687 63.2979 18.523 63.2979 18.3433C63.2979 18.1635 63.1521 18.0178 62.9724 18.0178C62.7927 18.0178 62.647 18.1635 62.647 18.3433C62.647 18.523 62.7927 18.6687 62.9724 18.6687Z" fill="#FC6D26"/>
+<path d="M65.3591 18.6687C65.5389 18.6687 65.6846 18.523 65.6846 18.3433C65.6846 18.1635 65.5389 18.0178 65.3591 18.0178C65.1794 18.0178 65.0337 18.1635 65.0337 18.3433C65.0337 18.523 65.1794 18.6687 65.3591 18.6687Z" fill="#FC6D26"/>
+<path d="M16.0005 39.7137C17.7978 39.7137 19.2549 38.2567 19.2549 36.4593C19.2549 34.662 17.7978 33.205 16.0005 33.205C14.2031 33.205 12.7461 34.662 12.7461 36.4593C12.7461 38.2567 14.2031 39.7137 16.0005 39.7137Z" fill="#F4F1FA" stroke="#6B4FBB"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M18.1701 34.5068H18.7559C18.1701 33.5955 17.1721 32.988 16.0005 32.988C14.8289 32.988 13.8309 33.5955 13.2451 34.5068H13.8309L14.3733 33.8559L14.9157 34.5068L15.4581 33.8559L16.0005 34.5068L16.5429 33.8559L17.0853 34.5068L17.6277 33.8559L18.1701 34.5068Z" fill="#6B4FBB"/>
+<path d="M14.8074 37.1102C14.9871 37.1102 15.1328 36.9645 15.1328 36.7848C15.1328 36.6051 14.9871 36.4594 14.8074 36.4594C14.6276 36.4594 14.4819 36.6051 14.4819 36.7848C14.4819 36.9645 14.6276 37.1102 14.8074 37.1102Z" fill="#6B4FBB"/>
+<path d="M17.1936 37.1102C17.3733 37.1102 17.519 36.9645 17.519 36.7848C17.519 36.6051 17.3733 36.4594 17.1936 36.4594C17.0139 36.4594 16.8682 36.6051 16.8682 36.7848C16.8682 36.9645 17.0139 37.1102 17.1936 37.1102Z" fill="#6B4FBB"/>
+<path d="M13.0498 29.7336H3.63382C2.44055 29.7336 1.46423 28.7573 1.46423 27.5641V21.2722C1.46423 20.079 2.44055 19.1027 3.63382 19.1027H13.8309C15.0242 19.1027 16.0005 20.079 16.0005 21.2722V30.3845C16.0005 31.5778 15.3062 31.9032 14.4384 31.0354L13.0498 29.7336Z" fill="white" stroke="#E2DCF2" stroke-width="2"/>
+<path opacity="0.5" d="M4.82708 22.1401H10.468C10.6478 22.1401 10.7935 22.2858 10.7935 22.4656C10.7935 22.6453 10.6478 22.791 10.468 22.791H4.82708C4.64735 22.791 4.50164 22.6453 4.50164 22.4656C4.50164 22.2858 4.64735 22.1401 4.82708 22.1401Z" fill="#6B4FBB"/>
+<path opacity="0.5" d="M4.82724 24.0928H8.29859C8.47832 24.0928 8.62402 24.2385 8.62402 24.4182C8.62402 24.5979 8.47832 24.7437 8.29859 24.7437H4.82724C4.64751 24.7437 4.50181 24.5979 4.50181 24.4182C4.50181 24.2385 4.64751 24.0928 4.82724 24.0928Z" fill="#6B4FBB"/>
+<path opacity="0.5" d="M4.82724 26.0454H8.29859C8.47832 26.0454 8.62402 26.1911 8.62402 26.3708C8.62402 26.5506 8.47832 26.6963 8.29859 26.6963H4.82724C4.64751 26.6963 4.50181 26.5506 4.50181 26.3708C4.50181 26.1911 4.64751 26.0454 4.82724 26.0454Z" fill="#6B4FBB"/>
+</g>
+<defs>
+<clipPath id="clip0">
+<rect width="83.5292" height="48.8158" fill="white" transform="translate(-2.44092 0.661133)"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/assets/images/learn_gitlab/pipeline_created.svg b/app/assets/images/learn_gitlab/pipeline_created.svg
new file mode 100644
index 00000000000..91c716be475
--- /dev/null
+++ b/app/assets/images/learn_gitlab/pipeline_created.svg
@@ -0,0 +1,38 @@
+<svg width="52" height="48" viewBox="0 0 52 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M32.1404 11.789L45.6109 14.1173C47.0988 14.3744 48.0923 15.7653 47.8299 17.2237L44.9797 33.0687C44.7173 34.5272 43.2985 35.5011 41.8106 35.2439L28.34 32.9157C26.8521 32.6585 25.8586 31.2677 26.121 29.8092L28.9712 13.9642C29.2336 12.5057 30.6525 11.5318 32.1404 11.789Z" fill="white"/>
+<path d="M31.9504 12.8453C31.0576 12.691 30.2063 13.2754 30.0489 14.1505L27.1986 29.9955C27.0412 30.8705 27.6373 31.705 28.5301 31.8593L42.0006 34.1876C42.8933 34.3419 43.7446 33.7576 43.9021 32.8825L46.7523 17.0375C46.9097 16.1624 46.3136 15.3279 45.4209 15.1736L31.9504 12.8453ZM32.1404 11.789L45.6109 14.1173C47.0988 14.3744 48.0923 15.7653 47.8299 17.2237L44.9797 33.0687C44.7173 34.5272 43.2985 35.5011 41.8106 35.2439L28.34 32.9157C26.8521 32.6585 25.8586 31.2677 26.121 29.8092L28.9712 13.9642C29.2336 12.5057 30.6525 11.5318 32.1404 11.789Z" fill="#E1D8F9"/>
+<path d="M39.2265 9.7425L25.6003 8.57392C24.0951 8.44485 22.7683 9.53622 22.6366 11.0116L21.206 27.0398C21.0743 28.5151 22.1877 29.8158 23.6928 29.9449L37.3191 31.1134C38.8242 31.2425 40.1511 30.1511 40.2828 28.6758L41.7133 12.6476C41.845 11.1722 40.7316 9.87157 39.2265 9.7425Z" fill="black" fill-opacity="0.03"/>
+<path d="M34.477 47.7322H41.0349C46.4986 47.5866 50.8833 43.2004 50.8833 37.8104C50.8833 32.3306 46.3517 27.8886 40.7614 27.8886C40.4897 27.8886 40.2205 27.8993 39.9544 27.9197C38.6002 24.003 34.8187 21.1847 30.3659 21.1847C28.9201 21.1826 27.4908 21.4853 26.1748 22.0723C24.3556 19.4336 21.2753 17.6986 17.7818 17.6986C12.1915 17.6986 7.65986 22.1406 7.65986 27.6204C7.65986 27.8081 7.66533 27.995 7.67572 28.1803C3.26748 29.253 0 33.1573 0 37.8104C0 43.2902 4.53163 47.7322 10.122 47.7322C10.2106 47.7322 10.2987 47.7311 10.3868 47.729L34.477 47.7322Z" fill="#F4F0FF"/>
+<path d="M40.1486 9.42187L26.547 8.27441C25.0446 8.14767 23.718 9.24259 23.5839 10.72L22.1275 26.7704C21.9934 28.2478 23.1027 29.5482 24.6051 29.6749L38.2068 30.8224C39.7092 30.9491 41.0358 29.8542 41.1698 28.3768L42.6262 12.3264C42.7603 10.849 41.651 9.54862 40.1486 9.42187Z" fill="white"/>
+<path d="M26.4499 9.34444C25.5485 9.26839 24.7525 9.92534 24.6721 10.8118L23.2156 26.8622C23.1352 27.7486 23.8007 28.5288 24.7022 28.6049L38.3038 29.7523C39.2053 29.8284 40.0013 29.1714 40.0817 28.285L41.5381 12.2346C41.6185 11.3482 40.953 10.5679 40.0516 10.4919L26.4499 9.34444ZM26.547 8.27441L40.1486 9.42187C41.651 9.54862 42.7603 10.849 42.6262 12.3264L41.1698 28.3768C41.0358 29.8542 39.7092 30.9491 38.2068 30.8224L24.6051 29.6749C23.1027 29.5482 21.9934 28.2478 22.1275 26.7704L23.5839 10.72C23.718 9.24259 25.0446 8.14767 26.547 8.27441Z" fill="#E1D8F9"/>
+<path d="M28.8145 13.3182L27.7253 13.2263C27.4245 13.2009 27.1589 13.4202 27.1321 13.7161C27.1052 14.012 27.3273 14.2725 27.6281 14.2979L28.7173 14.3898C29.018 14.4152 29.2836 14.1959 29.3105 13.9C29.3373 13.6041 29.1152 13.3436 28.8145 13.3182Z" fill="#FC6D26"/>
+<path d="M33.2417 19.0816L32.1525 18.9897C31.8517 18.9643 31.5862 19.1836 31.5593 19.4795C31.5325 19.7755 31.7545 20.0359 32.0553 20.0613L33.1445 20.1533C33.4453 20.1787 33.7109 19.9593 33.7377 19.6634C33.7645 19.3675 33.5425 19.107 33.2417 19.0816Z" fill="#E1DBF1"/>
+<path d="M36.5464 22.0571L35.4572 21.9652C35.1564 21.9398 34.8908 22.1591 34.864 22.455C34.8372 22.7509 35.0592 23.0114 35.36 23.0368L36.4492 23.1287C36.75 23.1541 37.0155 22.9348 37.0424 22.6389C37.0692 22.343 36.8472 22.0825 36.5464 22.0571Z" fill="#FEE1D3"/>
+<path d="M36.5127 19.3624L35.4235 19.2705C35.1227 19.2451 34.8571 19.4644 34.8303 19.7603C34.8035 20.0562 35.0255 20.3167 35.3263 20.3421L36.4155 20.434C36.7163 20.4594 36.9819 20.2401 37.0087 19.9442C37.0355 19.6483 36.8135 19.3878 36.5127 19.3624Z" fill="#FEF0E8"/>
+<path d="M33.1744 13.6912L30.9954 13.5071C30.6946 13.4817 30.4289 13.7012 30.4021 13.9975C30.3752 14.2938 30.5974 14.5545 30.8982 14.58L33.0772 14.764C33.378 14.7895 33.6437 14.5699 33.6705 14.2736C33.6974 13.9774 33.4752 13.7166 33.1744 13.6912Z" fill="#EFEDF8"/>
+<path d="M27.8257 21.3098L27.2813 21.2638C26.9806 21.2385 26.7151 21.4576 26.6882 21.7534C26.6614 22.0491 26.8834 22.3094 27.1841 22.3348L27.7286 22.3807C28.0293 22.4061 28.2948 22.1869 28.3216 21.8912C28.3484 21.5955 28.1264 21.3351 27.8257 21.3098Z" fill="#FEF0E8"/>
+<path d="M30.5513 21.5437L30.0069 21.4977C29.7062 21.4723 29.4407 21.6915 29.4138 21.9873C29.387 22.283 29.609 22.5433 29.9097 22.5687L30.4541 22.6146C30.7548 22.64 31.0203 22.4208 31.0472 22.1251C31.074 21.8293 30.852 21.569 30.5513 21.5437Z" fill="#FC6D26"/>
+<path d="M33.2764 21.7772L32.732 21.7312C32.4313 21.7059 32.1657 21.925 32.1389 22.2208C32.1121 22.5165 32.3341 22.7768 32.6348 22.8022L33.1792 22.8481C33.4799 22.8735 33.7455 22.6543 33.7723 22.3586C33.7991 22.0629 33.5771 21.8025 33.2764 21.7772Z" fill="#E1D8F9"/>
+<path d="M29.6651 16.0818L27.4861 15.8977C27.1853 15.8723 26.9196 16.0919 26.8928 16.3881C26.866 16.6844 27.0881 16.9452 27.3889 16.9706L29.5679 17.1547C29.8688 17.1801 30.1344 16.9605 30.1613 16.6643C30.1881 16.368 29.966 16.1072 29.6651 16.0818Z" fill="#E1D8F9"/>
+<path d="M37.126 24.7972L34.9471 24.6132C34.6462 24.5877 34.3806 24.8073 34.3537 25.1036C34.3269 25.3998 34.549 25.6606 34.8499 25.686L37.0288 25.8701C37.3297 25.8955 37.5953 25.676 37.6222 25.3797C37.649 25.0834 37.4269 24.8227 37.126 24.7972Z" fill="#6B4FBB"/>
+<path d="M37.8406 16.7796L31.8467 16.2719C31.5457 16.2464 31.28 16.4666 31.2531 16.7638C31.2263 17.0609 31.4485 17.3225 31.7494 17.348L37.7434 17.8558C38.0443 17.8812 38.3101 17.661 38.3369 17.3638C38.3638 17.0667 38.1416 16.8051 37.8406 16.7796Z" fill="#C3B8E3"/>
+<path d="M33.0379 24.4431L27.0439 23.9353C26.743 23.9098 26.4773 24.1301 26.4504 24.4272C26.4235 24.7244 26.6457 24.986 26.9467 25.0114L32.9407 25.5192C33.2416 25.5447 33.5073 25.3245 33.5342 25.0273C33.5611 24.7301 33.3389 24.4686 33.0379 24.4431Z" fill="#FEE1D3"/>
+<path d="M38.0793 14.1112L35.3553 13.881C35.0545 13.8556 34.7888 14.0753 34.7619 14.3717C34.7351 14.6681 34.9572 14.929 35.2581 14.9544L37.982 15.1847C38.2829 15.2101 38.5486 14.9904 38.5754 14.694C38.6023 14.3976 38.3801 14.1367 38.0793 14.1112Z" fill="#E1DBF1"/>
+<path d="M29.9723 18.7993L27.2484 18.5691C26.9475 18.5437 26.6818 18.7634 26.655 19.0598C26.6282 19.3562 26.8503 19.6171 27.1512 19.6426L29.8751 19.8728C30.176 19.8982 30.4417 19.6785 30.4685 19.3821C30.4953 19.0857 30.2732 18.8248 29.9723 18.7993Z" fill="#6B4FBB"/>
+<path d="M35.2983 48H41.8562C47.3199 47.8544 51.7046 43.4682 51.7046 38.0782C51.7046 32.5984 47.173 28.1564 41.5827 28.1564C41.311 28.1564 41.0418 28.1671 40.7757 28.1875C39.4215 24.2708 35.64 21.4525 31.1871 21.4525C29.7414 21.4504 28.3121 21.7532 26.9961 22.3401C25.1769 19.7014 22.0965 17.9664 18.6031 17.9664C13.0128 17.9664 8.48115 22.4085 8.48115 27.8882C8.48115 28.076 8.48662 28.2629 8.49701 28.4482C4.08877 29.5208 0.821289 33.4252 0.821289 38.0782C0.821289 43.558 5.35292 48 10.9432 48C11.0319 48 11.12 47.999 11.2081 47.9968L35.2983 48Z" fill="white"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M35.2976 47.4637H41.8407C47.0193 47.3258 51.1567 43.1667 51.1567 38.0782C51.1567 32.8947 46.87 28.6927 41.5819 28.6927C41.3259 28.6927 41.0712 28.7026 40.8179 28.7222L40.3936 28.7549L40.2568 28.3596C38.9505 24.5818 35.3216 21.9887 31.1864 21.9887C29.8189 21.9868 28.4669 22.2731 27.2222 22.8283L26.8009 23.0163L26.5418 22.6406C24.7718 20.0727 21.8233 18.5027 18.6024 18.5027C13.3143 18.5027 9.02753 22.7047 9.02753 27.8882C9.02753 28.0654 9.03246 28.2422 9.04258 28.4183L9.06775 28.8616L8.62813 28.9686C4.39332 29.9986 1.36768 33.7413 1.36768 38.0782C1.36768 43.2616 5.65446 47.4637 10.9425 47.4637C11.0262 47.4637 11.1099 47.4626 11.2073 47.4604L35.2976 47.4637Z" fill="white"/>
+<path d="M41.5827 28.1564C47.1729 28.1564 51.7046 32.5985 51.7046 38.0782C51.7046 43.4542 47.3344 47.854 41.8415 48H35.2983L11.2203 47.9967C11.1169 47.999 11.0296 48 10.9432 48C5.35303 48 0.821289 43.5579 0.821289 38.0782C0.821289 33.5134 3.99981 29.542 8.49703 28.4481C8.48641 28.2631 8.48115 28.0765 8.48115 27.8882C8.48115 22.4086 13.0129 17.9664 18.6031 17.9664C21.9832 17.9664 25.1114 19.6064 26.9958 22.3403C28.3124 21.7532 29.742 21.4504 31.1871 21.4525C35.535 21.4525 39.3871 24.1716 40.7757 28.1874C41.0441 28.1668 41.3131 28.1564 41.5827 28.1564ZM41.8266 46.9276C46.7122 46.7976 50.6104 42.873 50.6104 38.0782C50.6104 33.1909 46.5685 29.229 41.5827 29.229C41.3418 29.229 41.1015 29.2383 40.8615 29.2569L40.4372 29.2896C40.1876 29.3088 39.9566 29.1596 39.8762 28.9272L39.7393 28.5318C38.501 24.9504 35.0651 22.5251 31.1863 22.5251C29.8973 22.5232 28.6228 22.7932 27.4496 23.3165L27.0283 23.5045C26.7852 23.6129 26.4979 23.5336 26.3483 23.3167L26.0892 22.9409C24.4075 20.5012 21.6186 19.0391 18.6031 19.0391C13.6172 19.0391 9.57541 23.001 9.57541 27.8882C9.57541 28.0567 9.58012 28.2233 9.58961 28.3886L9.61478 28.8319C9.62938 29.089 9.45538 29.3201 9.20034 29.3822L8.76063 29.4892C4.75075 30.4645 1.91555 34.007 1.91555 38.0782C1.91555 42.9655 5.95738 46.9274 10.9432 46.9274C11.0209 46.9274 11.1001 46.9264 11.2081 46.9242L35.2984 46.9274L41.8266 46.9276Z" fill="#E1D8F9"/>
+<path d="M19.2501 27.9907C19.8019 27.7404 20.3915 27.5821 20.9945 27.5223L21.1208 27.0649C21.3387 26.2755 22.1656 25.8045 22.9613 26.0114L23.7546 26.2177C24.1383 26.3176 24.4646 26.564 24.6618 26.9026C24.8589 27.2412 24.9107 27.6443 24.8057 28.0231L24.6794 28.4806C25.1755 28.8277 25.6031 29.2528 25.9488 29.7327L26.4143 29.6081C27.2149 29.3942 28.0346 29.8574 28.2469 30.6437L28.4563 31.4252C28.5574 31.8033 28.5015 32.2068 28.3009 32.5468C28.1003 32.8869 27.7714 33.1356 27.3867 33.2383L26.9221 33.3629C26.892 33.6548 26.8373 33.9481 26.7564 34.241C26.6755 34.5339 26.5718 34.8144 26.4475 35.0819L26.7857 35.4149C27.3682 35.9895 27.3647 36.9241 26.7779 37.5044L26.1939 38.0796C25.9113 38.3577 25.5291 38.5148 25.1313 38.5162C24.7336 38.5176 24.3529 38.3633 24.0732 38.0871L23.7343 37.7533C23.1824 38.0036 22.5929 38.1619 21.9899 38.2217L21.8636 38.6791C21.6457 39.4685 20.8188 39.9395 20.0231 39.7326L19.2298 39.5263C18.8461 39.4264 18.5198 39.18 18.3226 38.8414C18.1255 38.5028 18.0737 38.0997 18.1787 37.7209L18.3049 37.2634C17.8136 36.919 17.3846 36.4958 17.0356 36.0113L16.5701 36.1359C15.7695 36.3498 14.9498 35.8866 14.7374 35.1003L14.5281 34.3188C14.427 33.9407 14.4829 33.5372 14.6835 33.1972C14.8841 32.8571 15.2129 32.6084 15.5977 32.5057L16.0623 32.3812C16.0929 32.0847 16.1484 31.791 16.228 31.503C16.3089 31.2101 16.4126 30.9296 16.5369 30.6622L16.1986 30.3291C15.6162 29.7545 15.6197 28.8199 16.2065 28.2397L16.7905 27.6645C17.073 27.3863 17.4553 27.2292 17.853 27.2278C18.2508 27.2264 18.6314 27.3807 18.9112 27.6569L19.2501 27.9907Z" fill="white"/>
+<path d="M20.9944 27.5222L21.121 27.0643C21.3393 26.2769 22.1613 25.806 22.9613 26.0114L23.7546 26.2177C24.5536 26.4255 25.0238 27.2335 24.8057 28.0232L24.6796 28.4802C25.1712 28.8248 25.6002 29.2481 25.9491 29.7327L26.4148 29.6079C27.2147 29.3945 28.0336 29.8569 28.247 30.6437L28.4564 31.4256C28.5575 31.8038 28.5014 32.2073 28.3006 32.5474C28.0999 32.8874 27.7708 33.136 27.3868 33.2383L26.9221 33.3628C26.8918 33.6578 26.8364 33.9512 26.7564 34.241C26.6764 34.5306 26.5733 34.8113 26.4475 35.0819L26.7861 35.4156C27.3676 35.9897 27.3645 36.9229 26.7779 37.5044L26.1937 38.0798C25.911 38.358 25.5287 38.515 25.1308 38.5163C24.733 38.5175 24.3523 38.363 24.0733 38.0872L23.7342 37.7533C23.1825 38.0036 22.593 38.1619 21.99 38.2218L21.8635 38.6797C21.6451 39.4672 20.8231 39.938 20.0231 39.7326L19.2298 39.5263C18.4308 39.3185 17.9606 38.5106 18.1787 37.7209L18.3049 37.2638C17.8132 36.9192 17.3842 36.496 17.0353 36.0114L16.5696 36.1361C15.7697 36.3495 14.9509 35.8871 14.7374 35.1003L14.528 34.3184C14.4269 33.9403 14.483 33.5367 14.6838 33.1967C14.8846 32.8566 15.2136 32.608 15.5977 32.5057L16.0623 32.3813C16.0926 32.0862 16.148 31.7928 16.2279 31.5033C16.3073 31.2153 16.4106 30.9341 16.537 30.6621L16.1983 30.3284C15.6168 29.7543 15.62 28.8211 16.2065 28.2396L16.7907 27.6643C17.0734 27.3861 17.4558 27.229 17.8536 27.2278C18.2515 27.2265 18.6321 27.3811 18.9111 27.6568L19.2501 27.9906C19.8125 27.7376 20.3968 27.5816 20.9944 27.5222ZM19.3541 29.1231C19.1465 29.2172 18.9024 29.1749 18.742 29.0169L18.1356 28.4197C18.0595 28.3445 17.956 28.3025 17.8477 28.3028C17.7395 28.3032 17.6354 28.3459 17.5587 28.4214L16.976 28.9953C16.8161 29.1539 16.8152 29.4089 16.9737 29.5654L17.5783 30.1611C17.7385 30.3189 17.7816 30.5589 17.6864 30.7633L17.5285 31.1027C17.4273 31.3204 17.3445 31.5458 17.2808 31.7768C17.2166 32.0096 17.1723 32.2446 17.148 32.4805L17.1099 32.8514C17.087 33.0746 16.926 33.2615 16.706 33.3205L15.8747 33.5432C15.77 33.5711 15.6805 33.6387 15.6258 33.7312C15.5712 33.8237 15.556 33.9335 15.5834 34.0361L15.7923 34.816C15.8505 35.0306 16.0743 35.1569 16.2923 35.0987L17.124 34.876C17.3443 34.817 17.5775 34.8987 17.7088 35.0811L17.927 35.3841C18.2062 35.7718 18.5493 36.1104 18.942 36.3857L19.2494 36.6007C19.4343 36.7301 19.5173 36.9598 19.4573 37.1768L19.2315 37.9947C19.1719 38.2106 19.2997 38.4302 19.5168 38.4867L20.3085 38.6926C20.5267 38.7486 20.7513 38.6199 20.8108 38.4054L21.0366 37.5874C21.0965 37.3706 21.2864 37.212 21.5131 37.1895L21.89 37.1522C22.3723 37.1043 22.8438 36.9776 23.2856 36.7771L23.6306 36.6208C23.8382 36.5268 24.082 36.5692 24.2424 36.7271L24.8488 37.3243C24.9249 37.3995 25.0285 37.4416 25.1367 37.4412C25.2449 37.4409 25.349 37.3981 25.4257 37.3226L26.0084 36.7487C26.1683 36.5901 26.1692 36.3351 26.0107 36.1786L25.4061 35.5829C25.2459 35.4251 25.2028 35.1851 25.298 34.9807L25.456 34.6412C25.5567 34.4246 25.6393 34.1998 25.7036 33.9672C25.7678 33.7345 25.8122 33.4995 25.8364 33.2636L25.8745 32.8927C25.8974 32.6695 26.0584 32.4825 26.2784 32.4236L27.1097 32.2009C27.2144 32.173 27.3039 32.1053 27.3586 32.0128C27.4132 31.9203 27.4284 31.8105 27.401 31.708L27.1921 30.928C27.1339 30.7135 26.9101 30.5871 26.6921 30.6453L25.8604 30.868C25.6401 30.9271 25.4069 30.8453 25.2756 30.663L25.0574 30.3599C24.7783 29.9722 24.4351 29.6336 24.0427 29.3586L23.7353 29.1438C23.5501 29.0145 23.4671 28.7847 23.527 28.5675L23.7529 27.7494C23.8125 27.5334 23.6847 27.3138 23.4676 27.2573L22.6759 27.0514C22.4578 26.9954 22.2332 27.1241 22.1736 27.3387L21.9478 28.1566C21.8879 28.3735 21.698 28.5321 21.4713 28.5545L21.0944 28.5918C20.6121 28.6397 20.1406 28.7665 19.6992 28.9668C19.696 28.9682 19.5809 29.0203 19.3541 29.1231Z" fill="#7B58CF"/>
+<path d="M19.4256 36.6322C20.4661 37.2185 21.8046 36.8571 22.4152 35.825C23.0258 34.7929 22.6774 33.4808 21.6369 32.8945C20.5964 32.3082 19.2579 32.6696 18.6473 33.7017C18.0367 34.7339 18.3851 36.0459 19.4256 36.6322Z" fill="white"/>
+<path d="M20.2669 34.8677C19.2265 34.2814 18.878 32.9693 19.4886 31.9372C20.0992 30.9051 21.4377 30.5437 22.4782 31.13C23.5187 31.7163 23.8671 33.0283 23.2565 34.0605C22.6459 35.0926 21.3074 35.454 20.2669 34.8677ZM20.8198 33.9333C21.34 34.2264 22.0092 34.0457 22.3145 33.5297C22.6199 33.0136 22.4456 32.3576 21.9254 32.0644C21.4051 31.7713 20.7359 31.952 20.4306 32.468C20.1253 32.9841 20.2995 33.6401 20.8198 33.9333Z" fill="#6B4FBB"/>
+<path d="M30.889 35.0709C31.3313 34.8678 31.8035 34.7389 32.2863 34.6895L32.3883 34.3201C32.5643 33.6826 33.2272 33.3008 33.8637 33.4663L34.4983 33.6313C34.8053 33.7113 35.066 33.9096 35.2232 34.1825C35.3803 34.4555 35.421 34.7807 35.3362 35.0867L35.2342 35.4561C35.6306 35.7354 35.972 36.0777 36.2478 36.4644L36.6207 36.3629C37.262 36.1888 37.9173 36.5612 38.0857 37.1955L38.2517 37.8259C38.3319 38.1309 38.2864 38.4566 38.1251 38.7315C37.9638 39.0063 37.7001 39.2077 37.3919 39.2913L37.0198 39.3927C36.9951 39.6284 36.9507 39.8652 36.8854 40.1018C36.82 40.3384 36.7365 40.565 36.6364 40.7811L36.9065 41.0493C37.3717 41.512 37.367 42.2664 36.8961 42.7358L36.4275 43.2012C36.2007 43.4262 35.8945 43.5537 35.5761 43.5556C35.2577 43.5575 34.9532 43.4336 34.7299 43.2112L34.4592 42.9424C34.017 43.1455 33.5447 43.2744 33.0619 43.3238L32.9599 43.6932C32.7839 44.3307 32.1211 44.7125 31.4845 44.547L30.8499 44.3819C30.543 44.302 30.2822 44.1037 30.1251 43.8308C29.9679 43.5578 29.9273 43.2326 30.0121 42.9266L30.1141 42.5572C29.7214 42.2801 29.3788 41.9393 29.1004 41.5488L28.7276 41.6503C28.0863 41.8245 27.431 41.4521 27.2626 40.8178L27.0965 40.1874C27.0163 39.8824 27.0619 39.5566 27.2231 39.2818C27.3844 39.007 27.6481 38.8056 27.9563 38.722L28.3285 38.6206C28.3536 38.3812 28.3986 38.144 28.4629 37.9115C28.5282 37.6749 28.6118 37.4483 28.7118 37.2322L28.4417 36.964C27.9766 36.5013 27.9813 35.7469 28.4522 35.2775L28.9207 34.8121C29.1475 34.5871 29.4538 34.4595 29.7722 34.4577C30.0906 34.4558 30.395 34.5797 30.6184 34.802L30.889 35.0709Z" fill="white"/>
+<path d="M32.1998 34.5947L32.2833 34.2923C32.4746 33.6024 33.1919 33.1869 33.8914 33.3665L34.526 33.5315C35.2246 33.7132 35.6326 34.4223 35.4416 35.1142L35.3583 35.4159C35.7153 35.6768 36.0302 35.9898 36.2925 36.3444L36.5904 36.2633C37.2909 36.0733 38.0069 36.4799 38.1913 37.1715L38.3575 37.8023C38.4444 38.133 38.3949 38.4857 38.2201 38.7834C38.045 39.0816 37.7581 39.3004 37.423 39.3911L37.1204 39.4735C37.0938 39.6938 37.0505 39.9128 36.9908 40.1294C36.931 40.3458 36.8557 40.5563 36.7651 40.7602L36.9851 40.9788C37.4903 41.4818 37.4856 42.298 36.9752 42.8081L36.5064 43.2737C36.2596 43.5186 35.9255 43.6575 35.5775 43.6595C35.2288 43.6614 34.8954 43.5256 34.6519 43.2828L34.4357 43.0682C34.026 43.2479 33.5922 43.3661 33.1486 43.4189L33.0651 43.7214C32.8738 44.4113 32.1565 44.8267 31.457 44.6472L30.8224 44.4821C30.1238 44.3005 29.7158 43.5913 29.9068 42.8994L29.9901 42.5978C29.6331 42.3368 29.3182 42.0238 29.0559 41.6693L28.758 41.7504C28.0575 41.9403 27.3415 41.5338 27.1571 40.8421L26.9909 40.2114C26.9041 39.8807 26.9535 39.5279 27.1283 39.2303C27.3034 38.9321 27.5903 38.7132 27.9254 38.6225L28.228 38.5401C28.2546 38.3199 28.2979 38.1009 28.3576 37.8845C28.417 37.6691 28.4924 37.4583 28.5833 37.2535L28.3633 37.0348C27.8581 36.5319 27.8628 35.7157 28.3732 35.2055L28.842 34.74C29.0888 34.4951 29.4229 34.3561 29.7709 34.3542C30.1196 34.3522 30.453 34.4881 30.6965 34.7308L30.9127 34.9455C31.3224 34.7658 31.7562 34.6475 32.1998 34.5947ZM31.0182 36.0782C30.8094 36.1741 30.5632 36.1315 30.4022 35.9716L29.9178 35.4906C29.878 35.4508 29.8241 35.4289 29.7676 35.4292C29.7105 35.4295 29.6548 35.4527 29.6133 35.4939L29.1459 35.958C29.057 36.0469 29.0562 36.1897 29.1419 36.275L29.6246 36.7547C29.7833 36.9124 29.8259 37.151 29.7315 37.3546L29.6044 37.6287C29.5253 37.7997 29.4605 37.9767 29.4105 38.1581C29.36 38.3408 29.3251 38.5252 29.3058 38.7103L29.2745 39.0097C29.2514 39.2318 29.0916 39.4178 28.8729 39.4774L28.2068 39.6588C28.1506 39.674 28.1018 39.7112 28.0716 39.7626C28.0411 39.8146 28.0325 39.8763 28.0474 39.9333L28.2131 40.5621C28.2441 40.6786 28.3616 40.7453 28.4764 40.7142L29.1425 40.5328C29.3644 40.4725 29.5996 40.555 29.731 40.7394L29.9051 40.9836C30.1208 41.2862 30.3862 41.5502 30.6899 41.7646L30.9355 41.9376C31.1195 42.0672 31.2018 42.2962 31.142 42.5126L30.9597 43.1732C30.9264 43.2936 30.995 43.4128 31.1094 43.4425L31.7424 43.6071C31.8578 43.6367 31.9794 43.5663 32.0125 43.447L32.1949 42.7864C32.2546 42.5701 32.4437 42.4117 32.6697 42.3887L32.9714 42.3578C33.3452 42.3195 33.711 42.2196 34.054 42.0621L34.3305 41.9353C34.5392 41.8396 34.7853 41.8823 34.9462 42.0421L35.4306 42.5231C35.4704 42.5628 35.5243 42.5848 35.5808 42.5845C35.6379 42.5841 35.6936 42.561 35.7352 42.5197L36.2025 42.0556C36.2914 41.9668 36.2922 41.8239 36.2065 41.7387L35.7238 41.259C35.5651 41.1013 35.5225 40.8626 35.6169 40.6591L35.7441 40.3847C35.8228 40.2147 35.8875 40.0382 35.9379 39.8556C35.9884 39.6728 36.0233 39.4884 36.0427 39.3034L36.0739 39.0039C36.097 38.7819 36.2568 38.5958 36.4755 38.5363L37.1416 38.3549C37.1978 38.3397 37.2466 38.3025 37.2768 38.2511C37.3073 38.1991 37.3159 38.1373 37.301 38.0803L37.1353 37.4515C37.1043 37.335 36.9868 37.2683 36.872 37.2995L36.2059 37.4808C35.9841 37.5412 35.7488 37.4586 35.6174 37.2743L35.4433 37.0301C35.2276 36.7274 34.9622 36.4634 34.6588 36.2493L34.4132 36.0765C34.2289 35.947 34.1465 35.7178 34.2063 35.5012L34.3888 34.8404C34.422 34.7201 34.3534 34.6009 34.239 34.5711L33.606 34.4065C33.4907 34.3769 33.369 34.4473 33.3359 34.5666L33.1535 35.2272C33.0938 35.4435 32.9047 35.6019 32.6788 35.625L32.377 35.6558C32.0032 35.6941 31.6374 35.794 31.2948 35.9514C31.2919 35.9528 31.1997 35.995 31.0182 36.0782Z" fill="#FC6D26"/>
+<path d="M31.0067 42.0443C31.839 42.5134 32.9136 42.2178 33.4068 41.3841C33.9 40.5504 33.6251 39.4944 32.7928 39.0253C31.9604 38.5563 30.8858 38.8519 30.3926 39.6855C29.8994 40.5192 30.1743 41.5753 31.0067 42.0443Z" fill="white"/>
+<path d="M31.6893 40.6162C30.8561 40.1466 30.5815 39.0919 31.073 38.2611C31.5645 37.4302 32.6378 37.135 33.471 37.6045C34.3042 38.074 34.5788 39.1288 34.0873 39.9596C33.5957 40.7905 32.5225 41.0857 31.6893 40.6162ZM32.1315 39.8686C32.5469 40.1027 33.0855 39.9546 33.3337 39.535C33.5819 39.1154 33.4441 38.5861 33.0288 38.3521C32.6134 38.118 32.0748 38.2661 31.8266 38.6857C31.5783 39.1053 31.7162 39.6346 32.1315 39.8686Z" fill="#FC6D26"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M16.8736 10.2573C16.9313 9.88553 16.9613 9.50478 16.9613 9.11717C16.9613 4.97039 13.5319 1.60876 9.30146 1.60876C5.07104 1.60876 1.6416 4.97039 1.6416 9.11717C1.6416 13.2639 5.07104 16.6256 9.30146 16.6256C11.7125 16.6256 13.8633 15.5337 15.2674 13.8269L17.582 13.5753C17.637 13.5693 17.6908 13.5552 17.7414 13.5334C18.0182 13.4145 18.1442 13.0982 18.0228 12.8269L16.8736 10.2573Z" fill="#F4F0FF"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M17.42 9.18492C17.4777 8.81314 17.5077 8.43239 17.5077 8.04478C17.5077 3.898 14.0783 0.536377 9.84784 0.536377C5.61742 0.536377 2.18799 3.898 2.18799 8.04478C2.18799 12.1916 5.61742 15.5532 9.84784 15.5532C12.2588 15.5532 14.4097 14.4613 15.8138 12.7545L18.1284 12.5029C18.1834 12.4969 18.2371 12.4828 18.2878 12.461C18.5646 12.3421 18.6905 12.0258 18.5692 11.7545L17.42 9.18492Z" fill="white"/>
+<path d="M19.0711 11.5391C19.3137 12.0817 19.0617 12.7143 18.5082 12.9522C18.4069 12.9957 18.2994 13.0239 18.1895 13.0359L16.0945 13.2636C14.5478 15.0412 12.2855 16.0894 9.84859 16.0894C5.31599 16.0894 1.6416 12.4877 1.6416 8.04471C1.6416 3.60174 5.31599 0 9.84859 0C14.3812 0 18.0556 3.60174 18.0556 8.04471C18.0556 8.40289 18.0317 8.75827 17.9843 9.10926L19.0711 11.5391ZM16.8798 9.10409C16.9339 8.75583 16.9613 8.40206 16.9613 8.04471C16.9613 4.19414 13.7768 1.07263 9.84859 1.07263C5.92034 1.07263 2.73587 4.19414 2.73587 8.04471C2.73587 11.8953 5.92034 15.0168 9.84859 15.0168C12.0288 15.0168 14.0459 14.0499 15.3886 12.4178L15.5301 12.2457L18.0689 11.9698L16.9196 9.4002L16.8559 9.2578L16.8798 9.10409Z" fill="#E1D8F9"/>
+<path d="M9.98471 11.9331C7.8695 11.9331 6.15479 10.2523 6.15479 8.17888C6.15479 6.1055 7.8695 4.42468 9.98471 4.42468C12.0999 4.42468 13.8146 6.1055 13.8146 8.17888C13.8146 10.2523 12.0999 11.9331 9.98471 11.9331ZM9.98471 11.1286C11.6467 11.1286 12.9939 9.80798 12.9939 8.17888C12.9939 6.54979 11.6467 5.22915 9.98471 5.22915C8.32276 5.22915 6.97548 6.54979 6.97548 8.17888C6.97548 9.80798 8.32276 11.1286 9.98471 11.1286Z" fill="#31AF64"/>
+<path d="M9.62376 8.52988L9.09523 8.0118C8.93843 7.85825 8.68438 7.85825 8.52758 8.0118C8.4521 8.08542 8.40967 8.1855 8.40967 8.28987C8.40967 8.39425 8.4521 8.49433 8.52758 8.56795L9.31408 9.33864C9.31836 9.34303 9.32274 9.34732 9.32721 9.35151C9.47767 9.499 9.71841 9.49873 9.86751 9.35285L11.4564 7.79539C11.5279 7.725 11.5679 7.62964 11.5677 7.53031C11.5674 7.43098 11.5269 7.33582 11.455 7.26578C11.3837 7.19514 11.2866 7.15528 11.1851 7.15503C11.0837 7.15478 10.9864 7.19415 10.9147 7.26444L9.62376 8.52988Z" fill="#31AF64"/>
+</svg>
diff --git a/app/assets/images/learn_gitlab/required_mr_approvals_enabled.svg b/app/assets/images/learn_gitlab/required_mr_approvals_enabled.svg
new file mode 100644
index 00000000000..027767368a6
--- /dev/null
+++ b/app/assets/images/learn_gitlab/required_mr_approvals_enabled.svg
@@ -0,0 +1,70 @@
+<svg width="80" height="56" viewBox="0 0 80 56" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M11.1567 40.6485C16.4079 40.6485 20.6649 36.3891 20.6649 31.135C20.6649 25.8808 16.4079 21.6215 11.1567 21.6215C5.9055 21.6215 1.64856 25.8808 1.64856 31.135C1.64856 36.3891 5.9055 40.6485 11.1567 40.6485Z" fill="#F9F9F9"/>
+<path d="M19.0163 30.4864C19.0163 35.1888 15.2065 38.9999 10.5081 38.9999C5.80976 38.9999 2 35.1888 2 30.4864C2 25.784 5.80976 21.9729 10.5081 21.9729C15.2065 21.9729 19.0163 25.784 19.0163 30.4864Z" fill="white" stroke="#EEEEEE" stroke-width="2"/>
+<path d="M10.5075 39.5674C15.52 39.5674 19.5834 35.5017 19.5834 30.4863C19.5834 25.471 15.52 21.4053 10.5075 21.4053C5.49496 21.4053 1.43152 25.471 1.43152 30.4863C1.43152 35.5017 5.49496 39.5674 10.5075 39.5674Z" stroke="#EEEEEE"/>
+<path d="M8.43196 33.0239C8.57802 32.9204 8.75259 32.8648 8.93158 32.8648H13.1009C13.817 32.8648 14.3975 32.284 14.3975 31.5675V28.5405C14.3975 27.824 13.817 27.2432 13.1009 27.2432H8.34686C7.63078 27.2432 7.05029 27.824 7.05029 28.5405V34.0031L8.43196 33.0239ZM8.93158 33.7296L7.20891 34.9505C7.09937 35.0282 6.96844 35.0699 6.8342 35.0699C6.47616 35.0699 6.18591 34.7795 6.18591 34.4212V28.5405C6.18591 27.3463 7.1534 26.3783 8.34686 26.3783H13.1009C14.2944 26.3783 15.2619 27.3463 15.2619 28.5405V31.5675C15.2619 32.7616 14.2944 33.7296 13.1009 33.7296H8.93158Z" fill="#FEE1D3"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M9.21191 29.6217C9.4506 29.6217 9.6441 29.8153 9.6441 30.0541C9.6441 30.293 9.4506 30.4866 9.21191 30.4866C8.97322 30.4866 8.77972 30.293 8.77972 30.0541C8.77972 29.8153 8.97322 29.6217 9.21191 29.6217ZM10.7246 29.6217C10.9633 29.6217 11.1568 29.8153 11.1568 30.0541C11.1568 30.293 10.9633 30.4866 10.7246 30.4866C10.4859 30.4866 10.2924 30.293 10.2924 30.0541C10.2924 29.8153 10.4859 29.6217 10.7246 29.6217ZM12.2372 29.6217C12.4759 29.6217 12.6694 29.8153 12.6694 30.0541C12.6694 30.293 12.4759 30.4866 12.2372 30.4866C11.9985 30.4866 11.805 30.293 11.805 30.0541C11.805 29.8153 11.9985 29.6217 12.2372 29.6217Z" fill="#FC6D26"/>
+<path d="M18.0716 14.0539C21.7713 14.0539 24.7705 11.0531 24.7705 7.35125C24.7705 3.64946 21.7713 0.64856 18.0716 0.64856C14.3719 0.64856 11.3727 3.64946 11.3727 7.35125C11.3727 11.0531 14.3719 14.0539 18.0716 14.0539Z" fill="#F9F9F9"/>
+<path d="M17.423 13.4054C21.1228 13.4054 24.122 10.4045 24.122 6.70269C24.122 3.0009 21.1228 0 17.423 0C13.7233 0 10.7241 3.0009 10.7241 6.70269C10.7241 10.4045 13.7233 13.4054 17.423 13.4054Z" fill="white"/>
+<path d="M19.1525 6.27026H15.6949C15.4563 6.27026 15.2628 6.46387 15.2628 6.7027C15.2628 6.94152 15.4563 7.13513 15.6949 7.13513H19.1525C19.3911 7.13513 19.5846 6.94152 19.5846 6.7027C19.5846 6.46387 19.3911 6.27026 19.1525 6.27026Z" fill="#6B4FBB"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M49.7467 48.0001H20.8808C19.4486 48.0001 18.2877 46.8384 18.2877 45.4055V12.5406C18.2877 11.1077 19.4486 9.94604 20.8808 9.94604H65.3962C66.8284 9.94604 67.9893 11.1077 67.9893 12.5406V16.5187C69.077 15.9128 70.3297 15.5677 71.6629 15.5677C75.84 15.5677 79.2262 18.9558 79.2262 23.1352C79.2262 27.3147 75.84 30.7028 71.6629 30.7028C70.3297 30.7028 69.077 30.3576 67.9893 29.7517V45.4055C67.9893 46.8384 66.8284 48.0001 65.3962 48.0001H62.8938C62.9761 48.4198 63.0192 48.8535 63.0192 49.2974C63.0192 52.9991 60.02 56 56.3202 56C52.6205 56 49.6213 52.9991 49.6213 49.2974C49.6213 48.8535 49.6644 48.4198 49.7467 48.0001Z" fill="#F9F9F9"/>
+<path d="M71.0139 30.0543C75.191 30.0543 78.5772 26.6662 78.5772 22.4868C78.5772 18.3073 75.191 14.9192 71.0139 14.9192C66.8368 14.9192 63.4506 18.3073 63.4506 22.4868C63.4506 26.6662 66.8368 30.0543 71.0139 30.0543Z" fill="white"/>
+<path d="M71.0148 29.6218C74.9532 29.6218 78.1459 26.4273 78.1459 22.4867C78.1459 18.5461 74.9532 15.3516 71.0148 15.3516C67.0764 15.3516 63.8837 18.5461 63.8837 22.4867C63.8837 26.4273 67.0764 29.6218 71.0148 29.6218Z" stroke="#EEEEEE" stroke-width="2"/>
+<path d="M71.014 25.7303C72.8042 25.7303 74.2554 24.2782 74.2554 22.487C74.2554 20.6958 72.8042 19.2438 71.014 19.2438C69.2238 19.2438 67.7726 20.6958 67.7726 22.487C67.7726 24.2782 69.2238 25.7303 71.014 25.7303Z" fill="#F4F1FA" stroke="#6B4FBB"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M71.9682 20.5401L71.9667 20.5401L71.4366 19.8925L70.9063 20.5404L70.9051 20.5404L70.3748 19.8925L69.8443 20.5407L69.8436 20.5407L69.3131 19.8925L68.7823 20.541L68.2041 20.5411C68.7671 19.6321 69.7666 19.0276 70.9057 19.0276C72.0443 19.0276 73.0433 19.6315 73.6065 20.5397L73.0282 20.5399L72.4983 19.8925L71.9682 20.5401Z" fill="#6B4FBB"/>
+<path d="M69.8258 23.1357C70.0048 23.1357 70.1499 22.9905 70.1499 22.8114C70.1499 22.6323 70.0048 22.4871 69.8258 22.4871C69.6468 22.4871 69.5016 22.6323 69.5016 22.8114C69.5016 22.9905 69.6468 23.1357 69.8258 23.1357Z" fill="#6B4FBB"/>
+<path d="M72.2021 23.1357C72.3811 23.1357 72.5263 22.9905 72.5263 22.8114C72.5263 22.6323 72.3811 22.4871 72.2021 22.4871C72.0231 22.4871 71.878 22.6323 71.878 22.8114C71.878 22.9905 72.0231 23.1357 72.2021 23.1357Z" fill="#6B4FBB"/>
+<path d="M65.1797 9.29712H19.7999C18.6064 9.29712 17.6389 10.2652 17.6389 11.4593V45.189C17.6389 46.3831 18.6064 47.3511 19.7999 47.3511H65.1797C66.3731 47.3511 67.3406 46.3831 67.3406 45.189V11.4593C67.3406 10.2652 66.3731 9.29712 65.1797 9.29712Z" fill="white"/>
+<path d="M64.7466 9.72986H20.2311C19.0377 9.72986 18.0702 10.6979 18.0702 11.892V44.7568C18.0702 45.951 19.0377 46.919 20.2311 46.919H64.7466C65.94 46.919 66.9075 45.951 66.9075 44.7568V11.892C66.9075 10.6979 65.94 9.72986 64.7466 9.72986Z" stroke="#EEEEEE" stroke-width="2"/>
+<path d="M25.6338 18.8108C25.6338 18.572 25.4403 18.3784 25.2016 18.3784C24.9629 18.3784 24.7694 18.572 24.7694 18.8108V44.3243C24.7694 44.5632 24.9629 44.7568 25.2016 44.7568C25.4403 44.7568 25.6338 44.5632 25.6338 44.3243V18.8108Z" fill="#EEEEEE"/>
+<path d="M22.177 22.0541H20.8804C20.6417 22.0541 20.4482 22.2477 20.4482 22.4865C20.4482 22.7253 20.6417 22.9189 20.8804 22.9189H22.177C22.4157 22.9189 22.6092 22.7253 22.6092 22.4865C22.6092 22.2477 22.4157 22.0541 22.177 22.0541Z" fill="#FEE1D3"/>
+<path d="M22.177 24.6486H20.8804C20.6417 24.6486 20.4482 24.8422 20.4482 25.081C20.4482 25.3198 20.6417 25.5134 20.8804 25.5134H22.177C22.4157 25.5134 22.6092 25.3198 22.6092 25.081C22.6092 24.8422 22.4157 24.6486 22.177 24.6486Z" fill="#F0EDF8"/>
+<path d="M22.177 27.2432H20.8804C20.6417 27.2432 20.4482 27.4368 20.4482 27.6756C20.4482 27.9144 20.6417 28.108 20.8804 28.108H22.177C22.4157 28.108 22.6092 27.9144 22.6092 27.6756C22.6092 27.4368 22.4157 27.2432 22.177 27.2432Z" fill="#FEF0E9"/>
+<path d="M22.177 29.8379H20.8804C20.6417 29.8379 20.4482 30.0315 20.4482 30.2703C20.4482 30.5091 20.6417 30.7028 20.8804 30.7028H22.177C22.4157 30.7028 22.6092 30.5091 22.6092 30.2703C22.6092 30.0315 22.4157 29.8379 22.177 29.8379Z" fill="#FEE1D3"/>
+<path d="M22.177 32.4324H20.8804C20.6417 32.4324 20.4482 32.626 20.4482 32.8648C20.4482 33.1036 20.6417 33.2972 20.8804 33.2972H22.177C22.4157 33.2972 22.6092 33.1036 22.6092 32.8648C22.6092 32.626 22.4157 32.4324 22.177 32.4324Z" fill="#E1DBF1"/>
+<path d="M22.177 35.027H20.8804C20.6417 35.027 20.4482 35.2206 20.4482 35.4594C20.4482 35.6982 20.6417 35.8918 20.8804 35.8918H22.177C22.4157 35.8918 22.6092 35.6982 22.6092 35.4594C22.6092 35.2206 22.4157 35.027 22.177 35.027Z" fill="#F0EDF8"/>
+<path d="M22.177 37.6216H20.8804C20.6417 37.6216 20.4482 37.8152 20.4482 38.054C20.4482 38.2928 20.6417 38.4864 20.8804 38.4864H22.177C22.4157 38.4864 22.6092 38.2928 22.6092 38.054C22.6092 37.8152 22.4157 37.6216 22.177 37.6216Z" fill="#FEF0E9"/>
+<path d="M22.177 40.2161H20.8804C20.6417 40.2161 20.4482 40.4097 20.4482 40.6485C20.4482 40.8873 20.6417 41.0809 20.8804 41.0809H22.177C22.4157 41.0809 22.6092 40.8873 22.6092 40.6485C22.6092 40.4097 22.4157 40.2161 22.177 40.2161Z" fill="#FEE1D3"/>
+<path d="M32.1164 22.0538H29.9555C29.7168 22.0538 29.5233 22.2474 29.5233 22.4863C29.5233 22.7251 29.7168 22.9187 29.9555 22.9187H32.1164C32.3551 22.9187 32.5486 22.7251 32.5486 22.4863C32.5486 22.2474 32.3551 22.0538 32.1164 22.0538Z" fill="#6B4FBB"/>
+<path d="M36.439 22.0537H34.278C34.0393 22.0537 33.8458 22.2473 33.8458 22.4861C33.8458 22.725 34.0393 22.9186 34.278 22.9186H36.439C36.6776 22.9186 36.8711 22.725 36.8711 22.4861C36.8711 22.2473 36.6776 22.0537 36.439 22.0537Z" fill="#F0EDF8"/>
+<path d="M40.7601 22.0537H38.5992C38.3605 22.0537 38.167 22.2473 38.167 22.4861C38.167 22.725 38.3605 22.9186 38.5992 22.9186H40.7601C40.9988 22.9186 41.1923 22.725 41.1923 22.4861C41.1923 22.2473 40.9988 22.0537 40.7601 22.0537Z" fill="#FEF0E9"/>
+<path d="M32.1161 24.6484H29.9551C29.7164 24.6484 29.5229 24.842 29.5229 25.0809C29.5229 25.3197 29.7164 25.5133 29.9551 25.5133H32.1161C32.3548 25.5133 32.5483 25.3197 32.5483 25.0809C32.5483 24.842 32.3548 24.6484 32.1161 24.6484Z" fill="#F0EDF8"/>
+<path d="M40.7601 27.243H38.5992C38.3605 27.243 38.167 27.4366 38.167 27.6755C38.167 27.9143 38.3605 28.1079 38.5992 28.1079H40.7601C40.9988 28.1079 41.1923 27.9143 41.1923 27.6755C41.1923 27.4366 40.9988 27.243 40.7601 27.243Z" fill="#FEF0E9"/>
+<path d="M32.1161 32.4323H29.9551C29.7164 32.4323 29.5229 32.6259 29.5229 32.8647C29.5229 33.1035 29.7164 33.2971 29.9551 33.2971H32.1161C32.3548 33.2971 32.5483 33.1035 32.5483 32.8647C32.5483 32.6259 32.3548 32.4323 32.1161 32.4323Z" fill="#E1DBF1"/>
+<path d="M40.7601 29.8378H38.5992C38.3605 29.8378 38.167 30.0314 38.167 30.2702C38.167 30.509 38.3605 30.7026 38.5992 30.7026H40.7601C40.9988 30.7026 41.1923 30.509 41.1923 30.2702C41.1923 30.0314 40.9988 29.8378 40.7601 29.8378Z" fill="#FEF0E9"/>
+<path d="M34.9263 24.6484H34.278C34.0393 24.6484 33.8458 24.842 33.8458 25.0809C33.8458 25.3197 34.0393 25.5133 34.278 25.5133H34.9263C35.165 25.5133 35.3585 25.3197 35.3585 25.0809C35.3585 24.842 35.165 24.6484 34.9263 24.6484Z" fill="#FEE1D3"/>
+<path d="M36.4379 29.8378H35.7896C35.5509 29.8378 35.3574 30.0314 35.3574 30.2702C35.3574 30.509 35.5509 30.7026 35.7896 30.7026H36.4379C36.6766 30.7026 36.8701 30.509 36.8701 30.2702C36.8701 30.0314 36.6766 29.8378 36.4379 29.8378Z" fill="#6B4FBB"/>
+<path d="M34.9263 32.4323H34.278C34.0393 32.4323 33.8458 32.6259 33.8458 32.8647C33.8458 33.1035 34.0393 33.2971 34.278 33.2971H34.9263C35.165 33.2971 35.3585 33.1035 35.3585 32.8647C35.3585 32.6259 35.165 32.4323 34.9263 32.4323Z" fill="#FEE1D3"/>
+<path d="M30.6034 27.243H29.9551C29.7164 27.243 29.5229 27.4366 29.5229 27.6755C29.5229 27.9143 29.7164 28.1079 29.9551 28.1079H30.6034C30.8421 28.1079 31.0356 27.9143 31.0356 27.6755C31.0356 27.4366 30.8421 27.243 30.6034 27.243Z" fill="#FC6D26"/>
+<path d="M36.4383 27.243H32.7647C32.526 27.243 32.3325 27.4366 32.3325 27.6755C32.3325 27.9143 32.526 28.1079 32.7647 28.1079H36.4383C36.677 28.1079 36.8705 27.9143 36.8705 27.6755C36.8705 27.4366 36.677 27.243 36.4383 27.243Z" fill="#E1DBF1"/>
+<path d="M33.6287 29.8378H29.9551C29.7164 29.8378 29.5229 30.0314 29.5229 30.2702C29.5229 30.509 29.7164 30.7026 29.9551 30.7026H33.6287C33.8674 30.7026 34.0609 30.509 34.0609 30.2702C34.0609 30.0314 33.8674 29.8378 33.6287 29.8378Z" fill="#EEEEEE"/>
+<path d="M37.7342 24.6484H37.0859C36.8472 24.6484 36.6537 24.842 36.6537 25.0809C36.6537 25.3197 36.8472 25.5133 37.0859 25.5133H37.7342C37.9728 25.5133 38.1663 25.3197 38.1663 25.0809C38.1663 24.842 37.9728 24.6484 37.7342 24.6484Z" fill="#6B4FBB"/>
+<path d="M53.2933 22.054H51.1323C50.8936 22.054 50.7001 22.2476 50.7001 22.4864C50.7001 22.7252 50.8936 22.9188 51.1323 22.9188H53.2933C53.532 22.9188 53.7254 22.7252 53.7254 22.4864C53.7254 22.2476 53.532 22.054 53.2933 22.054Z" fill="#FEE1D3"/>
+<path d="M57.6143 22.054H55.4533C55.2146 22.054 55.0211 22.2476 55.0211 22.4864C55.0211 22.7252 55.2146 22.9188 55.4533 22.9188H57.6143C57.8529 22.9188 58.0464 22.7252 58.0464 22.4864C58.0464 22.2476 57.8529 22.054 57.6143 22.054Z" fill="#F0EDF8"/>
+<path d="M61.9367 22.054H59.7758C59.5371 22.054 59.3436 22.2476 59.3436 22.4864C59.3436 22.7252 59.5371 22.9188 59.7758 22.9188H61.9367C62.1754 22.9188 62.3689 22.7252 62.3689 22.4864C62.3689 22.2476 62.1754 22.054 61.9367 22.054Z" fill="#FC6D26"/>
+<path d="M53.2931 24.6486H51.1321C50.8934 24.6486 50.7 24.8422 50.7 25.081C50.7 25.3198 50.8934 25.5134 51.1321 25.5134H53.2931C53.5318 25.5134 53.7253 25.3198 53.7253 25.081C53.7253 24.8422 53.5318 24.6486 53.2931 24.6486Z" fill="#FEF0E9"/>
+<path d="M61.9367 27.2432H59.7758C59.5371 27.2432 59.3436 27.4368 59.3436 27.6756C59.3436 27.9144 59.5371 28.108 59.7758 28.108H61.9367C62.1754 28.108 62.3689 27.9144 62.3689 27.6756C62.3689 27.4368 62.1754 27.2432 61.9367 27.2432Z" fill="#E1DBF1"/>
+<path d="M53.2931 32.4324H51.1321C50.8934 32.4324 50.7 32.626 50.7 32.8648C50.7 33.1036 50.8934 33.2972 51.1321 33.2972H53.2931C53.5318 33.2972 53.7253 33.1036 53.7253 32.8648C53.7253 32.626 53.5318 32.4324 53.2931 32.4324Z" fill="#F0EDF8"/>
+<path d="M61.9367 29.8378H59.7758C59.5371 29.8378 59.3436 30.0314 59.3436 30.2702C59.3436 30.509 59.5371 30.7026 59.7758 30.7026H61.9367C62.1754 30.7026 62.3689 30.509 62.3689 30.2702C62.3689 30.0314 62.1754 29.8378 61.9367 29.8378Z" fill="#FEE1D3"/>
+<path d="M56.1016 24.6486H55.4533C55.2146 24.6486 55.0211 24.8422 55.0211 25.081C55.0211 25.3198 55.2146 25.5134 55.4533 25.5134H56.1016C56.3403 25.5134 56.5338 25.3198 56.5338 25.081C56.5338 24.8422 56.3403 24.6486 56.1016 24.6486Z" fill="#FC6D26"/>
+<path d="M57.6149 29.8378H56.9666C56.7279 29.8378 56.5344 30.0314 56.5344 30.2702C56.5344 30.509 56.7279 30.7026 56.9666 30.7026H57.6149C57.8536 30.7026 58.0471 30.509 58.0471 30.2702C58.0471 30.0314 57.8536 29.8378 57.6149 29.8378Z" fill="#6B4FBB"/>
+<path d="M56.1016 32.4324H55.4533C55.2146 32.4324 55.0211 32.626 55.0211 32.8648C55.0211 33.1036 55.2146 33.2972 55.4533 33.2972H56.1016C56.3403 33.2972 56.5338 33.1036 56.5338 32.8648C56.5338 32.626 56.3403 32.4324 56.1016 32.4324Z" fill="#FC6D26"/>
+<path d="M51.7804 27.2432H51.1321C50.8934 27.2432 50.7 27.4368 50.7 27.6756C50.7 27.9144 50.8934 28.108 51.1321 28.108H51.7804C52.0191 28.108 52.2126 27.9144 52.2126 27.6756C52.2126 27.4368 52.0191 27.2432 51.7804 27.2432Z" fill="#6B4FBB"/>
+<path d="M57.6153 27.2432H53.9417C53.703 27.2432 53.5095 27.4368 53.5095 27.6756C53.5095 27.9144 53.703 28.108 53.9417 28.108H57.6153C57.854 28.108 58.0475 27.9144 58.0475 27.6756C58.0475 27.4368 57.854 27.2432 57.6153 27.2432Z" fill="#FEE1D3"/>
+<path d="M54.8057 29.8378H51.1321C50.8934 29.8378 50.7 30.0314 50.7 30.2702C50.7 30.509 50.8934 30.7026 51.1321 30.7026H54.8057C55.0444 30.7026 55.2379 30.509 55.2379 30.2702C55.2379 30.0314 55.0444 29.8378 54.8057 29.8378Z" fill="#FEF0E9"/>
+<path d="M58.9112 24.6486H58.2629C58.0242 24.6486 57.8307 24.8422 57.8307 25.081C57.8307 25.3198 58.0242 25.5134 58.2629 25.5134H58.9112C59.1499 25.5134 59.3433 25.3198 59.3433 25.081C59.3433 24.8422 59.1499 24.6486 58.9112 24.6486Z" fill="#6B4FBB"/>
+<path d="M32.1163 35.027H29.9553C29.7166 35.027 29.5231 35.2206 29.5231 35.4594C29.5231 35.6982 29.7166 35.8918 29.9553 35.8918H32.1163C32.355 35.8918 32.5484 35.6982 32.5484 35.4594C32.5484 35.2206 32.355 35.027 32.1163 35.027Z" fill="#F0EDF8"/>
+<path d="M36.4372 35.027H34.2763C34.0376 35.027 33.8441 35.2206 33.8441 35.4594C33.8441 35.6982 34.0376 35.8918 34.2763 35.8918H36.4372C36.6759 35.8918 36.8694 35.6982 36.8694 35.4594C36.8694 35.2206 36.6759 35.027 36.4372 35.027Z" fill="#6B4FBB"/>
+<path d="M40.7597 35.027H38.5988C38.3601 35.027 38.1666 35.2206 38.1666 35.4594C38.1666 35.6982 38.3601 35.8918 38.5988 35.8918H40.7597C40.9984 35.8918 41.1919 35.6982 41.1919 35.4594C41.1919 35.2206 40.9984 35.027 40.7597 35.027Z" fill="#E1DBF1"/>
+<path d="M32.1161 37.6216H29.9551C29.7164 37.6216 29.5229 37.8152 29.5229 38.054C29.5229 38.2928 29.7164 38.4864 29.9551 38.4864H32.1161C32.3548 38.4864 32.5483 38.2928 32.5483 38.054C32.5483 37.8152 32.3548 37.6216 32.1161 37.6216Z" fill="#FEF0E9"/>
+<path d="M40.7597 40.2161H38.5988C38.3601 40.2161 38.1666 40.4097 38.1666 40.6485C38.1666 40.8873 38.3601 41.0809 38.5988 41.0809H40.7597C40.9984 41.0809 41.1919 40.8873 41.1919 40.6485C41.1919 40.4097 40.9984 40.2161 40.7597 40.2161Z" fill="#FEE1D3"/>
+<path d="M34.9246 37.6216H34.2763C34.0376 37.6216 33.8441 37.8152 33.8441 38.054C33.8441 38.2928 34.0376 38.4864 34.2763 38.4864H34.9246C35.1633 38.4864 35.3568 38.2928 35.3568 38.054C35.3568 37.8152 35.1633 37.6216 34.9246 37.6216Z" fill="#EEEEEE"/>
+<path d="M30.6034 40.2161H29.9551C29.7164 40.2161 29.5229 40.4097 29.5229 40.6485C29.5229 40.8873 29.7164 41.0809 29.9551 41.0809H30.6034C30.8421 41.0809 31.0356 40.8873 31.0356 40.6485C31.0356 40.4097 30.8421 40.2161 30.6034 40.2161Z" fill="#6B4FBB"/>
+<path d="M36.4383 40.2161H32.7647C32.526 40.2161 32.3325 40.4097 32.3325 40.6485C32.3325 40.8873 32.526 41.0809 32.7647 41.0809H36.4383C36.677 41.0809 36.8705 40.8873 36.8705 40.6485C36.8705 40.4097 36.677 40.2161 36.4383 40.2161Z" fill="#FEF0E9"/>
+<path d="M37.7342 37.6216H37.0859C36.8472 37.6216 36.6537 37.8152 36.6537 38.054C36.6537 38.2928 36.8472 38.4864 37.0859 38.4864H37.7342C37.9728 38.4864 38.1663 38.2928 38.1663 38.054C38.1663 37.8152 37.9728 37.6216 37.7342 37.6216Z" fill="#FC6D26"/>
+<path d="M46.3791 25.2972C46.3791 25.0584 46.1856 24.8647 45.947 24.8647C45.7083 24.8647 45.5148 25.0584 45.5148 25.2972V38.0539C45.5148 38.2927 45.7083 38.4863 45.947 38.4863C46.1856 38.4863 46.3791 38.2927 46.3791 38.0539V25.2972Z" fill="#EEEEEE"/>
+<path d="M66.9082 15.135H18.0709C17.8322 15.135 17.6387 15.3286 17.6387 15.5674C17.6387 15.8063 17.8322 15.9999 18.0709 15.9999H66.9082C67.1469 15.9999 67.3404 15.8063 67.3404 15.5674C67.3404 15.3286 67.1469 15.135 66.9082 15.135Z" fill="#EEEEEE"/>
+<path d="M55.8884 55.3513C59.5881 55.3513 62.5874 52.3504 62.5874 48.6486C62.5874 44.9468 59.5881 41.9459 55.8884 41.9459C52.1887 41.9459 49.1895 44.9468 49.1895 48.6486C49.1895 52.3504 52.1887 55.3513 55.8884 55.3513Z" fill="white"/>
+<path d="M55.8878 54.9188C59.3489 54.9188 62.1546 52.1115 62.1546 48.6486C62.1546 45.1856 59.3489 42.3783 55.8878 42.3783C52.4268 42.3783 49.6211 45.1856 49.6211 48.6486C49.6211 52.1115 52.4268 54.9188 55.8878 54.9188Z" stroke="#EEEEEE" stroke-width="2"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M55.457 48.2161V46.9188C55.457 46.6799 55.6505 46.4863 55.8892 46.4863C56.1278 46.4863 56.3213 46.6799 56.3213 46.9188V48.2161H57.6179C57.8566 48.2161 58.0501 48.4097 58.0501 48.6485C58.0501 48.8873 57.8566 49.0809 57.6179 49.0809H56.3213V50.3782C56.3213 50.617 56.1278 50.8106 55.8892 50.8106C55.6505 50.8106 55.457 50.617 55.457 50.3782V49.0809H54.1604C53.9217 49.0809 53.7282 48.8873 53.7282 48.6485C53.7282 48.4097 53.9217 48.2161 54.1604 48.2161H55.457Z" fill="#FC6D26"/>
+</svg>
diff --git a/app/assets/images/learn_gitlab/security_scan_enabled.svg b/app/assets/images/learn_gitlab/security_scan_enabled.svg
new file mode 100644
index 00000000000..eea0693484c
--- /dev/null
+++ b/app/assets/images/learn_gitlab/security_scan_enabled.svg
@@ -0,0 +1,36 @@
+<svg width="47" height="47" viewBox="0 0 47 47" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M23.0588 47C35.7939 47 46.1176 36.6762 46.1176 23.9411C46.1176 11.2061 35.7939 0.882324 23.0588 0.882324C10.3238 0.882324 0 11.2061 0 23.9411C0 36.6762 10.3238 47 23.0588 47Z" fill="#EEEEEE"/>
+<path d="M23.0588 45.1176C34.7542 45.1176 44.2353 35.6366 44.2353 23.9411C44.2353 12.2457 34.7542 2.76465 23.0588 2.76465C11.3634 2.76465 1.88232 12.2457 1.88232 23.9411C1.88232 35.6366 11.3634 45.1176 23.0588 45.1176Z" fill="white"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M16.3292 14.5295H16.9802C17.4786 14.5295 17.8827 14.9336 17.8827 15.432V16.8825C17.8827 17.4023 17.4613 17.8237 16.9415 17.8237H13.6556C13.1683 17.8237 12.7732 17.4286 12.7732 16.9413C12.7732 16.6257 12.9419 16.334 13.2155 16.1766L15.8598 14.655C16.0026 14.5728 16.1644 14.5295 16.3292 14.5295ZM12.2356 23.0001H16.9415C17.4613 23.0001 17.8827 23.4215 17.8827 23.9413V25.3531C17.8827 25.8729 17.4613 26.2942 16.9415 26.2942H12.2356C11.7158 26.2942 11.2944 25.8729 11.2944 25.3531V23.9413C11.2944 23.4215 11.7158 23.0001 12.2356 23.0001Z" fill="#EFEDF8"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M6.11793 18.7649H10.8238C11.3436 18.7649 11.765 19.1863 11.765 19.7061V21.1178C11.765 21.6376 11.3436 22.059 10.8238 22.059H6.11793C5.59814 22.059 5.17676 21.6376 5.17676 21.1178V19.7061C5.17676 19.1863 5.59814 18.7649 6.11793 18.7649Z" fill="#F9E2D5"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M40.4709 18.7649H35.765C35.2452 18.7649 34.8239 19.1863 34.8239 19.7061V21.1178C34.8239 21.6376 35.2452 22.059 35.765 22.059H40.4709C40.9907 22.059 41.4121 21.6376 41.4121 21.1178V19.7061C41.4121 19.1863 40.9907 18.7649 40.4709 18.7649Z" fill="#F9E2D5"/>
+<path d="M16.9415 31.0002H12.2356C11.7158 31.0002 11.2944 31.4216 11.2944 31.9414V33.3532C11.2944 33.873 11.7158 34.2944 12.2356 34.2944H16.9415C17.4613 34.2944 17.8827 33.873 17.8827 33.3532V31.9414C17.8827 31.4216 17.4613 31.0002 16.9415 31.0002Z" fill="#F9E2D5"/>
+<path d="M29.6474 31.0002H34.3533C34.8731 31.0002 35.2944 31.4216 35.2944 31.9414V33.3532C35.2944 33.873 34.8731 34.2944 34.3533 34.2944H29.6474C29.1276 34.2944 28.7062 33.873 28.7062 33.3532V31.9414C28.7062 31.4216 29.1276 31.0002 29.6474 31.0002Z" fill="#F9E2D5"/>
+<path d="M9.41202 31.0002H8.00026C7.48046 31.0002 7.05908 31.4216 7.05908 31.9414V33.3532C7.05908 33.873 7.48046 34.2944 8.00026 34.2944H9.41202C9.93182 34.2944 10.3532 33.873 10.3532 33.3532V31.9414C10.3532 31.4216 9.93182 31.0002 9.41202 31.0002Z" fill="#F9E2D5"/>
+<path d="M37.1768 31.0002H38.5886C39.1084 31.0002 39.5298 31.4216 39.5298 31.9414V33.3532C39.5298 33.873 39.1084 34.2944 38.5886 34.2944H37.1768C36.657 34.2944 36.2357 33.873 36.2357 33.3532V31.9414C36.2357 31.4216 36.657 31.0002 37.1768 31.0002Z" fill="#F9E2D5"/>
+<path d="M9.41202 23.0002H8.00026C7.48046 23.0002 7.05908 23.4216 7.05908 23.9414V25.3532C7.05908 25.873 7.48046 26.2944 8.00026 26.2944H9.41202C9.93182 26.2944 10.3532 25.873 10.3532 25.3532V23.9414C10.3532 23.4216 9.93182 23.0002 9.41202 23.0002Z" fill="#F9E2D5"/>
+<path d="M37.1768 23.0002H38.5886C39.1084 23.0002 39.5298 23.4216 39.5298 23.9414V25.3532C39.5298 25.873 39.1084 26.2944 38.5886 26.2944H37.1768C36.657 26.2944 36.2357 25.873 36.2357 25.3532V23.9414C36.2357 23.4216 36.657 23.0002 37.1768 23.0002Z" fill="#F9E2D5"/>
+<path d="M9.41202 14.5295H8.00026C7.48046 14.5295 7.05908 14.9509 7.05908 15.4707V16.8825C7.05908 17.4023 7.48046 17.8237 8.00026 17.8237H9.41202C9.93182 17.8237 10.3532 17.4023 10.3532 16.8825V15.4707C10.3532 14.9509 9.93182 14.5295 9.41202 14.5295Z" fill="#F9E2D5"/>
+<path d="M37.1768 14.5295H38.5886C39.1084 14.5295 39.5298 14.9509 39.5298 15.4707V16.8825C39.5298 17.4023 39.1084 17.8237 38.5886 17.8237H37.1768C36.657 17.8237 36.2357 17.4023 36.2357 16.8825V15.4707C36.2357 14.9509 36.657 14.5295 37.1768 14.5295Z" fill="#F9E2D5"/>
+<path d="M10.8238 26.7649H6.11793C5.59814 26.7649 5.17676 27.1863 5.17676 27.7061V29.1178C5.17676 29.6376 5.59814 30.059 6.11793 30.059H10.8238C11.3436 30.059 11.765 29.6376 11.765 29.1178V27.7061C11.765 27.1863 11.3436 26.7649 10.8238 26.7649Z" fill="#F9E2D5"/>
+<path d="M35.765 26.7649H40.4709C40.9907 26.7649 41.4121 27.1863 41.4121 27.7061V29.1178C41.4121 29.6376 40.9907 30.059 40.4709 30.059H35.765C35.2452 30.059 34.8239 29.6376 34.8239 29.1178V27.7061C34.8239 27.1863 35.2452 26.7649 35.765 26.7649Z" fill="#F9E2D5"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M12.2356 14.5295H16.9415C17.4613 14.5295 17.8827 14.9509 17.8827 15.4707V16.8825C17.8827 17.4023 17.4613 17.8237 16.9415 17.8237H12.2356C11.7158 17.8237 11.2944 17.4023 11.2944 16.8825V15.4707C11.2944 14.9509 11.7158 14.5295 12.2356 14.5295Z" fill="#EFEDF8"/>
+<path d="M28.2354 14.5295H23.5296C23.0098 14.5295 22.5884 14.9509 22.5884 15.4707V16.8825C22.5884 17.4023 23.0098 17.8237 23.5296 17.8237H28.2354C28.7552 17.8237 29.1766 17.4023 29.1766 16.8825V15.4707C29.1766 14.9509 28.7552 14.5295 28.2354 14.5295Z" fill="#EFEDF8"/>
+<path d="M28.2354 23.0002H23.5296C23.0098 23.0002 22.5884 23.4216 22.5884 23.9414V25.3532C22.5884 25.873 23.0098 26.2944 23.5296 26.2944H28.2354C28.7552 26.2944 29.1766 25.873 29.1766 25.3532V23.9414C29.1766 23.4216 28.7552 23.0002 28.2354 23.0002Z" fill="#EFEDF8"/>
+<path d="M32.0002 26.7649H29.6472C29.1274 26.7649 28.7061 27.1863 28.7061 27.7061V29.1178C28.7061 29.6376 29.1274 30.059 29.6472 30.059H32.0002C32.52 30.059 32.9413 29.6376 32.9413 29.1178V27.7061C32.9413 27.1863 32.52 26.7649 32.0002 26.7649Z" fill="#EFEDF8"/>
+<path d="M22.5885 18.7649H17.8826C17.3628 18.7649 16.9414 19.1863 16.9414 19.7061V21.1178C16.9414 21.6376 17.3628 22.059 17.8826 22.059H22.5885C23.1083 22.059 23.5296 21.6376 23.5296 21.1178V19.7061C23.5296 19.1863 23.1083 18.7649 22.5885 18.7649Z" fill="#EFEDF8"/>
+<path d="M21.1767 14.5295H19.7649C19.2451 14.5295 18.8237 14.9509 18.8237 15.4707V16.8825C18.8237 17.4023 19.2451 17.8237 19.7649 17.8237H21.1767C21.6965 17.8237 22.1178 17.4023 22.1178 16.8825V15.4707C22.1178 14.9509 21.6965 14.5295 21.1767 14.5295Z" fill="#EFEDF8"/>
+<path d="M21.1767 23.0002H19.7649C19.2451 23.0002 18.8237 23.4216 18.8237 23.9414V25.3532C18.8237 25.873 19.2451 26.2944 19.7649 26.2944H21.1767C21.6965 26.2944 22.1178 25.873 22.1178 25.3532V23.9414C22.1178 23.4216 21.6965 23.0002 21.1767 23.0002Z" fill="#EFEDF8"/>
+<path d="M15.059 26.7649H13.6472C13.1274 26.7649 12.7061 27.1863 12.7061 27.7061V29.1178C12.7061 29.6376 13.1274 30.059 13.6472 30.059H15.059C15.5788 30.059 16.0002 29.6376 16.0002 29.1178V27.7061C16.0002 27.1863 15.5788 26.7649 15.059 26.7649Z" fill="#EFEDF8"/>
+<path d="M21.1767 31.0002H19.7649C19.2451 31.0002 18.8237 31.4216 18.8237 31.9414V33.3532C18.8237 33.873 19.2451 34.2944 19.7649 34.2944H21.1767C21.6965 34.2944 22.1178 33.873 22.1178 33.3532V31.9414C22.1178 31.4216 21.6965 31.0002 21.1767 31.0002Z" fill="#EFEDF8"/>
+<path d="M32.4706 23.0002H31.0589C30.5391 23.0002 30.1177 23.4216 30.1177 23.9414V25.3532C30.1177 25.873 30.5391 26.2944 31.0589 26.2944H32.4706C32.9904 26.2944 33.4118 25.873 33.4118 25.3532V23.9414C33.4118 23.4216 32.9904 23.0002 32.4706 23.0002Z" fill="#EFEDF8"/>
+<path d="M15.059 18.7649H13.6472C13.1274 18.7649 12.7061 19.1863 12.7061 19.7061V21.1178C12.7061 21.6376 13.1274 22.059 13.6472 22.059H15.059C15.5788 22.059 16.0002 21.6376 16.0002 21.1178V19.7061C16.0002 19.1863 15.5788 18.7649 15.059 18.7649Z" fill="#EFEDF8"/>
+<path d="M26.8241 18.7649H25.4124C24.8926 18.7649 24.4712 19.1863 24.4712 19.7061V21.1178C24.4712 21.6376 24.8926 22.059 25.4124 22.059H26.8241C27.3439 22.059 27.7653 21.6376 27.7653 21.1178V19.7061C27.7653 19.1863 27.3439 18.7649 26.8241 18.7649Z" fill="#EFEDF8"/>
+<path d="M32.4706 14.5295H31.0589C30.5391 14.5295 30.1177 14.9509 30.1177 15.4707V16.8825C30.1177 17.4023 30.5391 17.8237 31.0589 17.8237H32.4706C32.9904 17.8237 33.4118 17.4023 33.4118 16.8825V15.4707C33.4118 14.9509 32.9904 14.5295 32.4706 14.5295Z" fill="#EFEDF8"/>
+<path d="M34.3531 18.7649H29.6472C29.1274 18.7649 28.7061 19.1863 28.7061 19.7061V21.1178C28.7061 21.6376 29.1274 22.059 29.6472 22.059H34.3531C34.8729 22.059 35.2943 21.6376 35.2943 21.1178V19.7061C35.2943 19.1863 34.8729 18.7649 34.3531 18.7649Z" fill="#EFEDF8"/>
+<path d="M22.5885 26.7649H17.8826C17.3628 26.7649 16.9414 27.1863 16.9414 27.7061V29.1178C16.9414 29.6376 17.3628 30.059 17.8826 30.059H22.5885C23.1083 30.059 23.5296 29.6376 23.5296 29.1178V27.7061C23.5296 27.1863 23.1083 26.7649 22.5885 26.7649Z" fill="#EFEDF8"/>
+<path d="M28.2354 31.0002H23.5296C23.0098 31.0002 22.5884 31.4216 22.5884 31.9414V33.3532C22.5884 33.873 23.0098 34.2944 23.5296 34.2944H28.2354C28.7552 34.2944 29.1766 33.873 29.1766 33.3532V31.9414C29.1766 31.4216 28.7552 31.0002 28.2354 31.0002Z" fill="#EFEDF8"/>
+<path d="M26.8241 26.7649H25.4124C24.8926 26.7649 24.4712 27.1863 24.4712 27.7061V29.1178C24.4712 29.6376 24.8926 30.059 25.4124 30.059H26.8241C27.3439 30.059 27.7653 29.6376 27.7653 29.1178V27.7061C27.7653 27.1863 27.3439 26.7649 26.8241 26.7649Z" fill="#EFEDF8"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M23.5516 10.3323L36.0222 13.8791C36.4267 13.9942 36.7059 14.3638 36.7059 14.7844V21.1043C36.7059 25.151 35.0909 29.032 32.2166 31.8933L23.9581 40.1143C23.5909 40.4798 22.9973 40.4798 22.6301 40.1143L14.3717 31.8933C11.4972 29.032 9.88232 25.151 9.88232 21.1043V14.7844C9.88232 14.3638 10.1614 13.9942 10.566 13.8791L23.0366 10.3323C23.2049 10.2844 23.3833 10.2844 23.5516 10.3323ZM23.1301 12.4046L11.9603 15.5579C11.7575 15.6151 11.6175 15.8001 11.6175 16.0108V20.6639C11.6175 24.3243 13.0892 27.8348 15.7088 30.4231L22.9272 37.5553C23.1105 37.7364 23.4054 37.7364 23.5887 37.5553L30.807 30.4231C33.4268 27.8348 34.8983 24.3243 34.8983 20.6639V16.0108C34.8983 15.8001 34.7583 15.6151 34.5556 15.5579L23.3858 12.4046C23.3022 12.381 23.2137 12.381 23.1301 12.4046Z" fill="white"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M23.3165 11.7436L34.14 14.8206C34.5447 14.9356 34.8238 15.3052 34.8238 15.7259V21.1793C34.8238 24.7274 33.4072 28.1301 30.8859 30.6389L23.723 37.7659C23.3558 38.1312 22.7625 38.1312 22.3953 37.7659L15.2325 30.6389C12.711 28.1301 11.2944 24.7274 11.2944 21.1793V15.7259C11.2944 15.3052 11.5736 14.9356 11.9782 14.8206L22.8018 11.7436C22.97 11.6958 23.1483 11.6958 23.3165 11.7436ZM22.8996 13.5561L13.1593 16.3045C12.9566 16.3617 12.8166 16.5467 12.8166 16.7574V20.7932C12.8166 24.0026 14.1075 27.0805 16.4054 29.3498L22.6968 35.5631C22.88 35.7442 23.1748 35.7442 23.3581 35.5631L29.6494 29.3498C31.9474 27.0805 33.2383 24.0026 33.2383 20.7932V16.7574C33.2383 16.5467 33.0983 16.3617 32.8955 16.3045L23.1552 13.5561C23.0717 13.5325 22.9832 13.5325 22.8996 13.5561Z" fill="#6E49CB"/>
+</svg>
diff --git a/app/assets/images/learn_gitlab/trial_started.svg b/app/assets/images/learn_gitlab/trial_started.svg
new file mode 100644
index 00000000000..42d6fb6c013
--- /dev/null
+++ b/app/assets/images/learn_gitlab/trial_started.svg
@@ -0,0 +1,9 @@
+<svg width="32" height="30" viewBox="0 0 32 30" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M15.9653 29.8263L21.8368 11.6285H10.0933L15.9653 29.8263Z" fill="#E38800"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M15.9656 29.8263L10.0936 11.6285H1.86475L15.9656 29.8263Z" fill="#F7980A"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M1.86441 11.6285L0.0800968 17.1586C-0.0826524 17.663 0.0955967 18.2156 0.521693 18.5273L15.9652 29.8261L1.86441 11.6285Z" fill="#FCA326"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M1.86426 11.6286H10.0933L6.55678 0.668335C6.37489 0.104294 5.58257 0.104447 5.40067 0.668335L1.86426 11.6286Z" fill="#E38800"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M15.9653 29.8263L21.8369 11.6285H30.0658L15.9653 29.8263Z" fill="#F7980A"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M30.0662 11.6285L31.8505 17.1586C32.0132 17.663 31.835 18.2156 31.4089 18.5273L15.9653 29.8261L30.0662 11.6285Z" fill="#FCA326"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M30.066 11.6286H21.8369L25.3735 0.668335C25.5554 0.104294 26.3477 0.104447 26.5296 0.668335L30.066 11.6286Z" fill="#E38800"/>
+</svg>
diff --git a/app/assets/images/learn_gitlab/user_added.svg b/app/assets/images/learn_gitlab/user_added.svg
new file mode 100644
index 00000000000..efbccff0bbb
--- /dev/null
+++ b/app/assets/images/learn_gitlab/user_added.svg
@@ -0,0 +1,4 @@
+<svg width="38" height="24" viewBox="0 0 38 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M33.6353 7.51765H33.8824L32.4706 5.80941L31.0588 7.50353L29.6471 5.80941L28.2353 7.50353L26.8235 5.80941L25.4118 7.50353L24 5.80941L22.5882 7.51765H23.1318C23.6965 8.89412 24 10.4118 24 12C24 14.0047 23.5059 15.8824 22.6447 17.5482C24.0353 19.1576 26.0541 20.1176 28.2353 20.1176C32.3294 20.1176 35.6471 16.7718 35.6471 12.6353C35.6471 10.6588 34.8847 8.85177 33.6353 7.51765ZM22.0094 5.36471C23.7035 3.88235 25.9059 3.03529 28.2353 3.03529C33.5012 3.03529 37.7647 7.34118 37.7647 12.6353C37.7647 17.9294 33.5012 22.2353 28.2353 22.2353C25.6376 22.2353 23.2235 21.1765 21.4588 19.3835C19.2706 22.1929 15.84 24 12 24C5.36471 24 0 18.6353 0 12C0 5.36471 5.36471 0 12 0C14.2729 0 16.3976 0.635295 18.2118 1.72941C19.7153 2.64706 21.0141 3.88235 22.0094 5.37177V5.36471ZM3.52941 8.47059C3.07059 9.55765 2.82353 10.7506 2.82353 12C2.82353 17.0682 6.93177 21.1765 12 21.1765C17.0682 21.1765 21.1765 17.0682 21.1765 12C21.1765 10.7506 20.9294 9.55765 20.4706 8.47059H14.1176C13.7435 8.47059 13.3835 8.32941 13.1294 8.04706L12 6.94588L10.8706 8.06118C10.6165 8.34353 10.2565 8.48471 9.88235 8.48471H3.52941V8.47059ZM18.6212 5.64706C16.9271 3.88235 14.5553 2.82353 12 2.82353C9.44471 2.82353 7.07294 3.88235 5.37882 5.64706H9.29647L11.0047 3.95294C11.5271 3.38824 12.4165 3.38824 12.9812 3.95294L14.6753 5.64706H18.5859H18.6212Z" fill="#E1DBF2"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M25.1292 14.3435C24.6633 14.3435 24.2821 13.9623 24.2821 13.4964C24.2821 13.0164 24.6633 12.6353 25.1292 12.6353C25.5951 12.6353 25.9762 13.0164 25.9762 13.4823C25.9762 13.9623 25.5951 14.3435 25.1292 14.3435ZM31.3409 14.3435C30.8751 14.3435 30.4939 13.9623 30.4939 13.4964C30.4939 13.0164 30.8751 12.6353 31.3409 12.6353C31.8068 12.6353 32.188 13.0164 32.188 13.4823C32.188 13.9623 31.8068 14.3435 31.3409 14.3435ZM9.17624 15.5294H14.8233C14.8233 17.0823 13.5527 18.3529 11.9998 18.3529C10.4468 18.3529 9.17624 17.0823 9.17624 15.5294ZM8.11742 14.8235C7.53153 14.8235 7.05859 14.3505 7.05859 13.7647C7.05859 13.1788 7.53153 12.7058 8.11742 12.7058C8.7033 12.7058 9.17624 13.1788 9.17624 13.7647C9.17624 14.3505 8.7033 14.8235 8.11742 14.8235ZM15.8821 14.8235C15.2962 14.8235 14.8233 14.3505 14.8233 13.7647C14.8233 13.1788 15.2962 12.7058 15.8821 12.7058C16.468 12.7058 16.9409 13.1788 16.9409 13.7647C16.9409 14.3505 16.468 14.8235 15.8821 14.8235Z" fill="#6B4FBB"/>
+</svg>
diff --git a/app/assets/javascripts/access_tokens/components/projects_field.vue b/app/assets/javascripts/access_tokens/components/projects_field.vue
new file mode 100644
index 00000000000..066cea5e90c
--- /dev/null
+++ b/app/assets/javascripts/access_tokens/components/projects_field.vue
@@ -0,0 +1,69 @@
+<script>
+import { GlFormGroup, GlFormRadio, GlFormText } from '@gitlab/ui';
+import ProjectsTokenSelector from './projects_token_selector.vue';
+
+export default {
+ name: 'ProjectsField',
+ ALL_PROJECTS: 'ALL_PROJECTS',
+ SELECTED_PROJECTS: 'SELECTED_PROJECTS',
+ components: { GlFormGroup, GlFormRadio, GlFormText, ProjectsTokenSelector },
+ props: {
+ inputAttrs: {
+ type: Object,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ selectedRadio: !this.inputAttrs.value
+ ? this.$options.ALL_PROJECTS
+ : this.$options.SELECTED_PROJECTS,
+ selectedProjects: [],
+ };
+ },
+ computed: {
+ allProjectsRadioSelected() {
+ return this.selectedRadio === this.$options.ALL_PROJECTS;
+ },
+ hiddenInputValue() {
+ return this.allProjectsRadioSelected
+ ? null
+ : this.selectedProjects.map((project) => project.id).join(',');
+ },
+ initialProjectIds() {
+ if (!this.inputAttrs.value) {
+ return [];
+ }
+
+ return this.inputAttrs.value.split(',');
+ },
+ },
+ methods: {
+ handleTokenSelectorFocus() {
+ this.selectedRadio = this.$options.SELECTED_PROJECTS;
+ },
+ },
+};
+</script>
+
+<template>
+ <div>
+ <gl-form-group :label="__('Projects')" label-class="gl-pb-0!">
+ <gl-form-text class="gl-pb-3">{{
+ __('Set access permissions for this token.')
+ }}</gl-form-text>
+ <gl-form-radio v-model="selectedRadio" :value="$options.ALL_PROJECTS">{{
+ __('All projects')
+ }}</gl-form-radio>
+ <gl-form-radio v-model="selectedRadio" :value="$options.SELECTED_PROJECTS">{{
+ __('Selected projects')
+ }}</gl-form-radio>
+ <input :id="inputAttrs.id" type="hidden" :name="inputAttrs.name" :value="hiddenInputValue" />
+ <projects-token-selector
+ v-model="selectedProjects"
+ :initial-project-ids="initialProjectIds"
+ @focus="handleTokenSelectorFocus"
+ />
+ </gl-form-group>
+ </div>
+</template>
diff --git a/app/assets/javascripts/access_tokens/components/projects_token_selector.vue b/app/assets/javascripts/access_tokens/components/projects_token_selector.vue
new file mode 100644
index 00000000000..cc5532696c7
--- /dev/null
+++ b/app/assets/javascripts/access_tokens/components/projects_token_selector.vue
@@ -0,0 +1,158 @@
+<script>
+import {
+ GlTokenSelector,
+ GlAvatar,
+ GlAvatarLabeled,
+ GlIntersectionObserver,
+ GlLoadingIcon,
+} from '@gitlab/ui';
+import produce from 'immer';
+
+import { convertToGraphQLIds, convertNodeIdsFromGraphQLIds } from '~/graphql_shared/utils';
+
+import getProjectsQuery from '../graphql/queries/get_projects.query.graphql';
+
+const DEBOUNCE_DELAY = 250;
+const PROJECTS_PER_PAGE = 20;
+const GRAPHQL_ENTITY_TYPE = 'Project';
+
+export default {
+ name: 'ProjectsTokenSelector',
+ components: {
+ GlTokenSelector,
+ GlAvatar,
+ GlAvatarLabeled,
+ GlIntersectionObserver,
+ GlLoadingIcon,
+ },
+ model: {
+ prop: 'selectedProjects',
+ },
+ props: {
+ selectedProjects: {
+ type: Array,
+ required: true,
+ },
+ initialProjectIds: {
+ type: Array,
+ required: true,
+ },
+ },
+ apollo: {
+ projects: {
+ query: getProjectsQuery,
+ debounce: DEBOUNCE_DELAY,
+ variables() {
+ return {
+ search: this.searchQuery,
+ after: null,
+ first: PROJECTS_PER_PAGE,
+ };
+ },
+ update({ projects }) {
+ return {
+ list: convertNodeIdsFromGraphQLIds(projects.nodes),
+ pageInfo: projects.pageInfo,
+ };
+ },
+ result() {
+ this.isLoadingMoreProjects = false;
+ this.isSearching = false;
+ },
+ },
+ initialProjects: {
+ query: getProjectsQuery,
+ variables() {
+ return {
+ ids: convertToGraphQLIds(GRAPHQL_ENTITY_TYPE, this.initialProjectIds),
+ };
+ },
+ manual: true,
+ skip() {
+ return !this.initialProjectIds.length;
+ },
+ result({ data: { projects } }) {
+ this.$emit('input', convertNodeIdsFromGraphQLIds(projects.nodes));
+ },
+ },
+ },
+ data() {
+ return {
+ projects: {
+ list: [],
+ pageInfo: {},
+ },
+ searchQuery: '',
+ isLoadingMoreProjects: false,
+ isSearching: false,
+ };
+ },
+ methods: {
+ handleSearch(query) {
+ this.isSearching = true;
+ this.searchQuery = query;
+ },
+ loadMoreProjects() {
+ this.isLoadingMoreProjects = true;
+
+ this.$apollo.queries.projects.fetchMore({
+ variables: {
+ after: this.projects.pageInfo.endCursor,
+ first: PROJECTS_PER_PAGE,
+ },
+ updateQuery(previousResult, { fetchMoreResult: { projects: newProjects } }) {
+ const { projects: previousProjects } = previousResult;
+
+ return produce(previousResult, (draftData) => {
+ /* eslint-disable no-param-reassign */
+ draftData.projects.nodes = [...previousProjects.nodes, ...newProjects.nodes];
+ draftData.projects.pageInfo = newProjects.pageInfo;
+ /* eslint-enable no-param-reassign */
+ });
+ },
+ });
+ },
+ },
+};
+</script>
+
+<template>
+ <div class="gl-relative">
+ <gl-token-selector
+ :selected-tokens="selectedProjects"
+ :dropdown-items="projects.list"
+ :loading="isSearching"
+ :placeholder="__('Select projects')"
+ menu-class="gl-w-full! gl-max-w-full!"
+ @input="$emit('input', $event)"
+ @focus="$emit('focus', $event)"
+ @text-input="handleSearch"
+ @keydown.enter.prevent
+ >
+ <template #token-content="{ token: project }">
+ <gl-avatar
+ :entity-id="project.id"
+ :entity-name="project.name"
+ :src="project.avatarUrl"
+ :size="16"
+ />
+ {{ project.nameWithNamespace }}
+ </template>
+ <template #dropdown-item-content="{ dropdownItem: project }">
+ <gl-avatar-labeled
+ :entity-id="project.id"
+ :entity-name="project.name"
+ :size="32"
+ :src="project.avatarUrl"
+ :label="project.name"
+ :sub-label="project.nameWithNamespace"
+ />
+ </template>
+ <template #dropdown-footer>
+ <gl-intersection-observer v-if="projects.pageInfo.hasNextPage" @appear="loadMoreProjects">
+ <gl-loading-icon v-if="isLoadingMoreProjects" size="md" />
+ </gl-intersection-observer>
+ </template>
+ </gl-token-selector>
+ </div>
+</template>
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
new file mode 100644
index 00000000000..60110437ecd
--- /dev/null
+++ b/app/assets/javascripts/access_tokens/graphql/queries/get_projects.query.graphql
@@ -0,0 +1,28 @@
+#import "~/graphql_shared/fragments/pageInfo.fragment.graphql"
+
+query getProjects(
+ $search: String = ""
+ $after: String = ""
+ $first: Int = null
+ $ids: [ID!] = null
+) {
+ projects(
+ search: $search
+ after: $after
+ first: $first
+ ids: $ids
+ membership: true
+ searchNamespaces: true
+ sort: "UPDATED_ASC"
+ ) {
+ nodes {
+ id
+ name
+ nameWithNamespace
+ avatarUrl
+ }
+ pageInfo {
+ ...PageInfo
+ }
+ }
+}
diff --git a/app/assets/javascripts/access_tokens/index.js b/app/assets/javascripts/access_tokens/index.js
index b4353af30d5..43d56295f78 100644
--- a/app/assets/javascripts/access_tokens/index.js
+++ b/app/assets/javascripts/access_tokens/index.js
@@ -1,4 +1,7 @@
import Vue from 'vue';
+import createFlash from '~/flash';
+import { __ } from '~/locale';
+
import ExpiresAtField from './components/expires_at_field.vue';
const getInputAttrs = (el) => {
@@ -7,11 +10,12 @@ const getInputAttrs = (el) => {
return {
id: input.id,
name: input.name,
+ value: input.value,
placeholder: input.placeholder,
};
};
-const initExpiresAtField = () => {
+export const initExpiresAtField = () => {
const el = document.querySelector('.js-access-tokens-expires-at');
if (!el) {
@@ -32,4 +36,58 @@ const initExpiresAtField = () => {
});
};
-export default initExpiresAtField;
+export const initProjectsField = () => {
+ const el = document.querySelector('.js-access-tokens-projects');
+
+ if (!el) {
+ return null;
+ }
+
+ const inputAttrs = getInputAttrs(el);
+
+ if (window.gon.features.personalAccessTokensScopedToProjects) {
+ return new Promise((resolve) => {
+ Promise.all([
+ import('./components/projects_field.vue'),
+ import('vue-apollo'),
+ import('~/lib/graphql'),
+ ])
+ .then(
+ ([
+ { default: ProjectsField },
+ { default: VueApollo },
+ { default: createDefaultClient },
+ ]) => {
+ const apolloProvider = new VueApollo({
+ defaultClient: createDefaultClient(),
+ });
+
+ Vue.use(VueApollo);
+
+ resolve(
+ new Vue({
+ el,
+ apolloProvider,
+ render(h) {
+ return h(ProjectsField, {
+ props: {
+ inputAttrs,
+ },
+ });
+ },
+ }),
+ );
+ },
+ )
+ .catch(() => {
+ createFlash({
+ message: __(
+ 'An error occurred while loading the access tokens form, please try again.',
+ ),
+ });
+ });
+ });
+ }
+
+ return null;
+};
diff --git a/app/assets/javascripts/admin/dev_ops_report/devops_adoption.js b/app/assets/javascripts/admin/dev_ops_report/devops_adoption.js
deleted file mode 100644
index ae73033079d..00000000000
--- a/app/assets/javascripts/admin/dev_ops_report/devops_adoption.js
+++ /dev/null
@@ -1,2 +0,0 @@
-// EE-specific feature. Find the implementation in the `ee/`-folder
-export default () => {};
diff --git a/app/assets/javascripts/admin/users/tabs.js b/app/assets/javascripts/admin/users/tabs.js
index 9ada77396c7..cbaab7df4e9 100644
--- a/app/assets/javascripts/admin/users/tabs.js
+++ b/app/assets/javascripts/admin/users/tabs.js
@@ -1,11 +1,20 @@
+import Api from '~/api';
import { historyPushState } from '~/lib/utils/common_utils';
import { mergeUrlParams } from '~/lib/utils/url_utility';
const COHORTS_PANE = 'cohorts';
+const COHORTS_PANE_TAB_CLICK_EVENT = 'i_analytics_cohorts';
const tabClickHandler = (e) => {
const { hash } = e.currentTarget;
- const tab = hash === `#${COHORTS_PANE}` ? COHORTS_PANE : null;
+
+ let tab = null;
+
+ if (hash === `#${COHORTS_PANE}`) {
+ tab = COHORTS_PANE;
+ Api.trackRedisHllUserEvent(COHORTS_PANE_TAB_CLICK_EVENT);
+ }
+
const newUrl = mergeUrlParams({ tab }, window.location.href);
historyPushState(newUrl);
};
diff --git a/app/assets/javascripts/alert_management/components/alert_management_table.vue b/app/assets/javascripts/alert_management/components/alert_management_table.vue
index dd702c4a5d3..79a6bac3ba7 100644
--- a/app/assets/javascripts/alert_management/components/alert_management_table.vue
+++ b/app/assets/javascripts/alert_management/components/alert_management_table.vue
@@ -42,6 +42,7 @@ export default {
"AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear.",
),
unassigned: __('Unassigned'),
+ closed: __('closed'),
},
fields: [
{
@@ -75,7 +76,7 @@ export default {
{
key: 'issue',
label: s__('AlertManagement|Incident'),
- thClass: 'gl-w-12 gl-pointer-events-none',
+ thClass: 'gl-w-15p gl-pointer-events-none',
tdClass,
},
{
@@ -221,8 +222,11 @@ export default {
hasAssignees(assignees) {
return Boolean(assignees.nodes?.length);
},
- getIssueLink(item) {
- return joinPaths('/', this.projectPath, '-', 'issues', item.issueIid);
+ getIssueMeta({ issue: { iid, state } }) {
+ return {
+ state: state === 'closed' ? `(${this.$options.i18n.closed})` : '',
+ link: joinPaths('/', this.projectPath, '-', 'issues/incident', iid),
+ };
},
tbodyTrClass(item) {
return {
@@ -343,8 +347,14 @@ export default {
</template>
<template #cell(issue)="{ item }">
- <gl-link v-if="item.issueIid" data-testid="issueField" :href="getIssueLink(item)">
- #{{ item.issueIid }}
+ <gl-link
+ v-if="item.issue"
+ v-gl-tooltip
+ :title="item.issue.title"
+ data-testid="issueField"
+ :href="getIssueMeta(item).link"
+ >
+ #{{ item.issue.iid }} {{ getIssueMeta(item).state }}
</gl-link>
<div v-else data-testid="issueField">{{ s__('AlertManagement|None') }}</div>
</template>
diff --git a/app/assets/javascripts/alerts_settings/components/alert_mapping_builder.vue b/app/assets/javascripts/alerts_settings/components/alert_mapping_builder.vue
index 1135562834a..07b2e59671e 100644
--- a/app/assets/javascripts/alerts_settings/components/alert_mapping_builder.vue
+++ b/app/assets/javascripts/alerts_settings/components/alert_mapping_builder.vue
@@ -7,15 +7,12 @@ import {
GlSearchBoxByType,
GlTooltipDirective as GlTooltip,
} from '@gitlab/ui';
-import { cloneDeep } from 'lodash';
+import { cloneDeep, isEqual } from 'lodash';
import Vue from 'vue';
import { capitalizeFirstCharacter } from '~/lib/utils/text_utility';
import { s__, __ } from '~/locale';
-import {
- getMappingData,
- getPayloadFields,
- transformForSave,
-} from '../utils/mapping_transformations';
+import { mappingFields } from '../constants';
+import { getMappingData, transformForSave } from '../utils/mapping_transformations';
export const i18n = {
columns: {
@@ -33,6 +30,7 @@ export const i18n = {
export default {
i18n,
+ mappingFields,
components: {
GlIcon,
GlFormInput,
@@ -73,18 +71,15 @@ export default {
};
},
computed: {
- payloadFields() {
- return getPayloadFields(this.parsedPayload);
- },
mappingData() {
- return getMappingData(this.gitlabFields, this.payloadFields, this.savedMapping);
+ return getMappingData(this.gitlabFields, this.parsedPayload, this.savedMapping);
},
hasFallbackColumn() {
return this.gitlabFields.some(({ numberOfFallbacks }) => Boolean(numberOfFallbacks));
},
},
methods: {
- setMapping(gitlabKey, mappingKey, valueKey) {
+ setMapping(gitlabKey, mappingKey, valueKey = mappingFields.mapping) {
const fieldIndex = this.gitlabFields.findIndex((field) => field.name === gitlabKey);
const updatedField = { ...this.gitlabFields[fieldIndex], ...{ [valueKey]: mappingKey } };
Vue.set(this.gitlabFields, fieldIndex, updatedField);
@@ -100,11 +95,11 @@ export default {
return fields.filter((field) => field.label.toLowerCase().includes(search));
},
isSelected(fieldValue, mapping) {
- return fieldValue === mapping;
+ return isEqual(fieldValue, mapping);
},
- selectedValue(name) {
+ selectedValue(mapping) {
return (
- this.payloadFields.find((item) => item.name === name)?.label ||
+ this.parsedPayload.find((item) => isEqual(item.path, mapping))?.label ||
this.$options.i18n.makeSelection
);
},
@@ -150,7 +145,7 @@ export default {
:key="gitlabField.name"
class="gl-display-table-row"
>
- <div class="gl-display-table-cell gl-py-3 gl-pr-3 w-30p gl-vertical-align-middle">
+ <div class="gl-display-table-cell gl-py-3 gl-pr-3 gl-w-30p gl-vertical-align-middle">
<gl-form-input
aria-labelledby="gitlabFieldsHeader"
disabled
@@ -164,7 +159,7 @@ export default {
</div>
</div>
- <div class="gl-display-table-cell gl-py-3 gl-pr-3 w-30p gl-vertical-align-middle">
+ <div class="gl-display-table-cell gl-py-3 gl-pr-3 gl-w-30p gl-vertical-align-middle">
<gl-dropdown
:disabled="!gitlabField.mappingFields.length"
aria-labelledby="parsedFieldsHeader"
@@ -175,10 +170,10 @@ export default {
<gl-search-box-by-type @input="setSearchTerm($event, 'searchTerm', gitlabField.name)" />
<gl-dropdown-item
v-for="mappingField in filterFields(gitlabField.searchTerm, gitlabField.mappingFields)"
- :key="`${mappingField.name}__mapping`"
- :is-checked="isSelected(gitlabField.mapping, mappingField.name)"
+ :key="`${mappingField.path}__mapping`"
+ :is-checked="isSelected(gitlabField.mapping, mappingField.path)"
is-check-item
- @click="setMapping(gitlabField.name, mappingField.name, 'mapping')"
+ @click="setMapping(gitlabField.name, mappingField.path)"
>
{{ mappingField.label }}
</gl-dropdown-item>
@@ -188,7 +183,7 @@ export default {
</gl-dropdown>
</div>
- <div class="gl-display-table-cell gl-py-3 w-30p">
+ <div class="gl-display-table-cell gl-py-3 gl-w-30p">
<gl-dropdown
v-if="Boolean(gitlabField.numberOfFallbacks)"
:disabled="!gitlabField.mappingFields.length"
@@ -205,10 +200,12 @@ export default {
gitlabField.fallbackSearchTerm,
gitlabField.mappingFields,
)"
- :key="`${mappingField.name}__fallback`"
- :is-checked="isSelected(gitlabField.fallback, mappingField.name)"
+ :key="`${mappingField.path}__fallback`"
+ :is-checked="isSelected(gitlabField.fallback, mappingField.path)"
is-check-item
- @click="setMapping(gitlabField.name, mappingField.name, 'fallback')"
+ @click="
+ setMapping(gitlabField.name, mappingField.path, $options.mappingFields.fallback)
+ "
>
{{ mappingField.label }}
</gl-dropdown-item>
diff --git a/app/assets/javascripts/alerts_settings/components/alerts_integrations_list.vue b/app/assets/javascripts/alerts_settings/components/alerts_integrations_list.vue
index 6cfb4601192..a5e17d80f86 100644
--- a/app/assets/javascripts/alerts_settings/components/alerts_integrations_list.vue
+++ b/app/assets/javascripts/alerts_settings/components/alerts_integrations_list.vue
@@ -10,6 +10,7 @@ import {
GlTooltipDirective,
GlSprintf,
} from '@gitlab/ui';
+import { capitalize } from 'lodash';
import { s__, __ } from '~/locale';
import Tracking from '~/tracking';
import {
@@ -77,6 +78,7 @@ export default {
{
key: 'type',
label: __('Type'),
+ formatter: (value) => (value === typeSet.prometheus ? capitalize(value) : value),
},
{
key: 'actions',
@@ -120,14 +122,17 @@ export default {
const { category, action } = trackAlertIntegrationsViewsOptions;
Tracking.event(category, action);
},
- setIntegrationToDelete({ name, id }) {
- this.integrationToDelete.id = id;
- this.integrationToDelete.name = name;
+ setIntegrationToDelete(integration) {
+ this.integrationToDelete = integration;
},
deleteIntegration() {
- this.$emit('delete-integration', { id: this.integrationToDelete.id });
+ const { id, type } = this.integrationToDelete;
+ this.$emit('delete-integration', { id, type });
this.integrationToDelete = { ...integrationToDeleteDefault };
},
+ editIntegration({ id, type }) {
+ this.$emit('edit-integration', { id, type });
+ },
},
};
</script>
@@ -169,7 +174,7 @@ export default {
<template #cell(actions)="{ item }">
<gl-button-group class="gl-ml-3">
- <gl-button icon="pencil" @click="$emit('edit-integration', { id: item.id })" />
+ <gl-button icon="settings" @click="editIntegration(item)" />
<gl-button
v-gl-modal.deleteIntegration
:disabled="item.type === $options.typeSet.prometheus"
diff --git a/app/assets/javascripts/alerts_settings/components/alerts_settings_form.vue b/app/assets/javascripts/alerts_settings/components/alerts_settings_form.vue
index 18372c54b84..5d9513e5b53 100644
--- a/app/assets/javascripts/alerts_settings/components/alerts_settings_form.vue
+++ b/app/assets/javascripts/alerts_settings/components/alerts_settings_form.vue
@@ -1,7 +1,6 @@
<script>
import {
GlButton,
- GlCollapse,
GlForm,
GlFormGroup,
GlFormSelect,
@@ -11,98 +10,39 @@ import {
GlModal,
GlModalDirective,
GlToggle,
+ GlTabs,
+ GlTab,
} from '@gitlab/ui';
-import { s__ } from '~/locale';
+import * as Sentry from '@sentry/browser';
+import { isEmpty, omit } from 'lodash';
import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
-import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import {
integrationTypes,
+ integrationSteps,
+ createStepNumbers,
+ editStepNumbers,
JSON_VALIDATE_DELAY,
targetPrometheusUrlPlaceholder,
typeSet,
+ viewCredentialsTabIndex,
+ i18n,
} from '../constants';
import getCurrentIntegrationQuery from '../graphql/queries/get_current_integration.query.graphql';
+import parseSamplePayloadQuery from '../graphql/queries/parse_sample_payload.query.graphql';
import MappingBuilder from './alert_mapping_builder.vue';
import AlertSettingsFormHelpBlock from './alert_settings_form_help_block.vue';
-// Mocks will be removed when integrating with BE is ready
-// data format is defined and will be the same as mocked (maybe with some minor changes)
-// feature rollout plan - https://gitlab.com/gitlab-org/gitlab/-/issues/262707#note_442529171
-import mockedCustomMapping from './mocks/parsedMapping.json';
-
-export const i18n = {
- integrationFormSteps: {
- step1: {
- label: s__('AlertSettings|1. Select integration type'),
- enterprise: s__(
- 'AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations.',
- ),
- },
- step2: {
- label: s__('AlertSettings|2. Name integration'),
- placeholder: s__('AlertSettings|Enter integration name'),
- prometheus: s__('AlertSettings|Prometheus'),
- },
- step3: {
- label: s__('AlertSettings|3. Set up webhook'),
- help: s__(
- "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint.",
- ),
- prometheusHelp: s__(
- 'AlertSettings|Utilize the URL and authorization key below to authorize Prometheus to send alerts to GitLab. Review the Prometheus documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint.',
- ),
- info: s__('AlertSettings|Authorization key'),
- reset: s__('AlertSettings|Reset Key'),
- },
- step4: {
- label: s__('AlertSettings|4. Sample alert payload (optional)'),
- help: s__(
- 'AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional).',
- ),
- prometheusHelp: s__(
- 'AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional).',
- ),
- placeholder: s__('AlertSettings|{ "events": [{ "application": "Name of application" }] }'),
- resetHeader: s__('AlertSettings|Reset the mapping'),
- resetBody: s__(
- "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields.",
- ),
- resetOk: s__('AlertSettings|Proceed with editing'),
- editPayload: s__('AlertSettings|Edit payload'),
- submitPayload: s__('AlertSettings|Submit payload'),
- payloadParsedSucessMsg: s__(
- 'AlertSettings|Sample payload has been parsed. You can now map the fields.',
- ),
- },
- step5: {
- label: s__('AlertSettings|5. Map fields (optional)'),
- intro: s__(
- "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key.",
- ),
- },
- prometheusFormUrl: {
- label: s__('AlertSettings|Prometheus API base URL'),
- help: s__('AlertSettings|URL cannot be blank and must start with http or https'),
- },
- restKeyInfo: {
- label: s__(
- 'AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in.',
- ),
- },
- },
-};
export default {
- integrationTypes,
placeholders: {
prometheus: targetPrometheusUrlPlaceholder,
},
JSON_VALIDATE_DELAY,
typeSet,
+ integrationSteps,
i18n,
components: {
ClipboardButton,
GlButton,
- GlCollapse,
GlForm,
GlFormGroup,
GlFormInput,
@@ -111,13 +51,14 @@ export default {
GlFormSelect,
GlModal,
GlToggle,
+ GlTabs,
+ GlTab,
AlertSettingsFormHelpBlock,
MappingBuilder,
},
directives: {
GlModal: GlModalDirective,
},
- mixins: [glFeatureFlagsMixin()],
inject: {
generic: {
default: {},
@@ -128,6 +69,9 @@ export default {
multiIntegrations: {
default: false,
},
+ projectPath: {
+ default: '',
+ },
},
props: {
loading: {
@@ -151,26 +95,40 @@ export default {
},
data() {
return {
- selectedIntegration: integrationTypes[0].value,
+ integrationTypesOptions: Object.values(integrationTypes),
+ selectedIntegration: integrationTypes.none.value,
active: false,
- formVisible: false,
- integrationTestPayload: {
+ samplePayload: {
json: null,
error: null,
},
- resetSamplePayloadConfirmed: false,
- customMapping: null,
+ testPayload: {
+ json: null,
+ error: null,
+ },
+ resetPayloadAndMappingConfirmed: false,
mapping: [],
parsingPayload: false,
currentIntegration: null,
+ parsedPayload: [],
+ activeTabIndex: 0,
};
},
computed: {
isPrometheus() {
return this.selectedIntegration === this.$options.typeSet.prometheus;
},
- jsonIsValid() {
- return this.integrationTestPayload.error === null;
+ isHttp() {
+ return this.selectedIntegration === this.$options.typeSet.http;
+ },
+ isCreating() {
+ return !this.currentIntegration;
+ },
+ isSampePayloadValid() {
+ return this.samplePayload.error === null;
+ },
+ isTestPayloadValid() {
+ return this.testPayload.error === null;
},
selectedIntegrationType() {
switch (this.selectedIntegration) {
@@ -197,90 +155,88 @@ export default {
},
testAlertPayload() {
return {
- data: this.integrationTestPayload.json,
+ data: this.testPayload.json,
endpoint: this.integrationForm.url,
token: this.integrationForm.token,
};
},
showMappingBuilder() {
- return (
- this.multiIntegrations &&
- this.glFeatures.multipleHttpIntegrationsCustomMapping &&
- this.selectedIntegration === typeSet.http &&
- this.alertFields?.length
- );
- },
- parsedSamplePayload() {
- return this.customMapping?.samplePayload?.payloadAlerFields?.nodes;
- },
- savedMapping() {
- return this.customMapping?.storedMapping?.nodes;
+ return this.multiIntegrations && this.isHttp && this.alertFields?.length;
},
hasSamplePayload() {
- return Boolean(this.customMapping?.samplePayload);
+ return this.isValidNonEmptyJSON(this.currentIntegration?.payloadExample);
},
canEditPayload() {
- return this.hasSamplePayload && !this.resetSamplePayloadConfirmed;
+ return this.hasSamplePayload && !this.resetPayloadAndMappingConfirmed;
+ },
+ canParseSamplePayload() {
+ return !this.active || !this.isSampePayloadValid || !this.samplePayload.json;
},
isResetAuthKeyDisabled() {
return !this.active && !this.integrationForm.token !== '';
},
isPayloadEditDisabled() {
- return this.glFeatures.multipleHttpIntegrationsCustomMapping
- ? !this.active || this.canEditPayload
- : !this.active;
- },
- isSubmitTestPayloadDisabled() {
- return (
- !this.active ||
- Boolean(this.integrationTestPayload.error) ||
- this.integrationTestPayload.json === ''
- );
+ return !this.active || this.canEditPayload;
},
isSelectDisabled() {
return this.currentIntegration !== null || !this.canAddIntegration;
},
+ viewCredentialsHelpMsg() {
+ return this.isPrometheus
+ ? i18n.integrationFormSteps.setupCredentials.prometheusHelp
+ : i18n.integrationFormSteps.setupCredentials.help;
+ },
},
watch: {
currentIntegration(val) {
if (val === null) {
- return this.reset();
+ this.reset();
+ return;
+ }
+ const { type, active, payloadExample, payloadAlertFields, payloadAttributeMappings } = val;
+ this.selectedIntegration = type;
+ this.active = active;
+
+ if (type === typeSet.http && this.showMappingBuilder) {
+ this.parsedPayload = payloadAlertFields;
+ this.samplePayload.json = this.isValidNonEmptyJSON(payloadExample) ? payloadExample : null;
+ const mapping = payloadAttributeMappings.map((mappingItem) =>
+ omit(mappingItem, '__typename'),
+ );
+ this.updateMapping(mapping);
}
- this.selectedIntegration = val.type;
- this.active = val.active;
- if (val.type === typeSet.http && this.showMappingBuilder) this.getIntegrationMapping(val.id);
- return this.integrationTypeSelect();
+ this.activeTabIndex = viewCredentialsTabIndex;
+ this.$el.scrollIntoView({ block: 'center' });
},
},
methods: {
- integrationTypeSelect() {
- if (this.selectedIntegration === integrationTypes[0].value) {
- this.formVisible = false;
- } else {
- this.formVisible = true;
+ isValidNonEmptyJSON(JSONString) {
+ if (JSONString) {
+ let parsed;
+ try {
+ parsed = JSON.parse(JSONString);
+ } catch (error) {
+ Sentry.captureException(error);
+ }
+ if (parsed) return !isEmpty(parsed);
}
+ return false;
},
- submitWithTestPayload() {
- this.$emit('set-test-alert-payload', this.testAlertPayload);
- this.submit();
+ sendTestAlert() {
+ this.$emit('test-alert-payload', this.testAlertPayload);
},
submit() {
const { name, apiUrl } = this.integrationForm;
- const customMappingVariables = this.glFeatures.multipleHttpIntegrationsCustomMapping
- ? {
- payloadAttributeMappings: this.mapping,
- payloadExample: this.integrationTestPayload.json,
- }
- : {};
+ const customMappingVariables = {
+ payloadAttributeMappings: this.mapping,
+ payloadExample: this.samplePayload.json || '{}',
+ };
const variables =
this.selectedIntegration === typeSet.http
- ? {
- name,
- active: this.active,
- ...customMappingVariables,
- }
+ ? { name, active: this.active, ...customMappingVariables }
: { apiUrl, active: this.active };
+
const integrationPayload = { type: this.selectedIntegration, variables };
if (this.currentIntegration) {
@@ -291,19 +247,15 @@ export default {
return this.$emit('create-new-integration', integrationPayload);
},
reset() {
- this.selectedIntegration = integrationTypes[0].value;
- this.integrationTypeSelect();
-
- if (this.currentIntegration) {
- return this.$emit('clear-current-integration');
- }
-
- return this.resetFormValues();
+ this.resetFormValues();
+ this.resetPayloadAndMapping();
+ this.$emit('clear-current-integration', { type: this.currentIntegration?.type });
},
resetFormValues() {
+ this.selectedIntegration = integrationTypes.none.value;
this.integrationForm.name = '';
this.integrationForm.apiUrl = '';
- this.integrationTestPayload = {
+ this.samplePayload = {
json: null,
error: null,
};
@@ -319,117 +271,135 @@ export default {
variables: { id: this.currentIntegration.id },
});
},
- validateJson() {
- this.integrationTestPayload.error = null;
- if (this.integrationTestPayload.json === '') {
+ validateJson(isSamplePayload = true) {
+ const payload = isSamplePayload ? this.samplePayload : this.testPayload;
+
+ payload.error = null;
+ if (payload.json === '') {
return;
}
try {
- JSON.parse(this.integrationTestPayload.json);
+ JSON.parse(payload.json);
} catch (e) {
- this.integrationTestPayload.error = JSON.stringify(e.message);
+ payload.error = JSON.stringify(e.message);
}
},
parseMapping() {
- // TODO: replace with real BE mutation when ready;
this.parsingPayload = true;
- return new Promise((resolve) => {
- setTimeout(() => resolve(mockedCustomMapping), 1000);
- })
- .then((res) => {
- const mapping = { ...res };
- delete mapping.storedMapping;
- this.customMapping = res;
- this.integrationTestPayload.json = res?.samplePayload.body;
- this.resetSamplePayloadConfirmed = false;
-
- this.$toast.show(this.$options.i18n.integrationFormSteps.step4.payloadParsedSucessMsg);
+ return this.$apollo
+ .query({
+ query: parseSamplePayloadQuery,
+ variables: { projectPath: this.projectPath, payload: this.samplePayload.json },
+ })
+ .then(
+ ({
+ data: {
+ project: { alertManagementPayloadFields },
+ },
+ }) => {
+ this.parsedPayload = alertManagementPayloadFields;
+ this.resetPayloadAndMappingConfirmed = false;
+
+ this.$toast.show(
+ this.$options.i18n.integrationFormSteps.setSamplePayload.payloadParsedSucessMsg,
+ );
+ },
+ )
+ .catch(({ message }) => {
+ this.samplePayload.error = message;
})
.finally(() => {
this.parsingPayload = false;
});
},
- getIntegrationMapping() {
- // TODO: replace with real BE mutation when ready;
- return Promise.resolve(mockedCustomMapping).then((res) => {
- this.customMapping = res;
- this.integrationTestPayload.json = res?.samplePayload.body;
- });
- },
updateMapping(mapping) {
this.mapping = mapping;
},
+ resetPayloadAndMapping() {
+ this.resetPayloadAndMappingConfirmed = true;
+ this.parsedPayload = [];
+ this.updateMapping([]);
+ },
+ getLabelWithStepNumber(step, label) {
+ let stepNumber = editStepNumbers[step];
+
+ if (this.isCreating) {
+ stepNumber = createStepNumbers[step];
+ }
+
+ return stepNumber ? `${stepNumber}.${label}` : label;
+ },
},
};
</script>
<template>
<gl-form class="gl-mt-6" @submit.prevent="submit" @reset.prevent="reset">
- <h5 class="gl-font-lg gl-my-5">{{ s__('AlertSettings|Add new integrations') }}</h5>
- <gl-form-group
- id="integration-type"
- :label="$options.i18n.integrationFormSteps.step1.label"
- label-for="integration-type"
- >
- <gl-form-select
- v-model="selectedIntegration"
- :disabled="isSelectDisabled"
- class="mw-100"
- :options="$options.integrationTypes"
- @change="integrationTypeSelect"
- />
-
- <div v-if="!canAddIntegration" class="gl-my-4" data-testid="multi-integrations-not-supported">
- <alert-settings-form-help-block
- :message="$options.i18n.integrationFormSteps.step1.enterprise"
- link="https://about.gitlab.com/pricing"
- />
- </div>
- </gl-form-group>
- <gl-collapse v-model="formVisible" class="gl-mt-3">
- <div>
+ <gl-tabs v-model="activeTabIndex">
+ <gl-tab :title="$options.i18n.integrationTabs.configureDetails">
<gl-form-group
- id="name-integration"
- :label="$options.i18n.integrationFormSteps.step2.label"
- label-for="name-integration"
+ v-if="isCreating"
+ id="integration-type"
+ :label="
+ getLabelWithStepNumber(
+ $options.integrationSteps.selectType,
+ $options.i18n.integrationFormSteps.selectType.label,
+ )
+ "
+ label-for="integration-type"
>
- <gl-form-input
- v-model="integrationForm.name"
- :disabled="isPrometheus"
- type="text"
- :placeholder="
- isPrometheus
- ? $options.i18n.integrationFormSteps.step2.prometheus
- : $options.i18n.integrationFormSteps.step2.placeholder
- "
+ <gl-form-select
+ v-model="selectedIntegration"
+ :disabled="isSelectDisabled"
+ class="gl-max-w-full"
+ :options="integrationTypesOptions"
/>
- </gl-form-group>
- <gl-form-group
- id="integration-webhook"
- :label="$options.i18n.integrationFormSteps.step3.label"
- label-for="integration-webhook"
- >
+
<alert-settings-form-help-block
- :message="
- isPrometheus
- ? $options.i18n.integrationFormSteps.step3.prometheusHelp
- : $options.i18n.integrationFormSteps.step3.help
- "
- link="https://docs.gitlab.com/ee/operations/incident_management/alert_integrations.html"
+ v-if="!canAddIntegration"
+ disabled="true"
+ class="gl-display-inline-block gl-my-4"
+ :message="$options.i18n.integrationFormSteps.selectType.enterprise"
+ link="https://about.gitlab.com/pricing"
+ data-testid="multi-integrations-not-supported"
/>
+ </gl-form-group>
+ <div class="gl-mt-3">
+ <gl-form-group
+ v-if="isHttp"
+ id="name-integration"
+ :label="
+ getLabelWithStepNumber(
+ $options.integrationSteps.nameIntegration,
+ $options.i18n.integrationFormSteps.nameIntegration.label,
+ )
+ "
+ label-for="name-integration"
+ >
+ <gl-form-input
+ v-model="integrationForm.name"
+ type="text"
+ :placeholder="$options.i18n.integrationFormSteps.nameIntegration.placeholder"
+ />
+ </gl-form-group>
<gl-toggle
v-model="active"
:is-loading="loading"
- :label="__('Active')"
+ :label="$options.i18n.integrationFormSteps.nameIntegration.activeToggle"
class="gl-my-4 gl-font-weight-normal"
/>
<div v-if="isPrometheus" class="gl-my-4">
<span class="gl-font-weight-bold">
- {{ $options.i18n.integrationFormSteps.prometheusFormUrl.label }}
+ {{
+ getLabelWithStepNumber(
+ $options.integrationSteps.setPrometheusApiUrl,
+ $options.i18n.integrationFormSteps.prometheusFormUrl.label,
+ )
+ }}
</span>
<gl-form-input
@@ -444,16 +414,123 @@ export default {
</span>
</div>
+ <template v-if="showMappingBuilder">
+ <gl-form-group
+ data-testid="sample-payload-section"
+ :label="
+ getLabelWithStepNumber(
+ $options.integrationSteps.setSamplePayload,
+ $options.i18n.integrationFormSteps.setSamplePayload.label,
+ )
+ "
+ label-for="sample-payload"
+ class="gl-mb-0!"
+ :invalid-feedback="samplePayload.error"
+ >
+ <alert-settings-form-help-block
+ :message="$options.i18n.integrationFormSteps.setSamplePayload.testPayloadHelpHttp"
+ :link="generic.alertsUsageUrl"
+ />
+
+ <gl-form-textarea
+ id="sample-payload"
+ v-model.trim="samplePayload.json"
+ :disabled="isPayloadEditDisabled"
+ :state="isSampePayloadValid"
+ :placeholder="$options.i18n.integrationFormSteps.setSamplePayload.placeholder"
+ class="gl-my-3"
+ :debounce="$options.JSON_VALIDATE_DELAY"
+ rows="6"
+ max-rows="10"
+ @input="validateJson"
+ />
+ </gl-form-group>
+
+ <gl-button
+ v-if="canEditPayload"
+ v-gl-modal.resetPayloadModal
+ data-testid="payload-action-btn"
+ :disabled="!active"
+ class="gl-mt-3"
+ >
+ {{ $options.i18n.integrationFormSteps.setSamplePayload.editPayload }}
+ </gl-button>
+
+ <gl-button
+ v-else
+ data-testid="payload-action-btn"
+ :class="{ 'gl-mt-3': samplePayload.error }"
+ :disabled="canParseSamplePayload"
+ :loading="parsingPayload"
+ @click="parseMapping"
+ >
+ {{ $options.i18n.integrationFormSteps.setSamplePayload.parsePayload }}
+ </gl-button>
+ <gl-modal
+ modal-id="resetPayloadModal"
+ :title="$options.i18n.integrationFormSteps.setSamplePayload.resetHeader"
+ :ok-title="$options.i18n.integrationFormSteps.setSamplePayload.resetOk"
+ ok-variant="danger"
+ @ok="resetPayloadAndMapping"
+ >
+ {{ $options.i18n.integrationFormSteps.setSamplePayload.resetBody }}
+ </gl-modal>
+
+ <gl-form-group
+ id="mapping-builder"
+ class="gl-mt-5"
+ :label="
+ getLabelWithStepNumber(
+ $options.integrationSteps.customizeMapping,
+ $options.i18n.integrationFormSteps.mapFields.label,
+ )
+ "
+ label-for="mapping-builder"
+ >
+ <span>{{ $options.i18n.integrationFormSteps.mapFields.intro }}</span>
+ <mapping-builder
+ :parsed-payload="parsedPayload"
+ :saved-mapping="mapping"
+ :alert-fields="alertFields"
+ @onMappingUpdate="updateMapping"
+ />
+ </gl-form-group>
+ </template>
+ </div>
+
+ <div class="gl-display-flex gl-justify-content-start gl-py-3">
+ <gl-button
+ type="submit"
+ variant="confirm"
+ class="js-no-auto-disable"
+ data-testid="integration-form-submit"
+ >
+ {{ $options.i18n.saveIntegration }}
+ </gl-button>
+
+ <gl-button type="reset" class="gl-ml-3 js-no-auto-disable">{{
+ $options.i18n.cancelAndClose
+ }}</gl-button>
+ </div>
+ </gl-tab>
+
+ <gl-tab :title="$options.i18n.integrationTabs.viewCredentials" :disabled="isCreating">
+ <alert-settings-form-help-block
+ :message="viewCredentialsHelpMsg"
+ link="https://docs.gitlab.com/ee/operations/incident_management/alert_integrations.html"
+ />
+
+ <gl-form-group id="integration-webhook">
<div class="gl-my-4">
<span class="gl-font-weight-bold">
- {{ s__('AlertSettings|Webhook URL') }}
+ {{ $options.i18n.integrationFormSteps.setupCredentials.webhookUrl }}
</span>
<gl-form-input-group id="url" readonly :value="integrationForm.url">
<template #append>
<clipboard-button
:text="integrationForm.url || ''"
- :title="__('Copy')"
+ :title="$options.i18n.copy"
class="gl-m-0!"
/>
</template>
@@ -462,7 +539,7 @@ export default {
<div class="gl-my-4">
<span class="gl-font-weight-bold">
- {{ $options.i18n.integrationFormSteps.step3.info }}
+ {{ $options.i18n.integrationFormSteps.setupCredentials.authorizationKey }}
</span>
<gl-form-input-group
@@ -474,124 +551,67 @@ export default {
<template #append>
<clipboard-button
:text="integrationForm.token || ''"
- :title="__('Copy')"
+ :title="$options.i18n.copy"
class="gl-m-0!"
/>
</template>
</gl-form-input-group>
-
- <gl-button v-gl-modal.authKeyModal :disabled="isResetAuthKeyDisabled">
- {{ $options.i18n.integrationFormSteps.step3.reset }}
- </gl-button>
- <gl-modal
- modal-id="authKeyModal"
- :title="$options.i18n.integrationFormSteps.step3.reset"
- :ok-title="$options.i18n.integrationFormSteps.step3.reset"
- ok-variant="danger"
- @ok="resetAuthKey"
- >
- {{ $options.i18n.integrationFormSteps.restKeyInfo.label }}
- </gl-modal>
</div>
</gl-form-group>
- <gl-form-group
- id="test-integration"
- :label="$options.i18n.integrationFormSteps.step4.label"
- label-for="test-integration"
- :class="{ 'gl-mb-0!': showMappingBuilder }"
- :invalid-feedback="integrationTestPayload.error"
+ <gl-button v-gl-modal.authKeyModal :disabled="isResetAuthKeyDisabled" variant="danger">
+ {{ $options.i18n.integrationFormSteps.setupCredentials.reset }}
+ </gl-button>
+
+ <gl-button type="reset" class="gl-ml-3 js-no-auto-disable">{{
+ $options.i18n.cancelAndClose
+ }}</gl-button>
+
+ <gl-modal
+ modal-id="authKeyModal"
+ :title="$options.i18n.integrationFormSteps.setupCredentials.reset"
+ :ok-title="$options.i18n.integrationFormSteps.setupCredentials.reset"
+ ok-variant="danger"
+ @ok="resetAuthKey"
>
+ {{ $options.i18n.integrationFormSteps.restKeyInfo.label }}
+ </gl-modal>
+ </gl-tab>
+
+ <gl-tab :title="$options.i18n.integrationTabs.sendTestAlert" :disabled="isCreating">
+ <gl-form-group id="test-integration" :invalid-feedback="testPayload.error">
<alert-settings-form-help-block
- :message="
- isPrometheus || !showMappingBuilder
- ? $options.i18n.integrationFormSteps.step4.prometheusHelp
- : $options.i18n.integrationFormSteps.step4.help
- "
+ :message="$options.i18n.integrationFormSteps.setSamplePayload.testPayloadHelp"
:link="generic.alertsUsageUrl"
/>
<gl-form-textarea
id="test-payload"
- v-model.trim="integrationTestPayload.json"
- :disabled="isPayloadEditDisabled"
- :state="jsonIsValid"
- :placeholder="$options.i18n.integrationFormSteps.step4.placeholder"
+ v-model.trim="testPayload.json"
+ :state="isTestPayloadValid"
+ :placeholder="$options.i18n.integrationFormSteps.setSamplePayload.placeholder"
class="gl-my-3"
:debounce="$options.JSON_VALIDATE_DELAY"
rows="6"
max-rows="10"
- @input="validateJson"
+ @input="validateJson(false)"
/>
</gl-form-group>
- <template v-if="showMappingBuilder">
- <gl-button
- v-if="canEditPayload"
- v-gl-modal.resetPayloadModal
- data-testid="payload-action-btn"
- :disabled="!active"
- class="gl-mt-3"
- >
- {{ $options.i18n.integrationFormSteps.step4.editPayload }}
- </gl-button>
-
- <gl-button
- v-else
- data-testid="payload-action-btn"
- :class="{ 'gl-mt-3': integrationTestPayload.error }"
- :disabled="!active"
- :loading="parsingPayload"
- @click="parseMapping"
- >
- {{ $options.i18n.integrationFormSteps.step4.submitPayload }}
- </gl-button>
- <gl-modal
- modal-id="resetPayloadModal"
- :title="$options.i18n.integrationFormSteps.step4.resetHeader"
- :ok-title="$options.i18n.integrationFormSteps.step4.resetOk"
- ok-variant="danger"
- @ok="resetSamplePayloadConfirmed = true"
- >
- {{ $options.i18n.integrationFormSteps.step4.resetBody }}
- </gl-modal>
- </template>
-
- <gl-form-group
- v-if="showMappingBuilder"
- id="mapping-builder"
- class="gl-mt-5"
- :label="$options.i18n.integrationFormSteps.step5.label"
- label-for="mapping-builder"
- >
- <span>{{ $options.i18n.integrationFormSteps.step5.intro }}</span>
- <mapping-builder
- :parsed-payload="parsedSamplePayload"
- :saved-mapping="savedMapping"
- :alert-fields="alertFields"
- @onMappingUpdate="updateMapping"
- />
- </gl-form-group>
- </div>
- <div class="gl-display-flex gl-justify-content-start gl-py-3">
<gl-button
- type="submit"
- variant="success"
+ :disabled="!isTestPayloadValid"
+ data-testid="send-test-alert"
+ variant="confirm"
class="js-no-auto-disable"
- data-testid="integration-form-submit"
- >{{ s__('AlertSettings|Save integration') }}
- </gl-button>
- <gl-button
- data-testid="integration-test-and-submit"
- :disabled="isSubmitTestPayloadDisabled"
- category="secondary"
- variant="success"
- class="gl-mx-3 js-no-auto-disable"
- @click="submitWithTestPayload"
- >{{ s__('AlertSettings|Save and test payload') }}</gl-button
+ @click="sendTestAlert"
>
- <gl-button type="reset" class="js-no-auto-disable">{{ __('Cancel') }}</gl-button>
- </div>
- </gl-collapse>
+ {{ $options.i18n.send }}
+ </gl-button>
+
+ <gl-button type="reset" class="gl-ml-3 js-no-auto-disable">{{
+ $options.i18n.cancelAndClose
+ }}</gl-button>
+ </gl-tab>
+ </gl-tabs>
</gl-form>
</template>
diff --git a/app/assets/javascripts/alerts_settings/components/alerts_settings_wrapper.vue b/app/assets/javascripts/alerts_settings/components/alerts_settings_wrapper.vue
index 366f2209fb2..3ffb652e61b 100644
--- a/app/assets/javascripts/alerts_settings/components/alerts_settings_wrapper.vue
+++ b/app/assets/javascripts/alerts_settings/components/alerts_settings_wrapper.vue
@@ -1,22 +1,26 @@
<script>
+import { GlButton } from '@gitlab/ui';
+import createHttpIntegrationMutation from 'ee_else_ce/alerts_settings/graphql/mutations/create_http_integration.mutation.graphql';
+import updateHttpIntegrationMutation from 'ee_else_ce/alerts_settings/graphql/mutations/update_http_integration.mutation.graphql';
import createFlash, { FLASH_TYPES } from '~/flash';
import { fetchPolicies } from '~/lib/graphql';
import { s__ } from '~/locale';
import { typeSet } from '../constants';
-import createHttpIntegrationMutation from '../graphql/mutations/create_http_integration.mutation.graphql';
import createPrometheusIntegrationMutation from '../graphql/mutations/create_prometheus_integration.mutation.graphql';
import destroyHttpIntegrationMutation from '../graphql/mutations/destroy_http_integration.mutation.graphql';
import resetHttpTokenMutation from '../graphql/mutations/reset_http_token.mutation.graphql';
import resetPrometheusTokenMutation from '../graphql/mutations/reset_prometheus_token.mutation.graphql';
-import updateCurrentIntergrationMutation from '../graphql/mutations/update_current_intergration.mutation.graphql';
-import updateHttpIntegrationMutation from '../graphql/mutations/update_http_integration.mutation.graphql';
+import updateCurrentHttpIntegrationMutation from '../graphql/mutations/update_current_http_integration.mutation.graphql';
+import updateCurrentPrometheusIntegrationMutation from '../graphql/mutations/update_current_prometheus_integration.mutation.graphql';
import updatePrometheusIntegrationMutation from '../graphql/mutations/update_prometheus_integration.mutation.graphql';
import getCurrentIntegrationQuery from '../graphql/queries/get_current_integration.query.graphql';
+import getHttpIntegrationsQuery from '../graphql/queries/get_http_integrations.query.graphql';
import getIntegrationsQuery from '../graphql/queries/get_integrations.query.graphql';
import service from '../services';
import {
updateStoreAfterIntegrationDelete,
updateStoreAfterIntegrationAdd,
+ updateStoreAfterHttpIntegrationAdd,
} from '../utils/cache_updates';
import {
DELETE_INTEGRATION_ERROR,
@@ -28,20 +32,24 @@ import {
import IntegrationsList from './alerts_integrations_list.vue';
import AlertSettingsForm from './alerts_settings_form.vue';
+export const i18n = {
+ changesSaved: s__(
+ 'AlertsIntegrations|The integration has been successfully saved. Alerts from this new integration should now appear on your alerts list.',
+ ),
+ integrationRemoved: s__('AlertsIntegrations|The integration has been successfully removed.'),
+ alertSent: s__(
+ 'AlertsIntegrations|The test alert has been successfully sent, and should now be visible on your alerts list.',
+ ),
+ addNewIntegration: s__('AlertSettings|Add new integration'),
+};
+
export default {
typeSet,
- i18n: {
- changesSaved: s__(
- 'AlertsIntegrations|The integration has been successfully saved. Alerts from this new integration should now appear on your alerts list.',
- ),
- integrationRemoved: s__('AlertsIntegrations|The integration has been successfully removed.'),
- alertSent: s__(
- 'AlertsIntegrations|The test alert has been successfully sent, and should now be visible on your alerts list.',
- ),
- },
+ i18n,
components: {
IntegrationsList,
AlertSettingsForm,
+ GlButton,
},
inject: {
generic: {
@@ -84,6 +92,28 @@ export default {
createFlash({ message: err });
},
},
+ // TODO: we'll need to update the logic to request specific http integration by its id on edit
+ // when BE adds support for it https://gitlab.com/gitlab-org/gitlab/-/issues/321674
+ // currently the request for ALL http integrations is made and on specific integration edit we search it in the list
+ httpIntegrations: {
+ fetchPolicy: fetchPolicies.CACHE_AND_NETWORK,
+ query: getHttpIntegrationsQuery,
+ variables() {
+ return {
+ projectPath: this.projectPath,
+ };
+ },
+ update(data) {
+ const { alertManagementHttpIntegrations: { nodes: list = [] } = {} } = data.project || {};
+
+ return {
+ list,
+ };
+ },
+ error(err) {
+ createFlash({ message: err });
+ },
+ },
currentIntegration: {
query: getCurrentIntegrationQuery,
},
@@ -91,9 +121,10 @@ export default {
data() {
return {
isUpdating: false,
- testAlertPayload: null,
integrations: {},
+ httpIntegrations: {},
currentIntegration: null,
+ formVisible: false,
};
},
computed: {
@@ -105,22 +136,28 @@ export default {
},
},
methods: {
+ isHttp(type) {
+ return type === typeSet.http;
+ },
createNewIntegration({ type, variables }) {
const { projectPath } = this;
+ const isHttp = this.isHttp(type);
this.isUpdating = true;
this.$apollo
.mutate({
- mutation:
- type === this.$options.typeSet.http
- ? createHttpIntegrationMutation
- : createPrometheusIntegrationMutation,
+ mutation: isHttp ? createHttpIntegrationMutation : createPrometheusIntegrationMutation,
variables: {
...variables,
projectPath,
},
update(store, { data }) {
updateStoreAfterIntegrationAdd(store, getIntegrationsQuery, data, { projectPath });
+ if (isHttp) {
+ updateStoreAfterHttpIntegrationAdd(store, getHttpIntegrationsQuery, data, {
+ projectPath,
+ });
+ }
},
})
.then(({ data: { httpIntegrationCreate, prometheusIntegrationCreate } = {} } = {}) => {
@@ -128,18 +165,9 @@ export default {
if (error) {
return createFlash({ message: error });
}
+ const { integration } = httpIntegrationCreate || prometheusIntegrationCreate;
- if (this.testAlertPayload) {
- const integration =
- httpIntegrationCreate?.integration || prometheusIntegrationCreate?.integration;
-
- const payload = {
- ...this.testAlertPayload,
- endpoint: integration.url,
- token: integration.token,
- };
- return this.validateAlertPayload(payload);
- }
+ this.editIntegration(integration);
return createFlash({
message: this.$options.i18n.changesSaved,
@@ -157,10 +185,9 @@ export default {
this.isUpdating = true;
this.$apollo
.mutate({
- mutation:
- type === this.$options.typeSet.http
- ? updateHttpIntegrationMutation
- : updatePrometheusIntegrationMutation,
+ mutation: this.isHttp(type)
+ ? updateHttpIntegrationMutation
+ : updatePrometheusIntegrationMutation,
variables: {
...variables,
id: this.currentIntegration.id,
@@ -172,11 +199,7 @@ export default {
return createFlash({ message: error });
}
- if (this.testAlertPayload) {
- return this.validateAlertPayload();
- }
-
- this.clearCurrentIntegration();
+ this.clearCurrentIntegration({ type });
return createFlash({
message: this.$options.i18n.changesSaved,
@@ -188,23 +211,19 @@ export default {
})
.finally(() => {
this.isUpdating = false;
- this.testAlertPayload = null;
});
},
resetToken({ type, variables }) {
this.isUpdating = true;
this.$apollo
.mutate({
- mutation:
- type === this.$options.typeSet.http
- ? resetHttpTokenMutation
- : resetPrometheusTokenMutation,
+ mutation: this.isHttp(type) ? resetHttpTokenMutation : resetPrometheusTokenMutation,
variables,
})
.then(
({ data: { httpIntegrationResetToken, prometheusIntegrationResetToken } = {} } = {}) => {
- const error =
- httpIntegrationResetToken?.errors[0] || prometheusIntegrationResetToken?.errors[0];
+ const [error] =
+ httpIntegrationResetToken?.errors || prometheusIntegrationResetToken?.errors;
if (error) {
return createFlash({ message: error });
}
@@ -214,10 +233,10 @@ export default {
prometheusIntegrationResetToken?.integration;
this.$apollo.mutate({
- mutation: updateCurrentIntergrationMutation,
- variables: {
- ...integration,
- },
+ mutation: this.isHttp(type)
+ ? updateCurrentHttpIntegrationMutation
+ : updateCurrentPrometheusIntegrationMutation,
+ variables: integration,
});
return createFlash({
@@ -233,33 +252,31 @@ export default {
this.isUpdating = false;
});
},
- editIntegration({ id }) {
- const currentIntegration = this.integrations.list.find(
- (integration) => integration.id === id,
- );
+ editIntegration({ id, type }) {
+ let currentIntegration = this.integrations.list.find((integration) => integration.id === id);
+ if (this.isHttp(type)) {
+ const httpIntegrationMappingData = this.httpIntegrations.list.find(
+ (integration) => integration.id === id,
+ );
+ currentIntegration = { ...currentIntegration, ...httpIntegrationMappingData };
+ }
+
this.$apollo.mutate({
- mutation: updateCurrentIntergrationMutation,
- variables: {
- id: currentIntegration.id,
- name: currentIntegration.name,
- active: currentIntegration.active,
- token: currentIntegration.token,
- type: currentIntegration.type,
- url: currentIntegration.url,
- apiUrl: currentIntegration.apiUrl,
- },
+ mutation: this.isHttp(type)
+ ? updateCurrentHttpIntegrationMutation
+ : updateCurrentPrometheusIntegrationMutation,
+ variables: currentIntegration,
});
+ this.setFormVisibility(true);
},
- deleteIntegration({ id }) {
+ deleteIntegration({ id, type }) {
const { projectPath } = this;
this.isUpdating = true;
this.$apollo
.mutate({
mutation: destroyHttpIntegrationMutation,
- variables: {
- id,
- },
+ variables: { id },
update(store, { data }) {
updateStoreAfterIntegrationDelete(store, getIntegrationsQuery, data, { projectPath });
},
@@ -269,7 +286,7 @@ export default {
if (error) {
return createFlash({ message: error });
}
- this.clearCurrentIntegration();
+ this.clearCurrentIntegration({ type });
return createFlash({
message: this.$options.i18n.integrationRemoved,
type: FLASH_TYPES.SUCCESS,
@@ -282,18 +299,20 @@ export default {
this.isUpdating = false;
});
},
- clearCurrentIntegration() {
- this.$apollo.mutate({
- mutation: updateCurrentIntergrationMutation,
- variables: {},
- });
- },
- setTestAlertPayload(payload) {
- this.testAlertPayload = payload;
+ clearCurrentIntegration({ type }) {
+ if (type) {
+ this.$apollo.mutate({
+ mutation: this.isHttp(type)
+ ? updateCurrentHttpIntegrationMutation
+ : updateCurrentPrometheusIntegrationMutation,
+ variables: {},
+ });
+ }
+ this.setFormVisibility(false);
},
- validateAlertPayload(payload) {
+ testAlertPayload(payload) {
return service
- .updateTestAlert(payload ?? this.testAlertPayload)
+ .updateTestAlert(payload)
.then(() => {
return createFlash({
message: this.$options.i18n.alertSent,
@@ -304,6 +323,9 @@ export default {
createFlash({ message: INTEGRATION_PAYLOAD_TEST_ERROR });
});
},
+ setFormVisibility(visible) {
+ this.formVisible = visible;
+ },
},
};
</script>
@@ -316,7 +338,18 @@ export default {
@edit-integration="editIntegration"
@delete-integration="deleteIntegration"
/>
+ <gl-button
+ v-if="canAddIntegration && !formVisible"
+ category="secondary"
+ variant="confirm"
+ data-testid="add-integration-btn"
+ class="gl-mt-3"
+ @click="setFormVisibility(true)"
+ >
+ {{ $options.i18n.addNewIntegration }}
+ </gl-button>
<alert-settings-form
+ v-if="formVisible"
:loading="isUpdating"
:can-add-integration="canAddIntegration"
:alert-fields="alertFields"
@@ -324,7 +357,7 @@ export default {
@update-integration="updateIntegration"
@reset-token="resetToken"
@clear-current-integration="clearCurrentIntegration"
- @set-test-alert-payload="setTestAlertPayload"
+ @test-alert-payload="testAlertPayload"
/>
</div>
</template>
diff --git a/app/assets/javascripts/alerts_settings/components/mocks/parsedMapping.json b/app/assets/javascripts/alerts_settings/components/mocks/parsedMapping.json
deleted file mode 100644
index 80fbebf2a60..00000000000
--- a/app/assets/javascripts/alerts_settings/components/mocks/parsedMapping.json
+++ /dev/null
@@ -1,95 +0,0 @@
-{
- "samplePayload": {
- "body": "{\n \"dashboardId\":1,\n \"evalMatches\":[\n {\n \"value\":1,\n \"metric\":\"Count\",\n \"tags\":{}\n }\n ],\n \"imageUrl\":\"https://grafana.com/static/assets/img/blog/mixed_styles.png\",\n \"message\":\"Notification Message\",\n \"orgId\":1,\n \"panelId\":2,\n \"ruleId\":1,\n \"ruleName\":\"Panel Title alert\",\n \"ruleUrl\":\"http://localhost:3000/d/hZ7BuVbWz/test-dashboard?fullscreen\\u0026edit\\u0026tab=alert\\u0026panelId=2\\u0026orgId=1\",\n \"state\":\"alerting\",\n \"tags\":{\n \"tag name\":\"tag value\"\n },\n \"title\":\"[Alerting] Panel Title alert\"\n}\n",
- "payloadAlerFields": {
- "nodes": [
- {
- "path": ["dashboardId"],
- "label": "Dashboard Id",
- "type": "string"
- },
- {
- "path": ["evalMatches"],
- "label": "Eval Matches",
- "type": "array"
- },
- {
- "path": ["createdAt"],
- "label": "Created At",
- "type": "datetime"
- },
- {
- "path": ["imageUrl"],
- "label": "Image Url",
- "type": "string"
- },
- {
- "path": ["message"],
- "label": "Message",
- "type": "string"
- },
- {
- "path": ["orgId"],
- "label": "Org Id",
- "type": "string"
- },
- {
- "path": ["panelId"],
- "label": "Panel Id",
- "type": "string"
- },
- {
- "path": ["ruleId"],
- "label": "Rule Id",
- "type": "string"
- },
- {
- "path": ["ruleName"],
- "label": "Rule Name",
- "type": "string"
- },
- {
- "path": ["ruleUrl"],
- "label": "Rule Url",
- "type": "string"
- },
- {
- "path": ["state"],
- "label": "State",
- "type": "string"
- },
- {
- "path": ["title"],
- "label": "Title",
- "type": "string"
- },
- {
- "path": ["tags", "tag"],
- "label": "Tags",
- "type": "string"
- }
- ]
- }
- },
- "storedMapping": {
- "nodes": [
- {
- "alertFieldName": "title",
- "payloadAlertPaths": "title",
- "fallbackAlertPaths": "ruleUrl"
- },
- {
- "alertFieldName": "description",
- "payloadAlertPaths": "message"
- },
- {
- "alertFieldName": "hosts",
- "payloadAlertPaths": "evalMatches"
- },
- {
- "alertFieldName": "startTime",
- "payloadAlertPaths": "createdAt"
- }
- ]
- }
-}
diff --git a/app/assets/javascripts/alerts_settings/constants.js b/app/assets/javascripts/alerts_settings/constants.js
index ecd7c921b2f..ce6cf61b5dd 100644
--- a/app/assets/javascripts/alerts_settings/constants.js
+++ b/app/assets/javascripts/alerts_settings/constants.js
@@ -1,50 +1,106 @@
-import { s__ } from '~/locale';
+import { s__, __ } from '~/locale';
-// TODO: Remove this as part of the form old removal
export const i18n = {
- usageSection: s__(
- 'AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page.',
- ),
- setupSection: s__(
- "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint.",
- ),
- errorMsg: s__('AlertSettings|There was an error updating the alert settings.'),
- errorKeyMsg: s__(
- 'AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again.',
- ),
- restKeyInfo: s__(
- 'AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in.',
- ),
+ integrationTabs: {
+ configureDetails: s__('AlertSettings|Configure details'),
+ viewCredentials: s__('AlertSettings|View credentials'),
+ sendTestAlert: s__('AlertSettings|Send test alert'),
+ },
+ integrationFormSteps: {
+ selectType: {
+ label: s__('AlertSettings|Select integration type'),
+ enterprise: s__(
+ 'AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations.',
+ ),
+ },
+ nameIntegration: {
+ label: s__('AlertSettings|Name integration'),
+ placeholder: s__('AlertSettings|Enter integration name'),
+ activeToggle: __('Active'),
+ },
+ setupCredentials: {
+ help: s__(
+ "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint.",
+ ),
+ prometheusHelp: s__(
+ 'AlertSettings|Utilize the URL and authorization key below to authorize Prometheus to send alerts to GitLab. Review the Prometheus documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint.',
+ ),
+ webhookUrl: s__('AlertSettings|Webhook URL'),
+ authorizationKey: s__('AlertSettings|Authorization key'),
+ reset: s__('AlertSettings|Reset Key'),
+ },
+ setSamplePayload: {
+ label: s__('AlertSettings|Sample alert payload (optional)'),
+ testPayloadHelpHttp: s__(
+ 'AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional).',
+ ),
+ testPayloadHelp: s__(
+ 'AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point.',
+ ),
+ placeholder: s__('AlertSettings|{ "events": [{ "application": "Name of application" }] }'),
+ resetHeader: s__('AlertSettings|Reset the mapping'),
+ resetBody: s__(
+ "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields.",
+ ),
+ resetOk: s__('AlertSettings|Proceed with editing'),
+ editPayload: s__('AlertSettings|Edit payload'),
+ parsePayload: s__('AlertSettings|Parse payload for custom mapping'),
+ payloadParsedSucessMsg: s__(
+ 'AlertSettings|Sample payload has been parsed. You can now map the fields.',
+ ),
+ },
+ mapFields: {
+ label: s__('AlertSettings|Customize alert payload mapping (optional)'),
+ intro: s__(
+ 'AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click "parse payload fields" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration.',
+ ),
+ },
+ prometheusFormUrl: {
+ label: s__('AlertSettings|Prometheus API base URL'),
+ help: s__('AlertSettings|URL cannot be blank and must start with http or https'),
+ },
+ restKeyInfo: {
+ label: s__(
+ 'AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in.',
+ ),
+ },
+ },
+ saveIntegration: s__('AlertSettings|Save integration'),
changesSaved: s__('AlertSettings|Your integration was successfully updated.'),
- prometheusInfo: s__('AlertSettings|Add URL and auth key to your Prometheus config file'),
- integrationsInfo: s__(
- 'AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}',
- ),
- resetKey: s__('AlertSettings|Reset key'),
- copyToClipboard: s__('AlertSettings|Copy'),
- apiBaseUrlLabel: s__('AlertSettings|API URL'),
- authKeyLabel: s__('AlertSettings|Authorization key'),
- urlLabel: s__('AlertSettings|Webhook URL'),
- activeLabel: s__('AlertSettings|Active'),
- apiBaseUrlHelpText: s__('AlertSettings|URL cannot be blank and must start with http or https'),
- testAlertInfo: s__('AlertSettings|Test alert payload'),
- alertJson: s__('AlertSettings|Alert test payload'),
- alertJsonPlaceholder: s__('AlertSettings|Enter test alert JSON....'),
- testAlertFailed: s__('AlertSettings|Test failed. Do you still want to save your changes anyway?'),
- testAlertSuccess: s__(
- 'AlertSettings|Test alert sent successfully. If you have made other changes, please save them now.',
- ),
- authKeyRest: s__(
- 'AlertSettings|Authorization key has been successfully reset. Please save your changes now.',
- ),
- integration: s__('AlertSettings|Integration'),
+ cancelAndClose: __('Cancel and close'),
+ send: s__('AlertSettings|Send'),
+ copy: __('Copy'),
};
-export const integrationTypes = [
- { value: '', text: s__('AlertSettings|Select integration type') },
- { value: 'HTTP', text: s__('AlertSettings|HTTP Endpoint') },
- { value: 'PROMETHEUS', text: s__('AlertSettings|External Prometheus') },
-];
+export const integrationSteps = {
+ selectType: 'SELECT_TYPE',
+ nameIntegration: 'NAME_INTEGRATION',
+ setPrometheusApiUrl: 'SET_PROMETHEUS_API_URL',
+ setSamplePayload: 'SET_SAMPLE_PAYLOAD',
+ customizeMapping: 'CUSTOMIZE_MAPPING',
+};
+
+export const createStepNumbers = {
+ [integrationSteps.selectType]: 1,
+ [integrationSteps.nameIntegration]: 2,
+ [integrationSteps.setPrometheusApiUrl]: 2,
+ [integrationSteps.setSamplePayload]: 3,
+ [integrationSteps.customizeMapping]: 4,
+};
+
+export const editStepNumbers = {
+ [integrationSteps.selectType]: 1,
+ [integrationSteps.nameIntegration]: 1,
+ [integrationSteps.setPrometheusApiUrl]: null,
+ [integrationSteps.setSamplePayload]: 2,
+ [integrationSteps.customizeMapping]: 3,
+};
+
+export const integrationTypes = {
+ none: { value: '', text: s__('AlertSettings|Select integration type') },
+ http: { value: 'HTTP', text: s__('AlertSettings|HTTP Endpoint') },
+ prometheus: { value: 'PROMETHEUS', text: s__('AlertSettings|External Prometheus') },
+};
export const typeSet = {
http: 'HTTP',
@@ -57,14 +113,18 @@ export const JSON_VALIDATE_DELAY = 250;
export const targetPrometheusUrlPlaceholder = 'http://prometheus.example.com/';
-export const sectionHash = 'js-alert-management-settings';
-
-/* eslint-disable @gitlab/require-i18n-strings */
-
/**
* Tracks snowplow event when user views alerts integration list
*/
export const trackAlertIntegrationsViewsOptions = {
+ /* eslint-disable-next-line @gitlab/require-i18n-strings */
category: 'Alert Integrations',
action: 'view_alert_integrations_list',
};
+
+export const mappingFields = {
+ mapping: 'mapping',
+ fallback: 'fallback',
+};
+
+export const viewCredentialsTabIndex = 1;
diff --git a/app/assets/javascripts/alerts_settings/graphql.js b/app/assets/javascripts/alerts_settings/graphql.js
index 5fd05169533..c6c19d26adb 100644
--- a/app/assets/javascripts/alerts_settings/graphql.js
+++ b/app/assets/javascripts/alerts_settings/graphql.js
@@ -10,7 +10,18 @@ const resolvers = {
Mutation: {
updateCurrentIntegration: (
_,
- { id = null, name, active, token, type, url, apiUrl },
+ {
+ id = null,
+ name,
+ active,
+ token,
+ type,
+ url,
+ apiUrl,
+ payloadExample,
+ payloadAttributeMappings,
+ payloadAlertFields,
+ },
{ cache },
) => {
const sourceData = cache.readQuery({ query: getCurrentIntegrationQuery });
@@ -28,6 +39,9 @@ const resolvers = {
type,
url,
apiUrl,
+ payloadExample,
+ payloadAttributeMappings,
+ payloadAlertFields,
};
}
});
diff --git a/app/assets/javascripts/alerts_settings/graphql/fragments/http_integration_item.fragment.graphql b/app/assets/javascripts/alerts_settings/graphql/fragments/http_integration_item.fragment.graphql
new file mode 100644
index 00000000000..742228e2928
--- /dev/null
+++ b/app/assets/javascripts/alerts_settings/graphql/fragments/http_integration_item.fragment.graphql
@@ -0,0 +1,7 @@
+#import "./integration_item.fragment.graphql"
+#import "ee_else_ce/alerts_settings/graphql/fragments/http_integration_payload_data.fragment.graphql"
+
+fragment HttpIntegrationItem on AlertManagementHttpIntegration {
+ ...IntegrationItem
+ ...HttpIntegrationPayloadData
+}
diff --git a/app/assets/javascripts/alerts_settings/graphql/fragments/http_integration_payload_data.fragment.graphql b/app/assets/javascripts/alerts_settings/graphql/fragments/http_integration_payload_data.fragment.graphql
new file mode 100644
index 00000000000..df6ad0b712d
--- /dev/null
+++ b/app/assets/javascripts/alerts_settings/graphql/fragments/http_integration_payload_data.fragment.graphql
@@ -0,0 +1,3 @@
+fragment HttpIntegrationPayloadData on AlertManagementHttpIntegration {
+ id
+}
diff --git a/app/assets/javascripts/alerts_settings/graphql/mutations/create_http_integration.mutation.graphql b/app/assets/javascripts/alerts_settings/graphql/mutations/create_http_integration.mutation.graphql
index f3fc10b4bd4..babcdea935d 100644
--- a/app/assets/javascripts/alerts_settings/graphql/mutations/create_http_integration.mutation.graphql
+++ b/app/assets/javascripts/alerts_settings/graphql/mutations/create_http_integration.mutation.graphql
@@ -1,24 +1,10 @@
-#import "../fragments/integration_item.fragment.graphql"
+#import "../fragments/http_integration_item.fragment.graphql"
-mutation createHttpIntegration(
- $projectPath: ID!
- $name: String!
- $active: Boolean!
- $payloadExample: JsonString
- $payloadAttributeMappings: [AlertManagementPayloadAlertFieldInput!]
-) {
- httpIntegrationCreate(
- input: {
- projectPath: $projectPath
- name: $name
- active: $active
- payloadExample: $payloadExample
- payloadAttributeMappings: $payloadAttributeMappings
- }
- ) {
+mutation createHttpIntegration($projectPath: ID!, $name: String!, $active: Boolean!) {
+ httpIntegrationCreate(input: { projectPath: $projectPath, name: $name, active: $active }) {
errors
integration {
- ...IntegrationItem
+ ...HttpIntegrationItem
}
}
}
diff --git a/app/assets/javascripts/alerts_settings/graphql/mutations/destroy_http_integration.mutation.graphql b/app/assets/javascripts/alerts_settings/graphql/mutations/destroy_http_integration.mutation.graphql
index 0a49c140e6a..a3a50651fd0 100644
--- a/app/assets/javascripts/alerts_settings/graphql/mutations/destroy_http_integration.mutation.graphql
+++ b/app/assets/javascripts/alerts_settings/graphql/mutations/destroy_http_integration.mutation.graphql
@@ -1,10 +1,10 @@
-#import "../fragments/integration_item.fragment.graphql"
+#import "../fragments/http_integration_item.fragment.graphql"
mutation destroyHttpIntegration($id: ID!) {
httpIntegrationDestroy(input: { id: $id }) {
errors
integration {
- ...IntegrationItem
+ ...HttpIntegrationItem
}
}
}
diff --git a/app/assets/javascripts/alerts_settings/graphql/mutations/reset_http_token.mutation.graphql b/app/assets/javascripts/alerts_settings/graphql/mutations/reset_http_token.mutation.graphql
index 178d1e13047..c0754d8e32b 100644
--- a/app/assets/javascripts/alerts_settings/graphql/mutations/reset_http_token.mutation.graphql
+++ b/app/assets/javascripts/alerts_settings/graphql/mutations/reset_http_token.mutation.graphql
@@ -1,10 +1,10 @@
-#import "../fragments/integration_item.fragment.graphql"
+#import "../fragments/http_integration_item.fragment.graphql"
mutation resetHttpIntegrationToken($id: ID!) {
httpIntegrationResetToken(input: { id: $id }) {
errors
integration {
- ...IntegrationItem
+ ...HttpIntegrationItem
}
}
}
diff --git a/app/assets/javascripts/alerts_settings/graphql/mutations/update_current_http_integration.mutation.graphql b/app/assets/javascripts/alerts_settings/graphql/mutations/update_current_http_integration.mutation.graphql
new file mode 100644
index 00000000000..5f3d305993c
--- /dev/null
+++ b/app/assets/javascripts/alerts_settings/graphql/mutations/update_current_http_integration.mutation.graphql
@@ -0,0 +1,25 @@
+mutation updateCurrentHttpIntegration(
+ $id: String
+ $name: String
+ $active: Boolean
+ $token: String
+ $type: String
+ $url: String
+ $apiUrl: String
+ $payloadExample: JsonString
+ $payloadAttributeMappings: [AlertManagementPayloadAlertFieldInput!]
+ $payloadAlertFields: [AlertManagementPayloadAlertField!]
+) {
+ updateCurrentIntegration(
+ id: $id
+ name: $name
+ active: $active
+ token: $token
+ type: $type
+ url: $url
+ apiUrl: $apiUrl
+ payloadExample: $payloadExample
+ payloadAttributeMappings: $payloadAttributeMappings
+ payloadAlertFields: $payloadAlertFields
+ ) @client
+}
diff --git a/app/assets/javascripts/alerts_settings/graphql/mutations/update_current_intergration.mutation.graphql b/app/assets/javascripts/alerts_settings/graphql/mutations/update_current_intergration.mutation.graphql
deleted file mode 100644
index 3505241309e..00000000000
--- a/app/assets/javascripts/alerts_settings/graphql/mutations/update_current_intergration.mutation.graphql
+++ /dev/null
@@ -1,19 +0,0 @@
-mutation updateCurrentIntegration(
- $id: String
- $name: String
- $active: Boolean
- $token: String
- $type: String
- $url: String
- $apiUrl: String
-) {
- updateCurrentIntegration(
- id: $id
- name: $name
- active: $active
- token: $token
- type: $type
- url: $url
- apiUrl: $apiUrl
- ) @client
-}
diff --git a/app/assets/javascripts/alerts_settings/graphql/mutations/update_current_prometheus_integration.mutation.graphql b/app/assets/javascripts/alerts_settings/graphql/mutations/update_current_prometheus_integration.mutation.graphql
new file mode 100644
index 00000000000..5bd63820629
--- /dev/null
+++ b/app/assets/javascripts/alerts_settings/graphql/mutations/update_current_prometheus_integration.mutation.graphql
@@ -0,0 +1,21 @@
+mutation updateCurrentPrometheusIntegration(
+ $id: String
+ $name: String
+ $active: Boolean
+ $token: String
+ $type: String
+ $url: String
+ $apiUrl: String
+ $samplePayload: String
+) {
+ updateCurrentIntegration(
+ id: $id
+ name: $name
+ active: $active
+ token: $token
+ type: $type
+ url: $url
+ apiUrl: $apiUrl
+ samplePayload: $samplePayload
+ ) @client
+}
diff --git a/app/assets/javascripts/alerts_settings/graphql/mutations/update_http_integration.mutation.graphql b/app/assets/javascripts/alerts_settings/graphql/mutations/update_http_integration.mutation.graphql
index bb5b334deeb..37df9ec25eb 100644
--- a/app/assets/javascripts/alerts_settings/graphql/mutations/update_http_integration.mutation.graphql
+++ b/app/assets/javascripts/alerts_settings/graphql/mutations/update_http_integration.mutation.graphql
@@ -1,10 +1,10 @@
-#import "../fragments/integration_item.fragment.graphql"
+#import "../fragments/http_integration_item.fragment.graphql"
mutation updateHttpIntegration($id: ID!, $name: String!, $active: Boolean!) {
httpIntegrationUpdate(input: { id: $id, name: $name, active: $active }) {
errors
integration {
- ...IntegrationItem
+ ...HttpIntegrationItem
}
}
}
diff --git a/app/assets/javascripts/alerts_settings/graphql/queries/get_http_integrations.query.graphql b/app/assets/javascripts/alerts_settings/graphql/queries/get_http_integrations.query.graphql
new file mode 100644
index 00000000000..833a2d6c12f
--- /dev/null
+++ b/app/assets/javascripts/alerts_settings/graphql/queries/get_http_integrations.query.graphql
@@ -0,0 +1,12 @@
+#import "ee_else_ce/alerts_settings/graphql/fragments/http_integration_payload_data.fragment.graphql"
+
+# TODO: this query need to accept http integration id to request a sepcific integration
+query getHttpIntegrations($projectPath: ID!) {
+ project(fullPath: $projectPath) {
+ alertManagementHttpIntegrations {
+ nodes {
+ ...HttpIntegrationPayloadData
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/alerts_settings/graphql/queries/parse_sample_payload.query.graphql b/app/assets/javascripts/alerts_settings/graphql/queries/parse_sample_payload.query.graphql
new file mode 100644
index 00000000000..159b2661f0b
--- /dev/null
+++ b/app/assets/javascripts/alerts_settings/graphql/queries/parse_sample_payload.query.graphql
@@ -0,0 +1,9 @@
+query parsePayloadFields($projectPath: ID!, $payload: String!) {
+ project(fullPath: $projectPath) {
+ alertManagementPayloadFields(payloadExample: $payload) {
+ path
+ label
+ type
+ }
+ }
+}
diff --git a/app/assets/javascripts/alerts_settings/index.js b/app/assets/javascripts/alerts_settings/index.js
index 8506b3fda01..321af9fedb6 100644
--- a/app/assets/javascripts/alerts_settings/index.js
+++ b/app/assets/javascripts/alerts_settings/index.js
@@ -63,10 +63,7 @@ export default (el) => {
render(createElement) {
return createElement('alert-settings-wrapper', {
props: {
- alertFields:
- gon.features?.multipleHttpIntegrationsCustomMapping && parseBoolean(multiIntegrations)
- ? JSON.parse(alertFields)
- : null,
+ alertFields: parseBoolean(multiIntegrations) ? JSON.parse(alertFields) : null,
},
});
},
diff --git a/app/assets/javascripts/alerts_settings/utils/cache_updates.js b/app/assets/javascripts/alerts_settings/utils/cache_updates.js
index 758f3eb6dd4..c29160c1e39 100644
--- a/app/assets/javascripts/alerts_settings/utils/cache_updates.js
+++ b/app/assets/javascripts/alerts_settings/utils/cache_updates.js
@@ -60,6 +60,32 @@ const addIntegrationToStore = (
});
};
+const addHttpIntegrationToStore = (store, query, { httpIntegrationCreate }, variables) => {
+ const integration = httpIntegrationCreate?.integration;
+ if (!integration) {
+ return;
+ }
+
+ const sourceData = store.readQuery({
+ query,
+ variables,
+ });
+
+ const data = produce(sourceData, (draftData) => {
+ // eslint-disable-next-line no-param-reassign
+ draftData.project.alertManagementHttpIntegrations.nodes = [
+ integration,
+ ...draftData.project.alertManagementHttpIntegrations.nodes,
+ ];
+ });
+
+ store.writeQuery({
+ query,
+ variables,
+ data,
+ });
+};
+
const onError = (data, message) => {
createFlash({ message });
throw new Error(data.errors);
@@ -82,3 +108,11 @@ export const updateStoreAfterIntegrationAdd = (store, query, data, variables) =>
addIntegrationToStore(store, query, data, variables);
}
};
+
+export const updateStoreAfterHttpIntegrationAdd = (store, query, data, variables) => {
+ if (hasErrors(data)) {
+ onError(data, ADD_INTEGRATION_ERROR);
+ } else {
+ addHttpIntegrationToStore(store, query, data, variables);
+ }
+};
diff --git a/app/assets/javascripts/alerts_settings/utils/error_messages.js b/app/assets/javascripts/alerts_settings/utils/error_messages.js
index 979d1ca3ccc..e380257f983 100644
--- a/app/assets/javascripts/alerts_settings/utils/error_messages.js
+++ b/app/assets/javascripts/alerts_settings/utils/error_messages.js
@@ -17,5 +17,5 @@ export const RESET_INTEGRATION_TOKEN_ERROR = s__(
);
export const INTEGRATION_PAYLOAD_TEST_ERROR = s__(
- 'AlertsIntegrations|Integration payload is invalid. You can still save your changes.',
+ 'AlertsIntegrations|Integration payload is invalid.',
);
diff --git a/app/assets/javascripts/alerts_settings/utils/mapping_transformations.js b/app/assets/javascripts/alerts_settings/utils/mapping_transformations.js
index a86103540c0..5c4b9bcd505 100644
--- a/app/assets/javascripts/alerts_settings/utils/mapping_transformations.js
+++ b/app/assets/javascripts/alerts_settings/utils/mapping_transformations.js
@@ -1,3 +1,4 @@
+import { isEqual } from 'lodash';
/**
* Given data for GitLab alert fields, parsed payload fields data and previously stored mapping (if any)
* creates an object in a form convenient to build UI && interact with it
@@ -10,16 +11,19 @@
export const getMappingData = (gitlabFields, payloadFields, savedMapping) => {
return gitlabFields.map((gitlabField) => {
// find fields from payload that match gitlab alert field by type
- const mappingFields = payloadFields.filter(({ type }) => gitlabField.types.includes(type));
+ const mappingFields = payloadFields.filter(({ type }) =>
+ gitlabField.types.includes(type.toLowerCase()),
+ );
// find the mapping that was previously stored
- const foundMapping = savedMapping.find(({ fieldName }) => fieldName === gitlabField.name);
-
- const { fallbackAlertPaths, payloadAlertPaths } = foundMapping || {};
+ const foundMapping = savedMapping.find(
+ ({ fieldName }) => fieldName.toLowerCase() === gitlabField.name,
+ );
+ const { path: mapping, fallbackPath: fallback } = foundMapping || {};
return {
- mapping: payloadAlertPaths,
- fallback: fallbackAlertPaths,
+ mapping,
+ fallback,
searchTerm: '',
fallbackSearchTerm: '',
mappingFields,
@@ -36,7 +40,7 @@ export const getMappingData = (gitlabFields, payloadFields, savedMapping) => {
*/
export const transformForSave = (mappingData) => {
return mappingData.reduce((acc, field) => {
- const mapped = field.mappingFields.find(({ name }) => name === field.mapping);
+ const mapped = field.mappingFields.find(({ path }) => isEqual(path, field.mapping));
if (mapped) {
const { path, type, label } = mapped;
acc.push({
@@ -49,13 +53,3 @@ export const transformForSave = (mappingData) => {
return acc;
}, []);
};
-
-/**
- * Adds `name` prop to each provided by BE parsed payload field
- * @param {Object} payload - parsed sample payload
- *
- * @return {Object} same as input with an extra `name` property which basically serves as a key to make a match
- */
-export const getPayloadFields = (payload) => {
- return payload.map((field) => ({ ...field, name: field.path.join('_') }));
-};
diff --git a/app/assets/javascripts/admin/dev_ops_report/components/usage_ping_disabled.vue b/app/assets/javascripts/analytics/devops_report/components/usage_ping_disabled.vue
index c0ad814172d..c0ad814172d 100644
--- a/app/assets/javascripts/admin/dev_ops_report/components/usage_ping_disabled.vue
+++ b/app/assets/javascripts/analytics/devops_report/components/usage_ping_disabled.vue
diff --git a/app/assets/javascripts/admin/dev_ops_report/devops_score_empty_state.js b/app/assets/javascripts/analytics/devops_report/devops_score_empty_state.js
index 0cb8d9be0e4..0cb8d9be0e4 100644
--- a/app/assets/javascripts/admin/dev_ops_report/devops_score_empty_state.js
+++ b/app/assets/javascripts/analytics/devops_report/devops_score_empty_state.js
diff --git a/app/assets/javascripts/analytics/instance_statistics/components/app.vue b/app/assets/javascripts/analytics/instance_statistics/components/app.vue
deleted file mode 100644
index 3bf41eaa008..00000000000
--- a/app/assets/javascripts/analytics/instance_statistics/components/app.vue
+++ /dev/null
@@ -1,48 +0,0 @@
-<script>
-import { TODAY, TOTAL_DAYS_TO_SHOW, START_DATE } from '../constants';
-import ChartsConfig from './charts_config';
-import InstanceCounts from './instance_counts.vue';
-import InstanceStatisticsCountChart from './instance_statistics_count_chart.vue';
-import ProjectsAndGroupsChart from './projects_and_groups_chart.vue';
-import UsersChart from './users_chart.vue';
-
-export default {
- name: 'InstanceStatisticsApp',
- components: {
- InstanceCounts,
- InstanceStatisticsCountChart,
- UsersChart,
- ProjectsAndGroupsChart,
- },
- TOTAL_DAYS_TO_SHOW,
- START_DATE,
- TODAY,
- configs: ChartsConfig,
-};
-</script>
-
-<template>
- <div>
- <instance-counts />
- <users-chart
- :start-date="$options.START_DATE"
- :end-date="$options.TODAY"
- :total-data-points="$options.TOTAL_DAYS_TO_SHOW"
- />
- <projects-and-groups-chart
- :start-date="$options.START_DATE"
- :end-date="$options.TODAY"
- :total-data-points="$options.TOTAL_DAYS_TO_SHOW"
- />
- <instance-statistics-count-chart
- v-for="chartOptions in $options.configs"
- :key="chartOptions.chartTitle"
- :queries="chartOptions.queries"
- :x-axis-title="chartOptions.xAxisTitle"
- :y-axis-title="chartOptions.yAxisTitle"
- :load-chart-error-message="chartOptions.loadChartError"
- :no-data-message="chartOptions.noDataMessage"
- :chart-title="chartOptions.chartTitle"
- />
- </div>
-</template>
diff --git a/app/assets/javascripts/analytics/instance_statistics/components/charts_config.js b/app/assets/javascripts/analytics/instance_statistics/components/charts_config.js
deleted file mode 100644
index 6fba3c56cfe..00000000000
--- a/app/assets/javascripts/analytics/instance_statistics/components/charts_config.js
+++ /dev/null
@@ -1,87 +0,0 @@
-import { s__, __, sprintf } from '~/locale';
-import query from '../graphql/queries/instance_count.query.graphql';
-
-const noDataMessage = s__('InstanceStatistics|No data available.');
-
-export default [
- {
- loadChartError: sprintf(
- s__(
- 'InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again.',
- ),
- ),
- noDataMessage,
- chartTitle: s__('InstanceStatistics|Pipelines'),
- yAxisTitle: s__('InstanceStatistics|Items'),
- xAxisTitle: s__('InstanceStatistics|Month'),
- queries: [
- {
- query,
- title: s__('InstanceStatistics|Pipelines total'),
- identifier: 'PIPELINES',
- loadError: sprintf(
- s__('InstanceStatistics|There was an error fetching the total pipelines'),
- ),
- },
- {
- query,
- title: s__('InstanceStatistics|Pipelines succeeded'),
- identifier: 'PIPELINES_SUCCEEDED',
- loadError: sprintf(
- s__('InstanceStatistics|There was an error fetching the successful pipelines'),
- ),
- },
- {
- query,
- title: s__('InstanceStatistics|Pipelines failed'),
- identifier: 'PIPELINES_FAILED',
- loadError: sprintf(
- s__('InstanceStatistics|There was an error fetching the failed pipelines'),
- ),
- },
- {
- query,
- title: s__('InstanceStatistics|Pipelines canceled'),
- identifier: 'PIPELINES_CANCELED',
- loadError: sprintf(
- s__('InstanceStatistics|There was an error fetching the cancelled pipelines'),
- ),
- },
- {
- query,
- title: s__('InstanceStatistics|Pipelines skipped'),
- identifier: 'PIPELINES_SKIPPED',
- loadError: sprintf(
- s__('InstanceStatistics|There was an error fetching the skipped pipelines'),
- ),
- },
- ],
- },
- {
- loadChartError: sprintf(
- s__(
- 'InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again.',
- ),
- ),
- noDataMessage,
- chartTitle: s__('InstanceStatistics|Issues & Merge Requests'),
- yAxisTitle: s__('InstanceStatistics|Items'),
- xAxisTitle: s__('InstanceStatistics|Month'),
- queries: [
- {
- query,
- title: __('Issues'),
- identifier: 'ISSUES',
- loadError: sprintf(s__('InstanceStatistics|There was an error fetching the issues')),
- },
- {
- query,
- title: __('Merge requests'),
- identifier: 'MERGE_REQUESTS',
- loadError: sprintf(
- s__('InstanceStatistics|There was an error fetching the merge requests'),
- ),
- },
- ],
- },
-];
diff --git a/app/assets/javascripts/analytics/instance_statistics/components/instance_counts.vue b/app/assets/javascripts/analytics/instance_statistics/components/instance_counts.vue
deleted file mode 100644
index f3779ed62e9..00000000000
--- a/app/assets/javascripts/analytics/instance_statistics/components/instance_counts.vue
+++ /dev/null
@@ -1,64 +0,0 @@
-<script>
-import MetricCard from '~/analytics/shared/components/metric_card.vue';
-import { deprecatedCreateFlash as createFlash } from '~/flash';
-import { SUPPORTED_FORMATS, getFormatter } from '~/lib/utils/unit_format';
-import { s__ } from '~/locale';
-import * as Sentry from '~/sentry/wrapper';
-import instanceStatisticsCountQuery from '../graphql/queries/instance_statistics_count.query.graphql';
-
-const defaultPrecision = 0;
-
-export default {
- name: 'InstanceCounts',
- components: {
- MetricCard,
- },
- data() {
- return {
- counts: [],
- };
- },
- apollo: {
- counts: {
- query: instanceStatisticsCountQuery,
- update(data) {
- return Object.entries(data).map(([key, obj]) => {
- const label = this.$options.i18n.labels[key];
- const formatter = getFormatter(SUPPORTED_FORMATS.number);
- const value = obj.nodes?.length ? formatter(obj.nodes[0].count, defaultPrecision) : null;
-
- return {
- key,
- value,
- label,
- };
- });
- },
- error(error) {
- createFlash(this.$options.i18n.loadCountsError);
- Sentry.captureException(error);
- },
- },
- },
- i18n: {
- labels: {
- users: s__('InstanceStatistics|Users'),
- projects: s__('InstanceStatistics|Projects'),
- groups: s__('InstanceStatistics|Groups'),
- issues: s__('InstanceStatistics|Issues'),
- mergeRequests: s__('InstanceStatistics|Merge Requests'),
- pipelines: s__('InstanceStatistics|Pipelines'),
- },
- loadCountsError: s__('Could not load instance counts. Please refresh the page to try again.'),
- },
-};
-</script>
-
-<template>
- <metric-card
- :title="__('Usage Trends')"
- :metrics="counts"
- :is-loading="$apollo.queries.counts.loading"
- class="gl-mt-4"
- />
-</template>
diff --git a/app/assets/javascripts/analytics/instance_statistics/components/instance_statistics_count_chart.vue b/app/assets/javascripts/analytics/instance_statistics/components/instance_statistics_count_chart.vue
deleted file mode 100644
index e2defe0572d..00000000000
--- a/app/assets/javascripts/analytics/instance_statistics/components/instance_statistics_count_chart.vue
+++ /dev/null
@@ -1,206 +0,0 @@
-<script>
-import { GlAlert } from '@gitlab/ui';
-import { GlLineChart } from '@gitlab/ui/dist/charts';
-import { some, every } from 'lodash';
-import {
- differenceInMonths,
- formatDateAsMonth,
- getDayDifference,
-} from '~/lib/utils/datetime_utility';
-import * as Sentry from '~/sentry/wrapper';
-import ChartSkeletonLoader from '~/vue_shared/components/resizable_chart/skeleton_loader.vue';
-import { TODAY, START_DATE } from '../constants';
-import { getAverageByMonth, getEarliestDate, generateDataKeys } from '../utils';
-
-const QUERY_DATA_KEY = 'instanceStatisticsMeasurements';
-
-export default {
- name: 'InstanceStatisticsCountChart',
- components: {
- GlLineChart,
- GlAlert,
- ChartSkeletonLoader,
- },
- startDate: START_DATE,
- endDate: TODAY,
- props: {
- chartTitle: {
- type: String,
- required: true,
- },
- loadChartErrorMessage: {
- type: String,
- required: true,
- },
- noDataMessage: {
- type: String,
- required: true,
- },
- xAxisTitle: {
- type: String,
- required: true,
- },
- yAxisTitle: {
- type: String,
- required: true,
- },
- queries: {
- type: Array,
- required: true,
- },
- },
- data() {
- return {
- errors: { ...generateDataKeys(this.queries, '') },
- ...generateDataKeys(this.queries, []),
- };
- },
- computed: {
- errorMessages() {
- return Object.values(this.errors);
- },
- isLoading() {
- return some(this.$apollo.queries, (query) => query?.loading);
- },
- allQueriesFailed() {
- return every(this.errorMessages, (message) => message.length);
- },
- hasLoadingErrors() {
- return some(this.errorMessages, (message) => message.length);
- },
- errorMessage() {
- // show the generic loading message if all requests fail
- return this.allQueriesFailed ? this.loadChartErrorMessage : this.errorMessages.join('\n\n');
- },
- hasEmptyDataSet() {
- return this.chartData.every(({ data }) => data.length === 0);
- },
- totalDaysToShow() {
- return getDayDifference(this.$options.startDate, this.$options.endDate);
- },
- chartData() {
- const options = { shouldRound: true };
- return this.queries.map(({ identifier, title }) => ({
- name: title,
- data: getAverageByMonth(this[identifier]?.nodes, options),
- }));
- },
- range() {
- return {
- min: this.$options.startDate,
- max: this.$options.endDate,
- };
- },
- chartOptions() {
- const { endDate, startDate } = this.$options;
- return {
- xAxis: {
- ...this.range,
- name: this.xAxisTitle,
- type: 'time',
- splitNumber: differenceInMonths(startDate, endDate) + 1,
- axisLabel: {
- interval: 0,
- showMinLabel: false,
- showMaxLabel: false,
- align: 'right',
- formatter: formatDateAsMonth,
- },
- },
- yAxis: {
- name: this.yAxisTitle,
- },
- };
- },
- },
- created() {
- this.queries.forEach(({ query, identifier, loadError }) => {
- this.$apollo.addSmartQuery(identifier, {
- query,
- variables() {
- return {
- identifier,
- first: this.totalDaysToShow,
- after: null,
- };
- },
- update(data) {
- const { nodes = [], pageInfo } = data[QUERY_DATA_KEY] || {};
- return {
- nodes,
- pageInfo,
- };
- },
- result() {
- const { pageInfo, nodes } = this[identifier];
- if (pageInfo?.hasNextPage && this.calculateDaysToFetch(getEarliestDate(nodes)) > 0) {
- this.fetchNextPage({
- query: this.$apollo.queries[identifier],
- errorMessage: loadError,
- pageInfo,
- identifier,
- });
- }
- },
- error(error) {
- this.handleError({
- message: loadError,
- identifier,
- error,
- });
- },
- });
- });
- },
- methods: {
- calculateDaysToFetch(firstDataPointDate = null) {
- return firstDataPointDate
- ? Math.max(0, getDayDifference(this.$options.startDate, new Date(firstDataPointDate)))
- : 0;
- },
- handleError({ identifier, error, message }) {
- this.loadingError = true;
- this.errors = { ...this.errors, [identifier]: message };
- Sentry.captureException(error);
- },
- fetchNextPage({ query, pageInfo, identifier, errorMessage }) {
- query
- .fetchMore({
- variables: {
- identifier,
- first: this.calculateDaysToFetch(getEarliestDate(this[identifier].nodes)),
- after: pageInfo.endCursor,
- },
- updateQuery: (previousResult, { fetchMoreResult }) => {
- const { nodes, ...rest } = fetchMoreResult[QUERY_DATA_KEY];
- const { nodes: previousNodes } = previousResult[QUERY_DATA_KEY];
- return {
- [QUERY_DATA_KEY]: { ...rest, nodes: [...previousNodes, ...nodes] },
- };
- },
- })
- .catch((error) => this.handleError({ identifier, error, message: errorMessage }));
- },
- },
-};
-</script>
-<template>
- <div>
- <h3>{{ chartTitle }}</h3>
- <gl-alert v-if="hasLoadingErrors" variant="danger" :dismissible="false" class="gl-mt-3">
- {{ errorMessage }}
- </gl-alert>
- <div v-if="!allQueriesFailed">
- <chart-skeleton-loader v-if="isLoading" />
- <gl-alert v-else-if="hasEmptyDataSet" variant="info" :dismissible="false" class="gl-mt-3">
- {{ noDataMessage }}
- </gl-alert>
- <gl-line-chart
- v-else
- :option="chartOptions"
- :include-legend-avg-max="true"
- :data="chartData"
- />
- </div>
- </div>
-</template>
diff --git a/app/assets/javascripts/analytics/instance_statistics/components/projects_and_groups_chart.vue b/app/assets/javascripts/analytics/instance_statistics/components/projects_and_groups_chart.vue
deleted file mode 100644
index 3ffec90fb68..00000000000
--- a/app/assets/javascripts/analytics/instance_statistics/components/projects_and_groups_chart.vue
+++ /dev/null
@@ -1,224 +0,0 @@
-<script>
-import { GlAlert } from '@gitlab/ui';
-import { GlLineChart } from '@gitlab/ui/dist/charts';
-import produce from 'immer';
-import { sortBy } from 'lodash';
-import { formatDateAsMonth } from '~/lib/utils/datetime_utility';
-import { s__, __ } from '~/locale';
-import * as Sentry from '~/sentry/wrapper';
-import ChartSkeletonLoader from '~/vue_shared/components/resizable_chart/skeleton_loader.vue';
-import latestGroupsQuery from '../graphql/queries/groups.query.graphql';
-import latestProjectsQuery from '../graphql/queries/projects.query.graphql';
-import { getAverageByMonth } from '../utils';
-
-const sortByDate = (data) => sortBy(data, (item) => new Date(item[0]).getTime());
-
-const averageAndSortData = (data = [], maxDataPoints) => {
- const averaged = getAverageByMonth(
- data.length > maxDataPoints ? data.slice(0, maxDataPoints) : data,
- { shouldRound: true },
- );
- return sortByDate(averaged);
-};
-
-export default {
- name: 'ProjectsAndGroupsChart',
- components: { GlAlert, GlLineChart, ChartSkeletonLoader },
- props: {
- startDate: {
- type: Date,
- required: true,
- },
- endDate: {
- type: Date,
- required: true,
- },
- totalDataPoints: {
- type: Number,
- required: true,
- },
- },
- data() {
- return {
- loadingError: false,
- errorMessage: '',
- groups: [],
- projects: [],
- groupsPageInfo: null,
- projectsPageInfo: null,
- };
- },
- apollo: {
- groups: {
- query: latestGroupsQuery,
- variables() {
- return {
- first: this.totalDataPoints,
- after: null,
- };
- },
- update(data) {
- return data.groups?.nodes || [];
- },
- result({ data }) {
- const {
- groups: { pageInfo },
- } = data;
- this.groupsPageInfo = pageInfo;
- this.fetchNextPage({
- query: this.$apollo.queries.groups,
- pageInfo: this.groupsPageInfo,
- dataKey: 'groups',
- errorMessage: this.$options.i18n.loadGroupsDataError,
- });
- },
- error(error) {
- this.handleError({
- message: this.$options.i18n.loadGroupsDataError,
- error,
- dataKey: 'groups',
- });
- },
- },
- projects: {
- query: latestProjectsQuery,
- variables() {
- return {
- first: this.totalDataPoints,
- after: null,
- };
- },
- update(data) {
- return data.projects?.nodes || [];
- },
- result({ data }) {
- const {
- projects: { pageInfo },
- } = data;
- this.projectsPageInfo = pageInfo;
- this.fetchNextPage({
- query: this.$apollo.queries.projects,
- pageInfo: this.projectsPageInfo,
- dataKey: 'projects',
- errorMessage: this.$options.i18n.loadProjectsDataError,
- });
- },
- error(error) {
- this.handleError({
- message: this.$options.i18n.loadProjectsDataError,
- error,
- dataKey: 'projects',
- });
- },
- },
- },
- i18n: {
- yAxisTitle: s__('InstanceStatistics|Total projects & groups'),
- xAxisTitle: __('Month'),
- loadChartError: s__(
- 'InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again.',
- ),
- loadProjectsDataError: s__('InstanceStatistics|There was an error while loading the projects'),
- loadGroupsDataError: s__('InstanceStatistics|There was an error while loading the groups'),
- noDataMessage: s__('InstanceStatistics|No data available.'),
- },
- computed: {
- isLoadingGroups() {
- return this.$apollo.queries.groups.loading || this.groupsPageInfo?.hasNextPage;
- },
- isLoadingProjects() {
- return this.$apollo.queries.projects.loading || this.projectsPageInfo?.hasNextPage;
- },
- isLoading() {
- return this.isLoadingProjects && this.isLoadingGroups;
- },
- groupChartData() {
- return averageAndSortData(this.groups, this.totalDataPoints);
- },
- projectChartData() {
- return averageAndSortData(this.projects, this.totalDataPoints);
- },
- hasNoData() {
- const { projectChartData, groupChartData } = this;
- return Boolean(!projectChartData.length && !groupChartData.length);
- },
- options() {
- return {
- xAxis: {
- name: this.$options.i18n.xAxisTitle,
- type: 'category',
- axisLabel: {
- formatter: (value) => {
- return formatDateAsMonth(value);
- },
- },
- },
- yAxis: {
- name: this.$options.i18n.yAxisTitle,
- },
- };
- },
- chartData() {
- return [
- {
- name: s__('InstanceStatistics|Total projects'),
- data: this.projectChartData,
- },
- {
- name: s__('InstanceStatistics|Total groups'),
- data: this.groupChartData,
- },
- ];
- },
- },
- methods: {
- handleError({ error, message = this.$options.i18n.loadChartError, dataKey = null }) {
- this.loadingError = true;
- this.errorMessage = message;
- if (!dataKey) {
- this.projects = [];
- this.groups = [];
- } else {
- this[dataKey] = [];
- }
- Sentry.captureException(error);
- },
- fetchNextPage({ pageInfo, query, dataKey, errorMessage }) {
- if (pageInfo?.hasNextPage) {
- query
- .fetchMore({
- variables: { first: this.totalDataPoints, after: pageInfo.endCursor },
- updateQuery: (previousResult, { fetchMoreResult }) => {
- const results = produce(fetchMoreResult, (newData) => {
- // eslint-disable-next-line no-param-reassign
- newData[dataKey].nodes = [
- ...previousResult[dataKey].nodes,
- ...newData[dataKey].nodes,
- ];
- });
- return results;
- },
- })
- .catch((error) => {
- this.handleError({ error, message: errorMessage, dataKey });
- });
- }
- },
- },
-};
-</script>
-<template>
- <div>
- <h3>{{ $options.i18n.yAxisTitle }}</h3>
- <chart-skeleton-loader v-if="isLoading" />
- <gl-alert v-else-if="hasNoData" variant="info" :dismissible="false" class="gl-mt-3">
- {{ $options.i18n.noDataMessage }}
- </gl-alert>
- <div v-else>
- <gl-alert v-if="loadingError" variant="danger" :dismissible="false" class="gl-mt-3">{{
- errorMessage
- }}</gl-alert>
- <gl-line-chart :option="options" :include-legend-avg-max="true" :data="chartData" />
- </div>
- </div>
-</template>
diff --git a/app/assets/javascripts/analytics/instance_statistics/components/users_chart.vue b/app/assets/javascripts/analytics/instance_statistics/components/users_chart.vue
deleted file mode 100644
index 73940f028a1..00000000000
--- a/app/assets/javascripts/analytics/instance_statistics/components/users_chart.vue
+++ /dev/null
@@ -1,143 +0,0 @@
-<script>
-import { GlAlert } from '@gitlab/ui';
-import { GlAreaChart } from '@gitlab/ui/dist/charts';
-import produce from 'immer';
-import { sortBy } from 'lodash';
-import { formatDateAsMonth } from '~/lib/utils/datetime_utility';
-import { __ } from '~/locale';
-import * as Sentry from '~/sentry/wrapper';
-import ChartSkeletonLoader from '~/vue_shared/components/resizable_chart/skeleton_loader.vue';
-import usersQuery from '../graphql/queries/users.query.graphql';
-import { getAverageByMonth } from '../utils';
-
-const sortByDate = (data) => sortBy(data, (item) => new Date(item[0]).getTime());
-
-export default {
- name: 'UsersChart',
- components: { GlAlert, GlAreaChart, ChartSkeletonLoader },
- props: {
- startDate: {
- type: Date,
- required: true,
- },
- endDate: {
- type: Date,
- required: true,
- },
- totalDataPoints: {
- type: Number,
- required: true,
- },
- },
- data() {
- return {
- loadingError: null,
- users: [],
- pageInfo: null,
- };
- },
- apollo: {
- users: {
- query: usersQuery,
- variables() {
- return {
- first: this.totalDataPoints,
- after: null,
- };
- },
- update(data) {
- return data.users?.nodes || [];
- },
- result({ data }) {
- const {
- users: { pageInfo },
- } = data;
- this.pageInfo = pageInfo;
- this.fetchNextPage();
- },
- error(error) {
- this.handleError(error);
- },
- },
- },
- i18n: {
- yAxisTitle: __('Total users'),
- xAxisTitle: __('Month'),
- loadUserChartError: __('Could not load the user chart. Please refresh the page to try again.'),
- noDataMessage: __('There is no data available.'),
- },
- computed: {
- isLoading() {
- return this.$apollo.queries.users.loading || this.pageInfo?.hasNextPage;
- },
- chartUserData() {
- const averaged = getAverageByMonth(
- this.users.length > this.totalDataPoints
- ? this.users.slice(0, this.totalDataPoints)
- : this.users,
- { shouldRound: true },
- );
- return sortByDate(averaged);
- },
- options() {
- return {
- xAxis: {
- name: this.$options.i18n.xAxisTitle,
- type: 'category',
- axisLabel: {
- formatter: formatDateAsMonth,
- },
- },
- yAxis: {
- name: this.$options.i18n.yAxisTitle,
- },
- };
- },
- },
- methods: {
- handleError(error) {
- this.loadingError = true;
- this.users = [];
- Sentry.captureException(error);
- },
- fetchNextPage() {
- if (this.pageInfo?.hasNextPage) {
- this.$apollo.queries.users
- .fetchMore({
- variables: { first: this.totalDataPoints, after: this.pageInfo.endCursor },
- updateQuery: (previousResult, { fetchMoreResult }) => {
- return produce(fetchMoreResult, (newUsers) => {
- // eslint-disable-next-line no-param-reassign
- newUsers.users.nodes = [...previousResult.users.nodes, ...newUsers.users.nodes];
- });
- },
- })
- .catch(this.handleError);
- }
- },
- },
-};
-</script>
-<template>
- <div>
- <h3>{{ $options.i18n.yAxisTitle }}</h3>
- <gl-alert v-if="loadingError" variant="danger" :dismissible="false" class="gl-mt-3">
- {{ this.$options.i18n.loadUserChartError }}
- </gl-alert>
- <chart-skeleton-loader v-else-if="isLoading" />
- <gl-alert v-else-if="!chartUserData.length" variant="info" :dismissible="false" class="gl-mt-3">
- {{ $options.i18n.noDataMessage }}
- </gl-alert>
- <gl-area-chart
- v-else
- :option="options"
- :include-legend-avg-max="true"
- :data="[
- {
- name: $options.i18n.yAxisTitle,
- data: chartUserData,
- },
- ]"
- />
- </div>
-</template>
diff --git a/app/assets/javascripts/analytics/instance_statistics/graphql/fragments/count.fragment.graphql b/app/assets/javascripts/analytics/instance_statistics/graphql/fragments/count.fragment.graphql
deleted file mode 100644
index 40cef95c2e7..00000000000
--- a/app/assets/javascripts/analytics/instance_statistics/graphql/fragments/count.fragment.graphql
+++ /dev/null
@@ -1,4 +0,0 @@
-fragment Count on InstanceStatisticsMeasurement {
- count
- recordedAt
-}
diff --git a/app/assets/javascripts/analytics/instance_statistics/graphql/queries/groups.query.graphql b/app/assets/javascripts/analytics/instance_statistics/graphql/queries/groups.query.graphql
deleted file mode 100644
index ec56d91ffaa..00000000000
--- a/app/assets/javascripts/analytics/instance_statistics/graphql/queries/groups.query.graphql
+++ /dev/null
@@ -1,13 +0,0 @@
-#import "~/graphql_shared/fragments/pageInfo.fragment.graphql"
-#import "../fragments/count.fragment.graphql"
-
-query getGroupsCount($first: Int, $after: String) {
- groups: instanceStatisticsMeasurements(identifier: GROUPS, first: $first, after: $after) {
- nodes {
- ...Count
- }
- pageInfo {
- ...PageInfo
- }
- }
-}
diff --git a/app/assets/javascripts/analytics/instance_statistics/graphql/queries/instance_count.query.graphql b/app/assets/javascripts/analytics/instance_statistics/graphql/queries/instance_count.query.graphql
deleted file mode 100644
index dd22a16cd51..00000000000
--- a/app/assets/javascripts/analytics/instance_statistics/graphql/queries/instance_count.query.graphql
+++ /dev/null
@@ -1,13 +0,0 @@
-#import "~/graphql_shared/fragments/pageInfo.fragment.graphql"
-#import "../fragments/count.fragment.graphql"
-
-query getCount($identifier: MeasurementIdentifier!, $first: Int, $after: String) {
- instanceStatisticsMeasurements(identifier: $identifier, first: $first, after: $after) {
- nodes {
- ...Count
- }
- pageInfo {
- ...PageInfo
- }
- }
-}
diff --git a/app/assets/javascripts/analytics/instance_statistics/graphql/queries/instance_statistics_count.query.graphql b/app/assets/javascripts/analytics/instance_statistics/graphql/queries/instance_statistics_count.query.graphql
deleted file mode 100644
index f14c2658674..00000000000
--- a/app/assets/javascripts/analytics/instance_statistics/graphql/queries/instance_statistics_count.query.graphql
+++ /dev/null
@@ -1,34 +0,0 @@
-#import "../fragments/count.fragment.graphql"
-
-query getInstanceCounts {
- projects: instanceStatisticsMeasurements(identifier: PROJECTS, first: 1) {
- nodes {
- ...Count
- }
- }
- groups: instanceStatisticsMeasurements(identifier: GROUPS, first: 1) {
- nodes {
- ...Count
- }
- }
- users: instanceStatisticsMeasurements(identifier: USERS, first: 1) {
- nodes {
- ...Count
- }
- }
- issues: instanceStatisticsMeasurements(identifier: ISSUES, first: 1) {
- nodes {
- ...Count
- }
- }
- mergeRequests: instanceStatisticsMeasurements(identifier: MERGE_REQUESTS, first: 1) {
- nodes {
- ...Count
- }
- }
- pipelines: instanceStatisticsMeasurements(identifier: PIPELINES, first: 1) {
- nodes {
- ...Count
- }
- }
-}
diff --git a/app/assets/javascripts/analytics/instance_statistics/graphql/queries/projects.query.graphql b/app/assets/javascripts/analytics/instance_statistics/graphql/queries/projects.query.graphql
deleted file mode 100644
index 0845b703435..00000000000
--- a/app/assets/javascripts/analytics/instance_statistics/graphql/queries/projects.query.graphql
+++ /dev/null
@@ -1,13 +0,0 @@
-#import "~/graphql_shared/fragments/pageInfo.fragment.graphql"
-#import "../fragments/count.fragment.graphql"
-
-query getProjectsCount($first: Int, $after: String) {
- projects: instanceStatisticsMeasurements(identifier: PROJECTS, first: $first, after: $after) {
- nodes {
- ...Count
- }
- pageInfo {
- ...PageInfo
- }
- }
-}
diff --git a/app/assets/javascripts/analytics/instance_statistics/graphql/queries/users.query.graphql b/app/assets/javascripts/analytics/instance_statistics/graphql/queries/users.query.graphql
deleted file mode 100644
index 6235e36eb89..00000000000
--- a/app/assets/javascripts/analytics/instance_statistics/graphql/queries/users.query.graphql
+++ /dev/null
@@ -1,13 +0,0 @@
-#import "~/graphql_shared/fragments/pageInfo.fragment.graphql"
-#import "../fragments/count.fragment.graphql"
-
-query getUsersCount($first: Int, $after: String) {
- users: instanceStatisticsMeasurements(identifier: USERS, first: $first, after: $after) {
- nodes {
- ...Count
- }
- pageInfo {
- ...PageInfo
- }
- }
-}
diff --git a/app/assets/javascripts/analytics/instance_statistics/index.js b/app/assets/javascripts/analytics/instance_statistics/index.js
deleted file mode 100644
index 0d7dcf6ace8..00000000000
--- a/app/assets/javascripts/analytics/instance_statistics/index.js
+++ /dev/null
@@ -1,24 +0,0 @@
-import Vue from 'vue';
-import VueApollo from 'vue-apollo';
-import createDefaultClient from '~/lib/graphql';
-import InstanceStatisticsApp from './components/app.vue';
-
-Vue.use(VueApollo);
-
-const apolloProvider = new VueApollo({
- defaultClient: createDefaultClient(),
-});
-
-export default () => {
- const el = document.getElementById('js-instance-statistics-app');
-
- if (!el) return false;
-
- return new Vue({
- el,
- apolloProvider,
- render(h) {
- return h(InstanceStatisticsApp);
- },
- });
-};
diff --git a/app/assets/javascripts/analytics/instance_statistics/utils.js b/app/assets/javascripts/analytics/instance_statistics/utils.js
deleted file mode 100644
index 396962ffad6..00000000000
--- a/app/assets/javascripts/analytics/instance_statistics/utils.js
+++ /dev/null
@@ -1,68 +0,0 @@
-import { masks } from 'dateformat';
-import { get } from 'lodash';
-import { formatDate } from '~/lib/utils/datetime_utility';
-
-const { isoDate } = masks;
-
-/**
- * Takes an array of items and returns one item per month with the average of the `count`s from that month
- * @param {Array} items
- * @param {Number} items[index].count value to be averaged
- * @param {String} items[index].recordedAt item dateTime time stamp to be collected into a month
- * @param {Object} options
- * @param {Object} options.shouldRound an option to specify whether the retuned averages should be rounded
- * @return {Array} items collected into [month, average],
- * where month is a dateTime string representing the first of the given month
- * and average is the average of the count
- */
-export function getAverageByMonth(items = [], options = {}) {
- const { shouldRound = false } = options;
- const itemsMap = items.reduce((memo, item) => {
- const { count, recordedAt } = item;
- const date = new Date(recordedAt);
- const month = formatDate(new Date(date.getFullYear(), date.getMonth(), 1), isoDate);
- if (memo[month]) {
- const { sum, recordCount } = memo[month];
- return { ...memo, [month]: { sum: sum + count, recordCount: recordCount + 1 } };
- }
-
- return { ...memo, [month]: { sum: count, recordCount: 1 } };
- }, {});
-
- return Object.keys(itemsMap).map((month) => {
- const { sum, recordCount } = itemsMap[month];
- const avg = sum / recordCount;
- if (shouldRound) {
- return [month, Math.round(avg)];
- }
-
- return [month, avg];
- });
-}
-
-/**
- * Takes an array of instance counts and returns the last item in the list
- * @param {Array} arr array of instance counts in the form { count: Number, recordedAt: date String }
- * @return {String} the 'recordedAt' value of the earliest item
- */
-export const getEarliestDate = (arr = []) => {
- const len = arr.length;
- return get(arr, `[${len - 1}].recordedAt`, null);
-};
-
-/**
- * Takes an array of queries and produces an object with the query identifier as key
- * and a supplied defaultValue as its value
- * @param {Array} queries array of chart query configs,
- * see ./analytics/instance_statistics/components/charts_config.js
- * @param {any} defaultValue value to set each identifier to
- * @return {Object} key value pair of the form { queryIdentifier: defaultValue }
- */
-export const generateDataKeys = (queries, defaultValue) =>
- queries.reduce(
- (acc, { identifier }) => ({
- ...acc,
- [identifier]: defaultValue,
- }),
- {},
- );
diff --git a/app/assets/javascripts/analytics/usage_trends/components/app.vue b/app/assets/javascripts/analytics/usage_trends/components/app.vue
new file mode 100644
index 00000000000..4c5ddd7f458
--- /dev/null
+++ b/app/assets/javascripts/analytics/usage_trends/components/app.vue
@@ -0,0 +1,41 @@
+<script>
+import { TODAY, TOTAL_DAYS_TO_SHOW, START_DATE } from '../constants';
+import ChartsConfig from './charts_config';
+import UsageCounts from './usage_counts.vue';
+import UsageTrendsCountChart from './usage_trends_count_chart.vue';
+import UsersChart from './users_chart.vue';
+
+export default {
+ name: 'UsageTrendsApp',
+ components: {
+ UsageCounts,
+ UsageTrendsCountChart,
+ UsersChart,
+ },
+ TOTAL_DAYS_TO_SHOW,
+ START_DATE,
+ TODAY,
+ configs: ChartsConfig,
+};
+</script>
+
+<template>
+ <div>
+ <usage-counts />
+ <users-chart
+ :start-date="$options.START_DATE"
+ :end-date="$options.TODAY"
+ :total-data-points="$options.TOTAL_DAYS_TO_SHOW"
+ />
+ <usage-trends-count-chart
+ v-for="chartOptions in $options.configs"
+ :key="chartOptions.chartTitle"
+ :queries="chartOptions.queries"
+ :x-axis-title="chartOptions.xAxisTitle"
+ :y-axis-title="chartOptions.yAxisTitle"
+ :load-chart-error-message="chartOptions.loadChartError"
+ :no-data-message="chartOptions.noDataMessage"
+ :chart-title="chartOptions.chartTitle"
+ />
+ </div>
+</template>
diff --git a/app/assets/javascripts/analytics/usage_trends/components/charts_config.js b/app/assets/javascripts/analytics/usage_trends/components/charts_config.js
new file mode 100644
index 00000000000..014f823cdc4
--- /dev/null
+++ b/app/assets/javascripts/analytics/usage_trends/components/charts_config.js
@@ -0,0 +1,106 @@
+import { s__, __ } from '~/locale';
+import query from '../graphql/queries/usage_count.query.graphql';
+
+const noDataMessage = s__('UsageTrends|No data available.');
+
+export default [
+ {
+ loadChartError: s__(
+ 'UsageTrends|Could not load the projects and groups chart. Please refresh the page to try again.',
+ ),
+ noDataMessage,
+ chartTitle: s__('UsageTrends|Total projects & groups'),
+ yAxisTitle: s__('UsageTrends|Total projects & groups'),
+ xAxisTitle: s__('UsageTrends|Month'),
+ queries: [
+ {
+ query,
+ title: s__('UsageTrends|Total projects'),
+ identifier: 'PROJECTS',
+ loadError: s__('UsageTrends|There was an error fetching the projects. Please try again.'),
+ },
+ {
+ query,
+ title: s__('UsageTrends|Total groups'),
+ identifier: 'GROUPS',
+ loadError: s__('UsageTrends|There was an error fetching the groups. Please try again.'),
+ },
+ ],
+ },
+ {
+ loadChartError: s__(
+ 'UsageTrends|Could not load the pipelines chart. Please refresh the page to try again.',
+ ),
+ noDataMessage,
+ chartTitle: s__('UsageTrends|Pipelines'),
+ yAxisTitle: s__('UsageTrends|Items'),
+ xAxisTitle: s__('UsageTrends|Month'),
+ queries: [
+ {
+ query,
+ title: s__('UsageTrends|Pipelines total'),
+ identifier: 'PIPELINES',
+ loadError: s__(
+ 'UsageTrends|There was an error fetching the total pipelines. Please try again.',
+ ),
+ },
+ {
+ query,
+ title: s__('UsageTrends|Pipelines succeeded'),
+ identifier: 'PIPELINES_SUCCEEDED',
+ loadError: s__(
+ 'UsageTrends|There was an error fetching the successful pipelines. Please try again.',
+ ),
+ },
+ {
+ query,
+ title: s__('UsageTrends|Pipelines failed'),
+ identifier: 'PIPELINES_FAILED',
+ loadError: s__(
+ 'UsageTrends|There was an error fetching the failed pipelines. Please try again.',
+ ),
+ },
+ {
+ query,
+ title: s__('UsageTrends|Pipelines canceled'),
+ identifier: 'PIPELINES_CANCELED',
+ loadError: s__(
+ 'UsageTrends|There was an error fetching the cancelled pipelines. Please try again.',
+ ),
+ },
+ {
+ query,
+ title: s__('UsageTrends|Pipelines skipped'),
+ identifier: 'PIPELINES_SKIPPED',
+ loadError: s__(
+ 'UsageTrends|There was an error fetching the skipped pipelines. Please try again.',
+ ),
+ },
+ ],
+ },
+ {
+ loadChartError: s__(
+ 'UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again.',
+ ),
+ noDataMessage,
+ chartTitle: s__('UsageTrends|Issues & Merge Requests'),
+ yAxisTitle: s__('UsageTrends|Items'),
+ xAxisTitle: s__('UsageTrends|Month'),
+ queries: [
+ {
+ query,
+ title: __('Issues'),
+ identifier: 'ISSUES',
+ loadError: s__('UsageTrends|There was an error fetching the issues. Please try again.'),
+ },
+ {
+ query,
+ title: __('Merge requests'),
+ identifier: 'MERGE_REQUESTS',
+ loadError: s__(
+ 'UsageTrends|There was an error fetching the merge requests. Please try again.',
+ ),
+ },
+ ],
+ },
+];
diff --git a/app/assets/javascripts/analytics/usage_trends/components/usage_counts.vue b/app/assets/javascripts/analytics/usage_trends/components/usage_counts.vue
new file mode 100644
index 00000000000..0630cca93ae
--- /dev/null
+++ b/app/assets/javascripts/analytics/usage_trends/components/usage_counts.vue
@@ -0,0 +1,63 @@
+<script>
+import * as Sentry from '@sentry/browser';
+import MetricCard from '~/analytics/shared/components/metric_card.vue';
+import { deprecatedCreateFlash as createFlash } from '~/flash';
+import { number } from '~/lib/utils/unit_format';
+import { s__ } from '~/locale';
+import usageTrendsCountQuery from '../graphql/queries/usage_trends_count.query.graphql';
+
+const defaultPrecision = 0;
+
+export default {
+ name: 'UsageCounts',
+ components: {
+ MetricCard,
+ },
+ data() {
+ return {
+ counts: [],
+ };
+ },
+ apollo: {
+ counts: {
+ query: usageTrendsCountQuery,
+ update(data) {
+ return Object.entries(data).map(([key, obj]) => {
+ const label = this.$options.i18n.labels[key];
+ const value = obj.nodes?.length ? number(obj.nodes[0].count, defaultPrecision) : null;
+
+ return {
+ key,
+ value,
+ label,
+ };
+ });
+ },
+ error(error) {
+ createFlash(this.$options.i18n.loadCountsError);
+ Sentry.captureException(error);
+ },
+ },
+ },
+ i18n: {
+ labels: {
+ users: s__('UsageTrends|Users'),
+ projects: s__('UsageTrends|Projects'),
+ groups: s__('UsageTrends|Groups'),
+ issues: s__('UsageTrends|Issues'),
+ mergeRequests: s__('UsageTrends|Merge Requests'),
+ pipelines: s__('UsageTrends|Pipelines'),
+ },
+ loadCountsError: s__('Could not load usage counts. Please refresh the page to try again.'),
+ },
+};
+</script>
+
+<template>
+ <metric-card
+ :title="__('Usage Trends')"
+ :metrics="counts"
+ :is-loading="$apollo.queries.counts.loading"
+ class="gl-mt-4"
+ />
+</template>
diff --git a/app/assets/javascripts/analytics/usage_trends/components/usage_trends_count_chart.vue b/app/assets/javascripts/analytics/usage_trends/components/usage_trends_count_chart.vue
new file mode 100644
index 00000000000..8d7761694d1
--- /dev/null
+++ b/app/assets/javascripts/analytics/usage_trends/components/usage_trends_count_chart.vue
@@ -0,0 +1,206 @@
+<script>
+import { GlAlert } from '@gitlab/ui';
+import { GlLineChart } from '@gitlab/ui/dist/charts';
+import * as Sentry from '@sentry/browser';
+import { some, every } from 'lodash';
+import {
+ differenceInMonths,
+ formatDateAsMonth,
+ getDayDifference,
+} from '~/lib/utils/datetime_utility';
+import ChartSkeletonLoader from '~/vue_shared/components/resizable_chart/skeleton_loader.vue';
+import { TODAY, START_DATE } from '../constants';
+import { getAverageByMonth, getEarliestDate, generateDataKeys } from '../utils';
+
+const QUERY_DATA_KEY = 'usageTrendsMeasurements';
+
+export default {
+ name: 'UsageTrendsCountChart',
+ components: {
+ GlLineChart,
+ GlAlert,
+ ChartSkeletonLoader,
+ },
+ startDate: START_DATE,
+ endDate: TODAY,
+ props: {
+ chartTitle: {
+ type: String,
+ required: true,
+ },
+ loadChartErrorMessage: {
+ type: String,
+ required: true,
+ },
+ noDataMessage: {
+ type: String,
+ required: true,
+ },
+ xAxisTitle: {
+ type: String,
+ required: true,
+ },
+ yAxisTitle: {
+ type: String,
+ required: true,
+ },
+ queries: {
+ type: Array,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ errors: { ...generateDataKeys(this.queries, '') },
+ ...generateDataKeys(this.queries, []),
+ };
+ },
+ computed: {
+ errorMessages() {
+ return Object.values(this.errors);
+ },
+ isLoading() {
+ return some(this.$apollo.queries, (query) => query?.loading);
+ },
+ allQueriesFailed() {
+ return every(this.errorMessages, (message) => message.length);
+ },
+ hasLoadingErrors() {
+ return some(this.errorMessages, (message) => message.length);
+ },
+ errorMessage() {
+ // show the generic loading message if all requests fail
+ return this.allQueriesFailed ? this.loadChartErrorMessage : this.errorMessages.join('\n\n');
+ },
+ hasEmptyDataSet() {
+ return this.chartData.every(({ data }) => data.length === 0);
+ },
+ totalDaysToShow() {
+ return getDayDifference(this.$options.startDate, this.$options.endDate);
+ },
+ chartData() {
+ const options = { shouldRound: true };
+ return this.queries.map(({ identifier, title }) => ({
+ name: title,
+ data: getAverageByMonth(this[identifier]?.nodes, options),
+ }));
+ },
+ range() {
+ return {
+ min: this.$options.startDate,
+ max: this.$options.endDate,
+ };
+ },
+ chartOptions() {
+ const { endDate, startDate } = this.$options;
+ return {
+ xAxis: {
+ ...this.range,
+ name: this.xAxisTitle,
+ type: 'time',
+ splitNumber: differenceInMonths(startDate, endDate) + 1,
+ axisLabel: {
+ interval: 0,
+ showMinLabel: false,
+ showMaxLabel: false,
+ align: 'right',
+ formatter: formatDateAsMonth,
+ },
+ },
+ yAxis: {
+ name: this.yAxisTitle,
+ },
+ };
+ },
+ },
+ created() {
+ this.queries.forEach(({ query, identifier, loadError }) => {
+ this.$apollo.addSmartQuery(identifier, {
+ query,
+ variables() {
+ return {
+ identifier,
+ first: this.totalDaysToShow,
+ after: null,
+ };
+ },
+ update(data) {
+ const { nodes = [], pageInfo } = data[QUERY_DATA_KEY] || {};
+ return {
+ nodes,
+ pageInfo,
+ };
+ },
+ result() {
+ const { pageInfo, nodes } = this[identifier];
+ if (pageInfo?.hasNextPage && this.calculateDaysToFetch(getEarliestDate(nodes)) > 0) {
+ this.fetchNextPage({
+ query: this.$apollo.queries[identifier],
+ errorMessage: loadError,
+ pageInfo,
+ identifier,
+ });
+ }
+ },
+ error(error) {
+ this.handleError({
+ message: loadError,
+ identifier,
+ error,
+ });
+ },
+ });
+ });
+ },
+ methods: {
+ calculateDaysToFetch(firstDataPointDate = null) {
+ return firstDataPointDate
+ ? Math.max(0, getDayDifference(this.$options.startDate, new Date(firstDataPointDate)))
+ : 0;
+ },
+ handleError({ identifier, error, message }) {
+ this.loadingError = true;
+ this.errors = { ...this.errors, [identifier]: message };
+ Sentry.captureException(error);
+ },
+ fetchNextPage({ query, pageInfo, identifier, errorMessage }) {
+ query
+ .fetchMore({
+ variables: {
+ identifier,
+ first: this.calculateDaysToFetch(getEarliestDate(this[identifier].nodes)),
+ after: pageInfo.endCursor,
+ },
+ updateQuery: (previousResult, { fetchMoreResult }) => {
+ const { nodes, ...rest } = fetchMoreResult[QUERY_DATA_KEY];
+ const { nodes: previousNodes } = previousResult[QUERY_DATA_KEY];
+ return {
+ [QUERY_DATA_KEY]: { ...rest, nodes: [...previousNodes, ...nodes] },
+ };
+ },
+ })
+ .catch((error) => this.handleError({ identifier, error, message: errorMessage }));
+ },
+ },
+};
+</script>
+<template>
+ <div>
+ <h3>{{ chartTitle }}</h3>
+ <gl-alert v-if="hasLoadingErrors" variant="danger" :dismissible="false" class="gl-mt-3">
+ {{ errorMessage }}
+ </gl-alert>
+ <div v-if="!allQueriesFailed">
+ <chart-skeleton-loader v-if="isLoading" />
+ <gl-alert v-else-if="hasEmptyDataSet" variant="info" :dismissible="false" class="gl-mt-3">
+ {{ noDataMessage }}
+ </gl-alert>
+ <gl-line-chart
+ v-else
+ :option="chartOptions"
+ :include-legend-avg-max="true"
+ :data="chartData"
+ />
+ </div>
+ </div>
+</template>
diff --git a/app/assets/javascripts/analytics/usage_trends/components/users_chart.vue b/app/assets/javascripts/analytics/usage_trends/components/users_chart.vue
new file mode 100644
index 00000000000..09dfcddcb73
--- /dev/null
+++ b/app/assets/javascripts/analytics/usage_trends/components/users_chart.vue
@@ -0,0 +1,143 @@
+<script>
+import { GlAlert } from '@gitlab/ui';
+import { GlAreaChart } from '@gitlab/ui/dist/charts';
+import * as Sentry from '@sentry/browser';
+import produce from 'immer';
+import { sortBy } from 'lodash';
+import { formatDateAsMonth } from '~/lib/utils/datetime_utility';
+import { __ } from '~/locale';
+import ChartSkeletonLoader from '~/vue_shared/components/resizable_chart/skeleton_loader.vue';
+import usersQuery from '../graphql/queries/users.query.graphql';
+import { getAverageByMonth } from '../utils';
+
+const sortByDate = (data) => sortBy(data, (item) => new Date(item[0]).getTime());
+
+export default {
+ name: 'UsersChart',
+ components: { GlAlert, GlAreaChart, ChartSkeletonLoader },
+ props: {
+ startDate: {
+ type: Date,
+ required: true,
+ },
+ endDate: {
+ type: Date,
+ required: true,
+ },
+ totalDataPoints: {
+ type: Number,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ loadingError: null,
+ users: [],
+ pageInfo: null,
+ };
+ },
+ apollo: {
+ users: {
+ query: usersQuery,
+ variables() {
+ return {
+ first: this.totalDataPoints,
+ after: null,
+ };
+ },
+ update(data) {
+ return data.users?.nodes || [];
+ },
+ result({ data }) {
+ const {
+ users: { pageInfo },
+ } = data;
+ this.pageInfo = pageInfo;
+ this.fetchNextPage();
+ },
+ error(error) {
+ this.handleError(error);
+ },
+ },
+ },
+ i18n: {
+ yAxisTitle: __('Total users'),
+ xAxisTitle: __('Month'),
+ loadUserChartError: __('Could not load the user chart. Please refresh the page to try again.'),
+ noDataMessage: __('There is no data available.'),
+ },
+ computed: {
+ isLoading() {
+ return this.$apollo.queries.users.loading || this.pageInfo?.hasNextPage;
+ },
+ chartUserData() {
+ const averaged = getAverageByMonth(
+ this.users.length > this.totalDataPoints
+ ? this.users.slice(0, this.totalDataPoints)
+ : this.users,
+ { shouldRound: true },
+ );
+ return sortByDate(averaged);
+ },
+ options() {
+ return {
+ xAxis: {
+ name: this.$options.i18n.xAxisTitle,
+ type: 'category',
+ axisLabel: {
+ formatter: formatDateAsMonth,
+ },
+ },
+ yAxis: {
+ name: this.$options.i18n.yAxisTitle,
+ },
+ };
+ },
+ },
+ methods: {
+ handleError(error) {
+ this.loadingError = true;
+ this.users = [];
+ Sentry.captureException(error);
+ },
+ fetchNextPage() {
+ if (this.pageInfo?.hasNextPage) {
+ this.$apollo.queries.users
+ .fetchMore({
+ variables: { first: this.totalDataPoints, after: this.pageInfo.endCursor },
+ updateQuery: (previousResult, { fetchMoreResult }) => {
+ return produce(fetchMoreResult, (newUsers) => {
+ // eslint-disable-next-line no-param-reassign
+ newUsers.users.nodes = [...previousResult.users.nodes, ...newUsers.users.nodes];
+ });
+ },
+ })
+ .catch(this.handleError);
+ }
+ },
+ },
+};
+</script>
+<template>
+ <div>
+ <h3>{{ $options.i18n.yAxisTitle }}</h3>
+ <gl-alert v-if="loadingError" variant="danger" :dismissible="false" class="gl-mt-3">
+ {{ this.$options.i18n.loadUserChartError }}
+ </gl-alert>
+ <chart-skeleton-loader v-else-if="isLoading" />
+ <gl-alert v-else-if="!chartUserData.length" variant="info" :dismissible="false" class="gl-mt-3">
+ {{ $options.i18n.noDataMessage }}
+ </gl-alert>
+ <gl-area-chart
+ v-else
+ :option="options"
+ :include-legend-avg-max="true"
+ :data="[
+ {
+ name: $options.i18n.yAxisTitle,
+ data: chartUserData,
+ },
+ ]"
+ />
+ </div>
+</template>
diff --git a/app/assets/javascripts/analytics/instance_statistics/constants.js b/app/assets/javascripts/analytics/usage_trends/constants.js
index 846c0ef408b..846c0ef408b 100644
--- a/app/assets/javascripts/analytics/instance_statistics/constants.js
+++ b/app/assets/javascripts/analytics/usage_trends/constants.js
diff --git a/app/assets/javascripts/analytics/usage_trends/graphql/fragments/count.fragment.graphql b/app/assets/javascripts/analytics/usage_trends/graphql/fragments/count.fragment.graphql
new file mode 100644
index 00000000000..2bde5973600
--- /dev/null
+++ b/app/assets/javascripts/analytics/usage_trends/graphql/fragments/count.fragment.graphql
@@ -0,0 +1,4 @@
+fragment Count on UsageTrendsMeasurement {
+ count
+ recordedAt
+}
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
new file mode 100644
index 00000000000..2a5546efb68
--- /dev/null
+++ b/app/assets/javascripts/analytics/usage_trends/graphql/queries/usage_count.query.graphql
@@ -0,0 +1,13 @@
+#import "~/graphql_shared/fragments/pageInfo.fragment.graphql"
+#import "../fragments/count.fragment.graphql"
+
+query getCount($identifier: MeasurementIdentifier!, $first: Int, $after: String) {
+ usageTrendsMeasurements(identifier: $identifier, first: $first, after: $after) {
+ nodes {
+ ...Count
+ }
+ pageInfo {
+ ...PageInfo
+ }
+ }
+}
diff --git a/app/assets/javascripts/analytics/usage_trends/graphql/queries/usage_trends_count.query.graphql b/app/assets/javascripts/analytics/usage_trends/graphql/queries/usage_trends_count.query.graphql
new file mode 100644
index 00000000000..8cadcfae380
--- /dev/null
+++ b/app/assets/javascripts/analytics/usage_trends/graphql/queries/usage_trends_count.query.graphql
@@ -0,0 +1,34 @@
+#import "../fragments/count.fragment.graphql"
+
+query getInstanceCounts {
+ projects: usageTrendsMeasurements(identifier: PROJECTS, first: 1) {
+ nodes {
+ ...Count
+ }
+ }
+ groups: usageTrendsMeasurements(identifier: GROUPS, first: 1) {
+ nodes {
+ ...Count
+ }
+ }
+ users: usageTrendsMeasurements(identifier: USERS, first: 1) {
+ nodes {
+ ...Count
+ }
+ }
+ issues: usageTrendsMeasurements(identifier: ISSUES, first: 1) {
+ nodes {
+ ...Count
+ }
+ }
+ mergeRequests: usageTrendsMeasurements(identifier: MERGE_REQUESTS, first: 1) {
+ nodes {
+ ...Count
+ }
+ }
+ pipelines: usageTrendsMeasurements(identifier: PIPELINES, first: 1) {
+ nodes {
+ ...Count
+ }
+ }
+}
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
new file mode 100644
index 00000000000..7c02ac49a42
--- /dev/null
+++ b/app/assets/javascripts/analytics/usage_trends/graphql/queries/users.query.graphql
@@ -0,0 +1,13 @@
+#import "~/graphql_shared/fragments/pageInfo.fragment.graphql"
+#import "../fragments/count.fragment.graphql"
+
+query getUsersCount($first: Int, $after: String) {
+ users: usageTrendsMeasurements(identifier: USERS, first: $first, after: $after) {
+ nodes {
+ ...Count
+ }
+ pageInfo {
+ ...PageInfo
+ }
+ }
+}
diff --git a/app/assets/javascripts/analytics/usage_trends/index.js b/app/assets/javascripts/analytics/usage_trends/index.js
new file mode 100644
index 00000000000..d1880b09f15
--- /dev/null
+++ b/app/assets/javascripts/analytics/usage_trends/index.js
@@ -0,0 +1,24 @@
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import createDefaultClient from '~/lib/graphql';
+import UsageTrendsApp from './components/app.vue';
+
+Vue.use(VueApollo);
+
+const apolloProvider = new VueApollo({
+ defaultClient: createDefaultClient(),
+});
+
+export default () => {
+ const el = document.getElementById('js-usage-trends-app');
+
+ if (!el) return false;
+
+ return new Vue({
+ el,
+ apolloProvider,
+ render(h) {
+ return h(UsageTrendsApp);
+ },
+ });
+};
diff --git a/app/assets/javascripts/analytics/usage_trends/utils.js b/app/assets/javascripts/analytics/usage_trends/utils.js
new file mode 100644
index 00000000000..91907877ed6
--- /dev/null
+++ b/app/assets/javascripts/analytics/usage_trends/utils.js
@@ -0,0 +1,68 @@
+import { masks } from 'dateformat';
+import { get } from 'lodash';
+import { formatDate } from '~/lib/utils/datetime_utility';
+
+const { isoDate } = masks;
+
+/**
+ * Takes an array of items and returns one item per month with the average of the `count`s from that month
+ * @param {Array} items
+ * @param {Number} items[index].count value to be averaged
+ * @param {String} items[index].recordedAt item dateTime time stamp to be collected into a month
+ * @param {Object} options
+ * @param {Object} options.shouldRound an option to specify whether the retuned averages should be rounded
+ * @return {Array} items collected into [month, average],
+ * where month is a dateTime string representing the first of the given month
+ * and average is the average of the count
+ */
+export function getAverageByMonth(items = [], options = {}) {
+ const { shouldRound = false } = options;
+ const itemsMap = items.reduce((memo, item) => {
+ const { count, recordedAt } = item;
+ const date = new Date(recordedAt);
+ const month = formatDate(new Date(date.getFullYear(), date.getMonth(), 1), isoDate);
+ if (memo[month]) {
+ const { sum, recordCount } = memo[month];
+ return { ...memo, [month]: { sum: sum + count, recordCount: recordCount + 1 } };
+ }
+
+ return { ...memo, [month]: { sum: count, recordCount: 1 } };
+ }, {});
+
+ return Object.keys(itemsMap).map((month) => {
+ const { sum, recordCount } = itemsMap[month];
+ const avg = sum / recordCount;
+ if (shouldRound) {
+ return [month, Math.round(avg)];
+ }
+
+ return [month, avg];
+ });
+}
+
+/**
+ * Takes an array of usage counts and returns the last item in the list
+ * @param {Array} arr array of usage counts in the form { count: Number, recordedAt: date String }
+ * @return {String} the 'recordedAt' value of the earliest item
+ */
+export const getEarliestDate = (arr = []) => {
+ const len = arr.length;
+ return get(arr, `[${len - 1}].recordedAt`, null);
+};
+
+/**
+ * Takes an array of queries and produces an object with the query identifier as key
+ * and a supplied defaultValue as its value
+ * @param {Array} queries array of chart query configs,
+ * see ./analytics/usage_trends/components/charts_config.js
+ * @param {any} defaultValue value to set each identifier to
+ * @return {Object} key value pair of the form { queryIdentifier: defaultValue }
+ */
+export const generateDataKeys = (queries, defaultValue) =>
+ queries.reduce(
+ (acc, { identifier }) => ({
+ ...acc,
+ [identifier]: defaultValue,
+ }),
+ {},
+ );
diff --git a/app/assets/javascripts/api.js b/app/assets/javascripts/api.js
index c7e6b98a934..2b589b71163 100644
--- a/app/assets/javascripts/api.js
+++ b/app/assets/javascripts/api.js
@@ -24,12 +24,14 @@ const Api = {
projectPackagesPath: '/api/:version/projects/:id/packages',
projectPackagePath: '/api/:version/projects/:id/packages/:package_id',
groupProjectsPath: '/api/:version/groups/:id/projects.json',
+ groupSharePath: '/api/:version/groups/:id/share',
projectsPath: '/api/:version/projects.json',
projectPath: '/api/:version/projects/:id',
forkedProjectsPath: '/api/:version/projects/:id/forks',
projectLabelsPath: '/:namespace_path/:project_path/-/labels',
projectFileSchemaPath: '/:namespace_path/:project_path/-/schema/:ref/:filename',
projectUsersPath: '/api/:version/projects/:id/users',
+ projectGroupsPath: '/api/:version/projects/:id/groups.json',
projectInvitationsPath: '/api/:version/projects/:id/invitations',
projectMembersPath: '/api/:version/projects/:id/members',
projectMergeRequestsPath: '/api/:version/projects/:id/merge_requests',
@@ -39,6 +41,7 @@ const Api = {
projectRunnersPath: '/api/:version/projects/:id/runners',
projectProtectedBranchesPath: '/api/:version/projects/:id/protected_branches',
projectSearchPath: '/api/:version/projects/:id/search',
+ projectSharePath: '/api/:version/projects/:id/share',
projectMilestonesPath: '/api/:version/projects/:id/milestones',
projectIssuePath: '/api/:version/projects/:id/issues/:issue_iid',
mergeRequestsPath: '/api/:version/merge_requests',
@@ -239,6 +242,20 @@ const Api = {
.then(({ data }) => data);
},
+ projectGroups(id, options) {
+ const url = Api.buildUrl(this.projectGroupsPath).replace(':id', encodeURIComponent(id));
+
+ return axios
+ .get(url, {
+ params: {
+ ...options,
+ },
+ })
+ .then(({ data }) => {
+ return data;
+ });
+ },
+
addProjectMembersByUserId(id, data) {
const url = Api.buildUrl(this.projectMembersPath).replace(':id', encodeURIComponent(id));
@@ -365,6 +382,16 @@ const Api = {
});
},
+ projectShareWithGroup(id, options = {}) {
+ const url = Api.buildUrl(Api.projectSharePath).replace(':id', encodeURIComponent(id));
+
+ return axios.post(url, {
+ expires_at: options.expires_at,
+ group_access: options.group_access,
+ group_id: options.group_id,
+ });
+ },
+
projectMilestones(id, params = {}) {
const url = Api.buildUrl(Api.projectMilestonesPath).replace(':id', encodeURIComponent(id));
@@ -426,6 +453,16 @@ const Api = {
});
},
+ groupShareWithGroup(id, options = {}) {
+ const url = Api.buildUrl(Api.groupSharePath).replace(':id', encodeURIComponent(id));
+
+ return axios.post(url, {
+ expires_at: options.expires_at,
+ group_access: options.group_access,
+ group_id: options.group_id,
+ });
+ },
+
commit(id, sha, params = {}) {
const url = Api.buildUrl(this.commitPath)
.replace(':id', encodeURIComponent(id))
@@ -446,7 +483,7 @@ const Api = {
applySuggestion(id, message = '') {
const url = Api.buildUrl(Api.applySuggestionPath).replace(':id', encodeURIComponent(id));
- const params = gon.features?.suggestionsCustomCommit ? { commit_message: message } : false;
+ const params = { commit_message: message };
return axios.put(url, params);
},
diff --git a/app/assets/javascripts/authentication/two_factor_auth/components/recovery_codes.vue b/app/assets/javascripts/authentication/two_factor_auth/components/recovery_codes.vue
index 0e589d98668..55642aa64db 100644
--- a/app/assets/javascripts/authentication/two_factor_auth/components/recovery_codes.vue
+++ b/app/assets/javascripts/authentication/two_factor_auth/components/recovery_codes.vue
@@ -162,7 +162,7 @@ export default {
:href="profileAccountPath"
:disabled="proceedButtonDisabled"
:title="$options.i18n.proceedButton"
- variant="success"
+ variant="confirm"
data-qa-selector="proceed_button"
data-track-event="click_button"
:data-track-label="`${$options.trackingLabelPrefix}proceed_button`"
diff --git a/app/assets/javascripts/awards_handler.js b/app/assets/javascripts/awards_handler.js
index 6fb90551ed7..dbdc7e43d2d 100644
--- a/app/assets/javascripts/awards_handler.js
+++ b/app/assets/javascripts/awards_handler.js
@@ -5,12 +5,14 @@ import $ from 'jquery';
import Cookies from 'js-cookie';
import { uniq } from 'lodash';
import * as Emoji from '~/emoji';
+import { scrollToElement } from '~/lib/utils/common_utils';
import { dispose, fixTitle } from '~/tooltips';
import { deprecatedCreateFlash as flash } from './flash';
import axios from './lib/utils/axios_utils';
import { isInVueNoteablePage } from './lib/utils/dom_utils';
import { __ } from './locale';
+window.axios = axios;
const animationEndEventString = 'animationend webkitAnimationEnd MSAnimationEnd oAnimationEnd';
const transitionEndEventString = 'transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd';
@@ -495,12 +497,7 @@ export class AwardsHandler {
}
scrollToAwards() {
- const options = {
- scrollTop: $('.awards').offset().top - 110,
- };
-
- // eslint-disable-next-line no-jquery/no-animate
- return $('body, html').animate(options, 200);
+ scrollToElement('.awards', { offset: -110 });
}
addEmojiToFrequentlyUsedList(emoji) {
diff --git a/app/assets/javascripts/badges/components/badge.vue b/app/assets/javascripts/badges/components/badge.vue
index c3512773457..9e5d70075f3 100644
--- a/app/assets/javascripts/badges/components/badge.vue
+++ b/app/assets/javascripts/badges/components/badge.vue
@@ -96,7 +96,7 @@ export default {
v-gl-tooltip.hover
:title="s__('Badges|Reload badge image')"
category="tertiary"
- variant="success"
+ variant="confirm"
type="button"
icon="retry"
size="small"
diff --git a/app/assets/javascripts/badges/components/badge_form.vue b/app/assets/javascripts/badges/components/badge_form.vue
index 20541ad8ccc..b65a8b4fa9c 100644
--- a/app/assets/javascripts/badges/components/badge_form.vue
+++ b/app/assets/javascripts/badges/components/badge_form.vue
@@ -225,7 +225,7 @@ export default {
<gl-button
:loading="isSaving"
type="submit"
- variant="success"
+ variant="confirm"
category="primary"
data-testid="saveEditing"
>
@@ -233,7 +233,7 @@ export default {
</gl-button>
</div>
<div v-else class="form-group">
- <gl-button :loading="isSaving" type="submit" variant="success" category="primary">
+ <gl-button :loading="isSaving" type="submit" variant="confirm" category="primary">
{{ s__('Badges|Add badge') }}
</gl-button>
</div>
diff --git a/app/assets/javascripts/batch_comments/stores/modules/batch_comments/actions.js b/app/assets/javascripts/batch_comments/stores/modules/batch_comments/actions.js
index 36fef06eeff..88be64d0a1a 100644
--- a/app/assets/javascripts/batch_comments/stores/modules/batch_comments/actions.js
+++ b/app/assets/javascripts/batch_comments/stores/modules/batch_comments/actions.js
@@ -1,3 +1,4 @@
+import { isEmpty } from 'lodash';
import { deprecatedCreateFlash as flash } from '~/flash';
import { scrollToElement } from '~/lib/utils/common_utils';
import { __ } from '~/locale';
@@ -88,18 +89,23 @@ export const updateDiscussionsAfterPublish = async ({ dispatch, getters, rootGet
export const updateDraft = (
{ commit, getters },
{ note, noteText, resolveDiscussion, position, callback },
-) =>
- service
- .update(getters.getNotesData.draftsPath, {
- draftId: note.id,
- note: noteText,
- resolveDiscussion,
- position: JSON.stringify(position),
- })
+) => {
+ const params = {
+ draftId: note.id,
+ note: noteText,
+ resolveDiscussion,
+ };
+ // Stringifying an empty object yields `{}` which breaks graphql queries
+ // https://gitlab.com/gitlab-org/gitlab/-/issues/298827
+ if (!isEmpty(position)) params.position = JSON.stringify(position);
+
+ return service
+ .update(getters.getNotesData.draftsPath, params)
.then((res) => res.data)
.then((data) => commit(types.RECEIVE_DRAFT_UPDATE_SUCCESS, data))
.then(callback)
.catch(() => flash(__('An error occurred while updating the comment')));
+};
export const scrollToDraft = ({ dispatch, rootGetters }, draft) => {
const discussion = draft.discussion_id && rootGetters.getDiscussion(draft.discussion_id);
diff --git a/app/assets/javascripts/behaviors/copy_to_clipboard.js b/app/assets/javascripts/behaviors/copy_to_clipboard.js
index a31bcc2cb41..de248340738 100644
--- a/app/assets/javascripts/behaviors/copy_to_clipboard.js
+++ b/app/assets/javascripts/behaviors/copy_to_clipboard.js
@@ -1,31 +1,27 @@
import Clipboard from 'clipboard';
import $ from 'jquery';
import { sprintf, __ } from '~/locale';
-import { fixTitle, show } from '~/tooltips';
+import { fixTitle, add, show, once } from '~/tooltips';
function showTooltip(target, title) {
- const { originalTitle } = target.dataset;
- const hideTooltip = () => {
- target.removeEventListener('mouseout', hideTooltip);
- setTimeout(() => {
+ const { title: originalTitle } = target.dataset;
+
+ once('hidden', (tooltip) => {
+ if (tooltip.target === target) {
target.setAttribute('title', originalTitle);
fixTitle(target);
- }, 100);
- };
+ }
+ });
target.setAttribute('title', title);
-
fixTitle(target);
show(target);
-
- target.addEventListener('mouseout', hideTooltip);
+ setTimeout(() => target.blur(), 1000);
}
function genericSuccess(e) {
// Clear the selection and blur the trigger so it loses its border
e.clearSelection();
- $(e.trigger).blur();
-
showTooltip(e.trigger, __('Copied'));
}
@@ -88,24 +84,8 @@ export default function initCopyToClipboard() {
* @param {HTMLElement} btnElement
*/
export function clickCopyToClipboardButton(btnElement) {
- const $btnElement = $(btnElement);
-
// Ensure the button has already been tooltip'd.
- // If the use hasn't yet interacted (i.e. hovered or clicked)
- // with the button, Bootstrap hasn't yet initialized
- // the tooltip, and its `data-original-title` will be `undefined`.
- // This value is used in the functions above.
- $btnElement.tooltip();
- btnElement.dispatchEvent(new MouseEvent('mouseover'));
+ add([btnElement], { show: true });
btnElement.click();
-
- // Manually trigger the necessary events to hide the
- // button's tooltip and allow the button to perform its
- // tooltip cleanup (updating the title from "Copied" back
- // to its original title, "Copy branch name").
- setTimeout(() => {
- btnElement.dispatchEvent(new MouseEvent('mouseout'));
- $btnElement.tooltip('hide');
- }, 2000);
}
diff --git a/app/assets/javascripts/behaviors/toggler_behavior.js b/app/assets/javascripts/behaviors/toggler_behavior.js
index 4b63143c4ba..30424fee46a 100644
--- a/app/assets/javascripts/behaviors/toggler_behavior.js
+++ b/app/assets/javascripts/behaviors/toggler_behavior.js
@@ -30,7 +30,7 @@ $(() => {
}
$('body').on('click', '.js-toggle-button', function toggleButton(e) {
- e.currentTarget.classList.toggle(e.currentTarget.dataset.toggleOpenClass || 'open');
+ e.currentTarget.classList.toggle(e.currentTarget.dataset.toggleOpenClass || 'selected');
toggleContainer($(this).closest('.js-toggle-container'));
const targetTag = e.currentTarget.tagName.toLowerCase();
diff --git a/app/assets/javascripts/blob/blob_file_dropzone.js b/app/assets/javascripts/blob/blob_file_dropzone.js
index e72c5c90986..445602a8765 100644
--- a/app/assets/javascripts/blob/blob_file_dropzone.js
+++ b/app/assets/javascripts/blob/blob_file_dropzone.js
@@ -3,6 +3,7 @@
import Dropzone from 'dropzone';
import $ from 'jquery';
import { sprintf, __ } from '~/locale';
+import { trackUploadFileFormSubmitted } from '~/projects/upload_file_experiment';
import { HIDDEN_CLASS } from '../lib/utils/constants';
import csrf from '../lib/utils/csrf';
import { visitUrl } from '../lib/utils/url_utility';
@@ -83,6 +84,9 @@ export default class BlobFileDropzone {
submitButton.on('click', (e) => {
e.preventDefault();
e.stopPropagation();
+
+ trackUploadFileFormSubmitted();
+
if (dropzone[0].dropzone.getQueuedFiles().length === 0) {
// eslint-disable-next-line no-alert
alert(__('Please select a file'));
diff --git a/app/assets/javascripts/blob/viewer/index.js b/app/assets/javascripts/blob/viewer/index.js
index b4cd0d5d875..4741152afce 100644
--- a/app/assets/javascripts/blob/viewer/index.js
+++ b/app/assets/javascripts/blob/viewer/index.js
@@ -62,6 +62,7 @@ export default class BlobViewer {
this.switcher = document.querySelector('.js-blob-viewer-switcher');
this.switcherBtns = document.querySelectorAll('.js-blob-viewer-switch-btn');
this.copySourceBtn = document.querySelector('.js-copy-blob-source-btn');
+ this.copySourceBtnTooltip = document.querySelector('.js-copy-blob-source-btn-tooltip');
this.simpleViewer = this.$fileHolder[0].querySelector('.blob-viewer[data-type="simple"]');
this.richViewer = this.$fileHolder[0].querySelector('.blob-viewer[data-type="rich"]');
@@ -109,23 +110,23 @@ export default class BlobViewer {
toggleCopyButtonState() {
if (!this.copySourceBtn) return;
if (this.simpleViewer.getAttribute('data-loaded')) {
- this.copySourceBtn.setAttribute('title', __('Copy file contents'));
+ this.copySourceBtnTooltip.setAttribute('title', __('Copy file contents'));
this.copySourceBtn.classList.remove('disabled');
} else if (this.activeViewer === this.simpleViewer) {
- this.copySourceBtn.setAttribute(
+ this.copySourceBtnTooltip.setAttribute(
'title',
__('Wait for the file to load to copy its contents'),
);
this.copySourceBtn.classList.add('disabled');
} else {
- this.copySourceBtn.setAttribute(
+ this.copySourceBtnTooltip.setAttribute(
'title',
__('Switch to the source to copy the file contents'),
);
this.copySourceBtn.classList.add('disabled');
}
- fixTitle($(this.copySourceBtn));
+ fixTitle($(this.copySourceBtnTooltip));
}
switchToViewer(name) {
diff --git a/app/assets/javascripts/blob_edit/blob_bundle.js b/app/assets/javascripts/blob_edit/blob_bundle.js
index 173c82ef9b0..6d9b56b4bb8 100644
--- a/app/assets/javascripts/blob_edit/blob_bundle.js
+++ b/app/assets/javascripts/blob_edit/blob_bundle.js
@@ -4,6 +4,7 @@ import $ from 'jquery';
import initPopover from '~/blob/suggest_gitlab_ci_yml';
import { deprecatedCreateFlash as createFlash } from '~/flash';
import { disableButtonIfEmptyField, setCookie } from '~/lib/utils/common_utils';
+import { initUploadFileTrigger } from '~/projects/upload_file_experiment';
import Tracking from '~/tracking';
import BlobFileDropzone from '../blob/blob_file_dropzone';
import NewCommitForm from '../new_commit_form';
@@ -47,6 +48,7 @@ export const initUploadForm = () => {
new NewCommitForm(uploadBlobForm);
disableButtonIfEmptyField(uploadBlobForm.find('.js-commit-message'), '.btn-upload-file');
+ initUploadFileTrigger();
}
};
diff --git a/app/assets/javascripts/boards/boards_util.js b/app/assets/javascripts/boards/boards_util.js
index 13ad820477f..2cd25f58770 100644
--- a/app/assets/javascripts/boards/boards_util.js
+++ b/app/assets/javascripts/boards/boards_util.js
@@ -36,11 +36,11 @@ export function formatIssue(issue) {
}
export function formatListIssues(listIssues) {
- const issues = {};
- let listIssuesCount;
+ const boardItems = {};
+ let listItemsCount;
const listData = listIssues.nodes.reduce((map, list) => {
- listIssuesCount = list.issues.count;
+ listItemsCount = list.issues.count;
let sortedIssues = list.issues.edges.map((issueNode) => ({
...issueNode.node,
}));
@@ -58,14 +58,14 @@ export function formatListIssues(listIssues) {
assignees: i.assignees?.nodes || [],
};
- issues[id] = listIssue;
+ boardItems[id] = listIssue;
return id;
}),
};
}, {});
- return { listData, issues, listIssuesCount };
+ return { listData, boardItems, listItemsCount };
}
export function formatListsPageInfo(lists) {
@@ -113,31 +113,31 @@ export function formatIssueInput(issueInput, boardConfig) {
};
}
-export function moveIssueListHelper(issue, fromList, toList) {
- const updatedIssue = issue;
+export function moveItemListHelper(item, fromList, toList) {
+ const updatedItem = item;
if (
toList.listType === ListType.label &&
- !updatedIssue.labels.find((label) => label.id === toList.label.id)
+ !updatedItem.labels.find((label) => label.id === toList.label.id)
) {
- updatedIssue.labels.push(toList.label);
+ updatedItem.labels.push(toList.label);
}
if (fromList?.label && fromList.listType === ListType.label) {
- updatedIssue.labels = updatedIssue.labels.filter((label) => fromList.label.id !== label.id);
+ updatedItem.labels = updatedItem.labels.filter((label) => fromList.label.id !== label.id);
}
if (
toList.listType === ListType.assignee &&
- !updatedIssue.assignees.find((assignee) => assignee.id === toList.assignee.id)
+ !updatedItem.assignees.find((assignee) => assignee.id === toList.assignee.id)
) {
- updatedIssue.assignees.push(toList.assignee);
+ updatedItem.assignees.push(toList.assignee);
}
if (fromList?.assignee && fromList.listType === ListType.assignee) {
- updatedIssue.assignees = updatedIssue.assignees.filter(
+ updatedItem.assignees = updatedItem.assignees.filter(
(assignee) => assignee.id !== fromList.assignee.id,
);
}
- return updatedIssue;
+ return updatedItem;
}
export function isListDraggable(list) {
diff --git a/app/assets/javascripts/boards/components/board_add_new_column.vue b/app/assets/javascripts/boards/components/board_add_new_column.vue
new file mode 100644
index 00000000000..3c7c792b787
--- /dev/null
+++ b/app/assets/javascripts/boards/components/board_add_new_column.vue
@@ -0,0 +1,143 @@
+<script>
+import {
+ GlFormRadio,
+ GlFormRadioGroup,
+ GlLabel,
+ GlTooltipDirective as GlTooltip,
+} from '@gitlab/ui';
+import { mapActions, mapGetters, mapState } from 'vuex';
+import BoardAddNewColumnForm from '~/boards/components/board_add_new_column_form.vue';
+import { ListType } from '~/boards/constants';
+import boardsStore from '~/boards/stores/boards_store';
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
+import { isScopedLabel } from '~/lib/utils/common_utils';
+
+export default {
+ components: {
+ BoardAddNewColumnForm,
+ GlFormRadio,
+ GlFormRadioGroup,
+ GlLabel,
+ },
+ directives: {
+ GlTooltip,
+ },
+ inject: ['scopedLabelsAvailable'],
+ data() {
+ return {
+ selectedId: null,
+ };
+ },
+ computed: {
+ ...mapState(['labels', 'labelsLoading']),
+ ...mapGetters(['getListByLabelId', 'shouldUseGraphQL']),
+ selectedLabel() {
+ if (!this.selectedId) {
+ return null;
+ }
+ return this.labels.find(({ id }) => id === this.selectedId);
+ },
+ columnForSelected() {
+ return this.getListByLabelId(this.selectedId);
+ },
+ },
+ created() {
+ this.filterItems();
+ },
+ methods: {
+ ...mapActions(['createList', 'fetchLabels', 'highlightList', 'setAddColumnFormVisibility']),
+ highlight(listId) {
+ if (this.shouldUseGraphQL) {
+ this.highlightList(listId);
+ } else {
+ const list = boardsStore.state.lists.find(({ id }) => id === listId);
+ list.highlighted = true;
+ setTimeout(() => {
+ list.highlighted = false;
+ }, 2000);
+ }
+ },
+ addList() {
+ if (!this.selectedLabel) {
+ return;
+ }
+
+ this.setAddColumnFormVisibility(false);
+
+ if (this.columnForSelected) {
+ const listId = this.columnForSelected.id;
+ this.highlight(listId);
+ return;
+ }
+
+ if (this.shouldUseGraphQL) {
+ this.createList({ labelId: this.selectedId });
+ } else {
+ const listObj = {
+ labelId: getIdFromGraphQLId(this.selectedId),
+ title: this.selectedLabel.title,
+ position: boardsStore.state.lists.length - 2,
+ list_type: ListType.label,
+ label: this.selectedLabel,
+ };
+
+ boardsStore.new(listObj);
+ }
+ },
+
+ filterItems(searchTerm) {
+ this.fetchLabels(searchTerm);
+ },
+
+ showScopedLabels(label) {
+ return this.scopedLabelsAvailable && isScopedLabel(label);
+ },
+ },
+};
+</script>
+
+<template>
+ <board-add-new-column-form
+ :loading="labelsLoading"
+ :form-description="__('A label list displays issues with the selected label.')"
+ :search-label="__('Select label')"
+ :search-placeholder="__('Search labels')"
+ :selected-id="selectedId"
+ @filter-items="filterItems"
+ @add-list="addList"
+ >
+ <template slot="selected">
+ <gl-label
+ v-if="selectedLabel"
+ v-gl-tooltip
+ :title="selectedLabel.title"
+ :description="selectedLabel.description"
+ :background-color="selectedLabel.color"
+ :scoped="showScopedLabels(selectedLabel)"
+ />
+ </template>
+
+ <template slot="items">
+ <gl-form-radio-group
+ v-if="labels.length > 0"
+ v-model="selectedId"
+ class="gl-overflow-y-auto gl-px-5 gl-pt-3"
+ >
+ <label
+ v-for="label in labels"
+ :key="label.id"
+ class="gl-display-flex gl-flex-align-items-center gl-mb-5 gl-font-weight-normal"
+ >
+ <gl-form-radio :value="label.id" class="gl-mb-0" />
+ <span
+ class="dropdown-label-box gl-top-0"
+ :style="{
+ backgroundColor: label.color,
+ }"
+ ></span>
+ <span>{{ label.title }}</span>
+ </label>
+ </gl-form-radio-group>
+ </template>
+ </board-add-new-column-form>
+</template>
diff --git a/app/assets/javascripts/boards/components/board_add_new_column_form.vue b/app/assets/javascripts/boards/components/board_add_new_column_form.vue
new file mode 100644
index 00000000000..d85343a5390
--- /dev/null
+++ b/app/assets/javascripts/boards/components/board_add_new_column_form.vue
@@ -0,0 +1,131 @@
+<script>
+import { GlButton, GlFormGroup, GlSearchBoxByType, GlSkeletonLoader } from '@gitlab/ui';
+import { mapActions } from 'vuex';
+import { __ } from '~/locale';
+
+export default {
+ i18n: {
+ add: __('Add to board'),
+ cancel: __('Cancel'),
+ newList: __('New list'),
+ noneSelected: __('None'),
+ noResults: __('No matching results'),
+ selected: __('Selected'),
+ },
+ components: {
+ GlButton,
+ GlFormGroup,
+ GlSearchBoxByType,
+ GlSkeletonLoader,
+ },
+ props: {
+ loading: {
+ type: Boolean,
+ required: true,
+ },
+ formDescription: {
+ type: String,
+ required: true,
+ },
+ searchLabel: {
+ type: String,
+ required: true,
+ },
+ searchPlaceholder: {
+ type: String,
+ required: true,
+ },
+ selectedId: {
+ type: [Number, String],
+ required: false,
+ default: null,
+ },
+ },
+ data() {
+ return {
+ searchValue: '',
+ };
+ },
+ methods: {
+ ...mapActions(['setAddColumnFormVisibility']),
+ },
+};
+</script>
+
+<template>
+ <div
+ class="board-add-new-list board gl-display-inline-block gl-h-full gl-px-3 gl-vertical-align-top gl-white-space-normal gl-flex-shrink-0"
+ data-testid="board-add-new-column"
+ data-qa-selector="board_add_new_list"
+ >
+ <div
+ class="board-inner gl-display-flex gl-flex-direction-column gl-relative gl-h-full gl-rounded-base gl-bg-white"
+ >
+ <h3
+ class="gl-font-base gl-px-5 gl-py-5 gl-m-0 gl-border-b-1 gl-border-b-solid gl-border-b-gray-100"
+ data-testid="board-add-column-form-title"
+ >
+ {{ $options.i18n.newList }}
+ </h3>
+
+ <div class="gl-display-flex gl-flex-direction-column gl-h-full gl-overflow-hidden">
+ <slot name="select-list-type">
+ <div class="gl-mb-5"></div>
+ </slot>
+
+ <p class="gl-px-5">{{ formDescription }}</p>
+
+ <div class="gl-px-5 gl-pb-4">
+ <label class="gl-mb-2">{{ $options.i18n.selected }}</label>
+ <slot name="selected">
+ <div class="gl-text-gray-500">{{ $options.i18n.noneSelected }}</div>
+ </slot>
+ </div>
+
+ <gl-form-group
+ class="gl-mx-5 gl-mb-3"
+ :label="searchLabel"
+ label-for="board-available-column-entities"
+ >
+ <gl-search-box-by-type
+ id="board-available-column-entities"
+ v-model="searchValue"
+ debounce="250"
+ :placeholder="searchPlaceholder"
+ @input="$emit('filter-items', $event)"
+ />
+ </gl-form-group>
+
+ <div v-if="loading" class="gl-px-5">
+ <gl-skeleton-loader :width="500" :height="172">
+ <rect width="480" height="20" x="10" y="15" rx="4" />
+ <rect width="380" height="20" x="10" y="50" rx="4" />
+ <rect width="430" height="20" x="10" y="85" rx="4" />
+ </gl-skeleton-loader>
+ </div>
+
+ <slot v-else name="items">
+ <p class="gl-mx-5">{{ $options.i18n.noResults }}</p>
+ </slot>
+ </div>
+ <div
+ class="gl-display-flex gl-p-3 gl-border-t-1 gl-border-t-solid gl-border-gray-100 gl-bg-gray-10 gl-rounded-bottom-left-base gl-rounded-bottom-right-base"
+ >
+ <gl-button
+ data-testid="cancelAddNewColumn"
+ class="gl-ml-auto gl-mr-3"
+ @click="setAddColumnFormVisibility(false)"
+ >{{ $options.i18n.cancel }}</gl-button
+ >
+ <gl-button
+ data-testid="addNewColumnButton"
+ :disabled="!selectedId"
+ variant="confirm"
+ class="gl-mr-4"
+ @click="$emit('add-list')"
+ >{{ $options.i18n.add }}</gl-button
+ >
+ </div>
+ </div>
+ </div>
+</template>
diff --git a/app/assets/javascripts/boards/components/board_add_new_column_trigger.vue b/app/assets/javascripts/boards/components/board_add_new_column_trigger.vue
index 85fca589279..7c08e33be7e 100644
--- a/app/assets/javascripts/boards/components/board_add_new_column_trigger.vue
+++ b/app/assets/javascripts/boards/components/board_add_new_column_trigger.vue
@@ -13,7 +13,7 @@ export default {
</script>
<template>
- <span class="gl-ml-3 gl-display-flex gl-align-items-center">
+ <span class="gl-ml-3 gl-display-flex gl-align-items-center" data-testid="boards-create-list">
<gl-button variant="confirm" @click="setAddColumnFormVisibility(true)"
>{{ __('Create list') }}
</gl-button>
diff --git a/app/assets/javascripts/boards/components/board_card.vue b/app/assets/javascripts/boards/components/board_card.vue
index e6009343626..aacea0b970c 100644
--- a/app/assets/javascripts/boards/components/board_card.vue
+++ b/app/assets/javascripts/boards/components/board_card.vue
@@ -1,14 +1,11 @@
<script>
-import sidebarEventHub from '~/sidebar/event_hub';
-import eventHub from '../eventhub';
-import boardsStore from '../stores/boards_store';
-import BoardCardLayout from './board_card_layout.vue';
-import BoardCardLayoutDeprecated from './board_card_layout_deprecated.vue';
+import { mapActions, mapGetters, mapState } from 'vuex';
+import BoardCardInner from './board_card_inner.vue';
export default {
- name: 'BoardsIssueCard',
+ name: 'BoardCard',
components: {
- BoardCardLayout: gon.features?.graphqlBoardLists ? BoardCardLayout : BoardCardLayoutDeprecated,
+ BoardCardInner,
},
props: {
list: {
@@ -16,34 +13,46 @@ export default {
default: () => ({}),
required: false,
},
- issue: {
+ item: {
type: Object,
default: () => ({}),
required: false,
},
+ disabled: {
+ type: Boolean,
+ default: false,
+ required: false,
+ },
+ index: {
+ type: Number,
+ default: 0,
+ required: false,
+ },
},
- methods: {
- // These are methods instead of computed's, because boardsStore is not reactive.
+ computed: {
+ ...mapState(['selectedBoardItems', 'activeId']),
+ ...mapGetters(['isSwimlanesOn']),
isActive() {
- return this.getActiveId() === this.issue.id;
+ return this.item.id === this.activeId;
},
- getActiveId() {
- return boardsStore.detail?.issue?.id;
+ multiSelectVisible() {
+ return (
+ !this.activeId &&
+ this.selectedBoardItems.findIndex((boardItem) => boardItem.id === this.item.id) > -1
+ );
},
- showIssue({ isMultiSelect }) {
- // If no issues are opened, close all sidebars first
- if (!this.getActiveId()) {
- sidebarEventHub.$emit('sidebar.closeAll');
- }
- if (this.isActive()) {
- eventHub.$emit('clearDetailIssue', isMultiSelect);
+ },
+ methods: {
+ ...mapActions(['toggleBoardItemMultiSelection', 'toggleBoardItem']),
+ toggleIssue(e) {
+ // Don't do anything if this happened on a no trigger element
+ if (e.target.classList.contains('js-no-trigger')) return;
- if (isMultiSelect) {
- eventHub.$emit('newDetailIssue', this.issue, isMultiSelect);
- }
+ const isMultiSelect = e.ctrlKey || e.metaKey;
+ if (isMultiSelect) {
+ this.toggleBoardItemMultiSelection(this.item);
} else {
- eventHub.$emit('newDetailIssue', this.issue, isMultiSelect);
- boardsStore.setListDetail(this.list);
+ this.toggleBoardItem({ boardItem: this.item });
}
},
},
@@ -51,12 +60,22 @@ export default {
</script>
<template>
- <board-card-layout
+ <li
data-qa-selector="board_card"
- :issue="issue"
- :list="list"
- :is-active="isActive()"
- v-bind="$attrs"
- @show="showIssue"
- />
+ :class="{
+ 'multi-select': multiSelectVisible,
+ 'user-can-drag': !disabled && item.id,
+ 'is-disabled': disabled || !item.id,
+ 'is-active': isActive,
+ }"
+ :index="index"
+ :data-item-id="item.id"
+ :data-item-iid="item.iid"
+ :data-item-path="item.referencePath"
+ data-testid="board_card"
+ class="board-card gl-p-5 gl-rounded-base"
+ @mouseup="toggleIssue($event)"
+ >
+ <board-card-inner :list="list" :item="item" :update-filters="true" />
+ </li>
</template>
diff --git a/app/assets/javascripts/boards/components/board_card_deprecated.vue b/app/assets/javascripts/boards/components/board_card_deprecated.vue
new file mode 100644
index 00000000000..e12a2836f67
--- /dev/null
+++ b/app/assets/javascripts/boards/components/board_card_deprecated.vue
@@ -0,0 +1,61 @@
+<script>
+// This component is being replaced in favor of './board_card.vue' for GraphQL boards
+import sidebarEventHub from '~/sidebar/event_hub';
+import eventHub from '../eventhub';
+import boardsStore from '../stores/boards_store';
+import BoardCardLayoutDeprecated from './board_card_layout_deprecated.vue';
+
+export default {
+ components: {
+ BoardCardLayout: BoardCardLayoutDeprecated,
+ },
+ props: {
+ list: {
+ type: Object,
+ default: () => ({}),
+ required: false,
+ },
+ issue: {
+ type: Object,
+ default: () => ({}),
+ required: false,
+ },
+ },
+ methods: {
+ // These are methods instead of computed's, because boardsStore is not reactive.
+ isActive() {
+ return this.getActiveId() === this.issue.id;
+ },
+ getActiveId() {
+ return boardsStore.detail?.issue?.id;
+ },
+ showIssue({ isMultiSelect }) {
+ // If no issues are opened, close all sidebars first
+ if (!this.getActiveId()) {
+ sidebarEventHub.$emit('sidebar.closeAll');
+ }
+ if (this.isActive()) {
+ eventHub.$emit('clearDetailIssue', isMultiSelect);
+
+ if (isMultiSelect) {
+ eventHub.$emit('newDetailIssue', this.issue, isMultiSelect);
+ }
+ } else {
+ eventHub.$emit('newDetailIssue', this.issue, isMultiSelect);
+ boardsStore.setListDetail(this.list);
+ }
+ },
+ },
+};
+</script>
+
+<template>
+ <board-card-layout
+ data-qa-selector="board_card"
+ :issue="issue"
+ :list="list"
+ :is-active="isActive()"
+ v-bind="$attrs"
+ @show="showIssue"
+ />
+</template>
diff --git a/app/assets/javascripts/boards/components/board_card_inner.vue b/app/assets/javascripts/boards/components/board_card_inner.vue
new file mode 100644
index 00000000000..d4d6b17a589
--- /dev/null
+++ b/app/assets/javascripts/boards/components/board_card_inner.vue
@@ -0,0 +1,268 @@
+<script>
+import { GlLabel, GlTooltipDirective, GlIcon } from '@gitlab/ui';
+import { sortBy } from 'lodash';
+import { mapActions, mapGetters, mapState } from 'vuex';
+import boardCardInner from 'ee_else_ce/boards/mixins/board_card_inner';
+import { isScopedLabel } from '~/lib/utils/common_utils';
+import { updateHistory } from '~/lib/utils/url_utility';
+import { sprintf, __, n__ } from '~/locale';
+import TooltipOnTruncate from '~/vue_shared/components/tooltip_on_truncate.vue';
+import UserAvatarLink from '../../vue_shared/components/user_avatar/user_avatar_link.vue';
+import { ListType } from '../constants';
+import eventHub from '../eventhub';
+import IssueDueDate from './issue_due_date.vue';
+import IssueTimeEstimate from './issue_time_estimate.vue';
+
+export default {
+ components: {
+ GlLabel,
+ GlIcon,
+ UserAvatarLink,
+ TooltipOnTruncate,
+ IssueDueDate,
+ IssueTimeEstimate,
+ IssueCardWeight: () => import('ee_component/boards/components/issue_card_weight.vue'),
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ },
+ mixins: [boardCardInner],
+ inject: ['rootPath', 'scopedLabelsAvailable'],
+ props: {
+ item: {
+ type: Object,
+ required: true,
+ },
+ list: {
+ type: Object,
+ required: false,
+ default: () => ({}),
+ },
+ updateFilters: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ },
+ data() {
+ return {
+ limitBeforeCounter: 2,
+ maxRender: 3,
+ maxCounter: 99,
+ };
+ },
+ computed: {
+ ...mapState(['isShowingLabels']),
+ ...mapGetters(['isEpicBoard']),
+ cappedAssignees() {
+ // e.g. maxRender is 4,
+ // Render up to all 4 assignees if there are only 4 assigness
+ // Otherwise render up to the limitBeforeCounter
+ if (this.item.assignees.length <= this.maxRender) {
+ return this.item.assignees.slice(0, this.maxRender);
+ }
+
+ return this.item.assignees.slice(0, this.limitBeforeCounter);
+ },
+ numberOverLimit() {
+ return this.item.assignees.length - this.limitBeforeCounter;
+ },
+ assigneeCounterTooltip() {
+ const { numberOverLimit, maxCounter } = this;
+ const count = numberOverLimit > maxCounter ? maxCounter : numberOverLimit;
+ return sprintf(__('%{count} more assignees'), { count });
+ },
+ assigneeCounterLabel() {
+ if (this.numberOverLimit > this.maxCounter) {
+ return `${this.maxCounter}+`;
+ }
+
+ return `+${this.numberOverLimit}`;
+ },
+ shouldRenderCounter() {
+ if (this.item.assignees.length <= this.maxRender) {
+ return false;
+ }
+
+ return this.item.assignees.length > this.numberOverLimit;
+ },
+ itemPrefix() {
+ return this.isEpicBoard ? '&' : '#';
+ },
+
+ itemId() {
+ if (this.item.iid) {
+ return `${this.itemPrefix}${this.item.iid}`;
+ }
+ return false;
+ },
+ showLabelFooter() {
+ return this.isShowingLabels && this.item.labels.find(this.showLabel);
+ },
+ itemReferencePath() {
+ const { referencePath } = this.item;
+ return referencePath.split(this.itemPrefix)[0];
+ },
+ orderedLabels() {
+ return sortBy(this.item.labels.filter(this.isNonListLabel), 'title');
+ },
+ blockedLabel() {
+ if (this.item.blockedByCount) {
+ return n__(`Blocked by %d issue`, `Blocked by %d issues`, this.item.blockedByCount);
+ }
+ return __('Blocked issue');
+ },
+ },
+ methods: {
+ ...mapActions(['performSearch']),
+ isIndexLessThanlimit(index) {
+ return index < this.limitBeforeCounter;
+ },
+ assigneeUrl(assignee) {
+ if (!assignee) return '';
+ return `${this.rootPath}${assignee.username}`;
+ },
+ avatarUrlTitle(assignee) {
+ return sprintf(__(`Avatar for %{assigneeName}`), { assigneeName: assignee.name });
+ },
+ avatarUrl(assignee) {
+ return assignee.avatarUrl || assignee.avatar || gon.default_avatar_url;
+ },
+ showLabel(label) {
+ if (!label.id) return false;
+ return true;
+ },
+ isNonListLabel(label) {
+ return (
+ label.id &&
+ !(
+ (this.list.type || this.list.listType) === ListType.label &&
+ this.list.title === label.title
+ )
+ );
+ },
+ filterByLabel(label) {
+ if (!this.updateFilters) return;
+ const filterPath = window.location.search ? `${window.location.search}&` : '?';
+ const filter = `label_name[]=${encodeURIComponent(label.title)}`;
+
+ if (!filterPath.includes(filter)) {
+ updateHistory({
+ url: `${filterPath}${filter}`,
+ });
+ this.performSearch();
+ eventHub.$emit('updateTokens');
+ }
+ },
+ showScopedLabel(label) {
+ return this.scopedLabelsAvailable && isScopedLabel(label);
+ },
+ },
+};
+</script>
+<template>
+ <div>
+ <div class="gl-display-flex" dir="auto">
+ <h4 class="board-card-title gl-mb-0 gl-mt-0">
+ <gl-icon
+ v-if="item.blocked"
+ v-gl-tooltip
+ name="issue-block"
+ :title="blockedLabel"
+ class="issue-blocked-icon gl-mr-2"
+ :aria-label="blockedLabel"
+ data-testid="issue-blocked-icon"
+ />
+ <gl-icon
+ v-if="item.confidential"
+ v-gl-tooltip
+ name="eye-slash"
+ :title="__('Confidential')"
+ class="confidential-icon gl-mr-2"
+ :aria-label="__('Confidential')"
+ />
+ <a
+ :href="item.path || item.webUrl || ''"
+ :title="item.title"
+ class="js-no-trigger"
+ @mousemove.stop
+ >{{ item.title }}</a
+ >
+ </h4>
+ </div>
+ <div v-if="showLabelFooter" class="board-card-labels gl-mt-2 gl-display-flex gl-flex-wrap">
+ <template v-for="label in orderedLabels">
+ <gl-label
+ :key="label.id"
+ :background-color="label.color"
+ :title="label.title"
+ :description="label.description"
+ size="sm"
+ :scoped="showScopedLabel(label)"
+ @click="filterByLabel(label)"
+ />
+ </template>
+ </div>
+ <div
+ 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"
+ >
+ <span
+ v-if="item.referencePath"
+ class="board-card-number gl-overflow-hidden gl-display-flex gl-mr-3 gl-mt-3"
+ :class="{ 'gl-font-base': isEpicBoard }"
+ >
+ <tooltip-on-truncate
+ v-if="itemReferencePath"
+ :title="itemReferencePath"
+ placement="bottom"
+ class="board-item-path gl-text-truncate gl-font-weight-bold"
+ >{{ itemReferencePath }}</tooltip-on-truncate
+ >
+ {{ itemId }}
+ </span>
+ <span class="board-info-items gl-mt-3 gl-display-inline-block">
+ <issue-due-date
+ v-if="item.dueDate"
+ :date="item.dueDate"
+ :closed="item.closed || Boolean(item.closedAt)"
+ />
+ <issue-time-estimate v-if="item.timeEstimate" :estimate="item.timeEstimate" />
+ <issue-card-weight
+ v-if="validIssueWeight(item)"
+ :weight="item.weight"
+ @click="filterByWeight(item.weight)"
+ />
+ </span>
+ </div>
+ <div class="board-card-assignee gl-display-flex">
+ <user-avatar-link
+ v-for="assignee in cappedAssignees"
+ :key="assignee.id"
+ :link-href="assigneeUrl(assignee)"
+ :img-alt="avatarUrlTitle(assignee)"
+ :img-src="avatarUrl(assignee)"
+ :img-size="24"
+ class="js-no-trigger"
+ tooltip-placement="bottom"
+ >
+ <span class="js-assignee-tooltip">
+ <span class="gl-font-weight-bold gl-display-block">{{ __('Assignee') }}</span>
+ {{ assignee.name }}
+ <span class="text-white-50">@{{ assignee.username }}</span>
+ </span>
+ </user-avatar-link>
+ <span
+ v-if="shouldRenderCounter"
+ v-gl-tooltip
+ :title="assigneeCounterTooltip"
+ class="avatar-counter"
+ data-placement="bottom"
+ >{{ assigneeCounterLabel }}</span
+ >
+ </div>
+ </div>
+ </div>
+</template>
diff --git a/app/assets/javascripts/boards/components/board_card_layout.vue b/app/assets/javascripts/boards/components/board_card_layout.vue
deleted file mode 100644
index 5e3c3702519..00000000000
--- a/app/assets/javascripts/boards/components/board_card_layout.vue
+++ /dev/null
@@ -1,98 +0,0 @@
-<script>
-import { mapActions, mapGetters, mapState } from 'vuex';
-import { ISSUABLE } from '~/boards/constants';
-import IssueCardInner from './issue_card_inner.vue';
-
-export default {
- name: 'BoardCardLayout',
- components: {
- IssueCardInner,
- },
- props: {
- list: {
- type: Object,
- default: () => ({}),
- required: false,
- },
- issue: {
- type: Object,
- default: () => ({}),
- required: false,
- },
- disabled: {
- type: Boolean,
- default: false,
- required: false,
- },
- index: {
- type: Number,
- default: 0,
- required: false,
- },
- isActive: {
- type: Boolean,
- required: false,
- default: false,
- },
- },
- data() {
- return {
- showDetail: false,
- };
- },
- computed: {
- ...mapState(['selectedBoardItems']),
- ...mapGetters(['isSwimlanesOn']),
- multiSelectVisible() {
- return this.selectedBoardItems.findIndex((boardItem) => boardItem.id === this.issue.id) > -1;
- },
- },
- methods: {
- ...mapActions(['setActiveId', 'toggleBoardItemMultiSelection']),
- mouseDown() {
- this.showDetail = true;
- },
- mouseMove() {
- this.showDetail = false;
- },
- showIssue(e) {
- // Don't do anything if this happened on a no trigger element
- if (e.target.classList.contains('js-no-trigger')) return;
-
- const isMultiSelect = e.ctrlKey || e.metaKey;
-
- if (!isMultiSelect) {
- this.setActiveId({ id: this.issue.id, sidebarType: ISSUABLE });
- } else {
- this.toggleBoardItemMultiSelection(this.issue);
- }
-
- if (this.showDetail || isMultiSelect) {
- this.showDetail = false;
- }
- },
- },
-};
-</script>
-
-<template>
- <li
- :class="{
- 'multi-select': multiSelectVisible,
- 'user-can-drag': !disabled && issue.id,
- 'is-disabled': disabled || !issue.id,
- 'is-active': isActive,
- }"
- :index="index"
- :data-issue-id="issue.id"
- :data-issue-iid="issue.iid"
- :data-issue-path="issue.referencePath"
- data-testid="board_card"
- class="board-card gl-p-5 gl-rounded-base"
- @mousedown="mouseDown"
- @mousemove="mouseMove"
- @mouseup="showIssue($event)"
- >
- <issue-card-inner :list="list" :issue="issue" :update-filters="true" />
- </li>
-</template>
diff --git a/app/assets/javascripts/boards/components/board_card_layout_deprecated.vue b/app/assets/javascripts/boards/components/board_card_layout_deprecated.vue
index f9a726134a3..3381e4c3a7d 100644
--- a/app/assets/javascripts/boards/components/board_card_layout_deprecated.vue
+++ b/app/assets/javascripts/boards/components/board_card_layout_deprecated.vue
@@ -3,13 +3,12 @@ import { mapActions, mapGetters } from 'vuex';
import { ISSUABLE } from '~/boards/constants';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import boardsStore from '../stores/boards_store';
-import IssueCardInner from './issue_card_inner.vue';
import IssueCardInnerDeprecated from './issue_card_inner_deprecated.vue';
export default {
name: 'BoardCardLayout',
components: {
- IssueCardInner: gon.features?.graphqlBoardLists ? IssueCardInner : IssueCardInnerDeprecated,
+ IssueCardInner: IssueCardInnerDeprecated,
},
mixins: [glFeatureFlagMixin()],
props: {
diff --git a/app/assets/javascripts/boards/components/board_column.vue b/app/assets/javascripts/boards/components/board_column.vue
index 41b9ee795eb..c9e667d526c 100644
--- a/app/assets/javascripts/boards/components/board_column.vue
+++ b/app/assets/javascripts/boards/components/board_column.vue
@@ -32,12 +32,12 @@ export default {
},
computed: {
...mapState(['filterParams', 'highlightedLists']),
- ...mapGetters(['getIssuesByList']),
+ ...mapGetters(['getBoardItemsByList']),
highlighted() {
return this.highlightedLists.includes(this.list.id);
},
- listIssues() {
- return this.getIssuesByList(this.list.id);
+ listItems() {
+ return this.getBoardItemsByList(this.list.id);
},
isListDraggable() {
return isListDraggable(this.list);
@@ -46,11 +46,20 @@ export default {
watch: {
filterParams: {
handler() {
- this.fetchIssuesForList({ listId: this.list.id });
+ if (this.list.id) {
+ this.fetchItemsForList({ listId: this.list.id });
+ }
},
deep: true,
immediate: true,
},
+ 'list.id': {
+ handler(id) {
+ if (id) {
+ this.fetchItemsForList({ listId: this.list.id });
+ }
+ },
+ },
highlighted: {
handler(highlighted) {
if (highlighted) {
@@ -63,7 +72,7 @@ export default {
},
},
methods: {
- ...mapActions(['fetchIssuesForList']),
+ ...mapActions(['fetchItemsForList']),
},
};
</script>
@@ -87,7 +96,7 @@ export default {
<board-list
ref="board-list"
:disabled="disabled"
- :issues="listIssues"
+ :board-items="listItems"
:list="list"
:can-admin-list="canAdminList"
/>
diff --git a/app/assets/javascripts/boards/components/board_content.vue b/app/assets/javascripts/boards/components/board_content.vue
index 9b10e7d7db5..e9c4237d759 100644
--- a/app/assets/javascripts/boards/components/board_content.vue
+++ b/app/assets/javascripts/boards/components/board_content.vue
@@ -3,6 +3,7 @@ import { GlAlert } from '@gitlab/ui';
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 { sortableEnd, sortableStart } from '~/boards/mixins/sortable_default_options';
import defaultSortableConfig from '~/sortable/sortable_config';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
@@ -11,7 +12,11 @@ import BoardColumnDeprecated from './board_column_deprecated.vue';
export default {
components: {
- BoardColumn: gon.features?.graphqlBoardLists ? BoardColumn : BoardColumnDeprecated,
+ BoardAddNewColumn,
+ BoardColumn:
+ gon.features?.graphqlBoardLists || gon.features?.epicBoards
+ ? BoardColumn
+ : BoardColumnDeprecated,
BoardContentSidebar: () => import('ee_component/boards/components/board_content_sidebar.vue'),
EpicsSwimlanes: () => import('ee_component/boards/components/epics_swimlanes.vue'),
GlAlert,
@@ -33,15 +38,18 @@ export default {
},
},
computed: {
- ...mapState(['boardLists', 'error']),
- ...mapGetters(['isSwimlanesOn']),
+ ...mapState(['boardLists', 'error', 'addColumnForm']),
+ ...mapGetters(['isSwimlanesOn', 'isEpicBoard']),
+ addColumnFormVisible() {
+ return this.addColumnForm?.visible;
+ },
boardListsToUse() {
- return this.glFeatures.graphqlBoardLists || this.isSwimlanesOn
+ return this.glFeatures.graphqlBoardLists || this.isSwimlanesOn || this.isEpicBoard
? sortBy([...Object.values(this.boardLists)], 'position')
: this.lists;
},
canDragColumns() {
- return this.glFeatures.graphqlBoardLists && this.canAdminList;
+ return !this.isEpicBoard && this.glFeatures.graphqlBoardLists && this.canAdminList;
},
boardColumnWrapper() {
return this.canDragColumns ? Draggable : 'div';
@@ -62,12 +70,17 @@ export default {
},
methods: {
...mapActions(['moveList']),
+ afterFormEnters() {
+ const el = this.canDragColumns ? this.$refs.list.$el : this.$refs.list;
+ el.scrollTo({ left: el.scrollWidth, behavior: 'smooth' });
+ },
handleDragOnStart() {
sortableStart();
},
handleDragOnEnd(params) {
sortableEnd();
+ if (this.isEpicBoard) return;
const { item, newIndex, oldIndex, to } = params;
@@ -100,13 +113,17 @@ export default {
@end="handleDragOnEnd"
>
<board-column
- v-for="list in boardListsToUse"
- :key="list.id"
+ v-for="(list, index) in boardListsToUse"
+ :key="index"
ref="board"
:can-admin-list="canAdminList"
:list="list"
:disabled="disabled"
/>
+
+ <transition name="slide" @after-enter="afterFormEnters">
+ <board-add-new-column v-if="addColumnFormVisible" />
+ </transition>
</component>
<epics-swimlanes
diff --git a/app/assets/javascripts/boards/components/board_form.vue b/app/assets/javascripts/boards/components/board_form.vue
index f65f00bcccc..d8504dcfb0f 100644
--- a/app/assets/javascripts/boards/components/board_form.vue
+++ b/app/assets/javascripts/boards/components/board_form.vue
@@ -1,5 +1,6 @@
<script>
import { GlModal } from '@gitlab/ui';
+import { mapGetters } from 'vuex';
import { deprecatedCreateFlash as Flash } from '~/flash';
import { convertToGraphQLId } from '~/graphql_shared/utils';
import { getParameterByName } from '~/lib/utils/common_utils';
@@ -106,6 +107,7 @@ export default {
};
},
computed: {
+ ...mapGetters(['isEpicBoard', 'isGroupBoard', 'isProjectBoard']),
isNewForm() {
return this.currentPage === formType.new;
},
@@ -161,42 +163,49 @@ export default {
currentMutation() {
return this.board.id ? updateBoardMutation : createBoardMutation;
},
- mutationVariables() {
+ baseMutationVariables() {
const { board } = this;
- /* eslint-disable @gitlab/require-i18n-strings */
- let baseMutationVariables = {
+ const variables = {
name: board.name,
hideBacklogList: board.hide_backlog_list,
hideClosedList: board.hide_closed_list,
};
- if (this.scopedIssueBoardFeatureEnabled) {
- baseMutationVariables = {
- ...baseMutationVariables,
- weight: board.weight,
- assigneeId: board.assignee?.id ? convertToGraphQLId('User', board.assignee.id) : null,
- milestoneId:
- board.milestone?.id || board.milestone?.id === 0
- ? convertToGraphQLId('Milestone', board.milestone.id)
- : null,
- labelIds: board.labels.map(fullLabelId),
- iterationId: board.iteration_id
- ? convertToGraphQLId('Iteration', board.iteration_id)
- : null,
- };
- }
- /* eslint-enable @gitlab/require-i18n-strings */
return board.id
? {
- ...baseMutationVariables,
+ ...variables,
id: fullBoardId(board.id),
}
: {
- ...baseMutationVariables,
- projectPath: this.projectId ? this.fullPath : null,
- groupPath: this.groupId ? this.fullPath : null,
+ ...variables,
+ projectPath: this.isProjectBoard ? this.fullPath : undefined,
+ groupPath: this.isGroupBoard ? this.fullPath : undefined,
};
},
+ boardScopeMutationVariables() {
+ /* eslint-disable @gitlab/require-i18n-strings */
+ return {
+ weight: this.board.weight,
+ assigneeId: this.board.assignee?.id
+ ? convertToGraphQLId('User', this.board.assignee.id)
+ : null,
+ milestoneId:
+ this.board.milestone?.id || this.board.milestone?.id === 0
+ ? convertToGraphQLId('Milestone', this.board.milestone.id)
+ : null,
+ labelIds: this.board.labels.map(fullLabelId),
+ iterationId: this.board.iteration_id
+ ? convertToGraphQLId('Iteration', this.board.iteration_id)
+ : null,
+ };
+ /* eslint-enable @gitlab/require-i18n-strings */
+ },
+ mutationVariables() {
+ return {
+ ...this.baseMutationVariables,
+ ...(this.scopedIssueBoardFeatureEnabled ? this.boardScopeMutationVariables : {}),
+ };
+ },
},
mounted() {
this.resetFormState();
@@ -208,6 +217,16 @@ export default {
setIteration(iterationId) {
this.board.iteration_id = iterationId;
},
+ boardCreateResponse(data) {
+ return data.createBoard.board.webPath;
+ },
+ boardUpdateResponse(data) {
+ const path = data.updateBoard.board.webPath;
+ const param = getParameterByName('group_by')
+ ? `?group_by=${getParameterByName('group_by')}`
+ : '';
+ return `${path}${param}`;
+ },
async createOrUpdateBoard() {
const response = await this.$apollo.mutate({
mutation: this.currentMutation,
@@ -215,14 +234,10 @@ export default {
});
if (!this.board.id) {
- return response.data.createBoard.board.webPath;
+ return this.boardCreateResponse(response.data);
}
- const path = response.data.updateBoard.board.webPath;
- const param = getParameterByName('group_by')
- ? `?group_by=${getParameterByName('group_by')}`
- : '';
- return `${path}${param}`;
+ return this.boardUpdateResponse(response.data);
},
async submit() {
if (this.board.name.length === 0) return;
@@ -309,7 +324,7 @@ export default {
/>
<board-scope
- v-if="scopedIssueBoardFeatureEnabled"
+ v-if="scopedIssueBoardFeatureEnabled && !isEpicBoard"
:collapse-scope="isNewForm"
:board="board"
:can-admin-board="canAdminBoard"
diff --git a/app/assets/javascripts/boards/components/board_list.vue b/app/assets/javascripts/boards/components/board_list.vue
index 7495b1163be..8945ef7002e 100644
--- a/app/assets/javascripts/boards/components/board_list.vue
+++ b/app/assets/javascripts/boards/components/board_list.vue
@@ -12,8 +12,8 @@ import BoardNewIssue from './board_new_issue.vue';
export default {
name: 'BoardList',
i18n: {
- loadingIssues: __('Loading issues'),
- loadingMoreissues: __('Loading more issues'),
+ loading: __('Loading'),
+ loadingMoreboardItems: __('Loading more'),
showingAllIssues: __('Showing all issues'),
},
components: {
@@ -30,7 +30,7 @@ export default {
type: Object,
required: true,
},
- issues: {
+ boardItems: {
type: Array,
required: true,
},
@@ -51,11 +51,11 @@ export default {
...mapState(['pageInfoByListId', 'listsFlags']),
paginatedIssueText() {
return sprintf(__('Showing %{pageSize} of %{total} issues'), {
- pageSize: this.issues.length,
+ pageSize: this.boardItems.length,
total: this.list.issuesCount,
});
},
- issuesSizeExceedsMax() {
+ boardItemsSizeExceedsMax() {
return this.list.maxIssueCount > 0 && this.list.issuesCount > this.list.maxIssueCount;
},
hasNextPage() {
@@ -72,7 +72,7 @@ export default {
return this.canAdminList ? this.$refs.list.$el : this.$refs.list;
},
showingAllIssues() {
- return this.issues.length === this.list.issuesCount;
+ return this.boardItems.length === this.list.issuesCount;
},
treeRootWrapper() {
return this.canAdminList ? Draggable : 'ul';
@@ -85,14 +85,14 @@ export default {
tag: 'ul',
'ghost-class': 'board-card-drag-active',
'data-list-id': this.list.id,
- value: this.issues,
+ value: this.boardItems,
};
return this.canAdminList ? options : {};
},
},
watch: {
- issues() {
+ boardItems() {
this.$nextTick(() => {
this.showCount = this.scrollHeight() > Math.ceil(this.listHeight());
});
@@ -112,7 +112,7 @@ export default {
this.listRef.removeEventListener('scroll', this.onScroll);
},
methods: {
- ...mapActions(['fetchIssuesForList', 'moveIssue']),
+ ...mapActions(['fetchItemsForList', 'moveItem']),
listHeight() {
return this.listRef.getBoundingClientRect().height;
},
@@ -126,7 +126,7 @@ export default {
this.listRef.scrollTop = 0;
},
loadNextPage() {
- this.fetchIssuesForList({ listId: this.list.id, fetchNext: true });
+ this.fetchItemsForList({ listId: this.list.id, fetchNext: true });
},
toggleForm() {
this.showIssueForm = !this.showIssueForm;
@@ -148,40 +148,40 @@ export default {
handleDragOnEnd(params) {
sortableEnd();
const { newIndex, oldIndex, from, to, item } = params;
- const { issueId, issueIid, issuePath } = item.dataset;
+ const { itemId, itemIid, itemPath } = item.dataset;
const { children } = to;
let moveBeforeId;
let moveAfterId;
- const getIssueId = (el) => Number(el.dataset.issueId);
+ const getItemId = (el) => Number(el.dataset.itemId);
- // If issue is being moved within the same list
+ // If item is being moved within the same list
if (from === to) {
if (newIndex > oldIndex && children.length > 1) {
- // If issue is being moved down we look for the issue that ends up before
- moveBeforeId = getIssueId(children[newIndex]);
+ // If item is being moved down we look for the item that ends up before
+ moveBeforeId = getItemId(children[newIndex]);
} else if (newIndex < oldIndex && children.length > 1) {
- // If issue is being moved up we look for the issue that ends up after
- moveAfterId = getIssueId(children[newIndex]);
+ // If item is being moved up we look for the item that ends up after
+ moveAfterId = getItemId(children[newIndex]);
} else {
- // If issue remains in the same list at the same position we do nothing
+ // If item remains in the same list at the same position we do nothing
return;
}
} else {
- // We look for the issue that ends up before the moved issue if it exists
+ // We look for the item that ends up before the moved item if it exists
if (children[newIndex - 1]) {
- moveBeforeId = getIssueId(children[newIndex - 1]);
+ moveBeforeId = getItemId(children[newIndex - 1]);
}
- // We look for the issue that ends up after the moved issue if it exists
+ // We look for the item that ends up after the moved item if it exists
if (children[newIndex]) {
- moveAfterId = getIssueId(children[newIndex]);
+ moveAfterId = getItemId(children[newIndex]);
}
}
- this.moveIssue({
- issueId,
- issueIid,
- issuePath,
+ this.moveItem({
+ itemId,
+ itemIid,
+ itemPath,
fromListId: from.dataset.listId,
toListId: to.dataset.listId,
moveBeforeId,
@@ -201,7 +201,7 @@ export default {
<div
v-if="loading"
class="gl-mt-4 gl-text-center"
- :aria-label="$options.i18n.loadingIssues"
+ :aria-label="$options.i18n.loading"
data-testid="board_list_loading"
>
<gl-loading-icon />
@@ -214,23 +214,27 @@ export default {
v-bind="treeRootOptions"
:data-board="list.id"
:data-board-type="list.listType"
- :class="{ 'bg-danger-100': issuesSizeExceedsMax }"
+ :class="{ 'bg-danger-100': boardItemsSizeExceedsMax }"
class="board-list gl-w-full gl-h-full gl-list-style-none gl-mb-0 gl-p-2 js-board-list"
data-testid="tree-root-wrapper"
@start="handleDragOnStart"
@end="handleDragOnEnd"
>
<board-card
- v-for="(issue, index) in issues"
+ v-for="(item, index) in boardItems"
ref="issue"
- :key="issue.id"
+ :key="item.id"
:index="index"
:list="list"
- :issue="issue"
+ :item="item"
:disabled="disabled"
/>
<li v-if="showCount" class="board-list-count gl-text-center" data-issue-id="-1">
- <gl-loading-icon v-if="loadingMore" :label="$options.i18n.loadingMoreissues" />
+ <gl-loading-icon
+ v-if="loadingMore"
+ :label="$options.i18n.loadingMoreboardItems"
+ data-testid="count-loading-icon"
+ />
<span v-if="showingAllIssues">{{ $options.i18n.showingAllIssues }}</span>
<span v-else>{{ paginatedIssueText }}</span>
</li>
diff --git a/app/assets/javascripts/boards/components/board_list_deprecated.vue b/app/assets/javascripts/boards/components/board_list_deprecated.vue
index 9b4961d362d..d59fbcc1b31 100644
--- a/app/assets/javascripts/boards/components/board_list_deprecated.vue
+++ b/app/assets/javascripts/boards/components/board_list_deprecated.vue
@@ -11,7 +11,7 @@ import {
sortableEnd,
} from '../mixins/sortable_default_options';
import boardsStore from '../stores/boards_store';
-import boardCard from './board_card.vue';
+import boardCard from './board_card_deprecated.vue';
import boardNewIssue from './board_new_issue_deprecated.vue';
// This component is being replaced in favor of './board_list.vue' for GraphQL boards
diff --git a/app/assets/javascripts/boards/components/board_list_header.vue b/app/assets/javascripts/boards/components/board_list_header.vue
index a933370427c..9054a34974f 100644
--- a/app/assets/javascripts/boards/components/board_list_header.vue
+++ b/app/assets/javascripts/boards/components/board_list_header.vue
@@ -8,9 +8,9 @@ import {
GlSprintf,
GlTooltipDirective,
} from '@gitlab/ui';
-import { mapActions, mapState } from 'vuex';
+import { mapActions, mapGetters, mapState } from 'vuex';
import { isListDraggable } from '~/boards/boards_util';
-import { isScopedLabel } from '~/lib/utils/common_utils';
+import { isScopedLabel, parseBoolean } from '~/lib/utils/common_utils';
import { BV_HIDE_TOOLTIP } from '~/lib/utils/constants';
import { n__, s__, __ } from '~/locale';
import sidebarEventHub from '~/sidebar/event_hub';
@@ -70,6 +70,7 @@ export default {
},
computed: {
...mapState(['activeId']),
+ ...mapGetters(['isEpicBoard']),
isLoggedIn() {
return Boolean(this.currentUserId);
},
@@ -97,11 +98,14 @@ export default {
showListDetails() {
return !this.list.collapsed || !this.isSwimlanesHeader;
},
- issuesCount() {
+ itemsCount() {
return this.list.issuesCount;
},
- issuesTooltipLabel() {
- return n__(`%d issue`, `%d issues`, this.issuesCount);
+ countIcon() {
+ return 'issues';
+ },
+ itemsTooltipLabel() {
+ return n__(`%d issue`, `%d issues`, this.itemsCount);
},
chevronTooltip() {
return this.list.collapsed ? this.$options.i18n.expand : this.$options.i18n.collapse;
@@ -110,7 +114,7 @@ export default {
return this.list.collapsed ? 'chevron-down' : 'chevron-right';
},
isNewIssueShown() {
- return this.listType === ListType.backlog || this.showListHeaderButton;
+ return (this.listType === ListType.backlog || this.showListHeaderButton) && !this.isEpicBoard;
},
isSettingsShown() {
return (
@@ -131,8 +135,14 @@ export default {
return !this.disabled && isListDraggable(this.list);
},
},
+ created() {
+ const localCollapsed = parseBoolean(localStorage.getItem(`${this.uniqueKey}.collapsed`));
+ if ((!this.isLoggedIn || this.isEpicBoard) && localCollapsed) {
+ this.toggleListCollapsed({ listId: this.list.id, collapsed: true });
+ }
+ },
methods: {
- ...mapActions(['updateList', 'setActiveId']),
+ ...mapActions(['updateList', 'setActiveId', 'toggleListCollapsed']),
openSidebarSettings() {
if (this.activeId === inactiveId) {
sidebarEventHub.$emit('sidebar.closeAll');
@@ -148,10 +158,10 @@ export default {
eventHub.$emit(`toggle-issue-form-${this.list.id}`);
},
toggleExpanded() {
- // eslint-disable-next-line vue/no-mutating-props
- this.list.collapsed = !this.list.collapsed;
+ const collapsed = !this.list.collapsed;
+ this.toggleListCollapsed({ listId: this.list.id, collapsed });
- if (!this.isLoggedIn) {
+ if (!this.isLoggedIn || this.isEpicBoard) {
this.addToLocalStorage();
} else {
this.updateListFunction();
@@ -163,7 +173,7 @@ export default {
},
addToLocalStorage() {
if (AccessorUtilities.isLocalStorageAccessSafe()) {
- localStorage.setItem(`${this.uniqueKey}.expanded`, !this.list.collapsed);
+ localStorage.setItem(`${this.uniqueKey}.collapsed`, this.list.collapsed);
}
},
updateListFunction() {
@@ -203,6 +213,7 @@ export default {
class="board-title-caret no-drag gl-cursor-pointer"
category="tertiary"
size="small"
+ data-testid="board-title-caret"
@click="toggleExpanded"
/>
<!-- EE start -->
@@ -301,11 +312,11 @@ export default {
<div v-if="list.maxIssueCount !== 0">
•
<gl-sprintf :message="__('%{issuesSize} with a limit of %{maxIssueCount}')">
- <template #issuesSize>{{ issuesTooltipLabel }}</template>
+ <template #issuesSize>{{ itemsTooltipLabel }}</template>
<template #maxIssueCount>{{ list.maxIssueCount }}</template>
</gl-sprintf>
</div>
- <div v-else>• {{ issuesTooltipLabel }}</div>
+ <div v-else>• {{ itemsTooltipLabel }}</div>
<div v-if="weightFeatureAvailable">
•
<gl-sprintf :message="__('%{totalWeight} total weight')">
@@ -323,13 +334,13 @@ export default {
}"
>
<span class="gl-display-inline-flex">
- <gl-tooltip :target="() => $refs.issueCount" :title="issuesTooltipLabel" />
- <span ref="issueCount" class="issue-count-badge-count">
- <gl-icon class="gl-mr-2" name="issues" />
- <issue-count :issues-size="issuesCount" :max-issue-count="list.maxIssueCount" />
+ <gl-tooltip :target="() => $refs.itemCount" :title="itemsTooltipLabel" />
+ <span ref="itemCount" class="issue-count-badge-count">
+ <gl-icon class="gl-mr-2" :name="countIcon" />
+ <issue-count :issues-size="itemsCount" :max-issue-count="list.maxIssueCount" />
</span>
<!-- EE start -->
- <template v-if="weightFeatureAvailable">
+ <template v-if="weightFeatureAvailable && !isEpicBoard">
<gl-tooltip :target="() => $refs.weightTooltip" :title="weightCountToolTip" />
<span ref="weightTooltip" class="gl-display-inline-flex gl-ml-3">
<gl-icon class="gl-mr-2" name="weight" />
diff --git a/app/assets/javascripts/boards/components/board_new_issue.vue b/app/assets/javascripts/boards/components/board_new_issue.vue
index 1df154688c8..a81c28733cd 100644
--- a/app/assets/javascripts/boards/components/board_new_issue.vue
+++ b/app/assets/javascripts/boards/components/board_new_issue.vue
@@ -1,6 +1,6 @@
<script>
import { GlButton } from '@gitlab/ui';
-import { mapActions, mapState } from 'vuex';
+import { mapActions, mapGetters, mapState } from 'vuex';
import { getMilestone } from 'ee_else_ce/boards/boards_util';
import { __ } from '~/locale';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
@@ -32,8 +32,9 @@ export default {
},
computed: {
...mapState(['selectedProject']),
+ ...mapGetters(['isGroupBoard']),
disabled() {
- if (this.groupId) {
+ if (this.isGroupBoard) {
return this.title === '' || !this.selectedProject.name;
}
return this.title === '';
@@ -98,7 +99,7 @@ export default {
name="issue_title"
autocomplete="off"
/>
- <project-select v-if="groupId" :group-id="groupId" :list="list" />
+ <project-select v-if="isGroupBoard" :group-id="groupId" :list="list" />
<div class="clearfix gl-mt-3">
<gl-button
ref="submitButton"
diff --git a/app/assets/javascripts/boards/components/board_new_issue_deprecated.vue b/app/assets/javascripts/boards/components/board_new_issue_deprecated.vue
index eff87ff110e..16f23dfff0e 100644
--- a/app/assets/javascripts/boards/components/board_new_issue_deprecated.vue
+++ b/app/assets/javascripts/boards/components/board_new_issue_deprecated.vue
@@ -1,5 +1,6 @@
<script>
import { GlButton } from '@gitlab/ui';
+import { mapGetters } from 'vuex';
import { getMilestone } from 'ee_else_ce/boards/boards_util';
import ListIssue from 'ee_else_ce/boards/models/issue';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
@@ -31,8 +32,9 @@ export default {
};
},
computed: {
+ ...mapGetters(['isGroupBoard']),
disabled() {
- if (this.groupId) {
+ if (this.isGroupBoard) {
return this.title === '' || !this.selectedProject.name;
}
return this.title === '';
@@ -110,7 +112,7 @@ export default {
name="issue_title"
autocomplete="off"
/>
- <project-select v-if="groupId" :group-id="groupId" :list="list" />
+ <project-select v-if="isGroupBoard" :group-id="groupId" :list="list" />
<div class="clearfix gl-mt-3">
<gl-button
ref="submitButton"
diff --git a/app/assets/javascripts/boards/components/board_sidebar.js b/app/assets/javascripts/boards/components/board_sidebar.js
index 6d5a13be3ac..55bc91cbcff 100644
--- a/app/assets/javascripts/boards/components/board_sidebar.js
+++ b/app/assets/javascripts/boards/components/board_sidebar.js
@@ -20,7 +20,6 @@ import Subscriptions from '~/sidebar/components/subscriptions/subscriptions.vue'
import TimeTracker from '~/sidebar/components/time_tracking/time_tracker.vue';
import eventHub from '~/sidebar/event_hub';
import boardsStore from '../stores/boards_store';
-import RemoveBtn from './sidebar/remove_issue.vue';
export default Vue.extend({
components: {
@@ -29,7 +28,6 @@ export default Vue.extend({
GlLabel,
SidebarEpicsSelect: () =>
import('ee_component/sidebar/components/sidebar_item_epics_select.vue'),
- RemoveBtn,
Subscriptions,
TimeTracker,
SidebarAssigneesWidget,
@@ -107,8 +105,8 @@ export default Vue.extend({
closeSidebar() {
this.detail.issue = {};
},
- setAssignees(data) {
- boardsStore.detail.issue.setAssignees(data.issueSetAssignees.issue.assignees.nodes);
+ setAssignees(assignees) {
+ boardsStore.detail.issue.setAssignees(assignees);
},
showScopedLabels(label) {
return boardsStore.scopedLabels.enabled && isScopedLabel(label);
diff --git a/app/assets/javascripts/boards/components/boards_selector.vue b/app/assets/javascripts/boards/components/boards_selector.vue
index 2a064aaa885..5124467136e 100644
--- a/app/assets/javascripts/boards/components/boards_selector.vue
+++ b/app/assets/javascripts/boards/components/boards_selector.vue
@@ -9,6 +9,9 @@ import {
GlModalDirective,
} from '@gitlab/ui';
import { throttle } from 'lodash';
+import { mapGetters, mapState } from 'vuex';
+
+import BoardForm from 'ee_else_ce/boards/components/board_form.vue';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import axios from '~/lib/utils/axios_utils';
@@ -18,8 +21,6 @@ import eventHub from '../eventhub';
import groupQuery from '../graphql/group_boards.query.graphql';
import projectQuery from '../graphql/project_boards.query.graphql';
-import BoardForm from './board_form.vue';
-
const MIN_BOARDS_TO_VIEW_RECENT = 10;
export default {
@@ -109,8 +110,10 @@ export default {
};
},
computed: {
+ ...mapState(['boardType']),
+ ...mapGetters(['isGroupBoard']),
parentType() {
- return this.groupId ? 'group' : 'project';
+ return this.boardType;
},
loading() {
return this.loadingRecentBoards || Boolean(this.loadingBoards);
@@ -123,6 +126,9 @@ export default {
board() {
return this.currentBoard;
},
+ showCreate() {
+ return this.multipleIssueBoardsAvailable;
+ },
showDelete() {
return this.boards.length > 1;
},
@@ -158,6 +164,18 @@ export default {
cancel() {
this.showPage('');
},
+ boardUpdate(data) {
+ if (!data?.[this.parentType]) {
+ return [];
+ }
+ return data[this.parentType].boards.edges.map(({ node }) => ({
+ id: getIdFromGraphQLId(node.id),
+ name: node.name,
+ }));
+ },
+ boardQuery() {
+ return this.isGroupBoard ? groupQuery : projectQuery;
+ },
loadBoards(toggleDropdown = true) {
if (toggleDropdown && this.boards.length > 0) {
return;
@@ -167,21 +185,14 @@ export default {
variables() {
return { fullPath: this.fullPath };
},
- query() {
- return this.groupId ? groupQuery : projectQuery;
- },
+ query: this.boardQuery,
loadingKey: 'loadingBoards',
- update(data) {
- if (!data?.[this.parentType]) {
- return [];
- }
- return data[this.parentType].boards.edges.map(({ node }) => ({
- id: getIdFromGraphQLId(node.id),
- name: node.name,
- }));
- },
+ update: this.boardUpdate,
});
+ this.loadRecentBoards();
+ },
+ loadRecentBoards() {
this.loadingRecentBoards = true;
// Follow up to fetch recent boards using GraphQL
// https://gitlab.com/gitlab-org/gitlab/-/issues/300985
@@ -322,7 +333,7 @@ export default {
<gl-dropdown-divider />
<gl-dropdown-item
- v-if="multipleIssueBoardsAvailable"
+ v-if="showCreate"
v-gl-modal-directive="'board-config-modal'"
data-qa-selector="create_new_board_button"
@click.prevent="showPage('new')"
diff --git a/app/assets/javascripts/boards/components/boards_selector_deprecated.vue b/app/assets/javascripts/boards/components/boards_selector_deprecated.vue
index 33ad46a0d29..85c7b27336b 100644
--- a/app/assets/javascripts/boards/components/boards_selector_deprecated.vue
+++ b/app/assets/javascripts/boards/components/boards_selector_deprecated.vue
@@ -9,6 +9,7 @@ import {
GlModalDirective,
} from '@gitlab/ui';
import { throttle } from 'lodash';
+import { mapGetters, mapState } from 'vuex';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import httpStatusCodes from '~/lib/utils/http_status';
@@ -108,8 +109,10 @@ export default {
};
},
computed: {
+ ...mapState(['boardType']),
+ ...mapGetters(['isGroupBoard']),
parentType() {
- return this.groupId ? 'group' : 'project';
+ return this.boardType;
},
loading() {
return this.loadingRecentBoards || Boolean(this.loadingBoards);
@@ -167,7 +170,7 @@ export default {
return { fullPath: this.state.endpoints.fullPath };
},
query() {
- return this.groupId ? groupQuery : projectQuery;
+ return this.isGroupBoard ? groupQuery : projectQuery;
},
loadingKey: 'loadingBoards',
update(data) {
diff --git a/app/assets/javascripts/boards/components/config_toggle.vue b/app/assets/javascripts/boards/components/config_toggle.vue
new file mode 100644
index 00000000000..7ec99e51f5b
--- /dev/null
+++ b/app/assets/javascripts/boards/components/config_toggle.vue
@@ -0,0 +1,64 @@
+<script>
+import { GlButton, GlModalDirective, GlTooltipDirective } from '@gitlab/ui';
+import { formType } from '~/boards/constants';
+import eventHub from '~/boards/eventhub';
+import { s__, __ } from '~/locale';
+
+export default {
+ components: {
+ GlButton,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ GlModalDirective,
+ },
+ props: {
+ boardsStore: {
+ type: Object,
+ required: true,
+ },
+ canAdminList: {
+ type: Boolean,
+ required: true,
+ },
+ hasScope: {
+ type: Boolean,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ state: this.boardsStore.state,
+ };
+ },
+ computed: {
+ buttonText() {
+ return this.canAdminList ? s__('Boards|Edit board') : s__('Boards|View scope');
+ },
+ tooltipTitle() {
+ return this.hasScope ? __("This board's scope is reduced") : '';
+ },
+ },
+ methods: {
+ showPage() {
+ eventHub.$emit('showBoardModal', formType.edit);
+ return this.boardsStore.showPage(formType.edit);
+ },
+ },
+};
+</script>
+
+<template>
+ <div class="gl-ml-3 gl-display-flex gl-align-items-center">
+ <gl-button
+ v-gl-modal-directive="'board-config-modal'"
+ v-gl-tooltip
+ :title="tooltipTitle"
+ :class="{ 'dot-highlight': hasScope }"
+ data-qa-selector="boards_config_button"
+ @click.prevent="showPage"
+ >
+ {{ buttonText }}
+ </gl-button>
+ </div>
+</template>
diff --git a/app/assets/javascripts/boards/components/filtered_search.vue b/app/assets/javascripts/boards/components/filtered_search.vue
new file mode 100644
index 00000000000..8505ea39a6b
--- /dev/null
+++ b/app/assets/javascripts/boards/components/filtered_search.vue
@@ -0,0 +1,54 @@
+<script>
+import { mapActions } from 'vuex';
+import { historyPushState } from '~/lib/utils/common_utils';
+import { setUrlParams } from '~/lib/utils/url_utility';
+import { __ } from '~/locale';
+import FilteredSearch from '~/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue';
+
+export default {
+ i18n: {
+ search: __('Search'),
+ },
+ components: { FilteredSearch },
+ props: {
+ search: {
+ type: String,
+ required: false,
+ default: '',
+ },
+ },
+ computed: {
+ initialSearch() {
+ return [{ type: 'filtered-search-term', value: { data: this.search } }];
+ },
+ },
+ methods: {
+ ...mapActions(['performSearch']),
+ handleSearch(filters) {
+ let itemValue = '';
+ const [item] = filters;
+
+ if (filters.length === 0) {
+ itemValue = '';
+ } else {
+ itemValue = item?.value?.data;
+ }
+
+ historyPushState(setUrlParams({ search: itemValue }, window.location.href));
+
+ this.performSearch();
+ },
+ },
+};
+</script>
+
+<template>
+ <filtered-search
+ class="gl-w-full"
+ namespace=""
+ :tokens="[]"
+ :search-input-placeholder="$options.i18n.search"
+ :initial-filter-value="initialSearch"
+ @onFilter="handleSearch"
+ />
+</template>
diff --git a/app/assets/javascripts/boards/components/issue_card_inner.vue b/app/assets/javascripts/boards/components/issue_card_inner.vue
deleted file mode 100644
index e5ea30df767..00000000000
--- a/app/assets/javascripts/boards/components/issue_card_inner.vue
+++ /dev/null
@@ -1,262 +0,0 @@
-<script>
-import { GlLabel, GlTooltipDirective, GlIcon } from '@gitlab/ui';
-import { sortBy } from 'lodash';
-import { mapActions, mapState } from 'vuex';
-import issueCardInner from 'ee_else_ce/boards/mixins/issue_card_inner';
-import { isScopedLabel } from '~/lib/utils/common_utils';
-import { updateHistory } from '~/lib/utils/url_utility';
-import { sprintf, __, n__ } from '~/locale';
-import TooltipOnTruncate from '~/vue_shared/components/tooltip_on_truncate.vue';
-import UserAvatarLink from '../../vue_shared/components/user_avatar/user_avatar_link.vue';
-import { ListType } from '../constants';
-import eventHub from '../eventhub';
-import IssueDueDate from './issue_due_date.vue';
-import IssueTimeEstimate from './issue_time_estimate.vue';
-
-export default {
- components: {
- GlLabel,
- GlIcon,
- UserAvatarLink,
- TooltipOnTruncate,
- IssueDueDate,
- IssueTimeEstimate,
- IssueCardWeight: () => import('ee_component/boards/components/issue_card_weight.vue'),
- },
- directives: {
- GlTooltip: GlTooltipDirective,
- },
- mixins: [issueCardInner],
- inject: ['groupId', 'rootPath', 'scopedLabelsAvailable'],
- props: {
- issue: {
- type: Object,
- required: true,
- },
- list: {
- type: Object,
- required: false,
- default: () => ({}),
- },
- updateFilters: {
- type: Boolean,
- required: false,
- default: false,
- },
- },
- data() {
- return {
- limitBeforeCounter: 2,
- maxRender: 3,
- maxCounter: 99,
- };
- },
- computed: {
- ...mapState(['isShowingLabels']),
- cappedAssignees() {
- // e.g. maxRender is 4,
- // Render up to all 4 assignees if there are only 4 assigness
- // Otherwise render up to the limitBeforeCounter
- if (this.issue.assignees.length <= this.maxRender) {
- return this.issue.assignees.slice(0, this.maxRender);
- }
-
- return this.issue.assignees.slice(0, this.limitBeforeCounter);
- },
- numberOverLimit() {
- return this.issue.assignees.length - this.limitBeforeCounter;
- },
- assigneeCounterTooltip() {
- const { numberOverLimit, maxCounter } = this;
- const count = numberOverLimit > maxCounter ? maxCounter : numberOverLimit;
- return sprintf(__('%{count} more assignees'), { count });
- },
- assigneeCounterLabel() {
- if (this.numberOverLimit > this.maxCounter) {
- return `${this.maxCounter}+`;
- }
-
- return `+${this.numberOverLimit}`;
- },
- shouldRenderCounter() {
- if (this.issue.assignees.length <= this.maxRender) {
- return false;
- }
-
- return this.issue.assignees.length > this.numberOverLimit;
- },
- issueId() {
- if (this.issue.iid) {
- return `#${this.issue.iid}`;
- }
- return false;
- },
- showLabelFooter() {
- return this.isShowingLabels && this.issue.labels.find(this.showLabel);
- },
- issueReferencePath() {
- const { referencePath, groupId } = this.issue;
- return !groupId ? referencePath.split('#')[0] : null;
- },
- orderedLabels() {
- return sortBy(this.issue.labels.filter(this.isNonListLabel), 'title');
- },
- blockedLabel() {
- if (this.issue.blockedByCount) {
- return n__(`Blocked by %d issue`, `Blocked by %d issues`, this.issue.blockedByCount);
- }
- return __('Blocked issue');
- },
- },
- methods: {
- ...mapActions(['performSearch']),
- isIndexLessThanlimit(index) {
- return index < this.limitBeforeCounter;
- },
- assigneeUrl(assignee) {
- if (!assignee) return '';
- return `${this.rootPath}${assignee.username}`;
- },
- avatarUrlTitle(assignee) {
- return sprintf(__(`Avatar for %{assigneeName}`), { assigneeName: assignee.name });
- },
- avatarUrl(assignee) {
- return assignee.avatarUrl || assignee.avatar || gon.default_avatar_url;
- },
- showLabel(label) {
- if (!label.id) return false;
- return true;
- },
- isNonListLabel(label) {
- return (
- label.id &&
- !(
- (this.list.type || this.list.listType) === ListType.label &&
- this.list.title === label.title
- )
- );
- },
- filterByLabel(label) {
- if (!this.updateFilters) return;
- const filterPath = window.location.search ? `${window.location.search}&` : '?';
- const filter = `label_name[]=${encodeURIComponent(label.title)}`;
-
- if (!filterPath.includes(filter)) {
- updateHistory({
- url: `${filterPath}${filter}`,
- });
- this.performSearch();
- eventHub.$emit('updateTokens');
- }
- },
- showScopedLabel(label) {
- return this.scopedLabelsAvailable && isScopedLabel(label);
- },
- },
-};
-</script>
-<template>
- <div>
- <div class="gl-display-flex" dir="auto">
- <h4 class="board-card-title gl-mb-0 gl-mt-0">
- <gl-icon
- v-if="issue.blocked"
- v-gl-tooltip
- name="issue-block"
- :title="blockedLabel"
- class="issue-blocked-icon gl-mr-2"
- :aria-label="blockedLabel"
- data-testid="issue-blocked-icon"
- />
- <gl-icon
- v-if="issue.confidential"
- v-gl-tooltip
- name="eye-slash"
- :title="__('Confidential')"
- class="confidential-icon gl-mr-2"
- :aria-label="__('Confidential')"
- />
- <a
- :href="issue.path || issue.webUrl || ''"
- :title="issue.title"
- class="js-no-trigger"
- @mousemove.stop
- >{{ issue.title }}</a
- >
- </h4>
- </div>
- <div v-if="showLabelFooter" class="board-card-labels gl-mt-2 gl-display-flex gl-flex-wrap">
- <template v-for="label in orderedLabels">
- <gl-label
- :key="label.id"
- :background-color="label.color"
- :title="label.title"
- :description="label.description"
- size="sm"
- :scoped="showScopedLabel(label)"
- @click="filterByLabel(label)"
- />
- </template>
- </div>
- <div
- 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"
- >
- <span
- v-if="issue.referencePath"
- class="board-card-number gl-overflow-hidden gl-display-flex gl-mr-3 gl-mt-3"
- >
- <tooltip-on-truncate
- v-if="issueReferencePath"
- :title="issueReferencePath"
- placement="bottom"
- class="board-issue-path gl-text-truncate gl-font-weight-bold"
- >{{ issueReferencePath }}</tooltip-on-truncate
- >
- #{{ issue.iid }}
- </span>
- <span class="board-info-items gl-mt-3 gl-display-inline-block">
- <issue-due-date
- v-if="issue.dueDate"
- :date="issue.dueDate"
- :closed="issue.closed || Boolean(issue.closedAt)"
- />
- <issue-time-estimate v-if="issue.timeEstimate" :estimate="issue.timeEstimate" />
- <issue-card-weight
- v-if="validIssueWeight"
- :weight="issue.weight"
- @click="filterByWeight(issue.weight)"
- />
- </span>
- </div>
- <div class="board-card-assignee gl-display-flex">
- <user-avatar-link
- v-for="assignee in cappedAssignees"
- :key="assignee.id"
- :link-href="assigneeUrl(assignee)"
- :img-alt="avatarUrlTitle(assignee)"
- :img-src="avatarUrl(assignee)"
- :img-size="24"
- class="js-no-trigger"
- tooltip-placement="bottom"
- >
- <span class="js-assignee-tooltip">
- <span class="gl-font-weight-bold gl-display-block">{{ __('Assignee') }}</span>
- {{ assignee.name }}
- <span class="text-white-50">@{{ assignee.username }}</span>
- </span>
- </user-avatar-link>
- <span
- v-if="shouldRenderCounter"
- v-gl-tooltip
- :title="assigneeCounterTooltip"
- class="avatar-counter"
- data-placement="bottom"
- >{{ assigneeCounterLabel }}</span
- >
- </div>
- </div>
- </div>
-</template>
diff --git a/app/assets/javascripts/boards/components/issue_card_inner_deprecated.vue b/app/assets/javascripts/boards/components/issue_card_inner_deprecated.vue
index 069cc2cda22..2652fac1818 100644
--- a/app/assets/javascripts/boards/components/issue_card_inner_deprecated.vue
+++ b/app/assets/javascripts/boards/components/issue_card_inner_deprecated.vue
@@ -2,7 +2,7 @@
import { GlLabel, GlTooltipDirective, GlIcon } from '@gitlab/ui';
import { sortBy } from 'lodash';
import { mapState } from 'vuex';
-import issueCardInner from 'ee_else_ce/boards/mixins/issue_card_inner';
+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.vue';
@@ -24,7 +24,7 @@ export default {
directives: {
GlTooltip: GlTooltipDirective,
},
- mixins: [issueCardInner],
+ mixins: [boardCardInner],
inject: ['groupId', 'rootPath'],
props: {
issue: {
@@ -207,7 +207,7 @@ export default {
/>
<issue-time-estimate v-if="issue.timeEstimate" :estimate="issue.timeEstimate" />
<issue-card-weight
- v-if="validIssueWeight"
+ v-if="validIssueWeight(issue)"
:weight="issue.weight"
@click="filterByWeight(issue.weight)"
/>
diff --git a/app/assets/javascripts/boards/components/issue_due_date.vue b/app/assets/javascripts/boards/components/issue_due_date.vue
index 7e3f36c8a17..73ec008c2b6 100644
--- a/app/assets/javascripts/boards/components/issue_due_date.vue
+++ b/app/assets/javascripts/boards/components/issue_due_date.vue
@@ -86,7 +86,11 @@ export default {
<template>
<span>
<span ref="issueDueDate" :class="cssClass" class="board-card-info card-number">
- <gl-icon :class="{ 'text-danger': isPastDue }" class="board-card-info-icon" name="calendar" />
+ <gl-icon
+ :class="{ 'text-danger': isPastDue }"
+ class="board-card-info-icon gl-mr-2"
+ name="calendar"
+ />
<time :class="{ 'text-danger': isPastDue }" datetime="date" class="board-card-info-text">{{
body
}}</time>
diff --git a/app/assets/javascripts/boards/components/issue_time_estimate.vue b/app/assets/javascripts/boards/components/issue_time_estimate.vue
index 42d187b9b40..1ab7deebfaf 100644
--- a/app/assets/javascripts/boards/components/issue_time_estimate.vue
+++ b/app/assets/javascripts/boards/components/issue_time_estimate.vue
@@ -37,7 +37,7 @@ export default {
<template>
<span>
<span ref="issueTimeEstimate" class="board-card-info card-number">
- <gl-icon name="hourglass" class="board-card-info-icon" />
+ <gl-icon name="hourglass" class="board-card-info-icon gl-mr-2" />
<time class="board-card-info-text">{{ timeEstimate }}</time>
</span>
<gl-tooltip
diff --git a/app/assets/javascripts/boards/components/modal/list.vue b/app/assets/javascripts/boards/components/modal/list.vue
index bf69f8140d5..e66cae0ce18 100644
--- a/app/assets/javascripts/boards/components/modal/list.vue
+++ b/app/assets/javascripts/boards/components/modal/list.vue
@@ -2,11 +2,11 @@
import { GlIcon } from '@gitlab/ui';
import { GlBreakpointInstance as bp } from '@gitlab/ui/dist/utils';
import ModalStore from '../../stores/modal_store';
-import IssueCardInner from '../issue_card_inner.vue';
+import BoardCardInner from '../board_card_inner.vue';
export default {
components: {
- IssueCardInner,
+ BoardCardInner,
GlIcon,
},
props: {
@@ -126,7 +126,7 @@ export default {
class="board-card position-relative p-3 rounded"
@click="toggleIssue($event, issue)"
>
- <issue-card-inner :issue="issue" />
+ <board-card-inner :item="issue" />
<gl-icon
v-if="issue.selected"
:aria-label="'Issue #' + issue.id + ' selected'"
diff --git a/app/assets/javascripts/boards/components/sidebar/remove_issue.vue b/app/assets/javascripts/boards/components/sidebar/remove_issue.vue
deleted file mode 100644
index 8d65f3240c8..00000000000
--- a/app/assets/javascripts/boards/components/sidebar/remove_issue.vue
+++ /dev/null
@@ -1,88 +0,0 @@
-<script>
-import { GlButton } from '@gitlab/ui';
-import axios from '~/lib/utils/axios_utils';
-import { deprecatedCreateFlash as Flash } from '../../../flash';
-import { __ } from '../../../locale';
-import boardsStore from '../../stores/boards_store';
-
-export default {
- components: {
- GlButton,
- },
- props: {
- issue: {
- type: Object,
- required: true,
- },
- list: {
- type: Object,
- required: true,
- },
- },
- computed: {
- updateUrl() {
- return this.issue.path;
- },
- },
- methods: {
- removeIssue() {
- const { issue } = this;
- const lists = issue.getLists();
- const req = this.buildPatchRequest(issue, lists);
-
- const data = {
- issue: this.seedPatchRequest(issue, req),
- };
-
- if (data.issue.label_ids.length === 0) {
- data.issue.label_ids = [''];
- }
-
- // Post the remove data
- axios.patch(this.updateUrl, data).catch(() => {
- Flash(__('Failed to remove issue from board, please try again.'));
-
- lists.forEach((list) => {
- list.addIssue(issue);
- });
- });
-
- // Remove from the frontend store
- lists.forEach((list) => {
- list.removeIssue(issue);
- });
-
- boardsStore.clearDetailIssue();
- },
- /**
- * Build the default patch request.
- */
- buildPatchRequest(issue, lists) {
- const listLabelIds = lists.map((list) => list.label.id);
-
- const labelIds = issue.labels
- .map((label) => label.id)
- .filter((id) => !listLabelIds.includes(id));
-
- return {
- label_ids: labelIds,
- };
- },
- /**
- * Seed the given patch request.
- *
- * (This is overridden in EE)
- */
- seedPatchRequest(issue, req) {
- return req;
- },
- },
-};
-</script>
-<template>
- <div class="block list">
- <gl-button variant="default" category="secondary" block="block" @click="removeIssue">
- {{ __('Remove from board') }}
- </gl-button>
- </div>
-</template>
diff --git a/app/assets/javascripts/boards/config_toggle.js b/app/assets/javascripts/boards/config_toggle.js
index 2d1ec238274..7f327c5764d 100644
--- a/app/assets/javascripts/boards/config_toggle.js
+++ b/app/assets/javascripts/boards/config_toggle.js
@@ -1 +1,24 @@
-export default () => {};
+import Vue from 'vue';
+import { parseBoolean } from '~/lib/utils/common_utils';
+import ConfigToggle from './components/config_toggle.vue';
+
+export default (boardsStore) => {
+ const el = document.querySelector('.js-board-config');
+
+ if (!el) {
+ return;
+ }
+
+ gl.boardConfigToggle = new Vue({
+ el,
+ render(h) {
+ return h(ConfigToggle, {
+ props: {
+ boardsStore,
+ canAdminList: parseBoolean(el.dataset.canAdminList),
+ hasScope: parseBoolean(el.dataset.hasScope),
+ },
+ });
+ },
+ });
+};
diff --git a/app/assets/javascripts/boards/constants.js b/app/assets/javascripts/boards/constants.js
index 3ab89b2c9da..65ebfe7be6c 100644
--- a/app/assets/javascripts/boards/constants.js
+++ b/app/assets/javascripts/boards/constants.js
@@ -1,5 +1,10 @@
import { __ } from '~/locale';
+export const issuableTypes = {
+ issue: 'issue',
+ epic: 'epic',
+};
+
export const BoardType = {
project: 'project',
group: 'group',
diff --git a/app/assets/javascripts/boards/filtered_search.js b/app/assets/javascripts/boards/filtered_search.js
new file mode 100644
index 00000000000..182a2cf3724
--- /dev/null
+++ b/app/assets/javascripts/boards/filtered_search.js
@@ -0,0 +1,25 @@
+import Vue from 'vue';
+import store from '~/boards/stores';
+import { queryToObject } from '~/lib/utils/url_utility';
+import FilteredSearch from './components/filtered_search.vue';
+
+export default () => {
+ const queryParams = queryToObject(window.location.search);
+ const el = document.getElementById('js-board-filtered-search');
+
+ /*
+ When https://github.com/vuejs/vue-apollo/pull/1153 is merged and deployed
+ we can remove apolloProvider option from here. Currently without it its causing
+ an error
+ */
+
+ return new Vue({
+ el,
+ store,
+ apolloProvider: {},
+ render: (createElement) =>
+ createElement(FilteredSearch, {
+ props: { search: queryParams.search },
+ }),
+ });
+};
diff --git a/app/assets/javascripts/boards/graphql/board_labels.query.graphql b/app/assets/javascripts/boards/graphql/board_labels.query.graphql
index 42a94419a97..b19a24e8808 100644
--- a/app/assets/javascripts/boards/graphql/board_labels.query.graphql
+++ b/app/assets/javascripts/boards/graphql/board_labels.query.graphql
@@ -7,14 +7,14 @@ query BoardLabels(
$isProject: Boolean = false
) {
group(fullPath: $fullPath) @include(if: $isGroup) {
- labels(searchTerm: $searchTerm) {
+ labels(searchTerm: $searchTerm, onlyGroupLabels: true, includeAncestorGroups: true) {
nodes {
...Label
}
}
}
project(fullPath: $fullPath) @include(if: $isProject) {
- labels(searchTerm: $searchTerm) {
+ labels(searchTerm: $searchTerm, includeAncestorGroups: true) {
nodes {
...Label
}
diff --git a/app/assets/javascripts/boards/graphql/board_list_create.mutation.graphql b/app/assets/javascripts/boards/graphql/board_list_create.mutation.graphql
index f78a21baa7f..3eb23f62940 100644
--- a/app/assets/javascripts/boards/graphql/board_list_create.mutation.graphql
+++ b/app/assets/javascripts/boards/graphql/board_list_create.mutation.graphql
@@ -1,21 +1,7 @@
-#import "ee_else_ce/boards/graphql/board_list.fragment.graphql"
+#import "./board_list.fragment.graphql"
-mutation CreateBoardList(
- $boardId: BoardID!
- $backlog: Boolean
- $labelId: LabelID
- $milestoneId: MilestoneID
- $assigneeId: UserID
-) {
- boardListCreate(
- input: {
- boardId: $boardId
- backlog: $backlog
- labelId: $labelId
- milestoneId: $milestoneId
- assigneeId: $assigneeId
- }
- ) {
+mutation CreateBoardList($boardId: BoardID!, $backlog: Boolean, $labelId: LabelID) {
+ boardListCreate(input: { boardId: $boardId, backlog: $backlog, labelId: $labelId }) {
list {
...BoardListFragment
}
diff --git a/app/assets/javascripts/boards/graphql/users_search.query.graphql b/app/assets/javascripts/boards/graphql/users_search.query.graphql
deleted file mode 100644
index ca016495d79..00000000000
--- a/app/assets/javascripts/boards/graphql/users_search.query.graphql
+++ /dev/null
@@ -1,11 +0,0 @@
-query usersSearch($search: String!) {
- users(search: $search) {
- nodes {
- username
- name
- webUrl
- avatarUrl
- id
- }
- }
-}
diff --git a/app/assets/javascripts/boards/index.js b/app/assets/javascripts/boards/index.js
index 859295318ed..0627dbc73d2 100644
--- a/app/assets/javascripts/boards/index.js
+++ b/app/assets/javascripts/boards/index.js
@@ -6,7 +6,6 @@ import 'ee_else_ce/boards/models/issue';
import 'ee_else_ce/boards/models/list';
import BoardSidebar from 'ee_else_ce/boards/components/board_sidebar';
import initNewListDropdown from 'ee_else_ce/boards/components/new_list_dropdown';
-import boardConfigToggle from 'ee_else_ce/boards/config_toggle';
import {
setWeightFetchingState,
setEpicFetchingState,
@@ -24,6 +23,7 @@ import '~/boards/models/milestone';
import '~/boards/models/project';
import '~/boards/filters/due_date_filters';
import BoardAddIssuesModal from '~/boards/components/modal/index.vue';
+import { issuableTypes } from '~/boards/constants';
import eventHub from '~/boards/eventhub';
import FilteredSearchBoards from '~/boards/filtered_search_boards';
import modalMixin from '~/boards/mixins/modal_mixins';
@@ -40,6 +40,7 @@ import {
} from '~/lib/utils/common_utils';
import { __ } from '~/locale';
import sidebarEventHub from '~/sidebar/event_hub';
+import boardConfigToggle from './config_toggle';
import mountMultipleBoardsSwitcher from './mount_multiple_boards_switcher';
Vue.use(VueApollo);
@@ -52,7 +53,6 @@ let issueBoardsApp;
export default () => {
const $boardApp = document.getElementById('board-app');
-
// check for browser back and trigger a hard reload to circumvent browser caching.
window.addEventListener('pageshow', (event) => {
const isNavTypeBackForward =
@@ -72,6 +72,14 @@ export default () => {
boardsStore.setTimeTrackingLimitToHours($boardApp.dataset.timeTrackingLimitToHours);
}
+ if (gon?.features?.boardsFilteredSearch) {
+ import('~/boards/filtered_search')
+ .then(({ default: initFilteredSearch }) => {
+ initFilteredSearch(apolloProvider);
+ })
+ .catch(() => {});
+ }
+
// eslint-disable-next-line @gitlab/no-runtime-template-compiler
issueBoardsApp = new Vue({
el: $boardApp,
@@ -124,6 +132,7 @@ export default () => {
fullPath: $boardApp.dataset.fullPath,
boardType: this.parent,
disabled: this.disabled,
+ issuableType: issuableTypes.issue,
boardConfig: {
milestoneId: parseInt($boardApp.dataset.boardMilestoneId, 10),
milestoneTitle: $boardApp.dataset.boardMilestoneTitle || '',
@@ -162,8 +171,15 @@ export default () => {
eventHub.$off('initialBoardLoad', this.initialBoardLoad);
},
mounted() {
- this.filterManager = new FilteredSearchBoards(boardsStore.filter, true, boardsStore.cantEdit);
- this.filterManager.setup();
+ if (!gon.features?.boardsFilteredSearch) {
+ this.filterManager = new FilteredSearchBoards(
+ boardsStore.filter,
+ true,
+ boardsStore.cantEdit,
+ );
+
+ this.filterManager.setup();
+ }
this.performSearch();
@@ -349,7 +365,7 @@ export default () => {
toggleFocusMode(ModalStore, boardsStore);
toggleLabels();
- if (gon.features?.swimlanes) {
+ if (gon.licensed_features?.swimlanes) {
toggleEpicsSwimlanes();
}
diff --git a/app/assets/javascripts/boards/mixins/board_card_inner.js b/app/assets/javascripts/boards/mixins/board_card_inner.js
new file mode 100644
index 00000000000..a6f278f3bc9
--- /dev/null
+++ b/app/assets/javascripts/boards/mixins/board_card_inner.js
@@ -0,0 +1,8 @@
+export default {
+ methods: {
+ validIssueWeight() {
+ return false;
+ },
+ filterByWeight() {},
+ },
+};
diff --git a/app/assets/javascripts/boards/mixins/issue_card_inner.js b/app/assets/javascripts/boards/mixins/issue_card_inner.js
deleted file mode 100644
index 04e971b756d..00000000000
--- a/app/assets/javascripts/boards/mixins/issue_card_inner.js
+++ /dev/null
@@ -1,10 +0,0 @@
-export default {
- computed: {
- validIssueWeight() {
- return false;
- },
- },
- methods: {
- filterByWeight() {},
- },
-};
diff --git a/app/assets/javascripts/boards/mount_multiple_boards_switcher.js b/app/assets/javascripts/boards/mount_multiple_boards_switcher.js
index fa58af24ba2..7f655091cd0 100644
--- a/app/assets/javascripts/boards/mount_multiple_boards_switcher.js
+++ b/app/assets/javascripts/boards/mount_multiple_boards_switcher.js
@@ -1,7 +1,7 @@
import Vue from 'vue';
import VueApollo from 'vue-apollo';
import { mapGetters } from 'vuex';
-import BoardsSelector from '~/boards/components/boards_selector.vue';
+import BoardsSelector from 'ee_else_ce/boards/components/boards_selector.vue';
import BoardsSelectorDeprecated from '~/boards/components/boards_selector_deprecated.vue';
import store from '~/boards/stores';
import createDefaultClient from '~/lib/graphql';
@@ -48,10 +48,10 @@ export default (params = {}) => {
return { boardsSelectorProps };
},
computed: {
- ...mapGetters(['shouldUseGraphQL']),
+ ...mapGetters(['shouldUseGraphQL', 'isEpicBoard']),
},
render(createElement) {
- if (this.shouldUseGraphQL) {
+ if (this.shouldUseGraphQL || this.isEpicBoard) {
return createElement(BoardsSelector, {
props: this.boardsSelectorProps,
});
diff --git a/app/assets/javascripts/boards/stores/actions.js b/app/assets/javascripts/boards/stores/actions.js
index a7cf1e9e647..03e597b4e7b 100644
--- a/app/assets/javascripts/boards/stores/actions.js
+++ b/app/assets/javascripts/boards/stores/actions.js
@@ -1,6 +1,13 @@
import { pick } from 'lodash';
+import createBoardListMutation from 'ee_else_ce/boards/graphql/board_list_create.mutation.graphql';
import boardListsQuery from 'ee_else_ce/boards/graphql/board_lists.query.graphql';
-import { BoardType, ListType, inactiveId, flashAnimationDuration } from '~/boards/constants';
+import {
+ BoardType,
+ ListType,
+ inactiveId,
+ flashAnimationDuration,
+ ISSUABLE,
+} from '~/boards/constants';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import createGqClient, { fetchPolicies } from '~/lib/graphql';
import { convertObjectPropsToCamelCase, urlParamsToObject } from '~/lib/utils/common_utils';
@@ -15,7 +22,6 @@ import {
transformNotFilters,
} from '../boards_util';
import boardLabelsQuery from '../graphql/board_labels.query.graphql';
-import createBoardListMutation from '../graphql/board_list_create.mutation.graphql';
import destroyBoardListMutation from '../graphql/board_list_destroy.mutation.graphql';
import updateBoardListMutation from '../graphql/board_list_update.mutation.graphql';
import groupProjectsQuery from '../graphql/group_projects.query.graphql';
@@ -79,7 +85,11 @@ export default {
}
},
- fetchLists: ({ commit, state, dispatch }) => {
+ fetchLists: ({ dispatch }) => {
+ dispatch('fetchIssueLists');
+ },
+
+ fetchIssueLists: ({ commit, state, dispatch }) => {
const { boardType, filterParams, fullPath, boardId } = state;
const variables = {
@@ -118,7 +128,11 @@ export default {
}, flashAnimationDuration);
},
- createList: (
+ createList: ({ dispatch }, { backlog, labelId, milestoneId, assigneeId }) => {
+ dispatch('createIssueList', { backlog, labelId, milestoneId, assigneeId });
+ },
+
+ createIssueList: (
{ state, commit, dispatch, getters },
{ backlog, labelId, milestoneId, assigneeId },
) => {
@@ -143,22 +157,25 @@ export default {
},
})
.then(({ data }) => {
- if (data?.boardListCreate?.errors.length) {
- commit(types.CREATE_LIST_FAILURE);
+ if (data.boardListCreate?.errors.length) {
+ commit(types.CREATE_LIST_FAILURE, data.boardListCreate.errors[0]);
} else {
const list = data.boardListCreate?.list;
dispatch('addList', list);
dispatch('highlightList', list.id);
}
})
- .catch(() => commit(types.CREATE_LIST_FAILURE));
+ .catch((e) => {
+ commit(types.CREATE_LIST_FAILURE);
+ throw e;
+ });
},
addList: ({ commit }, list) => {
commit(types.RECEIVE_ADD_LIST_SUCCESS, updateListPosition(list));
},
- fetchLabels: ({ state, commit }, searchTerm) => {
+ fetchLabels: ({ state, commit, getters }, searchTerm) => {
const { fullPath, boardType } = state;
const variables = {
@@ -168,15 +185,29 @@ export default {
isProject: boardType === BoardType.project,
};
+ commit(types.RECEIVE_LABELS_REQUEST);
+
return gqlClient
.query({
query: boardLabelsQuery,
variables,
})
.then(({ data }) => {
- const labels = data[boardType]?.labels.nodes;
+ let labels = data[boardType]?.labels.nodes;
+
+ if (!getters.shouldUseGraphQL && !getters.isEpicBoard) {
+ labels = labels.map((label) => ({
+ ...label,
+ id: getIdFromGraphQLId(label.id),
+ }));
+ }
+
commit(types.RECEIVE_LABELS_SUCCESS, labels);
return labels;
+ })
+ .catch((e) => {
+ commit(types.RECEIVE_LABELS_FAILURE);
+ throw e;
});
},
@@ -225,6 +256,10 @@ export default {
});
},
+ toggleListCollapsed: ({ commit }, { listId, collapsed }) => {
+ commit(types.TOGGLE_LIST_COLLAPSED, { listId, collapsed });
+ },
+
removeList: ({ state, commit }, listId) => {
const listsBackup = { ...state.boardLists };
@@ -253,8 +288,8 @@ export default {
});
},
- fetchIssuesForList: ({ state, commit }, { listId, fetchNext = false }) => {
- commit(types.REQUEST_ISSUES_FOR_LIST, { listId, fetchNext });
+ fetchItemsForList: ({ state, commit }, { listId, fetchNext = false }) => {
+ commit(types.REQUEST_ITEMS_FOR_LIST, { listId, fetchNext });
const { fullPath, boardId, boardType, filterParams } = state;
@@ -279,28 +314,32 @@ export default {
})
.then(({ data }) => {
const { lists } = data[boardType]?.board;
- const listIssues = formatListIssues(lists);
+ const listItems = formatListIssues(lists);
const listPageInfo = formatListsPageInfo(lists);
- commit(types.RECEIVE_ISSUES_FOR_LIST_SUCCESS, { listIssues, listPageInfo, listId });
+ commit(types.RECEIVE_ITEMS_FOR_LIST_SUCCESS, { listItems, listPageInfo, listId });
})
- .catch(() => commit(types.RECEIVE_ISSUES_FOR_LIST_FAILURE, listId));
+ .catch(() => commit(types.RECEIVE_ITEMS_FOR_LIST_FAILURE, listId));
},
resetIssues: ({ commit }) => {
commit(types.RESET_ISSUES);
},
+ moveItem: ({ dispatch }) => {
+ dispatch('moveIssue');
+ },
+
moveIssue: (
{ state, commit },
- { issueId, issueIid, issuePath, fromListId, toListId, moveBeforeId, moveAfterId },
+ { itemId, itemIid, itemPath, fromListId, toListId, moveBeforeId, moveAfterId },
) => {
- const originalIssue = state.issues[issueId];
- const fromList = state.issuesByListId[fromListId];
- const originalIndex = fromList.indexOf(Number(issueId));
+ const originalIssue = state.boardItems[itemId];
+ const fromList = state.boardItemsByListId[fromListId];
+ const originalIndex = fromList.indexOf(Number(itemId));
commit(types.MOVE_ISSUE, { originalIssue, fromListId, toListId, moveBeforeId, moveAfterId });
const { boardId } = state;
- const [fullProjectPath] = issuePath.split(/[#]/);
+ const [fullProjectPath] = itemPath.split(/[#]/);
gqlClient
.mutate({
@@ -308,7 +347,7 @@ export default {
variables: {
projectPath: fullProjectPath,
boardId: fullBoardId(boardId),
- iid: issueIid,
+ iid: itemIid,
fromListId: getIdFromGraphQLId(fromListId),
toListId: getIdFromGraphQLId(toListId),
moveBeforeId,
@@ -317,7 +356,7 @@ export default {
})
.then(({ data }) => {
if (data?.issueMoveList?.errors.length) {
- commit(types.MOVE_ISSUE_FAILURE, { originalIssue, fromListId, toListId, originalIndex });
+ throw new Error();
} else {
const issue = data.issueMoveList?.issue;
commit(types.MOVE_ISSUE_SUCCESS, { issue });
@@ -532,10 +571,17 @@ export default {
commit(types.SET_SELECTED_PROJECT, project);
},
- toggleBoardItemMultiSelection: ({ commit, state }, boardItem) => {
+ toggleBoardItemMultiSelection: ({ commit, state, dispatch, getters }, boardItem) => {
const { selectedBoardItems } = state;
const index = selectedBoardItems.indexOf(boardItem);
+ // If user already selected an item (activeIssue) without using mult-select,
+ // include that item in the selection and unset state.ActiveId to hide the sidebar.
+ if (getters.activeIssue) {
+ commit(types.ADD_BOARD_ITEM_TO_SELECTION, getters.activeIssue);
+ dispatch('unsetActiveId');
+ }
+
if (index === -1) {
commit(types.ADD_BOARD_ITEM_TO_SELECTION, boardItem);
} else {
@@ -547,6 +593,20 @@ export default {
commit(types.SET_ADD_COLUMN_FORM_VISIBLE, visible);
},
+ resetBoardItemMultiSelection: ({ commit }) => {
+ commit(types.RESET_BOARD_ITEM_SELECTION);
+ },
+
+ toggleBoardItem: ({ state, dispatch }, { boardItem, sidebarType = ISSUABLE }) => {
+ dispatch('resetBoardItemMultiSelection');
+
+ if (boardItem.id === state.activeId) {
+ dispatch('unsetActiveId');
+ } else {
+ dispatch('setActiveId', { id: boardItem.id, sidebarType });
+ }
+ },
+
fetchBacklog: () => {
notImplemented();
},
diff --git a/app/assets/javascripts/boards/stores/getters.js b/app/assets/javascripts/boards/stores/getters.js
index cab97088bc6..c96f92106cc 100644
--- a/app/assets/javascripts/boards/stores/getters.js
+++ b/app/assets/javascripts/boards/stores/getters.js
@@ -1,20 +1,22 @@
import { find } from 'lodash';
-import { inactiveId } from '../constants';
+import { BoardType, inactiveId } from '../constants';
export default {
+ isGroupBoard: (state) => state.boardType === BoardType.group,
+ isProjectBoard: (state) => state.boardType === BoardType.project,
isSidebarOpen: (state) => state.activeId !== inactiveId,
isSwimlanesOn: () => false,
- getIssueById: (state) => (id) => {
- return state.issues[id] || {};
+ getBoardItemById: (state) => (id) => {
+ return state.boardItems[id] || {};
},
- getIssuesByList: (state, getters) => (listId) => {
- const listIssueIds = state.issuesByListId[listId] || [];
- return listIssueIds.map((id) => getters.getIssueById(id));
+ getBoardItemsByList: (state, getters) => (listId) => {
+ const listItemsIds = state.boardItemsByListId[listId] || [];
+ return listItemsIds.map((id) => getters.getBoardItemById(id));
},
activeIssue: (state) => {
- return state.issues[state.activeId] || {};
+ return state.boardItems[state.activeId] || {};
},
groupPathForActiveIssue: (_, getters) => {
@@ -38,6 +40,10 @@ export default {
return find(state.boardLists, (l) => l.title === title);
},
+ isEpicBoard: () => {
+ return false;
+ },
+
shouldUseGraphQL: () => {
return gon?.features?.graphqlBoardLists;
},
diff --git a/app/assets/javascripts/boards/stores/mutation_types.js b/app/assets/javascripts/boards/stores/mutation_types.js
index a89e961ae2d..e7c034fb087 100644
--- a/app/assets/javascripts/boards/stores/mutation_types.js
+++ b/app/assets/javascripts/boards/stores/mutation_types.js
@@ -2,7 +2,9 @@ export const SET_INITIAL_BOARD_DATA = 'SET_INITIAL_BOARD_DATA';
export const SET_FILTERS = 'SET_FILTERS';
export const CREATE_LIST_SUCCESS = 'CREATE_LIST_SUCCESS';
export const CREATE_LIST_FAILURE = 'CREATE_LIST_FAILURE';
+export const RECEIVE_LABELS_REQUEST = 'RECEIVE_LABELS_REQUEST';
export const RECEIVE_LABELS_SUCCESS = 'RECEIVE_LABELS_SUCCESS';
+export const RECEIVE_LABELS_FAILURE = 'RECEIVE_LABELS_FAILURE';
export const GENERATE_DEFAULT_LISTS_FAILURE = 'GENERATE_DEFAULT_LISTS_FAILURE';
export const RECEIVE_BOARD_LISTS_SUCCESS = 'RECEIVE_BOARD_LISTS_SUCCESS';
export const RECEIVE_BOARD_LISTS_FAILURE = 'RECEIVE_BOARD_LISTS_FAILURE';
@@ -12,11 +14,12 @@ export const RECEIVE_ADD_LIST_SUCCESS = 'RECEIVE_ADD_LIST_SUCCESS';
export const RECEIVE_ADD_LIST_ERROR = 'RECEIVE_ADD_LIST_ERROR';
export const MOVE_LIST = 'MOVE_LIST';
export const UPDATE_LIST_FAILURE = 'UPDATE_LIST_FAILURE';
+export const TOGGLE_LIST_COLLAPSED = 'TOGGLE_LIST_COLLAPSED';
export const REMOVE_LIST = 'REMOVE_LIST';
export const REMOVE_LIST_FAILURE = 'REMOVE_LIST_FAILURE';
-export const REQUEST_ISSUES_FOR_LIST = 'REQUEST_ISSUES_FOR_LIST';
-export const RECEIVE_ISSUES_FOR_LIST_FAILURE = 'RECEIVE_ISSUES_FOR_LIST_FAILURE';
-export const RECEIVE_ISSUES_FOR_LIST_SUCCESS = 'RECEIVE_ISSUES_FOR_LIST_SUCCESS';
+export const REQUEST_ITEMS_FOR_LIST = 'REQUEST_ITEMS_FOR_LIST';
+export const RECEIVE_ITEMS_FOR_LIST_FAILURE = 'RECEIVE_ITEMS_FOR_LIST_FAILURE';
+export const RECEIVE_ITEMS_FOR_LIST_SUCCESS = 'RECEIVE_ITEMS_FOR_LIST_SUCCESS';
export const CREATE_ISSUE_FAILURE = 'CREATE_ISSUE_FAILURE';
export const REQUEST_ADD_ISSUE = 'REQUEST_ADD_ISSUE';
export const RECEIVE_ADD_ISSUE_SUCCESS = 'RECEIVE_ADD_ISSUE_SUCCESS';
@@ -45,3 +48,4 @@ export const REMOVE_BOARD_ITEM_FROM_SELECTION = 'REMOVE_BOARD_ITEM_FROM_SELECTIO
export const SET_ADD_COLUMN_FORM_VISIBLE = 'SET_ADD_COLUMN_FORM_VISIBLE';
export const ADD_LIST_TO_HIGHLIGHTED_LISTS = 'ADD_LIST_TO_HIGHLIGHTED_LISTS';
export const REMOVE_LIST_FROM_HIGHLIGHTED_LISTS = 'REMOVE_LIST_FROM_HIGHLIGHTED_LISTS';
+export const RESET_BOARD_ITEM_SELECTION = 'RESET_BOARD_ITEM_SELECTION';
diff --git a/app/assets/javascripts/boards/stores/mutations.js b/app/assets/javascripts/boards/stores/mutations.js
index 79c98c3d90c..75b60366b6a 100644
--- a/app/assets/javascripts/boards/stores/mutations.js
+++ b/app/assets/javascripts/boards/stores/mutations.js
@@ -2,7 +2,8 @@ import { pull, union } from 'lodash';
import Vue from 'vue';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import { s__ } from '~/locale';
-import { formatIssue, moveIssueListHelper } from '../boards_util';
+import { formatIssue, moveItemListHelper } from '../boards_util';
+import { issuableTypes } from '../constants';
import * as mutationTypes from './mutation_types';
const notImplemented = () => {
@@ -10,34 +11,42 @@ const notImplemented = () => {
throw new Error('Not implemented!');
};
-export const removeIssueFromList = ({ state, listId, issueId }) => {
- Vue.set(state.issuesByListId, listId, pull(state.issuesByListId[listId], issueId));
+const updateListItemsCount = ({ state, listId, value }) => {
const list = state.boardLists[listId];
- Vue.set(state.boardLists, listId, { ...list, issuesCount: list.issuesCount - 1 });
+ if (state.issuableType === issuableTypes.epic) {
+ Vue.set(state.boardLists, listId, { ...list, epicsCount: list.epicsCount + value });
+ } else {
+ Vue.set(state.boardLists, listId, { ...list, issuesCount: list.issuesCount + value });
+ }
+};
+
+export const removeItemFromList = ({ state, listId, itemId }) => {
+ Vue.set(state.boardItemsByListId, listId, pull(state.boardItemsByListId[listId], itemId));
+ updateListItemsCount({ state, listId, value: -1 });
};
-export const addIssueToList = ({ state, listId, issueId, moveBeforeId, moveAfterId, atIndex }) => {
- const listIssues = state.issuesByListId[listId];
+export const addItemToList = ({ state, listId, itemId, moveBeforeId, moveAfterId, atIndex }) => {
+ const listIssues = state.boardItemsByListId[listId];
let newIndex = atIndex || 0;
if (moveBeforeId) {
newIndex = listIssues.indexOf(moveBeforeId) + 1;
} else if (moveAfterId) {
newIndex = listIssues.indexOf(moveAfterId);
}
- listIssues.splice(newIndex, 0, issueId);
- Vue.set(state.issuesByListId, listId, listIssues);
- const list = state.boardLists[listId];
- Vue.set(state.boardLists, listId, { ...list, issuesCount: list.issuesCount + 1 });
+ listIssues.splice(newIndex, 0, itemId);
+ Vue.set(state.boardItemsByListId, listId, listIssues);
+ updateListItemsCount({ state, listId, value: 1 });
};
export default {
[mutationTypes.SET_INITIAL_BOARD_DATA](state, data) {
- const { boardType, disabled, boardId, fullPath, boardConfig } = data;
+ const { boardType, disabled, boardId, fullPath, boardConfig, issuableType } = data;
state.boardId = boardId;
state.fullPath = fullPath;
state.boardType = boardType;
state.disabled = disabled;
state.boardConfig = boardConfig;
+ state.issuableType = issuableType;
},
[mutationTypes.RECEIVE_BOARD_LISTS_SUCCESS]: (state, lists) => {
@@ -59,12 +68,25 @@ export default {
state.filterParams = filterParams;
},
- [mutationTypes.CREATE_LIST_FAILURE]: (state) => {
- state.error = s__('Boards|An error occurred while creating the list. Please try again.');
+ [mutationTypes.CREATE_LIST_FAILURE]: (
+ state,
+ error = s__('Boards|An error occurred while creating the list. Please try again.'),
+ ) => {
+ state.error = error;
+ },
+
+ [mutationTypes.RECEIVE_LABELS_REQUEST]: (state) => {
+ state.labelsLoading = true;
},
[mutationTypes.RECEIVE_LABELS_SUCCESS]: (state, labels) => {
state.labels = labels;
+ state.labelsLoading = false;
+ },
+
+ [mutationTypes.RECEIVE_LABELS_FAILURE]: (state) => {
+ state.error = s__('Boards|An error occurred while fetching labels. Please reload the page.');
+ state.labelsLoading = false;
},
[mutationTypes.GENERATE_DEFAULT_LISTS_FAILURE]: (state) => {
@@ -94,6 +116,10 @@ export default {
Vue.set(state, 'boardLists', backupList);
},
+ [mutationTypes.TOGGLE_LIST_COLLAPSED]: (state, { listId, collapsed }) => {
+ Vue.set(state.boardLists[listId], 'collapsed', collapsed);
+ },
+
[mutationTypes.REMOVE_LIST]: (state, listId) => {
Vue.delete(state.boardLists, listId);
},
@@ -103,26 +129,23 @@ export default {
state.boardLists = listsBackup;
},
- [mutationTypes.REQUEST_ISSUES_FOR_LIST]: (state, { listId, fetchNext }) => {
+ [mutationTypes.REQUEST_ITEMS_FOR_LIST]: (state, { listId, fetchNext }) => {
Vue.set(state.listsFlags, listId, { [fetchNext ? 'isLoadingMore' : 'isLoading']: true });
},
- [mutationTypes.RECEIVE_ISSUES_FOR_LIST_SUCCESS]: (
- state,
- { listIssues, listPageInfo, listId },
- ) => {
- const { listData, issues } = listIssues;
- Vue.set(state, 'issues', { ...state.issues, ...issues });
+ [mutationTypes.RECEIVE_ITEMS_FOR_LIST_SUCCESS]: (state, { listItems, listPageInfo, listId }) => {
+ const { listData, boardItems } = listItems;
+ Vue.set(state, 'boardItems', { ...state.boardItems, ...boardItems });
Vue.set(
- state.issuesByListId,
+ state.boardItemsByListId,
listId,
- union(state.issuesByListId[listId] || [], listData[listId]),
+ union(state.boardItemsByListId[listId] || [], listData[listId]),
);
Vue.set(state.pageInfoByListId, listId, listPageInfo[listId]);
Vue.set(state.listsFlags, listId, { isLoading: false, isLoadingMore: false });
},
- [mutationTypes.RECEIVE_ISSUES_FOR_LIST_FAILURE]: (state, listId) => {
+ [mutationTypes.RECEIVE_ITEMS_FOR_LIST_FAILURE]: (state, listId) => {
state.error = s__(
'Boards|An error occurred while fetching the board issues. Please reload the page.',
);
@@ -130,18 +153,18 @@ export default {
},
[mutationTypes.RESET_ISSUES]: (state) => {
- Object.keys(state.issuesByListId).forEach((listId) => {
- Vue.set(state.issuesByListId, listId, []);
+ Object.keys(state.boardItemsByListId).forEach((listId) => {
+ Vue.set(state.boardItemsByListId, listId, []);
});
},
[mutationTypes.UPDATE_ISSUE_BY_ID]: (state, { issueId, prop, value }) => {
- if (!state.issues[issueId]) {
+ if (!state.boardItems[issueId]) {
/* eslint-disable-next-line @gitlab/require-i18n-strings */
throw new Error('No issue found.');
}
- Vue.set(state.issues[issueId], prop, value);
+ Vue.set(state.boardItems[issueId], prop, value);
},
[mutationTypes.SET_ASSIGNEE_LOADING](state, isLoading) {
@@ -167,16 +190,16 @@ export default {
const fromList = state.boardLists[fromListId];
const toList = state.boardLists[toListId];
- const issue = moveIssueListHelper(originalIssue, fromList, toList);
- Vue.set(state.issues, issue.id, issue);
+ const issue = moveItemListHelper(originalIssue, fromList, toList);
+ Vue.set(state.boardItems, issue.id, issue);
- removeIssueFromList({ state, listId: fromListId, issueId: issue.id });
- addIssueToList({ state, listId: toListId, issueId: issue.id, moveBeforeId, moveAfterId });
+ removeItemFromList({ state, listId: fromListId, itemId: issue.id });
+ addItemToList({ state, listId: toListId, itemId: issue.id, moveBeforeId, moveAfterId });
},
[mutationTypes.MOVE_ISSUE_SUCCESS]: (state, { issue }) => {
const issueId = getIdFromGraphQLId(issue.id);
- Vue.set(state.issues, issueId, formatIssue({ ...issue, id: issueId }));
+ Vue.set(state.boardItems, issueId, formatIssue({ ...issue, id: issueId }));
},
[mutationTypes.MOVE_ISSUE_FAILURE]: (
@@ -184,12 +207,12 @@ export default {
{ originalIssue, fromListId, toListId, originalIndex },
) => {
state.error = s__('Boards|An error occurred while moving the issue. Please try again.');
- Vue.set(state.issues, originalIssue.id, originalIssue);
- removeIssueFromList({ state, listId: toListId, issueId: originalIssue.id });
- addIssueToList({
+ Vue.set(state.boardItems, originalIssue.id, originalIssue);
+ removeItemFromList({ state, listId: toListId, itemId: originalIssue.id });
+ addItemToList({
state,
listId: fromListId,
- issueId: originalIssue.id,
+ itemId: originalIssue.id,
atIndex: originalIndex,
});
},
@@ -211,23 +234,23 @@ export default {
},
[mutationTypes.ADD_ISSUE_TO_LIST]: (state, { list, issue, position }) => {
- addIssueToList({
+ addItemToList({
state,
listId: list.id,
- issueId: issue.id,
+ itemId: issue.id,
atIndex: position,
});
- Vue.set(state.issues, issue.id, issue);
+ Vue.set(state.boardItems, issue.id, issue);
},
[mutationTypes.ADD_ISSUE_TO_LIST_FAILURE]: (state, { list, issueId }) => {
state.error = s__('Boards|An error occurred while creating the issue. Please try again.');
- removeIssueFromList({ state, listId: list.id, issueId });
+ removeItemFromList({ state, listId: list.id, itemId: issueId });
},
[mutationTypes.REMOVE_ISSUE_FROM_LIST]: (state, { list, issue }) => {
- removeIssueFromList({ state, listId: list.id, issueId: issue.id });
- Vue.delete(state.issues, issue.id);
+ removeItemFromList({ state, listId: list.id, itemId: issue.id });
+ Vue.delete(state.boardItems, issue.id);
},
[mutationTypes.SET_CURRENT_PAGE]: () => {
@@ -272,7 +295,7 @@ export default {
},
[mutationTypes.SET_ADD_COLUMN_FORM_VISIBLE]: (state, visible) => {
- state.addColumnFormVisible = visible;
+ Vue.set(state.addColumnForm, 'visible', visible);
},
[mutationTypes.ADD_LIST_TO_HIGHLIGHTED_LISTS]: (state, listId) => {
@@ -282,4 +305,8 @@ export default {
[mutationTypes.REMOVE_LIST_FROM_HIGHLIGHTED_LISTS]: (state, listId) => {
state.highlightedLists = state.highlightedLists.filter((id) => id !== listId);
},
+
+ [mutationTypes.RESET_BOARD_ITEM_SELECTION]: (state) => {
+ state.selectedBoardItems = [];
+ },
};
diff --git a/app/assets/javascripts/boards/stores/state.js b/app/assets/javascripts/boards/stores/state.js
index 91544d6c9c5..19ba2a5df83 100644
--- a/app/assets/javascripts/boards/stores/state.js
+++ b/app/assets/javascripts/boards/stores/state.js
@@ -1,19 +1,22 @@
-import { inactiveId } from '~/boards/constants';
+import { inactiveId, ListType } from '~/boards/constants';
export default () => ({
boardType: null,
+ issuableType: null,
+ fullPath: null,
disabled: false,
isShowingLabels: true,
activeId: inactiveId,
sidebarType: '',
boardLists: {},
listsFlags: {},
- issuesByListId: {},
+ boardItemsByListId: {},
isSettingAssignees: false,
pageInfoByListId: {},
- issues: {},
+ boardItems: {},
filterParams: {},
boardConfig: {},
+ labelsLoading: false,
labels: [],
highlightedLists: [],
selectedBoardItems: [],
@@ -25,7 +28,10 @@ export default () => ({
},
selectedProject: {},
error: undefined,
- addColumnFormVisible: false,
+ addColumnForm: {
+ visible: false,
+ columnType: ListType.label,
+ },
// TODO: remove after ce/ee split of board_content.vue
isShowingEpicsSwimlanes: false,
});
diff --git a/app/assets/javascripts/captcha/captcha_modal.vue b/app/assets/javascripts/captcha/captcha_modal.vue
index e6c73bc9643..a98a52a3130 100644
--- a/app/assets/javascripts/captcha/captcha_modal.vue
+++ b/app/assets/javascripts/captcha/captcha_modal.vue
@@ -41,10 +41,17 @@ export default {
}
},
},
+ mounted() {
+ // If this is true, we need to present the captcha modal to the user.
+ // When the modal is shown we will also initialize and render the form.
+ if (this.needsCaptchaResponse) {
+ this.$refs.modal.show();
+ }
+ },
methods: {
emitReceivedCaptchaResponse(captchaResponse) {
- this.$emit('receivedCaptchaResponse', captchaResponse);
this.$refs.modal.hide();
+ this.$emit('receivedCaptchaResponse', captchaResponse);
},
emitNullReceivedCaptchaResponse() {
this.emitReceivedCaptchaResponse(null);
@@ -103,6 +110,7 @@ export default {
:action-cancel="{ text: __('Cancel') }"
@shown="shown"
@hide="hide"
+ @hidden="$emit('hidden')"
>
<div ref="captcha"></div>
<p>{{ __('We want to be sure it is you, please confirm you are not a robot.') }}</p>
diff --git a/app/assets/javascripts/captcha/captcha_modal_axios_interceptor.js b/app/assets/javascripts/captcha/captcha_modal_axios_interceptor.js
new file mode 100644
index 00000000000..c9eac44eb28
--- /dev/null
+++ b/app/assets/javascripts/captcha/captcha_modal_axios_interceptor.js
@@ -0,0 +1,37 @@
+const supportedMethods = ['patch', 'post', 'put'];
+
+export function registerCaptchaModalInterceptor(axios) {
+ return axios.interceptors.response.use(
+ (response) => {
+ return response;
+ },
+ (err) => {
+ if (
+ supportedMethods.includes(err?.config?.method) &&
+ err?.response?.data?.needs_captcha_response
+ ) {
+ const { data } = err.response;
+ const captchaSiteKey = data.captcha_site_key;
+ const spamLogId = data.spam_log_id;
+ // eslint-disable-next-line promise/no-promise-in-callback
+ return import('~/captcha/wait_for_captcha_to_be_solved')
+ .then(({ waitForCaptchaToBeSolved }) => waitForCaptchaToBeSolved(captchaSiteKey))
+ .then((captchaResponse) => {
+ const errConfig = err.config;
+ const originalData = JSON.parse(errConfig.data);
+ return axios({
+ method: errConfig.method,
+ url: errConfig.url,
+ data: {
+ ...originalData,
+ captcha_response: captchaResponse,
+ spam_log_id: spamLogId,
+ },
+ });
+ });
+ }
+
+ return Promise.reject(err);
+ },
+ );
+}
diff --git a/app/assets/javascripts/captcha/unsolved_captcha_error.js b/app/assets/javascripts/captcha/unsolved_captcha_error.js
new file mode 100644
index 00000000000..1e5c2a4d852
--- /dev/null
+++ b/app/assets/javascripts/captcha/unsolved_captcha_error.js
@@ -0,0 +1,10 @@
+import { __ } from '~/locale';
+
+class UnsolvedCaptchaError extends Error {
+ constructor(message) {
+ super(message || __('You must solve the CAPTCHA in order to submit'));
+ this.name = 'UnsolvedCaptchaError';
+ }
+}
+
+export default UnsolvedCaptchaError;
diff --git a/app/assets/javascripts/captcha/wait_for_captcha_to_be_solved.js b/app/assets/javascripts/captcha/wait_for_captcha_to_be_solved.js
new file mode 100644
index 00000000000..0fd0f571d3b
--- /dev/null
+++ b/app/assets/javascripts/captcha/wait_for_captcha_to_be_solved.js
@@ -0,0 +1,53 @@
+import Vue from 'vue';
+import CaptchaModal from '~/captcha/captcha_modal.vue';
+import UnsolvedCaptchaError from '~/captcha/unsolved_captcha_error';
+
+/**
+ * Opens a Captcha Modal with provided captchaSiteKey.
+ *
+ * Returns a Promise which resolves if the captcha is solved correctly, and rejects
+ * if the captcha process is aborted.
+ *
+ * @param captchaSiteKey
+ * @returns {Promise}
+ */
+export function waitForCaptchaToBeSolved(captchaSiteKey) {
+ return new Promise((resolve, reject) => {
+ let captchaModalElement = document.createElement('div');
+
+ document.body.append(captchaModalElement);
+
+ let captchaModalVueInstance = new Vue({
+ el: captchaModalElement,
+ render: (createElement) => {
+ return createElement(CaptchaModal, {
+ props: {
+ captchaSiteKey,
+ needsCaptchaResponse: true,
+ },
+ on: {
+ hidden: () => {
+ // Cleaning up the modal from the DOM
+ captchaModalVueInstance.$destroy();
+ captchaModalVueInstance.$el.remove();
+ captchaModalElement.remove();
+
+ captchaModalElement = null;
+ captchaModalVueInstance = null;
+ },
+ receivedCaptchaResponse: (captchaResponse) => {
+ if (captchaResponse) {
+ resolve(captchaResponse);
+ } else {
+ // reject the promise with a custom exception, allowing consuming apps to
+ // adjust their error handling, if appropriate.
+ const error = new UnsolvedCaptchaError();
+ reject(error);
+ }
+ },
+ },
+ });
+ },
+ });
+ });
+}
diff --git a/app/assets/javascripts/ci_variable_list/components/ci_environments_dropdown.vue b/app/assets/javascripts/ci_variable_list/components/ci_environments_dropdown.vue
index 104d6672015..ecb39f214ec 100644
--- a/app/assets/javascripts/ci_variable_list/components/ci_environments_dropdown.vue
+++ b/app/assets/javascripts/ci_variable_list/components/ci_environments_dropdown.vue
@@ -20,7 +20,7 @@ export default {
},
data() {
return {
- searchTerm: this.value || '',
+ searchTerm: '',
};
},
computed: {
@@ -38,11 +38,6 @@ export default {
);
},
},
- watch: {
- value(newVal) {
- this.searchTerm = newVal;
- },
- },
methods: {
selectEnvironment(selected) {
this.$emit('selectEnvironment', selected);
@@ -55,11 +50,14 @@ export default {
isSelected(env) {
return this.value === env;
},
+ clearSearch() {
+ this.searchTerm = '';
+ },
},
};
</script>
<template>
- <gl-dropdown :text="value">
+ <gl-dropdown :text="value" @show="clearSearch">
<gl-search-box-by-type v-model.trim="searchTerm" data-testid="ci-environment-search" />
<gl-dropdown-item
v-for="environment in filteredResults"
diff --git a/app/assets/javascripts/ci_variable_list/components/ci_variable_table.vue b/app/assets/javascripts/ci_variable_list/components/ci_variable_table.vue
index 47b2745af08..c9943052356 100644
--- a/app/assets/javascripts/ci_variable_list/components/ci_variable_table.vue
+++ b/app/assets/javascripts/ci_variable_list/components/ci_variable_table.vue
@@ -84,7 +84,7 @@ export default {
</script>
<template>
- <div class="ci-variable-table">
+ <div class="ci-variable-table" data-testid="ci-variable-table">
<gl-table
:fields="fields"
:items="variables"
diff --git a/app/assets/javascripts/clusters/components/fluentd_output_settings.vue b/app/assets/javascripts/clusters/components/fluentd_output_settings.vue
index 369cb2fa0f3..aaad0009ef3 100644
--- a/app/assets/javascripts/clusters/components/fluentd_output_settings.vue
+++ b/app/assets/javascripts/clusters/components/fluentd_output_settings.vue
@@ -54,15 +54,17 @@ export default {
required: false,
},
},
- data: () => ({
- currentServerSideSettings: {
- host: null,
- port: null,
- protocol: null,
- wafLogEnabled: null,
- ciliumLogEnabled: null,
- },
- }),
+ data() {
+ return {
+ currentServerSideSettings: {
+ host: null,
+ port: null,
+ protocol: null,
+ wafLogEnabled: null,
+ ciliumLogEnabled: null,
+ },
+ };
+ },
computed: {
isSaving() {
return [UPDATING].includes(this.status);
diff --git a/app/assets/javascripts/clusters/components/ingress_modsecurity_settings.vue b/app/assets/javascripts/clusters/components/ingress_modsecurity_settings.vue
index 26767c32275..277d2c33b73 100644
--- a/app/assets/javascripts/clusters/components/ingress_modsecurity_settings.vue
+++ b/app/assets/javascripts/clusters/components/ingress_modsecurity_settings.vue
@@ -53,11 +53,13 @@ export default {
}),
},
},
- data: () => ({
- modSecurityLogo,
- initialValue: null,
- initialMode: null,
- }),
+ data() {
+ return {
+ modSecurityLogo,
+ initialValue: null,
+ initialMode: null,
+ };
+ },
computed: {
modSecurityEnabled: {
get() {
diff --git a/app/assets/javascripts/clusters_list/store/actions.js b/app/assets/javascripts/clusters_list/store/actions.js
index 45d3e0cbc23..40a86a1e58c 100644
--- a/app/assets/javascripts/clusters_list/store/actions.js
+++ b/app/assets/javascripts/clusters_list/store/actions.js
@@ -1,9 +1,9 @@
+import * as Sentry from '@sentry/browser';
import { deprecatedCreateFlash as flash } from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { parseIntPagination, normalizeHeaders } from '~/lib/utils/common_utils';
import Poll from '~/lib/utils/poll';
import { __ } from '~/locale';
-import * as Sentry from '~/sentry/wrapper';
import { MAX_REQUESTS } from '../constants';
import * as types from './mutation_types';
diff --git a/app/assets/javascripts/commit/pipelines/pipelines_bundle.js b/app/assets/javascripts/commit/pipelines/pipelines_bundle.js
index 920ffde3e32..2e050c066f1 100644
--- a/app/assets/javascripts/commit/pipelines/pipelines_bundle.js
+++ b/app/assets/javascripts/commit/pipelines/pipelines_bundle.js
@@ -31,10 +31,8 @@ export default () => {
return createElement(CommitPipelinesTable, {
props: {
endpoint: pipelineTableViewEl.dataset.endpoint,
- helpPagePath: pipelineTableViewEl.dataset.helpPagePath,
emptyStateSvgPath: pipelineTableViewEl.dataset.emptyStateSvgPath,
errorStateSvgPath: pipelineTableViewEl.dataset.errorStateSvgPath,
- autoDevopsHelpPath: pipelineTableViewEl.dataset.helpAutoDevopsPath,
},
});
},
diff --git a/app/assets/javascripts/commit/pipelines/pipelines_table.vue b/app/assets/javascripts/commit/pipelines/pipelines_table.vue
index 787152d00ef..ca4d8da2482 100644
--- a/app/assets/javascripts/commit/pipelines/pipelines_table.vue
+++ b/app/assets/javascripts/commit/pipelines/pipelines_table.vue
@@ -25,14 +25,6 @@ export default {
type: String,
required: true,
},
- helpPagePath: {
- type: String,
- required: true,
- },
- autoDevopsHelpPath: {
- type: String,
- required: true,
- },
errorStateSvgPath: {
type: String,
required: true,
@@ -200,7 +192,7 @@ export default {
<gl-button
v-if="canRenderPipelineButton"
block
- class="gl-mt-3 gl-mb-0 gl-md-display-none"
+ class="gl-mt-3 gl-mb-3 gl-md-display-none"
variant="success"
data-testid="run_pipeline_button_mobile"
:loading="state.isRunningMergeRequestPipeline"
@@ -212,7 +204,6 @@ export default {
<pipelines-table-component
:pipelines="state.pipelines"
:update-graph-dropdown="updateGraphDropdown"
- :auto-devops-help-path="autoDevopsHelpPath"
:view-type="viewType"
>
<template #table-header-actions>
diff --git a/app/assets/javascripts/commons/bootstrap.js b/app/assets/javascripts/commons/bootstrap.js
index f750c62103e..e5e23f2fb5e 100644
--- a/app/assets/javascripts/commons/bootstrap.js
+++ b/app/assets/javascripts/commons/bootstrap.js
@@ -6,8 +6,6 @@ import 'bootstrap/js/dist/button';
import 'bootstrap/js/dist/collapse';
import 'bootstrap/js/dist/modal';
import 'bootstrap/js/dist/dropdown';
-import 'bootstrap/js/dist/popover';
-import 'bootstrap/js/dist/tooltip';
import 'bootstrap/js/dist/tab';
// custom jQuery functions
@@ -19,68 +17,3 @@ $.fn.extend({
return $(this).prop('disabled', false).removeClass('disabled');
},
});
-
-/*
- Starting with bootstrap 4.3.1, bootstrap sanitizes html used for tooltips / popovers.
- This extends the default whitelists with more elements / attributes:
- https://getbootstrap.com/docs/4.3/getting-started/javascript/#sanitizer
- */
-const whitelist = $.fn.tooltip.Constructor.Default.whiteList;
-
-const inputAttributes = ['value', 'type'];
-
-const dataAttributes = [
- 'data-toggle',
- 'data-placement',
- 'data-container',
- 'data-title',
- 'data-class',
- 'data-clipboard-text',
- 'data-placement',
-];
-
-// Whitelisting data attributes
-whitelist['*'] = [
- ...whitelist['*'],
- ...dataAttributes,
- 'title',
- 'width height',
- 'abbr',
- 'datetime',
- 'name',
- 'width',
- 'height',
-];
-
-// Whitelist missing elements:
-whitelist.label = ['for'];
-whitelist.button = [...inputAttributes];
-whitelist.input = [...inputAttributes];
-
-whitelist.tt = [];
-whitelist.samp = [];
-whitelist.kbd = [];
-whitelist.var = [];
-whitelist.dfn = [];
-whitelist.cite = [];
-whitelist.big = [];
-whitelist.address = [];
-whitelist.dl = [];
-whitelist.dt = [];
-whitelist.dd = [];
-whitelist.abbr = [];
-whitelist.acronym = [];
-whitelist.blockquote = [];
-whitelist.del = [];
-whitelist.ins = [];
-whitelist['gl-emoji'] = [
- 'data-name',
- 'data-unicode-version',
- 'data-fallback-src',
- 'data-fallback-sprite-class',
-];
-
-// Whitelisting SVG tags and attributes
-whitelist.svg = ['viewBox'];
-whitelist.use = ['xlink:href'];
-whitelist.path = ['d'];
diff --git a/app/assets/javascripts/commons/vue.js b/app/assets/javascripts/commons/vue.js
index 5b5a1507d38..23647d99656 100644
--- a/app/assets/javascripts/commons/vue.js
+++ b/app/assets/javascripts/commons/vue.js
@@ -6,3 +6,5 @@ if (process.env.NODE_ENV !== 'production') {
}
Vue.use(GlFeatureFlagsPlugin);
+
+Vue.config.ignoredElements = ['gl-emoji'];
diff --git a/app/assets/javascripts/create_cluster/eks_cluster/constants.js b/app/assets/javascripts/create_cluster/eks_cluster/constants.js
index 0f0db2090c1..1c698cc2796 100644
--- a/app/assets/javascripts/create_cluster/eks_cluster/constants.js
+++ b/app/assets/javascripts/create_cluster/eks_cluster/constants.js
@@ -1,8 +1,9 @@
export const DEFAULT_REGION = 'us-east-2';
export const KUBERNETES_VERSIONS = [
- { name: '1.14', value: '1.14' },
{ name: '1.15', value: '1.15' },
- { name: '1.16', value: '1.16', default: true },
+ { name: '1.16', value: '1.16' },
{ name: '1.17', value: '1.17' },
+ { name: '1.18', value: '1.18' },
+ { name: '1.19', value: '1.19', default: true },
];
diff --git a/app/assets/javascripts/cycle_analytics/components/base.vue b/app/assets/javascripts/cycle_analytics/components/base.vue
new file mode 100644
index 00000000000..df77d641e21
--- /dev/null
+++ b/app/assets/javascripts/cycle_analytics/components/base.vue
@@ -0,0 +1,288 @@
+<script>
+import { GlIcon, GlEmptyState, GlLoadingIcon, GlSprintf } from '@gitlab/ui';
+import Cookies from 'js-cookie';
+import { deprecatedCreateFlash as Flash } from '~/flash';
+import { __ } from '~/locale';
+import banner from './banner.vue';
+import stageCodeComponent from './stage_code_component.vue';
+import stageComponent from './stage_component.vue';
+import stageNavItem from './stage_nav_item.vue';
+import stageReviewComponent from './stage_review_component.vue';
+import stageStagingComponent from './stage_staging_component.vue';
+import stageTestComponent from './stage_test_component.vue';
+
+const OVERVIEW_DIALOG_COOKIE = 'cycle_analytics_help_dismissed';
+
+export default {
+ name: 'CycleAnalytics',
+ components: {
+ GlIcon,
+ GlEmptyState,
+ GlLoadingIcon,
+ GlSprintf,
+ banner,
+ 'stage-issue-component': stageComponent,
+ 'stage-plan-component': stageComponent,
+ 'stage-code-component': stageCodeComponent,
+ 'stage-test-component': stageTestComponent,
+ 'stage-review-component': stageReviewComponent,
+ 'stage-staging-component': stageStagingComponent,
+ 'stage-production-component': stageComponent,
+ 'stage-nav-item': stageNavItem,
+ },
+ props: {
+ noDataSvgPath: {
+ type: String,
+ required: true,
+ },
+ noAccessSvgPath: {
+ type: String,
+ required: true,
+ },
+ store: {
+ type: Object,
+ required: true,
+ },
+ service: {
+ type: Object,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ state: this.store.state,
+ isLoading: false,
+ isLoadingStage: false,
+ isEmptyStage: false,
+ hasError: true,
+ startDate: 30,
+ isOverviewDialogDismissed: Cookies.get(OVERVIEW_DIALOG_COOKIE),
+ };
+ },
+ computed: {
+ currentStage() {
+ return this.store.currentActiveStage();
+ },
+ },
+ created() {
+ this.fetchCycleAnalyticsData();
+ },
+ methods: {
+ handleError() {
+ this.store.setErrorState(true);
+ return new Flash(__('There was an error while fetching value stream analytics data.'));
+ },
+ handleDateSelect(startDate) {
+ this.startDate = startDate;
+ this.fetchCycleAnalyticsData({ startDate: this.startDate });
+ },
+ fetchCycleAnalyticsData(options) {
+ const fetchOptions = options || { startDate: this.startDate };
+
+ this.isLoading = true;
+
+ this.service
+ .fetchCycleAnalyticsData(fetchOptions)
+ .then((response) => {
+ this.store.setCycleAnalyticsData(response);
+ this.selectDefaultStage();
+ })
+ .catch(() => {
+ this.handleError();
+ })
+ .finally(() => {
+ this.isLoading = false;
+ });
+ },
+ selectDefaultStage() {
+ const stage = this.state.stages[0];
+ this.selectStage(stage);
+ },
+ selectStage(stage) {
+ if (this.isLoadingStage) return;
+ if (this.currentStage === stage) return;
+
+ if (!stage.isUserAllowed) {
+ this.store.setActiveStage(stage);
+ return;
+ }
+
+ this.isLoadingStage = true;
+ this.store.setStageEvents([], stage);
+ this.store.setActiveStage(stage);
+
+ this.service
+ .fetchStageData({
+ stage,
+ startDate: this.startDate,
+ projectIds: this.selectedProjectIds,
+ })
+ .then((response) => {
+ this.isEmptyStage = !response.events.length;
+ this.store.setStageEvents(response.events, stage);
+ })
+ .catch(() => {
+ this.isEmptyStage = true;
+ })
+ .finally(() => {
+ this.isLoadingStage = false;
+ });
+ },
+ dismissOverviewDialog() {
+ this.isOverviewDialogDismissed = true;
+ Cookies.set(OVERVIEW_DIALOG_COOKIE, '1', { expires: 365 });
+ },
+ },
+ dayRangeOptions: [7, 30, 90],
+ i18n: {
+ dropdownText: __('Last %{days} days'),
+ },
+};
+</script>
+<template>
+ <div class="cycle-analytics">
+ <gl-loading-icon v-if="isLoading" size="lg" />
+ <div v-else class="wrapper">
+ <div class="card">
+ <div class="card-header">{{ __('Recent Project Activity') }}</div>
+ <div class="d-flex justify-content-between">
+ <div v-for="item in state.summary" :key="item.title" class="flex-grow text-center">
+ <h3 class="header">{{ item.value }}</h3>
+ <p class="text">{{ item.title }}</p>
+ </div>
+ <div class="flex-grow align-self-center text-center">
+ <div class="js-ca-dropdown dropdown inline">
+ <button class="dropdown-menu-toggle" data-toggle="dropdown" type="button">
+ <span class="dropdown-label">
+ <gl-sprintf :message="$options.i18n.dropdownText">
+ <template #days>{{ startDate }}</template>
+ </gl-sprintf>
+ <gl-icon name="chevron-down" class="dropdown-menu-toggle-icon gl-top-3" />
+ </span>
+ </button>
+ <ul class="dropdown-menu dropdown-menu-right">
+ <li v-for="days in $options.dayRangeOptions" :key="`day-range-${days}`">
+ <a href="#" @click.prevent="handleDateSelect(days)">
+ <gl-sprintf :message="$options.i18n.dropdownText">
+ <template #days>{{ days }}</template>
+ </gl-sprintf>
+ </a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="stage-panel-container">
+ <div class="card stage-panel">
+ <div class="card-header border-bottom-0">
+ <nav class="col-headers">
+ <ul>
+ <li class="stage-header pl-5">
+ <span class="stage-name font-weight-bold">{{
+ s__('ProjectLifecycle|Stage')
+ }}</span>
+ <span
+ class="has-tooltip"
+ data-placement="top"
+ :title="__('The phase of the development lifecycle.')"
+ aria-hidden="true"
+ >
+ <gl-icon name="question-o" class="gl-text-gray-500" />
+ </span>
+ </li>
+ <li class="median-header">
+ <span class="stage-name font-weight-bold">{{ __('Median') }}</span>
+ <span
+ class="has-tooltip"
+ data-placement="top"
+ :title="
+ __(
+ 'The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6.',
+ )
+ "
+ aria-hidden="true"
+ >
+ <gl-icon name="question-o" class="gl-text-gray-500" />
+ </span>
+ </li>
+ <li class="event-header pl-3">
+ <span
+ v-if="currentStage && currentStage.legend"
+ class="stage-name font-weight-bold"
+ >{{ currentStage ? __(currentStage.legend) : __('Related Issues') }}</span
+ >
+ <span
+ class="has-tooltip"
+ data-placement="top"
+ :title="
+ __('The collection of events added to the data gathered for that stage.')
+ "
+ aria-hidden="true"
+ >
+ <gl-icon name="question-o" class="gl-text-gray-500" />
+ </span>
+ </li>
+ <li class="total-time-header pr-5 text-right">
+ <span class="stage-name font-weight-bold">{{ __('Time') }}</span>
+ <span
+ class="has-tooltip"
+ data-placement="top"
+ :title="__('The time taken by each data entry gathered by that stage.')"
+ aria-hidden="true"
+ >
+ <gl-icon name="question-o" class="gl-text-gray-500" />
+ </span>
+ </li>
+ </ul>
+ </nav>
+ </div>
+
+ <div class="stage-panel-body">
+ <nav class="stage-nav">
+ <ul>
+ <stage-nav-item
+ v-for="stage in state.stages"
+ :key="stage.title"
+ :title="stage.title"
+ :is-user-allowed="stage.isUserAllowed"
+ :value="stage.value"
+ :is-active="stage.active"
+ @select="selectStage(stage)"
+ />
+ </ul>
+ </nav>
+ <section class="stage-events overflow-auto">
+ <gl-loading-icon v-show="isLoadingStage" size="lg" />
+ <template v-if="currentStage && !currentStage.isUserAllowed">
+ <gl-empty-state
+ class="js-empty-state"
+ :title="__('You need permission.')"
+ :svg-path="noAccessSvgPath"
+ :description="__('Want to see the data? Please ask an administrator for access.')"
+ />
+ </template>
+ <template v-else>
+ <template v-if="currentStage && isEmptyStage && !isLoadingStage">
+ <gl-empty-state
+ class="js-empty-state"
+ :description="currentStage.emptyStageText"
+ :svg-path="noDataSvgPath"
+ :title="__('We don\'t have enough data to show this stage.')"
+ />
+ </template>
+ <template v-if="state.events.length && !isLoadingStage && !isEmptyStage">
+ <component
+ :is="currentStage.component"
+ :stage="currentStage"
+ :items="state.events"
+ />
+ </template>
+ </template>
+ </section>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+</template>
diff --git a/app/assets/javascripts/cycle_analytics/cycle_analytics_bundle.js b/app/assets/javascripts/cycle_analytics/cycle_analytics_bundle.js
deleted file mode 100644
index 847820c965f..00000000000
--- a/app/assets/javascripts/cycle_analytics/cycle_analytics_bundle.js
+++ /dev/null
@@ -1,156 +0,0 @@
-// This is a true violation of @gitlab/no-runtime-template-compiler, as it
-// relies on app/views/projects/cycle_analytics/show.html.haml for its
-// template.
-/* eslint-disable @gitlab/no-runtime-template-compiler */
-import { GlEmptyState, GlLoadingIcon } from '@gitlab/ui';
-import $ from 'jquery';
-import Cookies from 'js-cookie';
-import Vue from 'vue';
-import { __ } from '~/locale';
-import { deprecatedCreateFlash as Flash } from '../flash';
-import Translate from '../vue_shared/translate';
-import banner from './components/banner.vue';
-import stageCodeComponent from './components/stage_code_component.vue';
-import stageComponent from './components/stage_component.vue';
-import stageNavItem from './components/stage_nav_item.vue';
-import stageReviewComponent from './components/stage_review_component.vue';
-import stageStagingComponent from './components/stage_staging_component.vue';
-import stageTestComponent from './components/stage_test_component.vue';
-import CycleAnalyticsService from './cycle_analytics_service';
-import CycleAnalyticsStore from './cycle_analytics_store';
-
-Vue.use(Translate);
-
-export default () => {
- const OVERVIEW_DIALOG_COOKIE = 'cycle_analytics_help_dismissed';
- const cycleAnalyticsEl = document.querySelector('#cycle-analytics');
-
- // eslint-disable-next-line no-new
- new Vue({
- el: '#cycle-analytics',
- name: 'CycleAnalytics',
- components: {
- GlEmptyState,
- GlLoadingIcon,
- banner,
- 'stage-issue-component': stageComponent,
- 'stage-plan-component': stageComponent,
- 'stage-code-component': stageCodeComponent,
- 'stage-test-component': stageTestComponent,
- 'stage-review-component': stageReviewComponent,
- 'stage-staging-component': stageStagingComponent,
- 'stage-production-component': stageComponent,
- 'stage-nav-item': stageNavItem,
- },
- data() {
- return {
- store: CycleAnalyticsStore,
- state: CycleAnalyticsStore.state,
- isLoading: false,
- isLoadingStage: false,
- isEmptyStage: false,
- hasError: false,
- startDate: 30,
- isOverviewDialogDismissed: Cookies.get(OVERVIEW_DIALOG_COOKIE),
- service: this.createCycleAnalyticsService(cycleAnalyticsEl.dataset.requestPath),
- };
- },
- computed: {
- currentStage() {
- return this.store.currentActiveStage();
- },
- },
- created() {
- // Conditional check placed here to prevent this method from being called on the
- // new Value Stream Analytics page (i.e. the new page will be initialized blank and only
- // after a group is selected the cycle analyitcs data will be fetched). Once the
- // old (current) page has been removed this entire created method as well as the
- // variable itself can be completely removed.
- // Follow up issue: https://gitlab.com/gitlab-org/gitlab-foss/issues/64490
- if (cycleAnalyticsEl.dataset.requestPath) this.fetchCycleAnalyticsData();
- },
- methods: {
- handleError() {
- this.store.setErrorState(true);
- return new Flash(__('There was an error while fetching value stream analytics data.'));
- },
- initDropdown() {
- const $dropdown = $('.js-ca-dropdown');
- const $label = $dropdown.find('.dropdown-label');
-
- // eslint-disable-next-line @gitlab/no-global-event-off
- $dropdown
- .find('li a')
- .off('click')
- .on('click', (e) => {
- e.preventDefault();
- const $target = $(e.currentTarget);
- this.startDate = $target.data('value');
-
- $label.text($target.text().trim());
- this.fetchCycleAnalyticsData({ startDate: this.startDate });
- });
- },
- fetchCycleAnalyticsData(options) {
- const fetchOptions = options || { startDate: this.startDate };
-
- this.isLoading = true;
-
- this.service
- .fetchCycleAnalyticsData(fetchOptions)
- .then((response) => {
- this.store.setCycleAnalyticsData(response);
- this.selectDefaultStage();
- this.initDropdown();
- this.isLoading = false;
- })
- .catch(() => {
- this.handleError();
- this.isLoading = false;
- });
- },
- selectDefaultStage() {
- const stage = this.state.stages[0];
- this.selectStage(stage);
- },
- selectStage(stage) {
- if (this.isLoadingStage) return;
- if (this.currentStage === stage) return;
-
- if (!stage.isUserAllowed) {
- this.store.setActiveStage(stage);
- return;
- }
-
- this.isLoadingStage = true;
- this.store.setStageEvents([], stage);
- this.store.setActiveStage(stage);
-
- this.service
- .fetchStageData({
- stage,
- startDate: this.startDate,
- projectIds: this.selectedProjectIds,
- })
- .then((response) => {
- this.isEmptyStage = !response.events.length;
- this.store.setStageEvents(response.events, stage);
- this.isLoadingStage = false;
- })
- .catch(() => {
- this.isEmptyStage = true;
- this.isLoadingStage = false;
- });
- },
- dismissOverviewDialog() {
- this.isOverviewDialogDismissed = true;
- Cookies.set(OVERVIEW_DIALOG_COOKIE, '1', { expires: 365 });
- },
- createCycleAnalyticsService(requestPath) {
- return new CycleAnalyticsService({
- requestPath,
- });
- },
- },
- });
-};
diff --git a/app/assets/javascripts/cycle_analytics/index.js b/app/assets/javascripts/cycle_analytics/index.js
new file mode 100644
index 00000000000..42d6700fae1
--- /dev/null
+++ b/app/assets/javascripts/cycle_analytics/index.js
@@ -0,0 +1,32 @@
+import Vue from 'vue';
+import Translate from '../vue_shared/translate';
+import CycleAnalytics from './components/base.vue';
+import CycleAnalyticsService from './cycle_analytics_service';
+import CycleAnalyticsStore from './cycle_analytics_store';
+
+Vue.use(Translate);
+
+const createCycleAnalyticsService = (requestPath) =>
+ new CycleAnalyticsService({
+ requestPath,
+ });
+
+export default () => {
+ const el = document.querySelector('#js-cycle-analytics');
+ const { noAccessSvgPath, noDataSvgPath } = el.dataset;
+
+ // eslint-disable-next-line no-new
+ new Vue({
+ el,
+ name: 'CycleAnalytics',
+ render: (createElement) =>
+ createElement(CycleAnalytics, {
+ props: {
+ noDataSvgPath,
+ noAccessSvgPath,
+ store: CycleAnalyticsStore,
+ service: createCycleAnalyticsService(el.dataset.requestPath),
+ },
+ }),
+ });
+};
diff --git a/app/assets/javascripts/deprecated_jquery_dropdown/gl_dropdown.js b/app/assets/javascripts/deprecated_jquery_dropdown/gl_dropdown.js
index 162491312a8..a1dd12ff769 100644
--- a/app/assets/javascripts/deprecated_jquery_dropdown/gl_dropdown.js
+++ b/app/assets/javascripts/deprecated_jquery_dropdown/gl_dropdown.js
@@ -29,6 +29,26 @@ const FILTER_INPUT = '.dropdown-input .dropdown-input-field:not(.dropdown-no-fil
const NO_FILTER_INPUT = '.dropdown-input .dropdown-input-field.dropdown-no-filter';
+let mouseEventListenersAdded = false;
+let mousedownTarget = null;
+let mouseupTarget = null;
+
+function addGlobalMouseEventListeners() {
+ // Remember mousedown and mouseup locations.
+ // Required in the `hide.bs.dropdown` listener for
+ // dropdown close prevention in some cases.
+ document.addEventListener('mousedown', ({ target }) => {
+ mousedownTarget = target;
+ });
+ document.addEventListener('mouseup', ({ target }) => {
+ mouseupTarget = target;
+ });
+ document.addEventListener('click', () => {
+ mousedownTarget = null;
+ mouseupTarget = null;
+ });
+}
+
export class GitLabDropdown {
constructor(el1, options) {
let selector;
@@ -36,9 +56,14 @@ export class GitLabDropdown {
this.el = el1;
this.options = options;
this.updateLabel = this.updateLabel.bind(this);
- this.hidden = this.hidden.bind(this);
this.opened = this.opened.bind(this);
+ this.hide = this.hide.bind(this);
+ this.hidden = this.hidden.bind(this);
this.shouldPropagate = this.shouldPropagate.bind(this);
+ if (!mouseEventListenersAdded) {
+ addGlobalMouseEventListeners();
+ mouseEventListenersAdded = true;
+ }
self = this;
selector = $(this.el).data('target');
this.dropdown = selector != null ? $(selector) : $(this.el).parent();
@@ -132,6 +157,7 @@ export class GitLabDropdown {
}
// Event listeners
this.dropdown.on('shown.bs.dropdown', this.opened);
+ this.dropdown.on('hide.bs.dropdown', this.hide);
this.dropdown.on('hidden.bs.dropdown', this.hidden);
$(this.el).on('update.label', this.updateLabel);
this.dropdown.on('click', '.dropdown-menu, .dropdown-menu-close', this.shouldPropagate);
@@ -334,6 +360,21 @@ export class GitLabDropdown {
$menu.css('bottom', '100%');
}
+ hide(e) {
+ // Prevent dropdowns with a search from being closed when the
+ // mousedown event happened inside the dropdown box and only
+ // the mouseup event did not.
+ if (this.options.search && mousedownTarget) {
+ const isIn = (element, $possibleContainer) => Boolean($possibleContainer.has(element).length);
+ const $menu = this.dropdown.find('.dropdown-menu');
+ const mousedownInsideDropdown = isIn(mousedownTarget, $menu);
+ const mouseupOutsideDropdown = !isIn(mouseupTarget, $menu);
+ if (mousedownInsideDropdown && mouseupOutsideDropdown) {
+ e.preventDefault();
+ }
+ }
+ }
+
hidden(e) {
this.resetRows();
this.removeArrowKeyEvent();
diff --git a/app/assets/javascripts/design_management/components/delete_button.vue b/app/assets/javascripts/design_management/components/delete_button.vue
index 273fa3f6be2..fbcce22ec1e 100644
--- a/app/assets/javascripts/design_management/components/delete_button.vue
+++ b/app/assets/javascripts/design_management/components/delete_button.vue
@@ -73,21 +73,19 @@ export default {
</script>
<template>
- <div class="gl-display-flex gl-align-items-center gl-h-full">
+ <div>
<gl-modal
:modal-id="modalId"
:title="$options.modal.title"
:action-primary="$options.modal.actionPrimary"
:action-cancel="$options.modal.actionCancel"
- @ok="$emit('deleteSelectedDesigns')"
+ @ok="$emit('delete-selected-designs')"
>
- <p>
- {{
- s__(
- 'DesignManagement|Archived designs will still be available in previous versions of the design collection.',
- )
- }}
- </p>
+ {{
+ s__(
+ 'DesignManagement|Archived designs will still be available in previous versions of the design collection.',
+ )
+ }}
</gl-modal>
<gl-button
v-gl-modal-directive="modalId"
diff --git a/app/assets/javascripts/design_management/components/design_destroyer.vue b/app/assets/javascripts/design_management/components/design_destroyer.vue
index 01f9cac456d..0178111f651 100644
--- a/app/assets/javascripts/design_management/components/design_destroyer.vue
+++ b/app/assets/javascripts/design_management/components/design_destroyer.vue
@@ -55,6 +55,7 @@ export default {
iid,
}"
:update="updateStoreAfterDelete"
+ :tag="null"
v-on="$listeners"
>
<slot v-bind="{ mutate, loading, error }"></slot>
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 33f0aa00cad..b1c37b0687f 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
@@ -253,12 +253,12 @@ export default {
:class="{ 'gl-bg-blue-50': isDiscussionActive }"
@error="$emit('update-note-error', $event)"
/>
- <li v-show="isReplyPlaceholderVisible" class="reply-wrapper">
+ <li v-show="isReplyPlaceholderVisible" class="reply-wrapper discussion-reply-holder">
<reply-placeholder
v-if="!isFormVisible"
class="qa-discussion-reply"
- :button-text="__('Reply...')"
- @onClick="showForm"
+ :placeholder-text="__('Reply…')"
+ @focus="showForm"
/>
<apollo-mutation
v-else
diff --git a/app/assets/javascripts/design_management/components/list/item.vue b/app/assets/javascripts/design_management/components/list/item.vue
index 5eabe9ef1bc..2169c9111d2 100644
--- a/app/assets/javascripts/design_management/components/list/item.vue
+++ b/app/assets/javascripts/design_management/components/list/item.vue
@@ -138,6 +138,7 @@ export default {
<gl-icon
:name="icon.name"
:size="18"
+ use-deprecated-sizes
:class="icon.classes"
data-qa-selector="design_status_icon"
:data-qa-status="icon.name"
diff --git a/app/assets/javascripts/design_management/components/toolbar/index.vue b/app/assets/javascripts/design_management/components/toolbar/index.vue
index a3b0f06fb28..8abf1529f3c 100644
--- a/app/assets/javascripts/design_management/components/toolbar/index.vue
+++ b/app/assets/javascripts/design_management/components/toolbar/index.vue
@@ -130,7 +130,7 @@ export default {
button-icon="archive"
button-category="secondary"
:title="s__('DesignManagement|Archive design')"
- @deleteSelectedDesigns="$emit('delete')"
+ @delete-selected-designs="$emit('delete')"
/>
</header>
</template>
diff --git a/app/assets/javascripts/design_management/components/upload/button.vue b/app/assets/javascripts/design_management/components/upload/button.vue
index d7b287f663b..394ccb3c483 100644
--- a/app/assets/javascripts/design_management/components/upload/button.vue
+++ b/app/assets/javascripts/design_management/components/upload/button.vue
@@ -50,7 +50,7 @@ export default {
type="file"
name="design_file"
:accept="$options.VALID_DESIGN_FILE_MIMETYPE.mimetype"
- class="hide"
+ class="gl-display-none"
multiple
@change="onFileUploadChange"
/>
diff --git a/app/assets/javascripts/design_management/pages/index.vue b/app/assets/javascripts/design_management/pages/index.vue
index c73c8fb6ca4..99ac38fc554 100644
--- a/app/assets/javascripts/design_management/pages/index.vue
+++ b/app/assets/javascripts/design_management/pages/index.vue
@@ -365,7 +365,8 @@ export default {
v-if="isLatestVersion"
variant="link"
size="small"
- class="gl-mr-4 js-select-all"
+ class="gl-mr-3"
+ data-testid="select-all-designs-button"
@click="toggleDesignsSelection"
>{{ selectAllButtonText }}
</gl-button>
@@ -385,7 +386,7 @@ export default {
data-qa-selector="archive_button"
:loading="loading"
:has-selected-designs="hasSelectedDesigns"
- @deleteSelectedDesigns="mutate()"
+ @delete-selected-designs="mutate()"
>
{{ s__('DesignManagement|Archive selected') }}
</delete-button>
diff --git a/app/assets/javascripts/diffs/components/app.vue b/app/assets/javascripts/diffs/components/app.vue
index 4323499ef1f..253e1e3b70e 100644
--- a/app/assets/javascripts/diffs/components/app.vue
+++ b/app/assets/javascripts/diffs/components/app.vue
@@ -23,9 +23,7 @@ import {
ALERT_OVERFLOW_HIDDEN,
ALERT_MERGE_CONFLICT,
ALERT_COLLAPSED_FILES,
- EVT_VIEW_FILE_BY_FILE,
} from '../constants';
-import eventHub from '../event_hub';
import { reviewStatuses } from '../utils/file_reviews';
import { diffsApp } from '../utils/performance';
@@ -127,7 +125,7 @@ export default {
required: false,
default: '',
},
- mrReviews: {
+ rehydratedMrReviews: {
type: Object,
required: false,
default: () => ({}),
@@ -166,6 +164,7 @@ export default {
'canMerge',
'hasConflicts',
'viewDiffsFileByFile',
+ 'mrReviews',
]),
...mapGetters('diffs', ['whichCollapsedTypes', 'isParallelView', 'currentDiffIndex']),
...mapGetters(['isNotesFetched', 'getNoteableData']),
@@ -270,7 +269,7 @@ export default {
showSuggestPopover: this.showSuggestPopover,
viewDiffsFileByFile: fileByFile(this.fileByFileUserPreference),
defaultSuggestionCommitMessage: this.defaultSuggestionCommitMessage,
- mrReviews: this.mrReviews || {},
+ mrReviews: this.rehydratedMrReviews,
});
if (this.shouldShow) {
@@ -332,16 +331,11 @@ export default {
subscribeToEvents() {
notesEventHub.$once('fetchDiffData', this.fetchData);
notesEventHub.$on('refetchDiffData', this.refetchDiffData);
- eventHub.$on(EVT_VIEW_FILE_BY_FILE, this.fileByFileListener);
},
unsubscribeFromEvents() {
- eventHub.$off(EVT_VIEW_FILE_BY_FILE, this.fileByFileListener);
notesEventHub.$off('refetchDiffData', this.refetchDiffData);
notesEventHub.$off('fetchDiffData', this.fetchData);
},
- fileByFileListener({ setting } = {}) {
- this.setFileByFile({ fileByFile: setting });
- },
navigateToDiffFileNumber(number) {
this.navigateToDiffFileIndex(number - 1);
},
@@ -520,7 +514,7 @@ export default {
v-for="(file, index) in diffs"
:key="file.newPath"
:file="file"
- :reviewed="fileReviews[index]"
+ :reviewed="fileReviews[file.id]"
:is-first-file="index === 0"
:is-last-file="index === diffFilesLength - 1"
:help-page-path="helpPagePath"
diff --git a/app/assets/javascripts/diffs/components/diff_discussion_reply.vue b/app/assets/javascripts/diffs/components/diff_discussion_reply.vue
index 9027d0c8aa4..3766c125325 100644
--- a/app/assets/javascripts/diffs/components/diff_discussion_reply.vue
+++ b/app/assets/javascripts/diffs/components/diff_discussion_reply.vue
@@ -35,8 +35,9 @@ export default {
<slot v-if="hasForm" name="form"></slot>
<template v-else-if="renderReplyPlaceholder">
<reply-placeholder
- :button-text="__('Start a new discussion...')"
- @onClick="$emit('showNewDiscussionForm')"
+ :placeholder-text="__('Start a new discussion…')"
+ :label-text="__('New discussion')"
+ @focus="$emit('showNewDiscussionForm')"
/>
</template>
</template>
diff --git a/app/assets/javascripts/diffs/components/diff_file.vue b/app/assets/javascripts/diffs/components/diff_file.vue
index f77c8d7406b..ca4543f7002 100644
--- a/app/assets/javascripts/diffs/components/diff_file.vue
+++ b/app/assets/javascripts/diffs/components/diff_file.vue
@@ -150,6 +150,11 @@ export default {
},
},
watch: {
+ 'file.id': {
+ handler: function fileIdHandler() {
+ this.manageViewedEffects();
+ },
+ },
'file.file_hash': {
handler: function hashChangeWatch(newHash, oldHash) {
this.isCollapsed = isCollapsed(this.file);
@@ -186,9 +191,7 @@ export default {
this.postRender();
}
- if (this.reviewed && !this.isCollapsed && this.showLocalFileReviews) {
- this.handleToggle();
- }
+ this.manageViewedEffects();
},
beforeDestroy() {
eventHub.$off(EVT_EXPAND_ALL_FILES, this.expandAllListener);
@@ -200,6 +203,11 @@ export default {
'setRenderIt',
'setFileCollapsedByUser',
]),
+ manageViewedEffects() {
+ if (this.reviewed && !this.isCollapsed && this.showLocalFileReviews) {
+ this.handleToggle();
+ }
+ },
expandAllListener() {
if (this.isCollapsed) {
this.handleToggle();
diff --git a/app/assets/javascripts/diffs/components/diff_file_header.vue b/app/assets/javascripts/diffs/components/diff_file_header.vue
index 1195a7f2565..1f50b3a38a6 100644
--- a/app/assets/javascripts/diffs/components/diff_file_header.vue
+++ b/app/assets/javascripts/diffs/components/diff_file_header.vue
@@ -339,14 +339,12 @@ export default {
v-if="isReviewable && showLocalFileReviews"
v-gl-tooltip.hover
data-testid="fileReviewCheckbox"
- class="gl-mb-0"
+ class="gl-mr-5 gl-display-flex gl-align-items-center"
:title="$options.i18n.fileReviewTooltip"
:checked="reviewed"
@change="toggleReview"
>
- <span class="gl-line-height-20">
- {{ $options.i18n.fileReviewLabel }}
- </span>
+ {{ $options.i18n.fileReviewLabel }}
</gl-form-checkbox>
<gl-button-group class="gl-pt-0!">
<gl-button
diff --git a/app/assets/javascripts/diffs/components/settings_dropdown.vue b/app/assets/javascripts/diffs/components/settings_dropdown.vue
index 7d74e81257a..879922f86a2 100644
--- a/app/assets/javascripts/diffs/components/settings_dropdown.vue
+++ b/app/assets/javascripts/diffs/components/settings_dropdown.vue
@@ -1,9 +1,6 @@
<script>
import { GlButtonGroup, GlButton, GlDropdown, GlFormCheckbox } from '@gitlab/ui';
import { mapActions, mapGetters, mapState } from 'vuex';
-
-import { EVT_VIEW_FILE_BY_FILE } from '../constants';
-import eventHub from '../event_hub';
import { SETTINGS_DROPDOWN } from '../i18n';
export default {
@@ -24,9 +21,13 @@ export default {
'setParallelDiffViewType',
'setRenderTreeList',
'setShowWhitespace',
+ 'setFileByFile',
]),
toggleFileByFile() {
- eventHub.$emit(EVT_VIEW_FILE_BY_FILE, { setting: !this.viewDiffsFileByFile });
+ this.setFileByFile({ fileByFile: !this.viewDiffsFileByFile });
+ },
+ toggleWhitespace(updatedSetting) {
+ this.setShowWhitespace({ showWhitespace: updatedSetting, pushState: true });
},
},
};
@@ -82,26 +83,21 @@ export default {
</gl-button>
</gl-button-group>
</div>
- <div class="gl-mt-3 gl-px-3">
- <label class="gl-mb-0">
- <input
- id="show-whitespace"
- type="checkbox"
- :checked="showWhitespace"
- @change="setShowWhitespace({ showWhitespace: $event.target.checked, pushState: true })"
- />
- {{ __('Show whitespace changes') }}
- </label>
- </div>
- <div class="gl-mt-3 gl-px-3">
- <gl-form-checkbox
- data-testid="file-by-file"
- class="gl-mb-0"
- :checked="viewDiffsFileByFile"
- @input="toggleFileByFile"
- >
- {{ $options.i18n.fileByFile }}
- </gl-form-checkbox>
- </div>
+ <gl-form-checkbox
+ data-testid="show-whitespace"
+ class="gl-mt-3 gl-ml-3"
+ :checked="showWhitespace"
+ @input="toggleWhitespace"
+ >
+ {{ $options.i18n.whitespace }}
+ </gl-form-checkbox>
+ <gl-form-checkbox
+ data-testid="file-by-file"
+ class="gl-ml-3 gl-mb-0"
+ :checked="viewDiffsFileByFile"
+ @input="toggleFileByFile"
+ >
+ {{ $options.i18n.fileByFile }}
+ </gl-form-checkbox>
</gl-dropdown>
</template>
diff --git a/app/assets/javascripts/diffs/constants.js b/app/assets/javascripts/diffs/constants.js
index 7080348ee7d..0163f508fea 100644
--- a/app/assets/javascripts/diffs/constants.js
+++ b/app/assets/javascripts/diffs/constants.js
@@ -103,7 +103,6 @@ export const RENAMED_DIFF_TRANSITIONS = {
// MR Diffs known events
export const EVT_EXPAND_ALL_FILES = 'mr:diffs:expandAllFiles';
-export const EVT_VIEW_FILE_BY_FILE = 'mr:diffs:preference:fileByFile';
export const EVT_PERF_MARK_FILE_TREE_START = 'mr:diffs:perf:fileTreeStart';
export const EVT_PERF_MARK_FILE_TREE_END = 'mr:diffs:perf:fileTreeEnd';
export const EVT_PERF_MARK_DIFF_FILES_START = 'mr:diffs:perf:filesStart';
diff --git a/app/assets/javascripts/diffs/i18n.js b/app/assets/javascripts/diffs/i18n.js
index 2a061876937..b2354af1eec 100644
--- a/app/assets/javascripts/diffs/i18n.js
+++ b/app/assets/javascripts/diffs/i18n.js
@@ -21,5 +21,6 @@ export const DIFF_FILE = {
};
export const SETTINGS_DROPDOWN = {
+ whitespace: __('Show whitespace changes'),
fileByFile: __('Show one file at a time'),
};
diff --git a/app/assets/javascripts/diffs/index.js b/app/assets/javascripts/diffs/index.js
index 68fe204d955..87e9af174e5 100644
--- a/app/assets/javascripts/diffs/index.js
+++ b/app/assets/javascripts/diffs/index.js
@@ -124,7 +124,7 @@ export default function initDiffsApp(store) {
showSuggestPopover: this.showSuggestPopover,
fileByFileUserPreference: this.viewDiffsFileByFile,
defaultSuggestionCommitMessage: this.defaultSuggestionCommitMessage,
- mrReviews: getReviewsForMergeRequest(mrPath),
+ rehydratedMrReviews: getReviewsForMergeRequest(mrPath),
},
});
},
diff --git a/app/assets/javascripts/diffs/store/actions.js b/app/assets/javascripts/diffs/store/actions.js
index 4b2dc2d45df..8796016def9 100644
--- a/app/assets/javascripts/diffs/store/actions.js
+++ b/app/assets/javascripts/diffs/store/actions.js
@@ -741,12 +741,7 @@ export const navigateToDiffFileIndex = ({ commit, state }, index) => {
export const setFileByFile = ({ commit }, { fileByFile }) => {
const fileViewMode = fileByFile ? DIFF_VIEW_FILE_BY_FILE : DIFF_VIEW_ALL_FILES;
commit(types.SET_FILE_BY_FILE, fileByFile);
-
Cookies.set(DIFF_FILE_BY_FILE_COOKIE_NAME, fileViewMode);
-
- historyPushState(
- mergeUrlParams({ [DIFF_FILE_BY_FILE_COOKIE_NAME]: fileViewMode }, window.location.href),
- );
};
export function reviewFile({ commit, state }, { file, reviewed = true }) {
diff --git a/app/assets/javascripts/diffs/store/utils.js b/app/assets/javascripts/diffs/store/utils.js
index 87b4f33c216..b37a75eb2a3 100644
--- a/app/assets/javascripts/diffs/store/utils.js
+++ b/app/assets/javascripts/diffs/store/utils.js
@@ -283,7 +283,7 @@ export function addContextLines(options) {
* Trims the first char of the `richText` property when it's either a space or a diff symbol.
* @param {Object} line
* @returns {Object}
- * @deprecated
+ * @deprecated Use `line.rich_text = line.rich_text ? line.rich_text.replace(/^[+ -]/, '') : undefined;` instead!. For more information, see https://gitlab.com/gitlab-org/gitlab/-/issues/299329
*/
export function trimFirstCharOfLineContent(line = {}) {
// eslint-disable-next-line no-param-reassign
diff --git a/app/assets/javascripts/diffs/utils/file_reviews.js b/app/assets/javascripts/diffs/utils/file_reviews.js
index 5fafc1714ae..7a4b1aa6b17 100644
--- a/app/assets/javascripts/diffs/utils/file_reviews.js
+++ b/app/assets/javascripts/diffs/utils/file_reviews.js
@@ -9,7 +9,12 @@ export function isFileReviewed(reviews, file) {
}
export function reviewStatuses(files, reviews) {
- return files.map((file) => isFileReviewed(reviews, file));
+ return files.reduce((flat, file) => {
+ return {
+ ...flat,
+ [file.id]: isFileReviewed(reviews, file),
+ };
+ }, {});
}
export function getReviewsForMergeRequest(mrPath) {
diff --git a/app/assets/javascripts/diffs/utils/preferences.js b/app/assets/javascripts/diffs/utils/preferences.js
index e440de3350a..6b4aaf45937 100644
--- a/app/assets/javascripts/diffs/utils/preferences.js
+++ b/app/assets/javascripts/diffs/utils/preferences.js
@@ -1,22 +1,13 @@
import Cookies from 'js-cookie';
-import { getParameterValues } from '~/lib/utils/url_utility';
-
import { DIFF_FILE_BY_FILE_COOKIE_NAME, DIFF_VIEW_FILE_BY_FILE } from '../constants';
export function fileByFile(pref = false) {
- const search = getParameterValues(DIFF_FILE_BY_FILE_COOKIE_NAME)?.[0];
const cookie = Cookies.get(DIFF_FILE_BY_FILE_COOKIE_NAME);
- let viewFileByFile = pref;
// use the cookie first, if it exists
if (cookie) {
- viewFileByFile = cookie === DIFF_VIEW_FILE_BY_FILE;
- }
-
- // the search parameter of the URL should override, if it exists
- if (search) {
- viewFileByFile = search === DIFF_VIEW_FILE_BY_FILE;
+ return cookie === DIFF_VIEW_FILE_BY_FILE;
}
- return viewFileByFile;
+ return pref;
}
diff --git a/app/assets/javascripts/editor/constants.js b/app/assets/javascripts/editor/constants.js
index d9e6a6c13e2..c991316dda2 100644
--- a/app/assets/javascripts/editor/constants.js
+++ b/app/assets/javascripts/editor/constants.js
@@ -16,6 +16,9 @@ export const EDITOR_READY_EVENT = 'editor-ready';
export const EDITOR_TYPE_CODE = 'vs.editor.ICodeEditor';
export const EDITOR_TYPE_DIFF = 'vs.editor.IDiffEditor';
+export const EDITOR_CODE_INSTANCE_FN = 'createInstance';
+export const EDITOR_DIFF_INSTANCE_FN = 'createDiffInstance';
+
//
// EXTENSIONS' CONSTANTS
//
diff --git a/app/assets/javascripts/editor/extensions/editor_lite_webide_ext.js b/app/assets/javascripts/editor/extensions/editor_lite_webide_ext.js
new file mode 100644
index 00000000000..83b0386d470
--- /dev/null
+++ b/app/assets/javascripts/editor/extensions/editor_lite_webide_ext.js
@@ -0,0 +1,164 @@
+import { debounce } from 'lodash';
+import { KeyCode, KeyMod, Range } from 'monaco-editor';
+import { EDITOR_TYPE_DIFF } from '~/editor/constants';
+import { EditorLiteExtension } from '~/editor/extensions/editor_lite_extension_base';
+import Disposable from '~/ide/lib/common/disposable';
+import { editorOptions } from '~/ide/lib/editor_options';
+import keymap from '~/ide/lib/keymap.json';
+
+const isDiffEditorType = (instance) => {
+ return instance.getEditorType() === EDITOR_TYPE_DIFF;
+};
+
+export const UPDATE_DIMENSIONS_DELAY = 200;
+
+export class EditorWebIdeExtension extends EditorLiteExtension {
+ constructor({ instance, modelManager, ...options } = {}) {
+ super({
+ instance,
+ ...options,
+ modelManager,
+ disposable: new Disposable(),
+ debouncedUpdate: debounce(() => {
+ instance.updateDimensions();
+ }, UPDATE_DIMENSIONS_DELAY),
+ });
+
+ window.addEventListener('resize', instance.debouncedUpdate, false);
+
+ instance.onDidDispose(() => {
+ window.removeEventListener('resize', instance.debouncedUpdate);
+
+ // catch any potential errors with disposing the error
+ // this is mainly for tests caused by elements not existing
+ try {
+ instance.disposable.dispose();
+ } catch (e) {
+ if (process.env.NODE_ENV !== 'test') {
+ // eslint-disable-next-line no-console
+ console.error(e);
+ }
+ }
+ });
+
+ EditorWebIdeExtension.addActions(instance);
+ }
+
+ static addActions(instance) {
+ const { store } = instance;
+ const getKeyCode = (key) => {
+ const monacoKeyMod = key.indexOf('KEY_') === 0;
+
+ return monacoKeyMod ? KeyCode[key] : KeyMod[key];
+ };
+
+ keymap.forEach((command) => {
+ const { bindings, id, label, action } = command;
+
+ const keybindings = bindings.map((binding) => {
+ const keys = binding.split('+');
+
+ // eslint-disable-next-line no-bitwise
+ return keys.length > 1 ? getKeyCode(keys[0]) | getKeyCode(keys[1]) : getKeyCode(keys[0]);
+ });
+
+ instance.addAction({
+ id,
+ label,
+ keybindings,
+ run() {
+ store.dispatch(action.name, action.params);
+ return null;
+ },
+ });
+ });
+ }
+
+ createModel(file, head = null) {
+ return this.modelManager.addModel(file, head);
+ }
+
+ attachModel(model) {
+ if (isDiffEditorType(this)) {
+ this.setModel({
+ original: model.getOriginalModel(),
+ modified: model.getModel(),
+ });
+
+ return;
+ }
+
+ this.setModel(model.getModel());
+
+ this.updateOptions(
+ editorOptions.reduce((acc, obj) => {
+ Object.keys(obj).forEach((key) => {
+ Object.assign(acc, {
+ [key]: obj[key](model),
+ });
+ });
+ return acc;
+ }, {}),
+ );
+ }
+
+ attachMergeRequestModel(model) {
+ this.setModel({
+ original: model.getBaseModel(),
+ modified: model.getModel(),
+ });
+ }
+
+ updateDimensions() {
+ this.layout();
+ this.updateDiffView();
+ }
+
+ setPos({ lineNumber, column }) {
+ this.revealPositionInCenter({
+ lineNumber,
+ column,
+ });
+ this.setPosition({
+ lineNumber,
+ column,
+ });
+ }
+
+ onPositionChange(cb) {
+ if (!this.onDidChangeCursorPosition) {
+ return;
+ }
+
+ this.disposable.add(this.onDidChangeCursorPosition((e) => cb(this, e)));
+ }
+
+ updateDiffView() {
+ if (!isDiffEditorType(this)) {
+ return;
+ }
+
+ this.updateOptions({
+ renderSideBySide: EditorWebIdeExtension.renderSideBySide(this.getDomNode()),
+ });
+ }
+
+ replaceSelectedText(text) {
+ let selection = this.getSelection();
+ const range = new Range(
+ selection.startLineNumber,
+ selection.startColumn,
+ selection.endLineNumber,
+ selection.endColumn,
+ );
+
+ this.executeEdits('', [{ range, text }]);
+
+ selection = this.getSelection();
+ this.setPosition({ lineNumber: selection.endLineNumber, column: selection.endColumn });
+ }
+
+ static renderSideBySide(domElement) {
+ return domElement.offsetWidth >= 700;
+ }
+}
diff --git a/app/assets/javascripts/emoji/components/category.vue b/app/assets/javascripts/emoji/components/category.vue
new file mode 100644
index 00000000000..a11122d5403
--- /dev/null
+++ b/app/assets/javascripts/emoji/components/category.vue
@@ -0,0 +1,61 @@
+<script>
+import { GlIntersectionObserver } from '@gitlab/ui';
+import { capitalizeFirstCharacter } from '~/lib/utils/text_utility';
+import EmojiGroup from './emoji_group.vue';
+
+export default {
+ components: {
+ GlIntersectionObserver,
+ EmojiGroup,
+ },
+ props: {
+ category: {
+ type: String,
+ required: true,
+ },
+ emojis: {
+ type: Array,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ renderGroup: false,
+ };
+ },
+ computed: {
+ categoryTitle() {
+ return capitalizeFirstCharacter(this.category);
+ },
+ },
+ methods: {
+ categoryAppeared() {
+ this.renderGroup = true;
+ this.$emit('appear', this.category);
+ },
+ categoryDissappeared() {
+ this.renderGroup = false;
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-intersection-observer class="gl-px-5 gl-h-full" @appear="categoryAppeared">
+ <div class="gl-top-0 gl-py-3 gl-w-full emoji-picker-category-header">
+ <b>{{ categoryTitle }}</b>
+ </div>
+ <template v-if="emojis.length">
+ <emoji-group
+ v-for="(emojiGroup, index) in emojis"
+ :key="index"
+ :emojis="emojiGroup"
+ :render-group="renderGroup"
+ :click-emoji="(emoji) => $emit('click', emoji)"
+ />
+ </template>
+ <p v-else>
+ {{ s__('AwardEmoji|No emojis found.') }}
+ </p>
+ </gl-intersection-observer>
+</template>
diff --git a/app/assets/javascripts/emoji/components/emoji_group.vue b/app/assets/javascripts/emoji/components/emoji_group.vue
new file mode 100644
index 00000000000..539cd6963b1
--- /dev/null
+++ b/app/assets/javascripts/emoji/components/emoji_group.vue
@@ -0,0 +1,35 @@
+<script>
+export default {
+ props: {
+ emojis: {
+ type: Array,
+ required: true,
+ },
+ renderGroup: {
+ type: Boolean,
+ required: true,
+ },
+ clickEmoji: {
+ type: Function,
+ required: true,
+ },
+ },
+};
+</script>
+
+<template functional>
+ <div class="gl-display-flex gl-flex-wrap gl-mb-2">
+ <template v-if="props.renderGroup">
+ <button
+ v-for="emoji in props.emojis"
+ :key="emoji"
+ type="button"
+ class="gl-border-0 gl-bg-transparent gl-px-0 gl-py-2 gl-text-center emoji-picker-emoji"
+ data-testid="emoji-button"
+ @click="props.clickEmoji(emoji)"
+ >
+ <gl-emoji :data-name="emoji" />
+ </button>
+ </template>
+ </div>
+</template>
diff --git a/app/assets/javascripts/emoji/components/emoji_list.vue b/app/assets/javascripts/emoji/components/emoji_list.vue
new file mode 100644
index 00000000000..0d73d751c6d
--- /dev/null
+++ b/app/assets/javascripts/emoji/components/emoji_list.vue
@@ -0,0 +1,44 @@
+<script>
+import { chunk } from 'lodash';
+import { searchEmoji } from '~/emoji';
+import { EMOJIS_PER_ROW } from '../constants';
+import { getEmojiCategories, generateCategoryHeight } from './utils';
+
+export default {
+ props: {
+ searchValue: {
+ type: String,
+ required: true,
+ },
+ },
+ data() {
+ return { render: false };
+ },
+ computed: {
+ filteredCategories() {
+ if (this.searchValue !== '') {
+ const emojis = chunk(
+ searchEmoji(this.searchValue).map(({ emoji }) => emoji.name),
+ EMOJIS_PER_ROW,
+ );
+
+ return {
+ search: { emojis, height: generateCategoryHeight(emojis.length) },
+ };
+ }
+
+ return this.categories;
+ },
+ },
+ async mounted() {
+ this.categories = await getEmojiCategories();
+ this.render = true;
+ },
+};
+</script>
+
+<template>
+ <div v-if="render">
+ <slot :filtered-categories="filteredCategories"></slot>
+ </div>
+</template>
diff --git a/app/assets/javascripts/emoji/components/picker.vue b/app/assets/javascripts/emoji/components/picker.vue
new file mode 100644
index 00000000000..7cd20d82329
--- /dev/null
+++ b/app/assets/javascripts/emoji/components/picker.vue
@@ -0,0 +1,121 @@
+<script>
+import { GlIcon, GlDropdown, GlSearchBoxByType } from '@gitlab/ui';
+import VirtualList from 'vue-virtual-scroll-list';
+import { CATEGORY_NAMES } from '~/emoji';
+import { CATEGORY_ICON_MAP } from '../constants';
+import Category from './category.vue';
+import EmojiList from './emoji_list.vue';
+import { getEmojiCategories } from './utils';
+
+export default {
+ components: {
+ GlIcon,
+ GlDropdown,
+ GlSearchBoxByType,
+ VirtualList,
+ Category,
+ EmojiList,
+ },
+ props: {
+ toggleClass: {
+ type: [Array, String, Object],
+ required: false,
+ default: () => [],
+ },
+ },
+ data() {
+ return {
+ currentCategory: null,
+ searchValue: '',
+ };
+ },
+ computed: {
+ categoryNames() {
+ return CATEGORY_NAMES.map((category) => ({
+ name: category,
+ icon: CATEGORY_ICON_MAP[category],
+ }));
+ },
+ },
+ methods: {
+ categoryAppeared(category) {
+ this.currentCategory = category;
+ },
+ async scrollToCategory(categoryName) {
+ const categories = await getEmojiCategories();
+ const { top } = categories[categoryName];
+
+ this.$refs.virtualScoller.setScrollTop(top);
+ },
+ selectEmoji(name) {
+ this.$emit('click', name);
+ this.$refs.dropdown.hide();
+ },
+ getBoundaryElement() {
+ return document.querySelector('.content-wrapper') || 'scrollParent';
+ },
+ onSearchInput() {
+ this.$refs.virtualScoller.setScrollTop(0);
+ this.$refs.virtualScoller.forceRender();
+ },
+ },
+};
+</script>
+
+<template>
+ <div class="emoji-picker">
+ <gl-dropdown
+ ref="dropdown"
+ :toggle-class="toggleClass"
+ :boundary="getBoundaryElement()"
+ menu-class="dropdown-extended-height"
+ no-flip
+ right
+ lazy
+ >
+ <template #button-content><slot name="button-content"></slot></template>
+ <gl-search-box-by-type
+ v-model="searchValue"
+ class="gl-mx-5! gl-mb-2!"
+ autofocus
+ debounce="500"
+ @input="onSearchInput"
+ />
+ <div
+ v-show="!searchValue"
+ class="gl-display-flex gl-mx-5 gl-border-b-solid gl-border-gray-100 gl-border-b-1"
+ >
+ <button
+ v-for="category in categoryNames"
+ :key="category.name"
+ :class="{
+ 'gl-text-black-normal! emoji-picker-category-active': category.name === currentCategory,
+ }"
+ type="button"
+ class="gl-border-0 gl-border-b-2 gl-border-b-solid gl-flex-fill-1 gl-text-gray-300 gl-pt-3 gl-pb-3 gl-bg-transparent emoji-picker-category-tab"
+ @click="scrollToCategory(category.name)"
+ >
+ <gl-icon :name="category.icon" :size="12" />
+ </button>
+ </div>
+ <emoji-list :search-value="searchValue">
+ <template #default="{ filteredCategories }">
+ <virtual-list ref="virtualScoller" :size="258" :remain="1" :bench="2" variable>
+ <div
+ v-for="(category, categoryKey) in filteredCategories"
+ :key="categoryKey"
+ :style="{ height: category.height + 'px' }"
+ >
+ <category
+ :category="categoryKey"
+ :emojis="category.emojis"
+ @appear="categoryAppeared"
+ @click="selectEmoji"
+ />
+ </div>
+ </virtual-list>
+ </template>
+ </emoji-list>
+ </gl-dropdown>
+ </div>
+</template>
diff --git a/app/assets/javascripts/emoji/components/utils.js b/app/assets/javascripts/emoji/components/utils.js
new file mode 100644
index 00000000000..b95b56a1d6f
--- /dev/null
+++ b/app/assets/javascripts/emoji/components/utils.js
@@ -0,0 +1,27 @@
+import { chunk, memoize } from 'lodash';
+import { initEmojiMap, getEmojiCategoryMap } from '~/emoji';
+import { EMOJIS_PER_ROW, EMOJI_ROW_HEIGHT, CATEGORY_ROW_HEIGHT } from '../constants';
+
+export const generateCategoryHeight = (emojisLength) =>
+ emojisLength * EMOJI_ROW_HEIGHT + CATEGORY_ROW_HEIGHT;
+
+export const getEmojiCategories = memoize(async () => {
+ await initEmojiMap();
+
+ const categories = await getEmojiCategoryMap();
+ let top = 0;
+
+ return Object.freeze(
+ Object.keys(categories).reduce((acc, category) => {
+ const emojis = chunk(categories[category], EMOJIS_PER_ROW);
+ const height = generateCategoryHeight(emojis.length);
+ const newAcc = {
+ ...acc,
+ [category]: { emojis, height, top },
+ };
+ top += height;
+
+ return newAcc;
+ }, {}),
+ );
+});
diff --git a/app/assets/javascripts/emoji/constants.js b/app/assets/javascripts/emoji/constants.js
new file mode 100644
index 00000000000..bf73d1ca5a9
--- /dev/null
+++ b/app/assets/javascripts/emoji/constants.js
@@ -0,0 +1,14 @@
+export const CATEGORY_ICON_MAP = {
+ activity: 'dumbbell',
+ people: 'smiley',
+ nature: 'nature',
+ food: 'food',
+ travel: 'car',
+ objects: 'object',
+ symbols: 'heart',
+ flags: 'flag',
+};
+
+export const EMOJIS_PER_ROW = 9;
+export const EMOJI_ROW_HEIGHT = 34;
+export const CATEGORY_ROW_HEIGHT = 37;
diff --git a/app/assets/javascripts/emoji/index.js b/app/assets/javascripts/emoji/index.js
index d022fcbeabe..d3b658a4020 100644
--- a/app/assets/javascripts/emoji/index.js
+++ b/app/assets/javascripts/emoji/index.js
@@ -2,6 +2,7 @@ import { escape, minBy } from 'lodash';
import emojiAliases from 'emojis/aliases.json';
import AccessorUtilities from '../lib/utils/accessor';
import axios from '../lib/utils/axios_utils';
+import { CATEGORY_ICON_MAP } from './constants';
let emojiMap = null;
let validEmojiNames = null;
@@ -155,19 +156,14 @@ export function sortEmoji(items) {
return [...items].sort((a, b) => a.score - b.score || a.fieldValue.localeCompare(b.fieldValue));
}
+export const CATEGORY_NAMES = Object.keys(CATEGORY_ICON_MAP);
+
let emojiCategoryMap;
export function getEmojiCategoryMap() {
if (!emojiCategoryMap) {
- emojiCategoryMap = {
- activity: [],
- people: [],
- nature: [],
- food: [],
- travel: [],
- objects: [],
- symbols: [],
- flags: [],
- };
+ emojiCategoryMap = CATEGORY_NAMES.reduce((acc, category) => {
+ return { ...acc, [category]: [] };
+ }, {});
Object.keys(emojiMap).forEach((name) => {
const emoji = emojiMap[name];
if (emojiCategoryMap[emoji.c]) {
diff --git a/app/assets/javascripts/environments/components/environments_app.vue b/app/assets/javascripts/environments/components/environments_app.vue
index ed852895f10..602639f09a6 100644
--- a/app/assets/javascripts/environments/components/environments_app.vue
+++ b/app/assets/javascripts/environments/components/environments_app.vue
@@ -85,7 +85,7 @@ export default {
this.store.updateEnvironmentProp(folder, 'isLoadingFolderContent', showLoader);
this.service
- .getFolderContent(folder.folder_path)
+ .getFolderContent(folder.folder_path, folder.state)
.then((response) => this.store.setfolderContent(folder, response.data.environments))
.then(() => this.store.updateEnvironmentProp(folder, 'isLoadingFolderContent', false))
.catch(() => {
@@ -129,7 +129,7 @@ export default {
:href="newEnvironmentPath"
data-testid="new-environment"
category="primary"
- variant="success"
+ variant="confirm"
>{{ $options.i18n.newEnvironmentButtonLabel }}</gl-button
>
</div>
@@ -164,7 +164,7 @@ export default {
:href="newEnvironmentPath"
data-testid="new-environment"
category="primary"
- variant="success"
+ variant="confirm"
>{{ $options.i18n.newEnvironmentButtonLabel }}</gl-button
>
</div>
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 b62fe196a6f..a76c8e445ed 100644
--- a/app/assets/javascripts/environments/mixins/environments_pagination_api_mixin.js
+++ b/app/assets/javascripts/environments/mixins/environments_pagination_api_mixin.js
@@ -16,6 +16,7 @@ export default {
let params = {
scope,
page: '1',
+ nested: true,
};
params = this.onChangeWithFilter(params);
@@ -27,6 +28,7 @@ export default {
/* URLS parameters are strings, we need to parse to match types */
let params = {
page: Number(page).toString(),
+ nested: true,
};
if (this.scope) {
diff --git a/app/assets/javascripts/environments/services/environments_service.js b/app/assets/javascripts/environments/services/environments_service.js
index 122c8f84a2c..dbd82a3c985 100644
--- a/app/assets/javascripts/environments/services/environments_service.js
+++ b/app/assets/javascripts/environments/services/environments_service.js
@@ -21,7 +21,7 @@ export default class EnvironmentsService {
return axios.delete(endpoint, {});
}
- getFolderContent(folderUrl) {
- return axios.get(`${folderUrl}.json?per_page=${this.folderResults}`);
+ getFolderContent(folderUrl, scope) {
+ return axios.get(`${folderUrl}.json?per_page=${this.folderResults}&scope=${scope}`);
}
}
diff --git a/app/assets/javascripts/experimentation/constants.js b/app/assets/javascripts/experimentation/constants.js
new file mode 100644
index 00000000000..b7e61d43b11
--- /dev/null
+++ b/app/assets/javascripts/experimentation/constants.js
@@ -0,0 +1 @@
+export const TRACKING_CONTEXT_SCHEMA = 'iglu:com.gitlab/gitlab_experiment/jsonschema/1-0-0';
diff --git a/app/assets/javascripts/experimentation/experiment_tracking.js b/app/assets/javascripts/experimentation/experiment_tracking.js
new file mode 100644
index 00000000000..c721828036e
--- /dev/null
+++ b/app/assets/javascripts/experimentation/experiment_tracking.js
@@ -0,0 +1,24 @@
+import Tracking from '~/tracking';
+import { TRACKING_CONTEXT_SCHEMA } from './constants';
+import { getExperimentData } from './utils';
+
+export default class ExperimentTracking {
+ constructor(experimentName, trackingArgs = {}) {
+ this.trackingArgs = trackingArgs;
+ this.data = getExperimentData(experimentName);
+ }
+
+ event(action) {
+ if (!this.data) {
+ return false;
+ }
+
+ return Tracking.event(document.body.dataset.page, action, {
+ ...this.trackingArgs,
+ context: {
+ schema: TRACKING_CONTEXT_SCHEMA,
+ data: this.data,
+ },
+ });
+ }
+}
diff --git a/app/assets/javascripts/experimentation/utils.js b/app/assets/javascripts/experimentation/utils.js
new file mode 100644
index 00000000000..d3e7800f643
--- /dev/null
+++ b/app/assets/javascripts/experimentation/utils.js
@@ -0,0 +1,10 @@
+// This file only applies to use of experiments through https://gitlab.com/gitlab-org/gitlab-experiment
+import { get } from 'lodash';
+
+export function getExperimentData(experimentName) {
+ return get(window, ['gon', 'experiment', experimentName]);
+}
+
+export function isExperimentVariant(experimentName, variantName) {
+ return getExperimentData(experimentName)?.variant === variantName;
+}
diff --git a/app/assets/javascripts/feature_flags/components/configure_feature_flags_modal.vue b/app/assets/javascripts/feature_flags/components/configure_feature_flags_modal.vue
index 5fcca11e695..77e40039b43 100644
--- a/app/assets/javascripts/feature_flags/components/configure_feature_flags_modal.vue
+++ b/app/assets/javascripts/feature_flags/components/configure_feature_flags_modal.vue
@@ -84,6 +84,11 @@ export default {
cancelActionProps() {
return {
text: this.$options.translations.cancelActionLabel,
+ attributes: [
+ {
+ category: 'secondary',
+ },
+ ],
};
},
canRegenerateInstanceId() {
@@ -120,11 +125,11 @@ export default {
<template>
<gl-modal
:modal-id="modalId"
- :action-cancel="cancelActionProps"
- :action-primary="regenerateInstanceIdActionProps"
- @canceled="clearState"
+ :action-primary="cancelActionProps"
+ :action-secondary="regenerateInstanceIdActionProps"
+ @secondary.prevent="rotateToken"
@hide="clearState"
- @primary.prevent="rotateToken"
+ @primary="clearState"
>
<template #modal-title>
{{ $options.translations.modalTitle }}
diff --git a/app/assets/javascripts/feature_flags/components/edit_feature_flag.vue b/app/assets/javascripts/feature_flags/components/edit_feature_flag.vue
index b1e60066e11..e7f4b51c964 100644
--- a/app/assets/javascripts/feature_flags/components/edit_feature_flag.vue
+++ b/app/assets/javascripts/feature_flags/components/edit_feature_flag.vue
@@ -86,6 +86,8 @@ export default {
data-track-event="click_button"
data-track-label="feature_flag_toggle"
class="gl-mr-4"
+ :label="__('Feature flag status')"
+ label-position="hidden"
@change="toggleActive"
/>
<h3 class="page-title gl-m-0">{{ title }}</h3>
diff --git a/app/assets/javascripts/feature_flags/components/feature_flags.vue b/app/assets/javascripts/feature_flags/components/feature_flags.vue
index 348b71dc1c6..115d68de5c9 100644
--- a/app/assets/javascripts/feature_flags/components/feature_flags.vue
+++ b/app/assets/javascripts/feature_flags/components/feature_flags.vue
@@ -213,7 +213,7 @@ export default {
<gl-button
v-if="newUserListPath"
:href="newUserListPath"
- variant="success"
+ variant="confirm"
category="secondary"
class="gl-mb-3"
data-testid="ff-new-list-button"
@@ -224,7 +224,7 @@ export default {
<gl-button
v-if="hasNewPath"
:href="featureFlagsLimitExceeded ? '' : newFeatureFlagPath"
- variant="success"
+ variant="confirm"
data-testid="ff-new-button"
@click="onNewFeatureFlagCLick"
>
@@ -301,7 +301,7 @@ export default {
<gl-button
v-if="newUserListPath"
:href="newUserListPath"
- variant="success"
+ variant="confirm"
category="secondary"
class="gl-mb-0 gl-mr-4"
data-testid="ff-new-list-button"
@@ -312,7 +312,7 @@ export default {
<gl-button
v-if="hasNewPath"
:href="featureFlagsLimitExceeded ? '' : newFeatureFlagPath"
- variant="success"
+ variant="confirm"
data-testid="ff-new-button"
@click="onNewFeatureFlagCLick"
>
diff --git a/app/assets/javascripts/flash.js b/app/assets/javascripts/flash.js
index d14af53746e..d26a6bc5f6b 100644
--- a/app/assets/javascripts/flash.js
+++ b/app/assets/javascripts/flash.js
@@ -1,5 +1,5 @@
+import * as Sentry from '@sentry/browser';
import { escape } from 'lodash';
-import * as Sentry from '~/sentry/wrapper';
import { spriteIcon } from './lib/utils/common_utils';
const FLASH_TYPES = {
diff --git a/app/assets/javascripts/gfm_auto_complete.js b/app/assets/javascripts/gfm_auto_complete.js
index d209a971c39..c5ea4cc92fd 100644
--- a/app/assets/javascripts/gfm_auto_complete.js
+++ b/app/assets/javascripts/gfm_auto_complete.js
@@ -3,11 +3,12 @@ import '~/lib/utils/jquery_at_who';
import { escape, template } from 'lodash';
import * as Emoji from '~/emoji';
import axios from '~/lib/utils/axios_utils';
-import { s__ } from '~/locale';
+import { s__, __, sprintf } from '~/locale';
import { isUserBusy } from '~/set_status_modal/utils';
import SidebarMediator from '~/sidebar/sidebar_mediator';
import AjaxCache from './lib/utils/ajax_cache';
import { spriteIcon } from './lib/utils/common_utils';
+import { parsePikadayDate } from './lib/utils/datetime_utility';
import glRegexp from './lib/utils/regexp';
function sanitize(str) {
@@ -266,6 +267,7 @@ class GfmAutoComplete {
},
// eslint-disable-next-line no-template-curly-in-string
insertTpl: '${atwho-at}${username}',
+ limit: 10,
searchKey: 'search',
alwaysHighlightFirst: true,
skipSpecialCharacterTest: true,
@@ -311,6 +313,38 @@ class GfmAutoComplete {
return data;
},
+ sorter(query, items) {
+ // Disable auto-selecting the loading icon
+ this.setting.highlightFirst = this.setting.alwaysHighlightFirst;
+ if (GfmAutoComplete.isLoading(items)) {
+ this.setting.highlightFirst = false;
+ return items;
+ }
+
+ if (!query) {
+ return items;
+ }
+
+ const lowercaseQuery = query.toLowerCase();
+ const members = items.slice();
+ const { nameOrUsernameStartsWith, nameOrUsernameIncludes } = GfmAutoComplete.Members;
+
+ return members.sort((a, b) => {
+ if (nameOrUsernameStartsWith(a, lowercaseQuery)) {
+ return -1;
+ }
+ if (nameOrUsernameStartsWith(b, lowercaseQuery)) {
+ return 1;
+ }
+ if (nameOrUsernameIncludes(a, lowercaseQuery)) {
+ return -1;
+ }
+ if (nameOrUsernameIncludes(b, lowercaseQuery)) {
+ return 1;
+ }
+ return 0;
+ });
+ },
},
});
}
@@ -359,7 +393,7 @@ class GfmAutoComplete {
displayTpl(value) {
let tmpl = GfmAutoComplete.Loading.template;
if (value.title != null) {
- tmpl = GfmAutoComplete.Milestones.templateFunction(value.title);
+ tmpl = GfmAutoComplete.Milestones.templateFunction(value.title, value.expired);
}
return tmpl;
},
@@ -367,16 +401,39 @@ class GfmAutoComplete {
callbacks: {
...this.getDefaultCallbacks(),
beforeSave(milestones) {
- return $.map(milestones, (m) => {
+ const parsedMilestones = $.map(milestones, (m) => {
if (m.title == null) {
return m;
}
+
+ const dueDate = m.due_date ? parsePikadayDate(m.due_date) : null;
+ const expired = dueDate ? Date.now() > dueDate.getTime() : false;
+
return {
id: m.iid,
title: sanitize(m.title),
search: m.title,
+ expired,
+ dueDate,
};
});
+
+ // Sort milestones by due date when present.
+ if (typeof parsedMilestones[0] === 'object') {
+ return parsedMilestones.sort((mA, mB) => {
+ // Move all expired milestones to the bottom.
+ if (mA.expired) return 1;
+ if (mB.expired) return -1;
+
+ // Move milestones without due dates just above expired milestones.
+ if (!mA.dueDate) return 1;
+ if (!mB.dueDate) return -1;
+
+ // Sort by due date in ascending order.
+ return mA.dueDate - mB.dueDate;
+ });
+ }
+ return parsedMilestones;
},
},
});
@@ -772,6 +829,14 @@ GfmAutoComplete.Members = {
title,
)}${availabilityStatus}</small> ${icon}</li>`;
},
+ nameOrUsernameStartsWith(member, query) {
+ // `member.search` is a name:username string like `MargeSimpson msimpson`
+ return member.search.split(' ').some((name) => name.toLowerCase().startsWith(query));
+ },
+ nameOrUsernameIncludes(member, query) {
+ // `member.search` is a name:username string like `MargeSimpson msimpson`
+ return member.search.toLowerCase().includes(query);
+ },
};
GfmAutoComplete.Labels = {
templateFunction(color, title) {
@@ -792,7 +857,12 @@ GfmAutoComplete.Issues = {
};
// Milestones
GfmAutoComplete.Milestones = {
- templateFunction(title) {
+ templateFunction(title, expired) {
+ if (expired) {
+ return `<li>${sprintf(__('%{milestone} (expired)'), {
+ milestone: escape(title),
+ })}</li>`;
+ }
return `<li>${escape(title)}</li>`;
},
};
diff --git a/app/assets/javascripts/graphql_shared/fragments/alert.fragment.graphql b/app/assets/javascripts/graphql_shared/fragments/alert.fragment.graphql
index 62119177887..101633ef7a7 100644
--- a/app/assets/javascripts/graphql_shared/fragments/alert.fragment.graphql
+++ b/app/assets/javascripts/graphql_shared/fragments/alert.fragment.graphql
@@ -5,7 +5,11 @@ fragment AlertListItem on AlertManagementAlert {
status
startedAt
eventCount
- issueIid
+ issue {
+ iid
+ state
+ title
+ }
assignees {
nodes {
name
diff --git a/app/assets/javascripts/graphql_shared/queries/project_user_members_search.query.graphql b/app/assets/javascripts/graphql_shared/queries/project_user_members_search.query.graphql
new file mode 100644
index 00000000000..1d9497d65ce
--- /dev/null
+++ b/app/assets/javascripts/graphql_shared/queries/project_user_members_search.query.graphql
@@ -0,0 +1,14 @@
+query searchProjectMembers($fullPath: ID!, $search: String) {
+ project(fullPath: $fullPath) {
+ projectMembers(search: $search) {
+ nodes {
+ user {
+ id
+ name
+ username
+ avatarUrl
+ }
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/graphql_shared/queries/users_search.query.graphql b/app/assets/javascripts/graphql_shared/queries/users_search.query.graphql
index b64ceb8e2c9..aaaaf3485ad 100644
--- a/app/assets/javascripts/graphql_shared/queries/users_search.query.graphql
+++ b/app/assets/javascripts/graphql_shared/queries/users_search.query.graphql
@@ -1,9 +1,13 @@
#import "../fragments/user.fragment.graphql"
-query usersSearch($search: String!) {
- users(search: $search) {
- nodes {
- ...User
+query usersSearch($search: String!, $fullPath: ID!) {
+ workspace: project(fullPath: $fullPath) {
+ users: projectMembers(search: $search) {
+ nodes {
+ user {
+ ...User
+ }
+ }
}
}
}
diff --git a/app/assets/javascripts/graphql_shared/utils.js b/app/assets/javascripts/graphql_shared/utils.js
index 4715bbc94f6..e64e8009a5f 100644
--- a/app/assets/javascripts/graphql_shared/utils.js
+++ b/app/assets/javascripts/graphql_shared/utils.js
@@ -1,3 +1,5 @@
+import { isArray } from 'lodash';
+
/**
* Ids generated by GraphQL endpoints are usually in the format
* gid://gitlab/Environments/123. This method extracts Id number
@@ -52,3 +54,35 @@ export const convertToGraphQLId = (type, id) => {
* @returns {Array}
*/
export const convertToGraphQLIds = (type, ids) => ids.map((id) => convertToGraphQLId(type, id));
+
+/**
+ * Ids generated by GraphQL endpoints are usually in the format
+ * gid://gitlab/Groups/123. This method takes an array of
+ * GraphQL Ids and converts them to a number.
+ *
+ * @param {Array} ids An array of GraphQL IDs
+ * @returns {Array}
+ */
+export const convertFromGraphQLIds = (ids) => {
+ if (!isArray(ids)) {
+ throw new TypeError(`ids must be an array; got ${typeof ids}`);
+ }
+
+ return ids.map((id) => getIdFromGraphQLId(id));
+};
+
+/**
+ * Ids generated by GraphQL endpoints are usually in the format
+ * gid://gitlab/Groups/123. This method takes an array of nodes
+ * and converts the `id` properties from a GraphQL Id to a number.
+ *
+ * @param {Array} nodes An array of nodes with an `id` property
+ * @returns {Array}
+ */
+export const convertNodeIdsFromGraphQLIds = (nodes) => {
+ if (!isArray(nodes)) {
+ throw new TypeError(`nodes must be an array; got ${typeof nodes}`);
+ }
+
+ return nodes.map((node) => (node.id ? { ...node, id: getIdFromGraphQLId(node.id) } : node));
+};
diff --git a/app/assets/javascripts/groups/components/group_item.vue b/app/assets/javascripts/groups/components/group_item.vue
index d41fa0b2410..9d46fcec09b 100644
--- a/app/assets/javascripts/groups/components/group_item.vue
+++ b/app/assets/javascripts/groups/components/group_item.vue
@@ -1,29 +1,36 @@
<script>
-/* eslint-disable vue/no-v-html */
-import { GlLoadingIcon, GlBadge, GlTooltipDirective } from '@gitlab/ui';
-import { visitUrl } from '../../lib/utils/url_utility';
-import identicon from '../../vue_shared/components/identicon.vue';
+import {
+ GlLoadingIcon,
+ GlBadge,
+ GlIcon,
+ GlTooltipDirective,
+ GlSafeHtmlDirective,
+} from '@gitlab/ui';
+import { visitUrl } from '~/lib/utils/url_utility';
+import identicon from '~/vue_shared/components/identicon.vue';
+import UserAccessRoleBadge from '~/vue_shared/components/user_access_role_badge.vue';
import { VISIBILITY_TYPE_ICON, GROUP_VISIBILITY_TYPE } from '../constants';
import eventHub from '../event_hub';
import itemActions from './item_actions.vue';
import itemCaret from './item_caret.vue';
import itemStats from './item_stats.vue';
-import itemStatsValue from './item_stats_value.vue';
import itemTypeIcon from './item_type_icon.vue';
export default {
directives: {
GlTooltip: GlTooltipDirective,
+ SafeHtml: GlSafeHtmlDirective,
},
components: {
GlBadge,
GlLoadingIcon,
+ GlIcon,
+ UserAccessRoleBadge,
identicon,
itemCaret,
itemTypeIcon,
itemStats,
- itemStatsValue,
itemActions,
},
props: {
@@ -91,6 +98,7 @@ export default {
}
},
},
+ safeHtmlConfig: { ADD_TAGS: ['gl-emoji'] },
};
</script>
@@ -140,28 +148,31 @@ export default {
data-testid="group-name"
:href="group.relativePath"
:title="group.fullName"
- class="no-expand gl-mt-3 gl-mr-3 gl-text-gray-900!"
+ class="no-expand gl-mr-3 gl-mt-3 gl-text-gray-900!"
:itemprop="microdata.nameItemprop"
- >{{
+ >
+ {{
// ending bracket must be by closing tag to prevent
// link hover text-decoration from over-extending
group.name
- }}</a
- >
- <item-stats-value
- :icon-name="visibilityIcon"
+ }}
+ </a>
+ <gl-icon
+ v-gl-tooltip.hover.bottom
+ class="gl-display-inline-flex gl-align-items-center gl-mr-3 gl-mt-3 gl-text-gray-500"
+ :name="visibilityIcon"
:title="visibilityTooltip"
- css-class="item-visibility d-inline-flex align-items-center gl-mt-3 gl-mr-2 text-secondary"
+ data-testid="group-visibility-icon"
/>
- <span v-if="group.permission" class="user-access-role gl-mt-3">
+ <user-access-role-badge v-if="group.permission" class="gl-mt-3">
{{ group.permission }}
- </span>
+ </user-access-role-badge>
</div>
<div v-if="group.description" class="description">
<span
+ v-safe-html:[$options.safeHtmlConfig]="group.description"
:itemprop="microdata.descriptionItemprop"
data-testid="group-description"
- v-html="group.description"
>
</span>
</div>
diff --git a/app/assets/javascripts/groups/components/invite_members_banner.vue b/app/assets/javascripts/groups/components/invite_members_banner.vue
index 81c5e3ce85d..747cea6a46e 100644
--- a/app/assets/javascripts/groups/components/invite_members_banner.vue
+++ b/app/assets/javascripts/groups/components/invite_members_banner.vue
@@ -35,7 +35,9 @@ export default {
this.track(this.$options.dismissEvent);
},
trackOnShow() {
- if (!this.isDismissed) this.track(this.$options.displayEvent);
+ this.$nextTick(() => {
+ if (!this.isDismissed) this.track(this.$options.displayEvent);
+ });
},
addTrackingAttributesToButton() {
if (this.$refs.banner === undefined) return;
diff --git a/app/assets/javascripts/groups/components/item_caret.vue b/app/assets/javascripts/groups/components/item_caret.vue
index e23b0fa7413..9c379d7bf9b 100644
--- a/app/assets/javascripts/groups/components/item_caret.vue
+++ b/app/assets/javascripts/groups/components/item_caret.vue
@@ -21,5 +21,7 @@ export default {
</script>
<template>
- <span class="folder-caret gl-mr-2"> <gl-icon :size="10" :name="iconClass" /> </span>
+ <span class="folder-caret gl-mr-2">
+ <gl-icon :size="10" :name="iconClass" use-deprecated-sizes />
+ </span>
</template>
diff --git a/app/assets/javascripts/groups_select.js b/app/assets/javascripts/groups_select.js
index da2890f91fc..93fbbf07ae2 100644
--- a/app/assets/javascripts/groups_select.js
+++ b/app/assets/javascripts/groups_select.js
@@ -2,30 +2,8 @@ import $ from 'jquery';
import { escape } from 'lodash';
import { __ } from '~/locale';
import Api from './api';
-import axios from './lib/utils/axios_utils';
-import { normalizeHeaders } from './lib/utils/common_utils';
import { loadCSSFile } from './lib/utils/css_utils';
-
-const fetchGroups = (params) => {
- axios[params.type.toLowerCase()](params.url, {
- params: params.data,
- })
- .then((res) => {
- const results = res.data || [];
- const headers = normalizeHeaders(res.headers);
- const currentPage = parseInt(headers['X-PAGE'], 10) || 0;
- const totalPages = parseInt(headers['X-TOTAL-PAGES'], 10) || 0;
- const more = currentPage < totalPages;
-
- params.success({
- results,
- pagination: {
- more,
- },
- });
- })
- .catch(params.error);
-};
+import { select2AxiosTransport } from './lib/utils/select2_utils';
const groupsSelect = () => {
loadCSSFile(gon.select2_css_path)
@@ -51,9 +29,7 @@ const groupsSelect = () => {
url: Api.buildUrl(groupsPath),
dataType: 'json',
quietMillis: 250,
- transport(params) {
- fetchGroups(params);
- },
+ transport: select2AxiosTransport,
data(search, page) {
return {
search,
@@ -63,8 +39,6 @@ const groupsSelect = () => {
};
},
results(data, page) {
- if (data.length) return { results: [] };
-
const groups = data.length ? data : data.results || [];
const more = data.pagination ? data.pagination.more : false;
const results = groups.filter((group) => skipGroups.indexOf(group.id) === -1);
diff --git a/app/assets/javascripts/helpers/cve_id_request_helper.js b/app/assets/javascripts/helpers/cve_id_request_helper.js
new file mode 100644
index 00000000000..71d3fd4c4fe
--- /dev/null
+++ b/app/assets/javascripts/helpers/cve_id_request_helper.js
@@ -0,0 +1,50 @@
+export function createCveIdRequestIssueBody(fullPath, iid) {
+ return `### Vulnerability Submission
+
+**NOTE:** Only maintainers of GitLab-hosted projects may request a CVE for
+a vulnerability within their project.
+
+Project issue: ${fullPath}#${iid}
+
+#### Publishing Schedule
+
+After a CVE request is validated, a CVE identifier will be assigned. On what
+schedule should the details of the CVE be published?
+
+* [ ] Publish immediately
+* [ ] Wait to publish
+
+<!--
+Please fill out the yaml codeblock below
+-->
+
+\`\`\`yaml
+reporter:
+ name: "TODO" # "First Last"
+ email: "TODO" # "email@domain.tld"
+vulnerability:
+ description: "TODO" # "[VULNTYPE] in [COMPONENT] in [VENDOR][PRODUCT] [VERSION] allows [ATTACKER] to [IMPACT] via [VECTOR]"
+ cwe: "TODO" # "CWE-22" # Path Traversal
+ product:
+ gitlab_path: "${fullPath}"
+ vendor: "TODO" # "Deluxe Sandwich Maker Company"
+ name: "TODO" # "Deluxe Sandwich Maker 2"
+ affected_versions:
+ - "TODO" # "1.2.3"
+ - "TODO" # ">1.3.0, <=1.3.9"
+ fixed_versions:
+ - "TODO" # "1.2.4"
+ - "TODO" # "1.3.10"
+ impact: "TODO" # "CVSS v3 string" # https://nvd.nist.gov/vuln-metrics/cvss/v3-calculator
+ solution: "TODO" # "Upgrade to version 1.2.4 or 1.3.10"
+ credit: "TODO"
+ references:
+ - "TODO" # "https://some.domain.tld/a/reference"
+\`\`\`
+
+CVSS scores can be computed by means of the [NVD CVSS Calculator](https://nvd.nist.gov/vuln-metrics/cvss/v3-calculator).
+
+/relate ${fullPath}#${iid}
+/label ~"devops::secure" ~"group::vulnerability research" ~"vulnerability research::cve" ~"advisory::queued"
+ `;
+}
diff --git a/app/assets/javascripts/ide/components/branches/item.vue b/app/assets/javascripts/ide/components/branches/item.vue
index 2fe435b92ab..35e2f99cb6a 100644
--- a/app/assets/javascripts/ide/components/branches/item.vue
+++ b/app/assets/javascripts/ide/components/branches/item.vue
@@ -34,7 +34,7 @@ export default {
<template>
<a :href="branchHref" class="btn-link d-flex align-items-center">
<span class="d-flex gl-mr-3 ide-search-list-current-icon">
- <gl-icon v-if="isActive" :size="18" name="mobile-issue-close" />
+ <gl-icon v-if="isActive" :size="18" name="mobile-issue-close" use-deprecated-sizes />
</span>
<span>
<strong> {{ item.name }} </strong>
diff --git a/app/assets/javascripts/ide/components/branches/search_list.vue b/app/assets/javascripts/ide/components/branches/search_list.vue
index 1ae7cf9339d..5e93b7c1bbb 100644
--- a/app/assets/javascripts/ide/components/branches/search_list.vue
+++ b/app/assets/javascripts/ide/components/branches/search_list.vue
@@ -57,7 +57,10 @@ export default {
<template>
<div>
- <label class="dropdown-input pt-3 pb-3 mb-0 border-bottom block position-relative" @click.stop>
+ <label
+ class="dropdown-input gl-pt-3 gl-pb-5 gl-mb-0 gl-border-b-1 gl-border-b-solid gl-display-block"
+ @click.stop
+ >
<input
ref="searchInput"
v-model="search"
@@ -66,7 +69,7 @@ export default {
class="form-control dropdown-input-field"
@input="searchBranches"
/>
- <gl-icon :size="18" name="search" class="ml-3 input-icon" />
+ <gl-icon :size="18" name="search" class="ml-3 input-icon" use-deprecated-sizes />
</label>
<div class="dropdown-content ide-merge-requests-dropdown-content d-flex">
<gl-loading-icon
diff --git a/app/assets/javascripts/ide/components/file_templates/bar.vue b/app/assets/javascripts/ide/components/file_templates/bar.vue
index bd4c4f18141..0803925104d 100644
--- a/app/assets/javascripts/ide/components/file_templates/bar.vue
+++ b/app/assets/javascripts/ide/components/file_templates/bar.vue
@@ -49,7 +49,9 @@ export default {
</script>
<template>
- <div class="d-flex align-items-center ide-file-templates qa-file-templates-bar">
+ <div
+ class="d-flex align-items-center ide-file-templates qa-file-templates-bar gl-relative gl-z-index-1"
+ >
<strong class="gl-mr-3"> {{ __('File templates') }} </strong>
<dropdown
:data="templateTypes"
diff --git a/app/assets/javascripts/ide/components/merge_requests/item.vue b/app/assets/javascripts/ide/components/merge_requests/item.vue
index 7aa9a4f864a..639937481f3 100644
--- a/app/assets/javascripts/ide/components/merge_requests/item.vue
+++ b/app/assets/javascripts/ide/components/merge_requests/item.vue
@@ -41,7 +41,7 @@ export default {
<template>
<a :href="mergeRequestHref" class="btn-link d-flex align-items-center">
<span class="d-flex gl-mr-3 ide-search-list-current-icon">
- <gl-icon v-if="isActive" :size="18" name="mobile-issue-close" />
+ <gl-icon v-if="isActive" :size="18" name="mobile-issue-close" use-deprecated-sizes />
</span>
<span>
<strong> {{ item.title }} </strong>
diff --git a/app/assets/javascripts/ide/components/merge_requests/list.vue b/app/assets/javascripts/ide/components/merge_requests/list.vue
index 680e8841a1f..f7cfe80df5c 100644
--- a/app/assets/javascripts/ide/components/merge_requests/list.vue
+++ b/app/assets/javascripts/ide/components/merge_requests/list.vue
@@ -75,7 +75,10 @@ export default {
<template>
<div>
- <label class="dropdown-input pt-3 pb-3 mb-0 border-bottom block" @click.stop>
+ <label
+ class="dropdown-input gl-pt-3 gl-pb-5 gl-mb-0 gl-border-b-1 gl-border-b-solid gl-display-block"
+ @click.stop
+ >
<tokened-input
v-model="search"
:tokens="searchTokens"
@@ -84,7 +87,7 @@ export default {
@input="searchMergeRequests"
@removeToken="setSearchType(null)"
/>
- <gl-icon :size="18" name="search" class="ml-3 input-icon" />
+ <gl-icon :size="18" name="search" class="ml-3 input-icon" use-deprecated-sizes />
</label>
<div class="dropdown-content ide-merge-requests-dropdown-content d-flex">
<gl-loading-icon
@@ -102,7 +105,7 @@ export default {
@click.stop="setSearchType(searchType)"
>
<span class="d-flex gl-mr-3 ide-search-list-current-icon">
- <gl-icon :size="18" name="search" />
+ <gl-icon :size="18" name="search" use-deprecated-sizes />
</span>
<span>{{ searchType.label }}</span>
</button>
diff --git a/app/assets/javascripts/ide/components/nav_form.vue b/app/assets/javascripts/ide/components/nav_form.vue
index 62bb4841760..98f0504298b 100644
--- a/app/assets/javascripts/ide/components/nav_form.vue
+++ b/app/assets/javascripts/ide/components/nav_form.vue
@@ -1,13 +1,12 @@
<script>
-import Tab from '~/vue_shared/components/tabs/tab.vue';
-import Tabs from '~/vue_shared/components/tabs/tabs';
+import { GlTab, GlTabs } from '@gitlab/ui';
import BranchesSearchList from './branches/search_list.vue';
import MergeRequestSearchList from './merge_requests/list.vue';
export default {
components: {
- Tabs,
- Tab,
+ GlTab,
+ GlTabs,
BranchesSearchList,
MergeRequestSearchList,
},
@@ -23,20 +22,14 @@ export default {
<template>
<div class="ide-nav-form p-0">
- <tabs v-if="showMergeRequests" stop-propagation>
- <tab active>
- <template #title>
- {{ __('Branches') }}
- </template>
+ <gl-tabs v-if="showMergeRequests">
+ <gl-tab :title="__('Branches')">
<branches-search-list />
- </tab>
- <tab>
- <template #title>
- {{ __('Merge Requests') }}
- </template>
+ </gl-tab>
+ <gl-tab :title="__('Merge Requests')">
<merge-request-search-list />
- </tab>
- </tabs>
+ </gl-tab>
+ </gl-tabs>
<branches-search-list v-else />
</div>
</template>
diff --git a/app/assets/javascripts/ide/components/pipelines/list.vue b/app/assets/javascripts/ide/components/pipelines/list.vue
index 2526db0cd7b..907ac496982 100644
--- a/app/assets/javascripts/ide/components/pipelines/list.vue
+++ b/app/assets/javascripts/ide/components/pipelines/list.vue
@@ -32,7 +32,7 @@ export default {
SafeHtml,
},
computed: {
- ...mapState(['pipelinesEmptyStateSvgPath', 'links']),
+ ...mapState(['pipelinesEmptyStateSvgPath']),
...mapGetters(['currentProject']),
...mapGetters('pipelines', ['jobsCount', 'failedJobsCount', 'failedStages', 'pipelineFailed']),
...mapState('pipelines', [
@@ -85,7 +85,6 @@ export default {
</header>
<empty-state
v-if="!latestPipeline"
- :help-page-path="links.ciHelpPagePath"
:empty-state-svg-path="pipelinesEmptyStateSvgPath"
:can-set-ci="true"
class="mb-auto mt-auto"
diff --git a/app/assets/javascripts/ide/components/preview/navigator.vue b/app/assets/javascripts/ide/components/preview/navigator.vue
index 0c6cb041095..4d35e946d89 100644
--- a/app/assets/javascripts/ide/components/preview/navigator.vue
+++ b/app/assets/javascripts/ide/components/preview/navigator.vue
@@ -117,7 +117,7 @@ export default {
class="ide-navigator-btn d-flex align-items-center d-transparent border-0 bg-transparent"
@click="refresh"
>
- <gl-icon :size="18" name="retry" class="m-auto" />
+ <gl-icon :size="18" name="retry" use-deprecated-sizes class="m-auto" />
</button>
<div class="position-relative w-100 gl-ml-2">
<input
diff --git a/app/assets/javascripts/ide/components/repo_editor.vue b/app/assets/javascripts/ide/components/repo_editor.vue
index 690060f5cb0..b57dcd4276c 100644
--- a/app/assets/javascripts/ide/components/repo_editor.vue
+++ b/app/assets/javascripts/ide/components/repo_editor.vue
@@ -1,6 +1,15 @@
<script>
import { mapState, mapGetters, mapActions } from 'vuex';
+import {
+ EDITOR_TYPE_DIFF,
+ EDITOR_CODE_INSTANCE_FN,
+ EDITOR_DIFF_INSTANCE_FN,
+} from '~/editor/constants';
+import EditorLite from '~/editor/editor_lite';
+import { EditorWebIdeExtension } from '~/editor/extensions/editor_lite_webide_ext';
import { deprecatedCreateFlash as flash } from '~/flash';
+import ModelManager from '~/ide/lib/common/model_manager';
+import { defaultDiffEditorOptions, defaultEditorOptions } from '~/ide/lib/editor_options';
import { __ } from '~/locale';
import {
WEBIDE_MARK_FILE_CLICKED,
@@ -20,7 +29,6 @@ import {
FILE_VIEW_MODE_PREVIEW,
} from '../constants';
import eventHub from '../eventhub';
-import Editor from '../lib/editor';
import { getRulesWithTraversal } from '../lib/editorconfig/parser';
import mapRulesToMonaco from '../lib/editorconfig/rules_mapper';
import { getFileEditorOrDefault } from '../stores/modules/editor/utils';
@@ -46,6 +54,9 @@ export default {
content: '',
images: {},
rules: {},
+ globalEditor: null,
+ modelManager: new ModelManager(),
+ isEditorLoading: true,
};
},
computed: {
@@ -132,6 +143,7 @@ export default {
// Compare key to allow for files opened in review mode to be cached differently
if (oldVal.key !== this.file.key) {
+ this.isEditorLoading = true;
this.initEditor();
if (this.currentActivityView !== leftSidebarViews.edit.name) {
@@ -149,6 +161,7 @@ export default {
}
},
viewer() {
+ this.isEditorLoading = false;
if (!this.file.pending) {
this.createEditorInstance();
}
@@ -181,11 +194,11 @@ export default {
},
},
beforeDestroy() {
- this.editor.dispose();
+ this.globalEditor.dispose();
},
mounted() {
- if (!this.editor) {
- this.editor = Editor.create(this.$store, this.editorOptions);
+ if (!this.globalEditor) {
+ this.globalEditor = new EditorLite();
}
this.initEditor();
@@ -211,8 +224,6 @@ export default {
return;
}
- this.editor.clearEditor();
-
this.registerSchemaForFile();
Promise.all([this.fetchFileData(), this.fetchEditorconfigRules()])
@@ -251,20 +262,45 @@ export default {
return;
}
- this.editor.dispose();
+ const isDiff = this.viewer !== viewerTypes.edit;
+ const shouldDisposeEditor = isDiff !== (this.editor?.getEditorType() === EDITOR_TYPE_DIFF);
- this.$nextTick(() => {
- if (this.viewer === viewerTypes.edit) {
- this.editor.createInstance(this.$refs.editor);
- } else {
- this.editor.createDiffInstance(this.$refs.editor);
+ if (this.editor && !shouldDisposeEditor) {
+ this.setupEditor();
+ } else {
+ if (this.editor && shouldDisposeEditor) {
+ this.editor.dispose();
}
+ const instanceOptions = isDiff ? defaultDiffEditorOptions : defaultEditorOptions;
+ const method = isDiff ? EDITOR_DIFF_INSTANCE_FN : EDITOR_CODE_INSTANCE_FN;
- this.setupEditor();
- });
+ this.editor = this.globalEditor[method]({
+ el: this.$refs.editor,
+ blobPath: this.file.path,
+ blobGlobalId: this.file.key,
+ blobContent: this.content || this.file.content,
+ ...instanceOptions,
+ ...this.editorOptions,
+ });
+
+ this.editor.use(
+ new EditorWebIdeExtension({
+ instance: this.editor,
+ modelManager: this.modelManager,
+ store: this.$store,
+ file: this.file,
+ options: this.editorOptions,
+ }),
+ );
+
+ this.$nextTick(() => {
+ this.setupEditor();
+ });
+ }
},
+
setupEditor() {
- if (!this.file || !this.editor.instance || this.file.loading) return;
+ if (!this.file || !this.editor || this.file.loading) return;
const head = this.getStagedFile(this.file.path);
@@ -279,6 +315,8 @@ export default {
this.editor.attachModel(this.model);
}
+ this.isEditorLoading = false;
+
this.model.updateOptions(this.rules);
this.model.onChange((model) => {
@@ -298,7 +336,7 @@ export default {
});
});
- this.editor.setPosition({
+ this.editor.setPos({
lineNumber: this.fileEditor.editorRow,
column: this.fileEditor.editorColumn,
});
@@ -308,6 +346,10 @@ export default {
fileLanguage: this.model.language,
});
+ this.$nextTick(() => {
+ this.editor.updateDimensions();
+ });
+
this.$emit('editorSetup');
if (performance.getEntriesByName(WEBIDE_MARK_FILE_CLICKED).length) {
eventHub.$emit(WEBIDE_MEASURE_FILE_AFTER_INTERACTION);
@@ -344,7 +386,7 @@ export default {
});
},
onPaste(event) {
- const editor = this.editor.instance;
+ const { editor } = this;
const reImage = /^image\/(png|jpg|jpeg|gif)$/;
const file = event.clipboardData.files[0];
@@ -395,6 +437,7 @@ export default {
<a
href="javascript:void(0);"
role="button"
+ data-testid="edit-tab"
@click.prevent="updateEditor({ viewMode: $options.FILE_VIEW_MODE_EDITOR })"
>
{{ __('Edit') }}
@@ -404,6 +447,7 @@ export default {
<a
href="javascript:void(0);"
role="button"
+ data-testid="preview-tab"
@click.prevent="updateEditor({ viewMode: $options.FILE_VIEW_MODE_PREVIEW })"
>{{ previewMode.previewTitle }}</a
>
@@ -414,6 +458,7 @@ export default {
<div
v-show="showEditor"
ref="editor"
+ :key="`content-editor`"
:class="{
'is-readonly': isCommitModeActive,
'is-deleted': file.deleted,
@@ -421,6 +466,8 @@ export default {
}"
class="multi-file-editor-holder"
data-qa-selector="editor_container"
+ data-testid="editor-container"
+ :data-editor-loading="isEditorLoading"
@focusout="triggerFilesChange"
></div>
<content-viewer
diff --git a/app/assets/javascripts/ide/components/repo_tab.vue b/app/assets/javascripts/ide/components/repo_tab.vue
index d28751c9571..64ec2cc67c7 100644
--- a/app/assets/javascripts/ide/components/repo_tab.vue
+++ b/app/assets/javascripts/ide/components/repo_tab.vue
@@ -1,5 +1,5 @@
<script>
-import { GlIcon } from '@gitlab/ui';
+import { GlIcon, GlTab } from '@gitlab/ui';
import { mapActions, mapGetters } from 'vuex';
import { __, sprintf } from '~/locale';
@@ -13,6 +13,7 @@ export default {
FileIcon,
GlIcon,
ChangedFileIcon,
+ GlTab,
},
props: {
tab: {
@@ -71,29 +72,30 @@ export default {
</script>
<template>
- <li
- :class="{
- active: tab.active,
- disabled: tab.pending,
- }"
+ <gl-tab
+ :active="tab.active"
+ :disabled="tab.pending"
+ :title="tab.name"
@click="clickFile(tab)"
@mouseover="mouseOverTab"
@mouseout="mouseOutTab"
>
- <div :title="getUrlForPath(tab.path)" class="multi-file-tab">
- <file-icon :file-name="tab.name" :size="16" />
- {{ tab.name }}
- <file-status-icon :file="tab" />
- </div>
- <button
- :aria-label="closeLabel"
- :disabled="tab.pending"
- type="button"
- class="multi-file-tab-close"
- @click.stop.prevent="closeFile(tab)"
- >
- <gl-icon v-if="!showChangedIcon" :size="12" name="close" />
- <changed-file-icon v-else :file="tab" />
- </button>
- </li>
+ <template #title>
+ <div :title="getUrlForPath(tab.path)" class="multi-file-tab">
+ <file-icon :file-name="tab.name" :size="16" />
+ {{ tab.name }}
+ <file-status-icon :file="tab" />
+ </div>
+ <button
+ :aria-label="closeLabel"
+ :disabled="tab.pending"
+ type="button"
+ class="multi-file-tab-close"
+ @click.stop.prevent="closeFile(tab)"
+ >
+ <gl-icon v-if="!showChangedIcon" :size="12" name="close" />
+ <changed-file-icon v-else :file="tab" />
+ </button>
+ </template>
+ </gl-tab>
</template>
diff --git a/app/assets/javascripts/ide/components/repo_tabs.vue b/app/assets/javascripts/ide/components/repo_tabs.vue
index c03694e3619..932040c7fa5 100644
--- a/app/assets/javascripts/ide/components/repo_tabs.vue
+++ b/app/assets/javascripts/ide/components/repo_tabs.vue
@@ -1,10 +1,12 @@
<script>
+import { GlTabs } from '@gitlab/ui';
import { mapActions, mapGetters } from 'vuex';
import RepoTab from './repo_tab.vue';
export default {
components: {
RepoTab,
+ GlTabs,
},
props: {
activeFile: {
@@ -42,8 +44,8 @@ export default {
<template>
<div class="multi-file-tabs">
- <ul ref="tabsScroller" class="list-unstyled gl-mb-0">
+ <gl-tabs>
<repo-tab v-for="tab in files" :key="tab.key" :tab="tab" />
- </ul>
+ </gl-tabs>
</div>
</template>
diff --git a/app/assets/javascripts/ide/components/shared/tokened_input.vue b/app/assets/javascripts/ide/components/shared/tokened_input.vue
index e7a4c5487d1..ed0dab47947 100644
--- a/app/assets/javascripts/ide/components/shared/tokened_input.vue
+++ b/app/assets/javascripts/ide/components/shared/tokened_input.vue
@@ -81,7 +81,9 @@ export default {
>
<div class="value-container rounded">
<div class="value">{{ token.label }}</div>
- <div class="remove-token inverted"><gl-icon :size="10" name="close" /></div>
+ <div class="remove-token inverted">
+ <gl-icon :size="10" name="close" use-deprecated-sizes />
+ </div>
</div>
</button>
</div>
diff --git a/app/assets/javascripts/ide/index.js b/app/assets/javascripts/ide/index.js
index 1b4b59ef62f..f4a0f324e4a 100644
--- a/app/assets/javascripts/ide/index.js
+++ b/app/assets/javascripts/ide/index.js
@@ -53,7 +53,6 @@ export function initIde(el, options = {}) {
promotionSvgPath: el.dataset.promotionSvgPath,
});
this.setLinks({
- ciHelpPagePath: el.dataset.ciHelpPagePath,
webIDEHelpPagePath: el.dataset.webIdeHelpPagePath,
});
this.setInitialData({
diff --git a/app/assets/javascripts/import_entities/components/import_status.vue b/app/assets/javascripts/import_entities/components/import_status.vue
index 9e3347a657f..8df51ef7f9b 100644
--- a/app/assets/javascripts/import_entities/components/import_status.vue
+++ b/app/assets/javascripts/import_entities/components/import_status.vue
@@ -34,7 +34,7 @@ export default {
</script>
<template>
- <div>
+ <div class="gl-display-flex gl-h-7 gl-align-items-center">
<gl-loading-icon
v-if="mappedStatus.loadingIcon"
:inline="true"
diff --git a/app/assets/javascripts/import_entities/constants.js b/app/assets/javascripts/import_entities/constants.js
index ad33ca158d2..c2f398cb8a8 100644
--- a/app/assets/javascripts/import_entities/constants.js
+++ b/app/assets/javascripts/import_entities/constants.js
@@ -7,6 +7,7 @@ export const STATUSES = {
FINISHED: 'finished',
FAILED: 'failed',
SCHEDULED: 'scheduled',
+ CREATED: 'created',
STARTED: 'started',
NONE: 'none',
SCHEDULING: 'scheduling',
@@ -23,6 +24,11 @@ const STATUS_MAP = {
text: __('Failed'),
textClass: 'text-danger',
},
+ [STATUSES.CREATED]: {
+ icon: 'pending',
+ text: __('Scheduled'),
+ textClass: 'text-warning',
+ },
[STATUSES.SCHEDULED]: {
icon: 'pending',
text: __('Scheduled'),
diff --git a/app/assets/javascripts/import_entities/import_groups/components/import_table.vue b/app/assets/javascripts/import_entities/import_groups/components/import_table.vue
index 7c5f48dcafc..f337520b0db 100644
--- a/app/assets/javascripts/import_entities/import_groups/components/import_table.vue
+++ b/app/assets/javascripts/import_entities/import_groups/components/import_table.vue
@@ -1,13 +1,15 @@
<script>
import {
GlEmptyState,
+ GlDropdown,
+ GlDropdownItem,
GlIcon,
GlLink,
GlLoadingIcon,
GlSearchBoxByClick,
GlSprintf,
} from '@gitlab/ui';
-import { s__ } from '~/locale';
+import { s__, __ } from '~/locale';
import PaginationLinks from '~/vue_shared/components/pagination_links.vue';
import importGroupMutation from '../graphql/mutations/import_group.mutation.graphql';
import setNewNameMutation from '../graphql/mutations/set_new_name.mutation.graphql';
@@ -16,9 +18,14 @@ import availableNamespacesQuery from '../graphql/queries/available_namespaces.qu
import bulkImportSourceGroupsQuery from '../graphql/queries/bulk_import_source_groups.query.graphql';
import ImportTableRow from './import_table_row.vue';
+const PAGE_SIZES = [20, 50, 100];
+const DEFAULT_PAGE_SIZE = PAGE_SIZES[0];
+
export default {
components: {
GlEmptyState,
+ GlDropdown,
+ GlDropdownItem,
GlIcon,
GlLink,
GlLoadingIcon,
@@ -33,12 +40,17 @@ export default {
type: String,
required: true,
},
+ groupPathRegex: {
+ type: RegExp,
+ required: true,
+ },
},
data() {
return {
filter: '',
page: 1,
+ perPage: DEFAULT_PAGE_SIZE,
};
},
@@ -46,13 +58,17 @@ export default {
bulkImportSourceGroups: {
query: bulkImportSourceGroupsQuery,
variables() {
- return { page: this.page, filter: this.filter };
+ return { page: this.page, filter: this.filter, perPage: this.perPage };
},
},
availableNamespaces: availableNamespacesQuery,
},
computed: {
+ humanizedTotal() {
+ return this.paginationInfo.total >= 1000 ? __('1000+') : this.paginationInfo.total;
+ },
+
hasGroups() {
return this.bulkImportSourceGroups?.nodes?.length > 0;
},
@@ -113,14 +129,20 @@ export default {
variables: { sourceGroupId },
});
},
+
+ setPageSize(size) {
+ this.perPage = size;
+ },
},
+
+ PAGE_SIZES,
};
</script>
<template>
<div>
<div
- class="gl-py-5 gl-border-solid gl-border-gray-200 gl-border-0 gl-border-b-1 gl-display-flex gl-align-items-center"
+ class="gl-py-5 gl-border-solid gl-border-gray-200 gl-border-0 gl-border-b-1 gl-display-flex"
>
<span>
<gl-sprintf v-if="!$apollo.loading && hasGroups" :message="statusMessage">
@@ -147,12 +169,17 @@ export default {
</div>
<gl-loading-icon v-if="$apollo.loading" size="md" class="gl-mt-5" />
<template v-else>
- <gl-empty-state v-if="hasEmptyFilter" :title="__('Sorry, your filter produced no results')" />
+ <gl-empty-state
+ v-if="hasEmptyFilter"
+ :title="__('Sorry, your filter produced no results')"
+ :description="__('To widen your search, change or remove filters above.')"
+ />
<gl-empty-state
v-else-if="!hasGroups"
- :title="s__('BulkImport|No groups available for import')"
+ :title="s__('BulkImport|You have no groups to import')"
+ :description="s__('Check your source instance permissions.')"
/>
- <div v-else class="gl-display-flex gl-flex-direction-column gl-align-items-center">
+ <template v-else>
<table class="gl-w-full">
<thead class="gl-border-solid gl-border-gray-200 gl-border-0 gl-border-b-1">
<th class="gl-py-4 import-jobs-from-col">{{ s__('BulkImport|From source group') }}</th>
@@ -160,12 +187,13 @@ export default {
<th class="gl-py-4 import-jobs-status-col">{{ __('Status') }}</th>
<th class="gl-py-4 import-jobs-cta-col"></th>
</thead>
- <tbody>
+ <tbody class="gl-vertical-align-top">
<template v-for="group in bulkImportSourceGroups.nodes">
<import-table-row
:key="group.id"
:group="group"
:available-namespaces="availableNamespaces"
+ :group-path-regex="groupPathRegex"
@update-target-namespace="updateTargetNamespace(group.id, $event)"
@update-new-name="updateNewName(group.id, $event)"
@import-group="importGroup(group.id)"
@@ -173,12 +201,50 @@ export default {
</template>
</tbody>
</table>
- <pagination-links
- :change="setPage"
- :page-info="bulkImportSourceGroups.pageInfo"
- class="gl-mt-3"
- />
- </div>
+ <div v-if="hasGroups" class="gl-display-flex gl-mt-3 gl-align-items-center">
+ <pagination-links
+ :change="setPage"
+ :page-info="bulkImportSourceGroups.pageInfo"
+ class="gl-m-0"
+ />
+ <gl-dropdown category="tertiary" class="gl-ml-auto">
+ <template #button-content>
+ <span class="font-weight-bold">
+ <gl-sprintf :message="__('%{count} items per page')">
+ <template #count>
+ {{ perPage }}
+ </template>
+ </gl-sprintf>
+ </span>
+ <gl-icon class="gl-button-icon dropdown-chevron" name="chevron-down" />
+ </template>
+ <gl-dropdown-item
+ v-for="size in $options.PAGE_SIZES"
+ :key="size"
+ @click="setPageSize(size)"
+ >
+ <gl-sprintf :message="__('%{count} items per page')">
+ <template #count>
+ {{ size }}
+ </template>
+ </gl-sprintf>
+ </gl-dropdown-item>
+ </gl-dropdown>
+ <div class="gl-ml-2">
+ <gl-sprintf :message="s__('BulkImport|Showing %{start}-%{end} of %{total}')">
+ <template #start>
+ {{ paginationInfo.start }}
+ </template>
+ <template #end>
+ {{ paginationInfo.end }}
+ </template>
+ <template #total>
+ {{ humanizedTotal }}
+ </template>
+ </gl-sprintf>
+ </div>
+ </div>
+ </template>
</template>
</div>
</template>
diff --git a/app/assets/javascripts/import_entities/import_groups/components/import_table_row.vue b/app/assets/javascripts/import_entities/import_groups/components/import_table_row.vue
index 1707ab10c89..aed879e75fb 100644
--- a/app/assets/javascripts/import_entities/import_groups/components/import_table_row.vue
+++ b/app/assets/javascripts/import_entities/import_groups/components/import_table_row.vue
@@ -1,15 +1,29 @@
<script>
-import { GlButton, GlIcon, GlLink, GlFormInput } from '@gitlab/ui';
+import {
+ GlButton,
+ GlDropdown,
+ GlDropdownDivider,
+ GlDropdownItem,
+ GlDropdownSectionHeader,
+ GlIcon,
+ GlLink,
+ GlFormInput,
+} from '@gitlab/ui';
import { joinPaths } from '~/lib/utils/url_utility';
-import Select2Select from '~/vue_shared/components/select2_select.vue';
import ImportStatus from '../../components/import_status.vue';
import { STATUSES } from '../../constants';
+import groupQuery from '../graphql/queries/group.query.graphql';
+
+const DEBOUNCE_INTERVAL = 300;
export default {
components: {
- Select2Select,
ImportStatus,
GlButton,
+ GlDropdown,
+ GlDropdownDivider,
+ GlDropdownItem,
+ GlDropdownSectionHeader,
GlLink,
GlIcon,
GlFormInput,
@@ -23,9 +37,41 @@ export default {
type: Array,
required: true,
},
+ groupPathRegex: {
+ type: RegExp,
+ required: true,
+ },
+ },
+
+ apollo: {
+ existingGroup: {
+ query: groupQuery,
+ debounce: DEBOUNCE_INTERVAL,
+ variables() {
+ return {
+ fullPath: this.fullPath,
+ };
+ },
+ skip() {
+ return !this.isNameValid || this.isAlreadyImported;
+ },
+ },
},
+
computed: {
- isDisabled() {
+ importTarget() {
+ return this.group.import_target;
+ },
+
+ isInvalid() {
+ return Boolean(!this.isNameValid || this.existingGroup);
+ },
+
+ isNameValid() {
+ return this.groupPathRegex.test(this.importTarget.new_name);
+ },
+
+ isAlreadyImported() {
return this.group.status !== STATUSES.NONE;
},
@@ -33,61 +79,89 @@ export default {
return this.group.status === STATUSES.FINISHED;
},
- select2Options() {
- return {
- data: this.availableNamespaces.map((namespace) => ({
- id: namespace.full_path,
- text: namespace.full_path,
- })),
- };
- },
- },
- methods: {
- getPath(group) {
- return `${group.import_target.target_namespace}/${group.import_target.new_name}`;
+ fullPath() {
+ return `${this.importTarget.target_namespace}/${this.importTarget.new_name}`;
},
- getFullPath(group) {
- return joinPaths(gon.relative_url_root || '/', this.getPath(group));
+ absolutePath() {
+ return joinPaths(gon.relative_url_root || '/', this.fullPath);
},
},
};
</script>
<template>
- <tr class="gl-border-gray-200 gl-border-0 gl-border-b-1">
+ <tr class="gl-border-gray-200 gl-border-0 gl-border-b-1 gl-border-solid">
<td class="gl-p-4">
- <gl-link :href="group.web_url" target="_blank">
+ <gl-link
+ :href="group.web_url"
+ target="_blank"
+ class="gl-display-flex gl-align-items-center gl-h-7"
+ >
{{ group.full_path }} <gl-icon name="external-link" />
</gl-link>
</td>
<td class="gl-p-4">
- <gl-link v-if="isFinished" :href="getFullPath(group)">{{ getPath(group) }}</gl-link>
+ <gl-link
+ v-if="isFinished"
+ class="gl-display-flex gl-align-items-center gl-h-7"
+ :href="absolutePath"
+ >
+ {{ fullPath }}
+ </gl-link>
<div
v-else
class="import-entities-target-select gl-display-flex gl-align-items-stretch"
:class="{
- disabled: isDisabled,
+ disabled: isAlreadyImported,
}"
>
- <select2-select
- :disabled="isDisabled"
- :options="select2Options"
- :value="group.import_target.target_namespace"
- @input="$emit('update-target-namespace', $event)"
- />
+ <gl-dropdown
+ :text="importTarget.target_namespace"
+ :disabled="isAlreadyImported"
+ toggle-class="gl-rounded-top-right-none! gl-rounded-bottom-right-none!"
+ class="import-entities-namespace-dropdown gl-h-7 gl-flex-fill-1"
+ >
+ <gl-dropdown-item @click="$emit('update-target-namespace', '')">{{
+ s__('BulkImport|No parent')
+ }}</gl-dropdown-item>
+ <template v-if="availableNamespaces.length">
+ <gl-dropdown-divider />
+ <gl-dropdown-section-header>
+ {{ s__('BulkImport|Existing groups') }}
+ </gl-dropdown-section-header>
+ <gl-dropdown-item
+ v-for="ns in availableNamespaces"
+ :key="ns.full_path"
+ @click="$emit('update-target-namespace', ns.full_path)"
+ >
+ {{ ns.full_path }}
+ </gl-dropdown-item>
+ </template>
+ </gl-dropdown>
<div
- class="import-entities-target-select-separator gl-px-3 gl-display-flex gl-align-items-center gl-border-solid gl-border-0 gl-border-t-1 gl-border-b-1"
+ class="import-entities-target-select-separator gl-h-7 gl-px-3 gl-display-flex gl-align-items-center gl-border-solid gl-border-0 gl-border-t-1 gl-border-b-1"
>
/
</div>
- <gl-form-input
- class="gl-rounded-top-left-none gl-rounded-bottom-left-none"
- :disabled="isDisabled"
- :value="group.import_target.new_name"
- @input="$emit('update-new-name', $event)"
- />
+ <div class="gl-flex-fill-1">
+ <gl-form-input
+ class="gl-rounded-top-left-none gl-rounded-bottom-left-none"
+ :class="{ 'is-invalid': isInvalid && !isAlreadyImported }"
+ :disabled="isAlreadyImported"
+ :value="importTarget.new_name"
+ @input="$emit('update-new-name', $event)"
+ />
+ <p v-if="isInvalid" class="gl-text-red-500 gl-m-0 gl-mt-2">
+ <template v-if="!isNameValid">
+ {{ __('Please choose a group URL with no special characters.') }}
+ </template>
+ <template v-else-if="existingGroup">
+ {{ s__('BulkImport|Name already exists.') }}
+ </template>
+ </p>
+ </div>
</div>
</td>
<td class="gl-p-4 gl-white-space-nowrap">
@@ -95,7 +169,8 @@ export default {
</td>
<td class="gl-p-4">
<gl-button
- v-if="!isDisabled"
+ v-if="!isAlreadyImported"
+ :disabled="isInvalid"
variant="success"
category="secondary"
@click="$emit('import-group')"
diff --git a/app/assets/javascripts/import_entities/import_groups/graphql/client_factory.js b/app/assets/javascripts/import_entities/import_groups/graphql/client_factory.js
index 8110934efc4..d444cc77aa7 100644
--- a/app/assets/javascripts/import_entities/import_groups/graphql/client_factory.js
+++ b/app/assets/javascripts/import_entities/import_groups/graphql/client_factory.js
@@ -15,52 +15,71 @@ export const clientTypenames = {
BulkImportPageInfo: 'ClientBulkImportPageInfo',
};
-export function createResolvers({ endpoints }) {
+export function createResolvers({ endpoints, sourceUrl, GroupsManager = SourceGroupsManager }) {
let statusPoller;
+ let sourceGroupManager;
+ const getGroupsManager = (client) => {
+ if (!sourceGroupManager) {
+ sourceGroupManager = new GroupsManager({ client, sourceUrl });
+ }
+ return sourceGroupManager;
+ };
+
return {
Query: {
async bulkImportSourceGroups(_, vars, { client }) {
- const {
- data: { availableNamespaces },
- } = await client.query({ query: availableNamespacesQuery });
-
if (!statusPoller) {
statusPoller = new StatusPoller({
- client,
+ groupManager: getGroupsManager(client),
pollPath: endpoints.jobs,
});
statusPoller.startPolling();
}
- return axios
- .get(endpoints.status, {
+ const groupsManager = getGroupsManager(client);
+ return Promise.all([
+ axios.get(endpoints.status, {
params: {
page: vars.page,
per_page: vars.perPage,
filter: vars.filter,
},
- })
- .then(({ headers, data }) => {
+ }),
+ client.query({ query: availableNamespacesQuery }),
+ ]).then(
+ ([
+ { headers, data },
+ {
+ data: { availableNamespaces },
+ },
+ ]) => {
const pagination = parseIntPagination(normalizeHeaders(headers));
return {
__typename: clientTypenames.BulkImportSourceGroupConnection,
- nodes: data.importable_data.map((group) => ({
- __typename: clientTypenames.BulkImportSourceGroup,
- ...group,
- status: STATUSES.NONE,
- import_target: {
- new_name: group.full_path,
- target_namespace: availableNamespaces[0].full_path,
- },
- })),
+ nodes: data.importable_data.map((group) => {
+ const cachedImportState = groupsManager.getImportStateFromStorageByGroupId(
+ group.id,
+ );
+
+ return {
+ __typename: clientTypenames.BulkImportSourceGroup,
+ ...group,
+ status: cachedImportState?.status ?? STATUSES.NONE,
+ import_target: cachedImportState?.importTarget ?? {
+ new_name: group.full_path,
+ target_namespace: availableNamespaces[0]?.full_path ?? '',
+ },
+ };
+ }),
pageInfo: {
__typename: clientTypenames.BulkImportPageInfo,
...pagination,
},
};
- });
+ },
+ );
},
availableNamespaces: () =>
@@ -73,21 +92,21 @@ export function createResolvers({ endpoints }) {
},
Mutation: {
setTargetNamespace(_, { targetNamespace, sourceGroupId }, { client }) {
- new SourceGroupsManager({ client }).updateById(sourceGroupId, (sourceGroup) => {
+ getGroupsManager(client).updateById(sourceGroupId, (sourceGroup) => {
// eslint-disable-next-line no-param-reassign
sourceGroup.import_target.target_namespace = targetNamespace;
});
},
setNewName(_, { newName, sourceGroupId }, { client }) {
- new SourceGroupsManager({ client }).updateById(sourceGroupId, (sourceGroup) => {
+ getGroupsManager(client).updateById(sourceGroupId, (sourceGroup) => {
// eslint-disable-next-line no-param-reassign
sourceGroup.import_target.new_name = newName;
});
},
async importGroup(_, { sourceGroupId }, { client }) {
- const groupManager = new SourceGroupsManager({ client });
+ const groupManager = getGroupsManager(client);
const group = groupManager.findById(sourceGroupId);
groupManager.setImportStatus(group, STATUSES.SCHEDULING);
try {
@@ -101,13 +120,10 @@ export function createResolvers({ endpoints }) {
},
],
});
- groupManager.setImportStatus(group, STATUSES.STARTED);
- SourceGroupsManager.attachImportId(group, response.data.id);
+ groupManager.startImport({ group, importId: response.data.id });
} catch (e) {
- createFlash({
- message: s__('BulkImport|Importing the group failed'),
- });
-
+ const message = e?.response?.data?.error ?? s__('BulkImport|Importing the group failed');
+ createFlash({ message });
groupManager.setImportStatus(group, STATUSES.NONE);
throw e;
}
@@ -116,5 +132,5 @@ export function createResolvers({ endpoints }) {
};
}
-export const createApolloClient = ({ endpoints }) =>
- createDefaultClient(createResolvers({ endpoints }), { assumeImmutableResults: true });
+export const createApolloClient = ({ sourceUrl, endpoints }) =>
+ createDefaultClient(createResolvers({ sourceUrl, endpoints }), { assumeImmutableResults: true });
diff --git a/app/assets/javascripts/import_entities/import_groups/graphql/queries/group.query.graphql b/app/assets/javascripts/import_entities/import_groups/graphql/queries/group.query.graphql
new file mode 100644
index 00000000000..52df3581ac4
--- /dev/null
+++ b/app/assets/javascripts/import_entities/import_groups/graphql/queries/group.query.graphql
@@ -0,0 +1,5 @@
+query group($fullPath: ID!) {
+ existingGroup: group(fullPath: $fullPath) {
+ id
+ }
+}
diff --git a/app/assets/javascripts/import_entities/import_groups/graphql/services/source_groups_manager.js b/app/assets/javascripts/import_entities/import_groups/graphql/services/source_groups_manager.js
index 261e30edbbb..2c88d25358f 100644
--- a/app/assets/javascripts/import_entities/import_groups/graphql/services/source_groups_manager.js
+++ b/app/assets/javascripts/import_entities/import_groups/graphql/services/source_groups_manager.js
@@ -1,5 +1,7 @@
import { defaultDataIdFromObject } from 'apollo-cache-inmemory';
import produce from 'immer';
+import { debounce, merge } from 'lodash';
+import { STATUSES } from '../../../constants';
import ImportSourceGroupFragment from '../fragments/bulk_import_source_group_item.fragment.graphql';
function extractTypeConditionFromFragment(fragment) {
@@ -13,15 +15,24 @@ function generateGroupId(id) {
});
}
+export const KEY = 'gl-bulk-imports-import-state';
+export const DEBOUNCE_INTERVAL = 200;
+
export class SourceGroupsManager {
- static importMap = new Map();
+ constructor({ client, sourceUrl, storage = window.localStorage }) {
+ this.client = client;
+ this.sourceUrl = sourceUrl;
- static attachImportId(group, importId) {
- SourceGroupsManager.importMap.set(importId, group.id);
+ this.storage = storage;
+ this.importStates = this.loadImportStatesFromStorage();
}
- constructor({ client }) {
- this.client = client;
+ loadImportStatesFromStorage() {
+ try {
+ return JSON.parse(this.storage.getItem(KEY)) ?? {};
+ } catch {
+ return {};
+ }
}
findById(id) {
@@ -42,8 +53,48 @@ export class SourceGroupsManager {
this.update(group, fn);
}
- findByImportId(importId) {
- return this.findById(SourceGroupsManager.importMap.get(importId));
+ saveImportState(importId, group) {
+ this.importStates[this.getStorageKey(importId)] = {
+ id: group.id,
+ importTarget: group.import_target,
+ status: group.status,
+ };
+ this.saveImportStatesToStorage();
+ }
+
+ getImportStateFromStorage(importId) {
+ return this.importStates[this.getStorageKey(importId)];
+ }
+
+ getImportStateFromStorageByGroupId(groupId) {
+ const PREFIX = this.getStorageKey('');
+ const [, importState] =
+ Object.entries(this.importStates).find(
+ ([key, group]) => key.startsWith(PREFIX) && group.id === groupId,
+ ) ?? [];
+
+ return importState;
+ }
+
+ getStorageKey(importId) {
+ return `${this.sourceUrl}|${importId}`;
+ }
+
+ saveImportStatesToStorage = debounce(() => {
+ try {
+ // storage might be changed in other tab so fetch first
+ this.storage.setItem(
+ KEY,
+ JSON.stringify(merge({}, this.loadImportStatesFromStorage(), this.importStates)),
+ );
+ } catch {
+ // empty catch intentional: storage might be unavailable or full
+ }
+ }, DEBOUNCE_INTERVAL);
+
+ startImport({ group, importId }) {
+ this.setImportStatus(group, STATUSES.CREATED);
+ this.saveImportState(importId, group);
}
setImportStatus(group, status) {
@@ -52,4 +103,22 @@ export class SourceGroupsManager {
sourceGroup.status = status;
});
}
+
+ setImportStatusByImportId(importId, status) {
+ const importState = this.getImportStateFromStorage(importId);
+ if (!importState) {
+ return;
+ }
+
+ if (importState.status !== status) {
+ importState.status = status;
+ }
+
+ const group = this.findById(importState.id);
+ if (group?.id) {
+ this.setImportStatus(group, status);
+ }
+
+ this.saveImportStatesToStorage();
+ }
}
diff --git a/app/assets/javascripts/import_entities/import_groups/graphql/services/status_poller.js b/app/assets/javascripts/import_entities/import_groups/graphql/services/status_poller.js
index 63cd6b48fc4..b80a575afce 100644
--- a/app/assets/javascripts/import_entities/import_groups/graphql/services/status_poller.js
+++ b/app/assets/javascripts/import_entities/import_groups/graphql/services/status_poller.js
@@ -3,12 +3,9 @@ import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import Poll from '~/lib/utils/poll';
import { s__ } from '~/locale';
-import { SourceGroupsManager } from './source_groups_manager';
export class StatusPoller {
- constructor({ client, pollPath }) {
- this.client = client;
-
+ constructor({ groupManager, pollPath }) {
this.eTagPoll = new Poll({
resource: {
fetchJobs: () => axios.get(pollPath),
@@ -29,7 +26,7 @@ export class StatusPoller {
}
});
- this.groupManager = new SourceGroupsManager({ client });
+ this.groupManager = groupManager;
}
startPolling() {
@@ -38,10 +35,7 @@ export class StatusPoller {
async updateImportsStatuses(importStatuses) {
importStatuses.forEach(({ id, status_name: statusName }) => {
- const group = this.groupManager.findByImportId(id);
- if (group.id) {
- this.groupManager.setImportStatus(group, statusName);
- }
+ this.groupManager.setImportStatusByImportId(id, statusName);
});
}
}
diff --git a/app/assets/javascripts/import_entities/import_groups/index.js b/app/assets/javascripts/import_entities/import_groups/index.js
index cd837a840e4..cc60c8cbdb0 100644
--- a/app/assets/javascripts/import_entities/import_groups/index.js
+++ b/app/assets/javascripts/import_entities/import_groups/index.js
@@ -16,9 +16,11 @@ export function mountImportGroupsApp(mountElement) {
createBulkImportPath,
jobsPath,
sourceUrl,
+ groupPathRegex,
} = mountElement.dataset;
const apolloProvider = new VueApollo({
defaultClient: createApolloClient({
+ sourceUrl,
endpoints: {
status: statusPath,
availableNamespaces: availableNamespacesPath,
@@ -35,6 +37,7 @@ export function mountImportGroupsApp(mountElement) {
return createElement(ImportTable, {
props: {
sourceUrl,
+ groupPathRegex: new RegExp(`^(${groupPathRegex})$`),
},
});
},
diff --git a/app/assets/javascripts/incidents_settings/constants.js b/app/assets/javascripts/incidents_settings/constants.js
index fcac9c519c2..577d8ecb777 100644
--- a/app/assets/javascripts/incidents_settings/constants.js
+++ b/app/assets/javascripts/incidents_settings/constants.js
@@ -40,7 +40,7 @@ export const I18N_ALERT_SETTINGS_FORM = {
label: __('Incident template (optional)'),
},
sendEmail: {
- label: __('Send a separate email notification to Developers.'),
+ label: __('Send a single email notification to Owners and Maintainers for new alerts.'),
},
autoCloseIncidents: {
label: __('Automatically close incidents when the associated Prometheus alert resolves.'),
@@ -51,7 +51,7 @@ export const NO_ISSUE_TEMPLATE_SELECTED = { key: '', name: __('No template selec
export const TAKING_INCIDENT_ACTION_DOCS_LINK =
'/help/operations/metrics/alerts#trigger-actions-from-alerts';
export const ISSUE_TEMPLATES_DOCS_LINK =
- '/help/user/project/description_templates#creating-issue-templates';
+ '/help/user/project/description_templates#create-an-issue-template';
/* PagerDuty integration settings constants */
diff --git a/app/assets/javascripts/integrations/edit/components/active_checkbox.vue b/app/assets/javascripts/integrations/edit/components/active_checkbox.vue
index 8677f139723..1e33ceb7835 100644
--- a/app/assets/javascripts/integrations/edit/components/active_checkbox.vue
+++ b/app/assets/javascripts/integrations/edit/components/active_checkbox.vue
@@ -38,7 +38,7 @@ export default {
<gl-form-checkbox
v-model="activated"
name="service[active]"
- class="gl-display-block gl-line-height-0"
+ class="gl-display-block"
:disabled="isInheriting"
@change="onChange"
>
diff --git a/app/assets/javascripts/integrations/edit/components/confirmation_modal.vue b/app/assets/javascripts/integrations/edit/components/confirmation_modal.vue
index bcf4b036fd2..89f7e3b7a89 100644
--- a/app/assets/javascripts/integrations/edit/components/confirmation_modal.vue
+++ b/app/assets/javascripts/integrations/edit/components/confirmation_modal.vue
@@ -13,7 +13,7 @@ export default {
return {
text: __('Save'),
attributes: [
- { variant: 'success' },
+ { variant: 'confirm' },
{ category: 'primary' },
{ disabled: this.isDisabled },
],
diff --git a/app/assets/javascripts/integrations/edit/components/integration_form.vue b/app/assets/javascripts/integrations/edit/components/integration_form.vue
index 3ec0c23e55d..9ca660ea3ae 100644
--- a/app/assets/javascripts/integrations/edit/components/integration_form.vue
+++ b/app/assets/javascripts/integrations/edit/components/integration_form.vue
@@ -61,9 +61,6 @@ export default {
this.customState.integrationLevel === integrationLevels.GROUP
);
},
- showJiraIssuesFields() {
- return this.isJira && this.glFeatures.jiraIssuesIntegration;
- },
showReset() {
return this.isInstanceOrGroupLevel && this.propsSource.resetPath;
},
@@ -129,7 +126,7 @@ export default {
v-bind="field"
/>
<jira-issues-fields
- v-if="showJiraIssuesFields"
+ v-if="isJira"
:key="`${currentKey}-jira-issues-fields`"
v-bind="propsSource.jiraIssuesProps"
/>
@@ -138,7 +135,7 @@ export default {
<gl-button
v-gl-modal.confirmSaveIntegration
category="primary"
- variant="success"
+ variant="confirm"
:loading="isSaving"
:disabled="isDisabled"
data-qa-selector="save_changes_button"
@@ -150,7 +147,7 @@ export default {
<gl-button
v-else
category="primary"
- variant="success"
+ variant="confirm"
type="submit"
:loading="isSaving"
:disabled="isDisabled"
@@ -162,6 +159,8 @@ export default {
<gl-button
v-if="propsSource.canTest"
+ category="secondary"
+ variant="confirm"
:loading="isTesting"
:disabled="isDisabled"
:href="propsSource.testPath"
@@ -174,7 +173,7 @@ export default {
<gl-button
v-gl-modal.confirmResetIntegration
category="secondary"
- variant="default"
+ variant="confirm"
:loading="isResetting"
:disabled="isDisabled"
data-testid="reset-button"
@@ -184,9 +183,7 @@ export default {
<reset-confirmation-modal @reset="onResetClick" />
</template>
- <gl-button class="btn-cancel" :href="propsSource.cancelPath">{{
- __('Cancel')
- }}</gl-button>
+ <gl-button :href="propsSource.cancelPath">{{ __('Cancel') }}</gl-button>
</div>
</div>
</div>
diff --git a/app/assets/javascripts/invite_members/components/group_select.vue b/app/assets/javascripts/invite_members/components/group_select.vue
new file mode 100644
index 00000000000..4a72e97db8c
--- /dev/null
+++ b/app/assets/javascripts/invite_members/components/group_select.vue
@@ -0,0 +1,103 @@
+<script>
+import { GlDropdown, GlDropdownItem, GlDropdownText, GlSearchBoxByType } from '@gitlab/ui';
+import { debounce } from 'lodash';
+import Api from '~/api';
+import { s__ } from '~/locale';
+import { SEARCH_DELAY } from '../constants';
+
+export default {
+ name: 'GroupSelect',
+ components: {
+ GlDropdown,
+ GlDropdownItem,
+ GlDropdownText,
+ GlSearchBoxByType,
+ },
+ model: {
+ prop: 'selectedGroup',
+ },
+ data() {
+ return {
+ isFetching: false,
+ groups: [],
+ selectedGroup: {},
+ searchTerm: '',
+ };
+ },
+ computed: {
+ selectedGroupName() {
+ return this.selectedGroup.name || this.$options.i18n.dropdownText;
+ },
+ isFetchResultEmpty() {
+ return this.groups.length === 0;
+ },
+ },
+ watch: {
+ searchTerm() {
+ this.retrieveGroups();
+ },
+ },
+ mounted() {
+ this.retrieveGroups();
+ },
+ methods: {
+ retrieveGroups: debounce(function debouncedRetrieveGroups() {
+ this.isFetching = true;
+ return Api.groups(this.searchTerm, this.$options.defaultFetchOptions)
+ .then((response) => {
+ this.groups = response.map((group) => ({
+ id: group.id,
+ name: group.full_name,
+ path: group.path,
+ }));
+ this.isFetching = false;
+ })
+ .catch(() => {
+ this.isFetching = false;
+ });
+ }, SEARCH_DELAY),
+ selectGroup(group) {
+ this.selectedGroup = group;
+
+ this.$emit('input', this.selectedGroup);
+ },
+ },
+ i18n: {
+ dropdownText: s__('GroupSelect|Select a group'),
+ searchPlaceholder: s__('GroupSelect|Search groups'),
+ emptySearchResult: s__('GroupSelect|No matching results'),
+ },
+ defaultFetchOptions: {
+ exclude_internal: true,
+ active: true,
+ },
+};
+</script>
+<template>
+ <div>
+ <gl-dropdown
+ data-testid="group-select-dropdown"
+ :text="selectedGroupName"
+ block
+ menu-class="gl-w-full!"
+ >
+ <gl-search-box-by-type
+ v-model.trim="searchTerm"
+ :is-loading="isFetching"
+ :placeholder="$options.i18n.searchPlaceholder"
+ data-qa-selector="group_select_dropdown_search_field"
+ />
+ <gl-dropdown-item
+ v-for="group in groups"
+ :key="group.id"
+ :name="group.name"
+ @click="selectGroup(group)"
+ >
+ {{ group.name }}
+ </gl-dropdown-item>
+ <gl-dropdown-text v-if="isFetchResultEmpty && !isFetching" data-testid="empty-result-message">
+ <span class="gl-text-gray-500">{{ $options.i18n.emptySearchResult }}</span>
+ </gl-dropdown-text>
+ </gl-dropdown>
+ </div>
+</template>
diff --git a/app/assets/javascripts/invite_members/components/invite_group_trigger.vue b/app/assets/javascripts/invite_members/components/invite_group_trigger.vue
new file mode 100644
index 00000000000..c9de078319a
--- /dev/null
+++ b/app/assets/javascripts/invite_members/components/invite_group_trigger.vue
@@ -0,0 +1,34 @@
+<script>
+import { GlButton } from '@gitlab/ui';
+import { s__ } from '~/locale';
+import eventHub from '../event_hub';
+
+export default {
+ components: {
+ GlButton,
+ },
+ props: {
+ displayText: {
+ type: String,
+ required: false,
+ default: s__('InviteMembers|Invite a group'),
+ },
+ classes: {
+ type: String,
+ required: false,
+ default: '',
+ },
+ },
+ methods: {
+ openModal() {
+ eventHub.$emit('openModal', { inviteeType: 'group' });
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-button :class="classes" data-qa-selector="invite_a_group_button" @click="openModal">
+ {{ displayText }}
+ </gl-button>
+</template>
diff --git a/app/assets/javascripts/invite_members/components/invite_members_modal.vue b/app/assets/javascripts/invite_members/components/invite_members_modal.vue
index f5a65882fba..47f1405c980 100644
--- a/app/assets/javascripts/invite_members/components/invite_members_modal.vue
+++ b/app/assets/javascripts/invite_members/components/invite_members_modal.vue
@@ -11,9 +11,10 @@ import {
} from '@gitlab/ui';
import { partition, isString } from 'lodash';
import Api from '~/api';
+import GroupSelect from '~/invite_members/components/group_select.vue';
import MembersTokenSelect from '~/invite_members/components/members_token_select.vue';
import { BV_SHOW_MODAL, BV_HIDE_MODAL } from '~/lib/utils/constants';
-import { s__, __, sprintf } from '~/locale';
+import { s__, sprintf } from '~/locale';
import eventHub from '../event_hub';
export default {
@@ -28,6 +29,7 @@ export default {
GlButton,
GlFormInput,
MembersTokenSelect,
+ GroupSelect,
},
props: {
id: {
@@ -47,7 +49,7 @@ export default {
required: true,
},
defaultAccessLevel: {
- type: String,
+ type: Number,
required: true,
},
helpLink: {
@@ -60,21 +62,21 @@ export default {
visible: true,
modalId: 'invite-members-modal',
selectedAccessLevel: this.defaultAccessLevel,
+ inviteeType: 'members',
newUsersToInvite: [],
selectedDate: undefined,
+ groupToBeSharedWith: {},
};
},
computed: {
- inviteToName() {
- return this.name.toUpperCase();
- },
- inviteToType() {
- return this.isProject ? __('project') : __('group');
+ isInviteGroup() {
+ return this.inviteeType === 'group';
},
introText() {
- return sprintf(s__("InviteMembersModal|You're inviting members to the %{name} %{type}"), {
- name: this.inviteToName,
- type: this.inviteToType,
+ const inviteTo = this.isProject ? 'toProject' : 'toGroup';
+
+ return sprintf(this.$options.labels[this.inviteeType][inviteTo].introText, {
+ name: this.name,
});
},
toastOptions() {
@@ -82,12 +84,12 @@ export default {
onComplete: () => {
this.selectedAccessLevel = this.defaultAccessLevel;
this.newUsersToInvite = [];
+ this.groupToBeSharedWith = {};
},
};
},
basePostData() {
return {
- access_level: this.selectedAccessLevel,
expires_at: this.selectedDate,
format: 'json',
};
@@ -97,9 +99,16 @@ export default {
(key) => this.accessLevels[key] === Number(this.selectedAccessLevel),
);
},
+ inviteDisabled() {
+ return (
+ this.newUsersToInvite.length === 0 && Object.keys(this.groupToBeSharedWith).length === 0
+ );
+ },
},
mounted() {
- eventHub.$on('openModal', this.openModal);
+ eventHub.$on('openModal', (options) => {
+ this.openModal(options);
+ });
},
methods: {
partitionNewUsersToInvite() {
@@ -113,26 +122,42 @@ export default {
usersToAddById.map((user) => user.id).join(','),
];
},
- openModal() {
+ openModal({ inviteeType }) {
+ this.inviteeType = inviteeType;
+
this.$root.$emit(BV_SHOW_MODAL, this.modalId);
},
closeModal() {
this.$root.$emit(BV_HIDE_MODAL, this.modalId);
},
sendInvite() {
- this.submitForm();
+ if (this.isInviteGroup) {
+ this.submitShareWithGroup();
+ } else {
+ this.submitInviteMembers();
+ }
this.closeModal();
},
cancelInvite() {
this.selectedAccessLevel = this.defaultAccessLevel;
this.selectedDate = undefined;
- this.newUsersToInvite = '';
+ this.newUsersToInvite = [];
+ this.groupToBeSharedWith = {};
this.closeModal();
},
changeSelectedItem(item) {
this.selectedAccessLevel = item;
},
- submitForm() {
+ submitShareWithGroup() {
+ const apiShareWithGroup = this.isProject
+ ? Api.projectShareWithGroup.bind(Api)
+ : Api.groupShareWithGroup.bind(Api);
+
+ apiShareWithGroup(this.id, this.shareWithGroupPostData(this.groupToBeSharedWith.id))
+ .then(this.showToastMessageSuccess)
+ .catch(this.showToastMessageError);
+ },
+ submitInviteMembers() {
const [usersToInviteByEmail, usersToAddById] = this.partitionNewUsersToInvite();
const promises = [];
@@ -155,10 +180,25 @@ export default {
Promise.all(promises).then(this.showToastMessageSuccess).catch(this.showToastMessageError);
},
inviteByEmailPostData(usersToInviteByEmail) {
- return { ...this.basePostData, email: usersToInviteByEmail };
+ return {
+ ...this.basePostData,
+ email: usersToInviteByEmail,
+ access_level: this.selectedAccessLevel,
+ };
},
addByUserIdPostData(usersToAddById) {
- return { ...this.basePostData, user_id: usersToAddById };
+ return {
+ ...this.basePostData,
+ user_id: usersToAddById,
+ access_level: this.selectedAccessLevel,
+ };
+ },
+ shareWithGroupPostData(groupToBeSharedWith) {
+ return {
+ ...this.basePostData,
+ group_id: groupToBeSharedWith,
+ group_access: this.selectedAccessLevel,
+ };
},
showToastMessageSuccess() {
this.$toast.show(this.$options.labels.toastMessageSuccessful, this.toastOptions);
@@ -170,9 +210,36 @@ export default {
},
},
labels: {
- modalTitle: s__('InviteMembersModal|Invite team members'),
- newUsersToInvite: s__('InviteMembersModal|GitLab member or Email address'),
- userPlaceholder: s__('InviteMembersModal|Search for members to invite'),
+ members: {
+ modalTitle: s__('InviteMembersModal|Invite team members'),
+ searchField: s__('InviteMembersModal|GitLab member or Email address'),
+ placeHolder: s__('InviteMembersModal|Search for members to invite'),
+ toGroup: {
+ introText: s__(
+ "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} group.",
+ ),
+ },
+ toProject: {
+ introText: s__(
+ "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project.",
+ ),
+ },
+ },
+ group: {
+ modalTitle: s__('InviteMembersModal|Invite a group'),
+ searchField: s__('InviteMembersModal|Select a group to invite'),
+ placeHolder: s__('InviteMembersModal|Search for a group to invite'),
+ toGroup: {
+ introText: s__(
+ "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group.",
+ ),
+ },
+ toProject: {
+ introText: s__(
+ "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} project.",
+ ),
+ },
+ },
accessLevel: s__('InviteMembersModal|Choose a role permission'),
accessExpireDate: s__('InviteMembersModal|Access expiration date (optional)'),
toastMessageSuccessful: s__('InviteMembersModal|Members were successfully added'),
@@ -189,31 +256,45 @@ export default {
<gl-modal
:modal-id="modalId"
size="sm"
- :title="$options.labels.modalTitle"
+ data-qa-selector="invite_members_modal_content"
+ :title="$options.labels[inviteeType].modalTitle"
:header-close-label="$options.labels.headerCloseLabel"
>
- <div class="gl-ml-5 gl-mr-5">
- <div>{{ introText }}</div>
+ <div>
+ <p ref="introText">
+ <gl-sprintf :message="introText">
+ <template #strong="{ content }">
+ <strong>{{ content }}</strong>
+ </template>
+ </gl-sprintf>
+ </p>
<label :id="$options.membersTokenSelectLabelId" class="gl-font-weight-bold gl-mt-5">{{
- $options.labels.newUsersToInvite
+ $options.labels[inviteeType].searchField
}}</label>
<div class="gl-mt-2">
<members-token-select
+ v-if="!isInviteGroup"
v-model="newUsersToInvite"
- :label="$options.labels.newUsersToInvite"
:aria-labelledby="$options.membersTokenSelectLabelId"
- :placeholder="$options.labels.userPlaceholder"
+ :placeholder="$options.labels[inviteeType].placeHolder"
/>
+ <group-select v-if="isInviteGroup" v-model="groupToBeSharedWith" />
</div>
- <label class="gl-font-weight-bold gl-mt-5">{{ $options.labels.accessLevel }}</label>
+ <label class="gl-font-weight-bold gl-mt-3">{{ $options.labels.accessLevel }}</label>
<div class="gl-mt-2 gl-w-half gl-xs-w-full">
- <gl-dropdown class="gl-shadow-none gl-w-full" v-bind="$attrs" :text="selectedRoleName">
+ <gl-dropdown
+ class="gl-shadow-none gl-w-full"
+ data-qa-selector="access_level_dropdown"
+ v-bind="$attrs"
+ :text="selectedRoleName"
+ >
<template v-for="(key, item) in accessLevels">
<gl-dropdown-item
:key="key"
active-class="is-active"
+ is-check-item
:is-checked="key === selectedAccessLevel"
@click="changeSelectedItem(key)"
>
@@ -223,7 +304,7 @@ export default {
</gl-dropdown>
</div>
- <div class="gl-mt-2">
+ <div class="gl-mt-2 gl-w-half gl-xs-w-full">
<gl-sprintf :message="$options.labels.readMoreText">
<template #link="{ content }">
<gl-link :href="helpLink" target="_blank">{{ content }}</gl-link>
@@ -231,7 +312,7 @@ export default {
</gl-sprintf>
</div>
- <label class="gl-font-weight-bold gl-mt-5" for="expires_at">{{
+ <label class="gl-font-weight-bold gl-mt-5 gl-display-block" for="expires_at">{{
$options.labels.accessExpireDate
}}</label>
<div class="gl-mt-2 gl-w-half gl-xs-w-full gl-display-inline-block">
@@ -253,15 +334,16 @@ export default {
</div>
<template #modal-footer>
- <div class="gl-display-flex gl-flex-direction-row gl-justify-content-end gl-flex-wrap gl-p-3">
+ <div class="gl-display-flex gl-flex-direction-row gl-justify-content-end gl-flex-wrap gl-m-0">
<gl-button ref="cancelButton" @click="cancelInvite">
{{ $options.labels.cancelButtonText }}
</gl-button>
<div class="gl-mr-3"></div>
<gl-button
ref="inviteButton"
- :disabled="!newUsersToInvite"
+ :disabled="inviteDisabled"
variant="success"
+ data-qa-selector="invite_button"
@click="sendInvite"
>{{ $options.labels.inviteButtonText }}</gl-button
>
diff --git a/app/assets/javascripts/invite_members/components/invite_members_trigger.vue b/app/assets/javascripts/invite_members/components/invite_members_trigger.vue
index eb97c458f88..666693e934f 100644
--- a/app/assets/javascripts/invite_members/components/invite_members_trigger.vue
+++ b/app/assets/javascripts/invite_members/components/invite_members_trigger.vue
@@ -1,13 +1,10 @@
<script>
-import { GlLink, GlIcon } from '@gitlab/ui';
+import { GlButton } from '@gitlab/ui';
import { s__ } from '~/locale';
import eventHub from '../event_hub';
export default {
- components: {
- GlLink,
- GlIcon,
- },
+ components: { GlButton },
props: {
displayText: {
type: String,
@@ -24,20 +21,28 @@ export default {
required: false,
default: '',
},
+ variant: {
+ type: String,
+ required: false,
+ default: undefined,
+ },
},
methods: {
openModal() {
- eventHub.$emit('openModal');
+ eventHub.$emit('openModal', { inviteeType: 'members' });
},
},
};
</script>
<template>
- <gl-link :class="classes" @click="openModal">
- <div v-if="icon" class="nav-icon-container">
- <gl-icon :size="16" :name="icon" />
- </div>
- <span class="nav-item-name"> {{ displayText }} </span>
- </gl-link>
+ <gl-button
+ :class="classes"
+ :icon="icon"
+ :variant="variant"
+ data-qa-selector="invite_members_button"
+ @click="openModal"
+ >
+ {{ displayText }}
+ </gl-button>
</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 233a214013b..db6a7888786 100644
--- a/app/assets/javascripts/invite_members/components/members_token_select.vue
+++ b/app/assets/javascripts/invite_members/components/members_token_select.vue
@@ -3,7 +3,7 @@ import { GlTokenSelector, GlAvatar, GlAvatarLabeled, GlSprintf } from '@gitlab/u
import { debounce } from 'lodash';
import { __ } from '~/locale';
import { getUsers } from '~/rest_api';
-import { USER_SEARCH_DELAY } from '../constants';
+import { SEARCH_DELAY } from '../constants';
export default {
components: {
@@ -67,7 +67,7 @@ export default {
.catch(() => {
this.loading = false;
});
- }, USER_SEARCH_DELAY),
+ }, SEARCH_DELAY),
handleInput() {
this.$emit('input', this.selectedTokens);
},
diff --git a/app/assets/javascripts/invite_members/constants.js b/app/assets/javascripts/invite_members/constants.js
index 1ff2125c292..2044dad896f 100644
--- a/app/assets/javascripts/invite_members/constants.js
+++ b/app/assets/javascripts/invite_members/constants.js
@@ -1 +1 @@
-export const USER_SEARCH_DELAY = 200;
+export const SEARCH_DELAY = 200;
diff --git a/app/assets/javascripts/invite_members/init_invite_group_trigger.js b/app/assets/javascripts/invite_members/init_invite_group_trigger.js
new file mode 100644
index 00000000000..c01bb1bae28
--- /dev/null
+++ b/app/assets/javascripts/invite_members/init_invite_group_trigger.js
@@ -0,0 +1,20 @@
+import Vue from 'vue';
+import InviteGroupTrigger from '~/invite_members/components/invite_group_trigger.vue';
+
+export default function initInviteGroupTrigger() {
+ const el = document.querySelector('.js-invite-group-trigger');
+
+ if (!el) {
+ return false;
+ }
+
+ return new Vue({
+ el,
+ render: (createElement) =>
+ createElement(InviteGroupTrigger, {
+ props: {
+ ...el.dataset,
+ },
+ }),
+ });
+}
diff --git a/app/assets/javascripts/invite_members/init_invite_members_form.js b/app/assets/javascripts/invite_members/init_invite_members_form.js
new file mode 100644
index 00000000000..5f8688755ba
--- /dev/null
+++ b/app/assets/javascripts/invite_members/init_invite_members_form.js
@@ -0,0 +1,7 @@
+import { disableButtonIfEmptyField } from '~/lib/utils/common_utils';
+
+// This is only used when `invite_members_group_modal` feature flag is disabled.
+// This file can be removed when `invite_members_group_modal` feature flag is removed
+export default () => {
+ disableButtonIfEmptyField('#user_ids', 'input[name=commit]', 'change');
+};
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 3de99dcc546..fc77bd53ba4 100644
--- a/app/assets/javascripts/invite_members/init_invite_members_modal.js
+++ b/app/assets/javascripts/invite_members/init_invite_members_modal.js
@@ -20,6 +20,7 @@ export default function initInviteMembersModal() {
...el.dataset,
isProject: parseBoolean(el.dataset.isProject),
accessLevels: JSON.parse(el.dataset.accessLevels),
+ defaultAccessLevel: parseInt(el.dataset.defaultAccessLevel, 10),
},
}),
});
diff --git a/app/assets/javascripts/issuable/components/csv_export_modal.vue b/app/assets/javascripts/issuable/components/csv_export_modal.vue
new file mode 100644
index 00000000000..78987a5c629
--- /dev/null
+++ b/app/assets/javascripts/issuable/components/csv_export_modal.vue
@@ -0,0 +1,100 @@
+<script>
+import { GlButton, GlModal, GlSprintf, GlIcon } from '@gitlab/ui';
+import { ISSUABLE_TYPE } from '../constants';
+
+export default {
+ name: 'CsvExportModal',
+ components: {
+ GlButton,
+ GlModal,
+ GlSprintf,
+ GlIcon,
+ },
+ inject: {
+ issuableType: {
+ default: '',
+ },
+ issuableCount: {
+ default: 0,
+ },
+ email: {
+ default: '',
+ },
+ exportCsvPath: {
+ default: '',
+ },
+ },
+ props: {
+ modalId: {
+ type: String,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ // eslint-disable-next-line @gitlab/require-i18n-strings
+ issuableName: this.issuableType === ISSUABLE_TYPE.issues ? 'issues' : 'merge requests',
+ };
+ },
+ issueableType: ISSUABLE_TYPE,
+};
+</script>
+
+<template>
+ <gl-modal :modal-id="modalId" body-class="gl-p-0!" data-qa-selector="export_issuable_modal">
+ <template #modal-title>
+ <gl-sprintf :message="__('Export %{name}')">
+ <template #name>{{ issuableName }}</template>
+ </gl-sprintf>
+ </template>
+ <div
+ v-if="issuableCount > -1"
+ data-testid="issuable-count-note"
+ class="gl-justify-content-start gl-align-items-center gl-p-4 gl-border-b-solid gl-border-1 gl-border-gray-50"
+ >
+ <gl-icon name="check" class="gl-color-green-400" />
+ <strong class="gl-m-3">
+ <gl-sprintf
+ v-if="issuableType === $options.issueableType.issues"
+ :message="n__('1 issue selected', '%d issues selected', issuableCount)"
+ >
+ <template #issuableCount>{{ issuableCount }}</template>
+ </gl-sprintf>
+ <gl-sprintf
+ v-else
+ :message="n__('1 merge request selected', '%d merge request selected', issuableCount)"
+ >
+ <template #issuableCount>{{ issuableCount }}</template>
+ </gl-sprintf>
+ </strong>
+ </div>
+ <div class="modal-text gl-px-4 gl-py-5">
+ <gl-sprintf
+ :message="
+ __(
+ `The CSV export will be created in the background. Once finished, it will be sent to %{strongStart}${email}%{strongEnd} in an attachment.`,
+ )
+ "
+ >
+ <template #strong="{ content }">
+ <strong>{{ content }}</strong>
+ </template>
+ </gl-sprintf>
+ </div>
+ <template #modal-footer>
+ <gl-button
+ category="primary"
+ variant="confirm"
+ :href="exportCsvPath"
+ data-method="post"
+ :data-qa-selector="`export_${issuableType}_button`"
+ data-track-event="click_button"
+ :data-track-label="`export_${issuableType}_csv`"
+ >
+ <gl-sprintf :message="__('Export %{name}')">
+ <template #name>{{ issuableName }}</template>
+ </gl-sprintf>
+ </gl-button>
+ </template>
+ </gl-modal>
+</template>
diff --git a/app/assets/javascripts/issuable/components/csv_import_export_buttons.vue b/app/assets/javascripts/issuable/components/csv_import_export_buttons.vue
new file mode 100644
index 00000000000..d75fa1e8323
--- /dev/null
+++ b/app/assets/javascripts/issuable/components/csv_import_export_buttons.vue
@@ -0,0 +1,87 @@
+<script>
+import {
+ GlButtonGroup,
+ GlButton,
+ GlDropdown,
+ GlDropdownItem,
+ GlTooltipDirective,
+ GlModalDirective,
+} from '@gitlab/ui';
+import CsvExportModal from './csv_export_modal.vue';
+import CsvImportModal from './csv_import_modal.vue';
+
+export default {
+ name: 'CsvImportExportButtons',
+ components: {
+ GlButtonGroup,
+ GlButton,
+ GlDropdown,
+ GlDropdownItem,
+ CsvExportModal,
+ CsvImportModal,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ GlModal: GlModalDirective,
+ },
+ inject: {
+ showExportButton: {
+ default: false,
+ },
+ showImportButton: {
+ default: false,
+ },
+ containerClass: {
+ default: '',
+ },
+ canEdit: {
+ default: false,
+ },
+ projectImportJiraPath: {
+ default: null,
+ },
+ },
+ computed: {
+ exportModalId() {
+ return `${this.issuableType}-export-modal`;
+ },
+ importModalId() {
+ return `${this.issuableType}-import-modal`;
+ },
+ },
+};
+</script>
+
+<template>
+ <div :class="containerClass">
+ <gl-button-group>
+ <gl-button
+ v-if="showExportButton"
+ v-gl-tooltip.hover="__('Export as CSV')"
+ v-gl-modal="exportModalId"
+ icon="export"
+ data-qa-selector="export_as_csv_button"
+ data-testid="export-csv-button"
+ />
+ <gl-dropdown
+ v-if="showImportButton"
+ v-gl-tooltip.hover="__('Import issues')"
+ data-testid="import-csv-dropdown"
+ icon="import"
+ >
+ <gl-dropdown-item v-gl-modal="importModalId" data-testid="import-csv-link">{{
+ __('Import CSV')
+ }}</gl-dropdown-item>
+ <gl-dropdown-item
+ v-if="canEdit"
+ :href="projectImportJiraPath"
+ data-qa-selector="import_from_jira_link"
+ data-testid="import-from-jira-link"
+ >{{ __('Import from Jira') }}</gl-dropdown-item
+ >
+ </gl-dropdown>
+ </gl-button-group>
+ <csv-export-modal v-if="showExportButton" :modal-id="exportModalId" />
+ <csv-import-modal v-if="showImportButton" :modal-id="importModalId" />
+ </div>
+</template>
diff --git a/app/assets/javascripts/issuable/components/csv_import_modal.vue b/app/assets/javascripts/issuable/components/csv_import_modal.vue
new file mode 100644
index 00000000000..77fc2f31583
--- /dev/null
+++ b/app/assets/javascripts/issuable/components/csv_import_modal.vue
@@ -0,0 +1,86 @@
+<script>
+import { GlModal, GlSprintf, GlFormGroup, GlButton } from '@gitlab/ui';
+import csrf from '~/lib/utils/csrf';
+import { ISSUABLE_TYPE } from '../constants';
+
+export default {
+ name: 'CsvImportModal',
+ components: {
+ GlModal,
+ GlSprintf,
+ GlFormGroup,
+ GlButton,
+ },
+ inject: {
+ issuableType: {
+ default: '',
+ },
+ exportCsvPath: {
+ default: '',
+ },
+ importCsvIssuesPath: {
+ default: '',
+ },
+ maxAttachmentSize: {
+ default: 0,
+ },
+ },
+ props: {
+ modalId: {
+ type: String,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ // eslint-disable-next-line @gitlab/require-i18n-strings
+ issuableName: this.issuableType === ISSUABLE_TYPE.issues ? 'issues' : 'merge requests',
+ };
+ },
+ methods: {
+ submitForm() {
+ this.$refs.form.submit();
+ },
+ },
+ csrf,
+};
+</script>
+
+<template>
+ <gl-modal :modal-id="modalId" :title="__('Import issues')">
+ <form
+ ref="form"
+ :action="importCsvIssuesPath"
+ enctype="multipart/form-data"
+ method="post"
+ data-testid="import-csv-form"
+ >
+ <input :value="$options.csrf.token" type="hidden" name="authenticity_token" />
+ <p>
+ {{
+ __(
+ "Your issues will be imported in the background. Once finished, you'll get a confirmation email.",
+ )
+ }}
+ </p>
+ <gl-form-group :label="__('Upload CSV file')" label-for="file">
+ <input id="file" type="file" name="file" accept=".csv,text/csv" />
+ </gl-form-group>
+ <p class="text-secondary">
+ {{
+ __(
+ 'It must have a header row and at least two columns: the first column is the issue title and the second column is the issue description. The separator is automatically detected.',
+ )
+ }}
+ <gl-sprintf :message="__('The maximum file size allowed is %{size}.')"
+ ><template #size>{{ maxAttachmentSize }}</template></gl-sprintf
+ >
+ </p>
+ </form>
+ <template #modal-footer>
+ <gl-button category="primary" variant="confirm" @click="submitForm">{{
+ __('Import issues')
+ }}</gl-button>
+ </template>
+ </gl-modal>
+</template>
diff --git a/app/assets/javascripts/issuable/constants.js b/app/assets/javascripts/issuable/constants.js
new file mode 100644
index 00000000000..9344f4a7c9a
--- /dev/null
+++ b/app/assets/javascripts/issuable/constants.js
@@ -0,0 +1,6 @@
+export const EVENT_ISSUABLE_VUE_APP_CHANGE = 'issuable_vue_app:change';
+
+export const ISSUABLE_TYPE = {
+ issues: 'issues',
+ mergeRequests: 'merge-requests',
+};
diff --git a/app/assets/javascripts/issuable/init_csv_import_export_buttons.js b/app/assets/javascripts/issuable/init_csv_import_export_buttons.js
new file mode 100644
index 00000000000..e8df44fa52b
--- /dev/null
+++ b/app/assets/javascripts/issuable/init_csv_import_export_buttons.js
@@ -0,0 +1,43 @@
+import Vue from 'vue';
+import { parseBoolean } from '~/lib/utils/common_utils';
+import ImportExportButtons from './components/csv_import_export_buttons.vue';
+
+export default () => {
+ const el = document.querySelector('.js-csv-import-export-buttons');
+
+ if (!el) return null;
+
+ const {
+ showExportButton,
+ showImportButton,
+ issuableType,
+ issuableCount,
+ email,
+ exportCsvPath,
+ importCsvIssuesPath,
+ containerClass,
+ canEdit,
+ projectImportJiraPath,
+ maxAttachmentSize,
+ } = el.dataset;
+
+ return new Vue({
+ el,
+ provide: {
+ showExportButton: parseBoolean(showExportButton),
+ showImportButton: parseBoolean(showImportButton),
+ issuableType,
+ issuableCount,
+ email,
+ exportCsvPath,
+ importCsvIssuesPath,
+ containerClass,
+ canEdit: parseBoolean(canEdit),
+ projectImportJiraPath,
+ maxAttachmentSize,
+ },
+ render(h) {
+ return h(ImportExportButtons);
+ },
+ });
+};
diff --git a/app/assets/javascripts/issuable_form.js b/app/assets/javascripts/issuable_form.js
index 1b06dffbae7..153123a005f 100644
--- a/app/assets/javascripts/issuable_form.js
+++ b/app/assets/javascripts/issuable_form.js
@@ -5,6 +5,7 @@ import Autosave from './autosave';
import AutoWidthDropdownSelect from './issuable/auto_width_dropdown_select';
import { loadCSSFile } from './lib/utils/css_utils';
import { parsePikadayDate, pikadayToString } from './lib/utils/datetime_utility';
+import { select2AxiosTransport } from './lib/utils/select2_utils';
import { queryToObject, objectToQuery } from './lib/utils/url_utility';
import UsersSelect from './users_select';
import ZenMode from './zen_mode';
@@ -199,15 +200,16 @@ export default class IssuableForm {
search,
};
},
- results(data) {
+ results({ results }) {
return {
// `data` keys are translated so we can't just access them with a string based key
- results: data[Object.keys(data)[0]].map((name) => ({
+ results: results[Object.keys(results)[0]].map((name) => ({
id: name,
text: name,
})),
};
},
+ transport: select2AxiosTransport,
},
initSelection(el, callback) {
const val = el.val();
diff --git a/app/assets/javascripts/issuable_list/components/issuable_item.vue b/app/assets/javascripts/issuable_list/components/issuable_item.vue
index 39852eba71a..f4d2312c70d 100644
--- a/app/assets/javascripts/issuable_list/components/issuable_item.vue
+++ b/app/assets/javascripts/issuable_list/components/issuable_item.vue
@@ -34,6 +34,11 @@ export default {
type: Boolean,
required: true,
},
+ labelFilterParam: {
+ type: String,
+ required: false,
+ default: 'label_name',
+ },
showCheckbox: {
type: Boolean,
required: true,
@@ -105,9 +110,8 @@ export default {
},
labelTarget(label) {
if (this.enableLabelPermalinks) {
- const key = encodeURIComponent('label_name[]');
const value = encodeURIComponent(this.labelTitle(label));
- return `?${key}=${value}`;
+ return `?${this.labelFilterParam}[]=${value}`;
}
return '#';
},
diff --git a/app/assets/javascripts/issuable_list/components/issuable_list_root.vue b/app/assets/javascripts/issuable_list/components/issuable_list_root.vue
index 708e175cdb2..be60f41caaf 100644
--- a/app/assets/javascripts/issuable_list/components/issuable_list_root.vue
+++ b/app/assets/javascripts/issuable_list/components/issuable_list_root.vue
@@ -122,6 +122,11 @@ export default {
required: false,
default: true,
},
+ labelFilterParam: {
+ type: String,
+ required: false,
+ default: null,
+ },
},
data() {
return {
@@ -180,7 +185,7 @@ export default {
handler(params) {
if (Object.keys(params).length) {
updateHistory({
- url: setUrlParams(params, window.location.href, true),
+ url: setUrlParams(params, window.location.href, true, false, true),
title: document.title,
replace: true,
});
@@ -258,6 +263,7 @@ export default {
:issuable-symbol="issuableSymbol"
:issuable="issuable"
:enable-label-permalinks="enableLabelPermalinks"
+ :label-filter-param="labelFilterParam"
:show-checkbox="showBulkEditSidebar"
:checked="issuableChecked(issuable)"
@checked-input="handleIssuableCheckedInput(issuable, $event)"
diff --git a/app/assets/javascripts/issuable_show/components/issuable_discussion.vue b/app/assets/javascripts/issuable_show/components/issuable_discussion.vue
new file mode 100644
index 00000000000..5858af6cc51
--- /dev/null
+++ b/app/assets/javascripts/issuable_show/components/issuable_discussion.vue
@@ -0,0 +1,15 @@
+<script>
+export default {
+ name: 'IssuableDiscussion',
+};
+</script>
+
+<template>
+ <section class="issuable-discussion">
+ <div>
+ <ul class="notes main-notes-list timeline">
+ <slot name="discussion"></slot>
+ </ul>
+ </div>
+ </section>
+</template>
diff --git a/app/assets/javascripts/issuable_show/components/issuable_show_root.vue b/app/assets/javascripts/issuable_show/components/issuable_show_root.vue
index 240f35b74c8..881b565ab46 100644
--- a/app/assets/javascripts/issuable_show/components/issuable_show_root.vue
+++ b/app/assets/javascripts/issuable_show/components/issuable_show_root.vue
@@ -2,6 +2,7 @@
import IssuableSidebar from '~/issuable_sidebar/components/issuable_sidebar_root.vue';
import IssuableBody from './issuable_body.vue';
+import IssuableDiscussion from './issuable_discussion.vue';
import IssuableHeader from './issuable_header.vue';
export default {
@@ -9,6 +10,7 @@ export default {
IssuableSidebar,
IssuableHeader,
IssuableBody,
+ IssuableDiscussion,
},
props: {
issuable: {
@@ -89,6 +91,7 @@ export default {
<slot name="header-actions"></slot>
</template>
</issuable-header>
+
<issuable-body
:issuable="issuable"
:status-badge-class="statusBadgeClass"
@@ -111,6 +114,13 @@ export default {
<slot name="edit-form-actions" v-bind="actionsProps"></slot>
</template>
</issuable-body>
+
+ <issuable-discussion>
+ <template #discussion>
+ <slot name="discussion"></slot>
+ </template>
+ </issuable-discussion>
+
<issuable-sidebar @sidebar-toggle="$emit('sidebar-toggle', $event)">
<template #right-sidebar-items="sidebarProps">
<slot name="right-sidebar-items" v-bind="sidebarProps"></slot>
diff --git a/app/assets/javascripts/issue.js b/app/assets/javascripts/issue.js
index 3f25682ab8b..f6eff8133a7 100644
--- a/app/assets/javascripts/issue.js
+++ b/app/assets/javascripts/issue.js
@@ -2,6 +2,7 @@ import $ from 'jquery';
import { joinPaths } from '~/lib/utils/url_utility';
import CreateMergeRequestDropdown from './create_merge_request_dropdown';
import { deprecatedCreateFlash as flash } from './flash';
+import { EVENT_ISSUABLE_VUE_APP_CHANGE } from './issuable/constants';
import axios from './lib/utils/axios_utils';
import { addDelimiter } from './lib/utils/text_utility';
import { __ } from './locale';
@@ -23,9 +24,13 @@ export default class Issue {
}
// Listen to state changes in the Vue app
- document.addEventListener('issuable_vue_app:change', (event) => {
+ this.issuableVueAppChangeHandler = (event) =>
this.updateTopState(event.detail.isClosed, event.detail.data);
- });
+ document.addEventListener(EVENT_ISSUABLE_VUE_APP_CHANGE, this.issuableVueAppChangeHandler);
+ }
+
+ dispose() {
+ document.removeEventListener(EVENT_ISSUABLE_VUE_APP_CHANGE, this.issuableVueAppChangeHandler);
}
/**
diff --git a/app/assets/javascripts/issue_show/components/app.vue b/app/assets/javascripts/issue_show/components/app.vue
index e70c18040b3..9b978483cc6 100644
--- a/app/assets/javascripts/issue_show/components/app.vue
+++ b/app/assets/javascripts/issue_show/components/app.vue
@@ -5,7 +5,6 @@ import { deprecatedCreateFlash as createFlash } from '~/flash';
import Poll from '~/lib/utils/poll';
import { visitUrl } from '~/lib/utils/url_utility';
import { __, s__, sprintf } from '~/locale';
-import recaptchaModalImplementor from '~/vue_shared/mixins/recaptcha_modal_implementor';
import { IssuableStatus, IssuableStatusText, IssuableType } from '../constants';
import eventHub from '../event_hub';
import Service from '../services/index';
@@ -25,7 +24,6 @@ export default {
formComponent,
PinnedLinks,
},
- mixins: [recaptchaModalImplementor],
props: {
endpoint: {
required: true,
@@ -250,6 +248,7 @@ export default {
},
},
created() {
+ this.flashContainer = null;
this.service = new Service(this.endpoint);
this.poll = new Poll({
resource: this.service,
@@ -289,7 +288,7 @@ export default {
methods: {
handleBeforeUnloadEvent(e) {
const event = e;
- if (this.showForm && this.issueChanged && !this.showRecaptcha) {
+ if (this.showForm && this.issueChanged) {
event.returnValue = __('Are you sure you want to lose your issue information?');
}
return undefined;
@@ -307,7 +306,7 @@ export default {
});
},
- updateAndShowForm(templates = []) {
+ updateAndShowForm(templates = {}) {
if (!this.showForm) {
this.showForm = true;
this.store.setFormState({
@@ -347,10 +346,10 @@ export default {
},
updateIssuable() {
+ this.clearFlash();
return this.service
.updateIssuable(this.store.formState)
.then((res) => res.data)
- .then((data) => this.checkForSpam(data))
.then((data) => {
if (!window.location.pathname.includes(data.web_url)) {
visitUrl(data.web_url);
@@ -361,28 +360,22 @@ export default {
eventHub.$emit('close.form');
})
.catch((error = {}) => {
- const { name, response = {} } = error;
+ const { message, response = {} } = error;
- if (name === 'SpamError') {
- this.openRecaptcha();
- } else {
- let errMsg = this.defaultErrorMessage;
+ this.store.setFormState({
+ updateLoading: false,
+ });
- if (response.data && response.data.errors) {
- errMsg += `. ${response.data.errors.join(' ')}`;
- }
+ let errMsg = this.defaultErrorMessage;
- createFlash(errMsg);
+ if (response.data && response.data.errors) {
+ errMsg += `. ${response.data.errors.join(' ')}`;
+ } else if (message) {
+ errMsg += `. ${message}`;
}
- });
- },
-
- closeRecaptchaModal() {
- this.store.setFormState({
- updateLoading: false,
- });
- this.closeRecaptcha();
+ this.flashContainer = createFlash(errMsg);
+ });
},
deleteIssuable(payload) {
@@ -409,6 +402,13 @@ export default {
showStickyHeader() {
this.isStickyHeaderShowing = true;
},
+
+ clearFlash() {
+ if (this.flashContainer) {
+ this.flashContainer.style.display = 'none';
+ this.flashContainer = null;
+ }
+ },
},
};
</script>
@@ -430,13 +430,6 @@ export default {
:enable-autocomplete="enableAutocomplete"
:issuable-type="issuableType"
/>
-
- <recaptcha-modal
- v-show="showRecaptcha"
- ref="recaptchaModal"
- :html="recaptchaHTML"
- @close="closeRecaptchaModal"
- />
</div>
<div v-else>
<title-component
diff --git a/app/assets/javascripts/issue_show/components/description.vue b/app/assets/javascripts/issue_show/components/description.vue
index 5416d3bebd0..68bc6fe4c0e 100644
--- a/app/assets/javascripts/issue_show/components/description.vue
+++ b/app/assets/javascripts/issue_show/components/description.vue
@@ -4,7 +4,6 @@ import $ from 'jquery';
import { deprecatedCreateFlash as createFlash } from '~/flash';
import { s__, sprintf } from '~/locale';
import TaskList from '../../task_list';
-import recaptchaModalImplementor from '../../vue_shared/mixins/recaptcha_modal_implementor';
import animateMixin from '../mixins/animate';
export default {
@@ -12,7 +11,7 @@ export default {
SafeHtml,
},
- mixins: [animateMixin, recaptchaModalImplementor],
+ mixins: [animateMixin],
props: {
canUpdate: {
@@ -87,21 +86,11 @@ export default {
fieldName: 'description',
lockVersion: this.lockVersion,
selector: '.detail-page-description',
- onSuccess: this.taskListUpdateSuccess.bind(this),
onError: this.taskListUpdateError.bind(this),
});
}
},
- taskListUpdateSuccess(data) {
- try {
- this.checkForSpam(data);
- this.closeRecaptcha();
- } catch (error) {
- if (error && error.name === 'SpamError') this.openRecaptcha();
- }
- },
-
taskListUpdateError() {
createFlash(
sprintf(
@@ -165,7 +154,5 @@ export default {
>
</textarea>
<!-- eslint-enable vue/no-mutating-props -->
-
- <recaptcha-modal v-show="showRecaptcha" :html="recaptchaHTML" @close="closeRecaptcha" />
</div>
</template>
diff --git a/app/assets/javascripts/issue_show/components/edit_actions.vue b/app/assets/javascripts/issue_show/components/edit_actions.vue
index dd378c40b46..20c759cfbbd 100644
--- a/app/assets/javascripts/issue_show/components/edit_actions.vue
+++ b/app/assets/javascripts/issue_show/components/edit_actions.vue
@@ -45,15 +45,23 @@ export default {
shouldShowDeleteButton() {
return this.canDestroy && this.showDeleteButton;
},
+ deleteIssuableButtonText() {
+ return sprintf(__('Delete %{issuableType}'), {
+ issuableType: issuableTypes[this.issuableType],
+ });
+ },
},
methods: {
closeForm() {
eventHub.$emit('close.form');
},
deleteIssuable() {
- const confirmMessage = sprintf(__('%{issuableType} will be removed! Are you sure?'), {
- issuableType: issuableTypes[this.issuableType],
- });
+ const confirmMessage =
+ this.issuableType === 'epic'
+ ? __('Delete this epic and all descendants?')
+ : sprintf(__('%{issuableType} will be removed! Are you sure?'), {
+ issuableType: issuableTypes[this.issuableType],
+ });
// eslint-disable-next-line no-alert
if (window.confirm(confirmMessage)) {
this.deleteLoading = true;
@@ -90,7 +98,7 @@ export default {
class="float-right gl-mr-3 qa-delete-button"
@click="deleteIssuable"
>
- {{ __('Delete') }}
+ {{ deleteIssuableButtonText }}
</gl-button>
</div>
</template>
diff --git a/app/assets/javascripts/issue_show/components/fields/description_template.vue b/app/assets/javascripts/issue_show/components/fields/description_template.vue
index dbec6f15cab..570bc7df3cf 100644
--- a/app/assets/javascripts/issue_show/components/fields/description_template.vue
+++ b/app/assets/javascripts/issue_show/components/fields/description_template.vue
@@ -13,9 +13,9 @@ export default {
required: true,
},
issuableTemplates: {
- type: Array,
+ type: [Object, Array],
required: false,
- default: () => [],
+ default: () => {},
},
projectPath: {
type: String,
diff --git a/app/assets/javascripts/issue_show/components/form.vue b/app/assets/javascripts/issue_show/components/form.vue
index b7425448052..76ea489fb86 100644
--- a/app/assets/javascripts/issue_show/components/form.vue
+++ b/app/assets/javascripts/issue_show/components/form.vue
@@ -26,9 +26,9 @@ export default {
required: true,
},
issuableTemplates: {
- type: Array,
+ type: [Object, Array],
required: false,
- default: () => [],
+ default: () => {},
},
issuableType: {
type: String,
@@ -72,7 +72,7 @@ export default {
},
computed: {
hasIssuableTemplates() {
- return this.issuableTemplates.length;
+ return Object.values(Object(this.issuableTemplates)).length;
},
showLockedWarning() {
return this.formState.lockedWarningVisible && !this.formState.updateLoading;
diff --git a/app/assets/javascripts/issue_show/components/header_actions.vue b/app/assets/javascripts/issue_show/components/header_actions.vue
index 9c3988d0469..2f2c4c6e341 100644
--- a/app/assets/javascripts/issue_show/components/header_actions.vue
+++ b/app/assets/javascripts/issue_show/components/header_actions.vue
@@ -2,6 +2,7 @@
import { GlButton, GlDropdown, GlDropdownItem, GlIcon, GlLink, GlModal } from '@gitlab/ui';
import { mapActions, mapGetters, mapState } from 'vuex';
import createFlash, { FLASH_TYPES } from '~/flash';
+import { EVENT_ISSUABLE_VUE_APP_CHANGE } from '~/issuable/constants';
import { IssuableType } from '~/issuable_show/constants';
import { IssuableStatus, IssueStateEvent } from '~/issue_show/constants';
import { capitalizeFirstCharacter } from '~/lib/utils/text_utility';
@@ -148,7 +149,7 @@ export default {
};
// Dispatch event which updates open/close state, shared among the issue show page
- document.dispatchEvent(new CustomEvent('issuable_vue_app:change', payload));
+ document.dispatchEvent(new CustomEvent(EVENT_ISSUABLE_VUE_APP_CHANGE, payload));
})
.catch(() => createFlash({ message: __('Error occurred while updating the issue status') }))
.finally(() => {
diff --git a/app/assets/javascripts/issue_show/services/index.js b/app/assets/javascripts/issue_show/services/index.js
index b1deeaae0fc..08b04ebfdaf 100644
--- a/app/assets/javascripts/issue_show/services/index.js
+++ b/app/assets/javascripts/issue_show/services/index.js
@@ -1,9 +1,11 @@
+import { registerCaptchaModalInterceptor } from '~/captcha/captcha_modal_axios_interceptor';
import axios from '../../lib/utils/axios_utils';
export default class Service {
constructor(endpoint) {
this.endpoint = `${endpoint}.json`;
this.realtimeEndpoint = `${endpoint}/realtime_changes`;
+ registerCaptchaModalInterceptor(axios);
}
getData() {
diff --git a/app/assets/javascripts/issue_show/stores/index.js b/app/assets/javascripts/issue_show/stores/index.js
index 06bbd406e3a..a50913d3455 100644
--- a/app/assets/javascripts/issue_show/stores/index.js
+++ b/app/assets/javascripts/issue_show/stores/index.js
@@ -11,7 +11,7 @@ export default class Store {
lockedWarningVisible: false,
updateLoading: false,
lock_version: 0,
- issuableTemplates: [],
+ issuableTemplates: {},
};
}
diff --git a/app/assets/javascripts/issue_show/utils/parse_data.js b/app/assets/javascripts/issue_show/utils/parse_data.js
index 19d1e0eebcb..f1e6bd2419a 100644
--- a/app/assets/javascripts/issue_show/utils/parse_data.js
+++ b/app/assets/javascripts/issue_show/utils/parse_data.js
@@ -1,5 +1,5 @@
+import * as Sentry from '@sentry/browser';
import { sanitize } from '~/lib/dompurify';
-import * as Sentry from '~/sentry/wrapper';
// We currently load + parse the data from the issue app and related merge request
let cachedParsedData;
diff --git a/app/assets/javascripts/issues_list/components/issuable.vue b/app/assets/javascripts/issues_list/components/issuable.vue
index b7af6e098e1..60b01a6d37f 100644
--- a/app/assets/javascripts/issues_list/components/issuable.vue
+++ b/app/assets/javascripts/issues_list/components/issuable.vue
@@ -25,16 +25,16 @@ import {
newDateAsLocaleTime,
} from '~/lib/utils/datetime_utility';
import { convertToCamelCase } from '~/lib/utils/text_utility';
-import { mergeUrlParams } from '~/lib/utils/url_utility';
+import { mergeUrlParams, setUrlFragment, isExternal } from '~/lib/utils/url_utility';
import { sprintf, __ } from '~/locale';
import initUserPopovers from '~/user_popovers';
import IssueAssignees from '~/vue_shared/components/issue/issue_assignees.vue';
export default {
i18n: {
- openedAgo: __('opened %{timeAgoString} by %{user}'),
- openedAgoJira: __('opened %{timeAgoString} by %{user} in Jira'),
- openedAgoServiceDesk: __('opened %{timeAgoString} by %{email} via %{user}'),
+ openedAgo: __('created %{timeAgoString} by %{user}'),
+ openedAgoJira: __('created %{timeAgoString} by %{user} in Jira'),
+ openedAgoServiceDesk: __('created %{timeAgoString} by %{email} via %{user}'),
},
components: {
IssueAssignees,
@@ -102,8 +102,14 @@ export default {
isJiraIssue() {
return this.issuable.external_tracker === 'jira';
},
+ webUrl() {
+ return this.issuable.gitlab_web_url || this.issuable.web_url;
+ },
+ isIssuableUrlExternal() {
+ return isExternal(this.webUrl);
+ },
linkTarget() {
- return this.isJiraIssue ? '_blank' : null;
+ return this.isIssuableUrlExternal ? '_blank' : null;
},
issueCreatedToday() {
return getDayDifference(new Date(this.issuable.created_at), new Date()) < 1;
@@ -188,7 +194,7 @@ export default {
value: this.issuable.blocking_issues_count,
title: __('Blocking issues'),
dataTestId: 'blocking-issues',
- href: `${this.issuable.web_url}#related-issues`,
+ href: setUrlFragment(this.webUrl, 'related-issues'),
icon: 'issue-block',
},
{
@@ -197,7 +203,7 @@ export default {
value: this.issuable.user_notes_count,
title: __('Comments'),
dataTestId: 'notes-count',
- href: `${this.issuable.web_url}#notes`,
+ href: setUrlFragment(this.webUrl, 'notes'),
class: { 'no-comments': !this.issuable.user_notes_count, 'issuable-comments': true },
icon: 'comments',
},
@@ -252,7 +258,7 @@ export default {
:class="{ today: issueCreatedToday, closed: isClosed }"
:data-id="issuable.id"
:data-labels="labelIdsString"
- :data-url="issuable.web_url"
+ :data-url="webUrl"
data-qa-selector="issue_container"
:data-qa-issue-title="issuable.title"
>
@@ -284,13 +290,14 @@ export default {
:aria-label="$options.confidentialTooltipText"
/>
<gl-link
- :href="issuable.web_url"
+ :href="webUrl"
:target="linkTarget"
data-testid="issuable-title"
data-qa-selector="issue_link"
- >{{ issuable.title
- }}<gl-icon
- v-if="isJiraIssue"
+ >
+ {{ issuable.title }}
+ <gl-icon
+ v-if="isIssuableUrlExternal"
name="external-link"
class="gl-vertical-align-text-bottom gl-ml-2"
/>
diff --git a/app/assets/javascripts/issues_list/components/jira_issues_import_status_app.vue b/app/assets/javascripts/issues_list/components/jira_issues_import_status_app.vue
new file mode 100644
index 00000000000..ba0ca57523a
--- /dev/null
+++ b/app/assets/javascripts/issues_list/components/jira_issues_import_status_app.vue
@@ -0,0 +1,112 @@
+<script>
+import { GlAlert, GlLabel } from '@gitlab/ui';
+import { last } from 'lodash';
+import {
+ calculateJiraImportLabel,
+ isInProgress,
+ setFinishedAlertHideMap,
+ shouldShowFinishedAlert,
+} from '~/jira_import/utils/jira_import_utils';
+import { n__ } from '~/locale';
+import getIssuesListDetailsQuery from '../queries/get_issues_list_details.query.graphql';
+
+export default {
+ name: 'JiraIssuesImportStatus',
+ components: {
+ GlAlert,
+ GlLabel,
+ },
+ props: {
+ canEdit: {
+ type: Boolean,
+ required: true,
+ },
+ isJiraConfigured: {
+ type: Boolean,
+ required: true,
+ },
+ issuesPath: {
+ type: String,
+ required: true,
+ },
+ projectPath: {
+ type: String,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ jiraImport: {},
+ };
+ },
+ apollo: {
+ jiraImport: {
+ query: getIssuesListDetailsQuery,
+ variables() {
+ return {
+ fullPath: this.projectPath,
+ };
+ },
+ update: ({ project }) => {
+ const label = calculateJiraImportLabel(
+ project.jiraImports.nodes,
+ project.issues.nodes.flatMap(({ labels }) => labels.nodes),
+ );
+ return {
+ importedIssuesCount: last(project.jiraImports.nodes)?.importedIssuesCount,
+ label,
+ shouldShowFinishedAlert: shouldShowFinishedAlert(label.title, project.jiraImportStatus),
+ shouldShowInProgressAlert: isInProgress(project.jiraImportStatus),
+ };
+ },
+ skip() {
+ return !this.isJiraConfigured || !this.canEdit;
+ },
+ },
+ },
+ computed: {
+ finishedMessage() {
+ return n__(
+ '%d issue successfully imported with the label',
+ '%d issues successfully imported with the label',
+ this.jiraImport.importedIssuesCount,
+ );
+ },
+ labelTarget() {
+ return `${this.issuesPath}?label_name[]=${encodeURIComponent(this.jiraImport.label.title)}`;
+ },
+ },
+ methods: {
+ hideFinishedAlert() {
+ setFinishedAlertHideMap(this.jiraImport.label.title);
+ this.jiraImport.shouldShowFinishedAlert = false;
+ },
+ hideInProgressAlert() {
+ this.jiraImport.shouldShowInProgressAlert = false;
+ },
+ },
+};
+</script>
+
+<template>
+ <div class="gl-my-5">
+ <gl-alert v-if="jiraImport.shouldShowInProgressAlert" @dismiss="hideInProgressAlert">
+ {{ __('Import in progress. Refresh page to see newly added issues.') }}
+ </gl-alert>
+
+ <gl-alert
+ v-else-if="jiraImport.shouldShowFinishedAlert"
+ variant="success"
+ @dismiss="hideFinishedAlert"
+ >
+ {{ finishedMessage }}
+ <gl-label
+ :background-color="jiraImport.label.color"
+ scoped
+ size="sm"
+ :target="labelTarget"
+ :title="jiraImport.label.title"
+ />
+ </gl-alert>
+ </div>
+</template>
diff --git a/app/assets/javascripts/issues_list/components/jira_issues_list_root.vue b/app/assets/javascripts/issues_list/components/jira_issues_list_root.vue
deleted file mode 100644
index 7396cfe27b3..00000000000
--- a/app/assets/javascripts/issues_list/components/jira_issues_list_root.vue
+++ /dev/null
@@ -1,112 +0,0 @@
-<script>
-import { GlAlert, GlLabel } from '@gitlab/ui';
-import { last } from 'lodash';
-import {
- calculateJiraImportLabel,
- isInProgress,
- setFinishedAlertHideMap,
- shouldShowFinishedAlert,
-} from '~/jira_import/utils/jira_import_utils';
-import { n__ } from '~/locale';
-import getIssuesListDetailsQuery from '../queries/get_issues_list_details.query.graphql';
-
-export default {
- name: 'JiraIssuesList',
- components: {
- GlAlert,
- GlLabel,
- },
- props: {
- canEdit: {
- type: Boolean,
- required: true,
- },
- isJiraConfigured: {
- type: Boolean,
- required: true,
- },
- issuesPath: {
- type: String,
- required: true,
- },
- projectPath: {
- type: String,
- required: true,
- },
- },
- data() {
- return {
- jiraImport: {},
- };
- },
- apollo: {
- jiraImport: {
- query: getIssuesListDetailsQuery,
- variables() {
- return {
- fullPath: this.projectPath,
- };
- },
- update: ({ project }) => {
- const label = calculateJiraImportLabel(
- project.jiraImports.nodes,
- project.issues.nodes.flatMap(({ labels }) => labels.nodes),
- );
- return {
- importedIssuesCount: last(project.jiraImports.nodes)?.importedIssuesCount,
- label,
- shouldShowFinishedAlert: shouldShowFinishedAlert(label.title, project.jiraImportStatus),
- shouldShowInProgressAlert: isInProgress(project.jiraImportStatus),
- };
- },
- skip() {
- return !this.isJiraConfigured || !this.canEdit;
- },
- },
- },
- computed: {
- finishedMessage() {
- return n__(
- '%d issue successfully imported with the label',
- '%d issues successfully imported with the label',
- this.jiraImport.importedIssuesCount,
- );
- },
- labelTarget() {
- return `${this.issuesPath}?label_name[]=${encodeURIComponent(this.jiraImport.label.title)}`;
- },
- },
- methods: {
- hideFinishedAlert() {
- setFinishedAlertHideMap(this.jiraImport.label.title);
- this.jiraImport.shouldShowFinishedAlert = false;
- },
- hideInProgressAlert() {
- this.jiraImport.shouldShowInProgressAlert = false;
- },
- },
-};
-</script>
-
-<template>
- <div class="issuable-list-root">
- <gl-alert v-if="jiraImport.shouldShowInProgressAlert" @dismiss="hideInProgressAlert">
- {{ __('Import in progress. Refresh page to see newly added issues.') }}
- </gl-alert>
-
- <gl-alert
- v-if="jiraImport.shouldShowFinishedAlert"
- variant="success"
- @dismiss="hideFinishedAlert"
- >
- {{ finishedMessage }}
- <gl-label
- :background-color="jiraImport.label.color"
- scoped
- size="sm"
- :target="labelTarget"
- :title="jiraImport.label.title"
- />
- </gl-alert>
- </div>
-</template>
diff --git a/app/assets/javascripts/issues_list/index.js b/app/assets/javascripts/issues_list/index.js
index 5c3910955bc..295d4464866 100644
--- a/app/assets/javascripts/issues_list/index.js
+++ b/app/assets/javascripts/issues_list/index.js
@@ -3,10 +3,10 @@ import VueApollo from 'vue-apollo';
import createDefaultClient from '~/lib/graphql';
import { parseBoolean, convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
import IssuablesListApp from './components/issuables_list_app.vue';
-import JiraIssuesListRoot from './components/jira_issues_list_root.vue';
+import JiraIssuesImportStatusRoot from './components/jira_issues_import_status_app.vue';
function mountJiraIssuesListApp() {
- const el = document.querySelector('.js-projects-issues-root');
+ const el = document.querySelector('.js-jira-issues-import-status');
if (!el) {
return false;
@@ -23,7 +23,7 @@ function mountJiraIssuesListApp() {
el,
apolloProvider,
render(createComponent) {
- return createComponent(JiraIssuesListRoot, {
+ return createComponent(JiraIssuesImportStatusRoot, {
props: {
canEdit: parseBoolean(el.dataset.canEdit),
isJiraConfigured: parseBoolean(el.dataset.isJiraConfigured),
@@ -36,7 +36,7 @@ function mountJiraIssuesListApp() {
}
function mountIssuablesListApp() {
- if (!gon.features?.vueIssuablesList && !gon.features?.jiraIssuesIntegration) {
+ if (!gon.features?.vueIssuablesList) {
return;
}
diff --git a/app/assets/javascripts/jira_connect/components/app.vue b/app/assets/javascripts/jira_connect/components/app.vue
index a4ba86dc6a1..fe5ad8b67d7 100644
--- a/app/assets/javascripts/jira_connect/components/app.vue
+++ b/app/assets/javascripts/jira_connect/components/app.vue
@@ -1,10 +1,11 @@
<script>
-import { GlAlert, GlButton, GlModal, GlModalDirective } from '@gitlab/ui';
-import { mapState } from 'vuex';
+import { GlAlert, GlButton, GlModal, GlModalDirective, GlLink, GlSprintf } from '@gitlab/ui';
+import { mapState, mapMutations } from 'vuex';
import { getLocation } from '~/jira_connect/api';
import { __ } from '~/locale';
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
-
+import { SET_ALERT } from '../store/mutation_types';
+import { retrieveAlert } from '../utils';
import GroupsList from './groups_list.vue';
export default {
@@ -14,6 +15,8 @@ export default {
GlButton,
GlModal,
GroupsList,
+ GlLink,
+ GlSprintf,
},
directives: {
GlModalDirective,
@@ -30,10 +33,7 @@ export default {
};
},
computed: {
- ...mapState(['errorMessage']),
- showNewUI() {
- return this.glFeatures.newJiraConnectUi;
- },
+ ...mapState(['alert']),
usersPathWithReturnTo() {
if (this.location) {
return `${this.usersPath}?return_to=${this.location}`;
@@ -41,6 +41,9 @@ export default {
return this.usersPath;
},
+ shouldShowAlert() {
+ return Boolean(this.alert?.message);
+ },
},
modal: {
cancelProps: {
@@ -48,27 +51,48 @@ export default {
},
},
created() {
+ this.setInitialAlert();
this.setLocation();
},
methods: {
+ ...mapMutations({
+ setAlert: SET_ALERT,
+ }),
async setLocation() {
this.location = await getLocation();
},
+ setInitialAlert() {
+ const { linkUrl, title, message, variant } = retrieveAlert() || {};
+ this.setAlert({ linkUrl, title, message, variant });
+ },
},
};
</script>
<template>
<div>
- <gl-alert v-if="errorMessage" class="gl-mb-6" variant="danger" :dismissible="false">
- {{ errorMessage }}
+ <gl-alert
+ v-if="shouldShowAlert"
+ class="gl-mb-7"
+ :variant="alert.variant"
+ :title="alert.title"
+ @dismiss="setAlert"
+ >
+ <gl-sprintf v-if="alert.linkUrl" :message="alert.message">
+ <template #link="{ content }">
+ <gl-link :href="alert.linkUrl" target="_blank">{{ content }}</gl-link>
+ </template>
+ </gl-sprintf>
+
+ <template v-else>
+ {{ alert.message }}
+ </template>
</gl-alert>
- <h2>{{ s__('JiraService|GitLab for Jira Configuration') }}</h2>
+ <h2 class="gl-text-center">{{ s__('JiraService|GitLab for Jira Configuration') }}</h2>
<div
- v-if="showNewUI"
- class="gl-display-flex gl-justify-content-space-between gl-my-7 gl-pb-4 gl-border-b-solid gl-border-b-1 gl-border-b-gray-200"
+ class="jira-connect-app-body gl-display-flex gl-justify-content-space-between gl-my-7 gl-pb-4 gl-border-b-solid gl-border-b-1 gl-border-b-gray-200"
>
<h5 class="gl-align-self-center gl-mb-0" data-testid="new-jira-connect-ui-heading">
{{ s__('Integrations|Linked namespaces') }}
diff --git a/app/assets/javascripts/jira_connect/components/groups_list_item.vue b/app/assets/javascripts/jira_connect/components/groups_list_item.vue
index 69b09ab0a21..b8959a2a505 100644
--- a/app/assets/javascripts/jira_connect/components/groups_list_item.vue
+++ b/app/assets/javascripts/jira_connect/components/groups_list_item.vue
@@ -1,7 +1,9 @@
<script>
import { GlAvatar, GlButton, GlIcon } from '@gitlab/ui';
+import { helpPagePath } from '~/helpers/help_page_helper';
import { addSubscription } from '~/jira_connect/api';
import { s__ } from '~/locale';
+import { persistAlert } from '../utils';
export default {
components: {
@@ -31,6 +33,15 @@ export default {
addSubscription(this.subscriptionsPath, this.group.full_path)
.then(() => {
+ persistAlert({
+ title: s__('Integrations|Namespace successfully linked'),
+ message: s__(
+ 'Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}',
+ ),
+ linkUrl: helpPagePath('integration/jira_development_panel.html', { anchor: 'usage' }),
+ variant: 'success',
+ });
+
AP.navigator.reload();
})
.catch((error) => {
diff --git a/app/assets/javascripts/jira_connect/constants.js b/app/assets/javascripts/jira_connect/constants.js
index 2b3be5cd5cd..63b79581a1b 100644
--- a/app/assets/javascripts/jira_connect/constants.js
+++ b/app/assets/javascripts/jira_connect/constants.js
@@ -1 +1,2 @@
export const defaultPerPage = 10;
+export const ALERT_LOCALSTORAGE_KEY = 'gitlab_alert';
diff --git a/app/assets/javascripts/jira_connect/index.js b/app/assets/javascripts/jira_connect/index.js
index 7191fce3c33..ecdb41607a4 100644
--- a/app/assets/javascripts/jira_connect/index.js
+++ b/app/assets/javascripts/jira_connect/index.js
@@ -6,7 +6,7 @@ import Translate from '~/vue_shared/translate';
import JiraConnectApp from './components/app.vue';
import createStore from './store';
-import { SET_ERROR_MESSAGE } from './store/mutation_types';
+import { SET_ALERT } from './store/mutation_types';
const store = createStore();
@@ -17,7 +17,7 @@ const reqComplete = () => {
const reqFailed = (res, fallbackErrorMessage) => {
const { error = fallbackErrorMessage } = res || {};
- store.commit(SET_ERROR_MESSAGE, error);
+ store.commit(SET_ALERT, { message: error, variant: 'danger' });
};
const updateSignInLinks = async () => {
@@ -77,6 +77,7 @@ export async function initJiraConnect() {
Vue.use(GlFeatureFlagsPlugin);
const { groupsPath, subscriptionsPath, usersPath } = el.dataset;
+ AP.sizeToParent();
return new Vue({
el,
diff --git a/app/assets/javascripts/jira_connect/store/mutation_types.js b/app/assets/javascripts/jira_connect/store/mutation_types.js
index 7f6ff1256bb..15f36b824d9 100644
--- a/app/assets/javascripts/jira_connect/store/mutation_types.js
+++ b/app/assets/javascripts/jira_connect/store/mutation_types.js
@@ -1 +1 @@
-export const SET_ERROR_MESSAGE = 'SET_ERROR_MESSAGE';
+export const SET_ALERT = 'SET_ALERT';
diff --git a/app/assets/javascripts/jira_connect/store/mutations.js b/app/assets/javascripts/jira_connect/store/mutations.js
index c3acd07f89f..2a25e0fe25f 100644
--- a/app/assets/javascripts/jira_connect/store/mutations.js
+++ b/app/assets/javascripts/jira_connect/store/mutations.js
@@ -1,7 +1,7 @@
-import { SET_ERROR_MESSAGE } from './mutation_types';
+import { SET_ALERT } from './mutation_types';
export default {
- [SET_ERROR_MESSAGE](state, errorMessage) {
- state.errorMessage = errorMessage;
+ [SET_ALERT](state, { title, message, variant, linkUrl } = {}) {
+ state.alert = { title, message, variant, linkUrl };
},
};
diff --git a/app/assets/javascripts/jira_connect/store/state.js b/app/assets/javascripts/jira_connect/store/state.js
index 079b8350770..c807df03f00 100644
--- a/app/assets/javascripts/jira_connect/store/state.js
+++ b/app/assets/javascripts/jira_connect/store/state.js
@@ -1,3 +1,3 @@
export default () => ({
- errorMessage: undefined,
+ alert: undefined,
});
diff --git a/app/assets/javascripts/jira_connect/utils.js b/app/assets/javascripts/jira_connect/utils.js
new file mode 100644
index 00000000000..2a6c53ba42c
--- /dev/null
+++ b/app/assets/javascripts/jira_connect/utils.js
@@ -0,0 +1,33 @@
+import AccessorUtilities from '~/lib/utils/accessor';
+import { ALERT_LOCALSTORAGE_KEY } from './constants';
+
+/**
+ * Persist alert data to localStorage.
+ */
+export const persistAlert = ({ title, message, linkUrl, variant } = {}) => {
+ if (!AccessorUtilities.isLocalStorageAccessSafe()) {
+ return;
+ }
+
+ const payload = JSON.stringify({ title, message, linkUrl, variant });
+ localStorage.setItem(ALERT_LOCALSTORAGE_KEY, payload);
+};
+
+/**
+ * Return alert data from localStorage.
+ */
+export const retrieveAlert = () => {
+ if (!AccessorUtilities.isLocalStorageAccessSafe()) {
+ return null;
+ }
+
+ const initialAlertJSON = localStorage.getItem(ALERT_LOCALSTORAGE_KEY);
+ // immediately clean up
+ localStorage.removeItem(ALERT_LOCALSTORAGE_KEY);
+
+ if (!initialAlertJSON) {
+ return null;
+ }
+
+ return JSON.parse(initialAlertJSON);
+};
diff --git a/app/assets/javascripts/jobs/components/artifacts_block.vue b/app/assets/javascripts/jobs/components/artifacts_block.vue
index 0f34926f689..2018942a7e8 100644
--- a/app/assets/javascripts/jobs/components/artifacts_block.vue
+++ b/app/assets/javascripts/jobs/components/artifacts_block.vue
@@ -37,7 +37,7 @@ export default {
};
</script>
<template>
- <div class="block">
+ <div>
<div class="title gl-font-weight-bold">{{ s__('Job|Job artifacts') }}</div>
<p
v-if="isExpired || willExpire"
diff --git a/app/assets/javascripts/jobs/components/commit_block.vue b/app/assets/javascripts/jobs/components/commit_block.vue
index 222fae6d9a8..eae6b5d5419 100644
--- a/app/assets/javascripts/jobs/components/commit_block.vue
+++ b/app/assets/javascripts/jobs/components/commit_block.vue
@@ -18,20 +18,11 @@ export default {
required: false,
default: null,
},
- isLastBlock: {
- type: Boolean,
- required: true,
- },
},
};
</script>
<template>
- <div
- :class="{
- 'block-last': isLastBlock,
- block: !isLastBlock,
- }"
- >
+ <div>
<span class="font-weight-bold">{{ __('Commit') }}</span>
<gl-link :href="commit.commit_path" class="js-commit-sha commit-sha link-commit">
diff --git a/app/assets/javascripts/jobs/components/job_container_item.vue b/app/assets/javascripts/jobs/components/job_container_item.vue
index e68368919ab..488d838db52 100644
--- a/app/assets/javascripts/jobs/components/job_container_item.vue
+++ b/app/assets/javascripts/jobs/components/job_container_item.vue
@@ -63,7 +63,7 @@ export default {
<span class="text-truncate w-100">{{ job.name ? job.name : job.id }}</span>
- <gl-icon v-if="job.retried" name="retry" class="js-retry-icon" />
+ <gl-icon v-if="job.retried" name="retry" />
</gl-link>
</div>
</template>
diff --git a/app/assets/javascripts/jobs/components/job_log_controllers.vue b/app/assets/javascripts/jobs/components/job_log_controllers.vue
index fbdbfddff56..ce4a85b35b7 100644
--- a/app/assets/javascripts/jobs/components/job_log_controllers.vue
+++ b/app/assets/javascripts/jobs/components/job_log_controllers.vue
@@ -1,9 +1,7 @@
<script>
-/* eslint-disable vue/no-v-html */
import { GlTooltipDirective, GlLink, GlButton } from '@gitlab/ui';
import { numberToHumanSize } from '~/lib/utils/number_utils';
import { __, sprintf } from '~/locale';
-import scrollDown from '../svg/scroll_down.svg';
export default {
components: {
@@ -13,7 +11,6 @@ export default {
directives: {
GlTooltip: GlTooltipDirective,
},
- scrollDown,
props: {
erasePath: {
type: String,
@@ -87,7 +84,6 @@ export default {
v-gl-tooltip.body
:title="s__('Job|Show complete raw')"
:href="rawPath"
- class="controllers-buttons"
data-testid="job-raw-link-controller"
icon="doc-text"
/>
@@ -98,7 +94,7 @@ export default {
:title="s__('Job|Erase job log')"
:href="erasePath"
:data-confirm="__('Are you sure you want to erase this build?')"
- class="controllers-buttons"
+ class="gl-ml-3"
data-testid="job-log-erase-link"
data-method="post"
icon="remove"
@@ -106,25 +102,24 @@ export default {
<!-- eo links -->
<!-- scroll buttons -->
- <div v-gl-tooltip :title="s__('Job|Scroll to top')" class="controllers-buttons">
+ <div v-gl-tooltip :title="s__('Job|Scroll to top')" class="gl-ml-3">
<gl-button
:disabled="isScrollTopDisabled"
- class="btn-scroll btn-transparent btn-blank"
+ class="btn-scroll"
data-testid="job-controller-scroll-top"
icon="scroll_up"
@click="handleScrollToTop"
/>
</div>
- <div v-gl-tooltip :title="s__('Job|Scroll to bottom')" class="controllers-buttons">
+ <div v-gl-tooltip :title="s__('Job|Scroll to bottom')" class="gl-ml-3">
<gl-button
:disabled="isScrollBottomDisabled"
- class="js-scroll-bottom btn-scroll btn-transparent btn-blank"
+ class="js-scroll-bottom btn-scroll"
data-testid="job-controller-scroll-bottom"
icon="scroll_down"
:class="{ animate: isScrollingDown }"
@click="handleScrollToBottom"
- v-html="$options.scrollDown"
/>
</div>
<!-- eo scroll buttons -->
diff --git a/app/assets/javascripts/jobs/components/job_sidebar_retry_button.vue b/app/assets/javascripts/jobs/components/job_sidebar_retry_button.vue
index 258b8cadd63..a43b3297d75 100644
--- a/app/assets/javascripts/jobs/components/job_sidebar_retry_button.vue
+++ b/app/assets/javascripts/jobs/components/job_sidebar_retry_button.vue
@@ -36,10 +36,10 @@ export default {
v-gl-modal="modalId"
:aria-label="$options.i18n.retryLabel"
category="primary"
- variant="info"
+ variant="confirm"
>{{ $options.i18n.retryLabel }}</gl-button
>
- <gl-link v-else :href="href" data-method="post" rel="nofollow"
+ <gl-link v-else :href="href" class="btn gl-button btn-confirm" data-method="post" rel="nofollow"
>{{ $options.i18n.retryLabel }}
</gl-link>
</template>
diff --git a/app/assets/javascripts/jobs/components/sidebar.vue b/app/assets/javascripts/jobs/components/sidebar.vue
index f63fe72a71a..fcf03dff34e 100644
--- a/app/assets/javascripts/jobs/components/sidebar.vue
+++ b/app/assets/javascripts/jobs/components/sidebar.vue
@@ -1,5 +1,5 @@
<script>
-import { GlButton, GlIcon, GlLink } from '@gitlab/ui';
+import { GlButton, GlIcon } from '@gitlab/ui';
import { isEmpty } from 'lodash';
import { mapActions, mapGetters, mapState } from 'vuex';
import TooltipOnTruncate from '~/vue_shared/components/tooltip_on_truncate.vue';
@@ -20,12 +20,12 @@ export default {
i18n: {
...JOB_SIDEBAR,
},
+ borderTopClass: ['gl-border-t-solid', 'gl-border-t-1', 'gl-border-t-gray-100'],
forwardDeploymentFailureModalId,
components: {
ArtifactsBlock,
CommitBlock,
GlButton,
- GlLink,
GlIcon,
JobsContainer,
JobSidebarRetryButton,
@@ -45,11 +45,8 @@ export default {
computed: {
...mapGetters(['hasForwardDeploymentFailure']),
...mapState(['job', 'stages', 'jobs', 'selectedStage']),
- retryButtonClass() {
- let className = 'btn gl-button gl-text-decoration-none!';
- className +=
- this.job.status && this.job.recoverable ? ' btn-confirm' : ' btn-confirm-secondary';
- return className;
+ retryButtonCategory() {
+ return this.job.status && this.job.recoverable ? 'primary' : 'secondary';
},
hasArtifact() {
return !isEmpty(this.job.artifact);
@@ -76,71 +73,94 @@ export default {
<aside class="right-sidebar build-sidebar" data-offset-top="101" data-spy="affix">
<div class="sidebar-container">
<div class="blocks-container">
- <div class="block d-flex flex-nowrap align-items-center">
+ <div class="gl-py-5 gl-display-flex gl-align-items-center">
<tooltip-on-truncate :title="job.name" truncate-target="child"
><h4 class="my-0 mr-2 gl-text-truncate">
{{ job.name }}
</h4>
</tooltip-on-truncate>
- <div class="flex-grow-1 flex-shrink-0 text-right">
+ <div class="gl-flex-grow-1 gl-flex-shrink-0 gl-text-right">
<job-sidebar-retry-button
v-if="job.retry_path"
- :class="retryButtonClass"
+ :category="retryButtonCategory"
:href="job.retry_path"
:modal-id="$options.forwardDeploymentFailureModalId"
+ variant="confirm"
data-qa-selector="retry_button"
data-testid="retry-button"
/>
- <gl-link
+ <gl-button
v-if="job.cancel_path"
:href="job.cancel_path"
- class="btn gl-button btn-default gl-text-decoration-none!"
data-method="post"
data-testid="cancel-button"
rel="nofollow"
>{{ $options.i18n.cancel }}
- </gl-link>
+ </gl-button>
</div>
<gl-button
:aria-label="$options.i18n.toggleSidebar"
category="tertiary"
- class="gl-md-display-none gl-ml-2 js-sidebar-build-toggle"
+ class="gl-md-display-none gl-ml-2"
icon="chevron-double-lg-right"
@click="toggleSidebar"
/>
</div>
- <div v-if="job.terminal_path || job.new_issue_path" class="block retry-link">
- <gl-link
+ <div
+ v-if="job.terminal_path || job.new_issue_path"
+ class="gl-py-5"
+ :class="$options.borderTopClass"
+ >
+ <gl-button
v-if="job.new_issue_path"
:href="job.new_issue_path"
- class="btn gl-button btn-success-secondary float-left mr-2 gl-text-decoration-none!"
+ category="secondary"
+ variant="confirm"
data-testid="job-new-issue"
- >{{ $options.i18n.newIssue }}
- </gl-link>
- <gl-link
+ >
+ {{ $options.i18n.newIssue }}
+ </gl-button>
+ <gl-button
v-if="job.terminal_path"
:href="job.terminal_path"
- class="btn btn-primary btn-inverted visible-md-block visible-lg-block float-left"
target="_blank"
data-testid="terminal-link"
>
{{ $options.i18n.debug }}
- <gl-icon :size="14" name="external-link" />
- </gl-link>
+ <gl-icon name="external-link" />
+ </gl-button>
</div>
- <job-sidebar-details-container />
- <artifacts-block v-if="hasArtifact" :artifact="job.artifact" :help-url="artifactHelpUrl" />
- <trigger-block v-if="hasTriggers" :trigger="job.trigger" />
+
+ <job-sidebar-details-container class="gl-py-5" :class="$options.borderTopClass" />
+
+ <artifacts-block
+ v-if="hasArtifact"
+ class="gl-py-5"
+ :class="$options.borderTopClass"
+ :artifact="job.artifact"
+ :help-url="artifactHelpUrl"
+ />
+
+ <trigger-block
+ v-if="hasTriggers"
+ class="gl-py-5"
+ :class="$options.borderTopClass"
+ :trigger="job.trigger"
+ />
+
<commit-block
:commit="commit"
- :is-last-block="hasStages"
+ class="gl-py-5"
+ :class="$options.borderTopClass"
:merge-request="job.merge_request"
/>
<stages-dropdown
v-if="job.pipeline"
+ class="gl-py-5"
+ :class="$options.borderTopClass"
:pipeline="job.pipeline"
:selected-stage="selectedStage"
:stages="stages"
diff --git a/app/assets/javascripts/jobs/components/sidebar_job_details_container.vue b/app/assets/javascripts/jobs/components/sidebar_job_details_container.vue
index 62cd30fb320..b20d58b6ffe 100644
--- a/app/assets/javascripts/jobs/components/sidebar_job_details_container.vue
+++ b/app/assets/javascripts/jobs/components/sidebar_job_details_container.vue
@@ -73,7 +73,7 @@ export default {
</script>
<template>
- <div v-if="shouldRenderBlock" class="block">
+ <div v-if="shouldRenderBlock">
<detail-row v-if="job.duration" :value="duration" title="Duration" />
<detail-row
v-if="job.finished_at"
diff --git a/app/assets/javascripts/jobs/components/stages_dropdown.vue b/app/assets/javascripts/jobs/components/stages_dropdown.vue
index 64c4031b002..18de849af88 100644
--- a/app/assets/javascripts/jobs/components/stages_dropdown.vue
+++ b/app/assets/javascripts/jobs/components/stages_dropdown.vue
@@ -43,7 +43,7 @@ export default {
};
</script>
<template>
- <div class="block-last dropdown">
+ <div class="dropdown">
<div class="js-pipeline-info">
<ci-icon :status="pipeline.details.status" class="vertical-align-middle" />
diff --git a/app/assets/javascripts/jobs/components/trigger_block.vue b/app/assets/javascripts/jobs/components/trigger_block.vue
index f6b98777011..fef5b37015c 100644
--- a/app/assets/javascripts/jobs/components/trigger_block.vue
+++ b/app/assets/javascripts/jobs/components/trigger_block.vue
@@ -61,7 +61,7 @@ export default {
</script>
<template>
- <div class="block">
+ <div>
<p
v-if="trigger.short_token"
:class="{ 'gl-mb-2': hasVariables, 'gl-mb-0': !hasVariables }"
diff --git a/app/assets/javascripts/jobs/store/getters.js b/app/assets/javascripts/jobs/store/getters.js
index 930a225857d..6cb96bee07d 100644
--- a/app/assets/javascripts/jobs/store/getters.js
+++ b/app/assets/javascripts/jobs/store/getters.js
@@ -1,7 +1,7 @@
import { isEmpty, isString } from 'lodash';
import { isScrolledToBottom } from '~/lib/utils/scroll_utils';
-export const headerTime = (state) => state.job.started ?? state.job.created_at;
+export const headerTime = (state) => (state.job.started ? state.job.started : state.job.created_at);
export const hasForwardDeploymentFailure = (state) =>
state?.job?.failure_reason === 'forward_deployment_failure';
diff --git a/app/assets/javascripts/jobs/svg/scroll_down.svg b/app/assets/javascripts/jobs/svg/scroll_down.svg
deleted file mode 100644
index fb934f68704..00000000000
--- a/app/assets/javascripts/jobs/svg/scroll_down.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
-<path class="scroll-arrow" d="M8 10.4142L4.29289 6.70711C3.90237 6.31658 3.90237 5.68342 4.29289 5.2929C4.68342 4.90237 5.31658 4.90237 5.70711 5.2929L7 6.58579L7 1C7 0.447715 7.44772 0 8 0C8.55229 0 9 0.447715 9 1L9 6.58579L10.2929 5.2929C10.6834 4.90237 11.3166 4.90237 11.7071 5.2929C12.0976 5.68342 12.0976 6.31658 11.7071 6.70711L8 10.4142Z"/>
-<path class="scroll-dot" d="M8 16C9.10457 16 10 15.1046 10 14C10 12.8954 9.10457 12 8 12C6.89543 12 6 12.8954 6 14C6 15.1046 6.89543 16 8 16Z"/>
-</svg>
diff --git a/app/assets/javascripts/lib/chrome_84_icon_fix.js b/app/assets/javascripts/lib/chrome_84_icon_fix.js
deleted file mode 100644
index 20fe9590ce3..00000000000
--- a/app/assets/javascripts/lib/chrome_84_icon_fix.js
+++ /dev/null
@@ -1,78 +0,0 @@
-import { debounce } from 'lodash';
-
-/*
- Chrome and Edge 84 have a bug relating to icon sprite svgs
- https://bugs.chromium.org/p/chromium/issues/detail?id=1107442
-
- If the SVG is loaded, under certain circumstances the icons are not
- shown. We load our sprite icons with JS and add them to the body.
- Then we iterate over all the `use` elements and replace their reference
- to that svg which we added internally. In order to avoid id conflicts,
- those are renamed with a unique prefix.
-
- We do that once the DOMContentLoaded fired and otherwise we use a
- mutation observer to re-trigger this logic.
-
- In order to not have a big impact on performance or to cause flickering
- of of content,
-
- 1. we only do it for each svg once
- 2. we debounce the event handler and just do it in a requestIdleCallback
-
- Before we tried to do it with the library svg4everybody and it had a big
- performance impact. See:
- https://gitlab.com/gitlab-org/quality/performance/-/issues/312
- */
-document.addEventListener('DOMContentLoaded', async () => {
- const GITLAB_SVG_PREFIX = 'chrome-issue-230433-gitlab-svgs';
- const FILE_ICON_PREFIX = 'chrome-issue-230433-file-icons';
- const SKIP_ATTRIBUTE = 'data-replaced-by-chrome-issue-230433';
-
- const fixSVGs = () => {
- requestIdleCallback(() => {
- document.querySelectorAll(`use:not([${SKIP_ATTRIBUTE}])`).forEach((use) => {
- const href = use?.getAttribute('href') ?? use?.getAttribute('xlink:href') ?? '';
-
- if (href.includes(window.gon.sprite_icons)) {
- use.removeAttribute('xlink:href');
- use.setAttribute('href', `#${GITLAB_SVG_PREFIX}-${href.split('#')[1]}`);
- } else if (href.includes(window.gon.sprite_file_icons)) {
- use.removeAttribute('xlink:href');
- use.setAttribute('href', `#${FILE_ICON_PREFIX}-${href.split('#')[1]}`);
- }
-
- use.setAttribute(SKIP_ATTRIBUTE, 'true');
- });
- });
- };
-
- const watchForNewSVGs = () => {
- const observer = new MutationObserver(debounce(fixSVGs, 200));
- observer.observe(document.querySelector('body'), {
- childList: true,
- attributes: false,
- subtree: true,
- });
- };
-
- const retrieveIconSprites = async (url, prefix) => {
- const div = document.createElement('div');
- div.classList.add('hidden');
- const result = await fetch(url);
- div.innerHTML = await result.text();
- div.querySelectorAll('[id]').forEach((node) => {
- node.setAttribute('id', `${prefix}-${node.getAttribute('id')}`);
- });
- document.body.append(div);
- };
-
- if (window.gon && window.gon.sprite_icons) {
- await retrieveIconSprites(window.gon.sprite_icons, GITLAB_SVG_PREFIX);
- if (window.gon.sprite_file_icons) {
- await retrieveIconSprites(window.gon.sprite_file_icons, FILE_ICON_PREFIX);
- }
-
- fixSVGs();
- watchForNewSVGs();
- }
-});
diff --git a/app/assets/javascripts/lib/graphql.js b/app/assets/javascripts/lib/graphql.js
index bda5550a9f4..e090f9f6e8c 100644
--- a/app/assets/javascripts/lib/graphql.js
+++ b/app/assets/javascripts/lib/graphql.js
@@ -2,6 +2,7 @@ import { InMemoryCache } from 'apollo-cache-inmemory';
import { ApolloClient } from 'apollo-client';
import { ApolloLink } from 'apollo-link';
import { BatchHttpLink } from 'apollo-link-batch-http';
+import { createHttpLink } from 'apollo-link-http';
import { createUploadLink } from 'apollo-upload-client';
import { StartupJSLink } from '~/lib/utils/apollo_startup_js_link';
import csrf from '~/lib/utils/csrf';
@@ -48,7 +49,7 @@ export default (resolvers = {}, config = {}) => {
const uploadsLink = ApolloLink.split(
(operation) => operation.getContext().hasUpload || operation.getContext().isSingleRequest,
createUploadLink(httpOptions),
- new BatchHttpLink(httpOptions),
+ config.useGet ? createHttpLink(httpOptions) : new BatchHttpLink(httpOptions),
);
const performanceBarLink = new ApolloLink((operation, forward) => {
diff --git a/app/assets/javascripts/lib/utils/experimentation.js b/app/assets/javascripts/lib/utils/experimentation.js
deleted file mode 100644
index 555e76055e0..00000000000
--- a/app/assets/javascripts/lib/utils/experimentation.js
+++ /dev/null
@@ -1,3 +0,0 @@
-export function isExperimentEnabled(experimentKey) {
- return Boolean(window.gon?.experiments?.[experimentKey]);
-}
diff --git a/app/assets/javascripts/lib/utils/http_status.js b/app/assets/javascripts/lib/utils/http_status.js
index 06529f06a66..6b9be34235b 100644
--- a/app/assets/javascripts/lib/utils/http_status.js
+++ b/app/assets/javascripts/lib/utils/http_status.js
@@ -19,6 +19,7 @@ const httpStatusCodes = {
UNAUTHORIZED: 401,
FORBIDDEN: 403,
NOT_FOUND: 404,
+ METHOD_NOT_ALLOWED: 405,
CONFLICT: 409,
GONE: 410,
UNPROCESSABLE_ENTITY: 422,
diff --git a/app/assets/javascripts/lib/utils/number_utils.js b/app/assets/javascripts/lib/utils/number_utils.js
index 0f29f538b07..63feb6f9b1d 100644
--- a/app/assets/javascripts/lib/utils/number_utils.js
+++ b/app/assets/javascripts/lib/utils/number_utils.js
@@ -150,3 +150,24 @@ export const formattedChangeInPercent = (firstY, lastY, { nonFiniteResult = '-'
return `${change >= 0 ? '+' : ''}${change}%`;
};
+
+/**
+ * Checks whether a value is numerical in nature by converting it using parseInt
+ *
+ * Example outcomes:
+ * - isNumeric(100) = true
+ * - isNumeric('100') = true
+ * - isNumeric(1.0) = true
+ * - isNumeric('1.0') = true
+ * - isNumeric('abc100') = false
+ * - isNumeric('abc') = false
+ * - isNumeric(true) = false
+ * - isNumeric(undefined) = false
+ * - isNumeric(null) = false
+ *
+ * @param value
+ * @returns {boolean}
+ */
+export const isNumeric = (value) => {
+ return !Number.isNaN(parseInt(value, 10));
+};
diff --git a/app/assets/javascripts/lib/utils/select2_utils.js b/app/assets/javascripts/lib/utils/select2_utils.js
new file mode 100644
index 00000000000..03c0e608b79
--- /dev/null
+++ b/app/assets/javascripts/lib/utils/select2_utils.js
@@ -0,0 +1,25 @@
+import axios from './axios_utils';
+import { normalizeHeaders, parseIntPagination } from './common_utils';
+
+// This is used in the select2 config to replace jQuery.ajax with axios
+export const select2AxiosTransport = (params) => {
+ axios({
+ method: params.type?.toLowerCase() || 'get',
+ url: params.url,
+ params: params.data,
+ })
+ .then((res) => {
+ const results = res.data || [];
+ const headers = normalizeHeaders(res.headers);
+ const pagination = parseIntPagination(headers);
+ const more = pagination.nextPage > pagination.page;
+
+ params.success({
+ results,
+ pagination: {
+ more,
+ },
+ });
+ })
+ .catch(params.error);
+};
diff --git a/app/assets/javascripts/lib/utils/text_markdown.js b/app/assets/javascripts/lib/utils/text_markdown.js
index 5e66aa05218..345dfaf895b 100644
--- a/app/assets/javascripts/lib/utils/text_markdown.js
+++ b/app/assets/javascripts/lib/utils/text_markdown.js
@@ -283,9 +283,9 @@ function updateText({ textArea, tag, cursorOffset, blockTag, wrap, select, tagCo
/* eslint-disable @gitlab/require-i18n-strings */
export function keypressNoteText(e) {
- if (this.selectionStart === this.selectionEnd) {
- return;
- }
+ if (!gon.markdown_surround_selection) return;
+ if (this.selectionStart === this.selectionEnd) return;
+
const keys = {
'*': '**{text}**', // wraps with bold character
_: '_{text}_', // wraps with italic character
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 15f9512fe92..418cc69bf5a 100644
--- a/app/assets/javascripts/lib/utils/unit_format/formatter_factory.js
+++ b/app/assets/javascripts/lib/utils/unit_format/formatter_factory.js
@@ -1,39 +1,30 @@
+import { formatNumber } from '~/locale';
+
/**
- * Formats a number as string using `toLocaleString`.
+ * Formats a number as a string using `toLocaleString`.
*
* @param {Number} number to be converted
- * @param {params} Parameters
- * @param {params.fractionDigits} Number of decimal digits
- * to display, defaults to using `toLocaleString` defaults.
- * @param {params.maxLength} Max output char lenght at the
+ *
+ * @param {options.maxCharLength} Max output char length at the
* expense of precision, if the output is longer than this,
* the formatter switches to using exponential notation.
- * @param {params.factor} Value is multiplied by this factor,
- * useful for value normalization.
- * @returns Formatted value
+ *
+ * @param {options.valueFactor} Value is multiplied by this factor,
+ * useful for value normalization or to alter orders of magnitude.
+ *
+ * @param {options} Other options to be passed to
+ * `formatNumber` such as `valueFactor`, `unit` and `style`.
+ *
*/
-function formatNumber(
- value,
- { fractionDigits = undefined, valueFactor = 1, style = undefined, maxLength = undefined },
-) {
- if (value === null) {
- return '';
- }
-
- const locale = document.documentElement.lang || undefined;
- const num = value * valueFactor;
- const formatted = num.toLocaleString(locale, {
- minimumFractionDigits: fractionDigits,
- maximumFractionDigits: fractionDigits,
- style,
- });
+const formatNumberNormalized = (value, { maxCharLength, valueFactor = 1, ...options }) => {
+ const formatted = formatNumber(value * valueFactor, options);
- if (maxLength !== undefined && formatted.length > maxLength) {
+ if (maxCharLength !== undefined && formatted.length > maxCharLength) {
// 123456 becomes 1.23e+8
- return num.toExponential(2);
+ return value.toExponential(2);
}
return formatted;
-}
+};
/**
* Formats a number as a string scaling it up according to units.
@@ -76,7 +67,10 @@ const scaledFormatter = (units, unitFactor = 1000) => {
const unit = units[scale];
- return `${formatNumber(num, { fractionDigits })}${unit}`;
+ return `${formatNumberNormalized(num, {
+ maximumFractionDigits: fractionDigits,
+ minimumFractionDigits: fractionDigits,
+ })}${unit}`;
};
};
@@ -84,8 +78,14 @@ 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, maxLength) => {
- return `${formatNumber(value, { fractionDigits, maxLength, valueFactor, style })}`;
+ return (value, fractionDigits, maxCharLength) => {
+ return `${formatNumberNormalized(value, {
+ maxCharLength,
+ valueFactor,
+ style,
+ maximumFractionDigits: fractionDigits,
+ minimumFractionDigits: fractionDigits,
+ })}`;
};
};
@@ -93,9 +93,15 @@ 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, maxLength) => {
- const length = maxLength !== undefined ? maxLength - unit.length : undefined;
- return `${formatNumber(value, { fractionDigits, maxLength: length, valueFactor })}${unit}`;
+ return (value, fractionDigits, maxCharLength) => {
+ const length = maxCharLength !== undefined ? maxCharLength - unit.length : undefined;
+
+ return `${formatNumberNormalized(value, {
+ maxCharLength: length,
+ valueFactor,
+ maximumFractionDigits: fractionDigits,
+ minimumFractionDigits: fractionDigits,
+ })}${unit}`;
};
};
diff --git a/app/assets/javascripts/lib/utils/unit_format/index.js b/app/assets/javascripts/lib/utils/unit_format/index.js
index 9f979f7ea4b..bc82c6aa74d 100644
--- a/app/assets/javascripts/lib/utils/unit_format/index.js
+++ b/app/assets/javascripts/lib/utils/unit_format/index.js
@@ -46,227 +46,261 @@ export const SUPPORTED_FORMATS = {
};
/**
- * Returns a function that formats number to different units
- * @param {String} format - Format to use, must be one of the SUPPORTED_FORMATS. Defaults to engineering notation.
+ * Returns a function that formats number to different units.
*
+ * Used for dynamic formatting, for more convenience, use the functions below.
*
+ * @param {String} format - Format to use, must be one of the SUPPORTED_FORMATS. Defaults to engineering notation.
*/
export const getFormatter = (format = SUPPORTED_FORMATS.engineering) => {
// Number
-
if (format === SUPPORTED_FORMATS.number) {
- /**
- * Formats a number
- *
- * @function
- * @param {Number} value - Number to format
- * @param {Number} fractionDigits - precision decimals
- * @param {Number} maxLength - Max length of formatted number
- * if length is exceeded, exponential format is used.
- */
return numberFormatter();
}
if (format === SUPPORTED_FORMATS.percent) {
- /**
- * Formats a percentge (0 - 1)
- *
- * @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
- * if length is exceeded, exponential format is used.
- */
return numberFormatter('percent');
}
if (format === SUPPORTED_FORMATS.percentHundred) {
- /**
- * Formats a percentge (0 to 100)
- *
- * @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
- * if length is exceeded, exponential format is used.
- */
return numberFormatter('percent', 1 / 100);
}
// Durations
-
if (format === SUPPORTED_FORMATS.seconds) {
- /**
- * Formats a number of seconds
- *
- * @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
- * if length is exceeded, exponential format is used.
- */
return suffixFormatter(s__('Units|s'));
}
if (format === SUPPORTED_FORMATS.milliseconds) {
- /**
- * Formats a number of milliseconds with ms as units
- *
- * @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
- * if length is exceeded, exponential format is used.
- */
return suffixFormatter(s__('Units|ms'));
}
// Digital (Metric)
-
if (format === SUPPORTED_FORMATS.decimalBytes) {
- /**
- * Formats a number of bytes scaled up to larger digital
- * units for larger numbers.
- *
- * @function
- * @param {Number} value - Number to format, `1` is formatted as `1B`
- * @param {Number} fractionDigits - number of precision decimals
- */
return scaledSIFormatter('B');
}
if (format === SUPPORTED_FORMATS.kilobytes) {
- /**
- * Formats a number of kilobytes scaled up to larger digital
- * units for larger numbers.
- *
- * @function
- * @param {Number} value - Number to format, `1` is formatted as `1kB`
- * @param {Number} fractionDigits - number of precision decimals
- */
return scaledSIFormatter('B', 1);
}
if (format === SUPPORTED_FORMATS.megabytes) {
- /**
- * Formats a number of megabytes scaled up to larger digital
- * units for larger numbers.
- *
- * @function
- * @param {Number} value - Number to format, `1` is formatted as `1MB`
- * @param {Number} fractionDigits - number of precision decimals
- */
return scaledSIFormatter('B', 2);
}
if (format === SUPPORTED_FORMATS.gigabytes) {
- /**
- * Formats a number of gigabytes scaled up to larger digital
- * units for larger numbers.
- *
- * @function
- * @param {Number} value - Number to format, `1` is formatted as `1GB`
- * @param {Number} fractionDigits - number of precision decimals
- */
return scaledSIFormatter('B', 3);
}
if (format === SUPPORTED_FORMATS.terabytes) {
- /**
- * Formats a number of terabytes scaled up to larger digital
- * units for larger numbers.
- *
- * @function
- * @param {Number} value - Number to format, `1` is formatted as `1GB`
- * @param {Number} fractionDigits - number of precision decimals
- */
return scaledSIFormatter('B', 4);
}
if (format === SUPPORTED_FORMATS.petabytes) {
- /**
- * Formats a number of petabytes scaled up to larger digital
- * units for larger numbers.
- *
- * @function
- * @param {Number} value - Number to format, `1` is formatted as `1PB`
- * @param {Number} fractionDigits - number of precision decimals
- */
return scaledSIFormatter('B', 5);
}
// Digital (IEC)
-
if (format === SUPPORTED_FORMATS.bytes) {
- /**
- * Formats a number of bytes scaled up to larger digital
- * units for larger numbers.
- *
- * @function
- * @param {Number} value - Number to format, `1` is formatted as `1B`
- * @param {Number} fractionDigits - number of precision decimals
- */
return scaledBinaryFormatter('B');
}
if (format === SUPPORTED_FORMATS.kibibytes) {
- /**
- * Formats a number of kilobytes scaled up to larger digital
- * units for larger numbers.
- *
- * @function
- * @param {Number} value - Number to format, `1` is formatted as `1kB`
- * @param {Number} fractionDigits - number of precision decimals
- */
return scaledBinaryFormatter('B', 1);
}
if (format === SUPPORTED_FORMATS.mebibytes) {
- /**
- * Formats a number of megabytes scaled up to larger digital
- * units for larger numbers.
- *
- * @function
- * @param {Number} value - Number to format, `1` is formatted as `1MB`
- * @param {Number} fractionDigits - number of precision decimals
- */
return scaledBinaryFormatter('B', 2);
}
if (format === SUPPORTED_FORMATS.gibibytes) {
- /**
- * Formats a number of gigabytes scaled up to larger digital
- * units for larger numbers.
- *
- * @function
- * @param {Number} value - Number to format, `1` is formatted as `1GB`
- * @param {Number} fractionDigits - number of precision decimals
- */
return scaledBinaryFormatter('B', 3);
}
if (format === SUPPORTED_FORMATS.tebibytes) {
- /**
- * Formats a number of terabytes scaled up to larger digital
- * units for larger numbers.
- *
- * @function
- * @param {Number} value - Number to format, `1` is formatted as `1GB`
- * @param {Number} fractionDigits - number of precision decimals
- */
return scaledBinaryFormatter('B', 4);
}
if (format === SUPPORTED_FORMATS.pebibytes) {
- /**
- * Formats a number of petabytes scaled up to larger digital
- * units for larger numbers.
- *
- * @function
- * @param {Number} value - Number to format, `1` is formatted as `1PB`
- * @param {Number} fractionDigits - number of precision decimals
- */
return scaledBinaryFormatter('B', 5);
}
+ // Default
if (format === SUPPORTED_FORMATS.engineering) {
- /**
- * Formats via engineering notation
- *
- * @function
- * @param {Number} value - Value to format
- * @param {Number} fractionDigits - precision decimals - Defaults to 2
- */
return engineeringNotation;
}
// Fail so client library addresses issue
throw TypeError(`${format} is not a valid number format`);
};
+
+/**
+ * Formats a number
+ *
+ * @function
+ * @param {Number} value - Number to format
+ * @param {Number} fractionDigits - precision decimals
+ * @param {Number} maxLength - Max length of formatted number
+ * if length is exceeded, exponential format is used.
+ */
+export const number = getFormatter(SUPPORTED_FORMATS.number);
+
+/**
+ * Formats a percentage (0 - 1)
+ *
+ * @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
+ * if length is exceeded, exponential format is used.
+ */
+export const percent = getFormatter(SUPPORTED_FORMATS.percent);
+
+/**
+ * Formats a percentage (0 to 100)
+ *
+ * @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
+ * if length is exceeded, exponential format is used.
+ */
+export const percentHundred = getFormatter(SUPPORTED_FORMATS.percentHundred);
+
+/**
+ * Formats a number of seconds
+ *
+ * @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
+ * if length is exceeded, exponential format is used.
+ */
+export const seconds = getFormatter(SUPPORTED_FORMATS.seconds);
+
+/**
+ * Formats a number of milliseconds with ms as units
+ *
+ * @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
+ * if length is exceeded, exponential format is used.
+ */
+export const milliseconds = getFormatter(SUPPORTED_FORMATS.milliseconds);
+
+/**
+ * Formats a number of bytes scaled up to larger digital
+ * units for larger numbers.
+ *
+ * @function
+ * @param {Number} value - Number to format, `1` is formatted as `1B`
+ * @param {Number} fractionDigits - number of precision decimals
+ */
+export const decimalBytes = getFormatter(SUPPORTED_FORMATS.decimalBytes);
+
+/**
+ * Formats a number of kilobytes scaled up to larger digital
+ * units for larger numbers.
+ *
+ * @function
+ * @param {Number} value - Number to format, `1` is formatted as `1kB`
+ * @param {Number} fractionDigits - number of precision decimals
+ */
+export const kilobytes = getFormatter(SUPPORTED_FORMATS.kilobytes);
+
+/**
+ * Formats a number of megabytes scaled up to larger digital
+ * units for larger numbers.
+ *
+ * @function
+ * @param {Number} value - Number to format, `1` is formatted as `1MB`
+ * @param {Number} fractionDigits - number of precision decimals
+ */
+export const megabytes = getFormatter(SUPPORTED_FORMATS.megabytes);
+
+/**
+ * Formats a number of gigabytes scaled up to larger digital
+ * units for larger numbers.
+ *
+ * @function
+ * @param {Number} value - Number to format, `1` is formatted as `1GB`
+ * @param {Number} fractionDigits - number of precision decimals
+ */
+export const gigabytes = getFormatter(SUPPORTED_FORMATS.gigabytes);
+
+/**
+ * Formats a number of terabytes scaled up to larger digital
+ * units for larger numbers.
+ *
+ * @function
+ * @param {Number} value - Number to format, `1` is formatted as `1GB`
+ * @param {Number} fractionDigits - number of precision decimals
+ */
+export const terabytes = getFormatter(SUPPORTED_FORMATS.terabytes);
+
+/**
+ * Formats a number of petabytes scaled up to larger digital
+ * units for larger numbers.
+ *
+ * @function
+ * @param {Number} value - Number to format, `1` is formatted as `1PB`
+ * @param {Number} fractionDigits - number of precision decimals
+ */
+export const petabytes = getFormatter(SUPPORTED_FORMATS.petabytes);
+
+/**
+ * Formats a number of bytes scaled up to larger digital
+ * units for larger numbers.
+ *
+ * @function
+ * @param {Number} value - Number to format, `1` is formatted as `1B`
+ * @param {Number} fractionDigits - number of precision decimals
+ */
+export const bytes = getFormatter(SUPPORTED_FORMATS.bytes);
+
+/**
+ * Formats a number of kilobytes scaled up to larger digital
+ * units for larger numbers.
+ *
+ * @function
+ * @param {Number} value - Number to format, `1` is formatted as `1kB`
+ * @param {Number} fractionDigits - number of precision decimals
+ */
+export const kibibytes = getFormatter(SUPPORTED_FORMATS.kibibytes);
+
+/**
+ * Formats a number of megabytes scaled up to larger digital
+ * units for larger numbers.
+ *
+ * @function
+ * @param {Number} value - Number to format, `1` is formatted as `1MB`
+ * @param {Number} fractionDigits - number of precision decimals
+ */
+export const mebibytes = getFormatter(SUPPORTED_FORMATS.mebibytes);
+
+/**
+ * Formats a number of gigabytes scaled up to larger digital
+ * units for larger numbers.
+ *
+ * @function
+ * @param {Number} value - Number to format, `1` is formatted as `1GB`
+ * @param {Number} fractionDigits - number of precision decimals
+ */
+export const gibibytes = getFormatter(SUPPORTED_FORMATS.gibibytes);
+
+/**
+ * Formats a number of terabytes scaled up to larger digital
+ * units for larger numbers.
+ *
+ * @function
+ * @param {Number} value - Number to format, `1` is formatted as `1GB`
+ * @param {Number} fractionDigits - number of precision decimals
+ */
+export const tebibytes = getFormatter(SUPPORTED_FORMATS.tebibytes);
+
+/**
+ * Formats a number of petabytes scaled up to larger digital
+ * units for larger numbers.
+ *
+ * @function
+ * @param {Number} value - Number to format, `1` is formatted as `1PB`
+ * @param {Number} fractionDigits - number of precision decimals
+ */
+export const pebibytes = getFormatter(SUPPORTED_FORMATS.pebibytes);
+
+/**
+ * Formats via engineering notation
+ *
+ * @function
+ * @param {Number} value - Value to format
+ * @param {Number} fractionDigits - precision decimals - Defaults to 2
+ */
+export const engineering = getFormatter();
diff --git a/app/assets/javascripts/lib/utils/url_utility.js b/app/assets/javascripts/lib/utils/url_utility.js
index cc2cf787a8f..5b3aa3cf9dc 100644
--- a/app/assets/javascripts/lib/utils/url_utility.js
+++ b/app/assets/javascripts/lib/utils/url_utility.js
@@ -473,6 +473,7 @@ export const setUrlParams = (
url = window.location.href,
clearParams = false,
railsArraySyntax = false,
+ decodeParams = false,
) => {
const urlObj = new URL(url);
const queryString = urlObj.search;
@@ -495,7 +496,9 @@ export const setUrlParams = (
}
});
- urlObj.search = searchParams.toString();
+ urlObj.search = decodeParams
+ ? decodeURIComponent(searchParams.toString())
+ : searchParams.toString();
return urlObj.toString();
};
diff --git a/app/assets/javascripts/locale/index.js b/app/assets/javascripts/locale/index.js
index 35087b920c7..10518fa73d9 100644
--- a/app/assets/javascripts/locale/index.js
+++ b/app/assets/javascripts/locale/index.js
@@ -58,10 +58,30 @@ const pgettext = (keyOrContext, key) => {
*/
const createDateTimeFormat = (formatOptions) => Intl.DateTimeFormat(languageCode(), formatOptions);
+/**
+ * Formats a number as a string using `toLocaleString`.
+ *
+ * @param {Number} value - number to be converted
+ * @param {options?} options - options to be passed to
+ * `toLocaleString` such as `unit` and `style`.
+ * @param {langCode?} langCode - If set, forces a different
+ * language code from the one currently in the document.
+ * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat
+ *
+ * @returns If value is a number, the formatted value as a string
+ */
+function formatNumber(value, options = {}, langCode = languageCode()) {
+ if (typeof value !== 'number' && typeof value !== 'bigint') {
+ return value;
+ }
+ return value.toLocaleString(langCode, options);
+}
+
export { languageCode };
export { gettext as __ };
export { ngettext as n__ };
export { pgettext as s__ };
export { sprintf };
export { createDateTimeFormat };
+export { formatNumber };
export default locale;
diff --git a/app/assets/javascripts/members.js b/app/assets/javascripts/members.js
deleted file mode 100644
index a8edeaf5176..00000000000
--- a/app/assets/javascripts/members.js
+++ /dev/null
@@ -1,111 +0,0 @@
-import $ from 'jquery';
-import initDeprecatedJQueryDropdown from '~/deprecated_jquery_dropdown';
-import { disableButtonIfEmptyField } from '~/lib/utils/common_utils';
-import { Rails } from '~/lib/utils/rails_ujs';
-import { __, sprintf } from '~/locale';
-
-export default class Members {
- constructor() {
- this.addListeners();
- this.initGLDropdown();
- }
-
- addListeners() {
- // eslint-disable-next-line @gitlab/no-global-event-off
- $('.js-member-update-control').off('change').on('change', this.formSubmit.bind(this));
- // eslint-disable-next-line @gitlab/no-global-event-off
- $('.js-edit-member-form').off('ajax:success').on('ajax:success', this.formSuccess.bind(this));
- disableButtonIfEmptyField('#user_ids', 'input[name=commit]', 'change');
- }
-
- dropdownClicked(options) {
- options.e.preventDefault();
-
- this.formSubmit(null, options.$el);
- }
-
- // eslint-disable-next-line class-methods-use-this
- dropdownToggleLabel(selected, $el) {
- return $el.text();
- }
-
- // eslint-disable-next-line class-methods-use-this
- dropdownIsSelectable(selected, $el) {
- return !$el.hasClass('is-active');
- }
-
- initGLDropdown() {
- $('.js-member-permissions-dropdown').each((i, btn) => {
- const $btn = $(btn);
-
- initDeprecatedJQueryDropdown($btn, {
- selectable: true,
- isSelectable: (selected, $el) => this.dropdownIsSelectable(selected, $el),
- fieldName: $btn.data('fieldName'),
- id(selected, $el) {
- return $el.data('id');
- },
- toggleLabel: (selected, $el) => this.dropdownToggleLabel(selected, $el, $btn),
- clicked: (options) => this.dropdownClicked(options),
- });
- });
- }
-
- formSubmit(e, $el = null) {
- const $this = e ? $(e.currentTarget) : $el;
- const { $toggle, $dateInput } = this.getMemberListItems($this);
- const formEl = $this.closest('form').get(0);
-
- Rails.fire(formEl, 'submit');
-
- $toggle.disable();
- $dateInput.disable();
- }
-
- formSuccess(e) {
- const { $toggle, $dateInput, $expiresIn, $expiresInText } = this.getMemberListItems(
- $(e.currentTarget).closest('.js-member'),
- );
-
- const [data] = e.detail;
- const expiresIn = data?.expires_in;
-
- if (expiresIn) {
- $expiresIn.removeClass('gl-display-none');
-
- $expiresInText.text(sprintf(__('Expires in %{expires_at}'), { expires_at: expiresIn }));
-
- const { expires_soon: expiresSoon, expires_at_formatted: expiresAtFormatted } = data;
-
- if (expiresSoon) {
- $expiresInText.addClass('text-warning');
- } else {
- $expiresInText.removeClass('text-warning');
- }
-
- // Update tooltip
- if (expiresAtFormatted) {
- $expiresInText.attr('title', expiresAtFormatted);
- $expiresInText.attr('data-original-title', expiresAtFormatted);
- }
- } else {
- $expiresIn.addClass('gl-display-none');
- }
-
- $toggle.enable();
- $dateInput.enable();
- }
-
- // eslint-disable-next-line class-methods-use-this
- getMemberListItems($el) {
- const $memberListItem = $el.is('.js-member') ? $el : $(`#${$el.data('elId')}`);
-
- return {
- $memberListItem,
- $expiresIn: $memberListItem.find('.js-expires-in'),
- $expiresInText: $memberListItem.find('.js-expires-in-text'),
- $toggle: $memberListItem.find('.dropdown-menu-toggle'),
- $dateInput: $memberListItem.find('.js-access-expiration-date'),
- };
- }
-}
diff --git a/app/assets/javascripts/members/components/avatars/user_avatar.vue b/app/assets/javascripts/members/components/avatars/user_avatar.vue
index 79dda3c1379..658fb43cecb 100644
--- a/app/assets/javascripts/members/components/avatars/user_avatar.vue
+++ b/app/assets/javascripts/members/components/avatars/user_avatar.vue
@@ -5,6 +5,7 @@ import {
GlBadge,
GlSafeHtmlDirective as SafeHtml,
} from '@gitlab/ui';
+import { mapState } from 'vuex';
import { generateBadges } from 'ee_else_ce/members/utils';
import { glEmojiTag } from '~/emoji';
import { __ } from '~/locale';
@@ -34,11 +35,16 @@ export default {
},
},
computed: {
+ ...mapState(['canManageMembers']),
user() {
return this.member.user;
},
badges() {
- return generateBadges(this.member, this.isCurrentUser).filter((badge) => badge.show);
+ return generateBadges({
+ member: this.member,
+ isCurrentUser: this.isCurrentUser,
+ canManageMembers: this.canManageMembers,
+ }).filter((badge) => badge.show);
},
statusEmoji() {
return this.user?.status?.emoji;
diff --git a/app/assets/javascripts/members/utils.js b/app/assets/javascripts/members/utils.js
index 4de2dadb490..2bf30dd7b6e 100644
--- a/app/assets/javascripts/members/utils.js
+++ b/app/assets/javascripts/members/utils.js
@@ -13,7 +13,7 @@ import {
GROUP_LINK_ACCESS_LEVEL_PROPERTY_NAME,
} from './constants';
-export const generateBadges = (member, isCurrentUser) => [
+export const generateBadges = ({ member, isCurrentUser, canManageMembers }) => [
{
show: isCurrentUser,
text: __("It's you"),
@@ -25,7 +25,7 @@ export const generateBadges = (member, isCurrentUser) => [
variant: 'danger',
},
{
- show: member.user?.twoFactorEnabled,
+ show: member.user?.twoFactorEnabled && (canManageMembers || isCurrentUser),
text: __('2FA'),
variant: 'info',
},
diff --git a/app/assets/javascripts/merge_conflicts/components/diff_file_editor.js b/app/assets/javascripts/merge_conflicts/components/diff_file_editor.js
deleted file mode 100644
index 6eaabbb3519..00000000000
--- a/app/assets/javascripts/merge_conflicts/components/diff_file_editor.js
+++ /dev/null
@@ -1,115 +0,0 @@
-// This is a true violation of @gitlab/no-runtime-template-compiler, as it relies on
-// app/views/projects/merge_requests/conflicts/components/_diff_file_editor.html.haml
-// for its template.
-/* eslint-disable no-param-reassign, @gitlab/no-runtime-template-compiler */
-
-import { debounce } from 'lodash';
-import Vue from 'vue';
-import { deprecatedCreateFlash as flash } from '~/flash';
-import axios from '~/lib/utils/axios_utils';
-import { __ } from '~/locale';
-
-((global) => {
- global.mergeConflicts = global.mergeConflicts || {};
-
- global.mergeConflicts.diffFileEditor = Vue.extend({
- props: {
- file: {
- type: Object,
- required: true,
- },
- onCancelDiscardConfirmation: {
- type: Function,
- required: true,
- },
- onAcceptDiscardConfirmation: {
- type: Function,
- required: true,
- },
- },
- data() {
- return {
- saved: false,
- fileLoaded: false,
- originalContent: '',
- };
- },
- computed: {
- classObject() {
- return {
- saved: this.saved,
- };
- },
- },
- watch: {
- 'file.showEditor': function showEditorWatcher(val) {
- this.resetEditorContent();
-
- if (!val || this.fileLoaded) {
- return;
- }
-
- this.loadEditor();
- },
- },
- mounted() {
- if (this.file.loadEditor) {
- this.loadEditor();
- }
- },
- methods: {
- loadEditor() {
- const EditorPromise = import(/* webpackChunkName: 'EditorLite' */ '~/editor/editor_lite');
- const DataPromise = axios.get(this.file.content_path);
-
- Promise.all([EditorPromise, DataPromise])
- .then(
- ([
- { default: EditorLite },
- {
- data: { content, new_path: path },
- },
- ]) => {
- const contentEl = this.$el.querySelector('.editor');
-
- this.originalContent = content;
- this.fileLoaded = true;
-
- this.editor = new EditorLite().createInstance({
- el: contentEl,
- blobPath: path,
- blobContent: content,
- });
- this.editor.onDidChangeModelContent(
- debounce(this.saveDiffResolution.bind(this), 250),
- );
- },
- )
- .catch(() => {
- flash(__('An error occurred while loading the file'));
- });
- },
- saveDiffResolution() {
- this.saved = true;
-
- // This probably be better placed in the data provider
- /* eslint-disable vue/no-mutating-props */
- this.file.content = this.editor.getValue();
- this.file.resolveEditChanged = this.file.content !== this.originalContent;
- this.file.promptDiscardConfirmation = false;
- /* eslint-enable vue/no-mutating-props */
- },
- resetEditorContent() {
- if (this.fileLoaded) {
- this.editor.setValue(this.originalContent);
- }
- },
- cancelDiscardConfirmation(file) {
- this.onCancelDiscardConfirmation(file);
- },
- acceptDiscardConfirmation(file) {
- this.onAcceptDiscardConfirmation(file);
- },
- },
- });
-})(window.gl || (window.gl = {}));
diff --git a/app/assets/javascripts/merge_conflicts/components/diff_file_editor.vue b/app/assets/javascripts/merge_conflicts/components/diff_file_editor.vue
new file mode 100644
index 00000000000..2c7c8038af5
--- /dev/null
+++ b/app/assets/javascripts/merge_conflicts/components/diff_file_editor.vue
@@ -0,0 +1,128 @@
+<script>
+import { debounce } from 'lodash';
+import { deprecatedCreateFlash as flash } from '~/flash';
+import axios from '~/lib/utils/axios_utils';
+import { __ } from '~/locale';
+
+export default {
+ props: {
+ file: {
+ type: Object,
+ required: true,
+ },
+ onCancelDiscardConfirmation: {
+ type: Function,
+ required: true,
+ },
+ onAcceptDiscardConfirmation: {
+ type: Function,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ saved: false,
+ fileLoaded: false,
+ originalContent: '',
+ };
+ },
+ computed: {
+ classObject() {
+ return {
+ saved: this.saved,
+ };
+ },
+ },
+ watch: {
+ 'file.showEditor': function showEditorWatcher(val) {
+ this.resetEditorContent();
+
+ if (!val || this.fileLoaded) {
+ return;
+ }
+
+ this.loadEditor();
+ },
+ },
+ mounted() {
+ if (this.file.loadEditor) {
+ this.loadEditor();
+ }
+ },
+ methods: {
+ loadEditor() {
+ const EditorPromise = import(/* webpackChunkName: 'EditorLite' */ '~/editor/editor_lite');
+ const DataPromise = axios.get(this.file.content_path);
+
+ Promise.all([EditorPromise, DataPromise])
+ .then(
+ ([
+ { default: EditorLite },
+ {
+ data: { content, new_path: path },
+ },
+ ]) => {
+ const contentEl = this.$el.querySelector('.editor');
+
+ this.originalContent = content;
+ this.fileLoaded = true;
+
+ this.editor = new EditorLite().createInstance({
+ el: contentEl,
+ blobPath: path,
+ blobContent: content,
+ });
+ this.editor.onDidChangeModelContent(debounce(this.saveDiffResolution.bind(this), 250));
+ },
+ )
+ .catch(() => {
+ flash(__('An error occurred while loading the file'));
+ });
+ },
+ saveDiffResolution() {
+ this.saved = true;
+
+ // This probably be better placed in the data provider
+ /* eslint-disable vue/no-mutating-props */
+ this.file.content = this.editor.getValue();
+ this.file.resolveEditChanged = this.file.content !== this.originalContent;
+ this.file.promptDiscardConfirmation = false;
+ /* eslint-enable vue/no-mutating-props */
+ },
+ resetEditorContent() {
+ if (this.fileLoaded) {
+ this.editor.setValue(this.originalContent);
+ }
+ },
+ cancelDiscardConfirmation(file) {
+ this.onCancelDiscardConfirmation(file);
+ },
+ acceptDiscardConfirmation(file) {
+ this.onAcceptDiscardConfirmation(file);
+ },
+ },
+};
+</script>
+<template>
+ <div v-show="file.showEditor" class="diff-editor-wrap">
+ <div v-if="file.promptDiscardConfirmation" class="discard-changes-alert-wrap">
+ <div class="discard-changes-alert">
+ {{ __('Are you sure you want to discard your changes?') }}
+ <div class="discard-actions">
+ <button
+ class="btn btn-sm btn-danger-secondary gl-button"
+ @click="acceptDiscardConfirmation(file)"
+ >
+ {{ __('Discard changes') }}
+ </button>
+ <button class="btn btn-default btn-sm gl-button" @click="cancelDiscardConfirmation(file)">
+ {{ __('Cancel') }}
+ </button>
+ </div>
+ </div>
+ </div>
+ <div :class="classObject" class="editor-wrap">
+ <div class="editor" style="height: 350px" data-editor-loading="true"></div>
+ </div>
+ </div>
+</template>
diff --git a/app/assets/javascripts/merge_conflicts/components/inline_conflict_lines.js b/app/assets/javascripts/merge_conflicts/components/inline_conflict_lines.js
deleted file mode 100644
index 47214e288ae..00000000000
--- a/app/assets/javascripts/merge_conflicts/components/inline_conflict_lines.js
+++ /dev/null
@@ -1,22 +0,0 @@
-// This is a true violation of @gitlab/no-runtime-template-compiler, as it relies on
-// app/views/projects/merge_requests/conflicts/components/_inline_conflict_lines.html.haml
-// for its template.
-/* eslint-disable no-param-reassign, @gitlab/no-runtime-template-compiler */
-
-import Vue from 'vue';
-import actionsMixin from '../mixins/line_conflict_actions';
-import utilsMixin from '../mixins/line_conflict_utils';
-
-((global) => {
- global.mergeConflicts = global.mergeConflicts || {};
-
- global.mergeConflicts.inlineConflictLines = Vue.extend({
- mixins: [utilsMixin, actionsMixin],
- props: {
- file: {
- type: Object,
- required: true,
- },
- },
- });
-})(window.gl || (window.gl = {}));
diff --git a/app/assets/javascripts/merge_conflicts/components/inline_conflict_lines.vue b/app/assets/javascripts/merge_conflicts/components/inline_conflict_lines.vue
new file mode 100644
index 00000000000..519fd53af1e
--- /dev/null
+++ b/app/assets/javascripts/merge_conflicts/components/inline_conflict_lines.vue
@@ -0,0 +1,47 @@
+<script>
+import { GlSafeHtmlDirective as SafeHtml } from '@gitlab/ui';
+import actionsMixin from '../mixins/line_conflict_actions';
+import utilsMixin from '../mixins/line_conflict_utils';
+
+export default {
+ directives: {
+ SafeHtml,
+ },
+ mixins: [utilsMixin, actionsMixin],
+ props: {
+ file: {
+ type: Object,
+ required: true,
+ },
+ },
+};
+</script>
+<template>
+ <table class="diff-wrap-lines code code-commit js-syntax-highlight">
+ <tr
+ v-for="line in file.inlineLines"
+ :key="(line.isHeader ? line.id : line.new_line) + line.richText"
+ class="line_holder diff-inline"
+ >
+ <template v-if="line.isHeader">
+ <td :class="lineCssClass(line)" class="diff-line-num header"></td>
+ <td :class="lineCssClass(line)" class="diff-line-num header"></td>
+ <td :class="lineCssClass(line)" class="line_content header">
+ <strong>{{ line.richText }}</strong>
+ <button class="btn" @click="handleSelected(file, line.id, line.section)">
+ {{ line.buttonTitle }}
+ </button>
+ </td>
+ </template>
+ <template v-else>
+ <td :class="lineCssClass(line)" class="diff-line-num new_line">
+ <a>{{ line.new_line }}</a>
+ </td>
+ <td :class="lineCssClass(line)" class="diff-line-num old_line">
+ <a>{{ line.old_line }}</a>
+ </td>
+ <td v-safe-html="line.richText" :class="lineCssClass(line)" class="line_content"></td>
+ </template>
+ </tr>
+ </table>
+</template>
diff --git a/app/assets/javascripts/merge_conflicts/components/parallel_conflict_lines.js b/app/assets/javascripts/merge_conflicts/components/parallel_conflict_lines.js
deleted file mode 100644
index 1d5946cd78a..00000000000
--- a/app/assets/javascripts/merge_conflicts/components/parallel_conflict_lines.js
+++ /dev/null
@@ -1,37 +0,0 @@
-/* eslint-disable no-param-reassign */
-
-import Vue from 'vue';
-import actionsMixin from '../mixins/line_conflict_actions';
-import utilsMixin from '../mixins/line_conflict_utils';
-
-((global) => {
- global.mergeConflicts = global.mergeConflicts || {};
-
- global.mergeConflicts.parallelConflictLines = Vue.extend({
- mixins: [utilsMixin, actionsMixin],
- props: {
- file: {
- type: Object,
- required: true,
- },
- },
- // This is a true violation of @gitlab/no-runtime-template-compiler, as it
- // has a template string.
- // eslint-disable-next-line @gitlab/no-runtime-template-compiler
- template: `
- <table class="diff-wrap-lines code js-syntax-highlight">
- <tr class="line_holder parallel" v-for="section in file.parallelLines">
- <template v-for="line in section">
- <td class="diff-line-num header" :class="lineCssClass(line)" v-if="line.isHeader"></td>
- <td class="line_content header" :class="lineCssClass(line)" v-if="line.isHeader">
- <strong>{{line.richText}}</strong>
- <button class="btn" @click="handleSelected(file, line.id, line.section)">{{line.buttonTitle}}</button>
- </td>
- <td class="diff-line-num old_line" :class="lineCssClass(line)" v-if="!line.isHeader">{{line.lineNumber}}</td>
- <td class="line_content parallel" :class="lineCssClass(line)" v-if="!line.isHeader" v-html="line.richText"></td>
- </template>
- </tr>
- </table>
- `,
- });
-})(window.gl || (window.gl = {}));
diff --git a/app/assets/javascripts/merge_conflicts/components/parallel_conflict_lines.vue b/app/assets/javascripts/merge_conflicts/components/parallel_conflict_lines.vue
new file mode 100644
index 00000000000..e66f641f70d
--- /dev/null
+++ b/app/assets/javascripts/merge_conflicts/components/parallel_conflict_lines.vue
@@ -0,0 +1,47 @@
+<script>
+import { GlSafeHtmlDirective as SafeHtml } from '@gitlab/ui';
+import actionsMixin from '../mixins/line_conflict_actions';
+import utilsMixin from '../mixins/line_conflict_utils';
+
+export default {
+ directives: {
+ SafeHtml,
+ },
+ mixins: [utilsMixin, actionsMixin],
+ props: {
+ file: {
+ type: Object,
+ required: true,
+ },
+ },
+};
+</script>
+<template>
+ <!-- Unfortunately there isn't a good key for these sections -->
+ <!-- eslint-disable vue/require-v-for-key -->
+ <table class="diff-wrap-lines code js-syntax-highlight">
+ <tr v-for="section in file.parallelLines" class="line_holder parallel">
+ <template v-for="line in section">
+ <template v-if="line.isHeader">
+ <td class="diff-line-num header" :class="lineCssClass(line)"></td>
+ <td class="line_content header" :class="lineCssClass(line)">
+ <strong>{{ line.richText }}</strong>
+ <button class="btn" @click="handleSelected(file, line.id, line.section)">
+ {{ line.buttonTitle }}
+ </button>
+ </td>
+ </template>
+ <template v-else>
+ <td class="diff-line-num old_line" :class="lineCssClass(line)">
+ {{ line.lineNumber }}
+ </td>
+ <td
+ v-safe-html="line.richText"
+ class="line_content parallel"
+ :class="lineCssClass(line)"
+ ></td>
+ </template>
+ </template>
+ </tr>
+ </table>
+</template>
diff --git a/app/assets/javascripts/merge_conflicts/constants.js b/app/assets/javascripts/merge_conflicts/constants.js
new file mode 100644
index 00000000000..6f3ee339e36
--- /dev/null
+++ b/app/assets/javascripts/merge_conflicts/constants.js
@@ -0,0 +1,20 @@
+import { s__ } from '~/locale';
+
+export const CONFLICT_TYPES = {
+ TEXT: 'text',
+ TEXT_EDITOR: 'text-editor',
+};
+
+export const VIEW_TYPES = {
+ INLINE: 'inline',
+ PARALLEL: 'parallel',
+};
+
+export const EDIT_RESOLVE_MODE = 'edit';
+export const INTERACTIVE_RESOLVE_MODE = 'interactive';
+export const DEFAULT_RESOLVE_MODE = INTERACTIVE_RESOLVE_MODE;
+
+export const HEAD_HEADER_TEXT = s__('MergeConflict|HEAD//our changes');
+export const ORIGIN_HEADER_TEXT = s__('MergeConflict|origin//their changes');
+export const HEAD_BUTTON_TITLE = s__('MergeConflict|Use ours');
+export const ORIGIN_BUTTON_TITLE = s__('MergeConflict|Use theirs');
diff --git a/app/assets/javascripts/merge_conflicts/merge_conflict_resolver_app.vue b/app/assets/javascripts/merge_conflicts/merge_conflict_resolver_app.vue
new file mode 100644
index 00000000000..16a7cfb2ba8
--- /dev/null
+++ b/app/assets/javascripts/merge_conflicts/merge_conflict_resolver_app.vue
@@ -0,0 +1,217 @@
+<script>
+import { GlSprintf } from '@gitlab/ui';
+import { __ } from '~/locale';
+import FileIcon from '~/vue_shared/components/file_icon.vue';
+import DiffFileEditor from './components/diff_file_editor.vue';
+import InlineConflictLines from './components/inline_conflict_lines.vue';
+import ParallelConflictLines from './components/parallel_conflict_lines.vue';
+
+/**
+ * NOTE: Most of this component is directly using $root, rather than props or a better data store.
+ * This is BAD and one shouldn't copy that behavior. Similarly a lot of the classes below should
+ * be replaced with GitLab UI components.
+ *
+ * We are just doing it temporarily in order to migrate the template from HAML => Vue in an iterative manner
+ * and are going to clean it up as part of:
+ *
+ * https://gitlab.com/gitlab-org/gitlab/-/issues/321090
+ *
+ */
+export default {
+ components: {
+ GlSprintf,
+ FileIcon,
+ DiffFileEditor,
+ InlineConflictLines,
+ ParallelConflictLines,
+ },
+ inject: ['mergeRequestPath', 'sourceBranchPath'],
+ i18n: {
+ commitStatSummary: __('Showing %{conflict} between %{sourceBranch} and %{targetBranch}'),
+ resolveInfo: __(
+ '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}',
+ ),
+ },
+};
+</script>
+<template>
+ <div id="conflicts">
+ <div v-if="$root.isLoading" class="loading">
+ <div class="spinner spinner-md"></div>
+ </div>
+ <div v-if="$root.hasError" class="nothing-here-block">
+ {{ $root.conflictsData.errorMessage }}
+ </div>
+ <template v-if="!$root.isLoading && !$root.hasError">
+ <div class="content-block oneline-block files-changed">
+ <div v-if="$root.showDiffViewTypeSwitcher" class="inline-parallel-buttons">
+ <div class="btn-group">
+ <button
+ :class="{ active: !$root.isParallel }"
+ class="btn gl-button"
+ @click="$root.handleViewTypeChange('inline')"
+ >
+ {{ __('Inline') }}
+ </button>
+ <button
+ :class="{ active: $root.isParallel }"
+ class="btn gl-button"
+ @click="$root.handleViewTypeChange('parallel')"
+ >
+ {{ __('Side-by-side') }}
+ </button>
+ </div>
+ </div>
+ <div class="js-toggle-container">
+ <div class="commit-stat-summary">
+ <gl-sprintf :message="$options.i18n.commitStatSummary">
+ <template #conflict>
+ <strong class="cred">
+ {{ $root.conflictsCountText }}
+ </strong>
+ </template>
+ <template #sourceBranch>
+ <strong class="ref-name">
+ {{ $root.conflictsData.sourceBranch }}
+ </strong>
+ </template>
+ <template #targetBranch>
+ <strong class="ref-name">
+ {{ $root.conflictsData.targetBranch }}
+ </strong>
+ </template>
+ </gl-sprintf>
+ </div>
+ </div>
+ </div>
+ <div class="files-wrapper">
+ <div class="files">
+ <div
+ v-for="file in $root.conflictsData.files"
+ :key="file.blobPath"
+ class="diff-file file-holder conflict"
+ >
+ <div class="js-file-title file-title file-title-flex-parent cursor-default">
+ <div class="file-header-content">
+ <file-icon :file-name="file.filePath" :size="18" css-classes="gl-mr-2" />
+ <strong class="file-title-name">{{ file.filePath }}</strong>
+ </div>
+ <div class="file-actions d-flex align-items-center gl-ml-auto gl-align-self-start">
+ <div v-if="file.type === 'text'" class="btn-group gl-mr-3">
+ <button
+ :class="{ active: file.resolveMode === 'interactive' }"
+ class="btn gl-button"
+ type="button"
+ @click="$root.onClickResolveModeButton(file, 'interactive')"
+ >
+ {{ __('Interactive mode') }}
+ </button>
+ <button
+ :class="{ active: file.resolveMode === 'edit' }"
+ class="btn gl-button"
+ type="button"
+ @click="$root.onClickResolveModeButton(file, 'edit')"
+ >
+ {{ __('Edit inline') }}
+ </button>
+ </div>
+ <a :href="file.blobPath" class="btn gl-button view-file">
+ <gl-sprintf :message="__('View file @ %{commitSha}')">
+ <template #commitSha>
+ {{ $root.conflictsData.shortCommitSha }}
+ </template>
+ </gl-sprintf>
+ </a>
+ </div>
+ </div>
+ <div class="diff-content diff-wrap-lines">
+ <div
+ v-show="
+ !$root.isParallel && file.resolveMode === 'interactive' && file.type === 'text'
+ "
+ class="file-content"
+ >
+ <inline-conflict-lines :file="file" />
+ </div>
+ <div
+ v-show="
+ $root.isParallel && file.resolveMode === 'interactive' && file.type === 'text'
+ "
+ class="file-content"
+ >
+ <parallel-conflict-lines :file="file" />
+ </div>
+ <div v-show="file.resolveMode === 'edit' || file.type === 'text-editor'">
+ <diff-file-editor
+ :file="file"
+ :on-accept-discard-confirmation="$root.acceptDiscardConfirmation"
+ :on-cancel-discard-confirmation="$root.cancelDiscardConfirmation"
+ />
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <hr />
+ <div class="resolve-conflicts-form">
+ <div class="form-group row">
+ <div class="col-md-4">
+ <h4>
+ {{ __('Resolve conflicts on source branch') }}
+ </h4>
+ <div class="resolve-info">
+ <gl-sprintf :message="$options.i18n.resolveInfo">
+ <template #use_ours>
+ <code>{{ s__('MergeConflict|Use ours') }}</code>
+ </template>
+ <template #use_theirs>
+ <code>{{ s__('MergeConflict|Use theirs') }}</code>
+ </template>
+ <template #branch_name>
+ <a class="ref-name" :href="sourceBranchPath">
+ {{ $root.conflictsData.sourceBranch }}
+ </a>
+ </template>
+ </gl-sprintf>
+ </div>
+ </div>
+ <div class="col-md-8">
+ <label class="label-bold" for="commit-message">
+ {{ __('Commit message') }}
+ </label>
+ <div class="commit-message-container">
+ <div class="max-width-marker"></div>
+ <textarea
+ id="commit-message"
+ v-model="$root.conflictsData.commitMessage"
+ class="form-control js-commit-message"
+ rows="5"
+ ></textarea>
+ </div>
+ </div>
+ </div>
+ <div class="form-group row">
+ <div class="offset-md-4 col-md-8">
+ <div class="row">
+ <div class="col-6">
+ <button
+ :disabled="!$root.readyToCommit"
+ class="btn gl-button btn-success js-submit-button"
+ type="button"
+ @click="$root.commit()"
+ >
+ <span>{{ $root.commitButtonText }}</span>
+ </button>
+ </div>
+ <div class="col-6 text-right">
+ <a :href="mergeRequestPath" class="gl-button btn btn-default">
+ {{ __('Cancel') }}
+ </a>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </template>
+ </div>
+</template>
diff --git a/app/assets/javascripts/merge_conflicts/merge_conflicts_bundle.js b/app/assets/javascripts/merge_conflicts/merge_conflicts_bundle.js
index e3972b8b574..4b73dd317cd 100644
--- a/app/assets/javascripts/merge_conflicts/merge_conflicts_bundle.js
+++ b/app/assets/javascripts/merge_conflicts/merge_conflicts_bundle.js
@@ -1,19 +1,12 @@
-// This is a true violation of @gitlab/no-runtime-template-compiler, as it
-// relies on app/views/projects/merge_requests/conflicts/show.html.haml for its
-// template.
-/* eslint-disable @gitlab/no-runtime-template-compiler */
import $ from 'jquery';
import Vue from 'vue';
import { __ } from '~/locale';
-import FileIcon from '~/vue_shared/components/file_icon.vue';
import { deprecatedCreateFlash as createFlash } from '../flash';
import initIssuableSidebar from '../init_issuable_sidebar';
import './merge_conflict_store';
import syntaxHighlight from '../syntax_highlight';
+import MergeConflictsResolverApp from './merge_conflict_resolver_app.vue';
import MergeConflictsService from './merge_conflict_service';
-import './components/diff_file_editor';
-import './components/inline_conflict_lines';
-import './components/parallel_conflict_lines';
export default function initMergeConflicts() {
const INTERACTIVE_RESOLVE_MODE = 'interactive';
@@ -24,15 +17,15 @@ export default function initMergeConflicts() {
resolveConflictsPath: conflictsEl.dataset.resolveConflictsPath,
});
+ const { sourceBranchPath, mergeRequestPath } = conflictsEl.dataset;
+
initIssuableSidebar();
- gl.MergeConflictsResolverApp = new Vue({
- el: '#conflicts',
- components: {
- FileIcon,
- 'diff-file-editor': gl.mergeConflicts.diffFileEditor,
- 'inline-conflict-lines': gl.mergeConflicts.inlineConflictLines,
- 'parallel-conflict-lines': gl.mergeConflicts.parallelConflictLines,
+ return new Vue({
+ el: conflictsEl,
+ provide: {
+ sourceBranchPath,
+ mergeRequestPath,
},
data: mergeConflictsStore.state,
computed: {
@@ -103,5 +96,8 @@ export default function initMergeConflicts() {
});
},
},
+ render(createElement) {
+ return createElement(MergeConflictsResolverApp);
+ },
});
}
diff --git a/app/assets/javascripts/merge_conflicts/store/actions.js b/app/assets/javascripts/merge_conflicts/store/actions.js
new file mode 100644
index 00000000000..8036e90c58c
--- /dev/null
+++ b/app/assets/javascripts/merge_conflicts/store/actions.js
@@ -0,0 +1,120 @@
+import Cookies from 'js-cookie';
+import createFlash from '~/flash';
+import axios from '~/lib/utils/axios_utils';
+import { __ } from '~/locale';
+import { INTERACTIVE_RESOLVE_MODE, EDIT_RESOLVE_MODE } from '../constants';
+import { decorateFiles, restoreFileLinesState, markLine } from '../utils';
+import * as types from './mutation_types';
+
+export const fetchConflictsData = async ({ commit, dispatch }, conflictsPath) => {
+ commit(types.SET_LOADING_STATE, true);
+ try {
+ const { data } = await axios.get(conflictsPath);
+ if (data.type === 'error') {
+ commit(types.SET_FAILED_REQUEST, data.message);
+ } else {
+ dispatch('setConflictsData', data);
+ }
+ } catch (e) {
+ commit(types.SET_FAILED_REQUEST);
+ }
+ commit(types.SET_LOADING_STATE, false);
+};
+
+export const setConflictsData = async ({ commit }, data) => {
+ const files = decorateFiles(data.files);
+ commit(types.SET_CONFLICTS_DATA, { ...data, files });
+};
+
+export const submitResolvedConflicts = async ({ commit, getters }, resolveConflictsPath) => {
+ commit(types.SET_SUBMIT_STATE, true);
+ try {
+ const { data } = await axios.post(resolveConflictsPath, getters.getCommitData);
+ window.location.assign(data.redirect_to);
+ } catch (e) {
+ commit(types.SET_SUBMIT_STATE, false);
+ createFlash({ message: __('Failed to save merge conflicts resolutions. Please try again!') });
+ }
+};
+
+export const setLoadingState = ({ commit }, isLoading) => {
+ commit(types.SET_LOADING_STATE, isLoading);
+};
+
+export const setErrorState = ({ commit }, hasError) => {
+ commit(types.SET_ERROR_STATE, hasError);
+};
+
+export const setFailedRequest = ({ commit }, message) => {
+ commit(types.SET_FAILED_REQUEST, message);
+};
+
+export const setViewType = ({ commit }, viewType) => {
+ commit(types.SET_VIEW_TYPE, viewType);
+ Cookies.set('diff_view', viewType);
+};
+
+export const setSubmitState = ({ commit }, isSubmitting) => {
+ commit(types.SET_SUBMIT_STATE, isSubmitting);
+};
+
+export const updateCommitMessage = ({ commit }, commitMessage) => {
+ commit(types.UPDATE_CONFLICTS_DATA, { commitMessage });
+};
+
+export const setFileResolveMode = ({ commit, state, getters }, { file, mode }) => {
+ const index = getters.getFileIndex(file);
+ const updated = { ...state.conflictsData.files[index] };
+ if (mode === INTERACTIVE_RESOLVE_MODE) {
+ updated.showEditor = false;
+ } else if (mode === EDIT_RESOLVE_MODE) {
+ // Restore Interactive mode when switching to Edit mode
+ updated.showEditor = true;
+ updated.loadEditor = true;
+ updated.resolutionData = {};
+
+ const { inlineLines, parallelLines } = restoreFileLinesState(updated);
+ updated.parallelLines = parallelLines;
+ updated.inlineLines = inlineLines;
+ }
+ updated.resolveMode = mode;
+ commit(types.UPDATE_FILE, { file: updated, index });
+};
+
+export const setPromptConfirmationState = (
+ { commit, state, getters },
+ { file, promptDiscardConfirmation },
+) => {
+ const index = getters.getFileIndex(file);
+ const updated = { ...state.conflictsData.files[index], promptDiscardConfirmation };
+ commit(types.UPDATE_FILE, { file: updated, index });
+};
+
+export const handleSelected = ({ commit, state, getters }, { file, line: { id, section } }) => {
+ const index = getters.getFileIndex(file);
+ const updated = { ...state.conflictsData.files[index] };
+ updated.resolutionData = { ...updated.resolutionData, [id]: section };
+
+ updated.inlineLines = file.inlineLines.map((line) => {
+ if (id === line.id && (line.hasConflict || line.isHeader)) {
+ return markLine(line, section);
+ }
+ return line;
+ });
+
+ updated.parallelLines = file.parallelLines.map((lines) => {
+ let left = { ...lines[0] };
+ let right = { ...lines[1] };
+ const hasSameId = right.id === id || left.id === id;
+ const isLeftMatch = left.hasConflict || left.isHeader;
+ const isRightMatch = right.hasConflict || right.isHeader;
+
+ if (hasSameId && (isLeftMatch || isRightMatch)) {
+ left = markLine(left, section);
+ right = markLine(right, section);
+ }
+ return [left, right];
+ });
+
+ commit(types.UPDATE_FILE, { file: updated, index });
+};
diff --git a/app/assets/javascripts/merge_conflicts/store/getters.js b/app/assets/javascripts/merge_conflicts/store/getters.js
new file mode 100644
index 00000000000..03e425fb478
--- /dev/null
+++ b/app/assets/javascripts/merge_conflicts/store/getters.js
@@ -0,0 +1,117 @@
+import { s__ } from '~/locale';
+import { CONFLICT_TYPES, EDIT_RESOLVE_MODE, INTERACTIVE_RESOLVE_MODE } from '../constants';
+
+export const getConflictsCount = (state) => {
+ if (!state.conflictsData.files.length) {
+ return 0;
+ }
+
+ const { files } = state.conflictsData;
+ let count = 0;
+
+ files.forEach((file) => {
+ if (file.type === CONFLICT_TYPES.TEXT) {
+ file.sections.forEach((section) => {
+ if (section.conflict) {
+ count += 1;
+ }
+ });
+ } else {
+ count += 1;
+ }
+ });
+
+ return count;
+};
+
+export const getConflictsCountText = (state, getters) => {
+ const count = getters.getConflictsCount;
+ const text = count > 1 ? s__('MergeConflict|conflicts') : s__('MergeConflict|conflict');
+
+ return `${count} ${text}`;
+};
+
+export const isReadyToCommit = (state) => {
+ const { files } = state.conflictsData;
+ const hasCommitMessage = state.conflictsData.commitMessage.trim().length;
+ let unresolved = 0;
+
+ for (let i = 0, l = files.length; i < l; i += 1) {
+ const file = files[i];
+
+ if (file.resolveMode === INTERACTIVE_RESOLVE_MODE) {
+ let numberConflicts = 0;
+ const resolvedConflicts = Object.keys(file.resolutionData).length;
+
+ // We only check for conflicts type 'text'
+ // since conflicts `text_editor` can´t be resolved in interactive mode
+ if (file.type === CONFLICT_TYPES.TEXT) {
+ for (let j = 0, k = file.sections.length; j < k; j += 1) {
+ if (file.sections[j].conflict) {
+ numberConflicts += 1;
+ }
+ }
+
+ if (resolvedConflicts !== numberConflicts) {
+ unresolved += 1;
+ }
+ }
+ } else if (file.resolveMode === EDIT_RESOLVE_MODE) {
+ // Unlikely to happen since switching to Edit mode saves content automatically.
+ // Checking anyway in case the save strategy changes in the future
+ if (!file.content) {
+ unresolved += 1;
+ // eslint-disable-next-line no-continue
+ continue;
+ }
+ }
+ }
+
+ return !state.isSubmitting && hasCommitMessage && !unresolved;
+};
+
+export const getCommitButtonText = (state) => {
+ const initial = s__('MergeConflict|Commit to source branch');
+ const inProgress = s__('MergeConflict|Committing...');
+
+ return state.isSubmitting ? inProgress : initial;
+};
+
+export const getCommitData = (state) => {
+ let commitData = {};
+
+ commitData = {
+ commit_message: state.conflictsData.commitMessage,
+ files: [],
+ };
+
+ state.conflictsData.files.forEach((file) => {
+ const addFile = {
+ old_path: file.old_path,
+ new_path: file.new_path,
+ };
+
+ if (file.type === CONFLICT_TYPES.TEXT) {
+ // Submit only one data for type of editing
+ if (file.resolveMode === INTERACTIVE_RESOLVE_MODE) {
+ addFile.sections = file.resolutionData;
+ } else if (file.resolveMode === EDIT_RESOLVE_MODE) {
+ addFile.content = file.content;
+ }
+ } else if (file.type === CONFLICT_TYPES.TEXT_EDITOR) {
+ addFile.content = file.content;
+ }
+
+ commitData.files.push(addFile);
+ });
+
+ return commitData;
+};
+
+export const fileTextTypePresent = (state) => {
+ return state.conflictsData?.files.some((f) => f.type === CONFLICT_TYPES.TEXT);
+};
+
+export const getFileIndex = (state) => ({ blobPath }) => {
+ return state.conflictsData.files.findIndex((f) => f.blobPath === blobPath);
+};
diff --git a/app/assets/javascripts/merge_conflicts/store/index.js b/app/assets/javascripts/merge_conflicts/store/index.js
new file mode 100644
index 00000000000..18e3351ed13
--- /dev/null
+++ b/app/assets/javascripts/merge_conflicts/store/index.js
@@ -0,0 +1,16 @@
+import Vue from 'vue';
+import Vuex from 'vuex';
+import * as actions from './actions';
+import * as getters from './getters';
+import mutations from './mutations';
+import state from './state';
+
+Vue.use(Vuex);
+
+export const createStore = () =>
+ new Vuex.Store({
+ state,
+ getters,
+ actions,
+ mutations,
+ });
diff --git a/app/assets/javascripts/merge_conflicts/store/mutation_types.js b/app/assets/javascripts/merge_conflicts/store/mutation_types.js
new file mode 100644
index 00000000000..ab80f8e52ad
--- /dev/null
+++ b/app/assets/javascripts/merge_conflicts/store/mutation_types.js
@@ -0,0 +1,8 @@
+export const SET_LOADING_STATE = 'SET_LOADING_STATE';
+export const SET_ERROR_STATE = 'SET_ERROR_STATE';
+export const SET_FAILED_REQUEST = 'SET_FAILED_REQUEST';
+export const SET_VIEW_TYPE = 'SET_VIEW_TYPE';
+export const SET_SUBMIT_STATE = 'SET_SUBMIT_STATE';
+export const SET_CONFLICTS_DATA = 'SET_CONFLICTS_DATA';
+export const UPDATE_FILE = 'UPDATE_FILE';
+export const UPDATE_CONFLICTS_DATA = 'UPDATE_CONFLICTS_DATA';
diff --git a/app/assets/javascripts/merge_conflicts/store/mutations.js b/app/assets/javascripts/merge_conflicts/store/mutations.js
new file mode 100644
index 00000000000..2cee55319eb
--- /dev/null
+++ b/app/assets/javascripts/merge_conflicts/store/mutations.js
@@ -0,0 +1,40 @@
+import { VIEW_TYPES } from '../constants';
+import * as types from './mutation_types';
+
+export default {
+ [types.SET_LOADING_STATE]: (state, value) => {
+ state.isLoading = value;
+ },
+ [types.SET_ERROR_STATE]: (state, value) => {
+ state.hasError = value;
+ },
+ [types.SET_FAILED_REQUEST]: (state, value) => {
+ state.hasError = true;
+ state.conflictsData.errorMessage = value;
+ },
+ [types.SET_VIEW_TYPE]: (state, value) => {
+ state.diffView = value;
+ state.isParallel = value === VIEW_TYPES.PARALLEL;
+ },
+ [types.SET_SUBMIT_STATE]: (state, value) => {
+ state.isSubmitting = value;
+ },
+ [types.SET_CONFLICTS_DATA]: (state, data) => {
+ state.conflictsData = {
+ files: data.files,
+ commitMessage: data.commit_message,
+ sourceBranch: data.source_branch,
+ targetBranch: data.target_branch,
+ shortCommitSha: data.commit_sha.slice(0, 7),
+ };
+ },
+ [types.UPDATE_CONFLICTS_DATA]: (state, payload) => {
+ state.conflictsData = {
+ ...state.conflictsData,
+ ...payload,
+ };
+ },
+ [types.UPDATE_FILE]: (state, { file, index }) => {
+ state.conflictsData.files.splice(index, 1, file);
+ },
+};
diff --git a/app/assets/javascripts/merge_conflicts/store/state.js b/app/assets/javascripts/merge_conflicts/store/state.js
new file mode 100644
index 00000000000..8f700f58e54
--- /dev/null
+++ b/app/assets/javascripts/merge_conflicts/store/state.js
@@ -0,0 +1,13 @@
+import Cookies from 'js-cookie';
+import { VIEW_TYPES } from '../constants';
+
+const diffViewType = Cookies.get('diff_view');
+
+export default () => ({
+ isLoading: true,
+ hasError: false,
+ isSubmitting: false,
+ isParallel: diffViewType === VIEW_TYPES.PARALLEL,
+ diffViewType,
+ conflictsData: {},
+});
diff --git a/app/assets/javascripts/merge_conflicts/utils.js b/app/assets/javascripts/merge_conflicts/utils.js
new file mode 100644
index 00000000000..e42703ef0a5
--- /dev/null
+++ b/app/assets/javascripts/merge_conflicts/utils.js
@@ -0,0 +1,228 @@
+import {
+ ORIGIN_HEADER_TEXT,
+ ORIGIN_BUTTON_TITLE,
+ HEAD_HEADER_TEXT,
+ HEAD_BUTTON_TITLE,
+ DEFAULT_RESOLVE_MODE,
+ CONFLICT_TYPES,
+} from './constants';
+
+export const getFilePath = (file) => {
+ const { old_path, new_path } = file;
+ // eslint-disable-next-line babel/camelcase
+ return old_path === new_path ? new_path : `${old_path} → ${new_path}`;
+};
+
+export const checkLineLengths = ({ left, right }) => {
+ const wLeft = [...left];
+ const wRight = [...right];
+ if (left.length !== right.length) {
+ if (left.length > right.length) {
+ const diff = left.length - right.length;
+ for (let i = 0; i < diff; i += 1) {
+ wRight.push({ lineType: 'emptyLine', richText: '' });
+ }
+ } else {
+ const diff = right.length - left.length;
+ for (let i = 0; i < diff; i += 1) {
+ wLeft.push({ lineType: 'emptyLine', richText: '' });
+ }
+ }
+ }
+ return { left: wLeft, right: wRight };
+};
+
+export const getHeadHeaderLine = (id) => {
+ return {
+ id,
+ richText: HEAD_HEADER_TEXT,
+ buttonTitle: HEAD_BUTTON_TITLE,
+ type: 'new',
+ section: 'head',
+ isHeader: true,
+ isHead: true,
+ isSelected: false,
+ isUnselected: false,
+ };
+};
+
+export const decorateLineForInlineView = (line, id, conflict) => {
+ const { type } = line;
+ return {
+ id,
+ hasConflict: conflict,
+ isHead: type === 'new',
+ isOrigin: type === 'old',
+ hasMatch: type === 'match',
+ richText: line.rich_text,
+ isSelected: false,
+ isUnselected: false,
+ };
+};
+
+export const getLineForParallelView = (line, id, lineType, isHead) => {
+ const { old_line, new_line, rich_text } = line;
+ const hasConflict = lineType === 'conflict';
+
+ return {
+ id,
+ lineType,
+ hasConflict,
+ isHead: hasConflict && isHead,
+ isOrigin: hasConflict && !isHead,
+ hasMatch: lineType === 'match',
+ // eslint-disable-next-line babel/camelcase
+ lineNumber: isHead ? new_line : old_line,
+ section: isHead ? 'head' : 'origin',
+ richText: rich_text,
+ isSelected: false,
+ isUnselected: false,
+ };
+};
+
+export const getOriginHeaderLine = (id) => {
+ return {
+ id,
+ richText: ORIGIN_HEADER_TEXT,
+ buttonTitle: ORIGIN_BUTTON_TITLE,
+ type: 'old',
+ section: 'origin',
+ isHeader: true,
+ isOrigin: true,
+ isSelected: false,
+ isUnselected: false,
+ };
+};
+
+export const setInlineLine = (file) => {
+ const inlineLines = [];
+
+ file.sections.forEach((section) => {
+ let currentLineType = 'new';
+ const { conflict, lines, id } = section;
+
+ if (conflict) {
+ inlineLines.push(getHeadHeaderLine(id));
+ }
+
+ lines.forEach((line) => {
+ const { type } = line;
+
+ if ((type === 'new' || type === 'old') && currentLineType !== type) {
+ currentLineType = type;
+ inlineLines.push({ lineType: 'emptyLine', richText: '' });
+ }
+
+ const decoratedLine = decorateLineForInlineView(line, id, conflict);
+ inlineLines.push(decoratedLine);
+ });
+
+ if (conflict) {
+ inlineLines.push(getOriginHeaderLine(id));
+ }
+ });
+
+ return inlineLines;
+};
+
+export const setParallelLine = (file) => {
+ const parallelLines = [];
+ let linesObj = { left: [], right: [] };
+
+ file.sections.forEach((section) => {
+ const { conflict, lines, id } = section;
+
+ if (conflict) {
+ linesObj.left.push(getOriginHeaderLine(id));
+ linesObj.right.push(getHeadHeaderLine(id));
+ }
+
+ lines.forEach((line) => {
+ const { type } = line;
+
+ if (conflict) {
+ if (type === 'old') {
+ linesObj.left.push(getLineForParallelView(line, id, 'conflict'));
+ } else if (type === 'new') {
+ linesObj.right.push(getLineForParallelView(line, id, 'conflict', true));
+ }
+ } else {
+ const lineType = type || 'context';
+
+ linesObj.left.push(getLineForParallelView(line, id, lineType));
+ linesObj.right.push(getLineForParallelView(line, id, lineType, true));
+ }
+ });
+
+ linesObj = checkLineLengths(linesObj);
+ });
+
+ for (let i = 0, len = linesObj.left.length; i < len; i += 1) {
+ parallelLines.push([linesObj.right[i], linesObj.left[i]]);
+ }
+ return parallelLines;
+};
+
+export const decorateFiles = (files) => {
+ return files.map((file) => {
+ const f = { ...file };
+ f.content = '';
+ f.resolutionData = {};
+ f.promptDiscardConfirmation = false;
+ f.resolveMode = DEFAULT_RESOLVE_MODE;
+ f.filePath = getFilePath(file);
+ f.blobPath = f.blob_path;
+
+ if (f.type === CONFLICT_TYPES.TEXT) {
+ f.showEditor = false;
+ f.loadEditor = false;
+
+ f.inlineLines = setInlineLine(file);
+ f.parallelLines = setParallelLine(file);
+ } else if (f.type === CONFLICT_TYPES.TEXT_EDITOR) {
+ f.showEditor = true;
+ f.loadEditor = true;
+ }
+ return f;
+ });
+};
+
+export const restoreFileLinesState = (file) => {
+ const inlineLines = file.inlineLines.map((line) => {
+ if (line.hasConflict || line.isHeader) {
+ return { ...line, isSelected: false, isUnselected: false };
+ }
+ return { ...line };
+ });
+
+ const parallelLines = file.parallelLines.map((lines) => {
+ const left = { ...lines[0] };
+ const right = { ...lines[1] };
+ const isLeftMatch = left.hasConflict || left.isHeader;
+ const isRightMatch = right.hasConflict || right.isHeader;
+
+ if (isLeftMatch || isRightMatch) {
+ left.isSelected = false;
+ left.isUnselected = false;
+ right.isSelected = false;
+ right.isUnselected = false;
+ }
+ return [left, right];
+ });
+ return { inlineLines, parallelLines };
+};
+
+export const markLine = (line, selection) => {
+ const updated = { ...line };
+ if (selection === 'head' && line.isHead) {
+ updated.isSelected = true;
+ updated.isUnselected = false;
+ } else if (selection === 'origin' && updated.isOrigin) {
+ updated.isSelected = true;
+ updated.isUnselected = false;
+ } else {
+ updated.isSelected = false;
+ updated.isUnselected = true;
+ }
+ return updated;
+};
diff --git a/app/assets/javascripts/merge_request_tabs.js b/app/assets/javascripts/merge_request_tabs.js
index 4dab796d8a4..81b9db6b4d5 100644
--- a/app/assets/javascripts/merge_request_tabs.js
+++ b/app/assets/javascripts/merge_request_tabs.js
@@ -361,10 +361,8 @@ export default class MergeRequestTabs {
return createElement(CommitPipelinesTable, {
props: {
endpoint: pipelineTableViewEl.dataset.endpoint,
- helpPagePath: pipelineTableViewEl.dataset.helpPagePath,
emptyStateSvgPath: pipelineTableViewEl.dataset.emptyStateSvgPath,
errorStateSvgPath: pipelineTableViewEl.dataset.errorStateSvgPath,
- autoDevopsHelpPath: pipelineTableViewEl.dataset.helpAutoDevopsPath,
canCreatePipelineInTargetProject: Boolean(
mrWidgetData?.can_create_pipeline_in_target_project,
),
diff --git a/app/assets/javascripts/milestone.js b/app/assets/javascripts/milestone.js
index f249fef5ea4..280613bda49 100644
--- a/app/assets/javascripts/milestone.js
+++ b/app/assets/javascripts/milestone.js
@@ -2,7 +2,6 @@ import $ from 'jquery';
import { deprecatedCreateFlash as flash } from './flash';
import axios from './lib/utils/axios_utils';
import { __ } from './locale';
-import { mouseenter, debouncedMouseleave, togglePopover } from './shared/popover';
export default class Milestone {
constructor() {
@@ -43,30 +42,4 @@ export default class Milestone {
.catch(() => flash(__('Error loading milestone tab')));
}
}
-
- static initDeprecationMessage() {
- const deprecationMesssageContainer = document.querySelector(
- '.js-milestone-deprecation-message',
- );
-
- if (!deprecationMesssageContainer) return;
-
- const deprecationMessage = deprecationMesssageContainer.querySelector(
- '.js-milestone-deprecation-message-template',
- ).innerHTML;
- const $popover = $('.js-popover-link', deprecationMesssageContainer);
- const hideOnScroll = togglePopover.bind($popover, false);
-
- $popover
- .popover({
- content: deprecationMessage,
- html: true,
- placement: 'bottom',
- })
- .on('mouseenter', mouseenter)
- .on('mouseleave', debouncedMouseleave())
- .on('show.bs.popover', () => {
- window.addEventListener('scroll', hideOnScroll, { once: true });
- });
- }
}
diff --git a/app/assets/javascripts/milestone_select.js b/app/assets/javascripts/milestone_select.js
index 4cbe0a53307..f4b60fc0961 100644
--- a/app/assets/javascripts/milestone_select.js
+++ b/app/assets/javascripts/milestone_select.js
@@ -119,7 +119,7 @@ export default class MilestoneSelect {
title: __('Any milestone'),
});
}
- if (showNo) {
+ if (showNo && term.trim() === '') {
extraOptions.push({
id: -1,
name: __('No milestone'),
diff --git a/app/assets/javascripts/monitoring/stores/actions.js b/app/assets/javascripts/monitoring/stores/actions.js
index 8522ac6a57d..a0b4fd0b608 100644
--- a/app/assets/javascripts/monitoring/stores/actions.js
+++ b/app/assets/javascripts/monitoring/stores/actions.js
@@ -1,7 +1,7 @@
+import * as Sentry from '@sentry/browser';
import { deprecatedCreateFlash as createFlash } from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { convertToFixedRange } from '~/lib/utils/datetime_range';
-import * as Sentry from '~/sentry/wrapper';
import { convertObjectPropsToCamelCase } from '../../lib/utils/common_utils';
import { s__, sprintf } from '../../locale';
import { ENVIRONMENT_AVAILABLE_STATE, OVERVIEW_DASHBOARD_PATH, VARIABLE_TYPES } from '../constants';
diff --git a/app/assets/javascripts/monitoring/stores/embed_group/index.js b/app/assets/javascripts/monitoring/stores/embed_group/index.js
index 773bca9f87e..66c65adc413 100644
--- a/app/assets/javascripts/monitoring/stores/embed_group/index.js
+++ b/app/assets/javascripts/monitoring/stores/embed_group/index.js
@@ -20,5 +20,3 @@ export const createStore = () =>
},
},
});
-
-export default createStore();
diff --git a/app/assets/javascripts/notes/components/comment_form.vue b/app/assets/javascripts/notes/components/comment_form.vue
index 50db3b86025..08d7c745791 100644
--- a/app/assets/javascripts/notes/components/comment_form.vue
+++ b/app/assets/javascripts/notes/components/comment_form.vue
@@ -1,39 +1,61 @@
<script>
-import { GlButton, GlIcon, GlFormCheckbox, GlTooltipDirective } from '@gitlab/ui';
+import {
+ GlAlert,
+ GlButton,
+ GlIcon,
+ GlFormCheckbox,
+ GlTooltipDirective,
+ GlDropdown,
+ GlDropdownItem,
+ GlDropdownDivider,
+} from '@gitlab/ui';
import Autosize from 'autosize';
import $ from 'jquery';
import { mapActions, mapGetters, mapState } from 'vuex';
import Autosave from '~/autosave';
import { refreshUserMergeRequestCounts } from '~/commons/nav/user_merge_requests';
import { deprecatedCreateFlash as Flash } from '~/flash';
+import httpStatusCodes from '~/lib/utils/http_status';
import {
capitalizeFirstCharacter,
convertToCamelCase,
splitCamelCase,
slugifyWithUnderscore,
} from '~/lib/utils/text_utility';
-import { __, sprintf } from '~/locale';
+import { sprintf } from '~/locale';
import markdownField from '~/vue_shared/components/markdown/field.vue';
import TimelineEntryItem from '~/vue_shared/components/notes/timeline_entry_item.vue';
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
+
import * as constants from '../constants';
import eventHub from '../event_hub';
+import { COMMENT_FORM } from '../i18n';
+
import issuableStateMixin from '../mixins/issuable_state';
import CommentFieldLayout from './comment_field_layout.vue';
import discussionLockedWidget from './discussion_locked_widget.vue';
import noteSignedOutWidget from './note_signed_out_widget.vue';
+const { UNPROCESSABLE_ENTITY } = httpStatusCodes;
+
export default {
name: 'CommentForm',
+ i18n: COMMENT_FORM,
+ noteTypeComment: constants.COMMENT,
+ noteTypeDiscussion: constants.DISCUSSION,
components: {
noteSignedOutWidget,
discussionLockedWidget,
markdownField,
+ GlAlert,
GlButton,
TimelineEntryItem,
GlIcon,
CommentFieldLayout,
GlFormCheckbox,
+ GlDropdown,
+ GlDropdownItem,
+ GlDropdownDivider,
},
directives: {
GlTooltip: GlTooltipDirective,
@@ -49,6 +71,7 @@ export default {
return {
note: '',
noteType: constants.COMMENT,
+ errors: [],
noteIsConfidential: false,
isSubmitting: false,
};
@@ -63,6 +86,12 @@ export default {
'openState',
]),
...mapState(['isToggleStateButtonLoading']),
+ isNoteTypeComment() {
+ return this.noteType === constants.COMMENT;
+ },
+ isNoteTypeDiscussion() {
+ return this.noteType === constants.DISCUSSION;
+ },
noteableDisplayName() {
return splitCamelCase(this.noteableType).toLowerCase();
},
@@ -70,12 +99,19 @@ export default {
return this.getUserData.id;
},
commentButtonTitle() {
- return this.noteType === constants.COMMENT ? __('Comment') : __('Start thread');
+ return this.noteType === constants.COMMENT
+ ? this.$options.i18n.comment
+ : this.$options.i18n.startThread;
},
startDiscussionDescription() {
return this.getNoteableData.noteableType === constants.MERGE_REQUEST_NOTEABLE_TYPE
- ? __('Discuss a specific suggestion or question that needs to be resolved.')
- : __('Discuss a specific suggestion or question.');
+ ? this.$options.i18n.discussionThatNeedsResolution
+ : this.$options.i18n.discussion;
+ },
+ commentDescription() {
+ return sprintf(this.$options.i18n.submitButton.commentHelp, {
+ noteableDisplayName: this.noteableDisplayName,
+ });
},
isOpen() {
return this.openState === constants.OPENED || this.openState === constants.REOPENED;
@@ -90,21 +126,18 @@ export default {
const openOrClose = this.isOpen ? 'close' : 'reopen';
if (this.note.length) {
- return sprintf(__('%{actionText} & %{openOrClose} %{noteable}'), {
+ return sprintf(this.$options.i18n.actionButtonWithNote, {
actionText: this.commentButtonTitle,
openOrClose,
noteable: this.noteableDisplayName,
});
}
- return sprintf(__('%{openOrClose} %{noteable}'), {
+ return sprintf(this.$options.i18n.actionButton, {
openOrClose: capitalizeFirstCharacter(openOrClose),
noteable: this.noteableDisplayName,
});
},
- buttonVariant() {
- return this.isOpen ? 'warning' : 'default';
- },
actionButtonClassNames() {
return {
'btn-reopen': !this.isOpen,
@@ -140,8 +173,8 @@ export default {
},
issuableTypeTitle() {
return this.noteableType === constants.MERGE_REQUEST_NOTEABLE_TYPE
- ? __('merge request')
- : __('issue');
+ ? this.$options.i18n.mergeRequest
+ : this.$options.i18n.issue;
},
isIssue() {
return this.noteableDisplayName === constants.ISSUE_NOTEABLE_TYPE;
@@ -149,9 +182,6 @@ export default {
trackingLabel() {
return slugifyWithUnderscore(`${this.commentButtonTitle} button`);
},
- hasCloseAndCommentButton() {
- return !this.glFeatures.removeCommentCloseReopen;
- },
confidentialNotesEnabled() {
return Boolean(this.glFeatures.confidentialNotes);
},
@@ -177,11 +207,19 @@ export default {
'reopenIssuable',
'toggleIssueLocalState',
]),
+ handleSaveError({ data, status }) {
+ if (status === UNPROCESSABLE_ENTITY && data.errors?.commands_only?.length) {
+ this.errors = data.errors.commands_only;
+ } else {
+ this.errors = [this.$options.i18n.GENERIC_UNSUBMITTABLE_NETWORK];
+ }
+ },
handleSave(withIssueAction) {
+ this.errors = [];
+
if (this.note.length) {
const noteData = {
endpoint: this.endpoint,
- flashContainer: this.$el,
data: {
note: {
noteable_type: this.noteableType,
@@ -212,12 +250,10 @@ export default {
this.toggleIssueState();
}
})
- .catch(() => {
+ .catch(({ response }) => {
+ this.handleSaveError(response);
+
this.discard(false);
- const msg = __(
- 'Your comment could not be submitted! Please check your network connection and try again.',
- );
- Flash(msg, 'alert', this.$el);
this.note = noteData.data.note.note; // Restore textarea content.
this.removePlaceholderNotes();
})
@@ -260,6 +296,12 @@ export default {
setNoteType(type) {
this.noteType = type;
},
+ setNoteTypeToComment() {
+ this.setNoteType(constants.COMMENT);
+ },
+ setNoteTypeToDiscussion() {
+ this.setNoteType(constants.DISCUSSION);
+ },
editCurrentUserLastNote() {
if (this.note === '') {
const lastNote = this.getCurrentUserLastNote;
@@ -276,7 +318,7 @@ export default {
const noteableType = capitalizeFirstCharacter(convertToCamelCase(this.noteableType));
this.autosave = new Autosave($(this.$refs.textarea), [
- __('Note'),
+ this.$options.i18n.note,
noteableType,
this.getNoteableData.id,
]);
@@ -290,6 +332,9 @@ export default {
hasEmailParticipants() {
return this.getNoteableData.issue_email_participants?.length;
},
+ dismissError(index) {
+ this.errors.splice(index, 1);
+ },
},
};
</script>
@@ -300,7 +345,15 @@ export default {
<discussion-locked-widget v-else-if="!canCreateNote" :issuable-type="issuableTypeTitle" />
<ul v-else-if="canCreateNote" class="notes notes-form timeline">
<timeline-entry-item class="note-form">
- <div class="flash-container error-alert timeline-content"></div>
+ <gl-alert
+ v-for="(error, index) in errors"
+ :key="index"
+ variant="danger"
+ class="gl-mb-2"
+ @dismiss="() => dismissError(index)"
+ >
+ {{ error }}
+ </gl-alert>
<div class="timeline-content timeline-content-form">
<form ref="commentForm" class="new-note common-note-form gfm-form js-main-target-form">
<comment-field-layout
@@ -329,8 +382,8 @@ export default {
data-qa-selector="comment_field"
data-testid="comment-field"
:data-supports-quick-actions="!glFeatures.tributeAutocomplete"
- :aria-label="__('Description')"
- :placeholder="__('Write a comment or drag your files here…')"
+ :aria-label="$options.i18n.comment"
+ :placeholder="$options.i18n.bodyPlaceholder"
@keydown.up="editCurrentUserLastNote()"
@keydown.meta.enter="handleSave()"
@keydown.ctrl.enter="handleSave()"
@@ -345,87 +398,52 @@ export default {
class="gl-mb-6"
data-testid="confidential-note-checkbox"
>
- {{ s__('Notes|Make this comment confidential') }}
+ {{ $options.i18n.confidential }}
<gl-icon
v-gl-tooltip:tooltipcontainer.bottom
name="question"
:size="16"
- :title="s__('Notes|Confidential comments are only visible to project members')"
+ :title="$options.i18n.confidentialVisibility"
class="gl-text-gray-500"
/>
</gl-form-checkbox>
- <div
- class="btn-group gl-mr-3 comment-type-dropdown js-comment-type-dropdown droplab-dropdown"
+ <gl-dropdown
+ split
+ :text="commentButtonTitle"
+ class="gl-mr-3 js-comment-button js-comment-submit-button comment-type-dropdown"
+ category="primary"
+ variant="success"
+ :disabled="disableSubmitButton"
+ data-testid="comment-button"
+ data-qa-selector="comment_button"
+ :data-track-label="trackingLabel"
+ data-track-event="click_button"
+ @click="handleSave()"
>
- <gl-button
- :disabled="disableSubmitButton"
- class="js-comment-button js-comment-submit-button"
- data-qa-selector="comment_button"
- data-testid="comment-button"
- type="submit"
- category="primary"
- variant="success"
- :data-track-label="trackingLabel"
- data-track-event="click_button"
- @click.prevent="handleSave()"
- >{{ commentButtonTitle }}</gl-button
+ <gl-dropdown-item
+ is-check-item
+ :is-checked="isNoteTypeComment"
+ :selected="isNoteTypeComment"
+ @click="setNoteTypeToComment"
>
- <gl-button
- :disabled="disableSubmitButton"
- name="button"
- category="primary"
- variant="success"
- class="note-type-toggle js-note-new-discussion dropdown-toggle"
- data-qa-selector="note_dropdown"
- data-display="static"
- data-toggle="dropdown"
- icon="chevron-down"
- :aria-label="__('Open comment type dropdown')"
- />
-
- <ul class="note-type-dropdown dropdown-open-top dropdown-menu">
- <li :class="{ 'droplab-item-selected': noteType === 'comment' }">
- <button
- type="button"
- class="btn btn-transparent"
- @click.prevent="setNoteType('comment')"
- >
- <gl-icon name="check" class="icon gl-flex-shrink-0" />
- <div class="description">
- <strong>{{ __('Comment') }}</strong>
- <p>
- {{
- sprintf(__('Add a general comment to this %{noteableDisplayName}.'), {
- noteableDisplayName,
- })
- }}
- </p>
- </div>
- </button>
- </li>
- <li class="divider droplab-item-ignore"></li>
- <li :class="{ 'droplab-item-selected': noteType === 'discussion' }">
- <button
- type="button"
- class="btn btn-transparent"
- data-qa-selector="discussion_menu_item"
- @click.prevent="setNoteType('discussion')"
- >
- <gl-icon name="check" class="icon gl-flex-shrink-0" />
- <div class="description">
- <strong>{{ __('Start thread') }}</strong>
- <p>{{ startDiscussionDescription }}</p>
- </div>
- </button>
- </li>
- </ul>
- </div>
-
+ <strong>{{ $options.i18n.submitButton.comment }}</strong>
+ <p class="gl-m-0">{{ commentDescription }}</p>
+ </gl-dropdown-item>
+ <gl-dropdown-divider />
+ <gl-dropdown-item
+ is-check-item
+ :is-checked="isNoteTypeDiscussion"
+ :selected="isNoteTypeDiscussion"
+ data-qa-selector="discussion_menu_item"
+ @click="setNoteTypeToDiscussion"
+ >
+ <strong>{{ $options.i18n.submitButton.startThread }}</strong>
+ <p class="gl-m-0">{{ startDiscussionDescription }}</p>
+ </gl-dropdown-item>
+ </gl-dropdown>
<gl-button
- v-if="hasCloseAndCommentButton && canToggleIssueState"
+ v-if="canToggleIssueState"
:loading="isToggleStateButtonLoading"
- category="secondary"
- :variant="buttonVariant"
:class="[actionButtonClassNames, 'btn-comment btn-comment-and-close']"
:disabled="isSubmitting"
data-testid="close-reopen-button"
diff --git a/app/assets/javascripts/notes/components/discussion_actions.vue b/app/assets/javascripts/notes/components/discussion_actions.vue
index 27408bc3354..6f0745d4fb0 100644
--- a/app/assets/javascripts/notes/components/discussion_actions.vue
+++ b/app/assets/javascripts/notes/components/discussion_actions.vue
@@ -50,8 +50,8 @@ export default {
<div class="discussion-with-resolve-btn clearfix">
<reply-placeholder
data-qa-selector="discussion_reply_tab"
- :button-text="s__('MergeRequests|Reply...')"
- @onClick="$emit('showReplyForm')"
+ :placeholder-text="__('Reply…')"
+ @focus="$emit('showReplyForm')"
/>
<div v-if="userCanResolveDiscussion" class="btn-group discussion-actions" role="group">
diff --git a/app/assets/javascripts/notes/components/discussion_notes_replies_wrapper.vue b/app/assets/javascripts/notes/components/discussion_notes_replies_wrapper.vue
index dfeda4aae7c..663163a7552 100644
--- a/app/assets/javascripts/notes/components/discussion_notes_replies_wrapper.vue
+++ b/app/assets/javascripts/notes/components/discussion_notes_replies_wrapper.vue
@@ -20,7 +20,7 @@ export default {
'li',
{
class:
- 'discussion-collapsible gl-border-solid gl-border-gray-100 gl-border-1 gl-rounded-base gl-overflow-hidden clearfix',
+ 'discussion-collapsible gl-border-solid gl-border-gray-100 gl-border-1 gl-rounded-base clearfix',
},
[h('ul', { class: 'notes' }, children)],
);
diff --git a/app/assets/javascripts/notes/components/discussion_reply_placeholder.vue b/app/assets/javascripts/notes/components/discussion_reply_placeholder.vue
index 0204169214b..1165a869d2b 100644
--- a/app/assets/javascripts/notes/components/discussion_reply_placeholder.vue
+++ b/app/assets/javascripts/notes/components/discussion_reply_placeholder.vue
@@ -1,23 +1,30 @@
<script>
+import { __ } from '~/locale';
+
export default {
name: 'ReplyPlaceholder',
props: {
- buttonText: {
+ placeholderText: {
+ type: String,
+ required: false,
+ default: __('Reply…'),
+ },
+ labelText: {
type: String,
- required: true,
+ required: false,
+ default: __('Reply to comment'),
},
},
};
</script>
<template>
- <button
- ref="button"
- type="button"
- class="js-vue-discussion-reply btn btn-text-field"
- :title="s__('MergeRequests|Add a reply')"
- @click="$emit('onClick')"
- >
- {{ buttonText }}
- </button>
+ <textarea
+ ref="textarea"
+ rows="1"
+ class="reply-placeholder-text-field js-vue-discussion-reply"
+ :placeholder="placeholderText"
+ :aria-label="labelText"
+ @focus="$emit('focus')"
+ ></textarea>
</template>
diff --git a/app/assets/javascripts/notes/components/note_actions.vue b/app/assets/javascripts/notes/components/note_actions.vue
index 907a4316a93..ed6701b34e8 100644
--- a/app/assets/javascripts/notes/components/note_actions.vue
+++ b/app/assets/javascripts/notes/components/note_actions.vue
@@ -1,12 +1,14 @@
<script>
import { GlTooltipDirective, GlIcon, GlButton, GlDropdownItem } from '@gitlab/ui';
-import { mapGetters } from 'vuex';
+import { mapActions, mapGetters } from 'vuex';
import Api from '~/api';
import resolvedStatusMixin from '~/batch_comments/mixins/resolved_status';
import { deprecatedCreateFlash as flash } from '~/flash';
import { BV_HIDE_TOOLTIP } from '~/lib/utils/constants';
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 ReplyButton from './note_actions/reply_button.vue';
@@ -17,11 +19,13 @@ export default {
ReplyButton,
GlButton,
GlDropdownItem,
+ UserAccessRoleBadge,
+ EmojiPicker: () => import('~/emoji/components/picker.vue'),
},
directives: {
GlTooltip: GlTooltipDirective,
},
- mixins: [resolvedStatusMixin],
+ mixins: [resolvedStatusMixin, glFeatureFlagsMixin()],
props: {
author: {
type: Object,
@@ -115,6 +119,10 @@ export default {
type: Boolean,
required: true,
},
+ awardPath: {
+ type: String,
+ required: true,
+ },
},
computed: {
...mapGetters(['getUserDataByProp', 'getNoteableData']),
@@ -183,6 +191,7 @@ export default {
},
},
methods: {
+ ...mapActions(['toggleAwardRequest']),
onEdit() {
this.$emit('handleEdit');
},
@@ -220,30 +229,43 @@ export default {
.catch(() => flash(__('Something went wrong while updating assignees')));
}
},
+ setAwardEmoji(awardName) {
+ this.toggleAwardRequest({
+ endpoint: this.awardPath,
+ noteId: this.noteId,
+ awardName,
+ });
+ },
},
};
</script>
<template>
<div class="note-actions">
- <span
+ <user-access-role-badge
v-if="isAuthor"
- class="note-role user-access-role has-tooltip d-none d-md-inline-block"
+ v-gl-tooltip
+ class="gl-mx-3 d-none d-md-inline-block"
:title="displayAuthorBadgeText"
- >{{ __('Author') }}</span
>
- <span
+ {{ __('Author') }}
+ </user-access-role-badge>
+ <user-access-role-badge
v-if="accessLevel"
- class="note-role user-access-role has-tooltip"
+ v-gl-tooltip
+ class="gl-mx-3"
:title="displayMemberBadgeText"
- >{{ accessLevel }}</span
>
- <span
+ {{ accessLevel }}
+ </user-access-role-badge>
+ <user-access-role-badge
v-else-if="isContributor"
- class="note-role user-access-role has-tooltip"
+ v-gl-tooltip
+ class="gl-mx-3"
:title="displayContributorBadgeText"
- >{{ __('Contributor') }}</span
>
+ {{ __('Contributor') }}
+ </user-access-role-badge>
<gl-button
v-if="canResolve"
ref="resolveButton"
@@ -259,19 +281,41 @@ export default {
class="line-resolve-btn note-action-button"
@click="onResolve"
/>
- <a
- v-if="canAwardEmoji"
- v-gl-tooltip
- :class="{ 'js-user-authored': isAuthoredByCurrentUser }"
- class="note-action-button note-emoji-button js-add-award js-note-emoji gl-text-gray-600 gl-m-2"
- href="#"
- title="Add reaction"
- data-position="right"
- >
- <gl-icon class="link-highlight award-control-icon-neutral" name="slight-smile" />
- <gl-icon class="link-highlight award-control-icon-positive" name="smiley" />
- <gl-icon class="link-highlight award-control-icon-super-positive" name="smile" />
- </a>
+ <template v-if="canAwardEmoji">
+ <emoji-picker
+ v-if="glFeatures.improvedEmojiPicker"
+ toggle-class="note-action-button note-emoji-button gl-text-gray-600 gl-m-2 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"
+ size="small"
+ title="Add reaction"
+ data-position="right"
+ :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>
+ </template>
<reply-button
v-if="showReply"
ref="replyButton"
diff --git a/app/assets/javascripts/notes/components/note_form.vue b/app/assets/javascripts/notes/components/note_form.vue
index 653bc450d0b..d74ade15de1 100644
--- a/app/assets/javascripts/notes/components/note_form.vue
+++ b/app/assets/javascripts/notes/components/note_form.vue
@@ -201,7 +201,7 @@ export default {
changedCommentText() {
return sprintf(
__(
- 'This comment has changed since you started editing, please review the %{startTag}updated comment%{endTag} to ensure information is not lost.',
+ 'This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost.',
),
{
startTag: `<a href="${this.noteHash}" target="_blank" rel="noopener noreferrer">`,
@@ -345,7 +345,7 @@ export default {
class="note-textarea js-gfm-input js-note-text js-autosize markdown-area js-vue-issue-note-form"
data-qa-selector="reply_field"
dir="auto"
- :aria-label="__('Description')"
+ :aria-label="__('Reply to comment')"
:placeholder="__('Write a comment or drag your files here…')"
@keydown.meta.enter="handleKeySubmit()"
@keydown.ctrl.enter="handleKeySubmit()"
diff --git a/app/assets/javascripts/notes/components/noteable_note.vue b/app/assets/javascripts/notes/components/noteable_note.vue
index 4343fac3cfa..185f4a70367 100644
--- a/app/assets/javascripts/notes/components/noteable_note.vue
+++ b/app/assets/javascripts/notes/components/noteable_note.vue
@@ -1,7 +1,7 @@
<script>
import { GlSprintf, GlSafeHtmlDirective as SafeHtml } from '@gitlab/ui';
import $ from 'jquery';
-import { escape } from 'lodash';
+import { escape, isEmpty } from 'lodash';
import { mapGetters, mapActions } from 'vuex';
import { INLINE_DIFF_LINES_KEY } from '~/diffs/constants';
import httpStatusCodes from '~/lib/utils/http_status';
@@ -282,9 +282,13 @@ export default {
note: {
target_type: this.getNoteableData.targetType,
target_id: this.note.noteable_id,
- note: { note: noteText, position: JSON.stringify(position) },
+ note: { note: noteText },
},
};
+
+ // Stringifying an empty object yields `{}` which breaks graphql queries
+ // https://gitlab.com/gitlab-org/gitlab/-/issues/298827
+ if (!isEmpty(position)) data.note.note.position = JSON.stringify(position);
this.isRequesting = true;
this.oldContent = this.note.note_html;
// eslint-disable-next-line vue/no-mutating-props
@@ -416,6 +420,7 @@ export default {
:is-draft="note.isDraft"
:resolve-discussion="note.isDraft && note.resolve_discussion"
:discussion-id="discussionId"
+ :award-path="note.toggle_award_path"
@handleEdit="editHandler"
@handleDelete="deleteHandler"
@handleResolve="resolveHandler"
diff --git a/app/assets/javascripts/notes/components/notes_app.vue b/app/assets/javascripts/notes/components/notes_app.vue
index 2d66e0d24e3..58cfd150659 100644
--- a/app/assets/javascripts/notes/components/notes_app.vue
+++ b/app/assets/javascripts/notes/components/notes_app.vue
@@ -17,6 +17,7 @@ import commentForm from './comment_form.vue';
import discussionFilterNote from './discussion_filter_note.vue';
import noteableDiscussion from './noteable_discussion.vue';
import noteableNote from './noteable_note.vue';
+import SidebarSubscription from './sidebar_subscription.vue';
export default {
name: 'NotesApp',
@@ -30,6 +31,7 @@ export default {
skeletonLoadingContainer,
discussionFilterNote,
OrderedLayout,
+ SidebarSubscription,
},
mixins: [glFeatureFlagsMixin()],
props: {
@@ -261,6 +263,7 @@ export default {
<template>
<div v-show="shouldShow" id="notes">
+ <sidebar-subscription :iid="noteableData.iid" :noteable-data="noteableData" />
<ordered-layout :slot-keys="slotKeys">
<template #form>
<comment-form
diff --git a/app/assets/javascripts/notes/components/sidebar_subscription.vue b/app/assets/javascripts/notes/components/sidebar_subscription.vue
new file mode 100644
index 00000000000..047c04c8482
--- /dev/null
+++ b/app/assets/javascripts/notes/components/sidebar_subscription.vue
@@ -0,0 +1,58 @@
+<script>
+import { mapActions } from 'vuex';
+import { IssuableType } from '~/issue_show/constants';
+import { fetchPolicies } from '~/lib/graphql';
+import { confidentialityQueries } from '~/sidebar/constants';
+import { defaultClient as gqlClient } from '~/sidebar/graphql';
+
+export default {
+ props: {
+ noteableData: {
+ type: Object,
+ required: true,
+ },
+ iid: {
+ type: Number,
+ required: true,
+ },
+ },
+ computed: {
+ fullPath() {
+ if (this.noteableData.web_url) {
+ return this.noteableData.web_url.split('/-/')[0].substring(1).replace('groups/', '');
+ }
+ return null;
+ },
+ issuableType() {
+ return this.noteableData.noteableType.toLowerCase();
+ },
+ },
+ created() {
+ if (this.issuableType !== IssuableType.Issue && this.issuableType !== IssuableType.Epic) {
+ return;
+ }
+
+ gqlClient
+ .watchQuery({
+ query: confidentialityQueries[this.issuableType].query,
+ variables: {
+ iid: String(this.iid),
+ fullPath: this.fullPath,
+ },
+ fetchPolicy: fetchPolicies.CACHE_ONLY,
+ })
+ .subscribe((res) => {
+ const issuable = res.data?.workspace?.issuable;
+ if (issuable) {
+ this.setConfidentiality(issuable.confidential);
+ }
+ });
+ },
+ methods: {
+ ...mapActions(['setConfidentiality']),
+ },
+ render() {
+ return null;
+ },
+};
+</script>
diff --git a/app/assets/javascripts/notes/i18n.js b/app/assets/javascripts/notes/i18n.js
new file mode 100644
index 00000000000..1ffb94d11ad
--- /dev/null
+++ b/app/assets/javascripts/notes/i18n.js
@@ -0,0 +1,26 @@
+import { __, s__ } from '~/locale';
+
+export const COMMENT_FORM = {
+ GENERIC_UNSUBMITTABLE_NETWORK: __(
+ 'Your comment could not be submitted! Please check your network connection and try again.',
+ ),
+ note: __('Note'),
+ comment: __('Comment'),
+ issue: __('issue'),
+ startThread: __('Start thread'),
+ mergeRequest: __('merge request'),
+ bodyPlaceholder: __('Write a comment or drag your files here…'),
+ confidential: s__('Notes|Make this comment confidential'),
+ confidentialVisibility: s__('Notes|Confidential comments are only visible to project members'),
+ discussionThatNeedsResolution: __(
+ 'Discuss a specific suggestion or question that needs to be resolved.',
+ ),
+ discussion: __('Discuss a specific suggestion or question.'),
+ actionButtonWithNote: __('%{actionText} & %{openOrClose} %{noteable}'),
+ actionButton: __('%{openOrClose} %{noteable}'),
+ submitButton: {
+ startThread: __('Start thread'),
+ comment: __('Comment'),
+ commentHelp: __('Add a general comment to this %{noteableDisplayName}.'),
+ },
+};
diff --git a/app/assets/javascripts/notes/stores/actions.js b/app/assets/javascripts/notes/stores/actions.js
index 19403c29cda..1204d68159f 100644
--- a/app/assets/javascripts/notes/stores/actions.js
+++ b/app/assets/javascripts/notes/stores/actions.js
@@ -2,9 +2,10 @@ import $ from 'jquery';
import Visibility from 'visibilityjs';
import Vue from 'vue';
import Api from '~/api';
+import { EVENT_ISSUABLE_VUE_APP_CHANGE } from '~/issuable/constants';
import axios from '~/lib/utils/axios_utils';
import { __, sprintf } from '~/locale';
-import updateIssueConfidentialMutation from '~/sidebar/components/confidential/mutations/update_issue_confidential.mutation.graphql';
+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';
@@ -267,7 +268,7 @@ export const toggleStateButtonLoading = ({ commit }, value) =>
commit(types.TOGGLE_STATE_BUTTON_LOADING, value);
export const emitStateChangedEvent = ({ getters }, data) => {
- const event = new CustomEvent('issuable_vue_app:change', {
+ const event = new CustomEvent(EVENT_ISSUABLE_VUE_APP_CHANGE, {
detail: {
data,
isClosed: getters.openState === constants.CLOSED,
@@ -340,6 +341,15 @@ export const saveNote = ({ commit, dispatch }, noteData) => {
if (hasQuickActions && message) {
eTagPoll.makeRequest();
+ // synchronizing the quick action with the sidebar widget
+ // this is a temporary solution until we have confidentiality real-time updates
+ if (
+ confidentialWidget.setConfidentiality &&
+ message.some((m) => m.includes('confidential'))
+ ) {
+ confidentialWidget.setConfidentiality();
+ }
+
$('.js-gfm-input').trigger('clear-commands-cache.atwho');
Flash(message || __('Commands applied'), 'notice', noteData.flashContainer);
@@ -719,33 +729,3 @@ export const updateAssignees = ({ commit }, assignees) => {
export const updateDiscussionPosition = ({ commit }, updatedPosition) => {
commit(types.UPDATE_DISCUSSION_POSITION, updatedPosition);
};
-
-export const updateConfidentialityOnIssuable = (
- { getters, commit },
- { confidential, fullPath },
-) => {
- const { iid } = getters.getNoteableData;
-
- return utils.gqClient
- .mutate({
- mutation: updateIssueConfidentialMutation,
- variables: {
- input: {
- projectPath: fullPath,
- iid: String(iid),
- confidential,
- },
- },
- })
- .then(({ data }) => {
- const {
- issueSetConfidential: { issue, errors },
- } = data;
-
- if (errors?.length) {
- Flash(errors[0], 'alert');
- } else {
- setConfidentiality({ commit }, issue.confidential);
- }
- });
-};
diff --git a/app/assets/javascripts/notes/stores/utils.js b/app/assets/javascripts/notes/stores/utils.js
index 627e405c75c..592e634e034 100644
--- a/app/assets/javascripts/notes/stores/utils.js
+++ b/app/assets/javascripts/notes/stores/utils.js
@@ -1,4 +1,4 @@
-import { trimFirstCharOfLineContent } from '~/diffs/store/utils';
+import { trimFirstCharOfLineContent } from '~/diffs/store/utils'; // eslint-disable-line import/no-deprecated
import createGqClient, { fetchPolicies } from '~/lib/graphql';
import AjaxCache from '~/lib/utils/ajax_cache';
import { sprintf, __ } from '~/locale';
@@ -34,7 +34,7 @@ export const hasQuickActions = (note) => createQuickActionsRegex().test(note);
export const stripQuickActions = (note) => note.replace(createQuickActionsRegex(), '').trim();
export const prepareDiffLines = (diffLines) =>
- diffLines.map((line) => ({ ...trimFirstCharOfLineContent(line) }));
+ diffLines.map((line) => ({ ...trimFirstCharOfLineContent(line) })); // eslint-disable-line import/no-deprecated
export const gqClient = createGqClient(
{},
diff --git a/app/assets/javascripts/notifications/components/custom_notifications_modal.vue b/app/assets/javascripts/notifications/components/custom_notifications_modal.vue
index 0f628897e17..2b5cff35fc8 100644
--- a/app/assets/javascripts/notifications/components/custom_notifications_modal.vue
+++ b/app/assets/javascripts/notifications/components/custom_notifications_modal.vue
@@ -24,12 +24,21 @@ export default {
default: '',
},
},
+ model: {
+ prop: 'visible',
+ event: 'change',
+ },
props: {
modalId: {
type: String,
required: false,
default: 'custom-notifications-modal',
},
+ visible: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
},
data() {
return {
@@ -95,9 +104,11 @@ export default {
<template>
<gl-modal
ref="modal"
+ :visible="visible"
:modal-id="modalId"
:title="$options.i18n.customNotificationsModal.title"
@show="onOpen"
+ v-on="$listeners"
>
<div class="container-fluid">
<div class="row">
@@ -115,7 +126,11 @@ export default {
<gl-loading-icon v-if="isLoading" size="lg" class="gl-mt-3" />
<template v-else>
<gl-form-group v-for="event in events" :key="event.id">
- <gl-form-checkbox v-model="event.enabled" @change="updateEvent($event, event)">
+ <gl-form-checkbox
+ v-model="event.enabled"
+ :data-testid="`notification-setting-${event.id}`"
+ @change="updateEvent($event, event)"
+ >
<strong>{{ event.name }}</strong
><gl-loading-icon v-if="event.loading" :inline="true" class="gl-ml-2" />
</gl-form-checkbox>
diff --git a/app/assets/javascripts/notifications/components/notifications_dropdown.vue b/app/assets/javascripts/notifications/components/notifications_dropdown.vue
index e4cedfdb810..4963b9386c1 100644
--- a/app/assets/javascripts/notifications/components/notifications_dropdown.vue
+++ b/app/assets/javascripts/notifications/components/notifications_dropdown.vue
@@ -1,12 +1,5 @@
<script>
-import {
- GlButtonGroup,
- GlButton,
- GlDropdown,
- GlDropdownDivider,
- GlTooltipDirective,
- GlModalDirective,
-} from '@gitlab/ui';
+import { GlDropdown, GlDropdownDivider, GlTooltipDirective } from '@gitlab/ui';
import Api from '~/api';
import { sprintf } from '~/locale';
import { CUSTOM_LEVEL, i18n } from '../constants';
@@ -16,8 +9,6 @@ import NotificationsDropdownItem from './notifications_dropdown_item.vue';
export default {
name: 'NotificationsDropdown',
components: {
- GlButtonGroup,
- GlButton,
GlDropdown,
GlDropdownDivider,
NotificationsDropdownItem,
@@ -25,7 +16,6 @@ export default {
},
directives: {
GlTooltip: GlTooltipDirective,
- 'gl-modal': GlModalDirective,
},
inject: {
containerClass: {
@@ -57,6 +47,7 @@ export default {
return {
selectedNotificationLevel: this.initialNotificationLevel,
isLoading: false,
+ notificationsModalVisible: false,
};
},
computed: {
@@ -95,6 +86,11 @@ export default {
},
},
methods: {
+ openNotificationsModal() {
+ if (this.isCustomNotification) {
+ this.notificationsModalVisible = true;
+ }
+ },
selectItem(level) {
if (level !== this.selectedNotificationLevel) {
this.updateNotificationLevel(level);
@@ -106,10 +102,7 @@ export default {
try {
await Api.updateNotificationSettings(this.projectId, this.groupId, { level });
this.selectedNotificationLevel = level;
-
- if (level === CUSTOM_LEVEL) {
- this.$refs.customNotificationsModal.open();
- }
+ this.openNotificationsModal();
} catch (error) {
this.$toast.show(this.$options.i18n.updateNotificationLevelErrorMessage, { type: 'error' });
} finally {
@@ -125,52 +118,16 @@ export default {
<template>
<div :class="containerClass">
- <gl-button-group
- v-if="isCustomNotification"
- v-gl-tooltip="{ title: buttonTooltip }"
- data-testid="notificationButton"
- :size="buttonSize"
- >
- <gl-button
- v-gl-modal="$options.modalId"
- :size="buttonSize"
- :icon="buttonIcon"
- :loading="isLoading"
- :disabled="disabled"
- >
- <template v-if="buttonText">{{ buttonText }}</template>
- </gl-button>
- <gl-dropdown :size="buttonSize" :disabled="disabled">
- <notifications-dropdown-item
- v-for="item in notificationLevels"
- :key="item.level"
- :level="item.level"
- :title="item.title"
- :description="item.description"
- :notification-level="selectedNotificationLevel"
- @item-selected="selectItem"
- />
- <gl-dropdown-divider />
- <notifications-dropdown-item
- :key="$options.customLevel"
- :level="$options.customLevel"
- :title="$options.i18n.notificationTitles.custom"
- :description="$options.i18n.notificationDescriptions.custom"
- :notification-level="selectedNotificationLevel"
- @item-selected="selectItem"
- />
- </gl-dropdown>
- </gl-button-group>
-
<gl-dropdown
- v-else
v-gl-tooltip="{ title: buttonTooltip }"
- data-testid="notificationButton"
- :text="buttonText"
+ data-testid="notification-dropdown"
+ :size="buttonSize"
:icon="buttonIcon"
:loading="isLoading"
- :size="buttonSize"
:disabled="disabled"
+ :split="isCustomNotification"
+ :text="buttonText"
+ @click="openNotificationsModal"
>
<notifications-dropdown-item
v-for="item in notificationLevels"
@@ -191,6 +148,6 @@ export default {
@item-selected="selectItem"
/>
</gl-dropdown>
- <custom-notifications-modal ref="customNotificationsModal" :modal-id="$options.modalId" />
+ <custom-notifications-modal v-model="notificationsModalVisible" :modal-id="$options.modalId" />
</div>
</template>
diff --git a/app/assets/javascripts/notifications/components/notifications_dropdown_item.vue b/app/assets/javascripts/notifications/components/notifications_dropdown_item.vue
index 73bb9c1b36f..2138372d8ad 100644
--- a/app/assets/javascripts/notifications/components/notifications_dropdown_item.vue
+++ b/app/assets/javascripts/notifications/components/notifications_dropdown_item.vue
@@ -33,7 +33,13 @@ export default {
</script>
<template>
- <gl-dropdown-item is-check-item :is-checked="isActive" @click="$emit('item-selected', level)">
+ <gl-dropdown-item
+ is-check-item
+ :is-checked="isActive"
+ :class="{ 'is-active': isActive }"
+ data-testid="notification-item"
+ @click="$emit('item-selected', level)"
+ >
<div class="gl-display-flex gl-flex-direction-column">
<span class="gl-font-weight-bold">{{ title }}</span>
<span class="gl-text-gray-500">{{ description }}</span>
diff --git a/app/assets/javascripts/notifications/constants.js b/app/assets/javascripts/notifications/constants.js
index 07c569a0293..4f875977d78 100644
--- a/app/assets/javascripts/notifications/constants.js
+++ b/app/assets/javascripts/notifications/constants.js
@@ -22,10 +22,10 @@ export const i18n = {
owner_disabled: __('Notifications have been disabled by the project or group owner'),
},
updateNotificationLevelErrorMessage: __(
- 'An error occured while updating the notification settings. Please try again.',
+ 'An error occurred while updating the notification settings. Please try again.',
),
loadNotificationLevelErrorMessage: __(
- 'An error occured while loading the notification settings. Please try again.',
+ 'An error occurred while loading the notification settings. Please try again.',
),
customNotificationsModal: {
title: __('Custom notification events'),
@@ -53,6 +53,7 @@ export const i18n = {
reassign_merge_request: s__('NotificationEvent|Reassign merge request'),
reopen_issue: s__('NotificationEvent|Reopen issue'),
reopen_merge_request: s__('NotificationEvent|Reopen merge request'),
+ merge_when_pipeline_succeeds: s__('NotificationEvent|Merge when pipeline succeeds'),
success_pipeline: s__('NotificationEvent|Successful pipeline'),
},
};
diff --git a/app/assets/javascripts/notifications_dropdown.js b/app/assets/javascripts/notifications_dropdown.js
deleted file mode 100644
index d61defed14d..00000000000
--- a/app/assets/javascripts/notifications_dropdown.js
+++ /dev/null
@@ -1,35 +0,0 @@
-import $ from 'jquery';
-import { Rails } from '~/lib/utils/rails_ujs';
-import { __ } from '~/locale';
-import { deprecatedCreateFlash as Flash } from './flash';
-
-export default function notificationsDropdown() {
- $(document).on('click', '.update-notification', function updateNotificationCallback(e) {
- e.preventDefault();
-
- if ($(this).is('.is-active') && $(this).data('notificationLevel') === 'custom') {
- return;
- }
-
- const notificationLevel = $(this).data('notificationLevel');
- const form = $(this).parents('.notification-form').first();
-
- form.find('.js-notification-loading').toggleClass('spinner');
- if (form.hasClass('no-label')) {
- form.find('.js-notification-loading').toggleClass('hidden');
- form.find('.js-notifications-icon').toggleClass('hidden');
- }
- form.find('#notification_setting_level').val(notificationLevel);
- Rails.fire(form[0], 'submit');
- });
-
- $(document).on('ajax:success', '.notification-form', (e) => {
- const data = e.detail[0];
-
- if (data.saved) {
- $(e.currentTarget).closest('.js-notification-dropdown').replaceWith(data.html);
- } else {
- Flash(__('Failed to save new settings'), 'alert');
- }
- });
-}
diff --git a/app/assets/javascripts/notifications_form.js b/app/assets/javascripts/notifications_form.js
deleted file mode 100644
index 8b90da71bef..00000000000
--- a/app/assets/javascripts/notifications_form.js
+++ /dev/null
@@ -1,48 +0,0 @@
-import $ from 'jquery';
-import { deprecatedCreateFlash as flash } from './flash';
-import axios from './lib/utils/axios_utils';
-import { __ } from './locale';
-
-export default class NotificationsForm {
- constructor() {
- this.toggleCheckbox = this.toggleCheckbox.bind(this);
- this.initEventListeners();
- }
-
- initEventListeners() {
- $(document).on('change', '.js-custom-notification-event', this.toggleCheckbox);
- }
-
- toggleCheckbox(e) {
- const $checkbox = $(e.currentTarget);
- const $parent = $checkbox.closest('.form-check');
-
- this.saveEvent($checkbox, $parent);
- }
-
- // eslint-disable-next-line class-methods-use-this
- showCheckboxLoadingSpinner($parent) {
- $parent.find('.is-loading').removeClass('gl-display-none');
- $parent.find('.is-done').addClass('gl-display-none');
- }
-
- saveEvent($checkbox, $parent) {
- const form = $parent.parents('form').first();
-
- this.showCheckboxLoadingSpinner($parent);
-
- axios[form.attr('method')](form.attr('action'), form.serialize())
- .then(({ data }) => {
- $checkbox.enable();
- if (data.saved) {
- $parent.find('.is-loading').addClass('gl-display-none');
- $parent.find('.is-done').removeClass('gl-display-none');
-
- setTimeout(() => {
- $parent.find('.is-done').addClass('gl-display-none');
- }, 2000);
- }
- })
- .catch(() => flash(__('There was an error saving your notification settings.')));
- }
-}
diff --git a/app/assets/javascripts/packages/details/components/composer_installation.vue b/app/assets/javascripts/packages/details/components/composer_installation.vue
index 9d87ae8f836..bf1e5083e12 100644
--- a/app/assets/javascripts/packages/details/components/composer_installation.vue
+++ b/app/assets/javascripts/packages/details/components/composer_installation.vue
@@ -2,12 +2,14 @@
import { GlLink, GlSprintf } from '@gitlab/ui';
import { mapGetters, mapState } from 'vuex';
import { s__ } from '~/locale';
+import InstallationTitle from '~/packages/details/components/installation_title.vue';
import CodeInstruction from '~/vue_shared/components/registry/code_instruction.vue';
import { TrackingActions, TrackingLabels } from '../constants';
export default {
name: 'ComposerInstallation',
components: {
+ InstallationTitle,
CodeInstruction,
GlLink,
GlSprintf,
@@ -27,12 +29,13 @@ export default {
},
trackingActions: { ...TrackingActions },
TrackingLabels,
+ installOptions: [{ value: 'composer', label: s__('PackageRegistry|Show Composer commands') }],
};
</script>
<template>
<div v-if="groupExists" data-testid="root-node">
- <h3 class="gl-font-lg">{{ __('Installation') }}</h3>
+ <installation-title package-type="composer" :options="$options.installOptions" />
<code-instruction
:label="$options.i18n.registryInclude"
diff --git a/app/assets/javascripts/packages/details/components/conan_installation.vue b/app/assets/javascripts/packages/details/components/conan_installation.vue
index a5df87c9c5b..1d855f6cf3e 100644
--- a/app/assets/javascripts/packages/details/components/conan_installation.vue
+++ b/app/assets/javascripts/packages/details/components/conan_installation.vue
@@ -2,12 +2,14 @@
import { GlLink, GlSprintf } from '@gitlab/ui';
import { mapGetters, mapState } from 'vuex';
import { s__ } from '~/locale';
+import InstallationTitle from '~/packages/details/components/installation_title.vue';
import CodeInstruction from '~/vue_shared/components/registry/code_instruction.vue';
import { TrackingActions, TrackingLabels } from '../constants';
export default {
name: 'ConanInstallation',
components: {
+ InstallationTitle,
CodeInstruction,
GlLink,
GlSprintf,
@@ -23,12 +25,13 @@ export default {
},
trackingActions: { ...TrackingActions },
TrackingLabels,
+ installOptions: [{ value: 'conan', label: s__('PackageRegistry|Show Conan commands') }],
};
</script>
<template>
<div>
- <h3 class="gl-font-lg">{{ __('Installation') }}</h3>
+ <installation-title package-type="conan" :options="$options.installOptions" />
<code-instruction
:label="s__('PackageRegistry|Conan Command')"
diff --git a/app/assets/javascripts/packages/details/components/installation_title.vue b/app/assets/javascripts/packages/details/components/installation_title.vue
new file mode 100644
index 00000000000..43133bf7825
--- /dev/null
+++ b/app/assets/javascripts/packages/details/components/installation_title.vue
@@ -0,0 +1,38 @@
+<script>
+import PersistedDropdownSelection from '~/vue_shared/components/registry/persisted_dropdown_selection.vue';
+
+export default {
+ name: 'InstallationTitle',
+ components: {
+ PersistedDropdownSelection,
+ },
+ props: {
+ packageType: {
+ type: String,
+ required: true,
+ },
+ options: {
+ type: Array,
+ required: true,
+ },
+ },
+ computed: {
+ storageKey() {
+ return `package_${this.packageType}_installation_instructions`;
+ },
+ },
+};
+</script>
+
+<template>
+ <div class="gl-display-flex gl-justify-content-space-between gl-align-items-center">
+ <h3 class="gl-font-lg">{{ __('Installation') }}</h3>
+ <div>
+ <persisted-dropdown-selection
+ :storage-key="storageKey"
+ :options="options"
+ @change="$emit('change', $event)"
+ />
+ </div>
+ </div>
+</template>
diff --git a/app/assets/javascripts/packages/details/components/maven_installation.vue b/app/assets/javascripts/packages/details/components/maven_installation.vue
index c2f6f76967b..b9532cb7e72 100644
--- a/app/assets/javascripts/packages/details/components/maven_installation.vue
+++ b/app/assets/javascripts/packages/details/components/maven_installation.vue
@@ -2,19 +2,36 @@
import { GlLink, GlSprintf } from '@gitlab/ui';
import { mapGetters, mapState } from 'vuex';
import { s__ } from '~/locale';
+import InstallationTitle from '~/packages/details/components/installation_title.vue';
import CodeInstruction from '~/vue_shared/components/registry/code_instruction.vue';
+
import { TrackingActions, TrackingLabels } from '../constants';
export default {
name: 'MavenInstallation',
components: {
+ InstallationTitle,
CodeInstruction,
GlLink,
GlSprintf,
},
+ data() {
+ return {
+ instructionType: 'maven',
+ };
+ },
computed: {
...mapState(['mavenHelpPath']),
- ...mapGetters(['mavenInstallationXml', 'mavenInstallationCommand', 'mavenSetupXml']),
+ ...mapGetters([
+ 'mavenInstallationXml',
+ 'mavenInstallationCommand',
+ 'mavenSetupXml',
+ 'gradleGroovyInstalCommand',
+ 'gradleGroovyAddSourceCommand',
+ ]),
+ showMaven() {
+ return this.instructionType === 'maven';
+ },
},
i18n: {
xmlText: s__(
@@ -29,57 +46,84 @@ export default {
},
trackingActions: { ...TrackingActions },
TrackingLabels,
+ installOptions: [
+ { value: 'maven', label: s__('PackageRegistry|Show Maven commands') },
+ { value: 'groovy', label: s__('PackageRegistry|Show Gradle Groovy DSL commands') },
+ ],
};
</script>
<template>
<div>
- <h3 class="gl-font-lg">{{ __('Installation') }}</h3>
+ <installation-title
+ package-type="maven"
+ :options="$options.installOptions"
+ @change="instructionType = $event"
+ />
- <p>
- <gl-sprintf :message="$options.i18n.xmlText">
- <template #code="{ content }">
- <code>{{ content }}</code>
- </template>
- </gl-sprintf>
- </p>
+ <template v-if="showMaven">
+ <p>
+ <gl-sprintf :message="$options.i18n.xmlText">
+ <template #code="{ content }">
+ <code>{{ content }}</code>
+ </template>
+ </gl-sprintf>
+ </p>
- <code-instruction
- :label="s__('PackageRegistry|Maven XML')"
- :instruction="mavenInstallationXml"
- :copy-text="s__('PackageRegistry|Copy Maven XML')"
- multiline
- :tracking-action="$options.trackingActions.COPY_MAVEN_XML"
- :tracking-label="$options.TrackingLabels.CODE_INSTRUCTION"
- />
+ <code-instruction
+ :instruction="mavenInstallationXml"
+ :copy-text="s__('PackageRegistry|Copy Maven XML')"
+ :tracking-action="$options.trackingActions.COPY_MAVEN_XML"
+ :tracking-label="$options.TrackingLabels.CODE_INSTRUCTION"
+ multiline
+ />
- <code-instruction
- :label="s__('PackageRegistry|Maven Command')"
- :instruction="mavenInstallationCommand"
- :copy-text="s__('PackageRegistry|Copy Maven command')"
- :tracking-action="$options.trackingActions.COPY_MAVEN_COMMAND"
- :tracking-label="$options.TrackingLabels.CODE_INSTRUCTION"
- />
+ <code-instruction
+ :label="s__('PackageRegistry|Maven Command')"
+ :instruction="mavenInstallationCommand"
+ :copy-text="s__('PackageRegistry|Copy Maven command')"
+ :tracking-action="$options.trackingActions.COPY_MAVEN_COMMAND"
+ :tracking-label="$options.TrackingLabels.CODE_INSTRUCTION"
+ />
- <h3 class="gl-font-lg">{{ __('Registry setup') }}</h3>
- <p>
- <gl-sprintf :message="$options.i18n.setupText">
- <template #code="{ content }">
- <code>{{ content }}</code>
+ <h3 class="gl-font-lg">{{ s__('PackageRegistry|Registry setup') }}</h3>
+ <p>
+ <gl-sprintf :message="$options.i18n.setupText">
+ <template #code="{ content }">
+ <code>{{ content }}</code>
+ </template>
+ </gl-sprintf>
+ </p>
+ <code-instruction
+ :instruction="mavenSetupXml"
+ :copy-text="s__('PackageRegistry|Copy Maven registry XML')"
+ :tracking-action="$options.trackingActions.COPY_MAVEN_SETUP"
+ :tracking-label="$options.TrackingLabels.CODE_INSTRUCTION"
+ multiline
+ />
+ <gl-sprintf :message="$options.i18n.helpText">
+ <template #link="{ content }">
+ <gl-link :href="mavenHelpPath" target="_blank">{{ content }}</gl-link>
</template>
</gl-sprintf>
- </p>
- <code-instruction
- :instruction="mavenSetupXml"
- :copy-text="s__('PackageRegistry|Copy Maven registry XML')"
- multiline
- :tracking-action="$options.trackingActions.COPY_MAVEN_SETUP"
- :tracking-label="$options.TrackingLabels.CODE_INSTRUCTION"
- />
- <gl-sprintf :message="$options.i18n.helpText">
- <template #link="{ content }">
- <gl-link :href="mavenHelpPath" target="_blank">{{ content }}</gl-link>
- </template>
- </gl-sprintf>
+ </template>
+ <template v-else>
+ <code-instruction
+ class="gl-mb-5"
+ :label="s__('PackageRegistry|Gradle Groovy DSL install command')"
+ :instruction="gradleGroovyInstalCommand"
+ :copy-text="s__('PackageRegistry|Copy Gradle Groovy DSL install command')"
+ :tracking-action="$options.trackingActions.COPY_GRADLE_INSTALL_COMMAND"
+ :tracking-label="$options.TrackingLabels.CODE_INSTRUCTION"
+ />
+ <code-instruction
+ :label="s__('PackageRegistry|Add Gradle Groovy DSL repository command')"
+ :instruction="gradleGroovyAddSourceCommand"
+ :copy-text="s__('PackageRegistry|Copy add Gradle Groovy DSL repository command')"
+ :tracking-action="$options.trackingActions.COPY_GRADLE_ADD_TO_SOURCE_COMMAND"
+ :tracking-label="$options.TrackingLabels.CODE_INSTRUCTION"
+ multiline
+ />
+ </template>
</div>
</template>
diff --git a/app/assets/javascripts/packages/details/components/npm_installation.vue b/app/assets/javascripts/packages/details/components/npm_installation.vue
index 37ba279d098..18f15e2c63e 100644
--- a/app/assets/javascripts/packages/details/components/npm_installation.vue
+++ b/app/assets/javascripts/packages/details/components/npm_installation.vue
@@ -2,12 +2,14 @@
import { GlLink, GlSprintf } from '@gitlab/ui';
import { mapGetters, mapState } from 'vuex';
import { s__ } from '~/locale';
+import InstallationTitle from '~/packages/details/components/installation_title.vue';
import CodeInstruction from '~/vue_shared/components/registry/code_instruction.vue';
import { NpmManager, TrackingActions, TrackingLabels } from '../constants';
export default {
name: 'NpmInstallation',
components: {
+ InstallationTitle,
CodeInstruction,
GlLink,
GlSprintf,
@@ -35,12 +37,13 @@ export default {
},
trackingActions: { ...TrackingActions },
TrackingLabels,
+ installOptions: [{ value: 'npm', label: s__('PackageRegistry|Show NPM commands') }],
};
</script>
<template>
<div>
- <h3 class="gl-font-lg">{{ __('Installation') }}</h3>
+ <installation-title package-type="npm" :options="$options.installOptions" />
<code-instruction
:label="s__('PackageRegistry|npm command')"
diff --git a/app/assets/javascripts/packages/details/components/nuget_installation.vue b/app/assets/javascripts/packages/details/components/nuget_installation.vue
index 36887703716..d5e64722f24 100644
--- a/app/assets/javascripts/packages/details/components/nuget_installation.vue
+++ b/app/assets/javascripts/packages/details/components/nuget_installation.vue
@@ -2,12 +2,14 @@
import { GlLink, GlSprintf } from '@gitlab/ui';
import { mapGetters, mapState } from 'vuex';
import { s__ } from '~/locale';
+import InstallationTitle from '~/packages/details/components/installation_title.vue';
import CodeInstruction from '~/vue_shared/components/registry/code_instruction.vue';
import { TrackingActions, TrackingLabels } from '../constants';
export default {
name: 'NugetInstallation',
components: {
+ InstallationTitle,
CodeInstruction,
GlLink,
GlSprintf,
@@ -23,12 +25,14 @@ export default {
},
trackingActions: { ...TrackingActions },
TrackingLabels,
+ installOptions: [{ value: 'nuget', label: s__('PackageRegistry|Show Nuget commands') }],
};
</script>
<template>
<div>
- <h3 class="gl-font-lg">{{ __('Installation') }}</h3>
+ <installation-title package-type="nuget" :options="$options.installOptions" />
+
<code-instruction
:label="s__('PackageRegistry|NuGet Command')"
:instruction="nugetInstallationCommand"
diff --git a/app/assets/javascripts/packages/details/components/pypi_installation.vue b/app/assets/javascripts/packages/details/components/pypi_installation.vue
index f87be68be48..fe4709d5feb 100644
--- a/app/assets/javascripts/packages/details/components/pypi_installation.vue
+++ b/app/assets/javascripts/packages/details/components/pypi_installation.vue
@@ -2,12 +2,14 @@
import { GlLink, GlSprintf } from '@gitlab/ui';
import { mapGetters, mapState } from 'vuex';
import { s__ } from '~/locale';
+import InstallationTitle from '~/packages/details/components/installation_title.vue';
import CodeInstruction from '~/vue_shared/components/registry/code_instruction.vue';
import { TrackingActions, TrackingLabels } from '../constants';
export default {
name: 'PyPiInstallation',
components: {
+ InstallationTitle,
CodeInstruction,
GlLink,
GlSprintf,
@@ -26,12 +28,13 @@ export default {
},
trackingActions: { ...TrackingActions },
TrackingLabels,
+ installOptions: [{ value: 'pypi', label: s__('PackageRegistry|Show PyPi commands') }],
};
</script>
<template>
<div>
- <h3 class="gl-font-lg">{{ __('Installation') }}</h3>
+ <installation-title package-type="pypi" :options="$options.installOptions" />
<code-instruction
:label="s__('PackageRegistry|Pip Command')"
diff --git a/app/assets/javascripts/packages/details/constants.js b/app/assets/javascripts/packages/details/constants.js
index 986b0667356..f0300ee29b4 100644
--- a/app/assets/javascripts/packages/details/constants.js
+++ b/app/assets/javascripts/packages/details/constants.js
@@ -35,6 +35,9 @@ export const TrackingActions = {
COPY_COMPOSER_REGISTRY_INCLUDE_COMMAND: 'copy_composer_registry_include_command',
COPY_COMPOSER_PACKAGE_INCLUDE_COMMAND: 'copy_composer_package_include_command',
+
+ COPY_GRADLE_INSTALL_COMMAND: 'copy_gradle_install_command',
+ COPY_GRADLE_ADD_TO_SOURCE_COMMAND: 'copy_gradle_add_to_source_command',
};
export const NpmManager = {
diff --git a/app/assets/javascripts/packages/details/store/getters.js b/app/assets/javascripts/packages/details/store/getters.js
index 14e76ac84bd..fd75d476b86 100644
--- a/app/assets/javascripts/packages/details/store/getters.js
+++ b/app/assets/javascripts/packages/details/store/getters.js
@@ -110,4 +110,20 @@ export const composerPackageInclude = ({ packageEntity }) =>
// eslint-disable-next-line @gitlab/require-i18n-strings
`composer req ${[packageEntity.name]}:${packageEntity.version}`;
+export const gradleGroovyInstalCommand = ({ packageEntity }) => {
+ const {
+ app_group: group = '',
+ app_name: name = '',
+ app_version: version = '',
+ } = packageEntity.maven_metadatum;
+ // eslint-disable-next-line @gitlab/require-i18n-strings
+ return `implementation '${group}:${name}:${version}'`;
+};
+
+export const gradleGroovyAddSourceCommand = ({ mavenPath }) =>
+ // eslint-disable-next-line @gitlab/require-i18n-strings
+ `gitlab {
+ url "${mavenPath}"
+}`;
+
export const groupExists = ({ groupListUrl }) => groupListUrl.length > 0;
diff --git a/app/assets/javascripts/packages/list/constants.js b/app/assets/javascripts/packages/list/constants.js
index d47eb8c3421..25a55200df2 100644
--- a/app/assets/javascripts/packages/list/constants.js
+++ b/app/assets/javascripts/packages/list/constants.js
@@ -71,7 +71,7 @@ export const PACKAGE_TYPES = [
type: PackageType.MAVEN,
},
{
- title: s__('PackageRegistry|NPM'),
+ title: s__('PackageRegistry|npm'),
type: PackageType.NPM,
},
{
diff --git a/app/assets/javascripts/packages/shared/components/package_list_row.vue b/app/assets/javascripts/packages/shared/components/package_list_row.vue
index cdfe042c39f..172b356227a 100644
--- a/app/assets/javascripts/packages/shared/components/package_list_row.vue
+++ b/app/assets/javascripts/packages/shared/components/package_list_row.vue
@@ -123,7 +123,7 @@ export default {
<gl-button
data-testid="action-delete"
icon="remove"
- category="primary"
+ category="secondary"
variant="danger"
:title="s__('PackageRegistry|Remove package')"
:aria-label="s__('PackageRegistry|Remove package')"
diff --git a/app/assets/javascripts/packages/shared/utils.js b/app/assets/javascripts/packages/shared/utils.js
index 677550f77ec..d34372e89b6 100644
--- a/app/assets/javascripts/packages/shared/utils.js
+++ b/app/assets/javascripts/packages/shared/utils.js
@@ -14,7 +14,7 @@ export const getPackageTypeLabel = (packageType) => {
case PackageType.MAVEN:
return s__('PackageType|Maven');
case PackageType.NPM:
- return s__('PackageType|NPM');
+ return s__('PackageType|npm');
case PackageType.NUGET:
return s__('PackageType|NuGet');
case PackageType.PYPI:
diff --git a/app/assets/javascripts/packages_and_registries/settings/group/components/group_settings_app.vue b/app/assets/javascripts/packages_and_registries/settings/group/components/group_settings_app.vue
index 933cbeaedce..4f5c53ed4a3 100644
--- a/app/assets/javascripts/packages_and_registries/settings/group/components/group_settings_app.vue
+++ b/app/assets/javascripts/packages_and_registries/settings/group/components/group_settings_app.vue
@@ -111,7 +111,10 @@ export default {
{{ alertMessage }}
</gl-alert>
- <settings-block :default-expanded="defaultExpanded">
+ <settings-block
+ :default-expanded="defaultExpanded"
+ data-qa-selector="package_registry_settings_content"
+ >
<template #title> {{ $options.i18n.PACKAGE_SETTINGS_HEADER }}</template>
<template #description>
<span data-testid="description">
diff --git a/app/assets/javascripts/packages_and_registries/settings/group/components/maven_settings.vue b/app/assets/javascripts/packages_and_registries/settings/group/components/maven_settings.vue
index aa7c6e9d8d6..d4f51b83e1e 100644
--- a/app/assets/javascripts/packages_and_registries/settings/group/components/maven_settings.vue
+++ b/app/assets/javascripts/packages_and_registries/settings/group/components/maven_settings.vue
@@ -79,11 +79,12 @@ export default {
<form>
<div class="gl-display-flex">
<gl-toggle
+ data-qa-selector="allow_duplicates_toggle"
:value="mavenDuplicatesAllowed"
@change="update($options.modelNames.MAVEN_DUPLICATES_ALLOWED, $event)"
/>
<div class="gl-ml-5">
- <div data-testid="toggle-label">
+ <div data-testid="toggle-label" data-qa-selector="allow_duplicates_label">
<gl-sprintf :message="enabledButtonLabel">
<template #bold="{ content }">
<strong>{{ content }}</strong>
diff --git a/app/assets/javascripts/pages/admin/admin.js b/app/assets/javascripts/pages/admin/admin.js
index e92262852cf..2732fc191be 100644
--- a/app/assets/javascripts/pages/admin/admin.js
+++ b/app/assets/javascripts/pages/admin/admin.js
@@ -12,8 +12,6 @@ function showDenylistType() {
}
export default function adminInit() {
- const modal = $('.change-owner-holder');
-
$('input#user_force_random_password').on('change', function randomPasswordClick() {
const $elems = $('#user_password, #user_password_confirmation');
if ($(this).attr('checked')) {
@@ -28,36 +26,6 @@ export default function adminInit() {
$('.js-toggle-colors-container').toggleClass('hide');
});
- $('.log-tabs a').on('click', function logTabsClick(e) {
- e.preventDefault();
- $(this).tab('show');
- });
-
- $('.log-bottom').on('click', (e) => {
- e.preventDefault();
- const $visibleLog = $('.file-content:visible');
-
- // eslint-disable-next-line no-jquery/no-animate
- $visibleLog.animate(
- {
- scrollTop: $visibleLog.find('ol').height(),
- },
- 'fast',
- );
- });
-
- $('.change-owner-link').on('click', function changeOwnerLinkClick(e) {
- e.preventDefault();
- $(this).hide();
- modal.show();
- });
-
- $('.change-owner-cancel-link').on('click', (e) => {
- e.preventDefault();
- modal.hide();
- $('.change-owner-link').show();
- });
-
$('li.project_member, li.group_member').on('ajax:success', refreshCurrentPage);
$("input[name='denylist_type']").on('click', showDenylistType);
diff --git a/app/assets/javascripts/pages/admin/dev_ops_report/index.js b/app/assets/javascripts/pages/admin/dev_ops_report/index.js
index 220fc049562..cf06ee2c22a 100644
--- a/app/assets/javascripts/pages/admin/dev_ops_report/index.js
+++ b/app/assets/javascripts/pages/admin/dev_ops_report/index.js
@@ -1,5 +1,3 @@
-import initDevopAdoption from 'ee_else_ce/admin/dev_ops_report/devops_adoption';
-import initDevOpsScoreEmptyState from '~/admin/dev_ops_report/devops_score_empty_state';
+import initDevOpsScoreEmptyState from '~/analytics/devops_report/devops_score_empty_state';
initDevOpsScoreEmptyState();
-initDevopAdoption();
diff --git a/app/assets/javascripts/pages/admin/impersonation_tokens/index.js b/app/assets/javascripts/pages/admin/impersonation_tokens/index.js
index ae2209b0292..dc1bb88bf4b 100644
--- a/app/assets/javascripts/pages/admin/impersonation_tokens/index.js
+++ b/app/assets/javascripts/pages/admin/impersonation_tokens/index.js
@@ -1,3 +1,3 @@
-import initExpiresAtField from '~/access_tokens';
+import { initExpiresAtField } from '~/access_tokens';
-document.addEventListener('DOMContentLoaded', initExpiresAtField);
+initExpiresAtField();
diff --git a/app/assets/javascripts/pages/admin/instance_statistics/index.js b/app/assets/javascripts/pages/admin/instance_statistics/index.js
deleted file mode 100644
index d6b0a834ce3..00000000000
--- a/app/assets/javascripts/pages/admin/instance_statistics/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import initInstanceStatisticsApp from '~/analytics/instance_statistics';
-
-document.addEventListener('DOMContentLoaded', () => initInstanceStatisticsApp());
diff --git a/app/assets/javascripts/pages/admin/usage_trends/index.js b/app/assets/javascripts/pages/admin/usage_trends/index.js
new file mode 100644
index 00000000000..23d2bd85979
--- /dev/null
+++ b/app/assets/javascripts/pages/admin/usage_trends/index.js
@@ -0,0 +1,3 @@
+import initUsageTrendsApp from '~/analytics/usage_trends';
+
+initUsageTrendsApp();
diff --git a/app/assets/javascripts/pages/dashboard/issues/index.js b/app/assets/javascripts/pages/dashboard/issues/index.js
index 3ad95fb1318..3e09b1796b1 100644
--- a/app/assets/javascripts/pages/dashboard/issues/index.js
+++ b/app/assets/javascripts/pages/dashboard/issues/index.js
@@ -4,13 +4,11 @@ import { FILTERED_SEARCH } from '~/pages/constants';
import initFilteredSearch from '~/pages/search/init_filtered_search';
import projectSelect from '~/project_select';
-document.addEventListener('DOMContentLoaded', () => {
- initFilteredSearch({
- page: FILTERED_SEARCH.ISSUES,
- filteredSearchTokenKeys: IssuableFilteredSearchTokenKeys,
- useDefaultState: true,
- });
-
- projectSelect();
- initManualOrdering();
+initFilteredSearch({
+ page: FILTERED_SEARCH.ISSUES,
+ filteredSearchTokenKeys: IssuableFilteredSearchTokenKeys,
+ useDefaultState: true,
});
+
+projectSelect();
+initManualOrdering();
diff --git a/app/assets/javascripts/pages/dashboard/milestones/show/index.js b/app/assets/javascripts/pages/dashboard/milestones/show/index.js
index 8b529585898..397149aaa9e 100644
--- a/app/assets/javascripts/pages/dashboard/milestones/show/index.js
+++ b/app/assets/javascripts/pages/dashboard/milestones/show/index.js
@@ -6,6 +6,4 @@ document.addEventListener('DOMContentLoaded', () => {
new Milestone(); // eslint-disable-line no-new
new Sidebar(); // eslint-disable-line no-new
new MountMilestoneSidebar(); // eslint-disable-line no-new
-
- Milestone.initDeprecationMessage();
});
diff --git a/app/assets/javascripts/pages/dashboard/projects/index/index.js b/app/assets/javascripts/pages/dashboard/projects/index/index.js
index b3c95f4ac1f..c34d15b869a 100644
--- a/app/assets/javascripts/pages/dashboard/projects/index/index.js
+++ b/app/assets/javascripts/pages/dashboard/projects/index/index.js
@@ -1,8 +1,5 @@
import ProjectsList from '~/projects_list';
import initCustomizeHomepageBanner from './init_customize_homepage_banner';
-document.addEventListener('DOMContentLoaded', () => {
- new ProjectsList(); // eslint-disable-line no-new
-
- initCustomizeHomepageBanner();
-});
+new ProjectsList(); // eslint-disable-line no-new
+initCustomizeHomepageBanner();
diff --git a/app/assets/javascripts/pages/dashboard/todos/index/index.js b/app/assets/javascripts/pages/dashboard/todos/index/index.js
index 9d2c2f2994f..2fe90c24e77 100644
--- a/app/assets/javascripts/pages/dashboard/todos/index/index.js
+++ b/app/assets/javascripts/pages/dashboard/todos/index/index.js
@@ -1,3 +1,3 @@
import Todos from './todos';
-document.addEventListener('DOMContentLoaded', () => new Todos());
+new Todos(); // eslint-disable-line no-new
diff --git a/app/assets/javascripts/pages/groups/activity/index.js b/app/assets/javascripts/pages/groups/activity/index.js
index 1b887cad496..8b7c36a0976 100644
--- a/app/assets/javascripts/pages/groups/activity/index.js
+++ b/app/assets/javascripts/pages/groups/activity/index.js
@@ -1,3 +1,4 @@
import Activities from '~/activities';
-document.addEventListener('DOMContentLoaded', () => new Activities());
+// eslint-disable-next-line no-new
+new Activities();
diff --git a/app/assets/javascripts/pages/groups/edit/index.js b/app/assets/javascripts/pages/groups/edit/index.js
index 95ee512b71a..176d2406751 100644
--- a/app/assets/javascripts/pages/groups/edit/index.js
+++ b/app/assets/javascripts/pages/groups/edit/index.js
@@ -6,6 +6,7 @@ import TransferDropdown from '~/groups/transfer_dropdown';
import groupsSelect from '~/groups_select';
import mountBadgeSettings from '~/pages/shared/mount_badge_settings';
import projectSelect from '~/project_select';
+import initSearchSettings from '~/search_settings';
import initSettingsPanels from '~/settings_panels';
import setupTransferEdit from '~/transfer_edit';
@@ -24,5 +25,7 @@ document.addEventListener('DOMContentLoaded', () => {
projectSelect();
+ initSearchSettings();
+
return new TransferDropdown();
});
diff --git a/app/assets/javascripts/pages/groups/group_members/index.js b/app/assets/javascripts/pages/groups/group_members/index.js
index 3496f699b06..ab70fa572ba 100644
--- a/app/assets/javascripts/pages/groups/group_members/index.js
+++ b/app/assets/javascripts/pages/groups/group_members/index.js
@@ -1,11 +1,13 @@
import Vue from 'vue';
import { groupMemberRequestFormatter } from '~/groups/members/utils';
import groupsSelect from '~/groups_select';
+import initInviteGroupTrigger from '~/invite_members/init_invite_group_trigger';
+import initInviteMembersForm from '~/invite_members/init_invite_members_form';
import initInviteMembersModal from '~/invite_members/init_invite_members_modal';
import initInviteMembersTrigger from '~/invite_members/init_invite_members_trigger';
import { s__ } from '~/locale';
import memberExpirationDate from '~/member_expiration_date';
-import { initMembersApp } from '~/members/index';
+import { initMembersApp } from '~/members';
import { groupLinkRequestFormatter } from '~/members/utils';
import UsersSelect from '~/users_select';
import RemoveMemberModal from '~/vue_shared/components/remove_member_modal.vue';
@@ -70,5 +72,10 @@ memberExpirationDate('.js-access-expiration-date-groups');
mountRemoveMemberModal();
initInviteMembersModal();
initInviteMembersTrigger();
+initInviteGroupTrigger();
+
+// This is only used when `invite_members_group_modal` feature flag is disabled.
+// This can be removed when `invite_members_group_modal` feature flag is removed.
+initInviteMembersForm();
new UsersSelect(); // eslint-disable-line no-new
diff --git a/app/assets/javascripts/pages/groups/milestones/show/index.js b/app/assets/javascripts/pages/groups/milestones/show/index.js
index 3094fe5cd21..2a2cc5faebe 100644
--- a/app/assets/javascripts/pages/groups/milestones/show/index.js
+++ b/app/assets/javascripts/pages/groups/milestones/show/index.js
@@ -1,9 +1,7 @@
-import Milestone from '~/milestone';
import initDeleteMilestoneModal from '~/pages/milestones/shared/delete_milestone_modal_init';
import initMilestonesShow from '~/pages/milestones/shared/init_milestones_show';
document.addEventListener('DOMContentLoaded', () => {
initMilestonesShow();
initDeleteMilestoneModal();
- Milestone.initDeprecationMessage();
});
diff --git a/app/assets/javascripts/pages/groups/new/index.js b/app/assets/javascripts/pages/groups/new/index.js
index 63515abe698..322ad2c79e7 100644
--- a/app/assets/javascripts/pages/groups/new/index.js
+++ b/app/assets/javascripts/pages/groups/new/index.js
@@ -2,6 +2,7 @@ import $ from 'jquery';
import BindInOut from '~/behaviors/bind_in_out';
import initFilePickers from '~/file_pickers';
import Group from '~/group';
+import LinkedTabs from '~/lib/utils/bootstrap_linked_tabs';
import GroupPathValidator from './group_path_validator';
const parentId = $('#group_parent_id');
@@ -12,3 +13,16 @@ BindInOut.initAll();
initFilePickers();
new Group(); // eslint-disable-line no-new
+
+const CONTAINER_SELECTOR = '.group-edit-container .nav-tabs';
+const DEFAULT_ACTION = '#create-group-pane';
+// eslint-disable-next-line no-new
+new LinkedTabs({
+ defaultAction: DEFAULT_ACTION,
+ parentEl: CONTAINER_SELECTOR,
+ hashedTabs: true,
+});
+
+if (window.location.hash) {
+ $(CONTAINER_SELECTOR).find(`a[href="${window.location.hash}"]`).tab('show');
+}
diff --git a/app/assets/javascripts/pages/groups/settings/ci_cd/show/index.js b/app/assets/javascripts/pages/groups/settings/ci_cd/show/index.js
index 378b8663777..0c3fdcf3e75 100644
--- a/app/assets/javascripts/pages/groups/settings/ci_cd/show/index.js
+++ b/app/assets/javascripts/pages/groups/settings/ci_cd/show/index.js
@@ -4,21 +4,22 @@ import initSharedRunnersForm from '~/group_settings/mount_shared_runners';
import { FILTERED_SEARCH } from '~/pages/constants';
import initFilteredSearch from '~/pages/search/init_filtered_search';
import { initInstallRunner } from '~/pages/shared/mount_runner_instructions';
+import initSearchSettings from '~/search_settings';
import initSettingsPanels from '~/settings_panels';
-document.addEventListener('DOMContentLoaded', () => {
- // Initialize expandable settings panels
- initSettingsPanels();
+// Initialize expandable settings panels
+initSettingsPanels();
- initFilteredSearch({
- page: FILTERED_SEARCH.ADMIN_RUNNERS,
- filteredSearchTokenKeys: GroupRunnersFilteredSearchTokenKeys,
- anchor: FILTERED_SEARCH.GROUP_RUNNERS_ANCHOR,
- useDefaultState: false,
- });
+initFilteredSearch({
+ page: FILTERED_SEARCH.ADMIN_RUNNERS,
+ filteredSearchTokenKeys: GroupRunnersFilteredSearchTokenKeys,
+ anchor: FILTERED_SEARCH.GROUP_RUNNERS_ANCHOR,
+ useDefaultState: false,
+});
- initSharedRunnersForm();
- initVariableList();
+initSharedRunnersForm();
+initVariableList();
- initInstallRunner();
-});
+initInstallRunner();
+
+initSearchSettings();
diff --git a/app/assets/javascripts/pages/groups/settings/integrations/edit/index.js b/app/assets/javascripts/pages/groups/settings/integrations/edit/index.js
index ba4b271f09e..a8698e10c57 100644
--- a/app/assets/javascripts/pages/groups/settings/integrations/edit/index.js
+++ b/app/assets/javascripts/pages/groups/settings/integrations/edit/index.js
@@ -1,13 +1,11 @@
import IntegrationSettingsForm from '~/integrations/integration_settings_form';
import PrometheusMetrics from '~/prometheus_metrics/prometheus_metrics';
-document.addEventListener('DOMContentLoaded', () => {
- const prometheusSettingsWrapper = document.querySelector('.js-prometheus-metrics-monitoring');
- const integrationSettingsForm = new IntegrationSettingsForm('.js-integration-settings-form');
- integrationSettingsForm.init();
+const prometheusSettingsWrapper = document.querySelector('.js-prometheus-metrics-monitoring');
+const integrationSettingsForm = new IntegrationSettingsForm('.js-integration-settings-form');
+integrationSettingsForm.init();
- if (prometheusSettingsWrapper) {
- const prometheusMetrics = new PrometheusMetrics('.js-prometheus-metrics-monitoring');
- prometheusMetrics.loadActiveMetrics();
- }
-});
+if (prometheusSettingsWrapper) {
+ const prometheusMetrics = new PrometheusMetrics('.js-prometheus-metrics-monitoring');
+ prometheusMetrics.loadActiveMetrics();
+}
diff --git a/app/assets/javascripts/pages/groups/settings/packages_and_registries/index.js b/app/assets/javascripts/pages/groups/settings/packages_and_registries/index.js
index 3b922622d2c..d13bf026777 100644
--- a/app/assets/javascripts/pages/groups/settings/packages_and_registries/index.js
+++ b/app/assets/javascripts/pages/groups/settings/packages_and_registries/index.js
@@ -1,3 +1,6 @@
import bundle from '~/packages_and_registries/settings/group/bundle';
+import initSearchSettings from '~/search_settings';
bundle();
+
+document.addEventListener('DOMContentLoaded', initSearchSettings);
diff --git a/app/assets/javascripts/pages/groups/settings/repository/show/index.js b/app/assets/javascripts/pages/groups/settings/repository/show/index.js
index a1bcf6dbf57..2c9867653de 100644
--- a/app/assets/javascripts/pages/groups/settings/repository/show/index.js
+++ b/app/assets/javascripts/pages/groups/settings/repository/show/index.js
@@ -1,9 +1,10 @@
import DueDateSelectors from '~/due_date_select';
+import initSearchSettings from '~/search_settings';
import initSettingsPanels from '~/settings_panels';
-document.addEventListener('DOMContentLoaded', () => {
- // Initialize expandable settings panels
- initSettingsPanels();
+// Initialize expandable settings panels
+initSettingsPanels();
- new DueDateSelectors(); // eslint-disable-line no-new
-});
+new DueDateSelectors(); // eslint-disable-line no-new
+
+initSearchSettings();
diff --git a/app/assets/javascripts/pages/groups/shared/group_details.js b/app/assets/javascripts/pages/groups/shared/group_details.js
index 8c272e561db..9e75985c130 100644
--- a/app/assets/javascripts/pages/groups/shared/group_details.js
+++ b/app/assets/javascripts/pages/groups/shared/group_details.js
@@ -3,12 +3,8 @@
import ShortcutsNavigation from '~/behaviors/shortcuts/shortcuts_navigation';
import { ACTIVE_TAB_SHARED, ACTIVE_TAB_ARCHIVED } from '~/groups/constants';
import initInviteMembersBanner from '~/groups/init_invite_members_banner';
-import initInviteMembersModal from '~/invite_members/init_invite_members_modal';
-import initInviteMembersTrigger from '~/invite_members/init_invite_members_trigger';
import { getPagePath, getDashPath } from '~/lib/utils/common_utils';
import initNotificationsDropdown from '~/notifications';
-import notificationsDropdown from '~/notifications_dropdown';
-import NotificationsForm from '~/notifications_form';
import ProjectsList from '~/projects_list';
import GroupTabs from './group_tabs';
@@ -22,17 +18,10 @@ export default function initGroupDetails(actionName = 'show') {
new GroupTabs({ parentEl: '.groups-listing', action });
new ShortcutsNavigation();
- new NotificationsForm();
- if (gon.features?.vueNotificationDropdown) {
- initNotificationsDropdown();
- } else {
- notificationsDropdown();
- }
+ initNotificationsDropdown();
new ProjectsList();
initInviteMembersBanner();
- initInviteMembersModal();
- initInviteMembersTrigger();
}
diff --git a/app/assets/javascripts/pages/groups/show/index.js b/app/assets/javascripts/pages/groups/show/index.js
index 82ee5ead83d..e4a84dd5eec 100644
--- a/app/assets/javascripts/pages/groups/show/index.js
+++ b/app/assets/javascripts/pages/groups/show/index.js
@@ -1,7 +1,5 @@
import leaveByUrl from '~/namespaces/leave_by_url';
import initGroupDetails from '../shared/group_details';
-document.addEventListener('DOMContentLoaded', () => {
- leaveByUrl('group');
- initGroupDetails();
-});
+leaveByUrl('group');
+initGroupDetails();
diff --git a/app/assets/javascripts/pages/profiles/index.js b/app/assets/javascripts/pages/profiles/index.js
index 535fe5fa4eb..80bc32dd43f 100644
--- a/app/assets/javascripts/pages/profiles/index.js
+++ b/app/assets/javascripts/pages/profiles/index.js
@@ -3,21 +3,19 @@ import '~/profile/gl_crop';
import Profile from '~/profile/profile';
import initSearchSettings from '~/search_settings';
-document.addEventListener('DOMContentLoaded', () => {
- // eslint-disable-next-line func-names
- $(document).on('input.ssh_key', '#key_key', function () {
- const $title = $('#key_title');
- const comment = $(this)
- .val()
- .match(/^\S+ \S+ (.+)\n?$/);
+// eslint-disable-next-line func-names
+$(document).on('input.ssh_key', '#key_key', function () {
+ const $title = $('#key_title');
+ const comment = $(this)
+ .val()
+ .match(/^\S+ \S+ (.+)\n?$/);
- // Extract the SSH Key title from its comment
- if (comment && comment.length > 1) {
- $title.val(comment[1]).change();
- }
- });
+ // Extract the SSH Key title from its comment
+ if (comment && comment.length > 1) {
+ $title.val(comment[1]).change();
+ }
+});
- new Profile(); // eslint-disable-line no-new
+new Profile(); // eslint-disable-line no-new
- initSearchSettings();
-});
+initSearchSettings();
diff --git a/app/assets/javascripts/pages/profiles/index/index.js b/app/assets/javascripts/pages/profiles/index/index.js
deleted file mode 100644
index 586b3be8661..00000000000
--- a/app/assets/javascripts/pages/profiles/index/index.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import notificationsDropdown from '../../../notifications_dropdown';
-import NotificationsForm from '../../../notifications_form';
-
-document.addEventListener('DOMContentLoaded', () => {
- new NotificationsForm(); // eslint-disable-line no-new
- notificationsDropdown();
-});
diff --git a/app/assets/javascripts/pages/profiles/notifications/show/index.js b/app/assets/javascripts/pages/profiles/notifications/show/index.js
index 639f5deb72c..51ba6c7a01e 100644
--- a/app/assets/javascripts/pages/profiles/notifications/show/index.js
+++ b/app/assets/javascripts/pages/profiles/notifications/show/index.js
@@ -1,9 +1,5 @@
import initNotificationsDropdown from '~/notifications';
-import notificationsDropdown from '../../../../notifications_dropdown';
-import NotificationsForm from '../../../../notifications_form';
document.addEventListener('DOMContentLoaded', () => {
- new NotificationsForm(); // eslint-disable-line no-new
- notificationsDropdown();
initNotificationsDropdown();
});
diff --git a/app/assets/javascripts/pages/profiles/personal_access_tokens/index.js b/app/assets/javascripts/pages/profiles/personal_access_tokens/index.js
index ae2209b0292..fdbfc35456f 100644
--- a/app/assets/javascripts/pages/profiles/personal_access_tokens/index.js
+++ b/app/assets/javascripts/pages/profiles/personal_access_tokens/index.js
@@ -1,3 +1,4 @@
-import initExpiresAtField from '~/access_tokens';
+import { initExpiresAtField, initProjectsField } from '~/access_tokens';
-document.addEventListener('DOMContentLoaded', initExpiresAtField);
+initExpiresAtField();
+initProjectsField();
diff --git a/app/assets/javascripts/pages/projects/blob/edit/index.js b/app/assets/javascripts/pages/projects/blob/edit/index.js
index 189053f3ed7..ed416610173 100644
--- a/app/assets/javascripts/pages/projects/blob/edit/index.js
+++ b/app/assets/javascripts/pages/projects/blob/edit/index.js
@@ -1,3 +1,3 @@
import initBlobBundle from '~/blob_edit/blob_bundle';
-document.addEventListener('DOMContentLoaded', initBlobBundle);
+initBlobBundle();
diff --git a/app/assets/javascripts/pages/projects/blob/new/index.js b/app/assets/javascripts/pages/projects/blob/new/index.js
index 189053f3ed7..ed416610173 100644
--- a/app/assets/javascripts/pages/projects/blob/new/index.js
+++ b/app/assets/javascripts/pages/projects/blob/new/index.js
@@ -1,3 +1,3 @@
import initBlobBundle from '~/blob_edit/blob_bundle';
-document.addEventListener('DOMContentLoaded', initBlobBundle);
+initBlobBundle();
diff --git a/app/assets/javascripts/pages/projects/blob/show/index.js b/app/assets/javascripts/pages/projects/blob/show/index.js
index 61ff1c95a38..10bac6d60c2 100644
--- a/app/assets/javascripts/pages/projects/blob/show/index.js
+++ b/app/assets/javascripts/pages/projects/blob/show/index.js
@@ -7,61 +7,59 @@ import initWebIdeLink from '~/pages/projects/shared/web_ide_link';
import commitPipelineStatus from '~/projects/tree/components/commit_pipeline_status_component.vue';
import '~/sourcegraph/load';
-document.addEventListener('DOMContentLoaded', () => {
- new BlobViewer(); // eslint-disable-line no-new
- initBlob();
+new BlobViewer(); // eslint-disable-line no-new
+initBlob();
- const CommitPipelineStatusEl = document.querySelector('.js-commit-pipeline-status');
- const statusLink = document.querySelector('.commit-actions .ci-status-link');
- if (statusLink) {
- statusLink.remove();
- // eslint-disable-next-line no-new
- new Vue({
- el: CommitPipelineStatusEl,
- components: {
- commitPipelineStatus,
- },
- render(createElement) {
- return createElement('commit-pipeline-status', {
- props: {
- endpoint: CommitPipelineStatusEl.dataset.endpoint,
- },
- });
- },
- });
- }
+const CommitPipelineStatusEl = document.querySelector('.js-commit-pipeline-status');
+const statusLink = document.querySelector('.commit-actions .ci-status-link');
+if (statusLink) {
+ statusLink.remove();
+ // eslint-disable-next-line no-new
+ new Vue({
+ el: CommitPipelineStatusEl,
+ components: {
+ commitPipelineStatus,
+ },
+ render(createElement) {
+ return createElement('commit-pipeline-status', {
+ props: {
+ endpoint: CommitPipelineStatusEl.dataset.endpoint,
+ },
+ });
+ },
+ });
+}
- initWebIdeLink({ el: document.getElementById('js-blob-web-ide-link') });
+initWebIdeLink({ el: document.getElementById('js-blob-web-ide-link') });
- GpgBadges.fetch();
+GpgBadges.fetch();
- const codeNavEl = document.getElementById('js-code-navigation');
+const codeNavEl = document.getElementById('js-code-navigation');
- if (codeNavEl) {
- const { codeNavigationPath, blobPath, definitionPathPrefix } = codeNavEl.dataset;
+if (codeNavEl) {
+ const { codeNavigationPath, blobPath, definitionPathPrefix } = codeNavEl.dataset;
- // eslint-disable-next-line promise/catch-or-return
- import('~/code_navigation').then((m) =>
- m.default({
- blobs: [{ path: blobPath, codeNavigationPath }],
- definitionPathPrefix,
- }),
- );
- }
+ // eslint-disable-next-line promise/catch-or-return
+ import('~/code_navigation').then((m) =>
+ m.default({
+ blobs: [{ path: blobPath, codeNavigationPath }],
+ definitionPathPrefix,
+ }),
+ );
+}
- const successPipelineEl = document.querySelector('.js-success-pipeline-modal');
+const successPipelineEl = document.querySelector('.js-success-pipeline-modal');
- if (successPipelineEl) {
- // eslint-disable-next-line no-new
- new Vue({
- el: successPipelineEl,
- render(createElement) {
- return createElement(PipelineTourSuccessModal, {
- props: {
- ...successPipelineEl.dataset,
- },
- });
- },
- });
- }
-});
+if (successPipelineEl) {
+ // eslint-disable-next-line no-new
+ new Vue({
+ el: successPipelineEl,
+ render(createElement) {
+ return createElement(PipelineTourSuccessModal, {
+ props: {
+ ...successPipelineEl.dataset,
+ },
+ });
+ },
+ });
+}
diff --git a/app/assets/javascripts/pages/projects/boards/index.js b/app/assets/javascripts/pages/projects/boards/index.js
index 3a06d0faa3e..bde0007ec6a 100644
--- a/app/assets/javascripts/pages/projects/boards/index.js
+++ b/app/assets/javascripts/pages/projects/boards/index.js
@@ -2,8 +2,6 @@ import ShortcutsNavigation from '~/behaviors/shortcuts/shortcuts_navigation';
import initBoards from '~/boards';
import UsersSelect from '~/users_select';
-document.addEventListener('DOMContentLoaded', () => {
- new UsersSelect(); // eslint-disable-line no-new
- new ShortcutsNavigation(); // eslint-disable-line no-new
- initBoards();
-});
+new UsersSelect(); // eslint-disable-line no-new
+new ShortcutsNavigation(); // eslint-disable-line no-new
+initBoards();
diff --git a/app/assets/javascripts/pages/projects/branches/index/index.js b/app/assets/javascripts/pages/projects/branches/index/index.js
index 623d0a10606..72861855c5a 100644
--- a/app/assets/javascripts/pages/projects/branches/index/index.js
+++ b/app/assets/javascripts/pages/projects/branches/index/index.js
@@ -2,8 +2,6 @@ import AjaxLoadingSpinner from '~/branches/ajax_loading_spinner';
import DeleteModal from '~/branches/branches_delete_modal';
import initDiverganceGraph from '~/branches/divergence_graph';
-document.addEventListener('DOMContentLoaded', () => {
- AjaxLoadingSpinner.init();
- new DeleteModal(); // eslint-disable-line no-new
- initDiverganceGraph(document.querySelector('.js-branch-list').dataset.divergingCountsEndpoint);
-});
+AjaxLoadingSpinner.init();
+new DeleteModal(); // eslint-disable-line no-new
+initDiverganceGraph(document.querySelector('.js-branch-list').dataset.divergingCountsEndpoint);
diff --git a/app/assets/javascripts/pages/projects/branches/new/index.js b/app/assets/javascripts/pages/projects/branches/new/index.js
index 13ff47d53c2..364223f1898 100644
--- a/app/assets/javascripts/pages/projects/branches/new/index.js
+++ b/app/assets/javascripts/pages/projects/branches/new/index.js
@@ -1,11 +1,8 @@
import $ from 'jquery';
import NewBranchForm from '~/new_branch_form';
-document.addEventListener(
- 'DOMContentLoaded',
- () =>
- new NewBranchForm(
- $('.js-create-branch-form'),
- JSON.parse(document.getElementById('availableRefs').innerHTML),
- ),
+// eslint-disable-next-line no-new
+new NewBranchForm(
+ $('.js-create-branch-form'),
+ JSON.parse(document.getElementById('availableRefs').innerHTML),
);
diff --git a/app/assets/javascripts/pages/projects/compare/show/index.js b/app/assets/javascripts/pages/projects/compare/show/index.js
index f1cf9caa28b..549e596cb8d 100644
--- a/app/assets/javascripts/pages/projects/compare/show/index.js
+++ b/app/assets/javascripts/pages/projects/compare/show/index.js
@@ -1,6 +1,9 @@
import Diff from '~/diff';
import GpgBadges from '~/gpg_badges';
import initChangesDropdown from '~/init_changes_dropdown';
+import initCompareSelector from '~/projects/compare';
+
+initCompareSelector();
document.addEventListener('DOMContentLoaded', () => {
new Diff(); // eslint-disable-line no-new
diff --git a/app/assets/javascripts/pages/projects/cycle_analytics/show/index.js b/app/assets/javascripts/pages/projects/cycle_analytics/show/index.js
index df58e9dd072..255d05b39be 100644
--- a/app/assets/javascripts/pages/projects/cycle_analytics/show/index.js
+++ b/app/assets/javascripts/pages/projects/cycle_analytics/show/index.js
@@ -1,3 +1,3 @@
-import initCycleAnalytics from '~/cycle_analytics/cycle_analytics_bundle';
+import initCycleAnalytics from '~/cycle_analytics';
document.addEventListener('DOMContentLoaded', initCycleAnalytics);
diff --git a/app/assets/javascripts/pages/projects/feature_flags_user_lists/edit/index.js b/app/assets/javascripts/pages/projects/feature_flags_user_lists/edit/index.js
index bbe84322462..43fd5375222 100644
--- a/app/assets/javascripts/pages/projects/feature_flags_user_lists/edit/index.js
+++ b/app/assets/javascripts/pages/projects/feature_flags_user_lists/edit/index.js
@@ -1,3 +1,5 @@
+/* eslint-disable no-new */
+
import Vue from 'vue';
import Vuex from 'vuex';
import EditUserList from '~/user_lists/components/edit_user_list.vue';
@@ -5,15 +7,13 @@ import createStore from '~/user_lists/store/edit';
Vue.use(Vuex);
-document.addEventListener('DOMContentLoaded', () => {
- const el = document.getElementById('js-edit-user-list');
- const { userListsDocsPath } = el.dataset;
- return new Vue({
- el,
- store: createStore(el.dataset),
- provide: { userListsDocsPath },
- render(h) {
- return h(EditUserList, {});
- },
- });
+const el = document.getElementById('js-edit-user-list');
+const { userListsDocsPath } = el.dataset;
+new Vue({
+ el,
+ store: createStore(el.dataset),
+ provide: { userListsDocsPath },
+ render(h) {
+ return h(EditUserList, {});
+ },
});
diff --git a/app/assets/javascripts/pages/projects/feature_flags_user_lists/new/index.js b/app/assets/javascripts/pages/projects/feature_flags_user_lists/new/index.js
index 679f0af8efc..e855447d5ce 100644
--- a/app/assets/javascripts/pages/projects/feature_flags_user_lists/new/index.js
+++ b/app/assets/javascripts/pages/projects/feature_flags_user_lists/new/index.js
@@ -1,3 +1,5 @@
+/* eslint-disable no-new */
+
import Vue from 'vue';
import Vuex from 'vuex';
import NewUserList from '~/user_lists/components/new_user_list.vue';
@@ -5,18 +7,16 @@ import createStore from '~/user_lists/store/new';
Vue.use(Vuex);
-document.addEventListener('DOMContentLoaded', () => {
- const el = document.getElementById('js-new-user-list');
- const { userListsDocsPath, featureFlagsPath } = el.dataset;
- return new Vue({
- el,
- store: createStore(el.dataset),
- provide: {
- userListsDocsPath,
- featureFlagsPath,
- },
- render(h) {
- return h(NewUserList);
- },
- });
+const el = document.getElementById('js-new-user-list');
+const { userListsDocsPath, featureFlagsPath } = el.dataset;
+new Vue({
+ el,
+ store: createStore(el.dataset),
+ provide: {
+ userListsDocsPath,
+ featureFlagsPath,
+ },
+ render(h) {
+ return h(NewUserList);
+ },
});
diff --git a/app/assets/javascripts/pages/projects/feature_flags_user_lists/show/index.js b/app/assets/javascripts/pages/projects/feature_flags_user_lists/show/index.js
index bccd9dce2ec..2dca0ea7f29 100644
--- a/app/assets/javascripts/pages/projects/feature_flags_user_lists/show/index.js
+++ b/app/assets/javascripts/pages/projects/feature_flags_user_lists/show/index.js
@@ -1,18 +1,3 @@
-import Vue from 'vue';
-import Vuex from 'vuex';
-import UserList from '~/user_lists/components/user_list.vue';
-import createStore from '~/user_lists/store/show';
+import featureFlagsUserListInit from '~/projects/feature_flags_user_lists/show/index';
-Vue.use(Vuex);
-
-document.addEventListener('DOMContentLoaded', () => {
- const el = document.getElementById('js-edit-user-list');
- return new Vue({
- el,
- store: createStore(el.dataset),
- render(h) {
- const { emptyStatePath } = el.dataset;
- return h(UserList, { props: { emptyStatePath } });
- },
- });
-});
+featureFlagsUserListInit();
diff --git a/app/assets/javascripts/pages/projects/forks/new/components/app.vue b/app/assets/javascripts/pages/projects/forks/new/components/app.vue
new file mode 100644
index 00000000000..02b357d389b
--- /dev/null
+++ b/app/assets/javascripts/pages/projects/forks/new/components/app.vue
@@ -0,0 +1,72 @@
+<script>
+import ForkForm from './fork_form.vue';
+
+export default {
+ components: {
+ ForkForm,
+ },
+ props: {
+ forkIllustration: {
+ type: String,
+ required: true,
+ },
+ endpoint: {
+ type: String,
+ required: true,
+ },
+ projectFullPath: {
+ type: String,
+ required: true,
+ },
+ projectId: {
+ type: String,
+ required: true,
+ },
+ projectName: {
+ type: String,
+ required: true,
+ },
+ projectPath: {
+ type: String,
+ required: true,
+ },
+ projectDescription: {
+ type: String,
+ required: true,
+ },
+ projectVisibility: {
+ type: String,
+ required: true,
+ },
+ },
+};
+</script>
+
+<template>
+ <div class="row gl-mt-5">
+ <div class="col-lg-3">
+ <img :src="forkIllustration" />
+ <h4 class="">{{ s__('ForkProject|Fork project') }}</h4>
+ <p>
+ {{ s__('ForkProject|A fork is a copy of a project.') }}
+ <br />
+ {{
+ s__(
+ 'ForkProject|Forking a repository allows you to make changes without affecting the original project.',
+ )
+ }}
+ </p>
+ </div>
+ <div class="col-lg-9">
+ <fork-form
+ :endpoint="endpoint"
+ :project-full-path="projectFullPath"
+ :project-id="projectId"
+ :project-name="projectName"
+ :project-path="projectPath"
+ :project-description="projectDescription"
+ :project-visibility="projectVisibility"
+ />
+ </div>
+ </div>
+</template>
diff --git a/app/assets/javascripts/pages/projects/forks/new/components/fork_form.vue b/app/assets/javascripts/pages/projects/forks/new/components/fork_form.vue
new file mode 100644
index 00000000000..7112b23775d
--- /dev/null
+++ b/app/assets/javascripts/pages/projects/forks/new/components/fork_form.vue
@@ -0,0 +1,304 @@
+<script>
+import {
+ GlIcon,
+ GlLink,
+ GlForm,
+ GlFormInputGroup,
+ GlInputGroupText,
+ GlFormInput,
+ GlFormGroup,
+ GlFormTextarea,
+ GlButton,
+ GlFormRadio,
+ GlFormRadioGroup,
+ GlFormSelect,
+} from '@gitlab/ui';
+import { buildApiUrl } from '~/api/api_utils';
+import createFlash from '~/flash';
+import axios from '~/lib/utils/axios_utils';
+import csrf from '~/lib/utils/csrf';
+import { redirectTo } from '~/lib/utils/url_utility';
+import { s__ } from '~/locale';
+
+const PRIVATE_VISIBILITY = 'private';
+const INTERNAL_VISIBILITY = 'internal';
+const PUBLIC_VISIBILITY = 'public';
+
+const ALLOWED_VISIBILITY = {
+ private: [PRIVATE_VISIBILITY],
+ internal: [INTERNAL_VISIBILITY, PRIVATE_VISIBILITY],
+ public: [INTERNAL_VISIBILITY, PRIVATE_VISIBILITY, PUBLIC_VISIBILITY],
+};
+
+export default {
+ components: {
+ GlForm,
+ GlIcon,
+ GlLink,
+ GlButton,
+ GlFormInputGroup,
+ GlInputGroupText,
+ GlFormInput,
+ GlFormTextarea,
+ GlFormGroup,
+ GlFormRadio,
+ GlFormRadioGroup,
+ GlFormSelect,
+ },
+ inject: {
+ newGroupPath: {
+ default: '',
+ },
+ visibilityHelpPath: {
+ default: '',
+ },
+ },
+ props: {
+ endpoint: {
+ type: String,
+ required: true,
+ },
+ projectFullPath: {
+ type: String,
+ required: true,
+ },
+ projectId: {
+ type: String,
+ required: true,
+ },
+ projectName: {
+ type: String,
+ required: true,
+ },
+ projectPath: {
+ type: String,
+ required: true,
+ },
+ projectDescription: {
+ type: String,
+ required: true,
+ },
+ projectVisibility: {
+ type: String,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ isSaving: false,
+ namespaces: [],
+ selectedNamespace: {},
+ fork: {
+ name: this.projectName,
+ slug: this.projectPath,
+ description: this.projectDescription,
+ visibility: this.projectVisibility,
+ },
+ };
+ },
+ computed: {
+ projectUrl() {
+ return `${gon.gitlab_url}/`;
+ },
+ projectAllowedVisibility() {
+ return ALLOWED_VISIBILITY[this.projectVisibility];
+ },
+ namespaceAllowedVisibility() {
+ return (
+ ALLOWED_VISIBILITY[this.selectedNamespace.visibility] ||
+ ALLOWED_VISIBILITY[PUBLIC_VISIBILITY]
+ );
+ },
+ visibilityLevels() {
+ return [
+ {
+ text: s__('ForkProject|Private'),
+ value: PRIVATE_VISIBILITY,
+ icon: 'lock',
+ help: s__('ForkProject|The project can be accessed without any authentication.'),
+ disabled: this.isVisibilityLevelDisabled(PRIVATE_VISIBILITY),
+ },
+ {
+ text: s__('ForkProject|Internal'),
+ value: INTERNAL_VISIBILITY,
+ icon: 'shield',
+ help: s__('ForkProject|The project can be accessed by any logged in user.'),
+ disabled: this.isVisibilityLevelDisabled(INTERNAL_VISIBILITY),
+ },
+ {
+ text: s__('ForkProject|Public'),
+ value: PUBLIC_VISIBILITY,
+ icon: 'earth',
+ help: s__(
+ '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.',
+ ),
+ disabled: this.isVisibilityLevelDisabled(PUBLIC_VISIBILITY),
+ },
+ ];
+ },
+ },
+ watch: {
+ selectedNamespace(newVal) {
+ const { visibility } = newVal;
+
+ if (this.projectAllowedVisibility.includes(visibility)) {
+ this.fork.visibility = visibility;
+ }
+ },
+ },
+ mounted() {
+ this.fetchNamespaces();
+ },
+ methods: {
+ async fetchNamespaces() {
+ const { data } = await axios.get(this.endpoint);
+ this.namespaces = data.namespaces;
+ },
+ isVisibilityLevelDisabled(visibilityLevel) {
+ return !(
+ this.projectAllowedVisibility.includes(visibilityLevel) &&
+ this.namespaceAllowedVisibility.includes(visibilityLevel)
+ );
+ },
+ async onSubmit() {
+ this.isSaving = true;
+
+ const { projectId } = this;
+ const { name, slug, description, visibility } = this.fork;
+ const { id: namespaceId } = this.selectedNamespace;
+
+ const postParams = {
+ id: projectId,
+ name,
+ namespace_id: namespaceId,
+ path: slug,
+ description,
+ visibility,
+ };
+
+ const forkProjectPath = `/api/:version/projects/:id/fork`;
+ const url = buildApiUrl(forkProjectPath).replace(':id', encodeURIComponent(this.projectId));
+
+ try {
+ const { data } = await axios.post(url, postParams);
+ redirectTo(data.web_url);
+ return;
+ } catch (error) {
+ createFlash({ message: error });
+ }
+ },
+ },
+ csrf,
+};
+</script>
+
+<template>
+ <gl-form method="POST" @submit.prevent="onSubmit">
+ <input type="hidden" name="authenticity_token" :value="$options.csrf.token" />
+
+ <gl-form-group label="Project name" label-for="fork-name">
+ <gl-form-input id="fork-name" v-model="fork.name" data-testid="fork-name-input" required />
+ </gl-form-group>
+
+ <div class="gl-md-display-flex">
+ <div class="gl-flex-basis-half">
+ <gl-form-group label="Project URL" label-for="fork-url" class="gl-md-mr-3">
+ <gl-form-input-group>
+ <template #prepend>
+ <gl-input-group-text>
+ {{ projectUrl }}
+ </gl-input-group-text>
+ </template>
+ <gl-form-select
+ id="fork-url"
+ v-model="selectedNamespace"
+ data-testid="fork-url-input"
+ required
+ >
+ <template slot="first">
+ <option :value="null" disabled>{{ s__('ForkProject|Select a namespace') }}</option>
+ </template>
+ <option v-for="namespace in namespaces" :key="namespace.id" :value="namespace">
+ {{ namespace.name }}
+ </option>
+ </gl-form-select>
+ </gl-form-input-group>
+ </gl-form-group>
+ </div>
+ <div class="gl-flex-basis-half">
+ <gl-form-group label="Project slug" label-for="fork-slug" class="gl-md-ml-3">
+ <gl-form-input
+ id="fork-slug"
+ v-model="fork.slug"
+ data-testid="fork-slug-input"
+ required
+ />
+ </gl-form-group>
+ </div>
+ </div>
+
+ <p class="gl-mt-n5 gl-text-gray-500">
+ {{ s__('ForkProject|Want to house several dependent projects under the same namespace?') }}
+ <gl-link :href="newGroupPath" target="_blank">
+ {{ s__('ForkProject|Create a group') }}
+ </gl-link>
+ </p>
+
+ <gl-form-group label="Project description (optional)" label-for="fork-description">
+ <gl-form-textarea
+ id="fork-description"
+ v-model="fork.description"
+ data-testid="fork-description-textarea"
+ />
+ </gl-form-group>
+
+ <gl-form-group>
+ <label>
+ {{ s__('ForkProject|Visibility level') }}
+ <gl-link :href="visibilityHelpPath" target="_blank">
+ <gl-icon name="question-o" />
+ </gl-link>
+ </label>
+ <gl-form-radio-group
+ v-model="fork.visibility"
+ data-testid="fork-visibility-radio-group"
+ required
+ >
+ <gl-form-radio
+ v-for="{ text, value, icon, help, disabled } in visibilityLevels"
+ :key="value"
+ :value="value"
+ :disabled="disabled"
+ :data-testid="`radio-${value}`"
+ >
+ <div>
+ <gl-icon :name="icon" />
+ <span>{{ text }}</span>
+ </div>
+ <template #help>{{ help }}</template>
+ </gl-form-radio>
+ </gl-form-radio-group>
+ </gl-form-group>
+
+ <div class="gl-display-flex gl-justify-content-space-between gl-mt-8">
+ <gl-button
+ type="submit"
+ category="primary"
+ variant="confirm"
+ data-testid="submit-button"
+ :loading="isSaving"
+ >
+ {{ s__('ForkProject|Fork project') }}
+ </gl-button>
+ <gl-button
+ type="reset"
+ class="gl-mr-3"
+ data-testid="cancel-button"
+ :disabled="isSaving"
+ :href="projectFullPath"
+ >
+ {{ s__('ForkProject|Cancel') }}
+ </gl-button>
+ </div>
+ </gl-form>
+</template>
diff --git a/app/assets/javascripts/pages/projects/forks/new/components/fork_groups_list_item.vue b/app/assets/javascripts/pages/projects/forks/new/components/fork_groups_list_item.vue
index 46d1696b88b..88f4bba5e2a 100644
--- a/app/assets/javascripts/pages/projects/forks/new/components/fork_groups_list_item.vue
+++ b/app/assets/javascripts/pages/projects/forks/new/components/fork_groups_list_item.vue
@@ -11,6 +11,7 @@ import {
} from '@gitlab/ui';
import { VISIBILITY_TYPE_ICON, GROUP_VISIBILITY_TYPE } from '~/groups/constants';
import csrf from '~/lib/utils/csrf';
+import UserAccessRoleBadge from '~/vue_shared/components/user_access_role_badge.vue';
export default {
components: {
@@ -20,6 +21,7 @@ export default {
GlButton,
GlTooltip,
GlLink,
+ UserAccessRoleBadge,
},
directives: {
GlTooltip: GlTooltipDirective,
@@ -72,7 +74,9 @@ export default {
<template>
<li :class="rowClass" class="group-row">
<div class="group-row-contents gl-display-flex gl-align-items-center gl-py-3 gl-pr-5">
- <div class="folder-toggle-wrap gl-mr-2 gl-display-flex gl-align-items-center">
+ <div
+ class="folder-toggle-wrap gl-mr-3 gl-display-flex gl-align-items-center gl-text-gray-500"
+ >
<gl-icon name="folder-o" />
</div>
<gl-link
@@ -84,12 +88,12 @@ export default {
<div class="gl-min-w-0 gl-display-flex gl-flex-grow-1 gl-flex-shrink-1 gl-align-items-center">
<div class="gl-min-w-0 gl-flex-grow-1 flex-shrink-1">
<div class="title gl-display-flex gl-align-items-center gl-flex-wrap gl-mr-3">
- <gl-link :href="group.relative_path" class="gl-mt-3 gl-mr-3 gl-text-gray-900!">{{
- group.full_name
- }}</gl-link>
+ <gl-link :href="group.relative_path" class="gl-mt-3 gl-mr-3 gl-text-gray-900!">
+ {{ group.full_name }}
+ </gl-link>
<gl-icon
v-gl-tooltip.hover.bottom
- class="gl-mr-0 gl-inline-flex gl-mt-3 text-secondary"
+ class="gl-display-inline-flex gl-mt-3 gl-mr-3 gl-text-gray-500"
:name="visibilityIcon"
:title="visibilityTooltip"
/>
@@ -99,11 +103,11 @@ export default {
class="gl-display-none gl-sm-display-flex gl-mt-3 gl-mr-1"
>{{ __('pending removal') }}</gl-badge
>
- <span v-if="group.permission" class="user-access-role gl-mt-3">
+ <user-access-role-badge v-if="group.permission" class="gl-mt-3">
{{ group.permission }}
- </span>
+ </user-access-role-badge>
</div>
- <div v-if="group.description" class="description">
+ <div v-if="group.description" class="description gl-line-height-20">
<span v-safe-html="group.markdown_description"> </span>
</div>
</div>
diff --git a/app/assets/javascripts/pages/projects/forks/new/index.js b/app/assets/javascripts/pages/projects/forks/new/index.js
index a018d7e0926..372967c8a1e 100644
--- a/app/assets/javascripts/pages/projects/forks/new/index.js
+++ b/app/assets/javascripts/pages/projects/forks/new/index.js
@@ -1,12 +1,52 @@
import Vue from 'vue';
+import App from './components/app.vue';
import ForkGroupsList from './components/fork_groups_list.vue';
-document.addEventListener('DOMContentLoaded', () => {
- const mountElement = document.getElementById('fork-groups-mount-element');
+const mountElement = document.getElementById('fork-groups-mount-element');
+if (gon.features.forkProjectForm) {
+ const {
+ forkIllustration,
+ endpoint,
+ newGroupPath,
+ projectFullPath,
+ visibilityHelpPath,
+ projectId,
+ projectName,
+ projectPath,
+ projectDescription,
+ projectVisibility,
+ } = mountElement.dataset;
+
+ // eslint-disable-next-line no-new
+ new Vue({
+ el: mountElement,
+ provide: {
+ newGroupPath,
+ visibilityHelpPath,
+ },
+ render(h) {
+ return h(App, {
+ props: {
+ forkIllustration,
+ endpoint,
+ newGroupPath,
+ projectFullPath,
+ visibilityHelpPath,
+ projectId,
+ projectName,
+ projectPath,
+ projectDescription,
+ projectVisibility,
+ },
+ });
+ },
+ });
+} else {
const { endpoint } = mountElement.dataset;
- return new Vue({
+ // eslint-disable-next-line no-new
+ new Vue({
el: mountElement,
render(h) {
return h(ForkGroupsList, {
@@ -16,4 +56,4 @@ document.addEventListener('DOMContentLoaded', () => {
});
},
});
-});
+}
diff --git a/app/assets/javascripts/pages/projects/imports/show/index.js b/app/assets/javascripts/pages/projects/imports/show/index.js
index d5f92baf054..8397826f8eb 100644
--- a/app/assets/javascripts/pages/projects/imports/show/index.js
+++ b/app/assets/javascripts/pages/projects/imports/show/index.js
@@ -1,5 +1,3 @@
import ProjectImport from '~/project_import';
-document.addEventListener('DOMContentLoaded', () => {
- new ProjectImport(); // eslint-disable-line no-new
-});
+new ProjectImport(); // eslint-disable-line no-new
diff --git a/app/assets/javascripts/pages/projects/issues/index/index.js b/app/assets/javascripts/pages/projects/issues/index/index.js
index 525d90e162d..a3a053c3c31 100644
--- a/app/assets/javascripts/pages/projects/issues/index/index.js
+++ b/app/assets/javascripts/pages/projects/issues/index/index.js
@@ -2,6 +2,7 @@
import IssuableFilteredSearchTokenKeys from 'ee_else_ce/filtered_search/issuable_filtered_search_token_keys';
import ShortcutsNavigation from '~/behaviors/shortcuts/shortcuts_navigation';
+import initCsvImportExportButtons from '~/issuable/init_csv_import_export_buttons';
import initIssuableByEmail from '~/issuable/init_issuable_by_email';
import IssuableIndex from '~/issuable_index';
import initIssuablesList from '~/issues_list';
@@ -26,3 +27,4 @@ new UsersSelect();
initManualOrdering();
initIssuablesList();
initIssuableByEmail();
+initCsvImportExportButtons();
diff --git a/app/assets/javascripts/pages/projects/jobs/index/index.js b/app/assets/javascripts/pages/projects/jobs/index/index.js
index 6a70d4cf26d..681d151b77f 100644
--- a/app/assets/javascripts/pages/projects/jobs/index/index.js
+++ b/app/assets/javascripts/pages/projects/jobs/index/index.js
@@ -1,19 +1,17 @@
import Vue from 'vue';
import GlCountdown from '~/vue_shared/components/gl_countdown.vue';
-document.addEventListener('DOMContentLoaded', () => {
- const remainingTimeElements = document.querySelectorAll('.js-remaining-time');
- remainingTimeElements.forEach(
- (el) =>
- new Vue({
- el,
- render(h) {
- return h(GlCountdown, {
- props: {
- endDateString: el.dateTime,
- },
- });
- },
- }),
- );
-});
+const remainingTimeElements = document.querySelectorAll('.js-remaining-time');
+remainingTimeElements.forEach(
+ (el) =>
+ new Vue({
+ el,
+ render(h) {
+ return h(GlCountdown, {
+ props: {
+ endDateString: el.dateTime,
+ },
+ });
+ },
+ }),
+);
diff --git a/app/assets/javascripts/pages/projects/labels/edit/index.js b/app/assets/javascripts/pages/projects/labels/edit/index.js
index 83d6ac9fd14..3b7562deed9 100644
--- a/app/assets/javascripts/pages/projects/labels/edit/index.js
+++ b/app/assets/javascripts/pages/projects/labels/edit/index.js
@@ -1,3 +1,3 @@
import Labels from 'ee_else_ce/labels';
-document.addEventListener('DOMContentLoaded', () => new Labels());
+new Labels(); // eslint-disable-line no-new
diff --git a/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_a.vue b/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_a.vue
index 0393793bfe1..32ca623ca45 100644
--- a/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_a.vue
+++ b/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_a.vue
@@ -1,11 +1,11 @@
<script>
import { GlLink } from '@gitlab/ui';
-import { ACTION_TEXT } from '../constants';
+import { ACTION_LABELS } from '../constants';
export default {
components: { GlLink },
i18n: {
- ACTION_TEXT,
+ ACTION_LABELS,
},
props: {
actions: {
@@ -18,9 +18,9 @@ export default {
<template>
<ul>
<li v-for="(value, action) in actions" :key="action">
- <span v-if="value.completed">{{ $options.i18n.ACTION_TEXT[action] }}</span>
+ <span v-if="value.completed">{{ $options.i18n.ACTION_LABELS[action].title }}</span>
<span v-else>
- <gl-link :href="value.url">{{ $options.i18n.ACTION_TEXT[action] }}</gl-link>
+ <gl-link :href="value.url">{{ $options.i18n.ACTION_LABELS[action].title }}</gl-link>
</span>
</li>
</ul>
diff --git a/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_b.vue b/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_b.vue
index 0393793bfe1..230054ff76e 100644
--- a/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_b.vue
+++ b/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_b.vue
@@ -1,11 +1,35 @@
<script>
-import { GlLink } from '@gitlab/ui';
-import { ACTION_TEXT } from '../constants';
+import { GlProgressBar, GlSprintf } from '@gitlab/ui';
+import { s__ } from '~/locale';
+import { ACTION_LABELS } from '../constants';
+import LearnGitlabInfoCard from './learn_gitlab_info_card.vue';
export default {
- components: { GlLink },
+ components: { LearnGitlabInfoCard, GlProgressBar, GlSprintf },
i18n: {
- ACTION_TEXT,
+ title: s__('LearnGitLab|Learn GitLab'),
+ description: s__(
+ 'LearnGitLab|Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project.',
+ ),
+ percentageCompleted: s__(`LearnGitLab|%{percentage}%{percentSymbol} completed`),
+ workspace: {
+ title: s__('LearnGitLab|Set up your workspace'),
+ description: s__(
+ "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:",
+ ),
+ },
+ plan: {
+ title: s__('LearnGitLab|Plan and execute'),
+ description: s__(
+ 'LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:',
+ ),
+ },
+ deploy: {
+ title: s__('LearnGitLab|Deploy'),
+ description: s__(
+ 'LearnGitLab|Use your new GitLab workflow to deploy your application, monitor its health, and keep it secure:',
+ ),
+ },
},
props: {
actions: {
@@ -13,15 +37,76 @@ export default {
type: Object,
},
},
+ maxValue: Object.keys(ACTION_LABELS).length,
+ methods: {
+ infoProps(action) {
+ return {
+ ...this.actions[action],
+ ...ACTION_LABELS[action],
+ };
+ },
+ progressValue() {
+ return Object.values(this.actions).filter((a) => a.completed).length;
+ },
+ progressPercentage() {
+ return Math.round((this.progressValue() / this.$options.maxValue) * 100);
+ },
+ },
};
</script>
<template>
- <ul>
- <li v-for="(value, action) in actions" :key="action">
- <span v-if="value.completed">{{ $options.i18n.ACTION_TEXT[action] }}</span>
- <span v-else>
- <gl-link :href="value.url">{{ $options.i18n.ACTION_TEXT[action] }}</gl-link>
- </span>
- </li>
- </ul>
+ <div>
+ <div class="row">
+ <div class="gl-mb-7 col-md-8 col-lg-7">
+ <h1 class="gl-font-size-h1">{{ $options.i18n.title }}</h1>
+ <p class="gl-text-gray-700 gl-mb-0">{{ $options.i18n.description }}</p>
+ </div>
+ </div>
+
+ <div class="gl-mb-3">
+ <p class="gl-text-gray-500 gl-mb-2" data-testid="completion-percentage">
+ <gl-sprintf :message="$options.i18n.percentageCompleted">
+ <template #percentage>{{ progressPercentage() }}</template>
+ <template #percentSymbol>%</template>
+ </gl-sprintf>
+ </p>
+ <gl-progress-bar :value="progressValue()" :max="$options.maxValue" />
+ </div>
+
+ <h2 class="gl-font-lg gl-mb-3">{{ $options.i18n.workspace.title }}</h2>
+ <p class="gl-text-gray-700 gl-mb-6">{{ $options.i18n.workspace.description }}</p>
+
+ <div class="row row-cols-2 row-cols-md-3 row-cols-lg-4">
+ <div class="col gl-mb-6"><learn-gitlab-info-card v-bind="infoProps('userAdded')" /></div>
+ <div class="col gl-mb-6"><learn-gitlab-info-card v-bind="infoProps('gitWrite')" /></div>
+ <div class="col gl-mb-6">
+ <learn-gitlab-info-card v-bind="infoProps('pipelineCreated')" />
+ </div>
+ <div class="col gl-mb-6"><learn-gitlab-info-card v-bind="infoProps('trialStarted')" /></div>
+ <div class="col gl-mb-6">
+ <learn-gitlab-info-card v-bind="infoProps('codeOwnersEnabled')" />
+ </div>
+ <div class="col gl-mb-6">
+ <learn-gitlab-info-card v-bind="infoProps('requiredMrApprovalsEnabled')" />
+ </div>
+ </div>
+
+ <h2 class="gl-font-lg gl-mb-3">{{ $options.i18n.plan.title }}</h2>
+ <p class="gl-text-gray-700 gl-mb-6">{{ $options.i18n.plan.description }}</p>
+
+ <div class="row row-cols-2 row-cols-md-3 row-cols-lg-4">
+ <div class="col gl-mb-6">
+ <learn-gitlab-info-card v-bind="infoProps('mergeRequestCreated')" />
+ </div>
+ </div>
+
+ <h2 class="gl-font-lg gl-mb-3">{{ $options.i18n.deploy.title }}</h2>
+ <p class="gl-text-gray-700 gl-mb-6">{{ $options.i18n.deploy.description }}</p>
+
+ <div class="row row-cols-2 row-cols-lg-4 g-2 g-lg-3">
+ <div class="col gl-mb-6">
+ <learn-gitlab-info-card v-bind="infoProps('securityScanEnabled')" />
+ </div>
+ </div>
+ </div>
</template>
diff --git a/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_info_card.vue b/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_info_card.vue
new file mode 100644
index 00000000000..3d2a8eed9d4
--- /dev/null
+++ b/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_info_card.vue
@@ -0,0 +1,70 @@
+<script>
+import { GlLink, GlCard, GlIcon } from '@gitlab/ui';
+import { s__ } from '~/locale';
+
+export default {
+ name: 'LearnGitlabInfoCard',
+ components: { GlLink, GlCard, GlIcon },
+ i18n: {
+ trial: s__('Learn GitLab|Trial only'),
+ },
+ props: {
+ title: {
+ required: true,
+ type: String,
+ },
+ description: {
+ required: true,
+ type: String,
+ },
+ actionLabel: {
+ required: true,
+ type: String,
+ },
+ url: {
+ required: true,
+ type: String,
+ },
+ completed: {
+ required: true,
+ type: Boolean,
+ },
+ svg: {
+ required: true,
+ type: String,
+ },
+ trialRequired: {
+ default: false,
+ required: false,
+ type: Boolean,
+ },
+ },
+};
+</script>
+<template>
+ <gl-card class="gl-pt-0">
+ <div class="gl-text-right gl-h-5">
+ <gl-icon
+ v-if="completed"
+ name="check-circle-filled"
+ class="gl-text-green-500"
+ :size="16"
+ data-testid="completed-icon"
+ />
+ <span
+ v-else-if="trialRequired"
+ class="gl-text-gray-500 gl-font-sm gl-font-style-italic"
+ data-testid="trial-only"
+ >{{ $options.i18n.trial }}</span
+ >
+ </div>
+ <div
+ class="gl-text-center gl-display-flex gl-justify-content-center gl-align-items-center gl-flex-direction-column learn-gitlab-info-card-content"
+ >
+ <img :src="svg" />
+ <h6>{{ title }}</h6>
+ <p class="gl-font-sm gl-text-gray-700">{{ description }}</p>
+ <gl-link :href="url" target="_blank">{{ actionLabel }}</gl-link>
+ </div>
+ </gl-card>
+</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 8606af29785..80f04b0cf44 100644
--- a/app/assets/javascripts/pages/projects/learn_gitlab/constants/index.js
+++ b/app/assets/javascripts/pages/projects/learn_gitlab/constants/index.js
@@ -1,12 +1,50 @@
import { s__ } from '~/locale';
-export const ACTION_TEXT = {
- gitWrite: s__('LearnGitLab|Create a repository'),
- userAdded: s__('LearnGitLab|Invite your colleagues'),
- pipelineCreated: s__('LearnGitLab|Set-up CI/CD'),
- trialStarted: s__('LearnGitLab|Start a free trial of GitLab Gold'),
- codeOwnersEnabled: s__('LearnGitLab|Add code owners'),
- requiredMrApprovalsEnabled: s__('LearnGitLab|Enable require merge approvals'),
- mergeRequestCreated: s__('LearnGitLab|Submit a merge request (MR)'),
- securityScanEnabled: s__('LearnGitLab|Run a Security scan using CI/CD'),
+export const ACTION_LABELS = {
+ gitWrite: {
+ title: s__('LearnGitLab|Create or import a repository'),
+ actionLabel: s__('LearnGitLab|Create or import a repository'),
+ description: s__('LearnGitLab|Create or import your first repository into your new project.'),
+ },
+ userAdded: {
+ title: s__('LearnGitLab|Invite your colleagues'),
+ actionLabel: s__('LearnGitLab|Invite your colleagues'),
+ description: s__(
+ 'LearnGitLab|GitLab works best as a team. Invite your colleague to enjoy all features.',
+ ),
+ },
+ pipelineCreated: {
+ title: s__('LearnGitLab|Set up CI/CD'),
+ actionLabel: s__('LearnGitLab|Set-up CI/CD'),
+ description: s__('LearnGitLab|Save time by automating your integration and deployment tasks.'),
+ },
+ trialStarted: {
+ title: s__('LearnGitLab|Start a free Ultimate trial'),
+ actionLabel: s__('LearnGitLab|Try GitLab Ultimate for free'),
+ description: s__('LearnGitLab|Try all GitLab features for 30 days, no credit card required.'),
+ },
+ codeOwnersEnabled: {
+ title: s__('LearnGitLab|Add code owners'),
+ actionLabel: s__('LearnGitLab|Add code owners'),
+ description: s__(
+ 'LearnGitLab|Prevent unexpected changes to important assets by assigning ownership of files and paths.',
+ ),
+ trialRequired: true,
+ },
+ requiredMrApprovalsEnabled: {
+ title: s__('LearnGitLab|Add merge request approval'),
+ actionLabel: s__('LearnGitLab|Enable require merge approvals'),
+ description: s__('LearnGitLab|Route code reviews to the right reviewers, every time.'),
+ trialRequired: true,
+ },
+ mergeRequestCreated: {
+ title: s__('LearnGitLab|Submit a merge request'),
+ actionLabel: s__('LearnGitLab|Submit a merge request (MR)'),
+ description: s__('LearnGitLab|Review and edit proposed changes to source code.'),
+ },
+ securityScanEnabled: {
+ title: s__('LearnGitLab|Run a security scan'),
+ actionLabel: s__('LearnGitLab|Run a Security scan'),
+ description: s__('LearnGitLab|Scan your code to uncover vulnerabilities before deploying.'),
+ },
};
diff --git a/app/assets/javascripts/pages/projects/logs/index.js b/app/assets/javascripts/pages/projects/logs/index.js
index 36747069ebb..0cff1ffc27e 100644
--- a/app/assets/javascripts/pages/projects/logs/index.js
+++ b/app/assets/javascripts/pages/projects/logs/index.js
@@ -1,3 +1,3 @@
import logsBundle from '~/logs';
-document.addEventListener('DOMContentLoaded', logsBundle);
+logsBundle();
diff --git a/app/assets/javascripts/pages/projects/merge_requests/edit/index.js b/app/assets/javascripts/pages/projects/merge_requests/edit/index.js
index 399aebb0c83..ec21d8c84e0 100644
--- a/app/assets/javascripts/pages/projects/merge_requests/edit/index.js
+++ b/app/assets/javascripts/pages/projects/merge_requests/edit/index.js
@@ -1,7 +1,5 @@
import initMergeRequest from '~/pages/projects/merge_requests/init_merge_request';
import initCheckFormState from './check_form_state';
-document.addEventListener('DOMContentLoaded', () => {
- initMergeRequest();
- initCheckFormState();
-});
+initMergeRequest();
+initCheckFormState();
diff --git a/app/assets/javascripts/pages/projects/merge_requests/index/index.js b/app/assets/javascripts/pages/projects/merge_requests/index/index.js
index 76705256fe2..d279086df7b 100644
--- a/app/assets/javascripts/pages/projects/merge_requests/index/index.js
+++ b/app/assets/javascripts/pages/projects/merge_requests/index/index.js
@@ -1,6 +1,7 @@
import addExtraTokensForMergeRequests from 'ee_else_ce/filtered_search/add_extra_tokens_for_merge_requests';
import ShortcutsNavigation from '~/behaviors/shortcuts/shortcuts_navigation';
import IssuableFilteredSearchTokenKeys from '~/filtered_search/issuable_filtered_search_token_keys';
+import initCsvImportExportButtons from '~/issuable/init_csv_import_export_buttons';
import initIssuableByEmail from '~/issuable/init_issuable_by_email';
import IssuableIndex from '~/issuable_index';
import { FILTERED_SEARCH } from '~/pages/constants';
@@ -22,3 +23,4 @@ new UsersSelect(); // eslint-disable-line no-new
new ShortcutsNavigation(); // eslint-disable-line no-new
initIssuableByEmail();
+initCsvImportExportButtons();
diff --git a/app/assets/javascripts/pages/projects/milestones/edit/index.js b/app/assets/javascripts/pages/projects/milestones/edit/index.js
index 9a4ebf9890d..4f8514a9a1d 100644
--- a/app/assets/javascripts/pages/projects/milestones/edit/index.js
+++ b/app/assets/javascripts/pages/projects/milestones/edit/index.js
@@ -1,3 +1,3 @@
-import initForm from '../../../../shared/milestones/form';
+import initForm from '~/shared/milestones/form';
-document.addEventListener('DOMContentLoaded', () => initForm());
+initForm();
diff --git a/app/assets/javascripts/pages/projects/milestones/index/index.js b/app/assets/javascripts/pages/projects/milestones/index/index.js
index 38789365a67..150b506b121 100644
--- a/app/assets/javascripts/pages/projects/milestones/index/index.js
+++ b/app/assets/javascripts/pages/projects/milestones/index/index.js
@@ -1,3 +1,3 @@
import milestones from '~/pages/milestones/shared';
-document.addEventListener('DOMContentLoaded', milestones);
+milestones();
diff --git a/app/assets/javascripts/pages/projects/milestones/new/index.js b/app/assets/javascripts/pages/projects/milestones/new/index.js
index 9a4ebf9890d..364b0d95d9c 100644
--- a/app/assets/javascripts/pages/projects/milestones/new/index.js
+++ b/app/assets/javascripts/pages/projects/milestones/new/index.js
@@ -1,3 +1,3 @@
import initForm from '../../../../shared/milestones/form';
-document.addEventListener('DOMContentLoaded', () => initForm());
+initForm();
diff --git a/app/assets/javascripts/pages/projects/milestones/show/index.js b/app/assets/javascripts/pages/projects/milestones/show/index.js
index a853413e1f7..3c755e9b98c 100644
--- a/app/assets/javascripts/pages/projects/milestones/show/index.js
+++ b/app/assets/javascripts/pages/projects/milestones/show/index.js
@@ -1,7 +1,5 @@
import milestones from '~/pages/milestones/shared';
import initMilestonesShow from '~/pages/milestones/shared/init_milestones_show';
-document.addEventListener('DOMContentLoaded', () => {
- initMilestonesShow();
- milestones();
-});
+initMilestonesShow();
+milestones();
diff --git a/app/assets/javascripts/pages/projects/new/index.js b/app/assets/javascripts/pages/projects/new/index.js
index 437594fdf11..e10e2872dce 100644
--- a/app/assets/javascripts/pages/projects/new/index.js
+++ b/app/assets/javascripts/pages/projects/new/index.js
@@ -3,28 +3,26 @@ import { __ } from '~/locale';
import initProjectVisibilitySelector from '../../../project_visibility';
import initProjectNew from '../../../projects/project_new';
-document.addEventListener('DOMContentLoaded', () => {
- initProjectVisibilitySelector();
- initProjectNew.bindEvents();
+initProjectVisibilitySelector();
+initProjectNew.bindEvents();
- import(
- /* webpackChunkName: 'experiment_new_project_creation' */ '../../../projects/experiment_new_project_creation'
- )
- .then((m) => {
- const el = document.querySelector('.js-experiment-new-project-creation');
+import(
+ /* webpackChunkName: 'experiment_new_project_creation' */ '../../../projects/experiment_new_project_creation'
+)
+ .then((m) => {
+ const el = document.querySelector('.js-experiment-new-project-creation');
- if (!el) {
- return;
- }
+ if (!el) {
+ return;
+ }
- const config = {
- hasErrors: 'hasErrors' in el.dataset,
- isCiCdAvailable: 'isCiCdAvailable' in el.dataset,
- newProjectGuidelines: el.dataset.newProjectGuidelines,
- };
- m.default(el, config);
- })
- .catch(() => {
- createFlash(__('An error occurred while loading project creation UI'));
- });
-});
+ const config = {
+ hasErrors: 'hasErrors' in el.dataset,
+ isCiCdAvailable: 'isCiCdAvailable' in el.dataset,
+ newProjectGuidelines: el.dataset.newProjectGuidelines,
+ };
+ m.default(el, config);
+ })
+ .catch(() => {
+ createFlash(__('An error occurred while loading project creation UI'));
+ });
diff --git a/app/assets/javascripts/pages/projects/project_members/index.js b/app/assets/javascripts/pages/projects/project_members/index.js
index ed11b07be4a..4aea5614bfb 100644
--- a/app/assets/javascripts/pages/projects/project_members/index.js
+++ b/app/assets/javascripts/pages/projects/project_members/index.js
@@ -1,11 +1,14 @@
import Vue from 'vue';
-import { deprecatedCreateFlash as flash } from '~/flash';
import groupsSelect from '~/groups_select';
+import initInviteGroupTrigger from '~/invite_members/init_invite_group_trigger';
+import initInviteMembersForm from '~/invite_members/init_invite_members_form';
import initInviteMembersModal from '~/invite_members/init_invite_members_modal';
import initInviteMembersTrigger from '~/invite_members/init_invite_members_trigger';
-import { __ } from '~/locale';
+import { s__ } from '~/locale';
import memberExpirationDate from '~/member_expiration_date';
-import Members from '~/members';
+import { initMembersApp } from '~/members';
+import { groupLinkRequestFormatter } from '~/members/utils';
+import { projectMemberRequestFormatter } from '~/projects/members/utils';
import UsersSelect from '~/users_select';
import RemoveMemberModal from '~/vue_shared/components/remove_member_modal.vue';
@@ -29,68 +32,51 @@ memberExpirationDate('.js-access-expiration-date-groups');
mountRemoveMemberModal();
initInviteMembersModal();
initInviteMembersTrigger();
+initInviteGroupTrigger();
-new Members(); // eslint-disable-line no-new
-new UsersSelect(); // eslint-disable-line no-new
+// This is only used when `invite_members_group_modal` feature flag is disabled.
+// This can be removed when `invite_members_group_modal` feature flag is removed.
+initInviteMembersForm();
-if (window.gon.features.vueProjectMembersList) {
- const SHARED_FIELDS = ['account', 'expires', 'maxRole', 'expiration', 'actions'];
+new UsersSelect(); // eslint-disable-line no-new
- Promise.all([
- import('~/members/index'),
- import('~/members/utils'),
- import('~/projects/members/utils'),
- import('~/locale'),
- ])
- .then(
- ([
- { initMembersApp },
- { groupLinkRequestFormatter },
- { projectMemberRequestFormatter },
- { s__ },
- ]) => {
- initMembersApp(document.querySelector('.js-project-members-list'), {
- tableFields: SHARED_FIELDS.concat(['source', 'granted']),
- tableAttrs: { tr: { 'data-qa-selector': 'member_row' } },
- tableSortableFields: ['account', 'granted', 'maxRole', 'lastSignIn'],
- requestFormatter: projectMemberRequestFormatter,
- filteredSearchBar: {
- show: true,
- tokens: ['with_inherited_permissions'],
- searchParam: 'search',
- placeholder: s__('Members|Filter members'),
- recentSearchesStorageKey: 'project_members',
- },
- });
+const SHARED_FIELDS = ['account', 'expires', 'maxRole', 'expiration', 'actions'];
+initMembersApp(document.querySelector('.js-project-members-list'), {
+ tableFields: SHARED_FIELDS.concat(['source', 'granted']),
+ tableAttrs: { tr: { 'data-qa-selector': 'member_row' } },
+ tableSortableFields: ['account', 'granted', 'maxRole', 'lastSignIn'],
+ requestFormatter: projectMemberRequestFormatter,
+ filteredSearchBar: {
+ show: true,
+ tokens: ['with_inherited_permissions'],
+ searchParam: 'search',
+ placeholder: s__('Members|Filter members'),
+ recentSearchesStorageKey: 'project_members',
+ },
+});
- initMembersApp(document.querySelector('.js-project-group-links-list'), {
- tableFields: SHARED_FIELDS.concat('granted'),
- tableAttrs: {
- table: { 'data-qa-selector': 'groups_list' },
- tr: { 'data-qa-selector': 'group_row' },
- },
- requestFormatter: groupLinkRequestFormatter,
- filteredSearchBar: {
- show: true,
- tokens: [],
- searchParam: 'search_groups',
- placeholder: s__('Members|Search groups'),
- recentSearchesStorageKey: 'project_group_links',
- },
- });
+initMembersApp(document.querySelector('.js-project-group-links-list'), {
+ tableFields: SHARED_FIELDS.concat('granted'),
+ tableAttrs: {
+ table: { 'data-qa-selector': 'groups_list' },
+ tr: { 'data-qa-selector': 'group_row' },
+ },
+ requestFormatter: groupLinkRequestFormatter,
+ filteredSearchBar: {
+ show: true,
+ tokens: [],
+ searchParam: 'search_groups',
+ placeholder: s__('Members|Search groups'),
+ recentSearchesStorageKey: 'project_group_links',
+ },
+});
- initMembersApp(document.querySelector('.js-project-invited-members-list'), {
- tableFields: SHARED_FIELDS.concat('invited'),
- requestFormatter: projectMemberRequestFormatter,
- });
+initMembersApp(document.querySelector('.js-project-invited-members-list'), {
+ tableFields: SHARED_FIELDS.concat('invited'),
+ requestFormatter: projectMemberRequestFormatter,
+});
- initMembersApp(document.querySelector('.js-project-access-requests-list'), {
- tableFields: SHARED_FIELDS.concat('requested'),
- requestFormatter: projectMemberRequestFormatter,
- });
- },
- )
- .catch(() => {
- flash(__('An error occurred while loading the members, please try again.'));
- });
-}
+initMembersApp(document.querySelector('.js-project-access-requests-list'), {
+ tableFields: SHARED_FIELDS.concat('requested'),
+ requestFormatter: projectMemberRequestFormatter,
+});
diff --git a/app/assets/javascripts/pages/projects/prometheus/metrics/edit/index.js b/app/assets/javascripts/pages/projects/prometheus/metrics/edit/index.js
index 2fd047675b9..82856c1c8b9 100644
--- a/app/assets/javascripts/pages/projects/prometheus/metrics/edit/index.js
+++ b/app/assets/javascripts/pages/projects/prometheus/metrics/edit/index.js
@@ -1,3 +1,3 @@
-import customMetrics from '~/custom_metrics';
+import CustomMetrics from '~/custom_metrics';
-document.addEventListener('DOMContentLoaded', customMetrics);
+CustomMetrics();
diff --git a/app/assets/javascripts/pages/projects/prometheus/metrics/new/index.js b/app/assets/javascripts/pages/projects/prometheus/metrics/new/index.js
index 2fd047675b9..82856c1c8b9 100644
--- a/app/assets/javascripts/pages/projects/prometheus/metrics/new/index.js
+++ b/app/assets/javascripts/pages/projects/prometheus/metrics/new/index.js
@@ -1,3 +1,3 @@
-import customMetrics from '~/custom_metrics';
+import CustomMetrics from '~/custom_metrics';
-document.addEventListener('DOMContentLoaded', customMetrics);
+CustomMetrics();
diff --git a/app/assets/javascripts/pages/projects/settings/access_tokens/index.js b/app/assets/javascripts/pages/projects/settings/access_tokens/index.js
index 22dddb72f98..dc1bb88bf4b 100644
--- a/app/assets/javascripts/pages/projects/settings/access_tokens/index.js
+++ b/app/assets/javascripts/pages/projects/settings/access_tokens/index.js
@@ -1,3 +1,3 @@
-import initExpiresAtField from '~/access_tokens';
+import { initExpiresAtField } from '~/access_tokens';
initExpiresAtField();
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 be9259ec3ca..b7e8d4b03ac 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
@@ -6,6 +6,7 @@ import initDeployFreeze from '~/deploy_freeze';
import { initInstallRunner } from '~/pages/shared/mount_runner_instructions';
import initSharedRunnersToggle from '~/projects/settings/mount_shared_runners_toggle';
import registrySettingsApp from '~/registry/settings/registry_settings_bundle';
+import initSearchSettings from '~/search_settings';
import initSettingsPanels from '~/settings_panels';
document.addEventListener('DOMContentLoaded', () => {
@@ -42,4 +43,6 @@ document.addEventListener('DOMContentLoaded', () => {
}
initInstallRunner();
+
+ initSearchSettings();
});
diff --git a/app/assets/javascripts/pages/projects/settings/operations/show/index.js b/app/assets/javascripts/pages/projects/settings/operations/show/index.js
index 3a46241e2eb..4a800ab150d 100644
--- a/app/assets/javascripts/pages/projects/settings/operations/show/index.js
+++ b/app/assets/javascripts/pages/projects/settings/operations/show/index.js
@@ -3,6 +3,7 @@ import mountErrorTrackingForm from '~/error_tracking_settings';
import mountGrafanaIntegration from '~/grafana_integration';
import initIncidentsSettings from '~/incidents_settings';
import mountOperationSettings from '~/operation_settings';
+import initSearchSettings from '~/search_settings';
import initSettingsPanels from '~/settings_panels';
initIncidentsSettings();
@@ -13,3 +14,7 @@ if (!IS_EE) {
initSettingsPanels();
}
mountAlertsSettings(document.querySelector('.js-alerts-settings'));
+
+document.addEventListener('DOMContentLoaded', () => {
+ initSearchSettings();
+});
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..c7bcbb83051 100644
--- a/app/assets/javascripts/pages/projects/settings/repository/show/index.js
+++ b/app/assets/javascripts/pages/projects/settings/repository/show/index.js
@@ -1,4 +1,5 @@
import MirrorRepos from '~/mirrors/mirror_repos';
+import initSearchSettings from '~/search_settings';
import initForm from '../form';
document.addEventListener('DOMContentLoaded', () => {
@@ -6,4 +7,6 @@ document.addEventListener('DOMContentLoaded', () => {
const mirrorReposContainer = document.querySelector('.js-mirror-settings');
if (mirrorReposContainer) new MirrorRepos(mirrorReposContainer).init();
+
+ initSearchSettings();
});
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 94a9bc168e5..62b565a4856 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
@@ -11,6 +11,7 @@ import {
featureAccessLevelEveryone,
featureAccessLevel,
featureAccessLevelNone,
+ CVE_ID_REQUEST_BUTTON_I18N,
} from '../constants';
import { toggleHiddenClassBySelector } from '../external';
import projectFeatureSetting from './project_feature_setting.vue';
@@ -19,6 +20,10 @@ import projectSettingRow from './project_setting_row.vue';
const PAGE_FEATURE_ACCESS_LEVEL = s__('ProjectSettings|Everyone');
export default {
+ i18n: {
+ ...CVE_ID_REQUEST_BUTTON_I18N,
+ },
+
components: {
projectFeatureSetting,
projectSettingRow,
@@ -31,6 +36,11 @@ export default {
mixins: [settingsMixin, glFeatureFlagsMixin()],
props: {
+ requestCveAvailable: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
currentSettings: {
type: Object,
required: true,
@@ -99,6 +109,11 @@ export default {
required: false,
default: '',
},
+ cveIdRequestHelpPath: {
+ type: String,
+ required: false,
+ default: '',
+ },
registryHelpPath: {
type: String,
required: false,
@@ -152,6 +167,7 @@ export default {
requestAccessEnabled: true,
highlightChangesClass: false,
emailsDisabled: false,
+ cveIdRequestEnabled: true,
featureAccessLevelEveryone,
featureAccessLevelMembers,
};
@@ -230,6 +246,9 @@ export default {
'ProjectSettings|View and edit files in this project. Non-project members will only have read access.',
);
},
+ cveIdRequestIsDisabled() {
+ return this.visibilityLevel !== visibilityOptions.PUBLIC;
+ },
},
watch: {
@@ -417,6 +436,19 @@ export default {
:options="featureAccessLevelOptions"
name="project[project_feature_attributes][issues_access_level]"
/>
+ <project-setting-row
+ v-if="requestCveAvailable"
+ :help-path="cveIdRequestHelpPath"
+ :help-text="$options.i18n.cve_request_toggle_label"
+ >
+ <gl-toggle
+ v-model="cveIdRequestEnabled"
+ class="gl-my-2"
+ :disabled="cveIdRequestIsDisabled"
+ name="project[project_setting_attributes][cve_id_request_enabled]"
+ data-testid="cve_id_request_toggle"
+ />
+ </project-setting-row>
</project-setting-row>
<project-setting-row
ref="repository-settings"
@@ -613,7 +645,9 @@ export default {
<project-setting-row
ref="operations-settings"
:label="s__('ProjectSettings|Operations')"
- :help-text="s__('ProjectSettings|Environments, logs, cluster management, and more.')"
+ :help-text="
+ s__('ProjectSettings|Configure your project resources and monitor their health.')
+ "
>
<project-feature-setting
v-model="operationsAccessLevel"
diff --git a/app/assets/javascripts/pages/projects/shared/permissions/constants.js b/app/assets/javascripts/pages/projects/shared/permissions/constants.js
index 6771391254e..e160fdacca6 100644
--- a/app/assets/javascripts/pages/projects/shared/permissions/constants.js
+++ b/app/assets/javascripts/pages/projects/shared/permissions/constants.js
@@ -1,4 +1,4 @@
-import { __ } from '~/locale';
+import { s__, __ } from '~/locale';
export const visibilityOptions = {
PRIVATE: 0,
@@ -42,3 +42,7 @@ export const featureAccessLevelEveryone = [
featureAccessLevel.EVERYONE,
featureAccessLevelDescriptions[featureAccessLevel.EVERYONE],
];
+
+export const CVE_ID_REQUEST_BUTTON_I18N = {
+ cve_request_toggle_label: s__('CVE|Enable CVE ID requests in the issue sidebar'),
+};
diff --git a/app/assets/javascripts/pages/projects/show/index.js b/app/assets/javascripts/pages/projects/show/index.js
index 0494dad6e33..a0831c7df41 100644
--- a/app/assets/javascripts/pages/projects/show/index.js
+++ b/app/assets/javascripts/pages/projects/show/index.js
@@ -3,20 +3,15 @@ import Activities from '~/activities';
import ShortcutsNavigation from '~/behaviors/shortcuts/shortcuts_navigation';
import BlobViewer from '~/blob/viewer/index';
import { initUploadForm } from '~/blob_edit/blob_bundle';
-import initInviteMembersModal from '~/invite_members/init_invite_members_modal';
-import initInviteMembersTrigger from '~/invite_members/init_invite_members_trigger';
import leaveByUrl from '~/namespaces/leave_by_url';
import initVueNotificationsDropdown from '~/notifications';
-import NotificationsForm from '~/notifications_form';
import initReadMore from '~/read_more';
import UserCallout from '~/user_callout';
-import notificationsDropdown from '../../../notifications_dropdown';
import Star from '../../../star';
initReadMore();
new Star(); // eslint-disable-line no-new
-new NotificationsForm(); // eslint-disable-line no-new
// eslint-disable-next-line no-new
new UserCallout({
setCalloutPerProject: false,
@@ -24,9 +19,12 @@ new UserCallout({
});
// Project show page loads different overview content based on user preferences
-const treeSlider = document.getElementById('js-tree-list');
-if (treeSlider) {
+
+if (document.querySelector('.js-upload-blob-form')) {
initUploadForm();
+}
+
+if (document.getElementById('js-tree-list')) {
initTree();
}
@@ -40,15 +38,6 @@ if (document.querySelector('.project-show-activity')) {
leaveByUrl('project');
-if (gon.features?.vueNotificationDropdown) {
- initVueNotificationsDropdown();
-} else {
- notificationsDropdown();
-}
-
initVueNotificationsDropdown();
new ShortcutsNavigation(); // eslint-disable-line no-new
-
-initInviteMembersTrigger();
-initInviteMembersModal();
diff --git a/app/assets/javascripts/pages/projects/tags/new/index.js b/app/assets/javascripts/pages/projects/tags/new/index.js
index 11a19a673b1..b071e7a45fc 100644
--- a/app/assets/javascripts/pages/projects/tags/new/index.js
+++ b/app/assets/javascripts/pages/projects/tags/new/index.js
@@ -3,8 +3,6 @@ import GLForm from '../../../../gl_form';
import RefSelectDropdown from '../../../../ref_select_dropdown';
import ZenMode from '../../../../zen_mode';
-document.addEventListener('DOMContentLoaded', () => {
- new ZenMode(); // eslint-disable-line no-new
- new GLForm($('.tag-form')); // eslint-disable-line no-new
- new RefSelectDropdown($('.js-branch-select')); // eslint-disable-line no-new
-});
+new ZenMode(); // eslint-disable-line no-new
+new GLForm($('.tag-form')); // eslint-disable-line no-new
+new RefSelectDropdown($('.js-branch-select')); // eslint-disable-line no-new
diff --git a/app/assets/javascripts/pages/projects/tags/releases/index.js b/app/assets/javascripts/pages/projects/tags/releases/index.js
index abdc97f62d0..cafd880b4be 100644
--- a/app/assets/javascripts/pages/projects/tags/releases/index.js
+++ b/app/assets/javascripts/pages/projects/tags/releases/index.js
@@ -2,7 +2,5 @@ import $ from 'jquery';
import GLForm from '~/gl_form';
import ZenMode from '~/zen_mode';
-document.addEventListener('DOMContentLoaded', () => {
- new ZenMode(); // eslint-disable-line no-new
- new GLForm($('.release-form')); // eslint-disable-line no-new
-});
+new ZenMode(); // eslint-disable-line no-new
+new GLForm($('.release-form')); // eslint-disable-line no-new
diff --git a/app/assets/javascripts/pages/search/show/index.js b/app/assets/javascripts/pages/search/show/index.js
index a8c288c3663..2ee33584ee1 100644
--- a/app/assets/javascripts/pages/search/show/index.js
+++ b/app/assets/javascripts/pages/search/show/index.js
@@ -1,5 +1,3 @@
import { initSearchApp } from '~/search';
-document.addEventListener('DOMContentLoaded', () => {
- initSearchApp();
-});
+initSearchApp();
diff --git a/app/assets/javascripts/pages/shared/wikis/components/wiki_alert.vue b/app/assets/javascripts/pages/shared/wikis/components/wiki_alert.vue
new file mode 100644
index 00000000000..6cea26f2bed
--- /dev/null
+++ b/app/assets/javascripts/pages/shared/wikis/components/wiki_alert.vue
@@ -0,0 +1,31 @@
+<script>
+import { GlAlert, GlLink, GlSprintf } from '@gitlab/ui';
+
+export default {
+ components: {
+ GlAlert,
+ GlLink,
+ GlSprintf,
+ },
+ props: {
+ error: {
+ type: String,
+ required: true,
+ },
+ wikiPagePath: {
+ type: String,
+ required: true,
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-alert variant="danger" :dismissible="false">
+ <gl-sprintf :message="error">
+ <template #wikiLink="{ content }">
+ <gl-link :href="wikiPagePath" target="_blank">{{ content }}</gl-link>
+ </template>
+ </gl-sprintf>
+ </gl-alert>
+</template>
diff --git a/app/assets/javascripts/pages/shared/wikis/index.js b/app/assets/javascripts/pages/shared/wikis/index.js
index c8dc75828e4..c382a372260 100644
--- a/app/assets/javascripts/pages/shared/wikis/index.js
+++ b/app/assets/javascripts/pages/shared/wikis/index.js
@@ -6,9 +6,10 @@ import Translate from '~/vue_shared/translate';
import GLForm from '../../../gl_form';
import ZenMode from '../../../zen_mode';
import deleteWikiModal from './components/delete_wiki_modal.vue';
+import wikiAlert from './components/wiki_alert.vue';
import Wikis from './wikis';
-export default () => {
+const createModalVueApp = () => {
new Wikis(); // eslint-disable-line no-new
new ShortcutsWiki(); // eslint-disable-line no-new
new ZenMode(); // eslint-disable-line no-new
@@ -39,3 +40,28 @@ export default () => {
});
}
};
+
+const createAlertVueApp = () => {
+ const el = document.getElementById('js-wiki-error');
+ if (el) {
+ const { error, wikiPagePath } = el.dataset;
+
+ // eslint-disable-next-line no-new
+ new Vue({
+ el,
+ render(createElement) {
+ return createElement(wikiAlert, {
+ props: {
+ error,
+ wikiPagePath,
+ },
+ });
+ },
+ });
+ }
+};
+
+export default () => {
+ createModalVueApp();
+ createAlertVueApp();
+};
diff --git a/app/assets/javascripts/pages/users/index.js b/app/assets/javascripts/pages/users/index.js
index b22287a0093..58ceb524360 100644
--- a/app/assets/javascripts/pages/users/index.js
+++ b/app/assets/javascripts/pages/users/index.js
@@ -15,9 +15,7 @@ function initUserProfile(action) {
});
}
-document.addEventListener('DOMContentLoaded', () => {
- const page = $('body').attr('data-page');
- const action = page.split(':')[1];
- initUserProfile(action);
- new UserCallout(); // eslint-disable-line no-new
-});
+const page = $('body').attr('data-page');
+const action = page.split(':')[1];
+initUserProfile(action);
+new UserCallout(); // eslint-disable-line no-new
diff --git a/app/assets/javascripts/performance/constants.js b/app/assets/javascripts/performance/constants.js
index 069f3c265f3..4ac758550e0 100644
--- a/app/assets/javascripts/performance/constants.js
+++ b/app/assets/javascripts/performance/constants.js
@@ -54,3 +54,24 @@ export const MR_DIFFS_MARK_DIFF_FILES_END = 'mr-diffs-mark-diff-files-end';
// Measures
export const MR_DIFFS_MEASURE_FILE_TREE_DONE = 'mr-diffs-measure-file-tree-done';
export const MR_DIFFS_MEASURE_DIFF_FILES_DONE = 'mr-diffs-measure-diff-files-done';
+
+//
+// Pipelines Detail namespace
+//
+
+// Marks
+export const PIPELINES_DETAIL_LINKS_MARK_CALCULATE_START =
+ 'pipelines-detail-links-mark-calculate-start';
+export const PIPELINES_DETAIL_LINKS_MARK_CALCULATE_END =
+ 'pipelines-detail-links-mark-calculate-end';
+
+// Measures
+export const PIPELINES_DETAIL_LINKS_MEASURE_CALCULATION =
+ 'Pipelines Detail Graph: Links Calculation';
+
+// Metrics
+// Note: These strings must match the backend
+// (defined in: app/services/ci/prometheus_metrics/observe_histograms_service.rb)
+export const PIPELINES_DETAIL_LINK_DURATION = 'pipeline_graph_link_calculation_duration_seconds';
+export const PIPELINES_DETAIL_LINKS_TOTAL = 'pipeline_graph_links_total';
+export const PIPELINES_DETAIL_LINKS_JOB_RATIO = 'pipeline_graph_link_per_job_ratio';
diff --git a/app/assets/javascripts/performance_bar/components/performance_bar_app.vue b/app/assets/javascripts/performance_bar/components/performance_bar_app.vue
index 85789cd1fdf..6b446eb6073 100644
--- a/app/assets/javascripts/performance_bar/components/performance_bar_app.vue
+++ b/app/assets/javascripts/performance_bar/components/performance_bar_app.vue
@@ -30,13 +30,17 @@ export default {
type: String,
required: true,
},
+ statsUrl: {
+ type: String,
+ required: true,
+ },
},
detailedMetrics: [
{
metric: 'active-record',
title: 'pg',
header: s__('PerformanceBar|SQL queries'),
- keys: ['sql', 'cached'],
+ keys: ['sql', 'cached', 'db_role'],
},
{
metric: 'bullet',
@@ -169,6 +173,9 @@ export default {
class="ml-auto"
@change-current-request="changeCurrentRequest"
/>
+ <div v-if="statsUrl" id="peek-stats" class="view">
+ <a class="gl-text-blue-300" :href="statsUrl">{{ s__('PerformanceBar|Stats') }}</a>
+ </div>
</div>
</div>
</template>
diff --git a/app/assets/javascripts/performance_bar/index.js b/app/assets/javascripts/performance_bar/index.js
index 522e34753e9..51b6108868f 100644
--- a/app/assets/javascripts/performance_bar/index.js
+++ b/app/assets/javascripts/performance_bar/index.js
@@ -29,6 +29,7 @@ const initPerformanceBar = (el) => {
requestId: performanceBarData.requestId,
peekUrl: performanceBarData.peekUrl,
profileUrl: performanceBarData.profileUrl,
+ statsUrl: performanceBarData.statsUrl,
};
},
mounted() {
@@ -119,6 +120,7 @@ const initPerformanceBar = (el) => {
requestId: this.requestId,
peekUrl: this.peekUrl,
profileUrl: this.profileUrl,
+ statsUrl: this.statsUrl,
},
on: {
'add-request': this.addRequestManually,
diff --git a/app/assets/javascripts/pipeline_editor/components/commit/commit_form.vue b/app/assets/javascripts/pipeline_editor/components/commit/commit_form.vue
index 9279273283e..b088678fee8 100644
--- a/app/assets/javascripts/pipeline_editor/components/commit/commit_form.vue
+++ b/app/assets/javascripts/pipeline_editor/components/commit/commit_form.vue
@@ -21,7 +21,7 @@ export default {
GlSprintf,
},
props: {
- defaultBranch: {
+ currentBranch: {
type: String,
required: false,
default: '',
@@ -40,23 +40,23 @@ export default {
data() {
return {
message: this.defaultMessage,
- branch: this.defaultBranch,
openMergeRequest: false,
+ targetBranch: this.currentBranch,
};
},
computed: {
- isDefaultBranch() {
- return this.branch === this.defaultBranch;
+ isCurrentBranchTarget() {
+ return this.targetBranch === this.currentBranch;
},
submitDisabled() {
- return !(this.message && this.branch);
+ return !(this.message && this.targetBranch);
},
},
methods: {
onSubmit() {
this.$emit('submit', {
message: this.message,
- branch: this.branch,
+ targetBranch: this.targetBranch,
openMergeRequest: this.openMergeRequest,
});
},
@@ -100,12 +100,12 @@ export default {
>
<gl-form-input
id="target-branch-field"
- v-model="branch"
+ v-model="targetBranch"
class="gl-font-monospace!"
required
/>
<gl-form-checkbox
- v-if="!isDefaultBranch"
+ v-if="!isCurrentBranchTarget"
v-model="openMergeRequest"
data-testid="new-mr-checkbox"
class="gl-mt-3"
diff --git a/app/assets/javascripts/pipeline_editor/components/commit/commit_section.vue b/app/assets/javascripts/pipeline_editor/components/commit/commit_section.vue
index b40c9a48903..0640b9c35df 100644
--- a/app/assets/javascripts/pipeline_editor/components/commit/commit_section.vue
+++ b/app/assets/javascripts/pipeline_editor/components/commit/commit_section.vue
@@ -4,6 +4,7 @@ import { __, s__, sprintf } from '~/locale';
import { COMMIT_FAILURE, COMMIT_SUCCESS } from '../../constants';
import commitCIFile from '../../graphql/mutations/commit_ci_file.mutation.graphql';
import getCommitSha from '../../graphql/queries/client/commit_sha.graphql';
+import getCurrentBranch from '../../graphql/queries/client/current_branch.graphql';
import CommitForm from './commit_form.vue';
@@ -21,7 +22,7 @@ export default {
components: {
CommitForm,
},
- inject: ['projectFullPath', 'ciConfigPath', 'defaultBranch', 'newMergeRequestPath'],
+ inject: ['projectFullPath', 'ciConfigPath', 'newMergeRequestPath'],
props: {
ciFileContent: {
type: String,
@@ -38,6 +39,9 @@ export default {
commitSha: {
query: getCommitSha,
},
+ currentBranch: {
+ query: getCurrentBranch,
+ },
},
computed: {
defaultCommitMessage() {
@@ -49,13 +53,13 @@ export default {
const url = mergeUrlParams(
{
[MR_SOURCE_BRANCH]: sourceBranch,
- [MR_TARGET_BRANCH]: this.defaultBranch,
+ [MR_TARGET_BRANCH]: this.currentBranch,
},
this.newMergeRequestPath,
);
redirectTo(url);
},
- async onCommitSubmit({ message, branch, openMergeRequest }) {
+ async onCommitSubmit({ message, targetBranch, openMergeRequest }) {
this.isSaving = true;
try {
@@ -67,8 +71,8 @@ export default {
mutation: commitCIFile,
variables: {
projectPath: this.projectFullPath,
- branch,
- startBranch: this.defaultBranch,
+ branch: targetBranch,
+ startBranch: this.currentBranch,
message,
filePath: this.ciConfigPath,
content: this.ciFileContent,
@@ -86,7 +90,7 @@ export default {
if (errors?.length) {
this.$emit('showError', { type: COMMIT_FAILURE, reasons: errors });
} else if (openMergeRequest) {
- this.redirectToNewMergeRequest(branch);
+ this.redirectToNewMergeRequest(targetBranch);
} else {
this.$emit('commit', { type: COMMIT_SUCCESS });
}
@@ -105,7 +109,7 @@ export default {
<template>
<commit-form
- :default-branch="defaultBranch"
+ :current-branch="currentBranch"
:default-message="defaultCommitMessage"
:is-saving="isSaving"
@cancel="onCommitCancel"
diff --git a/app/assets/javascripts/pipeline_editor/components/editor/ci_config_merged_preview.vue b/app/assets/javascripts/pipeline_editor/components/editor/ci_config_merged_preview.vue
index 007faa4ed0d..f36b22f33c3 100644
--- a/app/assets/javascripts/pipeline_editor/components/editor/ci_config_merged_preview.vue
+++ b/app/assets/javascripts/pipeline_editor/components/editor/ci_config_merged_preview.vue
@@ -82,7 +82,7 @@ export default {
</gl-alert>
<div v-else>
<div class="gl-display-flex gl-align-items-center">
- <gl-icon :size="18" name="lock" class="gl-text-gray-500 gl-mr-3" />
+ <gl-icon :size="18" name="lock" use-deprecated-sizes class="gl-text-gray-500 gl-mr-3" />
{{ $options.i18n.viewOnlyMessage }}
</div>
<div class="gl-mt-3 gl-border-solid gl-border-gray-100 gl-border-1">
diff --git a/app/assets/javascripts/pipeline_editor/components/header/pipeline_editor_header.vue b/app/assets/javascripts/pipeline_editor/components/header/pipeline_editor_header.vue
index ab41c0170e9..7a35e31e9ce 100644
--- a/app/assets/javascripts/pipeline_editor/components/header/pipeline_editor_header.vue
+++ b/app/assets/javascripts/pipeline_editor/components/header/pipeline_editor_header.vue
@@ -1,13 +1,40 @@
<script>
+import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
+import PipelineStatus from './pipeline_status.vue';
import ValidationSegment from './validation_segment.vue';
+const baseClasses = ['gl-p-5', 'gl-bg-gray-10', 'gl-border-solid', 'gl-border-gray-100'];
+
+const pipelineStatusClasses = [
+ ...baseClasses,
+ 'gl-border-1',
+ 'gl-border-b-0!',
+ 'gl-rounded-top-base',
+];
+
+const validationSegmentClasses = [...baseClasses, 'gl-border-1', 'gl-rounded-base'];
+
+const validationSegmentWithPipelineStatusClasses = [
+ ...baseClasses,
+ 'gl-border-1',
+ 'gl-rounded-bottom-left-base',
+ 'gl-rounded-bottom-right-base',
+];
+
export default {
- validationSegmentClasses:
- 'gl-p-5 gl-bg-gray-10 gl-border-solid gl-border-1 gl-border-gray-100 gl-rounded-base',
+ pipelineStatusClasses,
+ validationSegmentClasses,
+ validationSegmentWithPipelineStatusClasses,
components: {
+ PipelineStatus,
ValidationSegment,
},
+ mixins: [glFeatureFlagsMixin()],
props: {
+ ciFileContent: {
+ type: String,
+ required: true,
+ },
ciConfigData: {
type: Object,
required: true,
@@ -17,13 +44,27 @@ export default {
required: true,
},
},
+ computed: {
+ showPipelineStatus() {
+ return this.glFeatures.pipelineStatusForPipelineEditor;
+ },
+ // make sure corners are rounded correctly depending on if
+ // pipeline status is rendered
+ validationStyling() {
+ return this.showPipelineStatus
+ ? this.$options.validationSegmentWithPipelineStatusClasses
+ : this.$options.validationSegmentClasses;
+ },
+ },
};
</script>
<template>
<div class="gl-mb-5">
+ <pipeline-status v-if="showPipelineStatus" :class="$options.pipelineStatusClasses" />
<validation-segment
- :class="$options.validationSegmentClasses"
+ :class="validationStyling"
:loading="isCiConfigDataLoading"
+ :ci-file-content="ciFileContent"
:ci-config="ciConfigData"
/>
</div>
diff --git a/app/assets/javascripts/pipeline_editor/components/header/pipeline_status.vue b/app/assets/javascripts/pipeline_editor/components/header/pipeline_status.vue
new file mode 100644
index 00000000000..b1ea464be99
--- /dev/null
+++ b/app/assets/javascripts/pipeline_editor/components/header/pipeline_status.vue
@@ -0,0 +1,120 @@
+<script>
+import { GlIcon, GlLink, GlLoadingIcon, GlSprintf } from '@gitlab/ui';
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
+import { s__ } from '~/locale';
+import getCommitSha from '~/pipeline_editor/graphql/queries/client/commit_sha.graphql';
+import getPipelineQuery from '~/pipeline_editor/graphql/queries/client/pipeline.graphql';
+import CiIcon from '~/vue_shared/components/ci_icon.vue';
+
+const POLL_INTERVAL = 10000;
+export const i18n = {
+ fetchError: s__('Pipeline|We are currently unable to fetch pipeline data'),
+ fetchLoading: s__('Pipeline|Checking pipeline status'),
+ pipelineInfo: s__(
+ `Pipeline|Pipeline %{idStart}#%{idEnd} %{statusStart}%{statusEnd} for %{commitStart}%{commitEnd}`,
+ ),
+};
+
+export default {
+ i18n,
+ components: {
+ CiIcon,
+ GlIcon,
+ GlLink,
+ GlLoadingIcon,
+ GlSprintf,
+ },
+ inject: ['projectFullPath'],
+ apollo: {
+ commitSha: {
+ query: getCommitSha,
+ },
+ pipeline: {
+ query: getPipelineQuery,
+ variables() {
+ return {
+ fullPath: this.projectFullPath,
+ sha: this.commitSha,
+ };
+ },
+ update: (data) => {
+ const { id, commitPath = '', shortSha = '', detailedStatus = {} } =
+ data.project?.pipeline || {};
+
+ return {
+ id,
+ commitPath,
+ shortSha,
+ detailedStatus,
+ };
+ },
+ error() {
+ this.hasError = true;
+ },
+ pollInterval: POLL_INTERVAL,
+ },
+ },
+ data() {
+ return {
+ hasError: false,
+ };
+ },
+ computed: {
+ hasPipelineData() {
+ return Boolean(this.$apollo.queries.pipeline?.id);
+ },
+ isQueryLoading() {
+ return this.$apollo.queries.pipeline.loading && !this.hasPipelineData;
+ },
+ status() {
+ return this.pipeline.detailedStatus;
+ },
+ pipelineId() {
+ return getIdFromGraphQLId(this.pipeline.id);
+ },
+ },
+};
+</script>
+
+<template>
+ <div class="gl-white-space-nowrap gl-max-w-full">
+ <template v-if="isQueryLoading">
+ <gl-loading-icon class="gl-mr-auto gl-display-inline-block" size="sm" />
+ <span data-testid="pipeline-loading-msg">{{ $options.i18n.fetchLoading }}</span>
+ </template>
+ <template v-else-if="hasError">
+ <gl-icon class="gl-mr-auto" name="warning-solid" />
+ <span data-testid="pipeline-error-msg">{{ $options.i18n.fetchError }}</span>
+ </template>
+ <template v-else>
+ <a :href="status.detailsPath" class="gl-mr-auto">
+ <ci-icon :status="status" :size="18" />
+ </a>
+ <span class="gl-font-weight-bold">
+ <gl-sprintf :message="$options.i18n.pipelineInfo">
+ <template #id="{ content }">
+ <gl-link
+ :href="status.detailsPath"
+ class="pipeline-id gl-font-weight-normal pipeline-number"
+ target="_blank"
+ data-testid="pipeline-id"
+ >
+ {{ content }}{{ pipelineId }}</gl-link
+ >
+ </template>
+ <template #status>{{ status.text }}</template>
+ <template #commit>
+ <gl-link
+ :href="pipeline.commitPath"
+ class="commit-sha gl-font-weight-normal"
+ target="_blank"
+ data-testid="pipeline-commit"
+ >
+ {{ pipeline.shortSha }}
+ </gl-link>
+ </template>
+ </gl-sprintf>
+ </span>
+ </template>
+ </div>
+</template>
diff --git a/app/assets/javascripts/pipeline_editor/components/header/validation_segment.vue b/app/assets/javascripts/pipeline_editor/components/header/validation_segment.vue
index 94fb3a66fdd..541ab74b177 100644
--- a/app/assets/javascripts/pipeline_editor/components/header/validation_segment.vue
+++ b/app/assets/javascripts/pipeline_editor/components/header/validation_segment.vue
@@ -5,6 +5,9 @@ import TooltipOnTruncate from '~/vue_shared/components/tooltip_on_truncate.vue';
import { CI_CONFIG_STATUS_VALID } from '../../constants';
export const i18n = {
+ empty: __(
+ "We'll continuously validate your pipeline configuration. The validation results will appear here.",
+ ),
learnMore: __('Learn more'),
loading: s__('Pipelines|Validating GitLab CI configuration…'),
invalid: s__('Pipelines|This GitLab CI configuration is invalid.'),
@@ -26,6 +29,10 @@ export default {
},
},
props: {
+ ciFileContent: {
+ type: String,
+ required: true,
+ },
ciConfig: {
type: Object,
required: false,
@@ -38,17 +45,22 @@ export default {
},
},
computed: {
+ isEmpty() {
+ return !this.ciFileContent;
+ },
isValid() {
return this.ciConfig?.status === CI_CONFIG_STATUS_VALID;
},
icon() {
- if (this.isValid) {
+ if (this.isValid || this.isEmpty) {
return 'check';
}
return 'warning-solid';
},
message() {
- if (this.isValid) {
+ if (this.isEmpty) {
+ return this.$options.i18n.empty;
+ } else if (this.isValid) {
return this.$options.i18n.valid;
}
@@ -74,7 +86,7 @@ export default {
<tooltip-on-truncate :title="message" class="gl-text-truncate">
<gl-icon :name="icon" /> <span data-testid="validationMsg">{{ message }}</span>
</tooltip-on-truncate>
- <span class="gl-flex-shrink-0 gl-pl-2">
+ <span v-if="!isEmpty" class="gl-flex-shrink-0 gl-pl-2">
<gl-link data-testid="learnMoreLink" :href="ymlHelpPagePath">
{{ $options.i18n.learnMore }}
</gl-link>
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
new file mode 100644
index 00000000000..d4f04a0d055
--- /dev/null
+++ b/app/assets/javascripts/pipeline_editor/components/ui/pipeline_editor_empty_state.vue
@@ -0,0 +1,56 @@
+<script>
+import { GlButton, GlSprintf } from '@gitlab/ui';
+import { __ } from '~/locale';
+import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
+
+export default {
+ components: {
+ GlButton,
+ GlSprintf,
+ },
+ i18n: {
+ title: __('Optimize your workflow with CI/CD Pipelines'),
+ 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'),
+ },
+ mixins: [glFeatureFlagsMixin()],
+ inject: {
+ emptyStateIllustrationPath: {
+ default: '',
+ },
+ },
+ computed: {
+ showCTAButton() {
+ return this.glFeatures.pipelineEditorEmptyStateAction;
+ },
+ },
+ methods: {
+ createEmptyConfigFile() {
+ this.$emit('createEmptyConfigFile');
+ },
+ },
+};
+</script>
+<template>
+ <div class="gl-display-flex gl-flex-direction-column gl-align-items-center gl-mt-11">
+ <img :src="emptyStateIllustrationPath" />
+ <h1 class="gl-font-size-h1">{{ $options.i18n.title }}</h1>
+ <p class="gl-mt-3">
+ <gl-sprintf :message="$options.i18n.body">
+ <template #code="{ content }">
+ <code>{{ content }}</code>
+ </template>
+ </gl-sprintf>
+ </p>
+ <gl-button
+ v-if="showCTAButton"
+ variant="confirm"
+ class="gl-mt-3"
+ @click="createEmptyConfigFile"
+ >
+ {{ $options.i18n.btnText }}
+ </gl-button>
+ </div>
+</template>
diff --git a/app/assets/javascripts/pipeline_editor/constants.js b/app/assets/javascripts/pipeline_editor/constants.js
index e676fdeae02..471de7e4f75 100644
--- a/app/assets/javascripts/pipeline_editor/constants.js
+++ b/app/assets/javascripts/pipeline_editor/constants.js
@@ -5,7 +5,6 @@ export const COMMIT_FAILURE = 'COMMIT_FAILURE';
export const COMMIT_SUCCESS = 'COMMIT_SUCCESS';
export const DEFAULT_FAILURE = 'DEFAULT_FAILURE';
-export const LOAD_FAILURE_NO_FILE = 'LOAD_FAILURE_NO_FILE';
export const LOAD_FAILURE_UNKNOWN = 'LOAD_FAILURE_UNKNOWN';
export const CREATE_TAB = 'CREATE_TAB';
diff --git a/app/assets/javascripts/pipeline_editor/graphql/queries/client/current_branch.graphql b/app/assets/javascripts/pipeline_editor/graphql/queries/client/current_branch.graphql
new file mode 100644
index 00000000000..acd46013f5b
--- /dev/null
+++ b/app/assets/javascripts/pipeline_editor/graphql/queries/client/current_branch.graphql
@@ -0,0 +1,3 @@
+query getCurrentBranch {
+ currentBranch @client
+}
diff --git a/app/assets/javascripts/pipeline_editor/graphql/queries/client/pipeline.graphql b/app/assets/javascripts/pipeline_editor/graphql/queries/client/pipeline.graphql
new file mode 100644
index 00000000000..7cc7f92fb60
--- /dev/null
+++ b/app/assets/javascripts/pipeline_editor/graphql/queries/client/pipeline.graphql
@@ -0,0 +1,17 @@
+query getPipeline($fullPath: ID!, $sha: String!) {
+ project(fullPath: $fullPath) @client {
+ pipeline(sha: $sha) {
+ commitPath
+ id
+ iid
+ shortSha
+ status
+ detailedStatus {
+ detailsPath
+ icon
+ group
+ text
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/pipeline_editor/graphql/resolvers.js b/app/assets/javascripts/pipeline_editor/graphql/resolvers.js
index 81e75c32846..13f6200693b 100644
--- a/app/assets/javascripts/pipeline_editor/graphql/resolvers.js
+++ b/app/assets/javascripts/pipeline_editor/graphql/resolvers.js
@@ -11,6 +11,29 @@ export const resolvers = {
}),
};
},
+
+ /* eslint-disable @gitlab/require-i18n-strings */
+ project() {
+ return {
+ __typename: 'Project',
+ pipeline: {
+ __typename: 'Pipeline',
+ commitPath: `/-/commit/aabbccdd`,
+ id: 'gid://gitlab/Ci::Pipeline/118',
+ iid: '28',
+ shortSha: 'aabbccdd',
+ status: 'SUCCESS',
+ detailedStatus: {
+ __typename: 'DetailedStatus',
+ detailsPath: '/root/sample-ci-project/-/pipelines/118"',
+ group: 'success',
+ icon: 'status_success',
+ text: 'passed',
+ },
+ },
+ };
+ },
+ /* eslint-enable @gitlab/require-i18n-strings */
},
Mutation: {
lintCI: (_, { endpoint, content, dry_run }) => {
diff --git a/app/assets/javascripts/pipeline_editor/index.js b/app/assets/javascripts/pipeline_editor/index.js
index dc427f55b5f..b17ec2d5c25 100644
--- a/app/assets/javascripts/pipeline_editor/index.js
+++ b/app/assets/javascripts/pipeline_editor/index.js
@@ -22,9 +22,11 @@ export const initPipelineEditor = (selector = '#js-pipeline-editor') => {
const {
// Add to apollo cache as it can be updated by future queries
commitSha,
+ initialBranchName,
// Add to provide/inject API for static values
ciConfigPath,
defaultBranch,
+ emptyStateIllustrationPath,
lintHelpPagePath,
newMergeRequestPath,
projectFullPath,
@@ -41,6 +43,7 @@ export const initPipelineEditor = (selector = '#js-pipeline-editor') => {
apolloProvider.clients.defaultClient.cache.writeData({
data: {
+ currentBranch: initialBranchName || defaultBranch,
commitSha,
},
});
@@ -51,6 +54,7 @@ export const initPipelineEditor = (selector = '#js-pipeline-editor') => {
provide: {
ciConfigPath,
defaultBranch,
+ emptyStateIllustrationPath,
lintHelpPagePath,
newMergeRequestPath,
projectFullPath,
diff --git a/app/assets/javascripts/pipeline_editor/pipeline_editor_app.vue b/app/assets/javascripts/pipeline_editor/pipeline_editor_app.vue
index b4a818e2472..a402f0011e5 100644
--- a/app/assets/javascripts/pipeline_editor/pipeline_editor_app.vue
+++ b/app/assets/javascripts/pipeline_editor/pipeline_editor_app.vue
@@ -1,19 +1,15 @@
<script>
import { GlAlert, GlLoadingIcon } from '@gitlab/ui';
import httpStatusCodes from '~/lib/utils/http_status';
-import { __, s__, sprintf } from '~/locale';
+import { __, s__ } from '~/locale';
import { unwrapStagesWithNeeds } from '~/pipelines/components/unwrapping_utils';
import ConfirmUnsavedChangesDialog from './components/ui/confirm_unsaved_changes_dialog.vue';
-import {
- COMMIT_FAILURE,
- COMMIT_SUCCESS,
- DEFAULT_FAILURE,
- LOAD_FAILURE_NO_FILE,
- LOAD_FAILURE_UNKNOWN,
-} from './constants';
+import PipelineEditorEmptyState from './components/ui/pipeline_editor_empty_state.vue';
+import { COMMIT_FAILURE, COMMIT_SUCCESS, DEFAULT_FAILURE, LOAD_FAILURE_UNKNOWN } from './constants';
import getBlobContent from './graphql/queries/blob_content.graphql';
import getCiConfigData from './graphql/queries/ci_config.graphql';
+import getCurrentBranch from './graphql/queries/client/current_branch.graphql';
import PipelineEditorHome from './pipeline_editor_home.vue';
export default {
@@ -21,15 +17,13 @@ export default {
ConfirmUnsavedChangesDialog,
GlAlert,
GlLoadingIcon,
+ PipelineEditorEmptyState,
PipelineEditorHome,
},
inject: {
ciConfigPath: {
default: '',
},
- defaultBranch: {
- default: null,
- },
projectFullPath: {
default: '',
},
@@ -40,6 +34,8 @@ export default {
// Success and failure state
failureType: null,
failureReasons: [],
+ showStartScreen: false,
+ isNewConfigFile: false,
initialCiFileContent: '',
lastCommittedContent: '',
currentCiFileContent: '',
@@ -51,11 +47,16 @@ export default {
apollo: {
initialCiFileContent: {
query: getBlobContent,
+ // If we are working off a new file, we don't want to fetch
+ // the base data as there is nothing to fetch.
+ skip({ isNewConfigFile }) {
+ return isNewConfigFile;
+ },
variables() {
return {
projectPath: this.projectFullPath,
path: this.ciConfigPath,
- ref: this.defaultBranch,
+ ref: this.currentBranch,
};
},
update(data) {
@@ -94,6 +95,9 @@ export default {
this.reportFailure(LOAD_FAILURE_UNKNOWN);
},
},
+ currentBranch: {
+ query: getCurrentBranch,
+ },
},
computed: {
hasUnsavedChanges() {
@@ -102,21 +106,11 @@ export default {
isBlobContentLoading() {
return this.$apollo.queries.initialCiFileContent.loading;
},
- isBlobContentError() {
- return this.failureType === LOAD_FAILURE_NO_FILE;
- },
isCiConfigDataLoading() {
return this.$apollo.queries.ciConfigData.loading;
},
failure() {
switch (this.failureType) {
- case LOAD_FAILURE_NO_FILE:
- return {
- text: sprintf(this.$options.errorTexts[LOAD_FAILURE_NO_FILE], {
- filePath: this.ciConfigPath,
- }),
- variant: 'danger',
- };
case LOAD_FAILURE_UNKNOWN:
return {
text: this.$options.errorTexts[LOAD_FAILURE_UNKNOWN],
@@ -154,9 +148,6 @@ export default {
errorTexts: {
[COMMIT_FAILURE]: s__('Pipelines|The GitLab CI configuration could not be updated.'),
[DEFAULT_FAILURE]: __('Something went wrong on our end.'),
- [LOAD_FAILURE_NO_FILE]: s__(
- 'Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again.',
- ),
[LOAD_FAILURE_UNKNOWN]: s__('Pipelines|The CI configuration was not loaded, please try again.'),
},
successTexts: {
@@ -173,7 +164,7 @@ export default {
response?.status === httpStatusCodes.NOT_FOUND ||
response?.status === httpStatusCodes.BAD_REQUEST
) {
- this.reportFailure(LOAD_FAILURE_NO_FILE);
+ this.showStartScreen = true;
} else {
this.reportFailure(LOAD_FAILURE_UNKNOWN);
}
@@ -186,17 +177,23 @@ export default {
this.showSuccessAlert = false;
},
reportFailure(type, reasons = []) {
+ window.scrollTo({ top: 0, behavior: 'smooth' });
this.showFailureAlert = true;
this.failureType = type;
this.failureReasons = reasons;
},
reportSuccess(type) {
+ window.scrollTo({ top: 0, behavior: 'smooth' });
this.showSuccessAlert = true;
this.successType = type;
},
resetContent() {
this.currentCiFileContent = this.lastCommittedContent;
},
+ setNewEmptyCiConfigFile() {
+ this.showStartScreen = false;
+ this.isNewConfigFile = true;
+ },
showErrorAlert({ type, reasons = [] }) {
this.reportFailure(type, reasons);
},
@@ -214,18 +211,22 @@ export default {
</script>
<template>
- <div class="gl-mt-4">
- <gl-alert v-if="showSuccessAlert" :variant="success.variant" @dismiss="dismissSuccess">
- {{ success.text }}
- </gl-alert>
- <gl-alert v-if="showFailureAlert" :variant="failure.variant" @dismiss="dismissFailure">
- {{ failure.text }}
- <ul v-if="failureReasons.length" class="gl-mb-0">
- <li v-for="reason in failureReasons" :key="reason">{{ reason }}</li>
- </ul>
- </gl-alert>
+ <div class="gl-mt-4 gl-relative">
<gl-loading-icon v-if="isBlobContentLoading" size="lg" class="gl-m-3" />
- <div v-else-if="!isBlobContentError" class="gl-mt-4">
+ <pipeline-editor-empty-state
+ v-else-if="showStartScreen"
+ @createEmptyConfigFile="setNewEmptyCiConfigFile"
+ />
+ <div v-else>
+ <gl-alert v-if="showSuccessAlert" :variant="success.variant" @dismiss="dismissSuccess">
+ {{ success.text }}
+ </gl-alert>
+ <gl-alert v-if="showFailureAlert" :variant="failure.variant" @dismiss="dismissFailure">
+ {{ failure.text }}
+ <ul v-if="failureReasons.length" class="gl-mb-0">
+ <li v-for="reason in failureReasons" :key="reason">{{ reason }}</li>
+ </ul>
+ </gl-alert>
<pipeline-editor-home
:is-ci-config-data-loading="isCiConfigDataLoading"
:ci-config-data="ciConfigData"
@@ -235,7 +236,7 @@ export default {
@showError="showErrorAlert"
@updateCiConfig="updateCiConfig"
/>
+ <confirm-unsaved-changes-dialog :has-unsaved-changes="hasUnsavedChanges" />
</div>
- <confirm-unsaved-changes-dialog :has-unsaved-changes="hasUnsavedChanges" />
</div>
</template>
diff --git a/app/assets/javascripts/pipeline_editor/pipeline_editor_home.vue b/app/assets/javascripts/pipeline_editor/pipeline_editor_home.vue
index 8c9aad6ed87..ef46040153f 100644
--- a/app/assets/javascripts/pipeline_editor/pipeline_editor_home.vue
+++ b/app/assets/javascripts/pipeline_editor/pipeline_editor_home.vue
@@ -45,6 +45,7 @@ export default {
<template>
<div>
<pipeline-editor-header
+ :ci-file-content="ciFileContent"
:ci-config-data="ciConfigData"
:is-ci-config-data-loading="isCiConfigDataLoading"
/>
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 5070971c563..ff6a354f673 100644
--- a/app/assets/javascripts/pipeline_new/components/pipeline_new_form.vue
+++ b/app/assets/javascripts/pipeline_new/components/pipeline_new_form.vue
@@ -9,14 +9,11 @@ import {
GlFormSelect,
GlFormTextarea,
GlLink,
- GlDropdown,
- GlDropdownItem,
- GlDropdownSectionHeader,
- GlSearchBoxByType,
GlSprintf,
GlLoadingIcon,
GlSafeHtmlDirective as SafeHtml,
} from '@gitlab/ui';
+import * as Sentry from '@sentry/browser';
import { uniqueId } from 'lodash';
import Vue from 'vue';
import axios from '~/lib/utils/axios_utils';
@@ -24,21 +21,27 @@ import { backOff } from '~/lib/utils/common_utils';
import httpStatusCodes from '~/lib/utils/http_status';
import { redirectTo } from '~/lib/utils/url_utility';
import { s__, __, n__ } from '~/locale';
-import * as Sentry from '~/sentry/wrapper';
import { VARIABLE_TYPE, FILE_TYPE, CONFIG_VARIABLES_TIMEOUT } from '../constants';
+import RefsDropdown from './refs_dropdown.vue';
+
+const i18n = {
+ variablesDescription: s__(
+ 'Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default.',
+ ),
+ defaultError: __('Something went wrong on our end. Please try again.'),
+ refsLoadingErrorTitle: s__('Pipeline|Branches or tags could not be loaded.'),
+ submitErrorTitle: s__('Pipeline|Pipeline cannot be run.'),
+ warningTitle: __('The form contains the following warning:'),
+ maxWarningsSummary: __('%{total} warnings found: showing first %{warningsDisplayed}'),
+};
export default {
typeOptions: [
{ value: VARIABLE_TYPE, text: __('Variable') },
{ value: FILE_TYPE, text: __('File') },
],
- variablesDescription: s__(
- 'Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default.',
- ),
+ i18n,
formElementClasses: 'gl-mr-3 gl-mb-3 gl-flex-basis-quarter gl-flex-shrink-0 gl-flex-grow-0',
- errorTitle: __('Pipeline cannot be run.'),
- warningTitle: __('The form contains the following warning:'),
- maxWarningsSummary: __('%{total} warnings found: showing first %{warningsDisplayed}'),
// this height value is used inline on the textarea to match the input field height
// it's used to prevent the overwrite if 'gl-h-7' or 'gl-h-7!' were used
textAreaStyle: { height: '32px' },
@@ -52,12 +55,9 @@ export default {
GlFormSelect,
GlFormTextarea,
GlLink,
- GlDropdown,
- GlDropdownItem,
- GlDropdownSectionHeader,
- GlSearchBoxByType,
GlSprintf,
GlLoadingIcon,
+ RefsDropdown,
},
directives: { SafeHtml },
props: {
@@ -77,14 +77,6 @@ export default {
type: String,
required: true,
},
- branches: {
- type: Array,
- required: true,
- },
- tags: {
- type: Array,
- required: true,
- },
settingsLink: {
type: String,
required: true,
@@ -111,11 +103,11 @@ export default {
},
data() {
return {
- searchTerm: '',
refValue: {
shortName: this.refParam,
},
form: {},
+ errorTitle: null,
error: null,
warnings: [],
totalWarnings: 0,
@@ -125,22 +117,6 @@ export default {
};
},
computed: {
- lowerCasedSearchTerm() {
- return this.searchTerm.toLowerCase();
- },
- filteredBranches() {
- return this.branches.filter((branch) =>
- branch.shortName.toLowerCase().includes(this.lowerCasedSearchTerm),
- );
- },
- filteredTags() {
- return this.tags.filter((tag) =>
- tag.shortName.toLowerCase().includes(this.lowerCasedSearchTerm),
- );
- },
- hasTags() {
- return this.tags.length > 0;
- },
overMaxWarningsLimit() {
return this.totalWarnings > this.maxWarnings;
},
@@ -148,7 +124,7 @@ export default {
return n__('%d warning found:', '%d warnings found:', this.warnings.length);
},
summaryMessage() {
- return this.overMaxWarningsLimit ? this.$options.maxWarningsSummary : this.warningsSummary;
+ return this.overMaxWarningsLimit ? i18n.maxWarningsSummary : this.warningsSummary;
},
shouldShowWarning() {
return this.warnings.length > 0 && !this.isWarningDismissed;
@@ -166,6 +142,11 @@ export default {
return this.form[this.refFullName]?.descriptions ?? {};
},
},
+ watch: {
+ refValue() {
+ this.loadConfigVariablesForm();
+ },
+ },
created() {
// this is needed until we add support for ref type in url query strings
// ensure default branch is called with full ref on load
@@ -174,7 +155,7 @@ export default {
this.refValue.fullName = `refs/heads/${this.refValue.shortName}`;
}
- this.setRefSelected(this.refValue);
+ this.loadConfigVariablesForm();
},
methods: {
addEmptyVariable(refValue) {
@@ -213,49 +194,47 @@ export default {
this.setVariable(refValue, type, key, value);
});
},
- setRefSelected(refValue) {
- this.refValue = refValue;
-
- if (!this.form[this.refFullName]) {
- this.fetchConfigVariables(this.refFullName || this.refShortName)
- .then(({ descriptions, params }) => {
- Vue.set(this.form, this.refFullName, {
- variables: [],
- descriptions,
- });
-
- // Add default variables from yml
- this.setVariableParams(this.refFullName, VARIABLE_TYPE, params);
- })
- .catch(() => {
- Vue.set(this.form, this.refFullName, {
- variables: [],
- descriptions: {},
- });
- })
- .finally(() => {
- // Add/update variables, e.g. from query string
- if (this.variableParams) {
- this.setVariableParams(this.refFullName, VARIABLE_TYPE, this.variableParams);
- }
- if (this.fileParams) {
- this.setVariableParams(this.refFullName, FILE_TYPE, this.fileParams);
- }
-
- // Adds empty var at the end of the form
- this.addEmptyVariable(this.refFullName);
- });
- }
- },
- isSelected(ref) {
- return ref.fullName === this.refValue.fullName;
- },
removeVariable(index) {
this.variables.splice(index, 1);
},
canRemove(index) {
return index < this.variables.length - 1;
},
+ loadConfigVariablesForm() {
+ // Skip when variables already cached in `form`
+ if (this.form[this.refFullName]) {
+ return;
+ }
+
+ this.fetchConfigVariables(this.refFullName || this.refShortName)
+ .then(({ descriptions, params }) => {
+ Vue.set(this.form, this.refFullName, {
+ variables: [],
+ descriptions,
+ });
+
+ // Add default variables from yml
+ this.setVariableParams(this.refFullName, VARIABLE_TYPE, params);
+ })
+ .catch(() => {
+ Vue.set(this.form, this.refFullName, {
+ variables: [],
+ descriptions: {},
+ });
+ })
+ .finally(() => {
+ // Add/update variables, e.g. from query string
+ if (this.variableParams) {
+ this.setVariableParams(this.refFullName, VARIABLE_TYPE, this.variableParams);
+ }
+ if (this.fileParams) {
+ this.setVariableParams(this.refFullName, FILE_TYPE, this.fileParams);
+ }
+
+ // Adds empty var at the end of the form
+ this.addEmptyVariable(this.refFullName);
+ });
+ },
fetchConfigVariables(refValue) {
this.isLoading = true;
@@ -330,11 +309,25 @@ export default {
} = err?.response?.data;
const [error] = errors;
- this.error = error;
- this.warnings = warnings;
- this.totalWarnings = totalWarnings;
+ this.reportError({
+ title: i18n.submitErrorTitle,
+ error,
+ warnings,
+ totalWarnings,
+ });
});
},
+ onRefsLoadingError(error) {
+ this.reportError({ title: i18n.refsLoadingErrorTitle });
+
+ Sentry.captureException(error);
+ },
+ reportError({ title = null, error = i18n.defaultError, warnings = [], totalWarnings = 0 }) {
+ this.errorTitle = title;
+ this.error = error;
+ this.warnings = warnings;
+ this.totalWarnings = totalWarnings;
+ },
},
};
</script>
@@ -343,7 +336,7 @@ export default {
<gl-form @submit.prevent="createPipeline">
<gl-alert
v-if="error"
- :title="$options.errorTitle"
+ :title="errorTitle"
:dismissible="false"
variant="danger"
class="gl-mb-4"
@@ -353,7 +346,7 @@ export default {
</gl-alert>
<gl-alert
v-if="shouldShowWarning"
- :title="$options.warningTitle"
+ :title="$options.i18n.warningTitle"
variant="warning"
class="gl-mb-4"
data-testid="run-pipeline-warning-alert"
@@ -380,31 +373,7 @@ export default {
</details>
</gl-alert>
<gl-form-group :label="s__('Pipeline|Run for branch name or tag')">
- <gl-dropdown :text="refShortName" block>
- <gl-search-box-by-type v-model.trim="searchTerm" :placeholder="__('Search refs')" />
- <gl-dropdown-section-header>{{ __('Branches') }}</gl-dropdown-section-header>
- <gl-dropdown-item
- v-for="branch in filteredBranches"
- :key="branch.fullName"
- class="gl-font-monospace"
- is-check-item
- :is-checked="isSelected(branch)"
- @click="setRefSelected(branch)"
- >
- {{ branch.shortName }}
- </gl-dropdown-item>
- <gl-dropdown-section-header v-if="hasTags">{{ __('Tags') }}</gl-dropdown-section-header>
- <gl-dropdown-item
- v-for="tag in filteredTags"
- :key="tag.fullName"
- class="gl-font-monospace"
- is-check-item
- :is-checked="isSelected(tag)"
- @click="setRefSelected(tag)"
- >
- {{ tag.shortName }}
- </gl-dropdown-item>
- </gl-dropdown>
+ <refs-dropdown v-model="refValue" @loadingError="onRefsLoadingError" />
</gl-form-group>
<gl-loading-icon v-if="isLoading" class="gl-mb-5" size="lg" />
@@ -465,7 +434,7 @@ export default {
</div>
<template #description
- ><gl-sprintf :message="$options.variablesDescription">
+ ><gl-sprintf :message="$options.i18n.variablesDescription">
<template #link="{ content }">
<gl-link :href="settingsLink">{{ content }}</gl-link>
</template>
diff --git a/app/assets/javascripts/pipeline_new/components/refs_dropdown.vue b/app/assets/javascripts/pipeline_new/components/refs_dropdown.vue
new file mode 100644
index 00000000000..ed5c659d1df
--- /dev/null
+++ b/app/assets/javascripts/pipeline_new/components/refs_dropdown.vue
@@ -0,0 +1,113 @@
+<script>
+import { GlDropdown, GlDropdownItem, GlDropdownSectionHeader, GlSearchBoxByType } from '@gitlab/ui';
+import { debounce } from 'lodash';
+import axios from '~/lib/utils/axios_utils';
+import { BRANCH_REF_TYPE, TAG_REF_TYPE, DEBOUNCE_REFS_SEARCH_MS } from '../constants';
+import formatRefs from '../utils/format_refs';
+
+export default {
+ components: {
+ GlDropdown,
+ GlDropdownItem,
+ GlDropdownSectionHeader,
+ GlSearchBoxByType,
+ },
+ inject: ['projectRefsEndpoint'],
+ props: {
+ value: {
+ type: Object,
+ required: false,
+ default: () => ({}),
+ },
+ },
+ data() {
+ return {
+ isLoading: false,
+ searchTerm: '',
+ branches: [],
+ tags: [],
+ };
+ },
+ computed: {
+ lowerCasedSearchTerm() {
+ return this.searchTerm.toLowerCase();
+ },
+ refShortName() {
+ return this.value.shortName;
+ },
+ hasTags() {
+ return this.tags.length > 0;
+ },
+ },
+ watch: {
+ searchTerm() {
+ this.debouncedLoadRefs();
+ },
+ },
+ methods: {
+ loadRefs() {
+ this.isLoading = true;
+
+ axios
+ .get(this.projectRefsEndpoint, {
+ params: {
+ search: this.lowerCasedSearchTerm,
+ },
+ })
+ .then(({ data }) => {
+ // Note: These keys are uppercase in API
+ const { Branches = [], Tags = [] } = data;
+
+ this.branches = formatRefs(Branches, BRANCH_REF_TYPE);
+ this.tags = formatRefs(Tags, TAG_REF_TYPE);
+ })
+ .catch((e) => {
+ this.$emit('loadingError', e);
+ })
+ .finally(() => {
+ this.isLoading = false;
+ });
+ },
+ debouncedLoadRefs: debounce(function debouncedLoadRefs() {
+ this.loadRefs();
+ }, DEBOUNCE_REFS_SEARCH_MS),
+ setRefSelected(ref) {
+ this.$emit('input', ref);
+ },
+ isSelected(ref) {
+ return ref.fullName === this.value.fullName;
+ },
+ },
+};
+</script>
+<template>
+ <gl-dropdown :text="refShortName" block @show.once="loadRefs">
+ <gl-search-box-by-type
+ v-model.trim="searchTerm"
+ :is-loading="isLoading"
+ :placeholder="__('Search refs')"
+ />
+ <gl-dropdown-section-header>{{ __('Branches') }}</gl-dropdown-section-header>
+ <gl-dropdown-item
+ v-for="branch in branches"
+ :key="branch.fullName"
+ class="gl-font-monospace"
+ is-check-item
+ :is-checked="isSelected(branch)"
+ @click="setRefSelected(branch)"
+ >
+ {{ branch.shortName }}
+ </gl-dropdown-item>
+ <gl-dropdown-section-header v-if="hasTags">{{ __('Tags') }}</gl-dropdown-section-header>
+ <gl-dropdown-item
+ v-for="tag in tags"
+ :key="tag.fullName"
+ class="gl-font-monospace"
+ is-check-item
+ :is-checked="isSelected(tag)"
+ @click="setRefSelected(tag)"
+ >
+ {{ tag.shortName }}
+ </gl-dropdown-item>
+ </gl-dropdown>
+</template>
diff --git a/app/assets/javascripts/pipeline_new/constants.js b/app/assets/javascripts/pipeline_new/constants.js
index 004bbe7daf4..681755dc6ab 100644
--- a/app/assets/javascripts/pipeline_new/constants.js
+++ b/app/assets/javascripts/pipeline_new/constants.js
@@ -1,5 +1,6 @@
export const VARIABLE_TYPE = 'env_var';
export const FILE_TYPE = 'file';
+export const DEBOUNCE_REFS_SEARCH_MS = 250;
export const CONFIG_VARIABLES_TIMEOUT = 5000;
export const BRANCH_REF_TYPE = 'branch';
export const TAG_REF_TYPE = 'tag';
diff --git a/app/assets/javascripts/pipeline_new/index.js b/app/assets/javascripts/pipeline_new/index.js
index 0b85184ec90..a645ea8603b 100644
--- a/app/assets/javascripts/pipeline_new/index.js
+++ b/app/assets/javascripts/pipeline_new/index.js
@@ -1,10 +1,13 @@
import Vue from 'vue';
import PipelineNewForm from './components/pipeline_new_form.vue';
-import formatRefs from './utils/format_refs';
export default () => {
const el = document.getElementById('js-new-pipeline');
const {
+ // provide/inject
+ projectRefsEndpoint,
+
+ // props
projectId,
pipelinesPath,
configVariablesPath,
@@ -12,19 +15,18 @@ export default () => {
refParam,
varParam,
fileParam,
- branchRefs,
- tagRefs,
settingsLink,
maxWarnings,
} = el?.dataset;
const variableParams = JSON.parse(varParam);
const fileParams = JSON.parse(fileParam);
- const branches = formatRefs(JSON.parse(branchRefs), 'branch');
- const tags = formatRefs(JSON.parse(tagRefs), 'tag');
return new Vue({
el,
+ provide: {
+ projectRefsEndpoint,
+ },
render(createElement) {
return createElement(PipelineNewForm, {
props: {
@@ -35,8 +37,6 @@ export default () => {
refParam,
variableParams,
fileParams,
- branches,
- tags,
settingsLink,
maxWarnings: Number(maxWarnings),
},
diff --git a/app/assets/javascripts/pipelines/components/graph/graph_component.vue b/app/assets/javascripts/pipelines/components/graph/graph_component.vue
index 93156d5d05b..fc0a8b07e7f 100644
--- a/app/assets/javascripts/pipelines/components/graph/graph_component.vue
+++ b/app/assets/javascripts/pipelines/components/graph/graph_component.vue
@@ -4,7 +4,7 @@ import LinksLayer from '../graph_shared/links_layer.vue';
import { DOWNSTREAM, MAIN, UPSTREAM, ONE_COL_WIDTH } from './constants';
import LinkedPipelinesColumn from './linked_pipelines_column.vue';
import StageColumnComponent from './stage_column_component.vue';
-import { reportToSentry } from './utils';
+import { reportToSentry, validateConfigPaths } from './utils';
export default {
name: 'PipelineGraph',
@@ -15,15 +15,20 @@ export default {
StageColumnComponent,
},
props: {
- isLinkedPipeline: {
- type: Boolean,
- required: false,
- default: false,
+ configPaths: {
+ type: Object,
+ required: true,
+ validator: validateConfigPaths,
},
pipeline: {
type: Object,
required: true,
},
+ isLinkedPipeline: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
type: {
type: String,
required: false,
@@ -66,6 +71,12 @@ export default {
hasUpstreamPipelines() {
return Boolean(this.pipeline?.upstream?.length > 0);
},
+ metricsConfig() {
+ return {
+ path: this.configPaths.metricsPath,
+ collectMetrics: true,
+ };
+ },
// The show downstream check prevents showing redundant linked columns
showDownstreamPipelines() {
return (
@@ -131,6 +142,7 @@ export default {
<template #upstream>
<linked-pipelines-column
v-if="showUpstreamPipelines"
+ :config-paths="configPaths"
:linked-pipelines="upstreamPipelines"
:column-title="__('Upstream')"
:type="$options.pipelineTypeConstants.UPSTREAM"
@@ -145,6 +157,7 @@ export default {
:container-id="containerId"
:container-measurements="measurements"
:highlighted-job="hoveredJobName"
+ :metrics-config="metricsConfig"
default-link-color="gl-stroke-transparent"
@error="onError"
@highlightedJobsChange="updateHighlightedJobs"
@@ -170,6 +183,7 @@ export default {
<linked-pipelines-column
v-if="showDownstreamPipelines"
class="gl-mr-6"
+ :config-paths="configPaths"
:linked-pipelines="downstreamPipelines"
:column-title="__('Downstream')"
:type="$options.pipelineTypeConstants.DOWNSTREAM"
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 f596333237d..ed33a94af6e 100644
--- a/app/assets/javascripts/pipelines/components/graph/graph_component_wrapper.vue
+++ b/app/assets/javascripts/pipelines/components/graph/graph_component_wrapper.vue
@@ -2,9 +2,15 @@
import { GlAlert, GlLoadingIcon } from '@gitlab/ui';
import getPipelineDetails from 'shared_queries/pipelines/get_pipeline_details.query.graphql';
import { __ } from '~/locale';
-import { DEFAULT, LOAD_FAILURE } from '../../constants';
+import { DEFAULT, DRAW_FAILURE, LOAD_FAILURE } from '../../constants';
import PipelineGraph from './graph_component.vue';
-import { unwrapPipelineData, toggleQueryPollingByVisibility, reportToSentry } from './utils';
+import {
+ getQueryHeaders,
+ reportToSentry,
+ serializeLoadErrors,
+ toggleQueryPollingByVisibility,
+ unwrapPipelineData,
+} from './utils';
export default {
name: 'PipelineGraphWrapper',
@@ -14,6 +20,12 @@ export default {
PipelineGraph,
},
inject: {
+ graphqlResourceEtag: {
+ default: '',
+ },
+ metricsPath: {
+ default: '',
+ },
pipelineIid: {
default: '',
},
@@ -29,11 +41,15 @@ export default {
};
},
errorTexts: {
+ [DRAW_FAILURE]: __('An error occurred while drawing job relationship links.'),
[LOAD_FAILURE]: __('We are currently unable to fetch data for this pipeline.'),
[DEFAULT]: __('An unknown error occurred while loading this graph.'),
},
apollo: {
pipeline: {
+ context() {
+ return getQueryHeaders(this.graphqlResourceEtag);
+ },
query: getPipelineDetails,
pollInterval: 10000,
variables() {
@@ -43,16 +59,41 @@ export default {
};
},
update(data) {
+ /*
+ This check prevents the pipeline from being overwritten
+ when a poll times out and the data returned is empty.
+ This can be removed once the timeout behavior is updated.
+ See: https://gitlab.com/gitlab-org/gitlab/-/issues/323213.
+ */
+
+ if (!data?.project?.pipeline) {
+ return this.pipeline;
+ }
+
return unwrapPipelineData(this.pipelineProjectPath, data);
},
- error() {
- this.reportFailure(LOAD_FAILURE);
+ error(err) {
+ this.reportFailure(LOAD_FAILURE, serializeLoadErrors(err));
+ },
+ result({ error }) {
+ /*
+ If there is a successful load after a failure, clear
+ the failure notification to avoid confusion.
+ */
+ if (!error && this.alertType === LOAD_FAILURE) {
+ this.hideAlert();
+ }
},
},
},
computed: {
alert() {
switch (this.alertType) {
+ case DRAW_FAILURE:
+ return {
+ text: this.$options.errorTexts[DRAW_FAILURE],
+ variant: 'danger',
+ };
case LOAD_FAILURE:
return {
text: this.$options.errorTexts[LOAD_FAILURE],
@@ -65,6 +106,12 @@ export default {
};
}
},
+ configPaths() {
+ return {
+ graphqlResourceEtag: this.graphqlResourceEtag,
+ metricsPath: this.metricsPath,
+ };
+ },
showLoadingIcon() {
/*
Shows the icon only when the graph is empty, not when it is is
@@ -82,14 +129,15 @@ export default {
methods: {
hideAlert() {
this.showAlert = false;
+ this.alertType = null;
},
refreshPipelineGraph() {
this.$apollo.queries.pipeline.refetch();
},
- reportFailure(type) {
+ reportFailure(type, err = '') {
this.showAlert = true;
- this.failureType = type;
- reportToSentry(this.$options.name, this.failureType);
+ this.alertType = type;
+ reportToSentry(this.$options.name, `type: ${this.alertType}, info: ${err}`);
},
},
};
@@ -102,6 +150,7 @@ export default {
<gl-loading-icon v-if="showLoadingIcon" class="gl-mx-auto gl-my-4" size="lg" />
<pipeline-graph
v-if="pipeline"
+ :config-paths="configPaths"
:pipeline="pipeline"
@error="reportFailure"
@refreshPipelineGraph="refreshPipelineGraph"
diff --git a/app/assets/javascripts/pipelines/components/graph/linked_pipelines_column.vue b/app/assets/javascripts/pipelines/components/graph/linked_pipelines_column.vue
index 3ce77a1c60a..939400eb1c3 100644
--- a/app/assets/javascripts/pipelines/components/graph/linked_pipelines_column.vue
+++ b/app/assets/javascripts/pipelines/components/graph/linked_pipelines_column.vue
@@ -3,7 +3,14 @@ import getPipelineDetails from 'shared_queries/pipelines/get_pipeline_details.qu
import { LOAD_FAILURE } from '../../constants';
import { ONE_COL_WIDTH, UPSTREAM } from './constants';
import LinkedPipeline from './linked_pipeline.vue';
-import { unwrapPipelineData, toggleQueryPollingByVisibility, reportToSentry } from './utils';
+import {
+ getQueryHeaders,
+ reportToSentry,
+ serializeLoadErrors,
+ toggleQueryPollingByVisibility,
+ unwrapPipelineData,
+ validateConfigPaths,
+} from './utils';
export default {
components: {
@@ -15,6 +22,11 @@ export default {
type: String,
required: true,
},
+ configPaths: {
+ type: Object,
+ required: true,
+ validator: validateConfigPaths,
+ },
linkedPipelines: {
type: Array,
required: true,
@@ -72,6 +84,9 @@ export default {
this.$apollo.addSmartQuery('currentPipeline', {
query: getPipelineDetails,
pollInterval: 10000,
+ context() {
+ return getQueryHeaders(this.configPaths.graphqlResourceEtag);
+ },
variables() {
return {
projectPath,
@@ -79,6 +94,17 @@ export default {
};
},
update(data) {
+ /*
+ This check prevents the pipeline from being overwritten
+ when a poll times out and the data returned is empty.
+ This can be removed once the timeout behavior is updated.
+ See: https://gitlab.com/gitlab-org/gitlab/-/issues/323213.
+ */
+
+ if (!data?.project?.pipeline) {
+ return this.currentPipeline;
+ }
+
return unwrapPipelineData(projectPath, data);
},
result() {
@@ -90,7 +116,9 @@ export default {
reportToSentry(
'linked_pipelines_column',
- `error type: ${LOAD_FAILURE}, error: ${err}, apollo error type: ${type}`,
+ `error type: ${LOAD_FAILURE}, error: ${serializeLoadErrors(
+ err,
+ )}, apollo error type: ${type}`,
);
},
});
@@ -175,6 +203,7 @@ export default {
v-if="isExpanded(pipeline.id)"
:type="type"
class="d-inline-block gl-mt-n2"
+ :config-paths="configPaths"
:pipeline="currentPipeline"
:is-linked-pipeline="true"
/>
diff --git a/app/assets/javascripts/pipelines/components/graph/utils.js b/app/assets/javascripts/pipelines/components/graph/utils.js
index 1a935599bfa..b9a8e2638bc 100644
--- a/app/assets/javascripts/pipelines/components/graph/utils.js
+++ b/app/assets/javascripts/pipelines/components/graph/utils.js
@@ -1,6 +1,6 @@
+import * as Sentry from '@sentry/browser';
import Visibility from 'visibilityjs';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
-import * as Sentry from '~/sentry/wrapper';
import { unwrapStagesWithNeeds } from '../unwrapping_utils';
const addMulti = (mainPipelineProjectPath, linkedPipeline) => {
@@ -10,6 +10,73 @@ const addMulti = (mainPipelineProjectPath, linkedPipeline) => {
};
};
+/* eslint-disable @gitlab/require-i18n-strings */
+const getQueryHeaders = (etagResource) => {
+ return {
+ fetchOptions: {
+ method: 'GET',
+ },
+ headers: {
+ 'X-GITLAB-GRAPHQL-FEATURE-CORRELATION': 'verify/ci/pipeline-graph',
+ 'X-GITLAB-GRAPHQL-RESOURCE-ETAG': etagResource,
+ 'X-Requested-With': 'XMLHttpRequest',
+ },
+ };
+};
+
+const reportToSentry = (component, failureType) => {
+ Sentry.withScope((scope) => {
+ scope.setTag('component', component);
+ Sentry.captureException(failureType);
+ });
+};
+
+const serializeGqlErr = (gqlError) => {
+ const { locations = [], message = '', path = [] } = gqlError;
+
+ return `
+ ${message}.
+ Locations: ${locations
+ .flatMap((loc) => Object.entries(loc))
+ .flat(2)
+ .join(' ')}.
+ Path: ${path.join(', ')}.
+ `;
+};
+
+const serializeLoadErrors = (errors) => {
+ const { gqlError, graphQLErrors, networkError, message } = errors;
+
+ if (graphQLErrors) {
+ return graphQLErrors.map((err) => serializeGqlErr(err)).join('; ');
+ }
+
+ if (gqlError) {
+ return serializeGqlErr(gqlError);
+ }
+
+ if (networkError) {
+ return `Network error: ${networkError.message}`;
+ }
+
+ return message;
+};
+
+/* eslint-enable @gitlab/require-i18n-strings */
+
+const toggleQueryPollingByVisibility = (queryRef, interval = 10000) => {
+ const stopStartQuery = (query) => {
+ if (!Visibility.hidden()) {
+ query.startPolling(interval);
+ } else {
+ query.stopPolling();
+ }
+ };
+
+ stopStartQuery(queryRef);
+ Visibility.change(stopStartQuery.bind(null, queryRef));
+};
+
const transformId = (linkedPipeline) => {
return { ...linkedPipeline, id: getIdFromGraphQLId(linkedPipeline.id) };
};
@@ -42,24 +109,14 @@ const unwrapPipelineData = (mainPipelineProjectPath, data) => {
};
};
-const toggleQueryPollingByVisibility = (queryRef, interval = 10000) => {
- const stopStartQuery = (query) => {
- if (!Visibility.hidden()) {
- query.startPolling(interval);
- } else {
- query.stopPolling();
- }
- };
-
- stopStartQuery(queryRef);
- Visibility.change(stopStartQuery.bind(null, queryRef));
-};
-
-export { unwrapPipelineData, toggleQueryPollingByVisibility };
+const validateConfigPaths = (value) => value.graphqlResourceEtag?.length > 0;
-export const reportToSentry = (component, failureType) => {
- Sentry.withScope((scope) => {
- scope.setTag('component', component);
- Sentry.captureException(failureType);
- });
+export {
+ getQueryHeaders,
+ reportToSentry,
+ serializeGqlErr,
+ serializeLoadErrors,
+ toggleQueryPollingByVisibility,
+ unwrapPipelineData,
+ validateConfigPaths,
};
diff --git a/app/assets/javascripts/pipelines/components/graph_shared/api.js b/app/assets/javascripts/pipelines/components/graph_shared/api.js
new file mode 100644
index 00000000000..04ac15ae24c
--- /dev/null
+++ b/app/assets/javascripts/pipelines/components/graph_shared/api.js
@@ -0,0 +1,8 @@
+import axios from '~/lib/utils/axios_utils';
+import { reportToSentry } from '../graph/utils';
+
+export const reportPerformance = (path, stats) => {
+ axios.post(path, stats).catch((err) => {
+ reportToSentry('links_inner_perf', `error: ${err}`);
+ });
+};
diff --git a/app/assets/javascripts/pipelines/components/graph_shared/links_inner.vue b/app/assets/javascripts/pipelines/components/graph_shared/links_inner.vue
index 289e04e02c5..84ca0bf1443 100644
--- a/app/assets/javascripts/pipelines/components/graph_shared/links_inner.vue
+++ b/app/assets/javascripts/pipelines/components/graph_shared/links_inner.vue
@@ -1,8 +1,19 @@
<script>
import { isEmpty } from 'lodash';
+import {
+ PIPELINES_DETAIL_LINKS_MARK_CALCULATE_START,
+ PIPELINES_DETAIL_LINKS_MARK_CALCULATE_END,
+ PIPELINES_DETAIL_LINKS_MEASURE_CALCULATION,
+ PIPELINES_DETAIL_LINK_DURATION,
+ PIPELINES_DETAIL_LINKS_TOTAL,
+ PIPELINES_DETAIL_LINKS_JOB_RATIO,
+} from '~/performance/constants';
+import { performanceMarkAndMeasure } from '~/performance/utils';
import { DRAW_FAILURE } from '../../constants';
import { createJobsHash, generateJobNeedsDict } from '../../utils';
+import { reportToSentry } from '../graph/utils';
import { parseData } from '../parsing_utils';
+import { reportPerformance } from './api';
import { generateLinksData } from './drawing_utils';
export default {
@@ -25,6 +36,15 @@ export default {
type: Array,
required: true,
},
+ totalGroups: {
+ type: Number,
+ required: true,
+ },
+ metricsConfig: {
+ type: Object,
+ required: false,
+ default: () => ({}),
+ },
defaultLinkColor: {
type: String,
required: false,
@@ -43,6 +63,9 @@ export default {
};
},
computed: {
+ shouldCollectMetrics() {
+ return this.metricsConfig.collectMetrics && this.metricsConfig.path;
+ },
hasHighlightedJob() {
return Boolean(this.highlightedJob);
},
@@ -87,23 +110,70 @@ export default {
this.$emit('highlightedJobsChange', jobs);
},
},
+ errorCaptured(err, _vm, info) {
+ reportToSentry(this.$options.name, `error: ${err}, info: ${info}`);
+ },
mounted() {
if (!isEmpty(this.pipelineData)) {
this.prepareLinkData();
}
},
methods: {
+ beginPerfMeasure() {
+ if (this.shouldCollectMetrics) {
+ performanceMarkAndMeasure({ mark: PIPELINES_DETAIL_LINKS_MARK_CALCULATE_START });
+ }
+ },
+ finishPerfMeasureAndSend() {
+ if (this.shouldCollectMetrics) {
+ performanceMarkAndMeasure({
+ mark: PIPELINES_DETAIL_LINKS_MARK_CALCULATE_END,
+ measures: [
+ {
+ name: PIPELINES_DETAIL_LINKS_MEASURE_CALCULATION,
+ start: PIPELINES_DETAIL_LINKS_MARK_CALCULATE_START,
+ },
+ ],
+ });
+ }
+
+ window.requestAnimationFrame(() => {
+ const duration = window.performance.getEntriesByName(
+ PIPELINES_DETAIL_LINKS_MEASURE_CALCULATION,
+ )[0]?.duration;
+
+ if (!duration) {
+ return;
+ }
+
+ const data = {
+ histograms: [
+ { name: PIPELINES_DETAIL_LINK_DURATION, value: duration },
+ { name: PIPELINES_DETAIL_LINKS_TOTAL, value: this.links.length },
+ {
+ name: PIPELINES_DETAIL_LINKS_JOB_RATIO,
+ value: this.links.length / this.totalGroups,
+ },
+ ],
+ };
+
+ reportPerformance(this.metricsConfig.path, data);
+ });
+ },
isLinkHighlighted(linkRef) {
return this.highlightedLinks.includes(linkRef);
},
prepareLinkData() {
+ this.beginPerfMeasure();
try {
const arrayOfJobs = this.pipelineData.flatMap(({ groups }) => groups);
const parsedData = parseData(arrayOfJobs);
this.links = generateLinksData(parsedData, this.containerId, `-${this.pipelineId}`);
- } catch {
+ } catch (err) {
this.$emit('error', DRAW_FAILURE);
+ reportToSentry(this.$options.name, err);
}
+ this.finishPerfMeasureAndSend();
},
getLinkClasses(link) {
return [
diff --git a/app/assets/javascripts/pipelines/components/graph_shared/links_layer.vue b/app/assets/javascripts/pipelines/components/graph_shared/links_layer.vue
index 1c1bc7ecb2a..5db204712df 100644
--- a/app/assets/javascripts/pipelines/components/graph_shared/links_layer.vue
+++ b/app/assets/javascripts/pipelines/components/graph_shared/links_layer.vue
@@ -1,6 +1,7 @@
<script>
import { GlAlert } from '@gitlab/ui';
import { __ } from '~/locale';
+import { reportToSentry } from '../graph/utils';
import LinksInner from './links_inner.vue';
export default {
@@ -42,7 +43,7 @@ export default {
}, 0);
},
showAlert() {
- return !this.showLinkedLayers && !this.alertDismissed;
+ return !this.containerZero && !this.showLinkedLayers && !this.alertDismissed;
},
showLinkedLayers() {
return (
@@ -50,6 +51,9 @@ export default {
);
},
},
+ errorCaptured(err, _vm, info) {
+ reportToSentry(this.$options.name, `error: ${err}, info: ${info}`);
+ },
methods: {
dismissAlert() {
this.alertDismissed = true;
@@ -66,6 +70,7 @@ export default {
v-if="showLinkedLayers"
:container-measurements="containerMeasurements"
:pipeline-data="pipelineData"
+ :total-groups="numGroups"
v-bind="$attrs"
v-on="$listeners"
>
diff --git a/app/assets/javascripts/pipelines/components/pipeline_graph/pipeline_graph.vue b/app/assets/javascripts/pipelines/components/pipeline_graph/pipeline_graph.vue
index 4a7ee3b2af7..707d6966e77 100644
--- a/app/assets/javascripts/pipelines/components/pipeline_graph/pipeline_graph.vue
+++ b/app/assets/javascripts/pipelines/components/pipeline_graph/pipeline_graph.vue
@@ -64,13 +64,6 @@ export default {
hasHighlightedJob() {
return Boolean(this.highlightedJob);
},
- alert() {
- if (this.hasError) {
- return this.failure;
- }
-
- return this.warning;
- },
failure() {
switch (this.failureType) {
case DRAW_FAILURE:
@@ -210,11 +203,11 @@ export default {
<div>
<gl-alert
v-if="hasError"
- :variant="alert.variant"
- :dismissible="alert.dismissible"
- @dismiss="alert.dismissible ? resetFailure : null"
+ :variant="failure.variant"
+ :dismissible="failure.dismissible"
+ @dismiss="resetFailure"
>
- {{ alert.text }}
+ {{ failure.text }}
</gl-alert>
<div
v-if="!hideGraph"
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 8a656bb47f4..90c6acc9e6f 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/empty_state.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/empty_state.vue
@@ -1,5 +1,6 @@
<script>
import { GlButton } from '@gitlab/ui';
+import { helpPagePath } from '~/helpers/help_page_helper';
import { s__ } from '~/locale';
export default {
@@ -14,10 +15,6 @@ export default {
GlButton,
},
props: {
- helpPagePath: {
- type: String,
- required: true,
- },
emptyStateSvgPath: {
type: String,
required: true,
@@ -27,6 +24,11 @@ export default {
required: true,
},
},
+ computed: {
+ ciHelpPagePath() {
+ return helpPagePath('ci/quick_start/index.md');
+ },
+ },
};
</script>
<template>
@@ -47,7 +49,7 @@ export default {
<div class="gl-text-center">
<gl-button
- :href="helpPagePath"
+ :href="ciHelpPagePath"
variant="info"
category="primary"
data-testid="get-started-pipelines"
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_mini_graph.vue b/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_mini_graph.vue
new file mode 100644
index 00000000000..05372010d0f
--- /dev/null
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_mini_graph.vue
@@ -0,0 +1,54 @@
+<script>
+import PipelineStage from '~/pipelines/components/pipelines_list/pipeline_stage.vue';
+/**
+ * Renders the pipeline mini graph.
+ */
+export default {
+ components: {
+ PipelineStage,
+ },
+ props: {
+ stages: {
+ type: Array,
+ required: true,
+ },
+ updateDropdown: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ stagesClass: {
+ type: [Array, Object, String],
+ required: false,
+ default: '',
+ },
+ isMergeTrain: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ },
+ methods: {
+ onPipelineActionRequestComplete() {
+ this.$emit('pipelineActionRequestComplete');
+ },
+ },
+};
+</script>
+<template>
+ <div data-testid="widget-mini-pipeline-graph">
+ <div
+ v-for="stage in stages"
+ :key="stage.name"
+ :class="stagesClass"
+ class="stage-container dropdown"
+ >
+ <pipeline-stage
+ :stage="stage"
+ :update-dropdown="updateDropdown"
+ :is-merge-train="isMergeTrain"
+ @pipelineActionRequestComplete="onPipelineActionRequestComplete"
+ />
+ </div>
+ </div>
+</template>
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_operations.vue b/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_operations.vue
new file mode 100644
index 00000000000..81eeead2171
--- /dev/null
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_operations.vue
@@ -0,0 +1,119 @@
+<script>
+import { GlButton, GlTooltipDirective, GlModalDirective } from '@gitlab/ui';
+import { __ } from '~/locale';
+import eventHub from '../../event_hub';
+import PipelinesArtifactsComponent from './pipelines_artifacts.vue';
+import PipelinesManualActions from './pipelines_manual_actions.vue';
+
+export default {
+ i18n: {
+ cancelTitle: __('Cancel'),
+ redeployTitle: __('Retry'),
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ GlModalDirective,
+ },
+ components: {
+ GlButton,
+ PipelinesManualActions,
+ PipelinesArtifactsComponent,
+ },
+ props: {
+ pipeline: {
+ type: Object,
+ required: true,
+ },
+ cancelingPipeline: {
+ type: Number,
+ required: false,
+ default: null,
+ },
+ },
+ data() {
+ return {
+ isRetrying: false,
+ };
+ },
+ computed: {
+ displayPipelineActions() {
+ return (
+ this.pipeline.flags.retryable ||
+ this.pipeline.flags.cancelable ||
+ this.pipeline.details.manual_actions.length ||
+ this.pipeline.details.artifacts.length
+ );
+ },
+ actions() {
+ if (!this.pipeline || !this.pipeline.details) {
+ return [];
+ }
+ const { details } = this.pipeline;
+ return [...(details.manual_actions || []), ...(details.scheduled_actions || [])];
+ },
+ isCancelling() {
+ return this.cancelingPipeline === this.pipeline.id;
+ },
+ },
+ watch: {
+ pipeline() {
+ this.isRetrying = false;
+ },
+ },
+ methods: {
+ handleCancelClick() {
+ eventHub.$emit('openConfirmationModal', {
+ pipeline: this.pipeline,
+ endpoint: this.pipeline.cancel_path,
+ });
+ },
+ handleRetryClick() {
+ this.isRetrying = true;
+ eventHub.$emit('retryPipeline', this.pipeline.retry_path);
+ },
+ },
+};
+</script>
+
+<template>
+ <div v-if="displayPipelineActions" class="gl-text-right">
+ <div class="btn-group">
+ <pipelines-manual-actions v-if="actions.length > 0" :actions="actions" />
+
+ <pipelines-artifacts-component
+ v-if="pipeline.details.artifacts.length"
+ :artifacts="pipeline.details.artifacts"
+ />
+
+ <gl-button
+ v-if="pipeline.flags.retryable"
+ v-gl-tooltip.hover
+ :aria-label="$options.i18n.redeployTitle"
+ :title="$options.i18n.redeployTitle"
+ :disabled="isRetrying"
+ :loading="isRetrying"
+ class="js-pipelines-retry-button"
+ data-qa-selector="pipeline_retry_button"
+ icon="repeat"
+ variant="default"
+ category="secondary"
+ @click="handleRetryClick"
+ />
+
+ <gl-button
+ v-if="pipeline.flags.cancelable"
+ v-gl-tooltip.hover
+ v-gl-modal-directive="'confirmation-modal'"
+ :aria-label="$options.i18n.cancelTitle"
+ :title="$options.i18n.cancelTitle"
+ :loading="isCancelling"
+ :disabled="isCancelling"
+ icon="close"
+ variant="danger"
+ category="primary"
+ class="js-pipelines-cancel-button"
+ @click="handleCancelClick"
+ />
+ </div>
+ </div>
+</template>
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_stage.vue b/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_stage.vue
new file mode 100644
index 00000000000..50e60418f66
--- /dev/null
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_stage.vue
@@ -0,0 +1,152 @@
+<script>
+/**
+ * Renders each stage of the pipeline mini graph.
+ *
+ * Given the provided endpoint will make a request to
+ * fetch the dropdown data when the stage is clicked.
+ *
+ * Request is made inside this component to make it reusable between:
+ * 1. Pipelines main table
+ * 2. Pipelines table in commit and Merge request views
+ * 3. Merge request widget
+ * 4. Commit widget
+ */
+
+import { GlDropdown, GlLoadingIcon, GlTooltipDirective, GlIcon } from '@gitlab/ui';
+import { deprecatedCreateFlash as Flash } from '~/flash';
+import axios from '~/lib/utils/axios_utils';
+import { __ } from '~/locale';
+import eventHub from '../../event_hub';
+import JobItem from '../graph/job_item.vue';
+
+export default {
+ components: {
+ GlIcon,
+ GlLoadingIcon,
+ GlDropdown,
+ JobItem,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ },
+ props: {
+ stage: {
+ type: Object,
+ required: true,
+ },
+ updateDropdown: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ isMergeTrain: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ },
+ data() {
+ return {
+ isLoading: false,
+ dropdownContent: [],
+ };
+ },
+ computed: {
+ triggerButtonClass() {
+ return `ci-status-icon-${this.stage.status.group}`;
+ },
+ borderlessIcon() {
+ return `${this.stage.status.icon}_borderless`;
+ },
+ },
+ watch: {
+ updateDropdown() {
+ if (this.updateDropdown && this.isDropdownOpen() && !this.isLoading) {
+ this.fetchJobs();
+ }
+ },
+ },
+ methods: {
+ onShowDropdown() {
+ eventHub.$emit('clickedDropdown');
+ this.isLoading = true;
+ this.fetchJobs();
+ },
+ fetchJobs() {
+ axios
+ .get(this.stage.dropdown_path)
+ .then(({ data }) => {
+ this.dropdownContent = data.latest_statuses;
+ this.isLoading = false;
+ })
+ .catch(() => {
+ this.$refs.stageGlDropdown.hide();
+ this.isLoading = false;
+
+ Flash(__('Something went wrong on our end.'));
+ });
+ },
+ isDropdownOpen() {
+ return this.$el.classList.contains('show');
+ },
+ pipelineActionRequestComplete() {
+ // close the dropdown in MR widget
+ this.$refs.stageGlDropdown.hide();
+
+ // warn the pipelines table to update
+ this.$emit('pipelineActionRequestComplete');
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-dropdown
+ ref="stageGlDropdown"
+ v-gl-tooltip.hover
+ data-testid="mini-pipeline-graph-dropdown"
+ :title="stage.title"
+ variant="link"
+ :lazy="true"
+ :popper-opts="{ placement: 'bottom' }"
+ :toggle-class="['mini-pipeline-graph-dropdown-toggle', triggerButtonClass]"
+ menu-class="mini-pipeline-graph-dropdown-menu"
+ @show="onShowDropdown"
+ >
+ <template #button-content>
+ <span class="gl-pointer-events-none">
+ <gl-icon :name="borderlessIcon" />
+ </span>
+ </template>
+ <gl-loading-icon v-if="isLoading" />
+ <ul
+ v-else
+ class="js-builds-dropdown-list scrollable-menu"
+ data-testid="mini-pipeline-graph-dropdown-menu-list"
+ >
+ <li v-for="job in dropdownContent" :key="job.id">
+ <job-item
+ :dropdown-length="dropdownContent.length"
+ :job="job"
+ css-class-job-name="mini-pipeline-graph-dropdown-item"
+ @pipelineActionRequestComplete="pipelineActionRequestComplete"
+ />
+ </li>
+ <template v-if="isMergeTrain">
+ <li class="gl-new-dropdown-divider" role="presentation">
+ <hr role="separator" aria-orientation="horizontal" class="dropdown-divider" />
+ </li>
+ <li>
+ <div
+ class="gl-display-flex gl-align-items-center"
+ data-testid="warning-message-merge-trains"
+ >
+ <div class="menu-item gl-font-sm gl-text-gray-300!">
+ {{ s__('Pipeline|Merge train pipeline jobs can not be retried') }}
+ </div>
+ </div>
+ </li>
+ </template>
+ </ul>
+ </gl-dropdown>
+</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 6ac60727f23..c707b395192 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,12 @@
<script>
import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
+import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
export default {
components: {
UserAvatarLink,
},
+ mixins: [glFeatureFlagMixin()],
props: {
pipeline: {
type: Object,
@@ -15,11 +17,19 @@ export default {
user() {
return this.pipeline.user;
},
+ classes() {
+ const triggererClass = 'pipeline-triggerer';
+
+ if (this.glFeatures.newPipelinesTable) {
+ return triggererClass;
+ }
+ return `table-section section-10 d-none d-md-block ${triggererClass}`;
+ },
},
};
</script>
<template>
- <div class="table-section section-10 d-none d-md-block pipeline-triggerer">
+ <div :class="classes" data-testid="pipeline-triggerer">
<user-avatar-link
v-if="user"
:link-href="user.path"
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 823ada133d2..0de520a2ca7 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_url.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_url.vue
@@ -1,5 +1,7 @@
<script>
import { GlLink, GlPopover, GlSprintf, GlTooltipDirective, GlBadge } from '@gitlab/ui';
+import { helpPagePath } from '~/helpers/help_page_helper';
+import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import { SCHEDULE_ORIGIN } from '../../constants';
export default {
@@ -12,6 +14,7 @@ export default {
directives: {
GlTooltip: GlTooltipDirective,
},
+ mixins: [glFeatureFlagMixin()],
inject: {
targetProjectFullPath: {
default: '',
@@ -26,10 +29,6 @@ export default {
type: String,
required: true,
},
- autoDevopsHelpPath: {
- type: String,
- required: true,
- },
},
computed: {
user() {
@@ -44,11 +43,25 @@ export default {
this.pipeline?.project?.full_path !== `/${this.targetProjectFullPath}`,
);
},
+ autoDevopsTagId() {
+ return `pipeline-url-autodevops-${this.pipeline.id}`;
+ },
+ autoDevopsHelpPath() {
+ return helpPagePath('topics/autodevops/index.md');
+ },
+ classes() {
+ const tagsClass = 'pipeline-tags';
+
+ if (this.glFeatures.newPipelinesTable) {
+ return tagsClass;
+ }
+ return `table-section section-10 d-none d-md-block ${tagsClass}`;
+ },
},
};
</script>
<template>
- <div class="table-section section-10 d-none d-md-block pipeline-tags">
+ <div :class="classes" data-testid="pipeline-url-table-cell">
<gl-link
:href="pipeline.path"
data-testid="pipeline-url-link"
@@ -103,38 +116,43 @@ export default {
data-testid="pipeline-url-failure"
>{{ __('error') }}</gl-badge
>
- <gl-link
- v-if="pipeline.flags.auto_devops"
- :id="`pipeline-url-autodevops-${pipeline.id}`"
- tabindex="0"
- data-testid="pipeline-url-autodevops"
- role="button"
- ><gl-badge variant="info" size="sm">{{ __('Auto DevOps') }}</gl-badge></gl-link
- >
- <gl-popover
- :target="`pipeline-url-autodevops-${pipeline.id}`"
- triggers="focus"
- placement="top"
- >
- <template #title>
- <div class="gl-font-weight-normal gl-line-height-normal">
- <gl-sprintf
- :message="
- __(
- 'This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}',
- )
- "
- >
- <template #strong="{ content }">
- <b>{{ content }}</b>
- </template>
- </gl-sprintf>
- </div>
- </template>
- <gl-link :href="autoDevopsHelpPath" target="_blank" rel="noopener noreferrer nofollow">{{
- __('Learn more about Auto DevOps')
- }}</gl-link>
- </gl-popover>
+ <template v-if="pipeline.flags.auto_devops">
+ <gl-link
+ :id="autoDevopsTagId"
+ tabindex="0"
+ data-testid="pipeline-url-autodevops"
+ role="button"
+ >
+ <gl-badge variant="info" size="sm">
+ {{ __('Auto DevOps') }}
+ </gl-badge>
+ </gl-link>
+ <gl-popover :target="autoDevopsTagId" triggers="focus" placement="top">
+ <template #title>
+ <div class="gl-font-weight-normal gl-line-height-normal">
+ <gl-sprintf
+ :message="
+ __(
+ 'This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}',
+ )
+ "
+ >
+ <template #strong="{ content }">
+ <b>{{ content }}</b>
+ </template>
+ </gl-sprintf>
+ </div>
+ </template>
+ <gl-link
+ :href="autoDevopsHelpPath"
+ data-testid="pipeline-url-autodevops-link"
+ target="_blank"
+ >
+ {{ __('Learn more about Auto DevOps') }}
+ </gl-link>
+ </gl-popover>
+ </template>
+
<gl-badge
v-if="pipeline.flags.stuck"
variant="warning"
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines.vue b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines.vue
index 48009a9fcb8..19d93e7d083 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines.vue
@@ -52,10 +52,6 @@ export default {
required: false,
default: '',
},
- helpPagePath: {
- type: String,
- required: true,
- },
emptyStateSvgPath: {
type: String,
required: true,
@@ -68,10 +64,6 @@ export default {
type: String,
required: true,
},
- autoDevopsHelpPath: {
- type: String,
- required: true,
- },
hasGitlabCi: {
type: Boolean,
required: true,
@@ -337,7 +329,6 @@ export default {
<empty-state
v-else-if="stateToRender === $options.stateMap.emptyState"
- :help-page-path="helpPagePath"
:empty-state-svg-path="emptyStateSvgPath"
:can-set-ci="canCreatePipeline"
/>
@@ -362,7 +353,6 @@ export default {
:pipelines="state.pipelines"
:pipeline-schedule-url="pipelineScheduleUrl"
:update-graph-dropdown="updateGraphDropdown"
- :auto-devops-help-path="autoDevopsHelpPath"
:view-type="viewType"
/>
</div>
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_actions.vue b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_actions.vue
deleted file mode 100644
index 6890cbb9bed..00000000000
--- a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_actions.vue
+++ /dev/null
@@ -1,102 +0,0 @@
-<script>
-import { GlDropdown, GlDropdownItem, GlIcon, GlTooltipDirective } from '@gitlab/ui';
-import createFlash from '~/flash';
-import axios from '~/lib/utils/axios_utils';
-import { s__, __, sprintf } from '~/locale';
-import GlCountdown from '~/vue_shared/components/gl_countdown.vue';
-import eventHub from '../../event_hub';
-
-export default {
- directives: {
- GlTooltip: GlTooltipDirective,
- },
- components: {
- GlCountdown,
- GlDropdown,
- GlDropdownItem,
- GlIcon,
- },
- props: {
- actions: {
- type: Array,
- required: true,
- },
- },
- data() {
- return {
- isLoading: false,
- };
- },
- methods: {
- onClickAction(action) {
- if (action.scheduled_at) {
- const confirmationMessage = sprintf(
- s__(
- 'DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes.',
- ),
- { jobName: action.name },
- );
- // https://gitlab.com/gitlab-org/gitlab-foss/issues/52156
- // eslint-disable-next-line no-alert
- if (!window.confirm(confirmationMessage)) {
- return;
- }
- }
-
- this.isLoading = true;
-
- /**
- * Ideally, the component would not make an api call directly.
- * However, in order to use the eventhub and know when to
- * toggle back the `isLoading` property we'd need an ID
- * to track the request with a wacther - since this component
- * is rendered at least 20 times in the same page, moving the
- * api call directly here is the most performant solution
- */
- axios
- .post(`${action.path}.json`)
- .then(() => {
- this.isLoading = false;
- eventHub.$emit('updateTable');
- })
- .catch(() => {
- this.isLoading = false;
- createFlash({ message: __('An error occurred while making the request.') });
- });
- },
-
- isActionDisabled(action) {
- if (action.playable === undefined) {
- return false;
- }
-
- return !action.playable;
- },
- },
-};
-</script>
-<template>
- <gl-dropdown
- v-gl-tooltip
- :title="__('Run manual or delayed jobs')"
- :loading="isLoading"
- data-testid="pipelines-manual-actions-dropdown"
- right
- icon="play"
- >
- <gl-dropdown-item
- v-for="action in actions"
- :key="action.path"
- :disabled="isActionDisabled(action)"
- @click="onClickAction(action)"
- >
- <div class="gl-display-flex gl-justify-content-space-between gl-flex-wrap">
- {{ action.name }}
- <span v-if="action.scheduled_at">
- <gl-icon name="clock" />
- <gl-countdown :end-date-string="action.scheduled_at" />
- </span>
- </div>
- </gl-dropdown-item>
- </gl-dropdown>
-</template>
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_artifacts.vue b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_artifacts.vue
index b13460b4c68..9c3990f82df 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_artifacts.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_artifacts.vue
@@ -31,6 +31,8 @@ export default {
:text="$options.translations.artifacts"
:aria-label="$options.translations.artifacts"
icon="download"
+ right
+ lazy
text-sr-only
>
<gl-dropdown-item
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_commit.vue b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_commit.vue
new file mode 100644
index 00000000000..cc676883c1d
--- /dev/null
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_commit.vue
@@ -0,0 +1,85 @@
+<script>
+import { CHILD_VIEW } from '~/pipelines/constants';
+import CommitComponent from '~/vue_shared/components/commit.vue';
+
+export default {
+ components: {
+ CommitComponent,
+ },
+ props: {
+ pipeline: {
+ type: Object,
+ required: true,
+ },
+ viewType: {
+ type: String,
+ required: true,
+ },
+ },
+ computed: {
+ commitAuthor() {
+ let commitAuthorInformation;
+
+ if (!this.pipeline || !this.pipeline.commit) {
+ return null;
+ }
+
+ // 1. person who is an author of a commit might be a GitLab user
+ if (this.pipeline.commit.author) {
+ // 2. if person who is an author of a commit is a GitLab user
+ // they can have a GitLab avatar
+ if (this.pipeline.commit.author.avatar_url) {
+ commitAuthorInformation = this.pipeline.commit.author;
+
+ // 3. If GitLab user does not have avatar, they might have a Gravatar
+ } else if (this.pipeline.commit.author_gravatar_url) {
+ commitAuthorInformation = {
+ ...this.pipeline.commit.author,
+ avatar_url: this.pipeline.commit.author_gravatar_url,
+ };
+ }
+ // 4. If committer is not a GitLab User, they can have a Gravatar
+ } else {
+ commitAuthorInformation = {
+ avatar_url: this.pipeline.commit.author_gravatar_url,
+ path: `mailto:${this.pipeline.commit.author_email}`,
+ username: this.pipeline.commit.author_name,
+ };
+ }
+
+ return commitAuthorInformation;
+ },
+ commitTag() {
+ return this.pipeline?.ref?.tag;
+ },
+ commitRef() {
+ return this.pipeline?.ref;
+ },
+ commitUrl() {
+ return this.pipeline?.commit?.commit_path;
+ },
+ commitShortSha() {
+ return this.pipeline?.commit?.short_id;
+ },
+ commitTitle() {
+ return this.pipeline?.commit?.title;
+ },
+ isChildView() {
+ return this.viewType === CHILD_VIEW;
+ },
+ },
+};
+</script>
+
+<template>
+ <commit-component
+ :tag="commitTag"
+ :commit-ref="commitRef"
+ :commit-url="commitUrl"
+ :merge-request-ref="pipeline.merge_request"
+ :short-sha="commitShortSha"
+ :title="commitTitle"
+ :author="commitAuthor"
+ :show-ref-info="!isChildView"
+ />
+</template>
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_manual_actions.vue b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_manual_actions.vue
new file mode 100644
index 00000000000..b94f1a42039
--- /dev/null
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_manual_actions.vue
@@ -0,0 +1,103 @@
+<script>
+import { GlDropdown, GlDropdownItem, GlIcon, GlTooltipDirective } from '@gitlab/ui';
+import createFlash from '~/flash';
+import axios from '~/lib/utils/axios_utils';
+import { s__, __, sprintf } from '~/locale';
+import GlCountdown from '~/vue_shared/components/gl_countdown.vue';
+import eventHub from '../../event_hub';
+
+export default {
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ },
+ components: {
+ GlCountdown,
+ GlDropdown,
+ GlDropdownItem,
+ GlIcon,
+ },
+ props: {
+ actions: {
+ type: Array,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ isLoading: false,
+ };
+ },
+ methods: {
+ onClickAction(action) {
+ if (action.scheduled_at) {
+ const confirmationMessage = sprintf(
+ s__(
+ 'DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes.',
+ ),
+ { jobName: action.name },
+ );
+ // https://gitlab.com/gitlab-org/gitlab-foss/issues/52156
+ // eslint-disable-next-line no-alert
+ if (!window.confirm(confirmationMessage)) {
+ return;
+ }
+ }
+
+ this.isLoading = true;
+
+ /**
+ * Ideally, the component would not make an api call directly.
+ * However, in order to use the eventhub and know when to
+ * toggle back the `isLoading` property we'd need an ID
+ * to track the request with a wacther - since this component
+ * is rendered at least 20 times in the same page, moving the
+ * api call directly here is the most performant solution
+ */
+ axios
+ .post(`${action.path}.json`)
+ .then(() => {
+ this.isLoading = false;
+ eventHub.$emit('updateTable');
+ })
+ .catch(() => {
+ this.isLoading = false;
+ createFlash({ message: __('An error occurred while making the request.') });
+ });
+ },
+
+ isActionDisabled(action) {
+ if (action.playable === undefined) {
+ return false;
+ }
+
+ return !action.playable;
+ },
+ },
+};
+</script>
+<template>
+ <gl-dropdown
+ v-gl-tooltip
+ :title="__('Run manual or delayed jobs')"
+ :loading="isLoading"
+ data-testid="pipelines-manual-actions-dropdown"
+ right
+ lazy
+ icon="play"
+ >
+ <gl-dropdown-item
+ v-for="action in actions"
+ :key="action.path"
+ :disabled="isActionDisabled(action)"
+ @click="onClickAction(action)"
+ >
+ <div class="gl-display-flex gl-justify-content-space-between gl-flex-wrap">
+ {{ action.name }}
+ <span v-if="action.scheduled_at">
+ <gl-icon name="clock" />
+ <gl-countdown :end-date-string="action.scheduled_at" />
+ </span>
+ </div>
+ </gl-dropdown-item>
+ </gl-dropdown>
+</template>
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_status_badge.vue b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_status_badge.vue
new file mode 100644
index 00000000000..cc3c8d522b3
--- /dev/null
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_status_badge.vue
@@ -0,0 +1,37 @@
+<script>
+import { CHILD_VIEW } from '~/pipelines/constants';
+import CiBadge from '~/vue_shared/components/ci_badge_link.vue';
+
+export default {
+ components: {
+ CiBadge,
+ },
+ props: {
+ pipeline: {
+ type: Object,
+ required: true,
+ },
+ viewType: {
+ type: String,
+ required: true,
+ },
+ },
+ computed: {
+ pipelineStatus() {
+ return this.pipeline?.details?.status ?? {};
+ },
+ isChildView() {
+ return this.viewType === CHILD_VIEW;
+ },
+ },
+};
+</script>
+
+<template>
+ <ci-badge
+ :status="pipelineStatus"
+ :show-text="!isChildView"
+ :icon-classes="'gl-vertical-align-middle!'"
+ data-qa-selector="pipeline_commit_status"
+ />
+</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 24c67184e56..aa27aa7e50d 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_table.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_table.vue
@@ -1,22 +1,97 @@
<script>
-import { GlTooltipDirective } from '@gitlab/ui';
+import { GlTable, GlTooltipDirective } from '@gitlab/ui';
+import { s__ } from '~/locale';
+import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import eventHub from '../../event_hub';
+import PipelineMiniGraph from './pipeline_mini_graph.vue';
+import PipelineOperations from './pipeline_operations.vue';
import PipelineStopModal from './pipeline_stop_modal.vue';
+import PipelineTriggerer from './pipeline_triggerer.vue';
+import PipelineUrl from './pipeline_url.vue';
+import PipelinesCommit from './pipelines_commit.vue';
+import PipelinesStatusBadge from './pipelines_status_badge.vue';
import PipelinesTableRowComponent from './pipelines_table_row.vue';
+import PipelinesTimeago from './time_ago.vue';
+
+const DEFAULT_TD_CLASS = 'gl-p-5!';
+const HIDE_TD_ON_MOBILE = 'gl-display-none! gl-lg-display-table-cell!';
+const DEFAULT_TH_CLASSES =
+ 'gl-bg-transparent! gl-border-b-solid! gl-border-b-gray-100! gl-p-5! gl-border-b-1! gl-font-sm!';
-/**
- * Pipelines Table Component.
- *
- * Given an array of objects, renders a table.
- */
export default {
+ fields: [
+ {
+ key: 'status',
+ label: s__('Pipeline|Status'),
+ thClass: DEFAULT_TH_CLASSES,
+ columnClass: 'gl-w-10p',
+ tdClass: DEFAULT_TD_CLASS,
+ thAttr: { 'data-testid': 'status-th' },
+ },
+ {
+ key: 'pipeline',
+ label: s__('Pipeline|Pipeline'),
+ thClass: DEFAULT_TH_CLASSES,
+ tdClass: `${DEFAULT_TD_CLASS} ${HIDE_TD_ON_MOBILE}`,
+ columnClass: 'gl-w-10p',
+ thAttr: { 'data-testid': 'pipeline-th' },
+ },
+ {
+ key: 'triggerer',
+ label: s__('Pipeline|Triggerer'),
+ thClass: DEFAULT_TH_CLASSES,
+ tdClass: `${DEFAULT_TD_CLASS} ${HIDE_TD_ON_MOBILE}`,
+ columnClass: 'gl-w-10p',
+ thAttr: { 'data-testid': 'triggerer-th' },
+ },
+ {
+ key: 'commit',
+ label: s__('Pipeline|Commit'),
+ thClass: DEFAULT_TH_CLASSES,
+ tdClass: DEFAULT_TD_CLASS,
+ columnClass: 'gl-w-20p',
+ thAttr: { 'data-testid': 'commit-th' },
+ },
+ {
+ key: 'stages',
+ label: s__('Pipeline|Stages'),
+ thClass: DEFAULT_TH_CLASSES,
+ tdClass: DEFAULT_TD_CLASS,
+ columnClass: 'gl-w-15p',
+ thAttr: { 'data-testid': 'stages-th' },
+ },
+ {
+ key: 'timeago',
+ label: s__('Pipeline|Duration'),
+ thClass: DEFAULT_TH_CLASSES,
+ tdClass: DEFAULT_TD_CLASS,
+ columnClass: 'gl-w-15p',
+ thAttr: { 'data-testid': 'timeago-th' },
+ },
+ {
+ key: 'actions',
+ thClass: DEFAULT_TH_CLASSES,
+ tdClass: DEFAULT_TD_CLASS,
+ columnClass: 'gl-w-20p',
+ thAttr: { 'data-testid': 'actions-th' },
+ },
+ ],
components: {
- PipelinesTableRowComponent,
+ GlTable,
+ PipelinesCommit,
+ PipelineMiniGraph,
+ PipelineOperations,
+ PipelinesStatusBadge,
PipelineStopModal,
+ PipelinesTableRowComponent,
+ PipelinesTimeago,
+ PipelineTriggerer,
+ PipelineUrl,
},
directives: {
GlTooltip: GlTooltipDirective,
},
+ mixins: [glFeatureFlagMixin()],
props: {
pipelines: {
type: Array,
@@ -32,10 +107,6 @@ export default {
required: false,
default: false,
},
- autoDevopsHelpPath: {
- type: String,
- required: true,
- },
viewType: {
type: String,
required: true,
@@ -70,42 +141,103 @@ export default {
eventHub.$emit('postAction', this.endpoint);
this.cancelingPipeline = this.pipelineId;
},
+ onPipelineActionRequestComplete() {
+ eventHub.$emit('refreshPipelinesTable');
+ },
},
};
</script>
<template>
<div class="ci-table">
- <div class="gl-responsive-table-row table-row-header" role="row">
- <div class="table-section section-10 js-pipeline-status" role="rowheader">
- {{ s__('Pipeline|Status') }}
- </div>
- <div class="table-section section-10 js-pipeline-info pipeline-info" role="rowheader">
- {{ s__('Pipeline|Pipeline') }}
- </div>
- <div class="table-section section-10 js-triggerer-info triggerer-info" role="rowheader">
- {{ s__('Pipeline|Triggerer') }}
- </div>
- <div class="table-section section-20 js-pipeline-commit pipeline-commit" role="rowheader">
- {{ s__('Pipeline|Commit') }}
- </div>
- <div class="table-section section-15 js-pipeline-stages pipeline-stages" role="rowheader">
- {{ s__('Pipeline|Stages') }}
- </div>
- <div class="table-section section-15" role="rowheader"></div>
- <div class="table-section section-20" role="rowheader">
- <slot name="table-header-actions"></slot>
+ <div v-if="!glFeatures.newPipelinesTable" data-testid="legacy-ci-table">
+ <div class="gl-responsive-table-row table-row-header" role="row">
+ <div class="table-section section-10 js-pipeline-status" role="rowheader">
+ {{ s__('Pipeline|Status') }}
+ </div>
+ <div class="table-section section-10 js-pipeline-info pipeline-info" role="rowheader">
+ {{ s__('Pipeline|Pipeline') }}
+ </div>
+ <div class="table-section section-10 js-triggerer-info triggerer-info" role="rowheader">
+ {{ s__('Pipeline|Triggerer') }}
+ </div>
+ <div class="table-section section-20 js-pipeline-commit pipeline-commit" role="rowheader">
+ {{ s__('Pipeline|Commit') }}
+ </div>
+ <div class="table-section section-15 js-pipeline-stages pipeline-stages" role="rowheader">
+ {{ s__('Pipeline|Stages') }}
+ </div>
+ <div class="table-section section-15" role="rowheader"></div>
+ <div class="table-section section-20" role="rowheader">
+ <slot name="table-header-actions"></slot>
+ </div>
</div>
+ <pipelines-table-row-component
+ v-for="model in pipelines"
+ :key="model.id"
+ :pipeline="model"
+ :pipeline-schedule-url="pipelineScheduleUrl"
+ :update-graph-dropdown="updateGraphDropdown"
+ :view-type="viewType"
+ :canceling-pipeline="cancelingPipeline"
+ />
</div>
- <pipelines-table-row-component
- v-for="model in pipelines"
- :key="model.id"
- :pipeline="model"
- :pipeline-schedule-url="pipelineScheduleUrl"
- :update-graph-dropdown="updateGraphDropdown"
- :auto-devops-help-path="autoDevopsHelpPath"
- :view-type="viewType"
- :canceling-pipeline="cancelingPipeline"
- />
+
+ <gl-table
+ v-else
+ :fields="$options.fields"
+ :items="pipelines"
+ tbody-tr-class="commit"
+ :tbody-tr-attr="{ 'data-testid': 'pipeline-table-row' }"
+ stacked="lg"
+ fixed
+ >
+ <template #head(actions)>
+ <span class="gl-display-block gl-lg-display-none!">{{ s__('Pipeline|Actions') }}</span>
+ <slot name="table-header-actions"></slot>
+ </template>
+
+ <template #table-colgroup="{ fields }">
+ <col v-for="field in fields" :key="field.key" :class="field.columnClass" />
+ </template>
+
+ <template #cell(status)="{ item }">
+ <pipelines-status-badge :pipeline="item" :view-type="viewType" />
+ </template>
+
+ <template #cell(pipeline)="{ item }">
+ <pipeline-url :pipeline="item" :pipeline-schedule-url="pipelineScheduleUrl" />
+ </template>
+
+ <template #cell(triggerer)="{ item }">
+ <pipeline-triggerer :pipeline="item" />
+ </template>
+
+ <template #cell(commit)="{ item }">
+ <pipelines-commit :pipeline="item" :view-type="viewType" />
+ </template>
+
+ <template #cell(stages)="{ item }">
+ <div class="stage-cell">
+ <!-- This empty div should be removed, see https://gitlab.com/gitlab-org/gitlab/-/issues/323488 -->
+ <div></div>
+ <pipeline-mini-graph
+ v-if="item.details && item.details.stages && item.details.stages.length > 0"
+ :stages="item.details.stages"
+ :update-dropdown="updateGraphDropdown"
+ @pipelineActionRequestComplete="onPipelineActionRequestComplete"
+ />
+ </div>
+ </template>
+
+ <template #cell(timeago)="{ item }">
+ <pipelines-timeago :pipeline="item" />
+ </template>
+
+ <template #cell(actions)="{ item }">
+ <pipeline-operations :pipeline="item" :canceling-pipeline="cancelingPipeline" />
+ </template>
+ </gl-table>
+
<pipeline-stop-modal :pipeline="pipeline" @submit="onSubmit" />
</div>
</template>
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_table_row.vue b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_table_row.vue
index 572abe2a24a..f684a0b0fcd 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_table_row.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_table_row.vue
@@ -3,13 +3,12 @@ import { GlButton, GlTooltipDirective, GlModalDirective } from '@gitlab/ui';
import { __ } from '~/locale';
import CiBadge from '~/vue_shared/components/ci_badge_link.vue';
import CommitComponent from '~/vue_shared/components/commit.vue';
-import { PIPELINES_TABLE } from '../../constants';
import eventHub from '../../event_hub';
+import PipelineMiniGraph from './pipeline_mini_graph.vue';
import PipelineTriggerer from './pipeline_triggerer.vue';
import PipelineUrl from './pipeline_url.vue';
-import PipelinesActionsComponent from './pipelines_actions.vue';
import PipelinesArtifactsComponent from './pipelines_artifacts.vue';
-import PipelineStage from './stage.vue';
+import PipelinesManualActionsComponent from './pipelines_manual_actions.vue';
import PipelinesTimeago from './time_ago.vue';
export default {
@@ -22,10 +21,10 @@ export default {
GlModalDirective,
},
components: {
- PipelinesActionsComponent,
+ PipelinesManualActionsComponent,
PipelinesArtifactsComponent,
CommitComponent,
- PipelineStage,
+ PipelineMiniGraph,
PipelineUrl,
PipelineTriggerer,
CiBadge,
@@ -47,10 +46,6 @@ export default {
required: false,
default: false,
},
- autoDevopsHelpPath: {
- type: String,
- required: true,
- },
viewType: {
type: String,
required: true,
@@ -61,7 +56,6 @@ export default {
default: null,
},
},
- pipelinesTable: PIPELINES_TABLE,
data() {
return {
isRetrying: false,
@@ -137,15 +131,12 @@ export default {
commitTitle() {
return this.pipeline?.commit?.title;
},
- pipelineDuration() {
- return this.pipeline?.details?.duration ?? 0;
- },
- pipelineFinishedAt() {
- return this.pipeline?.details?.finished_at ?? '';
- },
pipelineStatus() {
return this.pipeline?.details?.status ?? {};
},
+ hasStages() {
+ return this.pipeline?.details?.stages?.length > 0;
+ },
displayPipelineActions() {
return (
this.pipeline.flags.retryable ||
@@ -177,6 +168,10 @@ export default {
this.isRetrying = true;
eventHub.$emit('retryPipeline', this.pipeline.retry_path);
},
+ handlePipelineActionRequestComplete() {
+ // warn the pipelines table to update
+ eventHub.$emit('refreshPipelinesTable');
+ },
},
};
</script>
@@ -194,11 +189,7 @@ export default {
</div>
</div>
- <pipeline-url
- :pipeline="pipeline"
- :pipeline-schedule-url="pipelineScheduleUrl"
- :auto-devops-help-path="autoDevopsHelpPath"
- />
+ <pipeline-url :pipeline="pipeline" :pipeline-schedule-url="pipelineScheduleUrl" />
<pipeline-triggerer :pipeline="pipeline" />
<div class="table-section section-wrap section-20">
@@ -220,35 +211,23 @@ export default {
<div class="table-section section-wrap section-15 stage-cell">
<div class="table-mobile-header" role="rowheader">{{ s__('Pipeline|Stages') }}</div>
<div class="table-mobile-content">
- <template v-if="pipeline.details.stages.length > 0">
- <div
- v-for="(stage, index) in pipeline.details.stages"
- :key="index"
- class="stage-container dropdown"
- data-testid="widget-mini-pipeline-graph"
- >
- <pipeline-stage
- :type="$options.pipelinesTable"
- :stage="stage"
- :update-dropdown="updateGraphDropdown"
- />
- </div>
- </template>
+ <pipeline-mini-graph
+ v-if="hasStages"
+ :stages="pipeline.details.stages"
+ :update-dropdown="updateGraphDropdown"
+ @pipelineActionRequestComplete="handlePipelineActionRequestComplete"
+ />
</div>
</div>
- <pipelines-timeago
- class="gl-text-right"
- :duration="pipelineDuration"
- :finished-time="pipelineFinishedAt"
- />
+ <pipelines-timeago class="gl-text-right" :pipeline="pipeline" />
<div
v-if="displayPipelineActions"
class="table-section section-20 table-button-footer pipeline-actions"
>
<div class="btn-group table-action-buttons">
- <pipelines-actions-component v-if="actions.length > 0" :actions="actions" />
+ <pipelines-manual-actions-component v-if="actions.length > 0" :actions="actions" />
<pipelines-artifacts-component
v-if="pipeline.details.artifacts.length"
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/stage.vue b/app/assets/javascripts/pipelines/components/pipelines_list/stage.vue
deleted file mode 100644
index f5dfb9e72d5..00000000000
--- a/app/assets/javascripts/pipelines/components/pipelines_list/stage.vue
+++ /dev/null
@@ -1,234 +0,0 @@
-<script>
-/**
- * Renders each stage of the pipeline mini graph.
- *
- * Given the provided endpoint will make a request to
- * fetch the dropdown data when the stage is clicked.
- *
- * Request is made inside this component to make it reusable between:
- * 1. Pipelines main table
- * 2. Pipelines table in commit and Merge request views
- * 3. Merge request widget
- * 4. Commit widget
- */
-import { GlDropdown, GlLoadingIcon, GlTooltipDirective, GlIcon } from '@gitlab/ui';
-import $ from 'jquery';
-import { deprecatedCreateFlash as Flash } from '~/flash';
-import axios from '~/lib/utils/axios_utils';
-import { __ } from '~/locale';
-import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
-import { PIPELINES_TABLE } from '../../constants';
-import eventHub from '../../event_hub';
-import JobItem from '../graph/job_item.vue';
-
-export default {
- components: {
- GlIcon,
- GlLoadingIcon,
- GlDropdown,
- JobItem,
- },
- directives: {
- GlTooltip: GlTooltipDirective,
- },
- mixins: [glFeatureFlagsMixin()],
- props: {
- stage: {
- type: Object,
- required: true,
- },
-
- updateDropdown: {
- type: Boolean,
- required: false,
- default: false,
- },
-
- type: {
- type: String,
- required: false,
- default: '',
- },
- },
- data() {
- return {
- isLoading: false,
- dropdownContent: [],
- };
- },
- computed: {
- isCiMiniPipelineGlDropdown() {
- // Feature flag ci_mini_pipeline_gl_dropdown
- // See more at https://gitlab.com/gitlab-org/gitlab/-/issues/300400
- return this.glFeatures?.ciMiniPipelineGlDropdown;
- },
- triggerButtonClass() {
- return `ci-status-icon-${this.stage.status.group}`;
- },
- borderlessIcon() {
- return `${this.stage.status.icon}_borderless`;
- },
- },
- watch: {
- updateDropdown() {
- if (this.updateDropdown && this.isDropdownOpen() && !this.isLoading) {
- this.fetchJobs();
- }
- },
- },
- updated() {
- if (!this.isCiMiniPipelineGlDropdown && this.dropdownContent.length) {
- this.stopDropdownClickPropagation();
- }
- },
- methods: {
- onShowDropdown() {
- eventHub.$emit('clickedDropdown');
- this.isLoading = true;
- this.fetchJobs();
- },
- onClickStage() {
- if (!this.isDropdownOpen()) {
- eventHub.$emit('clickedDropdown');
- this.isLoading = true;
- this.fetchJobs();
- }
- },
- fetchJobs() {
- axios
- .get(this.stage.dropdown_path)
- .then(({ data }) => {
- this.dropdownContent = data.latest_statuses;
- this.isLoading = false;
- })
- .catch(() => {
- if (this.isCiMiniPipelineGlDropdown) {
- this.$refs.stageGlDropdown.hide();
- } else {
- this.closeDropdown();
- }
- this.isLoading = false;
-
- Flash(__('Something went wrong on our end.'));
- });
- },
- /**
- * When the user right clicks or cmd/ctrl + click in the job name
- * the dropdown should not be closed and the link should open in another tab,
- * so we stop propagation of the click event inside the dropdown.
- *
- * Since this component is rendered multiple times per page we need to guarantee we only
- * target the click event of this component.
- *
- * Note: This should be removed once ci_mini_pipeline_gl_dropdown FF is removed as true.
- */
- stopDropdownClickPropagation() {
- $(
- '.js-builds-dropdown-list button, .js-builds-dropdown-list a.mini-pipeline-graph-dropdown-item',
- this.$el,
- ).on('click', (e) => {
- e.stopPropagation();
- });
- },
- closeDropdown() {
- if (this.isDropdownOpen()) {
- $(this.$refs.dropdown).dropdown('toggle');
- }
- },
- isDropdownOpen() {
- return this.$el.classList.contains('show');
- },
- pipelineActionRequestComplete() {
- if (this.type === PIPELINES_TABLE) {
- // warn the table to update
- eventHub.$emit('refreshPipelinesTable');
- return;
- }
- // close the dropdown in mr widget
- if (this.isCiMiniPipelineGlDropdown) {
- this.$refs.stageGlDropdown.hide();
- } else {
- $(this.$refs.dropdown).dropdown('toggle');
- }
- },
- },
-};
-</script>
-
-<template>
- <div class="dropdown">
- <gl-dropdown
- v-if="isCiMiniPipelineGlDropdown"
- ref="stageGlDropdown"
- v-gl-tooltip.hover
- data-testid="mini-pipeline-graph-dropdown"
- :title="stage.title"
- variant="link"
- :lazy="true"
- :popper-opts="{ placement: 'bottom' }"
- :toggle-class="['mini-pipeline-graph-gl-dropdown-toggle', triggerButtonClass]"
- menu-class="mini-pipeline-graph-dropdown-menu"
- @show="onShowDropdown"
- >
- <template #button-content>
- <span class="gl-pointer-events-none">
- <gl-icon :name="borderlessIcon" />
- </span>
- </template>
- <gl-loading-icon v-if="isLoading" />
- <ul
- v-else
- class="js-builds-dropdown-list scrollable-menu"
- data-testid="mini-pipeline-graph-dropdown-menu-list"
- >
- <li v-for="job in dropdownContent" :key="job.id">
- <job-item
- :dropdown-length="dropdownContent.length"
- :job="job"
- css-class-job-name="mini-pipeline-graph-dropdown-item"
- @pipelineActionRequestComplete="pipelineActionRequestComplete"
- />
- </li>
- </ul>
- </gl-dropdown>
-
- <template v-else>
- <button
- id="stageDropdown"
- ref="dropdown"
- v-gl-tooltip.hover
- :class="triggerButtonClass"
- :title="stage.title"
- class="mini-pipeline-graph-dropdown-toggle"
- data-testid="mini-pipeline-graph-dropdown-toggle"
- data-toggle="dropdown"
- data-display="static"
- type="button"
- aria-haspopup="true"
- aria-expanded="false"
- @click="onClickStage"
- >
- <span :aria-label="stage.title" aria-hidden="true" class="gl-pointer-events-none">
- <gl-icon :name="borderlessIcon" />
- </span>
- </button>
-
- <div
- class="dropdown-menu mini-pipeline-graph-dropdown-menu js-builds-dropdown-container"
- aria-labelledby="stageDropdown"
- >
- <gl-loading-icon v-if="isLoading" />
- <ul v-else class="js-builds-dropdown-list scrollable-menu">
- <li v-for="job in dropdownContent" :key="job.id">
- <job-item
- :dropdown-length="dropdownContent.length"
- :job="job"
- css-class-job-name="mini-pipeline-graph-dropdown-item"
- @pipelineActionRequestComplete="pipelineActionRequestComplete"
- />
- </li>
- </ul>
- </div>
- </template>
- </div>
-</template>
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/time_ago.vue b/app/assets/javascripts/pipelines/components/pipelines_list/time_ago.vue
index 5548a1021f5..278089b6155 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/time_ago.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/time_ago.vue
@@ -1,5 +1,6 @@
<script>
import { GlIcon, GlTooltipDirective } from '@gitlab/ui';
+import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import timeagoMixin from '~/vue_shared/mixins/timeago';
export default {
@@ -7,23 +8,19 @@ export default {
GlTooltip: GlTooltipDirective,
},
components: { GlIcon },
- mixins: [timeagoMixin],
+ mixins: [timeagoMixin, glFeatureFlagMixin()],
props: {
- finishedTime: {
- type: String,
- required: true,
- },
- duration: {
- type: Number,
+ pipeline: {
+ type: Object,
required: true,
},
},
computed: {
- hasDuration() {
- return this.duration > 0;
+ duration() {
+ return this.pipeline?.details?.duration;
},
- hasFinishedTime() {
- return this.finishedTime !== '';
+ finishedTime() {
+ return this.pipeline?.details?.finished_at;
},
durationFormatted() {
const date = new Date(this.duration * 1000);
@@ -45,20 +42,28 @@ export default {
return `${hh}:${mm}:${ss}`;
},
+ legacySectionClass() {
+ return !this.glFeatures.newPipelinesTable ? 'table-section section-15' : '';
+ },
+ legacyTableMobileClass() {
+ return !this.glFeatures.newPipelinesTable ? 'table-mobile-content' : '';
+ },
},
};
</script>
<template>
- <div class="table-section section-15">
- <div class="table-mobile-header" role="rowheader">{{ s__('Pipeline|Duration') }}</div>
- <div class="table-mobile-content">
- <p v-if="hasDuration" class="duration">
- <gl-icon name="timer" class="gl-vertical-align-baseline!" />
+ <div :class="legacySectionClass">
+ <div v-if="!glFeatures.newPipelinesTable" class="table-mobile-header" role="rowheader">
+ {{ s__('Pipeline|Duration') }}
+ </div>
+ <div :class="legacyTableMobileClass">
+ <p v-if="duration" class="duration">
+ <gl-icon name="timer" class="gl-vertical-align-baseline!" :size="12" />
{{ durationFormatted }}
</p>
- <p v-if="hasFinishedTime" class="finished-at d-none d-md-block">
- <gl-icon name="calendar" class="gl-vertical-align-baseline!" />
+ <p v-if="finishedTime" class="finished-at d-none d-md-block">
+ <gl-icon name="calendar" class="gl-vertical-align-baseline!" :size="12" />
<time
v-gl-tooltip
diff --git a/app/assets/javascripts/pipelines/constants.js b/app/assets/javascripts/pipelines/constants.js
index 757d285ef19..21b114825a6 100644
--- a/app/assets/javascripts/pipelines/constants.js
+++ b/app/assets/javascripts/pipelines/constants.js
@@ -1,7 +1,6 @@
import { s__, __ } from '~/locale';
export const CANCEL_REQUEST = 'CANCEL_REQUEST';
-export const PIPELINES_TABLE = 'PIPELINES_TABLE';
export const LAYOUT_CHANGE_DELAY = 300;
export const FILTER_PIPELINES_SEARCH_DELAY = 200;
export const ANY_TRIGGER_AUTHOR = 'Any';
@@ -34,3 +33,5 @@ export const LOAD_FAILURE = 'load_failure';
export const PARSE_FAILURE = 'parse_failure';
export const POST_FAILURE = 'post_failure';
export const UNSUPPORTED_DATA = 'unsupported_data';
+
+export const CHILD_VIEW = 'child';
diff --git a/app/assets/javascripts/pipelines/pipeline_details_bundle.js b/app/assets/javascripts/pipelines/pipeline_details_bundle.js
index f837851e5c1..c3444f38ea0 100644
--- a/app/assets/javascripts/pipelines/pipeline_details_bundle.js
+++ b/app/assets/javascripts/pipelines/pipeline_details_bundle.js
@@ -93,8 +93,7 @@ export default async function initPipelineDetailsBundle() {
/* webpackChunkName: 'createPipelinesDetailApp' */ './pipeline_details_graph'
);
- const { pipelineProjectPath, pipelineIid } = dataset;
- createPipelinesDetailApp(SELECTORS.PIPELINE_GRAPH, pipelineProjectPath, pipelineIid);
+ createPipelinesDetailApp(SELECTORS.PIPELINE_GRAPH, dataset);
} catch {
Flash(__('An error occurred while loading the pipeline.'));
}
diff --git a/app/assets/javascripts/pipelines/pipeline_details_graph.js b/app/assets/javascripts/pipelines/pipeline_details_graph.js
index 55f3731a3ca..9eba39738dc 100644
--- a/app/assets/javascripts/pipelines/pipeline_details_graph.js
+++ b/app/assets/javascripts/pipelines/pipeline_details_graph.js
@@ -11,12 +11,15 @@ const apolloProvider = new VueApollo({
defaultClient: createDefaultClient(
{},
{
- batchMax: 2,
+ useGet: true,
},
),
});
-const createPipelinesDetailApp = (selector, pipelineProjectPath, pipelineIid) => {
+const createPipelinesDetailApp = (
+ selector,
+ { pipelineProjectPath, pipelineIid, metricsPath, graphqlResourceEtag } = {},
+) => {
// eslint-disable-next-line no-new
new Vue({
el: selector,
@@ -25,8 +28,10 @@ const createPipelinesDetailApp = (selector, pipelineProjectPath, pipelineIid) =>
},
apolloProvider,
provide: {
+ metricsPath,
pipelineProjectPath,
pipelineIid,
+ graphqlResourceEtag,
dataMethod: GRAPHQL,
},
errorCaptured(err, _vm, info) {
diff --git a/app/assets/javascripts/pipelines/pipelines_index.js b/app/assets/javascripts/pipelines/pipelines_index.js
index 7bcc51e18e5..0e2e9785956 100644
--- a/app/assets/javascripts/pipelines/pipelines_index.js
+++ b/app/assets/javascripts/pipelines/pipelines_index.js
@@ -23,11 +23,9 @@ export const initPipelinesIndex = (selector = '#pipelines-list-vue') => {
const {
endpoint,
pipelineScheduleUrl,
- helpPagePath,
emptyStateSvgPath,
errorStateSvgPath,
noPipelinesSvgPath,
- autoDevopsHelpPath,
newPipelinePath,
canCreatePipeline,
hasGitlabCi,
@@ -56,11 +54,9 @@ export const initPipelinesIndex = (selector = '#pipelines-list-vue') => {
store: this.store,
endpoint,
pipelineScheduleUrl,
- helpPagePath,
emptyStateSvgPath,
errorStateSvgPath,
noPipelinesSvgPath,
- autoDevopsHelpPath,
newPipelinePath,
canCreatePipeline: parseBoolean(canCreatePipeline),
hasGitlabCi: parseBoolean(hasGitlabCi),
diff --git a/app/assets/javascripts/profile/account/components/update_username.vue b/app/assets/javascripts/profile/account/components/update_username.vue
index c5478aa0226..f18c4d8f03e 100644
--- a/app/assets/javascripts/profile/account/components/update_username.vue
+++ b/app/assets/javascripts/profile/account/components/update_username.vue
@@ -90,7 +90,10 @@ Please update your Git repository remotes as soon as possible.`),
this.isRequestPending = false;
})
.catch((error) => {
- Flash(error.response.data.message);
+ Flash(
+ error?.response?.data?.message ||
+ s__('Profiles|An error occurred while updating your username, please try again.'),
+ );
this.isRequestPending = false;
throw error;
});
@@ -121,7 +124,8 @@ Please update your Git repository remotes as soon as possible.`),
</div>
<gl-button
v-gl-modal-directive="$options.modalId"
- :disabled="isRequestPending || newUsername === username"
+ :disabled="newUsername === username"
+ :loading="isRequestPending"
category="primary"
variant="warning"
data-testid="username-change-confirmation-modal"
diff --git a/app/assets/javascripts/profile/preferences/components/profile_preferences.vue b/app/assets/javascripts/profile/preferences/components/profile_preferences.vue
index 184ee3810ac..07d8f3cc5f1 100644
--- a/app/assets/javascripts/profile/preferences/components/profile_preferences.vue
+++ b/app/assets/javascripts/profile/preferences/components/profile_preferences.vue
@@ -44,6 +44,8 @@ export default {
data() {
return {
isSubmitEnabled: true,
+ darkModeOnCreate: null,
+ darkModeOnSubmit: null,
};
},
computed: {
@@ -58,6 +60,7 @@ export default {
this.formEl.addEventListener('ajax:beforeSend', this.handleLoading);
this.formEl.addEventListener('ajax:success', this.handleSuccess);
this.formEl.addEventListener('ajax:error', this.handleError);
+ this.darkModeOnCreate = this.darkModeSelected();
},
beforeDestroy() {
this.formEl.removeEventListener('ajax:beforeSend', this.handleLoading);
@@ -65,16 +68,27 @@ export default {
this.formEl.removeEventListener('ajax:error', this.handleError);
},
methods: {
+ darkModeSelected() {
+ const theme = this.getSelectedTheme();
+ return theme ? theme.css_class === 'gl-dark' : null;
+ },
+ getSelectedTheme() {
+ const themeId = new FormData(this.formEl).get('user[theme_id]');
+ return this.applicationThemes[themeId] ?? null;
+ },
handleLoading() {
this.isSubmitEnabled = false;
+ this.darkModeOnSubmit = this.darkModeSelected();
},
handleSuccess(customEvent) {
- const formData = new FormData(this.formEl);
- updateClasses(
- this.bodyClasses,
- this.applicationThemes[formData.get('user[theme_id]')].css_class,
- this.selectedLayout,
- );
+ // 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) {
+ window.location.reload();
+ return;
+ }
+ updateClasses(this.bodyClasses, this.getSelectedTheme().css_class, this.selectedLayout);
const { message = this.$options.i18n.defaultSuccess, type = FLASH_TYPES.NOTICE } =
customEvent?.detail?.[0] || {};
createFlash({ message, type });
diff --git a/app/assets/javascripts/profile/profile.js b/app/assets/javascripts/profile/profile.js
index a7332b81b9f..dad2c18fb18 100644
--- a/app/assets/javascripts/profile/profile.js
+++ b/app/assets/javascripts/profile/profile.js
@@ -95,6 +95,7 @@ export default class Profile {
updateHeaderAvatar() {
$('.header-user-avatar').attr('src', this.avatarGlCrop.dataURL);
+ $('.js-sidebar-user-avatar').attr('src', this.avatarGlCrop.dataURL);
}
setRepoRadio() {
diff --git a/app/assets/javascripts/projects/commits/store/actions.js b/app/assets/javascripts/projects/commits/store/actions.js
index 72d4f0c31e5..741dc20b1f1 100644
--- a/app/assets/javascripts/projects/commits/store/actions.js
+++ b/app/assets/javascripts/projects/commits/store/actions.js
@@ -1,8 +1,8 @@
+import * as Sentry from '@sentry/browser';
import { deprecatedCreateFlash as createFlash } from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { joinPaths } from '~/lib/utils/url_utility';
import { __ } from '~/locale';
-import * as Sentry from '~/sentry/wrapper';
import * as types from './mutation_types';
export default {
diff --git a/app/assets/javascripts/projects/compare/components/app.vue b/app/assets/javascripts/projects/compare/components/app.vue
index 05bd0f1370b..d2fb524489e 100644
--- a/app/assets/javascripts/projects/compare/components/app.vue
+++ b/app/assets/javascripts/projects/compare/components/app.vue
@@ -1,12 +1,12 @@
<script>
import { GlButton } from '@gitlab/ui';
import csrf from '~/lib/utils/csrf';
-import RevisionDropdown from './revision_dropdown.vue';
+import RevisionCard from './revision_card.vue';
export default {
csrf,
components: {
- RevisionDropdown,
+ RevisionCard,
GlButton,
},
props: {
@@ -48,42 +48,53 @@ export default {
<template>
<form
ref="form"
- class="form-inline js-requires-input js-signature-container"
+ class="js-requires-input js-signature-container"
method="POST"
:action="projectCompareIndexPath"
>
<input :value="$options.csrf.token" type="hidden" name="authenticity_token" />
- <revision-dropdown
- :refs-project-path="refsProjectPath"
- revision-text="Source"
- params-name="to"
- :params-branch="paramsTo"
- />
- <div class="compare-ellipsis gl-display-inline" data-testid="ellipsis">...</div>
- <revision-dropdown
- :refs-project-path="refsProjectPath"
- revision-text="Target"
- params-name="from"
- :params-branch="paramsFrom"
- />
- <gl-button category="primary" variant="success" class="gl-ml-3" @click="onSubmit">
- {{ s__('CompareRevisions|Compare') }}
- </gl-button>
- <a
- v-if="projectMergeRequestPath"
- :href="projectMergeRequestPath"
- data-testid="projectMrButton"
- class="btn btn-default gl-button gl-ml-3"
+ <div
+ class="gl-lg-flex-direction-row gl-lg-display-flex gl-align-items-center compare-revision-cards"
>
- {{ s__('CompareRevisions|View open merge request') }}
- </a>
- <a
- v-else-if="createMrPath"
- :href="createMrPath"
- data-testid="createMrButton"
- class="btn btn-default gl-button gl-ml-3"
- >
- {{ s__('CompareRevisions|Create merge request') }}
- </a>
+ <revision-card
+ :refs-project-path="refsProjectPath"
+ revision-text="Source"
+ params-name="to"
+ :params-branch="paramsTo"
+ />
+ <div
+ class="compare-ellipsis gl-display-flex gl-justify-content-center gl-align-items-center gl-my-4 gl-md-my-0"
+ data-testid="ellipsis"
+ >
+ ...
+ </div>
+ <revision-card
+ :refs-project-path="refsProjectPath"
+ revision-text="Target"
+ params-name="from"
+ :params-branch="paramsFrom"
+ />
+ </div>
+ <div class="gl-mt-4">
+ <gl-button category="primary" variant="success" @click="onSubmit">
+ {{ s__('CompareRevisions|Compare') }}
+ </gl-button>
+ <gl-button
+ v-if="projectMergeRequestPath"
+ :href="projectMergeRequestPath"
+ data-testid="projectMrButton"
+ class="btn btn-default gl-button"
+ >
+ {{ s__('CompareRevisions|View open merge request') }}
+ </gl-button>
+ <gl-button
+ v-else-if="createMrPath"
+ :href="createMrPath"
+ data-testid="createMrButton"
+ class="btn btn-default gl-button"
+ >
+ {{ s__('CompareRevisions|Create merge request') }}
+ </gl-button>
+ </div>
</form>
</template>
diff --git a/app/assets/javascripts/projects/compare/components/app_legacy.vue b/app/assets/javascripts/projects/compare/components/app_legacy.vue
new file mode 100644
index 00000000000..c0ff58ee074
--- /dev/null
+++ b/app/assets/javascripts/projects/compare/components/app_legacy.vue
@@ -0,0 +1,89 @@
+<script>
+import { GlButton } from '@gitlab/ui';
+import csrf from '~/lib/utils/csrf';
+import RevisionDropdown from './revision_dropdown_legacy.vue';
+
+export default {
+ csrf,
+ components: {
+ RevisionDropdown,
+ GlButton,
+ },
+ props: {
+ projectCompareIndexPath: {
+ type: String,
+ required: true,
+ },
+ refsProjectPath: {
+ type: String,
+ required: true,
+ },
+ paramsFrom: {
+ type: String,
+ required: false,
+ default: null,
+ },
+ paramsTo: {
+ type: String,
+ required: false,
+ default: null,
+ },
+ projectMergeRequestPath: {
+ type: String,
+ required: true,
+ },
+ createMrPath: {
+ type: String,
+ required: true,
+ },
+ },
+ methods: {
+ onSubmit() {
+ this.$refs.form.submit();
+ },
+ },
+};
+</script>
+
+<template>
+ <form
+ ref="form"
+ class="form-inline js-requires-input js-signature-container"
+ method="POST"
+ :action="projectCompareIndexPath"
+ >
+ <input :value="$options.csrf.token" type="hidden" name="authenticity_token" />
+ <revision-dropdown
+ :refs-project-path="refsProjectPath"
+ revision-text="Source"
+ params-name="to"
+ :params-branch="paramsTo"
+ />
+ <div class="compare-ellipsis gl-display-inline" data-testid="ellipsis">...</div>
+ <revision-dropdown
+ :refs-project-path="refsProjectPath"
+ revision-text="Target"
+ params-name="from"
+ :params-branch="paramsFrom"
+ />
+ <gl-button category="primary" variant="success" class="gl-ml-3" @click="onSubmit">
+ {{ s__('CompareRevisions|Compare') }}
+ </gl-button>
+ <gl-button
+ v-if="projectMergeRequestPath"
+ :href="projectMergeRequestPath"
+ data-testid="projectMrButton"
+ class="btn btn-default gl-button gl-ml-3"
+ >
+ {{ s__('CompareRevisions|View open merge request') }}
+ </gl-button>
+ <gl-button
+ v-else-if="createMrPath"
+ :href="createMrPath"
+ data-testid="createMrButton"
+ class="btn btn-default gl-button gl-ml-3"
+ >
+ {{ s__('CompareRevisions|Create merge request') }}
+ </gl-button>
+ </form>
+</template>
diff --git a/app/assets/javascripts/projects/compare/components/repo_dropdown.vue b/app/assets/javascripts/projects/compare/components/repo_dropdown.vue
new file mode 100644
index 00000000000..822dfc09d81
--- /dev/null
+++ b/app/assets/javascripts/projects/compare/components/repo_dropdown.vue
@@ -0,0 +1,93 @@
+<script>
+import { GlDropdown, GlDropdownItem, GlSearchBoxByType } from '@gitlab/ui';
+
+const SOURCE_PARAM_NAME = 'to';
+
+export default {
+ components: {
+ GlDropdown,
+ GlDropdownItem,
+ GlSearchBoxByType,
+ },
+ inject: ['projectTo', 'projectsFrom'],
+ props: {
+ paramsName: {
+ type: String,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ searchTerm: '',
+ selectedRepo: {},
+ };
+ },
+ computed: {
+ filteredRepos() {
+ const lowerCaseSearchTerm = this.searchTerm.toLowerCase();
+
+ return this?.projectsFrom.filter(({ name }) =>
+ name.toLowerCase().includes(lowerCaseSearchTerm),
+ );
+ },
+ isSourceRevision() {
+ return this.paramsName === SOURCE_PARAM_NAME;
+ },
+ inputName() {
+ return `${this.paramsName}_project_id`;
+ },
+ },
+ mounted() {
+ this.setDefaultRepo();
+ },
+ methods: {
+ onClick(repo) {
+ this.selectedRepo = repo;
+ this.emitTargetProject(repo.name);
+ },
+ setDefaultRepo() {
+ if (this.isSourceRevision) {
+ this.selectedRepo = this.projectTo;
+ return;
+ }
+
+ const [defaultTargetProject] = this.projectsFrom;
+ this.emitTargetProject(defaultTargetProject.name);
+ this.selectedRepo = defaultTargetProject;
+ },
+ emitTargetProject(name) {
+ if (!this.isSourceRevision) {
+ this.$emit('changeTargetProject', name);
+ }
+ },
+ },
+};
+</script>
+
+<template>
+ <div>
+ <input type="hidden" :name="inputName" :value="selectedRepo.id" />
+ <gl-dropdown
+ :text="selectedRepo.name"
+ :header-text="s__(`CompareRevisions|Select target project`)"
+ class="gl-w-full gl-font-monospace gl-sm-pr-3"
+ toggle-class="gl-min-w-0"
+ :disabled="isSourceRevision"
+ >
+ <template #header>
+ <gl-search-box-by-type v-if="!isSourceRevision" v-model.trim="searchTerm" />
+ </template>
+ <template v-if="!isSourceRevision">
+ <gl-dropdown-item
+ v-for="repo in filteredRepos"
+ :key="repo.id"
+ is-check-item
+ :is-checked="selectedRepo.id === repo.id"
+ @click="onClick(repo)"
+ >
+ {{ repo.name }}
+ </gl-dropdown-item>
+ </template>
+ </gl-dropdown>
+ </div>
+</template>
diff --git a/app/assets/javascripts/projects/compare/components/revision_card.vue b/app/assets/javascripts/projects/compare/components/revision_card.vue
new file mode 100644
index 00000000000..15d24792310
--- /dev/null
+++ b/app/assets/javascripts/projects/compare/components/revision_card.vue
@@ -0,0 +1,65 @@
+<script>
+import { GlCard } from '@gitlab/ui';
+import RepoDropdown from './repo_dropdown.vue';
+import RevisionDropdown from './revision_dropdown.vue';
+
+export default {
+ components: {
+ RepoDropdown,
+ RevisionDropdown,
+ GlCard,
+ },
+ props: {
+ refsProjectPath: {
+ type: String,
+ required: true,
+ },
+ revisionText: {
+ type: String,
+ required: true,
+ },
+ paramsName: {
+ type: String,
+ required: true,
+ },
+ paramsBranch: {
+ type: String,
+ required: false,
+ default: null,
+ },
+ },
+ data() {
+ return {
+ selectedRefsProjectPath: this.refsProjectPath,
+ };
+ },
+ methods: {
+ onChangeTargetProject(targetProjectName) {
+ if (this.paramsName === 'from') {
+ this.selectedRefsProjectPath = `/${targetProjectName}/refs`;
+ }
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-card header-class="gl-py-2 gl-px-3 gl-font-weight-bold" body-class="gl-px-3">
+ <template #header>
+ {{ s__(`CompareRevisions|${revisionText}`) }}
+ </template>
+ <div class="gl-sm-display-flex gl-align-items-center">
+ <repo-dropdown
+ class="gl-sm-w-half"
+ :params-name="paramsName"
+ @changeTargetProject="onChangeTargetProject"
+ />
+ <revision-dropdown
+ class="gl-sm-w-half gl-mt-3 gl-sm-mt-0"
+ :refs-project-path="selectedRefsProjectPath"
+ :params-name="paramsName"
+ :params-branch="paramsBranch"
+ />
+ </div>
+ </gl-card>
+</template>
diff --git a/app/assets/javascripts/projects/compare/components/revision_dropdown.vue b/app/assets/javascripts/projects/compare/components/revision_dropdown.vue
index 13d80b5ae0b..a175af2f32e 100644
--- a/app/assets/javascripts/projects/compare/components/revision_dropdown.vue
+++ b/app/assets/javascripts/projects/compare/components/revision_dropdown.vue
@@ -4,6 +4,8 @@ import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { s__ } from '~/locale';
+const emptyDropdownText = s__('CompareRevisions|Select branch/tag');
+
export default {
components: {
GlDropdown,
@@ -16,10 +18,6 @@ export default {
type: String,
required: true,
},
- revisionText: {
- type: String,
- required: true,
- },
paramsName: {
type: String,
required: true,
@@ -55,12 +53,24 @@ export default {
return this.filteredTags.length;
},
},
+ watch: {
+ refsProjectPath(newRefsProjectPath, oldRefsProjectPath) {
+ if (newRefsProjectPath !== oldRefsProjectPath) {
+ this.fetchBranchesAndTags(true);
+ }
+ },
+ },
mounted() {
this.fetchBranchesAndTags();
},
methods: {
- fetchBranchesAndTags() {
+ fetchBranchesAndTags(reset = false) {
const endpoint = this.refsProjectPath;
+ this.loading = true;
+
+ if (reset) {
+ this.selectedRevision = this.getDefaultBranch();
+ }
return axios
.get(endpoint)
@@ -70,9 +80,9 @@ export default {
})
.catch(() => {
createFlash({
- message: `${s__(
- 'CompareRevisions|There was an error while updating the branch/tag list. Please try again.',
- )}`,
+ message: s__(
+ 'CompareRevisions|There was an error while loading the branch/tag list. Please try again.',
+ ),
});
})
.finally(() => {
@@ -80,7 +90,7 @@ export default {
});
},
getDefaultBranch() {
- return this.paramsBranch || s__('CompareRevisions|Select branch/tag');
+ return this.paramsBranch || emptyDropdownText;
},
onClick(revision) {
this.selectedRevision = revision;
@@ -93,53 +103,46 @@ export default {
</script>
<template>
- <div class="form-group compare-form-group" :class="`js-compare-${paramsName}-dropdown`">
- <div class="input-group inline-input-group">
- <span class="input-group-prepend">
- <div class="input-group-text">
- {{ revisionText }}
- </div>
- </span>
- <input type="hidden" :name="paramsName" :value="selectedRevision" />
- <gl-dropdown
- class="gl-flex-grow-1 gl-flex-basis-0 gl-min-w-0 gl-font-monospace"
- toggle-class="form-control compare-dropdown-toggle js-compare-dropdown gl-min-w-0 gl-rounded-top-left-none! gl-rounded-bottom-left-none!"
- :text="selectedRevision"
- header-text="Select Git revision"
- :loading="loading"
+ <div :class="`js-compare-${paramsName}-dropdown`">
+ <input type="hidden" :name="paramsName" :value="selectedRevision" />
+ <gl-dropdown
+ class="gl-w-full gl-font-monospace"
+ toggle-class="form-control compare-dropdown-toggle js-compare-dropdown gl-min-w-0"
+ :text="selectedRevision"
+ :header-text="s__('CompareRevisions|Select Git revision')"
+ :loading="loading"
+ >
+ <template #header>
+ <gl-search-box-by-type
+ v-model.trim="searchTerm"
+ :placeholder="s__('CompareRevisions|Filter by Git revision')"
+ @keyup.enter="onSearchEnter"
+ />
+ </template>
+ <gl-dropdown-section-header v-if="hasFilteredBranches">
+ {{ s__('CompareRevisions|Branches') }}
+ </gl-dropdown-section-header>
+ <gl-dropdown-item
+ v-for="(branch, index) in filteredBranches"
+ :key="`branch${index}`"
+ is-check-item
+ :is-checked="selectedRevision === branch"
+ @click="onClick(branch)"
+ >
+ {{ branch }}
+ </gl-dropdown-item>
+ <gl-dropdown-section-header v-if="hasFilteredTags">
+ {{ s__('CompareRevisions|Tags') }}
+ </gl-dropdown-section-header>
+ <gl-dropdown-item
+ v-for="(tag, index) in filteredTags"
+ :key="`tag${index}`"
+ is-check-item
+ :is-checked="selectedRevision === tag"
+ @click="onClick(tag)"
>
- <template #header>
- <gl-search-box-by-type
- v-model.trim="searchTerm"
- :placeholder="s__('CompareRevisions|Filter by Git revision')"
- @keyup.enter="onSearchEnter"
- />
- </template>
- <gl-dropdown-section-header v-if="hasFilteredBranches">
- {{ s__('CompareRevisions|Branches') }}
- </gl-dropdown-section-header>
- <gl-dropdown-item
- v-for="(branch, index) in filteredBranches"
- :key="`branch${index}`"
- is-check-item
- :is-checked="selectedRevision === branch"
- @click="onClick(branch)"
- >
- {{ branch }}
- </gl-dropdown-item>
- <gl-dropdown-section-header v-if="hasFilteredTags">
- {{ s__('CompareRevisions|Tags') }}
- </gl-dropdown-section-header>
- <gl-dropdown-item
- v-for="(tag, index) in filteredTags"
- :key="`tag${index}`"
- is-check-item
- :is-checked="selectedRevision === tag"
- @click="onClick(tag)"
- >
- {{ tag }}
- </gl-dropdown-item>
- </gl-dropdown>
- </div>
+ {{ tag }}
+ </gl-dropdown-item>
+ </gl-dropdown>
</div>
</template>
diff --git a/app/assets/javascripts/projects/compare/components/revision_dropdown_legacy.vue b/app/assets/javascripts/projects/compare/components/revision_dropdown_legacy.vue
new file mode 100644
index 00000000000..13d80b5ae0b
--- /dev/null
+++ b/app/assets/javascripts/projects/compare/components/revision_dropdown_legacy.vue
@@ -0,0 +1,145 @@
+<script>
+import { GlDropdown, GlDropdownItem, GlSearchBoxByType, GlDropdownSectionHeader } from '@gitlab/ui';
+import createFlash from '~/flash';
+import axios from '~/lib/utils/axios_utils';
+import { s__ } from '~/locale';
+
+export default {
+ components: {
+ GlDropdown,
+ GlDropdownItem,
+ GlDropdownSectionHeader,
+ GlSearchBoxByType,
+ },
+ props: {
+ refsProjectPath: {
+ type: String,
+ required: true,
+ },
+ revisionText: {
+ type: String,
+ required: true,
+ },
+ paramsName: {
+ type: String,
+ required: true,
+ },
+ paramsBranch: {
+ type: String,
+ required: false,
+ default: null,
+ },
+ },
+ data() {
+ return {
+ branches: [],
+ tags: [],
+ loading: true,
+ searchTerm: '',
+ selectedRevision: this.getDefaultBranch(),
+ };
+ },
+ computed: {
+ filteredBranches() {
+ return this.branches.filter((branch) =>
+ branch.toLowerCase().includes(this.searchTerm.toLowerCase()),
+ );
+ },
+ hasFilteredBranches() {
+ return this.filteredBranches.length;
+ },
+ filteredTags() {
+ return this.tags.filter((tag) => tag.toLowerCase().includes(this.searchTerm.toLowerCase()));
+ },
+ hasFilteredTags() {
+ return this.filteredTags.length;
+ },
+ },
+ mounted() {
+ this.fetchBranchesAndTags();
+ },
+ methods: {
+ fetchBranchesAndTags() {
+ const endpoint = this.refsProjectPath;
+
+ return axios
+ .get(endpoint)
+ .then(({ data }) => {
+ this.branches = data.Branches || [];
+ this.tags = data.Tags || [];
+ })
+ .catch(() => {
+ createFlash({
+ message: `${s__(
+ 'CompareRevisions|There was an error while updating the branch/tag list. Please try again.',
+ )}`,
+ });
+ })
+ .finally(() => {
+ this.loading = false;
+ });
+ },
+ getDefaultBranch() {
+ return this.paramsBranch || s__('CompareRevisions|Select branch/tag');
+ },
+ onClick(revision) {
+ this.selectedRevision = revision;
+ },
+ onSearchEnter() {
+ this.selectedRevision = this.searchTerm;
+ },
+ },
+};
+</script>
+
+<template>
+ <div class="form-group compare-form-group" :class="`js-compare-${paramsName}-dropdown`">
+ <div class="input-group inline-input-group">
+ <span class="input-group-prepend">
+ <div class="input-group-text">
+ {{ revisionText }}
+ </div>
+ </span>
+ <input type="hidden" :name="paramsName" :value="selectedRevision" />
+ <gl-dropdown
+ class="gl-flex-grow-1 gl-flex-basis-0 gl-min-w-0 gl-font-monospace"
+ toggle-class="form-control compare-dropdown-toggle js-compare-dropdown gl-min-w-0 gl-rounded-top-left-none! gl-rounded-bottom-left-none!"
+ :text="selectedRevision"
+ header-text="Select Git revision"
+ :loading="loading"
+ >
+ <template #header>
+ <gl-search-box-by-type
+ v-model.trim="searchTerm"
+ :placeholder="s__('CompareRevisions|Filter by Git revision')"
+ @keyup.enter="onSearchEnter"
+ />
+ </template>
+ <gl-dropdown-section-header v-if="hasFilteredBranches">
+ {{ s__('CompareRevisions|Branches') }}
+ </gl-dropdown-section-header>
+ <gl-dropdown-item
+ v-for="(branch, index) in filteredBranches"
+ :key="`branch${index}`"
+ is-check-item
+ :is-checked="selectedRevision === branch"
+ @click="onClick(branch)"
+ >
+ {{ branch }}
+ </gl-dropdown-item>
+ <gl-dropdown-section-header v-if="hasFilteredTags">
+ {{ s__('CompareRevisions|Tags') }}
+ </gl-dropdown-section-header>
+ <gl-dropdown-item
+ v-for="(tag, index) in filteredTags"
+ :key="`tag${index}`"
+ is-check-item
+ :is-checked="selectedRevision === tag"
+ @click="onClick(tag)"
+ >
+ {{ tag }}
+ </gl-dropdown-item>
+ </gl-dropdown>
+ </div>
+ </div>
+</template>
diff --git a/app/assets/javascripts/projects/compare/index.js b/app/assets/javascripts/projects/compare/index.js
index 4337eecb667..4ba4e308cd4 100644
--- a/app/assets/javascripts/projects/compare/index.js
+++ b/app/assets/javascripts/projects/compare/index.js
@@ -1,8 +1,46 @@
import Vue from 'vue';
import CompareApp from './components/app.vue';
+import CompareAppLegacy from './components/app_legacy.vue';
export default function init() {
const el = document.getElementById('js-compare-selector');
+
+ if (gon.features?.compareRepoDropdown) {
+ const {
+ refsProjectPath,
+ paramsFrom,
+ paramsTo,
+ projectCompareIndexPath,
+ projectMergeRequestPath,
+ createMrPath,
+ projectTo,
+ projectsFrom,
+ } = el.dataset;
+
+ return new Vue({
+ el,
+ components: {
+ CompareApp,
+ },
+ provide: {
+ projectTo: JSON.parse(projectTo),
+ projectsFrom: JSON.parse(projectsFrom),
+ },
+ render(createElement) {
+ return createElement(CompareApp, {
+ props: {
+ refsProjectPath,
+ paramsFrom,
+ paramsTo,
+ projectCompareIndexPath,
+ projectMergeRequestPath,
+ createMrPath,
+ },
+ });
+ },
+ });
+ }
+
const {
refsProjectPath,
paramsFrom,
@@ -15,10 +53,10 @@ export default function init() {
return new Vue({
el,
components: {
- CompareApp,
+ CompareAppLegacy,
},
render(createElement) {
- return createElement(CompareApp, {
+ return createElement(CompareAppLegacy, {
props: {
refsProjectPath,
paramsFrom,
diff --git a/app/assets/javascripts/projects/details/upload_button.vue b/app/assets/javascripts/projects/details/upload_button.vue
new file mode 100644
index 00000000000..a89ea34c438
--- /dev/null
+++ b/app/assets/javascripts/projects/details/upload_button.vue
@@ -0,0 +1,49 @@
+<script>
+import { GlButton, GlModalDirective } from '@gitlab/ui';
+import UploadBlobModal from '~/repository/components/upload_blob_modal.vue';
+
+const UPLOAD_BLOB_MODAL_ID = 'details-modal-upload-blob';
+
+export default {
+ components: {
+ GlButton,
+ UploadBlobModal,
+ },
+ directives: {
+ GlModal: GlModalDirective,
+ },
+ inject: {
+ targetBranch: {
+ default: '',
+ },
+ origionalBranch: {
+ default: '',
+ },
+ canPushCode: {
+ default: false,
+ },
+ path: {
+ default: '',
+ },
+ projectPath: {
+ default: '',
+ },
+ },
+ uploadBlobModalId: UPLOAD_BLOB_MODAL_ID,
+};
+</script>
+<template>
+ <span>
+ <gl-button v-gl-modal="$options.uploadBlobModalId" icon="upload">{{
+ __('Upload File')
+ }}</gl-button>
+ <upload-blob-modal
+ :modal-id="$options.uploadBlobModalId"
+ :commit-message="__('Upload New File')"
+ :target-branch="targetBranch"
+ :origional-branch="origionalBranch"
+ :can-push-code="canPushCode"
+ :path="path"
+ />
+ </span>
+</template>
diff --git a/app/assets/javascripts/projects/experiment_new_project_creation/components/new_project_push_tip_popover.vue b/app/assets/javascripts/projects/experiment_new_project_creation/components/new_project_push_tip_popover.vue
new file mode 100644
index 00000000000..e42d9154866
--- /dev/null
+++ b/app/assets/javascripts/projects/experiment_new_project_creation/components/new_project_push_tip_popover.vue
@@ -0,0 +1,66 @@
+<script>
+import { GlPopover, GlFormInputGroup } from '@gitlab/ui';
+import { __ } from '~/locale';
+import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
+
+export default {
+ components: {
+ GlPopover,
+ GlFormInputGroup,
+ ClipboardButton,
+ },
+ inject: ['pushToCreateProjectCommand', 'workingWithProjectsHelpPath'],
+ props: {
+ target: {
+ type: [Function, HTMLElement],
+ required: true,
+ },
+ },
+ i18n: {
+ clipboardButtonTitle: __('Copy command'),
+ commandInputAriaLabel: __('Push project from command line'),
+ helpLinkText: __('What does this command do?'),
+ labelText: __('Private projects can be created in your personal namespace with:'),
+ popoverTitle: __('Push to create a project'),
+ },
+};
+</script>
+<template>
+ <gl-popover
+ :target="target"
+ :title="$options.i18n.popoverTitle"
+ triggers="click blur"
+ placement="top"
+ >
+ <p>
+ <label for="push-to-create-tip" class="gl-font-weight-normal">
+ {{ $options.i18n.labelText }}
+ </label>
+ </p>
+ <p>
+ <gl-form-input-group
+ id="push-to-create-tip"
+ :value="pushToCreateProjectCommand"
+ readonly
+ select-on-click
+ :aria-label="$options.i18n.commandInputAriaLabel"
+ >
+ <template #append>
+ <clipboard-button
+ :text="pushToCreateProjectCommand"
+ :title="$options.i18n.clipboardButtonTitle"
+ tooltip-placement="right"
+ />
+ </template>
+ </gl-form-input-group>
+ </p>
+ <p>
+ <a
+ :href="`${workingWithProjectsHelpPath}#push-to-create-a-new-project`"
+ class="gl-font-sm"
+ target="_blank"
+ >{{ $options.i18n.helpLinkText }}</a
+ >
+ </p>
+ </gl-popover>
+</template>
diff --git a/app/assets/javascripts/projects/experiment_new_project_creation/components/welcome.vue b/app/assets/javascripts/projects/experiment_new_project_creation/components/welcome.vue
index 63a65975fff..ed82a635b1f 100644
--- a/app/assets/javascripts/projects/experiment_new_project_creation/components/welcome.vue
+++ b/app/assets/javascripts/projects/experiment_new_project_creation/components/welcome.vue
@@ -1,15 +1,13 @@
<script>
/* eslint-disable vue/no-v-html */
-import { GlPopover } from '@gitlab/ui';
import Tracking from '~/tracking';
-import LegacyContainer from './legacy_container.vue';
+import NewProjectPushTipPopover from './new_project_push_tip_popover.vue';
const trackingMixin = Tracking.mixin(gon.tracking_data);
export default {
components: {
- GlPopover,
- LegacyContainer,
+ NewProjectPushTipPopover,
},
mixins: [trackingMixin],
props: {
@@ -52,19 +50,15 @@ export default {
<p>
{{ __('You can also create a project from the command line.') }}
<a
- id="cli-tip"
+ ref="clipTip"
href="#"
click.prevent
class="push-new-project-tip"
- data-title="Push to create a project"
rel="noopener noreferrer"
>
{{ __('Show command') }}
</a>
-
- <gl-popover target="cli-tip" triggers="click blur" placement="top">
- <legacy-container selector=".push-new-project-tip-template" />
- </gl-popover>
+ <new-project-push-tip-popover :target="() => $refs.clipTip" />
</p>
</div>
</div>
diff --git a/app/assets/javascripts/projects/experiment_new_project_creation/index.js b/app/assets/javascripts/projects/experiment_new_project_creation/index.js
index 0414f7ef6a5..ea686d4e1e8 100644
--- a/app/assets/javascripts/projects/experiment_new_project_creation/index.js
+++ b/app/assets/javascripts/projects/experiment_new_project_creation/index.js
@@ -2,11 +2,17 @@ import Vue from 'vue';
import NewProjectCreationApp from './components/app.vue';
export default function initNewProjectCreation(el, props) {
+ const { pushToCreateProjectCommand, workingWithProjectsHelpPath } = el.dataset;
+
return new Vue({
el,
components: {
NewProjectCreationApp,
},
+ provide: {
+ workingWithProjectsHelpPath,
+ pushToCreateProjectCommand,
+ },
render(h) {
return h(NewProjectCreationApp, { props });
},
diff --git a/app/assets/javascripts/projects/feature_flags_user_lists/show/index.js b/app/assets/javascripts/projects/feature_flags_user_lists/show/index.js
new file mode 100644
index 00000000000..2bd3e57322d
--- /dev/null
+++ b/app/assets/javascripts/projects/feature_flags_user_lists/show/index.js
@@ -0,0 +1,23 @@
+import Vue from 'vue';
+import Vuex from 'vuex';
+import UserList from '~/user_lists/components/user_list.vue';
+import createStore from '~/user_lists/store/show';
+
+Vue.use(Vuex);
+
+export default function featureFlagsUserListInit() {
+ const el = document.getElementById('js-edit-user-list');
+
+ if (!el) {
+ return null;
+ }
+
+ return new Vue({
+ el,
+ store: createStore(el.dataset),
+ render(h) {
+ const { emptyStatePath } = el.dataset;
+ return h(UserList, { props: { emptyStatePath } });
+ },
+ });
+}
diff --git a/app/assets/javascripts/projects/pipelines/charts/components/pipeline_charts.vue b/app/assets/javascripts/projects/pipelines/charts/components/pipeline_charts.vue
index 733f833d51a..6a963616224 100644
--- a/app/assets/javascripts/projects/pipelines/charts/components/pipeline_charts.vue
+++ b/app/assets/javascripts/projects/pipelines/charts/components/pipeline_charts.vue
@@ -252,10 +252,10 @@ export default {
},
errorTexts: {
[LOAD_ANALYTICS_FAILURE]: s__(
- 'PipelineCharts|An error has ocurred when retrieving the analytics data',
+ 'PipelineCharts|An error has occurred when retrieving the analytics data',
),
[LOAD_PIPELINES_FAILURE]: s__(
- 'PipelineCharts|An error has ocurred when retrieving the pipelines data',
+ 'PipelineCharts|An error has occurred when retrieving the pipelines data',
),
[PARSE_FAILURE]: s__('PipelineCharts|There was an error parsing the data for the charts.'),
[DEFAULT]: s__('PipelineCharts|An unknown error occurred while processing CI/CD analytics.'),
@@ -292,7 +292,7 @@ export default {
failure.text
}}</gl-alert>
<div class="gl-mb-3">
- <h3>{{ s__('PipelineCharts|CI / CD Analytics') }}</h3>
+ <h3>{{ s__('PipelineCharts|CI/CD Analytics') }}</h3>
</div>
<h4 class="gl-my-4">{{ s__('PipelineCharts|Overall statistics') }}</h4>
<div class="row">
diff --git a/app/assets/javascripts/projects/project_new.js b/app/assets/javascripts/projects/project_new.js
index e3ba84102a8..04ea6f760f6 100644
--- a/app/assets/javascripts/projects/project_new.js
+++ b/app/assets/javascripts/projects/project_new.js
@@ -1,6 +1,5 @@
import $ from 'jquery';
import DEFAULT_PROJECT_TEMPLATES from 'ee_else_ce/projects/default_project_templates';
-import { addSelectOnFocusBehaviour } from '../lib/utils/common_utils';
import {
convertToTitleCase,
humanize,
@@ -81,7 +80,6 @@ const bindEvents = () => {
const $selectedTemplateText = $('.selected-template');
const $changeTemplateBtn = $('.change-template');
const $selectedIcon = $('.selected-icon');
- const $pushNewProjectTipTrigger = $('.push-new-project-tip');
const $projectTemplateButtons = $('.project-templates-buttons');
const $projectName = $('.tab-pane.active #project_name');
@@ -108,39 +106,6 @@ const bindEvents = () => {
);
});
- if ($pushNewProjectTipTrigger) {
- $pushNewProjectTipTrigger
- .removeAttr('rel')
- .removeAttr('target')
- .on('click', (e) => {
- e.preventDefault();
- })
- .popover({
- title: $pushNewProjectTipTrigger.data('title'),
- placement: 'bottom',
- html: true,
- content: $('.push-new-project-tip-template').html(),
- })
- .on('shown.bs.popover', () => {
- $(document).on('click.popover touchstart.popover', (event) => {
- if ($(event.target).closest('.popover').length === 0) {
- $pushNewProjectTipTrigger.trigger('click');
- }
- });
-
- const target = $(`#${$pushNewProjectTipTrigger.attr('aria-describedby')}`).find(
- '.js-select-on-focus',
- );
- addSelectOnFocusBehaviour(target);
-
- target.focus();
- })
- .on('hide.bs.popover', () => {
- // eslint-disable-next-line @gitlab/no-global-event-off
- $(document).off('click.popover touchstart.popover');
- });
- }
-
function chooseTemplate() {
$projectTemplateButtons.addClass('hidden');
$projectFieldsForm.addClass('selected');
diff --git a/app/assets/javascripts/projects/settings_service_desk/components/service_desk_root.vue b/app/assets/javascripts/projects/settings_service_desk/components/service_desk_root.vue
index 9b3c0dd2755..fb00f58abae 100644
--- a/app/assets/javascripts/projects/settings_service_desk/components/service_desk_root.vue
+++ b/app/assets/javascripts/projects/settings_service_desk/components/service_desk_root.vue
@@ -95,7 +95,7 @@ export default {
})
.catch((err) => {
this.showAlert(
- sprintf(__('An error occured while saving changes: %{error}'), {
+ sprintf(__('An error occurred while saving changes: %{error}'), {
error: err?.response?.data?.message,
}),
);
diff --git a/app/assets/javascripts/projects/settings_service_desk/components/service_desk_setting.vue b/app/assets/javascripts/projects/settings_service_desk/components/service_desk_setting.vue
index 39d9a6a4239..ece4e271200 100644
--- a/app/assets/javascripts/projects/settings_service_desk/components/service_desk_setting.vue
+++ b/app/assets/javascripts/projects/settings_service_desk/components/service_desk_setting.vue
@@ -162,6 +162,7 @@ export default {
<gl-form-select
id="service-desk-template-select"
v-model="selectedTemplate"
+ data-qa-selector="service_desk_template_dropdown"
:options="templateOptions"
/>
<label for="service-desk-email-from-name" class="mt-3">
@@ -175,6 +176,7 @@ export default {
<gl-button
variant="success"
class="gl-mt-5"
+ data-qa-selector="save_service_desk_settings_button"
:disabled="isTemplateSaving"
@click="onSaveTemplate"
>
diff --git a/app/assets/javascripts/projects/upload_file_experiment.js b/app/assets/javascripts/projects/upload_file_experiment.js
new file mode 100644
index 00000000000..7d61df36a75
--- /dev/null
+++ b/app/assets/javascripts/projects/upload_file_experiment.js
@@ -0,0 +1,24 @@
+import ExperimentTracking from '~/experimentation/experiment_tracking';
+
+function trackEvent(eventName) {
+ const isEmpty = Boolean(document.querySelector('.project-home-panel.empty-project'));
+ const property = isEmpty ? 'empty' : 'nonempty';
+ const label = 'blob-upload-modal';
+ const Tracking = new ExperimentTracking('empty_repo_upload', { label, property });
+
+ Tracking.event(eventName);
+}
+
+export function initUploadFileTrigger() {
+ const uploadFileTriggerEl = document.querySelector('.js-upload-file-experiment-trigger');
+
+ if (uploadFileTriggerEl) {
+ uploadFileTriggerEl.addEventListener('click', () => {
+ trackEvent('click_upload_modal_trigger');
+ });
+ }
+}
+
+export function trackUploadFileFormSubmitted() {
+ trackEvent('click_upload_modal_form_submit');
+}
diff --git a/app/assets/javascripts/protected_branches/protected_branch_create.js b/app/assets/javascripts/protected_branches/protected_branch_create.js
index c9474f0516c..726ddba1014 100644
--- a/app/assets/javascripts/protected_branches/protected_branch_create.js
+++ b/app/assets/javascripts/protected_branches/protected_branch_create.js
@@ -15,17 +15,23 @@ export default class ProtectedBranchCreate {
this.isLocalStorageAvailable = AccessorUtilities.isLocalStorageAccessSafe();
this.currentProjectUserDefaults = {};
this.buildDropdowns();
+ this.$forcePushToggle = this.$form.find('.js-force-push-toggle');
this.$codeOwnerToggle = this.$form.find('.js-code-owner-toggle');
this.bindEvents();
}
bindEvents() {
+ this.$forcePushToggle.on('click', this.onForcePushToggleClick.bind(this));
if (this.hasLicense) {
this.$codeOwnerToggle.on('click', this.onCodeOwnerToggleClick.bind(this));
}
this.$form.on('submit', this.onFormSubmit.bind(this));
}
+ onForcePushToggleClick() {
+ this.$forcePushToggle.toggleClass('is-checked');
+ }
+
onCodeOwnerToggleClick() {
this.$codeOwnerToggle.toggleClass('is-checked');
}
@@ -86,6 +92,7 @@ export default class ProtectedBranchCreate {
authenticity_token: this.$form.find('input[name="authenticity_token"]').val(),
protected_branch: {
name: this.$form.find('input[name="protected_branch[name]"]').val(),
+ allow_force_push: this.$forcePushToggle.hasClass('is-checked'),
code_owner_approval_required: this.$codeOwnerToggle.hasClass('is-checked'),
},
};
diff --git a/app/assets/javascripts/protected_branches/protected_branch_edit.js b/app/assets/javascripts/protected_branches/protected_branch_edit.js
index 986abeecafa..bd2694e0cf7 100644
--- a/app/assets/javascripts/protected_branches/protected_branch_edit.js
+++ b/app/assets/javascripts/protected_branches/protected_branch_edit.js
@@ -14,6 +14,7 @@ export default class ProtectedBranchEdit {
this.$wrap = options.$wrap;
this.$allowedToMergeDropdown = this.$wrap.find('.js-allowed-to-merge');
this.$allowedToPushDropdown = this.$wrap.find('.js-allowed-to-push');
+ this.$forcePushToggle = this.$wrap.find('.js-force-push-toggle');
this.$codeOwnerToggle = this.$wrap.find('.js-code-owner-toggle');
this.$wraps[ACCESS_LEVELS.MERGE] = this.$allowedToMergeDropdown.closest(
@@ -28,11 +29,23 @@ export default class ProtectedBranchEdit {
}
bindEvents() {
+ this.$forcePushToggle.on('click', this.onForcePushToggleClick.bind(this));
if (this.hasLicense) {
this.$codeOwnerToggle.on('click', this.onCodeOwnerToggleClick.bind(this));
}
}
+ onForcePushToggleClick() {
+ this.$forcePushToggle.toggleClass('is-checked');
+ this.$forcePushToggle.prop('disabled', true);
+
+ const formData = {
+ allow_force_push: this.$forcePushToggle.hasClass('is-checked'),
+ };
+
+ this.updateProtectedBranch(formData, () => this.$forcePushToggle.prop('disabled', false));
+ }
+
onCodeOwnerToggleClick() {
this.$codeOwnerToggle.toggleClass('is-checked');
this.$codeOwnerToggle.prop('disabled', true);
@@ -41,17 +54,15 @@ export default class ProtectedBranchEdit {
code_owner_approval_required: this.$codeOwnerToggle.hasClass('is-checked'),
};
- this.updateCodeOwnerApproval(formData);
+ this.updateProtectedBranch(formData, () => this.$codeOwnerToggle.prop('disabled', false));
}
- updateCodeOwnerApproval(formData) {
+ updateProtectedBranch(formData, callback) {
axios
.patch(this.$wrap.data('url'), {
protected_branch: formData,
})
- .then(() => {
- this.$codeOwnerToggle.prop('disabled', false);
- })
+ .then(callback)
.catch(() => {
flash(__('Failed to update branch!'));
});
diff --git a/app/assets/javascripts/ref/components/ref_results_section.vue b/app/assets/javascripts/ref/components/ref_results_section.vue
index 87ce4f1a49c..4fa2a92ff03 100644
--- a/app/assets/javascripts/ref/components/ref_results_section.vue
+++ b/app/assets/javascripts/ref/components/ref_results_section.vue
@@ -11,6 +11,12 @@ export default {
GlIcon,
},
props: {
+ showHeader: {
+ type: Boolean,
+ required: false,
+ default: true,
+ },
+
sectionTitle: {
type: String,
required: true,
@@ -84,7 +90,7 @@ export default {
<template>
<div>
- <gl-dropdown-section-header>
+ <gl-dropdown-section-header v-if="showHeader">
<div class="gl-display-flex align-items-center" data-testid="section-header">
<span class="gl-mr-2 gl-mb-1">{{ sectionTitle }}</span>
<gl-badge variant="neutral">{{ totalCountText }}</gl-badge>
diff --git a/app/assets/javascripts/ref/components/ref_selector.vue b/app/assets/javascripts/ref/components/ref_selector.vue
index 8f2805b36f6..82963fe98fd 100644
--- a/app/assets/javascripts/ref/components/ref_selector.vue
+++ b/app/assets/javascripts/ref/components/ref_selector.vue
@@ -2,32 +2,48 @@
import {
GlDropdown,
GlDropdownDivider,
- GlDropdownSectionHeader,
GlSearchBoxByType,
GlSprintf,
- GlIcon,
GlLoadingIcon,
} from '@gitlab/ui';
-import { debounce } from 'lodash';
+import { debounce, isArray } from 'lodash';
import { mapActions, mapGetters, mapState } from 'vuex';
-import { SEARCH_DEBOUNCE_MS, DEFAULT_I18N } from '../constants';
+import {
+ ALL_REF_TYPES,
+ SEARCH_DEBOUNCE_MS,
+ DEFAULT_I18N,
+ REF_TYPE_BRANCHES,
+ REF_TYPE_TAGS,
+ REF_TYPE_COMMITS,
+} from '../constants';
import createStore from '../stores';
import RefResultsSection from './ref_results_section.vue';
export default {
name: 'RefSelector',
- store: createStore(),
components: {
GlDropdown,
GlDropdownDivider,
- GlDropdownSectionHeader,
GlSearchBoxByType,
GlSprintf,
- GlIcon,
GlLoadingIcon,
RefResultsSection,
},
props: {
+ enabledRefTypes: {
+ type: Array,
+ required: false,
+ default: () => ALL_REF_TYPES,
+ validator: (val) =>
+ // It has to be an arrray
+ isArray(val) &&
+ // with at least one item
+ val.length > 0 &&
+ // and only "REF_TYPE_BRANCHES", "REF_TYPE_TAGS", and "REF_TYPE_COMMITS" are allowed
+ val.every((item) => ALL_REF_TYPES.includes(item)) &&
+ // and no duplicates are allowed
+ val.length === new Set(val).size,
+ },
value: {
type: String,
required: false,
@@ -42,6 +58,13 @@ export default {
required: false,
default: () => ({}),
},
+
+ /** The validation state of this component. */
+ state: {
+ type: Boolean,
+ required: false,
+ default: true,
+ },
},
data() {
return {
@@ -62,17 +85,45 @@ export default {
};
},
showBranchesSection() {
- return Boolean(this.matches.branches.totalCount > 0 || this.matches.branches.error);
+ return (
+ this.enabledRefTypes.includes(REF_TYPE_BRANCHES) &&
+ Boolean(this.matches.branches.totalCount > 0 || this.matches.branches.error)
+ );
},
showTagsSection() {
- return Boolean(this.matches.tags.totalCount > 0 || this.matches.tags.error);
+ return (
+ this.enabledRefTypes.includes(REF_TYPE_TAGS) &&
+ Boolean(this.matches.tags.totalCount > 0 || this.matches.tags.error)
+ );
},
showCommitsSection() {
- return Boolean(this.matches.commits.totalCount > 0 || this.matches.commits.error);
+ return (
+ this.enabledRefTypes.includes(REF_TYPE_COMMITS) &&
+ Boolean(this.matches.commits.totalCount > 0 || this.matches.commits.error)
+ );
},
showNoResults() {
return !this.showBranchesSection && !this.showTagsSection && !this.showCommitsSection;
},
+ showSectionHeaders() {
+ return this.enabledRefTypes.length > 1;
+ },
+ toggleButtonClass() {
+ return {
+ 'gl-inset-border-1-red-500!': !this.state,
+ 'gl-font-monospace': Boolean(this.selectedRef),
+ };
+ },
+ footerSlotProps() {
+ return {
+ isLoading: this.isLoading,
+ matches: this.matches,
+ query: this.lastQuery,
+ };
+ },
+ buttonText() {
+ return this.selectedRef || this.i18n.noRefSelected;
+ },
},
watch: {
// Keep the Vuex store synchronized if the parent
@@ -86,6 +137,14 @@ export default {
},
},
},
+ beforeCreate() {
+ // Setting the store here instead of using
+ // the built in `store` component option because
+ // we need each new `RefSelector` instance to
+ // create a new Vuex store instance.
+ // See https://github.com/vuejs/vuex/issues/414#issue-184491718.
+ this.$store = createStore();
+ },
created() {
// This method is defined here instead of in `methods`
// because we need to access the .cancel() method
@@ -93,20 +152,29 @@ export default {
// made inaccessible by Vue. More info:
// https://stackoverflow.com/a/52988020/1063392
this.debouncedSearch = debounce(function search() {
- this.search(this.query);
+ this.search();
}, SEARCH_DEBOUNCE_MS);
this.setProjectId(this.projectId);
- this.search(this.query);
+
+ this.$watch(
+ 'enabledRefTypes',
+ () => {
+ this.setEnabledRefTypes(this.enabledRefTypes);
+ this.search();
+ },
+ { immediate: true },
+ );
},
methods: {
- ...mapActions(['setProjectId', 'setSelectedRef', 'search']),
+ ...mapActions(['setEnabledRefTypes', 'setProjectId', 'setSelectedRef']),
+ ...mapActions({ storeSearch: 'search' }),
focusSearchBox() {
this.$refs.searchBox.$el.querySelector('input').focus();
},
onSearchBoxEnter() {
this.debouncedSearch.cancel();
- this.search(this.query);
+ this.search();
},
onSearchBoxInput() {
this.debouncedSearch();
@@ -115,97 +183,96 @@ export default {
this.setSelectedRef(ref);
this.$emit('input', this.selectedRef);
},
+ search() {
+ this.storeSearch(this.query);
+ },
},
};
</script>
<template>
- <gl-dropdown v-bind="$attrs" class="ref-selector" @shown="focusSearchBox">
- <template slot="button-content">
- <span class="gl-flex-grow-1 gl-ml-2 gl-text-gray-400" data-testid="button-content">
- <span v-if="selectedRef" class="gl-font-monospace">{{ selectedRef }}</span>
- <span v-else>{{ i18n.noRefSelected }}</span>
- </span>
- <gl-icon name="chevron-down" />
- </template>
-
- <div class="gl-display-flex gl-flex-direction-column ref-selector-dropdown-content">
- <gl-dropdown-section-header>
- <span class="gl-text-center gl-display-block">{{ i18n.dropdownHeader }}</span>
- </gl-dropdown-section-header>
-
- <gl-dropdown-divider />
-
+ <gl-dropdown
+ :header-text="i18n.dropdownHeader"
+ :toggle-class="toggleButtonClass"
+ :text="buttonText"
+ class="ref-selector"
+ v-bind="$attrs"
+ v-on="$listeners"
+ @shown="focusSearchBox"
+ >
+ <template #header>
<gl-search-box-by-type
ref="searchBox"
v-model.trim="query"
:placeholder="i18n.searchPlaceholder"
+ autocomplete="off"
@input="onSearchBoxInput"
@keydown.enter.prevent="onSearchBoxEnter"
/>
+ </template>
- <div class="gl-flex-grow-1 gl-overflow-y-auto">
- <gl-loading-icon v-if="isLoading" size="lg" class="gl-my-3" />
+ <gl-loading-icon v-if="isLoading" size="lg" class="gl-my-3" />
- <div
- v-else-if="showNoResults"
- class="gl-text-center gl-mx-3 gl-py-3"
- data-testid="no-results"
- >
- <gl-sprintf v-if="lastQuery" :message="i18n.noResultsWithQuery">
- <template #query>
- <b class="gl-word-break-all">{{ lastQuery }}</b>
- </template>
- </gl-sprintf>
+ <div v-else-if="showNoResults" class="gl-text-center gl-mx-3 gl-py-3" data-testid="no-results">
+ <gl-sprintf v-if="lastQuery" :message="i18n.noResultsWithQuery">
+ <template #query>
+ <b class="gl-word-break-all">{{ lastQuery }}</b>
+ </template>
+ </gl-sprintf>
- <span v-else>{{ i18n.noResults }}</span>
- </div>
+ <span v-else>{{ i18n.noResults }}</span>
+ </div>
- <template v-else>
- <template v-if="showBranchesSection">
- <ref-results-section
- :section-title="i18n.branches"
- :total-count="matches.branches.totalCount"
- :items="matches.branches.list"
- :selected-ref="selectedRef"
- :error="matches.branches.error"
- :error-message="i18n.branchesErrorMessage"
- data-testid="branches-section"
- @selected="selectRef($event)"
- />
+ <template v-else>
+ <template v-if="showBranchesSection">
+ <ref-results-section
+ :section-title="i18n.branches"
+ :total-count="matches.branches.totalCount"
+ :items="matches.branches.list"
+ :selected-ref="selectedRef"
+ :error="matches.branches.error"
+ :error-message="i18n.branchesErrorMessage"
+ :show-header="showSectionHeaders"
+ data-testid="branches-section"
+ @selected="selectRef($event)"
+ />
- <gl-dropdown-divider v-if="showTagsSection || showCommitsSection" />
- </template>
+ <gl-dropdown-divider v-if="showTagsSection || showCommitsSection" />
+ </template>
- <template v-if="showTagsSection">
- <ref-results-section
- :section-title="i18n.tags"
- :total-count="matches.tags.totalCount"
- :items="matches.tags.list"
- :selected-ref="selectedRef"
- :error="matches.tags.error"
- :error-message="i18n.tagsErrorMessage"
- data-testid="tags-section"
- @selected="selectRef($event)"
- />
+ <template v-if="showTagsSection">
+ <ref-results-section
+ :section-title="i18n.tags"
+ :total-count="matches.tags.totalCount"
+ :items="matches.tags.list"
+ :selected-ref="selectedRef"
+ :error="matches.tags.error"
+ :error-message="i18n.tagsErrorMessage"
+ :show-header="showSectionHeaders"
+ data-testid="tags-section"
+ @selected="selectRef($event)"
+ />
- <gl-dropdown-divider v-if="showCommitsSection" />
- </template>
+ <gl-dropdown-divider v-if="showCommitsSection" />
+ </template>
- <template v-if="showCommitsSection">
- <ref-results-section
- :section-title="i18n.commits"
- :total-count="matches.commits.totalCount"
- :items="matches.commits.list"
- :selected-ref="selectedRef"
- :error="matches.commits.error"
- :error-message="i18n.commitsErrorMessage"
- data-testid="commits-section"
- @selected="selectRef($event)"
- />
- </template>
- </template>
- </div>
- </div>
+ <template v-if="showCommitsSection">
+ <ref-results-section
+ :section-title="i18n.commits"
+ :total-count="matches.commits.totalCount"
+ :items="matches.commits.list"
+ :selected-ref="selectedRef"
+ :error="matches.commits.error"
+ :error-message="i18n.commitsErrorMessage"
+ :show-header="showSectionHeaders"
+ data-testid="commits-section"
+ @selected="selectRef($event)"
+ />
+ </template>
+ </template>
+
+ <template #footer>
+ <slot name="footer" v-bind="footerSlotProps"></slot>
+ </template>
</gl-dropdown>
</template>
diff --git a/app/assets/javascripts/ref/constants.js b/app/assets/javascripts/ref/constants.js
index ca82b951377..44d0f50b832 100644
--- a/app/assets/javascripts/ref/constants.js
+++ b/app/assets/javascripts/ref/constants.js
@@ -1,5 +1,10 @@
import { __ } from '~/locale';
+export const REF_TYPE_BRANCHES = 'REF_TYPE_BRANCHES';
+export const REF_TYPE_TAGS = 'REF_TYPE_TAGS';
+export const REF_TYPE_COMMITS = 'REF_TYPE_COMMITS';
+export const ALL_REF_TYPES = Object.freeze([REF_TYPE_BRANCHES, REF_TYPE_TAGS, REF_TYPE_COMMITS]);
+
export const X_TOTAL_HEADER = 'x-total';
export const SEARCH_DEBOUNCE_MS = 250;
diff --git a/app/assets/javascripts/ref/stores/actions.js b/app/assets/javascripts/ref/stores/actions.js
index d9bdd64ace5..3832cc0c21d 100644
--- a/app/assets/javascripts/ref/stores/actions.js
+++ b/app/assets/javascripts/ref/stores/actions.js
@@ -1,17 +1,26 @@
import Api from '~/api';
+import { REF_TYPE_BRANCHES, REF_TYPE_TAGS, REF_TYPE_COMMITS } from '../constants';
import * as types from './mutation_types';
+export const setEnabledRefTypes = ({ commit }, refTypes) =>
+ commit(types.SET_ENABLED_REF_TYPES, refTypes);
+
export const setProjectId = ({ commit }, projectId) => commit(types.SET_PROJECT_ID, projectId);
export const setSelectedRef = ({ commit }, selectedRef) =>
commit(types.SET_SELECTED_REF, selectedRef);
-export const search = ({ dispatch, commit }, query) => {
+export const search = ({ state, dispatch, commit }, query) => {
commit(types.SET_QUERY, query);
- dispatch('searchBranches');
- dispatch('searchTags');
- dispatch('searchCommits');
+ const dispatchIfRefTypeEnabled = (refType, action) => {
+ if (state.enabledRefTypes.includes(refType)) {
+ dispatch(action);
+ }
+ };
+ dispatchIfRefTypeEnabled(REF_TYPE_BRANCHES, 'searchBranches');
+ dispatchIfRefTypeEnabled(REF_TYPE_TAGS, 'searchTags');
+ dispatchIfRefTypeEnabled(REF_TYPE_COMMITS, 'searchCommits');
};
export const searchBranches = ({ commit, state }) => {
diff --git a/app/assets/javascripts/ref/stores/mutation_types.js b/app/assets/javascripts/ref/stores/mutation_types.js
index 9f6195f5f3f..c26f4fa00c7 100644
--- a/app/assets/javascripts/ref/stores/mutation_types.js
+++ b/app/assets/javascripts/ref/stores/mutation_types.js
@@ -1,3 +1,5 @@
+export const SET_ENABLED_REF_TYPES = 'SET_ENABLED_REF_TYPES';
+
export const SET_PROJECT_ID = 'SET_PROJECT_ID';
export const SET_SELECTED_REF = 'SET_SELECTED_REF';
export const SET_QUERY = 'SET_QUERY';
diff --git a/app/assets/javascripts/ref/stores/mutations.js b/app/assets/javascripts/ref/stores/mutations.js
index 4dc73dabfe2..f91cbae8462 100644
--- a/app/assets/javascripts/ref/stores/mutations.js
+++ b/app/assets/javascripts/ref/stores/mutations.js
@@ -4,6 +4,9 @@ import { X_TOTAL_HEADER } from '../constants';
import * as types from './mutation_types';
export default {
+ [types.SET_ENABLED_REF_TYPES](state, refTypes) {
+ state.enabledRefTypes = refTypes;
+ },
[types.SET_PROJECT_ID](state, projectId) {
state.projectId = projectId;
},
diff --git a/app/assets/javascripts/ref/stores/state.js b/app/assets/javascripts/ref/stores/state.js
index 65b9d6449d7..3affa8f8d03 100644
--- a/app/assets/javascripts/ref/stores/state.js
+++ b/app/assets/javascripts/ref/stores/state.js
@@ -1,23 +1,18 @@
+const createRefTypeState = () => ({
+ list: [],
+ totalCount: 0,
+ error: null,
+});
+
export default () => ({
+ enabledRefTypes: [],
projectId: null,
query: '',
matches: {
- branches: {
- list: [],
- totalCount: 0,
- error: null,
- },
- tags: {
- list: [],
- totalCount: 0,
- error: null,
- },
- commits: {
- list: [],
- totalCount: 0,
- error: null,
- },
+ branches: createRefTypeState(),
+ tags: createRefTypeState(),
+ commits: createRefTypeState(),
},
selectedRef: null,
requestCount: 0,
diff --git a/app/assets/javascripts/registry/explorer/components/delete_button.vue b/app/assets/javascripts/registry/explorer/components/delete_button.vue
index ee856a3e546..e4a1a1a8266 100644
--- a/app/assets/javascripts/registry/explorer/components/delete_button.vue
+++ b/app/assets/javascripts/registry/explorer/components/delete_button.vue
@@ -48,6 +48,7 @@ export default {
:title="title"
:aria-label="title"
variant="danger"
+ category="secondary"
icon="remove"
@click="$emit('delete')"
/>
diff --git a/app/assets/javascripts/registry/explorer/components/details_page/details_header.vue b/app/assets/javascripts/registry/explorer/components/details_page/details_header.vue
index a4b4c08bc34..f46068acd68 100644
--- a/app/assets/javascripts/registry/explorer/components/details_page/details_header.vue
+++ b/app/assets/javascripts/registry/explorer/components/details_page/details_header.vue
@@ -1,11 +1,10 @@
<script>
-import { GlSprintf, GlButton } from '@gitlab/ui';
+import { GlButton, GlIcon, GlTooltipDirective } from '@gitlab/ui';
import { sprintf, n__ } from '~/locale';
import MetadataItem from '~/vue_shared/components/registry/metadata_item.vue';
import TitleArea from '~/vue_shared/components/registry/title_area.vue';
import timeagoMixin from '~/vue_shared/mixins/timeago';
import {
- DETAILS_PAGE_TITLE,
UPDATED_AT,
CLEANUP_UNSCHEDULED_TEXT,
CLEANUP_SCHEDULED_TEXT,
@@ -20,11 +19,16 @@ import {
UNSCHEDULED_STATUS,
SCHEDULED_STATUS,
ONGOING_STATUS,
+ ROOT_IMAGE_TEXT,
+ ROOT_IMAGE_TOOLTIP,
} from '../../constants/index';
export default {
name: 'DetailsHeader',
- components: { GlSprintf, GlButton, TitleArea, MetadataItem },
+ components: { GlButton, GlIcon, TitleArea, MetadataItem },
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ },
mixins: [timeagoMixin],
props: {
image: {
@@ -73,9 +77,12 @@ export default {
deleteButtonDisabled() {
return this.disabled || !this.image.canDelete;
},
- },
- i18n: {
- DETAILS_PAGE_TITLE,
+ rootImageTooltip() {
+ return !this.image.name ? ROOT_IMAGE_TOOLTIP : '';
+ },
+ imageName() {
+ return this.image.name || ROOT_IMAGE_TEXT;
+ },
},
};
</script>
@@ -84,12 +91,15 @@ export default {
<title-area :metadata-loading="metadataLoading">
<template #title>
<span data-testid="title">
- <gl-sprintf :message="$options.i18n.DETAILS_PAGE_TITLE">
- <template #imageName>
- {{ image.name }}
- </template>
- </gl-sprintf>
+ {{ imageName }}
</span>
+ <gl-icon
+ v-if="rootImageTooltip"
+ v-gl-tooltip="rootImageTooltip"
+ class="gl-text-blue-600"
+ name="information-o"
+ :aria-label="rootImageTooltip"
+ />
</template>
<template #metadata-tags-count>
<metadata-item icon="tag" :text="tagCountText" data-testid="tags-count" />
diff --git a/app/assets/javascripts/registry/explorer/components/details_page/tags_list_row.vue b/app/assets/javascripts/registry/explorer/components/details_page/tags_list_row.vue
index c66f92bdd67..74027a376a7 100644
--- a/app/assets/javascripts/registry/explorer/components/details_page/tags_list_row.vue
+++ b/app/assets/javascripts/registry/explorer/components/details_page/tags_list_row.vue
@@ -166,6 +166,7 @@ export default {
:title="$options.i18n.REMOVE_TAG_BUTTON_TITLE"
:tooltip-title="$options.i18n.REMOVE_TAG_BUTTON_DISABLE_TOOLTIP"
:tooltip-disabled="tag.canDelete"
+ data-qa-selector="tag_delete_button"
data-testid="single-delete-button"
@delete="$emit('delete')"
/>
diff --git a/app/assets/javascripts/registry/explorer/components/list_page/image_list.vue b/app/assets/javascripts/registry/explorer/components/list_page/image_list.vue
index 10ad99d5956..5bd13322ebb 100644
--- a/app/assets/javascripts/registry/explorer/components/list_page/image_list.vue
+++ b/app/assets/javascripts/registry/explorer/components/list_page/image_list.vue
@@ -37,7 +37,6 @@ export default {
v-for="(listItem, index) in images"
:key="index"
:item="listItem"
- :first="index === 0"
:metadata-loading="metadataLoading"
@delete="$emit('delete', $event)"
/>
diff --git a/app/assets/javascripts/registry/explorer/components/list_page/image_list_row.vue b/app/assets/javascripts/registry/explorer/components/list_page/image_list_row.vue
index 9ae5b0f9eb1..0373a84b271 100644
--- a/app/assets/javascripts/registry/explorer/components/list_page/image_list_row.vue
+++ b/app/assets/javascripts/registry/explorer/components/list_page/image_list_row.vue
@@ -13,6 +13,7 @@ import {
CLEANUP_TIMED_OUT_ERROR_MESSAGE,
IMAGE_DELETE_SCHEDULED_STATUS,
IMAGE_FAILED_DELETED_STATUS,
+ ROOT_IMAGE_TEXT,
} from '../../constants/index';
import DeleteButton from '../delete_button.vue';
@@ -74,6 +75,9 @@ export default {
}
return null;
},
+ imageName() {
+ return this.item.name ? this.item.path : `${this.item.path}/ ${ROOT_IMAGE_TEXT}`;
+ },
},
};
</script>
@@ -92,9 +96,10 @@ export default {
<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 } }"
>
- {{ item.path }}
+ {{ imageName }}
</router-link>
<clipboard-button
v-if="item.location"
diff --git a/app/assets/javascripts/registry/explorer/components/list_page/registry_header.vue b/app/assets/javascripts/registry/explorer/components/list_page/registry_header.vue
index 8d7505dfbae..6d2ff9ea7b6 100644
--- a/app/assets/javascripts/registry/explorer/components/list_page/registry_header.vue
+++ b/app/assets/javascripts/registry/explorer/components/list_page/registry_header.vue
@@ -9,7 +9,6 @@ import {
LIST_INTRO_TEXT,
EXPIRATION_POLICY_WILL_RUN_IN,
EXPIRATION_POLICY_DISABLED_TEXT,
- EXPIRATION_POLICY_DISABLED_MESSAGE,
} from '../../constants/index';
export default {
@@ -34,11 +33,6 @@ export default {
default: '',
required: false,
},
- expirationPolicyHelpPagePath: {
- type: String,
- default: '',
- required: false,
- },
hideExpirationPolicyData: {
type: Boolean,
required: false,
@@ -79,19 +73,8 @@ export default {
? sprintf(EXPIRATION_POLICY_WILL_RUN_IN, { time: this.timeTillRun })
: EXPIRATION_POLICY_DISABLED_TEXT;
},
- showExpirationPolicyTip() {
- return (
- !this.expirationPolicyEnabled && this.imagesCount > 0 && !this.hideExpirationPolicyData
- );
- },
infoMessages() {
- const base = [{ text: LIST_INTRO_TEXT, link: this.helpPagePath }];
- return this.showExpirationPolicyTip
- ? [
- ...base,
- { text: EXPIRATION_POLICY_DISABLED_MESSAGE, link: this.expirationPolicyHelpPagePath },
- ]
- : base;
+ return [{ text: LIST_INTRO_TEXT, link: this.helpPagePath }];
},
},
};
diff --git a/app/assets/javascripts/registry/explorer/constants/common.js b/app/assets/javascripts/registry/explorer/constants/common.js
new file mode 100644
index 00000000000..dc71ef8450b
--- /dev/null
+++ b/app/assets/javascripts/registry/explorer/constants/common.js
@@ -0,0 +1,3 @@
+import { s__ } from '~/locale';
+
+export const ROOT_IMAGE_TEXT = s__('ContainerRegistry|Root image');
diff --git a/app/assets/javascripts/registry/explorer/constants/details.js b/app/assets/javascripts/registry/explorer/constants/details.js
index 3f04538a18b..7220f9646db 100644
--- a/app/assets/javascripts/registry/explorer/constants/details.js
+++ b/app/assets/javascripts/registry/explorer/constants/details.js
@@ -2,7 +2,6 @@ import { helpPagePath } from '~/helpers/help_page_helper';
import { s__, __ } from '~/locale';
// Translations strings
-export const DETAILS_PAGE_TITLE = s__('ContainerRegistry|%{imageName} tags');
export const DELETE_TAG_ERROR_MESSAGE = s__(
'ContainerRegistry|Something went wrong while marking the tag for deletion.',
);
@@ -53,7 +52,8 @@ export const MISSING_OR_DELETED_IMAGE_TITLE = s__(
export const MISSING_OR_DELETED_IMAGE_MESSAGE = s__(
'ContainerRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page.',
);
-export const MISSING_OR_DELETE_IMAGE_BREADCRUMB = s__(
+
+export const MISSING_OR_DELETED_IMAGE_BREADCRUMB = s__(
'ContainerRegistry|Image repository not found',
);
@@ -112,6 +112,10 @@ export const FAILED_DELETION_STATUS_MESSAGE = s__(
'ContainerRegistry|This image repository has failed to be deleted',
);
+export const ROOT_IMAGE_TOOLTIP = s__(
+ 'ContainerRegistry|Image repository with no name located at the project URL.',
+);
+
// Parameters
export const DEFAULT_PAGE = 1;
diff --git a/app/assets/javascripts/registry/explorer/constants/expiration_policies.js b/app/assets/javascripts/registry/explorer/constants/expiration_policies.js
index 48a6a015461..40f9b09a982 100644
--- a/app/assets/javascripts/registry/explorer/constants/expiration_policies.js
+++ b/app/assets/javascripts/registry/explorer/constants/expiration_policies.js
@@ -6,9 +6,6 @@ export const EXPIRATION_POLICY_WILL_RUN_IN = s__(
export const EXPIRATION_POLICY_DISABLED_TEXT = s__(
'ContainerRegistry|Expiration policy is disabled',
);
-export const EXPIRATION_POLICY_DISABLED_MESSAGE = s__(
- 'ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}',
-);
export const DELETE_ALERT_TITLE = s__('ContainerRegistry|Some tags were not deleted');
export const DELETE_ALERT_LINK_TEXT = s__(
'ContainerRegistry|The cleanup policy timed out before it could delete all tags. An administrator can %{adminLinkStart}manually run cleanup now%{adminLinkEnd} or you can wait for the cleanup policy to automatically run again. %{docLinkStart}More information%{docLinkEnd}',
diff --git a/app/assets/javascripts/registry/explorer/constants/index.js b/app/assets/javascripts/registry/explorer/constants/index.js
index 10816e12ead..6886356d8e2 100644
--- a/app/assets/javascripts/registry/explorer/constants/index.js
+++ b/app/assets/javascripts/registry/explorer/constants/index.js
@@ -1,3 +1,4 @@
+export * from './common';
export * from './expiration_policies';
export * from './quick_start';
export * from './list';
diff --git a/app/assets/javascripts/registry/explorer/pages/details.vue b/app/assets/javascripts/registry/explorer/pages/details.vue
index 0403467468a..2f515356fa7 100644
--- a/app/assets/javascripts/registry/explorer/pages/details.vue
+++ b/app/assets/javascripts/registry/explorer/pages/details.vue
@@ -24,7 +24,8 @@ import {
GRAPHQL_PAGE_SIZE,
FETCH_IMAGES_LIST_ERROR_MESSAGE,
UNFINISHED_STATUS,
- MISSING_OR_DELETE_IMAGE_BREADCRUMB,
+ MISSING_OR_DELETED_IMAGE_BREADCRUMB,
+ ROOT_IMAGE_TEXT,
} from '../constants/index';
import deleteContainerRepositoryTagsMutation from '../graphql/mutations/delete_container_repository_tags.mutation.graphql';
import getContainerRepositoryDetailsQuery from '../graphql/queries/get_container_repository_details.query.graphql';
@@ -116,7 +117,9 @@ export default {
},
methods: {
updateBreadcrumb() {
- const name = this.image?.name || MISSING_OR_DELETE_IMAGE_BREADCRUMB;
+ const name = this.image?.id
+ ? this.image?.name || ROOT_IMAGE_TEXT
+ : MISSING_OR_DELETED_IMAGE_BREADCRUMB;
this.breadCrumbState.updateName(name);
},
deleteTags(toBeDeleted) {
diff --git a/app/assets/javascripts/registry/explorer/pages/list.vue b/app/assets/javascripts/registry/explorer/pages/list.vue
index 8cad9b4ecfc..625d491db6a 100644
--- a/app/assets/javascripts/registry/explorer/pages/list.vue
+++ b/app/assets/javascripts/registry/explorer/pages/list.vue
@@ -288,7 +288,6 @@ export default {
:images-count="containerRepositoriesCount"
:expiration-policy="config.expirationPolicy"
:help-page-path="config.helpPagePath"
- :expiration-policy-help-page-path="config.expirationPolicyHelpPagePath"
:hide-expiration-policy-data="config.isGroupPage"
>
<template #commands>
diff --git a/app/assets/javascripts/related_issues/components/related_issuable_input.vue b/app/assets/javascripts/related_issues/components/related_issuable_input.vue
index 2dc56c3110b..46b97370d66 100644
--- a/app/assets/javascripts/related_issues/components/related_issuable_input.vue
+++ b/app/assets/javascripts/related_issues/components/related_issuable_input.vue
@@ -223,6 +223,7 @@ export default {
type="text"
class="js-add-issuable-form-input add-issuable-form-input"
data-qa-selector="add_issue_field"
+ autocomplete="off"
@input="onInput"
@focus="onFocus"
@blur="onBlur"
diff --git a/app/assets/javascripts/releases/components/app_edit_new.vue b/app/assets/javascripts/releases/components/app_edit_new.vue
index b16bb76c305..a8c7b7c857a 100644
--- a/app/assets/javascripts/releases/components/app_edit_new.vue
+++ b/app/assets/javascripts/releases/components/app_edit_new.vue
@@ -86,12 +86,11 @@ export default {
];
},
},
- mounted() {
- // eslint-disable-next-line promise/catch-or-return
- this.initializeRelease().then(() => {
- // Focus the first non-disabled input element
- this.$el.querySelector('input:enabled').focus();
- });
+ async mounted() {
+ await this.initializeRelease();
+
+ // Focus the first non-disabled input or button element
+ this.$el.querySelector('input:enabled, button:enabled').focus();
},
methods: {
...mapActions('detail', [
diff --git a/app/assets/javascripts/releases/components/asset_links_form.vue b/app/assets/javascripts/releases/components/asset_links_form.vue
index 9e095c8a9c2..cfcb9f6978d 100644
--- a/app/assets/javascripts/releases/components/asset_links_form.vue
+++ b/app/assets/javascripts/releases/components/asset_links_form.vue
@@ -141,6 +141,7 @@ export default {
:value="link.url"
type="text"
class="form-control"
+ name="asset-url"
:state="isUrlValid(link)"
@change="updateUrl(link, $event)"
@keydown.ctrl.enter="updateUrl(link, $event.target.value)"
@@ -180,6 +181,7 @@ export default {
:value="link.name"
type="text"
class="form-control"
+ name="asset-link-name"
:state="isNameValid(link)"
@change="updateName(link, $event)"
@keydown.ctrl.enter="updateName(link, $event.target.value)"
@@ -202,6 +204,7 @@ export default {
ref="typeSelect"
:value="link.linkType || $options.defaultTypeOptionValue"
class="form-control pr-4"
+ name="asset-type"
:options="$options.typeOptions"
@change="updateAssetLinkType({ linkIdToUpdate: link.id, newType: $event })"
/>
diff --git a/app/assets/javascripts/releases/components/tag_field_new.vue b/app/assets/javascripts/releases/components/tag_field_new.vue
index 660fd7ac950..21360a5c6cb 100644
--- a/app/assets/javascripts/releases/components/tag_field_new.vue
+++ b/app/assets/javascripts/releases/components/tag_field_new.vue
@@ -1,20 +1,29 @@
<script>
-import { GlFormGroup, GlFormInput } from '@gitlab/ui';
+import { GlFormGroup, GlDropdownItem, GlSprintf } from '@gitlab/ui';
import { uniqueId } from 'lodash';
import { mapState, mapActions, mapGetters } from 'vuex';
import { __ } from '~/locale';
import RefSelector from '~/ref/components/ref_selector.vue';
+import { REF_TYPE_TAGS } from '~/ref/constants';
import FormFieldContainer from './form_field_container.vue';
export default {
name: 'TagFieldNew',
- components: { GlFormGroup, GlFormInput, RefSelector, FormFieldContainer },
+ components: {
+ GlFormGroup,
+ RefSelector,
+ FormFieldContainer,
+ GlDropdownItem,
+ GlSprintf,
+ },
data() {
return {
// Keeps track of whether or not the user has interacted with
// the input field. This is used to avoid showing validation
// errors immediately when the page loads.
isInputDirty: false,
+
+ showCreateFrom: true,
};
},
computed: {
@@ -26,6 +35,12 @@ export default {
},
set(tagName) {
this.updateReleaseTagName(tagName);
+
+ // This setter is used by the `v-model` on the `RefSelector`.
+ // When this is called, the selection originated from the
+ // dropdown list of existing tag names, so we know the tag
+ // already exists and don't need to show the "create from" input
+ this.showCreateFrom = false;
},
},
createFromModel: {
@@ -51,12 +66,28 @@ export default {
markInputAsDirty() {
this.isInputDirty = true;
},
+ createTagClicked(newTagName) {
+ this.updateReleaseTagName(newTagName);
+
+ // This method is called when the user selects the "create tag"
+ // option, so the tag does not already exist. Because of this,
+ // we need to show the "create from" input.
+ this.showCreateFrom = true;
+ },
},
translations: {
- noRefSelected: __('No source selected'),
- searchPlaceholder: __('Search branches, tags, and commits'),
- dropdownHeader: __('Select source'),
+ tagName: {
+ noRefSelected: __('No tag selected'),
+ dropdownHeader: __('Tag name'),
+ searchPlaceholder: __('Search or create tag'),
+ },
+ createFrom: {
+ noRefSelected: __('No source selected'),
+ searchPlaceholder: __('Search branches, tags, and commits'),
+ dropdownHeader: __('Select source'),
+ },
},
+ tagNameEnabledRefTypes: [REF_TYPE_TAGS],
};
</script>
<template>
@@ -69,17 +100,34 @@ export default {
:invalid-feedback="__('Tag name is required')"
>
<form-field-container>
- <gl-form-input
+ <ref-selector
:id="tagNameInputId"
v-model="tagName"
+ :project-id="projectId"
+ :translations="$options.translations.tagName"
+ :enabled-ref-types="$options.tagNameEnabledRefTypes"
:state="!showTagNameValidationError"
- type="text"
- class="form-control"
- @blur.once="markInputAsDirty"
- />
+ @hide.once="markInputAsDirty"
+ >
+ <template #footer="{ isLoading, matches, query }">
+ <gl-dropdown-item
+ v-if="!isLoading && matches && matches.tags.totalCount === 0"
+ is-check-item
+ :is-checked="tagName === query"
+ @click="createTagClicked(query)"
+ >
+ <gl-sprintf :message="__('Create tag %{tagName}')">
+ <template #tagName>
+ <b>{{ query }}</b>
+ </template>
+ </gl-sprintf>
+ </gl-dropdown-item>
+ </template>
+ </ref-selector>
</form-field-container>
</gl-form-group>
<gl-form-group
+ v-if="showCreateFrom"
:label="__('Create from')"
:label-for="createFromSelectorId"
data-testid="create-from-field"
@@ -89,7 +137,7 @@ export default {
:id="createFromSelectorId"
v-model="createFromModel"
:project-id="projectId"
- :translations="$options.translations"
+ :translations="$options.translations.createFrom"
/>
</form-field-container>
<template #description>
diff --git a/app/assets/javascripts/reports/components/grouped_issues_list.vue b/app/assets/javascripts/reports/components/grouped_issues_list.vue
index 4d3c5f48e94..585127f901e 100644
--- a/app/assets/javascripts/reports/components/grouped_issues_list.vue
+++ b/app/assets/javascripts/reports/components/grouped_issues_list.vue
@@ -14,6 +14,12 @@ export default {
required: false,
default: '',
},
+ nestedLevel: {
+ type: Number,
+ required: false,
+ default: 0,
+ validator: (value) => [0, 1, 2].includes(value),
+ },
resolvedIssues: {
type: Array,
required: false,
@@ -58,6 +64,12 @@ export default {
return groupsCount + issuesCount;
},
+ listClasses() {
+ return {
+ 'gl-pl-7': this.nestedLevel === 1,
+ 'gl-pl-9': this.nestedLevel === 2,
+ };
+ },
},
};
</script>
@@ -67,6 +79,7 @@ export default {
:length="listLength"
:remain="$options.maxShownReportItems"
:size="$options.typicalReportItemHeight"
+ :class="listClasses"
class="report-block-container"
wtag="ul"
wclass="report-block-list"
diff --git a/app/assets/javascripts/reports/components/grouped_test_reports_app.vue b/app/assets/javascripts/reports/components/grouped_test_reports_app.vue
index 033b8798473..752071d02c6 100644
--- a/app/assets/javascripts/reports/components/grouped_test_reports_app.vue
+++ b/app/assets/javascripts/reports/components/grouped_test_reports_app.vue
@@ -1,5 +1,5 @@
<script>
-import { GlButton } from '@gitlab/ui';
+import { GlButton, GlIcon } from '@gitlab/ui';
import { once } from 'lodash';
import { mapActions, mapGetters, mapState } from 'vuex';
import { sprintf, s__ } from '~/locale';
@@ -11,8 +11,8 @@ import {
statusIcon,
recentFailuresTextBuilder,
} from '../store/utils';
+import GroupedIssuesList from './grouped_issues_list.vue';
import { componentNames } from './issue_body';
-import IssuesList from './issues_list.vue';
import Modal from './modal.vue';
import ReportSection from './report_section.vue';
import SummaryRow from './summary_row.vue';
@@ -23,9 +23,10 @@ export default {
components: {
ReportSection,
SummaryRow,
- IssuesList,
+ GroupedIssuesList,
Modal,
GlButton,
+ GlIcon,
},
mixins: [Tracking.mixin()],
props: {
@@ -86,7 +87,7 @@ export default {
}
if (!report.name) {
- return s__('Reports|An error occured while loading report');
+ return s__('Reports|An error occurred while loading report');
}
return reportTextBuilder(name, summary);
@@ -111,10 +112,12 @@ export default {
);
},
unresolvedIssues(report) {
- return report.existing_failures.concat(report.existing_errors);
- },
- newIssues(report) {
- return report.new_failures.concat(report.new_errors);
+ return [
+ ...report.new_failures,
+ ...report.new_errors,
+ ...report.existing_failures,
+ ...report.existing_errors,
+ ];
},
resolvedIssues(report) {
return report.resolved_failures.concat(report.resolved_errors);
@@ -151,24 +154,39 @@ export default {
<template #body>
<div class="mr-widget-grouped-section report-block">
<template v-for="(report, i) in reports">
- <summary-row :key="`summary-row-${i}`" :status-icon="getReportIcon(report)">
+ <summary-row
+ :key="`summary-row-${i}`"
+ :status-icon="getReportIcon(report)"
+ nested-summary
+ >
<template #summary>
<div class="gl-display-inline-flex gl-flex-direction-column">
<div>{{ reportText(report) }}</div>
+ <div v-if="report.suite_errors">
+ <div v-if="report.suite_errors.head">
+ <gl-icon name="warning" class="gl-mx-2 gl-text-orange-500" />
+ {{ s__('Reports|Head report parsing error:') }}
+ {{ report.suite_errors.head }}
+ </div>
+ <div v-if="report.suite_errors.base">
+ <gl-icon name="warning" class="gl-mx-2 gl-text-orange-500" />
+ {{ s__('Reports|Base report parsing error:') }}
+ {{ report.suite_errors.base }}
+ </div>
+ </div>
<div v-if="hasRecentFailures(report.summary)">
{{ recentFailuresText(report.summary) }}
</div>
</div>
</template>
</summary-row>
- <issues-list
+ <grouped-issues-list
v-if="shouldRenderIssuesList(report)"
:key="`issues-list-${i}`"
:unresolved-issues="unresolvedIssues(report)"
- :new-issues="newIssues(report)"
:resolved-issues="resolvedIssues(report)"
:component="$options.componentNames.TestIssueBody"
- class="report-block-group-list"
+ :nested-level="2"
/>
</template>
<modal
diff --git a/app/assets/javascripts/reports/components/issues_list.vue b/app/assets/javascripts/reports/components/issues_list.vue
index 16d5b14d3e9..ea3f0d78d8c 100644
--- a/app/assets/javascripts/reports/components/issues_list.vue
+++ b/app/assets/javascripts/reports/components/issues_list.vue
@@ -67,6 +67,12 @@ export default {
required: false,
default: null,
},
+ nestedLevel: {
+ type: Number,
+ required: false,
+ default: 0,
+ validator: (value) => [0, 1, 2].includes(value),
+ },
},
computed: {
issuesWithState() {
@@ -80,6 +86,12 @@ export default {
wclass() {
return `report-block-list ${this.issuesUlElementClass}`;
},
+ listClasses() {
+ return {
+ 'gl-pl-7': this.nestedLevel === 1,
+ 'gl-pl-8': this.nestedLevel === 2,
+ };
+ },
},
};
</script>
@@ -89,6 +101,7 @@ export default {
:remain="$options.maxShownReportItems"
:size="$options.typicalReportItemHeight"
class="report-block-container"
+ :class="listClasses"
wtag="ul"
:wclass="wclass"
>
diff --git a/app/assets/javascripts/reports/components/report_section.vue b/app/assets/javascripts/reports/components/report_section.vue
index 9d0631fbc01..4e59d0d81c1 100644
--- a/app/assets/javascripts/reports/components/report_section.vue
+++ b/app/assets/javascripts/reports/components/report_section.vue
@@ -184,7 +184,7 @@ export default {
<slot name="sub-heading"></slot>
</div>
- <slot name="action-buttons"></slot>
+ <slot name="action-buttons" :is-collapsible="isCollapsible"></slot>
<button
v-if="isCollapsible"
diff --git a/app/assets/javascripts/reports/components/summary_row.vue b/app/assets/javascripts/reports/components/summary_row.vue
index 3232c0edf96..8eb43bcf1ba 100644
--- a/app/assets/javascripts/reports/components/summary_row.vue
+++ b/app/assets/javascripts/reports/components/summary_row.vue
@@ -2,6 +2,7 @@
import { GlLoadingIcon } from '@gitlab/ui';
import CiIcon from '~/vue_shared/components/ci_icon.vue';
import Popover from '~/vue_shared/components/help_popover.vue';
+import { ICON_WARNING } from '../constants';
/**
* Renders the summary row for each report
@@ -19,6 +20,11 @@ export default {
GlLoadingIcon,
},
props: {
+ nestedSummary: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
summary: {
type: String,
required: false,
@@ -41,24 +47,36 @@ export default {
icon: `status_${this.statusIcon}`,
};
},
+ rowClasses() {
+ if (!this.nestedSummary) {
+ return ['gl-px-5'];
+ }
+ return ['gl-pl-7', 'gl-pr-5', { 'gl-bg-gray-10': this.statusIcon === ICON_WARNING }];
+ },
+ statusIconSize() {
+ if (!this.nestedSummary) {
+ return 24;
+ }
+ return 16;
+ },
},
};
</script>
<template>
- <div class="report-block-list-issue report-block-list-issue-parent align-items-center">
- <div class="report-block-list-icon gl-mr-3">
+ <div
+ class="gl-border-t-solid gl-border-t-gray-100 gl-border-t-1 gl-py-3 gl-display-flex gl-align-items-center"
+ :class="rowClasses"
+ >
+ <div class="gl-mr-3">
<gl-loading-icon
v-if="statusIcon === 'loading'"
css-class="report-block-list-loading-icon"
size="md"
/>
- <ci-icon v-else :status="iconStatus" :size="24" />
+ <ci-icon v-else :status="iconStatus" :size="statusIconSize" data-testid="summary-row-icon" />
</div>
<div class="report-block-list-issue-description">
- <div
- class="report-block-list-issue-description-text"
- data-testid="test-summary-row-description"
- >
+ <div class="report-block-list-issue-description-text" data-testid="summary-row-description">
<slot name="summary">{{ summary }}</slot
><span v-if="popoverOptions" class="text-nowrap"
>&nbsp;<popover v-if="popoverOptions" :options="popoverOptions" class="align-top" />
diff --git a/app/assets/javascripts/reports/components/test_issue_body.vue b/app/assets/javascripts/reports/components/test_issue_body.vue
index 7508e1d1f0d..0ab9c10ac0d 100644
--- a/app/assets/javascripts/reports/components/test_issue_body.vue
+++ b/app/assets/javascripts/reports/components/test_issue_body.vue
@@ -1,33 +1,40 @@
<script>
-import { GlBadge, GlSprintf } from '@gitlab/ui';
+import { GlBadge, GlButton } from '@gitlab/ui';
import { mapActions } from 'vuex';
+import { sprintf, n__ } from '~/locale';
+import IssueStatusIcon from '~/reports/components/issue_status_icon.vue';
+import { STATUS_NEUTRAL } from '../constants';
export default {
name: 'TestIssueBody',
components: {
GlBadge,
- GlSprintf,
+ GlButton,
+ IssueStatusIcon,
},
props: {
issue: {
type: Object,
required: true,
},
- // failed || success
- status: {
- type: String,
- required: true,
- },
- isNew: {
- type: Boolean,
- required: false,
- default: false,
- },
},
computed: {
+ recentFailureMessage() {
+ return sprintf(
+ n__(
+ 'Reports|Failed %{count} time in %{base_branch} in the last 14 days',
+ 'Reports|Failed %{count} times in %{base_branch} in the last 14 days',
+ this.issue.recent_failures.count,
+ ),
+ this.issue.recent_failures,
+ );
+ },
showRecentFailures() {
return this.issue.recent_failures?.count && this.issue.recent_failures?.base_branch;
},
+ status() {
+ return this.issue.status || STATUS_NEUTRAL;
+ },
},
methods: {
...mapActions(['openModal']),
@@ -35,30 +42,23 @@ export default {
};
</script>
<template>
- <div class="report-block-list-issue-description gl-mt-2 gl-mb-2">
- <div class="report-block-list-issue-description-text" data-testid="test-issue-body-description">
- <button
- type="button"
- class="btn-link btn-blank text-left break-link vulnerability-name-button"
- @click="openModal({ issue })"
- >
- <gl-badge v-if="isNew" variant="danger" class="gl-mr-2">{{ s__('New') }}</gl-badge>
- <gl-badge v-if="showRecentFailures" variant="warning" class="gl-mr-2">
- <gl-sprintf
- :message="
- n__(
- 'Reports|Failed %{count} time in %{base_branch} in the last 14 days',
- 'Reports|Failed %{count} times in %{base_branch} in the last 14 days',
- issue.recent_failures.count,
- )
- "
- >
- <template #count>{{ issue.recent_failures.count }}</template>
- <template #base_branch>{{ issue.recent_failures.base_branch }}</template>
- </gl-sprintf>
- </gl-badge>
- {{ issue.name }}
- </button>
- </div>
+ <div class="gl-display-flex gl-mt-2 gl-mb-2">
+ <issue-status-icon :status="status" :status-icon-size="24" class="gl-mr-3" />
+ <gl-badge
+ v-if="showRecentFailures"
+ variant="warning"
+ class="gl-mr-2"
+ data-testid="test-issue-body-recent-failures"
+ >
+ {{ recentFailureMessage }}
+ </gl-badge>
+ <gl-button
+ button-text-classes="gl-white-space-normal! gl-word-break-all gl-text-left"
+ variant="link"
+ data-testid="test-issue-body-description"
+ @click="openModal({ issue })"
+ >
+ {{ issue.name }}
+ </gl-button>
</div>
</template>
diff --git a/app/assets/javascripts/repository/components/upload_blob_modal.vue b/app/assets/javascripts/repository/components/upload_blob_modal.vue
new file mode 100644
index 00000000000..4cdfc5e947a
--- /dev/null
+++ b/app/assets/javascripts/repository/components/upload_blob_modal.vue
@@ -0,0 +1,218 @@
+<script>
+import {
+ GlModal,
+ GlForm,
+ GlFormGroup,
+ GlFormInput,
+ GlFormTextarea,
+ GlToggle,
+ GlButton,
+ GlAlert,
+} from '@gitlab/ui';
+import createFlash from '~/flash';
+import axios from '~/lib/utils/axios_utils';
+import { ContentTypeMultipartFormData } from '~/lib/utils/headers';
+import { numberToHumanSize } from '~/lib/utils/number_utils';
+import { visitUrl, joinPaths } from '~/lib/utils/url_utility';
+import { __ } from '~/locale';
+import UploadDropzone from '~/vue_shared/components/upload_dropzone/upload_dropzone.vue';
+
+const PRIMARY_OPTIONS_TEXT = __('Upload file');
+const SECONDARY_OPTIONS_TEXT = __('Cancel');
+const MODAL_TITLE = __('Upload New File');
+const COMMIT_LABEL = __('Commit message');
+const TARGET_BRANCH_LABEL = __('Target branch');
+const TOGGLE_CREATE_MR_LABEL = __('Start a new merge request with these changes');
+const REMOVE_FILE_TEXT = __('Remove file');
+const NEW_BRANCH_IN_FORK = __(
+ 'A new branch will be created in your fork and a new merge request will be started.',
+);
+const ERROR_MESSAGE = __('Error uploading file. Please try again.');
+
+export default {
+ components: {
+ GlModal,
+ GlForm,
+ GlFormGroup,
+ GlFormInput,
+ GlFormTextarea,
+ GlToggle,
+ GlButton,
+ UploadDropzone,
+ GlAlert,
+ },
+ i18n: {
+ MODAL_TITLE,
+ COMMIT_LABEL,
+ TARGET_BRANCH_LABEL,
+ TOGGLE_CREATE_MR_LABEL,
+ REMOVE_FILE_TEXT,
+ NEW_BRANCH_IN_FORK,
+ },
+ props: {
+ modalId: {
+ type: String,
+ required: true,
+ },
+ commitMessage: {
+ type: String,
+ required: true,
+ },
+ targetBranch: {
+ type: String,
+ required: true,
+ },
+ origionalBranch: {
+ type: String,
+ required: true,
+ },
+ canPushCode: {
+ type: Boolean,
+ required: true,
+ },
+ path: {
+ type: String,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ commit: this.commitMessage,
+ target: this.targetBranch,
+ createNewMr: true,
+ file: null,
+ filePreviewURL: null,
+ fileBinary: null,
+ loading: false,
+ };
+ },
+ computed: {
+ primaryOptions() {
+ return {
+ text: PRIMARY_OPTIONS_TEXT,
+ attributes: [
+ {
+ variant: 'success',
+ loading: this.loading,
+ disabled: !this.formCompleted || this.loading,
+ },
+ ],
+ };
+ },
+ cancelOptions() {
+ return {
+ text: SECONDARY_OPTIONS_TEXT,
+ attributes: [
+ {
+ disabled: this.loading,
+ },
+ ],
+ };
+ },
+ formattedFileSize() {
+ return numberToHumanSize(this.file.size);
+ },
+ showCreateNewMrToggle() {
+ return this.canPushCode && this.target !== this.origionalBranch;
+ },
+ formCompleted() {
+ return this.file && this.commit && this.target;
+ },
+ },
+ methods: {
+ setFile(file) {
+ this.file = file;
+
+ const fileUurlReader = new FileReader();
+
+ fileUurlReader.readAsDataURL(this.file);
+
+ fileUurlReader.onload = (e) => {
+ this.filePreviewURL = e.target?.result;
+ };
+ },
+ removeFile() {
+ this.file = null;
+ this.filePreviewURL = null;
+ },
+ uploadFile() {
+ this.loading = true;
+
+ const {
+ $route: {
+ params: { path },
+ },
+ } = this;
+ const uploadPath = joinPaths(this.path, path);
+
+ const formData = new FormData();
+ formData.append('branch_name', this.target);
+ formData.append('create_merge_request', this.createNewMr);
+ formData.append('commit_message', this.commit);
+ formData.append('file', this.file);
+
+ return axios
+ .post(uploadPath, formData, {
+ headers: {
+ ...ContentTypeMultipartFormData,
+ },
+ })
+ .then((response) => {
+ visitUrl(response.data.filePath);
+ })
+ .catch(() => {
+ this.loading = false;
+ createFlash(ERROR_MESSAGE);
+ });
+ },
+ },
+};
+</script>
+<template>
+ <gl-form>
+ <gl-modal
+ :modal-id="modalId"
+ :title="$options.i18n.MODAL_TITLE"
+ :action-primary="primaryOptions"
+ :action-cancel="cancelOptions"
+ @primary.prevent="uploadFile"
+ >
+ <upload-dropzone class="gl-h-200! gl-mb-4" single-file-selection @change="setFile">
+ <div
+ v-if="file"
+ class="card upload-dropzone-card upload-dropzone-border gl-w-full gl-h-full gl-align-items-center gl-justify-content-center gl-p-3"
+ >
+ <img v-if="filePreviewURL" :src="filePreviewURL" class="gl-h-11" />
+ <div>{{ formattedFileSize }}</div>
+ <div>{{ file.name }}</div>
+ <gl-button
+ category="tertiary"
+ variant="confirm"
+ :disabled="loading"
+ @click="removeFile"
+ >{{ $options.i18n.REMOVE_FILE_TEXT }}</gl-button
+ >
+ </div>
+ </upload-dropzone>
+ <gl-form-group :label="$options.i18n.COMMIT_LABEL" label-for="commit_message">
+ <gl-form-textarea v-model="commit" name="commit_message" :disabled="loading" />
+ </gl-form-group>
+ <gl-form-group
+ v-if="canPushCode"
+ :label="$options.i18n.TARGET_BRANCH_LABEL"
+ label-for="branch_name"
+ >
+ <gl-form-input v-model="target" :disabled="loading" name="branch_name" />
+ </gl-form-group>
+ <gl-toggle
+ v-if="showCreateNewMrToggle"
+ v-model="createNewMr"
+ :disabled="loading"
+ :label="$options.i18n.TOGGLE_CREATE_MR_LABEL"
+ />
+ <gl-alert v-if="!canPushCode" variant="info" :dismissible="false" class="gl-mt-3">
+ {{ $options.i18n.NEW_BRANCH_IN_FORK }}
+ </gl-alert>
+ </gl-modal>
+ </gl-form>
+</template>
diff --git a/app/assets/javascripts/repository/index.js b/app/assets/javascripts/repository/index.js
index 747b85f5c1c..e6969b7c8b2 100644
--- a/app/assets/javascripts/repository/index.js
+++ b/app/assets/javascripts/repository/index.js
@@ -1,3 +1,4 @@
+import { GlButton } from '@gitlab/ui';
import Vue from 'vue';
import initWebIdeLink from '~/pages/projects/shared/web_ide_link';
import { parseBoolean } from '../lib/utils/common_utils';
@@ -7,7 +8,6 @@ import App from './components/app.vue';
import Breadcrumbs from './components/breadcrumbs.vue';
import DirectoryDownloadLinks from './components/directory_download_links.vue';
import LastCommit from './components/last_commit.vue';
-import TreeActionLink from './components/tree_action_link.vue';
import apolloProvider from './graphql';
import createRouter from './router';
import { updateFormAction } from './utils/dom';
@@ -101,14 +101,17 @@ export default function setupVueRepositoryList() {
el: treeHistoryLinkEl,
router,
render(h) {
- return h(TreeActionLink, {
- props: {
- path: `${historyLink}/${
- this.$route.params.path ? escapeFileUrl(this.$route.params.path) : ''
- }`,
- text: __('History'),
+ return h(
+ GlButton,
+ {
+ attrs: {
+ href: `${historyLink}/${
+ this.$route.params.path ? escapeFileUrl(this.$route.params.path) : ''
+ }`,
+ },
},
- });
+ [__('History')],
+ );
},
});
diff --git a/app/assets/javascripts/right_sidebar.js b/app/assets/javascripts/right_sidebar.js
index 52ff4e7b100..6cdd89ad431 100644
--- a/app/assets/javascripts/right_sidebar.js
+++ b/app/assets/javascripts/right_sidebar.js
@@ -26,6 +26,8 @@ Sidebar.prototype.removeListeners = function () {
// eslint-disable-next-line @gitlab/no-global-event-off
this.sidebar.off('hidden.gl.dropdown');
// eslint-disable-next-line @gitlab/no-global-event-off
+ this.sidebar.off('hiddenGlDropdown');
+ // eslint-disable-next-line @gitlab/no-global-event-off
$('.dropdown').off('loading.gl.dropdown');
// eslint-disable-next-line @gitlab/no-global-event-off
$('.dropdown').off('loaded.gl.dropdown');
@@ -37,6 +39,7 @@ Sidebar.prototype.addEventListeners = function () {
this.sidebar.on('click', '.sidebar-collapsed-icon', this, this.sidebarCollapseClicked);
this.sidebar.on('hidden.gl.dropdown', this, this.onSidebarDropdownHidden);
+ this.sidebar.on('hiddenGlDropdown', this, this.onSidebarDropdownHidden);
$document.on('click', '.js-sidebar-toggle', this.sidebarToggleClicked);
return $(document)
diff --git a/app/assets/javascripts/security_configuration/components/configuration_table.vue b/app/assets/javascripts/security_configuration/components/configuration_table.vue
index 9475cc1781f..4a3f988296c 100644
--- a/app/assets/javascripts/security_configuration/components/configuration_table.vue
+++ b/app/assets/javascripts/security_configuration/components/configuration_table.vue
@@ -1,16 +1,18 @@
<script>
-import { GlLink, GlSprintf, GlTable, GlAlert } from '@gitlab/ui';
+import { GlLink, GlTable, GlAlert } from '@gitlab/ui';
import { s__, sprintf } from '~/locale';
import {
REPORT_TYPE_SAST,
REPORT_TYPE_DAST,
+ REPORT_TYPE_DAST_PROFILES,
REPORT_TYPE_DEPENDENCY_SCANNING,
REPORT_TYPE_CONTAINER_SCANNING,
REPORT_TYPE_COVERAGE_FUZZING,
+ REPORT_TYPE_API_FUZZING,
REPORT_TYPE_LICENSE_COMPLIANCE,
} from '~/vue_shared/security_reports/constants';
-import { features } from './features_constants';
import ManageSast from './manage_sast.vue';
+import { scanners } from './scanners_constants';
import Upgrade from './upgrade.vue';
const borderClasses = 'gl-border-b-1! gl-border-b-solid! gl-border-gray-100!';
@@ -19,14 +21,14 @@ const thClass = `gl-text-gray-900 gl-bg-transparent! ${borderClasses}`;
export default {
components: {
GlLink,
- GlSprintf,
GlTable,
GlAlert,
},
- data: () => ({
- features,
- errorMessage: '',
- }),
+ data() {
+ return {
+ errorMessage: '',
+ };
+ },
methods: {
getFeatureDocumentationLinkLabel(item) {
return sprintf(s__('SecurityConfiguration|Feature documentation for %{featureName}'), {
@@ -40,9 +42,11 @@ export default {
const COMPONENTS = {
[REPORT_TYPE_SAST]: ManageSast,
[REPORT_TYPE_DAST]: Upgrade,
+ [REPORT_TYPE_DAST_PROFILES]: Upgrade,
[REPORT_TYPE_DEPENDENCY_SCANNING]: Upgrade,
[REPORT_TYPE_CONTAINER_SCANNING]: Upgrade,
[REPORT_TYPE_COVERAGE_FUZZING]: Upgrade,
+ [REPORT_TYPE_API_FUZZING]: Upgrade,
[REPORT_TYPE_LICENSE_COMPLIANCE]: Upgrade,
};
@@ -62,7 +66,7 @@ export default {
thClass,
},
],
- items: features,
+ items: scanners,
},
};
</script>
@@ -81,7 +85,8 @@ export default {
{{ item.description }}
<gl-link
target="_blank"
- :href="item.link"
+ data-testid="help-link"
+ :href="item.helpPath"
:aria-label="getFeatureDocumentationLinkLabel(item)"
>
{{ s__('SecurityConfiguration|More information') }}
diff --git a/app/assets/javascripts/security_configuration/components/features_constants.js b/app/assets/javascripts/security_configuration/components/features_constants.js
deleted file mode 100644
index d846a2761d9..00000000000
--- a/app/assets/javascripts/security_configuration/components/features_constants.js
+++ /dev/null
@@ -1,112 +0,0 @@
-import { helpPagePath } from '~/helpers/help_page_helper';
-import { s__ } from '~/locale';
-
-import {
- REPORT_TYPE_SAST,
- REPORT_TYPE_DAST,
- REPORT_TYPE_SECRET_DETECTION,
- REPORT_TYPE_DEPENDENCY_SCANNING,
- REPORT_TYPE_CONTAINER_SCANNING,
- REPORT_TYPE_COVERAGE_FUZZING,
- REPORT_TYPE_LICENSE_COMPLIANCE,
-} from '~/vue_shared/security_reports/constants';
-
-/**
- * Translations & helpPagePaths for Static Security Configuration Page
- */
-export const SAST_NAME = s__('Static Application Security Testing (SAST)');
-export const SAST_DESCRIPTION = s__('Analyze your source code for known vulnerabilities.');
-export const SAST_HELP_PATH = helpPagePath('user/application_security/sast/index');
-
-export const DAST_NAME = s__('Dynamic Application Security Testing (DAST)');
-export const DAST_DESCRIPTION = s__('Analyze a review version of your web application.');
-export const DAST_HELP_PATH = helpPagePath('user/application_security/dast/index');
-
-export const SECRET_DETECTION_NAME = s__('Secret Detection');
-export const SECRET_DETECTION_DESCRIPTION = s__(
- 'Analyze your source code and git history for secrets.',
-);
-export const SECRET_DETECTION_HELP_PATH = helpPagePath(
- 'user/application_security/secret_detection/index',
-);
-
-export const DEPENDENCY_SCANNING_NAME = s__('Dependency Scanning');
-export const DEPENDENCY_SCANNING_DESCRIPTION = s__(
- 'Analyze your dependencies for known vulnerabilities.',
-);
-export const DEPENDENCY_SCANNING_HELP_PATH = helpPagePath(
- 'user/application_security/dependency_scanning/index',
-);
-
-export const CONTAINER_SCANNING_NAME = s__('Container Scanning');
-export const CONTAINER_SCANNING_DESCRIPTION = s__(
- 'Check your Docker images for known vulnerabilities.',
-);
-export const CONTAINER_SCANNING_HELP_PATH = helpPagePath(
- 'user/application_security/container_scanning/index',
-);
-
-export const COVERAGE_FUZZING_NAME = s__('Coverage Fuzzing');
-export const COVERAGE_FUZZING_DESCRIPTION = s__(
- 'Find bugs in your code with coverage-guided fuzzing.',
-);
-export const COVERAGE_FUZZING_HELP_PATH = helpPagePath(
- 'user/application_security/coverage_fuzzing/index',
-);
-
-export const LICENSE_COMPLIANCE_NAME = s__('License Compliance');
-export const LICENSE_COMPLIANCE_DESCRIPTION = s__(
- 'Search your project dependencies for their licenses and apply policies.',
-);
-export const LICENSE_COMPLIANCE_HELP_PATH = helpPagePath(
- 'user/compliance/license_compliance/index',
-);
-
-export const UPGRADE_CTA = s__(
- 'SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}',
-);
-
-export const features = [
- {
- name: SAST_NAME,
- description: SAST_DESCRIPTION,
- helpPath: SAST_HELP_PATH,
- type: REPORT_TYPE_SAST,
- },
- {
- name: DAST_NAME,
- description: DAST_DESCRIPTION,
- helpPath: DAST_HELP_PATH,
- type: REPORT_TYPE_DAST,
- },
- {
- name: SECRET_DETECTION_NAME,
- description: SECRET_DETECTION_DESCRIPTION,
- helpPath: SECRET_DETECTION_HELP_PATH,
- type: REPORT_TYPE_SECRET_DETECTION,
- },
- {
- name: DEPENDENCY_SCANNING_NAME,
- description: DEPENDENCY_SCANNING_DESCRIPTION,
- helpPath: DEPENDENCY_SCANNING_HELP_PATH,
- type: REPORT_TYPE_DEPENDENCY_SCANNING,
- },
- {
- name: CONTAINER_SCANNING_NAME,
- description: CONTAINER_SCANNING_DESCRIPTION,
- helpPath: CONTAINER_SCANNING_HELP_PATH,
- type: REPORT_TYPE_CONTAINER_SCANNING,
- },
- {
- name: COVERAGE_FUZZING_NAME,
- description: COVERAGE_FUZZING_DESCRIPTION,
- helpPath: COVERAGE_FUZZING_HELP_PATH,
- type: REPORT_TYPE_COVERAGE_FUZZING,
- },
- {
- name: LICENSE_COMPLIANCE_NAME,
- description: LICENSE_COMPLIANCE_DESCRIPTION,
- helpPath: LICENSE_COMPLIANCE_HELP_PATH,
- type: REPORT_TYPE_LICENSE_COMPLIANCE,
- },
-];
diff --git a/app/assets/javascripts/security_configuration/components/manage_sast.vue b/app/assets/javascripts/security_configuration/components/manage_sast.vue
index 5169096d563..a2528edd914 100644
--- a/app/assets/javascripts/security_configuration/components/manage_sast.vue
+++ b/app/assets/javascripts/security_configuration/components/manage_sast.vue
@@ -14,9 +14,11 @@ export default {
default: '',
},
},
- data: () => ({
- isLoading: false,
- }),
+ data() {
+ return {
+ isLoading: false,
+ };
+ },
methods: {
async mutate() {
this.isLoading = true;
diff --git a/app/assets/javascripts/security_configuration/components/scanners_constants.js b/app/assets/javascripts/security_configuration/components/scanners_constants.js
new file mode 100644
index 00000000000..9846df0b4bf
--- /dev/null
+++ b/app/assets/javascripts/security_configuration/components/scanners_constants.js
@@ -0,0 +1,136 @@
+import { helpPagePath } from '~/helpers/help_page_helper';
+import { __, s__ } from '~/locale';
+
+import {
+ REPORT_TYPE_SAST,
+ REPORT_TYPE_DAST,
+ REPORT_TYPE_DAST_PROFILES,
+ REPORT_TYPE_SECRET_DETECTION,
+ REPORT_TYPE_DEPENDENCY_SCANNING,
+ REPORT_TYPE_CONTAINER_SCANNING,
+ REPORT_TYPE_COVERAGE_FUZZING,
+ REPORT_TYPE_API_FUZZING,
+ REPORT_TYPE_LICENSE_COMPLIANCE,
+} from '~/vue_shared/security_reports/constants';
+
+/**
+ * Translations & helpPagePaths for Static Security Configuration Page
+ */
+export const SAST_NAME = __('Static Application Security Testing (SAST)');
+export const SAST_DESCRIPTION = __('Analyze your source code for known vulnerabilities.');
+export const SAST_HELP_PATH = helpPagePath('user/application_security/sast/index');
+
+export const DAST_NAME = __('Dynamic Application Security Testing (DAST)');
+export const DAST_DESCRIPTION = __('Analyze a review version of your web application.');
+export const DAST_HELP_PATH = helpPagePath('user/application_security/dast/index');
+
+export const DAST_PROFILES_NAME = __('DAST Scans');
+export const DAST_PROFILES_DESCRIPTION = __(
+ 'Saved scan settings and target site settings which are reusable.',
+);
+export const DAST_PROFILES_HELP_PATH = helpPagePath('user/application_security/dast/index');
+
+export const SECRET_DETECTION_NAME = __('Secret Detection');
+export const SECRET_DETECTION_DESCRIPTION = __(
+ 'Analyze your source code and git history for secrets.',
+);
+export const SECRET_DETECTION_HELP_PATH = helpPagePath(
+ 'user/application_security/secret_detection/index',
+);
+
+export const DEPENDENCY_SCANNING_NAME = __('Dependency Scanning');
+export const DEPENDENCY_SCANNING_DESCRIPTION = __(
+ 'Analyze your dependencies for known vulnerabilities.',
+);
+export const DEPENDENCY_SCANNING_HELP_PATH = helpPagePath(
+ 'user/application_security/dependency_scanning/index',
+);
+
+export const CONTAINER_SCANNING_NAME = __('Container Scanning');
+export const CONTAINER_SCANNING_DESCRIPTION = __(
+ 'Check your Docker images for known vulnerabilities.',
+);
+export const CONTAINER_SCANNING_HELP_PATH = helpPagePath(
+ 'user/application_security/container_scanning/index',
+);
+
+export const COVERAGE_FUZZING_NAME = __('Coverage Fuzzing');
+export const COVERAGE_FUZZING_DESCRIPTION = __(
+ 'Find bugs in your code with coverage-guided fuzzing.',
+);
+export const COVERAGE_FUZZING_HELP_PATH = helpPagePath(
+ 'user/application_security/coverage_fuzzing/index',
+);
+
+export const API_FUZZING_NAME = __('API Fuzzing');
+export const API_FUZZING_DESCRIPTION = __('Find bugs in your code with API fuzzing.');
+export const API_FUZZING_HELP_PATH = helpPagePath('user/application_security/api_fuzzing/index');
+
+export const LICENSE_COMPLIANCE_NAME = __('License Compliance');
+export const LICENSE_COMPLIANCE_DESCRIPTION = __(
+ 'Search your project dependencies for their licenses and apply policies.',
+);
+export const LICENSE_COMPLIANCE_HELP_PATH = helpPagePath(
+ 'user/compliance/license_compliance/index',
+);
+
+export const UPGRADE_CTA = s__(
+ 'SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}',
+);
+
+export const scanners = [
+ {
+ name: SAST_NAME,
+ description: SAST_DESCRIPTION,
+ helpPath: SAST_HELP_PATH,
+ type: REPORT_TYPE_SAST,
+ },
+ {
+ name: DAST_NAME,
+ description: DAST_DESCRIPTION,
+ helpPath: DAST_HELP_PATH,
+ type: REPORT_TYPE_DAST,
+ },
+ {
+ name: DAST_PROFILES_NAME,
+ description: DAST_PROFILES_DESCRIPTION,
+ helpPath: DAST_PROFILES_HELP_PATH,
+ type: REPORT_TYPE_DAST_PROFILES,
+ },
+ {
+ name: DEPENDENCY_SCANNING_NAME,
+ description: DEPENDENCY_SCANNING_DESCRIPTION,
+ helpPath: DEPENDENCY_SCANNING_HELP_PATH,
+ type: REPORT_TYPE_DEPENDENCY_SCANNING,
+ },
+ {
+ name: CONTAINER_SCANNING_NAME,
+ description: CONTAINER_SCANNING_DESCRIPTION,
+ helpPath: CONTAINER_SCANNING_HELP_PATH,
+ type: REPORT_TYPE_CONTAINER_SCANNING,
+ },
+ {
+ name: SECRET_DETECTION_NAME,
+ description: SECRET_DETECTION_DESCRIPTION,
+ helpPath: SECRET_DETECTION_HELP_PATH,
+ type: REPORT_TYPE_SECRET_DETECTION,
+ },
+ {
+ name: COVERAGE_FUZZING_NAME,
+ description: COVERAGE_FUZZING_DESCRIPTION,
+ helpPath: COVERAGE_FUZZING_HELP_PATH,
+ type: REPORT_TYPE_COVERAGE_FUZZING,
+ },
+ {
+ name: API_FUZZING_NAME,
+ description: API_FUZZING_DESCRIPTION,
+ helpPath: API_FUZZING_HELP_PATH,
+ type: REPORT_TYPE_API_FUZZING,
+ },
+ {
+ name: LICENSE_COMPLIANCE_NAME,
+ description: LICENSE_COMPLIANCE_DESCRIPTION,
+ helpPath: LICENSE_COMPLIANCE_HELP_PATH,
+ type: REPORT_TYPE_LICENSE_COMPLIANCE,
+ },
+];
diff --git a/app/assets/javascripts/security_configuration/components/upgrade.vue b/app/assets/javascripts/security_configuration/components/upgrade.vue
index 166ee4ff194..518eb57731d 100644
--- a/app/assets/javascripts/security_configuration/components/upgrade.vue
+++ b/app/assets/javascripts/security_configuration/components/upgrade.vue
@@ -1,12 +1,18 @@
<script>
import { GlLink, GlSprintf } from '@gitlab/ui';
-import { UPGRADE_CTA } from './features_constants';
+import { UPGRADE_CTA } from './scanners_constants';
export default {
components: {
GlLink,
GlSprintf,
},
+ inject: {
+ upgradePath: {
+ from: 'upgradePath',
+ default: '#',
+ },
+ },
i18n: {
UPGRADE_CTA,
},
@@ -17,7 +23,7 @@ export default {
<span>
<gl-sprintf :message="$options.i18n.UPGRADE_CTA">
<template #link="{ content }">
- <gl-link target="_blank" href="https://about.gitlab.com/pricing/">
+ <gl-link target="_blank" :href="upgradePath">
{{ content }}
</gl-link>
</template>
diff --git a/app/assets/javascripts/security_configuration/index.js b/app/assets/javascripts/security_configuration/index.js
index c98fa46b32b..1134a1ffb44 100644
--- a/app/assets/javascripts/security_configuration/index.js
+++ b/app/assets/javascripts/security_configuration/index.js
@@ -14,13 +14,14 @@ export const initStaticSecurityConfiguration = (el) => {
defaultClient: createDefaultClient(),
});
- const { projectPath } = el.dataset;
+ const { projectPath, upgradePath } = el.dataset;
return new Vue({
el,
apolloProvider,
provide: {
projectPath,
+ upgradePath,
},
render(createElement) {
return createElement(SecurityConfigurationApp);
diff --git a/app/assets/javascripts/sentry/sentry_config.js b/app/assets/javascripts/sentry/sentry_config.js
index 4277ffec545..bc3b2f16a6a 100644
--- a/app/assets/javascripts/sentry/sentry_config.js
+++ b/app/assets/javascripts/sentry/sentry_config.js
@@ -1,6 +1,6 @@
+import * as Sentry from '@sentry/browser';
import $ from 'jquery';
import { __ } from '~/locale';
-import * as Sentry from '~/sentry/wrapper';
const IGNORE_ERRORS = [
// Random plugins/extensions
diff --git a/app/assets/javascripts/sentry/wrapper.js b/app/assets/javascripts/sentry/wrapper.js
deleted file mode 100644
index 24039e6141c..00000000000
--- a/app/assets/javascripts/sentry/wrapper.js
+++ /dev/null
@@ -1,26 +0,0 @@
-// Temporarily commented out to investigate performance: https://gitlab.com/gitlab-org/gitlab/-/issues/251179
-// export * from '@sentry/browser';
-
-export function init(...args) {
- return args;
-}
-
-export function setUser(...args) {
- return args;
-}
-
-export function captureException(...args) {
- return args;
-}
-
-export function captureMessage(...args) {
- return args;
-}
-
-export function withScope(fn) {
- fn({
- setTag(...args) {
- return args;
- },
- });
-}
diff --git a/app/assets/javascripts/shared/popover.js b/app/assets/javascripts/shared/popover.js
deleted file mode 100644
index 435ee8fb968..00000000000
--- a/app/assets/javascripts/shared/popover.js
+++ /dev/null
@@ -1,33 +0,0 @@
-import $ from 'jquery';
-import { debounce } from 'lodash';
-
-export function togglePopover(show) {
- const isAlreadyShown = this.hasClass('js-popover-show');
- if ((show && isAlreadyShown) || (!show && !isAlreadyShown)) {
- return false;
- }
- this.popover(show ? 'show' : 'hide');
- this.toggleClass('disable-animation js-popover-show', show);
-
- return true;
-}
-
-export function mouseleave() {
- if (!$('.popover:hover').length > 0) {
- const $popover = $(this);
- togglePopover.call($popover, false);
- }
-}
-
-export function mouseenter() {
- const $popover = $(this);
-
- const showedPopover = togglePopover.call($popover, true);
- if (showedPopover) {
- $('.popover').on('mouseleave', mouseleave.bind($popover));
- }
-}
-
-export function debouncedMouseleave(debounceTimeout = 300) {
- return debounce(mouseleave, debounceTimeout);
-}
diff --git a/app/assets/javascripts/sidebar/components/assignees/issuable_assignees.vue b/app/assets/javascripts/sidebar/components/assignees/issuable_assignees.vue
index e2dc37a0ac2..b53b7039018 100644
--- a/app/assets/javascripts/sidebar/components/assignees/issuable_assignees.vue
+++ b/app/assets/javascripts/sidebar/components/assignees/issuable_assignees.vue
@@ -31,13 +31,18 @@ export default {
</script>
<template>
- <div class="gl-display-flex gl-flex-direction-column">
- <div v-if="emptyUsers" data-testid="none">
+ <div class="gl-display-flex gl-flex-direction-column issuable-assignees">
+ <div
+ v-if="emptyUsers"
+ class="gl-display-flex gl-align-items-center gl-text-gray-500"
+ data-testid="none"
+ >
<span> {{ __('None') }} -</span>
<gl-button
data-testid="assign-yourself"
category="tertiary"
variant="link"
+ class="gl-ml-2"
@click="$emit('assign-self')"
>
<span class="gl-text-gray-500 gl-hover-text-blue-800">{{ __('assign yourself') }}</span>
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 8f3f77cb5f0..cc2201ad359 100644
--- a/app/assets/javascripts/sidebar/components/assignees/sidebar_assignees_widget.vue
+++ b/app/assets/javascripts/sidebar/components/assignees/sidebar_assignees_widget.vue
@@ -15,13 +15,12 @@ import { IssuableType } from '~/issue_show/constants';
import { __, n__ } from '~/locale';
import IssuableAssignees from '~/sidebar/components/assignees/issuable_assignees.vue';
import SidebarEditableItem from '~/sidebar/components/sidebar_editable_item.vue';
-import { assigneesQueries } from '~/sidebar/constants';
+import { assigneesQueries, ASSIGNEES_DEBOUNCE_DELAY } from '~/sidebar/constants';
import MultiSelectDropdown from '~/vue_shared/components/sidebar/multiselect_dropdown.vue';
export const assigneesWidget = Vue.observable({
updateAssignees: null,
});
-
export default {
i18n: {
unassigned: __('Unassigned'),
@@ -88,10 +87,10 @@ export default {
return this.queryVariables;
},
update(data) {
- return data.issuable || data.project?.issuable;
+ return data.workspace?.issuable;
},
result({ data }) {
- const issuable = data.issuable || data.project?.issuable;
+ const issuable = data.workspace?.issuable;
if (issuable) {
this.selected = this.moveCurrentUserToStart(cloneDeep(issuable.assignees.nodes));
}
@@ -104,13 +103,24 @@ export default {
query: searchUsers,
variables() {
return {
+ fullPath: this.fullPath,
search: this.search,
};
},
update(data) {
- return data.users?.nodes || [];
+ const searchResults = data.workspace?.users?.nodes.map(({ user }) => user) || [];
+ const mergedSearchResults = this.participants.reduce((acc, current) => {
+ if (
+ !acc.some((user) => current.username === user.username) &&
+ (current.name.includes(this.search) || current.username.includes(this.search))
+ ) {
+ acc.push(current);
+ }
+ return acc;
+ }, searchResults);
+ return mergedSearchResults;
},
- debounce: 250,
+ debounce: ASSIGNEES_DEBOUNCE_DELAY,
skip() {
return this.isSearchEmpty;
},
@@ -185,7 +195,7 @@ export default {
return this.selected.some(isCurrentUser) || this.participants.some(isCurrentUser);
},
noUsersFound() {
- return !this.isSearchEmpty && this.unselectedFiltered.length === 0;
+ return !this.isSearchEmpty && this.searchUsers.length === 0;
},
showCurrentUser() {
return !this.isCurrentUserInParticipants && (this.isSearchEmpty || this.isSearching);
@@ -218,7 +228,7 @@ export default {
},
})
.then(({ data }) => {
- this.$emit('assignees-updated', data);
+ this.$emit('assignees-updated', data.issuableSetAssignees.issuable.assignees.nodes);
return data;
})
.catch(() => {
@@ -281,6 +291,9 @@ export default {
collapseWidget() {
this.$refs.toggle.collapse();
},
+ showDivider(list) {
+ return list.length > 0 && this.isSearchEmpty;
+ },
},
};
</script>
@@ -306,6 +319,7 @@ export default {
<issuable-assignees
:users="assignees"
:issuable-type="issuableType"
+ class="gl-mt-2"
@assign-self="assignSelf"
/>
</template>
@@ -334,12 +348,14 @@ export default {
data-testid="unassign"
@click="selectAssignee()"
>
- <span :class="selectedIsEmpty ? 'gl-pl-0' : 'gl-pl-6'">{{
- $options.i18n.unassigned
- }}</span></gl-dropdown-item
+ <span
+ :class="selectedIsEmpty ? 'gl-pl-0' : 'gl-pl-6'"
+ class="gl-font-weight-bold"
+ >{{ $options.i18n.unassigned }}</span
+ ></gl-dropdown-item
>
- <gl-dropdown-divider data-testid="unassign-divider" />
</template>
+ <gl-dropdown-divider v-if="showDivider(selectedFiltered)" />
<gl-dropdown-item
v-for="item in selectedFiltered"
:key="item.id"
@@ -358,10 +374,10 @@ export default {
/>
</gl-avatar-link>
</gl-dropdown-item>
- <gl-dropdown-divider v-if="!selectedIsEmpty" data-testid="selected-user-divider" />
<template v-if="showCurrentUser">
+ <gl-dropdown-divider />
<gl-dropdown-item
- data-testid="unselected-participant"
+ data-testid="current-user"
@click.stop="selectAssignee(currentUser)"
>
<gl-avatar-link>
@@ -370,12 +386,12 @@ export default {
:label="currentUser.name"
:sub-label="currentUser.username"
:src="currentUser.avatarUrl"
- class="gl-align-items-center"
+ class="gl-align-items-center gl-pl-6!"
/>
</gl-avatar-link>
</gl-dropdown-item>
- <gl-dropdown-divider />
</template>
+ <gl-dropdown-divider v-if="showDivider(unselectedFiltered)" />
<gl-dropdown-item
v-for="unselectedUser in unselectedFiltered"
:key="unselectedUser.id"
@@ -392,7 +408,7 @@ export default {
/>
</gl-avatar-link>
</gl-dropdown-item>
- <gl-dropdown-item v-if="noUsersFound && !isSearching">
+ <gl-dropdown-item v-if="noUsersFound && !isSearching" data-testid="empty-results">
{{ __('No matching results') }}
</gl-dropdown-item>
</template>
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 36775648809..d0da4a9c75a 100644
--- a/app/assets/javascripts/sidebar/components/assignees/uncollapsed_assignee_list.vue
+++ b/app/assets/javascripts/sidebar/components/assignees/uncollapsed_assignee_list.vue
@@ -83,7 +83,7 @@ export default {
<assignee-avatar-link :user="user" :issuable-type="issuableType" />
</div>
</div>
- <div v-if="renderShowMoreSection" class="user-list-more">
+ <div v-if="renderShowMoreSection" class="user-list-more gl-hover-text-blue-800">
<button
type="button"
class="btn-link"
diff --git a/app/assets/javascripts/sidebar/components/confidential/confidential_issue_sidebar.vue b/app/assets/javascripts/sidebar/components/confidential/confidential_issue_sidebar.vue
deleted file mode 100644
index 57b3705e803..00000000000
--- a/app/assets/javascripts/sidebar/components/confidential/confidential_issue_sidebar.vue
+++ /dev/null
@@ -1,113 +0,0 @@
-<script>
-import { GlIcon, GlTooltipDirective } from '@gitlab/ui';
-import { mapState } from 'vuex';
-import { __, sprintf } from '~/locale';
-import eventHub from '~/sidebar/event_hub';
-import EditForm from './edit_form.vue';
-
-export default {
- components: {
- EditForm,
- GlIcon,
- },
- directives: {
- GlTooltip: GlTooltipDirective,
- },
- props: {
- fullPath: {
- required: true,
- type: String,
- },
- isEditable: {
- required: true,
- type: Boolean,
- },
- issuableType: {
- required: false,
- type: String,
- default: 'issue',
- },
- },
- data() {
- return {
- edit: false,
- };
- },
- computed: {
- ...mapState({
- confidential: ({ noteableData, confidential }) => {
- if (noteableData) {
- return noteableData.confidential;
- }
- return Boolean(confidential);
- },
- }),
- confidentialityIcon() {
- return this.confidential ? 'eye-slash' : 'eye';
- },
- tooltipLabel() {
- return this.confidential ? __('Confidential') : __('Not confidential');
- },
- confidentialText() {
- return sprintf(__('This %{issuableType} is confidential'), {
- issuableType: this.issuableType,
- });
- },
- },
- created() {
- eventHub.$on('closeConfidentialityForm', this.toggleForm);
- },
- beforeDestroy() {
- eventHub.$off('closeConfidentialityForm', this.toggleForm);
- },
- methods: {
- toggleForm() {
- this.edit = !this.edit;
- },
- },
-};
-</script>
-
-<template>
- <div class="block issuable-sidebar-item confidentiality">
- <div
- ref="collapseIcon"
- v-gl-tooltip.viewport.left
- :title="tooltipLabel"
- class="sidebar-collapsed-icon"
- @click="toggleForm"
- >
- <gl-icon :name="confidentialityIcon" />
- </div>
- <div class="title hide-collapsed">
- {{ __('Confidentiality') }}
- <a
- v-if="isEditable"
- ref="editLink"
- class="float-right confidential-edit"
- href="#"
- data-track-event="click_edit_button"
- data-track-label="right_sidebar"
- data-track-property="confidentiality"
- @click.prevent="toggleForm"
- >{{ __('Edit') }}</a
- >
- </div>
- <div class="value sidebar-item-value hide-collapsed">
- <edit-form
- v-if="edit"
- :confidential="confidential"
- :full-path="fullPath"
- :issuable-type="issuableType"
- />
- <div v-if="!confidential" class="no-value sidebar-item-value" data-testid="not-confidential">
- <gl-icon :size="16" name="eye" class="sidebar-item-icon inline" />
- {{ __('Not confidential') }}
- </div>
- <div v-else class="value sidebar-item-value hide-collapsed">
- <gl-icon :size="16" name="eye-slash" class="sidebar-item-icon inline is-active" />
- {{ confidentialText }}
- </div>
- </div>
- </div>
-</template>
diff --git a/app/assets/javascripts/sidebar/components/confidential/edit_form.vue b/app/assets/javascripts/sidebar/components/confidential/edit_form.vue
deleted file mode 100644
index 057224d5918..00000000000
--- a/app/assets/javascripts/sidebar/components/confidential/edit_form.vue
+++ /dev/null
@@ -1,64 +0,0 @@
-<script>
-import { GlSprintf } from '@gitlab/ui';
-import { __ } from '../../../locale';
-import editFormButtons from './edit_form_buttons.vue';
-
-export default {
- components: {
- editFormButtons,
- GlSprintf,
- },
- props: {
- confidential: {
- required: true,
- type: Boolean,
- },
- fullPath: {
- required: true,
- type: String,
- },
- issuableType: {
- required: true,
- type: String,
- },
- },
- computed: {
- confidentialityOnWarning() {
- return __(
- 'You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}.',
- );
- },
- confidentialityOffWarning() {
- return __(
- '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}.',
- );
- },
- },
-};
-</script>
-
-<template>
- <div class="dropdown show">
- <div class="dropdown-menu sidebar-item-warning-message">
- <div>
- <p v-if="!confidential">
- <gl-sprintf :message="confidentialityOnWarning">
- <template #strong="{ content }">
- <strong>{{ content }}</strong>
- </template>
- <template #issuableType>{{ issuableType }}</template>
- </gl-sprintf>
- </p>
- <p v-else>
- <gl-sprintf :message="confidentialityOffWarning">
- <template #strong="{ content }">
- <strong>{{ content }}</strong>
- </template>
- <template #issuableType>{{ issuableType }}</template>
- </gl-sprintf>
- </p>
- <edit-form-buttons :full-path="fullPath" :confidential="confidential" />
- </div>
- </div>
- </div>
-</template>
diff --git a/app/assets/javascripts/sidebar/components/confidential/edit_form_buttons.vue b/app/assets/javascripts/sidebar/components/confidential/edit_form_buttons.vue
deleted file mode 100644
index 154a228c978..00000000000
--- a/app/assets/javascripts/sidebar/components/confidential/edit_form_buttons.vue
+++ /dev/null
@@ -1,81 +0,0 @@
-<script>
-import { GlButton } from '@gitlab/ui';
-import $ from 'jquery';
-import { mapActions } from 'vuex';
-import { deprecatedCreateFlash as Flash } from '~/flash';
-import { __ } from '~/locale';
-import eventHub from '../../event_hub';
-
-export default {
- components: {
- GlButton,
- },
- props: {
- fullPath: {
- required: true,
- type: String,
- },
- confidential: {
- required: true,
- type: Boolean,
- },
- },
- data() {
- return {
- isLoading: false,
- };
- },
- computed: {
- toggleButtonText() {
- if (this.isLoading) {
- return __('Applying');
- }
-
- return this.confidential ? __('Turn Off') : __('Turn On');
- },
- },
- methods: {
- ...mapActions(['updateConfidentialityOnIssuable']),
- closeForm() {
- eventHub.$emit('closeConfidentialityForm');
- $(this.$el).trigger('hidden.gl.dropdown');
- },
- submitForm() {
- this.isLoading = true;
- const confidential = !this.confidential;
-
- this.updateConfidentialityOnIssuable({ confidential, fullPath: this.fullPath })
- .then(() => {
- eventHub.$emit('updateIssuableConfidentiality', confidential);
- })
- .catch((err) => {
- Flash(
- err || __('Something went wrong trying to change the confidentiality of this issue'),
- );
- })
- .finally(() => {
- this.closeForm();
- this.isLoading = false;
- });
- },
- },
-};
-</script>
-
-<template>
- <div class="sidebar-item-warning-message-actions">
- <gl-button class="gl-mr-3" @click="closeForm">
- {{ __('Cancel') }}
- </gl-button>
- <gl-button
- category="secondary"
- variant="warning"
- :disabled="isLoading"
- :loading="isLoading"
- data-testid="confidential-toggle"
- @click.prevent="submitForm"
- >
- {{ toggleButtonText }}
- </gl-button>
- </div>
-</template>
diff --git a/app/assets/javascripts/sidebar/components/confidential/mutations/update_issue_confidential.mutation.graphql b/app/assets/javascripts/sidebar/components/confidential/mutations/update_issue_confidential.mutation.graphql
deleted file mode 100644
index 5caf5f6b555..00000000000
--- a/app/assets/javascripts/sidebar/components/confidential/mutations/update_issue_confidential.mutation.graphql
+++ /dev/null
@@ -1,8 +0,0 @@
-mutation updateIssueConfidential($input: IssueSetConfidentialInput!) {
- issueSetConfidential(input: $input) {
- issue {
- confidential
- }
- errors
- }
-}
diff --git a/app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_content.vue b/app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_content.vue
new file mode 100644
index 00000000000..37a44eb8f01
--- /dev/null
+++ b/app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_content.vue
@@ -0,0 +1,64 @@
+<script>
+import { GlIcon, GlTooltipDirective } from '@gitlab/ui';
+import { __, sprintf } from '~/locale';
+
+export default {
+ components: {
+ GlIcon,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ },
+ props: {
+ confidential: {
+ type: Boolean,
+ required: true,
+ },
+ issuableType: {
+ type: String,
+ required: true,
+ },
+ },
+ computed: {
+ confidentialText() {
+ return this.confidential
+ ? sprintf(__('This %{issuableType} is confidential'), {
+ issuableType: this.issuableType,
+ })
+ : __('Not confidential');
+ },
+ confidentialIcon() {
+ return this.confidential ? 'eye-slash' : 'eye';
+ },
+ tooltipLabel() {
+ return this.confidential ? __('Confidential') : __('Not confidential');
+ },
+ },
+};
+</script>
+
+<template>
+ <div>
+ <div
+ v-gl-tooltip.viewport.left
+ :title="tooltipLabel"
+ class="sidebar-collapsed-icon"
+ data-testid="sidebar-collapsed-icon"
+ @click="$emit('expandSidebar')"
+ >
+ <gl-icon
+ :size="16"
+ :name="confidentialIcon"
+ class="sidebar-item-icon inline"
+ :class="{ 'is-active': confidential }"
+ />
+ </div>
+ <gl-icon
+ :size="16"
+ :name="confidentialIcon"
+ class="sidebar-item-icon inline hide-collapsed"
+ :class="{ 'is-active': confidential }"
+ />
+ <span class="hide-collapsed" data-testid="confidential-text">{{ confidentialText }}</span>
+ </div>
+</template>
diff --git a/app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_form.vue b/app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_form.vue
new file mode 100644
index 00000000000..a21ac73f131
--- /dev/null
+++ b/app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_form.vue
@@ -0,0 +1,136 @@
+<script>
+import { GlSprintf, GlButton } from '@gitlab/ui';
+import createFlash from '~/flash';
+import { IssuableType } from '~/issue_show/constants';
+import { __, sprintf } from '~/locale';
+import { confidentialityQueries } from '~/sidebar/constants';
+
+export default {
+ i18n: {
+ confidentialityOnWarning: __(
+ 'You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}.',
+ ),
+ confidentialityOffWarning: __(
+ 'You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}.',
+ ),
+ },
+ components: {
+ GlSprintf,
+ GlButton,
+ },
+ inject: ['fullPath', 'iid'],
+ props: {
+ confidential: {
+ required: true,
+ type: Boolean,
+ },
+ issuableType: {
+ required: true,
+ type: String,
+ },
+ },
+ data() {
+ return {
+ loading: false,
+ };
+ },
+ computed: {
+ toggleButtonText() {
+ if (this.loading) {
+ return __('Applying');
+ }
+ return this.confidential ? __('Turn off') : __('Turn on');
+ },
+ warningMessage() {
+ return this.confidential
+ ? this.$options.i18n.confidentialityOffWarning
+ : this.$options.i18n.confidentialityOnWarning;
+ },
+ workspacePath() {
+ return this.issuableType === IssuableType.Issue
+ ? {
+ projectPath: this.fullPath,
+ }
+ : {
+ groupPath: this.fullPath,
+ };
+ },
+ },
+ methods: {
+ submitForm() {
+ this.loading = true;
+ this.$apollo
+ .mutate({
+ mutation: confidentialityQueries[this.issuableType].mutation,
+ variables: {
+ input: {
+ ...this.workspacePath,
+ iid: this.iid,
+ confidential: !this.confidential,
+ },
+ },
+ })
+ .then(
+ ({
+ data: {
+ issuableSetConfidential: { errors },
+ },
+ }) => {
+ if (errors.length) {
+ createFlash({
+ message: errors[0],
+ });
+ } else {
+ this.$emit('closeForm');
+ }
+ },
+ )
+ .catch(() => {
+ createFlash({
+ message: sprintf(
+ __('Something went wrong while setting %{issuableType} confidentiality.'),
+ {
+ issuableType: this.issuableType,
+ },
+ ),
+ });
+ })
+ .finally(() => {
+ this.loading = false;
+ });
+ },
+ },
+};
+</script>
+
+<template>
+ <div class="dropdown show">
+ <div class="dropdown-menu sidebar-item-warning-message">
+ <div>
+ <p data-testid="warning-message">
+ <gl-sprintf :message="warningMessage">
+ <template #strong="{ content }">
+ <strong>{{ content }}</strong>
+ </template>
+ <template #issuableType>{{ issuableType }}</template>
+ </gl-sprintf>
+ </p>
+ <div class="sidebar-item-warning-message-actions">
+ <gl-button class="gl-mr-3" data-testid="confidential-cancel" @click="$emit('closeForm')">
+ {{ __('Cancel') }}
+ </gl-button>
+ <gl-button
+ category="secondary"
+ variant="warning"
+ :disabled="loading"
+ :loading="loading"
+ data-testid="confidential-toggle"
+ @click.prevent="submitForm"
+ >
+ {{ toggleButtonText }}
+ </gl-button>
+ </div>
+ </div>
+ </div>
+ </div>
+</template>
diff --git a/app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_widget.vue b/app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_widget.vue
new file mode 100644
index 00000000000..1db68d3d5b1
--- /dev/null
+++ b/app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_widget.vue
@@ -0,0 +1,143 @@
+<script>
+import produce from 'immer';
+import Vue from 'vue';
+import createFlash from '~/flash';
+import { __, sprintf } from '~/locale';
+import SidebarEditableItem from '~/sidebar/components/sidebar_editable_item.vue';
+import { confidentialityQueries } from '~/sidebar/constants';
+import SidebarConfidentialityContent from './sidebar_confidentiality_content.vue';
+import SidebarConfidentialityForm from './sidebar_confidentiality_form.vue';
+
+export const confidentialWidget = Vue.observable({
+ setConfidentiality: null,
+});
+
+const hideDropdownEvent = new CustomEvent('hiddenGlDropdown', {
+ bubbles: true,
+});
+
+export default {
+ tracking: {
+ event: 'click_edit_button',
+ label: 'right_sidebar',
+ property: 'confidentiality',
+ },
+ components: {
+ SidebarEditableItem,
+ SidebarConfidentialityContent,
+ SidebarConfidentialityForm,
+ },
+ inject: ['fullPath', 'iid'],
+ props: {
+ issuableType: {
+ required: true,
+ type: String,
+ },
+ },
+ data() {
+ return {
+ confidential: false,
+ };
+ },
+ apollo: {
+ confidential: {
+ query() {
+ return confidentialityQueries[this.issuableType].query;
+ },
+ variables() {
+ return {
+ fullPath: this.fullPath,
+ iid: String(this.iid),
+ };
+ },
+ update(data) {
+ return data.workspace?.issuable?.confidential || false;
+ },
+ result({ data }) {
+ this.$emit('confidentialityUpdated', data.workspace?.issuable?.confidential);
+ },
+ error() {
+ createFlash({
+ message: sprintf(
+ __('Something went wrong while setting %{issuableType} confidentiality.'),
+ {
+ issuableType: this.issuableType,
+ },
+ ),
+ });
+ },
+ },
+ },
+ computed: {
+ isLoading() {
+ return this.$apollo.queries.confidential.loading;
+ },
+ },
+ mounted() {
+ confidentialWidget.setConfidentiality = this.setConfidentiality;
+ },
+ destroyed() {
+ confidentialWidget.setConfidentiality = null;
+ },
+ methods: {
+ closeForm() {
+ this.$refs.editable.collapse();
+ this.$el.dispatchEvent(hideDropdownEvent);
+ this.$emit('closeForm');
+ },
+ // synchronizing the quick action with the sidebar widget
+ // this is a temporary solution until we have confidentiality real-time updates
+ setConfidentiality() {
+ const { defaultClient: client } = this.$apollo.provider.clients;
+ const sourceData = client.readQuery({
+ query: confidentialityQueries[this.issuableType].query,
+ variables: { fullPath: this.fullPath, iid: this.iid },
+ });
+
+ const data = produce(sourceData, (draftData) => {
+ // eslint-disable-next-line no-param-reassign
+ draftData.workspace.issuable.confidential = !this.confidential;
+ });
+
+ client.writeQuery({
+ query: confidentialityQueries[this.issuableType].query,
+ variables: { fullPath: this.fullPath, iid: this.iid },
+ data,
+ });
+ },
+ expandSidebar() {
+ this.$refs.editable.expand();
+ this.$emit('expandSidebar');
+ },
+ },
+};
+</script>
+
+<template>
+ <sidebar-editable-item
+ ref="editable"
+ :title="__('Confidentiality')"
+ :tracking="$options.tracking"
+ :loading="isLoading"
+ class="block confidentiality"
+ >
+ <template #collapsed>
+ <div>
+ <sidebar-confidentiality-content
+ v-if="!isLoading"
+ :confidential="confidential"
+ :issuable-type="issuableType"
+ @expandSidebar="expandSidebar"
+ />
+ </div>
+ </template>
+ <template #default>
+ <sidebar-confidentiality-content :confidential="confidential" :issuable-type="issuableType" />
+ <sidebar-confidentiality-form
+ :confidential="confidential"
+ :issuable-type="issuableType"
+ @closeForm="closeForm"
+ />
+ </template>
+ </sidebar-editable-item>
+</template>
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 cbd68f2513a..dd1d54d67f2 100644
--- a/app/assets/javascripts/sidebar/components/reviewers/uncollapsed_reviewer_list.vue
+++ b/app/assets/javascripts/sidebar/components/reviewers/uncollapsed_reviewer_list.vue
@@ -1,5 +1,6 @@
<script>
import { GlButton, GlTooltipDirective, GlIcon } from '@gitlab/ui';
+import { sprintf, s__ } from '~/locale';
import ReviewerAvatarLink from './reviewer_avatar_link.vue';
const LOADING_STATE = 'loading';
@@ -50,6 +51,9 @@ export default {
},
},
methods: {
+ approvedByTooltipTitle(user) {
+ return sprintf(s__('MergeRequest|Approved by @%{username}'), user);
+ },
toggleShowLess() {
this.showLess = !this.showLess;
},
@@ -57,6 +61,7 @@ export default {
this.loadingStates[userId] = LOADING_STATE;
this.$emit('request-review', { userId, callback: this.requestReviewComplete });
},
+
requestReviewComplete(userId, success) {
if (success) {
this.loadingStates[userId] = SUCCESS_STATE;
@@ -86,10 +91,19 @@ export default {
<div class="gl-ml-3">@{{ user.username }}</div>
</reviewer-avatar-link>
<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"
+ data-testid="re-approved"
+ />
+ <gl-icon
v-if="loadingStates[user.id] === $options.SUCCESS_STATE"
:size="24"
name="check"
- class="float-right gl-text-green-500"
+ class="float-right gl-py-2 gl-mr-2 gl-text-green-500"
data-testid="re-request-success"
/>
<gl-button
diff --git a/app/assets/javascripts/sidebar/components/sidebar_editable_item.vue b/app/assets/javascripts/sidebar/components/sidebar_editable_item.vue
index 9da839cd133..4ab4606ac1c 100644
--- a/app/assets/javascripts/sidebar/components/sidebar_editable_item.vue
+++ b/app/assets/javascripts/sidebar/components/sidebar_editable_item.vue
@@ -3,7 +3,12 @@ import { GlButton, GlLoadingIcon } from '@gitlab/ui';
export default {
components: { GlButton, GlLoadingIcon },
- inject: ['canUpdate'],
+ inject: {
+ canUpdate: {},
+ isClassicSidebar: {
+ default: false,
+ },
+ },
props: {
title: {
type: String,
@@ -15,6 +20,15 @@ export default {
required: false,
default: false,
},
+ tracking: {
+ type: Object,
+ required: false,
+ default: () => ({
+ event: null,
+ label: null,
+ property: null,
+ }),
+ },
},
data() {
return {
@@ -71,24 +85,33 @@ export default {
<template>
<div>
- <div class="gl-display-flex gl-align-items-center gl-mb-3" @click.self="collapse">
- <span data-testid="title">{{ title }}</span>
- <gl-loading-icon v-if="loading" inline class="gl-ml-2" />
+ <div class="gl-display-flex gl-align-items-center" @click.self="collapse">
+ <span class="hide-collapsed" data-testid="title">{{ title }}</span>
+ <gl-loading-icon v-if="loading" inline class="gl-ml-2 hide-collapsed" />
+ <gl-loading-icon
+ v-if="loading && isClassicSidebar"
+ inline
+ class="gl-mx-auto gl-my-0 hide-expanded"
+ />
<gl-button
v-if="canUpdate"
variant="link"
- class="gl-text-gray-900! gl-hover-text-blue-800! gl-ml-auto js-sidebar-dropdown-toggle"
+ class="gl-text-gray-900! gl-hover-text-blue-800! gl-ml-auto hide-collapsed"
data-testid="edit-button"
+ :data-track-event="tracking.event"
+ :data-track-label="tracking.label"
+ :data-track-property="tracking.property"
+ data-qa-selector="edit_link"
@keyup.esc="toggle"
@click="toggle"
>
{{ __('Edit') }}
</gl-button>
</div>
- <div v-show="!edit" class="gl-text-gray-500" data-testid="collapsed-content">
+ <div v-show="!edit" data-testid="collapsed-content">
<slot name="collapsed">{{ __('None') }}</slot>
</div>
- <div v-show="edit" data-testid="expanded-content">
+ <div v-show="edit" data-testid="expanded-content" :class="{ 'gl-mt-3': !isClassicSidebar }">
<slot :edit="edit"></slot>
</div>
</div>
diff --git a/app/assets/javascripts/sidebar/components/subscriptions/subscriptions.vue b/app/assets/javascripts/sidebar/components/subscriptions/subscriptions.vue
index 9b06c20a6f3..c0424dc2873 100644
--- a/app/assets/javascripts/sidebar/components/subscriptions/subscriptions.vue
+++ b/app/assets/javascripts/sidebar/components/subscriptions/subscriptions.vue
@@ -122,6 +122,8 @@ export default {
:value="subscribed"
class="hide-collapsed"
data-testid="subscription-toggle"
+ :label="__('Notifications')"
+ label-position="hidden"
@change="toggleSubscription"
/>
</div>
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 e0f60b9af08..d1a5685fdd3 100644
--- a/app/assets/javascripts/sidebar/components/time_tracking/help_state.vue
+++ b/app/assets/javascripts/sidebar/components/time_tracking/help_state.vue
@@ -1,10 +1,14 @@
<script>
/* eslint-disable vue/no-v-html */
+import { GlButton } from '@gitlab/ui';
import { joinPaths } from '~/lib/utils/url_utility';
import { sprintf, s__ } from '../../../locale';
export default {
name: 'TimeTrackingHelpState',
+ components: {
+ GlButton,
+ },
computed: {
href() {
return joinPaths(gon.relative_url_root || '', '/help/user/project/time_tracking.md');
@@ -40,7 +44,7 @@ export default {
<p>{{ __('Quick actions can be used in the issues description and comment boxes.') }}</p>
<p v-html="estimateText"></p>
<p v-html="spendText"></p>
- <a :href="href" class="btn btn-default learn-more-button"> {{ __('Learn more') }} </a>
+ <gl-button :href="href">{{ __('Learn more') }}</gl-button>
</div>
</div>
</template>
diff --git a/app/assets/javascripts/sidebar/constants.js b/app/assets/javascripts/sidebar/constants.js
index 274aa237aea..e3929499009 100644
--- a/app/assets/javascripts/sidebar/constants.js
+++ b/app/assets/javascripts/sidebar/constants.js
@@ -1,9 +1,15 @@
import { IssuableType } from '~/issue_show/constants';
+import epicConfidentialQuery from '~/sidebar/queries/epic_confidential.query.graphql';
+import issueConfidentialQuery from '~/sidebar/queries/issue_confidential.query.graphql';
+import updateEpicMutation from '~/sidebar/queries/update_epic_confidential.mutation.graphql';
+import updateIssueConfidentialMutation from '~/sidebar/queries/update_issue_confidential.mutation.graphql';
import getIssueParticipants from '~/vue_shared/components/sidebar/queries/get_issue_participants.query.graphql';
import getMergeRequestParticipants from '~/vue_shared/components/sidebar/queries/get_mr_participants.query.graphql';
import updateAssigneesMutation from '~/vue_shared/components/sidebar/queries/update_issue_assignees.mutation.graphql';
import updateMergeRequestParticipantsMutation from '~/vue_shared/components/sidebar/queries/update_mr_assignees.mutation.graphql';
+export const ASSIGNEES_DEBOUNCE_DELAY = 250;
+
export const assigneesQueries = {
[IssuableType.Issue]: {
query: getIssueParticipants,
@@ -14,3 +20,14 @@ export const assigneesQueries = {
mutation: updateMergeRequestParticipantsMutation,
},
};
+
+export const confidentialityQueries = {
+ [IssuableType.Issue]: {
+ query: issueConfidentialQuery,
+ mutation: updateIssueConfidentialMutation,
+ },
+ [IssuableType.Epic]: {
+ query: epicConfidentialQuery,
+ mutation: updateEpicMutation,
+ },
+};
diff --git a/app/assets/javascripts/sidebar/graphql.js b/app/assets/javascripts/sidebar/graphql.js
new file mode 100644
index 00000000000..aa139540a51
--- /dev/null
+++ b/app/assets/javascripts/sidebar/graphql.js
@@ -0,0 +1,8 @@
+import VueApollo from 'vue-apollo';
+import createDefaultClient from '~/lib/graphql';
+
+export const defaultClient = createDefaultClient();
+
+export const apolloProvider = new VueApollo({
+ defaultClient,
+});
diff --git a/app/assets/javascripts/sidebar/mount_sidebar.js b/app/assets/javascripts/sidebar/mount_sidebar.js
index 662edbc4f8d..3c56e95ef40 100644
--- a/app/assets/javascripts/sidebar/mount_sidebar.js
+++ b/app/assets/javascripts/sidebar/mount_sidebar.js
@@ -2,7 +2,6 @@ import $ from 'jquery';
import Vue from 'vue';
import VueApollo from 'vue-apollo';
import createFlash from '~/flash';
-import createDefaultClient from '~/lib/graphql';
import {
isInIssuePage,
isInDesignPage,
@@ -10,9 +9,10 @@ import {
parseBoolean,
} from '~/lib/utils/common_utils';
import { __ } from '~/locale';
+import SidebarConfidentialityWidget from '~/sidebar/components/confidential/sidebar_confidentiality_widget.vue';
+import { apolloProvider } from '~/sidebar/graphql';
import Translate from '../vue_shared/translate';
import SidebarAssignees from './components/assignees/sidebar_assignees.vue';
-import ConfidentialIssueSidebar from './components/confidential/confidential_issue_sidebar.vue';
import CopyEmailToClipboard from './components/copy_email_to_clipboard.vue';
import SidebarLabels from './components/labels/sidebar_labels.vue';
import IssuableLockForm from './components/lock/issuable_lock_form.vue';
@@ -54,9 +54,6 @@ function getSidebarAssigneeAvailabilityData() {
function mountAssigneesComponent(mediator) {
const el = document.getElementById('js-vue-sidebar-assignees');
- const apolloProvider = new VueApollo({
- defaultClient: createDefaultClient(),
- });
if (!el) return;
@@ -87,9 +84,6 @@ function mountAssigneesComponent(mediator) {
function mountReviewersComponent(mediator) {
const el = document.getElementById('js-vue-sidebar-reviewers');
- const apolloProvider = new VueApollo({
- defaultClient: createDefaultClient(),
- });
if (!el) return;
@@ -121,10 +115,6 @@ export function mountSidebarLabels() {
return false;
}
- const apolloProvider = new VueApollo({
- defaultClient: createDefaultClient(),
- });
-
return new Vue({
el,
apolloProvider,
@@ -139,39 +129,37 @@ export function mountSidebarLabels() {
});
}
-function mountConfidentialComponent(mediator) {
+function mountConfidentialComponent() {
const el = document.getElementById('js-confidential-entry-point');
+ if (!el) {
+ return;
+ }
const { fullPath, iid } = getSidebarOptions();
-
- if (!el) return;
-
const dataNode = document.getElementById('js-confidential-issue-data');
const initialData = JSON.parse(dataNode.innerHTML);
- import(/* webpackChunkName: 'notesStore' */ '~/notes/stores')
- .then(
- ({ store }) =>
- new Vue({
- el,
- store,
- components: {
- ConfidentialIssueSidebar,
- },
- render: (createElement) =>
- createElement('confidential-issue-sidebar', {
- props: {
- iid: String(iid),
- fullPath,
- isEditable: initialData.is_editable,
- service: mediator.service,
- },
- }),
- }),
- )
- .catch(() => {
- createFlash({ message: __('Failed to load sidebar confidential toggle') });
- });
+ // eslint-disable-next-line no-new
+ new Vue({
+ el,
+ apolloProvider,
+ components: {
+ SidebarConfidentialityWidget,
+ },
+ provide: {
+ iid: String(iid),
+ fullPath,
+ canUpdate: initialData.is_editable,
+ },
+
+ render: (createElement) =>
+ createElement('sidebar-confidentiality-widget', {
+ props: {
+ issuableType:
+ isInIssuePage() || isInIncidentPage() || isInDesignPage() ? 'issue' : 'merge_request',
+ },
+ }),
+ });
}
function mountLockComponent() {
@@ -280,9 +268,6 @@ function mountSeverityComponent() {
if (!severityContainerEl) {
return false;
}
- const apolloProvider = new VueApollo({
- defaultClient: createDefaultClient(),
- });
const { fullPath, iid, severity } = getSidebarOptions();
diff --git a/app/assets/javascripts/sidebar/queries/epic_confidential.query.graphql b/app/assets/javascripts/sidebar/queries/epic_confidential.query.graphql
new file mode 100644
index 00000000000..7a1fdb40e93
--- /dev/null
+++ b/app/assets/javascripts/sidebar/queries/epic_confidential.query.graphql
@@ -0,0 +1,10 @@
+query epicConfidential($fullPath: ID!, $iid: ID) {
+ workspace: group(fullPath: $fullPath) {
+ __typename
+ issuable: epic(iid: $iid) {
+ __typename
+ id
+ confidential
+ }
+ }
+}
diff --git a/app/assets/javascripts/sidebar/queries/issue_confidential.query.graphql b/app/assets/javascripts/sidebar/queries/issue_confidential.query.graphql
new file mode 100644
index 00000000000..92cabf46af7
--- /dev/null
+++ b/app/assets/javascripts/sidebar/queries/issue_confidential.query.graphql
@@ -0,0 +1,10 @@
+query issueConfidential($fullPath: ID!, $iid: String) {
+ workspace: project(fullPath: $fullPath) {
+ __typename
+ issuable: issue(iid: $iid) {
+ __typename
+ id
+ confidential
+ }
+ }
+}
diff --git a/app/assets/javascripts/sidebar/queries/sidebarDetailsMR.query.graphql b/app/assets/javascripts/sidebar/queries/sidebarDetailsMR.query.graphql
new file mode 100644
index 00000000000..02498b18832
--- /dev/null
+++ b/app/assets/javascripts/sidebar/queries/sidebarDetailsMR.query.graphql
@@ -0,0 +1,7 @@
+query mergeRequestSidebarDetails($fullPath: ID!, $iid: String!) {
+ project(fullPath: $fullPath) {
+ mergeRequest(iid: $iid) {
+ iid # currently unused.
+ }
+ }
+}
diff --git a/app/assets/javascripts/sidebar/queries/update_epic_confidential.mutation.graphql b/app/assets/javascripts/sidebar/queries/update_epic_confidential.mutation.graphql
new file mode 100644
index 00000000000..69927ddd205
--- /dev/null
+++ b/app/assets/javascripts/sidebar/queries/update_epic_confidential.mutation.graphql
@@ -0,0 +1,9 @@
+mutation updateEpic($input: UpdateEpicInput!) {
+ issuableSetConfidential: updateEpic(input: $input) {
+ issuable: epic {
+ id
+ confidential
+ }
+ errors
+ }
+}
diff --git a/app/assets/javascripts/sidebar/queries/update_issue_confidential.mutation.graphql b/app/assets/javascripts/sidebar/queries/update_issue_confidential.mutation.graphql
new file mode 100644
index 00000000000..8f716c882d6
--- /dev/null
+++ b/app/assets/javascripts/sidebar/queries/update_issue_confidential.mutation.graphql
@@ -0,0 +1,9 @@
+mutation updateIssueConfidential($input: IssueSetConfidentialInput!) {
+ issuableSetConfidential: issueSetConfidential(input: $input) {
+ issuable: issue {
+ id
+ confidential
+ }
+ errors
+ }
+}
diff --git a/app/assets/javascripts/sidebar/services/sidebar_service.js b/app/assets/javascripts/sidebar/services/sidebar_service.js
index f31e4a3e0dd..88501f2c305 100644
--- a/app/assets/javascripts/sidebar/services/sidebar_service.js
+++ b/app/assets/javascripts/sidebar/services/sidebar_service.js
@@ -1,8 +1,14 @@
-import sidebarDetailsQuery from 'ee_else_ce/sidebar/queries/sidebarDetails.query.graphql';
+import sidebarDetailsIssueQuery from 'ee_else_ce/sidebar/queries/sidebarDetails.query.graphql';
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';
+
+const queries = {
+ merge_request: sidebarDetailsMRQuery,
+ issue: sidebarDetailsIssueQuery,
+};
export const gqClient = createGqClient(
{},
@@ -20,6 +26,7 @@ export default class SidebarService {
this.projectsAutocompleteEndpoint = endpointMap.projectsAutocompleteEndpoint;
this.fullPath = endpointMap.fullPath;
this.iid = endpointMap.iid;
+ this.issuableType = endpointMap.issuableType;
SidebarService.singleton = this;
}
@@ -31,7 +38,7 @@ export default class SidebarService {
return Promise.all([
axios.get(this.endpoint),
gqClient.query({
- query: sidebarDetailsQuery,
+ query: this.sidebarDetailsQuery(),
variables: {
fullPath: this.fullPath,
iid: this.iid.toString(),
@@ -40,6 +47,10 @@ export default class SidebarService {
]);
}
+ sidebarDetailsQuery() {
+ return queries[this.issuableType];
+ }
+
update(key, data) {
return axios.put(this.endpoint, { [key]: data });
}
diff --git a/app/assets/javascripts/sidebar/sidebar_mediator.js b/app/assets/javascripts/sidebar/sidebar_mediator.js
index bd382ed0fdb..3595354da80 100644
--- a/app/assets/javascripts/sidebar/sidebar_mediator.js
+++ b/app/assets/javascripts/sidebar/sidebar_mediator.js
@@ -22,6 +22,7 @@ export default class SidebarMediator {
projectsAutocompleteEndpoint: options.projectsAutocompleteEndpoint,
fullPath: options.fullPath,
iid: options.iid,
+ issuableType: options.issuableType,
});
SidebarMediator.singleton = this;
}
diff --git a/app/assets/javascripts/single_file_diff.js b/app/assets/javascripts/single_file_diff.js
index 687289b6675..2c4928fc338 100644
--- a/app/assets/javascripts/single_file_diff.js
+++ b/app/assets/javascripts/single_file_diff.js
@@ -73,7 +73,7 @@ export default class SingleFileDiff {
this.collapsedContent.hide();
this.loadingContent.show();
- axios
+ return axios
.get(this.diffForPath)
.then(({ data }) => {
this.loadingContent.hide();
diff --git a/app/assets/javascripts/snippets/components/edit.vue b/app/assets/javascripts/snippets/components/edit.vue
index 9f43ac36df7..bee9d7b8c2a 100644
--- a/app/assets/javascripts/snippets/components/edit.vue
+++ b/app/assets/javascripts/snippets/components/edit.vue
@@ -221,7 +221,10 @@ export default {
this.captchaResponse = captchaResponse;
if (this.captchaResponse) {
- // If the user solved the captcha resubmit the form.
+ // If the user solved the captcha, resubmit the form.
+ // NOTE: we do not need to clear out the captchaResponse and spamLogId
+ // data values after submit, because this component always does a full page reload.
+ // Otherwise, we would need to.
this.handleFormSubmit();
} else {
// If the user didn't solve the captcha (e.g. they just closed the modal),
diff --git a/app/assets/javascripts/snippets/components/snippet_visibility_edit.vue b/app/assets/javascripts/snippets/components/snippet_visibility_edit.vue
index 18a7d4ad218..e6aa3be0371 100644
--- a/app/assets/javascripts/snippets/components/snippet_visibility_edit.vue
+++ b/app/assets/javascripts/snippets/components/snippet_visibility_edit.vue
@@ -55,7 +55,12 @@ export default {
>
<div class="d-flex align-items-center">
<gl-icon :size="16" :name="option.icon" />
- <span class="font-weight-bold ml-1 js-visibility-option">{{ option.label }}</span>
+ <span
+ class="font-weight-bold ml-1 js-visibility-option"
+ data-qa-selector="visibility_content"
+ :data-qa-visibility="option.label"
+ >{{ option.label }}</span
+ >
</div>
<template #help>{{
isProjectSnippet && option.description_project
diff --git a/app/assets/javascripts/static_site_editor/constants.js b/app/assets/javascripts/static_site_editor/constants.js
index 4cabd943e22..5fb20b00705 100644
--- a/app/assets/javascripts/static_site_editor/constants.js
+++ b/app/assets/javascripts/static_site_editor/constants.js
@@ -12,7 +12,7 @@ export const SUBMIT_CHANGES_MERGE_REQUEST_ERROR = s__(
'StaticSiteEditor|Could not create merge request.',
);
export const LOAD_CONTENT_ERROR = __(
- 'An error ocurred while loading your content. Please try again.',
+ 'An error occurred while loading your content. Please try again.',
);
export const DEFAULT_FORMATTING_CHANGES_COMMIT_MESSAGE = s__(
diff --git a/app/assets/javascripts/tooltips/components/tooltips.vue b/app/assets/javascripts/tooltips/components/tooltips.vue
index 90bdf06bc4c..1ad18508294 100644
--- a/app/assets/javascripts/tooltips/components/tooltips.vue
+++ b/app/assets/javascripts/tooltips/components/tooltips.vue
@@ -82,9 +82,10 @@ export default {
},
triggerEvent(target, event) {
const tooltip = this.findTooltipByTarget(target);
+ const tooltipRef = this.$refs[tooltip?.id];
- if (tooltip) {
- this.$refs[tooltip.id][0].$emit(event);
+ if (tooltipRef) {
+ tooltipRef[0].$emit(event);
}
},
tooltipExists(element) {
@@ -113,6 +114,7 @@ export default {
:boundary="tooltip.boundary"
:disabled="tooltip.disabled"
:show="tooltip.show"
+ @hidden="$emit('hidden', tooltip)"
>
<span v-if="tooltip.html" v-safe-html:[$options.safeHtmlConfig]="tooltip.title"></span>
<span v-else>{{ tooltip.title }}</span>
diff --git a/app/assets/javascripts/tooltips/index.js b/app/assets/javascripts/tooltips/index.js
index a9978c03a6e..f60c0759c72 100644
--- a/app/assets/javascripts/tooltips/index.js
+++ b/app/assets/javascripts/tooltips/index.js
@@ -92,6 +92,7 @@ export const hide = createTooltipApiInvoker((element) =>
export const show = createTooltipApiInvoker((element) =>
tooltipsApp().triggerEvent(element, 'open'),
);
+export const once = (event, cb) => tooltipsApp().$once(event, cb);
export const destroy = () => {
tooltipsApp().$destroy();
app = null;
diff --git a/app/assets/javascripts/tracking.js b/app/assets/javascripts/tracking.js
index 5d82d56f4ba..01de034417e 100644
--- a/app/assets/javascripts/tracking.js
+++ b/app/assets/javascripts/tracking.js
@@ -1,4 +1,16 @@
import { omitBy, isUndefined } from 'lodash';
+import { TRACKING_CONTEXT_SCHEMA } from '~/experimentation/constants';
+import { getExperimentData } from '~/experimentation/utils';
+
+const standardContext = { ...window.gl?.snowplowStandardContext };
+
+export const STANDARD_CONTEXT = {
+ schema: standardContext.schema,
+ data: {
+ ...(standardContext.data || {}),
+ source: 'gitlab-javascript',
+ },
+};
const DEFAULT_SNOWPLOW_OPTIONS = {
namespace: 'gl',
@@ -20,11 +32,17 @@ const createEventPayload = (el, { suffix = '' } = {}) => {
let value = el.dataset.trackValue || el.value || undefined;
if (el.type === 'checkbox' && !el.checked) value = false;
+ let context = el.dataset.trackContext;
+ if (el.dataset.trackExperiment) {
+ const data = getExperimentData(el.dataset.trackExperiment);
+ if (data) context = { schema: TRACKING_CONTEXT_SCHEMA, data };
+ }
+
const data = {
label: el.dataset.trackLabel,
property: el.dataset.trackProperty,
value,
- context: el.dataset.trackContext,
+ context,
};
return {
@@ -51,25 +69,51 @@ const eventHandlers = (category, func) => {
return handlers;
};
+const dispatchEvent = (category = document.body.dataset.page, action = 'generic', data = {}) => {
+ // eslint-disable-next-line @gitlab/require-i18n-strings
+ if (!category) throw new Error('Tracking: no category provided for tracking.');
+
+ const { label, property, value } = data;
+ const contexts = [STANDARD_CONTEXT];
+
+ if (data.context) {
+ contexts.push(data.context);
+ }
+
+ return window.snowplow('trackStructEvent', category, action, label, property, value, contexts);
+};
+
export default class Tracking {
+ static queuedEvents = [];
+ static initialized = false;
+
static trackable() {
return !['1', 'yes'].includes(
window.doNotTrack || navigator.doNotTrack || navigator.msDoNotTrack,
);
}
+ static flushPendingEvents() {
+ this.initialized = true;
+
+ while (this.queuedEvents.length) {
+ dispatchEvent(...this.queuedEvents.shift());
+ }
+ }
+
static enabled() {
return typeof window.snowplow === 'function' && this.trackable();
}
- static event(category = document.body.dataset.page, action = 'generic', data = {}) {
+ static event(...eventData) {
if (!this.enabled()) return false;
- // eslint-disable-next-line @gitlab/require-i18n-strings
- if (!category) throw new Error('Tracking: no category provided for tracking.');
- const { label, property, value, context } = data;
- const contexts = context ? [context] : undefined;
- return window.snowplow('trackStructEvent', category, action, label, property, value, contexts);
+ if (!this.initialized) {
+ this.queuedEvents.push(eventData);
+ return false;
+ }
+
+ return dispatchEvent(...eventData);
}
static bindDocument(category = document.body.dataset.page, parent = document) {
@@ -128,13 +172,15 @@ export function initUserTracking() {
window.snowplow('newTracker', opts.namespace, opts.hostname, opts);
document.dispatchEvent(new Event('SnowplowInitialized'));
+ Tracking.flushPendingEvents();
}
export function initDefaultTrackers() {
if (!Tracking.enabled()) return;
window.snowplow('enableActivityTracking', 30, 30);
- window.snowplow('trackPageView'); // must be after enableActivityTracking
+ // must be after enableActivityTracking
+ window.snowplow('trackPageView', null, [STANDARD_CONTEXT]);
if (window.snowplowOptions.formTracking) window.snowplow('enableFormTracking');
if (window.snowplowOptions.linkClickTracking) window.snowplow('enableLinkClickTracking');
diff --git a/app/assets/javascripts/user_popovers.js b/app/assets/javascripts/user_popovers.js
index c18f4fb46cc..682932f6750 100644
--- a/app/assets/javascripts/user_popovers.js
+++ b/app/assets/javascripts/user_popovers.js
@@ -59,11 +59,33 @@ const populateUserInfo = (user) => {
};
const initializedPopovers = new Map();
+let domObservedForChanges = false;
-export default (elements = document.querySelectorAll('.js-user-link')) => {
+const addPopoversToModifiedTree = new MutationObserver(() => {
+ const userLinks = document?.querySelectorAll('.js-user-link, .gfm-project_member');
+
+ if (userLinks) {
+ addPopovers(userLinks); /* eslint-disable-line no-use-before-define */
+ }
+});
+
+function observeBody() {
+ if (!domObservedForChanges) {
+ addPopoversToModifiedTree.observe(document.body, {
+ subtree: true,
+ childList: true,
+ });
+
+ domObservedForChanges = true;
+ }
+}
+
+export default function addPopovers(elements = document.querySelectorAll('.js-user-link')) {
const userLinks = Array.from(elements);
const UserPopoverComponent = Vue.extend(UserPopover);
+ observeBody();
+
return userLinks
.filter(({ dataset }) => dataset.user || dataset.userId)
.map((el) => {
@@ -105,4 +127,4 @@ export default (elements = document.querySelectorAll('.js-user-link')) => {
return renderedPopover;
});
-};
+}
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/deployment/deployment_list.vue b/app/assets/javascripts/vue_merge_request_widget/components/deployment/deployment_list.vue
new file mode 100644
index 00000000000..d23c7f016fb
--- /dev/null
+++ b/app/assets/javascripts/vue_merge_request_widget/components/deployment/deployment_list.vue
@@ -0,0 +1,92 @@
+<script>
+import { GlSprintf } from '@gitlab/ui';
+import { n__ } from '~/locale';
+import MrCollapsibleExtension from '../mr_collapsible_extension.vue';
+
+export default {
+ components: {
+ Deployment: () => import('./deployment.vue'),
+ GlSprintf,
+ MrCollapsibleExtension,
+ },
+ props: {
+ deployments: {
+ type: Array,
+ required: true,
+ },
+ deploymentClass: {
+ type: String,
+ required: true,
+ },
+ hasDeploymentMetrics: {
+ type: Boolean,
+ required: true,
+ },
+ visualReviewAppMeta: {
+ type: Object,
+ required: false,
+ default: () => ({
+ sourceProjectId: '',
+ sourceProjectPath: '',
+ mergeRequestId: '',
+ appUrl: '',
+ }),
+ },
+ showVisualReviewAppLink: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ },
+ computed: {
+ showCollapsedDeployments() {
+ return this.deployments.length > 3;
+ },
+ multipleDeploymentsTitle() {
+ return n__(
+ 'Deployments|%{deployments} environment impacted.',
+ 'Deployments|%{deployments} environments impacted.',
+ this.deployments.length,
+ );
+ },
+ },
+};
+</script>
+<template>
+ <mr-collapsible-extension
+ v-if="showCollapsedDeployments"
+ :title="__('View all environments.')"
+ data-testid="mr-collapsed-deployments"
+ >
+ <template #header>
+ <div class="gl-mr-3 gl-line-height-normal">
+ <gl-sprintf :message="multipleDeploymentsTitle">
+ <template #deployments>
+ <span class="gl-font-weight-bold gl-mr-2">{{ deployments.length }}</span>
+ </template>
+ </gl-sprintf>
+ </div>
+ </template>
+ <deployment
+ v-for="deployment in deployments"
+ :key="deployment.id"
+ :class="deploymentClass"
+ class="gl-bg-gray-50"
+ :deployment="deployment"
+ :show-metrics="hasDeploymentMetrics"
+ :show-visual-review-app="showVisualReviewAppLink"
+ :visual-review-app-meta="visualReviewAppMeta"
+ />
+ </mr-collapsible-extension>
+ <div v-else class="mr-widget-extension">
+ <deployment
+ v-for="deployment in deployments"
+ :key="deployment.id"
+ :class="deploymentClass"
+ :deployment="deployment"
+ :show-metrics="hasDeploymentMetrics"
+ :show-visual-review-app="showVisualReviewAppLink"
+ :visual-review-app-meta="visualReviewAppMeta"
+ />
+ </div>
+</template>
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/mr_collapsible_extension.vue b/app/assets/javascripts/vue_merge_request_widget/components/mr_collapsible_extension.vue
index b6b5b56e5aa..a619ae9c351 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/mr_collapsible_extension.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/mr_collapsible_extension.vue
@@ -50,9 +50,9 @@ export default {
<div class="mr-widget-extension d-flex align-items-center pl-3">
<div v-if="hasError" class="ci-widget media">
<div class="media-body">
- <span class="gl-font-sm mr-widget-margin-left gl-line-height-24 js-error-state">{{
- title
- }}</span>
+ <span class="gl-font-sm mr-widget-margin-left gl-line-height-24 js-error-state">
+ {{ title }}
+ </span>
</div>
</div>
@@ -67,16 +67,27 @@ export default {
<gl-loading-icon v-if="isLoading" />
<gl-icon v-else :name="arrowIconName" class="js-icon" />
</button>
+ <template v-if="isCollapsed">
+ <slot name="header"></slot>
+ <gl-button
+ variant="link"
+ data-testid="mr-collapsible-title"
+ :disabled="isLoading"
+ :class="{ 'border-0': isLoading }"
+ @click="toggleCollapsed"
+ >
+ {{ title }}
+ </gl-button>
+ </template>
<gl-button
+ v-else
variant="link"
- class="js-title"
+ data-testid="mr-collapsible-title"
:disabled="isLoading"
:class="{ 'border-0': isLoading }"
@click="toggleCollapsed"
+ >{{ __('Collapse') }}</gl-button
>
- <template v-if="isCollapsed">{{ title }}</template>
- <template v-else>{{ __('Collapse') }}</template>
- </gl-button>
</template>
</div>
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 7c50df5f104..7532eabee8a 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
@@ -108,9 +108,7 @@ export default {
{{ $options.i18n.steps.step1.help }}
</p>
<div class="gl-display-flex">
- <pre class="gl-overflow-scroll gl-w-full" data-testid="how-to-merge-instructions">{{
- mergeInfo1
- }}</pre>
+ <pre class="gl-w-full" data-testid="how-to-merge-instructions">{{ mergeInfo1 }}</pre>
<clipboard-button
:text="mergeInfo1"
:title="$options.i18n.copyCommands"
@@ -131,9 +129,7 @@ export default {
{{ $options.i18n.steps.step3.help }}
</p>
<div class="gl-display-flex">
- <pre class="gl-overflow-scroll gl-w-full" data-testid="how-to-merge-instructions">{{
- mergeInfo2
- }}</pre>
+ <pre class="gl-w-full" data-testid="how-to-merge-instructions">{{ mergeInfo2 }}</pre>
<clipboard-button
:text="mergeInfo2"
:title="$options.i18n.copyCommands"
@@ -147,9 +143,7 @@ export default {
{{ $options.i18n.steps.step4.help }}
</p>
<div class="gl-display-flex">
- <pre class="gl-overflow-scroll gl-w-full" data-testid="how-to-merge-instructions">{{
- mergeInfo3
- }}</pre>
+ <pre class="gl-w-full" data-testid="how-to-merge-instructions">{{ mergeInfo3 }}</pre>
<clipboard-button
:text="mergeInfo3"
:title="$options.i18n.copyCommands"
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline.vue b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline.vue
index d022579ef54..3419abd4738 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline.vue
@@ -11,10 +11,11 @@ import {
} from '@gitlab/ui';
import mrWidgetPipelineMixin from 'ee_else_ce/vue_merge_request_widget/mixins/mr_widget_pipeline';
import { s__, n__ } from '~/locale';
+import PipelineMiniGraph from '~/pipelines/components/pipelines_list/pipeline_mini_graph.vue';
import PipelineArtifacts from '~/pipelines/components/pipelines_list/pipelines_artifacts.vue';
-import PipelineStage from '~/pipelines/components/pipelines_list/stage.vue';
import CiIcon from '~/vue_shared/components/ci_icon.vue';
import TooltipOnTruncate from '~/vue_shared/components/tooltip_on_truncate.vue';
+import { MT_MERGE_STRATEGY } from '../constants';
export default {
name: 'MRWidgetPipeline',
@@ -26,7 +27,7 @@ export default {
GlSprintf,
GlTooltip,
PipelineArtifacts,
- PipelineStage,
+ PipelineMiniGraph,
TooltipOnTruncate,
LinkedPipelinesMiniList: () =>
import('ee_component/vue_shared/components/linked_pipelines_mini_list.vue'),
@@ -80,6 +81,11 @@ export default {
type: String,
required: true,
},
+ mergeStrategy: {
+ type: String,
+ required: false,
+ default: '',
+ },
},
computed: {
hasPipeline() {
@@ -94,9 +100,7 @@ export default {
: {};
},
hasStages() {
- return (
- this.pipeline.details && this.pipeline.details.stages && this.pipeline.details.stages.length
- );
+ return this.pipeline?.details?.stages?.length > 0;
},
hasCommitInfo() {
return this.pipeline.commit && Object.keys(this.pipeline.commit).length > 0;
@@ -130,6 +134,9 @@ export default {
this.buildsWithCoverage.length,
);
},
+ isMergeTrain() {
+ return this.mergeStrategy === MT_MERGE_STRATEGY;
+ },
},
errorText: s__(
'Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}.',
@@ -242,19 +249,13 @@ export default {
<span class="mr-widget-pipeline-graph">
<span class="stage-cell">
<linked-pipelines-mini-list v-if="triggeredBy.length" :triggered-by="triggeredBy" />
- <template v-if="hasStages">
- <div
- v-for="(stage, i) in pipeline.details.stages"
- :key="i"
- :class="{
- 'has-downstream': hasDownstream(i),
- }"
- class="stage-container dropdown mr-widget-pipeline-stages"
- data-testid="widget-mini-pipeline-graph"
- >
- <pipeline-stage :stage="stage" />
- </div>
- </template>
+ <pipeline-mini-graph
+ v-if="hasStages"
+ class="gl-display-inline-block"
+ stages-class="mr-widget-pipeline-stages"
+ :stages="pipeline.details.stages"
+ :is-merge-train="isMergeTrain"
+ />
</span>
<linked-pipelines-mini-list v-if="triggered.length" :triggered="triggered" />
<pipeline-artifacts
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline_container.vue b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline_container.vue
index 2bf86c1863a..c24ae92db4f 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline_container.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline_container.vue
@@ -1,8 +1,11 @@
<script>
import { isNumber } from 'lodash';
import { sanitize } from '~/lib/dompurify';
+import { n__ } from '~/locale';
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
+import MergeRequestStore from '../stores/mr_widget_store';
import ArtifactsApp from './artifacts_list_app.vue';
+import DeploymentList from './deployment/deployment_list.vue';
import MrWidgetContainer from './mr_widget_container.vue';
import MrWidgetPipeline from './mr_widget_pipeline.vue';
@@ -18,7 +21,7 @@ export default {
name: 'MrWidgetPipelineContainer',
components: {
ArtifactsApp,
- Deployment: () => import('./deployment/deployment.vue'),
+ DeploymentList,
MrWidgetContainer,
MrWidgetPipeline,
MergeTrainPositionIndicator: () =>
@@ -64,11 +67,32 @@ export default {
return this.isPostMerge ? this.mr.mergePipeline : this.mr.pipeline;
},
showVisualReviewAppLink() {
- return this.mr.visualReviewAppAvailable && this.glFeatures.anonymousVisualReviewFeedback;
+ return Boolean(
+ this.mr.visualReviewAppAvailable && this.glFeatures.anonymousVisualReviewFeedback,
+ );
},
showMergeTrainPositionIndicator() {
return isNumber(this.mr.mergeTrainIndex);
},
+ showCollapsedDeployments() {
+ return this.deployments.length > 3;
+ },
+ multipleDeploymentsTitle() {
+ return n__(
+ 'Deployments|%{deployments} environment impacted.',
+ 'Deployments|%{deployments} environments impacted.',
+ this.deployments.length,
+ );
+ },
+ preferredAutoMergeStrategy() {
+ if (this.glFeatures.mergeRequestWidgetGraphql) {
+ return MergeRequestStore.getPreferredAutoMergeStrategy(
+ this.mr.availableAutoMergeStrategies,
+ );
+ }
+
+ return this.mr.preferredAutoMergeStrategy;
+ },
},
};
</script>
@@ -85,22 +109,20 @@ export default {
:source-branch-link="branchLink"
:mr-troubleshooting-docs-path="mr.mrTroubleshootingDocsPath"
:ci-troubleshooting-docs-path="mr.ciTroubleshootingDocsPath"
+ :merge-strategy="preferredAutoMergeStrategy"
/>
<template #footer>
<div v-if="mr.exposedArtifactsPath" class="js-exposed-artifacts">
<artifacts-app :endpoint="mr.exposedArtifactsPath" />
</div>
- <div v-if="deployments.length" class="mr-widget-extension">
- <deployment
- v-for="deployment in deployments"
- :key="deployment.id"
- :class="deploymentClass"
- :deployment="deployment"
- :show-metrics="hasDeploymentMetrics"
- :show-visual-review-app="showVisualReviewAppLink"
- :visual-review-app-meta="visualReviewAppMeta"
- />
- </div>
+ <deployment-list
+ v-if="deployments.length"
+ :deployments="deployments"
+ :deployment-class="deploymentClass"
+ :has-deployment-metrics="hasDeploymentMetrics"
+ :visual-review-app-meta="visualReviewAppMeta"
+ :show-visual-review-app-link="showVisualReviewAppLink"
+ />
<merge-train-position-indicator
v-if="showMergeTrainPositionIndicator"
class="mr-widget-extension"
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_auto_merge_enabled.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_auto_merge_enabled.vue
index 428641a1109..84a21a25552 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_auto_merge_enabled.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_auto_merge_enabled.vue
@@ -154,7 +154,7 @@ export default {
<status-icon status="success" />
<div class="media-body">
<h4 class="gl-display-flex">
- <span class="gl-mr-3">
+ <span class="gl-mr-3" data-qa-selector="merge_request_status_content">
<span class="js-status-text-before-author" data-testid="beforeStatusText">{{
statusTextBeforeAuthor
}}</span>
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_conflicts.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_conflicts.vue
index 2335e2984e4..23f415c3116 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_conflicts.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_conflicts.vue
@@ -1,9 +1,6 @@
<script>
-import { GlButton, GlModalDirective, GlSkeletonLoader } from '@gitlab/ui';
-import $ from 'jquery';
-import { escape } from 'lodash';
-import { s__, sprintf } from '~/locale';
-import { mouseenter, debouncedMouseleave, togglePopover } from '~/shared/popover';
+import { GlButton, GlModalDirective, GlSkeletonLoader, GlPopover, GlLink } from '@gitlab/ui';
+import { s__ } from '~/locale';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import mergeRequestQueryVariablesMixin from '../../mixins/merge_request_query_variables';
import userPermissionsQuery from '../../queries/permissions.query.graphql';
@@ -16,6 +13,8 @@ export default {
GlSkeletonLoader,
StatusIcon,
GlButton,
+ GlPopover,
+ GlLink,
},
directives: {
GlModalDirective,
@@ -106,48 +105,11 @@ export default {
return this.showResolveButton && this.sourceBranchProtected;
},
},
- watch: {
- showPopover: {
- handler(newVal) {
- if (newVal) {
- this.$nextTick(this.initPopover);
- }
- },
- immediate: true,
- },
- },
- methods: {
- initPopover() {
- const $el = $(this.$refs.popover);
-
- $el
- .popover({
- html: true,
- trigger: 'focus',
- container: 'body',
- placement: 'top',
- template:
- '<div class="popover" role="tooltip"><div class="arrow"></div><p class="popover-header"></p><div class="popover-body"></div></div>',
- title: s__(
- 'mrWidget|This feature merges changes from the target branch to the source branch. You cannot use this feature since the source branch is protected.',
- ),
- content: sprintf(
- s__('mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}'),
- {
- link_start: `<a href="${escape(
- this.mr.conflictsDocsPath,
- )}" target="_blank" rel="noopener noreferrer">`,
- link_end: '</a>',
- },
- false,
- ),
- })
- .on('mouseenter', mouseenter)
- .on('mouseleave', debouncedMouseleave(300))
- .on('show.bs.popover', () => {
- window.addEventListener('scroll', togglePopover.bind($el, false), { once: true });
- });
- },
+ i18n: {
+ title: s__(
+ 'mrWidget|This feature merges changes from the target branch to the source branch. You cannot use this feature since the source branch is protected.',
+ ),
+ linkText: s__('mrWidget|Learn more about resolving conflicts'),
},
};
</script>
@@ -162,7 +124,7 @@ export default {
<rect x="250" y="7" width="84" height="16" rx="4" />
</gl-skeleton-loader>
</div>
- <div v-else class="media-body space-children">
+ <div v-else class="media-body space-children gl-display-flex gl-align-items-center">
<span v-if="shouldBeRebased" class="bold">
{{
s__(`mrWidget|Fast-forward merge is not possible.
@@ -181,17 +143,35 @@ export default {
</span>
<span v-if="showResolveButton" ref="popover">
<gl-button
- :href="!sourceBranchProtected && mr.conflictResolutionPath"
+ :href="mr.conflictResolutionPath"
:disabled="sourceBranchProtected"
- class="js-resolve-conflicts-button"
+ data-testid="resolve-conflicts-button"
>
{{ s__('mrWidget|Resolve conflicts') }}
</gl-button>
+ <gl-popover
+ v-if="showPopover"
+ :target="() => $refs.popover"
+ placement="top"
+ triggers="hover focus"
+ >
+ <template #title>
+ <div class="gl-font-weight-normal gl-font-base">
+ {{ $options.i18n.title }}
+ </div>
+ </template>
+
+ <div class="gl-text-center">
+ <gl-link :href="mr.conflictsDocsPath" target="_blank" rel="noopener noreferrer">
+ {{ $options.i18n.linkText }}
+ </gl-link>
+ </div>
+ </gl-popover>
</span>
<gl-button
v-if="canMerge"
v-gl-modal-directive="'modal-merge-info'"
- class="js-merge-locally-button"
+ data-testid="merge-locally-button"
>
{{ s__('mrWidget|Merge locally') }}
</gl-button>
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 f0259a975db..01e0b91bd4a 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
@@ -1,12 +1,15 @@
<script>
/* eslint-disable vue/no-v-html */
-import { GlButton } from '@gitlab/ui';
+import { GlButton, GlSprintf, GlLink } from '@gitlab/ui';
import emptyStateSVG from 'icons/_mr_widget_empty_state.svg';
+import { helpPagePath } from '~/helpers/help_page_helper';
export default {
name: 'MRWidgetNothingToMerge',
components: {
GlButton,
+ GlSprintf,
+ GlLink,
},
props: {
mr: {
@@ -17,6 +20,7 @@ export default {
data() {
return { emptyStateSVG };
},
+ ciHelpPage: helpPagePath('/ci/quick_start/index.html'),
};
</script>
@@ -30,25 +34,20 @@ export default {
</div>
<div class="text col-md-7 order-md-first col-12">
<p class="highlight">
- {{
- s__(
- 'mrWidgetNothingToMerge|Merge requests are a place to propose changes you have made to a project and discuss those changes with others.',
- )
- }}
+ {{ s__('mrWidgetNothingToMerge|This merge request contains no changes.') }}
</p>
<p>
- {{
- s__(
- 'mrWidgetNothingToMerge|Interested parties can even contribute by pushing commits if they want to.',
- )
- }}
- </p>
- <p>
- {{
- s__(
- "mrWidgetNothingToMerge|Currently there are no changes in this merge request's source branch. Please push new commits or use a different branch.",
- )
- }}
+ <gl-sprintf
+ :message="
+ s__(
+ '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.',
+ )
+ "
+ >
+ <template #link="{ content }">
+ <gl-link :href="$options.ciHelpPage" target="_blank">{{ content }}</gl-link>
+ </template>
+ </gl-sprintf>
</p>
<div>
<gl-button
@@ -56,6 +55,7 @@ export default {
:href="mr.newBlobPath"
category="secondary"
variant="success"
+ data-testid="createFileButton"
>
{{ __('Create file') }}
</gl-button>
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/ready_to_merge.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/ready_to_merge.vue
index 690b6e9c462..0503b76bea4 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/states/ready_to_merge.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/states/ready_to_merge.vue
@@ -5,6 +5,7 @@ import {
GlButtonGroup,
GlDropdown,
GlDropdownItem,
+ GlFormCheckbox,
GlSprintf,
GlLink,
GlTooltipDirective,
@@ -81,6 +82,7 @@ export default {
GlButtonGroup,
GlDropdown,
GlDropdownItem,
+ GlFormCheckbox,
GlSkeletonLoader,
MergeTrainHelperText: () =>
import('ee_component/vue_merge_request_widget/components/merge_train_helper_text.vue'),
@@ -453,8 +455,8 @@ export default {
<div class="mr-widget-body media" :class="{ 'gl-pb-3': shouldRenderMergeTrainHelperText }">
<status-icon :status="iconClass" />
<div class="media-body">
- <div class="mr-widget-body-controls media space-children">
- <gl-button-group>
+ <div class="mr-widget-body-controls gl-display-flex gl-align-items-center">
+ <gl-button-group class="gl-align-self-start">
<gl-button
size="medium"
category="primary"
@@ -493,47 +495,48 @@ export default {
/>
</gl-dropdown>
</gl-button-group>
- <div class="media-body-wrap space-children">
- <template v-if="shouldShowMergeControls">
- <label v-if="canRemoveSourceBranch">
- <input
- id="remove-source-branch-input"
- v-model="removeSourceBranch"
- :disabled="isRemoveSourceBranchButtonDisabled"
- class="js-remove-source-branch-checkbox"
- type="checkbox"
- />
- {{ __('Delete source branch') }}
- </label>
-
- <!-- Placeholder for EE extension of this component -->
- <squash-before-merge
- v-if="shouldShowSquashBeforeMerge"
- v-model="squashBeforeMerge"
- :help-path="mr.squashBeforeMergeHelpPath"
- :is-disabled="isSquashReadOnly"
- />
- </template>
- <template v-else>
- <div class="bold js-resolve-mr-widget-items-message">
- <div
- v-if="hasPipelineMustSucceedConflict"
- class="gl-display-flex gl-align-items-center"
- data-testid="pipeline-succeed-conflict"
+ <div
+ v-if="shouldShowMergeControls"
+ class="gl-display-flex gl-align-items-center gl-flex-wrap"
+ >
+ <gl-form-checkbox
+ v-if="canRemoveSourceBranch"
+ id="remove-source-branch-input"
+ v-model="removeSourceBranch"
+ :disabled="isRemoveSourceBranchButtonDisabled"
+ class="js-remove-source-branch-checkbox gl-mx-3 gl-display-flex gl-align-items-center"
+ >
+ {{ __('Delete source branch') }}
+ </gl-form-checkbox>
+
+ <!-- Placeholder for EE extension of this component -->
+ <squash-before-merge
+ v-if="shouldShowSquashBeforeMerge"
+ v-model="squashBeforeMerge"
+ :help-path="mr.squashBeforeMergeHelpPath"
+ :is-disabled="isSquashReadOnly"
+ class="gl-mx-3"
+ />
+ </div>
+ <template v-else>
+ <div class="bold js-resolve-mr-widget-items-message gl-ml-3">
+ <div
+ v-if="hasPipelineMustSucceedConflict"
+ class="gl-display-flex gl-align-items-center"
+ data-testid="pipeline-succeed-conflict"
+ >
+ <gl-sprintf :message="pipelineMustSucceedConflictText" />
+ <gl-link
+ :href="mr.pipelineMustSucceedDocsPath"
+ target="_blank"
+ class="gl-display-flex gl-ml-2"
>
- <gl-sprintf :message="pipelineMustSucceedConflictText" />
- <gl-link
- :href="mr.pipelineMustSucceedDocsPath"
- target="_blank"
- class="gl-display-flex gl-ml-2"
- >
- <gl-icon name="question" />
- </gl-link>
- </div>
- <gl-sprintf v-else :message="mergeDisabledText" />
+ <gl-icon name="question" />
+ </gl-link>
</div>
- </template>
- </div>
+ <gl-sprintf v-else :message="mergeDisabledText" />
+ </div>
+ </template>
</div>
<div v-if="isSHAMismatch" class="d-flex align-items-center mt-2 js-sha-mismatch">
<gl-icon name="warning-solid" class="text-warning mr-1" />
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/squash_before_merge.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/squash_before_merge.vue
index 12fdfe601a4..6388b817e46 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/states/squash_before_merge.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/states/squash_before_merge.vue
@@ -44,7 +44,7 @@ export default {
:checked="value"
:disabled="isDisabled"
name="squash"
- class="qa-squash-checkbox js-squash-checkbox gl-mb-0 gl-mr-2"
+ class="qa-squash-checkbox js-squash-checkbox gl-mr-2 gl-display-flex gl-align-items-center"
:title="tooltipTitle"
@change="(checked) => $emit('input', checked)"
>
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/work_in_progress.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/work_in_progress.vue
index af305815381..1a549d5ee6f 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/states/work_in_progress.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/states/work_in_progress.vue
@@ -70,7 +70,7 @@ export default {
data: {
mergeRequestSetWip: {
errors,
- mergeRequest: { workInProgress, title },
+ mergeRequest: { mergeableDiscussionsState, workInProgress, title },
},
},
},
@@ -88,6 +88,8 @@ export default {
const data = produce(sourceData, (draftState) => {
// eslint-disable-next-line no-param-reassign
+ draftState.project.mergeRequest.mergeableDiscussionsState = mergeableDiscussionsState;
+ // eslint-disable-next-line no-param-reassign
draftState.project.mergeRequest.workInProgress = workInProgress;
// eslint-disable-next-line no-param-reassign
draftState.project.mergeRequest.title = title;
@@ -107,6 +109,7 @@ export default {
errors: [],
mergeRequest: {
__typename: 'MergeRequest',
+ mergeableDiscussionsState: true,
title: this.mr.title,
workInProgress: false,
},
diff --git a/app/assets/javascripts/vue_merge_request_widget/mixins/mr_widget_pipeline.js b/app/assets/javascripts/vue_merge_request_widget/mixins/mr_widget_pipeline.js
index 96e8bb45e34..7b77d7475bc 100644
--- a/app/assets/javascripts/vue_merge_request_widget/mixins/mr_widget_pipeline.js
+++ b/app/assets/javascripts/vue_merge_request_widget/mixins/mr_widget_pipeline.js
@@ -7,9 +7,4 @@ export default {
return [];
},
},
- methods: {
- hasDownstream() {
- return false;
- },
- },
};
diff --git a/app/assets/javascripts/vue_merge_request_widget/queries/toggle_wip.mutation.graphql b/app/assets/javascripts/vue_merge_request_widget/queries/toggle_wip.mutation.graphql
index 37abe5ddf3c..cfaa198d516 100644
--- a/app/assets/javascripts/vue_merge_request_widget/queries/toggle_wip.mutation.graphql
+++ b/app/assets/javascripts/vue_merge_request_widget/queries/toggle_wip.mutation.graphql
@@ -1,6 +1,7 @@
mutation toggleWIPStatus($projectPath: ID!, $iid: String!, $wip: Boolean!) {
mergeRequestSetWip(input: { projectPath: $projectPath, iid: $iid, wip: $wip }) {
mergeRequest {
+ mergeableDiscussionsState
title
workInProgress
}
diff --git a/app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js b/app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js
index a0f14f558d2..9e0fc10f5d3 100644
--- a/app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js
+++ b/app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js
@@ -177,7 +177,7 @@ export default class MergeRequestStore {
this.ciStatus = `${this.ciStatus}-with-warnings`;
}
- this.commitsCount = mergeRequest.commitCount || 10;
+ this.commitsCount = mergeRequest.commitCount;
this.branchMissing = !mergeRequest.sourceBranchExists || !mergeRequest.targetBranchExists;
this.hasConflicts = mergeRequest.conflicts;
this.hasMergeableDiscussionsState = mergeRequest.mergeableDiscussionsState === false;
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 0af5d028a2a..f7b49a85b83 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
@@ -11,12 +11,12 @@ import {
GlButton,
GlSafeHtmlDirective,
} from '@gitlab/ui';
+import * as Sentry from '@sentry/browser';
import highlightCurrentUser from '~/behaviors/markdown/highlight_current_user';
import { fetchPolicies } from '~/lib/graphql';
import { toggleContainerClasses } from '~/lib/utils/dom_utils';
import { visitUrl, joinPaths } from '~/lib/utils/url_utility';
import { s__ } from '~/locale';
-import * as Sentry from '~/sentry/wrapper';
import Tracking from '~/tracking';
import initUserPopovers from '~/user_popovers';
import AlertDetailsTable from '~/vue_shared/components/alert_details_table.vue';
@@ -222,7 +222,9 @@ export default {
});
},
incidentPath(issueId) {
- return joinPaths(this.projectIssuesPath, issueId);
+ return this.isThreatMonitoringPage
+ ? joinPaths(this.projectIssuesPath, issueId)
+ : joinPaths(this.projectIssuesPath, 'incident', issueId);
},
trackPageViews() {
const { category, action } = this.trackAlertsDetailsViewsOptions;
@@ -268,10 +270,10 @@ export default {
</span>
</div>
<gl-button
- v-if="alert.issueIid"
+ v-if="alert.issue"
class="gl-mt-3 mt-sm-0 align-self-center align-self-sm-baseline alert-details-incident-button"
data-testid="viewIncidentBtn"
- :href="incidentPath(alert.issueIid)"
+ :href="incidentPath(alert.issue.iid)"
category="primary"
variant="success"
>
diff --git a/app/assets/javascripts/vue_shared/alert_details/components/alert_metrics.vue b/app/assets/javascripts/vue_shared/alert_details/components/alert_metrics.vue
index dd4faa03c00..9d5006564ef 100644
--- a/app/assets/javascripts/vue_shared/alert_details/components/alert_metrics.vue
+++ b/app/assets/javascripts/vue_shared/alert_details/components/alert_metrics.vue
@@ -1,7 +1,7 @@
<script>
+import * as Sentry from '@sentry/browser';
import Vue from 'vue';
import Vuex from 'vuex';
-import * as Sentry from '~/sentry/wrapper';
Vue.use(Vuex);
diff --git a/app/assets/javascripts/vue_shared/components/awards_list.vue b/app/assets/javascripts/vue_shared/components/awards_list.vue
index ce67d33d4a1..82b3545117f 100644
--- a/app/assets/javascripts/vue_shared/components/awards_list.vue
+++ b/app/assets/javascripts/vue_shared/components/awards_list.vue
@@ -2,7 +2,9 @@
/* eslint-disable vue/no-v-html */
import { GlIcon, GlButton, GlTooltipDirective } from '@gitlab/ui';
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';
// Internal constant, specific to this component, used when no `currentUserId` is given
@@ -12,10 +14,12 @@ export default {
components: {
GlButton,
GlIcon,
+ EmojiPicker,
},
directives: {
GlTooltip: GlTooltipDirective,
},
+ mixins: [glFeatureFlagsMixin()],
props: {
awards: {
type: Array,
@@ -166,7 +170,25 @@ export default {
<span class="js-counter">{{ awardList.list.length }}</span>
</gl-button>
<div v-if="canAwardEmoji" class="award-menu-holder">
+ <emoji-picker
+ v-if="glFeatures.improvedEmojiPicker"
+ toggle-class="add-reaction-button gl-relative!"
+ @click="handleAward"
+ >
+ <template #button-content>
+ <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>
+ </template>
+ </emoji-picker>
<gl-button
+ v-else
v-gl-tooltip.viewport
:class="addButtonClass"
class="add-reaction-button js-add-award"
diff --git a/app/assets/javascripts/vue_shared/components/changed_file_icon.vue b/app/assets/javascripts/vue_shared/components/changed_file_icon.vue
index 14e99977a85..4b53f55b856 100644
--- a/app/assets/javascripts/vue_shared/components/changed_file_icon.vue
+++ b/app/assets/javascripts/vue_shared/components/changed_file_icon.vue
@@ -82,7 +82,13 @@ export default {
data-qa-selector="changed_file_icon_content"
:data-qa-title="tooltipTitle"
>
- <gl-icon v-if="showIcon" :name="changedIcon" :size="size" :class="changedIconClass" />
+ <gl-icon
+ v-if="showIcon"
+ :name="changedIcon"
+ :size="size"
+ :class="changedIconClass"
+ use-deprecated-sizes
+ />
</span>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/ci_icon.vue b/app/assets/javascripts/vue_shared/components/ci_icon.vue
index 07bd6019b80..dbf459cb289 100644
--- a/app/assets/javascripts/vue_shared/components/ci_icon.vue
+++ b/app/assets/javascripts/vue_shared/components/ci_icon.vue
@@ -64,6 +64,12 @@ export default {
</script>
<template>
<span :class="cssClass">
- <gl-icon :name="icon" :size="size" :class="cssClasses" :aria-label="status.icon" />
+ <gl-icon
+ :name="icon"
+ :size="size"
+ :class="cssClasses"
+ :aria-label="status.icon"
+ use-deprecated-sizes
+ />
</span>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/clipboard_button.vue b/app/assets/javascripts/vue_shared/components/clipboard_button.vue
index bf1361f1a6a..a7699d19872 100644
--- a/app/assets/javascripts/vue_shared/components/clipboard_button.vue
+++ b/app/assets/javascripts/vue_shared/components/clipboard_button.vue
@@ -46,6 +46,11 @@ export default {
required: false,
default: false,
},
+ tooltipBoundary: {
+ type: String,
+ required: false,
+ default: null,
+ },
cssClass: {
type: String,
required: false,
@@ -75,8 +80,11 @@ export default {
<template>
<gl-button
- v-gl-tooltip="{ placement: tooltipPlacement, container: tooltipContainer }"
- v-gl-tooltip.hover.blur
+ v-gl-tooltip.hover.blur="{
+ placement: tooltipPlacement,
+ container: tooltipContainer,
+ boundary: tooltipBoundary,
+ }"
:class="cssClass"
:title="title"
:data-clipboard-text="clipboardText"
diff --git a/app/assets/javascripts/vue_shared/components/diff_viewer/viewers/renamed.vue b/app/assets/javascripts/vue_shared/components/diff_viewer/viewers/renamed.vue
index d6f99e9a049..b3edd05b0ee 100644
--- a/app/assets/javascripts/vue_shared/components/diff_viewer/viewers/renamed.vue
+++ b/app/assets/javascripts/vue_shared/components/diff_viewer/viewers/renamed.vue
@@ -37,9 +37,11 @@ export default {
required: true,
},
},
- data: () => ({
- state: STATE_IDLING,
- }),
+ data() {
+ return {
+ state: STATE_IDLING,
+ };
+ },
computed: {
shortSha() {
return truncateSha(this.diffFile.content_sha);
diff --git a/app/assets/javascripts/vue_shared/components/file_icon.vue b/app/assets/javascripts/vue_shared/components/file_icon.vue
index 8ac8a3beb7d..4244cab902a 100644
--- a/app/assets/javascripts/vue_shared/components/file_icon.vue
+++ b/app/assets/javascripts/vue_shared/components/file_icon.vue
@@ -86,7 +86,7 @@ export default {
<template>
<span>
<gl-loading-icon v-if="loading" :inline="true" />
- <gl-icon v-else-if="isSymlink" name="symlink" :size="size" />
+ <gl-icon v-else-if="isSymlink" name="symlink" :size="size" use-deprecated-sizes />
<svg v-else-if="!folder" :key="spriteHref" :class="[iconSizeClass, cssClasses]">
<use v-bind="{ 'xlink:href': spriteHref }" />
</svg>
@@ -95,6 +95,7 @@ export default {
:name="folderIconName"
:size="size"
class="folder-icon"
+ use-deprecated-sizes
data-qa-selector="folder_icon_content"
/>
</span>
diff --git a/app/assets/javascripts/vue_shared/components/header_ci_component.vue b/app/assets/javascripts/vue_shared/components/header_ci_component.vue
index 80ca62a0e9b..b4cac13168a 100644
--- a/app/assets/javascripts/vue_shared/components/header_ci_component.vue
+++ b/app/assets/javascripts/vue_shared/components/header_ci_component.vue
@@ -102,7 +102,7 @@ export default {
data-qa-selector="pipeline_header"
data-testid="ci-header-content"
>
- <section class="header-main-content">
+ <section class="header-main-content gl-mr-3">
<ci-icon-badge :status="status" />
<strong data-testid="ci-header-item-text"> {{ itemName }} #{{ itemId }} </strong>
@@ -142,12 +142,16 @@ export default {
</template>
</section>
- <section v-if="$slots.default" data-testid="ci-header-action-buttons" class="gl-display-flex">
+ <section
+ v-if="$slots.default"
+ data-testid="ci-header-action-buttons"
+ class="gl-display-flex gl-mr-3"
+ >
<slot></slot>
</section>
<gl-button
v-if="hasSidebarButton"
- class="d-sm-none js-sidebar-build-toggle gl-ml-auto"
+ class="gl-md-display-none gl-ml-auto gl-align-self-start js-sidebar-build-toggle"
icon="chevron-double-lg-left"
:aria-label="__('Toggle sidebar')"
@click="onClickSidebarButton"
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 4c6fa71398d..e7e1a17cbe5 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
@@ -62,9 +62,6 @@ export default {
canBeBatched() {
return Boolean(this.glFeatures.batchSuggestions);
},
- canAddCustomCommitMessage() {
- return this.glFeatures.suggestionsCustomCommit;
- },
isApplying() {
return this.isApplyingSingle || this.isApplyingBatch;
},
@@ -89,11 +86,7 @@ export default {
if (!this.canApply) return;
this.isApplyingSingle = true;
- this.$emit(
- 'apply',
- this.applySuggestionCallback,
- gon.features?.suggestionsCustomCommit ? message : undefined,
- );
+ this.$emit('apply', this.applySuggestionCallback, message);
},
applySuggestionCallback() {
this.isApplyingSingle = false;
@@ -158,23 +151,12 @@ export default {
{{ __('Add suggestion to batch') }}
</gl-button>
<apply-suggestion
- v-if="canAddCustomCommitMessage"
+ v-if="isLoggedIn"
:disabled="isDisableButton"
:default-commit-message="defaultCommitMessage"
class="gl-ml-3"
@apply="applySuggestion"
/>
- <span v-else v-gl-tooltip.viewport="tooltipMessage" tabindex="0">
- <gl-button
- v-if="isLoggedIn"
- class="btn-inverted js-apply-btn btn-grouped"
- :disabled="isDisableButton"
- variant="success"
- @click="applySuggestion"
- >
- {{ __('Apply suggestion') }}
- </gl-button>
- </span>
</div>
</div>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/notes/timeline_icon.vue b/app/assets/javascripts/vue_shared/components/notes/timeline_icon.vue
new file mode 100644
index 00000000000..35f9ac14681
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/notes/timeline_icon.vue
@@ -0,0 +1,3 @@
+<template>
+ <div class="timeline-icon"><slot></slot></div>
+</template>
diff --git a/app/assets/javascripts/vue_shared/components/registry/code_instruction.vue b/app/assets/javascripts/vue_shared/components/registry/code_instruction.vue
index bc7f8a2b17a..1a85a641dd1 100644
--- a/app/assets/javascripts/vue_shared/components/registry/code_instruction.vue
+++ b/app/assets/javascripts/vue_shared/components/registry/code_instruction.vue
@@ -56,27 +56,29 @@ export default {
</script>
<template>
- <div v-if="!multiline" class="gl-mb-3">
+ <div>
<label v-if="label" :for="generateFormId('instruction-input')">{{ label }}</label>
- <div class="input-group gl-mb-3">
- <input
- :id="generateFormId('instruction-input')"
- :value="instruction"
- type="text"
- class="form-control gl-font-monospace"
- data-testid="instruction-input"
- readonly
- @copy="trackCopy"
- />
- <span class="input-group-append" data-testid="instruction-button" @click="trackCopy">
- <clipboard-button :text="instruction" :title="copyText" class="input-group-text" />
- </span>
+ <div v-if="!multiline" class="gl-mb-3">
+ <div class="input-group gl-mb-3">
+ <input
+ :id="generateFormId('instruction-input')"
+ :value="instruction"
+ type="text"
+ class="form-control gl-font-monospace"
+ data-testid="instruction-input"
+ readonly
+ @copy="trackCopy"
+ />
+ <span class="input-group-append" data-testid="instruction-button" @click="trackCopy">
+ <clipboard-button :text="instruction" :title="copyText" class="input-group-text" />
+ </span>
+ </div>
</div>
- </div>
- <div v-else>
- <pre class="gl-font-monospace" data-testid="multiline-instruction" @copy="trackCopy">{{
- instruction
- }}</pre>
+ <div v-else>
+ <pre class="gl-font-monospace" data-testid="multiline-instruction" @copy="trackCopy">{{
+ instruction
+ }}</pre>
+ </div>
</div>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/registry/list_item.vue b/app/assets/javascripts/vue_shared/components/registry/list_item.vue
index 9db5d6953d7..4ade75e705e 100644
--- a/app/assets/javascripts/vue_shared/components/registry/list_item.vue
+++ b/app/assets/javascripts/vue_shared/components/registry/list_item.vue
@@ -54,7 +54,7 @@ export default {
class="gl-display-flex gl-flex-direction-column gl-border-b-solid gl-border-t-solid gl-border-t-1 gl-border-b-1"
:class="optionalClasses"
>
- <div class="gl-display-flex gl-align-items-center gl-py-3">
+ <div class="gl-display-flex gl-align-items-center gl-py-3 gl-px-5">
<div
v-if="$slots['left-action']"
class="gl-w-7 gl-display-none gl-sm-display-flex gl-justify-content-start gl-pl-2"
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
new file mode 100644
index 00000000000..36b1a9c49f4
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/registry/persisted_dropdown_selection.vue
@@ -0,0 +1,59 @@
+<script>
+import { GlDropdown, GlDropdownItem } from '@gitlab/ui';
+import LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue';
+
+export default {
+ name: 'PersistedDropdownSelection',
+ components: {
+ GlDropdown,
+ GlDropdownItem,
+ LocalStorageSync,
+ },
+ props: {
+ options: {
+ type: Array,
+ required: true,
+ },
+ storageKey: {
+ type: String,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ selected: null,
+ };
+ },
+ computed: {
+ dropdownText() {
+ const selected = this.parsedOptions.find((o) => o.selected);
+ return selected?.label || this.options[0].label;
+ },
+ parsedOptions() {
+ return this.options.map((o) => ({ ...o, selected: o.value === this.selected }));
+ },
+ },
+ methods: {
+ setSelected(value) {
+ this.selected = value;
+ this.$emit('change', value);
+ },
+ },
+};
+</script>
+
+<template>
+ <local-storage-sync :storage-key="storageKey" :value="selected" @input="setSelected">
+ <gl-dropdown :text="dropdownText" lazy>
+ <gl-dropdown-item
+ v-for="option in parsedOptions"
+ :key="option.value"
+ :is-checked="option.selected"
+ :is-check-item="true"
+ @click="setSelected(option.value)"
+ >
+ {{ option.label }}
+ </gl-dropdown-item>
+ </gl-dropdown>
+ </local-storage-sync>
+</template>
diff --git a/app/assets/javascripts/vue_shared/components/select2_select.vue b/app/assets/javascripts/vue_shared/components/select2_select.vue
index 6574a5ddfde..bb1a8fae7b0 100644
--- a/app/assets/javascripts/vue_shared/components/select2_select.vue
+++ b/app/assets/javascripts/vue_shared/components/select2_select.vue
@@ -20,6 +20,12 @@ export default {
},
},
+ watch: {
+ value() {
+ $(this.$refs.dropdownInput).val(this.value).trigger('change');
+ },
+ },
+
mounted() {
loadCSSFile(gon.select2_css_path)
.then(() => {
diff --git a/app/assets/javascripts/vue_shared/components/settings/settings_block.vue b/app/assets/javascripts/vue_shared/components/settings/settings_block.vue
index 31094b985a2..92ae4575c52 100644
--- a/app/assets/javascripts/vue_shared/components/settings/settings_block.vue
+++ b/app/assets/javascripts/vue_shared/components/settings/settings_block.vue
@@ -5,6 +5,11 @@ import { __ } from '~/locale';
export default {
components: { GlButton },
props: {
+ slideAnimated: {
+ type: Boolean,
+ default: true,
+ required: false,
+ },
defaultExpanded: {
type: Boolean,
default: false,
@@ -28,7 +33,7 @@ export default {
</script>
<template>
- <section class="settings no-animate" :class="{ expanded }">
+ <section class="settings" :class="{ 'no-animate': !slideAnimated, expanded }">
<div class="settings-header">
<h4><slot name="title"></slot></h4>
<gl-button @click="sectionExpanded = !sectionExpanded">
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_value.vue b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_value.vue
index f173c8db540..46ccb9470e5 100644
--- a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_value.vue
+++ b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_value.vue
@@ -21,11 +21,14 @@ export default {
'allowLabelRemove',
'allowScopedLabels',
'labelsFilterBasePath',
+ 'labelsFilterParam',
]),
},
methods: {
labelFilterUrl(label) {
- return `${this.labelsFilterBasePath}?label_name[]=${encodeURIComponent(label.title)}`;
+ return `${this.labelsFilterBasePath}?${this.labelsFilterParam}[]=${encodeURIComponent(
+ label.title,
+ )}`;
},
scopedLabel(label) {
return this.allowScopedLabels && isScopedLabel(label);
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/labels_select_root.vue b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/labels_select_root.vue
index 93fdae19a8d..426ae430ce7 100644
--- a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/labels_select_root.vue
+++ b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/labels_select_root.vue
@@ -81,6 +81,11 @@ export default {
required: false,
default: '',
},
+ labelsFilterParam: {
+ type: String,
+ required: false,
+ default: 'label_name',
+ },
dropdownButtonText: {
type: String,
required: false,
@@ -156,6 +161,7 @@ export default {
labelsFetchPath: this.labelsFetchPath,
labelsManagePath: this.labelsManagePath,
labelsFilterBasePath: this.labelsFilterBasePath,
+ labelsFilterParam: this.labelsFilterParam,
labelsListTitle: this.labelsListTitle,
labelsCreateTitle: this.labelsCreateTitle,
footerCreateLabelTitle: this.footerCreateLabelTitle,
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/multiselect_dropdown.vue b/app/assets/javascripts/vue_shared/components/sidebar/multiselect_dropdown.vue
index 132abcab82b..ef5f052527b 100644
--- a/app/assets/javascripts/vue_shared/components/sidebar/multiselect_dropdown.vue
+++ b/app/assets/javascripts/vue_shared/components/sidebar/multiselect_dropdown.vue
@@ -1,10 +1,11 @@
<script>
-import { GlDropdown, GlDropdownForm } from '@gitlab/ui';
+import { GlDropdown, GlDropdownForm, GlDropdownDivider } from '@gitlab/ui';
export default {
components: {
GlDropdownForm,
GlDropdown,
+ GlDropdownDivider,
},
props: {
headerText: {
@@ -20,8 +21,12 @@ export default {
</script>
<template>
- <gl-dropdown class="show" :text="text" :header-text="headerText" @toggle="$emit('toggle')">
- <slot name="search"></slot>
+ <gl-dropdown class="show" :text="text" @toggle="$emit('toggle')">
+ <template #header>
+ <p class="gl-font-weight-bold gl-text-center gl-mt-2 gl-mb-4">{{ headerText }}</p>
+ <gl-dropdown-divider />
+ <slot name="search"></slot>
+ </template>
<gl-dropdown-form>
<slot name="items"></slot>
</gl-dropdown-form>
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/queries/get_issue_participants.query.graphql b/app/assets/javascripts/vue_shared/components/sidebar/queries/get_issue_participants.query.graphql
index 62c0b05426b..459ea27e9cd 100644
--- a/app/assets/javascripts/vue_shared/components/sidebar/queries/get_issue_participants.query.graphql
+++ b/app/assets/javascripts/vue_shared/components/sidebar/queries/get_issue_participants.query.graphql
@@ -1,8 +1,10 @@
#import "~/graphql_shared/fragments/user.fragment.graphql"
query issueParticipants($fullPath: ID!, $iid: String!) {
- project(fullPath: $fullPath) {
+ workspace: project(fullPath: $fullPath) {
+ __typename
issuable: issue(iid: $iid) {
+ __typename
id
participants {
nodes {
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/queries/get_mr_participants.query.graphql b/app/assets/javascripts/vue_shared/components/sidebar/queries/get_mr_participants.query.graphql
index a75ce85a1dc..43bd9f17e9a 100644
--- a/app/assets/javascripts/vue_shared/components/sidebar/queries/get_mr_participants.query.graphql
+++ b/app/assets/javascripts/vue_shared/components/sidebar/queries/get_mr_participants.query.graphql
@@ -1,7 +1,7 @@
#import "~/graphql_shared/fragments/user.fragment.graphql"
query getMrParticipants($fullPath: ID!, $iid: String!) {
- project(fullPath: $fullPath) {
+ workspace: project(fullPath: $fullPath) {
issuable: mergeRequest(iid: $iid) {
id
participants {
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/queries/update_issue_assignees.mutation.graphql b/app/assets/javascripts/vue_shared/components/sidebar/queries/update_issue_assignees.mutation.graphql
index 2eb9bb4b07b..8ee8de2cb5c 100644
--- a/app/assets/javascripts/vue_shared/components/sidebar/queries/update_issue_assignees.mutation.graphql
+++ b/app/assets/javascripts/vue_shared/components/sidebar/queries/update_issue_assignees.mutation.graphql
@@ -1,10 +1,10 @@
#import "~/graphql_shared/fragments/user.fragment.graphql"
mutation issueSetAssignees($iid: String!, $assigneeUsernames: [String!]!, $fullPath: ID!) {
- issueSetAssignees(
+ issuableSetAssignees: issueSetAssignees(
input: { iid: $iid, assigneeUsernames: $assigneeUsernames, projectPath: $fullPath }
) {
- issue {
+ issuable: issue {
id
assignees {
nodes {
diff --git a/app/assets/javascripts/vue_shared/components/tabs/tab.vue b/app/assets/javascripts/vue_shared/components/tabs/tab.vue
deleted file mode 100644
index d24c27cfcc3..00000000000
--- a/app/assets/javascripts/vue_shared/components/tabs/tab.vue
+++ /dev/null
@@ -1,47 +0,0 @@
-<script>
-export default {
- props: {
- title: {
- type: String,
- required: false,
- default: '',
- },
- active: {
- type: Boolean,
- required: false,
- default: false,
- },
- },
- data() {
- return {
- // props can't be updated, so we map it to data where we can
- localActive: this.active,
- };
- },
- watch: {
- active() {
- this.localActive = this.active;
- },
- },
- created() {
- this.isTab = true;
- },
- updated() {
- if (this.$parent) {
- this.$parent.$forceUpdate();
- }
- },
-};
-</script>
-
-<template>
- <div
- :class="{
- active: localActive,
- }"
- class="tab-pane"
- role="tabpanel"
- >
- <slot></slot>
- </div>
-</template>
diff --git a/app/assets/javascripts/vue_shared/components/tabs/tabs.js b/app/assets/javascripts/vue_shared/components/tabs/tabs.js
deleted file mode 100644
index 233df96a520..00000000000
--- a/app/assets/javascripts/vue_shared/components/tabs/tabs.js
+++ /dev/null
@@ -1,76 +0,0 @@
-export default {
- props: {
- stopPropagation: {
- type: Boolean,
- required: false,
- default: false,
- },
- },
- data() {
- return {
- currentIndex: 0,
- tabs: [],
- };
- },
- mounted() {
- this.updateTabs();
- },
- methods: {
- updateTabs() {
- this.tabs = this.$children.filter((child) => child.isTab);
- this.currentIndex = this.tabs.findIndex((tab) => tab.localActive);
- },
- setTab(e, index) {
- if (this.stopPropagation) {
- e.stopPropagation();
- e.preventDefault();
- }
-
- this.tabs[this.currentIndex].localActive = false;
- this.tabs[index].localActive = true;
-
- this.currentIndex = index;
- },
- },
- render(h) {
- const navItems = this.tabs.map((tab, i) =>
- h(
- 'li',
- {
- key: i,
- },
- [
- h(
- 'a',
- {
- class: tab.localActive ? 'active' : null,
- attrs: {
- href: '#',
- },
- on: {
- click: (e) => this.setTab(e, i),
- },
- },
- tab.$slots.title || tab.title,
- ),
- ],
- ),
- );
- const nav = h(
- 'ul',
- {
- class: 'nav-links tab-links',
- },
- [navItems],
- );
- const content = h(
- 'div',
- {
- class: ['tab-content'],
- },
- [this.$slots.default],
- );
-
- return h('div', {}, [[nav], content]);
- },
-};
diff --git a/app/assets/javascripts/vue_shared/components/tooltip_on_truncate.vue b/app/assets/javascripts/vue_shared/components/tooltip_on_truncate.vue
index 8aa6e29adf1..c5fdb5fc242 100644
--- a/app/assets/javascripts/vue_shared/components/tooltip_on_truncate.vue
+++ b/app/assets/javascripts/vue_shared/components/tooltip_on_truncate.vue
@@ -1,11 +1,11 @@
<script>
+import { GlTooltipDirective as GlTooltip } from '@gitlab/ui';
import { isFunction } from 'lodash';
import { hasHorizontalOverflow } from '~/lib/utils/dom_utils';
-import tooltip from '../directives/tooltip';
export default {
directives: {
- tooltip,
+ GlTooltip,
},
props: {
title: {
@@ -59,9 +59,8 @@ export default {
<template>
<span
v-if="showTooltip"
- v-tooltip
+ v-gl-tooltip="{ placement }"
:title="title"
- :data-placement="placement"
class="js-show-tooltip gl-min-w-0"
>
<slot></slot>
diff --git a/app/assets/javascripts/vue_shared/components/upload_dropzone/upload_dropzone.vue b/app/assets/javascripts/vue_shared/components/upload_dropzone/upload_dropzone.vue
index 5a08e992084..afb1ea702fa 100644
--- a/app/assets/javascripts/vue_shared/components/upload_dropzone/upload_dropzone.vue
+++ b/app/assets/javascripts/vue_shared/components/upload_dropzone/upload_dropzone.vue
@@ -36,6 +36,11 @@ export default {
required: false,
default: () => [VALID_IMAGE_FILE_MIMETYPE.mimetype],
},
+ singleFileSelection: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
},
data() {
return {
@@ -79,7 +84,7 @@ export default {
return;
}
- this.$emit('change', files);
+ this.$emit('change', this.singleFileSelection ? files[0] : files);
},
ondragenter(e) {
this.dragCounter += 1;
@@ -92,7 +97,7 @@ export default {
this.$refs.fileUpload.click();
},
onFileInputChange(e) {
- this.$emit('change', e.target.files);
+ this.$emit('change', this.singleFileSelection ? e.target.files[0] : e.target.files);
},
},
};
@@ -119,9 +124,15 @@ export default {
data-testid="dropzone-area"
>
<gl-icon name="upload" :size="iconStyles.size" :class="iconStyles.class" />
- <p class="gl-mb-0">
+ <p class="gl-mb-0" data-testid="upload-text">
<slot name="upload-text" :openFileUpload="openFileUpload">
- <gl-sprintf :message="__('Drop or %{linkStart}upload%{linkEnd} files to attach')">
+ <gl-sprintf
+ :message="
+ singleFileSelection
+ ? __('Drop or %{linkStart}upload%{linkEnd} file to attach')
+ : __('Drop or %{linkStart}upload%{linkEnd} files to attach')
+ "
+ >
<template #link="{ content }">
<gl-link @click.stop="openFileUpload">
{{ content }}
@@ -139,7 +150,7 @@ export default {
name="upload_file"
:accept="validFileMimetypes"
class="hide"
- multiple
+ :multiple="!singleFileSelection"
@change="onFileInputChange"
/>
</slot>
diff --git a/app/assets/javascripts/vue_shared/components/user_access_role_badge.vue b/app/assets/javascripts/vue_shared/components/user_access_role_badge.vue
new file mode 100644
index 00000000000..e5558c038b3
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/user_access_role_badge.vue
@@ -0,0 +1,22 @@
+<script>
+/**
+ * This component applies particular styling to GlBadge that isn't
+ * available in the current GlBadge variants.
+ * Where possible, prefer one of the supported GlBadge variants.
+ * Discussion issue: https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1247
+ */
+import { GlBadge } from '@gitlab/ui';
+
+export default {
+ name: 'UserAccessRoleBadge',
+ components: {
+ GlBadge,
+ },
+};
+</script>
+
+<template>
+ <gl-badge class="gl-bg-transparent! gl-inset-border-1-gray-100!">
+ <slot></slot>
+ </gl-badge>
+</template>
diff --git a/app/assets/javascripts/vue_shared/directives/tooltip.js b/app/assets/javascripts/vue_shared/directives/tooltip.js
deleted file mode 100644
index 0eb505bfce8..00000000000
--- a/app/assets/javascripts/vue_shared/directives/tooltip.js
+++ /dev/null
@@ -1,35 +0,0 @@
-import $ from 'jquery';
-import '~/commons/bootstrap';
-import { parseBoolean } from '~/lib/utils/common_utils';
-
-export default {
- bind(el) {
- const glTooltipDelay = localStorage.getItem('gl-tooltip-delay');
- const delay = glTooltipDelay ? JSON.parse(glTooltipDelay) : 0;
-
- $(el).tooltip({
- trigger: 'hover',
- delay,
- // By default, sanitize is run even if there is no `html` or `template` present
- // so let's optimize to only run this when necessary.
- // https://github.com/twbs/bootstrap/blob/c5966de27395a407f9a3d20d0eb2ff8e8fb7b564/js/src/tooltip.js#L716
- sanitize: parseBoolean(el.dataset.html) || Boolean(el.dataset.template),
- });
- },
-
- componentUpdated(el) {
- $(el).tooltip('_fixTitle');
-
- // update visible tooltips
- const tooltipInstance = $(el).data('bs.tooltip');
- const tip = tooltipInstance.getTipElement();
- tooltipInstance.setElementContent(
- $(tip.querySelectorAll('.tooltip-inner')),
- tooltipInstance.getTitle(),
- );
- },
-
- unbind(el) {
- $(el).tooltip('dispose');
- },
-};
diff --git a/app/assets/javascripts/vue_shared/gl_feature_flags_plugin.js b/app/assets/javascripts/vue_shared/gl_feature_flags_plugin.js
index e1734809bce..c12ffaac40a 100644
--- a/app/assets/javascripts/vue_shared/gl_feature_flags_plugin.js
+++ b/app/assets/javascripts/vue_shared/gl_feature_flags_plugin.js
@@ -1,7 +1,12 @@
export default (Vue) => {
Vue.mixin({
provide: {
- glFeatures: { ...((window.gon && window.gon.features) || {}) },
+ glFeatures:
+ {
+ ...window.gon?.features,
+ // TODO: extract into glLicensedFeatures https://gitlab.com/gitlab-org/gitlab/-/issues/322460
+ ...window.gon?.licensed_features,
+ } || {},
},
});
};
diff --git a/app/assets/javascripts/vue_shared/security_reports/components/help_icon.vue b/app/assets/javascripts/vue_shared/security_reports/components/help_icon.vue
index 3c606283c7d..26bc9b5d60e 100644
--- a/app/assets/javascripts/vue_shared/security_reports/components/help_icon.vue
+++ b/app/assets/javascripts/vue_shared/security_reports/components/help_icon.vue
@@ -34,7 +34,7 @@ export default {
<span v-if="discoverProjectSecurityPath">
<gl-button
ref="discoverProjectSecurity"
- icon="information-o"
+ icon="question-o"
category="tertiary"
:aria-label="$options.i18n.upgradeToManageVulnerabilities"
/>
diff --git a/app/assets/javascripts/vue_shared/security_reports/constants.js b/app/assets/javascripts/vue_shared/security_reports/constants.js
index aac5a5c1def..1cdcf87097f 100644
--- a/app/assets/javascripts/vue_shared/security_reports/constants.js
+++ b/app/assets/javascripts/vue_shared/security_reports/constants.js
@@ -18,11 +18,12 @@ export const REPORT_FILE_TYPES = {
*/
export const REPORT_TYPE_SAST = 'sast';
export const REPORT_TYPE_DAST = 'dast';
+export const REPORT_TYPE_DAST_PROFILES = 'dast_profiles';
export const REPORT_TYPE_SECRET_DETECTION = 'secret_detection';
export const REPORT_TYPE_DEPENDENCY_SCANNING = 'dependency_scanning';
export const REPORT_TYPE_CONTAINER_SCANNING = 'container_scanning';
export const REPORT_TYPE_COVERAGE_FUZZING = 'coverage_fuzzing';
-export const REPORT_TYPE_LICENSE_COMPLIANCE = 'license_compliance';
+export const REPORT_TYPE_LICENSE_COMPLIANCE = 'license_scanning';
export const REPORT_TYPE_API_FUZZING = 'api_fuzzing';
/**
diff --git a/app/assets/stylesheets/_page_specific_files.scss b/app/assets/stylesheets/_page_specific_files.scss
index 20ff78d32d3..4a15e0eb458 100644
--- a/app/assets/stylesheets/_page_specific_files.scss
+++ b/app/assets/stylesheets/_page_specific_files.scss
@@ -14,7 +14,6 @@
@import './pages/issues';
@import './pages/labels';
@import './pages/login';
-@import './pages/members';
@import './pages/merge_requests';
@import './pages/monitor';
@import './pages/note_form';
@@ -35,5 +34,4 @@
@import './pages/sherlock';
@import './pages/storage_quota';
@import './pages/tree';
-@import './pages/trials';
@import './pages/users';
diff --git a/app/assets/stylesheets/bootstrap_migration.scss b/app/assets/stylesheets/bootstrap_migration.scss
index deeef86c386..a5cfc8d12b0 100644
--- a/app/assets/stylesheets/bootstrap_migration.scss
+++ b/app/assets/stylesheets/bootstrap_migration.scss
@@ -170,12 +170,6 @@ table {
display: none;
}
-h3.popover-header {
- // Default bootstrap popovers use <h3>
- // which we default to having a top margin
- margin-top: 0;
-}
-
// Add to .label so that old system notes that are saved to the db
// will still receive the correct styling
.badge:not(.gl-badge),
@@ -198,7 +192,15 @@ h3.popover-header {
}
.divider {
- @extend .dropdown-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 {
@@ -231,12 +233,9 @@ h3.popover-header {
}
.card {
- &.card-without-border {
- @extend .border-0;
- }
-
+ &.card-without-border,
&.bg-light {
- @extend .border-0;
+ border: 0 !important;
}
}
diff --git a/app/assets/stylesheets/components/avatar.scss b/app/assets/stylesheets/components/avatar.scss
index 3c8abe43070..c8f69bfdbaf 100644
--- a/app/assets/stylesheets/components/avatar.scss
+++ b/app/assets/stylesheets/components/avatar.scss
@@ -70,7 +70,8 @@ $avatar-sizes: (
$identicon-backgrounds: $identicon-red, $identicon-purple, $identicon-indigo, $identicon-blue, $identicon-teal,
$identicon-orange, $identicon-gray;
-%avatar-circle {
+.avatar,
+.avatar-container {
float: left;
margin-right: $gl-padding;
border-radius: $avatar-radius;
@@ -84,7 +85,6 @@ $identicon-backgrounds: $identicon-red, $identicon-purple, $identicon-indigo, $i
}
.avatar {
- @extend %avatar-circle;
transition-property: none;
width: 40px;
@@ -151,7 +151,6 @@ $identicon-backgrounds: $identicon-red, $identicon-purple, $identicon-indigo, $i
}
.avatar-container {
- @extend %avatar-circle;
overflow: hidden;
display: flex;
diff --git a/app/assets/stylesheets/components/milestone_combobox.scss b/app/assets/stylesheets/components/milestone_combobox.scss
index f73ec4d5998..5d1709c22ec 100644
--- a/app/assets/stylesheets/components/milestone_combobox.scss
+++ b/app/assets/stylesheets/components/milestone_combobox.scss
@@ -1,8 +1,14 @@
-.selected-item {
- /* stylelint-disable-next-line function-url-quotes */
- background: url(asset_path('checkmark.png')) no-repeat 0 2px;
-}
+.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-item-space {
- padding: 8px 12px;
+ .dropdown-menu.show {
+ overflow: hidden;
+ }
}
diff --git a/app/assets/stylesheets/components/ref_selector.scss b/app/assets/stylesheets/components/ref_selector.scss
index 970a7b967ee..ded911c2492 100644
--- a/app/assets/stylesheets/components/ref_selector.scss
+++ b/app/assets/stylesheets/components/ref_selector.scss
@@ -1,17 +1,13 @@
.ref-selector {
- & &-dropdown-content {
- // Setting a max height is necessary to allow the dropdown's content
- // to control where and how scrollbars appear.
- // This content is limited to the max-height of the dropdown
- // ($dropdown-max-height-lg) minus the additional padding
- // on the top and bottom (2 * $gl-padding-8)
- max-height: $dropdown-max-height-lg - 2 * $gl-padding-8;
- }
-
.dropdown-menu.show {
// Make the dropdown a little wider and longer than usual
// since it contains quite a bit of content.
+ overflow: hidden;
width: 20rem;
- max-height: $dropdown-max-height-lg;
+
+ &,
+ .gl-new-dropdown-inner {
+ max-height: $dropdown-max-height-lg;
+ }
}
}
diff --git a/app/assets/stylesheets/disable_animations.scss b/app/assets/stylesheets/disable_animations.scss
index 799c6e80ec9..1e63cdcfa39 100644
--- a/app/assets/stylesheets/disable_animations.scss
+++ b/app/assets/stylesheets/disable_animations.scss
@@ -12,9 +12,3 @@
animation: none !important;
/* stylelint-enable property-no-vendor-prefix */
}
-
-// Disable sticky changes bar for tests
-.diff-files-changed {
- position: relative !important;
- top: 0 !important;
-}
diff --git a/app/assets/stylesheets/framework.scss b/app/assets/stylesheets/framework.scss
index 7931f4deea0..1fe94a796f5 100644
--- a/app/assets/stylesheets/framework.scss
+++ b/app/assets/stylesheets/framework.scss
@@ -42,7 +42,6 @@
@import 'framework/notes';
@import 'framework/tabs';
@import 'framework/timeline';
-@import 'framework/tooltips';
@import 'framework/toggle';
@import 'framework/typography';
@import 'framework/zen';
diff --git a/app/assets/stylesheets/framework/awards.scss b/app/assets/stylesheets/framework/awards.scss
index a7623b65539..662f7f52d61 100644
--- a/app/assets/stylesheets/framework/awards.scss
+++ b/app/assets/stylesheets/framework/awards.scss
@@ -274,7 +274,9 @@
// `position:absolute`
&::after {
content: '\a0';
+ display: block !important;
width: 1em;
+ color: transparent;
}
.reaction-control-icon {
diff --git a/app/assets/stylesheets/framework/buttons.scss b/app/assets/stylesheets/framework/buttons.scss
index b51fec925cb..d1fa1187703 100644
--- a/app/assets/stylesheets/framework/buttons.scss
+++ b/app/assets/stylesheets/framework/buttons.scss
@@ -196,10 +196,6 @@
@include btn-orange;
}
- &.btn-close {
- @include btn-outline($white, $orange-500, $orange-500, $orange-50, $orange-600, $orange-600, $orange-100, $orange-700, $orange-700);
- }
-
&.btn-danger {
@include btn-red;
}
@@ -216,6 +212,7 @@
color: $gray-700;
}
+ // deprecated class
&.btn-text-field {
width: 100%;
text-align: left;
@@ -436,32 +433,27 @@
}
// All disabled buttons, regardless of color, type, etc
-%disabled {
- background-color: $gray-light;
- border-color: $gray-100;
- color: $gl-text-color-disabled;
- opacity: 1;
- text-decoration: none;
- cursor: default;
-
- &.cursor-not-allowed {
- cursor: not-allowed;
- }
-
- i {
- color: $gl-text-color-disabled;
- }
-}
-
.btn.disabled,
.btn[disabled],
fieldset[disabled] .btn,
.dropdown-toggle[disabled],
[disabled].dropdown-menu-toggle {
- @extend %disabled;
-
+ &,
&:hover {
- @extend %disabled;
+ background-color: $gray-light;
+ border-color: $gray-100;
+ color: $gl-text-color-disabled;
+ opacity: 1;
+ text-decoration: none;
+ cursor: default;
+
+ &.cursor-not-allowed {
+ cursor: not-allowed;
+ }
+
+ i {
+ color: $gl-text-color-disabled;
+ }
}
&.btn-link {
diff --git a/app/assets/stylesheets/framework/diffs.scss b/app/assets/stylesheets/framework/diffs.scss
index e30caeb1dfb..bd15022eadf 100644
--- a/app/assets/stylesheets/framework/diffs.scss
+++ b/app/assets/stylesheets/framework/diffs.scss
@@ -1035,7 +1035,6 @@ table.code {
auto;
// Retina cursor
- // scss-lint:disable DuplicateProperty
cursor: image-set(image-url('illustrations/image_comment_light_cursor.svg') 1x,
image-url('illustrations/image_comment_light_cursor@2x.svg') 2x) $image-comment-cursor-left-offset $image-comment-cursor-top-offset,
auto;
diff --git a/app/assets/stylesheets/framework/dropdowns.scss b/app/assets/stylesheets/framework/dropdowns.scss
index f56d8f2c2a9..bdde6c7b313 100644
--- a/app/assets/stylesheets/framework/dropdowns.scss
+++ b/app/assets/stylesheets/framework/dropdowns.scss
@@ -34,7 +34,14 @@
overflow-y: auto;
&.dropdown-extended-height {
- max-height: 400px;
+ $extended-max-height: 400px;
+
+ max-height: $extended-max-height;
+
+ // See comment below for explanation
+ .gl-new-dropdown-inner {
+ max-height: $extended-max-height - 2px;
+ }
}
@include media-breakpoint-down(xs) {
@@ -46,6 +53,15 @@
overflow-y: initial;
max-height: initial;
}
+
+ // `GlDropdown` specifies the `max-height` of `.gl-new-dropdown-inner`
+ // as `$dropdown-max-height`, but the `max-height` rule above forces
+ // the parent `.dropdown-menu` to be _slightly_ too small because of
+ // the 1px borders. The workaround below overrides the @gitlab/ui style
+ // to avoid a double scroll bar.
+ .gl-new-dropdown-inner {
+ max-height: $dropdown-max-height - 2px;
+ }
}
.dropdown-toggle,
@@ -1093,3 +1109,11 @@ header.header-content .dropdown-menu.frequent-items-dropdown-menu {
width: $gl-dropdown-width-wide;
}
}
+
+// This class won't be needed once we can add a prop for this in the GitLab UI component
+// https://gitlab.com/gitlab-org/gitlab-ui/-/issues/966
+.gl-new-dropdown.gl-dropdown-menu-full-width {
+ .dropdown-menu {
+ width: 100%;
+ }
+}
diff --git a/app/assets/stylesheets/framework/editor-lite.scss b/app/assets/stylesheets/framework/editor-lite.scss
index c3b287a6c3d..eda3e33a6aa 100644
--- a/app/assets/stylesheets/framework/editor-lite.scss
+++ b/app/assets/stylesheets/framework/editor-lite.scss
@@ -3,6 +3,11 @@
@include gl-display-flex;
@include gl-justify-content-center;
@include gl-align-items-center;
+ @include gl-z-index-0;
+
+ > * {
+ filter: blur(5px);
+ }
&::before {
content: '';
diff --git a/app/assets/stylesheets/framework/emojis.scss b/app/assets/stylesheets/framework/emojis.scss
index 13c5541da92..c5c660c1014 100644
--- a/app/assets/stylesheets/framework/emojis.scss
+++ b/app/assets/stylesheets/framework/emojis.scss
@@ -16,3 +16,26 @@ gl-emoji {
vertical-align: baseline;
}
}
+
+.emoji-picker-category-header {
+ @include gl-sticky;
+ background-color: $white-transparent;
+}
+
+.emoji-picker-emoji {
+ height: 30px;
+ // Create a width that fits 9 emojis per row
+ width: 100 / 9 * 1%;
+}
+
+.emoji-picker .gl-new-dropdown .dropdown-menu {
+ width: 350px;
+}
+
+.emoji-picker-category-tab {
+ border-bottom-color: transparent;
+}
+
+.emoji-picker .gl-new-dropdown-inner > :last-child {
+ padding-bottom: 0;
+}
diff --git a/app/assets/stylesheets/framework/filters.scss b/app/assets/stylesheets/framework/filters.scss
index 07d59847829..a4af45a467c 100644
--- a/app/assets/stylesheets/framework/filters.scss
+++ b/app/assets/stylesheets/framework/filters.scss
@@ -265,6 +265,7 @@
flex: 1;
position: relative;
min-width: 0;
+ height: 2rem;
background-color: $input-bg;
}
@@ -453,7 +454,7 @@
.search-token-target-branch {
.value {
font-family: $monospace-font;
- font-size: 13px;
+ font-size: $gl-font-size-monospace;
}
}
diff --git a/app/assets/stylesheets/framework/forms.scss b/app/assets/stylesheets/framework/forms.scss
index 6e47fef02d5..c366bf80093 100644
--- a/app/assets/stylesheets/framework/forms.scss
+++ b/app/assets/stylesheets/framework/forms.scss
@@ -35,7 +35,8 @@ label {
margin: 0;
}
- &.form-check-label {
+ &.form-check-label,
+ &.custom-control-label {
font-weight: $gl-font-weight-normal;
}
diff --git a/app/assets/stylesheets/framework/layout.scss b/app/assets/stylesheets/framework/layout.scss
index cac3695e1a1..4f9896dd58a 100644
--- a/app/assets/stylesheets/framework/layout.scss
+++ b/app/assets/stylesheets/framework/layout.scss
@@ -8,9 +8,8 @@ html {
body {
// Improves readability for dyslexic users; supported only in Chrome/Safari so far
- // scss-lint:disable PropertySpelling
text-decoration-skip: ink;
- // scss-lint:enable PropertySpelling
+
&.navless {
background-color: $white !important;
}
diff --git a/app/assets/stylesheets/framework/lists.scss b/app/assets/stylesheets/framework/lists.scss
index b0334da6943..df2ba718c72 100644
--- a/app/assets/stylesheets/framework/lists.scss
+++ b/app/assets/stylesheets/framework/lists.scss
@@ -192,11 +192,6 @@ ul.content-list {
display: flex;
align-items: center;
white-space: nowrap;
-
- // Override style that allows the flex-row text to wrap.
- &.allow-wrap {
- white-space: normal;
- }
}
.row-main-content {
@@ -283,12 +278,6 @@ ul.indent-list {
to { transform: rotate(360deg); }
}
-.namespace-title {
- .tooltip-inner {
- max-width: 350px;
- }
-}
-
.horizontal-list {
padding-left: 0;
list-style: none;
diff --git a/app/assets/stylesheets/framework/mixins.scss b/app/assets/stylesheets/framework/mixins.scss
index e29e204b14f..1e2fc1445e8 100644
--- a/app/assets/stylesheets/framework/mixins.scss
+++ b/app/assets/stylesheets/framework/mixins.scss
@@ -433,7 +433,6 @@
@mixin middle-dot-divider {
&::after {
// Duplicate `content` property used as a fallback
- // scss-lint:disable DuplicateProperty
content: '\00B7'; // middle dot fallback if browser does not support alternative content
content: '\00B7' / ''; // tell screen readers to ignore the content https://www.w3.org/TR/css-content-3/#accessibility
padding: 0 0.375rem;
diff --git a/app/assets/stylesheets/framework/modal.scss b/app/assets/stylesheets/framework/modal.scss
index 2dbeacb0f8c..ec433434573 100644
--- a/app/assets/stylesheets/framework/modal.scss
+++ b/app/assets/stylesheets/framework/modal.scss
@@ -130,22 +130,6 @@ body.modal-open {
.issues-import-modal,
.issuable-export-modal {
- .modal-header {
- justify-content: flex-start;
-
- .import-export-svg-container {
- flex-grow: 1;
- height: 56px;
- padding: $gl-btn-padding $gl-btn-padding 0;
- text-align: right;
-
- .illustration {
- height: inherit;
- width: initial;
- }
- }
- }
-
.modal-body {
padding: 0;
diff --git a/app/assets/stylesheets/framework/tooltips.scss b/app/assets/stylesheets/framework/tooltips.scss
deleted file mode 100644
index edc2fb532c8..00000000000
--- a/app/assets/stylesheets/framework/tooltips.scss
+++ /dev/null
@@ -1,6 +0,0 @@
-.tooltip-inner {
- font-size: $gl-font-size-small;
- border-radius: $border-radius-default;
- line-height: $gl-line-height;
- font-weight: $gl-font-weight-normal;
-}
diff --git a/app/assets/stylesheets/framework/typography.scss b/app/assets/stylesheets/framework/typography.scss
index 496e2aba421..5624a6ea8a3 100644
--- a/app/assets/stylesheets/framework/typography.scss
+++ b/app/assets/stylesheets/framework/typography.scss
@@ -78,7 +78,9 @@
code {
font-family: $monospace-font;
white-space: pre-wrap;
- word-wrap: normal;
+ // Safari
+ word-wrap: break-word;
+ overflow-wrap: break-word;
word-break: keep-all;
}
@@ -344,6 +346,9 @@
// Multi-line code blocks should scroll horizontally
code {
white-space: pre;
+ // Safari
+ word-wrap: normal;
+ overflow-wrap: normal;
}
&.plain-readme {
@@ -430,8 +435,7 @@
}
}
- a[href*='/uploads/'],
- a[href*='storage.googleapis.com/google-code-attachments/'] {
+ a.with-attachment-icon {
&::before {
margin-right: 4px;
@@ -441,6 +445,11 @@
-webkit-font-smoothing: antialiased;
content: '📎';
}
+ }
+
+ a[href*='/uploads/'],
+ a[href*='storage.googleapis.com/google-code-attachments/'] {
+ @extend .with-attachment-icon;
&.no-attachment-icon {
&::before {
@@ -604,7 +613,7 @@ pre {
display: block;
padding: $gl-padding-8 $input-horizontal-padding;
margin: 0 0 $gl-padding-8;
- font-size: 13px;
+ font-size: $gl-font-size-monospace;
word-break: break-all;
word-wrap: break-word;
color: $gl-text-color;
@@ -646,7 +655,7 @@ code {
*/
textarea.js-gfm-input {
font-family: $monospace-font;
- font-size: 13px;
+ font-size: $gl-font-size-monospace;
}
.strikethrough {
@@ -699,13 +708,11 @@ textarea {
opacity: 1; // FF defaults to 0.54
}
- // scss-lint:disable PseudoElement
// support Edge vendor prefix
&::-ms-input-placeholder {
color: $gl-text-color-tertiary;
}
- // scss-lint:disable PseudoElement
// support IE vendor prefix
&:-ms-input-placeholder {
color: $gl-text-color-tertiary;
diff --git a/app/assets/stylesheets/framework/variables.scss b/app/assets/stylesheets/framework/variables.scss
index 4bf9236407f..1aa4177c902 100644
--- a/app/assets/stylesheets/framework/variables.scss
+++ b/app/assets/stylesheets/framework/variables.scss
@@ -443,7 +443,7 @@ $gl-avatar-size: 40px;
$border-radius-default: 4px;
$border-radius-small: 2px;
$border-radius-large: 8px;
-$default-icon-size: 18px;
+$default-icon-size: 16px;
$layout-link-gray: #7e7c7c;
$btn-side-margin: 10px;
$btn-sm-side-margin: 7px;
@@ -830,8 +830,8 @@ $ci-variable-remove-button-width: calc(1em + #{2 * $gl-padding});
/*
GitLab Plans
*/
-$gl-gold-plan: #d4af37;
-$gl-silver-plan: #91a1ab;
+$gl-ultimate-plan: #d4af37;
+$gl-premium-plan: #91a1ab;
$gl-bronze-plan: #cd7f32;
/*
diff --git a/app/assets/stylesheets/highlight/conflict_colors.scss b/app/assets/stylesheets/highlight/conflict_colors.scss
index 98ca3775b72..910dc6f4ad6 100644
--- a/app/assets/stylesheets/highlight/conflict_colors.scss
+++ b/app/assets/stylesheets/highlight/conflict_colors.scss
@@ -1,5 +1,4 @@
// Disabled to use the color map for creating color schemes
-// scss-lint:disable ColorVariable
$conflict-colors: (
white-header-head-neutral : #e1fad7,
white-line-head-neutral : #effdec,
@@ -116,4 +115,3 @@ $conflict-colors: (
none_line_not_chosen : $gray-light
);
-// scss-lint:enable ColorVariable
diff --git a/app/assets/stylesheets/highlight/themes/dark.scss b/app/assets/stylesheets/highlight/themes/dark.scss
index 64387fbce09..0dc01213606 100644
--- a/app/assets/stylesheets/highlight/themes/dark.scss
+++ b/app/assets/stylesheets/highlight/themes/dark.scss
@@ -38,7 +38,7 @@ $dark-cp: #969896;
$dark-c1: #969896;
$dark-cs: #969896;
$dark-gd: #c66;
-$dark-gh: #c5c8c6;
+$dark-gh: #8abeb7;
$dark-gi: #b5bd68;
$dark-gp: #969896;
$dark-gu: #8abeb7;
diff --git a/app/assets/stylesheets/highlight/themes/monokai.scss b/app/assets/stylesheets/highlight/themes/monokai.scss
index 119908ffba8..95c3e8e9103 100644
--- a/app/assets/stylesheets/highlight/themes/monokai.scss
+++ b/app/assets/stylesheets/highlight/themes/monokai.scss
@@ -87,6 +87,7 @@ $monokai-il: #ae81ff;
$monokai-gu: #75715e;
$monokai-gd: #f92672;
$monokai-gi: #a6e22e;
+$monokai-gh: #75715e;
.code.monokai {
// Line numbers
@@ -281,4 +282,5 @@ $monokai-gi: #a6e22e;
.gu { color: $monokai-gu; } /* Generic.Subheading & Diff Unified/Comment? */
.gd { color: $monokai-gd; } /* Generic.Deleted & Diff Deleted */
.gi { color: $monokai-gi; } /* Generic.Inserted & Diff Inserted */
+ .gh { color: $monokai-gh; } /* Generic.Heading */
}
diff --git a/app/assets/stylesheets/highlight/white_base.scss b/app/assets/stylesheets/highlight/white_base.scss
index 777332881f3..128fe0cc046 100644
--- a/app/assets/stylesheets/highlight/white_base.scss
+++ b/app/assets/stylesheets/highlight/white_base.scss
@@ -24,7 +24,7 @@ $white-gd-bg: #fdd;
$white-gd-x: $black;
$white-gd-x-bg: #faa;
$white-gr: #a00;
-$white-gh: #999;
+$white-gh: #800080;
$white-gi: $black;
$white-gi-bg: #dfd;
$white-gi-x: $black;
@@ -280,7 +280,9 @@ span.highlight_word {
.ge { font-style: italic; }
.gr { color: $white-gr; }
-.gh { color: $white-gh; }
+
+.gh { color: $white-gh;
+ font-weight: $gl-font-weight-bold; }
.gi {
color: $white-gi;
diff --git a/app/assets/stylesheets/lazy_bundles/select2_overrides.scss b/app/assets/stylesheets/lazy_bundles/select2_overrides.scss
index b148cc8f0e7..0d40159f6de 100644
--- a/app/assets/stylesheets/lazy_bundles/select2_overrides.scss
+++ b/app/assets/stylesheets/lazy_bundles/select2_overrides.scss
@@ -339,3 +339,19 @@
display: inline;
}
}
+
+.gl-select2-html5-required-fix {
+ .select2-container {
+ + .select2 {
+ @include gl-opacity-0;
+ @include gl-border-0;
+ @include gl-bg-none;
+ @include gl-bg-transparent;
+ display: block !important;
+ width: 1px;
+ height: 1px;
+ z-index: -1;
+ margin: -3px auto 0;
+ }
+ }
+}
diff --git a/app/assets/stylesheets/mailer_client_specific.scss b/app/assets/stylesheets/mailer_client_specific.scss
index 41bedecf90f..0547aa7752f 100644
--- a/app/assets/stylesheets/mailer_client_specific.scss
+++ b/app/assets/stylesheets/mailer_client_specific.scss
@@ -3,7 +3,6 @@
// These are client-specific rules, ignore some linting rules
//
// stylelint-disable property-no-vendor-prefix, property-no-unknown, length-zero-no-unit
-// scss-lint:disable PropertySpelling, ZeroUnit
body,
table,
diff --git a/app/assets/stylesheets/mailers/highlighted_diff_email.scss b/app/assets/stylesheets/mailers/highlighted_diff_email.scss
index d8bb021e1f5..75c2428c1d4 100644
--- a/app/assets/stylesheets/mailers/highlighted_diff_email.scss
+++ b/app/assets/stylesheets/mailers/highlighted_diff_email.scss
@@ -27,7 +27,7 @@ $highlighted-gd-bg: #fdd;
$highlighted-gd-x: #000;
$highlighted-gd-x-bg: #faa;
$highlighted-gr: #a00;
-$highlighted-gh: #999;
+$highlighted-gh: #800080;
$highlighted-gi: #000;
$highlighted-gi-bg: #dfd;
$highlighted-gi-x: #000;
@@ -185,7 +185,9 @@ span.highlight_word {
.ge { font-style: italic; }
.gr { color: $highlighted-gr; }
-.gh { color: $highlighted-gh; }
+
+.gh { color: $highlighted-gh;
+ font-weight: $gl-font-weight-bold; }
.gi {
color: $highlighted-gi;
diff --git a/app/assets/stylesheets/page_bundles/boards.scss b/app/assets/stylesheets/page_bundles/boards.scss
index 620b37914d8..fdf9e157e1e 100644
--- a/app/assets/stylesheets/page_bundles/boards.scss
+++ b/app/assets/stylesheets/page_bundles/boards.scss
@@ -30,12 +30,21 @@
color: var(--gray-500, $gray-500);
}
+[data-page$='epic_boards:index'],
+[data-page$='epic_boards:show'],
.issue-boards-page {
.content-wrapper {
padding-bottom: 0;
}
}
+[data-page$='epic_boards:index'],
+[data-page$='epic_boards:show'] {
+ .filter-form {
+ display: none;
+ }
+}
+
.boards-app {
@include media-breakpoint-up(sm) {
transition: width $sidebar-transition-duration;
@@ -515,7 +524,7 @@
}
}
-.board-issue-path.js-show-tooltip {
+.board-item-path.js-show-tooltip {
cursor: help;
}
diff --git a/app/assets/stylesheets/page_bundles/build.scss b/app/assets/stylesheets/page_bundles/build.scss
index 3962c546b51..34f88f9405a 100644
--- a/app/assets/stylesheets/page_bundles/build.scss
+++ b/app/assets/stylesheets/page_bundles/build.scss
@@ -140,23 +140,6 @@
width: 289px;
}
- .block {
- width: 100%;
- word-break: break-word;
-
- &:last-child {
- border-bottom: 1px solid $border-gray-normal;
- }
-
- &.coverage {
- padding: 0 16px 11px;
- }
- }
-
- .block-last {
- padding: 16px 0;
- }
-
.trigger-variables-btn-container {
justify-content: space-between;
align-items: center;
@@ -198,18 +181,6 @@
margin-left: 2px;
}
- .retry-link {
- display: block;
-
- .btn-inverted-secondary {
- color: $blue-500;
-
- &:hover {
- color: $white;
- }
- }
- }
-
.stage-item {
cursor: pointer;
diff --git a/app/assets/stylesheets/page_bundles/cycle_analytics.scss b/app/assets/stylesheets/page_bundles/cycle_analytics.scss
index 4a48333cd27..2742c95c6e1 100644
--- a/app/assets/stylesheets/page_bundles/cycle_analytics.scss
+++ b/app/assets/stylesheets/page_bundles/cycle_analytics.scss
@@ -1,6 +1,5 @@
@import 'mixins_and_variables_and_functions';
-#cycle-analytics,
.cycle-analytics {
margin: 24px auto 0;
position: relative;
@@ -316,35 +315,4 @@
}
}
}
-
- .empty-stage,
- .no-access-stage {
- text-align: center;
- width: 75%;
- margin: 0 auto;
- padding-top: 130px;
- color: var(--gray-500, $gray-500);
-
- h4 {
- color: var(--gl-text-color, $gl-text-color);
- }
- }
-
- .empty-stage {
- .icon-no-data {
- height: 36px;
- width: 78px;
- display: inline-block;
- margin-bottom: 20px;
- }
- }
-
- .no-access-stage {
- .icon-lock {
- height: 36px;
- width: 78px;
- display: inline-block;
- margin-bottom: 20px;
- }
- }
}
diff --git a/app/assets/stylesheets/page_bundles/ide.scss b/app/assets/stylesheets/page_bundles/ide.scss
index 7c4d51ab677..009019a45d9 100644
--- a/app/assets/stylesheets/page_bundles/ide.scss
+++ b/app/assets/stylesheets/page_bundles/ide.scss
@@ -1043,8 +1043,7 @@ $ide-commit-header-height: 48px;
.input-icon {
right: auto;
left: 10px;
- top: 50%;
- transform: translateY(-50%);
+ top: 1rem;
}
}
diff --git a/app/assets/stylesheets/page_bundles/ide_themes/_solarized-light.scss b/app/assets/stylesheets/page_bundles/ide_themes/_solarized-light.scss
index 315a0ae6202..26d55dfe2d0 100644
--- a/app/assets/stylesheets/page_bundles/ide_themes/_solarized-light.scss
+++ b/app/assets/stylesheets/page_bundles/ide_themes/_solarized-light.scss
@@ -2,14 +2,14 @@
// Please see `app/assets/stylesheets/page_bundles/ide_themes/README.md` for a guide on contributing new themes
// -------
.ide.theme-solarized-light {
- --ide-border-color: #dfd7bf;
+ --ide-border-color: #ded7c1;
--ide-border-color-alt: #dfd7bf;
--ide-highlight-accent: #5c4e21;
--ide-text-color: #616161;
--ide-text-color-secondary: #526f76;
- --ide-background: #efe8d3;
- --ide-background-hover: #ded6be;
- --ide-highlight-background: #fef6e1;
+ --ide-background: #ddd6c1;
+ --ide-background-hover: #d3cbb7;
+ --ide-highlight-background: #eee8d5;
--ide-link-color: #955800;
--ide-footer-background: #efe8d3;
--ide-empty-state-background: #fef6e1;
diff --git a/app/assets/stylesheets/page_bundles/import.scss b/app/assets/stylesheets/page_bundles/import.scss
index 453b810196b..525481638f3 100644
--- a/app/assets/stylesheets/page_bundles/import.scss
+++ b/app/assets/stylesheets/page_bundles/import.scss
@@ -1,5 +1,12 @@
@import 'mixins_and_variables_and_functions';
+// Fixing double scrollbar issue
+// See https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1156 and
+// https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54837
+.import-entities-namespace-dropdown.show.dropdown .dropdown-menu {
+ max-height: initial;
+}
+
.import-jobs-to-col {
width: 39%;
}
diff --git a/app/assets/stylesheets/page_bundles/jira_connect.scss b/app/assets/stylesheets/page_bundles/jira_connect.scss
index 25401a161da..eb2dd6e578e 100644
--- a/app/assets/stylesheets/page_bundles/jira_connect.scss
+++ b/app/assets/stylesheets/page_bundles/jira_connect.scss
@@ -20,36 +20,23 @@
@import '@gitlab/ui/src/components/base/tooltip/tooltip';
$atlaskit-border-color: #dfe1e6;
+$header-height: 40px;
-.ac-content {
- margin: 20px;
-
- .subscription-form {
- margin-bottom: 20px;
-
- .field-group-input {
- display: flex;
- padding-top: $gl-padding-4;
+.subscription-form {
+ .field-group-input {
+ display: flex;
+ padding-top: $gl-padding-4;
- .ak-button {
- align-items: center;
- height: auto;
- margin-left: $btn-margin-5;
- }
+ .ak-button {
+ align-items: center;
+ height: auto;
+ margin-left: $btn-margin-5;
}
}
}
-$header-height: 40px;
-
.jira-connect-header {
- border-bottom: 1px solid $gray-100;
- display: flex;
- align-items: center;
- justify-content: center;
min-height: $header-height;
- padding-left: 16px;
- padding-right: 16px;
position: fixed;
top: 0;
left: 0;
@@ -57,7 +44,6 @@ $header-height: 40px;
}
.jira-connect-user {
- font-size: $gl-font-size;
position: fixed;
top: 10px;
right: 20px;
@@ -65,20 +51,17 @@ $header-height: 40px;
.jira-connect-app {
margin-top: $header-height;
+ height: calc(100% - #{$header-height});
+ max-width: 1000px;
+}
+
+.jira-connect-app-body {
max-width: 600px;
- min-height: 95vh;
- padding-top: 48px;
- padding-left: 16px;
- padding-right: 16px;
margin-left: auto;
margin-right: auto;
- text-align: center;
-}
-
-.gl-mt-5 {
- margin-top: 16px;
}
+// for external_link buttons
svg {
fill: currentColor;
@@ -115,12 +98,3 @@ svg {
}
}
}
-
-.empty-subscriptions {
- color: $gray-900;
-}
-
-.browser-limitations-notice {
- font-size: $gl-font-size;
- margin-top: 32px;
-}
diff --git a/app/assets/stylesheets/page_bundles/learn_gitlab.scss b/app/assets/stylesheets/page_bundles/learn_gitlab.scss
new file mode 100644
index 00000000000..189aefb330b
--- /dev/null
+++ b/app/assets/stylesheets/page_bundles/learn_gitlab.scss
@@ -0,0 +1,3 @@
+.learn-gitlab-info-card-content {
+ height: 200px;
+}
diff --git a/app/assets/stylesheets/page_bundles/members.scss b/app/assets/stylesheets/page_bundles/members.scss
new file mode 100644
index 00000000000..7b4c74b8253
--- /dev/null
+++ b/app/assets/stylesheets/page_bundles/members.scss
@@ -0,0 +1,255 @@
+@import 'mixins_and_variables_and_functions';
+
+.project-members-title {
+ padding-bottom: 10px;
+ border-bottom: 1px solid $border-color;
+}
+
+.invite-users-form {
+ .btn-success {
+ margin-right: 10px;
+ }
+}
+
+.member {
+ &.is-overridden {
+ .btn-ldap-override {
+ display: none !important;
+ }
+ }
+
+ .controls {
+ @include media-breakpoint-up(sm) {
+ display: flex;
+ }
+
+ .dropdown-menu.dropdown-menu-right {
+ margin-top: -2px;
+ }
+ }
+
+ .form-group {
+ margin-bottom: 0;
+ }
+
+ &.existing-title {
+ @include media-breakpoint-up(sm) {
+ float: left;
+ }
+ }
+}
+
+.member-form-control {
+ @include media-breakpoint-down(xs) {
+ margin-right: 0;
+ width: auto;
+ }
+}
+
+.member-search-btn {
+ position: absolute;
+ right: 4px;
+ top: 0;
+ height: $input-height;
+ padding-left: 10px;
+ padding-right: 10px;
+ color: $gray-darkest;
+ background: transparent;
+ border: 0;
+ outline: 0;
+}
+
+.members-ldap {
+ align-self: center;
+}
+
+.alert-member-ldap {
+ background-color: $orange-50;
+
+ @include media-breakpoint-up(sm) {
+ line-height: 40px;
+ }
+
+ > p {
+ float: left;
+ margin-bottom: 10px;
+ color: $orange-600;
+
+ @include media-breakpoint-up(sm) {
+ padding-left: 55px;
+ margin-bottom: 0;
+ }
+ }
+
+ .controls {
+ width: 100%;
+
+ @include media-breakpoint-up(sm) {
+ width: auto;
+ }
+ }
+}
+
+.btn-ldap-override {
+ width: 100%;
+
+ @include media-breakpoint-up(sm) {
+ margin-left: 10px;
+ width: auto;
+ }
+}
+
+.flex-project-members-panel {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: center;
+
+ @include media-breakpoint-down(sm) {
+ display: block;
+
+ .flex-project-title {
+ vertical-align: top;
+ display: inline-block;
+ max-width: 90%;
+ }
+ }
+
+ .flex-project-title {
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ }
+
+ .badge.badge-pill {
+ height: 17px;
+ line-height: 16px;
+ margin-right: 5px;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ }
+
+ .flex-users-form {
+ flex-wrap: nowrap;
+ white-space: nowrap;
+ margin-left: auto;
+ }
+}
+
+.card {
+ .card-header {
+ .badge.badge-pill {
+ margin-top: 0;
+ }
+
+ @include media-breakpoint-down(sm) {
+ .badge.badge-pill {
+ margin-right: 0;
+ margin-left: 0;
+ }
+ }
+ }
+}
+
+.content-list.members-list li {
+ .list-item-name {
+ float: none;
+ display: flex;
+ flex: 1;
+ }
+
+ .user-info {
+ padding-right: 10px;
+ }
+
+ .member {
+ font-weight: $gl-font-weight-bold;
+ overflow-wrap: break-word;
+ word-break: break-all;
+ }
+
+ .form-control {
+ width: inherit;
+ }
+
+ .btn {
+ align-self: flex-start;
+ }
+
+ @include media-breakpoint-down(sm) {
+ .member-access-text {
+ margin: 0 0 $gl-padding-4 ($grid-size * 6);
+ }
+ }
+
+ @include media-breakpoint-down(xs) {
+ display: block;
+
+ .controls > .btn,
+ .controls .member-form-control {
+ margin: 0 0 $gl-padding-8;
+ display: block;
+ }
+
+ .form-control {
+ width: 100%;
+ }
+ }
+}
+
+
+.members-table {
+ @include media-breakpoint-up(lg) {
+ .col-meta {
+ width: px-to-rem(150px);
+ }
+
+ .col-max-role {
+ width: px-to-rem(175px);
+ }
+
+ .col-expiration {
+ width: px-to-rem(200px);
+ }
+
+ .col-actions {
+ width: px-to-rem(65px);
+ }
+ }
+
+ .gl-datepicker-input {
+ width: px-to-rem(165px);
+ max-width: 100%;
+ }
+}
+
+.card-mobile {
+ .content-list.members-list li {
+ display: block;
+
+ .member-controls {
+ float: none;
+ display: block;
+ }
+
+ .dropdown-menu-toggle,
+ .dropdown-menu,
+ .form-control,
+ .list-item-name {
+ width: 100%;
+ }
+
+ .dropdown-menu {
+ margin-top: 0;
+ }
+
+ .member-form-control {
+ margin: 5px 0;
+ }
+
+ .btn {
+ width: 100%;
+ margin-left: 0;
+ }
+ }
+}
diff --git a/app/assets/stylesheets/page_bundles/oncall_schedules.scss b/app/assets/stylesheets/page_bundles/oncall_schedules.scss
index a6668f00147..5eaf91c3017 100644
--- a/app/assets/stylesheets/page_bundles/oncall_schedules.scss
+++ b/app/assets/stylesheets/page_bundles/oncall_schedules.scss
@@ -182,10 +182,3 @@ $column-right-gradient: linear-gradient(to right, $gradient-dark-gray 0%, $gradi
transform: translateX(-50%);
}
}
-
-.gl-token {
- .gl-avatar-labeled-label {
- @include gl-text-white;
- @include gl-font-weight-normal;
- }
-}
diff --git a/app/assets/stylesheets/page_bundles/pipelines.scss b/app/assets/stylesheets/page_bundles/pipelines.scss
index ae36f7e3ac1..6ef7f912ea9 100644
--- a/app/assets/stylesheets/page_bundles/pipelines.scss
+++ b/app/assets/stylesheets/page_bundles/pipelines.scss
@@ -67,8 +67,7 @@
// Mini Pipelines
.stage-cell {
- .mini-pipeline-graph-dropdown-toggle,
- .mini-pipeline-graph-gl-dropdown-toggle {
+ .mini-pipeline-graph-dropdown-toggle {
svg {
height: $ci-action-icon-size;
width: $ci-action-icon-size;
@@ -138,14 +137,16 @@
}
}
-// Dropdown button in mini pipeline graph
+// Commit mini pipeline (HAML)
button.mini-pipeline-graph-dropdown-toggle,
-// As the `mini-pipeline-item` mixin specificity is lower
-// than the toggle of dropdown with 'variant="link"' we add
-// classes ".gl-button.btn-link" to make it more specific.
-// Once FF ci_mini_pipeline_gl_dropdown is removed, the `mini-pipeline-item`
-// itself could increase its specificity to simplify this selector
-button.gl-button.btn-link.mini-pipeline-graph-gl-dropdown-toggle {
+// GlDropdown mini pipeline (Vue)
+// As the `mini-pipeline-item` mixin specificity is lower
+// than the toggle of dropdown with 'variant="link"' we add
+// classes ".gl-button.btn-link" to make it more specific
+// and avoid having the size overriden
+//
+// See https://gitlab.com/gitlab-org/gitlab/-/issues/320737
+button.gl-button.btn-link.mini-pipeline-graph-dropdown-toggle {
@include mini-pipeline-item();
}
diff --git a/app/assets/stylesheets/page_bundles/reports.scss b/app/assets/stylesheets/page_bundles/reports.scss
index 18ca5f9a3a9..ce91988cb8a 100644
--- a/app/assets/stylesheets/page_bundles/reports.scss
+++ b/app/assets/stylesheets/page_bundles/reports.scss
@@ -5,11 +5,6 @@
max-height: 170px;
overflow: auto;
}
-
- .report-block-list-issue-parent {
- padding: $gl-padding-top $gl-padding;
- border-top: 1px solid var(--border-color, $border-color);
- }
}
.report-block-container {
diff --git a/app/assets/stylesheets/page_bundles/signup.scss b/app/assets/stylesheets/page_bundles/signup.scss
index a207c10b04f..d6c3a3ff5da 100644
--- a/app/assets/stylesheets/page_bundles/signup.scss
+++ b/app/assets/stylesheets/page_bundles/signup.scss
@@ -32,11 +32,6 @@
@include media-breakpoint-down(md) {
width: 100%;
}
-
- img {
- width: $default-icon-size;
- height: $default-icon-size;
- }
}
.decline-page {
diff --git a/app/assets/stylesheets/pages/clusters.scss b/app/assets/stylesheets/pages/clusters.scss
index f7b8a4c5b84..98074f8af29 100644
--- a/app/assets/stylesheets/pages/clusters.scss
+++ b/app/assets/stylesheets/pages/clusters.scss
@@ -105,6 +105,7 @@
border: 0;
&.table-row-header {
+ // stylelint-disable-next-line
background-color: none;
border: 0;
font-weight: bold;
diff --git a/app/assets/stylesheets/pages/groups.scss b/app/assets/stylesheets/pages/groups.scss
index 87307fd682e..ee1385d36df 100644
--- a/app/assets/stylesheets/pages/groups.scss
+++ b/app/assets/stylesheets/pages/groups.scss
@@ -519,10 +519,6 @@ table.pipeline-project-metrics tr td {
margin-left: 25px;
}
- .item-visibility {
- margin-right: 0;
- }
-
.last-updated {
position: relative;
min-width: 250px;
diff --git a/app/assets/stylesheets/pages/login.scss b/app/assets/stylesheets/pages/login.scss
index 019d827798c..2d04354a99d 100644
--- a/app/assets/stylesheets/pages/login.scss
+++ b/app/assets/stylesheets/pages/login.scss
@@ -106,17 +106,6 @@
width: 100%;
}
}
-
- .omniauth-btn {
- width: 100%;
- padding: $gl-padding-8;
-
- img {
- width: $default-icon-size;
- height: $default-icon-size;
- margin-right: $gl-padding;
- }
- }
}
.new-session-tabs {
diff --git a/app/assets/stylesheets/pages/members.scss b/app/assets/stylesheets/pages/members.scss
deleted file mode 100644
index 0ccde57746a..00000000000
--- a/app/assets/stylesheets/pages/members.scss
+++ /dev/null
@@ -1,253 +0,0 @@
-.project-members-title {
- padding-bottom: 10px;
- border-bottom: 1px solid $border-color;
-}
-
-.invite-users-form {
- .btn-success {
- margin-right: 10px;
- }
-}
-
-.member {
- &.is-overridden {
- .btn-ldap-override {
- display: none !important;
- }
- }
-
- .controls {
- @include media-breakpoint-up(sm) {
- display: flex;
- }
-
- .dropdown-menu.dropdown-menu-right {
- margin-top: -2px;
- }
- }
-
- .form-group {
- margin-bottom: 0;
- }
-
- &.existing-title {
- @include media-breakpoint-up(sm) {
- float: left;
- }
- }
-}
-
-.member-form-control {
- @include media-breakpoint-down(xs) {
- margin-right: 0;
- width: auto;
- }
-}
-
-.member-search-btn {
- position: absolute;
- right: 4px;
- top: 0;
- height: $input-height;
- padding-left: 10px;
- padding-right: 10px;
- color: $gray-darkest;
- background: transparent;
- border: 0;
- outline: 0;
-}
-
-.members-ldap {
- align-self: center;
-}
-
-.alert-member-ldap {
- background-color: $orange-50;
-
- @include media-breakpoint-up(sm) {
- line-height: 40px;
- }
-
- > p {
- float: left;
- margin-bottom: 10px;
- color: $orange-600;
-
- @include media-breakpoint-up(sm) {
- padding-left: 55px;
- margin-bottom: 0;
- }
- }
-
- .controls {
- width: 100%;
-
- @include media-breakpoint-up(sm) {
- width: auto;
- }
- }
-}
-
-.btn-ldap-override {
- width: 100%;
-
- @include media-breakpoint-up(sm) {
- margin-left: 10px;
- width: auto;
- }
-}
-
-.flex-project-members-panel {
- display: flex;
- flex-direction: row;
- align-items: center;
- justify-content: center;
-
- @include media-breakpoint-down(sm) {
- display: block;
-
- .flex-project-title {
- vertical-align: top;
- display: inline-block;
- max-width: 90%;
- }
- }
-
- .flex-project-title {
- overflow: hidden;
- white-space: nowrap;
- text-overflow: ellipsis;
- }
-
- .badge.badge-pill {
- height: 17px;
- line-height: 16px;
- margin-right: 5px;
- padding-top: 1px;
- padding-bottom: 1px;
- }
-
- .flex-users-form {
- flex-wrap: nowrap;
- white-space: nowrap;
- margin-left: auto;
- }
-}
-
-.card {
- .card-header {
- .badge.badge-pill {
- margin-top: 0;
- }
-
- @include media-breakpoint-down(sm) {
- .badge.badge-pill {
- margin-right: 0;
- margin-left: 0;
- }
- }
- }
-}
-
-.content-list.members-list li {
- .list-item-name {
- float: none;
- display: flex;
- flex: 1;
- }
-
- .user-info {
- padding-right: 10px;
- }
-
- .member {
- font-weight: $gl-font-weight-bold;
- overflow-wrap: break-word;
- word-break: break-all;
- }
-
- .form-control {
- width: inherit;
- }
-
- .btn {
- align-self: flex-start;
- }
-
- @include media-breakpoint-down(sm) {
- .member-access-text {
- margin: 0 0 $gl-padding-4 ($grid-size * 6);
- }
- }
-
- @include media-breakpoint-down(xs) {
- display: block;
-
- .controls > .btn,
- .controls .member-form-control {
- margin: 0 0 $gl-padding-8;
- display: block;
- }
-
- .form-control {
- width: 100%;
- }
- }
-}
-
-
-.members-table {
- @include media-breakpoint-up(lg) {
- .col-meta {
- width: px-to-rem(150px);
- }
-
- .col-max-role {
- width: px-to-rem(175px);
- }
-
- .col-expiration {
- width: px-to-rem(200px);
- }
-
- .col-actions {
- width: px-to-rem(65px);
- }
- }
-
- .gl-datepicker-input {
- width: px-to-rem(165px);
- max-width: 100%;
- }
-}
-
-.card-mobile {
- .content-list.members-list li {
- display: block;
-
- .member-controls {
- float: none;
- display: block;
- }
-
- .dropdown-menu-toggle,
- .dropdown-menu,
- .form-control,
- .list-item-name {
- width: 100%;
- }
-
- .dropdown-menu {
- margin-top: 0;
- }
-
- .member-form-control {
- margin: 5px 0;
- }
-
- .btn {
- width: 100%;
- margin-left: 0;
- }
- }
-}
diff --git a/app/assets/stylesheets/pages/merge_requests.scss b/app/assets/stylesheets/pages/merge_requests.scss
index a62df1258af..23e368a2e73 100644
--- a/app/assets/stylesheets/pages/merge_requests.scss
+++ b/app/assets/stylesheets/pages/merge_requests.scss
@@ -4,6 +4,7 @@
*/
$mr-widget-min-height: 69px;
+$tabs-holder-z-index: 250;
.space-children {
@include clearfix;
@@ -225,10 +226,6 @@ $mr-widget-min-height: 69px;
}
}
- .mini-pipeline-graph-dropdown-toggle {
- vertical-align: top;
- }
-
.normal {
flex: 1;
flex-basis: auto;
@@ -675,7 +672,7 @@ $mr-widget-min-height: 69px;
.mr-version-controls {
position: relative;
- z-index: 203;
+ z-index: $tabs-holder-z-index + 10;
background: $white;
color: $gl-text-color;
margin-top: -1px;
@@ -745,7 +742,7 @@ $mr-widget-min-height: 69px;
.merge-request-tabs-holder,
.epic-tabs-holder {
top: $header-height;
- z-index: 250;
+ z-index: $tabs-holder-z-index;
background-color: $body-bg;
border-bottom: 1px solid $border-color;
@@ -981,15 +978,15 @@ $mr-widget-min-height: 69px;
line-height: initial;
}
- .mini-pipeline-graph-dropdown-toggle,
- .stage-cell .mini-pipeline-graph-dropdown-toggle svg,
- // As the `mini-pipeline-item` mixin specificity is lower
- // than the toggle of dropdown with 'variant="link"' we add
- // classes ".gl-button.btn-link" to make it more specific.
- // Once FF ci_mini_pipeline_gl_dropdown is removed, the `mini-pipeline-item`
- // itself could increase its specificity to simplify this selector
- button.gl-button.btn-link.mini-pipeline-graph-gl-dropdown-toggle,
- .stage-cell button.gl-button.btn-link.mini-pipeline-graph-gl-dropdown-toggle svg {
+ // GlDropdown mini pipeline (Vue)
+ // As the `mini-pipeline-item` mixin specificity is lower
+ // than the toggle of dropdown with 'variant="link"' we add
+ // classes ".gl-button.btn-link" to make it more specific
+ // and avoid having the size overriden
+ //
+ // See https://gitlab.com/gitlab-org/gitlab/-/issues/320737
+ button.gl-button.btn-link.mini-pipeline-graph-dropdown-toggle,
+ .stage-cell button.gl-button.btn-link.mini-pipeline-graph-dropdown-toggle svg {
height: $ci-action-icon-size-lg;
width: $ci-action-icon-size-lg;
}
diff --git a/app/assets/stylesheets/pages/note_form.scss b/app/assets/stylesheets/pages/note_form.scss
index ffbfa47f9bd..cb5050fc578 100644
--- a/app/assets/stylesheets/pages/note_form.scss
+++ b/app/assets/stylesheets/pages/note_form.scss
@@ -302,8 +302,21 @@ table {
width: 100%;
}
}
+}
+
+.discussion-reply-holder {
+ .reply-placeholder-text-field {
+ font-family: $monospace-font;
+ font-size: $gl-font-size-monospace;
+ border-radius: $gl-border-radius-base;
+ width: 100%;
+ resize: none;
+ padding: $gl-padding-8 $gl-padding-12;
+ line-height: 1;
+ border: 1px solid $border-color;
+ background-color: $white;
+ overflow: hidden;
- .btn-text-field {
@include media-breakpoint-down(xs) {
margin-bottom: $gl-padding-8;
}
@@ -381,32 +394,6 @@ table {
}
.comment-type-dropdown {
- .btn-success {
- width: auto;
- }
-
- .dropdown-toggle {
- float: right;
-
- i {
- color: $white;
- padding-right: 2px;
- margin-top: 2px;
- }
-
- &[disabled] {
- i {
- color: $gl-text-color-disabled;
- }
- }
- }
-
- .dropdown-menu {
- top: initial;
- bottom: 100%;
- width: 298px;
- }
-
@include media-breakpoint-down(xs) {
display: flex;
width: 100%;
diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss
index 8251cdb9bbb..e51cc0b4479 100644
--- a/app/assets/stylesheets/pages/projects.scss
+++ b/app/assets/stylesheets/pages/projects.scss
@@ -136,33 +136,9 @@
.project-repo-buttons {
.btn {
- &:last-child {
- margin-left: 0;
- }
-
svg {
- fill: $layout-link-gray;
+ fill: $gray-500;
}
-
- .notifications-icon {
- top: 1px;
- margin-right: 0;
- }
- }
-
- .icon {
- top: 0;
- }
-
- .count-badge,
- .btn-xs {
- height: 24px;
- }
-
- .home-panel-action-button,
- .project-action-button {
- margin: $gl-padding $gl-padding-8 0 0;
- vertical-align: top;
}
.notification-dropdown .dropdown-menu {
@@ -175,34 +151,6 @@
}
}
- .count-buttons {
- display: inline-block;
- vertical-align: top;
- margin-top: $gl-padding;
-
- .count-badge-count,
- .count-badge-button {
- border: 1px solid $border-color;
- line-height: 1;
- }
-
- .count,
- .count-badge-button {
- color: $gl-text-color;
- }
-
- .count-badge-count {
- padding: 0 12px;
- background: $gray-light;
- border-radius: 0 $border-radius-base $border-radius-base 0;
- }
-
- .count-badge-button {
- border-right: 0;
- border-radius: $border-radius-base 0 0 $border-radius-base;
- }
- }
-
.project-clone-holder {
display: inline-block;
margin: $gl-padding 0 0;
@@ -313,7 +261,6 @@
}
.fork-thumbnail {
- height: 200px;
width: calc((100% / 2) - #{$gl-padding * 2});
@include media-breakpoint-up(md) {
@@ -887,10 +834,6 @@ pre.light-well {
}
.git-clone-holder {
- .btn-clipboard {
- border: 1px solid $border-color;
- }
-
.clone-options {
display: table-cell;
@@ -1008,6 +951,18 @@ pre.light-well {
}
}
+.compare-revision-cards {
+ @media (min-width: $breakpoint-lg) {
+ .gl-card {
+ width: calc(50% - 15px);
+ }
+
+ .compare-ellipsis {
+ width: 30px;
+ }
+ }
+}
+
.clearable-input {
position: relative;
diff --git a/app/assets/stylesheets/pages/trials.scss b/app/assets/stylesheets/pages/trials.scss
deleted file mode 100644
index 55f323b7df7..00000000000
--- a/app/assets/stylesheets/pages/trials.scss
+++ /dev/null
@@ -1,15 +0,0 @@
-/*
-* A CSS cross-browser fix for Select2 failire to display HTML5 required warnings
-* MR link https://gitlab.com/gitlab-org/gitlab/-/merge_requests/22716
-*/
-.gl-select2-html5-required-fix div.select2-container+select.select2 {
- @include gl-opacity-0;
- @include gl-border-0;
- @include gl-bg-none;
- @include gl-bg-transparent;
- display: block !important;
- width: 1px;
- height: 1px;
- z-index: -1;
- margin: -3px auto 0;
-}
diff --git a/app/assets/stylesheets/startup/startup-signin.scss b/app/assets/stylesheets/startup/startup-signin.scss
index 4b88b94f3a6..6b78abdb5e0 100644
--- a/app/assets/stylesheets/startup/startup-signin.scss
+++ b/app/assets/stylesheets/startup/startup-signin.scss
@@ -2142,11 +2142,6 @@ table.code {
width: 100%;
padding: 8px;
}
-.login-page .omniauth-container .omniauth-btn img {
- width: 1.125rem;
- height: 1.125rem;
- margin-right: 16px;
-}
.login-page .new-session-tabs {
display: flex;
box-shadow: 0 0 0 1px #dbdbdb;
diff --git a/app/assets/stylesheets/test_environment.scss b/app/assets/stylesheets/test_environment.scss
new file mode 100644
index 00000000000..e9ba41f9bb7
--- /dev/null
+++ b/app/assets/stylesheets/test_environment.scss
@@ -0,0 +1,11 @@
+// Disable sticky changes bar for tests
+.diff-files-changed {
+ position: relative !important;
+ top: 0 !important;
+}
+
+// Un-hide inputs for @gitlab/ui custom checkboxes and radios so Capybara can target them
+.custom-control-input {
+ z-index: 500;
+ opacity: 1;
+}
diff --git a/app/assets/stylesheets/themes/theme_helper.scss b/app/assets/stylesheets/themes/theme_helper.scss
index 417377b514e..5b3e2ab4cd0 100644
--- a/app/assets/stylesheets/themes/theme_helper.scss
+++ b/app/assets/stylesheets/themes/theme_helper.scss
@@ -92,6 +92,7 @@
.notification-dot {
will-change: border-color, background-color;
+ // stylelint-disable-next-line
border-color: $nav-svg-color + 33;
}
@@ -204,6 +205,10 @@
}
}
+ .emoji-picker-category-active {
+ border-bottom-color: $active-tab-border;
+ }
+
.branch-header-title {
color: $border-and-box-shadow;
}
diff --git a/app/assets/stylesheets/themes/theme_light.scss b/app/assets/stylesheets/themes/theme_light.scss
index 58003db4236..17192a061e1 100644
--- a/app/assets/stylesheets/themes/theme_light.scss
+++ b/app/assets/stylesheets/themes/theme_light.scss
@@ -84,11 +84,11 @@ body {
&.gl-dark {
.logo-text svg {
- fill: $gl-text-color;
+ fill: var(--gl-text-color);
}
.navbar-gitlab {
- background-color: $gray-50;
+ background-color: var(--gray-50);
.navbar-sub-nav,
.navbar-nav {
@@ -97,8 +97,8 @@ body {
> a:focus,
> button:hover,
> button:focus {
- color: $gl-text-color;
- background-color: $gray-200;
+ color: var(--gl-text-color);
+ background-color: var(--gray-200);
}
}
@@ -106,21 +106,21 @@ body {
li.dropdown.show {
> a,
> button {
- color: $gl-text-color;
- background-color: $gray-200;
+ color: var(--gl-text-color);
+ background-color: var(--gray-200);
}
}
}
.search {
form {
- background-color: $gray-100;
- box-shadow: inset 0 0 0 1px $border-color;
+ background-color: var(--gray-100);
+ box-shadow: inset 0 0 0 1px var(--border-color);
&:active,
&:hover {
- background-color: $gray-100;
- box-shadow: inset 0 0 0 1px $blue-200;
+ background-color: var(--gray-100);
+ box-shadow: inset 0 0 0 1px var(--blue-200);
}
}
}
diff --git a/app/assets/stylesheets/utilities.scss b/app/assets/stylesheets/utilities.scss
index d424dcbf8f2..024162eba3e 100644
--- a/app/assets/stylesheets/utilities.scss
+++ b/app/assets/stylesheets/utilities.scss
@@ -117,6 +117,7 @@
flex-basis: 25%;
}
+// Will be moved to @gitlab/ui in https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1168
.gl-md-ml-3 {
@media (min-width: $breakpoint-md) {
margin-left: $gl-spacing-scale-3;
@@ -157,3 +158,17 @@
margin-bottom: $gl-spacing-scale-4 !important;
}
}
+
+// Will be moved to @gitlab/ui in https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1168
+.gl-sm-pr-3 {
+ @media (min-width: $breakpoint-sm) {
+ padding-right: $gl-spacing-scale-3;
+ }
+}
+
+// Will be moved to @gitlab/ui in https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1168
+.gl-sm-w-half {
+ @media (min-width: $breakpoint-sm) {
+ width: 50%;
+ }
+}
diff --git a/app/assets/stylesheets/vendors/atwho.scss b/app/assets/stylesheets/vendors/atwho.scss
index f31dbbeafe8..b92331facee 100644
--- a/app/assets/stylesheets/vendors/atwho.scss
+++ b/app/assets/stylesheets/vendors/atwho.scss
@@ -1,6 +1,7 @@
.atwho-view {
overflow-y: auto;
overflow-x: hidden;
+ max-width: calc(100% - 6px);
.name,
small.aliases,
@@ -80,10 +81,6 @@
}
@include media-breakpoint-down(xs) {
- .atwho-view-ul {
- width: 350px;
- }
-
.atwho-view ul li {
overflow: hidden;
text-overflow: ellipsis;
diff --git a/app/controllers/admin/application_settings_controller.rb b/app/controllers/admin/application_settings_controller.rb
index 7f7d38a09c5..7c6a444ce7a 100644
--- a/app/controllers/admin/application_settings_controller.rb
+++ b/app/controllers/admin/application_settings_controller.rb
@@ -237,7 +237,6 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController
[
*::ApplicationSettingsHelper.visible_attributes,
*::ApplicationSettingsHelper.external_authorization_service_attributes,
- *ApplicationSetting.repository_storages_weighted_attributes,
*ApplicationSetting.kroki_formats_attributes.keys.map { |key| "kroki_formats_#{key}".to_sym },
:lets_encrypt_notification_email,
:lets_encrypt_terms_of_service_accepted,
@@ -248,8 +247,8 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController
:default_branch_name,
disabled_oauth_sign_in_sources: [],
import_sources: [],
- repository_storages: [],
- restricted_visibility_levels: []
+ restricted_visibility_levels: [],
+ repository_storages_weighted: {}
]
end
diff --git a/app/controllers/admin/instance_statistics_controller.rb b/app/controllers/admin/instance_statistics_controller.rb
deleted file mode 100644
index 30891fcfe7c..00000000000
--- a/app/controllers/admin/instance_statistics_controller.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class Admin::InstanceStatisticsController < Admin::ApplicationController
- include Analytics::UniqueVisitsHelper
-
- before_action :check_feature_flag
-
- track_unique_visits :index, target_id: 'i_analytics_instance_statistics'
-
- feature_category :devops_reports
-
- def index
- end
-
- def check_feature_flag
- render_404 unless Feature.enabled?(:instance_statistics, default_enabled: true)
- end
-end
diff --git a/app/controllers/admin/usage_trends_controller.rb b/app/controllers/admin/usage_trends_controller.rb
new file mode 100644
index 00000000000..7073f71a1a8
--- /dev/null
+++ b/app/controllers/admin/usage_trends_controller.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+class Admin::UsageTrendsController < Admin::ApplicationController
+ include Analytics::UniqueVisitsHelper
+
+ track_unique_visits :index, target_id: 'i_analytics_instance_statistics'
+
+ feature_category :devops_reports
+
+ def index
+ end
+end
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 5f14d95ffed..379da90827a 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -29,7 +29,6 @@ class ApplicationController < ActionController::Base
before_action :validate_user_service_ticket!
before_action :check_password_expiration, if: :html_request?
before_action :ldap_security_check
- around_action :sentry_context
before_action :default_headers
before_action :default_cache_headers
before_action :add_gon_variables, if: :html_request?
@@ -171,7 +170,12 @@ class ApplicationController < ActionController::Base
end
def log_exception(exception)
- Gitlab::ErrorTracking.track_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
+ # set the context again
+ set_current_context do
+ Gitlab::ErrorTracking.track_exception(exception)
+ end
backtrace_cleaner = request.env["action_dispatch.backtrace_cleaner"]
application_trace = ActionDispatch::ExceptionWrapper.new(backtrace_cleaner, exception).application_trace
@@ -528,10 +532,6 @@ class ApplicationController < ActionController::Base
.execute
end
- def sentry_context(&block)
- Gitlab::ErrorTracking.with_context(current_user, &block)
- end
-
def allow_gitaly_ref_name_caching
::Gitlab::GitalyClient.allow_ref_name_caching do
yield
diff --git a/app/controllers/concerns/boards_responses.rb b/app/controllers/concerns/boards_responses.rb
index 6e6686f225c..7307b7b4f8f 100644
--- a/app/controllers/concerns/boards_responses.rb
+++ b/app/controllers/concerns/boards_responses.rb
@@ -35,7 +35,7 @@ module BoardsResponses
end
def authorize_read_list
- authorize_action_for!(board, :read_list)
+ authorize_action_for!(board, :read_issue_board_list)
end
def authorize_read_issue
@@ -54,7 +54,7 @@ module BoardsResponses
end
def authorize_admin_list
- authorize_action_for!(board, :admin_list)
+ authorize_action_for!(board, :admin_issue_board_list)
end
def authorize_action_for!(resource, ability)
diff --git a/app/controllers/concerns/check_rate_limit.rb b/app/controllers/concerns/check_rate_limit.rb
new file mode 100644
index 00000000000..c4de3315e22
--- /dev/null
+++ b/app/controllers/concerns/check_rate_limit.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+# == CheckRateLimit
+#
+# Controller concern that checks if the rate limit for a given action is throttled by calling the
+# Gitlab::ApplicationRateLimiter class. If the action is throttled for the current user, the request
+# will be logged and an error message will be rendered with a Too Many Requests response status.
+module CheckRateLimit
+ def check_rate_limit(key)
+ return unless rate_limiter.throttled?(key, scope: current_user, users_allowlist: rate_limit_users_allowlist)
+
+ rate_limiter.log_request(request, "#{key}_request_limit".to_sym, current_user)
+ render plain: _('This endpoint has been requested too many times. Try again later.'), status: :too_many_requests
+ end
+
+ def rate_limiter
+ ::Gitlab::ApplicationRateLimiter
+ end
+
+ def rate_limit_users_allowlist
+ Gitlab::CurrentSettings.current_application_settings.notes_create_limit_allowlist
+ end
+end
diff --git a/app/controllers/concerns/comment_and_close_flag.rb b/app/controllers/concerns/comment_and_close_flag.rb
deleted file mode 100644
index e2f3272abbc..00000000000
--- a/app/controllers/concerns/comment_and_close_flag.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-module CommentAndCloseFlag
- extend ActiveSupport::Concern
-
- included do
- before_action do
- push_frontend_feature_flag(:remove_comment_close_reopen, @group)
- end
- end
-end
diff --git a/app/controllers/concerns/multiple_boards_actions.rb b/app/controllers/concerns/multiple_boards_actions.rb
index 5206f5759d8..85bb73463db 100644
--- a/app/controllers/concerns/multiple_boards_actions.rb
+++ b/app/controllers/concerns/multiple_boards_actions.rb
@@ -80,7 +80,7 @@ module MultipleBoardsActions
end
def authorize_admin_board!
- return render_404 unless can?(current_user, :admin_board, parent)
+ return render_404 unless can?(current_user, :admin_issue_board, parent)
end
def serializer
diff --git a/app/controllers/concerns/notes_actions.rb b/app/controllers/concerns/notes_actions.rb
index 036d95622ef..2d8168af2e3 100644
--- a/app/controllers/concerns/notes_actions.rb
+++ b/app/controllers/concerns/notes_actions.rb
@@ -3,6 +3,7 @@
module NotesActions
include RendersNotes
include Gitlab::Utils::StrongMemoize
+ include CheckRateLimit
extend ActiveSupport::Concern
# last_fetched_at is an integer number of microseconds, which is the same
@@ -15,6 +16,7 @@ module NotesActions
before_action :require_noteable!, only: [:index, :create]
before_action :authorize_admin_note!, only: [:update, :destroy]
before_action :note_project, only: [:create]
+ before_action -> { check_rate_limit(:notes_create) }, only: [:create]
end
def index
@@ -31,9 +33,9 @@ module NotesActions
# We know there's more data, so tell the frontend to poll again after 1ms
set_polling_interval_header(interval: 1) if meta[:more]
- # We might still want to investigate further adjusting ETag caching with paginated notes, but
- # let's avoid ETag caching for now until we confirm the viability of paginated notes.
- ::Gitlab::EtagCaching::Middleware.skip!(response)
+ # Only present an ETag for the empty response to ensure pagination works
+ # as expected
+ ::Gitlab::EtagCaching::Middleware.skip!(response) if notes.present?
render json: meta.merge(notes: notes)
end
diff --git a/app/controllers/concerns/security_and_compliance_permissions.rb b/app/controllers/concerns/security_and_compliance_permissions.rb
new file mode 100644
index 00000000000..104f3638bb7
--- /dev/null
+++ b/app/controllers/concerns/security_and_compliance_permissions.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module SecurityAndCompliancePermissions
+ extend ActiveSupport::Concern
+
+ included do
+ before_action :ensure_security_and_compliance_enabled!
+ end
+
+ private
+
+ def ensure_security_and_compliance_enabled!
+ render_404 unless can?(current_user, :access_security_and_compliance, project)
+ end
+end
diff --git a/app/controllers/concerns/spammable_actions.rb b/app/controllers/concerns/spammable_actions.rb
index b285faee9bc..9e861d2859d 100644
--- a/app/controllers/concerns/spammable_actions.rb
+++ b/app/controllers/concerns/spammable_actions.rb
@@ -2,6 +2,7 @@
module SpammableActions
extend ActiveSupport::Concern
+ include Spam::Concerns::HasSpamActionResponseFields
included do
before_action :authorize_submit_spammable!, only: :mark_as_spam
@@ -25,14 +26,20 @@ module SpammableActions
respond_to do |format|
format.html do
+ # NOTE: format.html is still used by issue create, and uses the legacy HAML
+ # `_recaptcha_form.html.haml` rendered via the `projects/issues/verify` template.
render :verify
end
format.json do
- locals = { spammable: spammable, script: false, has_submit: false }
- recaptcha_html = render_to_string(partial: 'shared/recaptcha_form', formats: :html, locals: locals)
+ # format.json is used by all new Vue-based CAPTCHA implementations, which
+ # handle all of the CAPTCHA form rendering on the client via the Pajamas-based
+ # app/assets/javascripts/captcha/captcha_modal.vue
- render json: { recaptcha_html: recaptcha_html }
+ # NOTE: "409 - Conflict" seems to be the most appropriate HTTP status code for a response
+ # which requires a CAPTCHA to be solved in order for the request to be resubmitted.
+ # See https://stackoverflow.com/q/26547466/25192
+ render json: spam_action_response_fields(spammable), status: :conflict
end
end
else
@@ -58,7 +65,7 @@ module SpammableActions
# After this newer GraphQL/JS API process is fully supported by the backend, we can remove the
# check for the 'g-recaptcha-response' field and other HTML/HAML form-specific support.
- captcha_response = params['g-recaptcha-response']
+ captcha_response = params['g-recaptcha-response'] || params[:captcha_response]
{
request: request,
diff --git a/app/controllers/concerns/wiki_actions.rb b/app/controllers/concerns/wiki_actions.rb
index 4014e4f0024..60ff0a12d0c 100644
--- a/app/controllers/concerns/wiki_actions.rb
+++ b/app/controllers/concerns/wiki_actions.rb
@@ -112,10 +112,11 @@ module WikiActions
wiki_page_path(wiki, page)
)
else
+ @error = response.message
render 'shared/wikis/edit'
end
rescue WikiPage::PageChangedError, WikiPage::PageRenameError => e
- @error = e
+ @error = e.message
render 'shared/wikis/edit'
end
# rubocop:enable Gitlab/ModuleWithInstanceVariables
diff --git a/app/controllers/dashboard/todos_controller.rb b/app/controllers/dashboard/todos_controller.rb
index 0ae326b5d94..782c8c293fd 100644
--- a/app/controllers/dashboard/todos_controller.rb
+++ b/app/controllers/dashboard/todos_controller.rb
@@ -52,7 +52,7 @@ class Dashboard::TodosController < Dashboard::ApplicationController
end
def bulk_restore
- TodoService.new.restore_todos(current_user.todos.for_ids(params[:ids]), current_user)
+ TodoService.new.restore_todos(current_user.todos.id_in(params[:ids]), current_user)
render json: todos_counts
end
diff --git a/app/controllers/explore/projects_controller.rb b/app/controllers/explore/projects_controller.rb
index 1fd3cfd11f9..f6671f7250f 100644
--- a/app/controllers/explore/projects_controller.rb
+++ b/app/controllers/explore/projects_controller.rb
@@ -97,7 +97,7 @@ class Explore::ProjectsController < Explore::ApplicationController
end
def default_sort_order
- sort_value_name
+ sort_value_latest_activity
end
def sorting_field
diff --git a/app/controllers/graphql_controller.rb b/app/controllers/graphql_controller.rb
index 152f07b4c16..53064041ab8 100644
--- a/app/controllers/graphql_controller.rb
+++ b/app/controllers/graphql_controller.rb
@@ -4,6 +4,8 @@ class GraphqlController < ApplicationController
# Unauthenticated users have access to the API for public data
skip_before_action :authenticate_user!
+ WHITELIST_HEADER = 'HTTP_X_GITLAB_QUERY_WHITELIST_ISSUE'
+
# If a user is using their session to access GraphQL, we need to have session
# storage, since the admin-mode check is session wide.
# We can't enable this for anonymous users because that would cause users using
@@ -21,6 +23,7 @@ class GraphqlController < ApplicationController
before_action(only: [:execute]) { authenticate_sessionless_user!(:api) }
before_action :set_user_last_activity
before_action :track_vs_code_usage
+ before_action :whitelist_query!
# Since we deactivate authentication from the main ApplicationController and
# defer it to :authorize_access_api!, we need to override the bypass session
@@ -59,6 +62,14 @@ class GraphqlController < ApplicationController
private
+ # Tests may mark some queries as exempt from query limits
+ def whitelist_query!
+ whitelist_issue = request.headers[WHITELIST_HEADER]
+ return unless whitelist_issue
+
+ Gitlab::QueryLimiting.whitelist(whitelist_issue)
+ end
+
def set_user_last_activity
return unless current_user
@@ -66,7 +77,8 @@ class GraphqlController < ApplicationController
end
def track_vs_code_usage
- Gitlab::UsageDataCounters::VSCodeExtensionActivityUniqueCounter.track_api_request_when_trackable(user_agent: request.user_agent, user: current_user)
+ Gitlab::UsageDataCounters::VSCodeExtensionActivityUniqueCounter
+ .track_api_request_when_trackable(user_agent: request.user_agent, user: current_user)
end
def execute_multiplex
diff --git a/app/controllers/groups/boards_controller.rb b/app/controllers/groups/boards_controller.rb
index fa109021b7d..3354c0a5c9f 100644
--- a/app/controllers/groups/boards_controller.rb
+++ b/app/controllers/groups/boards_controller.rb
@@ -9,6 +9,7 @@ class Groups::BoardsController < Groups::ApplicationController
before_action :assign_endpoint_vars
before_action do
push_frontend_feature_flag(:graphql_board_lists, group, default_enabled: false)
+ push_frontend_feature_flag(:boards_filtered_search, group)
end
feature_category :boards
@@ -21,13 +22,13 @@ class Groups::BoardsController < Groups::ApplicationController
def boards_finder
strong_memoize :boards_finder do
- Boards::ListService.new(parent, current_user)
+ Boards::BoardsFinder.new(parent, current_user)
end
end
def board_finder
strong_memoize :board_finder do
- Boards::ListService.new(parent, current_user, board_id: params[:id])
+ Boards::BoardsFinder.new(parent, current_user, board_id: params[:id])
end
end
@@ -44,6 +45,6 @@ class Groups::BoardsController < Groups::ApplicationController
end
def authorize_read_board!
- access_denied! unless can?(current_user, :read_board, group)
+ access_denied! unless can?(current_user, :read_issue_board, group)
end
end
diff --git a/app/controllers/groups/dependency_proxy_for_containers_controller.rb b/app/controllers/groups/dependency_proxy_for_containers_controller.rb
index 0f640397320..e2c104f88a4 100644
--- a/app/controllers/groups/dependency_proxy_for_containers_controller.rb
+++ b/app/controllers/groups/dependency_proxy_for_containers_controller.rb
@@ -16,7 +16,18 @@ class Groups::DependencyProxyForContainersController < Groups::ApplicationContro
result = DependencyProxy::FindOrCreateManifestService.new(group, image, tag, token).execute
if result[:status] == :success
- send_upload(result[:manifest].file)
+ response.headers['Docker-Content-Digest'] = result[:manifest].digest
+ response.headers['Content-Length'] = result[:manifest].size
+ response.headers['Docker-Distribution-Api-Version'] = DependencyProxy::DISTRIBUTION_API_VERSION
+ response.headers['Etag'] = "\"#{result[:manifest].digest}\""
+ content_type = result[:manifest].content_type
+
+ send_upload(
+ result[:manifest].file,
+ proxy: true,
+ redirect_params: { query: { 'response-content-type' => content_type } },
+ send_params: { type: content_type }
+ )
else
render status: result[:http_status], json: result[:message]
end
diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb
index 9d7aebe4505..5de207857bb 100644
--- a/app/controllers/groups_controller.rb
+++ b/app/controllers/groups_controller.rb
@@ -30,7 +30,6 @@ class GroupsController < Groups::ApplicationController
before_action do
push_frontend_feature_flag(:vue_issuables_list, @group)
- push_frontend_feature_flag(:vue_notification_dropdown, @group, default_enabled: :yaml)
end
before_action do
diff --git a/app/controllers/help_controller.rb b/app/controllers/help_controller.rb
index e995562f0c4..06906001ef0 100644
--- a/app/controllers/help_controller.rb
+++ b/app/controllers/help_controller.rb
@@ -2,6 +2,7 @@
class HelpController < ApplicationController
skip_before_action :authenticate_user!, unless: :public_visibility_restricted?
+ skip_before_action :check_two_factor_requirement
feature_category :not_owned
layout 'help'
diff --git a/app/controllers/ide_controller.rb b/app/controllers/ide_controller.rb
index 8c0414ad5da..ea67c76a8bc 100644
--- a/app/controllers/ide_controller.rb
+++ b/app/controllers/ide_controller.rb
@@ -5,10 +5,12 @@ class IdeController < ApplicationController
include ClientsidePreviewCSP
include StaticObjectExternalStorageCSP
+ include Gitlab::Utils::StrongMemoize
before_action do
push_frontend_feature_flag(:build_service_proxy)
push_frontend_feature_flag(:schema_linting)
+ define_index_vars
end
feature_category :web_ide
@@ -16,4 +18,26 @@ class IdeController < ApplicationController
def index
Gitlab::UsageDataCounters::WebIdeCounter.increment_views_count
end
+
+ private
+
+ def define_index_vars
+ return unless project
+
+ @branch = params[:branch]
+ @path = params[:path]
+ @merge_request = params[:merge_request_id]
+
+ unless can?(current_user, :push_code, project)
+ @forked_project = ForkProjectsFinder.new(project, current_user: current_user).execute.first
+ end
+ end
+
+ def project
+ strong_memoize(:project) do
+ next unless params[:project_id].present?
+
+ Project.find_by_full_path(params[:project_id])
+ end
+ end
end
diff --git a/app/controllers/import/bulk_imports_controller.rb b/app/controllers/import/bulk_imports_controller.rb
index ef32ba4d119..48635c933af 100644
--- a/app/controllers/import/bulk_imports_controller.rb
+++ b/app/controllers/import/bulk_imports_controller.rb
@@ -37,8 +37,13 @@ class Import::BulkImportsController < ApplicationController
end
def create
- result = BulkImportService.new(current_user, create_params, credentials).execute
- render json: result.to_json(only: [:id])
+ response = BulkImportService.new(current_user, create_params, credentials).execute
+
+ if response.success?
+ render json: response.payload.to_json(only: [:id])
+ else
+ render json: { error: response.message }, status: response.http_status
+ end
end
def realtime_changes
@@ -128,7 +133,7 @@ class Import::BulkImportsController < ApplicationController
rescue Gitlab::UrlBlocker::BlockedUrlError => e
clear_session_data
- redirect_to new_group_path, alert: _('Specified URL cannot be used: "%{reason}"') % { reason: e.message }
+ redirect_to new_group_path(anchor: 'import-group-pane'), alert: _('Specified URL cannot be used: "%{reason}"') % { reason: e.message }
end
def allow_local_requests?
@@ -151,7 +156,7 @@ class Import::BulkImportsController < ApplicationController
}, status: :unprocessable_entity
end
format.html do
- redirect_to new_group_path
+ redirect_to new_group_path(anchor: 'import-group-pane')
end
end
end
diff --git a/app/controllers/import/gitlab_groups_controller.rb b/app/controllers/import/gitlab_groups_controller.rb
index f68b76a7b36..503b10f766b 100644
--- a/app/controllers/import/gitlab_groups_controller.rb
+++ b/app/controllers/import/gitlab_groups_controller.rb
@@ -10,7 +10,7 @@ class Import::GitlabGroupsController < ApplicationController
def create
unless file_is_valid?(group_params[:file])
- return redirect_back_or_default(options: { alert: s_('GroupImport|Unable to process group import file') })
+ return redirect_to new_group_path(anchor: 'import-group-pane'), alert: s_('GroupImport|Unable to process group import file')
end
group_data = group_params.except(:file).merge(
@@ -30,9 +30,8 @@ class Import::GitlabGroupsController < ApplicationController
redirect_to group_path(group), alert: _("Group import could not be scheduled")
end
else
- redirect_back_or_default(
- options: { alert: s_("GroupImport|Group could not be imported: %{errors}") % { errors: group.errors.full_messages.to_sentence } }
- )
+ redirect_to new_group_path(anchor: 'import-group-pane'),
+ alert: s_("GroupImport|Group could not be imported: %{errors}") % { errors: group.errors.full_messages.to_sentence }
end
end
diff --git a/app/controllers/jira_connect/subscriptions_controller.rb b/app/controllers/jira_connect/subscriptions_controller.rb
index 161280a05fc..3ff12f29f10 100644
--- a/app/controllers/jira_connect/subscriptions_controller.rb
+++ b/app/controllers/jira_connect/subscriptions_controller.rb
@@ -19,9 +19,6 @@ class JiraConnect::SubscriptionsController < JiraConnect::ApplicationController
before_action :allow_rendering_in_iframe, only: :index
before_action :verify_qsh_claim!, only: :index
before_action :authenticate_user!, only: :create
- before_action do
- push_frontend_feature_flag(:new_jira_connect_ui, type: :development, default_enabled: :yaml)
- end
def index
@subscriptions = current_jira_installation.subscriptions.preload_namespace_route
diff --git a/app/controllers/notification_settings_controller.rb b/app/controllers/notification_settings_controller.rb
deleted file mode 100644
index 7d8c035c852..00000000000
--- a/app/controllers/notification_settings_controller.rb
+++ /dev/null
@@ -1,61 +0,0 @@
-# frozen_string_literal: true
-
-class NotificationSettingsController < ApplicationController
- before_action :authenticate_user!
-
- feature_category :users
-
- def create
- return render_404 unless can_read?(resource)
-
- @notification_setting = current_user.notification_settings_for(resource)
- @saved = @notification_setting.update(notification_setting_params_for(resource))
-
- render_response
- end
-
- def update
- @notification_setting = current_user.notification_settings.find(params[:id])
- @saved = @notification_setting.update(notification_setting_params_for(@notification_setting.source))
-
- render_response
- end
-
- private
-
- def resource
- @resource ||=
- if params[:project_id].present?
- Project.find(params[:project_id])
- elsif params[:namespace_id].present?
- Group.find(params[:namespace_id])
- end
- end
-
- def can_read?(resource)
- ability_name = resource.class.name.downcase
- ability_name = "read_#{ability_name}".to_sym
-
- can?(current_user, ability_name, resource)
- end
-
- def render_response
- btn_class = nil
-
- if params[:hide_label].present?
- btn_class = 'btn-xs' if params[:project_id].present?
- response_template = 'shared/notifications/_new_button'
- else
- response_template = 'shared/notifications/_button'
- end
-
- render json: {
- html: view_to_html_string(response_template, notification_setting: @notification_setting, btn_class: btn_class),
- saved: @saved
- }
- end
-
- def notification_setting_params_for(source)
- params.require(:notification_setting).permit(NotificationSetting.allowed_fields(source))
- end
-end
diff --git a/app/controllers/profiles/personal_access_tokens_controller.rb b/app/controllers/profiles/personal_access_tokens_controller.rb
index a45205c5da7..251967a7dff 100644
--- a/app/controllers/profiles/personal_access_tokens_controller.rb
+++ b/app/controllers/profiles/personal_access_tokens_controller.rb
@@ -3,6 +3,10 @@
class Profiles::PersonalAccessTokensController < Profiles::ApplicationController
feature_category :authentication_and_authorization
+ before_action do
+ push_frontend_feature_flag(:personal_access_tokens_scoped_to_projects, current_user)
+ end
+
def index
set_index_vars
@personal_access_token = finder.build
diff --git a/app/controllers/profiles/preferences_controller.rb b/app/controllers/profiles/preferences_controller.rb
index add5046e213..45bab5f6cd1 100644
--- a/app/controllers/profiles/preferences_controller.rb
+++ b/app/controllers/profiles/preferences_controller.rb
@@ -49,7 +49,8 @@ class Profiles::PreferencesController < Profiles::ApplicationController
:tab_width,
:sourcegraph_enabled,
:gitpod_enabled,
- :render_whitespace_in_code
+ :render_whitespace_in_code,
+ :markdown_surround_selection
]
end
end
diff --git a/app/controllers/projects/blob_controller.rb b/app/controllers/projects/blob_controller.rb
index 3bb00978aac..0080ae1a5be 100644
--- a/app/controllers/projects/blob_controller.rb
+++ b/app/controllers/projects/blob_controller.rb
@@ -31,9 +31,7 @@ class Projects::BlobController < Projects::ApplicationController
before_action :editor_variables, except: [:show, :preview, :diff]
before_action :validate_diff_params, only: :diff
before_action :set_last_commit_sha, only: [:edit, :update]
- before_action only: :new do
- record_experiment_user(:ci_syntax_templates, namespace_id: @project.namespace_id) if params[:file_name] == @project.ci_config_path_or_default
- end
+ before_action :record_experiment, only: :new
track_redis_hll_event :create, :update, name: 'g_edit_by_sfe'
@@ -263,4 +261,10 @@ class Projects::BlobController < Projects::ApplicationController
def visitor_id
current_user&.id
end
+
+ def record_experiment
+ return unless params[:file_name] == @project.ci_config_path_or_default && @project.namespace.recent?
+
+ record_experiment_user(:ci_syntax_templates_b, namespace_id: @project.namespace_id)
+ end
end
diff --git a/app/controllers/projects/boards_controller.rb b/app/controllers/projects/boards_controller.rb
index d2e5d319f96..418f2ee1592 100644
--- a/app/controllers/projects/boards_controller.rb
+++ b/app/controllers/projects/boards_controller.rb
@@ -21,13 +21,13 @@ class Projects::BoardsController < Projects::ApplicationController
def boards_finder
strong_memoize :boards_finder do
- Boards::ListService.new(parent, current_user)
+ Boards::BoardsFinder.new(parent, current_user)
end
end
def board_finder
strong_memoize :board_finder do
- Boards::ListService.new(parent, current_user, board_id: params[:id])
+ Boards::BoardsFinder.new(parent, current_user, board_id: params[:id])
end
end
@@ -45,6 +45,6 @@ class Projects::BoardsController < Projects::ApplicationController
end
def authorize_read_board!
- access_denied! unless can?(current_user, :read_board, project)
+ access_denied! unless can?(current_user, :read_issue_board, project)
end
end
diff --git a/app/controllers/projects/ci/daily_build_group_report_results_controller.rb b/app/controllers/projects/ci/daily_build_group_report_results_controller.rb
index aabcb74cefa..fee216da492 100644
--- a/app/controllers/projects/ci/daily_build_group_report_results_controller.rb
+++ b/app/controllers/projects/ci/daily_build_group_report_results_controller.rb
@@ -1,11 +1,6 @@
# frozen_string_literal: true
class Projects::Ci::DailyBuildGroupReportResultsController < Projects::ApplicationController
- include Gitlab::Utils::StrongMemoize
-
- MAX_ITEMS = 1000
- REPORT_WINDOW = 90.days
-
before_action :authorize_read_build_report_results!
before_action :validate_param_type!
@@ -40,53 +35,23 @@ class Projects::Ci::DailyBuildGroupReportResultsController < Projects::Applicati
end
def report_results
- if ::Gitlab::Ci::Features.use_coverage_data_new_finder?(project)
- ::Ci::Testing::DailyBuildGroupReportResultsFinder.new(
- params: new_finder_params,
- current_user: current_user
- ).execute
- else
- Ci::DailyBuildGroupReportResultsFinder.new(**finder_params).execute
- end
+ ::Ci::DailyBuildGroupReportResultsFinder.new(
+ params: finder_params,
+ current_user: current_user
+ ).execute
end
- def new_finder_params
+ def finder_params
{
project: project,
coverage: true,
- start_date: start_date,
- end_date: end_date,
+ start_date: params[:start_date],
+ end_date: params[:end_date],
ref_path: params[:ref_path],
sort: true
}
end
- def finder_params
- {
- current_user: current_user,
- project: project,
- ref_path: params.require(:ref_path),
- start_date: start_date,
- end_date: end_date,
- limit: MAX_ITEMS
- }
- end
-
- def start_date
- strong_memoize(:start_date) do
- start_date = Date.parse(params.require(:start_date))
-
- # The start_date cannot be older than `end_date - 90 days`
- [start_date, end_date - REPORT_WINDOW].max
- end
- end
-
- def end_date
- strong_memoize(:end_date) do
- Date.parse(params.require(:end_date))
- end
- end
-
def allowed_param_types
Ci::DailyBuildGroupReportResult::PARAM_TYPES
end
diff --git a/app/controllers/projects/ci/pipeline_editor_controller.rb b/app/controllers/projects/ci/pipeline_editor_controller.rb
index 3552915b561..4d491b33aa0 100644
--- a/app/controllers/projects/ci/pipeline_editor_controller.rb
+++ b/app/controllers/projects/ci/pipeline_editor_controller.rb
@@ -5,12 +5,13 @@ class Projects::Ci::PipelineEditorController < Projects::ApplicationController
before_action do
push_frontend_feature_flag(:ci_config_visualization_tab, @project, default_enabled: :yaml)
push_frontend_feature_flag(:ci_config_merged_tab, @project, default_enabled: :yaml)
+ push_frontend_feature_flag(:pipeline_status_for_pipeline_editor, @project, default_enabled: :yaml)
+ push_frontend_feature_flag(:pipeline_editor_empty_state_action, @project, default_enabled: :yaml)
end
feature_category :pipeline_authoring
def show
- render_404 unless ::Gitlab::Ci::Features.ci_pipeline_editor_page_enabled?(@project)
end
private
diff --git a/app/controllers/projects/commit_controller.rb b/app/controllers/projects/commit_controller.rb
index ffdd9fca95b..cbb2a35d047 100644
--- a/app/controllers/projects/commit_controller.rb
+++ b/app/controllers/projects/commit_controller.rb
@@ -18,9 +18,6 @@ class Projects::CommitController < Projects::ApplicationController
before_action :define_commit_vars, only: [:show, :diff_for_path, :diff_files, :pipelines, :merge_requests]
before_action :define_note_vars, only: [:show, :diff_for_path, :diff_files]
before_action :authorize_edit_tree!, only: [:revert, :cherry_pick]
- before_action only: [:pipelines] do
- push_frontend_feature_flag(:ci_mini_pipeline_gl_dropdown, @project, type: :development, default_enabled: :yaml)
- end
BRANCH_SEARCH_LIMIT = 1000
COMMIT_DIFFS_PER_PAGE = 75
@@ -53,6 +50,8 @@ class Projects::CommitController < Projects::ApplicationController
# rubocop: disable CodeReuse/ActiveRecord
def pipelines
+ set_pipeline_feature_flag
+
@pipelines = @commit.pipelines.order(id: :desc)
@pipelines = @pipelines.where(ref: params[:ref]).page(params[:page]).per(30) if params[:ref]
@@ -127,6 +126,10 @@ class Projects::CommitController < Projects::ApplicationController
private
+ def set_pipeline_feature_flag
+ push_frontend_feature_flag(:new_pipelines_table, @project, default_enabled: :yaml)
+ end
+
def create_new_branch?
params[:create_merge_request].present? || !can?(current_user, :push_code, @project)
end
diff --git a/app/controllers/projects/compare_controller.rb b/app/controllers/projects/compare_controller.rb
index 6be0b465402..81f80d37662 100644
--- a/app/controllers/projects/compare_controller.rb
+++ b/app/controllers/projects/compare_controller.rb
@@ -6,6 +6,7 @@ class Projects::CompareController < Projects::ApplicationController
include DiffForPath
include DiffHelper
include RendersCommits
+ include CompareHelper
# Authorize
before_action :require_non_empty_project
@@ -19,6 +20,10 @@ class Projects::CompareController < Projects::ApplicationController
# Validation
before_action :validate_refs!
+ before_action do
+ push_frontend_feature_flag(:compare_repo_dropdown, source_project, default_enabled: :yaml)
+ end
+
feature_category :source_code_management
def index
@@ -37,16 +42,18 @@ class Projects::CompareController < Projects::ApplicationController
end
def create
- if params[:from].blank? || params[:to].blank?
+ from_to_vars = {
+ from: params[:from].presence,
+ to: params[:to].presence,
+ from_project_id: params[:from_project_id].presence
+ }
+
+ if from_to_vars[:from].blank? || from_to_vars[:to].blank?
flash[:alert] = "You must select a Source and a Target revision"
- from_to_vars = {
- from: params[:from].presence,
- to: params[:to].presence
- }
- redirect_to project_compare_index_path(@project, from_to_vars)
+
+ redirect_to project_compare_index_path(source_project, from_to_vars)
else
- redirect_to project_compare_path(@project,
- params[:from], params[:to])
+ redirect_to project_compare_path(source_project, from_to_vars)
end
end
@@ -73,13 +80,34 @@ class Projects::CompareController < Projects::ApplicationController
return if valid.all?
flash[:alert] = "Invalid branch name"
- redirect_to project_compare_index_path(@project)
+ redirect_to project_compare_index_path(source_project)
+ end
+
+ # target == start_ref == from
+ def target_project
+ strong_memoize(:target_project) do
+ next source_project unless params.key?(:from_project_id)
+ next source_project unless Feature.enabled?(:compare_repo_dropdown, source_project, default_enabled: :yaml)
+ next source_project if params[:from_project_id].to_i == source_project.id
+
+ target_project = target_projects(source_project).find_by_id(params[:from_project_id])
+
+ # Just ignore the field if it points at a non-existent or hidden project
+ next source_project unless target_project && can?(current_user, :download_code, target_project)
+
+ target_project
+ end
+ end
+
+ # source == head_ref == to
+ def source_project
+ project
end
def compare
return @compare if defined?(@compare)
- @compare = CompareService.new(@project, head_ref).execute(@project, start_ref)
+ @compare = CompareService.new(source_project, head_ref).execute(target_project, start_ref)
end
def start_ref
@@ -102,9 +130,9 @@ class Projects::CompareController < Projects::ApplicationController
def define_environment
if compare
- environment_params = @repository.branch_exists?(head_ref) ? { ref: head_ref } : { commit: compare.commit }
+ environment_params = source_project.repository.branch_exists?(head_ref) ? { ref: head_ref } : { commit: compare.commit }
environment_params[:find_latest] = true
- @environment = EnvironmentsFinder.new(@project, current_user, environment_params).execute.last
+ @environment = EnvironmentsFinder.new(source_project, current_user, environment_params).execute.last
end
end
@@ -114,8 +142,8 @@ class Projects::CompareController < Projects::ApplicationController
# rubocop: disable CodeReuse/ActiveRecord
def merge_request
- @merge_request ||= MergeRequestsFinder.new(current_user, project_id: @project.id).execute.opened
- .find_by(source_project: @project, source_branch: head_ref, target_branch: start_ref)
+ @merge_request ||= MergeRequestsFinder.new(current_user, project_id: target_project.id).execute.opened
+ .find_by(source_project: source_project, source_branch: head_ref, target_branch: start_ref)
end
# rubocop: enable CodeReuse/ActiveRecord
end
diff --git a/app/controllers/projects/forks_controller.rb b/app/controllers/projects/forks_controller.rb
index 5576d5766c7..33f046f414f 100644
--- a/app/controllers/projects/forks_controller.rb
+++ b/app/controllers/projects/forks_controller.rb
@@ -16,6 +16,10 @@ class Projects::ForksController < Projects::ApplicationController
feature_category :source_code_management
+ before_action do
+ push_frontend_feature_flag(:fork_project_form)
+ end
+
def index
@total_forks_count = project.forks.size
@public_forks_count = project.forks.public_only.size
diff --git a/app/controllers/projects/graphs_controller.rb b/app/controllers/projects/graphs_controller.rb
index 2b030793c58..ad39b317b31 100644
--- a/app/controllers/projects/graphs_controller.rb
+++ b/app/controllers/projects/graphs_controller.rb
@@ -62,7 +62,7 @@ class Projects::GraphsController < Projects::ApplicationController
return unless can?(current_user, :read_build_report_results, project)
date_today = Date.current
- report_window = Projects::Ci::DailyBuildGroupReportResultsController::REPORT_WINDOW
+ report_window = ::Ci::DailyBuildGroupReportResultsFinder::REPORT_WINDOW
@daily_coverage_options = {
base_params: {
diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb
index 2816977277a..c454ae6eaf4 100644
--- a/app/controllers/projects/issues_controller.rb
+++ b/app/controllers/projects/issues_controller.rb
@@ -9,7 +9,6 @@ class Projects::IssuesController < Projects::ApplicationController
include IssuesCalendar
include SpammableActions
include RecordUserLastActivity
- include CommentAndCloseFlag
ISSUES_EXCEPT_ACTIONS = %i[index calendar new create bulk_update import_csv export_csv service_desk].freeze
SET_ISSUEABLES_INDEX_ONLY_ACTIONS = %i[index calendar service_desk].freeze
@@ -45,6 +44,7 @@ class Projects::IssuesController < Projects::ApplicationController
push_frontend_feature_flag(:tribute_autocomplete, @project)
push_frontend_feature_flag(:vue_issuables_list, project)
push_frontend_feature_flag(:usage_data_design_action, project, default_enabled: true)
+ push_frontend_feature_flag(:improved_emoji_picker, project, default_enabled: :yaml)
end
before_action only: :show do
@@ -54,7 +54,6 @@ class Projects::IssuesController < Projects::ApplicationController
push_to_gon_attributes(:features, real_time_feature_flag, real_time_enabled)
push_frontend_feature_flag(:confidential_notes, @project, default_enabled: :yaml)
- record_experiment_user(:invite_members_version_a)
record_experiment_user(:invite_members_version_b)
end
diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb
index c9e9a34ad88..2c6d5f62b4e 100644
--- a/app/controllers/projects/merge_requests_controller.rb
+++ b/app/controllers/projects/merge_requests_controller.rb
@@ -11,7 +11,6 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
include RecordUserLastActivity
include SourcegraphDecorator
include DiffHelper
- include CommentAndCloseFlag
skip_before_action :merge_request, only: [:index, :bulk_update, :export_csv]
before_action :apply_diff_view_cookie!, only: [:show]
@@ -33,7 +32,7 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
push_frontend_feature_flag(:file_identifier_hash)
push_frontend_feature_flag(:batch_suggestions, @project, default_enabled: true)
push_frontend_feature_flag(:approvals_commented_by, @project, default_enabled: true)
- push_frontend_feature_flag(:merge_request_widget_graphql, @project)
+ push_frontend_feature_flag(:merge_request_widget_graphql, @project, default_enabled: :yaml)
push_frontend_feature_flag(:drag_comment_selection, @project, default_enabled: true)
push_frontend_feature_flag(:unified_diff_components, @project, default_enabled: true)
push_frontend_feature_flag(:default_merge_ref_for_diffs, @project, default_enabled: :yaml)
@@ -41,12 +40,10 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
push_frontend_feature_flag(:remove_resolve_note, @project, default_enabled: true)
push_frontend_feature_flag(:diffs_gradual_load, @project, default_enabled: true)
push_frontend_feature_flag(:codequality_backend_comparison, @project, default_enabled: :yaml)
- push_frontend_feature_flag(:suggestions_custom_commit, @project, default_enabled: true)
push_frontend_feature_flag(:local_file_reviews, default_enabled: :yaml)
push_frontend_feature_flag(:paginated_notes, @project, default_enabled: :yaml)
- push_frontend_feature_flag(:ci_mini_pipeline_gl_dropdown, @project, type: :development, default_enabled: :yaml)
+ push_frontend_feature_flag(:new_pipelines_table, @project, default_enabled: :yaml)
- record_experiment_user(:invite_members_version_a)
record_experiment_user(:invite_members_version_b)
end
diff --git a/app/controllers/projects/notes_controller.rb b/app/controllers/projects/notes_controller.rb
index 71a93701dc4..77fd7688caf 100644
--- a/app/controllers/projects/notes_controller.rb
+++ b/app/controllers/projects/notes_controller.rb
@@ -10,7 +10,6 @@ class Projects::NotesController < Projects::ApplicationController
before_action :authorize_read_note!
before_action :authorize_create_note!, only: [:create]
before_action :authorize_resolve_note!, only: [:resolve, :unresolve]
- before_action :create_rate_limit, only: [:create]
feature_category :issue_tracking
@@ -91,20 +90,4 @@ class Projects::NotesController < Projects::ApplicationController
def whitelist_query_limiting
Gitlab::QueryLimiting.whitelist('https://gitlab.com/gitlab-org/gitlab-foss/issues/42383')
end
-
- def create_rate_limit
- key = :notes_create
- return unless rate_limiter.throttled?(key, scope: [current_user], users_allowlist: rate_limit_users_allowlist)
-
- rate_limiter.log_request(request, "#{key}_request_limit".to_sym, current_user)
- render plain: _('This endpoint has been requested too many times. Try again later.'), status: :too_many_requests
- end
-
- def rate_limiter
- ::Gitlab::ApplicationRateLimiter
- end
-
- def rate_limit_users_allowlist
- Gitlab::CurrentSettings.current_application_settings.notes_create_limit_allowlist
- end
end
diff --git a/app/controllers/projects/pipelines/tests_controller.rb b/app/controllers/projects/pipelines/tests_controller.rb
index 1702783b10f..25ec7ab1335 100644
--- a/app/controllers/projects/pipelines/tests_controller.rb
+++ b/app/controllers/projects/pipelines/tests_controller.rb
@@ -32,7 +32,7 @@ module Projects
# rubocop: disable CodeReuse/ActiveRecord
def builds
- @builds ||= pipeline.latest_builds.for_ids(build_ids).presence || render_404
+ @builds ||= pipeline.latest_builds.id_in(build_ids).presence || render_404
end
def build_ids
diff --git a/app/controllers/projects/pipelines_controller.rb b/app/controllers/projects/pipelines_controller.rb
index 59b14bbb91d..9b5f5871c41 100644
--- a/app/controllers/projects/pipelines_controller.rb
+++ b/app/controllers/projects/pipelines_controller.rb
@@ -13,12 +13,11 @@ class Projects::PipelinesController < Projects::ApplicationController
before_action :authorize_create_pipeline!, only: [:new, :create, :config_variables]
before_action :authorize_update_pipeline!, only: [:retry, :cancel]
before_action do
- push_frontend_feature_flag(:pipelines_security_report_summary, project)
- push_frontend_feature_flag(:new_pipeline_form, project, default_enabled: true)
+ push_frontend_feature_flag(:new_pipeline_form, project, default_enabled: :yaml)
push_frontend_feature_flag(:graphql_pipeline_details, project, type: :development, default_enabled: :yaml)
push_frontend_feature_flag(:graphql_pipeline_details_users, current_user, type: :development, default_enabled: :yaml)
- push_frontend_feature_flag(:ci_mini_pipeline_gl_dropdown, project, type: :development, default_enabled: :yaml)
push_frontend_feature_flag(:jira_for_vulnerabilities, project, type: :development, default_enabled: :yaml)
+ push_frontend_feature_flag(:new_pipelines_table, project, default_enabled: :yaml)
end
before_action :ensure_pipeline, only: [:show]
diff --git a/app/controllers/projects/project_members_controller.rb b/app/controllers/projects/project_members_controller.rb
index a7c7839dc9f..5972b29a298 100644
--- a/app/controllers/projects/project_members_controller.rb
+++ b/app/controllers/projects/project_members_controller.rb
@@ -8,10 +8,6 @@ class Projects::ProjectMembersController < Projects::ApplicationController
# Authorize
before_action :authorize_admin_project_member!, except: [:index, :leave, :request_access]
- before_action do
- push_frontend_feature_flag(:vue_project_members_list, @project, default_enabled: :yaml)
- end
-
feature_category :authentication_and_authorization
def index
diff --git a/app/controllers/projects/protected_branches_controller.rb b/app/controllers/projects/protected_branches_controller.rb
index d4f7d0bc521..84b155c8002 100644
--- a/app/controllers/projects/protected_branches_controller.rb
+++ b/app/controllers/projects/protected_branches_controller.rb
@@ -21,6 +21,7 @@ class Projects::ProtectedBranchesController < Projects::ProtectedRefsController
def protected_ref_params(*attrs)
attrs = ([:name,
+ :allow_force_push,
merge_access_levels_attributes: access_level_attributes,
push_access_levels_attributes: access_level_attributes] + attrs).uniq
diff --git a/app/controllers/projects/security/configuration_controller.rb b/app/controllers/projects/security/configuration_controller.rb
index 9366ca7b0ed..cafc392134b 100644
--- a/app/controllers/projects/security/configuration_controller.rb
+++ b/app/controllers/projects/security/configuration_controller.rb
@@ -3,6 +3,8 @@
module Projects
module Security
class ConfigurationController < Projects::ApplicationController
+ include SecurityAndCompliancePermissions
+
feature_category :static_application_security_testing
def show
diff --git a/app/controllers/projects/services_controller.rb b/app/controllers/projects/services_controller.rb
index b5c73f29784..554eb01defe 100644
--- a/app/controllers/projects/services_controller.rb
+++ b/app/controllers/projects/services_controller.rb
@@ -12,8 +12,6 @@ class Projects::ServicesController < Projects::ApplicationController
before_action :set_deprecation_notice_for_prometheus_service, only: [:edit, :update]
before_action :redirect_deprecated_prometheus_service, only: [:update]
before_action only: :edit do
- push_frontend_feature_flag(:jira_issues_integration, @project, type: :licensed, default_enabled: true)
- push_frontend_feature_flag(:jira_vulnerabilities_integration, @project, type: :licensed, default_enabled: true)
push_frontend_feature_flag(:jira_for_vulnerabilities, @project, type: :development, default_enabled: :yaml)
end
diff --git a/app/controllers/projects/settings/operations_controller.rb b/app/controllers/projects/settings/operations_controller.rb
index f8155b77e60..c407b15e29f 100644
--- a/app/controllers/projects/settings/operations_controller.rb
+++ b/app/controllers/projects/settings/operations_controller.rb
@@ -6,10 +6,6 @@ module Projects
before_action :authorize_admin_operations!
before_action :authorize_read_prometheus_alerts!, only: [:reset_alerting_token]
- before_action do
- push_frontend_feature_flag(:multiple_http_integrations_custom_mapping, @project)
- end
-
respond_to :json, only: [:reset_alerting_token, :reset_pagerduty_token]
helper_method :error_tracking_setting
diff --git a/app/controllers/projects/templates_controller.rb b/app/controllers/projects/templates_controller.rb
index ab05c9694fd..b4b8fb97049 100644
--- a/app/controllers/projects/templates_controller.rb
+++ b/app/controllers/projects/templates_controller.rb
@@ -25,7 +25,7 @@ class Projects::TemplatesController < Projects::ApplicationController
def names
respond_to do |format|
- format.json { render json: TemplateFinder.all_template_names_array(project, params[:template_type].to_s.pluralize) }
+ format.json { render json: TemplateFinder.all_template_names_hash_or_array(project, params[:template_type].to_s) }
end
end
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index ebffb62cff3..bc48ebd1c74 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -31,10 +31,6 @@ class ProjectsController < Projects::ApplicationController
# Project Export Rate Limit
before_action :export_rate_limit, only: [:export, :download_export, :generate_new_export]
- before_action do
- push_frontend_feature_flag(:vue_notification_dropdown, @project, default_enabled: :yaml)
- end
-
before_action only: [:edit] do
push_frontend_feature_flag(:allow_editing_commit_messages, @project)
end
@@ -74,7 +70,11 @@ class ProjectsController < Projects::ApplicationController
@project = ::Projects::CreateService.new(current_user, project_params(attributes: project_params_create_attributes)).execute
if @project.saved?
- experiment(:new_project_readme, actor: current_user).track(:created, property: active_new_project_tab)
+ experiment(:new_project_readme, actor: current_user).track(
+ :created,
+ property: active_new_project_tab,
+ value: project_params[:initialize_with_readme].to_i
+ )
redirect_to(
project_path(@project, custom_import_params),
notice: _("Project '%{project_name}' was successfully created.") % { project_name: @project.name }
@@ -90,21 +90,13 @@ class ProjectsController < Projects::ApplicationController
# Refresh the repo in case anything changed
@repository = @project.repository
- respond_to do |format|
- if result[:status] == :success
- flash[:notice] = _("Project '%{project_name}' was successfully updated.") % { project_name: @project.name }
-
- format.html do
- redirect_to(edit_project_path(@project, anchor: 'js-general-project-settings'))
- end
- else
- flash[:alert] = result[:message]
- @project.reset
-
- format.html { render_edit }
- end
-
- format.js
+ if result[:status] == :success
+ flash[:notice] = _("Project '%{project_name}' was successfully updated.") % { project_name: @project.name }
+ redirect_to(edit_project_path(@project, anchor: 'js-general-project-settings'))
+ else
+ flash[:alert] = result[:message]
+ @project.reset
+ render 'edit'
end
end
@@ -329,6 +321,11 @@ class ProjectsController < Projects::ApplicationController
if can?(current_user, :download_code, @project)
return render 'projects/no_repo' unless @project.repository_exists?
+ if @project.can_current_user_push_to_default_branch?
+ property = @project.empty_repo? ? 'empty' : 'nonempty'
+ experiment(:empty_repo_upload, project: @project).track(:view_project_show, property: property)
+ end
+
if @project.empty_repo?
record_experiment_user(:invite_members_empty_project_version_a)
@@ -393,6 +390,7 @@ class ProjectsController < Projects::ApplicationController
metrics_dashboard_access_level
analytics_access_level
operations_access_level
+ security_and_compliance_access_level
]
end
@@ -523,7 +521,7 @@ class ProjectsController < Projects::ApplicationController
def export_rate_limit
prefixed_action = "project_#{params[:action]}".to_sym
- project_scope = params[:action] == :download_export ? @project : nil
+ project_scope = params[:action] == 'download_export' ? @project : nil
if rate_limiter.throttled?(prefixed_action, scope: [current_user, project_scope].compact)
rate_limiter.log_request(request, "#{prefixed_action}_request_limit".to_sym, current_user)
diff --git a/app/controllers/repositories/git_http_controller.rb b/app/controllers/repositories/git_http_controller.rb
index 9ad700404ff..d68ba80ab5d 100644
--- a/app/controllers/repositories/git_http_controller.rb
+++ b/app/controllers/repositories/git_http_controller.rb
@@ -78,11 +78,11 @@ module Repositories
def update_fetch_statistics
return unless project
return if Gitlab::Database.read_only?
- return if Feature.enabled?(:disable_git_http_fetch_writes)
-
return unless repo_type.project?
- OnboardingProgressService.new(project.namespace).execute(action: :git_read)
+ OnboardingProgressService.async(project.namespace_id).execute(action: :git_pull)
+
+ return if Feature.enabled?(:disable_git_http_fetch_writes)
if Feature.enabled?(:project_statistics_sync, project, default_enabled: true)
Projects::FetchStatisticsIncrementService.new(project).execute
diff --git a/app/controllers/root_controller.rb b/app/controllers/root_controller.rb
index 191134472c2..dab2f3bd67a 100644
--- a/app/controllers/root_controller.rb
+++ b/app/controllers/root_controller.rb
@@ -46,6 +46,8 @@ class RootController < Dashboard::ProjectsController
redirect_to(activity_dashboard_path)
when 'starred_project_activity'
redirect_to(activity_dashboard_path(filter: 'starred'))
+ when 'followed_user_activity'
+ redirect_to(activity_dashboard_path(filter: 'followed'))
when 'groups'
redirect_to(dashboard_groups_path)
when 'todos'
@@ -69,7 +71,7 @@ class RootController < Dashboard::ProjectsController
end
def customize_homepage
- @customize_homepage = experiment_enabled?(:customize_homepage)
+ @customize_homepage = Feature.enabled?(:customize_homepage, default_enabled: :yaml)
end
end
diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb
index 820b00a902e..45c1c35a655 100644
--- a/app/controllers/search_controller.rb
+++ b/app/controllers/search_controller.rb
@@ -49,6 +49,12 @@ class SearchController < ApplicationController
scope = search_service.scope
count = search_service.search_results.formatted_count(scope)
+ # Users switching tabs will keep fetching the same tab counts so it's a
+ # good idea to cache in their browser just for a short time. They can still
+ # clear cache if they are seeing an incorrect count but inaccurate count is
+ # not such a bad thing.
+ expires_in 1.minute
+
render json: { count: count }
end
@@ -125,7 +131,7 @@ class SearchController < ApplicationController
payload[:metadata] ||= {}
payload[:metadata]['meta.search.group_id'] = params[:group_id]
payload[:metadata]['meta.search.project_id'] = params[:project_id]
- payload[:metadata]['meta.search.scope'] = params[:scope]
+ payload[:metadata]['meta.search.scope'] = params[:scope] || @scope
payload[:metadata]['meta.search.filters.confidential'] = params[:confidential]
payload[:metadata]['meta.search.filters.state'] = params[:state]
payload[:metadata]['meta.search.force_search_results'] = params[:force_search_results]
diff --git a/app/controllers/user_callouts_controller.rb b/app/controllers/user_callouts_controller.rb
index cfec9d6d905..df3e2425e9f 100644
--- a/app/controllers/user_callouts_controller.rb
+++ b/app/controllers/user_callouts_controller.rb
@@ -4,10 +4,11 @@ class UserCalloutsController < ApplicationController
feature_category :navigation
def create
- callout = ensure_callout
+ callout = Users::DismissUserCalloutService.new(
+ container: nil, current_user: current_user, params: { feature_name: feature_name }
+ ).execute
if callout.persisted?
- callout.update(dismissed_at: Time.current)
respond_to do |format|
format.json { head :ok }
end
@@ -20,12 +21,6 @@ class UserCalloutsController < ApplicationController
private
- # rubocop: disable CodeReuse/ActiveRecord
- def ensure_callout
- current_user.callouts.find_or_create_by(feature_name: UserCallout.feature_names[feature_name])
- end
- # rubocop: enable CodeReuse/ActiveRecord
-
def feature_name
params.require(:feature_name)
end
diff --git a/app/experiments/application_experiment.rb b/app/experiments/application_experiment.rb
index 317514d088b..019e74bcd48 100644
--- a/app/experiments/application_experiment.rb
+++ b/app/experiments/application_experiment.rb
@@ -3,19 +3,27 @@
class ApplicationExperiment < Gitlab::Experiment # rubocop:disable Gitlab/NamespacedClass
def enabled?
return false if Feature::Definition.get(feature_flag_name).nil? # there has to be a feature flag yaml file
- return false unless Gitlab.dev_env_or_com? # we're in an environment that allows experiments
+ return false unless Gitlab.dev_env_or_com? # we have to be in an environment that allows experiments
+ # the feature flag has to be rolled out
Feature.get(feature_flag_name).state != :off # rubocop:disable Gitlab/AvoidFeatureGet
end
- def publish(_result)
+ def publish(_result = nil)
track(:assignment) # track that we've assigned a variant for this context
- Gon.global.push({ experiment: { name => signature } }, true) # push to client
+
+ # push the experiment data to the client
+ begin
+ Gon.push({ experiment: { name => signature } }, true) # push the experiment data to the client
+ rescue NoMethodError
+ # means we're not in the request cycle, and can't add to Gon. Log a warning maybe?
+ end
end
def track(action, **event_args)
- return unless should_track? # no events for opted out actors or excluded subjects
+ return unless should_track? # don't track events for excluded contexts
+ # track the event, and mix in the experiment signature data
Gitlab::Tracking.event(name, action.to_s, **event_args.merge(
context: (event_args[:context] || []) << SnowplowTracker::SelfDescribingJson.new(
'iglu:com.gitlab/gitlab_experiment/jsonschema/0-3-0', signature
@@ -23,6 +31,10 @@ class ApplicationExperiment < Gitlab::Experiment # rubocop:disable Gitlab/Namesp
))
end
+ def exclude!
+ @excluded = true
+ end
+
def rollout_strategy
# no-op override in inherited class as desired
end
@@ -59,62 +71,4 @@ class ApplicationExperiment < Gitlab::Experiment # rubocop:disable Gitlab/Namesp
nil # Returning nil vs. :control is important for not caching and rollouts.
end
-
- # Cache is an implementation on top of Gitlab::Redis::SharedState that also
- # adheres to the ActiveSupport::Cache::Store interface and uses the redis
- # hash data type.
- #
- # Since Gitlab::Experiment can use any type of caching layer, utilizing the
- # long lived shared state interface here gives us an efficient way to store
- # context keys and the variant they've been assigned -- while also giving us
- # a simple way to clean up an experiments data upon resolution.
- #
- # The data structure:
- # key: experiment.name
- # fields: context key => variant name
- #
- # The keys are expected to be `experiment_name:context_key`, which is the
- # default cache key strategy. So running `cache.fetch("foo:bar", "value")`
- # would create/update a hash with the key of "foo", with a field named
- # "bar" that has "value" assigned to it.
- class Cache < ActiveSupport::Cache::Store # rubocop:disable Gitlab/NamespacedClass
- # Clears the entire cache for a given experiment. Be careful with this
- # since it would reset all resolved variants for the entire experiment.
- def clear(key:)
- key = hkey(key)[0] # extract only the first part of the key
- pool do |redis|
- case redis.type(key)
- when 'hash', 'none' then redis.del(key)
- else raise ArgumentError, 'invalid call to clear a non-hash cache key'
- end
- end
- end
-
- private
-
- def pool
- raise ArgumentError, 'missing block' unless block_given?
-
- Gitlab::Redis::SharedState.with { |redis| yield redis }
- end
-
- def hkey(key)
- key.to_s.split(':') # this assumes the default strategy in gitlab-experiment
- end
-
- def read_entry(key, **options)
- value = pool { |redis| redis.hget(*hkey(key)) }
- value.nil? ? nil : ActiveSupport::Cache::Entry.new(value)
- end
-
- def write_entry(key, entry, **options)
- return false if entry.value.blank? # don't cache any empty values
-
- pool { |redis| redis.hset(*hkey(key), entry.value) }
- end
-
- def delete_entry(key, **options)
- pool { |redis| redis.hdel(*hkey(key)) }
- end
- end
end
diff --git a/app/finders/admin/plans_finder.rb b/app/finders/admin/plans_finder.rb
new file mode 100644
index 00000000000..5ca4b61b25e
--- /dev/null
+++ b/app/finders/admin/plans_finder.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+module Admin
+ class PlansFinder
+ attr_reader :params
+
+ def initialize(params = {})
+ @params = params
+ end
+
+ def execute
+ plans = Plan.all
+ by_name(plans)
+ end
+
+ private
+
+ def by_name(plans)
+ return plans unless params[:name]
+
+ Plan.find_by(name: params[:name]) # rubocop: disable CodeReuse/ActiveRecord
+ end
+ end
+end
diff --git a/app/finders/boards/boards_finder.rb b/app/finders/boards/boards_finder.rb
new file mode 100644
index 00000000000..5b8c313a178
--- /dev/null
+++ b/app/finders/boards/boards_finder.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+module Boards
+ class BoardsFinder < Boards::BaseService
+ def execute
+ find_boards
+ end
+
+ private
+
+ def boards
+ parent.boards.order_by_name_asc
+ end
+
+ def first_board
+ parent.boards.first_board
+ end
+
+ def find_boards
+ found =
+ if parent.multiple_issue_boards_available?
+ boards
+ else
+ # When multiple issue boards are not available
+ # a user is only allowed to view the default shown board
+ first_board
+ end
+
+ params[:board_id].present? ? [found.find(params[:board_id])] : found
+ end
+ end
+end
diff --git a/app/finders/ci/daily_build_group_report_results_finder.rb b/app/finders/ci/daily_build_group_report_results_finder.rb
index ef97ccb4c0f..9e736c70dda 100644
--- a/app/finders/ci/daily_build_group_report_results_finder.rb
+++ b/app/finders/ci/daily_build_group_report_results_finder.rb
@@ -1,56 +1,99 @@
# frozen_string_literal: true
+# DailyBuildGroupReportResultsFinder
+#
+# Used to filter DailyBuildGroupReportResults by set of params
+#
+# Arguments:
+# current_user
+# params:
+# project: integer
+# group: integer
+# coverage: boolean
+# ref_path: string
+# start_date: string
+# end_date: string
+# sort: boolean
+# limit: integer
+
module Ci
class DailyBuildGroupReportResultsFinder
include Gitlab::Allowable
- def initialize(current_user:, project:, ref_path: nil, start_date:, end_date:, limit: nil)
+ MAX_ITEMS = 1_000
+ REPORT_WINDOW = 90.days
+ DATE_FORMAT_ALLOWED = '%Y-%m-%d'
+
+ attr_reader :params, :current_user
+
+ def initialize(params: {}, current_user: nil)
+ @params = params
@current_user = current_user
- @project = project
- @ref_path = ref_path
- @start_date = start_date
- @end_date = end_date
- @limit = limit
end
def execute
- return none unless query_allowed?
+ return Ci::DailyBuildGroupReportResult.none unless query_allowed?
- query
+ collection = Ci::DailyBuildGroupReportResult.by_projects(params[:project])
+ collection = filter_report_results(collection)
+ collection
end
- protected
+ private
- attr_reader :current_user, :project, :ref_path, :start_date, :end_date, :limit
+ def query_allowed?
+ can?(current_user, :read_build_report_results, params[:project])
+ end
- def query
- Ci::DailyBuildGroupReportResult.recent_results(
- query_params,
- limit: limit
- )
+ def filter_report_results(collection)
+ collection = by_coverage(collection)
+ collection = by_ref_path(collection)
+ collection = by_dates(collection)
+
+ collection = sort(collection)
+ collection = limit_by(collection)
+ collection
end
- def query_allowed?
- can?(current_user, :read_build_report_results, project)
+ def by_coverage(items)
+ params[:coverage].present? ? items.with_coverage : items
+ end
+
+ def by_ref_path(items)
+ params[:ref_path].present? ? items.by_ref_path(params[:ref_path]) : items.with_default_branch
end
- def query_params
- params = {
- project_id: project,
- date: start_date..end_date
- }
+ def by_dates(items)
+ params[:start_date].present? && params[:end_date].present? ? items.by_dates(start_date, end_date) : items
+ end
- if ref_path.present?
- params[:ref_path] = ref_path
- else
- params[:default_branch] = true
- end
+ def sort(items)
+ params[:sort].present? ? items.ordered_by_date_and_group_name : items
+ end
- params
+ # rubocop: disable CodeReuse/ActiveRecord
+ def limit_by(items)
+ items.limit(limit)
end
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ def limit
+ return MAX_ITEMS unless params[:limit].present?
- def none
- Ci::DailyBuildGroupReportResult.none
+ [params[:limit].to_i, MAX_ITEMS].min
+ end
+
+ def start_date
+ start_date = Date.strptime(params[:start_date], DATE_FORMAT_ALLOWED) rescue REPORT_WINDOW.ago.to_date
+
+ # The start_date cannot be older than `end_date - 90 days`
+ [start_date, end_date - REPORT_WINDOW].max
+ end
+
+ def end_date
+ Date.strptime(params[:end_date], DATE_FORMAT_ALLOWED) rescue Date.current
end
end
end
+
+Ci::DailyBuildGroupReportResultsFinder.prepend_if_ee('::EE::Ci::DailyBuildGroupReportResultsFinder')
diff --git a/app/finders/ci/testing/daily_build_group_report_results_finder.rb b/app/finders/ci/testing/daily_build_group_report_results_finder.rb
deleted file mode 100644
index 70d9e55dc47..00000000000
--- a/app/finders/ci/testing/daily_build_group_report_results_finder.rb
+++ /dev/null
@@ -1,88 +0,0 @@
-# frozen_string_literal: true
-
-# DailyBuildGroupReportResultsFinder
-#
-# Used to filter DailyBuildGroupReportResults by set of params
-#
-# Arguments:
-# current_user
-# params:
-# project: integer
-# group: integer
-# coverage: boolean
-# ref_path: string
-# start_date: date
-# end_date: date
-# sort: boolean
-# limit: integer
-
-module Ci
- module Testing
- class DailyBuildGroupReportResultsFinder
- include Gitlab::Allowable
-
- MAX_ITEMS = 1_000
-
- attr_reader :params, :current_user
-
- def initialize(params: {}, current_user: nil)
- @params = params
- @current_user = current_user
- end
-
- def execute
- return Ci::DailyBuildGroupReportResult.none unless query_allowed?
-
- collection = Ci::DailyBuildGroupReportResult.by_projects(params[:project])
- collection = filter_report_results(collection)
- collection
- end
-
- private
-
- def query_allowed?
- can?(current_user, :read_build_report_results, params[:project])
- end
-
- def filter_report_results(collection)
- collection = by_coverage(collection)
- collection = by_ref_path(collection)
- collection = by_dates(collection)
-
- collection = sort(collection)
- collection = limit_by(collection)
- collection
- end
-
- def by_coverage(items)
- params[:coverage].present? ? items.with_coverage : items
- end
-
- def by_ref_path(items)
- params[:ref_path].present? ? items.by_ref_path(params[:ref_path]) : items.with_default_branch
- end
-
- def by_dates(items)
- params[:start_date].present? && params[:end_date].present? ? items.by_dates(params[:start_date], params[:end_date]) : items
- end
-
- def sort(items)
- params[:sort].present? ? items.ordered_by_date_and_group_name : items
- end
-
- # rubocop: disable CodeReuse/ActiveRecord
- def limit_by(items)
- items.limit(limit)
- end
- # rubocop: enable CodeReuse/ActiveRecord
-
- def limit
- return MAX_ITEMS unless params[:limit].present?
-
- [params[:limit].to_i, MAX_ITEMS].min
- end
- end
- end
-end
-
-Ci::Testing::DailyBuildGroupReportResultsFinder.prepend_if_ee('::EE::Ci::Testing::DailyBuildGroupReportResultsFinder')
diff --git a/app/finders/issuable_finder.rb b/app/finders/issuable_finder.rb
index fc03d5cd90c..2409dc9d77d 100644
--- a/app/finders/issuable_finder.rb
+++ b/app/finders/issuable_finder.rb
@@ -47,6 +47,7 @@ class IssuableFinder
NEGATABLE_PARAMS_HELPER_KEYS = %i[project_id scope status include_subgroups].freeze
attr_accessor :current_user, :params
+ attr_reader :original_params
attr_writer :parent
delegate(*%i[assignee milestones], to: :params)
@@ -87,7 +88,7 @@ class IssuableFinder
end
def valid_params
- @valid_params ||= scalar_params + [array_params.merge(not: {})]
+ @valid_params ||= scalar_params + [array_params.merge(or: {}, not: {})]
end
end
@@ -101,6 +102,7 @@ class IssuableFinder
def initialize(current_user, params = {})
@current_user = current_user
+ @original_params = params
@params = params_class.new(params, current_user, klass)
end
@@ -142,7 +144,7 @@ class IssuableFinder
end
def should_filter_negated_args?
- return false unless Feature.enabled?(:not_issuable_queries, params.group || params.project, default_enabled: true)
+ return false unless not_filters_enabled?
# API endpoints send in `nil` values so we test if there are any non-nil
not_params.present? && not_params.values.any?
@@ -150,7 +152,6 @@ class IssuableFinder
# Negates all params found in `negatable_params`
def filter_negated_items(items)
- items = by_negated_author(items)
items = by_negated_assignee(items)
items = by_negated_label(items)
items = by_negated_milestone(items)
@@ -372,31 +373,14 @@ class IssuableFinder
end
# rubocop: enable CodeReuse/ActiveRecord
- # rubocop: disable CodeReuse/ActiveRecord
def by_author(items)
- if params.author
- items.where(author_id: params.author.id)
- elsif params.no_author?
- items.where(author_id: nil)
- elsif params.author_id? || params.author_username? # author not found
- items.none
- else
- items
- end
- end
- # rubocop: enable CodeReuse/ActiveRecord
-
- # rubocop: disable CodeReuse/ActiveRecord
- def by_negated_author(items)
- if not_params.author
- items.where.not(author_id: not_params.author.id)
- elsif not_params.author_id? || not_params.author_username? # author not found
- items.none
- else
- items
- end
+ Issuables::AuthorFilter.new(
+ items,
+ params: original_params,
+ or_filters_enabled: or_filters_enabled?,
+ not_filters_enabled: not_filters_enabled?
+ ).filter
end
- # rubocop: enable CodeReuse/ActiveRecord
def by_assignee(items)
if params.filter_by_no_assignee?
@@ -514,4 +498,20 @@ class IssuableFinder
def by_non_archived(items)
params[:non_archived].present? ? items.non_archived : items
end
+
+ def or_filters_enabled?
+ strong_memoize(:or_filters_enabled) do
+ Feature.enabled?(:or_issuable_queries, feature_flag_scope, default_enabled: :yaml)
+ end
+ end
+
+ def not_filters_enabled?
+ strong_memoize(:not_filters_enabled) do
+ Feature.enabled?(:not_issuable_queries, feature_flag_scope, default_enabled: :yaml)
+ end
+ end
+
+ def feature_flag_scope
+ params.group || params.project
+ end
end
diff --git a/app/finders/issuable_finder/params.rb b/app/finders/issuable_finder/params.rb
index 803b30e86ac..a62210ceac5 100644
--- a/app/finders/issuable_finder/params.rb
+++ b/app/finders/issuable_finder/params.rb
@@ -27,19 +27,6 @@ class IssuableFinder
params.present?
end
- def author_id?
- params[:author_id].present? && params[:author_id] != NONE
- end
-
- def author_username?
- params[:author_username].present? && params[:author_username] != NONE
- end
-
- def no_author?
- # author_id takes precedence over author_username
- params[:author_id] == NONE || params[:author_username] == NONE
- end
-
def filter_by_no_assignee?
params[:assignee_id].to_s.downcase == FILTER_NONE
end
@@ -170,20 +157,6 @@ class IssuableFinder
end
# rubocop: disable CodeReuse/ActiveRecord
- def author
- strong_memoize(:author) do
- if author_id?
- User.find_by(id: params[:author_id])
- elsif author_username?
- User.find_by_username(params[:author_username])
- else
- nil
- end
- end
- end
- # rubocop: enable CodeReuse/ActiveRecord
-
- # rubocop: disable CodeReuse/ActiveRecord
def assignees
strong_memoize(:assignees) do
if assignee_id?
diff --git a/app/finders/issuables/author_filter.rb b/app/finders/issuables/author_filter.rb
new file mode 100644
index 00000000000..ce68dbafb95
--- /dev/null
+++ b/app/finders/issuables/author_filter.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+module Issuables
+ class AuthorFilter < BaseFilter
+ def filter
+ filtered = by_author(issuables)
+ filtered = by_author_union(filtered)
+ by_negated_author(filtered)
+ end
+
+ private
+
+ def by_author(issuables)
+ if params[:author_id].present?
+ issuables.authored(params[:author_id])
+ elsif params[:author_username].present?
+ issuables.authored(User.by_username(params[:author_username]))
+ else
+ issuables
+ end
+ end
+
+ def by_author_union(issuables)
+ return issuables unless or_filters_enabled? && or_params&.fetch(:author_username).present?
+
+ issuables.authored(User.by_username(or_params[:author_username]))
+ end
+
+ def by_negated_author(issuables)
+ return issuables unless not_filters_enabled? && not_params.present?
+
+ if not_params[:author_id].present?
+ issuables.not_authored(not_params[:author_id])
+ elsif not_params[:author_username].present?
+ issuables.not_authored(User.by_username(not_params[:author_username]))
+ else
+ issuables
+ end
+ end
+ end
+end
diff --git a/app/finders/issuables/base_filter.rb b/app/finders/issuables/base_filter.rb
new file mode 100644
index 00000000000..641ae2568cc
--- /dev/null
+++ b/app/finders/issuables/base_filter.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+module Issuables
+ class BaseFilter
+ attr_reader :issuables, :params
+
+ def initialize(issuables, params:, or_filters_enabled: false, not_filters_enabled: false)
+ @issuables = issuables
+ @params = params
+ @or_filters_enabled = or_filters_enabled
+ @not_filters_enabled = not_filters_enabled
+ end
+
+ def filter
+ raise NotImplementedError
+ end
+
+ private
+
+ def or_params
+ params[:or]
+ end
+
+ def not_params
+ params[:not]
+ end
+
+ def or_filters_enabled?
+ @or_filters_enabled
+ end
+
+ def not_filters_enabled?
+ @not_filters_enabled
+ end
+ end
+end
diff --git a/app/finders/merge_request_target_project_finder.rb b/app/finders/merge_request_target_project_finder.rb
index 85a73e0c6ff..dc9b28ab0a0 100644
--- a/app/finders/merge_request_target_project_finder.rb
+++ b/app/finders/merge_request_target_project_finder.rb
@@ -5,29 +5,30 @@ class MergeRequestTargetProjectFinder
attr_reader :current_user, :source_project
- def initialize(current_user: nil, source_project:)
+ def initialize(current_user: nil, source_project:, project_feature: :merge_requests)
@current_user = current_user
@source_project = source_project
+ @project_feature = project_feature
end
- # rubocop: disable CodeReuse/ActiveRecord
def execute(include_routes: false)
if source_project.fork_network
include_routes ? projects.inc_routes : projects
else
- Project.where(id: source_project)
+ Project.id_in(source_project.id)
end
end
- # rubocop: enable CodeReuse/ActiveRecord
private
+ attr_reader :project_feature
+
def projects
source_project
.fork_network
.projects
.public_or_visible_to_user(current_user)
.non_archived
- .with_feature_available_for_user(:merge_requests, current_user)
+ .with_feature_available_for_user(project_feature, current_user)
end
end
diff --git a/app/finders/merge_requests/oldest_per_commit_finder.rb b/app/finders/merge_requests/oldest_per_commit_finder.rb
index f50db43d7d2..5360f301036 100644
--- a/app/finders/merge_requests/oldest_per_commit_finder.rb
+++ b/app/finders/merge_requests/oldest_per_commit_finder.rb
@@ -15,19 +15,45 @@ module MergeRequests
# Returns a Hash that maps a commit ID to the oldest merge request that
# introduced that commit.
def execute(commits)
+ mapping = {}
+ shas = commits.map(&:id)
+
+ # To include merge requests by the commit SHA, we don't need to go through
+ # any diff rows.
+ #
+ # We can't squeeze all this into a single query, as the diff based data
+ # relies on a GROUP BY. On the other hand, retrieving MRs by their merge
+ # SHAs separately is much easier, and plenty fast.
+ @project
+ .merge_requests
+ .preload_target_project
+ .by_merge_commit_sha(shas)
+ .each do |mr|
+ # Merge SHAs can't be in the merge request itself. It _is_ possible a
+ # newer merge request includes the merge commit, but in that case we
+ # still want the oldest merge request.
+ mapping[mr.merge_commit_sha] = mr
+ end
+
+ remaining = shas - mapping.keys
+
+ return mapping if remaining.empty?
+
id_rows = MergeRequestDiffCommit
- .oldest_merge_request_id_per_commit(@project.id, commits.map(&:id))
+ .oldest_merge_request_id_per_commit(@project.id, remaining)
mrs = MergeRequest
.preload_target_project
.id_in(id_rows.map { |r| r[:merge_request_id] })
.index_by(&:id)
- id_rows.each_with_object({}) do |row, hash|
+ id_rows.each do |row|
if (mr = mrs[row[:merge_request_id]])
- hash[row[:sha]] = mr
+ mapping[row[:sha]] = mr
end
end
+
+ mapping
end
end
end
diff --git a/app/finders/namespaces/projects_finder.rb b/app/finders/namespaces/projects_finder.rb
new file mode 100644
index 00000000000..a6d98015e9d
--- /dev/null
+++ b/app/finders/namespaces/projects_finder.rb
@@ -0,0 +1,64 @@
+# frozen_string_literal: true
+
+# Namespaces::ProjectsFinder
+#
+# Used to filter Projects by set of params
+#
+# Arguments:
+# current_user
+# namespace
+# params:
+# sort: string
+# search: string
+# include_subgroups: boolean
+# ids: int[]
+#
+module Namespaces
+ class ProjectsFinder
+ def initialize(namespace: nil, current_user: nil, params: {})
+ @namespace = namespace
+ @current_user = current_user
+ @params = params
+ end
+
+ def execute
+ return Project.none if namespace.nil?
+
+ collection = if params[:include_subgroups].present?
+ namespace.all_projects.with_route
+ else
+ namespace.projects.with_route
+ end
+
+ filter_projects(collection)
+ end
+
+ private
+
+ attr_reader :namespace, :params, :current_user
+
+ def filter_projects(collection)
+ collection = by_ids(collection)
+ collection = by_similarity(collection)
+ collection
+ end
+
+ def by_ids(items)
+ return items unless params[:ids].present?
+
+ items.id_in(params[:ids])
+ end
+
+ def by_similarity(items)
+ return items unless params[:search].present?
+
+ if params[:sort] == :similarity
+ items = items.sorted_by_similarity_desc(params[:search], include_in_select: true)
+ end
+
+ items.merge(Project.search(params[:search]))
+ end
+ end
+end
+
+Namespaces::ProjectsFinder.prepend_if_ee('::EE::Namespaces::ProjectsFinder')
diff --git a/app/finders/packages/maven/package_finder.rb b/app/finders/packages/maven/package_finder.rb
index 7e753705cbd..ba3d4631f55 100644
--- a/app/finders/packages/maven/package_finder.rb
+++ b/app/finders/packages/maven/package_finder.rb
@@ -59,9 +59,8 @@ module Packages
# Returns the projects that the current user can view within a group.
def projects_visible_to_current_user
- ::Project
- .in_namespace(group.self_and_descendants.select(:id))
- .public_or_visible_to_user(current_user)
+ group.all_projects
+ .public_or_visible_to_user(current_user)
end
end
end
diff --git a/app/finders/packages/npm/package_finder.rb b/app/finders/packages/npm/package_finder.rb
index 2854226e178..04b124ddd83 100644
--- a/app/finders/packages/npm/package_finder.rb
+++ b/app/finders/packages/npm/package_finder.rb
@@ -2,29 +2,41 @@
module Packages
module Npm
class PackageFinder
- attr_reader :project, :package_name
-
delegate :find_by_version, to: :execute
+ delegate :last, to: :execute
- def initialize(project, package_name)
- @project = project
+ def initialize(package_name, project: nil, namespace: nil)
@package_name = package_name
+ @project = project
+ @namespace = namespace
end
def execute
- return Packages::Package.none unless project
-
- packages
+ base.npm
+ .with_name(@package_name)
+ .last_of_each_version
+ .preload_files
end
private
- def packages
- project.packages
- .npm
- .with_name(package_name)
- .last_of_each_version
- .preload_files
+ def base
+ if @project
+ packages_for_project
+ elsif @namespace
+ packages_for_namespace
+ else
+ ::Packages::Package.none
+ end
+ end
+
+ def packages_for_project
+ @project.packages
+ end
+
+ def packages_for_namespace
+ projects = ::Project.in_namespace(@namespace.self_and_descendants.select(:id))
+ ::Packages::Package.for_projects(projects.select(:id))
end
end
end
diff --git a/app/finders/projects/groups_finder.rb b/app/finders/projects/groups_finder.rb
new file mode 100644
index 00000000000..d0c42ad5611
--- /dev/null
+++ b/app/finders/projects/groups_finder.rb
@@ -0,0 +1,68 @@
+# frozen_string_literal: true
+
+# Used to filter ancestor and shared project's Groups by a set of params
+#
+# Arguments:
+# project
+# current_user - which user is requesting groups
+# params:
+# with_shared: boolean (optional)
+# shared_min_access_level: integer (optional)
+# skip_groups: array of integers (optional)
+#
+module Projects
+ class GroupsFinder < UnionFinder
+ def initialize(project:, current_user: nil, params: {})
+ @project = project
+ @current_user = current_user
+ @params = params
+ end
+
+ def execute
+ return Group.none unless authorized?
+
+ items = all_groups.map do |item|
+ item = exclude_group_ids(item)
+ item
+ end
+
+ find_union(items, Group).with_route.order_id_desc
+ end
+
+ private
+
+ attr_reader :project, :current_user, :params
+
+ def authorized?
+ Ability.allowed?(current_user, :read_project, project)
+ end
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def all_groups
+ groups = []
+ groups << project.group.self_and_ancestors if project.group
+
+ if params[:with_shared]
+ shared_groups = project.invited_groups
+
+ if params[:shared_min_access_level]
+ shared_groups = shared_groups.where(
+ 'project_group_links.group_access >= ?', params[:shared_min_access_level]
+ )
+ end
+
+ groups << shared_groups
+ end
+
+ groups << Group.none if groups.compact.empty?
+ groups
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ def exclude_group_ids(groups)
+ return groups unless params[:skip_groups]
+
+ groups.id_not_in(params[:skip_groups])
+ end
+ end
+end
diff --git a/app/finders/repositories/changelog_commits_finder.rb b/app/finders/repositories/changelog_commits_finder.rb
new file mode 100644
index 00000000000..b80b8e94e59
--- /dev/null
+++ b/app/finders/repositories/changelog_commits_finder.rb
@@ -0,0 +1,101 @@
+# frozen_string_literal: true
+
+module Repositories
+ # Finder for getting the commits to include in a changelog.
+ class ChangelogCommitsFinder
+ # The maximum number of commits to retrieve per page.
+ #
+ # This value is arbitrarily chosen. Lowering it means more Gitaly calls, but
+ # less data being loaded into memory at once. Increasing it has the opposite
+ # effect.
+ #
+ # This amount is based around the number of commits that usually go in a
+ # GitLab release. Some examples for GitLab's own releases:
+ #
+ # * 13.6.0: 4636 commits
+ # * 13.5.0: 5912 commits
+ # * 13.4.0: 5541 commits
+ #
+ # Using this limit should result in most (very large) projects only needing
+ # 5-10 Gitaly calls, while keeping memory usage at a reasonable amount.
+ COMMITS_PER_PAGE = 1024
+
+ # The regex to use for extracting the SHA of a reverted commit.
+ REVERT_REGEX = /^This reverts commit (?<sha>[0-9a-f]{40})/i.freeze
+
+ # The `project` argument specifies the project for which to obtain the
+ # commits.
+ #
+ # The `from` and `to` arguments specify the range of commits to include. The
+ # commit specified in `from` won't be included itself. The commit specified
+ # in `to` _is_ included.
+ #
+ # The `per_page` argument specifies how many commits are retrieved in a single
+ # Gitaly API call.
+ def initialize(project:, from:, to:, per_page: COMMITS_PER_PAGE)
+ @project = project
+ @from = from
+ @to = to
+ @per_page = per_page
+ end
+
+ # Fetches all commits that have the given trailer set.
+ #
+ # The commits are yielded to the supplied block in batches. This allows
+ # other code to process these commits in batches too, instead of first
+ # having to load all commits into memory.
+ #
+ # Example:
+ #
+ # ChangelogCommitsFinder.new(...).each_page('Changelog') do |commits|
+ # commits.each do |commit|
+ # ...
+ # end
+ # end
+ def each_page(trailer)
+ return to_enum(__method__, trailer) unless block_given?
+
+ offset = 0
+ reverted = Set.new
+ response = fetch_commits
+
+ while response.any?
+ commits = []
+
+ response.each do |commit|
+ # If the commit is reverted in the same range (by a newer commit), we
+ # won't include it. This works here because commits are processed in
+ # reverse order (= newer first).
+ next if reverted.include?(commit.id)
+
+ if (sha = revert_commit_sha(commit))
+ reverted << sha
+ end
+
+ commits.push(commit) if commit.trailers.key?(trailer)
+ end
+
+ yield commits
+
+ offset += response.length
+ response = fetch_commits(offset)
+ end
+ end
+
+ private
+
+ def fetch_commits(offset = 0)
+ range = "#{@from}..#{@to}"
+
+ @project
+ .repository
+ .commits(range, limit: @per_page, offset: offset, trailers: true)
+ end
+
+ def revert_commit_sha(commit)
+ matches = commit.description&.match(REVERT_REGEX)
+
+ matches[:sha] if matches
+ end
+ end
+end
diff --git a/app/finders/repositories/commits_with_trailer_finder.rb b/app/finders/repositories/commits_with_trailer_finder.rb
deleted file mode 100644
index 4bd643c345b..00000000000
--- a/app/finders/repositories/commits_with_trailer_finder.rb
+++ /dev/null
@@ -1,82 +0,0 @@
-# frozen_string_literal: true
-
-module Repositories
- # Finder for obtaining commits between two refs, with a Git trailer set.
- class CommitsWithTrailerFinder
- # The maximum number of commits to retrieve per page.
- #
- # This value is arbitrarily chosen. Lowering it means more Gitaly calls, but
- # less data being loaded into memory at once. Increasing it has the opposite
- # effect.
- #
- # This amount is based around the number of commits that usually go in a
- # GitLab release. Some examples for GitLab's own releases:
- #
- # * 13.6.0: 4636 commits
- # * 13.5.0: 5912 commits
- # * 13.4.0: 5541 commits
- #
- # Using this limit should result in most (very large) projects only needing
- # 5-10 Gitaly calls, while keeping memory usage at a reasonable amount.
- COMMITS_PER_PAGE = 1024
-
- # The `project` argument specifies the project for which to obtain the
- # commits.
- #
- # The `from` and `to` arguments specify the range of commits to include. The
- # commit specified in `from` won't be included itself. The commit specified
- # in `to` _is_ included.
- #
- # The `per_page` argument specifies how many commits are retrieved in a single
- # Gitaly API call.
- def initialize(project:, from:, to:, per_page: COMMITS_PER_PAGE)
- @project = project
- @from = from
- @to = to
- @per_page = per_page
- end
-
- # Fetches all commits that have the given trailer set.
- #
- # The commits are yielded to the supplied block in batches. This allows
- # other code to process these commits in batches too, instead of first
- # having to load all commits into memory.
- #
- # Example:
- #
- # CommitsWithTrailerFinder.new(...).each_page('Signed-off-by') do |commits|
- # commits.each do |commit|
- # ...
- # end
- # end
- def each_page(trailer)
- return to_enum(__method__, trailer) unless block_given?
-
- offset = 0
- response = fetch_commits
-
- while response.any?
- commits = []
-
- response.each do |commit|
- commits.push(commit) if commit.trailers.key?(trailer)
- end
-
- yield commits
-
- offset += response.length
- response = fetch_commits(offset)
- end
- end
-
- private
-
- def fetch_commits(offset = 0)
- range = "#{@from}..#{@to}"
-
- @project
- .repository
- .commits(range, limit: @per_page, offset: offset, trailers: true)
- end
- end
-end
diff --git a/app/finders/repositories/previous_tag_finder.rb b/app/finders/repositories/previous_tag_finder.rb
index 150a6332c29..b5e786c30e9 100644
--- a/app/finders/repositories/previous_tag_finder.rb
+++ b/app/finders/repositories/previous_tag_finder.rb
@@ -16,12 +16,13 @@ module Repositories
# This finder expects that all tags to consider meet the following
# requirements:
#
- # * They start with the letter "v"
- # * They use semantic versioning for the tag format
+ # * They start with the letter "v" followed by a version, or immediately start
+ # with a version
+ # * They use semantic versioning for the version format
#
# Tags not meeting these requirements are ignored.
class PreviousTagFinder
- TAG_REGEX = /\Av(?<version>#{Gitlab::Regex.unbounded_semver_regex})\z/.freeze
+ TAG_REGEX = /\Av?(?<version>#{Gitlab::Regex.unbounded_semver_regex})\z/.freeze
def initialize(project)
@project = project
@@ -36,6 +37,11 @@ module Repositories
next unless matches
+ # When using this class for generating changelog data for a range of
+ # commits, we want to compare against the tag of the last _stable_
+ # release; not some random RC that came after that.
+ next if matches[:prerelease]
+
version = matches[:version]
tags[version] = tag
versions << version
diff --git a/app/finders/security/license_compliance_jobs_finder.rb b/app/finders/security/license_compliance_jobs_finder.rb
index 100f94b2cc7..0ec428ae408 100644
--- a/app/finders/security/license_compliance_jobs_finder.rb
+++ b/app/finders/security/license_compliance_jobs_finder.rb
@@ -12,7 +12,7 @@
module Security
class LicenseComplianceJobsFinder < JobsFinder
def self.allowed_job_types
- [:license_management, :license_scanning]
+ [:license_scanning]
end
end
end
diff --git a/app/finders/template_finder.rb b/app/finders/template_finder.rb
index 36f8d144908..739beee236c 100644
--- a/app/finders/template_finder.rb
+++ b/app/finders/template_finder.rb
@@ -22,16 +22,26 @@ class TemplateFinder
end
end
+ # This is temporary and will be removed once we introduce group level inherited templates and
+ # remove the inherited_issuable_templates FF
+ def all_template_names_hash_or_array(project, issuable_type)
+ if project.inherited_issuable_templates_enabled?
+ all_template_names(project, issuable_type.pluralize)
+ else
+ all_template_names_array(project, issuable_type.pluralize)
+ end
+ end
+
def all_template_names(project, type)
return {} if !VENDORED_TEMPLATES.key?(type.to_s) && type.to_s != 'licenses'
build(type, project).template_names
end
- # This is issues and merge requests description templates only.
- # This will be removed once we introduce group level inherited templates
+ # This is for issues and merge requests description templates only.
+ # This will be removed once we introduce group level inherited templates and remove the inherited_issuable_templates FF
def all_template_names_array(project, type)
- all_template_names(project, type).values.flatten.uniq
+ all_template_names(project, type).values.flatten.select { |tmpl| tmpl[:project_id] == project.id }.compact.uniq
end
end
diff --git a/app/finders/users_finder.rb b/app/finders/users_finder.rb
index 42042406f3f..5ac905e0dd4 100644
--- a/app/finders/users_finder.rb
+++ b/app/finders/users_finder.rb
@@ -14,6 +14,7 @@
# active: boolean
# blocked: boolean
# external: boolean
+# non_external: boolean
# without_projects: boolean
# sort: string
# id: integer
@@ -40,6 +41,7 @@ class UsersFinder
users = by_active(users)
users = by_external_identity(users)
users = by_external(users)
+ users = by_non_external(users)
users = by_2fa(users)
users = by_created_at(users)
users = by_without_projects(users)
@@ -97,13 +99,18 @@ class UsersFinder
# rubocop: disable CodeReuse/ActiveRecord
def by_external(users)
- return users = users.where.not(external: true) unless current_user&.admin?
return users unless params[:external]
users.external
end
# rubocop: enable CodeReuse/ActiveRecord
+ def by_non_external(users)
+ return users unless params[:non_external]
+
+ users.non_external
+ end
+
def by_2fa(users)
case params[:two_factor]
when 'enabled'
diff --git a/app/graphql/gitlab_schema.rb b/app/graphql/gitlab_schema.rb
index d66a2333d11..7ab5dc36e4a 100644
--- a/app/graphql/gitlab_schema.rb
+++ b/app/graphql/gitlab_schema.rb
@@ -13,8 +13,6 @@ class GitlabSchema < GraphQL::Schema
use GraphQL::Pagination::Connections
use BatchLoader::GraphQL
use Gitlab::Graphql::Authorize
- use Gitlab::Graphql::Present
- use Gitlab::Graphql::CallsGitaly
use Gitlab::Graphql::Pagination::Connections
use Gitlab::Graphql::GenericTracing
use Gitlab::Graphql::Timeout, max_seconds: Gitlab.config.gitlab.graphql_timeout
diff --git a/app/graphql/mutations/boards/create.rb b/app/graphql/mutations/boards/create.rb
index 92bce557446..003c4f7761b 100644
--- a/app/graphql/mutations/boards/create.rb
+++ b/app/graphql/mutations/boards/create.rb
@@ -14,7 +14,7 @@ module Mutations
null: true,
description: 'The board after mutation.'
- authorize :admin_board
+ authorize :admin_issue_board
def resolve(args)
board_parent = authorized_resource_parent_find!(args)
@@ -22,7 +22,7 @@ module Mutations
response = ::Boards::CreateService.new(board_parent, current_user, args).execute
{
- board: response.payload,
+ board: response.success? ? response.payload : nil,
errors: response.errors
}
end
diff --git a/app/graphql/mutations/boards/destroy.rb b/app/graphql/mutations/boards/destroy.rb
index 8ec13b885d5..4a0068edee2 100644
--- a/app/graphql/mutations/boards/destroy.rb
+++ b/app/graphql/mutations/boards/destroy.rb
@@ -14,7 +14,7 @@ module Mutations
required: true,
description: 'The global ID of the board to destroy.'
- authorize :admin_board
+ authorize :admin_issue_board
def resolve(id:)
board = authorized_find!(id: id)
diff --git a/app/graphql/mutations/boards/issues/issue_move_list.rb b/app/graphql/mutations/boards/issues/issue_move_list.rb
index 91dfd9fc3e9..096ac89db1c 100644
--- a/app/graphql/mutations/boards/issues/issue_move_list.rb
+++ b/app/graphql/mutations/boards/issues/issue_move_list.rb
@@ -5,35 +5,38 @@ module Mutations
module Issues
class IssueMoveList < Mutations::Issues::Base
graphql_name 'IssueMoveList'
+ BoardGID = ::Types::GlobalIDType[::Board]
+ ListID = ::GraphQL::ID_TYPE
+ IssueID = ::GraphQL::ID_TYPE
- argument :board_id, GraphQL::ID_TYPE,
- required: true,
- loads: Types::BoardType,
- description: 'Global ID of the board that the issue is in.'
+ argument :board_id, BoardGID,
+ required: true,
+ loads: Types::BoardType,
+ description: 'Global ID of the board that the issue is in.'
argument :project_path, GraphQL::ID_TYPE,
- required: true,
- description: 'Project the issue to mutate is in.'
+ required: true,
+ description: 'Project the issue to mutate is in.'
argument :iid, GraphQL::STRING_TYPE,
- required: true,
- description: 'IID of the issue to mutate.'
+ required: true,
+ description: 'IID of the issue to mutate.'
- argument :from_list_id, GraphQL::ID_TYPE,
- required: false,
- description: 'ID of the board list that the issue will be moved from.'
+ argument :from_list_id, ListID,
+ required: false,
+ description: 'ID of the board list that the issue will be moved from.'
- argument :to_list_id, GraphQL::ID_TYPE,
- required: false,
- description: 'ID of the board list that the issue will be moved to.'
+ argument :to_list_id, ListID,
+ required: false,
+ description: 'ID of the board list that the issue will be moved to.'
- argument :move_before_id, GraphQL::ID_TYPE,
- required: false,
- description: 'ID of issue that should be placed before the current issue.'
+ argument :move_before_id, IssueID,
+ required: false,
+ description: 'ID of issue that should be placed before the current issue.'
- argument :move_after_id, GraphQL::ID_TYPE,
- required: false,
- description: 'ID of issue that should be placed after the current issue.'
+ argument :move_after_id, IssueID,
+ required: false,
+ description: 'ID of issue that should be placed after the current issue.'
def ready?(**args)
if move_arguments(args).blank?
@@ -83,7 +86,7 @@ module Mutations
end
def authorize_board!(board)
- return if Ability.allowed?(current_user, :read_board, board.resource_parent)
+ return if Ability.allowed?(current_user, :read_issue_board, board.resource_parent)
raise_resource_not_available_error!
end
diff --git a/app/graphql/mutations/boards/lists/create.rb b/app/graphql/mutations/boards/lists/create.rb
index f3aae9ac9c8..673fa95fc56 100644
--- a/app/graphql/mutations/boards/lists/create.rb
+++ b/app/graphql/mutations/boards/lists/create.rb
@@ -15,7 +15,7 @@ module Mutations
null: true,
description: 'Issue list in the issue board.'
- authorize :admin_list
+ authorize :admin_issue_board_list
private
diff --git a/app/graphql/mutations/boards/lists/destroy.rb b/app/graphql/mutations/boards/lists/destroy.rb
index 61ffae7c047..a50b5f73455 100644
--- a/app/graphql/mutations/boards/lists/destroy.rb
+++ b/app/graphql/mutations/boards/lists/destroy.rb
@@ -33,7 +33,7 @@ module Mutations
def can_admin_list?(list)
return false unless list.present?
- Ability.allowed?(current_user, :admin_list, list.board)
+ Ability.allowed?(current_user, :admin_issue_board_list, list.board)
end
end
end
diff --git a/app/graphql/mutations/boards/lists/update.rb b/app/graphql/mutations/boards/lists/update.rb
index d30d1d89bb2..504082ec22c 100644
--- a/app/graphql/mutations/boards/lists/update.rb
+++ b/app/graphql/mutations/boards/lists/update.rb
@@ -17,7 +17,7 @@ module Mutations
argument :collapsed, GraphQL::BOOLEAN_TYPE,
required: false,
- description: 'Indicates if list is collapsed for this user.'
+ description: 'Indicates if the list is collapsed for this user.'
field :list,
Types::BoardListType,
@@ -44,7 +44,7 @@ module Mutations
def can_read_list?(list)
return false unless list.present?
- Ability.allowed?(current_user, :read_list, list.board)
+ Ability.allowed?(current_user, :read_issue_board_list, list.board)
end
end
end
diff --git a/app/graphql/mutations/boards/update.rb b/app/graphql/mutations/boards/update.rb
index b4f8179829e..628b3a3fadb 100644
--- a/app/graphql/mutations/boards/update.rb
+++ b/app/graphql/mutations/boards/update.rb
@@ -17,7 +17,7 @@ module Mutations
null: true,
description: 'The board after mutation.'
- authorize :admin_board
+ authorize :admin_issue_board
def resolve(id:, **args)
board = authorized_find!(id: id)
diff --git a/app/graphql/mutations/branches/create.rb b/app/graphql/mutations/branches/create.rb
index 6354976f1ea..a94d3966258 100644
--- a/app/graphql/mutations/branches/create.rb
+++ b/app/graphql/mutations/branches/create.rb
@@ -30,8 +30,6 @@ module Mutations
def resolve(project_path:, name:, ref:)
project = authorized_find!(project_path)
- context.scoped_set!(:branch_project, project)
-
result = ::Branches::CreateService.new(project, current_user)
.execute(name, ref)
diff --git a/app/graphql/mutations/concerns/mutations/can_mutate_spammable.rb b/app/graphql/mutations/concerns/mutations/can_mutate_spammable.rb
index 2d4983f0d6e..ba644eff36c 100644
--- a/app/graphql/mutations/concerns/mutations/can_mutate_spammable.rb
+++ b/app/graphql/mutations/concerns/mutations/can_mutate_spammable.rb
@@ -5,6 +5,7 @@ module Mutations
# and optionally support the workflow to allow clients to display and solve CAPTCHAs.
module CanMutateSpammable
extend ActiveSupport::Concern
+ include Spam::Concerns::HasSpamActionResponseFields
# NOTE: The arguments and fields are intentionally named with 'captcha' instead of 'recaptcha',
# so that they can be applied to future alternative CAPTCHA implementations other than
@@ -59,25 +60,5 @@ module Mutations
request: context[:request]
}
end
-
- # with_spam_action_fields(spammable) { {other_fields: true} } -> hash
- #
- # Takes a Spammable and a block as arguments.
- #
- # The block passed should be a hash, which the spam action fields will be merged into.
- def with_spam_action_fields(spammable)
- spam_action_fields = {
- spam: spammable.spam?,
- # NOTE: These fields are intentionally named with 'captcha' instead of 'recaptcha', so
- # that they can be applied to future alternative CAPTCHA implementations other than
- # reCAPTCHA (such as FriendlyCaptcha) without having to change the response field name
- # in the API.
- needs_captcha_response: spammable.render_recaptcha?,
- spam_log_id: spammable.spam_log&.id,
- captcha_site_key: Gitlab::CurrentSettings.recaptcha_site_key
- }
-
- yield.merge(spam_action_fields)
- end
end
end
diff --git a/app/graphql/mutations/custom_emoji/create.rb b/app/graphql/mutations/custom_emoji/create.rb
index 9ec96be0f26..5cf54f8f877 100644
--- a/app/graphql/mutations/custom_emoji/create.rb
+++ b/app/graphql/mutations/custom_emoji/create.rb
@@ -31,6 +31,7 @@ module Mutations
group = authorized_find!(group_path: group_path)
# See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/37911#note_444682238
args[:external] = true
+ args[:creator] = current_user
custom_emoji = group.custom_emoji.create(args)
diff --git a/app/graphql/mutations/merge_requests/accept.rb b/app/graphql/mutations/merge_requests/accept.rb
new file mode 100644
index 00000000000..540be7098ac
--- /dev/null
+++ b/app/graphql/mutations/merge_requests/accept.rb
@@ -0,0 +1,88 @@
+# frozen_string_literal: true
+
+module Mutations
+ module MergeRequests
+ class Accept < Base
+ NOT_MERGEABLE = 'This branch cannot be merged'
+ HOOKS_VALIDATION_ERROR = 'Pre-merge hooks failed'
+ SHA_MISMATCH = 'The merge-head is not at the anticipated SHA'
+ MERGE_FAILED = 'The merge failed'
+ ALREADY_SCHEDULED = 'The merge request is already scheduled to be merged'
+
+ graphql_name 'MergeRequestAccept'
+ authorize :accept_merge_request
+ description <<~DESC
+ Accepts a merge request.
+ When accepted, the source branch will be merged into the target branch, either
+ immediately if possible, or using one of the automatic merge strategies.
+ DESC
+
+ argument :strategy,
+ ::Types::MergeStrategyEnum,
+ required: false,
+ as: :auto_merge_strategy,
+ description: 'How to merge this merge request.'
+
+ argument :commit_message, ::GraphQL::STRING_TYPE,
+ required: false,
+ description: 'Custom merge commit message.'
+ argument :squash_commit_message, ::GraphQL::STRING_TYPE,
+ required: false,
+ description: 'Custom squash commit message (if squash is true).'
+ argument :sha, ::GraphQL::STRING_TYPE,
+ required: true,
+ description: 'The HEAD SHA at the time when this merge was requested.'
+
+ argument :should_remove_source_branch, ::GraphQL::BOOLEAN_TYPE,
+ required: false,
+ description: 'Should the source branch be removed.'
+ argument :squash, ::GraphQL::BOOLEAN_TYPE,
+ required: false,
+ default_value: false,
+ description: 'Squash commits on the source branch before merge.'
+
+ def resolve(project_path:, iid:, **args)
+ Gitlab::QueryLimiting.whitelist('https://gitlab.com/gitlab-org/gitlab-foss/issues/42317')
+ merge_request = authorized_find!(project_path: project_path, iid: iid)
+ project = merge_request.target_project
+ merge_params = args.compact.with_indifferent_access
+ merge_service = ::MergeRequests::MergeService.new(project, current_user, merge_params)
+
+ if error = validate(merge_request, merge_service, merge_params)
+ return { merge_request: merge_request, errors: [error] }
+ end
+
+ merge_request.update(merge_error: nil, squash: merge_params[:squash])
+
+ result = if merge_params.key?(:auto_merge_strategy)
+ service = AutoMergeService.new(project, current_user, merge_params)
+ service.execute(merge_request, merge_params[:auto_merge_strategy])
+ else
+ merge_service.execute(merge_request)
+ end
+
+ {
+ merge_request: merge_request,
+ errors: result == :failed ? [MERGE_FAILED] : []
+ }
+ rescue ::MergeRequests::MergeBaseService::MergeError => e
+ {
+ merge_request: merge_request,
+ errors: [e.message]
+ }
+ end
+
+ def validate(merge_request, merge_service, merge_params)
+ if merge_request.auto_merge_enabled?
+ ALREADY_SCHEDULED
+ elsif !merge_request.mergeable?(skip_ci_check: merge_params.key?(:auto_merge_strategy))
+ NOT_MERGEABLE
+ elsif !merge_service.hooks_validation_pass?(merge_request)
+ HOOKS_VALIDATION_ERROR
+ elsif merge_params[:sha] != merge_request.diff_head_sha
+ SHA_MISMATCH
+ end
+ end
+ end
+ end
+end
diff --git a/app/graphql/mutations/merge_requests/set_wip.rb b/app/graphql/mutations/merge_requests/set_wip.rb
index 0b5c20de377..beb042ce93f 100644
--- a/app/graphql/mutations/merge_requests/set_wip.rb
+++ b/app/graphql/mutations/merge_requests/set_wip.rb
@@ -9,7 +9,7 @@ module Mutations
GraphQL::BOOLEAN_TYPE,
required: true,
description: <<~DESC
- Whether or not to set the merge request as a WIP.
+ Whether or not to set the merge request as a draft.
DESC
def resolve(project_path:, iid:, wip: nil)
diff --git a/app/graphql/mutations/notes/create/diff_note.rb b/app/graphql/mutations/notes/create/diff_note.rb
index 9b5f3092006..019e7cb8623 100644
--- a/app/graphql/mutations/notes/create/diff_note.rb
+++ b/app/graphql/mutations/notes/create/diff_note.rb
@@ -11,6 +11,22 @@ module Mutations
required: true,
description: copy_field_description(Types::Notes::NoteType, :position)
+ def ready?(**args)
+ # As both arguments are optional, validate here that one of the
+ # arguments are present.
+ #
+ # This may be able to be done using InputUnions in the future
+ # if this RFC is merged:
+ # https://github.com/graphql/graphql-spec/blob/master/rfcs/InputUnion.md
+
+ if args[:position].to_hash.values_at(:old_line, :new_line).compact.blank?
+ raise Gitlab::Graphql::Errors::ArgumentError,
+ 'position oldLine or newLine arguments are required'
+ end
+
+ super(**args)
+ end
+
private
def create_note_params(noteable, args)
diff --git a/app/graphql/mutations/notes/update/base.rb b/app/graphql/mutations/notes/update/base.rb
index 4edb7429b97..571001981a4 100644
--- a/app/graphql/mutations/notes/update/base.rb
+++ b/app/graphql/mutations/notes/update/base.rb
@@ -6,12 +6,18 @@ module Mutations
# This is a Base class for the Note update mutations and is not
# mounted as a GraphQL mutation itself.
class Base < Mutations::Notes::Base
+ QUICK_ACTION_ONLY_WARNING = <<~NB
+ If the body of the Note contains only quick actions,
+ the Note will be destroyed during the update, and no Note will be
+ returned.
+ NB
+
authorize :admin_note
argument :id,
- ::Types::GlobalIDType[::Note],
- required: true,
- description: 'The global ID of the note to update.'
+ ::Types::GlobalIDType[::Note],
+ required: true,
+ description: 'The global ID of the note to update.'
def resolve(args)
note = authorized_find!(id: args[:id])
diff --git a/app/graphql/mutations/notes/update/image_diff_note.rb b/app/graphql/mutations/notes/update/image_diff_note.rb
index f4533cd9edb..6160ee03f4e 100644
--- a/app/graphql/mutations/notes/update/image_diff_note.rb
+++ b/app/graphql/mutations/notes/update/image_diff_note.rb
@@ -5,16 +5,20 @@ module Mutations
module Update
class ImageDiffNote < Mutations::Notes::Update::Base
graphql_name 'UpdateImageDiffNote'
+ description <<~DESC
+ Updates a DiffNote on an image (a `Note` where the `position.positionType` is `"image"`).
+ #{QUICK_ACTION_ONLY_WARNING}
+ DESC
argument :body,
- GraphQL::STRING_TYPE,
- required: false,
- description: copy_field_description(Types::Notes::NoteType, :body)
+ GraphQL::STRING_TYPE,
+ required: false,
+ description: copy_field_description(Types::Notes::NoteType, :body)
argument :position,
- Types::Notes::UpdateDiffImagePositionInputType,
- required: false,
- description: copy_field_description(Types::Notes::NoteType, :position)
+ Types::Notes::UpdateDiffImagePositionInputType,
+ required: false,
+ description: copy_field_description(Types::Notes::NoteType, :position)
def ready?(**args)
# As both arguments are optional, validate here that one of the
@@ -34,10 +38,9 @@ module Mutations
private
def pre_update_checks!(note, _args)
- unless note.is_a?(DiffNote) && note.position.on_image?
- raise Gitlab::Graphql::Errors::ResourceNotAvailable,
- 'Resource is not an ImageDiffNote'
- end
+ return if note.is_a?(DiffNote) && note.position.on_image?
+
+ raise Gitlab::Graphql::Errors::ResourceNotAvailable, 'Resource is not an ImageDiffNote'
end
def note_params(note, args)
diff --git a/app/graphql/mutations/notes/update/note.rb b/app/graphql/mutations/notes/update/note.rb
index 73b9b9bc49a..11d8c6e2cb9 100644
--- a/app/graphql/mutations/notes/update/note.rb
+++ b/app/graphql/mutations/notes/update/note.rb
@@ -5,16 +5,17 @@ module Mutations
module Update
class Note < Mutations::Notes::Update::Base
graphql_name 'UpdateNote'
+ description "Updates a Note.\n#{QUICK_ACTION_ONLY_WARNING}"
argument :body,
- GraphQL::STRING_TYPE,
- required: false,
- description: copy_field_description(Types::Notes::NoteType, :body)
+ GraphQL::STRING_TYPE,
+ required: false,
+ description: copy_field_description(Types::Notes::NoteType, :body)
argument :confidential,
- GraphQL::BOOLEAN_TYPE,
- required: false,
- description: 'The confidentiality flag of a note. Default is false.'
+ GraphQL::BOOLEAN_TYPE,
+ required: false,
+ description: 'The confidentiality flag of a note. Default is false.'
private
diff --git a/app/graphql/mutations/release_asset_links/base.rb b/app/graphql/mutations/release_asset_links/base.rb
new file mode 100644
index 00000000000..3e71cec183b
--- /dev/null
+++ b/app/graphql/mutations/release_asset_links/base.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+module Mutations
+ module ReleaseAssetLinks
+ class Base < BaseMutation
+ include FindsProject
+
+ argument :project_path, GraphQL::ID_TYPE,
+ required: true,
+ description: 'Full path of the project the asset link is associated with.'
+
+ argument :tag_name, GraphQL::STRING_TYPE,
+ required: true, as: :tag,
+ description: "Name of the associated release's tag."
+ end
+ end
+end
diff --git a/app/graphql/mutations/release_asset_links/create.rb b/app/graphql/mutations/release_asset_links/create.rb
new file mode 100644
index 00000000000..cd9acf3f4cb
--- /dev/null
+++ b/app/graphql/mutations/release_asset_links/create.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+module Mutations
+ module ReleaseAssetLinks
+ class Create < Base
+ graphql_name 'ReleaseAssetLinkCreate'
+
+ authorize :create_release
+
+ include Types::ReleaseAssetLinkSharedInputArguments
+
+ field :link,
+ Types::ReleaseAssetLinkType,
+ null: true,
+ description: 'The asset link after mutation.'
+
+ def resolve(project_path:, tag:, **link_attrs)
+ project = authorized_find!(project_path)
+ release = project.releases.find_by_tag(tag)
+
+ if release.nil?
+ message = _('Release with tag "%{tag}" was not found') % { tag: tag }
+ return { link: nil, errors: [message] }
+ end
+
+ new_link = release.links.create(link_attrs)
+
+ unless new_link.persisted?
+ return { link: nil, errors: new_link.errors.full_messages }
+ end
+
+ { link: new_link, errors: [] }
+ end
+ end
+ end
+end
diff --git a/app/graphql/mutations/snippets/create.rb b/app/graphql/mutations/snippets/create.rb
index 73eac9f0f3b..7f2dd448b8b 100644
--- a/app/graphql/mutations/snippets/create.rb
+++ b/app/graphql/mutations/snippets/create.rb
@@ -56,7 +56,7 @@ module Mutations
end
snippet = service_response.payload[:snippet]
- with_spam_action_fields(snippet) do
+ with_spam_action_response_fields(snippet) do
{
snippet: service_response.success? ? snippet : nil,
errors: errors_on_object(snippet)
diff --git a/app/graphql/mutations/snippets/update.rb b/app/graphql/mutations/snippets/update.rb
index af8e6f384b7..9f9f8bca848 100644
--- a/app/graphql/mutations/snippets/update.rb
+++ b/app/graphql/mutations/snippets/update.rb
@@ -45,7 +45,7 @@ module Mutations
end
snippet = service_response.payload[:snippet]
- with_spam_action_fields(snippet) do
+ with_spam_action_response_fields(snippet) do
{
snippet: service_response.success? ? snippet : snippet.reset,
errors: errors_on_object(snippet)
diff --git a/app/graphql/mutations/todos/restore_many.rb b/app/graphql/mutations/todos/restore_many.rb
index dc02ffadada..41ccbd77aa6 100644
--- a/app/graphql/mutations/todos/restore_many.rb
+++ b/app/graphql/mutations/todos/restore_many.rb
@@ -60,7 +60,7 @@ module Mutations
def authorized_find_all_pending_by_current_user(ids)
return Todo.none if ids.blank? || current_user.nil?
- Todo.for_ids(ids).for_user(current_user).done
+ Todo.id_in(ids).for_user(current_user).done
end
def restore(todos)
diff --git a/app/graphql/mutations/user_callouts/create.rb b/app/graphql/mutations/user_callouts/create.rb
new file mode 100644
index 00000000000..0d3dcacda41
--- /dev/null
+++ b/app/graphql/mutations/user_callouts/create.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+module Mutations
+ module UserCallouts
+ class Create < ::Mutations::BaseMutation
+ graphql_name 'UserCalloutCreate'
+
+ argument :feature_name,
+ GraphQL::STRING_TYPE,
+ required: true,
+ description: "The feature name you want to dismiss the callout for."
+
+ field :user_callout, Types::UserCalloutType,
+ null: false,
+ description: 'The user callout dismissed.'
+
+ def resolve(feature_name:)
+ callout = Users::DismissUserCalloutService.new(
+ container: nil, current_user: current_user, params: { feature_name: feature_name }
+ ).execute
+ errors = errors_on_object(callout)
+
+ {
+ user_callout: callout,
+ errors: errors
+ }
+ end
+ end
+ end
+end
diff --git a/app/graphql/resolvers/admin/analytics/instance_statistics/measurements_resolver.rb b/app/graphql/resolvers/admin/analytics/instance_statistics/measurements_resolver.rb
deleted file mode 100644
index 9df07df24d8..00000000000
--- a/app/graphql/resolvers/admin/analytics/instance_statistics/measurements_resolver.rb
+++ /dev/null
@@ -1,47 +0,0 @@
-# frozen_string_literal: true
-
-module Resolvers
- module Admin
- module Analytics
- module InstanceStatistics
- class MeasurementsResolver < BaseResolver
- include Gitlab::Graphql::Authorize::AuthorizeResource
-
- type Types::Admin::Analytics::InstanceStatistics::MeasurementType, null: true
-
- argument :identifier, Types::Admin::Analytics::InstanceStatistics::MeasurementIdentifierEnum,
- required: true,
- description: 'The type of measurement/statistics to retrieve.'
-
- argument :recorded_after, Types::TimeType,
- required: false,
- description: 'Measurement recorded after this date.'
-
- argument :recorded_before, Types::TimeType,
- required: false,
- description: 'Measurement recorded before this date.'
-
- def resolve(identifier:, recorded_before: nil, recorded_after: nil)
- authorize!
-
- ::Analytics::InstanceStatistics::Measurement
- .recorded_after(recorded_after)
- .recorded_before(recorded_before)
- .with_identifier(identifier)
- .order_by_latest
- end
-
- private
-
- def authorize!
- admin? || raise_resource_not_available_error!
- end
-
- def admin?
- context[:current_user].present? && context[:current_user].admin?
- end
- end
- end
- end
- end
-end
diff --git a/app/graphql/resolvers/admin/analytics/usage_trends/measurements_resolver.rb b/app/graphql/resolvers/admin/analytics/usage_trends/measurements_resolver.rb
new file mode 100644
index 00000000000..a5f81149d4e
--- /dev/null
+++ b/app/graphql/resolvers/admin/analytics/usage_trends/measurements_resolver.rb
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+
+module Resolvers
+ module Admin
+ module Analytics
+ module UsageTrends
+ class MeasurementsResolver < BaseResolver
+ include Gitlab::Graphql::Authorize::AuthorizeResource
+
+ type Types::Admin::Analytics::UsageTrends::MeasurementType, null: true
+
+ argument :identifier, Types::Admin::Analytics::UsageTrends::MeasurementIdentifierEnum,
+ required: true,
+ description: 'The type of measurement/statistics to retrieve.'
+
+ argument :recorded_after, Types::TimeType,
+ required: false,
+ description: 'Measurement recorded after this date.'
+
+ argument :recorded_before, Types::TimeType,
+ required: false,
+ description: 'Measurement recorded before this date.'
+
+ def resolve(identifier:, recorded_before: nil, recorded_after: nil)
+ authorize!
+
+ ::Analytics::UsageTrends::Measurement
+ .recorded_after(recorded_after)
+ .recorded_before(recorded_before)
+ .with_identifier(identifier)
+ .order_by_latest
+ end
+
+ private
+
+ def authorize!
+ admin? || raise_resource_not_available_error!
+ end
+
+ def admin?
+ context[:current_user].present? && context[:current_user].admin?
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/app/graphql/resolvers/alert_management/alert_resolver.rb b/app/graphql/resolvers/alert_management/alert_resolver.rb
index d60cabde62b..008641ed88a 100644
--- a/app/graphql/resolvers/alert_management/alert_resolver.rb
+++ b/app/graphql/resolvers/alert_management/alert_resolver.rb
@@ -43,7 +43,8 @@ module Resolvers
def preloads
{
assignees: [:assignees],
- notes: [:ordered_notes, { ordered_notes: [:system_note_metadata, :project, :noteable] }]
+ notes: [:ordered_notes, { ordered_notes: [:system_note_metadata, :project, :noteable] }],
+ issue: [:issue]
}
end
end
diff --git a/app/graphql/resolvers/alert_management/http_integrations_resolver.rb b/app/graphql/resolvers/alert_management/http_integrations_resolver.rb
new file mode 100644
index 00000000000..94a72bca7c7
--- /dev/null
+++ b/app/graphql/resolvers/alert_management/http_integrations_resolver.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+module Resolvers
+ module AlertManagement
+ class HttpIntegrationsResolver < BaseResolver
+ alias_method :project, :synchronized_object
+
+ type Types::AlertManagement::HttpIntegrationType.connection_type, null: true
+
+ def resolve(**args)
+ http_integrations
+ end
+
+ private
+
+ def http_integrations
+ return [] unless Ability.allowed?(current_user, :admin_operations, project)
+
+ ::AlertManagement::HttpIntegrationsFinder.new(project, {}).execute
+ end
+ end
+ end
+end
diff --git a/app/graphql/resolvers/base_resolver.rb b/app/graphql/resolvers/base_resolver.rb
index 5db618254cb..67bba079512 100644
--- a/app/graphql/resolvers/base_resolver.rb
+++ b/app/graphql/resolvers/base_resolver.rb
@@ -12,8 +12,17 @@ module Resolvers
@requires_argument = true
end
+ def self.calls_gitaly!
+ @calls_gitaly = true
+ end
+
def self.field_options
- super.merge(requires_argument: @requires_argument)
+ extra_options = {
+ requires_argument: @requires_argument,
+ calls_gitaly: @calls_gitaly
+ }.compact
+
+ super.merge(extra_options)
end
def self.singular_type
diff --git a/app/graphql/resolvers/board_lists_resolver.rb b/app/graphql/resolvers/board_lists_resolver.rb
index a97ac3220d5..e66f7b97b40 100644
--- a/app/graphql/resolvers/board_lists_resolver.rb
+++ b/app/graphql/resolvers/board_lists_resolver.rb
@@ -9,7 +9,7 @@ module Resolvers
type Types::BoardListType, null: true
extras [:lookahead]
- authorize :read_list
+ authorize :read_issue_board_list
argument :id, Types::GlobalIDType[List],
required: false,
diff --git a/app/graphql/resolvers/board_resolver.rb b/app/graphql/resolvers/board_resolver.rb
index 2c2922c3fbf..637d690e4cd 100644
--- a/app/graphql/resolvers/board_resolver.rb
+++ b/app/graphql/resolvers/board_resolver.rb
@@ -13,7 +13,7 @@ module Resolvers
def resolve(id: nil)
return unless parent
- ::Boards::ListService.new(parent, context[:current_user], board_id: extract_board_id(id)).execute.first
+ ::Boards::BoardsFinder.new(parent, context[:current_user], board_id: extract_board_id(id)).execute.first
rescue ActiveRecord::RecordNotFound
nil
end
diff --git a/app/graphql/resolvers/boards_resolver.rb b/app/graphql/resolvers/boards_resolver.rb
index be2f22175dc..679f2b4cceb 100644
--- a/app/graphql/resolvers/boards_resolver.rb
+++ b/app/graphql/resolvers/boards_resolver.rb
@@ -16,7 +16,7 @@ module Resolvers
return Board.none unless parent
- ::Boards::ListService.new(parent, context[:current_user], board_id: extract_board_id(id)).execute
+ ::Boards::BoardsFinder.new(parent, context[:current_user], board_id: extract_board_id(id)).execute
rescue ActiveRecord::RecordNotFound
Board.none
end
diff --git a/app/graphql/resolvers/branch_commit_resolver.rb b/app/graphql/resolvers/branch_commit_resolver.rb
index 11c49e17bc5..4f6062a4781 100644
--- a/app/graphql/resolvers/branch_commit_resolver.rb
+++ b/app/graphql/resolvers/branch_commit_resolver.rb
@@ -10,8 +10,9 @@ module Resolvers
return unless branch
commit = branch.dereferenced_target
+ project = Project.find_by_full_path(commit.repository.gl_project_path)
- ::Commit.new(commit, context[:branch_project]) if commit
+ ::Commit.new(commit, project) if commit
end
end
end
diff --git a/app/graphql/resolvers/ci/config_resolver.rb b/app/graphql/resolvers/ci/config_resolver.rb
index 852bb47e215..f8670649e48 100644
--- a/app/graphql/resolvers/ci/config_resolver.rb
+++ b/app/graphql/resolvers/ci/config_resolver.rb
@@ -16,7 +16,7 @@ module Resolvers
argument :content, GraphQL::STRING_TYPE,
required: true,
- description: "Contents of '.gitlab-ci.yml'."
+ description: "Contents of `.gitlab-ci.yml`."
argument :dry_run, GraphQL::BOOLEAN_TYPE,
required: false,
diff --git a/app/graphql/resolvers/concerns/resolves_snippets.rb b/app/graphql/resolvers/concerns/resolves_snippets.rb
index 0bc38188b9a..445f3567b1d 100644
--- a/app/graphql/resolvers/concerns/resolves_snippets.rb
+++ b/app/graphql/resolvers/concerns/resolves_snippets.rb
@@ -8,7 +8,7 @@ module ResolvesSnippets
argument :ids, [::Types::GlobalIDType[::Snippet]],
required: false,
- description: 'Array of global snippet ids, e.g., "gid://gitlab/ProjectSnippet/1".'
+ description: 'Array of global snippet IDs. For example, `gid://gitlab/ProjectSnippet/1`.'
argument :visibility, Types::Snippets::VisibilityScopesEnum,
required: false,
diff --git a/app/graphql/resolvers/full_path_resolver.rb b/app/graphql/resolvers/full_path_resolver.rb
index d01cdf749a1..b5e90da78b2 100644
--- a/app/graphql/resolvers/full_path_resolver.rb
+++ b/app/graphql/resolvers/full_path_resolver.rb
@@ -7,7 +7,7 @@ module Resolvers
prepended do
argument :full_path, GraphQL::ID_TYPE,
required: true,
- description: 'The full path of the project, group or namespace, e.g., "gitlab-org/gitlab-foss".'
+ description: 'The full path of the project, group or namespace, e.g., `gitlab-org/gitlab-foss`.'
end
def model_by_full_path(model, full_path)
diff --git a/app/graphql/resolvers/group_packages_resolver.rb b/app/graphql/resolvers/group_packages_resolver.rb
new file mode 100644
index 00000000000..d441cd80249
--- /dev/null
+++ b/app/graphql/resolvers/group_packages_resolver.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+module Resolvers
+ class GroupPackagesResolver < BaseResolver
+ type Types::Packages::PackageType.connection_type, null: true
+
+ def ready?(**args)
+ context[self.class] ||= { executions: 0 }
+ context[self.class][:executions] += 1
+ raise GraphQL::ExecutionError, "Packages can be requested only for one group at a time" if context[self.class][:executions] > 1
+
+ super
+ end
+
+ def resolve(**args)
+ return unless packages_available?
+
+ ::Packages::GroupPackagesFinder.new(current_user, object).execute
+ end
+
+ private
+
+ def packages_available?
+ ::Gitlab.config.packages.enabled
+ end
+ end
+end
diff --git a/app/graphql/resolvers/last_commit_resolver.rb b/app/graphql/resolvers/last_commit_resolver.rb
index dd89c322617..00c43bdfee6 100644
--- a/app/graphql/resolvers/last_commit_resolver.rb
+++ b/app/graphql/resolvers/last_commit_resolver.rb
@@ -4,6 +4,8 @@ module Resolvers
class LastCommitResolver < BaseResolver
type Types::CommitType, null: true
+ calls_gitaly!
+
alias_method :tree, :object
def resolve(**args)
diff --git a/app/graphql/resolvers/metrics/dashboard_resolver.rb b/app/graphql/resolvers/metrics/dashboard_resolver.rb
index f569cb0b2c3..a82a4a95254 100644
--- a/app/graphql/resolvers/metrics/dashboard_resolver.rb
+++ b/app/graphql/resolvers/metrics/dashboard_resolver.rb
@@ -3,19 +3,30 @@
module Resolvers
module Metrics
class DashboardResolver < Resolvers::BaseResolver
+ type Types::Metrics::DashboardType, null: true
+ calls_gitaly!
+
argument :path, GraphQL::STRING_TYPE,
required: true,
- description: "Path to a file which defines metrics dashboard eg: 'config/prometheus/common_metrics.yml'."
-
- type Types::Metrics::DashboardType, null: true
+ description: "Path to a file which defines metrics dashboard " \
+ "eg: 'config/prometheus/common_metrics.yml'."
alias_method :environment, :object
def resolve(**args)
return unless environment
- ::PerformanceMonitoring::PrometheusDashboard
- .find_for(project: environment.project, user: context[:current_user], path: args[:path], options: { environment: environment })
+ ::PerformanceMonitoring::PrometheusDashboard.find_for(**args, **service_params)
+ end
+
+ private
+
+ def service_params
+ {
+ project: environment.project,
+ user: current_user,
+ options: { environment: environment }
+ }
end
end
end
diff --git a/app/graphql/resolvers/namespace_projects_resolver.rb b/app/graphql/resolvers/namespace_projects_resolver.rb
index da44b9b5623..7320c3ce141 100644
--- a/app/graphql/resolvers/namespace_projects_resolver.rb
+++ b/app/graphql/resolvers/namespace_projects_resolver.rb
@@ -17,23 +17,23 @@ module Resolvers
default_value: nil,
description: 'Sort projects by this criteria.'
+ argument :ids, [GraphQL::ID_TYPE],
+ required: false,
+ default_value: nil,
+ description: 'Filter projects by IDs.'
+
type Types::ProjectType, null: true
- def resolve(include_subgroups:, sort:, search:)
+ def resolve(args)
# The namespace could have been loaded in batch by `BatchLoader`.
# At this point we need the `id` or the `full_path` of the namespace
# to query for projects, so make sure it's loaded and not `nil` before continuing.
- return Project.none if namespace.nil?
-
- query = include_subgroups ? namespace.all_projects.with_route : namespace.projects.with_route
- return query unless search.present?
-
- if sort == :similarity
- query.sorted_by_similarity_desc(search, include_in_select: true).merge(Project.search(search))
- else
- query.merge(Project.search(search))
- end
+ ::Namespaces::ProjectsFinder.new(
+ namespace: namespace,
+ current_user: current_user,
+ params: finder_params(args)
+ ).execute
end
def self.resolver_complexity(args, child_complexity:)
@@ -48,6 +48,19 @@ module Resolvers
object.respond_to?(:sync) ? object.sync : object
end
end
+
+ def finder_params(args)
+ {
+ include_subgroups: args.dig(:include_subgroups),
+ sort: args.dig(:sort),
+ search: args.dig(:search),
+ ids: parse_gids(args.dig(:ids))
+ }
+ end
+
+ def parse_gids(gids)
+ gids&.map { |gid| GitlabSchema.parse_gid(gid, expected_type: ::Project).model_id }
+ end
end
end
diff --git a/app/graphql/resolvers/packages_resolver.rb b/app/graphql/resolvers/packages_resolver.rb
deleted file mode 100644
index 3eeed48ff7e..00000000000
--- a/app/graphql/resolvers/packages_resolver.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-module Resolvers
- class PackagesResolver < BaseResolver
- type Types::Packages::PackageType.connection_type, null: true
-
- def resolve(**args)
- return unless packages_available?
-
- ::Packages::PackagesFinder.new(object).execute
- end
-
- private
-
- def packages_available?
- ::Gitlab.config.packages.enabled
- end
- end
-end
diff --git a/app/graphql/resolvers/project_merge_requests_resolver.rb b/app/graphql/resolvers/project_merge_requests_resolver.rb
index 9628a6dfd7a..66c020a0c14 100644
--- a/app/graphql/resolvers/project_merge_requests_resolver.rb
+++ b/app/graphql/resolvers/project_merge_requests_resolver.rb
@@ -10,7 +10,7 @@ module Resolvers
def resolve(**args)
scope = super
- if only_count_is_selected_with_merged_at_filter?(args) && Feature.enabled?(:optimized_merge_request_count_with_merged_at_filter, default_enabled: :yaml)
+ if only_count_is_selected_with_merged_at_filter?(args)
MergeRequest::MetricsFinder
.new(current_user, args.merge(target_project: project))
.execute
diff --git a/app/graphql/resolvers/project_packages_resolver.rb b/app/graphql/resolvers/project_packages_resolver.rb
new file mode 100644
index 00000000000..288e14b41d0
--- /dev/null
+++ b/app/graphql/resolvers/project_packages_resolver.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module Resolvers
+ class ProjectPackagesResolver < BaseResolver
+ type Types::Packages::PackageType.connection_type, null: true
+
+ def resolve(**args)
+ return unless packages_available?
+
+ ::Packages::PackagesFinder.new(object).execute
+ end
+
+ private
+
+ def packages_available?
+ ::Gitlab.config.packages.enabled
+ end
+ end
+end
diff --git a/app/graphql/resolvers/project_pipeline_resolver.rb b/app/graphql/resolvers/project_pipeline_resolver.rb
index b604a408928..8fca6b829c0 100644
--- a/app/graphql/resolvers/project_pipeline_resolver.rb
+++ b/app/graphql/resolvers/project_pipeline_resolver.rb
@@ -7,14 +7,34 @@ module Resolvers
alias_method :project, :object
argument :iid, GraphQL::ID_TYPE,
- required: true,
- description: 'IID of the Pipeline, e.g., "1".'
+ required: false,
+ description: 'IID of the Pipeline. For example, "1".'
- def resolve(iid:)
- BatchLoader::GraphQL.for(iid).batch(key: project) do |iids, loader, args|
- finder = ::Ci::PipelinesFinder.new(project, context[:current_user], iids: iids)
+ argument :sha, GraphQL::STRING_TYPE,
+ required: false,
+ description: 'SHA of the Pipeline. For example, "dyd0f15ay83993f5ab66k927w28673882x99100b".'
- finder.execute.each { |pipeline| loader.call(pipeline.iid.to_s, pipeline) }
+ def ready?(iid: nil, sha: nil)
+ unless iid.present? ^ sha.present?
+ raise Gitlab::Graphql::Errors::ArgumentError, 'Provide one of an IID or SHA'
+ end
+
+ super
+ end
+
+ def resolve(iid: nil, sha: nil)
+ if iid
+ BatchLoader::GraphQL.for(iid).batch(key: project) do |iids, loader, args|
+ finder = ::Ci::PipelinesFinder.new(project, current_user, iids: iids)
+
+ finder.execute.each { |pipeline| loader.call(pipeline.iid.to_s, pipeline) }
+ end
+ else
+ BatchLoader::GraphQL.for(sha).batch(key: project) do |shas, loader, args|
+ finder = ::Ci::PipelinesFinder.new(project, current_user, shas: shas)
+
+ finder.execute.each { |pipeline| loader.call(pipeline.sha.to_s, pipeline) }
+ end
end
end
end
diff --git a/app/graphql/resolvers/snippets/blobs_resolver.rb b/app/graphql/resolvers/snippets/blobs_resolver.rb
index 672214df7d5..569b82149d3 100644
--- a/app/graphql/resolvers/snippets/blobs_resolver.rb
+++ b/app/graphql/resolvers/snippets/blobs_resolver.rb
@@ -8,6 +8,7 @@ module Resolvers
type Types::Snippets::BlobType.connection_type, null: true
authorize :read_snippet
+ calls_gitaly!
alias_method :snippet, :object
diff --git a/app/graphql/resolvers/tree_resolver.rb b/app/graphql/resolvers/tree_resolver.rb
index 7a70c35897d..c07d9187d4d 100644
--- a/app/graphql/resolvers/tree_resolver.rb
+++ b/app/graphql/resolvers/tree_resolver.rb
@@ -4,6 +4,8 @@ module Resolvers
class TreeResolver < BaseResolver
type Types::Tree::TreeType, null: true
+ calls_gitaly!
+
argument :path, GraphQL::STRING_TYPE,
required: false,
default_value: '',
diff --git a/app/graphql/types/access_level_enum.rb b/app/graphql/types/access_level_enum.rb
index 6754d3d28ce..b7eb35ddfc9 100644
--- a/app/graphql/types/access_level_enum.rb
+++ b/app/graphql/types/access_level_enum.rb
@@ -5,11 +5,12 @@ module Types
graphql_name 'AccessLevelEnum'
description 'Access level to a resource'
- value 'NO_ACCESS', value: Gitlab::Access::NO_ACCESS
- value 'GUEST', value: Gitlab::Access::GUEST
- value 'REPORTER', value: Gitlab::Access::REPORTER
- value 'DEVELOPER', value: Gitlab::Access::DEVELOPER
- value 'MAINTAINER', value: Gitlab::Access::MAINTAINER
- value 'OWNER', value: Gitlab::Access::OWNER
+ value 'NO_ACCESS', value: Gitlab::Access::NO_ACCESS, description: 'No access'
+ value 'MINIMAL_ACCESS', value: Gitlab::Access::MINIMAL_ACCESS, description: 'Minimal access'
+ value 'GUEST', value: Gitlab::Access::GUEST, description: 'Guest access'
+ value 'REPORTER', value: Gitlab::Access::REPORTER, description: 'Reporter access'
+ value 'DEVELOPER', value: Gitlab::Access::DEVELOPER, description: 'Developer access'
+ value 'MAINTAINER', value: Gitlab::Access::MAINTAINER, description: 'Maintainer access'
+ value 'OWNER', value: Gitlab::Access::OWNER, description: 'Owner access'
end
end
diff --git a/app/graphql/types/admin/analytics/instance_statistics/measurement_identifier_enum.rb b/app/graphql/types/admin/analytics/instance_statistics/measurement_identifier_enum.rb
deleted file mode 100644
index c6ca5963588..00000000000
--- a/app/graphql/types/admin/analytics/instance_statistics/measurement_identifier_enum.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# frozen_string_literal: true
-
-module Types
- module Admin
- module Analytics
- module InstanceStatistics
- class MeasurementIdentifierEnum < BaseEnum
- graphql_name 'MeasurementIdentifier'
- description 'Possible identifier types for a measurement'
-
- value 'PROJECTS', 'Project count', value: 'projects'
- value 'USERS', 'User count', value: 'users'
- value 'ISSUES', 'Issue count', value: 'issues'
- value 'MERGE_REQUESTS', 'Merge request count', value: 'merge_requests'
- value 'GROUPS', 'Group count', value: 'groups'
- value 'PIPELINES', 'Pipeline count', value: 'pipelines'
- value 'PIPELINES_SUCCEEDED', 'Pipeline count with success status', value: 'pipelines_succeeded'
- value 'PIPELINES_FAILED', 'Pipeline count with failed status', value: 'pipelines_failed'
- value 'PIPELINES_CANCELED', 'Pipeline count with canceled status', value: 'pipelines_canceled'
- value 'PIPELINES_SKIPPED', 'Pipeline count with skipped status', value: 'pipelines_skipped'
- end
- end
- end
- end
-end
diff --git a/app/graphql/types/admin/analytics/instance_statistics/measurement_type.rb b/app/graphql/types/admin/analytics/instance_statistics/measurement_type.rb
deleted file mode 100644
index 17a5af8d36b..00000000000
--- a/app/graphql/types/admin/analytics/instance_statistics/measurement_type.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-# frozen_string_literal: true
-
-module Types
- module Admin
- module Analytics
- module InstanceStatistics
- class MeasurementType < BaseObject
- include Gitlab::Graphql::Authorize::AuthorizeResource
- graphql_name 'InstanceStatisticsMeasurement'
- description 'Represents a recorded measurement (object count) for the Admins'
-
- authorize :read_instance_statistics_measurements
-
- field :recorded_at, Types::TimeType, null: true,
- description: 'The time the measurement was recorded.'
-
- field :count, GraphQL::INT_TYPE, null: false,
- description: 'Object count.'
-
- field :identifier, Types::Admin::Analytics::InstanceStatistics::MeasurementIdentifierEnum, null: false,
- description: 'The type of objects being measured.'
- end
- end
- end
- end
-end
diff --git a/app/graphql/types/admin/analytics/usage_trends/measurement_identifier_enum.rb b/app/graphql/types/admin/analytics/usage_trends/measurement_identifier_enum.rb
new file mode 100644
index 00000000000..33bec5278fe
--- /dev/null
+++ b/app/graphql/types/admin/analytics/usage_trends/measurement_identifier_enum.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+module Types
+ module Admin
+ module Analytics
+ module UsageTrends
+ class MeasurementIdentifierEnum < BaseEnum
+ graphql_name 'MeasurementIdentifier'
+ description 'Possible identifier types for a measurement'
+
+ value 'PROJECTS', 'Project count.', value: 'projects'
+ value 'USERS', 'User count.', value: 'users'
+ value 'ISSUES', 'Issue count.', value: 'issues'
+ value 'MERGE_REQUESTS', 'Merge request count.', value: 'merge_requests'
+ value 'GROUPS', 'Group count.', value: 'groups'
+ value 'PIPELINES', 'Pipeline count.', value: 'pipelines'
+ value 'PIPELINES_SUCCEEDED', 'Pipeline count with success status.', value: 'pipelines_succeeded'
+ value 'PIPELINES_FAILED', 'Pipeline count with failed status.', value: 'pipelines_failed'
+ value 'PIPELINES_CANCELED', 'Pipeline count with canceled status.', value: 'pipelines_canceled'
+ value 'PIPELINES_SKIPPED', 'Pipeline count with skipped status.', value: 'pipelines_skipped'
+ end
+ end
+ end
+ end
+end
diff --git a/app/graphql/types/admin/analytics/usage_trends/measurement_type.rb b/app/graphql/types/admin/analytics/usage_trends/measurement_type.rb
new file mode 100644
index 00000000000..c8ca702706f
--- /dev/null
+++ b/app/graphql/types/admin/analytics/usage_trends/measurement_type.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+module Types
+ module Admin
+ module Analytics
+ module UsageTrends
+ class MeasurementType < BaseObject
+ include Gitlab::Graphql::Authorize::AuthorizeResource
+ graphql_name 'UsageTrendsMeasurement'
+ description 'Represents a recorded measurement (object count) for the Admins'
+
+ authorize :read_usage_trends_measurement
+
+ field :recorded_at, Types::TimeType, null: true,
+ description: 'The time the measurement was recorded.'
+
+ field :count, GraphQL::INT_TYPE, null: false,
+ description: 'Object count.'
+
+ field :identifier, Types::Admin::Analytics::UsageTrends::MeasurementIdentifierEnum, null: false,
+ description: 'The type of objects being measured.'
+ end
+ end
+ end
+ end
+end
diff --git a/app/graphql/types/alert_management/alert_sort_enum.rb b/app/graphql/types/alert_management/alert_sort_enum.rb
index 51e7bef0a7f..11a5cb95722 100644
--- a/app/graphql/types/alert_management/alert_sort_enum.rb
+++ b/app/graphql/types/alert_management/alert_sort_enum.rb
@@ -6,20 +6,20 @@ module Types
graphql_name 'AlertManagementAlertSort'
description 'Values for sorting alerts'
- value 'STARTED_AT_ASC', 'Start time by ascending order', value: :started_at_asc
- value 'STARTED_AT_DESC', 'Start time by descending order', value: :started_at_desc
- value 'ENDED_AT_ASC', 'End time by ascending order', value: :ended_at_asc
- value 'ENDED_AT_DESC', 'End time by descending order', value: :ended_at_desc
- value 'CREATED_TIME_ASC', 'Created time by ascending order', value: :created_at_asc
- value 'CREATED_TIME_DESC', 'Created time by descending order', value: :created_at_desc
- value 'UPDATED_TIME_ASC', 'Created time by ascending order', value: :updated_at_asc
- value 'UPDATED_TIME_DESC', 'Created time by descending order', value: :updated_at_desc
- value 'EVENT_COUNT_ASC', 'Events count by ascending order', value: :event_count_asc
- value 'EVENT_COUNT_DESC', 'Events count by descending order', value: :event_count_desc
- value 'SEVERITY_ASC', 'Severity from less critical to more critical', value: :severity_asc
- value 'SEVERITY_DESC', 'Severity from more critical to less critical', value: :severity_desc
- value 'STATUS_ASC', 'Status by order: Ignored > Resolved > Acknowledged > Triggered', value: :status_asc
- value 'STATUS_DESC', 'Status by order: Triggered > Acknowledged > Resolved > Ignored', value: :status_desc
+ value 'STARTED_AT_ASC', 'Start time by ascending order.', value: :started_at_asc
+ value 'STARTED_AT_DESC', 'Start time by descending order.', value: :started_at_desc
+ value 'ENDED_AT_ASC', 'End time by ascending order.', value: :ended_at_asc
+ value 'ENDED_AT_DESC', 'End time by descending order.', value: :ended_at_desc
+ value 'CREATED_TIME_ASC', 'Created time by ascending order.', value: :created_at_asc
+ value 'CREATED_TIME_DESC', 'Created time by descending order.', value: :created_at_desc
+ value 'UPDATED_TIME_ASC', 'Created time by ascending order.', value: :updated_at_asc
+ value 'UPDATED_TIME_DESC', 'Created time by descending order.', value: :updated_at_desc
+ value 'EVENT_COUNT_ASC', 'Events count by ascending order.', value: :event_count_asc
+ value 'EVENT_COUNT_DESC', 'Events count by descending order.', value: :event_count_desc
+ value 'SEVERITY_ASC', 'Severity from less critical to more critical.', value: :severity_asc
+ value 'SEVERITY_DESC', 'Severity from more critical to less critical.', value: :severity_desc
+ value 'STATUS_ASC', 'Status by order: Ignored > Resolved > Acknowledged > Triggered.', value: :status_asc
+ value 'STATUS_DESC', 'Status by order: Triggered > Acknowledged > Resolved > Ignored.', value: :status_desc
end
end
end
diff --git a/app/graphql/types/alert_management/alert_type.rb b/app/graphql/types/alert_management/alert_type.rb
index 6b7e7030c1f..5a2a5c68c8d 100644
--- a/app/graphql/types/alert_management/alert_type.rb
+++ b/app/graphql/types/alert_management/alert_type.rb
@@ -20,8 +20,14 @@ module Types
field :issue_iid,
GraphQL::ID_TYPE,
null: true,
+ deprecated: { reason: 'Use issue field', milestone: '13.10' },
description: 'Internal ID of the GitLab issue attached to the alert.'
+ field :issue,
+ Types::IssueType,
+ null: true,
+ description: 'Issue attached to the alert.'
+
field :title,
GraphQL::STRING_TYPE,
null: true,
diff --git a/app/graphql/types/alert_management/domain_filter_enum.rb b/app/graphql/types/alert_management/domain_filter_enum.rb
index a798cfb9ee9..3ee01e4c391 100644
--- a/app/graphql/types/alert_management/domain_filter_enum.rb
+++ b/app/graphql/types/alert_management/domain_filter_enum.rb
@@ -6,8 +6,8 @@ module Types
graphql_name 'AlertManagementDomainFilter'
description 'Filters the alerts based on given domain'
- value 'operations', description: 'Alerts for operations domain'
- value 'threat_monitoring', description: 'Alerts for threat monitoring domain'
+ value 'operations', description: 'Alerts for operations domain.'
+ value 'threat_monitoring', description: 'Alerts for threat monitoring domain.'
end
end
end
diff --git a/app/graphql/types/alert_management/http_integration_type.rb b/app/graphql/types/alert_management/http_integration_type.rb
index 88782050b94..0d5bb50a77c 100644
--- a/app/graphql/types/alert_management/http_integration_type.rb
+++ b/app/graphql/types/alert_management/http_integration_type.rb
@@ -20,3 +20,5 @@ module Types
end
end
end
+
+Types::AlertManagement::HttpIntegrationType.prepend_ee_mod
diff --git a/app/graphql/types/alert_management/integration_type_enum.rb b/app/graphql/types/alert_management/integration_type_enum.rb
index 2f9be549e58..94f38e03409 100644
--- a/app/graphql/types/alert_management/integration_type_enum.rb
+++ b/app/graphql/types/alert_management/integration_type_enum.rb
@@ -6,8 +6,8 @@ module Types
graphql_name 'AlertManagementIntegrationType'
description 'Values of types of integrations'
- value 'PROMETHEUS', 'Prometheus integration', value: :prometheus
- value 'HTTP', 'Integration with any monitoring tool', value: :http
+ value 'PROMETHEUS', 'Prometheus integration.', value: :prometheus
+ value 'HTTP', 'Integration with any monitoring tool.', value: :http
end
end
end
diff --git a/app/graphql/types/base_argument.rb b/app/graphql/types/base_argument.rb
index 11774d0b59d..4ad9e8c0e40 100644
--- a/app/graphql/types/base_argument.rb
+++ b/app/graphql/types/base_argument.rb
@@ -6,7 +6,6 @@ module Types
def initialize(*args, **kwargs, &block)
kwargs = gitlab_deprecation(kwargs)
- kwargs.delete(:deprecation_reason)
super(*args, **kwargs, &block)
end
diff --git a/app/graphql/types/base_field.rb b/app/graphql/types/base_field.rb
index f145b9d45c3..78ab6890923 100644
--- a/app/graphql/types/base_field.rb
+++ b/app/graphql/types/base_field.rb
@@ -9,48 +9,29 @@ module Types
DEFAULT_COMPLEXITY = 1
- def initialize(*args, **kwargs, &block)
+ def initialize(**kwargs, &block)
@calls_gitaly = !!kwargs.delete(:calls_gitaly)
- @constant_complexity = !!kwargs[:complexity]
+ @constant_complexity = kwargs[:complexity].is_a?(Integer) && kwargs[:complexity] > 0
@requires_argument = !!kwargs.delete(:requires_argument)
kwargs[:complexity] = field_complexity(kwargs[:resolver_class], kwargs[:complexity])
@feature_flag = kwargs[:feature_flag]
kwargs = check_feature_flag(kwargs)
kwargs = gitlab_deprecation(kwargs)
- super(*args, **kwargs, &block)
+ super(**kwargs, &block)
+
+ # We want to avoid the overhead of this in prod
+ extension ::Gitlab::Graphql::CallsGitaly::FieldExtension if Gitlab.dev_or_test_env?
+
+ extension ::Gitlab::Graphql::Present::FieldExtension
end
- def requires_argument?
- @requires_argument || arguments.values.any? { |argument| argument.type.non_null? }
+ def may_call_gitaly?
+ @constant_complexity || @calls_gitaly
end
- # Based on https://github.com/rmosolgo/graphql-ruby/blob/v1.11.4/lib/graphql/schema/field.rb#L538-L563
- # Modified to fix https://github.com/rmosolgo/graphql-ruby/issues/3113
- def resolve_field(obj, args, ctx)
- ctx.schema.after_lazy(obj) do |after_obj|
- query_ctx = ctx.query.context
- inner_obj = after_obj&.object
-
- ctx.schema.after_lazy(to_ruby_args(after_obj, args, ctx)) do |ruby_args|
- if authorized?(inner_obj, ruby_args, query_ctx)
- if @resolve_proc
- # We pass `after_obj` here instead of `inner_obj` because extensions expect a GraphQL::Schema::Object
- with_extensions(after_obj, ruby_args, query_ctx) do |extended_obj, extended_args|
- # Since `extended_obj` is now a GraphQL::Schema::Object, we need to get the inner object and pass that to `@resolve_proc`
- extended_obj = extended_obj.object if extended_obj.is_a?(GraphQL::Schema::Object)
-
- @resolve_proc.call(extended_obj, args, ctx)
- end
- else
- public_send_field(after_obj, ruby_args, query_ctx)
- end
- else
- err = GraphQL::UnauthorizedFieldError.new(object: inner_obj, type: obj.class, context: ctx, field: self)
- query_ctx.schema.unauthorized_field(err)
- end
- end
- end
+ def requires_argument?
+ @requires_argument || arguments.values.any? { |argument| argument.type.non_null? }
end
def base_complexity
@@ -82,8 +63,10 @@ module Types
end
def check_feature_flag(args)
- args[:description] = feature_documentation_message(args[:feature_flag], args[:description]) if args[:feature_flag].present?
- args.delete(:feature_flag)
+ ff = args.delete(:feature_flag)
+ return args unless ff.present?
+
+ args[:description] = feature_documentation_message(ff, args[:description])
args
end
@@ -106,7 +89,9 @@ module Types
# items which can be loaded.
proc do |ctx, args, child_complexity|
# Resolvers may add extra complexity depending on used arguments
- complexity = child_complexity + self.resolver&.try(:resolver_complexity, args, child_complexity: child_complexity).to_i
+ complexity = child_complexity + resolver&.try(
+ :resolver_complexity, args, child_complexity: child_complexity
+ ).to_i
complexity += 1 if calls_gitaly?
complexity += complexity * connection_complexity_multiplier(ctx, args)
@@ -121,7 +106,7 @@ module Types
page_size = field_defn.connection_max_page_size || ctx.schema.default_max_page_size
limit_value = [args[:first], args[:last], page_size].compact.min
- multiplier = self.resolver&.try(:complexity_multiplier, args).to_f
+ multiplier = resolver&.try(:complexity_multiplier, args).to_f
limit_value * multiplier
end
end
diff --git a/app/graphql/types/blob_viewers/type_enum.rb b/app/graphql/types/blob_viewers/type_enum.rb
index 35e659197e5..3cb5c76d881 100644
--- a/app/graphql/types/blob_viewers/type_enum.rb
+++ b/app/graphql/types/blob_viewers/type_enum.rb
@@ -6,9 +6,9 @@ module Types
graphql_name 'BlobViewersType'
description 'Types of blob viewers'
- value 'rich', value: :rich
- value 'simple', value: :simple
- value 'auxiliary', value: :auxiliary
+ value 'rich', value: :rich, description: 'Rich blob viewers type.'
+ value 'simple', value: :simple, description: 'Simple blob viewers type.'
+ value 'auxiliary', value: :auxiliary, description: 'Auxiliary blob viewers type.'
end
end
end
diff --git a/app/graphql/types/board_list_type.rb b/app/graphql/types/board_list_type.rb
index 46b49c5d8a4..f215aa255de 100644
--- a/app/graphql/types/board_list_type.rb
+++ b/app/graphql/types/board_list_type.rb
@@ -8,6 +8,8 @@ module Types
graphql_name 'BoardList'
description 'Represents a list for an issue board'
+ alias_method :list, :object
+
field :id, GraphQL::ID_TYPE, null: false,
description: 'ID (global ID) of the list.'
field :title, GraphQL::STRING_TYPE, null: false,
@@ -19,7 +21,7 @@ module Types
field :label, Types::LabelType, null: true,
description: 'Label of the list.'
field :collapsed, GraphQL::BOOLEAN_TYPE, null: true,
- description: 'Indicates if list is collapsed for this user.'
+ description: 'Indicates if the list is collapsed for this user.'
field :issues_count, GraphQL::INT_TYPE, null: true,
description: 'Count of issues in the list.'
@@ -37,12 +39,10 @@ module Types
def metadata
strong_memoize(:metadata) do
- list = self.object
- user = context[:current_user]
params = (context[:issue_filters] || {}).merge(board_id: list.board_id, id: list.id)
::Boards::Issues::ListService
- .new(list.board.resource_parent, user, params)
+ .new(list.board.resource_parent, current_user, params)
.metadata
end
end
diff --git a/app/graphql/types/board_type.rb b/app/graphql/types/board_type.rb
index f8bd31d5fa0..f33f3f5e537 100644
--- a/app/graphql/types/board_type.rb
+++ b/app/graphql/types/board_type.rb
@@ -3,9 +3,9 @@
module Types
class BoardType < BaseObject
graphql_name 'Board'
- description 'Represents a project or group board'
+ description 'Represents a project or group issue board'
accepts ::Board
- authorize :read_board
+ authorize :read_issue_board
present_using BoardPresenter
diff --git a/app/graphql/types/boards/board_issue_input_base_type.rb b/app/graphql/types/boards/board_issue_input_base_type.rb
index dab1414760b..b762cef6e58 100644
--- a/app/graphql/types/boards/board_issue_input_base_type.rb
+++ b/app/graphql/types/boards/board_issue_input_base_type.rb
@@ -2,7 +2,6 @@
module Types
module Boards
- # rubocop: disable Graphql/AuthorizeTypes
class BoardIssueInputBaseType < BaseInputObject
argument :label_name, GraphQL::STRING_TYPE.to_list_type,
required: false,
@@ -28,7 +27,6 @@ module Types
required: false,
description: 'Filter by reaction emoji.'
end
- # rubocop: enable Graphql/AuthorizeTypes
end
end
diff --git a/app/graphql/types/boards/board_issue_input_type.rb b/app/graphql/types/boards/board_issue_input_type.rb
index 62a402ee724..9cc0f484a16 100644
--- a/app/graphql/types/boards/board_issue_input_type.rb
+++ b/app/graphql/types/boards/board_issue_input_type.rb
@@ -2,7 +2,6 @@
module Types
module Boards
- # rubocop: disable Graphql/AuthorizeTypes
class NegatedBoardIssueInputType < BoardIssueInputBaseType
end
@@ -17,7 +16,6 @@ module Types
required: false,
description: 'Search query for issue title or description.'
end
- # rubocop: enable Graphql/AuthorizeTypes
end
end
diff --git a/app/graphql/types/ci/config/status_enum.rb b/app/graphql/types/ci/config/status_enum.rb
index 92b04c61679..1ba207531b8 100644
--- a/app/graphql/types/ci/config/status_enum.rb
+++ b/app/graphql/types/ci/config/status_enum.rb
@@ -7,8 +7,8 @@ module Types
graphql_name 'CiConfigStatus'
description 'Values for YAML processor result'
- value 'VALID', 'The configuration file is valid', value: :valid
- value 'INVALID', 'The configuration file is not valid', value: :invalid
+ value 'VALID', 'The configuration file is valid.', value: :valid
+ value 'INVALID', 'The configuration file is not valid.', value: :invalid
end
end
end
diff --git a/app/graphql/types/ci/job_artifact_file_type_enum.rb b/app/graphql/types/ci/job_artifact_file_type_enum.rb
index 4b484dec590..5099b0d4850 100644
--- a/app/graphql/types/ci/job_artifact_file_type_enum.rb
+++ b/app/graphql/types/ci/job_artifact_file_type_enum.rb
@@ -6,7 +6,8 @@ module Types
graphql_name 'JobArtifactFileType'
::Ci::JobArtifact::TYPE_AND_FORMAT_PAIRS.keys.each do |file_type|
- value file_type.to_s.upcase, value: file_type.to_s
+ description = file_type == :codequality ? "CODE QUALITY" : file_type.to_s.titleize.upcase # This is needed as doc lint will not allow codequality as one word
+ value file_type.to_s.upcase, value: file_type.to_s, description: "#{description} job artifact file type."
end
end
end
diff --git a/app/graphql/types/ci/job_type.rb b/app/graphql/types/ci/job_type.rb
index ba463cdd9c1..c86337eea89 100644
--- a/app/graphql/types/ci/job_type.rb
+++ b/app/graphql/types/ci/job_type.rb
@@ -18,6 +18,10 @@ module Types
description: 'Schedule for the build.'
field :artifacts, Types::Ci::JobArtifactType.connection_type, null: true,
description: 'Artifacts generated by the job.'
+ field :finished_at, Types::TimeType, null: true,
+ description: 'When a job has finished running.'
+ field :duration, GraphQL::INT_TYPE, null: true,
+ description: 'Duration of the job in seconds.'
def pipeline
Gitlab::Graphql::Loaders::BatchModelLoader.new(::Ci::Pipeline, object.pipeline_id).find
diff --git a/app/graphql/types/ci/pipeline_type.rb b/app/graphql/types/ci/pipeline_type.rb
index 2c386c9b564..49be200a788 100644
--- a/app/graphql/types/ci/pipeline_type.rb
+++ b/app/graphql/types/ci/pipeline_type.rb
@@ -95,6 +95,9 @@ module Types
field :path, GraphQL::STRING_TYPE, null: true,
description: "Relative path to the pipeline's page."
+ field :commit_path, GraphQL::STRING_TYPE, null: true,
+ description: 'Path to the commit that triggered the pipeline.'
+
field :project, Types::ProjectType, null: true,
description: 'Project the pipeline belongs to.'
@@ -109,6 +112,10 @@ module Types
Gitlab::Graphql::Loaders::BatchModelLoader.new(User, object.user_id).find
end
+ def commit_path
+ ::Gitlab::Routing.url_helpers.project_commit_path(object.project, object.sha)
+ end
+
def path
::Gitlab::Routing.url_helpers.project_pipeline_path(object.project, object)
end
diff --git a/app/graphql/types/ci_configuration/sast/analyzers_entity_input_type.rb b/app/graphql/types/ci_configuration/sast/analyzers_entity_input_type.rb
index 9835a7ef208..ccb72283cf6 100644
--- a/app/graphql/types/ci_configuration/sast/analyzers_entity_input_type.rb
+++ b/app/graphql/types/ci_configuration/sast/analyzers_entity_input_type.rb
@@ -3,7 +3,6 @@
module Types
module CiConfiguration
module Sast
- # rubocop: disable Graphql/AuthorizeTypes
class AnalyzersEntityInputType < BaseInputObject
graphql_name 'SastCiConfigurationAnalyzersEntityInput'
description 'Represents the analyzers entity in SAST CI configuration'
diff --git a/app/graphql/types/ci_configuration/sast/entity_input_type.rb b/app/graphql/types/ci_configuration/sast/entity_input_type.rb
index 39b3efb3db8..9fce120889b 100644
--- a/app/graphql/types/ci_configuration/sast/entity_input_type.rb
+++ b/app/graphql/types/ci_configuration/sast/entity_input_type.rb
@@ -3,7 +3,6 @@
module Types
module CiConfiguration
module Sast
- # rubocop: disable Graphql/AuthorizeTypes
class EntityInputType < BaseInputObject
graphql_name 'SastCiConfigurationEntityInput'
description 'Represents an entity in SAST CI configuration'
diff --git a/app/graphql/types/ci_configuration/sast/input_type.rb b/app/graphql/types/ci_configuration/sast/input_type.rb
index 615436683f6..a86bdfca4da 100644
--- a/app/graphql/types/ci_configuration/sast/input_type.rb
+++ b/app/graphql/types/ci_configuration/sast/input_type.rb
@@ -3,7 +3,7 @@
module Types
module CiConfiguration
module Sast
- class InputType < BaseInputObject # rubocop:disable Graphql/AuthorizeTypes
+ class InputType < BaseInputObject
graphql_name 'SastCiConfigurationInput'
description 'Represents a CI configuration of SAST'
diff --git a/app/graphql/types/ci_configuration/sast/ui_component_size_enum.rb b/app/graphql/types/ci_configuration/sast/ui_component_size_enum.rb
index 3a208f9d3e4..76d2a314c13 100644
--- a/app/graphql/types/ci_configuration/sast/ui_component_size_enum.rb
+++ b/app/graphql/types/ci_configuration/sast/ui_component_size_enum.rb
@@ -7,9 +7,9 @@ module Types
graphql_name 'SastUiComponentSize'
description 'Size of UI component in SAST configuration page'
- value 'SMALL'
- value 'MEDIUM'
- value 'LARGE'
+ value 'SMALL', description: "The size of UI component in SAST configuration page is small."
+ value 'MEDIUM', description: "The size of UI component in SAST configuration page is medium."
+ value 'LARGE', description: "The size of UI component in SAST configuration page is large."
end
end
end
diff --git a/app/graphql/types/commit_action_mode_enum.rb b/app/graphql/types/commit_action_mode_enum.rb
index 77658a85b51..ea3d49c9822 100644
--- a/app/graphql/types/commit_action_mode_enum.rb
+++ b/app/graphql/types/commit_action_mode_enum.rb
@@ -5,10 +5,10 @@ module Types
graphql_name 'CommitActionMode'
description 'Mode of a commit action'
- value 'CREATE', description: 'Create command', value: :create
- value 'DELETE', description: 'Delete command', value: :delete
- value 'MOVE', description: 'Move command', value: :move
- value 'UPDATE', description: 'Update command', value: :update
- value 'CHMOD', description: 'Chmod command', value: :chmod
+ value 'CREATE', description: 'Create command.', value: :create
+ value 'DELETE', description: 'Delete command.', value: :delete
+ value 'MOVE', description: 'Move command.', value: :move
+ value 'UPDATE', description: 'Update command.', value: :update
+ value 'CHMOD', description: 'Chmod command.', value: :chmod
end
end
diff --git a/app/graphql/types/commit_action_type.rb b/app/graphql/types/commit_action_type.rb
index e14e7157752..cc1f45478e4 100644
--- a/app/graphql/types/commit_action_type.rb
+++ b/app/graphql/types/commit_action_type.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
module Types
- # rubocop: disable Graphql/AuthorizeTypes
class CommitActionType < BaseInputObject
argument :action, type: Types::CommitActionModeEnum, required: true,
description: 'The action to perform, create, delete, move, update, chmod.'
@@ -18,5 +17,4 @@ module Types
argument :encoding, type: Types::CommitEncodingEnum, required: false,
description: 'Encoding of the file. Default is text.'
end
- # rubocop: enable Graphql/AuthorizeTypes
end
diff --git a/app/graphql/types/commit_encoding_enum.rb b/app/graphql/types/commit_encoding_enum.rb
index 0ea89b82db7..c51c1e864fb 100644
--- a/app/graphql/types/commit_encoding_enum.rb
+++ b/app/graphql/types/commit_encoding_enum.rb
@@ -4,7 +4,7 @@ module Types
class CommitEncodingEnum < BaseEnum
graphql_name 'CommitEncoding'
- value 'TEXT', description: 'Text encoding', value: :text
- value 'BASE64', description: 'Base64 encoding', value: :base64
+ value 'TEXT', description: 'Text encoding.', value: :text
+ value 'BASE64', description: 'Base64 encoding.', value: :base64
end
end
diff --git a/app/graphql/types/concerns/gitlab_style_deprecations.rb b/app/graphql/types/concerns/gitlab_style_deprecations.rb
index 9f087f3812d..ad195354930 100644
--- a/app/graphql/types/concerns/gitlab_style_deprecations.rb
+++ b/app/graphql/types/concerns/gitlab_style_deprecations.rb
@@ -10,7 +10,7 @@ module GitlabStyleDeprecations
def gitlab_deprecation(kwargs)
if kwargs[:deprecation_reason].present?
raise ArgumentError, 'Use `deprecated` property instead of `deprecation_reason`. ' \
- 'See https://docs.gitlab.com/ee/development/api_graphql_styleguide.html#deprecating-fields-and-enum-values'
+ 'See https://docs.gitlab.com/ee/development/api_graphql_styleguide.html#deprecating-fields-arguments-and-enum-values'
end
deprecation = kwargs.delete(:deprecated)
diff --git a/app/graphql/types/container_repository_sort_enum.rb b/app/graphql/types/container_repository_sort_enum.rb
index 96210c0546b..4f2e15fd32f 100644
--- a/app/graphql/types/container_repository_sort_enum.rb
+++ b/app/graphql/types/container_repository_sort_enum.rb
@@ -5,7 +5,7 @@ module Types
graphql_name 'ContainerRepositorySort'
description 'Values for sorting container repositories'
- value 'NAME_ASC', 'Name by ascending order', value: :name_asc
- value 'NAME_DESC', 'Name by descending order', value: :name_desc
+ value 'NAME_ASC', 'Name by ascending order.', value: :name_asc
+ value 'NAME_DESC', 'Name by descending order.', value: :name_desc
end
end
diff --git a/app/graphql/types/current_user_todos.rb b/app/graphql/types/current_user_todos.rb
index 79a430af1d7..2551db875b0 100644
--- a/app/graphql/types/current_user_todos.rb
+++ b/app/graphql/types/current_user_todos.rb
@@ -16,9 +16,10 @@ module Types
end
def current_user_todos(state: nil)
- state ||= %i(done pending) # TodosFinder treats a `nil` state param as `pending`
+ state ||= %i[done pending] # TodosFinder treats a `nil` state param as `pending`
+ klass = unpresented.class
- TodosFinder.new(current_user, state: state, type: object.class.name, target_id: object.id).execute
+ TodosFinder.new(current_user, state: state, type: klass.name, target_id: object.id).execute
end
end
end
diff --git a/app/graphql/types/design_management/design_version_event_enum.rb b/app/graphql/types/design_management/design_version_event_enum.rb
index ea4bc1ffbfa..354b34c9f9f 100644
--- a/app/graphql/types/design_management/design_version_event_enum.rb
+++ b/app/graphql/types/design_management/design_version_event_enum.rb
@@ -8,7 +8,7 @@ module Types
NONE = 'NONE'
- value NONE, 'No change'
+ value NONE, 'No change.'
::DesignManagement::Action.events.keys.each do |event_name|
value event_name.upcase, value: event_name, description: "A #{event_name} event"
diff --git a/app/graphql/types/diff_paths_input_type.rb b/app/graphql/types/diff_paths_input_type.rb
index 864cec1ab07..d148b7656eb 100644
--- a/app/graphql/types/diff_paths_input_type.rb
+++ b/app/graphql/types/diff_paths_input_type.rb
@@ -1,12 +1,10 @@
# frozen_string_literal: true
module Types
- # rubocop: disable Graphql/AuthorizeTypes
class DiffPathsInputType < BaseInputObject
argument :old_path, GraphQL::STRING_TYPE, required: false,
description: 'The path of the file on the start sha.'
argument :new_path, GraphQL::STRING_TYPE, required: false,
description: 'The path of the file on the head sha.'
end
- # rubocop: enable Graphql/AuthorizeTypes
end
diff --git a/app/graphql/types/error_tracking/sentry_error_status_enum.rb b/app/graphql/types/error_tracking/sentry_error_status_enum.rb
index df68eef4f3c..10579bcbfb1 100644
--- a/app/graphql/types/error_tracking/sentry_error_status_enum.rb
+++ b/app/graphql/types/error_tracking/sentry_error_status_enum.rb
@@ -6,10 +6,10 @@ module Types
graphql_name 'SentryErrorStatus'
description 'State of a Sentry error'
- value 'RESOLVED', value: 'resolved', description: 'Error has been resolved'
- value 'RESOLVED_IN_NEXT_RELEASE', value: 'resolvedInNextRelease', description: 'Error has been ignored until next release'
- value 'UNRESOLVED', value: 'unresolved', description: 'Error is unresolved'
- value 'IGNORED', value: 'ignored', description: 'Error has been ignored'
+ value 'RESOLVED', value: 'resolved', description: 'Error has been resolved.'
+ value 'RESOLVED_IN_NEXT_RELEASE', value: 'resolvedInNextRelease', description: 'Error has been ignored until next release.'
+ value 'UNRESOLVED', value: 'unresolved', description: 'Error is unresolved.'
+ value 'IGNORED', value: 'ignored', description: 'Error has been ignored.'
end
end
end
diff --git a/app/graphql/types/global_id_type.rb b/app/graphql/types/global_id_type.rb
index ed28c3ffd7e..007d86f60b8 100644
--- a/app/graphql/types/global_id_type.rb
+++ b/app/graphql/types/global_id_type.rb
@@ -67,7 +67,10 @@ module Types
end
self.define_singleton_method(:suitable?) do |gid|
- gid&.model_class&.ancestors&.include?(model_class)
+ next false if gid.nil?
+
+ gid.model_name.safe_constantize.present? &&
+ gid.model_class.ancestors.include?(model_class)
end
self.define_singleton_method(:coerce_input) do |string, ctx|
diff --git a/app/graphql/types/group_type.rb b/app/graphql/types/group_type.rb
index 0aaeb8d20df..7a84e76657b 100644
--- a/app/graphql/types/group_type.rb
+++ b/app/graphql/types/group_type.rb
@@ -95,6 +95,10 @@ module Types
field :container_repositories_count, GraphQL::INT_TYPE, null: false,
description: 'Number of container repositories in the group.'
+ field :packages,
+ description: 'Packages of the group.',
+ resolver: Resolvers::GroupPackagesResolver
+
def label(title:)
BatchLoader::GraphQL.for(title).batch(key: group) do |titles, loader, args|
LabelsFinder
diff --git a/app/graphql/types/issuable_sort_enum.rb b/app/graphql/types/issuable_sort_enum.rb
index a6d52124d99..f6e17d8988e 100644
--- a/app/graphql/types/issuable_sort_enum.rb
+++ b/app/graphql/types/issuable_sort_enum.rb
@@ -5,11 +5,11 @@ module Types
graphql_name 'IssuableSort'
description 'Values for sorting issuables'
- value 'PRIORITY_ASC', 'Priority by ascending order', value: :priority_asc
- value 'PRIORITY_DESC', 'Priority by descending order', value: :priority_desc
- value 'LABEL_PRIORITY_ASC', 'Label priority by ascending order', value: :label_priority_asc
- value 'LABEL_PRIORITY_DESC', 'Label priority by descending order', value: :label_priority_desc
- value 'MILESTONE_DUE_ASC', 'Milestone due date by ascending order', value: :milestone_due_asc
- value 'MILESTONE_DUE_DESC', 'Milestone due date by descending order', value: :milestone_due_desc
+ value 'PRIORITY_ASC', 'Priority by ascending order.', value: :priority_asc
+ value 'PRIORITY_DESC', 'Priority by descending order.', value: :priority_desc
+ value 'LABEL_PRIORITY_ASC', 'Label priority by ascending order.', value: :label_priority_asc
+ value 'LABEL_PRIORITY_DESC', 'Label priority by descending order.', value: :label_priority_desc
+ value 'MILESTONE_DUE_ASC', 'Milestone due date by ascending order.', value: :milestone_due_asc
+ value 'MILESTONE_DUE_DESC', 'Milestone due date by descending order.', value: :milestone_due_desc
end
end
diff --git a/app/graphql/types/issuable_state_enum.rb b/app/graphql/types/issuable_state_enum.rb
index 543b7f8e5b2..5a1b11b3bdc 100644
--- a/app/graphql/types/issuable_state_enum.rb
+++ b/app/graphql/types/issuable_state_enum.rb
@@ -5,9 +5,9 @@ module Types
graphql_name 'IssuableState'
description 'State of a GitLab issue or merge request'
- value 'opened'
- value 'closed'
- value 'locked'
- value 'all'
+ value 'opened', description: 'In open state.'
+ value 'closed', description: 'In closed state.'
+ value 'locked', description: 'Discussion has been locked.'
+ value 'all', description: 'All available.'
end
end
diff --git a/app/graphql/types/issue_sort_enum.rb b/app/graphql/types/issue_sort_enum.rb
index 08762264b1b..bf900fe3525 100644
--- a/app/graphql/types/issue_sort_enum.rb
+++ b/app/graphql/types/issue_sort_enum.rb
@@ -5,11 +5,11 @@ module Types
graphql_name 'IssueSort'
description 'Values for sorting issues'
- value 'DUE_DATE_ASC', 'Due date by ascending order', value: :due_date_asc
- value 'DUE_DATE_DESC', 'Due date by descending order', value: :due_date_desc
- value 'RELATIVE_POSITION_ASC', 'Relative position by ascending order', value: :relative_position_asc
- value 'SEVERITY_ASC', 'Severity from less critical to more critical', value: :severity_asc
- value 'SEVERITY_DESC', 'Severity from more critical to less critical', value: :severity_desc
+ value 'DUE_DATE_ASC', 'Due date by ascending order.', value: :due_date_asc
+ value 'DUE_DATE_DESC', 'Due date by descending order.', value: :due_date_desc
+ value 'RELATIVE_POSITION_ASC', 'Relative position by ascending order.', value: :relative_position_asc
+ value 'SEVERITY_ASC', 'Severity from less critical to more critical.', value: :severity_asc
+ value 'SEVERITY_DESC', 'Severity from more critical to less critical.', value: :severity_desc
end
end
diff --git a/app/graphql/types/issue_state_event_enum.rb b/app/graphql/types/issue_state_event_enum.rb
index 6a9d840831d..165b9c28367 100644
--- a/app/graphql/types/issue_state_event_enum.rb
+++ b/app/graphql/types/issue_state_event_enum.rb
@@ -5,7 +5,7 @@ module Types
graphql_name 'IssueStateEvent'
description 'Values for issue state events'
- value 'REOPEN', 'Reopens the issue', value: 'reopen'
- value 'CLOSE', 'Closes the issue', value: 'close'
+ value 'REOPEN', 'Reopens the issue.', value: 'reopen'
+ value 'CLOSE', 'Closes the issue.', value: 'close'
end
end
diff --git a/app/graphql/types/jira_users_mapping_input_type.rb b/app/graphql/types/jira_users_mapping_input_type.rb
index 0c26ea87df2..61e3240ecf3 100644
--- a/app/graphql/types/jira_users_mapping_input_type.rb
+++ b/app/graphql/types/jira_users_mapping_input_type.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
module Types
- # rubocop: disable Graphql/AuthorizeTypes
class JiraUsersMappingInputType < BaseInputObject
graphql_name 'JiraUsersMappingInputType'
@@ -14,5 +13,4 @@ module Types
required: false,
description: 'Id of the GitLab user.'
end
- # rubocop: enable Graphql/AuthorizeTypes
end
diff --git a/app/graphql/types/label_type.rb b/app/graphql/types/label_type.rb
index 94fd15e075c..4e8718a80da 100644
--- a/app/graphql/types/label_type.rb
+++ b/app/graphql/types/label_type.rb
@@ -19,5 +19,9 @@ module Types
description: 'Background color of the label.'
field :text_color, GraphQL::STRING_TYPE, null: false,
description: 'Text color of the label.'
+ field :created_at, Types::TimeType, null: false,
+ description: 'When this label was created.'
+ field :updated_at, Types::TimeType, null: false,
+ description: 'When this label was last updated.'
end
end
diff --git a/app/graphql/types/merge_request_sort_enum.rb b/app/graphql/types/merge_request_sort_enum.rb
index c64ae367a76..92a71998d91 100644
--- a/app/graphql/types/merge_request_sort_enum.rb
+++ b/app/graphql/types/merge_request_sort_enum.rb
@@ -5,7 +5,7 @@ module Types
graphql_name 'MergeRequestSort'
description 'Values for sorting merge requests'
- value 'MERGED_AT_ASC', 'Merge time by ascending order', value: :merged_at_asc
- value 'MERGED_AT_DESC', 'Merge time by descending order', value: :merged_at_desc
+ value 'MERGED_AT_ASC', 'Merge time by ascending order.', value: :merged_at_asc
+ value 'MERGED_AT_DESC', 'Merge time by descending order.', value: :merged_at_desc
end
end
diff --git a/app/graphql/types/merge_request_state_enum.rb b/app/graphql/types/merge_request_state_enum.rb
index c14b9f80a53..a2d7bd0306c 100644
--- a/app/graphql/types/merge_request_state_enum.rb
+++ b/app/graphql/types/merge_request_state_enum.rb
@@ -5,6 +5,6 @@ module Types
graphql_name 'MergeRequestState'
description 'State of a GitLab merge request'
- value 'merged', description: "Merge Request has been merged"
+ value 'merged', description: "Merge Request has been merged."
end
end
diff --git a/app/graphql/types/merge_request_type.rb b/app/graphql/types/merge_request_type.rb
index 10f324e901a..449286915f2 100644
--- a/app/graphql/types/merge_request_type.rb
+++ b/app/graphql/types/merge_request_type.rb
@@ -54,7 +54,7 @@ module Types
field :target_branch, GraphQL::STRING_TYPE, null: false,
description: 'Target branch of the merge request.'
field :work_in_progress, GraphQL::BOOLEAN_TYPE, method: :work_in_progress?, null: false,
- description: 'Indicates if the merge request is a work in progress (WIP).'
+ description: 'Indicates if the merge request is a draft.'
field :merge_when_pipeline_succeeds, GraphQL::BOOLEAN_TYPE, null: true,
description: 'Indicates if the merge has been set to be merged when its pipeline succeeds (MWPS).'
field :diff_head_sha, GraphQL::STRING_TYPE, null: true,
@@ -108,6 +108,10 @@ module Types
null: false, calls_gitaly: true,
method: :target_branch_exists?,
description: 'Indicates if the target branch of the merge request exists.'
+ field :diverged_from_target_branch, GraphQL::BOOLEAN_TYPE,
+ null: false, calls_gitaly: true,
+ method: :diverged_from_target_branch?,
+ description: 'Indicates if the source branch is behind the target branch.'
field :mergeable_discussions_state, GraphQL::BOOLEAN_TYPE, null: true,
description: 'Indicates if all discussions in the merge request have been resolved, allowing the merge request to be merged.'
field :web_url, GraphQL::STRING_TYPE, null: true,
diff --git a/app/graphql/types/merge_strategy_enum.rb b/app/graphql/types/merge_strategy_enum.rb
new file mode 100644
index 00000000000..2120dc576eb
--- /dev/null
+++ b/app/graphql/types/merge_strategy_enum.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Types
+ class MergeStrategyEnum < BaseEnum
+ AutoMergeService.all_strategies_ordered_by_preference.each do |strat|
+ value strat.upcase, value: strat, description: "Use the #{strat} merge strategy."
+ end
+ end
+end
diff --git a/app/graphql/types/milestone_state_enum.rb b/app/graphql/types/milestone_state_enum.rb
index e3b60395c9b..f3797f8f9e5 100644
--- a/app/graphql/types/milestone_state_enum.rb
+++ b/app/graphql/types/milestone_state_enum.rb
@@ -5,7 +5,7 @@ module Types
graphql_name 'MilestoneStateEnum'
description 'Current state of milestone'
- value 'active', description: 'Milestone is currently active'
- value 'closed', description: 'Milestone is closed'
+ value 'active', description: 'Milestone is currently active.'
+ value 'closed', description: 'Milestone is closed.'
end
end
diff --git a/app/graphql/types/mutation_operation_mode_enum.rb b/app/graphql/types/mutation_operation_mode_enum.rb
index 37e83e7a2e1..75c1d7cd4a6 100644
--- a/app/graphql/types/mutation_operation_mode_enum.rb
+++ b/app/graphql/types/mutation_operation_mode_enum.rb
@@ -7,8 +7,8 @@ module Types
# Suggested param name for the enum: `operation_mode`
- value 'REPLACE', 'Performs a replace operation'
- value 'APPEND', 'Performs an append operation'
- value 'REMOVE', 'Performs a removal operation'
+ value 'REPLACE', 'Performs a replace operation.'
+ value 'APPEND', 'Performs an append operation.'
+ value 'REMOVE', 'Performs a removal operation.'
end
end
diff --git a/app/graphql/types/mutation_type.rb b/app/graphql/types/mutation_type.rb
index 166f5617da2..c8671080461 100644
--- a/app/graphql/types/mutation_type.rb
+++ b/app/graphql/types/mutation_type.rb
@@ -24,6 +24,7 @@ module Types
mount_mutation Mutations::AwardEmojis::Toggle
mount_mutation Mutations::Boards::Create
mount_mutation Mutations::Boards::Destroy
+ mount_mutation Mutations::Boards::Update
mount_mutation Mutations::Boards::Issues::IssueMoveList
mount_mutation Mutations::Boards::Lists::Create
mount_mutation Mutations::Boards::Lists::Update
@@ -43,6 +44,7 @@ module Types
mount_mutation Mutations::Issues::Update
mount_mutation Mutations::Issues::Move
mount_mutation Mutations::Labels::Create
+ mount_mutation Mutations::MergeRequests::Accept
mount_mutation Mutations::MergeRequests::Create
mount_mutation Mutations::MergeRequests::Update
mount_mutation Mutations::MergeRequests::SetLabels
@@ -57,19 +59,14 @@ module Types
mount_mutation Mutations::Notes::Create::Note, calls_gitaly: true
mount_mutation Mutations::Notes::Create::DiffNote, calls_gitaly: true
mount_mutation Mutations::Notes::Create::ImageDiffNote, calls_gitaly: true
- mount_mutation Mutations::Notes::Update::Note,
- description: 'Updates a Note. If the body of the Note contains only quick actions, ' \
- 'the Note will be destroyed during the update, and no Note will be ' \
- 'returned'
- mount_mutation Mutations::Notes::Update::ImageDiffNote,
- description: 'Updates a DiffNote on an image (a `Note` where the `position.positionType` is `"image"`). ' \
- 'If the body of the Note contains only quick actions, the Note will be ' \
- 'destroyed during the update, and no Note will be returned'
+ mount_mutation Mutations::Notes::Update::Note
+ mount_mutation Mutations::Notes::Update::ImageDiffNote
mount_mutation Mutations::Notes::RepositionImageDiffNote
mount_mutation Mutations::Notes::Destroy
mount_mutation Mutations::Releases::Create
mount_mutation Mutations::Releases::Update
mount_mutation Mutations::Releases::Delete
+ mount_mutation Mutations::ReleaseAssetLinks::Create
mount_mutation Mutations::Terraform::State::Delete
mount_mutation Mutations::Terraform::State::Lock
mount_mutation Mutations::Terraform::State::Unlock
@@ -95,6 +92,7 @@ module Types
mount_mutation Mutations::Ci::Pipeline::Retry
mount_mutation Mutations::Ci::CiCdSettingsUpdate
mount_mutation Mutations::Namespace::PackageSettings::Update
+ mount_mutation Mutations::UserCallouts::Create
end
end
diff --git a/app/graphql/types/notes/diff_image_position_input_type.rb b/app/graphql/types/notes/diff_image_position_input_type.rb
index 23b53b20815..dd5c8f20cc3 100644
--- a/app/graphql/types/notes/diff_image_position_input_type.rb
+++ b/app/graphql/types/notes/diff_image_position_input_type.rb
@@ -2,7 +2,6 @@
module Types
module Notes
- # rubocop: disable Graphql/AuthorizeTypes
class DiffImagePositionInputType < DiffPositionBaseInputType
graphql_name 'DiffImagePositionInput'
@@ -15,6 +14,5 @@ module Types
argument :height, GraphQL::INT_TYPE, required: true,
description: copy_field_description(Types::Notes::DiffPositionType, :height)
end
- # rubocop: enable Graphql/AuthorizeTypes
end
end
diff --git a/app/graphql/types/notes/diff_position_base_input_type.rb b/app/graphql/types/notes/diff_position_base_input_type.rb
index a9b4e1a8948..c8f9f9028cc 100644
--- a/app/graphql/types/notes/diff_position_base_input_type.rb
+++ b/app/graphql/types/notes/diff_position_base_input_type.rb
@@ -2,7 +2,6 @@
module Types
module Notes
- # rubocop: disable Graphql/AuthorizeTypes
class DiffPositionBaseInputType < BaseInputObject
argument :head_sha, GraphQL::STRING_TYPE, required: true,
description: copy_field_description(Types::DiffRefsType, :head_sha)
@@ -17,6 +16,5 @@ module Types
description: 'The paths of the file that was changed. ' \
'Both of the properties of this input are optional, but at least one of them is required'
end
- # rubocop: enable Graphql/AuthorizeTypes
end
end
diff --git a/app/graphql/types/notes/diff_position_input_type.rb b/app/graphql/types/notes/diff_position_input_type.rb
index 02c91e173cb..7ec5fd9e086 100644
--- a/app/graphql/types/notes/diff_position_input_type.rb
+++ b/app/graphql/types/notes/diff_position_input_type.rb
@@ -2,15 +2,13 @@
module Types
module Notes
- # rubocop: disable Graphql/AuthorizeTypes
class DiffPositionInputType < DiffPositionBaseInputType
graphql_name 'DiffPositionInput'
argument :old_line, GraphQL::INT_TYPE, required: false,
description: copy_field_description(Types::Notes::DiffPositionType, :old_line)
- argument :new_line, GraphQL::INT_TYPE, required: true,
+ argument :new_line, GraphQL::INT_TYPE, required: false,
description: copy_field_description(Types::Notes::DiffPositionType, :new_line)
end
- # rubocop: enable Graphql/AuthorizeTypes
end
end
diff --git a/app/graphql/types/notes/position_type_enum.rb b/app/graphql/types/notes/position_type_enum.rb
index abdb2cfc804..9939f6511ce 100644
--- a/app/graphql/types/notes/position_type_enum.rb
+++ b/app/graphql/types/notes/position_type_enum.rb
@@ -6,8 +6,8 @@ module Types
graphql_name 'DiffPositionType'
description 'Type of file the position refers to'
- value 'text'
- value 'image'
+ value 'text', description: "A text file"
+ value 'image', description: "An image"
end
end
end
diff --git a/app/graphql/types/notes/update_diff_image_position_input_type.rb b/app/graphql/types/notes/update_diff_image_position_input_type.rb
index 1b915b65ae9..ab27f6b9ad3 100644
--- a/app/graphql/types/notes/update_diff_image_position_input_type.rb
+++ b/app/graphql/types/notes/update_diff_image_position_input_type.rb
@@ -3,8 +3,6 @@
module Types
module Notes
# InputType used for updateImageDiffNote mutation.
- #
- # rubocop: disable Graphql/AuthorizeTypes
class UpdateDiffImagePositionInputType < BaseInputObject
graphql_name 'UpdateDiffImagePositionInput'
@@ -32,6 +30,5 @@ module Types
end
end
end
- # rubocop: enable Graphql/AuthorizeTypes
end
end
diff --git a/app/graphql/types/project_type.rb b/app/graphql/types/project_type.rb
index 7205c615271..9a3f2e311e6 100644
--- a/app/graphql/types/project_type.rb
+++ b/app/graphql/types/project_type.rb
@@ -181,7 +181,7 @@ module Types
field :packages,
description: 'Packages of the project.',
- resolver: Resolvers::PackagesResolver
+ resolver: Resolvers::ProjectPackagesResolver
field :pipelines,
null: true,
@@ -273,6 +273,12 @@ module Types
description: 'Integrations which can receive alerts for the project.',
resolver: Resolvers::AlertManagement::IntegrationsResolver
+ field :alert_management_http_integrations,
+ Types::AlertManagement::HttpIntegrationType.connection_type,
+ null: true,
+ description: 'HTTP Integrations which can receive alerts for the project.',
+ resolver: Resolvers::AlertManagement::HttpIntegrationsResolver
+
field :releases,
Types::ReleaseType.connection_type,
null: true,
diff --git a/app/graphql/types/projects/namespace_project_sort_enum.rb b/app/graphql/types/projects/namespace_project_sort_enum.rb
index ede29748beb..bd7058196dd 100644
--- a/app/graphql/types/projects/namespace_project_sort_enum.rb
+++ b/app/graphql/types/projects/namespace_project_sort_enum.rb
@@ -6,8 +6,8 @@ module Types
graphql_name 'NamespaceProjectSort'
description 'Values for sorting projects'
- value 'SIMILARITY', 'Most similar to the search query', value: :similarity
- value 'STORAGE', 'Sort by storage size', value: :storage
+ value 'SIMILARITY', 'Most similar to the search query.', value: :similarity
+ value 'STORAGE', 'Sort by storage size.', value: :storage
end
end
end
diff --git a/app/graphql/types/query_type.rb b/app/graphql/types/query_type.rb
index 1d1ab4f2e17..74818bfcd42 100644
--- a/app/graphql/types/query_type.rb
+++ b/app/graphql/types/query_type.rb
@@ -78,14 +78,20 @@ module Types
field :issue, Types::IssueType,
null: true,
- description: 'Find an issue.' do
+ description: 'Find an Issue.' do
argument :id, ::Types::GlobalIDType[::Issue], required: true, description: 'The global ID of the Issue.'
end
- field :instance_statistics_measurements, Types::Admin::Analytics::InstanceStatistics::MeasurementType.connection_type,
+ field :instance_statistics_measurements, Types::Admin::Analytics::UsageTrends::MeasurementType.connection_type,
null: true,
description: 'Get statistics on the instance.',
- resolver: Resolvers::Admin::Analytics::InstanceStatistics::MeasurementsResolver
+ deprecated: { reason: 'This field was renamed. Use the `usageTrendsMeasurements` field instead', milestone: '13.10' },
+ resolver: Resolvers::Admin::Analytics::UsageTrends::MeasurementsResolver
+
+ field :usage_trends_measurements, Types::Admin::Analytics::UsageTrends::MeasurementType.connection_type,
+ null: true,
+ description: 'Get statistics on the instance.',
+ resolver: Resolvers::Admin::Analytics::UsageTrends::MeasurementsResolver
field :ci_application_settings, Types::Ci::ApplicationSettingType,
null: true,
diff --git a/app/graphql/types/range_input_type.rb b/app/graphql/types/range_input_type.rb
index b75c3669fbf..e31b8ecd811 100644
--- a/app/graphql/types/range_input_type.rb
+++ b/app/graphql/types/range_input_type.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
module Types
- # rubocop: disable Graphql/AuthorizeTypes
class RangeInputType < BaseInputObject
def self.[](type, closed = true)
@subtypes ||= {}
@@ -25,5 +24,4 @@ module Types
to_h
end
end
- # rubocop: enable Graphql/AuthorizeTypes
end
diff --git a/app/graphql/types/release_asset_link_input_type.rb b/app/graphql/types/release_asset_link_input_type.rb
index 242d19b683f..17d05a73797 100644
--- a/app/graphql/types/release_asset_link_input_type.rb
+++ b/app/graphql/types/release_asset_link_input_type.rb
@@ -1,25 +1,10 @@
# frozen_string_literal: true
module Types
- # rubocop: disable Graphql/AuthorizeTypes
class ReleaseAssetLinkInputType < BaseInputObject
graphql_name 'ReleaseAssetLinkInput'
description 'Fields that are available when modifying a release asset link'
- argument :name, GraphQL::STRING_TYPE,
- required: true,
- description: 'Name of the asset link.'
-
- argument :url, GraphQL::STRING_TYPE,
- required: true,
- description: 'URL of the asset link.'
-
- argument :direct_asset_path, GraphQL::STRING_TYPE,
- required: false, as: :filepath,
- description: 'Relative path for a direct asset link.'
-
- argument :link_type, Types::ReleaseAssetLinkTypeEnum,
- required: false, default_value: 'other',
- description: 'The type of the asset link.'
+ include Types::ReleaseAssetLinkSharedInputArguments
end
end
diff --git a/app/graphql/types/release_asset_link_shared_input_arguments.rb b/app/graphql/types/release_asset_link_shared_input_arguments.rb
new file mode 100644
index 00000000000..4aa247e47cc
--- /dev/null
+++ b/app/graphql/types/release_asset_link_shared_input_arguments.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+module Types
+ module ReleaseAssetLinkSharedInputArguments
+ extend ActiveSupport::Concern
+
+ included do
+ argument :name, GraphQL::STRING_TYPE,
+ required: true,
+ description: 'Name of the asset link.'
+
+ argument :url, GraphQL::STRING_TYPE,
+ required: true,
+ description: 'URL of the asset link.'
+
+ argument :direct_asset_path, GraphQL::STRING_TYPE,
+ required: false, as: :filepath,
+ description: 'Relative path for a direct asset link.'
+
+ argument :link_type, Types::ReleaseAssetLinkTypeEnum,
+ required: false, default_value: 'other',
+ description: 'The type of the asset link.'
+ end
+ end
+end
diff --git a/app/graphql/types/release_assets_input_type.rb b/app/graphql/types/release_assets_input_type.rb
index f50be89d43f..2c8d3de3495 100644
--- a/app/graphql/types/release_assets_input_type.rb
+++ b/app/graphql/types/release_assets_input_type.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
module Types
- # rubocop: disable Graphql/AuthorizeTypes
class ReleaseAssetsInputType < BaseInputObject
graphql_name 'ReleaseAssetsInput'
description 'Fields that are available when modifying release assets'
diff --git a/app/graphql/types/release_sort_enum.rb b/app/graphql/types/release_sort_enum.rb
index 2f9af1bced9..f51b73d89f1 100644
--- a/app/graphql/types/release_sort_enum.rb
+++ b/app/graphql/types/release_sort_enum.rb
@@ -9,10 +9,10 @@ module Types
# Borrowed from Types::SortEnum
# These values/descriptions should stay in-sync as much as possible.
- value 'CREATED_DESC', 'Created at descending order', value: :created_desc
- value 'CREATED_ASC', 'Created at ascending order', value: :created_asc
+ value 'CREATED_DESC', 'Created at descending order.', value: :created_desc
+ value 'CREATED_ASC', 'Created at ascending order.', value: :created_asc
- value 'RELEASED_AT_DESC', 'Released at by descending order', value: :released_at_desc
- value 'RELEASED_AT_ASC', 'Released at by ascending order', value: :released_at_asc
+ value 'RELEASED_AT_DESC', 'Released at by descending order.', value: :released_at_desc
+ value 'RELEASED_AT_ASC', 'Released at by ascending order.', value: :released_at_asc
end
end
diff --git a/app/graphql/types/snippets/blob_action_input_type.rb b/app/graphql/types/snippets/blob_action_input_type.rb
index c4289375f6b..13eade3dcc4 100644
--- a/app/graphql/types/snippets/blob_action_input_type.rb
+++ b/app/graphql/types/snippets/blob_action_input_type.rb
@@ -2,7 +2,7 @@
module Types
module Snippets
- class BlobActionInputType < BaseInputObject # rubocop:disable Graphql/AuthorizeTypes
+ class BlobActionInputType < BaseInputObject
graphql_name 'SnippetBlobActionInputType'
description 'Represents an action to perform over a snippet file'
diff --git a/app/graphql/types/snippets/blob_type.rb b/app/graphql/types/snippets/blob_type.rb
index fb0c1d9409b..fb9ee380705 100644
--- a/app/graphql/types/snippets/blob_type.rb
+++ b/app/graphql/types/snippets/blob_type.rb
@@ -14,7 +14,6 @@ module Types
field :plain_data, GraphQL::STRING_TYPE,
description: 'Blob plain highlighted data.',
- calls_gitaly: true,
null: true
field :raw_path, GraphQL::STRING_TYPE,
diff --git a/app/graphql/types/sort_enum.rb b/app/graphql/types/sort_enum.rb
index c3a76330fe9..ff994039b6d 100644
--- a/app/graphql/types/sort_enum.rb
+++ b/app/graphql/types/sort_enum.rb
@@ -7,14 +7,14 @@ module Types
# Deprecated, as we prefer uppercase enums
# https://gitlab.com/groups/gitlab-org/-/epics/1838
- value 'updated_desc', 'Updated at descending order', value: :updated_desc, deprecated: { reason: 'Use UPDATED_DESC', milestone: '13.5' }
- value 'updated_asc', 'Updated at ascending order', value: :updated_asc, deprecated: { reason: 'Use UPDATED_ASC', milestone: '13.5' }
- value 'created_desc', 'Created at descending order', value: :created_desc, deprecated: { reason: 'Use CREATED_DESC', milestone: '13.5' }
- value 'created_asc', 'Created at ascending order', value: :created_asc, deprecated: { reason: 'Use CREATED_ASC', milestone: '13.5' }
+ value 'updated_desc', 'Updated at descending order.', value: :updated_desc, deprecated: { reason: 'Use UPDATED_DESC', milestone: '13.5' }
+ value 'updated_asc', 'Updated at ascending order.', value: :updated_asc, deprecated: { reason: 'Use UPDATED_ASC', milestone: '13.5' }
+ value 'created_desc', 'Created at descending order.', value: :created_desc, deprecated: { reason: 'Use CREATED_DESC', milestone: '13.5' }
+ value 'created_asc', 'Created at ascending order.', value: :created_asc, deprecated: { reason: 'Use CREATED_ASC', milestone: '13.5' }
- value 'UPDATED_DESC', 'Updated at descending order', value: :updated_desc
- value 'UPDATED_ASC', 'Updated at ascending order', value: :updated_asc
- value 'CREATED_DESC', 'Created at descending order', value: :created_desc
- value 'CREATED_ASC', 'Created at ascending order', value: :created_asc
+ value 'UPDATED_DESC', 'Updated at descending order.', value: :updated_desc
+ value 'UPDATED_ASC', 'Updated at ascending order.', value: :updated_asc
+ value 'CREATED_DESC', 'Created at descending order.', value: :created_desc
+ value 'CREATED_ASC', 'Created at ascending order.', value: :created_asc
end
end
diff --git a/app/graphql/types/timeframe_input_type.rb b/app/graphql/types/timeframe_input_type.rb
index 79c1bc5cf01..02a0ec7df7a 100644
--- a/app/graphql/types/timeframe_input_type.rb
+++ b/app/graphql/types/timeframe_input_type.rb
@@ -1,10 +1,8 @@
# frozen_string_literal: true
module Types
- # rubocop: disable Graphql/AuthorizeTypes
class TimeframeInputType < RangeInputType[::Types::DateType]
graphql_name 'Timeframe'
description 'A time-frame defined as a closed inclusive range of two dates'
end
- # rubocop: enable Graphql/AuthorizeTypes
end
diff --git a/app/graphql/types/todo_action_enum.rb b/app/graphql/types/todo_action_enum.rb
index 0e538838474..ef43b6eb464 100644
--- a/app/graphql/types/todo_action_enum.rb
+++ b/app/graphql/types/todo_action_enum.rb
@@ -2,12 +2,14 @@
module Types
class TodoActionEnum < BaseEnum
- value 'assigned', value: 1
- value 'mentioned', value: 2
- value 'build_failed', value: 3
- value 'marked', value: 4
- value 'approval_required', value: 5
- value 'unmergeable', value: 6
- value 'directly_addressed', value: 7
+ value 'assigned', value: 1, description: 'User was assigned.'
+ value 'mentioned', value: 2, description: 'User was mentioned.'
+ value 'build_failed', value: 3, description: 'Build triggered by the user failed.'
+ value 'marked', value: 4, description: 'User added a TODO.'
+ value 'approval_required', value: 5, description: 'User was set as an approver.'
+ value 'unmergeable', value: 6, description: 'Merge request authored by the user could not be merged.'
+ value 'directly_addressed', value: 7, description: 'User was directly addressed.'
+ value 'merge_train_removed', value: 8, description: 'Merge request authored by the user was removed from the merge train.'
+ value 'review_requested', value: 9, description: 'Review was requested from the user.'
end
end
diff --git a/app/graphql/types/todo_state_enum.rb b/app/graphql/types/todo_state_enum.rb
index 29a28b5208d..604e2a62f70 100644
--- a/app/graphql/types/todo_state_enum.rb
+++ b/app/graphql/types/todo_state_enum.rb
@@ -2,7 +2,7 @@
module Types
class TodoStateEnum < BaseEnum
- value 'pending'
- value 'done'
+ value 'pending', description: "The state of the todo is pending."
+ value 'done', description: "The state of the todo is done."
end
end
diff --git a/app/graphql/types/todo_target_enum.rb b/app/graphql/types/todo_target_enum.rb
index b797722fef8..ebf65e99936 100644
--- a/app/graphql/types/todo_target_enum.rb
+++ b/app/graphql/types/todo_target_enum.rb
@@ -2,11 +2,11 @@
module Types
class TodoTargetEnum < BaseEnum
- value 'COMMIT', value: 'Commit', description: 'A Commit'
- value 'ISSUE', value: 'Issue', description: 'An Issue'
- value 'MERGEREQUEST', value: 'MergeRequest', description: 'A MergeRequest'
- value 'DESIGN', value: 'DesignManagement::Design', description: 'A Design'
- value 'ALERT', value: 'AlertManagement::Alert', description: 'An Alert'
+ value 'COMMIT', value: 'Commit', description: 'A Commit.'
+ value 'ISSUE', value: 'Issue', description: 'An Issue.'
+ value 'MERGEREQUEST', value: 'MergeRequest', description: 'A MergeRequest.'
+ value 'DESIGN', value: 'DesignManagement::Design', description: 'A Design.'
+ value 'ALERT', value: 'AlertManagement::Alert', description: 'An Alert.'
end
end
diff --git a/app/graphql/types/tree/blob_type.rb b/app/graphql/types/tree/blob_type.rb
index 3823bd94083..d192c8d3c57 100644
--- a/app/graphql/types/tree/blob_type.rb
+++ b/app/graphql/types/tree/blob_type.rb
@@ -15,6 +15,7 @@ module Types
field :web_path, GraphQL::STRING_TYPE, null: true,
description: 'Web path of the blob.'
field :lfs_oid, GraphQL::STRING_TYPE, null: true,
+ calls_gitaly: true,
description: 'LFS ID of the blob.'
field :mode, GraphQL::STRING_TYPE, null: true,
description: 'Blob mode in numeric format.'
diff --git a/app/graphql/types/user_callout_feature_name_enum.rb b/app/graphql/types/user_callout_feature_name_enum.rb
new file mode 100644
index 00000000000..410ca5e1c95
--- /dev/null
+++ b/app/graphql/types/user_callout_feature_name_enum.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+module Types
+ class UserCalloutFeatureNameEnum < BaseEnum
+ graphql_name 'UserCalloutFeatureNameEnum'
+ description 'Name of the feature that the callout is for.'
+
+ ::UserCallout.feature_names.keys.each do |feature_name|
+ value feature_name.upcase, value: feature_name, description: "Callout feature name for #{feature_name}."
+ end
+ end
+end
diff --git a/app/graphql/types/user_callout_type.rb b/app/graphql/types/user_callout_type.rb
new file mode 100644
index 00000000000..12f4fdea878
--- /dev/null
+++ b/app/graphql/types/user_callout_type.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+module Types
+ class UserCalloutType < BaseObject # rubocop:disable Graphql/AuthorizeTypes
+ graphql_name 'UserCallout'
+
+ field :feature_name, UserCalloutFeatureNameEnum, null: false,
+ description: 'Name of the feature that the callout is for.'
+ field :dismissed_at, Types::TimeType, null: true,
+ description: 'Date when the callout was dismissed.'
+ end
+end
diff --git a/app/graphql/types/user_state_enum.rb b/app/graphql/types/user_state_enum.rb
index d34936b4c48..5adec17672e 100644
--- a/app/graphql/types/user_state_enum.rb
+++ b/app/graphql/types/user_state_enum.rb
@@ -5,8 +5,8 @@ module Types
graphql_name 'UserState'
description 'Possible states of a user'
- value 'active', 'The user is active and is able to use the system', value: 'active'
- value 'blocked', 'The user has been blocked and is prevented from using the system', value: 'blocked'
- value 'deactivated', 'The user is no longer active and is unable to use the system', value: 'deactivated'
+ value 'active', 'The user is active and is able to use the system.', value: 'active'
+ value 'blocked', 'The user has been blocked and is prevented from using the system.', value: 'blocked'
+ value 'deactivated', 'The user is no longer active and is unable to use the system.', value: 'deactivated'
end
end
diff --git a/app/graphql/types/user_type.rb b/app/graphql/types/user_type.rb
index 0cefc84633d..2cc7d379240 100644
--- a/app/graphql/types/user_type.rb
+++ b/app/graphql/types/user_type.rb
@@ -67,5 +67,9 @@ module Types
null: true,
description: 'Snippets authored by the user.',
resolver: Resolvers::Users::SnippetsResolver
+ field :callouts,
+ Types::UserCalloutType.connection_type,
+ null: true,
+ description: 'User callouts that belong to the user.'
end
end
diff --git a/app/graphql/types/visibility_levels_enum.rb b/app/graphql/types/visibility_levels_enum.rb
index d5ace24455e..07718679bef 100644
--- a/app/graphql/types/visibility_levels_enum.rb
+++ b/app/graphql/types/visibility_levels_enum.rb
@@ -3,7 +3,7 @@
module Types
class VisibilityLevelsEnum < BaseEnum
Gitlab::VisibilityLevel.string_options.each do |name, int_value|
- value name.downcase, value: int_value
+ value name.downcase, value: int_value, description: "#{name.titleize} visibility level."
end
end
end
diff --git a/app/helpers/analytics/navbar_helper.rb b/app/helpers/analytics/navbar_helper.rb
index bc0b5e7c74f..33a5028cdf1 100644
--- a/app/helpers/analytics/navbar_helper.rb
+++ b/app/helpers/analytics/navbar_helper.rb
@@ -58,7 +58,7 @@ module Analytics
return unless project.feature_available?(:builds, current_user) || !project.empty_repo?
navbar_sub_item(
- title: _('CI / CD'),
+ title: _('CI/CD'),
path: 'pipelines#charts',
link: charts_project_pipelines_path(project)
)
diff --git a/app/helpers/application_settings_helper.rb b/app/helpers/application_settings_helper.rb
index 30ae535b06f..551e08d1e31 100644
--- a/app/helpers/application_settings_helper.rb
+++ b/app/helpers/application_settings_helper.rb
@@ -37,13 +37,8 @@ module ApplicationSettingsHelper
end
def storage_weights
- ApplicationSetting.repository_storages_weighted_attributes.map do |attribute|
- storage = attribute.to_s.delete_prefix('repository_storages_weighted_')
- {
- name: attribute,
- label: storage,
- value: @application_setting.repository_storages_weighted[storage] || 0
- }
+ Gitlab.config.repositories.storages.keys.each_with_object(OpenStruct.new) do |storage, weights|
+ weights[storage.to_sym] = @application_setting.repository_storages_weighted[storage] || 0
end
end
@@ -252,6 +247,7 @@ module ApplicationSettingsHelper
:housekeeping_incremental_repack_period,
:html_emails_enabled,
:import_sources,
+ :in_product_marketing_emails_enabled,
:invisible_captcha_enabled,
:max_artifacts_size,
:max_attachment_size,
diff --git a/app/helpers/auth_helper.rb b/app/helpers/auth_helper.rb
index 24c1d224c89..cacf9c7ad0b 100644
--- a/app/helpers/auth_helper.rb
+++ b/app/helpers/auth_helper.rb
@@ -1,8 +1,22 @@
# frozen_string_literal: true
module AuthHelper
- PROVIDERS_WITH_ICONS = %w(twitter github gitlab bitbucket google_oauth2 facebook azure_oauth2 authentiq salesforce atlassian_oauth2 openid_connect).freeze
+ PROVIDERS_WITH_ICONS = %w(
+ atlassian_oauth2
+ authentiq
+ azure_activedirectory_v2
+ azure_oauth2
+ bitbucket
+ facebook
+ github
+ gitlab
+ google_oauth2
+ openid_connect
+ salesforce
+ twitter
+ ).freeze
LDAP_PROVIDER = /\Aldap/.freeze
+ TRIAL_REGISTRATION_PROVIDERS = %w(google_oauth2 github).freeze
def ldap_enabled?
Gitlab::Auth::Ldap::Config.enabled?
@@ -113,8 +127,8 @@ module AuthHelper
end
end
- def experiment_enabled_button_based_providers
- enabled_button_based_providers & %w(google_oauth2 github).freeze
+ def trial_enabled_button_based_providers
+ enabled_button_based_providers & TRIAL_REGISTRATION_PROVIDERS
end
def button_based_providers_enabled?
@@ -125,11 +139,11 @@ module AuthHelper
label = label_for_provider(provider)
if provider_has_custom_icon?(provider)
- image_tag(icon_for_provider(provider), alt: label, title: "Sign in with #{label}")
+ image_tag(icon_for_provider(provider), alt: label, title: "Sign in with #{label}", class: "gl-button-icon")
elsif provider_has_builtin_icon?(provider)
file_name = "#{provider.to_s.split('_').first}_#{size}.png"
- image_tag("auth_buttons/#{file_name}", alt: label, title: "Sign in with #{label}")
+ image_tag("auth_buttons/#{file_name}", alt: label, title: "Sign in with #{label}", class: "gl-button-icon")
else
label
end
diff --git a/app/helpers/avatars_helper.rb b/app/helpers/avatars_helper.rb
index 5457f96d506..8d22bda279f 100644
--- a/app/helpers/avatars_helper.rb
+++ b/app/helpers/avatars_helper.rb
@@ -22,11 +22,14 @@ module AvatarsHelper
end
def avatar_icon_for_email(email = nil, size = nil, scale = 2, only_path: true)
- user = User.find_by_any_email(email)
- if user
- avatar_icon_for_user(user, size, scale, only_path: only_path)
+ return gravatar_icon(email, size, scale) if email.nil?
+
+ if Feature.enabled?(:avatar_cache_for_email, @current_user, type: :development)
+ Gitlab::AvatarCache.by_email(email, size, scale, only_path) do
+ avatar_icon_by_user_email_or_gravatar(email, size, scale, only_path: only_path)
+ end
else
- gravatar_icon(email, size, scale)
+ avatar_icon_by_user_email_or_gravatar(email, size, scale, only_path: only_path)
end
end
@@ -101,19 +104,23 @@ module AvatarsHelper
private
- def user_avatar_url_for(only_path: true, **options)
- return options[:url] if options[:url]
-
- email = options[:user_email]
- user = options.key?(:user) ? options[:user] : User.find_by_any_email(email)
+ def avatar_icon_by_user_email_or_gravatar(email, size, scale, only_path:)
+ user = User.find_by_any_email(email)
if user
- avatar_icon_for_user(user, options[:size], only_path: only_path)
+ avatar_icon_for_user(user, size, scale, only_path: only_path)
else
- gravatar_icon(email, options[:size])
+ gravatar_icon(email, size, scale)
end
end
+ def user_avatar_url_for(only_path: true, **options)
+ return options[:url] if options[:url]
+ return avatar_icon_for_user(options[:user], options[:size], only_path: only_path) if options[:user]
+
+ avatar_icon_for_email(options[:user_email], options[:size], only_path: only_path)
+ end
+
def source_icon(source, options = {})
avatar_url = source.try(:avatar_url)
diff --git a/app/helpers/blob_helper.rb b/app/helpers/blob_helper.rb
index 28a947a6ca1..41bbd0fddd5 100644
--- a/app/helpers/blob_helper.rb
+++ b/app/helpers/blob_helper.rb
@@ -235,7 +235,9 @@ module BlobHelper
def copy_blob_source_button(blob)
return unless blob.rendered_as_text?(ignore_errors: false)
- clipboard_button(target: ".blob-content[data-blob-id='#{blob.id}'] > pre", class: "btn gl-button btn-default btn-icon js-copy-blob-source-btn", title: _("Copy file contents"))
+ content_tag(:span, class: 'btn-group has-tooltip js-copy-blob-source-btn-tooltip') do
+ clipboard_button(target: ".blob-content[data-blob-id='#{blob.id}'] > pre", class: "btn gl-button btn-default btn-icon js-copy-blob-source-btn", hide_tooltip: true)
+ end
end
def open_raw_blob_button(blob)
diff --git a/app/helpers/ci/pipeline_editor_helper.rb b/app/helpers/ci/pipeline_editor_helper.rb
index 3f48b2687b9..a71b0f4a83a 100644
--- a/app/helpers/ci/pipeline_editor_helper.rb
+++ b/app/helpers/ci/pipeline_editor_helper.rb
@@ -5,8 +5,7 @@ module Ci
include ChecksCollaboration
def can_view_pipeline_editor?(project)
- can_collaborate_with_project?(project) &&
- Gitlab::Ci::Features.ci_pipeline_editor_page_enabled?(project)
+ can_collaborate_with_project?(project)
end
end
end
diff --git a/app/helpers/commits_helper.rb b/app/helpers/commits_helper.rb
index f5c75d62097..2f5bfc181cb 100644
--- a/app/helpers/commits_helper.rb
+++ b/app/helpers/commits_helper.rb
@@ -105,7 +105,7 @@ module CommitsHelper
tooltip = _("Browse Directory")
end
- link_to url, class: "btn gl-button btn-default has-tooltip", title: tooltip, data: { container: "body" } do
+ link_to url, class: "btn gl-button btn-default btn-icon has-tooltip", title: tooltip, data: { container: "body" } do
sprite_icon('folder-open')
end
end
@@ -127,7 +127,7 @@ module CommitsHelper
end
def conditionally_paginate_diff_files(diffs, paginate:, per: Projects::CommitController::COMMIT_DIFFS_PER_PAGE)
- if paginate && Feature.enabled?(:paginate_commit_view, @project, type: :development)
+ if paginate
Kaminari.paginate_array(diffs.diff_files.to_a).page(params[:page]).per(per)
else
diffs.diff_files
diff --git a/app/helpers/compare_helper.rb b/app/helpers/compare_helper.rb
index 9ece8b0bc5b..b07baf59114 100644
--- a/app/helpers/compare_helper.rb
+++ b/app/helpers/compare_helper.rb
@@ -1,22 +1,47 @@
# frozen_string_literal: true
module CompareHelper
- def create_mr_button?(from = params[:from], to = params[:to], project = @project)
+ def create_mr_button?(from: params[:from], to: params[:to], source_project: @project, target_project: @target_project)
from.present? &&
to.present? &&
from != to &&
- can?(current_user, :create_merge_request_from, project) &&
- project.repository.branch_exists?(from) &&
- project.repository.branch_exists?(to)
+ can?(current_user, :create_merge_request_from, source_project) &&
+ can?(current_user, :create_merge_request_in, target_project) &&
+ target_project.repository.branch_exists?(from) &&
+ source_project.repository.branch_exists?(to)
end
- def create_mr_path(from = params[:from], to = params[:to], project = @project)
+ def create_mr_path(from: params[:from], to: params[:to], source_project: @project, target_project: @target_project)
project_new_merge_request_path(
- project,
+ target_project,
merge_request: {
+ source_project_id: source_project.id,
source_branch: to,
+ target_project_id: target_project.id,
target_branch: from
}
)
end
+
+ def target_projects(source_project)
+ MergeRequestTargetProjectFinder
+ .new(current_user: current_user, source_project: source_project, project_feature: :repository)
+ .execute(include_routes: true)
+ end
+
+ def project_compare_selector_data(project, merge_request, params)
+ {
+ project_compare_index_path: project_compare_index_path(project),
+ refs_project_path: refs_project_path(project),
+ params_from: params[:from],
+ params_to: params[:to],
+ project_merge_request_path: merge_request.present? ? project_merge_request_path(project, merge_request) : '',
+ create_mr_path: create_mr_button? ? create_mr_path : ''
+ }.tap do |data|
+ if Feature.enabled?(:compare_repo_dropdown, project, default_enabled: :yaml)
+ data[:project_to] = { id: project.id, name: project.full_path }.to_json
+ data[:projects_from] = target_projects(project).map { |project| { id: project.id, name: project.full_path } }.to_json
+ end
+ end
+ end
end
diff --git a/app/helpers/diff_helper.rb b/app/helpers/diff_helper.rb
index 233a8260036..10c7b4032cf 100644
--- a/app/helpers/diff_helper.rb
+++ b/app/helpers/diff_helper.rb
@@ -4,8 +4,8 @@ module DiffHelper
def mark_inline_diffs(old_line, new_line)
old_diffs, new_diffs = Gitlab::Diff::InlineDiff.new(old_line, new_line).inline_diffs
- marked_old_line = Gitlab::Diff::InlineDiffMarker.new(old_line).mark(old_diffs, mode: :deletion)
- marked_new_line = Gitlab::Diff::InlineDiffMarker.new(new_line).mark(new_diffs, mode: :addition)
+ marked_old_line = Gitlab::Diff::InlineDiffMarker.new(old_line).mark(old_diffs)
+ marked_new_line = Gitlab::Diff::InlineDiffMarker.new(new_line).mark(new_diffs)
[marked_old_line, marked_new_line]
end
@@ -232,7 +232,7 @@ module DiffHelper
# Always use HTML to handle case where JSON diff rendered this button
params_copy.delete(:format)
- link_to url_for(params_copy), id: "#{name}-diff-btn", class: (selected ? 'btn gl-button active' : 'btn gl-button'), data: { view_type: name } do
+ link_to url_for(params_copy), id: "#{name}-diff-btn", class: (selected ? 'btn gl-button btn-default selected' : 'btn gl-button btn-default'), data: { view_type: name } do
title
end
end
diff --git a/app/helpers/gitlab_routing_helper.rb b/app/helpers/gitlab_routing_helper.rb
index 7ae00a70671..6dcdc018a20 100644
--- a/app/helpers/gitlab_routing_helper.rb
+++ b/app/helpers/gitlab_routing_helper.rb
@@ -347,6 +347,11 @@ module GitlabRoutingHelper
Gitlab::UrlBuilder.wiki_page_url(wiki, page, only_path: true, **options)
end
+ # GraphQL ETag routes
+ def graphql_etag_pipeline_path(pipeline)
+ [api_graphql_path, "pipelines/id/#{pipeline.id}"].join(':')
+ end
+
private
def snippet_query_params(snippet, *args)
diff --git a/app/helpers/ide_helper.rb b/app/helpers/ide_helper.rb
index 93f5ca7258d..5f0d513ba35 100644
--- a/app/helpers/ide_helper.rb
+++ b/app/helpers/ide_helper.rb
@@ -3,18 +3,31 @@
module IdeHelper
def ide_data
{
- "empty-state-svg-path" => image_path('illustrations/multi_file_editor_empty.svg'),
- "no-changes-state-svg-path" => image_path('illustrations/multi-editor_no_changes_empty.svg'),
- "committed-state-svg-path" => image_path('illustrations/multi-editor_all_changes_committed_empty.svg'),
- "pipelines-empty-state-svg-path": image_path('illustrations/pipelines_empty.svg'),
- "promotion-svg-path": image_path('illustrations/web-ide_promotion.svg'),
- "ci-help-page-path" => help_page_path('ci/quick_start/README'),
- "web-ide-help-page-path" => help_page_path('user/project/web_ide/index.md'),
- "clientside-preview-enabled": Gitlab::CurrentSettings.web_ide_clientside_preview_enabled?.to_s,
- "render-whitespace-in-code": current_user.render_whitespace_in_code.to_s,
- "codesandbox-bundler-url": Gitlab::CurrentSettings.web_ide_clientside_preview_bundler_url
+ 'empty-state-svg-path' => image_path('illustrations/multi_file_editor_empty.svg'),
+ 'no-changes-state-svg-path' => image_path('illustrations/multi-editor_no_changes_empty.svg'),
+ 'committed-state-svg-path' => image_path('illustrations/multi-editor_all_changes_committed_empty.svg'),
+ 'pipelines-empty-state-svg-path': image_path('illustrations/pipelines_empty.svg'),
+ 'promotion-svg-path': image_path('illustrations/web-ide_promotion.svg'),
+ 'ci-help-page-path' => help_page_path('ci/quick_start/README'),
+ 'web-ide-help-page-path' => help_page_path('user/project/web_ide/index.md'),
+ 'clientside-preview-enabled': Gitlab::CurrentSettings.web_ide_clientside_preview_enabled?.to_s,
+ 'render-whitespace-in-code': current_user.render_whitespace_in_code.to_s,
+ 'codesandbox-bundler-url': Gitlab::CurrentSettings.web_ide_clientside_preview_bundler_url,
+ 'branch-name' => @branch,
+ 'file-path' => @path,
+ 'merge-request' => @merge_request,
+ 'forked-project' => convert_to_project_entity_json(@forked_project),
+ 'project' => convert_to_project_entity_json(@project)
}
end
+
+ private
+
+ def convert_to_project_entity_json(project)
+ return unless project
+
+ API::Entities::Project.represent(project).to_json
+ end
end
::IdeHelper.prepend_if_ee('::EE::IdeHelper')
diff --git a/app/helpers/in_product_marketing_helper.rb b/app/helpers/in_product_marketing_helper.rb
index a0e533d3fb8..ccf3fe51870 100644
--- a/app/helpers/in_product_marketing_helper.rb
+++ b/app/helpers/in_product_marketing_helper.rb
@@ -47,7 +47,7 @@ module InProductMarketingHelper
s_('InProductMarketing|Are your runners ready?')
],
trial: [
- s_('InProductMarketing|Start a free trial of GitLab Gold – no CC required'),
+ s_('InProductMarketing|Start a free trial of GitLab Ultimate – no CC required'),
s_('InProductMarketing|Improve app security with a 30-day trial'),
s_('InProductMarketing|Start with a GitLab Gold free trial')
],
diff --git a/app/helpers/invite_members_helper.rb b/app/helpers/invite_members_helper.rb
index 889365e39de..62d83ebe79e 100644
--- a/app/helpers/invite_members_helper.rb
+++ b/app/helpers/invite_members_helper.rb
@@ -13,7 +13,7 @@ module InviteMembersHelper
def directly_invite_members?
strong_memoize(:directly_invite_members) do
- experiment_enabled?(:invite_members_version_a) && can_import_members?
+ can_import_members?
end
end
@@ -23,6 +23,14 @@ module InviteMembersHelper
end
end
+ def show_invite_members_track_event
+ if directly_invite_members?
+ 'show_invite_members'
+ elsif indirectly_invite_members?
+ 'show_invite_members_version_b'
+ end
+ end
+
def invite_group_members?(group)
experiment_enabled?(:invite_members_empty_group_version_a) && Ability.allowed?(current_user, :admin_group_member, group)
end
diff --git a/app/helpers/issuables_description_templates_helper.rb b/app/helpers/issuables_description_templates_helper.rb
index 110b3954900..5f69098de56 100644
--- a/app/helpers/issuables_description_templates_helper.rb
+++ b/app/helpers/issuables_description_templates_helper.rb
@@ -5,7 +5,8 @@ module IssuablesDescriptionTemplatesHelper
include GitlabRoutingHelper
def template_dropdown_tag(issuable, &block)
- title = selected_template(issuable) || "Choose a template"
+ selected_template = selected_template(issuable)
+ title = selected_template || "Choose a template"
options = {
toggle_class: 'js-issuable-selector',
title: title,
@@ -15,7 +16,7 @@ module IssuablesDescriptionTemplatesHelper
data: {
data: issuable_templates(ref_project, issuable.to_ability_name),
field_name: 'issuable_template',
- selected: selected_template(issuable),
+ selected: selected_template,
project_id: ref_project.id
}
}
@@ -28,15 +29,21 @@ module IssuablesDescriptionTemplatesHelper
def issuable_templates(project, issuable_type)
@template_types ||= {}
@template_types[project.id] ||= {}
- @template_types[project.id][issuable_type] ||= TemplateFinder.all_template_names_array(project, issuable_type.pluralize)
+ @template_types[project.id][issuable_type] ||= TemplateFinder.all_template_names_hash_or_array(project, issuable_type)
end
def issuable_templates_names(issuable)
- issuable_templates(ref_project, issuable.to_ability_name).map { |template| template[:name] }
+ all_templates = issuable_templates(ref_project, issuable.to_ability_name)
+
+ if ref_project.inherited_issuable_templates_enabled?
+ all_templates.values.flatten.map { |tpl| tpl[:name] if tpl[:project_id] == ref_project.id }.compact.uniq
+ else
+ all_templates.map { |template| template[:name] }
+ end
end
def selected_template(issuable)
- params[:issuable_template] if issuable_templates(ref_project, issuable.to_ability_name).any? { |template| template[:name] == params[:issuable_template] }
+ params[:issuable_template] if issuable_templates_names(issuable).any? { |tmpl_name| tmpl_name == params[:issuable_template] }
end
def template_names_path(parent, issuable)
diff --git a/app/helpers/issuables_helper.rb b/app/helpers/issuables_helper.rb
index 41e9f61cf9f..639a54fa9ec 100644
--- a/app/helpers/issuables_helper.rb
+++ b/app/helpers/issuables_helper.rb
@@ -151,7 +151,7 @@ module IssuablesHelper
def issuable_meta(issuable, project)
output = []
- output << "Opened #{time_ago_with_tooltip(issuable.created_at)} by ".html_safe
+ output << "Created #{time_ago_with_tooltip(issuable.created_at)} by ".html_safe
if issuable.is_a?(Issue) && issuable.service_desk_reply_to
output << "#{html_escape(issuable.service_desk_reply_to)} via "
@@ -388,7 +388,8 @@ module IssuablesHelper
iid: issuable[:iid],
severity: issuable[:severity],
timeTrackingLimitToHours: Gitlab::CurrentSettings.time_tracking_limit_to_hours,
- createNoteEmail: issuable[:create_note_email]
+ createNoteEmail: issuable[:create_note_email],
+ issuableType: issuable[:type]
}
end
diff --git a/app/helpers/jira_connect_helper.rb b/app/helpers/jira_connect_helper.rb
index 080883fd594..76a7f785df6 100644
--- a/app/helpers/jira_connect_helper.rb
+++ b/app/helpers/jira_connect_helper.rb
@@ -1,13 +1,7 @@
# frozen_string_literal: true
module JiraConnectHelper
- def new_jira_connect_ui?
- Feature.enabled?(:new_jira_connect_ui, type: :development, default_enabled: :yaml)
- end
-
def jira_connect_app_data(subscriptions)
- return {} unless new_jira_connect_ui?
-
skip_groups = subscriptions.map(&:namespace_id)
{
diff --git a/app/helpers/learn_gitlab_helper.rb b/app/helpers/learn_gitlab_helper.rb
index e72a9c83fc9..f50c1e52bed 100644
--- a/app/helpers/learn_gitlab_helper.rb
+++ b/app/helpers/learn_gitlab_helper.rb
@@ -15,7 +15,8 @@ module LearnGitlabHelper
[
action,
url: url,
- completed: attributes[OnboardingProgress.column_name(action)].present?
+ completed: attributes[OnboardingProgress.column_name(action)].present?,
+ svg: image_path("learn_gitlab/#{action}.svg")
]
end.to_h
end
@@ -23,13 +24,13 @@ module LearnGitlabHelper
private
ACTION_ISSUE_IDS = {
- git_write: 2,
- pipeline_created: 4,
- merge_request_created: 6,
- user_added: 7,
- trial_started: 13,
- required_mr_approvals_enabled: 15,
- code_owners_enabled: 16
+ git_write: 6,
+ pipeline_created: 7,
+ merge_request_created: 9,
+ user_added: 8,
+ trial_started: 2,
+ required_mr_approvals_enabled: 11,
+ code_owners_enabled: 10
}.freeze
ACTION_DOC_URLS = {
diff --git a/app/helpers/merge_requests_helper.rb b/app/helpers/merge_requests_helper.rb
index ff1305f8cc5..7a798c83b7e 100644
--- a/app/helpers/merge_requests_helper.rb
+++ b/app/helpers/merge_requests_helper.rb
@@ -174,6 +174,18 @@ module MergeRequestsHelper
end
end
+ def reviewers_label(merge_request, include_value: true)
+ reviewers = merge_request.reviewers
+ reviewer_label = 'Reviewer'.pluralize(reviewers.count)
+
+ if include_value
+ sanitized_list = sanitize_name(reviewers.map(&:name).to_sentence)
+ "#{reviewer_label}: #{sanitized_list}"
+ else
+ reviewer_label
+ end
+ end
+
private
def review_requested_merge_requests_count
diff --git a/app/helpers/notifications_helper.rb b/app/helpers/notifications_helper.rb
index 729585be84a..9db28b54fe9 100644
--- a/app/helpers/notifications_helper.rb
+++ b/app/helpers/notifications_helper.rb
@@ -72,52 +72,6 @@ module NotificationsHelper
end
end
- def notification_list_item(level, setting)
- title = notification_title(level)
-
- data = {
- notification_level: level,
- notification_title: title
- }
-
- content_tag(:li, role: "menuitem") do
- link_to '#', class: "update-notification #{('is-active' if setting.level == level)}", data: data do
- link_output = content_tag(:strong, title, class: 'dropdown-menu-inner-title')
- link_output << content_tag(:span, notification_description(level), class: 'dropdown-menu-inner-content')
- end
- end
- end
-
- # Identifier to trigger individually dropdowns and custom settings modals in the same view
- def notifications_menu_identifier(type, notification_setting)
- "#{type}-#{notification_setting.user_id}-#{notification_setting.source_id}-#{notification_setting.source_type}"
- end
-
- # Create hidden field to send notification setting source to controller
- def hidden_setting_source_input(notification_setting)
- return unless notification_setting.source_type
-
- hidden_field_tag "#{notification_setting.source_type.downcase}_id", notification_setting.source_id
- end
-
- def notification_event_name(event)
- # All values from NotificationSetting.email_events
- case event
- when :success_pipeline
- s_('NotificationEvent|Successful pipeline')
- else
- event_name = "NotificationEvent|#{event.to_s.humanize}"
- s_(event_name)
- end
- end
-
- def notification_setting_icon(notification_setting = nil)
- sprite_icon(
- !notification_setting.present? || notification_setting.disabled? ? "notifications-off" : "notifications",
- css_class: "icon notifications-icon js-notifications-icon"
- )
- end
-
def show_unsubscribe_title?(noteable)
can?(current_user, "read_#{noteable.to_ability_name}".to_sym, noteable)
end
diff --git a/app/helpers/preferences_helper.rb b/app/helpers/preferences_helper.rb
index c2a77abb9c9..12bc509466e 100644
--- a/app/helpers/preferences_helper.rb
+++ b/app/helpers/preferences_helper.rb
@@ -29,6 +29,7 @@ module PreferencesHelper
stars: _("Starred Projects"),
project_activity: _("Your Projects' Activity"),
starred_project_activity: _("Starred Projects' Activity"),
+ followed_user_activity: _("Followed Users' Activity"),
groups: _("Your Groups"),
todos: _("Your To-Do List"),
issues: _("Assigned Issues"),
diff --git a/app/helpers/projects/project_members_helper.rb b/app/helpers/projects/project_members_helper.rb
index 99c1b742da4..662afbcfd25 100644
--- a/app/helpers/projects/project_members_helper.rb
+++ b/app/helpers/projects/project_members_helper.rb
@@ -40,7 +40,7 @@ module Projects::ProjectMembersHelper
members: project_members_data_json(project, members),
member_path: project_project_member_path(project, ':id'),
source_id: project.id,
- can_manage_members: can_manage_project_members?(project)
+ can_manage_members: can_manage_project_members?(project).to_s
}
end
@@ -49,7 +49,7 @@ module Projects::ProjectMembersHelper
members: project_group_links_data_json(group_links),
member_path: project_group_link_path(project, ':id'),
source_id: project.id,
- can_manage_members: can_manage_project_members?(project)
+ can_manage_members: can_manage_project_members?(project).to_s
}
end
end
diff --git a/app/helpers/projects/security/configuration_helper.rb b/app/helpers/projects/security/configuration_helper.rb
new file mode 100644
index 00000000000..265d46cbc41
--- /dev/null
+++ b/app/helpers/projects/security/configuration_helper.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+module Projects
+ module Security
+ module ConfigurationHelper
+ def security_upgrade_path
+ 'https://about.gitlab.com/pricing/'
+ end
+ end
+ end
+end
+
+::Projects::Security::ConfigurationHelper.prepend_if_ee('::EE::Projects::Security::ConfigurationHelper')
diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb
index f5cd89d96b4..b5c4e0b5550 100644
--- a/app/helpers/projects_helper.rb
+++ b/app/helpers/projects_helper.rb
@@ -379,10 +379,15 @@ module ProjectsHelper
private
def can_read_security_configuration?(project, current_user)
- ::Feature.enabled?(:secure_security_and_compliance_configuration_page_on_ce, @subject, default_enabled: :yaml) &&
+ show_security_and_compliance_config? &&
+ can?(current_user, :access_security_and_compliance, project) &&
can?(current_user, :read_security_configuration, project)
end
+ def show_security_and_compliance_config?
+ ::Feature.enabled?(:secure_security_and_compliance_configuration_page_on_ce, @subject, default_enabled: :yaml)
+ end
+
def get_project_security_nav_tabs(project, current_user)
if can_read_security_configuration?(project, current_user)
[:security_and_compliance, :security_configuration]
@@ -646,7 +651,8 @@ module ProjectsHelper
metricsDashboardAccessLevel: feature.metrics_dashboard_access_level,
operationsAccessLevel: feature.operations_access_level,
showDefaultAwardEmojis: project.show_default_award_emojis?,
- allowEditingCommitMessages: project.allow_editing_commit_messages?
+ allowEditingCommitMessages: project.allow_editing_commit_messages?,
+ securityAndComplianceAccessLevel: project.security_and_compliance_access_level
}
end
@@ -668,10 +674,13 @@ module ProjectsHelper
pagesAvailable: Gitlab.config.pages.enabled,
pagesAccessControlEnabled: Gitlab.config.pages.access_control,
pagesAccessControlForced: ::Gitlab::Pages.access_control_is_forced?,
- pagesHelpPath: help_page_path('user/project/pages/introduction', anchor: 'gitlab-pages-access-control')
+ pagesHelpPath: help_page_path('user/project/pages/introduction', anchor: 'gitlab-pages-access-control'),
+ securityAndComplianceAvailable: show_security_and_compliance_toggle?
}
end
+ alias_method :show_security_and_compliance_toggle?, :show_security_and_compliance_config?
+
def project_permissions_panel_data_json(project)
project_permissions_panel_data(project).to_json.html_safe
end
diff --git a/app/helpers/search_helper.rb b/app/helpers/search_helper.rb
index a7acc0cd7db..4ad4fcf0f6e 100644
--- a/app/helpers/search_helper.rb
+++ b/app/helpers/search_helper.rb
@@ -406,7 +406,7 @@ module SearchHelper
# Closed is considered "danger" for MR so we need to handle separately
if issuable.is_a?(::MergeRequest)
if issuable.merged?
- :primary
+ :info
elsif issuable.closed?
:danger
else
diff --git a/app/helpers/stat_anchors_helper.rb b/app/helpers/stat_anchors_helper.rb
index 1e8e6371284..d9429f28be7 100644
--- a/app/helpers/stat_anchors_helper.rb
+++ b/app/helpers/stat_anchors_helper.rb
@@ -5,13 +5,14 @@ module StatAnchorsHelper
{}.tap do |attrs|
attrs[:class] = %w(nav-link gl-display-flex gl-align-items-center) << extra_classes(anchor)
attrs[:itemprop] = anchor.itemprop if anchor.itemprop
+ attrs[:data] = anchor.data if anchor.data
end
end
private
def button_attribute(anchor)
- "btn-#{anchor.class_modifier || 'dashed'}"
+ anchor.class_modifier || 'btn-dashed'
end
def extra_classes(anchor)
diff --git a/app/helpers/user_callouts_helper.rb b/app/helpers/user_callouts_helper.rb
index f55a6c3c9e5..6a242d000ae 100644
--- a/app/helpers/user_callouts_helper.rb
+++ b/app/helpers/user_callouts_helper.rb
@@ -31,7 +31,7 @@ module UserCalloutsHelper
render 'shared/flash_user_callout', flash_type: flash_type, message: message, feature_name: feature_name
end
- def render_dashboard_gold_trial(user)
+ def render_dashboard_ultimate_trial(user)
end
def render_account_recovery_regular_check
diff --git a/app/helpers/visibility_level_helper.rb b/app/helpers/visibility_level_helper.rb
index 696f29164fd..b49bd33a30b 100644
--- a/app/helpers/visibility_level_helper.rb
+++ b/app/helpers/visibility_level_helper.rb
@@ -35,9 +35,7 @@ module VisibilityLevelHelper
end
def visibility_level_label(level)
- # The visibility level can be:
- # 'VisibilityLevel|Private', 'VisibilityLevel|Internal', 'VisibilityLevel|Public'
- s_(Project.visibility_levels.key(level))
+ Project.visibility_levels.key(level)
end
def restricted_visibility_levels(show_all = false)
diff --git a/app/helpers/wiki_helper.rb b/app/helpers/wiki_helper.rb
index 786081ca815..3f82cf893a0 100644
--- a/app/helpers/wiki_helper.rb
+++ b/app/helpers/wiki_helper.rb
@@ -50,24 +50,6 @@ module WikiHelper
end
end
- def wiki_page_errors(error)
- return unless error
-
- content_tag(:div, class: 'alert alert-danger') do
- case error
- when WikiPage::PageChangedError
- page_link = link_to s_("WikiPageConflictMessage|the page"), wiki_page_path(@wiki, @page), target: "_blank"
- concat(
- (s_("WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs.") % { page_link: page_link }).html_safe
- )
- when WikiPage::PageRenameError
- s_("WikiEdit|There is already a page with the same title in that path.")
- else
- error.message
- end
- end
- end
-
def wiki_attachment_upload_url
case @wiki.container
when Project
diff --git a/app/helpers/workhorse_helper.rb b/app/helpers/workhorse_helper.rb
index f74b53d68a1..28dd1b00292 100644
--- a/app/helpers/workhorse_helper.rb
+++ b/app/helpers/workhorse_helper.rb
@@ -7,7 +7,7 @@ module WorkhorseHelper
def send_git_blob(repository, blob, inline: true)
headers.store(*Gitlab::Workhorse.send_git_blob(repository, blob))
- headers['Content-Disposition'] = inline ? 'inline' : 'attachment'
+ headers['Content-Disposition'] = inline ? 'inline' : content_disposition_attachment(repository.project, blob.name)
# If enabled, this will override the values set above
workhorse_set_content_type!
@@ -48,4 +48,12 @@ module WorkhorseHelper
def workhorse_set_content_type!
headers[Gitlab::Workhorse::DETECT_HEADER] = "true"
end
+
+ def content_disposition_attachment(project, filename)
+ if Feature.enabled?(:attachment_with_filename, project, default_enabled: :yaml)
+ ActionDispatch::Http::ContentDisposition.format(disposition: 'attachment', filename: filename)
+ else
+ 'attachment'
+ end
+ end
end
diff --git a/app/mailers/emails/merge_requests.rb b/app/mailers/emails/merge_requests.rb
index 494d9875ce4..e538b5e4718 100644
--- a/app/mailers/emails/merge_requests.rb
+++ b/app/mailers/emails/merge_requests.rb
@@ -23,6 +23,14 @@ module Emails
mail_answer_thread(@merge_request, merge_request_thread_options(updated_by_user_id, recipient_id, reason))
end
+ def change_in_merge_request_draft_status_email(recipient_id, merge_request_id, updated_by_user_id, reason = nil)
+ setup_merge_request_mail(merge_request_id, recipient_id)
+
+ @updated_by_user = User.find(updated_by_user_id)
+
+ mail_answer_thread(@merge_request, merge_request_thread_options(updated_by_user_id, recipient_id, reason))
+ end
+
# rubocop: disable CodeReuse/ActiveRecord
def reassigned_merge_request_email(recipient_id, merge_request_id, previous_assignee_ids, updated_by_user_id, reason = nil)
setup_merge_request_mail(merge_request_id, recipient_id)
diff --git a/app/mailers/emails/pipelines.rb b/app/mailers/emails/pipelines.rb
index 0b830f4ee5e..fb1f70723fd 100644
--- a/app/mailers/emails/pipelines.rb
+++ b/app/mailers/emails/pipelines.rb
@@ -3,7 +3,7 @@
module Emails
module Pipelines
def pipeline_success_email(pipeline, recipients)
- pipeline_mail(pipeline, recipients, 'Succesful')
+ pipeline_mail(pipeline, recipients, 'Successful')
end
def pipeline_failed_email(pipeline, recipients)
diff --git a/app/mailers/emails/profile.rb b/app/mailers/emails/profile.rb
index e3c72a343e7..f13ba9caee0 100644
--- a/app/mailers/emails/profile.rb
+++ b/app/mailers/emails/profile.rb
@@ -50,15 +50,16 @@ module Emails
end
# rubocop: enable CodeReuse/ActiveRecord
- def access_token_about_to_expire_email(user)
+ def access_token_about_to_expire_email(user, token_names)
return unless user
@user = user
+ @token_names = token_names
@target_url = profile_personal_access_tokens_url
@days_to_expire = PersonalAccessToken::DAYS_TO_EXPIRE
Gitlab::I18n.with_locale(@user.preferred_language) do
- mail(to: @user.notification_email, subject: subject(_("Your Personal Access Tokens will expire in %{days_to_expire} days or less") % { days_to_expire: @days_to_expire }))
+ mail(to: @user.notification_email, subject: subject(_("Your personal access tokens will expire in %{days_to_expire} days or less") % { days_to_expire: @days_to_expire }))
end
end
diff --git a/app/mailers/previews/notify_preview.rb b/app/mailers/previews/notify_preview.rb
index c70ac1428cd..36c6f2f6c79 100644
--- a/app/mailers/previews/notify_preview.rb
+++ b/app/mailers/previews/notify_preview.rb
@@ -60,6 +60,10 @@ class NotifyPreview < ActionMailer::Preview
end
end
+ def new_mention_in_merge_request_email
+ Notify.new_mention_in_merge_request_email(user.id, issue.id, user.id).message
+ end
+
def closed_issue_email
Notify.closed_issue_email(user.id, issue.id, user.id).message
end
@@ -84,12 +88,20 @@ class NotifyPreview < ActionMailer::Preview
Notify.issues_csv_email(user, project, '1997,Ford,E350', { truncated: false, rows_expected: 3, rows_written: 3 }).message
end
+ def new_merge_request_email
+ Notify.new_merge_request_email(user.id, merge_request.id).message
+ end
+
def closed_merge_request_email
Notify.closed_merge_request_email(user.id, issue.id, user.id).message
end
def merge_request_status_email
- Notify.merge_request_status_email(user.id, merge_request.id, 'closed', user.id).message
+ Notify.merge_request_status_email(user.id, merge_request.id, 'reopened', user.id).message
+ end
+
+ def merge_request_unmergeable_email
+ Notify.merge_request_unmergeable_email(user.id, merge_request.id, 'conflict').message
end
def merged_merge_request_email
diff --git a/app/models/analytics/instance_statistics.rb b/app/models/analytics/instance_statistics.rb
deleted file mode 100644
index df7b26e4fa6..00000000000
--- a/app/models/analytics/instance_statistics.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-module Analytics
- module InstanceStatistics
- def self.table_name_prefix
- 'analytics_instance_statistics_'
- end
- end
-end
diff --git a/app/models/analytics/instance_statistics/measurement.rb b/app/models/analytics/instance_statistics/measurement.rb
deleted file mode 100644
index c8b76e005ef..00000000000
--- a/app/models/analytics/instance_statistics/measurement.rb
+++ /dev/null
@@ -1,61 +0,0 @@
-# frozen_string_literal: true
-
-module Analytics
- module InstanceStatistics
- class Measurement < ApplicationRecord
- EXPERIMENTAL_IDENTIFIERS = %i[pipelines_succeeded pipelines_failed pipelines_canceled pipelines_skipped].freeze
-
- enum identifier: {
- projects: 1,
- users: 2,
- issues: 3,
- merge_requests: 4,
- groups: 5,
- pipelines: 6,
- pipelines_succeeded: 7,
- pipelines_failed: 8,
- pipelines_canceled: 9,
- pipelines_skipped: 10,
- billable_users: 11
- }
-
- validates :recorded_at, :identifier, :count, presence: true
- validates :recorded_at, uniqueness: { scope: :identifier }
-
- scope :order_by_latest, -> { order(recorded_at: :desc) }
- scope :with_identifier, -> (identifier) { where(identifier: identifier) }
- scope :recorded_after, -> (date) { where(self.model.arel_table[:recorded_at].gteq(date)) if date.present? }
- scope :recorded_before, -> (date) { where(self.model.arel_table[:recorded_at].lteq(date)) if date.present? }
-
- def self.identifier_query_mapping
- {
- identifiers[:projects] => -> { Project },
- identifiers[:users] => -> { User },
- identifiers[:issues] => -> { Issue },
- identifiers[:merge_requests] => -> { MergeRequest },
- identifiers[:groups] => -> { Group },
- identifiers[:pipelines] => -> { Ci::Pipeline },
- identifiers[:pipelines_succeeded] => -> { Ci::Pipeline.success },
- identifiers[:pipelines_failed] => -> { Ci::Pipeline.failed },
- identifiers[:pipelines_canceled] => -> { Ci::Pipeline.canceled },
- identifiers[:pipelines_skipped] => -> { Ci::Pipeline.skipped }
- }
- end
-
- # Customized min and max calculation, in some cases using the original scope is too slow.
- def self.identifier_min_max_queries
- {}
- end
-
- def self.measurement_identifier_values
- identifiers.values
- end
-
- def self.find_latest_or_fallback(identifier)
- with_identifier(identifier).order_by_latest.first || identifier_query_mapping[identifiers[identifier]].call
- end
- end
- end
-end
-
-Analytics::InstanceStatistics::Measurement.prepend_if_ee('EE::Analytics::InstanceStatistics::Measurement')
diff --git a/app/models/analytics/usage_trends/measurement.rb b/app/models/analytics/usage_trends/measurement.rb
new file mode 100644
index 00000000000..ad0272699c2
--- /dev/null
+++ b/app/models/analytics/usage_trends/measurement.rb
@@ -0,0 +1,61 @@
+# frozen_string_literal: true
+
+module Analytics
+ module UsageTrends
+ class Measurement < ApplicationRecord
+ self.table_name = 'analytics_instance_statistics_measurements'
+
+ enum identifier: {
+ projects: 1,
+ users: 2,
+ issues: 3,
+ merge_requests: 4,
+ groups: 5,
+ pipelines: 6,
+ pipelines_succeeded: 7,
+ pipelines_failed: 8,
+ pipelines_canceled: 9,
+ pipelines_skipped: 10,
+ billable_users: 11
+ }
+
+ validates :recorded_at, :identifier, :count, presence: true
+ validates :recorded_at, uniqueness: { scope: :identifier }
+
+ scope :order_by_latest, -> { order(recorded_at: :desc) }
+ scope :with_identifier, -> (identifier) { where(identifier: identifier) }
+ scope :recorded_after, -> (date) { where(self.model.arel_table[:recorded_at].gteq(date)) if date.present? }
+ scope :recorded_before, -> (date) { where(self.model.arel_table[:recorded_at].lteq(date)) if date.present? }
+
+ def self.identifier_query_mapping
+ {
+ identifiers[:projects] => -> { Project },
+ identifiers[:users] => -> { User },
+ identifiers[:issues] => -> { Issue },
+ identifiers[:merge_requests] => -> { MergeRequest },
+ identifiers[:groups] => -> { Group },
+ identifiers[:pipelines] => -> { Ci::Pipeline },
+ identifiers[:pipelines_succeeded] => -> { Ci::Pipeline.success },
+ identifiers[:pipelines_failed] => -> { Ci::Pipeline.failed },
+ identifiers[:pipelines_canceled] => -> { Ci::Pipeline.canceled },
+ identifiers[:pipelines_skipped] => -> { Ci::Pipeline.skipped }
+ }
+ end
+
+ # Customized min and max calculation, in some cases using the original scope is too slow.
+ def self.identifier_min_max_queries
+ {}
+ end
+
+ def self.measurement_identifier_values
+ identifiers.values
+ end
+
+ def self.find_latest_or_fallback(identifier)
+ with_identifier(identifier).order_by_latest.first || identifier_query_mapping[identifiers[identifier]].call
+ end
+ end
+ end
+end
+
+Analytics::UsageTrends::Measurement.prepend_if_ee('EE::Analytics::UsageTrends::Measurement')
diff --git a/app/models/application_setting.rb b/app/models/application_setting.rb
index 4959401eb27..44eb2fefb3f 100644
--- a/app/models/application_setting.rb
+++ b/app/models/application_setting.rb
@@ -25,10 +25,6 @@ class ApplicationSetting < ApplicationRecord
alias_attribute :instance_group_id, :instance_administrators_group_id
alias_attribute :instance_administrators_group, :instance_group
- def self.repository_storages_weighted_attributes
- @repository_storages_weighted_atributes ||= Gitlab.config.repositories.storages.keys.map { |k| "repository_storages_weighted_#{k}".to_sym }.freeze
- end
-
def self.kroki_formats_attributes
{
blockdiag: {
@@ -44,7 +40,6 @@ class ApplicationSetting < ApplicationRecord
end
store_accessor :kroki_formats, *ApplicationSetting.kroki_formats_attributes.keys, prefix: true
- store_accessor :repository_storages_weighted, *Gitlab.config.repositories.storages.keys, prefix: true
# Include here so it can override methods from
# `add_authentication_token_field`
@@ -503,6 +498,7 @@ class ApplicationSetting < ApplicationRecord
inclusion: { in: [true, false], message: _('must be a boolean value') }
before_validation :ensure_uuid!
+ before_validation :coerce_repository_storages_weighted, if: :repository_storages_weighted_changed?
before_save :ensure_runners_registration_token
before_save :ensure_health_check_access_token
@@ -583,12 +579,6 @@ class ApplicationSetting < ApplicationRecord
recaptcha_enabled || login_recaptcha_protection_enabled
end
- repository_storages_weighted_attributes.each do |attribute|
- define_method :"#{attribute}=" do |value|
- super(value.to_i)
- end
- end
-
kroki_formats_attributes.keys.each do |key|
define_method :"kroki_formats_#{key}=" do |value|
super(::Gitlab::Utils.to_boolean(value))
diff --git a/app/models/application_setting_implementation.rb b/app/models/application_setting_implementation.rb
index 08c16930b13..c067199b52c 100644
--- a/app/models/application_setting_implementation.rb
+++ b/app/models/application_setting_implementation.rb
@@ -123,7 +123,7 @@ module ApplicationSettingImplementation
raw_blob_request_limit: 300,
recaptcha_enabled: false,
repository_checks_enabled: true,
- repository_storages_weighted: { default: 100 },
+ repository_storages_weighted: { 'default' => 100 },
repository_storages: ['default'],
require_admin_approval_after_user_signup: true,
require_two_factor_authentication: false,
@@ -298,10 +298,6 @@ module ApplicationSettingImplementation
Array(read_attribute(:repository_storages))
end
- def repository_storages_weighted
- read_attribute(:repository_storages_weighted)
- end
-
def commit_email_hostname
super.presence || self.class.default_commit_email_hostname
end
@@ -333,9 +329,10 @@ module ApplicationSettingImplementation
def normalized_repository_storage_weights
strong_memoize(:normalized_repository_storage_weights) do
- weights_total = repository_storages_weighted.values.reduce(:+)
+ repository_storages_weights = repository_storages_weighted.slice(*Gitlab.config.repositories.storages.keys)
+ weights_total = repository_storages_weights.values.reduce(:+)
- repository_storages_weighted.transform_values do |w|
+ repository_storages_weights.transform_values do |w|
next w if weights_total == 0
w.to_f / weights_total
@@ -473,16 +470,20 @@ module ApplicationSettingImplementation
invalid.empty?
end
+ def coerce_repository_storages_weighted
+ repository_storages_weighted.transform_values!(&:to_i)
+ end
+
def check_repository_storages_weighted
invalid = repository_storages_weighted.keys - Gitlab.config.repositories.storages.keys
- errors.add(:repository_storages_weighted, "can't include: %{invalid_storages}" % { invalid_storages: invalid.join(", ") }) unless
+ errors.add(:repository_storages_weighted, _("can't include: %{invalid_storages}") % { invalid_storages: invalid.join(", ") }) unless
invalid.empty?
repository_storages_weighted.each do |key, val|
next unless val.present?
- errors.add(:"repository_storages_weighted_#{key}", "value must be an integer") unless val.is_a?(Integer)
- errors.add(:"repository_storages_weighted_#{key}", "value must be between 0 and 100") unless val.between?(0, 100)
+ errors.add(:repository_storages_weighted, _("value for '%{storage}' must be an integer") % { storage: key }) unless val.is_a?(Integer)
+ errors.add(:repository_storages_weighted, _("value for '%{storage}' must be between 0 and 100") % { storage: key }) unless val.between?(0, 100)
end
end
diff --git a/app/models/bulk_imports/entity.rb b/app/models/bulk_imports/entity.rb
index 16224fde502..9127dab56a6 100644
--- a/app/models/bulk_imports/entity.rb
+++ b/app/models/bulk_imports/entity.rb
@@ -37,8 +37,9 @@ class BulkImports::Entity < ApplicationRecord
validates :project, absence: true, if: :group
validates :group, absence: true, if: :project
- validates :source_type, :source_full_path, :destination_name,
- :destination_namespace, presence: true
+ validates :source_type, :source_full_path, :destination_name, presence: true
+ validates :destination_namespace, exclusion: [nil], if: :group
+ validates :destination_namespace, presence: true, if: :project
validate :validate_parent_is_a_group, if: :parent
validate :validate_imported_entity_type
@@ -117,8 +118,8 @@ class BulkImports::Entity < ApplicationRecord
if source.self_and_descendants.any? { |namespace| namespace.full_path == destination_namespace }
errors.add(
- :destination_namespace,
- s_('BulkImport|destination group cannot be part of the source group tree')
+ :base,
+ s_('BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again.')
)
end
end
diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb
index db151126caf..824e35a6480 100644
--- a/app/models/ci/build.rb
+++ b/app/models/ci/build.rb
@@ -486,6 +486,10 @@ module Ci
self.options.fetch(:environment, {}).fetch(:action, 'start') if self.options
end
+ def environment_deployment_tier
+ self.options.dig(:environment, :deployment_tier) if self.options
+ end
+
def outdated_deployment?
success? && !deployment.try(:last?)
end
@@ -510,7 +514,6 @@ module Ci
.concat(scoped_variables)
.concat(job_variables)
.concat(persisted_environment_variables)
- .to_runner_variables
end
end
@@ -523,6 +526,7 @@ module Ci
.append(key: 'CI_JOB_ID', value: id.to_s)
.append(key: 'CI_JOB_URL', value: Gitlab::Routing.url_helpers.project_job_url(project, self))
.append(key: 'CI_JOB_TOKEN', value: token.to_s, public: false, masked: true)
+ .append(key: 'CI_JOB_STARTED_AT', value: started_at&.iso8601)
.append(key: 'CI_BUILD_ID', value: id.to_s)
.append(key: 'CI_BUILD_TOKEN', value: token.to_s, public: false, masked: true)
.append(key: 'CI_REGISTRY_USER', value: ::Gitlab::Auth::CI_JOB_USER)
@@ -564,7 +568,10 @@ module Ci
end
def features
- { trace_sections: true }
+ {
+ trace_sections: true,
+ failure_reasons: self.class.failure_reasons.keys
+ }
end
def merge_request
@@ -691,7 +698,7 @@ module Ci
end
def any_runners_online?
- project.any_runners? { |runner| runner.active? && runner.online? && runner.can_pick?(self) }
+ project.any_active_runners? { |runner| runner.match_build_if_online?(self) }
end
def stuck?
@@ -810,14 +817,15 @@ module Ci
end
def cache
- cache = options[:cache]
+ cache = Array.wrap(options[:cache])
- if cache && project.jobs_cache_index
- cache = cache.merge(
- key: "#{cache[:key]}-#{project.jobs_cache_index}")
+ if project.jobs_cache_index
+ cache = cache.map do |single_cache|
+ single_cache.merge(key: "#{single_cache[:key]}-#{project.jobs_cache_index}")
+ end
end
- [cache]
+ cache
end
def credentials
@@ -983,7 +991,7 @@ module Ci
# TODO: Have `debug_mode?` check against data on sent back from runner
# to capture all the ways that variables can be set.
# See (https://gitlab.com/gitlab-org/gitlab/-/issues/290955)
- variables.any? { |variable| variable[:key] == 'CI_DEBUG_TRACE' && variable[:value].casecmp('true') == 0 }
+ variables['CI_DEBUG_TRACE']&.value&.casecmp('true') == 0
end
def drop_with_exit_code!(failure_reason, exit_code)
diff --git a/app/models/ci/daily_build_group_report_result.rb b/app/models/ci/daily_build_group_report_result.rb
index 23c96e63724..5dcf575abd7 100644
--- a/app/models/ci/daily_build_group_report_result.rb
+++ b/app/models/ci/daily_build_group_report_result.rb
@@ -4,7 +4,6 @@ module Ci
class DailyBuildGroupReportResult < ApplicationRecord
extend Gitlab::Ci::Model
- REPORT_WINDOW = 90.days
PARAM_TYPES = %w[coverage].freeze
belongs_to :last_pipeline, class_name: 'Ci::Pipeline', foreign_key: :last_pipeline_id
@@ -13,13 +12,11 @@ module Ci
validates :data, json_schema: { filename: "daily_build_group_report_result_data" }
- scope :with_included_projects, -> { includes(:project) }
scope :by_ref_path, -> (ref_path) { where(ref_path: ref_path) }
scope :by_projects, -> (ids) { where(project_id: ids) }
scope :by_group, -> (group_id) { where(group_id: group_id) }
scope :with_coverage, -> { where("(data->'coverage') IS NOT NULL") }
scope :with_default_branch, -> { where(default_branch: true) }
- scope :by_date, -> (start_date) { where(date: report_window(start_date)..Date.current) }
scope :by_dates, -> (start_date, end_date) { where(date: start_date..end_date) }
scope :ordered_by_date_and_group_name, -> { order(date: :desc, group_name: :asc) }
@@ -29,17 +26,6 @@ module Ci
def upsert_reports(data)
upsert_all(data, unique_by: :index_daily_build_group_report_results_unique_columns) if data.any?
end
-
- def recent_results(attrs, limit: nil)
- where(attrs).order(date: :desc, group_name: :asc).limit(limit)
- end
-
- def report_window(start_date)
- default_date = REPORT_WINDOW.ago.to_date
- date = Date.parse(start_date) rescue default_date
-
- [date, default_date].max
- end
end
end
end
diff --git a/app/models/ci/group.rb b/app/models/ci/group.rb
index c7c0ec61e62..4ba09fd8152 100644
--- a/app/models/ci/group.rb
+++ b/app/models/ci/group.rb
@@ -39,7 +39,7 @@ module Ci
def status_struct
strong_memoize(:status_struct) do
Gitlab::Ci::Status::Composite
- .new(@jobs)
+ .new(@jobs, project: project)
end
end
diff --git a/app/models/ci/group_variable.rb b/app/models/ci/group_variable.rb
index 1e1dd68ee6c..2928ce801ad 100644
--- a/app/models/ci/group_variable.rb
+++ b/app/models/ci/group_variable.rb
@@ -6,16 +6,18 @@ module Ci
include Ci::HasVariable
include Presentable
include Ci::Maskable
+ prepend HasEnvironmentScope
belongs_to :group, class_name: "::Group"
alias_attribute :secret_value, :value
validates :key, uniqueness: {
- scope: :group_id,
+ scope: [:group_id, :environment_scope],
message: "(%{value}) has already been taken"
}
scope :unprotected, -> { where(protected: false) }
+ scope :by_environment_scope, -> (environment_scope) { where(environment_scope: environment_scope) }
end
end
diff --git a/app/models/ci/job_artifact.rb b/app/models/ci/job_artifact.rb
index f927111758a..06ea2a7f951 100644
--- a/app/models/ci/job_artifact.rb
+++ b/app/models/ci/job_artifact.rb
@@ -136,11 +136,7 @@ module Ci
scope :for_sha, ->(sha, project_id) { joins(job: :pipeline).where(ci_pipelines: { sha: sha, project_id: project_id }) }
scope :for_job_name, ->(name) { joins(:job).where(ci_builds: { name: name }) }
- scope :with_job, -> do
- if Feature.enabled?(:non_public_artifacts, type: :development)
- joins(:job).includes(:job)
- end
- end
+ scope :with_job, -> { joins(:job).includes(:job) }
scope :with_file_types, -> (file_types) do
types = self.file_types.select { |file_type| file_types.include?(file_type) }.values
diff --git a/app/models/ci/legacy_stage.rb b/app/models/ci/legacy_stage.rb
index df4368eccd5..ffd3d3fcd88 100644
--- a/app/models/ci/legacy_stage.rb
+++ b/app/models/ci/legacy_stage.rb
@@ -32,7 +32,7 @@ module Ci
end
def status
- @status ||= statuses.latest.composite_status
+ @status ||= statuses.latest.composite_status(project: project)
end
def detailed_status(current_user)
diff --git a/app/models/ci/pipeline.rb b/app/models/ci/pipeline.rb
index 3be107ea2e1..b63ec0c8a97 100644
--- a/app/models/ci/pipeline.rb
+++ b/app/models/ci/pipeline.rb
@@ -228,7 +228,7 @@ module Ci
pipeline.run_after_commit do
PipelineHooksWorker.perform_async(pipeline.id)
- ExpirePipelineCacheWorker.perform_async(pipeline.id) if pipeline.cacheable?
+ ExpirePipelineCacheWorker.perform_async(pipeline.id)
end
end
@@ -573,7 +573,7 @@ module Ci
end
def cancel_running(retries: nil)
- retry_optimistic_lock(cancelable_statuses, retries) do |cancelable|
+ retry_optimistic_lock(cancelable_statuses, retries, name: 'ci_pipeline_cancel_running') do |cancelable|
cancelable.find_each do |job|
yield(job) if block_given?
job.cancel
@@ -693,14 +693,6 @@ module Ci
.exists?
end
- # TODO: this logic is duplicate with Pipeline::Chain::Config::Content
- # we should persist this is `ci_pipelines.config_path`
- def config_path
- return unless repository_source? || unknown_source?
-
- project.ci_config_path_or_default
- end
-
def has_yaml_errors?
yaml_errors.present?
end
@@ -744,7 +736,7 @@ module Ci
end
def set_status(new_status)
- retry_optimistic_lock(self) do
+ retry_optimistic_lock(self, name: 'ci_pipeline_set_status') do
case new_status
when 'created' then nil
when 'waiting_for_resource' then request_resource
@@ -785,8 +777,7 @@ module Ci
Gitlab::Ci::Variables::Collection.new.tap do |variables|
variables.append(key: 'CI_PIPELINE_IID', value: iid.to_s)
variables.append(key: 'CI_PIPELINE_SOURCE', value: source.to_s)
-
- variables.append(key: 'CI_CONFIG_PATH', value: config_path)
+ variables.append(key: 'CI_PIPELINE_CREATED_AT', value: created_at&.iso8601)
variables.concat(predefined_commit_variables)
@@ -938,6 +929,12 @@ module Ci
.first
end
+ def self_with_ancestors_and_descendants(same_project: false)
+ ::Gitlab::Ci::PipelineObjectHierarchy
+ .new(self.class.unscoped.where(id: id), options: { same_project: same_project })
+ .all_objects
+ end
+
def bridge_triggered?
source_bridge.present?
end
@@ -1117,7 +1114,7 @@ module Ci
detached_merge_request_pipeline? && !merge_request_ref?
end
- def merge_request_pipeline?
+ def merged_result_pipeline?
merge_request? && target_sha.present?
end
@@ -1157,7 +1154,7 @@ module Ci
return unless merge_request?
strong_memoize(:merge_request_event_type) do
- if merge_request_pipeline?
+ if merged_result_pipeline?
:merged_result
elsif detached_merge_request_pipeline?
:detached
@@ -1169,10 +1166,6 @@ module Ci
@persistent_ref ||= PersistentRef.new(pipeline: self)
end
- def cacheable?
- !dangling?
- end
-
def dangling?
Enums::Ci::Pipeline.dangling_sources.key?(source.to_sym)
end
@@ -1247,7 +1240,7 @@ module Ci
def merge_request_diff_sha
return unless merge_request?
- if merge_request_pipeline?
+ if merged_result_pipeline?
source_sha
else
sha
diff --git a/app/models/ci/processable.rb b/app/models/ci/processable.rb
index fae65ed0632..0ad1ed2fce8 100644
--- a/app/models/ci/processable.rb
+++ b/app/models/ci/processable.rb
@@ -120,10 +120,6 @@ module Ci
raise NotImplementedError
end
- def scoped_variables_hash
- raise NotImplementedError
- end
-
override :all_met_to_become_pending?
def all_met_to_become_pending?
super && !with_resource_group?
diff --git a/app/models/ci/ref.rb b/app/models/ci/ref.rb
index 713a0bf9c45..3d71a5f2c96 100644
--- a/app/models/ci/ref.rb
+++ b/app/models/ci/ref.rb
@@ -62,7 +62,7 @@ module Ci
end
def update_status_by!(pipeline)
- retry_lock(self) do
+ retry_lock(self, name: 'ci_ref_update_status_by') do
next unless last_finished_pipeline_id == pipeline.id
case pipeline.status
diff --git a/app/models/ci/runner.rb b/app/models/ci/runner.rb
index 44a00e36bcc..d1a20bc93c3 100644
--- a/app/models/ci/runner.rb
+++ b/app/models/ci/runner.rb
@@ -9,6 +9,7 @@ module Ci
include FromUnion
include TokenAuthenticatable
include IgnorableColumns
+ include FeatureGate
add_authentication_token_field :token, encrypted: -> { Feature.enabled?(:ci_runners_tokens_optional_encryption, default_enabled: true) ? :optional : :required }
@@ -251,10 +252,21 @@ module Ci
runner_projects.any?
end
+ # TODO: remove this method in favor of `matches_build?` once feature flag is removed
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/323317
def can_pick?(build)
- return false if self.ref_protected? && !build.protected?
+ if Feature.enabled?(:ci_runners_short_circuit_assignable_for, self, default_enabled: :yaml)
+ matches_build?(build)
+ else
+ # Run `matches_build?` checks before, since they are cheaper than
+ # `assignable_for?`.
+ #
+ matches_build?(build) && assignable_for?(build.project_id)
+ end
+ end
- assignable_for?(build.project_id) && accepting_tags?(build)
+ def match_build_if_online?(build)
+ active? && online? && can_pick?(build)
end
def only_for?(project)
@@ -265,6 +277,16 @@ module Ci
token[0...8] if token
end
+ def tag_list
+ return super unless Feature.enabled?(:ci_preload_runner_tags, default_enabled: :yaml)
+
+ if tags.loaded?
+ tags.map(&:name)
+ else
+ super
+ end
+ end
+
def has_tags?
tag_list.any?
end
@@ -304,8 +326,10 @@ module Ci
end
def pick_build!(build)
- if can_pick?(build)
- tick_runner_queue
+ if Feature.enabled?(:ci_reduce_queries_when_ticking_runner_queue, self, default_enabled: :yaml)
+ tick_runner_queue if matches_build?(build)
+ else
+ tick_runner_queue if can_pick?(build)
end
end
@@ -341,6 +365,8 @@ module Ci
end
end
+ # TODO: remove this method once feature flag ci_runners_short_circuit_assignable_for
+ # is removed. https://gitlab.com/gitlab-org/gitlab/-/issues/323317
def assignable_for?(project_id)
self.class.owned_or_instance_wide(project_id).where(id: self.id).any?
end
@@ -369,6 +395,12 @@ module Ci
end
end
+ def matches_build?(build)
+ return false if self.ref_protected? && !build.protected?
+
+ accepting_tags?(build)
+ end
+
def accepting_tags?(build)
(run_untagged? || build.has_tags?) && (build.tag_list - tag_list).empty?
end
diff --git a/app/models/ci/runner_namespace.rb b/app/models/ci/runner_namespace.rb
index 6903e8a21a1..e6c1899c89d 100644
--- a/app/models/ci/runner_namespace.rb
+++ b/app/models/ci/runner_namespace.rb
@@ -4,10 +4,17 @@ module Ci
class RunnerNamespace < ApplicationRecord
extend Gitlab::Ci::Model
- belongs_to :runner, inverse_of: :runner_namespaces, validate: true
+ belongs_to :runner, inverse_of: :runner_namespaces
belongs_to :namespace, inverse_of: :runner_namespaces, class_name: '::Namespace'
belongs_to :group, class_name: '::Group', foreign_key: :namespace_id
validates :runner_id, uniqueness: { scope: :namespace_id }
+ validate :group_runner_type
+
+ private
+
+ def group_runner_type
+ errors.add(:runner, 'is not a group runner') unless runner&.group_type?
+ end
end
end
diff --git a/app/models/ci/stage.rb b/app/models/ci/stage.rb
index ae80692d598..03a97355574 100644
--- a/app/models/ci/stage.rb
+++ b/app/models/ci/stage.rb
@@ -84,7 +84,7 @@ module Ci
end
def set_status(new_status)
- retry_optimistic_lock(self) do
+ retry_optimistic_lock(self, name: 'ci_stage_set_status') do
case new_status
when 'created' then nil
when 'waiting_for_resource' then request_resource
@@ -138,7 +138,7 @@ module Ci
end
def latest_stage_status
- statuses.latest.composite_status || 'skipped'
+ statuses.latest.composite_status(project: project) || 'skipped'
end
end
end
diff --git a/app/models/ci/variable.rb b/app/models/ci/variable.rb
index 13358b95a47..84505befc5c 100644
--- a/app/models/ci/variable.rb
+++ b/app/models/ci/variable.rb
@@ -18,7 +18,6 @@ module Ci
}
scope :unprotected, -> { where(protected: false) }
- scope :by_key, -> (key) { where(key: key) }
scope :by_environment_scope, -> (environment_scope) { where(environment_scope: environment_scope) }
end
end
diff --git a/app/models/clusters/agent_token.rb b/app/models/clusters/agent_token.rb
index b260822f784..9d79887b574 100644
--- a/app/models/clusters/agent_token.rb
+++ b/app/models/clusters/agent_token.rb
@@ -7,9 +7,12 @@ module Clusters
self.table_name = 'cluster_agent_tokens'
- belongs_to :agent, class_name: 'Clusters::Agent'
+ belongs_to :agent, class_name: 'Clusters::Agent', optional: false
belongs_to :created_by_user, class_name: 'User', optional: true
before_save :ensure_token
+
+ validates :description, length: { maximum: 1024 }
+ validates :name, presence: true, length: { maximum: 255 }, on: :create
end
end
diff --git a/app/models/clusters/applications/runner.rb b/app/models/clusters/applications/runner.rb
index f87eccecf9f..8a49d476ba7 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.25.0'
+ VERSION = '0.26.0'
self.table_name = 'clusters_applications_runners'
diff --git a/app/models/clusters/instance.rb b/app/models/clusters/instance.rb
index 94fadace01c..2a09ba11564 100644
--- a/app/models/clusters/instance.rb
+++ b/app/models/clusters/instance.rb
@@ -6,10 +6,6 @@ module Clusters
Clusters::Cluster.instance_type
end
- def feature_available?(feature)
- ::Feature.enabled?(feature, type: :licensed, default_enabled: true)
- end
-
def flipper_id
self.class.to_s
end
diff --git a/app/models/commit_status.rb b/app/models/commit_status.rb
index ea2f425c5f6..524429bf12a 100644
--- a/app/models/commit_status.rb
+++ b/app/models/commit_status.rb
@@ -52,7 +52,6 @@ class CommitStatus < ApplicationRecord
scope :before_stage, -> (index) { where('stage_idx < ?', index) }
scope :for_stage, -> (index) { where(stage_idx: index) }
scope :after_stage, -> (index) { where('stage_idx > ?', index) }
- scope :for_ids, -> (ids) { where(id: ids) }
scope :for_ref, -> (ref) { where(ref: ref) }
scope :by_name, -> (name) { where(name: name) }
scope :in_pipelines, ->(pipelines) { where(pipeline: pipelines) }
@@ -85,6 +84,8 @@ class CommitStatus < ApplicationRecord
# extend this `Hash` with new values.
enum_with_nil failure_reason: Enums::Ci::CommitStatus.failure_reasons
+ default_value_for :retried, false
+
##
# We still create some CommitStatuses outside of CreatePipelineService.
#
@@ -291,6 +292,14 @@ class CommitStatus < ApplicationRecord
failed? && !unrecoverable_failure?
end
+ def update_older_statuses_retried!
+ self.class
+ .latest
+ .where(name: name)
+ .where.not(id: id)
+ .update_all(retried: true, processed: true)
+ end
+
private
def unrecoverable_failure?
diff --git a/app/models/commit_with_pipeline.rb b/app/models/commit_with_pipeline.rb
deleted file mode 100644
index 7f952fb77a0..00000000000
--- a/app/models/commit_with_pipeline.rb
+++ /dev/null
@@ -1,38 +0,0 @@
-# frozen_string_literal: true
-
-class Ci::CommitWithPipeline < SimpleDelegator
- include Presentable
-
- def initialize(commit)
- @latest_pipelines = {}
- super(commit)
- end
-
- def pipelines
- project.ci_pipelines.where(sha: sha)
- end
-
- def last_pipeline
- strong_memoize(:last_pipeline) do
- pipelines.last
- end
- end
-
- def latest_pipeline(ref = nil)
- @latest_pipelines.fetch(ref) do |ref|
- @latest_pipelines[ref] = latest_pipeline_for_project(ref, project)
- end
- end
-
- def latest_pipeline_for_project(ref, pipeline_project)
- pipeline_project.ci_pipelines.latest_pipeline_per_commit(id, ref)[id]
- end
-
- def set_latest_pipeline_for_ref(ref, pipeline)
- @latest_pipelines[ref] = pipeline
- end
-
- def status(ref = nil)
- latest_pipeline(ref)&.status
- end
-end
diff --git a/app/models/concerns/analytics/cycle_analytics/stage.rb b/app/models/concerns/analytics/cycle_analytics/stage.rb
index 080ff07ec0c..f1c39dda49d 100644
--- a/app/models/concerns/analytics/cycle_analytics/stage.rb
+++ b/app/models/concerns/analytics/cycle_analytics/stage.rb
@@ -49,14 +49,6 @@ module Analytics
end
end
- def start_event_identifier
- backward_compatible_identifier(:start_event_identifier) || super
- end
-
- def end_event_identifier
- backward_compatible_identifier(:end_event_identifier) || super
- end
-
def start_event_label_based?
start_event_identifier && start_event.label_based?
end
@@ -136,17 +128,6 @@ module Analytics
.id_in(label_id)
.exists?
end
-
- # Temporary, will be removed in 13.10
- def backward_compatible_identifier(attribute_name)
- removed_identifier = 6 # References IssueFirstMentionedInCommit removed on https://gitlab.com/gitlab-org/gitlab/-/merge_requests/51975
- replacement_identifier = :issue_first_mentioned_in_commit
-
- # ActiveRecord returns nil if the column value is not part of the Enum definition
- if self[attribute_name].nil? && read_attribute_before_type_cast(attribute_name) == removed_identifier
- replacement_identifier
- end
- end
end
end
end
diff --git a/app/models/concerns/avatarable.rb b/app/models/concerns/avatarable.rb
index d342b526677..c106c08c04a 100644
--- a/app/models/concerns/avatarable.rb
+++ b/app/models/concerns/avatarable.rb
@@ -20,6 +20,7 @@ module Avatarable
mount_uploader :avatar, AvatarUploader
after_initialize :add_avatar_to_batch
+ after_commit :clear_avatar_caches
end
module ShadowMethods
@@ -127,4 +128,11 @@ module Avatarable
def avatar_mounter
strong_memoize(:avatar_mounter) { _mounter(:avatar) }
end
+
+ def clear_avatar_caches
+ return unless respond_to?(:verified_emails) && verified_emails.any? && avatar_changed?
+ return unless Feature.enabled?(:avatar_cache_for_email, self, type: :development)
+
+ Gitlab::AvatarCache.delete_by_email(*verified_emails)
+ end
end
diff --git a/app/models/concerns/boards/listable.rb b/app/models/concerns/boards/listable.rb
index b7c0a8b3489..d6863e87261 100644
--- a/app/models/concerns/boards/listable.rb
+++ b/app/models/concerns/boards/listable.rb
@@ -13,6 +13,14 @@ module Boards
scope :ordered, -> { order(:list_type, :position) }
scope :destroyable, -> { where(list_type: list_types.slice(*destroyable_types).values) }
scope :movable, -> { where(list_type: list_types.slice(*movable_types).values) }
+
+ class << self
+ def preload_preferences_for_user(lists, user)
+ return unless user
+
+ lists.each { |list| list.preferences_for(user) }
+ end
+ end
end
class_methods do
@@ -33,6 +41,18 @@ module Boards
self.class.movable_types.include?(list_type&.to_sym)
end
+ def collapsed?(user)
+ preferences = preferences_for(user)
+
+ preferences.collapsed?
+ end
+
+ def update_preferences_for(user, preferences = {})
+ return unless user
+
+ preferences_for(user).update(preferences)
+ end
+
def title
if label?
label.name
diff --git a/app/models/concerns/ci/contextable.rb b/app/models/concerns/ci/contextable.rb
index c8b55e7b39f..bdba2d3e251 100644
--- a/app/models/concerns/ci/contextable.rb
+++ b/app/models/concerns/ci/contextable.rb
@@ -20,7 +20,7 @@ module Ci
variables.concat(user_variables)
variables.concat(dependency_variables) if dependencies
variables.concat(secret_instance_variables)
- variables.concat(secret_group_variables)
+ variables.concat(secret_group_variables(environment: environment))
variables.concat(secret_project_variables(environment: environment))
variables.concat(trigger_request.user_variables) if trigger_request
variables.concat(pipeline.variables)
@@ -29,14 +29,6 @@ module Ci
end
##
- # Regular Ruby hash of scoped variables, without duplicates that are
- # possible to be present in an array of hashes returned from `variables`.
- #
- def scoped_variables_hash
- scoped_variables.to_hash
- end
-
- ##
# Variables that do not depend on the environment name.
#
def simple_variables
@@ -93,13 +85,13 @@ module Ci
project.ci_instance_variables_for(ref: git_ref)
end
- def secret_group_variables
+ def secret_group_variables(environment: expanded_environment_name)
return [] unless project.group
- project.group.ci_variables_for(git_ref, project)
+ project.group.ci_variables_for(git_ref, project, environment: environment)
end
- def secret_project_variables(environment: persisted_environment)
+ def secret_project_variables(environment: expanded_environment_name)
project.ci_variables_for(ref: git_ref, environment: environment)
end
diff --git a/app/models/concerns/ci/has_status.rb b/app/models/concerns/ci/has_status.rb
index 1cc2e8a51e3..0412f7a072b 100644
--- a/app/models/concerns/ci/has_status.rb
+++ b/app/models/concerns/ci/has_status.rb
@@ -20,9 +20,11 @@ module Ci
UnknownStatusError = Class.new(StandardError)
class_methods do
- def composite_status
+ # The parameter `project` is only used for the feature flag check, and will be removed with
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/321972
+ def composite_status(project: nil)
Gitlab::Ci::Status::Composite
- .new(all, with_allow_failure: columns_hash.key?('allow_failure'))
+ .new(all, with_allow_failure: columns_hash.key?('allow_failure'), project: project)
.status
end
diff --git a/app/models/concerns/ci/has_variable.rb b/app/models/concerns/ci/has_variable.rb
index 9bf2b409080..7309469c77e 100644
--- a/app/models/concerns/ci/has_variable.rb
+++ b/app/models/concerns/ci/has_variable.rb
@@ -16,6 +16,7 @@ module Ci
format: { with: /\A[a-zA-Z0-9_]+\z/,
message: "can contain only letters, digits and '_'." }
+ scope :by_key, -> (key) { where(key: key) }
scope :order_key_asc, -> { reorder(key: :asc) }
attr_encrypted :value,
diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb
index 83ff5b16efe..e1be0665452 100644
--- a/app/models/concerns/issuable.rb
+++ b/app/models/concerns/issuable.rb
@@ -86,6 +86,7 @@ module Issuable
before_validation :truncate_description_on_import!
scope :authored, ->(user) { where(author_id: user) }
+ scope :not_authored, ->(user) { where.not(author_id: user) }
scope :recent, -> { reorder(id: :desc) }
scope :of_projects, ->(ids) { where(project_id: ids) }
scope :opened, -> { with_state(:opened) }
diff --git a/app/models/concerns/project_features_compatibility.rb b/app/models/concerns/project_features_compatibility.rb
index 07bec07e556..7c774d8bad7 100644
--- a/app/models/concerns/project_features_compatibility.rb
+++ b/app/models/concerns/project_features_compatibility.rb
@@ -34,6 +34,10 @@ module ProjectFeaturesCompatibility
write_feature_attribute_boolean(:snippets_access_level, value)
end
+ def security_and_compliance_enabled=(value)
+ write_feature_attribute_boolean(:security_and_compliance_access_level, value)
+ end
+
def repository_access_level=(value)
write_feature_attribute_string(:repository_access_level, value)
end
@@ -78,6 +82,14 @@ module ProjectFeaturesCompatibility
write_feature_attribute_string(:operations_access_level, value)
end
+ def security_and_compliance_access_level=(value)
+ write_feature_attribute_string(:security_and_compliance_access_level, value)
+ end
+
+ def container_registry_access_level=(value)
+ write_feature_attribute_string(:container_registry_access_level, value)
+ end
+
private
def write_feature_attribute_boolean(field, value)
diff --git a/app/models/custom_emoji.rb b/app/models/custom_emoji.rb
index f4c914c6a3a..aea48a5ec20 100644
--- a/app/models/custom_emoji.rb
+++ b/app/models/custom_emoji.rb
@@ -6,6 +6,7 @@ class CustomEmoji < ApplicationRecord
belongs_to :namespace, inverse_of: :custom_emoji
belongs_to :group, -> { where(type: 'Group') }, foreign_key: 'namespace_id'
+ belongs_to :creator, class_name: "User", inverse_of: :created_custom_emoji
# For now only external emoji are supported. See https://gitlab.com/gitlab-org/gitlab/-/issues/230467
validates :external, inclusion: { in: [true] }
@@ -15,6 +16,7 @@ class CustomEmoji < ApplicationRecord
validate :valid_emoji_name
validates :group, presence: true
+ validates :creator, presence: true
validates :name,
uniqueness: { scope: [:namespace_id, :name] },
presence: true,
diff --git a/app/models/dependency_proxy.rb b/app/models/dependency_proxy.rb
index 9cbaf7e9884..0ed17921aaa 100644
--- a/app/models/dependency_proxy.rb
+++ b/app/models/dependency_proxy.rb
@@ -1,6 +1,7 @@
# frozen_string_literal: true
module DependencyProxy
URL_SUFFIX = '/dependency_proxy/containers'
+ DISTRIBUTION_API_VERSION = 'registry/2.0'
def self.table_name_prefix
'dependency_proxy_'
diff --git a/app/models/dependency_proxy/manifest.rb b/app/models/dependency_proxy/manifest.rb
index f3c7f34e0d7..d613d5708f0 100644
--- a/app/models/dependency_proxy/manifest.rb
+++ b/app/models/dependency_proxy/manifest.rb
@@ -12,5 +12,10 @@ class DependencyProxy::Manifest < ApplicationRecord
mount_file_store_uploader DependencyProxy::FileUploader
- scope :find_or_initialize_by_file_name, ->(file_name) { find_or_initialize_by(file_name: file_name) }
+ def self.find_or_initialize_by_file_name_or_digest(file_name:, digest:)
+ result = find_by(file_name: file_name) || find_by(digest: digest)
+ return result if result
+
+ new(file_name: file_name, digest: digest)
+ end
end
diff --git a/app/models/environment.rb b/app/models/environment.rb
index 4f7f688a040..3ac7e63bae3 100644
--- a/app/models/environment.rb
+++ b/app/models/environment.rb
@@ -39,6 +39,7 @@ class Environment < ApplicationRecord
before_validation :generate_slug, if: ->(env) { env.slug.blank? }
before_save :set_environment_type
+ before_save :ensure_environment_tier
after_save :clear_reactive_cache!
validates :name,
@@ -87,6 +88,7 @@ class Environment < ApplicationRecord
end
scope :for_project, -> (project) { where(project_id: project) }
+ scope :for_tier, -> (tier) { where(tier: tier).where('tier IS NOT NULL') }
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
@@ -94,6 +96,14 @@ class Environment < ApplicationRecord
end
scope :for_id, -> (id) { where(id: id) }
+ enum tier: {
+ production: 0,
+ staging: 1,
+ testing: 2,
+ development: 3,
+ other: 4
+ }
+
state_machine :state, initial: :available do
event :start do
transition stopped: :available
@@ -242,7 +252,7 @@ class Environment < ApplicationRecord
def cancel_deployment_jobs!
jobs = active_deployments.with_deployable
jobs.each do |deployment|
- Gitlab::OptimisticLocking.retry_lock(deployment.deployable) do |deployable|
+ Gitlab::OptimisticLocking.retry_lock(deployment.deployable, name: 'environment_cancel_deployment_jobs') do |deployable|
deployable.cancel! if deployable&.cancelable?
end
rescue => e
@@ -429,6 +439,24 @@ class Environment < ApplicationRecord
def generate_slug
self.slug = Gitlab::Slug::Environment.new(name).generate
end
+
+ def ensure_environment_tier
+ return unless ::Feature.enabled?(:environment_tier, project, default_enabled: :yaml)
+
+ self.tier ||= guess_tier
+ end
+
+ # Guessing the tier of the environment if it's not explicitly specified by users.
+ # See https://en.wikipedia.org/wiki/Deployment_environment for industry standard deployment environments
+ def guess_tier
+ case name
+ when %r{dev|review|trunk}i then self.class.tiers[:development]
+ when %r{test|qc}i then self.class.tiers[:testing]
+ when %r{st(a|)g|mod(e|)l|pre|demo}i then self.class.tiers[:staging]
+ when %r{pr(o|)d|live}i then self.class.tiers[:production]
+ else self.class.tiers[:other]
+ end
+ end
end
Environment.prepend_if_ee('EE::Environment')
diff --git a/app/models/error_tracking/project_error_tracking_setting.rb b/app/models/error_tracking/project_error_tracking_setting.rb
index fa32c8a5450..9a9fbc6a801 100644
--- a/app/models/error_tracking/project_error_tracking_setting.rb
+++ b/app/models/error_tracking/project_error_tracking_setting.rb
@@ -77,7 +77,7 @@ module ErrorTracking
def sentry_client
strong_memoize(:sentry_client) do
- Sentry::Client.new(api_url, token)
+ ErrorTracking::SentryClient.new(api_url, token)
end
end
@@ -168,13 +168,13 @@ module ErrorTracking
def handle_exceptions
yield
- rescue Sentry::Client::Error => e
+ rescue ErrorTracking::SentryClient::Error => e
{ error: e.message, error_type: SENTRY_API_ERROR_TYPE_NON_20X_RESPONSE }
- rescue Sentry::Client::MissingKeysError => e
+ rescue ErrorTracking::SentryClient::MissingKeysError => e
{ error: e.message, error_type: SENTRY_API_ERROR_TYPE_MISSING_KEYS }
- rescue Sentry::Client::ResponseInvalidSizeError => e
+ rescue ErrorTracking::SentryClient::ResponseInvalidSizeError => e
{ error: e.message, error_type: SENTRY_API_ERROR_INVALID_SIZE }
- rescue Sentry::Client::BadRequestError => e
+ rescue ErrorTracking::SentryClient::BadRequestError => e
{ error: e.message, error_type: SENTRY_API_ERROR_TYPE_BAD_REQUEST }
rescue StandardError => e
Gitlab::ErrorTracking.track_exception(e)
diff --git a/app/models/experiment.rb b/app/models/experiment.rb
index 354b1e0b6b9..ac8b6516d02 100644
--- a/app/models/experiment.rb
+++ b/app/models/experiment.rb
@@ -14,22 +14,30 @@ class Experiment < ApplicationRecord
find_or_create_by!(name: name).record_group_and_variant!(group, variant)
end
- def self.record_conversion_event(name, user)
- find_or_create_by!(name: name).record_conversion_event_for_user(user)
+ def self.record_conversion_event(name, user, context = {})
+ find_or_create_by!(name: name).record_conversion_event_for_user(user, context)
end
# Create or update the recorded experiment_user row for the user in this experiment.
def record_user_and_group(user, group_type, context = {})
experiment_user = experiment_users.find_or_initialize_by(user: user)
- merged_context = experiment_user.context.deep_merge(context.deep_stringify_keys)
- experiment_user.update!(group_type: group_type, context: merged_context)
+ experiment_user.update!(group_type: group_type, context: merged_context(experiment_user, context))
end
- def record_conversion_event_for_user(user)
- experiment_users.find_by(user: user, converted_at: nil)&.touch(:converted_at)
+ def record_conversion_event_for_user(user, context = {})
+ experiment_user = experiment_users.find_by(user: user)
+ return unless experiment_user
+
+ experiment_user.update!(converted_at: Time.current, context: merged_context(experiment_user, context))
end
def record_group_and_variant!(group, variant)
experiment_subjects.find_or_initialize_by(group: group).update!(variant: variant)
end
+
+ private
+
+ def merged_context(experiment_user, new_context)
+ experiment_user.context.deep_merge(new_context.deep_stringify_keys)
+ end
end
diff --git a/app/models/group.rb b/app/models/group.rb
index 1eaa4499eb5..ba0d70b9c13 100644
--- a/app/models/group.rb
+++ b/app/models/group.rb
@@ -33,7 +33,6 @@ class Group < Namespace
has_many :members_and_requesters, as: :source, class_name: 'GroupMember'
has_many :milestones
- has_many :iterations
has_many :services
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'
@@ -364,15 +363,30 @@ class Group < Namespace
# rubocop: enable CodeReuse/ServiceClass
# rubocop: disable CodeReuse/ServiceClass
- def refresh_members_authorized_projects(blocking: true, priority: UserProjectAccessChangedService::HIGH_PRIORITY)
+ def refresh_members_authorized_projects(
+ blocking: true,
+ priority: UserProjectAccessChangedService::HIGH_PRIORITY,
+ direct_members_only: false
+ )
+
+ user_ids = if direct_members_only
+ users_ids_of_direct_members
+ else
+ user_ids_for_project_authorizations
+ end
+
UserProjectAccessChangedService
- .new(user_ids_for_project_authorizations)
+ .new(user_ids)
.execute(blocking: blocking, priority: priority)
end
# rubocop: enable CodeReuse/ServiceClass
+ def users_ids_of_direct_members
+ direct_members.pluck(:user_id)
+ end
+
def user_ids_for_project_authorizations
- members_with_parents.pluck(:user_id)
+ members_with_parents.pluck(Arel.sql('DISTINCT members.user_id'))
end
def self_and_ancestors_ids
@@ -381,6 +395,12 @@ class Group < Namespace
end
end
+ def direct_members
+ GroupMember.active_without_invites_and_requests
+ .non_minimal_access
+ .where(source_id: id)
+ end
+
def members_with_parents
# Avoids an unnecessary SELECT when the group has no parents
source_ids =
@@ -485,7 +505,7 @@ class Group < Namespace
# @param only_concrete_membership [Bool] whether require admin concrete membership status
def max_member_access_for_user(user, only_concrete_membership: false)
return GroupMember::NO_ACCESS unless user
- return GroupMember::OWNER if user.admin? && !only_concrete_membership
+ return GroupMember::OWNER if user.can_admin_all_resources? && !only_concrete_membership
max_member_access = members_with_parents.where(user_id: user)
.reorder(access_level: :desc)
@@ -505,15 +525,11 @@ class Group < Namespace
}
end
- def ci_variables_for(ref, project)
- cache_key = "ci_variables_for:group:#{self&.id}:project:#{project&.id}:ref:#{ref}"
+ def ci_variables_for(ref, project, environment: nil)
+ cache_key = "ci_variables_for:group:#{self&.id}:project:#{project&.id}:ref:#{ref}:environment:#{environment}"
::Gitlab::SafeRequestStore.fetch(cache_key) do
- list_of_ids = [self] + ancestors
- variables = Ci::GroupVariable.where(group: list_of_ids)
- variables = variables.unprotected unless project.protected_for?(ref)
- variables = variables.group_by(&:group_id)
- list_of_ids.reverse.flat_map { |group| variables[group.id] }.compact
+ uncached_ci_variables_for(ref, project, environment: environment)
end
end
@@ -755,6 +771,23 @@ class Group < Namespace
def enable_shared_runners!
update!(shared_runners_enabled: true)
end
+
+ def uncached_ci_variables_for(ref, project, environment: nil)
+ list_of_ids = [self] + ancestors
+ variables = Ci::GroupVariable.where(group: list_of_ids)
+ variables = variables.unprotected unless project.protected_for?(ref)
+
+ if Feature.enabled?(:scoped_group_variables, self, default_enabled: :yaml)
+ variables = if environment
+ variables.on_environment(environment)
+ else
+ variables.where(environment_scope: '*')
+ end
+ end
+
+ variables = variables.group_by(&:group_id)
+ list_of_ids.reverse.flat_map { |group| variables[group.id] }.compact
+ end
end
Group.prepend_if_ee('EE::Group')
diff --git a/app/models/hooks/web_hook_log.rb b/app/models/hooks/web_hook_log.rb
index 03f1797f4f4..e2230a2d644 100644
--- a/app/models/hooks/web_hook_log.rb
+++ b/app/models/hooks/web_hook_log.rb
@@ -6,6 +6,8 @@ class WebHookLog < ApplicationRecord
include DeleteWithLimit
include CreatedAtFilterable
+ self.primary_key = :id
+
belongs_to :web_hook
serialize :request_headers, Hash # rubocop:disable Cop/ActiveRecordSerialize
diff --git a/app/models/hooks/web_hook_log_partitioned.rb b/app/models/hooks/web_hook_log_partitioned.rb
new file mode 100644
index 00000000000..b4b150afb6a
--- /dev/null
+++ b/app/models/hooks/web_hook_log_partitioned.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+# This model is not yet intended to be used.
+# It is in a transitioning phase while we are partitioning
+# the web_hook_logs table on the database-side.
+# Please refer to https://gitlab.com/groups/gitlab-org/-/epics/5558
+# for details.
+# rubocop:disable Gitlab/NamespacedClass: This is a temporary class with no relevant namespace
+# WebHook, WebHookLog and all hooks are defined outside of a namespace
+class WebHookLogPartitioned < ApplicationRecord
+ include PartitionedTable
+
+ self.table_name = 'web_hook_logs_part_0c5294f417'
+ self.primary_key = :id
+
+ partitioned_by :created_at, strategy: :monthly
+end
diff --git a/app/models/issue.rb b/app/models/issue.rb
index 79d0229a281..fe413a30e3d 100644
--- a/app/models/issue.rb
+++ b/app/models/issue.rb
@@ -438,6 +438,10 @@ class Issue < ApplicationRecord
issue_type_supports?(:assignee)
end
+ def email_participants_downcase
+ issue_email_participants.pluck(IssueEmailParticipant.arel_table[:email].lower)
+ end
+
private
def ensure_metrics
diff --git a/app/models/issue_email_participant.rb b/app/models/issue_email_participant.rb
index 8eb9b6a8152..76a96151350 100644
--- a/app/models/issue_email_participant.rb
+++ b/app/models/issue_email_participant.rb
@@ -3,7 +3,7 @@
class IssueEmailParticipant < ApplicationRecord
belongs_to :issue
- validates :email, presence: true, uniqueness: { scope: [:issue_id] }
+ validates :email, uniqueness: { scope: [:issue_id], case_sensitive: false }
validates :issue, presence: true
validate :validate_email_format
diff --git a/app/models/iteration.rb b/app/models/iteration.rb
index 7a35bb1cd1f..7483d04aab8 100644
--- a/app/models/iteration.rb
+++ b/app/models/iteration.rb
@@ -1,140 +1,16 @@
# frozen_string_literal: true
+# Placeholder class for model that is implemented in EE
class Iteration < ApplicationRecord
self.table_name = 'sprints'
- attr_accessor :skip_future_date_validation
- attr_accessor :skip_project_validation
-
- STATE_ENUM_MAP = {
- upcoming: 1,
- started: 2,
- closed: 3
- }.with_indifferent_access.freeze
-
- include AtomicInternalId
-
- belongs_to :project
- belongs_to :group
-
- has_internal_id :iid, scope: :project
- has_internal_id :iid, scope: :group
-
- validates :start_date, presence: true
- validates :due_date, presence: true
-
- validate :dates_do_not_overlap, if: :start_or_due_dates_changed?
- validate :future_date, if: :start_or_due_dates_changed?, unless: :skip_future_date_validation
- validate :no_project, unless: :skip_project_validation
-
- scope :upcoming, -> { with_state(:upcoming) }
- scope :started, -> { with_state(:started) }
- scope :closed, -> { with_state(:closed) }
-
- scope :within_timeframe, -> (start_date, end_date) do
- where('start_date IS NOT NULL OR due_date IS NOT NULL')
- .where('start_date IS NULL OR start_date <= ?', end_date)
- .where('due_date IS NULL OR due_date >= ?', start_date)
+ def self.reference_prefix
+ '*iteration:'
end
- scope :start_date_passed, -> { where('start_date <= ?', Date.current).where('due_date >= ?', Date.current) }
- scope :due_date_passed, -> { where('due_date < ?', Date.current) }
-
- state_machine :state_enum, initial: :upcoming do
- event :start do
- transition upcoming: :started
- end
-
- event :close do
- transition [:upcoming, :started] => :closed
- end
-
- state :upcoming, value: Iteration::STATE_ENUM_MAP[:upcoming]
- state :started, value: Iteration::STATE_ENUM_MAP[:started]
- state :closed, value: Iteration::STATE_ENUM_MAP[:closed]
- end
-
- # Alias to state machine .with_state_enum method
- # This needs to be defined after the state machine block to avoid errors
- class << self
- alias_method :with_state, :with_state_enum
- alias_method :with_states, :with_state_enums
-
- def filter_by_state(iterations, state)
- case state
- when 'closed' then iterations.closed
- when 'started' then iterations.started
- when 'upcoming' then iterations.upcoming
- when 'opened' then iterations.started.or(iterations.upcoming)
- when 'all' then iterations
- else raise ArgumentError, "Unknown state filter: #{state}"
- end
- end
-
- def reference_prefix
- '*iteration:'
- end
-
- def reference_pattern
- nil
- end
- end
-
- def state
- STATE_ENUM_MAP.key(state_enum)
- end
-
- def state=(value)
- self.state_enum = STATE_ENUM_MAP[value]
- end
-
- def resource_parent
- group || project
- end
-
- private
-
- def parent_group
- group || project.group
- end
-
- def start_or_due_dates_changed?
- start_date_changed? || due_date_changed?
- end
-
- # ensure dates do not overlap with other Iterations in the same group/project tree
- def dates_do_not_overlap
- iterations = if parent_group.present? && resource_parent.is_a?(Project)
- Iteration.where(group: parent_group.self_and_ancestors).or(project.iterations)
- elsif parent_group.present?
- Iteration.where(group: parent_group.self_and_ancestors)
- else
- project.iterations
- end
-
- return unless iterations.where.not(id: self.id).within_timeframe(start_date, due_date).exists?
-
- errors.add(:base, s_("Iteration|Dates cannot overlap with other existing Iterations"))
- end
-
- # ensure dates are in the future
- def future_date
- if start_date_changed?
- errors.add(:start_date, s_("Iteration|cannot be in the past")) if start_date < Date.current
- errors.add(:start_date, s_("Iteration|cannot be more than 500 years in the future")) if start_date > 500.years.from_now
- end
-
- if due_date_changed?
- errors.add(:due_date, s_("Iteration|cannot be in the past")) if due_date < Date.current
- errors.add(:due_date, s_("Iteration|cannot be more than 500 years in the future")) if due_date > 500.years.from_now
- end
- end
-
- def no_project
- return unless project_id.present?
-
- errors.add(:project_id, s_("is not allowed. We do not currently support project-level iterations"))
+ def self.reference_pattern
+ nil
end
end
-Iteration.prepend_if_ee('EE::Iteration')
+Iteration.prepend_if_ee('::EE::Iteration')
diff --git a/app/models/label.rb b/app/models/label.rb
index 7a31b095cfc..26faaa90df3 100644
--- a/app/models/label.rb
+++ b/app/models/label.rb
@@ -131,6 +131,10 @@ class Label < ApplicationRecord
nil
end
+ def self.ids_on_board(board_id)
+ on_board(board_id).pluck(:label_id)
+ end
+
# Searches for labels with a matching title or description.
#
# This method uses ILIKE on PostgreSQL.
diff --git a/app/models/list.rb b/app/models/list.rb
index 49834af3dfb..e1954ed72c4 100644
--- a/app/models/list.rb
+++ b/app/models/list.rb
@@ -14,17 +14,10 @@ class List < ApplicationRecord
validates :label_id, uniqueness: { scope: :board_id }, if: :label?
scope :preload_associated_models, -> { preload(:board, label: :priorities) }
+ scope :without_types, ->(list_types) { where.not(list_type: list_types) }
alias_method :preferences, :list_user_preferences
- class << self
- def preload_preferences_for_user(lists, user)
- return unless user
-
- lists.each { |list| list.preferences_for(user) }
- end
- end
-
def preferences_for(user)
return preferences.build unless user
@@ -38,18 +31,6 @@ class List < ApplicationRecord
end
end
- def update_preferences_for(user, preferences = {})
- return unless user
-
- preferences_for(user).update(preferences)
- end
-
- def collapsed?(user)
- preferences = preferences_for(user)
-
- preferences.collapsed?
- end
-
def as_json(options = {})
super(options).tap do |json|
json[:collapsed] = false
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index 1374e8a814a..3fe31a64984 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -36,6 +36,10 @@ class MergeRequest < ApplicationRecord
SORTING_PREFERENCE_FIELD = :merge_requests_sort
+ ALLOWED_TO_USE_MERGE_BASE_PIPELINE_FOR_COMPARISON = {
+ 'Ci::CompareCodequalityReportsService' => ->(project) { ::Gitlab::Ci::Features.display_codequality_backend_comparison?(project) }
+ }.freeze
+
belongs_to :target_project, class_name: "Project"
belongs_to :source_project, class_name: "Project"
belongs_to :merge_user, class_name: "User"
@@ -187,9 +191,13 @@ class MergeRequest < ApplicationRecord
end
state_machine :merge_status, initial: :unchecked do
+ event :mark_as_preparing do
+ transition unchecked: :preparing
+ end
+
event :mark_as_unchecked do
- transition [:can_be_merged, :checking, :unchecked] => :unchecked
- transition [:cannot_be_merged, :cannot_be_merged_rechecking, :cannot_be_merged_recheck] => :cannot_be_merged_recheck
+ transition [:preparing, :can_be_merged, :checking] => :unchecked
+ transition [:cannot_be_merged, :cannot_be_merged_rechecking] => :cannot_be_merged_recheck
end
event :mark_as_checking do
@@ -205,6 +213,7 @@ class MergeRequest < ApplicationRecord
transition [:unchecked, :cannot_be_merged_recheck, :checking, :cannot_be_merged_rechecking] => :cannot_be_merged
end
+ state :preparing
state :unchecked
state :cannot_be_merged_recheck
state :checking
@@ -233,7 +242,7 @@ class MergeRequest < ApplicationRecord
# Returns current merge_status except it returns `cannot_be_merged_rechecking` as `checking`
# to avoid exposing unnecessary internal state
def public_merge_status
- cannot_be_merged_rechecking? ? 'checking' : merge_status
+ cannot_be_merged_rechecking? || preparing? ? 'checking' : merge_status
end
validates :source_project, presence: true, unless: [:allow_broken, :importing?, :closed_or_merged_without_fork?]
@@ -301,10 +310,28 @@ class MergeRequest < ApplicationRecord
end
scope :by_target_branch, ->(branch_name) { where(target_branch: branch_name) }
scope :order_merged_at, ->(direction) do
- query = join_metrics.order(Gitlab::Database.nulls_last_order('merge_request_metrics.merged_at', direction))
-
- # Add `merge_request_metrics.merged_at` to the `SELECT` in order to make the keyset pagination work.
- query.select(*query.arel.projections, MergeRequest::Metrics.arel_table[:merged_at].as('"merge_request_metrics.merged_at"'))
+ reverse_direction = { 'ASC' => 'DESC', 'DESC' => 'ASC' }
+ reversed_direction = reverse_direction[direction] || raise("Unknown sort direction was given: #{direction}")
+
+ order = Gitlab::Pagination::Keyset::Order.build([
+ Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: 'merge_request_metrics_merged_at',
+ column_expression: MergeRequest::Metrics.arel_table[:merged_at],
+ order_expression: Gitlab::Database.nulls_last_order('merge_request_metrics.merged_at', direction),
+ reversed_order_expression: Gitlab::Database.nulls_first_order('merge_request_metrics.merged_at', reversed_direction),
+ order_direction: direction,
+ nullable: :nulls_last,
+ distinct: false,
+ add_to_projections: true
+ ),
+ Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: 'merge_request_metrics_id',
+ order_expression: MergeRequest::Metrics.arel_table[:id].desc,
+ add_to_projections: true
+ )
+ ])
+
+ order.apply_cursor_conditions(join_metrics).order(order)
end
scope :order_merged_at_asc, -> { order_merged_at('ASC') }
scope :order_merged_at_desc, -> { order_merged_at('DESC') }
@@ -317,6 +344,8 @@ class MergeRequest < ApplicationRecord
scope :preload_author, -> { preload(:author) }
scope :preload_approved_by_users, -> { preload(:approved_by_users) }
scope :preload_metrics, -> (relation) { preload(metrics: relation) }
+ scope :preload_project_and_latest_diff, -> { preload(:source_project, :latest_merge_request_diff) }
+ scope :preload_latest_diff_commit, -> { preload(latest_merge_request_diff: :merge_request_diff_commits) }
scope :with_web_entity_associations, -> { preload(:author, :target_project) }
scope :with_auto_merge_enabled, -> do
@@ -374,8 +403,7 @@ class MergeRequest < ApplicationRecord
alias_attribute :auto_merge_enabled, :merge_when_pipeline_succeeds
alias_method :issuing_parent, :target_project
- delegate :active?, :builds_with_coverage, to: :head_pipeline, prefix: true, allow_nil: true
- delegate :success?, :active?, to: :actual_head_pipeline, prefix: true, allow_nil: true
+ delegate :builds_with_coverage, to: :head_pipeline, prefix: true, allow_nil: true
RebaseLockTimeout = Class.new(StandardError)
@@ -401,8 +429,8 @@ class MergeRequest < ApplicationRecord
def self.sort_by_attribute(method, excluded_labels: [])
case method.to_s
- when 'merged_at', 'merged_at_asc' then order_merged_at_asc.with_order_id_desc
- when 'merged_at_desc' then order_merged_at_desc.with_order_id_desc
+ when 'merged_at', 'merged_at_asc' then order_merged_at_asc
+ when 'merged_at_desc' then order_merged_at_desc
else
super
end
@@ -435,6 +463,18 @@ class MergeRequest < ApplicationRecord
target_project.latest_pipeline(target_branch, sha)
end
+ def head_pipeline_active?
+ !!head_pipeline&.active?
+ end
+
+ def actual_head_pipeline_active?
+ !!actual_head_pipeline&.active?
+ end
+
+ def actual_head_pipeline_success?
+ !!actual_head_pipeline&.success?
+ end
+
# Pattern used to extract `!123` merge request references from text
#
# This pattern supports cross-project references.
@@ -1026,6 +1066,7 @@ class MergeRequest < ApplicationRecord
def work_in_progress?
self.class.work_in_progress?(title)
end
+ alias_method :draft?, :work_in_progress?
def wipless_title
self.class.wipless_title(self.title)
@@ -1264,7 +1305,14 @@ class MergeRequest < ApplicationRecord
# Returns the oldest multi-line commit message, or the MR title if none found
def default_squash_commit_message
strong_memoize(:default_squash_commit_message) do
- recent_commits.without_merge_commits.reverse_each.find(&:description?)&.safe_message || title
+ first_multiline_commit&.safe_message || title
+ end
+ end
+
+ # Returns the oldest multi-line commit
+ def first_multiline_commit
+ strong_memoize(:first_multiline_commit) do
+ recent_commits.without_merge_commits.reverse_each.find(&:description?)
end
end
@@ -1550,7 +1598,7 @@ class MergeRequest < ApplicationRecord
def compare_reports(service_class, current_user = nil, report_type = nil )
with_reactive_cache(service_class.name, current_user&.id, report_type) do |data|
unless service_class.new(project, current_user, id: id, report_type: report_type)
- .latest?(base_pipeline, actual_head_pipeline, data)
+ .latest?(comparison_base_pipeline(service_class.name), actual_head_pipeline, data)
raise InvalidateReactiveCache
end
@@ -1586,7 +1634,7 @@ class MergeRequest < ApplicationRecord
raise NameError, service_class unless service_class < Ci::CompareReportsBaseService
current_user = User.find_by(id: current_user_id)
- service_class.new(project, current_user, id: id, report_type: report_type).execute(base_pipeline, actual_head_pipeline)
+ service_class.new(project, current_user, id: id, report_type: report_type).execute(comparison_base_pipeline(identifier), actual_head_pipeline)
end
def all_commits
@@ -1710,6 +1758,14 @@ class MergeRequest < ApplicationRecord
end
end
+ def use_merge_base_pipeline_for_comparison?(service_class)
+ ALLOWED_TO_USE_MERGE_BASE_PIPELINE_FOR_COMPARISON[service_class]&.call(project)
+ end
+
+ def comparison_base_pipeline(service_class)
+ (use_merge_base_pipeline_for_comparison?(service_class) && merge_base_pipeline) || base_pipeline
+ end
+
def base_pipeline
@base_pipeline ||= project.ci_pipelines
.order(id: :desc)
@@ -1830,6 +1886,12 @@ class MergeRequest < ApplicationRecord
}
end
+ def includes_ci_config?
+ return false unless diff_stats
+
+ diff_stats.map(&:path).include?(project.ci_config_path_or_default)
+ end
+
private
def missing_report_error(report_type)
diff --git a/app/models/namespace.rb b/app/models/namespace.rb
index 3342fb1fce9..3f7ccdb977e 100644
--- a/app/models/namespace.rb
+++ b/app/models/namespace.rb
@@ -63,12 +63,11 @@ class Namespace < ApplicationRecord
validates :max_artifacts_size, numericality: { only_integer: true, greater_than: 0, allow_nil: true }
+ validate :validate_parent_type, if: -> { Feature.enabled?(:validate_namespace_parent_type) }
validate :nesting_level_allowed
validate :changing_shared_runners_enabled_is_allowed
validate :changing_allow_descendants_override_disabled_shared_runners_is_allowed
- validates_associated :runners
-
delegate :name, to: :owner, allow_nil: true, prefix: true
delegate :avatar_url, to: :owner, allow_nil: true
@@ -84,6 +83,8 @@ class Namespace < ApplicationRecord
before_destroy(prepend: true) { prepare_for_destroy }
after_destroy :rm_dir
+ before_save :ensure_delayed_project_removal_assigned_to_namespace_settings, if: :delayed_project_removal_changed?
+
scope :for_user, -> { where('type IS NULL') }
scope :sort_by_type, -> { order(Gitlab::Database.nulls_first_order(:type)) }
scope :include_route, -> { includes(:route) }
@@ -164,6 +165,10 @@ class Namespace < ApplicationRecord
name = host.delete_suffix(gitlab_host)
Namespace.where(parent_id: nil).by_path(name)
end
+
+ def top_most
+ where(parent_id: nil)
+ end
end
def package_settings
@@ -255,11 +260,12 @@ class Namespace < ApplicationRecord
# Includes projects from this namespace and projects from all subgroups
# that belongs to this namespace
def all_projects
- if Feature.enabled?(:recursive_approach_for_all_projects)
- namespace = user? ? self : self_and_descendants
- Project.where(namespace: namespace)
+ return Project.where(namespace: self) if user?
+
+ if Feature.enabled?(:recursive_namespace_lookup_as_inner_join, self)
+ Project.joins("INNER JOIN (#{self_and_descendants.select(:id).to_sql}) namespaces ON namespaces.id=projects.namespace_id")
else
- Project.inside_path(full_path)
+ Project.where(namespace: self_and_descendants)
end
end
@@ -400,8 +406,19 @@ class Namespace < ApplicationRecord
!has_parent?
end
+ def recent?
+ created_at >= 90.days.ago
+ end
+
private
+ def ensure_delayed_project_removal_assigned_to_namespace_settings
+ return if Feature.disabled?(:migrate_delayed_project_removal, default_enabled: true)
+
+ self.namespace_settings || build_namespace_settings
+ namespace_settings.delayed_project_removal = delayed_project_removal
+ end
+
def all_projects_with_pages
if all_projects.pages_metadata_not_migrated.exists?
Gitlab::BackgroundMigration::MigratePagesMetadata.new.perform_on_relation(
@@ -437,6 +454,16 @@ class Namespace < ApplicationRecord
end
end
+ def validate_parent_type
+ return unless has_parent?
+
+ if user?
+ errors.add(:parent_id, 'a user namespace cannot have a parent')
+ elsif group?
+ errors.add(:parent_id, 'a group cannot have a user namespace as its parent') if parent.user?
+ end
+ end
+
def sync_share_with_group_lock_with_parent
if parent&.share_with_group_lock?
self.share_with_group_lock = true
diff --git a/app/models/namespace/root_storage_statistics.rb b/app/models/namespace/root_storage_statistics.rb
index 90aeee7a4f1..0c91ae760b2 100644
--- a/app/models/namespace/root_storage_statistics.rb
+++ b/app/models/namespace/root_storage_statistics.rb
@@ -57,8 +57,7 @@ class Namespace::RootStorageStatistics < ApplicationRecord
end
def attributes_from_personal_snippets
- # Return if the type of namespace does not belong to a user
- return {} unless namespace.type.nil?
+ return {} unless namespace.user?
from_personal_snippets.take.slice(SNIPPETS_SIZE_STAT_NAME)
end
@@ -70,3 +69,5 @@ class Namespace::RootStorageStatistics < ApplicationRecord
.select("COALESCE(SUM(s.repository_size), 0) AS #{SNIPPETS_SIZE_STAT_NAME}")
end
end
+
+Namespace::RootStorageStatistics.prepend_if_ee('EE::Namespace::RootStorageStatistics')
diff --git a/app/models/note.rb b/app/models/note.rb
index fdc972d9726..fb540d692d1 100644
--- a/app/models/note.rb
+++ b/app/models/note.rb
@@ -30,7 +30,6 @@ class Note < ApplicationRecord
# 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_at, :updated_at
alias_attribute :last_edited_by, :updated_by
# Attribute containing rendered and redacted Markdown as generated by
@@ -319,6 +318,7 @@ class Note < ApplicationRecord
def noteable_assignee_or_author?(user)
return false unless user
+ return false unless noteable.respond_to?(:author_id)
return noteable.assignee_or_author?(user) if [MergeRequest, Issue].include?(noteable.class)
noteable.author_id == user.id
@@ -348,7 +348,13 @@ class Note < ApplicationRecord
!system?
end
- # Since we're using `updated_at` as `last_edited_at`, it could be touched by transforming / resolving a note.
+ # We used `last_edited_at` as an alias of `updated_at` before.
+ # This makes it compatible with the previous way without data migration.
+ def last_edited_at
+ super || updated_at
+ end
+
+ # Since we used `updated_at` as `last_edited_at`, it could be touched by transforming / resolving a note.
# This makes sure it is only marked as edited when the note body is updated.
def edited?
return false if updated_by.blank?
@@ -546,7 +552,7 @@ class Note < ApplicationRecord
end
def skip_notification?
- review.present? || author.blocked? || author.ghost?
+ review.present? || !author.can_trigger_notifications?
end
private
diff --git a/app/models/notification_setting.rb b/app/models/notification_setting.rb
index 82e39e4f207..72813b17501 100644
--- a/app/models/notification_setting.rb
+++ b/app/models/notification_setting.rb
@@ -49,7 +49,8 @@ class NotificationSetting < ApplicationRecord
:failed_pipeline,
:fixed_pipeline,
:success_pipeline,
- :moved_project
+ :moved_project,
+ :merge_when_pipeline_succeeds
].freeze
def self.email_events(source = nil)
diff --git a/app/models/onboarding_progress.rb b/app/models/onboarding_progress.rb
index 8a444f8934e..be76c3dbf9d 100644
--- a/app/models/onboarding_progress.rb
+++ b/app/models/onboarding_progress.rb
@@ -17,6 +17,7 @@ class OnboardingProgress < ApplicationRecord
:code_owners_enabled,
:scoped_label_created,
:security_scan_enabled,
+ :issue_created,
:issue_auto_closed,
:repository_imported,
:repository_mirrored
@@ -66,6 +67,13 @@ class OnboardingProgress < ApplicationRecord
where(namespace: namespace).where.not(action_column => nil).exists?
end
+ def not_completed?(namespace_id, action)
+ return unless ACTIONS.include?(action)
+
+ action_column = column_name(action)
+ where(namespace_id: namespace_id).where(action_column => nil).exists?
+ end
+
def column_name(action)
:"#{action}_at"
end
diff --git a/app/models/packages/nuget.rb b/app/models/packages/nuget.rb
index 42c167e9b7f..f152eedb8fc 100644
--- a/app/models/packages/nuget.rb
+++ b/app/models/packages/nuget.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true
module Packages
module Nuget
+ TEMPORARY_PACKAGE_NAME = 'NuGet.Temporary.Package'
+
def self.table_name_prefix
'packages_nuget_'
end
diff --git a/app/models/packages/package.rb b/app/models/packages/package.rb
index 391540634be..993d1123c86 100644
--- a/app/models/packages/package.rb
+++ b/app/models/packages/package.rb
@@ -40,11 +40,11 @@ class Packages::Package < ApplicationRecord
validate :unique_debian_package_name, if: :debian_package?
validate :valid_conan_package_recipe, if: :conan?
- validate :valid_npm_package_name, if: :npm?
validate :valid_composer_global_name, if: :composer?
validate :package_already_taken, if: :npm?
validates :name, format: { with: Gitlab::Regex.conan_recipe_component_regex }, if: :conan?
validates :name, format: { with: Gitlab::Regex.generic_package_name_regex }, if: :generic?
+ validates :name, format: { with: Gitlab::Regex.npm_package_name_regex }, if: :npm?
validates :name, format: { with: Gitlab::Regex.nuget_package_name_regex }, if: :nuget?
validates :name, format: { with: Gitlab::Regex.debian_package_name_regex }, if: :debian_package?
validates :name, inclusion: { in: %w[incoming] }, if: :debian_incoming?
@@ -91,6 +91,12 @@ class Packages::Package < ApplicationRecord
joins(:conan_metadatum).where(packages_conan_metadata: { package_username: package_username })
end
+ scope :with_debian_codename, -> (codename) do
+ debian
+ .joins(:debian_distribution)
+ .where(Packages::Debian::ProjectDistribution.table_name => { codename: codename })
+ end
+ scope :preload_debian_file_metadata, -> { preload(package_files: :debian_file_metadatum) }
scope :with_composer_target, -> (target) do
includes(:composer_metadatum)
.joins(:composer_metadatum)
@@ -98,12 +104,12 @@ class Packages::Package < ApplicationRecord
end
scope :preload_composer, -> { preload(:composer_metadatum) }
- scope :without_nuget_temporary_name, -> { where.not(name: Packages::Nuget::CreatePackageService::TEMPORARY_PACKAGE_NAME) }
+ scope :without_nuget_temporary_name, -> { where.not(name: Packages::Nuget::TEMPORARY_PACKAGE_NAME) }
scope :has_version, -> { where.not(version: nil) }
scope :processed, -> do
where.not(package_type: :nuget).or(
- where.not(name: Packages::Nuget::CreatePackageService::TEMPORARY_PACKAGE_NAME)
+ where.not(name: Packages::Nuget::TEMPORARY_PACKAGE_NAME)
)
end
scope :preload_files, -> { preload(:package_files) }
@@ -126,6 +132,8 @@ class Packages::Package < ApplicationRecord
scope :order_project_path_desc, -> { joins(:project).reorder('projects.path DESC, id DESC') }
scope :order_by_package_file, -> { joins(:package_files).order('packages_package_files.created_at ASC') }
+ after_commit :update_composer_cache, on: :destroy, if: -> { composer? }
+
def self.for_projects(projects)
return none unless projects.any?
@@ -218,8 +226,20 @@ class Packages::Package < ApplicationRecord
end
end
+ def sync_maven_metadata(user)
+ return unless maven? && version? && user
+
+ ::Packages::Maven::Metadata::SyncWorker.perform_async(user.id, project.id, name)
+ end
+
private
+ def update_composer_cache
+ return unless composer?
+
+ ::Packages::Composer::CacheUpdateWorker.perform_async(project_id, name, composer_metadatum.version_cache_sha) # rubocop:disable CodeReuse/Worker
+ end
+
def composer_tag_version?
composer? && !Gitlab::Regex.composer_dev_version_regex.match(version.to_s)
end
@@ -247,14 +267,6 @@ class Packages::Package < ApplicationRecord
end
end
- def valid_npm_package_name
- return unless project&.root_namespace
-
- unless name =~ %r{\A@#{project.root_namespace.path}/[^/]+\z}
- errors.add(:name, 'is not valid')
- end
- end
-
def package_already_taken
return unless project
diff --git a/app/models/packages/package_file.rb b/app/models/packages/package_file.rb
index 9059f61b5de..23a7144e2bb 100644
--- a/app/models/packages/package_file.rb
+++ b/app/models/packages/package_file.rb
@@ -30,6 +30,10 @@ class Packages::PackageFile < ApplicationRecord
scope :preload_conan_file_metadata, -> { preload(:conan_file_metadatum) }
scope :preload_debian_file_metadata, -> { preload(:debian_file_metadatum) }
+ scope :for_rubygem_with_file_name, ->(project, file_name) do
+ joins(:package).merge(project.packages.rubygems).with_file_name(file_name)
+ end
+
scope :with_conan_file_type, ->(file_type) do
joins(:conan_file_metadatum)
.where(packages_conan_file_metadata: { conan_file_type: ::Packages::Conan::FileMetadatum.conan_file_types[file_type] })
diff --git a/app/models/packages/rubygems.rb b/app/models/packages/rubygems.rb
new file mode 100644
index 00000000000..1aa6b16f47e
--- /dev/null
+++ b/app/models/packages/rubygems.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+module Packages
+ module Rubygems
+ TEMPORARY_PACKAGE_NAME = 'Gem.Temporary.Package'
+
+ def self.table_name_prefix
+ 'packages_rubygems_'
+ end
+ end
+end
diff --git a/app/models/packages/rubygems/metadatum.rb b/app/models/packages/rubygems/metadatum.rb
index 42db1f3defc..d4e5feb7c98 100644
--- a/app/models/packages/rubygems/metadatum.rb
+++ b/app/models/packages/rubygems/metadatum.rb
@@ -3,7 +3,6 @@
module Packages
module Rubygems
class Metadatum < ApplicationRecord
- self.table_name = 'packages_rubygems_metadata'
self.primary_key = :package_id
belongs_to :package, -> { where(package_type: :rubygems) }, inverse_of: :rubygems_metadatum
diff --git a/app/models/pages/lookup_path.rb b/app/models/pages/lookup_path.rb
index c6781f8f6e3..33771580be2 100644
--- a/app/models/pages/lookup_path.rb
+++ b/app/models/pages/lookup_path.rb
@@ -43,8 +43,6 @@ module Pages
def deployment
strong_memoize(:deployment) do
- next unless Feature.enabled?(:pages_serve_from_deployments, project, default_enabled: true)
-
project.pages_metadatum.pages_deployment
end
end
@@ -52,9 +50,9 @@ module Pages
def zip_source
return unless deployment&.file
- return if deployment.file.file_storage? && !Feature.enabled?(:pages_serve_with_zip_file_protocol, project)
+ return if deployment.file.file_storage? && !Feature.enabled?(:pages_serve_with_zip_file_protocol, project, default_enabled: true)
- return if deployment.migrated? && !Feature.enabled?(:pages_serve_from_migrated_zip, project)
+ return if deployment.migrated? && !Feature.enabled?(:pages_serve_from_migrated_zip, project, default_enabled: true)
global_id = ::Gitlab::GlobalId.build(deployment, id: deployment.id).to_s
diff --git a/app/models/personal_access_token.rb b/app/models/personal_access_token.rb
index 3b07551fe05..ad2f4525171 100644
--- a/app/models/personal_access_token.rb
+++ b/app/models/personal_access_token.rb
@@ -4,6 +4,7 @@ class PersonalAccessToken < ApplicationRecord
include Expirable
include TokenAuthenticatable
include Sortable
+ include EachBatch
extend ::Gitlab::Utils::Override
add_authentication_token_field :token, digest: true
@@ -97,6 +98,10 @@ class PersonalAccessToken < ApplicationRecord
end
def set_default_scopes
+ # When only loading a select set of attributes, for example using `EachBatch`,
+ # the `scopes` attribute is not present, so we can't initialize it.
+ return unless has_attribute?(:scopes)
+
self.scopes = Gitlab::Auth::DEFAULT_SCOPES if self.scopes.empty?
end
diff --git a/app/models/project.rb b/app/models/project.rb
index 2b9b7dcf733..ef92dda443a 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -345,7 +345,7 @@ class Project < ApplicationRecord
has_many :daily_build_group_report_results, class_name: 'Ci::DailyBuildGroupReportResult'
- has_many :repository_storage_moves, class_name: 'ProjectRepositoryStorageMove', inverse_of: :container
+ has_many :repository_storage_moves, class_name: 'Projects::RepositoryStorageMove', inverse_of: :container
has_many :webide_pipelines, -> { webide_source }, class_name: 'Ci::Pipeline', inverse_of: :project
has_many :reviews, inverse_of: :project
@@ -392,7 +392,9 @@ class Project < ApplicationRecord
:merge_requests_access_level, :forking_access_level, :issues_access_level,
:wiki_access_level, :snippets_access_level, :builds_access_level,
:repository_access_level, :pages_access_level, :metrics_dashboard_access_level, :analytics_access_level,
- :operations_enabled?, :operations_access_level, to: :project_feature, allow_nil: true
+ :operations_enabled?, :operations_access_level, :security_and_compliance_access_level,
+ :container_registry_access_level,
+ to: :project_feature, allow_nil: true
delegate :show_default_award_emojis, :show_default_award_emojis=,
:show_default_award_emojis?,
to: :project_setting, allow_nil: true
@@ -491,10 +493,22 @@ class Project < ApplicationRecord
{ column: arel_table["description"], multiplier: 0.2 }
])
- query = reorder(order_expression.desc, arel_table['id'].desc)
+ order = Gitlab::Pagination::Keyset::Order.build([
+ Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: 'similarity',
+ column_expression: order_expression,
+ order_expression: order_expression.desc,
+ order_direction: :desc,
+ distinct: false,
+ add_to_projections: true
+ ),
+ Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: 'id',
+ order_expression: Project.arel_table[:id].desc
+ )
+ ])
- query = query.select(*query.arel.projections, order_expression.as('similarity')) if include_in_select
- query
+ order.apply_cursor_conditions(reorder(order))
end
scope :with_packages, -> { joins(:packages) }
@@ -1696,8 +1710,8 @@ class Project < ApplicationRecord
end
end
- def any_runners?(&block)
- active_runners.any?(&block)
+ def any_active_runners?(&block)
+ active_runners_with_tags.any?(&block)
end
def valid_runners_token?(token)
@@ -1986,6 +2000,7 @@ class Project < ApplicationRecord
.append(key: 'CI_PROJECT_REPOSITORY_LANGUAGES', value: repository_languages.map(&:name).join(',').downcase)
.append(key: 'CI_DEFAULT_BRANCH', value: default_branch)
.append(key: 'CI_PROJECT_CONFIG_PATH', value: ci_config_path_or_default)
+ .append(key: 'CI_CONFIG_PATH', value: ci_config_path_or_default)
end
def predefined_ci_server_variables
@@ -2023,10 +2038,10 @@ class Project < ApplicationRecord
Gitlab::Ci::Variables::Collection.new.tap do |variables|
break variables unless Gitlab.config.dependency_proxy.enabled
- variables.append(key: 'CI_DEPENDENCY_PROXY_SERVER', value: "#{Gitlab.config.gitlab.host}:#{Gitlab.config.gitlab.port}")
+ variables.append(key: 'CI_DEPENDENCY_PROXY_SERVER', value: Gitlab.host_with_port)
variables.append(
key: 'CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX',
- value: "#{Gitlab.config.gitlab.host}:#{Gitlab.config.gitlab.port}/#{namespace.root_ancestor.path}#{DependencyProxy::URL_SUFFIX}"
+ value: "#{Gitlab.host_with_port}/#{namespace.root_ancestor.path}#{DependencyProxy::URL_SUFFIX}"
)
end
end
@@ -2532,6 +2547,10 @@ class Project < ApplicationRecord
Projects::GitGarbageCollectWorker
end
+ def inherited_issuable_templates_enabled?
+ Feature.enabled?(:inherited_issuable_templates, self, default_enabled: :yaml)
+ end
+
private
def find_service(services, name)
@@ -2694,6 +2713,12 @@ class Project < ApplicationRecord
def cache_has_external_issue_tracker
update_column(:has_external_issue_tracker, services.external_issue_trackers.any?) if Gitlab::Database.read_write?
end
+
+ def active_runners_with_tags
+ strong_memoize(:active_runners_with_tags) do
+ active_runners.with_tags
+ end
+ end
end
Project.prepend_if_ee('EE::Project')
diff --git a/app/models/project_feature.rb b/app/models/project_feature.rb
index 7b204cfb1c0..45cfeac307c 100644
--- a/app/models/project_feature.rb
+++ b/app/models/project_feature.rb
@@ -3,7 +3,23 @@
class ProjectFeature < ApplicationRecord
include Featurable
- FEATURES = %i(issues forking merge_requests wiki snippets builds repository pages metrics_dashboard analytics operations).freeze
+ FEATURES = %i[
+ issues
+ forking
+ merge_requests
+ wiki
+ snippets
+ builds
+ repository
+ pages
+ metrics_dashboard
+ analytics
+ operations
+ security_and_compliance
+ container_registry
+ ].freeze
+
+ EXPORTABLE_FEATURES = (FEATURES - [:security_and_compliance]).freeze
set_available_features(FEATURES)
@@ -37,16 +53,17 @@ class ProjectFeature < ApplicationRecord
validate :repository_children_level
validate :allowed_access_levels
- default_value_for :builds_access_level, value: ENABLED, allows_nil: false
- default_value_for :issues_access_level, value: ENABLED, allows_nil: false
- default_value_for :forking_access_level, value: ENABLED, allows_nil: false
- default_value_for :merge_requests_access_level, value: ENABLED, allows_nil: false
- default_value_for :snippets_access_level, value: ENABLED, allows_nil: false
- default_value_for :wiki_access_level, value: ENABLED, allows_nil: false
- default_value_for :repository_access_level, value: ENABLED, allows_nil: false
- default_value_for :analytics_access_level, value: ENABLED, allows_nil: false
+ default_value_for :builds_access_level, value: ENABLED, allows_nil: false
+ default_value_for :issues_access_level, value: ENABLED, allows_nil: false
+ default_value_for :forking_access_level, value: ENABLED, allows_nil: false
+ default_value_for :merge_requests_access_level, value: ENABLED, allows_nil: false
+ default_value_for :snippets_access_level, value: ENABLED, allows_nil: false
+ default_value_for :wiki_access_level, value: ENABLED, allows_nil: false
+ default_value_for :repository_access_level, value: ENABLED, allows_nil: false
+ default_value_for :analytics_access_level, value: ENABLED, allows_nil: false
default_value_for :metrics_dashboard_access_level, value: PRIVATE, allows_nil: false
- default_value_for :operations_access_level, value: ENABLED, allows_nil: false
+ default_value_for :operations_access_level, value: ENABLED, allows_nil: false
+ default_value_for :security_and_compliance_access_level, value: PRIVATE, allows_nil: false
default_value_for(:pages_access_level, allows_nil: false) do |feature|
if ::Gitlab::Pages.access_control_is_forced?
diff --git a/app/models/project_repository_storage_move.rb b/app/models/project_repository_storage_move.rb
index 1e3782a1fb5..e54489ddb88 100644
--- a/app/models/project_repository_storage_move.rb
+++ b/app/models/project_repository_storage_move.rb
@@ -1,34 +1,13 @@
# frozen_string_literal: true
-# ProjectRepositoryStorageMove are details of repository storage moves for a
-# project. For example, moving a project to another gitaly node to help
-# balance storage capacity.
-class ProjectRepositoryStorageMove < ApplicationRecord
- extend ::Gitlab::Utils::Override
- include RepositoryStorageMovable
-
- belongs_to :container, class_name: 'Project', inverse_of: :repository_storage_moves, foreign_key: :project_id
- alias_attribute :project, :container
- scope :with_projects, -> { includes(container: :route) }
-
- override :update_repository_storage
- def update_repository_storage(new_storage)
- container.update_column(:repository_storage, new_storage)
- end
-
- override :schedule_repository_storage_update_worker
- def schedule_repository_storage_update_worker
- ProjectUpdateRepositoryStorageWorker.perform_async(
- project_id,
- destination_storage_name,
- id
- )
- end
-
- private
-
- override :error_key
- def error_key
- :project
- end
+# This is a compatibility class to avoid calling a non-existent
+# class from sidekiq during deployment.
+#
+# This class was moved to a namespace in https://gitlab.com/gitlab-org/gitlab/-/issues/299853.
+# we cannot remove this class entirely because there can be jobs
+# referencing it.
+#
+# We can get rid of this class in 14.0
+# https://gitlab.com/gitlab-org/gitlab/-/issues/322393
+class ProjectRepositoryStorageMove < Projects::RepositoryStorageMove
end
diff --git a/app/models/project_services/chat_notification_service.rb b/app/models/project_services/chat_notification_service.rb
index 1d50d5cf19e..cf7cad09676 100644
--- a/app/models/project_services/chat_notification_service.rb
+++ b/app/models/project_services/chat_notification_service.rb
@@ -97,9 +97,12 @@ class ChatNotificationService < Service
opts[:channel] = channels if channels.present?
opts[:username] = username if username
- return false unless notify(message, opts)
+ if notify(message, opts)
+ log_usage(event_type, user_id_from_hook_data(data))
+ return true
+ end
- true
+ false
end
def event_channel_names
@@ -120,6 +123,10 @@ class ChatNotificationService < Service
private
+ def log_usage(_, _)
+ # Implement in child class
+ end
+
def labels_to_be_notified_list
return [] if labels_to_be_notified.nil?
@@ -136,6 +143,10 @@ class ChatNotificationService < Service
(labels_to_be_notified_list & label_titles).any?
end
+ def user_id_from_hook_data(data)
+ data.dig(:user, :id) || data[:user_id]
+ end
+
# every notifier must implement this independently
def notify(message, opts)
raise NotImplementedError
diff --git a/app/models/project_services/discord_service.rb b/app/models/project_services/discord_service.rb
index 941b7f64263..37bbb9b8752 100644
--- a/app/models/project_services/discord_service.rb
+++ b/app/models/project_services/discord_service.rb
@@ -59,6 +59,9 @@ class DiscordService < ChatNotificationService
embed.description = (message.pretext + "\n" + Array.wrap(message.attachments).join("\n")).gsub(ATTACHMENT_REGEX, " \\k<entry> - \\k<name>\n")
end
end
+ rescue RestClient::Exception => error
+ log_error(error.message)
+ false
end
def custom_data(data)
diff --git a/app/models/project_services/mattermost_service.rb b/app/models/project_services/mattermost_service.rb
index c1055db78e5..9cff979fcf2 100644
--- a/app/models/project_services/mattermost_service.rb
+++ b/app/models/project_services/mattermost_service.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class MattermostService < ChatNotificationService
- include ::SlackService::Notifier
+ include SlackMattermost::Notifier
def title
'Mattermost notifications'
diff --git a/app/models/project_services/prometheus_service.rb b/app/models/project_services/prometheus_service.rb
index ab043227832..b8869547a37 100644
--- a/app/models/project_services/prometheus_service.rb
+++ b/app/models/project_services/prometheus_service.rb
@@ -46,7 +46,7 @@ class PrometheusService < MonitoringService
end
def description
- s_('PrometheusService|Time-series monitoring service')
+ s_('PrometheusService|Monitor application health with Prometheus metrics and dashboards')
end
def self.to_param
@@ -59,20 +59,23 @@ class PrometheusService < MonitoringService
type: 'checkbox',
name: 'manual_configuration',
title: s_('PrometheusService|Active'),
+ help: s_('PrometheusService|Select this checkbox to override the auto configuration settings with your own settings.'),
required: true
},
{
type: 'text',
name: 'api_url',
title: 'API URL',
- placeholder: s_('PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/'),
+ placeholder: s_('PrometheusService|https://prometheus.example.com/'),
+ help: s_('PrometheusService|The Prometheus API base URL.'),
required: true
},
{
type: 'text',
name: 'google_iap_audience_client_id',
title: 'Google IAP Audience Client ID',
- placeholder: s_('PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)'),
+ placeholder: s_('PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com'),
+ help: s_('PrometheusService|PrometheusService|The ID of the IAP-secured resource.'),
autocomplete: 'off',
required: false
},
@@ -80,7 +83,8 @@ class PrometheusService < MonitoringService
type: 'textarea',
name: 'google_iap_service_account_json',
title: 'Google IAP Service Account JSON',
- placeholder: s_('PrometheusService|Contents of the credentials.json file of your service account, like: { "type": "service_account", "project_id": ... }'),
+ placeholder: s_('PrometheusService|{ "type": "service_account", "project_id": ... }'),
+ help: s_('PrometheusService|The contents of the credentials.json file of your service account.'),
required: false
}
]
diff --git a/app/models/project_services/slack_mattermost/notifier.rb b/app/models/project_services/slack_mattermost/notifier.rb
new file mode 100644
index 00000000000..1a78cea5933
--- /dev/null
+++ b/app/models/project_services/slack_mattermost/notifier.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+module SlackMattermost
+ module Notifier
+ private
+
+ def notify(message, opts)
+ # See https://gitlab.com/gitlab-org/slack-notifier/#custom-http-client
+ notifier = Slack::Messenger.new(webhook, opts.merge(http_client: HTTPClient))
+ notifier.ping(
+ message.pretext,
+ attachments: message.attachments,
+ fallback: message.fallback
+ )
+ end
+
+ class HTTPClient
+ def self.post(uri, params = {})
+ params.delete(:http_options) # these are internal to the client and we do not want them
+ Gitlab::HTTP.post(uri, body: params)
+ end
+ end
+ end
+end
diff --git a/app/models/project_services/slack_service.rb b/app/models/project_services/slack_service.rb
index 79245e84238..f42b3de39d5 100644
--- a/app/models/project_services/slack_service.rb
+++ b/app/models/project_services/slack_service.rb
@@ -1,6 +1,14 @@
# frozen_string_literal: true
class SlackService < ChatNotificationService
+ include SlackMattermost::Notifier
+ extend ::Gitlab::Utils::Override
+
+ SUPPORTED_EVENTS_FOR_USAGE_LOG = %w[
+ push issue confidential_issue merge_request note confidential_note
+ tag_push wiki_page deployment
+ ].freeze
+
prop_accessor EVENT_CHANNEL['alert']
def title
@@ -36,26 +44,14 @@ class SlackService < ChatNotificationService
super
end
- module Notifier
- private
+ override :log_usage
+ def log_usage(event, user_id)
+ return unless user_id
- def notify(message, opts)
- # See https://gitlab.com/gitlab-org/slack-notifier/#custom-http-client
- notifier = Slack::Messenger.new(webhook, opts.merge(http_client: HTTPClient))
- notifier.ping(
- message.pretext,
- attachments: message.attachments,
- fallback: message.fallback
- )
- end
+ return unless SUPPORTED_EVENTS_FOR_USAGE_LOG.include?(event)
- class HTTPClient
- def self.post(uri, params = {})
- params.delete(:http_options) # these are internal to the client and we do not want them
- Gitlab::HTTP.post(uri, body: params)
- end
- end
- end
+ key = "i_ecosystem_slack_service_#{event}_notification"
- include Notifier
+ Gitlab::UsageDataCounters::HLLRedisCounter.track_event(key, values: user_id)
+ end
end
diff --git a/app/models/project_services/unify_circuit_service.rb b/app/models/project_services/unify_circuit_service.rb
index 1e12179e62a..1a0eebe7d64 100644
--- a/app/models/project_services/unify_circuit_service.rb
+++ b/app/models/project_services/unify_circuit_service.rb
@@ -47,7 +47,7 @@ class UnifyCircuitService < ChatNotificationService
def notify(message, opts)
response = Gitlab::HTTP.post(webhook, body: {
subject: message.project_name,
- text: message.pretext,
+ text: message.summary,
markdown: true
}.to_json)
diff --git a/app/models/project_services/webex_teams_service.rb b/app/models/project_services/webex_teams_service.rb
index 1d791b19486..4e8281f4e81 100644
--- a/app/models/project_services/webex_teams_service.rb
+++ b/app/models/project_services/webex_teams_service.rb
@@ -46,7 +46,7 @@ class WebexTeamsService < ChatNotificationService
def notify(message, opts)
header = { 'Content-Type' => 'application/json' }
- response = Gitlab::HTTP.post(webhook, headers: header, body: { markdown: message.pretext }.to_json)
+ response = Gitlab::HTTP.post(webhook, headers: header, body: { markdown: message.summary }.to_json)
response if response.success?
end
diff --git a/app/models/projects/repository_storage_move.rb b/app/models/projects/repository_storage_move.rb
new file mode 100644
index 00000000000..f4411e0b4fd
--- /dev/null
+++ b/app/models/projects/repository_storage_move.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+# Projects::RepositoryStorageMove are details of repository storage moves for a
+# project. For example, moving a project to another gitaly node to help
+# balance storage capacity.
+module Projects
+ class RepositoryStorageMove < ApplicationRecord
+ extend ::Gitlab::Utils::Override
+ include RepositoryStorageMovable
+
+ self.table_name = 'project_repository_storage_moves'
+
+ belongs_to :container, class_name: 'Project', inverse_of: :repository_storage_moves, foreign_key: :project_id
+ alias_attribute :project, :container
+ scope :with_projects, -> { includes(container: :route) }
+
+ override :update_repository_storage
+ def update_repository_storage(new_storage)
+ container.update_column(:repository_storage, new_storage)
+ end
+
+ override :schedule_repository_storage_update_worker
+ def schedule_repository_storage_update_worker
+ Projects::UpdateRepositoryStorageWorker.perform_async(
+ project_id,
+ destination_storage_name,
+ id
+ )
+ end
+
+ private
+
+ override :error_key
+ def error_key
+ :project
+ end
+ end
+end
diff --git a/app/models/protected_branch.rb b/app/models/protected_branch.rb
index ad418a47476..cbbdd091feb 100644
--- a/app/models/protected_branch.rb
+++ b/app/models/protected_branch.rb
@@ -7,6 +7,9 @@ class ProtectedBranch < ApplicationRecord
scope :requiring_code_owner_approval,
-> { where(code_owner_approval_required: true) }
+ scope :allowing_force_push,
+ -> { where(allow_force_push: true) }
+
protected_ref_access_levels :merge, :push
def self.protected_ref_accessible_to?(ref, user, project:, action:, protected_refs: nil)
@@ -26,6 +29,12 @@ class ProtectedBranch < ApplicationRecord
self.matching(ref_name, protected_refs: protected_refs(project)).present?
end
+ def self.allow_force_push?(project, ref_name)
+ return false unless ::Feature.enabled?(:allow_force_push_to_protected_branches, project)
+
+ project.protected_branches.allowing_force_push.matching(ref_name).any?
+ end
+
def self.any_protected?(project, ref_names)
protected_refs(project).any? do |protected_ref|
ref_names.any? do |ref_name|
diff --git a/app/models/snippet.rb b/app/models/snippet.rb
index ab8782ed87f..8edf31bd661 100644
--- a/app/models/snippet.rb
+++ b/app/models/snippet.rb
@@ -45,7 +45,7 @@ class Snippet < ApplicationRecord
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
has_one :snippet_repository, inverse_of: :snippet
- has_many :repository_storage_moves, class_name: 'SnippetRepositoryStorageMove', inverse_of: :container
+ has_many :repository_storage_moves, class_name: 'Snippets::RepositoryStorageMove', inverse_of: :container
# We need to add the `dependent` in order to call the after_destroy callback
has_one :statistics, class_name: 'SnippetStatistics', dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent
@@ -216,8 +216,10 @@ class Snippet < ApplicationRecord
def blobs
return [] unless repository_exists?
- branch = default_branch
- list_files(branch).map { |file| Blob.lazy(repository, branch, file) }
+ files = list_files(default_branch)
+ items = files.map { |file| [default_branch, file] }
+
+ repository.blobs_at(items).compact
end
def hook_attrs
diff --git a/app/models/snippet_repository_storage_move.rb b/app/models/snippet_repository_storage_move.rb
index bb157c08995..8234905a7e1 100644
--- a/app/models/snippet_repository_storage_move.rb
+++ b/app/models/snippet_repository_storage_move.rb
@@ -1,28 +1,13 @@
# frozen_string_literal: true
-# SnippetRepositoryStorageMove are details of repository storage moves for a
-# snippet. For example, moving a snippet to another gitaly node to help
-# balance storage capacity.
-class SnippetRepositoryStorageMove < ApplicationRecord
- extend ::Gitlab::Utils::Override
- include RepositoryStorageMovable
-
- belongs_to :container, class_name: 'Snippet', inverse_of: :repository_storage_moves, foreign_key: :snippet_id
- alias_attribute :snippet, :container
-
- override :schedule_repository_storage_update_worker
- def schedule_repository_storage_update_worker
- SnippetUpdateRepositoryStorageWorker.perform_async(
- snippet_id,
- destination_storage_name,
- id
- )
- end
-
- private
-
- override :error_key
- def error_key
- :snippet
- end
+# This is a compatibility class to avoid calling a non-existent
+# class from sidekiq during deployment.
+#
+# This class was moved to a namespace in https://gitlab.com/gitlab-org/gitlab/-/issues/299853.
+# we cannot remove this class entirely because there can be jobs
+# referencing it.
+#
+# We can get rid of this class in 14.0
+# https://gitlab.com/gitlab-org/gitlab/-/issues/322393
+class SnippetRepositoryStorageMove < Snippets::RepositoryStorageMove
end
diff --git a/app/models/snippets/repository_storage_move.rb b/app/models/snippets/repository_storage_move.rb
new file mode 100644
index 00000000000..3d6e1b0ccea
--- /dev/null
+++ b/app/models/snippets/repository_storage_move.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+# Snippets::RepositoryStorageMove are details of repository storage moves for a
+# snippet. For example, moving a snippet to another gitaly node to help
+# balance storage capacity.
+module Snippets
+ class RepositoryStorageMove < ApplicationRecord
+ extend ::Gitlab::Utils::Override
+ include RepositoryStorageMovable
+
+ self.table_name = 'snippet_repository_storage_moves'
+
+ belongs_to :container, class_name: 'Snippet', inverse_of: :repository_storage_moves, foreign_key: :snippet_id
+ alias_attribute :snippet, :container
+
+ override :schedule_repository_storage_update_worker
+ def schedule_repository_storage_update_worker
+ Snippets::UpdateRepositoryStorageWorker.perform_async(
+ snippet_id,
+ destination_storage_name,
+ id
+ )
+ end
+
+ private
+
+ override :error_key
+ def error_key
+ :snippet
+ end
+ end
+end
diff --git a/app/models/todo.rb b/app/models/todo.rb
index 12dc9ce0fe6..176d5e56fc0 100644
--- a/app/models/todo.rb
+++ b/app/models/todo.rb
@@ -55,7 +55,6 @@ class Todo < ApplicationRecord
validates :project, presence: true, unless: :group_id
validates :group, presence: true, unless: :project_id
- scope :for_ids, -> (ids) { where(id: ids) }
scope :pending, -> { with_state(:pending) }
scope :done, -> { with_state(:done) }
scope :for_action, -> (action) { where(action: action) }
diff --git a/app/models/user.rb b/app/models/user.rb
index 1f8b680c7e5..11046bdabe4 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -179,6 +179,7 @@ class User < ApplicationRecord
has_many :merge_request_reviewers, inverse_of: :reviewer
has_many :assigned_issues, class_name: "Issue", through: :issue_assignees, source: :issue
has_many :assigned_merge_requests, class_name: "MergeRequest", through: :merge_request_assignees, source: :merge_request
+ has_many :created_custom_emoji, class_name: 'CustomEmoji', inverse_of: :creator
has_many :bulk_imports
@@ -271,7 +272,7 @@ class User < ApplicationRecord
enum layout: { fixed: 0, fluid: 1 }
# User's Dashboard preference
- enum dashboard: { projects: 0, stars: 1, project_activity: 2, starred_project_activity: 3, groups: 4, todos: 5, issues: 6, merge_requests: 7, operations: 8 }
+ enum dashboard: { projects: 0, stars: 1, project_activity: 2, starred_project_activity: 3, groups: 4, todos: 5, issues: 6, merge_requests: 7, operations: 8, followed_user_activity: 9 }
# User's Project preference
enum project_view: { readme: 0, activity: 1, files: 2 }
@@ -293,6 +294,7 @@ class User < ApplicationRecord
:setup_for_company, :setup_for_company=,
:render_whitespace_in_code, :render_whitespace_in_code=,
:experience_level, :experience_level=,
+ :markdown_surround_selection, :markdown_surround_selection=,
to: :user_preference
delegate :path, to: :namespace, allow_nil: true, prefix: true
@@ -359,6 +361,7 @@ class User < ApplicationRecord
scope :blocked, -> { with_states(:blocked, :ldap_blocked) }
scope :blocked_pending_approval, -> { with_states(:blocked_pending_approval) }
scope :external, -> { where(external: true) }
+ scope :non_external, -> { where(external: false) }
scope :confirmed, -> { where.not(confirmed_at: nil) }
scope :active, -> { with_state(:active).non_internal }
scope :active_without_ghosts, -> { with_state(:active).without_ghosts }
@@ -937,11 +940,7 @@ class User < ApplicationRecord
# Returns the groups a user has access to, either through a membership or a project authorization
def authorized_groups
Group.unscoped do
- if Feature.enabled?(:shared_group_membership_auth, self)
- authorized_groups_with_shared_membership
- else
- authorized_groups_without_shared_membership
- end
+ authorized_groups_with_shared_membership
end
end
@@ -1705,6 +1704,10 @@ class User < ApplicationRecord
can?(:read_all_resources)
end
+ def can_admin_all_resources?
+ can?(:admin_all_resources)
+ end
+
def update_two_factor_requirement
periods = expanded_groups_requiring_two_factor_authentication.pluck(:two_factor_grace_period)
@@ -1855,6 +1858,14 @@ class User < ApplicationRecord
created_at > Devise.confirm_within.ago
end
+ def find_or_initialize_callout(feature_name)
+ callouts.find_or_initialize_by(feature_name: ::UserCallout.feature_names[feature_name])
+ end
+
+ def can_trigger_notifications?
+ confirmed? && !blocked? && !ghost?
+ end
+
protected
# override, from Devise::Validatable
diff --git a/app/models/user_callout.rb b/app/models/user_callout.rb
index d93fe611538..bb5a9dceaeb 100644
--- a/app/models/user_callout.rb
+++ b/app/models/user_callout.rb
@@ -7,7 +7,7 @@ class UserCallout < ApplicationRecord
gke_cluster_integration: 1,
gcp_signup_offer: 2,
cluster_security_warning: 3,
- gold_trial: 4, # EE-only
+ ultimate_trial: 4, # EE-only
geo_enable_hashed_storage: 5, # EE-only
geo_migrate_hashed_storage: 6, # EE-only
canary_deployment: 7, # EE-only
diff --git a/app/models/user_preference.rb b/app/models/user_preference.rb
index 49b93ffaf66..0bf8c8f901d 100644
--- a/app/models/user_preference.rb
+++ b/app/models/user_preference.rb
@@ -27,6 +27,7 @@ class UserPreference < ApplicationRecord
default_value_for :time_display_relative, value: true, allows_nil: false
default_value_for :time_format_in_24h, value: false, allows_nil: false
default_value_for :render_whitespace_in_code, value: false, allows_nil: false
+ default_value_for :markdown_surround_selection, value: true, allows_nil: false
class << self
def notes_filters
diff --git a/app/models/wiki.rb b/app/models/wiki.rb
index 45747c0b03c..abaa4e05d74 100644
--- a/app/models/wiki.rb
+++ b/app/models/wiki.rb
@@ -159,7 +159,7 @@ class Wiki
find_page(SIDEBAR, version)
end
- def find_file(name, version = nil)
+ def find_file(name, version = 'HEAD')
wiki.file(name, version)
end
diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb
index 989128987d5..3b9a7ded83e 100644
--- a/app/models/wiki_page.rb
+++ b/app/models/wiki_page.rb
@@ -205,14 +205,15 @@ class WikiPage
last_commit_sha = attrs.delete(:last_commit_sha)
if last_commit_sha && last_commit_sha != self.last_commit_sha
- raise PageChangedError
+ raise PageChangedError, s_(
+ '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.')
end
update_attributes(attrs)
if title.present? && title_changed? && wiki.find_page(title).present?
attributes[:title] = page.title
- raise PageRenameError
+ raise PageRenameError, s_('WikiEdit|There is already a page with the same title in that path.')
end
save do
diff --git a/app/models/zoom_meeting.rb b/app/models/zoom_meeting.rb
index c8b510c4779..f684f9e6fe0 100644
--- a/app/models/zoom_meeting.rb
+++ b/app/models/zoom_meeting.rb
@@ -10,7 +10,7 @@ class ZoomMeeting < ApplicationRecord
validates :project, presence: true, unless: :importing?
validates :issue, presence: true, unless: :importing?
- validates :url, presence: true, length: { maximum: 255 }, zoom_url: true
+ validates :url, presence: true, length: { maximum: 255 }, 'gitlab/utils/zoom_url': true
validates :issue, same_project_association: true, unless: :importing?
enum issue_status: {
diff --git a/app/policies/analytics/instance_statistics/measurement_policy.rb b/app/policies/analytics/instance_statistics/measurement_policy.rb
deleted file mode 100644
index 3d6a5a08ff6..00000000000
--- a/app/policies/analytics/instance_statistics/measurement_policy.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-module Analytics
- module InstanceStatistics
- class MeasurementPolicy < BasePolicy
- delegate { :global }
- end
- end
-end
diff --git a/app/policies/analytics/usage_trends/measurement_policy.rb b/app/policies/analytics/usage_trends/measurement_policy.rb
new file mode 100644
index 00000000000..da3c0927ea5
--- /dev/null
+++ b/app/policies/analytics/usage_trends/measurement_policy.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Analytics
+ module UsageTrends
+ class MeasurementPolicy < BasePolicy
+ delegate { :global }
+ end
+ end
+end
diff --git a/app/policies/base_policy.rb b/app/policies/base_policy.rb
index 51694ec7c50..e32a889c906 100644
--- a/app/policies/base_policy.rb
+++ b/app/policies/base_policy.rb
@@ -55,14 +55,17 @@ class BasePolicy < DeclarativePolicy::Base
prevent :read_cross_project
end
- # Policy extended in EE to also enable auditors
- rule { admin }.enable :read_all_resources
+ rule { admin }.policy do
+ # Only for actual administrator accounts, behaviour affected by admin mode application setting
+ enable :admin_all_resources
+ # Policy extended in EE to also enable auditors
+ enable :read_all_resources
+ enable :change_repository_storage
+ end
rule { default }.enable :read_cross_project
condition(:is_gitlab_com) { ::Gitlab.dev_env_or_com? }
-
- rule { admin }.enable :change_repository_storage
end
BasePolicy.prepend_if_ee('EE::BasePolicy')
diff --git a/app/policies/concerns/readonly_abilities.rb b/app/policies/concerns/readonly_abilities.rb
index a267e963541..0303d4cff14 100644
--- a/app/policies/concerns/readonly_abilities.rb
+++ b/app/policies/concerns/readonly_abilities.rb
@@ -17,7 +17,7 @@ module ReadonlyAbilities
READONLY_FEATURES = %i[
issue
- list
+ issue_board_list
merge_request
label
milestone
diff --git a/app/policies/global_policy.rb b/app/policies/global_policy.rb
index 9c79a797a6a..5ee34ebbb2f 100644
--- a/app/policies/global_policy.rb
+++ b/app/policies/global_policy.rb
@@ -100,7 +100,7 @@ class GlobalPolicy < BasePolicy
enable :update_custom_attribute
enable :approve_user
enable :reject_user
- enable :read_instance_statistics_measurements
+ enable :read_usage_trends_measurement
end
# We can't use `read_statistics` because the user may have different permissions for different projects
diff --git a/app/policies/group_policy.rb b/app/policies/group_policy.rb
index 7dd88fcc1ff..53286cf1fdf 100644
--- a/app/policies/group_policy.rb
+++ b/app/policies/group_policy.rb
@@ -97,9 +97,9 @@ class GroupPolicy < BasePolicy
rule { can?(:read_group) }.policy do
enable :read_milestone
- enable :read_list
+ enable :read_issue_board_list
enable :read_label
- enable :read_board
+ enable :read_issue_board
enable :read_group_member
enable :read_custom_emoji
end
@@ -122,9 +122,9 @@ class GroupPolicy < BasePolicy
rule { reporter }.policy do
enable :reporter_access
enable :read_container_image
- enable :admin_board
+ enable :admin_issue_board
enable :admin_label
- enable :admin_list
+ enable :admin_issue_board_list
enable :admin_issue
enable :read_metrics_dashboard_annotation
enable :read_prometheus
diff --git a/app/policies/merge_request_policy.rb b/app/policies/merge_request_policy.rb
index d5ba42d750c..e3fb54172f8 100644
--- a/app/policies/merge_request_policy.rb
+++ b/app/policies/merge_request_policy.rb
@@ -9,7 +9,10 @@ class MergeRequestPolicy < IssuablePolicy
# Although :read_merge_request is computed in the policy context,
# it would not be safe to prevent :create_note there, since
# note permissions are shared, and this would apply too broadly.
- rule { ~can?(:read_merge_request) }.prevent :create_note
+ rule { ~can?(:read_merge_request) }.policy do
+ prevent :create_note
+ prevent :accept_merge_request
+ end
rule { can?(:update_merge_request) }.policy do
enable :approve_merge_request
@@ -18,6 +21,12 @@ class MergeRequestPolicy < IssuablePolicy
rule { ~anonymous & can?(:read_merge_request) }.policy do
enable :create_todo
end
+
+ condition(:can_merge) { @subject.can_be_merged_by?(@user) }
+
+ rule { can_merge }.policy do
+ enable :accept_merge_request
+ end
end
MergeRequestPolicy.prepend_if_ee('EE::MergeRequestPolicy')
diff --git a/app/policies/note_policy.rb b/app/policies/note_policy.rb
index 2bf6b6c3161..38f0f165376 100644
--- a/app/policies/note_policy.rb
+++ b/app/policies/note_policy.rb
@@ -57,6 +57,10 @@ class NotePolicy < BasePolicy
enable :resolve_note
end
+ rule { can_read_confidential }.policy do
+ enable :mark_note_as_confidential
+ end
+
rule { confidential & ~can_read_confidential }.policy do
prevent :read_note
prevent :admin_note
diff --git a/app/policies/project_policy.rb b/app/policies/project_policy.rb
index aaf985d6c63..de80f2f72b8 100644
--- a/app/policies/project_policy.rb
+++ b/app/policies/project_policy.rb
@@ -156,6 +156,7 @@ class ProjectPolicy < BasePolicy
metrics_dashboard
analytics
operations
+ security_and_compliance
]
features.each do |f|
@@ -203,8 +204,8 @@ class ProjectPolicy < BasePolicy
rule { can?(:guest_access) }.policy do
enable :read_project
enable :create_merge_request_in
- enable :read_board
- enable :read_list
+ enable :read_issue_board
+ enable :read_issue_board_list
enable :read_wiki
enable :read_issue
enable :read_label
@@ -230,7 +231,7 @@ class ProjectPolicy < BasePolicy
rule { guest & can?(:read_container_image) }.enable :build_read_container_image
rule { can?(:reporter_access) }.policy do
- enable :admin_board
+ enable :admin_issue_board
enable :download_code
enable :read_statistics
enable :download_wiki_code
@@ -239,7 +240,7 @@ class ProjectPolicy < BasePolicy
enable :reopen_issue
enable :admin_issue
enable :admin_label
- enable :admin_list
+ enable :admin_issue_board_list
enable :admin_issue_link
enable :read_commit_status
enable :read_build
@@ -318,7 +319,7 @@ class ProjectPolicy < BasePolicy
rule { can?(:developer_access) }.policy do
enable :create_package
- enable :admin_board
+ enable :admin_issue_board
enable :admin_merge_request
enable :admin_milestone
enable :update_merge_request
@@ -368,7 +369,7 @@ class ProjectPolicy < BasePolicy
rule { can?(:maintainer_access) }.policy do
enable :destroy_package
- enable :admin_board
+ enable :admin_issue_board
enable :push_to_delete_protected_branch
enable :update_snippet
enable :admin_snippet
@@ -428,8 +429,8 @@ class ProjectPolicy < BasePolicy
rule { issues_disabled }.policy do
prevent(*create_read_update_admin_destroy(:issue))
- prevent(*create_read_update_admin_destroy(:board))
- prevent(*create_read_update_admin_destroy(:list))
+ prevent(*create_read_update_admin_destroy(:issue_board))
+ prevent(*create_read_update_admin_destroy(:issue_board_list))
end
rule { merge_requests_disabled | repository_disabled }.policy do
@@ -506,8 +507,8 @@ class ProjectPolicy < BasePolicy
rule { can?(:public_access) }.policy do
enable :read_package
enable :read_project
- enable :read_board
- enable :read_list
+ enable :read_issue_board
+ enable :read_issue_board_list
enable :read_wiki
enable :read_label
enable :read_milestone
@@ -640,6 +641,10 @@ class ProjectPolicy < BasePolicy
enable :set_pipeline_variables
end
+ rule { ~security_and_compliance_disabled & can?(:developer_access) }.policy do
+ enable :access_security_and_compliance
+ end
+
private
def user_is_user?
diff --git a/app/presenters/ci/build_runner_presenter.rb b/app/presenters/ci/build_runner_presenter.rb
index dbb77143e2e..769b793ee75 100644
--- a/app/presenters/ci/build_runner_presenter.rb
+++ b/app/presenters/ci/build_runner_presenter.rb
@@ -32,6 +32,10 @@ module Ci
end.to_i
end
+ def runner_variables
+ variables.to_runner_variables
+ end
+
def refspecs
specs = []
specs << refspec_for_persistent_ref if persistent_ref_exist?
diff --git a/app/presenters/ci/pipeline_presenter.rb b/app/presenters/ci/pipeline_presenter.rb
index 0c68c33cbbe..4e955469ddf 100644
--- a/app/presenters/ci/pipeline_presenter.rb
+++ b/app/presenters/ci/pipeline_presenter.rb
@@ -61,7 +61,7 @@ module Ci
link_to_merge_request: link_to_merge_request,
link_to_merge_request_source_branch: link_to_merge_request_source_branch
}
- elsif pipeline.merge_request_pipeline?
+ elsif pipeline.merged_result_pipeline?
_("for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}")
.html_safe % {
link_to_merge_request: link_to_merge_request,
diff --git a/app/presenters/dev_ops_report/metric_presenter.rb b/app/presenters/dev_ops_report/metric_presenter.rb
index e7363293435..b31dfd25a87 100644
--- a/app/presenters/dev_ops_report/metric_presenter.rb
+++ b/app/presenters/dev_ops_report/metric_presenter.rb
@@ -2,6 +2,8 @@
module DevOpsReport
class MetricPresenter < Gitlab::View::Presenter::Simple
+ delegate :created_at, to: :subject
+
def cards
[
Card.new(
diff --git a/app/presenters/packages/composer/packages_presenter.rb b/app/presenters/packages/composer/packages_presenter.rb
index ed0e9d3b731..8e3f482126d 100644
--- a/app/presenters/packages/composer/packages_presenter.rb
+++ b/app/presenters/packages/composer/packages_presenter.rb
@@ -11,8 +11,19 @@ module Packages
end
def root
- path = api_v4_group___packages_composer_package_name_path({ id: @group.id, package_name: '%package%$%hash%', format: '.json' }, true)
- { 'packages' => [], 'provider-includes' => { 'p/%hash%.json' => { 'sha256' => provider_sha } }, 'providers-url' => path }
+ v1_path = expose_path(api_v4_group___packages_composer_package_name_path({ id: @group.id, package_name: '%package%$%hash%', format: '.json' }, true))
+ v2_path = expose_path(api_v4_group___packages_composer_p2_package_name_path({ id: @group.id, package_name: '%package%', format: '.json' }, true))
+
+ {
+ 'packages' => [],
+ 'provider-includes' => {
+ 'p/%hash%.json' => {
+ 'sha256' => provider_sha
+ }
+ },
+ 'providers-url' => v1_path,
+ 'metadata-url' => v2_path
+ }
end
def provider
diff --git a/app/presenters/project_presenter.rb b/app/presenters/project_presenter.rb
index e13ef7a3811..59a9fb64a36 100644
--- a/app/presenters/project_presenter.rb
+++ b/app/presenters/project_presenter.rb
@@ -10,10 +10,11 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated
include BlobHelper
include ChecksCollaboration
include Gitlab::Utils::StrongMemoize
+ include Gitlab::Experiment::Dsl
presents :project
- AnchorData = Struct.new(:is_link, :label, :link, :class_modifier, :icon, :itemprop)
+ AnchorData = Struct.new(:is_link, :label, :link, :class_modifier, :icon, :itemprop, :data)
MAX_TOPICS_TO_SHOW = 3
def statistic_icon(icon_name = 'plus-square-o')
@@ -33,13 +34,15 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated
def statistics_buttons(show_auto_devops_callout:)
[
+ upload_anchor_data,
readme_anchor_data,
license_anchor_data,
changelog_anchor_data,
contribution_guide_anchor_data,
autodevops_anchor_data(show_auto_devops_callout: show_auto_devops_callout),
kubernetes_cluster_anchor_data,
- gitlab_ci_anchor_data
+ gitlab_ci_anchor_data,
+ integrations_anchor_data
].compact.reject(&:is_link).sort_by.with_index { |item, idx| [item.class_modifier ? 0 : 1, idx] }
end
@@ -49,12 +52,14 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated
def empty_repo_statistics_buttons
[
+ upload_anchor_data,
new_file_anchor_data,
readme_anchor_data,
license_anchor_data,
changelog_anchor_data,
contribution_guide_anchor_data,
- gitlab_ci_anchor_data
+ gitlab_ci_anchor_data,
+ integrations_anchor_data
].compact.reject { |item| item.is_link }
end
@@ -154,6 +159,8 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated
end
def can_current_user_push_to_branch?(branch)
+ return false unless current_user
+
user_access(project).can_push_to_branch?(branch)
end
@@ -232,19 +239,47 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated
empty_repo? ? nil : project_tags_path(project))
end
+ def upload_anchor_data
+ strong_memoize(:upload_anchor_data) do
+ next unless can_current_user_push_to_default_branch?
+
+ experiment(:empty_repo_upload, project: project) do |e|
+ e.use {}
+ e.try do
+ AnchorData.new(false,
+ statistic_icon('upload') + _('Upload file'),
+ '#modal-upload-blob',
+ 'js-upload-file-experiment-trigger',
+ nil,
+ nil,
+ {
+ 'toggle' => 'modal',
+ 'target' => '#modal-upload-blob'
+ }
+ )
+ end
+ e.run
+ end
+ end
+ end
+
+ def empty_repo_upload_experiment?
+ upload_anchor_data.present?
+ end
+
def new_file_anchor_data
- if current_user && can_current_user_push_to_default_branch?
+ if can_current_user_push_to_default_branch?
new_file_path = empty_repo? ? ide_edit_path(project, default_branch_or_master) : project_new_blob_path(project, default_branch_or_master)
AnchorData.new(false,
statistic_icon + _('New file'),
new_file_path,
- 'dashed')
+ 'btn-dashed')
end
end
def readme_anchor_data
- if current_user && can_current_user_push_to_default_branch? && readme_path.nil?
+ if can_current_user_push_to_default_branch? && readme_path.nil?
AnchorData.new(false,
statistic_icon + _('Add README'),
empty_repo? ? add_readme_ide_path : add_readme_path)
@@ -252,13 +287,13 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated
AnchorData.new(false,
statistic_icon('doc-text') + _('README'),
default_view != 'readme' ? readme_path : '#readme',
- 'default',
+ 'btn-default',
'doc-text')
end
end
def changelog_anchor_data
- if current_user && can_current_user_push_to_default_branch? && repository.changelog.blank?
+ if can_current_user_push_to_default_branch? && repository.changelog.blank?
AnchorData.new(false,
statistic_icon + _('Add CHANGELOG'),
empty_repo? ? add_changelog_ide_path : add_changelog_path)
@@ -266,7 +301,7 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated
AnchorData.new(false,
statistic_icon('doc-text') + _('CHANGELOG'),
changelog_path,
- 'default')
+ 'btn-default')
end
end
@@ -277,11 +312,11 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated
AnchorData.new(false,
icon + content_tag(:span, license_short_name, class: 'project-stat-value'),
license_path,
- 'default',
+ 'btn-default',
nil,
'license')
else
- if current_user && can_current_user_push_to_default_branch?
+ if can_current_user_push_to_default_branch?
AnchorData.new(false,
content_tag(:span, statistic_icon + _('Add LICENSE'), class: 'add-license-link d-flex'),
empty_repo? ? add_license_ide_path : add_license_path)
@@ -294,7 +329,7 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated
end
def contribution_guide_anchor_data
- if current_user && can_current_user_push_to_default_branch? && repository.contribution_guide.blank?
+ if can_current_user_push_to_default_branch? && repository.contribution_guide.blank?
AnchorData.new(false,
statistic_icon + _('Add CONTRIBUTING'),
empty_repo? ? add_contribution_guide_ide_path : add_contribution_guide_path)
@@ -302,7 +337,7 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated
AnchorData.new(false,
statistic_icon('doc-text') + _('CONTRIBUTING'),
contribution_guide_path,
- 'default')
+ 'btn-default')
end
end
@@ -312,7 +347,7 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated
AnchorData.new(false,
statistic_icon('settings') + _('Auto DevOps enabled'),
project_settings_ci_cd_path(project, anchor: 'autodevops-settings'),
- 'default')
+ 'btn-default')
else
AnchorData.new(false,
statistic_icon + _('Enable Auto DevOps'),
@@ -337,7 +372,7 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated
AnchorData.new(false,
_('Kubernetes'),
cluster_link,
- 'default')
+ 'btn-default')
end
end
end
@@ -351,7 +386,7 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated
AnchorData.new(false,
statistic_icon('doc-text') + _('CI/CD configuration'),
ci_configuration_path,
- 'default')
+ 'btn-default')
end
end
@@ -389,6 +424,25 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated
private
+ def integrations_anchor_data
+ experiment(:repo_integrations_link, project: project) do |e|
+ e.exclude! unless can?(current_user, :admin_project, project)
+
+ e.use {} # nil control
+ e.try do
+ label = statistic_icon('settings') + _('Configure Integrations')
+ AnchorData.new(false, label, project_settings_integrations_path(project), nil, nil, nil, {
+ 'track-event': 'click',
+ 'track-experiment': e.name
+ })
+ end
+
+ e.run # call run so the return value will be the AnchorData (or nil)
+
+ e.track(:view, value: project.id) # track an event for the view, with project id
+ end
+ end
+
def cicd_missing?
current_user && can_current_user_push_code? && repository.gitlab_ci_yml.blank? && !auto_devops_enabled?
end
diff --git a/app/serializers/base_discussion_entity.rb b/app/serializers/base_discussion_entity.rb
index 8d4c3906847..7d3b9651b8b 100644
--- a/app/serializers/base_discussion_entity.rb
+++ b/app/serializers/base_discussion_entity.rb
@@ -40,7 +40,7 @@ class BaseDiscussionEntity < Grape::Entity
end
expose :resolve_with_issue_path do |discussion|
- new_project_issue_path(discussion.project, merge_request_to_resolve_discussions_of: discussion.noteable.iid, discussion_to_resolve: discussion.id)
+ new_project_issue_path(discussion.project, merge_request_to_resolve_discussions_of: discussion.noteable.iid, discussion_to_resolve: discussion.id) if discussion&.project&.issues_enabled?
end
end
diff --git a/app/serializers/build_details_entity.rb b/app/serializers/build_details_entity.rb
index ea72b2b89e7..01a8a4ebea9 100644
--- a/app/serializers/build_details_entity.rb
+++ b/app/serializers/build_details_entity.rb
@@ -99,7 +99,7 @@ class BuildDetailsEntity < JobEntity
end
expose :available do |build|
- project.any_runners?
+ project.any_active_runners?
end
expose :settings_path, if: -> (*) { can_admin_build? } do |build|
diff --git a/app/serializers/ci/pipeline_entity.rb b/app/serializers/ci/pipeline_entity.rb
index 86f93929a5d..743643a978f 100644
--- a/app/serializers/ci/pipeline_entity.rb
+++ b/app/serializers/ci/pipeline_entity.rb
@@ -31,7 +31,7 @@ class Ci::PipelineEntity < Grape::Entity
expose :can_cancel?, as: :cancelable
expose :failure_reason?, as: :failure_reason
expose :detached_merge_request_pipeline?, as: :detached_merge_request_pipeline
- expose :merge_request_pipeline?, as: :merge_request_pipeline
+ expose :merged_result_pipeline?, as: :merge_request_pipeline
end
expose :details do
@@ -64,8 +64,8 @@ class Ci::PipelineEntity < Grape::Entity
expose :commit, using: CommitEntity
expose :merge_request_event_type, if: -> (pipeline, _) { pipeline.merge_request? }
- expose :source_sha, if: -> (pipeline, _) { pipeline.merge_request_pipeline? }
- expose :target_sha, if: -> (pipeline, _) { pipeline.merge_request_pipeline? }
+ expose :source_sha, if: -> (pipeline, _) { pipeline.merged_result_pipeline? }
+ expose :target_sha, if: -> (pipeline, _) { pipeline.merged_result_pipeline? }
expose :yaml_errors, if: -> (pipeline, _) { pipeline.has_yaml_errors? }
expose :failure_reason, if: -> (pipeline, _) { pipeline.failure_reason? }
diff --git a/app/serializers/current_board_entity.rb b/app/serializers/current_board_entity.rb
index f9d6691dc84..08f31bc698f 100644
--- a/app/serializers/current_board_entity.rb
+++ b/app/serializers/current_board_entity.rb
@@ -3,6 +3,8 @@
class CurrentBoardEntity < Grape::Entity
expose :id
expose :name
+ expose :hide_backlog_list
+ expose :hide_closed_list
end
CurrentBoardEntity.prepend_if_ee('EE::CurrentBoardEntity')
diff --git a/app/serializers/merge_request_user_entity.rb b/app/serializers/merge_request_user_entity.rb
index edb7e10bac5..a36c4da3e83 100644
--- a/app/serializers/merge_request_user_entity.rb
+++ b/app/serializers/merge_request_user_entity.rb
@@ -4,6 +4,10 @@ class MergeRequestUserEntity < ::API::Entities::UserBasic
include UserStatusTooltip
include RequestAwareEntity
+ def self.satisfies(*methods)
+ ->(_, options) { methods.all? { |m| options[:merge_request].try(m) } }
+ end
+
expose :can_merge do |reviewer, options|
options[:merge_request]&.can_be_merged_by?(reviewer)
end
@@ -12,11 +16,17 @@ class MergeRequestUserEntity < ::API::Entities::UserBasic
request.current_user&.can?(:update_merge_request, options[:merge_request])
end
- expose :reviewed, if: -> (_, options) { options[:merge_request] && options[:merge_request].allows_reviewers? } do |reviewer, options|
+ expose :reviewed, if: satisfies(:present?, :allows_reviewers?) do |reviewer, options|
reviewer = options[:merge_request].find_reviewer(reviewer)
reviewer&.reviewed?
end
+
+ expose :approved, if: satisfies(:present?) do |user, options|
+ # This approach is preferred over MergeRequest#approved_by? since this
+ # makes one query per merge request, whereas #approved_by? makes one per user
+ options[:merge_request].approvals.any? { |app| app.user_id == user.id }
+ end
end
MergeRequestUserEntity.prepend_if_ee('EE::MergeRequestUserEntity')
diff --git a/app/serializers/merge_request_widget_entity.rb b/app/serializers/merge_request_widget_entity.rb
index 560dd2ea08b..3ed7d9d8914 100644
--- a/app/serializers/merge_request_widget_entity.rb
+++ b/app/serializers/merge_request_widget_entity.rb
@@ -157,7 +157,7 @@ class MergeRequestWidgetEntity < Grape::Entity
end
def use_merge_base_with_merged_results?
- object.actual_head_pipeline&.merge_request_event_type == :merged_result
+ object.actual_head_pipeline&.merged_result_pipeline?
end
def head_pipeline_downloadable_path_for_report_type(file_type)
diff --git a/app/serializers/merge_requests/pipeline_entity.rb b/app/serializers/merge_requests/pipeline_entity.rb
index 8b684d4641b..c7caad0e62b 100644
--- a/app/serializers/merge_requests/pipeline_entity.rb
+++ b/app/serializers/merge_requests/pipeline_entity.rb
@@ -11,7 +11,7 @@ class MergeRequests::PipelineEntity < Grape::Entity
end
expose :flags do
- expose :merge_request_pipeline?, as: :merge_request_pipeline
+ expose :merged_result_pipeline?, as: :merge_request_pipeline
end
expose :commit, using: CommitEntity
diff --git a/app/serializers/pipeline_serializer.rb b/app/serializers/pipeline_serializer.rb
index ab2c6dfeace..85887e64a8b 100644
--- a/app/serializers/pipeline_serializer.rb
+++ b/app/serializers/pipeline_serializer.rb
@@ -42,15 +42,14 @@ class PipelineSerializer < BaseSerializer
[
:cancelable_statuses,
:latest_statuses_ordered_by_stage,
- :latest_builds_report_results,
- :manual_actions,
:retryable_builds,
- :scheduled_actions,
:stages,
:latest_statuses,
:trigger_requests,
:user,
{
+ manual_actions: :metadata,
+ scheduled_actions: :metadata,
downloadable_artifacts: {
project: [:route, { namespace: :route }],
job: []
diff --git a/app/serializers/test_suite_comparer_entity.rb b/app/serializers/test_suite_comparer_entity.rb
index aab805f9598..cfa728c01be 100644
--- a/app/serializers/test_suite_comparer_entity.rb
+++ b/app/serializers/test_suite_comparer_entity.rb
@@ -34,4 +34,16 @@ class TestSuiteComparerEntity < Grape::Entity
expose :resolved_errors, using: TestCaseEntity do |suite|
suite.limited_tests.resolved_errors
end
+
+ expose :suite_errors do |suite|
+ head_suite_error = suite.head_suite.suite_error
+ base_suite_error = suite.base_suite.suite_error
+
+ next unless head_suite_error.present? || base_suite_error.present?
+
+ {
+ head: head_suite_error,
+ base: base_suite_error
+ }
+ end
end
diff --git a/app/services/alert_management/create_alert_issue_service.rb b/app/services/alert_management/create_alert_issue_service.rb
index 58c7402c6c1..a81c2380dad 100644
--- a/app/services/alert_management/create_alert_issue_service.rb
+++ b/app/services/alert_management/create_alert_issue_service.rb
@@ -4,6 +4,9 @@ module AlertManagement
class CreateAlertIssueService
include Gitlab::Utils::StrongMemoize
+ DEFAULT_ALERT_TITLE = ::Gitlab::AlertManagement::Payload::Generic::DEFAULT_TITLE
+ DEFAULT_INCIDENT_TITLE = 'New: Incident'
+
# @param alert [AlertManagement::Alert]
# @param user [User]
def initialize(alert, user)
@@ -21,6 +24,8 @@ module AlertManagement
issue = result.payload[:issue]
return error(object_errors(alert), issue) unless associate_alert_with_issue(issue)
+ update_title_for(issue)
+
SystemNoteService.new_alert_issue(alert, issue, user)
result
@@ -50,6 +55,12 @@ module AlertManagement
alert.update(issue_id: issue.id)
end
+ def update_title_for(issue)
+ return unless issue.title == DEFAULT_ALERT_TITLE
+
+ issue.update!(title: "#{DEFAULT_INCIDENT_TITLE} #{issue.iid}")
+ end
+
def error(message, issue = nil)
ServiceResponse.error(payload: { issue: issue }, message: message)
end
diff --git a/app/services/authorized_project_update/periodic_recalculate_service.rb b/app/services/authorized_project_update/periodic_recalculate_service.rb
index 91c0f50e5e0..662d10c648b 100644
--- a/app/services/authorized_project_update/periodic_recalculate_service.rb
+++ b/app/services/authorized_project_update/periodic_recalculate_service.rb
@@ -2,8 +2,8 @@
module AuthorizedProjectUpdate
class PeriodicRecalculateService
- BATCH_SIZE = 480
- DELAY_INTERVAL = 30.seconds.to_i
+ BATCH_SIZE = 450
+ DELAY_INTERVAL = 50.seconds.to_i
def execute
# Using this approach (instead of eg. User.each_batch) keeps the arguments
diff --git a/app/services/boards/base_item_move_service.rb b/app/services/boards/base_item_move_service.rb
new file mode 100644
index 00000000000..bf3e29df54b
--- /dev/null
+++ b/app/services/boards/base_item_move_service.rb
@@ -0,0 +1,72 @@
+# frozen_string_literal: true
+
+module Boards
+ class BaseItemMoveService < Boards::BaseService
+ def execute(issuable)
+ issuable_modification_params = issuable_params(issuable)
+ return false if issuable_modification_params.empty?
+
+ move_single_issuable(issuable, issuable_modification_params)
+ end
+
+ private
+
+ def issuable_params(issuable)
+ attrs = {}
+
+ if move_between_lists?
+ attrs.merge!(
+ add_label_ids: add_label_ids,
+ remove_label_ids: remove_label_ids,
+ state_event: issuable_state
+ )
+ end
+
+ attrs
+ end
+
+ def move_single_issuable(issuable, issuable_modification_params)
+ ability_name = :"admin_#{issuable.to_ability_name}"
+ return unless can?(current_user, ability_name, issuable)
+
+ update(issuable, issuable_modification_params)
+ end
+
+ def move_between_lists?
+ moving_from_list.present? && moving_to_list.present? &&
+ moving_from_list != moving_to_list
+ end
+
+ def moving_from_list
+ return unless params[:from_list_id].present?
+
+ @moving_from_list ||= board.lists.id_in(params[:from_list_id]).first
+ end
+
+ def moving_to_list
+ return unless params[:to_list_id].present?
+
+ @moving_to_list ||= board.lists.id_in(params[:to_list_id]).first
+ end
+
+ def issuable_state
+ return 'reopen' if moving_from_list.closed?
+ return 'close' if moving_to_list.closed?
+ end
+
+ def add_label_ids
+ [moving_to_list.label_id].compact
+ end
+
+ def remove_label_ids
+ label_ids =
+ if moving_to_list.movable?
+ moving_from_list.label_id
+ else
+ ::Label.ids_on_board(board.id)
+ end
+
+ Array(label_ids).compact
+ end
+ end
+end
diff --git a/app/services/boards/base_items_list_service.rb b/app/services/boards/base_items_list_service.rb
index 851120ef597..5aebf216460 100644
--- a/app/services/boards/base_items_list_service.rb
+++ b/app/services/boards/base_items_list_service.rb
@@ -11,8 +11,24 @@ module Boards
ordered_items
end
+ # rubocop: disable CodeReuse/ActiveRecord
+ def metadata
+ issuables = item_model.arel_table
+ keys = metadata_fields.keys
+ # TODO: eliminate need for SQL literal fragment
+ columns = Arel.sql(metadata_fields.values_at(*keys).join(', '))
+ results = item_model.where(id: items.select(issuables[:id])).pluck(columns)
+
+ Hash[keys.zip(results.flatten)]
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
private
+ def metadata_fields
+ { size: 'COUNT(*)' }
+ end
+
def ordered_items
raise NotImplementedError
end
diff --git a/app/services/boards/issues/list_service.rb b/app/services/boards/issues/list_service.rb
index 27d59e052c7..c6855f29af0 100644
--- a/app/services/boards/issues/list_service.rb
+++ b/app/services/boards/issues/list_service.rb
@@ -9,18 +9,6 @@ module Boards
IssuesFinder.valid_params
end
- # rubocop: disable CodeReuse/ActiveRecord
- def metadata
- issues = Issue.arel_table
- keys = metadata_fields.keys
- # TODO: eliminate need for SQL literal fragment
- columns = Arel.sql(metadata_fields.values_at(*keys).join(', '))
- results = Issue.where(id: items.select(issues[:id])).pluck(columns)
-
- Hash[keys.zip(results.flatten)]
- end
- # rubocop: enable CodeReuse/ActiveRecord
-
private
def ordered_items
@@ -35,10 +23,6 @@ module Boards
@board ||= parent.boards.find(params[:board_id])
end
- def metadata_fields
- { size: 'COUNT(*)' }
- end
-
def filter_params
set_scope
set_non_archived
diff --git a/app/services/boards/issues/move_service.rb b/app/services/boards/issues/move_service.rb
index 56a7e228b10..99374fa01ae 100644
--- a/app/services/boards/issues/move_service.rb
+++ b/app/services/boards/issues/move_service.rb
@@ -2,13 +2,8 @@
module Boards
module Issues
- class MoveService < Boards::BaseService
- def execute(issue)
- issue_modification_params = issue_params(issue)
- return false if issue_modification_params.empty?
-
- move_single_issue(issue, issue_modification_params)
- end
+ class MoveService < Boards::BaseItemMoveService
+ extend ::Gitlab::Utils::Override
def execute_multiple(issues)
return execute_multiple_empty_result if issues.empty?
@@ -16,7 +11,7 @@ module Boards
handled_issues = []
last_inserted_issue_id = nil
count = issues.each.inject(0) do |moved_count, issue|
- issue_modification_params = issue_params(issue)
+ issue_modification_params = issuable_params(issue)
next moved_count if issue_modification_params.empty?
if last_inserted_issue_id
@@ -24,7 +19,7 @@ module Boards
end
last_inserted_issue_id = issue.id
- handled_issue = move_single_issue(issue, issue_modification_params)
+ handled_issue = move_single_issuable(issue, issue_modification_params)
handled_issues << present_issue_entity(handled_issue) if handled_issue
handled_issue && handled_issue.valid? ? moved_count + 1 : moved_count
end
@@ -54,51 +49,17 @@ module Boards
move_between_ids({ move_after_id: nil, move_before_id: id })
end
- def move_single_issue(issue, issue_modification_params)
- return unless can?(current_user, :update_issue, issue)
-
- update(issue, issue_modification_params)
- end
-
def board
@board ||= parent.boards.find(params[:board_id])
end
- def move_between_lists?
- moving_from_list.present? && moving_to_list.present? &&
- moving_from_list != moving_to_list
- end
-
- # rubocop: disable CodeReuse/ActiveRecord
- def moving_from_list
- return unless params[:from_list_id].present?
-
- @moving_from_list ||= board.lists.find_by(id: params[:from_list_id])
- end
- # rubocop: enable CodeReuse/ActiveRecord
-
- # rubocop: disable CodeReuse/ActiveRecord
- def moving_to_list
- return unless params[:to_list_id].present?
-
- @moving_to_list ||= board.lists.find_by(id: params[:to_list_id])
- end
- # rubocop: enable CodeReuse/ActiveRecord
-
def update(issue, issue_modification_params)
::Issues::UpdateService.new(issue.project, current_user, issue_modification_params).execute(issue)
end
- def issue_params(issue)
- attrs = {}
-
- if move_between_lists?
- attrs.merge!(
- add_label_ids: add_label_ids,
- remove_label_ids: remove_label_ids,
- state_event: issue_state
- )
- end
+ override :issuable_params
+ def issuable_params(issuable)
+ attrs = super
move_between_ids = move_between_ids(params)
if move_between_ids
@@ -109,28 +70,6 @@ module Boards
attrs
end
- def issue_state
- return 'reopen' if moving_from_list.closed?
- return 'close' if moving_to_list.closed?
- end
-
- def add_label_ids
- [moving_to_list.label_id].compact
- end
-
- # rubocop: disable CodeReuse/ActiveRecord
- def remove_label_ids
- label_ids =
- if moving_to_list.movable?
- moving_from_list.label_id
- else
- ::Label.on_board(board.id).pluck(:label_id)
- end
-
- Array(label_ids).compact
- end
- # rubocop: enable CodeReuse/ActiveRecord
-
def move_between_ids(move_params)
ids = [move_params[:move_after_id], move_params[:move_before_id]]
.map(&:to_i)
diff --git a/app/services/boards/list_service.rb b/app/services/boards/list_service.rb
deleted file mode 100644
index 80ceb91f56d..00000000000
--- a/app/services/boards/list_service.rb
+++ /dev/null
@@ -1,32 +0,0 @@
-# frozen_string_literal: true
-
-module Boards
- class ListService < Boards::BaseService
- def execute
- find_boards
- end
-
- private
-
- def boards
- parent.boards.order_by_name_asc
- end
-
- def first_board
- parent.boards.first_board
- end
-
- def find_boards
- found =
- if parent.multiple_issue_boards_available?
- boards
- else
- # When multiple issue boards are not available
- # a user is only allowed to view the default shown board
- first_board
- end
-
- params[:board_id].present? ? [found.find(params[:board_id])] : found
- end
- end
-end
diff --git a/app/services/boards/lists/list_service.rb b/app/services/boards/lists/list_service.rb
index e4c789c4597..3c296cde51e 100644
--- a/app/services/boards/lists/list_service.rb
+++ b/app/services/boards/lists/list_service.rb
@@ -9,7 +9,26 @@ module Boards
end
lists = board.lists.preload_associated_models
- params[:list_id].present? ? lists.where(id: params[:list_id]) : lists # rubocop: disable CodeReuse/ActiveRecord
+
+ return lists.id_in(params[:list_id]) if params[:list_id].present?
+
+ list_types = unavailable_list_types_for(board)
+ lists.without_types(list_types)
+ end
+
+ private
+
+ def unavailable_list_types_for(board)
+ hidden_lists_for(board)
+ end
+
+ def hidden_lists_for(board)
+ hidden = []
+
+ hidden << ::List.list_types[:backlog] if board.hide_backlog_list
+ hidden << ::List.list_types[:closed] if board.hide_closed_list
+
+ hidden
end
end
end
diff --git a/app/services/boards/lists/update_service.rb b/app/services/boards/lists/update_service.rb
index 4a463372c82..e2d9c371ca2 100644
--- a/app/services/boards/lists/update_service.rb
+++ b/app/services/boards/lists/update_service.rb
@@ -47,11 +47,11 @@ module Boards
end
def can_read?(list)
- Ability.allowed?(current_user, :read_list, parent)
+ Ability.allowed?(current_user, :read_issue_board_list, parent)
end
def can_admin?(list)
- Ability.allowed?(current_user, :admin_list, parent)
+ Ability.allowed?(current_user, :admin_issue_board_list, parent)
end
end
end
diff --git a/app/services/boards/update_service.rb b/app/services/boards/update_service.rb
index 0340836fd78..48c6e44d55e 100644
--- a/app/services/boards/update_service.rb
+++ b/app/services/boards/update_service.rb
@@ -2,9 +2,20 @@
module Boards
class UpdateService < Boards::BaseService
+ PERMITTED_PARAMS = %i(name hide_backlog_list hide_closed_list).freeze
+
def execute(board)
+ filter_params
board.update(params)
end
+
+ def filter_params
+ params.slice!(*permitted_params)
+ end
+
+ def permitted_params
+ PERMITTED_PARAMS
+ end
end
end
diff --git a/app/services/bulk_import_service.rb b/app/services/bulk_import_service.rb
index 29439a79afe..4e13e967dbd 100644
--- a/app/services/bulk_import_service.rb
+++ b/app/services/bulk_import_service.rb
@@ -39,7 +39,12 @@ class BulkImportService
BulkImportWorker.perform_async(bulk_import.id)
- bulk_import
+ ServiceResponse.success(payload: bulk_import)
+ rescue ActiveRecord::RecordInvalid => e
+ ServiceResponse.error(
+ message: e.message,
+ http_status: :unprocessable_entity
+ )
end
private
diff --git a/app/services/ci/create_downstream_pipeline_service.rb b/app/services/ci/create_downstream_pipeline_service.rb
index 629d85b041f..93f0338fcba 100644
--- a/app/services/ci/create_downstream_pipeline_service.rb
+++ b/app/services/ci/create_downstream_pipeline_service.rb
@@ -43,7 +43,7 @@ module Ci
private
def update_bridge_status!(bridge, pipeline)
- Gitlab::OptimisticLocking.retry_lock(bridge) do |subject|
+ Gitlab::OptimisticLocking.retry_lock(bridge, name: 'create_downstream_pipeline_update_bridge_status') do |subject|
if pipeline.created_successfully?
# If bridge uses `strategy:depend` we leave it running
# and update the status when the downstream pipeline completes.
diff --git a/app/services/ci/create_pipeline_service.rb b/app/services/ci/create_pipeline_service.rb
index dc42411dfa1..0fd47e625fd 100644
--- a/app/services/ci/create_pipeline_service.rb
+++ b/app/services/ci/create_pipeline_service.rb
@@ -122,7 +122,9 @@ module Ci
end
def record_conversion_event
- Experiments::RecordConversionEventWorker.perform_async(:ci_syntax_templates, current_user.id)
+ return unless project.namespace.recent?
+
+ Experiments::RecordConversionEventWorker.perform_async(:ci_syntax_templates_b, current_user.id)
end
def create_namespace_onboarding_action
diff --git a/app/services/ci/expire_pipeline_cache_service.rb b/app/services/ci/expire_pipeline_cache_service.rb
index 8343e0f8cd0..2ae60907dab 100644
--- a/app/services/ci/expire_pipeline_cache_service.rb
+++ b/app/services/ci/expire_pipeline_cache_service.rb
@@ -2,6 +2,11 @@
module Ci
class ExpirePipelineCacheService
+ class UrlHelpers
+ include ::Gitlab::Routing
+ include ::GitlabRoutingHelper
+ end
+
def execute(pipeline, delete: false)
store = Gitlab::EtagCaching::Store.new
@@ -17,27 +22,27 @@ module Ci
private
def project_pipelines_path(project)
- Gitlab::Routing.url_helpers.project_pipelines_path(project, format: :json)
+ url_helpers.project_pipelines_path(project, format: :json)
end
def project_pipeline_path(project, pipeline)
- Gitlab::Routing.url_helpers.project_pipeline_path(project, pipeline, format: :json)
+ url_helpers.project_pipeline_path(project, pipeline, format: :json)
end
def commit_pipelines_path(project, commit)
- Gitlab::Routing.url_helpers.pipelines_project_commit_path(project, commit.id, format: :json)
+ url_helpers.pipelines_project_commit_path(project, commit.id, format: :json)
end
def new_merge_request_pipelines_path(project)
- Gitlab::Routing.url_helpers.project_new_merge_request_path(project, format: :json)
+ url_helpers.project_new_merge_request_path(project, format: :json)
end
def pipelines_project_merge_request_path(merge_request)
- Gitlab::Routing.url_helpers.pipelines_project_merge_request_path(merge_request.target_project, merge_request, format: :json)
+ url_helpers.pipelines_project_merge_request_path(merge_request.target_project, merge_request, format: :json)
end
def merge_request_widget_path(merge_request)
- Gitlab::Routing.url_helpers.cached_widget_project_json_merge_request_path(merge_request.project, merge_request, format: :json)
+ url_helpers.cached_widget_project_json_merge_request_path(merge_request.project, merge_request, format: :json)
end
def each_pipelines_merge_request_path(pipeline)
@@ -47,6 +52,10 @@ module Ci
end
end
+ def graphql_pipeline_path(pipeline)
+ url_helpers.graphql_etag_pipeline_path(pipeline)
+ end
+
# Updates ETag caches of a pipeline.
#
# This logic resides in a separate method so that EE can more easily extend
@@ -58,14 +67,20 @@ module Ci
project = pipeline.project
store.touch(project_pipelines_path(project))
- store.touch(project_pipeline_path(project, pipeline))
store.touch(commit_pipelines_path(project, pipeline.commit)) unless pipeline.commit.nil?
store.touch(new_merge_request_pipelines_path(project))
each_pipelines_merge_request_path(pipeline) do |path|
store.touch(path)
end
+
+ pipeline.self_with_ancestors_and_descendants.each do |relative_pipeline|
+ store.touch(project_pipeline_path(relative_pipeline.project, relative_pipeline))
+ store.touch(graphql_pipeline_path(relative_pipeline))
+ end
+ end
+
+ def url_helpers
+ @url_helpers ||= UrlHelpers.new
end
end
end
-
-Ci::ExpirePipelineCacheService.prepend_if_ee('EE::Ci::ExpirePipelineCacheService')
diff --git a/app/services/ci/pipeline_processing/atomic_processing_service.rb b/app/services/ci/pipeline_processing/atomic_processing_service.rb
index a23d5d8941a..236d660d829 100644
--- a/app/services/ci/pipeline_processing/atomic_processing_service.rb
+++ b/app/services/ci/pipeline_processing/atomic_processing_service.rb
@@ -53,7 +53,7 @@ module Ci
end
def update_processables!(ids)
- created_processables = pipeline.processables.for_ids(ids)
+ created_processables = pipeline.processables.id_in(ids)
.with_project_preload
.created
.latest
@@ -80,7 +80,7 @@ module Ci
return unless Ci::HasStatus::COMPLETED_STATUSES.include?(status)
# transition status if possible
- Gitlab::OptimisticLocking.retry_lock(processable) do |subject|
+ Gitlab::OptimisticLocking.retry_lock(processable, name: 'atomic_processing_update_processable') do |subject|
Ci::ProcessBuildService.new(project, subject.user)
.execute(subject, status)
diff --git a/app/services/ci/pipeline_processing/atomic_processing_service/status_collection.rb b/app/services/ci/pipeline_processing/atomic_processing_service/status_collection.rb
index aeabbb99468..35818e2cf3d 100644
--- a/app/services/ci/pipeline_processing/atomic_processing_service/status_collection.rb
+++ b/app/services/ci/pipeline_processing/atomic_processing_service/status_collection.rb
@@ -78,7 +78,7 @@ module Ci
def status_for_array(statuses, dag:)
result = Gitlab::Ci::Status::Composite
- .new(statuses, dag: dag)
+ .new(statuses, dag: dag, project: pipeline.project)
.status
result || 'success'
end
diff --git a/app/services/ci/process_pipeline_service.rb b/app/services/ci/process_pipeline_service.rb
index 678b386fbbf..970652b4da3 100644
--- a/app/services/ci/process_pipeline_service.rb
+++ b/app/services/ci/process_pipeline_service.rb
@@ -30,6 +30,8 @@ module Ci
# this updates only when there are data that needs to be updated, there are two groups with no retried flag
# rubocop: disable CodeReuse/ActiveRecord
def update_retried
+ return if Feature.enabled?(:ci_remove_update_retried_from_process_pipeline, pipeline.project, default_enabled: :yaml)
+
# find the latest builds for each name
latest_statuses = pipeline.latest_statuses
.group(:name)
diff --git a/app/services/ci/register_job_service.rb b/app/services/ci/register_job_service.rb
index 59691fe4ef3..ed9e44d60f1 100644
--- a/app/services/ci/register_job_service.rb
+++ b/app/services/ci/register_job_service.rb
@@ -4,21 +4,85 @@ module Ci
# This class responsible for assigning
# proper pending build to runner on runner API request
class RegisterJobService
- attr_reader :runner
+ attr_reader :runner, :metrics
- JOB_QUEUE_DURATION_SECONDS_BUCKETS = [1, 3, 10, 30, 60, 300, 900, 1800, 3600].freeze
- JOBS_RUNNING_FOR_PROJECT_MAX_BUCKET = 5.freeze
- METRICS_SHARD_TAG_PREFIX = 'metrics_shard::'
- DEFAULT_METRICS_SHARD = 'default'
+ TEMPORARY_LOCK_TIMEOUT = 3.seconds
Result = Struct.new(:build, :build_json, :valid?)
+ MAX_QUEUE_DEPTH = 50
+
def initialize(runner)
@runner = runner
+ @metrics = ::Gitlab::Ci::Queue::Metrics.new(runner)
end
- # rubocop: disable CodeReuse/ActiveRecord
def execute(params = {})
+ @metrics.increment_queue_operation(:queue_attempt)
+
+ @metrics.observe_queue_time do
+ process_queue(params)
+ end
+ end
+
+ private
+
+ def process_queue(params)
+ valid = true
+ depth = 0
+
+ each_build(params) do |build|
+ depth += 1
+ @metrics.increment_queue_operation(:queue_iteration)
+
+ if depth > max_queue_depth
+ @metrics.increment_queue_operation(:queue_depth_limit)
+
+ valid = false
+
+ break
+ end
+
+ # We read builds from replicas
+ # It is likely that some other concurrent connection is processing
+ # a given build at a given moment. To avoid an expensive compute
+ # we perform an exclusive lease on Redis to acquire a build temporarily
+ unless acquire_temporary_lock(build.id)
+ @metrics.increment_queue_operation(:build_temporary_locked)
+
+ # We failed to acquire lock
+ # - our queue is not complete as some resources are locked temporarily
+ # - we need to re-process it again to ensure that all builds are handled
+ valid = false
+
+ next
+ end
+
+ result = process_build(build, params)
+ next unless result
+
+ if result.valid?
+ @metrics.register_success(result.build)
+ @metrics.observe_queue_depth(:found, depth)
+
+ return result # rubocop:disable Cop/AvoidReturnFromBlocks
+ else
+ # The usage of valid: is described in
+ # handling of ActiveRecord::StaleObjectError
+ valid = false
+ end
+ end
+
+ @metrics.increment_queue_operation(:queue_conflict) unless valid
+ @metrics.observe_queue_depth(:conflict, depth) unless valid
+ @metrics.observe_queue_depth(:not_found, depth) if valid
+ @metrics.register_failure
+
+ Result.new(nil, nil, valid)
+ end
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def each_build(params, &blk)
builds =
if runner.instance_type?
builds_for_shared_runner
@@ -28,8 +92,6 @@ module Ci
builds_for_project_runner
end
- valid = true
-
# pick builds that does not have other tags than runner's one
builds = builds.matches_tag_ids(runner.tags.ids)
@@ -43,37 +105,42 @@ module Ci
builds = builds.queued_before(params[:job_age].seconds.ago)
end
- builds.each do |build|
- result = process_build(build, params)
- next unless result
+ if Feature.enabled?(:ci_register_job_service_one_by_one, runner)
+ build_ids = builds.pluck(:id)
- if result.valid?
- register_success(result.build)
+ @metrics.observe_queue_size(-> { build_ids.size })
- return result
- else
- # The usage of valid: is described in
- # handling of ActiveRecord::StaleObjectError
- valid = false
+ build_ids.each do |build_id|
+ yield Ci::Build.find(build_id)
end
- end
+ else
+ @metrics.observe_queue_size(-> { builds.to_a.size })
- register_failure
- Result.new(nil, nil, valid)
+ builds.each(&blk)
+ end
end
# rubocop: enable CodeReuse/ActiveRecord
- private
-
def process_build(build, params)
- return unless runner.can_pick?(build)
+ unless build.pending?
+ @metrics.increment_queue_operation(:build_not_pending)
+ return
+ end
+
+ if runner.can_pick?(build)
+ @metrics.increment_queue_operation(:build_can_pick)
+ else
+ @metrics.increment_queue_operation(:build_not_pick)
+
+ return
+ end
# In case when 2 runners try to assign the same build, second runner will be declined
# with StateMachines::InvalidTransition or StaleObjectError when doing run! or save method.
if assign_runner!(build, params)
present_build!(build)
end
- rescue StateMachines::InvalidTransition, ActiveRecord::StaleObjectError
+ rescue ActiveRecord::StaleObjectError
# We are looping to find another build that is not conflicting
# It also indicates that this build can be picked and passed to runner.
# If we don't do it, basically a bunch of runners would be competing for a build
@@ -83,8 +150,16 @@ module Ci
# In case we hit the concurrency-access lock,
# we still have to return 409 in the end,
# to make sure that this is properly handled by runner.
+ @metrics.increment_queue_operation(:build_conflict_lock)
+
+ Result.new(nil, nil, false)
+ rescue StateMachines::InvalidTransition
+ @metrics.increment_queue_operation(:build_conflict_transition)
+
Result.new(nil, nil, false)
rescue => ex
+ @metrics.increment_queue_operation(:build_conflict_exception)
+
# If an error (e.g. GRPC::DeadlineExceeded) occurred constructing
# the result, consider this as a failure to be retried.
scheduler_failure!(build)
@@ -94,6 +169,16 @@ module Ci
nil
end
+ def max_queue_depth
+ @max_queue_depth ||= begin
+ if Feature.enabled?(:gitlab_ci_builds_queue_limit, runner, default_enabled: false)
+ MAX_QUEUE_DEPTH
+ else
+ ::Gitlab::Database::MAX_INT_VALUE
+ end
+ end
+ end
+
# Force variables evaluation to occur now
def present_build!(build)
# We need to use the presenter here because Gitaly calls in the presenter
@@ -110,16 +195,30 @@ module Ci
failure_reason, _ = pre_assign_runner_checks.find { |_, check| check.call(build, params) }
if failure_reason
+ @metrics.increment_queue_operation(:runner_pre_assign_checks_failed)
+
build.drop!(failure_reason)
else
+ @metrics.increment_queue_operation(:runner_pre_assign_checks_success)
+
build.run!
end
!failure_reason
end
+ def acquire_temporary_lock(build_id)
+ return true unless Feature.enabled?(:ci_register_job_temporary_lock, runner)
+
+ key = "build/register/#{build_id}"
+
+ Gitlab::ExclusiveLease
+ .new(key, timeout: TEMPORARY_LOCK_TIMEOUT.to_i)
+ .try_obtain
+ end
+
def scheduler_failure!(build)
- Gitlab::OptimisticLocking.retry_lock(build, 3) do |subject|
+ Gitlab::OptimisticLocking.retry_lock(build, 3, name: 'register_job_scheduler_failure') do |subject|
subject.drop!(:scheduler_failure)
end
rescue => ex
@@ -189,48 +288,6 @@ module Ci
builds
end
- def register_failure
- failed_attempt_counter.increment
- attempt_counter.increment
- end
-
- def register_success(job)
- labels = { shared_runner: runner.instance_type?,
- jobs_running_for_project: jobs_running_for_project(job),
- shard: DEFAULT_METRICS_SHARD }
-
- if runner.instance_type?
- shard = runner.tag_list.sort.find { |name| name.starts_with?(METRICS_SHARD_TAG_PREFIX) }
- labels[:shard] = shard.gsub(METRICS_SHARD_TAG_PREFIX, '') if shard
- end
-
- job_queue_duration_seconds.observe(labels, Time.current - job.queued_at) unless job.queued_at.nil?
- attempt_counter.increment
- end
-
- # rubocop: disable CodeReuse/ActiveRecord
- def jobs_running_for_project(job)
- return '+Inf' unless runner.instance_type?
-
- # excluding currently started job
- running_jobs_count = job.project.builds.running.where(runner: Ci::Runner.instance_type)
- .limit(JOBS_RUNNING_FOR_PROJECT_MAX_BUCKET + 1).count - 1
- running_jobs_count < JOBS_RUNNING_FOR_PROJECT_MAX_BUCKET ? running_jobs_count : "#{JOBS_RUNNING_FOR_PROJECT_MAX_BUCKET}+"
- end
- # rubocop: enable CodeReuse/ActiveRecord
-
- def failed_attempt_counter
- @failed_attempt_counter ||= Gitlab::Metrics.counter(:job_register_attempts_failed_total, "Counts the times a runner tries to register a job")
- end
-
- def attempt_counter
- @attempt_counter ||= Gitlab::Metrics.counter(:job_register_attempts_total, "Counts the times a runner tries to register a job")
- end
-
- def job_queue_duration_seconds
- @job_queue_duration_seconds ||= Gitlab::Metrics.histogram(:job_queue_duration_seconds, 'Request handling execution time', {}, JOB_QUEUE_DURATION_SECONDS_BUCKETS)
- end
-
def pre_assign_runner_checks
{
missing_dependency_failure: -> (build, _) { !build.has_valid_build_dependencies? },
diff --git a/app/services/ci/retry_build_service.rb b/app/services/ci/retry_build_service.rb
index e5e79f70616..b2c5249a0c7 100644
--- a/app/services/ci/retry_build_service.rb
+++ b/app/services/ci/retry_build_service.rb
@@ -19,7 +19,7 @@ module Ci
mark_subsequent_stages_as_processable(build)
build.pipeline.reset_ancestor_bridges!
- Gitlab::OptimisticLocking.retry_lock(new_build, &:enqueue)
+ Gitlab::OptimisticLocking.retry_lock(new_build, name: 'retry_build', &:enqueue)
MergeRequests::AddTodoWhenBuildFailsService
.new(project, current_user)
@@ -68,7 +68,7 @@ module Ci
def mark_subsequent_stages_as_processable(build)
build.pipeline.processables.skipped.after_stage(build.stage_idx).find_each do |skipped|
- retry_optimistic_lock(skipped) { |build| build.process(current_user) }
+ retry_optimistic_lock(skipped, name: 'ci_retry_build_mark_subsequent_stages') { |build| build.process(current_user) }
end
end
end
diff --git a/app/services/ci/retry_pipeline_service.rb b/app/services/ci/retry_pipeline_service.rb
index dea4bf73a4c..90ee7b9b3ba 100644
--- a/app/services/ci/retry_pipeline_service.rb
+++ b/app/services/ci/retry_pipeline_service.rb
@@ -23,7 +23,7 @@ module Ci
end
pipeline.builds.latest.skipped.find_each do |skipped|
- retry_optimistic_lock(skipped) { |build| build.process(current_user) }
+ retry_optimistic_lock(skipped, name: 'ci_retry_pipeline') { |build| build.process(current_user) }
end
pipeline.reset_ancestor_bridges!
diff --git a/app/services/ci/update_build_queue_service.rb b/app/services/ci/update_build_queue_service.rb
index 241eba733ea..cf629b879b3 100644
--- a/app/services/ci/update_build_queue_service.rb
+++ b/app/services/ci/update_build_queue_service.rb
@@ -2,16 +2,21 @@
module Ci
class UpdateBuildQueueService
- def execute(build)
- tick_for(build, build.project.all_runners)
+ def execute(build, metrics = ::Gitlab::Ci::Queue::Metrics)
+ tick_for(build, build.project.all_runners, metrics)
end
private
- def tick_for(build, runners)
+ def tick_for(build, runners, metrics)
runners = runners.with_recent_runner_queue
+ runners = runners.with_tags if Feature.enabled?(:ci_preload_runner_tags, default_enabled: :yaml)
+
+ metrics.observe_active_runners(-> { runners.to_a.size })
runners.each do |runner|
+ metrics.increment_runner_tick(runner)
+
runner.pick_build!(build)
end
end
diff --git a/app/services/clusters/kubernetes.rb b/app/services/clusters/kubernetes.rb
index 819ac4c8464..ef549b56946 100644
--- a/app/services/clusters/kubernetes.rb
+++ b/app/services/clusters/kubernetes.rb
@@ -14,5 +14,7 @@ module Clusters
GITLAB_CROSSPLANE_DATABASE_ROLE_BINDING_NAME = 'gitlab-crossplane-database-rolebinding'
KNATIVE_SERVING_NAMESPACE = 'knative-serving'
ISTIO_SYSTEM_NAMESPACE = 'istio-system'
+ GITLAB_CILIUM_ROLE_NAME = 'gitlab-cilium-role'
+ GITLAB_CILIUM_ROLE_BINDING_NAME = 'gitlab-cilium-rolebinding'
end
end
diff --git a/app/services/clusters/kubernetes/create_or_update_service_account_service.rb b/app/services/clusters/kubernetes/create_or_update_service_account_service.rb
index eabc428d0d2..ecad33fc7c0 100644
--- a/app/services/clusters/kubernetes/create_or_update_service_account_service.rb
+++ b/app/services/clusters/kubernetes/create_or_update_service_account_service.rb
@@ -53,6 +53,8 @@ module Clusters
create_or_update_knative_serving_role_binding
create_or_update_crossplane_database_role
create_or_update_crossplane_database_role_binding
+ create_or_update_cilium_role
+ create_or_update_cilium_role_binding
end
private
@@ -97,6 +99,14 @@ module Clusters
kubeclient.update_role_binding(crossplane_database_role_binding_resource)
end
+ def create_or_update_cilium_role
+ kubeclient.update_role(cilium_role_resource)
+ end
+
+ def create_or_update_cilium_role_binding
+ kubeclient.update_role_binding(cilium_role_binding_resource)
+ end
+
def service_account_resource
Gitlab::Kubernetes::ServiceAccount.new(
service_account_name,
@@ -175,6 +185,28 @@ module Clusters
service_account_name: service_account_name
).generate
end
+
+ def cilium_role_resource
+ Gitlab::Kubernetes::Role.new(
+ name: Clusters::Kubernetes::GITLAB_CILIUM_ROLE_NAME,
+ namespace: service_account_namespace,
+ rules: [{
+ apiGroups: %w(cilium.io),
+ resources: %w(ciliumnetworkpolicies),
+ verbs: %w(get list create update patch)
+ }]
+ ).generate
+ end
+
+ def cilium_role_binding_resource
+ Gitlab::Kubernetes::RoleBinding.new(
+ name: Clusters::Kubernetes::GITLAB_CILIUM_ROLE_BINDING_NAME,
+ role_name: Clusters::Kubernetes::GITLAB_CILIUM_ROLE_NAME,
+ role_kind: :Role,
+ namespace: service_account_namespace,
+ service_account_name: service_account_name
+ ).generate
+ end
end
end
end
diff --git a/app/services/concerns/alert_management/alert_processing.rb b/app/services/concerns/alert_management/alert_processing.rb
index 9b15c5d7b4b..7b6f681fe3e 100644
--- a/app/services/concerns/alert_management/alert_processing.rb
+++ b/app/services/concerns/alert_management/alert_processing.rb
@@ -41,14 +41,21 @@ module AlertManagement
end
def process_resolved_alert
+ SystemNoteService.log_resolving_alert(alert, alert_source)
+
return unless auto_close_incident?
- return close_issue(alert.issue) if alert.resolve(incoming_payload.ends_at)
- logger.warn(
- message: 'Unable to update AlertManagement::Alert status to resolved',
- project_id: project.id,
- alert_id: alert.id
- )
+ if alert.resolve(incoming_payload.ends_at)
+ SystemNoteService.change_alert_status(alert, User.alert_bot)
+
+ close_issue(alert.issue)
+ else
+ logger.warn(
+ message: 'Unable to update AlertManagement::Alert status to resolved',
+ project_id: project.id,
+ alert_id: alert.id
+ )
+ end
end
def process_firing_alert
diff --git a/app/services/dependency_proxy/find_or_create_manifest_service.rb b/app/services/dependency_proxy/find_or_create_manifest_service.rb
index 6b46f5e4c59..ee608d715aa 100644
--- a/app/services/dependency_proxy/find_or_create_manifest_service.rb
+++ b/app/services/dependency_proxy/find_or_create_manifest_service.rb
@@ -13,7 +13,7 @@ module DependencyProxy
def execute
@manifest = @group.dependency_proxy_manifests
- .find_or_initialize_by_file_name(@file_name)
+ .find_or_initialize_by_file_name_or_digest(file_name: @file_name, digest: @tag)
head_result = DependencyProxy::HeadManifestService.new(@image, @tag, @token).execute
@@ -30,6 +30,7 @@ module DependencyProxy
def pull_new_manifest
DependencyProxy::PullManifestService.new(@image, @tag, @token).execute_with_manifest do |new_manifest|
@manifest.update!(
+ content_type: new_manifest[:content_type],
digest: new_manifest[:digest],
file: new_manifest[:file],
size: new_manifest[:file].size
@@ -38,7 +39,9 @@ module DependencyProxy
end
def cached_manifest_matches?(head_result)
- @manifest && @manifest.digest == head_result[:digest]
+ return false if head_result[:status] == :error
+
+ @manifest && @manifest.digest == head_result[:digest] && @manifest.content_type == head_result[:content_type]
end
def respond
diff --git a/app/services/dependency_proxy/head_manifest_service.rb b/app/services/dependency_proxy/head_manifest_service.rb
index 87d9c417c98..ecc3eb77399 100644
--- a/app/services/dependency_proxy/head_manifest_service.rb
+++ b/app/services/dependency_proxy/head_manifest_service.rb
@@ -2,6 +2,8 @@
module DependencyProxy
class HeadManifestService < DependencyProxy::BaseService
+ ACCEPT_HEADERS = ::ContainerRegistry::Client::ACCEPTED_TYPES.join(',')
+
def initialize(image, tag, token)
@image = image
@tag = tag
@@ -9,10 +11,10 @@ module DependencyProxy
end
def execute
- response = Gitlab::HTTP.head(manifest_url, headers: auth_headers)
+ response = Gitlab::HTTP.head(manifest_url, headers: auth_headers.merge(Accept: ACCEPT_HEADERS))
if response.success?
- success(digest: response.headers['docker-content-digest'])
+ success(digest: response.headers['docker-content-digest'], content_type: response.headers['content-type'])
else
error(response.body, response.code)
end
diff --git a/app/services/dependency_proxy/pull_manifest_service.rb b/app/services/dependency_proxy/pull_manifest_service.rb
index 5c804489fd1..737414c396e 100644
--- a/app/services/dependency_proxy/pull_manifest_service.rb
+++ b/app/services/dependency_proxy/pull_manifest_service.rb
@@ -11,7 +11,7 @@ module DependencyProxy
def execute_with_manifest
raise ArgumentError, 'Block must be provided' unless block_given?
- response = Gitlab::HTTP.get(manifest_url, headers: auth_headers)
+ response = Gitlab::HTTP.get(manifest_url, headers: auth_headers.merge(Accept: ::ContainerRegistry::Client::ACCEPTED_TYPES.join(',')))
if response.success?
file = Tempfile.new
@@ -20,7 +20,7 @@ module DependencyProxy
file.write(response)
file.flush
- yield(success(file: file, digest: response.headers['docker-content-digest']))
+ yield(success(file: file, digest: response.headers['docker-content-digest'], content_type: response.headers['content-type']))
ensure
file.close
file.unlink
diff --git a/app/services/deployments/older_deployments_drop_service.rb b/app/services/deployments/older_deployments_drop_service.rb
index e765d2484ea..9283a5c1279 100644
--- a/app/services/deployments/older_deployments_drop_service.rb
+++ b/app/services/deployments/older_deployments_drop_service.rb
@@ -12,7 +12,7 @@ module Deployments
return unless @deployment&.running?
older_deployments.find_each do |older_deployment|
- Gitlab::OptimisticLocking.retry_lock(older_deployment.deployable) do |deployable|
+ Gitlab::OptimisticLocking.retry_lock(older_deployment.deployable, name: 'older_deployments_drop') do |deployable|
deployable.drop(:forward_deployment_failure)
end
rescue => e
diff --git a/app/services/deployments/update_environment_service.rb b/app/services/deployments/update_environment_service.rb
index e9c2f41f626..6cfe22e98fa 100644
--- a/app/services/deployments/update_environment_service.rb
+++ b/app/services/deployments/update_environment_service.rb
@@ -25,11 +25,10 @@ module Deployments
def update_environment(deployment)
ActiveRecord::Base.transaction do
- if (url = expanded_environment_url)
- environment.external_url = url
- end
-
+ # Renew attributes at update
+ renew_external_url
renew_auto_stop_in
+ renew_deployment_tier
environment.fire_state_event(action)
if environment.save && !environment.stopped?
@@ -56,11 +55,25 @@ module Deployments
environment_options[:action] || 'start'
end
+ def renew_external_url
+ if (url = expanded_environment_url)
+ environment.external_url = url
+ end
+ end
+
def renew_auto_stop_in
return unless deployable
environment.auto_stop_in = deployable.environment_auto_stop_in
end
+
+ def renew_deployment_tier
+ return unless deployable && ::Feature.enabled?(:environment_tier, deployable.project, default_enabled: :yaml)
+
+ if (tier = deployable.environment_deployment_tier)
+ environment.tier = tier
+ end
+ end
end
end
diff --git a/app/services/groups/create_service.rb b/app/services/groups/create_service.rb
index 06a3b31c665..3ead2323588 100644
--- a/app/services/groups/create_service.rb
+++ b/app/services/groups/create_service.rb
@@ -33,7 +33,7 @@ module Groups
Group.transaction do
if @group.save
@group.add_owner(current_user)
- @group.create_namespace_settings
+ @group.create_namespace_settings unless @group.namespace_settings
Service.create_from_active_default_integrations(@group, :group_id)
OnboardingProgress.onboard(@group)
end
diff --git a/app/services/groups/destroy_service.rb b/app/services/groups/destroy_service.rb
index c7107e2fa56..a27330d1104 100644
--- a/app/services/groups/destroy_service.rb
+++ b/app/services/groups/destroy_service.rb
@@ -31,11 +31,11 @@ module Groups
# If any other groups are shared with the group that is being destroyed,
# we should specifically trigger update of all project authorizations
- # for users that are the members of this group.
+ # for users that are the direct members of this group.
# If not, the project authorization records of these users to projects within the shared groups
# will never be removed, causing inconsistencies with access permissions.
if any_other_groups_are_shared_with_this_group?
- user_ids_for_project_authorizations_refresh = group.user_ids_for_project_authorizations
+ user_ids_for_project_authorizations_refresh = group.users_ids_of_direct_members
end
group.destroy
diff --git a/app/services/groups/group_links/create_service.rb b/app/services/groups/group_links/create_service.rb
index 589ac7ccde7..57c746c3841 100644
--- a/app/services/groups/group_links/create_service.rb
+++ b/app/services/groups/group_links/create_service.rb
@@ -18,7 +18,7 @@ module Groups
)
if link.save
- group.refresh_members_authorized_projects
+ group.refresh_members_authorized_projects(direct_members_only: true)
success(link: link)
else
error(link.errors.full_messages.to_sentence, 409)
diff --git a/app/services/groups/group_links/destroy_service.rb b/app/services/groups/group_links/destroy_service.rb
index b0d496ae78c..05504a80f46 100644
--- a/app/services/groups/group_links/destroy_service.rb
+++ b/app/services/groups/group_links/destroy_service.rb
@@ -16,7 +16,7 @@ module Groups
groups_to_refresh = links.map(&:shared_with_group)
groups_to_refresh.uniq.each do |group|
- group.refresh_members_authorized_projects
+ group.refresh_members_authorized_projects(direct_members_only: true)
end
else
Gitlab::AppLogger.info(
diff --git a/app/services/groups/group_links/update_service.rb b/app/services/groups/group_links/update_service.rb
index 71b52cb616c..3703d535482 100644
--- a/app/services/groups/group_links/update_service.rb
+++ b/app/services/groups/group_links/update_service.rb
@@ -13,7 +13,7 @@ module Groups
group_link.update!(group_link_params)
if requires_authorization_refresh?(group_link_params)
- group_link.shared_with_group.refresh_members_authorized_projects
+ group_link.shared_with_group.refresh_members_authorized_projects(direct_members_only: true)
end
end
diff --git a/app/services/import/github_service.rb b/app/services/import/github_service.rb
index 847c5eb4397..3ee5a185f42 100644
--- a/app/services/import/github_service.rb
+++ b/app/services/import/github_service.rb
@@ -2,6 +2,9 @@
module Import
class GithubService < Import::BaseService
+ include ActiveSupport::NumberHelper
+ include Gitlab::Utils::StrongMemoize
+
attr_accessor :client
attr_reader :params, :current_user
@@ -14,6 +17,10 @@ module Import
return error(_('This namespace has already been taken! Please choose another one.'), :unprocessable_entity)
end
+ if oversized?
+ return error(oversize_error_message, :unprocessable_entity)
+ end
+
project = create_project(access_params, provider)
if project.persisted?
@@ -32,7 +39,8 @@ module Import
target_namespace,
current_user,
type: provider,
- **access_params).execute(extra_project_attrs)
+ **access_params
+ ).execute(extra_project_attrs)
end
def repo
@@ -55,6 +63,30 @@ module Import
{}
end
+ def oversized?
+ repository_size_limit > 0 && repo.size > repository_size_limit
+ end
+
+ def oversize_error_message
+ _('"%{repository_name}" size (%{repository_size}) is larger than the limit of %{limit}.') % {
+ repository_name: repo.name,
+ repository_size: number_to_human_size(repo.size),
+ limit: number_to_human_size(repository_size_limit)
+ }
+ end
+
+ def repository_size_limit
+ strong_memoize :repository_size_limit do
+ namespace_limit = target_namespace.repository_size_limit.to_i
+
+ if namespace_limit > 0
+ namespace_limit
+ else
+ Gitlab::CurrentSettings.repository_size_limit.to_i
+ end
+ end
+ end
+
def authorized?
can?(current_user, :create_projects, target_namespace)
end
diff --git a/app/services/issuable/clone/base_service.rb b/app/services/issuable/clone/base_service.rb
index b2f9c083b5b..3c2bc527b12 100644
--- a/app/services/issuable/clone/base_service.rb
+++ b/app/services/issuable/clone/base_service.rb
@@ -3,12 +3,13 @@
module Issuable
module Clone
class BaseService < IssuableBaseService
- attr_reader :original_entity, :new_entity
+ attr_reader :original_entity, :new_entity, :target_project
alias_method :old_project, :project
- def execute(original_entity, new_project = nil)
+ def execute(original_entity, target_project = nil)
@original_entity = original_entity
+ @target_project = target_project
# Using transaction because of a high resources footprint
# on rewriting notes (unfolding references)
@@ -77,6 +78,12 @@ module Issuable
new_entity.project.group
end
end
+
+ def relative_position
+ return if original_entity.project.root_ancestor.id != target_project.root_ancestor.id
+
+ original_entity.relative_position
+ end
end
end
end
diff --git a/app/services/issuable/process_assignees.rb b/app/services/issuable/process_assignees.rb
new file mode 100644
index 00000000000..c9c6b0bed85
--- /dev/null
+++ b/app/services/issuable/process_assignees.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+# This follows the rules specified in the specs.
+# See spec/requests/api/graphql/mutations/merge_requests/set_assignees_spec.rb
+
+module Issuable
+ class ProcessAssignees
+ def initialize(assignee_ids:, add_assignee_ids:, remove_assignee_ids:, existing_assignee_ids: nil, extra_assignee_ids: nil)
+ @assignee_ids = assignee_ids
+ @add_assignee_ids = add_assignee_ids
+ @remove_assignee_ids = remove_assignee_ids
+ @existing_assignee_ids = existing_assignee_ids || []
+ @extra_assignee_ids = extra_assignee_ids || []
+ end
+
+ def execute
+ if assignee_ids.blank?
+ updated_new_assignees = new_assignee_ids
+ updated_new_assignees |= add_assignee_ids if add_assignee_ids
+ updated_new_assignees -= remove_assignee_ids if remove_assignee_ids
+ else
+ updated_new_assignees = assignee_ids
+ end
+
+ updated_new_assignees.uniq
+ end
+
+ private
+
+ attr_accessor :assignee_ids, :add_assignee_ids, :remove_assignee_ids, :existing_assignee_ids, :extra_assignee_ids
+
+ def new_assignee_ids
+ existing_assignee_ids | extra_assignee_ids
+ end
+ end
+end
diff --git a/app/services/issue_rebalancing_service.rb b/app/services/issue_rebalancing_service.rb
index 849afc4edb8..db5c5ddfb84 100644
--- a/app/services/issue_rebalancing_service.rb
+++ b/app/services/issue_rebalancing_service.rb
@@ -2,6 +2,7 @@
class IssueRebalancingService
MAX_ISSUE_COUNT = 10_000
+ BATCH_SIZE = 100
TooManyIssues = Class.new(StandardError)
def initialize(issue)
@@ -21,13 +22,13 @@ class IssueRebalancingService
Issue.transaction do
assign_positions(start, indexed_ids)
.sort_by(&:first)
- .each_slice(100) do |pairs_with_position|
+ .each_slice(BATCH_SIZE) do |pairs_with_position|
update_positions(pairs_with_position, 'rebalance issue positions in batches ordered by id')
end
end
else
Issue.transaction do
- indexed_ids.each_slice(100) do |pairs|
+ indexed_ids.each_slice(BATCH_SIZE) do |pairs|
pairs_with_position = assign_positions(start, pairs)
update_positions(pairs_with_position, 'rebalance issue positions')
end
diff --git a/app/services/issues/clone_service.rb b/app/services/issues/clone_service.rb
index 4c9c34f1247..b64e4687a87 100644
--- a/app/services/issues/clone_service.rb
+++ b/app/services/issues/clone_service.rb
@@ -47,6 +47,7 @@ module Issues
new_params = {
id: nil,
iid: nil,
+ relative_position: relative_position,
project: target_project,
author: current_user,
assignee_ids: original_entity.assignee_ids
diff --git a/app/services/issues/create_service.rb b/app/services/issues/create_service.rb
index d2285a375a1..3fdc66ed84e 100644
--- a/app/services/issues/create_service.rb
+++ b/app/services/issues/create_service.rb
@@ -28,6 +28,7 @@ module Issues
issue.run_after_commit do
NewIssueWorker.perform_async(issue.id, user.id)
IssuePlacementWorker.perform_async(nil, issue.project_id)
+ Namespaces::OnboardingIssueCreatedWorker.perform_async(issue.namespace.id)
end
end
diff --git a/app/services/issues/move_service.rb b/app/services/issues/move_service.rb
index 90ccbd8ed21..c1afb8f456d 100644
--- a/app/services/issues/move_service.rb
+++ b/app/services/issues/move_service.rb
@@ -48,13 +48,14 @@ module Issues
def create_new_entity
new_params = {
- id: nil,
- iid: nil,
- project: target_project,
- author: original_entity.author,
- assignee_ids: original_entity.assignee_ids,
- moved_issue: true
- }
+ id: nil,
+ iid: nil,
+ relative_position: relative_position,
+ project: target_project,
+ author: original_entity.author,
+ assignee_ids: original_entity.assignee_ids,
+ moved_issue: true
+ }
new_params = original_entity.serializable_hash.symbolize_keys.merge(new_params)
diff --git a/app/services/members/invite_service.rb b/app/services/members/invite_service.rb
index 60ebbaface2..169500d08f0 100644
--- a/app/services/members/invite_service.rb
+++ b/app/services/members/invite_service.rb
@@ -2,112 +2,97 @@
module Members
class InviteService < Members::BaseService
- DEFAULT_LIMIT = 100
+ BlankEmailsError = Class.new(StandardError)
+ TooManyEmailsError = Class.new(StandardError)
- attr_reader :errors
+ def initialize(*args)
+ super
- def initialize(current_user, params)
- @current_user, @params = current_user, params.dup
@errors = {}
+ @emails = params[:email]&.split(',')&.uniq&.flatten
end
def execute(source)
- return error(s_('Email cannot be blank')) if params[:email].blank?
+ validate_emails!
- emails = params[:email].split(',').uniq.flatten
- return error(s_("Too many users specified (limit is %{user_limit})") % { user_limit: user_limit }) if
- user_limit && emails.size > user_limit
-
- emails.each do |email|
- next if existing_member?(source, email)
- next if existing_invite?(source, email)
- next if existing_request?(source, email)
-
- if existing_user?(email)
- add_existing_user_as_member(current_user, source, params, email)
- next
- end
-
- invite_new_member_and_user(current_user, source, params, email)
- end
-
- return success unless errors.any?
-
- error(errors)
+ @source = source
+ emails.each(&method(:process_email))
+ result
+ rescue BlankEmailsError, TooManyEmailsError => e
+ error(e.message)
end
private
- def invite_new_member_and_user(current_user, source, params, email)
- new_member = (source.class.name + 'Member').constantize.create(source_id: source.id,
- user_id: nil,
- access_level: params[:access_level],
- invite_email: email,
- created_by_id: current_user.id,
- expires_at: params[:expires_at])
-
- unless new_member.valid? && new_member.persisted?
- errors[params[:email]] = new_member.errors.full_messages.to_sentence
- end
- end
+ attr_reader :source, :errors, :emails
- def add_existing_user_as_member(current_user, source, params, email)
- new_member = create_member(current_user, existing_user(email), source, params.merge({ invite_email: email }))
+ def validate_emails!
+ raise BlankEmailsError, s_('AddMember|Email cannot be blank') if emails.blank?
- unless new_member.valid? && new_member.persisted?
- errors[email] = new_member.errors.full_messages.to_sentence
+ if user_limit && emails.size > user_limit
+ raise TooManyEmailsError, s_("AddMember|Too many users specified (limit is %{user_limit})") % { user_limit: user_limit }
end
end
- def create_member(current_user, user, source, params)
- source.add_user(user, params[:access_level], current_user: current_user, expires_at: params[:expires_at])
+ def user_limit
+ limit = params.fetch(:limit, Members::CreateService::DEFAULT_LIMIT)
+
+ limit < 0 ? nil : limit
end
- def user_limit
- limit = params.fetch(:limit, DEFAULT_LIMIT)
+ def process_email(email)
+ return if existing_member?(email)
+ return if existing_invite?(email)
+ return if existing_request?(email)
- limit && limit < 0 ? nil : limit
+ add_member(email)
end
- def existing_member?(source, email)
+ def existing_member?(email)
existing_member = source.members.with_user_by_email(email).exists?
if existing_member
- errors[email] = "Already a member of #{source.name}"
+ errors[email] = s_("AddMember|Already a member of %{source_name}") % { source_name: source.name }
return true
end
false
end
- def existing_invite?(source, email)
+ def existing_invite?(email)
existing_invite = source.members.search_invite_email(email).exists?
if existing_invite
- errors[email] = "Member already invited to #{source.name}"
+ errors[email] = s_("AddMember|Member already invited to %{source_name}") % { source_name: source.name }
return true
end
false
end
- def existing_request?(source, email)
+ def existing_request?(email)
existing_request = source.requesters.with_user_by_email(email).exists?
if existing_request
- errors[email] = "Member cannot be invited because they already requested to join #{source.name}"
+ errors[email] = s_("AddMember|Member cannot be invited because they already requested to join %{source_name}") % { source_name: source.name }
return true
end
false
end
- def existing_user(email)
- User.find_by_email(email)
+ def add_member(email)
+ new_member = source.add_user(email, params[:access_level], current_user: current_user, expires_at: params[:expires_at])
+
+ errors[email] = new_member.errors.full_messages.to_sentence if new_member.invalid?
end
- def existing_user?(email)
- existing_user(email).present?
+ def result
+ if errors.any?
+ error(errors)
+ else
+ success
+ end
end
end
end
diff --git a/app/services/merge_requests/after_create_service.rb b/app/services/merge_requests/after_create_service.rb
index 03fcb5a4c1b..b22afe8a20d 100644
--- a/app/services/merge_requests/after_create_service.rb
+++ b/app/services/merge_requests/after_create_service.rb
@@ -3,8 +3,18 @@
module MergeRequests
class AfterCreateService < MergeRequests::BaseService
def execute(merge_request)
+ prepare_merge_request(merge_request)
+ merge_request.mark_as_unchecked if merge_request.preparing?
+ end
+
+ private
+
+ def prepare_merge_request(merge_request)
event_service.open_mr(merge_request, current_user)
+
merge_request_activity_counter.track_create_mr_action(user: current_user)
+ merge_request_activity_counter.track_mr_including_ci_config(user: current_user, merge_request: merge_request)
+
notification_service.new_merge_request(merge_request, current_user)
create_pipeline_for(merge_request, current_user)
diff --git a/app/services/merge_requests/base_service.rb b/app/services/merge_requests/base_service.rb
index 6bd31e26748..317cd11a69d 100644
--- a/app/services/merge_requests/base_service.rb
+++ b/app/services/merge_requests/base_service.rb
@@ -181,7 +181,7 @@ module MergeRequests
}
if exception
- Gitlab::ErrorTracking.with_context(current_user) do
+ Gitlab::ApplicationContext.with_context(user: current_user) do
Gitlab::ErrorTracking.track_exception(exception, data)
end
diff --git a/app/services/merge_requests/build_service.rb b/app/services/merge_requests/build_service.rb
index 12c901aa1a1..e4d3c91d13e 100644
--- a/app/services/merge_requests/build_service.rb
+++ b/app/services/merge_requests/build_service.rb
@@ -58,6 +58,7 @@ module MergeRequests
:compare_commits,
:wip_title,
:description,
+ :first_multiline_commit,
:errors,
to: :merge_request
@@ -196,7 +197,8 @@ module MergeRequests
# interpreted as the user wants to close that issue on this project.
#
# For example:
- # - Issue 112 exists, title: Emoji don't show up in commit title
+ # - Issue 112 exists
+ # - title: Emoji don't show up in commit title
# - Source branch is: 112-fix-mep-mep
#
# Will lead to:
@@ -205,7 +207,7 @@ module MergeRequests
# more than one commit in the MR
#
def assign_title_and_description
- assign_title_and_description_from_single_commit
+ assign_title_and_description_from_commits
merge_request.title ||= title_from_issue if target_project.issues_enabled? || target_project.external_issue_tracker
merge_request.title ||= source_branch.titleize.humanize
merge_request.title = wip_title if compare_commits.empty?
@@ -240,12 +242,16 @@ module MergeRequests
end
end
- def assign_title_and_description_from_single_commit
+ def assign_title_and_description_from_commits
commits = compare_commits
- return unless commits&.count == 1
+ if commits&.count == 1
+ commit = commits.first
+ else
+ commit = first_multiline_commit
+ return unless commit
+ end
- commit = commits.first
merge_request.title ||= commit.title
merge_request.description ||= commit.description.try(:strip)
end
diff --git a/app/services/merge_requests/merge_service.rb b/app/services/merge_requests/merge_service.rb
index fc4405ef704..27f474b0fe7 100644
--- a/app/services/merge_requests/merge_service.rb
+++ b/app/services/merge_requests/merge_service.rb
@@ -107,8 +107,7 @@ module MergeRequests
log_info("Post merge finished on JID #{merge_jid} with state #{state}")
if delete_source_branch?
- ::Branches::DeleteService.new(@merge_request.source_project, branch_deletion_user)
- .execute(merge_request.source_branch)
+ MergeRequests::DeleteSourceBranchWorker.perform_async(@merge_request.id, @merge_request.source_branch_sha, branch_deletion_user.id)
end
end
diff --git a/app/services/merge_requests/post_merge_service.rb b/app/services/merge_requests/post_merge_service.rb
index aafba9bfcef..4d7d632ee14 100644
--- a/app/services/merge_requests/post_merge_service.rb
+++ b/app/services/merge_requests/post_merge_service.rb
@@ -20,7 +20,6 @@ module MergeRequests
merge_request_activity_counter.track_merge_mr_action(user: current_user)
notification_service.merge_mr(merge_request, current_user)
execute_hooks(merge_request, 'merge')
- retarget_chain_merge_requests(merge_request)
invalidate_cache_counts(merge_request, users: merge_request.assignees | merge_request.reviewers)
merge_request.update_project_counter_caches
delete_non_latest_diffs(merge_request)
@@ -31,34 +30,6 @@ module MergeRequests
private
- def retarget_chain_merge_requests(merge_request)
- return unless Feature.enabled?(:retarget_merge_requests, merge_request.target_project)
-
- # we can only retarget MRs that are targeting the same project
- # and have a remove source branch set
- return unless merge_request.for_same_project? && merge_request.remove_source_branch?
-
- # find another merge requests that
- # - as a target have a current source project and branch
- other_merge_requests = merge_request.source_project
- .merge_requests
- .opened
- .by_target_branch(merge_request.source_branch)
- .preload_source_project
- .at_most(MAX_RETARGET_MERGE_REQUESTS)
-
- other_merge_requests.find_each do |other_merge_request|
- # Update only MRs on projects that we have access to
- next unless can?(current_user, :update_merge_request, other_merge_request.source_project)
-
- ::MergeRequests::UpdateService
- .new(other_merge_request.source_project, current_user,
- target_branch: merge_request.target_branch,
- target_branch_was_deleted: true)
- .execute(other_merge_request)
- end
- end
-
def close_issues(merge_request)
return unless merge_request.target_branch == project.default_branch
diff --git a/app/services/merge_requests/refresh_service.rb b/app/services/merge_requests/refresh_service.rb
index ed977a5a872..0fb16597aff 100644
--- a/app/services/merge_requests/refresh_service.rb
+++ b/app/services/merge_requests/refresh_service.rb
@@ -44,6 +44,7 @@ module MergeRequests
notify_about_push(mr)
mark_mr_as_draft_from_commits(mr)
execute_mr_web_hooks(mr)
+ merge_request_activity_counter.track_mr_including_ci_config(user: mr.author, merge_request: mr)
end
true
@@ -74,7 +75,8 @@ module MergeRequests
def post_merge_manually_merged
commit_ids = @commits.map(&:id)
merge_requests = @project.merge_requests.opened
- .preload(:latest_merge_request_diff)
+ .preload_project_and_latest_diff
+ .preload_latest_diff_commit
.where(target_branch: @push.branch_name).to_a
.select(&:diff_head_commit)
.select do |merge_request|
@@ -116,11 +118,14 @@ module MergeRequests
# Note: we should update merge requests from forks too
def reload_merge_requests
merge_requests = @project.merge_requests.opened
- .by_source_or_target_branch(@push.branch_name).to_a
+ .by_source_or_target_branch(@push.branch_name)
+ .preload_project_and_latest_diff
- merge_requests += merge_requests_for_forks.to_a
+ merge_requests_from_forks = merge_requests_for_forks
+ .preload_project_and_latest_diff
- filter_merge_requests(merge_requests).each do |merge_request|
+ merge_requests_array = merge_requests.to_a + merge_requests_from_forks.to_a
+ filter_merge_requests(merge_requests_array).each do |merge_request|
if branch_and_project_match?(merge_request) || @push.force_push?
merge_request.reload_diff(current_user)
# Clear existing merge error if the push were directed at the
diff --git a/app/services/merge_requests/retarget_chain_service.rb b/app/services/merge_requests/retarget_chain_service.rb
new file mode 100644
index 00000000000..f24d67243c9
--- /dev/null
+++ b/app/services/merge_requests/retarget_chain_service.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+module MergeRequests
+ class RetargetChainService < MergeRequests::BaseService
+ MAX_RETARGET_MERGE_REQUESTS = 4
+
+ def execute(merge_request)
+ return unless Feature.enabled?(:retarget_merge_requests, merge_request.target_project, default_enabled: :yaml)
+
+ # we can only retarget MRs that are targeting the same project
+ return unless merge_request.for_same_project? && merge_request.merged?
+
+ # find another merge requests that
+ # - as a target have a current source project and branch
+ other_merge_requests = merge_request.source_project
+ .merge_requests
+ .opened
+ .by_target_branch(merge_request.source_branch)
+ .preload_source_project
+ .at_most(MAX_RETARGET_MERGE_REQUESTS)
+
+ other_merge_requests.find_each do |other_merge_request|
+ # Update only MRs on projects that we have access to
+ next unless can?(current_user, :update_merge_request, other_merge_request.source_project)
+
+ ::MergeRequests::UpdateService
+ .new(other_merge_request.source_project, current_user,
+ target_branch: merge_request.target_branch,
+ target_branch_was_deleted: true)
+ .execute(other_merge_request)
+ end
+ end
+ end
+end
diff --git a/app/services/merge_requests/update_service.rb b/app/services/merge_requests/update_service.rb
index 1707daff734..f5e14797f7e 100644
--- a/app/services/merge_requests/update_service.rb
+++ b/app/services/merge_requests/update_service.rb
@@ -31,54 +31,37 @@ module MergeRequests
old_mentioned_users = old_associations.fetch(:mentioned_users, [])
old_assignees = old_associations.fetch(:assignees, [])
old_reviewers = old_associations.fetch(:reviewers, [])
+ old_timelogs = old_associations.fetch(:timelogs, [])
+ changed_fields = merge_request.previous_changes.keys
- if has_changes?(merge_request, old_labels: old_labels, old_assignees: old_assignees, old_reviewers: old_reviewers)
- todo_service.resolve_todos_for_target(merge_request, current_user)
- end
+ resolve_todos(merge_request, old_labels, old_assignees, old_reviewers)
if merge_request.previous_changes.include?('title') ||
merge_request.previous_changes.include?('description')
todo_service.update_merge_request(merge_request, current_user, old_mentioned_users)
end
- if merge_request.previous_changes.include?('target_branch')
- create_branch_change_note(merge_request,
- 'target',
- target_branch_was_deleted ? 'delete' : 'update',
- merge_request.previous_changes['target_branch'].first,
- merge_request.target_branch)
-
- abort_auto_merge(merge_request, 'target branch was changed')
- end
-
+ handle_target_branch_change(merge_request)
handle_assignees_change(merge_request, old_assignees) if merge_request.assignees != old_assignees
-
handle_reviewers_change(merge_request, old_reviewers) if merge_request.reviewers != old_reviewers
-
- if merge_request.previous_changes.include?('target_branch') ||
- merge_request.previous_changes.include?('source_branch')
- merge_request.mark_as_unchecked
- end
-
handle_milestone_change(merge_request)
+ handle_draft_status_change(merge_request, changed_fields)
- added_labels = merge_request.labels - old_labels
- if added_labels.present?
- notification_service.async.relabeled_merge_request(
- merge_request,
- added_labels,
- current_user
- )
- end
+ track_title_and_desc_edits(changed_fields)
+ track_discussion_lock_toggle(merge_request, changed_fields)
+ track_time_estimate_and_spend_edits(merge_request, old_timelogs, changed_fields)
+ track_labels_change(merge_request, old_labels)
- added_mentions = merge_request.mentioned_users(current_user) - old_mentioned_users
+ notify_if_labels_added(merge_request, old_labels)
+ notify_if_mentions_added(merge_request, old_mentioned_users)
- if added_mentions.present?
- notification_service.async.new_mentions_in_merge_request(
- merge_request,
- added_mentions,
- current_user
- )
+ # Since #mark_as_unchecked triggers an update action through the MR's
+ # state machine, we want to push this as far down in the process so we
+ # avoid resetting #ActiveModel::Dirty
+ #
+ if merge_request.previous_changes.include?('target_branch') ||
+ merge_request.previous_changes.include?('source_branch')
+ merge_request.mark_as_unchecked
end
end
@@ -95,56 +78,128 @@ module MergeRequests
MergeRequests::CloseService
end
- def before_update(issuable, skip_spam_check: false)
- return unless issuable.changed?
-
- @issuable_changes = issuable.changes
- end
-
def after_update(issuable)
issuable.cache_merge_request_closes_issues!(current_user)
+ end
- return unless @issuable_changes
+ private
- %w(title description).each do |action|
- next unless @issuable_changes.key?(action)
+ attr_reader :target_branch_was_deleted
+
+ def track_title_and_desc_edits(changed_fields)
+ tracked_fields = %w(title description)
+
+ return unless changed_fields.any? { |field| tracked_fields.include?(field) }
+
+ tracked_fields.each do |action|
+ next unless changed_fields.include?(action)
- # Track edits to title or description
- #
merge_request_activity_counter
.public_send("track_#{action}_edit_action".to_sym, user: current_user) # rubocop:disable GitlabSecurity/PublicSend
+ end
+ end
- # Track changes to Draft/WIP status
- #
- if action == "title"
- old_title, new_title = @issuable_changes["title"]
- old_title_wip = MergeRequest.work_in_progress?(old_title)
- new_title_wip = MergeRequest.work_in_progress?(new_title)
-
- if !old_title_wip && new_title_wip
- # Marked as Draft/WIP
- #
- merge_request_activity_counter
- .track_marked_as_draft_action(user: current_user)
- elsif old_title_wip && !new_title_wip
- # Unmarked as Draft/WIP
- #
- merge_request_activity_counter
- .track_unmarked_as_draft_action(user: current_user)
- end
- end
+ def track_discussion_lock_toggle(merge_request, changed_fields)
+ return unless changed_fields.include?('discussion_locked')
+
+ if merge_request.discussion_locked
+ merge_request_activity_counter.track_discussion_locked_action(user: current_user)
+ else
+ merge_request_activity_counter.track_discussion_unlocked_action(user: current_user)
end
end
- private
+ def track_time_estimate_and_spend_edits(merge_request, old_timelogs, changed_fields)
+ merge_request_activity_counter.track_time_estimate_changed_action(user: current_user) if changed_fields.include?('time_estimate')
+ merge_request_activity_counter.track_time_spent_changed_action(user: current_user) if old_timelogs != merge_request.timelogs
+ end
- attr_reader :target_branch_was_deleted
+ def track_labels_change(merge_request, old_labels)
+ return if Set.new(merge_request.labels) == Set.new(old_labels)
+
+ merge_request_activity_counter.track_labels_changed_action(user: current_user)
+ end
+
+ def notify_if_labels_added(merge_request, old_labels)
+ added_labels = merge_request.labels - old_labels
+
+ return unless added_labels.present?
+
+ notification_service.async.relabeled_merge_request(
+ merge_request,
+ added_labels,
+ current_user
+ )
+ end
+
+ def notify_if_mentions_added(merge_request, old_mentioned_users)
+ added_mentions = merge_request.mentioned_users(current_user) - old_mentioned_users
+
+ return unless added_mentions.present?
+
+ notification_service.async.new_mentions_in_merge_request(
+ merge_request,
+ added_mentions,
+ current_user
+ )
+ end
+
+ def resolve_todos(merge_request, old_labels, old_assignees, old_reviewers)
+ return unless has_changes?(merge_request, old_labels: old_labels, old_assignees: old_assignees, old_reviewers: old_reviewers)
+
+ todo_service.resolve_todos_for_target(merge_request, current_user)
+ end
+
+ def handle_target_branch_change(merge_request)
+ return unless merge_request.previous_changes.include?('target_branch')
+
+ create_branch_change_note(
+ merge_request,
+ 'target',
+ target_branch_was_deleted ? 'delete' : 'update',
+ merge_request.previous_changes['target_branch'].first,
+ merge_request.target_branch
+ )
+
+ abort_auto_merge(merge_request, 'target branch was changed')
+ end
+
+ def handle_draft_status_change(merge_request, changed_fields)
+ return unless changed_fields.include?("title")
+
+ old_title, new_title = merge_request.previous_changes["title"]
+ old_title_wip = MergeRequest.work_in_progress?(old_title)
+ new_title_wip = MergeRequest.work_in_progress?(new_title)
+
+ if !old_title_wip && new_title_wip
+ # Marked as Draft/WIP
+ #
+ merge_request_activity_counter
+ .track_marked_as_draft_action(user: current_user)
+ elsif old_title_wip && !new_title_wip
+ # Unmarked as Draft/WIP
+ #
+ notify_draft_status_changed(merge_request)
+
+ merge_request_activity_counter
+ .track_unmarked_as_draft_action(user: current_user)
+ end
+ end
+
+ def notify_draft_status_changed(merge_request)
+ notification_service.async.change_in_merge_request_draft_status(
+ merge_request,
+ current_user
+ )
+ end
def handle_milestone_change(merge_request)
return if skip_milestone_email
return unless merge_request.previous_changes.include?('milestone_id')
+ merge_request_activity_counter.track_milestone_changed_action(user: current_user)
+
if merge_request.milestone.nil?
notification_service.async.removed_milestone_merge_request(merge_request, current_user)
else
@@ -159,6 +214,7 @@ module MergeRequests
new_assignees = merge_request.assignees - old_assignees
merge_request_activity_counter.track_users_assigned_to_mr(users: new_assignees)
+ merge_request_activity_counter.track_assignees_changed_action(user: current_user)
end
def handle_reviewers_change(merge_request, old_reviewers)
@@ -170,6 +226,7 @@ module MergeRequests
new_reviewers = merge_request.reviewers - old_reviewers
merge_request_activity_counter.track_users_review_requested(users: new_reviewers)
+ merge_request_activity_counter.track_reviewers_changed_action(user: current_user)
end
def create_branch_change_note(issuable, branch_type, event_type, old_branch, new_branch)
diff --git a/app/services/notes/build_service.rb b/app/services/notes/build_service.rb
index cf21818a886..8c250526efc 100644
--- a/app/services/notes/build_service.rb
+++ b/app/services/notes/build_service.rb
@@ -3,32 +3,36 @@
module Notes
class BuildService < ::BaseService
def execute
- should_resolve = false
in_reply_to_discussion_id = params.delete(:in_reply_to_discussion_id)
+ discussion = nil
if in_reply_to_discussion_id.present?
discussion = find_discussion(in_reply_to_discussion_id)
- unless discussion && can?(current_user, :create_note, discussion.noteable)
- note = Note.new
- note.errors.add(:base, _('Discussion to reply to cannot be found'))
- return note
- end
+ return discussion_not_found unless discussion && can?(current_user, :create_note, discussion.noteable)
discussion = discussion.convert_to_discussion! if discussion.can_convert_to_discussion?
params.merge!(discussion.reply_attributes)
- should_resolve = discussion.resolved?
end
+ new_note(params, discussion)
+ end
+
+ private
+
+ def new_note(params, discussion)
note = Note.new(params)
note.project = project
note.author = current_user
- if should_resolve
- note.resolve_without_save(current_user)
- end
+ parent_confidential = discussion&.confidential?
+ can_set_confidential = can?(current_user, :mark_note_as_confidential, note)
+ return discussion_not_found if parent_confidential && !can_set_confidential
+
+ note.confidential = (parent_confidential.nil? && can_set_confidential ? params.delete(:confidential) : parent_confidential)
+ note.resolve_without_save(current_user) if discussion&.resolved?
note
end
@@ -39,5 +43,11 @@ module Notes
Note.find_discussion(discussion_id)
end
end
+
+ def discussion_not_found
+ note = Note.new
+ note.errors.add(:base, _('Discussion to reply to cannot be found'))
+ note
+ end
end
end
diff --git a/app/services/notes/update_service.rb b/app/services/notes/update_service.rb
index 857ffbb6965..76f9b6369b3 100644
--- a/app/services/notes/update_service.rb
+++ b/app/services/notes/update_service.rb
@@ -7,12 +7,7 @@ module Notes
old_mentioned_users = note.mentioned_users(current_user).to_a
- note.assign_attributes(params.merge(updated_by: current_user))
-
- note.with_transaction_returning_status do
- update_confidentiality(note)
- note.save
- end
+ note.assign_attributes(params)
track_note_edit_usage_for_issues(note) if note.for_issue?
track_note_edit_usage_for_merge_requests(note) if note.for_merge_request?
@@ -28,6 +23,15 @@ module Notes
note.note = content
end
+ if note.note_changed?
+ 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
+
unless only_commands || note.for_personal_snippet?
note.create_new_cross_references!(current_user)
diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb
index 50247532f69..dfa78952aaf 100644
--- a/app/services/notification_service.rb
+++ b/app/services/notification_service.rb
@@ -66,10 +66,10 @@ class NotificationService
# Notify the owner of the personal access token, when it is about to expire
# And mark the token with about_to_expire_delivered
- def access_token_about_to_expire(user)
+ def access_token_about_to_expire(user, token_names)
return unless user.can?(:receive_notifications)
- mailer.access_token_about_to_expire_email(user).deliver_later
+ mailer.access_token_about_to_expire_email(user, token_names).deliver_later
end
# Notify the user when at least one of their personal access tokens has expired today
@@ -95,7 +95,7 @@ class NotificationService
# * users with custom level checked with "new issue"
#
def new_issue(issue, current_user)
- new_resource_email(issue, :new_issue_email)
+ new_resource_email(issue, current_user, :new_issue_email)
end
# When issue text is updated, we should send an email to:
@@ -176,7 +176,7 @@ class NotificationService
#
# In EE, approvers of the merge request are also included
def new_merge_request(merge_request, current_user)
- new_resource_email(merge_request, :new_merge_request_email)
+ new_resource_email(merge_request, current_user, :new_merge_request_email)
end
def push_to_merge_request(merge_request, current_user, new_commits: [], existing_commits: [])
@@ -189,6 +189,20 @@ class NotificationService
end
end
+ def change_in_merge_request_draft_status(merge_request, current_user)
+ recipients = NotificationRecipients::BuildService.build_recipients(merge_request, current_user, action: "draft_status_change")
+
+ recipients.each do |recipient|
+ mailer.send(
+ :change_in_merge_request_draft_status_email,
+ recipient.user.id,
+ merge_request.id,
+ current_user.id,
+ recipient.reason
+ ).deliver_later
+ end
+ end
+
# When a merge request is found to be unmergeable, we should send an email to:
#
# * mr author
@@ -371,6 +385,11 @@ class NotificationService
# Notify users when a new release is created
def send_new_release_notifications(release)
+ unless release.author&.can_trigger_notifications?
+ warn_skipping_notifications(release.author, release)
+ return false
+ end
+
recipients = NotificationRecipients::BuildService.build_new_release_recipients(release)
recipients.each do |recipient|
@@ -665,7 +684,12 @@ class NotificationService
end
def merge_when_pipeline_succeeds(merge_request, current_user)
- recipients = ::NotificationRecipients::BuildService.build_recipients(merge_request, current_user, action: 'merge_when_pipeline_succeeds')
+ recipients = ::NotificationRecipients::BuildService.build_recipients(
+ merge_request,
+ current_user,
+ action: 'merge_when_pipeline_succeeds',
+ custom_action: :merge_when_pipeline_succeeds
+ )
recipients.each do |recipient|
mailer.merge_when_pipeline_succeeds_email(recipient.user.id, merge_request.id, current_user.id).deliver_later
@@ -678,7 +702,12 @@ class NotificationService
protected
- def new_resource_email(target, method)
+ def new_resource_email(target, current_user, method)
+ unless current_user&.can_trigger_notifications?
+ warn_skipping_notifications(current_user, target)
+ return false
+ end
+
recipients = NotificationRecipients::BuildService.build_recipients(target, target.author, action: "new")
recipients.each do |recipient|
@@ -687,6 +716,11 @@ class NotificationService
end
def new_mentions_in_resource_email(target, new_mentioned_users, current_user, method)
+ unless current_user&.can_trigger_notifications?
+ warn_skipping_notifications(current_user, target)
+ return false
+ end
+
recipients = NotificationRecipients::BuildService.build_recipients(target, current_user, action: "new")
recipients = recipients.select {|r| new_mentioned_users.include?(r.user) }
@@ -820,6 +854,10 @@ class NotificationService
source.respond_to?(:group) && source.group
end
+
+ def warn_skipping_notifications(user, object)
+ Gitlab::AppLogger.warn(message: "Skipping sending notifications", user: user.id, klass: object.class, object_id: object.id)
+ end
end
NotificationService.prepend_if_ee('EE::NotificationService')
diff --git a/app/services/onboarding_progress_service.rb b/app/services/onboarding_progress_service.rb
index 241bd8a01ca..6d44c0a61ea 100644
--- a/app/services/onboarding_progress_service.rb
+++ b/app/services/onboarding_progress_service.rb
@@ -1,6 +1,24 @@
# frozen_string_literal: true
class OnboardingProgressService
+ class Async
+ attr_reader :namespace_id
+
+ def initialize(namespace_id)
+ @namespace_id = namespace_id
+ end
+
+ def execute(action:)
+ return unless OnboardingProgress.not_completed?(namespace_id, action)
+
+ Namespaces::OnboardingProgressWorker.perform_async(namespace_id, action)
+ end
+ end
+
+ def self.async(namespace_id)
+ Async.new(namespace_id)
+ end
+
def initialize(namespace)
@namespace = namespace&.root_ancestor
end
diff --git a/app/services/packages/composer/create_package_service.rb b/app/services/packages/composer/create_package_service.rb
index 0f5429f667e..c84d40c3753 100644
--- a/app/services/packages/composer/create_package_service.rb
+++ b/app/services/packages/composer/create_package_service.rb
@@ -17,6 +17,8 @@ module Packages
})
end
+ ::Packages::Composer::CacheUpdateWorker.perform_async(created_package.project_id, created_package.name, nil)
+
created_package
end
diff --git a/app/services/packages/conan/search_service.rb b/app/services/packages/conan/search_service.rb
index 4513616bad2..143fd8a627b 100644
--- a/app/services/packages/conan/search_service.rb
+++ b/app/services/packages/conan/search_service.rb
@@ -44,7 +44,7 @@ module Packages
name, version, username, _ = query.split(/[@\/]/)
full_path = Packages::Conan::Metadatum.full_path_from(package_username: username)
project = Project.find_by_full_path(full_path)
- return unless current_user.can?(:read_package, project)
+ return unless Ability.allowed?(current_user, :read_package, project)
result = project.packages.with_name(name).with_version(version).order_created.last
[result&.conan_recipe].compact
diff --git a/app/services/packages/create_event_service.rb b/app/services/packages/create_event_service.rb
index 63248ef07c9..8fed6e2def8 100644
--- a/app/services/packages/create_event_service.rb
+++ b/app/services/packages/create_event_service.rb
@@ -3,14 +3,12 @@
module Packages
class CreateEventService < BaseService
def execute
- if Feature.enabled?(:collect_package_events_redis, default_enabled: true)
- ::Packages::Event.unique_counters_for(event_scope, event_name, originator_type).each do |event_name|
- ::Gitlab::UsageDataCounters::HLLRedisCounter.track_event(event_name, values: current_user.id)
- end
-
- ::Packages::Event.counters_for(event_scope, event_name, originator_type).each do |event_name|
- ::Gitlab::UsageDataCounters::PackageEventCounter.count(event_name)
- end
+ ::Packages::Event.unique_counters_for(event_scope, event_name, originator_type).each do |event_name|
+ ::Gitlab::UsageDataCounters::HLLRedisCounter.track_event(event_name, values: current_user.id)
+ end
+
+ ::Packages::Event.counters_for(event_scope, event_name, originator_type).each do |event_name|
+ ::Gitlab::UsageDataCounters::PackageEventCounter.count(event_name)
end
if Feature.enabled?(:collect_package_events) && Gitlab::Database.read_write?
diff --git a/app/services/packages/create_temporary_package_service.rb b/app/services/packages/create_temporary_package_service.rb
new file mode 100644
index 00000000000..ee609fd787d
--- /dev/null
+++ b/app/services/packages/create_temporary_package_service.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+module Packages
+ class CreateTemporaryPackageService < ::Packages::CreatePackageService
+ PACKAGE_VERSION = '0.0.0'
+
+ def execute(package_type, name: 'Temporary.Package')
+ create_package!(package_type,
+ name: name,
+ version: "#{PACKAGE_VERSION}-#{uuid}",
+ status: 'processing'
+ )
+ end
+
+ private
+
+ def uuid
+ SecureRandom.uuid
+ end
+ end
+end
diff --git a/app/services/packages/debian/find_or_create_incoming_service.rb b/app/services/packages/debian/find_or_create_incoming_service.rb
new file mode 100644
index 00000000000..2d29ba5f3c3
--- /dev/null
+++ b/app/services/packages/debian/find_or_create_incoming_service.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module Packages
+ module Debian
+ class FindOrCreateIncomingService < ::Packages::CreatePackageService
+ def execute
+ find_or_create_package!(:debian, name: 'incoming', version: nil)
+ end
+ end
+ end
+end
diff --git a/app/services/packages/debian/find_or_create_package_service.rb b/app/services/packages/debian/find_or_create_package_service.rb
new file mode 100644
index 00000000000..46e06c9f584
--- /dev/null
+++ b/app/services/packages/debian/find_or_create_package_service.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+module Packages
+ module Debian
+ class FindOrCreatePackageService < ::Packages::CreatePackageService
+ include Gitlab::Utils::StrongMemoize
+
+ def execute
+ package = project.packages
+ .debian
+ .with_name(params[:name])
+ .with_version(params[:version])
+ .with_debian_codename(params[:distribution_name])
+ .first
+
+ package ||= create_package!(
+ :debian,
+ debian_publication_attributes: { distribution_id: distribution.id }
+ )
+
+ ServiceResponse.success(payload: { package: package })
+ end
+
+ private
+
+ def distribution
+ strong_memoize(:distribution) do
+ Packages::Debian::DistributionsFinder.new(project, codename: params[:distribution_name]).execute.last!
+ end
+ end
+ end
+ end
+end
diff --git a/app/services/packages/debian/get_or_create_incoming_service.rb b/app/services/packages/debian/get_or_create_incoming_service.rb
deleted file mode 100644
index 09e7877a2b4..00000000000
--- a/app/services/packages/debian/get_or_create_incoming_service.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-module Packages
- module Debian
- class GetOrCreateIncomingService < ::Packages::CreatePackageService
- def execute
- find_or_create_package!(:debian, name: 'incoming', version: nil)
- end
- end
- end
-end
diff --git a/app/services/packages/maven/find_or_create_package_service.rb b/app/services/packages/maven/find_or_create_package_service.rb
index 4c916d264a7..401e52f7e51 100644
--- a/app/services/packages/maven/find_or_create_package_service.rb
+++ b/app/services/packages/maven/find_or_create_package_service.rb
@@ -2,7 +2,6 @@
module Packages
module Maven
class FindOrCreatePackageService < BaseService
- MAVEN_METADATA_FILE = 'maven-metadata.xml'
SNAPSHOT_TERM = '-SNAPSHOT'
def execute
@@ -33,7 +32,7 @@ module Packages
# - my-company/my-app/maven-metadata.xml
#
# The first upload has to create the proper package (the one with the version set).
- if params[:file_name] == MAVEN_METADATA_FILE && !params[:path]&.ends_with?(SNAPSHOT_TERM)
+ if params[:file_name] == Packages::Maven::Metadata.filename && !params[:path]&.ends_with?(SNAPSHOT_TERM)
package_name, version = params[:path], nil
else
package_name, _, version = params[:path].rpartition('/')
diff --git a/app/services/packages/maven/metadata.rb b/app/services/packages/maven/metadata.rb
new file mode 100644
index 00000000000..437e18e3138
--- /dev/null
+++ b/app/services/packages/maven/metadata.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+module Packages
+ module Maven
+ module Metadata
+ FILENAME = 'maven-metadata.xml'
+
+ def self.filename
+ FILENAME
+ end
+ end
+ end
+end
diff --git a/app/services/packages/maven/metadata/append_package_file_service.rb b/app/services/packages/maven/metadata/append_package_file_service.rb
new file mode 100644
index 00000000000..e991576ebc6
--- /dev/null
+++ b/app/services/packages/maven/metadata/append_package_file_service.rb
@@ -0,0 +1,88 @@
+# frozen_string_literal: true
+
+module Packages
+ module Maven
+ module Metadata
+ class AppendPackageFileService
+ XML_CONTENT_TYPE = 'application/xml'
+ DEFAULT_CONTENT_TYPE = 'application/octet-stream'
+
+ MD5_FILE_NAME = "#{Metadata.filename}.md5"
+ SHA1_FILE_NAME = "#{Metadata.filename}.sha1"
+ SHA256_FILE_NAME = "#{Metadata.filename}.sha256"
+ SHA512_FILE_NAME = "#{Metadata.filename}.sha512"
+
+ def initialize(package:, metadata_content:)
+ @package = package
+ @metadata_content = metadata_content
+ end
+
+ def execute
+ return ServiceResponse.error(message: 'package is not set') unless @package
+ return ServiceResponse.error(message: 'metadata content is not set') unless @metadata_content
+
+ file_md5 = digest_from(@metadata_content, :md5)
+ file_sha1 = digest_from(@metadata_content, :sha1)
+ file_sha256 = digest_from(@metadata_content, :sha256)
+ file_sha512 = digest_from(@metadata_content, :sha512)
+
+ @package.transaction do
+ append_metadata_file(
+ content: @metadata_content,
+ file_name: Metadata.filename,
+ content_type: XML_CONTENT_TYPE,
+ sha1: file_sha1,
+ md5: file_md5,
+ sha256: file_sha256
+ )
+
+ append_metadata_file(content: file_md5, file_name: MD5_FILE_NAME)
+ append_metadata_file(content: file_sha1, file_name: SHA1_FILE_NAME)
+ append_metadata_file(content: file_sha256, file_name: SHA256_FILE_NAME)
+ append_metadata_file(content: file_sha512, file_name: SHA512_FILE_NAME)
+ end
+
+ ServiceResponse.success(message: 'New metadata package file created')
+ end
+
+ private
+
+ def append_metadata_file(content:, file_name:, content_type: DEFAULT_CONTENT_TYPE, sha1: nil, md5: nil, sha256: nil)
+ file_md5 = md5 || digest_from(content, :md5)
+ file_sha1 = sha1 || digest_from(content, :sha1)
+ file_sha256 = sha256 || digest_from(content, :sha256)
+
+ file = CarrierWaveStringFile.new_file(
+ file_content: content,
+ filename: file_name,
+ content_type: content_type
+ )
+
+ ::Packages::CreatePackageFileService.new(
+ @package,
+ file: file,
+ size: file.size,
+ file_name: file_name,
+ file_sha1: file_sha1,
+ file_md5: file_md5,
+ file_sha256: file_sha256
+ ).execute
+ end
+
+ def digest_from(content, type)
+ digest_class = case type
+ when :md5
+ Digest::MD5
+ when :sha1
+ Digest::SHA1
+ when :sha256
+ Digest::SHA256
+ when :sha512
+ Digest::SHA512
+ end
+ digest_class.hexdigest(content)
+ end
+ end
+ end
+ end
+end
diff --git a/app/services/packages/maven/metadata/create_versions_xml_service.rb b/app/services/packages/maven/metadata/create_versions_xml_service.rb
new file mode 100644
index 00000000000..6aebc1560c6
--- /dev/null
+++ b/app/services/packages/maven/metadata/create_versions_xml_service.rb
@@ -0,0 +1,186 @@
+# frozen_string_literal: true
+
+module Packages
+ module Maven
+ module Metadata
+ class CreateVersionsXmlService
+ include Gitlab::Utils::StrongMemoize
+
+ XPATH_VERSIONING = '//metadata/versioning'
+ XPATH_VERSIONS = '//versions'
+ XPATH_VERSION = '//version'
+ XPATH_LATEST = '//latest'
+ XPATH_RELEASE = '//release'
+ XPATH_LAST_UPDATED = '//lastUpdated'
+
+ INDENT_SPACE = 2
+
+ EMPTY_VERSIONS_PAYLOAD = {
+ changes_exist: true,
+ empty_versions: true
+ }.freeze
+
+ def initialize(metadata_content:, package:)
+ @metadata_content = metadata_content
+ @package = package
+ end
+
+ def execute
+ return ServiceResponse.error(message: 'package not set') unless @package
+ return ServiceResponse.error(message: 'metadata_content not set') unless @metadata_content
+ return ServiceResponse.error(message: 'metadata_content is invalid') unless valid_metadata_content?
+ return ServiceResponse.success(payload: EMPTY_VERSIONS_PAYLOAD) if versions_from_database.empty?
+
+ changes_exist = false
+ changes_exist = true if update_versions_list
+ changes_exist = true if update_latest
+ changes_exist = true if update_release
+ update_last_updated_timestamp if changes_exist
+
+ payload = { changes_exist: changes_exist, empty_versions: false }
+ payload[:metadata_content] = xml_doc.to_xml(indent: INDENT_SPACE) if changes_exist
+
+ ServiceResponse.success(payload: payload)
+ end
+
+ private
+
+ def valid_metadata_content?
+ versioning_xml_node.present? &&
+ versions_xml_node.present? &&
+ last_updated_xml_node.present?
+ end
+
+ def update_versions_list
+ return false if versions_from_xml == versions_from_database
+
+ version_xml_nodes.remove
+
+ versions_from_database.each do |version|
+ versions_xml_node.add_child(version_node_for(version))
+ end
+ true
+ end
+
+ def update_latest
+ return false if latest_coherent?
+
+ latest_xml_node.content = latest_from_database
+ true
+ end
+
+ def latest_coherent?
+ latest_from_xml.nil? || latest_from_xml == latest_from_database
+ end
+
+ def update_release
+ return false if release_coherent?
+
+ if release_from_database
+ release_xml_node.content = release_from_database
+ else
+ release_xml_node.remove
+ end
+
+ true
+ end
+
+ def release_coherent?
+ release_from_xml == release_from_database
+ end
+
+ def update_last_updated_timestamp
+ last_updated_xml_node.content = Time.zone.now.strftime('%Y%m%d%H%M%S')
+ end
+
+ def versioning_xml_node
+ strong_memoize(:versioning_xml_node) do
+ xml_doc.xpath(XPATH_VERSIONING).first
+ end
+ end
+
+ def versions_xml_node
+ strong_memoize(:versions_xml_node) do
+ versioning_xml_node&.xpath(XPATH_VERSIONS)
+ &.first
+ end
+ end
+
+ def version_xml_nodes
+ versions_xml_node&.xpath(XPATH_VERSION)
+ end
+
+ def latest_xml_node
+ strong_memoize(:latest_xml_node) do
+ versioning_xml_node&.xpath(XPATH_LATEST)
+ &.first
+ end
+ end
+
+ def release_xml_node
+ strong_memoize(:release_xml_node) do
+ versioning_xml_node&.xpath(XPATH_RELEASE)
+ &.first
+ end
+ end
+
+ def last_updated_xml_node
+ strong_memoize(:last_updated_xml_mode) do
+ versioning_xml_node.xpath(XPATH_LAST_UPDATED)
+ .first
+ end
+ end
+
+ def version_node_for(version)
+ Nokogiri::XML::Node.new('version', xml_doc).tap { |node| node.content = version }
+ end
+
+ def versions_from_xml
+ strong_memoize(:versions_from_xml) do
+ versions_xml_node.xpath(XPATH_VERSION)
+ .map(&:text)
+ end
+ end
+
+ def latest_from_xml
+ latest_xml_node&.text
+ end
+
+ def release_from_xml
+ release_xml_node&.text
+ end
+
+ def versions_from_database
+ strong_memoize(:versions_from_database) do
+ @package.project.packages
+ .maven
+ .displayable
+ .with_name(@package.name)
+ .has_version
+ .order_created
+ .pluck_versions
+ end
+ end
+
+ def latest_from_database
+ versions_from_database.last
+ end
+
+ def release_from_database
+ strong_memoize(:release_from_database) do
+ non_snapshot_versions_from_database = versions_from_database.reject { |v| v.ends_with?('SNAPSHOT') }
+ non_snapshot_versions_from_database.last
+ end
+ end
+
+ def xml_doc
+ strong_memoize(:xml_doc) do
+ Nokogiri::XML(@metadata_content) do |config|
+ config.default_xml.noblanks
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/app/services/packages/maven/metadata/sync_service.rb b/app/services/packages/maven/metadata/sync_service.rb
new file mode 100644
index 00000000000..ab45e30c4f7
--- /dev/null
+++ b/app/services/packages/maven/metadata/sync_service.rb
@@ -0,0 +1,78 @@
+# frozen_string_literal: true
+
+module Packages
+ module Maven
+ module Metadata
+ class SyncService < BaseContainerService
+ include Gitlab::Utils::StrongMemoize
+
+ alias_method :project, :container
+
+ MAX_FILE_SIZE = 10.megabytes.freeze
+
+ def execute
+ return error('Blank package name') unless package_name
+ return error('Not allowed') unless Ability.allowed?(current_user, :destroy_package, project)
+ return error('Non existing versionless package') unless versionless_package_for_versions
+ return error('Non existing metadata file for versions') unless metadata_package_file_for_versions
+
+ update_versions_xml
+ end
+
+ private
+
+ def update_versions_xml
+ return error('Metadata file for versions is too big') if metadata_package_file_for_versions.size > MAX_FILE_SIZE
+
+ metadata_package_file_for_versions.file.use_open_file do |file|
+ result = CreateVersionsXmlService.new(metadata_content: file, package: versionless_package_for_versions)
+ .execute
+
+ next result unless result.success?
+ next success('No changes for versions xml') unless result.payload[:changes_exist]
+
+ if result.payload[:empty_versions]
+ versionless_package_for_versions.destroy!
+ success('Versionless package for versions destroyed')
+ else
+ AppendPackageFileService.new(metadata_content: result.payload[:metadata_content], package: versionless_package_for_versions)
+ .execute
+ end
+ end
+ end
+
+ def metadata_package_file_for_versions
+ strong_memoize(:metadata_file_for_versions) do
+ versionless_package_for_versions.package_files
+ .with_file_name(Metadata.filename)
+ .recent
+ .first
+ end
+ end
+
+ def versionless_package_for_versions
+ strong_memoize(:versionless_package_for_versions) do
+ project.packages
+ .maven
+ .displayable
+ .with_name(package_name)
+ .with_version(nil)
+ .first
+ end
+ end
+
+ def package_name
+ params[:package_name]
+ end
+
+ def error(message)
+ ServiceResponse.error(message: message)
+ end
+
+ def success(message)
+ ServiceResponse.success(message: message)
+ end
+ end
+ end
+ end
+end
diff --git a/app/services/packages/nuget/create_package_service.rb b/app/services/packages/nuget/create_package_service.rb
deleted file mode 100644
index 3999ccd3347..00000000000
--- a/app/services/packages/nuget/create_package_service.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-module Packages
- module Nuget
- class CreatePackageService < ::Packages::CreatePackageService
- TEMPORARY_PACKAGE_NAME = 'NuGet.Temporary.Package'
- PACKAGE_VERSION = '0.0.0'
-
- def execute
- create_package!(:nuget,
- name: TEMPORARY_PACKAGE_NAME,
- version: "#{PACKAGE_VERSION}-#{uuid}"
- )
- end
-
- private
-
- def uuid
- SecureRandom.uuid
- end
- end
- end
-end
diff --git a/app/services/packages/nuget/update_package_from_metadata_service.rb b/app/services/packages/nuget/update_package_from_metadata_service.rb
index 0109ee23c49..1bcab00bd92 100644
--- a/app/services/packages/nuget/update_package_from_metadata_service.rb
+++ b/app/services/packages/nuget/update_package_from_metadata_service.rb
@@ -68,7 +68,8 @@ module Packages
def update_linked_package
@package_file.package.update!(
name: package_name,
- version: package_version
+ version: package_version,
+ status: :default
)
::Packages::Nuget::CreateDependencyService.new(@package_file.package, package_dependencies)
diff --git a/app/services/packages/rubygems/dependency_resolver_service.rb b/app/services/packages/rubygems/dependency_resolver_service.rb
new file mode 100644
index 00000000000..c44b26e2b92
--- /dev/null
+++ b/app/services/packages/rubygems/dependency_resolver_service.rb
@@ -0,0 +1,43 @@
+# frozen_string_literal: true
+
+module Packages
+ module Rubygems
+ class DependencyResolverService < BaseService
+ include Gitlab::Utils::StrongMemoize
+
+ DEFAULT_PLATFORM = 'ruby'
+
+ def execute
+ return ServiceResponse.error(message: "forbidden", http_status: :forbidden) unless Ability.allowed?(current_user, :read_package, project)
+ return ServiceResponse.error(message: "#{gem_name} not found", http_status: :not_found) if packages.empty?
+
+ payload = packages.map do |package|
+ dependencies = package.dependency_links.map do |link|
+ [link.dependency.name, link.dependency.version_pattern]
+ end
+
+ {
+ name: gem_name,
+ number: package.version,
+ platform: DEFAULT_PLATFORM,
+ dependencies: dependencies
+ }
+ end
+
+ ServiceResponse.success(payload: payload)
+ end
+
+ private
+
+ def packages
+ strong_memoize(:packages) do
+ project.packages.with_name(gem_name)
+ end
+ end
+
+ def gem_name
+ params[:gem_name]
+ end
+ end
+ end
+end
diff --git a/app/services/pages/legacy_storage_lease.rb b/app/services/pages/legacy_storage_lease.rb
index 3f42fc8c63b..1849def0183 100644
--- a/app/services/pages/legacy_storage_lease.rb
+++ b/app/services/pages/legacy_storage_lease.rb
@@ -8,15 +8,6 @@ module Pages
LEASE_TIMEOUT = 1.hour
- # override method from exclusive lease guard to guard it by feature flag
- # TODO: just remove this method after testing this in production
- # https://gitlab.com/gitlab-org/gitlab/-/issues/282464
- def try_obtain_lease
- return yield unless Feature.enabled?(:pages_use_legacy_storage_lease, project, default_enabled: true)
-
- super
- end
-
def lease_key
"pages_legacy_storage:#{project.id}"
end
diff --git a/app/services/projects/autocomplete_service.rb b/app/services/projects/autocomplete_service.rb
index 53bd954eab6..68086f636b7 100644
--- a/app/services/projects/autocomplete_service.rb
+++ b/app/services/projects/autocomplete_service.rb
@@ -16,7 +16,7 @@ module Projects
finder_params[:group_ids] = @project.group.self_and_ancestors.select(:id) if @project.group
- MilestonesFinder.new(finder_params).execute.select([:iid, :title])
+ MilestonesFinder.new(finder_params).execute.select([:iid, :title, :due_date])
end
def merge_requests
diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb
index 08f569662a8..e3b1fd5f4c0 100644
--- a/app/services/projects/create_service.rb
+++ b/app/services/projects/create_service.rb
@@ -19,6 +19,8 @@ module Projects
@project = Project.new(params)
+ @project.visibility_level = @project.group.visibility_level unless @project.visibility_level_allowed_by_group?
+
# If a project is newly created it should have shared runners settings
# based on its group having it enabled. This is like the "default value"
@project.shared_runners_enabled = false if !params.key?(:shared_runners_enabled) && @project.group && @project.group.shared_runners_setting != 'enabled'
diff --git a/app/services/projects/destroy_service.rb b/app/services/projects/destroy_service.rb
index c1501625300..6840c395a76 100644
--- a/app/services/projects/destroy_service.rb
+++ b/app/services/projects/destroy_service.rb
@@ -107,12 +107,7 @@ module Projects
end
project.leave_pool_repository
-
- if Gitlab::Ci::Features.project_transactionless_destroy?(project)
- destroy_project_related_records(project)
- else
- Project.transaction { destroy_project_related_records(project) }
- end
+ destroy_project_related_records(project)
end
def destroy_project_related_records(project)
diff --git a/app/services/projects/schedule_bulk_repository_shard_moves_service.rb b/app/services/projects/schedule_bulk_repository_shard_moves_service.rb
index 53de9abdb59..98fc2e22967 100644
--- a/app/services/projects/schedule_bulk_repository_shard_moves_service.rb
+++ b/app/services/projects/schedule_bulk_repository_shard_moves_service.rb
@@ -25,7 +25,7 @@ module Projects
override :schedule_bulk_worker_klass
def self.schedule_bulk_worker_klass
- ::ProjectScheduleBulkRepositoryShardMovesWorker
+ ::Projects::ScheduleBulkRepositoryShardMovesWorker
end
end
end
diff --git a/app/services/projects/update_pages_configuration_service.rb b/app/services/projects/update_pages_configuration_service.rb
index 67d388dc8a3..01539d58545 100644
--- a/app/services/projects/update_pages_configuration_service.rb
+++ b/app/services/projects/update_pages_configuration_service.rb
@@ -11,6 +11,8 @@ module Projects
end
def execute
+ return success unless Feature.enabled?(:pages_update_legacy_storage, default_enabled: true)
+
# If the pages were never deployed, we can't write out the config, as the
# directory would not exist.
# https://gitlab.com/gitlab-org/gitlab/-/issues/235139
diff --git a/app/services/projects/update_pages_service.rb b/app/services/projects/update_pages_service.rb
index 29e92d725e2..2b59fdd539d 100644
--- a/app/services/projects/update_pages_service.rb
+++ b/app/services/projects/update_pages_service.rb
@@ -33,6 +33,7 @@ module Projects
@status = create_status
@status.enqueue!
@status.run!
+ @status.update_older_statuses_retried! if Feature.enabled?(:ci_fix_commit_status_retried, project, default_enabled: :yaml)
raise InvalidStateError, 'missing pages artifacts' unless build.artifacts?
raise InvalidStateError, 'build SHA is outdated for this ref' unless latest?
diff --git a/app/services/protected_branches/api_service.rb b/app/services/protected_branches/api_service.rb
index ac4917d6590..bf1a966472b 100644
--- a/app/services/protected_branches/api_service.rb
+++ b/app/services/protected_branches/api_service.rb
@@ -9,10 +9,15 @@ module ProtectedBranches
def protected_branch_params
{
name: params[:name],
+ allow_force_push: allow_force_push?,
push_access_levels_attributes: AccessLevelParams.new(:push, params).access_levels,
merge_access_levels_attributes: AccessLevelParams.new(:merge, params).access_levels
}
end
+
+ def allow_force_push?
+ params[:allow_force_push] || false
+ end
end
end
diff --git a/app/services/repositories/changelog_service.rb b/app/services/repositories/changelog_service.rb
index 96a63865a49..3981e91e7f3 100644
--- a/app/services/repositories/changelog_service.rb
+++ b/app/services/repositories/changelog_service.rb
@@ -39,10 +39,10 @@ module Repositories
project,
user,
version:,
- to:,
+ branch: project.default_branch_or_master,
from: nil,
+ to: branch,
date: DateTime.now,
- branch: project.default_branch_or_master,
trailer: DEFAULT_TRAILER,
file: DEFAULT_FILE,
message: "Add changelog for version #{version}"
@@ -73,7 +73,7 @@ module Repositories
.new(version: @version, date: @date, config: config)
commits =
- CommitsWithTrailerFinder.new(project: @project, from: from, to: @to)
+ ChangelogCommitsFinder.new(project: @project, from: from, to: @to)
commits.each_page(@trailer) do |page|
mrs = mrs_finder.execute(page)
diff --git a/app/services/security/vulnerability_uuid.rb b/app/services/security/vulnerability_uuid.rb
new file mode 100644
index 00000000000..3eab0f3dad6
--- /dev/null
+++ b/app/services/security/vulnerability_uuid.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Security
+ class VulnerabilityUUID
+ def self.generate(report_type:, primary_identifier_fingerprint:, location_fingerprint:, project_id:)
+ Gitlab::UUID.v5("#{report_type}-#{primary_identifier_fingerprint}-#{location_fingerprint}-#{project_id}")
+ end
+ end
+end
diff --git a/app/services/snippets/schedule_bulk_repository_shard_moves_service.rb b/app/services/snippets/schedule_bulk_repository_shard_moves_service.rb
index f7bdd0a99a5..09eac8e6cda 100644
--- a/app/services/snippets/schedule_bulk_repository_shard_moves_service.rb
+++ b/app/services/snippets/schedule_bulk_repository_shard_moves_service.rb
@@ -25,7 +25,7 @@ module Snippets
override :schedule_bulk_worker_klass
def self.schedule_bulk_worker_klass
- ::SnippetScheduleBulkRepositoryShardMovesWorker
+ ::Snippets::ScheduleBulkRepositoryShardMovesWorker
end
end
end
diff --git a/app/services/spam/spam_action_service.rb b/app/services/spam/spam_action_service.rb
index ff32bc32d93..185b9e39070 100644
--- a/app/services/spam/spam_action_service.rb
+++ b/app/services/spam/spam_action_service.rb
@@ -9,7 +9,9 @@ module Spam
# after the spammable is created/updated based on the remaining parameters.
#
# Takes a hash of parameters from an incoming request to modify a model (via a controller,
- # service, or GraphQL mutation).
+ # service, or GraphQL mutation). The parameters will either be camelCase (if they are
+ # received directly via controller params) or underscore_case (if they have come from
+ # a GraphQL mutation which has converted them to underscore)
#
# Deletes the parameters which are related to spam and captcha processing, and returns
# them in a SpamParams parameters object. See:
@@ -18,12 +20,12 @@ module Spam
# NOTE: The 'captcha_response' field can be expanded to multiple fields when we move to future
# alternative captcha implementations such as FriendlyCaptcha. See
# https://gitlab.com/gitlab-org/gitlab/-/issues/273480
- captcha_response = params.delete(:captcha_response)
+ captcha_response = params.delete(:captcha_response) || params.delete(:captchaResponse)
SpamParams.new(
api: params.delete(:api),
captcha_response: captcha_response,
- spam_log_id: params.delete(:spam_log_id)
+ spam_log_id: params.delete(:spam_log_id) || params.delete(:spamLogId)
)
end
diff --git a/app/services/system_hooks_service.rb b/app/services/system_hooks_service.rb
index 5273dedb56f..d854b95cb93 100644
--- a/app/services/system_hooks_service.rb
+++ b/app/services/system_hooks_service.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class SystemHooksService
- BUILDER_DRIVEN_EVENT_DATA_AVAILABLE_FOR_CLASSES = [GroupMember, Group].freeze
+ BUILDER_DRIVEN_EVENT_DATA_AVAILABLE_FOR_CLASSES = [GroupMember, Group, ProjectMember].freeze
def execute_hooks_for(model, event)
data = build_event_data(model, event)
@@ -56,22 +56,13 @@ class SystemHooksService
when :failed_login
data[:state] = model.state
end
- when ProjectMember
- data.merge!(project_member_data(model))
end
data
end
def build_event_name(model, event)
- case model
- when ProjectMember
- return "user_add_to_team" if event == :create
- return "user_remove_from_team" if event == :destroy
- return "user_update_for_team" if event == :update
- else
- "#{model.class.name.downcase}_#{event}"
- end
+ "#{model.class.name.downcase}_#{event}"
end
def project_data(model)
@@ -88,23 +79,6 @@ class SystemHooksService
}
end
- def project_member_data(model)
- project = model.project || Project.unscoped.find(model.source_id)
-
- {
- project_name: project.name,
- project_path: project.path,
- project_path_with_namespace: project.full_path,
- project_id: project.id,
- user_username: model.user.username,
- user_name: model.user.name,
- user_email: model.user.email,
- user_id: model.user.id,
- access_level: model.human_access,
- project_visibility: Project.visibility_levels.key(project.visibility_level_value).downcase
- }
- end
-
def user_data(model)
{
name: model.name,
@@ -124,6 +98,8 @@ class SystemHooksService
Gitlab::HookData::GroupMemberBuilder
when Group
Gitlab::HookData::GroupBuilder
+ when ProjectMember
+ Gitlab::HookData::ProjectMemberBuilder
end
builder_class.new(model).build(event)
diff --git a/app/services/system_note_service.rb b/app/services/system_note_service.rb
index 7d654ca7f5b..082ed93eca2 100644
--- a/app/services/system_note_service.rb
+++ b/app/services/system_note_service.rb
@@ -175,7 +175,7 @@ module SystemNoteService
# Example Note text is based on event_type:
#
# update: "changed target branch from `Old` to `New`"
- # delete: "changed automatically target branch to `New` because `Old` was deleted"
+ # delete: "deleted the `Old` branch. This merge request now targets the `New` branch"
#
# Returns the created Note object
def change_branch(noteable, project, author, branch_type, event_type, old_branch, new_branch)
@@ -241,6 +241,10 @@ module SystemNoteService
::SystemNotes::IssuablesService.new(noteable: noteable, project: project, author: author).mark_canonical_issue_of_duplicate(duplicate_issue)
end
+ def add_email_participants(noteable, project, author, body)
+ ::SystemNotes::IssuablesService.new(noteable: noteable, project: project, author: author).add_email_participants(body)
+ end
+
def discussion_lock(issuable, author)
::SystemNotes::IssuablesService.new(noteable: issuable, project: issuable.project, author: author).discussion_lock
end
@@ -323,6 +327,10 @@ module SystemNoteService
::SystemNotes::IncidentService.new(noteable: incident, project: incident.project, author: author).change_incident_severity
end
+ def log_resolving_alert(alert, monitoring_tool)
+ ::SystemNotes::AlertManagementService.new(noteable: alert, project: alert.project).log_resolving_alert(monitoring_tool)
+ end
+
private
def merge_requests_service(noteable, project, author)
diff --git a/app/services/system_notes/alert_management_service.rb b/app/services/system_notes/alert_management_service.rb
index 376f2c1cfbf..27ddf2e36f1 100644
--- a/app/services/system_notes/alert_management_service.rb
+++ b/app/services/system_notes/alert_management_service.rb
@@ -62,5 +62,20 @@ module SystemNotes
create_note(NoteSummary.new(noteable, project, author, body, action: 'status'))
end
+
+ # Called when an alert is resolved due to received resolving alert payload
+ #
+ # alert - AlertManagement::Alert object.
+ #
+ # Example Note text:
+ #
+ # "changed the status to Resolved by closing issue #17"
+ #
+ # Returns the created Note object
+ def log_resolving_alert(monitoring_tool)
+ body = "logged a resolving alert from **#{monitoring_tool}**"
+
+ create_note(NoteSummary.new(noteable, project, User.alert_bot, body, action: 'new_alert_added'))
+ end
end
end
diff --git a/app/services/system_notes/issuables_service.rb b/app/services/system_notes/issuables_service.rb
index b344b240a07..60dd56e772a 100644
--- a/app/services/system_notes/issuables_service.rb
+++ b/app/services/system_notes/issuables_service.rb
@@ -125,8 +125,8 @@ module SystemNotes
old_diffs, new_diffs = Gitlab::Diff::InlineDiff.new(old_title, new_title).inline_diffs
- marked_old_title = Gitlab::Diff::InlineDiffMarkdownMarker.new(old_title).mark(old_diffs, mode: :deletion)
- marked_new_title = Gitlab::Diff::InlineDiffMarkdownMarker.new(new_title).mark(new_diffs, mode: :addition)
+ marked_old_title = Gitlab::Diff::InlineDiffMarkdownMarker.new(old_title).mark(old_diffs)
+ marked_new_title = Gitlab::Diff::InlineDiffMarkdownMarker.new(new_title).mark(new_diffs)
body = "changed title from **#{marked_old_title}** to **#{marked_new_title}**"
@@ -354,6 +354,10 @@ module SystemNotes
create_note(NoteSummary.new(noteable, project, author, body, action: 'duplicate'))
end
+ def add_email_participants(body)
+ create_note(NoteSummary.new(noteable, project, author, body))
+ end
+
def discussion_lock
action = noteable.discussion_locked? ? 'locked' : 'unlocked'
body = "#{action} this #{noteable.class.to_s.titleize.downcase}"
diff --git a/app/services/system_notes/merge_requests_service.rb b/app/services/system_notes/merge_requests_service.rb
index 99e03e67bf1..546a23c95c2 100644
--- a/app/services/system_notes/merge_requests_service.rb
+++ b/app/services/system_notes/merge_requests_service.rb
@@ -90,14 +90,14 @@ module SystemNotes
# Example Note text is based on event_type:
#
# update: "changed target branch from `Old` to `New`"
- # delete: "changed automatically target branch to `New` because `Old` was deleted"
+ # delete: "deleted the `Old` branch. This merge request now targets the `New` branch"
#
# Returns the created Note object
def change_branch(branch_type, event_type, old_branch, new_branch)
body =
case event_type.to_s
when 'delete'
- "changed automatically #{branch_type} branch to `#{new_branch}` because `#{old_branch}` was deleted"
+ "deleted the `#{old_branch}` branch. This merge request now targets the `#{new_branch}` branch"
when 'update'
"changed #{branch_type} branch from `#{old_branch}` to `#{new_branch}`"
else
diff --git a/app/services/terraform/remote_state_handler.rb b/app/services/terraform/remote_state_handler.rb
index 9500a821071..db47bc024ba 100644
--- a/app/services/terraform/remote_state_handler.rb
+++ b/app/services/terraform/remote_state_handler.rb
@@ -60,7 +60,7 @@ module Terraform
private
def retrieve_with_lock(find_only: false)
- create_or_find!(find_only: find_only).tap { |state| retry_optimistic_lock(state) { |state| yield state } }
+ create_or_find!(find_only: find_only).tap { |state| retry_optimistic_lock(state, name: 'terraform_remote_state_handler_retrieve') { |state| yield state } }
end
def create_or_find!(find_only:)
diff --git a/app/services/users/build_service.rb b/app/services/users/build_service.rb
index e3f02bf85f0..b3b172f9df2 100644
--- a/app/services/users/build_service.rb
+++ b/app/services/users/build_service.rb
@@ -83,7 +83,8 @@ module Users
:location,
:public_email,
:user_type,
- :note
+ :note,
+ :view_diffs_file_by_file
]
end
diff --git a/app/services/users/dismiss_user_callout_service.rb b/app/services/users/dismiss_user_callout_service.rb
new file mode 100644
index 00000000000..f05c44186bb
--- /dev/null
+++ b/app/services/users/dismiss_user_callout_service.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module Users
+ class DismissUserCalloutService < BaseContainerService
+ def execute
+ current_user.find_or_initialize_callout(params[:feature_name]).tap do |callout|
+ callout.update(dismissed_at: Time.current) if callout.valid?
+ end
+ end
+ end
+end
diff --git a/app/services/users/refresh_authorized_projects_service.rb b/app/services/users/refresh_authorized_projects_service.rb
index 24e3fb73370..070713929e4 100644
--- a/app/services/users/refresh_authorized_projects_service.rb
+++ b/app/services/users/refresh_authorized_projects_service.rb
@@ -92,7 +92,7 @@ module Users
# remove - The IDs of the authorization rows to remove.
# add - Rows to insert in the form `[user id, project id, access level]`
def update_authorizations(remove = [], add = [])
- log_refresh_details(remove.length, add.length)
+ log_refresh_details(remove, add)
User.transaction do
user.remove_project_authorizations(remove) unless remove.empty?
@@ -104,11 +104,16 @@ module Users
user.reset
end
- def log_refresh_details(rows_deleted, rows_added)
+ def log_refresh_details(remove, add)
Gitlab::AppJsonLogger.info(event: 'authorized_projects_refresh',
+ user_id: user.id,
'authorized_projects_refresh.source': source,
- 'authorized_projects_refresh.rows_deleted': rows_deleted,
- 'authorized_projects_refresh.rows_added': rows_added)
+ 'authorized_projects_refresh.rows_deleted_count': remove.length,
+ 'authorized_projects_refresh.rows_added_count': add.length,
+ # most often there's only a few entries in remove and add, but limit it to the first 5
+ # entries to avoid flooding the logs
+ 'authorized_projects_refresh.rows_deleted_slice': remove.first(5),
+ 'authorized_projects_refresh.rows_added_slice': add.first(5))
end
def fresh_access_levels_per_project
diff --git a/app/uploaders/dependency_proxy/file_uploader.rb b/app/uploaders/dependency_proxy/file_uploader.rb
index b67a22bae4d..c46539bafaa 100644
--- a/app/uploaders/dependency_proxy/file_uploader.rb
+++ b/app/uploaders/dependency_proxy/file_uploader.rb
@@ -3,6 +3,7 @@
class DependencyProxy::FileUploader < GitlabUploader
include ObjectStorage::Concern
+ before :cache, :set_content_type
storage_options Gitlab.config.dependency_proxy
alias_method :upload, :model
@@ -17,6 +18,17 @@ class DependencyProxy::FileUploader < GitlabUploader
private
+ # Docker manifests return a custom content type
+ # GCP will only use the content-type that is stored with the file
+ # and will not allow it to be overwritten when downloaded
+ # so we must store the custom content type in object storage.
+ # This does not apply to DependencyProxy::Blob uploads.
+ def set_content_type(file)
+ return unless model.class == DependencyProxy::Manifest
+
+ file.content_type = model.content_type
+ end
+
def dynamic_segment
Gitlab::HashedPath.new('dependency_proxy', model.group_id, 'files', model.id, root_hash: model.group_id)
end
diff --git a/app/validators/gitlab/utils/zoom_url_validator.rb b/app/validators/gitlab/utils/zoom_url_validator.rb
new file mode 100644
index 00000000000..57e30dcefa6
--- /dev/null
+++ b/app/validators/gitlab/utils/zoom_url_validator.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+# Gitlab::Utils::ZoomUrlValidator
+#
+# Custom validator for zoom urls
+#
+module Gitlab
+ module Utils
+ class ZoomUrlValidator < ActiveModel::EachValidator
+ ALLOWED_SCHEMES = %w(https).freeze
+
+ def validate_each(record, attribute, value)
+ links_count = Gitlab::ZoomLinkExtractor.new(value).links.size
+ valid = Gitlab::UrlSanitizer.valid?(value, allowed_schemes: ALLOWED_SCHEMES)
+
+ return if links_count == 1 && valid
+
+ record.errors.add(:url, 'must contain one valid Zoom URL')
+ end
+ end
+ end
+end
diff --git a/app/validators/json_schemas/security_scan_info.json b/app/validators/json_schemas/security_scan_info.json
new file mode 100644
index 00000000000..c8932c1870d
--- /dev/null
+++ b/app/validators/json_schemas/security_scan_info.json
@@ -0,0 +1,28 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "type": "object",
+ "title": "Security::Scan#info schema",
+ "description": "The schema validates the content of the Security::Scan#info attribute",
+ "additionalProperties": false,
+ "properties": {
+ "errors": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "type": {
+ "type": "string"
+ },
+ "message": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "type",
+ "message"
+ ]
+ }
+ }
+ }
+}
diff --git a/app/validators/json_schemas/vulnerability_finding_details.json b/app/validators/json_schemas/vulnerability_finding_details.json
index f2940866f4b..2ba1fc9e9db 100644
--- a/app/validators/json_schemas/vulnerability_finding_details.json
+++ b/app/validators/json_schemas/vulnerability_finding_details.json
@@ -6,60 +6,67 @@
"^.*$": {
"allOf": [
{ "$ref": "#/definitions/named_field" },
- { "$ref": "#/definitions/type_list" }
+ { "$ref": "#/definitions/detail_type" }
]
}
},
"definitions": {
- "type_list": {
+ "detail_type": {
"oneOf": [
{ "$ref": "#/definitions/named_list" },
{ "$ref": "#/definitions/list" },
{ "$ref": "#/definitions/table" },
-
{ "$ref": "#/definitions/text" },
{ "$ref": "#/definitions/url" },
{ "$ref": "#/definitions/code" },
- { "$ref": "#/definitions/int" },
-
+ { "$ref": "#/definitions/value" },
+ { "$ref": "#/definitions/diff" },
+ { "$ref": "#/definitions/markdown" },
{ "$ref": "#/definitions/commit" },
{ "$ref": "#/definitions/file_location" },
{ "$ref": "#/definitions/module_location" }
]
},
- "lang_text": {
- "type": "object",
- "required": [ "value", "lang" ],
- "properties": {
- "lang": { "type": "string" },
- "value": { "type": "string" }
- }
- },
- "lang_text_list": {
- "type": "array",
- "items": { "$ref": "#/definitions/lang_text" }
+ "text_value": {
+ "type": "string"
},
"named_field": {
"type": "object",
- "required": [ "name" ],
+ "required": [
+ "name"
+ ],
"properties": {
- "name": { "$ref": "#/definitions/lang_text_list" },
- "description": { "$ref": "#/definitions/lang_text_list" }
+ "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" ],
+ "required": [
+ "type",
+ "items"
+ ],
"properties": {
- "type": { "const": "named-list" },
+ "type": {
+ "const": "named-list"
+ },
"items": {
"type": "object",
"patternProperties": {
"^.*$": {
"allOf": [
- { "$ref": "#/definitions/named_field" },
- { "$ref": "#/definitions/type_list" }
+ {
+ "$ref": "#/definitions/named_field"
+ },
+ {
+ "$ref": "#/definitions/detail_type"
+ }
]
}
}
@@ -69,38 +76,45 @@
"list": {
"type": "object",
"description": "A list of typed fields",
- "required": [ "type", "items" ],
+ "required": [
+ "type",
+ "items"
+ ],
"properties": {
- "type": { "const": "list" },
+ "type": {
+ "const": "list"
+ },
"items": {
"type": "array",
- "items": { "$ref": "#/definitions/type_list" }
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
}
}
},
"table": {
"type": "object",
"description": "A table of typed fields",
- "required": [],
+ "required": [
+ "type",
+ "rows"
+ ],
"properties": {
- "type": { "const": "table" },
- "items": {
- "type": "object",
- "properties": {
- "header": {
- "type": "array",
- "items": {
- "$ref": "#/definitions/type_list"
- }
- },
- "rows": {
- "type": "array",
- "items": {
- "type": "array",
- "items": {
- "$ref": "#/definitions/type_list"
- }
- }
+ "type": {
+ "const": "table"
+ },
+ "header": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ },
+ "rows": {
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
}
}
}
@@ -109,73 +123,171 @@
"text": {
"type": "object",
"description": "Raw text",
- "required": [ "type", "value" ],
+ "required": [
+ "type",
+ "value"
+ ],
"properties": {
- "type": { "const": "text" },
- "value": { "$ref": "#/definitions/lang_text_list" }
+ "type": {
+ "const": "text"
+ },
+ "value": {
+ "$ref": "#/definitions/text_value"
+ }
}
},
"url": {
"type": "object",
"description": "A single URL",
- "required": [ "type", "href" ],
+ "required": [
+ "type",
+ "href"
+ ],
"properties": {
- "type": { "const": "url" },
- "text": { "$ref": "#/definitions/lang_text_list" },
- "href": { "type": "string" }
+ "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" ],
+ "required": [
+ "type",
+ "value"
+ ],
"properties": {
- "type": { "const": "code" },
- "value": { "type": "string" },
- "lang": { "type": "string" }
+ "type": {
+ "const": "code"
+ },
+ "value": {
+ "type": "string"
+ },
+ "lang": {
+ "type": "string",
+ "description": "A programming language"
+ }
}
},
- "int": {
+ "value": {
"type": "object",
- "description": "An integer",
- "required": [ "type", "value" ],
+ "description": "A field that can store a range of types of value",
+ "required": ["type", "value"],
"properties": {
- "type": { "const": "int" },
- "value": { "type": "integer" },
- "format": {
- "type": "string",
- "enum": [ "default", "hex" ]
+ "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 specific commit within the project",
- "required": [ "type", "value" ],
+ "description": "A commit/tag/branch within the GitLab project",
+ "required": [
+ "type",
+ "value"
+ ],
"properties": {
- "type": { "const": "commit" },
- "value": { "type": "string", "description": "The commit SHA" }
+ "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" ],
+ "required": [
+ "type",
+ "file_name",
+ "line_start"
+ ],
"properties": {
- "type": { "const": "file-location" },
- "file_name": { "type": "string" },
- "line_start": { "type": "integer" },
- "line_end": { "type": "integer" }
+ "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" ],
+ "required": [
+ "type",
+ "module_name",
+ "offset"
+ ],
"properties": {
- "type": { "const": "module-location" },
- "module_name": { "type": "string" },
- "offset": { "type": "integer" }
+ "type": {
+ "const": "module-location"
+ },
+ "module_name": {
+ "type": "string",
+ "minLength": 1,
+ "examples": ["compiled_binary"]
+ },
+ "offset": {
+ "type": "integer",
+ "examples": [100]
+ }
}
}
}
diff --git a/app/validators/zoom_url_validator.rb b/app/validators/zoom_url_validator.rb
deleted file mode 100644
index e0f8e4e34a2..00000000000
--- a/app/validators/zoom_url_validator.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-# ZoomUrlValidator
-#
-# Custom validator for zoom urls
-#
-class ZoomUrlValidator < ActiveModel::EachValidator
- ALLOWED_SCHEMES = %w(https).freeze
-
- def validate_each(record, attribute, value)
- links_count = Gitlab::ZoomLinkExtractor.new(value).links.size
- valid = Gitlab::UrlSanitizer.valid?(value, allowed_schemes: ALLOWED_SCHEMES)
-
- return if links_count == 1 && valid
-
- record.errors.add(:url, 'must contain one valid Zoom URL')
- end
-end
diff --git a/app/views/abuse_reports/new.html.haml b/app/views/abuse_reports/new.html.haml
index 09b16c54700..78fa16c13a5 100644
--- a/app/views/abuse_reports/new.html.haml
+++ b/app/views/abuse_reports/new.html.haml
@@ -25,4 +25,4 @@
= _("Explain the problem. If appropriate, provide a link to the relevant issue or comment.")
.form-actions
- = f.submit _("Send report"), class: "gl-button btn btn-success"
+ = f.submit _("Send report"), class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/appearances/_form.html.haml b/app/views/admin/appearances/_form.html.haml
index e6f12f4785a..1aaea1999e5 100644
--- a/app/views/admin/appearances/_form.html.haml
+++ b/app/views/admin/appearances/_form.html.haml
@@ -101,7 +101,7 @@
= parsed_with_gfm
.gl-mt-3.gl-mb-3
- = f.submit 'Update appearance settings', class: 'btn gl-button btn-success'
+ = f.submit 'Update appearance settings', class: 'btn gl-button btn-confirm'
- if @appearance.persisted? || @appearance.updated_at
.mt-4
- if @appearance.persisted?
diff --git a/app/views/admin/appearances/preview_sign_in.html.haml b/app/views/admin/appearances/preview_sign_in.html.haml
index 6e5bb45c3cc..f972b3b5cbf 100644
--- a/app/views/admin/appearances/preview_sign_in.html.haml
+++ b/app/views/admin/appearances/preview_sign_in.html.haml
@@ -8,5 +8,5 @@
= label_tag :password
= password_field_tag :password, nil, class: "form-control gl-form-input bottom", title: 'This field is required.'
.form-group
- = button_tag "Sign in", class: "btn gl-button btn-success"
+ = button_tag "Sign in", class: "btn gl-button btn-confirm"
diff --git a/app/views/admin/application_settings/_abuse.html.haml b/app/views/admin/application_settings/_abuse.html.haml
index ea9bdbed9ae..f050c0816b1 100644
--- a/app/views/admin/application_settings/_abuse.html.haml
+++ b/app/views/admin/application_settings/_abuse.html.haml
@@ -8,4 +8,4 @@
.form-text.text-muted
Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area.
- = f.submit 'Save changes', class: "gl-button btn btn-success"
+ = f.submit 'Save changes', class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/application_settings/_account_and_limit.html.haml b/app/views/admin/application_settings/_account_and_limit.html.haml
index 009e0732911..2e5cf156a65 100644
--- a/app/views/admin/application_settings/_account_and_limit.html.haml
+++ b/app/views/admin/application_settings/_account_and_limit.html.haml
@@ -65,4 +65,4 @@
= 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
- = f.submit _('Save changes'), class: 'gl-button btn btn-success qa-save-changes-button'
+ = f.submit _('Save changes'), class: 'gl-button btn btn-confirm qa-save-changes-button'
diff --git a/app/views/admin/application_settings/_ci_cd.html.haml b/app/views/admin/application_settings/_ci_cd.html.haml
index f11770b397e..0af244d54f3 100644
--- a/app/views/admin/application_settings/_ci_cd.html.haml
+++ b/app/views/admin/application_settings/_ci_cd.html.haml
@@ -68,4 +68,4 @@
= _("The default CI configuration path for new projects.").html_safe
= link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'custom-cicd-configuration-path'), target: '_blank'
- = f.submit _('Save changes'), class: "gl-button btn btn-success"
+ = f.submit _('Save changes'), class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/application_settings/_diff_limits.html.haml b/app/views/admin/application_settings/_diff_limits.html.haml
index 494558a6c2d..c5ae5c579ad 100644
--- a/app/views/admin/application_settings/_diff_limits.html.haml
+++ b/app/views/admin/application_settings/_diff_limits.html.haml
@@ -12,4 +12,4 @@
= link_to sprite_icon('question-o'),
help_page_path('user/admin_area/diff_limits',
anchor: 'maximum-diff-patch-size')
- = f.submit _('Save changes'), class: 'gl-button btn btn-success'
+ = f.submit _('Save changes'), class: 'gl-button btn btn-confirm'
diff --git a/app/views/admin/application_settings/_eks.html.haml b/app/views/admin/application_settings/_eks.html.haml
index 8897d0eb14b..1ddf927ed13 100644
--- a/app/views/admin/application_settings/_eks.html.haml
+++ b/app/views/admin/application_settings/_eks.html.haml
@@ -3,8 +3,8 @@
.settings-header
%h4
= _('Amazon EKS')
- %button.btn.gl-button.js-settings-toggle{ type: 'button' }
- = expanded ? 'Collapse' : 'Expand'
+ %button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
+ = expanded ? _('Collapse') : _('Expand')
%p
= _('Amazon EKS integration allows you to provision EKS clusters from GitLab.')
@@ -33,4 +33,4 @@
.form-text.text-muted
= _('AWS Secret Access Key. Only required if not using role instance credentials')
- = f.submit 'Save changes', class: "gl-button btn btn-success"
+ = f.submit 'Save changes', class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/application_settings/_email.html.haml b/app/views/admin/application_settings/_email.html.haml
index 89946c63bb0..b22aaabe41a 100644
--- a/app/views/admin/application_settings/_email.html.haml
+++ b/app/views/admin/application_settings/_email.html.haml
@@ -25,4 +25,12 @@
= render_if_exists 'admin/application_settings/email_additional_text_setting', form: f
- = f.submit _('Save changes'), class: "gl-button btn btn-success", data: { qa_selector: 'save_changes_button' }
+ .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
+ = _('By default, GitLab sends emails to help guide users through the onboarding process.')
+
+ = 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 07256c9f4fe..97e09476e78 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
@@ -47,4 +47,4 @@
.form-group
= f.label :external_authorization_service_default_label, _('Default classification label'), class: 'label-bold'
= f.text_field :external_authorization_service_default_label, class: 'form-control gl-form-input'
- = f.submit 'Save changes', class: "gl-button btn btn-success"
+ = f.submit 'Save changes', class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/application_settings/_gitaly.html.haml b/app/views/admin/application_settings/_gitaly.html.haml
index 56ec35d9329..72e7cb0b437 100644
--- a/app/views/admin/application_settings/_gitaly.html.haml
+++ b/app/views/admin/application_settings/_gitaly.html.haml
@@ -24,4 +24,4 @@
.form-text.text-muted
Medium operation timeout (in seconds). This should be a value between the Fast and the Default timeout.
- = f.submit 'Save changes', class: "gl-button btn btn-success"
+ = f.submit 'Save changes', class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/application_settings/_gitpod.html.haml b/app/views/admin/application_settings/_gitpod.html.haml
index cca81136bb9..531ddcdb86f 100644
--- a/app/views/admin/application_settings/_gitpod.html.haml
+++ b/app/views/admin/application_settings/_gitpod.html.haml
@@ -25,4 +25,4 @@
= f.text_field :gitpod_url, class: 'form-control gl-form-input', placeholder: s_('Gitpod|e.g. https://gitpod.example.com')
.form-text.text-muted
= s_('Gitpod|Add the URL to your Gitpod instance configured to read your GitLab projects.')
- = f.submit s_('Save changes'), class: 'gl-button btn btn-success'
+ = f.submit s_('Save changes'), class: 'gl-button btn btn-confirm'
diff --git a/app/views/admin/application_settings/_grafana.html.haml b/app/views/admin/application_settings/_grafana.html.haml
index 368b4db4549..fd9e7ee50c4 100644
--- a/app/views/admin/application_settings/_grafana.html.haml
+++ b/app/views/admin/application_settings/_grafana.html.haml
@@ -14,4 +14,4 @@
= f.label :grafana_url, _('Grafana URL'), class: 'label-bold'
= f.text_field :grafana_url, class: 'form-control gl-form-input', placeholder: '/-/grafana'
- = f.submit _('Save changes'), class: "gl-button btn btn-success"
+ = f.submit _('Save changes'), class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/application_settings/_help_page.html.haml b/app/views/admin/application_settings/_help_page.html.haml
index 858df44bd98..e7816f5a1c0 100644
--- a/app/views/admin/application_settings/_help_page.html.haml
+++ b/app/views/admin/application_settings/_help_page.html.haml
@@ -23,4 +23,4 @@
= f.label :help_page_documentation_base_url, _('Documentation pages URL'), class: 'label-bold'
= f.text_field :help_page_documentation_base_url, class: 'form-control gl-form-input', placeholder: 'https://docs.gitlab.com'
- = f.submit _('Save changes'), class: "gl-button btn btn-success"
+ = f.submit _('Save changes'), class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/application_settings/_import_export_limits.html.haml b/app/views/admin/application_settings/_import_export_limits.html.haml
index e1a58c888a5..820c11279d5 100644
--- a/app/views/admin/application_settings/_import_export_limits.html.haml
+++ b/app/views/admin/application_settings/_import_export_limits.html.haml
@@ -31,4 +31,4 @@
= f.label :group_download_export_limit, _('Max Group Export Download requests per minute per user'), class: 'label-bold'
= f.number_field :group_download_export_limit, class: 'form-control gl-form-input'
- = f.submit 'Save changes', class: "gl-button btn btn-success", data: { qa_selector: 'save_changes_button' }
+ = f.submit 'Save changes', class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' }
diff --git a/app/views/admin/application_settings/_initial_branch_name.html.haml b/app/views/admin/application_settings/_initial_branch_name.html.haml
index e7718f94b90..b5c178641df 100644
--- a/app/views/admin/application_settings/_initial_branch_name.html.haml
+++ b/app/views/admin/application_settings/_initial_branch_name.html.haml
@@ -10,4 +10,4 @@
%span.form-text.text-muted
= (_("Changes affect new repositories only. If not specified, Git's default name %{branch_name_default} will be used.") % { branch_name_default: fallback_branch_name } ).html_safe
- = f.submit _('Save changes'), class: 'gl-button btn-success'
+ = f.submit _('Save changes'), class: 'gl-button btn-confirm'
diff --git a/app/views/admin/application_settings/_ip_limits.html.haml b/app/views/admin/application_settings/_ip_limits.html.haml
index a603eaec913..18d71a90e34 100644
--- a/app/views/admin/application_settings/_ip_limits.html.haml
+++ b/app/views/admin/application_settings/_ip_limits.html.haml
@@ -57,4 +57,4 @@
= _('A plain-text response to show to clients that hit the rate limit.')
= f.text_area :rate_limiting_response_text, placeholder: ::Gitlab::Throttle::DEFAULT_RATE_LIMITING_RESPONSE_TEXT, class: 'form-control gl-form-input', rows: 5
- = f.submit 'Save changes', class: "gl-button btn btn-success", data: { qa_selector: 'save_changes_button' }
+ = f.submit 'Save changes', class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' }
diff --git a/app/views/admin/application_settings/_issue_limits.html.haml b/app/views/admin/application_settings/_issue_limits.html.haml
index e16561b4489..0e1ba8c9c88 100644
--- a/app/views/admin/application_settings/_issue_limits.html.haml
+++ b/app/views/admin/application_settings/_issue_limits.html.haml
@@ -6,4 +6,4 @@
= f.label :issues_create_limit, 'Max requests per minute per user', class: 'label-bold'
= f.number_field :issues_create_limit, class: 'form-control gl-form-input'
- = f.submit 'Save changes', class: "gl-button btn btn-success", data: { qa_selector: 'save_changes_button' }
+ = f.submit 'Save changes', class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' }
diff --git a/app/views/admin/application_settings/_kroki.html.haml b/app/views/admin/application_settings/_kroki.html.haml
index cd57d4cca65..fc51942ed1f 100644
--- a/app/views/admin/application_settings/_kroki.html.haml
+++ b/app/views/admin/application_settings/_kroki.html.haml
@@ -30,4 +30,4 @@
= f.check_box format[:name], class: 'form-check-input'
= f.label format[:name], format[:label], class: 'form-check-label'
- = f.submit _('Save changes'), class: "btn gl-button btn-success"
+ = 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 5ad7080b22b..fdb91937ec3 100644
--- a/app/views/admin/application_settings/_localization.html.haml
+++ b/app/views/admin/application_settings/_localization.html.haml
@@ -15,4 +15,4 @@
= f.label :time_tracking_limit_to_hours, class: 'form-check-label' do
= _('Limit display of time tracking units to hours.')
- = f.submit _('Save changes'), class: "gl-button btn btn-success"
+ = f.submit _('Save changes'), class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/application_settings/_note_limits.html.haml b/app/views/admin/application_settings/_note_limits.html.haml
index 9578da90170..d50b3395d8f 100644
--- a/app/views/admin/application_settings/_note_limits.html.haml
+++ b/app/views/admin/application_settings/_note_limits.html.haml
@@ -9,4 +9,4 @@
= f.label :notes_create_limit_allowlist, _('List of users to be excluded from the limit'), class: 'label-bold'
= f.text_area :notes_create_limit_allowlist_raw, placeholder: 'username1, username2', class: 'form-control gl-form-input', rows: 5
- = f.submit _('Save changes'), class: "gl-button btn btn-success", data: { qa_selector: 'save_changes_button' }
+ = f.submit _('Save changes'), class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' }
diff --git a/app/views/admin/application_settings/_outbound.html.haml b/app/views/admin/application_settings/_outbound.html.haml
index 694cc9deab6..d8d105293a1 100644
--- a/app/views/admin/application_settings/_outbound.html.haml
+++ b/app/views/admin/application_settings/_outbound.html.haml
@@ -27,4 +27,4 @@
%span.form-text.text-muted
= _('Resolves IP addresses once and uses them to submit requests')
- = f.submit 'Save changes', class: "gl-button btn btn-success", data: { qa_selector: 'save_changes_button' }
+ = f.submit 'Save changes', class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' }
diff --git a/app/views/admin/application_settings/_package_registry.html.haml b/app/views/admin/application_settings/_package_registry.html.haml
index 86df1aa6e02..0ca8493c596 100644
--- a/app/views/admin/application_settings/_package_registry.html.haml
+++ b/app/views/admin/application_settings/_package_registry.html.haml
@@ -36,7 +36,7 @@
= f.label :maven_max_file_size, _('Maximum Maven package file size in bytes'), class: 'label-bold'
= f.number_field :maven_max_file_size, class: 'form-control gl-form-input'
.form-group
- = f.label :npm_max_file_size, _('Maximum NPM package file size in bytes'), class: 'label-bold'
+ = f.label :npm_max_file_size, _('Maximum npm package file size in bytes'), class: 'label-bold'
= f.number_field :npm_max_file_size, class: 'form-control gl-form-input'
.form-group
= f.label :nuget_max_file_size, _('Maximum NuGet package file size in bytes'), class: 'label-bold'
@@ -47,4 +47,4 @@
.form-group
= f.label :generic_packages_max_file_size, _('Generic package file size in bytes'), class: 'label-bold'
= f.number_field :generic_packages_max_file_size, class: 'form-control gl-form-input'
- = f.submit _('Save %{name} size limits').html_safe % { name: plan.name.capitalize }, class: 'btn gl-button btn-success'
+ = f.submit _('Save %{name} size limits').html_safe % { name: plan.name.capitalize }, class: 'btn gl-button btn-confirm'
diff --git a/app/views/admin/application_settings/_pages.html.haml b/app/views/admin/application_settings/_pages.html.haml
index 503aae861d0..8f52e8b8461 100644
--- a/app/views/admin/application_settings/_pages.html.haml
+++ b/app/views/admin/application_settings/_pages.html.haml
@@ -41,4 +41,4 @@
- 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 }
= _("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-success"
+ = 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 3efe163de7b..5ee68e8fd16 100644
--- a/app/views/admin/application_settings/_performance.html.haml
+++ b/app/views/admin/application_settings/_performance.html.haml
@@ -31,4 +31,4 @@
.form-text.text-muted
= _('Number of changes (branches or tags) in a single push to determine whether individual push events or bulk push event will be created. Bulk push event will be created if it surpasses that value.')
- = f.submit 'Save changes', class: "gl-button btn btn-success"
+ = f.submit 'Save changes', class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/application_settings/_performance_bar.html.haml b/app/views/admin/application_settings/_performance_bar.html.haml
index 2db22552596..21345e4d80e 100644
--- a/app/views/admin/application_settings/_performance_bar.html.haml
+++ b/app/views/admin/application_settings/_performance_bar.html.haml
@@ -11,4 +11,4 @@
= f.label :performance_bar_allowed_group_path, 'Allowed 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
- = f.submit 'Save changes', class: 'gl-button btn btn-success qa-save-changes-button'
+ = f.submit 'Save changes', class: 'gl-button btn btn-confirm qa-save-changes-button'
diff --git a/app/views/admin/application_settings/_plantuml.html.haml b/app/views/admin/application_settings/_plantuml.html.haml
index 93fcc90f044..e6e9bbf3ee0 100644
--- a/app/views/admin/application_settings/_plantuml.html.haml
+++ b/app/views/admin/application_settings/_plantuml.html.haml
@@ -24,4 +24,4 @@
= link_to "PlantUML", "http://plantuml.com"
diagrams in Asciidoc documents using an external PlantUML service.
- = f.submit _('Save changes'), class: "gl-button btn btn-success"
+ = f.submit _('Save changes'), class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/application_settings/_prometheus.html.haml b/app/views/admin/application_settings/_prometheus.html.haml
index c394bc65046..468c1786d6f 100644
--- a/app/views/admin/application_settings/_prometheus.html.haml
+++ b/app/views/admin/application_settings/_prometheus.html.haml
@@ -30,4 +30,4 @@
A method call is only tracked when it takes longer to complete than
the given amount of milliseconds.
- = f.submit 'Save changes', class: "gl-button btn btn-success"
+ = f.submit 'Save changes', class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/application_settings/_protected_paths.html.haml b/app/views/admin/application_settings/_protected_paths.html.haml
index 57bba4f970a..faa675f211d 100644
--- a/app/views/admin/application_settings/_protected_paths.html.haml
+++ b/app/views/admin/application_settings/_protected_paths.html.haml
@@ -28,4 +28,4 @@
= _('All paths are relative to the GitLab URL. Do not include %{relative_url_link_start}relative URL%{relative_url_link_end}.').html_safe % { relative_url_link_start: relative_url_link_start, relative_url_link_end: '</a>'.html_safe }
= f.text_area :protected_paths_raw, placeholder: '/users/sign_in,/users/password', class: 'form-control gl-form-input', rows: 10
- = f.submit 'Save changes', class: 'gl-button btn btn-success'
+ = f.submit 'Save changes', class: 'gl-button btn btn-confirm'
diff --git a/app/views/admin/application_settings/_realtime.html.haml b/app/views/admin/application_settings/_realtime.html.haml
index 2b54a15d615..bee120d2f78 100644
--- a/app/views/admin/application_settings/_realtime.html.haml
+++ b/app/views/admin/application_settings/_realtime.html.haml
@@ -14,4 +14,4 @@
installations. Set to 0 to completely disable polling.
= link_to sprite_icon('question-o'), help_page_path('administration/polling')
- = f.submit 'Save changes', class: "gl-button btn btn-success"
+ = f.submit 'Save changes', class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/application_settings/_registry.html.haml b/app/views/admin/application_settings/_registry.html.haml
index 5fb5effaa55..fc03a6dd10c 100644
--- a/app/views/admin/application_settings/_registry.html.haml
+++ b/app/views/admin/application_settings/_registry.html.haml
@@ -31,4 +31,4 @@
.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.")
- = f.submit 'Save changes', class: "gl-button btn btn-success"
+ = 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 24e74dd0f1b..ee0281b6e33 100644
--- a/app/views/admin/application_settings/_repository_check.html.haml
+++ b/app/views/admin/application_settings/_repository_check.html.haml
@@ -55,4 +55,4 @@
.form-text.text-muted
Number of Git pushes after which 'git gc' is run.
- = f.submit _('Save changes'), class: "gl-button btn btn-success"
+ = f.submit _('Save changes'), class: "gl-button btn btn-confirm"
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 125fa48bbc3..a0076a2f75d 100644
--- a/app/views/admin/application_settings/_repository_mirrors_form.html.haml
+++ b/app/views/admin/application_settings/_repository_mirrors_form.html.haml
@@ -14,4 +14,4 @@
= render_if_exists 'admin/application_settings/mirror_settings', form: f
- = f.submit _('Save changes'), class: "gl-button btn btn-success"
+ = f.submit _('Save changes'), class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/application_settings/_repository_static_objects.html.haml b/app/views/admin/application_settings/_repository_static_objects.html.haml
index 42fe2b24bb2..f8ec04003fa 100644
--- a/app/views/admin/application_settings/_repository_static_objects.html.haml
+++ b/app/views/admin/application_settings/_repository_static_objects.html.haml
@@ -15,4 +15,4 @@
%span.form-text.text-muted#static_objects_external_storage_auth_token_help_block
= _('A secure token that identifies an external storage request.')
- = f.submit _('Save changes'), class: "gl-button btn btn-success"
+ = f.submit _('Save changes'), class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/application_settings/_repository_storage.html.haml b/app/views/admin/application_settings/_repository_storage.html.haml
index 0862d1bf0b6..ab1b2bab573 100644
--- a/app/views/admin/application_settings/_repository_storage.html.haml
+++ b/app/views/admin/application_settings/_repository_storage.html.haml
@@ -18,8 +18,9 @@
= _('Enter weights for storages for new repositories.')
= link_to sprite_icon('question-o'), help_page_path('administration/repository_storage_paths')
.form-check
- - storage_weights.each do |attribute|
- = f.text_field attribute[:name], class: 'form-text-input', value: attribute[:value]
- = f.label attribute[:label], attribute[:label], class: 'label-bold form-check-label'
- %br
- = f.submit _('Save changes'), class: "gl-button btn btn-success qa-save-changes-button"
+ = f.fields_for :repository_storages_weighted, storage_weights do |storage_form|
+ - Gitlab.config.repositories.storages.keys.each do |storage|
+ = storage_form.text_field storage, class: 'form-text-input'
+ = storage_form.label storage, storage, class: 'label-bold form-check-label'
+ %br
+ = f.submit _('Save changes'), class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/application_settings/_signin.html.haml b/app/views/admin/application_settings/_signin.html.haml
index 23a7856e483..c6f7266defe 100644
--- a/app/views/admin/application_settings/_signin.html.haml
+++ b/app/views/admin/application_settings/_signin.html.haml
@@ -57,4 +57,4 @@
= f.label :sign_in_text, _('Sign-in text'), class: 'label-bold'
= f.text_area :sign_in_text, class: 'form-control gl-form-input', rows: 4
.form-text.text-muted Markdown enabled
- = f.submit 'Save changes', class: "gl-button btn btn-success"
+ = f.submit 'Save changes', class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/application_settings/_signup.html.haml b/app/views/admin/application_settings/_signup.html.haml
index 82824f1d436..272eba67b1b 100644
--- a/app/views/admin/application_settings/_signup.html.haml
+++ b/app/views/admin/application_settings/_signup.html.haml
@@ -77,4 +77,4 @@
= f.label :after_sign_up_text, class: 'label-bold'
= f.text_area :after_sign_up_text, class: 'form-control gl-form-input', rows: 4
.form-text.text-muted Markdown enabled
- = f.submit 'Save changes', class: "gl-button btn btn-success", data: { qa_selector: 'save_changes_button' }
+ = f.submit 'Save changes', class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' }
diff --git a/app/views/admin/application_settings/_snowplow.html.haml b/app/views/admin/application_settings/_snowplow.html.haml
index 5f5a3a6992c..e6ac2a4db34 100644
--- a/app/views/admin/application_settings/_snowplow.html.haml
+++ b/app/views/admin/application_settings/_snowplow.html.haml
@@ -26,4 +26,4 @@
= f.label :snowplow_cookie_domain, _('Cookie domain'), class: 'label-light'
= f.text_field :snowplow_cookie_domain, class: 'form-control gl-form-input'
- = f.submit _('Save changes'), class: 'gl-button btn btn-success'
+ = f.submit _('Save changes'), class: 'gl-button btn btn-confirm'
diff --git a/app/views/admin/application_settings/_sourcegraph.html.haml b/app/views/admin/application_settings/_sourcegraph.html.haml
index e1af269c6fd..af25577f058 100644
--- a/app/views/admin/application_settings/_sourcegraph.html.haml
+++ b/app/views/admin/application_settings/_sourcegraph.html.haml
@@ -5,7 +5,7 @@
.settings-header
%h4
= _('Sourcegraph')
- %button.btn.btn-default.js-settings-toggle{ type: 'button' }
+ %button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
= expanded ? _('Collapse') : _('Expand')
%p
- link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: 'https://sourcegraph.com/' }
@@ -35,4 +35,4 @@
= f.text_field :sourcegraph_url, class: 'form-control gl-form-input', placeholder: s_('SourcegraphAdmin|e.g. https://sourcegraph.example.com')
.form-text.text-muted
= s_('SourcegraphAdmin|Configure the URL to a Sourcegraph instance which can read your GitLab projects.')
- = f.submit s_('SourcegraphAdmin|Save changes'), class: 'gl-button btn btn-success'
+ = f.submit s_('SourcegraphAdmin|Save changes'), class: 'gl-button btn btn-confirm'
diff --git a/app/views/admin/application_settings/_spam.html.haml b/app/views/admin/application_settings/_spam.html.haml
index 6085cea4f5d..2086fbc9d32 100644
--- a/app/views/admin/application_settings/_spam.html.haml
+++ b/app/views/admin/application_settings/_spam.html.haml
@@ -79,4 +79,4 @@
= 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'
- = f.submit 'Save changes', class: "gl-button btn btn-success"
+ = f.submit 'Save changes', class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/application_settings/_terminal.html.haml b/app/views/admin/application_settings/_terminal.html.haml
index 8f89cf27291..487ce25a4da 100644
--- a/app/views/admin/application_settings/_terminal.html.haml
+++ b/app/views/admin/application_settings/_terminal.html.haml
@@ -8,4 +8,4 @@
.form-text.text-muted
Maximum time for web terminal websocket connection (in seconds).
0 for unlimited.
- = f.submit 'Save changes', class: "gl-button btn btn-success"
+ = f.submit 'Save changes', class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/application_settings/_terms.html.haml b/app/views/admin/application_settings/_terms.html.haml
index 717b2220336..8cc4169b383 100644
--- a/app/views/admin/application_settings/_terms.html.haml
+++ b/app/views/admin/application_settings/_terms.html.haml
@@ -15,4 +15,4 @@
= f.text_area :terms, class: 'form-control gl-form-input', rows: 8
.form-text.text-muted
= _("Markdown enabled")
- = f.submit _("Save changes"), class: "gl-button btn btn-success"
+ = f.submit _("Save changes"), class: "gl-button btn btn-confirm"
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 32023b11993..970c9c6b003 100644
--- a/app/views/admin/application_settings/_third_party_offers.html.haml
+++ b/app/views/admin/application_settings/_third_party_offers.html.haml
@@ -17,4 +17,4 @@
= f.check_box :hide_third_party_offers, class: 'form-check-input'
= f.label :hide_third_party_offers, _('Do not display offers from third parties within GitLab'), class: 'form-check-label'
- = f.submit _('Save changes'), class: "gl-button btn btn-success"
+ = 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 fe83d4b807c..00306e1ba06 100644
--- a/app/views/admin/application_settings/_usage.html.haml
+++ b/app/views/admin/application_settings/_usage.html.haml
@@ -33,8 +33,8 @@
%pre.usage-data.js-syntax-highlight.code.highlight.mt-2.d-none{ class: payload_class, data: { endpoint: usage_data_admin_application_settings_path(format: :html) } }
- else
= _('The usage ping is disabled, and cannot be configured through this form.')
- - deactivating_usage_ping_path = help_page_path('development/usage_ping', anchor: 'disable-usage-ping')
+ - deactivating_usage_ping_path = help_page_path('development/usage_ping/index.md', anchor: 'disable-usage-ping')
- deactivating_usage_ping_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: deactivating_usage_ping_path }
= s_('For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}.').html_safe % { deactivating_usage_ping_link_start: deactivating_usage_ping_link_start, deactivating_usage_ping_link_end: '</a>'.html_safe }
- = f.submit 'Save changes', class: "gl-button btn btn-success"
+ = f.submit 'Save changes', class: "gl-button btn btn-confirm"
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 0931ba50aa7..e51a41d5254 100644
--- a/app/views/admin/application_settings/_visibility_and_access.html.haml
+++ b/app/views/admin/application_settings/_visibility_and_access.html.haml
@@ -74,4 +74,4 @@
= f.label :disable_feed_token, class: 'form-check-label' do
= s_('AdminSettings|Disable feed token')
- = f.submit _('Save changes'), class: "gl-button btn btn-success"
+ = f.submit _('Save changes'), class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/application_settings/general.html.haml b/app/views/admin/application_settings/general.html.haml
index 794e02787f5..3a14b4fbc7b 100644
--- a/app/views/admin/application_settings/general.html.haml
+++ b/app/views/admin/application_settings/general.html.haml
@@ -6,7 +6,7 @@
.settings-header
%h4
= _('Visibility and access controls')
- %button.btn.gl-button.js-settings-toggle{ type: 'button' }
+ %button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
= expanded_by_default? ? _('Collapse') : _('Expand')
%p
= _('Set default and restrict visibility levels. Configure import sources and git access protocol.')
@@ -17,7 +17,7 @@
.settings-header
%h4
= _('Account and limit')
- %button.btn.gl-button.js-settings-toggle{ type: 'button' }
+ %button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
= expanded_by_default? ? _('Collapse') : _('Expand')
%p
= _('Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan.')
@@ -28,7 +28,7 @@
.settings-header
%h4
= _('Diff limits')
- %button.btn.gl-button.js-settings-toggle{ type: 'button' }
+ %button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
= expanded_by_default? ? _('Collapse') : _('Expand')
%p
= _('Diff content limits')
@@ -39,7 +39,7 @@
.settings-header
%h4
= _('Sign-up restrictions')
- %button.btn.gl-button.js-settings-toggle{ type: 'button' }
+ %button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
= expanded_by_default? ? _('Collapse') : _('Expand')
%p
= _('Configure the way a user creates a new account.')
@@ -50,7 +50,7 @@
.settings-header
%h4
= _('Sign-in restrictions')
- %button.btn.gl-button.js-settings-toggle{ type: 'button' }
+ %button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
= expanded_by_default? ? _('Collapse') : _('Expand')
%p
= _('Set requirements for a user to sign-in. Enable mandatory two-factor authentication.')
@@ -101,7 +101,7 @@
= s_('IDE|Live Preview')
%span.form-text.text-muted
= s_('IDE|Allow live previews of JavaScript projects in the Web IDE using CodeSandbox Live Preview.')
- = f.submit _('Save changes'), class: "gl-button btn btn-success"
+ = f.submit _('Save changes'), class: "gl-button btn btn-confirm"
= render_if_exists 'admin/application_settings/maintenance_mode_settings_form'
= render 'admin/application_settings/gitpod'
diff --git a/app/views/admin/applications/_form.html.haml b/app/views/admin/applications/_form.html.haml
index 14044d6eecb..e7e17502da2 100644
--- a/app/views/admin/applications/_form.html.haml
+++ b/app/views/admin/applications/_form.html.haml
@@ -40,5 +40,5 @@
= render 'shared/tokens/scopes_form', prefix: 'doorkeeper_application', token: application, scopes: @scopes
.form-actions
- = f.submit 'Submit', class: "gl-button btn btn-success wide"
- = link_to "Cancel", admin_applications_path, class: "gl-button btn btn-cancel"
+ = f.submit 'Submit', class: "gl-button btn btn-confirm wide"
+ = link_to "Cancel", admin_applications_path, class: "gl-button btn btn-default btn-cancel"
diff --git a/app/views/admin/applications/index.html.haml b/app/views/admin/applications/index.html.haml
index 7ac55157f65..28a7bd1820a 100644
--- a/app/views/admin/applications/index.html.haml
+++ b/app/views/admin/applications/index.html.haml
@@ -4,7 +4,7 @@
%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-success'
+%p= link_to _('New application'), new_admin_application_path, class: 'gl-button btn btn-confirm'
.table-responsive
%table.table
%thead
diff --git a/app/views/admin/broadcast_messages/_form.html.haml b/app/views/admin/broadcast_messages/_form.html.haml
index 89fccff954d..21908c08690 100644
--- a/app/views/admin/broadcast_messages/_form.html.haml
+++ b/app/views/admin/broadcast_messages/_form.html.haml
@@ -77,6 +77,6 @@
= f.datetime_select :ends_at, {}, class: 'form-control form-control-inline'
.form-actions
- if @broadcast_message.persisted?
- = f.submit "Update broadcast message", class: "btn gl-button btn-success"
+ = f.submit "Update broadcast message", class: "btn gl-button btn-confirm"
- else
- = f.submit "Add broadcast message", class: "btn gl-button btn-success"
+ = f.submit "Add broadcast message", class: "btn gl-button btn-confirm"
diff --git a/app/views/admin/dashboard/index.html.haml b/app/views/admin/dashboard/index.html.haml
index f6ebc4c465d..f16158d5656 100644
--- a/app/views/admin/dashboard/index.html.haml
+++ b/app/views/admin/dashboard/index.html.haml
@@ -60,7 +60,7 @@
.d-flex.align-items-center
= sprite_icon('group', size: 16, css_class: 'gl-text-gray-700')
%h3.gl-m-0.gl-ml-3= approximate_count_with_delimiters(@counts, Group)
- .gl-mt-3.text-uppercase= s_('AdminArea|Projects')
+ .gl-mt-3.text-uppercase= s_('AdminArea|Groups')
= link_to(s_('AdminArea|New group'), new_admin_group_path, class: "btn gl-button btn-default")
.gl-card-footer.gl-bg-transparent
.d-flex.align-items-center
diff --git a/app/views/admin/deploy_keys/edit.html.haml b/app/views/admin/deploy_keys/edit.html.haml
index 2a0177ab997..f85b37b3640 100644
--- a/app/views/admin/deploy_keys/edit.html.haml
+++ b/app/views/admin/deploy_keys/edit.html.haml
@@ -6,5 +6,5 @@
= form_for [:admin, @deploy_key], html: { class: 'deploy-key-form' } do |f|
= render partial: 'shared/deploy_keys/form', locals: { form: f, deploy_key: @deploy_key }
.form-actions
- = f.submit _('Save changes'), class: 'btn gl-button btn-success'
- = link_to _('Cancel'), admin_deploy_keys_path, class: 'btn gl-button btn-cancel'
+ = f.submit _('Save changes'), class: 'btn gl-button btn-confirm'
+ = link_to _('Cancel'), admin_deploy_keys_path, class: 'btn gl-button btn-default btn-cancel'
diff --git a/app/views/admin/deploy_keys/index.html.haml b/app/views/admin/deploy_keys/index.html.haml
index 9b6aa278906..eec8f816f04 100644
--- a/app/views/admin/deploy_keys/index.html.haml
+++ b/app/views/admin/deploy_keys/index.html.haml
@@ -2,7 +2,7 @@
- if @deploy_keys.any?
%h3.page-title.deploy-keys-title
= _('Public deploy keys (%{deploy_keys_count})') % { deploy_keys_count: @deploy_keys.load.size }
- = link_to _('New deploy key'), new_admin_deploy_key_path, class: 'float-right btn gl-button btn-success btn-md gl-button'
+ = link_to _('New deploy key'), new_admin_deploy_key_path, class: 'float-right btn gl-button btn-confirm btn-md gl-button'
.table-holder.deploy-keys-list
%table.table
%thead
diff --git a/app/views/admin/deploy_keys/new.html.haml b/app/views/admin/deploy_keys/new.html.haml
index 5a3b880a596..dc49db6557b 100644
--- a/app/views/admin/deploy_keys/new.html.haml
+++ b/app/views/admin/deploy_keys/new.html.haml
@@ -6,5 +6,5 @@
= form_for [:admin, @deploy_key], html: { class: 'deploy-key-form' } do |f|
= render partial: 'shared/deploy_keys/form', locals: { form: f, deploy_key: @deploy_key }
.form-actions
- = f.submit 'Create', class: 'btn gl-button btn-success'
- = link_to 'Cancel', admin_deploy_keys_path, class: 'btn gl-button btn-cancel'
+ = f.submit 'Create', class: 'btn gl-button btn-confirm'
+ = link_to 'Cancel', admin_deploy_keys_path, class: 'btn gl-button btn-default btn-cancel'
diff --git a/app/views/admin/dev_ops_report/_report.html.haml b/app/views/admin/dev_ops_report/_report.html.haml
index 5faadd15ef8..95ef1298d03 100644
--- a/app/views/admin/dev_ops_report/_report.html.haml
+++ b/app/views/admin/dev_ops_report/_report.html.haml
@@ -4,11 +4,13 @@
= render 'callout'
- if !usage_ping_enabled
- #js-devops-empty-state{ data: { is_admin: current_user&.admin.to_s, empty_state_svg_path: image_path('illustrations/convdev/convdev_no_index.svg'), enable_usage_ping_link: metrics_and_profiling_admin_application_settings_path(anchor: 'js-usage-settings'), docs_link: help_page_path('development/usage_ping') } }
+ #js-devops-empty-state{ data: { is_admin: current_user&.admin.to_s, empty_state_svg_path: image_path('illustrations/convdev/convdev_no_index.svg'), enable_usage_ping_link: metrics_and_profiling_admin_application_settings_path(anchor: 'js-usage-settings'), docs_link: help_page_path('development/usage_ping/index.md') } }
- elsif @metric.blank?
= render 'no_data'
- else
.devops
+ .gl-my-3.gl-text-gray-400{ data: { testid: 'devops-score-note-text' } }
+ = s_('DevopsReport|DevOps score metrics are based on usage over the last 30 days. Last updated: %{timestamp}.').html_safe % { timestamp: @metric.created_at.strftime('%Y-%m-%d %H:%M') }
.devops-header
%h2.devops-header-title{ class: "devops-#{score_level(@metric.average_percentage_score)}-score" }
= number_to_percentage(@metric.average_percentage_score, precision: 1)
diff --git a/app/views/admin/groups/_form.html.haml b/app/views/admin/groups/_form.html.haml
index c2599238bce..15306ab7878 100644
--- a/app/views/admin/groups/_form.html.haml
+++ b/app/views/admin/groups/_form.html.haml
@@ -30,10 +30,10 @@
.gl-alert-body
= render 'shared/group_tips'
.form-actions
- = f.submit _('Create group'), class: "gl-button btn btn-success"
+ = f.submit _('Create group'), class: "gl-button btn btn-confirm"
= link_to _('Cancel'), admin_groups_path, class: "gl-button btn btn-default btn-cancel"
- else
.form-actions
- = f.submit _('Save changes'), class: "gl-button btn btn-success", data: { qa_selector: 'save_changes_button' }
+ = f.submit _('Save changes'), class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' }
= link_to _('Cancel'), admin_group_path(@group), class: "gl-button btn btn-cancel"
diff --git a/app/views/admin/groups/_group.html.haml b/app/views/admin/groups/_group.html.haml
index dc122d74e90..df7af86e089 100644
--- a/app/views/admin/groups/_group.html.haml
+++ b/app/views/admin/groups/_group.html.haml
@@ -33,5 +33,5 @@
= visibility_level_icon(group.visibility_level)
.controls.gl-flex-shrink-0.gl-ml-5
- = link_to _('Edit'), admin_group_edit_path(group), id: "edit_#{dom_id(group)}", class: 'gl-button btn'
+ = link_to _('Edit'), admin_group_edit_path(group), id: "edit_#{dom_id(group)}", class: 'btn gl-button btn-default'
= link_to _('Delete'), [:admin, group], data: { confirm: _("Are you sure you want to remove %{group_name}?") % { group_name: group.name } }, method: :delete, class: 'gl-button btn btn-danger'
diff --git a/app/views/admin/groups/index.html.haml b/app/views/admin/groups/index.html.haml
index bc4d4e489ce..17dccae44b5 100644
--- a/app/views/admin/groups/index.html.haml
+++ b/app/views/admin/groups/index.html.haml
@@ -10,7 +10,7 @@
= 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' }
= 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-success" do
+ = link_to new_admin_group_path, class: "gl-button btn btn-confirm" do
= _('New group')
%ul.content-list
= render @groups
diff --git a/app/views/admin/groups/show.html.haml b/app/views/admin/groups/show.html.haml
index b949d08718a..f8c490dd948 100644
--- a/app/views/admin/groups/show.html.haml
+++ b/app/views/admin/groups/show.html.haml
@@ -1,3 +1,4 @@
+- add_page_specific_style 'page_bundles/members'
- add_to_breadcrumbs _("Groups"), admin_groups_path
- breadcrumb_title @group.name
- page_title @group.name, _("Groups")
@@ -117,7 +118,7 @@
.gl-mt-3
= select_tag :access_level, options_for_select(@group.access_level_roles), class: "project-access-select select2"
%hr
- = button_tag _('Add users to group'), class: "gl-button btn btn-success"
+ = button_tag _('Add users to group'), class: "gl-button btn btn-confirm"
= render 'shared/members/requests', membership_source: @group, group: @group, requesters: @requesters, force_mobile_view: true
.card
diff --git a/app/views/admin/hooks/edit.html.haml b/app/views/admin/hooks/edit.html.haml
index 74f73b4972a..93038e63a2e 100644
--- a/app/views/admin/hooks/edit.html.haml
+++ b/app/views/admin/hooks/edit.html.haml
@@ -9,7 +9,7 @@
= 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-success gl-mr-3'
+ %span>= f.submit _('Save changes'), class: 'btn gl-button btn-confirm gl-mr-3'
= render 'shared/web_hooks/test_button', hook: @hook
= link_to _('Delete'), admin_hook_path(@hook), method: :delete, class: 'btn gl-button btn-danger float-right', data: { confirm: _('Are you sure?') }
diff --git a/app/views/admin/hooks/index.html.haml b/app/views/admin/hooks/index.html.haml
index c0bad6a0a63..3e2cd126e1a 100644
--- a/app/views/admin/hooks/index.html.haml
+++ b/app/views/admin/hooks/index.html.haml
@@ -7,7 +7,7 @@
.col-lg-8.gl-mb-3
= 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-success'
+ = f.submit _('Add system hook'), class: 'btn gl-button btn-confirm'
= render 'shared/web_hooks/index', hooks: @hooks, hook_class: @hook.class
diff --git a/app/views/admin/instance_statistics/index.html.haml b/app/views/admin/instance_statistics/index.html.haml
deleted file mode 100644
index d5902f702e5..00000000000
--- a/app/views/admin/instance_statistics/index.html.haml
+++ /dev/null
@@ -1,4 +0,0 @@
-- breadcrumb_title _("Usage Trends")
-- page_title _("Usage Trends")
-
-#js-instance-statistics-app
diff --git a/app/views/admin/labels/_form.html.haml b/app/views/admin/labels/_form.html.haml
index 12c7acd7668..abf380474e4 100644
--- a/app/views/admin/labels/_form.html.haml
+++ b/app/views/admin/labels/_form.html.haml
@@ -27,5 +27,5 @@
= render_suggested_colors
.form-actions
- = f.submit _('Save'), class: 'btn gl-button btn-success js-save-button'
- = link_to _("Cancel"), admin_labels_path, class: 'btn gl-button btn-cancel'
+ = f.submit _('Save'), class: 'btn gl-button btn-confirm js-save-button'
+ = link_to _("Cancel"), admin_labels_path, class: 'btn gl-button btn-default btn-cancel'
diff --git a/app/views/admin/labels/index.html.haml b/app/views/admin/labels/index.html.haml
index f204e620e9d..7b737c49a87 100644
--- a/app/views/admin/labels/index.html.haml
+++ b/app/views/admin/labels/index.html.haml
@@ -1,7 +1,7 @@
- page_title _("Labels")
%div
- = link_to new_admin_label_path, class: "float-right btn gl-button btn-success" do
+ = link_to new_admin_label_path, class: "float-right btn gl-button btn-confirm" do
= _('New label')
%h3.page-title
= _('Labels')
diff --git a/app/views/admin/projects/_projects.html.haml b/app/views/admin/projects/_projects.html.haml
index 4131c8b7edd..c2e40413a14 100644
--- a/app/views/admin/projects/_projects.html.haml
+++ b/app/views/admin/projects/_projects.html.haml
@@ -4,7 +4,7 @@
- @projects.each_with_index do |project|
%li.project-row{ class: ('no-description' if project.description.blank?) }
.controls
- = link_to 'Edit', edit_project_path(project), id: "edit_#{dom_id(project)}", class: "gl-button btn"
+ = link_to 'Edit', edit_project_path(project), id: "edit_#{dom_id(project)}", class: "btn gl-button btn-default"
%button.delete-project-button.gl-button.btn.btn-danger{ data: { delete_project_url: admin_project_path(project), project_name: project.name } }
= s_('AdminProjects|Delete')
diff --git a/app/views/admin/projects/index.html.haml b/app/views/admin/projects/index.html.haml
index d9ff4404519..50f3c94bcb3 100644
--- a/app/views/admin/projects/index.html.haml
+++ b/app/views/admin/projects/index.html.haml
@@ -30,7 +30,7 @@
= dropdown_content
= dropdown_loading
= render 'shared/projects/dropdown'
- = link_to new_project_path, class: 'gl-button btn btn-success' do
+ = link_to new_project_path, class: 'gl-button btn btn-confirm' do
New Project
= button_tag "Search", class: "gl-button btn btn-confirm btn-search hide"
diff --git a/app/views/admin/projects/show.html.haml b/app/views/admin/projects/show.html.haml
index 2085515e349..40443fb3406 100644
--- a/app/views/admin/projects/show.html.haml
+++ b/app/views/admin/projects/show.html.haml
@@ -1,3 +1,4 @@
+- add_page_specific_style 'page_bundles/members'
- add_to_breadcrumbs _("Projects"), admin_projects_path
- breadcrumb_title @project.full_name
- page_title @project.full_name, _("Projects")
diff --git a/app/views/admin/serverless/domains/_form.html.haml b/app/views/admin/serverless/domains/_form.html.haml
index e4b054c7480..85f2260163a 100644
--- a/app/views/admin/serverless/domains/_form.html.haml
+++ b/app/views/admin/serverless/domains/_form.html.haml
@@ -65,7 +65,7 @@
%span.form-text.text-muted
= _("Upload a private key for your certificate")
- = f.submit @domain.persisted? ? _('Save changes') : _('Add domain'), class: "gl-button btn btn-success js-serverless-domain-submit", disabled: @domain.persisted?
+ = f.submit @domain.persisted? ? _('Save changes') : _('Add domain'), class: "gl-button btn btn-confirm js-serverless-domain-submit", disabled: @domain.persisted?
- if @domain.persisted?
%button.gl-button.btn.btn-danger{ type: 'button', data: { toggle: 'modal', target: "#modal-delete-domain" } }
= _('Delete domain')
diff --git a/app/views/admin/usage_trends/index.html.haml b/app/views/admin/usage_trends/index.html.haml
new file mode 100644
index 00000000000..a0be48f71ce
--- /dev/null
+++ b/app/views/admin/usage_trends/index.html.haml
@@ -0,0 +1,4 @@
+- breadcrumb_title _("Usage Trends")
+- page_title _("Usage Trends")
+
+#js-usage-trends-app
diff --git a/app/views/admin/users/_cohorts_table.html.haml b/app/views/admin/users/_cohorts_table.html.haml
index bb6266b38f6..a92cfb5851a 100644
--- a/app/views/admin/users/_cohorts_table.html.haml
+++ b/app/views/admin/users/_cohorts_table.html.haml
@@ -2,7 +2,7 @@
.bs-callout.clearfix
%p
= s_("Cohorts|User cohorts are shown for the last %{months_included} months. Only users with activity are counted in the 'New users' column; inactive users are counted separately.") % { months_included: @cohorts[:months_included] }
- = link_to sprite_icon('question-o'), help_page_path('user/admin_area/analytics/user_cohorts', anchor: 'cohorts'), title: 'About this feature', target: '_blank'
+ = link_to sprite_icon('question-o'), help_page_path('user/admin_area/user_cohorts', anchor: 'cohorts'), title: 'About this feature', target: '_blank'
.table-holder.d-xl-table
%table.table
diff --git a/app/views/admin/users/_form.html.haml b/app/views/admin/users/_form.html.haml
index 40393f0db99..b3ed8369263 100644
--- a/app/views/admin/users/_form.html.haml
+++ b/app/views/admin/users/_form.html.haml
@@ -87,8 +87,8 @@
.form-actions
- if @user.new_record?
- = f.submit 'Create user', class: "btn gl-button btn-success"
- = link_to 'Cancel', admin_users_path, class: "gl-button btn btn-cancel"
+ = f.submit 'Create user', class: "btn gl-button btn-confirm"
+ = link_to 'Cancel', admin_users_path, class: "gl-button btn btn-default btn-cancel"
- else
- = f.submit 'Save changes', class: "btn gl-button btn-success"
- = link_to 'Cancel', admin_user_path(@user), class: "btn gl-button btn-cancel"
+ = f.submit 'Save changes', class: "btn gl-button btn-confirm"
+ = link_to 'Cancel', admin_user_path(@user), class: "gl-button btn btn-default btn-cancel"
diff --git a/app/views/admin/users/_users.html.haml b/app/views/admin/users/_users.html.haml
index 57edb9abe90..c79b2e978f2 100644
--- a/app/views/admin/users/_users.html.haml
+++ b/app/views/admin/users/_users.html.haml
@@ -43,7 +43,7 @@
.nav-controls
= render_if_exists 'admin/users/admin_email_users'
= render_if_exists 'admin/users/admin_export_user_permissions'
- = link_to s_('AdminUsers|New user'), new_admin_user_path, class: 'btn gl-button btn-success btn-search float-right'
+ = link_to s_('AdminUsers|New user'), new_admin_user_path, class: 'btn gl-button btn-confirm btn-search float-right'
.filtered-search-block.row-content-block.border-top-0
= form_tag admin_users_path, method: :get do
diff --git a/app/views/admin/users/index.html.haml b/app/views/admin/users/index.html.haml
index 8da0c7f4300..f9b631ed6cf 100644
--- a/app/views/admin/users/index.html.haml
+++ b/app/views/admin/users/index.html.haml
@@ -5,7 +5,7 @@
%a.nav-link{ href: '#users', class: active_when(params[:tab] != 'cohorts'), data: { toggle: 'tab' }, role: 'tab' }
= s_('AdminUsers|Users')
%li.nav-item.js-users-tab-item{ role: 'presentation' }
- %a.nav-link{ href: '#cohorts', class: active_when(params[:tab] == 'cohorts'), data: { toggle: 'tab', track: { event: 'i_analytics_cohorts', action: 'click_tab' } }, role: 'tab' }
+ %a.nav-link{ href: '#cohorts', class: active_when(params[:tab] == 'cohorts'), data: { toggle: 'tab' }, role: 'tab' }
= s_('AdminUsers|Cohorts')
.tab-content
diff --git a/app/views/ci/variables/_header.html.haml b/app/views/ci/variables/_header.html.haml
index a1b7f6efe54..392ff927f01 100644
--- a/app/views/ci/variables/_header.html.haml
+++ b/app/views/ci/variables/_header.html.haml
@@ -1,6 +1,6 @@
- expanded = local_assigns.fetch(:expanded)
-%h4
+%h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _('Variables')
%button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
diff --git a/app/views/clusters/clusters/_advanced_settings.html.haml b/app/views/clusters/clusters/_advanced_settings.html.haml
index bbdbda40297..7f508fd0a59 100644
--- a/app/views/clusters/clusters/_advanced_settings.html.haml
+++ b/app/views/clusters/clusters/_advanced_settings.html.haml
@@ -24,7 +24,7 @@
.text-muted
= html_escape(s_('ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges.')) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
= link_to _('More information'), help_page_path('user/clusters/management_project.md'), target: '_blank'
- = field.submit _('Save changes'), class: 'btn gl-button btn-success'
+ = field.submit _('Save changes'), class: 'btn gl-button btn-confirm'
.sub-section.form-group
%h4
diff --git a/app/views/clusters/clusters/_cluster_list.html.haml b/app/views/clusters/clusters/_cluster_list.html.haml
index 9627d940126..38ed7e334c9 100644
--- a/app/views/clusters/clusters/_cluster_list.html.haml
+++ b/app/views/clusters/clusters/_cluster_list.html.haml
@@ -4,9 +4,9 @@
.top-area.adjust
.gl-display-block.gl-text-right.gl-my-4.gl-w-full
- if clusterable.can_add_cluster?
- = link_to s_('ClusterIntegration|Connect cluster with certificate'), clusterable.new_path, class: 'btn gl-button btn-success js-add-cluster gl-py-2', qa_selector: :integrate_kubernetes_cluster_button
+ = link_to s_('ClusterIntegration|Connect cluster with certificate'), clusterable.new_path, class: 'btn gl-button btn-confirm js-add-cluster gl-py-2', qa_selector: :integrate_kubernetes_cluster_button
- else
- %span.btn.gl-button.btn-success.js-add-cluster.disabled.gl-py-2
+ %span.btn.gl-button.btn-confirm.js-add-cluster.disabled.gl-py-2
= s_("ClusterIntegration|Connect cluster with certificate")
#js-clusters-list-app{ data: js_clusters_list_data(clusterable.index_path(format: :json)) }
diff --git a/app/views/clusters/clusters/_empty_state.html.haml b/app/views/clusters/clusters/_empty_state.html.haml
index 676a8a8111a..feef3e0027f 100644
--- a/app/views/clusters/clusters/_empty_state.html.haml
+++ b/app/views/clusters/clusters/_empty_state.html.haml
@@ -11,4 +11,4 @@
- if clusterable.can_add_cluster?
.gl-text-center
- = link_to s_('ClusterIntegration|Integrate with a cluster certificate'), clusterable.new_path, class: 'gl-button btn btn-success'
+ = link_to s_('ClusterIntegration|Integrate with a cluster certificate'), clusterable.new_path, class: 'gl-button btn btn-confirm', data: { qa_selector: 'add_kubernetes_cluster_link' }
diff --git a/app/views/clusters/clusters/_provider_details_form.html.haml b/app/views/clusters/clusters/_provider_details_form.html.haml
index 7fc803e9579..a936cdc04dd 100644
--- a/app/views/clusters/clusters/_provider_details_form.html.haml
+++ b/app/views/clusters/clusters/_provider_details_form.html.haml
@@ -55,4 +55,4 @@
= render('clusters/clusters/namespace', platform_field: platform_field, field: field)
.form-group
- = field.submit s_('ClusterIntegration|Save changes'), class: 'gl-button btn btn-success'
+ = field.submit s_('ClusterIntegration|Save changes'), class: 'gl-button btn btn-confirm'
diff --git a/app/views/clusters/clusters/gcp/_form.html.haml b/app/views/clusters/clusters/gcp/_form.html.haml
index 50e3d29f974..ee2817879be 100644
--- a/app/views/clusters/clusters/gcp/_form.html.haml
+++ b/app/views/clusters/clusters/gcp/_form.html.haml
@@ -85,4 +85,4 @@
.form-group.js-gke-cluster-creation-submit-container
= field.submit s_('ClusterIntegration|Create Kubernetes cluster'),
- class: 'js-gke-cluster-creation-submit gl-button btn btn-success', disabled: true
+ class: 'js-gke-cluster-creation-submit gl-button btn btn-confirm', disabled: true
diff --git a/app/views/clusters/clusters/user/_form.html.haml b/app/views/clusters/clusters/user/_form.html.haml
index e2779d1b683..7d82fe06799 100644
--- a/app/views/clusters/clusters/user/_form.html.haml
+++ b/app/views/clusters/clusters/user/_form.html.haml
@@ -60,4 +60,4 @@
= render('clusters/clusters/namespace', platform_field: platform_kubernetes_field)
.form-group
- = field.submit s_('ClusterIntegration|Add Kubernetes cluster'), class: 'gl-button btn btn-success', data: { qa_selector: 'add_kubernetes_cluster_button' }
+ = field.submit s_('ClusterIntegration|Add Kubernetes cluster'), class: 'gl-button btn btn-confirm', data: { qa_selector: 'add_kubernetes_cluster_button' }
diff --git a/app/views/dashboard/_groups_head.html.haml b/app/views/dashboard/_groups_head.html.haml
index c24fe5c6307..b92f35c108c 100644
--- a/app/views/dashboard/_groups_head.html.haml
+++ b/app/views/dashboard/_groups_head.html.haml
@@ -3,7 +3,7 @@
- if current_user.can_create_group?
.page-title-controls
- = link_to _("New group"), new_group_path, class: "gl-button btn btn-success"
+ = link_to _("New group"), new_group_path, class: "gl-button btn btn-confirm", data: { testid: "new-group-button" }
.top-area
%ul.nav-links.mobile-separator.nav.nav-tabs
diff --git a/app/views/dashboard/_projects_head.html.haml b/app/views/dashboard/_projects_head.html.haml
index 6c994f3b230..57c0801074b 100644
--- a/app/views/dashboard/_projects_head.html.haml
+++ b/app/views/dashboard/_projects_head.html.haml
@@ -9,7 +9,7 @@
- if current_user.can_create_project?
.page-title-controls
- = link_to _("New project"), new_project_path, class: "gl-button btn btn-success"
+ = link_to _("New project"), new_project_path, class: "gl-button btn btn-confirm"
.top-area.scrolling-tabs-container.inner-page-scroll-tabs
.fade-left= sprite_icon('chevron-lg-left', size: 12)
diff --git a/app/views/dashboard/_snippets_head.html.haml b/app/views/dashboard/_snippets_head.html.haml
index 2640d483615..e96b5695ddc 100644
--- a/app/views/dashboard/_snippets_head.html.haml
+++ b/app/views/dashboard/_snippets_head.html.haml
@@ -4,7 +4,7 @@
- if current_user && current_user.snippets.any? || @snippets.any?
.page-title-controls
- if can?(current_user, :create_snippet)
- = link_to _("New snippet"), new_snippet_path, class: "gl-button btn btn-success", title: _("New snippet")
+ = link_to _("New snippet"), new_snippet_path, class: "gl-button btn btn-confirm", title: _("New snippet")
.top-area
%ul.nav-links.nav.nav-tabs
diff --git a/app/views/dashboard/activity.html.haml b/app/views/dashboard/activity.html.haml
index 1e93613e978..0ddee68e93f 100644
--- a/app/views/dashboard/activity.html.haml
+++ b/app/views/dashboard/activity.html.haml
@@ -3,7 +3,7 @@
= content_for :meta_tags do
= auto_discovery_link_tag(:atom, dashboard_projects_url(rss_url_options), title: "All activity")
-= render_dashboard_gold_trial(current_user)
+= render_dashboard_ultimate_trial(current_user)
- page_title _("Activity")
- header_title _("Activity"), activity_dashboard_path
diff --git a/app/views/dashboard/groups/index.html.haml b/app/views/dashboard/groups/index.html.haml
index afe4f1b84c2..fdfc2c5adb8 100644
--- a/app/views/dashboard/groups/index.html.haml
+++ b/app/views/dashboard/groups/index.html.haml
@@ -2,7 +2,7 @@
- page_title _("Groups")
- header_title _("Groups"), dashboard_groups_path
-= render_dashboard_gold_trial(current_user)
+= render_dashboard_ultimate_trial(current_user)
= render 'dashboard/groups_head'
- if params[:filter].blank? && @groups.empty?
diff --git a/app/views/dashboard/issues.html.haml b/app/views/dashboard/issues.html.haml
index b3ee5034204..5a7eb46771b 100644
--- a/app/views/dashboard/issues.html.haml
+++ b/app/views/dashboard/issues.html.haml
@@ -4,7 +4,7 @@
= content_for :meta_tags do
= auto_discovery_link_tag(:atom, safe_params.merge(rss_url_options).to_h, title: "#{current_user.name} issues")
-= render_dashboard_gold_trial(current_user)
+= render_dashboard_ultimate_trial(current_user)
.page-title-holder.d-flex.align-items-center
%h1.page-title= _('Issues')
diff --git a/app/views/dashboard/merge_requests.html.haml b/app/views/dashboard/merge_requests.html.haml
index 2111b66d26e..d47df24b1b9 100644
--- a/app/views/dashboard/merge_requests.html.haml
+++ b/app/views/dashboard/merge_requests.html.haml
@@ -2,7 +2,7 @@
- page_title _("Merge Requests")
- @breadcrumb_link = merge_requests_dashboard_path(assignee_username: current_user.username)
-= render_dashboard_gold_trial(current_user)
+= render_dashboard_ultimate_trial(current_user)
.page-title-holder.d-flex.align-items-start.flex-column.flex-sm-row.align-items-sm-center
%h1.page-title= _('Merge Requests')
diff --git a/app/views/dashboard/projects/_projects.html.haml b/app/views/dashboard/projects/_projects.html.haml
index 5122164dbcb..06ef89e0b57 100644
--- a/app/views/dashboard/projects/_projects.html.haml
+++ b/app/views/dashboard/projects/_projects.html.haml
@@ -1 +1 @@
-= render 'shared/projects/list', projects: @projects, pipeline_status: Feature.enabled?(:dashboard_pipeline_status, default_enabled: true), user: current_user
+= render 'shared/projects/list', projects: @projects, pipeline_status: true, user: current_user
diff --git a/app/views/dashboard/projects/index.html.haml b/app/views/dashboard/projects/index.html.haml
index 6f4d53c79a7..1f4bd06aea4 100644
--- a/app/views/dashboard/projects/index.html.haml
+++ b/app/views/dashboard/projects/index.html.haml
@@ -12,7 +12,7 @@
callouts_feature_id: UserCalloutsHelper::CUSTOMIZE_HOMEPAGE,
track_label: 'home_page' } }
-= render_dashboard_gold_trial(current_user)
+= render_dashboard_ultimate_trial(current_user)
- page_title _("Projects")
- header_title _("Projects"), dashboard_projects_path
diff --git a/app/views/dashboard/projects/shared/_common.html.haml b/app/views/dashboard/projects/shared/_common.html.haml
index aa55f5a4e9c..17dcb072152 100644
--- a/app/views/dashboard/projects/shared/_common.html.haml
+++ b/app/views/dashboard/projects/shared/_common.html.haml
@@ -2,7 +2,7 @@
- breadcrumb_title _("Projects")
- header_title _("Projects"), dashboard_projects_path
-= render_dashboard_gold_trial(current_user)
+= render_dashboard_ultimate_trial(current_user)
= render "projects/last_push"
= render 'dashboard/projects_head', project_tab_filter: :starred
diff --git a/app/views/dashboard/todos/index.html.haml b/app/views/dashboard/todos/index.html.haml
index 9301f24d6a4..d78059b6aed 100644
--- a/app/views/dashboard/todos/index.html.haml
+++ b/app/views/dashboard/todos/index.html.haml
@@ -2,7 +2,7 @@
- page_title _("To-Do List")
- header_title _("To-Do List"), dashboard_todos_path
-= render_dashboard_gold_trial(current_user)
+= render_dashboard_ultimate_trial(current_user)
- add_page_specific_style 'page_bundles/todos'
.page-title-holder.d-flex.align-items-center
diff --git a/app/views/devise/confirmations/almost_there.haml b/app/views/devise/confirmations/almost_there.haml
index bf321bb690b..684af933f3a 100644
--- a/app/views/devise/confirmations/almost_there.haml
+++ b/app/views/devise/confirmations/almost_there.haml
@@ -1,14 +1,14 @@
-.well-confirmation.text-center.gl-mb-6
+.well-confirmation.gl-text-center.gl-mb-6
%h1.gl-mt-0
- Almost there...
+ = _("Almost there...")
%p.lead.gl-mb-6
- Please check your email to confirm your account
+ = _("Please check your email to confirm your account")
%hr
- if Gitlab::CurrentSettings.after_sign_up_text.present?
- .well-confirmation.text-center
+ .well-confirmation.gl-text-center
= markdown_field(Gitlab::CurrentSettings, :after_sign_up_text)
%p.text-center
- No confirmation email received? Please check your spam folder or
-.gl-mb-6.prepend-top-20.text-center
- %a.btn.btn-lg.btn-success{ href: new_user_confirmation_path }
- Request new confirmation email
+ = _("No confirmation email received? Please check your spam folder or")
+.gl-mb-6.prepend-top-20.gl-text-center
+ %a.btn.gl-button.btn-confirm{ href: new_user_confirmation_path }
+ = _("Request new confirmation email")
diff --git a/app/views/devise/confirmations/new.html.haml b/app/views/devise/confirmations/new.html.haml
index ace80ba16dd..024ccaddaa1 100644
--- a/app/views/devise/confirmations/new.html.haml
+++ b/app/views/devise/confirmations/new.html.haml
@@ -8,7 +8,7 @@
= f.label :email
= f.email_field :email, class: "form-control gl-form-input", required: true, title: 'Please provide a valid email address.', value: nil
.clearfix
- = f.submit "Resend", class: 'gl-button btn btn-success'
+ = f.submit "Resend", class: 'gl-button btn btn-confirm'
.clearfix.prepend-top-20
= render 'devise/shared/sign_in_link'
diff --git a/app/views/devise/sessions/_new_base.html.haml b/app/views/devise/sessions/_new_base.html.haml
index 270652483b7..98af69d43b7 100644
--- a/app/views/devise/sessions/_new_base.html.haml
+++ b/app/views/devise/sessions/_new_base.html.haml
@@ -20,4 +20,4 @@
= recaptcha_tags
.submit-container.move-submit-down
- = f.submit _('Sign in'), class: 'gl-button btn btn-success', data: { qa_selector: 'sign_in_button' }
+ = f.submit _('Sign in'), class: 'gl-button btn btn-confirm', data: { qa_selector: 'sign_in_button' }
diff --git a/app/views/devise/sessions/_new_crowd.html.haml b/app/views/devise/sessions/_new_crowd.html.haml
index 131544ac0c0..161e23d700e 100644
--- a/app/views/devise/sessions/_new_crowd.html.haml
+++ b/app/views/devise/sessions/_new_crowd.html.haml
@@ -10,4 +10,4 @@
%label{ for: "remember_me" }
= check_box_tag :remember_me, '1', false, id: 'remember_me'
%span Remember me
- = submit_tag "Sign in", class: "btn-success btn"
+ = submit_tag "Sign in", class: "gl-button btn-confirm btn"
diff --git a/app/views/devise/sessions/_new_ldap.html.haml b/app/views/devise/sessions/_new_ldap.html.haml
index 8f397de41b7..19fcabb1a2e 100644
--- a/app/views/devise/sessions/_new_ldap.html.haml
+++ b/app/views/devise/sessions/_new_ldap.html.haml
@@ -16,4 +16,4 @@
%span Remember me
.submit-container.move-submit-down
- = submit_tag submit_message, class: "gl-button btn-success btn", data: { qa_selector: 'sign_in_button' }
+ = submit_tag submit_message, class: "gl-button btn btn-confirm", data: { qa_selector: 'sign_in_button' }
diff --git a/app/views/devise/sessions/two_factor.html.haml b/app/views/devise/sessions/two_factor.html.haml
index 8704bd16a13..404484cfb93 100644
--- a/app/views/devise/sessions/two_factor.html.haml
+++ b/app/views/devise/sessions/two_factor.html.haml
@@ -11,6 +11,6 @@
= f.text_field :otp_attempt, class: 'form-control gl-form-input', required: true, autofocus: true, autocomplete: 'off', title: 'This field is required.', data: { qa_selector: 'two_fa_code_field' }
%p.form-text.text-muted.hint Enter the code from the two-factor app on your mobile device. If you've lost your device, you may enter one of your recovery codes.
.prepend-top-20
- = f.submit "Verify code", class: "gl-button btn btn-success", data: { qa_selector: 'verify_code_button' }
+ = f.submit "Verify code", class: "gl-button btn btn-confirm", data: { qa_selector: 'verify_code_button' }
- if @user.two_factor_webauthn_u2f_enabled?
= render "authentication/authenticate", params: params, resource: resource, resource_name: resource_name, render_remember_me: true, target_path: new_user_session_path
diff --git a/app/views/devise/shared/_omniauth_box.html.haml b/app/views/devise/shared/_omniauth_box.html.haml
index 705fd9bbd0f..3ec859551ca 100644
--- a/app/views/devise/shared/_omniauth_box.html.haml
+++ b/app/views/devise/shared/_omniauth_box.html.haml
@@ -7,7 +7,7 @@
.d-flex.justify-content-between.flex-wrap
- providers.each do |provider|
- has_icon = provider_has_icon?(provider)
- = button_to omniauth_authorize_path(:user, provider), id: "oauth-login-#{provider}", class: "btn gl-button btn-default d-flex align-items-center omniauth-btn text-left oauth-login #{qa_class_for_provider(provider)}" do
+ = button_to omniauth_authorize_path(:user, provider), id: "oauth-login-#{provider}", class: "btn gl-button btn-default omniauth-btn oauth-login #{qa_class_for_provider(provider)}" do
- if has_icon
= provider_image_tag(provider)
%span
diff --git a/app/views/devise/shared/_signup_box.html.haml b/app/views/devise/shared/_signup_box.html.haml
index aa2224b3ea3..2fc89f18de6 100644
--- a/app/views/devise/shared/_signup_box.html.haml
+++ b/app/views/devise/shared/_signup_box.html.haml
@@ -36,7 +36,7 @@
- if show_recaptcha_sign_up?
= recaptcha_tags
.submit-container
- = f.submit button_text, class: 'btn gl-button btn-success', data: { qa_selector: 'new_user_register_button' }
+ = f.submit button_text, class: 'btn gl-button btn-confirm', data: { qa_selector: 'new_user_register_button' }
= render 'devise/shared/terms_of_service_notice'
- if show_omniauth_providers && omniauth_providers_placement == :bottom
= render 'devise/shared/signup_omniauth_providers'
diff --git a/app/views/devise/shared/_signup_omniauth_providers_top.haml b/app/views/devise/shared/_signup_omniauth_providers_top.haml
index 1deacad88c4..a2cf5165c1f 100644
--- a/app/views/devise/shared/_signup_omniauth_providers_top.haml
+++ b/app/views/devise/shared/_signup_omniauth_providers_top.haml
@@ -1,3 +1,3 @@
-= render 'devise/shared/signup_omniauth_provider_list', providers: experiment_enabled_button_based_providers
+= render 'devise/shared/signup_omniauth_provider_list', providers: trial_enabled_button_based_providers
.omniauth-divider.d-flex.align-items-center.text-center
= _("or")
diff --git a/app/views/devise/unlocks/new.html.haml b/app/views/devise/unlocks/new.html.haml
index d145ac3f359..398a4fa0c5e 100644
--- a/app/views/devise/unlocks/new.html.haml
+++ b/app/views/devise/unlocks/new.html.haml
@@ -8,7 +8,7 @@
= f.label :email
= f.email_field :email, class: 'form-control', autofocus: 'autofocus', autocapitalize: 'off', autocorrect: 'off', title: 'Please provide a valid email address.'
.clearfix
- = f.submit 'Resend unlock instructions', class: 'gl-button btn btn-success'
+ = f.submit 'Resend unlock instructions', class: 'gl-button btn btn-confirm'
.clearfix.prepend-top-20
= render 'devise/shared/sign_in_link'
diff --git a/app/views/doorkeeper/applications/_form.html.haml b/app/views/doorkeeper/applications/_form.html.haml
index 39529e59aee..9f5d87a961f 100644
--- a/app/views/doorkeeper/applications/_form.html.haml
+++ b/app/views/doorkeeper/applications/_form.html.haml
@@ -23,4 +23,4 @@
= render 'shared/tokens/scopes_form', prefix: 'doorkeeper_application', token: application, scopes: @scopes
.gl-mt-3
- = f.submit _('Save application'), class: "gl-button btn btn-success"
+ = f.submit _('Save application'), class: "gl-button btn btn-confirm"
diff --git a/app/views/doorkeeper/authorizations/new.html.haml b/app/views/doorkeeper/authorizations/new.html.haml
index d89c4bf0161..7ea10296d97 100644
--- a/app/views/doorkeeper/authorizations/new.html.haml
+++ b/app/views/doorkeeper/authorizations/new.html.haml
@@ -50,4 +50,4 @@
= hidden_field_tag :nonce, @pre_auth.nonce
= hidden_field_tag :code_challenge, @pre_auth.code_challenge
= hidden_field_tag :code_challenge_method, @pre_auth.code_challenge_method
- = submit_tag _("Authorize"), class: "gl-button btn btn-success gl-ml-3", data: { qa_selector: 'authorization_button' }
+ = submit_tag _("Authorize"), class: "gl-button btn btn-confirm gl-ml-3", data: { qa_selector: 'authorization_button' }
diff --git a/app/views/events/event/_push.html.haml b/app/views/events/event/_push.html.haml
index d6662e1fc31..97dd606855b 100644
--- a/app/views/events/event/_push.html.haml
+++ b/app/views/events/event/_push.html.haml
@@ -21,7 +21,8 @@
%ul.content-list.event_commits
= render "events/commit", project: project, event: event
- - create_mr = event.new_ref? && create_mr_button?(project.default_branch, event.ref_name, project) && event.authored_by?(current_user)
+ - create_mr = event.new_ref? && create_mr_button?(from: project.default_branch, to: event.ref_name, source_project: project, target_project: project) && event.authored_by?(current_user)
+ - create_mr_path = create_mr_path(from: project.default_branch, to: event.ref_name, source_project: project, target_project: project) if create_mr
- if event.commits_count > 1
%li.commits-stat
%span ... and #{pluralize(event.commits_count - 1, 'more commit')}.
@@ -40,9 +41,9 @@
- if create_mr
%span
or
- = link_to create_mr_path(project.default_branch, event.ref_name, project) do
+ = link_to create_mr_path do
create a merge request
- elsif create_mr
%li.commits-stat
- = link_to create_mr_path(project.default_branch, event.ref_name, project) do
+ = link_to create_mr_path do
Create Merge Request
diff --git a/app/views/explore/groups/index.html.haml b/app/views/explore/groups/index.html.haml
index f36f30d3638..60132818193 100644
--- a/app/views/explore/groups/index.html.haml
+++ b/app/views/explore/groups/index.html.haml
@@ -2,7 +2,7 @@
- page_title _("Groups")
- header_title _("Groups"), dashboard_groups_path
-= render_dashboard_gold_trial(current_user)
+= render_dashboard_ultimate_trial(current_user)
- if current_user
= render 'dashboard/groups_head'
diff --git a/app/views/explore/projects/index.html.haml b/app/views/explore/projects/index.html.haml
index 44456b6c015..ae59d9c728b 100644
--- a/app/views/explore/projects/index.html.haml
+++ b/app/views/explore/projects/index.html.haml
@@ -3,7 +3,7 @@
- header_title _("Projects"), dashboard_projects_path
- page_canonical_link explore_projects_url
-= render_dashboard_gold_trial(current_user)
+= render_dashboard_ultimate_trial(current_user)
- if current_user
= render 'dashboard/projects_head', project_tab_filter: :explore
diff --git a/app/views/explore/projects/page_out_of_bounds.html.haml b/app/views/explore/projects/page_out_of_bounds.html.haml
index 0ee77ffd7d7..c554cce3dc6 100644
--- a/app/views/explore/projects/page_out_of_bounds.html.haml
+++ b/app/views/explore/projects/page_out_of_bounds.html.haml
@@ -2,7 +2,7 @@
- page_title _("Projects")
- header_title _("Projects"), dashboard_projects_path
-= render_dashboard_gold_trial(current_user)
+= render_dashboard_ultimate_trial(current_user)
- if current_user
= render 'dashboard/projects_head', project_tab_filter: :explore
diff --git a/app/views/explore/projects/starred.html.haml b/app/views/explore/projects/starred.html.haml
index ec92852ddde..a1f2fea5134 100644
--- a/app/views/explore/projects/starred.html.haml
+++ b/app/views/explore/projects/starred.html.haml
@@ -2,7 +2,7 @@
- page_title _("Projects")
- header_title _("Projects"), dashboard_projects_path
-= render_dashboard_gold_trial(current_user)
+= render_dashboard_ultimate_trial(current_user)
- if current_user
= render 'dashboard/projects_head', project_tab_filter: :starred
diff --git a/app/views/explore/projects/trending.html.haml b/app/views/explore/projects/trending.html.haml
index ed508fa2506..e23f63b0064 100644
--- a/app/views/explore/projects/trending.html.haml
+++ b/app/views/explore/projects/trending.html.haml
@@ -2,7 +2,7 @@
- page_title _("Projects")
- header_title _("Projects"), dashboard_projects_path
-= render_dashboard_gold_trial(current_user)
+= render_dashboard_ultimate_trial(current_user)
- if current_user
= render 'dashboard/projects_head', project_tab_filter: :explore_trending
diff --git a/app/views/groups/_home_panel.html.haml b/app/views/groups/_home_panel.html.haml
index 37c4ecc09f3..2df5a6740b0 100644
--- a/app/views/groups/_home_panel.html.haml
+++ b/app/views/groups/_home_panel.html.haml
@@ -23,17 +23,14 @@
.home-panel-buttons.col-md-12.col-lg-6
- if current_user
.gl-display-flex.gl-flex-wrap.gl-lg-justify-content-end.gl-mx-n2{ data: { testid: 'group-buttons' } }
- - if Feature.enabled?(:vue_notification_dropdown, @group, default_enabled: :yaml)
- - if @notification_setting
- .js-vue-notification-dropdown{ data: { disabled: emails_disabled, dropdown_items: notification_dropdown_items(@notification_setting).to_json, notification_level: @notification_setting.level, help_page_path: help_page_path('user/profile/notifications'), group_id: @group.id, container_class: 'gl-mr-3 gl-mt-3 gl-vertical-align-top' } }
- - else
- = render 'shared/notifications/new_button', notification_setting: @notification_setting, btn_class: 'btn gl-button gl-sm-w-auto gl-w-full', dropdown_container_class: 'gl-mr-0 gl-px-2 gl-sm-w-auto gl-w-full', emails_disabled: emails_disabled
+ - if @notification_setting
+ .js-vue-notification-dropdown{ data: { disabled: emails_disabled.to_s, dropdown_items: notification_dropdown_items(@notification_setting).to_json, notification_level: @notification_setting.level, help_page_path: help_page_path('user/profile/notifications'), group_id: @group.id, container_class: 'gl-mx-2 gl-mt-3 gl-vertical-align-top' } }
- if can_create_subgroups
.gl-px-2.gl-sm-w-auto.gl-w-full
- = link_to _("New subgroup"), new_group_path(parent_id: @group.id), class: "btn btn-success btn-md gl-button btn-success-secondary gl-mt-3 gl-sm-w-auto gl-w-full", data: { qa_selector: 'new_subgroup_button' }
+ = link_to _("New subgroup"), new_group_path(parent_id: @group.id), class: "btn btn-default gl-button gl-mt-3 gl-sm-w-auto gl-w-full", data: { qa_selector: 'new_subgroup_button' }
- if can_create_projects
.gl-px-2.gl-sm-w-auto.gl-w-full
- = link_to _("New project"), new_project_path(namespace_id: @group.id), class: "btn btn-success btn-md gl-button gl-mt-3 gl-sm-w-auto gl-w-full", data: { qa_selector: 'new_project_button' }
+ = link_to _("New project"), new_project_path(namespace_id: @group.id), class: "btn btn-confirm gl-button gl-mt-3 gl-sm-w-auto gl-w-full", data: { qa_selector: 'new_project_button' }
- if @group.description.present?
.group-home-desc.mt-1
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 83d2e13d345..2c9d9349f14 100644
--- a/app/views/groups/_import_group_from_another_instance_panel.html.haml
+++ b/app/views/groups/_import_group_from_another_instance_panel.html.haml
@@ -1,6 +1,4 @@
= form_with url: configure_import_bulk_imports_path, class: 'group-form gl-show-field-errors' do |f|
- = form_errors(@group)
-
.gl-border-l-solid.gl-border-r-solid.gl-border-gray-100.gl-border-1.gl-p-5
%h4.gl-display-flex
= s_('GroupsNew|Import groups from another instance of GitLab')
@@ -31,4 +29,4 @@
title: s_('GroupsNew|Please fill in your personal access token.'),
id: 'import_gitlab_token'
.gl-border-gray-100.gl-border-solid.gl-border-1.gl-bg-gray-10.gl-p-5
- = f.submit s_('GroupsNew|Connect instance'), class: 'btn gl-button btn-success'
+ = f.submit s_('GroupsNew|Connect instance'), class: 'btn gl-button btn-confirm'
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 171f3e0371a..c70cc2c4936 100644
--- a/app/views/groups/_import_group_from_file_panel.html.haml
+++ b/app/views/groups/_import_group_from_file_panel.html.haml
@@ -3,8 +3,6 @@
- group_path << parent.full_path + '/' if parent
= form_with url: import_gitlab_group_path, class: 'group-form gl-show-field-errors', multipart: true do |f|
- = form_errors(@group)
-
.gl-border-l-solid.gl-border-r-solid.gl-border-gray-100.gl-border-1.gl-p-5
%h4
= _('Import group from file')
@@ -45,6 +43,6 @@
- import_export_link_start = '<a href="%{url}" target="_blank">'.html_safe % { url: help_page_path('user/group/settings/import_export') }
= s_('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.').html_safe % { link_start: import_export_link_start, link_end: '</a>'.html_safe }
.gl-mt-3
- = render 'shared/file_picker_button', f: f, field: :file, help_text: nil, classes: 'gl-button btn-success-secondary gl-mr-2'
+ = render 'shared/file_picker_button', f: f, field: :file, help_text: nil, classes: 'gl-button btn-confirm-secondary gl-mr-2'
.gl-border-gray-100.gl-border-solid.gl-border-1.gl-bg-gray-10.gl-p-5
- = f.submit _('Import'), class: 'btn gl-button btn-success'
+ = f.submit _('Import'), class: 'btn gl-button btn-confirm'
diff --git a/app/views/groups/_new_group_fields.html.haml b/app/views/groups/_new_group_fields.html.haml
index 64860c61082..14a3b0ece95 100644
--- a/app/views/groups/_new_group_fields.html.haml
+++ b/app/views/groups/_new_group_fields.html.haml
@@ -18,5 +18,5 @@
= render_if_exists 'shared/groups/invite_members'
.row
.form-actions.col-sm-12
- = f.submit _('Create group'), class: "btn gl-button btn-success"
+ = f.submit _('Create group'), class: "btn gl-button btn-confirm"
= link_to _('Cancel'), dashboard_groups_path, class: 'btn gl-button btn-default btn-cancel'
diff --git a/app/views/groups/group_members/index.html.haml b/app/views/groups/group_members/index.html.haml
index a5257ff20bc..da00879ecf9 100644
--- a/app/views/groups/group_members/index.html.haml
+++ b/app/views/groups/group_members/index.html.haml
@@ -1,3 +1,4 @@
+- add_page_specific_style 'page_bundles/members'
- page_title _('Group members')
- can_manage_members = can?(current_user, :admin_group_member, @group)
- show_invited_members = can_manage_members && @invited_members.exists?
@@ -16,8 +17,9 @@
= html_escape(_('You can invite a new member to %{strong_start}%{group_name}%{strong_end}.')) % { group_name: @group.name, strong_start: '<strong>'.html_safe, strong_end: '</strong>'.html_safe }
- if can_invite_members_for_group?(@group)
.gl-w-half.gl-xs-w-full
- .gl-display-flex.gl-flex-wrap.gl-lg-justify-content-end.gl-mx-n2.gl-mb-3
- .js-invite-members-trigger.gl-px-2.gl-sm-w-auto.gl-w-full.gl-mb-4{ data: { classes: 'btn btn-success gl-button gl-mt-3 gl-sm-w-auto gl-w-full', display_text: _('Invite members') } }
+ .gl-display-flex.gl-flex-wrap.gl-justify-content-end.gl-mb-3
+ .js-invite-group-trigger{ data: { classes: 'gl-mt-3 gl-sm-w-auto gl-w-full', display_text: _('Invite a group') } }
+ .js-invite-members-trigger{ data: { variant: 'success', classes: 'gl-mt-3 gl-sm-w-auto gl-w-full gl-sm-ml-3', display_text: _('Invite members') } }
= render 'groups/invite_members_modal', group: @group
- if can_manage_members && !can_invite_members_for_group?(@group)
%hr.gl-mt-4
diff --git a/app/views/groups/milestones/_form.html.haml b/app/views/groups/milestones/_form.html.haml
index ffb0ade4f73..52060e2be16 100644
--- a/app/views/groups/milestones/_form.html.haml
+++ b/app/views/groups/milestones/_form.html.haml
@@ -19,8 +19,8 @@
.form-actions
- if @milestone.new_record?
- = f.submit 'Create milestone', class: "btn-success gl-button btn", data: { qa_selector: "create_milestone_button" }
+ = f.submit 'Create milestone', class: "btn-confirm gl-button btn", data: { qa_selector: "create_milestone_button" }
= link_to "Cancel", group_milestones_path(@group), class: "btn gl-button btn-cancel"
- else
- = f.submit 'Update milestone', class: "btn-success gl-button btn"
+ = f.submit 'Update milestone', class: "btn-confirm gl-button btn"
= link_to "Cancel", group_milestone_path(@group, @milestone), class: "btn gl-button btn-cancel"
diff --git a/app/views/groups/milestones/index.html.haml b/app/views/groups/milestones/index.html.haml
index 2d5dc4c931d..1c7427fef87 100644
--- a/app/views/groups/milestones/index.html.haml
+++ b/app/views/groups/milestones/index.html.haml
@@ -8,7 +8,7 @@
= render 'shared/milestones/search_form'
= render 'shared/milestones_sort_dropdown'
- if can?(current_user, :admin_milestone, @group)
- = link_to _('New milestone'), new_group_milestone_path(@group), class: "btn gl-button btn-success", data: { qa_selector: "new_group_milestone_link" }
+ = 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'
diff --git a/app/views/groups/projects.html.haml b/app/views/groups/projects.html.haml
index 784f477673a..9d595d19779 100644
--- a/app/views/groups/projects.html.haml
+++ b/app/views/groups/projects.html.haml
@@ -7,7 +7,7 @@
projects:
- if can? current_user, :admin_group, @group
.controls
- = link_to new_project_path(namespace_id: @group.id), class: "btn gl-button btn-sm btn-success" do
+ = link_to new_project_path(namespace_id: @group.id), class: "btn gl-button btn-sm btn-confirm" do
New project
%ul.projects-list.content-list.group-settings-projects
- @projects.each do |project|
diff --git a/app/views/groups/registry/repositories/index.html.haml b/app/views/groups/registry/repositories/index.html.haml
index 899e58050af..fa6bd021e45 100644
--- a/app/views/groups/registry/repositories/index.html.haml
+++ b/app/views/groups/registry/repositories/index.html.haml
@@ -12,7 +12,6 @@
"registry_host_url_with_port" => escape_once(registry_config.host_port),
"garbage_collection_help_page_path" => help_page_path('administration/packages/container_registry', anchor: 'container-registry-garbage-collection'),
"run_cleanup_policies_help_page_path" => help_page_path('administration/packages/container_registry', anchor: 'run-the-cleanup-policy-now'),
- "cleanup_policies_help_page_path" => help_page_path('user/packages/container_registry/index', anchor: 'how-the-cleanup-policy-works'),
"is_admin": current_user&.admin.to_s,
is_group_page: "true",
"group_path": @group.full_path,
diff --git a/app/views/groups/settings/_advanced.html.haml b/app/views/groups/settings/_advanced.html.haml
index 627807841c5..fddb83114f3 100644
--- a/app/views/groups/settings/_advanced.html.haml
+++ b/app/views/groups/settings/_advanced.html.haml
@@ -8,7 +8,7 @@
%p
= s_('GroupSettings|Changing group URL can have unintended side effects.')
= succeed '.' do
- = link_to _('Learn more'), help_page_path('user/group/index', anchor: 'changing-a-groups-path'), target: '_blank'
+ = link_to _('Learn more'), help_page_path('user/group/index', anchor: 'change-a-groups-path'), target: '_blank'
.input-group.gl-field-error-anchor
.group-root-path.input-group-prepend.has-tooltip{ title: group_path(@group), :'data-placement' => 'bottom' }
diff --git a/app/views/groups/settings/_general.html.haml b/app/views/groups/settings/_general.html.haml
index 8ad5755fef8..f5cd7dde6a4 100644
--- a/app/views/groups/settings/_general.html.haml
+++ b/app/views/groups/settings/_general.html.haml
@@ -1,3 +1,5 @@
+- enable_search_settings locals: { container_class: 'gl-my-5' }
+
= form_for @group, html: { multipart: true, class: 'gl-show-field-errors js-general-settings-form' }, authenticity_token: true do |f|
%input{ type: 'hidden', name: 'update_section', value: 'js-general-settings' }
= form_errors(@group)
@@ -29,4 +31,4 @@
= link_to _('Remove avatar'), group_avatar_path(@group.to_param), data: { confirm: _('Avatar will be removed. Are you sure?')}, method: :delete, class: 'btn btn-link'
= render 'shared/visibility_level', f: f, visibility_level: @group.visibility_level, can_change_visibility_level: can_change_group_visibility_level?(@group), form_model: @group
- = f.submit _('Save changes'), class: 'btn gl-button btn-success mt-4 js-dirty-submit', data: { qa_selector: 'save_name_visibility_settings_button' }
+ = f.submit _('Save changes'), class: 'btn gl-button btn-confirm mt-4 js-dirty-submit', data: { qa_selector: 'save_name_visibility_settings_button' }
diff --git a/app/views/groups/settings/_pages_settings.html.haml b/app/views/groups/settings/_pages_settings.html.haml
index 273714d4dcc..a7b1813e4f1 100644
--- a/app/views/groups/settings/_pages_settings.html.haml
+++ b/app/views/groups/settings/_pages_settings.html.haml
@@ -2,4 +2,4 @@
= render_if_exists 'shared/pages/max_pages_size_input', form: f
.gl-mt-3
- = f.submit s_('GitLabPages|Save'), class: 'btn gl-button btn-success'
+ = f.submit s_('GitLabPages|Save'), class: 'btn gl-button btn-confirm'
diff --git a/app/views/groups/settings/_permissions.html.haml b/app/views/groups/settings/_permissions.html.haml
index 6e2c28ba2e8..dc20e796846 100644
--- a/app/views/groups/settings/_permissions.html.haml
+++ b/app/views/groups/settings/_permissions.html.haml
@@ -41,4 +41,4 @@
= render 'groups/settings/two_factor_auth', f: f, group: @group
= render_if_exists 'groups/personal_access_token_expiration_policy', f: f, group: @group
= render_if_exists 'groups/member_lock_setting', f: f, group: @group
- = f.submit _('Save changes'), class: 'btn gl-button btn-success gl-mt-3 js-dirty-submit', data: { qa_selector: 'save_permissions_changes_button' }
+ = f.submit _('Save changes'), class: 'btn gl-button btn-confirm gl-mt-3 js-dirty-submit', data: { qa_selector: 'save_permissions_changes_button' }
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 c18fe79be05..dedb87c51ef 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
@@ -12,4 +12,4 @@
.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'
- = f.submit _('Save changes'), class: 'btn gl-button btn-success gl-mt-5'
+ = f.submit _('Save changes'), class: 'btn gl-button btn-confirm gl-mt-5'
diff --git a/app/views/groups/settings/ci_cd/_form.html.haml b/app/views/groups/settings/ci_cd/_form.html.haml
index eb61ecf5536..c5cc3eb693c 100644
--- a/app/views/groups/settings/ci_cd/_form.html.haml
+++ b/app/views/groups/settings/ci_cd/_form.html.haml
@@ -10,4 +10,4 @@
= _("The maximum file size in megabytes for individual job artifacts.")
= link_to sprite_icon('question-o'), help_page_path('user/admin_area/settings/continuous_integration', anchor: 'maximum-artifacts-size'), target: '_blank'
- = f.submit _('Save changes'), class: "btn gl-button btn-success"
+ = f.submit _('Save changes'), class: "btn gl-button btn-confirm"
diff --git a/app/views/groups/settings/ci_cd/show.html.haml b/app/views/groups/settings/ci_cd/show.html.haml
index 1badb7b6ba1..574750d5f57 100644
--- a/app/views/groups/settings/ci_cd/show.html.haml
+++ b/app/views/groups/settings/ci_cd/show.html.haml
@@ -1,9 +1,11 @@
-- breadcrumb_title _("CI / CD Settings")
-- page_title _("CI / CD")
+- breadcrumb_title _("CI/CD Settings")
+- page_title _("CI/CD")
- expanded = expanded_by_default?
- general_expanded = @group.errors.empty? ? expanded : true
+- enable_search_settings locals: { container_class: 'gl-my-5' }
+
-# 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,
- if can?(current_user, :update_max_artifacts_size, @group)
diff --git a/app/views/groups/settings/packages_and_registries/index.html.haml b/app/views/groups/settings/packages_and_registries/index.html.haml
index 1a12ad4902b..21eef20a987 100644
--- a/app/views/groups/settings/packages_and_registries/index.html.haml
+++ b/app/views/groups/settings/packages_and_registries/index.html.haml
@@ -2,4 +2,6 @@
- page_title _('Packages & Registries')
- @content_class = 'limit-container-width' unless fluid_layout
+- enable_search_settings locals: { container_class: 'gl-my-5' }
+
%section#js-packages-and-registries-settings{ data: { default_expanded: expanded_by_default?.to_s, group_path: @group.full_path } }
diff --git a/app/views/groups/settings/repository/_initial_branch_name.html.haml b/app/views/groups/settings/repository/_initial_branch_name.html.haml
index 1881ec31b0c..efe690a0c2d 100644
--- a/app/views/groups/settings/repository/_initial_branch_name.html.haml
+++ b/app/views/groups/settings/repository/_initial_branch_name.html.haml
@@ -19,4 +19,4 @@
= (_("Changes affect new repositories only. If not specified, either the configured application-wide default or Git's default name %{branch_name_default} will be used.") % { branch_name_default: fallback_branch_name }).html_safe
= f.hidden_field :redirect_target, value: "repository_settings"
- = f.submit _('Save changes'), class: 'btn gl-button btn-success'
+ = f.submit _('Save changes'), class: 'btn gl-button btn-confirm'
diff --git a/app/views/groups/settings/repository/show.html.haml b/app/views/groups/settings/repository/show.html.haml
index a5819320405..b15d36c631a 100644
--- a/app/views/groups/settings/repository/show.html.haml
+++ b/app/views/groups/settings/repository/show.html.haml
@@ -1,6 +1,8 @@
- breadcrumb_title _('Repository Settings')
- page_title _('Repository')
+- enable_search_settings locals: { container_class: 'gl-my-5' }
+
- deploy_token_description = s_('DeployTokens|Group deploy tokens allow access to the packages, repositories, and registry images within the group.')
= render "shared/deploy_tokens/index", group_or_project: @group, description: deploy_token_description
diff --git a/app/views/groups/show.html.haml b/app/views/groups/show.html.haml
index d1787d36cd2..a1557cda071 100644
--- a/app/views/groups/show.html.haml
+++ b/app/views/groups/show.html.haml
@@ -16,11 +16,6 @@
= content_for :meta_tags do
= auto_discovery_link_tag(:atom, group_url(@group, rss_url_options), title: "#{@group.name} activity")
-= content_for :invite_members_sidebar do
- - if can_invite_members_for_group?(@group)
- %li
- .js-invite-members-trigger{ data: { icon: 'plus', classes: 'gl-text-decoration-none! gl-shadow-none!', display_text: _('Invite team members') } }
-
= render partial: 'flash_messages'
= render_if_exists 'trials/banner', namespace: @group
diff --git a/app/views/groups/sidebar/_packages_settings.html.haml b/app/views/groups/sidebar/_packages_settings.html.haml
index 87300ed39ed..78533aba75f 100644
--- a/app/views/groups/sidebar/_packages_settings.html.haml
+++ b/app/views/groups/sidebar/_packages_settings.html.haml
@@ -1,5 +1,5 @@
- if group_packages_list_nav?
= nav_link(controller: :packages_and_registries) do
- = link_to group_settings_packages_and_registries_path(@group), title: _('Packages & Registries') do
+ = link_to group_settings_packages_and_registries_path(@group), title: _('Packages & Registries'), data: { qa_selector: 'group_package_settings_link' } do
%span
= _('Packages & Registries')
diff --git a/app/views/import/bulk_imports/status.html.haml b/app/views/import/bulk_imports/status.html.haml
index 778bc1ef1a4..917d88af75a 100644
--- a/app/views/import/bulk_imports/status.html.haml
+++ b/app/views/import/bulk_imports/status.html.haml
@@ -9,4 +9,5 @@
available_namespaces_path: import_available_namespaces_path(format: :json),
create_bulk_import_path: import_bulk_imports_path(format: :json),
jobs_path: realtime_changes_import_bulk_imports_path(format: :json),
- source_url: @source_url } }
+ source_url: @source_url,
+ group_path_regex: Gitlab::PathRegex::NAMESPACE_FORMAT_REGEX_JS } }
diff --git a/app/views/import/github/new.html.haml b/app/views/import/github/new.html.haml
index 7e49cad7902..759dfa1e842 100644
--- a/app/views/import/github/new.html.haml
+++ b/app/views/import/github/new.html.haml
@@ -30,5 +30,5 @@
= render_if_exists 'import/github/ci_cd_only'
.form-actions.d-flex.justify-content-end
- = link_to _('Cancel'), new_project_path, class: 'btn'
- = submit_tag _('Authenticate'), class: 'btn btn-success ml-2', data: { qa_selector: 'authenticate_button' }
+ = link_to _('Cancel'), new_project_path, class: 'gl-button btn btn-default'
+ = submit_tag _('Authenticate'), class: 'gl-button btn btn-confirm ml-2', data: { qa_selector: 'authenticate_button' }
diff --git a/app/views/import/shared/_new_project_form.html.haml b/app/views/import/shared/_new_project_form.html.haml
index b053d14a851..bfc4e65e23d 100644
--- a/app/views/import/shared/_new_project_form.html.haml
+++ b/app/views/import/shared/_new_project_form.html.haml
@@ -1,7 +1,7 @@
.row
.form-group.project-name.col-sm-12
= label_tag :name, _('Project name'), class: 'label-bold'
- = text_field_tag :name, @name, placeholder: "My awesome project", class: "js-project-name form-control input-lg", autofocus: true
+ = text_field_tag :name, @name, placeholder: "My awesome project", class: "js-project-name form-control input-lg", autofocus: true, required: true, aria: { required: true }
.form-group.col-12.col-sm-6
= label_tag :namespace_id, _('Project URL'), class: 'label-bold'
.form-group
@@ -18,4 +18,4 @@
= hidden_field_tag :namespace_id, current_user.namespace_id
.form-group.col-12.col-sm-6.project-path
= label_tag :path, _('Project slug'), class: 'label-bold'
- = text_field_tag :path, @path, placeholder: "my-awesome-project", class: "js-path-name form-control", required: true
+ = text_field_tag :path, @path, placeholder: "my-awesome-project", class: "js-path-name form-control", required: true, aria: { required: true }
diff --git a/app/views/jira_connect/subscriptions/index.html.haml b/app/views/jira_connect/subscriptions/index.html.haml
index a549ed3540b..c7873991010 100644
--- a/app/views/jira_connect/subscriptions/index.html.haml
+++ b/app/views/jira_connect/subscriptions/index.html.haml
@@ -1,61 +1,51 @@
-%header.jira-connect-header
- = brand_header_logo
+%header.jira-connect-header.gl-display-flex.gl-align-items-center.gl-justify-content-center.gl-px-5.gl-border-b-solid.gl-border-b-gray-100.gl-border-b-1.gl-bg-white
+ = link_to brand_header_logo, Gitlab.config.gitlab.url, target: '_blank', rel: 'noopener noreferrer'
-.jira-connect-user
+.jira-connect-user.gl-font-base
- if current_user
- user_link = link_to(current_user.to_reference, jira_connect_users_path, target: '_blank', rel: 'noopener noreferrer', class: 'js-jira-connect-sign-in')
= _('Signed in to GitLab as %{user_link}').html_safe % { user_link: user_link }
- elsif @subscriptions.present?
= link_to _('Sign in to GitLab'), jira_connect_users_path, target: '_blank', rel: 'noopener noreferrer', class: 'js-jira-connect-sign-in'
-.jira-connect-app
+%main.jira-connect-app.gl-px-5.gl-pt-7.gl-mx-auto
- if current_user.blank? && @subscriptions.empty?
- %h2= s_('JiraService|GitLab for Jira Configuration')
- %p= s_('JiraService|Sign in to GitLab.com to get started.')
+ .jira-connect-app-body.gl-text-center
+ %h2= s_('JiraService|GitLab for Jira Configuration')
+ %p= s_('JiraService|Sign in to GitLab.com to get started.')
- .gl-mt-7
- - sign_in_button_class = new_jira_connect_ui? ? 'btn gl-button btn-confirm' : 'ak-button ak-button__appearance-primary'
- = external_link _('Sign in to GitLab'), jira_connect_users_path, class: "#{sign_in_button_class} js-jira-connect-sign-in"
+ .gl-mt-7
+ = external_link _('Sign in to GitLab'), jira_connect_users_path, class: "btn gl-button btn-confirm js-jira-connect-sign-in"
- .gl-mt-7
- %p Note: this integration only works with accounts on GitLab.com (SaaS).
+ .gl-mt-7
+ %p= s_('Integrations|Note: this integration only works with accounts on GitLab.com (SaaS).')
- else
.js-jira-connect-app{ data: jira_connect_app_data(@subscriptions) }
- - unless new_jira_connect_ui?
- %form#add-subscription-form.subscription-form{ action: jira_connect_subscriptions_path }
- .ak-field-group
- %label
- GitLab namespace
-
- .ak-field-group.field-group-input
- %input#namespace-input.ak-field-text{ type: 'text', required: true, placeholder: 'e.g. "MyCompany" or "MyCompany/GroupName"' }
- %button.ak-button.ak-button__appearance-primary{ type: 'submit' }
- Link namespace to Jira
-
- - if @subscriptions.present?
- %table.subscriptions.gl-w-full
- %thead
- %tr
- %th Namespace
- %th Added
- %th
- %tbody
- - @subscriptions.each do |subscription|
+ .jira-connect-app-body
+ - if @subscriptions.present?
+ %table.subscriptions.gl-w-full
+ %thead
%tr
- %td= subscription.namespace.full_path
- %td= subscription.created_at
- %td= link_to 'Remove', jira_connect_subscription_path(subscription), class: 'js-jira-connect-remove-subscription'
- - else
- %h4.empty-subscriptions
- No linked namespaces
- %p= s_('Integrations|Namespaces are your GitLab groups and subgroups that will be linked to this Jira instance.')
-
- %p.browser-limitations-notice
- %strong Browser limitations:
- Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use
- %a{ href: 'https://www.mozilla.org/en-US/firefox/', target: '_blank', rel: 'noopener noreferrer' } Firefox
- or enable cross‑site cookies in your browser when adding a namespace.
+ %th= _('Namespace')
+ %th= _('Added')
+ %th
+ %tbody
+ - @subscriptions.each do |subscription|
+ %tr
+ %td= subscription.namespace.full_path
+ %td= subscription.created_at
+ %td= link_to _('Remove'), jira_connect_subscription_path(subscription), class: 'js-jira-connect-remove-subscription'
+ - else
+ .gl-text-center
+ %h4= s_('Integrations|No linked namespaces')
+ %p= s_('Integrations|Namespaces are your GitLab groups and subgroups that will be linked to this Jira instance.')
+
+ %p.jira-connect-app-body.gl-mt-7.gl-font-base.gl-text-center
+ %strong= s_('Integrations|Browser limitations')
+ - firefox_link_url = 'https://www.mozilla.org/en-US/firefox/'
+ - firefox_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: firefox_link_url }
+ = s_('Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace.').html_safe % { firefox_link_start: firefox_link_start, firefox_link_end: '</a>'.html_safe }
= link_to _('Learn more'), 'https://gitlab.com/gitlab-org/gitlab/-/issues/284211', target: '_blank', rel: 'noopener noreferrer'
= webpack_bundle_tag 'performance_bar' if performance_bar_enabled?
diff --git a/app/views/layouts/_head.html.haml b/app/views/layouts/_head.html.haml
index 8b430f579e9..601598d65da 100644
--- a/app/views/layouts/_head.html.haml
+++ b/app/views/layouts/_head.html.haml
@@ -44,6 +44,7 @@
= yield :page_specific_styles
= stylesheet_link_tag_defer "application_utilities"
= stylesheet_link_tag "disable_animations", media: "all" if Rails.env.test? || Gitlab.config.gitlab['disable_animations']
+ = stylesheet_link_tag "test_environment", media: "all" if Rails.env.test?
= stylesheet_link_tag_defer "highlight/themes/#{user_color_scheme}"
@@ -54,14 +55,12 @@
= Gon::Base.render_data(nonce: content_security_policy_nonce)
= javascript_include_tag locale_path unless I18n.locale == :en
- -# Temporarily commented out to investigate performance: https://gitlab.com/gitlab-org/gitlab/-/issues/251179
- -# = webpack_bundle_tag "sentry" if Gitlab.config.sentry.enabled
+ = webpack_bundle_tag "sentry" if Gitlab.config.sentry.enabled
= webpack_bundle_tag 'performance_bar' if performance_bar_enabled?
= yield :page_specific_javascripts
= webpack_controller_bundle_tags
- = webpack_bundle_tag "chrome_84_icon_fix" if browser.chrome?([">=84", "<84.0.4147.125"]) || browser.edge?([">=84", "<84.0.522.59"])
= yield :project_javascripts
diff --git a/app/views/layouts/_snowplow.html.haml b/app/views/layouts/_snowplow.html.haml
index 9d14dfb3786..bdce4eac755 100644
--- a/app/views/layouts/_snowplow.html.haml
+++ b/app/views/layouts/_snowplow.html.haml
@@ -8,3 +8,6 @@
n.src=w;g.parentNode.insertBefore(n,g)}}(window,document,"script","#{asset_url('snowplow/sp.js')}","snowplow"));
window.snowplowOptions = #{Gitlab::Tracking.snowplow_options(@group).to_json}
+
+ gl = window.gl || {};
+ gl.snowplowStandardContext = #{Gitlab::Tracking::StandardContext.new.to_context.to_json.to_json}
diff --git a/app/views/layouts/jira_connect.html.haml b/app/views/layouts/jira_connect.html.haml
index da45d84a83b..6acd7799875 100644
--- a/app/views/layouts/jira_connect.html.haml
+++ b/app/views/layouts/jira_connect.html.haml
@@ -3,14 +3,10 @@
%meta{ content: "text/html; charset=utf-8", "http-equiv" => "Content-Type" }
%title
GitLab
- - unless new_jira_connect_ui?
- = stylesheet_link_tag 'https://unpkg.com/@atlaskit/css-reset@3.0.6/dist/bundle.css'
- = stylesheet_link_tag 'https://unpkg.com/@atlaskit/reduced-ui-pack@10.5.5/dist/bundle.css'
= yield :page_specific_styles
= javascript_include_tag 'https://connect-cdn.atl-paas.net/all.js'
= Gon::Base.render_data(nonce: content_security_policy_nonce)
= yield :head
%body
- .ac-content
- = yield
+ = yield
diff --git a/app/views/layouts/nav/groups_dropdown/_show.html.haml b/app/views/layouts/nav/groups_dropdown/_show.html.haml
index d0394451a61..a9d88341a19 100644
--- a/app/views/layouts/nav/groups_dropdown/_show.html.haml
+++ b/app/views/layouts/nav/groups_dropdown/_show.html.haml
@@ -8,5 +8,11 @@
= nav_link(path: 'groups#explore') do
= link_to explore_groups_path, data: { track_label: "groups_dropdown_explore_groups", track_event: "click_link" } do
= _('Explore groups')
+ = nav_link(path: 'groups/new#create-group-pane', html_options: { class: 'gl-border-0 gl-border-t-1 gl-border-solid gl-border-gray-100' }) do
+ = link_to new_group_path(anchor: 'create-group-pane'), data: { track_label: "groups_dropdown_create_group", track_event: "click_link" } do
+ = _('Create group')
+ = nav_link(path: 'groups/new#import-group-pane') do
+ = link_to new_group_path(anchor: 'import-group-pane'), data: { track_label: "groups_dropdown_import_group", track_event: "click_link" } do
+ = _('Import group')
.frequent-items-dropdown-content
#js-groups-dropdown{ data: { user_name: current_user.username, group: group_meta } }
diff --git a/app/views/layouts/nav/projects_dropdown/_show.html.haml b/app/views/layouts/nav/projects_dropdown/_show.html.haml
index 91f999a9a74..d8bf64fab64 100644
--- a/app/views/layouts/nav/projects_dropdown/_show.html.haml
+++ b/app/views/layouts/nav/projects_dropdown/_show.html.haml
@@ -11,5 +11,16 @@
= nav_link(path: 'projects#trending') do
= link_to explore_root_path, data: { track_label: "projects_dropdown_explore_projects", track_event: "click_link" } do
= _('Explore projects')
+ = nav_link(path: 'projects/new#blank_project',
+ html_options: { class: 'gl-border-0 gl-border-t-1 gl-border-solid gl-border-gray-100' },
+ data: { track_label: "projects_dropdown_blank_project", track_event: "click_link" }) do
+ = link_to new_project_path(anchor: 'blank_project') do
+ = _('Create blank project')
+ = nav_link(path: 'projects/new#import_project') do
+ = link_to new_project_path(anchor: 'import_project'), data: { track_label: "projects_dropdown_import_project", track_event: "click_link" } do
+ = _('Import project')
+ = nav_link(path: 'projects/new#create_from_template') do
+ = link_to new_project_path(anchor: 'create_from_template'), data: { track_label: "projects_dropdown_create_from_template", track_event: "click_link" } do
+ = _('Create from template')
.frequent-items-dropdown-content
#js-projects-dropdown{ data: { user_name: current_user.username, project: project_meta } }
diff --git a/app/views/layouts/nav/sidebar/_admin.html.haml b/app/views/layouts/nav/sidebar/_admin.html.haml
index f887d335807..d756867541b 100644
--- a/app/views/layouts/nav/sidebar/_admin.html.haml
+++ b/app/views/layouts/nav/sidebar/_admin.html.haml
@@ -65,11 +65,10 @@
= link_to admin_dev_ops_report_path, title: _('DevOps Report') do
%span
= _('DevOps Report')
- - if Feature.enabled?(:instance_statistics, default_enabled: true)
- = nav_link(controller: :instance_statistics) do
- = link_to admin_instance_statistics_path, title: _('Usage Trends') do
- %span
- = _('Usage Trends')
+ = nav_link(controller: :usage_trends) do
+ = link_to admin_usage_trends_path, title: _('Usage Trends') do
+ %span
+ = _('Usage Trends')
= nav_link(controller: admin_monitoring_nav_links) do
= link_to admin_system_info_path, data: { qa_selector: 'admin_monitoring_link' } do
diff --git a/app/views/layouts/nav/sidebar/_group.html.haml b/app/views/layouts/nav/sidebar/_group.html.haml
index e99b2f443be..7350db64462 100644
--- a/app/views/layouts/nav/sidebar/_group.html.haml
+++ b/app/views/layouts/nav/sidebar/_group.html.haml
@@ -137,8 +137,6 @@
%strong.fly-out-top-item-name
= _('Members')
- = content_for :invite_members_sidebar
-
- if group_sidebar_link?(:settings)
= nav_link(path: group_settings_nav_link_paths) do
= link_to edit_group_path(@group) do
@@ -173,9 +171,9 @@
= _('Repository')
= nav_link(controller: :ci_cd) do
- = link_to group_settings_ci_cd_path(@group), title: _('CI / CD') do
+ = link_to group_settings_ci_cd_path(@group), title: _('CI/CD') do
%span
- = _('CI / CD')
+ = _('CI/CD')
= render 'groups/sidebar/packages_settings'
diff --git a/app/views/layouts/nav/sidebar/_profile.html.haml b/app/views/layouts/nav/sidebar/_profile.html.haml
index a66110f28e8..4ae81d69c16 100644
--- a/app/views/layouts/nav/sidebar/_profile.html.haml
+++ b/app/views/layouts/nav/sidebar/_profile.html.haml
@@ -3,7 +3,7 @@
.context-header
= link_to profile_path, title: _('Profile Settings') do
.avatar-container.s40.settings-avatar
- = image_tag avatar_icon_for_user(current_user, 40), class: "avatar s40 avatar-tile", alt: current_user.name
+ = image_tag avatar_icon_for_user(current_user, 40), class: "avatar s40 avatar-tile js-sidebar-user-avatar", alt: current_user.name, data: { testid: 'sidebar-user-avatar' }
.sidebar-context-title= _('User Settings')
%ul.sidebar-top-level-items
= nav_link(path: 'profiles#show', html_options: {class: 'home'}) do
diff --git a/app/views/layouts/nav/sidebar/_project.html.haml b/app/views/layouts/nav/sidebar/_project.html.haml
index 8bb009bfd17..4c331dbd69d 100644
--- a/app/views/layouts/nav/sidebar/_project.html.haml
+++ b/app/views/layouts/nav/sidebar/_project.html.haml
@@ -86,7 +86,7 @@
= render_if_exists 'projects/sidebar/repository_locked_files'
- if project_nav_tab? :issues
- = nav_link(controller: @project.issues_enabled? ? ['projects/issues', :labels, :milestones, :boards] : 'projects/issues') do
+ = nav_link(controller: @project.issues_enabled? ? ['projects/issues', :labels, :milestones, :boards, :iterations] : 'projects/issues') do
= link_to project_issues_path(@project), class: 'shortcuts-issues qa-issues-item' do
.nav-icon-container
= sprite_icon('issues')
@@ -179,13 +179,13 @@
.nav-icon-container
= sprite_icon('rocket')
%span.nav-item-name#js-onboarding-pipelines-link
- = _('CI / CD')
+ = _('CI/CD')
%ul.sidebar-sub-level-items
= nav_link(controller: [:pipelines, :builds, :jobs, :pipeline_schedules, :artifacts, :test_cases, :pipeline_editor], html_options: { class: "fly-out-top-item" }) do
= link_to project_pipelines_path(@project) do
%strong.fly-out-top-item-name
- = _('CI / CD')
+ = _('CI/CD')
%li.divider.fly-out-top-item
- if project_nav_tab? :pipelines
= nav_link(path: ['pipelines#index', 'pipelines#show']) do
@@ -286,7 +286,7 @@
- if project_nav_tab? :clusters
- show_cluster_hint = show_gke_cluster_integration_callout?(@project)
- = nav_link(controller: [:clusters, :user, :gcp]) do
+ = nav_link(controller: [:cluster_agents, :clusters]) do
= link_to project_clusters_path(@project), title: _('Kubernetes'), class: 'shortcuts-kubernetes' do
%span
= _('Kubernetes')
@@ -378,8 +378,6 @@
%strong.fly-out-top-item-name
= _('Members')
- = content_for :invite_members_sidebar
-
- if project_nav_tab? :settings
= nav_link(path: sidebar_settings_paths) do
= link_to edit_project_path(@project) do
@@ -420,9 +418,9 @@
= _('Repository')
- if !@project.archived? && @project.feature_available?(:builds, current_user)
= nav_link(controller: :ci_cd) do
- = link_to project_settings_ci_cd_path(@project), title: _('CI / CD') do
+ = link_to project_settings_ci_cd_path(@project), title: _('CI/CD') do
%span
- = _('CI / CD')
+ = _('CI/CD')
- if settings_operations_available?
= nav_link(controller: [:operations]) do
= link_to project_settings_operations_path(@project), title: _('Operations'), data: { qa_selector: 'operations_settings_link' } do
diff --git a/app/views/notify/_users_list.html.haml b/app/views/notify/_users_list.html.haml
new file mode 100644
index 00000000000..3e436ea8765
--- /dev/null
+++ b/app/views/notify/_users_list.html.haml
@@ -0,0 +1,10 @@
+%tr
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;border-top:1px solid #ededed;" }
+ = user_label
+ %td{ style: "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; margin: 0; padding: 14px 0 0px 5px; font-size: 15px; line-height: 1.4; color: #333333; font-weight: 400; width: 75%; border-top-style: solid; border-top-color: #ededed; border-top-width: 1px; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt;" }
+ %ul.users-list{ style: "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; font-size: 15px; line-height: 1.4; padding-right: 5px; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt;" }
+ - users.each do |user|
+ %li
+ %img.avatar{ alt: "Avatar", height: "24", src: avatar_icon_for_user(user, 24, only_path: false), style: "border-radius: 12px; max-width: 100%; height: auto; -ms-interpolation-mode: bicubic; margin: -2px 0;", width: "24" }
+ %a.muted{ href: user_url(user), style: "color: #333333; text-decoration: none; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; vertical-align: top;" }
+ = user.name
diff --git a/app/views/notify/access_token_about_to_expire_email.html.haml b/app/views/notify/access_token_about_to_expire_email.html.haml
index 240c7300c7f..ea27f72764f 100644
--- a/app/views/notify/access_token_about_to_expire_email.html.haml
+++ b/app/views/notify/access_token_about_to_expire_email.html.haml
@@ -1,7 +1,11 @@
%p
= _('Hi %{username}!') % { username: sanitize_name(@user.name) }
%p
- = _('One or more of your personal access tokens will expire in %{days_to_expire} days or less.') % { days_to_expire: @days_to_expire }
+ = _('One or more of your personal access tokens will expire in %{days_to_expire} days or less:') % { days_to_expire: @days_to_expire }
%p
- - pat_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: @target_url }
+ %ul
+ - @token_names.each do |token|
+ %li= token
+%p
+ - pat_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: @target_url }
= html_escape(_('You can create a new one or check them in your %{pat_link_start}personal access tokens%{pat_link_end} settings')) % { pat_link_start: pat_link_start, pat_link_end: '</a>'.html_safe }
diff --git a/app/views/notify/access_token_about_to_expire_email.text.erb b/app/views/notify/access_token_about_to_expire_email.text.erb
index edcec51aeb4..dc9b1379e47 100644
--- a/app/views/notify/access_token_about_to_expire_email.text.erb
+++ b/app/views/notify/access_token_about_to_expire_email.text.erb
@@ -1,5 +1,9 @@
<%= _('Hi %{username}!') % { username: sanitize_name(@user.name) } %>
-<%= _('One or more of your personal access tokens will expire in %{days_to_expire} days or less.') % { days_to_expire: @days_to_expire} %>
+<%= _('One or more of your personal access tokens will expire in %{days_to_expire} days or less:') % { days_to_expire: @days_to_expire } %>
+
+<% @token_names.each do |token| %>
+ - <%= token %>
+<% end %>
<%= _('You can create a new one or check them in your personal access tokens settings %{pat_link}') % { pat_link: @target_url } %>
diff --git a/app/views/notify/change_in_merge_request_draft_status_email.html.haml b/app/views/notify/change_in_merge_request_draft_status_email.html.haml
new file mode 100644
index 00000000000..5604a30d9f1
--- /dev/null
+++ b/app/views/notify/change_in_merge_request_draft_status_email.html.haml
@@ -0,0 +1,2 @@
+%p
+ = _('%{username} changed the draft status of merge request %{mr_reference}' % {username: sanitize_name(@updated_by_user.name), mr_reference: @merge_request.to_reference })
diff --git a/app/views/notify/change_in_merge_request_draft_status_email.text.erb b/app/views/notify/change_in_merge_request_draft_status_email.text.erb
new file mode 100644
index 00000000000..4e2df2dff1d
--- /dev/null
+++ b/app/views/notify/change_in_merge_request_draft_status_email.text.erb
@@ -0,0 +1 @@
+<%= "#{sanitize_name(@updated_by_user.name)} changed the draft status of merge request #{@merge_request.to_reference}" %>
diff --git a/app/views/notify/closed_merge_request_email.text.haml b/app/views/notify/closed_merge_request_email.text.haml
index 8546da2d7f0..28766f861d9 100644
--- a/app/views/notify/closed_merge_request_email.text.haml
+++ b/app/views/notify/closed_merge_request_email.text.haml
@@ -6,3 +6,4 @@ Merge Request URL: #{project_merge_request_url(@merge_request.target_project, @m
Author: #{sanitize_name(@merge_request.author_name)}
= assignees_label(@merge_request)
+= reviewers_label(@merge_request)
diff --git a/app/views/notify/merge_request_status_email.text.haml b/app/views/notify/merge_request_status_email.text.haml
index 3d7115856d4..ab663b65199 100644
--- a/app/views/notify/merge_request_status_email.text.haml
+++ b/app/views/notify/merge_request_status_email.text.haml
@@ -6,3 +6,4 @@ Merge Request URL: #{project_merge_request_url(@merge_request.target_project, @m
Author: #{sanitize_name(@merge_request.author_name)}
= assignees_label(@merge_request)
+= reviewers_label(@merge_request)
diff --git a/app/views/notify/merge_request_unmergeable_email.text.haml b/app/views/notify/merge_request_unmergeable_email.text.haml
index 412a0887186..a23d083747c 100644
--- a/app/views/notify/merge_request_unmergeable_email.text.haml
+++ b/app/views/notify/merge_request_unmergeable_email.text.haml
@@ -6,3 +6,4 @@ Merge Request URL: #{project_merge_request_url(@merge_request.target_project, @m
Author: #{sanitize_name(@merge_request.author_name)}
= assignees_label(@merge_request)
+= reviewers_label(@merge_request)
diff --git a/app/views/notify/merge_when_pipeline_succeeds_email.html.haml b/app/views/notify/merge_when_pipeline_succeeds_email.html.haml
index 4db213fb229..e7c51c8fb13 100644
--- a/app/views/notify/merge_when_pipeline_succeeds_email.html.haml
+++ b/app/views/notify/merge_when_pipeline_succeeds_email.html.haml
@@ -42,13 +42,13 @@
}
}
- ul.assignees-list {
+ ul.users-list {
list-style: none;
padding: 0px;
display: block;
margin-top: 0px;
}
- ul.assignees-list li {
+ ul.users-list li {
display: inline-block;
padding-right: 12px;
padding-top: 8px;
@@ -137,16 +137,10 @@
= @merge_request.author.name
- if @merge_request.assignees.any?
- %tr
- %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;border-top:1px solid #ededed;" }
- = assignees_label(@merge_request, include_value: false)
- %td{ style: "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; margin: 0; padding: 14px 0 0px 5px; font-size: 15px; line-height: 1.4; color: #333333; font-weight: 400; width: 75%; border-top-style: solid; border-top-color: #ededed; border-top-width: 1px; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt;" }
- %ul.assignees-list{ style: "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; font-size: 15px; line-height: 1.4; padding-right: 5px; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt;" }
- - @merge_request.assignees.each do |assignee|
- %li
- %img.avatar{ alt: "Avatar", height: "24", src: avatar_icon_for_user(assignee, 24, only_path: false), style: "border-radius: 12px; max-width: 100%; height: auto; -ms-interpolation-mode: bicubic; margin: -2px 0;", width: "24" }
- %a.muted{ href: user_url(assignee), style: "color: #333333; text-decoration: none; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; vertical-align: top;" }
- = assignee.name
+ = render 'users_list', users: @merge_request.assignees, user_label: assignees_label(@merge_request, include_value: false)
+
+ - if @merge_request.reviewers.any?
+ = render 'users_list', users: @merge_request.reviewers, user_label: reviewers_label(@merge_request, include_value: false)
= render_if_exists 'layouts/mailer/additional_text'
diff --git a/app/views/notify/merge_when_pipeline_succeeds_email.text.haml b/app/views/notify/merge_when_pipeline_succeeds_email.text.haml
index fdc23a6af0f..de29dda6c71 100644
--- a/app/views/notify/merge_when_pipeline_succeeds_email.text.haml
+++ b/app/views/notify/merge_when_pipeline_succeeds_email.text.haml
@@ -6,3 +6,4 @@ Merge Request url: #{project_merge_request_url(@merge_request.target_project, @m
Author: #{sanitize_name(@merge_request.author_name)}
= assignees_label(@merge_request)
+= reviewers_label(@merge_request)
diff --git a/app/views/notify/merged_merge_request_email.text.haml b/app/views/notify/merged_merge_request_email.text.haml
index 74e6f86f603..a8e07fa8d1c 100644
--- a/app/views/notify/merged_merge_request_email.text.haml
+++ b/app/views/notify/merged_merge_request_email.text.haml
@@ -6,3 +6,4 @@ Merge Request URL: #{project_merge_request_url(@merge_request.target_project, @m
Author: #{sanitize_name(@merge_request.author_name)}
= assignees_label(@merge_request)
+= reviewers_label(@merge_request)
diff --git a/app/views/notify/new_mention_in_merge_request_email.text.erb b/app/views/notify/new_mention_in_merge_request_email.text.erb
index 3c78e257a88..0121006852c 100644
--- a/app/views/notify/new_mention_in_merge_request_email.text.erb
+++ b/app/views/notify/new_mention_in_merge_request_email.text.erb
@@ -4,6 +4,7 @@ You have been mentioned in Merge Request <%= @merge_request.to_reference %>
<%= merge_path_description(@merge_request, 'to') %>
Author: <%= sanitize_name(@merge_request.author_name) %>
-= assignees_label(@merge_request)
+<%= assignees_label(@merge_request) %>
+<%= reviewers_label(@merge_request) %>
<%= @merge_request.description %>
diff --git a/app/views/notify/new_merge_request_email.html.haml b/app/views/notify/new_merge_request_email.html.haml
index 8fecdc6e8a6..8fdba10e7a1 100644
--- a/app/views/notify/new_merge_request_email.html.haml
+++ b/app/views/notify/new_merge_request_email.html.haml
@@ -1,5 +1,8 @@
%p.details
- #{link_to @merge_request.author_name, user_url(@merge_request.author)} created a merge request:
+ = html_escape(_('%{userLinkStart}%{user}%{linkEnd} created a %{mrLinkStart}merge request%{linkEnd}:')) % {userLinkStart: "<a href=\"#{user_url(@merge_request.author)}\">".html_safe,
+ user: @merge_request.author_name,
+ mrLinkStart: "<a href=\"#{@target_url}\">".html_safe,
+ linkEnd: '</a>'.html_safe}
%p
.branch
@@ -8,6 +11,8 @@
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
diff --git a/app/views/notify/new_merge_request_email.text.erb b/app/views/notify/new_merge_request_email.text.erb
index f4b0ed0f886..6148af4890e 100644
--- a/app/views/notify/new_merge_request_email.text.erb
+++ b/app/views/notify/new_merge_request_email.text.erb
@@ -3,6 +3,7 @@
<%= merge_path_description(@merge_request, 'to') %>
<%= 'Author:' %> <%= @merge_request.author_name %>
<%= assignees_label(@merge_request) if @merge_request.assignees.any? %>
+<%= reviewers_label(@merge_request) if @merge_request.reviewers.any? %>
<%= render_if_exists 'notify/merge_request_approvers', presenter: @mr_presenter %>
<%= @merge_request.description %>
diff --git a/app/views/notify/unknown_sign_in_email.html.haml b/app/views/notify/unknown_sign_in_email.html.haml
index 914242da5c6..be5924907bb 100644
--- a/app/views/notify/unknown_sign_in_email.html.haml
+++ b/app/views/notify/unknown_sign_in_email.html.haml
@@ -45,8 +45,9 @@
- password_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: 'https://docs.gitlab.com/ee/user/profile/#changing-your-password' }
= _('If you recently signed in and recognize the IP address, you may disregard this email.')
%p
- = _('If you did not recently sign in, you should immediately %{password_link_start}change your password%{password_link_end}.').html_safe % { password_link_start: password_link_start, password_link_end: '</a>'.html_safe }
- = _('Passwords should be unique and not used for any other sites or services.')
+ - if password_authentication_enabled_for_web?
+ = _('If you did not recently sign in, you should immediately %{password_link_start}change your password%{password_link_end}.').html_safe % { password_link_start: password_link_start, password_link_end: '</a>'.html_safe }
+ = _('Passwords should be unique and not used for any other sites or services.')
- unless @user.two_factor_enabled?
%p
diff --git a/app/views/peek/_bar.html.haml b/app/views/peek/_bar.html.haml
index 9725f640be9..8914bfab336 100644
--- a/app/views/peek/_bar.html.haml
+++ b/app/views/peek/_bar.html.haml
@@ -2,5 +2,6 @@
#js-peek{ data: { env: Peek.env,
request_id: peek_request_id,
+ stats_url: ENV.fetch('GITLAB_PERFORMANCE_BAR_STATS_URL', ''),
peek_url: "#{peek_routes_path}/results" },
class: Peek.env }
diff --git a/app/views/profiles/notifications/_group_settings.html.haml b/app/views/profiles/notifications/_group_settings.html.haml
index abbfbd995b6..82083af9ff1 100644
--- a/app/views/profiles/notifications/_group_settings.html.haml
+++ b/app/views/profiles/notifications/_group_settings.html.haml
@@ -9,11 +9,8 @@
= link_to group.name, group_path(group)
.table-section.section-30.text-right
- - if Feature.enabled?(:vue_notification_dropdown, default_enabled: :yaml)
- - if setting
- .js-vue-notification-dropdown{ data: { disabled: emails_disabled, dropdown_items: notification_dropdown_items(setting).to_json, notification_level: setting.level, group_id: group.id, container_class: 'gl-mr-3', show_label: "true" } }
- - else
- = render 'shared/notifications/button', notification_setting: setting, emails_disabled: emails_disabled
+ - if setting
+ .js-vue-notification-dropdown{ data: { disabled: emails_disabled.to_s, dropdown_items: notification_dropdown_items(setting).to_json, notification_level: setting.level, group_id: group.id, container_class: 'gl-mr-3', show_label: "true" } }
.table-section.section-30
= form_for setting, url: profile_notifications_group_path(group), method: :put, html: { class: 'update-notifications gl-display-flex' } do |f|
diff --git a/app/views/profiles/notifications/_project_settings.html.haml b/app/views/profiles/notifications/_project_settings.html.haml
index 8cd552caa3d..e6953d1b32e 100644
--- a/app/views/profiles/notifications/_project_settings.html.haml
+++ b/app/views/profiles/notifications/_project_settings.html.haml
@@ -8,8 +8,5 @@
= link_to_project(project)
.float-right
- - if Feature.enabled?(:vue_notification_dropdown, default_enabled: :yaml)
- - if setting
- .js-vue-notification-dropdown{ data: { disabled: emails_disabled, dropdown_items: notification_dropdown_items(setting).to_json, notification_level: setting.level, project_id: project.id, container_class: 'gl-mr-3', show_label: "true" } }
- - else
- = render 'shared/notifications/button', notification_setting: setting, emails_disabled: emails_disabled
+ - if setting
+ .js-vue-notification-dropdown{ data: { disabled: emails_disabled.to_s, dropdown_items: notification_dropdown_items(setting).to_json, notification_level: setting.level, project_id: project.id, container_class: 'gl-mr-3', show_label: "true" } }
diff --git a/app/views/profiles/notifications/show.html.haml b/app/views/profiles/notifications/show.html.haml
index cb0ada414ed..853188c563f 100644
--- a/app/views/profiles/notifications/show.html.haml
+++ b/app/views/profiles/notifications/show.html.haml
@@ -32,11 +32,8 @@
%br
.clearfix
.form-group.float-left.global-notification-setting
- - if Feature.enabled?(:vue_notification_dropdown, default_enabled: :yaml)
- - if @global_notification_setting
- .js-vue-notification-dropdown{ data: { dropdown_items: notification_dropdown_items(@global_notification_setting).to_json, notification_level: @global_notification_setting.level, help_page_path: help_page_path('user/profile/notifications'), show_label: 'true' } }
- - else
- = render 'shared/notifications/button', notification_setting: @global_notification_setting
+ - if @global_notification_setting
+ .js-vue-notification-dropdown{ data: { dropdown_items: notification_dropdown_items(@global_notification_setting).to_json, notification_level: @global_notification_setting.level, help_page_path: help_page_path('user/profile/notifications'), show_label: 'true' } }
.clearfix
diff --git a/app/views/profiles/preferences/show.html.haml b/app/views/profiles/preferences/show.html.haml
index cd76a67b692..535964028f4 100644
--- a/app/views/profiles/preferences/show.html.haml
+++ b/app/views/profiles/preferences/show.html.haml
@@ -88,6 +88,15 @@
= 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(', ')
+ - msg = "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}."
+ = s_(msg).html_safe
+
.form-group
= f.label :tab_width, s_('Preferences|Tab width'), class: 'label-bold'
= f.number_field :tab_width,
diff --git a/app/views/profiles/show.html.haml b/app/views/profiles/show.html.haml
index 4689fd5272a..dd24dd49a6f 100644
--- a/app/views/profiles/show.html.haml
+++ b/app/views/profiles/show.html.haml
@@ -48,17 +48,17 @@
.col-lg-8
= f.fields_for :status, @user.status do |status_form|
- emoji_button = button_tag type: :button,
- class: 'js-toggle-emoji-menu emoji-menu-toggle-button gl-button btn has-tooltip',
+ class: 'js-toggle-emoji-menu emoji-menu-toggle-button btn gl-button btn-default has-tooltip',
title: s_("Profiles|Add status emoji") do
- if custom_emoji
- = emoji_icon @user.status.emoji
+ = emoji_icon(@user.status.emoji, class: 'gl-mr-0!')
%span#js-no-emoji-placeholder.no-emoji-placeholder{ class: ('hidden' if custom_emoji) }
= sprite_icon('slight-smile', css_class: 'award-control-icon-neutral')
= sprite_icon('smiley', css_class: 'award-control-icon-positive')
= sprite_icon('smile', css_class: 'award-control-icon-super-positive')
- reset_message_button = button_tag type: :button,
id: 'js-clear-user-status-button',
- class: 'clear-user-status gl-button btn has-tooltip',
+ class: 'clear-user-status btn gl-button btn-default has-tooltip',
title: s_("Profiles|Clear status") do
= sprite_icon("close")
diff --git a/app/views/profiles/two_factor_auths/show.html.haml b/app/views/profiles/two_factor_auths/show.html.haml
index 0284c779cfa..3853f428447 100644
--- a/app/views/profiles/two_factor_auths/show.html.haml
+++ b/app/views/profiles/two_factor_auths/show.html.haml
@@ -9,7 +9,7 @@
%h4.gl-mt-0
= _('Register Two-Factor Authenticator')
%p
- = _('Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA).')
+ = _('Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA).')
.col-lg-8
- if current_user.two_factor_otp_enabled?
%p
diff --git a/app/views/projects/_home_panel.html.haml b/app/views/projects/_home_panel.html.haml
index 0d3049cd9a2..f5eea9aa9c6 100644
--- a/app/views/projects/_home_panel.html.haml
+++ b/app/views/projects/_home_panel.html.haml
@@ -3,11 +3,9 @@
- max_project_topic_length = 15
- emails_disabled = @project.emails_disabled?
-= render 'projects/invite_members_modal', project: @project
-
.project-home-panel.js-show-on-project-root.gl-my-5{ class: [("empty-project" if empty_repo)] }
- .row.gl-mb-3
- .home-panel-title-row.col-md-12.col-lg-6.d-flex
+ .gl-display-flex.gl-justify-content-space-between.gl-flex-wrap.gl-sm-flex-direction-column.gl-mb-3
+ .home-panel-title-row.gl-display-flex
.avatar-container.rect-avatar.s64.home-panel-avatar.gl-flex-shrink-0.gl-w-11.gl-h-11.gl-mr-3.float-none
= project_icon(@project, alt: @project.name, class: 'avatar avatar-tile s64', width: 64, height: 64, itemprop: 'image')
.d-flex.flex-column.flex-wrap.align-items-baseline
@@ -43,16 +41,13 @@
= _("+ %{count} more") % { count: @project.count_of_extra_topics_not_shown }
- .project-repo-buttons.col-md-12.col-lg-6.d-inline-flex.flex-wrap.justify-content-lg-end
+ .project-repo-buttons.gl-display-flex.gl-justify-content-md-end.gl-align-items-start.gl-flex-wrap.gl-mt-5
- if current_user
- .d-inline-flex
- - if Feature.enabled?(:vue_notification_dropdown, @project, default_enabled: :yaml)
- - if @notification_setting
- .js-vue-notification-dropdown{ data: { button_size: "small", disabled: emails_disabled, dropdown_items: notification_dropdown_items(@notification_setting).to_json, notification_level: @notification_setting.level, help_page_path: help_page_path('user/profile/notifications'), project_id: @project.id, container_class: 'gl-mr-3 gl-mt-5 gl-vertical-align-top' } }
- - else
- = render 'shared/notifications/new_button', notification_setting: @notification_setting, btn_class: 'btn-xs', dropdown_container_class: 'gl-mr-3', emails_disabled: emails_disabled
+ .gl-display-flex.gl-align-items-start.gl-mr-3
+ - if @notification_setting
+ .js-vue-notification-dropdown{ data: { button_size: "small", disabled: emails_disabled.to_s, dropdown_items: notification_dropdown_items(@notification_setting).to_json, notification_level: @notification_setting.level, help_page_path: help_page_path('user/profile/notifications'), project_id: @project.id } }
- .count-buttons.d-inline-flex
+ .count-buttons.gl-display-flex.gl-align-items-flex-start
= render 'projects/buttons/star'
= render 'projects/buttons/fork'
diff --git a/app/views/projects/_invite_members_link.html.haml b/app/views/projects/_invite_members_link.html.haml
deleted file mode 100644
index 95cfc75d955..00000000000
--- a/app/views/projects/_invite_members_link.html.haml
+++ /dev/null
@@ -1,4 +0,0 @@
-- return unless can_invite_members_for_project?(@project)
-
-%li
- .js-invite-members-trigger{ data: { icon: 'plus', classes: 'gl-text-decoration-none! gl-shadow-none!', display_text: _('Invite team members') } }
diff --git a/app/views/projects/_invite_members_modal.html.haml b/app/views/projects/_invite_members_modal.html.haml
index b1bba5b59ca..00f823b9016 100644
--- a/app/views/projects/_invite_members_modal.html.haml
+++ b/app/views/projects/_invite_members_modal.html.haml
@@ -2,6 +2,6 @@
.js-invite-members-modal{ data: { id: project.id,
name: project.name,
is_project: 'true',
- access_levels: GroupMember.access_level_roles.to_json,
+ access_levels: ProjectMember.access_level_roles.to_json,
default_access_level: Gitlab::Access::GUEST,
help_link: help_page_url('user/permissions') } }
diff --git a/app/views/projects/_merge_request_merge_method_settings.html.haml b/app/views/projects/_merge_request_merge_method_settings.html.haml
index 1be7f7bb418..cb3fcdef403 100644
--- a/app/views/projects/_merge_request_merge_method_settings.html.haml
+++ b/app/views/projects/_merge_request_merge_method_settings.html.haml
@@ -22,7 +22,7 @@
= s_('ProjectSettings|When conflicts arise the user is given the option to rebase')
.form-check.mb-2
- = form.radio_button :merge_method, :ff, class: "js-merge-method-radio qa-radio-button-merge-ff form-check-input"
+ = form.radio_button :merge_method, :ff, class: "js-merge-method-radio form-check-input", data: { qa_selector: 'merge_ff_radio_button' }
= label_tag :project_merge_method_ff, class: 'form-check-label' do
= s_('ProjectSettings|Fast-forward merge')
.text-secondary
diff --git a/app/views/projects/_new_project_fields.html.haml b/app/views/projects/_new_project_fields.html.haml
index 41992ee5ea9..f6b635173a5 100644
--- a/app/views/projects/_new_project_fields.html.haml
+++ b/app/views/projects/_new_project_fields.html.haml
@@ -8,7 +8,7 @@
.form-group.project-name.col-sm-12
= f.label :name, class: 'label-bold' do
%span= _("Project name")
- = f.text_field :name, placeholder: "My awesome project", class: "form-control input-lg", autofocus: true, data: { track_label: "#{track_label}", track_event: "activate_form_input", track_property: "project_name", track_value: "" }
+ = f.text_field :name, placeholder: "My awesome project", class: "form-control input-lg", autofocus: true, data: { track_label: "#{track_label}", track_event: "activate_form_input", track_property: "project_name", track_value: "" }, required: true, aria: { required: true }
.form-group.project-path.col-sm-6
= f.label :namespace_id, class: 'label-bold' do
%span= s_("Project URL")
@@ -33,7 +33,7 @@
.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", required: true
+ = f.text_field :path, placeholder: "my-awesome-project", class: "form-control", required: true, aria: { required: true }
- if current_user.can_create_group?
.form-text.text-muted
- link_start_group_path = '<a href="%{path}">' % { path: new_group_path }
diff --git a/app/views/projects/_new_project_push_tip.html.haml b/app/views/projects/_new_project_push_tip.html.haml
deleted file mode 100644
index a63b4bed9de..00000000000
--- a/app/views/projects/_new_project_push_tip.html.haml
+++ /dev/null
@@ -1,11 +0,0 @@
-.push-to-create-popover
- %p
- = label_tag(:push_to_create_tip, _("Private projects can be created in your personal namespace with:"), class: "weight-normal")
-
- %p.input-group.project-tip-command
- %span
- = text_field_tag :push_to_create_tip, push_to_create_project_command, class: "js-select-on-focus form-control monospace", readonly: true, aria: { label: _("Push project from command line") }
- %span.input-group-append
- = clipboard_button(text: push_to_create_project_command, title: _("Copy command"), class: 'input-group-text', placement: "right")
- %p
- = link_to("What does this command do?", help_page_path("user/project/working_with_projects", anchor: "push-to-create-a-new-project"), target: "_blank")
diff --git a/app/views/projects/_service_desk_settings.html.haml b/app/views/projects/_service_desk_settings.html.haml
index 0998cd480d3..53b9e7f3d65 100644
--- a/app/views/projects/_service_desk_settings.html.haml
+++ b/app/views/projects/_service_desk_settings.html.haml
@@ -1,5 +1,5 @@
- expanded = expanded_by_default?
-%section.settings.js-service-desk-setting-wrapper.no-animate#js-service-desk{ class: ('expanded' if expanded) }
+%section.settings.js-service-desk-setting-wrapper.no-animate#js-service-desk{ class: ('expanded' if expanded), data: { qa_selector: 'service_desk_settings_content' } }
.settings-header
%h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only= _('Service Desk')
%button.btn.gl-button.js-settings-toggle
diff --git a/app/views/projects/artifacts/browse.html.haml b/app/views/projects/artifacts/browse.html.haml
index b363f0d4325..3ebac785d55 100644
--- a/app/views/projects/artifacts/browse.html.haml
+++ b/app/views/projects/artifacts/browse.html.haml
@@ -18,7 +18,7 @@
.tree-controls<
= link_to download_project_job_artifacts_path(@project, @build),
rel: 'nofollow', download: '', class: 'gl-button btn btn-default download' do
- = sprite_icon('download')
+ = sprite_icon('download', css_class: 'gl-mr-2')
Download artifacts archive
.tree-content-holder
diff --git a/app/views/projects/blame/_age_map_legend.html.haml b/app/views/projects/blame/_age_map_legend.html.haml
deleted file mode 100644
index 533dc20ffb3..00000000000
--- a/app/views/projects/blame/_age_map_legend.html.haml
+++ /dev/null
@@ -1,12 +0,0 @@
-%span.left-label Newer
-%span.legend-box.legend-box-0
-%span.legend-box.legend-box-1
-%span.legend-box.legend-box-2
-%span.legend-box.legend-box-3
-%span.legend-box.legend-box-4
-%span.legend-box.legend-box-5
-%span.legend-box.legend-box-6
-%span.legend-box.legend-box-7
-%span.legend-box.legend-box-8
-%span.legend-box.legend-box-9
-%span.right-label Older
diff --git a/app/views/projects/blame/_blame_group.html.haml b/app/views/projects/blame/_blame_group.html.haml
deleted file mode 100644
index e9967814833..00000000000
--- a/app/views/projects/blame/_blame_group.html.haml
+++ /dev/null
@@ -1,26 +0,0 @@
-%tr
- %td.blame-commit{ class: commit_data.age_map_class }
- .commit
- = commit_data.author_avatar
- .commit-row-title
- %span.item-title.str-truncated-100
- = commit_data.commit_link
- %span
- = commit_data.project_blame_link
- &nbsp;
- .light
- = commit_data.commit_author_link
- = _('committed')
- #{commit_data.time_ago_tooltip}
- %td.line-numbers
- - line_count = blame_group[:lines].count
- - (current_line...(current_line + line_count)).each do |i|
- %a.diff-line-num{ href: "#L#{i}", id: "L#{i}", 'data-line-number' => i }
- = link_icon
- = i
- \
- %td.lines
- %pre.code.highlight
- %code
- - blame_group[:lines].each do |line|
- #{line}
diff --git a/app/views/projects/blame/show.html.haml b/app/views/projects/blame/show.html.haml
index 2f3d0660caa..049920e55c5 100644
--- a/app/views/projects/blame/show.html.haml
+++ b/app/views/projects/blame/show.html.haml
@@ -6,18 +6,56 @@
.file-holder
= render "projects/blob/header", blob: @blob, blame: true
+
.file-blame-legend
- = render 'age_map_legend'
+ %span.left-label Newer
+ %span.legend-box.legend-box-0
+ %span.legend-box.legend-box-1
+ %span.legend-box.legend-box-2
+ %span.legend-box.legend-box-3
+ %span.legend-box.legend-box-4
+ %span.legend-box.legend-box-5
+ %span.legend-box.legend-box-6
+ %span.legend-box.legend-box-7
+ %span.legend-box.legend-box-8
+ %span.legend-box.legend-box-9
+ %span.right-label Older
+
.table-responsive.file-content.blame.code.js-syntax-highlight
%table
- current_line = 1
- @blame.groups.each do |blame_group|
- commit_data = @blame.commit_data(blame_group[:commit])
+ - line_count = blame_group[:lines].count
+
+ %tr
+ %td.blame-commit{ class: commit_data.age_map_class }
+ .commit
+ = commit_data.author_avatar
+
+ .commit-row-title
+ %span.item-title.str-truncated-100
+ = commit_data.commit_link
+ %span
+ = commit_data.project_blame_link
+ &nbsp;
+
+ .light
+ = commit_data.commit_author_link
+ = _('committed')
+ #{commit_data.time_ago_tooltip}
+
+ %td.line-numbers
+ - (current_line...(current_line + line_count)).each do |i|
+ %a.diff-line-num{ href: "#L#{i}", id: "L#{i}", 'data-line-number' => i }
+ = link_icon
+ = i
+ \
- = render 'blame_group',
- blame_group: blame_group,
- current_line: current_line,
- link_icon: link_icon,
- commit_data: commit_data
+ %td.lines
+ %pre.code.highlight
+ %code
+ - blame_group[:lines].each do |line|
+ #{line}
- - current_line += blame_group[:lines].count
+ - current_line += line_count
diff --git a/app/views/projects/blob/_template_selectors.html.haml b/app/views/projects/blob/_template_selectors.html.haml
index 70a4202a5d0..717c03ad27d 100644
--- a/app/views/projects/blob/_template_selectors.html.haml
+++ b/app/views/projects/blob/_template_selectors.html.haml
@@ -11,7 +11,7 @@
= dropdown_tag(_("Apply a template"), options: { toggle_class: 'js-metrics-dashboard-selector qa-metrics-dashboard-dropdown', dropdown_class: 'dropdown-menu-selectable', filter: true, placeholder: "Filter", data: { data: metrics_dashboard_ymls(@project) } } )
#gitlab-ci-yml-selector.gitlab-ci-yml-selector.js-gitlab-ci-yml-selector-wrap.js-template-selector-wrap.hidden
= dropdown_tag(_("Apply a template"), options: { toggle_class: 'js-gitlab-ci-yml-selector qa-gitlab-ci-yml-dropdown', dropdown_class: 'dropdown-menu-selectable', filter: true, placeholder: "Filter", data: { data: gitlab_ci_ymls(@project) } } )
- - if experiment_enabled?(:ci_syntax_templates, subject: current_user)
+ - if experiment_enabled?(:ci_syntax_templates_b, subject: current_user) && @project.namespace.recent?
.gitlab-ci-syntax-yml-selector.js-gitlab-ci-syntax-yml-selector-wrap.js-template-selector-wrap.hidden
= dropdown_tag(_("Learn CI/CD syntax"), options: { toggle_class: 'js-gitlab-ci-syntax-yml-selector qa-gitlab-ci-syntax-yml-dropdown', dropdown_class: 'dropdown-menu-selectable', filter: true, placeholder: "Filter", data: { data: gitlab_ci_syntax_ymls(@project) } } )
.dockerfile-selector.js-dockerfile-selector-wrap.js-template-selector-wrap.hidden
diff --git a/app/views/projects/blob/_upload.html.haml b/app/views/projects/blob/_upload.html.haml
index f400c7de5eb..b68c75701b9 100644
--- a/app/views/projects/blob/_upload.html.haml
+++ b/app/views/projects/blob/_upload.html.haml
@@ -17,7 +17,7 @@
%br
.dropzone-alerts.gl-alert.gl-alert-danger.gl-mb-5.data{ style: "display:none" }
- = render 'shared/new_commit_form', placeholder: placeholder
+ = render 'shared/new_commit_form', placeholder: placeholder, ref: local_assigns[:ref]
.form-actions
= button_tag class: 'btn gl-button btn-success btn-upload-file', id: 'submit-all', type: 'button' do
diff --git a/app/views/projects/branches/_branch.html.haml b/app/views/projects/branches/_branch.html.haml
index fcf073e1e09..6f86ccd7824 100644
--- a/app/views/projects/branches/_branch.html.haml
+++ b/app/views/projects/branches/_branch.html.haml
@@ -35,8 +35,8 @@
.gl-display-inline-flex.gl-vertical-align-middle.gl-mr-5
%svg.s24
- - if merge_project && create_mr_button?(@repository.root_ref, branch.name)
- = link_to create_mr_path(@repository.root_ref, branch.name), class: 'gl-button btn btn-default' do
+ - if merge_project && create_mr_button?(from: @repository.root_ref, to: branch.name, source_project: @project, target_project: @project)
+ = link_to create_mr_path(from: @repository.root_ref, to: branch.name, source_project: @project, target_project: @project), class: 'gl-button btn btn-default' do
= _('Merge request')
- if branch.name != @repository.root_ref
diff --git a/app/views/projects/buttons/_clone.html.haml b/app/views/projects/buttons/_clone.html.haml
index 0ec47744fc9..ee195e69a98 100644
--- a/app/views/projects/buttons/_clone.html.haml
+++ b/app/views/projects/buttons/_clone.html.haml
@@ -2,7 +2,7 @@
- dropdown_class = local_assigns.fetch(:dropdown_class, '')
.git-clone-holder.js-git-clone-holder
- %a#clone-dropdown.gl-button.btn.btn-info.clone-dropdown-btn.qa-clone-dropdown{ href: '#', data: { toggle: 'dropdown' } }
+ %a#clone-dropdown.gl-button.btn.btn-confirm.clone-dropdown-btn.qa-clone-dropdown{ href: '#', data: { toggle: 'dropdown' } }
%span.gl-mr-2.js-clone-dropdown-label
= _('Clone')
= sprite_icon("chevron-down", css_class: "icon")
@@ -11,19 +11,19 @@
%li{ class: 'gl-px-4!' }
%label.label-bold
= _('Clone with SSH')
- .input-group
+ .input-group.btn-group
= text_field_tag :ssh_project_clone, project.ssh_url_to_repo, class: "js-select-on-focus form-control qa-ssh-clone-url", readonly: true, aria: { label: _('Repository clone URL') }
.input-group-append
- = clipboard_button(target: '#ssh_project_clone', title: _("Copy URL"), class: "input-group-text btn-default btn-clipboard")
+ = clipboard_button(target: '#ssh_project_clone', title: _("Copy URL"), class: "input-group-text gl-button btn btn-icon btn-default")
= render_if_exists 'projects/buttons/geo'
- if http_enabled?
%li.pt-2{ class: 'gl-px-4!' }
%label.label-bold
= _('Clone with %{http_label}') % { http_label: gitlab_config.protocol.upcase }
- .input-group
+ .input-group.btn-group
= text_field_tag :http_project_clone, project.http_url_to_repo, class: "js-select-on-focus form-control qa-http-clone-url", readonly: true, aria: { label: _('Repository clone URL') }
.input-group-append
- = clipboard_button(target: '#http_project_clone', title: _("Copy URL"), class: "input-group-text btn-default btn-clipboard")
+ = clipboard_button(target: '#http_project_clone', title: _("Copy URL"), class: "input-group-text gl-button btn btn-icon btn-default")
= render_if_exists 'projects/buttons/geo'
%li.divider.mt-2
%li.pt-2.gl-new-dropdown-item
diff --git a/app/views/projects/buttons/_fork.html.haml b/app/views/projects/buttons/_fork.html.haml
index fad168da71e..e4ec2e44298 100644
--- a/app/views/projects/buttons/_fork.html.haml
+++ b/app/views/projects/buttons/_fork.html.haml
@@ -1,17 +1,16 @@
- unless @project.empty_repo?
- if current_user && can?(current_user, :fork_project, @project)
- .count-badge.d-inline-flex.align-item-stretch.gl-mr-3
+ .count-badge.btn-group
- if current_user.already_forked?(@project) && current_user.manageable_namespaces.size < 2
- = link_to namespace_project_path(current_user, current_user.fork_of(@project)), title: s_('ProjectOverview|Go to your fork'), class: 'btn btn-default has-tooltip count-badge-button d-flex align-items-center fork-btn' do
+ = link_to namespace_project_path(current_user, current_user.fork_of(@project)), title: s_('ProjectOverview|Go to your fork'), class: 'gl-button btn btn-default btn-sm has-tooltip fork-btn' do
= sprite_icon('fork', css_class: 'icon')
%span= s_('ProjectOverview|Fork')
- else
- can_create_fork = current_user.can?(:create_fork)
- disabled_fork_tooltip = s_('ProjectOverview|You have reached your project limit')
- %span.has-tooltip{ title: (disabled_fork_tooltip unless can_create_fork) }
- = link_to new_project_fork_path(@project), class: "btn btn-default btn-xs count-badge-button d-flex align-items-center fork-btn #{' disabled' unless can_create_fork }", 'aria-label' => (disabled_fork_tooltip unless can_create_fork) do
+ %span.btn-group.has-tooltip{ title: (disabled_fork_tooltip unless can_create_fork) }
+ = link_to new_project_fork_path(@project), class: "gl-button btn btn-default btn-sm fork-btn #{' disabled' unless can_create_fork }", 'aria-label' => (disabled_fork_tooltip unless can_create_fork) do
= sprite_icon('fork', css_class: 'icon')
%span= s_('ProjectOverview|Fork')
- %span.fork-count.count-badge-count.d-flex.align-items-center
- = link_to project_forks_path(@project), title: n_(s_('ProjectOverview|Fork'), s_('ProjectOverview|Forks'), @project.forks_count), class: 'count' do
- = @project.forks_count
+ = link_to project_forks_path(@project), title: n_(s_('ProjectOverview|Forks'), s_('ProjectOverview|Forks'), @project.forks_count), class: 'gl-button btn btn-default btn-sm count has-tooltip' do
+ = @project.forks_count
diff --git a/app/views/projects/buttons/_star.html.haml b/app/views/projects/buttons/_star.html.haml
index 690f0fe10f7..00d518450e9 100644
--- a/app/views/projects/buttons/_star.html.haml
+++ b/app/views/projects/buttons/_star.html.haml
@@ -1,21 +1,19 @@
- if current_user
- .count-badge.d-inline-flex.align-item-stretch.gl-mr-3
- %button.count-badge-button.btn.btn-default.btn-xs.d-flex.align-items-center.star-btn.toggle-star{ type: "button", data: { endpoint: toggle_star_project_path(@project, :json) } }
+ .count-badge.d-inline-flex.align-item-stretch.gl-mr-3.btn-group
+ %button.gl-button.btn.btn-default.btn-sm.star-btn.toggle-star{ type: "button", data: { endpoint: toggle_star_project_path(@project, :json) } }
- if current_user.starred?(@project)
= sprite_icon('star', css_class: 'icon')
%span.starred= s_('ProjectOverview|Unstar')
- else
= sprite_icon('star-o', css_class: 'icon')
%span= s_('ProjectOverview|Star')
- %span.star-count.count-badge-count.d-flex.align-items-center
- = link_to project_starrers_path(@project), title: n_(s_('ProjectOverview|Starrer'), s_('ProjectOverview|Starrers'), @project.star_count), class: 'count' do
- = @project.star_count
+ = link_to project_starrers_path(@project), title: n_(s_('ProjectOverview|Starrer'), s_('ProjectOverview|Starrers'), @project.star_count), class: 'gl-button btn btn-default btn-sm star-count count' do
+ = @project.star_count
- else
- .count-badge.d-inline-flex.align-item-stretch.gl-mr-3
- = link_to new_user_session_path, class: 'btn btn-default btn-xs has-tooltip count-badge-button d-flex align-items-center star-btn', title: s_('ProjectOverview|You must sign in to star a project') do
+ .count-badge.d-inline-flex.align-item-stretch.gl-mr-3.btn-group
+ = link_to new_user_session_path, class: 'gl-button btn btn-default btn-sm has-tooltip star-btn', title: s_('ProjectOverview|You must sign in to star a project') do
= sprite_icon('star-o', css_class: 'icon')
%span= s_('ProjectOverview|Star')
- %span.star-count.count-badge-count.d-flex.align-items-center
- = link_to project_starrers_path(@project), title: n_(s_('ProjectOverview|Starrer'), s_('ProjectOverview|Starrers'), @project.star_count), class: 'count' do
- = @project.star_count
+ = link_to project_starrers_path(@project), title: n_(s_('ProjectOverview|Starrer'), s_('ProjectOverview|Starrers'), @project.star_count), class: 'gl-button btn btn-default btn-sm star-count count' do
+ = @project.star_count
diff --git a/app/views/projects/ci/pipeline_editor/show.html.haml b/app/views/projects/ci/pipeline_editor/show.html.haml
index 10aed15f380..3e10cf49b66 100644
--- a/app/views/projects/ci/pipeline_editor/show.html.haml
+++ b/app/views/projects/ci/pipeline_editor/show.html.haml
@@ -1,12 +1,14 @@
- page_title s_('Pipelines|Pipeline Editor')
#js-pipeline-editor{ data: { "ci-config-path": @project.ci_config_path_or_default,
+ "commit-sha" => @project.commit ? @project.commit.sha : '',
+ "default-branch" => @project.default_branch,
+ "empty-state-illustration-path" => image_path('illustrations/empty-state/empty-dag-md.svg'),
+ "initial-branch-name": params[:branch_name],
+ "lint-help-page-path" => help_page_path('ci/lint', anchor: 'validate-basic-logic-and-syntax'),
+ "new-merge-request-path" => namespace_project_new_merge_request_path,
"project-path" => @project.path,
"project-full-path" => @project.full_path,
"project-namespace" => @project.namespace.full_path,
- "default-branch" => @project.default_branch,
- "commit-sha" => @project.commit ? @project.commit.sha : '',
- "new-merge-request-path" => namespace_project_new_merge_request_path,
- "lint-help-page-path" => help_page_path('ci/lint', anchor: 'validate-basic-logic-and-syntax'),
"yml-help-page-path" => help_page_path('ci/yaml/README'),
} }
diff --git a/app/views/projects/cleanup/_show.html.haml b/app/views/projects/cleanup/_show.html.haml
index e693082461f..b0112be0e3d 100644
--- a/app/views/projects/cleanup/_show.html.haml
+++ b/app/views/projects/cleanup/_show.html.haml
@@ -2,8 +2,8 @@
%section.settings.no-animate#cleanup{ class: ('expanded' if expanded) }
.settings-header
- %h4= _('Repository cleanup')
- %button.btn.js-settings-toggle
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only= _('Repository cleanup')
+ %button.btn.gl-button.btn-default.js-settings-toggle
= expanded ? _('Collapse') : _('Expand')
%p
- link_url = 'https://github.com/newren/git-filter-repo'
diff --git a/app/views/projects/commit/_pipelines_list.haml b/app/views/projects/commit/_pipelines_list.haml
index 81c354f1c8f..7f52e6ed7eb 100644
--- a/app/views/projects/commit/_pipelines_list.haml
+++ b/app/views/projects/commit/_pipelines_list.haml
@@ -1,8 +1,6 @@
- disable_initialization = local_assigns.fetch(:disable_initialization, false)
#commit-pipeline-table-view{ data: { disable_initialization: disable_initialization,
endpoint: endpoint,
- "help-page-path" => help_page_path('ci/quick_start/README'),
- "help-auto-devops-path" => help_page_path('topics/autodevops/index.md'),
"empty-state-svg-path" => image_path('illustrations/pipelines_empty.svg'),
"error-state-svg-path" => image_path('illustrations/pipelines_failed.svg'),
"project-id": @project.id,
diff --git a/app/views/projects/commits/_commit.html.haml b/app/views/projects/commits/_commit.html.haml
index c708efe7c7b..ceb312450be 100644
--- a/app/views/projects/commits/_commit.html.haml
+++ b/app/views/projects/commits/_commit.html.haml
@@ -60,5 +60,5 @@
.commit-sha-group.btn-group.d-none.d-sm-flex
.label.label-monospace.monospace
= commit.short_id
- = clipboard_button(text: commit.id, title: _("Copy commit SHA"), class: "gl-button btn btn-default", container: "body")
+ = clipboard_button(text: commit.id, title: _("Copy commit SHA"), class: "gl-button btn btn-default btn-icon", container: "body")
= link_to_browse_code(project, commit)
diff --git a/app/views/projects/commits/show.html.haml b/app/views/projects/commits/show.html.haml
index 802df664241..463984a13a2 100644
--- a/app/views/projects/commits/show.html.haml
+++ b/app/views/projects/commits/show.html.haml
@@ -18,9 +18,9 @@
- if @merge_request.present?
.control.d-none.d-md-block
= link_to _("View open merge request"), project_merge_request_path(@project, @merge_request), class: 'btn gl-button'
- - elsif create_mr_button?(@repository.root_ref, @ref)
+ - 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(@repository.root_ref, @ref), 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-success'
.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/_form.html.haml b/app/views/projects/compare/_form.html.haml
deleted file mode 100644
index 17134613b17..00000000000
--- a/app/views/projects/compare/_form.html.haml
+++ /dev/null
@@ -1,28 +0,0 @@
-= form_tag project_compare_index_path(@project), method: :post, class: 'form-inline js-requires-input js-signature-container', data: { 'signatures-path' => signatures_namespace_project_compare_index_path } do
- .form-group.dropdown.compare-form-group.to.js-compare-to-dropdown
- .input-group.inline-input-group
- %span.input-group-prepend
- .input-group-text
- = s_("CompareBranches|Source")
- = hidden_field_tag :to, params[:to]
- = button_tag type: 'button', title: params[:to], class: "btn gl-button form-control compare-dropdown-toggle js-compare-dropdown has-tooltip", required: true, data: { refs_url: refs_project_path(@project), toggle: "dropdown", target: ".js-compare-to-dropdown", selected: params[:to], field_name: :to } do
- .dropdown-toggle-text.str-truncated.monospace.float-left= params[:to] || _("Select branch/tag")
- = sprite_icon('chevron-down', css_class: 'float-right')
- = render 'shared/ref_dropdown'
- .compare-ellipsis.inline ...
- .form-group.dropdown.compare-form-group.from.js-compare-from-dropdown
- .input-group.inline-input-group
- %span.input-group-prepend
- .input-group-text
- = s_("CompareBranches|Target")
- = hidden_field_tag :from, params[:from]
- = button_tag type: 'button', title: params[:from], class: "btn gl-button form-control compare-dropdown-toggle js-compare-dropdown has-tooltip", required: true, data: { refs_url: refs_project_path(@project), toggle: "dropdown", target: ".js-compare-from-dropdown", selected: params[:from], field_name: :from } do
- .dropdown-toggle-text.str-truncated.monospace.float-left= params[:from] || _("Select branch/tag")
- = sprite_icon('chevron-down', css_class: 'float-right')
- = render 'shared/ref_dropdown'
- &nbsp;
- = button_tag s_("CompareBranches|Compare"), class: "btn gl-button btn-success commits-compare-btn"
- - if @merge_request.present?
- = link_to _("View open merge request"), project_merge_request_path(@project, @merge_request), class: 'gl-ml-3 btn'
- - elsif create_mr_button?
- = link_to _("Create merge request"), create_mr_path, class: 'gl-ml-3 btn gl-button'
diff --git a/app/views/projects/compare/index.html.haml b/app/views/projects/compare/index.html.haml
index 3f9aa24a569..e3ab184ec6f 100644
--- a/app/views/projects/compare/index.html.haml
+++ b/app/views/projects/compare/index.html.haml
@@ -13,8 +13,4 @@
= html_escape(_("Changes are shown as if the %{b_open}source%{b_close} revision was being merged into the %{b_open}target%{b_close} revision.")) % { b_open: '<b>'.html_safe, b_close: '</b>'.html_safe }
.prepend-top-20
- #js-compare-selector{ data: { project_compare_index_path: project_compare_index_path(@project),
- refs_project_path: refs_project_path(@project),
- params_from: params[:from], params_to: params[:to],
- project_merge_request_path: @merge_request.present? ? project_merge_request_path(@project, @merge_request) : '',
- create_mr_path: create_mr_button? ? create_mr_path : '' } }
+ #js-compare-selector{ data: project_compare_selector_data(@project, @merge_request, params) }
diff --git a/app/views/projects/compare/show.html.haml b/app/views/projects/compare/show.html.haml
index 51cf95dc84b..9e9c271e7be 100644
--- a/app/views/projects/compare/show.html.haml
+++ b/app/views/projects/compare/show.html.haml
@@ -2,7 +2,8 @@
- page_title "#{params[:from]}...#{params[:to]}"
.sub-header-block.no-bottom-space
- = render "form"
+ .js-signature-container{ data: { 'signatures-path' => signatures_namespace_project_compare_index_path } }
+ #js-compare-selector{ data: project_compare_selector_data(@project, @merge_request, params) }
- if @commits.present?
= render "projects/commits/commit_list"
diff --git a/app/views/projects/cycle_analytics/_empty_stage.html.haml b/app/views/projects/cycle_analytics/_empty_stage.html.haml
deleted file mode 100644
index cdad0bc7231..00000000000
--- a/app/views/projects/cycle_analytics/_empty_stage.html.haml
+++ /dev/null
@@ -1,7 +0,0 @@
-.empty-stage-container
- .empty-stage
- .icon-no-data
- = custom_icon ('icon_no_data')
- %h4 {{ __('We don\'t have enough data to show this stage.') }}
- %p
- {{currentStage.emptyStageText}}
diff --git a/app/views/projects/cycle_analytics/_no_access.html.haml b/app/views/projects/cycle_analytics/_no_access.html.haml
deleted file mode 100644
index c3eda398234..00000000000
--- a/app/views/projects/cycle_analytics/_no_access.html.haml
+++ /dev/null
@@ -1,7 +0,0 @@
-.no-access-stage-container
- .no-access-stage
- .icon-lock
- = custom_icon ('icon_lock')
- %h4 {{ __('You need permission.') }}
- %p
- {{ __('Want to see the data? Please ask an administrator for access.') }}
diff --git a/app/views/projects/cycle_analytics/show.html.haml b/app/views/projects/cycle_analytics/show.html.haml
index fc3710d3609..71730da0595 100644
--- a/app/views/projects/cycle_analytics/show.html.haml
+++ b/app/views/projects/cycle_analytics/show.html.haml
@@ -1,66 +1,6 @@
- page_title _("Value Stream Analytics")
- add_page_specific_style 'page_bundles/cycle_analytics'
+- svgs = { empty_state_svg_path: image_path("illustrations/analytics/cycle-analytics-empty-chart.svg"), no_data_svg_path: image_path("illustrations/analytics/cycle-analytics-empty-chart.svg"), no_access_svg_path: image_path("illustrations/analytics/no-access.svg") }
+- initial_data = { request_path: project_cycle_analytics_path(@project) }.merge!(svgs)
-#cycle-analytics{ "v-cloak" => "true", data: { request_path: project_cycle_analytics_path(@project) } }
- %gl-loading-icon{ "v-show" => "isLoading", "size" => "lg" }
- .wrapper{ "v-show" => "!isLoading && !hasError" }
- .card
- .card-header
- {{ __('Recent Project Activity') }}
- .d-flex.justify-content-between
- .flex-grow.text-center{ "v-for" => "item in state.summary" }
- %h3.header {{ item.value }}
- %p.text {{ item.title }}
- .flex-grow.align-self-center.text-center
- .dropdown.inline.js-ca-dropdown
- %button.dropdown-menu-toggle{ "data-toggle" => "dropdown", :type => "button" }
- %span.dropdown-label {{ n__('Last %d day', 'Last %d days', 30) }}
- = sprite_icon("chevron-down", css_class: "dropdown-menu-toggle-icon gl-top-3")
- %ul.dropdown-menu.dropdown-menu-right
- %li
- %a{ "href" => "#", "data-value" => "7" }
- {{ n__('Last %d day', 'Last %d days', 7) }}
- %li
- %a{ "href" => "#", "data-value" => "30" }
- {{ n__('Last %d day', 'Last %d days', 30) }}
- %li
- %a{ "href" => "#", "data-value" => "90" }
- {{ n__('Last %d day', 'Last %d days', 90) }}
- .stage-panel-container
- .card.stage-panel
- .card-header.border-bottom-0
- %nav.col-headers
- %ul
- %li.stage-header.pl-5
- %span.stage-name.font-weight-bold
- {{ s__('ProjectLifecycle|Stage') }}
- %span.has-tooltip{ "data-placement" => "top", title: _("The phase of the development lifecycle."), "aria-hidden" => "true" }
- = sprite_icon('question-o', css_class: 'gl-text-gray-500')
- %li.median-header
- %span.stage-name.font-weight-bold
- {{ __('Median') }}
- %span.has-tooltip{ "data-placement" => "top", title: _("The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."), "aria-hidden" => "true" }
- = sprite_icon('question-o', css_class: 'gl-text-gray-500')
- %li.event-header.pl-3
- %span.stage-name.font-weight-bold{ "v-if" => "currentStage && currentStage.legend" }
- {{ currentStage ? __(currentStage.legend) : __('Related Issues') }}
- %span.has-tooltip{ "data-placement" => "top", title: _("The collection of events added to the data gathered for that stage."), "aria-hidden" => "true" }
- = sprite_icon('question-o', css_class: 'gl-text-gray-500')
- %li.total-time-header.pr-5.text-right
- %span.stage-name.font-weight-bold
- {{ __('Time') }}
- %span.has-tooltip{ "data-placement" => "top", title: _("The time taken by each data entry gathered by that stage."), "aria-hidden" => "true" }
- = sprite_icon('question-o', css_class: 'gl-text-gray-500')
- .stage-panel-body
- %nav.stage-nav
- %ul
- %stage-nav-item{ "v-for" => "stage in state.stages", ":key" => '`ca-stage-title-${stage.title}`', '@select' => 'selectStage(stage)', ":title" => "stage.title", ":is-user-allowed" => "stage.isUserAllowed", ":value" => "stage.value", ":is-active" => "stage.active" }
- .section.stage-events.overflow-auto
- %gl-loading-icon{ "v-show" => "isLoadingStage", "size" => "lg" }
- %template{ "v-if" => "currentStage && !currentStage.isUserAllowed" }
- = render partial: "no_access"
- %template{ "v-else" => true }
- %template{ "v-if" => "isEmptyStage && !isLoadingStage" }
- = render partial: "empty_stage"
- %template{ "v-if" => "state.events.length && !isLoadingStage && !isEmptyStage" }
- %component{ ":is" => "currentStage.component", ":stage" => "currentStage", ":items" => "state.events" }
+#js-cycle-analytics{ data: initial_data }
diff --git a/app/views/projects/default_branch/_show.html.haml b/app/views/projects/default_branch/_show.html.haml
index 0c7649e93d7..728f035555e 100644
--- a/app/views/projects/default_branch/_show.html.haml
+++ b/app/views/projects/default_branch/_show.html.haml
@@ -2,8 +2,8 @@
%section.settings.no-animate#default-branch-settings{ class: ('expanded' if expanded) }
.settings-header
- %h4= _('Default branch')
- %button.btn.js-settings-toggle
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only= _('Default branch')
+ %button.btn.gl-button.btn-default.js-settings-toggle
= expanded ? _('Collapse') : _('Expand')
%p
= _('Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one.')
diff --git a/app/views/projects/diffs/_diffs.html.haml b/app/views/projects/diffs/_diffs.html.haml
index 2f533b5848d..cec8948aaa4 100644
--- a/app/views/projects/diffs/_diffs.html.haml
+++ b/app/views/projects/diffs/_diffs.html.haml
@@ -3,7 +3,7 @@
- can_create_note = !@diff_notes_disabled && can?(current_user, :create_note, diffs.project)
- diff_page_context = local_assigns.fetch(:diff_page_context, nil)
- 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 && Feature.enabled?(:paginate_commit_view, @project, type: :development)
+- paginate_diffs = local_assigns.fetch(:paginate_diffs, false) && !load_diff_files_async
- diff_files = conditionally_paginate_diff_files(diffs, paginate: paginate_diffs)
.content-block.oneline-block.files-changed.diff-files-changed.js-diff-files-changed
diff --git a/app/views/projects/diffs/_file.html.haml b/app/views/projects/diffs/_file.html.haml
index 4b198717790..ff9535af233 100644
--- a/app/views/projects/diffs/_file.html.haml
+++ b/app/views/projects/diffs/_file.html.haml
@@ -16,8 +16,9 @@
- unless diff_file.submodule?
.file-actions.d-none.d-sm-block
- if diff_file.blob&.readable_text?
- = link_to '#', class: 'js-toggle-diff-comments btn gl-button active has-tooltip', title: _("Toggle comments for this file"), disabled: @diff_notes_disabled do
- = sprite_icon('comment')
+ %span.has-tooltip{ title: _("Toggle comments for this file") }
+ = link_to '#', class: 'js-toggle-diff-comments btn gl-button active', disabled: @diff_notes_disabled do
+ = sprite_icon('comment')
\
- if editable_diff?(diff_file)
- link_opts = @merge_request.persisted? ? { from_merge_request_iid: @merge_request.iid } : {}
diff --git a/app/views/projects/edit.html.haml b/app/views/projects/edit.html.haml
index c26017ccb79..9388c5fad6d 100644
--- a/app/views/projects/edit.html.haml
+++ b/app/views/projects/edit.html.haml
@@ -19,7 +19,7 @@
%p= _('Choose visibility level, enable/disable project features and their permissions, disable email notifications, and show default award emoji.')
.settings-content
- = form_for @project, remote: true, html: { multipart: true, class: "sharing-permissions-form" }, authenticity_token: true do |f|
+ = form_for @project, html: { multipart: true, class: "sharing-permissions-form" }, authenticity_token: true do |f|
%input{ name: 'update_section', type: 'hidden', value: 'js-shared-permissions' }
%template.js-project-permissions-form-data{ type: "application/json" }= project_permissions_panel_data_json(@project)
.js-project-permissions-form
@@ -27,7 +27,7 @@
= render "visibility_modal"
= f.submit _('Save changes'), class: "btn gl-button btn-success #{('js-confirm-danger' if show_visibility_confirm_modal?(@project))}", data: { qa_selector: 'visibility_features_permissions_save_button', check_field_name: ("project[visibility_level]" if show_visibility_confirm_modal?(@project)), check_compare_value: @project.visibility_level }
-%section.qa-merge-request-settings.rspec-merge-request-settings.settings.merge-requests-feature.no-animate#js-merge-request-settings{ class: [('expanded' if expanded), ('hidden' if @project.project_feature.send(:merge_requests_access_level) == 0)] }
+%section.rspec-merge-request-settings.settings.merge-requests-feature.no-animate#js-merge-request-settings{ class: [('expanded' if expanded), ('hidden' if @project.project_feature.send(:merge_requests_access_level) == 0)], data: { qa_selector: 'merge_request_settings_content' } }
.settings-header
%h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only= _('Merge requests')
%button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }= expanded ? _('Collapse') : _('Expand')
@@ -36,10 +36,10 @@
.settings-content
= render_if_exists 'shared/promotions/promote_mr_features'
- = form_for @project, remote: true, html: { multipart: true, class: "merge-request-settings-form js-mr-settings-form" }, authenticity_token: true do |f|
+ = 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-success qa-save-merge-request-changes rspec-save-merge-request-changes"
+ = f.submit _('Save changes'), class: "btn gl-button btn-success rspec-save-merge-request-changes", data: { qa_selector: 'save_merge_request_changes_button' }
= render_if_exists 'projects/merge_request_approvals_settings', expanded: expanded
@@ -60,7 +60,7 @@
= render 'projects/service_desk_settings'
-%section.qa-advanced-settings.settings.advanced-settings.no-animate#js-project-advanced-settings{ class: ('expanded' if expanded) }
+%section.settings.advanced-settings.no-animate#js-project-advanced-settings{ class: ('expanded' if expanded), data: { qa_selector: 'advanced_settings_content' } }
.settings-header
%h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only= _('Advanced')
%button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }= expanded ? _('Collapse') : _('Expand')
@@ -96,8 +96,8 @@
.input-group-prepend
.input-group-text
#{Gitlab::Utils.append_path(root_url, @project.namespace.full_path)}/
- = f.text_field :path, class: 'form-control qa-project-path-field h-auto'
- = f.submit _('Change path'), class: "gl-button btn btn-warning qa-change-path-button"
+ = 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' }
= render 'transfer', project: @project
diff --git a/app/views/projects/empty.html.haml b/app/views/projects/empty.html.haml
index 2c245c1a914..0c682226df3 100644
--- a/app/views/projects/empty.html.haml
+++ b/app/views/projects/empty.html.haml
@@ -1,10 +1,7 @@
- @content_class = "limit-container-width" unless fluid_layout
-- default_branch_name = @project.default_branch || "master"
+- default_branch_name = @project.default_branch_or_master
- @skip_current_level_breadcrumb = true
-= content_for :invite_members_sidebar do
- = render partial: 'projects/invite_members_link'
-
= render partial: 'flash_messages', locals: { project: @project }
= render "home_panel"
@@ -77,3 +74,6 @@
%span><
git push -u origin --all
git push -u origin --tags
+
+- if @project.empty_repo_upload_experiment?
+ = render 'projects/blob/upload', title: _('Upload New File'), placeholder: _('Upload New File'), button_title: _('Upload file'), form_path: project_create_blob_path(@project, default_branch_name), ref: default_branch_name, method: :post
diff --git a/app/views/projects/forks/_fork_button.html.haml b/app/views/projects/forks/_fork_button.html.haml
index cfef2a19420..60a4a5c9d70 100644
--- a/app/views/projects/forks/_fork_button.html.haml
+++ b/app/views/projects/forks/_fork_button.html.haml
@@ -1,7 +1,7 @@
- avatar = namespace_icon(namespace, 100)
- can_create_project = current_user.can?(:create_projects, namespace)
-.bordered-box.fork-thumbnail.text-center.gl-m-3{ class: ("disabled" unless can_create_project) }
+.bordered-box.fork-thumbnail.text-center.gl-m-3.gl-pb-5{ class: ("disabled" unless can_create_project) }
- if /no_((\w*)_)*avatar/.match(avatar)
= group_icon(namespace, class: "avatar rect-avatar s100 identicon mx-auto")
- else
diff --git a/app/views/projects/forks/new.html.haml b/app/views/projects/forks/new.html.haml
index ccef28a2cf3..267fc3ae986 100644
--- a/app/views/projects/forks/new.html.haml
+++ b/app/views/projects/forks/new.html.haml
@@ -1,18 +1,29 @@
-- page_title _("Fork project")
-
-.row.gl-mt-3
- .col-lg-3
- %h4.gl-mt-0
- = _("Fork project")
- %p
- = _("A fork is a copy of a project.")
- %br
- = _('Forking a repository allows you to make changes without affecting the original project.')
- .col-lg-9
- - if @own_namespace.present?
- .fork-thumbnail-container.js-fork-content
- %h5.gl-mt-0.gl-mb-0.gl-ml-3.gl-mr-3
- = _("Select a namespace to fork the project")
- = render 'fork_button', namespace: @own_namespace
- #fork-groups-mount-element{ data: { endpoint: new_project_fork_path(@project, format: :json) } }
+- page_title s_("ForkProject|Fork project")
+- if Feature.enabled?(:fork_project_form)
+ #fork-groups-mount-element{ data: { fork_illustration: image_path('illustrations/project-create-new-sm.svg'),
+ endpoint: new_project_fork_path(@project, format: :json),
+ new_group_path: new_group_path,
+ project_full_path: project_path(@project),
+ visibility_help_path: help_page_path("public_access/public_access"),
+ project_id: @project.id,
+ project_name: @project.name,
+ project_path: @project.path,
+ project_description: @project.description,
+ project_visibility: @project.visibility } }
+- else
+ .row.gl-mt-3
+ .col-lg-3
+ %h4.gl-mt-0
+ = s_("ForkProject|Fork project")
+ %p
+ = s_("ForkProject|A fork is a copy of a project.")
+ %br
+ = s_('ForkProject|Forking a repository allows you to make changes without affecting the original project.')
+ .col-lg-9
+ - if @own_namespace.present?
+ .fork-thumbnail-container.js-fork-content
+ %h5.gl-mt-0.gl-mb-0.gl-ml-3.gl-mr-3
+ = s_("ForkProject|Select a namespace to fork the project")
+ = render 'fork_button', namespace: @own_namespace
+ #fork-groups-mount-element{ data: { endpoint: new_project_fork_path(@project, format: :json) } }
diff --git a/app/views/projects/issues/_form.html.haml b/app/views/projects/issues/_form.html.haml
index dcc8000c0c5..d85c448b29a 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 js-quick-submit js-requires-input' } do |f|
+ html: { class: 'issue-form common-note-form gl-mt-3 js-quick-submit js-requires-input' } do |f|
= render 'shared/issuable/form', f: f, issuable: @issue
diff --git a/app/views/projects/issues/_issue.html.haml b/app/views/projects/issues/_issue.html.haml
index 23510713494..838b4538cad 100644
--- a/app/views/projects/issues/_issue.html.haml
+++ b/app/views/projects/issues/_issue.html.haml
@@ -22,7 +22,7 @@
#{issuable_reference(issue)}
%span.issuable-authored.d-none.d-sm-inline-block
&middot;
- opened #{time_ago_with_tooltip(issue.created_at, placement: 'bottom')} by
+ created #{time_ago_with_tooltip(issue.created_at, placement: 'bottom')} by
- if issue.service_desk_reply_to
#{issue.service_desk_reply_to} via
#{link_to_member(@project, issue.author, avatar: false)}
diff --git a/app/views/projects/issues/_nav_btns.html.haml b/app/views/projects/issues/_nav_btns.html.haml
index dbf6a1f1b94..06522d9d434 100644
--- a/app/views/projects/issues/_nav_btns.html.haml
+++ b/app/views/projects/issues/_nav_btns.html.haml
@@ -1,17 +1,15 @@
- show_feed_buttons = local_assigns.fetch(:show_feed_buttons, true)
- show_import_button = local_assigns.fetch(:show_import_button, true) && can?(current_user, :import_issues, @project)
- show_export_button = local_assigns.fetch(:show_export_button, true)
+- issuable_type = 'issues'
+- can_edit = can?(current_user, :admin_project, @project)
+- notification_email = @current_user.present? ? @current_user.notification_email : nil
.nav-controls.issues-nav-controls
- if show_feed_buttons
= render 'shared/issuable/feed_buttons'
- .btn-group
- - if show_export_button
- = render 'shared/issuable/csv_export/button', issuable_type: 'issues'
-
- - if show_import_button
- = render 'projects/issues/import_csv/button'
+ .js-csv-import-export-buttons{ data: { show_export_button: show_export_button.to_s, show_import_button: show_import_button.to_s, issuable_type: issuable_type, issuable_count: issuables_count_for_state(issuable_type.to_sym, params[:state]), email: notification_email, export_csv_path: export_csv_project_issues_path(@project, request.query_parameters), import_csv_issues_path: import_csv_namespace_project_issues_path, container_class: 'gl-mr-3', can_edit: can_edit.to_s, project_import_jira_path: project_import_jira_path(@project) } }
- if @can_bulk_update
= button_tag _("Edit issues"), class: "gl-button btn btn-default gl-mr-3 js-bulk-update-toggle"
@@ -19,11 +17,6 @@
= link_to _("New issue"), new_project_issue_path(@project,
issue: { assignee_id: finder.assignee.try(:id),
milestone_id: finder.milestones.first.try(:id) }),
- class: "gl-button btn btn-success",
+ class: "gl-button btn btn-confirm",
id: "new_issue_link"
-- if show_export_button
- = render 'shared/issuable/csv_export/modal', issuable_type: 'issues'
-
-- if show_import_button
- = render 'projects/issues/import_csv/modal'
diff --git a/app/views/projects/issues/import_csv/_modal.html.haml b/app/views/projects/issues/import_csv/_modal.html.haml
index e928a71b940..ac370210e12 100644
--- a/app/views/projects/issues/import_csv/_modal.html.haml
+++ b/app/views/projects/issues/import_csv/_modal.html.haml
@@ -3,10 +3,8 @@
.modal-content
= form_tag import_csv_namespace_project_issues_path, multipart: true do
.modal-header
- %h3
+ %h4.gl-m-0
= _('Import issues')
- .svg-content.import-export-svg-container
- = image_tag 'illustrations/export-import.svg', alt: _('Import/Export illustration'), class: 'illustration'
%a.close{ href: '#', 'data-dismiss' => 'modal' } ×
.modal-body
.modal-text
diff --git a/app/views/projects/issues/index.html.haml b/app/views/projects/issues/index.html.haml
index dd66e00b813..3fe9e1203ec 100644
--- a/app/views/projects/issues/index.html.haml
+++ b/app/views/projects/issues/index.html.haml
@@ -8,7 +8,7 @@
= content_for :meta_tags do
= auto_discovery_link_tag(:atom, safe_params.merge(rss_url_options).to_h, title: "#{@project.name} issues")
-.js-projects-issues-root{ data: { can_edit: can?(current_user, :admin_project, @project).to_s,
+.js-jira-issues-import-status{ data: { can_edit: can?(current_user, :admin_project, @project).to_s,
is_jira_configured: @project.jira_service.present?.to_s,
issues_path: project_issues_path(@project),
project_path: @project.full_path } }
diff --git a/app/views/projects/issues/new.html.haml b/app/views/projects/issues/new.html.haml
index d1601d7fd10..b18027f0f25 100644
--- a/app/views/projects/issues/new.html.haml
+++ b/app/views/projects/issues/new.html.haml
@@ -2,7 +2,7 @@
- breadcrumb_title _("New")
- page_title _("New Issue")
-%h3.page-title= _("New Issue")
-%hr
+.top-area.flex-lg-row
+ %h3.page-title= _("New Issue")
= render "form"
diff --git a/app/views/projects/learn_gitlab/index.html.haml b/app/views/projects/learn_gitlab/index.html.haml
index d5fdbc10eb4..94023b21aab 100644
--- a/app/views/projects/learn_gitlab/index.html.haml
+++ b/app/views/projects/learn_gitlab/index.html.haml
@@ -1,4 +1,5 @@
- breadcrumb_title _("Learn GitLab")
- page_title _("Learn GitLab")
+- add_page_specific_style 'page_bundles/learn_gitlab'
#js-learn-gitlab-app{ data: { actions: onboarding_actions_data(@project).to_json } }
diff --git a/app/views/projects/merge_requests/_nav_btns.html.haml b/app/views/projects/merge_requests/_nav_btns.html.haml
index 473490c6c35..511e53b192f 100644
--- a/app/views/projects/merge_requests/_nav_btns.html.haml
+++ b/app/views/projects/merge_requests/_nav_btns.html.haml
@@ -1,10 +1,10 @@
-.btn-group
- = render 'shared/issuable/csv_export/button', issuable_type: 'merge-requests'
+- issuable_type = 'merge-requests'
+- notification_email = @current_user.present? ? @current_user.notification_email : nil
+
+.js-csv-import-export-buttons{ data: { show_export_button: "true", issuable_type: issuable_type, issuable_count: issuables_count_for_state(issuable_type.to_sym, params[:state]), email: notification_email, export_csv_path: export_csv_project_merge_requests_path(@project, request.query_parameters), container_class: 'gl-mr-3' } }
- if @can_bulk_update
- = button_tag "Edit merge requests", class: "gl-button btn gl-mr-3 js-bulk-update-toggle"
+ = button_tag "Edit merge requests", class: "gl-button btn btn-default gl-mr-3 js-bulk-update-toggle"
- if merge_project
- = link_to new_merge_request_path, class: "gl-button btn btn-success", title: "New merge request" do
+ = link_to new_merge_request_path, class: "gl-button btn btn-confirm", title: "New merge request" do
New merge request
-
- = render 'shared/issuable/csv_export/modal', issuable_type: 'merge_requests'
diff --git a/app/views/projects/merge_requests/conflicts/_commit_stats.html.haml b/app/views/projects/merge_requests/conflicts/_commit_stats.html.haml
deleted file mode 100644
index cb1cb41eb71..00000000000
--- a/app/views/projects/merge_requests/conflicts/_commit_stats.html.haml
+++ /dev/null
@@ -1,11 +0,0 @@
-.content-block.oneline-block.files-changed{ "v-if" => "!isLoading && !hasError" }
- .inline-parallel-buttons{ "v-if" => "showDiffViewTypeSwitcher" }
- .btn-group
- %button.btn.gl-button{ ":class" => "{'active': !isParallel}", "@click" => "handleViewTypeChange('inline')" }
- = _('Inline')
- %button.btn.gl-button{ ":class" => "{'active': isParallel}", "@click" => "handleViewTypeChange('parallel')" }
- = _('Side-by-side')
-
- .js-toggle-container
- .commit-stat-summary
- = _('Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}').html_safe % { conflict_start: '<strong class="cred">'.html_safe, ref_start: '<strong class="ref-name">'.html_safe, strong_end: '</strong>'.html_safe, conflicts_text: '{{conflictsCountText}}', source_branch: '{{conflictsData.sourceBranch}}', target_branch: '{{conflictsData.targetBranch}}' }
diff --git a/app/views/projects/merge_requests/conflicts/_file_actions.html.haml b/app/views/projects/merge_requests/conflicts/_file_actions.html.haml
deleted file mode 100644
index 220ddf1bad3..00000000000
--- a/app/views/projects/merge_requests/conflicts/_file_actions.html.haml
+++ /dev/null
@@ -1,12 +0,0 @@
-.file-actions.d-flex.align-items-center.gl-ml-auto.gl-align-self-start
- .btn-group.gl-mr-3{ "v-if" => "file.type === 'text'" }
- %button.btn.gl-button{ ":class" => "{ 'active': file.resolveMode == 'interactive' }",
- '@click' => "onClickResolveModeButton(file, 'interactive')",
- type: 'button' }
- = _('Interactive mode')
- %button.btn.gl-button{ ':class' => "{ 'active': file.resolveMode == 'edit' }",
- '@click' => "onClickResolveModeButton(file, 'edit')",
- type: 'button' }
- = _('Edit inline')
- %a.btn.gl-button.view-file{ ":href" => "file.blobPath" }
- = _('View file @%{commit_sha}') % { commit_sha: '{{conflictsData.shortCommitSha}}' }
diff --git a/app/views/projects/merge_requests/conflicts/_submit_form.html.haml b/app/views/projects/merge_requests/conflicts/_submit_form.html.haml
deleted file mode 100644
index 87356f33b1e..00000000000
--- a/app/views/projects/merge_requests/conflicts/_submit_form.html.haml
+++ /dev/null
@@ -1,24 +0,0 @@
-- branch_name = link_to @merge_request.source_branch, project_tree_path(@merge_request.project, @merge_request.source_branch), class: "ref-name"
-- translation =_('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}') % { use_ours: '<code>Use Ours</code>', use_theirs: '<code>Use Theirs</code>', branch_name: branch_name }
-
-%hr
-.resolve-conflicts-form
- .form-group.row
- .col-md-4
- %h4= _('Resolve conflicts on source branch')
- .resolve-info{ "v-pre": true }
- = translation.html_safe
- .col-md-8
- %label.label-bold{ "for" => "commit-message" }
- #{ _('Commit message') }
- .commit-message-container
- .max-width-marker
- %textarea.form-control.js-commit-message#commit-message{ "v-model" => "conflictsData.commitMessage", "rows" => "5" }
- .form-group.row
- .offset-md-4.col-md-8
- .row
- .col-6
- %button.btn.gl-button.btn-success.js-submit-button{ type: "button", "@click" => "commit()", ":disabled" => "!readyToCommit" }
- %span {{commitButtonText}}
- .col-6.text-right
- = link_to "Cancel", project_merge_request_path(@merge_request.project, @merge_request), class: "gl-button btn btn-default"
diff --git a/app/views/projects/merge_requests/conflicts/components/_diff_file_editor.html.haml b/app/views/projects/merge_requests/conflicts/components/_diff_file_editor.html.haml
deleted file mode 100644
index 4ba5ec5795a..00000000000
--- a/app/views/projects/merge_requests/conflicts/components/_diff_file_editor.html.haml
+++ /dev/null
@@ -1,10 +0,0 @@
-%diff-file-editor{ "inline-template" => "true", ":file" => "file", ":on-cancel-discard-confirmation" => "cancelDiscardConfirmation", ":on-accept-discard-confirmation" => "acceptDiscardConfirmation" }
- .diff-editor-wrap{ "v-show" => "file.showEditor" }
- .discard-changes-alert-wrap{ "v-if" => "file.promptDiscardConfirmation" }
- .discard-changes-alert
- Are you sure you want to discard your changes?
- .discard-actions
- %button.btn.btn-sm.btn-danger-secondary.gl-button{ "@click" => "acceptDiscardConfirmation(file)" } Discard changes
- %button.btn.btn-default.btn-sm.gl-button{ "@click" => "cancelDiscardConfirmation(file)" } Cancel
- .editor-wrap{ ":class" => "classObject" }
- .editor{ "style" => "height: 350px", data: { 'editor-loading': true } }
diff --git a/app/views/projects/merge_requests/conflicts/components/_inline_conflict_lines.html.haml b/app/views/projects/merge_requests/conflicts/components/_inline_conflict_lines.html.haml
deleted file mode 100644
index 7bd5c437942..00000000000
--- a/app/views/projects/merge_requests/conflicts/components/_inline_conflict_lines.html.haml
+++ /dev/null
@@ -1,14 +0,0 @@
-%inline-conflict-lines{ "inline-template" => "true", ":file" => "file" }
- %table.diff-wrap-lines.code.code-commit.js-syntax-highlight
- %tr.line_holder.diff-inline{ "v-for" => "line in file.inlineLines" }
- %td.diff-line-num.new_line{ ":class" => "lineCssClass(line)", "v-if" => "!line.isHeader" }
- %a {{line.new_line}}
- %td.diff-line-num.old_line{ ":class" => "lineCssClass(line)", "v-if" => "!line.isHeader" }
- %a {{line.old_line}}
- %td.line_content{ ":class" => "lineCssClass(line)", "v-if" => "!line.isHeader", "v-html" => "line.richText" }
- %td.diff-line-num.header{ ":class" => "lineCssClass(line)", "v-if" => "line.isHeader" }
- %td.diff-line-num.header{ ":class" => "lineCssClass(line)", "v-if" => "line.isHeader" }
- %td.line_content.header{ ":class" => "lineCssClass(line)", "v-if" => "line.isHeader" }
- %strong{ "v-html" => "line.richText" }
- %button.btn{ "@click" => "handleSelected(file, line.id, line.section)" }
- {{line.buttonTitle}}
diff --git a/app/views/projects/merge_requests/conflicts/show.html.haml b/app/views/projects/merge_requests/conflicts/show.html.haml
index 827df540629..e02f126d165 100644
--- a/app/views/projects/merge_requests/conflicts/show.html.haml
+++ b/app/views/projects/merge_requests/conflicts/show.html.haml
@@ -1,5 +1,6 @@
- page_title _("Merge Conflicts"), "#{@merge_request.title} (#{@merge_request.to_reference}", _("Merge Requests")
- add_page_specific_style 'page_bundles/merge_conflicts'
+
= render "projects/merge_requests/mr_title"
.merge-request-details.issuable-details
@@ -7,30 +8,7 @@
= render 'shared/issuable/sidebar', issuable_sidebar: @issuable_sidebar, assignees: @merge_request.assignees, source_branch: @merge_request.source_branch
-#conflicts{ "v-cloak" => "true", data: { conflicts_path: conflicts_project_merge_request_path(@merge_request.project, @merge_request, format: :json),
- resolve_conflicts_path: resolve_conflicts_project_merge_request_path(@merge_request.project, @merge_request) } }
- .loading{ "v-if" => "isLoading" }
- .spinner.spinner-md
-
- .nothing-here-block{ "v-if" => "hasError" }
- {{conflictsData.errorMessage}}
-
- = render partial: "projects/merge_requests/conflicts/commit_stats"
-
- .files-wrapper{ "v-if" => "!isLoading && !hasError" }
- .files
- .diff-file.file-holder.conflict{ "v-for" => "file in conflictsData.files" }
- .js-file-title.file-title.file-title-flex-parent.cursor-default
- .file-header-content
- %file-icon{ ':file-name': 'file.filePath', ':size': '18', 'css-classes': 'gl-mr-2' }
- %strong.file-title-name {{file.filePath}}
- = render partial: 'projects/merge_requests/conflicts/file_actions'
- .diff-content.diff-wrap-lines
- .file-content{ "v-show" => "!isParallel && file.resolveMode === 'interactive' && file.type === 'text'" }
- = render partial: "projects/merge_requests/conflicts/components/inline_conflict_lines"
- .file-content{ "v-show" => "isParallel && file.resolveMode === 'interactive' && file.type === 'text'" }
- %parallel-conflict-lines{ ":file" => "file" }
- %div{ "v-show" => "file.resolveMode === 'edit' || file.type === 'text-editor'" }
- = render partial: "projects/merge_requests/conflicts/components/diff_file_editor"
-
- = render partial: "projects/merge_requests/conflicts/submit_form"
+#conflicts{ data: { conflicts_path: conflicts_project_merge_request_path(@merge_request.project, @merge_request, format: :json),
+ resolve_conflicts_path: resolve_conflicts_project_merge_request_path(@merge_request.project, @merge_request),
+ source_branch_path: project_tree_path(@merge_request.project, @merge_request.source_branch),
+ merge_request_path: project_merge_request_path(@merge_request.project, @merge_request) } }
diff --git a/app/views/projects/mirrors/_mirror_repos.html.haml b/app/views/projects/mirrors/_mirror_repos.html.haml
index d6ad6147e6e..bcdc2988e49 100644
--- a/app/views/projects/mirrors/_mirror_repos.html.haml
+++ b/app/views/projects/mirrors/_mirror_repos.html.haml
@@ -5,8 +5,8 @@
%section.settings.project-mirror-settings.no-animate#js-push-remote-settings{ class: mirror_settings_class, data: { qa_selector: 'mirroring_repositories_settings_content' } }
.settings-header
- %h4= _('Mirroring repositories')
- %button.btn.gl-button.js-settings-toggle
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only= _('Mirroring repositories')
+ %button.btn.gl-button.btn-default.js-settings-toggle
= expanded ? _('Collapse') : _('Expand')
%p
= _('Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically.')
diff --git a/app/views/projects/new.html.haml b/app/views/projects/new.html.haml
index 45e7eae8c70..059d6eb28c5 100644
--- a/app/views/projects/new.html.haml
+++ b/app/views/projects/new.html.haml
@@ -8,7 +8,7 @@
.project-edit-errors
= render 'projects/errors'
- .js-experiment-new-project-creation{ data: { is_ci_cd_available: (ci_cd_projects_available? if Gitlab.ee?), has_errors: @project.errors.any?, new_project_guidelines: brand_new_project_guidelines } }
+ .js-experiment-new-project-creation{ data: { is_ci_cd_available: (ci_cd_projects_available? if Gitlab.ee?), has_errors: @project.errors.any?, new_project_guidelines: brand_new_project_guidelines, push_to_create_project_command: push_to_create_project_command, working_with_projects_help_path: help_page_path("user/project/working_with_projects") } }
.row{ 'v-cloak': true }
.col-lg-3.profile-settings-sidebar
@@ -28,9 +28,6 @@
%p
%strong= _("Tip:")
= _("You can also create a project from the command line.")
- %a.push-new-project-tip{ data: { title: _("Push to create a project") }, href: help_page_path('user/project/working_with_projects', anchor: 'push-to-create-a-new-project'), target: "_blank", rel: "noopener noreferrer" }
- = _("Show command")
- %template.push-new-project-tip-template= render partial: "new_project_push_tip"
.col-lg-9.js-toggle-container
%ul.nav.nav-tabs.nav-links.gitlab-tabs{ role: 'tablist' }
diff --git a/app/views/projects/no_repo.html.haml b/app/views/projects/no_repo.html.haml
index 3c7afff57f6..c88ea313287 100644
--- a/app/views/projects/no_repo.html.haml
+++ b/app/views/projects/no_repo.html.haml
@@ -12,8 +12,6 @@
#{ _('This means you can not push code until you create an empty repository or import existing one.') }
%hr
-= render 'projects/invite_members_modal', project: @project
-
.no-repo-actions
= link_to project_repository_path(@project), method: :post, class: 'btn gl-button btn-confirm' do
#{ _('Create empty repository') }
diff --git a/app/views/projects/pipeline_schedules/_pipeline_schedule.html.haml b/app/views/projects/pipeline_schedules/_pipeline_schedule.html.haml
index e17c905e092..190bf9bf071 100644
--- a/app/views/projects/pipeline_schedules/_pipeline_schedule.html.haml
+++ b/app/views/projects/pipeline_schedules/_pipeline_schedule.html.haml
@@ -27,14 +27,14 @@
%td
.float-right.btn-group
- if can?(current_user, :play_pipeline_schedule, pipeline_schedule)
- = link_to play_pipeline_schedule_path(pipeline_schedule), method: :post, title: s_('Play'), class: 'btn gl-button btn-default btn-svg' do
+ = link_to play_pipeline_schedule_path(pipeline_schedule), method: :post, title: s_('Play'), class: 'btn gl-button btn-default btn-icon' do
= sprite_icon('play')
- if can?(current_user, :take_ownership_pipeline_schedule, pipeline_schedule)
= link_to take_ownership_pipeline_schedule_path(pipeline_schedule), method: :post, title: s_('PipelineSchedules|Take ownership'), class: 'btn gl-button btn-default' do
= s_('PipelineSchedules|Take ownership')
- if can?(current_user, :update_pipeline_schedule, pipeline_schedule)
- = link_to edit_pipeline_schedule_path(pipeline_schedule), title: _('Edit'), class: 'btn gl-button btn-default' do
+ = link_to edit_pipeline_schedule_path(pipeline_schedule), title: _('Edit'), class: 'btn gl-button btn-default btn-icon' do
= sprite_icon('pencil')
- if can?(current_user, :admin_pipeline_schedule, pipeline_schedule)
- = link_to pipeline_schedule_path(pipeline_schedule), title: _('Delete'), method: :delete, class: 'btn gl-button btn-danger', data: { confirm: _("Are you sure you want to delete this pipeline schedule?") } do
+ = link_to pipeline_schedule_path(pipeline_schedule), title: _('Delete'), method: :delete, class: 'btn gl-button btn-danger btn-icon', data: { confirm: _("Are you sure you want to delete this pipeline schedule?") } do
= sprite_icon('remove')
diff --git a/app/views/projects/pipelines/charts.html.haml b/app/views/projects/pipelines/charts.html.haml
index ff728ab2fb3..139f6e3c94d 100644
--- a/app/views/projects/pipelines/charts.html.haml
+++ b/app/views/projects/pipelines/charts.html.haml
@@ -1,4 +1,4 @@
-- page_title _('CI / CD Analytics')
+- page_title _('CI/CD Analytics')
#js-project-pipelines-charts-app{ data: { project_path: @project.full_path,
should_render_deployment_frequency_charts: should_render_deployment_frequency_charts.to_s } }
diff --git a/app/views/projects/pipelines/index.html.haml b/app/views/projects/pipelines/index.html.haml
index 6a4dd88ae07..7d7b8a155ac 100644
--- a/app/views/projects/pipelines/index.html.haml
+++ b/app/views/projects/pipelines/index.html.haml
@@ -7,8 +7,6 @@
#pipelines-list-vue{ data: { endpoint: project_pipelines_path(@project, format: :json),
project_id: @project.id,
params: params.to_json,
- "help-page-path" => help_page_path('ci/quick_start/README'),
- "auto-devops-help-path" => help_page_path('topics/autodevops/index.md'),
"pipeline-schedule-url" => pipeline_schedules_path(@project),
"empty-state-svg-path" => image_path('illustrations/pipelines_empty.svg'),
"error-state-svg-path" => image_path('illustrations/pipelines_failed.svg'),
diff --git a/app/views/projects/pipelines/new.html.haml b/app/views/projects/pipelines/new.html.haml
index 7d5cef2015d..7a3817fe87b 100644
--- a/app/views/projects/pipelines/new.html.haml
+++ b/app/views/projects/pipelines/new.html.haml
@@ -6,7 +6,7 @@
= s_('Pipeline|Run Pipeline')
%hr
-- if Feature.enabled?(:new_pipeline_form, @project, default_enabled: true)
+- if Feature.enabled?(:new_pipeline_form, @project, default_enabled: :yaml)
#js-new-pipeline{ data: { project_id: @project.id,
pipelines_path: project_pipelines_path(@project),
config_variables_path: config_variables_namespace_project_pipelines_path(@project.namespace, @project),
@@ -14,8 +14,7 @@
ref_param: params[:ref] || @project.default_branch,
var_param: params[:var].to_json,
file_param: params[:file_var].to_json,
- branch_refs: @project.repository.branch_names.to_json.html_safe,
- tag_refs: @project.repository.tag_names.to_json.html_safe,
+ project_refs_endpoint: refs_project_path(@project, sort: 'updated_desc'),
settings_link: project_settings_ci_cd_path(@project),
max_warnings: ::Gitlab::Ci::Warnings::MAX_LIMIT } }
diff --git a/app/views/projects/pipelines/show.html.haml b/app/views/projects/pipelines/show.html.haml
index b431ef202b3..68c80833299 100644
--- a/app/views/projects/pipelines/show.html.haml
+++ b/app/views/projects/pipelines/show.html.haml
@@ -26,4 +26,4 @@
= render "projects/pipelines/with_tabs", pipeline: @pipeline, pipeline_has_errors: pipeline_has_errors
-.js-pipeline-details-vue{ data: { endpoint: project_pipeline_path(@project, @pipeline, format: :json), pipeline_project_path: @project.full_path, pipeline_iid: @pipeline.iid } }
+.js-pipeline-details-vue{ data: { endpoint: project_pipeline_path(@project, @pipeline, format: :json), 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/_groups.html.haml b/app/views/projects/project_members/_groups.html.haml
deleted file mode 100644
index fe8a50ebb42..00000000000
--- a/app/views/projects/project_members/_groups.html.haml
+++ /dev/null
@@ -1,11 +0,0 @@
-.card.card-without-border
- = render 'shared/members/tab_pane/header' do
- = render 'shared/members/tab_pane/title' do
- = html_escape(_("Groups with access to %{strong_open}%{project_name}%{strong_close}")) % { project_name: sanitize(@project.name, tags: []), strong_open: '<strong>'.html_safe, strong_close: '</strong>'.html_safe }
- = form_tag project_project_members_path(@project), method: :get, class: 'user-search-form gl-mx-n3 gl-my-n3', data: { testid: 'group-link-search-form' } do
- .gl-px-3.gl-py-2
- .search-control-wrap.gl-relative
- = render 'shared/members/search_field', name: 'search_groups'
- %ul.content-list.members-list{ data: { testid: 'project-member-groups' } }
- - @group_links.each do |group_link|
- = render 'shared/members/group', group_link: group_link, can_admin_member: can_manage_project_members?(@project), group_link_path: project_group_link_path(@project, group_link)
diff --git a/app/views/projects/project_members/_team.html.haml b/app/views/projects/project_members/_team.html.haml
deleted file mode 100644
index 24ca7ebded9..00000000000
--- a/app/views/projects/project_members/_team.html.haml
+++ /dev/null
@@ -1,22 +0,0 @@
-- project = local_assigns.fetch(:project)
-- members = local_assigns.fetch(:members)
-- group = local_assigns.fetch(:group)
-- current_user_is_group_owner = local_assigns.fetch(:current_user_is_group_owner)
-
-.card.card-without-border
- = render 'shared/members/tab_pane/header' do
- = render 'shared/members/tab_pane/title' do
- = html_escape(_("Members of %{strong_open}%{project_name}%{strong_close}")) % { project_name: sanitize(project.name, tags: []), strong_open: '<strong>'.html_safe, strong_close: '</strong>'.html_safe }
- = form_tag project_project_members_path(project), method: :get, class: 'user-search-form gl-display-flex gl-md-align-items-center gl-flex-wrap gl-flex-direction-column gl-md-flex-direction-row gl-mx-n3 gl-my-n3', data: { testid: 'user-search-form' } do
- .gl-px-3.gl-py-2
- .search-control-wrap.gl-relative
- = render 'shared/members/search_field'
- = render 'shared/members/tab_pane/form_item' do
- = label_tag :sort_by, _('Sort by'), class: 'label-bold gl-mr-2 gl-mb-0 gl-py-2 align-self-md-center'
- = render 'shared/members/sort_dropdown'
- %ul.content-list.members-list{ data: { qa_selector: 'members_list', testid: 'members-table' } }
- = render partial: 'shared/members/member',
- collection: members, as: :member,
- locals: { membership_source: project,
- group: group,
- current_user_is_group_owner: current_user_is_group_owner }
diff --git a/app/views/projects/project_members/index.html.haml b/app/views/projects/project_members/index.html.haml
index beb435d268a..c88dae079ae 100644
--- a/app/views/projects/project_members/index.html.haml
+++ b/app/views/projects/project_members/index.html.haml
@@ -1,6 +1,5 @@
+- add_page_specific_style 'page_bundles/members'
- page_title _("Members")
-- group = @project.group
-- vue_project_members_list_enabled = Feature.enabled?(:vue_project_members_list, @project, default_enabled: :yaml)
.js-remove-member-modal
.row.gl-mt-3
@@ -18,8 +17,9 @@
%p
= html_escape(_("Members can be added by project %{i_open}Maintainers%{i_close} or %{i_open}Owners%{i_close}")) % { i_open: '<i>'.html_safe, i_close: '</i>'.html_safe }
.col-md-12.col-lg-6
- .gl-display-flex.gl-flex-wrap.gl-lg-justify-content-end.gl-mx-n2.gl-mb-3
- .js-invite-members-trigger.gl-px-2.gl-sm-w-auto.gl-w-full.gl-mb-4{ data: { classes: 'btn btn-success gl-button gl-mt-3 gl-sm-w-auto gl-w-full', display_text: _('Invite members') } }
+ .gl-display-flex.gl-flex-wrap.gl-justify-content-end
+ .js-invite-group-trigger{ data: { classes: 'gl-mt-3 gl-sm-w-auto gl-w-full', display_text: _('Invite a group') } }
+ .js-invite-members-trigger{ data: { variant: 'success', classes: 'gl-mt-3 gl-sm-w-auto gl-w-full gl-sm-ml-3', display_text: _('Invite members') } }
= render 'projects/invite_members_modal', project: @project
- else
@@ -75,44 +75,22 @@
%span.badge.badge-pill= @requesters.count
.tab-content
#tab-members.tab-pane{ class: ('active' unless groups_tab_active?) }
- - if vue_project_members_list_enabled
- .js-project-members-list{ data: project_members_list_data_attributes(@project, @project_members) }
- .loading
- .spinner.spinner-md
- - else
- = render 'projects/project_members/team', project: @project, group: group, members: @project_members, current_user_is_group_owner: current_user_is_group_owner?(@project)
+ .js-project-members-list{ data: project_members_list_data_attributes(@project, @project_members) }
+ .loading
+ .spinner.spinner-md
= paginate @project_members, theme: "gitlab", params: { search_groups: nil }
- if show_groups?(@group_links)
#tab-groups.tab-pane{ class: ('active' if groups_tab_active?) }
- - if vue_project_members_list_enabled
- .js-project-group-links-list{ data: project_group_links_list_data_attributes(@project, @group_links) }
- .loading
- .spinner.spinner-md
- - else
- = render 'projects/project_members/groups', group_links: @group_links
+ .js-project-group-links-list{ data: project_group_links_list_data_attributes(@project, @group_links) }
+ .loading
+ .spinner.spinner-md
- if show_invited_members?(@project, @invited_members)
#tab-invited-members.tab-pane
- - if vue_project_members_list_enabled
- .js-project-invited-members-list{ data: project_members_list_data_attributes(@project, @invited_members) }
- .loading
- .spinner.spinner-md
- - else
- .card.card-without-border
- = render 'shared/members/tab_pane/header' do
- = render 'shared/members/tab_pane/title' do
- = html_escape(_('Members invited to %{strong_start}%{project_name}%{strong_end}')) % { project_name: @project.name, strong_start: '<strong>'.html_safe, strong_end: '</strong>'.html_safe }
- %ul.content-list.members-list
- = render partial: 'shared/members/member', collection: @invited_members, as: :member, locals: { membership_source: @project, group: group, current_user_is_group_owner: current_user_is_group_owner?(@project) }
+ .js-project-invited-members-list{ data: project_members_list_data_attributes(@project, @invited_members) }
+ .loading
+ .spinner.spinner-md
- if show_access_requests?(@project, @requesters)
#tab-access-requests.tab-pane
- - if vue_project_members_list_enabled
- .js-project-access-requests-list{ data: project_members_list_data_attributes(@project, @requesters) }
- .loading
- .spinner.spinner-md
- - else
- .card.card-without-border
- = render 'shared/members/tab_pane/header' do
- = render 'shared/members/tab_pane/title' do
- = html_escape(_('Users requesting access to %{strong_start}%{project_name}%{strong_end}')) % { project_name: @project.name, strong_start: '<strong>'.html_safe, strong_end: '</strong>'.html_safe }
- %ul.content-list.members-list
- = render partial: 'shared/members/member', collection: @requesters, as: :member, locals: { membership_source: @project, group: group }
+ .js-project-access-requests-list{ data: project_members_list_data_attributes(@project, @requesters) }
+ .loading
+ .spinner.spinner-md
diff --git a/app/views/projects/project_templates/_project_fields_form.html.haml b/app/views/projects/project_templates/_project_fields_form.html.haml
index 201e2d5b5fb..7908550ca88 100644
--- a/app/views/projects/project_templates/_project_fields_form.html.haml
+++ b/app/views/projects/project_templates/_project_fields_form.html.haml
@@ -8,5 +8,5 @@
.selected-icon.gl-mr-3
.selected-template
.input-group-append
- %button.btn.btn-default.change-template{ type: "button" }
+ %button.btn.gl-button.btn-default.change-template{ type: "button" }
= _('Change template')
diff --git a/app/views/projects/protected_branches/shared/_branches_list.html.haml b/app/views/projects/protected_branches/shared/_branches_list.html.haml
index f07de81d7fd..522e9888bc6 100644
--- a/app/views/projects/protected_branches/shared/_branches_list.html.haml
+++ b/app/views/projects/protected_branches/shared/_branches_list.html.haml
@@ -23,6 +23,12 @@
%th
= s_("ProtectedBranch|Allowed to push")
+ - if ::Feature.enabled?(:allow_force_push_to_protected_branches, @project)
+ %th
+ = s_("ProtectedBranch|Allow force push")
+ %span.has-tooltip{ data: { container: 'body' }, title: s_('ProtectedBranch|Allow force push for all users with push access.'), 'aria-hidden': 'true' }
+ = sprite_icon('question', size: 16, css_class: 'gl-text-gray-500')
+
= render_if_exists 'projects/protected_branches/ee/code_owner_approval_table_head'
- if can_admin_project
diff --git a/app/views/projects/protected_branches/shared/_create_protected_branch.html.haml b/app/views/projects/protected_branches/shared/_create_protected_branch.html.haml
index 6ce01566a42..ae03b198bc9 100644
--- a/app/views/projects/protected_branches/shared/_create_protected_branch.html.haml
+++ b/app/views/projects/protected_branches/shared/_create_protected_branch.html.haml
@@ -21,6 +21,13 @@
= f.label :push_access_levels_attributes, s_("ProtectedBranch|Allowed to push:"), class: 'col-md-2 text-left text-md-right'
.col-md-10
= yield :push_access_levels
+ - if ::Feature.enabled?(:allow_force_push_to_protected_branches, @project)
+ .form-group.row
+ = f.label :allow_force_push, s_("ProtectedBranch|Allow force push:"), class: 'col-md-2 gl-text-left text-md-right'
+ .col-md-10
+ = render "shared/buttons/project_feature_toggle", class_list: "js-force-push-toggle project-feature-toggle"
+ .form-text.gl-text-gray-600.gl-mt-0
+ = s_("ProtectedBranch|Allow force push for all users with push access.")
= render_if_exists 'projects/protected_branches/ee/code_owner_approval_form', f: f
.card-footer
- = f.submit s_('ProtectedBranch|Protect'), class: 'btn-success btn', disabled: true, data: { qa_selector: 'protect_button' }
+ = f.submit s_('ProtectedBranch|Protect'), class: 'btn-success gl-button btn', disabled: true, data: { qa_selector: 'protect_button' }
diff --git a/app/views/projects/protected_branches/shared/_index.html.haml b/app/views/projects/protected_branches/shared/_index.html.haml
index 1d3e3fb11ae..c2a5efa7b7c 100644
--- a/app/views/projects/protected_branches/shared/_index.html.haml
+++ b/app/views/projects/protected_branches/shared/_index.html.haml
@@ -2,9 +2,9 @@
%section.settings.no-animate#js-protected-branches-settings{ class: ('expanded' if expanded), data: { qa_selector: 'protected_branches_settings_content' } }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
Protected branches
- %button.btn.js-settings-toggle.qa-expand-protected-branches{ type: 'button' }
+ %button.btn.gl-button.btn-default.js-settings-toggle.qa-expand-protected-branches{ type: 'button' }
= expanded ? 'Collapse' : 'Expand'
%p
Keep stable branches secure, and force developers to use merge requests. #{link_to "What are protected branches?", help_page_path("user/project/protected_branches")}
diff --git a/app/views/projects/protected_tags/shared/_index.html.haml b/app/views/projects/protected_tags/shared/_index.html.haml
index 67eadd39ed6..aab4d366605 100644
--- a/app/views/projects/protected_tags/shared/_index.html.haml
+++ b/app/views/projects/protected_tags/shared/_index.html.haml
@@ -2,9 +2,9 @@
%section.settings.no-animate#js-protected-tags-settings{ class: ('expanded' if expanded), data: { qa_selector: 'protected_tag_settings_content' } }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
Protected tags
- %button.btn.js-settings-toggle{ type: 'button' }
+ %button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
= expanded ? 'Collapse' : 'Expand'
%p
Limit access to creating and updating tags. #{link_to "What are protected tags?", help_page_path("user/project/protected_tags")}
diff --git a/app/views/projects/registry/repositories/index.html.haml b/app/views/projects/registry/repositories/index.html.haml
index a2009b96c0d..bbef5150a62 100644
--- a/app/views/projects/registry/repositories/index.html.haml
+++ b/app/views/projects/registry/repositories/index.html.haml
@@ -15,7 +15,6 @@
"expiration_policy_help_page_path" => help_page_path('user/packages/container_registry/index', anchor: 'expiration-policy'),
"garbage_collection_help_page_path" => help_page_path('administration/packages/container_registry', anchor: 'container-registry-garbage-collection'),
"run_cleanup_policies_help_page_path" => help_page_path('administration/packages/container_registry', anchor: 'run-the-cleanup-policy-now'),
- "cleanup_policies_help_page_path" => help_page_path('user/packages/container_registry/index', anchor: 'how-the-cleanup-policy-works'),
"project_path": @project.full_path,
"gid_prefix": container_repository_gid_prefix,
"is_admin": current_user&.admin.to_s,
diff --git a/app/views/projects/runners/_runner.html.haml b/app/views/projects/runners/_runner.html.haml
index 41159df1435..7f5acbbe890 100644
--- a/app/views/projects/runners/_runner.html.haml
+++ b/app/views/projects/runners/_runner.html.haml
@@ -40,5 +40,5 @@
- if runner.tags.present?
%p
- runner.tags.map(&:name).sort.each do |tag|
- %span.badge.badge-primary
+ %span.badge.gl-badge.sm.badge-pill.badge-primary
= tag
diff --git a/app/views/projects/security/configuration/show.html.haml b/app/views/projects/security/configuration/show.html.haml
index fe47ce327c2..4d6feb9de6d 100644
--- a/app/views/projects/security/configuration/show.html.haml
+++ b/app/views/projects/security/configuration/show.html.haml
@@ -1,4 +1,4 @@
- breadcrumb_title _("Security Configuration")
- page_title _("Security Configuration")
-#js-security-configuration-static{ data: {project_path: @project.full_path} }
+#js-security-configuration-static{ data: { project_path: @project.full_path, upgrade_path: security_upgrade_path } }
diff --git a/app/views/projects/services/prometheus/_configuration_banner.html.haml b/app/views/projects/services/prometheus/_configuration_banner.html.haml
index 717df405fa7..9b8da857398 100644
--- a/app/views/projects/services/prometheus/_configuration_banner.html.haml
+++ b/app/views/projects/services/prometheus/_configuration_banner.html.haml
@@ -3,7 +3,7 @@
- if service.manual_configuration?
.info-well
- = s_('PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below')
+ = s_('PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration.')
- else
.container-fluid
.row
@@ -13,14 +13,14 @@
= image_tag 'illustrations/monitoring/getting_started.svg'
.col-sm-10
%p.text-success.gl-mt-3
- = s_('PrometheusService|Prometheus is being automatically managed on your clusters')
+ = s_('PrometheusService|GitLab is managing Prometheus on your clusters.')
= 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|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments')
+ = s_('PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments.')
= link_to s_('PrometheusService|Install Prometheus on clusters'), project_clusters_path(project), class: 'btn gl-button btn-success'
%hr
diff --git a/app/views/projects/services/prometheus/_help.html.haml b/app/views/projects/services/prometheus/_help.html.haml
index c5b3fd31efa..04bd800c47a 100644
--- a/app/views/projects/services/prometheus/_help.html.haml
+++ b/app/views/projects/services/prometheus/_help.html.haml
@@ -4,4 +4,4 @@
%h4.gl-mb-3
= s_('PrometheusService|Manual configuration')
%p
- = s_('PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used.')
+ = s_('PrometheusService|Auto configuration settings are used unless you override their values here.')
diff --git a/app/views/projects/settings/_general.html.haml b/app/views/projects/settings/_general.html.haml
index 3b03e213983..d1a95886115 100644
--- a/app/views/projects/settings/_general.html.haml
+++ b/app/views/projects/settings/_general.html.haml
@@ -1,13 +1,12 @@
-= form_for [@project], remote: true, html: { multipart: true, class: "edit-project js-general-settings-form" }, authenticity_token: true do |f|
+= form_for [@project], html: { multipart: true, class: "edit-project js-general-settings-form" }, authenticity_token: true do |f|
%input{ name: 'update_section', type: 'hidden', value: 'js-general-settings' }
- = form_errors(@project)
%fieldset
.row
.form-group.col-md-5
= f.label :name, class: 'label-bold', for: 'project_name_edit' do
= _('Project name')
- = f.text_field :name, class: 'form-control gl-form-input qa-project-name-field', id: "project_name_edit"
+ = f.text_field :name, class: 'form-control gl-form-input', id: "project_name_edit", data: { qa_selector: 'project_name_field' }
.form-group.col-md-7
= f.label :id, class: 'label-bold' do
@@ -40,4 +39,4 @@
%hr
= link_to _('Remove avatar'), project_avatar_path(@project), data: { confirm: _('Avatar will be removed. Are you sure?')}, method: :delete, class: 'btn btn-link'
- = f.submit _('Save changes'), class: "gl-button btn btn-success gl-mt-6 qa-save-naming-topics-avatar-button"
+ = f.submit _('Save changes'), class: "gl-button btn btn-success gl-mt-6", data: { qa_selector: 'save_naming_topics_avatar_button' }
diff --git a/app/views/projects/settings/ci_cd/_badge.html.haml b/app/views/projects/settings/ci_cd/_badge.html.haml
index 2c3e6387972..38d8c8d26e1 100644
--- a/app/views/projects/settings/ci_cd/_badge.html.haml
+++ b/app/views/projects/settings/ci_cd/_badge.html.haml
@@ -12,21 +12,21 @@
= render 'shared/ref_switcher', destination: 'badges', align_right: true
.card-body
.row
- .col-md-2.text-center
+ .col-md-2.gl-text-center
Markdown
.col-md-10.code.js-syntax-highlight
= highlight_badge('.md', badge.to_markdown, language: 'markdown')
.row
%hr
.row
- .col-md-2.text-center
+ .col-md-2.gl-text-center
HTML
.col-md-10.code.js-syntax-highlight
= highlight_badge('.html', badge.to_html, language: 'html')
.row
%hr
.row
- .col-md-2.text-center
+ .col-md-2.gl-text-center
AsciiDoc
.col-md-10.code.js-syntax-highlight
= highlight_badge('.adoc', badge.to_asciidoc)
diff --git a/app/views/projects/settings/ci_cd/_form.html.haml b/app/views/projects/settings/ci_cd/_form.html.haml
index e0c4a3d624e..3b0073848a6 100644
--- a/app/views/projects/settings/ci_cd/_form.html.haml
+++ b/app/views/projects/settings/ci_cd/_form.html.haml
@@ -96,7 +96,7 @@
= html_escape(_('The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable.')) % { regex: '<code>\(\d+.\d+%\)</code>'.html_safe }
= link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'test-coverage-parsing'), target: '_blank'
- = f.submit _('Save changes'), class: "btn btn-success", data: { qa_selector: 'save_general_pipelines_changes_button' }
+ = f.submit _('Save changes'), class: "btn gl-button btn-success", data: { qa_selector: 'save_general_pipelines_changes_button' }
%hr
diff --git a/app/views/projects/settings/ci_cd/show.html.haml b/app/views/projects/settings/ci_cd/show.html.haml
index 51abb8ed791..cca980b5359 100644
--- a/app/views/projects/settings/ci_cd/show.html.haml
+++ b/app/views/projects/settings/ci_cd/show.html.haml
@@ -1,13 +1,15 @@
- @content_class = "limit-container-width" unless fluid_layout
-- page_title _("CI / CD Settings")
-- page_title _("CI / CD")
+- page_title _("CI/CD Settings")
+- page_title _("CI/CD")
- expanded = expanded_by_default?
- general_expanded = @project.errors.empty? ? expanded : true
+- enable_search_settings locals: { container_class: 'gl-my-5' }
+
%section.settings#js-general-pipeline-settings.no-animate{ class: ('expanded' if general_expanded), data: { qa_selector: 'general_pipelines_settings_content' } }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _("General pipelines")
%button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
= expanded ? _('Collapse') : _('Expand')
@@ -18,7 +20,7 @@
%section.settings#autodevops-settings.no-animate{ class: ('expanded' if expanded), data: { qa_selector: 'autodevops_settings_content' } }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= s_('CICD|Auto DevOps')
%button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
= expanded ? _('Collapse') : _('Expand')
@@ -35,7 +37,7 @@
%section.settings.no-animate#js-runners-settings{ class: ('expanded' if expanded || params[:expand_runners]), data: { qa_selector: 'runners_settings_content' } }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _("Runners")
%button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
= expanded ? _('Collapse') : _('Expand')
@@ -48,7 +50,7 @@
- if Gitlab::CurrentSettings.current_application_settings.keep_latest_artifact?
%section.settings.no-animate#js-artifacts-settings{ class: ('expanded' if expanded) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _("Artifacts")
%button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
= expanded ? _('Collapse') : _('Expand')
@@ -65,7 +67,7 @@
%section.settings.no-animate#js-pipeline-triggers{ class: ('expanded' if expanded) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _("Pipeline triggers")
%button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
= expanded ? _('Collapse') : _('Expand')
@@ -78,7 +80,7 @@
- if settings_container_registry_expiration_policy_available?(@project)
%section.settings.no-animate#js-registry-policies{ class: ('expanded' if expanded) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _("Clean up image tags")
%button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
= expanded ? _('Collapse') : _('Expand')
@@ -93,7 +95,7 @@
- if can?(current_user, :create_freeze_period, @project)
%section.settings.no-animate#js-deploy-freeze-settings{ class: ('expanded' if expanded) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _("Deploy freezes")
%button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
= expanded ? _('Collapse') : _('Expand')
diff --git a/app/views/projects/settings/operations/_configuration_banner.html.haml b/app/views/projects/settings/operations/_configuration_banner.html.haml
index 69bbd0edac7..888625689f1 100644
--- a/app/views/projects/settings/operations/_configuration_banner.html.haml
+++ b/app/views/projects/settings/operations/_configuration_banner.html.haml
@@ -3,7 +3,7 @@
- if service.manual_configuration?
.info-well.p-2.mt-2
- = s_('PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below')
+ = s_('PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration.')
- else
.container-fluid
.row
@@ -13,12 +13,12 @@
= image_tag 'illustrations/monitoring/getting_started.svg'
.col-sm-10
%p.text-success.gl-mt-3
- = s_('PrometheusService|Prometheus is being automatically managed on your clusters')
+ = s_('PrometheusService|GitLab manages Prometheus on your clusters.')
= link_to s_('PrometheusService|Manage clusters'), project_clusters_path(project), class: 'btn'
- else
.col-sm-2
= image_tag 'illustrations/monitoring/loading.svg'
.col-sm-10
%p.gl-mt-3
- = s_('PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments')
+ = s_('PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters.')
= link_to s_('PrometheusService|Install Prometheus on clusters'), project_clusters_path(project), class: 'btn btn-success'
diff --git a/app/views/projects/settings/operations/_prometheus.html.haml b/app/views/projects/settings/operations/_prometheus.html.haml
index 7ccc829662d..ccf5b5dc75f 100644
--- a/app/views/projects/settings/operations/_prometheus.html.haml
+++ b/app/views/projects/settings/operations/_prometheus.html.haml
@@ -14,4 +14,4 @@
%b.gl-mb-3
= s_('PrometheusService|Manual configuration')
%p
- = s_('PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used.')
+ = s_('PrometheusService|Auto configuration settings are used unless you override their values here.')
diff --git a/app/views/projects/settings/operations/show.html.haml b/app/views/projects/settings/operations/show.html.haml
index 73722a5a789..5ba796f5720 100644
--- a/app/views/projects/settings/operations/show.html.haml
+++ b/app/views/projects/settings/operations/show.html.haml
@@ -2,6 +2,8 @@
- page_title _('Operations Settings')
- breadcrumb_title _('Operations Settings')
+- enable_search_settings locals: { container_class: 'gl-my-5' }
+
= render 'projects/settings/operations/alert_management'
= render 'projects/settings/operations/incidents'
= render 'projects/settings/operations/error_tracking'
diff --git a/app/views/projects/settings/repository/show.html.haml b/app/views/projects/settings/repository/show.html.haml
index 24fc137fd29..8ac42ce3f81 100644
--- a/app/views/projects/settings/repository/show.html.haml
+++ b/app/views/projects/settings/repository/show.html.haml
@@ -3,6 +3,8 @@
- @content_class = "limit-container-width" unless fluid_layout
- deploy_token_description = s_('DeployTokens|Deploy tokens allow access to packages, your repository, and registry images.')
+- enable_search_settings locals: { container_class: 'gl-my-5' }
+
= render "projects/default_branch/show"
= render_if_exists "projects/push_rules/index"
= render "projects/mirrors/mirror_repos"
diff --git a/app/views/projects/show.html.haml b/app/views/projects/show.html.haml
index e1774c955bc..40faf91eadf 100644
--- a/app/views/projects/show.html.haml
+++ b/app/views/projects/show.html.haml
@@ -6,9 +6,6 @@
= content_for :meta_tags do
= auto_discovery_link_tag(:atom, project_path(@project, rss_url_options), title: "#{@project.name} activity")
-= content_for :invite_members_sidebar do
- = render partial: 'projects/invite_members_link'
-
= render partial: 'flash_messages', locals: { project: @project }
= render "projects/last_push"
diff --git a/app/views/projects/tags/_tag.html.haml b/app/views/projects/tags/_tag.html.haml
index 61b357831fd..1072d5bce06 100644
--- a/app/views/projects/tags/_tag.html.haml
+++ b/app/views/projects/tags/_tag.html.haml
@@ -2,7 +2,7 @@
- release = @releases.find { |release| release.tag == tag.name }
- commit_status = @tag_pipeline_statuses[tag.name] unless @tag_pipeline_statuses.nil?
-%li.flex-row.allow-wrap.js-tag-list
+%li.flex-row.js-tag-list{ class: "gl-white-space-normal!" }
.row-main-content
= sprite_icon('tag')
= link_to tag.name, project_tag_path(@project, tag.name), class: 'item-title ref-name'
diff --git a/app/views/projects/tree/_tree_header.html.haml b/app/views/projects/tree/_tree_header.html.haml
index 6d33fbb535e..340f9811f9a 100644
--- a/app/views/projects/tree/_tree_header.html.haml
+++ b/app/views/projects/tree/_tree_header.html.haml
@@ -7,7 +7,7 @@
.tree-controls
.d-block.d-sm-flex.flex-wrap.align-items-start.gl-children-ml-sm-3<
= render_if_exists 'projects/tree/lock_link'
- #js-tree-history-link.d-inline-block{ data: { history_link: project_commits_path(@project, @ref) } }
+ #js-tree-history-link{ data: { history_link: project_commits_path(@project, @ref) } }
= render 'projects/find_file_link'
= render 'shared/web_ide_button', blob: nil
diff --git a/app/views/projects/update.js.haml b/app/views/projects/update.js.haml
deleted file mode 100644
index c5eecc900b2..00000000000
--- a/app/views/projects/update.js.haml
+++ /dev/null
@@ -1,10 +0,0 @@
-- if @project.valid?
- :plain
- location.href = "#{edit_project_path(@project, anchor: params[:update_section])}";
- location.reload();
-- else
- :plain
- $(".flash-container").html("#{escape_javascript(render('errors'))}");
- $('.save-project-loader').hide();
- $('.project-edit-container').show();
- $('.edit-project .js-btn-success-general-project-settings').enable();
diff --git a/app/views/shared/_confirm_fork_modal.html.haml b/app/views/shared/_confirm_fork_modal.html.haml
index 1390d821899..b692dffce37 100644
--- a/app/views/shared/_confirm_fork_modal.html.haml
+++ b/app/views/shared/_confirm_fork_modal.html.haml
@@ -8,5 +8,5 @@
.modal-body.p-3
%p= _("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.") % { tag_start: '', tag_end: ''}
.modal-footer
- = link_to _('Cancel'), '#', class: "btn btn-cancel", "data-dismiss" => "modal"
- = link_to _('Fork project'), fork_path, class: 'btn btn-success', data: { qa_selector: 'fork_project_button' }, method: :post
+ = link_to _('Cancel'), '#', class: "gl-button btn btn-default btn-cancel", "data-dismiss" => "modal"
+ = link_to _('Fork project'), fork_path, class: 'gl-button btn btn-confirm', data: { qa_selector: 'fork_project_button' }, method: :post
diff --git a/app/views/shared/_group_form.html.haml b/app/views/shared/_group_form.html.haml
index c3fac5cd464..eea0c5f37de 100644
--- a/app/views/shared/_group_form.html.haml
+++ b/app/views/shared/_group_form.html.haml
@@ -39,7 +39,7 @@
.gl-alert-body
= _('Changing group URL can have unintended side effects.')
= succeed '.' do
- = link_to _('Learn more'), help_page_path('user/group/index', anchor: 'changing-a-groups-path'), target: '_blank', class: 'gl-link'
+ = link_to _('Learn more'), help_page_path('user/group/index', anchor: 'change-a-groups-path'), target: '_blank', class: 'gl-link'
- if @group.persisted?
.row
diff --git a/app/views/shared/_mobile_clone_panel.html.haml b/app/views/shared/_mobile_clone_panel.html.haml
index 2854b115506..3edfd502f13 100644
--- a/app/views/shared/_mobile_clone_panel.html.haml
+++ b/app/views/shared/_mobile_clone_panel.html.haml
@@ -3,8 +3,8 @@
- http_copy_label = _('Copy %{http_label} clone URL') % { http_label: gitlab_config.protocol.upcase }
.btn-group.mobile-git-clone.js-mobile-git-clone.btn-block
- = clipboard_button(button_text: default_clone_label, text: default_url_to_repo(project), hide_button_icon: true, class: "btn-primary flex-fill bold justify-content-center input-group-text clone-dropdown-btn js-clone-dropdown-label")
- %button.btn.btn-primary.dropdown-toggle.js-dropdown-toggle.flex-grow-0.d-flex-center.w-auto.ml-0{ type: "button", data: { toggle: "dropdown" } }
+ = clipboard_button(button_text: default_clone_label, text: default_url_to_repo(project), hide_button_icon: true, class: "gl-button btn btn-confirm flex-fill input-group-text clone-dropdown-btn js-clone-dropdown-label")
+ %button.gl-button.btn.btn-confirm.btn-icon.dropdown-toggle.js-dropdown-toggle.flex-grow-0.d-flex-center.w-auto.ml-0{ type: "button", data: { toggle: "dropdown" } }
= sprite_icon("chevron-down", css_class: "dropdown-btn-icon icon")
%ul.dropdown-menu.dropdown-menu-selectable.dropdown-menu-right.clone-options-dropdown{ data: { dropdown: true } }
- if ssh_enabled?
diff --git a/app/views/shared/_new_commit_form.html.haml b/app/views/shared/_new_commit_form.html.haml
index 62ba89e2576..5641c67e462 100644
--- a/app/views/shared/_new_commit_form.html.haml
+++ b/app/views/shared/_new_commit_form.html.haml
@@ -3,8 +3,11 @@
= render 'shared/commit_message_container', placeholder: placeholder
-- if @project.empty_repo?
- = hidden_field_tag 'branch_name', @ref
+- if project.empty_repo?
+ - ref = local_assigns[:ref] || @ref
+ - branch_name_class = project.empty_repo_upload_experiment? ? 'js-branch-name' : nil
+
+ = hidden_field_tag 'branch_name', ref, class: branch_name_class
- else
- if can?(current_user, :push_code, @project)
.form-group.row.branch
diff --git a/app/views/shared/_new_project_item_select.html.haml b/app/views/shared/_new_project_item_select.html.haml
index b327b6f7ee8..3817ff8a56d 100644
--- a/app/views/shared/_new_project_item_select.html.haml
+++ b/app/views/shared/_new_project_item_select.html.haml
@@ -1,7 +1,7 @@
- if any_projects?(@projects)
.project-item-select-holder.btn-group.gl-ml-auto.gl-mr-auto.gl-py-3.gl-relative.gl-display-flex.gl-overflow-hidden
- %a.btn.gl-button.btn-success.new-project-item-link.block-truncated.qa-new-project-item-link{ href: '', data: { label: local_assigns[:label], type: local_assigns[:type] }, class: "gl-m-0!" }
+ %a.btn.gl-button.btn-confirm.new-project-item-link.block-truncated.qa-new-project-item-link{ href: '', data: { label: local_assigns[:label], type: local_assigns[:type] }, class: "gl-m-0!" }
= loading_icon(color: 'light')
= project_select_tag :project_path, class: "project-item-select gl-absolute! gl-visibility-hidden", data: { include_groups: local_assigns[:include_groups], order_by: 'last_activity_at', relative_path: local_assigns[:path], with_shared: local_assigns[:with_shared], include_projects_in_subgroups: local_assigns[:include_projects_in_subgroups] }, with_feature_enabled: local_assigns[:with_feature_enabled]
- %button.btn.dropdown-toggle.btn-success.btn-md.gl-button.gl-dropdown-toggle.dropdown-toggle-split.new-project-item-select-button.qa-new-project-item-select-button.gl-p-0.gl-w-100{ class: "gl-m-0!", 'aria-label': _('Toggle project select') }
+ %button.btn.dropdown-toggle.btn-confirm.btn-md.gl-button.gl-dropdown-toggle.dropdown-toggle-split.new-project-item-select-button.qa-new-project-item-select-button.gl-p-0.gl-w-100{ class: "gl-m-0!", 'aria-label': _('Toggle project select') }
= sprite_icon('chevron-down')
diff --git a/app/views/shared/_recaptcha_form.html.haml b/app/views/shared/_recaptcha_form.html.haml
index aa9e9a34c90..f524747dea0 100644
--- a/app/views/shared/_recaptcha_form.html.haml
+++ b/app/views/shared/_recaptcha_form.html.haml
@@ -20,4 +20,4 @@
- if has_submit
.row-content-block.footer-block
- = f.submit _("Submit %{humanized_resource_name}") % { humanized_resource_name: humanized_resource_name }, class: 'btn btn-success'
+ = f.submit _("Submit %{humanized_resource_name}") % { humanized_resource_name: humanized_resource_name }, class: 'gl-button btn btn-confirm'
diff --git a/app/views/shared/access_tokens/_form.html.haml b/app/views/shared/access_tokens/_form.html.haml
index 089643f4748..9709ad8428e 100644
--- a/app/views/shared/access_tokens/_form.html.haml
+++ b/app/views/shared/access_tokens/_form.html.haml
@@ -29,5 +29,9 @@
= f.label :scopes, _('Scopes'), class: 'label-bold'
= render 'shared/tokens/scopes_form', prefix: prefix, token: token, scopes: scopes
+ - if prefix == :personal_access_token && Feature.enabled?(:personal_access_tokens_scoped_to_projects, current_user)
+ .js-access-tokens-projects
+ %input{ type: 'hidden', name: 'temporary-name', id: 'temporary-id' }
+
.gl-mt-3
- = f.submit _('Create %{type}') % { type: type }, class: 'gl-button btn btn-success', data: { qa_selector: 'create_token_button' }
+ = f.submit _('Create %{type}') % { type: type }, class: 'gl-button btn btn-confirm', data: { qa_selector: 'create_token_button' }
diff --git a/app/views/shared/boards/_show.html.haml b/app/views/shared/boards/_show.html.haml
index ababbdc7eb9..8c0893adaaa 100644
--- a/app/views/shared/boards/_show.html.haml
+++ b/app/views/shared/boards/_show.html.haml
@@ -2,7 +2,7 @@
- group = local_assigns.fetch(:group, false)
-# TODO: Move group_id and can_admin_list to the board store
See: https://gitlab.com/gitlab-org/gitlab/-/issues/213082
-- can_admin_list = can?(current_user, :admin_list, current_board_parent) == true
+- can_admin_list = can?(current_user, :admin_issue_board_list, current_board_parent) == true
- @no_breadcrumb_container = true
- @no_container = true
- @content_class = "issue-boards-content js-focus-mode-board"
diff --git a/app/views/shared/boards/_switcher.html.haml b/app/views/shared/boards/_switcher.html.haml
index 58e877f20fe..18e0ca20cf7 100644
--- a/app/views/shared/boards/_switcher.html.haml
+++ b/app/views/shared/boards/_switcher.html.haml
@@ -7,7 +7,7 @@
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_board, parent).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,
labels_path: labels_filter_path_with_defaults(only_group_labels: true, include_descendant_groups: true),
labels_web_url: parent.is_a?(Project) ? project_labels_path(@project) : group_labels_path(@group),
diff --git a/app/views/shared/boards/components/_sidebar.html.haml b/app/views/shared/boards/components/_sidebar.html.haml
index 3daa13fb488..59dd571604b 100644
--- a/app/views/shared/boards/components/_sidebar.html.haml
+++ b/app/views/shared/boards/components/_sidebar.html.haml
@@ -25,7 +25,3 @@
= render "shared/boards/components/sidebar/labels"
= render_if_exists "shared/boards/components/sidebar/weight"
= render "shared/boards/components/sidebar/notifications"
- %remove-btn{ ":issue" => "issue",
- ":issue-update" => "issue.sidebarInfoEndpoint",
- ":list" => "list",
- "v-if" => "canRemove" }
diff --git a/app/views/shared/deploy_keys/_index.html.haml b/app/views/shared/deploy_keys/_index.html.haml
index 5d9c2cd25b4..be6fe94e497 100644
--- a/app/views/shared/deploy_keys/_index.html.haml
+++ b/app/views/shared/deploy_keys/_index.html.haml
@@ -1,8 +1,8 @@
- expanded = expanded_by_default?
%section.qa-deploy-keys-settings.settings.no-animate#js-deploy-keys-settings{ class: ('expanded' if expanded), data: { qa_selector: 'deploy_keys_settings_content' } }
.settings-header
- %h4= _('Deploy keys')
- %button.btn.js-settings-toggle{ type: 'button' }
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only= _('Deploy keys')
+ %button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
= expanded ? 'Collapse' : 'Expand'
%p
- link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/project/deploy_keys/index') }
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 bad25086d9f..25357ccdc65 100644
--- a/app/views/shared/deploy_keys/_project_group_form.html.haml
+++ b/app/views/shared/deploy_keys/_project_group_form.html.haml
@@ -21,4 +21,4 @@
= _('Allow this key to push to this repository')
.form-group.row
- = f.submit _("Add key"), class: "btn-success btn"
+ = f.submit _("Add key"), class: "btn gl-button btn-confirm"
diff --git a/app/views/shared/deploy_tokens/_form.html.haml b/app/views/shared/deploy_tokens/_form.html.haml
index 052d68baf71..2ddfcf43756 100644
--- a/app/views/shared/deploy_tokens/_form.html.haml
+++ b/app/views/shared/deploy_tokens/_form.html.haml
@@ -48,4 +48,4 @@
.text-secondary= s_('DeployTokens|Allows write access to the package registry.')
.gl-mt-3
- = f.submit s_('DeployTokens|Create deploy token'), class: 'btn gl-button btn-success qa-create-deploy-token'
+ = f.submit s_('DeployTokens|Create deploy token'), class: 'btn gl-button btn-confirm qa-create-deploy-token'
diff --git a/app/views/shared/deploy_tokens/_index.html.haml b/app/views/shared/deploy_tokens/_index.html.haml
index e64b8634cf5..9d1a24d4c24 100644
--- a/app/views/shared/deploy_tokens/_index.html.haml
+++ b/app/views/shared/deploy_tokens/_index.html.haml
@@ -2,8 +2,8 @@
%section.qa-deploy-tokens-settings.settings.no-animate#js-deploy-tokens{ class: ('expanded' if expanded), data: { qa_selector: 'deploy_tokens_settings_content' } }
.settings-header
- %h4= s_('DeployTokens|Deploy tokens')
- %button.gl-button.btn.js-settings-toggle.qa-expand-deploy-keys{ type: 'button' }
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only= s_('DeployTokens|Deploy tokens')
+ %button.btn.gl-button.btn-default.js-settings-toggle.qa-expand-deploy-keys{ type: 'button' }
= expanded ? 'Collapse' : 'Expand'
%p
= description
diff --git a/app/views/shared/empty_states/_deploy_keys.html.haml b/app/views/shared/empty_states/_deploy_keys.html.haml
index 6fca64d805b..6c615de9c56 100644
--- a/app/views/shared/empty_states/_deploy_keys.html.haml
+++ b/app/views/shared/empty_states/_deploy_keys.html.haml
@@ -6,4 +6,4 @@
.text-content.gl-mx-auto.gl-my-0.gl-p-5
%h4.h4= _('Deploy Keys')
%p= _('Deploy keys grant read/write access to all repositories in your instance')
- = link_to _('New deploy key'), new_admin_deploy_key_path, class: 'btn btn-success btn-md gl-button'
+ = link_to _('New deploy key'), new_admin_deploy_key_path, class: 'gl-button btn btn-confirm btn-md'
diff --git a/app/views/shared/empty_states/_issues.html.haml b/app/views/shared/empty_states/_issues.html.haml
index 997bc7b8a98..ff42765f77a 100644
--- a/app/views/shared/empty_states/_issues.html.haml
+++ b/app/views/shared/empty_states/_issues.html.haml
@@ -20,7 +20,7 @@
= _("To widen your search, change or remove filters above")
- if show_new_issue_link?(@project)
.text-center
- = link_to _("New issue"), new_project_issue_path(@project), class: "btn btn-success"
+ = link_to _("New issue"), new_project_issue_path(@project), class: "gl-button btn btn-confirm"
- elsif is_opened_state && opened_issues_count == 0 && closed_issues_count > 0
%h4.text-center
= _("There are no open issues")
@@ -28,7 +28,7 @@
= _("To keep this project going, create a new issue")
- if show_new_issue_link?(@project)
.text-center
- = link_to _("New issue"), new_project_issue_path(@project), class: "btn btn-success"
+ = link_to _("New issue"), new_project_issue_path(@project), class: "gl-button btn btn-confirm"
- elsif is_closed_state && opened_issues_count > 0 && closed_issues_count == 0
%h4.text-center
= _("There are no closed issues")
@@ -42,7 +42,7 @@
- if project_select_button
= render 'shared/new_project_item_select', path: 'issues/new', label: _('New issue'), type: :issues, with_feature_enabled: 'issues'
- else
- = link_to _('New issue'), button_path, class: 'btn gl-button btn-success', id: 'new_issue_link'
+ = link_to _('New issue'), button_path, class: 'gl-button btn btn-confirm', id: 'new_issue_link'
- if show_import_button
= render 'projects/issues/import_csv/button', type: :text
@@ -62,7 +62,7 @@
%p
= _("The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project.")
.text-center
- = link_to _('Register / Sign In'), new_user_session_path, class: 'btn btn-success'
+ = link_to _('Register / Sign In'), new_user_session_path, class: 'gl-button btn btn-confirm'
- if show_import_button
= render 'projects/issues/import_csv/modal'
diff --git a/app/views/shared/empty_states/_labels.html.haml b/app/views/shared/empty_states/_labels.html.haml
index a739103641e..4e5e04ba4d4 100644
--- a/app/views/shared/empty_states/_labels.html.haml
+++ b/app/views/shared/empty_states/_labels.html.haml
@@ -8,7 +8,7 @@
%p= _("You can also star a label to make it a priority label.")
.text-center
- if can?(current_user, :admin_label, @project)
- = link_to _('New label'), new_project_label_path(@project), class: 'btn btn-success qa-label-create-new', title: _('New label'), id: 'new_label_link'
- = link_to _('Generate a default set of labels'), generate_project_labels_path(@project), method: :post, class: 'btn btn-success btn-inverted', title: _('Generate a default set of labels'), id: 'generate_labels_link'
+ = link_to _('New label'), new_project_label_path(@project), class: 'btn gl-button btn-confirm qa-label-create-new', title: _('New label'), id: 'new_label_link'
+ = link_to _('Generate a default set of labels'), generate_project_labels_path(@project), method: :post, class: 'btn gl-button btn-confirm-secondary', title: _('Generate a default set of labels'), id: 'generate_labels_link'
- if can?(current_user, :admin_label, @group)
- = link_to _('New label'), new_group_label_path(@group), class: 'btn btn-success', title: _('New label'), id: 'new_label_link'
+ = link_to _('New label'), new_group_label_path(@group), class: 'btn gl-button btn-confirm', title: _('New label'), id: 'new_label_link'
diff --git a/app/views/shared/empty_states/_merge_requests.html.haml b/app/views/shared/empty_states/_merge_requests.html.haml
index 837c3afc796..879447f16ae 100644
--- a/app/views/shared/empty_states/_merge_requests.html.haml
+++ b/app/views/shared/empty_states/_merge_requests.html.haml
@@ -20,7 +20,7 @@
= _("To widen your search, change or remove filters above")
.text-center
- if can_create_merge_request
- = link_to _("New merge request"), project_new_merge_request_path(@project), class: "btn btn-success", title: _("New merge request")
+ = link_to _("New merge request"), project_new_merge_request_path(@project), class: "gl-button btn btn-confirm", title: _("New merge request")
- elsif is_opened_state && opened_merged_count == 0 && closed_merged_count > 0
%h4.text-center
= _("There are no open merge requests")
@@ -28,7 +28,7 @@
= _("To keep this project going, create a new merge request")
.text-center
- if can_create_merge_request
- = link_to _("New merge request"), project_new_merge_request_path(@project), class: "btn btn-success", title: _("New merge request")
+ = link_to _("New merge request"), project_new_merge_request_path(@project), class: "gl-button btn btn-confirm", title: _("New merge request")
- elsif is_closed_state && opened_merged_count > 0 && closed_merged_count == 0
%h4.text-center
= _("There are no closed merge requests")
@@ -42,4 +42,4 @@
- if project_select_button
= render 'shared/new_project_item_select', path: 'merge_requests/new', label: _('New merge request'), type: :merge_requests, with_feature_enabled: 'merge_requests'
- else
- = link_to _('New merge request'), button_path, class: 'btn btn-success', title: _('New merge request'), id: 'new_merge_request_link'
+ = link_to _('New merge request'), button_path, class: 'gl-button btn btn-confirm', title: _('New merge request'), id: 'new_merge_request_link'
diff --git a/app/views/shared/empty_states/_profile_tabs.html.haml b/app/views/shared/empty_states/_profile_tabs.html.haml
index abcf9740200..42a845846d1 100644
--- a/app/views/shared/empty_states/_profile_tabs.html.haml
+++ b/app/views/shared/empty_states/_profile_tabs.html.haml
@@ -13,9 +13,9 @@
%p= current_user_empty_message_description
- if secondary_button_link.present?
- = link_to secondary_button_label, secondary_button_link, class: 'gl-button btn btn-success btn-inverted'
+ = link_to secondary_button_label, secondary_button_link, class: 'gl-button btn btn-confirm btn-inverted'
- if primary_button_link.present?
- = link_to primary_button_label, primary_button_link, class: 'gl-button btn btn-success'
+ = link_to primary_button_label, primary_button_link, class: 'gl-button btn btn-confirm'
- else
%h5= visitor_empty_message
diff --git a/app/views/shared/empty_states/_snippets.html.haml b/app/views/shared/empty_states/_snippets.html.haml
index 105efcc3c88..20ca7954479 100644
--- a/app/views/shared/empty_states/_snippets.html.haml
+++ b/app/views/shared/empty_states/_snippets.html.haml
@@ -12,7 +12,7 @@
= s_('SnippetsEmptyState|Store, share, and embed small pieces of code and text.')
.mt-2<
- if button_path
- = link_to s_('SnippetsEmptyState|New snippet'), button_path, class: 'btn gl-button btn-success', title: s_('SnippetsEmptyState|New snippet'), id: 'new_snippet_link', data: { qa_selector: 'create_first_snippet_link' }
+ = link_to s_('SnippetsEmptyState|New snippet'), button_path, class: 'btn gl-button btn-confirm', title: s_('SnippetsEmptyState|New snippet'), id: 'new_snippet_link', data: { qa_selector: 'create_first_snippet_link' }
= link_to s_('SnippetsEmptyState|Documentation'), help_page_path('user/snippets.md'), class: 'btn gl-button btn-default', title: s_('SnippetsEmptyState|Documentation')
- else
%h4.text-center= s_('SnippetsEmptyState|There are no snippets to show.')
diff --git a/app/views/shared/empty_states/_wikis.html.haml b/app/views/shared/empty_states/_wikis.html.haml
index 4150406a4ea..0bddffa881a 100644
--- a/app/views/shared/empty_states/_wikis.html.haml
+++ b/app/views/shared/empty_states/_wikis.html.haml
@@ -3,7 +3,7 @@
- if can?(current_user, :create_wiki, @wiki.container)
- create_path = wiki_page_path(@wiki, params[:id], view: 'create')
- - create_link = link_to s_('WikiEmpty|Create your first page'), create_path, class: 'btn gl-button btn-success qa-create-first-page-link', title: s_('WikiEmpty|Create your first page')
+ - create_link = link_to s_('WikiEmpty|Create your first page'), create_path, class: 'btn gl-button btn-confirm qa-create-first-page-link', title: s_('WikiEmpty|Create your first page')
= render layout: layout_path, locals: { image_path: 'illustrations/wiki_login_empty.svg' } do
%h4.text-left
@@ -18,7 +18,7 @@
- elsif @project && can?(current_user, :read_issue, @project)
- issues_link = link_to s_('WikiEmptyIssueMessage|issue tracker'), project_issues_path(@project)
- - new_issue_link = link_to s_('WikiEmpty|Suggest wiki improvement'), new_project_issue_path(@project), class: 'btn gl-button btn-success', title: s_('WikiEmptyIssueMessage|Suggest wiki improvement')
+ - new_issue_link = link_to s_('WikiEmpty|Suggest wiki improvement'), new_project_issue_path(@project), class: 'btn gl-button btn-confirm', title: s_('WikiEmptyIssueMessage|Suggest wiki improvement')
= render layout: layout_path, locals: { image_path: 'illustrations/wiki_logout_empty.svg' } do
%h4
diff --git a/app/views/shared/form_elements/_apply_template_warning.html.haml b/app/views/shared/form_elements/_apply_template_warning.html.haml
index 73be0c741dc..61c0e5c42f4 100644
--- a/app/views/shared/form_elements/_apply_template_warning.html.haml
+++ b/app/views/shared/form_elements/_apply_template_warning.html.haml
@@ -7,7 +7,7 @@
%p
= _("Applying a template will replace the existing issue description. Any changes you have made will be lost.")
- %button.js-override-template.btn.btn-warning.mr-2{ type: 'button' }
+ %button.js-override-template.btn.gl-button.btn-confirm.mr-2{ type: 'button' }
= _("Apply template")
- %button.js-close-btn.js-cancel-btn.btn.btn-inverted{ type: 'button' }
+ %button.js-close-btn.js-cancel-btn.btn.gl-button.btn-default{ type: 'button' }
= _("Cancel")
diff --git a/app/views/shared/gitpod/_enable_gitpod_modal.html.haml b/app/views/shared/gitpod/_enable_gitpod_modal.html.haml
index a6bd1d10e43..dacfbf63db8 100644
--- a/app/views/shared/gitpod/_enable_gitpod_modal.html.haml
+++ b/app/views/shared/gitpod/_enable_gitpod_modal.html.haml
@@ -8,5 +8,5 @@
.modal-body.p-3
%p= (_("To use Gitpod you must first enable the feature in the integrations section of your %{user_prefs}.") % { user_prefs: link_to(_('user preferences'), profile_preferences_path(anchor: 'gitpod')) }).html_safe
.modal-footer
- = link_to _('Cancel'), '#', class: "btn btn-cancel", "data-dismiss" => "modal"
- = link_to _('Enable Gitpod'), profile_path(user: { gitpod_enabled: true}), class: 'btn btn-success', method: :put
+ = link_to _('Cancel'), '#', class: "gl-button btn btn-default btn-cancel", "data-dismiss" => "modal"
+ = link_to _('Enable Gitpod'), profile_path(user: { gitpod_enabled: true}), class: 'gl-button btn btn-confirm', method: :put
diff --git a/app/views/shared/groups/_empty_state.html.haml b/app/views/shared/groups/_empty_state.html.haml
index 1d3bc1d6959..506954c53ca 100644
--- a/app/views/shared/groups/_empty_state.html.haml
+++ b/app/views/shared/groups/_empty_state.html.haml
@@ -9,5 +9,5 @@
- if invite_group_members?(@group)
= link_to _('Invite your team'),
group_group_members_path(@group),
- class: 'gl-button btn btn-success-secondary',
+ class: 'gl-button btn btn-confirm-secondary',
data: { track_event: 'click_invite_team_group_empty_state', track_label: 'invite_team_group_empty_state' }
diff --git a/app/views/shared/issuable/_form.html.haml b/app/views/shared/issuable/_form.html.haml
index 2a91ffbdbaa..24005188d0b 100644
--- a/app/views/shared/issuable/_form.html.haml
+++ b/app/views/shared/issuable/_form.html.haml
@@ -64,17 +64,17 @@
.row-content-block{ class: (is_footer ? "footer-block" : "middle-block") }
.float-right
- if issuable.new_record?
- = link_to 'Cancel', polymorphic_path([@project, issuable.class]), class: 'gl-button btn btn-cancel'
+ = link_to _('Cancel'), polymorphic_path([@project, issuable.class]), class: 'gl-button btn btn-cancel'
- else
- if can?(current_user, :"destroy_#{issuable.to_ability_name}", @project)
= link_to 'Delete', polymorphic_path([@project, issuable], params: { destroy_confirm: true }), data: { confirm: "#{issuable.human_class_name} will be removed! Are you sure?" }, method: :delete, class: 'btn btn-danger btn-grouped'
- = link_to 'Cancel', polymorphic_path([@project, issuable]), class: 'gl-button btn btn-grouped btn-cancel'
+ = link_to _('Cancel'), polymorphic_path([@project, issuable]), class: 'gl-button btn btn-grouped btn-default btn-cancel'
%span.gl-mr-3
- if issuable.new_record?
- = form.submit "Submit #{issuable.class.model_name.human.downcase}", class: 'gl-button btn btn-success qa-issuable-create-button'
+ = form.submit "Submit #{issuable.class.model_name.human.downcase}", class: 'gl-button btn btn-confirm qa-issuable-create-button'
- else
- = form.submit 'Save changes', class: 'gl-button btn btn-success'
+ = form.submit 'Save changes', class: 'gl-button btn btn-confirm'
- if !issuable.persisted? && !issuable.project.empty_repo? && (guide_url = issuable.project.present.contribution_guide_path)
.inline.gl-mt-3
diff --git a/app/views/shared/issuable/_label_page_create.html.haml b/app/views/shared/issuable/_label_page_create.html.haml
index 005b76180fd..cf7e6cf8365 100644
--- a/app/views/shared/issuable/_label_page_create.html.haml
+++ b/app/views/shared/issuable/_label_page_create.html.haml
@@ -19,7 +19,7 @@
%input.js-add-list{ type: "checkbox", name: "add_list", checked: add_list }
%span= _('Add list')
.clearfix
- %button.gl-button.btn.btn-success.float-left.js-new-label-btn{ type: "button" }
+ %button.gl-button.btn.btn-confirm.float-left.js-new-label-btn{ type: "button" }
= _('Create')
%button.gl-button.btn.btn-default.float-right.js-cancel-label-btn{ type: "button" }
= _('Cancel')
diff --git a/app/views/shared/issuable/_search_bar.html.haml b/app/views/shared/issuable/_search_bar.html.haml
index d1e74cc771e..f5b2868aa6c 100644
--- a/app/views/shared/issuable/_search_bar.html.haml
+++ b/app/views/shared/issuable/_search_bar.html.haml
@@ -5,7 +5,10 @@
- placeholder = local_assigns[:placeholder] || _('Search or filter results...')
- is_not_boards_modal_or_productivity_analytics = type != :boards_modal && type != :productivity_analytics
- block_css_class = is_not_boards_modal_or_productivity_analytics ? 'row-content-block second-block' : ''
-- user_can_admin_list = board && can?(current_user, :admin_list, board.resource_parent)
+- if board && board.to_type == "EpicBoard"
+ - 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{ class: ("w-100" if type == :boards_modal) }
.issues-details-filters.filtered-search-block.d-flex.flex-column.flex-lg-row{ class: block_css_class, "v-pre" => type == :boards_modal }
@@ -18,191 +21,194 @@
- if @can_bulk_update
.check-all-holder.d-none.d-sm-block.hidden
= check_box_tag "check-all-issues", nil, false, class: "check-all-issues left"
- .issues-other-filters.filtered-search-wrapper.d-flex.flex-column.flex-md-row
- .filtered-search-box
- - if type != :boards_modal && 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: "btn 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.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.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.btn.btn-link{ type: 'button' }
- = _('None')
- %li.filter-dropdown-item{ data: { value: 'Any' } }
- %button.btn.btn-link{ type: 'button' }
- = _('Any')
- %li.divider.droplab-item-ignore
+ - if Feature.enabled?(:boards_filtered_search, @group)
+ #js-board-filtered-search
+ - else
+ .issues-other-filters.filtered-search-wrapper.d-flex.flex-column.flex-md-row
+ .filtered-search-box
+ - if type != :boards_modal && 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: "btn 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.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.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: 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.btn.btn-link{ type: 'button' }
- = _('None')
- %li.filter-dropdown-item{ data: { value: 'Any' } }
- %button.btn.btn-link{ type: 'button' }
- = _('Any')
- %li.divider.droplab-item-ignore
- - if current_user
+ 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.btn.btn-link{ type: 'button' }
+ = _('None')
+ %li.filter-dropdown-item{ data: { value: 'Any' } }
+ %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 } }
+ = 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.btn.btn-link{ type: 'button' }
+ = _('None')
+ %li.filter-dropdown-item{ data: { value: 'Any' } }
+ %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 } }
= 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.btn.btn-link{ type: 'button' }
- = _('None')
- %li.filter-dropdown-item{ data: { value: 'Any' } }
- %button.btn.btn-link{ type: 'button' }
- = _('Any')
- %li.filter-dropdown-item{ data: { value: 'Upcoming' } }
- %button.btn.btn-link{ type: 'button' }
- = _('Upcoming')
- %li.filter-dropdown-item{ data: { value: 'Started' } }
- %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.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.btn.btn-link{ type: 'button' }
- = _('None')
- %li.filter-dropdown-item{ data: { value: 'Any' } }
- %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.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.btn.btn-link{ type: 'button' }
- = _('None')
- %li.filter-dropdown-item{ data: { value: 'Any' } }
- %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.btn.btn-link{ type: 'button' }
- %span.dropdown-label-box{ style: 'background: {{color}}' }
- %span.label-title.js-data-value
+ 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.btn.btn-link{ type: 'button' }
+ = _('None')
+ %li.filter-dropdown-item{ data: { value: 'Any' } }
+ %button.btn.btn-link{ type: 'button' }
+ = _('Any')
+ %li.filter-dropdown-item{ data: { value: 'Upcoming' } }
+ %button.btn.btn-link{ type: 'button' }
+ = _('Upcoming')
+ %li.filter-dropdown-item{ data: { value: 'Started' } }
+ %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.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.btn.btn-link{ type: 'button' }
+ = _('None')
+ %li.filter-dropdown-item{ data: { value: 'Any' } }
+ %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.btn.btn-link.js-data-value{ type: 'button' }
{{title}}
- #js-dropdown-my-reaction.filtered-search-input-dropdown-menu.dropdown-menu
- %ul{ data: { dropdown: true } }
- %li.filter-dropdown-item{ data: { value: 'None' } }
- %button.btn.btn-link{ type: 'button' }
- = _('None')
- %li.filter-dropdown-item{ data: { value: 'Any' } }
- %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.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.btn.btn-link{ type: 'button' }
- = _('Yes')
- %li.filter-dropdown-item{ data: { value: 'no', capitalize: true } }
- %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.btn.btn-link{ type: 'button' }
- = _('Yes')
- %li.filter-dropdown-item{ data: { value: 'no', capitalize: true } }
- %button.btn.btn-link{ type: 'button' }
- = _('No')
- - unless disable_target_branch
- #js-dropdown-target-branch.filtered-search-input-dropdown-menu.dropdown-menu
+ #js-dropdown-label.filtered-search-input-dropdown-menu.dropdown-menu
+ %ul{ data: { dropdown: true } }
+ %li.filter-dropdown-item{ data: { value: 'None' } }
+ %button.btn.btn-link{ type: 'button' }
+ = _('None')
+ %li.filter-dropdown-item{ data: { value: 'Any' } }
+ %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.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.btn.btn-link{ type: 'button' }
+ = _('None')
+ %li.filter-dropdown-item{ data: { value: 'Any' } }
+ %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.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.btn.btn-link{ type: 'button' }
+ = _('Yes')
+ %li.filter-dropdown-item{ data: { value: 'no', capitalize: true } }
+ %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.btn.btn-link{ type: 'button' }
+ = _('Yes')
+ %li.filter-dropdown-item{ data: { value: 'no', capitalize: true } }
+ %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.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.btn.btn-link.js-data-value.monospace
+ %button.btn.btn-link.js-data-value{ type: 'button' }
{{title}}
- #js-dropdown-environment.filtered-search-input-dropdown-menu.dropdown-menu
- %ul.filter-dropdown{ data: { dynamic: true, dropdown: true } }
- %li.filter-dropdown-item
- %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.d-flex.flex-column.flex-md-row
- 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, has_scope: board.scoped? } }
+ .js-board-config{ data: { can_admin_list: user_can_admin_list.to_s, has_scope: board.scoped?.to_s } }
- if user_can_admin_list
- - if Feature.enabled?(:board_new_list, board.resource_parent, default_enabled: :yaml)
+ - if Feature.enabled?(:board_new_list, board.resource_parent, default_enabled: :yaml) || board.to_type == "EpicBoard"
.js-create-column-trigger{ data: board_list_data }
- else
= render 'shared/issuable/board_create_list_dropdown', board: board
- if @project
- #js-add-issues-btn{ data: { can_admin_list: can?(current_user, :admin_list, @project) } }
+ #js-add-issues-btn{ data: { can_admin_list: can?(current_user, :admin_issue_board_list, @project) } }
#js-toggle-focus-btn
- elsif is_not_boards_modal_or_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 f26f4adc19a..e7892a2bed7 100644
--- a/app/views/shared/issuable/_sidebar.html.haml
+++ b/app/views/shared/issuable/_sidebar.html.haml
@@ -34,7 +34,7 @@
- if issuable_sidebar[:supports_milestone]
- milestone = issuable_sidebar[:milestone] || {}
- .block.milestone{ data: { qa_selector: 'milestone_block' } }
+ .block.milestone{ class: 'gl-border-b-0!', data: { qa_selector: 'milestone_block' } }
.sidebar-collapsed-icon.has-tooltip{ title: sidebar_milestone_tooltip_label(milestone), data: { container: 'body', html: 'true', placement: 'left', boundary: 'viewport' } }
= sprite_icon('clock')
%span.milestone-title.collapse-truncated-title
@@ -58,8 +58,10 @@
.selectbox.hide-collapsed
= f.hidden_field 'milestone_id', value: milestone[:id], id: nil
= dropdown_tag('Milestone', options: { title: _('Assign milestone'), toggle_class: 'js-milestone-select js-extra-options', filter: true, dropdown_class: 'dropdown-menu-selectable', placeholder: _('Search milestones'), data: { show_no: true, field_name: "#{issuable_type}[milestone_id]", project_id: issuable_sidebar[:project_id], issuable_id: issuable_sidebar[:id], ability_name: issuable_type, issue_update: issuable_sidebar[:issuable_json_path], use_id: true, default_no: true, selected: milestone[:title], null_default: true, display: 'static' }})
- - if @project.group.present? && issuable_sidebar[:supports_iterations]
- = render_if_exists 'shared/issuable/iteration_select', can_edit: can_edit_issuable.to_s, group_path: @project.group.full_path, project_path: issuable_sidebar[:project_full_path], issue_iid: issuable_sidebar[:iid], issuable_type: issuable_type
+
+ - if @project.group.present? && issuable_sidebar[:supports_iterations]
+ .block{ class: 'gl-pt-0!' }
+ = render_if_exists 'shared/issuable/iteration_select', can_edit: can_edit_issuable.to_s, group_path: @project.group.full_path, project_path: issuable_sidebar[:project_full_path], issue_iid: issuable_sidebar[:iid], issuable_type: issuable_type
- if issuable_sidebar[:supports_time_tracking]
#issuable-time-tracker.block
@@ -118,6 +120,8 @@
%script#js-confidential-issue-data{ type: "application/json" }= { is_confidential: issuable_sidebar[:confidential], is_editable: can_edit_issuable }.to_json.html_safe
#js-confidential-entry-point
+ = render_if_exists 'shared/issuable/sidebar_cve_id_request', issuable_sidebar: issuable_sidebar
+
%script#js-lock-issue-data{ type: "application/json" }= { is_locked: !!issuable_sidebar[:discussion_locked], is_editable: can_edit_issuable }.to_json.html_safe
#js-lock-entry-point
@@ -163,7 +167,7 @@
= dropdown_content
= dropdown_loading
= dropdown_footer add_content_class: true do
- %button.gl-button.btn.btn-success.sidebar-move-issue-confirmation-button.js-move-issue-confirmation-button{ type: 'button', disabled: true }
+ %button.gl-button.btn.btn-confirm.sidebar-move-issue-confirmation-button.js-move-issue-confirmation-button{ type: 'button', disabled: true }
= _('Move')
= loading_icon(css_class: 'gl-vertical-align-text-bottom sidebar-move-issue-confirmation-loading-icon')
diff --git a/app/views/shared/issuable/_sidebar_assignees.html.haml b/app/views/shared/issuable/_sidebar_assignees.html.haml
index 2b6920ed80f..26986c913f0 100644
--- a/app/views/shared/issuable/_sidebar_assignees.html.haml
+++ b/app/views/shared/issuable/_sidebar_assignees.html.haml
@@ -43,6 +43,9 @@
- options[:dropdown_class] += ' dropdown-extended-height'
- options[:footer_content] = true
- options[:wrapper_class] = 'js-sidebar-assignee-dropdown'
+ - options[:toggle_class] += ' js-invite-members-track'
+ - data['track-event'] = show_invite_members_track_event
+ - options[:data].merge!(data)
- invite_text = _('Invite Members')
- track_label = 'edit_assignee'
diff --git a/app/views/shared/issuable/_sidebar_reviewers.html.haml b/app/views/shared/issuable/_sidebar_reviewers.html.haml
index 0142c87aeb0..1a8f1a2639f 100644
--- a/app/views/shared/issuable/_sidebar_reviewers.html.haml
+++ b/app/views/shared/issuable/_sidebar_reviewers.html.haml
@@ -39,17 +39,4 @@
- data['max-select'] = dropdown_options[:data][:'max-select'] if dropdown_options[:data][:'max-select']
- options[:data].merge!(data)
- - if experiment_enabled?(:invite_members_version_a) && can_import_members?
- - options[:dropdown_class] += ' dropdown-extended-height'
- - options[:footer_content] = true
- - options[:wrapper_class] = 'js-sidebar-reviewer-dropdown'
-
- = dropdown_tag(title, options: options) do
- %ul.dropdown-footer-list
- %li
- = link_to _('Invite Members'),
- project_project_members_path(@project),
- title: _('Invite Members'),
- data: { 'is-link': true, 'track-event': 'click_invite_members', 'track-label': 'edit_reviewer' }
- - else
- = dropdown_tag(title, options: options)
+ = dropdown_tag(title, options: options)
diff --git a/app/views/shared/issuable/csv_export/_modal.html.haml b/app/views/shared/issuable/csv_export/_modal.html.haml
index 4a4c6b90cd9..59d27ad7019 100644
--- a/app/views/shared/issuable/csv_export/_modal.html.haml
+++ b/app/views/shared/issuable/csv_export/_modal.html.haml
@@ -4,10 +4,8 @@
.modal-dialog
.modal-content{ data: { qa_selector: "export_issuable_modal" } }
.modal-header
- %h3
+ %h4.gl-m-0
= _("Export %{issuable_type}" % { issuable_type: issuable_type.humanize(capitalize: false) })
- .svg-content.import-export-svg-container
- = image_tag 'illustrations/export-import.svg', role: "presentation", class: 'illustration'
%button.close{ type: "button", "data-dismiss": "modal", "aria-label" => _('Close') }
= sprite_icon('close', css_class: 'gl-icon')
.modal-body
@@ -24,6 +22,6 @@
= html_escape(_('The CSV export will be created in the background. Once finished, it will be sent to %{strong_open}%{email}%{strong_close} in an attachment.')) % { email: @current_user.notification_email, strong_open: '<strong>'.html_safe, strong_close: '</strong>'.html_safe }
.modal-footer
- if issuable_type.eql?('merge_requests')
- = link_to _("Export merge requests"), export_csv_project_merge_requests_path(@project, request.query_parameters), method: :post, class: 'btn gl-button btn-success', data: { track_label: "export_merge_requests_csv", track_event: "click_button", track_value: "" }
+ = link_to _("Export merge requests"), export_csv_project_merge_requests_path(@project, request.query_parameters), method: :post, class: 'btn gl-button btn-confirm', data: { track_label: "export_merge_requests_csv", track_event: "click_button", track_value: "" }
- else
- = link_to _('Export issues'), export_csv_project_issues_path(@project, request.query_parameters), method: :post, class: 'btn gl-button btn-success', data: { track_label: "export_issues_csv", track_event: "click_button", track_value: "", qa_selector: "export_issues_button" }
+ = link_to _('Export issues'), export_csv_project_issues_path(@project, request.query_parameters), method: :post, class: 'btn gl-button btn-confirm', data: { track_label: "export_issues_csv", track_event: "click_button", track_value: "", qa_selector: "export_issues_button" }
diff --git a/app/views/shared/labels/_form.html.haml b/app/views/shared/labels/_form.html.haml
index 2df6c3a6afd..604aac9237c 100644
--- a/app/views/shared/labels/_form.html.haml
+++ b/app/views/shared/labels/_form.html.haml
@@ -28,7 +28,7 @@
= render_suggested_colors
.form-actions
- if @label.persisted?
- = f.submit 'Save changes', class: 'btn gl-button btn-success js-save-button'
+ = f.submit 'Save changes', class: 'btn gl-button btn-confirm js-save-button'
- else
- = f.submit 'Create label', class: 'btn gl-button btn-success js-save-button qa-label-create-button'
- = link_to 'Cancel', back_path, class: 'btn gl-button btn-cancel'
+ = f.submit 'Create label', class: 'btn gl-button btn-confirm js-save-button qa-label-create-button'
+ = link_to 'Cancel', back_path, class: 'btn gl-button btn-default btn-cancel'
diff --git a/app/views/shared/labels/_nav.html.haml b/app/views/shared/labels/_nav.html.haml
index 6d1d422f227..a0225e35c90 100644
--- a/app/views/shared/labels/_nav.html.haml
+++ b/app/views/shared/labels/_nav.html.haml
@@ -19,6 +19,6 @@
= sprite_icon('search')
= render 'shared/labels/sort_dropdown'
- if labels_or_filters && can_admin_label && @project
- = link_to _('New label'), new_project_label_path(@project), class: "btn gl-button btn-success qa-label-create-new"
+ = link_to _('New label'), new_project_label_path(@project), class: "btn gl-button btn-confirm qa-label-create-new"
- if labels_or_filters && can_admin_label && @group
- = link_to _('New label'), new_group_label_path(@group), class: "btn gl-button btn-success qa-label-create-new"
+ = link_to _('New label'), new_group_label_path(@group), class: "btn gl-button btn-confirm qa-label-create-new"
diff --git a/app/views/shared/members/_invite_group.html.haml b/app/views/shared/members/_invite_group.html.haml
index 5e3a6918ab2..d59f2950df6 100644
--- a/app/views/shared/members/_invite_group.html.haml
+++ b/app/views/shared/members/_invite_group.html.haml
@@ -23,4 +23,4 @@
.clearable-input
= text_field_tag :expires_at, nil, class: 'form-control js-access-expiration-date-groups', placeholder: _('Expiration date'), id: 'expires_at_groups'
= sprite_icon('close', size: 16, css_class: 'clear-icon js-clear-input gl-text-gray-200')
- = submit_tag _("Invite"), class: "btn btn-success", data: { qa_selector: 'invite_group_button' }
+ = submit_tag _("Invite"), class: "gl-button btn btn-confirm gl-mr-3", data: { qa_selector: 'invite_group_button' }
diff --git a/app/views/shared/members/_invite_member.html.haml b/app/views/shared/members/_invite_member.html.haml
index 0302b2fc3cf..ad0ba6dcedf 100644
--- a/app/views/shared/members/_invite_member.html.haml
+++ b/app/views/shared/members/_invite_member.html.haml
@@ -23,6 +23,6 @@
.clearable-input
= text_field_tag :expires_at, nil, class: 'form-control js-access-expiration-date', placeholder: 'Expiration date'
= sprite_icon('close', size: 16, css_class: 'clear-icon js-clear-input gl-text-gray-200')
- = submit_tag _("Invite"), class: "gl-button btn btn-success", data: { qa_selector: 'invite_member_button' }
+ = submit_tag _("Invite"), class: "gl-button btn btn-confirm gl-mr-3", data: { qa_selector: 'invite_member_button' }
- if can_import_members
= link_to _("Import"), import_path, class: "gl-button btn btn-default", title: _("Import members from another project")
diff --git a/app/views/shared/members/_member.html.haml b/app/views/shared/members/_member.html.haml
index c76051a25b2..0ba3e539357 100644
--- a/app/views/shared/members/_member.html.haml
+++ b/app/views/shared/members/_member.html.haml
@@ -107,7 +107,7 @@
- if member.can_approve?
= link_to polymorphic_path([:approve_access_request, member]),
method: :post,
- class: "btn btn-success btn-icon gl-button align-self-center m-0 mb-2 #{'mb-sm-0 ml-sm-2' unless force_mobile_view}",
+ class: "btn btn-confirm btn-icon gl-button align-self-center m-0 mb-2 #{'mb-sm-0 ml-sm-2' unless force_mobile_view}",
title: _('Grant access') do
%span{ class: ('d-block d-sm-none' unless force_mobile_view) }
= _('Grant access')
diff --git a/app/views/shared/milestones/_milestone.html.haml b/app/views/shared/milestones/_milestone.html.haml
index 4301bf01858..f52bf1551f4 100644
--- a/app/views/shared/milestones/_milestone.html.haml
+++ b/app/views/shared/milestones/_milestone.html.haml
@@ -25,7 +25,11 @@
&bull;
- if total_count > recent_releases.count
&bull;
- = link_to n_('%{count} more release', '%{count} more releases', more_count) % { count: more_count }, project_releases_path(milestone.project)
+ - more_text = n_('%{count} more release', '%{count} more releases', more_count) % { count: more_count }
+ - if milestone.project_milestone?
+ = link_to more_text, project_releases_path(milestone.project)
+ - else
+ = more_text
%div
= render('shared/milestone_expired', milestone: milestone)
- if milestone.group_milestone?
diff --git a/app/views/shared/notifications/_button.html.haml b/app/views/shared/notifications/_button.html.haml
deleted file mode 100644
index e12531b8a8d..00000000000
--- a/app/views/shared/notifications/_button.html.haml
+++ /dev/null
@@ -1,37 +0,0 @@
-- btn_class = local_assigns.fetch(:btn_class, '')
-- emails_disabled = local_assigns.fetch(:emails_disabled, false)
-
-- if notification_setting
- - if emails_disabled
- - button_title = notification_description(:owner_disabled)
- - aria_label = button_title
- - btn_class << " disabled"
- - else
- - button_title = _("Notification setting")
- - aria_label = _("Notification setting - %{notification_title}") % { notification_title: notification_title(notification_setting.level) }
-
- .js-notification-dropdown.notification-dropdown.mr-md-2.home-panel-action-button.dropdown.inline
- = form_for notification_setting, remote: true, html: { class: "inline notification-form" } do |f|
- = hidden_setting_source_input(notification_setting)
- = f.hidden_field :level, class: "notification_setting_level"
- .js-notification-toggle-btns
- %div{ class: ("btn-group" if notification_setting.custom?) }
- - if notification_setting.custom?
- %button.dropdown-new.btn.btn-default.btn-icon.gl-button.has-tooltip.notifications-btn.text-left#notifications-button{ type: "button", title: button_title, class: "#{btn_class}", "aria-label" => aria_label, data: { container: "body", toggle: "modal", target: "#" + notifications_menu_identifier("modal", notification_setting), display: 'static' } }
- = sprite_icon("notifications", css_class: "js-notification-loading")
- = notification_title(notification_setting.level)
- %button.btn.dropdown-toggle.gl-display-flex.gl-align-items-center{ data: { toggle: "dropdown", target: notifications_menu_identifier("dropdown", notification_setting), flip: "false" } }
- = sprite_icon('chevron-down')
- .sr-only Toggle dropdown
- - else
- %button.dropdown-new.btn.btn-default.btn-icon.gl-button.has-tooltip.notifications-btn#notifications-button{ type: "button", title: button_title, class: "#{btn_class}", "aria-label" => aria_label, data: { container: "body", toggle: "dropdown", target: notifications_menu_identifier("dropdown", notification_setting), flip: "false" } }
- .float-left
- = sprite_icon("notifications", css_class: "js-notification-loading")
- = notification_title(notification_setting.level)
- .float-right
- = sprite_icon("chevron-down")
-
- = render "shared/notifications/notification_dropdown", notification_setting: notification_setting
-
- = content_for :scripts_body do
- = render "shared/notifications/custom_notifications", notification_setting: notification_setting
diff --git a/app/views/shared/notifications/_custom_notifications.html.haml b/app/views/shared/notifications/_custom_notifications.html.haml
deleted file mode 100644
index 946e3c67dcf..00000000000
--- a/app/views/shared/notifications/_custom_notifications.html.haml
+++ /dev/null
@@ -1,34 +0,0 @@
-- hide_label = local_assigns.fetch(:hide_label, false)
-
-.modal.fade{ tabindex: "-1", role: "dialog", id: notifications_menu_identifier("modal", notification_setting), "aria-labelledby": "custom-notifications-title" }
- .modal-dialog
- .modal-content
- .modal-header
- %h4#custom-notifications-title.modal-title
- #{ _('Custom notification events') }
- %button.close{ type: "button", "data-dismiss": "modal", "aria-label" => _('Close') }
- %span{ "aria-hidden": true } &times;
-
- .modal-body
- .container-fluid
- = form_for notification_setting, html: { class: "custom-notifications-form" } do |f|
- = hidden_setting_source_input(notification_setting)
- = hidden_field_tag("hide_label", true) if hide_label
- .row
- .col-lg-4
- %h4.gl-mt-0= _('Notification events')
- %p
- - notification_link = link_to _('notification emails'), help_page_path('user/profile/notifications'), target: '_blank'
- - paragraph = _('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 %{notification_link}.') % { notification_link: notification_link.html_safe }
- #{ paragraph.html_safe }
- .col-lg-8
- - notification_setting.email_events.each_with_index do |event, index|
- - field_id = "#{notifications_menu_identifier("modal", notification_setting)}_notification_setting[#{event}]"
- .form-group
- .form-check{ class: ("gl-mt-0" if index == 0) }
- = check_box("notification_setting", event, id: field_id, class: "js-custom-notification-event form-check-input", checked: notification_setting.public_send(event))
- %label.form-check-label{ for: field_id }
- %strong
- = notification_event_name(event)
- %span.spinner.is-loading.gl-vertical-align-middle.gl-display-none
- = sprite_icon('check', css_class: 'is-done gl-display-none gl-vertical-align-middle gl-text-green-600')
diff --git a/app/views/shared/notifications/_new_button.html.haml b/app/views/shared/notifications/_new_button.html.haml
deleted file mode 100644
index 4b008601783..00000000000
--- a/app/views/shared/notifications/_new_button.html.haml
+++ /dev/null
@@ -1,35 +0,0 @@
-- btn_class = local_assigns.fetch(:btn_class, '')
-- dropdown_container_class = local_assigns.fetch(:dropdown_container_class, '')
-- emails_disabled = local_assigns.fetch(:emails_disabled, false)
-
-- if notification_setting
- - if emails_disabled
- - button_title = notification_description(:owner_disabled)
- - btn_class << " disabled"
- - else
- - button_title = _("Notification setting - %{notification_title}") % { notification_title: notification_title(notification_setting.level) }
-
- .js-notification-dropdown.notification-dropdown.home-panel-action-button.gl-mt-3.dropdown.inline{ class: dropdown_container_class }
- = form_for notification_setting, remote: true, html: { class: "notification-form no-label" } do |f|
- = hidden_setting_source_input(notification_setting)
- = hidden_field_tag "hide_label", true
- = f.hidden_field :level, class: "notification_setting_level"
- .js-notification-toggle-btns
- %div{ class: ("btn-group" if notification_setting.custom?) }
- - if notification_setting.custom?
- %button.dropdown-new.btn.gl-button.btn-default.has-tooltip.notifications-btn#notifications-button{ type: "button", title: button_title, class: "#{btn_class}", "aria-label" => button_title, data: { container: "body", placement: 'top', toggle: "modal", target: "#" + notifications_menu_identifier("modal", notification_setting), display: 'static' } }
- = notification_setting_icon(notification_setting)
- %span.js-notification-loading.fa.hidden
- %button.btn.gl-button.btn-default.dropdown-toggle{ data: { toggle: "dropdown", target: notifications_menu_identifier("dropdown", notification_setting), flip: "false" }, class: "#{btn_class}" }
- = sprite_icon("chevron-down", css_class: "icon mr-0")
- .sr-only Toggle dropdown
- - else
- %button.dropdown-new.btn.gl-button.btn-default.has-tooltip.notifications-btn#notifications-button{ type: "button", title: button_title, class: "#{btn_class}", "aria-label" => button_title, data: { container: "body", placement: 'top', toggle: "dropdown", target: notifications_menu_identifier("dropdown", notification_setting), flip: "false" } }
- = notification_setting_icon(notification_setting)
- %span.js-notification-loading.fa.hidden
- = sprite_icon("chevron-down", css_class: "icon")
-
- = render "shared/notifications/notification_dropdown", notification_setting: notification_setting
-
- = content_for :scripts_body do
- = render "shared/notifications/custom_notifications", notification_setting: notification_setting, hide_label: true
diff --git a/app/views/shared/notifications/_notification_dropdown.html.haml b/app/views/shared/notifications/_notification_dropdown.html.haml
deleted file mode 100644
index a6ef2d51171..00000000000
--- a/app/views/shared/notifications/_notification_dropdown.html.haml
+++ /dev/null
@@ -1,12 +0,0 @@
-%ul.dropdown-menu.dropdown-menu-no-wrap.dropdown-menu-selectable.dropdown-menu-large{ role: "menu", class: [notifications_menu_identifier("dropdown", notification_setting)] }
- - NotificationSetting.levels.each_key do |level|
- - next if level == "custom"
- - next if level == "global" && notification_setting.source.nil?
-
- = notification_list_item(level, notification_setting)
-
- %li.divider
- %li
- %a.update-notification{ href: "#", role: "button", class: ("is-active" if notification_setting.custom?), data: { toggle: "modal", target: "#" + notifications_menu_identifier("modal", notification_setting), notification_level: "custom", notification_title: "Custom" } }
- %strong.dropdown-menu-inner-title= s_('NotificationSetting|Custom')
- %span.dropdown-menu-inner-content= notification_description("custom")
diff --git a/app/views/shared/projects/_list.html.haml b/app/views/shared/projects/_list.html.haml
index c0c009f2a86..32b1af50a01 100644
--- a/app/views/shared/projects/_list.html.haml
+++ b/app/views/shared/projects/_list.html.haml
@@ -4,7 +4,6 @@
- stars = true unless local_assigns[:stars] == false
- forks = true unless local_assigns[:forks] == false
- merge_requests = true unless local_assigns[:merge_requests] == false
-- issues = true unless local_assigns[:issues] == false
- pipeline_status = true unless local_assigns[:pipeline_status] == false
- skip_namespace = false unless local_assigns[:skip_namespace] == true
- user = local_assigns[:user]
@@ -41,7 +40,7 @@
= 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: forks, show_last_commit_as_description: show_last_commit_as_description, user: user, merge_requests: merge_requests,
- issues: issues, pipeline_status: pipeline_status, compact_mode: compact_mode
+ issues: project.issues_enabled?, pipeline_status: pipeline_status, compact_mode: compact_mode
= paginate_collection(projects, remote: remote) unless skip_pagination
- else
- if @contributed_projects
diff --git a/app/views/shared/projects/_project.html.haml b/app/views/shared/projects/_project.html.haml
index 115d0c9a7c5..a33cd7c3b53 100644
--- a/app/views/shared/projects/_project.html.haml
+++ b/app/views/shared/projects/_project.html.haml
@@ -12,9 +12,10 @@
- css_class += " no-description" if project.description.blank? && !show_last_commit_as_description
- cache_key = project_list_cache_key(project, pipeline_status: pipeline_status)
- updated_tooltip = time_ago_with_tooltip(project.last_activity_date)
-- show_pipeline_status_icon = pipeline_status && can?(current_user, :read_cross_project) && project.pipeline_status.has_status? && can?(current_user, :read_build, project) && project.last_pipeline.present?
+- show_pipeline_status_icon = pipeline_status && can?(current_user, :read_cross_project) && project.pipeline_status.has_status? && can?(current_user, :read_build, project)
+- last_pipeline = project.last_pipeline if show_pipeline_status_icon
- css_controls_class = compact_mode ? [] : ["flex-lg-row", "justify-content-lg-between"]
-- css_controls_class << "with-pipeline-status" if show_pipeline_status_icon
+- css_controls_class << "with-pipeline-status" if show_pipeline_status_icon && last_pipeline.present?
- avatar_container_class = project.creator && use_creator_avatar ? '' : 'rect-avatar'
%li.project-row.d-flex{ class: css_class }
@@ -68,10 +69,10 @@
.controls.d-flex.flex-sm-column.align-items-center.align-items-sm-end.flex-wrap.flex-shrink-0.text-secondary{ class: css_controls_class.join(" ") }
.icon-container.d-flex.align-items-center
- - if show_pipeline_status_icon
+ - if show_pipeline_status_icon && last_pipeline.present?
- pipeline_path = pipelines_project_commit_path(project.pipeline_status.project, project.pipeline_status.sha, ref: project.pipeline_status.ref)
%span.icon-wrapper.pipeline-status
- = render 'ci/status/icon', status: project.last_pipeline.detailed_status(current_user), tooltip_placement: 'top', path: pipeline_path
+ = render 'ci/status/icon', status: last_pipeline.detailed_status(current_user), tooltip_placement: 'top', path: pipeline_path
= render_if_exists 'shared/projects/archived', project: project
- if stars
diff --git a/app/views/shared/projects/_search_bar.html.haml b/app/views/shared/projects/_search_bar.html.haml
index a745da32110..6c3a6ce809f 100644
--- a/app/views/shared/projects/_search_bar.html.haml
+++ b/app/views/shared/projects/_search_bar.html.haml
@@ -13,7 +13,7 @@
.filtered-search-box.m-0
.filtered-search-box-input-container.pl-2
= render 'shared/projects/search_form', admin_view: false, search_form_placeholder: _("Search projects...")
- %button.btn.btn-secondary{ type: 'submit', form: 'project-filter-form' }
+ %button.btn.gl-button.btn-icon.btn-secondary{ type: 'submit', form: 'project-filter-form' }
= sprite_icon('search', css_class: 'search-icon ')
.filtered-search-dropdown.flex-row.align-items-center.mb-2.m-sm-0#filtered-search-visibility-dropdown{ class: flex_grow_and_shrink_xs }
.filtered-search-dropdown-label.p-0.pl-sm-3.font-weight-bold
diff --git a/app/views/shared/projects/protected_branches/_update_protected_branch.html.haml b/app/views/shared/projects/protected_branches/_update_protected_branch.html.haml
index d1b32df7139..75d6d88fbc3 100644
--- a/app/views/shared/projects/protected_branches/_update_protected_branch.html.haml
+++ b/app/views/shared/projects/protected_branches/_update_protected_branch.html.haml
@@ -33,3 +33,6 @@
%p.small
= _('Members of %{group} can also push to this branch: %{branch}') % { group: (group_push_access_levels.size > 1 ? 'these groups' : 'this group'), branch: group_push_access_levels.map(&:humanize).to_sentence }
+- if ::Feature.enabled?(:allow_force_push_to_protected_branches, @project)
+ %td
+ = render "shared/buttons/project_feature_toggle", is_checked: protected_branch.allow_force_push, label: s_("ProtectedBranch|Toggle allow force push"), class_list: "js-force-push-toggle project-feature-toggle", data: { qa_selector: 'force_push_toggle_button', qa_branch_name: protected_branch.name }
diff --git a/app/views/shared/wikis/_form.html.haml b/app/views/shared/wikis/_form.html.haml
index 5fd22665633..d91e3c73c49 100644
--- a/app/views/shared/wikis/_form.html.haml
+++ b/app/views/shared/wikis/_form.html.haml
@@ -70,10 +70,10 @@
.form-actions
- if @page && @page.persisted?
- = f.submit _("Save changes"), class: 'btn gl-button btn-success qa-save-changes-button js-wiki-btn-submit', disabled: 'true'
+ = f.submit _("Save changes"), class: 'btn gl-button btn-confirm qa-save-changes-button js-wiki-btn-submit', disabled: 'true'
.float-right
= link_to _("Cancel"), wiki_page_path(@wiki, @page), class: 'btn gl-button btn-cancel btn-default'
- else
- = f.submit s_("Wiki|Create page"), class: 'btn-success gl-button btn qa-create-page-button rspec-create-page-button js-wiki-btn-submit', disabled: 'true'
+ = f.submit s_("Wiki|Create page"), class: 'btn-confirm gl-button btn qa-create-page-button rspec-create-page-button js-wiki-btn-submit', disabled: 'true'
.float-right
= link_to _("Cancel"), wiki_path(@wiki), class: 'btn gl-button btn-cancel btn-default'
diff --git a/app/views/shared/wikis/_main_links.html.haml b/app/views/shared/wikis/_main_links.html.haml
index 8568c36559a..02794950895 100644
--- a/app/views/shared/wikis/_main_links.html.haml
+++ b/app/views/shared/wikis/_main_links.html.haml
@@ -2,5 +2,5 @@
= link_to wiki_page_path(@wiki, @page, action: :history), class: "btn gl-button", 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-success btn-inverted", role: "button", data: { qa_selector: 'new_page_button' } do
+ = link_to wiki_path(@wiki, action: :new), class: "btn gl-button btn-confirm-secondary", role: "button", data: { qa_selector: 'new_page_button' } do
= s_("Wiki|New page")
diff --git a/app/views/shared/wikis/edit.html.haml b/app/views/shared/wikis/edit.html.haml
index c2b0e474c03..4bdeee3996f 100644
--- a/app/views/shared/wikis/edit.html.haml
+++ b/app/views/shared/wikis/edit.html.haml
@@ -1,7 +1,8 @@
- wiki_page_title @page, @page.persisted? ? _('Edit') : _('New')
- add_page_specific_style 'page_bundles/wiki'
-= wiki_page_errors(@error)
+- if @error
+ #js-wiki-error{ data: { error: @error, wiki_page_path: wiki_page_path(@wiki, @page) } }
.wiki-page-header.top-area.has-sidebar-toggle.flex-column.flex-lg-row
= wiki_sidebar_toggle_button
diff --git a/app/views/users/show.html.haml b/app/views/users/show.html.haml
index cdaa739a7b3..51483df19d7 100644
--- a/app/views/users/show.html.haml
+++ b/app/views/users/show.html.haml
@@ -26,13 +26,6 @@
= link_to new_abuse_report_path(user_id: @user.id, ref_url: request.referrer), class: link_classes + 'btn gl-button btn-default btn-icon',
title: s_('UserProfile|Report abuse'), data: { toggle: 'tooltip', placement: 'bottom', container: 'body' } do
= sprite_icon('error')
- - if current_user && current_user.id != @user.id
- - if current_user.following?(@user)
- = link_to user_unfollow_path(@user, :json) , class: link_classes + 'btn gl-button btn-default', method: :post do
- = _('Unfollow')
- - else
- = link_to user_follow_path(@user, :json) , class: link_classes + 'btn gl-button btn-default', method: :post do
- = _('Follow')
- if can?(current_user, :read_user_profile, @user)
= link_to user_path(@user, rss_url_options), class: link_classes + 'btn gl-button btn-default btn-icon has-tooltip',
title: s_('UserProfile|Subscribe'), data: { toggle: 'tooltip', placement: 'bottom', container: 'body' } do
@@ -41,6 +34,13 @@
= link_to [:admin, @user], class: link_classes + 'btn gl-button btn-default btn-icon', title: s_('UserProfile|View user in admin area'),
data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do
= sprite_icon('user')
+ - if current_user && current_user.id != @user.id
+ - if current_user.following?(@user)
+ = link_to user_unfollow_path(@user, :json) , class: link_classes + 'btn gl-button btn-default', method: :post do
+ = _('Unfollow')
+ - else
+ = link_to user_follow_path(@user, :json) , class: link_classes + 'btn gl-button btn-confirm', method: :post do
+ = _('Follow')
.profile-header{ class: [('with-no-profile-tabs' if profile_tabs.empty?)] }
.avatar-holder
diff --git a/app/workers/all_queues.yml b/app/workers/all_queues.yml
index 59ab0a4d05b..ff26aa7a4be 100644
--- a/app/workers/all_queues.yml
+++ b/app/workers/all_queues.yml
@@ -131,6 +131,14 @@
:weight: 1
:idempotent: true
:tags: []
+- :name: cronjob:analytics_usage_trends_count_job_trigger
+ :feature_category: :devops_reports
+ :has_external_dependencies:
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
+ :tags: []
- :name: cronjob:authorized_project_update_periodic_recalculate
:feature_category: :source_code_management
:has_external_dependencies:
@@ -347,14 +355,6 @@
:weight: 1
:idempotent:
:tags: []
-- :name: cronjob:releases_create_evidence
- :feature_category: :release_evidence
- :has_external_dependencies:
- :urgency: :low
- :resource_boundary: :unknown
- :weight: 1
- :idempotent:
- :tags: []
- :name: cronjob:releases_manage_evidence
:feature_category: :release_evidence
:has_external_dependencies:
@@ -1083,6 +1083,14 @@
:weight: 1
:idempotent:
:tags: []
+- :name: package_repositories:packages_maven_metadata_sync
+ :feature_category: :package_registry
+ :has_external_dependencies:
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
+ :tags: []
- :name: package_repositories:packages_nuget_extraction
:feature_category: :package_registry
:has_external_dependencies:
@@ -1098,8 +1106,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
- :tags:
- - :requires_disk_io
+ :tags: []
- :name: pipeline_background:ci_build_trace_chunk_flush
:feature_category: :continuous_integration
:has_external_dependencies:
@@ -1243,8 +1250,7 @@
:resource_boundary: :cpu
:weight: 5
:idempotent:
- :tags:
- - :requires_disk_io
+ :tags: []
- :name: pipeline_processing:build_queue
:feature_category: :continuous_integration
:has_external_dependencies:
@@ -1413,6 +1419,14 @@
:weight: 1
:idempotent: true
:tags: []
+- :name: analytics_usage_trends_counter_job
+ :feature_category: :devops_reports
+ :has_external_dependencies:
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
+ :tags: []
- :name: approve_blocked_pending_approval_users
:feature_category: :users
:has_external_dependencies:
@@ -1468,8 +1482,7 @@
:resource_boundary: :unknown
:weight: 2
:idempotent:
- :tags:
- - :requires_disk_io
+ :tags: []
- :name: ci_delete_objects
:feature_category: :continuous_integration
:has_external_dependencies:
@@ -1629,8 +1642,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
- :tags:
- - :requires_disk_io
+ :tags: []
- :name: export_csv
:feature_category: :issue_tracking
:has_external_dependencies:
@@ -1800,6 +1812,14 @@
:weight: 1
:idempotent: true
:tags: []
+- :name: merge_requests_delete_source_branch
+ :feature_category: :source_code_management
+ :has_external_dependencies:
+ :urgency: :high
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
+ :tags: []
- :name: metrics_dashboard_prune_old_annotations
:feature_category: :metrics
:has_external_dependencies:
@@ -1832,6 +1852,14 @@
:weight: 1
:idempotent:
:tags: []
+- :name: namespaces_onboarding_issue_created
+ :feature_category: :issue_tracking
+ :has_external_dependencies:
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
+ :tags: []
- :name: namespaces_onboarding_pipeline_created
:feature_category: :subgroups
:has_external_dependencies:
@@ -1840,6 +1868,14 @@
:weight: 1
:idempotent: true
:tags: []
+- :name: namespaces_onboarding_progress
+ :feature_category: :product_analytics
+ :has_external_dependencies:
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
+ :tags: []
- :name: namespaces_onboarding_user_added
:feature_category: :users
:has_external_dependencies:
@@ -1872,6 +1908,14 @@
:weight: 2
:idempotent:
:tags: []
+- :name: packages_composer_cache_update
+ :feature_category: :package_registry
+ :has_external_dependencies:
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
+ :tags: []
- :name: pages
:feature_category: :pages
:has_external_dependencies:
@@ -2012,6 +2056,22 @@
:weight: 1
:idempotent:
:tags: []
+- :name: projects_schedule_bulk_repository_shard_moves
+ :feature_category: :gitaly
+ :has_external_dependencies:
+ :urgency: :throttled
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
+ :tags: []
+- :name: projects_update_repository_storage
+ :feature_category: :gitaly
+ :has_external_dependencies:
+ :urgency: :throttled
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
+ :tags: []
- :name: prometheus_create_default_alerts
:feature_category: :incident_management
:has_external_dependencies:
@@ -2084,6 +2144,14 @@
:weight: 2
:idempotent:
:tags: []
+- :name: releases_create_evidence
+ :feature_category: :release_evidence
+ :has_external_dependencies:
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent:
+ :tags: []
- :name: remote_mirror_notification
:feature_category: :source_code_management
:has_external_dependencies:
@@ -2172,6 +2240,22 @@
:weight: 1
:idempotent: true
:tags: []
+- :name: snippets_schedule_bulk_repository_shard_moves
+ :feature_category: :gitaly
+ :has_external_dependencies:
+ :urgency: :throttled
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
+ :tags: []
+- :name: snippets_update_repository_storage
+ :feature_category: :gitaly
+ :has_external_dependencies:
+ :urgency: :throttled
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
+ :tags: []
- :name: system_hook_push
:feature_category: :source_code_management
:has_external_dependencies:
diff --git a/app/workers/analytics/instance_statistics/count_job_trigger_worker.rb b/app/workers/analytics/instance_statistics/count_job_trigger_worker.rb
index 81a765d5d08..3ec92bc7635 100644
--- a/app/workers/analytics/instance_statistics/count_job_trigger_worker.rb
+++ b/app/workers/analytics/instance_statistics/count_job_trigger_worker.rb
@@ -2,31 +2,19 @@
module Analytics
module InstanceStatistics
+ # This worker will be removed in 14.0
class CountJobTriggerWorker
include ApplicationWorker
include CronjobQueue # rubocop:disable Scalability/CronWorkerContext
- DEFAULT_DELAY = 3.minutes.freeze
-
feature_category :devops_reports
urgency :low
idempotent!
def perform
- recorded_at = Time.zone.now
-
- worker_arguments = Gitlab::Analytics::InstanceStatistics::WorkersArgumentBuilder.new(
- measurement_identifiers: ::Analytics::InstanceStatistics::Measurement.measurement_identifier_values,
- recorded_at: recorded_at
- ).execute
-
- perform_in = DEFAULT_DELAY.minutes.from_now
- worker_arguments.each do |args|
- CounterJobWorker.perform_in(perform_in, *args)
-
- perform_in += DEFAULT_DELAY
- end
+ # Delegate to the new worker
+ Analytics::UsageTrends::CountJobTriggerWorker.new.perform
end
end
end
diff --git a/app/workers/analytics/instance_statistics/counter_job_worker.rb b/app/workers/analytics/instance_statistics/counter_job_worker.rb
index c07b2569453..4beed8a3e2f 100644
--- a/app/workers/analytics/instance_statistics/counter_job_worker.rb
+++ b/app/workers/analytics/instance_statistics/counter_job_worker.rb
@@ -2,6 +2,7 @@
module Analytics
module InstanceStatistics
+ # This worker will be removed in 14.0
class CounterJobWorker
include ApplicationWorker
@@ -10,24 +11,9 @@ module Analytics
idempotent!
- def perform(measurement_identifier, min_id, max_id, recorded_at)
- query_scope = ::Analytics::InstanceStatistics::Measurement.identifier_query_mapping[measurement_identifier].call
-
- count = if min_id.nil? || max_id.nil? # table is empty
- 0
- else
- counter(query_scope, min_id, max_id)
- end
-
- return if count == Gitlab::Database::BatchCounter::FALLBACK
-
- InstanceStatistics::Measurement.insert_all([{ recorded_at: recorded_at, count: count, identifier: measurement_identifier }])
- end
-
- private
-
- def counter(query_scope, min_id, max_id)
- Gitlab::Database::BatchCount.batch_count(query_scope, start: min_id, finish: max_id)
+ def perform(*args)
+ # Delegate to the new worker
+ Analytics::UsageTrends::CounterJobWorker.new.perform(*args)
end
end
end
diff --git a/app/workers/analytics/usage_trends/count_job_trigger_worker.rb b/app/workers/analytics/usage_trends/count_job_trigger_worker.rb
new file mode 100644
index 00000000000..37f5c19d64c
--- /dev/null
+++ b/app/workers/analytics/usage_trends/count_job_trigger_worker.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+module Analytics
+ module UsageTrends
+ class CountJobTriggerWorker
+ extend ::Gitlab::Utils::Override
+ include ApplicationWorker
+ include CronjobQueue # rubocop:disable Scalability/CronWorkerContext
+
+ DEFAULT_DELAY = 3.minutes.freeze
+
+ feature_category :devops_reports
+ urgency :low
+
+ idempotent!
+
+ def perform
+ recorded_at = Time.zone.now
+
+ worker_arguments = Gitlab::Analytics::UsageTrends::WorkersArgumentBuilder.new(
+ measurement_identifiers: ::Analytics::UsageTrends::Measurement.measurement_identifier_values,
+ recorded_at: recorded_at
+ ).execute
+
+ perform_in = DEFAULT_DELAY.minutes.from_now
+ worker_arguments.each do |args|
+ CounterJobWorker.perform_in(perform_in, *args)
+
+ perform_in += DEFAULT_DELAY
+ end
+ end
+ end
+ end
+end
diff --git a/app/workers/analytics/usage_trends/counter_job_worker.rb b/app/workers/analytics/usage_trends/counter_job_worker.rb
new file mode 100644
index 00000000000..275c6ac2de2
--- /dev/null
+++ b/app/workers/analytics/usage_trends/counter_job_worker.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+module Analytics
+ module UsageTrends
+ class CounterJobWorker
+ extend ::Gitlab::Utils::Override
+ include ApplicationWorker
+
+ feature_category :devops_reports
+ urgency :low
+
+ idempotent!
+
+ def perform(measurement_identifier, min_id, max_id, recorded_at)
+ query_scope = ::Analytics::UsageTrends::Measurement.identifier_query_mapping[measurement_identifier].call
+
+ count = if min_id.nil? || max_id.nil? # table is empty
+ 0
+ else
+ counter(query_scope, min_id, max_id)
+ end
+
+ return if count == Gitlab::Database::BatchCounter::FALLBACK
+
+ UsageTrends::Measurement.insert_all([{ recorded_at: recorded_at, count: count, identifier: measurement_identifier }])
+ end
+
+ private
+
+ def counter(query_scope, min_id, max_id)
+ Gitlab::Database::BatchCount.batch_count(query_scope, start: min_id, finish: max_id)
+ end
+ end
+ end
+end
diff --git a/app/workers/archive_trace_worker.rb b/app/workers/archive_trace_worker.rb
index b0c5bef336a..3ddb5686bf2 100644
--- a/app/workers/archive_trace_worker.rb
+++ b/app/workers/archive_trace_worker.rb
@@ -4,8 +4,6 @@ class ArchiveTraceWorker # rubocop:disable Scalability/IdempotentWorker
include ApplicationWorker
include PipelineBackgroundQueue
- tags :requires_disk_io
-
# rubocop: disable CodeReuse/ActiveRecord
def perform(job_id)
Ci::Build.without_archived_trace.find_by(id: job_id).try do |job|
diff --git a/app/workers/build_finished_worker.rb b/app/workers/build_finished_worker.rb
index 4d15bcd16f7..3f99b30fdf7 100644
--- a/app/workers/build_finished_worker.rb
+++ b/app/workers/build_finished_worker.rb
@@ -7,7 +7,6 @@ class BuildFinishedWorker # rubocop:disable Scalability/IdempotentWorker
queue_namespace :pipeline_processing
urgency :high
worker_resource_boundary :cpu
- tags :requires_disk_io
ARCHIVE_TRACES_IN = 2.minutes.freeze
@@ -35,7 +34,7 @@ class BuildFinishedWorker # rubocop:disable Scalability/IdempotentWorker
# We execute these async as these are independent operations.
BuildHooksWorker.perform_async(build.id)
- ExpirePipelineCacheWorker.perform_async(build.pipeline_id) if build.pipeline.cacheable?
+ ExpirePipelineCacheWorker.perform_async(build.pipeline_id)
ChatNotificationWorker.perform_async(build.id) if build.pipeline.chat?
##
diff --git a/app/workers/chat_notification_worker.rb b/app/workers/chat_notification_worker.rb
index 94a0197b862..5fab437f49f 100644
--- a/app/workers/chat_notification_worker.rb
+++ b/app/workers/chat_notification_worker.rb
@@ -7,7 +7,6 @@ class ChatNotificationWorker # rubocop:disable Scalability/IdempotentWorker
sidekiq_options retry: false
feature_category :chatops
- tags :requires_disk_io
urgency :low # Can't be high as it has external dependencies
weight 2
worker_has_external_dependencies!
diff --git a/app/workers/concerns/worker_attributes.rb b/app/workers/concerns/worker_attributes.rb
index bb6192166b4..042508d08f2 100644
--- a/app/workers/concerns/worker_attributes.rb
+++ b/app/workers/concerns/worker_attributes.rb
@@ -133,5 +133,13 @@ module WorkerAttributes
def get_deduplication_options
class_attributes[:deduplication_options] || {}
end
+
+ def big_payload!
+ class_attributes[:big_payload] = true
+ end
+
+ def big_payload?
+ class_attributes[:big_payload]
+ end
end
end
diff --git a/app/workers/emails_on_push_worker.rb b/app/workers/emails_on_push_worker.rb
index 2f0d7fecf19..1a34bf50d87 100644
--- a/app/workers/emails_on_push_worker.rb
+++ b/app/workers/emails_on_push_worker.rb
@@ -96,6 +96,6 @@ class EmailsOnPushWorker # rubocop:disable Scalability/IdempotentWorker
def valid_recipients(recipients)
recipients.split.select do |recipient|
recipient.include?('@')
- end
+ end.uniq(&:downcase)
end
end
diff --git a/app/workers/error_tracking_issue_link_worker.rb b/app/workers/error_tracking_issue_link_worker.rb
index fa8af4f1822..4ad80d57f6b 100644
--- a/app/workers/error_tracking_issue_link_worker.rb
+++ b/app/workers/error_tracking_issue_link_worker.rb
@@ -26,7 +26,7 @@ class ErrorTrackingIssueLinkWorker # rubocop:disable Scalability/IdempotentWorke
logger.info("Linking Sentry issue #{sentry_issue_id} to GitLab issue #{issue.id}")
sentry_client.create_issue_link(integration_id, sentry_issue_id, issue)
- rescue Sentry::Client::Error => e
+ rescue ErrorTracking::SentryClient::Error => e
logger.info("Failed to link Sentry issue #{sentry_issue_id} to GitLab issue #{issue.id} with error: #{e.message}")
end
end
@@ -63,7 +63,7 @@ class ErrorTrackingIssueLinkWorker # rubocop:disable Scalability/IdempotentWorke
sentry_client
.repos(organization_slug)
.find { |repo| repo.project_id == issue.project_id && repo.status == 'active' }
- rescue Sentry::Client::Error => e
+ rescue ErrorTracking::SentryClient::Error => e
logger.info("Unable to retrieve Sentry repo for organization #{organization_slug}, id #{sentry_issue_id}, with error: #{e.message}")
nil
diff --git a/app/workers/expire_build_instance_artifacts_worker.rb b/app/workers/expire_build_instance_artifacts_worker.rb
index a5571473b43..e6cd60a3e47 100644
--- a/app/workers/expire_build_instance_artifacts_worker.rb
+++ b/app/workers/expire_build_instance_artifacts_worker.rb
@@ -4,7 +4,6 @@ class ExpireBuildInstanceArtifactsWorker # rubocop:disable Scalability/Idempoten
include ApplicationWorker
feature_category :continuous_integration
- tags :requires_disk_io
# rubocop: disable CodeReuse/ActiveRecord
def perform(build_id)
diff --git a/app/workers/expire_job_cache_worker.rb b/app/workers/expire_job_cache_worker.rb
index ce27fed7fb1..77b0edfd7de 100644
--- a/app/workers/expire_job_cache_worker.rb
+++ b/app/workers/expire_job_cache_worker.rb
@@ -16,19 +16,13 @@ class ExpireJobCacheWorker
pipeline = job.pipeline
project = job.project
- Gitlab::EtagCaching::Store.new.tap do |store|
- store.touch(project_pipeline_path(project, pipeline))
- store.touch(project_job_path(project, job))
- end
+ Gitlab::EtagCaching::Store.new.touch(project_job_path(project, job))
+ ExpirePipelineCacheWorker.perform_async(pipeline.id)
end
# rubocop: enable CodeReuse/ActiveRecord
private
- def project_pipeline_path(project, pipeline)
- Gitlab::Routing.url_helpers.project_pipeline_path(project, pipeline, format: :json)
- end
-
def project_job_path(project, job)
Gitlab::Routing.url_helpers.project_build_path(project, job.id, format: :json)
end
diff --git a/app/workers/expire_pipeline_cache_worker.rb b/app/workers/expire_pipeline_cache_worker.rb
index 0710ef9298b..02039e40e15 100644
--- a/app/workers/expire_pipeline_cache_worker.rb
+++ b/app/workers/expire_pipeline_cache_worker.rb
@@ -13,7 +13,7 @@ class ExpirePipelineCacheWorker
# rubocop: disable CodeReuse/ActiveRecord
def perform(pipeline_id)
pipeline = Ci::Pipeline.find_by(id: pipeline_id)
- return unless pipeline&.cacheable?
+ return unless pipeline
Ci::ExpirePipelineCacheService.new.execute(pipeline)
end
diff --git a/app/workers/merge_requests/delete_source_branch_worker.rb b/app/workers/merge_requests/delete_source_branch_worker.rb
new file mode 100644
index 00000000000..eb83d10af33
--- /dev/null
+++ b/app/workers/merge_requests/delete_source_branch_worker.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+class MergeRequests::DeleteSourceBranchWorker
+ include ApplicationWorker
+
+ feature_category :source_code_management
+ urgency :high
+ idempotent!
+
+ def perform(merge_request_id, source_branch_sha, user_id)
+ merge_request = MergeRequest.find(merge_request_id)
+ user = User.find(user_id)
+
+ # Source branch changed while it's being removed
+ return if merge_request.source_branch_sha != source_branch_sha
+
+ ::Branches::DeleteService.new(merge_request.source_project, user)
+ .execute(merge_request.source_branch)
+
+ ::MergeRequests::RetargetChainService.new(merge_request.source_project, user)
+ .execute(merge_request)
+ rescue ActiveRecord::RecordNotFound
+ end
+end
diff --git a/app/workers/namespaces/in_product_marketing_emails_worker.rb b/app/workers/namespaces/in_product_marketing_emails_worker.rb
index 66d140928a7..f8fa393264a 100644
--- a/app/workers/namespaces/in_product_marketing_emails_worker.rb
+++ b/app/workers/namespaces/in_product_marketing_emails_worker.rb
@@ -9,6 +9,7 @@ module Namespaces
urgency :low
def perform
+ return unless Gitlab::CurrentSettings.in_product_marketing_emails_enabled
return unless Gitlab::Experimentation.active?(:in_product_marketing_emails)
Namespaces::InProductMarketingEmailsService.send_for_all_tracks_and_intervals
diff --git a/app/workers/namespaces/onboarding_issue_created_worker.rb b/app/workers/namespaces/onboarding_issue_created_worker.rb
new file mode 100644
index 00000000000..e5e2c80e821
--- /dev/null
+++ b/app/workers/namespaces/onboarding_issue_created_worker.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+module Namespaces
+ class OnboardingIssueCreatedWorker
+ include ApplicationWorker
+
+ feature_category :issue_tracking
+ urgency :low
+
+ deduplicate :until_executing
+ idempotent!
+
+ def perform(namespace_id)
+ namespace = Namespace.find_by_id(namespace_id)
+ return unless namespace
+
+ OnboardingProgressService.new(namespace).execute(action: :issue_created)
+ end
+ end
+end
diff --git a/app/workers/namespaces/onboarding_progress_worker.rb b/app/workers/namespaces/onboarding_progress_worker.rb
new file mode 100644
index 00000000000..9cb5a23cf31
--- /dev/null
+++ b/app/workers/namespaces/onboarding_progress_worker.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+module Namespaces
+ class OnboardingProgressWorker
+ include ApplicationWorker
+
+ feature_category :product_analytics
+ urgency :low
+
+ deduplicate :until_executed
+ idempotent!
+
+ def perform(namespace_id, action)
+ namespace = Namespace.find_by_id(namespace_id)
+ return unless namespace && action
+
+ OnboardingProgressService.new(namespace).execute(action: action.to_sym)
+ end
+ end
+end
diff --git a/app/workers/packages/composer/cache_update_worker.rb b/app/workers/packages/composer/cache_update_worker.rb
new file mode 100644
index 00000000000..664fb23284f
--- /dev/null
+++ b/app/workers/packages/composer/cache_update_worker.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+module Packages
+ module Composer
+ class CacheUpdateWorker
+ include ApplicationWorker
+
+ feature_category :package_registry
+
+ idempotent!
+
+ def perform(project_id, package_name, last_page_sha)
+ project = Project.find_by_id(project_id)
+
+ return unless project
+
+ Gitlab::Composer::Cache.new(project: project, name: package_name, last_page_sha: last_page_sha).execute
+ rescue => e
+ Gitlab::ErrorTracking.log_exception(e, project_id: project_id)
+ end
+ end
+ end
+end
diff --git a/app/workers/packages/maven/metadata/sync_worker.rb b/app/workers/packages/maven/metadata/sync_worker.rb
new file mode 100644
index 00000000000..eb7abf4cdd0
--- /dev/null
+++ b/app/workers/packages/maven/metadata/sync_worker.rb
@@ -0,0 +1,59 @@
+# frozen_string_literal: true
+
+module Packages
+ module Maven
+ module Metadata
+ class SyncWorker
+ include ApplicationWorker
+ include Gitlab::Utils::StrongMemoize
+
+ queue_namespace :package_repositories
+ feature_category :package_registry
+
+ deduplicate :until_executing
+ idempotent!
+
+ loggable_arguments 2
+
+ SyncError = Class.new(StandardError)
+
+ def perform(user_id, project_id, package_name)
+ @user_id = user_id
+ @project_id = project_id
+ @package_name = package_name
+
+ return unless valid?
+
+ result = ::Packages::Maven::Metadata::SyncService.new(container: project, current_user: user, params: { package_name: @package_name })
+ .execute
+
+ if result.success?
+ log_extra_metadata_on_done(:message, result.message)
+ else
+ raise SyncError.new(result.message)
+ end
+
+ raise SyncError.new(result.message) unless result.success?
+ end
+
+ private
+
+ def valid?
+ @package_name.present? && user.present? && project.present?
+ end
+
+ def user
+ strong_memoize(:user) do
+ User.find_by_id(@user_id)
+ end
+ end
+
+ def project
+ strong_memoize(:project) do
+ Project.find_by_id(@project_id)
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/app/workers/pages_update_configuration_worker.rb b/app/workers/pages_update_configuration_worker.rb
index 07238bae8c2..6e82e2099c7 100644
--- a/app/workers/pages_update_configuration_worker.rb
+++ b/app/workers/pages_update_configuration_worker.rb
@@ -6,6 +6,12 @@ class PagesUpdateConfigurationWorker
idempotent!
feature_category :pages
+ def self.perform_async(*args)
+ return unless Feature.enabled?(:pages_update_legacy_storage, default_enabled: true)
+
+ super(*args)
+ end
+
def perform(project_id)
project = Project.find_by_id(project_id)
return unless project
diff --git a/app/workers/personal_access_tokens/expiring_worker.rb b/app/workers/personal_access_tokens/expiring_worker.rb
index f9940d9d014..7a016c85a64 100644
--- a/app/workers/personal_access_tokens/expiring_worker.rb
+++ b/app/workers/personal_access_tokens/expiring_worker.rb
@@ -7,17 +7,32 @@ module PersonalAccessTokens
feature_category :authentication_and_authorization
+ MAX_TOKENS = 100
+
def perform(*args)
notification_service = NotificationService.new
limit_date = PersonalAccessToken::DAYS_TO_EXPIRE.days.from_now.to_date
User.with_expiring_and_not_notified_personal_access_tokens(limit_date).find_each do |user|
with_context(user: user) do
- notification_service.access_token_about_to_expire(user)
+ expiring_user_tokens = user.personal_access_tokens.without_impersonation.expiring_and_not_notified(limit_date)
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ # We never materialise the token instances. We need the names to mention them in the
+ # email. Later we trigger an update query on the entire relation, not on individual instances.
+ token_names = expiring_user_tokens.limit(MAX_TOKENS).pluck(:name)
+ # We're limiting to 100 tokens so we avoid loading too many tokens into memory.
+ # At the time of writing this would only affect 69 users on GitLab.com
+
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ notification_service.access_token_about_to_expire(user, token_names)
Gitlab::AppLogger.info "#{self.class}: Notifying User #{user.id} about expiring tokens"
- user.personal_access_tokens.without_impersonation.expiring_and_not_notified(limit_date).update_all(expire_notification_delivered: true)
+ expiring_user_tokens.each_batch do |expiring_tokens|
+ expiring_tokens.update_all(expire_notification_delivered: true)
+ end
end
end
end
diff --git a/app/workers/post_receive.rb b/app/workers/post_receive.rb
index ac55f883fc5..313b901c08e 100644
--- a/app/workers/post_receive.rb
+++ b/app/workers/post_receive.rb
@@ -123,6 +123,7 @@ class PostReceive # rubocop:disable Scalability/IdempotentWorker
def after_project_changes_hooks(project, user, refs, changes)
experiment(:new_project_readme, actor: user).track_initial_writes(project)
+ experiment(:empty_repo_upload, project: project).track(:initial_write) if project.empty_repo?
repository_update_hook_data = Gitlab::DataBuilder::Repository.update(project, user, changes, refs)
SystemHooksService.new.execute_hooks(repository_update_hook_data, :repository_update_hooks)
Gitlab::UsageDataCounters::SourceCodeCounter.count(:pushes)
diff --git a/app/workers/project_schedule_bulk_repository_shard_moves_worker.rb b/app/workers/project_schedule_bulk_repository_shard_moves_worker.rb
index 4d2a6b47e3c..23d1594e4d9 100644
--- a/app/workers/project_schedule_bulk_repository_shard_moves_worker.rb
+++ b/app/workers/project_schedule_bulk_repository_shard_moves_worker.rb
@@ -1,13 +1,15 @@
# frozen_string_literal: true
-class ProjectScheduleBulkRepositoryShardMovesWorker
- include ApplicationWorker
-
+# This is a compatibility class to avoid calling a non-existent
+# class from sidekiq during deployment.
+#
+# This class was moved to a namespace in https://gitlab.com/gitlab-org/gitlab/-/issues/299853.
+# we cannot remove this class entirely because there can be jobs
+# referencing it.
+#
+# We can get rid of this class in 14.0
+# https://gitlab.com/gitlab-org/gitlab/-/issues/322393
+class ProjectScheduleBulkRepositoryShardMovesWorker < Projects::ScheduleBulkRepositoryShardMovesWorker
idempotent!
- feature_category :gitaly
urgency :throttled
-
- def perform(source_storage_name, destination_storage_name = nil)
- Projects::ScheduleBulkRepositoryShardMovesService.new.execute(source_storage_name, destination_storage_name)
- end
end
diff --git a/app/workers/project_update_repository_storage_worker.rb b/app/workers/project_update_repository_storage_worker.rb
index 5636eec8233..0d68c0e16f8 100644
--- a/app/workers/project_update_repository_storage_worker.rb
+++ b/app/workers/project_update_repository_storage_worker.rb
@@ -1,23 +1,15 @@
# frozen_string_literal: true
-class ProjectUpdateRepositoryStorageWorker # rubocop:disable Scalability/IdempotentWorker
- extend ::Gitlab::Utils::Override
- include UpdateRepositoryStorageWorker
-
- private
-
- override :find_repository_storage_move
- def find_repository_storage_move(repository_storage_move_id)
- ProjectRepositoryStorageMove.find(repository_storage_move_id)
- end
-
- override :find_container
- def find_container(container_id)
- Project.find(container_id)
- end
-
- override :update_repository_storage
- def update_repository_storage(repository_storage_move)
- ::Projects::UpdateRepositoryStorageService.new(repository_storage_move).execute
- end
+# This is a compatibility class to avoid calling a non-existent
+# class from sidekiq during deployment.
+#
+# This class was moved to a namespace in https://gitlab.com/gitlab-org/gitlab/-/issues/299853.
+# we cannot remove this class entirely because there can be jobs
+# referencing it.
+#
+# We can get rid of this class in 14.0
+# https://gitlab.com/gitlab-org/gitlab/-/issues/322393
+class ProjectUpdateRepositoryStorageWorker < Projects::UpdateRepositoryStorageWorker
+ idempotent!
+ urgency :throttled
end
diff --git a/app/workers/projects/schedule_bulk_repository_shard_moves_worker.rb b/app/workers/projects/schedule_bulk_repository_shard_moves_worker.rb
new file mode 100644
index 00000000000..3841ae9b922
--- /dev/null
+++ b/app/workers/projects/schedule_bulk_repository_shard_moves_worker.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module Projects
+ class ScheduleBulkRepositoryShardMovesWorker
+ include ApplicationWorker
+
+ idempotent!
+ feature_category :gitaly
+ urgency :throttled
+
+ def perform(source_storage_name, destination_storage_name = nil)
+ Projects::ScheduleBulkRepositoryShardMovesService.new.execute(source_storage_name, destination_storage_name)
+ end
+ end
+end
diff --git a/app/workers/projects/update_repository_storage_worker.rb b/app/workers/projects/update_repository_storage_worker.rb
new file mode 100644
index 00000000000..f4c44458446
--- /dev/null
+++ b/app/workers/projects/update_repository_storage_worker.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+module Projects
+ class UpdateRepositoryStorageWorker # rubocop:disable Scalability/IdempotentWorker
+ extend ::Gitlab::Utils::Override
+ include ::UpdateRepositoryStorageWorker
+
+ private
+
+ override :find_repository_storage_move
+ def find_repository_storage_move(repository_storage_move_id)
+ ::Projects::RepositoryStorageMove.find(repository_storage_move_id)
+ end
+
+ override :find_container
+ def find_container(container_id)
+ Project.find(container_id)
+ end
+
+ override :update_repository_storage
+ def update_repository_storage(repository_storage_move)
+ ::Projects::UpdateRepositoryStorageService.new(repository_storage_move).execute
+ end
+ end
+end
diff --git a/app/workers/releases/create_evidence_worker.rb b/app/workers/releases/create_evidence_worker.rb
index db75fae1639..d22329216f9 100644
--- a/app/workers/releases/create_evidence_worker.rb
+++ b/app/workers/releases/create_evidence_worker.rb
@@ -3,7 +3,6 @@
module Releases
class CreateEvidenceWorker # rubocop:disable Scalability/IdempotentWorker
include ApplicationWorker
- include CronjobQueue # rubocop:disable Scalability/CronWorkerContext
feature_category :release_evidence
diff --git a/app/workers/snippet_schedule_bulk_repository_shard_moves_worker.rb b/app/workers/snippet_schedule_bulk_repository_shard_moves_worker.rb
index 47f24ad3500..94a6b22538b 100644
--- a/app/workers/snippet_schedule_bulk_repository_shard_moves_worker.rb
+++ b/app/workers/snippet_schedule_bulk_repository_shard_moves_worker.rb
@@ -1,13 +1,16 @@
# frozen_string_literal: true
-class SnippetScheduleBulkRepositoryShardMovesWorker
- include ApplicationWorker
-
+# This is a compatibility class to avoid calling a non-existent
+# class from sidekiq during deployment.
+#
+# This class was moved to a namespace in https://gitlab.com/gitlab-org/gitlab/-/issues/299853.
+# we cannot remove this class entirely because there can be jobs
+# referencing it.
+#
+# We can get rid of this class in 14.0
+# https://gitlab.com/gitlab-org/gitlab/-/issues/322393
+class SnippetScheduleBulkRepositoryShardMovesWorker < Snippets::ScheduleBulkRepositoryShardMovesWorker
idempotent!
feature_category :gitaly
urgency :throttled
-
- def perform(source_storage_name, destination_storage_name = nil)
- Snippets::ScheduleBulkRepositoryShardMovesService.new.execute(source_storage_name, destination_storage_name)
- end
end
diff --git a/app/workers/snippet_update_repository_storage_worker.rb b/app/workers/snippet_update_repository_storage_worker.rb
index a28a02a0298..befae6db4f4 100644
--- a/app/workers/snippet_update_repository_storage_worker.rb
+++ b/app/workers/snippet_update_repository_storage_worker.rb
@@ -1,23 +1,15 @@
# frozen_string_literal: true
-class SnippetUpdateRepositoryStorageWorker # rubocop:disable Scalability/IdempotentWorker
- extend ::Gitlab::Utils::Override
- include UpdateRepositoryStorageWorker
-
- private
-
- override :find_repository_storage_move
- def find_repository_storage_move(repository_storage_move_id)
- SnippetRepositoryStorageMove.find(repository_storage_move_id)
- end
-
- override :find_container
- def find_container(container_id)
- Snippet.find(container_id)
- end
-
- override :update_repository_storage
- def update_repository_storage(repository_storage_move)
- ::Snippets::UpdateRepositoryStorageService.new(repository_storage_move).execute
- end
+# This is a compatibility class to avoid calling a non-existent
+# class from sidekiq during deployment.
+#
+# This class was moved to a namespace in https://gitlab.com/gitlab-org/gitlab/-/issues/299853.
+# we cannot remove this class entirely because there can be jobs
+# referencing it.
+#
+# We can get rid of this class in 14.0
+# https://gitlab.com/gitlab-org/gitlab/-/issues/322393
+class SnippetUpdateRepositoryStorageWorker < Snippets::UpdateRepositoryStorageWorker # rubocop:disable Scalability/IdempotentWorker
+ idempotent!
+ urgency :throttled
end
diff --git a/app/workers/snippets/schedule_bulk_repository_shard_moves_worker.rb b/app/workers/snippets/schedule_bulk_repository_shard_moves_worker.rb
new file mode 100644
index 00000000000..ec3d9dbdf97
--- /dev/null
+++ b/app/workers/snippets/schedule_bulk_repository_shard_moves_worker.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module Snippets
+ class ScheduleBulkRepositoryShardMovesWorker
+ include ApplicationWorker
+
+ idempotent!
+ feature_category :gitaly
+ urgency :throttled
+
+ def perform(source_storage_name, destination_storage_name = nil)
+ Snippets::ScheduleBulkRepositoryShardMovesService.new.execute(source_storage_name, destination_storage_name)
+ end
+ end
+end
diff --git a/app/workers/snippets/update_repository_storage_worker.rb b/app/workers/snippets/update_repository_storage_worker.rb
new file mode 100644
index 00000000000..83b655e9986
--- /dev/null
+++ b/app/workers/snippets/update_repository_storage_worker.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+module Snippets
+ class UpdateRepositoryStorageWorker # rubocop:disable Scalability/IdempotentWorker
+ extend ::Gitlab::Utils::Override
+ include ::UpdateRepositoryStorageWorker
+
+ private
+
+ override :find_repository_storage_move
+ def find_repository_storage_move(repository_storage_move_id)
+ Snippets::RepositoryStorageMove.find(repository_storage_move_id)
+ end
+
+ override :find_container
+ def find_container(container_id)
+ Snippet.find(container_id)
+ end
+
+ override :update_repository_storage
+ def update_repository_storage(repository_storage_move)
+ ::Snippets::UpdateRepositoryStorageService.new(repository_storage_move).execute
+ end
+ end
+end
diff --git a/app/workers/stuck_ci_jobs_worker.rb b/app/workers/stuck_ci_jobs_worker.rb
index eca0a248a37..bd721df73c6 100644
--- a/app/workers/stuck_ci_jobs_worker.rb
+++ b/app/workers/stuck_ci_jobs_worker.rb
@@ -70,7 +70,7 @@ class StuckCiJobsWorker # rubocop:disable Scalability/IdempotentWorker
def drop_build(type, build, status, timeout, reason)
Gitlab::AppLogger.info "#{self.class}: Dropping #{type} build #{build.id} for runner #{build.runner_id} (status: #{status}, timeout: #{timeout}, reason: #{reason})"
- Gitlab::OptimisticLocking.retry_lock(build, 3) do |b|
+ Gitlab::OptimisticLocking.retry_lock(build, 3, name: 'stuck_ci_jobs_worker_drop_build') do |b|
b.drop(reason)
end
rescue => ex
diff --git a/babel.config.js b/babel.config.js
index 6c9d4640535..4dfca8f6144 100644
--- a/babel.config.js
+++ b/babel.config.js
@@ -1,5 +1,3 @@
-/* eslint-disable import/no-commonjs, filenames/match-regex */
-
const BABEL_ENV = process.env.BABEL_ENV || process.env.NODE_ENV || null;
let presets = [
diff --git a/changelogs/unreleased/11424-background-worker-for-updating-the-maven-metadata-xml-file.yml b/changelogs/unreleased/11424-background-worker-for-updating-the-maven-metadata-xml-file.yml
new file mode 100644
index 00000000000..762f40be0f4
--- /dev/null
+++ b/changelogs/unreleased/11424-background-worker-for-updating-the-maven-metadata-xml-file.yml
@@ -0,0 +1,5 @@
+---
+title: Sync the maven metadata file upon package deletion through the UI
+merge_request: 55207
+author:
+type: fixed
diff --git a/changelogs/unreleased/118597-improve-autofill-suggestions-for-usernames.yml b/changelogs/unreleased/118597-improve-autofill-suggestions-for-usernames.yml
new file mode 100644
index 00000000000..9feb3af9984
--- /dev/null
+++ b/changelogs/unreleased/118597-improve-autofill-suggestions-for-usernames.yml
@@ -0,0 +1,5 @@
+---
+title: Improve at.js members autocomplete matching
+merge_request: 54681
+author:
+type: changed
diff --git a/changelogs/unreleased/15332-add-draft-status-change-email.yml b/changelogs/unreleased/15332-add-draft-status-change-email.yml
new file mode 100644
index 00000000000..4592395d1b2
--- /dev/null
+++ b/changelogs/unreleased/15332-add-draft-status-change-email.yml
@@ -0,0 +1,5 @@
+---
+title: Add notification templates for merge request draft/WIP status change events
+merge_request: 54870
+author:
+type: other
diff --git a/changelogs/unreleased/15332-notify-when-merge-request-draft-status-changes.yml b/changelogs/unreleased/15332-notify-when-merge-request-draft-status-changes.yml
new file mode 100644
index 00000000000..eace8a9a2f8
--- /dev/null
+++ b/changelogs/unreleased/15332-notify-when-merge-request-draft-status-changes.yml
@@ -0,0 +1,5 @@
+---
+title: Send notifications to subscribers when merge request draft status removed
+merge_request: 55444
+author:
+type: changed
diff --git a/changelogs/unreleased/18792-add-container_registry_access_level.yml b/changelogs/unreleased/18792-add-container_registry_access_level.yml
new file mode 100644
index 00000000000..7775c7fe197
--- /dev/null
+++ b/changelogs/unreleased/18792-add-container_registry_access_level.yml
@@ -0,0 +1,5 @@
+---
+title: Add a new project feature called container_registry
+merge_request: 54831
+author:
+type: changed
diff --git a/changelogs/unreleased/198562-merge-request-user-interface-encourages-accidentally-closing-the-r.yml b/changelogs/unreleased/198562-merge-request-user-interface-encourages-accidentally-closing-the-r.yml
new file mode 100644
index 00000000000..ccc69cfcefe
--- /dev/null
+++ b/changelogs/unreleased/198562-merge-request-user-interface-encourages-accidentally-closing-the-r.yml
@@ -0,0 +1,5 @@
+---
+title: Deemphasize comment and close button
+merge_request: 55075
+author:
+type: other
diff --git a/changelogs/unreleased/205484-01-project-settings-headers-cicd.yml b/changelogs/unreleased/205484-01-project-settings-headers-cicd.yml
new file mode 100644
index 00000000000..9353ccfef31
--- /dev/null
+++ b/changelogs/unreleased/205484-01-project-settings-headers-cicd.yml
@@ -0,0 +1,5 @@
+---
+title: Project Settings CI/CD headers expand/collapse on click / tap
+merge_request: 54114
+author: Daniel Schömer
+type: changed
diff --git a/changelogs/unreleased/205484-03-project-settings-headers-cicd-variables.yml b/changelogs/unreleased/205484-03-project-settings-headers-cicd-variables.yml
new file mode 100644
index 00000000000..81b94db0f97
--- /dev/null
+++ b/changelogs/unreleased/205484-03-project-settings-headers-cicd-variables.yml
@@ -0,0 +1,5 @@
+---
+title: Project Settings CI/CD Variables header expands/collapses on click / tap
+merge_request: 54117
+author: Daniel Schömer
+type: changed
diff --git a/changelogs/unreleased/205484-04-project-settings-headers-repo-default-branch.yml b/changelogs/unreleased/205484-04-project-settings-headers-repo-default-branch.yml
new file mode 100644
index 00000000000..ab446448b76
--- /dev/null
+++ b/changelogs/unreleased/205484-04-project-settings-headers-repo-default-branch.yml
@@ -0,0 +1,5 @@
+---
+title: Project Settings Repository Default branch header expand/collaps on click
+merge_request: 55228
+author: Daniel Schömer
+type: changed
diff --git a/changelogs/unreleased/205484-05-project-settings-headers-repository-mirroring-repositories.yml b/changelogs/unreleased/205484-05-project-settings-headers-repository-mirroring-repositories.yml
new file mode 100644
index 00000000000..e471108aa3b
--- /dev/null
+++ b/changelogs/unreleased/205484-05-project-settings-headers-repository-mirroring-repositories.yml
@@ -0,0 +1,5 @@
+---
+title: Project Settings Repository Mirroring repositories header expands/collapses on click / tap
+merge_request: 55229
+author: Daniel Schömer
+type: changed
diff --git a/changelogs/unreleased/205484-06-project-settings-headers-repository-protected-branches.yml b/changelogs/unreleased/205484-06-project-settings-headers-repository-protected-branches.yml
new file mode 100644
index 00000000000..6debece1199
--- /dev/null
+++ b/changelogs/unreleased/205484-06-project-settings-headers-repository-protected-branches.yml
@@ -0,0 +1,5 @@
+---
+title: Project Settings CI/CD Variables header expands/collapses on click / tap
+merge_request: 55230
+author: Daniel Schömer
+type: changed
diff --git a/changelogs/unreleased/205484-07-project-settings-headers-repository-protected-tags.yml b/changelogs/unreleased/205484-07-project-settings-headers-repository-protected-tags.yml
new file mode 100644
index 00000000000..06eca221721
--- /dev/null
+++ b/changelogs/unreleased/205484-07-project-settings-headers-repository-protected-tags.yml
@@ -0,0 +1,5 @@
+---
+title: Project Settings Repository Protected tags header expands/collapses on click / tap
+merge_request: 55231
+author: Daniel Schömer
+type: changed
diff --git a/changelogs/unreleased/205484-08-project-settings-headers-repository-cleanup.yml b/changelogs/unreleased/205484-08-project-settings-headers-repository-cleanup.yml
new file mode 100644
index 00000000000..a0f79c935da
--- /dev/null
+++ b/changelogs/unreleased/205484-08-project-settings-headers-repository-cleanup.yml
@@ -0,0 +1,5 @@
+---
+title: Project Settings Repository Cleanup header expands/collapses on click / tap
+merge_request: 55232
+author: Daniel Schömer
+type: changed
diff --git a/changelogs/unreleased/205484-09-project-settings-headers-repository-deploy-tokens.yml b/changelogs/unreleased/205484-09-project-settings-headers-repository-deploy-tokens.yml
new file mode 100644
index 00000000000..b285a9e973f
--- /dev/null
+++ b/changelogs/unreleased/205484-09-project-settings-headers-repository-deploy-tokens.yml
@@ -0,0 +1,5 @@
+---
+title: Project Settings Repository Deploy tokens header expands/collapses on click / tap
+merge_request: 55233
+author: Daniel Schömer
+type: changed
diff --git a/changelogs/unreleased/205484-10-project-settings-headers-repository-deploy-keys.yml b/changelogs/unreleased/205484-10-project-settings-headers-repository-deploy-keys.yml
new file mode 100644
index 00000000000..acc49458164
--- /dev/null
+++ b/changelogs/unreleased/205484-10-project-settings-headers-repository-deploy-keys.yml
@@ -0,0 +1,5 @@
+---
+title: Project Settings Repository Deploy keys header expands/collapses on click / tap
+merge_request: 55234
+author: Daniel Schömer
+type: changed
diff --git a/changelogs/unreleased/207467-add-gradle-setup-and-install-commands-to-the-package-details-page-.yml b/changelogs/unreleased/207467-add-gradle-setup-and-install-commands-to-the-package-details-page-.yml
new file mode 100644
index 00000000000..aba03f19142
--- /dev/null
+++ b/changelogs/unreleased/207467-add-gradle-setup-and-install-commands-to-the-package-details-page-.yml
@@ -0,0 +1,5 @@
+---
+title: Add Gradle instructions and instruction selector to package details
+merge_request: 55738
+author:
+type: changed
diff --git a/changelogs/unreleased/209061-remove-dashboard-pipeline-status-ff.yml b/changelogs/unreleased/209061-remove-dashboard-pipeline-status-ff.yml
new file mode 100644
index 00000000000..5abe0575a0f
--- /dev/null
+++ b/changelogs/unreleased/209061-remove-dashboard-pipeline-status-ff.yml
@@ -0,0 +1,5 @@
+---
+title: Remove dashboard_pipeline_status feature flag
+merge_request: 55472
+author:
+type: other
diff --git a/changelogs/unreleased/20917-do-not-show-button-to-resolve-discussion-opening-an-issue-when-issu.yml b/changelogs/unreleased/20917-do-not-show-button-to-resolve-discussion-opening-an-issue-when-issu.yml
new file mode 100644
index 00000000000..afa3336d83b
--- /dev/null
+++ b/changelogs/unreleased/20917-do-not-show-button-to-resolve-discussion-opening-an-issue-when-issu.yml
@@ -0,0 +1,5 @@
+---
+title: Do not show button to resolve discussion opening an issue when issues are disabled
+merge_request: 54263
+author:
+type: fixed
diff --git a/changelogs/unreleased/212322-update-existing-vulnerabilities-occurrences-uuids.yml b/changelogs/unreleased/212322-update-existing-vulnerabilities-occurrences-uuids.yml
new file mode 100644
index 00000000000..9df5ee1920e
--- /dev/null
+++ b/changelogs/unreleased/212322-update-existing-vulnerabilities-occurrences-uuids.yml
@@ -0,0 +1,5 @@
+---
+title: Recalculate UUID for all Vulnerability::Findings
+merge_request: 47529
+author:
+type: other
diff --git a/changelogs/unreleased/21759-add-loading-indicator-to-update-username-button.yml b/changelogs/unreleased/21759-add-loading-indicator-to-update-username-button.yml
new file mode 100644
index 00000000000..90fe09551a8
--- /dev/null
+++ b/changelogs/unreleased/21759-add-loading-indicator-to-update-username-button.yml
@@ -0,0 +1,5 @@
+---
+title: Add loading indicator to "Update username" button in account settings
+merge_request: 53142
+author: Kev @KevSlashNull
+type: changed
diff --git a/changelogs/unreleased/218964-downstream-pipeline-caching.yml b/changelogs/unreleased/218964-downstream-pipeline-caching.yml
new file mode 100644
index 00000000000..ba862b4591f
--- /dev/null
+++ b/changelogs/unreleased/218964-downstream-pipeline-caching.yml
@@ -0,0 +1,5 @@
+---
+title: Fix status cache for upstream pipelines
+merge_request: 54937
+author:
+type: fixed
diff --git a/changelogs/unreleased/221296-skip_orphaned_pool_repositories_on_restore.yml b/changelogs/unreleased/221296-skip_orphaned_pool_repositories_on_restore.yml
new file mode 100644
index 00000000000..387fd59236d
--- /dev/null
+++ b/changelogs/unreleased/221296-skip_orphaned_pool_repositories_on_restore.yml
@@ -0,0 +1,5 @@
+---
+title: Skip orphaned pool repositories on restore
+merge_request: 54112
+author:
+type: fixed
diff --git a/changelogs/unreleased/225309-add-invite_email-quick-action.yml b/changelogs/unreleased/225309-add-invite_email-quick-action.yml
new file mode 100644
index 00000000000..c932f2f6b36
--- /dev/null
+++ b/changelogs/unreleased/225309-add-invite_email-quick-action.yml
@@ -0,0 +1,5 @@
+---
+title: Add invite_email Quick Action
+merge_request: 49264
+author: Lee Tickett
+type: added
diff --git a/changelogs/unreleased/227257-replace-bootstrap-popover-with-gitlab-ui-popover-in-merge-conflict.yml b/changelogs/unreleased/227257-replace-bootstrap-popover-with-gitlab-ui-popover-in-merge-conflict.yml
new file mode 100644
index 00000000000..67592b1baaf
--- /dev/null
+++ b/changelogs/unreleased/227257-replace-bootstrap-popover-with-gitlab-ui-popover-in-merge-conflict.yml
@@ -0,0 +1,5 @@
+---
+title: Replace Bootstrap popover with GitLab UI popover for merge conflict
+merge_request: 55652
+author:
+type: other
diff --git a/changelogs/unreleased/228733-alert-issue-status.yml b/changelogs/unreleased/228733-alert-issue-status.yml
new file mode 100644
index 00000000000..265e4955195
--- /dev/null
+++ b/changelogs/unreleased/228733-alert-issue-status.yml
@@ -0,0 +1,5 @@
+---
+title: 'Incident management: add issue state to alerts table'
+merge_request: 55185
+author:
+type: added
diff --git a/changelogs/unreleased/22901-add-predefined-variable.yml b/changelogs/unreleased/22901-add-predefined-variable.yml
new file mode 100644
index 00000000000..e6ff9f68453
--- /dev/null
+++ b/changelogs/unreleased/22901-add-predefined-variable.yml
@@ -0,0 +1,5 @@
+---
+title: Add CI_JOB_STARTED_AT and CI_PIPELINE_CREATED_AT variables
+merge_request: 54989
+author: Vincent Firmin @winkies
+type: added
diff --git a/changelogs/unreleased/229507-graphql-mutation-to-remove-issue-from-board.yml b/changelogs/unreleased/229507-graphql-mutation-to-remove-issue-from-board.yml
new file mode 100644
index 00000000000..e8b4573d8f8
--- /dev/null
+++ b/changelogs/unreleased/229507-graphql-mutation-to-remove-issue-from-board.yml
@@ -0,0 +1,5 @@
+---
+title: Remove Remove from board button from board sidebar
+merge_request: 53946
+author:
+type: removed
diff --git a/changelogs/unreleased/230465-fj-add-columns-to-track-group-wiki-storage.yml b/changelogs/unreleased/230465-fj-add-columns-to-track-group-wiki-storage.yml
new file mode 100644
index 00000000000..3bce5234ea1
--- /dev/null
+++ b/changelogs/unreleased/230465-fj-add-columns-to-track-group-wiki-storage.yml
@@ -0,0 +1,5 @@
+---
+title: Add wiki_size and storage_size to NamespaceStatistics
+merge_request: 54786
+author:
+type: added
diff --git a/changelogs/unreleased/231064-update-settings-buttons-to-pajamas.yml b/changelogs/unreleased/231064-update-settings-buttons-to-pajamas.yml
new file mode 100644
index 00000000000..780cb864703
--- /dev/null
+++ b/changelogs/unreleased/231064-update-settings-buttons-to-pajamas.yml
@@ -0,0 +1,5 @@
+---
+title: Update protected branches buttons to pajamas style
+merge_request: 54612
+author:
+type: other
diff --git a/changelogs/unreleased/231126-yo-gitlab-ui.yml b/changelogs/unreleased/231126-yo-gitlab-ui.yml
new file mode 100644
index 00000000000..4b726401bdc
--- /dev/null
+++ b/changelogs/unreleased/231126-yo-gitlab-ui.yml
@@ -0,0 +1,6 @@
+---
+title: Apply GitLab UI button styles to buttons in ee/app/views/subscriptions/groups
+ directory
+merge_request: 51784
+author: Yogi (@yo)
+type: other
diff --git a/changelogs/unreleased/235909-make-it-clearer-what-to-do-after-adding-a-namespace.yml b/changelogs/unreleased/235909-make-it-clearer-what-to-do-after-adding-a-namespace.yml
new file mode 100644
index 00000000000..76fbfedee7c
--- /dev/null
+++ b/changelogs/unreleased/235909-make-it-clearer-what-to-do-after-adding-a-namespace.yml
@@ -0,0 +1,5 @@
+---
+title: Display success message after successfully adding a namespace in Jira Connect
+merge_request: 53332
+author:
+type: added
diff --git a/changelogs/unreleased/241058-mg-update-reply-placeholder.yml b/changelogs/unreleased/241058-mg-update-reply-placeholder.yml
new file mode 100644
index 00000000000..04a1368b46b
--- /dev/null
+++ b/changelogs/unreleased/241058-mg-update-reply-placeholder.yml
@@ -0,0 +1,5 @@
+---
+title: Update accessibility of the "Reply to discussion" UX
+merge_request: 54380
+author:
+type: other
diff --git a/changelogs/unreleased/241735-add-import-options-to-projects-and-groups-dropdown.yml b/changelogs/unreleased/241735-add-import-options-to-projects-and-groups-dropdown.yml
new file mode 100644
index 00000000000..7fbb6fca740
--- /dev/null
+++ b/changelogs/unreleased/241735-add-import-options-to-projects-and-groups-dropdown.yml
@@ -0,0 +1,5 @@
+---
+title: Add Import options to projects and groups dropdown
+merge_request: 54749
+author:
+type: added
diff --git a/changelogs/unreleased/246959-msj-opened-created-ui.yml b/changelogs/unreleased/246959-msj-opened-created-ui.yml
new file mode 100644
index 00000000000..d0435638be8
--- /dev/null
+++ b/changelogs/unreleased/246959-msj-opened-created-ui.yml
@@ -0,0 +1,5 @@
+---
+title: Use Created instead of opened when describing issue creation
+merge_request: 49478
+author:
+type: other
diff --git a/changelogs/unreleased/247636-fix-logging-search-scope.yml b/changelogs/unreleased/247636-fix-logging-search-scope.yml
new file mode 100644
index 00000000000..c9e5a7a7a58
--- /dev/null
+++ b/changelogs/unreleased/247636-fix-logging-search-scope.yml
@@ -0,0 +1,5 @@
+---
+title: 'Search: Log search.scope for the default scope'
+merge_request: 54684
+author:
+type: fixed
diff --git a/changelogs/unreleased/247918-add-user-preference-to-turn-off-keystroke-formatting.yml b/changelogs/unreleased/247918-add-user-preference-to-turn-off-keystroke-formatting.yml
new file mode 100644
index 00000000000..a68e6c67e6b
--- /dev/null
+++ b/changelogs/unreleased/247918-add-user-preference-to-turn-off-keystroke-formatting.yml
@@ -0,0 +1,5 @@
+---
+title: Add user preference to turn off selected text keystroke formatting
+merge_request: 53079
+author:
+type: added
diff --git a/changelogs/unreleased/24908-user-2fa-status-should-not-be-publicly-shown.yml b/changelogs/unreleased/24908-user-2fa-status-should-not-be-publicly-shown.yml
new file mode 100644
index 00000000000..b47577d3e69
--- /dev/null
+++ b/changelogs/unreleased/24908-user-2fa-status-should-not-be-publicly-shown.yml
@@ -0,0 +1,5 @@
+---
+title: Only show 2FA badge to project maintainers and group owners
+merge_request: 54646
+author:
+type: changed
diff --git a/changelogs/unreleased/254267-replace-bootstrap-modal-in-app-views-projects-issues-export_csv-_b.yml b/changelogs/unreleased/254267-replace-bootstrap-modal-in-app-views-projects-issues-export_csv-_b.yml
new file mode 100644
index 00000000000..d905c4a618a
--- /dev/null
+++ b/changelogs/unreleased/254267-replace-bootstrap-modal-in-app-views-projects-issues-export_csv-_b.yml
@@ -0,0 +1,5 @@
+---
+title: Replace import/export CSV modal with Vue component
+merge_request: 54214
+author:
+type: other
diff --git a/changelogs/unreleased/255913-webex-teams-pipeline-notifications.yml b/changelogs/unreleased/255913-webex-teams-pipeline-notifications.yml
new file mode 100644
index 00000000000..90468f7448b
--- /dev/null
+++ b/changelogs/unreleased/255913-webex-teams-pipeline-notifications.yml
@@ -0,0 +1,5 @@
+---
+title: Fix pipeline notifications for Webex Teams / Unify Circuit integrations
+merge_request: 54852
+author:
+type: fixed
diff --git a/changelogs/unreleased/259840-composer-v2-metadata-url.yml b/changelogs/unreleased/259840-composer-v2-metadata-url.yml
new file mode 100644
index 00000000000..01896ac82ce
--- /dev/null
+++ b/changelogs/unreleased/259840-composer-v2-metadata-url.yml
@@ -0,0 +1,5 @@
+---
+title: Support composer v2 metadata-url
+merge_request: 54906
+author:
+type: added
diff --git a/changelogs/unreleased/262859-restrict-oncall-rotation-to-interval.yml b/changelogs/unreleased/262859-restrict-oncall-rotation-to-interval.yml
new file mode 100644
index 00000000000..bb6ca6da372
--- /dev/null
+++ b/changelogs/unreleased/262859-restrict-oncall-rotation-to-interval.yml
@@ -0,0 +1,5 @@
+---
+title: Add active period columns to on-call rotations.
+merge_request: 52998
+author:
+type: added
diff --git a/changelogs/unreleased/262862-add-deleted-at-to-oncall-rotation-participant.yml b/changelogs/unreleased/262862-add-deleted-at-to-oncall-rotation-participant.yml
new file mode 100644
index 00000000000..d49fbdfdba6
--- /dev/null
+++ b/changelogs/unreleased/262862-add-deleted-at-to-oncall-rotation-participant.yml
@@ -0,0 +1,5 @@
+---
+title: Add is_removed column on Oncall Participant model
+merge_request: 54779
+author:
+type: added
diff --git a/changelogs/unreleased/263442_remove_recursive_approach_for_all_projects_feature_flag.yml b/changelogs/unreleased/263442_remove_recursive_approach_for_all_projects_feature_flag.yml
new file mode 100644
index 00000000000..828aedf350c
--- /dev/null
+++ b/changelogs/unreleased/263442_remove_recursive_approach_for_all_projects_feature_flag.yml
@@ -0,0 +1,5 @@
+---
+title: Use recursive approach to query all projects for a namespace
+merge_request: 55043
+author:
+type: performance
diff --git a/changelogs/unreleased/267511-approval-gate-rule-type.yml b/changelogs/unreleased/267511-approval-gate-rule-type.yml
new file mode 100644
index 00000000000..ebc2a7d80aa
--- /dev/null
+++ b/changelogs/unreleased/267511-approval-gate-rule-type.yml
@@ -0,0 +1,5 @@
+---
+title: Create ExternalApprovalRule table and associations
+merge_request: 54002
+author:
+type: added
diff --git a/changelogs/unreleased/268207_exclude_duplicates_from_emails_on_push_recipients_when_sending.yml b/changelogs/unreleased/268207_exclude_duplicates_from_emails_on_push_recipients_when_sending.yml
new file mode 100644
index 00000000000..7c68f52d18e
--- /dev/null
+++ b/changelogs/unreleased/268207_exclude_duplicates_from_emails_on_push_recipients_when_sending.yml
@@ -0,0 +1,5 @@
+---
+title: Exclude duplicates from emails on push recipients
+merge_request: 55588
+author:
+type: changed
diff --git a/changelogs/unreleased/273286-update-project-view-buttons.yml b/changelogs/unreleased/273286-update-project-view-buttons.yml
new file mode 100644
index 00000000000..9717c98bb03
--- /dev/null
+++ b/changelogs/unreleased/273286-update-project-view-buttons.yml
@@ -0,0 +1,5 @@
+---
+title: Update project page buttons to conform to design system
+merge_request: 53260
+author:
+type: changed
diff --git a/changelogs/unreleased/273292-fy21q4-foundations-kr2-audit-and-update-buttons-on-sessionscontrol.yml b/changelogs/unreleased/273292-fy21q4-foundations-kr2-audit-and-update-buttons-on-sessionscontrol.yml
new file mode 100644
index 00000000000..c6f180481bd
--- /dev/null
+++ b/changelogs/unreleased/273292-fy21q4-foundations-kr2-audit-and-update-buttons-on-sessionscontrol.yml
@@ -0,0 +1,6 @@
+---
+title: Update the Sign In button to use the new confirm button variant, migrate OAuth
+ buttons to use the default variant of GlButton.
+merge_request: 53254
+author:
+type: other
diff --git a/changelogs/unreleased/273294-fy21q4-foundations-kr2-audit-and-update-buttons-on-groupscontrolle.yml b/changelogs/unreleased/273294-fy21q4-foundations-kr2-audit-and-update-buttons-on-groupscontrolle.yml
new file mode 100644
index 00000000000..703d3639a7f
--- /dev/null
+++ b/changelogs/unreleased/273294-fy21q4-foundations-kr2-audit-and-update-buttons-on-groupscontrolle.yml
@@ -0,0 +1,6 @@
+---
+title: Update spacing between Notifications dropdown, New Subgroup button, and New Project buttons while using the new confirm variant instead of the deprecated success variant for the New Project button. Better left alignment of Notifications dropdown at smaller breakpoints.
+ variant
+merge_request: 55819
+author:
+type: other
diff --git a/changelogs/unreleased/273295-fy21q4-foundations-kr2-audit-and-update-buttons-on-userscontroller.yml b/changelogs/unreleased/273295-fy21q4-foundations-kr2-audit-and-update-buttons-on-userscontroller.yml
new file mode 100644
index 00000000000..72872c90b16
--- /dev/null
+++ b/changelogs/unreleased/273295-fy21q4-foundations-kr2-audit-and-update-buttons-on-userscontroller.yml
@@ -0,0 +1,5 @@
+---
+title: Reorder user profile actions and use the confirm variant for the follow button
+merge_request: 55999
+author:
+type: other
diff --git a/changelogs/unreleased/273296-fy21q4-foundations-kr2-audit-and-update-buttons-on-projects-jobsco.yml b/changelogs/unreleased/273296-fy21q4-foundations-kr2-audit-and-update-buttons-on-projects-jobsco.yml
new file mode 100644
index 00000000000..1f005d67d8b
--- /dev/null
+++ b/changelogs/unreleased/273296-fy21q4-foundations-kr2-audit-and-update-buttons-on-projects-jobsco.yml
@@ -0,0 +1,5 @@
+---
+title: Update buttons on a job page to conform to the Pajamas design system
+merge_request: 55858
+author:
+type: other
diff --git a/changelogs/unreleased/273574-fix-bad-projects-has_external_issue_tracker-data.yml b/changelogs/unreleased/273574-fix-bad-projects-has_external_issue_tracker-data.yml
new file mode 100644
index 00000000000..4d8f19a04fa
--- /dev/null
+++ b/changelogs/unreleased/273574-fix-bad-projects-has_external_issue_tracker-data.yml
@@ -0,0 +1,5 @@
+---
+title: Cleanup incorrect data in projects.has_external_issue_tracker
+merge_request: 53936
+author:
+type: fixed
diff --git a/changelogs/unreleased/275169-remove-service-desk-issue-prefix.yml b/changelogs/unreleased/275169-remove-service-desk-issue-prefix.yml
new file mode 100644
index 00000000000..9ac7247129b
--- /dev/null
+++ b/changelogs/unreleased/275169-remove-service-desk-issue-prefix.yml
@@ -0,0 +1,5 @@
+---
+title: Remove service desk issue prefix
+merge_request: 54140
+author: Lee Tickett @leetickett
+type: changed
diff --git a/changelogs/unreleased/275818-be-add-info-error-messages-to-security-widget-summary-diverged.yml b/changelogs/unreleased/275818-be-add-info-error-messages-to-security-widget-summary-diverged.yml
new file mode 100644
index 00000000000..c0fd71b3e58
--- /dev/null
+++ b/changelogs/unreleased/275818-be-add-info-error-messages-to-security-widget-summary-diverged.yml
@@ -0,0 +1,6 @@
+---
+title: Add divergedFromTargetBranch field to MergeRequestType to indicate the target
+ branch has diverged from the source branch
+merge_request: 53759
+author:
+type: changed
diff --git a/changelogs/unreleased/277327-fix-background-migration-argument-type.yml b/changelogs/unreleased/277327-fix-background-migration-argument-type.yml
new file mode 100644
index 00000000000..0a572fba951
--- /dev/null
+++ b/changelogs/unreleased/277327-fix-background-migration-argument-type.yml
@@ -0,0 +1,5 @@
+---
+title: Fix argument type for background migration
+merge_request: 55097
+author:
+type: fixed
diff --git a/changelogs/unreleased/284116-sync-or-remove-single-file-mode-user-preference.yml b/changelogs/unreleased/284116-sync-or-remove-single-file-mode-user-preference.yml
new file mode 100644
index 00000000000..1eddb7ab59e
--- /dev/null
+++ b/changelogs/unreleased/284116-sync-or-remove-single-file-mode-user-preference.yml
@@ -0,0 +1,5 @@
+---
+title: Support "view_diffs_file_by_file" param in the Users create and update API
+merge_request: 54595
+author:
+type: added
diff --git a/changelogs/unreleased/284392-use-info-style-for-merged-instead-of-primary.yml b/changelogs/unreleased/284392-use-info-style-for-merged-instead-of-primary.yml
new file mode 100644
index 00000000000..d307bbdcd58
--- /dev/null
+++ b/changelogs/unreleased/284392-use-info-style-for-merged-instead-of-primary.yml
@@ -0,0 +1,5 @@
+---
+title: Use info colour for merged search results instead of primary
+merge_request: 55008
+author:
+type: changed
diff --git a/changelogs/unreleased/285438-rename-instance-statistics-to-usage-trends.yml b/changelogs/unreleased/285438-rename-instance-statistics-to-usage-trends.yml
new file mode 100644
index 00000000000..7ab19331bfc
--- /dev/null
+++ b/changelogs/unreleased/285438-rename-instance-statistics-to-usage-trends.yml
@@ -0,0 +1,6 @@
+---
+title: Deprecate instanceStatisticsMeasurements in favor of usageTrendsMeasurements
+ GraphQL field
+merge_request: 54153
+author:
+type: changed
diff --git a/changelogs/unreleased/285467-package-registry-graphql-api.yml b/changelogs/unreleased/285467-package-registry-graphql-api.yml
new file mode 100644
index 00000000000..ce417f42073
--- /dev/null
+++ b/changelogs/unreleased/285467-package-registry-graphql-api.yml
@@ -0,0 +1,5 @@
+---
+title: Add package list to group graphql type
+merge_request: 54672
+author:
+type: added
diff --git a/changelogs/unreleased/288326-wiki-edit-page-title-s-styling-mismatch-2.yml b/changelogs/unreleased/288326-wiki-edit-page-title-s-styling-mismatch-2.yml
new file mode 100644
index 00000000000..8bf3a59872c
--- /dev/null
+++ b/changelogs/unreleased/288326-wiki-edit-page-title-s-styling-mismatch-2.yml
@@ -0,0 +1,5 @@
+---
+title: Make new issue title look like wiki
+merge_request: 50940
+author: Jacopo Beschi @jacopo-beschi
+type: changed
diff --git a/changelogs/unreleased/28902_extend_group_api.yml b/changelogs/unreleased/28902_extend_group_api.yml
new file mode 100644
index 00000000000..249ebb0039e
--- /dev/null
+++ b/changelogs/unreleased/28902_extend_group_api.yml
@@ -0,0 +1,5 @@
+---
+title: Add groups endpoint for Projects API
+merge_request: 53642
+author:
+type: added
diff --git a/changelogs/unreleased/290254-override-approvers-setting-does-not-reflect-actual-behavior.yml b/changelogs/unreleased/290254-override-approvers-setting-does-not-reflect-actual-behavior.yml
new file mode 100644
index 00000000000..92f6bfa5574
--- /dev/null
+++ b/changelogs/unreleased/290254-override-approvers-setting-does-not-reflect-actual-behavior.yml
@@ -0,0 +1,5 @@
+---
+title: Ensure Project Approvals API casts to boolean
+merge_request: 55492
+author:
+type: fixed
diff --git a/changelogs/unreleased/290288-composer-cache-build-pages-task.yml b/changelogs/unreleased/290288-composer-cache-build-pages-task.yml
new file mode 100644
index 00000000000..56df4303333
--- /dev/null
+++ b/changelogs/unreleased/290288-composer-cache-build-pages-task.yml
@@ -0,0 +1,5 @@
+---
+title: Add composer cache rake task
+merge_request: 53772
+author:
+type: added
diff --git a/changelogs/unreleased/290288-composer-cache-hooks.yml b/changelogs/unreleased/290288-composer-cache-hooks.yml
new file mode 100644
index 00000000000..d03ee6ebd14
--- /dev/null
+++ b/changelogs/unreleased/290288-composer-cache-hooks.yml
@@ -0,0 +1,5 @@
+---
+title: Composer cache update worker
+merge_request: 54551
+author:
+type: other
diff --git a/changelogs/unreleased/292128-fix-icon-spacing.yml b/changelogs/unreleased/292128-fix-icon-spacing.yml
new file mode 100644
index 00000000000..d832dc9beee
--- /dev/null
+++ b/changelogs/unreleased/292128-fix-icon-spacing.yml
@@ -0,0 +1,5 @@
+---
+title: Add space next to icons in epic issue list
+merge_request: 54138
+author: Yogi (@yo)
+type: fixed
diff --git a/changelogs/unreleased/292239-schedule-duplicate-findings-removal.yml b/changelogs/unreleased/292239-schedule-duplicate-findings-removal.yml
new file mode 100644
index 00000000000..2bba7b41836
--- /dev/null
+++ b/changelogs/unreleased/292239-schedule-duplicate-findings-removal.yml
@@ -0,0 +1,5 @@
+---
+title: Schedule removal of duplicate Findings
+merge_request: 55749
+author:
+type: other
diff --git a/changelogs/unreleased/292498-webid-extension.yml b/changelogs/unreleased/292498-webid-extension.yml
new file mode 100644
index 00000000000..f2e89b78e72
--- /dev/null
+++ b/changelogs/unreleased/292498-webid-extension.yml
@@ -0,0 +1,5 @@
+---
+title: Introduce WebIDE as an extension for Editor Lite
+merge_request: 51527
+author:
+type: changed
diff --git a/changelogs/unreleased/292602-remove-fetch_mirror_check_tags_changed-ff.yml b/changelogs/unreleased/292602-remove-fetch_mirror_check_tags_changed-ff.yml
new file mode 100644
index 00000000000..b55370ee108
--- /dev/null
+++ b/changelogs/unreleased/292602-remove-fetch_mirror_check_tags_changed-ff.yml
@@ -0,0 +1,5 @@
+---
+title: Improve pull mirroring performance
+merge_request: 54353
+author:
+type: performance
diff --git a/changelogs/unreleased/292824-track-assignee-reviewer-changes.yml b/changelogs/unreleased/292824-track-assignee-reviewer-changes.yml
new file mode 100644
index 00000000000..fd404fc80d5
--- /dev/null
+++ b/changelogs/unreleased/292824-track-assignee-reviewer-changes.yml
@@ -0,0 +1,5 @@
+---
+title: Add tracking to merge request assignees/reviewers changes
+merge_request: 55486
+author:
+type: other
diff --git a/changelogs/unreleased/292824-track-label-milestone-change.yml b/changelogs/unreleased/292824-track-label-milestone-change.yml
new file mode 100644
index 00000000000..4430cbda898
--- /dev/null
+++ b/changelogs/unreleased/292824-track-label-milestone-change.yml
@@ -0,0 +1,5 @@
+---
+title: Add tracking to merge request labels/milestone changes
+merge_request: 55484
+author:
+type: other
diff --git a/changelogs/unreleased/292824-track-mr-lock-changes.yml b/changelogs/unreleased/292824-track-mr-lock-changes.yml
new file mode 100644
index 00000000000..89102528aed
--- /dev/null
+++ b/changelogs/unreleased/292824-track-mr-lock-changes.yml
@@ -0,0 +1,5 @@
+---
+title: Track usage pings when MR gets locked/unlocked
+merge_request: 55069
+author:
+type: other
diff --git a/changelogs/unreleased/292824-track-mr-time-changes.yml b/changelogs/unreleased/292824-track-mr-time-changes.yml
new file mode 100644
index 00000000000..89721e8f8c5
--- /dev/null
+++ b/changelogs/unreleased/292824-track-mr-time-changes.yml
@@ -0,0 +1,5 @@
+---
+title: Add tracking to merge request time estimate/spent changes
+merge_request: 55046
+author:
+type: other
diff --git a/changelogs/unreleased/293655-de-emphasize-nested-reports-in-mr-widget.yml b/changelogs/unreleased/293655-de-emphasize-nested-reports-in-mr-widget.yml
new file mode 100644
index 00000000000..31d70210b17
--- /dev/null
+++ b/changelogs/unreleased/293655-de-emphasize-nested-reports-in-mr-widget.yml
@@ -0,0 +1,5 @@
+---
+title: Add styling to de-emphasize nested test reports in merge requests
+merge_request: 55001
+author:
+type: added
diff --git a/changelogs/unreleased/293921-wrap-iterations.yml b/changelogs/unreleased/293921-wrap-iterations.yml
new file mode 100644
index 00000000000..0b1c4de2642
--- /dev/null
+++ b/changelogs/unreleased/293921-wrap-iterations.yml
@@ -0,0 +1,5 @@
+---
+title: Add iterations_cadences table and respective model
+merge_request: 50707
+author:
+type: other
diff --git a/changelogs/unreleased/294436-create-project-required-fields.yml b/changelogs/unreleased/294436-create-project-required-fields.yml
new file mode 100644
index 00000000000..96f0ca574d9
--- /dev/null
+++ b/changelogs/unreleased/294436-create-project-required-fields.yml
@@ -0,0 +1,5 @@
+---
+title: Improve a11y of the new project form by marking required fields
+merge_request: 55682
+author:
+type: performance
diff --git a/changelogs/unreleased/294443-move-wiki-helper-error-to-vue.yml b/changelogs/unreleased/294443-move-wiki-helper-error-to-vue.yml
new file mode 100644
index 00000000000..d28401c2a2d
--- /dev/null
+++ b/changelogs/unreleased/294443-move-wiki-helper-error-to-vue.yml
@@ -0,0 +1,5 @@
+---
+title: Move wiki helper alert to Vue
+merge_request: 54517
+author:
+type: other
diff --git a/changelogs/unreleased/294482-conan-anonymous.yml b/changelogs/unreleased/294482-conan-anonymous.yml
new file mode 100644
index 00000000000..e6724264711
--- /dev/null
+++ b/changelogs/unreleased/294482-conan-anonymous.yml
@@ -0,0 +1,5 @@
+---
+title: Allow anonymous access to public Conan packages
+merge_request: 54047
+author: Steve Mokris @smokris
+type: changed
diff --git a/changelogs/unreleased/295665-fix-sidekiq-check.yml b/changelogs/unreleased/295665-fix-sidekiq-check.yml
new file mode 100644
index 00000000000..1afe8142289
--- /dev/null
+++ b/changelogs/unreleased/295665-fix-sidekiq-check.yml
@@ -0,0 +1,5 @@
+---
+title: Fix Sidekiq system check for cluster mode
+merge_request: 55530
+author: Horst Prote
+type: other
diff --git a/changelogs/unreleased/296125-show-timeline-for-devops-score.yml b/changelogs/unreleased/296125-show-timeline-for-devops-score.yml
new file mode 100644
index 00000000000..76d60982f57
--- /dev/null
+++ b/changelogs/unreleased/296125-show-timeline-for-devops-score.yml
@@ -0,0 +1,5 @@
+---
+title: Add more explanation about the presented data and show the last updated time on the DevOps Score page
+merge_request: 55357
+author:
+type: added
diff --git a/changelogs/unreleased/296945-update-the-container-registry-ui-header-copy-to-remove-expiration-.yml b/changelogs/unreleased/296945-update-the-container-registry-ui-header-copy-to-remove-expiration-.yml
new file mode 100644
index 00000000000..cc9dec724ef
--- /dev/null
+++ b/changelogs/unreleased/296945-update-the-container-registry-ui-header-copy-to-remove-expiration-.yml
@@ -0,0 +1,5 @@
+---
+title: Remove Expiration Policy text from container registry header
+merge_request: 54665
+author:
+type: changed
diff --git a/changelogs/unreleased/297020-linux-distribution-details-in-usage-ping.yml b/changelogs/unreleased/297020-linux-distribution-details-in-usage-ping.yml
new file mode 100644
index 00000000000..644973f4b01
--- /dev/null
+++ b/changelogs/unreleased/297020-linux-distribution-details-in-usage-ping.yml
@@ -0,0 +1,5 @@
+---
+title: Add Operating System details to usage ping
+merge_request: 54778
+author:
+type: added
diff --git a/changelogs/unreleased/297240-enable-skip_dag_manual_and_delayed_jobs.yml b/changelogs/unreleased/297240-enable-skip_dag_manual_and_delayed_jobs.yml
new file mode 100644
index 00000000000..8c83a73fdfd
--- /dev/null
+++ b/changelogs/unreleased/297240-enable-skip_dag_manual_and_delayed_jobs.yml
@@ -0,0 +1,5 @@
+---
+title: Fix not skipped manual and delayed DAG jobs
+merge_request: 54073
+author:
+type: fixed
diff --git a/changelogs/unreleased/297404-remove-suggestions-custom-commit-ff.yml b/changelogs/unreleased/297404-remove-suggestions-custom-commit-ff.yml
new file mode 100644
index 00000000000..cb5e7bbdf8b
--- /dev/null
+++ b/changelogs/unreleased/297404-remove-suggestions-custom-commit-ff.yml
@@ -0,0 +1,5 @@
+---
+title: Remove suggestions custom commit feature flag
+merge_request: 55344
+author:
+type: changed
diff --git a/changelogs/unreleased/297428-code-owner-optional-section.yml b/changelogs/unreleased/297428-code-owner-optional-section.yml
new file mode 100644
index 00000000000..7de07ee38e6
--- /dev/null
+++ b/changelogs/unreleased/297428-code-owner-optional-section.yml
@@ -0,0 +1,5 @@
+---
+title: Update code owner approval tooltip message
+merge_request: 55842
+author:
+type: changed
diff --git a/changelogs/unreleased/298827-graphql-getting-mr-diff-discussions-often-returns-500.yml b/changelogs/unreleased/298827-graphql-getting-mr-diff-discussions-often-returns-500.yml
new file mode 100644
index 00000000000..c994a7d11aa
--- /dev/null
+++ b/changelogs/unreleased/298827-graphql-getting-mr-diff-discussions-often-returns-500.yml
@@ -0,0 +1,5 @@
+---
+title: fix stringify empty position object
+merge_request: 56037
+author:
+type: fixed
diff --git a/changelogs/unreleased/299034-group-group-links-project-authorizations-refresh-can-be-limited-to.yml b/changelogs/unreleased/299034-group-group-links-project-authorizations-refresh-can-be-limited-to.yml
new file mode 100644
index 00000000000..cb64ea9f16a
--- /dev/null
+++ b/changelogs/unreleased/299034-group-group-links-project-authorizations-refresh-can-be-limited-to.yml
@@ -0,0 +1,6 @@
+---
+title: Limit Project Authorizations refresh for shared groups only to direct members
+ of the group being shared with
+merge_request: 51869
+author:
+type: performance
diff --git a/changelogs/unreleased/299884_remove_diff_highlighting_feature_flag.yml b/changelogs/unreleased/299884_remove_diff_highlighting_feature_flag.yml
new file mode 100644
index 00000000000..4ce01f2dd48
--- /dev/null
+++ b/changelogs/unreleased/299884_remove_diff_highlighting_feature_flag.yml
@@ -0,0 +1,5 @@
+---
+title: Remove improved_merge_diff_highlighting feature flag
+merge_request: 55771
+author:
+type: added
diff --git a/changelogs/unreleased/299895-experiment-cleanup-customize_homepage-banner.yml b/changelogs/unreleased/299895-experiment-cleanup-customize_homepage-banner.yml
new file mode 100644
index 00000000000..07752ef9f78
--- /dev/null
+++ b/changelogs/unreleased/299895-experiment-cleanup-customize_homepage-banner.yml
@@ -0,0 +1,5 @@
+---
+title: Enable customize homepage banner by default
+merge_request: 54357
+author:
+type: added
diff --git a/changelogs/unreleased/300021-rollout-serving-migrated-data-feature-flag-pages_serve_from_migrat.yml b/changelogs/unreleased/300021-rollout-serving-migrated-data-feature-flag-pages_serve_from_migrat.yml
new file mode 100644
index 00000000000..261cbdf516e
--- /dev/null
+++ b/changelogs/unreleased/300021-rollout-serving-migrated-data-feature-flag-pages_serve_from_migrat.yml
@@ -0,0 +1,5 @@
+---
+title: Enable serving GitLab Pages sites migrated to zip storage
+merge_request: 55847
+author:
+type: added
diff --git a/changelogs/unreleased/30010-graphql-doc.yml b/changelogs/unreleased/30010-graphql-doc.yml
new file mode 100644
index 00000000000..bc4757e4c24
--- /dev/null
+++ b/changelogs/unreleased/30010-graphql-doc.yml
@@ -0,0 +1,5 @@
+---
+title: Add documentation for graphQL queries
+merge_request: 54302
+author:
+type: other
diff --git a/changelogs/unreleased/300150-cache-search-tab-counters.yml b/changelogs/unreleased/300150-cache-search-tab-counters.yml
new file mode 100644
index 00000000000..8ed84148142
--- /dev/null
+++ b/changelogs/unreleased/300150-cache-search-tab-counters.yml
@@ -0,0 +1,5 @@
+---
+title: Cache /search/count requests in the browser
+merge_request: 55036
+author:
+type: performance
diff --git a/changelogs/unreleased/300302-db-constraint-terraform-name.yml b/changelogs/unreleased/300302-db-constraint-terraform-name.yml
new file mode 100644
index 00000000000..bbbe52224fb
--- /dev/null
+++ b/changelogs/unreleased/300302-db-constraint-terraform-name.yml
@@ -0,0 +1,5 @@
+---
+title: Added non-null constraint to terraform state name
+merge_request: 54940
+author:
+type: changed
diff --git a/changelogs/unreleased/300417-agent-token-description.yml b/changelogs/unreleased/300417-agent-token-description.yml
new file mode 100644
index 00000000000..2ec438ac75f
--- /dev/null
+++ b/changelogs/unreleased/300417-agent-token-description.yml
@@ -0,0 +1,5 @@
+---
+title: Add description field to cluster agent token
+merge_request: 54091
+author:
+type: changed
diff --git a/changelogs/unreleased/300435-add-label.yml b/changelogs/unreleased/300435-add-label.yml
new file mode 100644
index 00000000000..544ae90a238
--- /dev/null
+++ b/changelogs/unreleased/300435-add-label.yml
@@ -0,0 +1,5 @@
+---
+title: Add GlToggle label in sidebar subscription toggle
+merge_request: 54548
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/300443-add-label.yml b/changelogs/unreleased/300443-add-label.yml
new file mode 100644
index 00000000000..93694ba5ad3
--- /dev/null
+++ b/changelogs/unreleased/300443-add-label.yml
@@ -0,0 +1,5 @@
+---
+title: Add GlToggle label in edit feature flag
+merge_request: 54546
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/300458-send-gitlab_standard-context-with-requirements-events-from-the-fro.yml b/changelogs/unreleased/300458-send-gitlab_standard-context-with-requirements-events-from-the-fro.yml
new file mode 100644
index 00000000000..8f05ba746f7
--- /dev/null
+++ b/changelogs/unreleased/300458-send-gitlab_standard-context-with-requirements-events-from-the-fro.yml
@@ -0,0 +1,5 @@
+---
+title: Send gitlab_standard context with events from the frontend
+merge_request: 52959
+author:
+type: changed
diff --git a/changelogs/unreleased/300479-change-prefilled-mr-title-description.yml b/changelogs/unreleased/300479-change-prefilled-mr-title-description.yml
new file mode 100644
index 00000000000..6b360bde0ae
--- /dev/null
+++ b/changelogs/unreleased/300479-change-prefilled-mr-title-description.yml
@@ -0,0 +1,5 @@
+---
+title: Prefill first multiline commit message for new MRs
+merge_request: 52984
+author: Max Coplan @vegerot
+type: changed
diff --git a/changelogs/unreleased/300617-aqualls-prometheus-settings.yml b/changelogs/unreleased/300617-aqualls-prometheus-settings.yml
new file mode 100644
index 00000000000..7b2e6d43d9b
--- /dev/null
+++ b/changelogs/unreleased/300617-aqualls-prometheus-settings.yml
@@ -0,0 +1,5 @@
+---
+title: Updated UI text to match style guidelines
+merge_request: 53179
+author:
+type: other
diff --git a/changelogs/unreleased/300654-refactor-confidentiality-sidebar-component-to-use-vue-apollo.yml b/changelogs/unreleased/300654-refactor-confidentiality-sidebar-component-to-use-vue-apollo.yml
new file mode 100644
index 00000000000..4c26e6db2f6
--- /dev/null
+++ b/changelogs/unreleased/300654-refactor-confidentiality-sidebar-component-to-use-vue-apollo.yml
@@ -0,0 +1,5 @@
+---
+title: Sidebar confidentiality component updates in real-time
+merge_request: 53858
+author:
+type: changed
diff --git a/changelogs/unreleased/300714-provide-name-of-expiring-token-in-personal-access-token-expiration.yml b/changelogs/unreleased/300714-provide-name-of-expiring-token-in-personal-access-token-expiration.yml
new file mode 100644
index 00000000000..8ecf876eab7
--- /dev/null
+++ b/changelogs/unreleased/300714-provide-name-of-expiring-token-in-personal-access-token-expiration.yml
@@ -0,0 +1,5 @@
+---
+title: Provide name of expiring token in personal access token expiration mail
+merge_request: 53766
+author:
+type: changed
diff --git a/changelogs/unreleased/300750-add-missing-reviewers-information-to-closed-merge-request-email.yml b/changelogs/unreleased/300750-add-missing-reviewers-information-to-closed-merge-request-email.yml
new file mode 100644
index 00000000000..814b4280ed2
--- /dev/null
+++ b/changelogs/unreleased/300750-add-missing-reviewers-information-to-closed-merge-request-email.yml
@@ -0,0 +1,5 @@
+---
+title: Add reviewers detail to text version of closed merge request email
+merge_request: 55594
+author:
+type: added
diff --git a/changelogs/unreleased/300750-add-missing-reviewers-information-to-merge-request-email-notificat.yml b/changelogs/unreleased/300750-add-missing-reviewers-information-to-merge-request-email-notificat.yml
new file mode 100644
index 00000000000..5b23c6204b6
--- /dev/null
+++ b/changelogs/unreleased/300750-add-missing-reviewers-information-to-merge-request-email-notificat.yml
@@ -0,0 +1,5 @@
+---
+title: Add reviewers detail to merge when pipeline succeeds email
+merge_request: 55463
+author:
+type: added
diff --git a/changelogs/unreleased/300750-add-missing-reviewers-information-to-merge_request_status_email.yml b/changelogs/unreleased/300750-add-missing-reviewers-information-to-merge_request_status_email.yml
new file mode 100644
index 00000000000..83712f4b799
--- /dev/null
+++ b/changelogs/unreleased/300750-add-missing-reviewers-information-to-merge_request_status_email.yml
@@ -0,0 +1,5 @@
+---
+title: Add reviewers detail to merge request status email
+merge_request: 55584
+author:
+type: added
diff --git a/changelogs/unreleased/300750-add-missing-reviewers-information-to-merge_request_unmergeable_ema.yml b/changelogs/unreleased/300750-add-missing-reviewers-information-to-merge_request_unmergeable_ema.yml
new file mode 100644
index 00000000000..1b0656d8777
--- /dev/null
+++ b/changelogs/unreleased/300750-add-missing-reviewers-information-to-merge_request_unmergeable_ema.yml
@@ -0,0 +1,5 @@
+---
+title: Add reviewers detail to merge request unmergeable email
+merge_request: 55582
+author:
+type: added
diff --git a/changelogs/unreleased/300750-add-missing-reviewers-information-to-merged-merge-request-email.yml b/changelogs/unreleased/300750-add-missing-reviewers-information-to-merged-merge-request-email.yml
new file mode 100644
index 00000000000..e0ab1b8153f
--- /dev/null
+++ b/changelogs/unreleased/300750-add-missing-reviewers-information-to-merged-merge-request-email.yml
@@ -0,0 +1,5 @@
+---
+title: Add reviewers detail to merged merge request email
+merge_request: 55589
+author:
+type: added
diff --git a/changelogs/unreleased/300750-add-missing-reviewers-information-to-new_mention_in_merge_request_.yml b/changelogs/unreleased/300750-add-missing-reviewers-information-to-new_mention_in_merge_request_.yml
new file mode 100644
index 00000000000..899eb1f6784
--- /dev/null
+++ b/changelogs/unreleased/300750-add-missing-reviewers-information-to-new_mention_in_merge_request_.yml
@@ -0,0 +1,5 @@
+---
+title: Add reviewers detail to new mention in merge request email
+merge_request: 56184
+author:
+type: added
diff --git a/changelogs/unreleased/300750-merge-request-email-notifications-don-t-include-reviewer-informati.yml b/changelogs/unreleased/300750-merge-request-email-notifications-don-t-include-reviewer-informati.yml
new file mode 100644
index 00000000000..f8dc5102854
--- /dev/null
+++ b/changelogs/unreleased/300750-merge-request-email-notifications-don-t-include-reviewer-informati.yml
@@ -0,0 +1,5 @@
+---
+title: Add reviewers detail to new merge request email
+merge_request: 54781
+author:
+type: added
diff --git a/changelogs/unreleased/300787-clean-up-block-class-for-jobs-feature.yml b/changelogs/unreleased/300787-clean-up-block-class-for-jobs-feature.yml
new file mode 100644
index 00000000000..1b8daefa223
--- /dev/null
+++ b/changelogs/unreleased/300787-clean-up-block-class-for-jobs-feature.yml
@@ -0,0 +1,5 @@
+---
+title: Adjust debug button icon size in job detail page
+merge_request: 55886
+author:
+type: changed
diff --git a/changelogs/unreleased/300827-alerts-integrations-UX-cleanup-2nd-part.yml b/changelogs/unreleased/300827-alerts-integrations-UX-cleanup-2nd-part.yml
new file mode 100644
index 00000000000..2b9278a1c16
--- /dev/null
+++ b/changelogs/unreleased/300827-alerts-integrations-UX-cleanup-2nd-part.yml
@@ -0,0 +1,5 @@
+---
+title: Alert integrations UX cleanup
+merge_request: 55786
+author:
+type: changed
diff --git a/changelogs/unreleased/300827-split-alert-integrations-form.yml b/changelogs/unreleased/300827-split-alert-integrations-form.yml
new file mode 100644
index 00000000000..8825f2908d1
--- /dev/null
+++ b/changelogs/unreleased/300827-split-alert-integrations-form.yml
@@ -0,0 +1,5 @@
+---
+title: Regroup alerts integration form into tabs
+merge_request: 54842
+author:
+type: changed
diff --git a/changelogs/unreleased/300853-convert-compare-show-to-vue.yml b/changelogs/unreleased/300853-convert-compare-show-to-vue.yml
new file mode 100644
index 00000000000..2926ef2682b
--- /dev/null
+++ b/changelogs/unreleased/300853-convert-compare-show-to-vue.yml
@@ -0,0 +1,5 @@
+---
+title: Restyle the repository compare show page
+merge_request: 53523
+author:
+type: changed
diff --git a/changelogs/unreleased/300865-default-confidentiality-of-replies.yml b/changelogs/unreleased/300865-default-confidentiality-of-replies.yml
new file mode 100644
index 00000000000..3a4e2531d3e
--- /dev/null
+++ b/changelogs/unreleased/300865-default-confidentiality-of-replies.yml
@@ -0,0 +1,5 @@
+---
+title: Default confidentiality of replies
+merge_request: 54122
+author: Lee Tickett @leetickett
+type: added
diff --git a/changelogs/unreleased/301018-cablett-collapsed-epic-board-list.yml b/changelogs/unreleased/301018-cablett-collapsed-epic-board-list.yml
new file mode 100644
index 00000000000..89862375316
--- /dev/null
+++ b/changelogs/unreleased/301018-cablett-collapsed-epic-board-list.yml
@@ -0,0 +1,5 @@
+---
+title: Expose epic board list collapsed value via GraphQL
+merge_request: 54541
+author:
+type: added
diff --git a/changelogs/unreleased/301032-license-creation-via-api.yml b/changelogs/unreleased/301032-license-creation-via-api.yml
new file mode 100644
index 00000000000..a16d1442981
--- /dev/null
+++ b/changelogs/unreleased/301032-license-creation-via-api.yml
@@ -0,0 +1,5 @@
+---
+title: Hide repeated trial offers on self-hosted instances
+merge_request: 54550
+author:
+type: fixed
diff --git a/changelogs/unreleased/301056-make-the-geo-oauth-application-trusted-by-default.yml b/changelogs/unreleased/301056-make-the-geo-oauth-application-trusted-by-default.yml
new file mode 100644
index 00000000000..4215b6620b1
--- /dev/null
+++ b/changelogs/unreleased/301056-make-the-geo-oauth-application-trusted-by-default.yml
@@ -0,0 +1,5 @@
+---
+title: Make the Geo OAuth application trusted by default
+merge_request: 54079
+author:
+type: changed
diff --git a/changelogs/unreleased/320746-update-the-package-list-item-ui-make-action-buttons-in-list-items-.yml b/changelogs/unreleased/320746-update-the-package-list-item-ui-make-action-buttons-in-list-items-.yml
new file mode 100644
index 00000000000..795f54f8fa1
--- /dev/null
+++ b/changelogs/unreleased/320746-update-the-package-list-item-ui-make-action-buttons-in-list-items-.yml
@@ -0,0 +1,5 @@
+---
+title: 'Registry: make delete icon buttons secondary'
+merge_request: 54545
+author:
+type: changed
diff --git a/changelogs/unreleased/320901-container-page-says-image-repository-not-found.yml b/changelogs/unreleased/320901-container-page-says-image-repository-not-found.yml
new file mode 100644
index 00000000000..a9494b43b2e
--- /dev/null
+++ b/changelogs/unreleased/320901-container-page-says-image-repository-not-found.yml
@@ -0,0 +1,5 @@
+---
+title: Use Root Image for images with missing name
+merge_request: 54693
+author:
+type: changed
diff --git a/changelogs/unreleased/320949-ci-help-path-remove-prop.yml b/changelogs/unreleased/320949-ci-help-path-remove-prop.yml
new file mode 100644
index 00000000000..62cf0b2de64
--- /dev/null
+++ b/changelogs/unreleased/320949-ci-help-path-remove-prop.yml
@@ -0,0 +1,5 @@
+---
+title: Update 'Get Started with CI/CD' button with latest URL
+merge_request: 54344
+author:
+type: changed
diff --git a/changelogs/unreleased/321027-enable-ci_trigger_payload_into_pipeline.yml b/changelogs/unreleased/321027-enable-ci_trigger_payload_into_pipeline.yml
new file mode 100644
index 00000000000..b42836a2011
--- /dev/null
+++ b/changelogs/unreleased/321027-enable-ci_trigger_payload_into_pipeline.yml
@@ -0,0 +1,5 @@
+---
+title: Implement passing trigger payload into pipeline variable
+merge_request: 54544
+author:
+type: added
diff --git a/changelogs/unreleased/321054-enable-quick-actions-usage-data.yml b/changelogs/unreleased/321054-enable-quick-actions-usage-data.yml
new file mode 100644
index 00000000000..759d5375cc6
--- /dev/null
+++ b/changelogs/unreleased/321054-enable-quick-actions-usage-data.yml
@@ -0,0 +1,5 @@
+---
+title: Add quick action data to usage ping
+merge_request: 54293
+author:
+type: other
diff --git a/changelogs/unreleased/321057-refine-the-user-interface-related-to-package-lists-and-the-search-.yml b/changelogs/unreleased/321057-refine-the-user-interface-related-to-package-lists-and-the-search-.yml
new file mode 100644
index 00000000000..fea15e883f3
--- /dev/null
+++ b/changelogs/unreleased/321057-refine-the-user-interface-related-to-package-lists-and-the-search-.yml
@@ -0,0 +1,5 @@
+---
+title: Refine Registry Lists and Search Bar UI
+merge_request: 54549
+author:
+type: changed
diff --git a/changelogs/unreleased/321185-experiment-cleanup-invite_members_version_a-add-invite-members-to-.yml b/changelogs/unreleased/321185-experiment-cleanup-invite_members_version_a-add-invite-members-to-.yml
new file mode 100644
index 00000000000..6dc3c991128
--- /dev/null
+++ b/changelogs/unreleased/321185-experiment-cleanup-invite_members_version_a-add-invite-members-to-.yml
@@ -0,0 +1,5 @@
+---
+title: Cleanup invite_members_version_a experiment
+merge_request: 55178
+author:
+type: added
diff --git a/changelogs/unreleased/321283-update-kubernetes-version-supported.yml b/changelogs/unreleased/321283-update-kubernetes-version-supported.yml
new file mode 100644
index 00000000000..66cd57ff2a5
--- /dev/null
+++ b/changelogs/unreleased/321283-update-kubernetes-version-supported.yml
@@ -0,0 +1,5 @@
+---
+title: Update k8s version for EKS cluster
+merge_request: 54389
+author: Vincent Firmin @winkies
+type: fixed
diff --git a/changelogs/unreleased/321297-load-only-metadata-for-markdown-video-include.yml b/changelogs/unreleased/321297-load-only-metadata-for-markdown-video-include.yml
new file mode 100644
index 00000000000..74e9bc68e6e
--- /dev/null
+++ b/changelogs/unreleased/321297-load-only-metadata-for-markdown-video-include.yml
@@ -0,0 +1,5 @@
+---
+title: Add preload attribute to markdown videos
+merge_request: 54350
+author:
+type: performance
diff --git a/changelogs/unreleased/321372-feature-flag-rollout-of-vue_notification_dropdown.yml b/changelogs/unreleased/321372-feature-flag-rollout-of-vue_notification_dropdown.yml
new file mode 100644
index 00000000000..02cd7ab47b6
--- /dev/null
+++ b/changelogs/unreleased/321372-feature-flag-rollout-of-vue_notification_dropdown.yml
@@ -0,0 +1,5 @@
+---
+title: Add Vue notifications dropdown component
+merge_request: 54422
+author:
+type: other
diff --git a/changelogs/unreleased/321420-spell-npm-with-lowercase-letters-in-package-registry-ui.yml b/changelogs/unreleased/321420-spell-npm-with-lowercase-letters-in-package-registry-ui.yml
new file mode 100644
index 00000000000..c3db475ff87
--- /dev/null
+++ b/changelogs/unreleased/321420-spell-npm-with-lowercase-letters-in-package-registry-ui.yml
@@ -0,0 +1,5 @@
+---
+title: Spell "npm" with lowercase letters in Package Registry UI
+merge_request: 54163
+author: Simon Stieger @sim0
+type: other
diff --git a/changelogs/unreleased/321488-mr-changes-view-render-version-dropdowns-above-navbar.yml b/changelogs/unreleased/321488-mr-changes-view-render-version-dropdowns-above-navbar.yml
new file mode 100644
index 00000000000..101ab1bfffc
--- /dev/null
+++ b/changelogs/unreleased/321488-mr-changes-view-render-version-dropdowns-above-navbar.yml
@@ -0,0 +1,5 @@
+---
+title: Render version dropdowns in MR changes view above tab navbar
+merge_request: 54159
+author: Simon Stieger @sim0
+type: fixed
diff --git a/changelogs/unreleased/321514-fix-clipboard-buttons.yml b/changelogs/unreleased/321514-fix-clipboard-buttons.yml
new file mode 100644
index 00000000000..b7a27104c7a
--- /dev/null
+++ b/changelogs/unreleased/321514-fix-clipboard-buttons.yml
@@ -0,0 +1,5 @@
+---
+title: Fix copy to clipboard tooltip button
+merge_request: 54472
+author:
+type: fixed
diff --git a/changelogs/unreleased/321593-hide-issue-counts-in-project-list-where-issues-disabled.yml b/changelogs/unreleased/321593-hide-issue-counts-in-project-list-where-issues-disabled.yml
new file mode 100644
index 00000000000..7d53db8fa13
--- /dev/null
+++ b/changelogs/unreleased/321593-hide-issue-counts-in-project-list-where-issues-disabled.yml
@@ -0,0 +1,5 @@
+---
+title: Hide issue count and link in project list for projects with disabled issues
+merge_request: 54275
+author: Simon Stieger @sim0
+type: fixed
diff --git a/changelogs/unreleased/321659-handle-discord-errors.yml b/changelogs/unreleased/321659-handle-discord-errors.yml
new file mode 100644
index 00000000000..2bf969dd8b0
--- /dev/null
+++ b/changelogs/unreleased/321659-handle-discord-errors.yml
@@ -0,0 +1,5 @@
+---
+title: Handle RestClient errors in Discord integration
+merge_request: 56112
+author:
+type: fixed
diff --git a/changelogs/unreleased/321667-follow-first.yml b/changelogs/unreleased/321667-follow-first.yml
new file mode 100644
index 00000000000..e0670e58fa5
--- /dev/null
+++ b/changelogs/unreleased/321667-follow-first.yml
@@ -0,0 +1,5 @@
+---
+title: Show user follow button first instead of center
+merge_request: 54326
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/321677-enable-pages-zip-file-protocol-by-default.yml b/changelogs/unreleased/321677-enable-pages-zip-file-protocol-by-default.yml
new file mode 100644
index 00000000000..b745c40c932
--- /dev/null
+++ b/changelogs/unreleased/321677-enable-pages-zip-file-protocol-by-default.yml
@@ -0,0 +1,5 @@
+---
+title: Enable pages_serve_with_zip_file_protocol by default
+merge_request: 54650
+author:
+type: changed
diff --git a/changelogs/unreleased/321745-remove-temporary-index-idx_on_issues_where_service_desk_reply_to_i.yml b/changelogs/unreleased/321745-remove-temporary-index-idx_on_issues_where_service_desk_reply_to_i.yml
new file mode 100644
index 00000000000..ae68dcc1824
--- /dev/null
+++ b/changelogs/unreleased/321745-remove-temporary-index-idx_on_issues_where_service_desk_reply_to_i.yml
@@ -0,0 +1,5 @@
+---
+title: Remove temporary index on issues
+merge_request: 54387
+author: Lee Tickett @leetickett
+type: other
diff --git a/changelogs/unreleased/321752-cablett-delete-epic-warning.yml b/changelogs/unreleased/321752-cablett-delete-epic-warning.yml
new file mode 100644
index 00000000000..6ca739c60b7
--- /dev/null
+++ b/changelogs/unreleased/321752-cablett-delete-epic-warning.yml
@@ -0,0 +1,5 @@
+---
+title: Clarify epic delete warning
+merge_request: 55574
+author:
+type: changed
diff --git a/changelogs/unreleased/321788-fix-n-plus-1s.yml b/changelogs/unreleased/321788-fix-n-plus-1s.yml
new file mode 100644
index 00000000000..93246bc5988
--- /dev/null
+++ b/changelogs/unreleased/321788-fix-n-plus-1s.yml
@@ -0,0 +1,5 @@
+---
+title: Fix N+1s related to per-build metadata lookups
+merge_request: 55053
+author:
+type: performance
diff --git a/changelogs/unreleased/321790-load-refs-on-demand.yml b/changelogs/unreleased/321790-load-refs-on-demand.yml
new file mode 100644
index 00000000000..c20ad02500d
--- /dev/null
+++ b/changelogs/unreleased/321790-load-refs-on-demand.yml
@@ -0,0 +1,5 @@
+---
+title: Improve performance of manual pipeline form by limiting the refs loaded on page load.
+merge_request: 55394
+author:
+type: performance
diff --git a/changelogs/unreleased/321827-fix-n-1-in-runner-validations.yml b/changelogs/unreleased/321827-fix-n-1-in-runner-validations.yml
new file mode 100644
index 00000000000..0fff3673afd
--- /dev/null
+++ b/changelogs/unreleased/321827-fix-n-1-in-runner-validations.yml
@@ -0,0 +1,5 @@
+---
+title: Improve performance of validations when a group has a lot of runners
+merge_request: 54774
+author:
+type: performance
diff --git a/changelogs/unreleased/321834-fj-remove-nil-values-from-snippet-blobs.yml b/changelogs/unreleased/321834-fj-remove-nil-values-from-snippet-blobs.yml
new file mode 100644
index 00000000000..ffbe850246e
--- /dev/null
+++ b/changelogs/unreleased/321834-fj-remove-nil-values-from-snippet-blobs.yml
@@ -0,0 +1,5 @@
+---
+title: Fix bug when snippet blobs array contain a nil value
+merge_request: 54552
+author:
+type: fixed
diff --git a/changelogs/unreleased/321845-performance-pipeline-table-dropdowns.yml b/changelogs/unreleased/321845-performance-pipeline-table-dropdowns.yml
new file mode 100644
index 00000000000..0fac7a05f7a
--- /dev/null
+++ b/changelogs/unreleased/321845-performance-pipeline-table-dropdowns.yml
@@ -0,0 +1,5 @@
+---
+title: Reduce elements in Pipeline page dropdowns with lazy
+merge_request: 54674
+author:
+type: changed
diff --git a/changelogs/unreleased/321862_fix_long_commit_messages_error.yml b/changelogs/unreleased/321862_fix_long_commit_messages_error.yml
new file mode 100644
index 00000000000..f21c864b7ed
--- /dev/null
+++ b/changelogs/unreleased/321862_fix_long_commit_messages_error.yml
@@ -0,0 +1,5 @@
+---
+title: Fix 500 error for long commit messages
+merge_request: 55320
+author:
+type: fixed
diff --git a/changelogs/unreleased/321917_introduce_info_column_for_the_security_scans_table.yml b/changelogs/unreleased/321917_introduce_info_column_for_the_security_scans_table.yml
new file mode 100644
index 00000000000..761bd7970c4
--- /dev/null
+++ b/changelogs/unreleased/321917_introduce_info_column_for_the_security_scans_table.yml
@@ -0,0 +1,5 @@
+---
+title: "Introduce `info` column for the `security_scans` table"
+merge_request: 55983
+author:
+type: added
diff --git a/changelogs/unreleased/321929-fix-dark-mode-app-header-on-profile-preferences-page.yml b/changelogs/unreleased/321929-fix-dark-mode-app-header-on-profile-preferences-page.yml
new file mode 100644
index 00000000000..9d2647b3904
--- /dev/null
+++ b/changelogs/unreleased/321929-fix-dark-mode-app-header-on-profile-preferences-page.yml
@@ -0,0 +1,5 @@
+---
+title: Correctly style Dark Mode application header in profile preferences
+merge_request: 54575
+author: Simon Stieger @sim0
+type: fixed
diff --git a/changelogs/unreleased/321939-fix-error-when-rendering-project-pipeline.yml b/changelogs/unreleased/321939-fix-error-when-rendering-project-pipeline.yml
new file mode 100644
index 00000000000..06ee0f27cc0
--- /dev/null
+++ b/changelogs/unreleased/321939-fix-error-when-rendering-project-pipeline.yml
@@ -0,0 +1,5 @@
+---
+title: Fix rendering of projects when the last pipeline changes during rendering
+merge_request: 54651
+author:
+type: fixed
diff --git a/changelogs/unreleased/321958-fix-npm-instance-level-api-with-scoped-packages.yml b/changelogs/unreleased/321958-fix-npm-instance-level-api-with-scoped-packages.yml
new file mode 100644
index 00000000000..2a1ca8c7845
--- /dev/null
+++ b/changelogs/unreleased/321958-fix-npm-instance-level-api-with-scoped-packages.yml
@@ -0,0 +1,5 @@
+---
+title: Fix the npm instance level API to exclude subgroups
+merge_request: 54554
+author:
+type: fixed
diff --git a/changelogs/unreleased/322019-iterations-list-and-report-views-missing-left-sidebar-status.yml b/changelogs/unreleased/322019-iterations-list-and-report-views-missing-left-sidebar-status.yml
new file mode 100644
index 00000000000..48e391e7b32
--- /dev/null
+++ b/changelogs/unreleased/322019-iterations-list-and-report-views-missing-left-sidebar-status.yml
@@ -0,0 +1,5 @@
+---
+title: Expand left sidebar `Issues` when viewing project iterations
+merge_request: 54815
+author:
+type: fixed
diff --git a/changelogs/unreleased/322059-remove-api_v3_repos_events_optimization-flag.yml b/changelogs/unreleased/322059-remove-api_v3_repos_events_optimization-flag.yml
new file mode 100644
index 00000000000..dafad2cb1eb
--- /dev/null
+++ b/changelogs/unreleased/322059-remove-api_v3_repos_events_optimization-flag.yml
@@ -0,0 +1,5 @@
+---
+title: Fix N+1 queries in api/v3/repos/:namespace/:project/events endpoint
+merge_request: 55442
+author:
+type: performance
diff --git a/changelogs/unreleased/322082-fix-invite-member-modal-dropdown-styling.yml b/changelogs/unreleased/322082-fix-invite-member-modal-dropdown-styling.yml
new file mode 100644
index 00000000000..9767730bd45
--- /dev/null
+++ b/changelogs/unreleased/322082-fix-invite-member-modal-dropdown-styling.yml
@@ -0,0 +1,5 @@
+---
+title: Fix invite member modal dropdown checkbox styling
+merge_request: 55832
+author: Kev @KevSlashNull
+type: fixed
diff --git a/changelogs/unreleased/322098-limit-projectauthorizations-refresh-jobs-to-distinct-users.yml b/changelogs/unreleased/322098-limit-projectauthorizations-refresh-jobs-to-distinct-users.yml
new file mode 100644
index 00000000000..6908a48cee0
--- /dev/null
+++ b/changelogs/unreleased/322098-limit-projectauthorizations-refresh-jobs-to-distinct-users.yml
@@ -0,0 +1,6 @@
+---
+title: Consider only distinct user ids for project authorizations refresh jobs for
+ group members
+merge_request: 54697
+author:
+type: performance
diff --git a/changelogs/unreleased/322099-harden-addition-for-template-repositoriu.yml b/changelogs/unreleased/322099-harden-addition-for-template-repositoriu.yml
new file mode 100644
index 00000000000..6a18b8bff3a
--- /dev/null
+++ b/changelogs/unreleased/322099-harden-addition-for-template-repositoriu.yml
@@ -0,0 +1,5 @@
+---
+title: Harden added metrics
+merge_request: 54805
+author:
+type: performance
diff --git a/changelogs/unreleased/322099-sql-definition-for-template_repositories.yml b/changelogs/unreleased/322099-sql-definition-for-template_repositories.yml
new file mode 100644
index 00000000000..3d8ca3577d2
--- /dev/null
+++ b/changelogs/unreleased/322099-sql-definition-for-template_repositories.yml
@@ -0,0 +1,5 @@
+---
+title: Hardened "add" arithmetic for usage data
+merge_request: 54794
+author:
+type: performance
diff --git a/changelogs/unreleased/322103-optimize-the-dictionary-view-to-not-repeat-same-columns.yml b/changelogs/unreleased/322103-optimize-the-dictionary-view-to-not-repeat-same-columns.yml
new file mode 100644
index 00000000000..52dfdb2fe35
--- /dev/null
+++ b/changelogs/unreleased/322103-optimize-the-dictionary-view-to-not-repeat-same-columns.yml
@@ -0,0 +1,5 @@
+---
+title: Optimize Metrics Dictionary
+merge_request: 55145
+author:
+type: changed
diff --git a/changelogs/unreleased/322125-add-prometheus-histo-on-retries.yml b/changelogs/unreleased/322125-add-prometheus-histo-on-retries.yml
new file mode 100644
index 00000000000..c478e7cc75d
--- /dev/null
+++ b/changelogs/unreleased/322125-add-prometheus-histo-on-retries.yml
@@ -0,0 +1,5 @@
+---
+title: Add histogram for optimistic lock retries
+merge_request: 55614
+author:
+type: other
diff --git a/changelogs/unreleased/322125-log-optimistic-locking-retries.yml b/changelogs/unreleased/322125-log-optimistic-locking-retries.yml
new file mode 100644
index 00000000000..3be2d28fda9
--- /dev/null
+++ b/changelogs/unreleased/322125-log-optimistic-locking-retries.yml
@@ -0,0 +1,5 @@
+---
+title: Log Optimistic Locks with retries
+merge_request: 55187
+author:
+type: other
diff --git a/changelogs/unreleased/322128-token-used-field.yml b/changelogs/unreleased/322128-token-used-field.yml
new file mode 100644
index 00000000000..91738da7046
--- /dev/null
+++ b/changelogs/unreleased/322128-token-used-field.yml
@@ -0,0 +1,5 @@
+---
+title: Add last_used_at field to cluster agent token
+merge_request: 56023
+author:
+type: changed
diff --git a/changelogs/unreleased/322424-btn-confirm.yml b/changelogs/unreleased/322424-btn-confirm.yml
new file mode 100644
index 00000000000..d5d854b9803
--- /dev/null
+++ b/changelogs/unreleased/322424-btn-confirm.yml
@@ -0,0 +1,5 @@
+---
+title: Change the button to Primary Blue
+merge_request: 55204
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/322598-skip_client_authentication_for_password_grant.yml b/changelogs/unreleased/322598-skip_client_authentication_for_password_grant.yml
new file mode 100644
index 00000000000..92c52f120e2
--- /dev/null
+++ b/changelogs/unreleased/322598-skip_client_authentication_for_password_grant.yml
@@ -0,0 +1,5 @@
+---
+title: Reenable OAuth password grants without client credentials
+merge_request: 55873
+author:
+type: fixed
diff --git a/changelogs/unreleased/322626-use-grouped-list-for-test-report-widget.yml b/changelogs/unreleased/322626-use-grouped-list-for-test-report-widget.yml
new file mode 100644
index 00000000000..a16a804f975
--- /dev/null
+++ b/changelogs/unreleased/322626-use-grouped-list-for-test-report-widget.yml
@@ -0,0 +1,5 @@
+---
+title: Add section headers for the test report widget on the merge request page
+merge_request: 56252
+author:
+type: added
diff --git a/changelogs/unreleased/322663-remove-deprecated-button-variant-on-integration-configuration-view.yml b/changelogs/unreleased/322663-remove-deprecated-button-variant-on-integration-configuration-view.yml
new file mode 100644
index 00000000000..a52136ecbb8
--- /dev/null
+++ b/changelogs/unreleased/322663-remove-deprecated-button-variant-on-integration-configuration-view.yml
@@ -0,0 +1,5 @@
+---
+title: Update button variant to confirm on integration settings page
+merge_request: 55017
+author:
+type: changed
diff --git a/changelogs/unreleased/322724-fix-compare-page-dropdown-loading.yml b/changelogs/unreleased/322724-fix-compare-page-dropdown-loading.yml
new file mode 100644
index 00000000000..42359bb81d2
--- /dev/null
+++ b/changelogs/unreleased/322724-fix-compare-page-dropdown-loading.yml
@@ -0,0 +1,5 @@
+---
+title: Fix issue with loading the repository compare page
+merge_request: 55058
+author:
+type: fixed
diff --git a/changelogs/unreleased/322745-add-missing-token-names.yml b/changelogs/unreleased/322745-add-missing-token-names.yml
new file mode 100644
index 00000000000..2f54e6d46b3
--- /dev/null
+++ b/changelogs/unreleased/322745-add-missing-token-names.yml
@@ -0,0 +1,5 @@
+---
+title: Update cluster agent tokens with null names
+merge_request: 55673
+author:
+type: changed
diff --git a/changelogs/unreleased/322770-change-security-mr-widget-icon.yml b/changelogs/unreleased/322770-change-security-mr-widget-icon.yml
new file mode 100644
index 00000000000..07933f247c1
--- /dev/null
+++ b/changelogs/unreleased/322770-change-security-mr-widget-icon.yml
@@ -0,0 +1,5 @@
+---
+title: Use more common help icon in security report MR widget
+merge_request: 55741
+author:
+type: other
diff --git a/changelogs/unreleased/322782-increase-contrast-of-solarized-light-in-web-ide.yml b/changelogs/unreleased/322782-increase-contrast-of-solarized-light-in-web-ide.yml
new file mode 100644
index 00000000000..907b45576f4
--- /dev/null
+++ b/changelogs/unreleased/322782-increase-contrast-of-solarized-light-in-web-ide.yml
@@ -0,0 +1,5 @@
+---
+title: Increase contrast of Solarized Light in Web IDE
+merge_request: 55361
+author:
+type: changed
diff --git a/changelogs/unreleased/322901-fix-pagerduty-webhook.yml b/changelogs/unreleased/322901-fix-pagerduty-webhook.yml
new file mode 100644
index 00000000000..96063a0f937
--- /dev/null
+++ b/changelogs/unreleased/322901-fix-pagerduty-webhook.yml
@@ -0,0 +1,5 @@
+---
+title: 'Fixes: No such file or directory lib/pager_duty/validator/schemas/message.json'
+merge_request: 55725
+author:
+type: fixed
diff --git a/changelogs/unreleased/322960-degredation-in-assigning-team-members-on-boards-view.yml b/changelogs/unreleased/322960-degredation-in-assigning-team-members-on-boards-view.yml
new file mode 100644
index 00000000000..ac2bf901187
--- /dev/null
+++ b/changelogs/unreleased/322960-degredation-in-assigning-team-members-on-boards-view.yml
@@ -0,0 +1,5 @@
+---
+title: Fix assignees search to show only project members
+merge_request: 55396
+author:
+type: fixed
diff --git a/changelogs/unreleased/323015-fix-empty-field-in-custom-notification-events-modal.yml b/changelogs/unreleased/323015-fix-empty-field-in-custom-notification-events-modal.yml
new file mode 100644
index 00000000000..70b4e90f911
--- /dev/null
+++ b/changelogs/unreleased/323015-fix-empty-field-in-custom-notification-events-modal.yml
@@ -0,0 +1,5 @@
+---
+title: Fix empty field in custom notification events modal
+merge_request: 55313
+author: Kev @KevSlashNull
+type: fixed
diff --git a/changelogs/unreleased/323059-batch-load-findings-by-uuid.yml b/changelogs/unreleased/323059-batch-load-findings-by-uuid.yml
new file mode 100644
index 00000000000..b2b20c337b8
--- /dev/null
+++ b/changelogs/unreleased/323059-batch-load-findings-by-uuid.yml
@@ -0,0 +1,5 @@
+---
+title: Batch-load vulnerability findings by UUID
+merge_request: 55642
+author:
+type: performance
diff --git a/changelogs/unreleased/323088-expose-project-access-token-value-with-create-api.yml b/changelogs/unreleased/323088-expose-project-access-token-value-with-create-api.yml
new file mode 100644
index 00000000000..afe3f5118b7
--- /dev/null
+++ b/changelogs/unreleased/323088-expose-project-access-token-value-with-create-api.yml
@@ -0,0 +1,5 @@
+---
+title: Expose project access token value with create API
+merge_request: 55408
+author:
+type: changed
diff --git a/changelogs/unreleased/323163-restore-gitlab_database_transaction_seconds_sum-for-sidekiq.yml b/changelogs/unreleased/323163-restore-gitlab_database_transaction_seconds_sum-for-sidekiq.yml
new file mode 100644
index 00000000000..3a942971ee2
--- /dev/null
+++ b/changelogs/unreleased/323163-restore-gitlab_database_transaction_seconds_sum-for-sidekiq.yml
@@ -0,0 +1,5 @@
+---
+title: Port essential database metrics to Sidekiq
+merge_request: 56005
+author:
+type: changed
diff --git a/changelogs/unreleased/323175-database-timeout-in-pages-migration-task.yml b/changelogs/unreleased/323175-database-timeout-in-pages-migration-task.yml
new file mode 100644
index 00000000000..9d7fec257f5
--- /dev/null
+++ b/changelogs/unreleased/323175-database-timeout-in-pages-migration-task.yml
@@ -0,0 +1,5 @@
+---
+title: Add index for pages migration
+merge_request: 55757
+author:
+type: added
diff --git a/changelogs/unreleased/323376-security-configuration-ui-strings-ssot.yml b/changelogs/unreleased/323376-security-configuration-ui-strings-ssot.yml
new file mode 100644
index 00000000000..5b901a6e158
--- /dev/null
+++ b/changelogs/unreleased/323376-security-configuration-ui-strings-ssot.yml
@@ -0,0 +1,5 @@
+---
+title: Add API Fuzzing to Security Configuration page, and re-order scanners
+merge_request: 56022
+author:
+type: changed
diff --git a/changelogs/unreleased/323474-update-incident-setting-copy.yml b/changelogs/unreleased/323474-update-incident-setting-copy.yml
new file mode 100644
index 00000000000..2d3f090c804
--- /dev/null
+++ b/changelogs/unreleased/323474-update-incident-setting-copy.yml
@@ -0,0 +1,5 @@
+---
+title: Update text for email config under Incidents in Settings > Operations
+merge_request: 55753
+author:
+type: changed
diff --git a/changelogs/unreleased/323555-disable-gc-compacting-via-monkey-patch.yml b/changelogs/unreleased/323555-disable-gc-compacting-via-monkey-patch.yml
new file mode 100644
index 00000000000..e30ea036c86
--- /dev/null
+++ b/changelogs/unreleased/323555-disable-gc-compacting-via-monkey-patch.yml
@@ -0,0 +1,5 @@
+---
+title: Temporary make `GC.compact` no-op
+merge_request: 56079
+author:
+type: changed
diff --git a/changelogs/unreleased/323674-initiate-web-hook-logs-partitioning.yml b/changelogs/unreleased/323674-initiate-web-hook-logs-partitioning.yml
new file mode 100644
index 00000000000..7b36ed31e4d
--- /dev/null
+++ b/changelogs/unreleased/323674-initiate-web-hook-logs-partitioning.yml
@@ -0,0 +1,5 @@
+---
+title: Add web_hook_logs partitioning migration
+merge_request: 55938
+author:
+type: other
diff --git a/changelogs/unreleased/323848-fix-diff-comment-hidden-menu.yml b/changelogs/unreleased/323848-fix-diff-comment-hidden-menu.yml
new file mode 100644
index 00000000000..7f32410cf75
--- /dev/null
+++ b/changelogs/unreleased/323848-fix-diff-comment-hidden-menu.yml
@@ -0,0 +1,5 @@
+---
+title: Fix diff comment hidden dropdown
+merge_request: 56072
+author:
+type: fixed
diff --git a/changelogs/unreleased/33283-remove-svg.yml b/changelogs/unreleased/33283-remove-svg.yml
new file mode 100644
index 00000000000..67b5775c639
--- /dev/null
+++ b/changelogs/unreleased/33283-remove-svg.yml
@@ -0,0 +1,5 @@
+---
+title: Remove illustration in export/import CSV modal
+merge_request: 54136
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/33685-lift-npm-package-naming-convention-for-project-level-api.yml b/changelogs/unreleased/33685-lift-npm-package-naming-convention-for-project-level-api.yml
new file mode 100644
index 00000000000..0aedf325fcf
--- /dev/null
+++ b/changelogs/unreleased/33685-lift-npm-package-naming-convention-for-project-level-api.yml
@@ -0,0 +1,5 @@
+---
+title: Lift the NPM package naming convention for the project level API
+merge_request: 53266
+author:
+type: changed
diff --git a/changelogs/unreleased/33748-dont-close-auto-suggest-select-boxes-if-only-mouseup-outside-box.yml b/changelogs/unreleased/33748-dont-close-auto-suggest-select-boxes-if-only-mouseup-outside-box.yml
new file mode 100644
index 00000000000..e9ed4250c2e
--- /dev/null
+++ b/changelogs/unreleased/33748-dont-close-auto-suggest-select-boxes-if-only-mouseup-outside-box.yml
@@ -0,0 +1,5 @@
+---
+title: Don't close auto suggest select boxes on click if only the mouseup (but not the mousedown) event happened outside the box
+merge_request: 51139
+author: Simon Stieger @sim0
+type: fixed
diff --git a/changelogs/unreleased/35579-remove-graphql_logging-feature-flag.yml b/changelogs/unreleased/35579-remove-graphql_logging-feature-flag.yml
new file mode 100644
index 00000000000..d6b8caec999
--- /dev/null
+++ b/changelogs/unreleased/35579-remove-graphql_logging-feature-flag.yml
@@ -0,0 +1,5 @@
+---
+title: Remove graphql_logging feature flag
+merge_request: 54984
+author:
+type: other
diff --git a/changelogs/unreleased/51727-allow-job-identiy-self.yml b/changelogs/unreleased/51727-allow-job-identiy-self.yml
new file mode 100644
index 00000000000..03e91a8b6b7
--- /dev/null
+++ b/changelogs/unreleased/51727-allow-job-identiy-self.yml
@@ -0,0 +1,5 @@
+---
+title: Add API endpoint for fetching a single job by CI_JOB_TOKEN
+merge_request: 51727
+author: ahmet2mir
+type: added
diff --git a/changelogs/unreleased/55412-typo-in-pipeline-status-email.yml b/changelogs/unreleased/55412-typo-in-pipeline-status-email.yml
new file mode 100644
index 00000000000..7fc2fb9416e
--- /dev/null
+++ b/changelogs/unreleased/55412-typo-in-pipeline-status-email.yml
@@ -0,0 +1,5 @@
+---
+title: Fix typo in pipeline status email
+merge_request: 55412
+author: Gabriel Berke-Williams
+type: fixed
diff --git a/changelogs/unreleased/6utzeit-de-master-patch-15431.yml b/changelogs/unreleased/6utzeit-de-master-patch-15431.yml
new file mode 100644
index 00000000000..71da21dc571
--- /dev/null
+++ b/changelogs/unreleased/6utzeit-de-master-patch-15431.yml
@@ -0,0 +1,5 @@
+---
+title: Updating general Chef .gitlab-ci.yml template
+merge_request: 54676
+author:
+type: other
diff --git a/changelogs/unreleased/ab-index-rename.yml b/changelogs/unreleased/ab-index-rename.yml
new file mode 100644
index 00000000000..3fe01db7581
--- /dev/null
+++ b/changelogs/unreleased/ab-index-rename.yml
@@ -0,0 +1,5 @@
+---
+title: Rename indexes to remove inconsistencies
+merge_request: 51011
+author:
+type: other
diff --git a/changelogs/unreleased/add-allow-force-push-option.yml b/changelogs/unreleased/add-allow-force-push-option.yml
new file mode 100644
index 00000000000..2441d42b073
--- /dev/null
+++ b/changelogs/unreleased/add-allow-force-push-option.yml
@@ -0,0 +1,5 @@
+---
+title: Add Allow force push option to Protected branches
+merge_request: 55261
+author: Mycroft Kang @TaehyeokKang
+type: added
diff --git a/changelogs/unreleased/add-client-id-application-context-metadata.yml b/changelogs/unreleased/add-client-id-application-context-metadata.yml
new file mode 100644
index 00000000000..e0b89fd13cc
--- /dev/null
+++ b/changelogs/unreleased/add-client-id-application-context-metadata.yml
@@ -0,0 +1,5 @@
+---
+title: Add client_id to application context
+merge_request: 55683
+author:
+type: added
diff --git a/changelogs/unreleased/add-enable-in-product-marketing-emails-application-setting.yml b/changelogs/unreleased/add-enable-in-product-marketing-emails-application-setting.yml
new file mode 100644
index 00000000000..bc9dfaa1ec8
--- /dev/null
+++ b/changelogs/unreleased/add-enable-in-product-marketing-emails-application-setting.yml
@@ -0,0 +1,5 @@
+---
+title: Add application setting for enabling in-product marketing emails
+merge_request: 54324
+author:
+type: added
diff --git a/changelogs/unreleased/add-environment-job-pipeline-hooks.yml b/changelogs/unreleased/add-environment-job-pipeline-hooks.yml
new file mode 100644
index 00000000000..e138ea742ac
--- /dev/null
+++ b/changelogs/unreleased/add-environment-job-pipeline-hooks.yml
@@ -0,0 +1,5 @@
+---
+title: Added environment details to Job Hook and Pipeline Hook
+merge_request: 54480
+author: AdrianLC
+type: changed
diff --git a/changelogs/unreleased/add-graphql-etag-caching.yml b/changelogs/unreleased/add-graphql-etag-caching.yml
new file mode 100644
index 00000000000..45021b4d965
--- /dev/null
+++ b/changelogs/unreleased/add-graphql-etag-caching.yml
@@ -0,0 +1,5 @@
+---
+title: Add support for ETag caching when using GraphQL
+merge_request: 53978
+author:
+type: changed
diff --git a/changelogs/unreleased/add-kas-api-url-config.yml b/changelogs/unreleased/add-kas-api-url-config.yml
new file mode 100644
index 00000000000..e1e7682c659
--- /dev/null
+++ b/changelogs/unreleased/add-kas-api-url-config.yml
@@ -0,0 +1,5 @@
+---
+title: Add internal and external URL config for KAS
+merge_request: 54260
+author:
+type: added
diff --git a/changelogs/unreleased/add-not-null-constraint-to-gitlab-subscriptions-namespace-id.yml b/changelogs/unreleased/add-not-null-constraint-to-gitlab-subscriptions-namespace-id.yml
new file mode 100644
index 00000000000..5a3008fc892
--- /dev/null
+++ b/changelogs/unreleased/add-not-null-constraint-to-gitlab-subscriptions-namespace-id.yml
@@ -0,0 +1,5 @@
+---
+title: Add NOT NULL constraint to gitlab_subscriptions namespace_id
+merge_request: 54319
+author:
+type: other
diff --git a/changelogs/unreleased/add-ollowed-user-activity-as-dashboard-user-choices.yml b/changelogs/unreleased/add-ollowed-user-activity-as-dashboard-user-choices.yml
new file mode 100644
index 00000000000..5188cd2ee08
--- /dev/null
+++ b/changelogs/unreleased/add-ollowed-user-activity-as-dashboard-user-choices.yml
@@ -0,0 +1,5 @@
+---
+title: "Add 'Followed User Activity' as dashboard user choices"
+merge_request: 55165
+author: Benj Fassbind @randombenj
+type: added
diff --git a/changelogs/unreleased/add-pages-cache-settings-to-docs.yml b/changelogs/unreleased/add-pages-cache-settings-to-docs.yml
new file mode 100644
index 00000000000..c21e99ec7ac
--- /dev/null
+++ b/changelogs/unreleased/add-pages-cache-settings-to-docs.yml
@@ -0,0 +1,5 @@
+---
+title: Add Pages cache configuration settings
+merge_request: 55812
+author:
+type: added
diff --git a/changelogs/unreleased/add-rails-application-config-hosts.yml b/changelogs/unreleased/add-rails-application-config-hosts.yml
new file mode 100644
index 00000000000..bfa339a5759
--- /dev/null
+++ b/changelogs/unreleased/add-rails-application-config-hosts.yml
@@ -0,0 +1,5 @@
+---
+title: Add setting to control Rails.application.config.hosts
+merge_request: 55491
+author:
+type: added
diff --git a/changelogs/unreleased/add-space-download-icon.yml b/changelogs/unreleased/add-space-download-icon.yml
new file mode 100644
index 00000000000..85012d9bbcb
--- /dev/null
+++ b/changelogs/unreleased/add-space-download-icon.yml
@@ -0,0 +1,5 @@
+---
+title: Add space next to download icon in download artifacts button
+merge_request: 54228
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/add_request_cve_issue.yml b/changelogs/unreleased/add_request_cve_issue.yml
new file mode 100644
index 00000000000..45b2c1bf384
--- /dev/null
+++ b/changelogs/unreleased/add_request_cve_issue.yml
@@ -0,0 +1,5 @@
+---
+title: Adds Request CVE ID button to issue sidebar
+merge_request: 41203
+author:
+type: added
diff --git a/changelogs/unreleased/add_role_and_rolebinding_for_cilium_network_policies.yml b/changelogs/unreleased/add_role_and_rolebinding_for_cilium_network_policies.yml
new file mode 100644
index 00000000000..a04cb215c1f
--- /dev/null
+++ b/changelogs/unreleased/add_role_and_rolebinding_for_cilium_network_policies.yml
@@ -0,0 +1,5 @@
+---
+title: Add Role and Rolebinding for CiliumNetworkPolicies
+merge_request: 54130
+author:
+type: changed
diff --git a/changelogs/unreleased/admin-dashboard-typo.yml b/changelogs/unreleased/admin-dashboard-typo.yml
new file mode 100644
index 00000000000..81b113f8b1a
--- /dev/null
+++ b/changelogs/unreleased/admin-dashboard-typo.yml
@@ -0,0 +1,5 @@
+---
+title: "Renamed the second project panel to group"
+merge_request: 54834
+author: Niklas van Schrick @Taucher2003
+type: fixed
diff --git a/changelogs/unreleased/afontaine-collapse-deployments-in-merge-requests.yml b/changelogs/unreleased/afontaine-collapse-deployments-in-merge-requests.yml
new file mode 100644
index 00000000000..80e57a65c33
--- /dev/null
+++ b/changelogs/unreleased/afontaine-collapse-deployments-in-merge-requests.yml
@@ -0,0 +1,5 @@
+---
+title: Collapse deployments in merge request if many
+merge_request: 55239
+author:
+type: changed
diff --git a/changelogs/unreleased/ajk-graphql-accept-mr.yml b/changelogs/unreleased/ajk-graphql-accept-mr.yml
new file mode 100644
index 00000000000..de9001f00a9
--- /dev/null
+++ b/changelogs/unreleased/ajk-graphql-accept-mr.yml
@@ -0,0 +1,5 @@
+---
+title: Add mutation to accept merge requests
+merge_request: 54758
+author:
+type: added
diff --git a/changelogs/unreleased/ajk-reviewer-widget-approved.yml b/changelogs/unreleased/ajk-reviewer-widget-approved.yml
new file mode 100644
index 00000000000..36cd7c97406
--- /dev/null
+++ b/changelogs/unreleased/ajk-reviewer-widget-approved.yml
@@ -0,0 +1,5 @@
+---
+title: Show icon next to reviewers who have approved
+merge_request: 54365
+author:
+type: changed
diff --git a/changelogs/unreleased/alert-incident-url-follow.yml b/changelogs/unreleased/alert-incident-url-follow.yml
new file mode 100644
index 00000000000..9320520f8ab
--- /dev/null
+++ b/changelogs/unreleased/alert-incident-url-follow.yml
@@ -0,0 +1,5 @@
+---
+title: Allow alert to link to incidents
+merge_request: 55426
+author:
+type: changed
diff --git a/changelogs/unreleased/alexpooley-remove_shared_group_membership_auth_ff.yml b/changelogs/unreleased/alexpooley-remove_shared_group_membership_auth_ff.yml
new file mode 100644
index 00000000000..2d676854b3f
--- /dev/null
+++ b/changelogs/unreleased/alexpooley-remove_shared_group_membership_auth_ff.yml
@@ -0,0 +1,5 @@
+---
+title: Include shared with groups in list of authorized groups
+merge_request: 54894
+author:
+type: fixed
diff --git a/changelogs/unreleased/align-mr-conflict-center.yml b/changelogs/unreleased/align-mr-conflict-center.yml
new file mode 100644
index 00000000000..6dd58206b3c
--- /dev/null
+++ b/changelogs/unreleased/align-mr-conflict-center.yml
@@ -0,0 +1,5 @@
+---
+title: Align merge conflict warning text to center
+merge_request: 54145
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/auto-devops-default-branch-deploy.yml b/changelogs/unreleased/auto-devops-default-branch-deploy.yml
new file mode 100644
index 00000000000..0b0738afa37
--- /dev/null
+++ b/changelogs/unreleased/auto-devops-default-branch-deploy.yml
@@ -0,0 +1,5 @@
+---
+title: Fix Auto DevOps deploys that use a default branch that's not named 'master'
+merge_request: 53280
+author: Mitchell Cash @MitchellCash
+type: fixed
diff --git a/changelogs/unreleased/auto-scroll-pipeline-editor-on-commit.yml b/changelogs/unreleased/auto-scroll-pipeline-editor-on-commit.yml
new file mode 100644
index 00000000000..af2a3ab9974
--- /dev/null
+++ b/changelogs/unreleased/auto-scroll-pipeline-editor-on-commit.yml
@@ -0,0 +1,5 @@
+---
+title: Auto-scroll to top of page upon committing in pipeline editor
+merge_request: 54657
+author:
+type: changed
diff --git a/changelogs/unreleased/blame-performance.yml b/changelogs/unreleased/blame-performance.yml
new file mode 100644
index 00000000000..ef19b47c412
--- /dev/null
+++ b/changelogs/unreleased/blame-performance.yml
@@ -0,0 +1,5 @@
+---
+title: Refactor blame view
+merge_request: 55488
+author:
+type: performance
diff --git a/changelogs/unreleased/board_args_consolidation.yml b/changelogs/unreleased/board_args_consolidation.yml
new file mode 100644
index 00000000000..e62b49fe06a
--- /dev/null
+++ b/changelogs/unreleased/board_args_consolidation.yml
@@ -0,0 +1,5 @@
+---
+title: Fixed error handling GraphQL API when issue board creation fails
+merge_request: 55982
+author:
+type: fixed
diff --git a/changelogs/unreleased/btn-confirm-abuse-reports.yml b/changelogs/unreleased/btn-confirm-abuse-reports.yml
new file mode 100644
index 00000000000..8bda61fdc62
--- /dev/null
+++ b/changelogs/unreleased/btn-confirm-abuse-reports.yml
@@ -0,0 +1,5 @@
+---
+title: Move to btn-confirm from btn-success in abuse_reports folder
+merge_request: 55262
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/btn-confirm-admin-appearances.yml b/changelogs/unreleased/btn-confirm-admin-appearances.yml
new file mode 100644
index 00000000000..a315f8bba5c
--- /dev/null
+++ b/changelogs/unreleased/btn-confirm-admin-appearances.yml
@@ -0,0 +1,5 @@
+---
+title: Move to btn-confirm from btn-success in admin/appearances directory
+merge_request: 55264
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/btn-confirm-admin-application-settings.yml b/changelogs/unreleased/btn-confirm-admin-application-settings.yml
new file mode 100644
index 00000000000..d76e20b410a
--- /dev/null
+++ b/changelogs/unreleased/btn-confirm-admin-application-settings.yml
@@ -0,0 +1,5 @@
+---
+title: Move to btn-confirm from btn-success in admin application_settings directory
+merge_request: 55263
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/btn-confirm-admin-applications.yml b/changelogs/unreleased/btn-confirm-admin-applications.yml
new file mode 100644
index 00000000000..fd37336e32c
--- /dev/null
+++ b/changelogs/unreleased/btn-confirm-admin-applications.yml
@@ -0,0 +1,5 @@
+---
+title: Move to btn-confirm from btn-success in admin/applications directory
+merge_request: 55265
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/btn-confirm-admin-broadcast-messages.yml b/changelogs/unreleased/btn-confirm-admin-broadcast-messages.yml
new file mode 100644
index 00000000000..2e3a3608739
--- /dev/null
+++ b/changelogs/unreleased/btn-confirm-admin-broadcast-messages.yml
@@ -0,0 +1,5 @@
+---
+title: Move to btn-confirm from btn-success in admin/broadcast_messages directory
+merge_request: 55266
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/btn-confirm-admin-deploy-keys.yml b/changelogs/unreleased/btn-confirm-admin-deploy-keys.yml
new file mode 100644
index 00000000000..108545d6b10
--- /dev/null
+++ b/changelogs/unreleased/btn-confirm-admin-deploy-keys.yml
@@ -0,0 +1,5 @@
+---
+title: Move to btn-confirm from btn-success in admin/deploy_keys directory
+merge_request: 55267
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/btn-confirm-admin-groups.yml b/changelogs/unreleased/btn-confirm-admin-groups.yml
new file mode 100644
index 00000000000..6096a1fcc0c
--- /dev/null
+++ b/changelogs/unreleased/btn-confirm-admin-groups.yml
@@ -0,0 +1,5 @@
+---
+title: Move to btn-confirm from btn-success in admin/groups directory
+merge_request: 55268
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/btn-confirm-admin-hooks.yml b/changelogs/unreleased/btn-confirm-admin-hooks.yml
new file mode 100644
index 00000000000..64423b5f166
--- /dev/null
+++ b/changelogs/unreleased/btn-confirm-admin-hooks.yml
@@ -0,0 +1,5 @@
+---
+title: Move to btn-confirm from btn-success in admin/hooks directory
+merge_request: 55272
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/btn-confirm-admin-labels.yml b/changelogs/unreleased/btn-confirm-admin-labels.yml
new file mode 100644
index 00000000000..c725e94553c
--- /dev/null
+++ b/changelogs/unreleased/btn-confirm-admin-labels.yml
@@ -0,0 +1,5 @@
+---
+title: Move to btn-confirm from btn-success in admin/labels directory
+merge_request: 55273
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/btn-confirm-admin-projects.yml b/changelogs/unreleased/btn-confirm-admin-projects.yml
new file mode 100644
index 00000000000..1718ea79164
--- /dev/null
+++ b/changelogs/unreleased/btn-confirm-admin-projects.yml
@@ -0,0 +1,5 @@
+---
+title: Move to btn-confirm from btn-success in admin/projects directory
+merge_request: 55274
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/btn-confirm-admin-serverless.yml b/changelogs/unreleased/btn-confirm-admin-serverless.yml
new file mode 100644
index 00000000000..80ede18d4fe
--- /dev/null
+++ b/changelogs/unreleased/btn-confirm-admin-serverless.yml
@@ -0,0 +1,5 @@
+---
+title: Move to btn-confirm from btn-success in admin/serverless directory
+merge_request: 55275
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/btn-confirm-admin-users.yml b/changelogs/unreleased/btn-confirm-admin-users.yml
new file mode 100644
index 00000000000..cafd375323f
--- /dev/null
+++ b/changelogs/unreleased/btn-confirm-admin-users.yml
@@ -0,0 +1,5 @@
+---
+title: Move to btn-confirm from btn-success in admin/users directory
+merge_request: 55276
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/btn-confirm-auth.yml b/changelogs/unreleased/btn-confirm-auth.yml
new file mode 100644
index 00000000000..ea7797c4c75
--- /dev/null
+++ b/changelogs/unreleased/btn-confirm-auth.yml
@@ -0,0 +1,5 @@
+---
+title: Move to btn-confirm in app/views/devise directory
+merge_request: 55200
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/btn-confirm-clusters.yml b/changelogs/unreleased/btn-confirm-clusters.yml
new file mode 100644
index 00000000000..fe1b0d732dc
--- /dev/null
+++ b/changelogs/unreleased/btn-confirm-clusters.yml
@@ -0,0 +1,5 @@
+---
+title: Move from btn-success to btn-confirm in clusters directory
+merge_request: 56205
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/btn-confirm-doorkeeper.yml b/changelogs/unreleased/btn-confirm-doorkeeper.yml
new file mode 100644
index 00000000000..dd36f4dcfc4
--- /dev/null
+++ b/changelogs/unreleased/btn-confirm-doorkeeper.yml
@@ -0,0 +1,5 @@
+---
+title: Move to btn-confirm from btn-success in views/doorkeeper directory
+merge_request: 55277
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/btn-confirm-empty-states.yml b/changelogs/unreleased/btn-confirm-empty-states.yml
new file mode 100644
index 00000000000..746d6ae71a7
--- /dev/null
+++ b/changelogs/unreleased/btn-confirm-empty-states.yml
@@ -0,0 +1,5 @@
+---
+title: Move to btn-confirm in app/views/shared/empty_states directory
+merge_request: 55203
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/btn-confirm-envs.yml b/changelogs/unreleased/btn-confirm-envs.yml
new file mode 100644
index 00000000000..00331aa31f6
--- /dev/null
+++ b/changelogs/unreleased/btn-confirm-envs.yml
@@ -0,0 +1,5 @@
+---
+title: Move to confirm variant from success in environments directory
+merge_request: 56203
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/btn-confirm-group-milestones.yml b/changelogs/unreleased/btn-confirm-group-milestones.yml
new file mode 100644
index 00000000000..199126c8a3a
--- /dev/null
+++ b/changelogs/unreleased/btn-confirm-group-milestones.yml
@@ -0,0 +1,5 @@
+---
+title: Move to btn-confirm from btn-success in groups/milestones directory
+merge_request: 55278
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/btn-confirm-group-settings.yml b/changelogs/unreleased/btn-confirm-group-settings.yml
new file mode 100644
index 00000000000..93597600920
--- /dev/null
+++ b/changelogs/unreleased/btn-confirm-group-settings.yml
@@ -0,0 +1,5 @@
+---
+title: Move to btn-confirm from btn-success in groups/settings directory
+merge_request: 55281
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/btn-confirm-group.yml b/changelogs/unreleased/btn-confirm-group.yml
new file mode 100644
index 00000000000..f344de75b83
--- /dev/null
+++ b/changelogs/unreleased/btn-confirm-group.yml
@@ -0,0 +1,5 @@
+---
+title: Move to btn-confirm from btn-success in groups directory
+merge_request: 55282
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/btn-confirm-home.yml b/changelogs/unreleased/btn-confirm-home.yml
new file mode 100644
index 00000000000..a8b063fc5f3
--- /dev/null
+++ b/changelogs/unreleased/btn-confirm-home.yml
@@ -0,0 +1,5 @@
+---
+title: Remove deprecated button variant in groups, projects and snippets
+merge_request: 54747
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/btn-confirm-js-2fa.yml b/changelogs/unreleased/btn-confirm-js-2fa.yml
new file mode 100644
index 00000000000..ea56cd1df0f
--- /dev/null
+++ b/changelogs/unreleased/btn-confirm-js-2fa.yml
@@ -0,0 +1,5 @@
+---
+title: Move to confirm variant from success in 2fa codes component
+merge_request: 55729
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/btn-confirm-js-badges.yml b/changelogs/unreleased/btn-confirm-js-badges.yml
new file mode 100644
index 00000000000..a20bb68fa43
--- /dev/null
+++ b/changelogs/unreleased/btn-confirm-js-badges.yml
@@ -0,0 +1,5 @@
+---
+title: Move to confirm variant from success in badges component
+merge_request: 55730
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/btn-confirm-shared-access-tokens.yml b/changelogs/unreleased/btn-confirm-shared-access-tokens.yml
new file mode 100644
index 00000000000..e1e72fc884e
--- /dev/null
+++ b/changelogs/unreleased/btn-confirm-shared-access-tokens.yml
@@ -0,0 +1,5 @@
+---
+title: Move from btn-success to btn-confirm in shared/access_token directory
+merge_request: 55298
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/btn-confirm-shared-deploy-keys.yml b/changelogs/unreleased/btn-confirm-shared-deploy-keys.yml
new file mode 100644
index 00000000000..36968fff64f
--- /dev/null
+++ b/changelogs/unreleased/btn-confirm-shared-deploy-keys.yml
@@ -0,0 +1,5 @@
+---
+title: Move from btn-success to btn-confirm in shared/deploy_keys directory
+merge_request: 55299
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/btn-confirm-shared-deploy-tokens.yml b/changelogs/unreleased/btn-confirm-shared-deploy-tokens.yml
new file mode 100644
index 00000000000..37016c27eb6
--- /dev/null
+++ b/changelogs/unreleased/btn-confirm-shared-deploy-tokens.yml
@@ -0,0 +1,5 @@
+---
+title: Move from btn-success to btn-confirm in shared/deploy_tokens directory
+merge_request: 55300
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/btn-confirm-shared-gitpod.yml b/changelogs/unreleased/btn-confirm-shared-gitpod.yml
new file mode 100644
index 00000000000..0cce62a474d
--- /dev/null
+++ b/changelogs/unreleased/btn-confirm-shared-gitpod.yml
@@ -0,0 +1,5 @@
+---
+title: Move from btn-success to btn-confirm in shared/gitpod directory
+merge_request: 55301
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/btn-confirm-shared-groups.yml b/changelogs/unreleased/btn-confirm-shared-groups.yml
new file mode 100644
index 00000000000..0f97ca6e9c8
--- /dev/null
+++ b/changelogs/unreleased/btn-confirm-shared-groups.yml
@@ -0,0 +1,5 @@
+---
+title: Move from btn-success to btn-confirm in shared/groups directory
+merge_request: 55302
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/btn-confirm-shared-members.yml b/changelogs/unreleased/btn-confirm-shared-members.yml
new file mode 100644
index 00000000000..9ef08007f89
--- /dev/null
+++ b/changelogs/unreleased/btn-confirm-shared-members.yml
@@ -0,0 +1,5 @@
+---
+title: Move from btn-success to btn-confirm in shared/members directory
+merge_request: 55315
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/btn-confirm-shared-wikis.yml b/changelogs/unreleased/btn-confirm-shared-wikis.yml
new file mode 100644
index 00000000000..fd9fefefc6c
--- /dev/null
+++ b/changelogs/unreleased/btn-confirm-shared-wikis.yml
@@ -0,0 +1,5 @@
+---
+title: Move from btn-success to btn-confirm in shared/wikis directory
+merge_request: 55316
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/btn-confirm-shared.yml b/changelogs/unreleased/btn-confirm-shared.yml
new file mode 100644
index 00000000000..9b5fc864289
--- /dev/null
+++ b/changelogs/unreleased/btn-confirm-shared.yml
@@ -0,0 +1,5 @@
+---
+title: Move from btn-success to btn-confirm in shared directory
+merge_request: 55317
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/btn-confirm-subs-banner.yml b/changelogs/unreleased/btn-confirm-subs-banner.yml
new file mode 100644
index 00000000000..a5c3c233f31
--- /dev/null
+++ b/changelogs/unreleased/btn-confirm-subs-banner.yml
@@ -0,0 +1,5 @@
+---
+title: Update to btn-confirm and align subscription banner
+merge_request: 54137
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/btn-default-admin-edit.yml b/changelogs/unreleased/btn-default-admin-edit.yml
new file mode 100644
index 00000000000..cc6e7c8898f
--- /dev/null
+++ b/changelogs/unreleased/btn-default-admin-edit.yml
@@ -0,0 +1,5 @@
+---
+title: Add btn-default class for edit buttons in admin projects and groups
+merge_request: 53453
+author:
+type: other
diff --git a/changelogs/unreleased/btn-default-admin-general-settings.yml b/changelogs/unreleased/btn-default-admin-general-settings.yml
new file mode 100644
index 00000000000..afce2e26c81
--- /dev/null
+++ b/changelogs/unreleased/btn-default-admin-general-settings.yml
@@ -0,0 +1,5 @@
+---
+title: Add btn-default class for settings toggle button
+merge_request: 54764
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/btn-default-mr-cancel.yml b/changelogs/unreleased/btn-default-mr-cancel.yml
new file mode 100644
index 00000000000..4921af91608
--- /dev/null
+++ b/changelogs/unreleased/btn-default-mr-cancel.yml
@@ -0,0 +1,5 @@
+---
+title: Add btn-default for cancel button in issueable form
+merge_request: 53458
+author: Yogi (@yo)
+type: other
diff --git a/changelogs/unreleased/btn-icon-commit-action.yml b/changelogs/unreleased/btn-icon-commit-action.yml
new file mode 100644
index 00000000000..a6ffb73ffdb
--- /dev/null
+++ b/changelogs/unreleased/btn-icon-commit-action.yml
@@ -0,0 +1,5 @@
+---
+title: Add btn-icon class for commit action buttons
+merge_request: 54286
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/btn-icon-schedules.yml b/changelogs/unreleased/btn-icon-schedules.yml
new file mode 100644
index 00000000000..37ae9605975
--- /dev/null
+++ b/changelogs/unreleased/btn-icon-schedules.yml
@@ -0,0 +1,5 @@
+---
+title: Add btn-icon for buttons in pipeline schedules
+merge_request: 54426
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/bugfix-linked-issue-autocomplete.yml b/changelogs/unreleased/bugfix-linked-issue-autocomplete.yml
new file mode 100644
index 00000000000..20b36d33bbd
--- /dev/null
+++ b/changelogs/unreleased/bugfix-linked-issue-autocomplete.yml
@@ -0,0 +1,5 @@
+---
+title: Improve Linked Issues Usability
+merge_request: 50879
+author: Andrew Minion
+type: changed
diff --git a/changelogs/unreleased/bump-reliable-fetch.yml b/changelogs/unreleased/bump-reliable-fetch.yml
new file mode 100644
index 00000000000..4ed2b386806
--- /dev/null
+++ b/changelogs/unreleased/bump-reliable-fetch.yml
@@ -0,0 +1,5 @@
+---
+title: Update gitlab-sidekiq-fetcher to 0.5.5 to handle namespaced queues
+merge_request: 55013
+author:
+type: fixed
diff --git a/changelogs/unreleased/bump_auto_deploy_image_version.yml b/changelogs/unreleased/bump_auto_deploy_image_version.yml
new file mode 100644
index 00000000000..533f4072cd5
--- /dev/null
+++ b/changelogs/unreleased/bump_auto_deploy_image_version.yml
@@ -0,0 +1,4 @@
+title: Bump auto-deploy-image tag in Deploy.latest.gitlab-ci.yml to v2.6.0, which includes changes to ciliumnetworkpolicies.
+merge_request: 54983
+author:
+type: added
diff --git a/changelogs/unreleased/bvl-fix-create-release-worker-is-not-cron.yml b/changelogs/unreleased/bvl-fix-create-release-worker-is-not-cron.yml
new file mode 100644
index 00000000000..9ab4bc33b92
--- /dev/null
+++ b/changelogs/unreleased/bvl-fix-create-release-worker-is-not-cron.yml
@@ -0,0 +1,5 @@
+---
+title: move create_release_evidence sidekiq queue out of the cronjob namespace
+merge_request: 54432
+author:
+type: fixed
diff --git a/changelogs/unreleased/cablett-restore-database-structure.yml b/changelogs/unreleased/cablett-restore-database-structure.yml
new file mode 100644
index 00000000000..362cf7146a6
--- /dev/null
+++ b/changelogs/unreleased/cablett-restore-database-structure.yml
@@ -0,0 +1,5 @@
+---
+title: Restore accidental changes to structure.sql
+merge_request: 55352
+author:
+type: other
diff --git a/changelogs/unreleased/changelog-api-to-optional.yml b/changelogs/unreleased/changelog-api-to-optional.yml
new file mode 100644
index 00000000000..ca08201c3b9
--- /dev/null
+++ b/changelogs/unreleased/changelog-api-to-optional.yml
@@ -0,0 +1,5 @@
+---
+title: Make `to` in the changelog API optional
+merge_request: 54229
+author:
+type: added
diff --git a/changelogs/unreleased/changelog-commits-without-description.yml b/changelogs/unreleased/changelog-commits-without-description.yml
new file mode 100644
index 00000000000..41f757e5e2b
--- /dev/null
+++ b/changelogs/unreleased/changelog-commits-without-description.yml
@@ -0,0 +1,5 @@
+---
+title: Handle commits without descriptions for changelogs
+merge_request: 56224
+author:
+type: fixed
diff --git a/changelogs/unreleased/changelog-ignore-reverted-commits.yml b/changelogs/unreleased/changelog-ignore-reverted-commits.yml
new file mode 100644
index 00000000000..4b07e846f34
--- /dev/null
+++ b/changelogs/unreleased/changelog-ignore-reverted-commits.yml
@@ -0,0 +1,5 @@
+---
+title: Ignore reverted commits when generating changelogs
+merge_request: 55537
+author:
+type: added
diff --git a/changelogs/unreleased/changelog-include-merge-commits.yml b/changelogs/unreleased/changelog-include-merge-commits.yml
new file mode 100644
index 00000000000..547806b717f
--- /dev/null
+++ b/changelogs/unreleased/changelog-include-merge-commits.yml
@@ -0,0 +1,5 @@
+---
+title: Include MRs for merge commits for changelogs
+merge_request: 55371
+author:
+type: fixed
diff --git a/changelogs/unreleased/chore-bump-swagger-ui-dist.yml b/changelogs/unreleased/chore-bump-swagger-ui-dist.yml
new file mode 100644
index 00000000000..0b609c8ab3b
--- /dev/null
+++ b/changelogs/unreleased/chore-bump-swagger-ui-dist.yml
@@ -0,0 +1,5 @@
+---
+title: Bump swagger-ui-dist to 3.44.1
+merge_request: 55310
+author: Roger Meier
+type: changed
diff --git a/changelogs/unreleased/chore-unknown-sign-in-info-text.yml b/changelogs/unreleased/chore-unknown-sign-in-info-text.yml
new file mode 100644
index 00000000000..21bd17549cd
--- /dev/null
+++ b/changelogs/unreleased/chore-unknown-sign-in-info-text.yml
@@ -0,0 +1,5 @@
+---
+title: Show password hint only if password_authentication_enabled_for_web? on new location logins
+merge_request: 46018
+author: Roger Meier
+type: changed
diff --git a/changelogs/unreleased/ci_register_job_service_one_by_one.yml b/changelogs/unreleased/ci_register_job_service_one_by_one.yml
new file mode 100644
index 00000000000..818d728e6c3
--- /dev/null
+++ b/changelogs/unreleased/ci_register_job_service_one_by_one.yml
@@ -0,0 +1,5 @@
+---
+title: Fetch build one-by-one
+merge_request: 55194
+author:
+type: performance
diff --git a/changelogs/unreleased/ci_temporary_lock.yml b/changelogs/unreleased/ci_temporary_lock.yml
new file mode 100644
index 00000000000..3a7f423f5ed
--- /dev/null
+++ b/changelogs/unreleased/ci_temporary_lock.yml
@@ -0,0 +1,5 @@
+---
+title: Improve build contention
+merge_request: 55202
+author:
+type: performance
diff --git a/changelogs/unreleased/ck3g-remove-MergeRequestAssigneesMigrationProgressCheck-background-migrat.yml b/changelogs/unreleased/ck3g-remove-MergeRequestAssigneesMigrationProgressCheck-background-migrat.yml
new file mode 100644
index 00000000000..6cba82c7a5f
--- /dev/null
+++ b/changelogs/unreleased/ck3g-remove-MergeRequestAssigneesMigrationProgressCheck-background-migrat.yml
@@ -0,0 +1,5 @@
+---
+title: Remove MergeRequestAssigneesMigrationProgressCheck background migration
+merge_request: 54943
+author:
+type: changed
diff --git a/changelogs/unreleased/cmiskell-upgrade-sidekiq-reliable-fetch.yml b/changelogs/unreleased/cmiskell-upgrade-sidekiq-reliable-fetch.yml
new file mode 100644
index 00000000000..ec2bc728398
--- /dev/null
+++ b/changelogs/unreleased/cmiskell-upgrade-sidekiq-reliable-fetch.yml
@@ -0,0 +1,6 @@
+---
+title: Upgrade gitlab-sidekiq-fetcher for correctly detecting interrupted jobs when
+ Sidekiq pods are restarted
+merge_request: 54881
+author:
+type: fixed
diff --git a/changelogs/unreleased/cngo-convert-tab-to-gl-tab.yml b/changelogs/unreleased/cngo-convert-tab-to-gl-tab.yml
new file mode 100644
index 00000000000..f4a843ea6dc
--- /dev/null
+++ b/changelogs/unreleased/cngo-convert-tab-to-gl-tab.yml
@@ -0,0 +1,5 @@
+---
+title: Convert IDE nav form tab to GlTab
+merge_request: 54274
+author:
+type: changed
diff --git a/changelogs/unreleased/cngo-convert-threat-monitoring-environment-picker-to-gl-dropdown.yml b/changelogs/unreleased/cngo-convert-threat-monitoring-environment-picker-to-gl-dropdown.yml
new file mode 100644
index 00000000000..18e40d36db6
--- /dev/null
+++ b/changelogs/unreleased/cngo-convert-threat-monitoring-environment-picker-to-gl-dropdown.yml
@@ -0,0 +1,5 @@
+---
+title: Convert Threat Monitoring environment picker to GlDropdown
+merge_request: 54309
+author:
+type: changed
diff --git a/changelogs/unreleased/cngo-fix-autocomplete-selecting-loading.yml b/changelogs/unreleased/cngo-fix-autocomplete-selecting-loading.yml
new file mode 100644
index 00000000000..29b8bbcfda5
--- /dev/null
+++ b/changelogs/unreleased/cngo-fix-autocomplete-selecting-loading.yml
@@ -0,0 +1,5 @@
+---
+title: Fix `@` autocomplete selecting the loading icon
+merge_request: 54925
+author:
+type: fixed
diff --git a/changelogs/unreleased/cngo-rename-comment-form-textarea-label.yml b/changelogs/unreleased/cngo-rename-comment-form-textarea-label.yml
new file mode 100644
index 00000000000..a8a7499e260
--- /dev/null
+++ b/changelogs/unreleased/cngo-rename-comment-form-textarea-label.yml
@@ -0,0 +1,5 @@
+---
+title: Rename comment form textarea label to `Comment`
+merge_request: 55088
+author:
+type: changed
diff --git a/changelogs/unreleased/cq-template-0-85-23.yml b/changelogs/unreleased/cq-template-0-85-23.yml
new file mode 100644
index 00000000000..1513b61363b
--- /dev/null
+++ b/changelogs/unreleased/cq-template-0-85-23.yml
@@ -0,0 +1,5 @@
+---
+title: Use CodeQuality packaged with CodeClimate 0.85.23 by default in CI template
+merge_request: 55508
+author:
+type: changed
diff --git a/changelogs/unreleased/cwoolley-gitlab-master-patch-20932.yml b/changelogs/unreleased/cwoolley-gitlab-master-patch-20932.yml
new file mode 100644
index 00000000000..86679560713
--- /dev/null
+++ b/changelogs/unreleased/cwoolley-gitlab-master-patch-20932.yml
@@ -0,0 +1,5 @@
+---
+title: Fix bug in wiki page destroy API endpoint when an error is raised
+merge_request: 56285
+author:
+type: fixed
diff --git a/changelogs/unreleased/dblessing_bypass_2fa_setup_help.yml b/changelogs/unreleased/dblessing_bypass_2fa_setup_help.yml
new file mode 100644
index 00000000000..831a8b35ac8
--- /dev/null
+++ b/changelogs/unreleased/dblessing_bypass_2fa_setup_help.yml
@@ -0,0 +1,5 @@
+---
+title: Skip two factor setup for help pages
+merge_request: 54739
+author:
+type: fixed
diff --git a/changelogs/unreleased/dblessing_migrate_delayed_project_removal.yml b/changelogs/unreleased/dblessing_migrate_delayed_project_removal.yml
new file mode 100644
index 00000000000..c1ed2293e86
--- /dev/null
+++ b/changelogs/unreleased/dblessing_migrate_delayed_project_removal.yml
@@ -0,0 +1,5 @@
+---
+title: Migrate namespaces delayed_project_removal to namespace_settings
+merge_request: 53916
+author:
+type: changed
diff --git a/changelogs/unreleased/default-enabled-api_always_use_application_json.yml b/changelogs/unreleased/default-enabled-api_always_use_application_json.yml
new file mode 100644
index 00000000000..eabb936a32e
--- /dev/null
+++ b/changelogs/unreleased/default-enabled-api_always_use_application_json.yml
@@ -0,0 +1,5 @@
+---
+title: Change default API content_type to JSON
+merge_request: 54479
+author:
+type: changed
diff --git a/changelogs/unreleased/denys-fj-ide-routes.yml b/changelogs/unreleased/denys-fj-ide-routes.yml
new file mode 100644
index 00000000000..2ba27b0fad6
--- /dev/null
+++ b/changelogs/unreleased/denys-fj-ide-routes.yml
@@ -0,0 +1,5 @@
+---
+title: Move IDE routes to Rails
+merge_request: 55597
+author:
+type: changed
diff --git a/changelogs/unreleased/design-management-minor-fixe.yml b/changelogs/unreleased/design-management-minor-fixe.yml
new file mode 100644
index 00000000000..1100ce55f78
--- /dev/null
+++ b/changelogs/unreleased/design-management-minor-fixe.yml
@@ -0,0 +1,5 @@
+---
+title: Fix button alignment in design management header
+merge_request: 48003
+author:
+type: fixed
diff --git a/changelogs/unreleased/dictionary-md-generated-links.yml b/changelogs/unreleased/dictionary-md-generated-links.yml
new file mode 100644
index 00000000000..4a5a221127f
--- /dev/null
+++ b/changelogs/unreleased/dictionary-md-generated-links.yml
@@ -0,0 +1,5 @@
+---
+title: Fixed vestigial Anchor links in doc/development/usage_ping/dictionary.md
+merge_request: 55874
+author: Raimund Hook
+type: fixed
diff --git a/changelogs/unreleased/document-propagate-correlation-id-for-pages.yml b/changelogs/unreleased/document-propagate-correlation-id-for-pages.yml
new file mode 100644
index 00000000000..a54e9420763
--- /dev/null
+++ b/changelogs/unreleased/document-propagate-correlation-id-for-pages.yml
@@ -0,0 +1,5 @@
+---
+title: Document propagate_correlation_id configuration for GitLab Pages
+merge_request: 55205
+author: Ercan Ucan @ercan.ucan
+type: added
diff --git a/changelogs/unreleased/dora-metrics-modeling.yml b/changelogs/unreleased/dora-metrics-modeling.yml
new file mode 100644
index 00000000000..12724faa7b7
--- /dev/null
+++ b/changelogs/unreleased/dora-metrics-modeling.yml
@@ -0,0 +1,5 @@
+---
+title: Add DORA daily metrics modeling
+merge_request: 55473
+author:
+type: added
diff --git a/changelogs/unreleased/dry-up-notes-build-service-spec.yml b/changelogs/unreleased/dry-up-notes-build-service-spec.yml
new file mode 100644
index 00000000000..4aadaaa6030
--- /dev/null
+++ b/changelogs/unreleased/dry-up-notes-build-service-spec.yml
@@ -0,0 +1,5 @@
+---
+title: Dry up notes build service spec
+merge_request: 54632
+author: Lee Tickett @leetickett
+type: other
diff --git a/changelogs/unreleased/dz-fix-fork-thumbnail-height.yml b/changelogs/unreleased/dz-fix-fork-thumbnail-height.yml
new file mode 100644
index 00000000000..94f03854d98
--- /dev/null
+++ b/changelogs/unreleased/dz-fix-fork-thumbnail-height.yml
@@ -0,0 +1,5 @@
+---
+title: Fix fork thumbnail overflow
+merge_request: 55764
+author:
+type: fixed
diff --git a/changelogs/unreleased/ellipsis-expand-state-commits.yml b/changelogs/unreleased/ellipsis-expand-state-commits.yml
new file mode 100644
index 00000000000..1e655514f72
--- /dev/null
+++ b/changelogs/unreleased/ellipsis-expand-state-commits.yml
@@ -0,0 +1,5 @@
+---
+title: Add selected state for ellipsis button in a commit
+merge_request: 54754
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/emilyring-clustertoken-name.yml b/changelogs/unreleased/emilyring-clustertoken-name.yml
new file mode 100644
index 00000000000..887a88b3b29
--- /dev/null
+++ b/changelogs/unreleased/emilyring-clustertoken-name.yml
@@ -0,0 +1,5 @@
+---
+title: Add name field to cluster agent token
+merge_request: 53920
+author:
+type: changed
diff --git a/changelogs/unreleased/enable-trace_memory_allocations.yml b/changelogs/unreleased/enable-trace_memory_allocations.yml
new file mode 100644
index 00000000000..e8aec91de13
--- /dev/null
+++ b/changelogs/unreleased/enable-trace_memory_allocations.yml
@@ -0,0 +1,5 @@
+---
+title: Enable `trace_memory_allocations` by default
+merge_request: 55369
+author:
+type: changed
diff --git a/changelogs/unreleased/environment-scoped-group-variables.yml b/changelogs/unreleased/environment-scoped-group-variables.yml
new file mode 100644
index 00000000000..d0cdb31851d
--- /dev/null
+++ b/changelogs/unreleased/environment-scoped-group-variables.yml
@@ -0,0 +1,5 @@
+---
+title: Add environment_scope column to ci_group_variables
+merge_request: 55256
+author:
+type: other
diff --git a/changelogs/unreleased/environment-tier.yml b/changelogs/unreleased/environment-tier.yml
new file mode 100644
index 00000000000..0f3f7e14133
--- /dev/null
+++ b/changelogs/unreleased/environment-tier.yml
@@ -0,0 +1,5 @@
+---
+title: Add tier column to the environments table
+merge_request: 55471
+author:
+type: added
diff --git a/changelogs/unreleased/epic_count_query.yml b/changelogs/unreleased/epic_count_query.yml
new file mode 100644
index 00000000000..e449caa1fad
--- /dev/null
+++ b/changelogs/unreleased/epic_count_query.yml
@@ -0,0 +1,6 @@
+---
+title: Added composite index to epic_issues table and improved performance of loading
+ bigger epic roadmaps
+merge_request: 54677
+author:
+type: performance
diff --git a/changelogs/unreleased/expand-stopped-env.yml b/changelogs/unreleased/expand-stopped-env.yml
new file mode 100644
index 00000000000..87b47b59b7e
--- /dev/null
+++ b/changelogs/unreleased/expand-stopped-env.yml
@@ -0,0 +1,5 @@
+---
+title: Expand nested stopped environments
+merge_request: 55676
+author:
+type: changed
diff --git a/changelogs/unreleased/expose-failure-reasons-features.yml b/changelogs/unreleased/expose-failure-reasons-features.yml
new file mode 100644
index 00000000000..1fb7d63b911
--- /dev/null
+++ b/changelogs/unreleased/expose-failure-reasons-features.yml
@@ -0,0 +1,5 @@
+---
+title: Expose `failure_reasons` in `Build#features`
+merge_request: 53964
+author:
+type: added
diff --git a/changelogs/unreleased/expose_project_container_registry_url.yml b/changelogs/unreleased/expose_project_container_registry_url.yml
new file mode 100644
index 00000000000..923d14ed5a6
--- /dev/null
+++ b/changelogs/unreleased/expose_project_container_registry_url.yml
@@ -0,0 +1,5 @@
+---
+title: Expose container_registry_image_prefix to project API
+merge_request: 54090
+author: Mathieu Parent
+type: added
diff --git a/changelogs/unreleased/feat-api-application-settings-package-file-size-limits.yml b/changelogs/unreleased/feat-api-application-settings-package-file-size-limits.yml
new file mode 100644
index 00000000000..f07fd8210f3
--- /dev/null
+++ b/changelogs/unreleased/feat-api-application-settings-package-file-size-limits.yml
@@ -0,0 +1,5 @@
+---
+title: Add API endpoint /application/plan_limits for package file size limits
+merge_request: 54232
+author: Jonas Wälter @wwwjon
+type: added
diff --git a/changelogs/unreleased/feat-auto-enable-admin-mode-rake-runtime.yml b/changelogs/unreleased/feat-auto-enable-admin-mode-rake-runtime.yml
new file mode 100644
index 00000000000..2f933cc250d
--- /dev/null
+++ b/changelogs/unreleased/feat-auto-enable-admin-mode-rake-runtime.yml
@@ -0,0 +1,5 @@
+---
+title: Auto-enable admin mode on privileged environments
+merge_request: 53015
+author: Diego Louzán
+type: changed
diff --git a/changelogs/unreleased/feature-230726-repo-tabs.yml b/changelogs/unreleased/feature-230726-repo-tabs.yml
new file mode 100644
index 00000000000..7de7085fd04
--- /dev/null
+++ b/changelogs/unreleased/feature-230726-repo-tabs.yml
@@ -0,0 +1,5 @@
+---
+title: convert to GlTabs in app/assets/javascripts/ide/components/repo_tabs.vue
+merge_request: 42162
+author: Brandon Everett
+type: added
diff --git a/changelogs/unreleased/feature-gb-improve-builds-queueing.yml b/changelogs/unreleased/feature-gb-improve-builds-queueing.yml
new file mode 100644
index 00000000000..c334fb188e3
--- /dev/null
+++ b/changelogs/unreleased/feature-gb-improve-builds-queueing.yml
@@ -0,0 +1,5 @@
+---
+title: Improve performance of builds queuing by introducing a limit on the queue depth
+merge_request: 54579
+author:
+type: performance
diff --git a/changelogs/unreleased/fix-edited-timestamp.yml b/changelogs/unreleased/fix-edited-timestamp.yml
new file mode 100644
index 00000000000..83b8e4fcf21
--- /dev/null
+++ b/changelogs/unreleased/fix-edited-timestamp.yml
@@ -0,0 +1,5 @@
+---
+title: Fix edited timestamp updated when transforming / resolving comments
+merge_request: 55671
+author: Mycroft Kang @TaehyeokKang
+type: fixed
diff --git a/changelogs/unreleased/fix-include-external-users-in-user-search.yml b/changelogs/unreleased/fix-include-external-users-in-user-search.yml
new file mode 100644
index 00000000000..7421db86f1e
--- /dev/null
+++ b/changelogs/unreleased/fix-include-external-users-in-user-search.yml
@@ -0,0 +1,5 @@
+---
+title: 'API: include external users in user search for non-admins'
+merge_request: 53584
+author: Jonas Wälter @wwwjon
+type: changed
diff --git a/changelogs/unreleased/fix-iteration-migr.yml b/changelogs/unreleased/fix-iteration-migr.yml
new file mode 100644
index 00000000000..0f74cb695a0
--- /dev/null
+++ b/changelogs/unreleased/fix-iteration-migr.yml
@@ -0,0 +1,5 @@
+---
+title: Fix setting default cadences migration
+merge_request: 54598
+author:
+type: other
diff --git a/changelogs/unreleased/fix-locked-job-artifacts-expired-api.yml b/changelogs/unreleased/fix-locked-job-artifacts-expired-api.yml
new file mode 100644
index 00000000000..13cc21e83dd
--- /dev/null
+++ b/changelogs/unreleased/fix-locked-job-artifacts-expired-api.yml
@@ -0,0 +1,5 @@
+---
+title: Correct job artifacts API download for expired and locked files
+merge_request: 53567
+author: Fabio Huser
+type: fixed
diff --git a/changelogs/unreleased/fix-overflowing-width-at-mention-selector.yml b/changelogs/unreleased/fix-overflowing-width-at-mention-selector.yml
new file mode 100644
index 00000000000..b28395fccca
--- /dev/null
+++ b/changelogs/unreleased/fix-overflowing-width-at-mention-selector.yml
@@ -0,0 +1,5 @@
+---
+title: Fix overflowing width - at mention container
+merge_request: 54377
+author:
+type: fixed
diff --git a/changelogs/unreleased/fix-project-import-visibility-error.yml b/changelogs/unreleased/fix-project-import-visibility-error.yml
new file mode 100644
index 00000000000..266ddce039d
--- /dev/null
+++ b/changelogs/unreleased/fix-project-import-visibility-error.yml
@@ -0,0 +1,5 @@
+---
+title: Fix project import error occurring due to default visibility
+merge_request: 53827
+author: Jonas Wälter @wwwjon
+type: fixed
diff --git a/changelogs/unreleased/fix-relative-position-on-move-and-copy-issue.yml b/changelogs/unreleased/fix-relative-position-on-move-and-copy-issue.yml
new file mode 100644
index 00000000000..03eb4dcb767
--- /dev/null
+++ b/changelogs/unreleased/fix-relative-position-on-move-and-copy-issue.yml
@@ -0,0 +1,5 @@
+---
+title: Handle relative position on issue move or clone
+merge_request: 55555
+author:
+type: fixed
diff --git a/changelogs/unreleased/fix-web-url-jira.yml b/changelogs/unreleased/fix-web-url-jira.yml
new file mode 100644
index 00000000000..0a0b973bb84
--- /dev/null
+++ b/changelogs/unreleased/fix-web-url-jira.yml
@@ -0,0 +1,5 @@
+---
+title: Use gitlab_web_url (if it exists) for issue title links in Issue lists
+merge_request: 55021
+author:
+type: fixed
diff --git a/changelogs/unreleased/fix_repo_storage_weights_admin.yml b/changelogs/unreleased/fix_repo_storage_weights_admin.yml
new file mode 100644
index 00000000000..159c2f0903d
--- /dev/null
+++ b/changelogs/unreleased/fix_repo_storage_weights_admin.yml
@@ -0,0 +1,5 @@
+---
+title: Allow saving repository weights after a storage has been removed
+merge_request: 55689
+author:
+type: fixed
diff --git a/changelogs/unreleased/fp-reduce-queries-when-ticking-runner-queue.yml b/changelogs/unreleased/fp-reduce-queries-when-ticking-runner-queue.yml
new file mode 100644
index 00000000000..ac43d37ebeb
--- /dev/null
+++ b/changelogs/unreleased/fp-reduce-queries-when-ticking-runner-queue.yml
@@ -0,0 +1,5 @@
+---
+title: Reduce queries when ticking runner queue
+merge_request: 55496
+author:
+type: performance
diff --git a/changelogs/unreleased/fp-reduce-runners-queries-when-picking-builds.yml b/changelogs/unreleased/fp-reduce-runners-queries-when-picking-builds.yml
new file mode 100644
index 00000000000..c339a51e571
--- /dev/null
+++ b/changelogs/unreleased/fp-reduce-runners-queries-when-picking-builds.yml
@@ -0,0 +1,5 @@
+---
+title: Shortcircuit expensive queries in Runner#can_pick?
+merge_request: 55518
+author:
+type: performance
diff --git a/changelogs/unreleased/georgekoltsov-bulk-import-migrate-milestones.yml b/changelogs/unreleased/georgekoltsov-bulk-import-migrate-milestones.yml
new file mode 100644
index 00000000000..2418c12dad8
--- /dev/null
+++ b/changelogs/unreleased/georgekoltsov-bulk-import-migrate-milestones.yml
@@ -0,0 +1,5 @@
+---
+title: Migrate group milestones when using Bulk Import
+merge_request: 55981
+author:
+type: added
diff --git a/changelogs/unreleased/georgekoltsov-fix-project-export-web-rate-limit.yml b/changelogs/unreleased/georgekoltsov-fix-project-export-web-rate-limit.yml
new file mode 100644
index 00000000000..d38c4e93709
--- /dev/null
+++ b/changelogs/unreleased/georgekoltsov-fix-project-export-web-rate-limit.yml
@@ -0,0 +1,5 @@
+---
+title: Fix Web Project Export rate limiting scope
+merge_request: 55975
+author:
+type: fixed
diff --git a/changelogs/unreleased/gl-badge-runners.yml b/changelogs/unreleased/gl-badge-runners.yml
new file mode 100644
index 00000000000..9b572401264
--- /dev/null
+++ b/changelogs/unreleased/gl-badge-runners.yml
@@ -0,0 +1,5 @@
+---
+title: Apply new GitLab UI for badge in runners list
+merge_request: 54766
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/gl-button-apply-template.yml b/changelogs/unreleased/gl-button-apply-template.yml
new file mode 100644
index 00000000000..cf03a388a69
--- /dev/null
+++ b/changelogs/unreleased/gl-button-apply-template.yml
@@ -0,0 +1,5 @@
+---
+title: Apply new GitLab UI for apply template button in new issue
+merge_request: 54143
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/gl-button-audit-events.yml b/changelogs/unreleased/gl-button-audit-events.yml
new file mode 100644
index 00000000000..8a4989da2e3
--- /dev/null
+++ b/changelogs/unreleased/gl-button-audit-events.yml
@@ -0,0 +1,5 @@
+---
+title: Apply new GitLab UI for button in promotion link
+merge_request: 54755
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/gl-button-email-request.yml b/changelogs/unreleased/gl-button-email-request.yml
new file mode 100644
index 00000000000..d5c26d4e124
--- /dev/null
+++ b/changelogs/unreleased/gl-button-email-request.yml
@@ -0,0 +1,5 @@
+---
+title: Apply new GitLab UI for request email button
+merge_request: 53966
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/gl-button-gh-import.yml b/changelogs/unreleased/gl-button-gh-import.yml
new file mode 100644
index 00000000000..c70acaaf8a9
--- /dev/null
+++ b/changelogs/unreleased/gl-button-gh-import.yml
@@ -0,0 +1,5 @@
+---
+title: Apply new GitLab UI for buttons on GitHub Import page
+merge_request: 56096
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/gl-button-labels.yml b/changelogs/unreleased/gl-button-labels.yml
new file mode 100644
index 00000000000..ef25d3a778d
--- /dev/null
+++ b/changelogs/unreleased/gl-button-labels.yml
@@ -0,0 +1,5 @@
+---
+title: Apply new GitLab UI for buttons in empty label placeholder
+merge_request: 54760
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/gl-button-reaction.yml b/changelogs/unreleased/gl-button-reaction.yml
new file mode 100644
index 00000000000..5fe4cc11f92
--- /dev/null
+++ b/changelogs/unreleased/gl-button-reaction.yml
@@ -0,0 +1,5 @@
+---
+title: Move add reaction button of note to gl-button
+merge_request: 53565
+author: Yogi (@yo)
+type: other
diff --git a/changelogs/unreleased/gl-button-repository-settings.yml b/changelogs/unreleased/gl-button-repository-settings.yml
new file mode 100644
index 00000000000..921309f97fa
--- /dev/null
+++ b/changelogs/unreleased/gl-button-repository-settings.yml
@@ -0,0 +1,5 @@
+---
+title: Apply new GitLab UI for button is project settings/repository page
+merge_request: 53346
+author: Yogi (@yo)
+type: other
diff --git a/changelogs/unreleased/gl-button-time-tracking.yml b/changelogs/unreleased/gl-button-time-tracking.yml
new file mode 100644
index 00000000000..923cc3db7d8
--- /dev/null
+++ b/changelogs/unreleased/gl-button-time-tracking.yml
@@ -0,0 +1,5 @@
+---
+title: Apply new GitLab UI for learn more button in time tracking
+merge_request: 54142
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/hchouraria-notify-email-html-link-to-mr-on-top.yml b/changelogs/unreleased/hchouraria-notify-email-html-link-to-mr-on-top.yml
new file mode 100644
index 00000000000..3f7bc60b4e6
--- /dev/null
+++ b/changelogs/unreleased/hchouraria-notify-email-html-link-to-mr-on-top.yml
@@ -0,0 +1,5 @@
+---
+title: Link to the merge request in its creation email notification
+merge_request: 56064
+author:
+type: other
diff --git a/changelogs/unreleased/id-move-delete-branch-to-workers.yml b/changelogs/unreleased/id-move-delete-branch-to-workers.yml
new file mode 100644
index 00000000000..b5dd5dbfb9f
--- /dev/null
+++ b/changelogs/unreleased/id-move-delete-branch-to-workers.yml
@@ -0,0 +1,5 @@
+---
+title: Move branch deletion on merge to async worker
+merge_request: 55390
+author:
+type: performance
diff --git a/changelogs/unreleased/ignore-unstable-changelog-tags.yml b/changelogs/unreleased/ignore-unstable-changelog-tags.yml
new file mode 100644
index 00000000000..d701b3f67cc
--- /dev/null
+++ b/changelogs/unreleased/ignore-unstable-changelog-tags.yml
@@ -0,0 +1,5 @@
+---
+title: Ignore prerelease tags when generating changelogs
+merge_request: 55065
+author:
+type: changed
diff --git a/changelogs/unreleased/improve-retarget-merge-requests.yml b/changelogs/unreleased/improve-retarget-merge-requests.yml
new file mode 100644
index 00000000000..f194ef7a151
--- /dev/null
+++ b/changelogs/unreleased/improve-retarget-merge-requests.yml
@@ -0,0 +1,5 @@
+---
+title: Automatically retarget merge requests upon merge (default on)
+merge_request: 56233
+author:
+type: added
diff --git a/changelogs/unreleased/improve_vuln_tracking-backend_store_only.yml b/changelogs/unreleased/improve_vuln_tracking-backend_store_only.yml
new file mode 100644
index 00000000000..f3f68d62043
--- /dev/null
+++ b/changelogs/unreleased/improve_vuln_tracking-backend_store_only.yml
@@ -0,0 +1,5 @@
+---
+title: 'Improve Vulnerability Tracking: Store Fingerprints'
+merge_request: 55173
+author:
+type: added
diff --git a/changelogs/unreleased/issue_227753-remove_backup_labels_table.yml b/changelogs/unreleased/issue_227753-remove_backup_labels_table.yml
new file mode 100644
index 00000000000..17ebced5ccb
--- /dev/null
+++ b/changelogs/unreleased/issue_227753-remove_backup_labels_table.yml
@@ -0,0 +1,5 @@
+---
+title: Remove backup_labels table
+merge_request: 54856
+author:
+type: other
diff --git a/changelogs/unreleased/iterations-dates-validations.yml b/changelogs/unreleased/iterations-dates-validations.yml
new file mode 100644
index 00000000000..f22ac76c72d
--- /dev/null
+++ b/changelogs/unreleased/iterations-dates-validations.yml
@@ -0,0 +1,5 @@
+---
+title: Allow overlapping iteration dates with ancestor group iterations and restrict dates overlapping for iterations within same group
+merge_request: 52403
+author:
+type: changed
diff --git a/changelogs/unreleased/iterations-in-the-past.yml b/changelogs/unreleased/iterations-in-the-past.yml
new file mode 100644
index 00000000000..07386448d6c
--- /dev/null
+++ b/changelogs/unreleased/iterations-in-the-past.yml
@@ -0,0 +1,5 @@
+---
+title: Allow creation of iterations in the past
+merge_request: 52403
+author:
+type: changed
diff --git a/changelogs/unreleased/jira-connect-app-style-cleanup.yml b/changelogs/unreleased/jira-connect-app-style-cleanup.yml
new file mode 100644
index 00000000000..1f28ebb276b
--- /dev/null
+++ b/changelogs/unreleased/jira-connect-app-style-cleanup.yml
@@ -0,0 +1,5 @@
+---
+title: Improve Jira connect app styling and i18n
+merge_request: 53441
+author:
+type: changed
diff --git a/changelogs/unreleased/jivanvl-add-duration-finished-at-fields-job-type.yml b/changelogs/unreleased/jivanvl-add-duration-finished-at-fields-job-type.yml
new file mode 100644
index 00000000000..480e8bea486
--- /dev/null
+++ b/changelogs/unreleased/jivanvl-add-duration-finished-at-fields-job-type.yml
@@ -0,0 +1,5 @@
+---
+title: Add duration and finishedAt GraphQL fields to jobType in the CI namespace
+merge_request: 54358
+author:
+type: changed
diff --git a/changelogs/unreleased/john_long-composer-package-relative-url.yml b/changelogs/unreleased/john_long-composer-package-relative-url.yml
new file mode 100644
index 00000000000..d1938a72a9b
--- /dev/null
+++ b/changelogs/unreleased/john_long-composer-package-relative-url.yml
@@ -0,0 +1,5 @@
+---
+title: Fix relative URL with composer package
+merge_request: 53918
+author:
+type: fixed
diff --git a/changelogs/unreleased/kassio-bulkimports-better-destination-validation-error-message.yml b/changelogs/unreleased/kassio-bulkimports-better-destination-validation-error-message.yml
new file mode 100644
index 00000000000..5a87d152630
--- /dev/null
+++ b/changelogs/unreleased/kassio-bulkimports-better-destination-validation-error-message.yml
@@ -0,0 +1,5 @@
+---
+title: Better error message when import fails due to backend validation
+merge_request: 54827
+author:
+type: changed
diff --git a/changelogs/unreleased/kassio-bulkimports-filter-group-labels.yml b/changelogs/unreleased/kassio-bulkimports-filter-group-labels.yml
new file mode 100644
index 00000000000..19248571a01
--- /dev/null
+++ b/changelogs/unreleased/kassio-bulkimports-filter-group-labels.yml
@@ -0,0 +1,5 @@
+---
+title: 'BulkImports: Avoid import ProjectLabels in the Group import level'
+merge_request: 54580
+author:
+type: changed
diff --git a/changelogs/unreleased/kassio-bulkimports-import-group-label-timestamps.yml b/changelogs/unreleased/kassio-bulkimports-import-group-label-timestamps.yml
new file mode 100644
index 00000000000..6abf01ddfeb
--- /dev/null
+++ b/changelogs/unreleased/kassio-bulkimports-import-group-label-timestamps.yml
@@ -0,0 +1,5 @@
+---
+title: 'BulkImports: Import Label timestamps'
+merge_request: 54678
+author:
+type: changed
diff --git a/changelogs/unreleased/kassio-githubimporter-avoid-approval-exception.yml b/changelogs/unreleased/kassio-githubimporter-avoid-approval-exception.yml
new file mode 100644
index 00000000000..cc994d50f4e
--- /dev/null
+++ b/changelogs/unreleased/kassio-githubimporter-avoid-approval-exception.yml
@@ -0,0 +1,5 @@
+---
+title: 'GithubImporter: Add Merge request approval only if it does not exists yet'
+merge_request: 55376
+author:
+type: fixed
diff --git a/changelogs/unreleased/kassio-githubimporter-import-merged-at.yml b/changelogs/unreleased/kassio-githubimporter-import-merged-at.yml
new file mode 100644
index 00000000000..bc4b196bb94
--- /dev/null
+++ b/changelogs/unreleased/kassio-githubimporter-import-merged-at.yml
@@ -0,0 +1,5 @@
+---
+title: 'Github Importer: Import Pull request "merged_at" attribute'
+merge_request: 54862
+author:
+type: fixed
diff --git a/changelogs/unreleased/kassio-githubimporter-validate-repository-size.yml b/changelogs/unreleased/kassio-githubimporter-validate-repository-size.yml
new file mode 100644
index 00000000000..c4688acbec5
--- /dev/null
+++ b/changelogs/unreleased/kassio-githubimporter-validate-repository-size.yml
@@ -0,0 +1,5 @@
+---
+title: 'Github Importer: Validate repository size before importing'
+merge_request: 54449
+author:
+type: changed
diff --git a/changelogs/unreleased/kassio-graphql-expose-label-create-at-updated-at.yml b/changelogs/unreleased/kassio-graphql-expose-label-create-at-updated-at.yml
new file mode 100644
index 00000000000..134b0090146
--- /dev/null
+++ b/changelogs/unreleased/kassio-graphql-expose-label-create-at-updated-at.yml
@@ -0,0 +1,5 @@
+---
+title: 'GraphQL: Expose Label "created_at" and "updated_at"'
+merge_request: 54487
+author:
+type: changed
diff --git a/changelogs/unreleased/kerrizor-remove-oprhaned-feature-flag-yml.yml b/changelogs/unreleased/kerrizor-remove-oprhaned-feature-flag-yml.yml
new file mode 100644
index 00000000000..25bb361818f
--- /dev/null
+++ b/changelogs/unreleased/kerrizor-remove-oprhaned-feature-flag-yml.yml
@@ -0,0 +1,5 @@
+---
+title: Remove usage_data_i_source_code_code_intelligence flag
+merge_request: 51765
+author:
+type: other
diff --git a/changelogs/unreleased/kp-sort-milestone-autocomplete.yml b/changelogs/unreleased/kp-sort-milestone-autocomplete.yml
new file mode 100644
index 00000000000..0d331deecb2
--- /dev/null
+++ b/changelogs/unreleased/kp-sort-milestone-autocomplete.yml
@@ -0,0 +1,5 @@
+---
+title: Sort milestones within autocomplete dropdown
+merge_request: 55850
+author:
+type: changed
diff --git a/changelogs/unreleased/ld-graphql-version-bump-gem-for-argument-deprecations.yml b/changelogs/unreleased/ld-graphql-version-bump-gem-for-argument-deprecations.yml
new file mode 100644
index 00000000000..170eef47f71
--- /dev/null
+++ b/changelogs/unreleased/ld-graphql-version-bump-gem-for-argument-deprecations.yml
@@ -0,0 +1,7 @@
+---
+title: Mark `startDate` and `endDate` arguments as deprecated in the GraphQL schema for `Project.milestones` and `Group.milestones`
+ (FOSS and EE), and `Project.iterations`, `Project.milestones`, `Group.epic`, `Group.epics`, `Group.iterations`, `Group.milestones`,
+ `BoardEpic.children`, and `Epic.children` fields (EE-only). Previously these arguments were marked as deprecated only in their descriptions
+merge_request: 45229
+author:
+type: changed
diff --git a/changelogs/unreleased/ld-handle-gids-for-unknown-objects.yml b/changelogs/unreleased/ld-handle-gids-for-unknown-objects.yml
new file mode 100644
index 00000000000..1b4cdc859ce
--- /dev/null
+++ b/changelogs/unreleased/ld-handle-gids-for-unknown-objects.yml
@@ -0,0 +1,5 @@
+---
+title: Handle GlobalIDs with invalid resource names
+merge_request: 54290
+author:
+type: fixed
diff --git a/changelogs/unreleased/leipert-remove-chrome-84-workaround.yml b/changelogs/unreleased/leipert-remove-chrome-84-workaround.yml
new file mode 100644
index 00000000000..9761525b030
--- /dev/null
+++ b/changelogs/unreleased/leipert-remove-chrome-84-workaround.yml
@@ -0,0 +1,5 @@
+---
+title: Remove workaround for icon loading in Chrome 84
+merge_request: 56114
+author:
+type: removed
diff --git a/changelogs/unreleased/lm-add-short-sha-and-path-to-pipeline.yml b/changelogs/unreleased/lm-add-short-sha-and-path-to-pipeline.yml
new file mode 100644
index 00000000000..6795afd4c64
--- /dev/null
+++ b/changelogs/unreleased/lm-add-short-sha-and-path-to-pipeline.yml
@@ -0,0 +1,5 @@
+---
+title: Allow search for pipeline by SHA as well as IID via GraphQL
+merge_request: 54471
+author:
+type: changed
diff --git a/changelogs/unreleased/lm-multiple-cache-per-file.yml b/changelogs/unreleased/lm-multiple-cache-per-file.yml
new file mode 100644
index 00000000000..edd1afd4b7f
--- /dev/null
+++ b/changelogs/unreleased/lm-multiple-cache-per-file.yml
@@ -0,0 +1,5 @@
+---
+title: Adds ability to have multiple cache per job
+merge_request: 53410
+author:
+type: changed
diff --git a/changelogs/unreleased/mc-backstage-reschedule-artifact-expiry-backfill.yml b/changelogs/unreleased/mc-backstage-reschedule-artifact-expiry-backfill.yml
new file mode 100644
index 00000000000..b6c82a06ce9
--- /dev/null
+++ b/changelogs/unreleased/mc-backstage-reschedule-artifact-expiry-backfill.yml
@@ -0,0 +1,5 @@
+---
+title: Reschedule artifact expiry backfill
+merge_request: 55093
+author:
+type: changed
diff --git a/changelogs/unreleased/mc-bug-reduce-ci-minute-namespace-notification-db-load.yml b/changelogs/unreleased/mc-bug-reduce-ci-minute-namespace-notification-db-load.yml
new file mode 100644
index 00000000000..9707dc4623e
--- /dev/null
+++ b/changelogs/unreleased/mc-bug-reduce-ci-minute-namespace-notification-db-load.yml
@@ -0,0 +1,5 @@
+---
+title: Reduce DB load when resetting CI minute notifications.
+merge_request: 55765
+author:
+type: performance
diff --git a/changelogs/unreleased/mc-bug-remove-reliance-on-branch-context.yml b/changelogs/unreleased/mc-bug-remove-reliance-on-branch-context.yml
new file mode 100644
index 00000000000..a4631a8394f
--- /dev/null
+++ b/changelogs/unreleased/mc-bug-remove-reliance-on-branch-context.yml
@@ -0,0 +1,5 @@
+---
+title: Resolve project from branch in commit resolver.
+merge_request: 55694
+author:
+type: fixed
diff --git a/changelogs/unreleased/mc-feature-add-user-callout-graphql.yml b/changelogs/unreleased/mc-feature-add-user-callout-graphql.yml
new file mode 100644
index 00000000000..cdfa42826cb
--- /dev/null
+++ b/changelogs/unreleased/mc-feature-add-user-callout-graphql.yml
@@ -0,0 +1,5 @@
+---
+title: Add user callouts to GraphQL.
+merge_request: 55099
+author:
+type: added
diff --git a/changelogs/unreleased/mf-test-report-parsing-errors-frontend.yml b/changelogs/unreleased/mf-test-report-parsing-errors-frontend.yml
new file mode 100644
index 00000000000..82458400041
--- /dev/null
+++ b/changelogs/unreleased/mf-test-report-parsing-errors-frontend.yml
@@ -0,0 +1,5 @@
+---
+title: Display parsing errors in test reports MR widget
+merge_request: 55037
+author:
+type: added
diff --git a/changelogs/unreleased/mg-fix-firefox-textarea-styling.yml b/changelogs/unreleased/mg-fix-firefox-textarea-styling.yml
new file mode 100644
index 00000000000..6830be548f5
--- /dev/null
+++ b/changelogs/unreleased/mg-fix-firefox-textarea-styling.yml
@@ -0,0 +1,5 @@
+---
+title: Fix style issue with "reply" placeholder textarea in firefox
+merge_request: 54592
+author:
+type: fixed
diff --git a/changelogs/unreleased/mo-enable-cq-comparision-backend.yml b/changelogs/unreleased/mo-enable-cq-comparision-backend.yml
new file mode 100644
index 00000000000..74536b16d6f
--- /dev/null
+++ b/changelogs/unreleased/mo-enable-cq-comparision-backend.yml
@@ -0,0 +1,5 @@
+---
+title: Enable codequality report comparison with backend
+merge_request: 54241
+author:
+type: performance
diff --git a/changelogs/unreleased/mo-filter-group-projects-by-ids-graphql.yml b/changelogs/unreleased/mo-filter-group-projects-by-ids-graphql.yml
new file mode 100644
index 00000000000..13f4d0a2df1
--- /dev/null
+++ b/changelogs/unreleased/mo-filter-group-projects-by-ids-graphql.yml
@@ -0,0 +1,5 @@
+---
+title: Query group projects by ids with GraphQL
+merge_request: 55383
+author:
+type: added
diff --git a/changelogs/unreleased/mo-refactor-coverage-finder.yml b/changelogs/unreleased/mo-refactor-coverage-finder.yml
new file mode 100644
index 00000000000..a064f148f6a
--- /dev/null
+++ b/changelogs/unreleased/mo-refactor-coverage-finder.yml
@@ -0,0 +1,5 @@
+---
+title: Remove coverage_data_new_finder feature flag
+merge_request: 54486
+author:
+type: performance
diff --git a/changelogs/unreleased/move-cancel-btn-integrations.yml b/changelogs/unreleased/move-cancel-btn-integrations.yml
new file mode 100644
index 00000000000..d69652631f1
--- /dev/null
+++ b/changelogs/unreleased/move-cancel-btn-integrations.yml
@@ -0,0 +1,5 @@
+---
+title: Group integration settings buttons to the left
+merge_request: 55139
+author:
+type: changed
diff --git a/changelogs/unreleased/move_ci_config_path_project_variable.yml b/changelogs/unreleased/move_ci_config_path_project_variable.yml
new file mode 100644
index 00000000000..f24a58a92d9
--- /dev/null
+++ b/changelogs/unreleased/move_ci_config_path_project_variable.yml
@@ -0,0 +1,5 @@
+---
+title: Move CI_CONFIG_PATH as project variable and deprecate CI_PROJECT_CONFIG_PATH
+merge_request: 54498
+author:
+type: changed
diff --git a/changelogs/unreleased/mvanremmerden-master-patch-70791.yml b/changelogs/unreleased/mvanremmerden-master-patch-70791.yml
new file mode 100644
index 00000000000..b7a2a57a805
--- /dev/null
+++ b/changelogs/unreleased/mvanremmerden-master-patch-70791.yml
@@ -0,0 +1,5 @@
+---
+title: Align heading style with subheadings in markdown
+merge_request: 55284
+author:
+type: other
diff --git a/changelogs/unreleased/mwps-settings.yml b/changelogs/unreleased/mwps-settings.yml
new file mode 100644
index 00000000000..cf4c4c7be6c
--- /dev/null
+++ b/changelogs/unreleased/mwps-settings.yml
@@ -0,0 +1,5 @@
+---
+title: Add setting to control merge when pipeline succeeds notification
+merge_request: 37880
+author: Ravishankar
+type: added
diff --git a/changelogs/unreleased/nakayoshi-default-enabled.yml b/changelogs/unreleased/nakayoshi-default-enabled.yml
new file mode 100644
index 00000000000..7bc6ecac334
--- /dev/null
+++ b/changelogs/unreleased/nakayoshi-default-enabled.yml
@@ -0,0 +1,5 @@
+---
+title: Enable `nakayoshi_fork` by default
+merge_request: 54688
+author:
+type: other
diff --git a/changelogs/unreleased/nfriend-add-release-asset-link-create-mutation.yml b/changelogs/unreleased/nfriend-add-release-asset-link-create-mutation.yml
new file mode 100644
index 00000000000..0ec1c4a04f3
--- /dev/null
+++ b/changelogs/unreleased/nfriend-add-release-asset-link-create-mutation.yml
@@ -0,0 +1,5 @@
+---
+title: Add GraphQL mutation to create release asset link
+merge_request: 54605
+author:
+type: added
diff --git a/changelogs/unreleased/nfriend-allow-release-creation-on-existing-tag-through-ui.yml b/changelogs/unreleased/nfriend-allow-release-creation-on-existing-tag-through-ui.yml
new file mode 100644
index 00000000000..9f909eac708
--- /dev/null
+++ b/changelogs/unreleased/nfriend-allow-release-creation-on-existing-tag-through-ui.yml
@@ -0,0 +1,5 @@
+---
+title: Allow release to be created on existing tag through the UI
+merge_request: 55697
+author:
+type: added
diff --git a/changelogs/unreleased/nfriend-fix-gl-dropdown-double-scrollbars.yml b/changelogs/unreleased/nfriend-fix-gl-dropdown-double-scrollbars.yml
new file mode 100644
index 00000000000..7898da24731
--- /dev/null
+++ b/changelogs/unreleased/nfriend-fix-gl-dropdown-double-scrollbars.yml
@@ -0,0 +1,5 @@
+---
+title: Fix double scrollbars in some dropdowns
+merge_request: 54837
+author:
+type: fixed
diff --git a/changelogs/unreleased/nfriend-fix-milestone-combobox-double-scrollbar.yml b/changelogs/unreleased/nfriend-fix-milestone-combobox-double-scrollbar.yml
new file mode 100644
index 00000000000..d31de30feca
--- /dev/null
+++ b/changelogs/unreleased/nfriend-fix-milestone-combobox-double-scrollbar.yml
@@ -0,0 +1,5 @@
+---
+title: Fix double scrollbar issue in milestone selector dropdown
+merge_request: 54734
+author:
+type: fixed
diff --git a/changelogs/unreleased/nfriend-fix-ref-selector-double-dropdown.yml b/changelogs/unreleased/nfriend-fix-ref-selector-double-dropdown.yml
new file mode 100644
index 00000000000..61d549bd15b
--- /dev/null
+++ b/changelogs/unreleased/nfriend-fix-ref-selector-double-dropdown.yml
@@ -0,0 +1,5 @@
+---
+title: Fix double scrollbar in ref selector dropdown
+merge_request: 54719
+author:
+type: fixed
diff --git a/changelogs/unreleased/nfriend-ref-selector-dropdown-cleanup.yml b/changelogs/unreleased/nfriend-ref-selector-dropdown-cleanup.yml
new file mode 100644
index 00000000000..f9fd96dac48
--- /dev/null
+++ b/changelogs/unreleased/nfriend-ref-selector-dropdown-cleanup.yml
@@ -0,0 +1,5 @@
+---
+title: Small visual updates to Git ref selector dropdown on New/Edit Release page
+merge_request: 55121
+author:
+type: changed
diff --git a/changelogs/unreleased/nfriend-turn-off-ref-selector-autocomplete.yml b/changelogs/unreleased/nfriend-turn-off-ref-selector-autocomplete.yml
new file mode 100644
index 00000000000..8e67251f06d
--- /dev/null
+++ b/changelogs/unreleased/nfriend-turn-off-ref-selector-autocomplete.yml
@@ -0,0 +1,5 @@
+---
+title: Turn off native autocomplete for ref selector components
+merge_request: 56128
+author:
+type: fixed
diff --git a/changelogs/unreleased/nicolasdular-record-issue-creation-onboarding-progress.yml b/changelogs/unreleased/nicolasdular-record-issue-creation-onboarding-progress.yml
new file mode 100644
index 00000000000..604335202b5
--- /dev/null
+++ b/changelogs/unreleased/nicolasdular-record-issue-creation-onboarding-progress.yml
@@ -0,0 +1,5 @@
+---
+title: Record onboarding action for issue creation
+merge_request: 53611
+author:
+type: changed
diff --git a/changelogs/unreleased/ntepluhina-fix-design-management-reply-placeholder.yml b/changelogs/unreleased/ntepluhina-fix-design-management-reply-placeholder.yml
new file mode 100644
index 00000000000..c48e549462a
--- /dev/null
+++ b/changelogs/unreleased/ntepluhina-fix-design-management-reply-placeholder.yml
@@ -0,0 +1,5 @@
+---
+title: Added a missing class to reply placeholder
+merge_request: 54817
+author:
+type: fixed
diff --git a/changelogs/unreleased/pb-store-bare-class-name-for-batched-migrations.yml b/changelogs/unreleased/pb-store-bare-class-name-for-batched-migrations.yml
new file mode 100644
index 00000000000..7c27d4ae9a2
--- /dev/null
+++ b/changelogs/unreleased/pb-store-bare-class-name-for-batched-migrations.yml
@@ -0,0 +1,6 @@
+---
+title: Change the default batch_class_name for batched_background_migrations to the
+ unqualified class name
+merge_request: 56036
+author:
+type: changed
diff --git a/changelogs/unreleased/pb-track-background-job-executions.yml b/changelogs/unreleased/pb-track-background-job-executions.yml
new file mode 100644
index 00000000000..bedf6317e8d
--- /dev/null
+++ b/changelogs/unreleased/pb-track-background-job-executions.yml
@@ -0,0 +1,5 @@
+---
+title: Create tables to track auto-batched background migrations
+merge_request: 54628
+author:
+type: added
diff --git a/changelogs/unreleased/peterhegman-remove-vue_project_members_list-feature-flag.yml b/changelogs/unreleased/peterhegman-remove-vue_project_members_list-feature-flag.yml
new file mode 100644
index 00000000000..06617c82212
--- /dev/null
+++ b/changelogs/unreleased/peterhegman-remove-vue_project_members_list-feature-flag.yml
@@ -0,0 +1,5 @@
+---
+title: Remove `vue_project_members_list` feature flag
+merge_request: 55902
+author:
+type: changed
diff --git a/changelogs/unreleased/ph-282476-fixGraphQLDiffComments.yml b/changelogs/unreleased/ph-282476-fixGraphQLDiffComments.yml
new file mode 100644
index 00000000000..c7b5acf018d
--- /dev/null
+++ b/changelogs/unreleased/ph-282476-fixGraphQLDiffComments.yml
@@ -0,0 +1,5 @@
+---
+title: Fixed diff notes GraphQL mutation not allowing comments on deleted lines
+merge_request: 54801
+author:
+type: fixed
diff --git a/changelogs/unreleased/ph-284212-moveCodeownersTipToVueApp.yml b/changelogs/unreleased/ph-284212-moveCodeownersTipToVueApp.yml
new file mode 100644
index 00000000000..a73782b0975
--- /dev/null
+++ b/changelogs/unreleased/ph-284212-moveCodeownersTipToVueApp.yml
@@ -0,0 +1,5 @@
+---
+title: Moved CODEOWNERS tip into approvals Vue app
+merge_request: 54830
+author:
+type: changed
diff --git a/changelogs/unreleased/ph-defaultEnableWidgetGraphqlFlag.yml b/changelogs/unreleased/ph-defaultEnableWidgetGraphqlFlag.yml
new file mode 100644
index 00000000000..09bd5864bd7
--- /dev/null
+++ b/changelogs/unreleased/ph-defaultEnableWidgetGraphqlFlag.yml
@@ -0,0 +1,5 @@
+---
+title: Convert merge request widget state to use GraphQL
+merge_request: 53846
+author:
+type: changed
diff --git a/changelogs/unreleased/philipcunningham-add-branch-to-dast-profile-322526.yml b/changelogs/unreleased/philipcunningham-add-branch-to-dast-profile-322526.yml
new file mode 100644
index 00000000000..4ad204b7cd1
--- /dev/null
+++ b/changelogs/unreleased/philipcunningham-add-branch-to-dast-profile-322526.yml
@@ -0,0 +1,5 @@
+---
+title: Add branch_name to dast_profiles table
+merge_request: 54891
+author:
+type: added
diff --git a/changelogs/unreleased/pipeline-editor-branch-param.yml b/changelogs/unreleased/pipeline-editor-branch-param.yml
new file mode 100644
index 00000000000..4a58c4a4676
--- /dev/null
+++ b/changelogs/unreleased/pipeline-editor-branch-param.yml
@@ -0,0 +1,5 @@
+---
+title: Allow users to work on non-default branch in pipeline editor
+merge_request: 55413
+author:
+type: added
diff --git a/changelogs/unreleased/pipeline-editor-empty-state.yml b/changelogs/unreleased/pipeline-editor-empty-state.yml
new file mode 100644
index 00000000000..9c729aa1b7f
--- /dev/null
+++ b/changelogs/unreleased/pipeline-editor-empty-state.yml
@@ -0,0 +1,5 @@
+---
+title: Add empty state to pipeline editor section
+merge_request: 55227
+author:
+type: changed
diff --git a/changelogs/unreleased/pks-checks-skip-integrity-lfs-deletions.yml b/changelogs/unreleased/pks-checks-skip-integrity-lfs-deletions.yml
new file mode 100644
index 00000000000..ffbc6cff4c3
--- /dev/null
+++ b/changelogs/unreleased/pks-checks-skip-integrity-lfs-deletions.yml
@@ -0,0 +1,5 @@
+---
+title: 'checks: Skip LFS checks when deleting refs'
+merge_request: 55609
+author:
+type: fixed
diff --git a/changelogs/unreleased/preload-environments-for-ci-cd-variables.yml b/changelogs/unreleased/preload-environments-for-ci-cd-variables.yml
new file mode 100644
index 00000000000..1c0b4938420
--- /dev/null
+++ b/changelogs/unreleased/preload-environments-for-ci-cd-variables.yml
@@ -0,0 +1,5 @@
+---
+title: Clear Environment Search in CI/CD Variables
+merge_request: 54626
+author:
+type: changed
diff --git a/changelogs/unreleased/preload-runner-tags.yml b/changelogs/unreleased/preload-runner-tags.yml
new file mode 100644
index 00000000000..1b733ce4113
--- /dev/null
+++ b/changelogs/unreleased/preload-runner-tags.yml
@@ -0,0 +1,5 @@
+---
+title: Preload runner tags for `UpdateBuildQueueService`
+merge_request: 55543
+author:
+type: performance
diff --git a/changelogs/unreleased/ps-fix-heading-style-email-diffs.yml b/changelogs/unreleased/ps-fix-heading-style-email-diffs.yml
new file mode 100644
index 00000000000..0511518ef24
--- /dev/null
+++ b/changelogs/unreleased/ps-fix-heading-style-email-diffs.yml
@@ -0,0 +1,5 @@
+---
+title: Fix inconsistent heading style in email diffs
+merge_request: 55420
+author:
+type: fixed
diff --git a/changelogs/unreleased/psi-boards-scrollbar.yml b/changelogs/unreleased/psi-boards-scrollbar.yml
new file mode 100644
index 00000000000..f797c8c0c76
--- /dev/null
+++ b/changelogs/unreleased/psi-boards-scrollbar.yml
@@ -0,0 +1,5 @@
+---
+title: Stop scrollbar stretching filtered search box
+merge_request: 54574
+author:
+type: fixed
diff --git a/changelogs/unreleased/qmnguyen0711-825-limit-the-size-of-sidekiq-jobs.yml b/changelogs/unreleased/qmnguyen0711-825-limit-the-size-of-sidekiq-jobs.yml
new file mode 100644
index 00000000000..f16acc6781b
--- /dev/null
+++ b/changelogs/unreleased/qmnguyen0711-825-limit-the-size-of-sidekiq-jobs.yml
@@ -0,0 +1,5 @@
+---
+title: Limit the payload size of Sidekiq jobs before scheduling
+merge_request: 53829
+author:
+type: added
diff --git a/changelogs/unreleased/qmnguyen0711-846-sentry-merge-sentry-s-contexts-and-users-into-applicatio.yml b/changelogs/unreleased/qmnguyen0711-846-sentry-merge-sentry-s-contexts-and-users-into-applicatio.yml
new file mode 100644
index 00000000000..bd4a97d264f
--- /dev/null
+++ b/changelogs/unreleased/qmnguyen0711-846-sentry-merge-sentry-s-contexts-and-users-into-applicatio.yml
@@ -0,0 +1,5 @@
+---
+title: Merge Sentry's contexts into Gitlab::ApplicationContext
+merge_request: 53691
+author:
+type: changed
diff --git a/changelogs/unreleased/qmnguyen0711-remove-latest-report-results-preloading.yml b/changelogs/unreleased/qmnguyen0711-remove-latest-report-results-preloading.yml
new file mode 100644
index 00000000000..19e5b039db2
--- /dev/null
+++ b/changelogs/unreleased/qmnguyen0711-remove-latest-report-results-preloading.yml
@@ -0,0 +1,5 @@
+---
+title: Remove latest_builds_report_results preloading in pipeline serializer
+merge_request: 56181
+author:
+type: performance
diff --git a/changelogs/unreleased/reenable-sentry-pipeline-graph-only.yml b/changelogs/unreleased/reenable-sentry-pipeline-graph-only.yml
new file mode 100644
index 00000000000..47711e6da82
--- /dev/null
+++ b/changelogs/unreleased/reenable-sentry-pipeline-graph-only.yml
@@ -0,0 +1,5 @@
+---
+title: Restore Sentry functionaly to the frontend
+merge_request: 54441
+author:
+type: changed
diff --git a/changelogs/unreleased/refactor-use-policies-framework-for-admin.yml b/changelogs/unreleased/refactor-use-policies-framework-for-admin.yml
new file mode 100644
index 00000000000..6b282a6e8cc
--- /dev/null
+++ b/changelogs/unreleased/refactor-use-policies-framework-for-admin.yml
@@ -0,0 +1,5 @@
+---
+title: Use policies for group access rights as admin
+merge_request: 55349
+author: Diego Louzán
+type: changed
diff --git a/changelogs/unreleased/relax-changelog-tag-restriction.yml b/changelogs/unreleased/relax-changelog-tag-restriction.yml
new file mode 100644
index 00000000000..ef8e74dc797
--- /dev/null
+++ b/changelogs/unreleased/relax-changelog-tag-restriction.yml
@@ -0,0 +1,5 @@
+---
+title: Relax tag requirements when generating changelogs
+merge_request: 54832
+author:
+type: changed
diff --git a/changelogs/unreleased/remove-bootstrap-dropdowns-from-note-components.yml b/changelogs/unreleased/remove-bootstrap-dropdowns-from-note-components.yml
new file mode 100644
index 00000000000..b55e6b2da7d
--- /dev/null
+++ b/changelogs/unreleased/remove-bootstrap-dropdowns-from-note-components.yml
@@ -0,0 +1,6 @@
+---
+title: Migrated Bootstrap dropdown to GitLab UI GlDropdown used for comment submit
+ button
+merge_request: 50933
+author:
+type: other
diff --git a/changelogs/unreleased/remove-ci_jwt_include_environment-feature-flag.yml b/changelogs/unreleased/remove-ci_jwt_include_environment-feature-flag.yml
new file mode 100644
index 00000000000..459c1f69d32
--- /dev/null
+++ b/changelogs/unreleased/remove-ci_jwt_include_environment-feature-flag.yml
@@ -0,0 +1,5 @@
+---
+title: Add environment to custom CI_JOB_JWT claims
+merge_request: 54168
+author:
+type: added
diff --git a/changelogs/unreleased/remove-commit-paginate-ff.yml b/changelogs/unreleased/remove-commit-paginate-ff.yml
new file mode 100644
index 00000000000..7f511ce2eeb
--- /dev/null
+++ b/changelogs/unreleased/remove-commit-paginate-ff.yml
@@ -0,0 +1,5 @@
+---
+title: Add pagination of file diffs when viewing a large commit
+merge_request: 54236
+author:
+type: added
diff --git a/changelogs/unreleased/remove-deprecated-columns.yml b/changelogs/unreleased/remove-deprecated-columns.yml
new file mode 100644
index 00000000000..42039fed758
--- /dev/null
+++ b/changelogs/unreleased/remove-deprecated-columns.yml
@@ -0,0 +1,5 @@
+---
+title: Remove outdated ci db columns
+merge_request: 54564
+author:
+type: changed
diff --git a/changelogs/unreleased/remove-index-add-index.yml b/changelogs/unreleased/remove-index-add-index.yml
new file mode 100644
index 00000000000..57ed8a99772
--- /dev/null
+++ b/changelogs/unreleased/remove-index-add-index.yml
@@ -0,0 +1,5 @@
+---
+title: Remove unique index and add composite key index to Security Orchestration
+merge_request: 55521
+author:
+type: other
diff --git a/changelogs/unreleased/remove-margin-status.yml b/changelogs/unreleased/remove-margin-status.yml
new file mode 100644
index 00000000000..dc8db7e5785
--- /dev/null
+++ b/changelogs/unreleased/remove-margin-status.yml
@@ -0,0 +1,5 @@
+---
+title: Add btn-default and remove extra right margin
+merge_request: 54134
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/remove-merge-request-count-with-merged-at-ff.yml b/changelogs/unreleased/remove-merge-request-count-with-merged-at-ff.yml
new file mode 100644
index 00000000000..105ffae9841
--- /dev/null
+++ b/changelogs/unreleased/remove-merge-request-count-with-merged-at-ff.yml
@@ -0,0 +1,5 @@
+---
+title: Remove the optimized_merge_request_count_with_merged_at_filter feature flag
+merge_request: 55600
+author:
+type: other
diff --git a/changelogs/unreleased/remove-new_jira_connect_ui-feature-flag.yml b/changelogs/unreleased/remove-new_jira_connect_ui-feature-flag.yml
new file mode 100644
index 00000000000..812ecf6c937
--- /dev/null
+++ b/changelogs/unreleased/remove-new_jira_connect_ui-feature-flag.yml
@@ -0,0 +1,5 @@
+---
+title: 'Jira Connect app: add ability to select namespace from list of available namespaces'
+merge_request: 54037
+author:
+type: added
diff --git a/changelogs/unreleased/remove-pipeline-editor-section-feature-flag.yml b/changelogs/unreleased/remove-pipeline-editor-section-feature-flag.yml
new file mode 100644
index 00000000000..4cfdc38fd4b
--- /dev/null
+++ b/changelogs/unreleased/remove-pipeline-editor-section-feature-flag.yml
@@ -0,0 +1,5 @@
+---
+title: Remove pipeline editor feature flag
+merge_request: 54971
+author:
+type: other
diff --git a/changelogs/unreleased/remove-pkg-event-redis-feature-flag.yml b/changelogs/unreleased/remove-pkg-event-redis-feature-flag.yml
new file mode 100644
index 00000000000..638a9c7bd73
--- /dev/null
+++ b/changelogs/unreleased/remove-pkg-event-redis-feature-flag.yml
@@ -0,0 +1,5 @@
+---
+title: Removes collect_package_events_redis feature flag
+merge_request: 49897
+author:
+type: other
diff --git a/changelogs/unreleased/remove-scroll-merge-instruction.yml b/changelogs/unreleased/remove-scroll-merge-instruction.yml
new file mode 100644
index 00000000000..0c3e606139f
--- /dev/null
+++ b/changelogs/unreleased/remove-scroll-merge-instruction.yml
@@ -0,0 +1,5 @@
+---
+title: Remove gl-overflow-scroll in merge instructions modal
+merge_request: 54144
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/remove-transactionless-destroy-feature-flag.yml b/changelogs/unreleased/remove-transactionless-destroy-feature-flag.yml
new file mode 100644
index 00000000000..5ae09c3e2f1
--- /dev/null
+++ b/changelogs/unreleased/remove-transactionless-destroy-feature-flag.yml
@@ -0,0 +1,5 @@
+---
+title: Remove project_transactionless_destroy feature flag
+merge_request: 55795
+author:
+type: changed
diff --git a/changelogs/unreleased/rename-vuln-fingerprint-indexes.yml b/changelogs/unreleased/rename-vuln-fingerprint-indexes.yml
new file mode 100644
index 00000000000..59f9530a8a6
--- /dev/null
+++ b/changelogs/unreleased/rename-vuln-fingerprint-indexes.yml
@@ -0,0 +1,5 @@
+---
+title: Rename vulnerability fingerprints indexes
+merge_request: 55552
+author:
+type: other
diff --git a/changelogs/unreleased/revert_sort_order_explore_projects.yml b/changelogs/unreleased/revert_sort_order_explore_projects.yml
new file mode 100644
index 00000000000..58256502c78
--- /dev/null
+++ b/changelogs/unreleased/revert_sort_order_explore_projects.yml
@@ -0,0 +1,5 @@
+---
+title: Reverts default sort order for Explore Projects to Last updated
+merge_request: 54879
+author:
+type: changed
diff --git a/changelogs/unreleased/runners-api-context-metadata.yml b/changelogs/unreleased/runners-api-context-metadata.yml
new file mode 100644
index 00000000000..e5c4edd1755
--- /dev/null
+++ b/changelogs/unreleased/runners-api-context-metadata.yml
@@ -0,0 +1,5 @@
+---
+title: Add runners api context metadata
+merge_request: 55089
+author:
+type: changed
diff --git a/changelogs/unreleased/sanddown.yml b/changelogs/unreleased/sanddown.yml
new file mode 100644
index 00000000000..2350ec70633
--- /dev/null
+++ b/changelogs/unreleased/sanddown.yml
@@ -0,0 +1,5 @@
+---
+title: reconcile source installation and upgrade docs
+merge_request: 55170
+author: Jörg Behrmann @behrmann
+type: fixed
diff --git a/changelogs/unreleased/security-jv-workhorse-router.yml b/changelogs/unreleased/security-jv-workhorse-router.yml
new file mode 100644
index 00000000000..af17a71086d
--- /dev/null
+++ b/changelogs/unreleased/security-jv-workhorse-router.yml
@@ -0,0 +1,5 @@
+---
+title: 'Workhorse: prevent escaped router path traversal'
+merge_request:
+author:
+type: security
diff --git a/changelogs/unreleased/security-workhorse-validate-path-logging-removal.yml b/changelogs/unreleased/security-workhorse-validate-path-logging-removal.yml
new file mode 100644
index 00000000000..c8b68da684b
--- /dev/null
+++ b/changelogs/unreleased/security-workhorse-validate-path-logging-removal.yml
@@ -0,0 +1,5 @@
+---
+title: 'Workhorse: Stop logging when path is excluded'
+merge_request:
+author:
+type: security
diff --git a/changelogs/unreleased/selected-state-commit-view.yml b/changelogs/unreleased/selected-state-commit-view.yml
new file mode 100644
index 00000000000..fdcb6f5d616
--- /dev/null
+++ b/changelogs/unreleased/selected-state-commit-view.yml
@@ -0,0 +1,5 @@
+---
+title: Add selected state for diff view in commit page
+merge_request: 54762
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/sh-add-path-lock-confirmation.yml b/changelogs/unreleased/sh-add-path-lock-confirmation.yml
new file mode 100644
index 00000000000..7f7df21e141
--- /dev/null
+++ b/changelogs/unreleased/sh-add-path-lock-confirmation.yml
@@ -0,0 +1,5 @@
+---
+title: Add a confirmation prompt to lock and unlock path locks
+merge_request: 44849
+author:
+type: other
diff --git a/changelogs/unreleased/sh-azure-ad-v2-omniauth.yml b/changelogs/unreleased/sh-azure-ad-v2-omniauth.yml
new file mode 100644
index 00000000000..cb11aa97920
--- /dev/null
+++ b/changelogs/unreleased/sh-azure-ad-v2-omniauth.yml
@@ -0,0 +1,5 @@
+---
+title: Add Azure ActiveDirectory v2 OmniAuth provider
+merge_request: 54265
+author:
+type: added
diff --git a/changelogs/unreleased/sh-azure-blob-utf8-fix.yml b/changelogs/unreleased/sh-azure-blob-utf8-fix.yml
new file mode 100644
index 00000000000..6bcee9d4aa2
--- /dev/null
+++ b/changelogs/unreleased/sh-azure-blob-utf8-fix.yml
@@ -0,0 +1,5 @@
+---
+title: Fix UTF-8 characters not working with Azure Blob storage
+merge_request: 54875
+author:
+type: fixed
diff --git a/changelogs/unreleased/sh-improve-api-marginalia-comments.yml b/changelogs/unreleased/sh-improve-api-marginalia-comments.yml
new file mode 100644
index 00000000000..ad4823edadf
--- /dev/null
+++ b/changelogs/unreleased/sh-improve-api-marginalia-comments.yml
@@ -0,0 +1,5 @@
+---
+title: Improve Marginalia comments for API
+merge_request: 55564
+author:
+type: changed
diff --git a/changelogs/unreleased/sh-log-large-multipart-files-com.yml b/changelogs/unreleased/sh-log-large-multipart-files-com.yml
new file mode 100644
index 00000000000..a964ae37ccb
--- /dev/null
+++ b/changelogs/unreleased/sh-log-large-multipart-files-com.yml
@@ -0,0 +1,5 @@
+---
+title: Log large multipart messages from Rack
+merge_request: 55933
+author:
+type: added
diff --git a/changelogs/unreleased/sh-update-batchloader-2-0-0.yml b/changelogs/unreleased/sh-update-batchloader-2-0-0.yml
new file mode 100644
index 00000000000..aca22a38803
--- /dev/null
+++ b/changelogs/unreleased/sh-update-batchloader-2-0-0.yml
@@ -0,0 +1,5 @@
+---
+title: Update batch_loader gem to v2.0.0
+merge_request: 54639
+author:
+type: fixed
diff --git a/changelogs/unreleased/sh-update-fog-aws-3-9.yml b/changelogs/unreleased/sh-update-fog-aws-3-9.yml
new file mode 100644
index 00000000000..86d5a3ef145
--- /dev/null
+++ b/changelogs/unreleased/sh-update-fog-aws-3-9.yml
@@ -0,0 +1,5 @@
+---
+title: Update fog-aws to v3.9.0
+merge_request: 55528
+author:
+type: fixed
diff --git a/changelogs/unreleased/sh-use-gitlab-fog-google.yml b/changelogs/unreleased/sh-use-gitlab-fog-google.yml
new file mode 100644
index 00000000000..98420f279ca
--- /dev/null
+++ b/changelogs/unreleased/sh-use-gitlab-fog-google.yml
@@ -0,0 +1,5 @@
+---
+title: Use gitlab-fog-google instead of upstream fog-google gem
+merge_request: 56245
+author:
+type: fixed
diff --git a/changelogs/unreleased/show-nested-env.yml b/changelogs/unreleased/show-nested-env.yml
new file mode 100644
index 00000000000..7305cf17975
--- /dev/null
+++ b/changelogs/unreleased/show-nested-env.yml
@@ -0,0 +1,5 @@
+---
+title: Show nested environments when change tab, page
+merge_request: 55167
+author:
+type: changed
diff --git a/changelogs/unreleased/sidebar-user-avatar.yml b/changelogs/unreleased/sidebar-user-avatar.yml
new file mode 100644
index 00000000000..ea5aa910a46
--- /dev/null
+++ b/changelogs/unreleased/sidebar-user-avatar.yml
@@ -0,0 +1,5 @@
+---
+title: Update user avatar in sidebar realtime
+merge_request: 54135
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/simplify-notifications-dropdown.yml b/changelogs/unreleased/simplify-notifications-dropdown.yml
new file mode 100644
index 00000000000..5a90d6784c6
--- /dev/null
+++ b/changelogs/unreleased/simplify-notifications-dropdown.yml
@@ -0,0 +1,5 @@
+---
+title: Simplify notifications dropdown
+merge_request: 55522
+author:
+type: changed
diff --git a/changelogs/unreleased/slack_service_usage_data.yml b/changelogs/unreleased/slack_service_usage_data.yml
new file mode 100644
index 00000000000..34b1b516360
--- /dev/null
+++ b/changelogs/unreleased/slack_service_usage_data.yml
@@ -0,0 +1,5 @@
+---
+title: Log individual user usage of Slack service
+merge_request: 54347
+author:
+type: changed
diff --git a/changelogs/unreleased/ssarka-master-patch-39936.yml b/changelogs/unreleased/ssarka-master-patch-39936.yml
new file mode 100644
index 00000000000..8edd44d9f45
--- /dev/null
+++ b/changelogs/unreleased/ssarka-master-patch-39936.yml
@@ -0,0 +1,5 @@
+---
+title: Set MobSF version to 3.2.9 in SAST template
+merge_request: 53545
+author:
+type: other
diff --git a/changelogs/unreleased/switch-order-of-buttons-configure-feature-flag-modal.yml b/changelogs/unreleased/switch-order-of-buttons-configure-feature-flag-modal.yml
new file mode 100644
index 00000000000..7257d63bf1d
--- /dev/null
+++ b/changelogs/unreleased/switch-order-of-buttons-configure-feature-flag-modal.yml
@@ -0,0 +1,5 @@
+---
+title: Change the order of action buttons in the configure feature flags modal
+merge_request: 54731
+author:
+type: changed
diff --git a/changelogs/unreleased/sy-add-end-date-to-rotations.yml b/changelogs/unreleased/sy-add-end-date-to-rotations.yml
new file mode 100644
index 00000000000..fb93c5d1d3d
--- /dev/null
+++ b/changelogs/unreleased/sy-add-end-date-to-rotations.yml
@@ -0,0 +1,5 @@
+---
+title: Add suppport for an end time on on-call rotations
+merge_request: 53675
+author:
+type: added
diff --git a/changelogs/unreleased/sy-system-note-for-resolving-alert.yml b/changelogs/unreleased/sy-system-note-for-resolving-alert.yml
new file mode 100644
index 00000000000..04a1b3e6807
--- /dev/null
+++ b/changelogs/unreleased/sy-system-note-for-resolving-alert.yml
@@ -0,0 +1,5 @@
+---
+title: Create system note on alert when its auto-resolved via alert integration
+merge_request: 54645
+author:
+type: added
diff --git a/changelogs/unreleased/sy-update-alert-title.yml b/changelogs/unreleased/sy-update-alert-title.yml
new file mode 100644
index 00000000000..da22a831a97
--- /dev/null
+++ b/changelogs/unreleased/sy-update-alert-title.yml
@@ -0,0 +1,5 @@
+---
+title: 'Update default title of alerts to New: Alert'
+merge_request: 54621
+author:
+type: changed
diff --git a/changelogs/unreleased/sy-update-operations-visibility-text.yml b/changelogs/unreleased/sy-update-operations-visibility-text.yml
new file mode 100644
index 00000000000..ab7d134f69f
--- /dev/null
+++ b/changelogs/unreleased/sy-update-operations-visibility-text.yml
@@ -0,0 +1,6 @@
+---
+title: Adjust text explaining content of Operations menu from visibility section of
+ project settings
+merge_request: 54963
+author:
+type: changed
diff --git a/changelogs/unreleased/tc-add-custom-emoji-creator.yml b/changelogs/unreleased/tc-add-custom-emoji-creator.yml
new file mode 100644
index 00000000000..da4d33f674b
--- /dev/null
+++ b/changelogs/unreleased/tc-add-custom-emoji-creator.yml
@@ -0,0 +1,5 @@
+---
+title: Add creator to custom emoji
+merge_request: 53879
+author:
+type: changed
diff --git a/changelogs/unreleased/test_update_merge_request_worker_performance_2.yml b/changelogs/unreleased/test_update_merge_request_worker_performance_2.yml
new file mode 100644
index 00000000000..1a307918e27
--- /dev/null
+++ b/changelogs/unreleased/test_update_merge_request_worker_performance_2.yml
@@ -0,0 +1,5 @@
+---
+title: Remove unneeded transitions on MR for mark_as_unchecked event
+merge_request: 53537
+author:
+type: performance
diff --git a/changelogs/unreleased/test_update_merge_request_worker_performance_3.yml b/changelogs/unreleased/test_update_merge_request_worker_performance_3.yml
new file mode 100644
index 00000000000..df116e54f2d
--- /dev/null
+++ b/changelogs/unreleased/test_update_merge_request_worker_performance_3.yml
@@ -0,0 +1,5 @@
+---
+title: Preload certain data used in the updating of a merge request
+merge_request: 53802
+author:
+type: performance
diff --git a/changelogs/unreleased/tor-defect-file-viewed-reviews-convert-to-vuex.yml b/changelogs/unreleased/tor-defect-file-viewed-reviews-convert-to-vuex.yml
new file mode 100644
index 00000000000..1d9fc46b875
--- /dev/null
+++ b/changelogs/unreleased/tor-defect-file-viewed-reviews-convert-to-vuex.yml
@@ -0,0 +1,5 @@
+---
+title: Fix 'viewed' checkbox in single-file view mode
+merge_request: 55922
+author:
+type: fixed
diff --git a/changelogs/unreleased/tor-defect-missing-popovers-from-async-DOM.yml b/changelogs/unreleased/tor-defect-missing-popovers-from-async-DOM.yml
new file mode 100644
index 00000000000..139f6aedf6b
--- /dev/null
+++ b/changelogs/unreleased/tor-defect-missing-popovers-from-async-DOM.yml
@@ -0,0 +1,6 @@
+---
+title: React to new DOM nodes being added to the page to bind the user information
+ popover to them
+merge_request: 54411
+author:
+type: fixed
diff --git a/changelogs/unreleased/tor-defect-mr-cog-checkboxes.yml b/changelogs/unreleased/tor-defect-mr-cog-checkboxes.yml
new file mode 100644
index 00000000000..adb564bfd15
--- /dev/null
+++ b/changelogs/unreleased/tor-defect-mr-cog-checkboxes.yml
@@ -0,0 +1,5 @@
+---
+title: Fix horizontal alignment of MR Changes cog menu dropdown checkboxes
+merge_request: 55591
+author:
+type: fixed
diff --git a/changelogs/unreleased/tor-defect-network-error-message-show-api-errors.yml b/changelogs/unreleased/tor-defect-network-error-message-show-api-errors.yml
new file mode 100644
index 00000000000..627dc8bf741
--- /dev/null
+++ b/changelogs/unreleased/tor-defect-network-error-message-show-api-errors.yml
@@ -0,0 +1,5 @@
+---
+title: Show API errors when a command-only comment fails
+merge_request: 55457
+author:
+type: other
diff --git a/changelogs/unreleased/tor-defect-out-of-place-bold-label-in-diffs-dropdown-menu.yml b/changelogs/unreleased/tor-defect-out-of-place-bold-label-in-diffs-dropdown-menu.yml
new file mode 100644
index 00000000000..8525204ee7e
--- /dev/null
+++ b/changelogs/unreleased/tor-defect-out-of-place-bold-label-in-diffs-dropdown-menu.yml
@@ -0,0 +1,5 @@
+---
+title: Fix bold text mismatch in MR âš™ menu
+merge_request: 54531
+author:
+type: fixed
diff --git a/changelogs/unreleased/trial-button-confirm.yml b/changelogs/unreleased/trial-button-confirm.yml
new file mode 100644
index 00000000000..96972f0e3ce
--- /dev/null
+++ b/changelogs/unreleased/trial-button-confirm.yml
@@ -0,0 +1,5 @@
+---
+title: Replace btn-primary with btn-confirm in Start your free trial button
+merge_request: 53215
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/update-ci-template-default-branch-1.yml b/changelogs/unreleased/update-ci-template-default-branch-1.yml
new file mode 100644
index 00000000000..a1236e353d1
--- /dev/null
+++ b/changelogs/unreleased/update-ci-template-default-branch-1.yml
@@ -0,0 +1,5 @@
+---
+title: Update Pages template examples to default branch
+merge_request: 56298
+author:
+type: other
diff --git a/changelogs/unreleased/update-ci-template-default-branch-3.yml b/changelogs/unreleased/update-ci-template-default-branch-3.yml
new file mode 100644
index 00000000000..008ed062f86
--- /dev/null
+++ b/changelogs/unreleased/update-ci-template-default-branch-3.yml
@@ -0,0 +1,5 @@
+---
+title: Update templates to refer to default branch
+merge_request: 56304
+author:
+type: other
diff --git a/changelogs/unreleased/update-cicd-naming.yml b/changelogs/unreleased/update-cicd-naming.yml
new file mode 100644
index 00000000000..1fc24217393
--- /dev/null
+++ b/changelogs/unreleased/update-cicd-naming.yml
@@ -0,0 +1,5 @@
+---
+title: Update UI text to CI/CD from CI / CD
+merge_request: 56070
+author:
+type: other
diff --git a/changelogs/unreleased/update-gitlab-runner-helm-chart-to-0-26-0.yml b/changelogs/unreleased/update-gitlab-runner-helm-chart-to-0-26-0.yml
new file mode 100644
index 00000000000..d3fac44001f
--- /dev/null
+++ b/changelogs/unreleased/update-gitlab-runner-helm-chart-to-0-26-0.yml
@@ -0,0 +1,5 @@
+---
+title: Update GitLab Runner Helm Chart to 0.26.0
+merge_request: 54863
+author:
+type: other
diff --git a/changelogs/unreleased/update-mr-page-buttons.yml b/changelogs/unreleased/update-mr-page-buttons.yml
new file mode 100644
index 00000000000..9cd872fc649
--- /dev/null
+++ b/changelogs/unreleased/update-mr-page-buttons.yml
@@ -0,0 +1,5 @@
+---
+title: Update button to btn-confirm on merge requests page
+merge_request: 55218
+author:
+type: changed
diff --git a/changelogs/unreleased/update-terraform-states-user-foreign-key.yml b/changelogs/unreleased/update-terraform-states-user-foreign-key.yml
new file mode 100644
index 00000000000..8eb6e5b9c96
--- /dev/null
+++ b/changelogs/unreleased/update-terraform-states-user-foreign-key.yml
@@ -0,0 +1,5 @@
+---
+title: Change terraform_states.locked_by_user_id foreign key to SET NULL
+merge_request: 55813
+author:
+type: fixed
diff --git a/changelogs/unreleased/update-validate-url-gem.yml b/changelogs/unreleased/update-validate-url-gem.yml
new file mode 100644
index 00000000000..9500d70b11f
--- /dev/null
+++ b/changelogs/unreleased/update-validate-url-gem.yml
@@ -0,0 +1,5 @@
+---
+title: Update validate_url gem
+merge_request: 55706
+author:
+type: fixed
diff --git a/changelogs/unreleased/update_latex_template.yml b/changelogs/unreleased/update_latex_template.yml
new file mode 100644
index 00000000000..33213112768
--- /dev/null
+++ b/changelogs/unreleased/update_latex_template.yml
@@ -0,0 +1,5 @@
+---
+title: Update LaTeX Docker image in CI Templates to TexLive 2020
+merge_request: 52043
+author: Michael Schmitt @schmitmd
+type: changed
diff --git a/changelogs/unreleased/usage-ping-dictionary-whitespace.yml b/changelogs/unreleased/usage-ping-dictionary-whitespace.yml
new file mode 100644
index 00000000000..2baf68ba9df
--- /dev/null
+++ b/changelogs/unreleased/usage-ping-dictionary-whitespace.yml
@@ -0,0 +1,5 @@
+---
+title: Updating usage dictionary generator
+merge_request: 55956
+author:
+type: other
diff --git a/changelogs/unreleased/user-access-role-badge-component.yml b/changelogs/unreleased/user-access-role-badge-component.yml
new file mode 100644
index 00000000000..bad431dd9fb
--- /dev/null
+++ b/changelogs/unreleased/user-access-role-badge-component.yml
@@ -0,0 +1,5 @@
+---
+title: Improve styling of user access role badges
+merge_request: 56061
+author:
+type: changed
diff --git a/changelogs/unreleased/user-auth-bmiller-return-early-if-user-is-nil.yml b/changelogs/unreleased/user-auth-bmiller-return-early-if-user-is-nil.yml
new file mode 100644
index 00000000000..b259fdecd56
--- /dev/null
+++ b/changelogs/unreleased/user-auth-bmiller-return-early-if-user-is-nil.yml
@@ -0,0 +1,5 @@
+---
+title: Fix a crash when logging in using SAML for the first time when sign-ups are disabled
+merge_request: 50216
+author:
+type: other
diff --git a/changelogs/unreleased/uusijani-gitlab-uusijani-master-patch-65195.yml b/changelogs/unreleased/uusijani-gitlab-uusijani-master-patch-65195.yml
new file mode 100644
index 00000000000..7ed23b2f681
--- /dev/null
+++ b/changelogs/unreleased/uusijani-gitlab-uusijani-master-patch-65195.yml
@@ -0,0 +1,5 @@
+---
+title: Fixed typo on Two-Factor Authentication page
+merge_request: 54565
+author: Jani Uusitalo @uusijani
+type: fixed
diff --git a/changelogs/unreleased/vs-break-long-code-line-in-markdown.yml b/changelogs/unreleased/vs-break-long-code-line-in-markdown.yml
new file mode 100644
index 00000000000..5ebf0cad97a
--- /dev/null
+++ b/changelogs/unreleased/vs-break-long-code-line-in-markdown.yml
@@ -0,0 +1,5 @@
+---
+title: Wrap long code lines in markdown
+merge_request: 54540
+author:
+type: fixed
diff --git a/changelogs/unreleased/vs-enable-gitlab-stylelint-config.yml b/changelogs/unreleased/vs-enable-gitlab-stylelint-config.yml
new file mode 100644
index 00000000000..4373b67bbe7
--- /dev/null
+++ b/changelogs/unreleased/vs-enable-gitlab-stylelint-config.yml
@@ -0,0 +1,5 @@
+---
+title: Replace scss with stylelint in documentation
+merge_request: 53700
+author:
+type: added
diff --git a/changelogs/unreleased/vs-wrap-code-lines-blocks-properly.yml b/changelogs/unreleased/vs-wrap-code-lines-blocks-properly.yml
new file mode 100644
index 00000000000..28932c44cd5
--- /dev/null
+++ b/changelogs/unreleased/vs-wrap-code-lines-blocks-properly.yml
@@ -0,0 +1,5 @@
+---
+title: Do not break word in the code blocks under Safari
+merge_request: 55405
+author:
+type: fixed
diff --git a/changelogs/unreleased/x509-cert-loading.yml b/changelogs/unreleased/x509-cert-loading.yml
new file mode 100644
index 00000000000..76fa6907730
--- /dev/null
+++ b/changelogs/unreleased/x509-cert-loading.yml
@@ -0,0 +1,5 @@
+---
+title: Forcibly load OpenSSL::X509::DEFAULT_CERT_FILE
+merge_request: 54569
+author:
+type: fixed
diff --git a/changelogs/unreleased/xanf-allow-top-level-bulk-imports.yml b/changelogs/unreleased/xanf-allow-top-level-bulk-imports.yml
new file mode 100644
index 00000000000..9a02ec07ef7
--- /dev/null
+++ b/changelogs/unreleased/xanf-allow-top-level-bulk-imports.yml
@@ -0,0 +1,5 @@
+---
+title: Allow importing groups as new top-level groups
+merge_request: 54323
+author:
+type: changed
diff --git a/changelogs/unreleased/yo-btn-confirm-shared-issuable.yml b/changelogs/unreleased/yo-btn-confirm-shared-issuable.yml
new file mode 100644
index 00000000000..bcaacc9443c
--- /dev/null
+++ b/changelogs/unreleased/yo-btn-confirm-shared-issuable.yml
@@ -0,0 +1,5 @@
+---
+title: Move from btn-success to btn-confirm in shared/issuable directory
+merge_request: 55303
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/yo-btn-confirm-shared-labels.yml b/changelogs/unreleased/yo-btn-confirm-shared-labels.yml
new file mode 100644
index 00000000000..c708a454bc1
--- /dev/null
+++ b/changelogs/unreleased/yo-btn-confirm-shared-labels.yml
@@ -0,0 +1,5 @@
+---
+title: Move from btn-success to btn-confirm in shared/labels directory
+merge_request: 55304
+author: Yogi (@yo)
+type: changed
diff --git a/config/application.rb b/config/application.rb
index 7e15d02a6da..e5710edc811 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -184,7 +184,6 @@ module Gitlab
config.assets.precompile << "page_bundles/build.css"
config.assets.precompile << "page_bundles/ci_status.css"
config.assets.precompile << "page_bundles/cycle_analytics.css"
- config.assets.precompile << "page_bundles/security_discover.css"
config.assets.precompile << "page_bundles/dev_ops_report.css"
config.assets.precompile << "page_bundles/environments.css"
config.assets.precompile << "page_bundles/epics.css"
@@ -196,6 +195,8 @@ module Gitlab
config.assets.precompile << "page_bundles/issues_list.css"
config.assets.precompile << "page_bundles/jira_connect.css"
config.assets.precompile << "page_bundles/jira_connect_users.css"
+ config.assets.precompile << "page_bundles/learn_gitlab.css"
+ config.assets.precompile << "page_bundles/members.css"
config.assets.precompile << "page_bundles/merge_conflicts.css"
config.assets.precompile << "page_bundles/merge_requests.css"
config.assets.precompile << "page_bundles/milestone.css"
@@ -208,6 +209,7 @@ module Gitlab
config.assets.precompile << "page_bundles/reports.css"
config.assets.precompile << "page_bundles/roadmap.css"
config.assets.precompile << "page_bundles/security_dashboard.css"
+ config.assets.precompile << "page_bundles/security_discover.css"
config.assets.precompile << "page_bundles/signup.css"
config.assets.precompile << "page_bundles/terminal.css"
config.assets.precompile << "page_bundles/todos.css"
@@ -217,6 +219,7 @@ module Gitlab
config.assets.precompile << "lazy_bundles/select2.css"
config.assets.precompile << "performance_bar.css"
config.assets.precompile << "disable_animations.css"
+ config.assets.precompile << "test_environment.css"
config.assets.precompile << "snippets.css"
config.assets.precompile << "locale/**/app.js"
config.assets.precompile << "emoji_sprites.css"
diff --git a/config/feature_categories.yml b/config/feature_categories.yml
index 5c7ae175d1d..915c40fdbbc 100644
--- a/config/feature_categories.yml
+++ b/config/feature_categories.yml
@@ -15,8 +15,10 @@
- audit_reports
- authentication_and_authorization
- auto_devops
+- auto_portfolio_mgmt
- backup_restore
- boards
+- browser_performance
- chatops
- cloud_native_installation
- cluster_cost_management
@@ -32,6 +34,7 @@
- continuous_delivery
- continuous_integration
- database
+- dataops
- dependency_firewall
- dependency_proxy
- dependency_scanning
@@ -42,6 +45,7 @@
- editor_extension
- epics
- error_tracking
+- experimentation
- feature_flags
- five_minute_production_app
- foundations
@@ -60,6 +64,7 @@
- insider_threat
- insights
- integrations
+- intel_code_security
- interactive_application_security_testing
- internationalization
- issue_tracking
@@ -78,6 +83,7 @@
- mobile_signing_deployment
- navigation
- omnibus_package
+- onboarding
- package_registry
- pages
- pipeline_authoring
@@ -119,5 +125,4 @@
- vulnerability_management
- web_firewall
- web_ide
-- web_performance
- wiki
diff --git a/config/feature_flags/development/allow_force_push_to_protected_branches.yml b/config/feature_flags/development/allow_force_push_to_protected_branches.yml
new file mode 100644
index 00000000000..987c7d4bb7b
--- /dev/null
+++ b/config/feature_flags/development/allow_force_push_to_protected_branches.yml
@@ -0,0 +1,8 @@
+---
+name: allow_force_push_to_protected_branches
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55261
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/323431
+milestone: '13.10'
+type: development
+group: group::source code
+default_enabled: false
diff --git a/config/feature_flags/development/api_always_use_application_json.yml b/config/feature_flags/development/api_always_use_application_json.yml
index 4405ef64012..daa8b15c25f 100644
--- a/config/feature_flags/development/api_always_use_application_json.yml
+++ b/config/feature_flags/development/api_always_use_application_json.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/270067
milestone: '13.6'
type: development
group: group::ecosystem
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/application_settings_tokens_optional_encryption.yml b/config/feature_flags/development/application_settings_tokens_optional_encryption.yml
index 08814f31159..c3619dbe2d0 100644
--- a/config/feature_flags/development/application_settings_tokens_optional_encryption.yml
+++ b/config/feature_flags/development/application_settings_tokens_optional_encryption.yml
@@ -1,8 +1,8 @@
---
name: application_settings_tokens_optional_encryption
-introduced_by_url:
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/25532
rollout_issue_url:
-milestone:
+milestone: '11.9'
type: development
-group:
+group: group::runner
default_enabled: false
diff --git a/config/feature_flags/development/attachment_with_filename.yml b/config/feature_flags/development/attachment_with_filename.yml
new file mode 100644
index 00000000000..8d3a96404ef
--- /dev/null
+++ b/config/feature_flags/development/attachment_with_filename.yml
@@ -0,0 +1,8 @@
+---
+name: attachment_with_filename
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55066
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/323714
+milestone: '13.10'
+type: development
+group: group::editor
+default_enabled: false
diff --git a/config/feature_flags/development/auto_devops_banner_disabled.yml b/config/feature_flags/development/auto_devops_banner_disabled.yml
index cb9566c3de3..700560d5738 100644
--- a/config/feature_flags/development/auto_devops_banner_disabled.yml
+++ b/config/feature_flags/development/auto_devops_banner_disabled.yml
@@ -4,5 +4,5 @@ introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/14
rollout_issue_url:
milestone: '10.0'
type: development
-group:
+group: group::continuous integration
default_enabled: false
diff --git a/config/feature_flags/development/avatar_cache_for_email.yml b/config/feature_flags/development/avatar_cache_for_email.yml
new file mode 100644
index 00000000000..d0285b5bb0f
--- /dev/null
+++ b/config/feature_flags/development/avatar_cache_for_email.yml
@@ -0,0 +1,8 @@
+---
+name: avatar_cache_for_email
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55184
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/323185
+milestone: '13.10'
+type: development
+group: group::source code
+default_enabled: false
diff --git a/config/feature_flags/development/boards_filtered_search.yml b/config/feature_flags/development/boards_filtered_search.yml
new file mode 100644
index 00000000000..bfb4ae46414
--- /dev/null
+++ b/config/feature_flags/development/boards_filtered_search.yml
@@ -0,0 +1,8 @@
+---
+name: boards_filtered_search
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54641
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/322778
+milestone: '13.10'
+type: development
+group: group::project management
+default_enabled: false
diff --git a/config/feature_flags/development/chatops.yml b/config/feature_flags/development/chatops.yml
index 2ce01c26cb8..74cabe995e5 100644
--- a/config/feature_flags/development/chatops.yml
+++ b/config/feature_flags/development/chatops.yml
@@ -1,8 +1,8 @@
---
name: chatops
-introduced_by_url:
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/24780
rollout_issue_url:
-milestone:
+milestone: '11.9'
type: development
-group:
+group: group::configure
default_enabled: true
diff --git a/config/feature_flags/development/ci_fix_commit_status_retried.yml b/config/feature_flags/development/ci_fix_commit_status_retried.yml
new file mode 100644
index 00000000000..85b1836b065
--- /dev/null
+++ b/config/feature_flags/development/ci_fix_commit_status_retried.yml
@@ -0,0 +1,8 @@
+---
+name: ci_fix_commit_status_retried
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54300
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/321631
+milestone: '13.9'
+type: development
+group: group::pipeline authoring
+default_enabled: false
diff --git a/config/feature_flags/development/ci_fix_pipeline_status_for_dag_needs_manual.yml b/config/feature_flags/development/ci_fix_pipeline_status_for_dag_needs_manual.yml
new file mode 100644
index 00000000000..1c30d8a14e2
--- /dev/null
+++ b/config/feature_flags/development/ci_fix_pipeline_status_for_dag_needs_manual.yml
@@ -0,0 +1,8 @@
+---
+name: ci_fix_pipeline_status_for_dag_needs_manual
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/53476
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/321972
+milestone: '13.10'
+type: development
+group: group::pipeline authoring
+default_enabled: false
diff --git a/config/feature_flags/development/ci_jwt_include_environment.yml b/config/feature_flags/development/ci_jwt_include_environment.yml
deleted file mode 100644
index ea55ce0c569..00000000000
--- a/config/feature_flags/development/ci_jwt_include_environment.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_jwt_include_environment
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/53431
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/321206
-milestone: '13.9'
-type: development
-group: group::configure
-default_enabled: false
diff --git a/config/feature_flags/development/ci_mini_pipeline_gl_dropdown.yml b/config/feature_flags/development/ci_mini_pipeline_gl_dropdown.yml
deleted file mode 100644
index 50e1e6715df..00000000000
--- a/config/feature_flags/development/ci_mini_pipeline_gl_dropdown.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_mini_pipeline_gl_dropdown
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52821
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/300400
-milestone: '13.9'
-type: development
-group: group::continuous integration
-default_enabled: true
diff --git a/config/feature_flags/development/ci_pipeline_editor_page.yml b/config/feature_flags/development/ci_pipeline_editor_page.yml
deleted file mode 100644
index 313126f3444..00000000000
--- a/config/feature_flags/development/ci_pipeline_editor_page.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_pipeline_editor_page
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/46580
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/270059
-milestone: '13.6'
-type: development
-group: group::pipeline authoring
-default_enabled: true
diff --git a/config/feature_flags/development/ci_preload_runner_tags.yml b/config/feature_flags/development/ci_preload_runner_tags.yml
new file mode 100644
index 00000000000..d91bd788d41
--- /dev/null
+++ b/config/feature_flags/development/ci_preload_runner_tags.yml
@@ -0,0 +1,8 @@
+---
+name: ci_preload_runner_tags
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55543
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/323243
+milestone: '13.10'
+type: development
+group: group::memory
+default_enabled: false
diff --git a/config/feature_flags/development/ci_reduce_queries_when_ticking_runner_queue.yml b/config/feature_flags/development/ci_reduce_queries_when_ticking_runner_queue.yml
new file mode 100644
index 00000000000..92acb98969b
--- /dev/null
+++ b/config/feature_flags/development/ci_reduce_queries_when_ticking_runner_queue.yml
@@ -0,0 +1,8 @@
+---
+name: ci_reduce_queries_when_ticking_runner_queue
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55496
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/323328
+milestone: '13.10'
+type: development
+group: group::continuous integration
+default_enabled: false
diff --git a/config/feature_flags/development/ci_register_job_service_one_by_one.yml b/config/feature_flags/development/ci_register_job_service_one_by_one.yml
new file mode 100644
index 00000000000..7ce58d06bdc
--- /dev/null
+++ b/config/feature_flags/development/ci_register_job_service_one_by_one.yml
@@ -0,0 +1,8 @@
+---
+name: ci_register_job_service_one_by_one
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55194
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/323177
+milestone: '13.10'
+type: development
+group: group::memory
+default_enabled: false
diff --git a/config/feature_flags/development/ci_register_job_temporary_lock.yml b/config/feature_flags/development/ci_register_job_temporary_lock.yml
new file mode 100644
index 00000000000..f404df8f85b
--- /dev/null
+++ b/config/feature_flags/development/ci_register_job_temporary_lock.yml
@@ -0,0 +1,8 @@
+---
+name: ci_register_job_temporary_lock
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55202
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/323180
+milestone: '13.10'
+type: development
+group: group::memory
+default_enabled: false
diff --git a/config/feature_flags/development/ci_remove_update_retried_from_process_pipeline.yml b/config/feature_flags/development/ci_remove_update_retried_from_process_pipeline.yml
new file mode 100644
index 00000000000..82470baf6b4
--- /dev/null
+++ b/config/feature_flags/development/ci_remove_update_retried_from_process_pipeline.yml
@@ -0,0 +1,8 @@
+---
+name: ci_remove_update_retried_from_process_pipeline
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54300
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/321630
+milestone: '13.9'
+type: development
+group: group::pipeline authoring
+default_enabled: false
diff --git a/config/feature_flags/development/ci_rules_variables.yml b/config/feature_flags/development/ci_rules_variables.yml
deleted file mode 100644
index 8ea2e21af14..00000000000
--- a/config/feature_flags/development/ci_rules_variables.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_rules_variables
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/48752
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/289803
-milestone: '13.7'
-type: development
-group: group::pipeline authoring
-default_enabled: true
diff --git a/config/feature_flags/development/ci_runners_short_circuit_assignable_for.yml b/config/feature_flags/development/ci_runners_short_circuit_assignable_for.yml
new file mode 100644
index 00000000000..5c54feb6cee
--- /dev/null
+++ b/config/feature_flags/development/ci_runners_short_circuit_assignable_for.yml
@@ -0,0 +1,8 @@
+---
+name: ci_runners_short_circuit_assignable_for
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55518
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/323317
+milestone: '13.10'
+type: development
+group: group::continuous integration
+default_enabled: false
diff --git a/config/feature_flags/development/ci_trigger_payload_into_pipeline.yml b/config/feature_flags/development/ci_trigger_payload_into_pipeline.yml
index 93dd7113f2a..2130c6151e8 100644
--- a/config/feature_flags/development/ci_trigger_payload_into_pipeline.yml
+++ b/config/feature_flags/development/ci_trigger_payload_into_pipeline.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/321027
milestone: '13.9'
type: development
group: group::pipeline authoring
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/clear_status_with_quick_options.yml b/config/feature_flags/development/clear_status_with_quick_options.yml
deleted file mode 100644
index 3a8af1569c2..00000000000
--- a/config/feature_flags/development/clear_status_with_quick_options.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: clear_status_with_quick_options
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/53620
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/320777
-milestone: '13.9'
-type: development
-group: group::optimize
-default_enabled: true
diff --git a/config/feature_flags/development/codequality_backend_comparison.yml b/config/feature_flags/development/codequality_backend_comparison.yml
index f7c3c14f674..9383ecb97d7 100644
--- a/config/feature_flags/development/codequality_backend_comparison.yml
+++ b/config/feature_flags/development/codequality_backend_comparison.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/300796
milestone: '13.9'
type: development
group: group::testing
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/collect_package_events_redis.yml b/config/feature_flags/development/collect_package_events_redis.yml
deleted file mode 100644
index 54dcf7c1bc6..00000000000
--- a/config/feature_flags/development/collect_package_events_redis.yml
+++ /dev/null
@@ -1,7 +0,0 @@
----
-name: collect_package_events_redis
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/46846
-rollout_issue_url:
-group: group::package
-type: development
-default_enabled: true
diff --git a/config/feature_flags/development/compare_repo_dropdown.yml b/config/feature_flags/development/compare_repo_dropdown.yml
new file mode 100644
index 00000000000..b47bce8c521
--- /dev/null
+++ b/config/feature_flags/development/compare_repo_dropdown.yml
@@ -0,0 +1,8 @@
+---
+name: compare_repo_dropdown
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/issues/14615
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/322141
+milestone: '13.9'
+type: development
+group: group::source code
+default_enabled: false
diff --git a/config/feature_flags/development/coverage_data_new_finder.yml b/config/feature_flags/development/coverage_data_new_finder.yml
deleted file mode 100644
index a7c283ce3db..00000000000
--- a/config/feature_flags/development/coverage_data_new_finder.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: coverage_data_new_finder
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/53670
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/301093
-milestone: '13.9'
-type: development
-group: group::testing
-default_enabled: false
diff --git a/config/feature_flags/development/customize_homepage.yml b/config/feature_flags/development/customize_homepage.yml
new file mode 100644
index 00000000000..2be1d5ff8e3
--- /dev/null
+++ b/config/feature_flags/development/customize_homepage.yml
@@ -0,0 +1,8 @@
+---
+name: customize_homepage
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54357
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/299895
+milestone: '13.10'
+type: development
+group: group::expansion
+default_enabled: true
diff --git a/config/feature_flags/development/dashboard_pipeline_status.yml b/config/feature_flags/development/dashboard_pipeline_status.yml
deleted file mode 100644
index f24ba5983a8..00000000000
--- a/config/feature_flags/development/dashboard_pipeline_status.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: dashboard_pipeline_status
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/22029
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/209061
-milestone: '12.7'
-type: development
-group: group::continuous integration
-default_enabled: true
diff --git a/config/feature_flags/development/design_management_allow_dangerous_images.yml b/config/feature_flags/development/design_management_allow_dangerous_images.yml
index 1973755f7d3..b70dc86547b 100644
--- a/config/feature_flags/development/design_management_allow_dangerous_images.yml
+++ b/config/feature_flags/development/design_management_allow_dangerous_images.yml
@@ -4,5 +4,5 @@ introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/16160
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/34279
milestone: '12.4'
type: development
-group: group::knowledge
+group: group::product planning
default_enabled: false
diff --git a/config/feature_flags/development/dora_daily_metrics.yml b/config/feature_flags/development/dora_daily_metrics.yml
new file mode 100644
index 00000000000..7ca3cf66ea4
--- /dev/null
+++ b/config/feature_flags/development/dora_daily_metrics.yml
@@ -0,0 +1,8 @@
+---
+name: dora_daily_metrics
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55473
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/291746
+milestone: '13.10'
+type: development
+group: group::release
+default_enabled: false
diff --git a/config/feature_flags/development/environment_tier.yml b/config/feature_flags/development/environment_tier.yml
new file mode 100644
index 00000000000..0459d1f212d
--- /dev/null
+++ b/config/feature_flags/development/environment_tier.yml
@@ -0,0 +1,8 @@
+---
+name: environment_tier
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55471
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/323166
+milestone: '13.10'
+type: development
+group: group::release
+default_enabled: false
diff --git a/config/feature_flags/development/fork_project_form.yml b/config/feature_flags/development/fork_project_form.yml
new file mode 100644
index 00000000000..93bccc4f41b
--- /dev/null
+++ b/config/feature_flags/development/fork_project_form.yml
@@ -0,0 +1,8 @@
+---
+name: fork_project_form
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/53544
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/321387
+milestone: '13.10'
+type: development
+group: group::source code
+default_enabled: false
diff --git a/config/feature_flags/development/gitlab_ci_builds_queue_limit.yml b/config/feature_flags/development/gitlab_ci_builds_queue_limit.yml
new file mode 100644
index 00000000000..42310def889
--- /dev/null
+++ b/config/feature_flags/development/gitlab_ci_builds_queue_limit.yml
@@ -0,0 +1,8 @@
+---
+name: gitlab_ci_builds_queue_limit
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54579
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/323201
+milestone: '13.10'
+type: development
+group: group::continuous integration
+default_enabled: false
diff --git a/config/feature_flags/development/gitlab_ci_builds_queuing_metrics.yml b/config/feature_flags/development/gitlab_ci_builds_queuing_metrics.yml
new file mode 100644
index 00000000000..49dd857f57f
--- /dev/null
+++ b/config/feature_flags/development/gitlab_ci_builds_queuing_metrics.yml
@@ -0,0 +1,8 @@
+---
+name: gitlab_ci_builds_queuing_metrics
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54909
+rollout_issue_url:
+milestone: '13.10'
+type: development
+group: group::continuous integration
+default_enabled: false
diff --git a/config/feature_flags/development/graphql_logging.yml b/config/feature_flags/development/graphql_logging.yml
deleted file mode 100644
index c3615215048..00000000000
--- a/config/feature_flags/development/graphql_logging.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: graphql_logging
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/27885
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/35579
-milestone: '12.0'
-type: development
-group: group::project management
-default_enabled: true
diff --git a/config/feature_flags/development/group_devops_adoption.yml b/config/feature_flags/development/group_devops_adoption.yml
new file mode 100644
index 00000000000..336a4d6d5a0
--- /dev/null
+++ b/config/feature_flags/development/group_devops_adoption.yml
@@ -0,0 +1,8 @@
+---
+name: group_devops_adoption
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55039
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/323159
+milestone: '13.10'
+type: development
+group: group::optimize
+default_enabled: false
diff --git a/config/feature_flags/development/groups_tokens_optional_encryption.yml b/config/feature_flags/development/groups_tokens_optional_encryption.yml
index 2b36b0d7c10..25c172422f6 100644
--- a/config/feature_flags/development/groups_tokens_optional_encryption.yml
+++ b/config/feature_flags/development/groups_tokens_optional_encryption.yml
@@ -1,8 +1,8 @@
---
name: groups_tokens_optional_encryption
-introduced_by_url:
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/25532
rollout_issue_url:
-milestone:
+milestone: '11.9'
type: development
-group:
+group: group::runner
default_enabled: true
diff --git a/config/feature_flags/development/improved_emoji_picker.yml b/config/feature_flags/development/improved_emoji_picker.yml
new file mode 100644
index 00000000000..2d72c38630a
--- /dev/null
+++ b/config/feature_flags/development/improved_emoji_picker.yml
@@ -0,0 +1,8 @@
+---
+name: improved_emoji_picker
+introduced_by_url:
+rollout_issue_url:
+milestone: '13.9'
+type: development
+group: group::code review
+default_enabled: false
diff --git a/config/feature_flags/development/improved_merge_diff_highlighting.yml b/config/feature_flags/development/improved_merge_diff_highlighting.yml
deleted file mode 100644
index b397405a12c..00000000000
--- a/config/feature_flags/development/improved_merge_diff_highlighting.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: improved_merge_diff_highlighting
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52499
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/299884
-milestone: '13.9'
-type: development
-group: group::source code
-default_enabled: true
diff --git a/config/feature_flags/development/inherited_issuable_templates.yml b/config/feature_flags/development/inherited_issuable_templates.yml
new file mode 100644
index 00000000000..fb322e9468a
--- /dev/null
+++ b/config/feature_flags/development/inherited_issuable_templates.yml
@@ -0,0 +1,8 @@
+---
+name: inherited_issuable_templates
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52360
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/321247
+milestone: '13.9'
+type: development
+group: group::project management
+default_enabled: false
diff --git a/config/feature_flags/development/instance_statistics.yml b/config/feature_flags/development/instance_statistics.yml
deleted file mode 100644
index 3caddad8b69..00000000000
--- a/config/feature_flags/development/instance_statistics.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: instance_statistics
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/40583
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/241711
-milestone: '13.4'
-type: development
-group: group::optimize
-default_enabled: true
diff --git a/config/feature_flags/development/introduce_marker_ranges.yml b/config/feature_flags/development/introduce_marker_ranges.yml
new file mode 100644
index 00000000000..de59cf0e906
--- /dev/null
+++ b/config/feature_flags/development/introduce_marker_ranges.yml
@@ -0,0 +1,8 @@
+---
+name: introduce_marker_ranges
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55669
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/324068
+milestone: '13.10'
+type: development
+group: group::source code
+default_enabled: false
diff --git a/config/feature_flags/development/issue_email_participants.yml b/config/feature_flags/development/issue_email_participants.yml
new file mode 100644
index 00000000000..1459d2bc7f5
--- /dev/null
+++ b/config/feature_flags/development/issue_email_participants.yml
@@ -0,0 +1,8 @@
+---
+name: issue_email_participants
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49264
+rollout_issue_url:
+milestone: '13.8'
+type: development
+group: group::product planning
+default_enabled: false
diff --git a/config/feature_flags/development/json_wrapper_legacy_mode.yml b/config/feature_flags/development/json_wrapper_legacy_mode.yml
index d255bf35889..13a4bb30d09 100644
--- a/config/feature_flags/development/json_wrapper_legacy_mode.yml
+++ b/config/feature_flags/development/json_wrapper_legacy_mode.yml
@@ -1,8 +1,8 @@
---
name: json_wrapper_legacy_mode
-introduced_by_url:
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/30849
rollout_issue_url:
-milestone:
+milestone: '13.0'
type: development
-group:
+group: group::source code
default_enabled: true
diff --git a/config/feature_flags/development/merge_request_widget_graphql.yml b/config/feature_flags/development/merge_request_widget_graphql.yml
index 0f4e6fe41ca..8d13c6b1c62 100644
--- a/config/feature_flags/development/merge_request_widget_graphql.yml
+++ b/config/feature_flags/development/merge_request_widget_graphql.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/267560
milestone: '13.3'
type: development
group: group::code review
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/migrate_delayed_project_removal.yml b/config/feature_flags/development/migrate_delayed_project_removal.yml
new file mode 100644
index 00000000000..2d4a7ef762e
--- /dev/null
+++ b/config/feature_flags/development/migrate_delayed_project_removal.yml
@@ -0,0 +1,8 @@
+---
+name: migrate_delayed_project_removal
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/53916
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/300207
+milestone: '13.9'
+type: development
+group: group::access
+default_enabled: true
diff --git a/config/feature_flags/development/multiple_cache_per_job.yml b/config/feature_flags/development/multiple_cache_per_job.yml
new file mode 100644
index 00000000000..d06fc7a6f89
--- /dev/null
+++ b/config/feature_flags/development/multiple_cache_per_job.yml
@@ -0,0 +1,8 @@
+---
+name: multiple_cache_per_job
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/53410
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/321877
+milestone: '13.10'
+type: development
+group: group::pipeline authoring
+default_enabled: false
diff --git a/config/feature_flags/development/multiple_http_integrations_custom_mapping.yml b/config/feature_flags/development/multiple_http_integrations_custom_mapping.yml
deleted file mode 100644
index 6c04d08369f..00000000000
--- a/config/feature_flags/development/multiple_http_integrations_custom_mapping.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: multiple_http_integrations_custom_mapping
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/46437
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/273573
-milestone: '13.6'
-type: development
-group: group::monitor
-default_enabled: false
diff --git a/config/feature_flags/development/new_jira_connect_ui.yml b/config/feature_flags/development/new_jira_connect_ui.yml
deleted file mode 100644
index 3420141ce2d..00000000000
--- a/config/feature_flags/development/new_jira_connect_ui.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: new_jira_connect_ui
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/50692
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/295647
-milestone: '13.8'
-type: development
-group: group::ecosystem
-default_enabled: true
diff --git a/config/feature_flags/development/new_pipelines_table.yml b/config/feature_flags/development/new_pipelines_table.yml
new file mode 100644
index 00000000000..e6148f30f96
--- /dev/null
+++ b/config/feature_flags/development/new_pipelines_table.yml
@@ -0,0 +1,8 @@
+---
+name: new_pipelines_table
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54958
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/322599
+milestone: '13.10'
+type: development
+group: group::continuous integration
+default_enabled: false
diff --git a/config/feature_flags/development/new_route_ci_minutes_purchase.yml b/config/feature_flags/development/new_route_ci_minutes_purchase.yml
new file mode 100644
index 00000000000..c34fb14a9f0
--- /dev/null
+++ b/config/feature_flags/development/new_route_ci_minutes_purchase.yml
@@ -0,0 +1,8 @@
+---
+name: new_route_ci_minutes_purchase
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54934
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/322582
+milestone: '13.10'
+type: development
+group: group::purchase
+default_enabled: false
diff --git a/config/feature_flags/development/notes_create_service_tracking.yml b/config/feature_flags/development/notes_create_service_tracking.yml
index ae9d4ce09c5..5601088b25f 100644
--- a/config/feature_flags/development/notes_create_service_tracking.yml
+++ b/config/feature_flags/development/notes_create_service_tracking.yml
@@ -1,8 +1,8 @@
---
name: notes_create_service_tracking
-introduced_by_url:
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18890
rollout_issue_url:
-milestone:
+milestone: '12.5'
type: development
-group:
+group: group::testing
default_enabled: false
diff --git a/config/feature_flags/development/optimized_merge_request_count_with_merged_at_filter.yml b/config/feature_flags/development/optimized_merge_request_count_with_merged_at_filter.yml
deleted file mode 100644
index a7a458e3d29..00000000000
--- a/config/feature_flags/development/optimized_merge_request_count_with_merged_at_filter.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: optimized_merge_request_count_with_merged_at_filter
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52113
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/299347
-milestone: '13.9'
-type: development
-group: group::optimize
-default_enabled: true
diff --git a/config/feature_flags/development/or_issuable_queries.yml b/config/feature_flags/development/or_issuable_queries.yml
new file mode 100644
index 00000000000..5205910b0a0
--- /dev/null
+++ b/config/feature_flags/development/or_issuable_queries.yml
@@ -0,0 +1,8 @@
+---
+name: or_issuable_queries
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54444
+rollout_issue_url:
+milestone: '13.10'
+type: development
+group: group::project management
+default_enabled: false
diff --git a/config/feature_flags/development/pages_serve_from_deployments.yml b/config/feature_flags/development/pages_serve_from_deployments.yml
deleted file mode 100644
index d13bf2dfaa5..00000000000
--- a/config/feature_flags/development/pages_serve_from_deployments.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: pages_serve_from_deployments
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/46320
-rollout_issue_url: https://gitlab.com/gitlab-com/gl-infra/production/-/issues/2932
-milestone: '13.6'
-type: development
-group: group::release
-default_enabled: true
diff --git a/config/feature_flags/development/pages_serve_from_migrated_zip.yml b/config/feature_flags/development/pages_serve_from_migrated_zip.yml
index 18b912215b6..2912beb3985 100644
--- a/config/feature_flags/development/pages_serve_from_migrated_zip.yml
+++ b/config/feature_flags/development/pages_serve_from_migrated_zip.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/300021
milestone: '13.9'
type: development
group: group::release
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/pages_serve_with_zip_file_protocol.yml b/config/feature_flags/development/pages_serve_with_zip_file_protocol.yml
index 836702debba..153b0d5915c 100644
--- a/config/feature_flags/development/pages_serve_with_zip_file_protocol.yml
+++ b/config/feature_flags/development/pages_serve_with_zip_file_protocol.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/321677
milestone: '13.6'
type: development
group: group::release
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/pages_use_legacy_storage_lease.yml b/config/feature_flags/development/pages_use_legacy_storage_lease.yml
deleted file mode 100644
index 548a3ecd589..00000000000
--- a/config/feature_flags/development/pages_use_legacy_storage_lease.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: pages_use_legacy_storage_lease
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/48349
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/282464
-milestone: '13.7'
-type: development
-group: group::release
-default_enabled: true
diff --git a/config/feature_flags/development/paginate_commit_view.yml b/config/feature_flags/development/paginate_commit_view.yml
deleted file mode 100644
index ee89788a219..00000000000
--- a/config/feature_flags/development/paginate_commit_view.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: paginate_commit_view
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52819
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/300540
-milestone: '13.9'
-type: development
-group: group::source code
-default_enabled: false
diff --git a/config/feature_flags/development/personal_access_tokens_scoped_to_projects.yml b/config/feature_flags/development/personal_access_tokens_scoped_to_projects.yml
new file mode 100644
index 00000000000..9188b0dbab4
--- /dev/null
+++ b/config/feature_flags/development/personal_access_tokens_scoped_to_projects.yml
@@ -0,0 +1,8 @@
+---
+name: personal_access_tokens_scoped_to_projects
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54617
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/322187
+milestone: '13.10'
+type: development
+group: group::access
+default_enabled: false
diff --git a/config/feature_flags/development/pipeline_editor_empty_state_action.yml b/config/feature_flags/development/pipeline_editor_empty_state_action.yml
new file mode 100644
index 00000000000..a17f3c0363b
--- /dev/null
+++ b/config/feature_flags/development/pipeline_editor_empty_state_action.yml
@@ -0,0 +1,8 @@
+---
+name: pipeline_editor_empty_state_action
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55414
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/323229
+milestone: '13.10'
+type: development
+group: group::pipeline authoring
+default_enabled: false
diff --git a/config/feature_flags/development/pipeline_status_for_pipeline_editor.yml b/config/feature_flags/development/pipeline_status_for_pipeline_editor.yml
new file mode 100644
index 00000000000..886f8f0f7e6
--- /dev/null
+++ b/config/feature_flags/development/pipeline_status_for_pipeline_editor.yml
@@ -0,0 +1,8 @@
+---
+name: pipeline_status_for_pipeline_editor
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/53797
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/321518
+milestone: '13.10'
+type: development
+group: group::pipeline authoring
+default_enabled: false
diff --git a/config/feature_flags/development/pipelines_security_report_summary.yml b/config/feature_flags/development/pipelines_security_report_summary.yml
deleted file mode 100644
index 7b67212269c..00000000000
--- a/config/feature_flags/development/pipelines_security_report_summary.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: pipelines_security_report_summary
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/31136
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/235943
-milestone: '13.0'
-type: development
-group: group::dynamic analysis
-default_enabled: false
diff --git a/config/feature_flags/development/product_intelligence_metrics_names_suggestions.yml b/config/feature_flags/development/product_intelligence_metrics_names_suggestions.yml
new file mode 100644
index 00000000000..6831dcdacd5
--- /dev/null
+++ b/config/feature_flags/development/product_intelligence_metrics_names_suggestions.yml
@@ -0,0 +1,8 @@
+---
+name: product_intelligence_metrics_names_suggestions
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55733
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/323460
+milestone: '13.10'
+type: development
+group: group::product intelligence
+default_enabled: false
diff --git a/config/feature_flags/development/project_statistics_sync.yml b/config/feature_flags/development/project_statistics_sync.yml
index 188e953f780..6eb6f76ad26 100644
--- a/config/feature_flags/development/project_statistics_sync.yml
+++ b/config/feature_flags/development/project_statistics_sync.yml
@@ -1,8 +1,8 @@
---
name: project_statistics_sync
-introduced_by_url:
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/29636
rollout_issue_url:
-milestone:
+milestone: '12.10'
type: development
-group:
+group: group::source code
default_enabled: true
diff --git a/config/feature_flags/development/project_transactionless_destroy.yml b/config/feature_flags/development/project_transactionless_destroy.yml
deleted file mode 100644
index d51db437356..00000000000
--- a/config/feature_flags/development/project_transactionless_destroy.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: project_transactionless_destroy
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/39367
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/255972
-milestone: '13.4'
-type: development
-group: group::continuous integration
-default_enabled: false
diff --git a/config/feature_flags/development/projects_tokens_optional_encryption.yml b/config/feature_flags/development/projects_tokens_optional_encryption.yml
index 3d6f7905ef9..c9af986b6b7 100644
--- a/config/feature_flags/development/projects_tokens_optional_encryption.yml
+++ b/config/feature_flags/development/projects_tokens_optional_encryption.yml
@@ -1,8 +1,8 @@
---
name: projects_tokens_optional_encryption
-introduced_by_url:
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/25532
rollout_issue_url:
-milestone:
+milestone: '11.9'
type: development
-group:
+group: group::runner
default_enabled: true
diff --git a/config/feature_flags/development/query_deploymenys_via_finished_at_in_vsa.yml b/config/feature_flags/development/query_deploymenys_via_finished_at_in_vsa.yml
deleted file mode 100644
index 4dcb4ddde64..00000000000
--- a/config/feature_flags/development/query_deploymenys_via_finished_at_in_vsa.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: query_deploymenys_via_finished_at_in_vsa
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/53050
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/300649
-milestone: '13.9'
-type: development
-group: group::optimize
-default_enabled: true
diff --git a/config/feature_flags/development/recursive_approach_for_all_projects.yml b/config/feature_flags/development/recursive_approach_for_all_projects.yml
deleted file mode 100644
index 1d3b7e70919..00000000000
--- a/config/feature_flags/development/recursive_approach_for_all_projects.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: recursive_approach_for_all_projects
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/44740
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/263442
-milestone: '13.5'
-type: development
-group: group::fulfillment
-default_enabled: false
diff --git a/config/feature_flags/development/recursive_namespace_lookup_as_inner_join.yml b/config/feature_flags/development/recursive_namespace_lookup_as_inner_join.yml
new file mode 100644
index 00000000000..c28e553f23e
--- /dev/null
+++ b/config/feature_flags/development/recursive_namespace_lookup_as_inner_join.yml
@@ -0,0 +1,8 @@
+---
+name: recursive_namespace_lookup_as_inner_join
+introduced_by_url:
+rollout_issue_url:
+milestone: '13.10'
+type: development
+group: group::optimize
+default_enabled: false
diff --git a/config/feature_flags/development/remove_comment_close_reopen.yml b/config/feature_flags/development/remove_comment_close_reopen.yml
deleted file mode 100644
index 1d3bf305cae..00000000000
--- a/config/feature_flags/development/remove_comment_close_reopen.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: remove_comment_close_reopen
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49614
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/198562
-milestone: '13.9'
-type: development
-group: group::code review
-default_enabled: false
diff --git a/config/feature_flags/development/retarget_merge_requests.yml b/config/feature_flags/development/retarget_merge_requests.yml
index 39ac4be0219..cbad472a56e 100644
--- a/config/feature_flags/development/retarget_merge_requests.yml
+++ b/config/feature_flags/development/retarget_merge_requests.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/320895
milestone: '13.9'
type: development
group: group::memory
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/saas_add_seats_button.yml b/config/feature_flags/development/saas_add_seats_button.yml
deleted file mode 100644
index 1817481439a..00000000000
--- a/config/feature_flags/development/saas_add_seats_button.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: saas_add_seats_button
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49242
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/291060
-milestone: '13.7'
-type: development
-group: group::purchase
-default_enabled: false
diff --git a/config/feature_flags/development/saml_group_links.yml b/config/feature_flags/development/saml_group_links.yml
deleted file mode 100644
index 3b427bd83fa..00000000000
--- a/config/feature_flags/development/saml_group_links.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: saml_group_links
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/45080
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/267020
-milestone: '13.6'
-type: development
-group: group::access
-default_enabled: true
diff --git a/config/feature_flags/development/scoped_group_variables.yml b/config/feature_flags/development/scoped_group_variables.yml
new file mode 100644
index 00000000000..bdeb453abb9
--- /dev/null
+++ b/config/feature_flags/development/scoped_group_variables.yml
@@ -0,0 +1,8 @@
+---
+name: scoped_group_variables
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55256
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/323298
+milestone: '13.10'
+type: development
+group: group::configure
+default_enabled: false
diff --git a/config/feature_flags/development/security_on_demand_scans_site_validation.yml b/config/feature_flags/development/security_on_demand_scans_site_validation.yml
deleted file mode 100644
index bfe02a0bad7..00000000000
--- a/config/feature_flags/development/security_on_demand_scans_site_validation.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: security_on_demand_scans_site_validation
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/40685
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/241815
-milestone: '13.4'
-type: development
-group: group::dynamic analysis
-default_enabled: true
diff --git a/config/feature_flags/development/security_orchestration_policies_configuration.yml b/config/feature_flags/development/security_orchestration_policies_configuration.yml
new file mode 100644
index 00000000000..ae64339607e
--- /dev/null
+++ b/config/feature_flags/development/security_orchestration_policies_configuration.yml
@@ -0,0 +1,8 @@
+---
+name: security_orchestration_policies_configuration
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54220
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/321258
+milestone: '13.9'
+type: development
+group: group::container security
+default_enabled: false
diff --git a/config/feature_flags/development/shared_group_membership_auth.yml b/config/feature_flags/development/shared_group_membership_auth.yml
deleted file mode 100644
index e6aaad9bbd6..00000000000
--- a/config/feature_flags/development/shared_group_membership_auth.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: shared_group_membership_auth
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/46412
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/224771
-milestone: '13.6'
-type: development
-group: group::access
-default_enabled: false
diff --git a/config/feature_flags/development/skip_dag_manual_and_delayed_jobs.yml b/config/feature_flags/development/skip_dag_manual_and_delayed_jobs.yml
index 678a52ee613..640be201868 100644
--- a/config/feature_flags/development/skip_dag_manual_and_delayed_jobs.yml
+++ b/config/feature_flags/development/skip_dag_manual_and_delayed_jobs.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/297240
milestone: '13.8'
type: development
group: group::pipeline authoring
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/suggestions_custom_commit.yml b/config/feature_flags/development/suggestions_custom_commit.yml
deleted file mode 100644
index 44455664813..00000000000
--- a/config/feature_flags/development/suggestions_custom_commit.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: suggestions_custom_commit
-introduced_by_url:
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/297404
-milestone: '13.9'
-type: development
-group: group::code review
-default_enabled: true
diff --git a/config/feature_flags/development/trace_memory_allocations.yml b/config/feature_flags/development/trace_memory_allocations.yml
index 78f21d2e520..3760ceded43 100644
--- a/config/feature_flags/development/trace_memory_allocations.yml
+++ b/config/feature_flags/development/trace_memory_allocations.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/299524
milestone: '13.9'
type: development
group: group::memory
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/usage_data_code_review_aggregation.yml b/config/feature_flags/development/usage_data_code_review_aggregation.yml
new file mode 100644
index 00000000000..a41fd11dac3
--- /dev/null
+++ b/config/feature_flags/development/usage_data_code_review_aggregation.yml
@@ -0,0 +1,8 @@
+---
+name: usage_data_code_review_aggregation
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/53553
+rollout_issue_url:
+milestone: '13.9'
+type: development
+group: group::code review
+default_enabled: false
diff --git a/config/feature_flags/development/usage_data_design_action.yml b/config/feature_flags/development/usage_data_design_action.yml
index e013237ecca..f5fc7f67c6d 100644
--- a/config/feature_flags/development/usage_data_design_action.yml
+++ b/config/feature_flags/development/usage_data_design_action.yml
@@ -4,5 +4,5 @@ introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/46626
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/287630
milestone: '13.7'
type: development
-group: group::knowledge
+group: group::product planning
default_enabled: true
diff --git a/config/feature_flags/development/usage_data_i_analytics_cohorts.yml b/config/feature_flags/development/usage_data_i_analytics_cohorts.yml
new file mode 100644
index 00000000000..b9c401b7e27
--- /dev/null
+++ b/config/feature_flags/development/usage_data_i_analytics_cohorts.yml
@@ -0,0 +1,8 @@
+---
+name: usage_data_i_analytics_cohorts
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54329
+rollout_issue_url:
+milestone: '13.9'
+type: development
+group: group::optimize
+default_enabled: true
diff --git a/config/feature_flags/development/usage_data_i_code_review_user_assignees_changed.yml b/config/feature_flags/development/usage_data_i_code_review_user_assignees_changed.yml
new file mode 100644
index 00000000000..ac7edd86e5f
--- /dev/null
+++ b/config/feature_flags/development/usage_data_i_code_review_user_assignees_changed.yml
@@ -0,0 +1,8 @@
+---
+name: usage_data_i_code_review_user_assignees_changed
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55486
+rollout_issue_url:
+milestone: '13.10'
+type: development
+group: group::code review
+default_enabled: true
diff --git a/config/feature_flags/development/usage_data_i_code_review_user_labels_changed.yml b/config/feature_flags/development/usage_data_i_code_review_user_labels_changed.yml
new file mode 100644
index 00000000000..d70c6c963e8
--- /dev/null
+++ b/config/feature_flags/development/usage_data_i_code_review_user_labels_changed.yml
@@ -0,0 +1,8 @@
+---
+name: usage_data_i_code_review_user_labels_changed
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55484
+rollout_issue_url:
+milestone: '13.10'
+type: development
+group: group::code review
+default_enabled: true
diff --git a/config/feature_flags/development/usage_data_i_code_review_user_milestone_changed.yml b/config/feature_flags/development/usage_data_i_code_review_user_milestone_changed.yml
new file mode 100644
index 00000000000..0f64b7639c5
--- /dev/null
+++ b/config/feature_flags/development/usage_data_i_code_review_user_milestone_changed.yml
@@ -0,0 +1,8 @@
+---
+name: usage_data_i_code_review_user_milestone_changed
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55484
+rollout_issue_url:
+milestone: '13.10'
+type: development
+group: group::code review
+default_enabled: true
diff --git a/config/feature_flags/development/usage_data_i_code_review_user_mr_discussion_locked.yml b/config/feature_flags/development/usage_data_i_code_review_user_mr_discussion_locked.yml
new file mode 100644
index 00000000000..e6e81f48028
--- /dev/null
+++ b/config/feature_flags/development/usage_data_i_code_review_user_mr_discussion_locked.yml
@@ -0,0 +1,8 @@
+---
+name: usage_data_i_code_review_user_mr_discussion_locked
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55069
+rollout_issue_url:
+milestone: '13.10'
+type: development
+group: group::code review
+default_enabled: true
diff --git a/config/feature_flags/development/usage_data_i_code_review_user_mr_discussion_unlocked.yml b/config/feature_flags/development/usage_data_i_code_review_user_mr_discussion_unlocked.yml
new file mode 100644
index 00000000000..03ec6cde34b
--- /dev/null
+++ b/config/feature_flags/development/usage_data_i_code_review_user_mr_discussion_unlocked.yml
@@ -0,0 +1,8 @@
+---
+name: usage_data_i_code_review_user_mr_discussion_unlocked
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55069
+rollout_issue_url:
+milestone: '13.10'
+type: development
+group: group::code review
+default_enabled: true
diff --git a/config/feature_flags/development/usage_data_i_code_review_user_reviewers_changed.yml b/config/feature_flags/development/usage_data_i_code_review_user_reviewers_changed.yml
new file mode 100644
index 00000000000..10084b70ee8
--- /dev/null
+++ b/config/feature_flags/development/usage_data_i_code_review_user_reviewers_changed.yml
@@ -0,0 +1,8 @@
+---
+name: usage_data_i_code_review_user_reviewers_changed
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55486
+rollout_issue_url:
+milestone: '13.10'
+type: development
+group: group::code review
+default_enabled: true
diff --git a/config/feature_flags/development/usage_data_i_code_review_user_time_estimate_changed.yml b/config/feature_flags/development/usage_data_i_code_review_user_time_estimate_changed.yml
new file mode 100644
index 00000000000..81096288a8d
--- /dev/null
+++ b/config/feature_flags/development/usage_data_i_code_review_user_time_estimate_changed.yml
@@ -0,0 +1,8 @@
+---
+name: usage_data_i_code_review_user_time_estimate_changed
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55046
+rollout_issue_url:
+milestone: '13.10'
+type: development
+group: group::code review
+default_enabled: true
diff --git a/config/feature_flags/development/usage_data_i_code_review_user_time_spent_changed.yml b/config/feature_flags/development/usage_data_i_code_review_user_time_spent_changed.yml
new file mode 100644
index 00000000000..56329f6b48b
--- /dev/null
+++ b/config/feature_flags/development/usage_data_i_code_review_user_time_spent_changed.yml
@@ -0,0 +1,8 @@
+---
+name: usage_data_i_code_review_user_time_spent_changed
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55046
+rollout_issue_url:
+milestone: '13.10'
+type: development
+group: group::code review
+default_enabled: true
diff --git a/config/feature_flags/development/usage_data_i_source_code_code_intelligence.yml b/config/feature_flags/development/usage_data_i_source_code_code_intelligence.yml
deleted file mode 100644
index 488053dcf2d..00000000000
--- a/config/feature_flags/development/usage_data_i_source_code_code_intelligence.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: usage_data_i_source_code_code_intelligence
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/41881
-rollout_issue_url:
-milestone: '13.4'
-type: development
-group: group::code review
-default_enabled: true
diff --git a/config/feature_flags/development/usage_data_o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile.yml b/config/feature_flags/development/usage_data_o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile.yml
new file mode 100644
index 00000000000..64e46689775
--- /dev/null
+++ b/config/feature_flags/development/usage_data_o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile.yml
@@ -0,0 +1,8 @@
+---
+name: usage_data_o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54707
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/322166
+milestone: '13.10'
+type: development
+group: group::pipeline authoring
+default_enabled: false
diff --git a/config/feature_flags/development/usage_data_track_ecosystem_slack_service.yml b/config/feature_flags/development/usage_data_track_ecosystem_slack_service.yml
new file mode 100644
index 00000000000..d9d4c06c9fa
--- /dev/null
+++ b/config/feature_flags/development/usage_data_track_ecosystem_slack_service.yml
@@ -0,0 +1,8 @@
+---
+name: usage_data_track_ecosystem_slack_service
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54347
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/322588
+milestone: '13.10'
+type: development
+group: group::ecosystem
+default_enabled: false
diff --git a/config/feature_flags/development/usage_data_track_quickactions.yml b/config/feature_flags/development/usage_data_track_quickactions.yml
index 57f698f7031..3e2a2fe8927 100644
--- a/config/feature_flags/development/usage_data_track_quickactions.yml
+++ b/config/feature_flags/development/usage_data_track_quickactions.yml
@@ -1,8 +1,8 @@
---
name: usage_data_track_quickactions
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52398
-rollout_issue_url:
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/321054
milestone: '13.9'
type: development
group: group::project management
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/validate_namespace_parent_type.yml b/config/feature_flags/development/validate_namespace_parent_type.yml
new file mode 100644
index 00000000000..dc89c462f17
--- /dev/null
+++ b/config/feature_flags/development/validate_namespace_parent_type.yml
@@ -0,0 +1,8 @@
+---
+name: validate_namespace_parent_type
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54094
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/322101
+milestone: '13.10'
+type: development
+group: group::access
+default_enabled: false
diff --git a/config/feature_flags/development/vue_notification_dropdown.yml b/config/feature_flags/development/vue_notification_dropdown.yml
deleted file mode 100644
index 4c4f67fe928..00000000000
--- a/config/feature_flags/development/vue_notification_dropdown.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: vue_notification_dropdown
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52068
-rollout_issue_url:
-milestone: '13.8'
-type: development
-group: group::optimize
-default_enabled: false
diff --git a/config/feature_flags/development/vue_project_members_list.yml b/config/feature_flags/development/vue_project_members_list.yml
deleted file mode 100644
index 55f4d2bf62a..00000000000
--- a/config/feature_flags/development/vue_project_members_list.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: vue_project_members_list
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52148
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/299954
-milestone: '13.9'
-type: development
-group: group::access
-default_enabled: true
diff --git a/config/feature_flags/experiment/ci_syntax_templates_b_experiment_percentage.yml b/config/feature_flags/experiment/ci_syntax_templates_b_experiment_percentage.yml
new file mode 100644
index 00000000000..0bad0bbb1c0
--- /dev/null
+++ b/config/feature_flags/experiment/ci_syntax_templates_b_experiment_percentage.yml
@@ -0,0 +1,8 @@
+---
+name: ci_syntax_templates_b_experiment_percentage
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/53479
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/300993
+milestone: "13.9"
+type: experiment
+group: group::activation
+default_enabled: false
diff --git a/config/feature_flags/experiment/ci_syntax_templates_experiment_percentage.yml b/config/feature_flags/experiment/ci_syntax_templates_experiment_percentage.yml
deleted file mode 100644
index 3ed457acce8..00000000000
--- a/config/feature_flags/experiment/ci_syntax_templates_experiment_percentage.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_syntax_templates_experiment_percentage
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/48141
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/281057
-milestone: '13.8'
-type: experiment
-group: group::activation
-default_enabled: false
diff --git a/config/feature_flags/experiment/customize_homepage_experiment_percentage.yml b/config/feature_flags/experiment/customize_homepage_experiment_percentage.yml
deleted file mode 100644
index eff0d2785eb..00000000000
--- a/config/feature_flags/experiment/customize_homepage_experiment_percentage.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: customize_homepage_experiment_percentage
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/39348
-rollout_issue_url: https://gitlab.com/gitlab-org/growth/team-tasks/-/issues/187
-milestone: '13.4'
-type: experiment
-group: group::expansion
-default_enabled: false
diff --git a/config/feature_flags/experiment/empty_repo_upload.yml b/config/feature_flags/experiment/empty_repo_upload.yml
new file mode 100644
index 00000000000..9655a4d3cb4
--- /dev/null
+++ b/config/feature_flags/experiment/empty_repo_upload.yml
@@ -0,0 +1,8 @@
+---
+name: empty_repo_upload
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52755
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/285296
+milestone: '13.9'
+type: experiment
+group: group::adoption
+default_enabled: false
diff --git a/config/feature_flags/experiment/invite_members_version_a_experiment_percentage.yml b/config/feature_flags/experiment/invite_members_version_a_experiment_percentage.yml
deleted file mode 100644
index d20cb10fcda..00000000000
--- a/config/feature_flags/experiment/invite_members_version_a_experiment_percentage.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: invite_members_version_a_experiment_percentage
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/33210
-rollout_issue_url: https://gitlab.com/gitlab-org/growth/team-tasks/-/issues/299
-milestone: '13.1'
-type: experiment
-group: group::expansion
-default_enabled: false
diff --git a/config/feature_flags/experiment/repo_integrations_link.yml b/config/feature_flags/experiment/repo_integrations_link.yml
new file mode 100644
index 00000000000..943429a84e7
--- /dev/null
+++ b/config/feature_flags/experiment/repo_integrations_link.yml
@@ -0,0 +1,8 @@
+---
+name: repo_integrations_link
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54652/
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/285154
+milestone: '13.10'
+type: experiment
+group: group::adoption
+default_enabled: false
diff --git a/config/feature_flags/ops/marginalia.yml b/config/feature_flags/ops/marginalia.yml
deleted file mode 100644
index fb82f274eb2..00000000000
--- a/config/feature_flags/ops/marginalia.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: marginalia
-introduced_by_url:
-rollout_issue_url:
-milestone:
-type: ops
-group:
-default_enabled: false
diff --git a/config/gitlab.yml.example b/config/gitlab.yml.example
index 65627b0e166..57ece521301 100644
--- a/config/gitlab.yml.example
+++ b/config/gitlab.yml.example
@@ -73,6 +73,8 @@ production: &base
worker_src: "'self' blob:"
report_uri:
+ allowed_hosts: []
+
# Trusted Proxies
# Customize if you have GitLab behind a reverse proxy which is running on a different machine.
# Add the IP address for your reverse proxy to the list, otherwise users will appear signed in from that address.
@@ -1159,10 +1161,17 @@ production: &base
# secret_file: /home/git/gitlab/.gitlab_workhorse_secret
gitlab_kas:
+ # enabled: true
# File that contains the secret key for verifying access for gitlab-kas.
# Default is '.gitlab_kas_secret' relative to Rails.root (i.e. root of the GitLab app).
# secret_file: /home/git/gitlab/.gitlab_kas_secret
+ # The URL to the external KAS API (used by the Kubernetes agents)
+ # external_url: wss://kas.example.com
+
+ # The URL to the internal KAS API (used by the GitLab backend)
+ # internal_url: grpc://localhost:8153
+
## GitLab Elasticsearch settings
elasticsearch:
indexer_path: /home/git/gitlab-elasticsearch-indexer/
diff --git a/config/helpers/incremental_webpack_compiler.js b/config/helpers/incremental_webpack_compiler.js
index 786bb6071fa..5d4f9bd040d 100644
--- a/config/helpers/incremental_webpack_compiler.js
+++ b/config/helpers/incremental_webpack_compiler.js
@@ -1,3 +1,4 @@
+/* eslint-disable max-classes-per-file, no-underscore-dangle */
const fs = require('fs');
const path = require('path');
@@ -7,6 +8,7 @@ const log = (msg, ...rest) => console.log(`IncrementalWebpackCompiler: ${msg}`,
// Five seconds seem to work fine and the user can read the message
const TIMEOUT = 5000;
+/* eslint-disable class-methods-use-this */
class NoopCompiler {
constructor() {
this.enabled = false;
@@ -20,6 +22,7 @@ class NoopCompiler {
setupMiddleware() {}
}
+/* eslint-enable class-methods-use-this */
class IncrementalWebpackCompiler {
constructor(historyFilePath) {
diff --git a/config/helpers/is_eslint.js b/config/helpers/is_eslint.js
index 60528796962..9a3a9bfca12 100644
--- a/config/helpers/is_eslint.js
+++ b/config/helpers/is_eslint.js
@@ -2,7 +2,7 @@
* Returns true if the given module is required from eslint
*/
const isESLint = (mod) => {
- let parent = mod.parent;
+ let { parent } = mod;
while (parent) {
if (parent.filename && parent.filename.includes('/eslint')) {
diff --git a/config/helpers/vendor_dll_hash.js b/config/helpers/vendor_dll_hash.js
index 2df97e7b95d..cdbaebc9789 100644
--- a/config/helpers/vendor_dll_hash.js
+++ b/config/helpers/vendor_dll_hash.js
@@ -1,6 +1,6 @@
const fs = require('fs');
-const path = require('path');
const crypto = require('crypto');
+const path = require('path');
const CACHE_PATHS = [
'./config/webpack.config.js',
diff --git a/config/initializers/0_marginalia.rb b/config/initializers/0_marginalia.rb
index 952dd75886d..ab21f936cd8 100644
--- a/config/initializers/0_marginalia.rb
+++ b/config/initializers/0_marginalia.rb
@@ -4,17 +4,16 @@ require 'marginalia'
::Marginalia::Comment.extend(::Gitlab::Marginalia::Comment)
-# Patch to modify 'Marginalia::ActiveRecordInstrumentation.annotate_sql' method with feature check.
-# Orignal Marginalia::ActiveRecordInstrumentation is included to ActiveRecord::ConnectionAdapters::PostgreSQLAdapter in the Marginalia Railtie.
-# Refer: https://github.com/basecamp/marginalia/blob/v1.8.0/lib/marginalia/railtie.rb#L67
-ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.prepend(Gitlab::Marginalia::ActiveRecordInstrumentation)
-
# By default, PostgreSQL only tracks the first 1024 bytes of a SQL
# query. Prepending the comment allows us to trace the source of the
# query without having to increase the `track_activity_query_size`
# parameter.
-Marginalia::Comment.prepend_comment = true unless Rails.env.test? # Some tests do string matching against raw SQL
-Marginalia::Comment.components = [:application, :controller, :action, :correlation_id, :jid, :job_class]
+#
+# We only enable this in production because a number of tests do string
+# matching against the raw SQL, and prepending the comment prevents color
+# coding from working in the development log.
+Marginalia::Comment.prepend_comment = true if Rails.env.production?
+Marginalia::Comment.components = [:application, :controller, :action, :correlation_id, :jid, :job_class, :endpoint_id]
# As mentioned in https://github.com/basecamp/marginalia/pull/93/files,
# adding :line has some overhead because a regexp on the backtrace has
@@ -25,5 +24,3 @@ Marginalia::Comment.components << :line if Rails.env.development?
Gitlab::Marginalia.set_application_name
Gitlab::Marginalia.enable_sidekiq_instrumentation
-
-Gitlab::Marginalia.set_enabled_from_feature_flag
diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb
index c478123f4eb..b8dc464deed 100644
--- a/config/initializers/1_settings.rb
+++ b/config/initializers/1_settings.rb
@@ -210,6 +210,7 @@ Settings.gitlab['domain_allowlist'] ||= []
Settings.gitlab['import_sources'] ||= Gitlab::ImportSources.values
Settings.gitlab['trusted_proxies'] ||= []
Settings.gitlab['content_security_policy'] ||= Gitlab::ContentSecurityPolicy::ConfigLoader.default_settings_hash
+Settings.gitlab['allowed_hosts'] ||= []
Settings.gitlab['no_todos_messages'] ||= YAML.load_file(Rails.root.join('config', 'no_todos_messages.yml'))
Settings.gitlab['impersonation_enabled'] ||= true if Settings.gitlab['impersonation_enabled'].nil?
Settings.gitlab['usage_ping_enabled'] = true if Settings.gitlab['usage_ping_enabled'].nil?
@@ -533,7 +534,7 @@ Settings.cron_jobs['users_create_statistics_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['users_create_statistics_worker']['cron'] ||= '2 15 * * *'
Settings.cron_jobs['users_create_statistics_worker']['job_class'] = 'Users::CreateStatisticsWorker'
Settings.cron_jobs['authorized_project_update_periodic_recalculate_worker'] ||= Settingslogic.new({})
-Settings.cron_jobs['authorized_project_update_periodic_recalculate_worker']['cron'] ||= '45 1 * * 6'
+Settings.cron_jobs['authorized_project_update_periodic_recalculate_worker']['cron'] ||= '45 1 1,15 * *'
Settings.cron_jobs['authorized_project_update_periodic_recalculate_worker']['job_class'] = 'AuthorizedProjectUpdate::PeriodicRecalculateWorker'
Settings.cron_jobs['update_container_registry_info_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['update_container_registry_info_worker']['cron'] ||= '0 0 * * *'
@@ -544,9 +545,9 @@ Settings.cron_jobs['postgres_dynamic_partitions_creator']['job_class'] ||= 'Part
Settings.cron_jobs['ci_platform_metrics_update_cron_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['ci_platform_metrics_update_cron_worker']['cron'] ||= '47 9 * * *'
Settings.cron_jobs['ci_platform_metrics_update_cron_worker']['job_class'] = 'CiPlatformMetricsUpdateCronWorker'
-Settings.cron_jobs['analytics_instance_statistics_count_job_trigger_worker'] ||= Settingslogic.new({})
-Settings.cron_jobs['analytics_instance_statistics_count_job_trigger_worker']['cron'] ||= '50 23 */1 * *'
-Settings.cron_jobs['analytics_instance_statistics_count_job_trigger_worker']['job_class'] ||= 'Analytics::InstanceStatistics::CountJobTriggerWorker'
+Settings.cron_jobs['analytics_usage_trends_count_job_trigger_worker'] ||= Settingslogic.new({})
+Settings.cron_jobs['analytics_usage_trends_count_job_trigger_worker']['cron'] ||= '50 23 */1 * *'
+Settings.cron_jobs['analytics_usage_trends_count_job_trigger_worker']['job_class'] ||= 'Analytics::UsageTrends::CountJobTriggerWorker'
Settings.cron_jobs['member_invitation_reminder_emails_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['member_invitation_reminder_emails_worker']['cron'] ||= '0 0 * * *'
Settings.cron_jobs['member_invitation_reminder_emails_worker']['job_class'] = 'MemberInvitationReminderEmailsWorker'
@@ -585,6 +586,9 @@ Gitlab.ee do
Settings.cron_jobs['geo_verification_cron_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['geo_verification_cron_worker']['cron'] ||= '* * * * *'
Settings.cron_jobs['geo_verification_cron_worker']['job_class'] ||= 'Geo::VerificationCronWorker'
+ Settings.cron_jobs['geo_secondary_usage_data_cron_worker'] ||= Settingslogic.new({})
+ Settings.cron_jobs['geo_secondary_usage_data_cron_worker']['cron'] ||= '0 0 * * 0'
+ Settings.cron_jobs['geo_secondary_usage_data_cron_worker']['job_class'] ||= 'Geo::SecondaryUsageDataCronWorker'
Settings.cron_jobs['geo_file_download_dispatch_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['geo_file_download_dispatch_worker']['cron'] ||= '*/1 * * * *'
Settings.cron_jobs['geo_file_download_dispatch_worker']['job_class'] ||= 'Geo::FileDownloadDispatchWorker'
@@ -710,7 +714,10 @@ Settings.workhorse['secret_file'] ||= Rails.root.join('.gitlab_workhorse_secret'
# GitLab KAS
#
Settings['gitlab_kas'] ||= Settingslogic.new({})
+Settings.gitlab_kas['enabled'] ||= false
Settings.gitlab_kas['secret_file'] ||= Rails.root.join('.gitlab_kas_secret')
+Settings.gitlab_kas['external_url'] ||= 'wss://kas.example.com'
+Settings.gitlab_kas['internal_url'] ||= 'grpc://localhost:8153'
#
# Repositories
diff --git a/config/initializers/doorkeeper.rb b/config/initializers/doorkeeper.rb
index 1cf70909997..4533779339a 100644
--- a/config/initializers/doorkeeper.rb
+++ b/config/initializers/doorkeeper.rb
@@ -106,4 +106,10 @@ Doorkeeper.configure do
# realm "Doorkeeper"
base_controller '::Gitlab::BaseDoorkeeperController'
+
+ # Allow Resource Owner Password Credentials Grant without client credentials,
+ # this was disabled by default in Doorkeeper 5.5.
+ #
+ # We might want to disable this in the future, see https://gitlab.com/gitlab-org/gitlab/-/issues/323615
+ skip_client_authentication_for_password_grant true
end
diff --git a/config/initializers/gitlab_experiment.rb b/config/initializers/gitlab_experiment.rb
index 40b4c0dc4ee..a312755f300 100644
--- a/config/initializers/gitlab_experiment.rb
+++ b/config/initializers/gitlab_experiment.rb
@@ -2,5 +2,7 @@
Gitlab::Experiment.configure do |config|
config.base_class = 'ApplicationExperiment'
- config.cache = ApplicationExperiment::Cache.new
+ config.cache = Gitlab::Experiment::Cache::RedisHashStore.new(
+ pool: ->(&block) { Gitlab::Redis::SharedState.with { |redis| block.call(redis) } }
+ )
end
diff --git a/config/initializers/postgres_partitioning.rb b/config/initializers/postgres_partitioning.rb
index 3cea8575cc7..6b64ea3f83d 100644
--- a/config/initializers/postgres_partitioning.rb
+++ b/config/initializers/postgres_partitioning.rb
@@ -4,6 +4,7 @@
# (even with eager loading disabled).
Gitlab::Database::Partitioning::PartitionCreator.register(AuditEvent)
+Gitlab::Database::Partitioning::PartitionCreator.register(WebHookLogPartitioned)
begin
Gitlab::Database::Partitioning::PartitionCreator.new.create_partitions unless ENV['DISABLE_POSTGRES_PARTITION_CREATION_ON_STARTUP']
diff --git a/config/initializers/rack_multipart_patch.rb b/config/initializers/rack_multipart_patch.rb
new file mode 100644
index 00000000000..78cf6244814
--- /dev/null
+++ b/config/initializers/rack_multipart_patch.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+module Rack
+ module Multipart
+ class << self
+ module MultipartPatch
+ def extract_multipart(req, params = Rack::Utils.default_query_parser)
+ log_multipart_warning(req) if log_large_multipart?
+
+ super
+ end
+
+ def log_multipart_warning(req)
+ content_length = req.content_length.to_i
+
+ return unless content_length > log_threshold
+
+ message = {
+ message: "Large multipart body detected",
+ path: req.path,
+ content_length: content_length,
+ correlation_id: ::Labkit::Context.correlation_id
+ }
+
+ log_warn(message)
+ end
+
+ def log_warn(message)
+ warn message.to_json
+ end
+
+ def log_large_multipart?
+ Gitlab::Utils.to_boolean(ENV['ENABLE_RACK_MULTIPART_LOGGING'], default: true) && Gitlab.com?
+ end
+
+ def log_threshold
+ ENV.fetch('RACK_MULTIPART_LOGGING_BYTES', 100_000_000).to_i
+ end
+ end
+
+ prepend MultipartPatch
+ end
+ end
+end
diff --git a/config/initializers/rails_host_authorization.rb b/config/initializers/rails_host_authorization.rb
index 7d719dd519f..22bb6fb7061 100644
--- a/config/initializers/rails_host_authorization.rb
+++ b/config/initializers/rails_host_authorization.rb
@@ -2,6 +2,11 @@
# This file requires config/initializers/1_settings.rb
+if Gitlab.config.gitlab.allowed_hosts.present?
+ Rails.application.config.hosts << Gitlab.config.gitlab.host << 'unix'
+ Rails.application.config.hosts += Gitlab.config.gitlab.allowed_hosts
+end
+
if Rails.env.development?
Rails.application.config.hosts += [Gitlab.config.gitlab.host, 'unix', 'host.docker.internal']
diff --git a/config/initializers/validate_puma.rb b/config/initializers/validate_puma.rb
index 9723765d00f..b8a237f3c15 100644
--- a/config/initializers/validate_puma.rb
+++ b/config/initializers/validate_puma.rb
@@ -1,9 +1,5 @@
# frozen_string_literal: true
-def max_puma_workers
- Puma.cli_config.options[:workers].to_i
-end
-
if Gitlab::Runtime.puma? && !Gitlab::Runtime.puma_in_clustered_mode?
raise 'Puma is only supported in Clustered mode (workers > 0)' if Gitlab.com?
diff --git a/config/initializers_before_autoloader/000_inflections.rb b/config/initializers_before_autoloader/000_inflections.rb
index 9eb1ebe77bf..308b38c1ba2 100644
--- a/config/initializers_before_autoloader/000_inflections.rb
+++ b/config/initializers_before_autoloader/000_inflections.rb
@@ -20,6 +20,7 @@ ActiveSupport::Inflector.inflections do |inflect|
event_log
file_registry
group_view
+ group_wiki_repository_registry
job_artifact_registry
lfs_object_registry
package_file_registry
diff --git a/config/initializers_before_autoloader/003_gc_compact.rb b/config/initializers_before_autoloader/003_gc_compact.rb
new file mode 100644
index 00000000000..6b5d49d79ab
--- /dev/null
+++ b/config/initializers_before_autoloader/003_gc_compact.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+# Be sure to restart your server when you modify this file.
+#
+# Disables `GC.compact` method via monkey-patching.
+# This is temporary measure to deal with reguarly appearing compacting issues (resulting in segfaults) in external gems.
+# Having this patch allow using `nakayoshi_fork` in `config/puma.rb`,
+# only without `GC.compact` (still invoking 4 GC cycles).
+# Refer to for details: https://github.com/puma/puma/blob/80274413b04fae77cac7a7fecab7d6e89204343b/lib/puma/util.rb#L27
+
+# rubocop:disable Rails/Output
+module NakayoshiForkCompacting
+ module MonkeyPatch
+ def compact
+ puts 'Note: GC compacting is currently disabled.'\
+ ' Refer to `config/initializers_before_autoloader/003_gc_compact.rb` for details.'
+ end
+ end
+end
+
+GC.singleton_class.prepend NakayoshiForkCompacting::MonkeyPatch
diff --git a/config/karma.config.js b/config/karma.config.js
index 1d65e65ce2a..1c2dd21c189 100644
--- a/config/karma.config.js
+++ b/config/karma.config.js
@@ -1,13 +1,14 @@
-const path = require('path');
-const glob = require('glob');
+/* eslint-disable no-inner-declarations, no-param-reassign */
const chalk = require('chalk');
-const webpack = require('webpack');
const argumentsParser = require('commander');
-const webpackConfig = require('./webpack.config.js');
+const glob = require('glob');
+const path = require('path');
+const webpack = require('webpack');
const IS_EE = require('./helpers/is_ee_env');
+const webpackConfig = require('./webpack.config.js');
const ROOT_PATH = path.resolve(__dirname, '..');
-const SPECS_PATH = /^(?:\.[\\\/])?(ee[\\\/])?spec[\\\/]javascripts[\\\/]/;
+const SPECS_PATH = /^(?:\.[\\/])?(ee[\\/])?spec[\\/]javascripts[\\/]/;
function exitError(message) {
console.error(chalk.red(`\nError: ${message}\n`));
@@ -77,7 +78,7 @@ if (specFilters.length) {
root: ROOT_PATH,
matchBase: true,
})
- .filter((path) => path.endsWith('spec.js')),
+ .filter((filePath) => filePath.endsWith('spec.js')),
);
// flatten
@@ -97,14 +98,14 @@ if (specFilters.length) {
}
const CE_FILES = filteredSpecFiles.filter((file) => !file.startsWith('ee'));
- createContext(CE_FILES, /[^e]{2}[\\\/]spec[\\\/]javascripts$/, 'spec/javascripts');
+ createContext(CE_FILES, /[^e]{2}[\\/]spec[\\/]javascripts$/, 'spec/javascripts');
const EE_FILES = filteredSpecFiles.filter((file) => file.startsWith('ee'));
- createContext(EE_FILES, /ee[\\\/]spec[\\\/]javascripts$/, 'ee/spec/javascripts');
+ createContext(EE_FILES, /ee[\\/]spec[\\/]javascripts$/, 'ee/spec/javascripts');
}
// Karma configuration
-module.exports = function (config) {
+module.exports = (config) => {
process.env.TZ = 'Etc/UTC';
const fixturesPath = `tmp/tests/frontend/fixtures${IS_EE ? '-ee' : ''}`;
diff --git a/config/metrics/counts_28d/20210201124930_deployments.yml b/config/metrics/counts_28d/20210201124930_deployments.yml
index e03785d62ba..4dcb9c5da4b 100644
--- a/config/metrics/counts_28d/20210201124930_deployments.yml
+++ b/config/metrics/counts_28d/20210201124930_deployments.yml
@@ -7,7 +7,7 @@ product_group: group::ops release
product_category:
value_type: number
status: data_available
-milestone: 13.2
+milestone: "13.2"
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/35493
time_frame: 28d
data_source: database
diff --git a/config/metrics/counts_28d/20210216174910_analytics_unique_visits_for_any_target_monthly.yml b/config/metrics/counts_28d/20210216174910_analytics_unique_visits_for_any_target_monthly.yml
new file mode 100644
index 00000000000..d589814b7af
--- /dev/null
+++ b/config/metrics/counts_28d/20210216174910_analytics_unique_visits_for_any_target_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: analytics_unique_visits.analytics_unique_visits_for_any_target_monthly
+description: Visits to any of the pages listed above per month
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216174914_g_analytics_contribution_monthly.yml b/config/metrics/counts_28d/20210216174914_g_analytics_contribution_monthly.yml
new file mode 100644
index 00000000000..ea3094527db
--- /dev/null
+++ b/config/metrics/counts_28d/20210216174914_g_analytics_contribution_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.analytics.g_analytics_contribution_monthly
+description:
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216174918_g_analytics_insights_monthly.yml b/config/metrics/counts_28d/20210216174918_g_analytics_insights_monthly.yml
new file mode 100644
index 00000000000..cb792aae308
--- /dev/null
+++ b/config/metrics/counts_28d/20210216174918_g_analytics_insights_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.analytics.g_analytics_insights_monthly
+description:
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216174921_g_analytics_issues_monthly.yml b/config/metrics/counts_28d/20210216174921_g_analytics_issues_monthly.yml
new file mode 100644
index 00000000000..9fc7894d399
--- /dev/null
+++ b/config/metrics/counts_28d/20210216174921_g_analytics_issues_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.analytics.g_analytics_issues_monthly
+description:
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216174926_g_analytics_productivity_monthly.yml b/config/metrics/counts_28d/20210216174926_g_analytics_productivity_monthly.yml
new file mode 100644
index 00000000000..2ae3c3626d1
--- /dev/null
+++ b/config/metrics/counts_28d/20210216174926_g_analytics_productivity_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.analytics.g_analytics_productivity_monthly
+description:
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216174929_g_analytics_valuestream_monthly.yml b/config/metrics/counts_28d/20210216174929_g_analytics_valuestream_monthly.yml
new file mode 100644
index 00000000000..86d84193265
--- /dev/null
+++ b/config/metrics/counts_28d/20210216174929_g_analytics_valuestream_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.analytics.g_analytics_valuestream_monthly
+description:
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216174933_p_analytics_pipelines_monthly.yml b/config/metrics/counts_28d/20210216174933_p_analytics_pipelines_monthly.yml
new file mode 100644
index 00000000000..ba5c4d27d25
--- /dev/null
+++ b/config/metrics/counts_28d/20210216174933_p_analytics_pipelines_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.analytics.p_analytics_pipelines_monthly
+description:
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216174937_p_analytics_code_reviews_monthly.yml b/config/metrics/counts_28d/20210216174937_p_analytics_code_reviews_monthly.yml
new file mode 100644
index 00000000000..e4c15360b52
--- /dev/null
+++ b/config/metrics/counts_28d/20210216174937_p_analytics_code_reviews_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.analytics.p_analytics_code_reviews_monthly
+description:
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216174941_p_analytics_valuestream_monthly.yml b/config/metrics/counts_28d/20210216174941_p_analytics_valuestream_monthly.yml
new file mode 100644
index 00000000000..da07cbee741
--- /dev/null
+++ b/config/metrics/counts_28d/20210216174941_p_analytics_valuestream_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.analytics.p_analytics_valuestream_monthly
+description:
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216174945_p_analytics_insights_monthly.yml b/config/metrics/counts_28d/20210216174945_p_analytics_insights_monthly.yml
new file mode 100644
index 00000000000..afe6c79e885
--- /dev/null
+++ b/config/metrics/counts_28d/20210216174945_p_analytics_insights_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.analytics.p_analytics_insights_monthly
+description:
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216174949_p_analytics_issues_monthly.yml b/config/metrics/counts_28d/20210216174949_p_analytics_issues_monthly.yml
new file mode 100644
index 00000000000..4ee8afd234b
--- /dev/null
+++ b/config/metrics/counts_28d/20210216174949_p_analytics_issues_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.analytics.p_analytics_issues_monthly
+description:
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216174953_p_analytics_repo_monthly.yml b/config/metrics/counts_28d/20210216174953_p_analytics_repo_monthly.yml
new file mode 100644
index 00000000000..c41b84dbcd0
--- /dev/null
+++ b/config/metrics/counts_28d/20210216174953_p_analytics_repo_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.analytics.p_analytics_repo_monthly
+description:
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216174956_i_analytics_cohorts_monthly.yml b/config/metrics/counts_28d/20210216174956_i_analytics_cohorts_monthly.yml
new file mode 100644
index 00000000000..843d3717ba7
--- /dev/null
+++ b/config/metrics/counts_28d/20210216174956_i_analytics_cohorts_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.analytics.i_analytics_cohorts_monthly
+description:
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
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
new file mode 100644
index 00000000000..77b6068fb8d
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175000_i_analytics_dev_ops_score_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.analytics.i_analytics_dev_ops_score_monthly
+description:
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175004_g_analytics_merge_request_monthly.yml b/config/metrics/counts_28d/20210216175004_g_analytics_merge_request_monthly.yml
new file mode 100644
index 00000000000..d7af387f862
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175004_g_analytics_merge_request_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.analytics.g_analytics_merge_request_monthly
+description:
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175008_p_analytics_merge_request_monthly.yml b/config/metrics/counts_28d/20210216175008_p_analytics_merge_request_monthly.yml
new file mode 100644
index 00000000000..f3f7da5ee38
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175008_p_analytics_merge_request_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.analytics.p_analytics_merge_request_monthly
+description:
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175012_i_analytics_instance_statistics_monthly.yml b/config/metrics/counts_28d/20210216175012_i_analytics_instance_statistics_monthly.yml
new file mode 100644
index 00000000000..d7071bf4a79
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175012_i_analytics_instance_statistics_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.analytics.i_analytics_instance_statistics_monthly
+description:
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175016_analytics_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216175016_analytics_total_unique_counts_monthly.yml
new file mode 100644
index 00000000000..d173a922f5d
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175016_analytics_total_unique_counts_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.analytics.analytics_total_unique_counts_monthly
+description:
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175055_merge_requests.yml b/config/metrics/counts_28d/20210216175055_merge_requests.yml
new file mode 100644
index 00000000000..048ea4fd917
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175055_merge_requests.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.merge_requests
+description:
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175057_projects_with_disable_overriding_approvers_per_merge_request.yml b/config/metrics/counts_28d/20210216175057_projects_with_disable_overriding_approvers_per_merge_request.yml
new file mode 100644
index 00000000000..7e9186a3a82
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175057_projects_with_disable_overriding_approvers_per_merge_request.yml
@@ -0,0 +1,17 @@
+---
+key_path: usage_activity_by_stage_monthly.create.projects_with_disable_overriding_approvers_per_merge_request
+description:
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175059_projects_without_disable_overriding_approvers_per_merge_request.yml b/config/metrics/counts_28d/20210216175059_projects_without_disable_overriding_approvers_per_merge_request.yml
new file mode 100644
index 00000000000..56107e921f2
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175059_projects_without_disable_overriding_approvers_per_merge_request.yml
@@ -0,0 +1,17 @@
+---
+key_path: usage_activity_by_stage_monthly.create.projects_without_disable_overriding_approvers_per_merge_request
+description:
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175101_merge_requests_users.yml b/config/metrics/counts_28d/20210216175101_merge_requests_users.yml
new file mode 100644
index 00000000000..563a56c2a0f
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175101_merge_requests_users.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.merge_requests_users
+description:
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175109_suggestions.yml b/config/metrics/counts_28d/20210216175109_suggestions.yml
new file mode 100644
index 00000000000..74e388fd07d
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175109_suggestions.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.suggestions
+description:
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175113_merge_request_action_monthly.yml b/config/metrics/counts_28d/20210216175113_merge_request_action_monthly.yml
new file mode 100644
index 00000000000..de3049f76fa
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175113_merge_request_action_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.source_code.merge_request_action_monthly
+description:
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175117_i_source_code_code_intelligence_monthly.yml b/config/metrics/counts_28d/20210216175117_i_source_code_code_intelligence_monthly.yml
new file mode 100644
index 00000000000..4f409dbf8c5
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175117_i_source_code_code_intelligence_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.source_code.i_source_code_code_intelligence_monthly
+description:
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175120_i_code_review_mr_diffs_monthly.yml b/config/metrics/counts_28d/20210216175120_i_code_review_mr_diffs_monthly.yml
new file mode 100644
index 00000000000..a23aed69c72
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175120_i_code_review_mr_diffs_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_mr_diffs_monthly
+description: Count of unique merge requests per week|month with diffs viewed
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175124_i_code_review_user_single_file_diffs_monthly.yml b/config/metrics/counts_28d/20210216175124_i_code_review_user_single_file_diffs_monthly.yml
new file mode 100644
index 00000000000..dd315b5634d
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175124_i_code_review_user_single_file_diffs_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_single_file_diffs_monthly
+description: Count of unique users per week|month with diffs viewed file by file
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175128_i_code_review_mr_single_file_diffs_monthly.yml b/config/metrics/counts_28d/20210216175128_i_code_review_mr_single_file_diffs_monthly.yml
new file mode 100644
index 00000000000..82d1c86d146
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175128_i_code_review_mr_single_file_diffs_monthly.yml
@@ -0,0 +1,17 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_mr_single_file_diffs_monthly
+description: Count of unique merge requests per week|month with diffs viewed file
+ by file
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175132_i_code_review_user_create_mr_monthly.yml b/config/metrics/counts_28d/20210216175132_i_code_review_user_create_mr_monthly.yml
new file mode 100644
index 00000000000..28d4477c037
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175132_i_code_review_user_create_mr_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_create_mr_monthly
+description: Count of unique users per week|month who created a MR
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175136_i_code_review_user_close_mr_monthly.yml b/config/metrics/counts_28d/20210216175136_i_code_review_user_close_mr_monthly.yml
new file mode 100644
index 00000000000..c73a5da2585
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175136_i_code_review_user_close_mr_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_close_mr_monthly
+description: Count of unique users per week|month who closed a MR
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175140_i_code_review_user_reopen_mr_monthly.yml b/config/metrics/counts_28d/20210216175140_i_code_review_user_reopen_mr_monthly.yml
new file mode 100644
index 00000000000..173ff6a995e
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175140_i_code_review_user_reopen_mr_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_reopen_mr_monthly
+description: Count of unique users per week|month who reopened a MR
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175144_i_code_review_user_merge_mr_monthly.yml b/config/metrics/counts_28d/20210216175144_i_code_review_user_merge_mr_monthly.yml
new file mode 100644
index 00000000000..0c126afeb64
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175144_i_code_review_user_merge_mr_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_merge_mr_monthly
+description: Count of unique users per week|month who merged a MR
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175148_i_code_review_user_create_mr_comment_monthly.yml b/config/metrics/counts_28d/20210216175148_i_code_review_user_create_mr_comment_monthly.yml
new file mode 100644
index 00000000000..1c3801e77bc
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175148_i_code_review_user_create_mr_comment_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_create_mr_comment_monthly
+description: Count of unique users per week|month who commented on a MR
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175152_i_code_review_user_edit_mr_comment_monthly.yml b/config/metrics/counts_28d/20210216175152_i_code_review_user_edit_mr_comment_monthly.yml
new file mode 100644
index 00000000000..5a0bf9346a0
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175152_i_code_review_user_edit_mr_comment_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_edit_mr_comment_monthly
+description: Count of unique users per week|month who edited a comment on a MR
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175156_i_code_review_user_remove_mr_comment_monthly.yml b/config/metrics/counts_28d/20210216175156_i_code_review_user_remove_mr_comment_monthly.yml
new file mode 100644
index 00000000000..9e8f191d7e5
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175156_i_code_review_user_remove_mr_comment_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_remove_mr_comment_monthly
+description: Count of unique users per week|month who removed a comment on a MR
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175159_i_code_review_user_add_suggestion_monthly.yml b/config/metrics/counts_28d/20210216175159_i_code_review_user_add_suggestion_monthly.yml
new file mode 100644
index 00000000000..9b3c359b6f0
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175159_i_code_review_user_add_suggestion_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_add_suggestion_monthly
+description: Count of unique users per month who added a suggestion
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175203_i_code_review_user_apply_suggestion_monthly.yml b/config/metrics/counts_28d/20210216175203_i_code_review_user_apply_suggestion_monthly.yml
new file mode 100644
index 00000000000..be38418982d
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175203_i_code_review_user_apply_suggestion_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_apply_suggestion_monthly
+description: Count of unique users per month who applied a suggestion
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175405_clusters_applications_cert_managers.yml b/config/metrics/counts_28d/20210216175405_clusters_applications_cert_managers.yml
new file mode 100644
index 00000000000..43f967d5e92
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175405_clusters_applications_cert_managers.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.configure.clusters_applications_cert_managers
+description: Total GitLab Managed clusters with Cert Manager enabled
+product_section: ops
+product_stage: configure
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175407_clusters_applications_helm.yml b/config/metrics/counts_28d/20210216175407_clusters_applications_helm.yml
new file mode 100644
index 00000000000..5aeea54a4a8
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175407_clusters_applications_helm.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.configure.clusters_applications_helm
+description: Total GitLab Managed clusters with Helm enabled
+product_section: ops
+product_stage: configure
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175409_clusters_applications_ingress.yml b/config/metrics/counts_28d/20210216175409_clusters_applications_ingress.yml
new file mode 100644
index 00000000000..9d2da437f7a
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175409_clusters_applications_ingress.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.configure.clusters_applications_ingress
+description: Total GitLab Managed clusters with Ingress enabled
+product_section: ops
+product_stage: configure
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175411_clusters_applications_knative.yml b/config/metrics/counts_28d/20210216175411_clusters_applications_knative.yml
new file mode 100644
index 00000000000..6a1bfaf23d9
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175411_clusters_applications_knative.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.configure.clusters_applications_knative
+description: Total GitLab Managed clusters with Knative enabled
+product_section: ops
+product_stage: configure
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175413_clusters_management_project.yml b/config/metrics/counts_28d/20210216175413_clusters_management_project.yml
new file mode 100644
index 00000000000..6763750f777
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175413_clusters_management_project.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.configure.clusters_management_project
+description: Total GitLab Managed clusters with defined cluster management project
+product_section: ops
+product_stage: configure
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175415_clusters_disabled.yml b/config/metrics/counts_28d/20210216175415_clusters_disabled.yml
new file mode 100644
index 00000000000..cd23c062279
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175415_clusters_disabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.configure.clusters_disabled
+description: Total GitLab Managed disabled clusters
+product_section: ops
+product_stage: configure
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175417_clusters_enabled.yml b/config/metrics/counts_28d/20210216175417_clusters_enabled.yml
new file mode 100644
index 00000000000..559067cb044
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175417_clusters_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.configure.clusters_enabled
+description: Total GitLab Managed clusters currently enabled
+product_section: ops
+product_stage: configure
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175419_clusters_platforms_gke.yml b/config/metrics/counts_28d/20210216175419_clusters_platforms_gke.yml
new file mode 100644
index 00000000000..a4b3eafb813
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175419_clusters_platforms_gke.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.configure.clusters_platforms_gke
+description: Total GitLab Managed clusters provisioned with GitLab on GCE GKE
+product_section: ops
+product_stage: configure
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175420_clusters_platforms_eks.yml b/config/metrics/counts_28d/20210216175420_clusters_platforms_eks.yml
new file mode 100644
index 00000000000..c329736221f
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175420_clusters_platforms_eks.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.configure.clusters_platforms_eks
+description: Total GitLab Managed clusters provisioned with GitLab on AWS EKS
+product_section: ops
+product_stage: configure
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175422_clusters_platforms_user.yml b/config/metrics/counts_28d/20210216175422_clusters_platforms_user.yml
new file mode 100644
index 00000000000..c1ae40b9533
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175422_clusters_platforms_user.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.configure.clusters_platforms_user
+description: Total GitLab Managed clusters that are user provisioned
+product_section: ops
+product_stage: configure
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175424_instance_clusters_disabled.yml b/config/metrics/counts_28d/20210216175424_instance_clusters_disabled.yml
new file mode 100644
index 00000000000..b28301a9ff0
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175424_instance_clusters_disabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.configure.instance_clusters_disabled
+description: Total GitLab Managed disabled clusters attached to the instance
+product_section: ops
+product_stage: configure
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175426_instance_clusters_enabled.yml b/config/metrics/counts_28d/20210216175426_instance_clusters_enabled.yml
new file mode 100644
index 00000000000..182cbcdea07
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175426_instance_clusters_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.configure.instance_clusters_enabled
+description: Total GitLab Managed enabled clusters attached to the instance
+product_section: ops
+product_stage: configure
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175428_group_clusters_disabled.yml b/config/metrics/counts_28d/20210216175428_group_clusters_disabled.yml
new file mode 100644
index 00000000000..7dd10ffcc1a
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175428_group_clusters_disabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.configure.group_clusters_disabled
+description: Total GitLab Managed disabled clusters attached to groups
+product_section: ops
+product_stage: configure
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175430_group_clusters_enabled.yml b/config/metrics/counts_28d/20210216175430_group_clusters_enabled.yml
new file mode 100644
index 00000000000..b49046220a2
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175430_group_clusters_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.configure.group_clusters_enabled
+description: Total GitLab Managed enabled clusters attached to groups
+product_section: ops
+product_stage: configure
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175432_project_clusters_disabled.yml b/config/metrics/counts_28d/20210216175432_project_clusters_disabled.yml
new file mode 100644
index 00000000000..65cfbc57e82
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175432_project_clusters_disabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.configure.project_clusters_disabled
+description: Total GitLab Managed disabled clusters attached to projects
+product_section: ops
+product_stage: configure
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175434_project_clusters_enabled.yml b/config/metrics/counts_28d/20210216175434_project_clusters_enabled.yml
new file mode 100644
index 00000000000..dd17be3d69a
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175434_project_clusters_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.configure.project_clusters_enabled
+description: Total GitLab Managed enabled clusters attached to projects
+product_section: ops
+product_stage: configure
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175542_ci_builds.yml b/config/metrics/counts_28d/20210216175542_ci_builds.yml
new file mode 100644
index 00000000000..016d6c75cce
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175542_ci_builds.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.verify.ci_builds
+description: Unique builds in project
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175544_ci_external_pipelines.yml b/config/metrics/counts_28d/20210216175544_ci_external_pipelines.yml
new file mode 100644
index 00000000000..f67fb96b9ee
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175544_ci_external_pipelines.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.verify.ci_external_pipelines
+description: Total pipelines in external repositories
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175546_ci_internal_pipelines.yml b/config/metrics/counts_28d/20210216175546_ci_internal_pipelines.yml
new file mode 100644
index 00000000000..66456d42ffe
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175546_ci_internal_pipelines.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.verify.ci_internal_pipelines
+description: Total pipelines in GitLab repositories
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
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
new file mode 100644
index 00000000000..7720ca5d26a
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175548_ci_pipeline_config_auto_devops.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.verify.ci_pipeline_config_auto_devops
+description: Total pipelines from an Auto DevOps template
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175550_ci_pipeline_config_repository.yml b/config/metrics/counts_28d/20210216175550_ci_pipeline_config_repository.yml
new file mode 100644
index 00000000000..8c125a51f89
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175550_ci_pipeline_config_repository.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.verify.ci_pipeline_config_repository
+description: Total Pipelines from templates in repository
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175552_ci_pipeline_schedules.yml b/config/metrics/counts_28d/20210216175552_ci_pipeline_schedules.yml
new file mode 100644
index 00000000000..7464f28fc68
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175552_ci_pipeline_schedules.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.verify.ci_pipeline_schedules
+description: Pipeline schedules in GitLab
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175554_ci_pipelines.yml b/config/metrics/counts_28d/20210216175554_ci_pipelines.yml
new file mode 100644
index 00000000000..b818e52ecb5
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175554_ci_pipelines.yml
@@ -0,0 +1,17 @@
+---
+key_path: usage_activity_by_stage_monthly.verify.ci_pipelines
+description: " Distinct users triggering pipelines in a month"
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175556_ci_triggers.yml b/config/metrics/counts_28d/20210216175556_ci_triggers.yml
new file mode 100644
index 00000000000..f409434feb0
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175556_ci_triggers.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.verify.ci_triggers
+description: Total configured Triggers in project
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175616_user_dast_jobs.yml b/config/metrics/counts_28d/20210216175616_user_dast_jobs.yml
new file mode 100644
index 00000000000..a8b2cbc40dc
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175616_user_dast_jobs.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.secure.user_dast_jobs
+description: Users who run a DAST job
+product_section: sec
+product_stage: secure
+product_group: group::dynamic analysis
+product_category: dynamic_application_security_testing
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175618_dast_pipeline.yml b/config/metrics/counts_28d/20210216175618_dast_pipeline.yml
new file mode 100644
index 00000000000..f4a110f8ca4
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175618_dast_pipeline.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.secure.dast_pipeline
+description: Count of pipelines that have at least 1 DAST job
+product_section: sec
+product_stage: secure
+product_group: group::dynamic analysis
+product_category: dynamic_application_security_testing
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180308_personal_snippets.yml b/config/metrics/counts_28d/20210216180308_personal_snippets.yml
new file mode 100644
index 00000000000..691907be1d6
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180308_personal_snippets.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts_monthly.personal_snippets
+description: Monthly count of Personal Snippets
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: snippets
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180310_project_snippets.yml b/config/metrics/counts_28d/20210216180310_project_snippets.yml
new file mode 100644
index 00000000000..5703fb29678
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180310_project_snippets.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts_monthly.project_snippets
+description: Monthly count of Project Snippets
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: snippets
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180312_snippets.yml b/config/metrics/counts_28d/20210216180312_snippets.yml
new file mode 100644
index 00000000000..b132575dad7
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180312_snippets.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts_monthly.snippets
+description: Monthly count of All Snippets
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: snippets
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180317_snippets.yml b/config/metrics/counts_28d/20210216180317_snippets.yml
new file mode 100644
index 00000000000..fc2ba339313
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180317_snippets.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.create.snippets
+description: Monthly Snippets
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: snippets
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180319_action_monthly_active_users_web_ide_edit.yml b/config/metrics/counts_28d/20210216180319_action_monthly_active_users_web_ide_edit.yml
new file mode 100644
index 00000000000..3a7b7f71051
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180319_action_monthly_active_users_web_ide_edit.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_web_ide_edit
+description: Count unique edit actions using the web IDE
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: web_ide
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180321_action_monthly_active_users_sfe_edit.yml b/config/metrics/counts_28d/20210216180321_action_monthly_active_users_sfe_edit.yml
new file mode 100644
index 00000000000..6a0fd1da84c
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180321_action_monthly_active_users_sfe_edit.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_sfe_edit
+description: Count unique edit actions using the single file editor
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: web_ide
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180323_action_monthly_active_users_snippet_editor_edit.yml b/config/metrics/counts_28d/20210216180323_action_monthly_active_users_snippet_editor_edit.yml
new file mode 100644
index 00000000000..11ab783f52a
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180323_action_monthly_active_users_snippet_editor_edit.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_snippet_editor_edit
+description: Count unique edit actions using the snippet editor
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: web_ide
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180325_action_monthly_active_users_sse_edit.yml b/config/metrics/counts_28d/20210216180325_action_monthly_active_users_sse_edit.yml
new file mode 100644
index 00000000000..3d7c3cb4066
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180325_action_monthly_active_users_sse_edit.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_sse_edit
+description: Count unique edit actions using the static site editor
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: web_ide
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180327_action_monthly_active_users_ide_edit.yml b/config/metrics/counts_28d/20210216180327_action_monthly_active_users_ide_edit.yml
new file mode 100644
index 00000000000..e31bf71d455
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180327_action_monthly_active_users_ide_edit.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_ide_edit
+description: Count unique edit actions when users used an IDE, no matter which one
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: web_ide
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180330_g_edit_by_web_ide_monthly.yml b/config/metrics/counts_28d/20210216180330_g_edit_by_web_ide_monthly.yml
new file mode 100644
index 00000000000..f94ff9f026e
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180330_g_edit_by_web_ide_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ide_edit.g_edit_by_web_ide_monthly
+description:
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180334_g_edit_by_sfe_monthly.yml b/config/metrics/counts_28d/20210216180334_g_edit_by_sfe_monthly.yml
new file mode 100644
index 00000000000..fca08b9f093
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180334_g_edit_by_sfe_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ide_edit.g_edit_by_sfe_monthly
+description:
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180338_g_edit_by_snippet_ide_monthly.yml b/config/metrics/counts_28d/20210216180338_g_edit_by_snippet_ide_monthly.yml
new file mode 100644
index 00000000000..2cad76aa04c
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180338_g_edit_by_snippet_ide_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ide_edit.g_edit_by_snippet_ide_monthly
+description:
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180341_ide_edit_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216180341_ide_edit_total_unique_counts_monthly.yml
new file mode 100644
index 00000000000..aba5f8bc39a
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180341_ide_edit_total_unique_counts_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ide_edit.ide_edit_total_unique_counts_monthly
+description:
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180355_user_api_fuzzing_jobs.yml b/config/metrics/counts_28d/20210216180355_user_api_fuzzing_jobs.yml
new file mode 100644
index 00000000000..ce748ad1967
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180355_user_api_fuzzing_jobs.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.secure.user_api_fuzzing_jobs
+description: Count of API Fuzzing jobs by job name
+product_section: sec
+product_stage: secure
+product_group: group::fuzz testing
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180357_user_api_fuzzing_dnd_jobs.yml b/config/metrics/counts_28d/20210216180357_user_api_fuzzing_dnd_jobs.yml
new file mode 100644
index 00000000000..59dfb493448
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180357_user_api_fuzzing_dnd_jobs.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.secure.user_api_fuzzing_dnd_jobs
+description: Count of API Fuzzing `docker-in-docker` jobs by job names
+product_section: sec
+product_stage: secure
+product_group: group::fuzz testing
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180424_i_search_total_monthly.yml b/config/metrics/counts_28d/20210216180424_i_search_total_monthly.yml
new file mode 100644
index 00000000000..a50b42d1dba
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180424_i_search_total_monthly.yml
@@ -0,0 +1,18 @@
+---
+key_path: redis_hll_counters.search.i_search_total_monthly
+description: Calculated unique users to perform Basic or Advanced searches by month
+product_section: enablement
+product_stage: enablement
+product_group: group::global search
+product_category: global_search
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210216180431_search_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216180431_search_total_unique_counts_monthly.yml
new file mode 100644
index 00000000000..fe328b771f6
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180431_search_total_unique_counts_monthly.yml
@@ -0,0 +1,18 @@
+---
+key_path: redis_hll_counters.search.search_total_unique_counts_monthly
+description: Total unique users for i_search_total, i_search_advanced, i_search_paid for recent 28 days. This metric is redundant because advanced will be a subset of paid and paid will be a subset of total. i_search_total is more appropriate if you just want the total
+product_section: enablement
+product_stage: enablement
+product_group: group::global search
+product_category: global_search
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210216180509_incident_management_alerts_total_unique_counts.yml b/config/metrics/counts_28d/20210216180509_incident_management_alerts_total_unique_counts.yml
new file mode 100644
index 00000000000..23c3f0fcb3f
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180509_incident_management_alerts_total_unique_counts.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts_monthly.aggregated_metrics.incident_management_alerts_total_unique_counts
+description: Count of unique users per month to take an action on an alert
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180511_incident_management_incidents_total_unique_counts.yml b/config/metrics/counts_28d/20210216180511_incident_management_incidents_total_unique_counts.yml
new file mode 100644
index 00000000000..9d935a654e3
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180511_incident_management_incidents_total_unique_counts.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts_monthly.aggregated_metrics.incident_management_incidents_total_unique_counts
+description: Count of unique users per month to take an action on an incident
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180524_projects_with_incidents.yml b/config/metrics/counts_28d/20210216180524_projects_with_incidents.yml
new file mode 100644
index 00000000000..15ebaa81855
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180524_projects_with_incidents.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.monitor.projects_with_incidents
+description: 'Count of unique projects with an incident created in the last month'
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180526_projects_with_alert_incidents.yml b/config/metrics/counts_28d/20210216180526_projects_with_alert_incidents.yml
new file mode 100644
index 00000000000..3559638afb6
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180526_projects_with_alert_incidents.yml
@@ -0,0 +1,17 @@
+---
+key_path: usage_activity_by_stage_monthly.monitor.projects_with_alert_incidents
+description: 'Count of unique projects with an incident from an alert created in the
+ last month'
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180530_incident_management_alert_status_changed_monthly.yml b/config/metrics/counts_28d/20210216180530_incident_management_alert_status_changed_monthly.yml
new file mode 100644
index 00000000000..8100c8f6d86
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180530_incident_management_alert_status_changed_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.incident_management.incident_management_alert_status_changed_monthly
+description:
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180533_incident_management_alert_assigned_monthly.yml b/config/metrics/counts_28d/20210216180533_incident_management_alert_assigned_monthly.yml
new file mode 100644
index 00000000000..abd26612688
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180533_incident_management_alert_assigned_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.incident_management.incident_management_alert_assigned_monthly
+description:
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180537_incident_management_alert_todo_monthly.yml b/config/metrics/counts_28d/20210216180537_incident_management_alert_todo_monthly.yml
new file mode 100644
index 00000000000..a7f176028fa
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180537_incident_management_alert_todo_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.incident_management.incident_management_alert_todo_monthly
+description:
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180541_incident_management_incident_created_monthly.yml b/config/metrics/counts_28d/20210216180541_incident_management_incident_created_monthly.yml
new file mode 100644
index 00000000000..4a130cab39c
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180541_incident_management_incident_created_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.incident_management.incident_management_incident_created_monthly
+description:
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180545_incident_management_incident_reopened_monthly.yml b/config/metrics/counts_28d/20210216180545_incident_management_incident_reopened_monthly.yml
new file mode 100644
index 00000000000..5509c6b492f
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180545_incident_management_incident_reopened_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.incident_management.incident_management_incident_reopened_monthly
+description:
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180548_incident_management_incident_closed_monthly.yml b/config/metrics/counts_28d/20210216180548_incident_management_incident_closed_monthly.yml
new file mode 100644
index 00000000000..5475fc5c2b6
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180548_incident_management_incident_closed_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.incident_management.incident_management_incident_closed_monthly
+description:
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180552_incident_management_incident_assigned_monthly.yml b/config/metrics/counts_28d/20210216180552_incident_management_incident_assigned_monthly.yml
new file mode 100644
index 00000000000..74566b19180
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180552_incident_management_incident_assigned_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.incident_management.incident_management_incident_assigned_monthly
+description:
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180556_incident_management_incident_todo_monthly.yml b/config/metrics/counts_28d/20210216180556_incident_management_incident_todo_monthly.yml
new file mode 100644
index 00000000000..62614850622
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180556_incident_management_incident_todo_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.incident_management.incident_management_incident_todo_monthly
+description:
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180559_incident_management_incident_comment_monthly.yml b/config/metrics/counts_28d/20210216180559_incident_management_incident_comment_monthly.yml
new file mode 100644
index 00000000000..fe3e71ddea2
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180559_incident_management_incident_comment_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.incident_management.incident_management_incident_comment_monthly
+description:
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180607_incident_management_incident_published_monthly.yml b/config/metrics/counts_28d/20210216180607_incident_management_incident_published_monthly.yml
new file mode 100644
index 00000000000..3cd2c435074
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180607_incident_management_incident_published_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.incident_management.incident_management_incident_published_monthly
+description:
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180611_incident_management_incident_relate_monthly.yml b/config/metrics/counts_28d/20210216180611_incident_management_incident_relate_monthly.yml
new file mode 100644
index 00000000000..b8b765b5790
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180611_incident_management_incident_relate_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.incident_management.incident_management_incident_relate_monthly
+description:
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180614_incident_management_incident_unrelate_monthly.yml b/config/metrics/counts_28d/20210216180614_incident_management_incident_unrelate_monthly.yml
new file mode 100644
index 00000000000..e1a52b294fc
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180614_incident_management_incident_unrelate_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.incident_management.incident_management_incident_unrelate_monthly
+description:
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180618_incident_management_incident_change_confidential_monthly.yml b/config/metrics/counts_28d/20210216180618_incident_management_incident_change_confidential_monthly.yml
new file mode 100644
index 00000000000..04fe154338d
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180618_incident_management_incident_change_confidential_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.incident_management.incident_management_incident_change_confidential_monthly
+description:
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180622_incident_management_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216180622_incident_management_total_unique_counts_monthly.yml
new file mode 100644
index 00000000000..7cdeaa76e49
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180622_incident_management_total_unique_counts_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.incident_management.incident_management_total_unique_counts_monthly
+description:
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180625_incident_management_alert_create_incident_monthly.yml b/config/metrics/counts_28d/20210216180625_incident_management_alert_create_incident_monthly.yml
new file mode 100644
index 00000000000..9dd091b74ea
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180625_incident_management_alert_create_incident_monthly.yml
@@ -0,0 +1,17 @@
+---
+key_path: redis_hll_counters.incident_management_alerts.incident_management_alert_create_incident_monthly
+description: Count of unique users per month to create an incident corresponding to
+ an alert
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180731_projects_imported_from_github.yml b/config/metrics/counts_28d/20210216180731_projects_imported_from_github.yml
new file mode 100644
index 00000000000..93f07c24057
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180731_projects_imported_from_github.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.projects_imported_from_github
+description:
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180745_action_monthly_active_users_design_management.yml b/config/metrics/counts_28d/20210216180745_action_monthly_active_users_design_management.yml
new file mode 100644
index 00000000000..e4af1478c64
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180745_action_monthly_active_users_design_management.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_design_management
+description:
+product_section: dev
+product_stage: create
+product_group: group::knowledge
+product_category: design_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180747_action_monthly_active_users_wiki_repo.yml b/config/metrics/counts_28d/20210216180747_action_monthly_active_users_wiki_repo.yml
new file mode 100644
index 00000000000..125c1de4714
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180747_action_monthly_active_users_wiki_repo.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_wiki_repo
+description:
+product_section: dev
+product_stage: create
+product_group: group::knowledge
+product_category: wiki
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180814_events.yml b/config/metrics/counts_28d/20210216180814_events.yml
new file mode 100644
index 00000000000..a1d95f73716
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180814_events.yml
@@ -0,0 +1,17 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.events
+description:
+product_section: dev
+product_stage:
+product_group: group::manage
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180816_groups.yml b/config/metrics/counts_28d/20210216180816_groups.yml
new file mode 100644
index 00000000000..90723ed78ab
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180816_groups.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.groups
+description:
+product_section: dev
+product_stage:
+product_group: group::manage
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180818_users_created.yml b/config/metrics/counts_28d/20210216180818_users_created.yml
new file mode 100644
index 00000000000..81ed776a3c4
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180818_users_created.yml
@@ -0,0 +1,17 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.users_created
+description: Number of users created in the month
+product_section: dev
+product_stage:
+product_group: group::manage
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180820_ldap_keys.yml b/config/metrics/counts_28d/20210216180820_ldap_keys.yml
new file mode 100644
index 00000000000..0f64752fe96
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180820_ldap_keys.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.ldap_keys
+description:
+product_section: dev
+product_stage:
+product_group: group::manage
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180822_ldap_users.yml b/config/metrics/counts_28d/20210216180822_ldap_users.yml
new file mode 100644
index 00000000000..6145b32959f
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180822_ldap_users.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.ldap_users
+description:
+product_section: dev
+product_stage:
+product_group: group::manage
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180955_projects_with_prometheus_alerts.yml b/config/metrics/counts_28d/20210216180955_projects_with_prometheus_alerts.yml
new file mode 100644
index 00000000000..754da9e0006
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180955_projects_with_prometheus_alerts.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.configure.projects_with_prometheus_alerts
+description: Projects with Prometheus alerting enabled
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category: metrics
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180956_clusters.yml b/config/metrics/counts_28d/20210216180956_clusters.yml
new file mode 100644
index 00000000000..eb5d60f8a61
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180956_clusters.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.monitor.clusters
+description: Total GitLab Managed clusters both enabled and disabled
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category: metrics
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180958_clusters_applications_prometheus.yml b/config/metrics/counts_28d/20210216180958_clusters_applications_prometheus.yml
new file mode 100644
index 00000000000..97fb359c657
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180958_clusters_applications_prometheus.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.monitor.clusters_applications_prometheus
+description: Total GitLab Managed clusters with Prometheus enabled
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category: metrics
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181000_operations_dashboard_default_dashboard.yml b/config/metrics/counts_28d/20210216181000_operations_dashboard_default_dashboard.yml
new file mode 100644
index 00000000000..96d737d9d14
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181000_operations_dashboard_default_dashboard.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.monitor.operations_dashboard_default_dashboard
+description: Active users with enabled operations dashboard
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181002_projects_with_tracing_enabled.yml b/config/metrics/counts_28d/20210216181002_projects_with_tracing_enabled.yml
new file mode 100644
index 00000000000..6a559c1460f
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181002_projects_with_tracing_enabled.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.monitor.projects_with_tracing_enabled
+description: Projects with tracing enabled
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181004_projects_with_error_tracking_enabled.yml b/config/metrics/counts_28d/20210216181004_projects_with_error_tracking_enabled.yml
new file mode 100644
index 00000000000..caba12d3d44
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181004_projects_with_error_tracking_enabled.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.monitor.projects_with_error_tracking_enabled
+description:
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181006_operations_dashboard_users_with_projects_added.yml b/config/metrics/counts_28d/20210216181006_operations_dashboard_users_with_projects_added.yml
new file mode 100644
index 00000000000..2533117f03b
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181006_operations_dashboard_users_with_projects_added.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.monitor.operations_dashboard_users_with_projects_added
+description: Active users with projects on operations dashboard
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181050_packages.yml b/config/metrics/counts_28d/20210216181050_packages.yml
new file mode 100644
index 00000000000..4c6edc118aa
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181050_packages.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts_monthly.packages
+description: Monthly count of Packages
+product_section: ops
+product_stage:
+product_group: group::package
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181057_projects_with_packages.yml b/config/metrics/counts_28d/20210216181057_projects_with_packages.yml
new file mode 100644
index 00000000000..3fe9c7fde65
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181057_projects_with_packages.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.package.projects_with_packages
+description: Incident confidential status changed event
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181139_issues.yml b/config/metrics/counts_28d/20210216181139_issues.yml
new file mode 100644
index 00000000000..6412720342f
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181139_issues.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.plan.issues
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181141_notes.yml b/config/metrics/counts_28d/20210216181141_notes.yml
new file mode 100644
index 00000000000..d33a4c6ef9c
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181141_notes.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.plan.notes
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181143_projects.yml b/config/metrics/counts_28d/20210216181143_projects.yml
new file mode 100644
index 00000000000..36da5428dce
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181143_projects.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.plan.projects
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181145_todos.yml b/config/metrics/counts_28d/20210216181145_todos.yml
new file mode 100644
index 00000000000..224711942e8
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181145_todos.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.plan.todos
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181147_service_desk_enabled_projects.yml b/config/metrics/counts_28d/20210216181147_service_desk_enabled_projects.yml
new file mode 100644
index 00000000000..9532586e2fe
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181147_service_desk_enabled_projects.yml
@@ -0,0 +1,17 @@
+---
+key_path: usage_activity_by_stage_monthly.plan.service_desk_enabled_projects
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181148_service_desk_issues.yml b/config/metrics/counts_28d/20210216181148_service_desk_issues.yml
new file mode 100644
index 00000000000..fb8c998e3a1
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181148_service_desk_issues.yml
@@ -0,0 +1,17 @@
+---
+key_path: usage_activity_by_stage_monthly.plan.service_desk_issues
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181150_projects_jira_active.yml b/config/metrics/counts_28d/20210216181150_projects_jira_active.yml
new file mode 100644
index 00000000000..d7851c9a134
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181150_projects_jira_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.plan.projects_jira_active
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181152_projects_jira_dvcs_cloud_active.yml b/config/metrics/counts_28d/20210216181152_projects_jira_dvcs_cloud_active.yml
new file mode 100644
index 00000000000..2fc84e2cefd
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181152_projects_jira_dvcs_cloud_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.plan.projects_jira_dvcs_cloud_active
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181154_projects_jira_dvcs_server_active.yml b/config/metrics/counts_28d/20210216181154_projects_jira_dvcs_server_active.yml
new file mode 100644
index 00000000000..d341a41fc6e
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181154_projects_jira_dvcs_server_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.plan.projects_jira_dvcs_server_active
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181158_epics.yml b/config/metrics/counts_28d/20210216181158_epics.yml
new file mode 100644
index 00000000000..d0b71aa11d1
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181158_epics.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.plan.epics
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181200_label_lists.yml b/config/metrics/counts_28d/20210216181200_label_lists.yml
new file mode 100644
index 00000000000..1c2ad77bdbb
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181200_label_lists.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.plan.label_lists
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181201_milestone_lists.yml b/config/metrics/counts_28d/20210216181201_milestone_lists.yml
new file mode 100644
index 00000000000..8a83f9c8930
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181201_milestone_lists.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.plan.milestone_lists
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181304_g_project_management_issue_title_changed_monthly.yml b/config/metrics/counts_28d/20210216181304_g_project_management_issue_title_changed_monthly.yml
new file mode 100644
index 00000000000..f7216281bf3
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181304_g_project_management_issue_title_changed_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_title_changed_monthly
+description: Count of MAU editing an issue title
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181308_g_project_management_issue_description_changed_monthly.yml b/config/metrics/counts_28d/20210216181308_g_project_management_issue_description_changed_monthly.yml
new file mode 100644
index 00000000000..a5bc2a9dad6
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181308_g_project_management_issue_description_changed_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_description_changed_monthly
+description: Count of MAU editing an issue description
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181315_g_project_management_issue_made_confidential_monthly.yml b/config/metrics/counts_28d/20210216181315_g_project_management_issue_made_confidential_monthly.yml
new file mode 100644
index 00000000000..0f5ab506a14
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181315_g_project_management_issue_made_confidential_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_made_confidential_monthly
+description: Count of MAU making an issue confidential
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181319_g_project_management_issue_made_visible_monthly.yml b/config/metrics/counts_28d/20210216181319_g_project_management_issue_made_visible_monthly.yml
new file mode 100644
index 00000000000..21170e50629
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181319_g_project_management_issue_made_visible_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_made_visible_monthly
+description: Count of MAU making an issue not confidential
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181323_g_project_management_issue_created_monthly.yml b/config/metrics/counts_28d/20210216181323_g_project_management_issue_created_monthly.yml
new file mode 100644
index 00000000000..9236d49731d
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181323_g_project_management_issue_created_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_created_monthly
+description: Count of MAU creating new issues
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181326_g_project_management_issue_closed_monthly.yml b/config/metrics/counts_28d/20210216181326_g_project_management_issue_closed_monthly.yml
new file mode 100644
index 00000000000..01f3cadf87a
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181326_g_project_management_issue_closed_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_closed_monthly
+description: Count of MAU closing an issue
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181330_g_project_management_issue_reopened_monthly.yml b/config/metrics/counts_28d/20210216181330_g_project_management_issue_reopened_monthly.yml
new file mode 100644
index 00000000000..0234b46775b
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181330_g_project_management_issue_reopened_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_reopened_monthly
+description: Count of MAU re-opening a closed issue
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181334_g_project_management_issue_label_changed_monthly.yml b/config/metrics/counts_28d/20210216181334_g_project_management_issue_label_changed_monthly.yml
new file mode 100644
index 00000000000..d72fa3135bd
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181334_g_project_management_issue_label_changed_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_label_changed_monthly
+description: Count of MAU changing an issue's label
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181337_g_project_management_issue_milestone_changed_monthly.yml b/config/metrics/counts_28d/20210216181337_g_project_management_issue_milestone_changed_monthly.yml
new file mode 100644
index 00000000000..85e66885ef5
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181337_g_project_management_issue_milestone_changed_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_milestone_changed_monthly
+description: Count of MAU changing an issue's milestone
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181341_g_project_management_issue_iteration_changed_monthly.yml b/config/metrics/counts_28d/20210216181341_g_project_management_issue_iteration_changed_monthly.yml
new file mode 100644
index 00000000000..1a0600278a5
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181341_g_project_management_issue_iteration_changed_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_iteration_changed_monthly
+description: Count of MAU changing an issue's iteration
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181345_g_project_management_issue_weight_changed_monthly.yml b/config/metrics/counts_28d/20210216181345_g_project_management_issue_weight_changed_monthly.yml
new file mode 100644
index 00000000000..6d94de26e26
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181345_g_project_management_issue_weight_changed_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_weight_changed_monthly
+description: Count of MAU changing an issue's weight
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181348_g_project_management_issue_cross_referenced_monthly.yml b/config/metrics/counts_28d/20210216181348_g_project_management_issue_cross_referenced_monthly.yml
new file mode 100644
index 00000000000..1f28ae1b252
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181348_g_project_management_issue_cross_referenced_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_cross_referenced_monthly
+description: Count of MAU referencing an issue from somewhere else
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181352_g_project_management_issue_moved_monthly.yml b/config/metrics/counts_28d/20210216181352_g_project_management_issue_moved_monthly.yml
new file mode 100644
index 00000000000..a8e6e0e75a1
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181352_g_project_management_issue_moved_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_moved_monthly
+description: Count of MAU moving an issue to another project
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181356_g_project_management_issue_related_monthly.yml b/config/metrics/counts_28d/20210216181356_g_project_management_issue_related_monthly.yml
new file mode 100644
index 00000000000..89f74760440
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181356_g_project_management_issue_related_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_related_monthly
+description: Count of MAU relating an issue to another issue
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181400_g_project_management_issue_unrelated_monthly.yml b/config/metrics/counts_28d/20210216181400_g_project_management_issue_unrelated_monthly.yml
new file mode 100644
index 00000000000..6700f5d2763
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181400_g_project_management_issue_unrelated_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_unrelated_monthly
+description: Count of MAU unrelating an issue to another issue
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181403_g_project_management_issue_marked_as_duplicate_monthly.yml b/config/metrics/counts_28d/20210216181403_g_project_management_issue_marked_as_duplicate_monthly.yml
new file mode 100644
index 00000000000..2023d5900c1
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181403_g_project_management_issue_marked_as_duplicate_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_marked_as_duplicate_monthly
+description: Count of MAU marking an issue as a duplicate
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181407_g_project_management_issue_locked_monthly.yml b/config/metrics/counts_28d/20210216181407_g_project_management_issue_locked_monthly.yml
new file mode 100644
index 00000000000..41b7b6b1737
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181407_g_project_management_issue_locked_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_locked_monthly
+description: Count of MAU locking an issue
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181411_g_project_management_issue_unlocked_monthly.yml b/config/metrics/counts_28d/20210216181411_g_project_management_issue_unlocked_monthly.yml
new file mode 100644
index 00000000000..7be27b6fa65
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181411_g_project_management_issue_unlocked_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_unlocked_monthly
+description: Count of MAU marking an issue as blocked or blocked by
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181414_g_project_management_issue_added_to_epic_monthly.yml b/config/metrics/counts_28d/20210216181414_g_project_management_issue_added_to_epic_monthly.yml
new file mode 100644
index 00000000000..8a69fafc2b2
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181414_g_project_management_issue_added_to_epic_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_added_to_epic_monthly
+description: Count of MAU adding an issue to an epic
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181416_g_project_management_issue_removed_from_epic_monthly.yml b/config/metrics/counts_28d/20210216181416_g_project_management_issue_removed_from_epic_monthly.yml
new file mode 100644
index 00000000000..4ae21d8852e
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181416_g_project_management_issue_removed_from_epic_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_removed_from_epic_monthly
+description: Count of MAU removing an issue from an epic
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181420_g_project_management_issue_changed_epic_monthly.yml b/config/metrics/counts_28d/20210216181420_g_project_management_issue_changed_epic_monthly.yml
new file mode 100644
index 00000000000..a269681d4dd
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181420_g_project_management_issue_changed_epic_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_changed_epic_monthly
+description: Count of MAU changing the epic on an issue
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181424_g_project_management_issue_designs_added_monthly.yml b/config/metrics/counts_28d/20210216181424_g_project_management_issue_designs_added_monthly.yml
new file mode 100644
index 00000000000..29c0f3ef7d8
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181424_g_project_management_issue_designs_added_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_designs_added_monthly
+description: Count of MAU adding a design to an issue
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181427_g_project_management_issue_designs_modified_monthly.yml b/config/metrics/counts_28d/20210216181427_g_project_management_issue_designs_modified_monthly.yml
new file mode 100644
index 00000000000..30925229543
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181427_g_project_management_issue_designs_modified_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_designs_modified_monthly
+description: Count of MAU modifying a design on an issue
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181431_g_project_management_issue_designs_removed_monthly.yml b/config/metrics/counts_28d/20210216181431_g_project_management_issue_designs_removed_monthly.yml
new file mode 100644
index 00000000000..cd346847a02
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181431_g_project_management_issue_designs_removed_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_designs_removed_monthly
+description: Count of MAU removing a design from an issue
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181435_g_project_management_issue_due_date_changed_monthly.yml b/config/metrics/counts_28d/20210216181435_g_project_management_issue_due_date_changed_monthly.yml
new file mode 100644
index 00000000000..0b0a7dc3b8b
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181435_g_project_management_issue_due_date_changed_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_due_date_changed_monthly
+description: Count of MAU changing an issue due date
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181438_g_project_management_issue_time_estimate_changed_monthly.yml b/config/metrics/counts_28d/20210216181438_g_project_management_issue_time_estimate_changed_monthly.yml
new file mode 100644
index 00000000000..ee67b5db3c1
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181438_g_project_management_issue_time_estimate_changed_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_time_estimate_changed_monthly
+description: Count of MAU changing an issue time estimate
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181442_g_project_management_issue_time_spent_changed_monthly.yml b/config/metrics/counts_28d/20210216181442_g_project_management_issue_time_spent_changed_monthly.yml
new file mode 100644
index 00000000000..fa356f4e3d6
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181442_g_project_management_issue_time_spent_changed_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_time_spent_changed_monthly
+description: Count of MAU recording time spent on an issue
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181446_g_project_management_issue_comment_added_monthly.yml b/config/metrics/counts_28d/20210216181446_g_project_management_issue_comment_added_monthly.yml
new file mode 100644
index 00000000000..6c1d26be10f
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181446_g_project_management_issue_comment_added_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_comment_added_monthly
+description: Count of MAU commenting on an issue
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181450_g_project_management_issue_comment_edited_monthly.yml b/config/metrics/counts_28d/20210216181450_g_project_management_issue_comment_edited_monthly.yml
new file mode 100644
index 00000000000..390401de267
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181450_g_project_management_issue_comment_edited_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_comment_edited_monthly
+description: Count of MAU editing a comment on an issue
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181453_g_project_management_issue_comment_removed_monthly.yml b/config/metrics/counts_28d/20210216181453_g_project_management_issue_comment_removed_monthly.yml
new file mode 100644
index 00000000000..78f08de6f22
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181453_g_project_management_issue_comment_removed_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_comment_removed_monthly
+description: Count of MAU deleting a comment from an issue
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181457_g_project_management_issue_health_status_changed_monthly.yml b/config/metrics/counts_28d/20210216181457_g_project_management_issue_health_status_changed_monthly.yml
new file mode 100644
index 00000000000..c2c986ca5ef
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181457_g_project_management_issue_health_status_changed_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_health_status_changed_monthly
+description: Count of MAU changing the health status on an issue
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181501_g_project_management_issue_cloned_monthly.yml b/config/metrics/counts_28d/20210216181501_g_project_management_issue_cloned_monthly.yml
new file mode 100644
index 00000000000..5e2ddaa0ec3
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181501_g_project_management_issue_cloned_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_cloned_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181504_issues_edit_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216181504_issues_edit_total_unique_counts_monthly.yml
new file mode 100644
index 00000000000..cbb391035c3
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181504_issues_edit_total_unique_counts_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.issues_edit_total_unique_counts_monthly
+description: Count of MAU taking an action related to an issue
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181508_i_quickactions_approve_monthly.yml b/config/metrics/counts_28d/20210216181508_i_quickactions_approve_monthly.yml
new file mode 100644
index 00000000000..8115da08fd6
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181508_i_quickactions_approve_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_approve_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181512_i_quickactions_assign_single_monthly.yml b/config/metrics/counts_28d/20210216181512_i_quickactions_assign_single_monthly.yml
new file mode 100644
index 00000000000..ad94a07ca5b
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181512_i_quickactions_assign_single_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_assign_single_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181516_i_quickactions_assign_multiple_monthly.yml b/config/metrics/counts_28d/20210216181516_i_quickactions_assign_multiple_monthly.yml
new file mode 100644
index 00000000000..8db1e881bd4
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181516_i_quickactions_assign_multiple_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_assign_multiple_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181519_i_quickactions_assign_self_monthly.yml b/config/metrics/counts_28d/20210216181519_i_quickactions_assign_self_monthly.yml
new file mode 100644
index 00000000000..378a22daa87
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181519_i_quickactions_assign_self_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_assign_self_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181523_i_quickactions_assign_reviewer_monthly.yml b/config/metrics/counts_28d/20210216181523_i_quickactions_assign_reviewer_monthly.yml
new file mode 100644
index 00000000000..39142f74dc1
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181523_i_quickactions_assign_reviewer_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_assign_reviewer_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181527_i_quickactions_award_monthly.yml b/config/metrics/counts_28d/20210216181527_i_quickactions_award_monthly.yml
new file mode 100644
index 00000000000..7d728bbc794
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181527_i_quickactions_award_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_award_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181530_i_quickactions_board_move_monthly.yml b/config/metrics/counts_28d/20210216181530_i_quickactions_board_move_monthly.yml
new file mode 100644
index 00000000000..141ba7237d8
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181530_i_quickactions_board_move_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_board_move_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181534_i_quickactions_child_epic_monthly.yml b/config/metrics/counts_28d/20210216181534_i_quickactions_child_epic_monthly.yml
new file mode 100644
index 00000000000..5adcb8b0f27
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181534_i_quickactions_child_epic_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_child_epic_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181538_i_quickactions_clear_weight_monthly.yml b/config/metrics/counts_28d/20210216181538_i_quickactions_clear_weight_monthly.yml
new file mode 100644
index 00000000000..a13f3d322ff
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181538_i_quickactions_clear_weight_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_clear_weight_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181541_i_quickactions_clone_monthly.yml b/config/metrics/counts_28d/20210216181541_i_quickactions_clone_monthly.yml
new file mode 100644
index 00000000000..ca22455151e
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181541_i_quickactions_clone_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_clone_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181545_i_quickactions_close_monthly.yml b/config/metrics/counts_28d/20210216181545_i_quickactions_close_monthly.yml
new file mode 100644
index 00000000000..c10b3fe8107
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181545_i_quickactions_close_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_close_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181549_i_quickactions_confidential_monthly.yml b/config/metrics/counts_28d/20210216181549_i_quickactions_confidential_monthly.yml
new file mode 100644
index 00000000000..d3bc2162c89
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181549_i_quickactions_confidential_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_confidential_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181553_i_quickactions_copy_metadata_merge_request_monthly.yml b/config/metrics/counts_28d/20210216181553_i_quickactions_copy_metadata_merge_request_monthly.yml
new file mode 100644
index 00000000000..a2d6b975753
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181553_i_quickactions_copy_metadata_merge_request_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_copy_metadata_merge_request_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181556_i_quickactions_copy_metadata_issue_monthly.yml b/config/metrics/counts_28d/20210216181556_i_quickactions_copy_metadata_issue_monthly.yml
new file mode 100644
index 00000000000..23adb6a769c
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181556_i_quickactions_copy_metadata_issue_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_copy_metadata_issue_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181600_i_quickactions_create_merge_request_monthly.yml b/config/metrics/counts_28d/20210216181600_i_quickactions_create_merge_request_monthly.yml
new file mode 100644
index 00000000000..43b4cff5c11
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181600_i_quickactions_create_merge_request_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_create_merge_request_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181604_i_quickactions_done_monthly.yml b/config/metrics/counts_28d/20210216181604_i_quickactions_done_monthly.yml
new file mode 100644
index 00000000000..b7ac9de7655
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181604_i_quickactions_done_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_done_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181607_i_quickactions_draft_monthly.yml b/config/metrics/counts_28d/20210216181607_i_quickactions_draft_monthly.yml
new file mode 100644
index 00000000000..4d88092cd72
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181607_i_quickactions_draft_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_draft_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181611_i_quickactions_due_monthly.yml b/config/metrics/counts_28d/20210216181611_i_quickactions_due_monthly.yml
new file mode 100644
index 00000000000..0fd293e1bb9
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181611_i_quickactions_due_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_due_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181615_i_quickactions_duplicate_monthly.yml b/config/metrics/counts_28d/20210216181615_i_quickactions_duplicate_monthly.yml
new file mode 100644
index 00000000000..1d5750e5b43
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181615_i_quickactions_duplicate_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_duplicate_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181618_i_quickactions_epic_monthly.yml b/config/metrics/counts_28d/20210216181618_i_quickactions_epic_monthly.yml
new file mode 100644
index 00000000000..0b448b0d3a1
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181618_i_quickactions_epic_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_epic_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181622_i_quickactions_estimate_monthly.yml b/config/metrics/counts_28d/20210216181622_i_quickactions_estimate_monthly.yml
new file mode 100644
index 00000000000..b509c7ed358
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181622_i_quickactions_estimate_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_estimate_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181626_i_quickactions_iteration_monthly.yml b/config/metrics/counts_28d/20210216181626_i_quickactions_iteration_monthly.yml
new file mode 100644
index 00000000000..5759c131771
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181626_i_quickactions_iteration_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_iteration_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181629_i_quickactions_label_monthly.yml b/config/metrics/counts_28d/20210216181629_i_quickactions_label_monthly.yml
new file mode 100644
index 00000000000..52d99012a45
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181629_i_quickactions_label_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_label_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181633_i_quickactions_lock_monthly.yml b/config/metrics/counts_28d/20210216181633_i_quickactions_lock_monthly.yml
new file mode 100644
index 00000000000..552748c4f2c
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181633_i_quickactions_lock_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_lock_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181637_i_quickactions_merge_monthly.yml b/config/metrics/counts_28d/20210216181637_i_quickactions_merge_monthly.yml
new file mode 100644
index 00000000000..71488207321
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181637_i_quickactions_merge_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_merge_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181641_i_quickactions_milestone_monthly.yml b/config/metrics/counts_28d/20210216181641_i_quickactions_milestone_monthly.yml
new file mode 100644
index 00000000000..65a466c4bf9
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181641_i_quickactions_milestone_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_milestone_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181644_i_quickactions_move_monthly.yml b/config/metrics/counts_28d/20210216181644_i_quickactions_move_monthly.yml
new file mode 100644
index 00000000000..df657e463ba
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181644_i_quickactions_move_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_move_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181648_i_quickactions_parent_epic_monthly.yml b/config/metrics/counts_28d/20210216181648_i_quickactions_parent_epic_monthly.yml
new file mode 100644
index 00000000000..2dbd62415f2
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181648_i_quickactions_parent_epic_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_parent_epic_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181652_i_quickactions_promote_monthly.yml b/config/metrics/counts_28d/20210216181652_i_quickactions_promote_monthly.yml
new file mode 100644
index 00000000000..b4fe23e7d95
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181652_i_quickactions_promote_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_promote_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181655_i_quickactions_publish_monthly.yml b/config/metrics/counts_28d/20210216181655_i_quickactions_publish_monthly.yml
new file mode 100644
index 00000000000..c4d79fc2e11
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181655_i_quickactions_publish_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_publish_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181659_i_quickactions_reassign_monthly.yml b/config/metrics/counts_28d/20210216181659_i_quickactions_reassign_monthly.yml
new file mode 100644
index 00000000000..1043901a415
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181659_i_quickactions_reassign_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_reassign_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181703_i_quickactions_reassign_reviewer_monthly.yml b/config/metrics/counts_28d/20210216181703_i_quickactions_reassign_reviewer_monthly.yml
new file mode 100644
index 00000000000..23041ca9a37
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181703_i_quickactions_reassign_reviewer_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_reassign_reviewer_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181707_i_quickactions_rebase_monthly.yml b/config/metrics/counts_28d/20210216181707_i_quickactions_rebase_monthly.yml
new file mode 100644
index 00000000000..fcdf21bf28e
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181707_i_quickactions_rebase_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_rebase_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181710_i_quickactions_relabel_monthly.yml b/config/metrics/counts_28d/20210216181710_i_quickactions_relabel_monthly.yml
new file mode 100644
index 00000000000..f285b5fc3f6
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181710_i_quickactions_relabel_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_relabel_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181714_i_quickactions_relate_monthly.yml b/config/metrics/counts_28d/20210216181714_i_quickactions_relate_monthly.yml
new file mode 100644
index 00000000000..afc8fc3e800
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181714_i_quickactions_relate_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_relate_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181718_i_quickactions_remove_child_epic_monthly.yml b/config/metrics/counts_28d/20210216181718_i_quickactions_remove_child_epic_monthly.yml
new file mode 100644
index 00000000000..ad161fd2516
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181718_i_quickactions_remove_child_epic_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_remove_child_epic_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181721_i_quickactions_remove_due_date_monthly.yml b/config/metrics/counts_28d/20210216181721_i_quickactions_remove_due_date_monthly.yml
new file mode 100644
index 00000000000..5a75d6b7a24
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181721_i_quickactions_remove_due_date_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_remove_due_date_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181725_i_quickactions_remove_epic_monthly.yml b/config/metrics/counts_28d/20210216181725_i_quickactions_remove_epic_monthly.yml
new file mode 100644
index 00000000000..377f5e63c9b
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181725_i_quickactions_remove_epic_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_remove_epic_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181729_i_quickactions_remove_estimate_monthly.yml b/config/metrics/counts_28d/20210216181729_i_quickactions_remove_estimate_monthly.yml
new file mode 100644
index 00000000000..6b3ff3b44e4
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181729_i_quickactions_remove_estimate_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_remove_estimate_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181732_i_quickactions_remove_iteration_monthly.yml b/config/metrics/counts_28d/20210216181732_i_quickactions_remove_iteration_monthly.yml
new file mode 100644
index 00000000000..073539710e3
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181732_i_quickactions_remove_iteration_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_remove_iteration_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181736_i_quickactions_remove_milestone_monthly.yml b/config/metrics/counts_28d/20210216181736_i_quickactions_remove_milestone_monthly.yml
new file mode 100644
index 00000000000..2ee78d245f9
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181736_i_quickactions_remove_milestone_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_remove_milestone_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181740_i_quickactions_remove_parent_epic_monthly.yml b/config/metrics/counts_28d/20210216181740_i_quickactions_remove_parent_epic_monthly.yml
new file mode 100644
index 00000000000..fffcbc6807d
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181740_i_quickactions_remove_parent_epic_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_remove_parent_epic_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181744_i_quickactions_remove_time_spent_monthly.yml b/config/metrics/counts_28d/20210216181744_i_quickactions_remove_time_spent_monthly.yml
new file mode 100644
index 00000000000..3ecaaa970f0
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181744_i_quickactions_remove_time_spent_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_remove_time_spent_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181747_i_quickactions_remove_zoom_monthly.yml b/config/metrics/counts_28d/20210216181747_i_quickactions_remove_zoom_monthly.yml
new file mode 100644
index 00000000000..bb42563e34c
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181747_i_quickactions_remove_zoom_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_remove_zoom_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181751_i_quickactions_reopen_monthly.yml b/config/metrics/counts_28d/20210216181751_i_quickactions_reopen_monthly.yml
new file mode 100644
index 00000000000..eea7e3672ea
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181751_i_quickactions_reopen_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_reopen_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181755_i_quickactions_shrug_monthly.yml b/config/metrics/counts_28d/20210216181755_i_quickactions_shrug_monthly.yml
new file mode 100644
index 00000000000..302cad17efd
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181755_i_quickactions_shrug_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_shrug_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181758_i_quickactions_spend_subtract_monthly.yml b/config/metrics/counts_28d/20210216181758_i_quickactions_spend_subtract_monthly.yml
new file mode 100644
index 00000000000..01d87e2e8fb
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181758_i_quickactions_spend_subtract_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_spend_subtract_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181802_i_quickactions_spend_add_monthly.yml b/config/metrics/counts_28d/20210216181802_i_quickactions_spend_add_monthly.yml
new file mode 100644
index 00000000000..e80f988cf7a
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181802_i_quickactions_spend_add_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_spend_add_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181806_i_quickactions_submit_review_monthly.yml b/config/metrics/counts_28d/20210216181806_i_quickactions_submit_review_monthly.yml
new file mode 100644
index 00000000000..61077b79a6f
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181806_i_quickactions_submit_review_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_submit_review_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181809_i_quickactions_subscribe_monthly.yml b/config/metrics/counts_28d/20210216181809_i_quickactions_subscribe_monthly.yml
new file mode 100644
index 00000000000..20934358839
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181809_i_quickactions_subscribe_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_subscribe_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181813_i_quickactions_tableflip_monthly.yml b/config/metrics/counts_28d/20210216181813_i_quickactions_tableflip_monthly.yml
new file mode 100644
index 00000000000..a390fb11746
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181813_i_quickactions_tableflip_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_tableflip_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181817_i_quickactions_tag_monthly.yml b/config/metrics/counts_28d/20210216181817_i_quickactions_tag_monthly.yml
new file mode 100644
index 00000000000..f8f078f5f27
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181817_i_quickactions_tag_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_tag_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181821_i_quickactions_target_branch_monthly.yml b/config/metrics/counts_28d/20210216181821_i_quickactions_target_branch_monthly.yml
new file mode 100644
index 00000000000..dd730656292
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181821_i_quickactions_target_branch_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_target_branch_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181824_i_quickactions_title_monthly.yml b/config/metrics/counts_28d/20210216181824_i_quickactions_title_monthly.yml
new file mode 100644
index 00000000000..ea3e2179ba6
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181824_i_quickactions_title_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_title_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181828_i_quickactions_todo_monthly.yml b/config/metrics/counts_28d/20210216181828_i_quickactions_todo_monthly.yml
new file mode 100644
index 00000000000..f50c85bcb2d
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181828_i_quickactions_todo_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_todo_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181832_i_quickactions_unassign_specific_monthly.yml b/config/metrics/counts_28d/20210216181832_i_quickactions_unassign_specific_monthly.yml
new file mode 100644
index 00000000000..c17a807aaee
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181832_i_quickactions_unassign_specific_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_unassign_specific_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181835_i_quickactions_unassign_all_monthly.yml b/config/metrics/counts_28d/20210216181835_i_quickactions_unassign_all_monthly.yml
new file mode 100644
index 00000000000..294dd992bf0
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181835_i_quickactions_unassign_all_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_unassign_all_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181839_i_quickactions_unassign_reviewer_monthly.yml b/config/metrics/counts_28d/20210216181839_i_quickactions_unassign_reviewer_monthly.yml
new file mode 100644
index 00000000000..a264457a478
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181839_i_quickactions_unassign_reviewer_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_unassign_reviewer_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181843_i_quickactions_unlabel_specific_monthly.yml b/config/metrics/counts_28d/20210216181843_i_quickactions_unlabel_specific_monthly.yml
new file mode 100644
index 00000000000..c4c9dc56cfd
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181843_i_quickactions_unlabel_specific_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_unlabel_specific_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181846_i_quickactions_unlabel_all_monthly.yml b/config/metrics/counts_28d/20210216181846_i_quickactions_unlabel_all_monthly.yml
new file mode 100644
index 00000000000..45c44218cbd
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181846_i_quickactions_unlabel_all_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_unlabel_all_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181850_i_quickactions_unlock_monthly.yml b/config/metrics/counts_28d/20210216181850_i_quickactions_unlock_monthly.yml
new file mode 100644
index 00000000000..b9edfa92c20
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181850_i_quickactions_unlock_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_unlock_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181854_i_quickactions_unsubscribe_monthly.yml b/config/metrics/counts_28d/20210216181854_i_quickactions_unsubscribe_monthly.yml
new file mode 100644
index 00000000000..d54e8a4ab85
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181854_i_quickactions_unsubscribe_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_unsubscribe_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181857_i_quickactions_weight_monthly.yml b/config/metrics/counts_28d/20210216181857_i_quickactions_weight_monthly.yml
new file mode 100644
index 00000000000..68caac40ead
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181857_i_quickactions_weight_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_weight_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181901_i_quickactions_wip_monthly.yml b/config/metrics/counts_28d/20210216181901_i_quickactions_wip_monthly.yml
new file mode 100644
index 00000000000..419af8a68ee
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181901_i_quickactions_wip_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_wip_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181905_i_quickactions_zoom_monthly.yml b/config/metrics/counts_28d/20210216181905_i_quickactions_zoom_monthly.yml
new file mode 100644
index 00000000000..0af363b6429
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181905_i_quickactions_zoom_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_zoom_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181923_successful_deployments.yml b/config/metrics/counts_28d/20210216181923_successful_deployments.yml
new file mode 100644
index 00000000000..76464e5dd27
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181923_successful_deployments.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts_monthly.successful_deployments
+description: Total successful deployments
+product_section: ops
+product_stage:
+product_group: group::release
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181924_failed_deployments.yml b/config/metrics/counts_28d/20210216181924_failed_deployments.yml
new file mode 100644
index 00000000000..e1d7f0b9762
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181924_failed_deployments.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts_monthly.failed_deployments
+description: Total failed deployments
+product_section: ops
+product_stage:
+product_group: group::release
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181935_deployments.yml b/config/metrics/counts_28d/20210216181935_deployments.yml
new file mode 100644
index 00000000000..e8a4ee547e8
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181935_deployments.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.release.deployments
+description: Unique users triggering deployments
+product_section: ops
+product_stage:
+product_group: group::release
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181937_failed_deployments.yml b/config/metrics/counts_28d/20210216181937_failed_deployments.yml
new file mode 100644
index 00000000000..2a14b42d03d
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181937_failed_deployments.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.release.failed_deployments
+description: Total failed deployments
+product_section: ops
+product_stage:
+product_group: group::release
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181939_releases.yml b/config/metrics/counts_28d/20210216181939_releases.yml
new file mode 100644
index 00000000000..bd76a32c973
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181939_releases.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.release.releases
+description: Unique users creating release tags
+product_section: ops
+product_stage:
+product_group: group::release
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181941_successful_deployments.yml b/config/metrics/counts_28d/20210216181941_successful_deployments.yml
new file mode 100644
index 00000000000..b2052281d6e
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181941_successful_deployments.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.release.successful_deployments
+description: Total successful deployments
+product_section: ops
+product_stage:
+product_group: group::release
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181943_projects_mirrored_with_pipelines_enabled.yml b/config/metrics/counts_28d/20210216181943_projects_mirrored_with_pipelines_enabled.yml
new file mode 100644
index 00000000000..c05835b2100
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181943_projects_mirrored_with_pipelines_enabled.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.release.projects_mirrored_with_pipelines_enabled
+description: Projects with repository mirroring enabled
+product_section: ops
+product_stage:
+product_group: group::release
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181951_clusters_applications_runner.yml b/config/metrics/counts_28d/20210216181951_clusters_applications_runner.yml
new file mode 100644
index 00000000000..a4047f8eabe
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181951_clusters_applications_runner.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.verify.clusters_applications_runner
+description: Total GitLab Managed clusters with Runner enabled
+product_section: ops
+product_stage: verify
+product_group: group::runner
+product_category: runner
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181956_user_unique_users_all_secure_scanners.yml b/config/metrics/counts_28d/20210216181956_user_unique_users_all_secure_scanners.yml
new file mode 100644
index 00000000000..c676e83f2d9
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181956_user_unique_users_all_secure_scanners.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.secure.user_unique_users_all_secure_scanners
+description:
+product_section: sec
+product_stage:
+product_group: group::secure
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182034_deploy_keys.yml b/config/metrics/counts_28d/20210216182034_deploy_keys.yml
new file mode 100644
index 00000000000..80f50c7d1a5
--- /dev/null
+++ b/config/metrics/counts_28d/20210216182034_deploy_keys.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.deploy_keys
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182036_keys.yml b/config/metrics/counts_28d/20210216182036_keys.yml
new file mode 100644
index 00000000000..d1299065115
--- /dev/null
+++ b/config/metrics/counts_28d/20210216182036_keys.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.keys
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182038_remote_mirrors.yml b/config/metrics/counts_28d/20210216182038_remote_mirrors.yml
new file mode 100644
index 00000000000..6b42f18e664
--- /dev/null
+++ b/config/metrics/counts_28d/20210216182038_remote_mirrors.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.remote_mirrors
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182040_action_monthly_active_users_project_repo.yml b/config/metrics/counts_28d/20210216182040_action_monthly_active_users_project_repo.yml
new file mode 100644
index 00000000000..c75efaf0a80
--- /dev/null
+++ b/config/metrics/counts_28d/20210216182040_action_monthly_active_users_project_repo.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_project_repo
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182041_action_monthly_active_users_git_write.yml b/config/metrics/counts_28d/20210216182041_action_monthly_active_users_git_write.yml
new file mode 100644
index 00000000000..25405624b03
--- /dev/null
+++ b/config/metrics/counts_28d/20210216182041_action_monthly_active_users_git_write.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_git_write
+description: Aggregated value for wiki, design and project repo actions
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182043_projects_enforcing_code_owner_approval.yml b/config/metrics/counts_28d/20210216182043_projects_enforcing_code_owner_approval.yml
new file mode 100644
index 00000000000..c47fa49fe06
--- /dev/null
+++ b/config/metrics/counts_28d/20210216182043_projects_enforcing_code_owner_approval.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.projects_enforcing_code_owner_approval
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182045_projects_with_sectional_code_owner_rules.yml b/config/metrics/counts_28d/20210216182045_projects_with_sectional_code_owner_rules.yml
new file mode 100644
index 00000000000..dfacce63f05
--- /dev/null
+++ b/config/metrics/counts_28d/20210216182045_projects_with_sectional_code_owner_rules.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.projects_with_sectional_code_owner_rules
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182049_projects_with_repositories_enabled.yml b/config/metrics/counts_28d/20210216182049_projects_with_repositories_enabled.yml
new file mode 100644
index 00000000000..d87b910d239
--- /dev/null
+++ b/config/metrics/counts_28d/20210216182049_projects_with_repositories_enabled.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.projects_with_repositories_enabled
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182051_protected_branches.yml b/config/metrics/counts_28d/20210216182051_protected_branches.yml
new file mode 100644
index 00000000000..81d23653307
--- /dev/null
+++ b/config/metrics/counts_28d/20210216182051_protected_branches.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.protected_branches
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182102_wiki_action_monthly.yml b/config/metrics/counts_28d/20210216182102_wiki_action_monthly.yml
new file mode 100644
index 00000000000..af59d1a1235
--- /dev/null
+++ b/config/metrics/counts_28d/20210216182102_wiki_action_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.source_code.wiki_action_monthly
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182106_design_action_monthly.yml b/config/metrics/counts_28d/20210216182106_design_action_monthly.yml
new file mode 100644
index 00000000000..8feb369d0fa
--- /dev/null
+++ b/config/metrics/counts_28d/20210216182106_design_action_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.source_code.design_action_monthly
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182109_project_action_monthly.yml b/config/metrics/counts_28d/20210216182109_project_action_monthly.yml
new file mode 100644
index 00000000000..6047e6b6059
--- /dev/null
+++ b/config/metrics/counts_28d/20210216182109_project_action_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.source_code.project_action_monthly
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182125_user_sast_jobs.yml b/config/metrics/counts_28d/20210216182125_user_sast_jobs.yml
new file mode 100644
index 00000000000..629b346a6aa
--- /dev/null
+++ b/config/metrics/counts_28d/20210216182125_user_sast_jobs.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.secure.user_sast_jobs
+description: Users who run a SAST job
+product_section: sec
+product_stage: secure
+product_group: group::static analysis
+product_category: static_application_security_testing
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182127_user_secret_detection_jobs.yml b/config/metrics/counts_28d/20210216182127_user_secret_detection_jobs.yml
new file mode 100644
index 00000000000..0502b28213e
--- /dev/null
+++ b/config/metrics/counts_28d/20210216182127_user_secret_detection_jobs.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.secure.user_secret_detection_jobs
+description: Users who run a Secret Detection job
+product_section: sec
+product_stage: secure
+product_group: group::static analysis
+product_category: secret_detection
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182129_sast_pipeline.yml b/config/metrics/counts_28d/20210216182129_sast_pipeline.yml
new file mode 100644
index 00000000000..f655c4368ad
--- /dev/null
+++ b/config/metrics/counts_28d/20210216182129_sast_pipeline.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.secure.sast_pipeline
+description: Counts of Pipelines that have at least 1 SAST job
+product_section: sec
+product_stage: secure
+product_group: group::static analysis
+product_category: static_application_security_testing
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182131_secret_detection_pipeline.yml b/config/metrics/counts_28d/20210216182131_secret_detection_pipeline.yml
new file mode 100644
index 00000000000..14985c91f86
--- /dev/null
+++ b/config/metrics/counts_28d/20210216182131_secret_detection_pipeline.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.secure.secret_detection_pipeline
+description: Counts of Pipelines that have at least 1 Secret Detection job
+product_section: sec
+product_stage: secure
+product_group: group::static analysis
+product_category: secret_detection
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182136_i_testing_test_case_parsed_monthly.yml b/config/metrics/counts_28d/20210216182136_i_testing_test_case_parsed_monthly.yml
new file mode 100644
index 00000000000..15369757cb8
--- /dev/null
+++ b/config/metrics/counts_28d/20210216182136_i_testing_test_case_parsed_monthly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.testing.i_testing_test_case_parsed_monthly
+description: Internal Tracking to count number of unit tests parsed for planning of
+ future code testing features. Data available [here](https://app.periscopedata.com/app/gitlab/788674/Verify:Testing-Group-Metrics?widget=10454394&udv=0)
+product_section: ops
+product_stage: verify
+product_group: group::testing
+product_category: code_testing
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182200_i_testing_metrics_report_artifact_uploaders_monthly.yml b/config/metrics/counts_28d/20210216182200_i_testing_metrics_report_artifact_uploaders_monthly.yml
new file mode 100644
index 00000000000..1a475b19f01
--- /dev/null
+++ b/config/metrics/counts_28d/20210216182200_i_testing_metrics_report_artifact_uploaders_monthly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.testing.i_testing_metrics_report_artifact_uploaders_monthly
+description: Internal Tracking to count number of unit tests parsed for planning of
+ future code testing features. Data available [here](https://app.periscopedata.com/app/gitlab/788674/Verify:Testing-Group-Metrics?widget=10454394&udv=0)
+product_section: ops
+product_stage: verify
+product_group: group::testing
+product_category: code_testing
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182209_user_preferences_group_overview_security_dashboard.yml b/config/metrics/counts_28d/20210216182209_user_preferences_group_overview_security_dashboard.yml
new file mode 100644
index 00000000000..bf1315b9e50
--- /dev/null
+++ b/config/metrics/counts_28d/20210216182209_user_preferences_group_overview_security_dashboard.yml
@@ -0,0 +1,18 @@
+---
+key_path: usage_activity_by_stage_monthly.secure.user_preferences_group_overview_security_dashboard
+description: Users who set personal preference to see Security Dashboard on Group
+ overview page
+product_section: sec
+product_stage: secure
+product_group: group::threat insights
+product_category: vulnerability_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183159_projects_with_alerts_created.yml b/config/metrics/counts_28d/20210216183159_projects_with_alerts_created.yml
new file mode 100644
index 00000000000..a9049c00aa5
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183159_projects_with_alerts_created.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts_monthly.projects_with_alerts_created
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183201_compliance_features_track_unique_visits_union.yml b/config/metrics/counts_28d/20210216183201_compliance_features_track_unique_visits_union.yml
new file mode 100644
index 00000000000..a0f14b7a760
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183201_compliance_features_track_unique_visits_union.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts_monthly.aggregated_metrics.compliance_features_track_unique_visits_union
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183203_product_analytics_test_metrics_union.yml b/config/metrics/counts_28d/20210216183203_product_analytics_test_metrics_union.yml
new file mode 100644
index 00000000000..f4723c2b5a1
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183203_product_analytics_test_metrics_union.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts_monthly.aggregated_metrics.product_analytics_test_metrics_union
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183205_product_analytics_test_metrics_intersection.yml b/config/metrics/counts_28d/20210216183205_product_analytics_test_metrics_intersection.yml
new file mode 100644
index 00000000000..fe8073f3f33
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183205_product_analytics_test_metrics_intersection.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts_monthly.aggregated_metrics.product_analytics_test_metrics_intersection
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183209_i_testing_paid_monthly_active_user_total.yml b/config/metrics/counts_28d/20210216183209_i_testing_paid_monthly_active_user_total.yml
new file mode 100644
index 00000000000..367cfb77c09
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183209_i_testing_paid_monthly_active_user_total.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts_monthly.aggregated_metrics.i_testing_paid_monthly_active_user_total
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183613_total_number_of_path_locks.yml b/config/metrics/counts_28d/20210216183613_total_number_of_path_locks.yml
new file mode 100644
index 00000000000..e3980a944c6
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183613_total_number_of_path_locks.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.total_number_of_path_locks
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183614_total_number_of_locked_files.yml b/config/metrics/counts_28d/20210216183614_total_number_of_locked_files.yml
new file mode 100644
index 00000000000..3808a2f2dcb
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183614_total_number_of_locked_files.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.total_number_of_locked_files
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183618_approval_project_rules_with_more_approvers_than_required.yml b/config/metrics/counts_28d/20210216183618_approval_project_rules_with_more_approvers_than_required.yml
new file mode 100644
index 00000000000..85ea922568e
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183618_approval_project_rules_with_more_approvers_than_required.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.approval_project_rules_with_more_approvers_than_required
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183620_approval_project_rules_with_less_approvers_than_required.yml b/config/metrics/counts_28d/20210216183620_approval_project_rules_with_less_approvers_than_required.yml
new file mode 100644
index 00000000000..36a3dccbc95
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183620_approval_project_rules_with_less_approvers_than_required.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.approval_project_rules_with_less_approvers_than_required
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183622_approval_project_rules_with_exact_required_approvers.yml b/config/metrics/counts_28d/20210216183622_approval_project_rules_with_exact_required_approvers.yml
new file mode 100644
index 00000000000..a4f7695c505
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183622_approval_project_rules_with_exact_required_approvers.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.approval_project_rules_with_exact_required_approvers
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183627_omniauth_providers.yml b/config/metrics/counts_28d/20210216183627_omniauth_providers.yml
new file mode 100644
index 00000000000..74f20cbe5c4
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183627_omniauth_providers.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.omniauth_providers
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183629_two-factor.yml b/config/metrics/counts_28d/20210216183629_two-factor.yml
new file mode 100644
index 00000000000..3b15b3e0eb7
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183629_two-factor.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.user_auth_by_provider.two-factor
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183631_two-factor-via-u2f-device.yml b/config/metrics/counts_28d/20210216183631_two-factor-via-u2f-device.yml
new file mode 100644
index 00000000000..08cbb3437d1
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183631_two-factor-via-u2f-device.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.user_auth_by_provider.two-factor-via-u2f-device
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183633_two-factor-via-webauthn-device.yml b/config/metrics/counts_28d/20210216183633_two-factor-via-webauthn-device.yml
new file mode 100644
index 00000000000..1a9251bcf16
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183633_two-factor-via-webauthn-device.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.user_auth_by_provider.two-factor-via-webauthn-device
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183634_standard.yml b/config/metrics/counts_28d/20210216183634_standard.yml
new file mode 100644
index 00000000000..8afb1b2321b
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183634_standard.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.user_auth_by_provider.standard
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183636_google_oauth2.yml b/config/metrics/counts_28d/20210216183636_google_oauth2.yml
new file mode 100644
index 00000000000..1ee1a70aaac
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183636_google_oauth2.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.user_auth_by_provider.google_oauth2
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183638_unique_users_all_imports.yml b/config/metrics/counts_28d/20210216183638_unique_users_all_imports.yml
new file mode 100644
index 00000000000..6651dfa0146
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183638_unique_users_all_imports.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.unique_users_all_imports
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183640_gitlab.yml b/config/metrics/counts_28d/20210216183640_gitlab.yml
new file mode 100644
index 00000000000..d0977a24aee
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183640_gitlab.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.bulk_imports.gitlab
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183642_gitlab_v1.yml b/config/metrics/counts_28d/20210216183642_gitlab_v1.yml
new file mode 100644
index 00000000000..ee61abedd8a
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183642_gitlab_v1.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.bulk_imports.gitlab_v1
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183644_gitlab_project.yml b/config/metrics/counts_28d/20210216183644_gitlab_project.yml
new file mode 100644
index 00000000000..166be23baac
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183644_gitlab_project.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.project_imports.gitlab_project
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183646_gitlab.yml b/config/metrics/counts_28d/20210216183646_gitlab.yml
new file mode 100644
index 00000000000..25bb788cc4f
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183646_gitlab.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.project_imports.gitlab
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183648_github.yml b/config/metrics/counts_28d/20210216183648_github.yml
new file mode 100644
index 00000000000..6f79b49a37f
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183648_github.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.project_imports.github
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183650_bitbucket.yml b/config/metrics/counts_28d/20210216183650_bitbucket.yml
new file mode 100644
index 00000000000..fc31e325278
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183650_bitbucket.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.project_imports.bitbucket
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183652_bitbucket_server.yml b/config/metrics/counts_28d/20210216183652_bitbucket_server.yml
new file mode 100644
index 00000000000..fd0b64933b1
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183652_bitbucket_server.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.project_imports.bitbucket_server
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183653_gitea.yml b/config/metrics/counts_28d/20210216183653_gitea.yml
new file mode 100644
index 00000000000..a09fdc9d610
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183653_gitea.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.project_imports.gitea
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183655_git.yml b/config/metrics/counts_28d/20210216183655_git.yml
new file mode 100644
index 00000000000..b17900f534d
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183655_git.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.project_imports.git
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183657_manifest.yml b/config/metrics/counts_28d/20210216183657_manifest.yml
new file mode 100644
index 00000000000..49fcefb3a45
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183657_manifest.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.project_imports.manifest
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183659_gitlab_migration.yml b/config/metrics/counts_28d/20210216183659_gitlab_migration.yml
new file mode 100644
index 00000000000..700fe4b4881
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183659_gitlab_migration.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.project_imports.gitlab_migration
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183701_jira.yml b/config/metrics/counts_28d/20210216183701_jira.yml
new file mode 100644
index 00000000000..1ce602b4bd1
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183701_jira.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.issue_imports.jira
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183703_fogbugz.yml b/config/metrics/counts_28d/20210216183703_fogbugz.yml
new file mode 100644
index 00000000000..3595c0ffdce
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183703_fogbugz.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.issue_imports.fogbugz
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183705_phabricator.yml b/config/metrics/counts_28d/20210216183705_phabricator.yml
new file mode 100644
index 00000000000..5be1c6263aa
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183705_phabricator.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.issue_imports.phabricator
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183707_csv.yml b/config/metrics/counts_28d/20210216183707_csv.yml
new file mode 100644
index 00000000000..398d740d78d
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183707_csv.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.issue_imports.csv
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183709_group_import.yml b/config/metrics/counts_28d/20210216183709_group_import.yml
new file mode 100644
index 00000000000..9116a242811
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183709_group_import.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.group_imports.group_import
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183711_gitlab_migration.yml b/config/metrics/counts_28d/20210216183711_gitlab_migration.yml
new file mode 100644
index 00000000000..1399e4ebe6d
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183711_gitlab_migration.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.group_imports.gitlab_migration
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183712_total.yml b/config/metrics/counts_28d/20210216183712_total.yml
new file mode 100644
index 00000000000..1b524c91a20
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183712_total.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.projects_imported.total
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183714_gitlab_project.yml b/config/metrics/counts_28d/20210216183714_gitlab_project.yml
new file mode 100644
index 00000000000..16fc5757546
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183714_gitlab_project.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.projects_imported.gitlab_project
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183716_gitlab.yml b/config/metrics/counts_28d/20210216183716_gitlab.yml
new file mode 100644
index 00000000000..bd69b4a9ec3
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183716_gitlab.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.projects_imported.gitlab
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183718_github.yml b/config/metrics/counts_28d/20210216183718_github.yml
new file mode 100644
index 00000000000..7e67e2d0b84
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183718_github.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.projects_imported.github
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183720_bitbucket.yml b/config/metrics/counts_28d/20210216183720_bitbucket.yml
new file mode 100644
index 00000000000..0ca34450fbc
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183720_bitbucket.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.projects_imported.bitbucket
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183722_bitbucket_server.yml b/config/metrics/counts_28d/20210216183722_bitbucket_server.yml
new file mode 100644
index 00000000000..7f2ea025d80
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183722_bitbucket_server.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.projects_imported.bitbucket_server
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183724_gitea.yml b/config/metrics/counts_28d/20210216183724_gitea.yml
new file mode 100644
index 00000000000..d4834863316
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183724_gitea.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.projects_imported.gitea
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183726_git.yml b/config/metrics/counts_28d/20210216183726_git.yml
new file mode 100644
index 00000000000..f844b90426c
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183726_git.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.projects_imported.git
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183728_manifest.yml b/config/metrics/counts_28d/20210216183728_manifest.yml
new file mode 100644
index 00000000000..997db699083
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183728_manifest.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.projects_imported.manifest
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183730_jira.yml b/config/metrics/counts_28d/20210216183730_jira.yml
new file mode 100644
index 00000000000..70223435940
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183730_jira.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.issues_imported.jira
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183731_fogbugz.yml b/config/metrics/counts_28d/20210216183731_fogbugz.yml
new file mode 100644
index 00000000000..e8e8a618077
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183731_fogbugz.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.issues_imported.fogbugz
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183733_phabricator.yml b/config/metrics/counts_28d/20210216183733_phabricator.yml
new file mode 100644
index 00000000000..bf9f52055f2
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183733_phabricator.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.issues_imported.phabricator
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183735_csv.yml b/config/metrics/counts_28d/20210216183735_csv.yml
new file mode 100644
index 00000000000..c4267bda332
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183735_csv.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.issues_imported.csv
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183737_groups_imported.yml b/config/metrics/counts_28d/20210216183737_groups_imported.yml
new file mode 100644
index 00000000000..8e49b36a9a2
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183737_groups_imported.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.groups_imported
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183753_projects_incident_sla_enabled.yml b/config/metrics/counts_28d/20210216183753_projects_incident_sla_enabled.yml
new file mode 100644
index 00000000000..660a1b1583b
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183753_projects_incident_sla_enabled.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.monitor.projects_incident_sla_enabled
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183817_user_coverage_fuzzing_jobs.yml b/config/metrics/counts_28d/20210216183817_user_coverage_fuzzing_jobs.yml
new file mode 100644
index 00000000000..c93f4bfbe85
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183817_user_coverage_fuzzing_jobs.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.secure.user_coverage_fuzzing_jobs
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183826_sast_scans.yml b/config/metrics/counts_28d/20210216183826_sast_scans.yml
new file mode 100644
index 00000000000..81824a66f09
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183826_sast_scans.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.secure.sast_scans
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183828_dependency_scanning_scans.yml b/config/metrics/counts_28d/20210216183828_dependency_scanning_scans.yml
new file mode 100644
index 00000000000..f4eb1e39947
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183828_dependency_scanning_scans.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.secure.dependency_scanning_scans
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183830_container_scanning_scans.yml b/config/metrics/counts_28d/20210216183830_container_scanning_scans.yml
new file mode 100644
index 00000000000..f05361d80bc
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183830_container_scanning_scans.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.secure.container_scanning_scans
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183832_dast_scans.yml b/config/metrics/counts_28d/20210216183832_dast_scans.yml
new file mode 100644
index 00000000000..daa8db24b65
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183832_dast_scans.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.secure.dast_scans
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183834_secret_detection_scans.yml b/config/metrics/counts_28d/20210216183834_secret_detection_scans.yml
new file mode 100644
index 00000000000..dfab9034bd0
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183834_secret_detection_scans.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.secure.secret_detection_scans
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183836_coverage_fuzzing_scans.yml b/config/metrics/counts_28d/20210216183836_coverage_fuzzing_scans.yml
new file mode 100644
index 00000000000..9e3248c7211
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183836_coverage_fuzzing_scans.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.secure.coverage_fuzzing_scans
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183838_api_fuzzing_scans.yml b/config/metrics/counts_28d/20210216183838_api_fuzzing_scans.yml
new file mode 100644
index 00000000000..db92fcddb74
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183838_api_fuzzing_scans.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.secure.api_fuzzing_scans
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183916_compliance_unique_visits_for_any_target_monthly.yml b/config/metrics/counts_28d/20210216183916_compliance_unique_visits_for_any_target_monthly.yml
new file mode 100644
index 00000000000..a95d2ba6e89
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183916_compliance_unique_visits_for_any_target_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: compliance_unique_visits.compliance_unique_visits_for_any_target_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183922_search_unique_visits_for_any_target_monthly.yml b/config/metrics/counts_28d/20210216183922_search_unique_visits_for_any_target_monthly.yml
new file mode 100644
index 00000000000..07e1d5dfd43
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183922_search_unique_visits_for_any_target_monthly.yml
@@ -0,0 +1,18 @@
+---
+key_path: search_unique_visits.search_unique_visits_for_any_target_monthly
+description: Total unique users for i_search_total, i_search_advanced, i_search_paid for recent 28 days. This metric is redundant because advanced will be a subset of paid and paid will be a subset of total. i_search_total is more appropriate if you just want the total
+product_section: enablement
+product_stage: enablement
+product_group: group::global search
+product_category: global_search
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210216183926_g_compliance_dashboard_monthly.yml b/config/metrics/counts_28d/20210216183926_g_compliance_dashboard_monthly.yml
new file mode 100644
index 00000000000..be1f63fad18
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183926_g_compliance_dashboard_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.compliance.g_compliance_dashboard_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183930_g_compliance_audit_events_monthly.yml b/config/metrics/counts_28d/20210216183930_g_compliance_audit_events_monthly.yml
new file mode 100644
index 00000000000..d3262c4d9ca
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183930_g_compliance_audit_events_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.compliance.g_compliance_audit_events_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183934_i_compliance_audit_events_monthly.yml b/config/metrics/counts_28d/20210216183934_i_compliance_audit_events_monthly.yml
new file mode 100644
index 00000000000..fb8284bcf31
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183934_i_compliance_audit_events_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.compliance.i_compliance_audit_events_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183938_i_compliance_credential_inventory_monthly.yml b/config/metrics/counts_28d/20210216183938_i_compliance_credential_inventory_monthly.yml
new file mode 100644
index 00000000000..f05fedf23c9
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183938_i_compliance_credential_inventory_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.compliance.i_compliance_credential_inventory_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183942_a_compliance_audit_events_api_monthly.yml b/config/metrics/counts_28d/20210216183942_a_compliance_audit_events_api_monthly.yml
new file mode 100644
index 00000000000..ba9bcfba41e
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183942_a_compliance_audit_events_api_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.compliance.a_compliance_audit_events_api_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183946_compliance_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216183946_compliance_total_unique_counts_monthly.yml
new file mode 100644
index 00000000000..63131ea83e2
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183946_compliance_total_unique_counts_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.compliance.compliance_total_unique_counts_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184024_g_edit_by_sse_monthly.yml b/config/metrics/counts_28d/20210216184024_g_edit_by_sse_monthly.yml
new file mode 100644
index 00000000000..ee06f117ff8
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184024_g_edit_by_sse_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ide_edit.g_edit_by_sse_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184047_git_write_action_monthly.yml b/config/metrics/counts_28d/20210216184047_git_write_action_monthly.yml
new file mode 100644
index 00000000000..eb0ffa26d2a
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184047_git_write_action_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.source_code.git_write_action_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184140_testing_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216184140_testing_total_unique_counts_monthly.yml
new file mode 100644
index 00000000000..12d51d8d560
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184140_testing_total_unique_counts_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.testing.testing_total_unique_counts_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184251_i_ci_secrets_management_vault_build_created_monthly.yml b/config/metrics/counts_28d/20210216184251_i_ci_secrets_management_vault_build_created_monthly.yml
new file mode 100644
index 00000000000..124f322132f
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184251_i_ci_secrets_management_vault_build_created_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ci_secrets_management.i_ci_secrets_management_vault_build_created_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184255_i_snippets_show_monthly.yml b/config/metrics/counts_28d/20210216184255_i_snippets_show_monthly.yml
new file mode 100644
index 00000000000..e9d67155907
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184255_i_snippets_show_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.snippets.i_snippets_show_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184259_p_terraform_state_api_unique_users_monthly.yml b/config/metrics/counts_28d/20210216184259_p_terraform_state_api_unique_users_monthly.yml
new file mode 100644
index 00000000000..7d981f850e2
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184259_p_terraform_state_api_unique_users_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.terraform.p_terraform_state_api_unique_users_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184303_o_pipeline_authoring_unique_users_committing_ciconfigfile_monthly.yml b/config/metrics/counts_28d/20210216184303_o_pipeline_authoring_unique_users_committing_ciconfigfile_monthly.yml
new file mode 100644
index 00000000000..b649192d659
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184303_o_pipeline_authoring_unique_users_committing_ciconfigfile_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.pipeline_authoring.o_pipeline_authoring_unique_users_committing_ciconfigfile_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184312_i_code_review_user_toggled_task_item_status_monthly.yml b/config/metrics/counts_28d/20210216184312_i_code_review_user_toggled_task_item_status_monthly.yml
new file mode 100644
index 00000000000..12d7e8ab749
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184312_i_code_review_user_toggled_task_item_status_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_toggled_task_item_status_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184322_i_code_review_user_approve_mr_monthly.yml b/config/metrics/counts_28d/20210216184322_i_code_review_user_approve_mr_monthly.yml
new file mode 100644
index 00000000000..1df3325b027
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184322_i_code_review_user_approve_mr_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_approve_mr_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184326_i_code_review_user_unapprove_mr_monthly.yml b/config/metrics/counts_28d/20210216184326_i_code_review_user_unapprove_mr_monthly.yml
new file mode 100644
index 00000000000..527105a58fe
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184326_i_code_review_user_unapprove_mr_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_unapprove_mr_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184330_i_code_review_user_resolve_thread_monthly.yml b/config/metrics/counts_28d/20210216184330_i_code_review_user_resolve_thread_monthly.yml
new file mode 100644
index 00000000000..cdf2d1135aa
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184330_i_code_review_user_resolve_thread_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_resolve_thread_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184334_i_code_review_user_unresolve_thread_monthly.yml b/config/metrics/counts_28d/20210216184334_i_code_review_user_unresolve_thread_monthly.yml
new file mode 100644
index 00000000000..d4a27feb8f3
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184334_i_code_review_user_unresolve_thread_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_unresolve_thread_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184338_i_code_review_edit_mr_title_monthly.yml b/config/metrics/counts_28d/20210216184338_i_code_review_edit_mr_title_monthly.yml
new file mode 100644
index 00000000000..27899299abb
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184338_i_code_review_edit_mr_title_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_edit_mr_title_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184342_i_code_review_edit_mr_desc_monthly.yml b/config/metrics/counts_28d/20210216184342_i_code_review_edit_mr_desc_monthly.yml
new file mode 100644
index 00000000000..ad564e57ab7
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184342_i_code_review_edit_mr_desc_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_edit_mr_desc_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184353_i_code_review_user_create_review_note_monthly.yml b/config/metrics/counts_28d/20210216184353_i_code_review_user_create_review_note_monthly.yml
new file mode 100644
index 00000000000..10c13e8796f
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184353_i_code_review_user_create_review_note_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_create_review_note_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184357_i_code_review_user_publish_review_monthly.yml b/config/metrics/counts_28d/20210216184357_i_code_review_user_publish_review_monthly.yml
new file mode 100644
index 00000000000..a6bac39ace0
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184357_i_code_review_user_publish_review_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_publish_review_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184401_i_code_review_user_create_multiline_mr_comment_monthly.yml b/config/metrics/counts_28d/20210216184401_i_code_review_user_create_multiline_mr_comment_monthly.yml
new file mode 100644
index 00000000000..937e17e3daf
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184401_i_code_review_user_create_multiline_mr_comment_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_create_multiline_mr_comment_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184405_i_code_review_user_edit_multiline_mr_comment_monthly.yml b/config/metrics/counts_28d/20210216184405_i_code_review_user_edit_multiline_mr_comment_monthly.yml
new file mode 100644
index 00000000000..c88078ffa2b
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184405_i_code_review_user_edit_multiline_mr_comment_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_edit_multiline_mr_comment_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184409_i_code_review_user_remove_multiline_mr_comment_monthly.yml b/config/metrics/counts_28d/20210216184409_i_code_review_user_remove_multiline_mr_comment_monthly.yml
new file mode 100644
index 00000000000..1bd3172b9f6
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184409_i_code_review_user_remove_multiline_mr_comment_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_remove_multiline_mr_comment_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184418_i_code_review_user_assigned_monthly.yml b/config/metrics/counts_28d/20210216184418_i_code_review_user_assigned_monthly.yml
new file mode 100644
index 00000000000..594393e33d6
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184418_i_code_review_user_assigned_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_assigned_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184422_i_code_review_user_marked_as_draft_monthly.yml b/config/metrics/counts_28d/20210216184422_i_code_review_user_marked_as_draft_monthly.yml
new file mode 100644
index 00000000000..8bbaa0dc420
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184422_i_code_review_user_marked_as_draft_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_marked_as_draft_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184426_i_code_review_user_unmarked_as_draft_monthly.yml b/config/metrics/counts_28d/20210216184426_i_code_review_user_unmarked_as_draft_monthly.yml
new file mode 100644
index 00000000000..f294f887c99
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184426_i_code_review_user_unmarked_as_draft_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_unmarked_as_draft_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184430_i_code_review_user_review_requested_monthly.yml b/config/metrics/counts_28d/20210216184430_i_code_review_user_review_requested_monthly.yml
new file mode 100644
index 00000000000..d3c4647abbb
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184430_i_code_review_user_review_requested_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_review_requested_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184434_i_code_review_user_approval_rule_added_monthly.yml b/config/metrics/counts_28d/20210216184434_i_code_review_user_approval_rule_added_monthly.yml
new file mode 100644
index 00000000000..afbf5e0f3f5
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184434_i_code_review_user_approval_rule_added_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_approval_rule_added_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184438_i_code_review_user_approval_rule_deleted_monthly.yml b/config/metrics/counts_28d/20210216184438_i_code_review_user_approval_rule_deleted_monthly.yml
new file mode 100644
index 00000000000..565e1346a62
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184438_i_code_review_user_approval_rule_deleted_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_approval_rule_deleted_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184442_i_code_review_user_approval_rule_edited_monthly.yml b/config/metrics/counts_28d/20210216184442_i_code_review_user_approval_rule_edited_monthly.yml
new file mode 100644
index 00000000000..c21e94ab4ab
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184442_i_code_review_user_approval_rule_edited_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_approval_rule_edited_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184446_i_code_review_user_vs_code_api_request_monthly.yml b/config/metrics/counts_28d/20210216184446_i_code_review_user_vs_code_api_request_monthly.yml
new file mode 100644
index 00000000000..c1f06831606
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184446_i_code_review_user_vs_code_api_request_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_vs_code_api_request_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184450_i_code_review_user_create_mr_from_issue_monthly.yml b/config/metrics/counts_28d/20210216184450_i_code_review_user_create_mr_from_issue_monthly.yml
new file mode 100644
index 00000000000..a985393fa6b
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184450_i_code_review_user_create_mr_from_issue_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_create_mr_from_issue_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184454_code_review_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216184454_code_review_total_unique_counts_monthly.yml
new file mode 100644
index 00000000000..72590d59bd1
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184454_code_review_total_unique_counts_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.code_review_total_unique_counts_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184458_p_ci_templates_implicit_auto_devops_monthly.yml b/config/metrics/counts_28d/20210216184458_p_ci_templates_implicit_auto_devops_monthly.yml
new file mode 100644
index 00000000000..e5931e25cdd
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184458_p_ci_templates_implicit_auto_devops_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184502_p_ci_templates_implicit_auto_devops_build_monthly.yml b/config/metrics/counts_28d/20210216184502_p_ci_templates_implicit_auto_devops_build_monthly.yml
new file mode 100644
index 00000000000..7d52a2807e6
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184502_p_ci_templates_implicit_auto_devops_build_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_build_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184506_p_ci_templates_implicit_auto_devops_deploy_monthly.yml b/config/metrics/counts_28d/20210216184506_p_ci_templates_implicit_auto_devops_deploy_monthly.yml
new file mode 100644
index 00000000000..1f753124f46
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184506_p_ci_templates_implicit_auto_devops_deploy_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_deploy_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184510_p_ci_templates_implicit_security_sast_monthly.yml b/config/metrics/counts_28d/20210216184510_p_ci_templates_implicit_security_sast_monthly.yml
new file mode 100644
index 00000000000..5bb03d5c1c9
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184510_p_ci_templates_implicit_security_sast_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_security_sast_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184513_p_ci_templates_implicit_security_secret_detection_monthly.yml b/config/metrics/counts_28d/20210216184513_p_ci_templates_implicit_security_secret_detection_monthly.yml
new file mode 100644
index 00000000000..d519411c9f8
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184513_p_ci_templates_implicit_security_secret_detection_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_security_secret_detection_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184517_p_ci_templates_5_min_production_app_monthly.yml b/config/metrics/counts_28d/20210216184517_p_ci_templates_5_min_production_app_monthly.yml
new file mode 100644
index 00000000000..62ee737153d
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184517_p_ci_templates_5_min_production_app_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_5_min_production_app_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184523_p_ci_templates_auto_devops_monthly.yml b/config/metrics/counts_28d/20210216184523_p_ci_templates_auto_devops_monthly.yml
new file mode 100644
index 00000000000..55f938dfce1
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184523_p_ci_templates_auto_devops_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_auto_devops_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184526_p_ci_templates_aws_cf_deploy_ec2_monthly.yml b/config/metrics/counts_28d/20210216184526_p_ci_templates_aws_cf_deploy_ec2_monthly.yml
new file mode 100644
index 00000000000..0f94788b355
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184526_p_ci_templates_aws_cf_deploy_ec2_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_aws_cf_deploy_ec2_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184530_p_ci_templates_aws_deploy_ecs_monthly.yml b/config/metrics/counts_28d/20210216184530_p_ci_templates_aws_deploy_ecs_monthly.yml
new file mode 100644
index 00000000000..2483245b23d
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184530_p_ci_templates_aws_deploy_ecs_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_aws_deploy_ecs_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184534_p_ci_templates_auto_devops_build_monthly.yml b/config/metrics/counts_28d/20210216184534_p_ci_templates_auto_devops_build_monthly.yml
new file mode 100644
index 00000000000..7ce990172df
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184534_p_ci_templates_auto_devops_build_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_auto_devops_build_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184538_p_ci_templates_auto_devops_deploy_monthly.yml b/config/metrics/counts_28d/20210216184538_p_ci_templates_auto_devops_deploy_monthly.yml
new file mode 100644
index 00000000000..a585ef5fbb9
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184538_p_ci_templates_auto_devops_deploy_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_auto_devops_deploy_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184542_p_ci_templates_auto_devops_deploy_latest_monthly.yml b/config/metrics/counts_28d/20210216184542_p_ci_templates_auto_devops_deploy_latest_monthly.yml
new file mode 100644
index 00000000000..2e5b87677e1
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184542_p_ci_templates_auto_devops_deploy_latest_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_auto_devops_deploy_latest_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184546_p_ci_templates_security_sast_monthly.yml b/config/metrics/counts_28d/20210216184546_p_ci_templates_security_sast_monthly.yml
new file mode 100644
index 00000000000..e8907f63243
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184546_p_ci_templates_security_sast_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_security_sast_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184551_p_ci_templates_security_secret_detection_monthly.yml b/config/metrics/counts_28d/20210216184551_p_ci_templates_security_secret_detection_monthly.yml
new file mode 100644
index 00000000000..b97c4005529
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184551_p_ci_templates_security_secret_detection_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_security_secret_detection_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184555_p_ci_templates_terraform_base_latest_monthly.yml b/config/metrics/counts_28d/20210216184555_p_ci_templates_terraform_base_latest_monthly.yml
new file mode 100644
index 00000000000..fac0fa40406
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184555_p_ci_templates_terraform_base_latest_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_terraform_base_latest_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
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
new file mode 100644
index 00000000000..541d619a6e7
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184559_ci_templates_total_unique_counts_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ci_templates.ci_templates_total_unique_counts_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184803_quickactions_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216184803_quickactions_total_unique_counts_monthly.yml
new file mode 100644
index 00000000000..59771f0f021
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184803_quickactions_total_unique_counts_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.quickactions_total_unique_counts_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184806_i_package_composer_deploy_token_monthly.yml b/config/metrics/counts_28d/20210216184806_i_package_composer_deploy_token_monthly.yml
new file mode 100644
index 00000000000..5d25977e938
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184806_i_package_composer_deploy_token_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.deploy_token_packages.i_package_composer_deploy_token_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184810_i_package_conan_deploy_token_monthly.yml b/config/metrics/counts_28d/20210216184810_i_package_conan_deploy_token_monthly.yml
new file mode 100644
index 00000000000..5f86c64cda6
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184810_i_package_conan_deploy_token_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.deploy_token_packages.i_package_conan_deploy_token_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184814_i_package_container_deploy_token_monthly.yml b/config/metrics/counts_28d/20210216184814_i_package_container_deploy_token_monthly.yml
new file mode 100644
index 00000000000..6ba5297d60d
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184814_i_package_container_deploy_token_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.deploy_token_packages.i_package_container_deploy_token_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184818_i_package_debian_deploy_token_monthly.yml b/config/metrics/counts_28d/20210216184818_i_package_debian_deploy_token_monthly.yml
new file mode 100644
index 00000000000..9fe96b21e7e
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184818_i_package_debian_deploy_token_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.deploy_token_packages.i_package_debian_deploy_token_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184822_i_package_generic_deploy_token_monthly.yml b/config/metrics/counts_28d/20210216184822_i_package_generic_deploy_token_monthly.yml
new file mode 100644
index 00000000000..982d765b5fa
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184822_i_package_generic_deploy_token_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.deploy_token_packages.i_package_generic_deploy_token_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184826_i_package_golang_deploy_token_monthly.yml b/config/metrics/counts_28d/20210216184826_i_package_golang_deploy_token_monthly.yml
new file mode 100644
index 00000000000..b5001143b05
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184826_i_package_golang_deploy_token_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.deploy_token_packages.i_package_golang_deploy_token_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184830_i_package_maven_deploy_token_monthly.yml b/config/metrics/counts_28d/20210216184830_i_package_maven_deploy_token_monthly.yml
new file mode 100644
index 00000000000..220fa24696b
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184830_i_package_maven_deploy_token_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.deploy_token_packages.i_package_maven_deploy_token_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184834_i_package_npm_deploy_token_monthly.yml b/config/metrics/counts_28d/20210216184834_i_package_npm_deploy_token_monthly.yml
new file mode 100644
index 00000000000..ba98e8363a0
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184834_i_package_npm_deploy_token_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.deploy_token_packages.i_package_npm_deploy_token_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184838_i_package_nuget_deploy_token_monthly.yml b/config/metrics/counts_28d/20210216184838_i_package_nuget_deploy_token_monthly.yml
new file mode 100644
index 00000000000..2fe6251f959
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184838_i_package_nuget_deploy_token_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.deploy_token_packages.i_package_nuget_deploy_token_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184842_i_package_pypi_deploy_token_monthly.yml b/config/metrics/counts_28d/20210216184842_i_package_pypi_deploy_token_monthly.yml
new file mode 100644
index 00000000000..db8b894abf7
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184842_i_package_pypi_deploy_token_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.deploy_token_packages.i_package_pypi_deploy_token_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184846_i_package_tag_deploy_token_monthly.yml b/config/metrics/counts_28d/20210216184846_i_package_tag_deploy_token_monthly.yml
new file mode 100644
index 00000000000..b69c4aa13d5
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184846_i_package_tag_deploy_token_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.deploy_token_packages.i_package_tag_deploy_token_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184850_deploy_token_packages_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216184850_deploy_token_packages_total_unique_counts_monthly.yml
new file mode 100644
index 00000000000..b17e2a671b3
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184850_deploy_token_packages_total_unique_counts_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.deploy_token_packages.deploy_token_packages_total_unique_counts_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184854_i_package_composer_user_monthly.yml b/config/metrics/counts_28d/20210216184854_i_package_composer_user_monthly.yml
new file mode 100644
index 00000000000..821a30c475f
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184854_i_package_composer_user_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.user_packages.i_package_composer_user_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184858_i_package_conan_user_monthly.yml b/config/metrics/counts_28d/20210216184858_i_package_conan_user_monthly.yml
new file mode 100644
index 00000000000..34ca1cba1e8
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184858_i_package_conan_user_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.user_packages.i_package_conan_user_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184902_i_package_container_user_monthly.yml b/config/metrics/counts_28d/20210216184902_i_package_container_user_monthly.yml
new file mode 100644
index 00000000000..dd916840cb1
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184902_i_package_container_user_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.user_packages.i_package_container_user_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184906_i_package_debian_user_monthly.yml b/config/metrics/counts_28d/20210216184906_i_package_debian_user_monthly.yml
new file mode 100644
index 00000000000..d72c6db17bb
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184906_i_package_debian_user_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.user_packages.i_package_debian_user_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184910_i_package_generic_user_monthly.yml b/config/metrics/counts_28d/20210216184910_i_package_generic_user_monthly.yml
new file mode 100644
index 00000000000..af2d01d8320
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184910_i_package_generic_user_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.user_packages.i_package_generic_user_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184913_i_package_golang_user_monthly.yml b/config/metrics/counts_28d/20210216184913_i_package_golang_user_monthly.yml
new file mode 100644
index 00000000000..031a6b51b04
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184913_i_package_golang_user_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.user_packages.i_package_golang_user_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184917_i_package_maven_user_monthly.yml b/config/metrics/counts_28d/20210216184917_i_package_maven_user_monthly.yml
new file mode 100644
index 00000000000..4a4649cd38a
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184917_i_package_maven_user_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.user_packages.i_package_maven_user_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184921_i_package_npm_user_monthly.yml b/config/metrics/counts_28d/20210216184921_i_package_npm_user_monthly.yml
new file mode 100644
index 00000000000..12dd245e7be
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184921_i_package_npm_user_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.user_packages.i_package_npm_user_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184925_i_package_nuget_user_monthly.yml b/config/metrics/counts_28d/20210216184925_i_package_nuget_user_monthly.yml
new file mode 100644
index 00000000000..6035e571393
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184925_i_package_nuget_user_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.user_packages.i_package_nuget_user_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184929_i_package_pypi_user_monthly.yml b/config/metrics/counts_28d/20210216184929_i_package_pypi_user_monthly.yml
new file mode 100644
index 00000000000..eff9b749fb4
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184929_i_package_pypi_user_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.user_packages.i_package_pypi_user_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184933_i_package_tag_user_monthly.yml b/config/metrics/counts_28d/20210216184933_i_package_tag_user_monthly.yml
new file mode 100644
index 00000000000..15c078db1f9
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184933_i_package_tag_user_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.user_packages.i_package_tag_user_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184937_user_packages_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216184937_user_packages_total_unique_counts_monthly.yml
new file mode 100644
index 00000000000..c21e9bebd6c
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184937_user_packages_total_unique_counts_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.user_packages.user_packages_total_unique_counts_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184941_i_ecosystem_jira_service_close_issue_monthly.yml b/config/metrics/counts_28d/20210216184941_i_ecosystem_jira_service_close_issue_monthly.yml
new file mode 100644
index 00000000000..c5fa7e2dcf7
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184941_i_ecosystem_jira_service_close_issue_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ecosystem.i_ecosystem_jira_service_close_issue_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184945_i_ecosystem_jira_service_cross_reference_monthly.yml b/config/metrics/counts_28d/20210216184945_i_ecosystem_jira_service_cross_reference_monthly.yml
new file mode 100644
index 00000000000..f4469c41dd3
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184945_i_ecosystem_jira_service_cross_reference_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ecosystem.i_ecosystem_jira_service_cross_reference_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184949_i_ecosystem_jira_service_list_issues_monthly.yml b/config/metrics/counts_28d/20210216184949_i_ecosystem_jira_service_list_issues_monthly.yml
new file mode 100644
index 00000000000..dd114b37a99
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184949_i_ecosystem_jira_service_list_issues_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ecosystem.i_ecosystem_jira_service_list_issues_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184953_i_ecosystem_jira_service_create_issue_monthly.yml b/config/metrics/counts_28d/20210216184953_i_ecosystem_jira_service_create_issue_monthly.yml
new file mode 100644
index 00000000000..04f33c6f333
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184953_i_ecosystem_jira_service_create_issue_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ecosystem.i_ecosystem_jira_service_create_issue_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184957_ecosystem_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216184957_ecosystem_total_unique_counts_monthly.yml
new file mode 100644
index 00000000000..6c1d08964a9
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184957_ecosystem_total_unique_counts_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ecosystem.ecosystem_total_unique_counts_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210222041219_i_quickactions_invite_email_single_monthly.yml b/config/metrics/counts_28d/20210222041219_i_quickactions_invite_email_single_monthly.yml
new file mode 100644
index 00000000000..d4761b84344
--- /dev/null
+++ b/config/metrics/counts_28d/20210222041219_i_quickactions_invite_email_single_monthly.yml
@@ -0,0 +1,18 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_invite_email_single_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::product planning
+product_category: issue_tracking
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49264
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210222041235_i_quickactions_invite_email_multiple_monthly.yml b/config/metrics/counts_28d/20210222041235_i_quickactions_invite_email_multiple_monthly.yml
new file mode 100644
index 00000000000..f0a5c3c29bd
--- /dev/null
+++ b/config/metrics/counts_28d/20210222041235_i_quickactions_invite_email_multiple_monthly.yml
@@ -0,0 +1,18 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_invite_email_multiple_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::product planning
+product_category: issue_tracking
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49264
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210301102134_i_code_review_user_time_estimate_changed_monthly.yml b/config/metrics/counts_28d/20210301102134_i_code_review_user_time_estimate_changed_monthly.yml
new file mode 100644
index 00000000000..69ad9237f0d
--- /dev/null
+++ b/config/metrics/counts_28d/20210301102134_i_code_review_user_time_estimate_changed_monthly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_time_estimate_changed_monthly
+description: Count of unique users per month who changed time estimate of a MR
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55046
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210301102204_i_code_review_user_time_spent_changed_monthly.yml b/config/metrics/counts_28d/20210301102204_i_code_review_user_time_spent_changed_monthly.yml
new file mode 100644
index 00000000000..36972b7e168
--- /dev/null
+++ b/config/metrics/counts_28d/20210301102204_i_code_review_user_time_spent_changed_monthly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_time_spent_changed_monthly
+description: Count of unique users per month who changed time spent on a MR
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55046
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210301103859_i_code_review_user_mr_discussion_locked_monthly.yml b/config/metrics/counts_28d/20210301103859_i_code_review_user_mr_discussion_locked_monthly.yml
new file mode 100644
index 00000000000..9ad7ff81231
--- /dev/null
+++ b/config/metrics/counts_28d/20210301103859_i_code_review_user_mr_discussion_locked_monthly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_mr_discussion_locked_monthly
+description: Count of unique users per month who locked a MR
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55069
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210301103925_i_code_review_user_mr_discussion_unlocked_monthly.yml b/config/metrics/counts_28d/20210301103925_i_code_review_user_mr_discussion_unlocked_monthly.yml
new file mode 100644
index 00000000000..707a2fc76d1
--- /dev/null
+++ b/config/metrics/counts_28d/20210301103925_i_code_review_user_mr_discussion_unlocked_monthly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_mr_discussion_unlocked_monthly
+description: Count of unique users per month who unlocked a MR
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55069
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210301144228_o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile_monthly.yml b/config/metrics/counts_28d/20210301144228_o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile_monthly.yml
new file mode 100644
index 00000000000..b67a8c521a9
--- /dev/null
+++ b/config/metrics/counts_28d/20210301144228_o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile_monthly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.pipeline_authoring.o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile_monthly
+description: Monthly unique user count having merge requests which contains the CI config file
+product_section: ops
+product_stage: verify
+product_group: group::pipeline authoring
+product_category: pipeline_authoring
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54707
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210302110520_i_code_review_user_milestone_changed_monthly.yml b/config/metrics/counts_28d/20210302110520_i_code_review_user_milestone_changed_monthly.yml
new file mode 100644
index 00000000000..4edc596dca1
--- /dev/null
+++ b/config/metrics/counts_28d/20210302110520_i_code_review_user_milestone_changed_monthly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_milestone_changed_monthly
+description: Count of unique users per month who changed milestone of a MR
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55484
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210302110607_i_code_review_user_labels_changed_monthly.yml b/config/metrics/counts_28d/20210302110607_i_code_review_user_labels_changed_monthly.yml
new file mode 100644
index 00000000000..713473cc832
--- /dev/null
+++ b/config/metrics/counts_28d/20210302110607_i_code_review_user_labels_changed_monthly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_labels_changed_monthly
+description: Count of unique users per month who changed labels of a MR
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55484
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210302114145_i_code_review_user_assignees_changed_monthly.yml b/config/metrics/counts_28d/20210302114145_i_code_review_user_assignees_changed_monthly.yml
new file mode 100644
index 00000000000..83d06db1fb3
--- /dev/null
+++ b/config/metrics/counts_28d/20210302114145_i_code_review_user_assignees_changed_monthly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_assignees_changed_monthly
+description: Count of unique users per month who changed assignees of a MR
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55486
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210302114219_i_code_review_user_reviewers_changed_monthly.yml b/config/metrics/counts_28d/20210302114219_i_code_review_user_reviewers_changed_monthly.yml
new file mode 100644
index 00000000000..9cf18201916
--- /dev/null
+++ b/config/metrics/counts_28d/20210302114219_i_code_review_user_reviewers_changed_monthly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_reviewers_changed_monthly
+description: Count of unique users per month who changed reviewers of a MR
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55486
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210303150507_i_ecosystem_slack_service_issue_notification_monthly.yml b/config/metrics/counts_28d/20210303150507_i_ecosystem_slack_service_issue_notification_monthly.yml
new file mode 100644
index 00000000000..300968b4959
--- /dev/null
+++ b/config/metrics/counts_28d/20210303150507_i_ecosystem_slack_service_issue_notification_monthly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_issue_notification_monthly
+description: Calculated unique users to trigger a Slack message by performing an action on an issue by month
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54347
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ee
+- ce
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210303150654_i_ecosystem_slack_service_push_notification_monthly.yml b/config/metrics/counts_28d/20210303150654_i_ecosystem_slack_service_push_notification_monthly.yml
new file mode 100644
index 00000000000..5db875af686
--- /dev/null
+++ b/config/metrics/counts_28d/20210303150654_i_ecosystem_slack_service_push_notification_monthly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_push_notification_monthly
+description: Calculated unique users to trigger a Slack message by performing a Git push by month
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54347
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ee
+- ce
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210303150912_i_ecosystem_slack_service_deployment_notification_monthly.yml b/config/metrics/counts_28d/20210303150912_i_ecosystem_slack_service_deployment_notification_monthly.yml
new file mode 100644
index 00000000000..b551a1bdfc4
--- /dev/null
+++ b/config/metrics/counts_28d/20210303150912_i_ecosystem_slack_service_deployment_notification_monthly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_deployment_notification_monthly
+description: Calculated unique users to trigger a Slack message by performing a deployment by month
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54347
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ee
+- ce
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210303151609_i_ecosystem_slack_service_wiki_page_notification_monthly.yml b/config/metrics/counts_28d/20210303151609_i_ecosystem_slack_service_wiki_page_notification_monthly.yml
new file mode 100644
index 00000000000..90c1b0a36ef
--- /dev/null
+++ b/config/metrics/counts_28d/20210303151609_i_ecosystem_slack_service_wiki_page_notification_monthly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_wiki_page_notification_monthly
+description: Calculated unique users to trigger a Slack message by performing an action on a wiki page by month
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54347
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ee
+- ce
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210303151831_i_ecosystem_slack_service_merge_request_notification_monthly.yml b/config/metrics/counts_28d/20210303151831_i_ecosystem_slack_service_merge_request_notification_monthly.yml
new file mode 100644
index 00000000000..983b3e4453c
--- /dev/null
+++ b/config/metrics/counts_28d/20210303151831_i_ecosystem_slack_service_merge_request_notification_monthly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_merge_request_notification_monthly
+description: Calculated unique users to trigger a Slack message by performing an action on a merge request by month
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54347
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ee
+- ce
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210303151946_i_ecosystem_slack_service_note_notification_monthly.yml b/config/metrics/counts_28d/20210303151946_i_ecosystem_slack_service_note_notification_monthly.yml
new file mode 100644
index 00000000000..452a4c1258c
--- /dev/null
+++ b/config/metrics/counts_28d/20210303151946_i_ecosystem_slack_service_note_notification_monthly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_note_notification_monthly
+description: Calculated unique users to trigger a Slack message by creating a note by month
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54347
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ee
+- ce
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210303152049_i_ecosystem_slack_service_tag_push_notification_monthly.yml b/config/metrics/counts_28d/20210303152049_i_ecosystem_slack_service_tag_push_notification_monthly.yml
new file mode 100644
index 00000000000..0bc4def1b9c
--- /dev/null
+++ b/config/metrics/counts_28d/20210303152049_i_ecosystem_slack_service_tag_push_notification_monthly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_tag_push_notification_monthly
+description: Calculated unique users to trigger a Slack message by performing a tag push by month
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54347
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ee
+- ce
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210303152144_i_ecosystem_slack_service_confidential_note_notification_monthly.yml b/config/metrics/counts_28d/20210303152144_i_ecosystem_slack_service_confidential_note_notification_monthly.yml
new file mode 100644
index 00000000000..3de56f4b328
--- /dev/null
+++ b/config/metrics/counts_28d/20210303152144_i_ecosystem_slack_service_confidential_note_notification_monthly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_confidential_note_notification_monthly
+description: Calculated unique users to trigger a Slack message by creating a confidential note by month
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54347
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ee
+- ce
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210303152233_i_ecosystem_slack_service_confidential_issue_notification_monthly.yml b/config/metrics/counts_28d/20210303152233_i_ecosystem_slack_service_confidential_issue_notification_monthly.yml
new file mode 100644
index 00000000000..247b7b8c406
--- /dev/null
+++ b/config/metrics/counts_28d/20210303152233_i_ecosystem_slack_service_confidential_issue_notification_monthly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_confidential_issue_notification_monthly
+description: Calculated unique users to trigger a Slack message by performing an action on a confidential issue by month
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54347
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ee
+- ce
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210201124931_g_project_management_issue_title_changed_weekly.yml b/config/metrics/counts_7d/20210201124931_g_project_management_issue_title_changed_weekly.yml
index 07b20fd2938..21612fe87f5 100644
--- a/config/metrics/counts_7d/20210201124931_g_project_management_issue_title_changed_weekly.yml
+++ b/config/metrics/counts_7d/20210201124931_g_project_management_issue_title_changed_weekly.yml
@@ -1,12 +1,13 @@
---
key_path: redis_hll_counters.issues_edit.g_project_management_issue_title_changed_weekly
-description: Distinct users count that changed issue title in a group for last recent week
+description: Distinct users count that changed issue title in a group for last recent
+ week
product_stage: plan
product_group: group::project management
product_category: issue_tracking
value_type: number
status: data_available
-milestone: 13.6
+milestone: "13.6"
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/issues/229918
time_frame: 7d
data_source: redis_hll
@@ -17,4 +18,3 @@ tier:
- free
- premium
- ultimate
-
diff --git a/config/metrics/counts_7d/20210216180422_i_search_total_weekly.yml b/config/metrics/counts_7d/20210216180422_i_search_total_weekly.yml
new file mode 100644
index 00000000000..7607950a441
--- /dev/null
+++ b/config/metrics/counts_7d/20210216180422_i_search_total_weekly.yml
@@ -0,0 +1,18 @@
+---
+key_path: redis_hll_counters.search.i_search_total_weekly
+description: Calculated unique users to perform Basic or Advanced searches by week
+product_section: enablement
+product_stage: enablement
+product_group: group::global search
+product_category: global_search
+value_type: number
+status: data_available
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ee
+- ce
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210216180429_search_total_unique_counts_weekly.yml b/config/metrics/counts_7d/20210216180429_search_total_unique_counts_weekly.yml
new file mode 100644
index 00000000000..530e1460300
--- /dev/null
+++ b/config/metrics/counts_7d/20210216180429_search_total_unique_counts_weekly.yml
@@ -0,0 +1,18 @@
+---
+key_path: redis_hll_counters.search.search_total_unique_counts_weekly
+description: Calculated unique users to perform Basic or Advanced searches by week
+product_section: enablement
+product_stage: enablement
+product_group: group::global search
+product_category: global_search
+value_type: number
+status: data_available
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ee
+- ce
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210216182134_i_testing_test_case_parsed_weekly.yml b/config/metrics/counts_7d/20210216182134_i_testing_test_case_parsed_weekly.yml
new file mode 100644
index 00000000000..f6f2bb9ab74
--- /dev/null
+++ b/config/metrics/counts_7d/20210216182134_i_testing_test_case_parsed_weekly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.testing.i_testing_test_case_parsed_weekly
+description: Internal Tracking to count number of unit tests parsed for planning of
+ future code testing features. Data available [here](https://app.periscopedata.com/app/gitlab/788674/Verify:Testing-Group-Metrics?widget=10454394&udv=0)
+product_section: ops
+product_stage: verify
+product_group: group::testing
+product_category: code_testing
+value_type: number
+status: data_available
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ee
+- ce
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_7d/20210216182158_i_testing_metrics_report_artifact_uploaders_weekly.yml b/config/metrics/counts_7d/20210216182158_i_testing_metrics_report_artifact_uploaders_weekly.yml
new file mode 100644
index 00000000000..f88b6539ceb
--- /dev/null
+++ b/config/metrics/counts_7d/20210216182158_i_testing_metrics_report_artifact_uploaders_weekly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.testing.i_testing_metrics_report_artifact_uploaders_weekly
+description: Internal Tracking to count number of unit tests parsed for planning of
+ future code testing features. Data available [here](https://app.periscopedata.com/app/gitlab/788674/Verify:Testing-Group-Metrics?widget=10454394&udv=0)
+product_section: ops
+product_stage: verify
+product_group: group::testing
+product_category: code_testing
+value_type: number
+status: data_available
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ee
+- ce
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_7d/20210301144209_o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile_weekly.yml b/config/metrics/counts_7d/20210301144209_o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile_weekly.yml
new file mode 100644
index 00000000000..6aa2fb0869b
--- /dev/null
+++ b/config/metrics/counts_7d/20210301144209_o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile_weekly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.pipeline_authoring.o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile_weekly
+description: Weekly unique user count having merge requests which contains the CI config file
+product_section: ops
+product_stage: verify
+product_group: group::pipeline authoring
+product_category: pipeline_authoring
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54707
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210302103002_i_ecosystem_slack_service_issue_notification_weekly.yml b/config/metrics/counts_7d/20210302103002_i_ecosystem_slack_service_issue_notification_weekly.yml
new file mode 100644
index 00000000000..3be97a2741e
--- /dev/null
+++ b/config/metrics/counts_7d/20210302103002_i_ecosystem_slack_service_issue_notification_weekly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_issue_notification_weekly
+description: Calculated unique users to trigger a Slack message by performing an action on an issue by week
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54347
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ee
+- ce
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210302103539_i_code_review_user_time_estimate_changed_weekly.yml b/config/metrics/counts_7d/20210302103539_i_code_review_user_time_estimate_changed_weekly.yml
new file mode 100644
index 00000000000..fb47deaba92
--- /dev/null
+++ b/config/metrics/counts_7d/20210302103539_i_code_review_user_time_estimate_changed_weekly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_time_estimate_changed_weekly
+description: Count of unique users per week who changed time estimate of a MR
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55046
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210302103615_i_code_review_user_time_spent_changed_weekly.yml b/config/metrics/counts_7d/20210302103615_i_code_review_user_time_spent_changed_weekly.yml
new file mode 100644
index 00000000000..91c88c00af8
--- /dev/null
+++ b/config/metrics/counts_7d/20210302103615_i_code_review_user_time_spent_changed_weekly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_time_spent_changed_weekly
+description: Count of unique users per week who changed time spent on a MR
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55046
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210302103629_i_ecosystem_slack_service_push_notification_weekly.yml b/config/metrics/counts_7d/20210302103629_i_ecosystem_slack_service_push_notification_weekly.yml
new file mode 100644
index 00000000000..8c32af239d3
--- /dev/null
+++ b/config/metrics/counts_7d/20210302103629_i_ecosystem_slack_service_push_notification_weekly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_push_notification_weekly
+description: Calculated unique users to trigger a Slack message by performing a Git push by week
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54347
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ee
+- ce
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210302103755_i_ecosystem_slack_service_deployment_notification_weekly.yml b/config/metrics/counts_7d/20210302103755_i_ecosystem_slack_service_deployment_notification_weekly.yml
new file mode 100644
index 00000000000..de86af98b29
--- /dev/null
+++ b/config/metrics/counts_7d/20210302103755_i_ecosystem_slack_service_deployment_notification_weekly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_deployment_notification_weekly
+description: Calculated unique users to trigger a Slack message by performing a deployment by week
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54347
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ee
+- ce
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210302103907_i_ecosystem_slack_service_wiki_page_notification_weekly.yml b/config/metrics/counts_7d/20210302103907_i_ecosystem_slack_service_wiki_page_notification_weekly.yml
new file mode 100644
index 00000000000..6de7db3685f
--- /dev/null
+++ b/config/metrics/counts_7d/20210302103907_i_ecosystem_slack_service_wiki_page_notification_weekly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_wiki_page_notification_weekly
+description: Calculated unique users to trigger a Slack message by performing an action on a wiki page by week
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54347
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ee
+- ce
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210302104007_i_ecosystem_slack_service_merge_request_notification_weekly.yml b/config/metrics/counts_7d/20210302104007_i_ecosystem_slack_service_merge_request_notification_weekly.yml
new file mode 100644
index 00000000000..c93e680d9f2
--- /dev/null
+++ b/config/metrics/counts_7d/20210302104007_i_ecosystem_slack_service_merge_request_notification_weekly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_merge_request_notification_weekly
+description: Calculated unique users to trigger a Slack message by performing an action on a merge request by week
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54347
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ee
+- ce
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210302104047_i_ecosystem_slack_service_note_notification_weekly.yml b/config/metrics/counts_7d/20210302104047_i_ecosystem_slack_service_note_notification_weekly.yml
new file mode 100644
index 00000000000..d127c097baa
--- /dev/null
+++ b/config/metrics/counts_7d/20210302104047_i_ecosystem_slack_service_note_notification_weekly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_note_notification_weekly
+description: Calculated unique users to trigger a Slack message by creating a note by week
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54347
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ee
+- ce
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210302104144_i_ecosystem_slack_service_tag_push_notification_weekly.yml b/config/metrics/counts_7d/20210302104144_i_ecosystem_slack_service_tag_push_notification_weekly.yml
new file mode 100644
index 00000000000..71d5fe8497f
--- /dev/null
+++ b/config/metrics/counts_7d/20210302104144_i_ecosystem_slack_service_tag_push_notification_weekly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_tag_push_notification_weekly
+description: Calculated unique users to trigger a Slack message by performing a tag push by week
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54347
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ee
+- ce
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210302104556_i_ecosystem_slack_service_confidential_note_notification_weekly.yml b/config/metrics/counts_7d/20210302104556_i_ecosystem_slack_service_confidential_note_notification_weekly.yml
new file mode 100644
index 00000000000..0e2c06609c4
--- /dev/null
+++ b/config/metrics/counts_7d/20210302104556_i_ecosystem_slack_service_confidential_note_notification_weekly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_confidential_note_notification_weekly
+description: Calculated unique users to trigger a Slack message by creating a confidential note by week
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54347
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ee
+- ce
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210302104814_i_ecosystem_slack_service_confidential_issue_notification_weekly.yml b/config/metrics/counts_7d/20210302104814_i_ecosystem_slack_service_confidential_issue_notification_weekly.yml
new file mode 100644
index 00000000000..3fe42c1240a
--- /dev/null
+++ b/config/metrics/counts_7d/20210302104814_i_ecosystem_slack_service_confidential_issue_notification_weekly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_confidential_issue_notification_weekly
+description: Calculated unique users to trigger a Slack message by performing an action on a confidential issue by week
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54347
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ee
+- ce
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210302105258_i_code_review_user_mr_discussion_unlocked_weekly.yml b/config/metrics/counts_7d/20210302105258_i_code_review_user_mr_discussion_unlocked_weekly.yml
new file mode 100644
index 00000000000..80471ed836a
--- /dev/null
+++ b/config/metrics/counts_7d/20210302105258_i_code_review_user_mr_discussion_unlocked_weekly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_mr_discussion_unlocked_weekly
+description: Count of unique users per week who unlocked a MR
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55069
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210302105318_i_code_review_user_mr_discussion_locked_weekly.yml b/config/metrics/counts_7d/20210302105318_i_code_review_user_mr_discussion_locked_weekly.yml
new file mode 100644
index 00000000000..2295fb75a48
--- /dev/null
+++ b/config/metrics/counts_7d/20210302105318_i_code_review_user_mr_discussion_locked_weekly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_mr_discussion_locked_weekly
+description: Count of unique users per week who locked a MR
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55069
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210302110403_i_code_review_user_milestone_changed_weekly.yml b/config/metrics/counts_7d/20210302110403_i_code_review_user_milestone_changed_weekly.yml
new file mode 100644
index 00000000000..2f158edf0af
--- /dev/null
+++ b/config/metrics/counts_7d/20210302110403_i_code_review_user_milestone_changed_weekly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_milestone_changed_weekly
+description: Count of unique users per week who changed milestone of a MR
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55484
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210302110548_i_code_review_user_labels_changed_weekly.yml b/config/metrics/counts_7d/20210302110548_i_code_review_user_labels_changed_weekly.yml
new file mode 100644
index 00000000000..14710eb040a
--- /dev/null
+++ b/config/metrics/counts_7d/20210302110548_i_code_review_user_labels_changed_weekly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_labels_changed_weekly
+description: Count of unique users per week who changed labels of a MR
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55484
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210302114202_i_code_review_user_assignees_changed_weekly.yml b/config/metrics/counts_7d/20210302114202_i_code_review_user_assignees_changed_weekly.yml
new file mode 100644
index 00000000000..334114dd64c
--- /dev/null
+++ b/config/metrics/counts_7d/20210302114202_i_code_review_user_assignees_changed_weekly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_assignees_changed_weekly
+description: Count of unique users per week who changed assignees of a MR
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55486
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210302114235_i_code_review_user_reviewers_changed_weekly.yml b/config/metrics/counts_7d/20210302114235_i_code_review_user_reviewers_changed_weekly.yml
new file mode 100644
index 00000000000..a70d0b6204d
--- /dev/null
+++ b/config/metrics/counts_7d/20210302114235_i_code_review_user_reviewers_changed_weekly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_reviewers_changed_weekly
+description: Count of unique users per week who changed reviewers of a MR
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55486
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_all/20210201124934_deployments.yml b/config/metrics/counts_all/20210201124934_deployments.yml
index 8b93eaf989d..53b31b2b9ac 100644
--- a/config/metrics/counts_all/20210201124934_deployments.yml
+++ b/config/metrics/counts_all/20210201124934_deployments.yml
@@ -6,7 +6,7 @@ product_stage: release
product_group: group::ops release
value_type: number
status: data_available
-milestone: 8.12
+milestone: "8.12"
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/735
time_frame: all
data_source: database
diff --git a/config/metrics/counts_all/20210204124930_servers.yml b/config/metrics/counts_all/20210204124930_servers.yml
index 3103797ccce..9732b34c771 100644
--- a/config/metrics/counts_all/20210204124930_servers.yml
+++ b/config/metrics/counts_all/20210204124930_servers.yml
@@ -9,6 +9,8 @@ value_type: number
status: data_available
time_frame: all
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/counts_all/20210204124932_clusters.yml b/config/metrics/counts_all/20210204124932_clusters.yml
index 1bb86905502..c1ada3babcd 100644
--- a/config/metrics/counts_all/20210204124932_clusters.yml
+++ b/config/metrics/counts_all/20210204124932_clusters.yml
@@ -9,6 +9,8 @@ value_type: number
status: data_available
time_frame: all
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/counts_all/20210216174826_ldap_users.yml b/config/metrics/counts_all/20210216174826_ldap_users.yml
new file mode 100644
index 00000000000..34892c7ce90
--- /dev/null
+++ b/config/metrics/counts_all/20210216174826_ldap_users.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.ldap_users
+description: Number of users that are linked to LDAP
+product_section: dev
+product_stage: manage
+product_group: group::access
+product_category: authentication_and_authorization
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174829_smtp_server.yml b/config/metrics/counts_all/20210216174829_smtp_server.yml
new file mode 100644
index 00000000000..b60db7728c4
--- /dev/null
+++ b/config/metrics/counts_all/20210216174829_smtp_server.yml
@@ -0,0 +1,19 @@
+---
+key_path: mail.smtp_server
+description: The value of the SMTP server that is used
+product_section: growth
+product_stage:
+product_group: group::acquisition
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174832_cycle_analytics_views.yml b/config/metrics/counts_all/20210216174832_cycle_analytics_views.yml
new file mode 100644
index 00000000000..6885d8971d1
--- /dev/null
+++ b/config/metrics/counts_all/20210216174832_cycle_analytics_views.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.cycle_analytics_views
+description:
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174834_productivity_analytics_views.yml b/config/metrics/counts_all/20210216174834_productivity_analytics_views.yml
new file mode 100644
index 00000000000..03271ea0f13
--- /dev/null
+++ b/config/metrics/counts_all/20210216174834_productivity_analytics_views.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.productivity_analytics_views
+description:
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174836_g_analytics_contribution.yml b/config/metrics/counts_all/20210216174836_g_analytics_contribution.yml
new file mode 100644
index 00000000000..a56358e7d13
--- /dev/null
+++ b/config/metrics/counts_all/20210216174836_g_analytics_contribution.yml
@@ -0,0 +1,16 @@
+---
+key_path: analytics_unique_visits.g_analytics_contribution
+description: Visits to /groups/:group/-/contribution_analytics
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174838_g_analytics_insights.yml b/config/metrics/counts_all/20210216174838_g_analytics_insights.yml
new file mode 100644
index 00000000000..72197fa6f29
--- /dev/null
+++ b/config/metrics/counts_all/20210216174838_g_analytics_insights.yml
@@ -0,0 +1,16 @@
+---
+key_path: analytics_unique_visits.g_analytics_insights
+description: Visits to /groups/:group/-/insights
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174840_g_analytics_issues.yml b/config/metrics/counts_all/20210216174840_g_analytics_issues.yml
new file mode 100644
index 00000000000..dc042c141e3
--- /dev/null
+++ b/config/metrics/counts_all/20210216174840_g_analytics_issues.yml
@@ -0,0 +1,16 @@
+---
+key_path: analytics_unique_visits.g_analytics_issues
+description: Visits to /groups/:group/-/issues_analytics
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174842_g_analytics_productivity.yml b/config/metrics/counts_all/20210216174842_g_analytics_productivity.yml
new file mode 100644
index 00000000000..eeab6200458
--- /dev/null
+++ b/config/metrics/counts_all/20210216174842_g_analytics_productivity.yml
@@ -0,0 +1,16 @@
+---
+key_path: analytics_unique_visits.g_analytics_productivity
+description: Visits to /groups/:group/-/analytics/productivity_analytics
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174844_g_analytics_valuestream.yml b/config/metrics/counts_all/20210216174844_g_analytics_valuestream.yml
new file mode 100644
index 00000000000..92399204faa
--- /dev/null
+++ b/config/metrics/counts_all/20210216174844_g_analytics_valuestream.yml
@@ -0,0 +1,16 @@
+---
+key_path: analytics_unique_visits.g_analytics_valuestream
+description: Visits to /groups/:group/-/analytics/value_stream_analytics
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174846_p_analytics_pipelines.yml b/config/metrics/counts_all/20210216174846_p_analytics_pipelines.yml
new file mode 100644
index 00000000000..8138873e882
--- /dev/null
+++ b/config/metrics/counts_all/20210216174846_p_analytics_pipelines.yml
@@ -0,0 +1,16 @@
+---
+key_path: analytics_unique_visits.p_analytics_pipelines
+description: Visits to /:group/:project/pipelines/charts
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174848_p_analytics_code_reviews.yml b/config/metrics/counts_all/20210216174848_p_analytics_code_reviews.yml
new file mode 100644
index 00000000000..ac00c26a5ee
--- /dev/null
+++ b/config/metrics/counts_all/20210216174848_p_analytics_code_reviews.yml
@@ -0,0 +1,16 @@
+---
+key_path: analytics_unique_visits.p_analytics_code_reviews
+description: Visits to /:group/:project/-/analytics/code_reviews
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174850_p_analytics_valuestream.yml b/config/metrics/counts_all/20210216174850_p_analytics_valuestream.yml
new file mode 100644
index 00000000000..b2802ab9084
--- /dev/null
+++ b/config/metrics/counts_all/20210216174850_p_analytics_valuestream.yml
@@ -0,0 +1,16 @@
+---
+key_path: analytics_unique_visits.p_analytics_valuestream
+description: Visits to /:group/:project/-/value_stream_analytics
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174852_p_analytics_insights.yml b/config/metrics/counts_all/20210216174852_p_analytics_insights.yml
new file mode 100644
index 00000000000..48c7e333b2c
--- /dev/null
+++ b/config/metrics/counts_all/20210216174852_p_analytics_insights.yml
@@ -0,0 +1,16 @@
+---
+key_path: analytics_unique_visits.p_analytics_insights
+description: Visits to /:group/:project/insights
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174854_p_analytics_issues.yml b/config/metrics/counts_all/20210216174854_p_analytics_issues.yml
new file mode 100644
index 00000000000..86f7634ea32
--- /dev/null
+++ b/config/metrics/counts_all/20210216174854_p_analytics_issues.yml
@@ -0,0 +1,16 @@
+---
+key_path: analytics_unique_visits.p_analytics_issues
+description: Visits to /:group/:project/-/analytics/issues_analytics
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174856_p_analytics_repo.yml b/config/metrics/counts_all/20210216174856_p_analytics_repo.yml
new file mode 100644
index 00000000000..275cdd1e45b
--- /dev/null
+++ b/config/metrics/counts_all/20210216174856_p_analytics_repo.yml
@@ -0,0 +1,16 @@
+---
+key_path: analytics_unique_visits.p_analytics_repo
+description: Visits to /:group/:project/-/graphs/master/charts
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174858_i_analytics_cohorts.yml b/config/metrics/counts_all/20210216174858_i_analytics_cohorts.yml
new file mode 100644
index 00000000000..14ff37dd4ad
--- /dev/null
+++ b/config/metrics/counts_all/20210216174858_i_analytics_cohorts.yml
@@ -0,0 +1,16 @@
+---
+key_path: analytics_unique_visits.i_analytics_cohorts
+description: Visits to /-/instance_statistics/cohorts
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174900_i_analytics_dev_ops_score.yml b/config/metrics/counts_all/20210216174900_i_analytics_dev_ops_score.yml
new file mode 100644
index 00000000000..586b9a15b70
--- /dev/null
+++ b/config/metrics/counts_all/20210216174900_i_analytics_dev_ops_score.yml
@@ -0,0 +1,16 @@
+---
+key_path: analytics_unique_visits.i_analytics_dev_ops_score
+description: Visits to /-/instance_statistics/dev_ops_score
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174902_g_analytics_merge_request.yml b/config/metrics/counts_all/20210216174902_g_analytics_merge_request.yml
new file mode 100644
index 00000000000..537a1c5dae8
--- /dev/null
+++ b/config/metrics/counts_all/20210216174902_g_analytics_merge_request.yml
@@ -0,0 +1,16 @@
+---
+key_path: analytics_unique_visits.g_analytics_merge_request
+description: Visits to /groups/:group/-/analytics/merge_request_analytics
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174904_p_analytics_merge_request.yml b/config/metrics/counts_all/20210216174904_p_analytics_merge_request.yml
new file mode 100644
index 00000000000..f8d509c9130
--- /dev/null
+++ b/config/metrics/counts_all/20210216174904_p_analytics_merge_request.yml
@@ -0,0 +1,16 @@
+---
+key_path: analytics_unique_visits.p_analytics_merge_request
+description: Visits to /:group/:project/-/analytics/merge_request_analytics
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174906_i_analytics_instance_statistics.yml b/config/metrics/counts_all/20210216174906_i_analytics_instance_statistics.yml
new file mode 100644
index 00000000000..e834d6ae823
--- /dev/null
+++ b/config/metrics/counts_all/20210216174906_i_analytics_instance_statistics.yml
@@ -0,0 +1,16 @@
+---
+key_path: analytics_unique_visits.i_analytics_instance_statistics
+description: Visit to /admin/instance_statistics
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174908_analytics_unique_visits_for_any_target.yml b/config/metrics/counts_all/20210216174908_analytics_unique_visits_for_any_target.yml
new file mode 100644
index 00000000000..d4d010ab419
--- /dev/null
+++ b/config/metrics/counts_all/20210216174908_analytics_unique_visits_for_any_target.yml
@@ -0,0 +1,16 @@
+---
+key_path: analytics_unique_visits.analytics_unique_visits_for_any_target
+description: Visits to any of the pages listed above per week
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175019_projects_with_prometheus_alerts.yml b/config/metrics/counts_all/20210216175019_projects_with_prometheus_alerts.yml
new file mode 100644
index 00000000000..3b2561bae52
--- /dev/null
+++ b/config/metrics/counts_all/20210216175019_projects_with_prometheus_alerts.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_with_prometheus_alerts
+description: Projects with Prometheus alerting enabled
+product_section: ops
+product_stage: monitor
+product_group: group::apm
+product_category: metrics
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175021_pod_logs_usages_total.yml b/config/metrics/counts_all/20210216175021_pod_logs_usages_total.yml
new file mode 100644
index 00000000000..ad9a52c7ee7
--- /dev/null
+++ b/config/metrics/counts_all/20210216175021_pod_logs_usages_total.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.pod_logs_usages_total
+description: Count the total number of log views
+product_section: ops
+product_stage: monitor
+product_group: group::apm
+product_category: logging
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175024_service_desk_enabled_projects.yml b/config/metrics/counts_all/20210216175024_service_desk_enabled_projects.yml
new file mode 100644
index 00000000000..8e1129883ae
--- /dev/null
+++ b/config/metrics/counts_all/20210216175024_service_desk_enabled_projects.yml
@@ -0,0 +1,17 @@
+---
+key_path: counts.service_desk_enabled_projects
+description: Count of service desk enabled projects
+product_section: dev
+product_stage: plan
+product_group: group::certify
+product_category: service_desk
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175026_service_desk_issues.yml b/config/metrics/counts_all/20210216175026_service_desk_issues.yml
new file mode 100644
index 00000000000..b852ae8b62f
--- /dev/null
+++ b/config/metrics/counts_all/20210216175026_service_desk_issues.yml
@@ -0,0 +1,17 @@
+---
+key_path: counts.service_desk_issues
+description: Count of service desk issues
+product_section: dev
+product_stage: plan
+product_group: group::certify
+product_category: service_desk
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175028_requirements_created.yml b/config/metrics/counts_all/20210216175028_requirements_created.yml
new file mode 100644
index 00000000000..74780f43c5a
--- /dev/null
+++ b/config/metrics/counts_all/20210216175028_requirements_created.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.requirements_created
+description: Count of requirements created
+product_section: dev
+product_stage: plan
+product_group: group::certify
+product_category: requirements_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175037_suggestions.yml b/config/metrics/counts_all/20210216175037_suggestions.yml
new file mode 100644
index 00000000000..98ec2bd6d7c
--- /dev/null
+++ b/config/metrics/counts_all/20210216175037_suggestions.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.suggestions
+description:
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175039_merge_requests.yml b/config/metrics/counts_all/20210216175039_merge_requests.yml
new file mode 100644
index 00000000000..3c17daf2622
--- /dev/null
+++ b/config/metrics/counts_all/20210216175039_merge_requests.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.merge_requests
+description:
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175041_merge_request_comment.yml b/config/metrics/counts_all/20210216175041_merge_request_comment.yml
new file mode 100644
index 00000000000..382110c11db
--- /dev/null
+++ b/config/metrics/counts_all/20210216175041_merge_request_comment.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.merge_request_comment
+description:
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175043_merge_request_create.yml b/config/metrics/counts_all/20210216175043_merge_request_create.yml
new file mode 100644
index 00000000000..39ce0ef072a
--- /dev/null
+++ b/config/metrics/counts_all/20210216175043_merge_request_create.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.merge_request_create
+description:
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175045_merge_requests.yml b/config/metrics/counts_all/20210216175045_merge_requests.yml
new file mode 100644
index 00000000000..47966f197e4
--- /dev/null
+++ b/config/metrics/counts_all/20210216175045_merge_requests.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.create.merge_requests
+description:
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175053_suggestions.yml b/config/metrics/counts_all/20210216175053_suggestions.yml
new file mode 100644
index 00000000000..15a846c49d8
--- /dev/null
+++ b/config/metrics/counts_all/20210216175053_suggestions.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.create.suggestions
+description:
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175206_merged_merge_requests_using_approval_rules.yml b/config/metrics/counts_all/20210216175206_merged_merge_requests_using_approval_rules.yml
new file mode 100644
index 00000000000..e0c55e89f30
--- /dev/null
+++ b/config/metrics/counts_all/20210216175206_merged_merge_requests_using_approval_rules.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.merged_merge_requests_using_approval_rules
+description: Count of merge requests merged using approval rules
+product_section: dev
+product_stage: manage
+product_group: group::compliance
+product_category: compliance_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175229_auto_devops_enabled.yml b/config/metrics/counts_all/20210216175229_auto_devops_enabled.yml
new file mode 100644
index 00000000000..2f134ac7076
--- /dev/null
+++ b/config/metrics/counts_all/20210216175229_auto_devops_enabled.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.auto_devops_enabled
+description: Projects with Auto DevOps template enabled
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: auto_devops
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175231_auto_devops_disabled.yml b/config/metrics/counts_all/20210216175231_auto_devops_disabled.yml
new file mode 100644
index 00000000000..863ea73cbee
--- /dev/null
+++ b/config/metrics/counts_all/20210216175231_auto_devops_disabled.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.auto_devops_disabled
+description: Projects with Auto DevOps template disabled
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: auto_devops
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175232_clusters.yml b/config/metrics/counts_all/20210216175232_clusters.yml
new file mode 100644
index 00000000000..2d3689a0e8b
--- /dev/null
+++ b/config/metrics/counts_all/20210216175232_clusters.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.clusters
+description: Total GitLab Managed clusters both enabled and disabled
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175234_clusters_enabled.yml b/config/metrics/counts_all/20210216175234_clusters_enabled.yml
new file mode 100644
index 00000000000..7aad6d73bff
--- /dev/null
+++ b/config/metrics/counts_all/20210216175234_clusters_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.clusters_enabled
+description: Total GitLab Managed clusters currently enabled
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175236_project_clusters_enabled.yml b/config/metrics/counts_all/20210216175236_project_clusters_enabled.yml
new file mode 100644
index 00000000000..3e4d16b313e
--- /dev/null
+++ b/config/metrics/counts_all/20210216175236_project_clusters_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.project_clusters_enabled
+description: Total GitLab Managed clusters attached to projects
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175238_group_clusters_enabled.yml b/config/metrics/counts_all/20210216175238_group_clusters_enabled.yml
new file mode 100644
index 00000000000..ccb13f9cbd0
--- /dev/null
+++ b/config/metrics/counts_all/20210216175238_group_clusters_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.group_clusters_enabled
+description: Total GitLab Managed clusters attached to groups
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175240_instance_clusters_enabled.yml b/config/metrics/counts_all/20210216175240_instance_clusters_enabled.yml
new file mode 100644
index 00000000000..d73499479b1
--- /dev/null
+++ b/config/metrics/counts_all/20210216175240_instance_clusters_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instance_clusters_enabled
+description: Total GitLab Managed clusters attached to the instance
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175242_clusters_disabled.yml b/config/metrics/counts_all/20210216175242_clusters_disabled.yml
new file mode 100644
index 00000000000..d1a14f8f3a5
--- /dev/null
+++ b/config/metrics/counts_all/20210216175242_clusters_disabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.clusters_disabled
+description: Total GitLab Managed disabled clusters
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175244_project_clusters_disabled.yml b/config/metrics/counts_all/20210216175244_project_clusters_disabled.yml
new file mode 100644
index 00000000000..6d83aa114c5
--- /dev/null
+++ b/config/metrics/counts_all/20210216175244_project_clusters_disabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.project_clusters_disabled
+description: Total GitLab Managed disabled clusters previously attached to projects
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175246_group_clusters_disabled.yml b/config/metrics/counts_all/20210216175246_group_clusters_disabled.yml
new file mode 100644
index 00000000000..696c3ef7703
--- /dev/null
+++ b/config/metrics/counts_all/20210216175246_group_clusters_disabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.group_clusters_disabled
+description: Total GitLab Managed disabled clusters previously attached to groups
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175248_instance_clusters_disabled.yml b/config/metrics/counts_all/20210216175248_instance_clusters_disabled.yml
new file mode 100644
index 00000000000..f138e81e8a1
--- /dev/null
+++ b/config/metrics/counts_all/20210216175248_instance_clusters_disabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instance_clusters_disabled
+description: Total GitLab Managed disabled clusters previously attached to the instance
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175250_clusters_platforms_eks.yml b/config/metrics/counts_all/20210216175250_clusters_platforms_eks.yml
new file mode 100644
index 00000000000..3a876aace23
--- /dev/null
+++ b/config/metrics/counts_all/20210216175250_clusters_platforms_eks.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.clusters_platforms_eks
+description: Total GitLab Managed clusters provisioned with GitLab on AWS EKS
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175251_clusters_platforms_gke.yml b/config/metrics/counts_all/20210216175251_clusters_platforms_gke.yml
new file mode 100644
index 00000000000..6c0d06f67a8
--- /dev/null
+++ b/config/metrics/counts_all/20210216175251_clusters_platforms_gke.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.clusters_platforms_gke
+description: Total GitLab Managed clusters provisioned with GitLab on GCE GKE
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175253_clusters_platforms_user.yml b/config/metrics/counts_all/20210216175253_clusters_platforms_user.yml
new file mode 100644
index 00000000000..c0ec787ba32
--- /dev/null
+++ b/config/metrics/counts_all/20210216175253_clusters_platforms_user.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.clusters_platforms_user
+description: Total GitLab Managed clusters that are user provisioned
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175255_clusters_applications_helm.yml b/config/metrics/counts_all/20210216175255_clusters_applications_helm.yml
new file mode 100644
index 00000000000..df3791476a6
--- /dev/null
+++ b/config/metrics/counts_all/20210216175255_clusters_applications_helm.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.clusters_applications_helm
+description: Total GitLab Managed clusters with GitLab Managed App:Helm enabled
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175257_clusters_applications_ingress.yml b/config/metrics/counts_all/20210216175257_clusters_applications_ingress.yml
new file mode 100644
index 00000000000..312b3a0959a
--- /dev/null
+++ b/config/metrics/counts_all/20210216175257_clusters_applications_ingress.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.clusters_applications_ingress
+description: Total GitLab Managed clusters with GitLab Managed App:Ingress installed
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175259_clusters_applications_cert_managers.yml b/config/metrics/counts_all/20210216175259_clusters_applications_cert_managers.yml
new file mode 100644
index 00000000000..2850bf19272
--- /dev/null
+++ b/config/metrics/counts_all/20210216175259_clusters_applications_cert_managers.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.clusters_applications_cert_managers
+description: Total GitLab Managed clusters with GitLab Managed App:Cert Manager installed
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175301_clusters_applications_crossplane.yml b/config/metrics/counts_all/20210216175301_clusters_applications_crossplane.yml
new file mode 100644
index 00000000000..9a51decb60e
--- /dev/null
+++ b/config/metrics/counts_all/20210216175301_clusters_applications_crossplane.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.clusters_applications_crossplane
+description: Total GitLab Managed clusters with GitLab Managed App:Crossplane installed
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175303_clusters_applications_prometheus.yml b/config/metrics/counts_all/20210216175303_clusters_applications_prometheus.yml
new file mode 100644
index 00000000000..11acda094ea
--- /dev/null
+++ b/config/metrics/counts_all/20210216175303_clusters_applications_prometheus.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.clusters_applications_prometheus
+description: Total GitLab Managed clusters with GitLab Managed App:Prometheus installed
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175305_clusters_applications_runner.yml b/config/metrics/counts_all/20210216175305_clusters_applications_runner.yml
new file mode 100644
index 00000000000..3bab0578a71
--- /dev/null
+++ b/config/metrics/counts_all/20210216175305_clusters_applications_runner.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.clusters_applications_runner
+description: Total GitLab Managed clusters with GitLab Managed App:Runner installed
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175307_clusters_applications_knative.yml b/config/metrics/counts_all/20210216175307_clusters_applications_knative.yml
new file mode 100644
index 00000000000..b8fb5c94cef
--- /dev/null
+++ b/config/metrics/counts_all/20210216175307_clusters_applications_knative.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.clusters_applications_knative
+description: Total GitLab Managed clusters with GitLab Managed App:Knative installed
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175309_clusters_applications_elastic_stack.yml b/config/metrics/counts_all/20210216175309_clusters_applications_elastic_stack.yml
new file mode 100644
index 00000000000..547631db2f1
--- /dev/null
+++ b/config/metrics/counts_all/20210216175309_clusters_applications_elastic_stack.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.clusters_applications_elastic_stack
+description: Total GitLab Managed clusters with GitLab Managed App:Elastic Stack installed
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175310_clusters_applications_jupyter.yml b/config/metrics/counts_all/20210216175310_clusters_applications_jupyter.yml
new file mode 100644
index 00000000000..c7c7f8c9adb
--- /dev/null
+++ b/config/metrics/counts_all/20210216175310_clusters_applications_jupyter.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.clusters_applications_jupyter
+description: Total GitLab Managed clusters with GitLab Managed App:Jupyter installed
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175312_clusters_applications_cilium.yml b/config/metrics/counts_all/20210216175312_clusters_applications_cilium.yml
new file mode 100644
index 00000000000..fc86315d645
--- /dev/null
+++ b/config/metrics/counts_all/20210216175312_clusters_applications_cilium.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.clusters_applications_cilium
+description: Total GitLab Managed clusters with GitLab Managed App:Cilium installed
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175314_clusters_management_project.yml b/config/metrics/counts_all/20210216175314_clusters_management_project.yml
new file mode 100644
index 00000000000..38e3c790cec
--- /dev/null
+++ b/config/metrics/counts_all/20210216175314_clusters_management_project.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.clusters_management_project
+description: Total GitLab Managed clusters with defined cluster management project
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175320_projects_with_terraform_reports.yml b/config/metrics/counts_all/20210216175320_projects_with_terraform_reports.yml
new file mode 100644
index 00000000000..8e48a723caa
--- /dev/null
+++ b/config/metrics/counts_all/20210216175320_projects_with_terraform_reports.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_with_terraform_reports
+description: Count of projects with Terraform MR reports
+product_section: ops
+product_stage: configure
+product_group: group::configure
+product_category: infrastructure_as_code
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175322_projects_with_terraform_states.yml b/config/metrics/counts_all/20210216175322_projects_with_terraform_states.yml
new file mode 100644
index 00000000000..9854006b1dc
--- /dev/null
+++ b/config/metrics/counts_all/20210216175322_projects_with_terraform_states.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_with_terraform_states
+description: Count of projects with GitLab Managed Terraform State
+product_section: ops
+product_stage: configure
+product_group: group::configure
+product_category: infrastructure_as_code
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175324_terraform_reports.yml b/config/metrics/counts_all/20210216175324_terraform_reports.yml
new file mode 100644
index 00000000000..4b83d4c944c
--- /dev/null
+++ b/config/metrics/counts_all/20210216175324_terraform_reports.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.terraform_reports
+description: Count of Terraform MR reports generated
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: infrastructure_as_code
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175326_terraform_states.yml b/config/metrics/counts_all/20210216175326_terraform_states.yml
new file mode 100644
index 00000000000..c9696eaf26e
--- /dev/null
+++ b/config/metrics/counts_all/20210216175326_terraform_states.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.terraform_states
+description: Count of GitLab Managed Terraform States used
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: infrastructure_as_code
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175329_clusters_applications_cert_managers.yml b/config/metrics/counts_all/20210216175329_clusters_applications_cert_managers.yml
new file mode 100644
index 00000000000..c6057167283
--- /dev/null
+++ b/config/metrics/counts_all/20210216175329_clusters_applications_cert_managers.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.configure.clusters_applications_cert_managers
+description: Total GitLab Managed clusters with GitLab Managed App:Cert Manager installed
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175331_clusters_applications_helm.yml b/config/metrics/counts_all/20210216175331_clusters_applications_helm.yml
new file mode 100644
index 00000000000..3f7814f7fea
--- /dev/null
+++ b/config/metrics/counts_all/20210216175331_clusters_applications_helm.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.configure.clusters_applications_helm
+description: Total GitLab Managed clusters with GitLab Managed App:Helm enabled
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175333_clusters_applications_ingress.yml b/config/metrics/counts_all/20210216175333_clusters_applications_ingress.yml
new file mode 100644
index 00000000000..fd0cd902e8c
--- /dev/null
+++ b/config/metrics/counts_all/20210216175333_clusters_applications_ingress.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.configure.clusters_applications_ingress
+description: Total GitLab Managed clusters with GitLab Managed App:Ingress installed
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175335_clusters_applications_knative.yml b/config/metrics/counts_all/20210216175335_clusters_applications_knative.yml
new file mode 100644
index 00000000000..8774a62b475
--- /dev/null
+++ b/config/metrics/counts_all/20210216175335_clusters_applications_knative.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.configure.clusters_applications_knative
+description: Total GitLab Managed clusters with GitLab Managed App:Knative installed
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175337_clusters_management_project.yml b/config/metrics/counts_all/20210216175337_clusters_management_project.yml
new file mode 100644
index 00000000000..ada40d5fcfa
--- /dev/null
+++ b/config/metrics/counts_all/20210216175337_clusters_management_project.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.configure.clusters_management_project
+description: Total GitLab Managed clusters with defined cluster management project
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175339_clusters_disabled.yml b/config/metrics/counts_all/20210216175339_clusters_disabled.yml
new file mode 100644
index 00000000000..35e94edf509
--- /dev/null
+++ b/config/metrics/counts_all/20210216175339_clusters_disabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.configure.clusters_disabled
+description: Total GitLab Managed disabled clusters
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175341_clusters_enabled.yml b/config/metrics/counts_all/20210216175341_clusters_enabled.yml
new file mode 100644
index 00000000000..c2a921eeb2b
--- /dev/null
+++ b/config/metrics/counts_all/20210216175341_clusters_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.configure.clusters_enabled
+description: Total GitLab Managed clusters currently enabled
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175343_clusters_platforms_gke.yml b/config/metrics/counts_all/20210216175343_clusters_platforms_gke.yml
new file mode 100644
index 00000000000..ab180d2102d
--- /dev/null
+++ b/config/metrics/counts_all/20210216175343_clusters_platforms_gke.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.configure.clusters_platforms_gke
+description: Total GitLab Managed clusters provisioned with GitLab on GCE GKE
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175345_clusters_platforms_eks.yml b/config/metrics/counts_all/20210216175345_clusters_platforms_eks.yml
new file mode 100644
index 00000000000..354cacc46a9
--- /dev/null
+++ b/config/metrics/counts_all/20210216175345_clusters_platforms_eks.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.configure.clusters_platforms_eks
+description: Total GitLab Managed clusters provisioned with GitLab on AWS EKS
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175346_clusters_platforms_user.yml b/config/metrics/counts_all/20210216175346_clusters_platforms_user.yml
new file mode 100644
index 00000000000..2c5386ad7b5
--- /dev/null
+++ b/config/metrics/counts_all/20210216175346_clusters_platforms_user.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.configure.clusters_platforms_user
+description: Total GitLab Managed clusters that are user provisioned
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175348_instance_clusters_disabled.yml b/config/metrics/counts_all/20210216175348_instance_clusters_disabled.yml
new file mode 100644
index 00000000000..6b215140597
--- /dev/null
+++ b/config/metrics/counts_all/20210216175348_instance_clusters_disabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.configure.instance_clusters_disabled
+description: Total GitLab Managed disabled clusters attached to the instance
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175350_instance_clusters_enabled.yml b/config/metrics/counts_all/20210216175350_instance_clusters_enabled.yml
new file mode 100644
index 00000000000..3b43c90e061
--- /dev/null
+++ b/config/metrics/counts_all/20210216175350_instance_clusters_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.configure.instance_clusters_enabled
+description: Total GitLab Managed enabled clusters attached to the instance
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175352_group_clusters_disabled.yml b/config/metrics/counts_all/20210216175352_group_clusters_disabled.yml
new file mode 100644
index 00000000000..7ee008a09bc
--- /dev/null
+++ b/config/metrics/counts_all/20210216175352_group_clusters_disabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.configure.group_clusters_disabled
+description: Total GitLab Managed disabled clusters attached to groups
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175354_group_clusters_enabled.yml b/config/metrics/counts_all/20210216175354_group_clusters_enabled.yml
new file mode 100644
index 00000000000..8a251f40347
--- /dev/null
+++ b/config/metrics/counts_all/20210216175354_group_clusters_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.configure.group_clusters_enabled
+description: Total GitLab Managed enabled clusters attached to groups
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175356_project_clusters_disabled.yml b/config/metrics/counts_all/20210216175356_project_clusters_disabled.yml
new file mode 100644
index 00000000000..3dcecf724d2
--- /dev/null
+++ b/config/metrics/counts_all/20210216175356_project_clusters_disabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.configure.project_clusters_disabled
+description: Total GitLab Managed disabled clusters attached to projects
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175358_project_clusters_enabled.yml b/config/metrics/counts_all/20210216175358_project_clusters_enabled.yml
new file mode 100644
index 00000000000..4fec74ce9fa
--- /dev/null
+++ b/config/metrics/counts_all/20210216175358_project_clusters_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.configure.project_clusters_enabled
+description: Total GitLab Managed enabled clusters attached to projects
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175403_projects_with_prometheus_alerts.yml b/config/metrics/counts_all/20210216175403_projects_with_prometheus_alerts.yml
new file mode 100644
index 00000000000..ac4a31a5a08
--- /dev/null
+++ b/config/metrics/counts_all/20210216175403_projects_with_prometheus_alerts.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.configure.projects_with_prometheus_alerts
+description: Projects with Prometheus alerting enabled
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175442_ingress_modsecurity_packets_processed.yml b/config/metrics/counts_all/20210216175442_ingress_modsecurity_packets_processed.yml
new file mode 100644
index 00000000000..7ef825975a2
--- /dev/null
+++ b/config/metrics/counts_all/20210216175442_ingress_modsecurity_packets_processed.yml
@@ -0,0 +1,20 @@
+---
+key_path: counts.ingress_modsecurity_packets_processed
+description: Cumulative count of packets processed by ModSecurity since Usage Ping
+ was last reported
+product_section: sec
+product_stage: protect
+product_group: group::container security
+product_category: web_firewall
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175444_ingress_modsecurity_packets_anomalous.yml b/config/metrics/counts_all/20210216175444_ingress_modsecurity_packets_anomalous.yml
new file mode 100644
index 00000000000..2aad13de693
--- /dev/null
+++ b/config/metrics/counts_all/20210216175444_ingress_modsecurity_packets_anomalous.yml
@@ -0,0 +1,20 @@
+---
+key_path: counts.ingress_modsecurity_packets_anomalous
+description: Cumulative count of packets identified as anomalous by ModSecurity since
+ Usage Ping was last reported
+product_section: sec
+product_stage: protect
+product_group: group::container security
+product_category: web_firewall
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175446_network_policy_forwards.yml b/config/metrics/counts_all/20210216175446_network_policy_forwards.yml
new file mode 100644
index 00000000000..f1330d775a8
--- /dev/null
+++ b/config/metrics/counts_all/20210216175446_network_policy_forwards.yml
@@ -0,0 +1,20 @@
+---
+key_path: counts.network_policy_forwards
+description: Cumulative count of packets forwarded by Cilium (Container Network Security)
+ since Usage Ping was last reported
+product_section: sec
+product_stage: protect
+product_group: group::container security
+product_category: container_network_security
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175448_network_policy_drops.yml b/config/metrics/counts_all/20210216175448_network_policy_drops.yml
new file mode 100644
index 00000000000..e76c53f7b95
--- /dev/null
+++ b/config/metrics/counts_all/20210216175448_network_policy_drops.yml
@@ -0,0 +1,20 @@
+---
+key_path: counts.network_policy_drops
+description: Cumulative count of packets dropped by Cilium (Container Network Security)
+ since Usage Ping was last reported
+product_section: sec
+product_stage: protect
+product_group: group::container security
+product_category: container_network_security
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175450_ingress_modsecurity_logging.yml b/config/metrics/counts_all/20210216175450_ingress_modsecurity_logging.yml
new file mode 100644
index 00000000000..6fc4f6178bb
--- /dev/null
+++ b/config/metrics/counts_all/20210216175450_ingress_modsecurity_logging.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.ingress_modsecurity_logging
+description: Whether or not ModSecurity is set to logging mode
+product_section: sec
+product_stage: protect
+product_group: group::container security
+product_category: web_firewall
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175452_ingress_modsecurity_blocking.yml b/config/metrics/counts_all/20210216175452_ingress_modsecurity_blocking.yml
new file mode 100644
index 00000000000..7f2e91c88eb
--- /dev/null
+++ b/config/metrics/counts_all/20210216175452_ingress_modsecurity_blocking.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.ingress_modsecurity_blocking
+description: Whether or not ModSecurity is set to blocking mode
+product_section: sec
+product_stage: protect
+product_group: group::container security
+product_category: web_firewall
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175454_ingress_modsecurity_disabled.yml b/config/metrics/counts_all/20210216175454_ingress_modsecurity_disabled.yml
new file mode 100644
index 00000000000..5c028ab30e1
--- /dev/null
+++ b/config/metrics/counts_all/20210216175454_ingress_modsecurity_disabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.ingress_modsecurity_disabled
+description: Whether or not ModSecurity is disabled within Ingress
+product_section: sec
+product_stage: protect
+product_group: group::container security
+product_category: web_firewall
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175456_ingress_modsecurity_not_installed.yml b/config/metrics/counts_all/20210216175456_ingress_modsecurity_not_installed.yml
new file mode 100644
index 00000000000..e0c49c6b070
--- /dev/null
+++ b/config/metrics/counts_all/20210216175456_ingress_modsecurity_not_installed.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.ingress_modsecurity_not_installed
+description: Whether or not ModSecurity has not been installed into the cluster
+product_section: sec
+product_stage: protect
+product_group: group::container security
+product_category: web_firewall
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175510_ci_builds.yml b/config/metrics/counts_all/20210216175510_ci_builds.yml
new file mode 100644
index 00000000000..a70878ce352
--- /dev/null
+++ b/config/metrics/counts_all/20210216175510_ci_builds.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.ci_builds
+description: Unique builds in project
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175512_ci_internal_pipelines.yml b/config/metrics/counts_all/20210216175512_ci_internal_pipelines.yml
new file mode 100644
index 00000000000..425da65a0d5
--- /dev/null
+++ b/config/metrics/counts_all/20210216175512_ci_internal_pipelines.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.ci_internal_pipelines
+description: Total pipelines in GitLab repositories
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175514_ci_external_pipelines.yml b/config/metrics/counts_all/20210216175514_ci_external_pipelines.yml
new file mode 100644
index 00000000000..bf62f8096df
--- /dev/null
+++ b/config/metrics/counts_all/20210216175514_ci_external_pipelines.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.ci_external_pipelines
+description: Total pipelines in external repositories
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175516_ci_pipeline_config_auto_devops.yml b/config/metrics/counts_all/20210216175516_ci_pipeline_config_auto_devops.yml
new file mode 100644
index 00000000000..ac9ce910867
--- /dev/null
+++ b/config/metrics/counts_all/20210216175516_ci_pipeline_config_auto_devops.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.ci_pipeline_config_auto_devops
+description: Total pipelines from an Auto DevOps template
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175518_ci_pipeline_config_repository.yml b/config/metrics/counts_all/20210216175518_ci_pipeline_config_repository.yml
new file mode 100644
index 00000000000..dc796d25bb0
--- /dev/null
+++ b/config/metrics/counts_all/20210216175518_ci_pipeline_config_repository.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.ci_pipeline_config_repository
+description: Total Pipelines from templates in repository
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175520_ci_runners.yml b/config/metrics/counts_all/20210216175520_ci_runners.yml
new file mode 100644
index 00000000000..4bac8d39737
--- /dev/null
+++ b/config/metrics/counts_all/20210216175520_ci_runners.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.ci_runners
+description: Total configured Runners in project
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175521_ci_triggers.yml b/config/metrics/counts_all/20210216175521_ci_triggers.yml
new file mode 100644
index 00000000000..5a2015d6fdf
--- /dev/null
+++ b/config/metrics/counts_all/20210216175521_ci_triggers.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.ci_triggers
+description: Total configured Triggers in project
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175523_ci_pipeline_schedules.yml b/config/metrics/counts_all/20210216175523_ci_pipeline_schedules.yml
new file mode 100644
index 00000000000..330b0b64e26
--- /dev/null
+++ b/config/metrics/counts_all/20210216175523_ci_pipeline_schedules.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.ci_pipeline_schedules
+description: Pipeline schedules in GitLab
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175525_ci_builds.yml b/config/metrics/counts_all/20210216175525_ci_builds.yml
new file mode 100644
index 00000000000..a9a5d9f6a88
--- /dev/null
+++ b/config/metrics/counts_all/20210216175525_ci_builds.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.verify.ci_builds
+description: Unique builds in project
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175527_ci_external_pipelines.yml b/config/metrics/counts_all/20210216175527_ci_external_pipelines.yml
new file mode 100644
index 00000000000..bc29f8fd33c
--- /dev/null
+++ b/config/metrics/counts_all/20210216175527_ci_external_pipelines.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.verify.ci_external_pipelines
+description: Total pipelines in external repositories
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175529_ci_internal_pipelines.yml b/config/metrics/counts_all/20210216175529_ci_internal_pipelines.yml
new file mode 100644
index 00000000000..9eb1541828f
--- /dev/null
+++ b/config/metrics/counts_all/20210216175529_ci_internal_pipelines.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.verify.ci_internal_pipelines
+description: Total pipelines in GitLab repositories
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175531_ci_pipeline_config_auto_devops.yml b/config/metrics/counts_all/20210216175531_ci_pipeline_config_auto_devops.yml
new file mode 100644
index 00000000000..046f94261e1
--- /dev/null
+++ b/config/metrics/counts_all/20210216175531_ci_pipeline_config_auto_devops.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.verify.ci_pipeline_config_auto_devops
+description: Total pipelines from an Auto DevOps template
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175533_ci_pipeline_config_repository.yml b/config/metrics/counts_all/20210216175533_ci_pipeline_config_repository.yml
new file mode 100644
index 00000000000..6daf1a8fbd6
--- /dev/null
+++ b/config/metrics/counts_all/20210216175533_ci_pipeline_config_repository.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.verify.ci_pipeline_config_repository
+description: Total Pipelines from templates in repository
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175535_ci_pipeline_schedules.yml b/config/metrics/counts_all/20210216175535_ci_pipeline_schedules.yml
new file mode 100644
index 00000000000..be012a5ff3e
--- /dev/null
+++ b/config/metrics/counts_all/20210216175535_ci_pipeline_schedules.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.verify.ci_pipeline_schedules
+description: Pipeline schedules in GitLab
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175537_ci_pipelines.yml b/config/metrics/counts_all/20210216175537_ci_pipelines.yml
new file mode 100644
index 00000000000..e9394e70fd1
--- /dev/null
+++ b/config/metrics/counts_all/20210216175537_ci_pipelines.yml
@@ -0,0 +1,17 @@
+---
+key_path: usage_activity_by_stage.verify.ci_pipelines
+description: Distinct Users triggering Total pipelines
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175539_ci_triggers.yml b/config/metrics/counts_all/20210216175539_ci_triggers.yml
new file mode 100644
index 00000000000..d284687894a
--- /dev/null
+++ b/config/metrics/counts_all/20210216175539_ci_triggers.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.verify.ci_triggers
+description: Total configured Triggers in project
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175612_dast_jobs.yml b/config/metrics/counts_all/20210216175612_dast_jobs.yml
new file mode 100644
index 00000000000..8672e18dbfa
--- /dev/null
+++ b/config/metrics/counts_all/20210216175612_dast_jobs.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.dast_jobs
+description: Count of DAST jobs run
+product_section: sec
+product_stage: secure
+product_group: group::dynamic analysis
+product_category: dynamic_application_security_testing
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175614_user_dast_jobs.yml b/config/metrics/counts_all/20210216175614_user_dast_jobs.yml
new file mode 100644
index 00000000000..900cd5b37b7
--- /dev/null
+++ b/config/metrics/counts_all/20210216175614_user_dast_jobs.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.secure.user_dast_jobs
+description: Count of DAST jobs
+product_section: sec
+product_stage: secure
+product_group: group::dynamic analysis
+product_category: dynamic_application_security_testing
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175621_web_hooks.yml b/config/metrics/counts_all/20210216175621_web_hooks.yml
new file mode 100644
index 00000000000..ad7d9de8f12
--- /dev/null
+++ b/config/metrics/counts_all/20210216175621_web_hooks.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.web_hooks
+description:
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175623_projects_asana_active.yml b/config/metrics/counts_all/20210216175623_projects_asana_active.yml
new file mode 100644
index 00000000000..724a00f7c18
--- /dev/null
+++ b/config/metrics/counts_all/20210216175623_projects_asana_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_asana_active
+description: Count of projects with active integrations for Asana
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175625_groups_asana_active.yml b/config/metrics/counts_all/20210216175625_groups_asana_active.yml
new file mode 100644
index 00000000000..cdae2cdf020
--- /dev/null
+++ b/config/metrics/counts_all/20210216175625_groups_asana_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_asana_active
+description: Count of groups with active integrations for Asana
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175627_templates_asana_active.yml b/config/metrics/counts_all/20210216175627_templates_asana_active.yml
new file mode 100644
index 00000000000..df08683ab7a
--- /dev/null
+++ b/config/metrics/counts_all/20210216175627_templates_asana_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_asana_active
+description: Count of active service templates for Asana
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175628_instances_asana_active.yml b/config/metrics/counts_all/20210216175628_instances_asana_active.yml
new file mode 100644
index 00000000000..afaaf7f3b8c
--- /dev/null
+++ b/config/metrics/counts_all/20210216175628_instances_asana_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_asana_active
+description: Count of active instance-level integrations for Asana
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175630_projects_inheriting_asana_active.yml b/config/metrics/counts_all/20210216175630_projects_inheriting_asana_active.yml
new file mode 100644
index 00000000000..efcaabdb817
--- /dev/null
+++ b/config/metrics/counts_all/20210216175630_projects_inheriting_asana_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_asana_active
+description: Count of active projects inheriting integrations for Asana
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175632_groups_inheriting_asana_active.yml b/config/metrics/counts_all/20210216175632_groups_inheriting_asana_active.yml
new file mode 100644
index 00000000000..4a8128f2600
--- /dev/null
+++ b/config/metrics/counts_all/20210216175632_groups_inheriting_asana_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_asana_active
+description: Count of active groups inheriting integrations for Asana
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175634_projects_assembla_active.yml b/config/metrics/counts_all/20210216175634_projects_assembla_active.yml
new file mode 100644
index 00000000000..3a4e4c64c7a
--- /dev/null
+++ b/config/metrics/counts_all/20210216175634_projects_assembla_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_assembla_active
+description: Count of projects with active integrations for Assembla
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175636_groups_assembla_active.yml b/config/metrics/counts_all/20210216175636_groups_assembla_active.yml
new file mode 100644
index 00000000000..100beb0991b
--- /dev/null
+++ b/config/metrics/counts_all/20210216175636_groups_assembla_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_assembla_active
+description: Count of groups with active integrations for Assembla
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175638_templates_assembla_active.yml b/config/metrics/counts_all/20210216175638_templates_assembla_active.yml
new file mode 100644
index 00000000000..f1bc7d0b08f
--- /dev/null
+++ b/config/metrics/counts_all/20210216175638_templates_assembla_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_assembla_active
+description: Count of active service templates for Assembla
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175640_instances_assembla_active.yml b/config/metrics/counts_all/20210216175640_instances_assembla_active.yml
new file mode 100644
index 00000000000..049781d91f9
--- /dev/null
+++ b/config/metrics/counts_all/20210216175640_instances_assembla_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_assembla_active
+description: Count of active instance-level integrations for Assembla
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175642_projects_inheriting_assembla_active.yml b/config/metrics/counts_all/20210216175642_projects_inheriting_assembla_active.yml
new file mode 100644
index 00000000000..c71e2efec84
--- /dev/null
+++ b/config/metrics/counts_all/20210216175642_projects_inheriting_assembla_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_assembla_active
+description: Count of active projects inheriting integrations for Assembla
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175644_groups_inheriting_assembla_active.yml b/config/metrics/counts_all/20210216175644_groups_inheriting_assembla_active.yml
new file mode 100644
index 00000000000..58f9e025ae6
--- /dev/null
+++ b/config/metrics/counts_all/20210216175644_groups_inheriting_assembla_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_assembla_active
+description: Count of active groups inheriting integrations for Assembla
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175645_projects_bamboo_active.yml b/config/metrics/counts_all/20210216175645_projects_bamboo_active.yml
new file mode 100644
index 00000000000..ffeccdddb5e
--- /dev/null
+++ b/config/metrics/counts_all/20210216175645_projects_bamboo_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_bamboo_active
+description: Count of projects with active integrations for Bamboo CI
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175647_groups_bamboo_active.yml b/config/metrics/counts_all/20210216175647_groups_bamboo_active.yml
new file mode 100644
index 00000000000..4a9a6d695e8
--- /dev/null
+++ b/config/metrics/counts_all/20210216175647_groups_bamboo_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_bamboo_active
+description: Count of groups with active integrations for Bamboo CI
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175649_templates_bamboo_active.yml b/config/metrics/counts_all/20210216175649_templates_bamboo_active.yml
new file mode 100644
index 00000000000..11d3abdc7f9
--- /dev/null
+++ b/config/metrics/counts_all/20210216175649_templates_bamboo_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_bamboo_active
+description: Count of active service templates for Bamboo CI
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175651_instances_bamboo_active.yml b/config/metrics/counts_all/20210216175651_instances_bamboo_active.yml
new file mode 100644
index 00000000000..ce27c004aaf
--- /dev/null
+++ b/config/metrics/counts_all/20210216175651_instances_bamboo_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_bamboo_active
+description: Count of active instance-level integrations for Bamboo CI
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175653_projects_inheriting_bamboo_active.yml b/config/metrics/counts_all/20210216175653_projects_inheriting_bamboo_active.yml
new file mode 100644
index 00000000000..28bdc086a74
--- /dev/null
+++ b/config/metrics/counts_all/20210216175653_projects_inheriting_bamboo_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_bamboo_active
+description: Count of active projects inheriting integrations for Bamboo CI
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175655_groups_inheriting_bamboo_active.yml b/config/metrics/counts_all/20210216175655_groups_inheriting_bamboo_active.yml
new file mode 100644
index 00000000000..74a4c3618d2
--- /dev/null
+++ b/config/metrics/counts_all/20210216175655_groups_inheriting_bamboo_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_bamboo_active
+description: Count of active groups inheriting integrations for Bamboo CI
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175657_projects_bugzilla_active.yml b/config/metrics/counts_all/20210216175657_projects_bugzilla_active.yml
new file mode 100644
index 00000000000..640aad49c0a
--- /dev/null
+++ b/config/metrics/counts_all/20210216175657_projects_bugzilla_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_bugzilla_active
+description: Count of projects with active integrations for Bugzilla
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175659_groups_bugzilla_active.yml b/config/metrics/counts_all/20210216175659_groups_bugzilla_active.yml
new file mode 100644
index 00000000000..2521b50e111
--- /dev/null
+++ b/config/metrics/counts_all/20210216175659_groups_bugzilla_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_bugzilla_active
+description: Count of groups with active integrations for Bugzilla
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175701_templates_bugzilla_active.yml b/config/metrics/counts_all/20210216175701_templates_bugzilla_active.yml
new file mode 100644
index 00000000000..977bc0be0cf
--- /dev/null
+++ b/config/metrics/counts_all/20210216175701_templates_bugzilla_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_bugzilla_active
+description: Count of active service templates for Bugzilla
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175702_instances_bugzilla_active.yml b/config/metrics/counts_all/20210216175702_instances_bugzilla_active.yml
new file mode 100644
index 00000000000..9a1714e918b
--- /dev/null
+++ b/config/metrics/counts_all/20210216175702_instances_bugzilla_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_bugzilla_active
+description: Count of active instance-level integrations for Bugzilla
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175704_projects_inheriting_bugzilla_active.yml b/config/metrics/counts_all/20210216175704_projects_inheriting_bugzilla_active.yml
new file mode 100644
index 00000000000..f4dffa88821
--- /dev/null
+++ b/config/metrics/counts_all/20210216175704_projects_inheriting_bugzilla_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_bugzilla_active
+description: Count of active projects inheriting integrations for Bugzilla
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175706_groups_inheriting_bugzilla_active.yml b/config/metrics/counts_all/20210216175706_groups_inheriting_bugzilla_active.yml
new file mode 100644
index 00000000000..c7c093d8ab7
--- /dev/null
+++ b/config/metrics/counts_all/20210216175706_groups_inheriting_bugzilla_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_bugzilla_active
+description: Count of active groups inheriting integrations for Bugzilla
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175708_projects_buildkite_active.yml b/config/metrics/counts_all/20210216175708_projects_buildkite_active.yml
new file mode 100644
index 00000000000..debf9bb020f
--- /dev/null
+++ b/config/metrics/counts_all/20210216175708_projects_buildkite_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_buildkite_active
+description: Count of projects with active integrations for Buildkite
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175710_groups_buildkite_active.yml b/config/metrics/counts_all/20210216175710_groups_buildkite_active.yml
new file mode 100644
index 00000000000..2abea7b54d2
--- /dev/null
+++ b/config/metrics/counts_all/20210216175710_groups_buildkite_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_buildkite_active
+description: Count of groups with active integrations for Buildkite
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175712_templates_buildkite_active.yml b/config/metrics/counts_all/20210216175712_templates_buildkite_active.yml
new file mode 100644
index 00000000000..1520168a10a
--- /dev/null
+++ b/config/metrics/counts_all/20210216175712_templates_buildkite_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_buildkite_active
+description: Count of active service templates for Buildkite
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175714_instances_buildkite_active.yml b/config/metrics/counts_all/20210216175714_instances_buildkite_active.yml
new file mode 100644
index 00000000000..1ce0ad19f97
--- /dev/null
+++ b/config/metrics/counts_all/20210216175714_instances_buildkite_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_buildkite_active
+description: Count of active instance-level integrations for Buildkite
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175716_projects_inheriting_buildkite_active.yml b/config/metrics/counts_all/20210216175716_projects_inheriting_buildkite_active.yml
new file mode 100644
index 00000000000..0073bdaf957
--- /dev/null
+++ b/config/metrics/counts_all/20210216175716_projects_inheriting_buildkite_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_buildkite_active
+description: Count of active projects inheriting integrations for Buildkite
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175717_groups_inheriting_buildkite_active.yml b/config/metrics/counts_all/20210216175717_groups_inheriting_buildkite_active.yml
new file mode 100644
index 00000000000..f8e5bcab9fd
--- /dev/null
+++ b/config/metrics/counts_all/20210216175717_groups_inheriting_buildkite_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_buildkite_active
+description: Count of active groups inheriting integrations for Buildkite
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175719_projects_campfire_active.yml b/config/metrics/counts_all/20210216175719_projects_campfire_active.yml
new file mode 100644
index 00000000000..15d2e40b4ca
--- /dev/null
+++ b/config/metrics/counts_all/20210216175719_projects_campfire_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_campfire_active
+description: Count of projects with active integrations for Campfire
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175721_groups_campfire_active.yml b/config/metrics/counts_all/20210216175721_groups_campfire_active.yml
new file mode 100644
index 00000000000..284b7bab518
--- /dev/null
+++ b/config/metrics/counts_all/20210216175721_groups_campfire_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_campfire_active
+description: Count of groups with active integrations for Campfire
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175723_templates_campfire_active.yml b/config/metrics/counts_all/20210216175723_templates_campfire_active.yml
new file mode 100644
index 00000000000..4a6df7ba877
--- /dev/null
+++ b/config/metrics/counts_all/20210216175723_templates_campfire_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_campfire_active
+description: Count of active service templates for Campfire
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175725_instances_campfire_active.yml b/config/metrics/counts_all/20210216175725_instances_campfire_active.yml
new file mode 100644
index 00000000000..5ab6dec5aa7
--- /dev/null
+++ b/config/metrics/counts_all/20210216175725_instances_campfire_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_campfire_active
+description: Count of active instance-level integrations for Campfire
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175727_projects_inheriting_campfire_active.yml b/config/metrics/counts_all/20210216175727_projects_inheriting_campfire_active.yml
new file mode 100644
index 00000000000..fb53c49929f
--- /dev/null
+++ b/config/metrics/counts_all/20210216175727_projects_inheriting_campfire_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_campfire_active
+description: Count of active projects inheriting integrations for Campfire
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175729_groups_inheriting_campfire_active.yml b/config/metrics/counts_all/20210216175729_groups_inheriting_campfire_active.yml
new file mode 100644
index 00000000000..9d974bf517b
--- /dev/null
+++ b/config/metrics/counts_all/20210216175729_groups_inheriting_campfire_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_campfire_active
+description: Count of active groups inheriting integrations for Campfire
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175731_projects_confluence_active.yml b/config/metrics/counts_all/20210216175731_projects_confluence_active.yml
new file mode 100644
index 00000000000..075e56155fd
--- /dev/null
+++ b/config/metrics/counts_all/20210216175731_projects_confluence_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_confluence_active
+description: Count of projects with active integrations for Confluence
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175733_groups_confluence_active.yml b/config/metrics/counts_all/20210216175733_groups_confluence_active.yml
new file mode 100644
index 00000000000..de152ddeb7d
--- /dev/null
+++ b/config/metrics/counts_all/20210216175733_groups_confluence_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_confluence_active
+description: Count of groups with active integrations for Confluence
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175734_templates_confluence_active.yml b/config/metrics/counts_all/20210216175734_templates_confluence_active.yml
new file mode 100644
index 00000000000..ff059277577
--- /dev/null
+++ b/config/metrics/counts_all/20210216175734_templates_confluence_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_confluence_active
+description: Count of active service templates for Confluence
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175736_instances_confluence_active.yml b/config/metrics/counts_all/20210216175736_instances_confluence_active.yml
new file mode 100644
index 00000000000..a2e36f00a12
--- /dev/null
+++ b/config/metrics/counts_all/20210216175736_instances_confluence_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_confluence_active
+description: Count of active instance-level integrations for Confluence
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175738_projects_inheriting_confluence_active.yml b/config/metrics/counts_all/20210216175738_projects_inheriting_confluence_active.yml
new file mode 100644
index 00000000000..15a6ffd6025
--- /dev/null
+++ b/config/metrics/counts_all/20210216175738_projects_inheriting_confluence_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_confluence_active
+description: Count of active projects inheriting integrations for Confluence
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175740_groups_inheriting_confluence_active.yml b/config/metrics/counts_all/20210216175740_groups_inheriting_confluence_active.yml
new file mode 100644
index 00000000000..e7928fff1c5
--- /dev/null
+++ b/config/metrics/counts_all/20210216175740_groups_inheriting_confluence_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_confluence_active
+description: Count of active groups inheriting integrations for Confluence
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175742_projects_custom_issue_tracker_active.yml b/config/metrics/counts_all/20210216175742_projects_custom_issue_tracker_active.yml
new file mode 100644
index 00000000000..0d0d2d86fdb
--- /dev/null
+++ b/config/metrics/counts_all/20210216175742_projects_custom_issue_tracker_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_custom_issue_tracker_active
+description: Count of projects with active integrations for a Custom Issue Tracker
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175744_groups_custom_issue_tracker_active.yml b/config/metrics/counts_all/20210216175744_groups_custom_issue_tracker_active.yml
new file mode 100644
index 00000000000..e8cae4d24d7
--- /dev/null
+++ b/config/metrics/counts_all/20210216175744_groups_custom_issue_tracker_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_custom_issue_tracker_active
+description: Count of groups with active integrations for a Custom Issue Tracker
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175745_templates_custom_issue_tracker_active.yml b/config/metrics/counts_all/20210216175745_templates_custom_issue_tracker_active.yml
new file mode 100644
index 00000000000..a67cd7c0435
--- /dev/null
+++ b/config/metrics/counts_all/20210216175745_templates_custom_issue_tracker_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_custom_issue_tracker_active
+description: Count of active service templates for a Custom Issue Tracker
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175747_instances_custom_issue_tracker_active.yml b/config/metrics/counts_all/20210216175747_instances_custom_issue_tracker_active.yml
new file mode 100644
index 00000000000..00bf681c870
--- /dev/null
+++ b/config/metrics/counts_all/20210216175747_instances_custom_issue_tracker_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_custom_issue_tracker_active
+description: Count of active instance-level integrations for a Custom Issue Tracker
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175749_projects_inheriting_custom_issue_tracker_active.yml b/config/metrics/counts_all/20210216175749_projects_inheriting_custom_issue_tracker_active.yml
new file mode 100644
index 00000000000..ba732a12259
--- /dev/null
+++ b/config/metrics/counts_all/20210216175749_projects_inheriting_custom_issue_tracker_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_custom_issue_tracker_active
+description: Count of active projects inheriting integrations for a Custom Issue Tracker
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175751_groups_inheriting_custom_issue_tracker_active.yml b/config/metrics/counts_all/20210216175751_groups_inheriting_custom_issue_tracker_active.yml
new file mode 100644
index 00000000000..294c557f9b1
--- /dev/null
+++ b/config/metrics/counts_all/20210216175751_groups_inheriting_custom_issue_tracker_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_custom_issue_tracker_active
+description: Count of active groups inheriting integrations for a Custom Issue Tracker
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175753_projects_discord_active.yml b/config/metrics/counts_all/20210216175753_projects_discord_active.yml
new file mode 100644
index 00000000000..ab1e187d697
--- /dev/null
+++ b/config/metrics/counts_all/20210216175753_projects_discord_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_discord_active
+description: Count of projects with active integrations for Discord
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175755_groups_discord_active.yml b/config/metrics/counts_all/20210216175755_groups_discord_active.yml
new file mode 100644
index 00000000000..8684be04c4f
--- /dev/null
+++ b/config/metrics/counts_all/20210216175755_groups_discord_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_discord_active
+description: Count of groups with active integrations for Discord
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175756_templates_discord_active.yml b/config/metrics/counts_all/20210216175756_templates_discord_active.yml
new file mode 100644
index 00000000000..f66e3435221
--- /dev/null
+++ b/config/metrics/counts_all/20210216175756_templates_discord_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_discord_active
+description: Count of active service templates for Discord
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175758_instances_discord_active.yml b/config/metrics/counts_all/20210216175758_instances_discord_active.yml
new file mode 100644
index 00000000000..0dc37b7100c
--- /dev/null
+++ b/config/metrics/counts_all/20210216175758_instances_discord_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_discord_active
+description: Count of active instance-level integrations for Discord
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175800_projects_inheriting_discord_active.yml b/config/metrics/counts_all/20210216175800_projects_inheriting_discord_active.yml
new file mode 100644
index 00000000000..b5ef624a9da
--- /dev/null
+++ b/config/metrics/counts_all/20210216175800_projects_inheriting_discord_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_discord_active
+description: Count of active projects inheriting integrations for Discord
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175802_groups_inheriting_discord_active.yml b/config/metrics/counts_all/20210216175802_groups_inheriting_discord_active.yml
new file mode 100644
index 00000000000..a6d4c8385f3
--- /dev/null
+++ b/config/metrics/counts_all/20210216175802_groups_inheriting_discord_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_discord_active
+description: Count of active groups inheriting integrations for Discord
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175804_projects_drone_ci_active.yml b/config/metrics/counts_all/20210216175804_projects_drone_ci_active.yml
new file mode 100644
index 00000000000..f8d53e6620e
--- /dev/null
+++ b/config/metrics/counts_all/20210216175804_projects_drone_ci_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_drone_ci_active
+description: Count of projects with active integrations for Drone CI
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175806_groups_drone_ci_active.yml b/config/metrics/counts_all/20210216175806_groups_drone_ci_active.yml
new file mode 100644
index 00000000000..3dc182faa0c
--- /dev/null
+++ b/config/metrics/counts_all/20210216175806_groups_drone_ci_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_drone_ci_active
+description: Count of groups with active integrations for Drone CI
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175807_templates_drone_ci_active.yml b/config/metrics/counts_all/20210216175807_templates_drone_ci_active.yml
new file mode 100644
index 00000000000..3a45cd3aba0
--- /dev/null
+++ b/config/metrics/counts_all/20210216175807_templates_drone_ci_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_drone_ci_active
+description: Count of active service templates for Drone CI
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175809_instances_drone_ci_active.yml b/config/metrics/counts_all/20210216175809_instances_drone_ci_active.yml
new file mode 100644
index 00000000000..fd6581bff6a
--- /dev/null
+++ b/config/metrics/counts_all/20210216175809_instances_drone_ci_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_drone_ci_active
+description: Count of active instance-level integrations for Drone CI
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175811_projects_inheriting_drone_ci_active.yml b/config/metrics/counts_all/20210216175811_projects_inheriting_drone_ci_active.yml
new file mode 100644
index 00000000000..f9d8ad12795
--- /dev/null
+++ b/config/metrics/counts_all/20210216175811_projects_inheriting_drone_ci_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_drone_ci_active
+description: Count of active projects inheriting integrations for Drone CI
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175813_groups_inheriting_drone_ci_active.yml b/config/metrics/counts_all/20210216175813_groups_inheriting_drone_ci_active.yml
new file mode 100644
index 00000000000..c876ef22570
--- /dev/null
+++ b/config/metrics/counts_all/20210216175813_groups_inheriting_drone_ci_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_drone_ci_active
+description: Count of active groups inheriting integrations for Drone CI
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175815_projects_emails_on_push_active.yml b/config/metrics/counts_all/20210216175815_projects_emails_on_push_active.yml
new file mode 100644
index 00000000000..5dea679b5b0
--- /dev/null
+++ b/config/metrics/counts_all/20210216175815_projects_emails_on_push_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_emails_on_push_active
+description: Count of projects with active integrations for Emails on Push
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175817_groups_emails_on_push_active.yml b/config/metrics/counts_all/20210216175817_groups_emails_on_push_active.yml
new file mode 100644
index 00000000000..4bfbefe0b7d
--- /dev/null
+++ b/config/metrics/counts_all/20210216175817_groups_emails_on_push_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_emails_on_push_active
+description: Count of groups with active integrations for Emails on Push
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175818_templates_emails_on_push_active.yml b/config/metrics/counts_all/20210216175818_templates_emails_on_push_active.yml
new file mode 100644
index 00000000000..bc6764c1d17
--- /dev/null
+++ b/config/metrics/counts_all/20210216175818_templates_emails_on_push_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_emails_on_push_active
+description: Count of active service templates for Emails on Push
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175820_instances_emails_on_push_active.yml b/config/metrics/counts_all/20210216175820_instances_emails_on_push_active.yml
new file mode 100644
index 00000000000..00c04e32b09
--- /dev/null
+++ b/config/metrics/counts_all/20210216175820_instances_emails_on_push_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_emails_on_push_active
+description: Count of active instance-level integrations for Emails on Push
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175822_projects_inheriting_emails_on_push_active.yml b/config/metrics/counts_all/20210216175822_projects_inheriting_emails_on_push_active.yml
new file mode 100644
index 00000000000..ca2e0062f75
--- /dev/null
+++ b/config/metrics/counts_all/20210216175822_projects_inheriting_emails_on_push_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_emails_on_push_active
+description: Count of active projects inheriting integrations for Emails on Push
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175824_groups_inheriting_emails_on_push_active.yml b/config/metrics/counts_all/20210216175824_groups_inheriting_emails_on_push_active.yml
new file mode 100644
index 00000000000..7d2308cd39d
--- /dev/null
+++ b/config/metrics/counts_all/20210216175824_groups_inheriting_emails_on_push_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_emails_on_push_active
+description: Count of active groups inheriting integrations for Emails on Push
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175826_projects_external_wiki_active.yml b/config/metrics/counts_all/20210216175826_projects_external_wiki_active.yml
new file mode 100644
index 00000000000..e570fdb964c
--- /dev/null
+++ b/config/metrics/counts_all/20210216175826_projects_external_wiki_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_external_wiki_active
+description: Count of projects with active integrations for External Wiki
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175828_groups_external_wiki_active.yml b/config/metrics/counts_all/20210216175828_groups_external_wiki_active.yml
new file mode 100644
index 00000000000..4d680edf42a
--- /dev/null
+++ b/config/metrics/counts_all/20210216175828_groups_external_wiki_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_external_wiki_active
+description: Count of groups with active integrations for External Wiki
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175829_templates_external_wiki_active.yml b/config/metrics/counts_all/20210216175829_templates_external_wiki_active.yml
new file mode 100644
index 00000000000..4efd0be8673
--- /dev/null
+++ b/config/metrics/counts_all/20210216175829_templates_external_wiki_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_external_wiki_active
+description: Count of active service templates for External Wiki
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175831_instances_external_wiki_active.yml b/config/metrics/counts_all/20210216175831_instances_external_wiki_active.yml
new file mode 100644
index 00000000000..c435eed9dee
--- /dev/null
+++ b/config/metrics/counts_all/20210216175831_instances_external_wiki_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_external_wiki_active
+description: Count of active instance-level integrations for External Wiki
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175833_projects_inheriting_external_wiki_active.yml b/config/metrics/counts_all/20210216175833_projects_inheriting_external_wiki_active.yml
new file mode 100644
index 00000000000..4c139e6ee8d
--- /dev/null
+++ b/config/metrics/counts_all/20210216175833_projects_inheriting_external_wiki_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_external_wiki_active
+description: Count of active projects inheriting integrations for External Wiki
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175835_groups_inheriting_external_wiki_active.yml b/config/metrics/counts_all/20210216175835_groups_inheriting_external_wiki_active.yml
new file mode 100644
index 00000000000..fe18e836df2
--- /dev/null
+++ b/config/metrics/counts_all/20210216175835_groups_inheriting_external_wiki_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_external_wiki_active
+description: Count of active groups inheriting integrations for External Wiki
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175837_projects_flowdock_active.yml b/config/metrics/counts_all/20210216175837_projects_flowdock_active.yml
new file mode 100644
index 00000000000..e8d724b51b3
--- /dev/null
+++ b/config/metrics/counts_all/20210216175837_projects_flowdock_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_flowdock_active
+description: Count of projects with active integrations for Flowdock
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175839_groups_flowdock_active.yml b/config/metrics/counts_all/20210216175839_groups_flowdock_active.yml
new file mode 100644
index 00000000000..0d9f9a72cd3
--- /dev/null
+++ b/config/metrics/counts_all/20210216175839_groups_flowdock_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_flowdock_active
+description: Count of groups with active integrations for Flowdock
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175840_templates_flowdock_active.yml b/config/metrics/counts_all/20210216175840_templates_flowdock_active.yml
new file mode 100644
index 00000000000..f1715119217
--- /dev/null
+++ b/config/metrics/counts_all/20210216175840_templates_flowdock_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_flowdock_active
+description: Count of active service templates for Flowdock
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175842_instances_flowdock_active.yml b/config/metrics/counts_all/20210216175842_instances_flowdock_active.yml
new file mode 100644
index 00000000000..e62259c965c
--- /dev/null
+++ b/config/metrics/counts_all/20210216175842_instances_flowdock_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_flowdock_active
+description: Count of active instance-level integrations for Flowdock
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175844_projects_inheriting_flowdock_active.yml b/config/metrics/counts_all/20210216175844_projects_inheriting_flowdock_active.yml
new file mode 100644
index 00000000000..53d09e2dab1
--- /dev/null
+++ b/config/metrics/counts_all/20210216175844_projects_inheriting_flowdock_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_flowdock_active
+description: Count of active projects inheriting integrations for Flowdock
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175846_groups_inheriting_flowdock_active.yml b/config/metrics/counts_all/20210216175846_groups_inheriting_flowdock_active.yml
new file mode 100644
index 00000000000..645d618705b
--- /dev/null
+++ b/config/metrics/counts_all/20210216175846_groups_inheriting_flowdock_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_flowdock_active
+description: Count of active groups inheriting integrations for Flowdock
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175848_projects_github_active.yml b/config/metrics/counts_all/20210216175848_projects_github_active.yml
new file mode 100644
index 00000000000..6145fc599b9
--- /dev/null
+++ b/config/metrics/counts_all/20210216175848_projects_github_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_github_active
+description: Count of projects with active integrations for GitHub
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175850_groups_github_active.yml b/config/metrics/counts_all/20210216175850_groups_github_active.yml
new file mode 100644
index 00000000000..9a43b772447
--- /dev/null
+++ b/config/metrics/counts_all/20210216175850_groups_github_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_github_active
+description: Count of groups with active integrations for GitHub
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175851_templates_github_active.yml b/config/metrics/counts_all/20210216175851_templates_github_active.yml
new file mode 100644
index 00000000000..f6ceed1233c
--- /dev/null
+++ b/config/metrics/counts_all/20210216175851_templates_github_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_github_active
+description: Count of active service templates for GitHub
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175853_instances_github_active.yml b/config/metrics/counts_all/20210216175853_instances_github_active.yml
new file mode 100644
index 00000000000..8150c0ec5a1
--- /dev/null
+++ b/config/metrics/counts_all/20210216175853_instances_github_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_github_active
+description: Count of active instance-level integrations for GitHub
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175855_projects_inheriting_github_active.yml b/config/metrics/counts_all/20210216175855_projects_inheriting_github_active.yml
new file mode 100644
index 00000000000..6f5f366e72b
--- /dev/null
+++ b/config/metrics/counts_all/20210216175855_projects_inheriting_github_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_github_active
+description: Count of active projects inheriting integrations for GitHub
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175857_groups_inheriting_github_active.yml b/config/metrics/counts_all/20210216175857_groups_inheriting_github_active.yml
new file mode 100644
index 00000000000..545fccc107e
--- /dev/null
+++ b/config/metrics/counts_all/20210216175857_groups_inheriting_github_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_github_active
+description: Count of active groups inheriting integrations for GitHub
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175859_projects_hangouts_chat_active.yml b/config/metrics/counts_all/20210216175859_projects_hangouts_chat_active.yml
new file mode 100644
index 00000000000..d61e94c0df8
--- /dev/null
+++ b/config/metrics/counts_all/20210216175859_projects_hangouts_chat_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_hangouts_chat_active
+description: Count of projects with active integrations for Hangouts Chat
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175901_groups_hangouts_chat_active.yml b/config/metrics/counts_all/20210216175901_groups_hangouts_chat_active.yml
new file mode 100644
index 00000000000..0a23a43cdf3
--- /dev/null
+++ b/config/metrics/counts_all/20210216175901_groups_hangouts_chat_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_hangouts_chat_active
+description: Count of groups with active integrations for Hangouts Chat
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175902_templates_hangouts_chat_active.yml b/config/metrics/counts_all/20210216175902_templates_hangouts_chat_active.yml
new file mode 100644
index 00000000000..21cfa1ebf23
--- /dev/null
+++ b/config/metrics/counts_all/20210216175902_templates_hangouts_chat_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_hangouts_chat_active
+description: Count of active service templates for Hangouts Chat
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175904_instances_hangouts_chat_active.yml b/config/metrics/counts_all/20210216175904_instances_hangouts_chat_active.yml
new file mode 100644
index 00000000000..4a3febf985a
--- /dev/null
+++ b/config/metrics/counts_all/20210216175904_instances_hangouts_chat_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_hangouts_chat_active
+description: Count of active instance-level integrations for Hangouts Chat
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175906_projects_inheriting_hangouts_chat_active.yml b/config/metrics/counts_all/20210216175906_projects_inheriting_hangouts_chat_active.yml
new file mode 100644
index 00000000000..90773d663df
--- /dev/null
+++ b/config/metrics/counts_all/20210216175906_projects_inheriting_hangouts_chat_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_hangouts_chat_active
+description: Count of active projects inheriting integrations for Hangouts Chat
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175908_groups_inheriting_hangouts_chat_active.yml b/config/metrics/counts_all/20210216175908_groups_inheriting_hangouts_chat_active.yml
new file mode 100644
index 00000000000..eda424840eb
--- /dev/null
+++ b/config/metrics/counts_all/20210216175908_groups_inheriting_hangouts_chat_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_hangouts_chat_active
+description: Count of active groups inheriting integrations for Hangouts Chat
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175910_projects_hipchat_active.yml b/config/metrics/counts_all/20210216175910_projects_hipchat_active.yml
new file mode 100644
index 00000000000..cc49000a57f
--- /dev/null
+++ b/config/metrics/counts_all/20210216175910_projects_hipchat_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_hipchat_active
+description: Count of projects with active integrations for HipChat
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175912_groups_hipchat_active.yml b/config/metrics/counts_all/20210216175912_groups_hipchat_active.yml
new file mode 100644
index 00000000000..1496bc21bcd
--- /dev/null
+++ b/config/metrics/counts_all/20210216175912_groups_hipchat_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_hipchat_active
+description: Count of groups with active integrations for HipChat
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175913_templates_hipchat_active.yml b/config/metrics/counts_all/20210216175913_templates_hipchat_active.yml
new file mode 100644
index 00000000000..3f285fe0ed6
--- /dev/null
+++ b/config/metrics/counts_all/20210216175913_templates_hipchat_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_hipchat_active
+description: Count of active service templates for HipChat
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175915_instances_hipchat_active.yml b/config/metrics/counts_all/20210216175915_instances_hipchat_active.yml
new file mode 100644
index 00000000000..0e2f5c5fe1b
--- /dev/null
+++ b/config/metrics/counts_all/20210216175915_instances_hipchat_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_hipchat_active
+description: Count of active instance-level integrations for HipChat
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175917_projects_inheriting_hipchat_active.yml b/config/metrics/counts_all/20210216175917_projects_inheriting_hipchat_active.yml
new file mode 100644
index 00000000000..0980e3b587c
--- /dev/null
+++ b/config/metrics/counts_all/20210216175917_projects_inheriting_hipchat_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_hipchat_active
+description: Count of active projects inheriting integrations for HipChat
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175919_groups_inheriting_hipchat_active.yml b/config/metrics/counts_all/20210216175919_groups_inheriting_hipchat_active.yml
new file mode 100644
index 00000000000..63c4ee9771d
--- /dev/null
+++ b/config/metrics/counts_all/20210216175919_groups_inheriting_hipchat_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_hipchat_active
+description: Count of active groups inheriting integrations for HipChat
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175921_projects_irker_active.yml b/config/metrics/counts_all/20210216175921_projects_irker_active.yml
new file mode 100644
index 00000000000..7933389ccc0
--- /dev/null
+++ b/config/metrics/counts_all/20210216175921_projects_irker_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_irker_active
+description: Count of projects with active integrations for Irker
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175923_groups_irker_active.yml b/config/metrics/counts_all/20210216175923_groups_irker_active.yml
new file mode 100644
index 00000000000..f845def2053
--- /dev/null
+++ b/config/metrics/counts_all/20210216175923_groups_irker_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_irker_active
+description: Count of groups with active integrations for Irker
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175924_templates_irker_active.yml b/config/metrics/counts_all/20210216175924_templates_irker_active.yml
new file mode 100644
index 00000000000..f40cf42f648
--- /dev/null
+++ b/config/metrics/counts_all/20210216175924_templates_irker_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_irker_active
+description: Count of active service templates for Irker
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175926_instances_irker_active.yml b/config/metrics/counts_all/20210216175926_instances_irker_active.yml
new file mode 100644
index 00000000000..d0f6475446b
--- /dev/null
+++ b/config/metrics/counts_all/20210216175926_instances_irker_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_irker_active
+description: Count of active instance-level integrations for Irker
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175928_projects_inheriting_irker_active.yml b/config/metrics/counts_all/20210216175928_projects_inheriting_irker_active.yml
new file mode 100644
index 00000000000..b805ea65220
--- /dev/null
+++ b/config/metrics/counts_all/20210216175928_projects_inheriting_irker_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_irker_active
+description: Count of active projects inheriting integrations for Irker
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175930_groups_inheriting_irker_active.yml b/config/metrics/counts_all/20210216175930_groups_inheriting_irker_active.yml
new file mode 100644
index 00000000000..99e624a52e8
--- /dev/null
+++ b/config/metrics/counts_all/20210216175930_groups_inheriting_irker_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_irker_active
+description: Count of active groups inheriting integrations for Irker
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175932_projects_jenkins_active.yml b/config/metrics/counts_all/20210216175932_projects_jenkins_active.yml
new file mode 100644
index 00000000000..e16691fa13b
--- /dev/null
+++ b/config/metrics/counts_all/20210216175932_projects_jenkins_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_jenkins_active
+description: Count of projects with active integrations for Jenkins
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175934_groups_jenkins_active.yml b/config/metrics/counts_all/20210216175934_groups_jenkins_active.yml
new file mode 100644
index 00000000000..ccbaa4f96b5
--- /dev/null
+++ b/config/metrics/counts_all/20210216175934_groups_jenkins_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_jenkins_active
+description: Count of groups with active integrations for Jenkins
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175935_templates_jenkins_active.yml b/config/metrics/counts_all/20210216175935_templates_jenkins_active.yml
new file mode 100644
index 00000000000..badea034cd9
--- /dev/null
+++ b/config/metrics/counts_all/20210216175935_templates_jenkins_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_jenkins_active
+description: Count of active service templates for Jenkins
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175937_instances_jenkins_active.yml b/config/metrics/counts_all/20210216175937_instances_jenkins_active.yml
new file mode 100644
index 00000000000..181155322a5
--- /dev/null
+++ b/config/metrics/counts_all/20210216175937_instances_jenkins_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_jenkins_active
+description: Count of active instance-level integrations for Jenkins
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175939_projects_inheriting_jenkins_active.yml b/config/metrics/counts_all/20210216175939_projects_inheriting_jenkins_active.yml
new file mode 100644
index 00000000000..8dbdb6728bb
--- /dev/null
+++ b/config/metrics/counts_all/20210216175939_projects_inheriting_jenkins_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_jenkins_active
+description: Count of active projects inheriting integrations for Jenkins
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175941_groups_inheriting_jenkins_active.yml b/config/metrics/counts_all/20210216175941_groups_inheriting_jenkins_active.yml
new file mode 100644
index 00000000000..7cacd4e5c9c
--- /dev/null
+++ b/config/metrics/counts_all/20210216175941_groups_inheriting_jenkins_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_jenkins_active
+description: Count of active groups inheriting integrations for Jenkins
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175943_projects_jira_active.yml b/config/metrics/counts_all/20210216175943_projects_jira_active.yml
new file mode 100644
index 00000000000..90d645da327
--- /dev/null
+++ b/config/metrics/counts_all/20210216175943_projects_jira_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_jira_active
+description: Count of projects with active integrations for Jira
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175945_groups_jira_active.yml b/config/metrics/counts_all/20210216175945_groups_jira_active.yml
new file mode 100644
index 00000000000..c4fbc196733
--- /dev/null
+++ b/config/metrics/counts_all/20210216175945_groups_jira_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_jira_active
+description: Count of groups with active integrations for Jira
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175946_templates_jira_active.yml b/config/metrics/counts_all/20210216175946_templates_jira_active.yml
new file mode 100644
index 00000000000..861d83df3ec
--- /dev/null
+++ b/config/metrics/counts_all/20210216175946_templates_jira_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_jira_active
+description: Count of active service templates for Jira
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175948_instances_jira_active.yml b/config/metrics/counts_all/20210216175948_instances_jira_active.yml
new file mode 100644
index 00000000000..2d0a7ec85ed
--- /dev/null
+++ b/config/metrics/counts_all/20210216175948_instances_jira_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_jira_active
+description: Count of active instance-level integrations for Jira
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175950_projects_inheriting_jira_active.yml b/config/metrics/counts_all/20210216175950_projects_inheriting_jira_active.yml
new file mode 100644
index 00000000000..6cf7750a60a
--- /dev/null
+++ b/config/metrics/counts_all/20210216175950_projects_inheriting_jira_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_jira_active
+description: Count of active projects inheriting integrations for Jira
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175952_groups_inheriting_jira_active.yml b/config/metrics/counts_all/20210216175952_groups_inheriting_jira_active.yml
new file mode 100644
index 00000000000..0f84ed3863e
--- /dev/null
+++ b/config/metrics/counts_all/20210216175952_groups_inheriting_jira_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_jira_active
+description: Count of active groups inheriting integrations for Jira
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175954_projects_mattermost_active.yml b/config/metrics/counts_all/20210216175954_projects_mattermost_active.yml
new file mode 100644
index 00000000000..67eca7e1fe9
--- /dev/null
+++ b/config/metrics/counts_all/20210216175954_projects_mattermost_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_mattermost_active
+description: Count of projects with active integrations for Mattermost
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175956_groups_mattermost_active.yml b/config/metrics/counts_all/20210216175956_groups_mattermost_active.yml
new file mode 100644
index 00000000000..30a60716409
--- /dev/null
+++ b/config/metrics/counts_all/20210216175956_groups_mattermost_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_mattermost_active
+description: Count of groups with active integrations for Mattermost
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175957_templates_mattermost_active.yml b/config/metrics/counts_all/20210216175957_templates_mattermost_active.yml
new file mode 100644
index 00000000000..e78f17d0547
--- /dev/null
+++ b/config/metrics/counts_all/20210216175957_templates_mattermost_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_mattermost_active
+description: Count of active service templates for Mattermost
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175959_instances_mattermost_active.yml b/config/metrics/counts_all/20210216175959_instances_mattermost_active.yml
new file mode 100644
index 00000000000..8bf633cb085
--- /dev/null
+++ b/config/metrics/counts_all/20210216175959_instances_mattermost_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_mattermost_active
+description: Count of active instance-level integrations for Mattermost
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180001_projects_inheriting_mattermost_active.yml b/config/metrics/counts_all/20210216180001_projects_inheriting_mattermost_active.yml
new file mode 100644
index 00000000000..bca2354131d
--- /dev/null
+++ b/config/metrics/counts_all/20210216180001_projects_inheriting_mattermost_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_mattermost_active
+description: Count of active projects inheriting integrations for Mattermost
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180003_groups_inheriting_mattermost_active.yml b/config/metrics/counts_all/20210216180003_groups_inheriting_mattermost_active.yml
new file mode 100644
index 00000000000..df15e6db792
--- /dev/null
+++ b/config/metrics/counts_all/20210216180003_groups_inheriting_mattermost_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_mattermost_active
+description: Count of active groups inheriting integrations for Mattermost
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180005_projects_mattermost_slash_commands_active.yml b/config/metrics/counts_all/20210216180005_projects_mattermost_slash_commands_active.yml
new file mode 100644
index 00000000000..e0956199e13
--- /dev/null
+++ b/config/metrics/counts_all/20210216180005_projects_mattermost_slash_commands_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_mattermost_slash_commands_active
+description: Count of projects with active integrations for Mattermost (slash commands)
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180006_groups_mattermost_slash_commands_active.yml b/config/metrics/counts_all/20210216180006_groups_mattermost_slash_commands_active.yml
new file mode 100644
index 00000000000..c5f7385d1b8
--- /dev/null
+++ b/config/metrics/counts_all/20210216180006_groups_mattermost_slash_commands_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_mattermost_slash_commands_active
+description: Count of groups with active integrations for Mattermost (slash commands)
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180008_templates_mattermost_slash_commands_active.yml b/config/metrics/counts_all/20210216180008_templates_mattermost_slash_commands_active.yml
new file mode 100644
index 00000000000..504e9d39ee6
--- /dev/null
+++ b/config/metrics/counts_all/20210216180008_templates_mattermost_slash_commands_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_mattermost_slash_commands_active
+description: Count of active service templates for Mattermost (slash commands)
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180010_instances_mattermost_slash_commands_active.yml b/config/metrics/counts_all/20210216180010_instances_mattermost_slash_commands_active.yml
new file mode 100644
index 00000000000..2ccd3bfecc4
--- /dev/null
+++ b/config/metrics/counts_all/20210216180010_instances_mattermost_slash_commands_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_mattermost_slash_commands_active
+description: Count of active instance-level integrations for Mattermost (slash commands)
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180012_projects_inheriting_mattermost_slash_commands_active.yml b/config/metrics/counts_all/20210216180012_projects_inheriting_mattermost_slash_commands_active.yml
new file mode 100644
index 00000000000..271614cff68
--- /dev/null
+++ b/config/metrics/counts_all/20210216180012_projects_inheriting_mattermost_slash_commands_active.yml
@@ -0,0 +1,20 @@
+---
+key_path: counts.projects_inheriting_mattermost_slash_commands_active
+description: Count of active projects inheriting integrations for Mattermost (slash
+ commands)
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180014_groups_inheriting_mattermost_slash_commands_active.yml b/config/metrics/counts_all/20210216180014_groups_inheriting_mattermost_slash_commands_active.yml
new file mode 100644
index 00000000000..df3b7e0175f
--- /dev/null
+++ b/config/metrics/counts_all/20210216180014_groups_inheriting_mattermost_slash_commands_active.yml
@@ -0,0 +1,20 @@
+---
+key_path: counts.groups_inheriting_mattermost_slash_commands_active
+description: Count of active groups inheriting integrations for Mattermost (slash
+ commands)
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180016_projects_microsoft_teams_active.yml b/config/metrics/counts_all/20210216180016_projects_microsoft_teams_active.yml
new file mode 100644
index 00000000000..7f25eb0c4fe
--- /dev/null
+++ b/config/metrics/counts_all/20210216180016_projects_microsoft_teams_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_microsoft_teams_active
+description: Count of projects with active integrations for Microsoft Teams
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180018_groups_microsoft_teams_active.yml b/config/metrics/counts_all/20210216180018_groups_microsoft_teams_active.yml
new file mode 100644
index 00000000000..5f23d34dadd
--- /dev/null
+++ b/config/metrics/counts_all/20210216180018_groups_microsoft_teams_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_microsoft_teams_active
+description: Count of groups with active integrations for Microsoft Teams
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180019_templates_microsoft_teams_active.yml b/config/metrics/counts_all/20210216180019_templates_microsoft_teams_active.yml
new file mode 100644
index 00000000000..fc5b0a2fbbe
--- /dev/null
+++ b/config/metrics/counts_all/20210216180019_templates_microsoft_teams_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_microsoft_teams_active
+description: Count of active service templates for Microsoft Teams
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180021_instances_microsoft_teams_active.yml b/config/metrics/counts_all/20210216180021_instances_microsoft_teams_active.yml
new file mode 100644
index 00000000000..840e4c21ebb
--- /dev/null
+++ b/config/metrics/counts_all/20210216180021_instances_microsoft_teams_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_microsoft_teams_active
+description: Count of active instance-level integrations for Microsoft Teams
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180023_projects_inheriting_microsoft_teams_active.yml b/config/metrics/counts_all/20210216180023_projects_inheriting_microsoft_teams_active.yml
new file mode 100644
index 00000000000..52ee7de311b
--- /dev/null
+++ b/config/metrics/counts_all/20210216180023_projects_inheriting_microsoft_teams_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_microsoft_teams_active
+description: Count of active projects inheriting integrations for Microsoft Teams
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180025_groups_inheriting_microsoft_teams_active.yml b/config/metrics/counts_all/20210216180025_groups_inheriting_microsoft_teams_active.yml
new file mode 100644
index 00000000000..9f91b7119e1
--- /dev/null
+++ b/config/metrics/counts_all/20210216180025_groups_inheriting_microsoft_teams_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_microsoft_teams_active
+description: Count of active groups inheriting integrations for Microsoft Teams
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180027_projects_packagist_active.yml b/config/metrics/counts_all/20210216180027_projects_packagist_active.yml
new file mode 100644
index 00000000000..80ed0d39f9f
--- /dev/null
+++ b/config/metrics/counts_all/20210216180027_projects_packagist_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_packagist_active
+description: Count of projects with active integrations for Packagist
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180029_groups_packagist_active.yml b/config/metrics/counts_all/20210216180029_groups_packagist_active.yml
new file mode 100644
index 00000000000..464d1b4faed
--- /dev/null
+++ b/config/metrics/counts_all/20210216180029_groups_packagist_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_packagist_active
+description: Count of groups with active integrations for Packagist
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180030_templates_packagist_active.yml b/config/metrics/counts_all/20210216180030_templates_packagist_active.yml
new file mode 100644
index 00000000000..a9b8fee8b7a
--- /dev/null
+++ b/config/metrics/counts_all/20210216180030_templates_packagist_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_packagist_active
+description: Count of active service templates for Packagist
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180032_instances_packagist_active.yml b/config/metrics/counts_all/20210216180032_instances_packagist_active.yml
new file mode 100644
index 00000000000..e651adc3e37
--- /dev/null
+++ b/config/metrics/counts_all/20210216180032_instances_packagist_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_packagist_active
+description: Count of active instance-level integrations for Packagist
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180034_projects_inheriting_packagist_active.yml b/config/metrics/counts_all/20210216180034_projects_inheriting_packagist_active.yml
new file mode 100644
index 00000000000..0e9ccdbb907
--- /dev/null
+++ b/config/metrics/counts_all/20210216180034_projects_inheriting_packagist_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_packagist_active
+description: Count of active projects inheriting integrations for Packagist
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180036_groups_inheriting_packagist_active.yml b/config/metrics/counts_all/20210216180036_groups_inheriting_packagist_active.yml
new file mode 100644
index 00000000000..bd1a7750028
--- /dev/null
+++ b/config/metrics/counts_all/20210216180036_groups_inheriting_packagist_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_packagist_active
+description: Count of active groups inheriting integrations for Packagist
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180038_projects_pipelines_email_active.yml b/config/metrics/counts_all/20210216180038_projects_pipelines_email_active.yml
new file mode 100644
index 00000000000..98cd4f28a6c
--- /dev/null
+++ b/config/metrics/counts_all/20210216180038_projects_pipelines_email_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_pipelines_email_active
+description: Count of projects with active integrations for Pipeline Emails
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180040_groups_pipelines_email_active.yml b/config/metrics/counts_all/20210216180040_groups_pipelines_email_active.yml
new file mode 100644
index 00000000000..e781c6a743e
--- /dev/null
+++ b/config/metrics/counts_all/20210216180040_groups_pipelines_email_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_pipelines_email_active
+description: Count of groups with active integrations for Pipeline Emails
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180041_templates_pipelines_email_active.yml b/config/metrics/counts_all/20210216180041_templates_pipelines_email_active.yml
new file mode 100644
index 00000000000..982e0fe8b37
--- /dev/null
+++ b/config/metrics/counts_all/20210216180041_templates_pipelines_email_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_pipelines_email_active
+description: Count of active service templates for Pipeline Emails
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180043_instances_pipelines_email_active.yml b/config/metrics/counts_all/20210216180043_instances_pipelines_email_active.yml
new file mode 100644
index 00000000000..86640daf752
--- /dev/null
+++ b/config/metrics/counts_all/20210216180043_instances_pipelines_email_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_pipelines_email_active
+description: Count of active instance-level integrations for Pipeline Emails
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180045_projects_inheriting_pipelines_email_active.yml b/config/metrics/counts_all/20210216180045_projects_inheriting_pipelines_email_active.yml
new file mode 100644
index 00000000000..42f4638f79e
--- /dev/null
+++ b/config/metrics/counts_all/20210216180045_projects_inheriting_pipelines_email_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_pipelines_email_active
+description: Count of active projects inheriting integrations for Pipeline Emails
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180047_groups_inheriting_pipelines_email_active.yml b/config/metrics/counts_all/20210216180047_groups_inheriting_pipelines_email_active.yml
new file mode 100644
index 00000000000..c1c05c29637
--- /dev/null
+++ b/config/metrics/counts_all/20210216180047_groups_inheriting_pipelines_email_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_pipelines_email_active
+description: Count of active groups inheriting integrations for Pipeline Emails
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180049_projects_pivotaltracker_active.yml b/config/metrics/counts_all/20210216180049_projects_pivotaltracker_active.yml
new file mode 100644
index 00000000000..cc55d603e97
--- /dev/null
+++ b/config/metrics/counts_all/20210216180049_projects_pivotaltracker_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_pivotaltracker_active
+description: Count of projects with active integrations for Pivotal Tracker
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180051_groups_pivotaltracker_active.yml b/config/metrics/counts_all/20210216180051_groups_pivotaltracker_active.yml
new file mode 100644
index 00000000000..170951d9295
--- /dev/null
+++ b/config/metrics/counts_all/20210216180051_groups_pivotaltracker_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_pivotaltracker_active
+description: Count of groups with active integrations for Pivotal Tracker
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180052_templates_pivotaltracker_active.yml b/config/metrics/counts_all/20210216180052_templates_pivotaltracker_active.yml
new file mode 100644
index 00000000000..9786b72a10f
--- /dev/null
+++ b/config/metrics/counts_all/20210216180052_templates_pivotaltracker_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_pivotaltracker_active
+description: Count of active service templates for Pivotal Tracker
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180054_instances_pivotaltracker_active.yml b/config/metrics/counts_all/20210216180054_instances_pivotaltracker_active.yml
new file mode 100644
index 00000000000..6988d6ebdd4
--- /dev/null
+++ b/config/metrics/counts_all/20210216180054_instances_pivotaltracker_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_pivotaltracker_active
+description: Count of active instance-level integrations for Pivotal Tracker
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180056_projects_inheriting_pivotaltracker_active.yml b/config/metrics/counts_all/20210216180056_projects_inheriting_pivotaltracker_active.yml
new file mode 100644
index 00000000000..8bd473a7615
--- /dev/null
+++ b/config/metrics/counts_all/20210216180056_projects_inheriting_pivotaltracker_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_pivotaltracker_active
+description: Count of active projects inheriting integrations for Pivotal Tracker
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180058_groups_inheriting_pivotaltracker_active.yml b/config/metrics/counts_all/20210216180058_groups_inheriting_pivotaltracker_active.yml
new file mode 100644
index 00000000000..682ae485610
--- /dev/null
+++ b/config/metrics/counts_all/20210216180058_groups_inheriting_pivotaltracker_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_pivotaltracker_active
+description: Count of active groups inheriting integrations for Pivotal Tracker
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180100_projects_pushover_active.yml b/config/metrics/counts_all/20210216180100_projects_pushover_active.yml
new file mode 100644
index 00000000000..89584d140db
--- /dev/null
+++ b/config/metrics/counts_all/20210216180100_projects_pushover_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_pushover_active
+description: Count of projects with active integrations for Pushover
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180102_groups_pushover_active.yml b/config/metrics/counts_all/20210216180102_groups_pushover_active.yml
new file mode 100644
index 00000000000..d5502041537
--- /dev/null
+++ b/config/metrics/counts_all/20210216180102_groups_pushover_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_pushover_active
+description: Count of groups with active integrations for Pushover
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180104_templates_pushover_active.yml b/config/metrics/counts_all/20210216180104_templates_pushover_active.yml
new file mode 100644
index 00000000000..598129d3ef6
--- /dev/null
+++ b/config/metrics/counts_all/20210216180104_templates_pushover_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_pushover_active
+description: Count of active service templates for Pushover
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180105_instances_pushover_active.yml b/config/metrics/counts_all/20210216180105_instances_pushover_active.yml
new file mode 100644
index 00000000000..105fd4ff93a
--- /dev/null
+++ b/config/metrics/counts_all/20210216180105_instances_pushover_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_pushover_active
+description: Count of active instance-level integrations for Pushover
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180107_projects_inheriting_pushover_active.yml b/config/metrics/counts_all/20210216180107_projects_inheriting_pushover_active.yml
new file mode 100644
index 00000000000..40b3e92c29e
--- /dev/null
+++ b/config/metrics/counts_all/20210216180107_projects_inheriting_pushover_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_pushover_active
+description: Count of active projects inheriting integrations for Pushover
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180109_groups_inheriting_pushover_active.yml b/config/metrics/counts_all/20210216180109_groups_inheriting_pushover_active.yml
new file mode 100644
index 00000000000..f99265b4c85
--- /dev/null
+++ b/config/metrics/counts_all/20210216180109_groups_inheriting_pushover_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_pushover_active
+description: Count of active groups inheriting integrations for Pushover
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180111_projects_redmine_active.yml b/config/metrics/counts_all/20210216180111_projects_redmine_active.yml
new file mode 100644
index 00000000000..d2b34fd0143
--- /dev/null
+++ b/config/metrics/counts_all/20210216180111_projects_redmine_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_redmine_active
+description: Count of projects with active integrations for Redmine
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180113_groups_redmine_active.yml b/config/metrics/counts_all/20210216180113_groups_redmine_active.yml
new file mode 100644
index 00000000000..a3e68fd6d1a
--- /dev/null
+++ b/config/metrics/counts_all/20210216180113_groups_redmine_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_redmine_active
+description: Count of groups with active integrations for Redmine
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180115_templates_redmine_active.yml b/config/metrics/counts_all/20210216180115_templates_redmine_active.yml
new file mode 100644
index 00000000000..b0000ba32df
--- /dev/null
+++ b/config/metrics/counts_all/20210216180115_templates_redmine_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_redmine_active
+description: Count of active service templates for Redmine
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180116_instances_redmine_active.yml b/config/metrics/counts_all/20210216180116_instances_redmine_active.yml
new file mode 100644
index 00000000000..c3c0012e205
--- /dev/null
+++ b/config/metrics/counts_all/20210216180116_instances_redmine_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_redmine_active
+description: Count of active instance-level integrations for Redmine
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180118_projects_inheriting_redmine_active.yml b/config/metrics/counts_all/20210216180118_projects_inheriting_redmine_active.yml
new file mode 100644
index 00000000000..85ecfafcc70
--- /dev/null
+++ b/config/metrics/counts_all/20210216180118_projects_inheriting_redmine_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_redmine_active
+description: Count of active projects inheriting integrations for Redmine
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180120_groups_inheriting_redmine_active.yml b/config/metrics/counts_all/20210216180120_groups_inheriting_redmine_active.yml
new file mode 100644
index 00000000000..a929408e5da
--- /dev/null
+++ b/config/metrics/counts_all/20210216180120_groups_inheriting_redmine_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_redmine_active
+description: Count of active groups inheriting integrations for Redmine
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180122_projects_slack_active.yml b/config/metrics/counts_all/20210216180122_projects_slack_active.yml
new file mode 100644
index 00000000000..2b6b06e97d9
--- /dev/null
+++ b/config/metrics/counts_all/20210216180122_projects_slack_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_slack_active
+description: Count of projects with active integrations for Slack
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180124_groups_slack_active.yml b/config/metrics/counts_all/20210216180124_groups_slack_active.yml
new file mode 100644
index 00000000000..60175f2861f
--- /dev/null
+++ b/config/metrics/counts_all/20210216180124_groups_slack_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_slack_active
+description: Count of groups with active integrations for Slack
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180126_templates_slack_active.yml b/config/metrics/counts_all/20210216180126_templates_slack_active.yml
new file mode 100644
index 00000000000..3fe78e3b847
--- /dev/null
+++ b/config/metrics/counts_all/20210216180126_templates_slack_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_slack_active
+description: Count of active service templates for Slack
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180127_instances_slack_active.yml b/config/metrics/counts_all/20210216180127_instances_slack_active.yml
new file mode 100644
index 00000000000..cb98faf7494
--- /dev/null
+++ b/config/metrics/counts_all/20210216180127_instances_slack_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_slack_active
+description: Count of active instance-level integrations for Slack
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180129_projects_inheriting_slack_active.yml b/config/metrics/counts_all/20210216180129_projects_inheriting_slack_active.yml
new file mode 100644
index 00000000000..4f5613fb904
--- /dev/null
+++ b/config/metrics/counts_all/20210216180129_projects_inheriting_slack_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_slack_active
+description: Count of active projects inheriting integrations for Slack
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180131_groups_inheriting_slack_active.yml b/config/metrics/counts_all/20210216180131_groups_inheriting_slack_active.yml
new file mode 100644
index 00000000000..780104bd60e
--- /dev/null
+++ b/config/metrics/counts_all/20210216180131_groups_inheriting_slack_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_slack_active
+description: Count of active groups inheriting integrations for Slack
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180133_projects_slack_slash_commands_active.yml b/config/metrics/counts_all/20210216180133_projects_slack_slash_commands_active.yml
new file mode 100644
index 00000000000..e2ae91c83ce
--- /dev/null
+++ b/config/metrics/counts_all/20210216180133_projects_slack_slash_commands_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_slack_slash_commands_active
+description: Count of projects with active integrations for Slack (slash commands)
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180135_groups_slack_slash_commands_active.yml b/config/metrics/counts_all/20210216180135_groups_slack_slash_commands_active.yml
new file mode 100644
index 00000000000..0850c45bcc1
--- /dev/null
+++ b/config/metrics/counts_all/20210216180135_groups_slack_slash_commands_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_slack_slash_commands_active
+description: Count of groups with active integrations for Slack (slash commands)
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180137_templates_slack_slash_commands_active.yml b/config/metrics/counts_all/20210216180137_templates_slack_slash_commands_active.yml
new file mode 100644
index 00000000000..b68cee5b004
--- /dev/null
+++ b/config/metrics/counts_all/20210216180137_templates_slack_slash_commands_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_slack_slash_commands_active
+description: Count of active service templates for Slack (slash commands)
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180138_instances_slack_slash_commands_active.yml b/config/metrics/counts_all/20210216180138_instances_slack_slash_commands_active.yml
new file mode 100644
index 00000000000..c629bbe7b81
--- /dev/null
+++ b/config/metrics/counts_all/20210216180138_instances_slack_slash_commands_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_slack_slash_commands_active
+description: Count of active instance-level integrations for Slack (slash commands)
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180140_projects_inheriting_slack_slash_commands_active.yml b/config/metrics/counts_all/20210216180140_projects_inheriting_slack_slash_commands_active.yml
new file mode 100644
index 00000000000..5fbba405579
--- /dev/null
+++ b/config/metrics/counts_all/20210216180140_projects_inheriting_slack_slash_commands_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_slack_slash_commands_active
+description: Count of active projects inheriting integrations for Slack (slash commands)
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180142_groups_inheriting_slack_slash_commands_active.yml b/config/metrics/counts_all/20210216180142_groups_inheriting_slack_slash_commands_active.yml
new file mode 100644
index 00000000000..96cc7b0bcaa
--- /dev/null
+++ b/config/metrics/counts_all/20210216180142_groups_inheriting_slack_slash_commands_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_slack_slash_commands_active
+description: Count of active groups inheriting integrations for Slack (slash commands)
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180144_projects_teamcity_active.yml b/config/metrics/counts_all/20210216180144_projects_teamcity_active.yml
new file mode 100644
index 00000000000..482360e0c87
--- /dev/null
+++ b/config/metrics/counts_all/20210216180144_projects_teamcity_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_teamcity_active
+description: Count of projects with active integrations for Teamcity CI
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180146_groups_teamcity_active.yml b/config/metrics/counts_all/20210216180146_groups_teamcity_active.yml
new file mode 100644
index 00000000000..efaf3b72f08
--- /dev/null
+++ b/config/metrics/counts_all/20210216180146_groups_teamcity_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_teamcity_active
+description: Count of groups with active integrations for Teamcity CI
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180148_templates_teamcity_active.yml b/config/metrics/counts_all/20210216180148_templates_teamcity_active.yml
new file mode 100644
index 00000000000..8fe6f5997f3
--- /dev/null
+++ b/config/metrics/counts_all/20210216180148_templates_teamcity_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_teamcity_active
+description: Count of active service templates for Teamcity CI
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180149_instances_teamcity_active.yml b/config/metrics/counts_all/20210216180149_instances_teamcity_active.yml
new file mode 100644
index 00000000000..52f6d89497d
--- /dev/null
+++ b/config/metrics/counts_all/20210216180149_instances_teamcity_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_teamcity_active
+description: Count of active instance-level integrations for Teamcity CI
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180151_projects_inheriting_teamcity_active.yml b/config/metrics/counts_all/20210216180151_projects_inheriting_teamcity_active.yml
new file mode 100644
index 00000000000..e8ea1ffb556
--- /dev/null
+++ b/config/metrics/counts_all/20210216180151_projects_inheriting_teamcity_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_teamcity_active
+description: Count of active projects inheriting integrations for Teamcity CI
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180153_groups_inheriting_teamcity_active.yml b/config/metrics/counts_all/20210216180153_groups_inheriting_teamcity_active.yml
new file mode 100644
index 00000000000..4656bda6da0
--- /dev/null
+++ b/config/metrics/counts_all/20210216180153_groups_inheriting_teamcity_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_teamcity_active
+description: Count of active groups inheriting integrations for Teamcity CI
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180155_projects_unify_circuit_active.yml b/config/metrics/counts_all/20210216180155_projects_unify_circuit_active.yml
new file mode 100644
index 00000000000..4d783cd061f
--- /dev/null
+++ b/config/metrics/counts_all/20210216180155_projects_unify_circuit_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_unify_circuit_active
+description: Count of projects with active integrations for Unifiy Circuit
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180157_groups_unify_circuit_active.yml b/config/metrics/counts_all/20210216180157_groups_unify_circuit_active.yml
new file mode 100644
index 00000000000..074ab951200
--- /dev/null
+++ b/config/metrics/counts_all/20210216180157_groups_unify_circuit_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_unify_circuit_active
+description: Count of groups with active integrations for Unifiy Circuit
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180159_templates_unify_circuit_active.yml b/config/metrics/counts_all/20210216180159_templates_unify_circuit_active.yml
new file mode 100644
index 00000000000..99f54dfa276
--- /dev/null
+++ b/config/metrics/counts_all/20210216180159_templates_unify_circuit_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_unify_circuit_active
+description: Count of active service templates for Unifiy Circuit
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180201_instances_unify_circuit_active.yml b/config/metrics/counts_all/20210216180201_instances_unify_circuit_active.yml
new file mode 100644
index 00000000000..0ca2893868c
--- /dev/null
+++ b/config/metrics/counts_all/20210216180201_instances_unify_circuit_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_unify_circuit_active
+description: Count of active instance-level integrations for Unifiy Circuit
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180203_projects_inheriting_unify_circuit_active.yml b/config/metrics/counts_all/20210216180203_projects_inheriting_unify_circuit_active.yml
new file mode 100644
index 00000000000..30172dcac3f
--- /dev/null
+++ b/config/metrics/counts_all/20210216180203_projects_inheriting_unify_circuit_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_unify_circuit_active
+description: Count of active projects inheriting integrations for Unifiy Circuit
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180204_groups_inheriting_unify_circuit_active.yml b/config/metrics/counts_all/20210216180204_groups_inheriting_unify_circuit_active.yml
new file mode 100644
index 00000000000..4334a352566
--- /dev/null
+++ b/config/metrics/counts_all/20210216180204_groups_inheriting_unify_circuit_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_unify_circuit_active
+description: Count of active groups inheriting integrations for Unifiy Circuit
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180206_projects_webex_teams_active.yml b/config/metrics/counts_all/20210216180206_projects_webex_teams_active.yml
new file mode 100644
index 00000000000..7590bf98d81
--- /dev/null
+++ b/config/metrics/counts_all/20210216180206_projects_webex_teams_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_webex_teams_active
+description: Count of projects with active integrations for Webex Teams
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180208_groups_webex_teams_active.yml b/config/metrics/counts_all/20210216180208_groups_webex_teams_active.yml
new file mode 100644
index 00000000000..15f4ccda503
--- /dev/null
+++ b/config/metrics/counts_all/20210216180208_groups_webex_teams_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_webex_teams_active
+description: Count of groups with active integrations for Webex Teams
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180210_templates_webex_teams_active.yml b/config/metrics/counts_all/20210216180210_templates_webex_teams_active.yml
new file mode 100644
index 00000000000..36d21424329
--- /dev/null
+++ b/config/metrics/counts_all/20210216180210_templates_webex_teams_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_webex_teams_active
+description: Count of active service templates for Webex Teams
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180212_instances_webex_teams_active.yml b/config/metrics/counts_all/20210216180212_instances_webex_teams_active.yml
new file mode 100644
index 00000000000..0b66249713b
--- /dev/null
+++ b/config/metrics/counts_all/20210216180212_instances_webex_teams_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_webex_teams_active
+description: Count of active instance-level integrations for Webex Teams
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180214_projects_inheriting_webex_teams_active.yml b/config/metrics/counts_all/20210216180214_projects_inheriting_webex_teams_active.yml
new file mode 100644
index 00000000000..b1b91278215
--- /dev/null
+++ b/config/metrics/counts_all/20210216180214_projects_inheriting_webex_teams_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_webex_teams_active
+description: Count of active projects inheriting integrations for Webex Teams
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180215_groups_inheriting_webex_teams_active.yml b/config/metrics/counts_all/20210216180215_groups_inheriting_webex_teams_active.yml
new file mode 100644
index 00000000000..bd1986796d7
--- /dev/null
+++ b/config/metrics/counts_all/20210216180215_groups_inheriting_webex_teams_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_webex_teams_active
+description: Count of active groups inheriting integrations for Webex Teams
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180217_projects_youtrack_active.yml b/config/metrics/counts_all/20210216180217_projects_youtrack_active.yml
new file mode 100644
index 00000000000..1225d494f77
--- /dev/null
+++ b/config/metrics/counts_all/20210216180217_projects_youtrack_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_youtrack_active
+description: Count of projects with active integrations for YouTrack
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180219_groups_youtrack_active.yml b/config/metrics/counts_all/20210216180219_groups_youtrack_active.yml
new file mode 100644
index 00000000000..47389011bcf
--- /dev/null
+++ b/config/metrics/counts_all/20210216180219_groups_youtrack_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_youtrack_active
+description: Count of groups with active integrations for YouTrack
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180221_templates_youtrack_active.yml b/config/metrics/counts_all/20210216180221_templates_youtrack_active.yml
new file mode 100644
index 00000000000..c89c8602877
--- /dev/null
+++ b/config/metrics/counts_all/20210216180221_templates_youtrack_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_youtrack_active
+description: Count of active service templates for YouTrack
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180223_instances_youtrack_active.yml b/config/metrics/counts_all/20210216180223_instances_youtrack_active.yml
new file mode 100644
index 00000000000..a5316c15120
--- /dev/null
+++ b/config/metrics/counts_all/20210216180223_instances_youtrack_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_youtrack_active
+description: Count of active instance-level integrations for YouTrack
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180225_projects_inheriting_youtrack_active.yml b/config/metrics/counts_all/20210216180225_projects_inheriting_youtrack_active.yml
new file mode 100644
index 00000000000..982ad4dfdad
--- /dev/null
+++ b/config/metrics/counts_all/20210216180225_projects_inheriting_youtrack_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_youtrack_active
+description: Count of active projects inheriting integrations for YouTrack
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180226_groups_inheriting_youtrack_active.yml b/config/metrics/counts_all/20210216180226_groups_inheriting_youtrack_active.yml
new file mode 100644
index 00000000000..2a86d74ebf3
--- /dev/null
+++ b/config/metrics/counts_all/20210216180226_groups_inheriting_youtrack_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_youtrack_active
+description: Count of active groups inheriting integrations for YouTrack
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180228_projects_jira_server_active.yml b/config/metrics/counts_all/20210216180228_projects_jira_server_active.yml
new file mode 100644
index 00000000000..88d0d954780
--- /dev/null
+++ b/config/metrics/counts_all/20210216180228_projects_jira_server_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_jira_server_active
+description: Count of active integrations with Jira Software (server)
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180230_projects_jira_cloud_active.yml b/config/metrics/counts_all/20210216180230_projects_jira_cloud_active.yml
new file mode 100644
index 00000000000..d2a5cfc062c
--- /dev/null
+++ b/config/metrics/counts_all/20210216180230_projects_jira_cloud_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_jira_cloud_active
+description: Count of active integrations with Jira Cloud (Saas)
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180232_projects_jira_dvcs_cloud_active.yml b/config/metrics/counts_all/20210216180232_projects_jira_dvcs_cloud_active.yml
new file mode 100644
index 00000000000..aa362c989de
--- /dev/null
+++ b/config/metrics/counts_all/20210216180232_projects_jira_dvcs_cloud_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_jira_dvcs_cloud_active
+description: Count of active integrations with Jira Cloud (DVCS Connector)
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180234_projects_jira_dvcs_server_active.yml b/config/metrics/counts_all/20210216180234_projects_jira_dvcs_server_active.yml
new file mode 100644
index 00000000000..fb3df0de122
--- /dev/null
+++ b/config/metrics/counts_all/20210216180234_projects_jira_dvcs_server_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_jira_dvcs_server_active
+description: Count of active integrations with Jira Software (DVCS connector)
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180239_personal_snippets.yml b/config/metrics/counts_all/20210216180239_personal_snippets.yml
new file mode 100644
index 00000000000..1578c3264f3
--- /dev/null
+++ b/config/metrics/counts_all/20210216180239_personal_snippets.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.personal_snippets
+description: Count of Personal Snippets
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: snippets
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180241_project_snippets.yml b/config/metrics/counts_all/20210216180241_project_snippets.yml
new file mode 100644
index 00000000000..f30757e4137
--- /dev/null
+++ b/config/metrics/counts_all/20210216180241_project_snippets.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.project_snippets
+description: Count of Project Snippetss
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: snippets
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180242_web_ide_commits.yml b/config/metrics/counts_all/20210216180242_web_ide_commits.yml
new file mode 100644
index 00000000000..33566cf602f
--- /dev/null
+++ b/config/metrics/counts_all/20210216180242_web_ide_commits.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.web_ide_commits
+description: Count of Commits made from Web IDE
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: web_ide
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180244_web_ide_views.yml b/config/metrics/counts_all/20210216180244_web_ide_views.yml
new file mode 100644
index 00000000000..5f94d706cdd
--- /dev/null
+++ b/config/metrics/counts_all/20210216180244_web_ide_views.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.web_ide_views
+description: Count of Views of the Web IDE
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: web_ide
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180246_web_ide_merge_requests.yml b/config/metrics/counts_all/20210216180246_web_ide_merge_requests.yml
new file mode 100644
index 00000000000..2df821ee8ad
--- /dev/null
+++ b/config/metrics/counts_all/20210216180246_web_ide_merge_requests.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.web_ide_merge_requests
+description: Count of Merge Requests created from Web IDE
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: web_ide
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180248_web_ide_previews.yml b/config/metrics/counts_all/20210216180248_web_ide_previews.yml
new file mode 100644
index 00000000000..854fe84155e
--- /dev/null
+++ b/config/metrics/counts_all/20210216180248_web_ide_previews.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.web_ide_previews
+description: Count of Live Preview tab views in Web IDE
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: web_ide
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180250_web_ide_terminals.yml b/config/metrics/counts_all/20210216180250_web_ide_terminals.yml
new file mode 100644
index 00000000000..8860a73c262
--- /dev/null
+++ b/config/metrics/counts_all/20210216180250_web_ide_terminals.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.web_ide_terminals
+description: Count of Web Terminal Tab views in Web IDE
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: web_ide
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180252_web_ide_pipelines.yml b/config/metrics/counts_all/20210216180252_web_ide_pipelines.yml
new file mode 100644
index 00000000000..229a4000fde
--- /dev/null
+++ b/config/metrics/counts_all/20210216180252_web_ide_pipelines.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.web_ide_pipelines
+description: Count of Pipeline tab views in Web IDE
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: web_ide
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180253_snippet_comment.yml b/config/metrics/counts_all/20210216180253_snippet_comment.yml
new file mode 100644
index 00000000000..86353b84645
--- /dev/null
+++ b/config/metrics/counts_all/20210216180253_snippet_comment.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.snippet_comment
+description: Count of comments on Snippets
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: snippets
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180255_snippet_create.yml b/config/metrics/counts_all/20210216180255_snippet_create.yml
new file mode 100644
index 00000000000..5b527992d12
--- /dev/null
+++ b/config/metrics/counts_all/20210216180255_snippet_create.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.snippet_create
+description: Count of newly created Snippets
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: snippets
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180257_snippet_update.yml b/config/metrics/counts_all/20210216180257_snippet_update.yml
new file mode 100644
index 00000000000..2c909d8a9fc
--- /dev/null
+++ b/config/metrics/counts_all/20210216180257_snippet_update.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.snippet_update
+description: Count of updates to existing Snippets
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: snippets
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180259_static_site_editor_views.yml b/config/metrics/counts_all/20210216180259_static_site_editor_views.yml
new file mode 100644
index 00000000000..e5836202a74
--- /dev/null
+++ b/config/metrics/counts_all/20210216180259_static_site_editor_views.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.static_site_editor_views
+description:
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: static_site_editor
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180301_static_site_editor_commits.yml b/config/metrics/counts_all/20210216180301_static_site_editor_commits.yml
new file mode 100644
index 00000000000..5dc21447e37
--- /dev/null
+++ b/config/metrics/counts_all/20210216180301_static_site_editor_commits.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.static_site_editor_commits
+description: Count of commits created via Static Site Editor
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: static_site_editor
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180303_static_site_editor_merge_requests.yml b/config/metrics/counts_all/20210216180303_static_site_editor_merge_requests.yml
new file mode 100644
index 00000000000..3e38b9f8f7b
--- /dev/null
+++ b/config/metrics/counts_all/20210216180303_static_site_editor_merge_requests.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.static_site_editor_merge_requests
+description: Count of merge requests created via Static Site Editor
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: static_site_editor
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180304_user_preferences_user_gitpod_enabled.yml b/config/metrics/counts_all/20210216180304_user_preferences_user_gitpod_enabled.yml
new file mode 100644
index 00000000000..2223e4b2e46
--- /dev/null
+++ b/config/metrics/counts_all/20210216180304_user_preferences_user_gitpod_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.user_preferences_user_gitpod_enabled
+description: Count all users with their GitPod setting enabled
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: editor_extension
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180306_snippets.yml b/config/metrics/counts_all/20210216180306_snippets.yml
new file mode 100644
index 00000000000..213e61e2d0f
--- /dev/null
+++ b/config/metrics/counts_all/20210216180306_snippets.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.snippets
+description: Count of all Snippets
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: snippets
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180316_snippets.yml b/config/metrics/counts_all/20210216180316_snippets.yml
new file mode 100644
index 00000000000..8c829055aa0
--- /dev/null
+++ b/config/metrics/counts_all/20210216180316_snippets.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.create.snippets
+description: Snippets
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: snippets
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180344_api_fuzzing_jobs.yml b/config/metrics/counts_all/20210216180344_api_fuzzing_jobs.yml
new file mode 100644
index 00000000000..31d9650c54e
--- /dev/null
+++ b/config/metrics/counts_all/20210216180344_api_fuzzing_jobs.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.api_fuzzing_jobs
+description: Count of API Fuzzing jobs run by job name
+product_section: sec
+product_stage: secure
+product_group: group::fuzz testing
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180346_api_fuzzing_dnd_jobs.yml b/config/metrics/counts_all/20210216180346_api_fuzzing_dnd_jobs.yml
new file mode 100644
index 00000000000..deef6c0f6d4
--- /dev/null
+++ b/config/metrics/counts_all/20210216180346_api_fuzzing_dnd_jobs.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.api_fuzzing_dnd_jobs
+description: Count of API Fuzzing `docker-in-docker` jobs run by job name
+product_section: sec
+product_stage: secure
+product_group: group::fuzz testing
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180348_user_api_fuzzing_jobs.yml b/config/metrics/counts_all/20210216180348_user_api_fuzzing_jobs.yml
new file mode 100644
index 00000000000..ab35c608bcb
--- /dev/null
+++ b/config/metrics/counts_all/20210216180348_user_api_fuzzing_jobs.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.secure.user_api_fuzzing_jobs
+description: Count of API Fuzzing jobs by job name
+product_section: sec
+product_stage: secure
+product_group: group::fuzz testing
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180350_user_api_fuzzing_dnd_jobs.yml b/config/metrics/counts_all/20210216180350_user_api_fuzzing_dnd_jobs.yml
new file mode 100644
index 00000000000..04b1177dacf
--- /dev/null
+++ b/config/metrics/counts_all/20210216180350_user_api_fuzzing_dnd_jobs.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.secure.user_api_fuzzing_dnd_jobs
+description: Count of API Fuzzing `docker-in-docker` jobs by job name
+product_section: sec
+product_stage: secure
+product_group: group::fuzz testing
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180410_pool_repositories.yml b/config/metrics/counts_all/20210216180410_pool_repositories.yml
new file mode 100644
index 00000000000..57922524ccf
--- /dev/null
+++ b/config/metrics/counts_all/20210216180410_pool_repositories.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.pool_repositories
+description: Count of unique object pool repositories for fork deduplication
+product_section: dev
+product_stage: create
+product_group: group::gitaly
+product_category: gitaly
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180413_all_searches.yml b/config/metrics/counts_all/20210216180413_all_searches.yml
new file mode 100644
index 00000000000..6248b096663
--- /dev/null
+++ b/config/metrics/counts_all/20210216180413_all_searches.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.all_searches
+description: Total Searches for All Basic Search and Advanced Search in self-managed
+ and SaaS
+product_section: enablement
+product_stage: enablement
+product_group: group::global search
+product_category: global_search
+value_type: number
+status: data_available
+time_frame: all
+data_source: redis
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_all/20210216180414_navbar_searches.yml b/config/metrics/counts_all/20210216180414_navbar_searches.yml
new file mode 100644
index 00000000000..1eb21d02f9d
--- /dev/null
+++ b/config/metrics/counts_all/20210216180414_navbar_searches.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.navbar_searches
+description: Total Searches using the navbar for All Basic Search and Advanced Search in self-managed
+ and SaaS
+product_section: enablement
+product_stage: enablement
+product_group: group::global search
+product_category: global_search
+value_type: number
+status: data_available
+time_frame: all
+data_source: redis
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_all/20210216180416_i_search_total.yml b/config/metrics/counts_all/20210216180416_i_search_total.yml
new file mode 100644
index 00000000000..2c59b083293
--- /dev/null
+++ b/config/metrics/counts_all/20210216180416_i_search_total.yml
@@ -0,0 +1,18 @@
+---
+key_path: search_unique_visits.i_search_total
+description: Calculated unique users to perform Basic or Advanced searches by week
+product_section: enablement
+product_stage: enablement
+product_group: group::global search
+product_category: global_search
+value_type: number
+status: data_available
+time_frame: all
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_all/20210216180434_issues_created_from_gitlab_error_tracking_ui.yml b/config/metrics/counts_all/20210216180434_issues_created_from_gitlab_error_tracking_ui.yml
new file mode 100644
index 00000000000..a8e4acaae15
--- /dev/null
+++ b/config/metrics/counts_all/20210216180434_issues_created_from_gitlab_error_tracking_ui.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.issues_created_from_gitlab_error_tracking_ui
+description: Count of issues manually created from the GitLab UI on Sentry errors
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: error_tracking
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180436_issues_with_associated_zoom_link.yml b/config/metrics/counts_all/20210216180436_issues_with_associated_zoom_link.yml
new file mode 100644
index 00000000000..f1ab4c0cec1
--- /dev/null
+++ b/config/metrics/counts_all/20210216180436_issues_with_associated_zoom_link.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.issues_with_associated_zoom_link
+description: Count of issues where a user has linked a Zoom meeting
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180438_issues_using_zoom_quick_actions.yml b/config/metrics/counts_all/20210216180438_issues_using_zoom_quick_actions.yml
new file mode 100644
index 00000000000..403cd2ecbcb
--- /dev/null
+++ b/config/metrics/counts_all/20210216180438_issues_using_zoom_quick_actions.yml
@@ -0,0 +1,20 @@
+---
+key_path: counts.issues_using_zoom_quick_actions
+description: Count of issues where a user have added AND removed a zoom meeting using
+ slash commands
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180440_issues_with_embedded_grafana_charts_approx.yml b/config/metrics/counts_all/20210216180440_issues_with_embedded_grafana_charts_approx.yml
new file mode 100644
index 00000000000..3dcf3754cd8
--- /dev/null
+++ b/config/metrics/counts_all/20210216180440_issues_with_embedded_grafana_charts_approx.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.issues_with_embedded_grafana_charts_approx
+description: Count of issues where a user has embedded a Grafana chart
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180441_issues_created_from_alerts.yml b/config/metrics/counts_all/20210216180441_issues_created_from_alerts.yml
new file mode 100644
index 00000000000..a032f8a2a33
--- /dev/null
+++ b/config/metrics/counts_all/20210216180441_issues_created_from_alerts.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.issues_created_from_alerts
+description: Count of issues created automatically on alerts from GitLab-Managed Prometheus
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180443_issues_created_gitlab_alerts.yml b/config/metrics/counts_all/20210216180443_issues_created_gitlab_alerts.yml
new file mode 100644
index 00000000000..ca9cfc92d0e
--- /dev/null
+++ b/config/metrics/counts_all/20210216180443_issues_created_gitlab_alerts.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.issues_created_gitlab_alerts
+description: Count of all issues created from GitLab alerts (bot and non-bot)
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180445_issues_created_manually_from_alerts.yml b/config/metrics/counts_all/20210216180445_issues_created_manually_from_alerts.yml
new file mode 100644
index 00000000000..02ca2d6499e
--- /dev/null
+++ b/config/metrics/counts_all/20210216180445_issues_created_manually_from_alerts.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.issues_created_manually_from_alerts
+description: Count of issues created manually by non-bot users from GitLab alerts
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180447_incident_issues.yml b/config/metrics/counts_all/20210216180447_incident_issues.yml
new file mode 100644
index 00000000000..9d348fc5a3d
--- /dev/null
+++ b/config/metrics/counts_all/20210216180447_incident_issues.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.incident_issues
+description: Count of incidents (issues where issue_type=incident)
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180449_alert_bot_incident_issues.yml b/config/metrics/counts_all/20210216180449_alert_bot_incident_issues.yml
new file mode 100644
index 00000000000..e7b7e2c801b
--- /dev/null
+++ b/config/metrics/counts_all/20210216180449_alert_bot_incident_issues.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.alert_bot_incident_issues
+description: Count of issues created by the alert bot automatically
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180451_incident_labeled_issues.yml b/config/metrics/counts_all/20210216180451_incident_labeled_issues.yml
new file mode 100644
index 00000000000..4db557d00c4
--- /dev/null
+++ b/config/metrics/counts_all/20210216180451_incident_labeled_issues.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.incident_labeled_issues
+description: Count of all issues with the label=incident
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180453_projects_creating_incidents.yml b/config/metrics/counts_all/20210216180453_projects_creating_incidents.yml
new file mode 100644
index 00000000000..3fbbbdece3d
--- /dev/null
+++ b/config/metrics/counts_all/20210216180453_projects_creating_incidents.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_creating_incidents
+description: Counts of Projects that have created incidents
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180454_projects_with_error_tracking_enabled.yml b/config/metrics/counts_all/20210216180454_projects_with_error_tracking_enabled.yml
new file mode 100644
index 00000000000..4bdec4be171
--- /dev/null
+++ b/config/metrics/counts_all/20210216180454_projects_with_error_tracking_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_with_error_tracking_enabled
+description: Count of projects that have enabled Error tracking via Sentry
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: error_tracking
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180456_projects_with_alerts_service_enabled.yml b/config/metrics/counts_all/20210216180456_projects_with_alerts_service_enabled.yml
new file mode 100644
index 00000000000..7f7c3b4d91a
--- /dev/null
+++ b/config/metrics/counts_all/20210216180456_projects_with_alerts_service_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_with_alerts_service_enabled
+description: Count of projects that have enabled the Alerts service
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180458_projects_with_alerts_created.yml b/config/metrics/counts_all/20210216180458_projects_with_alerts_created.yml
new file mode 100644
index 00000000000..4fe6799d027
--- /dev/null
+++ b/config/metrics/counts_all/20210216180458_projects_with_alerts_created.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_with_alerts_created
+description: Count of projects with alerts created in given time period
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: alert_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180500_projects_with_enabled_alert_integrations.yml b/config/metrics/counts_all/20210216180500_projects_with_enabled_alert_integrations.yml
new file mode 100644
index 00000000000..e850bb6c2a8
--- /dev/null
+++ b/config/metrics/counts_all/20210216180500_projects_with_enabled_alert_integrations.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_with_enabled_alert_integrations
+description: Count of projects with at least 1 enabled integration
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180502_status_page_incident_publishes.yml b/config/metrics/counts_all/20210216180502_status_page_incident_publishes.yml
new file mode 100644
index 00000000000..e1c1bfafe31
--- /dev/null
+++ b/config/metrics/counts_all/20210216180502_status_page_incident_publishes.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.status_page_incident_publishes
+description: Cumulative count of usages of publish operation
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180504_status_page_incident_unpublishes.yml b/config/metrics/counts_all/20210216180504_status_page_incident_unpublishes.yml
new file mode 100644
index 00000000000..db3e1c12b7b
--- /dev/null
+++ b/config/metrics/counts_all/20210216180504_status_page_incident_unpublishes.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.status_page_incident_unpublishes
+description: Cumulative count of usages of unpublish operation
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180506_status_page_projects.yml b/config/metrics/counts_all/20210216180506_status_page_projects.yml
new file mode 100644
index 00000000000..5ff16f3dd47
--- /dev/null
+++ b/config/metrics/counts_all/20210216180506_status_page_projects.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.status_page_projects
+description: Projects with status page enabled
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180507_status_page_issues.yml b/config/metrics/counts_all/20210216180507_status_page_issues.yml
new file mode 100644
index 00000000000..5db63243d35
--- /dev/null
+++ b/config/metrics/counts_all/20210216180507_status_page_issues.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.status_page_issues
+description: Issues published to a Status Page
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180517_projects_with_error_tracking_enabled.yml b/config/metrics/counts_all/20210216180517_projects_with_error_tracking_enabled.yml
new file mode 100644
index 00000000000..c064e33f30a
--- /dev/null
+++ b/config/metrics/counts_all/20210216180517_projects_with_error_tracking_enabled.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.monitor.projects_with_error_tracking_enabled
+description: Projects where error tracking is enabled
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: error_tracking
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180518_projects_with_incidents.yml b/config/metrics/counts_all/20210216180518_projects_with_incidents.yml
new file mode 100644
index 00000000000..bbedec31c43
--- /dev/null
+++ b/config/metrics/counts_all/20210216180518_projects_with_incidents.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.monitor.projects_with_incidents
+description: Count of unique projects with an incident
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180520_projects_with_alert_incidents.yml b/config/metrics/counts_all/20210216180520_projects_with_alert_incidents.yml
new file mode 100644
index 00000000000..87e013bdcb5
--- /dev/null
+++ b/config/metrics/counts_all/20210216180520_projects_with_alert_incidents.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.monitor.projects_with_alert_incidents
+description: Count of unique projects with an incident from an alert
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180522_projects_incident_sla_enabled.yml b/config/metrics/counts_all/20210216180522_projects_incident_sla_enabled.yml
new file mode 100644
index 00000000000..84a828a467b
--- /dev/null
+++ b/config/metrics/counts_all/20210216180522_projects_incident_sla_enabled.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.monitor.projects_incident_sla_enabled
+description: Projects where Incident SLA is enabled
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: error_tracking
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180628_projects_imported_from_github.yml b/config/metrics/counts_all/20210216180628_projects_imported_from_github.yml
new file mode 100644
index 00000000000..47c20ec6cfb
--- /dev/null
+++ b/config/metrics/counts_all/20210216180628_projects_imported_from_github.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_imported_from_github
+description:
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180630_projects_imported_from_github.yml b/config/metrics/counts_all/20210216180630_projects_imported_from_github.yml
new file mode 100644
index 00000000000..893b92b1f12
--- /dev/null
+++ b/config/metrics/counts_all/20210216180630_projects_imported_from_github.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.create.projects_imported_from_github
+description:
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180632_unique_users_all_imports.yml b/config/metrics/counts_all/20210216180632_unique_users_all_imports.yml
new file mode 100644
index 00000000000..f8629496cb6
--- /dev/null
+++ b/config/metrics/counts_all/20210216180632_unique_users_all_imports.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.unique_users_all_imports
+description: Distinct count of users that triggered any kind of import
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180634_gitlab.yml b/config/metrics/counts_all/20210216180634_gitlab.yml
new file mode 100644
index 00000000000..b4a2e2454d0
--- /dev/null
+++ b/config/metrics/counts_all/20210216180634_gitlab.yml
@@ -0,0 +1,17 @@
+---
+key_path: usage_activity_by_stage.manage.bulk_imports.gitlab
+description: Distinct count of users that triggered an import using the Group Migration
+ tool
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180636_gitlab_v1.yml b/config/metrics/counts_all/20210216180636_gitlab_v1.yml
new file mode 100644
index 00000000000..1c4fa2c62fe
--- /dev/null
+++ b/config/metrics/counts_all/20210216180636_gitlab_v1.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.bulk_imports.gitlab_v1
+description: Count of imports using GitLab Migration
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180638_gitlab_project.yml b/config/metrics/counts_all/20210216180638_gitlab_project.yml
new file mode 100644
index 00000000000..a9d167f7363
--- /dev/null
+++ b/config/metrics/counts_all/20210216180638_gitlab_project.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.project_imports.gitlab_project
+description: Count of projects imported using Project Import/Export
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180639_gitlab.yml b/config/metrics/counts_all/20210216180639_gitlab.yml
new file mode 100644
index 00000000000..3fef2ce3b85
--- /dev/null
+++ b/config/metrics/counts_all/20210216180639_gitlab.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.project_imports.gitlab
+description: Count of projects imported from GitLab.com
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180641_github.yml b/config/metrics/counts_all/20210216180641_github.yml
new file mode 100644
index 00000000000..530e9b05e14
--- /dev/null
+++ b/config/metrics/counts_all/20210216180641_github.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.project_imports.github
+description: Count of projects imported from GitHub
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180643_bitbucket.yml b/config/metrics/counts_all/20210216180643_bitbucket.yml
new file mode 100644
index 00000000000..6490c8ffb55
--- /dev/null
+++ b/config/metrics/counts_all/20210216180643_bitbucket.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.project_imports.bitbucket
+description: Count of projects imported from Bitbucket
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180645_bitbucket_server.yml b/config/metrics/counts_all/20210216180645_bitbucket_server.yml
new file mode 100644
index 00000000000..bfbee0b3433
--- /dev/null
+++ b/config/metrics/counts_all/20210216180645_bitbucket_server.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.project_imports.bitbucket_server
+description: Count of projects imported from Bitbucket Server
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180647_gitea.yml b/config/metrics/counts_all/20210216180647_gitea.yml
new file mode 100644
index 00000000000..74b4fd36714
--- /dev/null
+++ b/config/metrics/counts_all/20210216180647_gitea.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.project_imports.gitea
+description: Count of projects imported from Gitea
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180649_git.yml b/config/metrics/counts_all/20210216180649_git.yml
new file mode 100644
index 00000000000..b7dd7ca8d7e
--- /dev/null
+++ b/config/metrics/counts_all/20210216180649_git.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.project_imports.git
+description: Count of projects imported by URL
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180650_manifest.yml b/config/metrics/counts_all/20210216180650_manifest.yml
new file mode 100644
index 00000000000..4ef7823ee67
--- /dev/null
+++ b/config/metrics/counts_all/20210216180650_manifest.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.project_imports.manifest
+description: Count of projects imported using manifst file
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180652_gitlab_migration.yml b/config/metrics/counts_all/20210216180652_gitlab_migration.yml
new file mode 100644
index 00000000000..3df4472c9a7
--- /dev/null
+++ b/config/metrics/counts_all/20210216180652_gitlab_migration.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.project_imports.gitlab_migration
+description: Count of projects imported using GitLab Migration
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180654_jira.yml b/config/metrics/counts_all/20210216180654_jira.yml
new file mode 100644
index 00000000000..6e72bc630bd
--- /dev/null
+++ b/config/metrics/counts_all/20210216180654_jira.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.issue_imports.jira
+description: Count of projects imported from Jira
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180656_fogbugz.yml b/config/metrics/counts_all/20210216180656_fogbugz.yml
new file mode 100644
index 00000000000..8a52d04b615
--- /dev/null
+++ b/config/metrics/counts_all/20210216180656_fogbugz.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.issue_imports.fogbugz
+description: Count of projects imported from fogbugz
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180658_phabricator.yml b/config/metrics/counts_all/20210216180658_phabricator.yml
new file mode 100644
index 00000000000..51559f87ae2
--- /dev/null
+++ b/config/metrics/counts_all/20210216180658_phabricator.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.issue_imports.phabricator
+description: Count of projects imported from phabricator
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180700_csv.yml b/config/metrics/counts_all/20210216180700_csv.yml
new file mode 100644
index 00000000000..bed309794eb
--- /dev/null
+++ b/config/metrics/counts_all/20210216180700_csv.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.issue_imports.csv
+description: Count of (attempted) imports from csv files
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180702_group_import.yml b/config/metrics/counts_all/20210216180702_group_import.yml
new file mode 100644
index 00000000000..109a722738e
--- /dev/null
+++ b/config/metrics/counts_all/20210216180702_group_import.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.group_imports.group_import
+description: Count of group imports using Group Import/Export
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180703_gitlab_migration.yml b/config/metrics/counts_all/20210216180703_gitlab_migration.yml
new file mode 100644
index 00000000000..74c7e66adfc
--- /dev/null
+++ b/config/metrics/counts_all/20210216180703_gitlab_migration.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.group_imports.gitlab_migration
+description: Count of groups imported using GitLab Migration
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180705_total.yml b/config/metrics/counts_all/20210216180705_total.yml
new file mode 100644
index 00000000000..9e6c83593d5
--- /dev/null
+++ b/config/metrics/counts_all/20210216180705_total.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.projects_imported.total
+description: Total count of all projects imported with import_source NOT NULL
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180707_gitlab_project.yml b/config/metrics/counts_all/20210216180707_gitlab_project.yml
new file mode 100644
index 00000000000..a241abcad2c
--- /dev/null
+++ b/config/metrics/counts_all/20210216180707_gitlab_project.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.projects_imported.gitlab_project
+description: 'Distinct count of users that imported projects using Project Import/Export'
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180709_gitlab.yml b/config/metrics/counts_all/20210216180709_gitlab.yml
new file mode 100644
index 00000000000..c7b224a18a5
--- /dev/null
+++ b/config/metrics/counts_all/20210216180709_gitlab.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.projects_imported.gitlab
+description: 'Distinct count of users that imported projects from GitLab.com'
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180711_github.yml b/config/metrics/counts_all/20210216180711_github.yml
new file mode 100644
index 00000000000..9e701f04fe3
--- /dev/null
+++ b/config/metrics/counts_all/20210216180711_github.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.projects_imported.github
+description: Distinct count of users that imported projects from GitHub
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180713_bitbucket.yml b/config/metrics/counts_all/20210216180713_bitbucket.yml
new file mode 100644
index 00000000000..28f9b45d250
--- /dev/null
+++ b/config/metrics/counts_all/20210216180713_bitbucket.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.projects_imported.bitbucket
+description: 'Distinct count of users that imported projects from Bitbucket Cloud'
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180715_bitbucket_server.yml b/config/metrics/counts_all/20210216180715_bitbucket_server.yml
new file mode 100644
index 00000000000..58b4fc235b2
--- /dev/null
+++ b/config/metrics/counts_all/20210216180715_bitbucket_server.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.projects_imported.bitbucket_server
+description: 'Distinct count of users that imported projects from Bitbucket Server'
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180716_gitea.yml b/config/metrics/counts_all/20210216180716_gitea.yml
new file mode 100644
index 00000000000..28c4b03f1e9
--- /dev/null
+++ b/config/metrics/counts_all/20210216180716_gitea.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.projects_imported.gitea
+description: 'Distinct count of users that imported projects from Gitea'
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180718_git.yml b/config/metrics/counts_all/20210216180718_git.yml
new file mode 100644
index 00000000000..085bb5f9764
--- /dev/null
+++ b/config/metrics/counts_all/20210216180718_git.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.projects_imported.git
+description: 'Distinct count of users that imported projects using Import by URL'
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180720_manifest.yml b/config/metrics/counts_all/20210216180720_manifest.yml
new file mode 100644
index 00000000000..8008afc98d7
--- /dev/null
+++ b/config/metrics/counts_all/20210216180720_manifest.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.projects_imported.manifest
+description: 'Distinct count of users that imported projects using Manifest file'
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180722_jira.yml b/config/metrics/counts_all/20210216180722_jira.yml
new file mode 100644
index 00000000000..ac462893331
--- /dev/null
+++ b/config/metrics/counts_all/20210216180722_jira.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.issues_imported.jira
+description: Distinct count of users that imported issues into projects using Jira
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180724_fogbugz.yml b/config/metrics/counts_all/20210216180724_fogbugz.yml
new file mode 100644
index 00000000000..18f4742bf81
--- /dev/null
+++ b/config/metrics/counts_all/20210216180724_fogbugz.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.issues_imported.fogbugz
+description: 'Distinct count of users that imported issues into projects using FogBugz'
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180726_phabricator.yml b/config/metrics/counts_all/20210216180726_phabricator.yml
new file mode 100644
index 00000000000..a735d6f5cdb
--- /dev/null
+++ b/config/metrics/counts_all/20210216180726_phabricator.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.issues_imported.phabricator
+description: Distinct count of users that imported issues into projects using Phabricator
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180727_csv.yml b/config/metrics/counts_all/20210216180727_csv.yml
new file mode 100644
index 00000000000..5a06c5e8238
--- /dev/null
+++ b/config/metrics/counts_all/20210216180727_csv.yml
@@ -0,0 +1,17 @@
+---
+key_path: usage_activity_by_stage.manage.issues_imported.csv
+description: Distinct count of users that imported issues into projects using CSV
+ upload
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180729_groups_imported.yml b/config/metrics/counts_all/20210216180729_groups_imported.yml
new file mode 100644
index 00000000000..2d0e40959b1
--- /dev/null
+++ b/config/metrics/counts_all/20210216180729_groups_imported.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.groups_imported
+description: Distinct count of users that imported groups using Group Import
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180734_wiki_pages_create.yml b/config/metrics/counts_all/20210216180734_wiki_pages_create.yml
new file mode 100644
index 00000000000..cd69803d569
--- /dev/null
+++ b/config/metrics/counts_all/20210216180734_wiki_pages_create.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.wiki_pages_create
+description:
+product_section: dev
+product_stage: create
+product_group: group::knowledge
+product_category: wiki
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180736_wiki_pages_update.yml b/config/metrics/counts_all/20210216180736_wiki_pages_update.yml
new file mode 100644
index 00000000000..ee44817090a
--- /dev/null
+++ b/config/metrics/counts_all/20210216180736_wiki_pages_update.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.wiki_pages_update
+description:
+product_section: dev
+product_stage: create
+product_group: group::knowledge
+product_category: wiki
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180738_wiki_pages_delete.yml b/config/metrics/counts_all/20210216180738_wiki_pages_delete.yml
new file mode 100644
index 00000000000..a7670d1578b
--- /dev/null
+++ b/config/metrics/counts_all/20210216180738_wiki_pages_delete.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.wiki_pages_delete
+description:
+product_section: dev
+product_stage: create
+product_group: group::knowledge
+product_category: wiki
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180740_design_management_designs_create.yml b/config/metrics/counts_all/20210216180740_design_management_designs_create.yml
new file mode 100644
index 00000000000..1968f26c08e
--- /dev/null
+++ b/config/metrics/counts_all/20210216180740_design_management_designs_create.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.design_management_designs_create
+description:
+product_section: dev
+product_stage: create
+product_group: group::knowledge
+product_category: design_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180741_design_management_designs_update.yml b/config/metrics/counts_all/20210216180741_design_management_designs_update.yml
new file mode 100644
index 00000000000..087afae23ad
--- /dev/null
+++ b/config/metrics/counts_all/20210216180741_design_management_designs_update.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.design_management_designs_update
+description:
+product_section: dev
+product_stage: create
+product_group: group::knowledge
+product_category: design_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180743_design_management_designs_delete.yml b/config/metrics/counts_all/20210216180743_design_management_designs_delete.yml
new file mode 100644
index 00000000000..874e5a60243
--- /dev/null
+++ b/config/metrics/counts_all/20210216180743_design_management_designs_delete.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.design_management_designs_delete
+description:
+product_section: dev
+product_stage: create
+product_group: group::knowledge
+product_category: design_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180750_groups.yml b/config/metrics/counts_all/20210216180750_groups.yml
new file mode 100644
index 00000000000..e236c4b89a8
--- /dev/null
+++ b/config/metrics/counts_all/20210216180750_groups.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups
+description: Total count of groups as of usage ping snapshot
+product_section: dev
+product_stage:
+product_group: group::manage
+product_category: subgroups
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180752_keys.yml b/config/metrics/counts_all/20210216180752_keys.yml
new file mode 100644
index 00000000000..4374ebcb9c1
--- /dev/null
+++ b/config/metrics/counts_all/20210216180752_keys.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.keys
+description:
+product_section: dev
+product_stage:
+product_group: group::manage
+product_category: authentication_and_authorization
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180754_events.yml b/config/metrics/counts_all/20210216180754_events.yml
new file mode 100644
index 00000000000..e580df4d511
--- /dev/null
+++ b/config/metrics/counts_all/20210216180754_events.yml
@@ -0,0 +1,17 @@
+---
+key_path: usage_activity_by_stage.manage.events
+description:
+product_section: dev
+product_stage:
+product_group: group::manage
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180756_groups.yml b/config/metrics/counts_all/20210216180756_groups.yml
new file mode 100644
index 00000000000..e789713fc31
--- /dev/null
+++ b/config/metrics/counts_all/20210216180756_groups.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.groups
+description:
+product_section: dev
+product_stage:
+product_group: group::manage
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180758_users_created.yml b/config/metrics/counts_all/20210216180758_users_created.yml
new file mode 100644
index 00000000000..1e722716546
--- /dev/null
+++ b/config/metrics/counts_all/20210216180758_users_created.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.users_created
+description:
+product_section: dev
+product_stage:
+product_group: group::manage
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180800_ldap_keys.yml b/config/metrics/counts_all/20210216180800_ldap_keys.yml
new file mode 100644
index 00000000000..b3c97800b9b
--- /dev/null
+++ b/config/metrics/counts_all/20210216180800_ldap_keys.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.ldap_keys
+description:
+product_section: dev
+product_stage:
+product_group: group::manage
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180801_ldap_users.yml b/config/metrics/counts_all/20210216180801_ldap_users.yml
new file mode 100644
index 00000000000..075189ba9b7
--- /dev/null
+++ b/config/metrics/counts_all/20210216180801_ldap_users.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.ldap_users
+description:
+product_section: dev
+product_stage:
+product_group: group::manage
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180843_provider.yml b/config/metrics/counts_all/20210216180843_provider.yml
new file mode 100644
index 00000000000..002fb0e7186
--- /dev/null
+++ b/config/metrics/counts_all/20210216180843_provider.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.artifacts.object_store.provider
+description: What Object Storage provider has been configured for Artifacts
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180852_provider.yml b/config/metrics/counts_all/20210216180852_provider.yml
new file mode 100644
index 00000000000..0b22e1ce412
--- /dev/null
+++ b/config/metrics/counts_all/20210216180852_provider.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.external_diffs.object_store.provider
+description: What Object Storage provider has been configured for External Diffs
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180902_provider.yml b/config/metrics/counts_all/20210216180902_provider.yml
new file mode 100644
index 00000000000..e5752e274b7
--- /dev/null
+++ b/config/metrics/counts_all/20210216180902_provider.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.lfs.object_store.provider
+description: What Object Storage provider has been configured for LFS
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180903_enabled.yml b/config/metrics/counts_all/20210216180903_enabled.yml
new file mode 100644
index 00000000000..cc97f1fbacc
--- /dev/null
+++ b/config/metrics/counts_all/20210216180903_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.uploads.enabled
+description: Whether Object Storage is enabled for Uploads
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180911_provider.yml b/config/metrics/counts_all/20210216180911_provider.yml
new file mode 100644
index 00000000000..53286df6724
--- /dev/null
+++ b/config/metrics/counts_all/20210216180911_provider.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.uploads.object_store.provider
+description: What Object Storage provider has been configured for Uploads
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180920_provider.yml b/config/metrics/counts_all/20210216180920_provider.yml
new file mode 100644
index 00000000000..133b65f6d51
--- /dev/null
+++ b/config/metrics/counts_all/20210216180920_provider.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.packages.object_store.provider
+description: What Object Storage provider has been configured for Packages
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180922_duration_s.yml b/config/metrics/counts_all/20210216180922_duration_s.yml
new file mode 100644
index 00000000000..2ddbd1f25e8
--- /dev/null
+++ b/config/metrics/counts_all/20210216180922_duration_s.yml
@@ -0,0 +1,19 @@
+---
+key_path: topology.duration_s
+description: Time it took to collect topology data
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: prometheus
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180924_failures.yml b/config/metrics/counts_all/20210216180924_failures.yml
new file mode 100644
index 00000000000..0706ffc7e7f
--- /dev/null
+++ b/config/metrics/counts_all/20210216180924_failures.yml
@@ -0,0 +1,19 @@
+---
+key_path: topology.failures
+description: Contains information about failed queries
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: prometheus
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180927_grafana_integrated_projects.yml b/config/metrics/counts_all/20210216180927_grafana_integrated_projects.yml
new file mode 100644
index 00000000000..09816e1b0f1
--- /dev/null
+++ b/config/metrics/counts_all/20210216180927_grafana_integrated_projects.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.grafana_integrated_projects
+description:
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180929_projects_with_tracing_enabled.yml b/config/metrics/counts_all/20210216180929_projects_with_tracing_enabled.yml
new file mode 100644
index 00000000000..6ce96c5750d
--- /dev/null
+++ b/config/metrics/counts_all/20210216180929_projects_with_tracing_enabled.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_with_tracing_enabled
+description: Projects with tracing enabled
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category: tracing
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180931_projects_prometheus_active.yml b/config/metrics/counts_all/20210216180931_projects_prometheus_active.yml
new file mode 100644
index 00000000000..f2a3e296e8b
--- /dev/null
+++ b/config/metrics/counts_all/20210216180931_projects_prometheus_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_prometheus_active
+description: Count of projects with active integrations for Prometheus
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category: metrics
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180933_groups_prometheus_active.yml b/config/metrics/counts_all/20210216180933_groups_prometheus_active.yml
new file mode 100644
index 00000000000..446e8904be8
--- /dev/null
+++ b/config/metrics/counts_all/20210216180933_groups_prometheus_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_prometheus_active
+description: Count of groups with active integrations for Prometheus
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category: metrics
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180934_templates_prometheus_active.yml b/config/metrics/counts_all/20210216180934_templates_prometheus_active.yml
new file mode 100644
index 00000000000..519fc355a44
--- /dev/null
+++ b/config/metrics/counts_all/20210216180934_templates_prometheus_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_prometheus_active
+description: Count of active service templates for Prometheus
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category: metrics
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180936_instances_prometheus_active.yml b/config/metrics/counts_all/20210216180936_instances_prometheus_active.yml
new file mode 100644
index 00000000000..7536c43b9f1
--- /dev/null
+++ b/config/metrics/counts_all/20210216180936_instances_prometheus_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_prometheus_active
+description: Count of active instance-level integrations for Prometheus
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category: metrics
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180938_projects_inheriting_prometheus_active.yml b/config/metrics/counts_all/20210216180938_projects_inheriting_prometheus_active.yml
new file mode 100644
index 00000000000..38e002e0a2a
--- /dev/null
+++ b/config/metrics/counts_all/20210216180938_projects_inheriting_prometheus_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_prometheus_active
+description: Count of active projects inheriting integrations for Prometheus
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category: metrics
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180940_groups_inheriting_prometheus_active.yml b/config/metrics/counts_all/20210216180940_groups_inheriting_prometheus_active.yml
new file mode 100644
index 00000000000..c430b253199
--- /dev/null
+++ b/config/metrics/counts_all/20210216180940_groups_inheriting_prometheus_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_prometheus_active
+description: Count of active groups inheriting integrations for Prometheus
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category: metrics
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180942_operations_dashboard_default_dashboard.yml b/config/metrics/counts_all/20210216180942_operations_dashboard_default_dashboard.yml
new file mode 100644
index 00000000000..0460ddd1ca4
--- /dev/null
+++ b/config/metrics/counts_all/20210216180942_operations_dashboard_default_dashboard.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.operations_dashboard_default_dashboard
+description: Active users with enabled operations dashboard
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180944_operations_dashboard_users_with_projects_added.yml b/config/metrics/counts_all/20210216180944_operations_dashboard_users_with_projects_added.yml
new file mode 100644
index 00000000000..3c1bb134c17
--- /dev/null
+++ b/config/metrics/counts_all/20210216180944_operations_dashboard_users_with_projects_added.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.operations_dashboard_users_with_projects_added
+description: Active users with projects on operations dashboard
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180945_clusters.yml b/config/metrics/counts_all/20210216180945_clusters.yml
new file mode 100644
index 00000000000..25a52cf9ffa
--- /dev/null
+++ b/config/metrics/counts_all/20210216180945_clusters.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.monitor.clusters
+description: Total GitLab Managed clusters both enabled and disabled
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category: metrics
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180947_clusters_applications_prometheus.yml b/config/metrics/counts_all/20210216180947_clusters_applications_prometheus.yml
new file mode 100644
index 00000000000..cc15b3563b5
--- /dev/null
+++ b/config/metrics/counts_all/20210216180947_clusters_applications_prometheus.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.monitor.clusters_applications_prometheus
+description: Total GitLab Managed clusters with Prometheus enabled
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category: metrics
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180949_operations_dashboard_default_dashboard.yml b/config/metrics/counts_all/20210216180949_operations_dashboard_default_dashboard.yml
new file mode 100644
index 00000000000..f037d7ea5c2
--- /dev/null
+++ b/config/metrics/counts_all/20210216180949_operations_dashboard_default_dashboard.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.monitor.operations_dashboard_default_dashboard
+description: Active users with enabled operations dashboard
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180951_projects_with_tracing_enabled.yml b/config/metrics/counts_all/20210216180951_projects_with_tracing_enabled.yml
new file mode 100644
index 00000000000..fc362feda69
--- /dev/null
+++ b/config/metrics/counts_all/20210216180951_projects_with_tracing_enabled.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.monitor.projects_with_tracing_enabled
+description: Projects with tracing enabled
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category: tracing
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180953_operations_dashboard_users_with_projects_added.yml b/config/metrics/counts_all/20210216180953_operations_dashboard_users_with_projects_added.yml
new file mode 100644
index 00000000000..6f6f4b00d1a
--- /dev/null
+++ b/config/metrics/counts_all/20210216180953_operations_dashboard_users_with_projects_added.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.monitor.operations_dashboard_users_with_projects_added
+description: Active users with projects on operations dashboard
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181009_lfs_objects.yml b/config/metrics/counts_all/20210216181009_lfs_objects.yml
new file mode 100644
index 00000000000..fe221ae2c47
--- /dev/null
+++ b/config/metrics/counts_all/20210216181009_lfs_objects.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.lfs_objects
+description:
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181011_projects_with_packages.yml b/config/metrics/counts_all/20210216181011_projects_with_packages.yml
new file mode 100644
index 00000000000..2dee15b9438
--- /dev/null
+++ b/config/metrics/counts_all/20210216181011_projects_with_packages.yml
@@ -0,0 +1,17 @@
+---
+key_path: counts.projects_with_packages
+description: Projects with package registry configured
+product_section: ops
+product_stage:
+product_group: group::package
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181012_packages.yml b/config/metrics/counts_all/20210216181012_packages.yml
new file mode 100644
index 00000000000..2843f223d9e
--- /dev/null
+++ b/config/metrics/counts_all/20210216181012_packages.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.packages
+description: Number of packages
+product_section: ops
+product_stage:
+product_group: group::package
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181014_projects_with_expiration_policy_disabled.yml b/config/metrics/counts_all/20210216181014_projects_with_expiration_policy_disabled.yml
new file mode 100644
index 00000000000..69b893251ac
--- /dev/null
+++ b/config/metrics/counts_all/20210216181014_projects_with_expiration_policy_disabled.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_with_expiration_policy_disabled
+description:
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181016_projects_with_expiration_policy_enabled.yml b/config/metrics/counts_all/20210216181016_projects_with_expiration_policy_enabled.yml
new file mode 100644
index 00000000000..9e06674dc61
--- /dev/null
+++ b/config/metrics/counts_all/20210216181016_projects_with_expiration_policy_enabled.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_with_expiration_policy_enabled
+description:
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181029_projects_with_expiration_policy_enabled_with_cadence_set_to_1d.yml b/config/metrics/counts_all/20210216181029_projects_with_expiration_policy_enabled_with_cadence_set_to_1d.yml
new file mode 100644
index 00000000000..907fa82882c
--- /dev/null
+++ b/config/metrics/counts_all/20210216181029_projects_with_expiration_policy_enabled_with_cadence_set_to_1d.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_with_expiration_policy_enabled_with_cadence_set_to_1d
+description:
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181031_projects_with_expiration_policy_enabled_with_cadence_set_to_7d.yml b/config/metrics/counts_all/20210216181031_projects_with_expiration_policy_enabled_with_cadence_set_to_7d.yml
new file mode 100644
index 00000000000..55ae6fc7a24
--- /dev/null
+++ b/config/metrics/counts_all/20210216181031_projects_with_expiration_policy_enabled_with_cadence_set_to_7d.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_with_expiration_policy_enabled_with_cadence_set_to_7d
+description:
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181033_projects_with_expiration_policy_enabled_with_cadence_set_to_14d.yml b/config/metrics/counts_all/20210216181033_projects_with_expiration_policy_enabled_with_cadence_set_to_14d.yml
new file mode 100644
index 00000000000..2e0bb6e06f5
--- /dev/null
+++ b/config/metrics/counts_all/20210216181033_projects_with_expiration_policy_enabled_with_cadence_set_to_14d.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_with_expiration_policy_enabled_with_cadence_set_to_14d
+description:
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181035_projects_with_expiration_policy_enabled_with_cadence_set_to_1month.yml b/config/metrics/counts_all/20210216181035_projects_with_expiration_policy_enabled_with_cadence_set_to_1month.yml
new file mode 100644
index 00000000000..5b6ec558b76
--- /dev/null
+++ b/config/metrics/counts_all/20210216181035_projects_with_expiration_policy_enabled_with_cadence_set_to_1month.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_with_expiration_policy_enabled_with_cadence_set_to_1month
+description:
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181037_projects_with_expiration_policy_enabled_with_cadence_set_to_3month.yml b/config/metrics/counts_all/20210216181037_projects_with_expiration_policy_enabled_with_cadence_set_to_3month.yml
new file mode 100644
index 00000000000..6028972324d
--- /dev/null
+++ b/config/metrics/counts_all/20210216181037_projects_with_expiration_policy_enabled_with_cadence_set_to_3month.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_with_expiration_policy_enabled_with_cadence_set_to_3month
+description:
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181038_projects_with_expiration_policy_enabled_with_older_than_set_to_7d.yml b/config/metrics/counts_all/20210216181038_projects_with_expiration_policy_enabled_with_older_than_set_to_7d.yml
new file mode 100644
index 00000000000..c1bd230ec5b
--- /dev/null
+++ b/config/metrics/counts_all/20210216181038_projects_with_expiration_policy_enabled_with_older_than_set_to_7d.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_with_expiration_policy_enabled_with_older_than_set_to_7d
+description:
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181040_projects_with_expiration_policy_enabled_with_older_than_set_to_14d.yml b/config/metrics/counts_all/20210216181040_projects_with_expiration_policy_enabled_with_older_than_set_to_14d.yml
new file mode 100644
index 00000000000..fc2e647a05e
--- /dev/null
+++ b/config/metrics/counts_all/20210216181040_projects_with_expiration_policy_enabled_with_older_than_set_to_14d.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_with_expiration_policy_enabled_with_older_than_set_to_14d
+description:
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181042_projects_with_expiration_policy_enabled_with_older_than_set_to_30d.yml b/config/metrics/counts_all/20210216181042_projects_with_expiration_policy_enabled_with_older_than_set_to_30d.yml
new file mode 100644
index 00000000000..e8816d6f4f2
--- /dev/null
+++ b/config/metrics/counts_all/20210216181042_projects_with_expiration_policy_enabled_with_older_than_set_to_30d.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_with_expiration_policy_enabled_with_older_than_set_to_30d
+description:
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181044_projects_with_expiration_policy_enabled_with_older_than_set_to_90d.yml b/config/metrics/counts_all/20210216181044_projects_with_expiration_policy_enabled_with_older_than_set_to_90d.yml
new file mode 100644
index 00000000000..367eae45062
--- /dev/null
+++ b/config/metrics/counts_all/20210216181044_projects_with_expiration_policy_enabled_with_older_than_set_to_90d.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_with_expiration_policy_enabled_with_older_than_set_to_90d
+description:
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181048_projects_with_expiration_policy_enabled_with_older_than_unset.yml b/config/metrics/counts_all/20210216181048_projects_with_expiration_policy_enabled_with_older_than_unset.yml
new file mode 100644
index 00000000000..f89b6ef698e
--- /dev/null
+++ b/config/metrics/counts_all/20210216181048_projects_with_expiration_policy_enabled_with_older_than_unset.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_with_expiration_policy_enabled_with_older_than_unset
+description:
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181051_vendor.yml b/config/metrics/counts_all/20210216181051_vendor.yml
new file mode 100644
index 00000000000..1233659fa5c
--- /dev/null
+++ b/config/metrics/counts_all/20210216181051_vendor.yml
@@ -0,0 +1,17 @@
+---
+key_path: container_registry_server.vendor
+description: Identifies if a user is using an external container registry and what
+ type
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181055_projects_with_packages.yml b/config/metrics/counts_all/20210216181055_projects_with_packages.yml
new file mode 100644
index 00000000000..55ea64a66a8
--- /dev/null
+++ b/config/metrics/counts_all/20210216181055_projects_with_packages.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.package.projects_with_packages
+description: Projects with package registry configured
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181102_issues.yml b/config/metrics/counts_all/20210216181102_issues.yml
new file mode 100644
index 00000000000..2898486642e
--- /dev/null
+++ b/config/metrics/counts_all/20210216181102_issues.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.issues
+description: Count of Issues created
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181104_label_lists.yml b/config/metrics/counts_all/20210216181104_label_lists.yml
new file mode 100644
index 00000000000..e064fe310b5
--- /dev/null
+++ b/config/metrics/counts_all/20210216181104_label_lists.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.label_lists
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181106_milestone_lists.yml b/config/metrics/counts_all/20210216181106_milestone_lists.yml
new file mode 100644
index 00000000000..138ad791d5a
--- /dev/null
+++ b/config/metrics/counts_all/20210216181106_milestone_lists.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.milestone_lists
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181108_milestones.yml b/config/metrics/counts_all/20210216181108_milestones.yml
new file mode 100644
index 00000000000..d0be9293cfc
--- /dev/null
+++ b/config/metrics/counts_all/20210216181108_milestones.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.milestones
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181109_uploads.yml b/config/metrics/counts_all/20210216181109_uploads.yml
new file mode 100644
index 00000000000..0035b499326
--- /dev/null
+++ b/config/metrics/counts_all/20210216181109_uploads.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.uploads
+description: Count of Uploads via Notes and Descriptions
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181111_labels.yml b/config/metrics/counts_all/20210216181111_labels.yml
new file mode 100644
index 00000000000..cce534d49e7
--- /dev/null
+++ b/config/metrics/counts_all/20210216181111_labels.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.labels
+description: Count of Labels
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181113_notes.yml b/config/metrics/counts_all/20210216181113_notes.yml
new file mode 100644
index 00000000000..b019e9b9023
--- /dev/null
+++ b/config/metrics/counts_all/20210216181113_notes.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.notes
+description: Count of Notes across all objects that use them
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181115_issues.yml b/config/metrics/counts_all/20210216181115_issues.yml
new file mode 100644
index 00000000000..2f751d47d2c
--- /dev/null
+++ b/config/metrics/counts_all/20210216181115_issues.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.plan.issues
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181117_notes.yml b/config/metrics/counts_all/20210216181117_notes.yml
new file mode 100644
index 00000000000..a948750b747
--- /dev/null
+++ b/config/metrics/counts_all/20210216181117_notes.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.plan.notes
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181119_projects.yml b/config/metrics/counts_all/20210216181119_projects.yml
new file mode 100644
index 00000000000..807d2851393
--- /dev/null
+++ b/config/metrics/counts_all/20210216181119_projects.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.plan.projects
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181121_todos.yml b/config/metrics/counts_all/20210216181121_todos.yml
new file mode 100644
index 00000000000..2869e59033e
--- /dev/null
+++ b/config/metrics/counts_all/20210216181121_todos.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.plan.todos
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181122_service_desk_enabled_projects.yml b/config/metrics/counts_all/20210216181122_service_desk_enabled_projects.yml
new file mode 100644
index 00000000000..867a772eb23
--- /dev/null
+++ b/config/metrics/counts_all/20210216181122_service_desk_enabled_projects.yml
@@ -0,0 +1,17 @@
+---
+key_path: usage_activity_by_stage.plan.service_desk_enabled_projects
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181124_service_desk_issues.yml b/config/metrics/counts_all/20210216181124_service_desk_issues.yml
new file mode 100644
index 00000000000..47e80110c66
--- /dev/null
+++ b/config/metrics/counts_all/20210216181124_service_desk_issues.yml
@@ -0,0 +1,17 @@
+---
+key_path: usage_activity_by_stage.plan.service_desk_issues
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181126_projects_jira_active.yml b/config/metrics/counts_all/20210216181126_projects_jira_active.yml
new file mode 100644
index 00000000000..f0a5f3f711a
--- /dev/null
+++ b/config/metrics/counts_all/20210216181126_projects_jira_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.plan.projects_jira_active
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181128_projects_jira_dvcs_cloud_active.yml b/config/metrics/counts_all/20210216181128_projects_jira_dvcs_cloud_active.yml
new file mode 100644
index 00000000000..cb5f0a0f5ba
--- /dev/null
+++ b/config/metrics/counts_all/20210216181128_projects_jira_dvcs_cloud_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.plan.projects_jira_dvcs_cloud_active
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181130_projects_jira_dvcs_server_active.yml b/config/metrics/counts_all/20210216181130_projects_jira_dvcs_server_active.yml
new file mode 100644
index 00000000000..aae3322de19
--- /dev/null
+++ b/config/metrics/counts_all/20210216181130_projects_jira_dvcs_server_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.plan.projects_jira_dvcs_server_active
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181134_epics.yml b/config/metrics/counts_all/20210216181134_epics.yml
new file mode 100644
index 00000000000..5d6825f0830
--- /dev/null
+++ b/config/metrics/counts_all/20210216181134_epics.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.plan.epics
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181135_label_lists.yml b/config/metrics/counts_all/20210216181135_label_lists.yml
new file mode 100644
index 00000000000..4cd9374cdbb
--- /dev/null
+++ b/config/metrics/counts_all/20210216181135_label_lists.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.plan.label_lists
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181137_milestone_lists.yml b/config/metrics/counts_all/20210216181137_milestone_lists.yml
new file mode 100644
index 00000000000..d0741ebd0b3
--- /dev/null
+++ b/config/metrics/counts_all/20210216181137_milestone_lists.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.plan.milestone_lists
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181205_confidential_epics.yml b/config/metrics/counts_all/20210216181205_confidential_epics.yml
new file mode 100644
index 00000000000..f2941af6bd2
--- /dev/null
+++ b/config/metrics/counts_all/20210216181205_confidential_epics.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.confidential_epics
+description:
+product_section: dev
+product_stage: plan
+product_group: group::portfolio management
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181206_epics.yml b/config/metrics/counts_all/20210216181206_epics.yml
new file mode 100644
index 00000000000..97452db6f85
--- /dev/null
+++ b/config/metrics/counts_all/20210216181206_epics.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.epics
+description:
+product_section: dev
+product_stage: plan
+product_group: group::portfolio management
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181210_issues_with_health_status.yml b/config/metrics/counts_all/20210216181210_issues_with_health_status.yml
new file mode 100644
index 00000000000..1df3a5d1a38
--- /dev/null
+++ b/config/metrics/counts_all/20210216181210_issues_with_health_status.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.issues_with_health_status
+description:
+product_section: dev
+product_stage: plan
+product_group: group::portfolio management
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181249_feature_flags.yml b/config/metrics/counts_all/20210216181249_feature_flags.yml
new file mode 100644
index 00000000000..9ff71ff0e3b
--- /dev/null
+++ b/config/metrics/counts_all/20210216181249_feature_flags.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.feature_flags
+description: Number of feature flag toggles
+product_section: ops
+product_stage: release
+product_group: group::progressive delivery
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181252_boards.yml b/config/metrics/counts_all/20210216181252_boards.yml
new file mode 100644
index 00000000000..9316320129f
--- /dev/null
+++ b/config/metrics/counts_all/20210216181252_boards.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.boards
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181254_projects.yml b/config/metrics/counts_all/20210216181254_projects.yml
new file mode 100644
index 00000000000..b2cd3039fcb
--- /dev/null
+++ b/config/metrics/counts_all/20210216181254_projects.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects
+description: Count of Projects
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: projects
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181256_todos.yml b/config/metrics/counts_all/20210216181256_todos.yml
new file mode 100644
index 00000000000..7ffddb73f38
--- /dev/null
+++ b/config/metrics/counts_all/20210216181256_todos.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.todos
+description: Count of ToDos
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181258_jira_imports_total_imported_count.yml b/config/metrics/counts_all/20210216181258_jira_imports_total_imported_count.yml
new file mode 100644
index 00000000000..b51a38a4f3c
--- /dev/null
+++ b/config/metrics/counts_all/20210216181258_jira_imports_total_imported_count.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.jira_imports_total_imported_count
+description: Count of Issues imported from Jira
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: jira_importer
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181259_jira_imports_projects_count.yml b/config/metrics/counts_all/20210216181259_jira_imports_projects_count.yml
new file mode 100644
index 00000000000..c1f8e312021
--- /dev/null
+++ b/config/metrics/counts_all/20210216181259_jira_imports_projects_count.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.jira_imports_projects_count
+description: Count of Projects that imported Issues from Jira
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: jira_importer
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181301_jira_imports_total_imported_issues_count.yml b/config/metrics/counts_all/20210216181301_jira_imports_total_imported_issues_count.yml
new file mode 100644
index 00000000000..9ab377e5e04
--- /dev/null
+++ b/config/metrics/counts_all/20210216181301_jira_imports_total_imported_issues_count.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.jira_imports_total_imported_issues_count
+description: Count of Jira imports run
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: jira_importer
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181908_deploy_keys.yml b/config/metrics/counts_all/20210216181908_deploy_keys.yml
new file mode 100644
index 00000000000..ce4034aca60
--- /dev/null
+++ b/config/metrics/counts_all/20210216181908_deploy_keys.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.deploy_keys
+description:
+product_section: ops
+product_stage:
+product_group: group::release
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181911_successful_deployments.yml b/config/metrics/counts_all/20210216181911_successful_deployments.yml
new file mode 100644
index 00000000000..2eedd96e4b6
--- /dev/null
+++ b/config/metrics/counts_all/20210216181911_successful_deployments.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.successful_deployments
+description: Total successful deployments
+product_section: ops
+product_stage:
+product_group: group::release
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181912_failed_deployments.yml b/config/metrics/counts_all/20210216181912_failed_deployments.yml
new file mode 100644
index 00000000000..3ef38fff2d3
--- /dev/null
+++ b/config/metrics/counts_all/20210216181912_failed_deployments.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.failed_deployments
+description: Total failed deployments
+product_section: ops
+product_stage:
+product_group: group::release
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181914_environments.yml b/config/metrics/counts_all/20210216181914_environments.yml
new file mode 100644
index 00000000000..cae8fb0d85b
--- /dev/null
+++ b/config/metrics/counts_all/20210216181914_environments.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.environments
+description: Total available and stopped environments
+product_section: ops
+product_stage:
+product_group: group::release
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181916_in_review_folder.yml b/config/metrics/counts_all/20210216181916_in_review_folder.yml
new file mode 100644
index 00000000000..8890c0af74e
--- /dev/null
+++ b/config/metrics/counts_all/20210216181916_in_review_folder.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.in_review_folder
+description:
+product_section: ops
+product_stage:
+product_group: group::release
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181918_releases.yml b/config/metrics/counts_all/20210216181918_releases.yml
new file mode 100644
index 00000000000..190a2ae92bc
--- /dev/null
+++ b/config/metrics/counts_all/20210216181918_releases.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.releases
+description: Unique release tags
+product_section: ops
+product_stage:
+product_group: group::release
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181920_projects_mirrored_with_pipelines_enabled.yml b/config/metrics/counts_all/20210216181920_projects_mirrored_with_pipelines_enabled.yml
new file mode 100644
index 00000000000..c0748285bf9
--- /dev/null
+++ b/config/metrics/counts_all/20210216181920_projects_mirrored_with_pipelines_enabled.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_mirrored_with_pipelines_enabled
+description: Projects with repository mirroring enabled
+product_section: ops
+product_stage:
+product_group: group::release
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181926_deployments.yml b/config/metrics/counts_all/20210216181926_deployments.yml
new file mode 100644
index 00000000000..626b9b0b29b
--- /dev/null
+++ b/config/metrics/counts_all/20210216181926_deployments.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.release.deployments
+description: Unique users triggering deployments
+product_section: ops
+product_stage:
+product_group: group::release
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181928_failed_deployments.yml b/config/metrics/counts_all/20210216181928_failed_deployments.yml
new file mode 100644
index 00000000000..eec1fafa71c
--- /dev/null
+++ b/config/metrics/counts_all/20210216181928_failed_deployments.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.release.failed_deployments
+description: Total failed deployments
+product_section: ops
+product_stage:
+product_group: group::release
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181930_releases.yml b/config/metrics/counts_all/20210216181930_releases.yml
new file mode 100644
index 00000000000..9beda5cb6db
--- /dev/null
+++ b/config/metrics/counts_all/20210216181930_releases.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.release.releases
+description: Unique users creating release tags
+product_section: ops
+product_stage:
+product_group: group::release
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181932_successful_deployments.yml b/config/metrics/counts_all/20210216181932_successful_deployments.yml
new file mode 100644
index 00000000000..48103574cfd
--- /dev/null
+++ b/config/metrics/counts_all/20210216181932_successful_deployments.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.release.successful_deployments
+description: Total successful deployments
+product_section: ops
+product_stage:
+product_group: group::release
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181934_projects_mirrored_with_pipelines_enabled.yml b/config/metrics/counts_all/20210216181934_projects_mirrored_with_pipelines_enabled.yml
new file mode 100644
index 00000000000..ce760884642
--- /dev/null
+++ b/config/metrics/counts_all/20210216181934_projects_mirrored_with_pipelines_enabled.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.release.projects_mirrored_with_pipelines_enabled
+description: Projects with repository mirroring enabled
+product_section: ops
+product_stage:
+product_group: group::release
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181946_pages_domains.yml b/config/metrics/counts_all/20210216181946_pages_domains.yml
new file mode 100644
index 00000000000..7640b27eb46
--- /dev/null
+++ b/config/metrics/counts_all/20210216181946_pages_domains.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.pages_domains
+description: Total GitLab Pages domains
+product_section: ops
+product_stage: release
+product_group: group::release management
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181949_clusters_applications_runner.yml b/config/metrics/counts_all/20210216181949_clusters_applications_runner.yml
new file mode 100644
index 00000000000..3b36b410b3a
--- /dev/null
+++ b/config/metrics/counts_all/20210216181949_clusters_applications_runner.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.verify.clusters_applications_runner
+description: Total GitLab Managed clusters with Runner enabled
+product_section: ops
+product_stage: verify
+product_group: group::runner
+product_category: runner
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181954_user_unique_users_all_secure_scanners.yml b/config/metrics/counts_all/20210216181954_user_unique_users_all_secure_scanners.yml
new file mode 100644
index 00000000000..4d520d3430f
--- /dev/null
+++ b/config/metrics/counts_all/20210216181954_user_unique_users_all_secure_scanners.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.secure.user_unique_users_all_secure_scanners
+description:
+product_section: sec
+product_stage:
+product_group: group::secure
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181959_projects_with_repositories_enabled.yml b/config/metrics/counts_all/20210216181959_projects_with_repositories_enabled.yml
new file mode 100644
index 00000000000..926ed501639
--- /dev/null
+++ b/config/metrics/counts_all/20210216181959_projects_with_repositories_enabled.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_with_repositories_enabled
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182001_protected_branches.yml b/config/metrics/counts_all/20210216182001_protected_branches.yml
new file mode 100644
index 00000000000..cbd378bd93a
--- /dev/null
+++ b/config/metrics/counts_all/20210216182001_protected_branches.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.protected_branches
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182002_remote_mirrors.yml b/config/metrics/counts_all/20210216182002_remote_mirrors.yml
new file mode 100644
index 00000000000..f344a7c1640
--- /dev/null
+++ b/config/metrics/counts_all/20210216182002_remote_mirrors.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.remote_mirrors
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182004_commit_comment.yml b/config/metrics/counts_all/20210216182004_commit_comment.yml
new file mode 100644
index 00000000000..2e427d14acd
--- /dev/null
+++ b/config/metrics/counts_all/20210216182004_commit_comment.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.commit_comment
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182006_source_code_pushes.yml b/config/metrics/counts_all/20210216182006_source_code_pushes.yml
new file mode 100644
index 00000000000..824761adaee
--- /dev/null
+++ b/config/metrics/counts_all/20210216182006_source_code_pushes.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.source_code_pushes
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182008_template_repositories.yml b/config/metrics/counts_all/20210216182008_template_repositories.yml
new file mode 100644
index 00000000000..888f5d96ab6
--- /dev/null
+++ b/config/metrics/counts_all/20210216182008_template_repositories.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.template_repositories
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182010_deploy_keys.yml b/config/metrics/counts_all/20210216182010_deploy_keys.yml
new file mode 100644
index 00000000000..2ddc48c2e0a
--- /dev/null
+++ b/config/metrics/counts_all/20210216182010_deploy_keys.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.create.deploy_keys
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182012_keys.yml b/config/metrics/counts_all/20210216182012_keys.yml
new file mode 100644
index 00000000000..1872abc6776
--- /dev/null
+++ b/config/metrics/counts_all/20210216182012_keys.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.create.keys
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182014_projects_with_disable_overriding_approvers_per_merge_request.yml b/config/metrics/counts_all/20210216182014_projects_with_disable_overriding_approvers_per_merge_request.yml
new file mode 100644
index 00000000000..62883077ad5
--- /dev/null
+++ b/config/metrics/counts_all/20210216182014_projects_with_disable_overriding_approvers_per_merge_request.yml
@@ -0,0 +1,17 @@
+---
+key_path: usage_activity_by_stage.create.projects_with_disable_overriding_approvers_per_merge_request
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182015_projects_without_disable_overriding_approvers_per_merge_request.yml b/config/metrics/counts_all/20210216182015_projects_without_disable_overriding_approvers_per_merge_request.yml
new file mode 100644
index 00000000000..8518e3700bb
--- /dev/null
+++ b/config/metrics/counts_all/20210216182015_projects_without_disable_overriding_approvers_per_merge_request.yml
@@ -0,0 +1,17 @@
+---
+key_path: usage_activity_by_stage.create.projects_without_disable_overriding_approvers_per_merge_request
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182017_remote_mirrors.yml b/config/metrics/counts_all/20210216182017_remote_mirrors.yml
new file mode 100644
index 00000000000..f9edec7260b
--- /dev/null
+++ b/config/metrics/counts_all/20210216182017_remote_mirrors.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.create.remote_mirrors
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182019_projects_enforcing_code_owner_approval.yml b/config/metrics/counts_all/20210216182019_projects_enforcing_code_owner_approval.yml
new file mode 100644
index 00000000000..3ccbc99a4f1
--- /dev/null
+++ b/config/metrics/counts_all/20210216182019_projects_enforcing_code_owner_approval.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.create.projects_enforcing_code_owner_approval
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182021_projects_with_sectional_code_owner_rules.yml b/config/metrics/counts_all/20210216182021_projects_with_sectional_code_owner_rules.yml
new file mode 100644
index 00000000000..fcba0993477
--- /dev/null
+++ b/config/metrics/counts_all/20210216182021_projects_with_sectional_code_owner_rules.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.create.projects_with_sectional_code_owner_rules
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182023_projects_with_repositories_enabled.yml b/config/metrics/counts_all/20210216182023_projects_with_repositories_enabled.yml
new file mode 100644
index 00000000000..a850295aea6
--- /dev/null
+++ b/config/metrics/counts_all/20210216182023_projects_with_repositories_enabled.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.create.projects_with_repositories_enabled
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182025_protected_branches.yml b/config/metrics/counts_all/20210216182025_protected_branches.yml
new file mode 100644
index 00000000000..f914c5dae6c
--- /dev/null
+++ b/config/metrics/counts_all/20210216182025_protected_branches.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.create.protected_branches
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182027_total_number_of_path_locks.yml b/config/metrics/counts_all/20210216182027_total_number_of_path_locks.yml
new file mode 100644
index 00000000000..9ce0b935888
--- /dev/null
+++ b/config/metrics/counts_all/20210216182027_total_number_of_path_locks.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.create.total_number_of_path_locks
+description: The total number of default branch locks done through the GitLab UI
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182028_total_number_of_locked_files.yml b/config/metrics/counts_all/20210216182028_total_number_of_locked_files.yml
new file mode 100644
index 00000000000..136472a59e4
--- /dev/null
+++ b/config/metrics/counts_all/20210216182028_total_number_of_locked_files.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.create.total_number_of_locked_files
+description: The total number of exclusive file locks (through the CLI)
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182112_sast_jobs.yml b/config/metrics/counts_all/20210216182112_sast_jobs.yml
new file mode 100644
index 00000000000..aaf41b37c2b
--- /dev/null
+++ b/config/metrics/counts_all/20210216182112_sast_jobs.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.sast_jobs
+description: Count of SAST CI jobs for the month. Job names ending in '-sast'
+product_section: sec
+product_stage: secure
+product_group: group::static analysis
+product_category: static_application_security_testing
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182114_secret_detection_jobs.yml b/config/metrics/counts_all/20210216182114_secret_detection_jobs.yml
new file mode 100644
index 00000000000..9f56f021bf3
--- /dev/null
+++ b/config/metrics/counts_all/20210216182114_secret_detection_jobs.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.secret_detection_jobs
+description: Count of 'secret-detection' CI jobs fro the month.
+product_section: sec
+product_stage: secure
+product_group: group::static analysis
+product_category: secret_detection
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182116_user_sast_jobs.yml b/config/metrics/counts_all/20210216182116_user_sast_jobs.yml
new file mode 100644
index 00000000000..829d35a6e10
--- /dev/null
+++ b/config/metrics/counts_all/20210216182116_user_sast_jobs.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.secure.user_sast_jobs
+description: Count of SAST jobs
+product_section: sec
+product_stage: secure
+product_group: group::static analysis
+product_category: static_application_security_testing
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182118_user_secret_detection_jobs.yml b/config/metrics/counts_all/20210216182118_user_secret_detection_jobs.yml
new file mode 100644
index 00000000000..2559a67f4ad
--- /dev/null
+++ b/config/metrics/counts_all/20210216182118_user_secret_detection_jobs.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.secure.user_secret_detection_jobs
+description: Count of Secret Detection Jobs
+product_section: sec
+product_stage: secure
+product_group: group::static analysis
+product_category: secret_detection
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182203_user_preferences_group_overview_details.yml b/config/metrics/counts_all/20210216182203_user_preferences_group_overview_details.yml
new file mode 100644
index 00000000000..5f06bcf1607
--- /dev/null
+++ b/config/metrics/counts_all/20210216182203_user_preferences_group_overview_details.yml
@@ -0,0 +1,18 @@
+---
+key_path: counts.user_preferences_group_overview_details
+description: Count of users who set personal preference to see Details on Group overview
+ page
+product_section: sec
+product_stage: secure
+product_group: group::threat insights
+product_category: vulnerability_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182205_user_preferences_group_overview_security_dashboard.yml b/config/metrics/counts_all/20210216182205_user_preferences_group_overview_security_dashboard.yml
new file mode 100644
index 00000000000..688720eebb9
--- /dev/null
+++ b/config/metrics/counts_all/20210216182205_user_preferences_group_overview_security_dashboard.yml
@@ -0,0 +1,18 @@
+---
+key_path: counts.user_preferences_group_overview_security_dashboard
+description: Count of users who set personal preference to see Security Dashboard
+ on Group overview page
+product_section: sec
+product_stage: secure
+product_group: group::threat insights
+product_category: vulnerability_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182207_user_preferences_group_overview_security_dashboard.yml b/config/metrics/counts_all/20210216182207_user_preferences_group_overview_security_dashboard.yml
new file mode 100644
index 00000000000..7337c457249
--- /dev/null
+++ b/config/metrics/counts_all/20210216182207_user_preferences_group_overview_security_dashboard.yml
@@ -0,0 +1,17 @@
+---
+key_path: usage_activity_by_stage.secure.user_preferences_group_overview_security_dashboard
+description: Users who set personal preference to see Details on Group overview page
+product_section: sec
+product_stage: secure
+product_group: group::threat insights
+product_category: vulnerability_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182454_protected_branches_except_default.yml b/config/metrics/counts_all/20210216182454_protected_branches_except_default.yml
new file mode 100644
index 00000000000..66f616f16ee
--- /dev/null
+++ b/config/metrics/counts_all/20210216182454_protected_branches_except_default.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.protected_branches_except_default
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182547_projects_datadog_active.yml b/config/metrics/counts_all/20210216182547_projects_datadog_active.yml
new file mode 100644
index 00000000000..a96a88e9dab
--- /dev/null
+++ b/config/metrics/counts_all/20210216182547_projects_datadog_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_datadog_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182549_groups_datadog_active.yml b/config/metrics/counts_all/20210216182549_groups_datadog_active.yml
new file mode 100644
index 00000000000..caf9633e57f
--- /dev/null
+++ b/config/metrics/counts_all/20210216182549_groups_datadog_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.groups_datadog_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182551_templates_datadog_active.yml b/config/metrics/counts_all/20210216182551_templates_datadog_active.yml
new file mode 100644
index 00000000000..9d911c6becf
--- /dev/null
+++ b/config/metrics/counts_all/20210216182551_templates_datadog_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.templates_datadog_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182553_instances_datadog_active.yml b/config/metrics/counts_all/20210216182553_instances_datadog_active.yml
new file mode 100644
index 00000000000..25f6a6468d7
--- /dev/null
+++ b/config/metrics/counts_all/20210216182553_instances_datadog_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.instances_datadog_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182555_projects_inheriting_datadog_active.yml b/config/metrics/counts_all/20210216182555_projects_inheriting_datadog_active.yml
new file mode 100644
index 00000000000..97bfc3d2301
--- /dev/null
+++ b/config/metrics/counts_all/20210216182555_projects_inheriting_datadog_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_inheriting_datadog_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182557_groups_inheriting_datadog_active.yml b/config/metrics/counts_all/20210216182557_groups_inheriting_datadog_active.yml
new file mode 100644
index 00000000000..6cbbcadbe04
--- /dev/null
+++ b/config/metrics/counts_all/20210216182557_groups_inheriting_datadog_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.groups_inheriting_datadog_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182614_projects_ewm_active.yml b/config/metrics/counts_all/20210216182614_projects_ewm_active.yml
new file mode 100644
index 00000000000..a0c8d827951
--- /dev/null
+++ b/config/metrics/counts_all/20210216182614_projects_ewm_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_ewm_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182616_groups_ewm_active.yml b/config/metrics/counts_all/20210216182616_groups_ewm_active.yml
new file mode 100644
index 00000000000..d41905af3b6
--- /dev/null
+++ b/config/metrics/counts_all/20210216182616_groups_ewm_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.groups_ewm_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182618_templates_ewm_active.yml b/config/metrics/counts_all/20210216182618_templates_ewm_active.yml
new file mode 100644
index 00000000000..0ef26b5b144
--- /dev/null
+++ b/config/metrics/counts_all/20210216182618_templates_ewm_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.templates_ewm_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182620_instances_ewm_active.yml b/config/metrics/counts_all/20210216182620_instances_ewm_active.yml
new file mode 100644
index 00000000000..29d73ebb943
--- /dev/null
+++ b/config/metrics/counts_all/20210216182620_instances_ewm_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.instances_ewm_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182622_projects_inheriting_ewm_active.yml b/config/metrics/counts_all/20210216182622_projects_inheriting_ewm_active.yml
new file mode 100644
index 00000000000..8b6da149dfa
--- /dev/null
+++ b/config/metrics/counts_all/20210216182622_projects_inheriting_ewm_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_inheriting_ewm_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182623_groups_inheriting_ewm_active.yml b/config/metrics/counts_all/20210216182623_groups_inheriting_ewm_active.yml
new file mode 100644
index 00000000000..995849e5945
--- /dev/null
+++ b/config/metrics/counts_all/20210216182623_groups_inheriting_ewm_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.groups_inheriting_ewm_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182722_projects_mock_ci_active.yml b/config/metrics/counts_all/20210216182722_projects_mock_ci_active.yml
new file mode 100644
index 00000000000..1e7377ed707
--- /dev/null
+++ b/config/metrics/counts_all/20210216182722_projects_mock_ci_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_mock_ci_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182724_groups_mock_ci_active.yml b/config/metrics/counts_all/20210216182724_groups_mock_ci_active.yml
new file mode 100644
index 00000000000..adf7175c7c6
--- /dev/null
+++ b/config/metrics/counts_all/20210216182724_groups_mock_ci_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.groups_mock_ci_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182726_templates_mock_ci_active.yml b/config/metrics/counts_all/20210216182726_templates_mock_ci_active.yml
new file mode 100644
index 00000000000..654ffad1ba6
--- /dev/null
+++ b/config/metrics/counts_all/20210216182726_templates_mock_ci_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.templates_mock_ci_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182728_instances_mock_ci_active.yml b/config/metrics/counts_all/20210216182728_instances_mock_ci_active.yml
new file mode 100644
index 00000000000..41958f501b7
--- /dev/null
+++ b/config/metrics/counts_all/20210216182728_instances_mock_ci_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.instances_mock_ci_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182730_projects_inheriting_mock_ci_active.yml b/config/metrics/counts_all/20210216182730_projects_inheriting_mock_ci_active.yml
new file mode 100644
index 00000000000..63bafcd95d7
--- /dev/null
+++ b/config/metrics/counts_all/20210216182730_projects_inheriting_mock_ci_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_inheriting_mock_ci_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182732_groups_inheriting_mock_ci_active.yml b/config/metrics/counts_all/20210216182732_groups_inheriting_mock_ci_active.yml
new file mode 100644
index 00000000000..994e9665ff1
--- /dev/null
+++ b/config/metrics/counts_all/20210216182732_groups_inheriting_mock_ci_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.groups_inheriting_mock_ci_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182734_projects_mock_monitoring_active.yml b/config/metrics/counts_all/20210216182734_projects_mock_monitoring_active.yml
new file mode 100644
index 00000000000..c12bcfc76ae
--- /dev/null
+++ b/config/metrics/counts_all/20210216182734_projects_mock_monitoring_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_mock_monitoring_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182736_groups_mock_monitoring_active.yml b/config/metrics/counts_all/20210216182736_groups_mock_monitoring_active.yml
new file mode 100644
index 00000000000..414d3723f9b
--- /dev/null
+++ b/config/metrics/counts_all/20210216182736_groups_mock_monitoring_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.groups_mock_monitoring_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182738_templates_mock_monitoring_active.yml b/config/metrics/counts_all/20210216182738_templates_mock_monitoring_active.yml
new file mode 100644
index 00000000000..48397435310
--- /dev/null
+++ b/config/metrics/counts_all/20210216182738_templates_mock_monitoring_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.templates_mock_monitoring_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182739_instances_mock_monitoring_active.yml b/config/metrics/counts_all/20210216182739_instances_mock_monitoring_active.yml
new file mode 100644
index 00000000000..671c0574892
--- /dev/null
+++ b/config/metrics/counts_all/20210216182739_instances_mock_monitoring_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.instances_mock_monitoring_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182741_projects_inheriting_mock_monitoring_active.yml b/config/metrics/counts_all/20210216182741_projects_inheriting_mock_monitoring_active.yml
new file mode 100644
index 00000000000..895e0f03505
--- /dev/null
+++ b/config/metrics/counts_all/20210216182741_projects_inheriting_mock_monitoring_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_inheriting_mock_monitoring_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182743_groups_inheriting_mock_monitoring_active.yml b/config/metrics/counts_all/20210216182743_groups_inheriting_mock_monitoring_active.yml
new file mode 100644
index 00000000000..27206fb724f
--- /dev/null
+++ b/config/metrics/counts_all/20210216182743_groups_inheriting_mock_monitoring_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.groups_inheriting_mock_monitoring_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182855_package_events_i_package_composer_delete_package.yml b/config/metrics/counts_all/20210216182855_package_events_i_package_composer_delete_package.yml
new file mode 100644
index 00000000000..fb26328eb81
--- /dev/null
+++ b/config/metrics/counts_all/20210216182855_package_events_i_package_composer_delete_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_composer_delete_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182857_package_events_i_package_composer_pull_package.yml b/config/metrics/counts_all/20210216182857_package_events_i_package_composer_pull_package.yml
new file mode 100644
index 00000000000..010067763b5
--- /dev/null
+++ b/config/metrics/counts_all/20210216182857_package_events_i_package_composer_pull_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_composer_pull_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182859_package_events_i_package_composer_push_package.yml b/config/metrics/counts_all/20210216182859_package_events_i_package_composer_push_package.yml
new file mode 100644
index 00000000000..11ccbf3b27e
--- /dev/null
+++ b/config/metrics/counts_all/20210216182859_package_events_i_package_composer_push_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_composer_push_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182901_package_events_i_package_conan_delete_package.yml b/config/metrics/counts_all/20210216182901_package_events_i_package_conan_delete_package.yml
new file mode 100644
index 00000000000..9091fc299ee
--- /dev/null
+++ b/config/metrics/counts_all/20210216182901_package_events_i_package_conan_delete_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_conan_delete_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182903_package_events_i_package_conan_pull_package.yml b/config/metrics/counts_all/20210216182903_package_events_i_package_conan_pull_package.yml
new file mode 100644
index 00000000000..91cea7e5f4f
--- /dev/null
+++ b/config/metrics/counts_all/20210216182903_package_events_i_package_conan_pull_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_conan_pull_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182905_package_events_i_package_conan_push_package.yml b/config/metrics/counts_all/20210216182905_package_events_i_package_conan_push_package.yml
new file mode 100644
index 00000000000..4b4e08c0631
--- /dev/null
+++ b/config/metrics/counts_all/20210216182905_package_events_i_package_conan_push_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_conan_push_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182907_package_events_i_package_container_delete_package.yml b/config/metrics/counts_all/20210216182907_package_events_i_package_container_delete_package.yml
new file mode 100644
index 00000000000..b87bc78265c
--- /dev/null
+++ b/config/metrics/counts_all/20210216182907_package_events_i_package_container_delete_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_container_delete_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182909_package_events_i_package_container_pull_package.yml b/config/metrics/counts_all/20210216182909_package_events_i_package_container_pull_package.yml
new file mode 100644
index 00000000000..4ca264fc57f
--- /dev/null
+++ b/config/metrics/counts_all/20210216182909_package_events_i_package_container_pull_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_container_pull_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182911_package_events_i_package_container_push_package.yml b/config/metrics/counts_all/20210216182911_package_events_i_package_container_push_package.yml
new file mode 100644
index 00000000000..ea30df537f2
--- /dev/null
+++ b/config/metrics/counts_all/20210216182911_package_events_i_package_container_push_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_container_push_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182913_package_events_i_package_debian_delete_package.yml b/config/metrics/counts_all/20210216182913_package_events_i_package_debian_delete_package.yml
new file mode 100644
index 00000000000..e05cbbdc3a9
--- /dev/null
+++ b/config/metrics/counts_all/20210216182913_package_events_i_package_debian_delete_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_debian_delete_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182915_package_events_i_package_debian_pull_package.yml b/config/metrics/counts_all/20210216182915_package_events_i_package_debian_pull_package.yml
new file mode 100644
index 00000000000..6e0635e7108
--- /dev/null
+++ b/config/metrics/counts_all/20210216182915_package_events_i_package_debian_pull_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_debian_pull_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182917_package_events_i_package_debian_push_package.yml b/config/metrics/counts_all/20210216182917_package_events_i_package_debian_push_package.yml
new file mode 100644
index 00000000000..818d32cf911
--- /dev/null
+++ b/config/metrics/counts_all/20210216182917_package_events_i_package_debian_push_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_debian_push_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182919_package_events_i_package_delete_package.yml b/config/metrics/counts_all/20210216182919_package_events_i_package_delete_package.yml
new file mode 100644
index 00000000000..3bec73ead90
--- /dev/null
+++ b/config/metrics/counts_all/20210216182919_package_events_i_package_delete_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_delete_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182921_package_events_i_package_delete_package_by_deploy_token.yml b/config/metrics/counts_all/20210216182921_package_events_i_package_delete_package_by_deploy_token.yml
new file mode 100644
index 00000000000..4ac31ac255b
--- /dev/null
+++ b/config/metrics/counts_all/20210216182921_package_events_i_package_delete_package_by_deploy_token.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_delete_package_by_deploy_token
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182923_package_events_i_package_delete_package_by_guest.yml b/config/metrics/counts_all/20210216182923_package_events_i_package_delete_package_by_guest.yml
new file mode 100644
index 00000000000..8a3cb104b6a
--- /dev/null
+++ b/config/metrics/counts_all/20210216182923_package_events_i_package_delete_package_by_guest.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_delete_package_by_guest
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182925_package_events_i_package_delete_package_by_user.yml b/config/metrics/counts_all/20210216182925_package_events_i_package_delete_package_by_user.yml
new file mode 100644
index 00000000000..c0bf7f79ebc
--- /dev/null
+++ b/config/metrics/counts_all/20210216182925_package_events_i_package_delete_package_by_user.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_delete_package_by_user
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182927_package_events_i_package_generic_delete_package.yml b/config/metrics/counts_all/20210216182927_package_events_i_package_generic_delete_package.yml
new file mode 100644
index 00000000000..e38a6a4910e
--- /dev/null
+++ b/config/metrics/counts_all/20210216182927_package_events_i_package_generic_delete_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_generic_delete_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182929_package_events_i_package_generic_pull_package.yml b/config/metrics/counts_all/20210216182929_package_events_i_package_generic_pull_package.yml
new file mode 100644
index 00000000000..29e08dd04fe
--- /dev/null
+++ b/config/metrics/counts_all/20210216182929_package_events_i_package_generic_pull_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_generic_pull_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182931_package_events_i_package_generic_push_package.yml b/config/metrics/counts_all/20210216182931_package_events_i_package_generic_push_package.yml
new file mode 100644
index 00000000000..9dbd7572df6
--- /dev/null
+++ b/config/metrics/counts_all/20210216182931_package_events_i_package_generic_push_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_generic_push_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182933_package_events_i_package_golang_delete_package.yml b/config/metrics/counts_all/20210216182933_package_events_i_package_golang_delete_package.yml
new file mode 100644
index 00000000000..9dda1569073
--- /dev/null
+++ b/config/metrics/counts_all/20210216182933_package_events_i_package_golang_delete_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_golang_delete_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182934_package_events_i_package_golang_pull_package.yml b/config/metrics/counts_all/20210216182934_package_events_i_package_golang_pull_package.yml
new file mode 100644
index 00000000000..8a0399ca1be
--- /dev/null
+++ b/config/metrics/counts_all/20210216182934_package_events_i_package_golang_pull_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_golang_pull_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182936_package_events_i_package_golang_push_package.yml b/config/metrics/counts_all/20210216182936_package_events_i_package_golang_push_package.yml
new file mode 100644
index 00000000000..5c83f5533d0
--- /dev/null
+++ b/config/metrics/counts_all/20210216182936_package_events_i_package_golang_push_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_golang_push_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182938_package_events_i_package_maven_delete_package.yml b/config/metrics/counts_all/20210216182938_package_events_i_package_maven_delete_package.yml
new file mode 100644
index 00000000000..5ebdc064a11
--- /dev/null
+++ b/config/metrics/counts_all/20210216182938_package_events_i_package_maven_delete_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_maven_delete_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182940_package_events_i_package_maven_pull_package.yml b/config/metrics/counts_all/20210216182940_package_events_i_package_maven_pull_package.yml
new file mode 100644
index 00000000000..6749fba2c3b
--- /dev/null
+++ b/config/metrics/counts_all/20210216182940_package_events_i_package_maven_pull_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_maven_pull_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182942_package_events_i_package_maven_push_package.yml b/config/metrics/counts_all/20210216182942_package_events_i_package_maven_push_package.yml
new file mode 100644
index 00000000000..f329104f2b2
--- /dev/null
+++ b/config/metrics/counts_all/20210216182942_package_events_i_package_maven_push_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_maven_push_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182944_package_events_i_package_npm_delete_package.yml b/config/metrics/counts_all/20210216182944_package_events_i_package_npm_delete_package.yml
new file mode 100644
index 00000000000..b8653d5a27e
--- /dev/null
+++ b/config/metrics/counts_all/20210216182944_package_events_i_package_npm_delete_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_npm_delete_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182946_package_events_i_package_npm_pull_package.yml b/config/metrics/counts_all/20210216182946_package_events_i_package_npm_pull_package.yml
new file mode 100644
index 00000000000..54799778680
--- /dev/null
+++ b/config/metrics/counts_all/20210216182946_package_events_i_package_npm_pull_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_npm_pull_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182948_package_events_i_package_npm_push_package.yml b/config/metrics/counts_all/20210216182948_package_events_i_package_npm_push_package.yml
new file mode 100644
index 00000000000..c9c5f43627a
--- /dev/null
+++ b/config/metrics/counts_all/20210216182948_package_events_i_package_npm_push_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_npm_push_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182950_package_events_i_package_nuget_delete_package.yml b/config/metrics/counts_all/20210216182950_package_events_i_package_nuget_delete_package.yml
new file mode 100644
index 00000000000..1f410f5ae95
--- /dev/null
+++ b/config/metrics/counts_all/20210216182950_package_events_i_package_nuget_delete_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_nuget_delete_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182952_package_events_i_package_nuget_pull_package.yml b/config/metrics/counts_all/20210216182952_package_events_i_package_nuget_pull_package.yml
new file mode 100644
index 00000000000..4b7abb5af70
--- /dev/null
+++ b/config/metrics/counts_all/20210216182952_package_events_i_package_nuget_pull_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_nuget_pull_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182954_package_events_i_package_nuget_push_package.yml b/config/metrics/counts_all/20210216182954_package_events_i_package_nuget_push_package.yml
new file mode 100644
index 00000000000..3812514b79d
--- /dev/null
+++ b/config/metrics/counts_all/20210216182954_package_events_i_package_nuget_push_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_nuget_push_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182956_package_events_i_package_pull_package.yml b/config/metrics/counts_all/20210216182956_package_events_i_package_pull_package.yml
new file mode 100644
index 00000000000..dd3c335235b
--- /dev/null
+++ b/config/metrics/counts_all/20210216182956_package_events_i_package_pull_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_pull_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182958_package_events_i_package_pull_package_by_deploy_token.yml b/config/metrics/counts_all/20210216182958_package_events_i_package_pull_package_by_deploy_token.yml
new file mode 100644
index 00000000000..1114eb321ca
--- /dev/null
+++ b/config/metrics/counts_all/20210216182958_package_events_i_package_pull_package_by_deploy_token.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_pull_package_by_deploy_token
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183000_package_events_i_package_pull_package_by_guest.yml b/config/metrics/counts_all/20210216183000_package_events_i_package_pull_package_by_guest.yml
new file mode 100644
index 00000000000..f76cac6886b
--- /dev/null
+++ b/config/metrics/counts_all/20210216183000_package_events_i_package_pull_package_by_guest.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_pull_package_by_guest
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183002_package_events_i_package_pull_package_by_user.yml b/config/metrics/counts_all/20210216183002_package_events_i_package_pull_package_by_user.yml
new file mode 100644
index 00000000000..fa4ee39ed81
--- /dev/null
+++ b/config/metrics/counts_all/20210216183002_package_events_i_package_pull_package_by_user.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_pull_package_by_user
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183004_package_events_i_package_push_package.yml b/config/metrics/counts_all/20210216183004_package_events_i_package_push_package.yml
new file mode 100644
index 00000000000..2905f0fa31a
--- /dev/null
+++ b/config/metrics/counts_all/20210216183004_package_events_i_package_push_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_push_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183005_package_events_i_package_push_package_by_deploy_token.yml b/config/metrics/counts_all/20210216183005_package_events_i_package_push_package_by_deploy_token.yml
new file mode 100644
index 00000000000..920875186bd
--- /dev/null
+++ b/config/metrics/counts_all/20210216183005_package_events_i_package_push_package_by_deploy_token.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_push_package_by_deploy_token
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183007_package_events_i_package_push_package_by_guest.yml b/config/metrics/counts_all/20210216183007_package_events_i_package_push_package_by_guest.yml
new file mode 100644
index 00000000000..a360e34eaec
--- /dev/null
+++ b/config/metrics/counts_all/20210216183007_package_events_i_package_push_package_by_guest.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_push_package_by_guest
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183009_package_events_i_package_push_package_by_user.yml b/config/metrics/counts_all/20210216183009_package_events_i_package_push_package_by_user.yml
new file mode 100644
index 00000000000..5fd7d2b3ee3
--- /dev/null
+++ b/config/metrics/counts_all/20210216183009_package_events_i_package_push_package_by_user.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_push_package_by_user
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183011_package_events_i_package_pypi_delete_package.yml b/config/metrics/counts_all/20210216183011_package_events_i_package_pypi_delete_package.yml
new file mode 100644
index 00000000000..a943cce5ecb
--- /dev/null
+++ b/config/metrics/counts_all/20210216183011_package_events_i_package_pypi_delete_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_pypi_delete_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183013_package_events_i_package_pypi_pull_package.yml b/config/metrics/counts_all/20210216183013_package_events_i_package_pypi_pull_package.yml
new file mode 100644
index 00000000000..a15794a05f1
--- /dev/null
+++ b/config/metrics/counts_all/20210216183013_package_events_i_package_pypi_pull_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_pypi_pull_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183015_package_events_i_package_pypi_push_package.yml b/config/metrics/counts_all/20210216183015_package_events_i_package_pypi_push_package.yml
new file mode 100644
index 00000000000..ea0c217997a
--- /dev/null
+++ b/config/metrics/counts_all/20210216183015_package_events_i_package_pypi_push_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_pypi_push_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183017_package_events_i_package_tag_delete_package.yml b/config/metrics/counts_all/20210216183017_package_events_i_package_tag_delete_package.yml
new file mode 100644
index 00000000000..c35c455e5d7
--- /dev/null
+++ b/config/metrics/counts_all/20210216183017_package_events_i_package_tag_delete_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_tag_delete_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183019_package_events_i_package_tag_pull_package.yml b/config/metrics/counts_all/20210216183019_package_events_i_package_tag_pull_package.yml
new file mode 100644
index 00000000000..7b2f0fcca5b
--- /dev/null
+++ b/config/metrics/counts_all/20210216183019_package_events_i_package_tag_pull_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_tag_pull_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183021_package_events_i_package_tag_push_package.yml b/config/metrics/counts_all/20210216183021_package_events_i_package_tag_push_package.yml
new file mode 100644
index 00000000000..6f5a0bc7a8b
--- /dev/null
+++ b/config/metrics/counts_all/20210216183021_package_events_i_package_tag_push_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_tag_push_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183023_wiki_pages_view.yml b/config/metrics/counts_all/20210216183023_wiki_pages_view.yml
new file mode 100644
index 00000000000..f9d6124b57a
--- /dev/null
+++ b/config/metrics/counts_all/20210216183023_wiki_pages_view.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.wiki_pages_view
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183146_coverage_fuzzing_jobs.yml b/config/metrics/counts_all/20210216183146_coverage_fuzzing_jobs.yml
new file mode 100644
index 00000000000..77fe44a1836
--- /dev/null
+++ b/config/metrics/counts_all/20210216183146_coverage_fuzzing_jobs.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.coverage_fuzzing_jobs
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183149_dast_on_demand_pipelines.yml b/config/metrics/counts_all/20210216183149_dast_on_demand_pipelines.yml
new file mode 100644
index 00000000000..fc0ed6e5429
--- /dev/null
+++ b/config/metrics/counts_all/20210216183149_dast_on_demand_pipelines.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.dast_on_demand_pipelines
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183241_filesystems.yml b/config/metrics/counts_all/20210216183241_filesystems.yml
new file mode 100644
index 00000000000..ffb3f0d5cca
--- /dev/null
+++ b/config/metrics/counts_all/20210216183241_filesystems.yml
@@ -0,0 +1,16 @@
+---
+key_path: gitaly.filesystems
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183248_pg_system_id.yml b/config/metrics/counts_all/20210216183248_pg_system_id.yml
new file mode 100644
index 00000000000..72d97c5db54
--- /dev/null
+++ b/config/metrics/counts_all/20210216183248_pg_system_id.yml
@@ -0,0 +1,16 @@
+---
+key_path: database.pg_system_id
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183339_merge_requests_with_overridden_project_rules.yml b/config/metrics/counts_all/20210216183339_merge_requests_with_overridden_project_rules.yml
new file mode 100644
index 00000000000..a2f3c2a6002
--- /dev/null
+++ b/config/metrics/counts_all/20210216183339_merge_requests_with_overridden_project_rules.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.create.merge_requests_with_overridden_project_rules
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183344_users_using_path_locks.yml b/config/metrics/counts_all/20210216183344_users_using_path_locks.yml
new file mode 100644
index 00000000000..f75db6ede2e
--- /dev/null
+++ b/config/metrics/counts_all/20210216183344_users_using_path_locks.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.create.users_using_path_locks
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183346_users_using_lfs_locks.yml b/config/metrics/counts_all/20210216183346_users_using_lfs_locks.yml
new file mode 100644
index 00000000000..b232c6bbb41
--- /dev/null
+++ b/config/metrics/counts_all/20210216183346_users_using_lfs_locks.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.create.users_using_lfs_locks
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183352_approval_project_rules_with_more_approvers_than_required.yml b/config/metrics/counts_all/20210216183352_approval_project_rules_with_more_approvers_than_required.yml
new file mode 100644
index 00000000000..4afb690ddc4
--- /dev/null
+++ b/config/metrics/counts_all/20210216183352_approval_project_rules_with_more_approvers_than_required.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.create.approval_project_rules_with_more_approvers_than_required
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183354_approval_project_rules_with_less_approvers_than_required.yml b/config/metrics/counts_all/20210216183354_approval_project_rules_with_less_approvers_than_required.yml
new file mode 100644
index 00000000000..3ef906e10da
--- /dev/null
+++ b/config/metrics/counts_all/20210216183354_approval_project_rules_with_less_approvers_than_required.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.create.approval_project_rules_with_less_approvers_than_required
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183355_approval_project_rules_with_exact_required_approvers.yml b/config/metrics/counts_all/20210216183355_approval_project_rules_with_exact_required_approvers.yml
new file mode 100644
index 00000000000..1397b1b57e2
--- /dev/null
+++ b/config/metrics/counts_all/20210216183355_approval_project_rules_with_exact_required_approvers.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.create.approval_project_rules_with_exact_required_approvers
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183400_omniauth_providers.yml b/config/metrics/counts_all/20210216183400_omniauth_providers.yml
new file mode 100644
index 00000000000..ab73b3fca22
--- /dev/null
+++ b/config/metrics/counts_all/20210216183400_omniauth_providers.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.omniauth_providers
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183402_two-factor.yml b/config/metrics/counts_all/20210216183402_two-factor.yml
new file mode 100644
index 00000000000..777d4d1cdef
--- /dev/null
+++ b/config/metrics/counts_all/20210216183402_two-factor.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.user_auth_by_provider.two-factor
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183404_two-factor-via-u2f-device.yml b/config/metrics/counts_all/20210216183404_two-factor-via-u2f-device.yml
new file mode 100644
index 00000000000..99c1f289658
--- /dev/null
+++ b/config/metrics/counts_all/20210216183404_two-factor-via-u2f-device.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.user_auth_by_provider.two-factor-via-u2f-device
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183406_two-factor-via-webauthn-device.yml b/config/metrics/counts_all/20210216183406_two-factor-via-webauthn-device.yml
new file mode 100644
index 00000000000..1ea27e42ed0
--- /dev/null
+++ b/config/metrics/counts_all/20210216183406_two-factor-via-webauthn-device.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.user_auth_by_provider.two-factor-via-webauthn-device
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183408_standard.yml b/config/metrics/counts_all/20210216183408_standard.yml
new file mode 100644
index 00000000000..55b4a984ae2
--- /dev/null
+++ b/config/metrics/counts_all/20210216183408_standard.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.user_auth_by_provider.standard
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183410_google_oauth2.yml b/config/metrics/counts_all/20210216183410_google_oauth2.yml
new file mode 100644
index 00000000000..c2fd5fad5ff
--- /dev/null
+++ b/config/metrics/counts_all/20210216183410_google_oauth2.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.user_auth_by_provider.google_oauth2
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183514_user_coverage_fuzzing_jobs.yml b/config/metrics/counts_all/20210216183514_user_coverage_fuzzing_jobs.yml
new file mode 100644
index 00000000000..b7f7eea5f71
--- /dev/null
+++ b/config/metrics/counts_all/20210216183514_user_coverage_fuzzing_jobs.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.secure.user_coverage_fuzzing_jobs
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183904_g_compliance_dashboard.yml b/config/metrics/counts_all/20210216183904_g_compliance_dashboard.yml
new file mode 100644
index 00000000000..03e450d3438
--- /dev/null
+++ b/config/metrics/counts_all/20210216183904_g_compliance_dashboard.yml
@@ -0,0 +1,16 @@
+---
+key_path: compliance_unique_visits.g_compliance_dashboard
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183906_g_compliance_audit_events.yml b/config/metrics/counts_all/20210216183906_g_compliance_audit_events.yml
new file mode 100644
index 00000000000..bd4ef926805
--- /dev/null
+++ b/config/metrics/counts_all/20210216183906_g_compliance_audit_events.yml
@@ -0,0 +1,16 @@
+---
+key_path: compliance_unique_visits.g_compliance_audit_events
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183908_i_compliance_audit_events.yml b/config/metrics/counts_all/20210216183908_i_compliance_audit_events.yml
new file mode 100644
index 00000000000..c7581cc01dc
--- /dev/null
+++ b/config/metrics/counts_all/20210216183908_i_compliance_audit_events.yml
@@ -0,0 +1,16 @@
+---
+key_path: compliance_unique_visits.i_compliance_audit_events
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183910_i_compliance_credential_inventory.yml b/config/metrics/counts_all/20210216183910_i_compliance_credential_inventory.yml
new file mode 100644
index 00000000000..af0d8417863
--- /dev/null
+++ b/config/metrics/counts_all/20210216183910_i_compliance_credential_inventory.yml
@@ -0,0 +1,16 @@
+---
+key_path: compliance_unique_visits.i_compliance_credential_inventory
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183912_a_compliance_audit_events_api.yml b/config/metrics/counts_all/20210216183912_a_compliance_audit_events_api.yml
new file mode 100644
index 00000000000..caf8da049d5
--- /dev/null
+++ b/config/metrics/counts_all/20210216183912_a_compliance_audit_events_api.yml
@@ -0,0 +1,16 @@
+---
+key_path: compliance_unique_visits.a_compliance_audit_events_api
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183914_compliance_unique_visits_for_any_target.yml b/config/metrics/counts_all/20210216183914_compliance_unique_visits_for_any_target.yml
new file mode 100644
index 00000000000..fb67caaa03e
--- /dev/null
+++ b/config/metrics/counts_all/20210216183914_compliance_unique_visits_for_any_target.yml
@@ -0,0 +1,16 @@
+---
+key_path: compliance_unique_visits.compliance_unique_visits_for_any_target
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/license/20210201124932_recorded_at.yml b/config/metrics/license/20210201124932_recorded_at.yml
index af60dcb329e..4b9cfc900d6 100644
--- a/config/metrics/license/20210201124932_recorded_at.yml
+++ b/config/metrics/license/20210201124932_recorded_at.yml
@@ -7,7 +7,7 @@ product_group: group::product intelligence
product_category: collection
value_type: string
status: data_available
-milestone: 8.10
+milestone: "8.10"
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/557
time_frame: none
data_source: ruby
diff --git a/config/metrics/license/20210201124933_uuid.yml b/config/metrics/license/20210201124933_uuid.yml
index 6cd4ca58ef8..9146bf1e070 100644
--- a/config/metrics/license/20210201124933_uuid.yml
+++ b/config/metrics/license/20210201124933_uuid.yml
@@ -7,7 +7,7 @@ product_group: group::product intelligence
product_category: collection
value_type: string
status: data_available
-milestone: 9.1
+milestone: "9.1"
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/1521
time_frame: none
data_source: database
diff --git a/config/metrics/license/20210204124854_license_management_jobs.yml b/config/metrics/license/20210204124854_license_management_jobs.yml
index f89df165662..81e3e17e24b 100644
--- a/config/metrics/license/20210204124854_license_management_jobs.yml
+++ b/config/metrics/license/20210204124854_license_management_jobs.yml
@@ -9,7 +9,8 @@ value_type: number
status: data_available
time_frame: none
data_source: database
-distribution: []
+distribution:
+- ce
tier:
- premium
- ultimate
diff --git a/config/metrics/license/20210204124926_license_trial_ends_on.yml b/config/metrics/license/20210204124926_license_trial_ends_on.yml
index 6e78c6239e9..e3c3303975f 100644
--- a/config/metrics/license/20210204124926_license_trial_ends_on.yml
+++ b/config/metrics/license/20210204124926_license_trial_ends_on.yml
@@ -9,6 +9,8 @@ value_type: string
status: data_available
time_frame: none
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/license/20210204124928_version.yml b/config/metrics/license/20210204124928_version.yml
index a5e8acb1eaa..b39552b220e 100644
--- a/config/metrics/license/20210204124928_version.yml
+++ b/config/metrics/license/20210204124928_version.yml
@@ -9,6 +9,8 @@ value_type: string
status: data_available
time_frame: none
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/license/20210204124936_version.yml b/config/metrics/license/20210204124936_version.yml
index f9c28d40d3d..2d161e15fd0 100644
--- a/config/metrics/license/20210204124936_version.yml
+++ b/config/metrics/license/20210204124936_version.yml
@@ -9,6 +9,8 @@ value_type: string
status: data_available
time_frame: none
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/license/20210204124938_recording_ce_finished_at.yml b/config/metrics/license/20210204124938_recording_ce_finished_at.yml
index bc8a3e57b45..8afcd1bab02 100644
--- a/config/metrics/license/20210204124938_recording_ce_finished_at.yml
+++ b/config/metrics/license/20210204124938_recording_ce_finished_at.yml
@@ -12,5 +12,6 @@ data_source:
distribution:
- ce
- ee
-tier: []
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/license/20210216175601_version.yml b/config/metrics/license/20210216175601_version.yml
new file mode 100644
index 00000000000..b3099eb76bd
--- /dev/null
+++ b/config/metrics/license/20210216175601_version.yml
@@ -0,0 +1,19 @@
+---
+key_path: version
+description: Version of GitLab instance
+product_section: enablement
+product_stage: enablement
+product_group: group::distribution
+product_category: collection
+value_type: string
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/license/20210216175602_installation_type.yml b/config/metrics/license/20210216175602_installation_type.yml
new file mode 100644
index 00000000000..577d0d502b3
--- /dev/null
+++ b/config/metrics/license/20210216175602_installation_type.yml
@@ -0,0 +1,19 @@
+---
+key_path: installation_type
+description: The installation method used to install GitLab (Omnibus, Helm, etc)
+product_section: enablement
+product_stage: enablement
+product_group: group::distribution
+product_category: collection
+value_type: string
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/license/20210216175604_edition.yml b/config/metrics/license/20210216175604_edition.yml
new file mode 100644
index 00000000000..6257c7e76c0
--- /dev/null
+++ b/config/metrics/license/20210216175604_edition.yml
@@ -0,0 +1,19 @@
+---
+key_path: edition
+description: Edition of GitLab such as EE, CE, Bronze, Silver, Gold
+product_section: enablement
+product_stage: enablement
+product_group: group::distribution
+product_category: collection
+value_type: string
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/license/20210216175609_version.yml b/config/metrics/license/20210216175609_version.yml
new file mode 100644
index 00000000000..fd707691e6d
--- /dev/null
+++ b/config/metrics/license/20210216175609_version.yml
@@ -0,0 +1,16 @@
+---
+key_path: database.version
+description: The version of the PostgreSQL database.
+product_section: enablement
+product_stage: enablement
+product_group: group::distribution
+product_category: collection
+value_type: string
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/license/20210216181053_version.yml b/config/metrics/license/20210216181053_version.yml
new file mode 100644
index 00000000000..3570a041b8f
--- /dev/null
+++ b/config/metrics/license/20210216181053_version.yml
@@ -0,0 +1,16 @@
+---
+key_path: container_registry_server.version
+description: Identifies the version of the external registry being used
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category:
+value_type: string
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/license/20210216183237_version.yml b/config/metrics/license/20210216183237_version.yml
new file mode 100644
index 00000000000..4f74963801a
--- /dev/null
+++ b/config/metrics/license/20210216183237_version.yml
@@ -0,0 +1,16 @@
+---
+key_path: git.version
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: string
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/schema.json b/config/metrics/schema.json
index d71eddab469..73a7ee65dec 100644
--- a/config/metrics/schema.json
+++ b/config/metrics/schema.json
@@ -22,17 +22,19 @@
},
"value_type": {
"type": "string",
- "enum": ["integer", "string", "number", "boolean"]
+ "enum": ["string", "number", "boolean"]
},
"status": {
"type": ["string"],
- "enum": ["data_available", "planned", "in_progress", "implemented"]
+ "enum": ["data_available", "planned", "in_progress", "implemented", "not_used", "deprecated"]
},
"milestone": {
- "type": ["number", "null"]
+ "type": ["string", "null"],
+ "pattern": "^[0-9]+\\.[0-9]+$"
},
"milestone_removed": {
- "type": ["number", "null"]
+ "type": ["string", "null"],
+ "pattern": "^[0-9]+\\.[0-9]+$"
},
"introduced_by_url": {
"type": ["string", "null"]
diff --git a/config/metrics/settings/20210204124856_instance_auto_devops_enabled.yml b/config/metrics/settings/20210204124856_instance_auto_devops_enabled.yml
index 41f6d432b78..6f05eacbe5a 100644
--- a/config/metrics/settings/20210204124856_instance_auto_devops_enabled.yml
+++ b/config/metrics/settings/20210204124856_instance_auto_devops_enabled.yml
@@ -9,6 +9,8 @@ value_type: boolean
status: data_available
time_frame: none
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/settings/20210204124858_container_registry_enabled.yml b/config/metrics/settings/20210204124858_container_registry_enabled.yml
index 53567998a76..6c50cb9144e 100644
--- a/config/metrics/settings/20210204124858_container_registry_enabled.yml
+++ b/config/metrics/settings/20210204124858_container_registry_enabled.yml
@@ -9,6 +9,8 @@ value_type: boolean
status: data_available
time_frame: none
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/settings/20210204124900_dependency_proxy_enabled.yml b/config/metrics/settings/20210204124900_dependency_proxy_enabled.yml
index cecb9035dc6..01feb7157d9 100644
--- a/config/metrics/settings/20210204124900_dependency_proxy_enabled.yml
+++ b/config/metrics/settings/20210204124900_dependency_proxy_enabled.yml
@@ -9,6 +9,8 @@ value_type: boolean
status: data_available
time_frame: none
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/settings/20210204124902_gitlab_shared_runners_enabled.yml b/config/metrics/settings/20210204124902_gitlab_shared_runners_enabled.yml
index 5cdb62237e4..ed9491959ae 100644
--- a/config/metrics/settings/20210204124902_gitlab_shared_runners_enabled.yml
+++ b/config/metrics/settings/20210204124902_gitlab_shared_runners_enabled.yml
@@ -9,6 +9,8 @@ value_type: boolean
status: data_available
time_frame: none
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/settings/20210204124904_gravatar_enabled.yml b/config/metrics/settings/20210204124904_gravatar_enabled.yml
index 7102c96332a..21758753b35 100644
--- a/config/metrics/settings/20210204124904_gravatar_enabled.yml
+++ b/config/metrics/settings/20210204124904_gravatar_enabled.yml
@@ -9,6 +9,8 @@ value_type: boolean
status: data_available
time_frame: none
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/settings/20210204124906_ldap_enabled.yml b/config/metrics/settings/20210204124906_ldap_enabled.yml
index b0bdeded7d9..6dc1a62d337 100644
--- a/config/metrics/settings/20210204124906_ldap_enabled.yml
+++ b/config/metrics/settings/20210204124906_ldap_enabled.yml
@@ -9,6 +9,8 @@ value_type: boolean
status: data_available
time_frame: none
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/settings/20210204124908_mattermost_enabled.yml b/config/metrics/settings/20210204124908_mattermost_enabled.yml
index 7082b6c4ec5..425f3c44511 100644
--- a/config/metrics/settings/20210204124908_mattermost_enabled.yml
+++ b/config/metrics/settings/20210204124908_mattermost_enabled.yml
@@ -9,6 +9,8 @@ value_type: boolean
status: data_available
time_frame: none
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/settings/20210204124910_omniauth_enabled.yml b/config/metrics/settings/20210204124910_omniauth_enabled.yml
index 10483bd977b..f9e691b0516 100644
--- a/config/metrics/settings/20210204124910_omniauth_enabled.yml
+++ b/config/metrics/settings/20210204124910_omniauth_enabled.yml
@@ -9,6 +9,8 @@ value_type: boolean
status: data_available
time_frame: none
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/settings/20210204124912_prometheus_enabled.yml b/config/metrics/settings/20210204124912_prometheus_enabled.yml
index 0e6199e9976..ca829933eda 100644
--- a/config/metrics/settings/20210204124912_prometheus_enabled.yml
+++ b/config/metrics/settings/20210204124912_prometheus_enabled.yml
@@ -9,6 +9,8 @@ value_type: boolean
status: data_available
time_frame: none
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/settings/20210204124914_prometheus_metrics_enabled.yml b/config/metrics/settings/20210204124914_prometheus_metrics_enabled.yml
index 50b08c15919..f9566076c9e 100644
--- a/config/metrics/settings/20210204124914_prometheus_metrics_enabled.yml
+++ b/config/metrics/settings/20210204124914_prometheus_metrics_enabled.yml
@@ -9,6 +9,8 @@ value_type: boolean
status: data_available
time_frame: none
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/settings/20210204124916_reply_by_email_enabled.yml b/config/metrics/settings/20210204124916_reply_by_email_enabled.yml
index 82defcf4014..f2fb58e33ec 100644
--- a/config/metrics/settings/20210204124916_reply_by_email_enabled.yml
+++ b/config/metrics/settings/20210204124916_reply_by_email_enabled.yml
@@ -9,6 +9,8 @@ value_type: boolean
status: data_available
time_frame: none
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/settings/20210204124918_signup_enabled.yml b/config/metrics/settings/20210204124918_signup_enabled.yml
index 49d997bd2a8..051d3933316 100644
--- a/config/metrics/settings/20210204124918_signup_enabled.yml
+++ b/config/metrics/settings/20210204124918_signup_enabled.yml
@@ -9,6 +9,8 @@ value_type: boolean
status: data_available
time_frame: none
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/settings/20210204124920_web_ide_clientside_preview_enabled.yml b/config/metrics/settings/20210204124920_web_ide_clientside_preview_enabled.yml
index d3eb20e93fd..4f21c0f2f18 100644
--- a/config/metrics/settings/20210204124920_web_ide_clientside_preview_enabled.yml
+++ b/config/metrics/settings/20210204124920_web_ide_clientside_preview_enabled.yml
@@ -9,6 +9,8 @@ value_type: boolean
status: data_available
time_frame: none
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/settings/20210204124922_grafana_link_enabled.yml b/config/metrics/settings/20210204124922_grafana_link_enabled.yml
index a78936d3324..596ae1384ca 100644
--- a/config/metrics/settings/20210204124922_grafana_link_enabled.yml
+++ b/config/metrics/settings/20210204124922_grafana_link_enabled.yml
@@ -9,6 +9,8 @@ value_type: boolean
status: data_available
time_frame: none
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/settings/20210204124924_elasticsearch_enabled.yml b/config/metrics/settings/20210204124924_elasticsearch_enabled.yml
deleted file mode 100644
index 4b7d560b4ef..00000000000
--- a/config/metrics/settings/20210204124924_elasticsearch_enabled.yml
+++ /dev/null
@@ -1,14 +0,0 @@
----
-key_path: elasticsearch_enabled
-description: Whether Elasticsearch is enabled
-product_section: growth
-product_stage: growth
-product_group: group::product intelligence
-product_category: collection
-value_type: boolean
-status: data_available
-time_frame: none
-data_source:
-distribution: []
-tier: []
-skip_validation: true
diff --git a/config/metrics/settings/20210204124934_enabled.yml b/config/metrics/settings/20210204124934_enabled.yml
index 3f4c8653dd1..2f2586ad8f4 100644
--- a/config/metrics/settings/20210204124934_enabled.yml
+++ b/config/metrics/settings/20210204124934_enabled.yml
@@ -9,6 +9,8 @@ value_type: boolean
status: data_available
time_frame: none
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/settings/20210216175459_ingress_modsecurity_enabled.yml b/config/metrics/settings/20210216175459_ingress_modsecurity_enabled.yml
new file mode 100644
index 00000000000..6bb5795c971
--- /dev/null
+++ b/config/metrics/settings/20210216175459_ingress_modsecurity_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: ingress_modsecurity_enabled
+description: Whether or not ModSecurity is enabled within Ingress
+product_section: sec
+product_stage: protect
+product_group: group::container security
+product_category: web_firewall
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216175606_ldap_encrypted_secrets_enabled.yml b/config/metrics/settings/20210216175606_ldap_encrypted_secrets_enabled.yml
new file mode 100644
index 00000000000..1828d18b794
--- /dev/null
+++ b/config/metrics/settings/20210216175606_ldap_encrypted_secrets_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: settings.ldap_encrypted_secrets_enabled
+description: Is encrypted LDAP secrets configured?
+product_section: enablement
+product_stage: enablement
+product_group: group::distribution
+product_category: global_search
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180314_gitpod_enabled.yml b/config/metrics/settings/20210216180314_gitpod_enabled.yml
new file mode 100644
index 00000000000..f716f3985f6
--- /dev/null
+++ b/config/metrics/settings/20210216180314_gitpod_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: gitpod_enabled
+description: Whether gitpod is enabled in the instance
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: integrations
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180836_enabled.yml b/config/metrics/settings/20210216180836_enabled.yml
new file mode 100644
index 00000000000..1e7e5a226c2
--- /dev/null
+++ b/config/metrics/settings/20210216180836_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.artifacts.enabled
+description: Whether Object Storage is enabled for Artifacts
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180838_enabled.yml b/config/metrics/settings/20210216180838_enabled.yml
new file mode 100644
index 00000000000..8524f525917
--- /dev/null
+++ b/config/metrics/settings/20210216180838_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.artifacts.object_store.enabled
+description: Whether Object Storage is enabled for Artifacts
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180840_direct_upload.yml b/config/metrics/settings/20210216180840_direct_upload.yml
new file mode 100644
index 00000000000..08ef5e1ece1
--- /dev/null
+++ b/config/metrics/settings/20210216180840_direct_upload.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.artifacts.object_store.direct_upload
+description: Whether Direct Upload for Object Storage is enabled for Artifacts
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180841_background_upload.yml b/config/metrics/settings/20210216180841_background_upload.yml
new file mode 100644
index 00000000000..c7b943be3b8
--- /dev/null
+++ b/config/metrics/settings/20210216180841_background_upload.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.artifacts.object_store.background_upload
+description: Whether Background Upload for Object Storage is enabled for Artifacts
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180845_enabled.yml b/config/metrics/settings/20210216180845_enabled.yml
new file mode 100644
index 00000000000..45148c406dc
--- /dev/null
+++ b/config/metrics/settings/20210216180845_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.external_diffs.enabled
+description: Whether Object Storage is enabled for External Diffs
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180847_enabled.yml b/config/metrics/settings/20210216180847_enabled.yml
new file mode 100644
index 00000000000..8323bd9f5ab
--- /dev/null
+++ b/config/metrics/settings/20210216180847_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.external_diffs.object_store.enabled
+description: Whether Object Storage is enabled for External Diffs
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180849_direct_upload.yml b/config/metrics/settings/20210216180849_direct_upload.yml
new file mode 100644
index 00000000000..e67b87e0bce
--- /dev/null
+++ b/config/metrics/settings/20210216180849_direct_upload.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.external_diffs.object_store.direct_upload
+description: Whether Direct Upload for Object Storage is enabled for External Diffs
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180851_background_upload.yml b/config/metrics/settings/20210216180851_background_upload.yml
new file mode 100644
index 00000000000..058c80a536d
--- /dev/null
+++ b/config/metrics/settings/20210216180851_background_upload.yml
@@ -0,0 +1,20 @@
+---
+key_path: object_store.external_diffs.object_store.background_upload
+description: Whether Background Upload for Object Storage is enabled for External
+ Diffs
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180854_enabled.yml b/config/metrics/settings/20210216180854_enabled.yml
new file mode 100644
index 00000000000..40be02cb34a
--- /dev/null
+++ b/config/metrics/settings/20210216180854_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.lfs.enabled
+description: Whether Object Storage is enabled for LFS
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180856_enabled.yml b/config/metrics/settings/20210216180856_enabled.yml
new file mode 100644
index 00000000000..0646a211e31
--- /dev/null
+++ b/config/metrics/settings/20210216180856_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.lfs.object_store.enabled
+description: Whether Object Storage is enabled for LFS
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180858_direct_upload.yml b/config/metrics/settings/20210216180858_direct_upload.yml
new file mode 100644
index 00000000000..d4f14bc35fc
--- /dev/null
+++ b/config/metrics/settings/20210216180858_direct_upload.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.lfs.object_store.direct_upload
+description: Whether Direct Upload for Object Storage is enabled for LFS
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180900_background_upload.yml b/config/metrics/settings/20210216180900_background_upload.yml
new file mode 100644
index 00000000000..850c7ae04e2
--- /dev/null
+++ b/config/metrics/settings/20210216180900_background_upload.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.lfs.object_store.background_upload
+description: Whether Background Upload for Object Storage is enabled for LFS
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180905_enabled.yml b/config/metrics/settings/20210216180905_enabled.yml
new file mode 100644
index 00000000000..ef22d960a95
--- /dev/null
+++ b/config/metrics/settings/20210216180905_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.uploads.object_store.enabled
+description: Whether Object Storage is enabled for Uploads
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180907_direct_upload.yml b/config/metrics/settings/20210216180907_direct_upload.yml
new file mode 100644
index 00000000000..b34ab887fc6
--- /dev/null
+++ b/config/metrics/settings/20210216180907_direct_upload.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.uploads.object_store.direct_upload
+description: Whether Direct Upload for Object Storage is enabled for Uploads
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180909_background_upload.yml b/config/metrics/settings/20210216180909_background_upload.yml
new file mode 100644
index 00000000000..497f7ef7926
--- /dev/null
+++ b/config/metrics/settings/20210216180909_background_upload.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.uploads.object_store.background_upload
+description: Whether Background Upload for Object Storage is enabled for Uploads
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180913_enabled.yml b/config/metrics/settings/20210216180913_enabled.yml
new file mode 100644
index 00000000000..732a6364a3a
--- /dev/null
+++ b/config/metrics/settings/20210216180913_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.packages.enabled
+description: Whether Object Storage is enabled for Uploads
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180915_enabled.yml b/config/metrics/settings/20210216180915_enabled.yml
new file mode 100644
index 00000000000..eb78ef5f9e9
--- /dev/null
+++ b/config/metrics/settings/20210216180915_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.packages.object_store.enabled
+description: Whether Object Storage is enabled for Packages
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180916_direct_upload.yml b/config/metrics/settings/20210216180916_direct_upload.yml
new file mode 100644
index 00000000000..20785f2f8d7
--- /dev/null
+++ b/config/metrics/settings/20210216180916_direct_upload.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.packages.object_store.direct_upload
+description: Whether Direct Upload for Object Storage is enabled for Packages
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180918_background_upload.yml b/config/metrics/settings/20210216180918_background_upload.yml
new file mode 100644
index 00000000000..3ef8daaa685
--- /dev/null
+++ b/config/metrics/settings/20210216180918_background_upload.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.packages.object_store.background_upload
+description: Whether Background Upload for Object Storage is enabled for Packages
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210225045628_operating_system.yml b/config/metrics/settings/20210225045628_operating_system.yml
new file mode 100644
index 00000000000..e88b8f8c827
--- /dev/null
+++ b/config/metrics/settings/20210225045628_operating_system.yml
@@ -0,0 +1,20 @@
+---
+key_path: settings.operating_system
+description: Information about the operating system running GitLab
+product_section: enablement
+product_stage: enablement
+product_group: group::distribution
+product_category: collection
+value_type: string
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54778
+time_frame: none
+data_source: ruby
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/puma.example.development.rb b/config/puma.example.development.rb
index 1901b5a0c1c..28c2af3acb3 100644
--- a/config/puma.example.development.rb
+++ b/config/puma.example.development.rb
@@ -86,7 +86,7 @@ end
# https://github.com/puma/puma/blob/master/5.0-Upgrade.md#nakayoshi_fork
if defined?(nakayoshi_fork)
- nakayoshi_fork if ENV['ENABLE_PUMA_NAKAYOSHI_FORK'] == 'true'
+ nakayoshi_fork unless ENV['DISABLE_PUMA_NAKAYOSHI_FORK'] == 'true'
end
# Use json formatter
diff --git a/config/puma.rb.example b/config/puma.rb.example
index 6684919e912..9fc354a8fe8 100644
--- a/config/puma.rb.example
+++ b/config/puma.rb.example
@@ -76,7 +76,7 @@ end
# https://github.com/puma/puma/blob/master/5.0-Upgrade.md#nakayoshi_fork
if defined?(nakayoshi_fork)
- nakayoshi_fork if ENV['ENABLE_PUMA_NAKAYOSHI_FORK'] == 'true'
+ nakayoshi_fork unless ENV['DISABLE_PUMA_NAKAYOSHI_FORK'] == 'true'
end
# Use json formatter
diff --git a/config/puma_actioncable.example.development.rb b/config/puma_actioncable.example.development.rb
index a12b4523848..d0da3dcd8f2 100644
--- a/config/puma_actioncable.example.development.rb
+++ b/config/puma_actioncable.example.development.rb
@@ -86,7 +86,7 @@ end
# https://github.com/puma/puma/blob/master/5.0-Upgrade.md#nakayoshi_fork
if defined?(nakayoshi_fork)
- nakayoshi_fork if ENV['ENABLE_PUMA_NAKAYOSHI_FORK'] == 'true'
+ nakayoshi_fork unless ENV['DISABLE_PUMA_NAKAYOSHI_FORK'] == 'true'
end
# Use json formatter
diff --git a/config/routes.rb b/config/routes.rb
index 90a26c0a20f..38030a24cb5 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -50,6 +50,7 @@ Rails.application.routes.draw do
resource :welcome, only: [:show, :update], controller: 'welcome' do
Gitlab.ee do
get :trial_getting_started, on: :collection
+ get :trial_onboarding_board, on: :collection
end
end
@@ -57,6 +58,7 @@ Rails.application.routes.draw do
Gitlab.ee do
resources :groups, only: [:new, :create]
+ resources :group_invites, only: [:new, :create]
resources :projects, only: [:new, :create]
end
end
@@ -130,8 +132,24 @@ Rails.application.routes.draw do
# UserCallouts
resources :user_callouts, only: [:create]
- get 'ide' => 'ide#index'
- get 'ide/*vueroute' => 'ide#index', format: false
+ scope :ide, as: :ide, format: false do
+ get '/', to: 'ide#index'
+ get '/project', to: 'ide#index'
+
+ scope path: 'project/:project_id', as: :project, constraints: { project_id: Gitlab::PathRegex.full_namespace_route_regex } do
+ %w[edit tree blob].each do |action|
+ get "/#{action}", to: 'ide#index'
+ get "/#{action}/*branch/-/*path", to: 'ide#index'
+ get "/#{action}/*branch/-", to: 'ide#index'
+ get "/#{action}/*branch", to: 'ide#index'
+ end
+
+ get '/merge_requests/:merge_request_id', to: 'ide#index', constraints: { merge_request_id: /\d+/ }
+ get '/', to: 'ide#index'
+ end
+ end
+
+ resource :projects
draw :operations
draw :jira_connect
@@ -165,9 +183,6 @@ Rails.application.routes.draw do
end
end
- # Notification settings
- resources :notification_settings, only: [:create, :update]
-
resources :invites, only: [:show], constraints: { id: /[A-Za-z0-9_-]+/ } do
member do
post :accept
diff --git a/config/routes/admin.rb b/config/routes/admin.rb
index 3e04f0d97cb..39d639a70cc 100644
--- a/config/routes/admin.rb
+++ b/config/routes/admin.rb
@@ -95,7 +95,8 @@ namespace :admin do
resources :projects, only: [:index]
- resources :instance_statistics, only: :index
+ get '/instance_statistics', to: redirect('admin/usage_trends')
+ resources :usage_trends, only: :index
resource :dev_ops_report, controller: 'dev_ops_report', only: :show
resources :cohorts, only: :index
diff --git a/config/routes/api.rb b/config/routes/api.rb
index dcbc98991e2..8dd64068333 100644
--- a/config/routes/api.rb
+++ b/config/routes/api.rb
@@ -1,6 +1,6 @@
# frozen_string_literal: true
-post '/api/graphql', to: 'graphql#execute'
+match '/api/graphql', via: [:get, :post], to: 'graphql#execute'
mount GraphiQL::Rails::Engine, at: '/-/graphql-explorer', graphql_path: Gitlab::Utils.append_path(Gitlab.config.gitlab.relative_url_root, '/api/graphql')
::API::API.logger Rails.logger # rubocop:disable Gitlab/RailsLogger
diff --git a/config/sidekiq_queues.yml b/config/sidekiq_queues.yml
index 678b585e6d7..3f6d919f5e9 100644
--- a/config/sidekiq_queues.yml
+++ b/config/sidekiq_queues.yml
@@ -34,6 +34,8 @@
- 1
- - analytics_instance_statistics_counter_job
- 1
+- - analytics_usage_trends_counter_job
+ - 1
- - approve_blocked_pending_approval_users
- 1
- - authorized_keys
@@ -98,6 +100,8 @@
- 1
- - disallow_two_factor_for_subgroups
- 1
+- - dora_metrics
+ - 1
- - elastic_association_indexer
- 1
- - elastic_commit_indexer
@@ -164,6 +168,8 @@
- 1
- - groups_update_repository_storage
- 1
+- - groups_update_statistics
+ - 1
- - hashed_storage
- 1
- - import_issues_csv
@@ -202,6 +208,8 @@
- 1
- - merge_request_reset_approvals
- 1
+- - merge_requests_delete_source_branch
+ - 1
- - metrics_dashboard_prune_old_annotations
- 1
- - metrics_dashboard_sync_dashboards
@@ -210,8 +218,12 @@
- 1
- - namespaceless_project_destroy
- 1
+- - namespaces_onboarding_issue_created
+ - 1
- - namespaces_onboarding_pipeline_created
- 1
+- - namespaces_onboarding_progress
+ - 1
- - namespaces_onboarding_user_added
- 1
- - new_epic
@@ -228,6 +240,8 @@
- 1
- - package_repositories
- 1
+- - packages_composer_cache_update
+ - 1
- - pages
- 1
- - pages_domain_ssl_renewal
@@ -280,6 +294,10 @@
- 1
- - projects_git_garbage_collect
- 1
+- - projects_schedule_bulk_repository_shard_moves
+ - 1
+- - projects_update_repository_storage
+ - 1
- - prometheus_create_default_alerts
- 1
- - propagate_integration
@@ -300,6 +318,8 @@
- 2
- - refresh_license_compliance_checks
- 2
+- - releases_create_evidence
+ - 1
- - remote_mirror_notification
- 2
- - repository_check
@@ -338,6 +358,10 @@
- 1
- - snippet_update_repository_storage
- 1
+- - snippets_schedule_bulk_repository_shard_moves
+ - 1
+- - snippets_update_repository_storage
+ - 1
- - status_page_publish
- 1
- - sync_seat_link_request
diff --git a/config/webpack.config.js b/config/webpack.config.js
index 19059c35c46..39add7def22 100644
--- a/config/webpack.config.js
+++ b/config/webpack.config.js
@@ -1,25 +1,34 @@
const fs = require('fs');
-const path = require('path');
-const glob = require('glob');
-const webpack = require('webpack');
-const VueLoaderPlugin = require('vue-loader/lib/plugin');
-const StatsWriterPlugin = require('webpack-stats-plugin').StatsWriterPlugin;
+
+const SOURCEGRAPH_VERSION = require('@sourcegraph/code-host-integration/package.json').version;
+
const CompressionPlugin = require('compression-webpack-plugin');
-const MonacoWebpackPlugin = require('./plugins/monaco_webpack');
-const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
const CopyWebpackPlugin = require('copy-webpack-plugin');
-const vendorDllHash = require('./helpers/vendor_dll_hash');
+const glob = require('glob');
+const path = require('path');
+const VueLoaderPlugin = require('vue-loader/lib/plugin');
+const VUE_LOADER_VERSION = require('vue-loader/package.json').version;
+const VUE_VERSION = require('vue/package.json').version;
+const webpack = require('webpack');
+const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer');
+const { StatsWriterPlugin } = require('webpack-stats-plugin');
+const WEBPACK_VERSION = require('webpack/package.json').version;
+
const createIncrementalWebpackCompiler = require('./helpers/incremental_webpack_compiler');
+const IS_EE = require('./helpers/is_ee_env');
+const vendorDllHash = require('./helpers/vendor_dll_hash');
+
+const MonacoWebpackPlugin = require('./plugins/monaco_webpack');
const ROOT_PATH = path.resolve(__dirname, '..');
const VENDOR_DLL = process.env.WEBPACK_VENDOR_DLL && process.env.WEBPACK_VENDOR_DLL !== 'false';
const CACHE_PATH = process.env.WEBPACK_CACHE_PATH || path.join(ROOT_PATH, 'tmp/cache');
const IS_PRODUCTION = process.env.NODE_ENV === 'production';
const IS_DEV_SERVER = process.env.WEBPACK_DEV_SERVER === 'true';
-const IS_EE = require('./helpers/is_ee_env');
+
const DEV_SERVER_HOST = process.env.DEV_SERVER_HOST || 'localhost';
const DEV_SERVER_PORT = parseInt(process.env.DEV_SERVER_PORT, 10) || 3808;
-const DEV_SERVER_PUBLIC_ADDR = process.env.DEV_SERVER_PUBLIC_ADDR;
+const { DEV_SERVER_PUBLIC_ADDR } = process.env;
const DEV_SERVER_ALLOWED_HOSTS =
process.env.DEV_SERVER_ALLOWED_HOSTS && process.env.DEV_SERVER_ALLOWED_HOSTS.split(',');
const DEV_SERVER_HTTPS = process.env.DEV_SERVER_HTTPS && process.env.DEV_SERVER_HTTPS !== 'false';
@@ -38,11 +47,6 @@ const WEBPACK_OUTPUT_PATH = path.join(ROOT_PATH, 'public/assets/webpack');
const WEBPACK_PUBLIC_PATH = '/assets/webpack/';
const SOURCEGRAPH_PACKAGE = '@sourcegraph/code-host-integration';
-const VUE_VERSION = require('vue/package.json').version;
-const VUE_LOADER_VERSION = require('vue-loader/package.json').version;
-const WEBPACK_VERSION = require('webpack/package.json').version;
-const SOURCEGRAPH_VERSION = require(path.join(SOURCEGRAPH_PACKAGE, 'package.json')).version;
-
const SOURCEGRAPH_PATH = path.join('sourcegraph', SOURCEGRAPH_VERSION, '/');
const SOURCEGRAPH_OUTPUT_PATH = path.join(WEBPACK_OUTPUT_PATH, SOURCEGRAPH_PATH);
const SOURCEGRAPH_PUBLIC_PATH = path.join(WEBPACK_PUBLIC_PATH, SOURCEGRAPH_PATH);
@@ -67,19 +71,19 @@ function generateEntries() {
});
watchAutoEntries = [path.join(ROOT_PATH, 'app/assets/javascripts/pages/')];
- function generateAutoEntries(path, prefix = '.') {
- const chunkPath = path.replace(/\/index\.js$/, '');
+ function generateAutoEntries(entryPath, prefix = '.') {
+ const chunkPath = entryPath.replace(/\/index\.js$/, '');
const chunkName = chunkPath.replace(/\//g, '.');
- autoEntriesMap[chunkName] = `${prefix}/${path}`;
+ autoEntriesMap[chunkName] = `${prefix}/${entryPath}`;
}
- pageEntries.forEach((path) => generateAutoEntries(path));
+ pageEntries.forEach((entryPath) => generateAutoEntries(entryPath));
if (IS_EE) {
const eePageEntries = glob.sync('pages/**/index.js', {
cwd: path.join(ROOT_PATH, 'ee/app/assets/javascripts'),
});
- eePageEntries.forEach((path) => generateAutoEntries(path, 'ee'));
+ eePageEntries.forEach((entryPath) => generateAutoEntries(entryPath, 'ee'));
watchAutoEntries.push(path.join(ROOT_PATH, 'ee/app/assets/javascripts/pages/'));
}
@@ -101,9 +105,8 @@ function generateEntries() {
const manualEntries = {
default: defaultEntries,
- // sentry: './sentry/index.js', Temporarily commented out to investigate performance: https://gitlab.com/gitlab-org/gitlab/-/issues/251179
+ sentry: './sentry/index.js',
performance_bar: './performance_bar/index.js',
- chrome_84_icon_fix: './lib/chrome_84_icon_fix.js',
jira_connect_app: './jira_connect/index.js',
};
@@ -198,9 +201,9 @@ module.exports = {
},
{
test: /\.js$/,
- exclude: (path) =>
- /node_modules\/(?!tributejs)|node_modules|vendor[\\/]assets/.test(path) &&
- !/\.vue\.js/.test(path),
+ exclude: (modulePath) =>
+ /node_modules\/(?!tributejs)|node_modules|vendor[\\/]assets/.test(modulePath) &&
+ !/\.vue\.js/.test(modulePath),
loader: 'babel-loader',
options: {
cacheDirectory: path.join(CACHE_PATH, 'babel-loader'),
@@ -354,7 +357,7 @@ module.exports = {
// webpack-rails only needs assetsByChunkName to function properly
new StatsWriterPlugin({
filename: 'manifest.json',
- transform: function (data, opts) {
+ transform(data, opts) {
const stats = opts.compiler.getStats().toJson({
chunkModules: false,
source: false,
@@ -412,6 +415,7 @@ module.exports = {
`Warning: No vendor DLL found at: ${dll.cacheFrom}. Compiling DLL automatically.`,
);
+ // eslint-disable-next-line global-require
const dllConfig = require('./webpack.vendor.config.js');
const dllCompiler = webpack(dllConfig);
@@ -435,7 +439,7 @@ module.exports = {
}
dll.exists = true;
- callback();
+ return callback();
});
}
});
@@ -459,6 +463,7 @@ module.exports = {
!IS_EE &&
new webpack.NormalModuleReplacementPlugin(/^ee_component\/(.*)\.vue/, (resource) => {
+ // eslint-disable-next-line no-param-reassign
resource.request = path.join(
ROOT_PATH,
'app/assets/javascripts/vue_shared/components/empty_component.js',
@@ -521,7 +526,7 @@ module.exports = {
// output the in-memory heap size upon compilation and exit
WEBPACK_MEMORY_TEST && {
apply(compiler) {
- compiler.hooks.emit.tapAsync('ReportMemoryConsumptionPlugin', (compilation, callback) => {
+ compiler.hooks.emit.tapAsync('ReportMemoryConsumptionPlugin', () => {
console.log('Assets compiled...');
if (global.gc) {
console.log('Running garbage collection...');
@@ -552,7 +557,9 @@ module.exports = {
);
// exit in case we're running webpack-dev-server
- IS_DEV_SERVER && process.exit();
+ if (IS_DEV_SERVER) {
+ process.exit();
+ }
});
},
},
diff --git a/config/webpack.vendor.config.js b/config/webpack.vendor.config.js
index 29c4c33314e..7e5365987ee 100644
--- a/config/webpack.vendor.config.js
+++ b/config/webpack.vendor.config.js
@@ -1,7 +1,7 @@
const path = require('path');
const webpack = require('webpack');
-const vendorDllHash = require('./helpers/vendor_dll_hash');
const { YarnCheck } = require('yarn-check-webpack-plugin');
+const vendorDllHash = require('./helpers/vendor_dll_hash');
const ROOT_PATH = path.resolve(__dirname, '..');
diff --git a/danger/changelog/Dangerfile b/danger/changelog/Dangerfile
index c8474157fa5..377f3592d56 100644
--- a/danger/changelog/Dangerfile
+++ b/danger/changelog/Dangerfile
@@ -46,7 +46,7 @@ def check_changelog_path(path)
ee_changes = helper.all_ee_changes.dup
ee_changes.delete(path)
- if ee_changes.any? && !changelog.ee_changelog? && !changelog.db_changes?
+ if ee_changes.any? && !changelog.ee_changelog? && !changelog.required?
warn "This MR has a Changelog file outside `ee/`, but code changes in `ee/`. Consider moving the Changelog file into `ee/`."
end
@@ -54,7 +54,7 @@ def check_changelog_path(path)
warn "This MR has a Changelog file in `ee/`, but no code changes in `ee/`. Consider moving the Changelog file outside `ee/`."
end
- if ee_changes.any? && changelog.ee_changelog? && changelog.db_changes?
+ if ee_changes.any? && changelog.ee_changelog? && changelog.required_reasons.include?(:db_changes)
warn "This MR has a Changelog file inside `ee/`, but there are database changes which [requires](https://docs.gitlab.com/ee/development/changelog.html#what-warrants-a-changelog-entry) the Changelog placement to be outside of `ee/`. Consider moving the Changelog file outside `ee/`."
end
end
@@ -69,7 +69,7 @@ if changelog_found
check_changelog_yaml(changelog_found)
check_changelog_path(changelog_found)
elsif changelog.required?
- fail changelog.required_text
+ changelog.required_texts.each { |_, text| fail(text) } # rubocop:disable Lint/UnreachableLoop
elsif changelog.optional?
message changelog.optional_text
end
diff --git a/danger/changes_size/Dangerfile b/danger/changes_size/Dangerfile
index f37632ced33..52e6cb65d04 100644
--- a/danger/changes_size/Dangerfile
+++ b/danger/changes_size/Dangerfile
@@ -13,7 +13,7 @@
# end
if git.lines_of_code > 2_000
- warn "This merge request is definitely too big (more than #{git.lines_of_code} lines changed), please split it into multiple merge requests."
+ warn "This merge request is definitely too big (#{git.lines_of_code} lines changed), please split it into multiple merge requests."
elsif git.lines_of_code > 500
- warn "This merge request is quite big (more than #{git.lines_of_code} lines changed), please consider splitting it into multiple merge requests."
+ warn "This merge request is quite big (#{git.lines_of_code} lines changed), please consider splitting it into multiple merge requests."
end
diff --git a/danger/documentation/Dangerfile b/danger/documentation/Dangerfile
index 240c374435c..df7d0337e94 100644
--- a/danger/documentation/Dangerfile
+++ b/danger/documentation/Dangerfile
@@ -41,6 +41,7 @@ markdown(<<~MARKDOWN)
The review does not need to block merging this merge request. See the:
- - [Technical Writers assignments](https://about.gitlab.com/handbook/engineering/technical-writing/#designated-technical-writers) for the appropriate technical writer for this review.
+ - [Metadata for the `*.md` files](https://docs.gitlab.com/ee/development/documentation/#metadata) that you've changed. The first few lines of each `*.md` file identify the stage and group most closely associated with your docs change.
+ - The [Technical Writer assigned](https://about.gitlab.com/handbook/engineering/technical-writing/#designated-technical-writers) for that stage and group.
- [Documentation workflows](https://docs.gitlab.com/ee/development/documentation/workflow.html) for information on when to assign a merge request for review.
MARKDOWN
diff --git a/danger/feature_flag/Dangerfile b/danger/feature_flag/Dangerfile
index c90f60640f2..e66ed35c9ab 100644
--- a/danger/feature_flag/Dangerfile
+++ b/danger/feature_flag/Dangerfile
@@ -1,7 +1,7 @@
# frozen_string_literal: true
# rubocop:disable Style/SignalException
-SEE_DOC = "See the [feature flag documentation](https://docs.gitlab.com/ee/development/feature_flags/development.html#feature-flag-definition-and-validation)."
+SEE_DOC = "See the [feature flag documentation](https://docs.gitlab.com/ee/development/feature_flags#feature-flag-definition-and-validation)."
SUGGEST_MR_COMMENT = <<~SUGGEST_COMMENT
```suggestion
diff --git a/danger/product_intelligence/Dangerfile b/danger/product_intelligence/Dangerfile
index 5fd5b962993..fe77ea5fc52 100644
--- a/danger/product_intelligence/Dangerfile
+++ b/danger/product_intelligence/Dangerfile
@@ -10,15 +10,10 @@ Please check the ~"product intelligence" [guide](https://docs.gitlab.com/ee/deve
MSG
-UPDATE_METRICS_DEFINITIONS_MESSAGE = <<~MSG
- When adding, changing, or updating metrics, please update the [Event dictionary Usage Ping table](https://about.gitlab.com/handbook/product/product-analytics-guide#event-dictionary).
-
-MSG
-
ENGINEERS_GROUP = '@gitlab-org/growth/product-intelligence/engineers'
UPDATE_DICTIONARY_MESSAGE = <<~MSG
- When updating metrics definitions, please update [Metrics Dictionary](https://docs.gitlab.com/ee/development/usage_ping/dictionary.html)
+ When adding, changing, or updating metrics, please update the [Metrics Dictionary](https://docs.gitlab.com/ee/development/usage_ping/dictionary.html)
```shell
bundle exec rake gitlab:usage_data:generate_metrics_dictionary
@@ -42,14 +37,47 @@ tracking_files = [
tracking_changed_files = all_changed_files & tracking_files
usage_data_changed_files = all_changed_files.grep(%r{(usage_data)})
-metrics_changed_files = all_changed_files.grep(%r{((ee/)?config/metrics/.*\.yml)})
dictionary_changed_file = all_changed_files.grep(%r{(doc/development/usage_ping/dictionary.md)})
+metrics_changed_files = all_changed_files.grep(%r{((ee/)?config/metrics/.*\.yml)})
+
+def matching_files?(file, extension:, pattern:)
+ return unless file.end_with?(extension)
+
+ helper.changed_lines(file).grep(pattern).any?
+end
+
+js_patterns = Regexp.union(
+ 'Tracking.event',
+ /\btrack\(/,
+ 'data-track-event'
+)
+
+dictionary_pattern = Regexp.union(
+ 'key_path:',
+ 'description:',
+ 'product_section:',
+ 'product_stage:',
+ 'product_group:',
+ 'status:',
+ 'tier:'
+)
snowplow_changed_files = all_changed_files.select do |file|
- helper.changed_lines(file).grep(%r{Gitlab::Tracking\.event}).any?
+ matching_files?(file, extension: '.rb', pattern: %r{Gitlab::Tracking\.event}) ||
+ matching_files?(file, extension: '.js', pattern: js_patterns) ||
+ matching_files?(file, extension: '.vue', pattern: js_patterns) ||
+ matching_files?(file, extension: '.haml', pattern: %r{data: \{ track})
+end
+
+required_dictionary_update_changed_files = metrics_changed_files.select do |file|
+ matching_files?(file, extension: '.yml', pattern: dictionary_pattern)
end
-matching_changed_files = usage_data_changed_files + tracking_changed_files + metrics_changed_files + dictionary_changed_file + snowplow_changed_files
+matching_changed_files = usage_data_changed_files +
+ tracking_changed_files +
+ metrics_changed_files +
+ dictionary_changed_file +
+ snowplow_changed_files
if matching_changed_files.any?
@@ -60,9 +88,8 @@ if matching_changed_files.any?
end
warn format(CHANGED_FILES_MESSAGE, changed_files: helper.markdown_list(matching_changed_files), engineers_group: mention)
- warn format(UPDATE_METRICS_DEFINITIONS_MESSAGE) if usage_data_changed_files.any?
- fail format(UPDATE_DICTIONARY_MESSAGE) if metrics_changed_files.any? && dictionary_changed_file.empty?
+ fail format(UPDATE_DICTIONARY_MESSAGE) if required_dictionary_update_changed_files.any? && dictionary_changed_file.empty?
labels = ['product intelligence']
labels << 'product intelligence::review pending' unless helper.mr_has_labels?('product intelligence::approved')
diff --git a/db/fixtures/development/26_packages.rb b/db/fixtures/development/26_packages.rb
index 2a7f80c18a3..c09d3f1fef9 100644
--- a/db/fixtures/development/26_packages.rb
+++ b/db/fixtures/development/26_packages.rb
@@ -103,8 +103,10 @@ class Gitlab::Seeder::Packages
name = "MyNugetApp.Package#{i}"
version = "4.2.#{i}"
- pkg = ::Packages::Nuget::CreatePackageService.new(project, project.creator, {}).execute
- # when using ::Packages::Nuget::CreatePackageService, packages have a fixed name and a fixed version.
+ pkg = ::Packages::CreateTemporaryPackageService.new(
+ project, project.creator, {}
+ ).execute(:nuget, name: Packages::Nuget::TEMPORARY_PACKAGE_NAME)
+ # when using ::Packages::CreateTemporaryPackageService, packages have a fixed name and a fixed version.
pkg.update!(name: name, version: version)
filename = 'package.nupkg'
diff --git a/db/fixtures/development/29_instance_statistics.rb b/db/fixtures/development/29_instance_statistics.rb
deleted file mode 100644
index 02afdc61339..00000000000
--- a/db/fixtures/development/29_instance_statistics.rb
+++ /dev/null
@@ -1,39 +0,0 @@
-# frozen_string_literal: true
-
-require './spec/support/sidekiq_middleware'
-
-Gitlab::Seeder.quiet do
- chance_for_decrement = 0.1 # 10% chance that we'll generate smaller count than the previous count
- max_increase = 10000
- max_decrease = 1000
-
- model_class = Analytics::InstanceStatistics::Measurement
-
- measurements = model_class.identifiers.flat_map do |_, id|
- recorded_at = 60.days.ago
- current_count = rand(1_000_000)
-
- # Insert random counts for the last 60 days
- Array.new(60) do
- recorded_at = (recorded_at + 1.day).end_of_day - 5.minutes
-
- # Normally our counts should slowly increase as the gitlab instance grows.
- # Small chance (10%) to have a slight decrease (simulating cleanups, bulk delete)
- if rand < chance_for_decrement
- current_count -= rand(max_decrease)
- else
- current_count += rand(max_increase)
- end
-
- {
- recorded_at: recorded_at,
- count: current_count,
- identifier: id
- }
- end
- end
-
- model_class.upsert_all(measurements, unique_by: [:identifier, :recorded_at])
-
- print '.'
-end
diff --git a/db/fixtures/development/29_usage_trends.rb b/db/fixtures/development/29_usage_trends.rb
new file mode 100644
index 00000000000..f6496e5cd3d
--- /dev/null
+++ b/db/fixtures/development/29_usage_trends.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+require './spec/support/sidekiq_middleware'
+
+Gitlab::Seeder.quiet do
+ chance_for_decrement = 0.1 # 10% chance that we'll generate smaller count than the previous count
+ max_increase = 10000
+ max_decrease = 1000
+
+ model_class = Analytics::UsageTrends::Measurement
+
+ # Skip generating data for billable_users, to avoid license check problems
+ measurements = model_class.identifiers.except(:billable_users).each_value.flat_map do |id|
+ recorded_at = 60.days.ago
+ current_count = rand(1_000_000)
+
+ # Insert random counts for the last 60 days
+ Array.new(60) do
+ recorded_at = (recorded_at + 1.day).end_of_day - 5.minutes
+
+ # Normally our counts should slowly increase as the gitlab instance grows.
+ # Small chance (10%) to have a slight decrease (simulating cleanups, bulk delete)
+ if rand < chance_for_decrement
+ current_count -= rand(max_decrease)
+ else
+ current_count += rand(max_increase)
+ end
+
+ {
+ recorded_at: recorded_at,
+ count: current_count,
+ identifier: id
+ }
+ end
+ end
+
+ model_class.upsert_all(measurements, unique_by: [:identifier, :recorded_at])
+
+ print '.'
+end
diff --git a/db/fixtures/development/30_composer_packages.rb b/db/fixtures/development/30_composer_packages.rb
index fa8c648de9e..a30d838ad8c 100644
--- a/db/fixtures/development/30_composer_packages.rb
+++ b/db/fixtures/development/30_composer_packages.rb
@@ -110,9 +110,11 @@ Gitlab::Seeder.quiet do
next
end
- ::Packages::Composer::CreatePackageService
- .new(project, project.owner, params)
- .execute
+ Sidekiq::Worker.skipping_transaction_check do
+ ::Packages::Composer::CreatePackageService
+ .new(project, project.owner, params)
+ .execute
+ end
puts "version #{version.inspect} created!"
end
diff --git a/db/migrate/20200816133024_add_cve_id_request_project_setting.rb b/db/migrate/20200816133024_add_cve_id_request_project_setting.rb
new file mode 100644
index 00000000000..c4fe86845eb
--- /dev/null
+++ b/db/migrate/20200816133024_add_cve_id_request_project_setting.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class AddCveIdRequestProjectSetting < ActiveRecord::Migration[6.0]
+ DOWNTIME = false
+
+ def up
+ add_column :project_settings, :cve_id_request_enabled, :boolean, default: true, null: false
+ end
+
+ def down
+ remove_column :project_settings, :cve_id_request_enabled
+ end
+end
diff --git a/db/migrate/20201209163113_recreate_index_issue_email_participants_on_issue_id_and_email.rb b/db/migrate/20201209163113_recreate_index_issue_email_participants_on_issue_id_and_email.rb
new file mode 100644
index 00000000000..9cbf68fd63a
--- /dev/null
+++ b/db/migrate/20201209163113_recreate_index_issue_email_participants_on_issue_id_and_email.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+class RecreateIndexIssueEmailParticipantsOnIssueIdAndEmail < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ OLD_INDEX_NAME = 'index_issue_email_participants_on_issue_id_and_email'
+ NEW_INDEX_NAME = 'index_issue_email_participants_on_issue_id_and_lower_email'
+
+ def up
+ # This table is currently empty, so no need to worry about unique index violations
+ add_concurrent_index :issue_email_participants, 'issue_id, lower(email)', unique: true, name: NEW_INDEX_NAME
+ remove_concurrent_index_by_name :issue_email_participants, OLD_INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :issue_email_participants, [:issue_id, :email], unique: true, name: OLD_INDEX_NAME
+ remove_concurrent_index_by_name :issue_email_participants, NEW_INDEX_NAME
+ end
+end
diff --git a/db/migrate/20201228110136_create_iterations_cadence.rb b/db/migrate/20201228110136_create_iterations_cadence.rb
new file mode 100644
index 00000000000..95601ab4b29
--- /dev/null
+++ b/db/migrate/20201228110136_create_iterations_cadence.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+class CreateIterationsCadence < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ create_table_with_constraints :iterations_cadences do |t|
+ t.references :group, null: false, foreign_key: { to_table: :namespaces, on_delete: :cascade }
+ t.timestamps_with_timezone null: false
+ t.date :start_date, null: false
+ t.date :last_run_date
+ t.integer :duration_in_weeks
+ t.integer :iterations_in_advance
+ t.boolean :active, default: true, null: false
+ t.boolean :automatic, default: true, null: false
+ t.text :title, null: false
+
+ t.text_limit :title, 255
+ end
+ end
+
+ def down
+ drop_table :iterations_cadences if table_exists?(:iterations_cadences)
+ end
+end
diff --git a/db/migrate/20201228110238_add_iterations_cadence_to_sprints.rb b/db/migrate/20201228110238_add_iterations_cadence_to_sprints.rb
new file mode 100644
index 00000000000..9d9026a265b
--- /dev/null
+++ b/db/migrate/20201228110238_add_iterations_cadence_to_sprints.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+class AddIterationsCadenceToSprints < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_sprints_iterations_cadence_id'
+
+ def up
+ add_column :sprints, :iterations_cadence_id, :integer unless column_exists?(:sprints, :iterations_cadence_id)
+
+ add_concurrent_index :sprints, :iterations_cadence_id, name: INDEX_NAME
+ add_concurrent_foreign_key :sprints, :iterations_cadences, column: :iterations_cadence_id, on_delete: :cascade
+ end
+
+ def down
+ remove_column :sprints, :iterations_cadence_id if column_exists?(:sprints, :iterations_cadence_id)
+ end
+end
diff --git a/db/migrate/20210106191305_rename_indexes_on_git_lab_com.rb b/db/migrate/20210106191305_rename_indexes_on_git_lab_com.rb
new file mode 100644
index 00000000000..5238192e1d1
--- /dev/null
+++ b/db/migrate/20210106191305_rename_indexes_on_git_lab_com.rb
@@ -0,0 +1,57 @@
+# frozen_string_literal: true
+
+# This migration aligns an existing database schema with what we actually expect
+# and fixes inconsistencies with index names and similar issues.
+#
+# This is intended for GitLab.com, but can be run on any instance.
+class RenameIndexesOnGitLabCom < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ rename_index_if_exists :ldap_group_links, 'ldap_groups_pkey', 'ldap_group_links_pkey'
+
+ # Removes unique constraint, add unique index instead
+ replace_unique_constraint_with_index :emails, :email, 'emails_email_key', 'index_emails_on_email'
+ replace_unique_constraint_with_index :users, :confirmation_token, 'users_confirmation_token_key', 'index_users_on_confirmation_token'
+ replace_unique_constraint_with_index :users, :reset_password_token, 'users_reset_password_token_key', 'index_users_on_reset_password_token'
+ replace_unique_constraint_with_index :users, :email, 'users_email_key', 'index_users_on_email'
+
+ upgrade_to_primary_key(:schema_migrations, :version, 'schema_migrations_version_key', 'schema_migrations_pkey')
+ end
+
+ def down
+ # no-op
+ end
+
+ private
+
+ def replace_unique_constraint_with_index(table, columns, old_name, new_name)
+ return unless index_exists_by_name?(table, old_name)
+
+ add_concurrent_index table, columns, unique: true, name: new_name
+ execute "ALTER TABLE #{quote_table_name(table)} DROP CONSTRAINT #{quote_table_name(old_name)}"
+ end
+
+ def rename_index_if_exists(table, old_name, new_name)
+ return unless index_exists_by_name?(table, old_name)
+ return if index_exists_by_name?(table, new_name)
+
+ with_lock_retries do
+ rename_index table, old_name, new_name
+ end
+ end
+
+ def upgrade_to_primary_key(table, column, old_name, new_name)
+ return unless index_exists_by_name?(table, old_name)
+ return if index_exists_by_name?(table, new_name)
+
+ return if primary_key(table)
+
+ execute "ALTER TABLE #{quote_table_name(table)} ADD CONSTRAINT #{new_name} PRIMARY KEY (#{column})"
+ execute "ALTER TABLE #{quote_table_name(table)} DROP CONSTRAINT #{old_name}"
+ end
+end
diff --git a/db/migrate/20210127152613_add_iterations_cadence_date_range_constraint.rb b/db/migrate/20210127152613_add_iterations_cadence_date_range_constraint.rb
new file mode 100644
index 00000000000..95ecd167076
--- /dev/null
+++ b/db/migrate/20210127152613_add_iterations_cadence_date_range_constraint.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+class AddIterationsCadenceDateRangeConstraint < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ def up
+ with_lock_retries do
+ execute <<~SQL
+ ALTER TABLE sprints
+ ADD CONSTRAINT iteration_start_and_due_date_iterations_cadence_id_constraint
+ EXCLUDE USING gist
+ ( iterations_cadence_id WITH =,
+ daterange(start_date, due_date, '[]') WITH &&
+ )
+ WHERE (group_id IS NOT NULL)
+ SQL
+ end
+ end
+
+ def down
+ with_lock_retries do
+ execute <<~SQL
+ ALTER TABLE sprints
+ DROP CONSTRAINT IF EXISTS iteration_start_and_due_date_iterations_cadence_id_constraint
+ SQL
+ end
+ end
+end
diff --git a/db/migrate/20210127202613_remove_iteration_group_date_range_constraint.rb b/db/migrate/20210127202613_remove_iteration_group_date_range_constraint.rb
new file mode 100644
index 00000000000..e6c5eb1b411
--- /dev/null
+++ b/db/migrate/20210127202613_remove_iteration_group_date_range_constraint.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+class RemoveIterationGroupDateRangeConstraint < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ def up
+ with_lock_retries do
+ execute <<~SQL
+ ALTER TABLE sprints
+ DROP CONSTRAINT IF EXISTS iteration_start_and_due_daterange_group_id_constraint
+ SQL
+ end
+ end
+
+ def down
+ with_lock_retries do
+ execute <<~SQL
+ ALTER TABLE sprints
+ ADD CONSTRAINT iteration_start_and_due_daterange_group_id_constraint
+ EXCLUDE USING gist
+ ( group_id WITH =,
+ daterange(start_date, due_date, '[]') WITH &&
+ )
+ WHERE (group_id IS NOT NULL)
+ SQL
+ end
+ end
+end
diff --git a/db/migrate/20210128172149_create_background_migration_tracking_tables.rb b/db/migrate/20210128172149_create_background_migration_tracking_tables.rb
new file mode 100644
index 00000000000..767bd8737a3
--- /dev/null
+++ b/db/migrate/20210128172149_create_background_migration_tracking_tables.rb
@@ -0,0 +1,59 @@
+# frozen_string_literal: true
+
+class CreateBackgroundMigrationTrackingTables < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ def change
+ create_table_with_constraints :batched_background_migrations do |t|
+ t.timestamps_with_timezone
+ t.bigint :min_value, null: false, default: 1
+ t.bigint :max_value, null: false
+ t.integer :batch_size, null: false
+ t.integer :sub_batch_size, null: false
+ t.integer :interval, limit: 2, null: false
+ t.integer :status, limit: 2, null: false, default: 0
+ t.text :job_class_name, null: false
+ t.text :batch_class_name, null: false,
+ default: 'Gitlab::Database::BackgroundMigration::PrimaryKeyBatchingStrategy'
+ t.text :table_name, null: false
+ t.text :column_name, null: false
+ t.jsonb :job_arguments, null: false, default: '[]'
+
+ t.text_limit :job_class_name, 100
+ t.text_limit :batch_class_name, 100
+ t.text_limit :table_name, 63
+ t.text_limit :column_name, 63
+
+ t.check_constraint :check_positive_min_value, 'min_value > 0'
+ t.check_constraint :check_max_value_in_range, 'max_value >= min_value'
+
+ t.check_constraint :check_positive_sub_batch_size, 'sub_batch_size > 0'
+ t.check_constraint :check_batch_size_in_range, 'batch_size >= sub_batch_size'
+
+ t.index %i[job_class_name table_name column_name], name: :index_batched_migrations_on_job_table_and_column_name
+ end
+
+ create_table :batched_background_migration_jobs do |t|
+ t.timestamps_with_timezone
+ t.datetime_with_timezone :started_at
+ t.datetime_with_timezone :finished_at
+ t.references :batched_background_migration, null: false, index: false, foreign_key: { on_delete: :cascade }
+ t.bigint :min_value, null: false
+ t.bigint :max_value, null: false
+ t.integer :batch_size, null: false
+ t.integer :sub_batch_size, null: false
+ t.integer :status, limit: 2, null: false, default: 0
+ t.integer :attempts, limit: 2, null: false, default: 0
+
+ t.index [:batched_background_migration_id, :id], name: :index_batched_jobs_by_batched_migration_id_and_id
+ end
+ end
+
+ def down
+ drop_table :batched_background_migration_jobs
+
+ drop_table :batched_background_migrations
+ end
+end
diff --git a/db/migrate/20210201034649_add_active_periods_to_on_call_rotations.rb b/db/migrate/20210201034649_add_active_periods_to_on_call_rotations.rb
new file mode 100644
index 00000000000..714187f60e0
--- /dev/null
+++ b/db/migrate/20210201034649_add_active_periods_to_on_call_rotations.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+class AddActivePeriodsToOnCallRotations < ActiveRecord::Migration[6.0]
+ DOWNTIME = false
+
+ def change
+ add_column :incident_management_oncall_rotations, :active_period_start, :time, null: true
+ add_column :incident_management_oncall_rotations, :active_period_end, :time, null: true
+ end
+end
diff --git a/db/migrate/20210205134213_add_creator_id_to_custom_emoji.rb b/db/migrate/20210205134213_add_creator_id_to_custom_emoji.rb
new file mode 100644
index 00000000000..c01335767a8
--- /dev/null
+++ b/db/migrate/20210205134213_add_creator_id_to_custom_emoji.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+class AddCreatorIdToCustomEmoji < ActiveRecord::Migration[6.0]
+ DOWNTIME = false
+
+ def up
+ # Custom Emoji is at the moment behind a default-disabled feature flag. It
+ # will be unlikely there are any records in this table, but to able to
+ # ensure a not-null constraint delete any existing rows.
+ # Roll-out issue: https://gitlab.com/gitlab-org/gitlab/-/issues/231317
+ execute 'DELETE FROM custom_emoji'
+
+ add_reference :custom_emoji, # rubocop:disable Migration/AddReference
+ :creator,
+ index: true,
+ null: false, # rubocop:disable Rails/NotNullColumn
+ foreign_key: false # FK is added in 20210219100137
+ end
+
+ def down
+ remove_reference :custom_emoji, :creator
+ end
+end
diff --git a/db/migrate/20210208103243_add_issue_created_at_to_onboarding_progress.rb b/db/migrate/20210208103243_add_issue_created_at_to_onboarding_progress.rb
new file mode 100644
index 00000000000..e8318ecd929
--- /dev/null
+++ b/db/migrate/20210208103243_add_issue_created_at_to_onboarding_progress.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class AddIssueCreatedAtToOnboardingProgress < ActiveRecord::Migration[6.0]
+ DOWNTIME = false
+
+ def change
+ add_column :onboarding_progresses, :issue_created_at, :datetime_with_timezone
+ end
+end
diff --git a/db/migrate/20210208200914_add_ends_at_to_oncall_rotations.rb b/db/migrate/20210208200914_add_ends_at_to_oncall_rotations.rb
new file mode 100644
index 00000000000..5cd179c9a80
--- /dev/null
+++ b/db/migrate/20210208200914_add_ends_at_to_oncall_rotations.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class AddEndsAtToOncallRotations < ActiveRecord::Migration[6.0]
+ DOWNTIME = false
+
+ def change
+ add_column :incident_management_oncall_rotations, :ends_at, :datetime_with_timezone
+ end
+end
diff --git a/db/migrate/20210209110019_create_external_approval_rules.rb b/db/migrate/20210209110019_create_external_approval_rules.rb
new file mode 100644
index 00000000000..5d6780ec412
--- /dev/null
+++ b/db/migrate/20210209110019_create_external_approval_rules.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+class CreateExternalApprovalRules < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+ disable_ddl_transaction!
+
+ DOWNTIME = false
+
+ def up
+ create_table_with_constraints :external_approval_rules, if_not_exists: true do |t|
+ t.references :project, foreign_key: { on_delete: :cascade }, null: false, index: false
+ t.timestamps_with_timezone
+ t.text :external_url, null: false
+ t.text_limit :external_url, 255
+ t.text :name, null: false
+ t.text_limit :name, 255
+
+ t.index([:project_id, :name],
+ unique: true,
+ name: 'idx_on_external_approval_rules_project_id_name')
+ t.index([:project_id, :external_url],
+ unique: true,
+ name: 'idx_on_external_approval_rules_project_id_external_url')
+ end
+
+ create_table :external_approval_rules_protected_branches do |t|
+ t.bigint :external_approval_rule_id, null: false, index: { name: 'idx_eaprpb_external_approval_rule_id' }
+ t.bigint :protected_branch_id, null: false
+ t.index([:protected_branch_id, :external_approval_rule_id],
+ unique: true,
+ name: 'idx_protected_branch_id_external_approval_rule_id')
+ end
+ end
+
+ def down
+ with_lock_retries do
+ drop_table :external_approval_rules_protected_branches, force: :cascade, if_exists: true
+ end
+
+ with_lock_retries do
+ drop_table :external_approval_rules, force: :cascade, if_exists: true
+ end
+ end
+end
diff --git a/db/migrate/20210209232508_add_markdown_surround_selection_to_user_preferences.rb b/db/migrate/20210209232508_add_markdown_surround_selection_to_user_preferences.rb
new file mode 100644
index 00000000000..c4063a55d18
--- /dev/null
+++ b/db/migrate/20210209232508_add_markdown_surround_selection_to_user_preferences.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+class AddMarkdownSurroundSelectionToUserPreferences < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ with_lock_retries do
+ add_column :user_preferences, :markdown_surround_selection, :boolean, default: true, null: false
+ end
+ end
+
+ def down
+ with_lock_retries do
+ remove_column :user_preferences, :markdown_surround_selection, :boolean
+ end
+ end
+end
diff --git a/db/migrate/20210212153934_make_the_geo_oauth_application_trusted_by_default.rb b/db/migrate/20210212153934_make_the_geo_oauth_application_trusted_by_default.rb
new file mode 100644
index 00000000000..ab0343887e4
--- /dev/null
+++ b/db/migrate/20210212153934_make_the_geo_oauth_application_trusted_by_default.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class MakeTheGeoOauthApplicationTrustedByDefault < ActiveRecord::Migration[6.0]
+ DOWNTIME = false
+
+ def up
+ execute(<<-SQL.squish)
+ UPDATE oauth_applications
+ SET confidential = true, trusted = true
+ WHERE id IN (SELECT oauth_application_id FROM geo_nodes);
+ SQL
+ end
+
+ def down
+ # We won't be able to tell which trusted applications weren't
+ # confidential before the migration and setting all trusted
+ # applications are not confidential would introduce security
+ # issues.
+ end
+end
diff --git a/db/migrate/20210212163231_add_merge_when_pipeline_succeeds_to_notification_settings.rb b/db/migrate/20210212163231_add_merge_when_pipeline_succeeds_to_notification_settings.rb
new file mode 100644
index 00000000000..08d0a99436e
--- /dev/null
+++ b/db/migrate/20210212163231_add_merge_when_pipeline_succeeds_to_notification_settings.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+# See https://docs.gitlab.com/ee/development/migration_style_guide.html
+# for more information on how to write migrations for GitLab.
+
+class AddMergeWhenPipelineSucceedsToNotificationSettings < ActiveRecord::Migration[6.0]
+ DOWNTIME = false
+
+ def change
+ add_column :notification_settings, :merge_when_pipeline_succeeds, :boolean, default: false, null: false
+ end
+end
diff --git a/db/migrate/20210214201118_add_delayed_project_removal_to_namespace_settings.rb b/db/migrate/20210214201118_add_delayed_project_removal_to_namespace_settings.rb
new file mode 100644
index 00000000000..1c6e0b0c27c
--- /dev/null
+++ b/db/migrate/20210214201118_add_delayed_project_removal_to_namespace_settings.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class AddDelayedProjectRemovalToNamespaceSettings < ActiveRecord::Migration[6.0]
+ DOWNTIME = false
+
+ def change
+ add_column :namespace_settings, :delayed_project_removal, :boolean, default: false, null: false
+ end
+end
diff --git a/db/migrate/20210214205155_add_index_to_namespaces_delayed_project_removal.rb b/db/migrate/20210214205155_add_index_to_namespaces_delayed_project_removal.rb
new file mode 100644
index 00000000000..8d09a5c9269
--- /dev/null
+++ b/db/migrate/20210214205155_add_index_to_namespaces_delayed_project_removal.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class AddIndexToNamespacesDelayedProjectRemoval < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+ INDEX_NAME = 'tmp_idx_on_namespaces_delayed_project_removal'
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index :namespaces, :id, name: INDEX_NAME, where: 'delayed_project_removal = TRUE'
+ end
+
+ def down
+ remove_concurrent_index_by_name :namespaces, INDEX_NAME
+ end
+end
diff --git a/db/migrate/20210216122140_add_in_product_marketing_emails_enabled_setting.rb b/db/migrate/20210216122140_add_in_product_marketing_emails_enabled_setting.rb
new file mode 100644
index 00000000000..5813b1b5f33
--- /dev/null
+++ b/db/migrate/20210216122140_add_in_product_marketing_emails_enabled_setting.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class AddInProductMarketingEmailsEnabledSetting < ActiveRecord::Migration[6.0]
+ DOWNTIME = false
+
+ def change
+ add_column :application_settings, :in_product_marketing_emails_enabled, :boolean, null: false, default: true
+ end
+end
diff --git a/db/migrate/20210216193620_add_description_to_cluster_token.rb b/db/migrate/20210216193620_add_description_to_cluster_token.rb
new file mode 100644
index 00000000000..67f7c6bd522
--- /dev/null
+++ b/db/migrate/20210216193620_add_description_to_cluster_token.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+class AddDescriptionToClusterToken < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ unless column_exists?(:cluster_agent_tokens, :description)
+ add_column :cluster_agent_tokens, :description, :text
+ end
+
+ add_text_limit :cluster_agent_tokens, :description, 1024
+ end
+
+ def down
+ remove_column :cluster_agent_tokens, :description
+ end
+end
diff --git a/db/migrate/20210216223335_remove_index_on_issues_where_service_desk_reply_to_is_not_null.rb b/db/migrate/20210216223335_remove_index_on_issues_where_service_desk_reply_to_is_not_null.rb
new file mode 100644
index 00000000000..5224b6f7031
--- /dev/null
+++ b/db/migrate/20210216223335_remove_index_on_issues_where_service_desk_reply_to_is_not_null.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+class RemoveIndexOnIssuesWhereServiceDeskReplyToIsNotNull < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ INDEX_TABLE = :issues
+ INDEX_NAME = 'idx_on_issues_where_service_desk_reply_to_is_not_null'
+
+ def up
+ Gitlab::BackgroundMigration.steal('PopulateIssueEmailParticipants')
+ remove_concurrent_index_by_name INDEX_TABLE, INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index(INDEX_TABLE, [:id], name: INDEX_NAME, where: 'service_desk_reply_to IS NOT NULL')
+ end
+end
diff --git a/db/migrate/20210217101901_create_epic_list_user_preferences.rb b/db/migrate/20210217101901_create_epic_list_user_preferences.rb
new file mode 100644
index 00000000000..5aacea1938d
--- /dev/null
+++ b/db/migrate/20210217101901_create_epic_list_user_preferences.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class CreateEpicListUserPreferences < ActiveRecord::Migration[6.0]
+ DOWNTIME = false
+
+ def up
+ create_table :boards_epic_list_user_preferences do |t|
+ t.bigint :user_id, null: false
+ t.bigint :epic_list_id, index: true, null: false
+ t.timestamps_with_timezone null: false
+ t.boolean :collapsed, null: false, default: false
+ end
+
+ add_index :boards_epic_list_user_preferences, [:user_id, :epic_list_id], unique: true, name: 'index_epic_board_list_preferences_on_user_and_list'
+ end
+
+ def down
+ drop_table :boards_epic_list_user_preferences
+ end
+end
diff --git a/db/migrate/20210218040814_add_environment_scope_to_group_variables.rb b/db/migrate/20210218040814_add_environment_scope_to_group_variables.rb
new file mode 100644
index 00000000000..5cc41f570aa
--- /dev/null
+++ b/db/migrate/20210218040814_add_environment_scope_to_group_variables.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+class AddEnvironmentScopeToGroupVariables < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+ OLD_INDEX = 'index_ci_group_variables_on_group_id_and_key'
+ NEW_INDEX = 'index_ci_group_variables_on_group_id_and_key_and_environment'
+
+ disable_ddl_transaction!
+
+ def up
+ unless column_exists?(:ci_group_variables, :environment_scope)
+ # rubocop:disable Migration/AddLimitToTextColumns
+ # Added in 20210305013509_add_text_limit_to_group_ci_variables_environment_scope
+ add_column :ci_group_variables, :environment_scope, :text, null: false, default: '*'
+ # rubocop:enable Migration/AddLimitToTextColumns
+ end
+
+ add_concurrent_index :ci_group_variables, [:group_id, :key, :environment_scope], unique: true, name: NEW_INDEX
+ remove_concurrent_index_by_name :ci_group_variables, OLD_INDEX
+ end
+
+ def down
+ remove_duplicates!
+
+ add_concurrent_index :ci_group_variables, [:group_id, :key], unique: true, name: OLD_INDEX
+ remove_concurrent_index_by_name :ci_group_variables, NEW_INDEX
+
+ remove_column :ci_group_variables, :environment_scope
+ end
+
+ private
+
+ def remove_duplicates!
+ execute <<-SQL
+ DELETE FROM ci_group_variables
+ WHERE id NOT IN (
+ SELECT MIN(id)
+ FROM ci_group_variables
+ GROUP BY group_id, key
+ )
+ SQL
+ end
+end
diff --git a/db/migrate/20210218142626_change_finding_fingerprint_enum.rb b/db/migrate/20210218142626_change_finding_fingerprint_enum.rb
new file mode 100644
index 00000000000..615509e0c04
--- /dev/null
+++ b/db/migrate/20210218142626_change_finding_fingerprint_enum.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class ChangeFindingFingerprintEnum < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ def up
+ change_column :vulnerability_finding_fingerprints, :algorithm_type, :integer, limit: 2
+ end
+
+ def down
+ change_column :vulnerability_finding_fingerprints, :algorithm_type, :integer
+ end
+end
diff --git a/db/migrate/20210218144056_add_sprints_start_date_not_null_check_constraint.rb b/db/migrate/20210218144056_add_sprints_start_date_not_null_check_constraint.rb
new file mode 100644
index 00000000000..243080f49b2
--- /dev/null
+++ b/db/migrate/20210218144056_add_sprints_start_date_not_null_check_constraint.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class AddSprintsStartDateNotNullCheckConstraint < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ add_not_null_constraint(:sprints, :start_date, validate: false)
+ end
+
+ def down
+ remove_not_null_constraint(:sprints, :start_date)
+ end
+end
diff --git a/db/migrate/20210218144656_add_sprints_due_date_not_null_check_constraint.rb b/db/migrate/20210218144656_add_sprints_due_date_not_null_check_constraint.rb
new file mode 100644
index 00000000000..9f3ed6fd13a
--- /dev/null
+++ b/db/migrate/20210218144656_add_sprints_due_date_not_null_check_constraint.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class AddSprintsDueDateNotNullCheckConstraint < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ add_not_null_constraint(:sprints, :due_date, validate: false)
+ end
+
+ def down
+ remove_not_null_constraint(:sprints, :due_date)
+ end
+end
diff --git a/db/migrate/20210219100137_add_creator_foreign_key_to_custom_emoji.rb b/db/migrate/20210219100137_add_creator_foreign_key_to_custom_emoji.rb
new file mode 100644
index 00000000000..a954ba5ba3b
--- /dev/null
+++ b/db/migrate/20210219100137_add_creator_foreign_key_to_custom_emoji.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+class AddCreatorForeignKeyToCustomEmoji < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+ FK_NAME = 'fk_custom_emoji_creator_id'
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :custom_emoji, :users,
+ on_delete: :cascade,
+ column: :creator_id,
+ name: FK_NAME
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key :custom_emoji, name: FK_NAME
+ end
+ end
+end
diff --git a/db/migrate/20210219111040_add_epic_issue_composite_index.rb b/db/migrate/20210219111040_add_epic_issue_composite_index.rb
new file mode 100644
index 00000000000..f1344baf0c7
--- /dev/null
+++ b/db/migrate/20210219111040_add_epic_issue_composite_index.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class AddEpicIssueCompositeIndex < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+ INDEX_NAME = 'index_epic_issues_on_epic_id_and_issue_id'
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index :epic_issues, [:epic_id, :issue_id], name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :epic_issues, INDEX_NAME
+ end
+end
diff --git a/db/migrate/20210222030537_add_is_removed_to_oncall_participant.rb b/db/migrate/20210222030537_add_is_removed_to_oncall_participant.rb
new file mode 100644
index 00000000000..83b81a067ab
--- /dev/null
+++ b/db/migrate/20210222030537_add_is_removed_to_oncall_participant.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class AddIsRemovedToOncallParticipant < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ def up
+ with_lock_retries do
+ add_column :incident_management_oncall_participants, :is_removed, :boolean, default: false, null: false
+ end
+ end
+
+ def down
+ with_lock_retries do
+ remove_column :incident_management_oncall_participants, :is_removed
+ end
+ end
+end
diff --git a/db/migrate/20210222042745_add_is_removed_index_to_oncall_participant.rb b/db/migrate/20210222042745_add_is_removed_index_to_oncall_participant.rb
new file mode 100644
index 00000000000..cfa9b1b89c9
--- /dev/null
+++ b/db/migrate/20210222042745_add_is_removed_index_to_oncall_participant.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+class AddIsRemovedIndexToOncallParticipant < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ disable_ddl_transaction!
+
+ DOWNTIME = false
+ EXISTING_INDEX_NAME = 'index_inc_mgmnt_oncall_participants_on_oncall_rotation_id'
+ NEW_INDEX_NAME = 'index_inc_mgmnt_oncall_pcpnt_on_oncall_rotation_id_is_removed'
+
+ def up
+ add_concurrent_index :incident_management_oncall_participants, [:oncall_rotation_id, :is_removed], name: NEW_INDEX_NAME
+ remove_concurrent_index_by_name(:incident_management_oncall_participants, EXISTING_INDEX_NAME)
+ end
+
+ def down
+ add_concurrent_index :incident_management_oncall_participants, :oncall_rotation_id, name: EXISTING_INDEX_NAME
+ remove_concurrent_index_by_name(:incident_management_oncall_participants, NEW_INDEX_NAME)
+ end
+end
diff --git a/db/migrate/20210222070356_add_storage_size_to_namespace_statistics.rb b/db/migrate/20210222070356_add_storage_size_to_namespace_statistics.rb
new file mode 100644
index 00000000000..838c22382c6
--- /dev/null
+++ b/db/migrate/20210222070356_add_storage_size_to_namespace_statistics.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class AddStorageSizeToNamespaceStatistics < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ def up
+ with_lock_retries do
+ add_column :namespace_statistics, :storage_size, :bigint, default: 0, null: false
+ end
+ end
+
+ def down
+ with_lock_retries do
+ remove_column :namespace_statistics, :storage_size
+ end
+ end
+end
diff --git a/db/migrate/20210222070413_add_wiki_size_to_namespace_statistics.rb b/db/migrate/20210222070413_add_wiki_size_to_namespace_statistics.rb
new file mode 100644
index 00000000000..9e6ced9fd64
--- /dev/null
+++ b/db/migrate/20210222070413_add_wiki_size_to_namespace_statistics.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class AddWikiSizeToNamespaceStatistics < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ def up
+ with_lock_retries do
+ add_column :namespace_statistics, :wiki_size, :bigint, default: 0, null: false
+ end
+ end
+
+ def down
+ with_lock_retries do
+ remove_column :namespace_statistics, :wiki_size
+ end
+ end
+end
diff --git a/db/migrate/20210222085529_add_epic_board_user_preference_user_fk.rb b/db/migrate/20210222085529_add_epic_board_user_preference_user_fk.rb
new file mode 100644
index 00000000000..52de892a177
--- /dev/null
+++ b/db/migrate/20210222085529_add_epic_board_user_preference_user_fk.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class AddEpicBoardUserPreferenceUserFk < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :boards_epic_list_user_preferences, :users, column: :user_id, on_delete: :cascade
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key_if_exists :boards_epic_list_user_preferences, :users
+ end
+ end
+end
diff --git a/db/migrate/20210222085551_add_epic_board_user_preference_epic_list_fk.rb b/db/migrate/20210222085551_add_epic_board_user_preference_epic_list_fk.rb
new file mode 100644
index 00000000000..3f62036b899
--- /dev/null
+++ b/db/migrate/20210222085551_add_epic_board_user_preference_epic_list_fk.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class AddEpicBoardUserPreferenceEpicListFk < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :boards_epic_list_user_preferences, :boards_epic_lists, column: :epic_list_id, on_delete: :cascade
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key_if_exists :boards_epic_list_user_preferences, :boards_epic_lists
+ end
+ end
+end
diff --git a/db/migrate/20210222105120_add_container_registry_access_level.rb b/db/migrate/20210222105120_add_container_registry_access_level.rb
new file mode 100644
index 00000000000..2324866b0ef
--- /dev/null
+++ b/db/migrate/20210222105120_add_container_registry_access_level.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+class AddContainerRegistryAccessLevel < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ def up
+ with_lock_retries do
+ add_column(
+ :project_features,
+ :container_registry_access_level,
+ :integer,
+ default: 0, # ProjectFeature::DISABLED value
+ null: false
+ )
+ end
+ end
+
+ def down
+ with_lock_retries do
+ remove_column :project_features, :container_registry_access_level
+ end
+ end
+end
diff --git a/db/migrate/20210223053451_add_branch_name_to_dast_profile.rb b/db/migrate/20210223053451_add_branch_name_to_dast_profile.rb
new file mode 100644
index 00000000000..311e809103f
--- /dev/null
+++ b/db/migrate/20210223053451_add_branch_name_to_dast_profile.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+class AddBranchNameToDastProfile < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ with_lock_retries do
+ add_column :dast_profiles, :branch_name, :text
+ end
+
+ add_text_limit :dast_profiles, :branch_name, 255
+ end
+
+ def down
+ with_lock_retries do
+ remove_column :dast_profiles, :branch_name
+ end
+ end
+end
diff --git a/db/migrate/20210223132934_add_foreign_key_to_external_approval_rules.rb b/db/migrate/20210223132934_add_foreign_key_to_external_approval_rules.rb
new file mode 100644
index 00000000000..b5f04672813
--- /dev/null
+++ b/db/migrate/20210223132934_add_foreign_key_to_external_approval_rules.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class AddForeignKeyToExternalApprovalRules < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :external_approval_rules_protected_branches, :external_approval_rules, column: :external_approval_rule_id, on_delete: :cascade
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key :external_approval_rules_protected_branches, column: :external_approval_rule_id
+ end
+ end
+end
diff --git a/db/migrate/20210223133116_add_foreign_key_to_external_approval_rules_protected_branches.rb b/db/migrate/20210223133116_add_foreign_key_to_external_approval_rules_protected_branches.rb
new file mode 100644
index 00000000000..ad51f765d8a
--- /dev/null
+++ b/db/migrate/20210223133116_add_foreign_key_to_external_approval_rules_protected_branches.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class AddForeignKeyToExternalApprovalRulesProtectedBranches < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :external_approval_rules_protected_branches, :protected_branches, column: :protected_branch_id, on_delete: :cascade
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key :external_approval_rules_protected_branches, column: :protected_branch_id
+ end
+ end
+end
diff --git a/db/migrate/20210224132547_add_null_constraint_to_terraform_state_name.rb b/db/migrate/20210224132547_add_null_constraint_to_terraform_state_name.rb
new file mode 100644
index 00000000000..d9f23311cf5
--- /dev/null
+++ b/db/migrate/20210224132547_add_null_constraint_to_terraform_state_name.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class AddNullConstraintToTerraformStateName < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ def change
+ change_column_null :terraform_states, :name, false
+ end
+end
diff --git a/db/migrate/20210224133337_add_name_field_to_cluster_agent_token.rb b/db/migrate/20210224133337_add_name_field_to_cluster_agent_token.rb
new file mode 100644
index 00000000000..2cec37f8477
--- /dev/null
+++ b/db/migrate/20210224133337_add_name_field_to_cluster_agent_token.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+class AddNameFieldToClusterAgentToken < ActiveRecord::Migration[6.0]
+ DOWNTIME = false
+
+ # rubocop:disable Migration/AddLimitToTextColumns
+ # limit is added in LimitClusterTokenSize
+ def change
+ add_column :cluster_agent_tokens, :name, :text
+ end
+ # rubocop:enable Migration/AddLimitToTextColumns
+end
diff --git a/db/migrate/20210225090801_create_dora_daily_metrics.rb b/db/migrate/20210225090801_create_dora_daily_metrics.rb
new file mode 100644
index 00000000000..65c1dbc23e4
--- /dev/null
+++ b/db/migrate/20210225090801_create_dora_daily_metrics.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+class CreateDoraDailyMetrics < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ with_lock_retries do
+ create_table :dora_daily_metrics, if_not_exists: true do |t|
+ t.references :environment, null: false, foreign_key: { on_delete: :cascade }, index: false
+ t.date :date, null: false
+ t.integer :deployment_frequency
+ t.integer :lead_time_for_changes_in_seconds
+
+ t.index [:environment_id, :date], unique: true
+ end
+ end
+
+ add_check_constraint :dora_daily_metrics, "deployment_frequency >= 0", 'dora_daily_metrics_deployment_frequency_positive'
+ add_check_constraint :dora_daily_metrics, "lead_time_for_changes_in_seconds >= 0", 'dora_daily_metrics_lead_time_for_changes_in_seconds_positive'
+ end
+
+ def down
+ with_lock_retries do
+ drop_table :dora_daily_metrics
+ end
+ end
+end
diff --git a/db/migrate/20210225135533_limit_cluster_token_size.rb b/db/migrate/20210225135533_limit_cluster_token_size.rb
new file mode 100644
index 00000000000..6a1b6b7b4e8
--- /dev/null
+++ b/db/migrate/20210225135533_limit_cluster_token_size.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class LimitClusterTokenSize < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ add_text_limit :cluster_agent_tokens, :name, 255
+ end
+
+ def down
+ remove_text_limit :cluster_agent_tokens, :name
+ end
+end
diff --git a/db/migrate/20210225153522_add_allow_force_push_to_protected_branches.rb b/db/migrate/20210225153522_add_allow_force_push_to_protected_branches.rb
new file mode 100644
index 00000000000..92a15cb45dd
--- /dev/null
+++ b/db/migrate/20210225153522_add_allow_force_push_to_protected_branches.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class AddAllowForcePushToProtectedBranches < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ def up
+ with_lock_retries do
+ add_column :protected_branches, :allow_force_push, :boolean, default: false, null: false
+ end
+ end
+
+ def down
+ with_lock_retries do
+ remove_column :protected_branches, :allow_force_push
+ end
+ end
+end
diff --git a/db/migrate/20210301150451_add_tier_to_environments.rb b/db/migrate/20210301150451_add_tier_to_environments.rb
new file mode 100644
index 00000000000..28592dd2bf6
--- /dev/null
+++ b/db/migrate/20210301150451_add_tier_to_environments.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class AddTierToEnvironments < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ def up
+ with_lock_retries do
+ add_column :environments, :tier, :smallint
+ end
+ end
+
+ def down
+ with_lock_retries do
+ remove_column :environments, :tier
+ end
+ end
+end
diff --git a/db/migrate/20210301200601_rename_asset_proxy_allowlist_on_application_settings.rb b/db/migrate/20210301200601_rename_asset_proxy_allowlist_on_application_settings.rb
index 8a9acd8b86e..8ac334fc6a4 100644
--- a/db/migrate/20210301200601_rename_asset_proxy_allowlist_on_application_settings.rb
+++ b/db/migrate/20210301200601_rename_asset_proxy_allowlist_on_application_settings.rb
@@ -8,6 +8,10 @@ class RenameAssetProxyAllowlistOnApplicationSettings < ActiveRecord::Migration[6
disable_ddl_transaction!
def up
+ cleanup_concurrent_column_rename :application_settings,
+ :asset_proxy_whitelist,
+ :asset_proxy_allowlist
+
rename_column_concurrently :application_settings,
:asset_proxy_allowlist,
:asset_proxy_whitelist
@@ -17,5 +21,9 @@ class RenameAssetProxyAllowlistOnApplicationSettings < ActiveRecord::Migration[6
undo_rename_column_concurrently :application_settings,
:asset_proxy_allowlist,
:asset_proxy_whitelist
+
+ undo_cleanup_concurrent_column_rename :application_settings,
+ :asset_proxy_whitelist,
+ :asset_proxy_allowlist
end
end
diff --git a/db/migrate/20210302103851_add_deployed_deployment_id_index_to_project_pages_metadata.rb b/db/migrate/20210302103851_add_deployed_deployment_id_index_to_project_pages_metadata.rb
new file mode 100644
index 00000000000..e10e9a912cc
--- /dev/null
+++ b/db/migrate/20210302103851_add_deployed_deployment_id_index_to_project_pages_metadata.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class AddDeployedDeploymentIdIndexToProjectPagesMetadata < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_on_pages_metadata_not_migrated'
+
+ def up
+ add_concurrent_index :project_pages_metadata, :project_id, where: "deployed = TRUE AND pages_deployment_id is NULL", name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :project_pages_metadata, INDEX_NAME
+ end
+end
diff --git a/db/migrate/20210302155904_remove_index_for_security_orchestration_policy.rb b/db/migrate/20210302155904_remove_index_for_security_orchestration_policy.rb
new file mode 100644
index 00000000000..5d2594f2b9e
--- /dev/null
+++ b/db/migrate/20210302155904_remove_index_for_security_orchestration_policy.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class RemoveIndexForSecurityOrchestrationPolicy < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+ INDEX_NAME = 'index_sop_configs_on_security_policy_management_project_id'
+
+ disable_ddl_transaction!
+
+ def up
+ remove_concurrent_index_by_name(:security_orchestration_policy_configurations, INDEX_NAME)
+ end
+
+ def down
+ add_concurrent_index(:security_orchestration_policy_configurations, :security_policy_management_project_id, name: INDEX_NAME)
+ end
+end
diff --git a/db/migrate/20210302160544_add_index_to_security_orchestration_policy.rb b/db/migrate/20210302160544_add_index_to_security_orchestration_policy.rb
new file mode 100644
index 00000000000..4750e2bdb79
--- /dev/null
+++ b/db/migrate/20210302160544_add_index_to_security_orchestration_policy.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class AddIndexToSecurityOrchestrationPolicy < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+ INDEX = 'index_sop_configurations_project_id_policy_project_id'
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index :security_orchestration_policy_configurations, [:security_policy_management_project_id, :project_id], name: INDEX
+ end
+
+ def down
+ remove_concurrent_index_by_name :security_orchestration_policy_configurations, INDEX
+ end
+end
diff --git a/db/migrate/20210302212623_rename_vuln_fingerprints_indexes.rb b/db/migrate/20210302212623_rename_vuln_fingerprints_indexes.rb
new file mode 100644
index 00000000000..0f431fbeda5
--- /dev/null
+++ b/db/migrate/20210302212623_rename_vuln_fingerprints_indexes.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+class RenameVulnFingerprintsIndexes < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ FINGERPRINT_IDX = :idx_vuln_fingerprints_on_occurrences_id_and_fingerprint
+ FINGERPRINT_IDX_RENAMED = :idx_vuln_fingerprints_on_occurrences_id_and_fingerprint_sha256
+ UNIQ_IDX = :idx_vuln_fingerprints_uniqueness
+ UNIQ_IDX_RENAMED = :idx_vuln_fingerprints_uniqueness_fingerprint_sha256
+
+ disable_ddl_transaction!
+
+ def up
+ # These `unless` checks are necessary for re-running the migrations multiple times
+ unless index_exists_by_name?(:vulnerability_finding_fingerprints, FINGERPRINT_IDX_RENAMED)
+ rename_index :vulnerability_finding_fingerprints, FINGERPRINT_IDX, FINGERPRINT_IDX_RENAMED
+ end
+
+ unless index_exists_by_name?(:vulnerability_finding_fingerprints, UNIQ_IDX_RENAMED)
+ rename_index :vulnerability_finding_fingerprints, UNIQ_IDX, UNIQ_IDX_RENAMED
+ end
+ end
+
+ def down
+ unless index_exists_by_name?(:vulnerability_finding_fingerprints, FINGERPRINT_IDX)
+ rename_index :vulnerability_finding_fingerprints, FINGERPRINT_IDX_RENAMED, FINGERPRINT_IDX
+ end
+
+ unless index_exists_by_name?(:vulnerability_finding_fingerprints, UNIQ_IDX)
+ rename_index :vulnerability_finding_fingerprints, UNIQ_IDX_RENAMED, UNIQ_IDX
+ end
+ end
+end
diff --git a/db/migrate/20210303053341_add_last_edited_at_and_last_edited_by_id_to_notes.rb b/db/migrate/20210303053341_add_last_edited_at_and_last_edited_by_id_to_notes.rb
new file mode 100644
index 00000000000..b6f4da202fa
--- /dev/null
+++ b/db/migrate/20210303053341_add_last_edited_at_and_last_edited_by_id_to_notes.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class AddLastEditedAtAndLastEditedByIdToNotes < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ def up
+ with_lock_retries do
+ add_column :notes, :last_edited_at, :datetime_with_timezone
+ end
+ end
+
+ def down
+ with_lock_retries do
+ remove_column :notes, :last_edited_at
+ end
+ end
+end
diff --git a/db/migrate/20210303091651_add_index_to_environments_tier.rb b/db/migrate/20210303091651_add_index_to_environments_tier.rb
new file mode 100644
index 00000000000..0ec876945d9
--- /dev/null
+++ b/db/migrate/20210303091651_add_index_to_environments_tier.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class AddIndexToEnvironmentsTier < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_environments_on_project_id_and_tier'
+
+ DOWNTIME = false
+
+ def up
+ add_concurrent_index :environments, [:project_id, :tier], where: 'tier IS NOT NULL', name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index :environments, :state, name: INDEX_NAME
+ end
+end
diff --git a/db/migrate/20210303165201_add_index_for_succeeded_deployments.rb b/db/migrate/20210303165201_add_index_for_succeeded_deployments.rb
new file mode 100644
index 00000000000..1ae5b36d2f2
--- /dev/null
+++ b/db/migrate/20210303165201_add_index_for_succeeded_deployments.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class AddIndexForSucceededDeployments < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+ INDEX_NAME = 'index_deployments_on_environment_id_status_and_finished_at'
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index(:deployments, %i[environment_id status finished_at], name: INDEX_NAME)
+ end
+
+ def down
+ remove_concurrent_index_by_name(:deployments, INDEX_NAME)
+ end
+end
diff --git a/db/migrate/20210303165301_add_not_null_constraint_to_cluster_token_name.rb b/db/migrate/20210303165301_add_not_null_constraint_to_cluster_token_name.rb
new file mode 100644
index 00000000000..5fc8970b8f9
--- /dev/null
+++ b/db/migrate/20210303165301_add_not_null_constraint_to_cluster_token_name.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class AddNotNullConstraintToClusterTokenName < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ # This will add the `NOT NULL` constraint WITHOUT validating it
+ add_not_null_constraint :cluster_agent_tokens, :name, validate: false
+ end
+
+ def down
+ remove_not_null_constraint :cluster_agent_tokens, :name
+ end
+end
diff --git a/db/migrate/20210305002016_update_terraform_states_locked_by_user_id_foreign_key.rb b/db/migrate/20210305002016_update_terraform_states_locked_by_user_id_foreign_key.rb
new file mode 100644
index 00000000000..aa4a4e9c928
--- /dev/null
+++ b/db/migrate/20210305002016_update_terraform_states_locked_by_user_id_foreign_key.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+class UpdateTerraformStatesLockedByUserIdForeignKey < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+ OLD_FOREIGN_KEY = 'fk_rails_558901b030'
+ NEW_FOREIGN_KEY = 'fk_558901b030'
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :terraform_states, :users,
+ column: :locked_by_user_id, on_delete: :nullify, name: NEW_FOREIGN_KEY
+
+ with_lock_retries do
+ remove_foreign_key :terraform_states, :users, name: OLD_FOREIGN_KEY
+ end
+ end
+
+ def down
+ add_concurrent_foreign_key :terraform_states, :users,
+ column: :locked_by_user_id, on_delete: nil, name: OLD_FOREIGN_KEY
+
+ with_lock_retries do
+ remove_foreign_key :terraform_states, :users, name: NEW_FOREIGN_KEY
+ end
+ end
+end
diff --git a/db/migrate/20210305013509_add_text_limit_to_group_ci_variables_environment_scope.rb b/db/migrate/20210305013509_add_text_limit_to_group_ci_variables_environment_scope.rb
new file mode 100644
index 00000000000..f5fa073b954
--- /dev/null
+++ b/db/migrate/20210305013509_add_text_limit_to_group_ci_variables_environment_scope.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class AddTextLimitToGroupCiVariablesEnvironmentScope < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ add_text_limit :ci_group_variables, :environment_scope, 255
+ end
+
+ def down
+ remove_text_limit :ci_group_variables, :environment_scope
+ end
+end
diff --git a/db/migrate/20210306121300_partition_web_hook_logs.rb b/db/migrate/20210306121300_partition_web_hook_logs.rb
new file mode 100644
index 00000000000..ff35a19648e
--- /dev/null
+++ b/db/migrate/20210306121300_partition_web_hook_logs.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class PartitionWebHookLogs < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+ include Gitlab::Database::PartitioningMigrationHelpers
+
+ # Set this constant to true if this migration requires downtime.
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ partition_table_by_date :web_hook_logs, :created_at
+ end
+
+ def down
+ drop_partitioned_table_for :web_hook_logs
+ end
+end
diff --git a/db/migrate/20210308125742_add_info_column_into_security_scans_table.rb b/db/migrate/20210308125742_add_info_column_into_security_scans_table.rb
new file mode 100644
index 00000000000..d701fa98259
--- /dev/null
+++ b/db/migrate/20210308125742_add_info_column_into_security_scans_table.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class AddInfoColumnIntoSecurityScansTable < ActiveRecord::Migration[6.0]
+ DOWNTIME = false
+
+ def change
+ add_column :security_scans, :info, :jsonb, null: false, default: {}
+ end
+end
diff --git a/db/migrate/20210308190413_change_batched_background_migrations_batch_class_name_default.rb b/db/migrate/20210308190413_change_batched_background_migrations_batch_class_name_default.rb
new file mode 100644
index 00000000000..f841c1e9bd5
--- /dev/null
+++ b/db/migrate/20210308190413_change_batched_background_migrations_batch_class_name_default.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+class ChangeBatchedBackgroundMigrationsBatchClassNameDefault < ActiveRecord::Migration[6.0]
+ DOWNTIME = false
+
+ def change
+ change_column_default :batched_background_migrations, :batch_class_name,
+ from: 'Gitlab::Database::BackgroundMigration::PrimaryKeyBatchingStrategy', to: 'PrimaryKeyBatchingStrategy'
+ end
+end
diff --git a/db/migrate/20210309181019_add_last_used_at_to_cluster_agent_token.rb b/db/migrate/20210309181019_add_last_used_at_to_cluster_agent_token.rb
new file mode 100644
index 00000000000..2a29ab374e5
--- /dev/null
+++ b/db/migrate/20210309181019_add_last_used_at_to_cluster_agent_token.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class AddLastUsedAtToClusterAgentToken < ActiveRecord::Migration[6.0]
+ DOWNTIME = false
+
+ def change
+ add_column :cluster_agent_tokens, :last_used_at, :datetime_with_timezone
+ end
+end
diff --git a/db/post_migrate/20190402224749_schedule_merge_request_assignees_migration_progress_check.rb b/db/post_migrate/20190402224749_schedule_merge_request_assignees_migration_progress_check.rb
deleted file mode 100644
index 8ec6a4a24ec..00000000000
--- a/db/post_migrate/20190402224749_schedule_merge_request_assignees_migration_progress_check.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class ScheduleMergeRequestAssigneesMigrationProgressCheck < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- MIGRATION = 'MergeRequestAssigneesMigrationProgressCheck'
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- BackgroundMigrationWorker.perform_async(MIGRATION)
- end
-
- def down
- end
-end
diff --git a/db/post_migrate/20201112130715_schedule_recalculate_uuid_on_vulnerabilities_occurrences.rb b/db/post_migrate/20201112130715_schedule_recalculate_uuid_on_vulnerabilities_occurrences.rb
new file mode 100644
index 00000000000..7bb97a39bda
--- /dev/null
+++ b/db/post_migrate/20201112130715_schedule_recalculate_uuid_on_vulnerabilities_occurrences.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+class ScheduleRecalculateUuidOnVulnerabilitiesOccurrences < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ MIGRATION = 'RecalculateVulnerabilitiesOccurrencesUuid'
+ DELAY_INTERVAL = 2.minutes.to_i
+ BATCH_SIZE = 2_500
+
+ disable_ddl_transaction!
+
+ class VulnerabilitiesFinding < ActiveRecord::Base
+ include ::EachBatch
+
+ self.table_name = "vulnerability_occurrences"
+ end
+
+ def up
+ # Make sure that RemoveDuplicateVulnerabilitiesFindings has finished running
+ # so that we don't run into duplicate UUID issues
+ Gitlab::BackgroundMigration.steal('RemoveDuplicateVulnerabilitiesFindings')
+
+ say "Scheduling #{MIGRATION} jobs"
+ queue_background_migration_jobs_by_range_at_intervals(
+ VulnerabilitiesFinding,
+ MIGRATION,
+ DELAY_INTERVAL,
+ batch_size: BATCH_SIZE
+ )
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20201231133921_schedule_set_default_iteration_cadences.rb b/db/post_migrate/20201231133921_schedule_set_default_iteration_cadences.rb
new file mode 100644
index 00000000000..32645430e19
--- /dev/null
+++ b/db/post_migrate/20201231133921_schedule_set_default_iteration_cadences.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+class ScheduleSetDefaultIterationCadences < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+ BATCH_SIZE = 1_000
+ DELAY_INTERVAL = 2.minutes.to_i
+ MIGRATION_CLASS = 'SetDefaultIterationCadences'
+
+ class Iteration < ActiveRecord::Base # rubocop:disable Style/Documentation
+ include EachBatch
+
+ self.table_name = 'sprints'
+ end
+
+ disable_ddl_transaction!
+
+ def up
+ # Do nothing, rescheduling migration: 20210219102900_reschedule_set_default_iteration_cadences.rb
+ end
+
+ def down
+ # Not needed
+ end
+end
diff --git a/db/post_migrate/20210105052229_clean_up_asset_proxy_whitelist_rename_on_application_settings.rb b/db/post_migrate/20210105052229_clean_up_asset_proxy_whitelist_rename_on_application_settings.rb
index 8f6d312ae5e..87f391e240d 100644
--- a/db/post_migrate/20210105052229_clean_up_asset_proxy_whitelist_rename_on_application_settings.rb
+++ b/db/post_migrate/20210105052229_clean_up_asset_proxy_whitelist_rename_on_application_settings.rb
@@ -8,14 +8,12 @@ class CleanUpAssetProxyWhitelistRenameOnApplicationSettings < ActiveRecord::Migr
disable_ddl_transaction!
def up
- cleanup_concurrent_column_rename :application_settings,
- :asset_proxy_whitelist,
- :asset_proxy_allowlist
+ # This migration has been made a no-op in https://gitlab.com/gitlab-org/gitlab/-/merge_requests/56352
+ # because to revert the rename in https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55419 we need
+ # to cleanup the triggers on the `asset_proxy_allowlist` column. As such, this migration would do nothing.
end
def down
- undo_cleanup_concurrent_column_rename :application_settings,
- :asset_proxy_whitelist,
- :asset_proxy_allowlist
+ # no-op
end
end
diff --git a/db/post_migrate/20210111075105_schedule_uuid_population_for_security_findings.rb b/db/post_migrate/20210111075105_schedule_uuid_population_for_security_findings.rb
index 92241378495..43cfb27b94c 100644
--- a/db/post_migrate/20210111075105_schedule_uuid_population_for_security_findings.rb
+++ b/db/post_migrate/20210111075105_schedule_uuid_population_for_security_findings.rb
@@ -11,13 +11,7 @@ class ScheduleUuidPopulationForSecurityFindings < ActiveRecord::Migration[6.0]
disable_ddl_transaction!
def up
- Gitlab::BackgroundMigration::PopulateUuidsForSecurityFindings.security_findings.each_batch(column: :scan_id, of: BATCH_SIZE) do |batch, index|
- migrate_in(
- DELAY_INTERVAL * index,
- MIGRATION_CLASS,
- batch.pluck(:scan_id)
- )
- end
+ # no-op, replaced by 20210111075206_schedule_uuid_population_for_security_findings2.rb
end
def down
diff --git a/db/post_migrate/20210111075206_schedule_uuid_population_for_security_findings2.rb b/db/post_migrate/20210111075206_schedule_uuid_population_for_security_findings2.rb
new file mode 100644
index 00000000000..00569581ca4
--- /dev/null
+++ b/db/post_migrate/20210111075206_schedule_uuid_population_for_security_findings2.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+# This replaces the previous post-deployment migration 20210111075105_schedule_uuid_population_for_security_findings.rb,
+# we have to run this again due to a bug in how we were receiving the arguments in the background migration.
+class ScheduleUuidPopulationForSecurityFindings2 < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+ MIGRATION_CLASS = 'PopulateUuidsForSecurityFindings'
+ DELAY_INTERVAL = 2.minutes
+ BATCH_SIZE = 25
+
+ disable_ddl_transaction!
+
+ def up
+ ::Gitlab::BackgroundMigration.steal(MIGRATION_CLASS) do |job|
+ job.delete
+
+ false
+ end
+
+ Gitlab::BackgroundMigration::PopulateUuidsForSecurityFindings.security_findings.each_batch(column: :scan_id, of: BATCH_SIZE) do |batch, index|
+ migrate_in(
+ DELAY_INTERVAL * index,
+ MIGRATION_CLASS,
+ batch.pluck(:scan_id)
+ )
+ end
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20210210093901_backfill_updated_at_after_repository_storage_move.rb b/db/post_migrate/20210210093901_backfill_updated_at_after_repository_storage_move.rb
index 0631cc8095e..efd0eeb9d47 100644
--- a/db/post_migrate/20210210093901_backfill_updated_at_after_repository_storage_move.rb
+++ b/db/post_migrate/20210210093901_backfill_updated_at_after_repository_storage_move.rb
@@ -10,16 +10,16 @@ class BackfillUpdatedAtAfterRepositoryStorageMove < ActiveRecord::Migration[6.0]
disable_ddl_transaction!
- class ProjectRepositoryStorageMove < ActiveRecord::Base
+ class RepositoryStorageMove < ActiveRecord::Base
include EachBatch
self.table_name = 'project_repository_storage_moves'
end
def up
- ProjectRepositoryStorageMove.reset_column_information
+ RepositoryStorageMove.reset_column_information
- ProjectRepositoryStorageMove.select(:project_id).distinct.each_batch(of: BATCH_SIZE, column: :project_id) do |batch, index|
+ RepositoryStorageMove.select(:project_id).distinct.each_batch(of: BATCH_SIZE, column: :project_id) do |batch, index|
migrate_in(
INTERVAL * index,
MIGRATION_CLASS,
diff --git a/db/post_migrate/20210210221006_cleanup_projects_with_bad_has_external_issue_tracker_data.rb b/db/post_migrate/20210210221006_cleanup_projects_with_bad_has_external_issue_tracker_data.rb
new file mode 100644
index 00000000000..4b8bf014066
--- /dev/null
+++ b/db/post_migrate/20210210221006_cleanup_projects_with_bad_has_external_issue_tracker_data.rb
@@ -0,0 +1,84 @@
+# frozen_string_literal: true
+
+class CleanupProjectsWithBadHasExternalIssueTrackerData < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+ TMP_INDEX_NAME = 'tmp_idx_projects_on_id_where_has_external_issue_tracker_is_true'.freeze
+ BATCH_SIZE = 100
+
+ disable_ddl_transaction!
+
+ class Service < ActiveRecord::Base
+ include EachBatch
+ belongs_to :project
+
+ self.table_name = 'services'
+ self.inheritance_column = :_type_disabled
+ end
+
+ class Project < ActiveRecord::Base
+ include EachBatch
+
+ self.table_name = 'projects'
+ end
+
+ def up
+ update_projects_with_active_external_issue_trackers
+ update_projects_without_active_external_issue_trackers
+ end
+
+ def down
+ # no-op : can't go back to incorrect data
+ end
+
+ private
+
+ def update_projects_with_active_external_issue_trackers
+ scope = Service.where(active: true, category: 'issue_tracker').where.not(project_id: nil).distinct(:project_id)
+
+ scope.each_batch(of: BATCH_SIZE) do |relation|
+ scope_with_projects = relation
+ .joins(:project)
+ .select('project_id')
+ .merge(Project.where(has_external_issue_tracker: false).where(pending_delete: false))
+
+ execute(<<~SQL)
+ WITH project_ids_to_update (id) AS (
+ #{scope_with_projects.to_sql}
+ )
+ UPDATE projects SET has_external_issue_tracker = true WHERE id IN (SELECT id FROM project_ids_to_update)
+ SQL
+ end
+ end
+
+ def update_projects_without_active_external_issue_trackers
+ # Add a temporary index to speed up the scoping of projects.
+ index_where = <<~SQL
+ "projects"."has_external_issue_tracker" = TRUE
+ AND "projects"."pending_delete" = FALSE
+ SQL
+
+ add_concurrent_index(:projects, :id, where: index_where, name: TMP_INDEX_NAME)
+
+ services_sub_query = Service
+ .select('1')
+ .where('services.project_id = projects.id')
+ .where(category: 'issue_tracker')
+ .where(active: true)
+
+ # 322 projects are scoped in this query on GitLab.com.
+ Project.where(index_where).each_batch(of: BATCH_SIZE) do |relation|
+ relation_with_exists_query = relation.where('NOT EXISTS (?)', services_sub_query)
+ execute(<<~SQL)
+ WITH project_ids_to_update (id) AS (
+ #{relation_with_exists_query.select(:id).to_sql}
+ )
+ UPDATE projects SET has_external_issue_tracker = false WHERE id IN (SELECT id FROM project_ids_to_update)
+ SQL
+ end
+
+ # Drop the temporary index.
+ remove_concurrent_index_by_name(:projects, TMP_INDEX_NAME)
+ end
+end
diff --git a/db/post_migrate/20210215095328_migrate_delayed_project_removal_from_namespaces_to_namespace_settings.rb b/db/post_migrate/20210215095328_migrate_delayed_project_removal_from_namespaces_to_namespace_settings.rb
new file mode 100644
index 00000000000..12e156d3b8a
--- /dev/null
+++ b/db/post_migrate/20210215095328_migrate_delayed_project_removal_from_namespaces_to_namespace_settings.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+class MigrateDelayedProjectRemovalFromNamespacesToNamespaceSettings < ActiveRecord::Migration[6.0]
+ DOWNTIME = false
+
+ class Namespace < ActiveRecord::Base
+ self.table_name = 'namespaces'
+
+ include ::EachBatch
+ end
+
+ def up
+ Namespace.select(:id).where(delayed_project_removal: true).each_batch do |batch|
+ values = batch.map { |record| "(#{record.id}, TRUE, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)" }
+
+ execute <<-EOF.strip_heredoc
+ INSERT INTO namespace_settings (namespace_id, delayed_project_removal, created_at, updated_at)
+ VALUES #{values.join(', ')}
+ ON CONFLICT (namespace_id) DO UPDATE
+ SET delayed_project_removal = TRUE
+ EOF
+ end
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20210215144909_migrate_usage_trends_sidekiq_queue.rb b/db/post_migrate/20210215144909_migrate_usage_trends_sidekiq_queue.rb
new file mode 100644
index 00000000000..3e6eabfba97
--- /dev/null
+++ b/db/post_migrate/20210215144909_migrate_usage_trends_sidekiq_queue.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class MigrateUsageTrendsSidekiqQueue < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ sidekiq_queue_migrate 'cronjob:analytics_instance_statistics_count_job_trigger', to: 'cronjob:analytics_usage_trends_count_job_trigger'
+ sidekiq_queue_migrate 'analytics_instance_statistics_counter_job', to: 'analytics_usage_trends_counter_job'
+ end
+
+ def down
+ sidekiq_queue_migrate 'cronjob:analytics_usage_trends_count_job_trigger', to: 'cronjob:analytics_instance_statistics_count_job_trigger'
+ sidekiq_queue_migrate 'analytics_usage_trends_counter_job', to: 'analytics_instance_statistics_counter_job'
+ end
+end
diff --git a/db/post_migrate/20210217100728_move_create_release_evidence_queue_out_of_cronjob_namespace.rb b/db/post_migrate/20210217100728_move_create_release_evidence_queue_out_of_cronjob_namespace.rb
new file mode 100644
index 00000000000..22bead87dc1
--- /dev/null
+++ b/db/post_migrate/20210217100728_move_create_release_evidence_queue_out_of_cronjob_namespace.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class MoveCreateReleaseEvidenceQueueOutOfCronjobNamespace < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ # Set this constant to true if this migration requires downtime.
+ DOWNTIME = false
+
+ def up
+ sidekiq_queue_migrate 'cronjob:releases_create_evidence', to: 'releases_create_evidence'
+ end
+
+ def down
+ sidekiq_queue_migrate 'releases_create_evidence', to: 'cronjob:releases_create_evidence'
+ end
+end
diff --git a/db/post_migrate/20210218105431_remove_deprecated_ci_builds_columns.rb b/db/post_migrate/20210218105431_remove_deprecated_ci_builds_columns.rb
new file mode 100644
index 00000000000..6fa7a15a90d
--- /dev/null
+++ b/db/post_migrate/20210218105431_remove_deprecated_ci_builds_columns.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+class RemoveDeprecatedCiBuildsColumns < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ # Set this constant to true if this migration requires downtime.
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ with_lock_retries do
+ remove_column :ci_builds, :artifacts_file
+ remove_column :ci_builds, :artifacts_file_store
+ remove_column :ci_builds, :artifacts_metadata
+ remove_column :ci_builds, :artifacts_metadata_store
+ remove_column :ci_builds, :artifacts_size
+ remove_column :ci_builds, :commands
+ end
+ end
+
+ def down
+ # rubocop:disable Migration/AddColumnsToWideTables
+ with_lock_retries do
+ add_column :ci_builds, :artifacts_file, :text
+ add_column :ci_builds, :artifacts_file_store, :integer
+ add_column :ci_builds, :artifacts_metadata, :text
+ add_column :ci_builds, :artifacts_metadata_store, :integer
+ add_column :ci_builds, :artifacts_size, :bigint
+ add_column :ci_builds, :commands, :text
+ end
+ # rubocop:enable Migration/AddColumnsToWideTables
+
+ add_concurrent_index :ci_builds, :artifacts_expire_at, where: "artifacts_file <> ''::text", name: 'index_ci_builds_on_artifacts_expire_at'
+ end
+end
diff --git a/db/post_migrate/20210218110552_remove_deprecated_ci_runner_column.rb b/db/post_migrate/20210218110552_remove_deprecated_ci_runner_column.rb
new file mode 100644
index 00000000000..06fd900590b
--- /dev/null
+++ b/db/post_migrate/20210218110552_remove_deprecated_ci_runner_column.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+class RemoveDeprecatedCiRunnerColumn < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ # Set this constant to true if this migration requires downtime.
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ with_lock_retries do
+ remove_column :ci_runners, :is_shared
+ end
+ end
+
+ def down
+ add_column :ci_runners, :is_shared, :boolean, default: false unless column_exists?(:ci_runners, :is_shared)
+
+ add_concurrent_index :ci_runners, :is_shared
+ end
+end
diff --git a/db/post_migrate/20210219102900_reschedule_set_default_iteration_cadences.rb b/db/post_migrate/20210219102900_reschedule_set_default_iteration_cadences.rb
new file mode 100644
index 00000000000..6c7b46737aa
--- /dev/null
+++ b/db/post_migrate/20210219102900_reschedule_set_default_iteration_cadences.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+class RescheduleSetDefaultIterationCadences < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+ BATCH_SIZE = 1_000
+ DELAY_INTERVAL = 2.minutes.to_i
+ MIGRATION_CLASS = 'SetDefaultIterationCadences'
+
+ class Iteration < ActiveRecord::Base # rubocop:disable Style/Documentation
+ include EachBatch
+
+ self.table_name = 'sprints'
+ end
+
+ disable_ddl_transaction!
+
+ def up
+ Iteration.select(:group_id).distinct.each_batch(of: BATCH_SIZE, column: :group_id) do |batch, index|
+ group_ids = batch.pluck(:group_id)
+
+ migrate_in(index * DELAY_INTERVAL, MIGRATION_CLASS, group_ids)
+ end
+ end
+
+ def down
+ # Not needed
+ end
+end
diff --git a/db/post_migrate/20210222185538_remove_backup_labels_foreign_keys.rb b/db/post_migrate/20210222185538_remove_backup_labels_foreign_keys.rb
new file mode 100644
index 00000000000..614ec4875d6
--- /dev/null
+++ b/db/post_migrate/20210222185538_remove_backup_labels_foreign_keys.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+class RemoveBackupLabelsForeignKeys < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ with_lock_retries do
+ remove_foreign_key_if_exists(:backup_labels, :projects)
+ remove_foreign_key_if_exists(:backup_labels, :namespaces)
+ end
+ end
+
+ def down
+ add_concurrent_foreign_key(:backup_labels, :projects, column: :project_id, on_delete: :cascade)
+ add_concurrent_foreign_key(:backup_labels, :namespaces, column: :group_id, on_delete: :cascade)
+ end
+end
diff --git a/db/post_migrate/20210222192144_remove_backup_labels_table.rb b/db/post_migrate/20210222192144_remove_backup_labels_table.rb
new file mode 100644
index 00000000000..1208c3c970f
--- /dev/null
+++ b/db/post_migrate/20210222192144_remove_backup_labels_table.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+class RemoveBackupLabelsTable < ActiveRecord::Migration[6.0]
+ DOWNTIME = false
+
+ def up
+ drop_table :backup_labels
+ end
+
+ def down
+ create_table :backup_labels, id: false do |t|
+ t.integer :id, null: false
+ t.string :title
+ t.string :color
+ t.integer :project_id
+ t.timestamps null: true # rubocop:disable Migration/Timestamps
+ t.boolean :template, default: false
+ t.string :description
+ t.text :description_html
+ t.string :type
+ t.integer :group_id
+ t.integer :cached_markdown_version
+ t.integer :restore_action
+ t.string :new_title
+ end
+
+ execute 'ALTER TABLE backup_labels ADD PRIMARY KEY (id)'
+
+ add_index :backup_labels, [:group_id, :project_id, :title], name: 'backup_labels_group_id_project_id_title_idx', unique: true
+ add_index :backup_labels, [:group_id, :title], where: 'project_id = NULL::integer', name: 'backup_labels_group_id_title_idx'
+ add_index :backup_labels, :project_id, name: 'backup_labels_project_id_idx'
+ add_index :backup_labels, :template, name: 'backup_labels_template_idx', where: 'template'
+ add_index :backup_labels, :title, name: 'backup_labels_title_idx'
+ add_index :backup_labels, [:type, :project_id], name: 'backup_labels_type_project_id_idx'
+ end
+end
diff --git a/db/post_migrate/20210224150506_reschedule_artifact_expiry_backfill.rb b/db/post_migrate/20210224150506_reschedule_artifact_expiry_backfill.rb
new file mode 100644
index 00000000000..af5c474e2ba
--- /dev/null
+++ b/db/post_migrate/20210224150506_reschedule_artifact_expiry_backfill.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+class RescheduleArtifactExpiryBackfill < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+ MIGRATION = 'BackfillArtifactExpiryDate'.freeze
+ SWITCH_DATE = Date.new(2020, 06, 22).freeze
+
+ disable_ddl_transaction!
+
+ class JobArtifact < ActiveRecord::Base
+ include EachBatch
+
+ self.inheritance_column = :_type_disabled
+ self.table_name = 'ci_job_artifacts'
+
+ scope :without_expiry_date, -> { where(expire_at: nil) }
+ scope :before_switch, -> { where("date(created_at AT TIME ZONE 'UTC') < ?::date", SWITCH_DATE) }
+ end
+
+ def up
+ Gitlab::BackgroundMigration.steal(MIGRATION) do |job|
+ job.delete
+
+ false
+ end
+
+ queue_background_migration_jobs_by_range_at_intervals(
+ JobArtifact.without_expiry_date.before_switch,
+ MIGRATION,
+ 2.minutes,
+ batch_size: 200_000
+ )
+ end
+
+ def down
+ Gitlab::BackgroundMigration.steal(MIGRATION) do |job|
+ job.delete
+
+ false
+ end
+ end
+end
diff --git a/db/post_migrate/20210302074524_backfill_namespace_statistics_with_wiki_size.rb b/db/post_migrate/20210302074524_backfill_namespace_statistics_with_wiki_size.rb
new file mode 100644
index 00000000000..e04f69f4206
--- /dev/null
+++ b/db/post_migrate/20210302074524_backfill_namespace_statistics_with_wiki_size.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+class BackfillNamespaceStatisticsWithWikiSize < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+ DELAY_INTERVAL = 2.minutes.to_i
+ BATCH_SIZE = 500
+ MIGRATION = 'PopulateNamespaceStatistics'
+
+ disable_ddl_transaction!
+
+ def up
+ return unless Gitlab.ee?
+
+ groups = exec_query <<~SQL
+ SELECT group_wiki_repositories.group_id
+ FROM group_wiki_repositories
+ SQL
+
+ groups.rows.flatten.in_groups_of(BATCH_SIZE, false).each_with_index do |group_ids, index|
+ migrate_in(index * DELAY_INTERVAL, MIGRATION, [group_ids, [:wiki_size]])
+ end
+ end
+
+ def down
+ # No-op
+ end
+end
diff --git a/db/post_migrate/20210303064112_add_not_null_constraints_to_gitlab_subscriptions_namespace_id.rb b/db/post_migrate/20210303064112_add_not_null_constraints_to_gitlab_subscriptions_namespace_id.rb
new file mode 100644
index 00000000000..f1d2d80a0f3
--- /dev/null
+++ b/db/post_migrate/20210303064112_add_not_null_constraints_to_gitlab_subscriptions_namespace_id.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class AddNotNullConstraintsToGitlabSubscriptionsNamespaceId < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ # This will add the `NOT NULL` constraint WITHOUT validating it
+ add_not_null_constraint :gitlab_subscriptions, :namespace_id, validate: false
+ end
+
+ def down
+ # Down is required as `add_not_null_constraint` is not reversible
+ remove_not_null_constraint :gitlab_subscriptions, :namespace_id
+ end
+end
diff --git a/db/post_migrate/20210303064142_cleanup_gitlab_subscriptions_with_null_namespace_id.rb b/db/post_migrate/20210303064142_cleanup_gitlab_subscriptions_with_null_namespace_id.rb
new file mode 100644
index 00000000000..1fcfb3d43c0
--- /dev/null
+++ b/db/post_migrate/20210303064142_cleanup_gitlab_subscriptions_with_null_namespace_id.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+class CleanupGitlabSubscriptionsWithNullNamespaceId < ActiveRecord::Migration[6.0]
+ disable_ddl_transaction!
+
+ class GitlabSubscription < ActiveRecord::Base
+ self.table_name = 'gitlab_subscriptions'
+ end
+
+ def up
+ # As of today, there is 0 records whose namespace_id is null on GitLab.com.
+ # And we expect no such records on non GitLab.com instance.
+ # So this post-migration cleanup script is just for extra safe.
+ #
+ # This will be fast on GitLab.com, because:
+ # - gitlab_subscriptions.count=5021850
+ # - namespace_id is indexed, so the query is pretty fast. Try on database-lab, this uses 5.931 ms
+ GitlabSubscription.where('namespace_id IS NULL').delete_all
+ end
+
+ def down
+ # no-op : can't go back to `NULL` without first dropping the `NOT NULL` constraint
+ end
+end
diff --git a/db/post_migrate/20210303165302_cleanup_cluster_tokens_with_null_name.rb b/db/post_migrate/20210303165302_cleanup_cluster_tokens_with_null_name.rb
new file mode 100644
index 00000000000..80ea1748eed
--- /dev/null
+++ b/db/post_migrate/20210303165302_cleanup_cluster_tokens_with_null_name.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+class CleanupClusterTokensWithNullName < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ BATCH_SIZE = 1000
+
+ disable_ddl_transaction!
+
+ class AgentToken < ActiveRecord::Base
+ include EachBatch
+
+ self.table_name = 'cluster_agent_tokens'
+ end
+
+ def up
+ AgentToken.each_batch(of: BATCH_SIZE) do |relation|
+ relation.where('name IS NULL').update_all("name = 'agent-token-' || id")
+ end
+ end
+
+ def down
+ # no-op : can't go back to `NULL` without first dropping the `NOT NULL` constraint
+ end
+end
diff --git a/db/post_migrate/20210304133508_schedule_remove_duplicate_vulnerabilities_findings2.rb b/db/post_migrate/20210304133508_schedule_remove_duplicate_vulnerabilities_findings2.rb
new file mode 100644
index 00000000000..78574921fea
--- /dev/null
+++ b/db/post_migrate/20210304133508_schedule_remove_duplicate_vulnerabilities_findings2.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+class ScheduleRemoveDuplicateVulnerabilitiesFindings2 < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ MIGRATION = 'RemoveDuplicateVulnerabilitiesFindings'
+ DELAY_INTERVAL = 2.minutes.to_i
+ BATCH_SIZE = 5_000
+
+ disable_ddl_transaction!
+
+ class VulnerabilitiesFinding < ActiveRecord::Base
+ include ::EachBatch
+ self.table_name = "vulnerability_occurrences"
+ end
+
+ def up
+ say "Scheduling #{MIGRATION} jobs"
+ queue_background_migration_jobs_by_range_at_intervals(
+ VulnerabilitiesFinding,
+ MIGRATION,
+ DELAY_INTERVAL,
+ batch_size: BATCH_SIZE
+ )
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20210306121310_backfill_partitioned_web_hook_logs.rb b/db/post_migrate/20210306121310_backfill_partitioned_web_hook_logs.rb
new file mode 100644
index 00000000000..3a37d8a8510
--- /dev/null
+++ b/db/post_migrate/20210306121310_backfill_partitioned_web_hook_logs.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class BackfillPartitionedWebHookLogs < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::PartitioningMigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ enqueue_partitioning_data_migration :web_hook_logs
+ end
+
+ def down
+ cleanup_partitioning_data_migration :web_hook_logs
+ end
+end
diff --git a/db/schema_migrations/20190402224749 b/db/schema_migrations/20190402224749
deleted file mode 100644
index 3d02e4435c5..00000000000
--- a/db/schema_migrations/20190402224749
+++ /dev/null
@@ -1 +0,0 @@
-f655a3f9f1f41710ae501c3e4ef0893791c28971d87e12f87d4b65131502b812 \ No newline at end of file
diff --git a/db/schema_migrations/20200816133024 b/db/schema_migrations/20200816133024
new file mode 100644
index 00000000000..1637f166857
--- /dev/null
+++ b/db/schema_migrations/20200816133024
@@ -0,0 +1 @@
+37196d54d03791f7509e411d5c545f22aa70f7c07d1f13d76f70008a06e72b57 \ No newline at end of file
diff --git a/db/schema_migrations/20201112130715 b/db/schema_migrations/20201112130715
new file mode 100644
index 00000000000..b241214e15e
--- /dev/null
+++ b/db/schema_migrations/20201112130715
@@ -0,0 +1 @@
+fc821ffb2e2298bfdf3555bb255e2300f3722141cadc8f89e62646fd6f22faf0 \ No newline at end of file
diff --git a/db/schema_migrations/20201209163113 b/db/schema_migrations/20201209163113
new file mode 100644
index 00000000000..a850a8d90a2
--- /dev/null
+++ b/db/schema_migrations/20201209163113
@@ -0,0 +1 @@
+a7397b8f5d00b85f8c963f04ae062393b21313d97c9b9875a88a76608b98f826 \ No newline at end of file
diff --git a/db/schema_migrations/20201228110136 b/db/schema_migrations/20201228110136
new file mode 100644
index 00000000000..51496856ff9
--- /dev/null
+++ b/db/schema_migrations/20201228110136
@@ -0,0 +1 @@
+6488e3542276042f302d79533e3e84c43a4ef471535137bcef11e73a0e4d961f \ No newline at end of file
diff --git a/db/schema_migrations/20201228110238 b/db/schema_migrations/20201228110238
new file mode 100644
index 00000000000..300b53bacee
--- /dev/null
+++ b/db/schema_migrations/20201228110238
@@ -0,0 +1 @@
+7be98c4f62df9fd837f7a547916dd5481c0b4da2d4fc6680b104b2a998be1eed \ No newline at end of file
diff --git a/db/schema_migrations/20201231133921 b/db/schema_migrations/20201231133921
new file mode 100644
index 00000000000..40f792eac8f
--- /dev/null
+++ b/db/schema_migrations/20201231133921
@@ -0,0 +1 @@
+26bf4abb73a53f71fbcb8b5cd1ae1e1539ec59e7052b3bbed95ab1de3fda3de7 \ No newline at end of file
diff --git a/db/schema_migrations/20210106191305 b/db/schema_migrations/20210106191305
new file mode 100644
index 00000000000..5fd79e227e6
--- /dev/null
+++ b/db/schema_migrations/20210106191305
@@ -0,0 +1 @@
+938977d6379e484a53857304c339a024c32d8b71c2175574a72314e461d67e3b \ No newline at end of file
diff --git a/db/schema_migrations/20210111075206 b/db/schema_migrations/20210111075206
new file mode 100644
index 00000000000..369c5316124
--- /dev/null
+++ b/db/schema_migrations/20210111075206
@@ -0,0 +1 @@
+9da5955d9f71d671a41e6d03f76f87370d6e67b6853707adb164f7ffa8c75082 \ No newline at end of file
diff --git a/db/schema_migrations/20210127152613 b/db/schema_migrations/20210127152613
new file mode 100644
index 00000000000..f5d42ea2bc5
--- /dev/null
+++ b/db/schema_migrations/20210127152613
@@ -0,0 +1 @@
+32f636ffad4d2c6a002129d6e3eaeaf5d8f420dcc1273665129dc4d23f2e0dbe \ No newline at end of file
diff --git a/db/schema_migrations/20210127202613 b/db/schema_migrations/20210127202613
new file mode 100644
index 00000000000..42d38d4c1d7
--- /dev/null
+++ b/db/schema_migrations/20210127202613
@@ -0,0 +1 @@
+951f46f88c1b07505e0b560e802a8bd701db7d379342d97b0bff3ad90e81fb02 \ No newline at end of file
diff --git a/db/schema_migrations/20210128172149 b/db/schema_migrations/20210128172149
new file mode 100644
index 00000000000..cc0e050be3e
--- /dev/null
+++ b/db/schema_migrations/20210128172149
@@ -0,0 +1 @@
+1cf1305ad5eaaef51f99f057b8a2e81731d69a6d02629c0c9a7d94dfdecbea47 \ No newline at end of file
diff --git a/db/schema_migrations/20210201034649 b/db/schema_migrations/20210201034649
new file mode 100644
index 00000000000..5cc99ebc893
--- /dev/null
+++ b/db/schema_migrations/20210201034649
@@ -0,0 +1 @@
+e5492820a8618d5599429ece04ea941e869c84c22d213d536644bcefc5775363 \ No newline at end of file
diff --git a/db/schema_migrations/20210205134213 b/db/schema_migrations/20210205134213
new file mode 100644
index 00000000000..bc2525e85cd
--- /dev/null
+++ b/db/schema_migrations/20210205134213
@@ -0,0 +1 @@
+7c368cad497ccfd86c6a92e2edfec1d2a16879eb749184b1d20c5ab4c702b974 \ No newline at end of file
diff --git a/db/schema_migrations/20210208103243 b/db/schema_migrations/20210208103243
new file mode 100644
index 00000000000..c251beb4b2f
--- /dev/null
+++ b/db/schema_migrations/20210208103243
@@ -0,0 +1 @@
+039962e291f9adde52379cac8f8278aa1b339d973fb33ae40ea7d8dc3e113fb6 \ No newline at end of file
diff --git a/db/schema_migrations/20210208200914 b/db/schema_migrations/20210208200914
new file mode 100644
index 00000000000..10a98a3d6e2
--- /dev/null
+++ b/db/schema_migrations/20210208200914
@@ -0,0 +1 @@
+e7a0121e8e21acd356daa882d8fe83242f4db180915dd0f3c25835c6c664ce0b \ No newline at end of file
diff --git a/db/schema_migrations/20210209110019 b/db/schema_migrations/20210209110019
new file mode 100644
index 00000000000..d11e6e5a167
--- /dev/null
+++ b/db/schema_migrations/20210209110019
@@ -0,0 +1 @@
+a24354264df3c12411af040903d26faf298f06a7334ef118f87b3e88b683b326 \ No newline at end of file
diff --git a/db/schema_migrations/20210209232508 b/db/schema_migrations/20210209232508
new file mode 100644
index 00000000000..d424fff0469
--- /dev/null
+++ b/db/schema_migrations/20210209232508
@@ -0,0 +1 @@
+484751de711e873e0f0f22d5951e36bf60d4826ebc95afa45e4f6cdaa0e3c024 \ No newline at end of file
diff --git a/db/schema_migrations/20210210221006 b/db/schema_migrations/20210210221006
new file mode 100644
index 00000000000..5292b5c0dce
--- /dev/null
+++ b/db/schema_migrations/20210210221006
@@ -0,0 +1 @@
+1ff1256d2deac0a1545ef7db30d8ba7969265d6c2df62f6bd20f9f1721a482cb \ No newline at end of file
diff --git a/db/schema_migrations/20210212153934 b/db/schema_migrations/20210212153934
new file mode 100644
index 00000000000..28ef55d012c
--- /dev/null
+++ b/db/schema_migrations/20210212153934
@@ -0,0 +1 @@
+233a976aab340f16ed1c896963580fb66f4c9b4dee6a34f9536a62a4f7688792 \ No newline at end of file
diff --git a/db/schema_migrations/20210212163231 b/db/schema_migrations/20210212163231
new file mode 100644
index 00000000000..e0ba3d83bf5
--- /dev/null
+++ b/db/schema_migrations/20210212163231
@@ -0,0 +1 @@
+4c6061f6ab1cb9e070a3ae87d44caf12d2c110a6033f0b33898b4b7ea7e37055 \ No newline at end of file
diff --git a/db/schema_migrations/20210214201118 b/db/schema_migrations/20210214201118
new file mode 100644
index 00000000000..9551d2ddf50
--- /dev/null
+++ b/db/schema_migrations/20210214201118
@@ -0,0 +1 @@
+8c1da1c7edba16993da93d9075ad2a3624b8c12ccf73a241e1a166014a99e254 \ No newline at end of file
diff --git a/db/schema_migrations/20210214205155 b/db/schema_migrations/20210214205155
new file mode 100644
index 00000000000..583d7ca1167
--- /dev/null
+++ b/db/schema_migrations/20210214205155
@@ -0,0 +1 @@
+7678d97de752e7a9a571d80febc74eb44c699c7b1967690d9a2391036caea5d2 \ No newline at end of file
diff --git a/db/schema_migrations/20210215095328 b/db/schema_migrations/20210215095328
new file mode 100644
index 00000000000..b360aaf4ad8
--- /dev/null
+++ b/db/schema_migrations/20210215095328
@@ -0,0 +1 @@
+25820a3d060826a082565f12a3ac96deafbbde750f5756d71e34d14801ec6148 \ No newline at end of file
diff --git a/db/schema_migrations/20210215144909 b/db/schema_migrations/20210215144909
new file mode 100644
index 00000000000..02939e3dba5
--- /dev/null
+++ b/db/schema_migrations/20210215144909
@@ -0,0 +1 @@
+2965d990ec9cf2edd610b063686f9a1d9de4c38bcba3c8439a18159812d529d4 \ No newline at end of file
diff --git a/db/schema_migrations/20210216122140 b/db/schema_migrations/20210216122140
new file mode 100644
index 00000000000..2d2faca6b19
--- /dev/null
+++ b/db/schema_migrations/20210216122140
@@ -0,0 +1 @@
+0aa6f7385cf13c2b0ee9b7d2a51b63dd208feccffecee8f08ea3d183ebb5ffb4 \ No newline at end of file
diff --git a/db/schema_migrations/20210216193620 b/db/schema_migrations/20210216193620
new file mode 100644
index 00000000000..6c8e8d4c1c4
--- /dev/null
+++ b/db/schema_migrations/20210216193620
@@ -0,0 +1 @@
+3587ba61d003385ea63ce900c1dd1c2bd1f2386abd921615b50421f1b798f553 \ No newline at end of file
diff --git a/db/schema_migrations/20210216223335 b/db/schema_migrations/20210216223335
new file mode 100644
index 00000000000..a086aaa8c91
--- /dev/null
+++ b/db/schema_migrations/20210216223335
@@ -0,0 +1 @@
+52bf190bdb219366c790a5b7c081bfb383543498780cc95a25eafcecea036426 \ No newline at end of file
diff --git a/db/schema_migrations/20210217100728 b/db/schema_migrations/20210217100728
new file mode 100644
index 00000000000..6027a27f8c2
--- /dev/null
+++ b/db/schema_migrations/20210217100728
@@ -0,0 +1 @@
+281ea05a95785b7f1d2d805bf8fe071c0fa59425eb01b46eeb69ad21f5650e29 \ No newline at end of file
diff --git a/db/schema_migrations/20210217101901 b/db/schema_migrations/20210217101901
new file mode 100644
index 00000000000..f4c38be26e0
--- /dev/null
+++ b/db/schema_migrations/20210217101901
@@ -0,0 +1 @@
+909aee5ed0ad447fec425f7252fc6dbec827a66ff720620bae1bf3a32536cb96 \ No newline at end of file
diff --git a/db/schema_migrations/20210218040814 b/db/schema_migrations/20210218040814
new file mode 100644
index 00000000000..3c55d951c14
--- /dev/null
+++ b/db/schema_migrations/20210218040814
@@ -0,0 +1 @@
+6fe34be82f9aee6cbdb729a67d1d4ac0702c8d9774a038bfd4fd9d9cb28b1a2b \ No newline at end of file
diff --git a/db/schema_migrations/20210218105431 b/db/schema_migrations/20210218105431
new file mode 100644
index 00000000000..35dda4ac6f6
--- /dev/null
+++ b/db/schema_migrations/20210218105431
@@ -0,0 +1 @@
+b5ff5aeb9cef243165d9c40db7211f61a632edb6a189c09112ef069d267bf64d \ No newline at end of file
diff --git a/db/schema_migrations/20210218110552 b/db/schema_migrations/20210218110552
new file mode 100644
index 00000000000..5fb325bdfb5
--- /dev/null
+++ b/db/schema_migrations/20210218110552
@@ -0,0 +1 @@
+7631c82f9762e643a4da9c03f3870ab1c97fae93da4975219d9ab7cd629720ec \ No newline at end of file
diff --git a/db/schema_migrations/20210218142626 b/db/schema_migrations/20210218142626
new file mode 100644
index 00000000000..e23a8139ffb
--- /dev/null
+++ b/db/schema_migrations/20210218142626
@@ -0,0 +1 @@
+063c97800eec5bfc7f6879dbe559fa39952295d5ba947cf44ad03ac23212e924 \ No newline at end of file
diff --git a/db/schema_migrations/20210218144056 b/db/schema_migrations/20210218144056
new file mode 100644
index 00000000000..566015ad8be
--- /dev/null
+++ b/db/schema_migrations/20210218144056
@@ -0,0 +1 @@
+545747e86481c74832a6df55764ab97ecfefc4446df9cc2366a8ce9d9c400ea4 \ No newline at end of file
diff --git a/db/schema_migrations/20210218144656 b/db/schema_migrations/20210218144656
new file mode 100644
index 00000000000..622877a279e
--- /dev/null
+++ b/db/schema_migrations/20210218144656
@@ -0,0 +1 @@
+91969bfc791cd7bc78b940aa6fed345b13a3186db0b89828428b798aa4f7949e \ No newline at end of file
diff --git a/db/schema_migrations/20210219100137 b/db/schema_migrations/20210219100137
new file mode 100644
index 00000000000..c573c4fde5f
--- /dev/null
+++ b/db/schema_migrations/20210219100137
@@ -0,0 +1 @@
+be2ddc15e16d7d59bd050a60faaa0b6941d94ba7c47a88be473bcf3a17bb2763 \ No newline at end of file
diff --git a/db/schema_migrations/20210219102900 b/db/schema_migrations/20210219102900
new file mode 100644
index 00000000000..b0a730c4361
--- /dev/null
+++ b/db/schema_migrations/20210219102900
@@ -0,0 +1 @@
+42e06332b279aaac7044243df0a8bd5525025db7d8c22bc474c0874e85f525f5 \ No newline at end of file
diff --git a/db/schema_migrations/20210219111040 b/db/schema_migrations/20210219111040
new file mode 100644
index 00000000000..a006ece2f6c
--- /dev/null
+++ b/db/schema_migrations/20210219111040
@@ -0,0 +1 @@
+546802f93f64e346b066438e78ace5d2dc54de8a5f6234c2d01296a239cfe74c \ No newline at end of file
diff --git a/db/schema_migrations/20210222030537 b/db/schema_migrations/20210222030537
new file mode 100644
index 00000000000..ad30eb19333
--- /dev/null
+++ b/db/schema_migrations/20210222030537
@@ -0,0 +1 @@
+44b0e2b3e32e45fb557a5c9c41f69de94a5d41bad43267f00090b9c527b2b1e1 \ No newline at end of file
diff --git a/db/schema_migrations/20210222042745 b/db/schema_migrations/20210222042745
new file mode 100644
index 00000000000..306b8401e65
--- /dev/null
+++ b/db/schema_migrations/20210222042745
@@ -0,0 +1 @@
+88bbd8cbc4398c3c05a834c4d8d36ee55aca9d698da3cf3c1df0afe916bc051f \ No newline at end of file
diff --git a/db/schema_migrations/20210222070356 b/db/schema_migrations/20210222070356
new file mode 100644
index 00000000000..256bb771dde
--- /dev/null
+++ b/db/schema_migrations/20210222070356
@@ -0,0 +1 @@
+2aa618cdbb6e55c3af1fa144ae3f3bd0d9d5400706db337301d2d165ba789ef0 \ No newline at end of file
diff --git a/db/schema_migrations/20210222070413 b/db/schema_migrations/20210222070413
new file mode 100644
index 00000000000..f1ba0c51922
--- /dev/null
+++ b/db/schema_migrations/20210222070413
@@ -0,0 +1 @@
+e13856c6f65d86dae9a3268f91189bb90af236c555d2f645c6ba4c600c996cba \ No newline at end of file
diff --git a/db/schema_migrations/20210222085529 b/db/schema_migrations/20210222085529
new file mode 100644
index 00000000000..63f47781b3b
--- /dev/null
+++ b/db/schema_migrations/20210222085529
@@ -0,0 +1 @@
+858cd59ea324e3653801055c7f3fae2152b04ac175945a59faa00d67ae7fa223 \ No newline at end of file
diff --git a/db/schema_migrations/20210222085551 b/db/schema_migrations/20210222085551
new file mode 100644
index 00000000000..f0ba3562c3a
--- /dev/null
+++ b/db/schema_migrations/20210222085551
@@ -0,0 +1 @@
+9e6f99ed0c3d4d76a8c290308805cabf84aa7e5fb6dc2b06d973d9d8726fc4d8 \ No newline at end of file
diff --git a/db/schema_migrations/20210222105120 b/db/schema_migrations/20210222105120
new file mode 100644
index 00000000000..768aea442f5
--- /dev/null
+++ b/db/schema_migrations/20210222105120
@@ -0,0 +1 @@
+4da0131929bf59dd4a72bf05a889063df7978f8b5782e5f3b27d466302dc44b6 \ No newline at end of file
diff --git a/db/schema_migrations/20210222185538 b/db/schema_migrations/20210222185538
new file mode 100644
index 00000000000..20229c9be20
--- /dev/null
+++ b/db/schema_migrations/20210222185538
@@ -0,0 +1 @@
+0bccf1ff356a4b9c08d472e8b63070b497f331c2dfaded1bdb2cf01860df8903 \ No newline at end of file
diff --git a/db/schema_migrations/20210222192144 b/db/schema_migrations/20210222192144
new file mode 100644
index 00000000000..b53b1668a1f
--- /dev/null
+++ b/db/schema_migrations/20210222192144
@@ -0,0 +1 @@
+b2508d46edbfbba24df65731f6e285886acbb6352a900dd1c6a985a686252ef0 \ No newline at end of file
diff --git a/db/schema_migrations/20210223053451 b/db/schema_migrations/20210223053451
new file mode 100644
index 00000000000..ad40bb0fa71
--- /dev/null
+++ b/db/schema_migrations/20210223053451
@@ -0,0 +1 @@
+1266bf92f23a42d96778bf546534882f03d2388f22640e4cfaa2a9a1aad19093 \ No newline at end of file
diff --git a/db/schema_migrations/20210223132934 b/db/schema_migrations/20210223132934
new file mode 100644
index 00000000000..6e2b0696bad
--- /dev/null
+++ b/db/schema_migrations/20210223132934
@@ -0,0 +1 @@
+99ee6773319af0fa7a1dfef92f67cc95141c892bf7adcf500d46adc1ebd4c70f \ No newline at end of file
diff --git a/db/schema_migrations/20210223133116 b/db/schema_migrations/20210223133116
new file mode 100644
index 00000000000..235053e8fe8
--- /dev/null
+++ b/db/schema_migrations/20210223133116
@@ -0,0 +1 @@
+991041c8d3092175165834a988eb32141e49d7785cda756c8a78170b4af6db64 \ No newline at end of file
diff --git a/db/schema_migrations/20210224132547 b/db/schema_migrations/20210224132547
new file mode 100644
index 00000000000..f38b394f082
--- /dev/null
+++ b/db/schema_migrations/20210224132547
@@ -0,0 +1 @@
+ac0f71b427be1fb583474e352ce9468a1270c6e67fa40f9071751a0485f21160 \ No newline at end of file
diff --git a/db/schema_migrations/20210224133337 b/db/schema_migrations/20210224133337
new file mode 100644
index 00000000000..d5dafb9fb56
--- /dev/null
+++ b/db/schema_migrations/20210224133337
@@ -0,0 +1 @@
+964e9f88018b2ab72fd370f6a8dccde218cfd4ffa3ccedf4f142ab341f5e858f \ No newline at end of file
diff --git a/db/schema_migrations/20210224150506 b/db/schema_migrations/20210224150506
new file mode 100644
index 00000000000..672b2f53a46
--- /dev/null
+++ b/db/schema_migrations/20210224150506
@@ -0,0 +1 @@
+cc9f56a872cf5e9084e863adc599545754594fb03f30f18433923e0429986e39 \ No newline at end of file
diff --git a/db/schema_migrations/20210225090801 b/db/schema_migrations/20210225090801
new file mode 100644
index 00000000000..364623d6634
--- /dev/null
+++ b/db/schema_migrations/20210225090801
@@ -0,0 +1 @@
+65f27401a76856d6cb284078204bb1b80797fa344e1a4ef3d9638c296f2d72d7 \ No newline at end of file
diff --git a/db/schema_migrations/20210225135533 b/db/schema_migrations/20210225135533
new file mode 100644
index 00000000000..e7c24096aac
--- /dev/null
+++ b/db/schema_migrations/20210225135533
@@ -0,0 +1 @@
+526174bd42327e0212b15ffbad99541887de1dec35cc4c592d4f02065026b3ca \ No newline at end of file
diff --git a/db/schema_migrations/20210225153522 b/db/schema_migrations/20210225153522
new file mode 100644
index 00000000000..6c985a2ed14
--- /dev/null
+++ b/db/schema_migrations/20210225153522
@@ -0,0 +1 @@
+ec071087de45291ae8fc0d6d6e778d16a7411a934e4a301f62890061abcaed4c \ No newline at end of file
diff --git a/db/schema_migrations/20210301150451 b/db/schema_migrations/20210301150451
new file mode 100644
index 00000000000..1d644ccb62e
--- /dev/null
+++ b/db/schema_migrations/20210301150451
@@ -0,0 +1 @@
+6c52ab55814241b37014949976c4f3a0c63bea0a4f9a301735cc9f4c509f433d \ No newline at end of file
diff --git a/db/schema_migrations/20210302074524 b/db/schema_migrations/20210302074524
new file mode 100644
index 00000000000..be35539d1f0
--- /dev/null
+++ b/db/schema_migrations/20210302074524
@@ -0,0 +1 @@
+251c0d811eee00f78e62f4d1e7f2893b2137fbf8121cefc4283c3217677b5447 \ No newline at end of file
diff --git a/db/schema_migrations/20210302103851 b/db/schema_migrations/20210302103851
new file mode 100644
index 00000000000..cd166f974a9
--- /dev/null
+++ b/db/schema_migrations/20210302103851
@@ -0,0 +1 @@
+b2dad27276941e17248f86764196525bd91b088eed78ad7aa6ae2e5a2c9e82bd \ No newline at end of file
diff --git a/db/schema_migrations/20210302155904 b/db/schema_migrations/20210302155904
new file mode 100644
index 00000000000..b9f1297934c
--- /dev/null
+++ b/db/schema_migrations/20210302155904
@@ -0,0 +1 @@
+104e767518d55a7caa5ff517efe978287beb629649c681a2871ada8a677a0e13 \ No newline at end of file
diff --git a/db/schema_migrations/20210302160544 b/db/schema_migrations/20210302160544
new file mode 100644
index 00000000000..fd1b67c16bf
--- /dev/null
+++ b/db/schema_migrations/20210302160544
@@ -0,0 +1 @@
+e5c589decb2bc8d3e37451bf9977a810308ee37f5f02ed96226e0be87f8b908d \ No newline at end of file
diff --git a/db/schema_migrations/20210302212623 b/db/schema_migrations/20210302212623
new file mode 100644
index 00000000000..f7e2ab33416
--- /dev/null
+++ b/db/schema_migrations/20210302212623
@@ -0,0 +1 @@
+283645d1791a8d72fa7e327799ede933d89bd69d8db2a87b7ff437a2f5d74da3 \ No newline at end of file
diff --git a/db/schema_migrations/20210303053341 b/db/schema_migrations/20210303053341
new file mode 100644
index 00000000000..115b5655f4f
--- /dev/null
+++ b/db/schema_migrations/20210303053341
@@ -0,0 +1 @@
+3bd7e839c4f93716a7e893bf9184306a1fcfd401e5b54f4393e5138e2776f5e0 \ No newline at end of file
diff --git a/db/schema_migrations/20210303064112 b/db/schema_migrations/20210303064112
new file mode 100644
index 00000000000..42164b222b7
--- /dev/null
+++ b/db/schema_migrations/20210303064112
@@ -0,0 +1 @@
+5b8f32bafe4bffd30b9235f9b6ba5774a26d5c4c9f1e987d3e840056f8abdd52 \ No newline at end of file
diff --git a/db/schema_migrations/20210303064142 b/db/schema_migrations/20210303064142
new file mode 100644
index 00000000000..9ac9716c8e7
--- /dev/null
+++ b/db/schema_migrations/20210303064142
@@ -0,0 +1 @@
+70c5b76788460bd098c3ae3f75c7b18194c7765e1462f5305feaf2400f7dd4ff \ No newline at end of file
diff --git a/db/schema_migrations/20210303091651 b/db/schema_migrations/20210303091651
new file mode 100644
index 00000000000..35d2ca084b8
--- /dev/null
+++ b/db/schema_migrations/20210303091651
@@ -0,0 +1 @@
+e1641d84828e3d87aea626dbce6b3b2d231d08fcf1475991fe8d11714cdb0af0 \ No newline at end of file
diff --git a/db/schema_migrations/20210303165201 b/db/schema_migrations/20210303165201
new file mode 100644
index 00000000000..55181591e3f
--- /dev/null
+++ b/db/schema_migrations/20210303165201
@@ -0,0 +1 @@
+0a5d306735047101692bbdb37aa829bf70a225af6db7213a8c2eb8168f9a30e9 \ No newline at end of file
diff --git a/db/schema_migrations/20210303165301 b/db/schema_migrations/20210303165301
new file mode 100644
index 00000000000..c040288a283
--- /dev/null
+++ b/db/schema_migrations/20210303165301
@@ -0,0 +1 @@
+fa82a0f6c57a527a143da56ae0d70245a7d711b5e5ff3eb959fd6b2cf5872dac \ No newline at end of file
diff --git a/db/schema_migrations/20210303165302 b/db/schema_migrations/20210303165302
new file mode 100644
index 00000000000..f140d636482
--- /dev/null
+++ b/db/schema_migrations/20210303165302
@@ -0,0 +1 @@
+1cb74abdc7134c3252425c3ceb8cd9dc4b157d64b1a2ff7928153e78b05d9121 \ No newline at end of file
diff --git a/db/schema_migrations/20210304133508 b/db/schema_migrations/20210304133508
new file mode 100644
index 00000000000..c57b04c24fb
--- /dev/null
+++ b/db/schema_migrations/20210304133508
@@ -0,0 +1 @@
+a6bf41632fc3d81d2c015d2d848f4e74468ec8cfeb2a2afb644fd92189e95e21 \ No newline at end of file
diff --git a/db/schema_migrations/20210305002016 b/db/schema_migrations/20210305002016
new file mode 100644
index 00000000000..a4bc67d505a
--- /dev/null
+++ b/db/schema_migrations/20210305002016
@@ -0,0 +1 @@
+c91541048b119bcbbe9454760c6a90ddb6c4dc90e121f3ee7f4cdd6a1bde2c9e \ No newline at end of file
diff --git a/db/schema_migrations/20210305013509 b/db/schema_migrations/20210305013509
new file mode 100644
index 00000000000..6649e76508b
--- /dev/null
+++ b/db/schema_migrations/20210305013509
@@ -0,0 +1 @@
+743344bb057d0e368c69cc3c90f72d560359d0753acf069e7423928c778a140a \ No newline at end of file
diff --git a/db/schema_migrations/20210306121300 b/db/schema_migrations/20210306121300
new file mode 100644
index 00000000000..f46097b1126
--- /dev/null
+++ b/db/schema_migrations/20210306121300
@@ -0,0 +1 @@
+44d53ac15c5e54c2f1c825286155dec643b82573184026caaf08288512168aef \ No newline at end of file
diff --git a/db/schema_migrations/20210306121310 b/db/schema_migrations/20210306121310
new file mode 100644
index 00000000000..8713032f2d4
--- /dev/null
+++ b/db/schema_migrations/20210306121310
@@ -0,0 +1 @@
+90072e3dee4517061ff9e08decda7fecb9cc9b38a56345c09685e3cce48a8b66 \ No newline at end of file
diff --git a/db/schema_migrations/20210308125742 b/db/schema_migrations/20210308125742
new file mode 100644
index 00000000000..9090fa4dc5e
--- /dev/null
+++ b/db/schema_migrations/20210308125742
@@ -0,0 +1 @@
+a81f3555d0e1159569687d4967edcd2b5706cdafd5defb8dc725e295eb969861 \ No newline at end of file
diff --git a/db/schema_migrations/20210308190413 b/db/schema_migrations/20210308190413
new file mode 100644
index 00000000000..9ddde51b57e
--- /dev/null
+++ b/db/schema_migrations/20210308190413
@@ -0,0 +1 @@
+cc131cf37f2af8f0f58c7fa6e5055e88a3b2ed413862c155b0d18383aba06058 \ No newline at end of file
diff --git a/db/schema_migrations/20210309181019 b/db/schema_migrations/20210309181019
new file mode 100644
index 00000000000..3055268acc8
--- /dev/null
+++ b/db/schema_migrations/20210309181019
@@ -0,0 +1 @@
+a31b85b8ab0db2ad4daa5f2c15eacae97432e75e0e0a28f10d81f6a5aa94c8e0 \ No newline at end of file
diff --git a/db/structure.sql b/db/structure.sql
index c6b3b7ea997..953c0927b58 100644
--- a/db/structure.sql
+++ b/db/structure.sql
@@ -41,6 +41,62 @@ RETURN NULL;
END
$$;
+CREATE FUNCTION table_sync_function_29bc99d6db() RETURNS trigger
+ LANGUAGE plpgsql
+ AS $$
+BEGIN
+IF (TG_OP = 'DELETE') THEN
+ DELETE FROM web_hook_logs_part_0c5294f417 where id = OLD.id;
+ELSIF (TG_OP = 'UPDATE') THEN
+ UPDATE web_hook_logs_part_0c5294f417
+ SET web_hook_id = NEW.web_hook_id,
+ trigger = NEW.trigger,
+ url = NEW.url,
+ request_headers = NEW.request_headers,
+ request_data = NEW.request_data,
+ response_headers = NEW.response_headers,
+ response_body = NEW.response_body,
+ response_status = NEW.response_status,
+ execution_duration = NEW.execution_duration,
+ internal_error_message = NEW.internal_error_message,
+ updated_at = NEW.updated_at,
+ created_at = NEW.created_at
+ WHERE web_hook_logs_part_0c5294f417.id = NEW.id;
+ELSIF (TG_OP = 'INSERT') THEN
+ INSERT INTO web_hook_logs_part_0c5294f417 (id,
+ web_hook_id,
+ trigger,
+ url,
+ request_headers,
+ request_data,
+ response_headers,
+ response_body,
+ response_status,
+ execution_duration,
+ internal_error_message,
+ updated_at,
+ created_at)
+ VALUES (NEW.id,
+ NEW.web_hook_id,
+ NEW.trigger,
+ NEW.url,
+ NEW.request_headers,
+ NEW.request_data,
+ NEW.response_headers,
+ NEW.response_body,
+ NEW.response_status,
+ NEW.execution_duration,
+ NEW.internal_error_message,
+ NEW.updated_at,
+ NEW.created_at);
+END IF;
+RETURN NULL;
+
+END
+$$;
+
+COMMENT ON FUNCTION table_sync_function_29bc99d6db() IS 'Partitioning migration: table sync for web_hook_logs table';
+
CREATE FUNCTION table_sync_function_2be879775d() RETURNS trigger
LANGUAGE plpgsql
AS $$
@@ -114,6 +170,23 @@ CREATE TABLE audit_events (
)
PARTITION BY RANGE (created_at);
+CREATE TABLE web_hook_logs_part_0c5294f417 (
+ id bigint NOT NULL,
+ web_hook_id integer NOT NULL,
+ trigger character varying,
+ url character varying,
+ request_headers text,
+ request_data text,
+ response_headers text,
+ response_body text,
+ response_status character varying,
+ execution_duration double precision,
+ internal_error_message character varying,
+ updated_at timestamp without time zone NOT NULL,
+ created_at timestamp without time zone NOT NULL
+)
+PARTITION BY RANGE (created_at);
+
CREATE TABLE product_analytics_events_experimental (
id bigint NOT NULL,
project_id integer NOT NULL,
@@ -9398,6 +9471,7 @@ CREATE TABLE application_settings (
notes_create_limit integer DEFAULT 300 NOT NULL,
notes_create_limit_allowlist text[] DEFAULT '{}'::text[] NOT NULL,
kroki_formats jsonb DEFAULT '{}'::jsonb NOT NULL,
+ in_product_marketing_emails_enabled boolean DEFAULT true NOT NULL,
asset_proxy_whitelist text,
CONSTRAINT app_settings_container_reg_cleanup_tags_max_list_size_positive CHECK ((container_registry_cleanup_tags_service_max_list_size >= 0)),
CONSTRAINT app_settings_registry_exp_policies_worker_capacity_positive CHECK ((container_registry_expiration_policies_worker_capacity >= 0)),
@@ -9746,23 +9820,6 @@ CREATE SEQUENCE background_migration_jobs_id_seq
ALTER SEQUENCE background_migration_jobs_id_seq OWNED BY background_migration_jobs.id;
-CREATE TABLE backup_labels (
- id integer NOT NULL,
- title character varying,
- color character varying,
- project_id integer,
- created_at timestamp without time zone,
- updated_at timestamp without time zone,
- template boolean DEFAULT false,
- description character varying,
- description_html text,
- type character varying,
- group_id integer,
- cached_markdown_version integer,
- restore_action integer,
- new_title character varying
-);
-
CREATE TABLE badges (
id integer NOT NULL,
link_url character varying NOT NULL,
@@ -9784,6 +9841,64 @@ CREATE SEQUENCE badges_id_seq
ALTER SEQUENCE badges_id_seq OWNED BY badges.id;
+CREATE TABLE batched_background_migration_jobs (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ started_at timestamp with time zone,
+ finished_at timestamp with time zone,
+ batched_background_migration_id bigint NOT NULL,
+ min_value bigint NOT NULL,
+ max_value bigint NOT NULL,
+ batch_size integer NOT NULL,
+ sub_batch_size integer NOT NULL,
+ status smallint DEFAULT 0 NOT NULL,
+ attempts smallint DEFAULT 0 NOT NULL
+);
+
+CREATE SEQUENCE batched_background_migration_jobs_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE batched_background_migration_jobs_id_seq OWNED BY batched_background_migration_jobs.id;
+
+CREATE TABLE batched_background_migrations (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ min_value bigint DEFAULT 1 NOT NULL,
+ max_value bigint NOT NULL,
+ batch_size integer NOT NULL,
+ sub_batch_size integer NOT NULL,
+ "interval" smallint NOT NULL,
+ status smallint DEFAULT 0 NOT NULL,
+ job_class_name text NOT NULL,
+ batch_class_name text DEFAULT 'PrimaryKeyBatchingStrategy'::text NOT NULL,
+ table_name text NOT NULL,
+ column_name text NOT NULL,
+ job_arguments jsonb DEFAULT '"[]"'::jsonb NOT NULL,
+ 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)),
+ CONSTRAINT check_e6c75b1e29 CHECK ((char_length(job_class_name) <= 100)),
+ CONSTRAINT check_fe10674721 CHECK ((char_length(batch_class_name) <= 100)),
+ CONSTRAINT check_max_value_in_range CHECK ((max_value >= min_value)),
+ CONSTRAINT check_positive_min_value CHECK ((min_value > 0)),
+ CONSTRAINT check_positive_sub_batch_size CHECK ((sub_batch_size > 0))
+);
+
+CREATE SEQUENCE batched_background_migrations_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE batched_background_migrations_id_seq OWNED BY batched_background_migrations.id;
+
CREATE TABLE board_assignees (
id integer NOT NULL,
board_id integer NOT NULL,
@@ -9935,6 +10050,24 @@ CREATE SEQUENCE boards_epic_boards_id_seq
ALTER SEQUENCE boards_epic_boards_id_seq OWNED BY boards_epic_boards.id;
+CREATE TABLE boards_epic_list_user_preferences (
+ id bigint NOT NULL,
+ user_id bigint NOT NULL,
+ epic_list_id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ collapsed boolean DEFAULT false NOT NULL
+);
+
+CREATE SEQUENCE boards_epic_list_user_preferences_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE boards_epic_list_user_preferences_id_seq OWNED BY boards_epic_list_user_preferences.id;
+
CREATE TABLE boards_epic_lists (
id bigint NOT NULL,
created_at timestamp with time zone NOT NULL,
@@ -10264,7 +10397,6 @@ CREATE TABLE ci_builds (
runner_id integer,
coverage double precision,
commit_id integer,
- commands text,
name character varying,
options text,
allow_failure boolean DEFAULT false NOT NULL,
@@ -10277,14 +10409,11 @@ CREATE TABLE ci_builds (
type character varying,
target_url character varying,
description character varying,
- artifacts_file text,
project_id integer,
- artifacts_metadata text,
erased_by_id integer,
erased_at timestamp without time zone,
artifacts_expire_at timestamp without time zone,
environment character varying,
- artifacts_size bigint,
"when" character varying,
yaml_variables text,
queued_at timestamp without time zone,
@@ -10294,8 +10423,6 @@ CREATE TABLE ci_builds (
auto_canceled_by_id integer,
retried boolean,
stage_id integer,
- artifacts_file_store integer,
- artifacts_metadata_store integer,
protected boolean,
failure_reason integer,
scheduled_at timestamp with time zone,
@@ -10428,7 +10555,9 @@ CREATE TABLE ci_group_variables (
created_at timestamp with time zone NOT NULL,
updated_at timestamp with time zone NOT NULL,
masked boolean DEFAULT false NOT NULL,
- variable_type smallint DEFAULT 1 NOT NULL
+ variable_type smallint DEFAULT 1 NOT NULL,
+ environment_scope text DEFAULT '*'::text NOT NULL,
+ CONSTRAINT check_dfe009485a CHECK ((char_length(environment_scope) <= 255))
);
CREATE SEQUENCE ci_group_variables_id_seq
@@ -10830,7 +10959,6 @@ CREATE TABLE ci_runners (
description character varying,
contacted_at timestamp without time zone,
active boolean DEFAULT true NOT NULL,
- is_shared boolean DEFAULT false,
name character varying,
version character varying,
revision character varying,
@@ -11026,6 +11154,11 @@ CREATE TABLE cluster_agent_tokens (
agent_id bigint NOT NULL,
token_encrypted text NOT NULL,
created_by_user_id bigint,
+ description text,
+ name text,
+ last_used_at timestamp with time zone,
+ CONSTRAINT check_2b79dbb315 CHECK ((char_length(name) <= 255)),
+ CONSTRAINT check_4e4ec5070a CHECK ((char_length(description) <= 1024)),
CONSTRAINT check_c60daed227 CHECK ((char_length(token_encrypted) <= 255))
);
@@ -11607,6 +11740,7 @@ CREATE TABLE custom_emoji (
name text NOT NULL,
file text NOT NULL,
external boolean DEFAULT true NOT NULL,
+ creator_id bigint NOT NULL,
CONSTRAINT check_8c586dd507 CHECK ((char_length(name) <= 36)),
CONSTRAINT check_dd5d60f1fb CHECK ((char_length(file) <= 255))
);
@@ -11629,7 +11763,9 @@ CREATE TABLE dast_profiles (
updated_at timestamp with time zone NOT NULL,
name text NOT NULL,
description text NOT NULL,
+ branch_name text,
CONSTRAINT check_5fcf73bf61 CHECK ((char_length(name) <= 255)),
+ CONSTRAINT check_6c9d775949 CHECK ((char_length(branch_name) <= 255)),
CONSTRAINT check_c34e505c24 CHECK ((char_length(description) <= 255))
);
@@ -12016,6 +12152,25 @@ CREATE SEQUENCE diff_note_positions_id_seq
ALTER SEQUENCE diff_note_positions_id_seq OWNED BY diff_note_positions.id;
+CREATE TABLE dora_daily_metrics (
+ id bigint NOT NULL,
+ environment_id bigint NOT NULL,
+ date date NOT NULL,
+ deployment_frequency integer,
+ lead_time_for_changes_in_seconds 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))
+);
+
+CREATE SEQUENCE dora_daily_metrics_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE dora_daily_metrics_id_seq OWNED BY dora_daily_metrics.id;
+
CREATE TABLE draft_notes (
id bigint NOT NULL,
merge_request_id integer NOT NULL,
@@ -12135,7 +12290,8 @@ CREATE TABLE environments (
state character varying DEFAULT 'available'::character varying NOT NULL,
slug character varying NOT NULL,
auto_stop_at timestamp with time zone,
- auto_delete_at timestamp with time zone
+ auto_delete_at timestamp with time zone,
+ tier smallint
);
CREATE SEQUENCE environments_id_seq
@@ -12342,6 +12498,41 @@ CREATE SEQUENCE experiments_id_seq
ALTER SEQUENCE experiments_id_seq OWNED BY experiments.id;
+CREATE TABLE external_approval_rules (
+ id bigint NOT NULL,
+ project_id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ external_url text NOT NULL,
+ name text NOT NULL,
+ CONSTRAINT check_1c64b53ea5 CHECK ((char_length(name) <= 255)),
+ CONSTRAINT check_b634ca168d CHECK ((char_length(external_url) <= 255))
+);
+
+CREATE SEQUENCE external_approval_rules_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE external_approval_rules_id_seq OWNED BY external_approval_rules.id;
+
+CREATE TABLE external_approval_rules_protected_branches (
+ id bigint NOT NULL,
+ external_approval_rule_id bigint NOT NULL,
+ protected_branch_id bigint NOT NULL
+);
+
+CREATE SEQUENCE external_approval_rules_protected_branches_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE external_approval_rules_protected_branches_id_seq OWNED BY external_approval_rules_protected_branches.id;
+
CREATE TABLE external_pull_requests (
id bigint NOT NULL,
created_at timestamp with time zone NOT NULL,
@@ -13191,7 +13382,8 @@ CREATE TABLE incident_management_oncall_participants (
oncall_rotation_id bigint NOT NULL,
user_id bigint NOT NULL,
color_palette smallint NOT NULL,
- color_weight smallint NOT NULL
+ color_weight smallint NOT NULL,
+ is_removed boolean DEFAULT false NOT NULL
);
CREATE SEQUENCE incident_management_oncall_participants_id_seq
@@ -13212,6 +13404,9 @@ CREATE TABLE incident_management_oncall_rotations (
length_unit smallint NOT NULL,
starts_at timestamp with time zone NOT NULL,
name text NOT NULL,
+ ends_at timestamp with time zone,
+ active_period_start time without time zone,
+ active_period_end time without time zone,
CONSTRAINT check_5209fb5d02 CHECK ((char_length(name) <= 200))
);
@@ -13544,6 +13739,30 @@ CREATE TABLE issues_self_managed_prometheus_alert_events (
updated_at timestamp with time zone NOT NULL
);
+CREATE TABLE iterations_cadences (
+ id bigint NOT NULL,
+ group_id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ start_date date NOT NULL,
+ last_run_date date,
+ duration_in_weeks integer,
+ iterations_in_advance integer,
+ active boolean DEFAULT true NOT NULL,
+ automatic boolean DEFAULT true NOT NULL,
+ title text NOT NULL,
+ CONSTRAINT check_fedff82d3b CHECK ((char_length(title) <= 255))
+);
+
+CREATE SEQUENCE iterations_cadences_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE iterations_cadences_id_seq OWNED BY iterations_cadences.id;
+
CREATE TABLE jira_connect_installations (
id bigint NOT NULL,
client_key character varying,
@@ -14339,6 +14558,7 @@ CREATE TABLE namespace_settings (
allow_mfa_for_subgroups boolean DEFAULT true NOT NULL,
default_branch_name text,
repository_read_only boolean DEFAULT false NOT NULL,
+ delayed_project_removal boolean DEFAULT false NOT NULL,
CONSTRAINT check_0ba93c78c7 CHECK ((char_length(default_branch_name) <= 255))
);
@@ -14346,7 +14566,9 @@ CREATE TABLE namespace_statistics (
id integer NOT NULL,
namespace_id integer NOT NULL,
shared_runners_seconds integer DEFAULT 0 NOT NULL,
- shared_runners_seconds_last_reset timestamp without time zone
+ shared_runners_seconds_last_reset timestamp without time zone,
+ storage_size bigint DEFAULT 0 NOT NULL,
+ wiki_size bigint DEFAULT 0 NOT NULL
);
CREATE SEQUENCE namespace_statistics_id_seq
@@ -14467,7 +14689,8 @@ CREATE TABLE notes (
change_position text,
resolved_by_push boolean,
review_id bigint,
- confidential boolean
+ confidential boolean,
+ last_edited_at timestamp with time zone
);
CREATE SEQUENCE notes_id_seq
@@ -14506,7 +14729,8 @@ CREATE TABLE notification_settings (
fixed_pipeline boolean,
new_release boolean,
moved_project boolean DEFAULT true NOT NULL,
- change_reviewer_merge_request boolean
+ change_reviewer_merge_request boolean,
+ merge_when_pipeline_succeeds boolean DEFAULT false NOT NULL
);
CREATE SEQUENCE notification_settings_id_seq
@@ -14621,7 +14845,8 @@ CREATE TABLE onboarding_progresses (
security_scan_enabled_at timestamp with time zone,
issue_auto_closed_at timestamp with time zone,
repository_imported_at timestamp with time zone,
- repository_mirrored_at timestamp with time zone
+ repository_mirrored_at timestamp with time zone,
+ issue_created_at timestamp with time zone
);
CREATE SEQUENCE onboarding_progresses_id_seq
@@ -15977,7 +16202,8 @@ CREATE TABLE project_features (
requirements_access_level integer DEFAULT 20 NOT NULL,
operations_access_level integer DEFAULT 20 NOT NULL,
analytics_access_level integer DEFAULT 20 NOT NULL,
- security_and_compliance_access_level integer DEFAULT 10 NOT NULL
+ security_and_compliance_access_level integer DEFAULT 10 NOT NULL,
+ container_registry_access_level integer DEFAULT 0 NOT NULL
);
CREATE SEQUENCE project_features_id_seq
@@ -16179,6 +16405,7 @@ CREATE TABLE project_settings (
has_vulnerabilities boolean DEFAULT false NOT NULL,
allow_editing_commit_messages boolean DEFAULT false NOT NULL,
prevent_merge_without_jira_issue boolean DEFAULT false NOT NULL,
+ cve_id_request_enabled boolean DEFAULT true NOT NULL,
CONSTRAINT check_bde223416c CHECK ((show_default_award_emojis IS NOT NULL))
);
@@ -16449,7 +16676,8 @@ CREATE TABLE protected_branches (
name character varying NOT NULL,
created_at timestamp without time zone,
updated_at timestamp without time zone,
- code_owner_approval_required boolean DEFAULT false NOT NULL
+ code_owner_approval_required boolean DEFAULT false NOT NULL,
+ allow_force_push boolean DEFAULT false NOT NULL
);
CREATE SEQUENCE protected_branches_id_seq
@@ -17017,7 +17245,8 @@ CREATE TABLE security_scans (
created_at timestamp with time zone NOT NULL,
updated_at timestamp with time zone NOT NULL,
build_id bigint NOT NULL,
- scan_type smallint NOT NULL
+ scan_type smallint NOT NULL,
+ info jsonb DEFAULT '{}'::jsonb NOT NULL
);
CREATE SEQUENCE security_scans_id_seq
@@ -17357,6 +17586,7 @@ CREATE TABLE sprints (
description text,
description_html text,
state_enum smallint DEFAULT 1 NOT NULL,
+ iterations_cadence_id integer,
CONSTRAINT sprints_must_belong_to_project_or_group CHECK ((((project_id <> NULL::bigint) AND (group_id IS NULL)) OR ((group_id <> NULL::bigint) AND (project_id IS NULL)))),
CONSTRAINT sprints_title CHECK ((char_length(title) <= 255))
);
@@ -17562,7 +17792,7 @@ CREATE TABLE terraform_states (
locked_at timestamp with time zone,
locked_by_user_id bigint,
uuid character varying(32) NOT NULL,
- name character varying(255),
+ name character varying(255) NOT NULL,
versioning_enabled boolean DEFAULT true NOT NULL
);
@@ -17851,7 +18081,8 @@ CREATE TABLE user_preferences (
tab_width smallint,
experience_level smallint,
view_diffs_file_by_file boolean DEFAULT false NOT NULL,
- gitpod_enabled boolean DEFAULT false NOT NULL
+ gitpod_enabled boolean DEFAULT false NOT NULL,
+ markdown_surround_selection boolean DEFAULT true NOT NULL
);
CREATE SEQUENCE user_preferences_id_seq
@@ -18180,7 +18411,7 @@ CREATE TABLE vulnerability_finding_fingerprints (
finding_id bigint NOT NULL,
created_at timestamp with time zone NOT NULL,
updated_at timestamp with time zone NOT NULL,
- algorithm_type integer NOT NULL,
+ algorithm_type smallint NOT NULL,
fingerprint_sha256 bytea NOT NULL
);
@@ -18718,6 +18949,10 @@ ALTER TABLE ONLY background_migration_jobs ALTER COLUMN id SET DEFAULT nextval('
ALTER TABLE ONLY badges ALTER COLUMN id SET DEFAULT nextval('badges_id_seq'::regclass);
+ALTER TABLE ONLY batched_background_migration_jobs ALTER COLUMN id SET DEFAULT nextval('batched_background_migration_jobs_id_seq'::regclass);
+
+ALTER TABLE ONLY batched_background_migrations ALTER COLUMN id SET DEFAULT nextval('batched_background_migrations_id_seq'::regclass);
+
ALTER TABLE ONLY board_assignees ALTER COLUMN id SET DEFAULT nextval('board_assignees_id_seq'::regclass);
ALTER TABLE ONLY board_group_recent_visits ALTER COLUMN id SET DEFAULT nextval('board_group_recent_visits_id_seq'::regclass);
@@ -18736,6 +18971,8 @@ ALTER TABLE ONLY boards_epic_board_positions ALTER COLUMN id SET DEFAULT nextval
ALTER TABLE ONLY boards_epic_boards ALTER COLUMN id SET DEFAULT nextval('boards_epic_boards_id_seq'::regclass);
+ALTER TABLE ONLY boards_epic_list_user_preferences ALTER COLUMN id SET DEFAULT nextval('boards_epic_list_user_preferences_id_seq'::regclass);
+
ALTER TABLE ONLY boards_epic_lists ALTER COLUMN id SET DEFAULT nextval('boards_epic_lists_id_seq'::regclass);
ALTER TABLE ONLY boards_epic_user_preferences ALTER COLUMN id SET DEFAULT nextval('boards_epic_user_preferences_id_seq'::regclass);
@@ -18926,6 +19163,8 @@ ALTER TABLE ONLY design_user_mentions ALTER COLUMN id SET DEFAULT nextval('desig
ALTER TABLE ONLY diff_note_positions ALTER COLUMN id SET DEFAULT nextval('diff_note_positions_id_seq'::regclass);
+ALTER TABLE ONLY dora_daily_metrics ALTER COLUMN id SET DEFAULT nextval('dora_daily_metrics_id_seq'::regclass);
+
ALTER TABLE ONLY draft_notes ALTER COLUMN id SET DEFAULT nextval('draft_notes_id_seq'::regclass);
ALTER TABLE ONLY elastic_reindexing_subtasks ALTER COLUMN id SET DEFAULT nextval('elastic_reindexing_subtasks_id_seq'::regclass);
@@ -18954,6 +19193,10 @@ ALTER TABLE ONLY experiment_users ALTER COLUMN id SET DEFAULT nextval('experimen
ALTER TABLE ONLY experiments ALTER COLUMN id SET DEFAULT nextval('experiments_id_seq'::regclass);
+ALTER TABLE ONLY external_approval_rules ALTER COLUMN id SET DEFAULT nextval('external_approval_rules_id_seq'::regclass);
+
+ALTER TABLE ONLY external_approval_rules_protected_branches ALTER COLUMN id SET DEFAULT nextval('external_approval_rules_protected_branches_id_seq'::regclass);
+
ALTER TABLE ONLY external_pull_requests ALTER COLUMN id SET DEFAULT nextval('external_pull_requests_id_seq'::regclass);
ALTER TABLE ONLY feature_gates ALTER COLUMN id SET DEFAULT nextval('feature_gates_id_seq'::regclass);
@@ -19068,6 +19311,8 @@ ALTER TABLE ONLY issue_user_mentions ALTER COLUMN id SET DEFAULT nextval('issue_
ALTER TABLE ONLY issues ALTER COLUMN id SET DEFAULT nextval('issues_id_seq'::regclass);
+ALTER TABLE ONLY iterations_cadences ALTER COLUMN id SET DEFAULT nextval('iterations_cadences_id_seq'::regclass);
+
ALTER TABLE ONLY jira_connect_installations ALTER COLUMN id SET DEFAULT nextval('jira_connect_installations_id_seq'::regclass);
ALTER TABLE ONLY jira_connect_subscriptions ALTER COLUMN id SET DEFAULT nextval('jira_connect_subscriptions_id_seq'::regclass);
@@ -19786,12 +20031,15 @@ ALTER TABLE ONLY aws_roles
ALTER TABLE ONLY background_migration_jobs
ADD CONSTRAINT background_migration_jobs_pkey PRIMARY KEY (id);
-ALTER TABLE ONLY backup_labels
- ADD CONSTRAINT backup_labels_pkey PRIMARY KEY (id);
-
ALTER TABLE ONLY badges
ADD CONSTRAINT badges_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY batched_background_migration_jobs
+ ADD CONSTRAINT batched_background_migration_jobs_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY batched_background_migrations
+ ADD CONSTRAINT batched_background_migrations_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY board_assignees
ADD CONSTRAINT board_assignees_pkey PRIMARY KEY (id);
@@ -19816,6 +20064,9 @@ ALTER TABLE ONLY boards_epic_board_positions
ALTER TABLE ONLY boards_epic_boards
ADD CONSTRAINT boards_epic_boards_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY boards_epic_list_user_preferences
+ ADD CONSTRAINT boards_epic_list_user_preferences_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY boards_epic_lists
ADD CONSTRAINT boards_epic_lists_pkey PRIMARY KEY (id);
@@ -19849,12 +20100,24 @@ ALTER TABLE ONLY chat_names
ALTER TABLE ONLY chat_teams
ADD CONSTRAINT chat_teams_pkey PRIMARY KEY (id);
+ALTER TABLE cluster_agent_tokens
+ ADD CONSTRAINT check_0fb634d04d CHECK ((name IS NOT NULL)) NOT VALID;
+
ALTER TABLE vulnerability_scanners
ADD CONSTRAINT check_37608c9db5 CHECK ((char_length(vendor) <= 255)) NOT VALID;
+ALTER TABLE gitlab_subscriptions
+ ADD CONSTRAINT check_77fea3f0e7 CHECK ((namespace_id IS NOT NULL)) NOT VALID;
+
+ALTER TABLE sprints
+ ADD CONSTRAINT check_ccd8a1eae0 CHECK ((start_date IS NOT NULL)) NOT VALID;
+
ALTER TABLE group_import_states
ADD CONSTRAINT check_cda75c7c3f CHECK ((user_id IS NOT NULL)) NOT VALID;
+ALTER TABLE sprints
+ ADD CONSTRAINT check_df3816aed7 CHECK ((due_date IS NOT NULL)) NOT VALID;
+
ALTER TABLE ONLY ci_build_needs
ADD CONSTRAINT ci_build_needs_pkey PRIMARY KEY (id);
@@ -20122,6 +20385,9 @@ ALTER TABLE ONLY design_user_mentions
ALTER TABLE ONLY diff_note_positions
ADD CONSTRAINT diff_note_positions_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY dora_daily_metrics
+ ADD CONSTRAINT dora_daily_metrics_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY draft_notes
ADD CONSTRAINT draft_notes_pkey PRIMARY KEY (id);
@@ -20170,6 +20436,12 @@ ALTER TABLE ONLY experiment_users
ALTER TABLE ONLY experiments
ADD CONSTRAINT experiments_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY external_approval_rules
+ ADD CONSTRAINT external_approval_rules_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY external_approval_rules_protected_branches
+ ADD CONSTRAINT external_approval_rules_protected_branches_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY external_pull_requests
ADD CONSTRAINT external_pull_requests_pkey PRIMARY KEY (id);
@@ -20363,11 +20635,14 @@ ALTER TABLE ONLY issues_self_managed_prometheus_alert_events
ADD CONSTRAINT issues_self_managed_prometheus_alert_events_pkey PRIMARY KEY (issue_id, self_managed_prometheus_alert_event_id);
ALTER TABLE ONLY sprints
- ADD CONSTRAINT iteration_start_and_due_daterange_group_id_constraint EXCLUDE USING gist (group_id WITH =, daterange(start_date, due_date, '[]'::text) WITH &&) WHERE ((group_id IS NOT NULL));
+ ADD CONSTRAINT iteration_start_and_due_date_iterations_cadence_id_constraint EXCLUDE USING gist (iterations_cadence_id WITH =, daterange(start_date, due_date, '[]'::text) WITH &&) WHERE ((group_id IS NOT NULL));
ALTER TABLE ONLY sprints
ADD CONSTRAINT iteration_start_and_due_daterange_project_id_constraint EXCLUDE USING gist (project_id WITH =, daterange(start_date, due_date, '[]'::text) WITH &&) WHERE ((project_id IS NOT NULL));
+ALTER TABLE ONLY iterations_cadences
+ ADD CONSTRAINT iterations_cadences_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY jira_connect_installations
ADD CONSTRAINT jira_connect_installations_pkey PRIMARY KEY (id);
@@ -21058,6 +21333,9 @@ ALTER TABLE ONLY vulnerability_statistics
ALTER TABLE ONLY vulnerability_user_mentions
ADD CONSTRAINT vulnerability_user_mentions_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY web_hook_logs_part_0c5294f417
+ ADD CONSTRAINT web_hook_logs_part_0c5294f417_pkey PRIMARY KEY (id, created_at);
+
ALTER TABLE ONLY web_hook_logs
ADD CONSTRAINT web_hook_logs_pkey PRIMARY KEY (id);
@@ -21231,18 +21509,6 @@ CREATE UNIQUE INDEX any_approver_project_rule_type_unique_index ON approval_proj
CREATE INDEX approval_mr_rule_index_merge_request_id ON approval_merge_request_rules USING btree (merge_request_id);
-CREATE UNIQUE INDEX backup_labels_group_id_project_id_title_idx ON backup_labels USING btree (group_id, project_id, title);
-
-CREATE INDEX backup_labels_group_id_title_idx ON backup_labels USING btree (group_id, title) WHERE (project_id = NULL::integer);
-
-CREATE INDEX backup_labels_project_id_idx ON backup_labels USING btree (project_id);
-
-CREATE INDEX backup_labels_template_idx ON backup_labels USING btree (template) WHERE template;
-
-CREATE INDEX backup_labels_title_idx ON backup_labels USING btree (title);
-
-CREATE INDEX backup_labels_type_project_id_idx ON backup_labels USING btree (type, project_id);
-
CREATE UNIQUE INDEX bulk_import_trackers_uniq_relation_by_entity ON bulk_import_trackers USING btree (bulk_import_entity_id, relation);
CREATE INDEX ci_builds_gitlab_monitor_metrics ON ci_builds USING btree (status, created_at, project_id) WHERE ((type)::text = 'Ci::Build'::text);
@@ -21277,6 +21543,8 @@ CREATE INDEX idx_container_repositories_on_exp_cleanup_status_and_start_date ON
CREATE INDEX idx_deployment_clusters_on_cluster_id_and_kubernetes_namespace ON deployment_clusters USING btree (cluster_id, kubernetes_namespace);
+CREATE INDEX idx_eaprpb_external_approval_rule_id ON external_approval_rules_protected_branches USING btree (external_approval_rule_id);
+
CREATE UNIQUE INDEX idx_environment_merge_requests_unique_index ON deployment_merge_requests USING btree (environment_id, merge_request_id);
CREATE INDEX idx_geo_con_rep_updated_events_on_container_repository_id ON geo_container_repository_updated_events USING btree (container_repository_id);
@@ -21317,7 +21585,9 @@ CREATE INDEX idx_mr_cc_diff_files_on_mr_cc_id_and_sha ON merge_request_context_c
CREATE UNIQUE INDEX idx_on_compliance_management_frameworks_namespace_id_name ON compliance_management_frameworks USING btree (namespace_id, name);
-CREATE INDEX idx_on_issues_where_service_desk_reply_to_is_not_null ON issues USING btree (id) WHERE (service_desk_reply_to IS NOT NULL);
+CREATE UNIQUE INDEX idx_on_external_approval_rules_project_id_external_url ON external_approval_rules USING btree (project_id, external_url);
+
+CREATE UNIQUE INDEX idx_on_external_approval_rules_project_id_name ON external_approval_rules USING btree (project_id, name);
CREATE INDEX idx_packages_build_infos_on_package_id ON packages_build_infos USING btree (package_id);
@@ -21347,6 +21617,8 @@ CREATE INDEX idx_projects_id_created_at_disable_overriding_approvers_true ON pro
CREATE INDEX idx_projects_on_repository_storage_last_repository_updated_at ON projects USING btree (id, repository_storage, last_repository_updated_at);
+CREATE UNIQUE INDEX idx_protected_branch_id_external_approval_rule_id ON external_approval_rules_protected_branches USING btree (protected_branch_id, external_approval_rule_id);
+
CREATE INDEX idx_repository_states_on_last_repository_verification_ran_at ON project_repository_states USING btree (project_id, last_repository_verification_ran_at) WHERE ((repository_verification_checksum IS NOT NULL) AND (last_repository_verification_failure IS NULL));
CREATE INDEX idx_repository_states_on_last_wiki_verification_ran_at ON project_repository_states USING btree (project_id, last_wiki_verification_ran_at) WHERE ((wiki_verification_checksum IS NOT NULL) AND (last_wiki_verification_failure IS NULL));
@@ -21363,9 +21635,9 @@ CREATE INDEX idx_security_scans_on_scan_type ON security_scans USING btree (scan
CREATE UNIQUE INDEX idx_serverless_domain_cluster_on_clusters_applications_knative ON serverless_domain_cluster USING btree (clusters_applications_knative_id);
-CREATE UNIQUE INDEX idx_vuln_fingerprints_on_occurrences_id_and_fingerprint ON vulnerability_finding_fingerprints USING btree (finding_id, fingerprint_sha256);
+CREATE UNIQUE INDEX idx_vuln_fingerprints_on_occurrences_id_and_fingerprint_sha256 ON vulnerability_finding_fingerprints USING btree (finding_id, fingerprint_sha256);
-CREATE UNIQUE INDEX idx_vuln_fingerprints_uniqueness ON vulnerability_finding_fingerprints USING btree (finding_id, algorithm_type, fingerprint_sha256);
+CREATE UNIQUE INDEX idx_vuln_fingerprints_uniqueness_fingerprint_sha256 ON vulnerability_finding_fingerprints USING btree (finding_id, algorithm_type, fingerprint_sha256);
CREATE UNIQUE INDEX idx_vulnerability_ext_issue_links_on_vulne_id_and_ext_issue ON vulnerability_external_issue_links USING btree (vulnerability_id, external_type, external_project_key, external_issue_key);
@@ -21519,6 +21791,10 @@ 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_jobs_by_batched_migration_id_and_id ON batched_background_migration_jobs USING btree (batched_background_migration_id, id);
+
+CREATE INDEX index_batched_migrations_on_job_table_and_column_name ON batched_background_migrations USING btree (job_class_name, table_name, column_name);
+
CREATE INDEX index_board_assignees_on_assignee_id ON board_assignees USING btree (assignee_id);
CREATE UNIQUE INDEX index_board_assignees_on_board_id_and_assignee_id ON board_assignees USING btree (board_id, assignee_id);
@@ -21561,6 +21837,8 @@ CREATE INDEX index_boards_epic_board_positions_on_scoped_relative_position ON bo
CREATE INDEX index_boards_epic_boards_on_group_id ON boards_epic_boards USING btree (group_id);
+CREATE INDEX index_boards_epic_list_user_preferences_on_epic_list_id ON boards_epic_list_user_preferences USING btree (epic_list_id);
+
CREATE INDEX index_boards_epic_lists_on_epic_board_id ON boards_epic_lists USING btree (epic_board_id);
CREATE UNIQUE INDEX index_boards_epic_lists_on_epic_board_id_and_label_id ON boards_epic_lists USING btree (epic_board_id, label_id) WHERE (list_type = 1);
@@ -21629,8 +21907,6 @@ CREATE INDEX index_ci_builds_metadata_on_build_id_and_id_and_interruptible ON ci
CREATE INDEX index_ci_builds_metadata_on_project_id ON ci_builds_metadata USING btree (project_id);
-CREATE INDEX index_ci_builds_on_artifacts_expire_at ON ci_builds USING btree (artifacts_expire_at) WHERE (artifacts_file <> ''::text);
-
CREATE INDEX index_ci_builds_on_auto_canceled_by_id ON ci_builds USING btree (auto_canceled_by_id);
CREATE INDEX index_ci_builds_on_commit_id_and_stage_idx_and_created_at ON ci_builds USING btree (commit_id, stage_idx, created_at);
@@ -21685,7 +21961,7 @@ CREATE INDEX index_ci_deleted_objects_on_pick_up_at ON ci_deleted_objects USING
CREATE INDEX index_ci_freeze_periods_on_project_id ON ci_freeze_periods USING btree (project_id);
-CREATE UNIQUE INDEX index_ci_group_variables_on_group_id_and_key ON ci_group_variables USING btree (group_id, key);
+CREATE UNIQUE INDEX index_ci_group_variables_on_group_id_and_key_and_environment ON ci_group_variables USING btree (group_id, key, environment_scope);
CREATE UNIQUE INDEX index_ci_instance_variables_on_key ON ci_instance_variables USING btree (key);
@@ -21793,8 +22069,6 @@ CREATE INDEX index_ci_runner_projects_on_runner_id ON ci_runner_projects USING b
CREATE INDEX index_ci_runners_on_contacted_at ON ci_runners USING btree (contacted_at);
-CREATE INDEX index_ci_runners_on_is_shared ON ci_runners USING btree (is_shared);
-
CREATE INDEX index_ci_runners_on_locked ON ci_runners USING btree (locked);
CREATE INDEX index_ci_runners_on_runner_type ON ci_runners USING btree (runner_type);
@@ -21937,6 +22211,8 @@ CREATE INDEX index_csv_issue_imports_on_project_id ON csv_issue_imports USING bt
CREATE INDEX index_csv_issue_imports_on_user_id ON csv_issue_imports USING btree (user_id);
+CREATE INDEX index_custom_emoji_on_creator_id ON custom_emoji USING btree (creator_id);
+
CREATE UNIQUE INDEX index_custom_emoji_on_namespace_id_and_name ON custom_emoji USING btree (namespace_id, name);
CREATE UNIQUE INDEX index_daily_build_group_report_results_unique_columns ON ci_daily_build_group_report_results USING btree (project_id, ref_path, date, group_name);
@@ -21995,6 +22271,8 @@ CREATE INDEX index_deployments_on_environment_id_and_id ON deployments USING btr
CREATE INDEX index_deployments_on_environment_id_and_iid_and_project_id ON deployments USING btree (environment_id, iid, project_id);
+CREATE INDEX index_deployments_on_environment_id_status_and_finished_at ON deployments USING btree (environment_id, status, finished_at);
+
CREATE INDEX index_deployments_on_environment_status_sha ON deployments USING btree (environment_id, status, sha);
CREATE INDEX index_deployments_on_id_and_status_and_created_at ON deployments USING btree (id, status, created_at);
@@ -22049,6 +22327,8 @@ CREATE UNIQUE INDEX index_design_user_mentions_on_note_id ON design_user_mention
CREATE UNIQUE INDEX index_diff_note_positions_on_note_id_and_diff_type ON diff_note_positions USING btree (note_id, diff_type);
+CREATE UNIQUE INDEX index_dora_daily_metrics_on_environment_id_and_date ON dora_daily_metrics USING btree (environment_id, date);
+
CREATE INDEX index_draft_notes_on_author_id ON draft_notes USING btree (author_id);
CREATE INDEX index_draft_notes_on_discussion_id ON draft_notes USING btree (discussion_id);
@@ -22079,12 +22359,18 @@ CREATE UNIQUE INDEX index_environments_on_project_id_and_name ON environments US
CREATE UNIQUE INDEX index_environments_on_project_id_and_slug ON environments USING btree (project_id, slug);
+CREATE INDEX index_environments_on_project_id_and_tier ON environments USING btree (project_id, tier) WHERE (tier IS NOT NULL);
+
CREATE INDEX index_environments_on_project_id_state_environment_type ON environments USING btree (project_id, state, environment_type);
CREATE INDEX index_environments_on_state_and_auto_stop_at ON environments USING btree (state, auto_stop_at) WHERE ((auto_stop_at IS NOT NULL) AND ((state)::text = 'available'::text));
+CREATE UNIQUE INDEX index_epic_board_list_preferences_on_user_and_list ON boards_epic_list_user_preferences USING btree (user_id, epic_list_id);
+
CREATE INDEX index_epic_issues_on_epic_id ON epic_issues USING btree (epic_id);
+CREATE INDEX index_epic_issues_on_epic_id_and_issue_id ON epic_issues USING btree (epic_id, issue_id);
+
CREATE UNIQUE INDEX index_epic_issues_on_issue_id ON epic_issues USING btree (issue_id);
CREATE INDEX index_epic_metrics ON epic_metrics USING btree (epic_id);
@@ -22347,12 +22633,12 @@ CREATE INDEX index_import_failures_on_project_id_not_null ON import_failures USI
CREATE INDEX index_imported_projects_on_import_type_creator_id_created_at ON projects USING btree (import_type, creator_id, created_at) WHERE (import_type IS NOT NULL);
-CREATE INDEX index_inc_mgmnt_oncall_participants_on_oncall_rotation_id ON incident_management_oncall_participants USING btree (oncall_rotation_id);
-
CREATE INDEX index_inc_mgmnt_oncall_participants_on_oncall_user_id ON incident_management_oncall_participants USING btree (user_id);
CREATE UNIQUE INDEX index_inc_mgmnt_oncall_participants_on_user_id_and_rotation_id ON incident_management_oncall_participants USING btree (user_id, oncall_rotation_id);
+CREATE INDEX index_inc_mgmnt_oncall_pcpnt_on_oncall_rotation_id_is_removed ON incident_management_oncall_participants USING btree (oncall_rotation_id, is_removed);
+
CREATE UNIQUE INDEX index_inc_mgmnt_oncall_rotations_on_oncall_schedule_id_and_id ON incident_management_oncall_rotations USING btree (oncall_schedule_id, id);
CREATE UNIQUE INDEX index_inc_mgmnt_oncall_rotations_on_oncall_schedule_id_and_name ON incident_management_oncall_rotations USING btree (oncall_schedule_id, name);
@@ -22385,7 +22671,7 @@ CREATE UNIQUE INDEX index_issuable_slas_on_issue_id ON issuable_slas USING btree
CREATE INDEX index_issue_assignees_on_user_id ON issue_assignees USING btree (user_id);
-CREATE UNIQUE INDEX index_issue_email_participants_on_issue_id_and_email ON issue_email_participants USING btree (issue_id, email);
+CREATE UNIQUE INDEX index_issue_email_participants_on_issue_id_and_lower_email ON issue_email_participants USING btree (issue_id, lower(email));
CREATE INDEX index_issue_links_on_source_id ON issue_links USING btree (source_id);
@@ -22441,6 +22727,8 @@ 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_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);
CREATE INDEX index_jira_connect_subscriptions_on_namespace_id ON jira_connect_subscriptions USING btree (namespace_id);
@@ -22775,6 +23063,8 @@ CREATE INDEX index_on_namespaces_lower_name ON namespaces USING btree (lower((na
CREATE INDEX index_on_namespaces_lower_path ON namespaces USING btree (lower((path)::text));
+CREATE INDEX index_on_pages_metadata_not_migrated ON project_pages_metadata USING btree (project_id) WHERE ((deployed = true) AND (pages_deployment_id IS NULL));
+
CREATE INDEX index_on_projects_lower_path ON projects USING btree (lower((path)::text));
CREATE INDEX index_on_routes_lower_path ON routes USING btree (lower((path)::text));
@@ -23429,7 +23719,9 @@ CREATE UNIQUE INDEX index_software_licenses_on_unique_name ON software_licenses
CREATE UNIQUE INDEX index_sop_configs_on_project_id ON security_orchestration_policy_configurations USING btree (project_id);
-CREATE UNIQUE INDEX index_sop_configs_on_security_policy_management_project_id ON security_orchestration_policy_configurations USING btree (security_policy_management_project_id);
+CREATE INDEX index_sop_configurations_project_id_policy_project_id ON security_orchestration_policy_configurations USING btree (security_policy_management_project_id, project_id);
+
+CREATE INDEX index_sprints_iterations_cadence_id ON sprints USING btree (iterations_cadence_id);
CREATE INDEX index_sprints_on_description_trigram ON sprints USING gin (description gin_trgm_ops);
@@ -23823,6 +24115,8 @@ CREATE UNIQUE INDEX term_agreements_unique_index ON term_agreements USING btree
CREATE INDEX tmp_idx_deduplicate_vulnerability_occurrences ON vulnerability_occurrences USING btree (project_id, report_type, location_fingerprint, primary_identifier_id, id);
+CREATE INDEX tmp_idx_on_namespaces_delayed_project_removal ON namespaces USING btree (id) WHERE (delayed_project_removal = true);
+
CREATE INDEX tmp_index_on_security_findings_scan_id ON security_findings USING btree (scan_id) WHERE (uuid IS NULL);
CREATE INDEX tmp_index_on_vulnerabilities_non_dismissed ON vulnerabilities USING btree (id) WHERE (state <> 2);
@@ -24107,6 +24401,8 @@ ALTER INDEX product_analytics_events_experimental_pkey ATTACH PARTITION gitlab_p
ALTER INDEX product_analytics_events_experimental_pkey ATTACH PARTITION gitlab_partitions_static.product_analytics_events_experimental_63_pkey;
+CREATE TRIGGER table_sync_trigger_b99eb6998c AFTER INSERT OR DELETE OR UPDATE ON web_hook_logs FOR EACH ROW EXECUTE PROCEDURE table_sync_function_29bc99d6db();
+
CREATE TRIGGER table_sync_trigger_ee39a25f9d AFTER INSERT OR DELETE OR UPDATE ON audit_events FOR EACH ROW EXECUTE PROCEDURE table_sync_function_2be879775d();
CREATE TRIGGER trigger_has_external_issue_tracker_on_delete AFTER DELETE ON services FOR EACH ROW WHEN ((((old.category)::text = 'issue_tracker'::text) AND (old.active = true) AND (old.project_id IS NOT NULL))) EXECUTE PROCEDURE set_has_external_issue_tracker();
@@ -24268,6 +24564,9 @@ ALTER TABLE ONLY namespaces
ALTER TABLE ONLY epics
ADD CONSTRAINT fk_3654b61b03 FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE CASCADE;
+ALTER TABLE ONLY sprints
+ ADD CONSTRAINT fk_365d1db505 FOREIGN KEY (iterations_cadence_id) REFERENCES iterations_cadences(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY push_event_payloads
ADD CONSTRAINT fk_36c74129da FOREIGN KEY (event_id) REFERENCES events(id) ON DELETE CASCADE;
@@ -24316,6 +24615,9 @@ ALTER TABLE ONLY path_locks
ALTER TABLE ONLY clusters_applications_prometheus
ADD CONSTRAINT fk_557e773639 FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE CASCADE;
+ALTER TABLE ONLY terraform_states
+ ADD CONSTRAINT fk_558901b030 FOREIGN KEY (locked_by_user_id) REFERENCES users(id) ON DELETE SET NULL;
+
ALTER TABLE ONLY merge_request_metrics
ADD CONSTRAINT fk_56067dcb44 FOREIGN KEY (target_project_id) REFERENCES projects(id) ON DELETE CASCADE;
@@ -24412,9 +24714,6 @@ ALTER TABLE ONLY vulnerabilities
ALTER TABLE ONLY labels
ADD CONSTRAINT fk_7de4989a69 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
-ALTER TABLE ONLY backup_labels
- ADD CONSTRAINT fk_7de4989a69 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
-
ALTER TABLE ONLY merge_requests
ADD CONSTRAINT fk_7e85395a64 FOREIGN KEY (sprint_id) REFERENCES sprints(id) ON DELETE CASCADE;
@@ -24487,6 +24786,9 @@ ALTER TABLE ONLY milestones
ALTER TABLE ONLY vulnerabilities
ADD CONSTRAINT fk_959d40ad0a FOREIGN KEY (confirmed_by_id) REFERENCES users(id) ON DELETE SET NULL;
+ALTER TABLE ONLY boards_epic_list_user_preferences
+ ADD CONSTRAINT fk_95eac55851 FOREIGN KEY (epic_list_id) REFERENCES boards_epic_lists(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY application_settings
ADD CONSTRAINT fk_964370041d FOREIGN KEY (usage_stats_set_by_user_id) REFERENCES users(id) ON DELETE SET NULL;
@@ -24640,6 +24942,12 @@ ALTER TABLE ONLY issues
ALTER TABLE ONLY issue_links
ADD CONSTRAINT fk_c900194ff2 FOREIGN KEY (source_id) REFERENCES issues(id) ON DELETE CASCADE;
+ALTER TABLE ONLY external_approval_rules_protected_branches
+ ADD CONSTRAINT fk_c9a037a926 FOREIGN KEY (external_approval_rule_id) REFERENCES external_approval_rules(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY external_approval_rules_protected_branches
+ ADD CONSTRAINT fk_ca2ffb55e6 FOREIGN KEY (protected_branch_id) REFERENCES protected_branches(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY experiment_subjects
ADD CONSTRAINT fk_ccc28f8ceb FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
@@ -24649,6 +24957,9 @@ ALTER TABLE ONLY todos
ALTER TABLE ONLY geo_event_log
ADD CONSTRAINT fk_cff7185ad2 FOREIGN KEY (reset_checksum_event_id) REFERENCES geo_reset_checksum_events(id) ON DELETE CASCADE;
+ALTER TABLE ONLY custom_emoji
+ ADD CONSTRAINT fk_custom_emoji_creator_id FOREIGN KEY (creator_id) REFERENCES users(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY bulk_import_entities
ADD CONSTRAINT fk_d06d023c30 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
@@ -24784,6 +25095,9 @@ ALTER TABLE ONLY design_management_designs_versions
ALTER TABLE ONLY analytics_devops_adoption_segments
ADD CONSTRAINT fk_f5aa768998 FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+ALTER TABLE ONLY boards_epic_list_user_preferences
+ ADD CONSTRAINT fk_f5f2fe5c1f FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY cluster_agents
ADD CONSTRAINT fk_f7d43dee13 FOREIGN KEY (created_by_user_id) REFERENCES users(id) ON DELETE SET NULL;
@@ -25012,6 +25326,9 @@ ALTER TABLE ONLY boards_epic_board_positions
ALTER TABLE ONLY geo_repository_created_events
ADD CONSTRAINT fk_rails_1f49e46a61 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+ALTER TABLE ONLY dora_daily_metrics
+ ADD CONSTRAINT fk_rails_1fd07aff6f FOREIGN KEY (environment_id) REFERENCES environments(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY boards_epic_lists
ADD CONSTRAINT fk_rails_1fe6b54909 FOREIGN KEY (label_id) REFERENCES labels(id) ON DELETE CASCADE;
@@ -25222,6 +25539,9 @@ ALTER TABLE ONLY ci_resources
ALTER TABLE ONLY clusters_applications_fluentd
ADD CONSTRAINT fk_rails_4319b1dcd2 FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE CASCADE;
+ALTER TABLE ONLY batched_background_migration_jobs
+ ADD CONSTRAINT fk_rails_432153b86d FOREIGN KEY (batched_background_migration_id) REFERENCES batched_background_migrations(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY operations_strategies_user_lists
ADD CONSTRAINT fk_rails_43241e8d29 FOREIGN KEY (strategy_id) REFERENCES operations_strategies(id) ON DELETE CASCADE;
@@ -25327,9 +25647,6 @@ ALTER TABLE ONLY geo_node_namespace_links
ALTER TABLE ONLY clusters_applications_knative
ADD CONSTRAINT fk_rails_54fc91e0a0 FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE CASCADE;
-ALTER TABLE ONLY terraform_states
- ADD CONSTRAINT fk_rails_558901b030 FOREIGN KEY (locked_by_user_id) REFERENCES users(id);
-
ALTER TABLE ONLY issuable_metric_images
ADD CONSTRAINT fk_rails_56417a5a7f FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE;
@@ -25927,9 +26244,6 @@ ALTER TABLE ONLY serverless_domain_cluster
ALTER TABLE ONLY labels
ADD CONSTRAINT fk_rails_c1ac5161d8 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
-ALTER TABLE ONLY backup_labels
- ADD CONSTRAINT fk_rails_c1ac5161d8 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
-
ALTER TABLE ONLY project_feature_usages
ADD CONSTRAINT fk_rails_c22a50024b FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
@@ -26143,6 +26457,9 @@ ALTER TABLE ONLY alert_management_alert_user_mentions
ALTER TABLE ONLY snippet_statistics
ADD CONSTRAINT fk_rails_ebc283ccf1 FOREIGN KEY (snippet_id) REFERENCES snippets(id) ON DELETE CASCADE;
+ALTER TABLE ONLY iterations_cadences
+ ADD CONSTRAINT fk_rails_ece400c55a FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY dast_profiles
ADD CONSTRAINT fk_rails_ed1e66fbbf FOREIGN KEY (dast_site_profile_id) REFERENCES dast_site_profiles(id) ON DELETE CASCADE;
@@ -26248,6 +26565,9 @@ ALTER TABLE ONLY ci_job_variables
ALTER TABLE ONLY packages_nuget_metadata
ADD CONSTRAINT fk_rails_fc0c19f5b4 FOREIGN KEY (package_id) REFERENCES packages_packages(id) ON DELETE CASCADE;
+ALTER TABLE ONLY external_approval_rules
+ ADD CONSTRAINT fk_rails_fd4f9ac573 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY experiment_users
ADD CONSTRAINT fk_rails_fd805f771a FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
diff --git a/doc/.vale/gitlab/Admin.yml b/doc/.vale/gitlab/Admin.yml
index d74621bde8e..560752594d5 100644
--- a/doc/.vale/gitlab/Admin.yml
+++ b/doc/.vale/gitlab/Admin.yml
@@ -6,7 +6,7 @@
# For a list of all options, see https://errata-ai.gitbook.io/vale/getting-started/styles
extends: substitution
message: 'Verify this use of the word "admin". Can it be updated to "administration", "administrator", "administer", or "Admin Area"?'
-link: https://docs.gitlab.com/ee/development/documentation/styleguide.html
+link: https://docs.gitlab.com/ee/development/documentation/styleguide/index.html
level: suggestion
ignorecase: true
swap:
diff --git a/doc/.vale/gitlab/AlertBoxStyle.yml b/doc/.vale/gitlab/AlertBoxStyle.yml
index 92c3a16cab8..5912c4707fd 100644
--- a/doc/.vale/gitlab/AlertBoxStyle.yml
+++ b/doc/.vale/gitlab/AlertBoxStyle.yml
@@ -10,7 +10,7 @@
# For a list of all options, see https://errata-ai.gitbook.io/vale/getting-started/styles
extends: existence
message: 'Alert box "%s" must use the formatting in the style guide.'
-link: https://docs.gitlab.com/ee/development/documentation/styleguide.html#alert-boxes
+link: https://docs.gitlab.com/ee/development/documentation/styleguide/index.html#alert-boxes
level: error
nonword: true
scope: raw
diff --git a/doc/.vale/gitlab/BadgeCapitalization.yml b/doc/.vale/gitlab/BadgeCapitalization.yml
index 3da5831ed56..89d6f509d63 100644
--- a/doc/.vale/gitlab/BadgeCapitalization.yml
+++ b/doc/.vale/gitlab/BadgeCapitalization.yml
@@ -10,35 +10,4 @@ link: https://docs.gitlab.com/ee/development/documentation/styleguide/index.html
level: error
scope: raw
raw:
- - '(\*\*\(Core\)\*\*|'
- - '\*\*\(core\)\*\*|'
- - '\*\*\(Starter\)\*\*|'
- - '\*\*\(starter\)\*\*|'
- - '\*\*\(Premium\)\*\*|'
- - '\*\*\(premium\)\*\*|'
- - '\*\*\(Ultimate\)\*\*|'
- - '\*\*\(ultimate\)\*\*|'
- - '\*\*\(Core Only\)\*\*|'
- - '\*\*\(Core only\)\*\*|'
- - '\*\*\(core only\)\*\*|'
- - '\*\*\(Starter Only\)\*\*|'
- - '\*\*\(Starter only\)\*\*|'
- - '\*\*\(starter only\)\*\*|'
- - '\*\*\(Premium Only\)\*\*|'
- - '\*\*\(Premium only\)\*\*|'
- - '\*\*\(premium only\)\*\*|'
- - '\*\*\(Ultimate Only\)\*\*|'
- - '\*\*\(Ultimate only\)\*\*|'
- - '\*\*\(ultimate only\)\*\*|'
- - '\*\*\(Free Only\)\*\*|'
- - '\*\*\(Free only\)\*\*|'
- - '\*\*\(free only\)\*\*|'
- - '\*\*\(Bronze Only\)\*\*|'
- - '\*\*\(Bronze only\)\*\*|'
- - '\*\*\(bronze only\)\*\*|'
- - '\*\*\(Silver Only\)\*\*|'
- - '\*\*\(Silver only\)\*\*|'
- - '\*\*\(silver only\)\*\*|'
- - '\*\*\(Gold Only\)\*\*|'
- - '\*\*\(Gold only\)\*\*|'
- - '\*\*\(gold only\)\*\*)'
+ - '\*\*\(([Ff]ree|[Pp]remium|[Uu]ltimate)( [Ss](elf|ass))?\)\*\*'
diff --git a/doc/.vale/gitlab/DefaultBranch.yml b/doc/.vale/gitlab/DefaultBranch.yml
new file mode 100644
index 00000000000..4bc68433c6d
--- /dev/null
+++ b/doc/.vale/gitlab/DefaultBranch.yml
@@ -0,0 +1,14 @@
+---
+# Warning: gitlab.DefaultBranch
+#
+# Do not refer to the default branch as the "master" branch, if possible.
+#
+# For a list of all options, see https://errata-ai.gitbook.io/vale/getting-started/styles
+extends: existence
+message: 'Use "default branch" or `main` instead of `master`, when possible.'
+level: warning
+ignorecase: true
+link: https://docs.gitlab.com/ee/development/documentation/styleguide/index.html
+scope: raw
+raw:
+ - '\`master\`'
diff --git a/doc/.vale/gitlab/RelativeLinksDoubleSlashes.yml b/doc/.vale/gitlab/RelativeLinksDoubleSlashes.yml
new file mode 100644
index 00000000000..ce6ce8b5691
--- /dev/null
+++ b/doc/.vale/gitlab/RelativeLinksDoubleSlashes.yml
@@ -0,0 +1,13 @@
+---
+# Error: gitlab.RelativeLinksDoubleSlashes
+#
+# Checks for the presence of double slashes in relative URLs.
+#
+# For a list of all options, see https://errata-ai.gitbook.io/vale/getting-started/styles
+extends: existence
+message: 'Relative links must not include a double slash.'
+link: https://docs.gitlab.com/ee/development/documentation/styleguide/index.html#links-to-internal-documentation
+level: error
+scope: raw
+raw:
+ - '\.//'
diff --git a/doc/.vale/gitlab/SubstitutionSuggestions.yml b/doc/.vale/gitlab/SubstitutionSuggestions.yml
index eac738d9eec..d2b8b37b301 100644
--- a/doc/.vale/gitlab/SubstitutionSuggestions.yml
+++ b/doc/.vale/gitlab/SubstitutionSuggestions.yml
@@ -14,6 +14,7 @@ swap:
active user: '"billable user"'
active users: '"billable users"'
docs: '"documentation"'
+ GFM: '"GitLab Flavored Markdown"'
once that: '"after that"'
once the: '"after the"'
once you: '"after you"'
diff --git a/doc/.vale/gitlab/spelling-exceptions.txt b/doc/.vale/gitlab/spelling-exceptions.txt
index 375cecfdee4..88d1d2555f1 100644
--- a/doc/.vale/gitlab/spelling-exceptions.txt
+++ b/doc/.vale/gitlab/spelling-exceptions.txt
@@ -41,6 +41,7 @@ autoscales
autoscaling
awardable
awardables
+Ayoa
Axios
Azure
B-tree
@@ -56,6 +57,7 @@ backtracing
badging
Bamboo
Bazel
+Bhyve
Bitbucket
blockquote
blockquoted
@@ -89,6 +91,7 @@ Certbot
changeset
changesets
chai
+ChaosKube
chatbot
chatbots
ChatOps
@@ -111,6 +114,8 @@ Contentful
Corosync
Coursier
cron
+cronjob
+cronjobs
crons
crontab
crontabs
@@ -122,6 +127,8 @@ CrowdIn
CSV
cybersecurity
Dangerfile
+datasource
+datasources
datetime
Debian
Decompressor
@@ -280,6 +287,7 @@ kaniko
Karma
Kerberos
keyset
+keyspace
keytab
keytabs
Kibana
@@ -350,6 +358,7 @@ mixins
mockup
mockups
ModSecurity
+Monokai
monorepo
monorepos
multiline
@@ -373,6 +382,7 @@ nullable
Nurtch
nyc
OAuth
+Octokit
offboarded
offboarding
offboards
@@ -404,9 +414,11 @@ Poedit
polyfill
polyfills
pooler
+postfixed
postgres.ai
PostgreSQL
precompile
+precompiled
preconfigure
preconfigured
preconfigures
@@ -421,6 +433,7 @@ prepend
prepended
prepending
prepends
+prepopulated
Prettifier
Pritaly
Priyanka
@@ -443,6 +456,7 @@ queryable
Quicktime
Rackspace
Raspbian
+rbtrace
Rdoc
reachability
Realplayer
@@ -477,6 +491,7 @@ reinitialize
reinitializing
relicensing
remediations
+replicables
repmgr
repmgrd
repurposing
@@ -519,10 +534,12 @@ Salesforce
sandboxing
sanitization
sbt
+scalers
scatterplot
scatterplots
Schemastore
scrollable
+Semgrep
Sendmail
Sentry
serializer
@@ -538,11 +555,13 @@ Sidekiq
Silverlight
Sisense
Sitespeed
+skippable
Slack
Slackbot
Slony
smartcard
smartcards
+snapshotting
Sobelow
Solarized
Sourcegraph
@@ -561,6 +580,9 @@ strace
strikethrough
strikethroughs
stunnel
+stylelint
+subchart
+subcharts
subfolder
subfolders
subgraph
@@ -620,12 +642,14 @@ todos
tokenizer
Tokenizers
tokenizing
+tolerations
toolchain
toolchains
toolkit
toolkits
tooltip
tooltips
+transactionally
transpile
transpiled
transpiles
@@ -634,6 +658,7 @@ Trello
triaged
triages
triaging
+Trivy
truthy
Truststore
Twilio
@@ -665,6 +690,9 @@ unencoded
unencoder
unencodes
unencrypted
+unfollow
+unfollowed
+unfollows
Unicorn
unindexed
unlink
@@ -703,6 +731,7 @@ unreplicated
unresolve
unresolved
unresolving
+unreviewed
unsanitized
unschedule
unscoped
@@ -720,6 +749,7 @@ unstash
unstashed
unstashing
unsynced
+unsynchronized
untarred
untracked
untrusted
@@ -772,3 +802,4 @@ Yubico
Zeitwerk
Zendesk
zsh
+Zstandard
diff --git a/doc/README.md b/doc/README.md
index 4c4b0cd3a15..8dd6354b388 100644
--- a/doc/README.md
+++ b/doc/README.md
@@ -67,7 +67,7 @@ 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. |
-| [GitLab workflow overview](https://about.gitlab.com/blog/2016/10/25/gitlab-workflow-an-overview/) | Enhance your workflow with the best of GitLab Workflow. |
+| [GitLab workflow overview](https://about.gitlab.com/topics/version-control/what-is-gitlab-workflow/) | Enhance your workflow with the best of GitLab Workflow. |
| [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). |
diff --git a/doc/administration/audit_events.md b/doc/administration/audit_events.md
index d5755474c00..9aa533d54f6 100644
--- a/doc/administration/audit_events.md
+++ b/doc/administration/audit_events.md
@@ -167,7 +167,7 @@ It may make the user interface for your project or audit events very busy, and t
to prevent performance degradations on GitLab instances with very high Git write traffic.
In an upcoming release, Audit Events for Git push events will be enabled
-by default. Follow [#7865](https://gitlab.com/gitlab-org/gitlab/-/issues/7865) for updates.
+by default. Follow our [Partitioning strategy for Audit Events epic](https://gitlab.com/groups/gitlab-org/-/epics/3206) for updates.
If you still wish to enable **Repository push** events in your instance, follow
the steps bellow.
diff --git a/doc/administration/auth/img/okta_admin_panel.png b/doc/administration/auth/img/okta_admin_panel.png
deleted file mode 100644
index 12e21956715..00000000000
--- a/doc/administration/auth/img/okta_admin_panel.png
+++ /dev/null
Binary files differ
diff --git a/doc/administration/auth/ldap/google_secure_ldap.md b/doc/administration/auth/ldap/google_secure_ldap.md
index 2b75d864352..55ccf6653a3 100644
--- a/doc/administration/auth/ldap/google_secure_ldap.md
+++ b/doc/administration/auth/ldap/google_secure_ldap.md
@@ -20,7 +20,7 @@ The steps below cover:
## Configuring Google LDAP client
-1. Navigate to <https://admin.google.com/Dashboard> and sign in as a Google Workspace domain administrator.
+1. Go to <https://admin.google.com/Dashboard> and sign in as a Google Workspace domain administrator.
1. Go to **Apps > LDAP > Add Client**.
diff --git a/doc/administration/auth/ldap/index.md b/doc/administration/auth/ldap/index.md
index 466ae8e108c..0e55efba8ae 100644
--- a/doc/administration/auth/ldap/index.md
+++ b/doc/administration/auth/ldap/index.md
@@ -180,9 +180,16 @@ production:
| `allow_username_or_email_login` | If enabled, GitLab ignores everything after the first `@` in the LDAP username submitted by the user on sign-in. If you are using `uid: 'userPrincipalName'` on ActiveDirectory you need to disable this setting, because the userPrincipalName contains an `@`. | no | boolean |
| `block_auto_created_users` | To maintain tight control over the number of billable users on your GitLab installation, enable this setting to keep new users blocked until they have been cleared by an administrator (default: false). | no | boolean |
| `base` | Base where we can search for users. | yes | `'ou=people,dc=gitlab,dc=example'` or `'DC=mydomain,DC=com'` |
-| `user_filter` | Filter LDAP users. Format: [RFC 4515](https://tools.ietf.org/search/rfc4515) Note: GitLab does not support `omniauth-ldap`'s custom filter syntax. | no | `'(employeeType=developer)'` or `'(&(objectclass=user)(|(samaccountname=momo)(samaccountname=toto)))'` |
+| `user_filter` | Filter LDAP users. Format: [RFC 4515](https://tools.ietf.org/search/rfc4515) Note: GitLab does not support `omniauth-ldap`'s custom filter syntax. | no | For examples, read [Examples of user filters](#examples-of-user-filters). |
| `lowercase_usernames` | If lowercase_usernames is enabled, GitLab converts the name to lower case. | no | boolean |
+#### Examples of user filters
+
+Some examples of the `user_filter` field syntax:
+
+- `'(employeeType=developer)'`
+- `'(&(objectclass=user)(|(samaccountname=momo)(samaccountname=toto)))'`
+
### SSL Configuration Settings **(FREE SELF)**
| Setting | Description | Required | Examples |
@@ -469,8 +476,8 @@ be mandatory and clients cannot be authenticated with the TLS protocol.
## Multiple LDAP servers **(PREMIUM SELF)**
-With GitLab Enterprise Edition Starter, you can configure multiple LDAP servers
-that your GitLab instance connects to.
+With GitLab, you can configure multiple LDAP servers that your GitLab instance
+connects to.
To add another LDAP server:
@@ -698,8 +705,8 @@ When enabled, the following applies:
To enable it you need to:
1. [Enable LDAP](#configuration)
-1. Navigate to **Admin Area > Settings -> Visibility and access controls**.
-1. Make sure the "Lock memberships to LDAP synchronization" checkbox is enabled.
+1. Go to **Admin Area > Settings > Visibility and access controls**.
+1. Make sure the **Lock memberships to LDAP synchronization** checkbox is selected.
### Adjusting LDAP group sync schedule **(PREMIUM SELF)**
diff --git a/doc/administration/auth/ldap/ldap-troubleshooting.md b/doc/administration/auth/ldap/ldap-troubleshooting.md
index 438f591856b..f68a1170e71 100644
--- a/doc/administration/auth/ldap/ldap-troubleshooting.md
+++ b/doc/administration/auth/ldap/ldap-troubleshooting.md
@@ -330,10 +330,10 @@ things to check to debug the situation.
group](index.md#adding-group-links).
- Check that the user has an LDAP identity:
1. Sign in to GitLab as an administrator user.
- 1. Navigate to **Admin area -> Users**.
+ 1. Go to **Admin area > Users**.
1. Search for the user
- 1. Open the user, by clicking on their name. Do not click 'Edit'.
- 1. Navigate to the **Identities** tab. There should be an LDAP identity with
+ 1. Open the user by clicking their name. Do not click **Edit**.
+ 1. Select the **Identities** tab. There should be an LDAP identity with
an LDAP DN as the 'Identifier'. If not, this user hasn't signed in with
LDAP yet and must do so first.
- You've waited an hour or [the configured
diff --git a/doc/administration/compliance.md b/doc/administration/compliance.md
index 721b0dbb957..04369a76fb3 100644
--- a/doc/administration/compliance.md
+++ b/doc/administration/compliance.md
@@ -20,7 +20,7 @@ relevant compliance standards.
|**[Enforce TOS acceptance](../user/admin_area/settings/terms.md)**<br>Enforce your users accepting new terms of service by blocking GitLab traffic.|Free+||Instance|
|**[Email all users of a project, group, or entire server](../tools/email.md)**<br>An administrator can email groups of users based on project or group membership, or email everyone using the GitLab instance. This is great for scheduled maintenance or upgrades.|Premium+||Instance|
|**[Omnibus package supports log forwarding](https://docs.gitlab.com/omnibus/settings/logs.html#udp-log-forwarding)**<br>Forward your logs to a central system.|Premium+||Instance|
-|**[Lock project membership to group](../user/group/index.md#member-lock)**<br>Group owners can prevent new members from being added to projects within a group.|Premium+|✓|Group|
+|**[Lock project membership to group](../user/group/index.md#prevent-members-from-being-added-to-a-group)**<br>Group owners can prevent new members from being added to projects within a group.|Premium+|✓|Group|
|**[LDAP group sync](auth/ldap/index.md#group-sync)**<br>GitLab Enterprise Edition gives administrators the ability to automatically sync groups and manage SSH keys, permissions, and authentication, so you can focus on building your product, not configuring your tools.|Premium+||Instance|
|**[LDAP group sync filters](auth/ldap/index.md#group-sync)**<br>GitLab Enterprise Edition Premium gives more flexibility to synchronize with LDAP based on filters, meaning you can leverage LDAP attributes to map GitLab permissions.|Premium+||Instance|
|**[Audit events](audit_events.md)**<br>To maintain the integrity of your code, GitLab Enterprise Edition Premium gives administrators the ability to view any modifications made within the GitLab server in an advanced audit events system, so you can control, analyze, and track every change.|Premium+|✓|Instance, Group, Project|
diff --git a/doc/administration/consul.md b/doc/administration/consul.md
index dfc859e30c2..926267a414a 100644
--- a/doc/administration/consul.md
+++ b/doc/administration/consul.md
@@ -146,7 +146,7 @@ sudo gitlab-ctl restart consul
### Consul nodes unable to communicate
By default, Consul will attempt to
-[bind](https://www.consul.io/docs/agent/options.html#_bind) to `0.0.0.0`, but
+[bind](https://www.consul.io/docs/agent/options#_bind) to `0.0.0.0`, but
it will advertise the first private IP address on the node for other Consul nodes
to communicate with it. If the other nodes cannot communicate with a node on
this address, then the cluster will have a failed status.
diff --git a/doc/administration/feature_flags.md b/doc/administration/feature_flags.md
index 55727822654..6882797064b 100644
--- a/doc/administration/feature_flags.md
+++ b/doc/administration/feature_flags.md
@@ -13,7 +13,7 @@ to deploy features in an early stage of development so that they can be
incrementally rolled out.
Before making them permanently available, features can be deployed behind
-flags for a [number of reasons](../development/feature_flags/index.md#when-to-use-feature-flags), such as:
+flags for a [number of reasons](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle#when-to-use-feature-flags), such as:
- To test the feature.
- To get feedback from users and customers while in an early stage of the development of the feature.
diff --git a/doc/administration/geo/disaster_recovery/background_verification.md b/doc/administration/geo/disaster_recovery/background_verification.md
index f573b64b5f1..8d3745130bd 100644
--- a/doc/administration/geo/disaster_recovery/background_verification.md
+++ b/doc/administration/geo/disaster_recovery/background_verification.md
@@ -58,14 +58,14 @@ Feature.enable('geo_repository_verification')
## Repository verification
-Navigate to the **Admin Area > Geo** dashboard on the **primary** node and expand
+Go to the **Admin Area > Geo** dashboard on the **primary** node and expand
the **Verification information** tab for that node to view automatic checksumming
status for repositories and wikis. Successes are shown in green, pending work
in gray, and failures in red.
![Verification status](img/verification-status-primary.png)
-Navigate to the **Admin Area > Geo** dashboard on the **secondary** node and expand
+Go to the **Admin Area > Geo** dashboard on the **secondary** node and expand
the **Verification information** tab for that node to view automatic verification
status for repositories and wikis. As with checksumming, successes are shown in
green, pending work in gray, and failures in red.
@@ -92,7 +92,7 @@ data. The default and recommended re-verification interval is 7 days, though
an interval as short as 1 day can be set. Shorter intervals reduce risk but
increase load and vice versa.
-Navigate to the **Admin Area > Geo** dashboard on the **primary** node, and
+Go to the **Admin Area > Geo** dashboard on the **primary** node, and
click the **Edit** button for the **primary** node to customize the minimum
re-verification interval:
@@ -141,7 +141,7 @@ sudo gitlab-rake geo:verification:wiki:reset
If the **primary** and **secondary** nodes have a checksum verification mismatch, the cause may not be apparent. To find the cause of a checksum mismatch:
-1. Navigate to the **Admin Area > Overview > Projects** dashboard on the **primary** node, find the
+1. Go to the **Admin Area > Overview > Projects** dashboard on the **primary** node, find the
project that you want to check the checksum differences and click on the
**Edit** button:
![Projects dashboard](img/checksum-differences-admin-projects.png)
@@ -149,7 +149,7 @@ If the **primary** and **secondary** nodes have a checksum verification mismatch
1. On the project administration page get the **Gitaly storage name**, and **Gitaly relative path**:
![Project administration page](img/checksum-differences-admin-project-page.png)
-1. Navigate to the project's repository directory on both **primary** and **secondary** nodes
+1. Go to the project's repository directory on both **primary** and **secondary** nodes
(the path is usually `/var/opt/gitlab/git-data/repositories`). Note that if `git_data_dirs`
is customized, check the directory layout on your server to be sure.
diff --git a/doc/administration/geo/disaster_recovery/planned_failover.md b/doc/administration/geo/disaster_recovery/planned_failover.md
index e64d0d4983e..96c6482e3db 100644
--- a/doc/administration/geo/disaster_recovery/planned_failover.md
+++ b/doc/administration/geo/disaster_recovery/planned_failover.md
@@ -110,7 +110,7 @@ The maintenance window won't end until Geo replication and verification is
completely finished. To keep the window as short as possible, you should
ensure these processes are close to 100% as possible during active use.
-Navigate to the **Admin Area > Geo** dashboard on the **secondary** node to
+Go to the **Admin Area > Geo** dashboard on the **secondary** node to
review status. Replicated objects (shown in green) should be close to 100%,
and there should be no failures (shown in red). If a large proportion of
objects aren't yet replicated (shown in gray), consider giving the node more
diff --git a/doc/administration/geo/glossary.md b/doc/administration/geo/glossary.md
index e9d57284dd2..98a29c27a89 100644
--- a/doc/administration/geo/glossary.md
+++ b/doc/administration/geo/glossary.md
@@ -23,7 +23,7 @@ these definitions yet.
|---------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------|-------------------------------------------------|
| Node | An individual server that runs GitLab either with a specific role or as a whole (e.g. a Rails application node). In a cloud context this can be a specific machine type. | GitLab | instance, server |
| Site | One or a collection of nodes running a single GitLab application. A site can be single-node or multi-node. | GitLab | deployment, installation instance |
-| Single-node site | A specific configuration of GitLab that uses exactly one node. | GitLab | single-server, single-instance
+| Single-node site | A specific configuration of GitLab that uses exactly one node. | GitLab | single-server, single-instance
| Multi-node site | A specific configuration of GitLab that uses more than one node. | GitLab | multi-server, multi-instance, high availability |
| Primary site | A GitLab site that is configured to be read and writable. There can only be a single primary site. | Geo-specific | Geo deployment, Primary node |
| Secondary site(s) | GitLab site that is configured to be read-only. There can be one or more secondary sites. | Geo-specific | Geo deployment, Secondary node |
diff --git a/doc/administration/geo/replication/configuration.md b/doc/administration/geo/replication/configuration.md
index 154815efa51..7dbb0c78166 100644
--- a/doc/administration/geo/replication/configuration.md
+++ b/doc/administration/geo/replication/configuration.md
@@ -252,7 +252,7 @@ on the **secondary** node.
Geo synchronizes repositories over HTTP/HTTPS, and therefore requires this clone
method to be enabled. This is enabled by default, but if converting an existing node to Geo it should be checked:
-1. Navigate to **Admin Area > Settings** (`/admin/application_settings/general`) on the **primary** node.
+1. Go to **Admin Area > Settings** (`/admin/application_settings/general`) on the **primary** node.
1. Expand "Visibility and access controls".
1. Ensure "Enabled Git access protocols" is set to either "Both SSH and HTTP(S)" or "Only HTTP(S)".
diff --git a/doc/administration/geo/replication/datatypes.md b/doc/administration/geo/replication/datatypes.md
index f2913dd55ce..293417c9c64 100644
--- a/doc/administration/geo/replication/datatypes.md
+++ b/doc/administration/geo/replication/datatypes.md
@@ -45,8 +45,8 @@ verification methods:
| Blobs | Archived CI build traces _(object storage)_ | Geo with API/Managed (*2*) | _Not implemented_ |
| Blobs | Container registry _(file system)_ | Geo with API/Docker API | _Not implemented_ |
| Blobs | Container registry _(object storage)_ | Geo with API/Managed/Docker API (*2*) | _Not implemented_ |
-| Blobs | Package registry _(file system)_ | Geo with API | _Not implemented_ |
-| Blobs | Package registry _(object storage)_ | Geo with API/Managed (*2*) | _Not implemented_ |
+| Blobs | Package registry _(file system)_ | Geo with API | SHA256 checksum |
+| Blobs | Package registry _(object storage)_ | Geo with API/Managed (*2*) | SHA256 checksum |
| Blobs | Versioned Terraform State _(file system)_ | Geo with API | _Not implemented_ |
| Blobs | Versioned Terraform State _(object storage)_ | Geo with API/Managed (*2*) | _Not implemented_ |
| Blobs | External Merge Request Diffs _(file system)_ | Geo with API | _Not implemented_ |
@@ -118,7 +118,7 @@ We use PostgreSQL's own replication functionality to replicate data from the **p
We use Redis both as a cache store and to hold persistent data for our background jobs system. Because both
use-cases has data that are exclusive to the same Geo node, we don't replicate it between nodes.
-Elasticsearch is an optional database, that can enable advanced searching capabilities, like improved Global Search
+Elasticsearch is an optional database, that can enable advanced searching capabilities, like improved Advanced Search
in both source-code level and user generated content in Issues / Merge-Requests and discussions. Currently it's not
supported in Geo.
@@ -178,21 +178,21 @@ successfully, you must replicate their data using some other means.
| [Group wiki repository](../../../user/group/index.md#group-wikis) | [No](https://gitlab.com/gitlab-org/gitlab/-/issues/208147) | [No](https://gitlab.com/gitlab-org/gitlab/-/issues/208147) | No | |
| [Uploads](../../uploads.md) | **Yes** (10.2) | [No](https://gitlab.com/groups/gitlab-org/-/epics/1817) | No | Verified only on transfer or manually using [Integrity Check Rake Task](../../raketasks/check.md) on both nodes and comparing the output between them. |
| [LFS objects](../../lfs/index.md) | **Yes** (10.2) | [No](https://gitlab.com/gitlab-org/gitlab/-/issues/8922) | Via Object Storage provider if supported. Native Geo support (Beta). | Verified only on transfer or manually using [Integrity Check Rake Task](../../raketasks/check.md) on both nodes and comparing the output between them. GitLab versions 11.11.x and 12.0.x are affected by [a bug that prevents any new LFS objects from replicating](https://gitlab.com/gitlab-org/gitlab/-/issues/32696). |
-| [Personal snippets](../../../user/snippets.md#personal-snippets) | **Yes** (10.2) | **Yes** (10.2) | No | |
-| [Project snippets](../../../user/snippets.md#project-snippets) | **Yes** (10.2) | **Yes** (10.2) | No | |
+| [Personal snippets](../../../user/snippets.md) | **Yes** (10.2) | **Yes** (10.2) | No | |
+| [Project snippets](../../../user/snippets.md) | **Yes** (10.2) | **Yes** (10.2) | No | |
| [CI job artifacts (other than Job Logs)](../../../ci/pipelines/job_artifacts.md) | **Yes** (10.4) | [No](https://gitlab.com/gitlab-org/gitlab/-/issues/8923) | Via Object Storage provider if supported. Native Geo support (Beta) . | Verified only manually using [Integrity Check Rake Task](../../raketasks/check.md) on both nodes and comparing the output between them |
| [Job logs](../../job_logs.md) | **Yes** (10.4) | [No](https://gitlab.com/gitlab-org/gitlab/-/issues/8923) | Via Object Storage provider if supported. Native Geo support (Beta). | Verified only on transfer or manually using [Integrity Check Rake Task](../../raketasks/check.md) on both nodes and comparing the output between them |
| [Object pools for forked project deduplication](../../../development/git_object_deduplication.md) | **Yes** | No | No | |
| [Container Registry](../../packages/container_registry.md) | **Yes** (12.3) | No | No | Disabled by default. See [instructions](docker_registry.md) to enable. |
| [Content in object storage (beta)](object_storage.md) | **Yes** (12.4) | [No](https://gitlab.com/gitlab-org/gitlab/-/issues/13845) | No | |
| [Project designs repository](../../../user/project/issues/design_management.md) | **Yes** (12.7) | [No](https://gitlab.com/gitlab-org/gitlab/-/issues/32467) | Via Object Storage provider if supported. Native Geo support (Beta). | |
-| [Package Registry for npm](../../../user/packages/npm_registry/index.md) | **Yes** (13.2) | [No](https://gitlab.com/groups/gitlab-org/-/epics/1817) | Via Object Storage provider if supported. Native Geo support (Beta). | Behind feature flag `geo_package_file_replication`, enabled by default |
-| [Package Registry for Maven](../../../user/packages/maven_repository/index.md) | **Yes** (13.2) | [No](https://gitlab.com/groups/gitlab-org/-/epics/1817) | Via Object Storage provider if supported. Native Geo support (Beta). | Behind feature flag `geo_package_file_replication`, enabled by default |
-| [Package Registry for Conan](../../../user/packages/conan_repository/index.md) | **Yes** (13.2) | [No](https://gitlab.com/groups/gitlab-org/-/epics/1817) | Via Object Storage provider if supported. Native Geo support (Beta). | Behind feature flag `geo_package_file_replication`, enabled by default |
-| [Package Registry for NuGet](../../../user/packages/nuget_repository/index.md) | **Yes** (13.2) | [No](https://gitlab.com/groups/gitlab-org/-/epics/1817) | Via Object Storage provider if supported. Native Geo support (Beta). | Behind feature flag `geo_package_file_replication`, enabled by default |
-| [Package Registry for PyPI](../../../user/packages/pypi_repository/index.md) | **Yes** (13.2) | [No](https://gitlab.com/groups/gitlab-org/-/epics/1817) | Via Object Storage provider if supported. Native Geo support (Beta). | Behind feature flag `geo_package_file_replication`, enabled by default |
-| [Package Registry for Composer](../../../user/packages/composer_repository/index.md) | **Yes** (13.2) | [No](https://gitlab.com/groups/gitlab-org/-/epics/1817) | Via Object Storage provider if supported. Native Geo support (Beta). | Behind feature flag `geo_package_file_replication`, enabled by default |
-| [Package Registry for generic packages](../../../user/packages/generic_packages/index.md) | **Yes** (13.5) | [No](https://gitlab.com/groups/gitlab-org/-/epics/1817) | Via Object Storage provider if supported. Native Geo support (Beta). | Behind feature flag `geo_package_file_replication`, enabled by default |
+| [Package Registry for npm](../../../user/packages/npm_registry/index.md) | **Yes** (13.2) | **Yes** (13.10) | Via Object Storage provider if supported. Native Geo support (Beta). | Behind feature flag `geo_package_file_replication`, enabled by default |
+| [Package Registry for Maven](../../../user/packages/maven_repository/index.md) | **Yes** (13.2) | **Yes** (13.10) | Via Object Storage provider if supported. Native Geo support (Beta). | Behind feature flag `geo_package_file_replication`, enabled by default |
+| [Package Registry for Conan](../../../user/packages/conan_repository/index.md) | **Yes** (13.2) | **Yes** (13.10) | Via Object Storage provider if supported. Native Geo support (Beta). | Behind feature flag `geo_package_file_replication`, enabled by default |
+| [Package Registry for NuGet](../../../user/packages/nuget_repository/index.md) | **Yes** (13.2) | **Yes** (13.10) | Via Object Storage provider if supported. Native Geo support (Beta). | Behind feature flag `geo_package_file_replication`, enabled by default |
+| [Package Registry for PyPI](../../../user/packages/pypi_repository/index.md) | **Yes** (13.2) | **Yes** (13.10) | Via Object Storage provider if supported. Native Geo support (Beta). | Behind feature flag `geo_package_file_replication`, enabled by default |
+| [Package Registry for Composer](../../../user/packages/composer_repository/index.md) | **Yes** (13.2) | **Yes** (13.10) | Via Object Storage provider if supported. Native Geo support (Beta). | Behind feature flag `geo_package_file_replication`, enabled by default |
+| [Package Registry for generic packages](../../../user/packages/generic_packages/index.md) | **Yes** (13.5) | **Yes** (13.10) | Via Object Storage provider if supported. Native Geo support (Beta). | Behind feature flag `geo_package_file_replication`, enabled by default |
| [Versioned Terraform State](../../terraform_state.md) | **Yes** (13.5) | No | Via Object Storage provider if supported. Native Geo support (Beta). | Behind feature flag `geo_terraform_state_version_replication`, enabled by default |
| [External merge request diffs](../../merge_request_diffs.md) | **Yes** (13.5) | No | Via Object Storage provider if supported. Native Geo support (Beta). | Behind feature flag `geo_merge_request_diff_replication`, enabled by default |
| [Versioned snippets](../../../user/snippets.md#versioned-snippets) | [**Yes** (13.7)](https://gitlab.com/groups/gitlab-org/-/epics/2809) | [No](https://gitlab.com/groups/gitlab-org/-/epics/2810) | No | |
@@ -201,4 +201,4 @@ successfully, you must replicate their data using some other means.
| [GitLab Pages](../../pages/index.md) | [No](https://gitlab.com/groups/gitlab-org/-/epics/589) | No | No | |
| [CI Pipeline Artifacts](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/models/ci/pipeline_artifact.rb) | [No](https://gitlab.com/gitlab-org/gitlab/-/issues/238464) | No | Via Object Storage provider if supported. Native Geo support (Beta). | Persists additional artifacts after a pipeline completes |
| [Dependency proxy images](../../../user/packages/dependency_proxy/index.md) | [No](https://gitlab.com/gitlab-org/gitlab/-/issues/259694) | No | No | Blocked on [Geo: Secondary Mimicry](https://gitlab.com/groups/gitlab-org/-/epics/1528). Note that replication of this cache is not needed for Disaster Recovery purposes because it can be recreated from external sources. |
-| [Vulnerability Export](../../../user/application_security/vulnerability_report/#export-vulnerabilities) | [Not planned](https://gitlab.com/groups/gitlab-org/-/epics/3111) | No | Via Object Storage provider if supported. Native Geo support (Beta). | Not planned because they are ephemeral and sensitive. They can be regenerated on demand. |
+| [Vulnerability Export](../../../user/application_security/vulnerability_report/#export-vulnerability-details) | [Not planned](https://gitlab.com/groups/gitlab-org/-/epics/3111) | No | Via Object Storage provider if supported. Native Geo support (Beta). | Not planned because they are ephemeral and sensitive. They can be regenerated on demand. |
diff --git a/doc/administration/geo/replication/location_aware_git_url.md b/doc/administration/geo/replication/location_aware_git_url.md
index 0eea792d374..272b746015b 100644
--- a/doc/administration/geo/replication/location_aware_git_url.md
+++ b/doc/administration/geo/replication/location_aware_git_url.md
@@ -51,8 +51,8 @@ If you haven't yet set up a Geo _primary_ node and _secondary_ node, see the
In a Route53 Hosted Zone, traffic policies can be used to set up a variety of
routing configurations.
-1. Navigate to the
-[Route53 dashboard](https://console.aws.amazon.com/route53/home) and click
+1. Go to the
+[Route53 dashboard](https://console.aws.amazon.com/route53/home) and select
**Traffic policies**.
![Traffic policies](img/single_git_traffic_policies.png)
diff --git a/doc/administration/geo/replication/remove_geo_node.md b/doc/administration/geo/replication/remove_geo_node.md
index 26150a6f536..06cf5375f0d 100644
--- a/doc/administration/geo/replication/remove_geo_node.md
+++ b/doc/administration/geo/replication/remove_geo_node.md
@@ -9,7 +9,7 @@ type: howto
**Secondary** nodes can be removed from the Geo cluster using the Geo administration page of the **primary** node. To remove a **secondary** node:
-1. Navigate to **Admin Area > Geo** (`/admin/geo/nodes`).
+1. Go to **Admin Area > Geo** (`/admin/geo/nodes`).
1. Click the **Remove** button for the **secondary** node you want to remove.
1. Confirm by clicking **Remove** when the prompt appears.
diff --git a/doc/administration/geo/replication/troubleshooting.md b/doc/administration/geo/replication/troubleshooting.md
index 3b1f60a0f3f..079a3713c73 100644
--- a/doc/administration/geo/replication/troubleshooting.md
+++ b/doc/administration/geo/replication/troubleshooting.md
@@ -428,7 +428,7 @@ To solve this:
1. Log into the secondary Geo node.
-1. Back up [the `.git` folder](../../repository_storage_types.md#translating-hashed-storage-paths).
+1. Back up [the `.git` folder](../../repository_storage_types.md#translate-hashed-storage-paths).
1. Optional: [Spot-check](../../troubleshooting/log_parsing.md#find-all-projects-affected-by-a-fatal-git-problem))
a few of those IDs whether they indeed correspond
diff --git a/doc/administration/geo/replication/version_specific_updates.md b/doc/administration/geo/replication/version_specific_updates.md
index be2ce0ac2c0..2720f466356 100644
--- a/doc/administration/geo/replication/version_specific_updates.md
+++ b/doc/administration/geo/replication/version_specific_updates.md
@@ -11,6 +11,14 @@ Review this page for update instructions for your version. These steps
accompany the [general steps](updating_the_geo_nodes.md#general-update-steps)
for updating Geo nodes.
+## Updating to GitLab 13.9
+
+We've detected an issue [with a column rename](https://gitlab.com/gitlab-org/gitlab/-/issues/322991)
+that prevents regular downtime upgrades to GitLab 13.9.0, 13.9.1 and 13.9.2. Zero-downtime upgrades are not
+affected. To avoid this issue, upgrade to GitLab 13.9.3 or later.
+
+More details are available [in this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/322991).
+
## Updating to GitLab 13.7
We've detected an issue with the `FetchRemove` call used by Geo secondaries.
diff --git a/doc/administration/geo/setup/database.md b/doc/administration/geo/setup/database.md
index 1272e7d1419..7128d4283d1 100644
--- a/doc/administration/geo/setup/database.md
+++ b/doc/administration/geo/setup/database.md
@@ -496,7 +496,7 @@ A production-ready and secure setup requires at least three Consul nodes, three
Patroni nodes, one internal load-balancing node on the primary site, and a similar
configuration for the secondary site. The internal load balancer provides a single
endpoint for connecting to the Patroni cluster's leader whenever a new leader is
-elected. Be sure to use [password credentials](../..//postgresql/replication_and_failover.md#database-authorization-for-patroni) and other database best practices.
+elected. Be sure to use [password credentials](../../postgresql/replication_and_failover.md#database-authorization-for-patroni) and other database best practices.
Similar to `repmgr`, using Patroni on a secondary node is optional.
diff --git a/doc/administration/geo/setup/external_database.md b/doc/administration/geo/setup/external_database.md
index 8e7d8049467..1b0082687e6 100644
--- a/doc/administration/geo/setup/external_database.md
+++ b/doc/administration/geo/setup/external_database.md
@@ -49,7 +49,7 @@ developed and tested. We aim to be compatible with most external
To set up an external database, you can either:
-- Set up streaming replication yourself (for example, in AWS RDS).
+- Set up [streaming replication](https://www.postgresql.org/docs/11/warm-standby.html#STREAMING-REPLICATION-SLOTS) yourself (for example AWS RDS, bare metal not managed by Omnibus, etc.).
- Perform the Omnibus configuration manually as follows.
#### Leverage your cloud provider's tools to replicate the primary database
diff --git a/doc/administration/gitaly/configure_gitaly.md b/doc/administration/gitaly/configure_gitaly.md
new file mode 100644
index 00000000000..7e3647d1e34
--- /dev/null
+++ b/doc/administration/gitaly/configure_gitaly.md
@@ -0,0 +1,943 @@
+---
+stage: Create
+group: Gitaly
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+type: reference
+---
+
+# Configure Gitaly
+
+The Gitaly service itself is configured by using a [TOML configuration file](reference.md).
+
+To change Gitaly settings:
+
+**For Omnibus GitLab**
+
+1. Edit `/etc/gitlab/gitlab.rb` and add or change the
+ [Gitaly settings](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/1dd07197c7e5ae23626aad5a4a070a800b670380/files/gitlab-config-template/gitlab.rb.template#L1622-1676).
+1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+
+**For installations from source**
+
+1. Edit `/home/git/gitaly/config.toml` and add or change the [Gitaly settings](https://gitlab.com/gitlab-org/gitaly/blob/master/config.toml.example).
+1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source).
+
+The following configuration options are also available:
+
+- Enabling [TLS support](#enable-tls-support).
+- Configuring the [number of `gitaly-ruby` workers](#configure-number-of-gitaly-ruby-workers).
+- Limiting [RPC concurrency](#limit-rpc-concurrency).
+
+## Run Gitaly on its own server
+
+By default, Gitaly is run on the same server as Gitaly clients and is
+[configured as above](#configure-gitaly). Single-server installations are best served by
+this default configuration used by:
+
+- [Omnibus GitLab](https://docs.gitlab.com/omnibus/).
+- The GitLab [source installation guide](../../install/installation.md).
+
+However, Gitaly can be deployed to its own server, which can benefit GitLab installations that span
+multiple machines.
+
+NOTE:
+When configured to run on their own servers, Gitaly servers
+[must be upgraded](https://docs.gitlab.com/omnibus/update/#upgrading-gitaly-servers) before Gitaly
+clients in your cluster.
+
+The process for setting up Gitaly on its own server is:
+
+1. [Install Gitaly](#install-gitaly).
+1. [Configure authentication](#configure-authentication).
+1. [Configure Gitaly servers](#configure-gitaly-servers).
+1. [Configure Gitaly clients](#configure-gitaly-clients).
+1. [Disable Gitaly where not required](#disable-gitaly-where-not-required-optional) (optional).
+
+When running Gitaly on its own server, note the following regarding GitLab versions:
+
+- From GitLab 11.4, Gitaly was able to serve all Git requests without requiring a shared NFS mount
+ for Git repository data, except for the
+ [Elasticsearch indexer](https://gitlab.com/gitlab-org/gitlab-elasticsearch-indexer).
+- From GitLab 11.8, the Elasticsearch indexer also uses Gitaly for data access. NFS can still be
+ leveraged for redundancy on block-level Git data, but should be mounted only on the Gitaly
+ servers.
+- From GitLab 11.8 to 12.2, it is possible to use Elasticsearch in a Gitaly setup that doesn't use
+ NFS. To use Elasticsearch in these versions, the
+ [repository indexer](../../integration/elasticsearch.md#elasticsearch-repository-indexer)
+ must be enabled in your GitLab configuration.
+- [In GitLab 12.3 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/6481), the new indexer is
+ the default and no configuration is required.
+
+### Network architecture
+
+The following list depicts the network architecture of Gitaly:
+
+- GitLab Rails shards repositories into [repository storages](../repository_storage_paths.md).
+- `/config/gitlab.yml` contains a map from storage names to `(Gitaly address, Gitaly token)` pairs.
+- The `storage name` -\> `(Gitaly address, Gitaly token)` map in `/config/gitlab.yml` is the single
+ source of truth for the Gitaly network topology.
+- A `(Gitaly address, Gitaly token)` corresponds to a Gitaly server.
+- A Gitaly server hosts one or more storages.
+- A Gitaly client can use one or more Gitaly servers.
+- Gitaly addresses must be specified in such a way that they resolve correctly for **all** Gitaly
+ clients.
+- Gitaly clients are:
+ - Puma or Unicorn.
+ - Sidekiq.
+ - GitLab Workhorse.
+ - GitLab Shell.
+ - Elasticsearch indexer.
+ - Gitaly itself.
+- A Gitaly server must be able to make RPC calls **to itself** by using its own
+ `(Gitaly address, Gitaly token)` pair as specified in `/config/gitlab.yml`.
+- Authentication is done through a static token which is shared among the Gitaly and GitLab Rails
+ nodes.
+
+The following digraph illustrates communication between Gitaly servers and GitLab Rails showing
+the default ports for HTTP and HTTPs communication.
+
+![Gitaly network architecture diagram](img/gitaly_network_13_9.png)
+
+WARNING:
+Gitaly servers must not be exposed to the public internet as Gitaly's network traffic is unencrypted
+by default. The use of firewall is highly recommended to restrict access to the Gitaly server.
+Another option is to [use TLS](#enable-tls-support).
+
+In the following sections, we describe how to configure two Gitaly servers with secret token
+`abc123secret`:
+
+- `gitaly1.internal`.
+- `gitaly2.internal`.
+
+We assume your GitLab installation has three repository storages:
+
+- `default`.
+- `storage1`.
+- `storage2`.
+
+You can use as few as one server with one repository storage if desired.
+
+NOTE:
+The token referred to throughout the Gitaly documentation is just an arbitrary password selected by
+the administrator. It is unrelated to tokens created for the GitLab API or other similar web API
+tokens.
+
+### Install Gitaly
+
+Install Gitaly on each Gitaly server using either Omnibus GitLab or install it from source:
+
+- For Omnibus GitLab, [download and install](https://about.gitlab.com/install/) the Omnibus GitLab
+ package you want but **do not** provide the `EXTERNAL_URL=` value.
+- To install from source, follow the steps at
+ [Install Gitaly](../../install/installation.md#install-gitaly).
+
+### Configure authentication
+
+Gitaly and GitLab use two shared secrets for authentication:
+
+- One to authenticate gRPC requests to Gitaly.
+- A second for authentication callbacks from GitLab Shell to the GitLab internal API.
+
+**For Omnibus GitLab**
+
+To configure the Gitaly token:
+
+1. On the Gitaly clients, edit `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ gitlab_rails['gitaly_token'] = 'abc123secret'
+ ```
+
+1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+1. On the Gitaly server, edit `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ gitaly['auth_token'] = 'abc123secret'
+ ```
+
+1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+
+There are two ways to configure the GitLab Shell token.
+
+Method 1:
+
+1. Copy `/etc/gitlab/gitlab-secrets.json` from the Gitaly client to same path on the Gitaly servers
+ (and any other Gitaly clients).
+1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) on Gitaly servers.
+
+Method 2:
+
+1. On the Gitaly clients, edit `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ gitlab_shell['secret_token'] = 'shellsecret'
+ ```
+
+1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+1. On the Gitaly servers, edit `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ gitlab_shell['secret_token'] = 'shellsecret'
+ ```
+
+1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+
+**For installations from source**
+
+1. Copy `/home/git/gitlab/.gitlab_shell_secret` from the Gitaly client to the same path on the
+ Gitaly servers (and any other Gitaly clients).
+1. On the Gitaly clients, edit `/home/git/gitlab/config/gitlab.yml`:
+
+ ```yaml
+ gitlab:
+ gitaly:
+ token: 'abc123secret'
+ ```
+
+1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source).
+1. On the Gitaly servers, edit `/home/git/gitaly/config.toml`:
+
+ ```toml
+ [auth]
+ token = 'abc123secret'
+ ```
+
+1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source).
+
+### Configure Gitaly servers
+
+On the Gitaly servers, you must configure storage paths and enable the network listener.
+The Gitaly server must be able to read, write, and set permissions on the configured path.
+
+If you want to reduce the risk of downtime when you enable authentication, you can temporarily
+disable enforcement. For more information, see the documentation on configuring
+[Gitaly authentication](https://gitlab.com/gitlab-org/gitaly/blob/master/doc/configuration/README.md#authentication).
+
+**For Omnibus GitLab**
+
+1. Edit `/etc/gitlab/gitlab.rb`:
+
+ <!--
+ updates to following example must also be made at
+ https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/advanced/external-gitaly/external-omnibus-gitaly.md#configure-omnibus-gitlab
+ -->
+
+ ```ruby
+ # Avoid running unnecessary services on the Gitaly server
+ postgresql['enable'] = false
+ redis['enable'] = false
+ nginx['enable'] = false
+ puma['enable'] = false
+ sidekiq['enable'] = false
+ gitlab_workhorse['enable'] = false
+ grafana['enable'] = false
+ gitlab_exporter['enable'] = false
+
+ # If you run a separate monitoring node you can disable these services
+ alertmanager['enable'] = false
+ prometheus['enable'] = false
+
+ # If you don't run a separate monitoring node you can
+ # enable Prometheus access & disable these extra services.
+ # This makes Prometheus listen on all interfaces. You must use firewalls to restrict access to this address/port.
+ # prometheus['listen_address'] = '0.0.0.0:9090'
+ # prometheus['monitor_kubernetes'] = false
+
+ # If you don't want to run monitoring services uncomment the following (not recommended)
+ # node_exporter['enable'] = false
+
+ # Prevent database connections during 'gitlab-ctl reconfigure'
+ gitlab_rails['rake_cache_clear'] = false
+ gitlab_rails['auto_migrate'] = false
+
+ # Configure the gitlab-shell API callback URL. Without this, `git push` will
+ # fail. This can be your 'front door' GitLab URL or an internal load
+ # balancer.
+ # Don't forget to copy `/etc/gitlab/gitlab-secrets.json` from Gitaly client to Gitaly server.
+ gitlab_rails['internal_api_url'] = 'https://gitlab.example.com'
+
+ # Authentication token to ensure only authorized servers can communicate with
+ # Gitaly server
+ gitaly['auth_token'] = 'AUTH_TOKEN'
+
+ # Make Gitaly accept connections on all network interfaces. You must use
+ # firewalls to restrict access to this address/port.
+ # Comment out following line if you only want to support TLS connections
+ gitaly['listen_addr'] = "0.0.0.0:8075"
+ ```
+
+1. Append the following to `/etc/gitlab/gitlab.rb` for each respective Gitaly server:
+
+ <!--
+ updates to following example must also be made at
+ https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/advanced/external-gitaly/external-omnibus-gitaly.md#configure-omnibus-gitlab
+ -->
+
+ On `gitaly1.internal`:
+
+ ```ruby
+ git_data_dirs({
+ 'default' => {
+ 'path' => '/var/opt/gitlab/git-data'
+ },
+ 'storage1' => {
+ 'path' => '/mnt/gitlab/git-data'
+ },
+ })
+ ```
+
+ On `gitaly2.internal`:
+
+ ```ruby
+ git_data_dirs({
+ 'storage2' => {
+ 'path' => '/srv/gitlab/git-data'
+ },
+ })
+ ```
+
+1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+1. Run `sudo /opt/gitlab/embedded/bin/gitaly-hooks check /var/opt/gitlab/gitaly/config.toml`
+ to confirm that Gitaly can perform callbacks to the GitLab internal API.
+
+**For installations from source**
+
+1. Edit `/home/git/gitaly/config.toml`:
+
+ ```toml
+ listen_addr = '0.0.0.0:8075'
+
+ internal_socket_dir = '/var/opt/gitlab/gitaly'
+
+ [logging]
+ format = 'json'
+ level = 'info'
+ dir = '/var/log/gitaly'
+ ```
+
+1. Append the following to `/home/git/gitaly/config.toml` for each respective Gitaly server:
+
+ On `gitaly1.internal`:
+
+ ```toml
+ [[storage]]
+ name = 'default'
+ path = '/var/opt/gitlab/git-data/repositories'
+
+ [[storage]]
+ name = 'storage1'
+ path = '/mnt/gitlab/git-data/repositories'
+ ```
+
+ On `gitaly2.internal`:
+
+ ```toml
+ [[storage]]
+ name = 'storage2'
+ path = '/srv/gitlab/git-data/repositories'
+ ```
+
+1. Edit `/home/git/gitlab-shell/config.yml`:
+
+ ```yaml
+ gitlab_url: https://gitlab.example.com
+ ```
+
+1. Save the files and [restart GitLab](../restart_gitlab.md#installations-from-source).
+1. Run `sudo -u git /home/git/gitaly/gitaly-hooks check /home/git/gitaly/config.toml`
+ to confirm that Gitaly can perform callbacks to the GitLab internal API.
+
+### Configure Gitaly clients
+
+As the final step, you must update Gitaly clients to switch from using local Gitaly service to use
+the Gitaly servers you just configured.
+
+This can be risky because anything that prevents your Gitaly clients from reaching the Gitaly
+servers causes all Gitaly requests to fail. For example, any sort of network, firewall, or name
+resolution problems.
+
+Additionally, you must [disable Rugged](../nfs.md#improving-nfs-performance-with-gitlab)
+if previously enabled manually.
+
+Gitaly makes the following assumptions:
+
+- Your `gitaly1.internal` Gitaly server can be reached at `gitaly1.internal:8075` from your Gitaly
+ clients, and that Gitaly server can read, write, and set permissions on `/var/opt/gitlab/git-data` and
+ `/mnt/gitlab/git-data`.
+- Your `gitaly2.internal` Gitaly server can be reached at `gitaly2.internal:8075` from your Gitaly
+ clients, and that Gitaly server can read, write, and set permissions on `/srv/gitlab/git-data`.
+- Your `gitaly1.internal` and `gitaly2.internal` Gitaly servers can reach each other.
+
+You can't define Gitaly servers with some as a local Gitaly server
+(without `gitaly_address`) and some as remote
+server (with `gitaly_address`) unless you use
+[mixed configuration](#mixed-configuration).
+
+**For Omnibus GitLab**
+
+1. Edit `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ git_data_dirs({
+ 'default' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
+ 'storage1' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
+ 'storage2' => { 'gitaly_address' => 'tcp://gitaly2.internal:8075' },
+ })
+ ```
+
+1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+1. Run `sudo gitlab-rake gitlab:gitaly:check` on the Gitaly client (for example, the
+ Rails application) to confirm it can connect to Gitaly servers.
+1. Tail the logs to see the requests:
+
+ ```shell
+ sudo gitlab-ctl tail gitaly
+ ```
+
+**For installations from source**
+
+1. Edit `/home/git/gitlab/config/gitlab.yml`:
+
+ ```yaml
+ gitlab:
+ repositories:
+ storages:
+ default:
+ gitaly_address: tcp://gitaly1.internal:8075
+ path: /some/local/path
+ storage1:
+ gitaly_address: tcp://gitaly1.internal:8075
+ path: /some/local/path
+ storage2:
+ gitaly_address: tcp://gitaly2.internal:8075
+ path: /some/local/path
+ ```
+
+ NOTE:
+ `/some/local/path` should be set to a local folder that exists, however no data is stored in
+ this folder. This requirement is scheduled to be removed when
+ [this issue](https://gitlab.com/gitlab-org/gitaly/-/issues/1282) is resolved.
+
+1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source).
+1. Run `sudo -u git -H bundle exec rake gitlab:gitaly:check RAILS_ENV=production` to confirm the
+ Gitaly client can connect to Gitaly servers.
+1. Tail the logs to see the requests:
+
+ ```shell
+ tail -f /home/git/gitlab/log/gitaly.log
+ ```
+
+When you tail the Gitaly logs on your Gitaly server, you should see requests coming in. One sure way
+to trigger a Gitaly request is to clone a repository from GitLab over HTTP or HTTPS.
+
+WARNING:
+If you have [server hooks](../server_hooks.md) configured, either per repository or globally, you
+must move these to the Gitaly servers. If you have multiple Gitaly servers, copy your server hooks
+to all Gitaly servers.
+
+#### Mixed configuration
+
+GitLab can reside on the same server as one of many Gitaly servers, but doesn't support
+configuration that mixes local and remote configuration. The following setup is incorrect, because:
+
+- All addresses must be reachable from the other Gitaly servers.
+- `storage1` is assigned a Unix socket for `gitaly_address` which is
+ invalid for some of the Gitaly servers.
+
+```ruby
+git_data_dirs({
+ 'default' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
+ 'storage1' => { 'path' => '/mnt/gitlab/git-data' },
+ 'storage2' => { 'gitaly_address' => 'tcp://gitaly2.internal:8075' },
+})
+```
+
+To combine local and remote Gitaly servers, use an external address for the local Gitaly server. For
+example:
+
+```ruby
+git_data_dirs({
+ 'default' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
+ # Address of the GitLab server that has Gitaly running on it
+ 'storage1' => { 'gitaly_address' => 'tcp://gitlab.internal:8075', 'path' => '/mnt/gitlab/git-data' },
+ 'storage2' => { 'gitaly_address' => 'tcp://gitaly2.internal:8075' },
+})
+
+# Make Gitaly accept connections on all network interfaces
+gitaly['listen_addr'] = "0.0.0.0:8075"
+
+# Or for TLS
+gitaly['tls_listen_addr'] = "0.0.0.0:9999"
+gitaly['certificate_path'] = "/etc/gitlab/ssl/cert.pem"
+gitaly['key_path'] = "/etc/gitlab/ssl/key.pem"
+```
+
+`path` can be included only for storage shards on the local Gitaly server.
+If it's excluded, default Git storage directory is used for that storage shard.
+
+### Disable Gitaly where not required (optional)
+
+If you run Gitaly [as a remote service](#run-gitaly-on-its-own-server), consider
+disabling the local Gitaly service that runs on your GitLab server by default, and run it
+only where required.
+
+Disabling Gitaly on the GitLab instance makes sense only when you run GitLab in a custom cluster configuration, where
+Gitaly runs on a separate machine from the GitLab instance. Disabling Gitaly on all machines in the cluster is not
+a valid configuration (some machines much act as Gitaly servers).
+
+To disable Gitaly on a GitLab server:
+
+**For Omnibus GitLab**
+
+1. Edit `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ gitaly['enable'] = false
+ ```
+
+1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+
+**For installations from source**
+
+1. Edit `/etc/default/gitlab`:
+
+ ```shell
+ gitaly_enabled=false
+ ```
+
+1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source).
+
+## Enable TLS support
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/22602) in GitLab 11.8.
+> - [Introduced](https://gitlab.com/gitlab-org/gitaly/-/issues/3160) in GitLab 13.6, outgoing TLS connections to GitLab provide client certificates if configured.
+
+Gitaly supports TLS encryption. To communicate with a Gitaly instance that listens for secure
+connections, use the `tls://` URL scheme in the `gitaly_address` of the corresponding
+storage entry in the GitLab configuration.
+
+Gitaly provides the same server certificates as client certificates in TLS
+connections to GitLab. This can be used as part of a mutual TLS authentication strategy
+when combined with reverse proxies (for example, NGINX) that validate client certificate
+to grant access to GitLab.
+
+You must supply your own certificates as this isn't provided automatically. The certificate
+corresponding to each Gitaly server must be installed on that Gitaly server.
+
+Additionally, the certificate (or its certificate authority) must be installed on all:
+
+- Gitaly servers.
+- Gitaly clients that communicate with it.
+
+Note the following:
+
+- The certificate must specify the address you use to access the Gitaly server. You must add the hostname or IP address as a Subject Alternative Name to the certificate.
+- You can configure Gitaly servers with both an unencrypted listening address `listen_addr` and an
+ encrypted listening address `tls_listen_addr` at the same time. This allows you to gradually
+ transition from unencrypted to encrypted traffic if necessary.
+
+To configure Gitaly with TLS:
+
+**For Omnibus GitLab**
+
+1. Create certificates for Gitaly servers.
+1. On the Gitaly clients, copy the certificates (or their certificate authority) into
+ `/etc/gitlab/trusted-certs`:
+
+ ```shell
+ sudo cp cert.pem /etc/gitlab/trusted-certs/
+ ```
+
+1. On the Gitaly clients, edit `git_data_dirs` in `/etc/gitlab/gitlab.rb` as follows:
+
+ ```ruby
+ git_data_dirs({
+ 'default' => { 'gitaly_address' => 'tls://gitaly1.internal:9999' },
+ 'storage1' => { 'gitaly_address' => 'tls://gitaly1.internal:9999' },
+ 'storage2' => { 'gitaly_address' => 'tls://gitaly2.internal:9999' },
+ })
+ ```
+
+1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+1. On the Gitaly servers, create the `/etc/gitlab/ssl` directory and copy your key and certificate
+ there:
+
+ ```shell
+ sudo mkdir -p /etc/gitlab/ssl
+ sudo chmod 755 /etc/gitlab/ssl
+ sudo cp key.pem cert.pem /etc/gitlab/ssl/
+ sudo chmod 644 key.pem cert.pem
+ ```
+
+1. Copy all Gitaly server certificates (or their certificate authority) to
+ `/etc/gitlab/trusted-certs` on all Gitaly servers and clients
+ so that Gitaly servers and clients trust the certificate when calling into themselves
+ or other Gitaly servers:
+
+ ```shell
+ sudo cp cert1.pem cert2.pem /etc/gitlab/trusted-certs/
+ ```
+
+1. Edit `/etc/gitlab/gitlab.rb` and add:
+
+ <!--
+ updates to following example must also be made at
+ https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/advanced/external-gitaly/external-omnibus-gitaly.md#configure-omnibus-gitlab
+ -->
+
+ ```ruby
+ gitaly['tls_listen_addr'] = "0.0.0.0:9999"
+ gitaly['certificate_path'] = "/etc/gitlab/ssl/cert.pem"
+ gitaly['key_path'] = "/etc/gitlab/ssl/key.pem"
+ ```
+
+1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+1. Verify Gitaly traffic is being served over TLS by
+ [observing the types of Gitaly connections](#observe-type-of-gitaly-connections).
+1. (Optional) Improve security by:
+ 1. Disabling non-TLS connections by commenting out or deleting `gitaly['listen_addr']` in
+ `/etc/gitlab/gitlab.rb`.
+ 1. Saving the file.
+ 1. [Reconfiguring GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+
+**For installations from source**
+
+1. Create certificates for Gitaly servers.
+1. On the Gitaly clients, copy the certificates into the system trusted certificates:
+
+ ```shell
+ sudo cp cert.pem /usr/local/share/ca-certificates/gitaly.crt
+ sudo update-ca-certificates
+ ```
+
+1. On the Gitaly clients, edit `storages` in `/home/git/gitlab/config/gitlab.yml` as follows:
+
+ ```yaml
+ gitlab:
+ repositories:
+ storages:
+ default:
+ gitaly_address: tls://gitaly1.internal:9999
+ path: /some/local/path
+ storage1:
+ gitaly_address: tls://gitaly1.internal:9999
+ path: /some/local/path
+ storage2:
+ gitaly_address: tls://gitaly2.internal:9999
+ path: /some/local/path
+ ```
+
+ NOTE:
+ `/some/local/path` should be set to a local folder that exists, however no data is stored
+ in this folder. This requirement is scheduled to be removed when
+ [Gitaly issue #1282](https://gitlab.com/gitlab-org/gitaly/-/issues/1282) is resolved.
+
+1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source).
+1. On the Gitaly servers, create or edit `/etc/default/gitlab` and add:
+
+ ```shell
+ export SSL_CERT_DIR=/etc/gitlab/ssl
+ ```
+
+1. On the Gitaly servers, create the `/etc/gitlab/ssl` directory and copy your key and certificate there:
+
+ ```shell
+ sudo mkdir -p /etc/gitlab/ssl
+ sudo chmod 755 /etc/gitlab/ssl
+ sudo cp key.pem cert.pem /etc/gitlab/ssl/
+ sudo chmod 644 key.pem cert.pem
+ ```
+
+1. Copy all Gitaly server certificates (or their certificate authority) to the system trusted
+ certificates folder so Gitaly server trusts the certificate when calling into itself or other Gitaly
+ servers.
+
+ ```shell
+ sudo cp cert.pem /usr/local/share/ca-certificates/gitaly.crt
+ sudo update-ca-certificates
+ ```
+
+1. Edit `/home/git/gitaly/config.toml` and add:
+
+ ```toml
+ tls_listen_addr = '0.0.0.0:9999'
+
+ [tls]
+ certificate_path = '/etc/gitlab/ssl/cert.pem'
+ key_path = '/etc/gitlab/ssl/key.pem'
+ ```
+
+1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source).
+1. Verify Gitaly traffic is being served over TLS by
+ [observing the types of Gitaly connections](#observe-type-of-gitaly-connections).
+1. (Optional) Improve security by:
+ 1. Disabling non-TLS connections by commenting out or deleting `listen_addr` in
+ `/home/git/gitaly/config.toml`.
+ 1. Saving the file.
+ 1. [Restarting GitLab](../restart_gitlab.md#installations-from-source).
+
+### Observe type of Gitaly connections
+
+[Prometheus](../monitoring/prometheus/index.md) can be used observe what type of connections Gitaly
+is serving a production environment. Use the following Prometheus query:
+
+```prometheus
+sum(rate(gitaly_connections_total[5m])) by (type)
+```
+
+## `gitaly-ruby`
+
+Gitaly was developed to replace the Ruby application code in GitLab.
+
+To save time and avoid the risk of rewriting existing application logic, we chose to copy some
+application code from GitLab into Gitaly.
+
+To be able to run that code, `gitaly-ruby` was created, which is a "sidecar" process for the main
+Gitaly Go process. Some examples of things that are implemented in `gitaly-ruby` are:
+
+- RPCs that deal with wikis.
+- RPCs that create commits on behalf of a user, such as merge commits.
+
+We recommend:
+
+- At least 300 MB memory per worker.
+- No more than one worker per core.
+
+NOTE:
+`gitaly-ruby` is planned to be eventually removed. To track progress, see the
+[Remove the Gitaly-Ruby sidecar](https://gitlab.com/groups/gitlab-org/-/epics/2862) epic.
+
+### Configure number of `gitaly-ruby` workers
+
+`gitaly-ruby` has much less capacity than Gitaly implemented in Go. If your Gitaly server has to handle lots of
+requests, the default setting of having just one active `gitaly-ruby` sidecar might not be enough.
+
+If you see `ResourceExhausted` errors from Gitaly, it's very likely that you have not enough
+`gitaly-ruby` capacity.
+
+You can increase the number of `gitaly-ruby` processes on your Gitaly server with the following
+settings:
+
+**For Omnibus GitLab**
+
+1. Edit `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ # Default is 2 workers. The minimum is 2; 1 worker is always reserved as
+ # a passive stand-by.
+ gitaly['ruby_num_workers'] = 4
+ ```
+
+1. Save the file, and then [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+
+**For installations from source**
+
+1. Edit `/home/git/gitaly/config.toml`:
+
+ ```toml
+ [gitaly-ruby]
+ num_workers = 4
+ ```
+
+1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source).
+
+## Limit RPC concurrency
+
+Clone traffic can put a large strain on your Gitaly service. The bulk of the work gets done in the
+either of the following RPCs:
+
+- `SSHUploadPack` (for Git SSH).
+- `PostUploadPack` (for Git HTTP).
+
+To prevent such workloads from overwhelming your Gitaly server, you can set concurrency limits in
+Gitaly's configuration file. For example:
+
+```ruby
+# in /etc/gitlab/gitlab.rb
+
+gitaly['concurrency'] = [
+ {
+ 'rpc' => "/gitaly.SmartHTTPService/PostUploadPack",
+ 'max_per_repo' => 20
+ },
+ {
+ 'rpc' => "/gitaly.SSHService/SSHUploadPack",
+ 'max_per_repo' => 20
+ }
+]
+```
+
+This limits the number of in-flight RPC calls for the given RPCs. The limit is applied per
+repository. In the example above:
+
+- Each repository served by the Gitaly server can have at most 20 simultaneous `PostUploadPack` RPC
+ calls in flight, and the same for `SSHUploadPack`.
+- If another request comes in for a repository that has used up its 20 slots, that request gets
+ queued.
+
+You can observe the behavior of this queue using the Gitaly logs and Prometheus:
+
+- In the Gitaly logs, look for the string (or structured log field) `acquire_ms`. Messages that have
+ this field are reporting about the concurrency limiter.
+- In Prometheus, look for the following metrics:
+
+ - `gitaly_rate_limiting_in_progress`.
+ - `gitaly_rate_limiting_queued`.
+ - `gitaly_rate_limiting_seconds`.
+
+NOTE:
+Although the name of the Prometheus metric contains `rate_limiting`, it's a concurrency limiter, not
+a rate limiter. If a Gitaly client makes 1,000 requests in a row very quickly, concurrency doesn't
+exceed 1, and the concurrency limiter has no effect.
+
+## Background Repository Optimization
+
+Empty directories and unneeded configuration settings may accumulate in a repository and
+slow down Git operations. Gitaly can schedule a daily background task with a maximum duration
+to clean up these items and improve performance.
+
+WARNING:
+This is an experimental feature and may place significant load on the host while running.
+Make sure to schedule this during off-peak hours and keep the duration short (for example, 30-60 minutes).
+
+**For Omnibus GitLab**
+
+Edit `/etc/gitlab/gitlab.rb` and add:
+
+```ruby
+gitaly['daily_maintenance_start_hour'] = 4
+gitaly['daily_maintenance_start_minute'] = 30
+gitaly['daily_maintenance_duration'] = '30m'
+gitaly['daily_maintenance_storages'] = ["default"]
+```
+
+**For installations from source**
+
+Edit `/home/git/gitaly/config.toml` and add:
+
+```toml
+[daily_maintenance]
+start_hour = 4
+start_minute = 30
+duration = '30m'
+storages = ["default"]
+```
+
+## Rotate Gitaly authentication token
+
+Rotating credentials in a production environment often requires downtime, causes outages, or both.
+
+However, you can rotate Gitaly credentials without a service interruption. Rotating a Gitaly
+authentication token involves:
+
+- [Verifying authentication monitoring](#verify-authentication-monitoring).
+- [Enabling "auth transitioning" mode](#enable-auth-transitioning-mode).
+- [Updating Gitaly authentication tokens](#update-gitaly-authentication-token).
+- [Ensuring there are no authentication failures](#ensure-there-are-no-authentication-failures).
+- [Disabling "auth transitioning" mode](#disable-auth-transitioning-mode).
+- [Verifying authentication is enforced](#verify-authentication-is-enforced).
+
+This procedure also works if you are running GitLab on a single server. In that case, "Gitaly
+server" and "Gitaly client" refers to the same machine.
+
+### Verify authentication monitoring
+
+Before rotating a Gitaly authentication token, verify that you can monitor the authentication
+behavior of your GitLab installation using Prometheus. Use the following Prometheus query:
+
+```prometheus
+sum(rate(gitaly_authentications_total[5m])) by (enforced, status)
+```
+
+In a system where authentication is configured correctly and where you have live traffic, you
+see something like this:
+
+```prometheus
+{enforced="true",status="ok"} 4424.985419441742
+```
+
+There may also be other numbers with rate 0. We care only about the non-zero numbers.
+
+The only non-zero number should have `enforced="true",status="ok"`. If you have other non-zero
+numbers, something is wrong in your configuration.
+
+The `status="ok"` number reflects your current request rate. In the example above, Gitaly is
+handling about 4000 requests per second.
+
+Now that you have established that you can monitor the Gitaly authentication behavior of your GitLab
+installation, you can begin the rest of the procedure.
+
+### Enable "auth transitioning" mode
+
+Temporarily disable Gitaly authentication on the Gitaly servers by putting them into "auth
+transitioning" mode as follows:
+
+```ruby
+# in /etc/gitlab/gitlab.rb
+gitaly['auth_transitioning'] = true
+```
+
+After you have made this change, your [Prometheus query](#verify-authentication-monitoring)
+should return something like:
+
+```prometheus
+{enforced="false",status="would be ok"} 4424.985419441742
+```
+
+Because `enforced="false"`, it is safe to start rolling out the new token.
+
+### Update Gitaly authentication token
+
+To update to a new Gitaly authentication token, on each Gitaly client **and** Gitaly server:
+
+1. Update the configuration:
+
+ ```ruby
+ # in /etc/gitlab/gitlab.rb
+
+ gitaly['auth_token'] = '<new secret token>'
+ ```
+
+1. Restart Gitaly:
+
+ ```shell
+ gitlab-ctl restart gitaly
+ ```
+
+If you run your [Prometheus query](#verify-authentication-monitoring) while this change is
+being rolled out, you see non-zero values for the `enforced="false",status="denied"` counter.
+
+### Ensure there are no authentication failures
+
+After the new token is set, and all services involved have been restarted, you will
+[temporarily see](#verify-authentication-monitoring) a mix of:
+
+- `status="would be ok"`.
+- `status="denied"`.
+
+After the new token is picked up by all Gitaly clients and Gitaly servers, the
+**only non-zero rate** should be `enforced="false",status="would be ok"`.
+
+### Disable "auth transitioning" mode
+
+To re-enable Gitaly authentication, disable "auth transitioning" mode. Update the configuration on
+your Gitaly servers as follows:
+
+```ruby
+# in /etc/gitlab/gitlab.rb
+gitaly['auth_transitioning'] = false
+```
+
+WARNING:
+Without completing this step, you have **no Gitaly authentication**.
+
+### Verify authentication is enforced
+
+Refresh your [Prometheus query](#verify-authentication-monitoring). You should now see a similar
+result as you did at the start. For example:
+
+```prometheus
+{enforced="true",status="ok"} 4424.985419441742
+```
+
+Note that `enforced="true"` means that authentication is being enforced.
diff --git a/doc/administration/gitaly/img/gitaly_network_13_9.png b/doc/administration/gitaly/img/gitaly_network_13_9.png
new file mode 100644
index 00000000000..e678f6d7abb
--- /dev/null
+++ b/doc/administration/gitaly/img/gitaly_network_13_9.png
Binary files differ
diff --git a/doc/administration/gitaly/index.md b/doc/administration/gitaly/index.md
index f02b9b8fc1a..294bc01305a 100644
--- a/doc/administration/gitaly/index.md
+++ b/doc/administration/gitaly/index.md
@@ -40,931 +40,8 @@ The following is a high-level architecture overview of how Gitaly is used.
## Configure Gitaly
-The Gitaly service itself is configured by using a [TOML configuration file](reference.md).
-
-To change Gitaly settings:
-
-**For Omnibus GitLab**
-
-1. Edit `/etc/gitlab/gitlab.rb` and add or change the
- [Gitaly settings](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/1dd07197c7e5ae23626aad5a4a070a800b670380/files/gitlab-config-template/gitlab.rb.template#L1622-1676).
-1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-
-**For installations from source**
-
-1. Edit `/home/git/gitaly/config.toml` and add or change the [Gitaly settings](https://gitlab.com/gitlab-org/gitaly/blob/master/config.toml.example).
-1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source).
-
-The following configuration options are also available:
-
-- Enabling [TLS support](#enable-tls-support).
-- Configuring the [number of `gitaly-ruby` workers](#configure-number-of-gitaly-ruby-workers).
-- Limiting [RPC concurrency](#limit-rpc-concurrency).
-
-## Run Gitaly on its own server
-
-By default, Gitaly is run on the same server as Gitaly clients and is
-[configured as above](#configure-gitaly). Single-server installations are best served by
-this default configuration used by:
-
-- [Omnibus GitLab](https://docs.gitlab.com/omnibus/).
-- The GitLab [source installation guide](../../install/installation.md).
-
-However, Gitaly can be deployed to its own server, which can benefit GitLab installations that span
-multiple machines.
-
-NOTE:
-When configured to run on their own servers, Gitaly servers
-[must be upgraded](https://docs.gitlab.com/omnibus/update/#upgrading-gitaly-servers) before Gitaly
-clients in your cluster.
-
-The process for setting up Gitaly on its own server is:
-
-1. [Install Gitaly](#install-gitaly).
-1. [Configure authentication](#configure-authentication).
-1. [Configure Gitaly servers](#configure-gitaly-servers).
-1. [Configure Gitaly clients](#configure-gitaly-clients).
-1. [Disable Gitaly where not required](#disable-gitaly-where-not-required-optional) (optional).
-
-When running Gitaly on its own server, note the following regarding GitLab versions:
-
-- From GitLab 11.4, Gitaly was able to serve all Git requests without requiring a shared NFS mount
- for Git repository data, except for the
- [Elasticsearch indexer](https://gitlab.com/gitlab-org/gitlab-elasticsearch-indexer).
-- From GitLab 11.8, the Elasticsearch indexer also uses Gitaly for data access. NFS can still be
- leveraged for redundancy on block-level Git data, but should be mounted only on the Gitaly
- servers.
-- From GitLab 11.8 to 12.2, it is possible to use Elasticsearch in a Gitaly setup that doesn't use
- NFS. To use Elasticsearch in these versions, the
- [repository indexer](../../integration/elasticsearch.md#elasticsearch-repository-indexer)
- must be enabled in your GitLab configuration.
-- [In GitLab 12.3 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/6481), the new indexer is
- the default and no configuration is required.
-
-### Network architecture
-
-The following list depicts the network architecture of Gitaly:
-
-- GitLab Rails shards repositories into [repository storages](../repository_storage_paths.md).
-- `/config/gitlab.yml` contains a map from storage names to `(Gitaly address, Gitaly token)` pairs.
-- The `storage name` -\> `(Gitaly address, Gitaly token)` map in `/config/gitlab.yml` is the single
- source of truth for the Gitaly network topology.
-- A `(Gitaly address, Gitaly token)` corresponds to a Gitaly server.
-- A Gitaly server hosts one or more storages.
-- A Gitaly client can use one or more Gitaly servers.
-- Gitaly addresses must be specified in such a way that they resolve correctly for **all** Gitaly
- clients.
-- Gitaly clients are:
- - Puma or Unicorn.
- - Sidekiq.
- - GitLab Workhorse.
- - GitLab Shell.
- - Elasticsearch indexer.
- - Gitaly itself.
-- A Gitaly server must be able to make RPC calls **to itself** by using its own
- `(Gitaly address, Gitaly token)` pair as specified in `/config/gitlab.yml`.
-- Authentication is done through a static token which is shared among the Gitaly and GitLab Rails
- nodes.
-
-WARNING:
-Gitaly servers must not be exposed to the public internet as Gitaly's network traffic is unencrypted
-by default. The use of firewall is highly recommended to restrict access to the Gitaly server.
-Another option is to [use TLS](#enable-tls-support).
-
-In the following sections, we describe how to configure two Gitaly servers with secret token
-`abc123secret`:
-
-- `gitaly1.internal`.
-- `gitaly2.internal`.
-
-We assume your GitLab installation has three repository storages:
-
-- `default`.
-- `storage1`.
-- `storage2`.
-
-You can use as few as one server with one repository storage if desired.
-
-NOTE:
-The token referred to throughout the Gitaly documentation is just an arbitrary password selected by
-the administrator. It is unrelated to tokens created for the GitLab API or other similar web API
-tokens.
-
-### Install Gitaly
-
-Install Gitaly on each Gitaly server using either Omnibus GitLab or install it from source:
-
-- For Omnibus GitLab, [download and install](https://about.gitlab.com/install/) the Omnibus GitLab
- package you want but **do not** provide the `EXTERNAL_URL=` value.
-- To install from source, follow the steps at
- [Install Gitaly](../../install/installation.md#install-gitaly).
-
-### Configure authentication
-
-Gitaly and GitLab use two shared secrets for authentication:
-
-- One to authenticate gRPC requests to Gitaly.
-- A second for authentication callbacks from GitLab Shell to the GitLab internal API.
-
-**For Omnibus GitLab**
-
-To configure the Gitaly token:
-
-1. On the Gitaly clients, edit `/etc/gitlab/gitlab.rb`:
-
- ```ruby
- gitlab_rails['gitaly_token'] = 'abc123secret'
- ```
-
-1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-1. On the Gitaly server, edit `/etc/gitlab/gitlab.rb`:
-
- ```ruby
- gitaly['auth_token'] = 'abc123secret'
- ```
-
-1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-
-There are two ways to configure the GitLab Shell token.
-
-Method 1:
-
-1. Copy `/etc/gitlab/gitlab-secrets.json` from the Gitaly client to same path on the Gitaly servers
- (and any other Gitaly clients).
-1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) on Gitaly servers.
-
-Method 2:
-
-1. On the Gitaly clients, edit `/etc/gitlab/gitlab.rb`:
-
- ```ruby
- gitlab_shell['secret_token'] = 'shellsecret'
- ```
-
-1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-1. On the Gitaly servers, edit `/etc/gitlab/gitlab.rb`:
-
- ```ruby
- gitlab_shell['secret_token'] = 'shellsecret'
- ```
-
-1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-
-**For installations from source**
-
-1. Copy `/home/git/gitlab/.gitlab_shell_secret` from the Gitaly client to the same path on the
- Gitaly servers (and any other Gitaly clients).
-1. On the Gitaly clients, edit `/home/git/gitlab/config/gitlab.yml`:
-
- ```yaml
- gitlab:
- gitaly:
- token: 'abc123secret'
- ```
-
-1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source).
-1. On the Gitaly servers, edit `/home/git/gitaly/config.toml`:
-
- ```toml
- [auth]
- token = 'abc123secret'
- ```
-
-1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source).
-
-### Configure Gitaly servers
-
-On the Gitaly servers, you must configure storage paths and enable the network listener.
-
-If you want to reduce the risk of downtime when you enable authentication, you can temporarily
-disable enforcement. For more information, see the documentation on configuring
-[Gitaly authentication](https://gitlab.com/gitlab-org/gitaly/blob/master/doc/configuration/README.md#authentication).
-
-**For Omnibus GitLab**
-
-1. Edit `/etc/gitlab/gitlab.rb`:
-
- <!--
- updates to following example must also be made at
- https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/advanced/external-gitaly/external-omnibus-gitaly.md#configure-omnibus-gitlab
- -->
-
- ```ruby
- # /etc/gitlab/gitlab.rb
-
- # Avoid running unnecessary services on the Gitaly server
- postgresql['enable'] = false
- redis['enable'] = false
- nginx['enable'] = false
- puma['enable'] = false
- sidekiq['enable'] = false
- gitlab_workhorse['enable'] = false
- grafana['enable'] = false
- gitlab_exporter['enable'] = false
-
- # If you run a separate monitoring node you can disable these services
- alertmanager['enable'] = false
- prometheus['enable'] = false
-
- # If you don't run a separate monitoring node you can
- # enable Prometheus access & disable these extra services.
- # This makes Prometheus listen on all interfaces. You must use firewalls to restrict access to this address/port.
- # prometheus['listen_address'] = '0.0.0.0:9090'
- # prometheus['monitor_kubernetes'] = false
-
- # If you don't want to run monitoring services uncomment the following (not recommended)
- # node_exporter['enable'] = false
-
- # Prevent database connections during 'gitlab-ctl reconfigure'
- gitlab_rails['rake_cache_clear'] = false
- gitlab_rails['auto_migrate'] = false
-
- # Configure the gitlab-shell API callback URL. Without this, `git push` will
- # fail. This can be your 'front door' GitLab URL or an internal load
- # balancer.
- # Don't forget to copy `/etc/gitlab/gitlab-secrets.json` from Gitaly client to Gitaly server.
- gitlab_rails['internal_api_url'] = 'https://gitlab.example.com'
-
- # Make Gitaly accept connections on all network interfaces. You must use
- # firewalls to restrict access to this address/port.
- # Comment out following line if you only want to support TLS connections
- gitaly['listen_addr'] = "0.0.0.0:8075"
- ```
-
-1. Append the following to `/etc/gitlab/gitlab.rb` for each respective Gitaly server:
-
- <!--
- updates to following example must also be made at
- https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/advanced/external-gitaly/external-omnibus-gitaly.md#configure-omnibus-gitlab
- -->
-
- On `gitaly1.internal`:
-
- ```ruby
- git_data_dirs({
- 'default' => {
- 'path' => '/var/opt/gitlab/git-data'
- },
- 'storage1' => {
- 'path' => '/mnt/gitlab/git-data'
- },
- })
- ```
-
- On `gitaly2.internal`:
-
- ```ruby
- git_data_dirs({
- 'storage2' => {
- 'path' => '/srv/gitlab/git-data'
- },
- })
- ```
-
-1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-1. Run `sudo /opt/gitlab/embedded/bin/gitaly-hooks check /var/opt/gitlab/gitaly/config.toml`
- to confirm that Gitaly can perform callbacks to the GitLab internal API.
-
-**For installations from source**
-
-1. Edit `/home/git/gitaly/config.toml`:
-
- ```toml
- listen_addr = '0.0.0.0:8075'
-
- internal_socket_dir = '/var/opt/gitlab/gitaly'
-
- [logging]
- format = 'json'
- level = 'info'
- dir = '/var/log/gitaly'
- ```
-
-1. Append the following to `/home/git/gitaly/config.toml` for each respective Gitaly server:
-
- On `gitaly1.internal`:
-
- ```toml
- [[storage]]
- name = 'default'
- path = '/var/opt/gitlab/git-data/repositories'
-
- [[storage]]
- name = 'storage1'
- path = '/mnt/gitlab/git-data/repositories'
- ```
-
- On `gitaly2.internal`:
-
- ```toml
- [[storage]]
- name = 'storage2'
- path = '/srv/gitlab/git-data/repositories'
- ```
-
-1. Edit `/home/git/gitlab-shell/config.yml`:
-
- ```yaml
- gitlab_url: https://gitlab.example.com
- ```
-
-1. Save the files and [restart GitLab](../restart_gitlab.md#installations-from-source).
-1. Run `sudo -u git /home/git/gitaly/gitaly-hooks check /home/git/gitaly/config.toml`
- to confirm that Gitaly can perform callbacks to the GitLab internal API.
-
-### Configure Gitaly clients
-
-As the final step, you must update Gitaly clients to switch from using local Gitaly service to use
-the Gitaly servers you just configured.
-
-This can be risky because anything that prevents your Gitaly clients from reaching the Gitaly
-servers causes all Gitaly requests to fail. For example, any sort of network, firewall, or name
-resolution problems.
-
-Additionally, you must [disable Rugged](../nfs.md#improving-nfs-performance-with-gitlab)
-if previously enabled manually.
-
-Gitaly makes the following assumptions:
-
-- Your `gitaly1.internal` Gitaly server can be reached at `gitaly1.internal:8075` from your Gitaly
- clients, and that Gitaly server can read, write, and set permissions on `/mnt/gitlab/default` and
- `/mnt/gitlab/storage1`.
-- Your `gitaly2.internal` Gitaly server can be reached at `gitaly2.internal:8075` from your Gitaly
- clients, and that Gitaly server can read, write, and set permissions on `/mnt/gitlab/storage2`.
-- Your `gitaly1.internal` and `gitaly2.internal` Gitaly servers can reach each other.
-
-You can't define Gitaly servers with some as a local Gitaly server
-(without `gitaly_address`) and some as remote
-server (with `gitaly_address`) unless you use
-[mixed configuration](#mixed-configuration).
-
-**For Omnibus GitLab**
-
-1. Edit `/etc/gitlab/gitlab.rb`:
-
- ```ruby
- git_data_dirs({
- 'default' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage1' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage2' => { 'gitaly_address' => 'tcp://gitaly2.internal:8075' },
- })
- ```
-
-1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-1. Run `sudo gitlab-rake gitlab:gitaly:check` on the Gitaly client (for example, the
- Rails application) to confirm it can connect to Gitaly servers.
-1. Tail the logs to see the requests:
-
- ```shell
- sudo gitlab-ctl tail gitaly
- ```
-
-**For installations from source**
-
-1. Edit `/home/git/gitlab/config/gitlab.yml`:
-
- ```yaml
- gitlab:
- repositories:
- storages:
- default:
- gitaly_address: tcp://gitaly1.internal:8075
- path: /some/local/path
- storage1:
- gitaly_address: tcp://gitaly1.internal:8075
- path: /some/local/path
- storage2:
- gitaly_address: tcp://gitaly2.internal:8075
- path: /some/local/path
- ```
-
- NOTE:
- `/some/local/path` should be set to a local folder that exists, however no data is stored in
- this folder. This requirement is scheduled to be removed when
- [this issue](https://gitlab.com/gitlab-org/gitaly/-/issues/1282) is resolved.
-
-1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source).
-1. Run `sudo -u git -H bundle exec rake gitlab:gitaly:check RAILS_ENV=production` to confirm the
- Gitaly client can connect to Gitaly servers.
-1. Tail the logs to see the requests:
-
- ```shell
- tail -f /home/git/gitlab/log/gitaly.log
- ```
-
-When you tail the Gitaly logs on your Gitaly server, you should see requests coming in. One sure way
-to trigger a Gitaly request is to clone a repository from GitLab over HTTP or HTTPS.
-
-WARNING:
-If you have [server hooks](../server_hooks.md) configured, either per repository or globally, you
-must move these to the Gitaly servers. If you have multiple Gitaly servers, copy your server hooks
-to all Gitaly servers.
-
-#### Mixed configuration
-
-GitLab can reside on the same server as one of many Gitaly servers, but doesn't support
-configuration that mixes local and remote configuration. The following setup is incorrect, because:
-
-- All addresses must be reachable from the other Gitaly servers.
-- `storage1` is assigned a Unix socket for `gitaly_address` which is
- invalid for some of the Gitaly servers.
-
-```ruby
-git_data_dirs({
- 'default' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage1' => { 'path' => '/mnt/gitlab/git-data' },
- 'storage2' => { 'gitaly_address' => 'tcp://gitaly2.internal:8075' },
-})
-```
-
-To combine local and remote Gitaly servers, use an external address for the local Gitaly server. For
-example:
-
-```ruby
-git_data_dirs({
- 'default' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- # Address of the GitLab server that has Gitaly running on it
- 'storage1' => { 'gitaly_address' => 'tcp://gitlab.internal:8075', 'path' => '/mnt/gitlab/git-data' },
- 'storage2' => { 'gitaly_address' => 'tcp://gitaly2.internal:8075' },
-})
-
-# Make Gitaly accept connections on all network interfaces
-gitaly['listen_addr'] = "0.0.0.0:8075"
-
-# Or for TLS
-gitaly['tls_listen_addr'] = "0.0.0.0:9999"
-gitaly['certificate_path'] = "/etc/gitlab/ssl/cert.pem"
-gitaly['key_path'] = "/etc/gitlab/ssl/key.pem"
-```
-
-`path` can be included only for storage shards on the local Gitaly server.
-If it's excluded, default Git storage directory is used for that storage shard.
-
-### Disable Gitaly where not required (optional)
-
-If you run Gitaly [as a remote service](#run-gitaly-on-its-own-server), consider
-disabling the local Gitaly service that runs on your GitLab server by default, and run it
-only where required.
-
-Disabling Gitaly on the GitLab instance makes sense only when you run GitLab in a custom cluster configuration, where
-Gitaly runs on a separate machine from the GitLab instance. Disabling Gitaly on all machines in the cluster is not
-a valid configuration (some machines much act as Gitaly servers).
-
-To disable Gitaly on a GitLab server:
-
-**For Omnibus GitLab**
-
-1. Edit `/etc/gitlab/gitlab.rb`:
-
- ```ruby
- gitaly['enable'] = false
- ```
-
-1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-
-**For installations from source**
-
-1. Edit `/etc/default/gitlab`:
-
- ```shell
- gitaly_enabled=false
- ```
-
-1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source).
-
-## Enable TLS support
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/22602) in GitLab 11.8.
-> - [Introduced](https://gitlab.com/gitlab-org/gitaly/-/issues/3160) in GitLab 13.6, outgoing TLS connections to GitLab provide client certificates if configured.
-
-Gitaly supports TLS encryption. To communicate with a Gitaly instance that listens for secure
-connections, use the `tls://` URL scheme in the `gitaly_address` of the corresponding
-storage entry in the GitLab configuration.
-
-Gitaly provides the same server certificates as client certificates in TLS
-connections to GitLab. This can be used as part of a mutual TLS authentication strategy
-when combined with reverse proxies (for example, NGINX) that validate client certificate
-to grant access to GitLab.
-
-You must supply your own certificates as this isn't provided automatically. The certificate
-corresponding to each Gitaly server must be installed on that Gitaly server.
-
-Additionally, the certificate (or its certificate authority) must be installed on all:
-
-- Gitaly servers.
-- Gitaly clients that communicate with it.
-
-Note the following:
-
-- The certificate must specify the address you use to access the Gitaly server. You must add the hostname or IP address as a Subject Alternative Name to the certificate.
-- You can configure Gitaly servers with both an unencrypted listening address `listen_addr` and an
- encrypted listening address `tls_listen_addr` at the same time. This allows you to gradually
- transition from unencrypted to encrypted traffic if necessary.
-
-To configure Gitaly with TLS:
-
-**For Omnibus GitLab**
-
-1. Create certificates for Gitaly servers.
-1. On the Gitaly clients, copy the certificates (or their certificate authority) into
- `/etc/gitlab/trusted-certs`:
-
- ```shell
- sudo cp cert.pem /etc/gitlab/trusted-certs/
- ```
-
-1. On the Gitaly clients, edit `git_data_dirs` in `/etc/gitlab/gitlab.rb` as follows:
-
- ```ruby
- git_data_dirs({
- 'default' => { 'gitaly_address' => 'tls://gitaly1.internal:9999' },
- 'storage1' => { 'gitaly_address' => 'tls://gitaly1.internal:9999' },
- 'storage2' => { 'gitaly_address' => 'tls://gitaly2.internal:9999' },
- })
- ```
-
-1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-1. On the Gitaly servers, create the `/etc/gitlab/ssl` directory and copy your key and certificate
- there:
-
- ```shell
- sudo mkdir -p /etc/gitlab/ssl
- sudo chmod 755 /etc/gitlab/ssl
- sudo cp key.pem cert.pem /etc/gitlab/ssl/
- sudo chmod 644 key.pem cert.pem
- ```
-
-1. Copy all Gitaly server certificates (or their certificate authority) to
- `/etc/gitlab/trusted-certs` so that Gitaly servers trust the certificate when calling into themselves
- or other Gitaly servers:
-
- ```shell
- sudo cp cert1.pem cert2.pem /etc/gitlab/trusted-certs/
- ```
-
-1. Edit `/etc/gitlab/gitlab.rb` and add:
-
- <!--
- updates to following example must also be made at
- https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/advanced/external-gitaly/external-omnibus-gitaly.md#configure-omnibus-gitlab
- -->
-
- ```ruby
- gitaly['tls_listen_addr'] = "0.0.0.0:9999"
- gitaly['certificate_path'] = "/etc/gitlab/ssl/cert.pem"
- gitaly['key_path'] = "/etc/gitlab/ssl/key.pem"
- ```
-
-1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-1. Verify Gitaly traffic is being served over TLS by
- [observing the types of Gitaly connections](#observe-type-of-gitaly-connections).
-1. (Optional) Improve security by:
- 1. Disabling non-TLS connections by commenting out or deleting `gitaly['listen_addr']` in
- `/etc/gitlab/gitlab.rb`.
- 1. Saving the file.
- 1. [Reconfiguring GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-
-**For installations from source**
-
-1. Create certificates for Gitaly servers.
-1. On the Gitaly clients, copy the certificates into the system trusted certificates:
-
- ```shell
- sudo cp cert.pem /usr/local/share/ca-certificates/gitaly.crt
- sudo update-ca-certificates
- ```
-
-1. On the Gitaly clients, edit `storages` in `/home/git/gitlab/config/gitlab.yml` as follows:
-
- ```yaml
- gitlab:
- repositories:
- storages:
- default:
- gitaly_address: tls://gitaly1.internal:9999
- path: /some/local/path
- storage1:
- gitaly_address: tls://gitaly1.internal:9999
- path: /some/local/path
- storage2:
- gitaly_address: tls://gitaly2.internal:9999
- path: /some/local/path
- ```
-
- NOTE:
- `/some/local/path` should be set to a local folder that exists, however no data is stored
- in this folder. This requirement is scheduled to be removed when
- [Gitaly issue #1282](https://gitlab.com/gitlab-org/gitaly/-/issues/1282) is resolved.
-
-1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source).
-1. On the Gitaly servers, create or edit `/etc/default/gitlab` and add:
-
- ```shell
- export SSL_CERT_DIR=/etc/gitlab/ssl
- ```
-
-1. On the Gitaly servers, create the `/etc/gitlab/ssl` directory and copy your key and certificate there:
-
- ```shell
- sudo mkdir -p /etc/gitlab/ssl
- sudo chmod 755 /etc/gitlab/ssl
- sudo cp key.pem cert.pem /etc/gitlab/ssl/
- sudo chmod 644 key.pem cert.pem
- ```
-
-1. Copy all Gitaly server certificates (or their certificate authority) to the system trusted
- certificates folder so Gitaly server trusts the certificate when calling into itself or other Gitaly
- servers.
-
- ```shell
- sudo cp cert.pem /usr/local/share/ca-certificates/gitaly.crt
- sudo update-ca-certificates
- ```
-
-1. Edit `/home/git/gitaly/config.toml` and add:
-
- ```toml
- tls_listen_addr = '0.0.0.0:9999'
-
- [tls]
- certificate_path = '/etc/gitlab/ssl/cert.pem'
- key_path = '/etc/gitlab/ssl/key.pem'
- ```
-
-1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source).
-1. Verify Gitaly traffic is being served over TLS by
- [observing the types of Gitaly connections](#observe-type-of-gitaly-connections).
-1. (Optional) Improve security by:
- 1. Disabling non-TLS connections by commenting out or deleting `listen_addr` in
- `/home/git/gitaly/config.toml`.
- 1. Saving the file.
- 1. [Restarting GitLab](../restart_gitlab.md#installations-from-source).
-
-### Observe type of Gitaly connections
-
-[Prometheus](../monitoring/prometheus/index.md) can be used observe what type of connections Gitaly
-is serving a production environment. Use the following Prometheus query:
-
-```prometheus
-sum(rate(gitaly_connections_total[5m])) by (type)
-```
-
-## `gitaly-ruby`
-
-Gitaly was developed to replace the Ruby application code in GitLab.
-
-To save time and avoid the risk of rewriting existing application logic, we chose to copy some
-application code from GitLab into Gitaly.
-
-To be able to run that code, `gitaly-ruby` was created, which is a "sidecar" process for the main
-Gitaly Go process. Some examples of things that are implemented in `gitaly-ruby` are:
-
-- RPCs that deal with wikis.
-- RPCs that create commits on behalf of a user, such as merge commits.
-
-We recommend:
-
-- At least 300 MB memory per worker.
-- No more than one worker per core.
-
-NOTE:
-`gitaly-ruby` is planned to be eventually removed. To track progress, see the
-[Remove the Gitaly-Ruby sidecar](https://gitlab.com/groups/gitlab-org/-/epics/2862) epic.
-
-### Configure number of `gitaly-ruby` workers
-
-`gitaly-ruby` has much less capacity than Gitaly implemented in Go. If your Gitaly server has to handle lots of
-requests, the default setting of having just one active `gitaly-ruby` sidecar might not be enough.
-
-If you see `ResourceExhausted` errors from Gitaly, it's very likely that you have not enough
-`gitaly-ruby` capacity.
-
-You can increase the number of `gitaly-ruby` processes on your Gitaly server with the following
-settings:
-
-**For Omnibus GitLab**
-
-1. Edit `/etc/gitlab/gitlab.rb`:
-
- ```ruby
- # Default is 2 workers. The minimum is 2; 1 worker is always reserved as
- # a passive stand-by.
- gitaly['ruby_num_workers'] = 4
- ```
-
-1. Save the file, and then [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-
-**For installations from source**
-
-1. Edit `/home/git/gitaly/config.toml`:
-
- ```toml
- [gitaly-ruby]
- num_workers = 4
- ```
-
-1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source).
-
-## Limit RPC concurrency
-
-Clone traffic can put a large strain on your Gitaly service. The bulk of the work gets done in the
-either of the following RPCs:
-
-- `SSHUploadPack` (for Git SSH).
-- `PostUploadPack` (for Git HTTP).
-
-To prevent such workloads from overwhelming your Gitaly server, you can set concurrency limits in
-Gitaly's configuration file. For example:
-
-```ruby
-# in /etc/gitlab/gitlab.rb
-
-gitaly['concurrency'] = [
- {
- 'rpc' => "/gitaly.SmartHTTPService/PostUploadPack",
- 'max_per_repo' => 20
- },
- {
- 'rpc' => "/gitaly.SSHService/SSHUploadPack",
- 'max_per_repo' => 20
- }
-]
-```
-
-This limits the number of in-flight RPC calls for the given RPCs. The limit is applied per
-repository. In the example above:
-
-- Each repository served by the Gitaly server can have at most 20 simultaneous `PostUploadPack` RPC
- calls in flight, and the same for `SSHUploadPack`.
-- If another request comes in for a repository that has used up its 20 slots, that request gets
- queued.
-
-You can observe the behavior of this queue using the Gitaly logs and Prometheus:
-
-- In the Gitaly logs, look for the string (or structured log field) `acquire_ms`. Messages that have
- this field are reporting about the concurrency limiter.
-- In Prometheus, look for the following metrics:
-
- - `gitaly_rate_limiting_in_progress`.
- - `gitaly_rate_limiting_queued`.
- - `gitaly_rate_limiting_seconds`.
-
-NOTE:
-Although the name of the Prometheus metric contains `rate_limiting`, it's a concurrency limiter, not
-a rate limiter. If a Gitaly client makes 1,000 requests in a row very quickly, concurrency doesn't
-exceed 1, and the concurrency limiter has no effect.
-
-## Background Repository Optimization
-
-Empty directories and unneeded config settings may accumulate in a repository and
-slow down Git operations. Gitaly can schedule a daily background task with a maximum duration
-to clean up these items and improve performance.
-
-WARNING:
-This is an experimental feature and may place significant load on the host while running.
-Make sure to schedule this during off-peak hours and keep the duration short (for example, 30-60 minutes).
-
-**For Omnibus GitLab**
-
-Edit `/etc/gitlab/gitlab.rb` and add:
-
-```ruby
-gitaly['daily_maintenance_start_hour'] = 4
-gitaly['daily_maintenance_start_minute'] = 30
-gitaly['daily_maintenance_duration'] = '30m'
-gitaly['daily_maintenance_storages'] = ["default"]
-```
-
-**For installations from source**
-
-Edit `/home/git/gitaly/config.toml` and add:
-
-```toml
-[daily_maintenance]
-start_hour = 4
-start_minute = 30
-duration = '30m'
-storages = ["default"]
-```
-
-## Rotate Gitaly authentication token
-
-Rotating credentials in a production environment often requires downtime, causes outages, or both.
-
-However, you can rotate Gitaly credentials without a service interruption. Rotating a Gitaly
-authentication token involves:
-
-- [Verifying authentication monitoring](#verify-authentication-monitoring).
-- [Enabling "auth transitioning" mode](#enable-auth-transitioning-mode).
-- [Updating Gitaly authentication tokens](#update-gitaly-authentication-token).
-- [Ensuring there are no authentication failures](#ensure-there-are-no-authentication-failures).
-- [Disabling "auth transitioning" mode](#disable-auth-transitioning-mode).
-- [Verifying authentication is enforced](#verify-authentication-is-enforced).
-
-This procedure also works if you are running GitLab on a single server. In that case, "Gitaly
-server" and "Gitaly client" refers to the same machine.
-
-### Verify authentication monitoring
-
-Before rotating a Gitaly authentication token, verify that you can monitor the authentication
-behavior of your GitLab installation using Prometheus. Use the following Prometheus query:
-
-```prometheus
-sum(rate(gitaly_authentications_total[5m])) by (enforced, status)
-```
-
-In a system where authentication is configured correctly and where you have live traffic, you
-see something like this:
-
-```prometheus
-{enforced="true",status="ok"} 4424.985419441742
-```
-
-There may also be other numbers with rate 0. We care only about the non-zero numbers.
-
-The only non-zero number should have `enforced="true",status="ok"`. If you have other non-zero
-numbers, something is wrong in your configuration.
-
-The `status="ok"` number reflects your current request rate. In the example above, Gitaly is
-handling about 4000 requests per second.
-
-Now that you have established that you can monitor the Gitaly authentication behavior of your GitLab
-installation, you can begin the rest of the procedure.
-
-### Enable "auth transitioning" mode
-
-Temporarily disable Gitaly authentication on the Gitaly servers by putting them into "auth
-transitioning" mode as follows:
-
-```ruby
-# in /etc/gitlab/gitlab.rb
-gitaly['auth_transitioning'] = true
-```
-
-After you have made this change, your [Prometheus query](#verify-authentication-monitoring)
-should return something like:
-
-```prometheus
-{enforced="false",status="would be ok"} 4424.985419441742
-```
-
-Because `enforced="false"`, it is safe to start rolling out the new token.
-
-### Update Gitaly authentication token
-
-To update to a new Gitaly authentication token, on each Gitaly client **and** Gitaly server:
-
-1. Update the configuration:
-
- ```ruby
- # in /etc/gitlab/gitlab.rb
-
- gitaly['auth_token'] = '<new secret token>'
- ```
-
-1. Restart Gitaly:
-
- ```shell
- gitlab-ctl restart gitaly
- ```
-
-If you run your [Prometheus query](#verify-authentication-monitoring) while this change is
-being rolled out, you see non-zero values for the `enforced="false",status="denied"` counter.
-
-### Ensure there are no authentication failures
-
-After the new token is set, and all services involved have been restarted, you will
-[temporarily see](#verify-authentication-monitoring) a mix of:
-
-- `status="would be ok"`.
-- `status="denied"`.
-
-After the new token is picked up by all Gitaly clients and Gitaly servers, the
-**only non-zero rate** should be `enforced="false",status="would be ok"`.
-
-### Disable "auth transitioning" mode
-
-To re-enable Gitaly authentication, disable "auth transitioning" mode. Update the configuration on
-your Gitaly servers as follows:
-
-```ruby
-# in /etc/gitlab/gitlab.rb
-gitaly['auth_transitioning'] = false
-```
-
-WARNING:
-Without completing this step, you have **no Gitaly authentication**.
-
-### Verify authentication is enforced
-
-Refresh your [Prometheus query](#verify-authentication-monitoring). You should now see a similar
-result as you did at the start. For example:
-
-```prometheus
-{enforced="true",status="ok"} 4424.985419441742
-```
-
-Note that `enforced="true"` means that authentication is being enforced.
+Gitaly comes pre-configured with Omnibus GitLab. For more information on customizing your
+Gitaly installation, see [Configure Gitaly](configure_gitaly.md).
## Direct Git access bypassing Gitaly
@@ -1150,7 +227,7 @@ internally pools and re-uses those across RPCs.
### Observing `gitaly-ruby` traffic
-[`gitaly-ruby`](#gitaly-ruby) is an internal implementation detail of Gitaly,
+[`gitaly-ruby`](configure_gitaly.md#gitaly-ruby) is an internal implementation detail of Gitaly,
so, there's not that much visibility into what goes on inside
`gitaly-ruby` processes.
@@ -1178,7 +255,7 @@ If you run Gitaly on its own server and notice these conditions:
make changes to them in the web UI.
Gitaly may be failing to authenticate with the Gitaly client because it has the
-[wrong secrets file](#configure-gitaly-servers).
+[wrong secrets file](configure_gitaly.md#configure-gitaly-servers).
Confirm the following are all true:
@@ -1198,7 +275,7 @@ Confirm the following are all true:
successfully creates the project, but doesn't create the README.
- When [tailing the logs](https://docs.gitlab.com/omnibus/settings/logs.html#tail-logs-in-a-console-on-the-server)
on a Gitaly client and reproducing the error, you get `401` errors
- when reaching the `/api/v4/internal/allowed` endpoint:
+ when reaching the [`/api/v4/internal/allowed`](../../development/internal_api.md) endpoint:
```shell
# api_json.log
@@ -1259,7 +336,7 @@ Confirm the following are all true:
[IP] - - [18/Jul/2019:00:30:14 +0000] "POST /api/v4/internal/allowed HTTP/1.1" 401 30 "" "Ruby"
```
-To fix this problem, confirm that your [`gitlab-secrets.json` file](#configure-gitaly-servers)
+To fix this problem, confirm that your [`gitlab-secrets.json` file](configure_gitaly.md#configure-gitaly-servers)
on the Gitaly server matches the one on Gitaly client. If it doesn't match,
update the secrets file on the Gitaly server to match the Gitaly client, then
[reconfigure](../restart_gitlab.md#omnibus-gitlab-reconfigure).
diff --git a/doc/administration/gitaly/praefect.md b/doc/administration/gitaly/praefect.md
index 45f478b8d16..80b5c1bb799 100644
--- a/doc/administration/gitaly/praefect.md
+++ b/doc/administration/gitaly/praefect.md
@@ -701,7 +701,7 @@ Particular attention should be shown to:
`gitaly-2`, and `gitaly-3` as Gitaly storage names.
For more information on Gitaly server configuration, see our [Gitaly
-documentation](index.md#configure-gitaly-servers).
+documentation](configure_gitaly.md#configure-gitaly-servers).
1. SSH into the **Gitaly** node and login as root:
@@ -834,7 +834,7 @@ scope of the GitLab documentation.
NOTE:
The load balancer must be configured to accept traffic from the Gitaly nodes in
addition to the GitLab nodes. Some requests handled by
-[`gitaly-ruby`](index.md#gitaly-ruby) sidecar processes call into the main Gitaly
+[`gitaly-ruby`](configure_gitaly.md#gitaly-ruby) sidecar processes call into the main Gitaly
process. `gitaly-ruby` uses the Gitaly address set in the GitLab server's
`git_data_dirs` setting to make this connection.
diff --git a/doc/administration/gitaly/reference.md b/doc/administration/gitaly/reference.md
index 5105b9ed0d4..f08b03017e4 100644
--- a/doc/administration/gitaly/reference.md
+++ b/doc/administration/gitaly/reference.md
@@ -91,7 +91,7 @@ certificate_path = '/home/git/cert.cert'
key_path = '/home/git/key.pem'
```
-[Read more](index.md#enable-tls-support) about TLS in Gitaly.
+[Read more](configure_gitaly.md#enable-tls-support) about TLS in Gitaly.
### Storage
diff --git a/doc/administration/index.md b/doc/administration/index.md
index e5f20e3ba05..15a3bee4004 100644
--- a/doc/administration/index.md
+++ b/doc/administration/index.md
@@ -130,7 +130,7 @@ Learn how to install, configure, update, and maintain your GitLab instance.
- [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 within GitLab.
-- [User Cohorts](../user/admin_area/analytics/user_cohorts.md): Display the monthly cohorts of new users and their activities over time.
+- [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 within the GitLab server for:
- Groups and projects.
- Instances.
@@ -176,7 +176,7 @@ Learn how to install, configure, update, and maintain your GitLab instance.
- [Job logs](job_logs.md): Information about the job logs.
- [Register runners](../ci/runners/README.md#types-of-runners): Learn how to register and configure runners.
- [Shared runners pipelines quota](../user/admin_area/settings/continuous_integration.md#shared-runners-pipeline-minutes-quota): Limit the usage of pipeline minutes for shared runners.
-- [Enable/disable Auto DevOps](../topics/autodevops/index.md#enablingdisabling-auto-devops): Enable or disable Auto DevOps for your instance.
+- [Enable/disable Auto DevOps](../topics/autodevops/index.md#enable-or-disable-auto-devops): Enable or disable Auto DevOps for your instance.
## Snippet settings
diff --git a/doc/administration/instance_limits.md b/doc/administration/instance_limits.md
index 27e8b13812f..ac37ee00210 100644
--- a/doc/administration/instance_limits.md
+++ b/doc/administration/instance_limits.md
@@ -107,7 +107,7 @@ Limit the maximum daily member invitations allowed per group hierarchy.
Clone traffic can put a large strain on your Gitaly service. To prevent such workloads from overwhelming your Gitaly server, you can set concurrency limits in Gitaly’s configuration file.
-Read more on [Gitaly concurrency limits](gitaly/index.md#limit-rpc-concurrency).
+Read more on [Gitaly concurrency limits](gitaly/configure_gitaly.md#limit-rpc-concurrency).
- **Default rate limit** - Disabled
@@ -526,7 +526,7 @@ amount of memory during indexing.
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/201826) in GitLab 12.8.
-You can set a limit on the content of text fields indexed for Global Search.
+You can set a limit on the content of text fields indexed for Advanced Search.
Setting a maximum helps to reduce the load of the indexing processes. If any
text field exceeds this limit then the text will be truncated to this number of
characters and the rest will not be indexed and hence will not be searchable.
diff --git a/doc/administration/integration/kroki.md b/doc/administration/integration/kroki.md
index 5e458399773..9e9ea62c44e 100644
--- a/doc/administration/integration/kroki.md
+++ b/doc/administration/integration/kroki.md
@@ -56,7 +56,7 @@ You need to enable Kroki integration from Settings under Admin Area.
To do that, log in with an administrator account and follow these steps:
1. Select the Admin Area (**{admin}**) icon.
-1. Navigate to **Settings > General**.
+1. Go to **Settings > General**.
1. Expand the **Kroki** section.
1. Select **Enable Kroki** checkbox.
1. Enter the **Kroki URL**.
diff --git a/doc/administration/integration/plantuml.md b/doc/administration/integration/plantuml.md
index dbbe17cccc8..834f4047fdd 100644
--- a/doc/administration/integration/plantuml.md
+++ b/doc/administration/integration/plantuml.md
@@ -5,22 +5,94 @@ info: "To determine the technical writer assigned to the Stage/Group associated
type: reference, howto
---
-# PlantUML & GitLab **(FREE)**
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/8537) in GitLab 8.16.
+# PlantUML and GitLab **(FREE)**
When [PlantUML](https://plantuml.com) integration is enabled and configured in
-GitLab you can create diagrams in AsciiDoc and Markdown documents
-created in snippets, wikis, and repositories.
+GitLab, you can create diagrams in snippets, wikis, and repositories. To set up
+the integration, you must:
+
+1. [Configure your PlantUML server](#configure-your-plantuml-server).
+1. [Configure local PlantUML access](#configure-local-plantuml-access).
+1. [Configure PlantUML security](#configure-plantuml-security).
+1. [Enable the integration](#enable-plantuml-integration).
+
+After completing the integration, PlantUML converts `plantuml`
+blocks to an HTML image tag, with the source pointing to the PlantUML instance. The PlantUML
+diagram delimiters `@startuml`/`@enduml` aren't required, as these are replaced
+by the `plantuml` block:
+
+- **Markdown**
+
+ ````markdown
+ ```plantuml
+ Bob -> Alice : hello
+ Alice -> Bob : hi
+ ```
+ ````
+
+- **AsciiDoc**
+
+ ```plaintext
+ [plantuml, format="png", id="myDiagram", width="200px"]
+ ----
+ Bob->Alice : hello
+ Alice -> Bob : hi
+ ----
+ ```
+
+- **reStructuredText**
-## PlantUML Server
+ ```plaintext
+ .. plantuml::
+ :caption: Caption with **bold** and *italic*
+
+ Bob -> Alice: hello
+ Alice -> Bob: hi
+ ```
-Before you can enable PlantUML in GitLab; set up your own PlantUML
-server to generate the diagrams.
+ Although you can use the `uml::` directive for compatibility with
+ [`sphinxcontrib-plantuml`](https://pypi.org/project/sphinxcontrib-plantuml/),
+ GitLab supports only the `caption` option.
+
+If the PlantUML server is correctly configured, these examples should render a
+diagram instead of the code block:
+
+```plantuml
+Bob -> Alice : hello
+Alice -> Bob : hi
+```
+
+Inside the block you can add any of the diagrams PlantUML supports, such as:
+
+- [Activity](https://plantuml.com/activity-diagram-legacy)
+- [Class](https://plantuml.com/class-diagram)
+- [Component](https://plantuml.com/component-diagram)
+- [Object](https://plantuml.com/object-diagram)
+- [Sequence](https://plantuml.com/sequence-diagram)
+- [State](https://plantuml.com/state-diagram)
+- [Use Case](https://plantuml.com/use-case-diagram)
+
+You can add parameters to block definitions:
+
+- `format`: Can be either `png` (default) or `svg`. Use `svg` with care, as it's
+ not supported by all browsers, and isn't supported by Markdown.
+- `id`: A CSS ID added to the diagram HTML tag.
+- `width`: Width attribute added to the image tag.
+- `height`: Height attribute added to the image tag.
+
+Markdown does not support any parameters, and always uses PNG format.
+
+## Configure your PlantUML server
+
+Before you can enable PlantUML in GitLab, set up your own PlantUML
+server to generate the diagrams:
+
+- [In Docker](#docker).
+- [In Debian/Ubuntu](#debianubuntu).
### Docker
-With Docker, you can just run a container like this:
+To run a PlantUML container in Docker, run this command:
```shell
docker run -d --name plantuml -p 8080:8080 plantuml/plantuml-server:tomcat
@@ -29,8 +101,9 @@ docker run -d --name plantuml -p 8080:8080 plantuml/plantuml-server:tomcat
The **PlantUML URL** is the hostname of the server running the container.
When running GitLab in Docker, it must have access to the PlantUML container.
-You can achieve that by using [Docker Compose](https://docs.docker.com/compose/).
-A basic `docker-compose.yml` file could contain:
+To achieve that, use [Docker Compose](https://docs.docker.com/compose/).
+In this basic `docker-compose.yml` file, PlantUML is accessible to GitLab at the URL
+`http://plantuml:8080/`:
```yaml
version: "3"
@@ -46,37 +119,32 @@ services:
container_name: plantuml
```
-In this scenario, PlantUML is accessible to GitLab at the URL
-`http://plantuml:8080/`.
-
### Debian/Ubuntu
-You can also install and configure a PlantUML server in Debian/Ubuntu distributions using Tomcat.
+You can install and configure a PlantUML server in Debian/Ubuntu distributions
+using Tomcat:
-First you need to create a `plantuml.war` file from the source code:
+1. Run these commands to create a `plantuml.war` file from the source code:
-```shell
-sudo apt-get install graphviz openjdk-8-jdk git-core maven
-git clone https://github.com/plantuml/plantuml-server.git
-cd plantuml-server
-mvn package
-```
+ ```shell
+ sudo apt-get install graphviz openjdk-8-jdk git-core maven
+ git clone https://github.com/plantuml/plantuml-server.git
+ cd plantuml-server
+ mvn package
+ ```
-The above sequence of commands generates a `.war` file you can deploy with Tomcat:
+1. Deploy the `.war` file from the previous step with these commands:
-```shell
-sudo apt-get install tomcat8
-sudo cp target/plantuml.war /var/lib/tomcat8/webapps/plantuml.war
-sudo chown tomcat8:tomcat8 /var/lib/tomcat8/webapps/plantuml.war
-sudo service tomcat8 restart
-```
+ ```shell
+ sudo apt-get install tomcat8
+ sudo cp target/plantuml.war /var/lib/tomcat8/webapps/plantuml.war
+ sudo chown tomcat8:tomcat8 /var/lib/tomcat8/webapps/plantuml.war
+ sudo service tomcat8 restart
+ ```
-After the Tomcat service restarts, the PlantUML service is ready and
-listening for requests on port 8080:
-
-```plaintext
-http://localhost:8080/plantuml
-```
+The Tomcat service should restart. After the restart is complete, the
+PlantUML service is ready and listening for requests on port 8080:
+`http://localhost:8080/plantuml`
To change these defaults, edit the `/etc/tomcat8/server.xml` file.
@@ -85,40 +153,44 @@ The default URL is different when using this approach. The Docker-based image
makes the service available at the root URL, with no relative path. Adjust
the configuration below accordingly.
-### Making local PlantUML accessible using custom GitLab setup
+## Configure local PlantUML access
-The PlantUML server runs locally on your server, so it is not accessible
-externally by default. As such, it is necessary to catch external PlantUML
-calls and redirect them to the local server.
+The PlantUML server runs locally on your server, so it can't be accessed
+externally by default. Your server must catch external PlantUML
+calls to `https://gitlab.example.com/-/plantuml/` and redirect them to the
+local PlantUML server. Depending on your setup, the URL is either of the
+following:
-The idea is to redirect each call to `https://gitlab.example.com/-/plantuml/`
-to the local PlantUML server `http://plantuml:8080/` or `http://localhost:8080/plantuml/`, depending on your setup.
+- `http://plantuml:8080/`
+- `http://localhost:8080/plantuml/`
-To enable the redirection, add the following line in `/etc/gitlab/gitlab.rb`:
+If you're running [GitLab with TLS](https://docs.gitlab.com/omnibus/settings/ssl.html)
+you must configure this redirection, because PlantUML uses the insecure HTTP protocol.
+Newer browsers such as [Google Chrome 86+](https://www.chromestatus.com/feature/4926989725073408)
+don't load insecure HTTP resources on pages served over HTTPS.
-```ruby
-# Docker deployment
-nginx['custom_gitlab_server_config'] = "location /-/plantuml/ { \n proxy_cache off; \n proxy_pass http://plantuml:8080/; \n}\n"
+To enable this redirection:
-# Built from source
-nginx['custom_gitlab_server_config'] = "location /-/plantuml { \n rewrite ^/-/(plantuml.*) /$1 break;\n proxy_cache off; \n proxy_pass http://localhost:8080/plantuml; \n}\n"
-```
+1. Add the following line in `/etc/gitlab/gitlab.rb`, depending on your setup method:
-To activate the changes, run the following command:
+ ```ruby
+ # Docker deployment
+ nginx['custom_gitlab_server_config'] = "location /-/plantuml/ { \n proxy_cache off; \n proxy_pass http://plantuml:8080/; \n}\n"
-```shell
-sudo gitlab-ctl reconfigure
-```
+ # Built from source
+ nginx['custom_gitlab_server_config'] = "location /-/plantuml { \n rewrite ^/-/(plantuml.*) /$1 break;\n proxy_cache off; \n proxy_pass http://localhost:8080/plantuml; \n}\n"
+ ```
-Note that the redirection through GitLab must be configured
-when running [GitLab with TLS](https://docs.gitlab.com/omnibus/settings/ssl.html)
-due to PlantUML's use of the insecure HTTP protocol. Newer browsers such
-as [Google Chrome 86+](https://www.chromestatus.com/feature/4926989725073408)
-do not load insecure HTTP resources on a page served over HTTPS.
+1. To activate the changes, run the following command:
-### Security
+ ```shell
+ sudo gitlab-ctl reconfigure
+ ```
-PlantUML has features that allow fetching network resources.
+### Configure PlantUML security
+
+PlantUML has features that allow fetching network resources. If you self-host the
+PlantUML server, put network controls in place to isolate it.
```plaintext
@startuml
@@ -129,98 +201,29 @@ stop;
@enduml
```
-**If you self-host the PlantUML server, network controls should be put in place to isolate it.**
-
-## GitLab
+## Enable PlantUML integration
-You need to enable PlantUML integration from Settings under Admin Area. To do
-that, sign in with an Administrator account, and then do following:
+After configuring your local PlantUML server, you're ready to enable the PlantUML integration:
-1. In GitLab, go to **Admin Area > Settings > General**.
-1. Expand the **PlantUML** section.
+1. Sign in to GitLab as an [Administrator](../../user/permissions.md) user.
+1. In the top menu, click **{admin}** **Admin Area**.
+1. In the left sidebar, go to **Settings > General** and expand the **PlantUML** section.
1. Select the **Enable PlantUML** check box.
-1. Set the PlantUML instance as `https://gitlab.example.com/-/plantuml/`.
-
-NOTE:
-If you are using a PlantUML server running v1.2020.9 and
-above (for example, [plantuml.com](https://plantuml.com)), set the `PLANTUML_ENCODING`
-environment variable to enable the `deflate` compression. On Omnibus GitLab,
-this can be set in `/etc/gitlab.rb`:
-
-```ruby
-gitlab_rails['env'] = { 'PLANTUML_ENCODING' => 'deflate' }
-```
-
-From GitLab 13.1 and later, PlantUML integration now
-[requires a header prefix in the URL](https://github.com/plantuml/plantuml/issues/117#issuecomment-6235450160)
-to distinguish different encoding types.
-
-## Creating Diagrams
-
-With PlantUML integration enabled and configured, we can start adding diagrams to
-our AsciiDoc snippets, wikis, and repositories using delimited blocks:
-
-- **Markdown**
-
- ````markdown
- ```plantuml
- Bob -> Alice : hello
- Alice -> Bob : hi
- ```
- ````
-
-- **AsciiDoc**
-
- ```plaintext
- [plantuml, format="png", id="myDiagram", width="200px"]
- ----
- Bob->Alice : hello
- Alice -> Bob : hi
- ----
- ```
-
-- **reStructuredText**
-
- ```plaintext
- .. plantuml::
- :caption: Caption with **bold** and *italic*
-
- Bob -> Alice: hello
- Alice -> Bob: hi
- ```
+1. Set the PlantUML instance as `https://gitlab.example.com/-/plantuml/`,
+ and click **Save changes**.
- You can also use the `uml::` directive for compatibility with
- [`sphinxcontrib-plantuml`](https://pypi.org/project/sphinxcontrib-plantuml/),
- but GitLab only supports the `caption` option.
+Depending on your PlantUML and GitLab version numbers, you may also need to take
+these steps:
-The above blocks are converted to an HTML image tag with source pointing to the
-PlantUML instance. If the PlantUML server is correctly configured, this should
-render a nice diagram instead of the block:
+- For PlantUML servers running v1.2020.9 and above, such as [plantuml.com](https://plantuml.com),
+ you must set the `PLANTUML_ENCODING` environment variable to enable the `deflate`
+ compression. In Omnibus GitLab, you can set this value in `/etc/gitlab.rb` with
+ this command:
-```plantuml
-Bob -> Alice : hello
-Alice -> Bob : hi
-```
-
-Inside the block you can add any of the diagrams PlantUML supports, such as:
-
-- [Sequence](https://plantuml.com/sequence-diagram)
-- [Use Case](https://plantuml.com/use-case-diagram)
-- [Class](https://plantuml.com/class-diagram)
-- [Activity](https://plantuml.com/activity-diagram-legacy)
-- [Component](https://plantuml.com/component-diagram)
-- [State](https://plantuml.com/state-diagram),
-- [Object](https://plantuml.com/object-diagram)
-
-You do not need to use the PlantUML
-diagram delimiters `@startuml`/`@enduml`, as these are replaced by the AsciiDoc `plantuml` block.
-
-Some parameters can be added to the AsciiDoc block definition:
-
-- `format`: Can be either `png` or `svg`. Note that `svg` is not supported by
- all browsers so use with care. The default is `png`.
-- `id`: A CSS ID added to the diagram HTML tag.
-- `width`: Width attribute added to the image tag.
-- `height`: Height attribute added to the image tag.
+ ```ruby
+ gitlab_rails['env'] = { 'PLANTUML_ENCODING' => 'deflate' }
+ ```
-Markdown does not support any parameters and always uses PNG format.
+- For GitLab versions 13.1 and later, PlantUML integration now
+ [requires a header prefix in the URL](https://github.com/plantuml/plantuml/issues/117#issuecomment-6235450160)
+ to distinguish different encoding types.
diff --git a/doc/administration/integration/terminal.md b/doc/administration/integration/terminal.md
index 0f26eb83d17..644e2d905ae 100644
--- a/doc/administration/integration/terminal.md
+++ b/doc/administration/integration/terminal.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Web terminals
+# Web terminals **(FREE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/7690) in GitLab 8.15.
diff --git a/doc/administration/invalidate_markdown_cache.md b/doc/administration/invalidate_markdown_cache.md
index 211316534ee..7a880c81843 100644
--- a/doc/administration/invalidate_markdown_cache.md
+++ b/doc/administration/invalidate_markdown_cache.md
@@ -1,6 +1,6 @@
---
-stage: Create
-group: Source Code
+stage: Plan
+group: Project Management
info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments"
type: reference
---
diff --git a/doc/administration/issue_closing_pattern.md b/doc/administration/issue_closing_pattern.md
index 32d367bb15e..3b9ec74e6ee 100644
--- a/doc/administration/issue_closing_pattern.md
+++ b/doc/administration/issue_closing_pattern.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+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"
type: reference
---
@@ -12,7 +12,7 @@ This is the administration documentation. There is a separate [user documentatio
on issue closing pattern.
When a commit or merge request resolves one or more issues, it is possible to
-automatically have these issues closed when the commit or merge request lands
+automatically close these issues when the commit or merge request lands
in the project's default branch.
## Change the issue closing pattern
@@ -35,7 +35,7 @@ Because Rubular doesn't understand `%{issue_ref}`, you can replace this by
expression of your liking:
```ruby
- gitlab_rails['gitlab_issue_closing_pattern'] = "\b((?:[Cc]los(?:e[sd]?|ing)|\b[Ff]ix(?:e[sd]|ing)?|\b[Rr]esolv(?:e[sd]?|ing)|\b[Ii]mplement(?:s|ed|ing)?)(:?) +(?:(?:issues? +)?%{issue_ref}(?:(?: *,? +and +| *,? *)?)|([A-Z][A-Z0-9_]+-\d+))+)"
+ gitlab_rails['gitlab_issue_closing_pattern'] = /\b((?:[Cc]los(?:e[sd]?|ing)|\b[Ff]ix(?:e[sd]|ing)?|\b[Rr]esolv(?:e[sd]?|ing)|\b[Ii]mplement(?:s|ed|ing)?)(:?) +(?:(?:issues? +)?%{issue_ref}(?:(?: *,? +and +| *,? *)?)|([A-Z][A-Z0-9_]+-\d+))+)/.source
```
1. [Reconfigure](restart_gitlab.md#omnibus-gitlab-reconfigure) GitLab for the changes to take effect.
diff --git a/doc/administration/logs.md b/doc/administration/logs.md
index 17ecb324417..1950403ce35 100644
--- a/doc/administration/logs.md
+++ b/doc/administration/logs.md
@@ -14,10 +14,12 @@ Find more about them [in Audit Events documentation](audit_events.md).
System log files are typically plain text in a standard log file format.
This guide talks about how to read and use these system log files.
-Read more about how to
-[customize logging on Omnibus GitLab installations](https://docs.gitlab.com/omnibus/settings/logs.html)
+Read more about the log system and using the logs:
+
+- [Customize logging on Omnibus GitLab installations](https://docs.gitlab.com/omnibus/settings/logs.html)
including adjusting log retention, log forwarding,
switching logs from JSON to plain text logging, and more.
+- [How to parse and analyze JSON logs](troubleshooting/log_parsing.md).
## `production_json.log`
@@ -87,7 +89,7 @@ In addition, the log contains the originating IP address,
(`remote_ip`), the user's ID (`user_id`), and username (`username`).
Some endpoints such as `/search` may make requests to Elasticsearch if using
-[Advanced Search](../user/search/advanced_global_search.md). These
+[Advanced Search](../user/search/advanced_search.md). These
additionally log `elasticsearch_calls` and `elasticsearch_call_duration_s`,
which correspond to:
diff --git a/doc/administration/maintenance_mode/index.md b/doc/administration/maintenance_mode/index.md
index 61d321f2176..1cdbda05749 100644
--- a/doc/administration/maintenance_mode/index.md
+++ b/doc/administration/maintenance_mode/index.md
@@ -172,7 +172,7 @@ You can monitor queues and disable jobs in **Admin Area > Monitoring > Backgroun
[Incident management](../../operations/incident_management/index.md) functions will be limited. The creation of [alerts](../../operations/incident_management/alerts.md) and [incidents](../../operations/incident_management/incidents.md#incident-creation) will be paused entirely. Notifications and paging on alerts and incidents will therefore be disabled.
-### Feature flags
+### Feature flags
- [Development feature flags](../../development/feature_flags/index.md) cannot be turned on or off through the API, but can be toggled through the Rails console.
- [The feature flag service](../../operations/feature_flags.md) will respond to feature flag checks but feature flags cannot be toggled
diff --git a/doc/administration/monitoring/gitlab_self_monitoring_project/index.md b/doc/administration/monitoring/gitlab_self_monitoring_project/index.md
index 1262c4192f6..f389a2d2176 100644
--- a/doc/administration/monitoring/gitlab_self_monitoring_project/index.md
+++ b/doc/administration/monitoring/gitlab_self_monitoring_project/index.md
@@ -32,7 +32,7 @@ metrics exposed by the [GitLab exporter](../prometheus/gitlab_metrics.md#metrics
## Creating the self monitoring project
-1. Navigate to **Admin Area > Settings > Metrics and profiling**, and expand the **Self monitoring** section.
+1. Go to **Admin Area > Settings > Metrics and profiling** and expand the **Self monitoring** section.
1. Toggle the **Create Project** button on.
1. Once your GitLab instance creates the project, GitLab displays a link to the project in the text above the **Create Project** toggle. You can also find it under **Projects > Your projects**.
@@ -42,7 +42,7 @@ WARNING:
Deleting the self monitoring project removes any changes made to the project. If
you create the project again, it's created in its default state.
-1. Navigate to **Admin Area > Settings > Metrics and profiling**, and expand the **Self monitoring** section.
+1. Go to **Admin Area > Settings > Metrics and profiling** and expand the **Self monitoring** section.
1. Toggle the **Create Project** button off.
1. In the confirmation dialog that opens, click **Delete project**.
It can take a few seconds for it to be deleted.
diff --git a/doc/administration/monitoring/index.md b/doc/administration/monitoring/index.md
index ac09acf2d2e..d2e5f40b171 100644
--- a/doc/administration/monitoring/index.md
+++ b/doc/administration/monitoring/index.md
@@ -11,9 +11,19 @@ Explore our features to monitor your GitLab instance:
- [GitLab self-monitoring](gitlab_self_monitoring_project/index.md): The
GitLab instance administration project helps to monitor the GitLab instance and
take action on alerts.
-- [Performance monitoring](performance/index.md): GitLab Performance Monitoring makes it possible to measure a wide variety of statistics of your instance.
-- [Prometheus](prometheus/index.md): Prometheus is a powerful time-series monitoring service, providing a flexible platform for monitoring GitLab and other software products.
-- [GitHub imports](github_imports.md): Monitor the health and progress of the GitHub importer with various Prometheus metrics.
-- [Monitoring uptime](../../user/admin_area/monitoring/health_check.md): Check the server status using the health check endpoint.
- - [IP whitelists](ip_whitelist.md): Configure GitLab for monitoring endpoints that provide health check information when probed.
-- [`nginx_status`](https://docs.gitlab.com/omnibus/settings/nginx.html#enablingdisabling-nginx_status): Monitor your NGINX server status
+- [Performance monitoring](performance/index.md): GitLab Performance Monitoring
+ makes it possible to measure a wide variety of statistics of your instance.
+- [Prometheus](prometheus/index.md): Prometheus is a powerful time-series monitoring
+ service, providing a flexible platform for monitoring GitLab and other software
+ products.
+- [GitHub imports](github_imports.md): Monitor the health and progress of the GitHub
+ importer with various Prometheus metrics.
+- [Monitoring uptime](../../user/admin_area/monitoring/health_check.md): Check the
+ server status using the health check endpoint.
+ - [IP whitelists](ip_whitelist.md): Configure GitLab for monitoring endpoints that
+ provide health check information when probed.
+- [`nginx_status`](https://docs.gitlab.com/omnibus/settings/nginx.html#enablingdisabling-nginx_status):
+ Monitor your NGINX server status.
+- [Auto Monitoring](../../topics/autodevops/stages.md#auto-monitoring): Automated
+ monitoring for your application’s server and response metrics, provided by
+ [Auto DevOps](../../topics/autodevops/index.md).
diff --git a/doc/administration/monitoring/performance/gitlab_configuration.md b/doc/administration/monitoring/performance/gitlab_configuration.md
index 03eba67292d..a0f170e93d9 100644
--- a/doc/administration/monitoring/performance/gitlab_configuration.md
+++ b/doc/administration/monitoring/performance/gitlab_configuration.md
@@ -9,7 +9,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
GitLab Performance Monitoring is disabled by default. To enable it and change any of its
settings:
-1. Navigate to **Admin Area > Settings > Metrics and profiling**
+1. Go to **Admin Area > Settings > Metrics and profiling**
(`/admin/application_settings/metrics_and_profiling`).
1. Add the necessary configuration changes.
1. Restart all GitLab for the changes to take effect:
diff --git a/doc/administration/monitoring/performance/grafana_configuration.md b/doc/administration/monitoring/performance/grafana_configuration.md
index e6dda2ac87a..62d4f3c2625 100644
--- a/doc/administration/monitoring/performance/grafana_configuration.md
+++ b/doc/administration/monitoring/performance/grafana_configuration.md
@@ -62,7 +62,7 @@ repository.
After setting up Grafana, you can enable a link to access it easily from the
GitLab sidebar:
-1. Navigate to the **Admin Area > Settings > Metrics and profiling**.
+1. Go to the **Admin Area > Settings > Metrics and profiling**.
1. Expand **Metrics - Grafana**.
1. Check the **Enable access to Grafana** checkbox.
1. Configure the **Grafana URL**:
diff --git a/doc/administration/monitoring/performance/performance_bar.md b/doc/administration/monitoring/performance/performance_bar.md
index 0516cbc2f8b..39e5e4f6c00 100644
--- a/doc/administration/monitoring/performance/performance_bar.md
+++ b/doc/administration/monitoring/performance/performance_bar.md
@@ -6,6 +6,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Performance Bar **(FREE SELF)**
+> The **Stats** field [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/271551) in GitLab SaaS 13.9.
+
You can display the GitLab Performance Bar to see statistics for the performance
of a page. When activated, it looks as follows:
@@ -53,6 +55,8 @@ From left to right, it displays:
- **Request Selector**: a select box displayed on the right-hand side of the
Performance Bar which enables you to view these metrics for any requests made while
the current page was open. Only the first two requests per unique URL are captured.
+- **Stats** (optional): if the `GITLAB_PERFORMANCE_BAR_STATS_URL` environment variable is set,
+ this URL is displayed in the bar. In GitLab 13.9 and later, used only in GitLab SaaS.
## Request warnings
@@ -77,7 +81,7 @@ The GitLab Performance Bar is disabled by default. To enable it for a given grou
1. Sign in as a user with Administrator [permissions](../../../user/permissions.md).
1. In the menu bar, click **Admin Area**.
-1. Navigate to **Settings > Metrics and profiling**
+1. Go to **Settings > Metrics and profiling**
(`admin/application_settings/metrics_and_profiling`), and expand the section
**Profiling - Performance bar**.
1. Click **Enable access to the Performance Bar**.
diff --git a/doc/administration/monitoring/performance/request_profiling.md b/doc/administration/monitoring/performance/request_profiling.md
index f0ac8f991d3..ee035c6ad7a 100644
--- a/doc/administration/monitoring/performance/request_profiling.md
+++ b/doc/administration/monitoring/performance/request_profiling.md
@@ -10,7 +10,7 @@ To profile a request:
1. Sign in to GitLab as a user with Administrator or Maintainer [permissions](../../../user/permissions.md).
1. In the navigation bar, click **Admin area**.
-1. Navigate to **Monitoring > Requests Profiles**.
+1. Go to **Monitoring > Requests Profiles**.
1. In the **Requests Profiles** section, copy the token.
1. Pass the headers `X-Profile-Token: <token>` and `X-Profile-Mode: <mode>`(where
`<mode>` can be `execution` or `memory`) to the request you want to profile. When
diff --git a/doc/administration/monitoring/prometheus/gitlab_metrics.md b/doc/administration/monitoring/prometheus/gitlab_metrics.md
index 38b26041901..5353533c385 100644
--- a/doc/administration/monitoring/prometheus/gitlab_metrics.md
+++ b/doc/administration/monitoring/prometheus/gitlab_metrics.md
@@ -9,7 +9,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
To enable the GitLab Prometheus metrics:
1. Log into GitLab as a user with [administrator permissions](../../../user/permissions.md).
-1. Navigate to **Admin Area > Settings > Metrics and profiling**.
+1. Go to **Admin Area > Settings > Metrics and profiling**.
1. Find the **Metrics - Prometheus** section, and click **Enable Prometheus Metrics**.
1. [Restart GitLab](../../restart_gitlab.md#omnibus-gitlab-restart) for the changes to take effect.
@@ -33,95 +33,98 @@ For enabling and viewing metrics from Sidekiq nodes, see [Sidekiq metrics](#side
The following metrics are available:
-| Metric | Type | Since | Description | Labels |
-|:---------------------------------------------------------------|:----------|------:|:------------------------------------------------------------------------------------------------------|:--------------------------------------------------------|
-| `gitlab_banzai_cached_render_real_duration_seconds` | Histogram | 9.4 | Duration of rendering Markdown into HTML when cached output exists | `controller`, `action` |
-| `gitlab_banzai_cacheless_render_real_duration_seconds` | Histogram | 9.4 | Duration of rendering Markdown into HTML when cached output does not exist | `controller`, `action` |
-| `gitlab_cache_misses_total` | Counter | 10.2 | Cache read miss | `controller`, `action` |
-| `gitlab_cache_operation_duration_seconds` | Histogram | 10.2 | Cache access time | |
-| `gitlab_cache_operations_total` | Counter | 12.2 | Cache operations by controller or action | `controller`, `action`, `operation` |
-| `gitlab_ci_pipeline_creation_duration_seconds` | Histogram | 13.0 | Time in seconds it takes to create a CI/CD pipeline | |
-| `gitlab_ci_pipeline_size_builds` | Histogram | 13.1 | Total number of builds within a pipeline grouped by a pipeline source | `source` |
-| `job_waiter_started_total` | Counter | 12.9 | Number of batches of jobs started where a web request is waiting for the jobs to complete | `worker` |
-| `job_waiter_timeouts_total` | Counter | 12.9 | Number of batches of jobs that timed out where a web request is waiting for the jobs to complete | `worker` |
-| `gitlab_database_transaction_seconds` | Histogram | 12.1 | Time spent in database transactions, in seconds | |
-| `gitlab_method_call_duration_seconds` | Histogram | 10.2 | Method calls real duration | `controller`, `action`, `module`, `method` |
-| `gitlab_page_out_of_bounds` | Counter | 12.8 | Counter for the PageLimiter pagination limit being hit | `controller`, `action`, `bot` |
-| `gitlab_rails_queue_duration_seconds` | Histogram | 9.4 | Measures latency between GitLab Workhorse forwarding a request to Rails | |
-| `gitlab_sql_duration_seconds` | Histogram | 10.2 | SQL execution time, excluding `SCHEMA` operations and `BEGIN` / `COMMIT` | |
-| `gitlab_ruby_threads_max_expected_threads` | Gauge | 13.3 | Maximum number of threads expected to be running and performing application work | |
-| `gitlab_ruby_threads_running_threads` | Gauge | 13.3 | Number of running Ruby threads by name | |
-| `gitlab_transaction_cache_<key>_count_total` | Counter | 10.2 | Counter for total Rails cache calls (per key) | |
-| `gitlab_transaction_cache_<key>_duration_total` | Counter | 10.2 | Counter for total time (seconds) spent in Rails cache calls (per key) | |
-| `gitlab_transaction_cache_count_total` | Counter | 10.2 | Counter for total Rails cache calls (aggregate) | |
-| `gitlab_transaction_cache_duration_total` | Counter | 10.2 | Counter for total time (seconds) spent in Rails cache calls (aggregate) | |
-| `gitlab_transaction_cache_read_hit_count_total` | Counter | 10.2 | Counter for cache hits for Rails cache calls | `controller`, `action` |
-| `gitlab_transaction_cache_read_miss_count_total` | Counter | 10.2 | Counter for cache misses for Rails cache calls | `controller`, `action` |
-| `gitlab_transaction_duration_seconds` | Histogram | 10.2 | Duration for all transactions (`gitlab_transaction_*` metrics) | `controller`, `action` |
-| `gitlab_transaction_event_build_found_total` | Counter | 9.4 | Counter for build found for API /jobs/request | |
-| `gitlab_transaction_event_build_invalid_total` | Counter | 9.4 | Counter for build invalid due to concurrency conflict for API /jobs/request | |
-| `gitlab_transaction_event_build_not_found_cached_total` | Counter | 9.4 | Counter for cached response of build not found for API /jobs/request | |
-| `gitlab_transaction_event_build_not_found_total` | Counter | 9.4 | Counter for build not found for API /jobs/request | |
-| `gitlab_transaction_event_change_default_branch_total` | Counter | 9.4 | Counter when default branch is changed for any repository | |
-| `gitlab_transaction_event_create_repository_total` | Counter | 9.4 | Counter when any repository is created | |
-| `gitlab_transaction_event_etag_caching_cache_hit_total` | Counter | 9.4 | Counter for ETag cache hit. | `endpoint` |
-| `gitlab_transaction_event_etag_caching_header_missing_total` | Counter | 9.4 | Counter for ETag cache miss - header missing | `endpoint` |
-| `gitlab_transaction_event_etag_caching_key_not_found_total` | Counter | 9.4 | Counter for ETag cache miss - key not found | `endpoint` |
-| `gitlab_transaction_event_etag_caching_middleware_used_total` | Counter | 9.4 | Counter for ETag middleware accessed | `endpoint` |
-| `gitlab_transaction_event_etag_caching_resource_changed_total` | Counter | 9.4 | Counter for ETag cache miss - resource changed | `endpoint` |
-| `gitlab_transaction_event_fork_repository_total` | Counter | 9.4 | Counter for repository forks (RepositoryForkWorker). Only incremented when source repository exists | |
-| `gitlab_transaction_event_import_repository_total` | Counter | 9.4 | Counter for repository imports (RepositoryImportWorker) | |
-| `gitlab_transaction_event_patch_hard_limit_bytes_hit_total` | Counter | 13.9 | Counter for diff patch size limit hits | |
-| `gitlab_transaction_event_push_branch_total` | Counter | 9.4 | Counter for all branch pushes | |
-| `gitlab_transaction_event_push_commit_total` | Counter | 9.4 | Counter for commits | `branch` |
-| `gitlab_transaction_event_push_tag_total` | Counter | 9.4 | Counter for tag pushes | |
-| `gitlab_transaction_event_rails_exception_total` | Counter | 9.4 | Counter for number of rails exceptions | |
-| `gitlab_transaction_event_receive_email_total` | Counter | 9.4 | Counter for received emails | `handler` |
-| `gitlab_transaction_event_remote_mirrors_failed_total` | Counter | 10.8 | Counter for failed remote mirrors | |
-| `gitlab_transaction_event_remote_mirrors_finished_total` | Counter | 10.8 | Counter for finished remote mirrors | |
-| `gitlab_transaction_event_remote_mirrors_running_total` | Counter | 10.8 | Counter for running remote mirrors | |
-| `gitlab_transaction_event_remove_branch_total` | Counter | 9.4 | Counter when a branch is removed for any repository | |
-| `gitlab_transaction_event_remove_repository_total` | Counter | 9.4 | Counter when a repository is removed | |
-| `gitlab_transaction_event_remove_tag_total` | Counter | 9.4 | Counter when a tag is remove for any repository | |
-| `gitlab_transaction_event_sidekiq_exception_total` | Counter | 9.4 | Counter of Sidekiq exceptions | |
-| `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` |
-| `http_requests_total` | Counter | 9.4 | Rack request count | `method`, `status` |
-| `http_request_duration_seconds` | Histogram | 9.4 | HTTP response time from rack middleware | `method` |
-| `gitlab_transaction_db_count_total` | Counter | 13.1 | Counter for total number of SQL calls | `controller`, `action` |
-| `gitlab_transaction_db_write_count_total` | Counter | 13.1 | Counter for total number of write SQL calls | `controller`, `action` |
-| `gitlab_transaction_db_cached_count_total` | Counter | 13.1 | Counter for total number of cached SQL calls | `controller`, `action` |
-| `http_elasticsearch_requests_duration_seconds` **(PREMIUM)** | Histogram | 13.1 | Elasticsearch requests duration during web transactions | `controller`, `action` |
-| `http_elasticsearch_requests_total` **(PREMIUM)** | Counter | 13.1 | Elasticsearch requests count during web transactions | `controller`, `action` |
-| `pipelines_created_total` | Counter | 9.4 | Counter of pipelines created | |
-| `rack_uncaught_errors_total` | Counter | 9.4 | Rack connections handling uncaught errors count | |
-| `user_session_logins_total` | Counter | 9.4 | Counter of how many users have logged in since GitLab was started or restarted | |
-| `upload_file_does_not_exist` | Counter | 10.7 | Number of times an upload record could not find its file. Made available in all tiers in GitLab 11.5. | |
-| `failed_login_captcha_total` | Gauge | 11.0 | Counter of failed CAPTCHA attempts during login | |
-| `successful_login_captcha_total` | Gauge | 11.0 | Counter of successful CAPTCHA attempts during login | |
-| `auto_devops_pipelines_completed_total` | Counter | 12.7 | Counter of completed Auto DevOps pipelines, labeled by status | |
-| `gitlab_metrics_dashboard_processing_time_ms` | Summary | 12.10 | Metrics dashboard processing time in milliseconds | service, stages |
-| `action_cable_active_connections` | Gauge | 13.4 | Number of ActionCable WS clients currently connected | `server_mode` |
-| `action_cable_pool_min_size` | Gauge | 13.4 | Minimum number of worker threads in ActionCable thread pool | `server_mode` |
-| `action_cable_pool_max_size` | Gauge | 13.4 | Maximum number of worker threads in ActionCable thread pool | `server_mode` |
-| `action_cable_pool_current_size` | Gauge | 13.4 | Current number of worker threads in ActionCable thread pool | `server_mode` |
-| `action_cable_pool_largest_size` | Gauge | 13.4 | Largest number of worker threads observed so far in ActionCable thread pool | `server_mode` |
-| `action_cable_pool_pending_tasks` | Gauge | 13.4 | Number of tasks waiting to be executed in ActionCable thread pool | `server_mode` |
-| `action_cable_pool_tasks_total` | Gauge | 13.4 | Total number of tasks executed in ActionCable thread pool | `server_mode` |
-| `gitlab_issuable_fast_count_by_state_total` | Counter | 13.5 | Total number of row count operations on issue/merge request list pages | |
-| `gitlab_issuable_fast_count_by_state_failures_total` | Counter | 13.5 | Number of soft-failed row count operations on issue/merge request list pages | |
-| `gitlab_external_http_total` | Counter | 13.8 | Total number of HTTP calls to external systems | `controller`, `action` |
-| `gitlab_external_http_duration_seconds` | Counter | 13.8 | Duration in seconds spent on each HTTP call to external systems | |
-| `gitlab_external_http_exception_total` | Counter | 13.8 | Total number of exceptions raised when making external HTTP calls | |
-| `ci_report_parser_duration_seconds` | Histogram | 13.9 | Time to parse CI/CD report artifacts | `parser` |
-| `pipeline_graph_link_calculation_duration_seconds` | Histogram | 13.9 | Total time spent calculating links, in seconds | |
-| `pipeline_graph_links_total` | Histogram | 13.9 | Number of links per graph | |
-| `pipeline_graph_links_per_job_ratio` | Histogram | 13.9 | Ratio of links to job per graph | |
+| Metric | Type | Since | Description | Labels |
+| :--------------------------------------------------------------- | :---------- | ------: | :-------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------- |
+| `gitlab_banzai_cached_render_real_duration_seconds` | Histogram | 9.4 | Duration of rendering Markdown into HTML when cached output exists | `controller`, `action` |
+| `gitlab_banzai_cacheless_render_real_duration_seconds` | Histogram | 9.4 | Duration of rendering Markdown into HTML when cached output does not exist | `controller`, `action` |
+| `gitlab_cache_misses_total` | Counter | 10.2 | Cache read miss | `controller`, `action` |
+| `gitlab_cache_operation_duration_seconds` | Histogram | 10.2 | Cache access time | |
+| `gitlab_cache_operations_total` | Counter | 12.2 | Cache operations by controller or action | `controller`, `action`, `operation` |
+| `gitlab_ci_pipeline_creation_duration_seconds` | Histogram | 13.0 | Time in seconds it takes to create a CI/CD pipeline | |
+| `gitlab_ci_pipeline_size_builds` | Histogram | 13.1 | Total number of builds within a pipeline grouped by a pipeline source | `source` |
+| `job_waiter_started_total` | Counter | 12.9 | Number of batches of jobs started where a web request is waiting for the jobs to complete | `worker` |
+| `job_waiter_timeouts_total` | Counter | 12.9 | Number of batches of jobs that timed out where a web request is waiting for the jobs to complete | `worker` |
+| `gitlab_database_transaction_seconds` | Histogram | 12.1 | Time spent in database transactions, in seconds | |
+| `gitlab_method_call_duration_seconds` | Histogram | 10.2 | Method calls real duration | `controller`, `action`, `module`, `method` |
+| `gitlab_page_out_of_bounds` | Counter | 12.8 | Counter for the PageLimiter pagination limit being hit | `controller`, `action`, `bot` |
+| `gitlab_rails_queue_duration_seconds` | Histogram | 9.4 | Measures latency between GitLab Workhorse forwarding a request to Rails | |
+| `gitlab_sql_duration_seconds` | Histogram | 10.2 | SQL execution time, excluding `SCHEMA` operations and `BEGIN` / `COMMIT` | |
+| `gitlab_sql_<role>_duration_seconds` | Histogram | 13.10 | SQL execution time, excluding `SCHEMA` operations and `BEGIN` / `COMMIT`, grouped by database roles (primary/replica) | |
+| `gitlab_ruby_threads_max_expected_threads` | Gauge | 13.3 | Maximum number of threads expected to be running and performing application work | |
+| `gitlab_ruby_threads_running_threads` | Gauge | 13.3 | Number of running Ruby threads by name | |
+| `gitlab_transaction_cache_<key>_count_total` | Counter | 10.2 | Counter for total Rails cache calls (per key) | |
+| `gitlab_transaction_cache_<key>_duration_total` | Counter | 10.2 | Counter for total time (seconds) spent in Rails cache calls (per key) | |
+| `gitlab_transaction_cache_count_total` | Counter | 10.2 | Counter for total Rails cache calls (aggregate) | |
+| `gitlab_transaction_cache_duration_total` | Counter | 10.2 | Counter for total time (seconds) spent in Rails cache calls (aggregate) | |
+| `gitlab_transaction_cache_read_hit_count_total` | Counter | 10.2 | Counter for cache hits for Rails cache calls | `controller`, `action` |
+| `gitlab_transaction_cache_read_miss_count_total` | Counter | 10.2 | Counter for cache misses for Rails cache calls | `controller`, `action` |
+| `gitlab_transaction_duration_seconds` | Histogram | 10.2 | Duration for all transactions (`gitlab_transaction_*` metrics) | `controller`, `action` |
+| `gitlab_transaction_event_build_found_total` | Counter | 9.4 | Counter for build found for API /jobs/request | |
+| `gitlab_transaction_event_build_invalid_total` | Counter | 9.4 | Counter for build invalid due to concurrency conflict for API /jobs/request | |
+| `gitlab_transaction_event_build_not_found_cached_total` | Counter | 9.4 | Counter for cached response of build not found for API /jobs/request | |
+| `gitlab_transaction_event_build_not_found_total` | Counter | 9.4 | Counter for build not found for API /jobs/request | |
+| `gitlab_transaction_event_change_default_branch_total` | Counter | 9.4 | Counter when default branch is changed for any repository | |
+| `gitlab_transaction_event_create_repository_total` | Counter | 9.4 | Counter when any repository is created | |
+| `gitlab_transaction_event_etag_caching_cache_hit_total` | Counter | 9.4 | Counter for ETag cache hit. | `endpoint` |
+| `gitlab_transaction_event_etag_caching_header_missing_total` | Counter | 9.4 | Counter for ETag cache miss - header missing | `endpoint` |
+| `gitlab_transaction_event_etag_caching_key_not_found_total` | Counter | 9.4 | Counter for ETag cache miss - key not found | `endpoint` |
+| `gitlab_transaction_event_etag_caching_middleware_used_total` | Counter | 9.4 | Counter for ETag middleware accessed | `endpoint` |
+| `gitlab_transaction_event_etag_caching_resource_changed_total` | Counter | 9.4 | Counter for ETag cache miss - resource changed | `endpoint` |
+| `gitlab_transaction_event_fork_repository_total` | Counter | 9.4 | Counter for repository forks (RepositoryForkWorker). Only incremented when source repository exists | |
+| `gitlab_transaction_event_import_repository_total` | Counter | 9.4 | Counter for repository imports (RepositoryImportWorker) | |
+| `gitlab_transaction_event_patch_hard_limit_bytes_hit_total` | Counter | 13.9 | Counter for diff patch size limit hits | |
+| `gitlab_transaction_event_push_branch_total` | Counter | 9.4 | Counter for all branch pushes | |
+| `gitlab_transaction_event_push_commit_total` | Counter | 9.4 | Counter for commits | `branch` |
+| `gitlab_transaction_event_push_tag_total` | Counter | 9.4 | Counter for tag pushes | |
+| `gitlab_transaction_event_rails_exception_total` | Counter | 9.4 | Counter for number of rails exceptions | |
+| `gitlab_transaction_event_receive_email_total` | Counter | 9.4 | Counter for received emails | `handler` |
+| `gitlab_transaction_event_remote_mirrors_failed_total` | Counter | 10.8 | Counter for failed remote mirrors | |
+| `gitlab_transaction_event_remote_mirrors_finished_total` | Counter | 10.8 | Counter for finished remote mirrors | |
+| `gitlab_transaction_event_remote_mirrors_running_total` | Counter | 10.8 | Counter for running remote mirrors | |
+| `gitlab_transaction_event_remove_branch_total` | Counter | 9.4 | Counter when a branch is removed for any repository | |
+| `gitlab_transaction_event_remove_repository_total` | Counter | 9.4 | Counter when a repository is removed | |
+| `gitlab_transaction_event_remove_tag_total` | Counter | 9.4 | Counter when a tag is remove for any repository | |
+| `gitlab_transaction_event_sidekiq_exception_total` | Counter | 9.4 | Counter of Sidekiq exceptions | |
+| `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` |
+| `http_requests_total` | Counter | 9.4 | Rack request count | `method`, `status` |
+| `http_request_duration_seconds` | Histogram | 9.4 | HTTP response time from rack middleware | `method` |
+| `gitlab_transaction_db_count_total` | Counter | 13.1 | Counter for total number of SQL calls | `controller`, `action` |
+| `gitlab_transaction_db_<role>_count_total` | Counter | 13.10 | Counter for total number of SQL calls, grouped by database roles (primary/replica) | `controller`, `action` |
+| `gitlab_transaction_db_write_count_total` | Counter | 13.1 | Counter for total number of write SQL calls | `controller`, `action` |
+| `gitlab_transaction_db_cached_count_total` | Counter | 13.1 | Counter for total number of cached SQL calls | `controller`, `action` |
+| `gitlab_transaction_db_<role>_cached_count_total` | Counter | 13.1 | Counter for total number of cached SQL calls, grouped by database roles (primary/replica) | `controller`, `action` |
+| `http_elasticsearch_requests_duration_seconds` **(PREMIUM)** | Histogram | 13.1 | Elasticsearch requests duration during web transactions | `controller`, `action` |
+| `http_elasticsearch_requests_total` **(PREMIUM)** | Counter | 13.1 | Elasticsearch requests count during web transactions | `controller`, `action` |
+| `pipelines_created_total` | Counter | 9.4 | Counter of pipelines created | |
+| `rack_uncaught_errors_total` | Counter | 9.4 | Rack connections handling uncaught errors count | |
+| `user_session_logins_total` | Counter | 9.4 | Counter of how many users have logged in since GitLab was started or restarted | |
+| `upload_file_does_not_exist` | Counter | 10.7 | Number of times an upload record could not find its file. Made available in all tiers in GitLab 11.5. | |
+| `failed_login_captcha_total` | Gauge | 11.0 | Counter of failed CAPTCHA attempts during login | |
+| `successful_login_captcha_total` | Gauge | 11.0 | Counter of successful CAPTCHA attempts during login | |
+| `auto_devops_pipelines_completed_total` | Counter | 12.7 | Counter of completed Auto DevOps pipelines, labeled by status | |
+| `gitlab_metrics_dashboard_processing_time_ms` | Summary | 12.10 | Metrics dashboard processing time in milliseconds | service, stages |
+| `action_cable_active_connections` | Gauge | 13.4 | Number of ActionCable WS clients currently connected | `server_mode` |
+| `action_cable_pool_min_size` | Gauge | 13.4 | Minimum number of worker threads in ActionCable thread pool | `server_mode` |
+| `action_cable_pool_max_size` | Gauge | 13.4 | Maximum number of worker threads in ActionCable thread pool | `server_mode` |
+| `action_cable_pool_current_size` | Gauge | 13.4 | Current number of worker threads in ActionCable thread pool | `server_mode` |
+| `action_cable_pool_largest_size` | Gauge | 13.4 | Largest number of worker threads observed so far in ActionCable thread pool | `server_mode` |
+| `action_cable_pool_pending_tasks` | Gauge | 13.4 | Number of tasks waiting to be executed in ActionCable thread pool | `server_mode` |
+| `action_cable_pool_tasks_total` | Gauge | 13.4 | Total number of tasks executed in ActionCable thread pool | `server_mode` |
+| `gitlab_issuable_fast_count_by_state_total` | Counter | 13.5 | Total number of row count operations on issue/merge request list pages | |
+| `gitlab_issuable_fast_count_by_state_failures_total` | Counter | 13.5 | Number of soft-failed row count operations on issue/merge request list pages | |
+| `gitlab_external_http_total` | Counter | 13.8 | Total number of HTTP calls to external systems | `controller`, `action` |
+| `gitlab_external_http_duration_seconds` | Counter | 13.8 | Duration in seconds spent on each HTTP call to external systems | |
+| `gitlab_external_http_exception_total` | Counter | 13.8 | Total number of exceptions raised when making external HTTP calls | |
+| `ci_report_parser_duration_seconds` | Histogram | 13.9 | Time to parse CI/CD report artifacts | `parser` |
+| `pipeline_graph_link_calculation_duration_seconds` | Histogram | 13.9 | Total time spent calculating links, in seconds | |
+| `pipeline_graph_links_total` | Histogram | 13.9 | Number of links per graph | |
+| `pipeline_graph_links_per_job_ratio` | Histogram | 13.9 | Ratio of links to job per graph | |
## Metrics controlled by a feature flag
@@ -214,11 +217,18 @@ configuration option in `gitlab.yml`. These metrics are served from the
| `geo_snippet_repositories_synced` | Gauge | 13.4 | Number of syncable snippets synced on secondary | `url` |
| `geo_snippet_repositories_failed` | Gauge | 13.4 | Number of syncable snippets failed on secondary | `url` |
| `geo_snippet_repositories_registry` | Gauge | 13.4 | Number of syncable snippets in the registry | `url` |
+| `geo_group_wiki_repositories` | Gauge | 13.10 | Number of group wikis on primary | `url` |
+| `geo_group_wiki_repositories_checksummed` | Gauge | 13.10 | Number of group wikis checksummed on primary | `url` |
+| `geo_group_wiki_repositories_checksum_failed` | Gauge | 13.10 | Number of group wikis failed to calculate the checksum on primary | `url` |
+| `geo_group_wiki_repositories_synced` | Gauge | 13.10 | Number of syncable group wikis synced on secondary | `url` |
+| `geo_group_wiki_repositories_failed` | Gauge | 13.10 | Number of syncable group wikis failed on secondary | `url` |
+| `geo_group_wiki_repositories_registry` | Gauge | 13.10 | Number of syncable group wikis in the registry | `url` |
| `limited_capacity_worker_running_jobs` | Gauge | 13.5 | Number of running jobs | `worker` |
| `limited_capacity_worker_max_running_jobs` | Gauge | 13.5 | Maximum number of running jobs | `worker` |
| `limited_capacity_worker_remaining_work_count` | Gauge | 13.5 | Number of jobs waiting to be enqueued | `worker` |
| `destroyed_job_artifacts_count_total` | Counter | 13.6 | Number of destroyed expired job artifacts | |
| `destroyed_pipeline_artifacts_count_total` | Counter | 13.8 | Number of destroyed expired pipeline artifacts | |
+| `gitlab_optimistic_locking_retries` | Histogram | 13.10 | Number of retry attempts to execute optimistic retry lock | |
## Database load balancing metrics **(PREMIUM SELF)**
diff --git a/doc/administration/nfs.md b/doc/administration/nfs.md
index a7009b702ed..59b18f7a74a 100644
--- a/doc/administration/nfs.md
+++ b/doc/administration/nfs.md
@@ -365,21 +365,26 @@ You may be able to avoid timeouts and data loss using `actimeo=0` and `lookupcac
we expect the performance reduction will still be significant. As noted above, we strongly recommend upgrading to
[Gitaly Cluster](gitaly/praefect.md) as soon as possible.
-### Avoid using AWS's Elastic File System (EFS)
+### Avoid using cloud-based file systems
-GitLab strongly recommends against using AWS Elastic File System (EFS).
-Our support team will not be able to assist on performance issues related to
-file system access.
+GitLab strongly recommends against using cloud-based file systems such as:
-Customers and users have reported that AWS EFS does not perform well for the GitLab
-use-case. Workloads where many small files are written in a serialized manner, like `git`,
-are not well-suited for EFS. EBS with an NFS server on top will perform much better.
+- AWS Elastic File System (EFS).
+- Google Cloud Filestore.
+- Azure Files.
-If you do choose to use EFS, avoid storing GitLab log files (e.g. those in `/var/log/gitlab`)
+Our support team cannot assist with performance issues related to cloud-based file system access.
+
+Customers and users have reported that these file systems don't perform well for
+the file system access GitLab requires. Workloads where many small files are written in
+a serialized manner, like `git`, are not well suited to cloud-based file systems.
+
+If you do choose to use these, avoid storing GitLab log files (for example, those in `/var/log/gitlab`)
there because this will also affect performance. We recommend that the log files be
stored on a local volume.
-For more details on another person's experience with EFS, see this [Commit Brooklyn 2019 video](https://youtu.be/K6OS8WodRBQ?t=313).
+For more details on the experience of using a cloud-based file systems with GitLab,
+see this [Commit Brooklyn 2019 video](https://youtu.be/K6OS8WodRBQ?t=313).
### Avoid using CephFS and GlusterFS
diff --git a/doc/administration/object_storage.md b/doc/administration/object_storage.md
index 3b43f53dc82..cbef752773b 100644
--- a/doc/administration/object_storage.md
+++ b/doc/administration/object_storage.md
@@ -405,8 +405,8 @@ Rackspace Cloud is supported only with the storage-specific form.
| `provider` | The provider name | `Rackspace` |
| `rackspace_username` | The username of the Rackspace account with access to the container | `joe.smith` |
| `rackspace_api_key` | The API key of the Rackspace account with access to the container | `ABC123DEF456ABC123DEF456ABC123DE` |
-| `rackspace_region` | The Rackspace storage region to use, a three letter code from the [list of service access endpoints](https://developer.rackspace.com/docs/cloud-files/v1/general-api-info/service-access/) | `iad` |
-| `rackspace_temp_url_key` | The private key you have set in the Rackspace API for [temporary URLs](https://developer.rackspace.com/docs/cloud-files/v1/use-cases/public-access-to-your-cloud-files-account/#tempurl). | `ABC123DEF456ABC123DEF456ABC123DE` |
+| `rackspace_region` | The Rackspace storage region to use, a three letter code from the [list of service access endpoints](https://docs.rackspace.com/docs/cloud-files/v1/general-api-info/service-access/) | `iad` |
+| `rackspace_temp_url_key` | The private key you have set in the Rackspace API for [temporary URLs](https://docs.rackspace.com/docs/cloud-files/v1/use-cases/public-access-to-your-cloud-files-account/#tempurl). | `ABC123DEF456ABC123DEF456ABC123DE` |
Regardless of whether the container has public access enabled or disabled, Fog
uses the TempURL method to grant access to LFS objects. If you see error
@@ -572,13 +572,15 @@ See the following additional guides:
## Warnings, limitations, and known issues
-### Separate buckets required when using Helm
+### Use separate buckets
-Generally, using the same bucket for your Object Storage is fine to do
-for convenience.
+Using separate buckets for each data type is the recommended approach for GitLab.
+This ensures there are no collisions across the various types of data GitLab stores.
+There are plans to [enable the use of a single bucket](https://gitlab.com/gitlab-org/gitlab/-/issues/292958)
+in the future.
-However, if you're using or planning to use Helm, separate buckets will
-be required as there is a [known limitation with restorations of Helm chart backups](https://docs.gitlab.com/charts/advanced/external-object-storage/#lfs-artifacts-uploads-packages-external-diffs-pseudonymizer).
+Helm-based installs require separate buckets to
+[handle backup restorations](https://docs.gitlab.com/charts/advanced/external-object-storage/#lfs-artifacts-uploads-packages-external-diffs-pseudonymizer)
### S3 API compatibility issues
diff --git a/doc/administration/operations/fast_ssh_key_lookup.md b/doc/administration/operations/fast_ssh_key_lookup.md
index 330bd9a43da..ec5bf9d6379 100644
--- a/doc/administration/operations/fast_ssh_key_lookup.md
+++ b/doc/administration/operations/fast_ssh_key_lookup.md
@@ -6,9 +6,6 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Fast lookup of authorized SSH keys in the database
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/1631) in [GitLab Starter](https://about.gitlab.com/pricing/) 9.3.
-> - [Available in](https://gitlab.com/gitlab-org/gitlab/-/issues/3953) GitLab Community Edition 10.4.
-
NOTE:
This document describes a drop-in replacement for the
`authorized_keys` file. For normal (non-deploy key) users, consider using
@@ -219,8 +216,6 @@ the database. The following instructions can be used to build OpenSSH 7.5:
## SELinux support and limitations
-> [Introduced](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/2855) in GitLab 10.5.
-
GitLab supports `authorized_keys` database lookups with [SELinux](https://en.wikipedia.org/wiki/Security-Enhanced_Linux).
Because the SELinux policy is static, GitLab doesn't support the ability to change
diff --git a/doc/administration/operations/moving_repositories.md b/doc/administration/operations/moving_repositories.md
index da3b3dbbc15..fc39d8e2074 100644
--- a/doc/administration/operations/moving_repositories.md
+++ b/doc/administration/operations/moving_repositories.md
@@ -20,7 +20,7 @@ The GitLab API is the recommended way to move Git repositories:
For more information, see:
-- [Configuring additional storage for Gitaly](../gitaly/index.md#network-architecture). This
+- [Configuring additional storage for Gitaly](../gitaly/configure_gitaly.md#network-architecture). This
example configures additional storage called `storage1` and `storage2`.
- [The API documentation](../../api/project_repository_storage_moves.md) details the endpoints for
querying and scheduling project repository moves.
diff --git a/doc/administration/operations/rails_console.md b/doc/administration/operations/rails_console.md
index b40560bf6e5..5add52e1a51 100644
--- a/doc/administration/operations/rails_console.md
+++ b/doc/administration/operations/rails_console.md
@@ -148,3 +148,23 @@ Traceback (most recent call last):
[traceback removed]
/opt/gitlab/..../runner_command.rb:42:in `load': cannot load such file -- /tmp/helloworld.rb (LoadError)
```
+
+In case you encouter a similar error to this:
+
+```plaintext
+[root ~]# sudo gitlab-rails runner helloworld.rb
+Please specify a valid ruby command or the path of a script to run.
+Run 'rails runner -h' for help.
+
+undefined local variable or method `helloworld' for main:Object
+```
+
+You can either move the file to the `/tmp` directory or create a new directory onwed by the user `git` and save the script in that directory as illustrated below:
+
+```shell
+sudo mkdir /scripts
+sudo mv /script_path/helloworld.rb /scripts
+sudo chown -R git:git /scripts
+sudo chmod 700 /scripts
+sudo gitlab-rails runner /scripts/helloworld.rb
+```
diff --git a/doc/administration/packages/container_registry.md b/doc/administration/packages/container_registry.md
index 63bb969afce..2f6b6a2f629 100644
--- a/doc/administration/packages/container_registry.md
+++ b/doc/administration/packages/container_registry.md
@@ -71,7 +71,7 @@ Where:
| `enabled` | `true` or `false`. Enables the Registry in GitLab. By default this is `false`. |
| `host` | The host URL under which the Registry runs and users can use. |
| `port` | The port the external Registry domain listens on. |
-| `api_url` | The internal API URL under which the Registry is exposed. It defaults to `http://localhost:5000`. |
+| `api_url` | The internal API URL under which the Registry is exposed. It defaults to `http://localhost:5000`. Do not change this unless you are setting up an [external Docker registry](#use-an-external-container-registry-with-gitlab-as-an-auth-endpoint). |
| `key` | The private key location that is a pair of Registry's `rootcertbundle`. Read the [token auth configuration documentation](https://docs.docker.com/registry/configuration/#token). |
| `path` | This should be the same directory like specified in Registry's `rootdirectory`. Read the [storage configuration documentation](https://docs.docker.com/registry/configuration/#storage). This path needs to be readable by the GitLab user, the web-server user and the Registry user. Read more in [#configure-storage-for-the-container-registry](#configure-storage-for-the-container-registry). |
| `issuer` | This should be the same value as configured in Registry's `issuer`. Read the [token auth configuration documentation](https://docs.docker.com/registry/configuration/#token). |
@@ -630,18 +630,18 @@ You can use GitLab as an auth endpoint with an external container registry.
```ruby
gitlab_rails['registry_enabled'] = true
- gitlab_rails['registry_api_url'] = "http://localhost:5000"
+ gitlab_rails['registry_api_url'] = "https://<external_registry_host>:5000"
gitlab_rails['registry_issuer'] = "gitlab-issuer"
```
- `gitlab_rails['registry_enabled'] = true` is needed to enable GitLab
- Container Registry features and authentication endpoint. The GitLab bundled
- Container Registry service does not start, even with this enabled.
-
- `gitlab_rails['registry_api_url'] = "http://localhost:5000"` can
- carry a different hostname and port depending on where the external registry
- is hosted. It must also specify `https` if the external registry is
- configured to use TLS.
+ - `gitlab_rails['registry_enabled'] = true` is needed to enable GitLab
+ Container Registry features and authentication endpoint. The GitLab bundled
+ Container Registry service does not start, even with this enabled.
+ - `gitlab_rails['registry_api_url'] = "http://<external_registry_host>:5000"`
+ must be changed to match the host where Registry is installed.
+ It must also specify `https` if the external registry is
+ configured to use TLS. Read more on the
+ [Docker registry documentation](https://docs.docker.com/registry/deploying/).
1. A certificate-key pair is required for GitLab and the external container
registry to communicate securely. You need to create a certificate-key
@@ -688,12 +688,14 @@ You can use GitLab as an auth endpoint with an external container registry.
enabled: true
host: "registry.gitlab.example.com"
port: "5005"
- api_url: "http://localhost:5000"
- path: /var/opt/gitlab/gitlab-rails/shared/registry
- key: /var/opt/gitlab/gitlab-rails/certificate.key
+ api_url: "https://<external_registry_host>:5000"
+ path: /var/lib/registry
+ key: /path/to/keyfile
issuer: gitlab-issuer
```
+ [Read more](#enable-the-container-registry) about what these parameters mean.
+
1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source) for the changes to take effect.
## Configure Container Registry notifications
@@ -900,12 +902,12 @@ not directly accessible via `tag`:
sudo gitlab-ctl registry-garbage-collect -m
```
-Without the `-m` flag, the Container Registry only removes layers that are not referenced by any manifest, tagged or not.
-
Since this is a way more destructive operation, this behavior is disabled by default.
You are likely expecting this way of operation, but before doing that, ensure
that you have backed up all registry data.
+When the command is used without the `-m` flag, the Container Registry only removes layers that are not referenced by any manifest, tagged or not.
+
### Performing garbage collection without downtime
> [Introduced](https://gitlab.com/gitlab-org/omnibus-gitlab/-/merge_requests/764) in GitLab 8.8.
@@ -1063,6 +1065,70 @@ encounter this error.
Administrators can increase the token duration in **Admin area > Settings >
CI/CD > Container Registry > Authorization token duration (minutes)**.
+### Docker login attempt fails with: 'token signed by untrusted key'
+
+[Registry relies on GitLab to validate credentials](https://docs.gitlab.com/omnibus/architecture/registry/).
+If the registry fails to authenticate valid login attempts, you get the following error message:
+
+```shell
+# docker login gitlab.company.com:4567
+Username: user
+Password:
+Error response from daemon: login attempt to https://gitlab.company.com:4567/v2/ failed with status: 401 Unauthorized
+```
+
+And more specifically, this appears in the `/var/log/gitlab/registry/current` log file:
+
+```plaintext
+level=info msg="token signed by untrusted key with ID: "TOKE:NL6Q:7PW6:EXAM:PLET:OKEN:BG27:RCIB:D2S3:EXAM:PLET:OKEN""
+level=warning msg="error authorizing context: invalid token" go.version=go1.12.7 http.request.host="gitlab.company.com:4567" http.request.id=74613829-2655-4f96-8991-1c9fe33869b8 http.request.method=GET http.request.remoteaddr=10.72.11.20 http.request.uri="/v2/" http.request.useragent="docker/19.03.2 go/go1.12.8 git-commit/6a30dfc kernel/3.10.0-693.2.2.el7.x86_64 os/linux arch/amd64 UpstreamClient(Docker-Client/19.03.2 \(linux\))"
+```
+
+GitLab uses the contents of the certificate key pair's two sides to encrypt the authentication token
+for the Registry. This message means that those contents do not align.
+
+Check which files are in use:
+
+- `grep -A6 'auth:' /var/opt/gitlab/registry/config.yml`
+
+ ```yaml
+ ## Container Registry Certificate
+ auth:
+ token:
+ realm: https://gitlab.my.net/jwt/auth
+ service: container_registry
+ issuer: omnibus-gitlab-issuer
+ --> rootcertbundle: /var/opt/gitlab/registry/gitlab-registry.crt
+ autoredirect: false
+ ```
+
+- `grep -A9 'Container Registry' /var/opt/gitlab/gitlab-rails/etc/gitlab.yml`
+
+ ```yaml
+ ## Container Registry Key
+ registry:
+ enabled: true
+ host: gitlab.company.com
+ port: 4567
+ api_url: http://127.0.0.1:5000 # internal address to the registry, will be used by GitLab to directly communicate with API
+ path: /var/opt/gitlab/gitlab-rails/shared/registry
+ --> key: /var/opt/gitlab/gitlab-rails/etc/gitlab-registry.key
+ issuer: omnibus-gitlab-issuer
+ notification_secret:
+ ```
+
+The output of these `openssl` commands should match, proving that the cert-key pair is a match:
+
+```shell
+openssl x509 -noout -modulus -in /var/opt/gitlab/registry/gitlab-registry.crt | openssl sha256
+openssl rsa -noout -modulus -in /var/opt/gitlab/gitlab-rails/etc/gitlab-registry.key | openssl sha256
+```
+
+If the two pieces of the certificate do not align, remove the files and run `gitlab-ctl reconfigure`
+to regenerate the pair. If you have overridden the automatically generated self-signed pair with
+your own certificates and have made sure that their contents align, you can delete the 'registry'
+section in your `/etc/gitlab/gitlab-secrets.json` and run `gitlab-ctl reconfigure`.
+
### AWS S3 with the GitLab registry error when pushing large images
When using AWS S3 with the GitLab registry, an error may occur when pushing
@@ -1144,7 +1210,7 @@ project or branch name. Special characters can include:
- Trailing hyphen/dash
- Double hyphen/dash
-To get around this, you can [change the group path](../../user/group/index.md#changing-a-groups-path),
+To get around this, you can [change the group path](../../user/group/index.md#change-a-groups-path),
[change the project path](../../user/project/settings/index.md#renaming-a-repository) or change the
branch name. Another option is to create a [push rule](../../push_rules/push_rules.md) to prevent
this at the instance level.
diff --git a/doc/administration/packages/dependency_proxy.md b/doc/administration/packages/dependency_proxy.md
index 16cfdc8c784..720734bf344 100644
--- a/doc/administration/packages/dependency_proxy.md
+++ b/doc/administration/packages/dependency_proxy.md
@@ -47,6 +47,10 @@ To enable the dependency proxy feature:
Since Puma is already the default web server for installations from source as of GitLab 12.9,
no further changes are needed.
+**Multi-node GitLab installations**
+
+Follow the steps for **Omnibus GitLab installation** for each Web and Sidekiq nodes.
+
## Changing the storage path
By default, the dependency proxy files are stored locally, but you can change the default
diff --git a/doc/administration/packages/index.md b/doc/administration/packages/index.md
index b1d2a82e31a..012afd6a419 100644
--- a/doc/administration/packages/index.md
+++ b/doc/administration/packages/index.md
@@ -43,14 +43,14 @@ guides you through the process.
| CocoaPods | [#36890](https://gitlab.com/gitlab-org/gitlab/-/issues/36890) |
| Conda | [#36891](https://gitlab.com/gitlab-org/gitlab/-/issues/36891) |
| CRAN | [#36892](https://gitlab.com/gitlab-org/gitlab/-/issues/36892) |
-| Debian | [WIP: Merge Request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/44746) |
+| Debian | [Draft: Merge Request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/50438) |
| Opkg | [#36894](https://gitlab.com/gitlab-org/gitlab/-/issues/36894) |
| P2 | [#36895](https://gitlab.com/gitlab-org/gitlab/-/issues/36895) |
| Puppet | [#36897](https://gitlab.com/gitlab-org/gitlab/-/issues/36897) |
| RPM | [#5932](https://gitlab.com/gitlab-org/gitlab/-/issues/5932) |
| RubyGems | [#803](https://gitlab.com/gitlab-org/gitlab/-/issues/803) |
| SBT | [#36898](https://gitlab.com/gitlab-org/gitlab/-/issues/36898) |
-| Terraform | [WIP: Merge Request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18834) |
+| Terraform | [Draft: Merge Request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18834) |
| Vagrant | [#36899](https://gitlab.com/gitlab-org/gitlab/-/issues/36899) |
<!-- vale gitlab.Spelling = YES -->
diff --git a/doc/administration/pages/index.md b/doc/administration/pages/index.md
index 655e35c3e60..14b79903be7 100644
--- a/doc/administration/pages/index.md
+++ b/doc/administration/pages/index.md
@@ -178,13 +178,16 @@ outside world.
pages_external_url 'https://example.io'
pages_nginx['redirect_http_to_https'] = true
+ ```
+
+1. If you haven’t named your certificate and key `example.io.crt` and `example.io.key`
+then you'll need to also add the full paths as shown below:
+
+ ```ruby
pages_nginx['ssl_certificate'] = "/etc/gitlab/ssl/pages-nginx.crt"
pages_nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/pages-nginx.key"
```
- where `pages-nginx.crt` and `pages-nginx.key` are the SSL cert and key,
- respectively.
-
1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
### Additional configuration for Docker container
@@ -214,56 +217,63 @@ and take effect after you [reconfigure GitLab](../restart_gitlab.md#omnibus-gitl
Most of these settings don't need to be configured manually unless you need more granular
control over how the Pages daemon runs and serves content in your environment.
-| Setting | Description |
-| ------- | ----------- |
-| `pages_external_url` | The URL where GitLab Pages is accessible, including protocol (HTTP / HTTPS). If `https://` is used, additional configuration is required. See [Wildcard domains with TLS support](#wildcard-domains-with-tls-support) and [Custom domains with TLS support](#custom-domains-with-tls-support) for details.
-| `gitlab_pages[]` | |
-| `access_control` | Whether to enable [access control](index.md#access-control).
-| `api_secret_key` | Full path to file with secret key used to authenticate with the GitLab API. Auto-generated when left unset.
-| `artifacts_server` | Enable viewing [artifacts](../job_artifacts.md) in GitLab Pages.
-| `artifacts_server_timeout` | Timeout (in seconds) for a proxied request to the artifacts server.
-| `artifacts_server_url` | API URL to proxy artifact requests to. Defaults to GitLab `external URL` + `/api/v4`, for example `https://gitlab.com/api/v4`. When running a [separate Pages server](#running-gitlab-pages-on-a-separate-server), this URL must point to the main GitLab server's API.
-| `auth_redirect_uri` | Callback URL for authenticating with GitLab. Defaults to project's subdomain of `pages_external_url` + `/auth`.
-| `auth_secret` | Secret key for signing authentication requests. Leave blank to pull automatically from GitLab during OAuth registration.
-| `dir` | Working directory for configuration and secrets files.
-| `enable` | Enable or disable GitLab Pages on the current system.
-| `external_http` | Configure Pages to bind to one or more secondary IP addresses, serving HTTP requests. Multiple addresses can be given as an array, along with exact ports, for example `['1.2.3.4', '1.2.3.5:8063']`. Sets value for `listen_http`.
-| `external_https` | Configure Pages to bind to one or more secondary IP addresses, serving HTTPS requests. Multiple addresses can be given as an array, along with exact ports, for example `['1.2.3.4', '1.2.3.5:8063']`. Sets value for `listen_https`.
-| `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).
-| `domain_config_source` | Domain configuration source (default: `auto`)
-| `gitlab_id` | The OAuth application public ID. Leave blank to automatically fill when Pages authenticates with GitLab.
-| `gitlab_secret` | The OAuth application secret. Leave blank to automatically fill when Pages authenticates with GitLab.
-| `auth_scope` | The OAuth application scope to use for authentication. Must match GitLab Pages OAuth application settings. Leave blank to use `api` scope by default.
-| `gitlab_server` | Server to use for authentication when access control is enabled; defaults to GitLab `external_url`.
-| `headers` | Specify any additional http headers that should be sent to the client with each response.
-| `inplace_chroot` | On [systems that don't support bind-mounts](index.md#additional-configuration-for-docker-container), this instructs GitLab Pages to `chroot` into its `pages_path` directory. Some caveats exist when using in-place `chroot`; refer to the GitLab Pages [README](https://gitlab.com/gitlab-org/gitlab-pages/blob/master/README.md#caveats) for more information.
-| `insecure_ciphers` | Use default list of cipher suites, may contain insecure ones like 3DES and RC4.
-| `internal_gitlab_server` | Internal GitLab server address used exclusively for API requests. Useful if you want to send that traffic over an internal load balancer. Defaults to GitLab `external_url`.
-| `listen_proxy` | The addresses to listen on for reverse-proxy requests. Pages binds to these addresses' network sockets and receives incoming requests from them. Sets the value of `proxy_pass` in `$nginx-dir/conf/gitlab-pages.conf`.
-| `log_directory` | Absolute path to a log directory.
-| `log_format` | The log output format: `text` or `json`.
-| `log_verbose` | Verbose logging, true/false.
-| `max_connections` | Limit on the number of concurrent connections to the HTTP, HTTPS or proxy listeners.
-| `metrics_address` | The address to listen on for metrics requests.
-| `redirect_http` | Redirect pages from HTTP to HTTPS, true/false.
-| `sentry_dsn` | The address for sending Sentry crash reporting to.
-| `sentry_enabled` | Enable reporting and logging with Sentry, true/false.
-| `sentry_environment` | The environment for Sentry crash reporting.
-| `status_uri` | The URL path for a status page, for example, `/@status`.
-| `tls_max_version` | Specifies the maximum SSL/TLS version ("ssl3", "tls1.0", "tls1.1" or "tls1.2").
-| `tls_min_version` | Specifies the minimum SSL/TLS version ("ssl3", "tls1.0", "tls1.1" or "tls1.2").
-| `use_http2` | Enable HTTP2 support.
-| `gitlab_pages['env'][]` | |
-| `http_proxy` | Configure GitLab Pages to use an HTTP Proxy to mediate traffic between Pages and GitLab. Sets an environment variable `http_proxy` when starting Pages daemon.
-| `gitlab_rails[]` | |
-| `pages_domain_verification_cron_worker` | Schedule for verifying custom GitLab Pages domains.
-| `pages_domain_ssl_renewal_cron_worker` | Schedule for obtaining and renewing SSL certificates through Let's Encrypt for GitLab Pages domains.
-| `pages_domain_removal_cron_worker` | Schedule for removing unverified custom GitLab Pages domains.
-| `pages_path` | The directory on disk where pages are stored, defaults to `GITLAB-RAILS/shared/pages`.
-| `pages_nginx[]` | |
-| `enable` | Include a virtual host `server{}` block for Pages inside NGINX. Needed for NGINX to proxy traffic back to the Pages daemon. Set to `false` if the Pages daemon should directly receive all requests, for example, when using [custom domains](index.md#custom-domains).
-| `FF_ENABLE_REDIRECTS` | Feature flag to disable redirects (enabled by default). Read the [redirects documentation](../../user/project/pages/redirects.md#disable-redirects) for more information. |
+| Setting | Description |
+|-----------------------------------------|-------------|
+| `pages_external_url` | The URL where GitLab Pages is accessible, including protocol (HTTP / HTTPS). If `https://` is used, additional configuration is required. See [Wildcard domains with TLS support](#wildcard-domains-with-tls-support) and [Custom domains with TLS support](#custom-domains-with-tls-support) for details. |
+| **`gitlab_pages[]`** | |
+| `access_control` | Whether to enable [access control](index.md#access-control). |
+| `api_secret_key` | Full path to file with secret key used to authenticate with the GitLab API. Auto-generated when left unset. |
+| `artifacts_server` | Enable viewing [artifacts](../job_artifacts.md) in GitLab Pages. |
+| `artifacts_server_timeout` | Timeout (in seconds) for a proxied request to the artifacts server. |
+| `artifacts_server_url` | API URL to proxy artifact requests to. Defaults to GitLab `external URL` + `/api/v4`, for example `https://gitlab.com/api/v4`. When running a [separate Pages server](#running-gitlab-pages-on-a-separate-server), this URL must point to the main GitLab server's API. |
+| `auth_redirect_uri` | Callback URL for authenticating with GitLab. Defaults to project's subdomain of `pages_external_url` + `/auth`. |
+| `auth_secret` | Secret key for signing authentication requests. Leave blank to pull automatically from GitLab during OAuth registration. |
+| `dir` | Working directory for configuration and secrets files. |
+| `enable` | Enable or disable GitLab Pages on the current system. |
+| `external_http` | Configure Pages to bind to one or more secondary IP addresses, serving HTTP requests. Multiple addresses can be given as an array, along with exact ports, for example `['1.2.3.4', '1.2.3.5:8063']`. Sets value for `listen_http`. |
+| `external_https` | Configure Pages to bind to one or more secondary IP addresses, serving HTTPS requests. Multiple addresses can be given as an array, along with exact ports, for example `['1.2.3.4', '1.2.3.5:8063']`. Sets value for `listen_https`. |
+| `gitlab_client_http_timeout` | GitLab API HTTP client connection timeout in seconds (default: 10s). |
+| `gitlab_client_jwt_expiry` | JWT Token expiry time in seconds (default: 30s). |
+| `gitlab_cache_expiry` | The maximum time a domain's configuration is stored in the cache (default: 600s). |
+| `gitlab_cache_refresh` | The interval at which a domain's configuration is set to be due to refresh (default: 60s). |
+| `gitlab_cache_cleanup` | The interval at which expired items are removed from the cache (default: 60s). |
+| `gitlab_retrieval_timeout` | The maximum time to wait for a response from the GitLab API per request (default: 30s). |
+| `gitlab_retrieval_interval` | The interval to wait before retrying to resolve a domain's configuration via the GitLab API (default: 1s). |
+| `gitlab_retrieval_retries` | The maximum number of times to retry to resolve a domain's configuration via the API (default: 3). |
+| `domain_config_source` | Domain configuration source (default: `auto`) |
+| `gitlab_id` | The OAuth application public ID. Leave blank to automatically fill when Pages authenticates with GitLab. |
+| `gitlab_secret` | The OAuth application secret. Leave blank to automatically fill when Pages authenticates with GitLab. |
+| `auth_scope` | The OAuth application scope to use for authentication. Must match GitLab Pages OAuth application settings. Leave blank to use `api` scope by default. |
+| `gitlab_server` | Server to use for authentication when access control is enabled; defaults to GitLab `external_url`. |
+| `headers` | Specify any additional http headers that should be sent to the client with each response. Multiple headers can be given as an array, header and value as one string, for example `['my-header: myvalue', 'my-other-header: my-other-value']` |
+| `inplace_chroot` | On [systems that don't support bind-mounts](index.md#additional-configuration-for-docker-container), this instructs GitLab Pages to `chroot` into its `pages_path` directory. Some caveats exist when using in-place `chroot`; refer to the GitLab Pages [README](https://gitlab.com/gitlab-org/gitlab-pages/blob/master/README.md#caveats) for more information. |
+| `insecure_ciphers` | Use default list of cipher suites, may contain insecure ones like 3DES and RC4. |
+| `internal_gitlab_server` | Internal GitLab server address used exclusively for API requests. Useful if you want to send that traffic over an internal load balancer. Defaults to GitLab `external_url`. |
+| `listen_proxy` | The addresses to listen on for reverse-proxy requests. Pages binds to these addresses' network sockets and receives incoming requests from them. Sets the value of `proxy_pass` in `$nginx-dir/conf/gitlab-pages.conf`. |
+| `log_directory` | Absolute path to a log directory. |
+| `log_format` | The log output format: `text` or `json`. |
+| `log_verbose` | Verbose logging, true/false. |
+| `propagate_correlation_id` | Set to true (false by default) to re-use existing Correlation ID from the incoming request header `X-Request-ID` if present. If a reverse proxy sets this header, the value will be propagated in the request chain. |
+| `max_connections` | Limit on the number of concurrent connections to the HTTP, HTTPS or proxy listeners. |
+| `metrics_address` | The address to listen on for metrics requests. |
+| `redirect_http` | Redirect pages from HTTP to HTTPS, true/false. |
+| `sentry_dsn` | The address for sending Sentry crash reporting to. |
+| `sentry_enabled` | Enable reporting and logging with Sentry, true/false. |
+| `sentry_environment` | The environment for Sentry crash reporting. |
+| `status_uri` | The URL path for a status page, for example, `/@status`. |
+| `tls_max_version` | Specifies the maximum SSL/TLS version ("ssl3", "tls1.0", "tls1.1" or "tls1.2"). |
+| `tls_min_version` | Specifies the minimum SSL/TLS version ("ssl3", "tls1.0", "tls1.1" or "tls1.2"). |
+| `use_http2` | Enable HTTP2 support. |
+| **`gitlab_pages['env'][]`** | |
+| `http_proxy` | Configure GitLab Pages to use an HTTP Proxy to mediate traffic between Pages and GitLab. Sets an environment variable `http_proxy` when starting Pages daemon. |
+| **`gitlab_rails[]`** | |
+| `pages_domain_verification_cron_worker` | Schedule for verifying custom GitLab Pages domains. |
+| `pages_domain_ssl_renewal_cron_worker` | Schedule for obtaining and renewing SSL certificates through Let's Encrypt for GitLab Pages domains. |
+| `pages_domain_removal_cron_worker` | Schedule for removing unverified custom GitLab Pages domains. |
+| `pages_path` | The directory on disk where pages are stored, defaults to `GITLAB-RAILS/shared/pages`. |
+| **`pages_nginx[]`** | |
+| `enable` | Include a virtual host `server{}` block for Pages inside NGINX. Needed for NGINX to proxy traffic back to the Pages daemon. Set to `false` if the Pages daemon should directly receive all requests, for example, when using [custom domains](index.md#custom-domains). |
+| `FF_ENABLE_REDIRECTS` | Feature flag to disable redirects (enabled by default). Read the [redirects documentation](../../user/project/pages/redirects.md#disable-redirects) for more information. |
---
@@ -347,7 +357,7 @@ When adding a custom domain, users are required to prove they own it by
adding a GitLab-controlled verification code to the DNS records for that domain.
If your user base is private or otherwise trusted, you can disable the
-verification requirement. Navigate to **Admin Area > Settings > Preferences** and
+verification requirement. Go to **Admin Area > Settings > Preferences** and
uncheck **Require users to prove ownership of custom domains** in the **Pages** section.
This setting is enabled by default.
@@ -362,7 +372,7 @@ sites served under a custom domain.
To enable it, you must:
1. Choose an email address on which you want to receive notifications about expiring domains.
-1. Navigate to your instance's **Admin Area > Settings > Preferences** and expand **Pages** settings.
+1. Go to your instance's **Admin Area > Settings > Preferences** and expand **Pages** settings.
1. Enter the email address for receiving notifications and accept Let's Encrypt's Terms of Service as shown below.
1. Click **Save changes**.
@@ -403,6 +413,8 @@ all the App nodes and Sidekiq nodes.
#### Using Pages with reduced authentication scope
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-pages/-/merge_requests/423) in GitLab 13.10.
+
By default, the Pages daemon uses the `api` scope to authenticate. You can configure this. For
example, this reduces the scope to `read_api` in `/etc/gitlab/gitlab.rb`:
@@ -414,7 +426,7 @@ The scope to use for authentication must match the GitLab Pages OAuth applicatio
pre-existing applications must modify the GitLab Pages OAuth application. Follow these steps to do
this:
-1. Navigate to your instance's **Admin Area > Settings > Applications** and expand **GitLab Pages**
+1. Go to your instance's **Admin Area > Settings > Applications** and expand **GitLab Pages**
settings.
1. Clear the `api` scope's checkbox and select the desired scope's checkbox (for example,
`read_api`).
@@ -432,7 +444,7 @@ This can be useful to preserve information published with Pages websites to the
of your instance only.
To do that:
-1. Navigate to your instance's **Admin Area > Settings > Preferences** and expand **Pages** settings.
+1. Go to your instance's **Admin Area > Settings > Preferences** and expand **Pages** settings.
1. Check the **Disable public access to Pages sites** checkbox.
1. Click **Save changes**.
@@ -521,6 +533,25 @@ Follow the steps below to configure verbose logging of GitLab Pages daemon.
1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+## Propagating the correlation ID
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-pages/-/merge_requests/438) in GitLab 13.10.
+
+Setting the `propagate_correlation_id` to true will allow installations behind a reverse proxy generate
+and set a correlation ID to requests sent to GitLab Pages. When a reverse proxy sets the header value `X-Request-ID`,
+the value will be propagated in the request chain.
+Users [can find the correlation ID in the logs](../troubleshooting/tracing_correlation_id.md#identify-the-correlation-id-for-a-request).
+
+To enable the propagation of the correlation ID:
+
+1. Set the parameter to true in `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ gitlab_pages['propagate_correlation_id'] = true
+ ```
+
+1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+
## Change storage path
Follow the steps below to change the default path where GitLab Pages' contents
@@ -599,13 +630,13 @@ The default is 100MB.
To override the global maximum pages size for a specific project:
-1. Navigate to your project's **Settings > Pages** page.
+1. Go to your project's **Settings > Pages** page.
1. Edit the **Maximum size of pages**.
1. Click **Save changes**.
To override the global maximum pages size for a specific group:
-1. Navigate to your group's **Settings > General** page and expand **Pages**.
+1. Go to your group's **Settings > General** page and expand **Pages**.
1. Edit the **Maximum size of pages**.
1. Click **Save changes**.
@@ -720,7 +751,7 @@ preferred source is `gitlab`, which uses [API-based configuration](#gitlab-api-b
For more details see this [blog post](https://about.gitlab.com/blog/2020/08/03/how-gitlab-pages-uses-the-gitlab-api-to-serve-content/).
-### Deprecated domain_config_source
+### Deprecated `domain_config_source`
WARNING:
The flag `gitlab_pages['domain_config_source']` is deprecated for use in [GitLab 13.9](https://gitlab.com/gitlab-org/gitlab/-/issues/217913),
@@ -767,6 +798,44 @@ gitlab_pages['domain_config_source'] = "disk"
For other common issues, see the [troubleshooting section](#failed-to-connect-to-the-internal-gitlab-api)
or report an issue.
+### GitLab API cache configuration
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-pages/-/issues/520) in GitLab 13.10.
+
+API-based configuration uses a caching mechanism to improve performance and reliability of serving Pages.
+The cache behavior can be modified by changing the cache settings, however, the recommended values are set for you and should only be modified if needed.
+Incorrect configuration of these values may result in intermittent
+or persistent errors, or the Pages Daemon serving old content.
+
+NOTE:
+Expiry, interval and timeout flags use [Golang's duration formatting](https://golang.org/pkg/time/#ParseDuration).
+A duration string is a possibly signed sequence of decimal numbers,
+each with optional fraction and a unit suffix, such as "300ms", "1.5h" or "2h45m".
+Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h".
+
+Examples:
+
+- Increasing `gitlab_cache_expiry` will allow items to exist in the cache longer.
+This setting might be useful if the communication between GitLab Pages and GitLab Rails
+is not stable.
+
+- Increasing `gitlab_cache_refresh` will reduce the frequency at which GitLab Pages
+requests a domain's configuration from GitLab Rails. This setting might be useful
+GitLab Pages generates too many requests to GitLab API and content does not change frequently.
+
+- Decreasing `gitlab_cache_cleanup` will remove expired items from the cache more frequently,
+reducing the memory usage of your Pages node.
+
+- Decreasing `gitlab_retrieval_timeout` allows you to stop the request to GitLab Rails
+more quickly. Increasing it will allow more time to receive a response from the API,
+useful in slow networking environments.
+
+- Decreasing `gitlab_retrieval_interval` will make requests to the API more frequently,
+only when there is an error response from the API, for example a connection timeout.
+
+- Decreasing `gitlab_retrieval_retries` will reduce the number of times a domain's
+configuration is tried to be resolved automatically before reporting an error.
+
## Using object storage
> [Introduced](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5577) in GitLab 13.6.
@@ -837,7 +906,7 @@ In installations from source:
remote_directory: "pages" # The bucket name
connection:
provider: AWS # Only AWS supported at the moment
- aws_access_key_id: AWS_ACESS_KEY_ID
+ aws_access_key_id: AWS_ACCESS_KEY_ID
aws_secret_access_key: AWS_SECRET_ACCESS_KEY
region: eu-central-1
```
@@ -944,14 +1013,15 @@ to define the explicit address that the GitLab Pages daemon should listen on:
gitlab_pages['listen_proxy'] = '127.0.0.1:8090'
```
-### 404 error after transferring project to a different group or user
+### 404 error after transferring the project to a different group or user, or changing project path
If you encounter a `404 Not Found` error a Pages site after transferring a project to
-another group or user, you must trigger a domain configuration update for Pages. To do
-so, write something in the `.update` file. The Pages daemon monitors for changes to this
-file, and reloads the configuration when changes occur.
+another group or user, or changing project path, you must trigger a domain configuration
+update for Pages. To do so, write something in the `.update` file. The Pages daemon
+monitors for changes to this file, and reloads the configuration when changes occur.
-Use this example to fix a `404 Not Found` error after transferring a project with Pages:
+Use this example to fix a `404 Not Found` error after transferring a project or changing
+a project path with Pages:
```shell
date > /var/opt/gitlab/gitlab-rails/shared/pages/.update
diff --git a/doc/administration/postgresql/replication_and_failover.md b/doc/administration/postgresql/replication_and_failover.md
index e80e38fe5d1..a9a38ce1beb 100644
--- a/doc/administration/postgresql/replication_and_failover.md
+++ b/doc/administration/postgresql/replication_and_failover.md
@@ -900,7 +900,12 @@ You can switch an exiting database cluster to use Patroni instead of repmgr with
```
1. Repeat the last two steps for all replica nodes. `gitlab.rb` should look the same on all nodes.
-1. Optional: You can remove `gitlab_repmgr` database and role on the primary.
+1. If present, remove the `gitlab_repmgr` database and role on the primary. If you don't delete the `gitlab_repmgr`
+ database, upgrading PostgreSQL 11 to 12 will fail with:
+
+ ```plaintext
+ could not load library "$libdir/repmgr_funcs": ERROR: could not access file "$libdir/repmgr_funcs": No such file or directory
+ ```
### Upgrading PostgreSQL major version in a Patroni cluster
diff --git a/doc/administration/pseudonymizer.md b/doc/administration/pseudonymizer.md
index 5f1272b1f4a..4aa73212e43 100644
--- a/doc/administration/pseudonymizer.md
+++ b/doc/administration/pseudonymizer.md
@@ -24,7 +24,7 @@ be textually exported. This ensures that:
## Configuration
-To configure the pseudonymizer, you need to:
+To configure the Pseudonymizer, you need to:
- Provide a manifest file that describes which fields should be included or
pseudonymized ([example `manifest.yml` file](https://gitlab.com/gitlab-org/gitlab/tree/master/config/pseudonymizer.yml)).
@@ -87,7 +87,7 @@ To configure the pseudonymizer, you need to:
## Usage
-You can optionally run the pseudonymizer using the following environment variables:
+You can optionally run the Pseudonymizer using the following environment variables:
- `PSEUDONYMIZER_OUTPUT_DIR` - where to store the output CSV files (defaults to `/tmp`)
- `PSEUDONYMIZER_BATCH` - the batch size when querying the DB (defaults to `100000`)
diff --git a/doc/administration/raketasks/check.md b/doc/administration/raketasks/check.md
index 5ec268ac769..8d2ca103c82 100644
--- a/doc/administration/raketasks/check.md
+++ b/doc/administration/raketasks/check.md
@@ -245,3 +245,9 @@ Upload.find_each do |upload|
end
p "#{uploads_deleted} remote objects were destroyed."
```
+
+### Delete references to missing LFS objects
+
+If `gitlab-rake gitlab:lfs:check VERBOSE=1` detects LFS objects that exist in the database
+but not on disk, [follow the procedure in the LFS documentation](../../topics/git/lfs/index.md#missing-lfs-objects)
+to remove the database entries.
diff --git a/doc/administration/raketasks/github_import.md b/doc/administration/raketasks/github_import.md
index c29865be56c..0338732e886 100644
--- a/doc/administration/raketasks/github_import.md
+++ b/doc/administration/raketasks/github_import.md
@@ -19,8 +19,8 @@ before/after the brackets. Also, some shells (for example, `zsh`) can interpret
## Caveats
-If the GitHub [rate limit](https://docs.github.com/v3/#rate-limiting) is reached while importing,
-the importing process waits (`sleep()`) until it can continue importing.
+If the GitHub [rate limit](https://docs.github.com/en/rest/reference/rate-limit) is reached while
+importing, the importing process waits (`sleep()`) until it can continue importing.
## Importing multiple projects
diff --git a/doc/administration/raketasks/maintenance.md b/doc/administration/raketasks/maintenance.md
index 3494ceb701e..fa95f38f37c 100644
--- a/doc/administration/raketasks/maintenance.md
+++ b/doc/administration/raketasks/maintenance.md
@@ -110,7 +110,7 @@ The `gitlab:check` Rake task runs the following Rake tasks:
It checks that each component was set up according to the installation guide and suggest fixes
for issues found. This command must be run from your application server and doesn't work correctly on
-component servers like [Gitaly](../gitaly/index.md#run-gitaly-on-its-own-server).
+component servers like [Gitaly](../gitaly/configure_gitaly.md#run-gitaly-on-its-own-server).
You may also have a look at our troubleshooting guides for:
@@ -246,8 +246,9 @@ have been corrupted, you should reinstall the omnibus package.
## Check TCP connectivity to a remote site
Sometimes you need to know if your GitLab installation can connect to a TCP
-service on another machine - perhaps a PostgreSQL or HTTPS server. A Rake task
-is included to help you with this:
+service on another machine (for example a PostgreSQL or web server)
+in order to troubleshoot proxy issues.
+A Rake task is included to help you with this.
**Omnibus Installation**
diff --git a/doc/administration/reference_architectures/10k_users.md b/doc/administration/reference_architectures/10k_users.md
index d4d522ab1b8..a51641f661f 100644
--- a/doc/administration/reference_architectures/10k_users.md
+++ b/doc/administration/reference_architectures/10k_users.md
@@ -26,14 +26,14 @@ full list of reference architectures, see
| Redis - Queues / Shared State | 3 | 4 vCPU, 15 GB memory | n1-standard-4 | m5.xlarge | D4s v3 |
| Redis Sentinel - Cache | 3 | 1 vCPU, 1.7 GB memory | g1-small | t3.small | B1MS |
| Redis Sentinel - Queues / Shared State | 3 | 1 vCPU, 1.7 GB memory | g1-small | t3.small | B1MS |
-| Gitaly Cluster | 3 | 16 vCPU, 60 GB memory | n1-standard-16 | m5.4xlarge | D16s v3 |
+| Gitaly | 3 | 16 vCPU, 60 GB memory | n1-standard-16 | m5.4xlarge | D16s v3 |
| Praefect | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
| Praefect PostgreSQL | 1+* | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
| Sidekiq | 4 | 4 vCPU, 15 GB memory | n1-standard-4 | m5.xlarge | D4s v3 |
| GitLab Rails | 3 | 32 vCPU, 28.8 GB memory | n1-highcpu-32 | c5.9xlarge | F32s v2 |
| Monitoring node | 1 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | c5.xlarge | F4s v2 |
| Object storage | n/a | n/a | n/a | n/a | n/a |
-| NFS server | 1 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | c5.xlarge | F4s v2 |
+| NFS server | 1 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | `c5.xlarge` | F4s v2 |
```plantuml
@startuml 10k
@@ -206,7 +206,7 @@ The following list includes descriptions of each server and its assigned IP:
- `10.6.0.111`: GitLab application 1
- `10.6.0.112`: GitLab application 2
- `10.6.0.113`: GitLab application 3
-- `10.6.0.121`: Prometheus
+- `10.6.0.151`: Prometheus
## Configure the external load balancer
@@ -1508,7 +1508,7 @@ Praefect requires several secret tokens to secure communications across the Clus
Gitaly Cluster nodes are configured in Praefect via a `virtual storage`. Each storage contains
the details of each Gitaly node that makes up the cluster. Each storage is also given a name
-and this name is used in several areas of the config. In this guide, the name of the storage will be
+and this name is used in several areas of the configuration. In this guide, the name of the storage will be
`default`. Also, this guide is geared towards new installs, if upgrading an existing environment
to use Gitaly Cluster, you may need to use a different name.
Refer to the [Praefect documentation](../gitaly/praefect.md#praefect) for more info.
@@ -1756,7 +1756,7 @@ Note the following:
necessary.
- The Internal Load Balancer will also access to the certificates and need to be configured
- to allow for TLS passthrough.
+ to allow for TLS pass-through.
Refer to the load balancers documentation on how to configure this.
To configure Praefect with TLS:
@@ -1927,7 +1927,7 @@ To configure the Sidekiq nodes, on each one:
node_exporter['listen_address'] = '0.0.0.0:9100'
# Rails Status for prometheus
- gitlab_rails['monitoring_whitelist'] = ['10.6.0.121/32', '127.0.0.0/8']
+ gitlab_rails['monitoring_whitelist'] = ['10.6.0.151/32', '127.0.0.0/8']
#############################
### Object storage ###
@@ -1940,13 +1940,13 @@ To configure the Sidekiq nodes, on each one:
'google_project' => '<gcp-project-name>',
'google_json_key_location' => '<path-to-gcp-service-account-key>'
}
- gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-bucket-name>"
+ gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-artifacts-bucket-name>"
+ gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-external-diffs-bucket-name>"
+ gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-lfs-bucket-name>"
+ gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-uploads-bucket-name>"
+ gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-packages-bucket-name>"
+ gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-dependency-proxy-bucket-name>"
+ gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-terraform-state-bucket-name>"
```
1. Copy the `/etc/gitlab/gitlab-secrets.json` file from your Consul server, and replace
@@ -2055,8 +2055,8 @@ On each node perform the following:
# Add the monitoring node's IP address to the monitoring whitelist and allow it to
# scrape the NGINX metrics
- gitlab_rails['monitoring_whitelist'] = ['10.6.0.121/32', '127.0.0.0/8']
- nginx['status']['options']['allow'] = ['10.6.0.121/32', '127.0.0.0/8']
+ gitlab_rails['monitoring_whitelist'] = ['10.6.0.151/32', '127.0.0.0/8']
+ nginx['status']['options']['allow'] = ['10.6.0.151/32', '127.0.0.0/8']
#############################
### Object storage ###
@@ -2069,13 +2069,13 @@ On each node perform the following:
'google_project' => '<gcp-project-name>',
'google_json_key_location' => '<path-to-gcp-service-account-key>'
}
- gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-bucket-name>"
+ gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-artifacts-bucket-name>"
+ gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-external-diffs-bucket-name>"
+ gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-lfs-bucket-name>"
+ gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-uploads-bucket-name>"
+ gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-packages-bucket-name>"
+ gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-dependency-proxy-bucket-name>"
+ gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-terraform-state-bucket-name>"
```
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
@@ -2192,7 +2192,7 @@ running [Prometheus](../monitoring/prometheus/index.md) and
The following IP will be used as an example:
-- `10.6.0.121`: Prometheus
+- `10.6.0.151`: Prometheus
To configure the Monitoring node:
@@ -2303,20 +2303,9 @@ on what features you intend to use:
| [Terraform state files](../terraform_state.md#using-object-storage) | Yes |
Using separate buckets for each data type is the recommended approach for GitLab.
-
-A limitation of our configuration is that each use of object storage is separately configured.
-[We have an issue for improving this](https://gitlab.com/gitlab-org/gitlab/-/issues/23345)
-and easily using one bucket with separate folders is one improvement that this might bring.
-
-There is at least one specific issue with using the same bucket:
-when GitLab is deployed with the Helm chart restore from backup
-[will not properly function](https://docs.gitlab.com/charts/advanced/external-object-storage/#lfs-artifacts-uploads-packages-external-diffs-pseudonymizer)
-unless separate buckets are used.
-
-One risk of using a single bucket would be if your organization decided to
-migrate GitLab to the Helm deployment in the future. GitLab would run, but the situation with
-backups might not be realized until the organization had a critical requirement for the backups to
-work.
+This ensures there are no collisions across the various types of data GitLab stores.
+There are plans to [enable the use of a single bucket](https://gitlab.com/gitlab-org/gitlab/-/issues/292958)
+in the future.
<div align="right">
<a type="button" class="btn btn-default" href="#setup-components">
@@ -2324,7 +2313,7 @@ work.
</a>
</div>
-## Configure Advanced Search **(PREMIUM SELF)**
+## Configure Advanced Search
You can leverage Elasticsearch and [enable Advanced Search](../../integration/elasticsearch.md)
for faster, more advanced code search across your entire GitLab instance.
@@ -2360,16 +2349,6 @@ as soon as possible.
</a>
</div>
-## Troubleshooting
-
-See the [troubleshooting documentation](troubleshooting.md).
-
-<div align="right">
- <a type="button" class="btn btn-default" href="#setup-components">
- Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
- </a>
-</div>
-
## Cloud Native Deployment (optional)
Hybrid installations leverage the benefits of both cloud native and traditional
@@ -2422,3 +2401,9 @@ Webservice pods. Expand available resources using the ratio of 1 vCPU to 1.25 GB
_per each worker process_ for each additional Webservice pod.
For further information on resource usage, see the [Webservice resources](https://docs.gitlab.com/charts/charts/gitlab/webservice/#resources).
+
+<div align="right">
+ <a type="button" class="btn btn-default" href="#setup-components">
+ Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
+ </a>
+</div>
diff --git a/doc/administration/reference_architectures/25k_users.md b/doc/administration/reference_architectures/25k_users.md
index 48c72bb930d..8cf9efe1d2c 100644
--- a/doc/administration/reference_architectures/25k_users.md
+++ b/doc/administration/reference_architectures/25k_users.md
@@ -12,100 +12,110 @@ full list of reference architectures, see
[Available reference architectures](index.md#available-reference-architectures).
> - **Supported users (approximate):** 25,000
-> - **High Availability:** Yes
+> - **High Availability:** Yes ([Praefect](#configure-praefect-postgresql) needs a third-party PostgreSQL solution for HA)
> - **Test requests per second (RPS) rates:** API: 500 RPS, Web: 50 RPS, Git (Pull): 50 RPS, Git (Push): 10 RPS
| Service | Nodes | Configuration | GCP | AWS | Azure |
|-----------------------------------------|-------------|-------------------------|-----------------|-------------|----------|
-| External load balancing node | 1 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | `c5.xlarge` | F4s v2 |
-| Consul | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | `c5.large` | F2s v2 |
-| PostgreSQL | 3 | 8 vCPU, 30 GB memory | n1-standard-8 | `m5.2xlarge` | D8s v3 |
-| PgBouncer | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | `c5.large` | F2s v2 |
-| Internal load balancing node | 1 | 4 vCPU, 3.6GB memory | n1-highcpu-4 | `c5.large` | F2s v2 |
-| Redis - Cache | 3 | 4 vCPU, 15 GB memory | n1-standard-4 | `m5.xlarge` | D4s v3 |
-| Redis - Queues / Shared State | 3 | 4 vCPU, 15 GB memory | n1-standard-4 | `m5.xlarge` | D4s v3 |
-| Redis Sentinel - Cache | 3 | 1 vCPU, 1.7 GB memory | g1-small | `t3.small` | B1MS |
-| Redis Sentinel - Queues / Shared State | 3 | 1 vCPU, 1.7 GB memory | g1-small | `t3.small` | B1MS |
-| Gitaly | 2 (minimum) | 32 vCPU, 120 GB memory | n1-standard-32 | `m5.8xlarge` | D32s v3 |
-| Sidekiq | 4 | 4 vCPU, 15 GB memory | n1-standard-4 | `m5.xlarge` | D4s v3 |
-| GitLab Rails | 5 | 32 vCPU, 28.8 GB memory | n1-highcpu-32 | `c5.9xlarge` | F32s v2 |
-| Monitoring node | 1 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | `c5.xlarge` | F4s v2 |
+| External load balancing node | 1 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | c5.xlarge | F4s v2 |
+| Consul | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
+| PostgreSQL | 3 | 16 vCPU, 60 GB memory | n1-standard-16 | m5.4xlarge | D16s v3 |
+| PgBouncer | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
+| Internal load balancing node | 1 | 4 vCPU, 3.6GB memory | n1-highcpu-4 | c5.large | F2s v2 |
+| Redis - Cache | 3 | 4 vCPU, 15 GB memory | n1-standard-4 | m5.xlarge | D4s v3 |
+| Redis - Queues / Shared State | 3 | 4 vCPU, 15 GB memory | n1-standard-4 | m5.xlarge | D4s v3 |
+| Redis Sentinel - Cache | 3 | 1 vCPU, 1.7 GB memory | g1-small | t3.small | B1MS |
+| Redis Sentinel - Queues / Shared State | 3 | 1 vCPU, 1.7 GB memory | g1-small | t3.small | B1MS |
+| Gitaly | 3 | 32 vCPU, 120 GB memory | n1-standard-32 | m5.8xlarge | D32s v3 |
+| Praefect | 3 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | c5.xlarge | F4s v2 |
+| Praefect PostgreSQL | 1+* | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
+| Sidekiq | 4 | 4 vCPU, 15 GB memory | n1-standard-4 | m5.xlarge | D4s v3 |
+| GitLab Rails | 5 | 32 vCPU, 28.8 GB memory | n1-highcpu-32 | c5.9xlarge | F32s v2 |
+| Monitoring node | 1 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | c5.xlarge | F4s v2 |
| Object storage | n/a | n/a | n/a | n/a | n/a |
-| NFS server | 1 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | `c5.xlarge` | F4s v2 |
-
-```mermaid
-stateDiagram-v2
- [*] --> LoadBalancer
- LoadBalancer --> ApplicationServer
-
- ApplicationServer --> BackgroundJobs
- ApplicationServer --> Gitaly
- ApplicationServer --> Redis_Cache
- ApplicationServer --> Redis_Queues
- ApplicationServer --> PgBouncer
- PgBouncer --> Database
- ApplicationServer --> ObjectStorage
- BackgroundJobs --> ObjectStorage
-
- ApplicationMonitoring -->ApplicationServer
- ApplicationMonitoring -->PgBouncer
- ApplicationMonitoring -->Database
- ApplicationMonitoring -->BackgroundJobs
-
- ApplicationServer --> Consul
-
- Consul --> Database
- Consul --> PgBouncer
- Redis_Cache --> Consul
- Redis_Queues --> Consul
- BackgroundJobs --> Consul
-
- state Consul {
- "Consul_1..3"
- }
-
- state Database {
- "PG_Primary_Node"
- "PG_Secondary_Node_1..2"
- }
-
- state Redis_Cache {
- "R_Cache_Primary_Node"
- "R_Cache_Replica_Node_1..2"
- "R_Cache_Sentinel_1..3"
- }
-
- state Redis_Queues {
- "R_Queues_Primary_Node"
- "R_Queues_Replica_Node_1..2"
- "R_Queues_Sentinel_1..3"
- }
-
- state Gitaly {
- "Gitaly_1..2"
- }
-
- state BackgroundJobs {
- "Sidekiq_1..4"
- }
-
- state ApplicationServer {
- "GitLab_Rails_1..5"
- }
-
- state LoadBalancer {
- "LoadBalancer_1"
- }
-
- state ApplicationMonitoring {
- "Prometheus"
- "Grafana"
- }
-
- state PgBouncer {
- "Internal_Load_Balancer"
- "PgBouncer_1..3"
- }
+| NFS server | 1 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | c5.xlarge | F4s v2 |
+
+```plantuml
+@startuml 25k
+card "**External Load Balancer**" as elb #6a9be7
+card "**Internal Load Balancer**" as ilb #9370DB
+
+together {
+ collections "**GitLab Rails** x5" as gitlab #32CD32
+ collections "**Sidekiq** x4" as sidekiq #ff8dd1
+}
+
+together {
+ card "**Prometheus + Grafana**" as monitor #7FFFD4
+ collections "**Consul** x3" as consul #e76a9b
+}
+
+card "Gitaly Cluster" as gitaly_cluster {
+ collections "**Praefect** x3" as praefect #FF8C00
+ collections "**Gitaly** x3" as gitaly #FF8C00
+ card "**Praefect PostgreSQL***\n//Non fault-tolerant//" as praefect_postgres #FF8C00
+
+ praefect -[#FF8C00]-> gitaly
+ praefect -[#FF8C00]> praefect_postgres
+}
+
+card "Database" as database {
+ collections "**PGBouncer** x3" as pgbouncer #4EA7FF
+ card "**PostgreSQL** (Primary)" as postgres_primary #4EA7FF
+ collections "**PostgreSQL** (Secondary) x2" as postgres_secondary #4EA7FF
+
+ pgbouncer -[#4EA7FF]-> postgres_primary
+ postgres_primary .[#4EA7FF]> postgres_secondary
+}
+
+card "redis" as redis {
+ collections "**Redis Persistent** x3" as redis_persistent #FF6347
+ collections "**Redis Cache** x3" as redis_cache #FF6347
+ collections "**Redis Persistent Sentinel** x3" as redis_persistent_sentinel #FF6347
+ collections "**Redis Cache Sentinel** x3"as redis_cache_sentinel #FF6347
+
+ redis_persistent <.[#FF6347]- redis_persistent_sentinel
+ redis_cache <.[#FF6347]- redis_cache_sentinel
+}
+
+cloud "**Object Storage**" as object_storage #white
+
+elb -[#6a9be7]-> gitlab
+elb -[#6a9be7]--> monitor
+
+gitlab -[#32CD32]> sidekiq
+gitlab -[#32CD32]--> ilb
+gitlab -[#32CD32]-> object_storage
+gitlab -[#32CD32]---> redis
+gitlab -[hidden]-> monitor
+gitlab -[hidden]-> consul
+
+sidekiq -[#ff8dd1]--> ilb
+sidekiq -[#ff8dd1]-> object_storage
+sidekiq -[#ff8dd1]---> redis
+sidekiq -[hidden]-> monitor
+sidekiq -[hidden]-> consul
+
+ilb -[#9370DB]-> gitaly_cluster
+ilb -[#9370DB]-> database
+
+consul .[#e76a9b]u-> gitlab
+consul .[#e76a9b]u-> sidekiq
+consul .[#e76a9b]> monitor
+consul .[#e76a9b]-> database
+consul .[#e76a9b]-> gitaly_cluster
+consul .[#e76a9b,norank]--> redis
+
+monitor .[#7FFFD4]u-> gitlab
+monitor .[#7FFFD4]u-> sidekiq
+monitor .[#7FFFD4]> consul
+monitor .[#7FFFD4]-> database
+monitor .[#7FFFD4]-> gitaly_cluster
+monitor .[#7FFFD4,norank]--> redis
+monitor .[#7FFFD4]> ilb
+monitor .[#7FFFD4,norank]u--> elb
+
+@enduml
```
The Google Cloud Platform (GCP) architectures were built and tested using the
@@ -120,19 +130,25 @@ uploads, or artifacts), using an [object storage service](#configure-the-object-
is recommended instead of using NFS. Using an object storage service also
doesn't require you to provision and maintain a node.
+It's also worth noting that at this time [Praefect requires its own database server](../gitaly/praefect.md#postgresql) and
+that to achieve full High Availability a third party PostgreSQL database solution will be required.
+We hope to offer a built in solutions for these restrictions in the future but in the meantime a non HA PostgreSQL server
+can be set up via Omnibus GitLab, which the above specs reflect. Refer to the following issues for more information: [`omnibus-gitlab#5919`](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5919) & [`gitaly#3398`](https://gitlab.com/gitlab-org/gitaly/-/issues/3398)
+
## Setup components
To set up GitLab and its components to accommodate up to 25,000 users:
-1. [Configure the external load balancing node](#configure-the-external-load-balancer)
+1. [Configure the external load balancer](#configure-the-external-load-balancer)
to handle the load balancing of the GitLab application services nodes.
+1. [Configure the internal load balancer](#configure-the-internal-load-balancer).
+ to handle the load balancing of GitLab application internal connections.
1. [Configure Consul](#configure-consul).
1. [Configure PostgreSQL](#configure-postgresql), the database for GitLab.
1. [Configure PgBouncer](#configure-pgbouncer).
-1. [Configure the internal load balancing node](#configure-the-internal-load-balancer).
1. [Configure Redis](#configure-redis).
-1. [Configure Gitaly](#configure-gitaly),
- which provides access to the Git repositories.
+1. [Configure Gitaly Cluster](#configure-gitaly-cluster),
+ provides access to the Git repositories.
1. [Configure Sidekiq](#configure-sidekiq).
1. [Configure the main GitLab Rails application](#configure-gitlab-rails)
to run Puma/Unicorn, Workhorse, GitLab Shell, and to serve all frontend
@@ -178,6 +194,11 @@ The following list includes descriptions of each server and its assigned IP:
- `10.6.0.83`: Sentinel - Queues 3
- `10.6.0.91`: Gitaly 1
- `10.6.0.92`: Gitaly 2
+- `10.6.0.93`: Gitaly 3
+- `10.6.0.131`: Praefect 1
+- `10.6.0.132`: Praefect 2
+- `10.6.0.133`: Praefect 3
+- `10.6.0.141`: Praefect PostgreSQL 1 (non HA)
- `10.6.0.101`: Sidekiq 1
- `10.6.0.102`: Sidekiq 2
- `10.6.0.103`: Sidekiq 3
@@ -185,7 +206,9 @@ The following list includes descriptions of each server and its assigned IP:
- `10.6.0.111`: GitLab application 1
- `10.6.0.112`: GitLab application 2
- `10.6.0.113`: GitLab application 3
-- `10.6.0.121`: Prometheus
+- `10.6.0.114`: GitLab application 4
+- `10.6.0.115`: GitLab application 5
+- `10.6.0.151`: Prometheus
## Configure the external load balancer
@@ -308,6 +331,71 @@ Configure DNS for an alternate SSH hostname such as `altssh.gitlab.example.com`.
</a>
</div>
+## Configure the internal load balancer
+
+The Internal Load Balancer is used to balance any internal connections the GitLab environment requires
+such as connections to [PgBouncer](#configure-pgbouncer) and [Praefect](#configure-praefect) (Gitaly Cluster).
+
+Note that it's a separate node from the External Load Balancer and shouldn't have any access externally.
+
+The following IP will be used as an example:
+
+- `10.6.0.40`: Internal Load Balancer
+
+Here's how you could do it with [HAProxy](https://www.haproxy.org/):
+
+```plaintext
+global
+ log /dev/log local0
+ log localhost local1 notice
+ log stdout format raw local0
+
+defaults
+ log global
+ default-server inter 10s fall 3 rise 2
+ balance leastconn
+
+frontend internal-pgbouncer-tcp-in
+ bind *:6432
+ mode tcp
+ option tcplog
+
+ default_backend pgbouncer
+
+frontend internal-praefect-tcp-in
+ bind *:2305
+ mode tcp
+ option tcplog
+ option clitcpka
+
+ default_backend praefect
+
+backend pgbouncer
+ mode tcp
+ option tcp-check
+
+ server pgbouncer1 10.6.0.21:6432 check
+ server pgbouncer2 10.6.0.22:6432 check
+ server pgbouncer3 10.6.0.23:6432 check
+
+backend praefect
+ mode tcp
+ option tcp-check
+ option srvtcpka
+
+ server praefect1 10.6.0.131:2305 check
+ server praefect2 10.6.0.132:2305 check
+ server praefect3 10.6.0.133:2305 check
+```
+
+Refer to your preferred Load Balancer's documentation for further guidance.
+
+<div align="right">
+ <a type="button" class="btn btn-default" href="#setup-components">
+ Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
+ </a>
+</div>
+
## Configure Consul
The following IPs will be used as an example:
@@ -662,52 +750,6 @@ The following IPs will be used as an example:
</a>
</div>
-### Configure the internal load balancer
-
-If you're running more than one PgBouncer node as recommended, then at this time you'll need to set
-up a TCP internal load balancer to serve each correctly.
-
-The following IP will be used as an example:
-
-- `10.6.0.40`: Internal Load Balancer
-
-Here's how you could do it with [HAProxy](https://www.haproxy.org/):
-
-```plaintext
-global
- log /dev/log local0
- log localhost local1 notice
- log stdout format raw local0
-
-defaults
- log global
- default-server inter 10s fall 3 rise 2
- balance leastconn
-
-frontend internal-pgbouncer-tcp-in
- bind *:6432
- mode tcp
- option tcplog
-
- default_backend pgbouncer
-
-backend pgbouncer
- mode tcp
- option tcp-check
-
- server pgbouncer1 10.6.0.21:6432 check
- server pgbouncer2 10.6.0.22:6432 check
- server pgbouncer3 10.6.0.23:6432 check
-```
-
-Refer to your preferred Load Balancer's documentation for further guidance.
-
-<div align="right">
- <a type="button" class="btn btn-default" href="#setup-components">
- Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
- </a>
-</div>
-
## Configure Redis
Using [Redis](https://redis.io/) in scalable environment is possible using a **Primary** x **Replica**
@@ -1302,19 +1344,283 @@ To configure the Sentinel Queues server:
</a>
</div>
-## Configure Gitaly
+## Configure Gitaly Cluster
-NOTE:
-[Gitaly Cluster](../gitaly/praefect.md) support
-for the Reference Architectures is being
-worked on as a [collaborative effort](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/1) between the Quality Engineering and Gitaly teams. When this component has been verified
-some Architecture specs will likely change as a result to support the new
-and improved designed.
+[Gitaly Cluster](../gitaly/praefect.md) is a GitLab provided and recommended fault tolerant solution for storing Git repositories.
+In this configuration, every Git repository is stored on every Gitaly node in the cluster, with one being designated the primary, and failover occurs automatically if the primary node goes down.
+
+The recommended cluster setup includes the following components:
+
+- 3 Gitaly nodes: Replicated storage of Git repositories.
+- 3 Praefect nodes: Router and transaction manager for Gitaly Cluster.
+- 1 Praefect PostgreSQL node: Database server for Praefect. A third-party solution
+ is required for Praefect database connections to be made highly available.
+- 1 load balancer: A load balancer is required for Praefect. The
+ [internal load balancer](#configure-the-internal-load-balancer) will be used.
+
+This section will detail how to configure the recommended standard setup in order.
+For more advanced setups refer to the [standalone Gitaly Cluster documentation](../gitaly/praefect.md).
+
+### Configure Praefect PostgreSQL
+
+Praefect, the routing and transaction manager for Gitaly Cluster, requires its own database server to store data on Gitaly Cluster status.
+
+If you want to have a highly available setup, Praefect requires a third-party PostgreSQL database.
+A built-in solution is being [worked on](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5919).
+
+#### Praefect non-HA PostgreSQL standalone using Omnibus GitLab
+
+The following IPs will be used as an example:
+
+- `10.6.0.141`: Praefect PostgreSQL
+
+First, make sure to [install](https://about.gitlab.com/install/)
+the Linux GitLab package in the Praefect PostgreSQL node. Following the steps,
+install the necessary dependencies from step 1, and add the
+GitLab package repository from step 2. When installing GitLab
+in the second step, do not supply the `EXTERNAL_URL` value.
+
+1. SSH in to the Praefect PostgreSQL node.
+1. Create a strong password to be used for the Praefect PostgreSQL user. Take note of this password as `<praefect_postgresql_password>`.
+1. Generate the password hash for the Praefect PostgreSQL username/password pair. This assumes you will use the default
+ username of `praefect` (recommended). The command will request the password `<praefect_postgresql_password>`
+ and confirmation. Use the value that is output by this command in the next
+ step as the value of `<praefect_postgresql_password_hash>`:
+
+ ```shell
+ sudo gitlab-ctl pg-password-md5 praefect
+ ```
+
+1. Edit `/etc/gitlab/gitlab.rb` replacing values noted in the `# START user configuration` section:
+
+ ```ruby
+ # Disable all components except PostgreSQL and Consul
+ roles ['postgres_role']
+ repmgr['enable'] = false
+ patroni['enable'] = false
+
+ # PostgreSQL configuration
+ postgresql['listen_address'] = '0.0.0.0'
+ postgresql['max_connections'] = 200
+
+ gitlab_rails['auto_migrate'] = false
+
+ # 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
+ #
+ # Replace PRAEFECT_POSTGRESQL_PASSWORD_HASH with a generated md5 value
+ postgresql['sql_user_password'] = "<praefect_postgresql_password_hash>"
+
+ # Replace XXX.XXX.XXX.XXX/YY with Network Address
+ postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24)
+
+ # Set the network addresses that the exporters will listen on for monitoring
+ node_exporter['listen_address'] = '0.0.0.0:9100'
+ postgres_exporter['listen_address'] = '0.0.0.0:9187'
+
+ ## 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),
+ }
+ #
+ # END user configuration
+ ```
+
+1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
+1. Follow the [post configuration](#praefect-postgresql-post-configuration).
+
+<div align="right">
+ <a type="button" class="btn btn-default" href="#setup-components">
+ Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
+ </a>
+</div>
+
+#### Praefect HA PostgreSQL third-party solution
+
+[As noted](#configure-praefect-postgresql), a third-party PostgreSQL solution for
+Praefect's database is recommended if aiming for full High Availability.
+
+There are many third-party solutions for PostgreSQL HA. The solution selected must have the following to work with Praefect:
+
+- A static IP for all connections that doesn't change on failover.
+- [`LISTEN`](https://www.postgresql.org/docs/12/sql-listen.html) SQL functionality must be supported.
+
+Examples of the above could include [Google's Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) or [Amazon RDS](https://aws.amazon.com/rds/).
+
+Once the database is set up, follow the [post configuration](#praefect-postgresql-post-configuration).
+
+#### Praefect PostgreSQL post-configuration
+
+After the Praefect PostgreSQL server has been set up, you'll then need to configure the user and database for Praefect to use.
+
+We recommend the user be named `praefect` and the database `praefect_production`, and these can be configured as standard in PostgreSQL.
+The password for the user is the same as the one you configured earlier as `<praefect_postgresql_password>`.
-[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 5 TB of data. Depending on your
-repository storage requirements, you may require additional Gitaly server nodes.
+This is how this would work with a Omnibus GitLab PostgreSQL setup:
+
+1. SSH in to the Praefect PostgreSQL node.
+1. Connect to the PostgreSQL server with administrative access.
+ The `gitlab-psql` user should be used here for this as it's added by default in Omnibus.
+ The database `template1` is used because it is created by default on all PostgreSQL servers.
+
+ ```shell
+ /opt/gitlab/embedded/bin/psql -U gitlab-psql -d template1 -h POSTGRESQL_SERVER_ADDRESS
+ ```
+
+1. Create the new user `praefect`, replacing `<praefect_postgresql_password>`:
+
+ ```shell
+ CREATE ROLE praefect WITH LOGIN CREATEDB PASSWORD <praefect_postgresql_password>;
+ ```
+
+1. Reconnect to the PostgreSQL server, this time as the `praefect` user:
+
+ ```shell
+ /opt/gitlab/embedded/bin/psql -U praefect -d template1 -h POSTGRESQL_SERVER_ADDRESS
+ ```
+
+1. Create a new database `praefect_production`:
+
+ ```shell
+ CREATE DATABASE praefect_production WITH ENCODING=UTF8;
+ ```
+
+<div align="right">
+ <a type="button" class="btn btn-default" href="#setup-components">
+ Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
+ </a>
+</div>
+
+### Configure Praefect
+
+Praefect is the router and transaction manager for Gitaly Cluster and all connections to Gitaly go through
+it. This section details how to configure it.
+
+Praefect requires several secret tokens to secure communications across the Cluster:
+
+- `<praefect_external_token>`: Used for repositories hosted on your Gitaly cluster and can only be accessed by Gitaly clients that carry this token.
+- `<praefect_internal_token>`: Used for replication traffic inside your Gitaly cluster. This is distinct from `praefect_external_token` because Gitaly clients must not be able to access internal nodes of the Praefect cluster directly; that could lead to data loss.
+- `<praefect_postgresql_password>`: The Praefect PostgreSQL password defined in the previous section is also required as part of this setup.
+
+Gitaly Cluster nodes are configured in Praefect via a `virtual storage`. Each storage contains
+the details of each Gitaly node that makes up the cluster. Each storage is also given a name
+and this name is used in several areas of the config. In this guide, the name of the storage will be
+`default`. Also, this guide is geared towards new installs, if upgrading an existing environment
+to use Gitaly Cluster, you may need to use a different name.
+Refer to the [Praefect documentation](../gitaly/praefect.md#praefect) for more info.
+
+The following IPs will be used as an example:
+
+- `10.6.0.131`: Praefect 1
+- `10.6.0.132`: Praefect 2
+- `10.6.0.133`: Praefect 3
+
+To configure the Praefect nodes, on each one:
+
+1. SSH in to the Praefect server.
+1. [Download and install](https://about.gitlab.com/install/) the Omnibus GitLab
+ package of your choice. Be sure to follow _only_ installation steps 1 and 2
+ on the page.
+1. Edit the `/etc/gitlab/gitlab.rb` file to configure Praefect:
+
+ ```ruby
+ # Avoid running unnecessary services on the Gitaly server
+ postgresql['enable'] = false
+ redis['enable'] = false
+ nginx['enable'] = false
+ puma['enable'] = false
+ unicorn['enable'] = false
+ sidekiq['enable'] = false
+ gitlab_workhorse['enable'] = false
+ grafana['enable'] = false
+
+ # If you run a separate monitoring node you can disable these services
+ alertmanager['enable'] = false
+ prometheus['enable'] = false
+
+ # Praefect Configuration
+ praefect['enable'] = true
+ praefect['listen_addr'] = '0.0.0.0:2305'
+
+ gitlab_rails['rake_cache_clear'] = false
+ gitlab_rails['auto_migrate'] = false
+
+ # 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
+ #
+
+ # Praefect External Token
+ # This is needed by clients outside the cluster (like GitLab Shell) to communicate with the Praefect cluster
+ praefect['auth_token'] = '<praefect_external_token>'
+
+ # Praefect Database Settings
+ praefect['database_host'] = '10.6.0.141'
+ praefect['database_port'] = 5432
+ # `no_proxy` settings must always be a direct connection for caching
+ praefect['database_host_no_proxy'] = '10.6.0.141'
+ praefect['database_port_no_proxy'] = 5432
+ praefect['database_dbname'] = 'praefect_production'
+ praefect['database_user'] = 'praefect'
+ praefect['database_password'] = '<praefect_postgresql_password>'
+
+ # Praefect Virtual Storage config
+ # Name of storage hash must match storage name in git_data_dirs on GitLab
+ # server ('praefect') and in git_data_dirs on Gitaly nodes ('gitaly-1')
+ praefect['virtual_storages'] = {
+ 'default' => {
+ 'gitaly-1' => {
+ 'address' => 'tcp://10.6.0.91:8075',
+ 'token' => '<praefect_internal_token>',
+ 'primary' => true
+ },
+ 'gitaly-2' => {
+ 'address' => 'tcp://10.6.0.92:8075',
+ 'token' => '<praefect_internal_token>'
+ },
+ 'gitaly-3' => {
+ 'address' => 'tcp://10.6.0.93:8075',
+ 'token' => '<praefect_internal_token>'
+ },
+ }
+ }
+
+ # Set the network addresses that the exporters will listen on for monitoring
+ node_exporter['listen_address'] = '0.0.0.0:9100'
+ praefect['prometheus_listen_addr'] = '0.0.0.0:9652'
+
+ ## 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),
+ }
+ #
+ # END user configuration
+ ```
+
+ 1. Copy the `/etc/gitlab/gitlab-secrets.json` file from your Consul server, and
+ then replace the file of the same name on this server. If that file isn't on
+ this server, add the file from your Consul server to this server.
+
+ 1. Save the file, and then [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+
+### 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.
Due to Gitaly having notable input and output requirements, we strongly
recommend that all Gitaly nodes use solid-state drives (SSDs). These SSDs
@@ -1325,36 +1631,21 @@ adjusted to greater or lesser values depending on the scale of your
environment's workload. If you're running the environment on a Cloud provider,
refer to their documentation about how to configure IOPS correctly.
-Be sure to note the following items:
+Gitaly servers must not be exposed to the public internet, as Gitaly's network
+traffic is unencrypted by default. The use of a firewall is highly recommended
+to restrict access to the Gitaly server. Another option is to
+[use TLS](#gitaly-cluster-tls-support).
-- The GitLab Rails application shards repositories into
- [repository storage paths](../repository_storage_paths.md).
-- A Gitaly server can host one or more storage paths.
-- A GitLab server can use one or more Gitaly server nodes.
-- Gitaly addresses must be specified to be correctly resolvable for all Gitaly
- clients.
-- Gitaly servers must not be exposed to the public internet, as Gitaly's network
- traffic is unencrypted by default. The use of a firewall is highly recommended
- to restrict access to the Gitaly server. Another option is to
- [use TLS](#gitaly-tls-support).
+For configuring Gitaly you should note the following:
-NOTE:
-The token referred to throughout the Gitaly documentation is an arbitrary
-password selected by the administrator. This token is unrelated to tokens
-created for the GitLab API or other similar web API tokens.
-
-This section describes how to configure two Gitaly servers, with the following
-IPs and domain names:
-
-- `10.6.0.91`: Gitaly 1 (`gitaly1.internal`)
-- `10.6.0.92`: Gitaly 2 (`gitaly2.internal`)
+- `git_data_dirs` should be configured to reflect the storage path for the specific Gitaly node
+- `auth_token` should be the same as `praefect_internal_token`
-Assumptions about your servers include having the secret token be `gitalysecret`,
-and that your GitLab installation has three repository storages:
+The following IPs will be used as an example:
-- `default` on Gitaly 1
-- `storage1` on Gitaly 1
-- `storage2` on Gitaly 2
+- `10.6.0.91`: Gitaly 1
+- `10.6.0.92`: Gitaly 2
+- `10.6.0.93`: Gitaly 3
On each node:
@@ -1364,21 +1655,9 @@ On each node:
1. Edit the Gitaly server node's `/etc/gitlab/gitlab.rb` file to configure
storage paths, enable the network listener, and to configure the token:
- <!--
- updates to following example must also be made at
- https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/advanced/external-gitaly/external-omnibus-gitaly.md#configure-omnibus-gitlab
- -->
-
```ruby
# /etc/gitlab/gitlab.rb
- # Gitaly and GitLab use two shared secrets for authentication, one to authenticate gRPC requests
- # to Gitaly, and a second for authentication callbacks from GitLab-Shell to the GitLab internal API.
- # The following two values must be the same as their respective values
- # of the GitLab Rails application setup
- gitaly['auth_token'] = 'gitalysecret'
- gitlab_shell['secret_token'] = 'shellsecret'
-
# Avoid running unnecessary services on the Gitaly server
postgresql['enable'] = false
redis['enable'] = false
@@ -1407,36 +1686,42 @@ On each node:
# firewalls to restrict access to this address/port.
# Comment out following line if you only want to support TLS connections
gitaly['listen_addr'] = "0.0.0.0:8075"
+
+ # Gitaly Auth Token
+ # Should be the same as praefect_internal_token
+ gitaly['auth_token'] = '<praefect_internal_token>'
```
1. Append the following to `/etc/gitlab/gitlab.rb` for each respective server:
- - On `gitaly1.internal`:
+ - On Gitaly node 1:
```ruby
git_data_dirs({
- 'default' => {
- 'path' => '/var/opt/gitlab/git-data'
- },
- 'storage1' => {
- 'path' => '/mnt/gitlab/git-data'
- },
+ "gitaly-1" => {
+ "path" => "/var/opt/gitlab/git-data"
+ }
})
```
- - On `gitaly2.internal`:
+ - On Gitaly node 2:
```ruby
git_data_dirs({
- 'storage2' => {
- 'path' => '/mnt/gitlab/git-data'
- },
+ "gitaly-2" => {
+ "path" => "/var/opt/gitlab/git-data"
+ }
})
```
- <!--
- updates to following example must also be made at
- https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/advanced/external-gitaly/external-omnibus-gitaly.md#configure-omnibus-gitlab
- -->
+ - On Gitaly node 3:
+
+ ```ruby
+ git_data_dirs({
+ "gitaly-3" => {
+ "path" => "/var/opt/gitlab/git-data"
+ }
+ })
+ ```
1. Copy the `/etc/gitlab/gitlab-secrets.json` file from your Consul server, and
then replace the file of the same name on this server. If that file isn't on
@@ -1444,34 +1729,44 @@ On each node:
1. Save the file, and then [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-### Gitaly TLS support
+### Gitaly Cluster TLS support
-Gitaly supports TLS encryption. To be able to communicate
-with a Gitaly instance that listens for secure connections you will need to use `tls://` URL
-scheme in the `gitaly_address` of the corresponding storage entry in the GitLab configuration.
+Praefect supports TLS encryption. To communicate with a Praefect instance that listens
+for secure connections, you must:
-You will need to bring your own certificates as this isn't provided automatically.
-The certificate, or its certificate authority, must be installed on all Gitaly
-nodes (including the Gitaly node using the certificate) and on all client nodes
-that communicate with it following the procedure described in
-[GitLab custom certificate configuration](https://docs.gitlab.com/omnibus/settings/ssl.html#install-custom-public-certificates).
+- Use a `tls://` URL scheme in the `gitaly_address` of the corresponding storage entry
+ in the GitLab configuration.
+- Bring your own certificates because this isn't provided automatically. The certificate
+ corresponding to each Praefect server must be installed on that Praefect server.
-NOTE:
-The self-signed certificate must specify the address you use to access the
-Gitaly server. If you are addressing the Gitaly server by a hostname, you can
-either use the Common Name field for this, or add it as a Subject Alternative
-Name. If you are addressing the Gitaly server by its IP address, you must add it
-as a Subject Alternative Name to the certificate.
-[gRPC does not support using an IP address as Common Name in a certificate](https://github.com/grpc/grpc/issues/2691).
+Additionally the certificate, or its certificate authority, must be installed on all Gitaly servers
+and on all Praefect clients that communicate with it following the procedure described in
+[GitLab custom certificate configuration](https://docs.gitlab.com/omnibus/settings/ssl.html#install-custom-public-certificates) (and repeated below).
+
+Note the following:
-It's possible to configure Gitaly servers with both an unencrypted listening
-address (`listen_addr`) and an encrypted listening address (`tls_listen_addr`)
-at the same time. This allows you to do a gradual transition from unencrypted to
-encrypted traffic, if necessary.
+- The certificate must specify the address you use to access the Praefect server. If
+ addressing the Praefect server by:
-To configure Gitaly with TLS:
+ - Hostname, you can either use the Common Name field for this, or add it as a Subject
+ Alternative Name.
+ - IP address, you must add it as a Subject Alternative Name to the certificate.
-1. Create the `/etc/gitlab/ssl` directory and copy your key and certificate there:
+- You can configure Praefect servers with both an unencrypted listening address
+ `listen_addr` and an encrypted listening address `tls_listen_addr` at the same time.
+ This allows you to do a gradual transition from unencrypted to encrypted traffic, if
+ necessary.
+
+- The Internal Load Balancer will also access to the certificates and need to be configured
+ to allow for TLS passthrough.
+ Refer to the load balancers documentation on how to configure this.
+
+To configure Praefect with TLS:
+
+1. Create certificates for Praefect servers.
+
+1. On the Praefect servers, create the `/etc/gitlab/ssl` directory and copy your key
+ and certificate there:
```shell
sudo mkdir -p /etc/gitlab/ssl
@@ -1480,27 +1775,34 @@ To configure Gitaly with TLS:
sudo chmod 644 key.pem cert.pem
```
-1. Copy the cert to `/etc/gitlab/trusted-certs` so Gitaly will trust the cert when
- calling into itself:
+1. Edit `/etc/gitlab/gitlab.rb` and add:
- ```shell
- sudo cp /etc/gitlab/ssl/cert.pem /etc/gitlab/trusted-certs/
+ ```ruby
+ praefect['tls_listen_addr'] = "0.0.0.0:3305"
+ praefect['certificate_path'] = "/etc/gitlab/ssl/cert.pem"
+ praefect['key_path'] = "/etc/gitlab/ssl/key.pem"
```
-1. Edit `/etc/gitlab/gitlab.rb` and add:
+1. Save the file and [reconfigure](../restart_gitlab.md#omnibus-gitlab-reconfigure).
- <!--
- updates to following example must also be made at
- https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/advanced/external-gitaly/external-omnibus-gitaly.md#configure-omnibus-gitlab
- -->
+1. On the Praefect clients (including each Gitaly server), copy the certificates,
+ or their certificate authority, into `/etc/gitlab/trusted-certs`:
- ```ruby
- gitaly['tls_listen_addr'] = "0.0.0.0:9999"
- gitaly['certificate_path'] = "/etc/gitlab/ssl/cert.pem"
- gitaly['key_path'] = "/etc/gitlab/ssl/key.pem"
+ ```shell
+ sudo cp cert.pem /etc/gitlab/trusted-certs/
```
-1. Delete `gitaly['listen_addr']` to allow only encrypted connections.
+1. On the Praefect clients (except Gitaly servers), edit `git_data_dirs` in
+ `/etc/gitlab/gitlab.rb` as follows:
+
+ ```ruby
+ git_data_dirs({
+ "default" => {
+ "gitaly_address" => 'tls://LOAD_BALANCER_SERVER_ADDRESS:2305',
+ "gitaly_token" => 'PRAEFECT_EXTERNAL_TOKEN'
+ }
+ })
+ ```
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
@@ -1587,12 +1889,15 @@ To configure the Sidekiq nodes, on each one:
### Gitaly ###
#######################################
+ # git_data_dirs get configured for the Praefect virtual storage
+ # Address is Internal Load Balancer for Praefect
+ # Token is praefect_external_token
git_data_dirs({
- 'default' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage1' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage2' => { 'gitaly_address' => 'tcp://gitaly2.internal:8075' },
+ "default" => {
+ "gitaly_address" => "tcp://10.6.0.40:2305", # internal load balancer IP
+ "gitaly_token" => '<praefect_external_token>'
+ }
})
- gitlab_rails['gitaly_token'] = 'YOUR_TOKEN'
#######################################
### Postgres ###
@@ -1624,7 +1929,7 @@ To configure the Sidekiq nodes, on each one:
node_exporter['listen_address'] = '0.0.0.0:9100'
# Rails Status for prometheus
- gitlab_rails['monitoring_whitelist'] = ['10.6.0.121/32', '127.0.0.0/8']
+ gitlab_rails['monitoring_whitelist'] = ['10.6.0.151/32', '127.0.0.0/8']
#############################
### Object storage ###
@@ -1637,13 +1942,13 @@ To configure the Sidekiq nodes, on each one:
'google_project' => '<gcp-project-name>',
'google_json_key_location' => '<path-to-gcp-service-account-key>'
}
- gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-bucket-name>"
+ gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-artifacts-bucket-name>"
+ gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-external-diffs-bucket-name>"
+ gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-lfs-bucket-name>"
+ gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-uploads-bucket-name>"
+ gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-packages-bucket-name>"
+ gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-dependency-proxy-bucket-name>"
+ gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-terraform-state-bucket-name>"
```
1. Copy the `/etc/gitlab/gitlab-secrets.json` file from your Consul server, and replace
@@ -1671,6 +1976,8 @@ The following IPs will be used as an example:
- `10.6.0.111`: GitLab application 1
- `10.6.0.112`: GitLab application 2
- `10.6.0.113`: GitLab application 3
+- `10.6.0.114`: GitLab application 4
+- `10.6.0.115`: GitLab application 5
On each node perform the following:
@@ -1690,17 +1997,14 @@ On each node perform the following:
```ruby
external_url 'https://gitlab.example.com'
- # Gitaly and GitLab use two shared secrets for authentication, one to authenticate gRPC requests
- # to Gitaly, and a second for authentication callbacks from GitLab-Shell to the GitLab internal API.
- # The following two values must be the same as their respective values
- # of the Gitaly setup
- gitlab_rails['gitaly_token'] = 'gitalysecret'
- gitlab_shell['secret_token'] = 'shellsecret'
-
+ # git_data_dirs get configured for the Praefect virtual storage
+ # Address is Internal Load Balancer for Praefect
+ # Token is praefect_external_token
git_data_dirs({
- 'default' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage1' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage2' => { 'gitaly_address' => 'tcp://gitaly2.internal:8075' },
+ "default" => {
+ "gitaly_address" => "tcp://10.6.0.40:2305", # internal load balancer IP
+ "gitaly_token" => '<praefect_external_token>'
+ }
})
## Disable components that will not be on the GitLab application server
@@ -1755,8 +2059,8 @@ On each node perform the following:
# Add the monitoring node's IP address to the monitoring whitelist and allow it to
# scrape the NGINX metrics
- gitlab_rails['monitoring_whitelist'] = ['10.6.0.121/32', '127.0.0.0/8']
- nginx['status']['options']['allow'] = ['10.6.0.121/32', '127.0.0.0/8']
+ gitlab_rails['monitoring_whitelist'] = ['10.6.0.151/32', '127.0.0.0/8']
+ nginx['status']['options']['allow'] = ['10.6.0.151/32', '127.0.0.0/8']
#############################
### Object storage ###
@@ -1769,24 +2073,25 @@ On each node perform the following:
'google_project' => '<gcp-project-name>',
'google_json_key_location' => '<path-to-gcp-service-account-key>'
}
- gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-bucket-name>"
+ gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-artifacts-bucket-name>"
+ gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-external-diffs-bucket-name>"
+ gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-lfs-bucket-name>"
+ gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-uploads-bucket-name>"
+ gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-packages-bucket-name>"
+ gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-dependency-proxy-bucket-name>"
+ gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-terraform-state-bucket-name>"
```
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-1. If you're using [Gitaly with TLS support](#gitaly-tls-support), make sure the
+1. If you're using [Gitaly with TLS support](#gitaly-cluster-tls-support), make sure the
`git_data_dirs` entry is configured with `tls` instead of `tcp`:
```ruby
git_data_dirs({
- 'default' => { 'gitaly_address' => 'tls://gitaly1.internal:9999' },
- 'storage1' => { 'gitaly_address' => 'tls://gitaly1.internal:9999' },
- 'storage2' => { 'gitaly_address' => 'tls://gitaly2.internal:9999' },
+ "default" => {
+ "gitaly_address" => "tls://10.6.0.40:2305", # internal load balancer IP
+ "gitaly_token" => '<praefect_external_token>'
+ }
})
```
@@ -1891,7 +2196,7 @@ running [Prometheus](../monitoring/prometheus/index.md) and
The following IP will be used as an example:
-- `10.6.0.121`: Prometheus
+- `10.6.0.151`: Prometheus
To configure the Monitoring node:
@@ -2002,20 +2307,9 @@ on what features you intend to use:
| [Terraform state files](../terraform_state.md#using-object-storage) | Yes |
Using separate buckets for each data type is the recommended approach for GitLab.
-
-A limitation of our configuration is that each use of object storage is separately configured.
-[We have an issue for improving this](https://gitlab.com/gitlab-org/gitlab/-/issues/23345)
-and easily using one bucket with separate folders is one improvement that this might bring.
-
-There is at least one specific issue with using the same bucket:
-when GitLab is deployed with the Helm chart restore from backup
-[will not properly function](https://docs.gitlab.com/charts/advanced/external-object-storage/#lfs-artifacts-uploads-packages-external-diffs-pseudonymizer)
-unless separate buckets are used.
-
-One risk of using a single bucket would be if your organization decided to
-migrate GitLab to the Helm deployment in the future. GitLab would run, but the situation with
-backups might not be realized until the organization had a critical requirement for the backups to
-work.
+This ensures there are no collisions across the various types of data GitLab stores.
+There are plans to [enable the use of a single bucket](https://gitlab.com/gitlab-org/gitlab/-/issues/292958)
+in the future.
<div align="right">
<a type="button" class="btn btn-default" href="#setup-components">
@@ -2023,7 +2317,7 @@ work.
</a>
</div>
-## Configure Advanced Search **(PREMIUM SELF)**
+## Configure Advanced Search
You can leverage Elasticsearch and [enable Advanced Search](../../integration/elasticsearch.md)
for faster, more advanced code search across your entire GitLab instance.
@@ -2058,13 +2352,3 @@ as soon as possible.
Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
</a>
</div>
-
-## Troubleshooting
-
-See the [troubleshooting documentation](troubleshooting.md).
-
-<div align="right">
- <a type="button" class="btn btn-default" href="#setup-components">
- Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
- </a>
-</div>
diff --git a/doc/administration/reference_architectures/2k_users.md b/doc/administration/reference_architectures/2k_users.md
index 9ad6054104a..fc0afbff194 100644
--- a/doc/administration/reference_architectures/2k_users.md
+++ b/doc/administration/reference_architectures/2k_users.md
@@ -668,13 +668,13 @@ On each node perform the following:
'google_project' => '<gcp-project-name>',
'google_json_key_location' => '<path-to-gcp-service-account-key>'
}
- gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-bucket-name>"
+ gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-artifacts-bucket-name>"
+ gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-external-diffs-bucket-name>"
+ gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-lfs-bucket-name>"
+ gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-uploads-bucket-name>"
+ gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-packages-bucket-name>"
+ gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-dependency-proxy-bucket-name>"
+ gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-terraform-state-bucket-name>"
## Uncomment and edit the following options if you have set up NFS
##
@@ -920,18 +920,9 @@ on what features you intend to use:
| [Terraform state files](../terraform_state.md#using-object-storage) | Yes |
Using separate buckets for each data type is the recommended approach for GitLab.
-
-A limitation of our configuration is that each use of object storage is
-separately configured. We have an [issue](https://gitlab.com/gitlab-org/gitlab/-/issues/23345)
-for improving this, which would allow for one bucket with separate folders.
-
-Using a single bucket when GitLab is deployed with the Helm chart causes
-restoring from a backup to
-[not function properly](https://docs.gitlab.com/charts/advanced/external-object-storage/#lfs-artifacts-uploads-packages-external-diffs-pseudonymizer).
-Although you may not be using a Helm deployment right now, if you migrate
-GitLab to a Helm deployment later, GitLab would still work, but you may not
-realize backups aren't working correctly until a critical requirement for
-functioning backups is encountered.
+This ensures there are no collisions across the various types of data GitLab stores.
+There are plans to [enable the use of a single bucket](https://gitlab.com/gitlab-org/gitlab/-/issues/292958)
+in the future.
<div align="right">
<a type="button" class="btn btn-default" href="#setup-components">
@@ -975,13 +966,3 @@ as soon as possible.
Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
</a>
</div>
-
-## Troubleshooting
-
-See the [troubleshooting documentation](troubleshooting.md).
-
-<div align="right">
- <a type="button" class="btn btn-default" href="#setup-components">
- Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
- </a>
-</div>
diff --git a/doc/administration/reference_architectures/3k_users.md b/doc/administration/reference_architectures/3k_users.md
index 175c4318d78..7f7777455c2 100644
--- a/doc/administration/reference_architectures/3k_users.md
+++ b/doc/administration/reference_architectures/3k_users.md
@@ -7,91 +7,121 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Reference architecture: up to 3,000 users **(PREMIUM SELF)**
-This page describes GitLab reference architecture for up to 3,000 users.
-It is designed to help your organization achieve a
-highly-available GitLab deployment. If you do not have the expertise or need to
-maintain a highly-available environment, you can have a simpler and less
-costly-to-operate environment by using the
-[2,000-user reference architecture](2k_users.md).
-If you have fewer than 3,000 users and still want a highly-available GitLab deployment,
-you should still use this reference architecture but scale down the node sizes.
+This GitLab reference architecture can help you deploy GitLab to up to 3,000
+users, and then maintain uptime and access for those users. You can also use
+this architecture to provide improved GitLab uptime and availability for fewer
+than 3,000 users. For fewer users, reduce the stated node sizes as needed.
+
+If maintining a high level of uptime for your GitLab environment isn't a
+requirement, or if you don't have the expertise to maintain this sort of
+environment, we recommend using the [2,000-user reference architecture](2k_users.md)
+for your GitLab installation.
For a full list of reference architectures, see
[Available reference architectures](index.md#available-reference-architectures).
> - **Supported users (approximate):** 3,000
-> - **High Availability:** Yes
+> - **High Availability:** Yes, although [Praefect](#configure-praefect-postgresql) needs a third-party PostgreSQL solution
> - **Test requests per second (RPS) rates:** API: 60 RPS, Web: 6 RPS, Git (Pull): 6 RPS, Git (Push): 1 RPS
| Service | Nodes | Configuration | GCP | AWS | Azure |
|--------------------------------------------|-------------|-----------------------|----------------|-------------|---------|
-| External load balancing node | 1 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | `c5.large` | F2s v2 |
-| Redis | 3 | 2 vCPU, 7.5 GB memory | n1-standard-2 | `m5.large` | D2s v3 |
-| Consul + Sentinel | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | `c5.large` | F2s v2 |
-| PostgreSQL | 3 | 2 vCPU, 7.5 GB memory | n1-standard-2 | `m5.large` | D2s v3 |
-| PgBouncer | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | `c5.large` | F2s v2 |
-| Internal load balancing node | 1 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | `c5.large` | F2s v2 |
-| Gitaly | 2 (minimum) | 4 vCPU, 15 GB memory | n1-standard-4 | `m5.xlarge` | D4s v3 |
-| Sidekiq | 4 | 2 vCPU, 7.5 GB memory | n1-standard-2 | `m5.large` | D2s v3 |
-| GitLab Rails | 3 | 8 vCPU, 7.2 GB memory | n1-highcpu-8 | `c5.2xlarge` | F8s v2 |
-| Monitoring node | 1 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | `c5.large` | F2s v2 |
+| External load balancing node | 1 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
+| Redis | 3 | 2 vCPU, 7.5 GB memory | n1-standard-2 | m5.large | D2s v3 |
+| Consul + Sentinel | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
+| PostgreSQL | 3 | 2 vCPU, 7.5 GB memory | n1-standard-2 | m5.large | D2s v3 |
+| PgBouncer | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
+| Internal load balancing node | 1 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
+| Gitaly | 3 | 4 vCPU, 15 GB memory | n1-standard-4 | m5.xlarge | D4s v3 |
+| Praefect | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
+| Praefect PostgreSQL | 1+* | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
+| Sidekiq | 4 | 2 vCPU, 7.5 GB memory | n1-standard-2 | m5.large | D2s v3 |
+| GitLab Rails | 3 | 8 vCPU, 7.2 GB memory | n1-highcpu-8 | c5.2xlarge | F8s v2 |
+| Monitoring node | 1 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
| Object storage | n/a | n/a | n/a | n/a | n/a |
-| NFS server (optional, not recommended) | 1 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | `c5.xlarge` | F4s v2 |
-
-```mermaid
-stateDiagram-v2
- [*] --> LoadBalancer
- LoadBalancer --> ApplicationServer
-
- ApplicationServer --> BackgroundJobs
- ApplicationServer --> Gitaly
- ApplicationServer --> Redis
- ApplicationServer --> PgBouncer
- PgBouncer --> Database
- ApplicationServer --> ObjectStorage
- BackgroundJobs --> ObjectStorage
-
- ApplicationMonitoring -->ApplicationServer
- ApplicationMonitoring -->Redis
- ApplicationMonitoring -->PgBouncer
- ApplicationMonitoring -->Database
- ApplicationMonitoring -->BackgroundJobs
-
- state Database {
- "PG_Primary_Node"
- "PG_Secondary_Node_1..2"
- }
- state Redis {
- "R_Primary_Node"
- "R_Replica_Node_1..2"
- "R_Consul/Sentinel_1..3"
- }
-
- state Gitaly {
- "Gitaly_1..2"
- }
-
- state BackgroundJobs {
- "Sidekiq_1..4"
- }
-
- state ApplicationServer {
- "GitLab_Rails_1..3"
- }
-
- state LoadBalancer {
- "LoadBalancer_1"
- }
-
- state ApplicationMonitoring {
- "Prometheus"
- "Grafana"
- }
-
- state PgBouncer {
- "Internal_Load_Balancer"
- "PgBouncer_1..3"
- }
+| NFS server (optional, not recommended) | 1 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | c5.xlarge | F4s v2 |
+
+```plantuml
+@startuml 3k
+card "**External Load Balancer**" as elb #6a9be7
+card "**Internal Load Balancer**" as ilb #9370DB
+
+together {
+ collections "**GitLab Rails** x3" as gitlab #32CD32
+ collections "**Sidekiq** x4" as sidekiq #ff8dd1
+}
+
+together {
+ card "**Prometheus + Grafana**" as monitor #7FFFD4
+ collections "**Consul** x3" as consul #e76a9b
+}
+
+card "Gitaly Cluster" as gitaly_cluster {
+ collections "**Praefect** x3" as praefect #FF8C00
+ collections "**Gitaly** x3" as gitaly #FF8C00
+ card "**Praefect PostgreSQL***\n//Non fault-tolerant//" as praefect_postgres #FF8C00
+
+ praefect -[#FF8C00]-> gitaly
+ praefect -[#FF8C00]> praefect_postgres
+}
+
+card "Database" as database {
+ collections "**PGBouncer** x3" as pgbouncer #4EA7FF
+ card "**PostgreSQL** (Primary)" as postgres_primary #4EA7FF
+ collections "**PostgreSQL** (Secondary) x2" as postgres_secondary #4EA7FF
+
+ pgbouncer -[#4EA7FF]-> postgres_primary
+ postgres_primary .[#4EA7FF]> postgres_secondary
+}
+
+card "redis" as redis {
+ collections "**Redis Persistent** x3" as redis_persistent #FF6347
+ collections "**Redis Cache** x3" as redis_cache #FF6347
+ collections "**Redis Persistent Sentinel** x3" as redis_persistent_sentinel #FF6347
+ collections "**Redis Cache Sentinel** x3"as redis_cache_sentinel #FF6347
+
+ redis_persistent <.[#FF6347]- redis_persistent_sentinel
+ redis_cache <.[#FF6347]- redis_cache_sentinel
+}
+
+cloud "**Object Storage**" as object_storage #white
+
+elb -[#6a9be7]-> gitlab
+elb -[#6a9be7]--> monitor
+
+gitlab -[#32CD32]> sidekiq
+gitlab -[#32CD32]--> ilb
+gitlab -[#32CD32]-> object_storage
+gitlab -[#32CD32]---> redis
+gitlab -[hidden]-> monitor
+gitlab -[hidden]-> consul
+
+sidekiq -[#ff8dd1]--> ilb
+sidekiq -[#ff8dd1]-> object_storage
+sidekiq -[#ff8dd1]---> redis
+sidekiq -[hidden]-> monitor
+sidekiq -[hidden]-> consul
+
+ilb -[#9370DB]-> gitaly_cluster
+ilb -[#9370DB]-> database
+
+consul .[#e76a9b]u-> gitlab
+consul .[#e76a9b]u-> sidekiq
+consul .[#e76a9b]> monitor
+consul .[#e76a9b]-> database
+consul .[#e76a9b]-> gitaly_cluster
+consul .[#e76a9b,norank]--> redis
+
+monitor .[#7FFFD4]u-> gitlab
+monitor .[#7FFFD4]u-> sidekiq
+monitor .[#7FFFD4]> consul
+monitor .[#7FFFD4]-> database
+monitor .[#7FFFD4]-> gitaly_cluster
+monitor .[#7FFFD4,norank]--> redis
+monitor .[#7FFFD4]> ilb
+monitor .[#7FFFD4,norank]u--> elb
+
+@enduml
```
The Google Cloud Platform (GCP) architectures were built and tested using the
@@ -106,19 +136,30 @@ uploads, or artifacts), using an [object storage service](#configure-the-object-
is recommended instead of using NFS. Using an object storage service also
doesn't require you to provision and maintain a node.
+[Praefect requires its own database server](../gitaly/praefect.md#postgresql),
+and a third-party PostgreSQL database solution is required to achieve full
+high availability. Although we hope to offer a built-in solution for these
+restrictions in the future, you can set up a non-HA PostgreSQL server by using
+Omnibus GitLab (which the previous specifications reflect). Refer to the
+following issues for more information:
+
+- [`omnibus-gitlab#5919`](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5919)
+- [`gitaly#3398`](https://gitlab.com/gitlab-org/gitaly/-/issues/3398)
+
## Setup components
To set up GitLab and its components to accommodate up to 3,000 users:
-1. [Configure the external load balancing node](#configure-the-external-load-balancer)
+1. [Configure the external load balancer](#configure-the-external-load-balancer)
to handle the load balancing of the GitLab application services nodes.
+1. [Configure the internal load balancer](#configure-the-internal-load-balancer).
+ to handle the load balancing of GitLab application internal connections.
1. [Configure Redis](#configure-redis).
1. [Configure Consul and Sentinel](#configure-consul-and-sentinel).
1. [Configure PostgreSQL](#configure-postgresql), the database for GitLab.
1. [Configure PgBouncer](#configure-pgbouncer).
-1. [Configure the internal load balancing node](#configure-the-internal-load-balancer).
-1. [Configure Gitaly](#configure-gitaly),
- which provides access to the Git repositories.
+1. [Configure Gitaly Cluster](#configure-gitaly-cluster),
+ provides access to the Git repositories.
1. [Configure Sidekiq](#configure-sidekiq).
1. [Configure the main GitLab Rails application](#configure-gitlab-rails)
to run Puma/Unicorn, Workhorse, GitLab Shell, and to serve all frontend
@@ -155,6 +196,11 @@ The following list includes descriptions of each server and its assigned IP:
- `10.6.0.20`: Internal Load Balancer
- `10.6.0.51`: Gitaly 1
- `10.6.0.52`: Gitaly 2
+- `10.6.0.93`: Gitaly 3
+- `10.6.0.131`: Praefect 1
+- `10.6.0.132`: Praefect 2
+- `10.6.0.133`: Praefect 3
+- `10.6.0.141`: Praefect PostgreSQL 1 (non HA)
- `10.6.0.71`: Sidekiq 1
- `10.6.0.72`: Sidekiq 2
- `10.6.0.73`: Sidekiq 3
@@ -285,6 +331,71 @@ Configure DNS for an alternate SSH hostname such as `altssh.gitlab.example.com`.
</a>
</div>
+## Configure the internal load balancer
+
+The Internal Load Balancer is used to balance any internal connections the GitLab environment requires
+such as connections to [PgBouncer](#configure-pgbouncer) and [Praefect](#configure-praefect) (Gitaly Cluster).
+
+Note that it's a separate node from the External Load Balancer and shouldn't have any access externally.
+
+The following IP will be used as an example:
+
+- `10.6.0.40`: Internal Load Balancer
+
+Here's how you could do it with [HAProxy](https://www.haproxy.org/):
+
+```plaintext
+global
+ log /dev/log local0
+ log localhost local1 notice
+ log stdout format raw local0
+
+defaults
+ log global
+ default-server inter 10s fall 3 rise 2
+ balance leastconn
+
+frontend internal-pgbouncer-tcp-in
+ bind *:6432
+ mode tcp
+ option tcplog
+
+ default_backend pgbouncer
+
+frontend internal-praefect-tcp-in
+ bind *:2305
+ mode tcp
+ option tcplog
+ option clitcpka
+
+ default_backend praefect
+
+backend pgbouncer
+ mode tcp
+ option tcp-check
+
+ server pgbouncer1 10.6.0.21:6432 check
+ server pgbouncer2 10.6.0.22:6432 check
+ server pgbouncer3 10.6.0.23:6432 check
+
+backend praefect
+ mode tcp
+ option tcp-check
+ option srvtcpka
+
+ server praefect1 10.6.0.131:2305 check
+ server praefect2 10.6.0.132:2305 check
+ server praefect3 10.6.0.133:2305 check
+```
+
+Refer to your preferred Load Balancer's documentation for further guidance.
+
+<div align="right">
+ <a type="button" class="btn btn-default" href="#setup-components">
+ Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
+ </a>
+</div>
+
## Configure Redis
Using [Redis](https://redis.io/) in scalable environment is possible using a **Primary** x **Replica**
@@ -925,45 +1036,96 @@ The following IPs will be used as an example:
</a>
</div>
-### Configure the internal load balancer
+## Configure Gitaly Cluster
-If you're running more than one PgBouncer node as recommended, then at this time you'll need to set
-up a TCP internal load balancer to serve each correctly.
+[Gitaly Cluster](../gitaly/praefect.md) is a GitLab provided and recommended fault tolerant solution for storing Git repositories.
+In this configuration, every Git repository is stored on every Gitaly node in the cluster, with one being designated the primary, and failover occurs automatically if the primary node goes down.
-The following IP will be used as an example:
+The recommended cluster setup includes the following components:
-- `10.6.0.20`: Internal Load Balancer
+- 3 Gitaly nodes: Replicated storage of Git repositories.
+- 3 Praefect nodes: Router and transaction manager for Gitaly Cluster.
+- 1 Praefect PostgreSQL node: Database server for Praefect. A third-party solution
+ is required for Praefect database connections to be made highly available.
+- 1 load balancer: A load balancer is required for Praefect. The
+ [internal load balancer](#configure-the-internal-load-balancer) will be used.
-Here's how you could do it with [HAProxy](https://www.haproxy.org/):
+This section will detail how to configure the recommended standard setup in order.
+For more advanced setups refer to the [standalone Gitaly Cluster documentation](../gitaly/praefect.md).
-```plaintext
-global
- log /dev/log local0
- log localhost local1 notice
- log stdout format raw local0
+### Configure Praefect PostgreSQL
-defaults
- log global
- default-server inter 10s fall 3 rise 2
- balance leastconn
+Praefect, the routing and transaction manager for Gitaly Cluster, requires its own database server to store data on Gitaly Cluster status.
-frontend internal-pgbouncer-tcp-in
- bind *:6432
- mode tcp
- option tcplog
+If you want to have a highly available setup, Praefect requires a third-party PostgreSQL database.
+A built-in solution is being [worked on](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5919).
- default_backend pgbouncer
+#### Praefect non-HA PostgreSQL standalone using Omnibus GitLab
-backend pgbouncer
- mode tcp
- option tcp-check
+The following IPs will be used as an example:
- server pgbouncer1 10.6.0.21:6432 check
- server pgbouncer2 10.6.0.22:6432 check
- server pgbouncer3 10.6.0.23:6432 check
-```
+- `10.6.0.141`: Praefect PostgreSQL
-Refer to your preferred Load Balancer's documentation for further guidance.
+First, make sure to [install](https://about.gitlab.com/install/)
+the Linux GitLab package in the Praefect PostgreSQL node. Following the steps,
+install the necessary dependencies from step 1, and add the
+GitLab package repository from step 2. When installing GitLab
+in the second step, do not supply the `EXTERNAL_URL` value.
+
+1. SSH in to the Praefect PostgreSQL node.
+1. Create a strong password to be used for the Praefect PostgreSQL user. Take note of this password as `<praefect_postgresql_password>`.
+1. Generate the password hash for the Praefect PostgreSQL username/password pair. This assumes you will use the default
+ username of `praefect` (recommended). The command will request the password `<praefect_postgresql_password>`
+ and confirmation. Use the value that is output by this command in the next
+ step as the value of `<praefect_postgresql_password_hash>`:
+
+ ```shell
+ sudo gitlab-ctl pg-password-md5 praefect
+ ```
+
+1. Edit `/etc/gitlab/gitlab.rb` replacing values noted in the `# START user configuration` section:
+
+ ```ruby
+ # Disable all components except PostgreSQL and Consul
+ roles ['postgres_role']
+ repmgr['enable'] = false
+ patroni['enable'] = false
+
+ # PostgreSQL configuration
+ postgresql['listen_address'] = '0.0.0.0'
+ postgresql['max_connections'] = 200
+
+ gitlab_rails['auto_migrate'] = false
+
+ # 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
+ #
+ # Replace PRAEFECT_POSTGRESQL_PASSWORD_HASH with a generated md5 value
+ postgresql['sql_user_password'] = "<praefect_postgresql_password_hash>"
+
+ # Replace XXX.XXX.XXX.XXX/YY with Network Address
+ postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24)
+
+ # Set the network addresses that the exporters will listen on for monitoring
+ node_exporter['listen_address'] = '0.0.0.0:9100'
+ postgres_exporter['listen_address'] = '0.0.0.0:9187'
+
+ ## 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),
+ }
+ #
+ # END user configuration
+ ```
+
+1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
+1. Follow the [post configuration](#praefect-postgresql-post-configuration).
<div align="right">
<a type="button" class="btn btn-default" href="#setup-components">
@@ -971,19 +1133,186 @@ Refer to your preferred Load Balancer's documentation for further guidance.
</a>
</div>
-## Configure Gitaly
+#### Praefect HA PostgreSQL third-party solution
-NOTE:
-[Gitaly Cluster](../gitaly/praefect.md) support
-for the Reference Architectures is being
-worked on as a [collaborative effort](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/1) between the Quality Engineering and Gitaly teams. When this component has been verified
-some Architecture specs will likely change as a result to support the new
-and improved designed.
+[As noted](#configure-praefect-postgresql), a third-party PostgreSQL solution for
+Praefect's database is recommended if aiming for full High Availability.
+
+There are many third-party solutions for PostgreSQL HA. The solution selected must have the following to work with Praefect:
+
+- A static IP for all connections that doesn't change on failover.
+- [`LISTEN`](https://www.postgresql.org/docs/12/sql-listen.html) SQL functionality must be supported.
+
+Examples of the above could include [Google's Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) or [Amazon RDS](https://aws.amazon.com/rds/).
+
+Once the database is set up, follow the [post configuration](#praefect-postgresql-post-configuration).
+
+#### Praefect PostgreSQL post-configuration
+
+After the Praefect PostgreSQL server has been set up, you'll then need to configure the user and database for Praefect to use.
+
+We recommend the user be named `praefect` and the database `praefect_production`, and these can be configured as standard in PostgreSQL.
+The password for the user is the same as the one you configured earlier as `<praefect_postgresql_password>`.
+
+This is how this would work with a Omnibus GitLab PostgreSQL setup:
+
+1. SSH in to the Praefect PostgreSQL node.
+1. Connect to the PostgreSQL server with administrative access.
+ The `gitlab-psql` user should be used here for this as it's added by default in Omnibus.
+ The database `template1` is used because it is created by default on all PostgreSQL servers.
+
+ ```shell
+ /opt/gitlab/embedded/bin/psql -U gitlab-psql -d template1 -h POSTGRESQL_SERVER_ADDRESS
+ ```
+
+1. Create the new user `praefect`, replacing `<praefect_postgresql_password>`:
+
+ ```shell
+ CREATE ROLE praefect WITH LOGIN CREATEDB PASSWORD <praefect_postgresql_password>;
+ ```
+
+1. Reconnect to the PostgreSQL server, this time as the `praefect` user:
+
+ ```shell
+ /opt/gitlab/embedded/bin/psql -U praefect -d template1 -h POSTGRESQL_SERVER_ADDRESS
+ ```
+
+1. Create a new database `praefect_production`:
+
+ ```shell
+ CREATE DATABASE praefect_production WITH ENCODING=UTF8;
+ ```
+
+<div align="right">
+ <a type="button" class="btn btn-default" href="#setup-components">
+ Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
+ </a>
+</div>
+
+### Configure Praefect
+
+Praefect is the router and transaction manager for Gitaly Cluster and all connections to Gitaly go through
+it. This section details how to configure it.
+
+Praefect requires several secret tokens to secure communications across the Cluster:
+
+- `<praefect_external_token>`: Used for repositories hosted on your Gitaly cluster and can only be accessed by Gitaly clients that carry this token.
+- `<praefect_internal_token>`: Used for replication traffic inside your Gitaly cluster. This is distinct from `praefect_external_token` because Gitaly clients must not be able to access internal nodes of the Praefect cluster directly; that could lead to data loss.
+- `<praefect_postgresql_password>`: The Praefect PostgreSQL password defined in the previous section is also required as part of this setup.
+
+Gitaly Cluster nodes are configured in Praefect via a `virtual storage`. Each storage contains
+the details of each Gitaly node that makes up the cluster. Each storage is also given a name
+and this name is used in several areas of the config. In this guide, the name of the storage will be
+`default`. Also, this guide is geared towards new installs, if upgrading an existing environment
+to use Gitaly Cluster, you may need to use a different name.
+Refer to the [Praefect documentation](../gitaly/praefect.md#praefect) for more info.
+
+The following IPs will be used as an example:
+
+- `10.6.0.131`: Praefect 1
+- `10.6.0.132`: Praefect 2
+- `10.6.0.133`: Praefect 3
+
+To configure the Praefect nodes, on each one:
+
+1. SSH in to the Praefect server.
+1. [Download and install](https://about.gitlab.com/install/) the Omnibus GitLab
+ package of your choice. Be sure to follow _only_ installation steps 1 and 2
+ on the page.
+1. Edit the `/etc/gitlab/gitlab.rb` file to configure Praefect:
+
+ ```ruby
+ # Avoid running unnecessary services on the Gitaly server
+ postgresql['enable'] = false
+ redis['enable'] = false
+ nginx['enable'] = false
+ puma['enable'] = false
+ unicorn['enable'] = false
+ sidekiq['enable'] = false
+ gitlab_workhorse['enable'] = false
+ grafana['enable'] = false
+
+ # If you run a separate monitoring node you can disable these services
+ alertmanager['enable'] = false
+ prometheus['enable'] = false
+
+ # Praefect Configuration
+ praefect['enable'] = true
+ praefect['listen_addr'] = '0.0.0.0:2305'
+
+ gitlab_rails['rake_cache_clear'] = false
+ gitlab_rails['auto_migrate'] = false
+
+ # 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
+ #
+
+ # Praefect External Token
+ # This is needed by clients outside the cluster (like GitLab Shell) to communicate with the Praefect cluster
+ praefect['auth_token'] = '<praefect_external_token>'
+
+ # Praefect Database Settings
+ praefect['database_host'] = '10.6.0.141'
+ praefect['database_port'] = 5432
+ # `no_proxy` settings must always be a direct connection for caching
+ praefect['database_host_no_proxy'] = '10.6.0.141'
+ praefect['database_port_no_proxy'] = 5432
+ praefect['database_dbname'] = 'praefect_production'
+ praefect['database_user'] = 'praefect'
+ praefect['database_password'] = '<praefect_postgresql_password>'
+
+ # Praefect Virtual Storage config
+ # Name of storage hash must match storage name in git_data_dirs on GitLab
+ # server ('praefect') and in git_data_dirs on Gitaly nodes ('gitaly-1')
+ praefect['virtual_storages'] = {
+ 'default' => {
+ 'gitaly-1' => {
+ 'address' => 'tcp://10.6.0.91:8075',
+ 'token' => '<praefect_internal_token>',
+ 'primary' => true
+ },
+ 'gitaly-2' => {
+ 'address' => 'tcp://10.6.0.92:8075',
+ 'token' => '<praefect_internal_token>'
+ },
+ 'gitaly-3' => {
+ 'address' => 'tcp://10.6.0.93:8075',
+ 'token' => '<praefect_internal_token>'
+ },
+ }
+ }
+
+ # Set the network addresses that the exporters will listen on for monitoring
+ node_exporter['listen_address'] = '0.0.0.0:9100'
+ praefect['prometheus_listen_addr'] = '0.0.0.0:9652'
+
+ ## 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),
+ }
+ #
+ # END user configuration
+ ```
+
+ 1. Copy the `/etc/gitlab/gitlab-secrets.json` file from your Consul server, and
+ then replace the file of the same name on this server. If that file isn't on
+ this server, add the file from your Consul server to this server.
-[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 5 TB of data. Depending on your
-repository storage requirements, you may require additional Gitaly server nodes.
+ 1. Save the file, and then [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+
+### 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.
Due to Gitaly having notable input and output requirements, we strongly
recommend that all Gitaly nodes use solid-state drives (SSDs). These SSDs
@@ -994,36 +1323,21 @@ adjusted to greater or lesser values depending on the scale of your
environment's workload. If you're running the environment on a Cloud provider,
refer to their documentation about how to configure IOPS correctly.
-Be sure to note the following items:
-
-- The GitLab Rails application shards repositories into
- [repository storage paths](../repository_storage_paths.md).
-- A Gitaly server can host one or more storage paths.
-- A GitLab server can use one or more Gitaly server nodes.
-- Gitaly addresses must be specified to be correctly resolvable for all Gitaly
- clients.
-- Gitaly servers must not be exposed to the public internet, as Gitaly's network
- traffic is unencrypted by default. The use of a firewall is highly recommended
- to restrict access to the Gitaly server. Another option is to
- [use TLS](#gitaly-tls-support).
-
-NOTE:
-The token referred to throughout the Gitaly documentation is an arbitrary
-password selected by the administrator. This token is unrelated to tokens
-created for the GitLab API or other similar web API tokens.
+Gitaly servers must not be exposed to the public internet, as Gitaly's network
+traffic is unencrypted by default. The use of a firewall is highly recommended
+to restrict access to the Gitaly server. Another option is to
+[use TLS](#gitaly-cluster-tls-support).
-This section describes how to configure two Gitaly servers, with the following
-IPs and domain names:
+For configuring Gitaly you should note the following:
-- `10.6.0.51`: Gitaly 1 (`gitaly1.internal`)
-- `10.6.0.52`: Gitaly 2 (`gitaly2.internal`)
+- `git_data_dirs` should be configured to reflect the storage path for the specific Gitaly node
+- `auth_token` should be the same as `praefect_internal_token`
-Assumptions about your servers include having the secret token be `gitalysecret`,
-and that your GitLab installation has three repository storages:
+The following IPs will be used as an example:
-- `default` on Gitaly 1
-- `storage1` on Gitaly 1
-- `storage2` on Gitaly 2
+- `10.6.0.91`: Gitaly 1
+- `10.6.0.92`: Gitaly 2
+- `10.6.0.93`: Gitaly 3
On each node:
@@ -1033,21 +1347,9 @@ On each node:
1. Edit the Gitaly server node's `/etc/gitlab/gitlab.rb` file to configure
storage paths, enable the network listener, and to configure the token:
- <!--
- updates to following example must also be made at
- https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/advanced/external-gitaly/external-omnibus-gitaly.md#configure-omnibus-gitlab
- -->
-
```ruby
# /etc/gitlab/gitlab.rb
- # Gitaly and GitLab use two shared secrets for authentication, one to authenticate gRPC requests
- # to Gitaly, and a second for authentication callbacks from GitLab-Shell to the GitLab internal API.
- # The following two values must be the same as their respective values
- # of the GitLab Rails application setup
- gitaly['auth_token'] = 'gitalysecret'
- gitlab_shell['secret_token'] = 'shellsecret'
-
# Avoid running unnecessary services on the Gitaly server
postgresql['enable'] = false
redis['enable'] = false
@@ -1057,7 +1359,6 @@ On each node:
sidekiq['enable'] = false
gitlab_workhorse['enable'] = false
grafana['enable'] = false
- gitlab_exporter['enable'] = false
# If you run a separate monitoring node you can disable these services
alertmanager['enable'] = false
@@ -1078,101 +1379,86 @@ On each node:
# Comment out following line if you only want to support TLS connections
gitaly['listen_addr'] = "0.0.0.0:8075"
- ## Enable service discovery for Prometheus
- consul['enable'] = true
- consul['monitoring_service_discovery'] = true
-
- # Set the network addresses that the exporters will listen on for monitoring
- gitaly['prometheus_listen_addr'] = "0.0.0.0:9236"
- node_exporter['listen_address'] = '0.0.0.0:9100'
- gitlab_rails['prometheus_address'] = '10.6.0.81:9090'
-
- ## 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),
- }
+ # Gitaly Auth Token
+ # Should be the same as praefect_internal_token
+ gitaly['auth_token'] = '<praefect_internal_token>'
```
1. Append the following to `/etc/gitlab/gitlab.rb` for each respective server:
- - On `gitaly1.internal`:
+ - On Gitaly node 1:
```ruby
git_data_dirs({
- 'default' => {
- 'path' => '/var/opt/gitlab/git-data'
- },
- 'storage1' => {
- 'path' => '/mnt/gitlab/git-data'
- },
+ "gitaly-1" => {
+ "path" => "/var/opt/gitlab/git-data"
+ }
})
```
- - On `gitaly2.internal`:
+ - On Gitaly node 2:
```ruby
git_data_dirs({
- 'storage2' => {
- 'path' => '/mnt/gitlab/git-data'
- },
+ "gitaly-2" => {
+ "path" => "/var/opt/gitlab/git-data"
+ }
+ })
+ ```
+
+ - On Gitaly node 3:
+
+ ```ruby
+ git_data_dirs({
+ "gitaly-3" => {
+ "path" => "/var/opt/gitlab/git-data"
+ }
})
```
- <!--
- updates to following example must also be made at
- https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/advanced/external-gitaly/external-omnibus-gitaly.md#configure-omnibus-gitlab
- -->
+1. Copy the `/etc/gitlab/gitlab-secrets.json` file from your Consul server, and
+ then replace the file of the same name on this server. If that file isn't on
+ this server, add the file from your Consul server to this server.
1. Save the file, and then [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-1. Confirm that Gitaly can perform callbacks to the internal API:
- ```shell
- sudo /opt/gitlab/embedded/bin/gitaly-hooks check /var/opt/gitlab/gitaly/config.toml
- ```
+### Gitaly Cluster TLS support
-1. Verify the GitLab services are running:
+Praefect supports TLS encryption. To communicate with a Praefect instance that listens
+for secure connections, you must:
- ```shell
- sudo gitlab-ctl status
- ```
+- Use a `tls://` URL scheme in the `gitaly_address` of the corresponding storage entry
+ in the GitLab configuration.
+- Bring your own certificates because this isn't provided automatically. The certificate
+ corresponding to each Praefect server must be installed on that Praefect server.
- The output should be similar to the following:
+Additionally the certificate, or its certificate authority, must be installed on all Gitaly servers
+and on all Praefect clients that communicate with it following the procedure described in
+[GitLab custom certificate configuration](https://docs.gitlab.com/omnibus/settings/ssl.html#install-custom-public-certificates) (and repeated below).
- ```plaintext
- run: consul: (pid 30339) 77006s; run: log: (pid 29878) 77020s
- run: gitaly: (pid 30351) 77005s; run: log: (pid 29660) 77040s
- run: logrotate: (pid 7760) 3213s; run: log: (pid 29782) 77032s
- run: node-exporter: (pid 30378) 77004s; run: log: (pid 29812) 77026s
- ```
+Note the following:
-### Gitaly TLS support
+- The certificate must specify the address you use to access the Praefect server. If
+ addressing the Praefect server by:
-Gitaly supports TLS encryption. To be able to communicate
-with a Gitaly instance that listens for secure connections you will need to use `tls://` URL
-scheme in the `gitaly_address` of the corresponding storage entry in the GitLab configuration.
+ - Hostname, you can either use the Common Name field for this, or add it as a Subject
+ Alternative Name.
+ - IP address, you must add it as a Subject Alternative Name to the certificate.
-You will need to bring your own certificates as this isn't provided automatically.
-The certificate, or its certificate authority, must be installed on all Gitaly
-nodes (including the Gitaly node using the certificate) and on all client nodes
-that communicate with it following the procedure described in
-[GitLab custom certificate configuration](https://docs.gitlab.com/omnibus/settings/ssl.html#install-custom-public-certificates).
+- You can configure Praefect servers with both an unencrypted listening address
+ `listen_addr` and an encrypted listening address `tls_listen_addr` at the same time.
+ This allows you to do a gradual transition from unencrypted to encrypted traffic, if
+ necessary.
-NOTE:
-The self-signed certificate must specify the address you use to access the
-Gitaly server. If you are addressing the Gitaly server by a hostname, you can
-either use the Common Name field for this, or add it as a Subject Alternative
-Name. If you are addressing the Gitaly server by its IP address, you must add it
-as a Subject Alternative Name to the certificate.
-[gRPC does not support using an IP address as Common Name in a certificate](https://github.com/grpc/grpc/issues/2691).
+- The Internal Load Balancer will also access to the certificates and need to be configured
+ to allow for TLS passthrough.
+ Refer to the load balancers documentation on how to configure this.
-It's possible to configure Gitaly servers with both an unencrypted listening
-address (`listen_addr`) and an encrypted listening address (`tls_listen_addr`)
-at the same time. This allows you to do a gradual transition from unencrypted to
-encrypted traffic, if necessary.
+To configure Praefect with TLS:
-To configure Gitaly with TLS:
+1. Create certificates for Praefect servers.
-1. Create the `/etc/gitlab/ssl` directory and copy your key and certificate there:
+1. On the Praefect servers, create the `/etc/gitlab/ssl` directory and copy your key
+ and certificate there:
```shell
sudo mkdir -p /etc/gitlab/ssl
@@ -1181,27 +1467,35 @@ To configure Gitaly with TLS:
sudo chmod 644 key.pem cert.pem
```
-1. Copy the cert to `/etc/gitlab/trusted-certs` so Gitaly will trust the cert when
- calling into itself:
+1. Edit `/etc/gitlab/gitlab.rb` and add:
- ```shell
- sudo cp /etc/gitlab/ssl/cert.pem /etc/gitlab/trusted-certs/
+ ```ruby
+ praefect['tls_listen_addr'] = "0.0.0.0:3305"
+ praefect['certificate_path'] = "/etc/gitlab/ssl/cert.pem"
+ praefect['key_path'] = "/etc/gitlab/ssl/key.pem"
```
-1. Edit `/etc/gitlab/gitlab.rb` and add:
+1. Save the file and [reconfigure](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+
+1. On the Praefect clients (including each Gitaly server), copy the certificates,
+ or their certificate authority, into `/etc/gitlab/trusted-certs`:
- <!--
- updates to following example must also be made at
- https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/advanced/external-gitaly/external-omnibus-gitaly.md#configure-omnibus-gitlab
- -->
+ ```shell
+ sudo cp cert.pem /etc/gitlab/trusted-certs/
+ ```
+
+1. On the Praefect clients (except Gitaly servers), edit `git_data_dirs` in
+ `/etc/gitlab/gitlab.rb` as follows:
```ruby
- gitaly['tls_listen_addr'] = "0.0.0.0:9999"
- gitaly['certificate_path'] = "/etc/gitlab/ssl/cert.pem"
- gitaly['key_path'] = "/etc/gitlab/ssl/key.pem"
+ git_data_dirs({
+ "default" => {
+ "gitaly_address" => 'tls://LOAD_BALANCER_SERVER_ADDRESS:2305',
+ "gitaly_token" => 'PRAEFECT_EXTERNAL_TOKEN'
+ }
+ })
```
-1. Delete `gitaly['listen_addr']` to allow only encrypted connections.
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
<div align="right">
@@ -1272,17 +1566,20 @@ To configure the Sidekiq nodes, one each one:
### Gitaly ###
#######################################
+ # git_data_dirs get configured for the Praefect virtual storage
+ # Address is Internal Load Balancer for Praefect
+ # Token is praefect_external_token
git_data_dirs({
- 'default' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage1' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage2' => { 'gitaly_address' => 'tcp://gitaly2.internal:8075' },
+ "default" => {
+ "gitaly_address" => "tcp://10.6.0.40:2305", # internal load balancer IP
+ "gitaly_token" => '<praefect_external_token>'
+ }
})
- gitlab_rails['gitaly_token'] = 'YOUR_TOKEN'
#######################################
### Postgres ###
#######################################
- gitlab_rails['db_host'] = '10.6.0.20' # internal load balancer IP
+ gitlab_rails['db_host'] = '10.6.0.40' # internal load balancer IP
gitlab_rails['db_port'] = 6432
gitlab_rails['db_password'] = '<postgresql_user_password>'
gitlab_rails['db_adapter'] = 'postgresql'
@@ -1322,13 +1619,14 @@ To configure the Sidekiq nodes, one each one:
'google_project' => '<gcp-project-name>',
'google_json_key_location' => '<path-to-gcp-service-account-key>'
}
- gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-bucket-name>"
+ gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-artifacts-bucket-name>"
+ gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-external-diffs-bucket-name>"
+ gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-lfs-bucket-name>"
+ gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-uploads-bucket-name>"
+ gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-packages-bucket-name>"
+ gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-dependency-proxy-bucket-name>"
+ gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-terraform-state-bucket-name>"
+
```
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
@@ -1400,17 +1698,14 @@ On each node perform the following:
```ruby
external_url 'https://gitlab.example.com'
- # Gitaly and GitLab use two shared secrets for authentication, one to authenticate gRPC requests
- # to Gitaly, and a second for authentication callbacks from GitLab-Shell to the GitLab internal API.
- # The following two values must be the same as their respective values
- # of the Gitaly setup
- gitlab_rails['gitaly_token'] = 'gitalysecret'
- gitlab_shell['secret_token'] = 'shellsecret'
-
+ # git_data_dirs get configured for the Praefect virtual storage
+ # Address is Interal Load Balancer for Praefect
+ # Token is praefect_external_token
git_data_dirs({
- 'default' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage1' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage2' => { 'gitaly_address' => 'tcp://gitaly2.internal:8075' },
+ "default" => {
+ "gitaly_address" => "tcp://10.6.0.40:2305", # internal load balancer IP
+ "gitaly_token" => '<praefect_external_token>'
+ }
})
## Disable components that will not be on the GitLab application server
@@ -1489,23 +1784,24 @@ On each node perform the following:
'google_project' => '<gcp-project-name>',
'google_json_key_location' => '<path-to-gcp-service-account-key>'
}
- gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-bucket-name>"
+ gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-artifacts-bucket-name>"
+ gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-external-diffs-bucket-name>"
+ gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-lfs-bucket-name>"
+ gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-uploads-bucket-name>"
+ gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-packages-bucket-name>"
+ gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-dependency-proxy-bucket-name>"
+ gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-terraform-state-bucket-name>"
```
-1. If you're using [Gitaly with TLS support](#gitaly-tls-support), make sure the
+1. If you're using [Gitaly with TLS support](#gitaly-cluster-tls-support), make sure the
`git_data_dirs` entry is configured with `tls` instead of `tcp`:
```ruby
git_data_dirs({
- 'default' => { 'gitaly_address' => 'tls://gitaly1.internal:9999' },
- 'storage1' => { 'gitaly_address' => 'tls://gitaly1.internal:9999' },
- 'storage2' => { 'gitaly_address' => 'tls://gitaly2.internal:9999' },
+ "default" => {
+ "gitaly_address" => "tls://10.6.0.40:2305", # internal load balancer IP
+ "gitaly_token" => '<praefect_external_token>'
+ }
})
```
@@ -1697,20 +1993,9 @@ on what features you intend to use:
| [Terraform state files](../terraform_state.md#using-object-storage) | Yes |
Using separate buckets for each data type is the recommended approach for GitLab.
-
-A limitation of our configuration is that each use of object storage is separately configured.
-[We have an issue for improving this](https://gitlab.com/gitlab-org/gitlab/-/issues/23345)
-and easily using one bucket with separate folders is one improvement that this might bring.
-
-There is at least one specific issue with using the same bucket:
-when GitLab is deployed with the Helm chart restore from backup
-[will not properly function](https://docs.gitlab.com/charts/advanced/external-object-storage/#lfs-artifacts-uploads-packages-external-diffs-pseudonymizer)
-unless separate buckets are used.
-
-One risk of using a single bucket would be if your organization decided to
-migrate GitLab to the Helm deployment in the future. GitLab would run, but the situation with
-backups might not be realized until the organization had a critical requirement for the backups to
-work.
+This ensures there are no collisions across the various types of data GitLab stores.
+There are plans to [enable the use of a single bucket](https://gitlab.com/gitlab-org/gitlab/-/issues/292958)
+in the future.
<div align="right">
<a type="button" class="btn btn-default" href="#setup-components">
@@ -1718,7 +2003,7 @@ work.
</a>
</div>
-## Configure Advanced Search **(PREMIUM SELF)**
+## Configure Advanced Search
You can leverage Elasticsearch and [enable Advanced Search](../../integration/elasticsearch.md)
for faster, more advanced code search across your entire GitLab instance.
@@ -1753,13 +2038,3 @@ as soon as possible.
Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
</a>
</div>
-
-## Troubleshooting
-
-See the [troubleshooting documentation](troubleshooting.md).
-
-<div align="right">
- <a type="button" class="btn btn-default" href="#setup-components">
- Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
- </a>
-</div>
diff --git a/doc/administration/reference_architectures/50k_users.md b/doc/administration/reference_architectures/50k_users.md
index 0b22a2d3602..606701a4d83 100644
--- a/doc/administration/reference_architectures/50k_users.md
+++ b/doc/administration/reference_architectures/50k_users.md
@@ -12,100 +12,110 @@ full list of reference architectures, see
[Available reference architectures](index.md#available-reference-architectures).
> - **Supported users (approximate):** 50,000
-> - **High Availability:** Yes
+> - **High Availability:** Yes ([Praefect](#configure-praefect-postgresql) needs a third-party PostgreSQL solution for HA)
> - **Test requests per second (RPS) rates:** API: 1000 RPS, Web: 100 RPS, Git (Pull): 100 RPS, Git (Push): 20 RPS
| Service | Nodes | Configuration | GCP | AWS | Azure |
|-----------------------------------------|-------------|-------------------------|-----------------|--------------|----------|
-| External load balancing node | 1 | 8 vCPU, 7.2 GB memory | n1-highcpu-8 | `c5.2xlarge` | F8s v2 |
-| Consul | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | `c5.large` | F2s v2 |
-| PostgreSQL | 3 | 16 vCPU, 60 GB memory | n1-standard-16 | `m5.4xlarge` | D16s v3 |
-| PgBouncer | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | `c5.large` | F2s v2 |
-| Internal load balancing node | 1 | 8 vCPU, 7.2 GB memory | n1-highcpu-8 | `c5.2xlarge` | F8s v2 |
-| Redis - Cache | 3 | 4 vCPU, 15 GB memory | n1-standard-4 | `m5.xlarge` | D4s v3 |
-| Redis - Queues / Shared State | 3 | 4 vCPU, 15 GB memory | n1-standard-4 | `m5.xlarge` | D4s v3 |
-| Redis Sentinel - Cache | 3 | 1 vCPU, 1.7 GB memory | g1-small | `t3.small` | B1MS |
-| Redis Sentinel - Queues / Shared State | 3 | 1 vCPU, 1.7 GB memory | g1-small | `t3.small` | B1MS |
-| Gitaly | 2 (minimum) | 64 vCPU, 240 GB memory | n1-standard-64 | `m5.16xlarge` | D64s v3 |
-| Sidekiq | 4 | 4 vCPU, 15 GB memory | n1-standard-4 | `m5.xlarge` | D4s v3 |
-| GitLab Rails | 12 | 32 vCPU, 28.8 GB memory | n1-highcpu-32 | `c5.9xlarge` | F32s v2 |
-| Monitoring node | 1 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | `c5.xlarge` | F4s v2 |
+| External load balancing node | 1 | 8 vCPU, 7.2 GB memory | n1-highcpu-8 | c5.2xlarge | F8s v2 |
+| Consul | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
+| PostgreSQL | 3 | 32 vCPU, 120 GB memory | n1-standard-32 | m5.8xlarge | D32s v3 |
+| PgBouncer | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
+| Internal load balancing node | 1 | 8 vCPU, 7.2 GB memory | n1-highcpu-8 | c5.2xlarge | F8s v2 |
+| Redis - Cache | 3 | 4 vCPU, 15 GB memory | n1-standard-4 | m5.xlarge | D4s v3 |
+| Redis - Queues / Shared State | 3 | 4 vCPU, 15 GB memory | n1-standard-4 | m5.xlarge | D4s v3 |
+| Redis Sentinel - Cache | 3 | 1 vCPU, 1.7 GB memory | g1-small | t3.small | B1MS |
+| Redis Sentinel - Queues / Shared State | 3 | 1 vCPU, 1.7 GB memory | g1-small | t3.small | B1MS |
+| Gitaly | 3 | 64 vCPU, 240 GB memory | n1-standard-64 | m5.16xlarge | D64s v3 |
+| Praefect | 3 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | c5.xlarge | F4s v2 |
+| Praefect PostgreSQL | 1+* | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
+| Sidekiq | 4 | 4 vCPU, 15 GB memory | n1-standard-4 | m5.xlarge | D4s v3 |
+| GitLab Rails | 12 | 32 vCPU, 28.8 GB memory | n1-highcpu-32 | c5.9xlarge | F32s v2 |
+| Monitoring node | 1 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | c5.xlarge | F4s v2 |
| Object storage | n/a | n/a | n/a | n/a | n/a |
-| NFS server | 1 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | `c5.xlarge` | F4s v2 |
-
-```mermaid
-stateDiagram-v2
- [*] --> LoadBalancer
- LoadBalancer --> ApplicationServer
-
- ApplicationServer --> BackgroundJobs
- ApplicationServer --> Gitaly
- ApplicationServer --> Redis_Cache
- ApplicationServer --> Redis_Queues
- ApplicationServer --> PgBouncer
- PgBouncer --> Database
- ApplicationServer --> ObjectStorage
- BackgroundJobs --> ObjectStorage
-
- ApplicationMonitoring -->ApplicationServer
- ApplicationMonitoring -->PgBouncer
- ApplicationMonitoring -->Database
- ApplicationMonitoring -->BackgroundJobs
-
- ApplicationServer --> Consul
-
- Consul --> Database
- Consul --> PgBouncer
- Redis_Cache --> Consul
- Redis_Queues --> Consul
- BackgroundJobs --> Consul
-
- state Consul {
- "Consul_1..3"
- }
-
- state Database {
- "PG_Primary_Node"
- "PG_Secondary_Node_1..2"
- }
-
- state Redis_Cache {
- "R_Cache_Primary_Node"
- "R_Cache_Replica_Node_1..2"
- "R_Cache_Sentinel_1..3"
- }
-
- state Redis_Queues {
- "R_Queues_Primary_Node"
- "R_Queues_Replica_Node_1..2"
- "R_Queues_Sentinel_1..3"
- }
-
- state Gitaly {
- "Gitaly_1..2"
- }
-
- state BackgroundJobs {
- "Sidekiq_1..4"
- }
-
- state ApplicationServer {
- "GitLab_Rails_1..12"
- }
-
- state LoadBalancer {
- "LoadBalancer_1"
- }
-
- state ApplicationMonitoring {
- "Prometheus"
- "Grafana"
- }
-
- state PgBouncer {
- "Internal_Load_Balancer"
- "PgBouncer_1..3"
- }
+| NFS server | 1 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | c5.xlarge | F4s v2 |
+
+```plantuml
+@startuml 50k
+card "**External Load Balancer**" as elb #6a9be7
+card "**Internal Load Balancer**" as ilb #9370DB
+
+together {
+ collections "**GitLab Rails** x12" as gitlab #32CD32
+ collections "**Sidekiq** x4" as sidekiq #ff8dd1
+}
+
+together {
+ card "**Prometheus + Grafana**" as monitor #7FFFD4
+ collections "**Consul** x3" as consul #e76a9b
+}
+
+card "Gitaly Cluster" as gitaly_cluster {
+ collections "**Praefect** x3" as praefect #FF8C00
+ collections "**Gitaly** x3" as gitaly #FF8C00
+ card "**Praefect PostgreSQL***\n//Non fault-tolerant//" as praefect_postgres #FF8C00
+
+ praefect -[#FF8C00]-> gitaly
+ praefect -[#FF8C00]> praefect_postgres
+}
+
+card "Database" as database {
+ collections "**PGBouncer** x3" as pgbouncer #4EA7FF
+ card "**PostgreSQL** (Primary)" as postgres_primary #4EA7FF
+ collections "**PostgreSQL** (Secondary) x2" as postgres_secondary #4EA7FF
+
+ pgbouncer -[#4EA7FF]-> postgres_primary
+ postgres_primary .[#4EA7FF]> postgres_secondary
+}
+
+card "redis" as redis {
+ collections "**Redis Persistent** x3" as redis_persistent #FF6347
+ collections "**Redis Cache** x3" as redis_cache #FF6347
+ collections "**Redis Persistent Sentinel** x3" as redis_persistent_sentinel #FF6347
+ collections "**Redis Cache Sentinel** x3"as redis_cache_sentinel #FF6347
+
+ redis_persistent <.[#FF6347]- redis_persistent_sentinel
+ redis_cache <.[#FF6347]- redis_cache_sentinel
+}
+
+cloud "**Object Storage**" as object_storage #white
+
+elb -[#6a9be7]-> gitlab
+elb -[#6a9be7]--> monitor
+
+gitlab -[#32CD32]> sidekiq
+gitlab -[#32CD32]--> ilb
+gitlab -[#32CD32]-> object_storage
+gitlab -[#32CD32]---> redis
+gitlab -[hidden]-> monitor
+gitlab -[hidden]-> consul
+
+sidekiq -[#ff8dd1]--> ilb
+sidekiq -[#ff8dd1]-> object_storage
+sidekiq -[#ff8dd1]---> redis
+sidekiq -[hidden]-> monitor
+sidekiq -[hidden]-> consul
+
+ilb -[#9370DB]-> gitaly_cluster
+ilb -[#9370DB]-> database
+
+consul .[#e76a9b]u-> gitlab
+consul .[#e76a9b]u-> sidekiq
+consul .[#e76a9b]> monitor
+consul .[#e76a9b]-> database
+consul .[#e76a9b]-> gitaly_cluster
+consul .[#e76a9b,norank]--> redis
+
+monitor .[#7FFFD4]u-> gitlab
+monitor .[#7FFFD4]u-> sidekiq
+monitor .[#7FFFD4]> consul
+monitor .[#7FFFD4]-> database
+monitor .[#7FFFD4]-> gitaly_cluster
+monitor .[#7FFFD4,norank]--> redis
+monitor .[#7FFFD4]> ilb
+monitor .[#7FFFD4,norank]u--> elb
+
+@enduml
```
The Google Cloud Platform (GCP) architectures were built and tested using the
@@ -120,19 +130,25 @@ uploads, or artifacts), using an [object storage service](#configure-the-object-
is recommended instead of using NFS. Using an object storage service also
doesn't require you to provision and maintain a node.
+It's also worth noting that at this time [Praefect requires its own database server](../gitaly/praefect.md#postgresql) and
+that to achieve full High Availability a third party PostgreSQL database solution will be required.
+We hope to offer a built in solutions for these restrictions in the future but in the meantime a non HA PostgreSQL server
+can be set up via Omnibus GitLab, which the above specs reflect. Refer to the following issues for more information: [`omnibus-gitlab#5919`](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5919) & [`gitaly#3398`](https://gitlab.com/gitlab-org/gitaly/-/issues/3398)
+
## Setup components
To set up GitLab and its components to accommodate up to 50,000 users:
-1. [Configure the external load balancing node](#configure-the-external-load-balancer)
+1. [Configure the external load balancer](#configure-the-external-load-balancer)
to handle the load balancing of the GitLab application services nodes.
+1. [Configure the internal load balancer](#configure-the-internal-load-balancer).
+ to handle the loa
1. [Configure Consul](#configure-consul).
1. [Configure PostgreSQL](#configure-postgresql), the database for GitLab.
1. [Configure PgBouncer](#configure-pgbouncer).
-1. [Configure the internal load balancing node](#configure-the-internal-load-balancer).
1. [Configure Redis](#configure-redis).
-1. [Configure Gitaly](#configure-gitaly),
- which provides access to the Git repositories.
+1. [Configure Gitaly Cluster](#configure-gitaly-cluster),
+ provides access to the Git repositories.
1. [Configure Sidekiq](#configure-sidekiq).
1. [Configure the main GitLab Rails application](#configure-gitlab-rails)
to run Puma/Unicorn, Workhorse, GitLab Shell, and to serve all frontend
@@ -178,6 +194,11 @@ The following list includes descriptions of each server and its assigned IP:
- `10.6.0.83`: Sentinel - Queues 3
- `10.6.0.91`: Gitaly 1
- `10.6.0.92`: Gitaly 2
+- `10.6.0.93`: Gitaly 3
+- `10.6.0.131`: Praefect 1
+- `10.6.0.132`: Praefect 2
+- `10.6.0.133`: Praefect 3
+- `10.6.0.141`: Praefect PostgreSQL 1 (non HA)
- `10.6.0.101`: Sidekiq 1
- `10.6.0.102`: Sidekiq 2
- `10.6.0.103`: Sidekiq 3
@@ -185,7 +206,16 @@ The following list includes descriptions of each server and its assigned IP:
- `10.6.0.111`: GitLab application 1
- `10.6.0.112`: GitLab application 2
- `10.6.0.113`: GitLab application 3
-- `10.6.0.121`: Prometheus
+- `10.6.0.114`: GitLab application 4
+- `10.6.0.115`: GitLab application 5
+- `10.6.0.116`: GitLab application 6
+- `10.6.0.117`: GitLab application 7
+- `10.6.0.118`: GitLab application 8
+- `10.6.0.119`: GitLab application 9
+- `10.6.0.120`: GitLab application 10
+- `10.6.0.121`: GitLab application 11
+- `10.6.0.122`: GitLab application 12
+- `10.6.0.151`: Prometheus
## Configure the external load balancer
@@ -308,6 +338,71 @@ Configure DNS for an alternate SSH hostname such as `altssh.gitlab.example.com`.
</a>
</div>
+## Configure the internal load balancer
+
+The Internal Load Balancer is used to balance any internal connections the GitLab environment requires
+such as connections to [PgBouncer](#configure-pgbouncer) and [Praefect](#configure-praefect) (Gitaly Cluster).
+
+Note that it's a separate node from the External Load Balancer and shouldn't have any access externally.
+
+The following IP will be used as an example:
+
+- `10.6.0.40`: Internal Load Balancer
+
+Here's how you could do it with [HAProxy](https://www.haproxy.org/):
+
+```plaintext
+global
+ log /dev/log local0
+ log localhost local1 notice
+ log stdout format raw local0
+
+defaults
+ log global
+ default-server inter 10s fall 3 rise 2
+ balance leastconn
+
+frontend internal-pgbouncer-tcp-in
+ bind *:6432
+ mode tcp
+ option tcplog
+
+ default_backend pgbouncer
+
+frontend internal-praefect-tcp-in
+ bind *:2305
+ mode tcp
+ option tcplog
+ option clitcpka
+
+ default_backend praefect
+
+backend pgbouncer
+ mode tcp
+ option tcp-check
+
+ server pgbouncer1 10.6.0.21:6432 check
+ server pgbouncer2 10.6.0.22:6432 check
+ server pgbouncer3 10.6.0.23:6432 check
+
+backend praefect
+ mode tcp
+ option tcp-check
+ option srvtcpka
+
+ server praefect1 10.6.0.131:2305 check
+ server praefect2 10.6.0.132:2305 check
+ server praefect3 10.6.0.133:2305 check
+```
+
+Refer to your preferred Load Balancer's documentation for further guidance.
+
+<div align="right">
+ <a type="button" class="btn btn-default" href="#setup-components">
+ Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
+ </a>
+</div>
+
## Configure Consul
The following IPs will be used as an example:
@@ -662,52 +757,6 @@ The following IPs will be used as an example:
</a>
</div>
-### Configure the internal load balancer
-
-If you're running more than one PgBouncer node as recommended, then at this time you'll need to set
-up a TCP internal load balancer to serve each correctly.
-
-The following IP will be used as an example:
-
-- `10.6.0.40`: Internal Load Balancer
-
-Here's how you could do it with [HAProxy](https://www.haproxy.org/):
-
-```plaintext
-global
- log /dev/log local0
- log localhost local1 notice
- log stdout format raw local0
-
-defaults
- log global
- default-server inter 10s fall 3 rise 2
- balance leastconn
-
-frontend internal-pgbouncer-tcp-in
- bind *:6432
- mode tcp
- option tcplog
-
- default_backend pgbouncer
-
-backend pgbouncer
- mode tcp
- option tcp-check
-
- server pgbouncer1 10.6.0.21:6432 check
- server pgbouncer2 10.6.0.22:6432 check
- server pgbouncer3 10.6.0.23:6432 check
-```
-
-Refer to your preferred Load Balancer's documentation for further guidance.
-
-<div align="right">
- <a type="button" class="btn btn-default" href="#setup-components">
- Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
- </a>
-</div>
-
## Configure Redis
Using [Redis](https://redis.io/) in scalable environment is possible using a **Primary** x **Replica**
@@ -1302,19 +1351,283 @@ To configure the Sentinel Queues server:
</a>
</div>
-## Configure Gitaly
+## Configure Gitaly Cluster
-NOTE:
-[Gitaly Cluster](../gitaly/praefect.md) support
-for the Reference Architectures is being
-worked on as a [collaborative effort](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/1) between the Quality Engineering and Gitaly teams. When this component has been verified
-some Architecture specs will likely change as a result to support the new
-and improved designed.
+[Gitaly Cluster](../gitaly/praefect.md) is a GitLab provided and recommended fault tolerant solution for storing Git repositories.
+In this configuration, every Git repository is stored on every Gitaly node in the cluster, with one being designated the primary, and failover occurs automatically if the primary node goes down.
+
+The recommended cluster setup includes the following components:
+
+- 3 Gitaly nodes: Replicated storage of Git repositories.
+- 3 Praefect nodes: Router and transaction manager for Gitaly Cluster.
+- 1 Praefect PostgreSQL node: Database server for Praefect. A third-party solution
+ is required for Praefect database connections to be made highly available.
+- 1 load balancer: A load balancer is required for Praefect. The
+ [internal load balancer](#configure-the-internal-load-balancer) will be used.
+
+This section will detail how to configure the recommended standard setup in order.
+For more advanced setups refer to the [standalone Gitaly Cluster documentation](../gitaly/praefect.md).
+
+### Configure Praefect PostgreSQL
+
+Praefect, the routing and transaction manager for Gitaly Cluster, requires its own database server to store data on Gitaly Cluster status.
+
+If you want to have a highly available setup, Praefect requires a third-party PostgreSQL database.
+A built-in solution is being [worked on](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5919).
+
+#### Praefect non-HA PostgreSQL standalone using Omnibus GitLab
+
+The following IPs will be used as an example:
+
+- `10.6.0.141`: Praefect PostgreSQL
+
+First, make sure to [install](https://about.gitlab.com/install/)
+the Linux GitLab package in the Praefect PostgreSQL node. Following the steps,
+install the necessary dependencies from step 1, and add the
+GitLab package repository from step 2. When installing GitLab
+in the second step, do not supply the `EXTERNAL_URL` value.
+
+1. SSH in to the Praefect PostgreSQL node.
+1. Create a strong password to be used for the Praefect PostgreSQL user. Take note of this password as `<praefect_postgresql_password>`.
+1. Generate the password hash for the Praefect PostgreSQL username/password pair. This assumes you will use the default
+ username of `praefect` (recommended). The command will request the password `<praefect_postgresql_password>`
+ and confirmation. Use the value that is output by this command in the next
+ step as the value of `<praefect_postgresql_password_hash>`:
+
+ ```shell
+ sudo gitlab-ctl pg-password-md5 praefect
+ ```
+
+1. Edit `/etc/gitlab/gitlab.rb` replacing values noted in the `# START user configuration` section:
+
+ ```ruby
+ # Disable all components except PostgreSQL and Consul
+ roles ['postgres_role']
+ repmgr['enable'] = false
+ patroni['enable'] = false
+
+ # PostgreSQL configuration
+ postgresql['listen_address'] = '0.0.0.0'
+ postgresql['max_connections'] = 200
+
+ gitlab_rails['auto_migrate'] = false
+
+ # 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
+ #
+ # Replace PRAEFECT_POSTGRESQL_PASSWORD_HASH with a generated md5 value
+ postgresql['sql_user_password'] = "<praefect_postgresql_password_hash>"
+
+ # Replace XXX.XXX.XXX.XXX/YY with Network Address
+ postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24)
+
+ # Set the network addresses that the exporters will listen on for monitoring
+ node_exporter['listen_address'] = '0.0.0.0:9100'
+ postgres_exporter['listen_address'] = '0.0.0.0:9187'
+
+ ## 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),
+ }
+ #
+ # END user configuration
+ ```
+
+1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
+1. Follow the [post configuration](#praefect-postgresql-post-configuration).
+
+<div align="right">
+ <a type="button" class="btn btn-default" href="#setup-components">
+ Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
+ </a>
+</div>
+
+#### Praefect HA PostgreSQL third-party solution
+
+[As noted](#configure-praefect-postgresql), a third-party PostgreSQL solution for
+Praefect's database is recommended if aiming for full High Availability.
+
+There are many third-party solutions for PostgreSQL HA. The solution selected must have the following to work with Praefect:
+
+- A static IP for all connections that doesn't change on failover.
+- [`LISTEN`](https://www.postgresql.org/docs/12/sql-listen.html) SQL functionality must be supported.
+
+Examples of the above could include [Google's Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) or [Amazon RDS](https://aws.amazon.com/rds/).
+
+Once the database is set up, follow the [post configuration](#praefect-postgresql-post-configuration).
+
+#### Praefect PostgreSQL post-configuration
+
+After the Praefect PostgreSQL server has been set up, you'll then need to configure the user and database for Praefect to use.
+
+We recommend the user be named `praefect` and the database `praefect_production`, and these can be configured as standard in PostgreSQL.
+The password for the user is the same as the one you configured earlier as `<praefect_postgresql_password>`.
-[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 5 TB of data. Depending on your
-repository storage requirements, you may require additional Gitaly server nodes.
+This is how this would work with a Omnibus GitLab PostgreSQL setup:
+
+1. SSH in to the Praefect PostgreSQL node.
+1. Connect to the PostgreSQL server with administrative access.
+ The `gitlab-psql` user should be used here for this as it's added by default in Omnibus.
+ The database `template1` is used because it is created by default on all PostgreSQL servers.
+
+ ```shell
+ /opt/gitlab/embedded/bin/psql -U gitlab-psql -d template1 -h POSTGRESQL_SERVER_ADDRESS
+ ```
+
+1. Create the new user `praefect`, replacing `<praefect_postgresql_password>`:
+
+ ```shell
+ CREATE ROLE praefect WITH LOGIN CREATEDB PASSWORD <praefect_postgresql_password>;
+ ```
+
+1. Reconnect to the PostgreSQL server, this time as the `praefect` user:
+
+ ```shell
+ /opt/gitlab/embedded/bin/psql -U praefect -d template1 -h POSTGRESQL_SERVER_ADDRESS
+ ```
+
+1. Create a new database `praefect_production`:
+
+ ```shell
+ CREATE DATABASE praefect_production WITH ENCODING=UTF8;
+ ```
+
+<div align="right">
+ <a type="button" class="btn btn-default" href="#setup-components">
+ Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
+ </a>
+</div>
+
+### Configure Praefect
+
+Praefect is the router and transaction manager for Gitaly Cluster and all connections to Gitaly go through
+it. This section details how to configure it.
+
+Praefect requires several secret tokens to secure communications across the Cluster:
+
+- `<praefect_external_token>`: Used for repositories hosted on your Gitaly cluster and can only be accessed by Gitaly clients that carry this token.
+- `<praefect_internal_token>`: Used for replication traffic inside your Gitaly cluster. This is distinct from `praefect_external_token` because Gitaly clients must not be able to access internal nodes of the Praefect cluster directly; that could lead to data loss.
+- `<praefect_postgresql_password>`: The Praefect PostgreSQL password defined in the previous section is also required as part of this setup.
+
+Gitaly Cluster nodes are configured in Praefect via a `virtual storage`. Each storage contains
+the details of each Gitaly node that makes up the cluster. Each storage is also given a name
+and this name is used in several areas of the config. In this guide, the name of the storage will be
+`default`. Also, this guide is geared towards new installs, if upgrading an existing environment
+to use Gitaly Cluster, you may need to use a different name.
+Refer to the [Praefect documentation](../gitaly/praefect.md#praefect) for more info.
+
+The following IPs will be used as an example:
+
+- `10.6.0.131`: Praefect 1
+- `10.6.0.132`: Praefect 2
+- `10.6.0.133`: Praefect 3
+
+To configure the Praefect nodes, on each one:
+
+1. SSH in to the Praefect server.
+1. [Download and install](https://about.gitlab.com/install/) the Omnibus GitLab
+ package of your choice. Be sure to follow _only_ installation steps 1 and 2
+ on the page.
+1. Edit the `/etc/gitlab/gitlab.rb` file to configure Praefect:
+
+ ```ruby
+ # Avoid running unnecessary services on the Gitaly server
+ postgresql['enable'] = false
+ redis['enable'] = false
+ nginx['enable'] = false
+ puma['enable'] = false
+ unicorn['enable'] = false
+ sidekiq['enable'] = false
+ gitlab_workhorse['enable'] = false
+ grafana['enable'] = false
+
+ # If you run a separate monitoring node you can disable these services
+ alertmanager['enable'] = false
+ prometheus['enable'] = false
+
+ # Praefect Configuration
+ praefect['enable'] = true
+ praefect['listen_addr'] = '0.0.0.0:2305'
+
+ gitlab_rails['rake_cache_clear'] = false
+ gitlab_rails['auto_migrate'] = false
+
+ # 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
+ #
+
+ # Praefect External Token
+ # This is needed by clients outside the cluster (like GitLab Shell) to communicate with the Praefect cluster
+ praefect['auth_token'] = '<praefect_external_token>'
+
+ # Praefect Database Settings
+ praefect['database_host'] = '10.6.0.141'
+ praefect['database_port'] = 5432
+ # `no_proxy` settings must always be a direct connection for caching
+ praefect['database_host_no_proxy'] = '10.6.0.141'
+ praefect['database_port_no_proxy'] = 5432
+ praefect['database_dbname'] = 'praefect_production'
+ praefect['database_user'] = 'praefect'
+ praefect['database_password'] = '<praefect_postgresql_password>'
+
+ # Praefect Virtual Storage config
+ # Name of storage hash must match storage name in git_data_dirs on GitLab
+ # server ('praefect') and in git_data_dirs on Gitaly nodes ('gitaly-1')
+ praefect['virtual_storages'] = {
+ 'default' => {
+ 'gitaly-1' => {
+ 'address' => 'tcp://10.6.0.91:8075',
+ 'token' => '<praefect_internal_token>',
+ 'primary' => true
+ },
+ 'gitaly-2' => {
+ 'address' => 'tcp://10.6.0.92:8075',
+ 'token' => '<praefect_internal_token>'
+ },
+ 'gitaly-3' => {
+ 'address' => 'tcp://10.6.0.93:8075',
+ 'token' => '<praefect_internal_token>'
+ },
+ }
+ }
+
+ # Set the network addresses that the exporters will listen on for monitoring
+ node_exporter['listen_address'] = '0.0.0.0:9100'
+ praefect['prometheus_listen_addr'] = '0.0.0.0:9652'
+
+ ## 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),
+ }
+ #
+ # END user configuration
+ ```
+
+ 1. Copy the `/etc/gitlab/gitlab-secrets.json` file from your Consul server, and
+ then replace the file of the same name on this server. If that file isn't on
+ this server, add the file from your Consul server to this server.
+
+ 1. Save the file, and then [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+
+### 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.
Due to Gitaly having notable input and output requirements, we strongly
recommend that all Gitaly nodes use solid-state drives (SSDs). These SSDs
@@ -1325,36 +1638,21 @@ adjusted to greater or lesser values depending on the scale of your
environment's workload. If you're running the environment on a Cloud provider,
refer to their documentation about how to configure IOPS correctly.
-Be sure to note the following items:
+Gitaly servers must not be exposed to the public internet, as Gitaly's network
+traffic is unencrypted by default. The use of a firewall is highly recommended
+to restrict access to the Gitaly server. Another option is to
+[use TLS](#gitaly-cluster-tls-support).
-- The GitLab Rails application shards repositories into
- [repository storage paths](../repository_storage_paths.md).
-- A Gitaly server can host one or more storage paths.
-- A GitLab server can use one or more Gitaly server nodes.
-- Gitaly addresses must be specified to be correctly resolvable for all Gitaly
- clients.
-- Gitaly servers must not be exposed to the public internet, as Gitaly's network
- traffic is unencrypted by default. The use of a firewall is highly recommended
- to restrict access to the Gitaly server. Another option is to
- [use TLS](#gitaly-tls-support).
+For configuring Gitaly you should note the following:
-NOTE:
-The token referred to throughout the Gitaly documentation is an arbitrary
-password selected by the administrator. This token is unrelated to tokens
-created for the GitLab API or other similar web API tokens.
-
-This section describes how to configure two Gitaly servers, with the following
-IPs and domain names:
-
-- `10.6.0.91`: Gitaly 1 (`gitaly1.internal`)
-- `10.6.0.92`: Gitaly 2 (`gitaly2.internal`)
+- `git_data_dirs` should be configured to reflect the storage path for the specific Gitaly node
+- `auth_token` should be the same as `praefect_internal_token`
-Assumptions about your servers include having the secret token be `gitalysecret`,
-and that your GitLab installation has three repository storages:
+The following IPs will be used as an example:
-- `default` on Gitaly 1
-- `storage1` on Gitaly 1
-- `storage2` on Gitaly 2
+- `10.6.0.91`: Gitaly 1
+- `10.6.0.92`: Gitaly 2
+- `10.6.0.93`: Gitaly 3
On each node:
@@ -1364,21 +1662,9 @@ On each node:
1. Edit the Gitaly server node's `/etc/gitlab/gitlab.rb` file to configure
storage paths, enable the network listener, and to configure the token:
- <!--
- updates to following example must also be made at
- https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/advanced/external-gitaly/external-omnibus-gitaly.md#configure-omnibus-gitlab
- -->
-
```ruby
# /etc/gitlab/gitlab.rb
- # Gitaly and GitLab use two shared secrets for authentication, one to authenticate gRPC requests
- # to Gitaly, and a second for authentication callbacks from GitLab-Shell to the GitLab internal API.
- # The following two values must be the same as their respective values
- # of the GitLab Rails application setup
- gitaly['auth_token'] = 'gitalysecret'
- gitlab_shell['secret_token'] = 'shellsecret'
-
# Avoid running unnecessary services on the Gitaly server
postgresql['enable'] = false
redis['enable'] = false
@@ -1407,36 +1693,42 @@ On each node:
# firewalls to restrict access to this address/port.
# Comment out following line if you only want to support TLS connections
gitaly['listen_addr'] = "0.0.0.0:8075"
+
+ # Gitaly Auth Token
+ # Should be the same as praefect_internal_token
+ gitaly['auth_token'] = '<praefect_internal_token>'
```
1. Append the following to `/etc/gitlab/gitlab.rb` for each respective server:
- - On `gitaly1.internal`:
+ - On Gitaly node 1:
```ruby
git_data_dirs({
- 'default' => {
- 'path' => '/var/opt/gitlab/git-data'
- },
- 'storage1' => {
- 'path' => '/mnt/gitlab/git-data'
- },
+ "gitaly-1" => {
+ "path" => "/var/opt/gitlab/git-data"
+ }
})
```
- - On `gitaly2.internal`:
+ - On Gitaly node 2:
```ruby
git_data_dirs({
- 'storage2' => {
- 'path' => '/mnt/gitlab/git-data'
- },
+ "gitaly-2" => {
+ "path" => "/var/opt/gitlab/git-data"
+ }
})
```
- <!--
- updates to following example must also be made at
- https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/advanced/external-gitaly/external-omnibus-gitaly.md#configure-omnibus-gitlab
- -->
+ - On Gitaly node 3:
+
+ ```ruby
+ git_data_dirs({
+ "gitaly-3" => {
+ "path" => "/var/opt/gitlab/git-data"
+ }
+ })
+ ```
1. Copy the `/etc/gitlab/gitlab-secrets.json` file from your Consul server, and
then replace the file of the same name on this server. If that file isn't on
@@ -1444,34 +1736,44 @@ On each node:
1. Save the file, and then [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-### Gitaly TLS support
+### Gitaly Cluster TLS support
-Gitaly supports TLS encryption. To be able to communicate
-with a Gitaly instance that listens for secure connections you will need to use `tls://` URL
-scheme in the `gitaly_address` of the corresponding storage entry in the GitLab configuration.
+Praefect supports TLS encryption. To communicate with a Praefect instance that listens
+for secure connections, you must:
-You will need to bring your own certificates as this isn't provided automatically.
-The certificate, or its certificate authority, must be installed on all Gitaly
-nodes (including the Gitaly node using the certificate) and on all client nodes
-that communicate with it following the procedure described in
-[GitLab custom certificate configuration](https://docs.gitlab.com/omnibus/settings/ssl.html#install-custom-public-certificates).
+- Use a `tls://` URL scheme in the `gitaly_address` of the corresponding storage entry
+ in the GitLab configuration.
+- Bring your own certificates because this isn't provided automatically. The certificate
+ corresponding to each Praefect server must be installed on that Praefect server.
-NOTE:
-The self-signed certificate must specify the address you use to access the
-Gitaly server. If you are addressing the Gitaly server by a hostname, you can
-either use the Common Name field for this, or add it as a Subject Alternative
-Name. If you are addressing the Gitaly server by its IP address, you must add it
-as a Subject Alternative Name to the certificate.
-[gRPC does not support using an IP address as Common Name in a certificate](https://github.com/grpc/grpc/issues/2691).
+Additionally the certificate, or its certificate authority, must be installed on all Gitaly servers
+and on all Praefect clients that communicate with it following the procedure described in
+[GitLab custom certificate configuration](https://docs.gitlab.com/omnibus/settings/ssl.html#install-custom-public-certificates) (and repeated below).
+
+Note the following:
-It's possible to configure Gitaly servers with both an unencrypted listening
-address (`listen_addr`) and an encrypted listening address (`tls_listen_addr`)
-at the same time. This allows you to do a gradual transition from unencrypted to
-encrypted traffic, if necessary.
+- The certificate must specify the address you use to access the Praefect server. If
+ addressing the Praefect server by:
-To configure Gitaly with TLS:
+ - Hostname, you can either use the Common Name field for this, or add it as a Subject
+ Alternative Name.
+ - IP address, you must add it as a Subject Alternative Name to the certificate.
-1. Create the `/etc/gitlab/ssl` directory and copy your key and certificate there:
+- You can configure Praefect servers with both an unencrypted listening address
+ `listen_addr` and an encrypted listening address `tls_listen_addr` at the same time.
+ This allows you to do a gradual transition from unencrypted to encrypted traffic, if
+ necessary.
+
+- The Internal Load Balancer will also access to the certificates and need to be configured
+ to allow for TLS passthrough.
+ Refer to the load balancers documentation on how to configure this.
+
+To configure Praefect with TLS:
+
+1. Create certificates for Praefect servers.
+
+1. On the Praefect servers, create the `/etc/gitlab/ssl` directory and copy your key
+ and certificate there:
```shell
sudo mkdir -p /etc/gitlab/ssl
@@ -1480,27 +1782,34 @@ To configure Gitaly with TLS:
sudo chmod 644 key.pem cert.pem
```
-1. Copy the cert to `/etc/gitlab/trusted-certs` so Gitaly will trust the cert when
- calling into itself:
+1. Edit `/etc/gitlab/gitlab.rb` and add:
- ```shell
- sudo cp /etc/gitlab/ssl/cert.pem /etc/gitlab/trusted-certs/
+ ```ruby
+ praefect['tls_listen_addr'] = "0.0.0.0:3305"
+ praefect['certificate_path'] = "/etc/gitlab/ssl/cert.pem"
+ praefect['key_path'] = "/etc/gitlab/ssl/key.pem"
```
-1. Edit `/etc/gitlab/gitlab.rb` and add:
+1. Save the file and [reconfigure](../restart_gitlab.md#omnibus-gitlab-reconfigure).
- <!--
- updates to following example must also be made at
- https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/advanced/external-gitaly/external-omnibus-gitaly.md#configure-omnibus-gitlab
- -->
+1. On the Praefect clients (including each Gitaly server), copy the certificates,
+ or their certificate authority, into `/etc/gitlab/trusted-certs`:
- ```ruby
- gitaly['tls_listen_addr'] = "0.0.0.0:9999"
- gitaly['certificate_path'] = "/etc/gitlab/ssl/cert.pem"
- gitaly['key_path'] = "/etc/gitlab/ssl/key.pem"
+ ```shell
+ sudo cp cert.pem /etc/gitlab/trusted-certs/
```
-1. Delete `gitaly['listen_addr']` to allow only encrypted connections.
+1. On the Praefect clients (except Gitaly servers), edit `git_data_dirs` in
+ `/etc/gitlab/gitlab.rb` as follows:
+
+ ```ruby
+ git_data_dirs({
+ "default" => {
+ "gitaly_address" => 'tls://LOAD_BALANCER_SERVER_ADDRESS:2305',
+ "gitaly_token" => 'PRAEFECT_EXTERNAL_TOKEN'
+ }
+ })
+ ```
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
@@ -1587,12 +1896,15 @@ To configure the Sidekiq nodes, on each one:
### Gitaly ###
#######################################
+ # git_data_dirs get configured for the Praefect virtual storage
+ # Address is Internal Load Balancer for Praefect
+ # Token is praefect_external_token
git_data_dirs({
- 'default' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage1' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage2' => { 'gitaly_address' => 'tcp://gitaly2.internal:8075' },
+ "default" => {
+ "gitaly_address" => "tcp://10.6.0.40:2305", # internal load balancer IP
+ "gitaly_token" => '<praefect_external_token>'
+ }
})
- gitlab_rails['gitaly_token'] = 'YOUR_TOKEN'
#######################################
### Postgres ###
@@ -1624,7 +1936,7 @@ To configure the Sidekiq nodes, on each one:
node_exporter['listen_address'] = '0.0.0.0:9100'
# Rails Status for prometheus
- gitlab_rails['monitoring_whitelist'] = ['10.6.0.121/32', '127.0.0.0/8']
+ gitlab_rails['monitoring_whitelist'] = ['10.6.0.151/32', '127.0.0.0/8']
#############################
### Object storage ###
@@ -1637,13 +1949,13 @@ To configure the Sidekiq nodes, on each one:
'google_project' => '<gcp-project-name>',
'google_json_key_location' => '<path-to-gcp-service-account-key>'
}
- gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-bucket-name>"
+ gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-artifacts-bucket-name>"
+ gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-external-diffs-bucket-name>"
+ gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-lfs-bucket-name>"
+ gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-uploads-bucket-name>"
+ gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-packages-bucket-name>"
+ gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-dependency-proxy-bucket-name>"
+ gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-terraform-state-bucket-name>"
```
1. Copy the `/etc/gitlab/gitlab-secrets.json` file from your Consul server, and replace
@@ -1671,6 +1983,15 @@ The following IPs will be used as an example:
- `10.6.0.111`: GitLab application 1
- `10.6.0.112`: GitLab application 2
- `10.6.0.113`: GitLab application 3
+- `10.6.0.114`: GitLab application 4
+- `10.6.0.115`: GitLab application 5
+- `10.6.0.116`: GitLab application 6
+- `10.6.0.117`: GitLab application 7
+- `10.6.0.118`: GitLab application 8
+- `10.6.0.119`: GitLab application 9
+- `10.6.0.120`: GitLab application 10
+- `10.6.0.121`: GitLab application 11
+- `10.6.0.122`: GitLab application 12
On each node perform the following:
@@ -1690,17 +2011,14 @@ On each node perform the following:
```ruby
external_url 'https://gitlab.example.com'
- # Gitaly and GitLab use two shared secrets for authentication, one to authenticate gRPC requests
- # to Gitaly, and a second for authentication callbacks from GitLab-Shell to the GitLab internal API.
- # The following two values must be the same as their respective values
- # of the Gitaly setup
- gitlab_rails['gitaly_token'] = 'gitalysecret'
- gitlab_shell['secret_token'] = 'shellsecret'
-
+ # git_data_dirs get configured for the Praefect virtual storage
+ # Address is Interal Load Balancer for Praefect
+ # Token is praefect_external_token
git_data_dirs({
- 'default' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage1' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage2' => { 'gitaly_address' => 'tcp://gitaly2.internal:8075' },
+ "default" => {
+ "gitaly_address" => "tcp://10.6.0.40:2305", # internal load balancer IP
+ "gitaly_token" => '<praefect_external_token>'
+ }
})
## Disable components that will not be on the GitLab application server
@@ -1755,8 +2073,8 @@ On each node perform the following:
# Add the monitoring node's IP address to the monitoring whitelist and allow it to
# scrape the NGINX metrics
- gitlab_rails['monitoring_whitelist'] = ['10.6.0.121/32', '127.0.0.0/8']
- nginx['status']['options']['allow'] = ['10.6.0.121/32', '127.0.0.0/8']
+ gitlab_rails['monitoring_whitelist'] = ['10.6.0.151/32', '127.0.0.0/8']
+ nginx['status']['options']['allow'] = ['10.6.0.151/32', '127.0.0.0/8']
#############################
### Object storage ###
@@ -1769,24 +2087,25 @@ On each node perform the following:
'google_project' => '<gcp-project-name>',
'google_json_key_location' => '<path-to-gcp-service-account-key>'
}
- gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-bucket-name>"
+ gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-artifacts-bucket-name>"
+ gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-external-diffs-bucket-name>"
+ gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-lfs-bucket-name>"
+ gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-uploads-bucket-name>"
+ gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-packages-bucket-name>"
+ gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-dependency-proxy-bucket-name>"
+ gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-terraform-state-bucket-name>"
```
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-1. If you're using [Gitaly with TLS support](#gitaly-tls-support), make sure the
+1. If you're using [Gitaly with TLS support](#gitaly-cluster-tls-support), make sure the
`git_data_dirs` entry is configured with `tls` instead of `tcp`:
```ruby
git_data_dirs({
- 'default' => { 'gitaly_address' => 'tls://gitaly1.internal:9999' },
- 'storage1' => { 'gitaly_address' => 'tls://gitaly1.internal:9999' },
- 'storage2' => { 'gitaly_address' => 'tls://gitaly2.internal:9999' },
+ "default" => {
+ "gitaly_address" => "tls://10.6.0.40:2305", # internal load balancer IP
+ "gitaly_token" => '<praefect_external_token>'
+ }
})
```
@@ -1891,7 +2210,7 @@ running [Prometheus](../monitoring/prometheus/index.md) and
The following IP will be used as an example:
-- `10.6.0.121`: Prometheus
+- `10.6.0.151`: Prometheus
To configure the Monitoring node:
@@ -2002,20 +2321,9 @@ on what features you intend to use:
| [Terraform state files](../terraform_state.md#using-object-storage) | Yes |
Using separate buckets for each data type is the recommended approach for GitLab.
-
-A limitation of our configuration is that each use of object storage is separately configured.
-[We have an issue for improving this](https://gitlab.com/gitlab-org/gitlab/-/issues/23345)
-and easily using one bucket with separate folders is one improvement that this might bring.
-
-There is at least one specific issue with using the same bucket:
-when GitLab is deployed with the Helm chart restore from backup
-[will not properly function](https://docs.gitlab.com/charts/advanced/external-object-storage/#lfs-artifacts-uploads-packages-external-diffs-pseudonymizer)
-unless separate buckets are used.
-
-One risk of using a single bucket would be if your organization decided to
-migrate GitLab to the Helm deployment in the future. GitLab would run, but the situation with
-backups might not be realized until the organization had a critical requirement for the backups to
-work.
+This ensures there are no collisions across the various types of data GitLab stores.
+There are plans to [enable the use of a single bucket](https://gitlab.com/gitlab-org/gitlab/-/issues/292958)
+in the future.
<div align="right">
<a type="button" class="btn btn-default" href="#setup-components">
@@ -2023,7 +2331,7 @@ work.
</a>
</div>
-## Configure Advanced Search **(PREMIUM SELF)**
+## Configure Advanced Search
You can leverage Elasticsearch and [enable Advanced Search](../../integration/elasticsearch.md)
for faster, more advanced code search across your entire GitLab instance.
@@ -2058,13 +2366,3 @@ as soon as possible.
Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
</a>
</div>
-
-## Troubleshooting
-
-See the [troubleshooting documentation](troubleshooting.md).
-
-<div align="right">
- <a type="button" class="btn btn-default" href="#setup-components">
- Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
- </a>
-</div>
diff --git a/doc/administration/reference_architectures/5k_users.md b/doc/administration/reference_architectures/5k_users.md
index 37d35c299fa..0a236eac243 100644
--- a/doc/administration/reference_architectures/5k_users.md
+++ b/doc/administration/reference_architectures/5k_users.md
@@ -19,79 +19,107 @@ costly-to-operate environment by using the
[2,000-user reference architecture](2k_users.md).
> - **Supported users (approximate):** 5,000
-> - **High Availability:** Yes
+> - **High Availability:** Yes ([Praefect](#configure-praefect-postgresql) needs a third-party PostgreSQL solution for HA)
> - **Test requests per second (RPS) rates:** API: 100 RPS, Web: 10 RPS, Git (Pull): 10 RPS, Git (Push): 2 RPS
| Service | Nodes | Configuration | GCP | AWS | Azure |
|--------------------------------------------|-------------|-------------------------|----------------|-------------|----------|
-| External load balancing node | 1 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | `c5.large` | F2s v2 |
-| Redis | 3 | 2 vCPU, 7.5 GB memory | n1-standard-2 | `m5.large` | D2s v3 |
-| Consul + Sentinel | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | `c5.large` | F2s v2 |
-| PostgreSQL | 3 | 2 vCPU, 7.5 GB memory | n1-standard-2 | `m5.large` | D2s v3 |
-| PgBouncer | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | `c5.large` | F2s v2 |
-| Internal load balancing node | 1 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | `c5.large` | F2s v2 |
-| Gitaly | 2 (minimum) | 8 vCPU, 30 GB memory | n1-standard-8 | `m5.2xlarge` | D8s v3 |
-| Sidekiq | 4 | 2 vCPU, 7.5 GB memory | n1-standard-2 | `m5.large` | D2s v3 |
-| GitLab Rails | 3 | 16 vCPU, 14.4 GB memory | n1-highcpu-16 | `c5.4xlarge` | F16s v2 |
-| Monitoring node | 1 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | `c5.large` | F2s v2 |
+| External load balancing node | 1 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
+| Redis | 3 | 2 vCPU, 7.5 GB memory | n1-standard-2 | m5.large | D2s v3 |
+| Consul + Sentinel | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
+| PostgreSQL | 3 | 4 vCPU, 15 GB memory | n1-standard-4 | m5.xlarge | D4s v3 |
+| PgBouncer | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
+| Internal load balancing node | 1 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
+| Gitaly | 3 | 8 vCPU, 30 GB memory | n1-standard-8 | m5.2xlarge | D8s v3 |
+| Praefect | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
+| Praefect PostgreSQL | 1+* | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
+| Sidekiq | 4 | 2 vCPU, 7.5 GB memory | n1-standard-2 | m5.large | D2s v3 |
+| GitLab Rails | 3 | 16 vCPU, 14.4 GB memory | n1-highcpu-16 | c5.4xlarge | F16s v2 |
+| Monitoring node | 1 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
| Object storage | n/a | n/a | n/a | n/a | n/a |
-| NFS server (optional, not recommended) | 1 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | `c5.xlarge` | F4s v2 |
-
-```mermaid
-stateDiagram-v2
- [*] --> LoadBalancer
- LoadBalancer --> ApplicationServer
-
- ApplicationServer --> BackgroundJobs
- ApplicationServer --> Gitaly
- ApplicationServer --> Redis
- ApplicationServer --> PgBouncer
- PgBouncer --> Database
- ApplicationServer --> ObjectStorage
- BackgroundJobs --> ObjectStorage
-
- ApplicationMonitoring -->ApplicationServer
- ApplicationMonitoring -->Redis
- ApplicationMonitoring -->PgBouncer
- ApplicationMonitoring -->Database
- ApplicationMonitoring -->BackgroundJobs
-
- state Database {
- "PG_Primary_Node"
- "PG_Secondary_Node_1..2"
- }
-
- state Redis {
- "R_Primary_Node"
- "R_Replica_Node_1..2"
- "R_Consul/Sentinel_1..3"
- }
-
- state Gitaly {
- "Gitaly_1..2"
- }
-
- state BackgroundJobs {
- "Sidekiq_1..4"
- }
-
- state ApplicationServer {
- "GitLab_Rails_1..3"
- }
-
- state LoadBalancer {
- "LoadBalancer_1"
- }
-
- state ApplicationMonitoring {
- "Prometheus"
- "Grafana"
- }
-
- state PgBouncer {
- "Internal_Load_Balancer"
- "PgBouncer_1..3"
- }
+| NFS server (optional, not recommended) | 1 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | c5.xlarge | F4s v2 |
+
+```plantuml
+@startuml 5k
+card "**External Load Balancer**" as elb #6a9be7
+card "**Internal Load Balancer**" as ilb #9370DB
+
+together {
+ collections "**GitLab Rails** x3" as gitlab #32CD32
+ collections "**Sidekiq** x4" as sidekiq #ff8dd1
+}
+
+together {
+ card "**Prometheus + Grafana**" as monitor #7FFFD4
+ collections "**Consul** x3" as consul #e76a9b
+}
+
+card "Gitaly Cluster" as gitaly_cluster {
+ collections "**Praefect** x3" as praefect #FF8C00
+ collections "**Gitaly** x3" as gitaly #FF8C00
+ card "**Praefect PostgreSQL***\n//Non fault-tolerant//" as praefect_postgres #FF8C00
+
+ praefect -[#FF8C00]-> gitaly
+ praefect -[#FF8C00]> praefect_postgres
+}
+
+card "Database" as database {
+ collections "**PGBouncer** x3" as pgbouncer #4EA7FF
+ card "**PostgreSQL** (Primary)" as postgres_primary #4EA7FF
+ collections "**PostgreSQL** (Secondary) x2" as postgres_secondary #4EA7FF
+
+ pgbouncer -[#4EA7FF]-> postgres_primary
+ postgres_primary .[#4EA7FF]> postgres_secondary
+}
+
+card "redis" as redis {
+ collections "**Redis Persistent** x3" as redis_persistent #FF6347
+ collections "**Redis Cache** x3" as redis_cache #FF6347
+ collections "**Redis Persistent Sentinel** x3" as redis_persistent_sentinel #FF6347
+ collections "**Redis Cache Sentinel** x3"as redis_cache_sentinel #FF6347
+
+ redis_persistent <.[#FF6347]- redis_persistent_sentinel
+ redis_cache <.[#FF6347]- redis_cache_sentinel
+}
+
+cloud "**Object Storage**" as object_storage #white
+
+elb -[#6a9be7]-> gitlab
+elb -[#6a9be7]--> monitor
+
+gitlab -[#32CD32]> sidekiq
+gitlab -[#32CD32]--> ilb
+gitlab -[#32CD32]-> object_storage
+gitlab -[#32CD32]---> redis
+gitlab -[hidden]-> monitor
+gitlab -[hidden]-> consul
+
+sidekiq -[#ff8dd1]--> ilb
+sidekiq -[#ff8dd1]-> object_storage
+sidekiq -[#ff8dd1]---> redis
+sidekiq -[hidden]-> monitor
+sidekiq -[hidden]-> consul
+
+ilb -[#9370DB]-> gitaly_cluster
+ilb -[#9370DB]-> database
+
+consul .[#e76a9b]u-> gitlab
+consul .[#e76a9b]u-> sidekiq
+consul .[#e76a9b]> monitor
+consul .[#e76a9b]-> database
+consul .[#e76a9b]-> gitaly_cluster
+consul .[#e76a9b,norank]--> redis
+
+monitor .[#7FFFD4]u-> gitlab
+monitor .[#7FFFD4]u-> sidekiq
+monitor .[#7FFFD4]> consul
+monitor .[#7FFFD4]-> database
+monitor .[#7FFFD4]-> gitaly_cluster
+monitor .[#7FFFD4,norank]--> redis
+monitor .[#7FFFD4]> ilb
+monitor .[#7FFFD4,norank]u--> elb
+
+@enduml
```
The Google Cloud Platform (GCP) architectures were built and tested using the
@@ -106,19 +134,25 @@ uploads, or artifacts), using an [object storage service](#configure-the-object-
is recommended instead of using NFS. Using an object storage service also
doesn't require you to provision and maintain a node.
+It's also worth noting that at this time [Praefect requires its own database server](../gitaly/praefect.md#postgresql) and
+that to achieve full High Availability a third party PostgreSQL database solution will be required.
+We hope to offer a built in solutions for these restrictions in the future but in the meantime a non HA PostgreSQL server
+can be set up via Omnibus GitLab, which the above specs reflect. Refer to the following issues for more information: [`omnibus-gitlab#5919`](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5919) & [`gitaly#3398`](https://gitlab.com/gitlab-org/gitaly/-/issues/3398)
+
## Setup components
To set up GitLab and its components to accommodate up to 5,000 users:
-1. [Configure the external load balancing node](#configure-the-external-load-balancer)
+1. [Configure the external load balancer](#configure-the-external-load-balancer)
to handle the load balancing of the GitLab application services nodes.
+1. [Configure the internal load balancer](#configure-the-internal-load-balancer).
+ to handle the load balancing of GitLab application internal connections.
1. [Configure Redis](#configure-redis).
1. [Configure Consul and Sentinel](#configure-consul-and-sentinel).
1. [Configure PostgreSQL](#configure-postgresql), the database for GitLab.
1. [Configure PgBouncer](#configure-pgbouncer).
-1. [Configure the internal load balancing node](#configure-the-internal-load-balancer).
-1. [Configure Gitaly](#configure-gitaly),
- which provides access to the Git repositories.
+1. [Configure Gitaly Cluster](#configure-gitaly-cluster),
+ provides access to the Git repositories.
1. [Configure Sidekiq](#configure-sidekiq).
1. [Configure the main GitLab Rails application](#configure-gitlab-rails)
to run Puma/Unicorn, Workhorse, GitLab Shell, and to serve all frontend
@@ -155,6 +189,11 @@ The following list includes descriptions of each server and its assigned IP:
- `10.6.0.20`: Internal Load Balancer
- `10.6.0.51`: Gitaly 1
- `10.6.0.52`: Gitaly 2
+- `10.6.0.93`: Gitaly 3
+- `10.6.0.131`: Praefect 1
+- `10.6.0.132`: Praefect 2
+- `10.6.0.133`: Praefect 3
+- `10.6.0.141`: Praefect PostgreSQL 1 (non HA)
- `10.6.0.71`: Sidekiq 1
- `10.6.0.72`: Sidekiq 2
- `10.6.0.73`: Sidekiq 3
@@ -285,6 +324,71 @@ Configure DNS for an alternate SSH hostname such as `altssh.gitlab.example.com`.
</a>
</div>
+## Configure the internal load balancer
+
+The Internal Load Balancer is used to balance any internal connections the GitLab environment requires
+such as connections to [PgBouncer](#configure-pgbouncer) and [Praefect](#configure-praefect) (Gitaly Cluster).
+
+Note that it's a separate node from the External Load Balancer and shouldn't have any access externally.
+
+The following IP will be used as an example:
+
+- `10.6.0.40`: Internal Load Balancer
+
+Here's how you could do it with [HAProxy](https://www.haproxy.org/):
+
+```plaintext
+global
+ log /dev/log local0
+ log localhost local1 notice
+ log stdout format raw local0
+
+defaults
+ log global
+ default-server inter 10s fall 3 rise 2
+ balance leastconn
+
+frontend internal-pgbouncer-tcp-in
+ bind *:6432
+ mode tcp
+ option tcplog
+
+ default_backend pgbouncer
+
+frontend internal-praefect-tcp-in
+ bind *:2305
+ mode tcp
+ option tcplog
+ option clitcpka
+
+ default_backend praefect
+
+backend pgbouncer
+ mode tcp
+ option tcp-check
+
+ server pgbouncer1 10.6.0.21:6432 check
+ server pgbouncer2 10.6.0.22:6432 check
+ server pgbouncer3 10.6.0.23:6432 check
+
+backend praefect
+ mode tcp
+ option tcp-check
+ option srvtcpka
+
+ server praefect1 10.6.0.131:2305 check
+ server praefect2 10.6.0.132:2305 check
+ server praefect3 10.6.0.133:2305 check
+```
+
+Refer to your preferred Load Balancer's documentation for further guidance.
+
+<div align="right">
+ <a type="button" class="btn btn-default" href="#setup-components">
+ Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
+ </a>
+</div>
+
## Configure Redis
Using [Redis](https://redis.io/) in scalable environment is possible using a **Primary** x **Replica**
@@ -924,45 +1028,96 @@ The following IPs will be used as an example:
</a>
</div>
-### Configure the internal load balancer
+## Configure Gitaly Cluster
-If you're running more than one PgBouncer node as recommended, then at this time you'll need to set
-up a TCP internal load balancer to serve each correctly.
+[Gitaly Cluster](../gitaly/praefect.md) is a GitLab provided and recommended fault tolerant solution for storing Git repositories.
+In this configuration, every Git repository is stored on every Gitaly node in the cluster, with one being designated the primary, and failover occurs automatically if the primary node goes down.
-The following IP will be used as an example:
+The recommended cluster setup includes the following components:
-- `10.6.0.20`: Internal Load Balancer
+- 3 Gitaly nodes: Replicated storage of Git repositories.
+- 3 Praefect nodes: Router and transaction manager for Gitaly Cluster.
+- 1 Praefect PostgreSQL node: Database server for Praefect. A third-party solution
+ is required for Praefect database connections to be made highly available.
+- 1 load balancer: A load balancer is required for Praefect. The
+ [internal load balancer](#configure-the-internal-load-balancer) will be used.
-Here's how you could do it with [HAProxy](https://www.haproxy.org/):
+This section will detail how to configure the recommended standard setup in order.
+For more advanced setups refer to the [standalone Gitaly Cluster documentation](../gitaly/praefect.md).
-```plaintext
-global
- log /dev/log local0
- log localhost local1 notice
- log stdout format raw local0
+### Configure Praefect PostgreSQL
-defaults
- log global
- default-server inter 10s fall 3 rise 2
- balance leastconn
+Praefect, the routing and transaction manager for Gitaly Cluster, requires its own database server to store data on Gitaly Cluster status.
-frontend internal-pgbouncer-tcp-in
- bind *:6432
- mode tcp
- option tcplog
+If you want to have a highly available setup, Praefect requires a third-party PostgreSQL database.
+A built-in solution is being [worked on](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5919).
- default_backend pgbouncer
+#### Praefect non-HA PostgreSQL standalone using Omnibus GitLab
-backend pgbouncer
- mode tcp
- option tcp-check
+The following IPs will be used as an example:
- server pgbouncer1 10.6.0.21:6432 check
- server pgbouncer2 10.6.0.22:6432 check
- server pgbouncer3 10.6.0.23:6432 check
-```
+- `10.6.0.141`: Praefect PostgreSQL
-Refer to your preferred Load Balancer's documentation for further guidance.
+First, make sure to [install](https://about.gitlab.com/install/)
+the Linux GitLab package in the Praefect PostgreSQL node. Following the steps,
+install the necessary dependencies from step 1, and add the
+GitLab package repository from step 2. When installing GitLab
+in the second step, do not supply the `EXTERNAL_URL` value.
+
+1. SSH in to the Praefect PostgreSQL node.
+1. Create a strong password to be used for the Praefect PostgreSQL user. Take note of this password as `<praefect_postgresql_password>`.
+1. Generate the password hash for the Praefect PostgreSQL username/password pair. This assumes you will use the default
+ username of `praefect` (recommended). The command will request the password `<praefect_postgresql_password>`
+ and confirmation. Use the value that is output by this command in the next
+ step as the value of `<praefect_postgresql_password_hash>`:
+
+ ```shell
+ sudo gitlab-ctl pg-password-md5 praefect
+ ```
+
+1. Edit `/etc/gitlab/gitlab.rb` replacing values noted in the `# START user configuration` section:
+
+ ```ruby
+ # Disable all components except PostgreSQL and Consul
+ roles ['postgres_role']
+ repmgr['enable'] = false
+ patroni['enable'] = false
+
+ # PostgreSQL configuration
+ postgresql['listen_address'] = '0.0.0.0'
+ postgresql['max_connections'] = 200
+
+ gitlab_rails['auto_migrate'] = false
+
+ # 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
+ #
+ # Replace PRAEFECT_POSTGRESQL_PASSWORD_HASH with a generated md5 value
+ postgresql['sql_user_password'] = "<praefect_postgresql_password_hash>"
+
+ # Replace XXX.XXX.XXX.XXX/YY with Network Address
+ postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24)
+
+ # Set the network addresses that the exporters will listen on for monitoring
+ node_exporter['listen_address'] = '0.0.0.0:9100'
+ postgres_exporter['listen_address'] = '0.0.0.0:9187'
+
+ ## 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),
+ }
+ #
+ # END user configuration
+ ```
+
+1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
+1. Follow the [post configuration](#praefect-postgresql-post-configuration).
<div align="right">
<a type="button" class="btn btn-default" href="#setup-components">
@@ -970,19 +1125,186 @@ Refer to your preferred Load Balancer's documentation for further guidance.
</a>
</div>
-## Configure Gitaly
+#### Praefect HA PostgreSQL third-party solution
-NOTE:
-[Gitaly Cluster](../gitaly/praefect.md) support
-for the Reference Architectures is being
-worked on as a [collaborative effort](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/1) between the Quality Engineering and Gitaly teams. When this component has been verified
-some Architecture specs will likely change as a result to support the new
-and improved designed.
+[As noted](#configure-praefect-postgresql), a third-party PostgreSQL solution for
+Praefect's database is recommended if aiming for full High Availability.
+
+There are many third-party solutions for PostgreSQL HA. The solution selected must have the following to work with Praefect:
+
+- A static IP for all connections that doesn't change on failover.
+- [`LISTEN`](https://www.postgresql.org/docs/12/sql-listen.html) SQL functionality must be supported.
+
+Examples of the above could include [Google's Cloud SQL](https://cloud.google.com/sql/docs/postgres/high-availability#normal) or [Amazon RDS](https://aws.amazon.com/rds/).
+
+Once the database is set up, follow the [post configuration](#praefect-postgresql-post-configuration).
+
+#### Praefect PostgreSQL post-configuration
+
+After the Praefect PostgreSQL server has been set up, you'll then need to configure the user and database for Praefect to use.
+
+We recommend the user be named `praefect` and the database `praefect_production`, and these can be configured as standard in PostgreSQL.
+The password for the user is the same as the one you configured earlier as `<praefect_postgresql_password>`.
-[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 5 TB of data. Depending on your
-repository storage requirements, you may require additional Gitaly server nodes.
+This is how this would work with a Omnibus GitLab PostgreSQL setup:
+
+1. SSH in to the Praefect PostgreSQL node.
+1. Connect to the PostgreSQL server with administrative access.
+ The `gitlab-psql` user should be used here for this as it's added by default in Omnibus.
+ The database `template1` is used because it is created by default on all PostgreSQL servers.
+
+ ```shell
+ /opt/gitlab/embedded/bin/psql -U gitlab-psql -d template1 -h POSTGRESQL_SERVER_ADDRESS
+ ```
+
+1. Create the new user `praefect`, replacing `<praefect_postgresql_password>`:
+
+ ```shell
+ CREATE ROLE praefect WITH LOGIN CREATEDB PASSWORD <praefect_postgresql_password>;
+ ```
+
+1. Reconnect to the PostgreSQL server, this time as the `praefect` user:
+
+ ```shell
+ /opt/gitlab/embedded/bin/psql -U praefect -d template1 -h POSTGRESQL_SERVER_ADDRESS
+ ```
+
+1. Create a new database `praefect_production`:
+
+ ```shell
+ CREATE DATABASE praefect_production WITH ENCODING=UTF8;
+ ```
+
+<div align="right">
+ <a type="button" class="btn btn-default" href="#setup-components">
+ Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
+ </a>
+</div>
+
+### Configure Praefect
+
+Praefect is the router and transaction manager for Gitaly Cluster and all connections to Gitaly go through
+it. This section details how to configure it.
+
+Praefect requires several secret tokens to secure communications across the Cluster:
+
+- `<praefect_external_token>`: Used for repositories hosted on your Gitaly cluster and can only be accessed by Gitaly clients that carry this token.
+- `<praefect_internal_token>`: Used for replication traffic inside your Gitaly cluster. This is distinct from `praefect_external_token` because Gitaly clients must not be able to access internal nodes of the Praefect cluster directly; that could lead to data loss.
+- `<praefect_postgresql_password>`: The Praefect PostgreSQL password defined in the previous section is also required as part of this setup.
+
+Gitaly Cluster nodes are configured in Praefect via a `virtual storage`. Each storage contains
+the details of each Gitaly node that makes up the cluster. Each storage is also given a name
+and this name is used in several areas of the config. In this guide, the name of the storage will be
+`default`. Also, this guide is geared towards new installs, if upgrading an existing environment
+to use Gitaly Cluster, you may need to use a different name.
+Refer to the [Praefect documentation](../gitaly/praefect.md#praefect) for more info.
+
+The following IPs will be used as an example:
+
+- `10.6.0.131`: Praefect 1
+- `10.6.0.132`: Praefect 2
+- `10.6.0.133`: Praefect 3
+
+To configure the Praefect nodes, on each one:
+
+1. SSH in to the Praefect server.
+1. [Download and install](https://about.gitlab.com/install/) the Omnibus GitLab
+ package of your choice. Be sure to follow _only_ installation steps 1 and 2
+ on the page.
+1. Edit the `/etc/gitlab/gitlab.rb` file to configure Praefect:
+
+ ```ruby
+ # Avoid running unnecessary services on the Gitaly server
+ postgresql['enable'] = false
+ redis['enable'] = false
+ nginx['enable'] = false
+ puma['enable'] = false
+ unicorn['enable'] = false
+ sidekiq['enable'] = false
+ gitlab_workhorse['enable'] = false
+ grafana['enable'] = false
+
+ # If you run a separate monitoring node you can disable these services
+ alertmanager['enable'] = false
+ prometheus['enable'] = false
+
+ # Praefect Configuration
+ praefect['enable'] = true
+ praefect['listen_addr'] = '0.0.0.0:2305'
+
+ gitlab_rails['rake_cache_clear'] = false
+ gitlab_rails['auto_migrate'] = false
+
+ # 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
+ #
+
+ # Praefect External Token
+ # This is needed by clients outside the cluster (like GitLab Shell) to communicate with the Praefect cluster
+ praefect['auth_token'] = '<praefect_external_token>'
+
+ # Praefect Database Settings
+ praefect['database_host'] = '10.6.0.141'
+ praefect['database_port'] = 5432
+ # `no_proxy` settings must always be a direct connection for caching
+ praefect['database_host_no_proxy'] = '10.6.0.141'
+ praefect['database_port_no_proxy'] = 5432
+ praefect['database_dbname'] = 'praefect_production'
+ praefect['database_user'] = 'praefect'
+ praefect['database_password'] = '<praefect_postgresql_password>'
+
+ # Praefect Virtual Storage config
+ # Name of storage hash must match storage name in git_data_dirs on GitLab
+ # server ('praefect') and in git_data_dirs on Gitaly nodes ('gitaly-1')
+ praefect['virtual_storages'] = {
+ 'default' => {
+ 'gitaly-1' => {
+ 'address' => 'tcp://10.6.0.91:8075',
+ 'token' => '<praefect_internal_token>',
+ 'primary' => true
+ },
+ 'gitaly-2' => {
+ 'address' => 'tcp://10.6.0.92:8075',
+ 'token' => '<praefect_internal_token>'
+ },
+ 'gitaly-3' => {
+ 'address' => 'tcp://10.6.0.93:8075',
+ 'token' => '<praefect_internal_token>'
+ },
+ }
+ }
+
+ # Set the network addresses that the exporters will listen on for monitoring
+ node_exporter['listen_address'] = '0.0.0.0:9100'
+ praefect['prometheus_listen_addr'] = '0.0.0.0:9652'
+
+ ## 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),
+ }
+ #
+ # END user configuration
+ ```
+
+ 1. Copy the `/etc/gitlab/gitlab-secrets.json` file from your Consul server, and
+ then replace the file of the same name on this server. If that file isn't on
+ this server, add the file from your Consul server to this server.
+
+ 1. Save the file, and then [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+
+### 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.
Due to Gitaly having notable input and output requirements, we strongly
recommend that all Gitaly nodes use solid-state drives (SSDs). These SSDs
@@ -993,36 +1315,21 @@ adjusted to greater or lesser values depending on the scale of your
environment's workload. If you're running the environment on a Cloud provider,
refer to their documentation about how to configure IOPS correctly.
-Be sure to note the following items:
-
-- The GitLab Rails application shards repositories into
- [repository storage paths](../repository_storage_paths.md).
-- A Gitaly server can host one or more storage paths.
-- A GitLab server can use one or more Gitaly server nodes.
-- Gitaly addresses must be specified to be correctly resolvable for all Gitaly
- clients.
-- Gitaly servers must not be exposed to the public internet, as Gitaly's network
- traffic is unencrypted by default. The use of a firewall is highly recommended
- to restrict access to the Gitaly server. Another option is to
- [use TLS](#gitaly-tls-support).
-
-NOTE:
-The token referred to throughout the Gitaly documentation is an arbitrary
-password selected by the administrator. This token is unrelated to tokens
-created for the GitLab API or other similar web API tokens.
+Gitaly servers must not be exposed to the public internet, as Gitaly's network
+traffic is unencrypted by default. The use of a firewall is highly recommended
+to restrict access to the Gitaly server. Another option is to
+[use TLS](#gitaly-cluster-tls-support).
-This section describes how to configure two Gitaly servers, with the following
-IPs and domain names:
+For configuring Gitaly you should note the following:
-- `10.6.0.51`: Gitaly 1 (`gitaly1.internal`)
-- `10.6.0.52`: Gitaly 2 (`gitaly2.internal`)
+- `git_data_dirs` should be configured to reflect the storage path for the specific Gitaly node
+- `auth_token` should be the same as `praefect_internal_token`
-Assumptions about your servers include having the secret token be `gitalysecret`,
-and that your GitLab installation has three repository storages:
+The following IPs will be used as an example:
-- `default` on Gitaly 1
-- `storage1` on Gitaly 1
-- `storage2` on Gitaly 2
+- `10.6.0.91`: Gitaly 1
+- `10.6.0.92`: Gitaly 2
+- `10.6.0.93`: Gitaly 3
On each node:
@@ -1032,21 +1339,9 @@ On each node:
1. Edit the Gitaly server node's `/etc/gitlab/gitlab.rb` file to configure
storage paths, enable the network listener, and to configure the token:
- <!--
- updates to following example must also be made at
- https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/advanced/external-gitaly/external-omnibus-gitaly.md#configure-omnibus-gitlab
- -->
-
```ruby
# /etc/gitlab/gitlab.rb
- # Gitaly and GitLab use two shared secrets for authentication, one to authenticate gRPC requests
- # to Gitaly, and a second for authentication callbacks from GitLab-Shell to the GitLab internal API.
- # The following two values must be the same as their respective values
- # of the GitLab Rails application setup
- gitaly['auth_token'] = 'gitalysecret'
- gitlab_shell['secret_token'] = 'shellsecret'
-
# Avoid running unnecessary services on the Gitaly server
postgresql['enable'] = false
redis['enable'] = false
@@ -1056,7 +1351,6 @@ On each node:
sidekiq['enable'] = false
gitlab_workhorse['enable'] = false
grafana['enable'] = false
- gitlab_exporter['enable'] = false
# If you run a separate monitoring node you can disable these services
alertmanager['enable'] = false
@@ -1077,101 +1371,86 @@ On each node:
# Comment out following line if you only want to support TLS connections
gitaly['listen_addr'] = "0.0.0.0:8075"
- ## Enable service discovery for Prometheus
- consul['enable'] = true
- consul['monitoring_service_discovery'] = true
-
- # Set the network addresses that the exporters will listen on for monitoring
- gitaly['prometheus_listen_addr'] = "0.0.0.0:9236"
- node_exporter['listen_address'] = '0.0.0.0:9100'
- gitlab_rails['prometheus_address'] = '10.6.0.81:9090'
-
- ## 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),
- }
+ # Gitaly Auth Token
+ # Should be the same as praefect_internal_token
+ gitaly['auth_token'] = '<praefect_internal_token>'
```
1. Append the following to `/etc/gitlab/gitlab.rb` for each respective server:
- - On `gitaly1.internal`:
+ - On Gitaly node 1:
```ruby
git_data_dirs({
- 'default' => {
- 'path' => '/var/opt/gitlab/git-data'
- },
- 'storage1' => {
- 'path' => '/mnt/gitlab/git-data'
- },
+ "gitaly-1" => {
+ "path" => "/var/opt/gitlab/git-data"
+ }
})
```
- - On `gitaly2.internal`:
+ - On Gitaly node 2:
```ruby
git_data_dirs({
- 'storage2' => {
- 'path' => '/mnt/gitlab/git-data'
- },
+ "gitaly-2" => {
+ "path" => "/var/opt/gitlab/git-data"
+ }
})
```
- <!--
- updates to following example must also be made at
- https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/advanced/external-gitaly/external-omnibus-gitaly.md#configure-omnibus-gitlab
- -->
+ - On Gitaly node 3:
+
+ ```ruby
+ git_data_dirs({
+ "gitaly-3" => {
+ "path" => "/var/opt/gitlab/git-data"
+ }
+ })
+ ```
+
+1. Copy the `/etc/gitlab/gitlab-secrets.json` file from your Consul server, and
+ then replace the file of the same name on this server. If that file isn't on
+ this server, add the file from your Consul server to this server.
1. Save the file, and then [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-1. Confirm that Gitaly can perform callbacks to the internal API:
- ```shell
- sudo /opt/gitlab/embedded/bin/gitaly-hooks check /var/opt/gitlab/gitaly/config.toml
- ```
+### Gitaly Cluster TLS support
-1. Verify the GitLab services are running:
+Praefect supports TLS encryption. To communicate with a Praefect instance that listens
+for secure connections, you must:
- ```shell
- sudo gitlab-ctl status
- ```
+- Use a `tls://` URL scheme in the `gitaly_address` of the corresponding storage entry
+ in the GitLab configuration.
+- Bring your own certificates because this isn't provided automatically. The certificate
+ corresponding to each Praefect server must be installed on that Praefect server.
- The output should be similar to the following:
+Additionally the certificate, or its certificate authority, must be installed on all Gitaly servers
+and on all Praefect clients that communicate with it following the procedure described in
+[GitLab custom certificate configuration](https://docs.gitlab.com/omnibus/settings/ssl.html#install-custom-public-certificates) (and repeated below).
- ```plaintext
- run: consul: (pid 30339) 77006s; run: log: (pid 29878) 77020s
- run: gitaly: (pid 30351) 77005s; run: log: (pid 29660) 77040s
- run: logrotate: (pid 7760) 3213s; run: log: (pid 29782) 77032s
- run: node-exporter: (pid 30378) 77004s; run: log: (pid 29812) 77026s
- ```
+Note the following:
-### Gitaly TLS support
+- The certificate must specify the address you use to access the Praefect server. If
+ addressing the Praefect server by:
-Gitaly supports TLS encryption. To be able to communicate
-with a Gitaly instance that listens for secure connections you will need to use `tls://` URL
-scheme in the `gitaly_address` of the corresponding storage entry in the GitLab configuration.
+ - Hostname, you can either use the Common Name field for this, or add it as a Subject
+ Alternative Name.
+ - IP address, you must add it as a Subject Alternative Name to the certificate.
-You will need to bring your own certificates as this isn't provided automatically.
-The certificate, or its certificate authority, must be installed on all Gitaly
-nodes (including the Gitaly node using the certificate) and on all client nodes
-that communicate with it following the procedure described in
-[GitLab custom certificate configuration](https://docs.gitlab.com/omnibus/settings/ssl.html#install-custom-public-certificates).
+- You can configure Praefect servers with both an unencrypted listening address
+ `listen_addr` and an encrypted listening address `tls_listen_addr` at the same time.
+ This allows you to do a gradual transition from unencrypted to encrypted traffic, if
+ necessary.
-NOTE:
-The self-signed certificate must specify the address you use to access the
-Gitaly server. If you are addressing the Gitaly server by a hostname, you can
-either use the Common Name field for this, or add it as a Subject Alternative
-Name. If you are addressing the Gitaly server by its IP address, you must add it
-as a Subject Alternative Name to the certificate.
-[gRPC does not support using an IP address as Common Name in a certificate](https://github.com/grpc/grpc/issues/2691).
+- The Internal Load Balancer will also access to the certificates and need to be configured
+ to allow for TLS passthrough.
+ Refer to the load balancers documentation on how to configure this.
-It's possible to configure Gitaly servers with both an unencrypted listening
-address (`listen_addr`) and an encrypted listening address (`tls_listen_addr`)
-at the same time. This allows you to do a gradual transition from unencrypted to
-encrypted traffic, if necessary.
+To configure Praefect with TLS:
-To configure Gitaly with TLS:
+1. Create certificates for Praefect servers.
-1. Create the `/etc/gitlab/ssl` directory and copy your key and certificate there:
+1. On the Praefect servers, create the `/etc/gitlab/ssl` directory and copy your key
+ and certificate there:
```shell
sudo mkdir -p /etc/gitlab/ssl
@@ -1180,27 +1459,35 @@ To configure Gitaly with TLS:
sudo chmod 644 key.pem cert.pem
```
-1. Copy the cert to `/etc/gitlab/trusted-certs` so Gitaly will trust the cert when
- calling into itself:
+1. Edit `/etc/gitlab/gitlab.rb` and add:
- ```shell
- sudo cp /etc/gitlab/ssl/cert.pem /etc/gitlab/trusted-certs/
+ ```ruby
+ praefect['tls_listen_addr'] = "0.0.0.0:3305"
+ praefect['certificate_path'] = "/etc/gitlab/ssl/cert.pem"
+ praefect['key_path'] = "/etc/gitlab/ssl/key.pem"
```
-1. Edit `/etc/gitlab/gitlab.rb` and add:
+1. Save the file and [reconfigure](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+
+1. On the Praefect clients (including each Gitaly server), copy the certificates,
+ or their certificate authority, into `/etc/gitlab/trusted-certs`:
+
+ ```shell
+ sudo cp cert.pem /etc/gitlab/trusted-certs/
+ ```
- <!--
- updates to following example must also be made at
- https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/advanced/external-gitaly/external-omnibus-gitaly.md#configure-omnibus-gitlab
- -->
+1. On the Praefect clients (except Gitaly servers), edit `git_data_dirs` in
+ `/etc/gitlab/gitlab.rb` as follows:
```ruby
- gitaly['tls_listen_addr'] = "0.0.0.0:9999"
- gitaly['certificate_path'] = "/etc/gitlab/ssl/cert.pem"
- gitaly['key_path'] = "/etc/gitlab/ssl/key.pem"
+ git_data_dirs({
+ "default" => {
+ "gitaly_address" => 'tls://LOAD_BALANCER_SERVER_ADDRESS:2305',
+ "gitaly_token" => 'PRAEFECT_EXTERNAL_TOKEN'
+ }
+ })
```
-1. Delete `gitaly['listen_addr']` to allow only encrypted connections.
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
<div align="right">
@@ -1269,17 +1556,20 @@ To configure the Sidekiq nodes, one each one:
### Gitaly ###
#######################################
+ # git_data_dirs get configured for the Praefect virtual storage
+ # Address is Internal Load Balancer for Praefect
+ # Token is praefect_external_token
git_data_dirs({
- 'default' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage1' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage2' => { 'gitaly_address' => 'tcp://gitaly2.internal:8075' },
+ "default" => {
+ "gitaly_address" => "tcp://10.6.0.40:2305", # internal load balancer IP
+ "gitaly_token" => '<praefect_external_token>'
+ }
})
- gitlab_rails['gitaly_token'] = 'YOUR_TOKEN'
#######################################
### Postgres ###
#######################################
- gitlab_rails['db_host'] = '10.6.0.20' # internal load balancer IP
+ gitlab_rails['db_host'] = '10.6.0.40' # internal load balancer IP
gitlab_rails['db_port'] = 6432
gitlab_rails['db_password'] = '<postgresql_user_password>'
gitlab_rails['db_adapter'] = 'postgresql'
@@ -1319,13 +1609,13 @@ To configure the Sidekiq nodes, one each one:
'google_project' => '<gcp-project-name>',
'google_json_key_location' => '<path-to-gcp-service-account-key>'
}
- gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-bucket-name>"
+ gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-artifacts-bucket-name>"
+ gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-external-diffs-bucket-name>"
+ gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-lfs-bucket-name>"
+ gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-uploads-bucket-name>"
+ gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-packages-bucket-name>"
+ gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-dependency-proxy-bucket-name>"
+ gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-terraform-state-bucket-name>"
```
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
@@ -1397,17 +1687,14 @@ On each node perform the following:
```ruby
external_url 'https://gitlab.example.com'
- # Gitaly and GitLab use two shared secrets for authentication, one to authenticate gRPC requests
- # to Gitaly, and a second for authentication callbacks from GitLab-Shell to the GitLab internal API.
- # The following two values must be the same as their respective values
- # of the Gitaly setup
- gitlab_rails['gitaly_token'] = 'gitalysecret'
- gitlab_shell['secret_token'] = 'shellsecret'
-
+ # git_data_dirs get configured for the Praefect virtual storage
+ # Address is Interal Load Balancer for Praefect
+ # Token is praefect_external_token
git_data_dirs({
- 'default' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage1' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage2' => { 'gitaly_address' => 'tcp://gitaly2.internal:8075' },
+ "default" => {
+ "gitaly_address" => "tcp://10.6.0.40:2305", # internal load balancer IP
+ "gitaly_token" => '<praefect_external_token>'
+ }
})
## Disable components that will not be on the GitLab application server
@@ -1471,13 +1758,13 @@ On each node perform the following:
'google_project' => '<gcp-project-name>',
'google_json_key_location' => '<path-to-gcp-service-account-key>'
}
- gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-bucket-name>"
+ gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-artifacts-bucket-name>"
+ gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-external-diffs-bucket-name>"
+ gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-lfs-bucket-name>"
+ gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-uploads-bucket-name>"
+ gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-packages-bucket-name>"
+ gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-dependency-proxy-bucket-name>"
+ gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-terraform-state-bucket-name>"
## Uncomment and edit the following options if you have set up NFS
##
@@ -1495,14 +1782,15 @@ On each node perform the following:
#registry['gid'] = 9002
```
-1. If you're using [Gitaly with TLS support](#gitaly-tls-support), make sure the
+1. If you're using [Gitaly with TLS support](#gitaly-cluster-tls-support), make sure the
`git_data_dirs` entry is configured with `tls` instead of `tcp`:
```ruby
git_data_dirs({
- 'default' => { 'gitaly_address' => 'tls://gitaly1.internal:9999' },
- 'storage1' => { 'gitaly_address' => 'tls://gitaly1.internal:9999' },
- 'storage2' => { 'gitaly_address' => 'tls://gitaly2.internal:9999' },
+ "default" => {
+ "gitaly_address" => "tls://10.6.0.40:2305", # internal load balancer IP
+ "gitaly_token" => '<praefect_external_token>'
+ }
})
```
@@ -1694,20 +1982,9 @@ on what features you intend to use:
| [Terraform state files](../terraform_state.md#using-object-storage) | Yes |
Using separate buckets for each data type is the recommended approach for GitLab.
-
-A limitation of our configuration is that each use of object storage is separately configured.
-[We have an issue for improving this](https://gitlab.com/gitlab-org/gitlab/-/issues/23345)
-and easily using one bucket with separate folders is one improvement that this might bring.
-
-There is at least one specific issue with using the same bucket:
-when GitLab is deployed with the Helm chart restore from backup
-[will not properly function](https://docs.gitlab.com/charts/advanced/external-object-storage/#lfs-artifacts-uploads-packages-external-diffs-pseudonymizer)
-unless separate buckets are used.
-
-One risk of using a single bucket would be if your organization decided to
-migrate GitLab to the Helm deployment in the future. GitLab would run, but the situation with
-backups might not be realized until the organization had a critical requirement for the backups to
-work.
+This ensures there are no collisions across the various types of data GitLab stores.
+There are plans to [enable the use of a single bucket](https://gitlab.com/gitlab-org/gitlab/-/issues/292958)
+in the future.
<div align="right">
<a type="button" class="btn btn-default" href="#setup-components">
@@ -1715,7 +1992,7 @@ work.
</a>
</div>
-## Configure Advanced Search **(PREMIUM SELF)**
+## Configure Advanced Search
You can leverage Elasticsearch and [enable Advanced Search](../../integration/elasticsearch.md)
for faster, more advanced code search across your entire GitLab instance.
@@ -1750,13 +2027,3 @@ as soon as possible.
Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
</a>
</div>
-
-## Troubleshooting
-
-See the [troubleshooting documentation](troubleshooting.md).
-
-<div align="right">
- <a type="button" class="btn btn-default" href="#setup-components">
- Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
- </a>
-</div>
diff --git a/doc/administration/reference_architectures/index.md b/doc/administration/reference_architectures/index.md
index b149cbc6e9d..d5d4f8ac0cb 100644
--- a/doc/administration/reference_architectures/index.md
+++ b/doc/administration/reference_architectures/index.md
@@ -5,7 +5,7 @@ group: Distribution
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Reference architectures
+# Reference architectures **(FREE SELF)**
You can set up GitLab on a single server or scale it up to serve many users.
This page details the recommended Reference Architectures that were built and
@@ -92,7 +92,7 @@ Also, not implementing extra servers for GitLab doesn't necessarily mean that yo
more downtime. Depending on your needs and experience level, single servers can
have more actual perceived uptime for your users.
-### Automated backups **(FREE SELF)**
+### Automated backups
> - Level of complexity: **Low**
> - Required domain knowledge: PostgreSQL, GitLab configurations, Git
diff --git a/doc/administration/reference_architectures/troubleshooting.md b/doc/administration/reference_architectures/troubleshooting.md
index cab45a99ee4..60a6ee0132f 100644
--- a/doc/administration/reference_architectures/troubleshooting.md
+++ b/doc/administration/reference_architectures/troubleshooting.md
@@ -257,7 +257,7 @@ sudo GRPC_TRACE=all GRPC_VERBOSITY=DEBUG gitlab-rake gitlab:gitaly:check
### Observing `gitaly-ruby` traffic
-[`gitaly-ruby`](../gitaly/index.md#gitaly-ruby) is an internal implementation detail of Gitaly,
+[`gitaly-ruby`](../gitaly/configure_gitaly.md#gitaly-ruby) is an internal implementation detail of Gitaly,
so, there's not that much visibility into what goes on inside
`gitaly-ruby` processes.
@@ -301,7 +301,7 @@ Confirm the following are all true:
- Creating a new project and [initializing it with a README](../../user/project/working_with_projects.md#blank-projects)
successfully creates the project but doesn't create the README.
- When [tailing the logs](https://docs.gitlab.com/omnibus/settings/logs.html#tail-logs-in-a-console-on-the-server) on an app node and reproducing the error, you get `401` errors
- when reaching the `/api/v4/internal/allowed` endpoint:
+ when reaching the [`/api/v4/internal/allowed`](../../development/internal_api.md) endpoint:
```shell
# api_json.log
diff --git a/doc/administration/repository_checks.md b/doc/administration/repository_checks.md
index 404a7bd77c1..059acbd12f8 100644
--- a/doc/administration/repository_checks.md
+++ b/doc/administration/repository_checks.md
@@ -5,7 +5,7 @@ info: "To determine the technical writer assigned to the Stage/Group associated
type: reference
---
-# Repository checks
+# Repository checks **(FREE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/3232) in GitLab 8.7.
diff --git a/doc/administration/repository_storage_paths.md b/doc/administration/repository_storage_paths.md
index 5884a8b3283..e342ef8c04b 100644
--- a/doc/administration/repository_storage_paths.md
+++ b/doc/administration/repository_storage_paths.md
@@ -13,7 +13,9 @@ GitLab stores [repositories](../user/project/repository/index.md) on repository
storage is either:
- A `gitaly_address`, which points to a [Gitaly node](gitaly/index.md).
-- A `path`, which points directly a directory where the repository is stored.
+- A `path`, which points directly a directory where the repositories are stored. This method is
+ deprecated and [scheduled to be removed](https://gitlab.com/gitlab-org/gitaly/-/issues/1690) in
+ GitLab 14.0.
GitLab allows you to define multiple repository storages to distribute the storage load between
several mount points. For example:
@@ -23,7 +25,7 @@ several mount points. For example:
```ruby
git_data_dirs({
'default' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage1' => { 'gitaly_address' => 'tcp://gitaly2.internal:8075' },
+ 'storage2' => { 'gitaly_address' => 'tcp://gitaly2.internal:8075' },
})
```
@@ -31,18 +33,23 @@ several mount points. For example:
```plaintext
default:
- path: /mnt/git-storage-1
+ gitaly_address: tcp://gitaly1.example:8075
storage2:
- path: /mnt/git-storage-2
+ gitaly_address: tcp://gitaly2.example:8075
```
-For more information on
+For more information on:
- Configuring Gitaly, see [Configure Gitaly](gitaly/index.md#configure-gitaly).
- Configuring direct repository access, see the following section below.
## Configure repository storage paths
+WARNING:
+The following information is for configuring GitLab to directly access repositories. This
+configuration option is deprecated in favor of using [Gitaly](gitaly/index.md) and is scheduled to
+[be removed in GitLab 14.0](https://gitlab.com/gitlab-org/gitaly/-/issues/1690).
+
To configure repository storage paths:
1. Edit the necessary configuration files:
@@ -76,7 +83,7 @@ For [backups](../raketasks/backup_restore.md) to work correctly:
Omnibus GitLab takes care of these issues for you, but for source installations you should be extra
careful.
-While restoring a backup, the current contents of `/home/git/repositories` are moved to
+While restoring a backup, the current contents of `/home/git/repositories` are moved to
`/home/git/repositories.old`. If `/home/git/repositories` is a mount point, then `mv` would be
moving things between mount points, and problems can occur.
@@ -96,10 +103,6 @@ For compatibility reasons `gitlab.yml` has a different structure than Omnibus Gi
example. Then Omnibus GitLab creates a `repositories` directory under that path to use with
`gitlab.yml`.
-NOTE:
-This example uses NFS. We do not recommend using EFS for storage as it may impact GitLab performance.
-Read the [relevant documentation](nfs.md#avoid-using-awss-elastic-file-system-efs) for more details.
-
**For installations from source**
1. Edit `gitlab.yml` and add the storage paths:
@@ -111,10 +114,10 @@ Read the [relevant documentation](nfs.md#avoid-using-awss-elastic-file-system-ef
storages: # You must have at least a 'default' repository storage path.
default:
path: /home/git/repositories
- nfs_1:
- path: /mnt/nfs1/repositories
- nfs_2:
- path: /mnt/nfs2/repositories
+ storage1:
+ path: /mnt/storage1/repositories
+ storage2:
+ path: /mnt/storage2/repositories
```
1. [Restart GitLab](restart_gitlab.md#installations-from-source) for the changes to take effect.
@@ -126,8 +129,8 @@ Edit `/etc/gitlab/gitlab.rb` by appending the rest of the paths to the default o
```ruby
git_data_dirs({
"default" => { "path" => "/var/opt/gitlab/git-data" },
- "nfs_1" => { "path" => "/mnt/nfs1/git-data" },
- "nfs_2" => { "path" => "/mnt/nfs2/git-data" }
+ "storage1" => { "path" => "/mnt/storage1/git-data" },
+ "storage2" => { "path" => "/mnt/storage2/git-data" }
})
```
@@ -153,6 +156,5 @@ often it is chosen. That is, `(storage weight) / (sum of all weights) * 100 = ch
## Move repositories
-To move a repository to a different repository path, use the
-[Project repository storage moves](../api/project_repository_storage_moves.md) API. Use
+To move a repository to a different repository path, use
the same process as [migrating existing repositories to Gitaly Cluster](gitaly/praefect.md#migrate-existing-repositories-to-gitaly-cluster).
diff --git a/doc/administration/repository_storage_types.md b/doc/administration/repository_storage_types.md
index a5c323be4ce..29e31fcb6ef 100644
--- a/doc/administration/repository_storage_types.md
+++ b/doc/administration/repository_storage_types.md
@@ -7,51 +7,53 @@ type: reference, howto
# Repository storage types **(FREE SELF)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/28283) in GitLab 10.0.
-> - Hashed storage became the default for new installations in GitLab 12.0
-> - Hashed storage is enabled by default for new and renamed projects in GitLab 13.0.
+GitLab can be configured to use one or multiple repository storages. These storages can be:
-GitLab can be configured to use one or multiple repository storage paths/shard
-locations that can be:
+- Accessed via [Gitaly](gitaly/index.md), optionally on
+ [its own server](gitaly/configure_gitaly.md#run-gitaly-on-its-own-server).
+- Mounted to the local disk. This [method](repository_storage_paths.md#configure-repository-storage-paths)
+ is deprecated and [scheduled to be removed](https://gitlab.com/groups/gitlab-org/-/epics/2320) in
+ GitLab 14.0.
+- Exposed as an NFS shared volume. This method is deprecated and
+ [scheduled to be removed](https://gitlab.com/groups/gitlab-org/-/epics/3371) in GitLab 14.0.
-- Mounted to the local disk
-- Exposed as an NFS shared volume
-- Accessed via [Gitaly](gitaly/index.md) on its own machine.
+In GitLab:
-In GitLab, this is configured in `/etc/gitlab/gitlab.rb` by the `git_data_dirs({})`
-configuration hash. The storage layouts discussed here apply to any shard
-defined in it.
+- Repository storages are configured in:
+ - `/etc/gitlab/gitlab.rb` by the `git_data_dirs({})` configuration hash for Omnibus GitLab
+ installations.
+ - `gitlab.yml` by the `repositories.storages` key for installations from source.
+- The `default` repository storage is available in any installations that haven't customized it. By
+ default, it points to a Gitaly node.
-The `default` repository shard that is available in any installations
-that haven't customized it, points to the local folder: `/var/opt/gitlab/git-data`.
-Anything discussed below is expected to be part of that folder.
+The repository storage types documented here apply to any repository storage defined in
+`git_data_dirs({})` or `repositories.storages`.
## Hashed storage
-NOTE:
-In GitLab 13.0, hashed storage is enabled by default and the legacy storage is
-deprecated. Support for legacy storage is scheduled to be removed in GitLab 14.0.
-If you haven't migrated yet, check the
-[migration instructions](raketasks/storage.md#migrate-to-hashed-storage).
-The option to choose between hashed and legacy storage in the admin area has
-been disabled.
-
-Hashed storage is the storage behavior we rolled out with 10.0. Instead
-of coupling project URL and the folder structure where the repository is
-stored on disk, we couple a hash based on the project's ID. This makes
-the folder structure immutable, and therefore eliminates any requirement to
-synchronize state from URLs to disk structure. This means that renaming a group,
-user, or project costs only the database transaction, and takes effect
-immediately.
-
-The hash also helps spread the repositories more evenly on the disk. The
-top-level directory contains fewer folders than the total number of top-level
-namespaces.
-
-The hash format is based on the hexadecimal representation of SHA256:
-`SHA256(project.id)`. The top-level folder uses the first 2 characters, followed
-by another folder with the next 2 characters. They are both stored in a special
-`@hashed` folder, to be able to co-exist with existing Legacy Storage projects:
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/28283) in GitLab 10.0.
+> - Made the default for new installations in GitLab 12.0.
+> - Enabled by default for new and renamed projects in GitLab 13.0.
+
+Hashed storage stores projects on disk in a location based on a hash of the project's ID. Hashed
+storage is different to [legacy storage](#legacy-storage) where a project is stored based on:
+
+- The project's URL.
+- The folder structure where the repository is stored on disk.
+
+This makes the folder structure immutable and eliminates the need to synchronize state from URLs to
+disk structure. This means that renaming a group, user, or project:
+
+- Costs only the database transaction.
+- Takes effect immediately.
+
+The hash also helps spread the repositories more evenly on the disk. The top-level directory
+contains fewer folders than the total number of top-level namespaces.
+
+The hash format is based on the hexadecimal representation of a SHA256, calculated with
+`SHA256(project.id)`. The top-level folder uses the first two characters, followed by another folder
+with the next two characters. They are both stored in a special `@hashed` folder so they can
+co-exist with existing legacy storage projects. For example:
```ruby
# Project's repository:
@@ -61,53 +63,59 @@ by another folder with the next 2 characters. They are both stored in a special
"@hashed/#{hash[0..1]}/#{hash[2..3]}/#{hash}.wiki.git"
```
-### Translating hashed storage paths
+### Translate hashed storage paths
+
+Troubleshooting problems with the Git repositories, adding hooks, and other tasks requires you
+translate between the human-readable project name and the hashed storage path. You can translate:
-Troubleshooting problems with the Git repositories, adding hooks, and other
-tasks requires you translate between the human readable project name
-and the hashed storage path.
+- From a [project's name to its hashed path](#from-project-name-to-hashed-path).
+- From a [hashed path to a project's name](#from-hashed-path-to-project-name).
#### From project name to hashed path
-The hashed path is shown on the project's page in the [admin area](../user/admin_area/index.md#administering-projects).
+Administrators can look up a project's hashed path from its name or ID using:
+
+- The [Admin area](../user/admin_area/index.md#administering-projects).
+- A Rails console.
+
+To look up a project's hash path in the Admin Area:
-To access the Projects page, go to **Admin Area > Overview > Projects** and then
-open up the page for the project.
+1. Go to the **Admin Area** (**{admin}**).
+1. Go to **Overview > Projects** and select the project.
-The "Gitaly relative path" is shown there, for example:
+The **Gitaly relative path** is displayed there and looks similar to:
```plaintext
"@hashed/b1/7e/b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9.git"
```
-This is the path under `/var/opt/gitlab/git-data/repositories/` on a
-default Omnibus installation.
+To look up a project's hash path using a Rails console:
-In a [Rails console](operations/rails_console.md#starting-a-rails-console-session),
-get this information using either the numeric project ID or the full path:
+1. Start a [Rails console](operations/rails_console.md#starting-a-rails-console-session).
+1. Run a command similar to this example (use either the project's ID or its name):
-```ruby
-Project.find(16).disk_path
-Project.find_by_full_path('group/project').disk_path
-```
+ ```ruby
+ Project.find(16).disk_path
+ Project.find_by_full_path('group/project').disk_path
+ ```
#### From hashed path to project name
-To translate from a hashed storage path to a project name:
+Administrators can look up a project's name from its hashed storage path using a Rails console. To
+look up a project's name from its hashed storage path:
1. Start a [Rails console](operations/rails_console.md#starting-a-rails-console-session).
-1. Run the following:
+1. Run a command similar to this example:
-```ruby
-ProjectRepository.find_by(disk_path: '@hashed/b1/7e/b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9').project
-```
+ ```ruby
+ ProjectRepository.find_by(disk_path: '@hashed/b1/7e/b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9').project
+ ```
-The quoted string in that command is the directory tree you can find on your
-GitLab server. For example, on a default Omnibus installation this would be
-`/var/opt/gitlab/git-data/repositories/@hashed/b1/7e/b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9.git`
+The quoted string in that command is the directory tree you can find on your GitLab server. For
+example, on a default Omnibus installation this would be `/var/opt/gitlab/git-data/repositories/@hashed/b1/7e/b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9.git`
with `.git` from the end of the directory name removed.
-The output includes the project ID and the project name:
+The output includes the project ID and the project name. For example:
```plaintext
=> #<Project id:16 it/supportteam/ticketsystem>
@@ -117,57 +125,61 @@ The output includes the project ID and the project name:
> [Introduced](https://gitlab.com/gitlab-org/gitaly/-/issues/1606) in GitLab 12.1.
-WARNING:
-Do not run `git prune` or `git gc` in pool repositories! This can
-cause data loss in "real" repositories that depend on the pool in
-question.
+Object pools are repositories used to deduplicate forks of public and internal projects and
+contain the objects from the source project. Using `objects/info/alternates`, the source project and
+forks use the object pool for shared objects. For more information, see
+[How Git object deduplication works in GitLab](../development/git_object_deduplication.md).
-Forks of public and internal projects are deduplicated by creating a third repository, the
-object pool, containing the objects from the source project. Using
-`objects/info/alternates`, the source project and forks use the object pool for
-shared objects. Objects are moved from the source project to the object pool
-when housekeeping is run on the source project.
+Objects are moved from the source project to the object pool when housekeeping is run on the source
+project. Object pool repositories are stored similarly to regular repositories:
```ruby
# object pool paths
"@pools/#{hash[0..1]}/#{hash[2..3]}/#{hash}.git"
```
-### Hashed storage coverage migration
-
-Files stored in an S3-compatible endpoint do not have the downsides
-mentioned earlier, if they are not prefixed with `#{namespace}/#{project_name}`.
-This is true for CI Cache and LFS Objects.
-
-In the table below, you can find the coverage of the migration to the hashed storage.
-
-| Storable Object | Legacy storage | Hashed storage | S3 Compatible | GitLab Version |
-| --------------- | -------------- | -------------- | ------------- | -------------- |
-| Repository | Yes | Yes | - | 10.0 |
-| Attachments | Yes | Yes | - | 10.2 |
-| Avatars | Yes | No | - | - |
-| Pages | Yes | No | - | - |
-| Docker Registry | Yes | No | - | - |
-| CI Build Logs | No | No | - | - |
-| CI Artifacts | No | No | Yes | 9.4 / 10.6 |
-| CI Cache | No | No | Yes | - |
-| LFS Objects | Yes | Similar | Yes | 10.0 / 10.7 |
-| Repository pools| No | Yes | - | 11.6 |
+WARNING:
+Do not run `git prune` or `git gc` in object pool repositories. This can cause data loss in the
+regular repositories that depend on the object pool.
+
+### Object storage support
+
+This table shows which storable objects are storable in each storage type:
+
+| Storable object | Legacy storage | Hashed storage | S3 compatible | GitLab version |
+|:-----------------|:---------------|:---------------|:--------------|:---------------|
+| Repository | Yes | Yes | - | 10.0 |
+| Attachments | Yes | Yes | - | 10.2 |
+| Avatars | Yes | No | - | - |
+| Pages | Yes | No | - | - |
+| Docker Registry | Yes | No | - | - |
+| CI/CD job logs | No | No | - | - |
+| CI/CD artifacts | No | No | Yes | 9.4 / 10.6 |
+| CI/CD cache | No | No | Yes | - |
+| LFS objects | Yes | Similar | Yes | 10.0 / 10.7 |
+| Repository pools | No | Yes | - | 11.6 |
+
+Files stored in an S3-compatible endpoint can have the same advantages as
+[hashed storage](#hashed-storage), as long as they are not prefixed with
+`#{namespace}/#{project_name}`. This is true for CI/CD cache and LFS objects.
#### Avatars
-Each file is stored in a folder with its `id` from the database. The filename is always `avatar.png` for user avatars.
-When avatar is replaced, `Upload` model is destroyed and a new one takes place with different `id`.
+Each file is stored in a directory that matches the `id` assigned to it in the database. The
+filename is always `avatar.png` for user avatars. When an avatar is replaced, the `Upload` model is
+destroyed and a new one takes place with a different `id`.
+
+#### CI/CD artifacts
-#### CI artifacts
+CI/CD artifacts are:
-CI Artifacts are S3 compatible since **9.4** (GitLab Premium), and available in GitLab Free since
-**10.6**.
+- S3-compatible since GitLab 9.4, initially available in [GitLab Premium](https://about.gitlab.com/pricing/).
+- Available in [GitLab Free](https://about.gitlab.com/pricing/) since GitLab 10.6.
#### LFS objects
[LFS Objects in GitLab](../topics/git/lfs/index.md) implement a similar
-storage pattern using 2 chars, 2 level folders, following Git's own implementation:
+storage pattern using two characters and two-level folders, following Git's own implementation:
```ruby
"shared/lfs-objects/#{oid[0..1}/#{oid[2..3]}/#{oid[4..-1]}"
@@ -176,40 +188,32 @@ storage pattern using 2 chars, 2 level folders, following Git's own implementati
"shared/lfs-objects/89/09/029eb962194cfb326259411b22ae3f4a814b5be4f80651735aeef9f3229c"
```
-LFS objects are also [S3 compatible](lfs/index.md#storing-lfs-objects-in-remote-object-storage).
+LFS objects are also [S3-compatible](lfs/index.md#storing-lfs-objects-in-remote-object-storage).
## Legacy storage
WARNING:
-In GitLab 13.0, hashed storage is enabled by default and the legacy storage is
-deprecated. If you haven't migrated yet, check the
-[migration instructions](raketasks/storage.md#migrate-to-hashed-storage).
-Support for legacy storage is scheduled to be removed in GitLab 14.0. If you're on GitLab
-13.0 and later, switching new projects to legacy storage is not possible.
-The option to choose between hashed and legacy storage in the admin area has
-been disabled.
-
-Legacy storage is the storage behavior prior to version 10.0. For historical
-reasons, GitLab replicated the same mapping structure from the projects URLs:
-
-- Project's repository: `#{namespace}/#{project_name}.git`
-- Project's wiki: `#{namespace}/#{project_name}.wiki.git`
-
-This structure enables you to migrate from existing solutions to GitLab, and
-for Administrators to find where the repository is stored.
-
-This approach also has some drawbacks:
-
-Storage location concentrates a huge number of top-level namespaces. The
-impact can be reduced by the introduction of
-[multiple storage paths](repository_storage_paths.md).
-
-Because backups are a snapshot of the same URL mapping, if you try to recover a
-very old backup, you need to verify whether any project has taken the place of
-an old removed or renamed project sharing the same URL. This means that
-`mygroup/myproject` from your backup may not be the same original project that
-is at that same URL today.
-
-Any change in the URL needs to be reflected on disk (when groups / users or
-projects are renamed). This can add a lot of load in big installations,
-especially if using any type of network based file system.
+In GitLab 13.0, legacy storage is deprecated. If you haven't migrated to hashed storage yet, check
+the [migration instructions](raketasks/storage.md#migrate-to-hashed-storage). Support for legacy
+storage is [scheduled to be removed](https://gitlab.com/gitlab-org/gitaly/-/issues/1690) in GitLab
+14.0. In GitLab 13.0 and later, switching new projects to legacy storage is not possible. The
+option to choose between hashed and legacy storage in the Admin Area is disabled.
+
+Legacy storage was the storage behavior prior to version GitLab 10.0. For historical reasons,
+GitLab replicated the same mapping structure from the projects URLs:
+
+- Project's repository: `#{namespace}/#{project_name}.git`.
+- Project's wiki: `#{namespace}/#{project_name}.wiki.git`.
+
+This structure enabled you to migrate from existing solutions to GitLab, and for Administrators to
+find where the repository was stored. This approach also had some drawbacks:
+
+- Storage location concentrated a large number of top-level namespaces. The impact could be
+ reduced by [multiple repository storage paths](repository_storage_paths.md).
+- Because backups were a snapshot of the same URL mapping, if you tried to recover a very old
+ backup, you needed to verify whether any project had taken the place of an old removed or renamed
+ project sharing the same URL. This meant that `mygroup/myproject` from your backup may not have
+ been the same original project that was at that same URL today.
+- Any change in the URL needed to be reflected on disk (when groups, users, or projects were
+ renamed. This could add a lot of load in big installations, especially if using any type of
+ network-based file system.
diff --git a/doc/administration/server_hooks.md b/doc/administration/server_hooks.md
index 93b899d5146..671da505e56 100644
--- a/doc/administration/server_hooks.md
+++ b/doc/administration/server_hooks.md
@@ -36,7 +36,7 @@ Note the following about server hooks:
- [Webhooks](../user/project/integrations/webhooks.md).
- [GitLab CI/CD](../ci/README.md).
- [Push Rules](../push_rules/push_rules.md), for a user-configurable Git hook
- interface. **(STARTER)**
+ interface.
- Server hooks aren't replicated to [Geo](geo/index.md) secondary nodes.
## Create a server hook for a repository
@@ -51,10 +51,10 @@ repository directory might not exactly match the instructions below. In that cas
Follow the steps below to set up a server-side hook for a repository:
-1. Navigate to **Admin area > Projects** and click on the project you want to add a server hook to.
+1. Go to **Admin area > Projects** and select the project you want to add a server hook to.
1. Locate the **Gitaly relative path** on the page that appears. This is where the server hook
must be implemented. For information on interpreting the relative path, see
- [Translating hashed storage paths](repository_storage_types.md#translating-hashed-storage-paths).
+ [Translate hashed storage paths](repository_storage_types.md#translate-hashed-storage-paths).
1. On the file system, create a new directory in this location called `custom_hooks`.
1. Inside the new `custom_hooks` directory, create a file with a name matching the hook type. For
example, for a pre-receive hook the filename should be `pre-receive` with no extension.
@@ -104,8 +104,6 @@ Now test the hook to check whether it is functioning properly.
## Chained hooks
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-shell/-/merge_requests/93) in GitLab Shell 4.1.0 and GitLab 8.15.
-
Server hooks set [per project](#create-a-server-hook-for-a-repository) or
[globally](#create-a-global-server-hook-for-all-repositories) can be executed in a chain.
@@ -128,7 +126,7 @@ Any other names are ignored.
Files in `.d` directories must be executable and not match the backup file pattern (`*~`).
-For `<project>.git` you need to [translate](repository_storage_types.md#translating-hashed-storage-paths)
+For `<project>.git` you need to [translate](repository_storage_types.md#translate-hashed-storage-paths)
your project name into the hashed storage format that GitLab uses.
## Environment Variables
@@ -158,8 +156,6 @@ them as they can change.
## Custom error messages
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/5073) in GitLab 8.10.
-
To have custom error messages appear in the GitLab UI when a commit is declined or an error occurs
during the Git hook, your script should:
diff --git a/doc/administration/static_objects_external_storage.md b/doc/administration/static_objects_external_storage.md
index 0f3dab743e9..fcd2bbc035f 100644
--- a/doc/administration/static_objects_external_storage.md
+++ b/doc/administration/static_objects_external_storage.md
@@ -5,7 +5,7 @@ info: "To determine the technical writer assigned to the Stage/Group associated
type: reference
---
-# Static objects external storage
+# Static objects external storage **(FREE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/31025) in GitLab 12.3.
@@ -16,7 +16,7 @@ from an external storage, such as a Content Delivery Network (CDN).
To configure external storage for static objects:
-1. Navigate to **Admin Area > Settings > Repository**.
+1. Go to **Admin Area > Settings > Repository**.
1. Expand the **Repository static objects** section.
1. Enter the base URL and an arbitrary token. When you [set up external storage](#set-up-external-storage),
use a script that sets these values as `ORIGIN_HOSTNAME` and `STORAGE_TOKEN`.
diff --git a/doc/administration/terraform_state.md b/doc/administration/terraform_state.md
index 6e5d6b274b6..0f3fdf4bb93 100644
--- a/doc/administration/terraform_state.md
+++ b/doc/administration/terraform_state.md
@@ -20,6 +20,33 @@ These locations can be configured using the options described below.
Use [external object storage](https://docs.gitlab.com/charts/advanced/external-object-storage/#lfs-artifacts-uploads-packages-external-diffs-pseudonymizer-terraform-state-dependency-proxy) configuration for [GitLab Helm chart](https://docs.gitlab.com/charts/) installations.
+## Disabling Terraform state
+
+To disable terraform state site-wide, follow the steps below.
+A GitLab administrator may want to disable Terraform state to reduce diskspace or if Terraform is not used in your instance.
+To do so, follow the steps below according to your installation's type.
+
+**In Omnibus installations:**
+
+1. Edit `/etc/gitlab/gitlab.rb` and add the following line:
+
+ ```ruby
+ gitlab_rails['terraform_state_enabled'] = false
+ ```
+
+1. Save the file and [reconfigure GitLab](restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
+
+**In installations from source:**
+
+1. Edit `/home/git/gitlab/config/gitlab.yml` and add or amend the following lines:
+
+ ```yaml
+ terraform_state:
+ enabled: false
+ ```
+
+1. Save the file and [restart GitLab](restart_gitlab.md#installations-from-source) for the changes to take effect.
+
## Using local storage
The default configuration uses local storage. To change the location where
@@ -121,7 +148,7 @@ See [the available connection settings for different providers](object_storage.m
remote_directory: "terraform" # The bucket name
connection:
provider: AWS # Only AWS supported at the moment
- aws_access_key_id: AWS_ACESS_KEY_ID
+ aws_access_key_id: AWS_ACCESS_KEY_ID
aws_secret_access_key: AWS_SECRET_ACCESS_KEY
region: eu-central-1
```
diff --git a/doc/administration/troubleshooting/debug.md b/doc/administration/troubleshooting/debug.md
index a6073e34d58..5a8ee1c5c94 100644
--- a/doc/administration/troubleshooting/debug.md
+++ b/doc/administration/troubleshooting/debug.md
@@ -255,7 +255,7 @@ separate Rails process to debug the issue:
### GitLab: API is not accessible
This often occurs when GitLab Shell attempts to request authorization via the
-internal API (e.g., `http://localhost:8080/api/v4/internal/allowed`), and
+[internal API](../../development/internal_api.md) (e.g., `http://localhost:8080/api/v4/internal/allowed`), and
something in the check fails. There are many reasons why this may happen:
1. Timeout connecting to a database (e.g., PostgreSQL or Redis)
@@ -271,8 +271,8 @@ strace -ttTfyyy -s 1024 -p <PID of unicorn worker> -o /tmp/unicorn.txt
```
If you cannot isolate which Unicorn worker is the issue, try to run `strace`
-on all the Unicorn workers to see where the `/internal/allowed` endpoint gets
-stuck:
+on all the Unicorn workers to see where the
+[`/internal/allowed`](../../development/internal_api.md) endpoint gets stuck:
```shell
ps auwx | grep unicorn | awk '{ print " -p " $2}' | xargs strace -ttTfyyy -s 1024 -o /tmp/unicorn.txt
diff --git a/doc/administration/troubleshooting/elasticsearch.md b/doc/administration/troubleshooting/elasticsearch.md
index 0f60c43ef9e..606697b5247 100644
--- a/doc/administration/troubleshooting/elasticsearch.md
+++ b/doc/administration/troubleshooting/elasticsearch.md
@@ -36,7 +36,7 @@ The type of problem will determine what steps to take. The possible troubleshoot
- Indexing.
- Integration.
- Performance.
-- Background Migrations.
+- Advanced Search Migrations.
### Search Results workflow
@@ -148,7 +148,7 @@ graph TD;
F7(Escalate to<br>GitLab support.)
```
-### Background Migrations workflow
+### Advanced Search Migrations workflow
```mermaid
graph TD;
@@ -180,7 +180,7 @@ Most Elasticsearch troubleshooting can be broken down into 4 categories:
- [Troubleshooting indexing](#troubleshooting-indexing)
- [Troubleshooting integration](#troubleshooting-integration)
- [Troubleshooting performance](#troubleshooting-performance)
-- [Troubleshooting background migrations](#troubleshooting-background-migrations)
+- [Troubleshooting Advanced Search migrations](#troubleshooting-advanced-search-migrations)
Generally speaking, if it does not fall into those four categories, it is either:
@@ -294,7 +294,7 @@ Beyond that, you will want to review the error. If it is:
GitLab support.
- An OS issue, you will want to reach out to your systems administrator.
- A `Faraday::TimeoutError (execution expired)` error **and** you're using a proxy,
- [set a custom `gitlab_rails['env']` environment variable, called `no_proxy`](https://docs.gitlab.com/omnibus/settings/environment-variables.html)
+ [set a custom `gitlab_rails['env']` environment variable, called `no_proxy`](https://docs.gitlab.com/omnibus/settings/environment-variables.html)
with the IP address of your Elasticsearch host.
### Troubleshooting performance
@@ -356,15 +356,16 @@ dig further into these.
Feel free to reach out to GitLab support, but this is likely to be something a skilled
Elasticsearch administrator has more experience with.
-### Troubleshooting background migrations
+### Troubleshooting Advanced Search migrations
-Troubleshooting background migration failures can be difficult and may require contacting
-an Elasticsearch administrator or GitLab Support.
+Troubleshooting Advanced Search migration failures can be difficult and may
+require contacting an Elasticsearch administrator or GitLab Support.
-The best place to start while debugging issues with a background migration is the
-[`elasticsearch.log` file](../logs.md#elasticsearchlog). Migrations will
-print information while a migration is in progress and any errors encountered.
-Apply fixes for any errors found in the log and retry the migration.
+The best place to start while debugging issues with an Advanced Search
+migration is the [`elasticsearch.log` file](../logs.md#elasticsearchlog).
+Migrations will log information while a migration is in progress and any
+errors encountered. Apply fixes for any errors found in the log and retry
+the migration.
If you still encounter issues after retrying the migration, reach out to GitLab support.
diff --git a/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md b/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md
index 55e707042ba..69eb639a8db 100644
--- a/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md
+++ b/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md
@@ -1045,6 +1045,67 @@ project = Project.find_by_full_path('<group/project>')
Geo::RepositorySyncService.new(project).execute
```
+### Blob types newer than uploads/artifacts/LFS
+
+- `Packages::PackageFile`
+- `Terraform::StateVersion`
+- `MergeRequestDiff`
+
+`Packages::PackageFile` is used in the following examples, but things generally work the same for the other Blob types.
+
+#### The Replicator
+
+The main kinds of classes are Registry, Model, and Replicator. If you have an instance of one of these classes, you can get the others. The Registry and Model mostly manage PostgreSQL DB state. The Replicator knows how to replicate/verify (or it can call a service to do it):
+
+```ruby
+model_record = Packages::PackageFile.last
+model_record.replicator.registry.replicator.model_record # just showing that these methods exist
+```
+
+#### Replicate a package file, synchronously, given an ID
+
+```ruby
+model_record = Packages::PackageFile.find(id)
+model_record.replicator.send(:download)
+```
+
+#### Replicate a package file, synchronously, given a registry ID
+
+```ruby
+registry = Geo::PackageFileRegistry.find(registry_id)
+registry.replicator.send(:download)
+```
+
+### Repository types newer than project/wiki repositories
+
+- `SnippetRepository`
+- `GroupWikiRepository`
+
+`SnippetRepository` is used in the examples below, but things generally work the same for the other Repository types.
+
+#### The Replicator
+
+The main kinds of classes are Registry, Model, and Replicator. If you have an instance of one of these classes, you can get the others. The Registry and Model mostly manage PostgreSQL DB state. The Replicator knows how to replicate/verify (or it can call a service to do it).
+
+```ruby
+model_record = SnippetRepository.last
+model_record.replicator.registry.replicator.model_record # just showing that these methods exist
+```
+
+#### Replicate a snippet repository, synchronously, given an ID
+
+```ruby
+model_record = SnippetRepository.find(id)
+model_record.replicator.send(:sync_repository)
+```
+
+#### Replicate a snippet repository, synchronously, given a registry ID
+
+```ruby
+registry = Geo::SnippetRepositoryRegistry.find(registry_id)
+registry.replicator.send(:sync_repository)
+```
+
### Generate usage ping
#### Generate or get the cached usage ping
diff --git a/doc/administration/troubleshooting/log_parsing.md b/doc/administration/troubleshooting/log_parsing.md
index 25300d036ed..2900ce58940 100644
--- a/doc/administration/troubleshooting/log_parsing.md
+++ b/doc/administration/troubleshooting/log_parsing.md
@@ -41,6 +41,20 @@ jq -cR 'fromjson?' file.json | jq <COMMAND>
By default `jq` will error out when it encounters a line that is not valid JSON.
This skips over all invalid lines and parses the rest.
+#### Print a JSON log's time range
+
+```shell
+cat log.json | (head -1; tail -1) | jq '.time'
+```
+
+Use `zcat` if the file has been rotated and compressed:
+
+```shell
+zcat @400000006026b71d1a7af804.s | (head -1; tail -1) | jq '.time'
+
+zcat some_json.log.25.gz | (head -1; tail -1) | jq '.time'
+```
+
### Parsing `production_json.log` and `api_json.log`
#### Find all requests with a 5XX status code
diff --git a/doc/administration/uploads.md b/doc/administration/uploads.md
index d3a9777775f..949687cfa0a 100644
--- a/doc/administration/uploads.md
+++ b/doc/administration/uploads.md
@@ -146,7 +146,7 @@ _The uploads are stored by default in
remote_directory: "uploads" # The bucket name
connection:
provider: AWS # Only AWS supported at the moment
- aws_access_key_id: AWS_ACESS_KEY_ID
+ aws_access_key_id: AWS_ACCESS_KEY_ID
aws_secret_access_key: AWS_SECRET_ACCESS_KEY
region: eu-central-1
```
diff --git a/doc/api/README.md b/doc/api/README.md
index d6119fbfa43..35eeb5ae99b 100644
--- a/doc/api/README.md
+++ b/doc/api/README.md
@@ -21,6 +21,10 @@ Contributions are welcome.
For a list of the available resources and their endpoints, see
[API resources](api_resources.md).
+<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
+For an introduction and basic steps, see
+[How to make GitLab API calls](https://www.youtube.com/watch?v=0LsMC3ZiXkA).
+
## SCIM **(PREMIUM SAAS)**
GitLab provides an [SCIM API](scim.md) that both implements
@@ -200,17 +204,11 @@ With a few API endpoints you can use a [GitLab CI/CD job token](../user/project/
to authenticate with the API:
- Packages:
- - [Package Registry for Composer](../user/packages/composer_repository/index.md)
- - [Package Registry for Conan](../user/packages/conan_repository/index.md)
+ - [Package Registry](../user/packages/package_registry/index.md)
- [Container Registry](../user/packages/container_registry/index.md)
(`$CI_REGISTRY_PASSWORD` is `$CI_JOB_TOKEN`)
- - [Go Proxy](../user/packages/go_proxy/index.md)
- - [Package Registry for Maven](../user/packages/maven_repository/index.md#authenticate-with-a-ci-job-token-in-maven)
- - [Package Registry for npm](../user/packages/npm_registry/index.md#authenticate-with-a-ci-job-token)
- - [Package Registry for NuGet](../user/packages/nuget_repository/index.md)
- - [Package Registry for PyPI](../user/packages/pypi_repository/index.md#authenticate-with-a-ci-job-token)
- - [Package Registry for generic packages](../user/packages/generic_packages/index.md#publish-a-generic-package-by-using-cicd)
- [Get job artifacts](job_artifacts.md#get-job-artifacts)
+- [Get job token's job](jobs.md#get-job-tokens-job)
- [Pipeline triggers](pipeline_triggers.md) (using the `token=` parameter)
- [Release creation](releases/index.md#create-a-release)
- [Terraform plan](../user/infrastructure/index.md)
@@ -750,7 +748,7 @@ specifically used by GitLab.com, see
The GitLab API supports the `application/json` content type by default, though
some API endpoints also support `text/plain`.
-In [GitLab 13.9 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/250342),
+In [GitLab 13.10 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/250342),
API endpoints do not support `text/plain` by default, unless it's explicitly documented.
This change is deployed behind the `:api_always_use_application_json` [feature flag](../user/feature_flags.md),
diff --git a/doc/api/api_resources.md b/doc/api/api_resources.md
index ebe856715a6..b14d28d6ec0 100644
--- a/doc/api/api_resources.md
+++ b/doc/api/api_resources.md
@@ -146,6 +146,7 @@ The following API resources are available outside of project and group contexts
| [Instance clusters](instance_clusters.md) | `/admin/clusters` |
| [Issues](issues.md) | `/issues` (also available for groups and projects) |
| [Issues Statistics](issues_statistics.md) | `/issues_statistics` (also available for groups and projects) |
+| [Jobs](jobs.md) | `/job` |
| [Keys](keys.md) | `/keys` |
| [License](license.md) **(FREE SELF)** | `/license` |
| [Markdown](markdown.md) | `/markdown` |
@@ -154,6 +155,7 @@ The following API resources are available outside of project and group contexts
| [Namespaces](namespaces.md) | `/namespaces` |
| [Notification settings](notification_settings.md) | `/notification_settings` (also available for groups and projects) |
| [Pages domains](pages_domains.md) | `/pages/domains` (also available for projects) |
+| [Plan limits](plan_limits.md) | `/application/plan_limits` |
| [Personal access tokens](personal_access_tokens.md) | `/personal_access_tokens` |
| [Projects](projects.md) | `/users/:id/projects` (also available for projects) |
| [Project repository storage moves](project_repository_storage_moves.md) **(FREE SELF)** | `/project_repository_storage_moves` |
diff --git a/doc/api/branches.md b/doc/api/branches.md
index e9e27a358f0..2fb9997bdca 100644
--- a/doc/api/branches.md
+++ b/doc/api/branches.md
@@ -210,10 +210,10 @@ curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://git
## Delete merged branches
-Will delete all branches that are merged into the project's default branch.
+Deletes all branches that are merged into the project's default branch.
NOTE:
-[Protected branches](../user/project/protected_branches.md) will not be deleted as part of this operation.
+[Protected branches](../user/project/protected_branches.md) are not deleted as part of this operation.
```plaintext
DELETE /projects/:id/repository/merged_branches
diff --git a/doc/api/commits.md b/doc/api/commits.md
index f4896f75c93..117f949aba0 100644
--- a/doc/api/commits.md
+++ b/doc/api/commits.md
@@ -21,11 +21,11 @@ GET /projects/:id/repository/commits
| --------- | ---- | -------- | ----------- |
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user
| `ref_name` | string | no | The name of a repository branch, tag or revision range, or if not given the default branch |
-| `since` | string | no | Only commits after or on this date will be returned in ISO 8601 format YYYY-MM-DDTHH:MM:SSZ |
-| `until` | string | no | Only commits before or on this date will be returned in ISO 8601 format YYYY-MM-DDTHH:MM:SSZ |
+| `since` | string | no | Only commits after or on this date are returned in ISO 8601 format `YYYY-MM-DDTHH:MM:SSZ` |
+| `until` | string | no | Only commits before or on this date are returned in ISO 8601 format `YYYY-MM-DDTHH:MM:SSZ` |
| `path` | string | no | The file path |
| `all` | boolean | no | Retrieve every commit from the repository |
-| `with_stats` | boolean | no | Stats about each commit will be added to the response |
+| `with_stats` | boolean | no | Stats about each commit are added to the response |
| `first_parent` | boolean | no | Follow only the first parent commit upon seeing a merge commit |
| `order` | string | no | List commits in order. Possible values: `default`, [`topo`](https://git-scm.com/docs/git-log#Documentation/git-log.txt---topo-order). Defaults to `default`, the commits are shown in reverse chronological order. |
@@ -101,9 +101,9 @@ POST /projects/:id/repository/commits
| `action` | string | yes | The action to perform, `create`, `delete`, `move`, `update`, `chmod`|
| `file_path` | string | yes | Full path to the file. Ex. `lib/class.rb` |
| `previous_path` | string | no | Original full path to the file being moved. Ex. `lib/class1.rb`. Only considered for `move` action. |
-| `content` | string | no | File content, required for all except `delete`, `chmod`, and `move`. Move actions that do not specify `content` will preserve the existing file content, and any other value of `content` will overwrite the file content. |
+| `content` | string | no | File content, required for all except `delete`, `chmod`, and `move`. Move actions that do not specify `content` preserve the existing file content, and any other value of `content` overwrites the file content. |
| `encoding` | string | no | `text` or `base64`. `text` is default. |
-| `last_commit_id` | string | no | Last known file commit ID. Will be only considered in update, move, and delete actions. |
+| `last_commit_id` | string | no | Last known file commit ID. Only considered in update, move, and delete actions. |
| `execute_filemode` | boolean | no | When `true/false` enables/disables the execute flag on the file. Only considered for `chmod` action. |
```shell
@@ -333,7 +333,7 @@ Example response:
}
```
-In the event of a failed cherry-pick, the response will provide context about
+In the event of a failed cherry-pick, the response provides context about
why:
```json
@@ -348,9 +348,9 @@ indicates that the commit already exists in the target branch. The other
possible error code is `conflict`, which indicates that there was a merge
conflict.
-When `dry_run` is enabled, the server will attempt to apply the cherry-pick _but
+When `dry_run` is enabled, the server attempts to apply the cherry-pick _but
not actually commit any resulting changes_. If the cherry-pick applies cleanly,
-the API will respond with `200 OK`:
+the API responds with `200 OK`:
```json
{
@@ -358,7 +358,7 @@ the API will respond with `200 OK`:
}
```
-In the event of a failure, you'll see an error identical to a failure without
+In the event of a failure, an error displays that is identical to a failure without
dry run.
## Revert a commit
@@ -404,7 +404,7 @@ Example response:
}
```
-In the event of a failed revert, the response will provide context about why:
+In the event of a failed revert, the response provides context about why:
```json
{
@@ -417,9 +417,9 @@ In this case, the revert failed because the attempted revert generated a merge
conflict. The other possible error code is `empty`, which indicates that the
changeset was empty, likely due to the change having already been reverted.
-When `dry_run` is enabled, the server will attempt to apply the revert _but not
+When `dry_run` is enabled, the server attempts to apply the revert _but not
actually commit any resulting changes_. If the revert applies cleanly, the API
-will respond with `200 OK`:
+responds with `200 OK`:
```json
{
@@ -427,7 +427,7 @@ will respond with `200 OK`:
}
```
-In the event of a failure, you'll see an error identical to a failure without
+In the event of a failure, an error displays that is identical to a failure without
dry run.
## Get the diff of a commit
@@ -511,7 +511,7 @@ In order to post a comment in a particular line of a particular file, you must
specify the full commit SHA, the `path`, the `line` and `line_type` should be
`new`.
-The comment will be added at the end of the last commit if at least one of the
+The comment is added at the end of the last commit if at least one of the
cases below is valid:
- the `sha` is instead a branch or a tag and the `line` or `path` are invalid
diff --git a/doc/api/deployments.md b/doc/api/deployments.md
index b8865ecc614..32d3ab55f9f 100644
--- a/doc/api/deployments.md
+++ b/doc/api/deployments.md
@@ -22,7 +22,7 @@ GET /projects/:id/deployments
| `sort` | string | no | Return deployments sorted in `asc` or `desc` order. Default is `asc` |
| `updated_after` | datetime | no | Return deployments updated after the specified date. Expected in ISO 8601 format (`2019-03-15T08:00:00Z`) |
| `updated_before` | datetime | no | Return deployments updated before the specified date. Expected in ISO 8601 format (`2019-03-15T08:00:00Z`) |
-| `environment` | string | no | The [name of the environment](../ci/environments/index.md#defining-environments) to filter deployments by |
+| `environment` | string | no | The [name of the environment](../ci/environments/index.md) to filter deployments by |
| `status` | string | no | The status to filter deployments by |
The status attribute can be one of the following values:
@@ -281,7 +281,7 @@ POST /projects/:id/deployments
| Attribute | Type | Required | Description |
|---------------|----------------|----------|-----------------------------------------------------------------------------------------------------------------|
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
-| `environment` | string | yes | The [name of the environment](../ci/environments/index.md#defining-environments) to create the deployment for |
+| `environment` | string | yes | The [name of the environment](../ci/environments/index.md) to create the deployment for |
| `sha` | string | yes | The SHA of the commit that is deployed |
| `ref` | string | yes | The name of the branch or tag that is deployed |
| `tag` | boolean | yes | A boolean that indicates if the deployed ref is a tag (true) or not (false) |
diff --git a/doc/api/discussions.md b/doc/api/discussions.md
index d88d4780e65..938b74d420d 100644
--- a/doc/api/discussions.md
+++ b/doc/api/discussions.md
@@ -15,7 +15,7 @@ Discussions are a set of related notes on:
- Merge requests
- Commits
-This includes system notes, which are notes about changes to the object (for example, when a milestone changes, there will be a corresponding system note). Label notes are not part of this API, but recorded as separate events in [resource label events](resource_label_events.md).
+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).
## Discussions pagination
@@ -839,7 +839,7 @@ a note but other comments (replies) can be added to it later.
POST /projects/:id/merge_requests/:merge_request_iid/discussions
```
-Parameters:
+Parameters for all comments:
| Attribute | Type | Required | Description |
| ---------------------------------------- | -------------- | -------- | ----------- |
@@ -858,21 +858,28 @@ Parameters:
| `position[old_path]` | string | no | File path before change |
| `position[old_line]` | integer | no | Line number before change (for 'text' diff notes) |
| `position[line_range]` | hash | no | Line range for a multi-line diff note |
-| `position[line_range][start]` | hash | no | Multiline note starting line |
-| `position[line_range][start][line_code]` | string | yes | Line code for the start line |
-| `position[line_range][start][type]` | string | yes | Line type for the start line |
-| `position[line_range][end]` | hash | no | Multiline note ending line |
-| `position[line_range][end][line_code]` | string | yes | Line code for the end line |
-| `position[line_range][end][type]` | string | yes | Line type for the end line |
| `position[width]` | integer | no | Width of the image (for 'image' diff notes) |
| `position[height]` | integer | no | Height of the image (for 'image' diff notes) |
| `position[x]` | integer | no | X coordinate (for 'image' diff notes) |
| `position[y]` | integer | no | Y coordinate (for 'image' diff notes) |
+Parameters for multiline comments only:
+
+| Attribute | Type | Required | Description |
+| ---------------------------------------- | -------------- | -------- | ----------- |
+| `position[line_range][start]` | hash | no | Multiline note starting line |
+| `position[line_range][start][line_code]` | string | no | Line code for the start line |
+| `position[line_range][start][type]` | string | no | Line type for the start line |
+| `position[line_range][end]` | hash | no | Multiline note ending line |
+| `position[line_range][end][line_code]` | string | no | Line code for the end line |
+| `position[line_range][end][type]` | string | no | Line type for the end line |
+
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/merge_requests/11/discussions?body=comment"
```
+There is currently no functional documented method of starting merge request discussions. Read [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/228807) for reflections.
+
### Resolve a merge request thread
Resolve/unresolve whole thread of a merge request.
diff --git a/doc/api/dora4_group_analytics.md b/doc/api/dora4_group_analytics.md
index 7a7260f40e8..7504d18a5de 100644
--- a/doc/api/dora4_group_analytics.md
+++ b/doc/api/dora4_group_analytics.md
@@ -5,13 +5,13 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: reference, api
---
-# DORA4 Analytics Group API **(ULTIMATE ONLY)**
+# DORA4 Analytics Group API **(ULTIMATE SELF)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/291747) in GitLab 13.9.
> - It's [deployed behind a feature flag](../user/feature_flags.md), disabled by default.
> - It's disabled on GitLab.com.
> - It's not recommended for production use.
-> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-dora4-analytics-group-api). **(ULTIMATE ONLY)**
+> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-dora4-analytics-group-api). **(ULTIMATE SELF)**
WARNING:
This feature might not be available to you. Check the **version history** note above for details.
@@ -64,7 +64,7 @@ Example response:
]
```
-## Enable or disable DORA4 Analytics Group API **(ULTIMATE ONLY)**
+## Enable or disable DORA4 Analytics Group API **(ULTIMATE SELF)**
DORA4 Analytics Group API is under development and not ready for production use. It is
deployed behind a feature flag that is **disabled by default**.
diff --git a/doc/api/dora4_project_analytics.md b/doc/api/dora4_project_analytics.md
index a1becb056bf..43250d88701 100644
--- a/doc/api/dora4_project_analytics.md
+++ b/doc/api/dora4_project_analytics.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: reference, api
---
-# DORA4 Analytics Project API **(ULTIMATE ONLY)**
+# DORA4 Analytics Project API **(ULTIMATE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/279039) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.7.
diff --git a/doc/api/feature_flags.md b/doc/api/feature_flags.md
index 77d30475555..59f20e66ae8 100644
--- a/doc/api/feature_flags.md
+++ b/doc/api/feature_flags.md
@@ -149,7 +149,7 @@ POST /projects/:id/feature_flags
| `description` | string | no | The description of the feature flag. |
| `active` | boolean | no | The active state of the flag. Defaults to true. [Supported](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/38350) in GitLab 13.3 and later. |
| `strategies` | JSON | no | The feature flag [strategies](../operations/feature_flags.md#feature-flag-strategies). |
-| `strategies:name` | JSON | no | The strategy name. Can be `default`, `gradualRolloutUserId`, `userWithId`, or `gitlabUserList`. In [GitLab 13.5](https://gitlab.com/gitlab-org/gitlab/-/issues/36380) and later, can be [`flexibleRollout`](https://unleash.github.io/docs/activation_strategy#flexiblerollout). |
+| `strategies:name` | JSON | no | The strategy name. Can be `default`, `gradualRolloutUserId`, `userWithId`, or `gitlabUserList`. In [GitLab 13.5](https://gitlab.com/gitlab-org/gitlab/-/issues/36380) and later, can be [`flexibleRollout`](https://docs.getunleash.io/docs/activation_strategy#flexiblerollout). |
| `strategies:parameters` | JSON | no | The strategy parameters. |
| `strategies:scopes` | JSON | no | The scopes for the strategy. |
| `strategies:scopes:environment_scope` | string | no | The environment spec for the scope. |
diff --git a/doc/api/geo_nodes.md b/doc/api/geo_nodes.md
index a2417af5285..0401680b016 100644
--- a/doc/api/geo_nodes.md
+++ b/doc/api/geo_nodes.md
@@ -383,7 +383,12 @@ Example response:
"snippet_repositories_checksum_failed_count": 0,
"snippet_repositories_registry_count": 10,
"snippet_repositories_synced_count": 6,
- "snippet_repositories_failed_count": 3
+ "snippet_repositories_failed_count": 3,
+ "group_wiki_repositories_checksummed_count": 10,
+ "group_wiki_repositories_checksum_failed_count": 0,
+ "group_wiki_repositories_registry_count": 10,
+ "group_wiki_repositories_synced_count": 6,
+ "group_wiki_repositories_failed_count": 3
},
{
"geo_node_id": 2,
@@ -477,7 +482,12 @@ Example response:
"snippet_repositories_checksum_failed_count": 0,
"snippet_repositories_registry_count": 10,
"snippet_repositories_synced_count": 6,
- "snippet_repositories_failed_count": 3
+ "snippet_repositories_failed_count": 3,
+ "group_wiki_repositories_checksummed_count": 10,
+ "group_wiki_repositories_checksum_failed_count": 0,
+ "group_wiki_repositories_registry_count": 10,
+ "group_wiki_repositories_synced_count": 6,
+ "group_wiki_repositories_failed_count": 3
}
]
```
diff --git a/doc/api/graphql/index.md b/doc/api/graphql/index.md
index 7a68b1cdf16..7bbc2029d96 100644
--- a/doc/api/graphql/index.md
+++ b/doc/api/graphql/index.md
@@ -65,27 +65,49 @@ There are no plans to deprecate the REST API. To reduce the technical burden of
supporting two APIs in parallel, they should share implementations as much as
possible.
-### Deprecation process
+## Breaking changes
-Fields marked for removal from the GitLab GraphQL API are first **deprecated** but still available
-for at least six releases, and then **removed entirely**.
-Removals occur at X.0 and X.6 releases.
+The GitLab GraphQL API is [versionless](https://graphql.org/learn/best-practices/#versioning) and
+changes are made to the API in a way that maintains backwards-compatibility.
-For example, a field can be marked as deprecated (but still usable) in %12.7, but can be used until its removal in %13.6.
-When marked as deprecated, an alternative should be provided if there is one.
-That gives consumers of the GraphQL API a minimum of six months to update their GraphQL queries.
+Occassionally GitLab needs to change the GraphQL API in a way that is not backwards-compatible.
+These changes include the removal or renaming of fields, arguments or other parts of the schema.
-The process is as follows:
+In these situations, GitLab follows a [Deprecation and removal process](#deprecation-and-removal-process)
+where the deprecated part of the schema is supported for a period of time before being removed.
-1. The field is listed as deprecated in [GraphQL API Reference](reference/index.md).
-1. Removals are announced at least one release prior in the Deprecation Warnings section of the
- release post (at or prior to X.11 and X.5 releases).
-1. Fields meeting criteria are removed in X.0 or X.6.
+Clients should familiarize themselves with the process to avoid breaking changes affecting their integrations.
NOTE:
Fields behind a feature flag and disabled by default are exempt from the deprecation process,
and can be removed at any time without notice.
+### Deprecation and Removal process
+
+Parts of the schema marked for removal from the GitLab GraphQL API are first **deprecated** but still available
+for at least six releases, and then **removed entirely**.
+Removals occur at `X.0` and `X.6` releases.
+
+The process is as follows:
+
+1. The item is marked as deprecated in the schema. It will be displayed as deprecated in the
+ [GraphQL API Reference](reference/index.md) and in introspection queries.
+1. Removals are announced at least one release prior in the [Deprecations](https://about.gitlab.com/handbook/marketing/blog/release-posts/#deprecations)
+ section of the release post (at or prior to `X.11` and `X.5` releases).
+ release post (at or prior to `X.11` and `X.5` releases).
+1. Items meeting criteria are removed in `X.0` or `X.6` and added to:
+
+ - The [Removals](https://about.gitlab.com/handbook/marketing/blog/release-posts/#removals) section of the Release Post.
+ - The [Removed items page](removed_items.md).
+
+This gives consumers of the GraphQL API a minimum of six months to update their GraphQL queries.
+
+When an item is deprecated or removed, an alternative is provided if available.
+
+**Example:**
+
+A field marked as deprecated in `12.7` can be used until its removal in `13.6`.
+
### List of removed items
View the [fields, enums, and other items we removed](removed_items.md) from the GraphQL API.
@@ -147,6 +169,7 @@ In general, each field in a query will add `1` to the complexity score, although
this can be higher or lower for particular fields. Sometimes the addition of
certain arguments may also increase the complexity of a query.
+NOTE:
The complexity limits may be revised in future, and additionally, the complexity
of a query may be altered.
@@ -160,11 +183,6 @@ The GitLab GraphQL reference [is available](reference/index.md).
It is automatically generated from the GitLab GraphQL schema and embedded in a Markdown file.
-Machine-readable versions are also available:
-
-- [JSON format](reference/gitlab_schema.json)
-- [IDL format](reference/gitlab_schema.graphql)
-
## Generate updates for documentation
If you've changed the GraphQL schema, you should set up an MR to gain approval of your changes.
diff --git a/doc/api/graphql/reference/gitlab_schema.graphql b/doc/api/graphql/reference/gitlab_schema.graphql
deleted file mode 100644
index 4e89f663efc..00000000000
--- a/doc/api/graphql/reference/gitlab_schema.graphql
+++ /dev/null
@@ -1,29539 +0,0 @@
-"""
-Represents the access level of a relationship between a User and object that it is related to
-"""
-type AccessLevel {
- """
- Integer representation of access level.
- """
- integerValue: Int
-
- """
- String representation of access level.
- """
- stringValue: AccessLevelEnum
-}
-
-"""
-Access level to a resource
-"""
-enum AccessLevelEnum {
- DEVELOPER
- GUEST
- MAINTAINER
- NO_ACCESS
- OWNER
- REPORTER
-}
-
-"""
-Autogenerated input type of AddAwardEmoji
-"""
-input AddAwardEmojiInput {
- """
- The global ID of the awardable resource.
- """
- awardableId: AwardableID!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The emoji name.
- """
- name: String!
-}
-
-"""
-Autogenerated return type of AddAwardEmoji
-"""
-type AddAwardEmojiPayload {
- """
- The award emoji after mutation.
- """
- awardEmoji: AwardEmoji
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of AddProjectToSecurityDashboard
-"""
-input AddProjectToSecurityDashboardInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the project to be added to Instance Security Dashboard.
- """
- id: ProjectID!
-}
-
-"""
-Autogenerated return type of AddProjectToSecurityDashboard
-"""
-type AddProjectToSecurityDashboardPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Project that was added to the Instance Security Dashboard.
- """
- project: Project
-}
-
-"""
-Autogenerated input type of AdminSidekiqQueuesDeleteJobs
-"""
-input AdminSidekiqQueuesDeleteJobsInput {
- """
- Delete jobs matching caller_id in the context metadata
- """
- callerId: String
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Delete jobs matching feature_category in the context metadata
- """
- featureCategory: String
-
- """
- Delete jobs matching project in the context metadata
- """
- project: String
-
- """
- The name of the queue to delete jobs from.
- """
- queueName: String!
-
- """
- Delete jobs matching related_class in the context metadata
- """
- relatedClass: String
-
- """
- Delete jobs matching remote_ip in the context metadata
- """
- remoteIp: String
-
- """
- Delete jobs matching root_namespace in the context metadata
- """
- rootNamespace: String
-
- """
- Delete jobs matching subscription_plan in the context metadata
- """
- subscriptionPlan: String
-
- """
- Delete jobs matching user in the context metadata
- """
- user: String
-}
-
-"""
-Autogenerated return type of AdminSidekiqQueuesDeleteJobs
-"""
-type AdminSidekiqQueuesDeleteJobsPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Information about the status of the deletion request.
- """
- result: DeleteJobsResponse
-}
-
-"""
-Describes an alert from the project's Alert Management
-"""
-type AlertManagementAlert implements Noteable {
- """
- Assignees of the alert.
- """
- assignees(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): UserConnection
-
- """
- Timestamp the alert was created.
- """
- createdAt: Time
-
- """
- Description of the alert.
- """
- description: String
-
- """
- Alert details.
- """
- details: JSON
-
- """
- The URL of the alert detail page.
- """
- detailsUrl: String!
-
- """
- All discussions on this noteable.
- """
- discussions(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DiscussionConnection!
-
- """
- Timestamp the alert ended.
- """
- endedAt: Time
-
- """
- Environment for the alert.
- """
- environment: Environment
-
- """
- Number of events of this alert.
- """
- eventCount: Int
-
- """
- List of hosts the alert came from.
- """
- hosts: [String!]
-
- """
- Internal ID of the alert.
- """
- iid: ID!
-
- """
- Internal ID of the GitLab issue attached to the alert.
- """
- issueIid: ID
-
- """
- URL for metrics embed for the alert.
- """
- metricsDashboardUrl: String
-
- """
- Monitoring tool the alert came from.
- """
- monitoringTool: String
-
- """
- All notes on this noteable.
- """
- notes(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): NoteConnection!
-
- """
- The alert condition for Prometheus.
- """
- prometheusAlert: PrometheusAlert
-
- """
- Runbook for the alert as defined in alert details.
- """
- runbook: String
-
- """
- Service the alert came from.
- """
- service: String
-
- """
- Severity of the alert.
- """
- severity: AlertManagementSeverity
-
- """
- Timestamp the alert was raised.
- """
- startedAt: Time
-
- """
- Status of the alert.
- """
- status: AlertManagementStatus
-
- """
- Title of the alert.
- """
- title: String
-
- """
- To-do items of the current user for the alert.
- """
- todos(
- """
- The action to be filtered.
- """
- action: [TodoActionEnum!]
-
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- The ID of an author.
- """
- authorId: [ID!]
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- The ID of a group.
- """
- groupId: [ID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- The ID of a project.
- """
- projectId: [ID!]
-
- """
- The state of the todo.
- """
- state: [TodoStateEnum!]
-
- """
- The type of the todo.
- """
- type: [TodoTargetEnum!]
- ): TodoConnection
-
- """
- Timestamp the alert was last updated.
- """
- updatedAt: Time
-}
-
-"""
-The connection type for AlertManagementAlert.
-"""
-type AlertManagementAlertConnection {
- """
- A list of edges.
- """
- edges: [AlertManagementAlertEdge]
-
- """
- A list of nodes.
- """
- nodes: [AlertManagementAlert]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type AlertManagementAlertEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: AlertManagementAlert
-}
-
-"""
-Values for sorting alerts
-"""
-enum AlertManagementAlertSort {
- """
- Created at ascending order
- """
- CREATED_ASC
-
- """
- Created at descending order
- """
- CREATED_DESC
-
- """
- Created time by ascending order
- """
- CREATED_TIME_ASC
-
- """
- Created time by descending order
- """
- CREATED_TIME_DESC
-
- """
- End time by ascending order
- """
- ENDED_AT_ASC
-
- """
- End time by descending order
- """
- ENDED_AT_DESC
-
- """
- Events count by ascending order
- """
- EVENT_COUNT_ASC
-
- """
- Events count by descending order
- """
- EVENT_COUNT_DESC
-
- """
- Severity from less critical to more critical
- """
- SEVERITY_ASC
-
- """
- Severity from more critical to less critical
- """
- SEVERITY_DESC
-
- """
- Start time by ascending order
- """
- STARTED_AT_ASC
-
- """
- Start time by descending order
- """
- STARTED_AT_DESC
-
- """
- Status by order: Ignored > Resolved > Acknowledged > Triggered
- """
- STATUS_ASC
-
- """
- Status by order: Triggered > Acknowledged > Resolved > Ignored
- """
- STATUS_DESC
-
- """
- Updated at ascending order
- """
- UPDATED_ASC
-
- """
- Updated at descending order
- """
- UPDATED_DESC
-
- """
- Created time by ascending order
- """
- UPDATED_TIME_ASC
-
- """
- Created time by descending order
- """
- UPDATED_TIME_DESC
-
- """
- Created at ascending order
- """
- created_asc @deprecated(reason: "Use CREATED_ASC. Deprecated in 13.5.")
-
- """
- Created at descending order
- """
- created_desc @deprecated(reason: "Use CREATED_DESC. Deprecated in 13.5.")
-
- """
- Updated at ascending order
- """
- updated_asc @deprecated(reason: "Use UPDATED_ASC. Deprecated in 13.5.")
-
- """
- Updated at descending order
- """
- updated_desc @deprecated(reason: "Use UPDATED_DESC. Deprecated in 13.5.")
-}
-
-"""
-Represents total number of alerts for the represented categories
-"""
-type AlertManagementAlertStatusCountsType {
- """
- Number of alerts with status ACKNOWLEDGED for the project
- """
- acknowledged: Int
-
- """
- Total number of alerts for the project.
- """
- all: Int
-
- """
- Number of alerts with status IGNORED for the project
- """
- ignored: Int
-
- """
- Number of alerts with status TRIGGERED or ACKNOWLEDGED for the project.
- """
- open: Int
-
- """
- Number of alerts with status RESOLVED for the project
- """
- resolved: Int
-
- """
- Number of alerts with status TRIGGERED for the project
- """
- triggered: Int
-}
-
-"""
-Filters the alerts based on given domain
-"""
-enum AlertManagementDomainFilter {
- """
- Alerts for operations domain
- """
- operations
-
- """
- Alerts for threat monitoring domain
- """
- threat_monitoring
-}
-
-"""
-An endpoint and credentials used to accept alerts for a project
-"""
-type AlertManagementHttpIntegration implements AlertManagementIntegration {
- """
- Whether the endpoint is currently accepting alerts.
- """
- active: Boolean
-
- """
- URL at which Prometheus metrics can be queried to populate the metrics dashboard.
- """
- apiUrl: String
-
- """
- ID of the integration.
- """
- id: ID!
-
- """
- Name of the integration.
- """
- name: String
-
- """
- Token used to authenticate alert notification requests.
- """
- token: String
-
- """
- Type of integration.
- """
- type: AlertManagementIntegrationType!
-
- """
- Endpoint which accepts alert notifications.
- """
- url: String
-}
-
-"""
-Identifier of AlertManagement::HttpIntegration.
-"""
-scalar AlertManagementHttpIntegrationID
-
-interface AlertManagementIntegration {
- """
- Whether the endpoint is currently accepting alerts.
- """
- active: Boolean
-
- """
- URL at which Prometheus metrics can be queried to populate the metrics dashboard.
- """
- apiUrl: String
-
- """
- ID of the integration.
- """
- id: ID!
-
- """
- Name of the integration.
- """
- name: String
-
- """
- Token used to authenticate alert notification requests.
- """
- token: String
-
- """
- Type of integration.
- """
- type: AlertManagementIntegrationType!
-
- """
- Endpoint which accepts alert notifications.
- """
- url: String
-}
-
-"""
-The connection type for AlertManagementIntegration.
-"""
-type AlertManagementIntegrationConnection {
- """
- A list of edges.
- """
- edges: [AlertManagementIntegrationEdge]
-
- """
- A list of nodes.
- """
- nodes: [AlertManagementIntegration]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type AlertManagementIntegrationEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: AlertManagementIntegration
-}
-
-"""
-Values of types of integrations
-"""
-enum AlertManagementIntegrationType {
- """
- Integration with any monitoring tool
- """
- HTTP
-
- """
- Prometheus integration
- """
- PROMETHEUS
-}
-
-"""
-Parsed field from an alert used for custom mappings
-"""
-type AlertManagementPayloadAlertField {
- """
- Human-readable label of the payload path.
- """
- label: String
-
- """
- Path to value inside payload JSON.
- """
- path: [String!]
-
- """
- Type of the parsed value.
- """
- type: AlertManagementPayloadAlertFieldType
-}
-
-"""
-Field that are available while modifying the custom mapping attributes for an HTTP integration
-"""
-input AlertManagementPayloadAlertFieldInput {
- """
- A GitLab alert field name.
- """
- fieldName: AlertManagementPayloadAlertFieldName!
-
- """
- Human-readable label of the payload path.
- """
- label: String
-
- """
- Path to value inside payload JSON.
- """
- path: [String!]!
-
- """
- Type of the parsed value.
- """
- type: AlertManagementPayloadAlertFieldType!
-}
-
-"""
-Values for alert field names used in the custom mapping
-"""
-enum AlertManagementPayloadAlertFieldName {
- """
- A high-level summary of the problem.
- """
- DESCRIPTION
-
- """
- The resolved time of the incident.
- """
- END_TIME
-
- """
- The unique identifier of the alert. This can be used to group occurrences of the same alert.
- """
- FINGERPRINT
-
- """
- The name of the associated GitLab environment.
- """
- GITLAB_ENVIRONMENT_NAME
-
- """
- One or more hosts, as to where this incident occurred.
- """
- HOSTS
-
- """
- The name of the associated monitoring tool.
- """
- MONITORING_TOOL
-
- """
- The affected service.
- """
- SERVICE
-
- """
- The severity of the alert.
- """
- SEVERITY
-
- """
- The time of the incident.
- """
- START_TIME
-
- """
- The title of the incident.
- """
- TITLE
-}
-
-"""
-Values for alert field types used in the custom mapping
-"""
-enum AlertManagementPayloadAlertFieldType {
- """
- Array field type
- """
- ARRAY
-
- """
- DateTime field type
- """
- DATETIME
-
- """
- String field type
- """
- STRING
-}
-
-"""
-An endpoint and credentials used to accept Prometheus alerts for a project
-"""
-type AlertManagementPrometheusIntegration implements AlertManagementIntegration {
- """
- Whether the endpoint is currently accepting alerts.
- """
- active: Boolean
-
- """
- URL at which Prometheus metrics can be queried to populate the metrics dashboard.
- """
- apiUrl: String
-
- """
- ID of the integration.
- """
- id: ID!
-
- """
- Name of the integration.
- """
- name: String
-
- """
- Token used to authenticate alert notification requests.
- """
- token: String
-
- """
- Type of integration.
- """
- type: AlertManagementIntegrationType!
-
- """
- Endpoint which accepts alert notifications.
- """
- url: String
-}
-
-"""
-Alert severity values
-"""
-enum AlertManagementSeverity {
- """
- Critical severity
- """
- CRITICAL
-
- """
- High severity
- """
- HIGH
-
- """
- Info severity
- """
- INFO
-
- """
- Low severity
- """
- LOW
-
- """
- Medium severity
- """
- MEDIUM
-
- """
- Unknown severity
- """
- UNKNOWN
-}
-
-"""
-Alert status values
-"""
-enum AlertManagementStatus {
- """
- Acknowledged status
- """
- ACKNOWLEDGED
-
- """
- Ignored status
- """
- IGNORED
-
- """
- Resolved status
- """
- RESOLVED
-
- """
- Triggered status
- """
- TRIGGERED
-}
-
-"""
-Autogenerated input type of AlertSetAssignees
-"""
-input AlertSetAssigneesInput {
- """
- The usernames to assign to the alert. Replaces existing assignees by default.
- """
- assigneeUsernames: [String!]!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the alert to mutate.
- """
- iid: String!
-
- """
- The operation to perform. Defaults to REPLACE.
- """
- operationMode: MutationOperationMode
-
- """
- The project the alert to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of AlertSetAssignees
-"""
-type AlertSetAssigneesPayload {
- """
- The alert after mutation.
- """
- alert: AlertManagementAlert
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue created after mutation.
- """
- issue: Issue
-
- """
- The to-do item after mutation.
- """
- todo: Todo
-}
-
-"""
-Autogenerated input type of AlertTodoCreate
-"""
-input AlertTodoCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the alert to mutate.
- """
- iid: String!
-
- """
- The project the alert to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of AlertTodoCreate
-"""
-type AlertTodoCreatePayload {
- """
- The alert after mutation.
- """
- alert: AlertManagementAlert
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue created after mutation.
- """
- issue: Issue
-
- """
- The to-do item after mutation.
- """
- todo: Todo
-}
-
-"""
-Identifier of Analytics::DevopsAdoption::Segment.
-"""
-scalar AnalyticsDevopsAdoptionSegmentID
-
-"""
-Data associated with configuring API fuzzing scans in GitLab CI
-"""
-type ApiFuzzingCiConfiguration {
- """
- All available scan modes.
- """
- scanModes: [ApiFuzzingScanMode!]
-
- """
- All default scan profiles.
- """
- scanProfiles: [ApiFuzzingScanProfile!]
-}
-
-"""
-Autogenerated input type of ApiFuzzingCiConfigurationCreate
-"""
-input ApiFuzzingCiConfigurationCreateInput {
- """
- File path or URL to the file that defines the API surface for scanning. Must
- be in the format specified by the `scanMode` argument.
- """
- apiSpecificationFile: String!
-
- """
- CI variable containing the password for authenticating with the target API.
- """
- authPassword: String
-
- """
- CI variable containing the username for authenticating with the target API.
- """
- authUsername: String
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Full path of the project.
- """
- projectPath: ID!
-
- """
- The mode for API fuzzing scans.
- """
- scanMode: ApiFuzzingScanMode!
-
- """
- Name of a default profile to use for scanning. Ex: Quick-10.
- """
- scanProfile: String
-
- """
- URL for the target of API fuzzing scans.
- """
- target: String!
-}
-
-"""
-Autogenerated return type of ApiFuzzingCiConfigurationCreate
-"""
-type ApiFuzzingCiConfigurationCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- A YAML snippet that can be inserted into the project's `.gitlab-ci.yml` to set up API fuzzing scans.
- """
- configurationYaml: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The location at which the project's `.gitlab-ci.yml` file can be edited in the browser.
- """
- gitlabCiYamlEditPath: String
-}
-
-"""
-All possible ways to specify the API surface for an API fuzzing scan
-"""
-enum ApiFuzzingScanMode {
- """
- The API surface is specified by a HAR file.
- """
- HAR
-
- """
- The API surface is specified by a OPENAPI file.
- """
- OPENAPI
-}
-
-"""
-An API Fuzzing scan profile.
-"""
-type ApiFuzzingScanProfile {
- """
- A short description of the profile.
- """
- description: String
-
- """
- The unique name of the profile.
- """
- name: String
-
- """
- A syntax highlit HTML representation of the YAML.
- """
- yaml: String
-}
-
-"""
-User availability status
-"""
-enum AvailabilityEnum {
- """
- Busy
- """
- BUSY
-
- """
- Not Set
- """
- NOT_SET
-}
-
-"""
-An emoji awarded by a user
-"""
-type AwardEmoji {
- """
- The emoji description.
- """
- description: String!
-
- """
- The emoji as an icon.
- """
- emoji: String!
-
- """
- The emoji name.
- """
- name: String!
-
- """
- The emoji in Unicode.
- """
- unicode: String!
-
- """
- The Unicode version for this emoji.
- """
- unicodeVersion: String!
-
- """
- The user who awarded the emoji.
- """
- user: User!
-}
-
-"""
-Autogenerated input type of AwardEmojiAdd
-"""
-input AwardEmojiAddInput {
- """
- The global ID of the awardable resource.
- """
- awardableId: AwardableID!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The emoji name.
- """
- name: String!
-}
-
-"""
-Autogenerated return type of AwardEmojiAdd
-"""
-type AwardEmojiAddPayload {
- """
- The award emoji after mutation.
- """
- awardEmoji: AwardEmoji
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-The connection type for AwardEmoji.
-"""
-type AwardEmojiConnection {
- """
- A list of edges.
- """
- edges: [AwardEmojiEdge]
-
- """
- A list of nodes.
- """
- nodes: [AwardEmoji]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type AwardEmojiEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: AwardEmoji
-}
-
-"""
-Autogenerated input type of AwardEmojiRemove
-"""
-input AwardEmojiRemoveInput {
- """
- The global ID of the awardable resource.
- """
- awardableId: AwardableID!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The emoji name.
- """
- name: String!
-}
-
-"""
-Autogenerated return type of AwardEmojiRemove
-"""
-type AwardEmojiRemovePayload {
- """
- The award emoji after mutation.
- """
- awardEmoji: AwardEmoji
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of AwardEmojiToggle
-"""
-input AwardEmojiToggleInput {
- """
- The global ID of the awardable resource.
- """
- awardableId: AwardableID!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The emoji name.
- """
- name: String!
-}
-
-"""
-Autogenerated return type of AwardEmojiToggle
-"""
-type AwardEmojiTogglePayload {
- """
- The award emoji after mutation.
- """
- awardEmoji: AwardEmoji
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Indicates the status of the emoji. True if the toggle awarded the emoji, and false if the toggle removed the emoji.
- """
- toggledOn: Boolean!
-}
-
-"""
-Identifier of Awardable.
-"""
-scalar AwardableID
-
-type BaseService implements Service {
- """
- Indicates if the service is active.
- """
- active: Boolean
-
- """
- Class name of the service.
- """
- type: String
-}
-
-"""
-Represents non-fractional signed whole numeric values. Since the value may
-exceed the size of a 32-bit integer, it's encoded as a string.
-"""
-scalar BigInt
-
-type Blob implements Entry {
- """
- Flat path of the entry.
- """
- flatPath: String!
-
- """
- ID of the entry.
- """
- id: ID!
-
- """
- LFS ID of the blob.
- """
- lfsOid: String
-
- """
- Blob mode in numeric format.
- """
- mode: String
-
- """
- Name of the entry.
- """
- name: String!
-
- """
- Path of the entry.
- """
- path: String!
-
- """
- Last commit SHA for the entry.
- """
- sha: String!
-
- """
- Type of tree entry.
- """
- type: EntryType!
-
- """
- Web path of the blob.
- """
- webPath: String
-
- """
- Web URL of the blob.
- """
- webUrl: String
-}
-
-"""
-The connection type for Blob.
-"""
-type BlobConnection {
- """
- A list of edges.
- """
- edges: [BlobEdge]
-
- """
- A list of nodes.
- """
- nodes: [Blob]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type BlobEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Blob
-}
-
-"""
-Types of blob viewers
-"""
-enum BlobViewersType {
- auxiliary
- rich
- simple
-}
-
-"""
-Represents a project or group board
-"""
-type Board {
- """
- The board assignee.
- """
- assignee: User
-
- """
- Epics associated with board issues.
- """
- epics(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Filters applied when selecting issues on the board.
- """
- issueFilters: BoardIssueInput
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): BoardEpicConnection
-
- """
- Whether or not backlog list is hidden.
- """
- hideBacklogList: Boolean
-
- """
- Whether or not closed list is hidden.
- """
- hideClosedList: Boolean
-
- """
- ID (global ID) of the board.
- """
- id: ID!
-
- """
- The board iteration.
- """
- iteration: Iteration
-
- """
- Labels of the board.
- """
- labels(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): LabelConnection
-
- """
- Lists of the board.
- """
- lists(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Find a list by its global ID.
- """
- id: ListID
-
- """
- Filters applied when getting issue metadata in the board list.
- """
- issueFilters: BoardIssueInput
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): BoardListConnection
-
- """
- The board milestone.
- """
- milestone: Milestone
-
- """
- Name of the board.
- """
- name: String
-
- """
- Web path of the board.
- """
- webPath: String!
-
- """
- Web URL of the board.
- """
- webUrl: String!
-
- """
- Weight of the board.
- """
- weight: Int
-}
-
-"""
-The connection type for Board.
-"""
-type BoardConnection {
- """
- A list of edges.
- """
- edges: [BoardEdge]
-
- """
- A list of nodes.
- """
- nodes: [Board]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type BoardEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Board
-}
-
-"""
-Represents an epic on an issue board
-"""
-type BoardEpic implements CurrentUserTodos & Eventable & Noteable {
- """
- Author of the epic.
- """
- author: User!
-
- """
- A list of award emojis associated with the epic.
- """
- awardEmoji(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): AwardEmojiConnection
-
- """
- Children (sub-epics) of the epic.
- """
- children(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Filter epics by author.
- """
- authorUsername: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Filter epics by given confidentiality.
- """
- confidential: Boolean
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.
- """
- endDate: Time
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- IID of the epic, e.g., "1".
- """
- iid: ID
-
- """
- Filter epics by IID for autocomplete.
- """
- iidStartsWith: String
-
- """
- List of IIDs of epics, e.g., [1, 2].
- """
- iids: [ID!]
-
- """
- Include epics from descendant groups.
- """
- includeDescendantGroups: Boolean = true
-
- """
- Filter epics by labels.
- """
- labelName: [String!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter epics by milestone title, computed from epic's issues.
- """
- milestoneTitle: String
-
- """
- Search query for epic title or description.
- """
- search: String
-
- """
- List epics by sort order.
- """
- sort: EpicSort
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use
- timeframe.start.
- """
- startDate: Time
-
- """
- Filter epics by state.
- """
- state: EpicState
-
- """
- List items overlapping the given timeframe.
- """
- timeframe: Timeframe
- ): EpicConnection
-
- """
- Timestamp of when the epic was closed.
- """
- closedAt: Time
-
- """
- Indicates if the epic is confidential.
- """
- confidential: Boolean
-
- """
- Timestamp of when the epic was created.
- """
- createdAt: Time
-
- """
- To-do items for the current user.
- """
- currentUserTodos(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- State of the to-do items.
- """
- state: TodoStateEnum
- ): TodoConnection!
-
- """
- Number of open and closed descendant epics and issues.
- """
- descendantCounts: EpicDescendantCount
-
- """
- Total weight of open and closed issues in the epic and its descendants.
- """
- descendantWeightSum: EpicDescendantWeights
-
- """
- Description of the epic.
- """
- description: String
-
- """
- All discussions on this noteable.
- """
- discussions(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DiscussionConnection!
-
- """
- Number of downvotes the epic has received.
- """
- downvotes: Int!
-
- """
- Due date of the epic.
- """
- dueDate: Time
-
- """
- Fixed due date of the epic.
- """
- dueDateFixed: Time
-
- """
- Inherited due date of the epic from milestones.
- """
- dueDateFromMilestones: Time
-
- """
- Indicates if the due date has been manually set.
- """
- dueDateIsFixed: Boolean
-
- """
- A list of events associated with the object.
- """
- events(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): EventConnection
-
- """
- Group to which the epic belongs.
- """
- group: Group!
-
- """
- Indicates if the epic has children.
- """
- hasChildren: Boolean!
-
- """
- Indicates if the epic has direct issues.
- """
- hasIssues: Boolean!
-
- """
- Indicates if the epic has a parent epic.
- """
- hasParent: Boolean!
-
- """
- Current health status of the epic.
- """
- healthStatus: EpicHealthStatus
-
- """
- ID of the epic.
- """
- id: ID!
-
- """
- Internal ID of the epic.
- """
- iid: ID!
-
- """
- A list of issues associated with the epic.
- """
- issues(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): EpicIssueConnection
-
- """
- Labels assigned to the epic.
- """
- labels(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): LabelConnection
-
- """
- All notes on this noteable.
- """
- notes(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): NoteConnection!
-
- """
- Parent epic of the epic.
- """
- parent: Epic
-
- """
- List of participants for the epic.
- """
- participants(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): UserConnection
-
- """
- Internal reference of the epic. Returned in shortened format by default.
- """
- reference(
- """
- Indicates if the reference should be returned in full.
- """
- full: Boolean = false
- ): String!
-
- """
- URI path of the epic-issue relationship.
- """
- relationPath: String
-
- """
- The relative position of the epic in the epic tree.
- """
- relativePosition: Int
-
- """
- Start date of the epic.
- """
- startDate: Time
-
- """
- Fixed start date of the epic.
- """
- startDateFixed: Time
-
- """
- Inherited start date of the epic from milestones.
- """
- startDateFromMilestones: Time
-
- """
- Indicates if the start date has been manually set.
- """
- startDateIsFixed: Boolean
-
- """
- State of the epic.
- """
- state: EpicState!
-
- """
- Indicates the currently logged in user is subscribed to the epic.
- """
- subscribed: Boolean!
-
- """
- Title of the epic.
- """
- title: String
-
- """
- Timestamp of when the epic was updated.
- """
- updatedAt: Time
-
- """
- Number of upvotes the epic has received.
- """
- upvotes: Int!
-
- """
- Number of user discussions in the epic.
- """
- userDiscussionsCount: Int!
-
- """
- Number of user notes of the epic.
- """
- userNotesCount: Int!
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: EpicPermissions!
-
- """
- User preferences for the epic on the issue board.
- """
- userPreferences: BoardEpicUserPreferences
-
- """
- Web path of the epic.
- """
- webPath: String!
-
- """
- Web URL of the epic.
- """
- webUrl: String!
-}
-
-"""
-The connection type for BoardEpic.
-"""
-type BoardEpicConnection {
- """
- A list of edges.
- """
- edges: [BoardEpicEdge]
-
- """
- A list of nodes.
- """
- nodes: [BoardEpic]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type BoardEpicEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: BoardEpic
-}
-
-"""
-Represents user preferences for a board epic
-"""
-type BoardEpicUserPreferences {
- """
- Indicates epic should be displayed as collapsed.
- """
- collapsed: Boolean!
-}
-
-"""
-Identifier of Board.
-"""
-scalar BoardID
-
-input BoardIssueInput {
- """
- Filter by assignee username.
- """
- assigneeUsername: [String]
-
- """
- Filter by author username.
- """
- authorUsername: String
-
- """
- Filter by epic ID. Incompatible with epicWildcardId.
- """
- epicId: EpicID
-
- """
- Filter by epic ID wildcard. Incompatible with epicId.
- """
- epicWildcardId: EpicWildcardId
-
- """
- Filter by iteration title.
- """
- iterationTitle: String
-
- """
- Filter by iteration ID wildcard.
- """
- iterationWildcardId: IterationWildcardId
-
- """
- Filter by label name.
- """
- labelName: [String]
-
- """
- Filter by milestone title.
- """
- milestoneTitle: String
-
- """
- Filter by reaction emoji.
- """
- myReactionEmoji: String
-
- """
- List of negated params. Warning: this argument is experimental and a subject to change in future.
- """
- not: NegatedBoardIssueInput
-
- """
- Filter by release tag.
- """
- releaseTag: String
-
- """
- Search query for issue title or description.
- """
- search: String
-
- """
- Filter by weight.
- """
- weight: String
-}
-
-"""
-Represents a list for an issue board
-"""
-type BoardList {
- """
- Assignee in the list.
- """
- assignee: User
-
- """
- Indicates if list is collapsed for this user.
- """
- collapsed: Boolean
-
- """
- ID (global ID) of the list.
- """
- id: ID!
-
- """
- Board issues.
- """
- issues(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Filters applied when selecting issues in the board list.
- """
- filters: BoardIssueInput
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): IssueConnection
-
- """
- Count of issues in the list.
- """
- issuesCount: Int
-
- """
- Iteration of the list.
- """
- iteration: Iteration
-
- """
- Label of the list.
- """
- label: Label
-
- """
- The current limit metric for the list.
- """
- limitMetric: ListLimitMetric
-
- """
- Type of the list.
- """
- listType: String!
-
- """
- Maximum number of issues in the list.
- """
- maxIssueCount: Int
-
- """
- Maximum weight of issues in the list.
- """
- maxIssueWeight: Int
-
- """
- Milestone of the list.
- """
- milestone: Milestone
-
- """
- Position of list within the board.
- """
- position: Int
-
- """
- Title of the list.
- """
- title: String!
-
- """
- Total weight of all issues in the list.
- """
- totalWeight: Int
-}
-
-"""
-The connection type for BoardList.
-"""
-type BoardListConnection {
- """
- A list of edges.
- """
- edges: [BoardListEdge]
-
- """
- A list of nodes.
- """
- nodes: [BoardList]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of BoardListCreate
-"""
-input BoardListCreateInput {
- """
- Global ID of an existing user.
- """
- assigneeId: UserID
-
- """
- Create the backlog list.
- """
- backlog: Boolean
-
- """
- Global ID of the issue board to mutate.
- """
- boardId: BoardID!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Global ID of an existing iteration.
- """
- iterationId: IterationID
-
- """
- Global ID of an existing label.
- """
- labelId: LabelID
-
- """
- Global ID of an existing milestone.
- """
- milestoneId: MilestoneID
-}
-
-"""
-Autogenerated return type of BoardListCreate
-"""
-type BoardListCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Issue list in the issue board.
- """
- list: BoardList
-}
-
-"""
-An edge in a connection.
-"""
-type BoardListEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: BoardList
-}
-
-"""
-Autogenerated input type of BoardListUpdateLimitMetrics
-"""
-input BoardListUpdateLimitMetricsInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The new limit metric type for the list.
- """
- limitMetric: ListLimitMetric
-
- """
- The global ID of the list.
- """
- listId: ListID!
-
- """
- The new maximum issue count limit.
- """
- maxIssueCount: Int
-
- """
- The new maximum issue weight limit.
- """
- maxIssueWeight: Int
-}
-
-"""
-Autogenerated return type of BoardListUpdateLimitMetrics
-"""
-type BoardListUpdateLimitMetricsPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The updated list.
- """
- list: BoardList
-}
-
-"""
-Identifier of Boards::EpicBoard.
-"""
-scalar BoardsEpicBoardID
-
-"""
-Identifier of Boards::EpicList.
-"""
-scalar BoardsEpicListID
-
-type Branch {
- """
- Commit for the branch.
- """
- commit: Commit
-
- """
- Name of the branch.
- """
- name: String!
-}
-
-"""
-Represents the total number of issues and their weights for a particular day
-"""
-type BurnupChartDailyTotals {
- """
- Number of closed issues as of this day.
- """
- completedCount: Int!
-
- """
- Total weight of closed issues as of this day.
- """
- completedWeight: Int!
-
- """
- Date for burnup totals.
- """
- date: ISO8601Date!
-
- """
- Number of issues as of this day.
- """
- scopeCount: Int!
-
- """
- Total weight of issues as of this day.
- """
- scopeWeight: Int!
-}
-
-type CiApplicationSettings {
- """
- Whether to keep the latest jobs artifacts.
- """
- keepLatestArtifact: Boolean
-}
-
-type CiBuildNeed {
- """
- Name of the job we need to complete.
- """
- name: String
-}
-
-"""
-The connection type for CiBuildNeed.
-"""
-type CiBuildNeedConnection {
- """
- A list of edges.
- """
- edges: [CiBuildNeedEdge]
-
- """
- A list of nodes.
- """
- nodes: [CiBuildNeed]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type CiBuildNeedEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: CiBuildNeed
-}
-
-"""
-Autogenerated input type of CiCdSettingsUpdate
-"""
-input CiCdSettingsUpdateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Full Path of the project the settings belong to.
- """
- fullPath: ID!
-
- """
- Indicates if the latest artifact should be kept for this project.
- """
- keepLatestArtifact: Boolean
-}
-
-"""
-Autogenerated return type of CiCdSettingsUpdate
-"""
-type CiCdSettingsUpdatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-type CiConfig {
- """
- Linting errors.
- """
- errors: [String!]
-
- """
- Merged CI configuration YAML.
- """
- mergedYaml: String
-
- """
- Stages of the pipeline.
- """
- stages(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): CiConfigStageConnection
-
- """
- Status of linting, can be either valid or invalid.
- """
- status: CiConfigStatus
-}
-
-type CiConfigGroup {
- """
- Jobs in group.
- """
- jobs(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): CiConfigJobConnection
-
- """
- Name of the job group.
- """
- name: String
-
- """
- Size of the job group.
- """
- size: Int
-}
-
-"""
-The connection type for CiConfigGroup.
-"""
-type CiConfigGroupConnection {
- """
- A list of edges.
- """
- edges: [CiConfigGroupEdge]
-
- """
- A list of nodes.
- """
- nodes: [CiConfigGroup]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type CiConfigGroupEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: CiConfigGroup
-}
-
-type CiConfigJob {
- """
- Override a set of commands that are executed after the job.
- """
- afterScript: [String!]
-
- """
- Allow job to fail.
- """
- allowFailure: Boolean
-
- """
- Override a set of commands that are executed before the job.
- """
- beforeScript: [String!]
-
- """
- Name of an environment to which the job deploys.
- """
- environment: String
-
- """
- Limit when jobs are not created.
- """
- except: CiConfigJobRestriction
-
- """
- Name of the job group.
- """
- groupName: String
-
- """
- Name of the job.
- """
- name: String
-
- """
- Builds that must complete before the jobs run.
- """
- needs(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): CiConfigNeedConnection
-
- """
- Jobs are created when these conditions do not apply.
- """
- only: CiConfigJobRestriction
-
- """
- Shell script that is executed by a runner.
- """
- script: [String!]
-
- """
- Name of the job stage.
- """
- stage: String
-
- """
- List of tags that are used to select a runner.
- """
- tags: [String!]
-
- """
- When to run the job.
- """
- when: String
-}
-
-"""
-The connection type for CiConfigJob.
-"""
-type CiConfigJobConnection {
- """
- A list of edges.
- """
- edges: [CiConfigJobEdge]
-
- """
- A list of nodes.
- """
- nodes: [CiConfigJob]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type CiConfigJobEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: CiConfigJob
-}
-
-type CiConfigJobRestriction {
- """
- The Git refs the job restriction applies to.
- """
- refs: [String!]
-}
-
-type CiConfigNeed {
- """
- Name of the need.
- """
- name: String
-}
-
-"""
-The connection type for CiConfigNeed.
-"""
-type CiConfigNeedConnection {
- """
- A list of edges.
- """
- edges: [CiConfigNeedEdge]
-
- """
- A list of nodes.
- """
- nodes: [CiConfigNeed]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type CiConfigNeedEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: CiConfigNeed
-}
-
-type CiConfigStage {
- """
- Groups of jobs for the stage.
- """
- groups(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): CiConfigGroupConnection
-
- """
- Name of the stage.
- """
- name: String
-}
-
-"""
-The connection type for CiConfigStage.
-"""
-type CiConfigStageConnection {
- """
- A list of edges.
- """
- edges: [CiConfigStageEdge]
-
- """
- A list of nodes.
- """
- nodes: [CiConfigStage]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type CiConfigStageEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: CiConfigStage
-}
-
-"""
-Values for YAML processor result
-"""
-enum CiConfigStatus {
- """
- The configuration file is not valid
- """
- INVALID
-
- """
- The configuration file is valid
- """
- VALID
-}
-
-type CiGroup {
- """
- Detailed status of the group.
- """
- detailedStatus: DetailedStatus
-
- """
- Jobs in group.
- """
- jobs(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): CiJobConnection
-
- """
- Name of the job group.
- """
- name: String
-
- """
- Size of the group.
- """
- size: Int
-}
-
-"""
-The connection type for CiGroup.
-"""
-type CiGroupConnection {
- """
- A list of edges.
- """
- edges: [CiGroupEdge]
-
- """
- A list of nodes.
- """
- nodes: [CiGroup]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type CiGroupEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: CiGroup
-}
-
-type CiJob {
- """
- Artifacts generated by the job.
- """
- artifacts(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): CiJobArtifactConnection
-
- """
- Detailed status of the job.
- """
- detailedStatus: DetailedStatus
-
- """
- Name of the job.
- """
- name: String
-
- """
- References to builds that must complete before the jobs run.
- """
- needs(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): CiBuildNeedConnection
-
- """
- Pipeline the job belongs to.
- """
- pipeline: Pipeline
-
- """
- Schedule for the build.
- """
- scheduledAt: Time
-}
-
-type CiJobArtifact {
- """
- URL for downloading the artifact's file.
- """
- downloadPath: String
-
- """
- File type of the artifact.
- """
- fileType: JobArtifactFileType
-}
-
-"""
-The connection type for CiJobArtifact.
-"""
-type CiJobArtifactConnection {
- """
- A list of edges.
- """
- edges: [CiJobArtifactEdge]
-
- """
- A list of nodes.
- """
- nodes: [CiJobArtifact]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type CiJobArtifactEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: CiJobArtifact
-}
-
-"""
-The connection type for CiJob.
-"""
-type CiJobConnection {
- """
- A list of edges.
- """
- edges: [CiJobEdge]
-
- """
- A list of nodes.
- """
- nodes: [CiJob]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type CiJobEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: CiJob
-}
-
-"""
-Identifier of Ci::Pipeline.
-"""
-scalar CiPipelineID
-
-type CiStage {
- """
- Detailed status of the stage.
- """
- detailedStatus: DetailedStatus
-
- """
- Group of jobs for the stage.
- """
- groups(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): CiGroupConnection
-
- """
- Name of the stage.
- """
- name: String
-}
-
-"""
-The connection type for CiStage.
-"""
-type CiStageConnection {
- """
- A list of edges.
- """
- edges: [CiStageEdge]
-
- """
- A list of nodes.
- """
- nodes: [CiStage]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type CiStageEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: CiStage
-}
-
-type ClusterAgent {
- """
- Timestamp the cluster agent was created.
- """
- createdAt: Time
-
- """
- User object, containing information about the person who created the agent.
- """
- createdByUser: User
-
- """
- ID of the cluster agent.
- """
- id: ID!
-
- """
- Name of the cluster agent.
- """
- name: String
-
- """
- The project this cluster agent is associated with.
- """
- project: Project
-
- """
- Tokens associated with the cluster agent.
- """
- tokens(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): ClusterAgentTokenConnection
-
- """
- Timestamp the cluster agent was updated.
- """
- updatedAt: Time
-}
-
-"""
-The connection type for ClusterAgent.
-"""
-type ClusterAgentConnection {
- """
- Total count of collection.
- """
- count: Int!
-
- """
- A list of edges.
- """
- edges: [ClusterAgentEdge]
-
- """
- A list of nodes.
- """
- nodes: [ClusterAgent]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of ClusterAgentDelete
-"""
-input ClusterAgentDeleteInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Global ID of the cluster agent that will be deleted.
- """
- id: ClustersAgentID!
-}
-
-"""
-Autogenerated return type of ClusterAgentDelete
-"""
-type ClusterAgentDeletePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-An edge in a connection.
-"""
-type ClusterAgentEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: ClusterAgent
-}
-
-type ClusterAgentToken {
- """
- Cluster agent this token is associated with.
- """
- clusterAgent: ClusterAgent
-
- """
- Timestamp the token was created.
- """
- createdAt: Time
-
- """
- The user who created the token.
- """
- createdByUser: User
-
- """
- Global ID of the token.
- """
- id: ClustersAgentTokenID!
-}
-
-"""
-The connection type for ClusterAgentToken.
-"""
-type ClusterAgentTokenConnection {
- """
- Total count of collection.
- """
- count: Int!
-
- """
- A list of edges.
- """
- edges: [ClusterAgentTokenEdge]
-
- """
- A list of nodes.
- """
- nodes: [ClusterAgentToken]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of ClusterAgentTokenCreate
-"""
-input ClusterAgentTokenCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Global ID of the cluster agent that will be associated with the new token.
- """
- clusterAgentId: ClustersAgentID!
-}
-
-"""
-Autogenerated return type of ClusterAgentTokenCreate
-"""
-type ClusterAgentTokenCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Token secret value. Make sure you save it - you won't be able to access it again.
- """
- secret: String
-
- """
- Token created after mutation.
- """
- token: ClusterAgentToken
-}
-
-"""
-Autogenerated input type of ClusterAgentTokenDelete
-"""
-input ClusterAgentTokenDeleteInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Global ID of the cluster agent token that will be deleted.
- """
- id: ClustersAgentTokenID!
-}
-
-"""
-Autogenerated return type of ClusterAgentTokenDelete
-"""
-type ClusterAgentTokenDeletePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-An edge in a connection.
-"""
-type ClusterAgentTokenEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: ClusterAgentToken
-}
-
-"""
-Identifier of Clusters::Agent.
-"""
-scalar ClustersAgentID
-
-"""
-Identifier of Clusters::AgentToken.
-"""
-scalar ClustersAgentTokenID
-
-"""
-Identifier of Clusters::Cluster.
-"""
-scalar ClustersClusterID
-
-"""
-Represents the code coverage activity for a group
-"""
-type CodeCoverageActivity {
- """
- Average percentage of the different code coverage results available for the group.
- """
- averageCoverage: Float
-
- """
- Number of different code coverage results available for the group.
- """
- coverageCount: Int
-
- """
- Date when the code coverage was created.
- """
- date: Date!
-
- """
- Number of projects with code coverage results for the group.
- """
- projectCount: Int
-}
-
-"""
-The connection type for CodeCoverageActivity.
-"""
-type CodeCoverageActivityConnection {
- """
- A list of edges.
- """
- edges: [CodeCoverageActivityEdge]
-
- """
- A list of nodes.
- """
- nodes: [CodeCoverageActivity]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type CodeCoverageActivityEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: CodeCoverageActivity
-}
-
-"""
-Represents the code coverage summary for a project
-"""
-type CodeCoverageSummary {
- """
- Average percentage of the different code coverage results available for the project.
- """
- averageCoverage: Float
-
- """
- Number of different code coverage results available.
- """
- coverageCount: Int
-
- """
- Latest date when the code coverage was created for the project.
- """
- lastUpdatedOn: Date
-}
-
-type Commit {
- """
- Author of the commit.
- """
- author: User
-
- """
- Commit authors gravatar.
- """
- authorGravatar: String
-
- """
- Commit authors name.
- """
- authorName: String
-
- """
- Timestamp of when the commit was authored.
- """
- authoredDate: Time
-
- """
- Description of the commit message.
- """
- description: String
-
- """
- The GitLab Flavored Markdown rendering of `description`
- """
- descriptionHtml: String
-
- """
- ID (global ID) of the commit.
- """
- id: ID!
-
- """
- Raw commit message.
- """
- message: String
-
- """
- Pipelines of the commit ordered latest first.
- """
- pipelines(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter pipelines by the ref they are run for.
- """
- ref: String
-
- """
- Filter pipelines by the sha of the commit they are run for.
- """
- sha: String
-
- """
- Filter pipelines by their status.
- """
- status: PipelineStatusEnum
- ): PipelineConnection
-
- """
- SHA1 ID of the commit.
- """
- sha: String!
-
- """
- Short SHA1 ID of the commit.
- """
- shortId: String!
-
- """
- Rendered HTML of the commit signature.
- """
- signatureHtml: String
-
- """
- Title of the commit message.
- """
- title: String
-
- """
- The GitLab Flavored Markdown rendering of `title`
- """
- titleHtml: String
-
- """
- Web path of the commit.
- """
- webPath: String!
-
- """
- Web URL of the commit.
- """
- webUrl: String!
-}
-
-input CommitAction {
- """
- The action to perform, create, delete, move, update, chmod.
- """
- action: CommitActionMode!
-
- """
- Content of the file.
- """
- content: String
-
- """
- Encoding of the file. Default is text.
- """
- encoding: CommitEncoding
-
- """
- Enables/disables the execute flag on the file.
- """
- executeFilemode: Boolean
-
- """
- Full path to the file.
- """
- filePath: String!
-
- """
- Last known file commit ID.
- """
- lastCommitId: String
-
- """
- Original full path to the file being moved.
- """
- previousPath: String
-}
-
-"""
-Mode of a commit action
-"""
-enum CommitActionMode {
- """
- Chmod command
- """
- CHMOD
-
- """
- Create command
- """
- CREATE
-
- """
- Delete command
- """
- DELETE
-
- """
- Move command
- """
- MOVE
-
- """
- Update command
- """
- UPDATE
-}
-
-"""
-The connection type for Commit.
-"""
-type CommitConnection {
- """
- A list of edges.
- """
- edges: [CommitEdge]
-
- """
- A list of nodes.
- """
- nodes: [Commit]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of CommitCreate
-"""
-input CommitCreateInput {
- """
- Array of action hashes to commit as a batch.
- """
- actions: [CommitAction!]!
-
- """
- Name of the branch to commit into, it can be a new branch.
- """
- branch: String!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Raw commit message.
- """
- message: String!
-
- """
- Project full path the branch is associated with.
- """
- projectPath: ID!
-
- """
- If on a new branch, name of the original branch.
- """
- startBranch: String
-}
-
-"""
-Autogenerated return type of CommitCreate
-"""
-type CommitCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The commit after mutation.
- """
- commit: Commit
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-An edge in a connection.
-"""
-type CommitEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Commit
-}
-
-enum CommitEncoding {
- """
- Base64 encoding
- """
- BASE64
-
- """
- Text encoding
- """
- TEXT
-}
-
-"""
-Represents a ComplianceFramework associated with a Project
-"""
-type ComplianceFramework {
- """
- Hexadecimal representation of compliance framework's label color.
- """
- color: String!
-
- """
- Description of the compliance framework.
- """
- description: String!
-
- """
- Compliance framework ID.
- """
- id: ID!
-
- """
- Name of the compliance framework.
- """
- name: String!
-
- """
- Full path of the compliance pipeline configuration stored in a project
- repository, such as `.gitlab/.compliance-gitlab-ci.yml@compliance/hippa`.
- """
- pipelineConfigurationFullPath: String
-}
-
-"""
-The connection type for ComplianceFramework.
-"""
-type ComplianceFrameworkConnection {
- """
- A list of edges.
- """
- edges: [ComplianceFrameworkEdge]
-
- """
- A list of nodes.
- """
- nodes: [ComplianceFramework]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type ComplianceFrameworkEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: ComplianceFramework
-}
-
-input ComplianceFrameworkInput {
- """
- New color representation of the compliance framework in hex format. e.g. #FCA121.
- """
- color: String
-
- """
- New description for the compliance framework.
- """
- description: String
-
- """
- New name for the compliance framework.
- """
- name: String
-
- """
- Full path of the compliance pipeline configuration stored in a project
- repository, such as `.gitlab/.compliance-gitlab-ci.yml@compliance/hippa`.
- """
- pipelineConfigurationFullPath: String
-}
-
-"""
-Identifier of ComplianceManagement::Framework.
-"""
-scalar ComplianceManagementFrameworkID
-
-"""
-Composer metadata
-"""
-type ComposerMetadata {
- """
- Data of the Composer JSON file.
- """
- composerJson: PackageComposerJsonType!
-
- """
- Target SHA of the package.
- """
- targetSha: String!
-}
-
-"""
-Autogenerated input type of ConfigureSast
-"""
-input ConfigureSastInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- SAST CI configuration for the project.
- """
- configuration: SastCiConfigurationInput!
-
- """
- Full path of the project.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of ConfigureSast
-"""
-type ConfigureSastPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Status of creating the commit for the supplied SAST CI configuration.
- """
- status: String!
-
- """
- Redirect path to use when the response is successful.
- """
- successPath: String
-}
-
-"""
-A tag expiration policy designed to keep only the images that matter most
-"""
-type ContainerExpirationPolicy {
- """
- This container expiration policy schedule.
- """
- cadence: ContainerExpirationPolicyCadenceEnum!
-
- """
- Timestamp of when the container expiration policy was created.
- """
- createdAt: Time!
-
- """
- Indicates whether this container expiration policy is enabled.
- """
- enabled: Boolean!
-
- """
- Number of tags to retain.
- """
- keepN: ContainerExpirationPolicyKeepEnum
-
- """
- Tags with names matching this regex pattern will expire.
- """
- nameRegex: UntrustedRegexp
-
- """
- Tags with names matching this regex pattern will be preserved.
- """
- nameRegexKeep: UntrustedRegexp
-
- """
- Next time that this container expiration policy will get executed.
- """
- nextRunAt: Time
-
- """
- Tags older that this will expire.
- """
- olderThan: ContainerExpirationPolicyOlderThanEnum
-
- """
- Timestamp of when the container expiration policy was updated.
- """
- updatedAt: Time!
-}
-
-enum ContainerExpirationPolicyCadenceEnum {
- """
- Every day
- """
- EVERY_DAY
-
- """
- Every month
- """
- EVERY_MONTH
-
- """
- Every three months
- """
- EVERY_THREE_MONTHS
-
- """
- Every two weeks
- """
- EVERY_TWO_WEEKS
-
- """
- Every week
- """
- EVERY_WEEK
-}
-
-enum ContainerExpirationPolicyKeepEnum {
- """
- 50 tags per image name
- """
- FIFTY_TAGS
-
- """
- 5 tags per image name
- """
- FIVE_TAGS
-
- """
- 100 tags per image name
- """
- ONE_HUNDRED_TAGS
-
- """
- 1 tag per image name
- """
- ONE_TAG
-
- """
- 10 tags per image name
- """
- TEN_TAGS
-
- """
- 25 tags per image name
- """
- TWENTY_FIVE_TAGS
-}
-
-enum ContainerExpirationPolicyOlderThanEnum {
- """
- 14 days until tags are automatically removed
- """
- FOURTEEN_DAYS
-
- """
- 90 days until tags are automatically removed
- """
- NINETY_DAYS
-
- """
- 7 days until tags are automatically removed
- """
- SEVEN_DAYS
-
- """
- 30 days until tags are automatically removed
- """
- THIRTY_DAYS
-}
-
-"""
-A container repository
-"""
-type ContainerRepository {
- """
- Can the current user delete the container repository.
- """
- canDelete: Boolean!
-
- """
- Timestamp when the container repository was created.
- """
- createdAt: Time!
-
- """
- The tags cleanup status for the container repository.
- """
- expirationPolicyCleanupStatus: ContainerRepositoryCleanupStatus
-
- """
- Timestamp when the cleanup done by the expiration policy was started on the container repository.
- """
- expirationPolicyStartedAt: Time
-
- """
- ID of the container repository.
- """
- id: ID!
-
- """
- URL of the container repository.
- """
- location: String!
-
- """
- Name of the container repository.
- """
- name: String!
-
- """
- Path of the container repository.
- """
- path: String!
-
- """
- Project of the container registry.
- """
- project: Project!
-
- """
- Status of the container repository.
- """
- status: ContainerRepositoryStatus
-
- """
- Number of tags associated with this image.
- """
- tagsCount: Int!
-
- """
- Timestamp when the container repository was updated.
- """
- updatedAt: Time!
-}
-
-"""
-Status of the tags cleanup of a container repository
-"""
-enum ContainerRepositoryCleanupStatus {
- """
- The tags cleanup is ongoing.
- """
- ONGOING
-
- """
- The tags cleanup is scheduled and is going to be executed shortly.
- """
- SCHEDULED
-
- """
- The tags cleanup has been partially executed. There are still remaining tags to delete.
- """
- UNFINISHED
-
- """
- The tags cleanup is not scheduled. This is the default state.
- """
- UNSCHEDULED
-}
-
-"""
-The connection type for ContainerRepository.
-"""
-type ContainerRepositoryConnection {
- """
- A list of edges.
- """
- edges: [ContainerRepositoryEdge]
-
- """
- A list of nodes.
- """
- nodes: [ContainerRepository]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Details of a container repository
-"""
-type ContainerRepositoryDetails {
- """
- Can the current user delete the container repository.
- """
- canDelete: Boolean!
-
- """
- Timestamp when the container repository was created.
- """
- createdAt: Time!
-
- """
- The tags cleanup status for the container repository.
- """
- expirationPolicyCleanupStatus: ContainerRepositoryCleanupStatus
-
- """
- Timestamp when the cleanup done by the expiration policy was started on the container repository.
- """
- expirationPolicyStartedAt: Time
-
- """
- ID of the container repository.
- """
- id: ID!
-
- """
- URL of the container repository.
- """
- location: String!
-
- """
- Name of the container repository.
- """
- name: String!
-
- """
- Path of the container repository.
- """
- path: String!
-
- """
- Project of the container registry.
- """
- project: Project!
-
- """
- Status of the container repository.
- """
- status: ContainerRepositoryStatus
-
- """
- Tags of the container repository.
- """
- tags(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): ContainerRepositoryTagConnection
-
- """
- Number of tags associated with this image.
- """
- tagsCount: Int!
-
- """
- Timestamp when the container repository was updated.
- """
- updatedAt: Time!
-}
-
-"""
-An edge in a connection.
-"""
-type ContainerRepositoryEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: ContainerRepository
-}
-
-"""
-Identifier of ContainerRepository.
-"""
-scalar ContainerRepositoryID
-
-"""
-Values for sorting container repositories
-"""
-enum ContainerRepositorySort {
- """
- Created at ascending order
- """
- CREATED_ASC
-
- """
- Created at descending order
- """
- CREATED_DESC
-
- """
- Name by ascending order
- """
- NAME_ASC
-
- """
- Name by descending order
- """
- NAME_DESC
-
- """
- Updated at ascending order
- """
- UPDATED_ASC
-
- """
- Updated at descending order
- """
- UPDATED_DESC
-
- """
- Created at ascending order
- """
- created_asc @deprecated(reason: "Use CREATED_ASC. Deprecated in 13.5.")
-
- """
- Created at descending order
- """
- created_desc @deprecated(reason: "Use CREATED_DESC. Deprecated in 13.5.")
-
- """
- Updated at ascending order
- """
- updated_asc @deprecated(reason: "Use UPDATED_ASC. Deprecated in 13.5.")
-
- """
- Updated at descending order
- """
- updated_desc @deprecated(reason: "Use UPDATED_DESC. Deprecated in 13.5.")
-}
-
-"""
-Status of a container repository
-"""
-enum ContainerRepositoryStatus {
- """
- Delete Failed status.
- """
- DELETE_FAILED
-
- """
- Delete Scheduled status.
- """
- DELETE_SCHEDULED
-}
-
-"""
-A tag from a container repository
-"""
-type ContainerRepositoryTag {
- """
- Can the current user delete this tag.
- """
- canDelete: Boolean!
-
- """
- Timestamp when the tag was created.
- """
- createdAt: Time
-
- """
- Digest of the tag.
- """
- digest: String
-
- """
- URL of the tag.
- """
- location: String!
-
- """
- Name of the tag.
- """
- name: String!
-
- """
- Path of the tag.
- """
- path: String!
-
- """
- Revision of the tag.
- """
- revision: String
-
- """
- Short revision of the tag.
- """
- shortRevision: String
-
- """
- The size of the tag.
- """
- totalSize: BigInt
-}
-
-"""
-The connection type for ContainerRepositoryTag.
-"""
-type ContainerRepositoryTagConnection {
- """
- A list of edges.
- """
- edges: [ContainerRepositoryTagEdge]
-
- """
- A list of nodes.
- """
- nodes: [ContainerRepositoryTag]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type ContainerRepositoryTagEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: ContainerRepositoryTag
-}
-
-"""
-Autogenerated input type of CreateAlertIssue
-"""
-input CreateAlertIssueInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the alert to mutate.
- """
- iid: String!
-
- """
- The project the alert to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of CreateAlertIssue
-"""
-type CreateAlertIssuePayload {
- """
- The alert after mutation.
- """
- alert: AlertManagementAlert
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue created after mutation.
- """
- issue: Issue
-
- """
- The to-do item after mutation.
- """
- todo: Todo
-}
-
-"""
-Autogenerated input type of CreateAnnotation
-"""
-input CreateAnnotationInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the cluster to add an annotation to.
- """
- clusterId: ClustersClusterID
-
- """
- The path to a file defining the dashboard on which the annotation should be added.
- """
- dashboardPath: String!
-
- """
- The description of the annotation.
- """
- description: String!
-
- """
- Timestamp indicating ending moment to which the annotation relates.
- """
- endingAt: Time
-
- """
- The global ID of the environment to add an annotation to.
- """
- environmentId: EnvironmentID
-
- """
- Timestamp indicating starting moment to which the annotation relates.
- """
- startingAt: Time!
-}
-
-"""
-Autogenerated return type of CreateAnnotation
-"""
-type CreateAnnotationPayload {
- """
- The created annotation.
- """
- annotation: MetricsDashboardAnnotation
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of CreateBoard
-"""
-input CreateBoardInput {
- """
- The ID of user to be assigned to the board.
- """
- assigneeId: UserID
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Full path of the group with which the resource is associated.
- """
- groupPath: ID
-
- """
- Whether or not backlog list is hidden.
- """
- hideBacklogList: Boolean
-
- """
- Whether or not closed list is hidden.
- """
- hideClosedList: Boolean
-
- """
- The ID of iteration to be assigned to the board.
- """
- iterationId: IterationID
-
- """
- The IDs of labels to be added to the board.
- """
- labelIds: [LabelID!]
-
- """
- Labels of the issue.
- """
- labels: [String!]
-
- """
- The ID of milestone to be assigned to the board.
- """
- milestoneId: MilestoneID
-
- """
- The board name.
- """
- name: String
-
- """
- Full path of the project with which the resource is associated.
- """
- projectPath: ID
-
- """
- The weight value to be assigned to the board.
- """
- weight: Int
-}
-
-"""
-Autogenerated return type of CreateBoard
-"""
-type CreateBoardPayload {
- """
- The board after mutation.
- """
- board: Board
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of CreateBranch
-"""
-input CreateBranchInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Name of the branch.
- """
- name: String!
-
- """
- Project full path the branch is associated with.
- """
- projectPath: ID!
-
- """
- Branch name or commit SHA to create branch from.
- """
- ref: String!
-}
-
-"""
-Autogenerated return type of CreateBranch
-"""
-type CreateBranchPayload {
- """
- Branch after mutation.
- """
- branch: Branch
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of CreateClusterAgent
-"""
-input CreateClusterAgentInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Name of the cluster agent.
- """
- name: String!
-
- """
- Full path of the associated project for this cluster agent.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of CreateClusterAgent
-"""
-type CreateClusterAgentPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Cluster agent created after mutation.
- """
- clusterAgent: ClusterAgent
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of CreateComplianceFramework
-"""
-input CreateComplianceFrameworkInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Full path of the namespace to add the compliance framework to.
- """
- namespacePath: ID!
-
- """
- Parameters to update the compliance framework with.
- """
- params: ComplianceFrameworkInput!
-}
-
-"""
-Autogenerated return type of CreateComplianceFramework
-"""
-type CreateComplianceFrameworkPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The created compliance framework.
- """
- framework: ComplianceFramework
-}
-
-"""
-Autogenerated input type of CreateCustomEmoji
-"""
-input CreateCustomEmojiInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Namespace full path the emoji is associated with.
- """
- groupPath: ID!
-
- """
- Name of the emoji.
- """
- name: String!
-
- """
- Location of the emoji file.
- """
- url: String!
-}
-
-"""
-Autogenerated return type of CreateCustomEmoji
-"""
-type CreateCustomEmojiPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The new custom emoji.
- """
- customEmoji: CustomEmoji
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of CreateDevopsAdoptionSegment
-"""
-input CreateDevopsAdoptionSegmentInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Namespace ID to set for the segment.
- """
- namespaceId: NamespaceID!
-}
-
-"""
-Autogenerated return type of CreateDevopsAdoptionSegment
-"""
-type CreateDevopsAdoptionSegmentPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The segment after mutation.
- """
- segment: DevopsAdoptionSegment
-}
-
-"""
-Autogenerated input type of CreateDiffNote
-"""
-input CreateDiffNoteInput {
- """
- Content of the note.
- """
- body: String!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The confidentiality flag of a note. Default is false.
- """
- confidential: Boolean
-
- """
- The global ID of the resource to add a note to.
- """
- noteableId: NoteableID!
-
- """
- The position of this note on a diff.
- """
- position: DiffPositionInput!
-}
-
-"""
-Autogenerated return type of CreateDiffNote
-"""
-type CreateDiffNotePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The note after mutation.
- """
- note: Note
-}
-
-"""
-Autogenerated input type of CreateEpic
-"""
-input CreateEpicInput {
- """
- The IDs of labels to be added to the epic.
- """
- addLabelIds: [ID!]
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Indicates if the epic is confidential.
- """
- confidential: Boolean
-
- """
- The description of the epic.
- """
- description: String
-
- """
- The end date of the epic.
- """
- dueDateFixed: String
-
- """
- Indicates end date should be sourced from due_date_fixed field not the issue milestones.
- """
- dueDateIsFixed: Boolean
-
- """
- The group the epic to mutate is in.
- """
- groupPath: ID!
-
- """
- The IDs of labels to be removed from the epic.
- """
- removeLabelIds: [ID!]
-
- """
- The start date of the epic.
- """
- startDateFixed: String
-
- """
- Indicates start date should be sourced from start_date_fixed field not the issue milestones.
- """
- startDateIsFixed: Boolean
-
- """
- The title of the epic.
- """
- title: String
-}
-
-"""
-Autogenerated return type of CreateEpic
-"""
-type CreateEpicPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The created epic.
- """
- epic: Epic
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of CreateImageDiffNote
-"""
-input CreateImageDiffNoteInput {
- """
- Content of the note.
- """
- body: String!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The confidentiality flag of a note. Default is false.
- """
- confidential: Boolean
-
- """
- The global ID of the resource to add a note to.
- """
- noteableId: NoteableID!
-
- """
- The position of this note on a diff.
- """
- position: DiffImagePositionInput!
-}
-
-"""
-Autogenerated return type of CreateImageDiffNote
-"""
-type CreateImageDiffNotePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The note after mutation.
- """
- note: Note
-}
-
-"""
-Autogenerated input type of CreateIssue
-"""
-input CreateIssueInput {
- """
- The array of user IDs to assign to the issue.
- """
- assigneeIds: [UserID!]
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Indicates the issue is confidential.
- """
- confidential: Boolean
-
- """
- Timestamp when the issue was created. Available only for admins and project owners.
- """
- createdAt: Time
-
- """
- Description of the issue.
- """
- description: String
-
- """
- The ID of a discussion to resolve. Also pass `merge_request_to_resolve_discussions_of`.
- """
- discussionToResolve: String
-
- """
- Due date of the issue.
- """
- dueDate: ISO8601Date
-
- """
- The ID of an epic to associate the issue with.
- """
- epicId: EpicID
-
- """
- The desired health status.
- """
- healthStatus: HealthStatus
-
- """
- The IID (internal ID) of a project issue. Only admins and project owners can modify.
- """
- iid: Int
-
- """
- The IDs of labels to be added to the issue.
- """
- labelIds: [LabelID!]
-
- """
- Labels of the issue.
- """
- labels: [String!]
-
- """
- Indicates discussion is locked on the issue.
- """
- locked: Boolean
-
- """
- The IID of a merge request for which to resolve discussions.
- """
- mergeRequestToResolveDiscussionsOf: MergeRequestID
-
- """
- The ID of the milestone to assign to the issue. On update milestone will be removed if set to null.
- """
- milestoneId: MilestoneID
-
- """
- Project full path the issue is associated with.
- """
- projectPath: ID!
-
- """
- Title of the issue.
- """
- title: String!
-
- """
- The weight of the issue.
- """
- weight: Int
-}
-
-"""
-Autogenerated return type of CreateIssue
-"""
-type CreateIssuePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-"""
-Autogenerated input type of CreateIteration
-"""
-input CreateIterationInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The description of the iteration.
- """
- description: String
-
- """
- The end date of the iteration.
- """
- dueDate: String
-
- """
- Full path of the group with which the resource is associated.
- """
- groupPath: ID
-
- """
- Full path of the project with which the resource is associated.
- """
- projectPath: ID
-
- """
- The start date of the iteration.
- """
- startDate: String
-
- """
- The title of the iteration.
- """
- title: String
-}
-
-"""
-Autogenerated return type of CreateIteration
-"""
-type CreateIterationPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The created iteration.
- """
- iteration: Iteration
-}
-
-"""
-Autogenerated input type of CreateNote
-"""
-input CreateNoteInput {
- """
- Content of the note.
- """
- body: String!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The confidentiality flag of a note. Default is false.
- """
- confidential: Boolean
-
- """
- The global ID of the discussion this note is in reply to.
- """
- discussionId: DiscussionID
-
- """
- The global ID of the resource to add a note to.
- """
- noteableId: NoteableID!
-}
-
-"""
-Autogenerated return type of CreateNote
-"""
-type CreateNotePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The note after mutation.
- """
- note: Note
-}
-
-"""
-Autogenerated input type of CreateRequirement
-"""
-input CreateRequirementInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Description of the requirement.
- """
- description: String
-
- """
- Full project path the requirement is associated with.
- """
- projectPath: ID!
-
- """
- Title of the requirement.
- """
- title: String
-}
-
-"""
-Autogenerated return type of CreateRequirement
-"""
-type CreateRequirementPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Requirement after mutation.
- """
- requirement: Requirement
-}
-
-"""
-Autogenerated input type of CreateSnippet
-"""
-input CreateSnippetInput {
- """
- Actions to perform over the snippet repository and blobs.
- """
- blobActions: [SnippetBlobActionInputType!]
-
- """
- A valid CAPTCHA response value obtained by using the provided captchaSiteKey
- with a CAPTCHA API to present a challenge to be solved on the client. Required
- to resubmit if the previous operation returned "NeedsCaptchaResponse: true".
- """
- captchaResponse: String
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Description of the snippet.
- """
- description: String
-
- """
- The project full path the snippet is associated with.
- """
- projectPath: ID
-
- """
- The spam log ID which must be passed along with a valid CAPTCHA response for
- the operation to be completed. Required to resubmit if the previous operation
- returned "NeedsCaptchaResponse: true".
- """
- spamLogId: Int
-
- """
- Title of the snippet.
- """
- title: String!
-
- """
- The paths to files uploaded in the snippet description.
- """
- uploadedFiles: [String!]
-
- """
- The visibility level of the snippet.
- """
- visibilityLevel: VisibilityLevelsEnum!
-}
-
-"""
-Autogenerated return type of CreateSnippet
-"""
-type CreateSnippetPayload {
- """
- The CAPTCHA site key which must be used to render a challenge for the user to
- solve to obtain a valid captchaResponse value. Included only when an operation
- was not completed because "NeedsCaptchaResponse" is true.
- """
- captchaSiteKey: String
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Indicates whether the operation was detected as possible spam and not
- completed. If CAPTCHA is enabled, the request must be resubmitted with a valid
- CAPTCHA response and spam_log_id included for the operation to be completed.
- Included only when an operation was not completed because
- "NeedsCaptchaResponse" is true.
- """
- needsCaptchaResponse: Boolean
-
- """
- The snippet after mutation.
- """
- snippet: Snippet
-
- """
- Indicates whether the operation was detected as definite spam. There is no
- option to resubmit the request with a CAPTCHA response.
- """
- spam: Boolean
-
- """
- The spam log ID which must be passed along with a valid CAPTCHA response for
- an operation to be completed. Included only when an operation was not
- completed because "NeedsCaptchaResponse" is true.
- """
- spamLogId: Int
-}
-
-"""
-Autogenerated input type of CreateTestCase
-"""
-input CreateTestCaseInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The test case description.
- """
- description: String
-
- """
- The IDs of labels to be added to the test case.
- """
- labelIds: [ID!]
-
- """
- The project full path to create the test case.
- """
- projectPath: ID!
-
- """
- The test case title.
- """
- title: String!
-}
-
-"""
-Autogenerated return type of CreateTestCase
-"""
-type CreateTestCasePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The test case created.
- """
- testCase: Issue
-}
-
-interface CurrentUserTodos {
- """
- To-do items for the current user.
- """
- currentUserTodos(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- State of the to-do items.
- """
- state: TodoStateEnum
- ): TodoConnection!
-}
-
-"""
-A custom emoji uploaded by user
-"""
-type CustomEmoji {
- """
- Whether the emoji is an external link.
- """
- external: Boolean!
-
- """
- The ID of the emoji.
- """
- id: CustomEmojiID!
-
- """
- The name of the emoji.
- """
- name: String!
-
- """
- The link to file of the emoji.
- """
- url: String!
-}
-
-"""
-The connection type for CustomEmoji.
-"""
-type CustomEmojiConnection {
- """
- A list of edges.
- """
- edges: [CustomEmojiEdge]
-
- """
- A list of nodes.
- """
- nodes: [CustomEmoji]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type CustomEmojiEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: CustomEmoji
-}
-
-"""
-Identifier of CustomEmoji.
-"""
-scalar CustomEmojiID
-
-"""
-Autogenerated input type of DastOnDemandScanCreate
-"""
-input DastOnDemandScanCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the scanner profile to be used for the scan.
- """
- dastScannerProfileId: DastScannerProfileID
-
- """
- ID of the site profile to be used for the scan.
- """
- dastSiteProfileId: DastSiteProfileID!
-
- """
- The project the site profile belongs to.
- """
- fullPath: ID!
-}
-
-"""
-Autogenerated return type of DastOnDemandScanCreate
-"""
-type DastOnDemandScanCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- URL of the pipeline that was created.
- """
- pipelineUrl: String
-}
-
-"""
-Represents a DAST Profile
-"""
-type DastProfile {
- """
- The associated scanner profile.
- """
- dastScannerProfile: DastScannerProfile
-
- """
- The associated site profile.
- """
- dastSiteProfile: DastSiteProfile
-
- """
- The description of the scan.
- """
- description: String
-
- """
- Relative web path to the edit page of a profile.
- """
- editPath: String
-
- """
- ID of the profile.
- """
- id: DastProfileID!
-
- """
- The name of the profile.
- """
- name: String
-}
-
-"""
-The connection type for DastProfile.
-"""
-type DastProfileConnection {
- """
- A list of edges.
- """
- edges: [DastProfileEdge]
-
- """
- A list of nodes.
- """
- nodes: [DastProfile]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of DastProfileCreate
-"""
-input DastProfileCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the scanner profile to be associated.
- """
- dastScannerProfileId: DastScannerProfileID!
-
- """
- ID of the site profile to be associated.
- """
- dastSiteProfileId: DastSiteProfileID!
-
- """
- The description of the profile. Defaults to an empty string.
- """
- description: String = ""
-
- """
- The project the profile belongs to.
- """
- fullPath: ID!
-
- """
- The name of the profile.
- """
- name: String!
-
- """
- Run scan using profile after creation. Defaults to false.
- """
- runAfterCreate: Boolean = false
-}
-
-"""
-Autogenerated return type of DastProfileCreate
-"""
-type DastProfileCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The created profile.
- """
- dastProfile: DastProfile
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The URL of the pipeline that was created. Requires `runAfterCreate` to be set to `true`.
- """
- pipelineUrl: String
-}
-
-"""
-Autogenerated input type of DastProfileDelete
-"""
-input DastProfileDeleteInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the profile to be deleted.
- """
- id: DastProfileID!
-}
-
-"""
-Autogenerated return type of DastProfileDelete
-"""
-type DastProfileDeletePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-An edge in a connection.
-"""
-type DastProfileEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: DastProfile
-}
-
-"""
-Identifier of Dast::Profile.
-"""
-scalar DastProfileID
-
-"""
-Autogenerated input type of DastProfileRun
-"""
-input DastProfileRunInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Full path for the project the scanner profile belongs to.
- """
- fullPath: ID!
-
- """
- ID of the profile to be used for the scan.
- """
- id: DastProfileID!
-}
-
-"""
-Autogenerated return type of DastProfileRun
-"""
-type DastProfileRunPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- URL of the pipeline that was created.
- """
- pipelineUrl: String
-}
-
-"""
-Autogenerated input type of DastProfileUpdate
-"""
-input DastProfileUpdateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the scanner profile to be associated.
- """
- dastScannerProfileId: DastScannerProfileID
-
- """
- ID of the site profile to be associated.
- """
- dastSiteProfileId: DastSiteProfileID
-
- """
- The description of the profile. Defaults to an empty string.
- """
- description: String = ""
-
- """
- The project the profile belongs to.
- """
- fullPath: ID!
-
- """
- ID of the profile to be deleted.
- """
- id: DastProfileID!
-
- """
- The name of the profile.
- """
- name: String
-
- """
- Run scan using profile after update. Defaults to false.
- """
- runAfterUpdate: Boolean = false
-}
-
-"""
-Autogenerated return type of DastProfileUpdate
-"""
-type DastProfileUpdatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The updated profile.
- """
- dastProfile: DastProfile
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The URL of the pipeline that was created. Requires the input argument
- `runAfterUpdate` to be set to `true` when calling the mutation, otherwise no
- pipeline will be created.
- """
- pipelineUrl: String
-}
-
-enum DastScanTypeEnum {
- """
- Active DAST scan. This scan will make active attacks against the target site.
- """
- ACTIVE
-
- """
- Passive DAST scan. This scan will not make active attacks against the target site.
- """
- PASSIVE
-}
-
-"""
-Represents a DAST scanner profile
-"""
-type DastScannerProfile {
- """
- Relative web path to the edit page of a scanner profile.
- """
- editPath: String
-
- """
- ID of the DAST scanner profile. Deprecated in 13.6: Use `id`.
- """
- globalId: DastScannerProfileID! @deprecated(reason: "Use `id`. Deprecated in 13.6.")
-
- """
- ID of the DAST scanner profile.
- """
- id: DastScannerProfileID!
-
- """
- Name of the DAST scanner profile.
- """
- profileName: String
-
- """
- Indicates the type of DAST scan that will run. Either a Passive Scan or an Active Scan.
- """
- scanType: DastScanTypeEnum
-
- """
- Indicates if debug messages should be included in DAST console output. True to include the debug messages.
- """
- showDebugMessages: Boolean!
-
- """
- The maximum number of minutes allowed for the spider to traverse the site.
- """
- spiderTimeout: Int
-
- """
- The maximum number of seconds allowed for the site under test to respond to a request.
- """
- targetTimeout: Int
-
- """
- Indicates if the AJAX spider should be used to crawl the target site. True to
- run the AJAX spider in addition to the traditional spider, and false to run
- only the traditional spider.
- """
- useAjaxSpider: Boolean!
-}
-
-"""
-The connection type for DastScannerProfile.
-"""
-type DastScannerProfileConnection {
- """
- A list of edges.
- """
- edges: [DastScannerProfileEdge]
-
- """
- A list of nodes.
- """
- nodes: [DastScannerProfile]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of DastScannerProfileCreate
-"""
-input DastScannerProfileCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The project the scanner profile belongs to.
- """
- fullPath: ID!
-
- """
- The name of the scanner profile.
- """
- profileName: String!
-
- """
- Indicates the type of DAST scan that will run. Either a Passive Scan or an Active Scan.
- """
- scanType: DastScanTypeEnum = PASSIVE
-
- """
- Indicates if debug messages should be included in DAST console output. True to include the debug messages.
- """
- showDebugMessages: Boolean = false
-
- """
- The maximum number of minutes allowed for the spider to traverse the site.
- """
- spiderTimeout: Int
-
- """
- The maximum number of seconds allowed for the site under test to respond to a request.
- """
- targetTimeout: Int
-
- """
- Indicates if the AJAX spider should be used to crawl the target site. True to
- run the AJAX spider in addition to the traditional spider, and false to run
- only the traditional spider.
- """
- useAjaxSpider: Boolean = false
-}
-
-"""
-Autogenerated return type of DastScannerProfileCreate
-"""
-type DastScannerProfileCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- ID of the scanner profile. Deprecated in 13.6: Use `id`.
- """
- globalId: DastScannerProfileID @deprecated(reason: "Use `id`. Deprecated in 13.6.")
-
- """
- ID of the scanner profile.
- """
- id: DastScannerProfileID
-}
-
-"""
-Autogenerated input type of DastScannerProfileDelete
-"""
-input DastScannerProfileDeleteInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Full path for the project the scanner profile belongs to.
- """
- fullPath: ID!
-
- """
- ID of the scanner profile to be deleted.
- """
- id: DastScannerProfileID!
-}
-
-"""
-Autogenerated return type of DastScannerProfileDelete
-"""
-type DastScannerProfileDeletePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-An edge in a connection.
-"""
-type DastScannerProfileEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: DastScannerProfile
-}
-
-"""
-Identifier of DastScannerProfile.
-"""
-scalar DastScannerProfileID
-
-"""
-Autogenerated input type of DastScannerProfileUpdate
-"""
-input DastScannerProfileUpdateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The project the scanner profile belongs to.
- """
- fullPath: ID!
-
- """
- ID of the scanner profile to be updated.
- """
- id: DastScannerProfileID!
-
- """
- The name of the scanner profile.
- """
- profileName: String!
-
- """
- Indicates the type of DAST scan that will run. Either a Passive Scan or an Active Scan.
- """
- scanType: DastScanTypeEnum
-
- """
- Indicates if debug messages should be included in DAST console output. True to include the debug messages.
- """
- showDebugMessages: Boolean
-
- """
- The maximum number of minutes allowed for the spider to traverse the site.
- """
- spiderTimeout: Int!
-
- """
- The maximum number of seconds allowed for the site under test to respond to a request.
- """
- targetTimeout: Int!
-
- """
- Indicates if the AJAX spider should be used to crawl the target site. True to
- run the AJAX spider in addition to the traditional spider, and false to run
- only the traditional spider.
- """
- useAjaxSpider: Boolean
-}
-
-"""
-Autogenerated return type of DastScannerProfileUpdate
-"""
-type DastScannerProfileUpdatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- ID of the scanner profile.
- """
- id: DastScannerProfileID
-}
-
-"""
-Represents a DAST Site Profile
-"""
-type DastSiteProfile {
- """
- Relative web path to the edit page of a site profile.
- """
- editPath: String
-
- """
- ID of the site profile.
- """
- id: DastSiteProfileID!
-
- """
- Normalized URL of the target to be scanned.
- """
- normalizedTargetUrl: String
-
- """
- The name of the site profile.
- """
- profileName: String
-
- """
- The URL of the target to be scanned.
- """
- targetUrl: String
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: DastSiteProfilePermissions!
-
- """
- The current validation status of the site profile.
- """
- validationStatus: DastSiteProfileValidationStatusEnum
-}
-
-"""
-The connection type for DastSiteProfile.
-"""
-type DastSiteProfileConnection {
- """
- A list of edges.
- """
- edges: [DastSiteProfileEdge]
-
- """
- A list of nodes.
- """
- nodes: [DastSiteProfile]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of DastSiteProfileCreate
-"""
-input DastSiteProfileCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The project the site profile belongs to.
- """
- fullPath: ID!
-
- """
- The name of the site profile.
- """
- profileName: String!
-
- """
- The URL of the target to be scanned.
- """
- targetUrl: String
-}
-
-"""
-Autogenerated return type of DastSiteProfileCreate
-"""
-type DastSiteProfileCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- ID of the site profile.
- """
- id: DastSiteProfileID
-}
-
-"""
-Autogenerated input type of DastSiteProfileDelete
-"""
-input DastSiteProfileDeleteInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The project the site profile belongs to.
- """
- fullPath: ID!
-
- """
- ID of the site profile to be deleted.
- """
- id: DastSiteProfileID!
-}
-
-"""
-Autogenerated return type of DastSiteProfileDelete
-"""
-type DastSiteProfileDeletePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-An edge in a connection.
-"""
-type DastSiteProfileEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: DastSiteProfile
-}
-
-"""
-Identifier of DastSiteProfile.
-"""
-scalar DastSiteProfileID
-
-"""
-Check permissions for the current user on site profile
-"""
-type DastSiteProfilePermissions {
- """
- Indicates the user can perform `create_on_demand_dast_scan` on this resource
- """
- createOnDemandDastScan: Boolean!
-}
-
-"""
-Autogenerated input type of DastSiteProfileUpdate
-"""
-input DastSiteProfileUpdateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The project the site profile belongs to.
- """
- fullPath: ID!
-
- """
- ID of the site profile to be updated.
- """
- id: DastSiteProfileID!
-
- """
- The name of the site profile.
- """
- profileName: String!
-
- """
- The URL of the target to be scanned.
- """
- targetUrl: String
-}
-
-"""
-Autogenerated return type of DastSiteProfileUpdate
-"""
-type DastSiteProfileUpdatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- ID of the site profile.
- """
- id: DastSiteProfileID
-}
-
-enum DastSiteProfileValidationStatusEnum {
- """
- Site validation process finished but failed
- """
- FAILED_VALIDATION
-
- """
- Site validation process is in progress
- """
- INPROGRESS_VALIDATION
-
- """
- No site validation exists
- """
- NONE
-
- """
- Site validation process finished successfully
- """
- PASSED_VALIDATION
-
- """
- Site validation process has not started
- """
- PENDING_VALIDATION
-}
-
-"""
-Autogenerated input type of DastSiteTokenCreate
-"""
-input DastSiteTokenCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The project the site token belongs to.
- """
- fullPath: ID!
-
- """
- The URL of the target to be validated.
- """
- targetUrl: String
-}
-
-"""
-Autogenerated return type of DastSiteTokenCreate
-"""
-type DastSiteTokenCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- ID of the site token.
- """
- id: DastSiteTokenID
-
- """
- The current validation status of the target.
- """
- status: DastSiteProfileValidationStatusEnum
-
- """
- Token string.
- """
- token: String
-}
-
-"""
-Identifier of DastSiteToken.
-"""
-scalar DastSiteTokenID
-
-"""
-Represents a DAST Site Validation
-"""
-type DastSiteValidation {
- """
- Global ID of the site validation.
- """
- id: DastSiteValidationID!
-
- """
- Normalized URL of the target to be validated.
- """
- normalizedTargetUrl: String
-
- """
- Status of the site validation.
- """
- status: DastSiteProfileValidationStatusEnum!
-}
-
-"""
-The connection type for DastSiteValidation.
-"""
-type DastSiteValidationConnection {
- """
- A list of edges.
- """
- edges: [DastSiteValidationEdge]
-
- """
- A list of nodes.
- """
- nodes: [DastSiteValidation]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of DastSiteValidationCreate
-"""
-input DastSiteValidationCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the site token.
- """
- dastSiteTokenId: DastSiteTokenID!
-
- """
- The project the site profile belongs to.
- """
- fullPath: ID!
-
- """
- The validation strategy to be used.
- """
- strategy: DastSiteValidationStrategyEnum
-
- """
- The path to be requested during validation.
- """
- validationPath: String!
-}
-
-"""
-Autogenerated return type of DastSiteValidationCreate
-"""
-type DastSiteValidationCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- ID of the site validation.
- """
- id: DastSiteValidationID
-
- """
- The current validation status.
- """
- status: DastSiteProfileValidationStatusEnum
-}
-
-"""
-An edge in a connection.
-"""
-type DastSiteValidationEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: DastSiteValidation
-}
-
-"""
-Identifier of DastSiteValidation.
-"""
-scalar DastSiteValidationID
-
-"""
-Autogenerated input type of DastSiteValidationRevoke
-"""
-input DastSiteValidationRevokeInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The project the site validation belongs to.
- """
- fullPath: ID!
-
- """
- Normalized URL of the target to be revoked.
- """
- normalizedTargetUrl: String!
-}
-
-"""
-Autogenerated return type of DastSiteValidationRevoke
-"""
-type DastSiteValidationRevokePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-enum DastSiteValidationStrategyEnum {
- """
- Header validation
- """
- HEADER
-
- """
- Text file validation
- """
- TEXT_FILE
-}
-
-"""
-Color of the data visualization palette
-"""
-enum DataVisualizationColorEnum {
- """
- Aqua color
- """
- AQUA
-
- """
- Blue color
- """
- BLUE
-
- """
- Green color
- """
- GREEN
-
- """
- Magenta color
- """
- MAGENTA
-
- """
- Orange color
- """
- ORANGE
-}
-
-"""
-Weight of the data visualization palette
-"""
-enum DataVisualizationWeightEnum {
- """
- 100 weight
- """
- WEIGHT_100
-
- """
- 200 weight
- """
- WEIGHT_200
-
- """
- 300 weight
- """
- WEIGHT_300
-
- """
- 400 weight
- """
- WEIGHT_400
-
- """
- 50 weight
- """
- WEIGHT_50
-
- """
- 500 weight
- """
- WEIGHT_500
-
- """
- 600 weight
- """
- WEIGHT_600
-
- """
- 700 weight
- """
- WEIGHT_700
-
- """
- 800 weight
- """
- WEIGHT_800
-
- """
- 900 weight
- """
- WEIGHT_900
-
- """
- 950 weight
- """
- WEIGHT_950
-}
-
-"""
-Date represented in ISO 8601
-"""
-scalar Date
-
-"""
-Autogenerated input type of DeleteAnnotation
-"""
-input DeleteAnnotationInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Global ID of the annotation to delete.
- """
- id: MetricsDashboardAnnotationID!
-}
-
-"""
-Autogenerated return type of DeleteAnnotation
-"""
-type DeleteAnnotationPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of DeleteDevopsAdoptionSegment
-"""
-input DeleteDevopsAdoptionSegmentInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the segment.
- """
- id: AnalyticsDevopsAdoptionSegmentID!
-}
-
-"""
-Autogenerated return type of DeleteDevopsAdoptionSegment
-"""
-type DeleteDevopsAdoptionSegmentPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-The response from the AdminSidekiqQueuesDeleteJobs mutation
-"""
-type DeleteJobsResponse {
- """
- Whether or not the entire queue was processed in time; if not, retrying the same request is safe.
- """
- completed: Boolean
-
- """
- The number of matching jobs deleted.
- """
- deletedJobs: Int
-
- """
- The queue size after processing.
- """
- queueSize: Int
-}
-
-"""
-A single design
-"""
-type Design implements CurrentUserTodos & DesignFields & Noteable {
- """
- To-do items for the current user.
- """
- currentUserTodos(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- State of the to-do items.
- """
- state: TodoStateEnum
- ): TodoConnection!
-
- """
- The diff refs for this design.
- """
- diffRefs: DiffRefs!
-
- """
- All discussions on this noteable.
- """
- discussions(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DiscussionConnection!
-
- """
- How this design was changed in the current version.
- """
- event: DesignVersionEvent!
-
- """
- The filename of the design.
- """
- filename: String!
-
- """
- The full path to the design file.
- """
- fullPath: String!
-
- """
- The ID of this design.
- """
- id: ID!
-
- """
- The URL of the full-sized image.
- """
- image: String!
-
- """
- The URL of the design resized to fit within the bounds of 432x230. This will be `null` if the image has not been generated
- """
- imageV432x230: String
-
- """
- The issue the design belongs to.
- """
- issue: Issue!
-
- """
- All notes on this noteable.
- """
- notes(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): NoteConnection!
-
- """
- The total count of user-created notes for this design.
- """
- notesCount: Int!
-
- """
- The project the design belongs to.
- """
- project: Project!
-
- """
- All versions related to this design ordered newest first.
- """
- versions(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- The Global ID of the most recent acceptable version.
- """
- earlierOrEqualToId: DesignManagementVersionID
-
- """
- The SHA256 of the most recent acceptable version.
- """
- earlierOrEqualToSha: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DesignVersionConnection!
-}
-
-"""
-A design pinned to a specific version. The image field reflects the design as of the associated version
-"""
-type DesignAtVersion implements DesignFields {
- """
- The underlying design.
- """
- design: Design!
-
- """
- The diff refs for this design.
- """
- diffRefs: DiffRefs!
-
- """
- How this design was changed in the current version.
- """
- event: DesignVersionEvent!
-
- """
- The filename of the design.
- """
- filename: String!
-
- """
- The full path to the design file.
- """
- fullPath: String!
-
- """
- The ID of this design.
- """
- id: ID!
-
- """
- The URL of the full-sized image.
- """
- image: String!
-
- """
- The URL of the design resized to fit within the bounds of 432x230. This will be `null` if the image has not been generated
- """
- imageV432x230: String
-
- """
- The issue the design belongs to.
- """
- issue: Issue!
-
- """
- The total count of user-created notes for this design.
- """
- notesCount: Int!
-
- """
- The project the design belongs to.
- """
- project: Project!
-
- """
- The version this design-at-versions is pinned to.
- """
- version: DesignVersion!
-}
-
-"""
-The connection type for DesignAtVersion.
-"""
-type DesignAtVersionConnection {
- """
- A list of edges.
- """
- edges: [DesignAtVersionEdge]
-
- """
- A list of nodes.
- """
- nodes: [DesignAtVersion]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type DesignAtVersionEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: DesignAtVersion
-}
-
-"""
-A collection of designs
-"""
-type DesignCollection {
- """
- Copy state of the design collection.
- """
- copyState: DesignCollectionCopyState
-
- """
- Find a specific design.
- """
- design(
- """
- Find a design by its filename.
- """
- filename: String
-
- """
- Find a design by its ID.
- """
- id: DesignManagementDesignID
- ): Design
-
- """
- Find a design as of a version.
- """
- designAtVersion(
- """
- The Global ID of the design at this version.
- """
- id: DesignManagementDesignAtVersionID!
- ): DesignAtVersion
-
- """
- All designs for the design collection.
- """
- designs(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Filters designs to only those that existed at the version. If argument is
- omitted or nil then all designs will reflect the latest version
- """
- atVersion: DesignManagementVersionID
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Filters designs by their filename.
- """
- filenames: [String!]
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Filters designs by their ID.
- """
- ids: [DesignManagementDesignID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DesignConnection!
-
- """
- Issue associated with the design collection.
- """
- issue: Issue!
-
- """
- Project associated with the design collection.
- """
- project: Project!
-
- """
- A specific version.
- """
- version(
- """
- The Global ID of the version.
- """
- id: DesignManagementVersionID
-
- """
- The SHA256 of a specific version.
- """
- sha: String
- ): DesignVersion
-
- """
- All versions related to all designs, ordered newest first.
- """
- versions(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- The Global ID of the most recent acceptable version.
- """
- earlierOrEqualToId: DesignManagementVersionID
-
- """
- The SHA256 of the most recent acceptable version.
- """
- earlierOrEqualToSha: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DesignVersionConnection!
-}
-
-"""
-Copy state of a DesignCollection
-"""
-enum DesignCollectionCopyState {
- """
- The DesignCollection encountered an error during a copy
- """
- ERROR
-
- """
- The DesignCollection is being copied
- """
- IN_PROGRESS
-
- """
- The DesignCollection has no copy in progress
- """
- READY
-}
-
-"""
-The connection type for Design.
-"""
-type DesignConnection {
- """
- A list of edges.
- """
- edges: [DesignEdge]
-
- """
- A list of nodes.
- """
- nodes: [Design]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type DesignEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Design
-}
-
-interface DesignFields {
- """
- The diff refs for this design.
- """
- diffRefs: DiffRefs!
-
- """
- How this design was changed in the current version.
- """
- event: DesignVersionEvent!
-
- """
- The filename of the design.
- """
- filename: String!
-
- """
- The full path to the design file.
- """
- fullPath: String!
-
- """
- The ID of this design.
- """
- id: ID!
-
- """
- The URL of the full-sized image.
- """
- image: String!
-
- """
- The URL of the design resized to fit within the bounds of 432x230. This will be `null` if the image has not been generated
- """
- imageV432x230: String
-
- """
- The issue the design belongs to.
- """
- issue: Issue!
-
- """
- The total count of user-created notes for this design.
- """
- notesCount: Int!
-
- """
- The project the design belongs to.
- """
- project: Project!
-}
-
-type DesignManagement {
- """
- Find a design as of a version.
- """
- designAtVersion(
- """
- The Global ID of the design at this version.
- """
- id: DesignManagementDesignAtVersionID!
- ): DesignAtVersion
-
- """
- Find a version.
- """
- version(
- """
- The Global ID of the version.
- """
- id: DesignManagementVersionID!
- ): DesignVersion
-}
-
-"""
-Autogenerated input type of DesignManagementDelete
-"""
-input DesignManagementDeleteInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The filenames of the designs to delete.
- """
- filenames: [String!]!
-
- """
- The IID of the issue to modify designs for.
- """
- iid: ID!
-
- """
- The project where the issue is to upload designs for.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of DesignManagementDelete
-"""
-type DesignManagementDeletePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The new version in which the designs are deleted.
- """
- version: DesignVersion
-}
-
-"""
-Identifier of DesignManagement::DesignAtVersion.
-"""
-scalar DesignManagementDesignAtVersionID
-
-"""
-Identifier of DesignManagement::Design.
-"""
-scalar DesignManagementDesignID
-
-"""
-Autogenerated input type of DesignManagementMove
-"""
-input DesignManagementMoveInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the design to move.
- """
- id: DesignManagementDesignID!
-
- """
- ID of the immediately following design.
- """
- next: DesignManagementDesignID
-
- """
- ID of the immediately preceding design.
- """
- previous: DesignManagementDesignID
-}
-
-"""
-Autogenerated return type of DesignManagementMove
-"""
-type DesignManagementMovePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The current state of the collection.
- """
- designCollection: DesignCollection
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of DesignManagementUpload
-"""
-input DesignManagementUploadInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The files to upload.
- """
- files: [Upload!]!
-
- """
- The IID of the issue to modify designs for.
- """
- iid: ID!
-
- """
- The project where the issue is to upload designs for.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of DesignManagementUpload
-"""
-type DesignManagementUploadPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The designs that were uploaded by the mutation.
- """
- designs: [Design!]!
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Any designs that were skipped from the upload due to there being no change to their content since their last version
- """
- skippedDesigns: [Design!]!
-}
-
-"""
-Identifier of DesignManagement::Version.
-"""
-scalar DesignManagementVersionID
-
-"""
-A specific version in which designs were added, modified or deleted
-"""
-type DesignVersion {
- """
- A particular design as of this version, provided it is visible at this version.
- """
- designAtVersion(
- """
- The ID of a specific design.
- """
- designId: DesignManagementDesignID
-
- """
- The filename of a specific design.
- """
- filename: String
-
- """
- The ID of the DesignAtVersion.
- """
- id: DesignManagementDesignAtVersionID
- ): DesignAtVersion!
-
- """
- All designs that were changed in the version.
- """
- designs(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DesignConnection!
-
- """
- All designs that are visible at this version, as of this version.
- """
- designsAtVersion(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Filters designs by their filename.
- """
- filenames: [String!]
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Filters designs by their ID.
- """
- ids: [DesignManagementDesignID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DesignAtVersionConnection!
-
- """
- ID of the design version.
- """
- id: ID!
-
- """
- SHA of the design version.
- """
- sha: ID!
-}
-
-"""
-The connection type for DesignVersion.
-"""
-type DesignVersionConnection {
- """
- A list of edges.
- """
- edges: [DesignVersionEdge]
-
- """
- A list of nodes.
- """
- nodes: [DesignVersion]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type DesignVersionEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: DesignVersion
-}
-
-"""
-Mutation event of a design within a version
-"""
-enum DesignVersionEvent {
- """
- A creation event
- """
- CREATION
-
- """
- A deletion event
- """
- DELETION
-
- """
- A modification event
- """
- MODIFICATION
-
- """
- No change
- """
- NONE
-}
-
-"""
-Autogenerated input type of DestroyBoard
-"""
-input DestroyBoardInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the board to destroy.
- """
- id: BoardID!
-}
-
-"""
-Autogenerated input type of DestroyBoardList
-"""
-input DestroyBoardListInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Global ID of the list to destroy. Only label lists are accepted.
- """
- listId: ListID!
-}
-
-"""
-Autogenerated return type of DestroyBoardList
-"""
-type DestroyBoardListPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The list after mutation.
- """
- list: BoardList
-}
-
-"""
-Autogenerated return type of DestroyBoard
-"""
-type DestroyBoardPayload {
- """
- The board after mutation.
- """
- board: Board
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of DestroyComplianceFramework
-"""
-input DestroyComplianceFrameworkInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the compliance framework to destroy.
- """
- id: ComplianceManagementFrameworkID!
-}
-
-"""
-Autogenerated return type of DestroyComplianceFramework
-"""
-type DestroyComplianceFrameworkPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of DestroyContainerRepository
-"""
-input DestroyContainerRepositoryInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the container repository.
- """
- id: ContainerRepositoryID!
-}
-
-"""
-Autogenerated return type of DestroyContainerRepository
-"""
-type DestroyContainerRepositoryPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The container repository policy after scheduling the deletion.
- """
- containerRepository: ContainerRepository!
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of DestroyContainerRepositoryTags
-"""
-input DestroyContainerRepositoryTagsInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the container repository.
- """
- id: ContainerRepositoryID!
-
- """
- Container repository tag(s) to delete. Total number can't be greater than 20
- """
- tagNames: [String!]!
-}
-
-"""
-Autogenerated return type of DestroyContainerRepositoryTags
-"""
-type DestroyContainerRepositoryTagsPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Deleted container repository tags.
- """
- deletedTagNames: [String!]!
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of DestroyNote
-"""
-input DestroyNoteInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the note to destroy.
- """
- id: NoteID!
-}
-
-"""
-Autogenerated return type of DestroyNote
-"""
-type DestroyNotePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The note after mutation.
- """
- note: Note
-}
-
-"""
-Autogenerated input type of DestroySnippet
-"""
-input DestroySnippetInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the snippet to destroy.
- """
- id: SnippetID!
-}
-
-"""
-Autogenerated return type of DestroySnippet
-"""
-type DestroySnippetPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The snippet after mutation.
- """
- snippet: Snippet
-}
-
-type DetailedStatus {
- """
- Action information for the status. This includes method, button title, icon, path, and title.
- """
- action: StatusAction
-
- """
- Path of the details for the status.
- """
- detailsPath: String
-
- """
- Favicon of the status.
- """
- favicon: String
-
- """
- Group of the status.
- """
- group: String
-
- """
- Indicates if the status has further details.
- """
- hasDetails: Boolean
-
- """
- Icon of the status.
- """
- icon: String
-
- """
- Label of the status.
- """
- label: String
-
- """
- Text of the status.
- """
- text: String
-
- """
- Tooltip associated with the status.
- """
- tooltip: String
-}
-
-"""
-Segment
-"""
-type DevopsAdoptionSegment {
- """
- ID of the segment.
- """
- id: ID!
-
- """
- The latest adoption metrics for the segment.
- """
- latestSnapshot: DevopsAdoptionSnapshot
-
- """
- Segment namespace.
- """
- namespace: Namespace
-}
-
-"""
-The connection type for DevopsAdoptionSegment.
-"""
-type DevopsAdoptionSegmentConnection {
- """
- A list of edges.
- """
- edges: [DevopsAdoptionSegmentEdge]
-
- """
- A list of nodes.
- """
- nodes: [DevopsAdoptionSegment]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type DevopsAdoptionSegmentEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: DevopsAdoptionSegment
-}
-
-"""
-Snapshot
-"""
-type DevopsAdoptionSnapshot {
- """
- At least one deployment succeeded.
- """
- deploySucceeded: Boolean!
-
- """
- The end time for the snapshot where the data points were collected.
- """
- endTime: Time!
-
- """
- At least one issue was opened.
- """
- issueOpened: Boolean!
-
- """
- At least one merge request was approved.
- """
- mergeRequestApproved: Boolean!
-
- """
- At least one merge request was opened.
- """
- mergeRequestOpened: Boolean!
-
- """
- At least one pipeline succeeded.
- """
- pipelineSucceeded: Boolean!
-
- """
- The time the snapshot was recorded.
- """
- recordedAt: Time!
-
- """
- At least one runner was used.
- """
- runnerConfigured: Boolean!
-
- """
- At least one security scan succeeded.
- """
- securityScanSucceeded: Boolean!
-
- """
- The start time for the snapshot where the data points were collected.
- """
- startTime: Time!
-}
-
-input DiffImagePositionInput {
- """
- Merge base of the branch the comment was made on.
- """
- baseSha: String
-
- """
- SHA of the HEAD at the time the comment was made.
- """
- headSha: String!
-
- """
- Total height of the image.
- """
- height: Int!
-
- """
- The paths of the file that was changed. Both of the properties of this input
- are optional, but at least one of them is required
- """
- paths: DiffPathsInput!
-
- """
- SHA of the branch being compared against.
- """
- startSha: String!
-
- """
- Total width of the image.
- """
- width: Int!
-
- """
- X position of the note.
- """
- x: Int!
-
- """
- Y position of the note.
- """
- y: Int!
-}
-
-"""
-Identifier of DiffNote.
-"""
-scalar DiffNoteID
-
-input DiffPathsInput {
- """
- The path of the file on the head sha.
- """
- newPath: String
-
- """
- The path of the file on the start sha.
- """
- oldPath: String
-}
-
-type DiffPosition {
- """
- Information about the branch, HEAD, and base at the time of commenting.
- """
- diffRefs: DiffRefs!
-
- """
- Path of the file that was changed.
- """
- filePath: String!
-
- """
- Total height of the image.
- """
- height: Int
-
- """
- Line on HEAD SHA that was changed.
- """
- newLine: Int
-
- """
- Path of the file on the HEAD SHA.
- """
- newPath: String
-
- """
- Line on start SHA that was changed.
- """
- oldLine: Int
-
- """
- Path of the file on the start SHA.
- """
- oldPath: String
-
- """
- Type of file the position refers to.
- """
- positionType: DiffPositionType!
-
- """
- Total width of the image.
- """
- width: Int
-
- """
- X position of the note.
- """
- x: Int
-
- """
- Y position of the note.
- """
- y: Int
-}
-
-input DiffPositionInput {
- """
- Merge base of the branch the comment was made on.
- """
- baseSha: String
-
- """
- SHA of the HEAD at the time the comment was made.
- """
- headSha: String!
-
- """
- Line on HEAD SHA that was changed.
- """
- newLine: Int!
-
- """
- Line on start SHA that was changed.
- """
- oldLine: Int
-
- """
- The paths of the file that was changed. Both of the properties of this input
- are optional, but at least one of them is required
- """
- paths: DiffPathsInput!
-
- """
- SHA of the branch being compared against.
- """
- startSha: String!
-}
-
-"""
-Type of file the position refers to
-"""
-enum DiffPositionType {
- image
- text
-}
-
-type DiffRefs {
- """
- Merge base of the branch the comment was made on.
- """
- baseSha: String
-
- """
- SHA of the HEAD at the time the comment was made.
- """
- headSha: String!
-
- """
- SHA of the branch being compared against.
- """
- startSha: String!
-}
-
-"""
-Changes to a single file
-"""
-type DiffStats {
- """
- Number of lines added to this file.
- """
- additions: Int!
-
- """
- Number of lines deleted from this file.
- """
- deletions: Int!
-
- """
- File path, relative to repository root.
- """
- path: String!
-}
-
-"""
-Aggregated summary of changes
-"""
-type DiffStatsSummary {
- """
- Number of lines added.
- """
- additions: Int!
-
- """
- Number of lines changed.
- """
- changes: Int!
-
- """
- Number of lines deleted.
- """
- deletions: Int!
-
- """
- Number of files changed.
- """
- fileCount: Int!
-}
-
-type Discussion implements ResolvableInterface {
- """
- Timestamp of the discussion's creation.
- """
- createdAt: Time!
-
- """
- ID of this discussion.
- """
- id: DiscussionID!
-
- """
- All notes in the discussion.
- """
- notes(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): NoteConnection!
-
- """
- ID used to reply to this discussion.
- """
- replyId: DiscussionID!
-
- """
- Indicates if the object can be resolved.
- """
- resolvable: Boolean!
-
- """
- Indicates if the object is resolved.
- """
- resolved: Boolean!
-
- """
- Timestamp of when the object was resolved.
- """
- resolvedAt: Time
-
- """
- User who resolved the object.
- """
- resolvedBy: User
-}
-
-"""
-The connection type for Discussion.
-"""
-type DiscussionConnection {
- """
- A list of edges.
- """
- edges: [DiscussionEdge]
-
- """
- A list of nodes.
- """
- nodes: [Discussion]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type DiscussionEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Discussion
-}
-
-"""
-Identifier of Discussion.
-"""
-scalar DiscussionID
-
-"""
-Autogenerated input type of DiscussionToggleResolve
-"""
-input DiscussionToggleResolveInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the discussion.
- """
- id: DiscussionID!
-
- """
- Will resolve the discussion when true, and unresolve the discussion when false.
- """
- resolve: Boolean!
-}
-
-"""
-Autogenerated return type of DiscussionToggleResolve
-"""
-type DiscussionToggleResolvePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The discussion after mutation.
- """
- discussion: Discussion
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of DismissVulnerability
-"""
-input DismissVulnerabilityInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Comment why vulnerability should be dismissed.
- """
- comment: String
-
- """
- Reason why vulnerability should be dismissed.
- """
- dismissalReason: VulnerabilityDismissalReason
-
- """
- ID of the vulnerability to be dismissed.
- """
- id: VulnerabilityID!
-}
-
-"""
-Autogenerated return type of DismissVulnerability
-"""
-type DismissVulnerabilityPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The vulnerability after dismissal.
- """
- vulnerability: Vulnerability
-}
-
-interface Entry {
- """
- Flat path of the entry.
- """
- flatPath: String!
-
- """
- ID of the entry.
- """
- id: ID!
-
- """
- Name of the entry.
- """
- name: String!
-
- """
- Path of the entry.
- """
- path: String!
-
- """
- Last commit SHA for the entry.
- """
- sha: String!
-
- """
- Type of tree entry.
- """
- type: EntryType!
-}
-
-"""
-Type of a tree entry
-"""
-enum EntryType {
- blob
- commit
- tree
-}
-
-"""
-Describes where code is deployed for a project
-"""
-type Environment {
- """
- ID of the environment.
- """
- id: ID!
-
- """
- The most severe open alert for the environment. If multiple alerts have equal severity, the most recent is returned.
- """
- latestOpenedMostSevereAlert: AlertManagementAlert
-
- """
- Metrics dashboard schema for the environment.
- """
- metricsDashboard(
- """
- Path to a file which defines metrics dashboard eg: 'config/prometheus/common_metrics.yml'.
- """
- path: String!
- ): MetricsDashboard
-
- """
- Human-readable name of the environment.
- """
- name: String!
-
- """
- The path to the environment.
- """
- path: String!
-
- """
- State of the environment, for example: available/stopped.
- """
- state: String!
-}
-
-"""
-The connection type for Environment.
-"""
-type EnvironmentConnection {
- """
- A list of edges.
- """
- edges: [EnvironmentEdge]
-
- """
- A list of nodes.
- """
- nodes: [Environment]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type EnvironmentEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Environment
-}
-
-"""
-Identifier of Environment.
-"""
-scalar EnvironmentID
-
-"""
-Autogenerated input type of EnvironmentsCanaryIngressUpdate
-"""
-input EnvironmentsCanaryIngressUpdateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the environment to update.
- """
- id: EnvironmentID!
-
- """
- The weight of the Canary Ingress.
- """
- weight: Int!
-}
-
-"""
-Autogenerated return type of EnvironmentsCanaryIngressUpdate
-"""
-type EnvironmentsCanaryIngressUpdatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Represents an epic
-"""
-type Epic implements CurrentUserTodos & Eventable & Noteable {
- """
- Author of the epic.
- """
- author: User!
-
- """
- A list of award emojis associated with the epic.
- """
- awardEmoji(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): AwardEmojiConnection
-
- """
- Children (sub-epics) of the epic.
- """
- children(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Filter epics by author.
- """
- authorUsername: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Filter epics by given confidentiality.
- """
- confidential: Boolean
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.
- """
- endDate: Time
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- IID of the epic, e.g., "1".
- """
- iid: ID
-
- """
- Filter epics by IID for autocomplete.
- """
- iidStartsWith: String
-
- """
- List of IIDs of epics, e.g., [1, 2].
- """
- iids: [ID!]
-
- """
- Include epics from descendant groups.
- """
- includeDescendantGroups: Boolean = true
-
- """
- Filter epics by labels.
- """
- labelName: [String!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter epics by milestone title, computed from epic's issues.
- """
- milestoneTitle: String
-
- """
- Search query for epic title or description.
- """
- search: String
-
- """
- List epics by sort order.
- """
- sort: EpicSort
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use
- timeframe.start.
- """
- startDate: Time
-
- """
- Filter epics by state.
- """
- state: EpicState
-
- """
- List items overlapping the given timeframe.
- """
- timeframe: Timeframe
- ): EpicConnection
-
- """
- Timestamp of when the epic was closed.
- """
- closedAt: Time
-
- """
- Indicates if the epic is confidential.
- """
- confidential: Boolean
-
- """
- Timestamp of when the epic was created.
- """
- createdAt: Time
-
- """
- To-do items for the current user.
- """
- currentUserTodos(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- State of the to-do items.
- """
- state: TodoStateEnum
- ): TodoConnection!
-
- """
- Number of open and closed descendant epics and issues.
- """
- descendantCounts: EpicDescendantCount
-
- """
- Total weight of open and closed issues in the epic and its descendants.
- """
- descendantWeightSum: EpicDescendantWeights
-
- """
- Description of the epic.
- """
- description: String
-
- """
- All discussions on this noteable.
- """
- discussions(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DiscussionConnection!
-
- """
- Number of downvotes the epic has received.
- """
- downvotes: Int!
-
- """
- Due date of the epic.
- """
- dueDate: Time
-
- """
- Fixed due date of the epic.
- """
- dueDateFixed: Time
-
- """
- Inherited due date of the epic from milestones.
- """
- dueDateFromMilestones: Time
-
- """
- Indicates if the due date has been manually set.
- """
- dueDateIsFixed: Boolean
-
- """
- A list of events associated with the object.
- """
- events(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): EventConnection
-
- """
- Group to which the epic belongs.
- """
- group: Group!
-
- """
- Indicates if the epic has children.
- """
- hasChildren: Boolean!
-
- """
- Indicates if the epic has direct issues.
- """
- hasIssues: Boolean!
-
- """
- Indicates if the epic has a parent epic.
- """
- hasParent: Boolean!
-
- """
- Current health status of the epic.
- """
- healthStatus: EpicHealthStatus
-
- """
- ID of the epic.
- """
- id: ID!
-
- """
- Internal ID of the epic.
- """
- iid: ID!
-
- """
- A list of issues associated with the epic.
- """
- issues(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): EpicIssueConnection
-
- """
- Labels assigned to the epic.
- """
- labels(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): LabelConnection
-
- """
- All notes on this noteable.
- """
- notes(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): NoteConnection!
-
- """
- Parent epic of the epic.
- """
- parent: Epic
-
- """
- List of participants for the epic.
- """
- participants(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): UserConnection
-
- """
- Internal reference of the epic. Returned in shortened format by default.
- """
- reference(
- """
- Indicates if the reference should be returned in full.
- """
- full: Boolean = false
- ): String!
-
- """
- URI path of the epic-issue relationship.
- """
- relationPath: String
-
- """
- The relative position of the epic in the epic tree.
- """
- relativePosition: Int
-
- """
- Start date of the epic.
- """
- startDate: Time
-
- """
- Fixed start date of the epic.
- """
- startDateFixed: Time
-
- """
- Inherited start date of the epic from milestones.
- """
- startDateFromMilestones: Time
-
- """
- Indicates if the start date has been manually set.
- """
- startDateIsFixed: Boolean
-
- """
- State of the epic.
- """
- state: EpicState!
-
- """
- Indicates the currently logged in user is subscribed to the epic.
- """
- subscribed: Boolean!
-
- """
- Title of the epic.
- """
- title: String
-
- """
- Timestamp of when the epic was updated.
- """
- updatedAt: Time
-
- """
- Number of upvotes the epic has received.
- """
- upvotes: Int!
-
- """
- Number of user discussions in the epic.
- """
- userDiscussionsCount: Int!
-
- """
- Number of user notes of the epic.
- """
- userNotesCount: Int!
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: EpicPermissions!
-
- """
- Web path of the epic.
- """
- webPath: String!
-
- """
- Web URL of the epic.
- """
- webUrl: String!
-}
-
-"""
-Autogenerated input type of EpicAddIssue
-"""
-input EpicAddIssueInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The group the epic to mutate belongs to.
- """
- groupPath: ID!
-
- """
- The IID of the epic to mutate.
- """
- iid: ID!
-
- """
- The IID of the issue to be added.
- """
- issueIid: String!
-
- """
- The full path of the project the issue belongs to.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of EpicAddIssue
-"""
-type EpicAddIssuePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The epic after mutation.
- """
- epic: Epic
-
- """
- The epic-issue relation.
- """
- epicIssue: EpicIssue
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Represents an epic board
-"""
-type EpicBoard {
- """
- Global ID of the board.
- """
- id: BoardsEpicBoardID!
-
- """
- Epic board lists.
- """
- lists(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Find an epic board list by ID.
- """
- id: BoardsEpicListID
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): EpicListConnection
-
- """
- Name of the board.
- """
- name: String
-}
-
-"""
-The connection type for EpicBoard.
-"""
-type EpicBoardConnection {
- """
- A list of edges.
- """
- edges: [EpicBoardEdge]
-
- """
- A list of nodes.
- """
- nodes: [EpicBoard]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of EpicBoardCreate
-"""
-input EpicBoardCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Full path of the group with which the resource is associated.
- """
- groupPath: ID
-
- """
- Whether or not backlog list is hidden.
- """
- hideBacklogList: Boolean
-
- """
- Whether or not closed list is hidden.
- """
- hideClosedList: Boolean
-
- """
- The board name.
- """
- name: String
-}
-
-"""
-Autogenerated return type of EpicBoardCreate
-"""
-type EpicBoardCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The created epic board.
- """
- epicBoard: EpicBoard
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-An edge in a connection.
-"""
-type EpicBoardEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: EpicBoard
-}
-
-"""
-Autogenerated input type of EpicBoardListCreate
-"""
-input EpicBoardListCreateInput {
- """
- Create the backlog list.
- """
- backlog: Boolean
-
- """
- Global ID of the issue board to mutate.
- """
- boardId: BoardsEpicBoardID!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Global ID of an existing label.
- """
- labelId: LabelID
-}
-
-"""
-Autogenerated return type of EpicBoardListCreate
-"""
-type EpicBoardListCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Epic list in the epic board.
- """
- list: EpicList
-}
-
-"""
-The connection type for Epic.
-"""
-type EpicConnection {
- """
- A list of edges.
- """
- edges: [EpicEdge]
-
- """
- A list of nodes.
- """
- nodes: [Epic]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Counts of descendent epics
-"""
-type EpicDescendantCount {
- """
- Number of closed child epics.
- """
- closedEpics: Int
-
- """
- Number of closed epic issues.
- """
- closedIssues: Int
-
- """
- Number of opened child epics.
- """
- openedEpics: Int
-
- """
- Number of opened epic issues.
- """
- openedIssues: Int
-}
-
-"""
-Total weight of open and closed descendant issues
-"""
-type EpicDescendantWeights {
- """
- Total weight of completed (closed) issues in this epic, including epic descendants.
- """
- closedIssues: Int
-
- """
- Total weight of opened issues in this epic, including epic descendants.
- """
- openedIssues: Int
-}
-
-"""
-An edge in a connection.
-"""
-type EpicEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Epic
-}
-
-"""
-Health status of child issues
-"""
-type EpicHealthStatus {
- """
- Number of issues at risk.
- """
- issuesAtRisk: Int
-
- """
- Number of issues that need attention.
- """
- issuesNeedingAttention: Int
-
- """
- Number of issues on track.
- """
- issuesOnTrack: Int
-}
-
-"""
-Identifier of Epic.
-"""
-scalar EpicID
-
-"""
-Relationship between an epic and an issue
-"""
-type EpicIssue implements CurrentUserTodos & Noteable {
- """
- Alert associated to this issue.
- """
- alertManagementAlert: AlertManagementAlert
-
- """
- Assignees of the issue.
- """
- assignees(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): UserConnection
-
- """
- User that created the issue.
- """
- author: User!
-
- """
- Indicates the issue is blocked.
- """
- blocked: Boolean!
-
- """
- Count of issues blocking this issue.
- """
- blockedByCount: Int
-
- """
- Timestamp of when the issue was closed.
- """
- closedAt: Time
-
- """
- Indicates the issue is confidential.
- """
- confidential: Boolean!
-
- """
- User specific email address for the issue.
- """
- createNoteEmail: String
-
- """
- Timestamp of when the issue was created.
- """
- createdAt: Time!
-
- """
- To-do items for the current user.
- """
- currentUserTodos(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- State of the to-do items.
- """
- state: TodoStateEnum
- ): TodoConnection!
-
- """
- Description of the issue.
- """
- description: String
-
- """
- The GitLab Flavored Markdown rendering of `description`
- """
- descriptionHtml: String
-
- """
- Collection of design images associated with this issue.
- """
- designCollection: DesignCollection
-
- """
- Indicates discussion is locked on the issue.
- """
- discussionLocked: Boolean!
-
- """
- All discussions on this noteable.
- """
- discussions(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DiscussionConnection!
-
- """
- Number of downvotes the issue has received.
- """
- downvotes: Int!
-
- """
- Due date of the issue.
- """
- dueDate: Time
-
- """
- Indicates if a project has email notifications disabled: `true` if email notifications are disabled.
- """
- emailsDisabled: Boolean!
-
- """
- Epic to which this issue belongs.
- """
- epic: Epic
-
- """
- ID of the epic-issue relation.
- """
- epicIssueId: ID!
-
- """
- Current health status.
- """
- healthStatus: HealthStatus
-
- """
- Human-readable time estimate of the issue.
- """
- humanTimeEstimate: String
-
- """
- Human-readable total time reported as spent on the issue.
- """
- humanTotalTimeSpent: String
-
- """
- Global ID of the epic-issue relation.
- """
- id: ID
-
- """
- Internal ID of the issue.
- """
- iid: ID!
-
- """
- Iteration of the issue.
- """
- iteration: Iteration
-
- """
- Labels of the issue.
- """
- labels(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): LabelConnection
-
- """
- Metric images associated to the issue.
- """
- metricImages: [MetricImage!]
-
- """
- Milestone of the issue.
- """
- milestone: Milestone
-
- """
- Indicates if issue got moved from other project.
- """
- moved: Boolean
-
- """
- Updated Issue after it got moved to another project.
- """
- movedTo: Issue
-
- """
- All notes on this noteable.
- """
- notes(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): NoteConnection!
-
- """
- List of participants in the issue.
- """
- participants(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): UserConnection
-
- """
- Internal reference of the issue. Returned in shortened format by default.
- """
- reference(
- """
- Boolean option specifying whether the reference should be returned in full.
- """
- full: Boolean = false
- ): String!
-
- """
- URI path of the epic-issue relation.
- """
- relationPath: String
-
- """
- Relative position of the issue (used for positioning in epic tree and issue boards).
- """
- relativePosition: Int
-
- """
- Severity level of the incident.
- """
- severity: IssuableSeverity
-
- """
- Timestamp of when the issue SLA expires.
- """
- slaDueAt: Time
-
- """
- State of the issue.
- """
- state: IssueState!
-
- """
- Indicates whether an issue is published to the status page.
- """
- statusPagePublishedIncident: Boolean
-
- """
- Indicates the currently logged in user is subscribed to the issue.
- """
- subscribed: Boolean!
-
- """
- Task completion status of the issue.
- """
- taskCompletionStatus: TaskCompletionStatus!
-
- """
- Time estimate of the issue.
- """
- timeEstimate: Int!
-
- """
- Title of the issue.
- """
- title: String!
-
- """
- The GitLab Flavored Markdown rendering of `title`
- """
- titleHtml: String
-
- """
- Total time reported as spent on the issue.
- """
- totalTimeSpent: Int!
-
- """
- Type of the issue.
- """
- type: IssueType
-
- """
- Timestamp of when the issue was last updated.
- """
- updatedAt: Time!
-
- """
- User that last updated the issue.
- """
- updatedBy: User
-
- """
- Number of upvotes the issue has received.
- """
- upvotes: Int!
-
- """
- Number of user discussions in the issue.
- """
- userDiscussionsCount: Int!
-
- """
- Number of user notes of the issue.
- """
- userNotesCount: Int!
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: IssuePermissions!
-
- """
- Web path of the issue.
- """
- webPath: String!
-
- """
- Web URL of the issue.
- """
- webUrl: String!
-
- """
- Weight of the issue.
- """
- weight: Int
-}
-
-"""
-The connection type for EpicIssue.
-"""
-type EpicIssueConnection {
- """
- Total count of collection.
- """
- count: Int!
-
- """
- A list of edges.
- """
- edges: [EpicIssueEdge]
-
- """
- A list of nodes.
- """
- nodes: [EpicIssue]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-
- """
- Total weight of issues collection.
- """
- weight: Int!
-}
-
-"""
-An edge in a connection.
-"""
-type EpicIssueEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: EpicIssue
-}
-
-"""
-Represents an epic board list
-"""
-type EpicList {
- """
- List epics.
- """
- epics(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): EpicConnection
-
- """
- Global ID of the board list.
- """
- id: BoardsEpicListID!
-
- """
- Label of the list.
- """
- label: Label
-
- """
- Type of the list.
- """
- listType: String!
-
- """
- Position of the list within the board.
- """
- position: Int
-
- """
- Title of the list.
- """
- title: String!
-}
-
-"""
-The connection type for EpicList.
-"""
-type EpicListConnection {
- """
- A list of edges.
- """
- edges: [EpicListEdge]
-
- """
- A list of nodes.
- """
- nodes: [EpicList]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type EpicListEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: EpicList
-}
-
-"""
-Check permissions for the current user on an epic
-"""
-type EpicPermissions {
- """
- Indicates the user can perform `admin_epic` on this resource
- """
- adminEpic: Boolean!
-
- """
- Indicates the user can perform `award_emoji` on this resource
- """
- awardEmoji: Boolean!
-
- """
- Indicates the user can perform `create_epic` on this resource
- """
- createEpic: Boolean!
-
- """
- Indicates the user can perform `create_note` on this resource
- """
- createNote: Boolean!
-
- """
- Indicates the user can perform `destroy_epic` on this resource
- """
- destroyEpic: Boolean!
-
- """
- Indicates the user can perform `read_epic` on this resource
- """
- readEpic: Boolean!
-
- """
- Indicates the user can perform `read_epic_iid` on this resource
- """
- readEpicIid: Boolean!
-
- """
- Indicates the user can perform `update_epic` on this resource
- """
- updateEpic: Boolean!
-}
-
-"""
-Autogenerated input type of EpicSetSubscription
-"""
-input EpicSetSubscriptionInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The group the epic to mutate belongs to.
- """
- groupPath: ID!
-
- """
- The IID of the epic to mutate.
- """
- iid: ID!
-
- """
- The desired state of the subscription.
- """
- subscribedState: Boolean!
-}
-
-"""
-Autogenerated return type of EpicSetSubscription
-"""
-type EpicSetSubscriptionPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The epic after mutation.
- """
- epic: Epic
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Roadmap sort values
-"""
-enum EpicSort {
- """
- End date at ascending order
- """
- end_date_asc
-
- """
- End date at descending order
- """
- end_date_desc
-
- """
- Start date at ascending order
- """
- start_date_asc
-
- """
- Start date at descending order
- """
- start_date_desc
-}
-
-"""
-State of an epic
-"""
-enum EpicState {
- all
- closed
- opened
-}
-
-"""
-State event of an epic
-"""
-enum EpicStateEvent {
- """
- Close the epic
- """
- CLOSE
-
- """
- Reopen the epic
- """
- REOPEN
-}
-
-"""
-A node of an epic tree.
-"""
-input EpicTreeNodeFieldsInputType {
- """
- The ID of the epic_issue or issue that the actual epic or issue is switched with.
- """
- adjacentReferenceId: EpicTreeSortingID
-
- """
- The ID of the epic_issue or epic that is being moved.
- """
- id: EpicTreeSortingID!
-
- """
- ID of the new parent epic.
- """
- newParentId: EpicID
-
- """
- The type of the switch, after or before allowed.
- """
- relativePosition: MoveType
-}
-
-"""
-Autogenerated input type of EpicTreeReorder
-"""
-input EpicTreeReorderInput {
- """
- The ID of the base epic of the tree.
- """
- baseEpicId: EpicID!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Parameters for updating the tree positions.
- """
- moved: EpicTreeNodeFieldsInputType!
-}
-
-"""
-Autogenerated return type of EpicTreeReorder
-"""
-type EpicTreeReorderPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Identifier of EpicTreeSorting.
-"""
-scalar EpicTreeSortingID
-
-"""
-Epic ID wildcard values
-"""
-enum EpicWildcardId {
- """
- Any epic is assigned
- """
- ANY
-
- """
- No epic is assigned
- """
- NONE
-}
-
-"""
-Representing an event
-"""
-type Event {
- """
- Action of the event.
- """
- action: EventAction!
-
- """
- Author of this event.
- """
- author: User!
-
- """
- When this event was created.
- """
- createdAt: Time!
-
- """
- ID of the event.
- """
- id: ID!
-
- """
- When this event was updated.
- """
- updatedAt: Time!
-}
-
-"""
-Event action
-"""
-enum EventAction {
- """
- Approved action
- """
- APPROVED
-
- """
- Archived action
- """
- ARCHIVED
-
- """
- Closed action
- """
- CLOSED
-
- """
- Commented action
- """
- COMMENTED
-
- """
- Created action
- """
- CREATED
-
- """
- Destroyed action
- """
- DESTROYED
-
- """
- Expired action
- """
- EXPIRED
-
- """
- Joined action
- """
- JOINED
-
- """
- Left action
- """
- LEFT
-
- """
- Merged action
- """
- MERGED
-
- """
- Pushed action
- """
- PUSHED
-
- """
- Reopened action
- """
- REOPENED
-
- """
- Updated action
- """
- UPDATED
-}
-
-"""
-The connection type for Event.
-"""
-type EventConnection {
- """
- A list of edges.
- """
- edges: [EventEdge]
-
- """
- A list of nodes.
- """
- nodes: [Event]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type EventEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Event
-}
-
-interface Eventable {
- """
- A list of events associated with the object.
- """
- events(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): EventConnection
-}
-
-"""
-Autogenerated input type of ExportRequirements
-"""
-input ExportRequirementsInput {
- """
- Filter requirements by author username.
- """
- authorUsername: [String!]
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Full project path the requirements are associated with.
- """
- projectPath: ID!
-
- """
- Search query for requirement title.
- """
- search: String
-
- """
- List of selected requirements fields to be exported.
- """
- selectedFields: [String!]
-
- """
- List requirements by sort order.
- """
- sort: Sort
-
- """
- Filter requirements by state.
- """
- state: RequirementState
-}
-
-"""
-Autogenerated return type of ExportRequirements
-"""
-type ExportRequirementsPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Represents an external issue
-"""
-type ExternalIssue {
- """
- Timestamp of when the issue was created.
- """
- createdAt: Time
-
- """
- Type of external tracker.
- """
- externalTracker: String
-
- """
- Relative reference of the issue in the external tracker.
- """
- relativeReference: String
-
- """
- Status of the issue in the external tracker.
- """
- status: String
-
- """
- Title of the issue in the external tracker.
- """
- title: String
-
- """
- Timestamp of when the issue was updated.
- """
- updatedAt: Time
-
- """
- URL to the issue in the external tracker.
- """
- webUrl: String
-}
-
-type GeoNode {
- """
- The maximum concurrency of container repository sync for this secondary node.
- """
- containerRepositoriesMaxCapacity: Int
-
- """
- Indicates whether this Geo node is enabled.
- """
- enabled: Boolean
-
- """
- The maximum concurrency of LFS/attachment backfill for this secondary node.
- """
- filesMaxCapacity: Int
-
- """
- ID of this GeoNode.
- """
- id: ID!
-
- """
- The URL defined on the primary node that secondary nodes should use to contact it.
- """
- internalUrl: String
-
- """
- Find merge request diff registries on this Geo node.
- """
- mergeRequestDiffRegistries(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Filters registries by their ID.
- """
- ids: [ID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): MergeRequestDiffRegistryConnection
-
- """
- The interval (in days) in which the repository verification is valid. Once expired, it will be reverified.
- """
- minimumReverificationInterval: Int
-
- """
- The unique identifier for this Geo node.
- """
- name: String
-
- """
- Package file registries of the GeoNode.
- """
- packageFileRegistries(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Filters registries by their ID.
- """
- ids: [ID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): PackageFileRegistryConnection
-
- """
- Indicates whether this Geo node is the primary.
- """
- primary: Boolean
-
- """
- The maximum concurrency of repository backfill for this secondary node.
- """
- reposMaxCapacity: Int
-
- """
- The namespaces that should be synced, if `selective_sync_type` == `namespaces`.
- """
- selectiveSyncNamespaces(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): NamespaceConnection
-
- """
- The repository storages whose projects should be synced, if `selective_sync_type` == `shards`.
- """
- selectiveSyncShards: [String!]
-
- """
- Indicates if syncing is limited to only specific groups, or shards.
- """
- selectiveSyncType: String
-
- """
- Find snippet repository registries on this Geo node.
- """
- snippetRepositoryRegistries(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Filters registries by their ID.
- """
- ids: [ID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): SnippetRepositoryRegistryConnection
-
- """
- Indicates if this secondary node will replicate blobs in Object Storage.
- """
- syncObjectStorage: Boolean
-
- """
- Find terraform state version registries on this Geo node.
- """
- terraformStateVersionRegistries(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Filters registries by their ID.
- """
- ids: [ID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): TerraformStateVersionRegistryConnection
-
- """
- The user-facing URL for this Geo node.
- """
- url: String
-
- """
- The maximum concurrency of repository verification for this secondary node.
- """
- verificationMaxCapacity: Int
-}
-
-"""
-Identifier of Gitlab::ErrorTracking::DetailedError.
-"""
-scalar GitlabErrorTrackingDetailedErrorID
-
-"""
-Autogenerated input type of GitlabSubscriptionActivate
-"""
-input GitlabSubscriptionActivateInput {
- """
- Activation code received after purchasing a GitLab subscription.
- """
- activationCode: String!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-}
-
-"""
-Autogenerated return type of GitlabSubscriptionActivate
-"""
-type GitlabSubscriptionActivatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-type GrafanaIntegration {
- """
- Timestamp of the issue's creation.
- """
- createdAt: Time!
-
- """
- Indicates whether Grafana integration is enabled.
- """
- enabled: Boolean!
-
- """
- URL for the Grafana host for the Grafana integration.
- """
- grafanaUrl: String!
-
- """
- Internal ID of the Grafana integration.
- """
- id: ID!
-
- """
- Timestamp of the issue's last activity.
- """
- updatedAt: Time!
-}
-
-type Group {
- """
- Size limit for repositories in the namespace in bytes.
- """
- actualRepositorySizeLimit: Float
-
- """
- Additional storage purchased for the root namespace in bytes.
- """
- additionalPurchasedStorageSize: Float
-
- """
- Indicates whether Auto DevOps is enabled for all projects within this group.
- """
- autoDevopsEnabled: Boolean
-
- """
- Avatar URL of the group.
- """
- avatarUrl: String
-
- """
- A single board of the group.
- """
- board(
- """
- The board's ID.
- """
- id: BoardID!
- ): Board
-
- """
- Boards of the group.
- """
- boards(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Find a board by its ID.
- """
- id: BoardID
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): BoardConnection
-
- """
- Represents the code coverage activity for this group.
- """
- codeCoverageActivities(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- First day for which to fetch code coverage activity (maximum time window is set to 90 days).
- """
- startDate: Date!
- ): CodeCoverageActivityConnection
-
- """
- Compliance frameworks available to projects in this namespace. Available only
- when feature flag `ff_custom_compliance_frameworks` is enabled.
- """
- complianceFrameworks(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Global ID of a specific compliance framework to return.
- """
- id: ComplianceManagementFrameworkID
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): ComplianceFrameworkConnection
-
- """
- Container repositories of the group.
- """
- containerRepositories(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter the container repositories by their name.
- """
- name: String
-
- """
- Sort container repositories by this criteria.
- """
- sort: ContainerRepositorySort = created_desc
- ): ContainerRepositoryConnection
-
- """
- Number of container repositories in the group.
- """
- containerRepositoriesCount: Int!
-
- """
- Includes at least one project where the repository size exceeds the limit.
- """
- containsLockedProjects: Boolean!
-
- """
- Custom emoji within this namespace. Available only when feature flag `custom_emoji` is enabled.
- """
- customEmoji(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): CustomEmojiConnection
-
- """
- Description of the namespace.
- """
- description: String
-
- """
- The GitLab Flavored Markdown rendering of `description`
- """
- descriptionHtml: String
-
- """
- Indicates if a group has email notifications disabled.
- """
- emailsDisabled: Boolean
-
- """
- Find a single epic.
- """
- epic(
- """
- Filter epics by author.
- """
- authorUsername: String
-
- """
- Filter epics by given confidentiality.
- """
- confidential: Boolean
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.
- """
- endDate: Time
-
- """
- IID of the epic, e.g., "1".
- """
- iid: ID
-
- """
- Filter epics by IID for autocomplete.
- """
- iidStartsWith: String
-
- """
- List of IIDs of epics, e.g., [1, 2].
- """
- iids: [ID!]
-
- """
- Include epics from descendant groups.
- """
- includeDescendantGroups: Boolean = true
-
- """
- Filter epics by labels.
- """
- labelName: [String!]
-
- """
- Filter epics by milestone title, computed from epic's issues.
- """
- milestoneTitle: String
-
- """
- Search query for epic title or description.
- """
- search: String
-
- """
- List epics by sort order.
- """
- sort: EpicSort
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use
- timeframe.start.
- """
- startDate: Time
-
- """
- Filter epics by state.
- """
- state: EpicState
-
- """
- List items overlapping the given timeframe.
- """
- timeframe: Timeframe
- ): Epic
-
- """
- Find a single epic board.
- """
- epicBoard(
- """
- Find an epic board by ID.
- """
- id: BoardsEpicBoardID!
- ): EpicBoard
-
- """
- Find epic boards.
- """
- epicBoards(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): EpicBoardConnection
-
- """
- Find epics.
- """
- epics(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Filter epics by author.
- """
- authorUsername: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Filter epics by given confidentiality.
- """
- confidential: Boolean
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.
- """
- endDate: Time
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- IID of the epic, e.g., "1".
- """
- iid: ID
-
- """
- Filter epics by IID for autocomplete.
- """
- iidStartsWith: String
-
- """
- List of IIDs of epics, e.g., [1, 2].
- """
- iids: [ID!]
-
- """
- Include epics from descendant groups.
- """
- includeDescendantGroups: Boolean = true
-
- """
- Filter epics by labels.
- """
- labelName: [String!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter epics by milestone title, computed from epic's issues.
- """
- milestoneTitle: String
-
- """
- Search query for epic title or description.
- """
- search: String
-
- """
- List epics by sort order.
- """
- sort: EpicSort
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use
- timeframe.start.
- """
- startDate: Time
-
- """
- Filter epics by state.
- """
- state: EpicState
-
- """
- List items overlapping the given timeframe.
- """
- timeframe: Timeframe
- ): EpicConnection
-
- """
- Indicates if Epics are enabled for namespace
- """
- epicsEnabled: Boolean
-
- """
- Full name of the namespace.
- """
- fullName: String!
-
- """
- Full path of the namespace.
- """
- fullPath: ID!
-
- """
- A membership of a user within this group.
- """
- groupMembers(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter members by the given member relations.
- """
- relations: [GroupMemberRelation!] = [DIRECT, INHERITED]
-
- """
- Search query.
- """
- search: String
- ): GroupMemberConnection
-
- """
- Indicates if Group timelogs are enabled for namespace
- """
- groupTimelogsEnabled: Boolean
-
- """
- ID of the namespace.
- """
- id: ID!
-
- """
- Status of the temporary storage increase.
- """
- isTemporaryStorageIncreaseEnabled: Boolean!
-
- """
- Issues for projects in this group.
- """
- issues(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- ID of a user assigned to the issues, "none" and "any" values are supported.
- """
- assigneeId: String
-
- """
- Username of a user assigned to the issue.
- """
- assigneeUsername: String
-
- """
- Usernames of users assigned to the issue.
- """
- assigneeUsernames: [String!]
-
- """
- Username of the author of the issue.
- """
- authorUsername: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Issues closed after this date.
- """
- closedAfter: Time
-
- """
- Issues closed before this date.
- """
- closedBefore: Time
-
- """
- Issues created after this date.
- """
- createdAfter: Time
-
- """
- Issues created before this date.
- """
- createdBefore: Time
-
- """
- ID of an epic associated with the issues, "none" and "any" values are supported.
- """
- epicId: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- IID of the issue. For example, "1".
- """
- iid: String
-
- """
- List of IIDs of issues. For example, [1, 2].
- """
- iids: [String!]
-
- """
- Include issues belonging to subgroups
- """
- includeSubgroups: Boolean = false
-
- """
- Iterations applied to the issue.
- """
- iterationId: [ID]
-
- """
- Labels applied to this issue.
- """
- labelName: [String]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Milestone applied to this issue.
- """
- milestoneTitle: [String]
-
- """
- Search query for issue title or description.
- """
- search: String
-
- """
- Sort issues by this criteria.
- """
- sort: IssueSort = created_desc
-
- """
- Current state of this issue.
- """
- state: IssuableState
-
- """
- Filter issues by the given issue types.
- """
- types: [IssueType!]
-
- """
- Issues updated after this date.
- """
- updatedAfter: Time
-
- """
- Issues updated before this date.
- """
- updatedBefore: Time
- ): IssueConnection
-
- """
- Find iterations.
- """
- iterations(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.
- """
- endDate: Time
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Global ID of the Iteration to look up.
- """
- id: ID
-
- """
- Internal ID of the Iteration to look up.
- """
- iid: ID
-
- """
- Whether to include ancestor iterations. Defaults to true.
- """
- includeAncestors: Boolean
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use
- timeframe.start.
- """
- startDate: Time
-
- """
- Filter iterations by state.
- """
- state: IterationState
-
- """
- List items overlapping the given timeframe.
- """
- timeframe: Timeframe
-
- """
- Fuzzy search by title.
- """
- title: String
- ): IterationConnection
-
- """
- A label available on this group.
- """
- label(
- """
- Title of the label.
- """
- title: String!
- ): Label
-
- """
- Labels available on this group.
- """
- labels(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Include labels from ancestor groups.
- """
- includeAncestorGroups: Boolean = false
-
- """
- Include labels from descendant groups.
- """
- includeDescendantGroups: Boolean = false
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Include only group level labels.
- """
- onlyGroupLabels: Boolean = false
-
- """
- A search term to find labels with.
- """
- searchTerm: String
- ): LabelConnection
-
- """
- Indicates if Large File Storage (LFS) is enabled for namespace.
- """
- lfsEnabled: Boolean
-
- """
- Indicates if a group is disabled from getting mentioned.
- """
- mentionsDisabled: Boolean
-
- """
- Merge requests for projects in this group.
- """
- mergeRequests(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Username of the assignee.
- """
- assigneeUsername: String
-
- """
- Username of the author.
- """
- authorUsername: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Array of IIDs of merge requests, for example `[1, 2]`.
- """
- iids: [String!]
-
- """
- Include merge requests belonging to subgroups
- """
- includeSubgroups: Boolean = false
-
- """
- Array of label names. All resolved merge requests will have all of these labels.
- """
- labels: [String!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Merge requests merged after this date.
- """
- mergedAfter: Time
-
- """
- Merge requests merged before this date.
- """
- mergedBefore: Time
-
- """
- Title of the milestone.
- """
- milestoneTitle: String
-
- """
- Sort merge requests by this criteria.
- """
- sort: MergeRequestSort = created_desc
-
- """
- Array of source branch names. All resolved merge requests will have one of these branches as their source.
- """
- sourceBranches: [String!]
-
- """
- A merge request state. If provided, all resolved merge requests will have this state.
- """
- state: MergeRequestState
-
- """
- Array of target branch names. All resolved merge requests will have one of these branches as their target.
- """
- targetBranches: [String!]
- ): MergeRequestConnection
-
- """
- Milestones of the group.
- """
- milestones(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- A date that the milestone contains.
- """
- containingDate: Time
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.
- """
- endDate: Time
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Array of global milestone IDs, e.g., "gid://gitlab/Milestone/1".
- """
- ids: [ID!]
-
- """
- Also return milestones in all subgroups and subprojects.
- """
- includeDescendants: Boolean
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- A search string for the title.
- """
- searchTitle: String
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use
- timeframe.start.
- """
- startDate: Time
-
- """
- Filter milestones by state.
- """
- state: MilestoneStateEnum
-
- """
- List items overlapping the given timeframe.
- """
- timeframe: Timeframe
-
- """
- The title of the milestone.
- """
- title: String
- ): MilestoneConnection
-
- """
- Name of the namespace.
- """
- name: String!
-
- """
- The package settings for the namespace.
- """
- packageSettings: PackageSettings
-
- """
- Parent group.
- """
- parent: Group
-
- """
- Path of the namespace.
- """
- path: String!
-
- """
- The permission level required to create projects in the group.
- """
- projectCreationLevel: String
-
- """
- Projects within this namespace.
- """
- projects(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns only the projects which have vulnerabilities.
- """
- hasVulnerabilities: Boolean = false
-
- """
- Include also subgroup projects.
- """
- includeSubgroups: Boolean = false
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Search project with most similar names or paths.
- """
- search: String = null
-
- """
- Sort projects by this criteria.
- """
- sort: NamespaceProjectSort = null
- ): ProjectConnection!
-
- """
- Number of projects in the root namespace where the repository size exceeds the limit.
- """
- repositorySizeExcessProjectCount: Int!
-
- """
- Indicates if users can request access to namespace.
- """
- requestAccessEnabled: Boolean
-
- """
- Indicates if all users in this group are required to set up two-factor authentication.
- """
- requireTwoFactorAuthentication: Boolean
-
- """
- Aggregated storage statistics of the namespace. Only available for root namespaces.
- """
- rootStorageStatistics: RootStorageStatistics
-
- """
- Indicates if sharing a project with another group within this group is prevented.
- """
- shareWithGroupLock: Boolean
-
- """
- Group statistics.
- """
- stats: GroupStats
-
- """
- Total storage limit of the root namespace in bytes.
- """
- storageSizeLimit: Float
-
- """
- The permission level required to create subgroups within the group.
- """
- subgroupCreationLevel: String
-
- """
- Date until the temporary storage increase is active.
- """
- temporaryStorageIncreaseEndsOn: Time
-
- """
- Time logged in issues by group members.
- """
- timelogs(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- List time logs within a date range where the logged date is equal to or before endDate.
- """
- endDate: Time
-
- """
- List time-logs within a time range where the logged time is equal to or before endTime.
- """
- endTime: Time
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- List time logs within a date range where the logged date is equal to or after startDate.
- """
- startDate: Time
-
- """
- List time-logs within a time range where the logged time is equal to or after startTime.
- """
- startTime: Time
- ): TimelogConnection!
-
- """
- Total repository size of all projects in the root namespace in bytes.
- """
- totalRepositorySize: Float
-
- """
- Total excess repository size of all projects in the root namespace in bytes.
- """
- totalRepositorySizeExcess: Float
-
- """
- Time before two-factor authentication is enforced.
- """
- twoFactorGracePeriod: Int
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: GroupPermissions!
-
- """
- Visibility of the namespace.
- """
- visibility: String
-
- """
- Vulnerabilities reported on the projects in the group and its subgroups.
- """
- vulnerabilities(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns only the vulnerabilities which have linked issues.
- """
- hasIssues: Boolean
-
- """
- Returns only the vulnerabilities which have been resolved on default branch.
- """
- hasResolution: Boolean
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter vulnerabilities by project.
- """
- projectId: [ID!]
-
- """
- Filter vulnerabilities by report type.
- """
- reportType: [VulnerabilityReportType!]
-
- """
- Filter vulnerabilities by VulnerabilityScanner.externalId.
- """
- scanner: [String!]
-
- """
- Filter vulnerabilities by severity.
- """
- severity: [VulnerabilitySeverity!]
-
- """
- List vulnerabilities by sort order.
- """
- sort: VulnerabilitySort = severity_desc
-
- """
- Filter vulnerabilities by state.
- """
- state: [VulnerabilityState!]
- ): VulnerabilityConnection
-
- """
- Number of vulnerabilities per day for the projects in the group and its subgroups.
- """
- vulnerabilitiesCountByDay(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Last day for which to fetch vulnerability history.
- """
- endDate: ISO8601Date!
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- First day for which to fetch vulnerability history.
- """
- startDate: ISO8601Date!
- ): VulnerabilitiesCountByDayConnection
-
- """
- Number of vulnerabilities per severity level, per day, for the projects in the
- group and its subgroups. Deprecated in 13.3: Use `vulnerabilitiesCountByDay`.
- """
- vulnerabilitiesCountByDayAndSeverity(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Last day for which to fetch vulnerability history.
- """
- endDate: ISO8601Date!
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- First day for which to fetch vulnerability history.
- """
- startDate: ISO8601Date!
- ): VulnerabilitiesCountByDayAndSeverityConnection @deprecated(reason: "Use `vulnerabilitiesCountByDay`. Deprecated in 13.3.")
-
- """
- Represents vulnerable project counts for each grade.
- """
- vulnerabilityGrades(
- """
- Include grades belonging to subgroups.
- """
- includeSubgroups: Boolean = false
- ): [VulnerableProjectsByGrade!]!
-
- """
- Vulnerability scanners reported on the project vulnerabilities of the group and its subgroups.
- """
- vulnerabilityScanners(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): VulnerabilityScannerConnection
-
- """
- Counts for each vulnerability severity in the group and its subgroups.
- """
- vulnerabilitySeveritiesCount(
- """
- Filter vulnerabilities by project.
- """
- projectId: [ID!]
-
- """
- Filter vulnerabilities by report type.
- """
- reportType: [VulnerabilityReportType!]
-
- """
- Filter vulnerabilities by scanner.
- """
- scanner: [String!]
-
- """
- Filter vulnerabilities by severity.
- """
- severity: [VulnerabilitySeverity!]
-
- """
- Filter vulnerabilities by state.
- """
- state: [VulnerabilityState!]
- ): VulnerabilitySeveritiesCount
-
- """
- Web URL of the group.
- """
- webUrl: String!
-}
-
-"""
-Identifier of Group.
-"""
-scalar GroupID
-
-"""
-Represents a Group Membership
-"""
-type GroupMember implements MemberInterface {
- """
- GitLab::Access level.
- """
- accessLevel: AccessLevel
-
- """
- Date and time the membership was created.
- """
- createdAt: Time
-
- """
- User that authorized membership.
- """
- createdBy: User
-
- """
- Date and time the membership expires.
- """
- expiresAt: Time
-
- """
- Group that a User is a member of.
- """
- group: Group
-
- """
- ID of the member.
- """
- id: ID!
-
- """
- Date and time the membership was last updated.
- """
- updatedAt: Time
-
- """
- User that is associated with the member object.
- """
- user: User!
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: GroupPermissions!
-}
-
-"""
-The connection type for GroupMember.
-"""
-type GroupMemberConnection {
- """
- A list of edges.
- """
- edges: [GroupMemberEdge]
-
- """
- A list of nodes.
- """
- nodes: [GroupMember]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type GroupMemberEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: GroupMember
-}
-
-"""
-Group member relation
-"""
-enum GroupMemberRelation {
- """
- Descendants members
- """
- DESCENDANTS
-
- """
- Direct members
- """
- DIRECT
-
- """
- Inherited members
- """
- INHERITED
-}
-
-type GroupPermissions {
- """
- Indicates the user can perform `read_group` on this resource
- """
- readGroup: Boolean!
-}
-
-"""
-Contains release-related statistics about a group
-"""
-type GroupReleaseStats {
- """
- Total number of releases in all descendant projects of the group. Will always
- return `null` if `group_level_release_statistics` feature flag is disabled
- """
- releasesCount: Int
-
- """
- Percentage of the group's descendant projects that have at least one release.
- Will always return `null` if `group_level_release_statistics` feature flag is disabled
- """
- releasesPercentage: Int
-}
-
-"""
-Contains statistics about a group
-"""
-type GroupStats {
- """
- Statistics related to releases within the group.
- """
- releaseStats: GroupReleaseStats
-}
-
-"""
-Health status of an issue or epic
-"""
-enum HealthStatus {
- atRisk
- needsAttention
- onTrack
-}
-
-"""
-Autogenerated input type of HttpIntegrationCreate
-"""
-input HttpIntegrationCreateInput {
- """
- Whether the integration is receiving alerts.
- """
- active: Boolean!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The name of the integration.
- """
- name: String!
-
- """
- The custom mapping of GitLab alert attributes to fields from the payload_example.
- """
- payloadAttributeMappings: [AlertManagementPayloadAlertFieldInput!]
-
- """
- The example of an alert payload.
- """
- payloadExample: JsonString
-
- """
- The project to create the integration in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of HttpIntegrationCreate
-"""
-type HttpIntegrationCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The HTTP integration.
- """
- integration: AlertManagementHttpIntegration
-}
-
-"""
-Autogenerated input type of HttpIntegrationDestroy
-"""
-input HttpIntegrationDestroyInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The ID of the integration to remove.
- """
- id: AlertManagementHttpIntegrationID!
-}
-
-"""
-Autogenerated return type of HttpIntegrationDestroy
-"""
-type HttpIntegrationDestroyPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The HTTP integration.
- """
- integration: AlertManagementHttpIntegration
-}
-
-"""
-Autogenerated input type of HttpIntegrationResetToken
-"""
-input HttpIntegrationResetTokenInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The ID of the integration to mutate.
- """
- id: AlertManagementHttpIntegrationID!
-}
-
-"""
-Autogenerated return type of HttpIntegrationResetToken
-"""
-type HttpIntegrationResetTokenPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The HTTP integration.
- """
- integration: AlertManagementHttpIntegration
-}
-
-"""
-Autogenerated input type of HttpIntegrationUpdate
-"""
-input HttpIntegrationUpdateInput {
- """
- Whether the integration is receiving alerts.
- """
- active: Boolean
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The ID of the integration to mutate.
- """
- id: AlertManagementHttpIntegrationID!
-
- """
- The name of the integration.
- """
- name: String
-
- """
- The custom mapping of GitLab alert attributes to fields from the payload_example.
- """
- payloadAttributeMappings: [AlertManagementPayloadAlertFieldInput!]
-
- """
- The example of an alert payload.
- """
- payloadExample: JsonString
-}
-
-"""
-Autogenerated return type of HttpIntegrationUpdate
-"""
-type HttpIntegrationUpdatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The HTTP integration.
- """
- integration: AlertManagementHttpIntegration
-}
-
-"""
-An ISO 8601-encoded date
-"""
-scalar ISO8601Date
-
-"""
-Identifier of IncidentManagement::OncallParticipant.
-"""
-scalar IncidentManagementOncallParticipantID
-
-"""
-Describes an incident management on-call rotation
-"""
-type IncidentManagementOncallRotation {
- """
- ID of the on-call rotation.
- """
- id: IncidentManagementOncallRotationID!
-
- """
- Length of the on-call schedule, in the units specified by lengthUnit.
- """
- length: Int
-
- """
- Unit of the on-call rotation length.
- """
- lengthUnit: OncallRotationUnitEnum
-
- """
- Name of the on-call rotation.
- """
- name: String!
-
- """
- Participants of the on-call rotation.
- """
- participants(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): OncallParticipantTypeConnection
-
- """
- Blocks of time for which a participant is on-call within a given time frame. Time frame cannot exceed one month.
- """
- shifts(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- End of timeframe to include shifts for. Cannot exceed one month after start.
- """
- endTime: Time!
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Start of timeframe to include shifts for.
- """
- startTime: Time!
- ): IncidentManagementOncallShiftConnection
-
- """
- Start date of the on-call rotation.
- """
- startsAt: Time
-}
-
-"""
-The connection type for IncidentManagementOncallRotation.
-"""
-type IncidentManagementOncallRotationConnection {
- """
- A list of edges.
- """
- edges: [IncidentManagementOncallRotationEdge]
-
- """
- A list of nodes.
- """
- nodes: [IncidentManagementOncallRotation]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type IncidentManagementOncallRotationEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: IncidentManagementOncallRotation
-}
-
-"""
-Identifier of IncidentManagement::OncallRotation.
-"""
-scalar IncidentManagementOncallRotationID
-
-"""
-Describes an incident management on-call schedule
-"""
-type IncidentManagementOncallSchedule {
- """
- Description of the on-call schedule.
- """
- description: String
-
- """
- Internal ID of the on-call schedule.
- """
- iid: ID!
-
- """
- Name of the on-call schedule.
- """
- name: String!
-
- """
- On-call rotations for the on-call schedule.
- """
- rotations(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): IncidentManagementOncallRotationConnection!
-
- """
- Time zone of the on-call schedule.
- """
- timezone: String!
-}
-
-"""
-The connection type for IncidentManagementOncallSchedule.
-"""
-type IncidentManagementOncallScheduleConnection {
- """
- A list of edges.
- """
- edges: [IncidentManagementOncallScheduleEdge]
-
- """
- A list of nodes.
- """
- nodes: [IncidentManagementOncallSchedule]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type IncidentManagementOncallScheduleEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: IncidentManagementOncallSchedule
-}
-
-"""
-A block of time for which a participant is on-call.
-"""
-type IncidentManagementOncallShift {
- """
- End time of the on-call shift.
- """
- endsAt: Time
-
- """
- Participant assigned to the on-call shift.
- """
- participant: OncallParticipantType
-
- """
- Start time of the on-call shift.
- """
- startsAt: Time
-}
-
-"""
-The connection type for IncidentManagementOncallShift.
-"""
-type IncidentManagementOncallShiftConnection {
- """
- A list of edges.
- """
- edges: [IncidentManagementOncallShiftEdge]
-
- """
- A list of nodes.
- """
- nodes: [IncidentManagementOncallShift]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type IncidentManagementOncallShiftEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: IncidentManagementOncallShift
-}
-
-type InstanceSecurityDashboard {
- """
- Projects selected in Instance Security Dashboard.
- """
- projects(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): ProjectConnection!
-
- """
- Represents vulnerable project counts for each grade.
- """
- vulnerabilityGrades: [VulnerableProjectsByGrade!]!
-
- """
- Vulnerability scanners reported on the vulnerabilities from projects selected in Instance Security Dashboard.
- """
- vulnerabilityScanners(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): VulnerabilityScannerConnection
-
- """
- Counts for each vulnerability severity from projects selected in Instance Security Dashboard.
- """
- vulnerabilitySeveritiesCount(
- """
- Filter vulnerabilities by project.
- """
- projectId: [ID!]
-
- """
- Filter vulnerabilities by report type.
- """
- reportType: [VulnerabilityReportType!]
-
- """
- Filter vulnerabilities by scanner.
- """
- scanner: [String!]
-
- """
- Filter vulnerabilities by severity.
- """
- severity: [VulnerabilitySeverity!]
-
- """
- Filter vulnerabilities by state.
- """
- state: [VulnerabilityState!]
- ): VulnerabilitySeveritiesCount
-}
-
-"""
-Represents a recorded measurement (object count) for the Admins
-"""
-type InstanceStatisticsMeasurement {
- """
- Object count.
- """
- count: Int!
-
- """
- The type of objects being measured.
- """
- identifier: MeasurementIdentifier!
-
- """
- The time the measurement was recorded.
- """
- recordedAt: Time
-}
-
-"""
-The connection type for InstanceStatisticsMeasurement.
-"""
-type InstanceStatisticsMeasurementConnection {
- """
- A list of edges.
- """
- edges: [InstanceStatisticsMeasurementEdge]
-
- """
- A list of nodes.
- """
- nodes: [InstanceStatisticsMeasurement]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type InstanceStatisticsMeasurementEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: InstanceStatisticsMeasurement
-}
-
-"""
-Incident severity
-"""
-enum IssuableSeverity {
- """
- Critical severity
- """
- CRITICAL
-
- """
- High severity
- """
- HIGH
-
- """
- Low severity
- """
- LOW
-
- """
- Medium severity
- """
- MEDIUM
-
- """
- Unknown severity
- """
- UNKNOWN
-}
-
-"""
-State of a GitLab issue or merge request
-"""
-enum IssuableState {
- all
- closed
- locked
- opened
-}
-
-type Issue implements CurrentUserTodos & Noteable {
- """
- Alert associated to this issue.
- """
- alertManagementAlert: AlertManagementAlert
-
- """
- Assignees of the issue.
- """
- assignees(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): UserConnection
-
- """
- User that created the issue.
- """
- author: User!
-
- """
- Indicates the issue is blocked.
- """
- blocked: Boolean!
-
- """
- Count of issues blocking this issue.
- """
- blockedByCount: Int
-
- """
- Timestamp of when the issue was closed.
- """
- closedAt: Time
-
- """
- Indicates the issue is confidential.
- """
- confidential: Boolean!
-
- """
- User specific email address for the issue.
- """
- createNoteEmail: String
-
- """
- Timestamp of when the issue was created.
- """
- createdAt: Time!
-
- """
- To-do items for the current user.
- """
- currentUserTodos(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- State of the to-do items.
- """
- state: TodoStateEnum
- ): TodoConnection!
-
- """
- Description of the issue.
- """
- description: String
-
- """
- The GitLab Flavored Markdown rendering of `description`
- """
- descriptionHtml: String
-
- """
- Collection of design images associated with this issue.
- """
- designCollection: DesignCollection
-
- """
- Indicates discussion is locked on the issue.
- """
- discussionLocked: Boolean!
-
- """
- All discussions on this noteable.
- """
- discussions(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DiscussionConnection!
-
- """
- Number of downvotes the issue has received.
- """
- downvotes: Int!
-
- """
- Due date of the issue.
- """
- dueDate: Time
-
- """
- Indicates if a project has email notifications disabled: `true` if email notifications are disabled.
- """
- emailsDisabled: Boolean!
-
- """
- Epic to which this issue belongs.
- """
- epic: Epic
-
- """
- Current health status.
- """
- healthStatus: HealthStatus
-
- """
- Human-readable time estimate of the issue.
- """
- humanTimeEstimate: String
-
- """
- Human-readable total time reported as spent on the issue.
- """
- humanTotalTimeSpent: String
-
- """
- ID of the issue.
- """
- id: ID!
-
- """
- Internal ID of the issue.
- """
- iid: ID!
-
- """
- Iteration of the issue.
- """
- iteration: Iteration
-
- """
- Labels of the issue.
- """
- labels(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): LabelConnection
-
- """
- Metric images associated to the issue.
- """
- metricImages: [MetricImage!]
-
- """
- Milestone of the issue.
- """
- milestone: Milestone
-
- """
- Indicates if issue got moved from other project.
- """
- moved: Boolean
-
- """
- Updated Issue after it got moved to another project.
- """
- movedTo: Issue
-
- """
- All notes on this noteable.
- """
- notes(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): NoteConnection!
-
- """
- List of participants in the issue.
- """
- participants(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): UserConnection
-
- """
- Internal reference of the issue. Returned in shortened format by default.
- """
- reference(
- """
- Boolean option specifying whether the reference should be returned in full.
- """
- full: Boolean = false
- ): String!
-
- """
- Relative position of the issue (used for positioning in epic tree and issue boards).
- """
- relativePosition: Int
-
- """
- Severity level of the incident.
- """
- severity: IssuableSeverity
-
- """
- Timestamp of when the issue SLA expires.
- """
- slaDueAt: Time
-
- """
- State of the issue.
- """
- state: IssueState!
-
- """
- Indicates whether an issue is published to the status page.
- """
- statusPagePublishedIncident: Boolean
-
- """
- Indicates the currently logged in user is subscribed to the issue.
- """
- subscribed: Boolean!
-
- """
- Task completion status of the issue.
- """
- taskCompletionStatus: TaskCompletionStatus!
-
- """
- Time estimate of the issue.
- """
- timeEstimate: Int!
-
- """
- Title of the issue.
- """
- title: String!
-
- """
- The GitLab Flavored Markdown rendering of `title`
- """
- titleHtml: String
-
- """
- Total time reported as spent on the issue.
- """
- totalTimeSpent: Int!
-
- """
- Type of the issue.
- """
- type: IssueType
-
- """
- Timestamp of when the issue was last updated.
- """
- updatedAt: Time!
-
- """
- User that last updated the issue.
- """
- updatedBy: User
-
- """
- Number of upvotes the issue has received.
- """
- upvotes: Int!
-
- """
- Number of user discussions in the issue.
- """
- userDiscussionsCount: Int!
-
- """
- Number of user notes of the issue.
- """
- userNotesCount: Int!
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: IssuePermissions!
-
- """
- Web path of the issue.
- """
- webPath: String!
-
- """
- Web URL of the issue.
- """
- webUrl: String!
-
- """
- Weight of the issue.
- """
- weight: Int
-}
-
-"""
-The connection type for Issue.
-"""
-type IssueConnection {
- """
- Total count of collection.
- """
- count: Int!
-
- """
- A list of edges.
- """
- edges: [IssueEdge]
-
- """
- A list of nodes.
- """
- nodes: [Issue]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-
- """
- Total weight of issues collection.
- """
- weight: Int!
-}
-
-"""
-An edge in a connection.
-"""
-type IssueEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Issue
-}
-
-"""
-Identifier of Issue.
-"""
-scalar IssueID
-
-"""
-Autogenerated input type of IssueMove
-"""
-input IssueMoveInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the issue to mutate.
- """
- iid: String!
-
- """
- The project the issue to mutate is in.
- """
- projectPath: ID!
-
- """
- The project to move the issue to.
- """
- targetProjectPath: ID!
-}
-
-"""
-Autogenerated input type of IssueMoveList
-"""
-input IssueMoveListInput {
- """
- Global ID of the board that the issue is in.
- """
- boardId: ID!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The ID of the parent epic. NULL when removing the association.
- """
- epicId: EpicID
-
- """
- ID of the board list that the issue will be moved from.
- """
- fromListId: ID
-
- """
- IID of the issue to mutate.
- """
- iid: String!
-
- """
- ID of issue that should be placed after the current issue.
- """
- moveAfterId: ID
-
- """
- ID of issue that should be placed before the current issue.
- """
- moveBeforeId: ID
-
- """
- Project the issue to mutate is in.
- """
- projectPath: ID!
-
- """
- ID of the board list that the issue will be moved to.
- """
- toListId: ID
-}
-
-"""
-Autogenerated return type of IssueMoveList
-"""
-type IssueMoveListPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-"""
-Autogenerated return type of IssueMove
-"""
-type IssueMovePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-"""
-Check permissions for the current user on a issue
-"""
-type IssuePermissions {
- """
- Indicates the user can perform `admin_issue` on this resource
- """
- adminIssue: Boolean!
-
- """
- Indicates the user can perform `create_design` on this resource
- """
- createDesign: Boolean!
-
- """
- Indicates the user can perform `create_note` on this resource
- """
- createNote: Boolean!
-
- """
- Indicates the user can perform `destroy_design` on this resource
- """
- destroyDesign: Boolean!
-
- """
- Indicates the user can perform `read_design` on this resource
- """
- readDesign: Boolean!
-
- """
- Indicates the user can perform `read_issue` on this resource
- """
- readIssue: Boolean!
-
- """
- Indicates the user can perform `reopen_issue` on this resource
- """
- reopenIssue: Boolean!
-
- """
- Indicates the user can perform `update_issue` on this resource
- """
- updateIssue: Boolean!
-}
-
-"""
-Autogenerated input type of IssueSetAssignees
-"""
-input IssueSetAssigneesInput {
- """
- The usernames to assign to the resource. Replaces existing assignees by default.
- """
- assigneeUsernames: [String!]!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the issue to mutate.
- """
- iid: String!
-
- """
- The operation to perform. Defaults to REPLACE.
- """
- operationMode: MutationOperationMode
-
- """
- The project the issue to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of IssueSetAssignees
-"""
-type IssueSetAssigneesPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-"""
-Autogenerated input type of IssueSetConfidential
-"""
-input IssueSetConfidentialInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Whether or not to set the issue as a confidential.
- """
- confidential: Boolean!
-
- """
- The IID of the issue to mutate.
- """
- iid: String!
-
- """
- The project the issue to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of IssueSetConfidential
-"""
-type IssueSetConfidentialPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-"""
-Autogenerated input type of IssueSetDueDate
-"""
-input IssueSetDueDateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The desired due date for the issue.
- """
- dueDate: Time!
-
- """
- The IID of the issue to mutate.
- """
- iid: String!
-
- """
- The project the issue to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of IssueSetDueDate
-"""
-type IssueSetDueDatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-"""
-Autogenerated input type of IssueSetEpic
-"""
-input IssueSetEpicInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Global ID of the epic to be assigned to the issue, epic will be removed if absent or set to null
- """
- epicId: EpicID
-
- """
- The IID of the issue to mutate.
- """
- iid: String!
-
- """
- The project the issue to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of IssueSetEpic
-"""
-type IssueSetEpicPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-"""
-Autogenerated input type of IssueSetIteration
-"""
-input IssueSetIterationInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the issue to mutate.
- """
- iid: String!
-
- """
- The iteration to assign to the issue.
- """
- iterationId: IterationID
-
- """
- The project the issue to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of IssueSetIteration
-"""
-type IssueSetIterationPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-"""
-Autogenerated input type of IssueSetLocked
-"""
-input IssueSetLockedInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the issue to mutate.
- """
- iid: String!
-
- """
- Whether or not to lock discussion on the issue.
- """
- locked: Boolean!
-
- """
- The project the issue to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of IssueSetLocked
-"""
-type IssueSetLockedPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-"""
-Autogenerated input type of IssueSetSeverity
-"""
-input IssueSetSeverityInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the issue to mutate.
- """
- iid: String!
-
- """
- The project the issue to mutate is in.
- """
- projectPath: ID!
-
- """
- Set the incident severity level.
- """
- severity: IssuableSeverity!
-}
-
-"""
-Autogenerated return type of IssueSetSeverity
-"""
-type IssueSetSeverityPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-"""
-Autogenerated input type of IssueSetSubscription
-"""
-input IssueSetSubscriptionInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the issue to mutate.
- """
- iid: String!
-
- """
- The project the issue to mutate is in.
- """
- projectPath: ID!
-
- """
- The desired state of the subscription.
- """
- subscribedState: Boolean!
-}
-
-"""
-Autogenerated return type of IssueSetSubscription
-"""
-type IssueSetSubscriptionPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-"""
-Autogenerated input type of IssueSetWeight
-"""
-input IssueSetWeightInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the issue to mutate.
- """
- iid: String!
-
- """
- The project the issue to mutate is in.
- """
- projectPath: ID!
-
- """
- The desired weight for the issue.
- """
- weight: Int!
-}
-
-"""
-Autogenerated return type of IssueSetWeight
-"""
-type IssueSetWeightPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-"""
-Values for sorting issues
-"""
-enum IssueSort {
- """
- Created at ascending order
- """
- CREATED_ASC
-
- """
- Created at descending order
- """
- CREATED_DESC
-
- """
- Due date by ascending order
- """
- DUE_DATE_ASC
-
- """
- Due date by descending order
- """
- DUE_DATE_DESC
-
- """
- Label priority by ascending order
- """
- LABEL_PRIORITY_ASC
-
- """
- Label priority by descending order
- """
- LABEL_PRIORITY_DESC
-
- """
- Milestone due date by ascending order
- """
- MILESTONE_DUE_ASC
-
- """
- Milestone due date by descending order
- """
- MILESTONE_DUE_DESC
-
- """
- Priority by ascending order
- """
- PRIORITY_ASC
-
- """
- Priority by descending order
- """
- PRIORITY_DESC
-
- """
- Published issues shown last
- """
- PUBLISHED_ASC
-
- """
- Published issues shown first
- """
- PUBLISHED_DESC
-
- """
- Relative position by ascending order
- """
- RELATIVE_POSITION_ASC
-
- """
- Severity from less critical to more critical
- """
- SEVERITY_ASC
-
- """
- Severity from more critical to less critical
- """
- SEVERITY_DESC
-
- """
- Issues with earliest SLA due time shown first
- """
- SLA_DUE_AT_ASC
-
- """
- Issues with latest SLA due time shown first
- """
- SLA_DUE_AT_DESC
-
- """
- Updated at ascending order
- """
- UPDATED_ASC
-
- """
- Updated at descending order
- """
- UPDATED_DESC
-
- """
- Weight by ascending order
- """
- WEIGHT_ASC
-
- """
- Weight by descending order
- """
- WEIGHT_DESC
-
- """
- Created at ascending order
- """
- created_asc @deprecated(reason: "Use CREATED_ASC. Deprecated in 13.5.")
-
- """
- Created at descending order
- """
- created_desc @deprecated(reason: "Use CREATED_DESC. Deprecated in 13.5.")
-
- """
- Updated at ascending order
- """
- updated_asc @deprecated(reason: "Use UPDATED_ASC. Deprecated in 13.5.")
-
- """
- Updated at descending order
- """
- updated_desc @deprecated(reason: "Use UPDATED_DESC. Deprecated in 13.5.")
-}
-
-"""
-State of a GitLab issue
-"""
-enum IssueState {
- all
- closed
- locked
- opened
-}
-
-"""
-Values for issue state events
-"""
-enum IssueStateEvent {
- """
- Closes the issue
- """
- CLOSE
-
- """
- Reopens the issue
- """
- REOPEN
-}
-
-"""
-Represents total number of issues for the represented statuses
-"""
-type IssueStatusCountsType {
- """
- Number of issues with status ALL for the project
- """
- all: Int
-
- """
- Number of issues with status CLOSED for the project
- """
- closed: Int
-
- """
- Number of issues with status OPENED for the project
- """
- opened: Int
-}
-
-"""
-Issue type
-"""
-enum IssueType {
- """
- Incident issue type
- """
- INCIDENT
-
- """
- Issue issue type
- """
- ISSUE
-
- """
- Test Case issue type
- """
- TEST_CASE
-}
-
-"""
-Represents an iteration object
-"""
-type Iteration implements TimeboxReportInterface {
- """
- Timestamp of iteration creation.
- """
- createdAt: Time!
-
- """
- Description of the iteration.
- """
- description: String
-
- """
- The GitLab Flavored Markdown rendering of `description`
- """
- descriptionHtml: String
-
- """
- Timestamp of the iteration due date.
- """
- dueDate: Time
-
- """
- ID of the iteration.
- """
- id: ID!
-
- """
- Internal ID of the iteration.
- """
- iid: ID!
-
- """
- Historically accurate report about the timebox.
- """
- report: TimeboxReport
-
- """
- Web path of the iteration, scoped to the query parent. Only valid for Project parents. Returns null in other contexts.
- """
- scopedPath: String
-
- """
- Web URL of the iteration, scoped to the query parent. Only valid for Project parents. Returns null in other contexts.
- """
- scopedUrl: String
-
- """
- Timestamp of the iteration start date.
- """
- startDate: Time
-
- """
- State of the iteration.
- """
- state: IterationState!
-
- """
- Title of the iteration.
- """
- title: String!
-
- """
- Timestamp of last iteration update.
- """
- updatedAt: Time!
-
- """
- Web path of the iteration.
- """
- webPath: String!
-
- """
- Web URL of the iteration.
- """
- webUrl: String!
-}
-
-"""
-The connection type for Iteration.
-"""
-type IterationConnection {
- """
- A list of edges.
- """
- edges: [IterationEdge]
-
- """
- A list of nodes.
- """
- nodes: [Iteration]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type IterationEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Iteration
-}
-
-"""
-Identifier of Iteration.
-"""
-scalar IterationID
-
-"""
-State of a GitLab iteration
-"""
-enum IterationState {
- all
- closed
- opened
- started
- upcoming
-}
-
-"""
-Iteration ID wildcard values
-"""
-enum IterationWildcardId {
- """
- An iteration is assigned
- """
- ANY
-
- """
- Current iteration
- """
- CURRENT
-
- """
- No iteration is assigned
- """
- NONE
-}
-
-"""
-Represents untyped JSON
-"""
-scalar JSON
-
-type JiraImport {
- """
- Timestamp of when the Jira import was created.
- """
- createdAt: Time
-
- """
- Count of issues that failed to import.
- """
- failedToImportCount: Int!
-
- """
- Count of issues that were successfully imported.
- """
- importedIssuesCount: Int!
-
- """
- Project key for the imported Jira project.
- """
- jiraProjectKey: String!
-
- """
- Timestamp of when the Jira import was scheduled.
- """
- scheduledAt: Time
-
- """
- User that started the Jira import.
- """
- scheduledBy: User
-
- """
- Total count of issues that were attempted to import.
- """
- totalIssueCount: Int!
-}
-
-"""
-The connection type for JiraImport.
-"""
-type JiraImportConnection {
- """
- A list of edges.
- """
- edges: [JiraImportEdge]
-
- """
- A list of nodes.
- """
- nodes: [JiraImport]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type JiraImportEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: JiraImport
-}
-
-"""
-Autogenerated input type of JiraImportStart
-"""
-input JiraImportStartInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Project key of the importer Jira project.
- """
- jiraProjectKey: String!
-
- """
- Project name of the importer Jira project.
- """
- jiraProjectName: String
-
- """
- The project to import the Jira project into.
- """
- projectPath: ID!
-
- """
- The mapping of Jira to GitLab users.
- """
- usersMapping: [JiraUsersMappingInputType!]
-}
-
-"""
-Autogenerated return type of JiraImportStart
-"""
-type JiraImportStartPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The Jira import data after mutation.
- """
- jiraImport: JiraImport
-}
-
-"""
-Autogenerated input type of JiraImportUsers
-"""
-input JiraImportUsersInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The project to import the Jira users into.
- """
- projectPath: ID!
-
- """
- The index of the record the import should started at, default 0 (50 records returned).
- """
- startAt: Int
-}
-
-"""
-Autogenerated return type of JiraImportUsers
-"""
-type JiraImportUsersPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Users returned from Jira, matched by email and name if possible.
- """
- jiraUsers: [JiraUser!]
-}
-
-type JiraProject {
- """
- Key of the Jira project.
- """
- key: String!
-
- """
- Name of the Jira project.
- """
- name: String
-
- """
- ID of the Jira project.
- """
- projectId: Int!
-}
-
-"""
-The connection type for JiraProject.
-"""
-type JiraProjectConnection {
- """
- A list of edges.
- """
- edges: [JiraProjectEdge]
-
- """
- A list of nodes.
- """
- nodes: [JiraProject]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type JiraProjectEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: JiraProject
-}
-
-type JiraService implements Service {
- """
- Indicates if the service is active.
- """
- active: Boolean
-
- """
- List of all Jira projects fetched through Jira REST API.
- """
- projects(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Project name or key.
- """
- name: String
- ): JiraProjectConnection
-
- """
- Class name of the service.
- """
- type: String
-}
-
-type JiraUser {
- """
- ID of the matched GitLab user.
- """
- gitlabId: Int
-
- """
- Name of the matched GitLab user.
- """
- gitlabName: String
-
- """
- Username of the matched GitLab user.
- """
- gitlabUsername: String
-
- """
- Account ID of the Jira user.
- """
- jiraAccountId: String!
-
- """
- Display name of the Jira user.
- """
- jiraDisplayName: String!
-
- """
- Email of the Jira user, returned only for users with public emails.
- """
- jiraEmail: String
-}
-
-input JiraUsersMappingInputType {
- """
- Id of the GitLab user.
- """
- gitlabId: Int
-
- """
- Jira account ID of the user.
- """
- jiraAccountId: String!
-}
-
-enum JobArtifactFileType {
- ACCESSIBILITY
- API_FUZZING
- ARCHIVE
- BROWSER_PERFORMANCE
- CLUSTER_APPLICATIONS
- COBERTURA
- CODEQUALITY
- CONTAINER_SCANNING
- COVERAGE_FUZZING
- DAST
- DEPENDENCY_SCANNING
- DOTENV
- JUNIT
- LICENSE_MANAGEMENT
- LICENSE_SCANNING
- LOAD_PERFORMANCE
- LSIF
- METADATA
- METRICS
- METRICS_REFEREE
- NETWORK_REFEREE
- PERFORMANCE
- REQUIREMENTS
- SAST
- SECRET_DETECTION
- TERRAFORM
- TRACE
-}
-
-"""
-JSON object as raw string
-"""
-scalar JsonString
-
-type Label {
- """
- Background color of the label.
- """
- color: String!
-
- """
- Description of the label (Markdown rendered as HTML for caching).
- """
- description: String
-
- """
- The GitLab Flavored Markdown rendering of `description`
- """
- descriptionHtml: String
-
- """
- Label ID.
- """
- id: ID!
-
- """
- Text color of the label.
- """
- textColor: String!
-
- """
- Content of the label.
- """
- title: String!
-}
-
-"""
-The connection type for Label.
-"""
-type LabelConnection {
- """
- Total count of collection.
- """
- count: Int!
-
- """
- A list of edges.
- """
- edges: [LabelEdge]
-
- """
- A list of nodes.
- """
- nodes: [Label]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of LabelCreate
-"""
-input LabelCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The color of the label given in 6-digit hex notation with leading '#' sign
- (e.g. #FFAABB) or one of the CSS color names in
- https://developer.mozilla.org/en-US/docs/Web/CSS/color_value#Color_keywords.
- """
- color: String = "#6699cc"
-
- """
- Description of the label.
- """
- description: String
-
- """
- Full path of the group with which the resource is associated.
- """
- groupPath: ID
-
- """
- Full path of the project with which the resource is associated.
- """
- projectPath: ID
-
- """
- Title of the label.
- """
- title: String!
-}
-
-"""
-Autogenerated return type of LabelCreate
-"""
-type LabelCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The label after mutation.
- """
- label: Label
-}
-
-"""
-An edge in a connection.
-"""
-type LabelEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Label
-}
-
-"""
-Identifier of Label.
-"""
-scalar LabelID
-
-"""
-Identifier of List.
-"""
-scalar ListID
-
-"""
-List limit metric setting
-"""
-enum ListLimitMetric {
- all_metrics
- issue_count
- issue_weights
-}
-
-"""
-Autogenerated input type of MarkAsSpamSnippet
-"""
-input MarkAsSpamSnippetInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the snippet to update.
- """
- id: SnippetID!
-}
-
-"""
-Autogenerated return type of MarkAsSpamSnippet
-"""
-type MarkAsSpamSnippetPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The snippet after mutation.
- """
- snippet: Snippet
-}
-
-"""
-Possible identifier types for a measurement
-"""
-enum MeasurementIdentifier {
- """
- Group count
- """
- GROUPS
-
- """
- Issue count
- """
- ISSUES
-
- """
- Merge request count
- """
- MERGE_REQUESTS
-
- """
- Pipeline count
- """
- PIPELINES
-
- """
- Pipeline count with canceled status
- """
- PIPELINES_CANCELED
-
- """
- Pipeline count with failed status
- """
- PIPELINES_FAILED
-
- """
- Pipeline count with skipped status
- """
- PIPELINES_SKIPPED
-
- """
- Pipeline count with success status
- """
- PIPELINES_SUCCEEDED
-
- """
- Project count
- """
- PROJECTS
-
- """
- User count
- """
- USERS
-}
-
-interface MemberInterface {
- """
- GitLab::Access level.
- """
- accessLevel: AccessLevel
-
- """
- Date and time the membership was created.
- """
- createdAt: Time
-
- """
- User that authorized membership.
- """
- createdBy: User
-
- """
- Date and time the membership expires.
- """
- expiresAt: Time
-
- """
- ID of the member.
- """
- id: ID!
-
- """
- Date and time the membership was last updated.
- """
- updatedAt: Time
-
- """
- User that is associated with the member object.
- """
- user: User!
-}
-
-"""
-The connection type for MemberInterface.
-"""
-type MemberInterfaceConnection {
- """
- A list of edges.
- """
- edges: [MemberInterfaceEdge]
-
- """
- A list of nodes.
- """
- nodes: [MemberInterface]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type MemberInterfaceEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: MemberInterface
-}
-
-type MergeRequest implements CurrentUserTodos & Noteable {
- """
- Indicates if members of the target project can push to the fork.
- """
- allowCollaboration: Boolean
-
- """
- Number of approvals left.
- """
- approvalsLeft: Int
-
- """
- Number of approvals required.
- """
- approvalsRequired: Int
-
- """
- Indicates if the merge request has all the required approvals. Returns true if no required approvals are configured.
- """
- approved: Boolean!
-
- """
- Users who approved the merge request.
- """
- approvedBy(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): UserConnection
-
- """
- Assignees of the merge request.
- """
- assignees(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): UserConnection
-
- """
- User who created this merge request.
- """
- author: User
-
- """
- Indicates if auto merge is enabled for the merge request.
- """
- autoMergeEnabled: Boolean!
-
- """
- Selected auto merge strategy.
- """
- autoMergeStrategy: String
-
- """
- Array of available auto merge strategies.
- """
- availableAutoMergeStrategies: [String!]
-
- """
- Number of commits in the merge request.
- """
- commitCount: Int
-
- """
- Merge request commits excluding merge commits.
- """
- commitsWithoutMergeCommits(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): CommitConnection
-
- """
- Indicates if the merge request has conflicts.
- """
- conflicts: Boolean!
-
- """
- Timestamp of when the merge request was created.
- """
- createdAt: Time!
-
- """
- To-do items for the current user.
- """
- currentUserTodos(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- State of the to-do items.
- """
- state: TodoStateEnum
- ): TodoConnection!
-
- """
- Default merge commit message of the merge request.
- """
- defaultMergeCommitMessage: String
-
- """
- Default merge commit message of the merge request with description.
- """
- defaultMergeCommitMessageWithDescription: String
-
- """
- Default squash commit message of the merge request.
- """
- defaultSquashCommitMessage: String
-
- """
- Description of the merge request (Markdown rendered as HTML for caching).
- """
- description: String
-
- """
- The GitLab Flavored Markdown rendering of `description`
- """
- descriptionHtml: String
-
- """
- Diff head SHA of the merge request.
- """
- diffHeadSha: String
-
- """
- References of the base SHA, the head SHA, and the start SHA for this merge request.
- """
- diffRefs: DiffRefs
-
- """
- Details about which files were changed in this merge request.
- """
- diffStats(
- """
- A specific file-path.
- """
- path: String
- ): [DiffStats!]
-
- """
- Summary of which files were changed in this merge request.
- """
- diffStatsSummary: DiffStatsSummary
-
- """
- Indicates if comments on the merge request are locked to members only.
- """
- discussionLocked: Boolean!
-
- """
- All discussions on this noteable.
- """
- discussions(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DiscussionConnection!
-
- """
- Number of downvotes for the merge request.
- """
- downvotes: Int!
-
- """
- Indicates if the project settings will lead to source branch deletion after merge.
- """
- forceRemoveSourceBranch: Boolean
-
- """
- Indicates if the merge request has CI.
- """
- hasCi: Boolean!
-
- """
- Indicates if the source branch has any security reports.
- """
- hasSecurityReports: Boolean!
-
- """
- The pipeline running on the branch HEAD of the merge request.
- """
- headPipeline: Pipeline
-
- """
- ID of the merge request.
- """
- id: ID!
-
- """
- Internal ID of the merge request.
- """
- iid: String!
-
- """
- Commit SHA of the merge request if merge is in progress.
- """
- inProgressMergeCommitSha: String
-
- """
- Labels of the merge request.
- """
- labels(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): LabelConnection
-
- """
- SHA of the merge request commit (set once merged).
- """
- mergeCommitSha: String
-
- """
- Error message due to a merge error.
- """
- mergeError: String
-
- """
- Indicates if a merge is currently occurring.
- """
- mergeOngoing: Boolean!
-
- """
- Status of the merge request.
- """
- mergeStatus: String
-
- """
- Number of merge requests in the merge train.
- """
- mergeTrainsCount: Int
-
- """
- User who merged this merge request.
- """
- mergeUser: User
-
- """
- Indicates if the merge has been set to be merged when its pipeline succeeds (MWPS).
- """
- mergeWhenPipelineSucceeds: Boolean
-
- """
- Indicates if the merge request is mergeable.
- """
- mergeable: Boolean!
-
- """
- Indicates if all discussions in the merge request have been resolved, allowing the merge request to be merged.
- """
- mergeableDiscussionsState: Boolean
-
- """
- Timestamp of when the merge request was merged, null if not merged.
- """
- mergedAt: Time
-
- """
- The milestone of the merge request.
- """
- milestone: Milestone
-
- """
- All notes on this noteable.
- """
- notes(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): NoteConnection!
-
- """
- Participants in the merge request. This includes the author, assignees, reviewers, and users mentioned in notes.
- """
- participants(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): UserConnection
-
- """
- Pipelines for the merge request. Note: for performance reasons, no more than
- the most recent 500 pipelines will be returned.
- """
- pipelines(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter pipelines by the ref they are run for.
- """
- ref: String
-
- """
- Filter pipelines by the sha of the commit they are run for.
- """
- sha: String
-
- """
- Filter pipelines by their status.
- """
- status: PipelineStatusEnum
- ): PipelineConnection
-
- """
- Alias for target_project.
- """
- project: Project!
-
- """
- ID of the merge request project.
- """
- projectId: Int!
-
- """
- Rebase commit SHA of the merge request.
- """
- rebaseCommitSha: String
-
- """
- Indicates if there is a rebase currently in progress for the merge request.
- """
- rebaseInProgress: Boolean!
-
- """
- Internal reference of the merge request. Returned in shortened format by default.
- """
- reference(
- """
- Boolean option specifying whether the reference should be returned in full.
- """
- full: Boolean = false
- ): String!
-
- """
- Users from whom a review has been requested.
- """
- reviewers(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): UserConnection
-
- """
- Indicates if the merge request is created by @GitLab-Security-Bot.
- """
- securityAutoFix: Boolean
-
- """
- Indicates if the merge request will be rebased.
- """
- shouldBeRebased: Boolean!
-
- """
- Indicates if the source branch of the merge request will be deleted after merge.
- """
- shouldRemoveSourceBranch: Boolean
-
- """
- Source branch of the merge request.
- """
- sourceBranch: String!
-
- """
- Indicates if the source branch of the merge request exists.
- """
- sourceBranchExists: Boolean!
-
- """
- Indicates if the source branch is protected.
- """
- sourceBranchProtected: Boolean!
-
- """
- Source project of the merge request.
- """
- sourceProject: Project
-
- """
- ID of the merge request source project.
- """
- sourceProjectId: Int
-
- """
- Indicates if squash on merge is enabled.
- """
- squash: Boolean!
-
- """
- Indicates if squash on merge is enabled.
- """
- squashOnMerge: Boolean!
-
- """
- State of the merge request.
- """
- state: MergeRequestState!
-
- """
- Indicates if the currently logged in user is subscribed to this merge request.
- """
- subscribed: Boolean!
-
- """
- Target branch of the merge request.
- """
- targetBranch: String!
-
- """
- Indicates if the target branch of the merge request exists.
- """
- targetBranchExists: Boolean!
-
- """
- Target project of the merge request.
- """
- targetProject: Project!
-
- """
- ID of the merge request target project.
- """
- targetProjectId: Int!
-
- """
- Completion status of tasks
- """
- taskCompletionStatus: TaskCompletionStatus!
-
- """
- Time estimate of the merge request.
- """
- timeEstimate: Int!
-
- """
- Title of the merge request.
- """
- title: String!
-
- """
- The GitLab Flavored Markdown rendering of `title`
- """
- titleHtml: String
-
- """
- Total time reported as spent on the merge request.
- """
- totalTimeSpent: Int!
-
- """
- Timestamp of when the merge request was last updated.
- """
- updatedAt: Time!
-
- """
- Number of upvotes for the merge request.
- """
- upvotes: Int!
-
- """
- Number of user discussions in the merge request.
- """
- userDiscussionsCount: Int
-
- """
- User notes count of the merge request.
- """
- userNotesCount: Int
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: MergeRequestPermissions!
-
- """
- Web URL of the merge request.
- """
- webUrl: String
-
- """
- Indicates if the merge request is a work in progress (WIP).
- """
- workInProgress: Boolean!
-}
-
-"""
-The connection type for MergeRequest.
-"""
-type MergeRequestConnection {
- """
- Total count of collection.
- """
- count: Int!
-
- """
- A list of edges.
- """
- edges: [MergeRequestEdge]
-
- """
- A list of nodes.
- """
- nodes: [MergeRequest]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-
- """
- Total sum of time to merge, in seconds, for the collection of merge requests.
- """
- totalTimeToMerge: Float
-}
-
-"""
-Autogenerated input type of MergeRequestCreate
-"""
-input MergeRequestCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Description of the merge request (Markdown rendered as HTML for caching).
- """
- description: String
-
- """
- Labels of the merge request.
- """
- labels: [String!]
-
- """
- Project full path the merge request is associated with.
- """
- projectPath: ID!
-
- """
- Source branch of the merge request.
- """
- sourceBranch: String!
-
- """
- Target branch of the merge request.
- """
- targetBranch: String!
-
- """
- Title of the merge request.
- """
- title: String!
-}
-
-"""
-Autogenerated return type of MergeRequestCreate
-"""
-type MergeRequestCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The merge request after mutation.
- """
- mergeRequest: MergeRequest
-}
-
-"""
-Represents the Geo sync and verification state of a Merge Request diff
-"""
-type MergeRequestDiffRegistry {
- """
- Timestamp when the MergeRequestDiffRegistry was created
- """
- createdAt: Time
-
- """
- ID of the MergeRequestDiffRegistry
- """
- id: ID!
-
- """
- Error message during sync of the MergeRequestDiffRegistry
- """
- lastSyncFailure: String
-
- """
- Timestamp of the most recent successful sync of the MergeRequestDiffRegistry
- """
- lastSyncedAt: Time
-
- """
- ID of the Merge Request diff.
- """
- mergeRequestDiffId: ID!
-
- """
- Timestamp after which the MergeRequestDiffRegistry should be resynced
- """
- retryAt: Time
-
- """
- Number of consecutive failed sync attempts of the MergeRequestDiffRegistry
- """
- retryCount: Int
-
- """
- Sync state of the MergeRequestDiffRegistry
- """
- state: RegistryState
-}
-
-"""
-The connection type for MergeRequestDiffRegistry.
-"""
-type MergeRequestDiffRegistryConnection {
- """
- A list of edges.
- """
- edges: [MergeRequestDiffRegistryEdge]
-
- """
- A list of nodes.
- """
- nodes: [MergeRequestDiffRegistry]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type MergeRequestDiffRegistryEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: MergeRequestDiffRegistry
-}
-
-"""
-An edge in a connection.
-"""
-type MergeRequestEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: MergeRequest
-}
-
-"""
-Identifier of MergeRequest.
-"""
-scalar MergeRequestID
-
-"""
-New state to apply to a merge request.
-"""
-enum MergeRequestNewState {
- """
- Close the merge request if it is open.
- """
- CLOSED
-
- """
- Open the merge request if it is closed.
- """
- OPEN
-}
-
-"""
-Check permissions for the current user on a merge request
-"""
-type MergeRequestPermissions {
- """
- Indicates the user can perform `admin_merge_request` on this resource
- """
- adminMergeRequest: Boolean!
-
- """
- Indicates the user can perform `can_merge` on this resource
- """
- canMerge: Boolean!
-
- """
- Indicates the user can perform `cherry_pick_on_current_merge_request` on this resource
- """
- cherryPickOnCurrentMergeRequest: Boolean!
-
- """
- Indicates the user can perform `create_note` on this resource
- """
- createNote: Boolean!
-
- """
- Indicates the user can perform `push_to_source_branch` on this resource
- """
- pushToSourceBranch: Boolean!
-
- """
- Indicates the user can perform `read_merge_request` on this resource
- """
- readMergeRequest: Boolean!
-
- """
- Indicates the user can perform `remove_source_branch` on this resource
- """
- removeSourceBranch: Boolean!
-
- """
- Indicates the user can perform `revert_on_current_merge_request` on this resource
- """
- revertOnCurrentMergeRequest: Boolean!
-
- """
- Indicates the user can perform `update_merge_request` on this resource
- """
- updateMergeRequest: Boolean!
-}
-
-"""
-Autogenerated input type of MergeRequestReviewerRereview
-"""
-input MergeRequestReviewerRereviewInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the merge request to mutate.
- """
- iid: String!
-
- """
- The project the merge request to mutate is in.
- """
- projectPath: ID!
-
- """
- The user ID for the user that has been requested for a new review.
- """
- userId: UserID!
-}
-
-"""
-Autogenerated return type of MergeRequestReviewerRereview
-"""
-type MergeRequestReviewerRereviewPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The merge request after mutation.
- """
- mergeRequest: MergeRequest
-}
-
-"""
-Autogenerated input type of MergeRequestSetAssignees
-"""
-input MergeRequestSetAssigneesInput {
- """
- The usernames to assign to the resource. Replaces existing assignees by default.
- """
- assigneeUsernames: [String!]!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the merge request to mutate.
- """
- iid: String!
-
- """
- The operation to perform. Defaults to REPLACE.
- """
- operationMode: MutationOperationMode
-
- """
- The project the merge request to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of MergeRequestSetAssignees
-"""
-type MergeRequestSetAssigneesPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The merge request after mutation.
- """
- mergeRequest: MergeRequest
-}
-
-"""
-Autogenerated input type of MergeRequestSetLabels
-"""
-input MergeRequestSetLabelsInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the merge request to mutate.
- """
- iid: String!
-
- """
- The Label IDs to set. Replaces existing labels by default.
- """
- labelIds: [LabelID!]!
-
- """
- Changes the operation mode. Defaults to REPLACE.
- """
- operationMode: MutationOperationMode
-
- """
- The project the merge request to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of MergeRequestSetLabels
-"""
-type MergeRequestSetLabelsPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The merge request after mutation.
- """
- mergeRequest: MergeRequest
-}
-
-"""
-Autogenerated input type of MergeRequestSetLocked
-"""
-input MergeRequestSetLockedInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the merge request to mutate.
- """
- iid: String!
-
- """
- Whether or not to lock the merge request.
- """
- locked: Boolean!
-
- """
- The project the merge request to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of MergeRequestSetLocked
-"""
-type MergeRequestSetLockedPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The merge request after mutation.
- """
- mergeRequest: MergeRequest
-}
-
-"""
-Autogenerated input type of MergeRequestSetMilestone
-"""
-input MergeRequestSetMilestoneInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the merge request to mutate.
- """
- iid: String!
-
- """
- The milestone to assign to the merge request.
- """
- milestoneId: MilestoneID
-
- """
- The project the merge request to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of MergeRequestSetMilestone
-"""
-type MergeRequestSetMilestonePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The merge request after mutation.
- """
- mergeRequest: MergeRequest
-}
-
-"""
-Autogenerated input type of MergeRequestSetSubscription
-"""
-input MergeRequestSetSubscriptionInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the merge request to mutate.
- """
- iid: String!
-
- """
- The project the merge request to mutate is in.
- """
- projectPath: ID!
-
- """
- The desired state of the subscription.
- """
- subscribedState: Boolean!
-}
-
-"""
-Autogenerated return type of MergeRequestSetSubscription
-"""
-type MergeRequestSetSubscriptionPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The merge request after mutation.
- """
- mergeRequest: MergeRequest
-}
-
-"""
-Autogenerated input type of MergeRequestSetWip
-"""
-input MergeRequestSetWipInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the merge request to mutate.
- """
- iid: String!
-
- """
- The project the merge request to mutate is in.
- """
- projectPath: ID!
-
- """
- Whether or not to set the merge request as a WIP.
- """
- wip: Boolean!
-}
-
-"""
-Autogenerated return type of MergeRequestSetWip
-"""
-type MergeRequestSetWipPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The merge request after mutation.
- """
- mergeRequest: MergeRequest
-}
-
-"""
-Values for sorting merge requests
-"""
-enum MergeRequestSort {
- """
- Created at ascending order
- """
- CREATED_ASC
-
- """
- Created at descending order
- """
- CREATED_DESC
-
- """
- Label priority by ascending order
- """
- LABEL_PRIORITY_ASC
-
- """
- Label priority by descending order
- """
- LABEL_PRIORITY_DESC
-
- """
- Merge time by ascending order
- """
- MERGED_AT_ASC
-
- """
- Merge time by descending order
- """
- MERGED_AT_DESC
-
- """
- Milestone due date by ascending order
- """
- MILESTONE_DUE_ASC
-
- """
- Milestone due date by descending order
- """
- MILESTONE_DUE_DESC
-
- """
- Priority by ascending order
- """
- PRIORITY_ASC
-
- """
- Priority by descending order
- """
- PRIORITY_DESC
-
- """
- Updated at ascending order
- """
- UPDATED_ASC
-
- """
- Updated at descending order
- """
- UPDATED_DESC
-
- """
- Created at ascending order
- """
- created_asc @deprecated(reason: "Use CREATED_ASC. Deprecated in 13.5.")
-
- """
- Created at descending order
- """
- created_desc @deprecated(reason: "Use CREATED_DESC. Deprecated in 13.5.")
-
- """
- Updated at ascending order
- """
- updated_asc @deprecated(reason: "Use UPDATED_ASC. Deprecated in 13.5.")
-
- """
- Updated at descending order
- """
- updated_desc @deprecated(reason: "Use UPDATED_DESC. Deprecated in 13.5.")
-}
-
-"""
-State of a GitLab merge request
-"""
-enum MergeRequestState {
- all
- closed
- locked
-
- """
- Merge Request has been merged
- """
- merged
- opened
-}
-
-"""
-Autogenerated input type of MergeRequestUpdate
-"""
-input MergeRequestUpdateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Description of the merge request (Markdown rendered as HTML for caching).
- """
- description: String
-
- """
- The IID of the merge request to mutate.
- """
- iid: String!
-
- """
- The project the merge request to mutate is in.
- """
- projectPath: ID!
-
- """
- The action to perform to change the state.
- """
- state: MergeRequestNewState
-
- """
- Target branch of the merge request.
- """
- targetBranch: String
-
- """
- Title of the merge request.
- """
- title: String
-}
-
-"""
-Autogenerated return type of MergeRequestUpdate
-"""
-type MergeRequestUpdatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The merge request after mutation.
- """
- mergeRequest: MergeRequest
-}
-
-type Metadata {
- """
- Revision.
- """
- revision: String!
-
- """
- Version.
- """
- version: String!
-}
-
-"""
-Represents a metric image upload
-"""
-type MetricImage {
- """
- File name of the metric image.
- """
- fileName: String
-
- """
- File path of the metric image.
- """
- filePath: String
-
- """
- ID of the metric upload.
- """
- id: ID!
-
- """
- Internal ID of the metric upload.
- """
- iid: ID!
-
- """
- URL of the metric source.
- """
- url: String!
-}
-
-type MetricsDashboard {
- """
- Annotations added to the dashboard.
- """
- annotations(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Timestamp marking date and time from which annotations need to be fetched.
- """
- from: Time!
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Timestamp marking date and time to which annotations need to be fetched.
- """
- to: Time
- ): MetricsDashboardAnnotationConnection
-
- """
- Path to a file with the dashboard definition.
- """
- path: String
-
- """
- Dashboard schema validation warnings.
- """
- schemaValidationWarnings: [String!]
-}
-
-type MetricsDashboardAnnotation {
- """
- Description of the annotation.
- """
- description: String
-
- """
- Timestamp marking end of annotated time span.
- """
- endingAt: Time
-
- """
- ID of the annotation.
- """
- id: ID!
-
- """
- ID of a dashboard panel to which the annotation should be scoped.
- """
- panelId: String
-
- """
- Timestamp marking start of annotated time span.
- """
- startingAt: Time
-}
-
-"""
-The connection type for MetricsDashboardAnnotation.
-"""
-type MetricsDashboardAnnotationConnection {
- """
- A list of edges.
- """
- edges: [MetricsDashboardAnnotationEdge]
-
- """
- A list of nodes.
- """
- nodes: [MetricsDashboardAnnotation]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type MetricsDashboardAnnotationEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: MetricsDashboardAnnotation
-}
-
-"""
-Identifier of Metrics::Dashboard::Annotation.
-"""
-scalar MetricsDashboardAnnotationID
-
-"""
-Represents a milestone
-"""
-type Milestone implements TimeboxReportInterface {
- """
- Timestamp of milestone creation.
- """
- createdAt: Time!
-
- """
- Description of the milestone.
- """
- description: String
-
- """
- Timestamp of the milestone due date.
- """
- dueDate: Time
-
- """
- Indicates if milestone is at group level.
- """
- groupMilestone: Boolean!
-
- """
- ID of the milestone.
- """
- id: ID!
-
- """
- Indicates if milestone is at project level.
- """
- projectMilestone: Boolean!
-
- """
- Historically accurate report about the timebox.
- """
- report: TimeboxReport
-
- """
- Timestamp of the milestone start date.
- """
- startDate: Time
-
- """
- State of the milestone.
- """
- state: MilestoneStateEnum!
-
- """
- Milestone statistics.
- """
- stats: MilestoneStats
-
- """
- Indicates if milestone is at subgroup level.
- """
- subgroupMilestone: Boolean!
-
- """
- Title of the milestone.
- """
- title: String!
-
- """
- Timestamp of last milestone update.
- """
- updatedAt: Time!
-
- """
- Web path of the milestone.
- """
- webPath: String!
-}
-
-"""
-The connection type for Milestone.
-"""
-type MilestoneConnection {
- """
- A list of edges.
- """
- edges: [MilestoneEdge]
-
- """
- A list of nodes.
- """
- nodes: [Milestone]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type MilestoneEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Milestone
-}
-
-"""
-Identifier of Milestone.
-"""
-scalar MilestoneID
-
-"""
-Current state of milestone
-"""
-enum MilestoneStateEnum {
- """
- Milestone is currently active
- """
- active
-
- """
- Milestone is closed
- """
- closed
-}
-
-"""
-Contains statistics about a milestone
-"""
-type MilestoneStats {
- """
- Number of closed issues associated with the milestone.
- """
- closedIssuesCount: Int
-
- """
- Total number of issues associated with the milestone.
- """
- totalIssuesCount: Int
-}
-
-"""
-The position to which the adjacent object should be moved
-"""
-enum MoveType {
- """
- The adjacent object will be moved after the object that is being moved
- """
- after
-
- """
- The adjacent object will be moved before the object that is being moved
- """
- before
-}
-
-type Mutation {
- addAwardEmoji(input: AddAwardEmojiInput!): AddAwardEmojiPayload @deprecated(reason: "Use awardEmojiAdd. Deprecated in 13.2.")
- addProjectToSecurityDashboard(input: AddProjectToSecurityDashboardInput!): AddProjectToSecurityDashboardPayload
- adminSidekiqQueuesDeleteJobs(input: AdminSidekiqQueuesDeleteJobsInput!): AdminSidekiqQueuesDeleteJobsPayload
- alertSetAssignees(input: AlertSetAssigneesInput!): AlertSetAssigneesPayload
- alertTodoCreate(input: AlertTodoCreateInput!): AlertTodoCreatePayload
- apiFuzzingCiConfigurationCreate(input: ApiFuzzingCiConfigurationCreateInput!): ApiFuzzingCiConfigurationCreatePayload
- awardEmojiAdd(input: AwardEmojiAddInput!): AwardEmojiAddPayload
- awardEmojiRemove(input: AwardEmojiRemoveInput!): AwardEmojiRemovePayload
- awardEmojiToggle(input: AwardEmojiToggleInput!): AwardEmojiTogglePayload
- boardListCreate(input: BoardListCreateInput!): BoardListCreatePayload
- boardListUpdateLimitMetrics(input: BoardListUpdateLimitMetricsInput!): BoardListUpdateLimitMetricsPayload
- ciCdSettingsUpdate(input: CiCdSettingsUpdateInput!): CiCdSettingsUpdatePayload
- clusterAgentDelete(input: ClusterAgentDeleteInput!): ClusterAgentDeletePayload
- clusterAgentTokenCreate(input: ClusterAgentTokenCreateInput!): ClusterAgentTokenCreatePayload
- clusterAgentTokenDelete(input: ClusterAgentTokenDeleteInput!): ClusterAgentTokenDeletePayload
- commitCreate(input: CommitCreateInput!): CommitCreatePayload
- configureSast(input: ConfigureSastInput!): ConfigureSastPayload
- createAlertIssue(input: CreateAlertIssueInput!): CreateAlertIssuePayload
- createAnnotation(input: CreateAnnotationInput!): CreateAnnotationPayload
- createBoard(input: CreateBoardInput!): CreateBoardPayload
- createBranch(input: CreateBranchInput!): CreateBranchPayload
- createClusterAgent(input: CreateClusterAgentInput!): CreateClusterAgentPayload
- createComplianceFramework(input: CreateComplianceFrameworkInput!): CreateComplianceFrameworkPayload
-
- """
- Available only when feature flag `custom_emoji` is enabled.
- """
- createCustomEmoji(input: CreateCustomEmojiInput!): CreateCustomEmojiPayload
- createDevopsAdoptionSegment(input: CreateDevopsAdoptionSegmentInput!): CreateDevopsAdoptionSegmentPayload
- createDiffNote(input: CreateDiffNoteInput!): CreateDiffNotePayload
- createEpic(input: CreateEpicInput!): CreateEpicPayload
- createImageDiffNote(input: CreateImageDiffNoteInput!): CreateImageDiffNotePayload
- createIssue(input: CreateIssueInput!): CreateIssuePayload
- createIteration(input: CreateIterationInput!): CreateIterationPayload
- createNote(input: CreateNoteInput!): CreateNotePayload
- createRequirement(input: CreateRequirementInput!): CreateRequirementPayload
- createSnippet(input: CreateSnippetInput!): CreateSnippetPayload
- createTestCase(input: CreateTestCaseInput!): CreateTestCasePayload
- dastOnDemandScanCreate(input: DastOnDemandScanCreateInput!): DastOnDemandScanCreatePayload
- dastProfileCreate(input: DastProfileCreateInput!): DastProfileCreatePayload
- dastProfileDelete(input: DastProfileDeleteInput!): DastProfileDeletePayload
- dastProfileRun(input: DastProfileRunInput!): DastProfileRunPayload
- dastProfileUpdate(input: DastProfileUpdateInput!): DastProfileUpdatePayload
- dastScannerProfileCreate(input: DastScannerProfileCreateInput!): DastScannerProfileCreatePayload
- dastScannerProfileDelete(input: DastScannerProfileDeleteInput!): DastScannerProfileDeletePayload
- dastScannerProfileUpdate(input: DastScannerProfileUpdateInput!): DastScannerProfileUpdatePayload
- dastSiteProfileCreate(input: DastSiteProfileCreateInput!): DastSiteProfileCreatePayload
- dastSiteProfileDelete(input: DastSiteProfileDeleteInput!): DastSiteProfileDeletePayload
- dastSiteProfileUpdate(input: DastSiteProfileUpdateInput!): DastSiteProfileUpdatePayload
- dastSiteTokenCreate(input: DastSiteTokenCreateInput!): DastSiteTokenCreatePayload
- dastSiteValidationCreate(input: DastSiteValidationCreateInput!): DastSiteValidationCreatePayload
- dastSiteValidationRevoke(input: DastSiteValidationRevokeInput!): DastSiteValidationRevokePayload
- deleteAnnotation(input: DeleteAnnotationInput!): DeleteAnnotationPayload
- deleteDevopsAdoptionSegment(input: DeleteDevopsAdoptionSegmentInput!): DeleteDevopsAdoptionSegmentPayload
- designManagementDelete(input: DesignManagementDeleteInput!): DesignManagementDeletePayload
- designManagementMove(input: DesignManagementMoveInput!): DesignManagementMovePayload
- designManagementUpload(input: DesignManagementUploadInput!): DesignManagementUploadPayload
- destroyBoard(input: DestroyBoardInput!): DestroyBoardPayload
- destroyBoardList(input: DestroyBoardListInput!): DestroyBoardListPayload
- destroyComplianceFramework(input: DestroyComplianceFrameworkInput!): DestroyComplianceFrameworkPayload
- destroyContainerRepository(input: DestroyContainerRepositoryInput!): DestroyContainerRepositoryPayload
- destroyContainerRepositoryTags(input: DestroyContainerRepositoryTagsInput!): DestroyContainerRepositoryTagsPayload
- destroyNote(input: DestroyNoteInput!): DestroyNotePayload
- destroySnippet(input: DestroySnippetInput!): DestroySnippetPayload
-
- """
- Toggles the resolved state of a discussion
- """
- discussionToggleResolve(input: DiscussionToggleResolveInput!): DiscussionToggleResolvePayload
- dismissVulnerability(input: DismissVulnerabilityInput!): DismissVulnerabilityPayload @deprecated(reason: "Use vulnerabilityDismiss. Deprecated in 13.5.")
- environmentsCanaryIngressUpdate(input: EnvironmentsCanaryIngressUpdateInput!): EnvironmentsCanaryIngressUpdatePayload
- epicAddIssue(input: EpicAddIssueInput!): EpicAddIssuePayload
- epicBoardCreate(input: EpicBoardCreateInput!): EpicBoardCreatePayload
- epicBoardListCreate(input: EpicBoardListCreateInput!): EpicBoardListCreatePayload
- epicSetSubscription(input: EpicSetSubscriptionInput!): EpicSetSubscriptionPayload
- epicTreeReorder(input: EpicTreeReorderInput!): EpicTreeReorderPayload
- exportRequirements(input: ExportRequirementsInput!): ExportRequirementsPayload
- gitlabSubscriptionActivate(input: GitlabSubscriptionActivateInput!): GitlabSubscriptionActivatePayload
- httpIntegrationCreate(input: HttpIntegrationCreateInput!): HttpIntegrationCreatePayload
- httpIntegrationDestroy(input: HttpIntegrationDestroyInput!): HttpIntegrationDestroyPayload
- httpIntegrationResetToken(input: HttpIntegrationResetTokenInput!): HttpIntegrationResetTokenPayload
- httpIntegrationUpdate(input: HttpIntegrationUpdateInput!): HttpIntegrationUpdatePayload
- issueMove(input: IssueMoveInput!): IssueMovePayload
- issueMoveList(input: IssueMoveListInput!): IssueMoveListPayload
- issueSetAssignees(input: IssueSetAssigneesInput!): IssueSetAssigneesPayload
- issueSetConfidential(input: IssueSetConfidentialInput!): IssueSetConfidentialPayload
- issueSetDueDate(input: IssueSetDueDateInput!): IssueSetDueDatePayload
- issueSetEpic(input: IssueSetEpicInput!): IssueSetEpicPayload
- issueSetIteration(input: IssueSetIterationInput!): IssueSetIterationPayload
- issueSetLocked(input: IssueSetLockedInput!): IssueSetLockedPayload
- issueSetSeverity(input: IssueSetSeverityInput!): IssueSetSeverityPayload
- issueSetSubscription(input: IssueSetSubscriptionInput!): IssueSetSubscriptionPayload
- issueSetWeight(input: IssueSetWeightInput!): IssueSetWeightPayload
- jiraImportStart(input: JiraImportStartInput!): JiraImportStartPayload
- jiraImportUsers(input: JiraImportUsersInput!): JiraImportUsersPayload
- labelCreate(input: LabelCreateInput!): LabelCreatePayload
- markAsSpamSnippet(input: MarkAsSpamSnippetInput!): MarkAsSpamSnippetPayload
- mergeRequestCreate(input: MergeRequestCreateInput!): MergeRequestCreatePayload
- mergeRequestReviewerRereview(input: MergeRequestReviewerRereviewInput!): MergeRequestReviewerRereviewPayload
- mergeRequestSetAssignees(input: MergeRequestSetAssigneesInput!): MergeRequestSetAssigneesPayload
- mergeRequestSetLabels(input: MergeRequestSetLabelsInput!): MergeRequestSetLabelsPayload
- mergeRequestSetLocked(input: MergeRequestSetLockedInput!): MergeRequestSetLockedPayload
- mergeRequestSetMilestone(input: MergeRequestSetMilestoneInput!): MergeRequestSetMilestonePayload
- mergeRequestSetSubscription(input: MergeRequestSetSubscriptionInput!): MergeRequestSetSubscriptionPayload
- mergeRequestSetWip(input: MergeRequestSetWipInput!): MergeRequestSetWipPayload
-
- """
- Update attributes of a merge request
- """
- mergeRequestUpdate(input: MergeRequestUpdateInput!): MergeRequestUpdatePayload
- namespaceIncreaseStorageTemporarily(input: NamespaceIncreaseStorageTemporarilyInput!): NamespaceIncreaseStorageTemporarilyPayload
- oncallRotationCreate(input: OncallRotationCreateInput!): OncallRotationCreatePayload
- oncallRotationDestroy(input: OncallRotationDestroyInput!): OncallRotationDestroyPayload
- oncallScheduleCreate(input: OncallScheduleCreateInput!): OncallScheduleCreatePayload
- oncallScheduleDestroy(input: OncallScheduleDestroyInput!): OncallScheduleDestroyPayload
- oncallScheduleUpdate(input: OncallScheduleUpdateInput!): OncallScheduleUpdatePayload
- pipelineCancel(input: PipelineCancelInput!): PipelineCancelPayload
- pipelineDestroy(input: PipelineDestroyInput!): PipelineDestroyPayload
- pipelineRetry(input: PipelineRetryInput!): PipelineRetryPayload
- prometheusIntegrationCreate(input: PrometheusIntegrationCreateInput!): PrometheusIntegrationCreatePayload
- prometheusIntegrationResetToken(input: PrometheusIntegrationResetTokenInput!): PrometheusIntegrationResetTokenPayload
- prometheusIntegrationUpdate(input: PrometheusIntegrationUpdateInput!): PrometheusIntegrationUpdatePayload
- promoteToEpic(input: PromoteToEpicInput!): PromoteToEpicPayload
- releaseCreate(input: ReleaseCreateInput!): ReleaseCreatePayload
- releaseDelete(input: ReleaseDeleteInput!): ReleaseDeletePayload
- releaseUpdate(input: ReleaseUpdateInput!): ReleaseUpdatePayload
- removeAwardEmoji(input: RemoveAwardEmojiInput!): RemoveAwardEmojiPayload @deprecated(reason: "Use awardEmojiRemove. Deprecated in 13.2.")
- removeProjectFromSecurityDashboard(input: RemoveProjectFromSecurityDashboardInput!): RemoveProjectFromSecurityDashboardPayload
-
- """
- Repositions a DiffNote on an image (a `Note` where the `position.positionType` is `"image"`)
- """
- repositionImageDiffNote(input: RepositionImageDiffNoteInput!): RepositionImageDiffNotePayload
- revertVulnerabilityToDetected(input: RevertVulnerabilityToDetectedInput!): RevertVulnerabilityToDetectedPayload @deprecated(reason: "Use vulnerabilityRevertToDetected. Deprecated in 13.5.")
- runDastScan(input: RunDASTScanInput!): RunDASTScanPayload @deprecated(reason: "Use DastOnDemandScanCreate. Deprecated in 13.4.")
- terraformStateDelete(input: TerraformStateDeleteInput!): TerraformStateDeletePayload
- terraformStateLock(input: TerraformStateLockInput!): TerraformStateLockPayload
- terraformStateUnlock(input: TerraformStateUnlockInput!): TerraformStateUnlockPayload
- todoCreate(input: TodoCreateInput!): TodoCreatePayload
- todoMarkDone(input: TodoMarkDoneInput!): TodoMarkDonePayload
- todoRestore(input: TodoRestoreInput!): TodoRestorePayload
- todoRestoreMany(input: TodoRestoreManyInput!): TodoRestoreManyPayload
- todosMarkAllDone(input: TodosMarkAllDoneInput!): TodosMarkAllDonePayload
- toggleAwardEmoji(input: ToggleAwardEmojiInput!): ToggleAwardEmojiPayload @deprecated(reason: "Use awardEmojiToggle. Deprecated in 13.2.")
- updateAlertStatus(input: UpdateAlertStatusInput!): UpdateAlertStatusPayload
- updateBoard(input: UpdateBoardInput!): UpdateBoardPayload
- updateBoardEpicUserPreferences(input: UpdateBoardEpicUserPreferencesInput!): UpdateBoardEpicUserPreferencesPayload
- updateBoardList(input: UpdateBoardListInput!): UpdateBoardListPayload
- updateComplianceFramework(input: UpdateComplianceFrameworkInput!): UpdateComplianceFrameworkPayload
- updateContainerExpirationPolicy(input: UpdateContainerExpirationPolicyInput!): UpdateContainerExpirationPolicyPayload
- updateEpic(input: UpdateEpicInput!): UpdateEpicPayload
-
- """
- Updates a DiffNote on an image (a `Note` where the `position.positionType` is
- `"image"`). If the body of the Note contains only quick actions, the Note will
- be destroyed during the update, and no Note will be returned
- """
- updateImageDiffNote(input: UpdateImageDiffNoteInput!): UpdateImageDiffNotePayload
- updateIssue(input: UpdateIssueInput!): UpdateIssuePayload
- updateIteration(input: UpdateIterationInput!): UpdateIterationPayload
- updateNamespacePackageSettings(input: UpdateNamespacePackageSettingsInput!): UpdateNamespacePackageSettingsPayload
-
- """
- Updates a Note. If the body of the Note contains only quick actions, the Note
- will be destroyed during the update, and no Note will be returned
- """
- updateNote(input: UpdateNoteInput!): UpdateNotePayload
- updateRequirement(input: UpdateRequirementInput!): UpdateRequirementPayload
- updateSnippet(input: UpdateSnippetInput!): UpdateSnippetPayload
- vulnerabilityConfirm(input: VulnerabilityConfirmInput!): VulnerabilityConfirmPayload
- vulnerabilityDismiss(input: VulnerabilityDismissInput!): VulnerabilityDismissPayload
- vulnerabilityExternalIssueLinkCreate(input: VulnerabilityExternalIssueLinkCreateInput!): VulnerabilityExternalIssueLinkCreatePayload
- vulnerabilityExternalIssueLinkDestroy(input: VulnerabilityExternalIssueLinkDestroyInput!): VulnerabilityExternalIssueLinkDestroyPayload
- vulnerabilityResolve(input: VulnerabilityResolveInput!): VulnerabilityResolvePayload
- vulnerabilityRevertToDetected(input: VulnerabilityRevertToDetectedInput!): VulnerabilityRevertToDetectedPayload
-}
-
-"""
-Different toggles for changing mutator behavior
-"""
-enum MutationOperationMode {
- """
- Performs an append operation
- """
- APPEND
-
- """
- Performs a removal operation
- """
- REMOVE
-
- """
- Performs a replace operation
- """
- REPLACE
-}
-
-type Namespace {
- """
- Size limit for repositories in the namespace in bytes.
- """
- actualRepositorySizeLimit: Float
-
- """
- Additional storage purchased for the root namespace in bytes.
- """
- additionalPurchasedStorageSize: Float
-
- """
- Compliance frameworks available to projects in this namespace. Available only
- when feature flag `ff_custom_compliance_frameworks` is enabled.
- """
- complianceFrameworks(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Global ID of a specific compliance framework to return.
- """
- id: ComplianceManagementFrameworkID
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): ComplianceFrameworkConnection
-
- """
- Includes at least one project where the repository size exceeds the limit.
- """
- containsLockedProjects: Boolean!
-
- """
- Description of the namespace.
- """
- description: String
-
- """
- The GitLab Flavored Markdown rendering of `description`
- """
- descriptionHtml: String
-
- """
- Full name of the namespace.
- """
- fullName: String!
-
- """
- Full path of the namespace.
- """
- fullPath: ID!
-
- """
- ID of the namespace.
- """
- id: ID!
-
- """
- Status of the temporary storage increase.
- """
- isTemporaryStorageIncreaseEnabled: Boolean!
-
- """
- Indicates if Large File Storage (LFS) is enabled for namespace.
- """
- lfsEnabled: Boolean
-
- """
- Name of the namespace.
- """
- name: String!
-
- """
- The package settings for the namespace.
- """
- packageSettings: PackageSettings
-
- """
- Path of the namespace.
- """
- path: String!
-
- """
- Projects within this namespace.
- """
- projects(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns only the projects which have vulnerabilities.
- """
- hasVulnerabilities: Boolean = false
-
- """
- Include also subgroup projects.
- """
- includeSubgroups: Boolean = false
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Search project with most similar names or paths.
- """
- search: String = null
-
- """
- Sort projects by this criteria.
- """
- sort: NamespaceProjectSort = null
- ): ProjectConnection!
-
- """
- Number of projects in the root namespace where the repository size exceeds the limit.
- """
- repositorySizeExcessProjectCount: Int!
-
- """
- Indicates if users can request access to namespace.
- """
- requestAccessEnabled: Boolean
-
- """
- Aggregated storage statistics of the namespace. Only available for root namespaces.
- """
- rootStorageStatistics: RootStorageStatistics
-
- """
- Total storage limit of the root namespace in bytes.
- """
- storageSizeLimit: Float
-
- """
- Date until the temporary storage increase is active.
- """
- temporaryStorageIncreaseEndsOn: Time
-
- """
- Total repository size of all projects in the root namespace in bytes.
- """
- totalRepositorySize: Float
-
- """
- Total excess repository size of all projects in the root namespace in bytes.
- """
- totalRepositorySizeExcess: Float
-
- """
- Visibility of the namespace.
- """
- visibility: String
-}
-
-"""
-The connection type for Namespace.
-"""
-type NamespaceConnection {
- """
- A list of edges.
- """
- edges: [NamespaceEdge]
-
- """
- A list of nodes.
- """
- nodes: [Namespace]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type NamespaceEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Namespace
-}
-
-"""
-Identifier of Namespace.
-"""
-scalar NamespaceID
-
-"""
-Autogenerated input type of NamespaceIncreaseStorageTemporarily
-"""
-input NamespaceIncreaseStorageTemporarilyInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the namespace to mutate.
- """
- id: NamespaceID!
-}
-
-"""
-Autogenerated return type of NamespaceIncreaseStorageTemporarily
-"""
-type NamespaceIncreaseStorageTemporarilyPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The namespace after mutation.
- """
- namespace: Namespace
-}
-
-"""
-Values for sorting projects
-"""
-enum NamespaceProjectSort {
- """
- Most similar to the search query
- """
- SIMILARITY
-
- """
- Sort by storage size
- """
- STORAGE
-}
-
-input NegatedBoardIssueInput {
- """
- Filter by assignee username.
- """
- assigneeUsername: [String]
-
- """
- Filter by author username.
- """
- authorUsername: String
-
- """
- Filter by epic ID. Incompatible with epicWildcardId.
- """
- epicId: EpicID
-
- """
- Filter by iteration title.
- """
- iterationTitle: String
-
- """
- Filter by label name.
- """
- labelName: [String]
-
- """
- Filter by milestone title.
- """
- milestoneTitle: String
-
- """
- Filter by reaction emoji.
- """
- myReactionEmoji: String
-
- """
- Filter by release tag.
- """
- releaseTag: String
-
- """
- Filter by weight.
- """
- weight: String
-}
-
-type Note implements ResolvableInterface {
- """
- User who wrote this note.
- """
- author: User!
-
- """
- Content of the note.
- """
- body: String!
-
- """
- The GitLab Flavored Markdown rendering of `note`
- """
- bodyHtml: String
-
- """
- Indicates if this note is confidential.
- """
- confidential: Boolean
-
- """
- Timestamp of the note creation.
- """
- createdAt: Time!
-
- """
- The discussion this note is a part of.
- """
- discussion: Discussion
-
- """
- ID of the note.
- """
- id: NoteID!
-
- """
- The position of this note on a diff.
- """
- position: DiffPosition
-
- """
- Project associated with the note.
- """
- project: Project
-
- """
- Indicates if the object can be resolved.
- """
- resolvable: Boolean!
-
- """
- Indicates if the object is resolved.
- """
- resolved: Boolean!
-
- """
- Timestamp of when the object was resolved.
- """
- resolvedAt: Time
-
- """
- User who resolved the object.
- """
- resolvedBy: User
-
- """
- Indicates whether this note was created by the system or by a user.
- """
- system: Boolean!
-
- """
- Name of the icon corresponding to a system note.
- """
- systemNoteIconName: String
-
- """
- Timestamp of the note's last activity.
- """
- updatedAt: Time!
-
- """
- URL to view this Note in the Web UI.
- """
- url: String
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: NotePermissions!
-}
-
-"""
-The connection type for Note.
-"""
-type NoteConnection {
- """
- A list of edges.
- """
- edges: [NoteEdge]
-
- """
- A list of nodes.
- """
- nodes: [Note]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type NoteEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Note
-}
-
-"""
-Identifier of Note.
-"""
-scalar NoteID
-
-type NotePermissions {
- """
- Indicates the user can perform `admin_note` on this resource
- """
- adminNote: Boolean!
-
- """
- Indicates the user can perform `award_emoji` on this resource
- """
- awardEmoji: Boolean!
-
- """
- Indicates the user can perform `create_note` on this resource
- """
- createNote: Boolean!
-
- """
- Indicates the user can perform `read_note` on this resource
- """
- readNote: Boolean!
-
- """
- Indicates the user can perform `reposition_note` on this resource
- """
- repositionNote: Boolean!
-
- """
- Indicates the user can perform `resolve_note` on this resource
- """
- resolveNote: Boolean!
-}
-
-interface Noteable {
- """
- All discussions on this noteable.
- """
- discussions(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DiscussionConnection!
-
- """
- All notes on this noteable.
- """
- notes(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): NoteConnection!
-}
-
-"""
-Identifier of Noteable.
-"""
-scalar NoteableID
-
-"""
-The rotation participant and color palette
-"""
-type OncallParticipantType {
- """
- The color palette to assign to the on-call user. For example "blue".
- """
- colorPalette: String
-
- """
- The color weight to assign to for the on-call user, for example "500". Max 4 chars. For easy identification of the user.
- """
- colorWeight: String
-
- """
- ID of the on-call participant.
- """
- id: IncidentManagementOncallParticipantID!
-
- """
- The user who is participating.
- """
- user: User!
-}
-
-"""
-The connection type for OncallParticipantType.
-"""
-type OncallParticipantTypeConnection {
- """
- A list of edges.
- """
- edges: [OncallParticipantTypeEdge]
-
- """
- A list of nodes.
- """
- nodes: [OncallParticipantType]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type OncallParticipantTypeEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: OncallParticipantType
-}
-
-"""
-Autogenerated input type of OncallRotationCreate
-"""
-input OncallRotationCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The name of the on-call rotation.
- """
- name: String!
-
- """
- The usernames of users participating in the on-call rotation.
- """
- participants: [OncallUserInputType!]!
-
- """
- The project to create the on-call schedule in.
- """
- projectPath: ID!
-
- """
- The rotation length of the on-call rotation.
- """
- rotationLength: OncallRotationLengthInputType!
-
- """
- The IID of the on-call schedule to create the on-call rotation in.
- """
- scheduleIid: String!
-
- """
- The start date and time of the on-call rotation, in the timezone of the on-call schedule.
- """
- startsAt: OncallRotationDateInputType!
-}
-
-"""
-Autogenerated return type of OncallRotationCreate
-"""
-type OncallRotationCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The on-call rotation.
- """
- oncallRotation: IncidentManagementOncallRotation
-}
-
-"""
-Date input type for on-call rotation
-"""
-input OncallRotationDateInputType {
- """
- The date component of the date in YYYY-MM-DD format.
- """
- date: String!
-
- """
- The time component of the date in 24hr HH:MM format.
- """
- time: String!
-}
-
-"""
-Autogenerated input type of OncallRotationDestroy
-"""
-input OncallRotationDestroyInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The ID of the on-call rotation to remove.
- """
- id: IncidentManagementOncallRotationID!
-
- """
- The project to remove the on-call schedule from.
- """
- projectPath: ID!
-
- """
- The IID of the on-call schedule to the on-call rotation belongs to.
- """
- scheduleIid: String!
-}
-
-"""
-Autogenerated return type of OncallRotationDestroy
-"""
-type OncallRotationDestroyPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The on-call rotation.
- """
- oncallRotation: IncidentManagementOncallRotation
-}
-
-"""
-The rotation length of the on-call rotation
-"""
-input OncallRotationLengthInputType {
- """
- The rotation length of the on-call rotation.
- """
- length: Int!
-
- """
- The unit of the rotation length of the on-call rotation.
- """
- unit: OncallRotationUnitEnum!
-}
-
-"""
-Rotation length unit of an on-call rotation
-"""
-enum OncallRotationUnitEnum {
- """
- Days
- """
- DAYS
-
- """
- Hours
- """
- HOURS
-
- """
- Weeks
- """
- WEEKS
-}
-
-"""
-Autogenerated input type of OncallScheduleCreate
-"""
-input OncallScheduleCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The description of the on-call schedule.
- """
- description: String
-
- """
- The name of the on-call schedule.
- """
- name: String!
-
- """
- The project to create the on-call schedule in.
- """
- projectPath: ID!
-
- """
- The timezone of the on-call schedule.
- """
- timezone: String!
-}
-
-"""
-Autogenerated return type of OncallScheduleCreate
-"""
-type OncallScheduleCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The on-call schedule.
- """
- oncallSchedule: IncidentManagementOncallSchedule
-}
-
-"""
-Autogenerated input type of OncallScheduleDestroy
-"""
-input OncallScheduleDestroyInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The on-call schedule internal ID to remove.
- """
- iid: String!
-
- """
- The project to remove the on-call schedule from.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of OncallScheduleDestroy
-"""
-type OncallScheduleDestroyPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The on-call schedule.
- """
- oncallSchedule: IncidentManagementOncallSchedule
-}
-
-"""
-Autogenerated input type of OncallScheduleUpdate
-"""
-input OncallScheduleUpdateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The description of the on-call schedule.
- """
- description: String
-
- """
- The on-call schedule internal ID to update.
- """
- iid: String!
-
- """
- The name of the on-call schedule.
- """
- name: String
-
- """
- The project to update the on-call schedule in.
- """
- projectPath: ID!
-
- """
- The timezone of the on-call schedule.
- """
- timezone: String
-}
-
-"""
-Autogenerated return type of OncallScheduleUpdate
-"""
-type OncallScheduleUpdatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The on-call schedule.
- """
- oncallSchedule: IncidentManagementOncallSchedule
-}
-
-"""
-The rotation user and color palette
-"""
-input OncallUserInputType {
- """
- A value of DataVisualizationColorEnum. The color from the palette to assign to the on-call user.
- """
- colorPalette: DataVisualizationColorEnum
-
- """
- A value of DataVisualizationWeightEnum. The color weight to assign to for the on-call user.
- """
- colorWeight: DataVisualizationWeightEnum
-
- """
- The username of the user to participate in the on-call rotation, such as `user_one`.
- """
- username: String!
-}
-
-"""
-Represents a package in the Package Registry
-"""
-type Package {
- """
- Date of creation.
- """
- createdAt: Time!
-
- """
- ID of the package.
- """
- id: PackagesPackageID!
-
- """
- Package metadata.
- """
- metadata: PackageMetadata
-
- """
- Name of the package.
- """
- name: String!
-
- """
- Package type.
- """
- packageType: PackageTypeEnum!
-
- """
- Pipelines that built the package.
- """
- pipelines(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): PipelineConnection
-
- """
- Project where the package is stored.
- """
- project: Project!
-
- """
- Package tags.
- """
- tags(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): PackageTagConnection
-
- """
- Date of most recent update.
- """
- updatedAt: Time!
-
- """
- Version string.
- """
- version: String
-
- """
- The other versions of the package.
- """
- versions(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): PackageWithoutVersionsConnection
-}
-
-"""
-Represents a composer JSON file
-"""
-type PackageComposerJsonType {
- """
- The license set in the Composer JSON file.
- """
- license: String
-
- """
- The name set in the Composer JSON file.
- """
- name: String
-
- """
- The type set in the Composer JSON file.
- """
- type: String
-
- """
- The version set in the Composer JSON file.
- """
- version: String
-}
-
-"""
-The connection type for Package.
-"""
-type PackageConnection {
- """
- A list of edges.
- """
- edges: [PackageEdge]
-
- """
- A list of nodes.
- """
- nodes: [Package]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type PackageEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Package
-}
-
-"""
-Represents the Geo sync and verification state of a package file
-"""
-type PackageFileRegistry {
- """
- Timestamp when the PackageFileRegistry was created
- """
- createdAt: Time
-
- """
- ID of the PackageFileRegistry
- """
- id: ID!
-
- """
- Error message during sync of the PackageFileRegistry
- """
- lastSyncFailure: String
-
- """
- Timestamp of the most recent successful sync of the PackageFileRegistry
- """
- lastSyncedAt: Time
-
- """
- ID of the PackageFile.
- """
- packageFileId: ID!
-
- """
- Timestamp after which the PackageFileRegistry should be resynced
- """
- retryAt: Time
-
- """
- Number of consecutive failed sync attempts of the PackageFileRegistry
- """
- retryCount: Int
-
- """
- Sync state of the PackageFileRegistry
- """
- state: RegistryState
-}
-
-"""
-The connection type for PackageFileRegistry.
-"""
-type PackageFileRegistryConnection {
- """
- A list of edges.
- """
- edges: [PackageFileRegistryEdge]
-
- """
- A list of nodes.
- """
- nodes: [PackageFileRegistry]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type PackageFileRegistryEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: PackageFileRegistry
-}
-
-"""
-Represents metadata associated with a Package
-"""
-union PackageMetadata = ComposerMetadata
-
-"""
-Namespace-level Package Registry settings
-"""
-type PackageSettings {
- """
- When maven_duplicates_allowed is false, you can publish duplicate packages
- with names that match this regex. Otherwise, this setting has no effect.
- """
- mavenDuplicateExceptionRegex: UntrustedRegexp
-
- """
- Indicates whether duplicate Maven packages are allowed for this namespace.
- """
- mavenDuplicatesAllowed: Boolean!
-}
-
-"""
-Represents a package tag
-"""
-type PackageTag {
- """
- The created date.
- """
- createdAt: Time!
-
- """
- The ID of the tag.
- """
- id: ID!
-
- """
- The name of the tag.
- """
- name: String!
-
- """
- The updated date.
- """
- updatedAt: Time!
-}
-
-"""
-The connection type for PackageTag.
-"""
-type PackageTagConnection {
- """
- A list of edges.
- """
- edges: [PackageTagEdge]
-
- """
- A list of nodes.
- """
- nodes: [PackageTag]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type PackageTagEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: PackageTag
-}
-
-enum PackageTypeEnum {
- """
- Packages from the Composer package manager
- """
- COMPOSER
-
- """
- Packages from the Conan package manager
- """
- CONAN
-
- """
- Packages from the Debian package manager
- """
- DEBIAN
-
- """
- Packages from the Generic package manager
- """
- GENERIC
-
- """
- Packages from the Golang package manager
- """
- GOLANG
-
- """
- Packages from the Maven package manager
- """
- MAVEN
-
- """
- Packages from the npm package manager
- """
- NPM
-
- """
- Packages from the Nuget package manager
- """
- NUGET
-
- """
- Packages from the PyPI package manager
- """
- PYPI
-
- """
- Packages from the Rubygems package manager
- """
- RUBYGEMS
-}
-
-"""
-Represents a version of a package in the Package Registry
-"""
-type PackageWithoutVersions {
- """
- Date of creation.
- """
- createdAt: Time!
-
- """
- ID of the package.
- """
- id: PackagesPackageID!
-
- """
- Package metadata.
- """
- metadata: PackageMetadata
-
- """
- Name of the package.
- """
- name: String!
-
- """
- Package type.
- """
- packageType: PackageTypeEnum!
-
- """
- Pipelines that built the package.
- """
- pipelines(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): PipelineConnection
-
- """
- Project where the package is stored.
- """
- project: Project!
-
- """
- Package tags.
- """
- tags(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): PackageTagConnection
-
- """
- Date of most recent update.
- """
- updatedAt: Time!
-
- """
- Version string.
- """
- version: String
-}
-
-"""
-The connection type for PackageWithoutVersions.
-"""
-type PackageWithoutVersionsConnection {
- """
- A list of edges.
- """
- edges: [PackageWithoutVersionsEdge]
-
- """
- A list of nodes.
- """
- nodes: [PackageWithoutVersions]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type PackageWithoutVersionsEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: PackageWithoutVersions
-}
-
-"""
-Identifier of Packages::Package.
-"""
-scalar PackagesPackageID
-
-"""
-Information about pagination in a connection.
-"""
-type PageInfo {
- """
- When paginating forwards, the cursor to continue.
- """
- endCursor: String
-
- """
- When paginating forwards, are there more items?
- """
- hasNextPage: Boolean!
-
- """
- When paginating backwards, are there more items?
- """
- hasPreviousPage: Boolean!
-
- """
- When paginating backwards, the cursor to continue.
- """
- startCursor: String
-}
-
-type Pipeline {
- """
- Indicates if the pipeline is active.
- """
- active: Boolean!
-
- """
- Base SHA of the source branch.
- """
- beforeSha: String
-
- """
- Specifies if a pipeline can be canceled.
- """
- cancelable: Boolean!
-
- """
- Timestamp of the pipeline's commit.
- """
- committedAt: Time
-
- """
- Configuration source of the pipeline (UNKNOWN_SOURCE, REPOSITORY_SOURCE,
- AUTO_DEVOPS_SOURCE, WEBIDE_SOURCE, REMOTE_SOURCE, EXTERNAL_PROJECT_SOURCE,
- BRIDGE_SOURCE, PARAMETER_SOURCE, COMPLIANCE_SOURCE)
- """
- configSource: PipelineConfigSourceEnum
-
- """
- Coverage percentage.
- """
- coverage: Float
-
- """
- Timestamp of the pipeline's creation.
- """
- createdAt: Time!
-
- """
- Detailed status of the pipeline.
- """
- detailedStatus: DetailedStatus!
-
- """
- Pipelines this pipeline will trigger.
- """
- downstream(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): PipelineConnection
-
- """
- Duration of the pipeline in seconds.
- """
- duration: Int
-
- """
- Timestamp of the pipeline's completion.
- """
- finishedAt: Time
-
- """
- ID of the pipeline.
- """
- id: ID!
-
- """
- Internal ID of the pipeline.
- """
- iid: String!
-
- """
- Jobs belonging to the pipeline.
- """
- jobs(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter jobs by the type of security report they produce.
- """
- securityReportTypes: [SecurityReportTypeEnum!]
- ): CiJobConnection
-
- """
- Relative path to the pipeline's page.
- """
- path: String
-
- """
- Project the pipeline belongs to.
- """
- project: Project
-
- """
- Specifies if a pipeline can be retried.
- """
- retryable: Boolean!
-
- """
- Vulnerability and scanned resource counts for each security scanner of the pipeline.
- """
- securityReportSummary: SecurityReportSummary
-
- """
- SHA of the pipeline's commit.
- """
- sha: String!
-
- """
- Job where pipeline was triggered from.
- """
- sourceJob: CiJob
-
- """
- Stages of the pipeline.
- """
- stages(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): CiStageConnection
-
- """
- Timestamp when the pipeline was started.
- """
- startedAt: Time
-
- """
- Status of the pipeline (CREATED, WAITING_FOR_RESOURCE, PREPARING, PENDING,
- RUNNING, FAILED, SUCCESS, CANCELED, SKIPPED, MANUAL, SCHEDULED)
- """
- status: PipelineStatusEnum!
-
- """
- Timestamp of the pipeline's last activity.
- """
- updatedAt: Time!
-
- """
- Pipeline that triggered the pipeline.
- """
- upstream: Pipeline
-
- """
- Pipeline user.
- """
- user: User
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: PipelinePermissions!
-
- """
- Indicates if a pipeline has warnings.
- """
- warnings: Boolean!
-}
-
-type PipelineAnalytics {
- """
- Labels for the monthly pipeline count.
- """
- monthPipelinesLabels: [String!]
-
- """
- Total monthly successful pipeline count.
- """
- monthPipelinesSuccessful: [Int!]
-
- """
- Total monthly pipeline count.
- """
- monthPipelinesTotals: [Int!]
-
- """
- Pipeline times labels.
- """
- pipelineTimesLabels: [String!]
-
- """
- Pipeline times.
- """
- pipelineTimesValues: [Int!]
-
- """
- Labels for the weekly pipeline count.
- """
- weekPipelinesLabels: [String!]
-
- """
- Total weekly successful pipeline count.
- """
- weekPipelinesSuccessful: [Int!]
-
- """
- Total weekly pipeline count.
- """
- weekPipelinesTotals: [Int!]
-
- """
- Labels for the yearly pipeline count.
- """
- yearPipelinesLabels: [String!]
-
- """
- Total yearly successful pipeline count.
- """
- yearPipelinesSuccessful: [Int!]
-
- """
- Total yearly pipeline count.
- """
- yearPipelinesTotals: [Int!]
-}
-
-"""
-Autogenerated input type of PipelineCancel
-"""
-input PipelineCancelInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The ID of the pipeline to mutate.
- """
- id: CiPipelineID!
-}
-
-"""
-Autogenerated return type of PipelineCancel
-"""
-type PipelineCancelPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-enum PipelineConfigSourceEnum {
- AUTO_DEVOPS_SOURCE
- BRIDGE_SOURCE
- COMPLIANCE_SOURCE
- EXTERNAL_PROJECT_SOURCE
- PARAMETER_SOURCE
- REMOTE_SOURCE
- REPOSITORY_SOURCE
- UNKNOWN_SOURCE
- WEBIDE_SOURCE
-}
-
-"""
-The connection type for Pipeline.
-"""
-type PipelineConnection {
- """
- Total count of collection.
- """
- count: Int!
-
- """
- A list of edges.
- """
- edges: [PipelineEdge]
-
- """
- A list of nodes.
- """
- nodes: [Pipeline]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of PipelineDestroy
-"""
-input PipelineDestroyInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The ID of the pipeline to mutate.
- """
- id: CiPipelineID!
-}
-
-"""
-Autogenerated return type of PipelineDestroy
-"""
-type PipelineDestroyPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-An edge in a connection.
-"""
-type PipelineEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Pipeline
-}
-
-type PipelinePermissions {
- """
- Indicates the user can perform `admin_pipeline` on this resource
- """
- adminPipeline: Boolean!
-
- """
- Indicates the user can perform `destroy_pipeline` on this resource
- """
- destroyPipeline: Boolean!
-
- """
- Indicates the user can perform `update_pipeline` on this resource
- """
- updatePipeline: Boolean!
-}
-
-"""
-Autogenerated input type of PipelineRetry
-"""
-input PipelineRetryInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The ID of the pipeline to mutate.
- """
- id: CiPipelineID!
-}
-
-"""
-Autogenerated return type of PipelineRetry
-"""
-type PipelineRetryPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The pipeline after mutation.
- """
- pipeline: Pipeline
-}
-
-enum PipelineStatusEnum {
- CANCELED
- CREATED
- FAILED
- MANUAL
- PENDING
- PREPARING
- RUNNING
- SCHEDULED
- SKIPPED
- SUCCESS
- WAITING_FOR_RESOURCE
-}
-
-type Project {
- """
- Size limit for the repository in bytes.
- """
- actualRepositorySizeLimit: Float
-
- """
- A single Alert Management alert of the project.
- """
- alertManagementAlert(
- """
- Username of a user assigned to the issue.
- """
- assigneeUsername: String
-
- """
- Filter query for given domain.
- """
- domain: AlertManagementDomainFilter! = operations
-
- """
- IID of the alert. For example, "1".
- """
- iid: String
-
- """
- Search query for title, description, service, or monitoring_tool.
- """
- search: String
-
- """
- Sort alerts by this criteria.
- """
- sort: AlertManagementAlertSort
-
- """
- Alerts with the specified statues. For example, [TRIGGERED].
- """
- statuses: [AlertManagementStatus!]
- ): AlertManagementAlert
-
- """
- Counts of alerts by status for the project.
- """
- alertManagementAlertStatusCounts(
- """
- Username of a user assigned to the issue.
- """
- assigneeUsername: String
-
- """
- Search query for title, description, service, or monitoring_tool.
- """
- search: String
- ): AlertManagementAlertStatusCountsType
-
- """
- Alert Management alerts of the project.
- """
- alertManagementAlerts(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Username of a user assigned to the issue.
- """
- assigneeUsername: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Filter query for given domain.
- """
- domain: AlertManagementDomainFilter! = operations
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- IID of the alert. For example, "1".
- """
- iid: String
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Search query for title, description, service, or monitoring_tool.
- """
- search: String
-
- """
- Sort alerts by this criteria.
- """
- sort: AlertManagementAlertSort
-
- """
- Alerts with the specified statues. For example, [TRIGGERED].
- """
- statuses: [AlertManagementStatus!]
- ): AlertManagementAlertConnection
-
- """
- Integrations which can receive alerts for the project.
- """
- alertManagementIntegrations(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): AlertManagementIntegrationConnection
-
- """
- Extract alert fields from payload for custom mapping.
- """
- alertManagementPayloadFields(
- """
- Sample payload for extracting alert fields for custom mappings.
- """
- payloadExample: String!
- ): [AlertManagementPayloadAlertField!]
-
- """
- If `only_allow_merge_if_pipeline_succeeds` is true, indicates if merge
- requests of the project can also be merged with skipped jobs.
- """
- allowMergeOnSkippedPipeline: Boolean
-
- """
- API fuzzing configuration for the project. Available only when feature flag `api_fuzzing_configuration_ui` is enabled.
- """
- apiFuzzingCiConfiguration: ApiFuzzingCiConfiguration
-
- """
- Indicates the archived status of the project.
- """
- archived: Boolean
-
- """
- Indicates if issues referenced by merge requests and commits within the default branch are closed automatically.
- """
- autocloseReferencedIssues: Boolean
-
- """
- URL to avatar image file of the project.
- """
- avatarUrl: String
-
- """
- A single board of the project.
- """
- board(
- """
- The board's ID.
- """
- id: BoardID!
- ): Board
-
- """
- Boards of the project.
- """
- boards(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Find a board by its ID.
- """
- id: BoardID
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): BoardConnection
-
- """
- CI/CD settings for the project.
- """
- ciCdSettings: ProjectCiCdSetting
-
- """
- Find a single cluster agent by name.
- """
- clusterAgent(
- """
- Name of the cluster agent.
- """
- name: String!
- ): ClusterAgent
-
- """
- Cluster agents associated with the project.
- """
- clusterAgents(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): ClusterAgentConnection
-
- """
- Code coverage summary associated with the project.
- """
- codeCoverageSummary: CodeCoverageSummary
-
- """
- Compliance frameworks associated with the project.
- """
- complianceFrameworks(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): ComplianceFrameworkConnection
-
- """
- The container expiration policy of the project.
- """
- containerExpirationPolicy: ContainerExpirationPolicy
-
- """
- Indicates if the project stores Docker container images in a container registry.
- """
- containerRegistryEnabled: Boolean
-
- """
- Container repositories of the project.
- """
- containerRepositories(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter the container repositories by their name.
- """
- name: String
-
- """
- Sort container repositories by this criteria.
- """
- sort: ContainerRepositorySort = created_desc
- ): ContainerRepositoryConnection
-
- """
- Number of container repositories in the project.
- """
- containerRepositoriesCount: Int!
-
- """
- Timestamp of the project creation.
- """
- createdAt: Time
-
- """
- DAST Profiles associated with the project. Always returns no nodes if `dast_saved_scans` is disabled.
- """
- dastProfiles(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DastProfileConnection
-
- """
- The DAST scanner profiles associated with the project.
- """
- dastScannerProfiles(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DastScannerProfileConnection
-
- """
- DAST Site Profile associated with the project.
- """
- dastSiteProfile(
- """
- ID of the site profile.
- """
- id: DastSiteProfileID!
- ): DastSiteProfile
-
- """
- DAST Site Profiles associated with the project.
- """
- dastSiteProfiles(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DastSiteProfileConnection
-
- """
- DAST Site Validations associated with the project. Always returns no nodes if
- `security_on_demand_scans_site_validation` is disabled.
- """
- dastSiteValidations(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Normalized URL of the target to be scanned.
- """
- normalizedTargetUrls: [String!]
- ): DastSiteValidationConnection
-
- """
- Short description of the project.
- """
- description: String
-
- """
- The GitLab Flavored Markdown rendering of `description`
- """
- descriptionHtml: String
-
- """
- A single environment of the project.
- """
- environment(
- """
- Name of the environment.
- """
- name: String
-
- """
- Search query for environment name.
- """
- search: String
-
- """
- States of environments that should be included in result.
- """
- states: [String!]
- ): Environment
-
- """
- Environments of the project.
- """
- environments(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Name of the environment.
- """
- name: String
-
- """
- Search query for environment name.
- """
- search: String
-
- """
- States of environments that should be included in result.
- """
- states: [String!]
- ): EnvironmentConnection
-
- """
- Number of times the project has been forked.
- """
- forksCount: Int!
-
- """
- Full path of the project.
- """
- fullPath: ID!
-
- """
- Grafana integration details for the project.
- """
- grafanaIntegration: GrafanaIntegration
-
- """
- Group of the project.
- """
- group: Group
-
- """
- URL to connect to the project via HTTPS.
- """
- httpUrlToRepo: String
-
- """
- ID of the project.
- """
- id: ID!
-
- """
- Status of import background job of the project.
- """
- importStatus: String
-
- """
- Incident Management On-call schedules of the project.
- """
- incidentManagementOncallSchedules(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): IncidentManagementOncallScheduleConnection
-
- """
- A single issue of the project.
- """
- issue(
- """
- ID of a user assigned to the issues, "none" and "any" values are supported.
- """
- assigneeId: String
-
- """
- Username of a user assigned to the issue.
- """
- assigneeUsername: String
-
- """
- Usernames of users assigned to the issue.
- """
- assigneeUsernames: [String!]
-
- """
- Username of the author of the issue.
- """
- authorUsername: String
-
- """
- Issues closed after this date.
- """
- closedAfter: Time
-
- """
- Issues closed before this date.
- """
- closedBefore: Time
-
- """
- Issues created after this date.
- """
- createdAfter: Time
-
- """
- Issues created before this date.
- """
- createdBefore: Time
-
- """
- ID of an epic associated with the issues, "none" and "any" values are supported.
- """
- epicId: String
-
- """
- IID of the issue. For example, "1".
- """
- iid: String
-
- """
- List of IIDs of issues. For example, [1, 2].
- """
- iids: [String!]
-
- """
- Iterations applied to the issue.
- """
- iterationId: [ID]
-
- """
- Labels applied to this issue.
- """
- labelName: [String]
-
- """
- Milestone applied to this issue.
- """
- milestoneTitle: [String]
-
- """
- Search query for issue title or description.
- """
- search: String
-
- """
- Sort issues by this criteria.
- """
- sort: IssueSort = created_desc
-
- """
- Current state of this issue.
- """
- state: IssuableState
-
- """
- Filter issues by the given issue types.
- """
- types: [IssueType!]
-
- """
- Issues updated after this date.
- """
- updatedAfter: Time
-
- """
- Issues updated before this date.
- """
- updatedBefore: Time
- ): Issue
-
- """
- Counts of issues by status for the project.
- """
- issueStatusCounts(
- """
- ID of a user assigned to the issues, "none" and "any" values are supported.
- """
- assigneeId: String
-
- """
- Username of a user assigned to the issue.
- """
- assigneeUsername: String
-
- """
- Usernames of users assigned to the issue.
- """
- assigneeUsernames: [String!]
-
- """
- Username of the author of the issue.
- """
- authorUsername: String
-
- """
- Issues closed after this date.
- """
- closedAfter: Time
-
- """
- Issues closed before this date.
- """
- closedBefore: Time
-
- """
- Issues created after this date.
- """
- createdAfter: Time
-
- """
- Issues created before this date.
- """
- createdBefore: Time
-
- """
- IID of the issue. For example, "1".
- """
- iid: String
-
- """
- List of IIDs of issues. For example, [1, 2].
- """
- iids: [String!]
-
- """
- Labels applied to this issue.
- """
- labelName: [String]
-
- """
- Milestone applied to this issue.
- """
- milestoneTitle: [String]
-
- """
- Search query for issue title or description.
- """
- search: String
-
- """
- Filter issues by the given issue types.
- """
- types: [IssueType!]
-
- """
- Issues updated after this date.
- """
- updatedAfter: Time
-
- """
- Issues updated before this date.
- """
- updatedBefore: Time
- ): IssueStatusCountsType
-
- """
- Issues of the project.
- """
- issues(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- ID of a user assigned to the issues, "none" and "any" values are supported.
- """
- assigneeId: String
-
- """
- Username of a user assigned to the issue.
- """
- assigneeUsername: String
-
- """
- Usernames of users assigned to the issue.
- """
- assigneeUsernames: [String!]
-
- """
- Username of the author of the issue.
- """
- authorUsername: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Issues closed after this date.
- """
- closedAfter: Time
-
- """
- Issues closed before this date.
- """
- closedBefore: Time
-
- """
- Issues created after this date.
- """
- createdAfter: Time
-
- """
- Issues created before this date.
- """
- createdBefore: Time
-
- """
- ID of an epic associated with the issues, "none" and "any" values are supported.
- """
- epicId: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- IID of the issue. For example, "1".
- """
- iid: String
-
- """
- List of IIDs of issues. For example, [1, 2].
- """
- iids: [String!]
-
- """
- Iterations applied to the issue.
- """
- iterationId: [ID]
-
- """
- Labels applied to this issue.
- """
- labelName: [String]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Milestone applied to this issue.
- """
- milestoneTitle: [String]
-
- """
- Search query for issue title or description.
- """
- search: String
-
- """
- Sort issues by this criteria.
- """
- sort: IssueSort = created_desc
-
- """
- Current state of this issue.
- """
- state: IssuableState
-
- """
- Filter issues by the given issue types.
- """
- types: [IssueType!]
-
- """
- Issues updated after this date.
- """
- updatedAfter: Time
-
- """
- Issues updated before this date.
- """
- updatedBefore: Time
- ): IssueConnection
-
- """
- Indicates if Issues are enabled for the current user
- """
- issuesEnabled: Boolean
-
- """
- Find iterations.
- """
- iterations(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.
- """
- endDate: Time
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Global ID of the Iteration to look up.
- """
- id: ID
-
- """
- Internal ID of the Iteration to look up.
- """
- iid: ID
-
- """
- Whether to include ancestor iterations. Defaults to true.
- """
- includeAncestors: Boolean
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use
- timeframe.start.
- """
- startDate: Time
-
- """
- Filter iterations by state.
- """
- state: IterationState
-
- """
- List items overlapping the given timeframe.
- """
- timeframe: Timeframe
-
- """
- Fuzzy search by title.
- """
- title: String
- ): IterationConnection
-
- """
- Status of Jira import background job of the project.
- """
- jiraImportStatus: String
-
- """
- Jira imports into the project.
- """
- jiraImports(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): JiraImportConnection
-
- """
- Indicates if CI/CD pipeline jobs are enabled for the current user.
- """
- jobsEnabled: Boolean
-
- """
- A label available on this project.
- """
- label(
- """
- Title of the label.
- """
- title: String!
- ): Label
-
- """
- Labels available on this project.
- """
- labels(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Include labels from ancestor groups.
- """
- includeAncestorGroups: Boolean = false
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- A search term to find labels with.
- """
- searchTerm: String
- ): LabelConnection
-
- """
- Timestamp of the project last activity.
- """
- lastActivityAt: Time
-
- """
- Indicates if the project has Large File Storage (LFS) enabled.
- """
- lfsEnabled: Boolean
-
- """
- A single merge request of the project.
- """
- mergeRequest(
- """
- IID of the merge request, for example `1`.
- """
- iid: String!
- ): MergeRequest
-
- """
- Merge requests of the project.
- """
- mergeRequests(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Username of the assignee.
- """
- assigneeUsername: String
-
- """
- Username of the author.
- """
- authorUsername: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Array of IIDs of merge requests, for example `[1, 2]`.
- """
- iids: [String!]
-
- """
- Array of label names. All resolved merge requests will have all of these labels.
- """
- labels: [String!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Merge requests merged after this date.
- """
- mergedAfter: Time
-
- """
- Merge requests merged before this date.
- """
- mergedBefore: Time
-
- """
- Title of the milestone.
- """
- milestoneTitle: String
-
- """
- Username of the reviewer.
- """
- reviewerUsername: String
-
- """
- Sort merge requests by this criteria.
- """
- sort: MergeRequestSort = created_desc
-
- """
- Array of source branch names. All resolved merge requests will have one of these branches as their source.
- """
- sourceBranches: [String!]
-
- """
- A merge request state. If provided, all resolved merge requests will have this state.
- """
- state: MergeRequestState
-
- """
- Array of target branch names. All resolved merge requests will have one of these branches as their target.
- """
- targetBranches: [String!]
- ): MergeRequestConnection
-
- """
- Indicates if Merge Requests are enabled for the current user
- """
- mergeRequestsEnabled: Boolean
-
- """
- Indicates if no merge commits should be created and all merges should instead
- be fast-forwarded, which means that merging is only allowed if the branch
- could be fast-forwarded.
- """
- mergeRequestsFfOnlyEnabled: Boolean
-
- """
- Milestones of the project.
- """
- milestones(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- A date that the milestone contains.
- """
- containingDate: Time
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.
- """
- endDate: Time
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Array of global milestone IDs, e.g., "gid://gitlab/Milestone/1".
- """
- ids: [ID!]
-
- """
- Also return milestones in the project's parent group and its ancestors.
- """
- includeAncestors: Boolean
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- A search string for the title.
- """
- searchTitle: String
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use
- timeframe.start.
- """
- startDate: Time
-
- """
- Filter milestones by state.
- """
- state: MilestoneStateEnum
-
- """
- List items overlapping the given timeframe.
- """
- timeframe: Timeframe
-
- """
- The title of the milestone.
- """
- title: String
- ): MilestoneConnection
-
- """
- Name of the project (without namespace).
- """
- name: String!
-
- """
- Full name of the project with its namespace.
- """
- nameWithNamespace: String!
-
- """
- Namespace of the project.
- """
- namespace: Namespace
-
- """
- Indicates if merge requests of the project can only be merged when all the discussions are resolved.
- """
- onlyAllowMergeIfAllDiscussionsAreResolved: Boolean
-
- """
- Indicates if merge requests of the project can only be merged with successful jobs.
- """
- onlyAllowMergeIfPipelineSucceeds: Boolean
-
- """
- Number of open issues for the project.
- """
- openIssuesCount: Int
-
- """
- Packages of the project.
- """
- packages(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): PackageConnection
-
- """
- Path of the project.
- """
- path: String!
-
- """
- Build pipeline of the project.
- """
- pipeline(
- """
- IID of the Pipeline, e.g., "1".
- """
- iid: ID!
- ): Pipeline
-
- """
- Pipeline analytics.
- """
- pipelineAnalytics: PipelineAnalytics
-
- """
- Build pipelines of the project.
- """
- pipelines(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter pipelines by the ref they are run for.
- """
- ref: String
-
- """
- Filter pipelines by the sha of the commit they are run for.
- """
- sha: String
-
- """
- Filter pipelines by their status.
- """
- status: PipelineStatusEnum
- ): PipelineConnection
-
- """
- Indicates if a link to create or view a merge request should display after a
- push to Git repositories of the project from the command line.
- """
- printingMergeRequestLinkEnabled: Boolean
-
- """
- Members of the project.
- """
- projectMembers(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter members by the given member relations.
- """
- relations: [ProjectMemberRelation!] = [DIRECT, INHERITED]
-
- """
- Search query.
- """
- search: String
- ): MemberInterfaceConnection
-
- """
- Indicates if there is public access to pipelines and job details of the project, including output logs and artifacts.
- """
- publicJobs: Boolean
-
- """
- A single release of the project.
- """
- release(
- """
- The name of the tag associated to the release.
- """
- tagName: String!
- ): Release
-
- """
- Releases of the project.
- """
- releases(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Sort releases by this criteria.
- """
- sort: ReleaseSort = RELEASED_AT_DESC
- ): ReleaseConnection
-
- """
- Indicates if `Delete source branch` option should be enabled by default for all new merge requests of the project.
- """
- removeSourceBranchAfterMerge: Boolean
-
- """
- Git repository of the project.
- """
- repository: Repository
-
- """
- Size of repository that exceeds the limit in bytes.
- """
- repositorySizeExcess: Float
-
- """
- Indicates if users can request member access to the project.
- """
- requestAccessEnabled: Boolean
-
- """
- Find a single requirement.
- """
- requirement(
- """
- Filter requirements by author username.
- """
- authorUsername: [String!]
-
- """
- IID of the requirement, e.g., "1".
- """
- iid: ID
-
- """
- List of IIDs of requirements, e.g., [1, 2].
- """
- iids: [ID!]
-
- """
- The state of latest requirement test report.
- """
- lastTestReportState: TestReportState
-
- """
- Search query for requirement title.
- """
- search: String
-
- """
- List requirements by sort order.
- """
- sort: Sort
-
- """
- Filter requirements by state.
- """
- state: RequirementState
- ): Requirement
-
- """
- Number of requirements for the project by their state.
- """
- requirementStatesCount: RequirementStatesCount
-
- """
- Find requirements.
- """
- requirements(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Filter requirements by author username.
- """
- authorUsername: [String!]
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- IID of the requirement, e.g., "1".
- """
- iid: ID
-
- """
- List of IIDs of requirements, e.g., [1, 2].
- """
- iids: [ID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- The state of latest requirement test report.
- """
- lastTestReportState: TestReportState
-
- """
- Search query for requirement title.
- """
- search: String
-
- """
- List requirements by sort order.
- """
- sort: Sort
-
- """
- Filter requirements by state.
- """
- state: RequirementState
- ): RequirementConnection
-
- """
- SAST CI configuration for the project.
- """
- sastCiConfiguration: SastCiConfiguration
-
- """
- Path to project's security dashboard.
- """
- securityDashboardPath: String
-
- """
- Information about security analyzers used in the project.
- """
- securityScanners: SecurityScanners
-
- """
- Detailed version of a Sentry error on the project.
- """
- sentryDetailedError(
- """
- ID of the Sentry issue.
- """
- id: GitlabErrorTrackingDetailedErrorID!
- ): SentryDetailedError
-
- """
- Paginated collection of Sentry errors on the project.
- """
- sentryErrors: SentryErrorCollection
-
- """
- E-mail address of the service desk.
- """
- serviceDeskAddress: String
-
- """
- Indicates if the project has service desk enabled.
- """
- serviceDeskEnabled: Boolean
-
- """
- Project services.
- """
- services(
- """
- Indicates if the service is active.
- """
- active: Boolean
-
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Class name of the service.
- """
- type: ServiceType
- ): ServiceConnection
-
- """
- Indicates if shared runners are enabled for the project.
- """
- sharedRunnersEnabled: Boolean
-
- """
- Snippets of the project.
- """
- snippets(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Array of global snippet ids, e.g., "gid://gitlab/ProjectSnippet/1".
- """
- ids: [SnippetID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- The visibility of the snippet.
- """
- visibility: VisibilityScopesEnum
- ): SnippetConnection
-
- """
- Indicates if Snippets are enabled for the current user
- """
- snippetsEnabled: Boolean
-
- """
- Indicates if `squashReadOnly` is enabled.
- """
- squashReadOnly: Boolean!
-
- """
- URL to connect to the project via SSH.
- """
- sshUrlToRepo: String
-
- """
- Number of times the project has been starred.
- """
- starCount: Int!
-
- """
- Statistics of the project.
- """
- statistics: ProjectStatistics
-
- """
- The commit message used to apply merge request suggestions.
- """
- suggestionCommitMessage: String
-
- """
- List of project topics (not Git tags).
- """
- tagList: String
-
- """
- Find a single Terraform state by name.
- """
- terraformState(
- """
- Name of the Terraform state.
- """
- name: String!
- ): TerraformState
-
- """
- Terraform states associated with the project.
- """
- terraformStates(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): TerraformStateConnection
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: ProjectPermissions!
-
- """
- Visibility of the project.
- """
- visibility: String
-
- """
- Vulnerabilities reported on the project.
- """
- vulnerabilities(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns only the vulnerabilities which have linked issues.
- """
- hasIssues: Boolean
-
- """
- Returns only the vulnerabilities which have been resolved on default branch.
- """
- hasResolution: Boolean
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter vulnerabilities by project.
- """
- projectId: [ID!]
-
- """
- Filter vulnerabilities by report type.
- """
- reportType: [VulnerabilityReportType!]
-
- """
- Filter vulnerabilities by VulnerabilityScanner.externalId.
- """
- scanner: [String!]
-
- """
- Filter vulnerabilities by severity.
- """
- severity: [VulnerabilitySeverity!]
-
- """
- List vulnerabilities by sort order.
- """
- sort: VulnerabilitySort = severity_desc
-
- """
- Filter vulnerabilities by state.
- """
- state: [VulnerabilityState!]
- ): VulnerabilityConnection
-
- """
- Number of vulnerabilities per day for the project.
- """
- vulnerabilitiesCountByDay(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Last day for which to fetch vulnerability history.
- """
- endDate: ISO8601Date!
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- First day for which to fetch vulnerability history.
- """
- startDate: ISO8601Date!
- ): VulnerabilitiesCountByDayConnection
-
- """
- Vulnerability scanners reported on the project vulnerabilities.
- """
- vulnerabilityScanners(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): VulnerabilityScannerConnection
-
- """
- Counts for each vulnerability severity in the project.
- """
- vulnerabilitySeveritiesCount(
- """
- Filter vulnerabilities by project.
- """
- projectId: [ID!]
-
- """
- Filter vulnerabilities by report type.
- """
- reportType: [VulnerabilityReportType!]
-
- """
- Filter vulnerabilities by scanner.
- """
- scanner: [String!]
-
- """
- Filter vulnerabilities by severity.
- """
- severity: [VulnerabilitySeverity!]
-
- """
- Filter vulnerabilities by state.
- """
- state: [VulnerabilityState!]
- ): VulnerabilitySeveritiesCount
-
- """
- Web URL of the project.
- """
- webUrl: String
-
- """
- Indicates if Wikis are enabled for the current user
- """
- wikiEnabled: Boolean
-}
-
-type ProjectCiCdSetting {
- """
- Whether to keep the latest builds artifacts.
- """
- keepLatestArtifact: Boolean
-
- """
- Whether merge pipelines are enabled.
- """
- mergePipelinesEnabled: Boolean
-
- """
- Whether merge trains are enabled.
- """
- mergeTrainsEnabled: Boolean
-
- """
- Project the CI/CD settings belong to.
- """
- project: Project
-}
-
-"""
-The connection type for Project.
-"""
-type ProjectConnection {
- """
- A list of edges.
- """
- edges: [ProjectEdge]
-
- """
- A list of nodes.
- """
- nodes: [Project]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type ProjectEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Project
-}
-
-"""
-Identifier of Project.
-"""
-scalar ProjectID
-
-"""
-Represents a Project Membership
-"""
-type ProjectMember implements MemberInterface {
- """
- GitLab::Access level.
- """
- accessLevel: AccessLevel
-
- """
- Date and time the membership was created.
- """
- createdAt: Time
-
- """
- User that authorized membership.
- """
- createdBy: User
-
- """
- Date and time the membership expires.
- """
- expiresAt: Time
-
- """
- ID of the member.
- """
- id: ID!
-
- """
- Project that User is a member of.
- """
- project: Project
-
- """
- Date and time the membership was last updated.
- """
- updatedAt: Time
-
- """
- User that is associated with the member object.
- """
- user: User!
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: ProjectPermissions!
-}
-
-"""
-The connection type for ProjectMember.
-"""
-type ProjectMemberConnection {
- """
- A list of edges.
- """
- edges: [ProjectMemberEdge]
-
- """
- A list of nodes.
- """
- nodes: [ProjectMember]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type ProjectMemberEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: ProjectMember
-}
-
-"""
-Project member relation
-"""
-enum ProjectMemberRelation {
- """
- Descendants members
- """
- DESCENDANTS
-
- """
- Direct members
- """
- DIRECT
-
- """
- Inherited members
- """
- INHERITED
-
- """
- Invited Groups members
- """
- INVITED_GROUPS
-}
-
-type ProjectPermissions {
- """
- Indicates the user can perform `admin_operations` on this resource
- """
- adminOperations: Boolean!
-
- """
- Indicates the user can perform `admin_project` on this resource
- """
- adminProject: Boolean!
-
- """
- Indicates the user can perform `admin_remote_mirror` on this resource
- """
- adminRemoteMirror: Boolean!
-
- """
- Indicates the user can perform `admin_wiki` on this resource
- """
- adminWiki: Boolean!
-
- """
- Indicates the user can perform `archive_project` on this resource
- """
- archiveProject: Boolean!
-
- """
- Indicates the user can perform `change_namespace` on this resource
- """
- changeNamespace: Boolean!
-
- """
- Indicates the user can perform `change_visibility_level` on this resource
- """
- changeVisibilityLevel: Boolean!
-
- """
- Indicates the user can perform `create_deployment` on this resource
- """
- createDeployment: Boolean!
-
- """
- Indicates the user can perform `create_design` on this resource
- """
- createDesign: Boolean!
-
- """
- Indicates the user can perform `create_issue` on this resource
- """
- createIssue: Boolean!
-
- """
- Indicates the user can perform `create_label` on this resource
- """
- createLabel: Boolean!
-
- """
- Indicates the user can perform `create_merge_request_from` on this resource
- """
- createMergeRequestFrom: Boolean!
-
- """
- Indicates the user can perform `create_merge_request_in` on this resource
- """
- createMergeRequestIn: Boolean!
-
- """
- Indicates the user can perform `create_pages` on this resource
- """
- createPages: Boolean!
-
- """
- Indicates the user can perform `create_pipeline` on this resource
- """
- createPipeline: Boolean!
-
- """
- Indicates the user can perform `create_pipeline_schedule` on this resource
- """
- createPipelineSchedule: Boolean!
-
- """
- Indicates the user can perform `create_snippet` on this resource
- """
- createSnippet: Boolean!
-
- """
- Indicates the user can perform `create_wiki` on this resource
- """
- createWiki: Boolean!
-
- """
- Indicates the user can perform `destroy_design` on this resource
- """
- destroyDesign: Boolean!
-
- """
- Indicates the user can perform `destroy_pages` on this resource
- """
- destroyPages: Boolean!
-
- """
- Indicates the user can perform `destroy_wiki` on this resource
- """
- destroyWiki: Boolean!
-
- """
- Indicates the user can perform `download_code` on this resource
- """
- downloadCode: Boolean!
-
- """
- Indicates the user can perform `download_wiki_code` on this resource
- """
- downloadWikiCode: Boolean!
-
- """
- Indicates the user can perform `fork_project` on this resource
- """
- forkProject: Boolean!
-
- """
- Indicates the user can perform `push_code` on this resource
- """
- pushCode: Boolean!
-
- """
- Indicates the user can perform `push_to_delete_protected_branch` on this resource
- """
- pushToDeleteProtectedBranch: Boolean!
-
- """
- Indicates the user can perform `read_commit_status` on this resource
- """
- readCommitStatus: Boolean!
-
- """
- Indicates the user can perform `read_cycle_analytics` on this resource
- """
- readCycleAnalytics: Boolean!
-
- """
- Indicates the user can perform `read_design` on this resource
- """
- readDesign: Boolean!
-
- """
- Indicates the user can perform `read_merge_request` on this resource
- """
- readMergeRequest: Boolean!
-
- """
- Indicates the user can perform `read_pages_content` on this resource
- """
- readPagesContent: Boolean!
-
- """
- Indicates the user can perform `read_project` on this resource
- """
- readProject: Boolean!
-
- """
- Indicates the user can perform `read_project_member` on this resource
- """
- readProjectMember: Boolean!
-
- """
- Indicates the user can perform `read_wiki` on this resource
- """
- readWiki: Boolean!
-
- """
- Indicates the user can perform `remove_fork_project` on this resource
- """
- removeForkProject: Boolean!
-
- """
- Indicates the user can perform `remove_pages` on this resource
- """
- removePages: Boolean!
-
- """
- Indicates the user can perform `remove_project` on this resource
- """
- removeProject: Boolean!
-
- """
- Indicates the user can perform `rename_project` on this resource
- """
- renameProject: Boolean!
-
- """
- Indicates the user can perform `request_access` on this resource
- """
- requestAccess: Boolean!
-
- """
- Indicates the user can perform `update_pages` on this resource
- """
- updatePages: Boolean!
-
- """
- Indicates the user can perform `update_wiki` on this resource
- """
- updateWiki: Boolean!
-
- """
- Indicates the user can perform `upload_file` on this resource
- """
- uploadFile: Boolean!
-}
-
-type ProjectStatistics {
- """
- Build artifacts size of the project in bytes.
- """
- buildArtifactsSize: Float!
-
- """
- Commit count of the project.
- """
- commitCount: Float!
-
- """
- Large File Storage (LFS) object size of the project in bytes.
- """
- lfsObjectsSize: Float!
-
- """
- Packages size of the project in bytes.
- """
- packagesSize: Float!
-
- """
- Repository size of the project in bytes.
- """
- repositorySize: Float!
-
- """
- Snippets size of the project in bytes.
- """
- snippetsSize: Float
-
- """
- Storage size of the project in bytes.
- """
- storageSize: Float!
-
- """
- Uploads size of the project in bytes.
- """
- uploadsSize: Float
-
- """
- Wiki size of the project in bytes.
- """
- wikiSize: Float
-}
-
-"""
-The alert condition for Prometheus
-"""
-type PrometheusAlert {
- """
- The human-readable text of the alert condition.
- """
- humanizedText: String!
-
- """
- ID of the alert condition.
- """
- id: ID!
-}
-
-"""
-Autogenerated input type of PrometheusIntegrationCreate
-"""
-input PrometheusIntegrationCreateInput {
- """
- Whether the integration is receiving alerts.
- """
- active: Boolean!
-
- """
- Endpoint at which prometheus can be queried.
- """
- apiUrl: String!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The project to create the integration in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of PrometheusIntegrationCreate
-"""
-type PrometheusIntegrationCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The newly created integration.
- """
- integration: AlertManagementPrometheusIntegration
-}
-
-"""
-Autogenerated input type of PrometheusIntegrationResetToken
-"""
-input PrometheusIntegrationResetTokenInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The ID of the integration to mutate.
- """
- id: PrometheusServiceID!
-}
-
-"""
-Autogenerated return type of PrometheusIntegrationResetToken
-"""
-type PrometheusIntegrationResetTokenPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The newly created integration.
- """
- integration: AlertManagementPrometheusIntegration
-}
-
-"""
-Autogenerated input type of PrometheusIntegrationUpdate
-"""
-input PrometheusIntegrationUpdateInput {
- """
- Whether the integration is receiving alerts.
- """
- active: Boolean
-
- """
- Endpoint at which prometheus can be queried.
- """
- apiUrl: String
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The ID of the integration to mutate.
- """
- id: PrometheusServiceID!
-}
-
-"""
-Autogenerated return type of PrometheusIntegrationUpdate
-"""
-type PrometheusIntegrationUpdatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The newly created integration.
- """
- integration: AlertManagementPrometheusIntegration
-}
-
-"""
-Identifier of PrometheusService.
-"""
-scalar PrometheusServiceID
-
-"""
-Autogenerated input type of PromoteToEpic
-"""
-input PromoteToEpicInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The group the promoted epic will belong to.
- """
- groupPath: ID
-
- """
- The IID of the issue to mutate.
- """
- iid: String!
-
- """
- The project the issue to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of PromoteToEpic
-"""
-type PromoteToEpicPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The epic after issue promotion.
- """
- epic: Epic
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-type Query {
- """
- CI related settings that apply to the entire instance.
- """
- ciApplicationSettings: CiApplicationSettings
-
- """
- Get linted and processed contents of a CI config. Should not be requested more than once per request.
- """
- ciConfig(
- """
- Contents of '.gitlab-ci.yml'.
- """
- content: String!
-
- """
- Run pipeline creation simulation, or only do static check.
- """
- dryRun: Boolean
-
- """
- The project of the CI config.
- """
- projectPath: ID!
- ): CiConfig
-
- """
- Find a container repository.
- """
- containerRepository(
- """
- The global ID of the container repository.
- """
- id: ContainerRepositoryID!
- ): ContainerRepositoryDetails
-
- """
- Get information about current user.
- """
- currentUser: User
-
- """
- Fields related to design management.
- """
- designManagement: DesignManagement!
-
- """
- Get configured DevOps adoption segments on the instance.
- """
- devopsAdoptionSegments(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DevopsAdoptionSegmentConnection
-
- """
- Text to echo back.
- """
- echo(
- """
- Text to echo back.
- """
- text: String!
- ): String!
-
- """
- Find a Geo node.
- """
- geoNode(
- """
- The name of the Geo node. Defaults to the current Geo node name.
- """
- name: String
- ): GeoNode
-
- """
- Find a group.
- """
- group(
- """
- The full path of the project, group or namespace, e.g., "gitlab-org/gitlab-foss".
- """
- fullPath: ID!
- ): Group
-
- """
- Fields related to Instance Security Dashboard.
- """
- instanceSecurityDashboard: InstanceSecurityDashboard
-
- """
- Get statistics on the instance.
- """
- instanceStatisticsMeasurements(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- The type of measurement/statistics to retrieve.
- """
- identifier: MeasurementIdentifier!
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Measurement recorded after this date.
- """
- recordedAfter: Time
-
- """
- Measurement recorded before this date.
- """
- recordedBefore: Time
- ): InstanceStatisticsMeasurementConnection
-
- """
- Find an issue.
- """
- issue(
- """
- The global ID of the Issue.
- """
- id: IssueID!
- ): Issue
-
- """
- Find an iteration.
- """
- iteration(
- """
- Find an iteration by its ID.
- """
- id: IterationID!
- ): Iteration
-
- """
- Metadata about GitLab.
- """
- metadata: Metadata
-
- """
- Find a milestone.
- """
- milestone(
- """
- Find a milestone by its ID.
- """
- id: MilestoneID!
- ): Milestone
-
- """
- Find a namespace.
- """
- namespace(
- """
- The full path of the project, group or namespace, e.g., "gitlab-org/gitlab-foss".
- """
- fullPath: ID!
- ): Namespace
-
- """
- Find a package.
- """
- package(
- """
- The global ID of the package.
- """
- id: PackagesPackageID!
- ): Package
-
- """
- Find a project.
- """
- project(
- """
- The full path of the project, group or namespace, e.g., "gitlab-org/gitlab-foss".
- """
- fullPath: ID!
- ): Project
-
- """
- Find projects visible to the current user.
- """
- projects(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Filter projects by IDs.
- """
- ids: [ID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Limit projects that the current user is a member of.
- """
- membership: Boolean
-
- """
- Search query for project name, path, or description.
- """
- search: String
-
- """
- Include namespace in project search.
- """
- searchNamespaces: Boolean
-
- """
- Sort order of results.
- """
- sort: String
- ): ProjectConnection
-
- """
- Supported runner platforms.
- """
- runnerPlatforms(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): RunnerPlatformConnection
-
- """
- Get runner setup instructions.
- """
- runnerSetup(
- """
- Architecture to generate the instructions for.
- """
- architecture: String!
-
- """
- Group to register the runner for.
- """
- groupId: GroupID
-
- """
- Platform to generate the instructions for.
- """
- platform: String!
-
- """
- Project to register the runner for.
- """
- projectId: ProjectID
- ): RunnerSetup
-
- """
- Find Snippets visible to the current user.
- """
- snippets(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- The ID of an author.
- """
- authorId: UserID
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Explore personal snippets.
- """
- explore: Boolean
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Array of global snippet ids, e.g., "gid://gitlab/ProjectSnippet/1".
- """
- ids: [SnippetID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- The ID of a project.
- """
- projectId: ProjectID
-
- """
- The type of snippet.
- """
- type: TypeEnum
-
- """
- The visibility of the snippet.
- """
- visibility: VisibilityScopesEnum
- ): SnippetConnection
-
- """
- Find a user.
- """
- user(
- """
- ID of the User.
- """
- id: UserID
-
- """
- Username of the User.
- """
- username: String
- ): User
-
- """
- Find users.
- """
- users(
- """
- Return only admin users.
- """
- admins: Boolean = false
-
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- List of user Global IDs.
- """
- ids: [ID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Query to search users by name, username, or primary email.
- """
- search: String
-
- """
- Sort users by this criteria.
- """
- sort: Sort = created_desc
-
- """
- List of usernames.
- """
- usernames: [String!]
- ): UserConnection
-
- """
- Vulnerabilities reported on projects on the current user's instance security dashboard.
- """
- vulnerabilities(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns only the vulnerabilities which have linked issues.
- """
- hasIssues: Boolean
-
- """
- Returns only the vulnerabilities which have been resolved on default branch.
- """
- hasResolution: Boolean
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter vulnerabilities by project.
- """
- projectId: [ID!]
-
- """
- Filter vulnerabilities by report type.
- """
- reportType: [VulnerabilityReportType!]
-
- """
- Filter vulnerabilities by VulnerabilityScanner.externalId.
- """
- scanner: [String!]
-
- """
- Filter vulnerabilities by severity.
- """
- severity: [VulnerabilitySeverity!]
-
- """
- List vulnerabilities by sort order.
- """
- sort: VulnerabilitySort = severity_desc
-
- """
- Filter vulnerabilities by state.
- """
- state: [VulnerabilityState!]
- ): VulnerabilityConnection
-
- """
- Number of vulnerabilities per day for the projects on the current user's instance security dashboard.
- """
- vulnerabilitiesCountByDay(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Last day for which to fetch vulnerability history.
- """
- endDate: ISO8601Date!
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- First day for which to fetch vulnerability history.
- """
- startDate: ISO8601Date!
- ): VulnerabilitiesCountByDayConnection
-
- """
- Number of vulnerabilities per severity level, per day, for the projects on the
- current user's instance security dashboard. Deprecated in 13.3: Use
- `vulnerabilitiesCountByDay`.
- """
- vulnerabilitiesCountByDayAndSeverity(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Last day for which to fetch vulnerability history.
- """
- endDate: ISO8601Date!
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- First day for which to fetch vulnerability history.
- """
- startDate: ISO8601Date!
- ): VulnerabilitiesCountByDayAndSeverityConnection @deprecated(reason: "Use `vulnerabilitiesCountByDay`. Deprecated in 13.3.")
-
- """
- Find a vulnerability.
- """
- vulnerability(
- """
- The Global ID of the Vulnerability.
- """
- id: VulnerabilityID!
- ): Vulnerability
-}
-
-"""
-State of a Geo registry
-"""
-enum RegistryState {
- """
- Registry that failed to sync
- """
- FAILED
-
- """
- Registry waiting to be synced
- """
- PENDING
-
- """
- Registry currently syncing
- """
- STARTED
-
- """
- Registry that is synced
- """
- SYNCED
-}
-
-"""
-Represents a release
-"""
-type Release {
- """
- Assets of the release.
- """
- assets: ReleaseAssets
-
- """
- User that created the release.
- """
- author: User
-
- """
- The commit associated with the release.
- """
- commit: Commit
-
- """
- Timestamp of when the release was created.
- """
- createdAt: Time
-
- """
- Description (also known as "release notes") of the release.
- """
- description: String
-
- """
- The GitLab Flavored Markdown rendering of `description`
- """
- descriptionHtml: String
-
- """
- Evidence for the release.
- """
- evidences(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): ReleaseEvidenceConnection
-
- """
- Links of the release.
- """
- links: ReleaseLinks
-
- """
- Milestones associated to the release.
- """
- milestones(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): MilestoneConnection
-
- """
- Name of the release.
- """
- name: String
-
- """
- Timestamp of when the release was released.
- """
- releasedAt: Time
-
- """
- Name of the tag associated with the release.
- """
- tagName: String
-
- """
- Relative web path to the tag associated with the release.
- """
- tagPath: String
-
- """
- Indicates the release is an upcoming release.
- """
- upcomingRelease: Boolean
-}
-
-"""
-Represents an asset link associated with a release
-"""
-type ReleaseAssetLink {
- """
- Direct asset URL of the link.
- """
- directAssetUrl: String
-
- """
- Indicates the link points to an external resource.
- """
- external: Boolean
-
- """
- ID of the link.
- """
- id: ID!
-
- """
- Type of the link: `other`, `runbook`, `image`, `package`; defaults to `other`.
- """
- linkType: ReleaseAssetLinkType
-
- """
- Name of the link.
- """
- name: String
-
- """
- URL of the link.
- """
- url: String
-}
-
-"""
-The connection type for ReleaseAssetLink.
-"""
-type ReleaseAssetLinkConnection {
- """
- A list of edges.
- """
- edges: [ReleaseAssetLinkEdge]
-
- """
- A list of nodes.
- """
- nodes: [ReleaseAssetLink]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type ReleaseAssetLinkEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: ReleaseAssetLink
-}
-
-"""
-Fields that are available when modifying a release asset link
-"""
-input ReleaseAssetLinkInput {
- """
- Relative path for a direct asset link.
- """
- directAssetPath: String
-
- """
- The type of the asset link.
- """
- linkType: ReleaseAssetLinkType = OTHER
-
- """
- Name of the asset link.
- """
- name: String!
-
- """
- URL of the asset link.
- """
- url: String!
-}
-
-"""
-Type of the link: `other`, `runbook`, `image`, `package`
-"""
-enum ReleaseAssetLinkType {
- """
- Image link type
- """
- IMAGE
-
- """
- Other link type
- """
- OTHER
-
- """
- Package link type
- """
- PACKAGE
-
- """
- Runbook link type
- """
- RUNBOOK
-}
-
-"""
-A container for all assets associated with a release
-"""
-type ReleaseAssets {
- """
- Number of assets of the release.
- """
- count: Int
-
- """
- Asset links of the release.
- """
- links(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): ReleaseAssetLinkConnection
-
- """
- Sources of the release.
- """
- sources(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): ReleaseSourceConnection
-}
-
-"""
-Fields that are available when modifying release assets
-"""
-input ReleaseAssetsInput {
- """
- A list of asset links to associate to the release.
- """
- links: [ReleaseAssetLinkInput!]
-}
-
-"""
-The connection type for Release.
-"""
-type ReleaseConnection {
- """
- Total count of collection.
- """
- count: Int!
-
- """
- A list of edges.
- """
- edges: [ReleaseEdge]
-
- """
- A list of nodes.
- """
- nodes: [Release]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of ReleaseCreate
-"""
-input ReleaseCreateInput {
- """
- Assets associated to the release.
- """
- assets: ReleaseAssetsInput
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Description (also known as "release notes") of the release.
- """
- description: String
-
- """
- The title of each milestone the release is associated with. GitLab Premium customers can specify group milestones.
- """
- milestones: [String!]
-
- """
- Name of the release.
- """
- name: String
-
- """
- Full path of the project the release is associated with.
- """
- projectPath: ID!
-
- """
- The commit SHA or branch name to use if creating a new tag.
- """
- ref: String
-
- """
- The date when the release will be/was ready. Defaults to the current time.
- """
- releasedAt: Time
-
- """
- Name of the tag to associate with the release.
- """
- tagName: String!
-}
-
-"""
-Autogenerated return type of ReleaseCreate
-"""
-type ReleaseCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The release after mutation.
- """
- release: Release
-}
-
-"""
-Autogenerated input type of ReleaseDelete
-"""
-input ReleaseDeleteInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Full path of the project the release is associated with.
- """
- projectPath: ID!
-
- """
- Name of the tag associated with the release to delete.
- """
- tagName: String!
-}
-
-"""
-Autogenerated return type of ReleaseDelete
-"""
-type ReleaseDeletePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The deleted release.
- """
- release: Release
-}
-
-"""
-An edge in a connection.
-"""
-type ReleaseEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Release
-}
-
-"""
-Evidence for a release
-"""
-type ReleaseEvidence {
- """
- Timestamp when the evidence was collected.
- """
- collectedAt: Time
-
- """
- URL from where the evidence can be downloaded.
- """
- filepath: String
-
- """
- ID of the evidence.
- """
- id: ID!
-
- """
- SHA1 ID of the evidence hash.
- """
- sha: String
-}
-
-"""
-The connection type for ReleaseEvidence.
-"""
-type ReleaseEvidenceConnection {
- """
- A list of edges.
- """
- edges: [ReleaseEvidenceEdge]
-
- """
- A list of nodes.
- """
- nodes: [ReleaseEvidence]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type ReleaseEvidenceEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: ReleaseEvidence
-}
-
-type ReleaseLinks {
- """
- HTTP URL of the issues page, filtered by this release and `state=closed`.
- """
- closedIssuesUrl: String
-
- """
- HTTP URL of the merge request page , filtered by this release and `state=closed`.
- """
- closedMergeRequestsUrl: String
-
- """
- HTTP URL of the release's edit page.
- """
- editUrl: String
-
- """
- HTTP URL of the merge request page , filtered by this release and `state=merged`.
- """
- mergedMergeRequestsUrl: String
-
- """
- HTTP URL of the issues page, filtered by this release and `state=open`.
- """
- openedIssuesUrl: String
-
- """
- HTTP URL of the merge request page, filtered by this release and `state=open`.
- """
- openedMergeRequestsUrl: String
-
- """
- HTTP URL of the release.
- """
- selfUrl: String
-}
-
-"""
-Values for sorting releases
-"""
-enum ReleaseSort {
- """
- Created at ascending order
- """
- CREATED_ASC
-
- """
- Created at descending order
- """
- CREATED_DESC
-
- """
- Released at by ascending order
- """
- RELEASED_AT_ASC
-
- """
- Released at by descending order
- """
- RELEASED_AT_DESC
-}
-
-"""
-Represents the source code attached to a release in a particular format
-"""
-type ReleaseSource {
- """
- Format of the source.
- """
- format: String
-
- """
- Download URL of the source.
- """
- url: String
-}
-
-"""
-The connection type for ReleaseSource.
-"""
-type ReleaseSourceConnection {
- """
- A list of edges.
- """
- edges: [ReleaseSourceEdge]
-
- """
- A list of nodes.
- """
- nodes: [ReleaseSource]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type ReleaseSourceEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: ReleaseSource
-}
-
-"""
-Autogenerated input type of ReleaseUpdate
-"""
-input ReleaseUpdateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Description (release notes) of the release.
- """
- description: String
-
- """
- The title of each milestone the release is associated with. GitLab Premium customers can specify group milestones.
- """
- milestones: [String!]
-
- """
- Name of the release.
- """
- name: String
-
- """
- Full path of the project the release is associated with.
- """
- projectPath: ID!
-
- """
- The release date.
- """
- releasedAt: Time
-
- """
- Name of the tag associated with the release.
- """
- tagName: String!
-}
-
-"""
-Autogenerated return type of ReleaseUpdate
-"""
-type ReleaseUpdatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The release after mutation.
- """
- release: Release
-}
-
-"""
-Autogenerated input type of RemoveAwardEmoji
-"""
-input RemoveAwardEmojiInput {
- """
- The global ID of the awardable resource.
- """
- awardableId: AwardableID!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The emoji name.
- """
- name: String!
-}
-
-"""
-Autogenerated return type of RemoveAwardEmoji
-"""
-type RemoveAwardEmojiPayload {
- """
- The award emoji after mutation.
- """
- awardEmoji: AwardEmoji
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of RemoveProjectFromSecurityDashboard
-"""
-input RemoveProjectFromSecurityDashboardInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the project to remove from the Instance Security Dashboard.
- """
- id: ProjectID!
-}
-
-"""
-Autogenerated return type of RemoveProjectFromSecurityDashboard
-"""
-type RemoveProjectFromSecurityDashboardPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of RepositionImageDiffNote
-"""
-input RepositionImageDiffNoteInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the DiffNote to update.
- """
- id: DiffNoteID!
-
- """
- The position of this note on a diff.
- """
- position: UpdateDiffImagePositionInput!
-}
-
-"""
-Autogenerated return type of RepositionImageDiffNote
-"""
-type RepositionImageDiffNotePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The note after mutation.
- """
- note: Note
-}
-
-type Repository {
- """
- Indicates repository has no visible content.
- """
- empty: Boolean!
-
- """
- Indicates a corresponding Git repository exists on disk.
- """
- exists: Boolean!
-
- """
- Default branch of the repository.
- """
- rootRef: String
-
- """
- Tree of the repository.
- """
- tree(
- """
- The path to get the tree for. Default value is the root of the repository.
- """
- path: String = ""
-
- """
- Used to get a recursive tree. Default is false.
- """
- recursive: Boolean = false
-
- """
- The commit ref to get the tree for. Default value is HEAD.
- """
- ref: String = "head"
- ): Tree
-}
-
-"""
-Represents a requirement
-"""
-type Requirement {
- """
- Author of the requirement.
- """
- author: User!
-
- """
- Timestamp of when the requirement was created.
- """
- createdAt: Time!
-
- """
- Description of the requirement.
- """
- description: String
-
- """
- The GitLab Flavored Markdown rendering of `description`
- """
- descriptionHtml: String
-
- """
- ID of the requirement.
- """
- id: ID!
-
- """
- Internal ID of the requirement.
- """
- iid: ID!
-
- """
- Indicates if latest test report was created by user.
- """
- lastTestReportManuallyCreated: Boolean
-
- """
- Latest requirement test report state.
- """
- lastTestReportState: TestReportState
-
- """
- Project to which the requirement belongs.
- """
- project: Project!
-
- """
- State of the requirement.
- """
- state: RequirementState!
-
- """
- Test reports of the requirement.
- """
- testReports(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- List test reports by sort order.
- """
- sort: Sort
- ): TestReportConnection
-
- """
- Title of the requirement.
- """
- title: String
-
- """
- The GitLab Flavored Markdown rendering of `title`
- """
- titleHtml: String
-
- """
- Timestamp of when the requirement was last updated.
- """
- updatedAt: Time!
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: RequirementPermissions!
-}
-
-"""
-The connection type for Requirement.
-"""
-type RequirementConnection {
- """
- A list of edges.
- """
- edges: [RequirementEdge]
-
- """
- A list of nodes.
- """
- nodes: [Requirement]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type RequirementEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Requirement
-}
-
-"""
-Check permissions for the current user on a requirement
-"""
-type RequirementPermissions {
- """
- Indicates the user can perform `admin_requirement` on this resource
- """
- adminRequirement: Boolean!
-
- """
- Indicates the user can perform `create_requirement` on this resource
- """
- createRequirement: Boolean!
-
- """
- Indicates the user can perform `destroy_requirement` on this resource
- """
- destroyRequirement: Boolean!
-
- """
- Indicates the user can perform `read_requirement` on this resource
- """
- readRequirement: Boolean!
-
- """
- Indicates the user can perform `update_requirement` on this resource
- """
- updateRequirement: Boolean!
-}
-
-"""
-State of a requirement
-"""
-enum RequirementState {
- ARCHIVED
- OPENED
-}
-
-"""
-Counts of requirements by their state
-"""
-type RequirementStatesCount {
- """
- Number of archived requirements.
- """
- archived: Int
-
- """
- Number of opened requirements.
- """
- opened: Int
-}
-
-interface ResolvableInterface {
- """
- Indicates if the object can be resolved.
- """
- resolvable: Boolean!
-
- """
- Indicates if the object is resolved.
- """
- resolved: Boolean!
-
- """
- Timestamp of when the object was resolved.
- """
- resolvedAt: Time
-
- """
- User who resolved the object.
- """
- resolvedBy: User
-}
-
-"""
-Autogenerated input type of RevertVulnerabilityToDetected
-"""
-input RevertVulnerabilityToDetectedInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the vulnerability to be reverted.
- """
- id: VulnerabilityID!
-}
-
-"""
-Autogenerated return type of RevertVulnerabilityToDetected
-"""
-type RevertVulnerabilityToDetectedPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The vulnerability after revert.
- """
- vulnerability: Vulnerability
-}
-
-type RootStorageStatistics {
- """
- The CI artifacts size in bytes.
- """
- buildArtifactsSize: Float!
-
- """
- The LFS objects size in bytes.
- """
- lfsObjectsSize: Float!
-
- """
- The packages size in bytes.
- """
- packagesSize: Float!
-
- """
- The CI pipeline artifacts size in bytes.
- """
- pipelineArtifactsSize: Float!
-
- """
- The Git repository size in bytes.
- """
- repositorySize: Float!
-
- """
- The snippets size in bytes.
- """
- snippetsSize: Float!
-
- """
- The total storage in bytes.
- """
- storageSize: Float!
-
- """
- The uploads size in bytes.
- """
- uploadsSize: Float!
-
- """
- The wiki size in bytes.
- """
- wikiSize: Float!
-}
-
-"""
-Autogenerated input type of RunDASTScan
-"""
-input RunDASTScanInput {
- """
- The branch to be associated with the scan.
- """
- branch: String!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The project the DAST scan belongs to.
- """
- projectPath: ID!
-
- """
- The type of scan to be run.
- """
- scanType: DastScanTypeEnum!
-
- """
- The URL of the target to be scanned.
- """
- targetUrl: String!
-}
-
-"""
-Autogenerated return type of RunDASTScan
-"""
-type RunDASTScanPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- URL of the pipeline that was created.
- """
- pipelineUrl: String
-}
-
-type RunnerArchitecture {
- """
- Download location for the runner for the platform architecture.
- """
- downloadLocation: String!
-
- """
- Name of the runner platform architecture.
- """
- name: String!
-}
-
-"""
-The connection type for RunnerArchitecture.
-"""
-type RunnerArchitectureConnection {
- """
- A list of edges.
- """
- edges: [RunnerArchitectureEdge]
-
- """
- A list of nodes.
- """
- nodes: [RunnerArchitecture]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type RunnerArchitectureEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: RunnerArchitecture
-}
-
-type RunnerPlatform {
- """
- Runner architectures supported for the platform.
- """
- architectures(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): RunnerArchitectureConnection
-
- """
- Human readable name of the runner platform.
- """
- humanReadableName: String!
-
- """
- Name slug of the runner platform.
- """
- name: String!
-}
-
-"""
-The connection type for RunnerPlatform.
-"""
-type RunnerPlatformConnection {
- """
- A list of edges.
- """
- edges: [RunnerPlatformEdge]
-
- """
- A list of nodes.
- """
- nodes: [RunnerPlatform]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type RunnerPlatformEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: RunnerPlatform
-}
-
-type RunnerSetup {
- """
- Instructions for installing the runner on the specified architecture.
- """
- installInstructions: String!
-
- """
- Instructions for registering the runner.
- """
- registerInstructions: String
-}
-
-"""
-Represents a CI configuration of SAST
-"""
-type SastCiConfiguration {
- """
- List of analyzers entities attached to SAST configuration.
- """
- analyzers(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): SastCiConfigurationAnalyzersEntityConnection
-
- """
- List of global entities related to SAST configuration.
- """
- global(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): SastCiConfigurationEntityConnection
-
- """
- List of pipeline entities related to SAST configuration.
- """
- pipeline(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): SastCiConfigurationEntityConnection
-}
-
-"""
-Represents an analyzer entity in SAST CI configuration
-"""
-type SastCiConfigurationAnalyzersEntity {
- """
- Analyzer description that is displayed on the form.
- """
- description: String
-
- """
- Indicates whether an analyzer is enabled.
- """
- enabled: Boolean
-
- """
- Analyzer label used in the config UI.
- """
- label: String
-
- """
- Name of the analyzer.
- """
- name: String
-
- """
- List of supported variables.
- """
- variables(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): SastCiConfigurationEntityConnection
-}
-
-"""
-The connection type for SastCiConfigurationAnalyzersEntity.
-"""
-type SastCiConfigurationAnalyzersEntityConnection {
- """
- A list of edges.
- """
- edges: [SastCiConfigurationAnalyzersEntityEdge]
-
- """
- A list of nodes.
- """
- nodes: [SastCiConfigurationAnalyzersEntity]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type SastCiConfigurationAnalyzersEntityEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: SastCiConfigurationAnalyzersEntity
-}
-
-"""
-Represents the analyzers entity in SAST CI configuration
-"""
-input SastCiConfigurationAnalyzersEntityInput {
- """
- State of the analyzer.
- """
- enabled: Boolean!
-
- """
- Name of analyzer.
- """
- name: String!
-
- """
- List of variables for the analyzer.
- """
- variables: [SastCiConfigurationEntityInput!]
-}
-
-"""
-Represents an entity in SAST CI configuration
-"""
-type SastCiConfigurationEntity {
- """
- Default value that is used if value is empty.
- """
- defaultValue: String
-
- """
- Entity description that is displayed on the form.
- """
- description: String
-
- """
- CI keyword of entity.
- """
- field: String
-
- """
- Label for entity used in the form.
- """
- label: String
-
- """
- Different possible values of the field.
- """
- options(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): SastCiConfigurationOptionsEntityConnection
-
- """
- Size of the UI component.
- """
- size: SastUiComponentSize
-
- """
- Type of the field value.
- """
- type: String
-
- """
- Current value of the entity.
- """
- value: String
-}
-
-"""
-The connection type for SastCiConfigurationEntity.
-"""
-type SastCiConfigurationEntityConnection {
- """
- A list of edges.
- """
- edges: [SastCiConfigurationEntityEdge]
-
- """
- A list of nodes.
- """
- nodes: [SastCiConfigurationEntity]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type SastCiConfigurationEntityEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: SastCiConfigurationEntity
-}
-
-"""
-Represents an entity in SAST CI configuration
-"""
-input SastCiConfigurationEntityInput {
- """
- Default value that is used if value is empty.
- """
- defaultValue: String!
-
- """
- CI keyword of entity.
- """
- field: String!
-
- """
- Current value of the entity.
- """
- value: String!
-}
-
-"""
-Represents a CI configuration of SAST
-"""
-input SastCiConfigurationInput {
- """
- List of analyzers and related variables for the SAST configuration.
- """
- analyzers: [SastCiConfigurationAnalyzersEntityInput!]
-
- """
- List of global entities related to SAST configuration.
- """
- global: [SastCiConfigurationEntityInput!]
-
- """
- List of pipeline entities related to SAST configuration.
- """
- pipeline: [SastCiConfigurationEntityInput!]
-}
-
-"""
-Represents an entity for options in SAST CI configuration
-"""
-type SastCiConfigurationOptionsEntity {
- """
- Label of option entity.
- """
- label: String
-
- """
- Value of option entity.
- """
- value: String
-}
-
-"""
-The connection type for SastCiConfigurationOptionsEntity.
-"""
-type SastCiConfigurationOptionsEntityConnection {
- """
- A list of edges.
- """
- edges: [SastCiConfigurationOptionsEntityEdge]
-
- """
- A list of nodes.
- """
- nodes: [SastCiConfigurationOptionsEntity]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type SastCiConfigurationOptionsEntityEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: SastCiConfigurationOptionsEntity
-}
-
-"""
-Size of UI component in SAST configuration page
-"""
-enum SastUiComponentSize {
- LARGE
- MEDIUM
- SMALL
-}
-
-"""
-Represents a resource scanned by a security scan
-"""
-type ScannedResource {
- """
- The HTTP request method used to access the URL.
- """
- requestMethod: String
-
- """
- The URL scanned by the scanner.
- """
- url: String
-}
-
-"""
-The connection type for ScannedResource.
-"""
-type ScannedResourceConnection {
- """
- A list of edges.
- """
- edges: [ScannedResourceEdge]
-
- """
- A list of nodes.
- """
- nodes: [ScannedResource]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type ScannedResourceEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: ScannedResource
-}
-
-"""
-Represents summary of a security report
-"""
-type SecurityReportSummary {
- """
- Aggregated counts for the `api_fuzzing` scan
- """
- apiFuzzing: SecurityReportSummarySection
-
- """
- Aggregated counts for the `container_scanning` scan
- """
- containerScanning: SecurityReportSummarySection
-
- """
- Aggregated counts for the `coverage_fuzzing` scan
- """
- coverageFuzzing: SecurityReportSummarySection
-
- """
- Aggregated counts for the `dast` scan
- """
- dast: SecurityReportSummarySection
-
- """
- Aggregated counts for the `dependency_scanning` scan
- """
- dependencyScanning: SecurityReportSummarySection
-
- """
- Aggregated counts for the `sast` scan
- """
- sast: SecurityReportSummarySection
-
- """
- Aggregated counts for the `secret_detection` scan
- """
- secretDetection: SecurityReportSummarySection
-}
-
-"""
-Represents a section of a summary of a security report
-"""
-type SecurityReportSummarySection {
- """
- A list of the first 20 scanned resources.
- """
- scannedResources(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): ScannedResourceConnection
-
- """
- Total number of scanned resources.
- """
- scannedResourcesCount: Int
-
- """
- Path to download all the scanned resources in CSV format.
- """
- scannedResourcesCsvPath: String
-
- """
- Total number of vulnerabilities.
- """
- vulnerabilitiesCount: Int
-}
-
-enum SecurityReportTypeEnum {
- """
- API FUZZING scan report
- """
- API_FUZZING
-
- """
- CONTAINER SCANNING scan report
- """
- CONTAINER_SCANNING
-
- """
- COVERAGE FUZZING scan report
- """
- COVERAGE_FUZZING
-
- """
- DAST scan report
- """
- DAST
-
- """
- DEPENDENCY SCANNING scan report
- """
- DEPENDENCY_SCANNING
-
- """
- SAST scan report
- """
- SAST
-
- """
- SECRET DETECTION scan report
- """
- SECRET_DETECTION
-}
-
-"""
-The type of the security scanner
-"""
-enum SecurityScannerType {
- API_FUZZING
- CONTAINER_SCANNING
- COVERAGE_FUZZING
- DAST
- DEPENDENCY_SCANNING
- SAST
- SECRET_DETECTION
-}
-
-"""
-Represents a list of security scanners
-"""
-type SecurityScanners {
- """
- List of analyzers which are available for the project.
- """
- available: [SecurityScannerType!]
-
- """
- List of analyzers which are enabled for the project.
- """
- enabled: [SecurityScannerType!]
-
- """
- List of analyzers which ran successfully in the latest pipeline.
- """
- pipelineRun: [SecurityScannerType!]
-}
-
-"""
-A Sentry error
-"""
-type SentryDetailedError {
- """
- Count of occurrences.
- """
- count: Int!
-
- """
- Culprit of the error.
- """
- culprit: String!
-
- """
- External Base URL of the Sentry Instance.
- """
- externalBaseUrl: String!
-
- """
- External URL of the error.
- """
- externalUrl: String!
-
- """
- Commit the error was first seen.
- """
- firstReleaseLastCommit: String
-
- """
- Release short version the error was first seen.
- """
- firstReleaseShortVersion: String
-
- """
- Release version the error was first seen.
- """
- firstReleaseVersion: String
-
- """
- Timestamp when the error was first seen.
- """
- firstSeen: Time!
-
- """
- Last 24hr stats of the error.
- """
- frequency: [SentryErrorFrequency!]!
-
- """
- GitLab commit SHA attributed to the Error based on the release version.
- """
- gitlabCommit: String
-
- """
- Path to the GitLab page for the GitLab commit attributed to the error.
- """
- gitlabCommitPath: String
-
- """
- URL of GitLab Issue.
- """
- gitlabIssuePath: String
-
- """
- ID (global ID) of the error.
- """
- id: ID!
-
- """
- Commit the error was last seen.
- """
- lastReleaseLastCommit: String
-
- """
- Release short version the error was last seen.
- """
- lastReleaseShortVersion: String
-
- """
- Release version the error was last seen.
- """
- lastReleaseVersion: String
-
- """
- Timestamp when the error was last seen.
- """
- lastSeen: Time!
-
- """
- Sentry metadata message of the error.
- """
- message: String
-
- """
- ID (Sentry ID) of the error.
- """
- sentryId: String!
-
- """
- ID of the project (Sentry project).
- """
- sentryProjectId: ID!
-
- """
- Name of the project affected by the error.
- """
- sentryProjectName: String!
-
- """
- Slug of the project affected by the error.
- """
- sentryProjectSlug: String!
-
- """
- Short ID (Sentry ID) of the error.
- """
- shortId: String!
-
- """
- Status of the error.
- """
- status: SentryErrorStatus!
-
- """
- Tags associated with the Sentry Error.
- """
- tags: SentryErrorTags!
-
- """
- Title of the error.
- """
- title: String!
-
- """
- Type of the error.
- """
- type: String!
-
- """
- Count of users affected by the error.
- """
- userCount: Int!
-}
-
-"""
-A Sentry error. A simplified version of SentryDetailedError
-"""
-type SentryError {
- """
- Count of occurrences.
- """
- count: Int!
-
- """
- Culprit of the error.
- """
- culprit: String!
-
- """
- External URL of the error.
- """
- externalUrl: String!
-
- """
- Timestamp when the error was first seen.
- """
- firstSeen: Time!
-
- """
- Last 24hr stats of the error.
- """
- frequency: [SentryErrorFrequency!]!
-
- """
- ID (global ID) of the error.
- """
- id: ID!
-
- """
- Timestamp when the error was last seen.
- """
- lastSeen: Time!
-
- """
- Sentry metadata message of the error.
- """
- message: String
-
- """
- ID (Sentry ID) of the error.
- """
- sentryId: String!
-
- """
- ID of the project (Sentry project).
- """
- sentryProjectId: ID!
-
- """
- Name of the project affected by the error.
- """
- sentryProjectName: String!
-
- """
- Slug of the project affected by the error.
- """
- sentryProjectSlug: String!
-
- """
- Short ID (Sentry ID) of the error.
- """
- shortId: String!
-
- """
- Status of the error.
- """
- status: SentryErrorStatus!
-
- """
- Title of the error.
- """
- title: String!
-
- """
- Type of the error.
- """
- type: String!
-
- """
- Count of users affected by the error.
- """
- userCount: Int!
-}
-
-"""
-An object containing a collection of Sentry errors, and a detailed error
-"""
-type SentryErrorCollection {
- """
- Detailed version of a Sentry error on the project.
- """
- detailedError(
- """
- ID of the Sentry issue.
- """
- id: GitlabErrorTrackingDetailedErrorID!
- ): SentryDetailedError
-
- """
- Stack Trace of Sentry Error.
- """
- errorStackTrace(
- """
- ID of the Sentry issue.
- """
- id: GitlabErrorTrackingDetailedErrorID!
- ): SentryErrorStackTrace
-
- """
- Collection of Sentry Errors.
- """
- errors(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Search query for the Sentry error details.
- """
- searchTerm: String
-
- """
- Attribute to sort on. Options are frequency, first_seen, last_seen. last_seen is default.
- """
- sort: String
- ): SentryErrorConnection
-
- """
- External URL for Sentry.
- """
- externalUrl: String
-}
-
-"""
-The connection type for SentryError.
-"""
-type SentryErrorConnection {
- """
- A list of edges.
- """
- edges: [SentryErrorEdge]
-
- """
- A list of nodes.
- """
- nodes: [SentryError]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type SentryErrorEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: SentryError
-}
-
-type SentryErrorFrequency {
- """
- Count of errors received since the previously recorded time.
- """
- count: Int!
-
- """
- Time the error frequency stats were recorded.
- """
- time: Time!
-}
-
-"""
-An object containing a stack trace entry for a Sentry error
-"""
-type SentryErrorStackTrace {
- """
- Time the stack trace was received by Sentry.
- """
- dateReceived: String!
-
- """
- ID of the Sentry error.
- """
- issueId: String!
-
- """
- Stack trace entries for the Sentry error.
- """
- stackTraceEntries: [SentryErrorStackTraceEntry!]!
-}
-
-"""
-An object context for a Sentry error stack trace
-"""
-type SentryErrorStackTraceContext {
- """
- Code number of the context.
- """
- code: String!
-
- """
- Line number of the context.
- """
- line: Int!
-}
-
-"""
-An object containing a stack trace entry for a Sentry error
-"""
-type SentryErrorStackTraceEntry {
- """
- Function in which the Sentry error occurred.
- """
- col: String
-
- """
- File in which the Sentry error occurred.
- """
- fileName: String
-
- """
- Function in which the Sentry error occurred.
- """
- function: String
-
- """
- Function in which the Sentry error occurred.
- """
- line: String
-
- """
- Context of the Sentry error.
- """
- traceContext: [SentryErrorStackTraceContext!]
-}
-
-"""
-State of a Sentry error
-"""
-enum SentryErrorStatus {
- """
- Error has been ignored
- """
- IGNORED
-
- """
- Error has been resolved
- """
- RESOLVED
-
- """
- Error has been ignored until next release
- """
- RESOLVED_IN_NEXT_RELEASE
-
- """
- Error is unresolved
- """
- UNRESOLVED
-}
-
-"""
-State of a Sentry error
-"""
-type SentryErrorTags {
- """
- Severity level of the Sentry Error.
- """
- level: String
-
- """
- Logger of the Sentry Error.
- """
- logger: String
-}
-
-interface Service {
- """
- Indicates if the service is active.
- """
- active: Boolean
-
- """
- Class name of the service.
- """
- type: String
-}
-
-"""
-The connection type for Service.
-"""
-type ServiceConnection {
- """
- A list of edges.
- """
- edges: [ServiceEdge]
-
- """
- A list of nodes.
- """
- nodes: [Service]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type ServiceEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Service
-}
-
-enum ServiceType {
- """
- AsanaService type
- """
- ASANA_SERVICE
-
- """
- AssemblaService type
- """
- ASSEMBLA_SERVICE
-
- """
- BambooService type
- """
- BAMBOO_SERVICE
-
- """
- BugzillaService type
- """
- BUGZILLA_SERVICE
-
- """
- BuildkiteService type
- """
- BUILDKITE_SERVICE
-
- """
- CampfireService type
- """
- CAMPFIRE_SERVICE
-
- """
- ConfluenceService type
- """
- CONFLUENCE_SERVICE
-
- """
- CustomIssueTrackerService type
- """
- CUSTOM_ISSUE_TRACKER_SERVICE
-
- """
- DatadogService type
- """
- DATADOG_SERVICE
-
- """
- DiscordService type
- """
- DISCORD_SERVICE
-
- """
- DroneCiService type
- """
- DRONE_CI_SERVICE
-
- """
- EmailsOnPushService type
- """
- EMAILS_ON_PUSH_SERVICE
-
- """
- EwmService type
- """
- EWM_SERVICE
-
- """
- ExternalWikiService type
- """
- EXTERNAL_WIKI_SERVICE
-
- """
- FlowdockService type
- """
- FLOWDOCK_SERVICE
-
- """
- GithubService type
- """
- GITHUB_SERVICE
-
- """
- HangoutsChatService type
- """
- HANGOUTS_CHAT_SERVICE
-
- """
- HipchatService type
- """
- HIPCHAT_SERVICE
-
- """
- IrkerService type
- """
- IRKER_SERVICE
-
- """
- JenkinsService type
- """
- JENKINS_SERVICE
-
- """
- JiraService type
- """
- JIRA_SERVICE
-
- """
- MattermostService type
- """
- MATTERMOST_SERVICE
-
- """
- MattermostSlashCommandsService type
- """
- MATTERMOST_SLASH_COMMANDS_SERVICE
-
- """
- MicrosoftTeamsService type
- """
- MICROSOFT_TEAMS_SERVICE
-
- """
- PackagistService type
- """
- PACKAGIST_SERVICE
-
- """
- PipelinesEmailService type
- """
- PIPELINES_EMAIL_SERVICE
-
- """
- PivotaltrackerService type
- """
- PIVOTALTRACKER_SERVICE
-
- """
- PrometheusService type
- """
- PROMETHEUS_SERVICE
-
- """
- PushoverService type
- """
- PUSHOVER_SERVICE
-
- """
- RedmineService type
- """
- REDMINE_SERVICE
-
- """
- SlackService type
- """
- SLACK_SERVICE
-
- """
- SlackSlashCommandsService type
- """
- SLACK_SLASH_COMMANDS_SERVICE
-
- """
- TeamcityService type
- """
- TEAMCITY_SERVICE
-
- """
- UnifyCircuitService type
- """
- UNIFY_CIRCUIT_SERVICE
-
- """
- WebexTeamsService type
- """
- WEBEX_TEAMS_SERVICE
-
- """
- YoutrackService type
- """
- YOUTRACK_SERVICE
-}
-
-"""
-Represents a snippet entry
-"""
-type Snippet implements Noteable {
- """
- The owner of the snippet.
- """
- author: User
-
- """
- Snippet blob. Deprecated in 13.3: Use `blobs`.
- """
- blob: SnippetBlob! @deprecated(reason: "Use `blobs`. Deprecated in 13.3.")
-
- """
- Snippet blobs.
- """
- blobs(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Paths of the blobs.
- """
- paths: [String!]
- ): SnippetBlobConnection
-
- """
- Timestamp this snippet was created.
- """
- createdAt: Time!
-
- """
- Description of the snippet.
- """
- description: String
-
- """
- The GitLab Flavored Markdown rendering of `description`
- """
- descriptionHtml: String
-
- """
- All discussions on this noteable.
- """
- discussions(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DiscussionConnection!
-
- """
- File Name of the snippet.
- """
- fileName: String
-
- """
- HTTP URL to the snippet repository.
- """
- httpUrlToRepo: String
-
- """
- ID of the snippet.
- """
- id: SnippetID!
-
- """
- All notes on this noteable.
- """
- notes(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): NoteConnection!
-
- """
- The project the snippet is associated with.
- """
- project: Project
-
- """
- Raw URL of the snippet.
- """
- rawUrl: String!
-
- """
- SSH URL to the snippet repository.
- """
- sshUrlToRepo: String
-
- """
- Title of the snippet.
- """
- title: String!
-
- """
- Timestamp this snippet was updated.
- """
- updatedAt: Time!
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: SnippetPermissions!
-
- """
- Visibility Level of the snippet.
- """
- visibilityLevel: VisibilityLevelsEnum!
-
- """
- Web URL of the snippet.
- """
- webUrl: String!
-}
-
-"""
-Represents the snippet blob
-"""
-type SnippetBlob {
- """
- Shows whether the blob is binary.
- """
- binary: Boolean!
-
- """
- Blob external storage.
- """
- externalStorage: String
-
- """
- Blob mode.
- """
- mode: String
-
- """
- Blob name.
- """
- name: String
-
- """
- Blob path.
- """
- path: String
-
- """
- Blob plain highlighted data.
- """
- plainData: String
-
- """
- Blob raw content endpoint path.
- """
- rawPath: String!
-
- """
- Shows whether the blob is rendered as text.
- """
- renderedAsText: Boolean!
-
- """
- Blob highlighted data.
- """
- richData: String
-
- """
- Blob content rich viewer.
- """
- richViewer: SnippetBlobViewer
-
- """
- Blob content simple viewer.
- """
- simpleViewer: SnippetBlobViewer!
-
- """
- Blob size.
- """
- size: Int!
-}
-
-"""
-Type of a snippet blob input action
-"""
-enum SnippetBlobActionEnum {
- create
- delete
- move
- update
-}
-
-"""
-Represents an action to perform over a snippet file
-"""
-input SnippetBlobActionInputType {
- """
- Type of input action.
- """
- action: SnippetBlobActionEnum!
-
- """
- Snippet file content.
- """
- content: String
-
- """
- Path of the snippet file.
- """
- filePath: String!
-
- """
- Previous path of the snippet file.
- """
- previousPath: String
-}
-
-"""
-The connection type for SnippetBlob.
-"""
-type SnippetBlobConnection {
- """
- A list of edges.
- """
- edges: [SnippetBlobEdge]
-
- """
- A list of nodes.
- """
- nodes: [SnippetBlob]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type SnippetBlobEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: SnippetBlob
-}
-
-"""
-Represents how the blob content should be displayed
-"""
-type SnippetBlobViewer {
- """
- Shows whether the blob should be displayed collapsed.
- """
- collapsed: Boolean!
-
- """
- Content file type.
- """
- fileType: String!
-
- """
- Shows whether the blob content is loaded asynchronously.
- """
- loadAsync: Boolean!
-
- """
- Loading partial name.
- """
- loadingPartialName: String!
-
- """
- Error rendering the blob content.
- """
- renderError: String
-
- """
- Shows whether the blob too large to be displayed.
- """
- tooLarge: Boolean!
-
- """
- Type of blob viewer.
- """
- type: BlobViewersType!
-}
-
-"""
-The connection type for Snippet.
-"""
-type SnippetConnection {
- """
- A list of edges.
- """
- edges: [SnippetEdge]
-
- """
- A list of nodes.
- """
- nodes: [Snippet]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type SnippetEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Snippet
-}
-
-"""
-Identifier of Snippet.
-"""
-scalar SnippetID
-
-type SnippetPermissions {
- """
- Indicates the user can perform `admin_snippet` on this resource
- """
- adminSnippet: Boolean!
-
- """
- Indicates the user can perform `award_emoji` on this resource
- """
- awardEmoji: Boolean!
-
- """
- Indicates the user can perform `create_note` on this resource
- """
- createNote: Boolean!
-
- """
- Indicates the user can perform `read_snippet` on this resource
- """
- readSnippet: Boolean!
-
- """
- Indicates the user can perform `report_snippet` on this resource
- """
- reportSnippet: Boolean!
-
- """
- Indicates the user can perform `update_snippet` on this resource
- """
- updateSnippet: Boolean!
-}
-
-"""
-Represents the Geo sync and verification state of a snippet repository
-"""
-type SnippetRepositoryRegistry {
- """
- Timestamp when the SnippetRepositoryRegistry was created
- """
- createdAt: Time
-
- """
- ID of the SnippetRepositoryRegistry
- """
- id: ID!
-
- """
- Error message during sync of the SnippetRepositoryRegistry
- """
- lastSyncFailure: String
-
- """
- Timestamp of the most recent successful sync of the SnippetRepositoryRegistry
- """
- lastSyncedAt: Time
-
- """
- Timestamp after which the SnippetRepositoryRegistry should be resynced
- """
- retryAt: Time
-
- """
- Number of consecutive failed sync attempts of the SnippetRepositoryRegistry
- """
- retryCount: Int
-
- """
- ID of the Snippet Repository.
- """
- snippetRepositoryId: ID!
-
- """
- Sync state of the SnippetRepositoryRegistry
- """
- state: RegistryState
-}
-
-"""
-The connection type for SnippetRepositoryRegistry.
-"""
-type SnippetRepositoryRegistryConnection {
- """
- A list of edges.
- """
- edges: [SnippetRepositoryRegistryEdge]
-
- """
- A list of nodes.
- """
- nodes: [SnippetRepositoryRegistry]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type SnippetRepositoryRegistryEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: SnippetRepositoryRegistry
-}
-
-"""
-Common sort values
-"""
-enum Sort {
- """
- Created at ascending order
- """
- CREATED_ASC
-
- """
- Created at descending order
- """
- CREATED_DESC
-
- """
- Updated at ascending order
- """
- UPDATED_ASC
-
- """
- Updated at descending order
- """
- UPDATED_DESC
-
- """
- Created at ascending order
- """
- created_asc @deprecated(reason: "Use CREATED_ASC. Deprecated in 13.5.")
-
- """
- Created at descending order
- """
- created_desc @deprecated(reason: "Use CREATED_DESC. Deprecated in 13.5.")
-
- """
- Updated at ascending order
- """
- updated_asc @deprecated(reason: "Use UPDATED_ASC. Deprecated in 13.5.")
-
- """
- Updated at descending order
- """
- updated_desc @deprecated(reason: "Use UPDATED_DESC. Deprecated in 13.5.")
-}
-
-type StatusAction {
- """
- Title for the button, for example: Retry this job.
- """
- buttonTitle: String
-
- """
- Icon used in the action button.
- """
- icon: String
-
- """
- Method for the action, for example: :post.
- """
- method: String
-
- """
- Path for the action.
- """
- path: String
-
- """
- Title for the action, for example: Retry.
- """
- title: String
-}
-
-type Submodule implements Entry {
- """
- Flat path of the entry.
- """
- flatPath: String!
-
- """
- ID of the entry.
- """
- id: ID!
-
- """
- Name of the entry.
- """
- name: String!
-
- """
- Path of the entry.
- """
- path: String!
-
- """
- Last commit SHA for the entry.
- """
- sha: String!
-
- """
- Tree URL for the sub-module.
- """
- treeUrl: String
-
- """
- Type of tree entry.
- """
- type: EntryType!
-
- """
- Web URL for the sub-module.
- """
- webUrl: String
-}
-
-"""
-The connection type for Submodule.
-"""
-type SubmoduleConnection {
- """
- A list of edges.
- """
- edges: [SubmoduleEdge]
-
- """
- A list of nodes.
- """
- nodes: [Submodule]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type SubmoduleEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Submodule
-}
-
-"""
-Completion status of tasks
-"""
-type TaskCompletionStatus {
- """
- Number of completed tasks.
- """
- completedCount: Int!
-
- """
- Number of total tasks.
- """
- count: Int!
-}
-
-type TerraformState {
- """
- Timestamp the Terraform state was created.
- """
- createdAt: Time!
-
- """
- ID of the Terraform state.
- """
- id: ID!
-
- """
- The latest version of the Terraform state.
- """
- latestVersion: TerraformStateVersion
-
- """
- Timestamp the Terraform state was locked.
- """
- lockedAt: Time
-
- """
- The user currently holding a lock on the Terraform state.
- """
- lockedByUser: User
-
- """
- Name of the Terraform state.
- """
- name: String!
-
- """
- Timestamp the Terraform state was updated.
- """
- updatedAt: Time!
-}
-
-"""
-The connection type for TerraformState.
-"""
-type TerraformStateConnection {
- """
- Total count of collection.
- """
- count: Int!
-
- """
- A list of edges.
- """
- edges: [TerraformStateEdge]
-
- """
- A list of nodes.
- """
- nodes: [TerraformState]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of TerraformStateDelete
-"""
-input TerraformStateDeleteInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Global ID of the Terraform state.
- """
- id: TerraformStateID!
-}
-
-"""
-Autogenerated return type of TerraformStateDelete
-"""
-type TerraformStateDeletePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-An edge in a connection.
-"""
-type TerraformStateEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: TerraformState
-}
-
-"""
-Identifier of Terraform::State.
-"""
-scalar TerraformStateID
-
-"""
-Autogenerated input type of TerraformStateLock
-"""
-input TerraformStateLockInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Global ID of the Terraform state.
- """
- id: TerraformStateID!
-}
-
-"""
-Autogenerated return type of TerraformStateLock
-"""
-type TerraformStateLockPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of TerraformStateUnlock
-"""
-input TerraformStateUnlockInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Global ID of the Terraform state.
- """
- id: TerraformStateID!
-}
-
-"""
-Autogenerated return type of TerraformStateUnlock
-"""
-type TerraformStateUnlockPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-type TerraformStateVersion {
- """
- Timestamp the version was created.
- """
- createdAt: Time!
-
- """
- The user that created this version.
- """
- createdByUser: User
-
- """
- URL for downloading the version's JSON file.
- """
- downloadPath: String
-
- """
- ID of the Terraform state version.
- """
- id: ID!
-
- """
- The job that created this version.
- """
- job: CiJob
-
- """
- Serial number of the version.
- """
- serial: Int
-
- """
- Timestamp the version was updated.
- """
- updatedAt: Time!
-}
-
-"""
-Represents the Geo sync and verification state of a terraform state version
-"""
-type TerraformStateVersionRegistry {
- """
- Timestamp when the TerraformStateVersionRegistry was created
- """
- createdAt: Time
-
- """
- ID of the TerraformStateVersionRegistry
- """
- id: ID!
-
- """
- Error message during sync of the TerraformStateVersionRegistry
- """
- lastSyncFailure: String
-
- """
- Timestamp of the most recent successful sync of the TerraformStateVersionRegistry
- """
- lastSyncedAt: Time
-
- """
- Timestamp after which the TerraformStateVersionRegistry should be resynced
- """
- retryAt: Time
-
- """
- Number of consecutive failed sync attempts of the TerraformStateVersionRegistry
- """
- retryCount: Int
-
- """
- Sync state of the TerraformStateVersionRegistry
- """
- state: RegistryState
-
- """
- ID of the terraform state version.
- """
- terraformStateVersionId: ID!
-}
-
-"""
-The connection type for TerraformStateVersionRegistry.
-"""
-type TerraformStateVersionRegistryConnection {
- """
- A list of edges.
- """
- edges: [TerraformStateVersionRegistryEdge]
-
- """
- A list of nodes.
- """
- nodes: [TerraformStateVersionRegistry]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type TerraformStateVersionRegistryEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: TerraformStateVersionRegistry
-}
-
-"""
-Represents a requirement test report
-"""
-type TestReport {
- """
- Author of the test report.
- """
- author: User
-
- """
- Timestamp of when the test report was created.
- """
- createdAt: Time!
-
- """
- ID of the test report.
- """
- id: ID!
-
- """
- State of the test report.
- """
- state: TestReportState!
-}
-
-"""
-The connection type for TestReport.
-"""
-type TestReportConnection {
- """
- A list of edges.
- """
- edges: [TestReportEdge]
-
- """
- A list of nodes.
- """
- nodes: [TestReport]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type TestReportEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: TestReport
-}
-
-"""
-State of a test report
-"""
-enum TestReportState {
- FAILED
- PASSED
-}
-
-"""
-Time represented in ISO 8601
-"""
-scalar Time
-
-"""
-Represents the time report stats for timeboxes
-"""
-type TimeReportStats {
- """
- Completed issues metrics.
- """
- complete: TimeboxMetrics
-
- """
- Incomplete issues metrics.
- """
- incomplete: TimeboxMetrics
-
- """
- Total issues metrics.
- """
- total: TimeboxMetrics
-}
-
-"""
-Represents measured stats metrics for timeboxes
-"""
-type TimeboxMetrics {
- """
- The count metric.
- """
- count: Int!
-
- """
- The weight metric.
- """
- weight: Int!
-}
-
-"""
-Represents a historically accurate report about the timebox
-"""
-type TimeboxReport {
- """
- Daily scope and completed totals for burnup charts.
- """
- burnupTimeSeries: [BurnupChartDailyTotals!]
-
- """
- Represents the time report stats for the timebox.
- """
- stats: TimeReportStats
-}
-
-interface TimeboxReportInterface {
- """
- Historically accurate report about the timebox.
- """
- report: TimeboxReport
-}
-
-"""
-A time-frame defined as a closed inclusive range of two dates
-"""
-input Timeframe {
- """
- The end of the range.
- """
- end: Date!
-
- """
- The start of the range.
- """
- start: Date!
-}
-
-type Timelog {
- """
- The issue that logged time was added to.
- """
- issue: Issue
-
- """
- The note where the quick action to add the logged time was executed.
- """
- note: Note
-
- """
- Timestamp of when the time tracked was spent at.
- """
- spentAt: Time
-
- """
- The time spent displayed in seconds.
- """
- timeSpent: Int!
-
- """
- The user that logged the time.
- """
- user: User!
-}
-
-"""
-The connection type for Timelog.
-"""
-type TimelogConnection {
- """
- A list of edges.
- """
- edges: [TimelogEdge]
-
- """
- A list of nodes.
- """
- nodes: [Timelog]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type TimelogEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Timelog
-}
-
-"""
-Representing a to-do entry
-"""
-type Todo {
- """
- Action of the to-do item.
- """
- action: TodoActionEnum!
-
- """
- The author of this to-do item.
- """
- author: User!
-
- """
- Body of the to-do item.
- """
- body: String!
-
- """
- Timestamp this to-do item was created.
- """
- createdAt: Time!
-
- """
- Group this to-do item is associated with.
- """
- group: Group
-
- """
- ID of the to-do item.
- """
- id: ID!
-
- """
- The project this to-do item is associated with.
- """
- project: Project
-
- """
- State of the to-do item.
- """
- state: TodoStateEnum!
-
- """
- Target type of the to-do item.
- """
- targetType: TodoTargetEnum!
-}
-
-enum TodoActionEnum {
- approval_required
- assigned
- build_failed
- directly_addressed
- marked
- mentioned
- unmergeable
-}
-
-"""
-The connection type for Todo.
-"""
-type TodoConnection {
- """
- A list of edges.
- """
- edges: [TodoEdge]
-
- """
- A list of nodes.
- """
- nodes: [Todo]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of TodoCreate
-"""
-input TodoCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the to-do item's parent. Issues, merge requests, designs and epics are supported.
- """
- targetId: TodoableID!
-}
-
-"""
-Autogenerated return type of TodoCreate
-"""
-type TodoCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The to-do item created.
- """
- todo: Todo
-}
-
-"""
-An edge in a connection.
-"""
-type TodoEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Todo
-}
-
-"""
-Identifier of Todo.
-"""
-scalar TodoID
-
-"""
-Autogenerated input type of TodoMarkDone
-"""
-input TodoMarkDoneInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the to-do item to mark as done.
- """
- id: TodoID!
-}
-
-"""
-Autogenerated return type of TodoMarkDone
-"""
-type TodoMarkDonePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The requested to-do item.
- """
- todo: Todo!
-}
-
-"""
-Autogenerated input type of TodoRestore
-"""
-input TodoRestoreInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the to-do item to restore.
- """
- id: TodoID!
-}
-
-"""
-Autogenerated input type of TodoRestoreMany
-"""
-input TodoRestoreManyInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global IDs of the to-do items to restore (a maximum of 50 is supported at once).
- """
- ids: [TodoID!]!
-}
-
-"""
-Autogenerated return type of TodoRestoreMany
-"""
-type TodoRestoreManyPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Updated to-do items.
- """
- todos: [Todo!]!
-
- """
- The IDs of the updated to-do items. Deprecated in 13.2: Use to-do items.
- """
- updatedIds: [TodoID!]! @deprecated(reason: "Use to-do items. Deprecated in 13.2.")
-}
-
-"""
-Autogenerated return type of TodoRestore
-"""
-type TodoRestorePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The requested to-do item.
- """
- todo: Todo!
-}
-
-enum TodoStateEnum {
- done
- pending
-}
-
-enum TodoTargetEnum {
- """
- An Alert
- """
- ALERT
-
- """
- A Commit
- """
- COMMIT
-
- """
- A Design
- """
- DESIGN
-
- """
- An Epic
- """
- EPIC
-
- """
- An Issue
- """
- ISSUE
-
- """
- A MergeRequest
- """
- MERGEREQUEST
-}
-
-"""
-Identifier of Todoable.
-"""
-scalar TodoableID
-
-"""
-Autogenerated input type of TodosMarkAllDone
-"""
-input TodosMarkAllDoneInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-}
-
-"""
-Autogenerated return type of TodosMarkAllDone
-"""
-type TodosMarkAllDonePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Updated to-do items.
- """
- todos: [Todo!]!
-
- """
- IDs of the updated to-do items. Deprecated in 13.2: Use to-do items.
- """
- updatedIds: [TodoID!]! @deprecated(reason: "Use to-do items. Deprecated in 13.2.")
-}
-
-"""
-Autogenerated input type of ToggleAwardEmoji
-"""
-input ToggleAwardEmojiInput {
- """
- The global ID of the awardable resource.
- """
- awardableId: AwardableID!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The emoji name.
- """
- name: String!
-}
-
-"""
-Autogenerated return type of ToggleAwardEmoji
-"""
-type ToggleAwardEmojiPayload {
- """
- The award emoji after mutation.
- """
- awardEmoji: AwardEmoji
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Indicates the status of the emoji. True if the toggle awarded the emoji, and false if the toggle removed the emoji.
- """
- toggledOn: Boolean!
-}
-
-type Tree {
- """
- Blobs of the tree.
- """
- blobs(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): BlobConnection!
-
- """
- Last commit for the tree.
- """
- lastCommit: Commit
-
- """
- Sub-modules of the tree.
- """
- submodules(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): SubmoduleConnection!
-
- """
- Trees of the tree.
- """
- trees(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): TreeEntryConnection!
-}
-
-"""
-Represents a directory
-"""
-type TreeEntry implements Entry {
- """
- Flat path of the entry.
- """
- flatPath: String!
-
- """
- ID of the entry.
- """
- id: ID!
-
- """
- Name of the entry.
- """
- name: String!
-
- """
- Path of the entry.
- """
- path: String!
-
- """
- Last commit SHA for the entry.
- """
- sha: String!
-
- """
- Type of tree entry.
- """
- type: EntryType!
-
- """
- Web path for the tree entry (directory).
- """
- webPath: String
-
- """
- Web URL for the tree entry (directory).
- """
- webUrl: String
-}
-
-"""
-The connection type for TreeEntry.
-"""
-type TreeEntryConnection {
- """
- A list of edges.
- """
- edges: [TreeEntryEdge]
-
- """
- A list of nodes.
- """
- nodes: [TreeEntry]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type TreeEntryEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: TreeEntry
-}
-
-enum TypeEnum {
- personal
- project
-}
-
-"""
-A regexp containing patterns sourced from user input
-"""
-scalar UntrustedRegexp
-
-"""
-Autogenerated input type of UpdateAlertStatus
-"""
-input UpdateAlertStatusInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the alert to mutate.
- """
- iid: String!
-
- """
- The project the alert to mutate is in.
- """
- projectPath: ID!
-
- """
- The status to set the alert.
- """
- status: AlertManagementStatus!
-}
-
-"""
-Autogenerated return type of UpdateAlertStatus
-"""
-type UpdateAlertStatusPayload {
- """
- The alert after mutation.
- """
- alert: AlertManagementAlert
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue created after mutation.
- """
- issue: Issue
-
- """
- The to-do item after mutation.
- """
- todo: Todo
-}
-
-"""
-Autogenerated input type of UpdateBoardEpicUserPreferences
-"""
-input UpdateBoardEpicUserPreferencesInput {
- """
- The board global ID.
- """
- boardId: BoardID!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Whether the epic should be collapsed in the board.
- """
- collapsed: Boolean!
-
- """
- ID of an epic to set preferences for.
- """
- epicId: EpicID!
-}
-
-"""
-Autogenerated return type of UpdateBoardEpicUserPreferences
-"""
-type UpdateBoardEpicUserPreferencesPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- User preferences for the epic in the board after mutation.
- """
- epicUserPreferences: BoardEpicUserPreferences
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of UpdateBoard
-"""
-input UpdateBoardInput {
- """
- The ID of user to be assigned to the board.
- """
- assigneeId: UserID
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Whether or not backlog list is hidden.
- """
- hideBacklogList: Boolean
-
- """
- Whether or not closed list is hidden.
- """
- hideClosedList: Boolean
-
- """
- The board global ID.
- """
- id: BoardID!
-
- """
- The ID of iteration to be assigned to the board.
- """
- iterationId: IterationID
-
- """
- The IDs of labels to be added to the board.
- """
- labelIds: [LabelID!]
-
- """
- Labels of the issue.
- """
- labels: [String!]
-
- """
- The ID of milestone to be assigned to the board.
- """
- milestoneId: MilestoneID
-
- """
- The board name.
- """
- name: String
-
- """
- The weight value to be assigned to the board.
- """
- weight: Int
-}
-
-"""
-Autogenerated input type of UpdateBoardList
-"""
-input UpdateBoardListInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Indicates if list is collapsed for this user.
- """
- collapsed: Boolean
-
- """
- Global ID of the list.
- """
- listId: ListID!
-
- """
- Position of list within the board.
- """
- position: Int
-}
-
-"""
-Autogenerated return type of UpdateBoardList
-"""
-type UpdateBoardListPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Mutated list.
- """
- list: BoardList
-}
-
-"""
-Autogenerated return type of UpdateBoard
-"""
-type UpdateBoardPayload {
- """
- The board after mutation.
- """
- board: Board
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of UpdateComplianceFramework
-"""
-input UpdateComplianceFrameworkInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the compliance framework to update.
- """
- id: ComplianceManagementFrameworkID!
-
- """
- Parameters to update the compliance framework with.
- """
- params: ComplianceFrameworkInput!
-}
-
-"""
-Autogenerated return type of UpdateComplianceFramework
-"""
-type UpdateComplianceFrameworkPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The compliance framework after mutation.
- """
- complianceFramework: ComplianceFramework
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of UpdateContainerExpirationPolicy
-"""
-input UpdateContainerExpirationPolicyInput {
- """
- This container expiration policy schedule.
- """
- cadence: ContainerExpirationPolicyCadenceEnum
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Indicates whether this container expiration policy is enabled.
- """
- enabled: Boolean
-
- """
- Number of tags to retain.
- """
- keepN: ContainerExpirationPolicyKeepEnum
-
- """
- Tags with names matching this regex pattern will expire.
- """
- nameRegex: UntrustedRegexp
-
- """
- Tags with names matching this regex pattern will be preserved.
- """
- nameRegexKeep: UntrustedRegexp
-
- """
- Tags older that this will expire.
- """
- olderThan: ContainerExpirationPolicyOlderThanEnum
-
- """
- The project path where the container expiration policy is located.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of UpdateContainerExpirationPolicy
-"""
-type UpdateContainerExpirationPolicyPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The container expiration policy after mutation.
- """
- containerExpirationPolicy: ContainerExpirationPolicy
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-input UpdateDiffImagePositionInput {
- """
- Total height of the image.
- """
- height: Int
-
- """
- Total width of the image.
- """
- width: Int
-
- """
- X position of the note.
- """
- x: Int
-
- """
- Y position of the note.
- """
- y: Int
-}
-
-"""
-Autogenerated input type of UpdateEpic
-"""
-input UpdateEpicInput {
- """
- The IDs of labels to be added to the epic.
- """
- addLabelIds: [ID!]
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Indicates if the epic is confidential.
- """
- confidential: Boolean
-
- """
- The description of the epic.
- """
- description: String
-
- """
- The end date of the epic.
- """
- dueDateFixed: String
-
- """
- Indicates end date should be sourced from due_date_fixed field not the issue milestones.
- """
- dueDateIsFixed: Boolean
-
- """
- The group the epic to mutate is in.
- """
- groupPath: ID!
-
- """
- The IID of the epic to mutate.
- """
- iid: ID!
-
- """
- The IDs of labels to be removed from the epic.
- """
- removeLabelIds: [ID!]
-
- """
- The start date of the epic.
- """
- startDateFixed: String
-
- """
- Indicates start date should be sourced from start_date_fixed field not the issue milestones.
- """
- startDateIsFixed: Boolean
-
- """
- State event for the epic.
- """
- stateEvent: EpicStateEvent
-
- """
- The title of the epic.
- """
- title: String
-}
-
-"""
-Autogenerated return type of UpdateEpic
-"""
-type UpdateEpicPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The epic after mutation.
- """
- epic: Epic
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of UpdateImageDiffNote
-"""
-input UpdateImageDiffNoteInput {
- """
- Content of the note.
- """
- body: String
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the note to update.
- """
- id: NoteID!
-
- """
- The position of this note on a diff.
- """
- position: UpdateDiffImagePositionInput
-}
-
-"""
-Autogenerated return type of UpdateImageDiffNote
-"""
-type UpdateImageDiffNotePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The note after mutation.
- """
- note: Note
-}
-
-"""
-Autogenerated input type of UpdateIssue
-"""
-input UpdateIssueInput {
- """
- The IDs of labels to be added to the issue.
- """
- addLabelIds: [ID!]
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Indicates the issue is confidential.
- """
- confidential: Boolean
-
- """
- Description of the issue.
- """
- description: String
-
- """
- Due date of the issue.
- """
- dueDate: ISO8601Date
-
- """
- The ID of the parent epic. NULL when removing the association.
- """
- epicId: EpicID
-
- """
- The desired health status.
- """
- healthStatus: HealthStatus
-
- """
- The IID of the issue to mutate.
- """
- iid: String!
-
- """
- Indicates discussion is locked on the issue.
- """
- locked: Boolean
-
- """
- The ID of the milestone to assign to the issue. On update milestone will be removed if set to null.
- """
- milestoneId: ID
-
- """
- The project the issue to mutate is in.
- """
- projectPath: ID!
-
- """
- The IDs of labels to be removed from the issue.
- """
- removeLabelIds: [ID!]
-
- """
- Close or reopen an issue.
- """
- stateEvent: IssueStateEvent
-
- """
- Title of the issue.
- """
- title: String
-
- """
- The weight of the issue.
- """
- weight: Int
-}
-
-"""
-Autogenerated return type of UpdateIssue
-"""
-type UpdateIssuePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-"""
-Autogenerated input type of UpdateIteration
-"""
-input UpdateIterationInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Description of the iteration.
- """
- description: String
-
- """
- End date of the iteration.
- """
- dueDate: String
-
- """
- Group of the iteration.
- """
- groupPath: ID!
-
- """
- Global ID of the iteration.
- """
- id: ID!
-
- """
- Start date of the iteration.
- """
- startDate: String
-
- """
- Title of the iteration.
- """
- title: String
-}
-
-"""
-Autogenerated return type of UpdateIteration
-"""
-type UpdateIterationPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Updated iteration.
- """
- iteration: Iteration
-}
-
-"""
-Autogenerated input type of UpdateNamespacePackageSettings
-"""
-input UpdateNamespacePackageSettingsInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- When maven_duplicates_allowed is false, you can publish duplicate packages
- with names that match this regex. Otherwise, this setting has no effect.
- """
- mavenDuplicateExceptionRegex: UntrustedRegexp
-
- """
- Indicates whether duplicate Maven packages are allowed for this namespace.
- """
- mavenDuplicatesAllowed: Boolean
-
- """
- The namespace path where the namespace package setting is located.
- """
- namespacePath: ID!
-}
-
-"""
-Autogenerated return type of UpdateNamespacePackageSettings
-"""
-type UpdateNamespacePackageSettingsPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The namespace package setting after mutation.
- """
- packageSettings: PackageSettings
-}
-
-"""
-Autogenerated input type of UpdateNote
-"""
-input UpdateNoteInput {
- """
- Content of the note.
- """
- body: String
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The confidentiality flag of a note. Default is false.
- """
- confidential: Boolean
-
- """
- The global ID of the note to update.
- """
- id: NoteID!
-}
-
-"""
-Autogenerated return type of UpdateNote
-"""
-type UpdateNotePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The note after mutation.
- """
- note: Note
-}
-
-"""
-Autogenerated input type of UpdateRequirement
-"""
-input UpdateRequirementInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Description of the requirement.
- """
- description: String
-
- """
- The IID of the requirement to update.
- """
- iid: String!
-
- """
- Creates a test report for the requirement with the given state.
- """
- lastTestReportState: TestReportState
-
- """
- Full project path the requirement is associated with.
- """
- projectPath: ID!
-
- """
- State of the requirement.
- """
- state: RequirementState
-
- """
- Title of the requirement.
- """
- title: String
-}
-
-"""
-Autogenerated return type of UpdateRequirement
-"""
-type UpdateRequirementPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Requirement after mutation.
- """
- requirement: Requirement
-}
-
-"""
-Autogenerated input type of UpdateSnippet
-"""
-input UpdateSnippetInput {
- """
- Actions to perform over the snippet repository and blobs.
- """
- blobActions: [SnippetBlobActionInputType!]
-
- """
- A valid CAPTCHA response value obtained by using the provided captchaSiteKey
- with a CAPTCHA API to present a challenge to be solved on the client. Required
- to resubmit if the previous operation returned "NeedsCaptchaResponse: true".
- """
- captchaResponse: String
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Description of the snippet.
- """
- description: String
-
- """
- The global ID of the snippet to update.
- """
- id: SnippetID!
-
- """
- The spam log ID which must be passed along with a valid CAPTCHA response for
- the operation to be completed. Required to resubmit if the previous operation
- returned "NeedsCaptchaResponse: true".
- """
- spamLogId: Int
-
- """
- Title of the snippet.
- """
- title: String
-
- """
- The visibility level of the snippet.
- """
- visibilityLevel: VisibilityLevelsEnum
-}
-
-"""
-Autogenerated return type of UpdateSnippet
-"""
-type UpdateSnippetPayload {
- """
- The CAPTCHA site key which must be used to render a challenge for the user to
- solve to obtain a valid captchaResponse value. Included only when an operation
- was not completed because "NeedsCaptchaResponse" is true.
- """
- captchaSiteKey: String
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Indicates whether the operation was detected as possible spam and not
- completed. If CAPTCHA is enabled, the request must be resubmitted with a valid
- CAPTCHA response and spam_log_id included for the operation to be completed.
- Included only when an operation was not completed because
- "NeedsCaptchaResponse" is true.
- """
- needsCaptchaResponse: Boolean
-
- """
- The snippet after mutation.
- """
- snippet: Snippet
-
- """
- Indicates whether the operation was detected as definite spam. There is no
- option to resubmit the request with a CAPTCHA response.
- """
- spam: Boolean
-
- """
- The spam log ID which must be passed along with a valid CAPTCHA response for
- an operation to be completed. Included only when an operation was not
- completed because "NeedsCaptchaResponse" is true.
- """
- spamLogId: Int
-}
-
-scalar Upload
-
-type User {
- """
- Merge Requests assigned to the user.
- """
- assignedMergeRequests(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Username of the author.
- """
- authorUsername: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Array of IIDs of merge requests, for example `[1, 2]`.
- """
- iids: [String!]
-
- """
- Array of label names. All resolved merge requests will have all of these labels.
- """
- labels: [String!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Merge requests merged after this date.
- """
- mergedAfter: Time
-
- """
- Merge requests merged before this date.
- """
- mergedBefore: Time
-
- """
- Title of the milestone.
- """
- milestoneTitle: String
-
- """
- The global ID of the project the authored merge requests should be in. Incompatible with projectPath.
- """
- projectId: ProjectID
-
- """
- The full-path of the project the authored merge requests should be in. Incompatible with projectId.
- """
- projectPath: String
-
- """
- Username of the reviewer.
- """
- reviewerUsername: String
-
- """
- Sort merge requests by this criteria.
- """
- sort: MergeRequestSort = created_desc
-
- """
- Array of source branch names. All resolved merge requests will have one of these branches as their source.
- """
- sourceBranches: [String!]
-
- """
- A merge request state. If provided, all resolved merge requests will have this state.
- """
- state: MergeRequestState
-
- """
- Array of target branch names. All resolved merge requests will have one of these branches as their target.
- """
- targetBranches: [String!]
- ): MergeRequestConnection
-
- """
- Merge Requests authored by the user.
- """
- authoredMergeRequests(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Username of the assignee.
- """
- assigneeUsername: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Array of IIDs of merge requests, for example `[1, 2]`.
- """
- iids: [String!]
-
- """
- Array of label names. All resolved merge requests will have all of these labels.
- """
- labels: [String!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Merge requests merged after this date.
- """
- mergedAfter: Time
-
- """
- Merge requests merged before this date.
- """
- mergedBefore: Time
-
- """
- Title of the milestone.
- """
- milestoneTitle: String
-
- """
- The global ID of the project the authored merge requests should be in. Incompatible with projectPath.
- """
- projectId: ProjectID
-
- """
- The full-path of the project the authored merge requests should be in. Incompatible with projectId.
- """
- projectPath: String
-
- """
- Username of the reviewer.
- """
- reviewerUsername: String
-
- """
- Sort merge requests by this criteria.
- """
- sort: MergeRequestSort = created_desc
-
- """
- Array of source branch names. All resolved merge requests will have one of these branches as their source.
- """
- sourceBranches: [String!]
-
- """
- A merge request state. If provided, all resolved merge requests will have this state.
- """
- state: MergeRequestState
-
- """
- Array of target branch names. All resolved merge requests will have one of these branches as their target.
- """
- targetBranches: [String!]
- ): MergeRequestConnection
-
- """
- URL of the user's avatar.
- """
- avatarUrl: String
-
- """
- Indicates if the user is a bot.
- """
- bot: Boolean!
-
- """
- User email. Deprecated in 13.7: Use public_email.
- """
- email: String @deprecated(reason: "Use public_email. Deprecated in 13.7.")
-
- """
- Group count for the user. Available only when feature flag `user_group_counts` is enabled.
- """
- groupCount: Int
-
- """
- Group memberships of the user.
- """
- groupMemberships(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): GroupMemberConnection
-
- """
- ID of the user.
- """
- id: ID!
-
- """
- The location of the user.
- """
- location: String
-
- """
- Human-readable name of the user.
- """
- name: String!
-
- """
- Project memberships of the user.
- """
- projectMemberships(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): ProjectMemberConnection
-
- """
- User's public email.
- """
- publicEmail: String
-
- """
- Merge Requests assigned to the user for review.
- """
- reviewRequestedMergeRequests(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Username of the assignee.
- """
- assigneeUsername: String
-
- """
- Username of the author.
- """
- authorUsername: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Array of IIDs of merge requests, for example `[1, 2]`.
- """
- iids: [String!]
-
- """
- Array of label names. All resolved merge requests will have all of these labels.
- """
- labels: [String!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Merge requests merged after this date.
- """
- mergedAfter: Time
-
- """
- Merge requests merged before this date.
- """
- mergedBefore: Time
-
- """
- Title of the milestone.
- """
- milestoneTitle: String
-
- """
- The global ID of the project the authored merge requests should be in. Incompatible with projectPath.
- """
- projectId: ProjectID
-
- """
- The full-path of the project the authored merge requests should be in. Incompatible with projectId.
- """
- projectPath: String
-
- """
- Sort merge requests by this criteria.
- """
- sort: MergeRequestSort = created_desc
-
- """
- Array of source branch names. All resolved merge requests will have one of these branches as their source.
- """
- sourceBranches: [String!]
-
- """
- A merge request state. If provided, all resolved merge requests will have this state.
- """
- state: MergeRequestState
-
- """
- Array of target branch names. All resolved merge requests will have one of these branches as their target.
- """
- targetBranches: [String!]
- ): MergeRequestConnection
-
- """
- Snippets authored by the user.
- """
- snippets(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Array of global snippet ids, e.g., "gid://gitlab/ProjectSnippet/1".
- """
- ids: [SnippetID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- The type of snippet.
- """
- type: TypeEnum
-
- """
- The visibility of the snippet.
- """
- visibility: VisibilityScopesEnum
- ): SnippetConnection
-
- """
- Projects starred by the user.
- """
- starredProjects(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Search query.
- """
- search: String
- ): ProjectConnection
-
- """
- State of the user.
- """
- state: UserState!
-
- """
- User status.
- """
- status: UserStatus
-
- """
- To-do items of the user.
- """
- todos(
- """
- The action to be filtered.
- """
- action: [TodoActionEnum!]
-
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- The ID of an author.
- """
- authorId: [ID!]
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- The ID of a group.
- """
- groupId: [ID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- The ID of a project.
- """
- projectId: [ID!]
-
- """
- The state of the todo.
- """
- state: [TodoStateEnum!]
-
- """
- The type of the todo.
- """
- type: [TodoTargetEnum!]
- ): TodoConnection!
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: UserPermissions!
-
- """
- Username of the user. Unique within this instance of GitLab.
- """
- username: String!
-
- """
- Web path of the user.
- """
- webPath: String!
-
- """
- Web URL of the user.
- """
- webUrl: String!
-}
-
-"""
-The connection type for User.
-"""
-type UserConnection {
- """
- A list of edges.
- """
- edges: [UserEdge]
-
- """
- A list of nodes.
- """
- nodes: [User]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type UserEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: User
-}
-
-"""
-Identifier of User.
-"""
-scalar UserID
-
-type UserPermissions {
- """
- Indicates the user can perform `create_snippet` on this resource
- """
- createSnippet: Boolean!
-}
-
-"""
-Possible states of a user
-"""
-enum UserState {
- """
- The user is active and is able to use the system
- """
- active
-
- """
- The user has been blocked and is prevented from using the system
- """
- blocked
-
- """
- The user is no longer active and is unable to use the system
- """
- deactivated
-}
-
-type UserStatus {
- """
- User availability status.
- """
- availability: AvailabilityEnum!
-
- """
- String representation of emoji.
- """
- emoji: String
-
- """
- User status message.
- """
- message: String
-
- """
- HTML of the user status message
- """
- messageHtml: String
-}
-
-enum VisibilityLevelsEnum {
- internal
- private
- public
-}
-
-enum VisibilityScopesEnum {
- internal
- private
- public
-}
-
-"""
-Represents the count of vulnerabilities by severity on a particular day. This data is retained for 365 days
-"""
-type VulnerabilitiesCountByDay {
- """
- Total number of vulnerabilities on a particular day with critical severity
- """
- critical: Int!
-
- """
- Date for the count.
- """
- date: ISO8601Date!
-
- """
- Total number of vulnerabilities on a particular day with high severity
- """
- high: Int!
-
- """
- Total number of vulnerabilities on a particular day with info severity
- """
- info: Int!
-
- """
- Total number of vulnerabilities on a particular day with low severity
- """
- low: Int!
-
- """
- Total number of vulnerabilities on a particular day with medium severity
- """
- medium: Int!
-
- """
- Total number of vulnerabilities on a particular day.
- """
- total: Int!
-
- """
- Total number of vulnerabilities on a particular day with unknown severity
- """
- unknown: Int!
-}
-
-"""
-Represents the number of vulnerabilities for a particular severity on a particular day. This data is retained for 365 days
-"""
-type VulnerabilitiesCountByDayAndSeverity {
- """
- Number of vulnerabilities.
- """
- count: Int
-
- """
- Date for the count.
- """
- day: ISO8601Date
-
- """
- Severity of the counted vulnerabilities.
- """
- severity: VulnerabilitySeverity
-}
-
-"""
-The connection type for VulnerabilitiesCountByDayAndSeverity.
-"""
-type VulnerabilitiesCountByDayAndSeverityConnection {
- """
- A list of edges.
- """
- edges: [VulnerabilitiesCountByDayAndSeverityEdge]
-
- """
- A list of nodes.
- """
- nodes: [VulnerabilitiesCountByDayAndSeverity]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type VulnerabilitiesCountByDayAndSeverityEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: VulnerabilitiesCountByDayAndSeverity
-}
-
-"""
-The connection type for VulnerabilitiesCountByDay.
-"""
-type VulnerabilitiesCountByDayConnection {
- """
- A list of edges.
- """
- edges: [VulnerabilitiesCountByDayEdge]
-
- """
- A list of nodes.
- """
- nodes: [VulnerabilitiesCountByDay]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type VulnerabilitiesCountByDayEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: VulnerabilitiesCountByDay
-}
-
-"""
-Identifier of Vulnerabilities::ExternalIssueLink.
-"""
-scalar VulnerabilitiesExternalIssueLinkID
-
-"""
-Represents a vulnerability
-"""
-type Vulnerability implements Noteable {
- """
- Timestamp of when the vulnerability state was changed to confirmed.
- """
- confirmedAt: Time
-
- """
- The user that confirmed the vulnerability.
- """
- confirmedBy: User
-
- """
- Description of the vulnerability.
- """
- description: String
-
- """
- Details of the vulnerability.
- """
- details: [VulnerabilityDetail!]!
-
- """
- Timestamp of when the vulnerability was first detected.
- """
- detectedAt: Time!
-
- """
- All discussions on this noteable.
- """
- discussions(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DiscussionConnection!
-
- """
- Timestamp of when the vulnerability state was changed to dismissed.
- """
- dismissedAt: Time
-
- """
- The user that dismissed the vulnerability.
- """
- dismissedBy: User
-
- """
- List of external issue links related to the vulnerability.
- """
- externalIssueLinks(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): VulnerabilityExternalIssueLinkConnection!
-
- """
- Indicates whether there is a solution available for this vulnerability.
- """
- hasSolutions: Boolean
-
- """
- GraphQL ID of the vulnerability.
- """
- id: ID!
-
- """
- Identifiers of the vulnerability.
- """
- identifiers: [VulnerabilityIdentifier!]!
-
- """
- List of issue links related to the vulnerability.
- """
- issueLinks(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter issue links by link type.
- """
- linkType: VulnerabilityIssueLinkType
- ): VulnerabilityIssueLinkConnection!
-
- """
- Location metadata for the vulnerability. Its fields depend on the type of security scan that found the vulnerability.
- """
- location: VulnerabilityLocation
-
- """
- Merge request that fixes the vulnerability.
- """
- mergeRequest: MergeRequest
-
- """
- All notes on this noteable.
- """
- notes(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): NoteConnection!
-
- """
- Primary identifier of the vulnerability.
- """
- primaryIdentifier: VulnerabilityIdentifier
-
- """
- The project on which the vulnerability was found.
- """
- project: Project
-
- """
- Type of the security report that found the vulnerability (SAST,
- DEPENDENCY_SCANNING, CONTAINER_SCANNING, DAST, SECRET_DETECTION,
- COVERAGE_FUZZING, API_FUZZING)
- """
- reportType: VulnerabilityReportType
-
- """
- Timestamp of when the vulnerability state was changed to resolved.
- """
- resolvedAt: Time
-
- """
- The user that resolved the vulnerability.
- """
- resolvedBy: User
-
- """
- Indicates whether the vulnerability is fixed on the default branch or not.
- """
- resolvedOnDefaultBranch: Boolean!
-
- """
- Scanner metadata for the vulnerability.
- """
- scanner: VulnerabilityScanner
-
- """
- Severity of the vulnerability (INFO, UNKNOWN, LOW, MEDIUM, HIGH, CRITICAL)
- """
- severity: VulnerabilitySeverity
-
- """
- State of the vulnerability (DETECTED, CONFIRMED, RESOLVED, DISMISSED)
- """
- state: VulnerabilityState
-
- """
- Title of the vulnerability.
- """
- title: String
-
- """
- Number of user notes attached to the vulnerability.
- """
- userNotesCount: Int!
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: VulnerabilityPermissions!
-
- """
- URL to the vulnerability's details page.
- """
- vulnerabilityPath: String
-}
-
-"""
-Autogenerated input type of VulnerabilityConfirm
-"""
-input VulnerabilityConfirmInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the vulnerability to be confirmed.
- """
- id: VulnerabilityID!
-}
-
-"""
-Autogenerated return type of VulnerabilityConfirm
-"""
-type VulnerabilityConfirmPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The vulnerability after state change.
- """
- vulnerability: Vulnerability
-}
-
-"""
-The connection type for Vulnerability.
-"""
-type VulnerabilityConnection {
- """
- A list of edges.
- """
- edges: [VulnerabilityEdge]
-
- """
- A list of nodes.
- """
- nodes: [Vulnerability]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Represents a vulnerability detail field. The fields with data will depend on the vulnerability detail type
-"""
-union VulnerabilityDetail = VulnerabilityDetailBase | VulnerabilityDetailBoolean | VulnerabilityDetailCode | VulnerabilityDetailCommit | VulnerabilityDetailDiff | VulnerabilityDetailFileLocation | VulnerabilityDetailInt | VulnerabilityDetailList | VulnerabilityDetailMarkdown | VulnerabilityDetailModuleLocation | VulnerabilityDetailTable | VulnerabilityDetailText | VulnerabilityDetailUrl
-
-"""
-Represents the vulnerability details base
-"""
-type VulnerabilityDetailBase {
- """
- Description of the field.
- """
- description: String!
-
- """
- Name of the field.
- """
- fieldName: String
-
- """
- Name of the field.
- """
- name: String!
-}
-
-"""
-Represents the vulnerability details boolean value
-"""
-type VulnerabilityDetailBoolean {
- """
- Description of the field.
- """
- description: String!
-
- """
- Name of the field.
- """
- fieldName: String
-
- """
- Name of the field.
- """
- name: String!
-
- """
- Value of the field.
- """
- value: Boolean!
-}
-
-"""
-Represents the vulnerability details code field
-"""
-type VulnerabilityDetailCode {
- """
- Description of the field.
- """
- description: String!
-
- """
- Name of the field.
- """
- fieldName: String
-
- """
- Language of the code.
- """
- lang: String
-
- """
- Name of the field.
- """
- name: String!
-
- """
- Source code.
- """
- value: String!
-}
-
-"""
-Represents the vulnerability details commit field
-"""
-type VulnerabilityDetailCommit {
- """
- Description of the field.
- """
- description: String!
-
- """
- Name of the field.
- """
- fieldName: String
-
- """
- Name of the field.
- """
- name: String!
-
- """
- The commit SHA value.
- """
- value: String!
-}
-
-"""
-Represents the vulnerability details diff field
-"""
-type VulnerabilityDetailDiff {
- """
- Value of the field after the change.
- """
- after: String!
-
- """
- Value of the field before the change.
- """
- before: String!
-
- """
- Description of the field.
- """
- description: String!
-
- """
- Name of the field.
- """
- fieldName: String
-
- """
- Name of the field.
- """
- name: String!
-}
-
-"""
-Represents the vulnerability details location within a file in the project
-"""
-type VulnerabilityDetailFileLocation {
- """
- Description of the field.
- """
- description: String!
-
- """
- Name of the field.
- """
- fieldName: String
-
- """
- File name.
- """
- fileName: String!
-
- """
- End line number of the file location.
- """
- lineEnd: Int!
-
- """
- Start line number of the file location.
- """
- lineStart: Int!
-
- """
- Name of the field.
- """
- name: String!
-}
-
-"""
-Represents the vulnerability details integer value
-"""
-type VulnerabilityDetailInt {
- """
- Description of the field.
- """
- description: String!
-
- """
- Name of the field.
- """
- fieldName: String
-
- """
- Name of the field.
- """
- name: String!
-
- """
- Value of the field.
- """
- value: Int!
-}
-
-"""
-Represents the vulnerability details list value
-"""
-type VulnerabilityDetailList {
- """
- Description of the field.
- """
- description: String!
-
- """
- Name of the field.
- """
- fieldName: String
-
- """
- List of details.
- """
- items: [VulnerabilityDetail!]!
-
- """
- Name of the field.
- """
- name: String!
-}
-
-"""
-Represents the vulnerability details Markdown field
-"""
-type VulnerabilityDetailMarkdown {
- """
- Description of the field.
- """
- description: String!
-
- """
- Name of the field.
- """
- fieldName: String
-
- """
- Name of the field.
- """
- name: String!
-
- """
- Value of the Markdown field.
- """
- value: String!
-}
-
-"""
-Represents the vulnerability details location within a file in the project
-"""
-type VulnerabilityDetailModuleLocation {
- """
- Description of the field.
- """
- description: String!
-
- """
- Name of the field.
- """
- fieldName: String
-
- """
- Module name.
- """
- moduleName: String!
-
- """
- Name of the field.
- """
- name: String!
-
- """
- Offset of the module location.
- """
- offset: Int!
-}
-
-"""
-Represents the vulnerability details table value
-"""
-type VulnerabilityDetailTable {
- """
- Description of the field.
- """
- description: String!
-
- """
- Name of the field.
- """
- fieldName: String
-
- """
- Table headers.
- """
- headers: [VulnerabilityDetail!]!
-
- """
- Name of the field.
- """
- name: String!
-
- """
- Table rows.
- """
- rows: [VulnerabilityDetail!]!
-}
-
-"""
-Represents the vulnerability details text field
-"""
-type VulnerabilityDetailText {
- """
- Description of the field.
- """
- description: String!
-
- """
- Name of the field.
- """
- fieldName: String
-
- """
- Name of the field.
- """
- name: String!
-
- """
- Value of the text field.
- """
- value: String!
-}
-
-"""
-Represents the vulnerability details URL field
-"""
-type VulnerabilityDetailUrl {
- """
- Description of the field.
- """
- description: String!
-
- """
- Name of the field.
- """
- fieldName: String
-
- """
- Href of the URL.
- """
- href: String!
-
- """
- Name of the field.
- """
- name: String!
-
- """
- Text of the URL.
- """
- text: String
-}
-
-"""
-Autogenerated input type of VulnerabilityDismiss
-"""
-input VulnerabilityDismissInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Comment why vulnerability should be dismissed.
- """
- comment: String
-
- """
- Reason why vulnerability should be dismissed.
- """
- dismissalReason: VulnerabilityDismissalReason
-
- """
- ID of the vulnerability to be dismissed.
- """
- id: VulnerabilityID!
-}
-
-"""
-Autogenerated return type of VulnerabilityDismiss
-"""
-type VulnerabilityDismissPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The vulnerability after dismissal.
- """
- vulnerability: Vulnerability
-}
-
-"""
-The dismissal reason of the Vulnerability
-"""
-enum VulnerabilityDismissalReason {
- """
- The likelihood of the Vulnerability occurring and its impact are deemed acceptable
- """
- ACCEPTABLE_RISK
-
- """
- The Vulnerability was incorrectly identified as being present
- """
- FALSE_POSITIVE
-
- """
- There is a mitigating control that eliminates the Vulnerability or makes its risk acceptable
- """
- MITIGATING_CONTROL
-
- """
- Other reasons for dismissal
- """
- NOT_APPLICABLE
-
- """
- The Vulnerability is used in tests and does not pose an actual risk
- """
- USED_IN_TESTS
-}
-
-"""
-An edge in a connection.
-"""
-type VulnerabilityEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Vulnerability
-}
-
-"""
-Represents an external issue link of a vulnerability
-"""
-type VulnerabilityExternalIssueLink {
- """
- The external issue attached to the issue link.
- """
- externalIssue: ExternalIssue
-
- """
- GraphQL ID of the external issue link.
- """
- id: VulnerabilitiesExternalIssueLinkID!
-
- """
- Type of the external issue link.
- """
- linkType: VulnerabilityExternalIssueLinkType!
-}
-
-"""
-The connection type for VulnerabilityExternalIssueLink.
-"""
-type VulnerabilityExternalIssueLinkConnection {
- """
- A list of edges.
- """
- edges: [VulnerabilityExternalIssueLinkEdge]
-
- """
- A list of nodes.
- """
- nodes: [VulnerabilityExternalIssueLink]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of VulnerabilityExternalIssueLinkCreate
-"""
-input VulnerabilityExternalIssueLinkCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- External tracker type of the external issue link.
- """
- externalTracker: VulnerabilityExternalIssueLinkExternalTracker!
-
- """
- ID of the vulnerability.
- """
- id: VulnerabilityID!
-
- """
- Type of the external issue link.
- """
- linkType: VulnerabilityExternalIssueLinkType!
-}
-
-"""
-Autogenerated return type of VulnerabilityExternalIssueLinkCreate
-"""
-type VulnerabilityExternalIssueLinkCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The created external issue link.
- """
- externalIssueLink: VulnerabilityExternalIssueLink
-}
-
-"""
-Autogenerated input type of VulnerabilityExternalIssueLinkDestroy
-"""
-input VulnerabilityExternalIssueLinkDestroyInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the vulnerability external issue link.
- """
- id: VulnerabilitiesExternalIssueLinkID!
-}
-
-"""
-Autogenerated return type of VulnerabilityExternalIssueLinkDestroy
-"""
-type VulnerabilityExternalIssueLinkDestroyPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-An edge in a connection.
-"""
-type VulnerabilityExternalIssueLinkEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: VulnerabilityExternalIssueLink
-}
-
-"""
-The external tracker of the external issue link related to a vulnerability
-"""
-enum VulnerabilityExternalIssueLinkExternalTracker {
- """
- Jira external tracker
- """
- JIRA
-}
-
-"""
-The type of the external issue link related to a vulnerability
-"""
-enum VulnerabilityExternalIssueLinkType {
- """
- Created link type
- """
- CREATED
-}
-
-"""
-The grade of the vulnerable project
-"""
-enum VulnerabilityGrade {
- A
- B
- C
- D
- F
-}
-
-"""
-Identifier of Vulnerability.
-"""
-scalar VulnerabilityID
-
-"""
-Represents a vulnerability identifier
-"""
-type VulnerabilityIdentifier {
- """
- External ID of the vulnerability identifier.
- """
- externalId: String
-
- """
- External type of the vulnerability identifier.
- """
- externalType: String
-
- """
- Name of the vulnerability identifier.
- """
- name: String
-
- """
- URL of the vulnerability identifier.
- """
- url: String
-}
-
-"""
-Represents an issue link of a vulnerability
-"""
-type VulnerabilityIssueLink {
- """
- GraphQL ID of the vulnerability.
- """
- id: ID!
-
- """
- The issue attached to issue link.
- """
- issue: Issue!
-
- """
- Type of the issue link.
- """
- linkType: VulnerabilityIssueLinkType!
-}
-
-"""
-The connection type for VulnerabilityIssueLink.
-"""
-type VulnerabilityIssueLinkConnection {
- """
- A list of edges.
- """
- edges: [VulnerabilityIssueLinkEdge]
-
- """
- A list of nodes.
- """
- nodes: [VulnerabilityIssueLink]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type VulnerabilityIssueLinkEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: VulnerabilityIssueLink
-}
-
-"""
-The type of the issue link related to a vulnerability
-"""
-enum VulnerabilityIssueLinkType {
- CREATED
- RELATED
-}
-
-"""
-Represents a vulnerability location. The fields with data will depend on the vulnerability report type
-"""
-union VulnerabilityLocation = VulnerabilityLocationContainerScanning | VulnerabilityLocationCoverageFuzzing | VulnerabilityLocationDast | VulnerabilityLocationDependencyScanning | VulnerabilityLocationSast | VulnerabilityLocationSecretDetection
-
-"""
-Represents the location of a vulnerability found by a container security scan
-"""
-type VulnerabilityLocationContainerScanning {
- """
- Dependency containing the vulnerability.
- """
- dependency: VulnerableDependency
-
- """
- Name of the vulnerable container image.
- """
- image: String
-
- """
- Operating system that runs on the vulnerable container image.
- """
- operatingSystem: String
-}
-
-"""
-Represents the location of a vulnerability found by a Coverage Fuzzing scan
-"""
-type VulnerabilityLocationCoverageFuzzing {
- """
- Blob path to the vulnerable file.
- """
- blobPath: String
-
- """
- Number of the last relevant line in the vulnerable file.
- """
- endLine: String
-
- """
- Path to the vulnerable file.
- """
- file: String
-
- """
- Number of the first relevant line in the vulnerable file.
- """
- startLine: String
-
- """
- Class containing the vulnerability.
- """
- vulnerableClass: String
-
- """
- Method containing the vulnerability.
- """
- vulnerableMethod: String
-}
-
-"""
-Represents the location of a vulnerability found by a DAST scan
-"""
-type VulnerabilityLocationDast {
- """
- Domain name of the vulnerable request.
- """
- hostname: String
-
- """
- Query parameter for the URL on which the vulnerability occurred.
- """
- param: String
-
- """
- URL path and query string of the vulnerable request.
- """
- path: String
-
- """
- HTTP method of the vulnerable request.
- """
- requestMethod: String
-}
-
-"""
-Represents the location of a vulnerability found by a dependency security scan
-"""
-type VulnerabilityLocationDependencyScanning {
- """
- Blob path to the vulnerable file.
- """
- blobPath: String
-
- """
- Dependency containing the vulnerability.
- """
- dependency: VulnerableDependency
-
- """
- Path to the vulnerable file.
- """
- file: String
-}
-
-"""
-Represents the location of a vulnerability found by a SAST scan
-"""
-type VulnerabilityLocationSast {
- """
- Blob path to the vulnerable file.
- """
- blobPath: String
-
- """
- Number of the last relevant line in the vulnerable file.
- """
- endLine: String
-
- """
- Path to the vulnerable file.
- """
- file: String
-
- """
- Number of the first relevant line in the vulnerable file.
- """
- startLine: String
-
- """
- Class containing the vulnerability.
- """
- vulnerableClass: String
-
- """
- Method containing the vulnerability.
- """
- vulnerableMethod: String
-}
-
-"""
-Represents the location of a vulnerability found by a secret detection scan
-"""
-type VulnerabilityLocationSecretDetection {
- """
- Blob path to the vulnerable file.
- """
- blobPath: String
-
- """
- Number of the last relevant line in the vulnerable file.
- """
- endLine: String
-
- """
- Path to the vulnerable file.
- """
- file: String
-
- """
- Number of the first relevant line in the vulnerable file.
- """
- startLine: String
-
- """
- Class containing the vulnerability.
- """
- vulnerableClass: String
-
- """
- Method containing the vulnerability.
- """
- vulnerableMethod: String
-}
-
-"""
-Check permissions for the current user on a vulnerability
-"""
-type VulnerabilityPermissions {
- """
- Indicates the user can perform `admin_vulnerability` on this resource
- """
- adminVulnerability: Boolean!
-
- """
- Indicates the user can perform `admin_vulnerability_external_issue_link` on this resource
- """
- adminVulnerabilityExternalIssueLink: Boolean!
-
- """
- Indicates the user can perform `admin_vulnerability_issue_link` on this resource
- """
- adminVulnerabilityIssueLink: Boolean!
-
- """
- Indicates the user can perform `create_vulnerability` on this resource
- """
- createVulnerability: Boolean!
-
- """
- Indicates the user can perform `create_vulnerability_export` on this resource
- """
- createVulnerabilityExport: Boolean!
-
- """
- Indicates the user can perform `create_vulnerability_feedback` on this resource
- """
- createVulnerabilityFeedback: Boolean!
-
- """
- Indicates the user can perform `destroy_vulnerability_feedback` on this resource
- """
- destroyVulnerabilityFeedback: Boolean!
-
- """
- Indicates the user can perform `read_vulnerability_feedback` on this resource
- """
- readVulnerabilityFeedback: Boolean!
-
- """
- Indicates the user can perform `update_vulnerability_feedback` on this resource
- """
- updateVulnerabilityFeedback: Boolean!
-}
-
-"""
-The type of the security scan that found the vulnerability
-"""
-enum VulnerabilityReportType {
- API_FUZZING
- CONTAINER_SCANNING
- COVERAGE_FUZZING
- DAST
- DEPENDENCY_SCANNING
- SAST
- SECRET_DETECTION
-}
-
-"""
-Autogenerated input type of VulnerabilityResolve
-"""
-input VulnerabilityResolveInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the vulnerability to be resolved.
- """
- id: VulnerabilityID!
-}
-
-"""
-Autogenerated return type of VulnerabilityResolve
-"""
-type VulnerabilityResolvePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The vulnerability after state change.
- """
- vulnerability: Vulnerability
-}
-
-"""
-Autogenerated input type of VulnerabilityRevertToDetected
-"""
-input VulnerabilityRevertToDetectedInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the vulnerability to be reverted.
- """
- id: VulnerabilityID!
-}
-
-"""
-Autogenerated return type of VulnerabilityRevertToDetected
-"""
-type VulnerabilityRevertToDetectedPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The vulnerability after revert.
- """
- vulnerability: Vulnerability
-}
-
-"""
-Represents a vulnerability scanner
-"""
-type VulnerabilityScanner {
- """
- External ID of the vulnerability scanner.
- """
- externalId: String
-
- """
- Name of the vulnerability scanner.
- """
- name: String
-
- """
- Type of the vulnerability report.
- """
- reportType: VulnerabilityReportType
-
- """
- Vendor of the vulnerability scanner.
- """
- vendor: String
-}
-
-"""
-The connection type for VulnerabilityScanner.
-"""
-type VulnerabilityScannerConnection {
- """
- A list of edges.
- """
- edges: [VulnerabilityScannerEdge]
-
- """
- A list of nodes.
- """
- nodes: [VulnerabilityScanner]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type VulnerabilityScannerEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: VulnerabilityScanner
-}
-
-"""
-Represents vulnerability counts by severity
-"""
-type VulnerabilitySeveritiesCount {
- """
- Number of vulnerabilities of CRITICAL severity of the project
- """
- critical: Int
-
- """
- Number of vulnerabilities of HIGH severity of the project
- """
- high: Int
-
- """
- Number of vulnerabilities of INFO severity of the project
- """
- info: Int
-
- """
- Number of vulnerabilities of LOW severity of the project
- """
- low: Int
-
- """
- Number of vulnerabilities of MEDIUM severity of the project
- """
- medium: Int
-
- """
- Number of vulnerabilities of UNKNOWN severity of the project
- """
- unknown: Int
-}
-
-"""
-The severity of the vulnerability
-"""
-enum VulnerabilitySeverity {
- CRITICAL
- HIGH
- INFO
- LOW
- MEDIUM
- UNKNOWN
-}
-
-"""
-Vulnerability sort values
-"""
-enum VulnerabilitySort {
- """
- Detection timestamp in ascending order
- """
- detected_asc
-
- """
- Detection timestamp in descending order
- """
- detected_desc
-
- """
- Report Type in ascending order
- """
- report_type_asc
-
- """
- Report Type in descending order
- """
- report_type_desc
-
- """
- Severity in ascending order
- """
- severity_asc
-
- """
- Severity in descending order
- """
- severity_desc
-
- """
- State in ascending order
- """
- state_asc
-
- """
- State in descending order
- """
- state_desc
-
- """
- Title in ascending order
- """
- title_asc
-
- """
- Title in descending order
- """
- title_desc
-}
-
-"""
-The state of the vulnerability
-"""
-enum VulnerabilityState {
- CONFIRMED
- DETECTED
- DISMISSED
- RESOLVED
-}
-
-"""
-Represents a vulnerable dependency. Used in vulnerability location data
-"""
-type VulnerableDependency {
- """
- The package associated with the vulnerable dependency.
- """
- package: VulnerablePackage
-
- """
- The version of the vulnerable dependency.
- """
- version: String
-}
-
-"""
-Represents a vulnerable package. Used in vulnerability dependency data
-"""
-type VulnerablePackage {
- """
- The name of the vulnerable package.
- """
- name: String
-}
-
-"""
-Represents vulnerability letter grades with associated projects
-"""
-type VulnerableProjectsByGrade {
- """
- Number of projects within this grade.
- """
- count: Int!
-
- """
- Grade based on the highest severity vulnerability present.
- """
- grade: VulnerabilityGrade!
-
- """
- Projects within this grade.
- """
- projects(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): ProjectConnection!
-} \ No newline at end of file
diff --git a/doc/api/graphql/reference/gitlab_schema.json b/doc/api/graphql/reference/gitlab_schema.json
deleted file mode 100644
index 492682d2e54..00000000000
--- a/doc/api/graphql/reference/gitlab_schema.json
+++ /dev/null
@@ -1,85944 +0,0 @@
-{
- "data": {
- "__schema": {
- "queryType": {
- "name": "Query"
- },
- "mutationType": {
- "name": "Mutation"
- },
- "subscriptionType": null,
- "types": [
- {
- "kind": "OBJECT",
- "name": "AccessLevel",
- "description": "Represents the access level of a relationship between a User and object that it is related to",
- "fields": [
- {
- "name": "integerValue",
- "description": "Integer representation of access level.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "stringValue",
- "description": "String representation of access level.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "AccessLevelEnum",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "AccessLevelEnum",
- "description": "Access level to a resource",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "NO_ACCESS",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "GUEST",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "REPORTER",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DEVELOPER",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MAINTAINER",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "OWNER",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "AddAwardEmojiInput",
- "description": "Autogenerated input type of AddAwardEmoji",
- "fields": null,
- "inputFields": [
- {
- "name": "awardableId",
- "description": "The global ID of the awardable resource.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "AwardableID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The emoji name.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AddAwardEmojiPayload",
- "description": "Autogenerated return type of AddAwardEmoji",
- "fields": [
- {
- "name": "awardEmoji",
- "description": "The award emoji after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AwardEmoji",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "AddProjectToSecurityDashboardInput",
- "description": "Autogenerated input type of AddProjectToSecurityDashboard",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the project to be added to Instance Security Dashboard.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ProjectID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AddProjectToSecurityDashboardPayload",
- "description": "Autogenerated return type of AddProjectToSecurityDashboard",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "Project that was added to the Instance Security Dashboard.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "AdminSidekiqQueuesDeleteJobsInput",
- "description": "Autogenerated input type of AdminSidekiqQueuesDeleteJobs",
- "fields": null,
- "inputFields": [
- {
- "name": "user",
- "description": "Delete jobs matching user in the context metadata",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "project",
- "description": "Delete jobs matching project in the context metadata",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "rootNamespace",
- "description": "Delete jobs matching root_namespace in the context metadata",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "subscriptionPlan",
- "description": "Delete jobs matching subscription_plan in the context metadata",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "callerId",
- "description": "Delete jobs matching caller_id in the context metadata",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "remoteIp",
- "description": "Delete jobs matching remote_ip in the context metadata",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "relatedClass",
- "description": "Delete jobs matching related_class in the context metadata",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "featureCategory",
- "description": "Delete jobs matching feature_category in the context metadata",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "queueName",
- "description": "The name of the queue to delete jobs from.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AdminSidekiqQueuesDeleteJobsPayload",
- "description": "Autogenerated return type of AdminSidekiqQueuesDeleteJobs",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "result",
- "description": "Information about the status of the deletion request.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DeleteJobsResponse",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AlertManagementAlert",
- "description": "Describes an alert from the project's Alert Management",
- "fields": [
- {
- "name": "assignees",
- "description": "Assignees of the alert.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UserConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp the alert was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the alert.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "details",
- "description": "Alert details.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "JSON",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "detailsUrl",
- "description": "The URL of the alert detail page.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussions",
- "description": "All discussions on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiscussionConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "endedAt",
- "description": "Timestamp the alert ended.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "environment",
- "description": "Environment for the alert.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Environment",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "eventCount",
- "description": "Number of events of this alert.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hosts",
- "description": "List of hosts the alert came from.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iid",
- "description": "Internal ID of the alert.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueIid",
- "description": "Internal ID of the GitLab issue attached to the alert.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "metricsDashboardUrl",
- "description": "URL for metrics embed for the alert.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "monitoringTool",
- "description": "Monitoring tool the alert came from.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notes",
- "description": "All notes on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NoteConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "prometheusAlert",
- "description": "The alert condition for Prometheus.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PrometheusAlert",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "runbook",
- "description": "Runbook for the alert as defined in alert details.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "service",
- "description": "Service the alert came from.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "severity",
- "description": "Severity of the alert.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "AlertManagementSeverity",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startedAt",
- "description": "Timestamp the alert was raised.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "status",
- "description": "Status of the alert.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "AlertManagementStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the alert.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todos",
- "description": "To-do items of the current user for the alert.",
- "args": [
- {
- "name": "action",
- "description": "The action to be filtered.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "TodoActionEnum",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "authorId",
- "description": "The ID of an author.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "projectId",
- "description": "The ID of a project.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "groupId",
- "description": "The ID of a group.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "The state of the todo.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "TodoStateEnum",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "type",
- "description": "The type of the todo.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "TodoTargetEnum",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TodoConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp the alert was last updated.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Noteable",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AlertManagementAlertConnection",
- "description": "The connection type for AlertManagementAlert.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "AlertManagementAlertEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "AlertManagementAlert",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AlertManagementAlertEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementAlert",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "AlertManagementAlertSort",
- "description": "Values for sorting alerts",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "updated_desc",
- "description": "Updated at descending order",
- "isDeprecated": true,
- "deprecationReason": "Use UPDATED_DESC. Deprecated in 13.5."
- },
- {
- "name": "updated_asc",
- "description": "Updated at ascending order",
- "isDeprecated": true,
- "deprecationReason": "Use UPDATED_ASC. Deprecated in 13.5."
- },
- {
- "name": "created_desc",
- "description": "Created at descending order",
- "isDeprecated": true,
- "deprecationReason": "Use CREATED_DESC. Deprecated in 13.5."
- },
- {
- "name": "created_asc",
- "description": "Created at ascending order",
- "isDeprecated": true,
- "deprecationReason": "Use CREATED_ASC. Deprecated in 13.5."
- },
- {
- "name": "UPDATED_DESC",
- "description": "Updated at descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UPDATED_ASC",
- "description": "Updated at ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED_DESC",
- "description": "Created at descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED_ASC",
- "description": "Created at ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "STARTED_AT_ASC",
- "description": "Start time by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "STARTED_AT_DESC",
- "description": "Start time by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ENDED_AT_ASC",
- "description": "End time by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ENDED_AT_DESC",
- "description": "End time by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED_TIME_ASC",
- "description": "Created time by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED_TIME_DESC",
- "description": "Created time by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UPDATED_TIME_ASC",
- "description": "Created time by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UPDATED_TIME_DESC",
- "description": "Created time by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "EVENT_COUNT_ASC",
- "description": "Events count by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "EVENT_COUNT_DESC",
- "description": "Events count by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SEVERITY_ASC",
- "description": "Severity from less critical to more critical",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SEVERITY_DESC",
- "description": "Severity from more critical to less critical",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "STATUS_ASC",
- "description": "Status by order: Ignored > Resolved > Acknowledged > Triggered",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "STATUS_DESC",
- "description": "Status by order: Triggered > Acknowledged > Resolved > Ignored",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AlertManagementAlertStatusCountsType",
- "description": "Represents total number of alerts for the represented categories",
- "fields": [
- {
- "name": "acknowledged",
- "description": "Number of alerts with status ACKNOWLEDGED for the project",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "all",
- "description": "Total number of alerts for the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ignored",
- "description": "Number of alerts with status IGNORED for the project",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "open",
- "description": "Number of alerts with status TRIGGERED or ACKNOWLEDGED for the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolved",
- "description": "Number of alerts with status RESOLVED for the project",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "triggered",
- "description": "Number of alerts with status TRIGGERED for the project",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "AlertManagementDomainFilter",
- "description": "Filters the alerts based on given domain",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "operations",
- "description": "Alerts for operations domain",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "threat_monitoring",
- "description": "Alerts for threat monitoring domain",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AlertManagementHttpIntegration",
- "description": "An endpoint and credentials used to accept alerts for a project",
- "fields": [
- {
- "name": "active",
- "description": "Whether the endpoint is currently accepting alerts.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "apiUrl",
- "description": "URL at which Prometheus metrics can be queried to populate the metrics dashboard.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the integration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the integration.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "token",
- "description": "Token used to authenticate alert notification requests.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of integration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "AlertManagementIntegrationType",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "url",
- "description": "Endpoint which accepts alert notifications.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "AlertManagementIntegration",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "AlertManagementHttpIntegrationID",
- "description": "Identifier of AlertManagement::HttpIntegration.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INTERFACE",
- "name": "AlertManagementIntegration",
- "description": null,
- "fields": [
- {
- "name": "active",
- "description": "Whether the endpoint is currently accepting alerts.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "apiUrl",
- "description": "URL at which Prometheus metrics can be queried to populate the metrics dashboard.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the integration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the integration.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "token",
- "description": "Token used to authenticate alert notification requests.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of integration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "AlertManagementIntegrationType",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "url",
- "description": "Endpoint which accepts alert notifications.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": [
- {
- "kind": "OBJECT",
- "name": "AlertManagementHttpIntegration",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "AlertManagementPrometheusIntegration",
- "ofType": null
- }
- ]
- },
- {
- "kind": "OBJECT",
- "name": "AlertManagementIntegrationConnection",
- "description": "The connection type for AlertManagementIntegration.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "AlertManagementIntegrationEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "INTERFACE",
- "name": "AlertManagementIntegration",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AlertManagementIntegrationEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "INTERFACE",
- "name": "AlertManagementIntegration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "AlertManagementIntegrationType",
- "description": "Values of types of integrations",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "PROMETHEUS",
- "description": "Prometheus integration",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "HTTP",
- "description": "Integration with any monitoring tool",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AlertManagementPayloadAlertField",
- "description": "Parsed field from an alert used for custom mappings",
- "fields": [
- {
- "name": "label",
- "description": "Human-readable label of the payload path.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Path to value inside payload JSON.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of the parsed value.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "AlertManagementPayloadAlertFieldType",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "AlertManagementPayloadAlertFieldInput",
- "description": "Field that are available while modifying the custom mapping attributes for an HTTP integration",
- "fields": null,
- "inputFields": [
- {
- "name": "fieldName",
- "description": "A GitLab alert field name.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "AlertManagementPayloadAlertFieldName",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "path",
- "description": "Path to value inside payload JSON.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "label",
- "description": "Human-readable label of the payload path.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "type",
- "description": "Type of the parsed value.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "AlertManagementPayloadAlertFieldType",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "AlertManagementPayloadAlertFieldName",
- "description": "Values for alert field names used in the custom mapping",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "TITLE",
- "description": "The title of the incident.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DESCRIPTION",
- "description": "A high-level summary of the problem.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "START_TIME",
- "description": "The time of the incident.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "END_TIME",
- "description": "The resolved time of the incident.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SERVICE",
- "description": "The affected service.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MONITORING_TOOL",
- "description": "The name of the associated monitoring tool.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "HOSTS",
- "description": "One or more hosts, as to where this incident occurred.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SEVERITY",
- "description": "The severity of the alert.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FINGERPRINT",
- "description": "The unique identifier of the alert. This can be used to group occurrences of the same alert.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "GITLAB_ENVIRONMENT_NAME",
- "description": "The name of the associated GitLab environment.",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "AlertManagementPayloadAlertFieldType",
- "description": "Values for alert field types used in the custom mapping",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "ARRAY",
- "description": "Array field type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DATETIME",
- "description": "DateTime field type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "STRING",
- "description": "String field type",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AlertManagementPrometheusIntegration",
- "description": "An endpoint and credentials used to accept Prometheus alerts for a project",
- "fields": [
- {
- "name": "active",
- "description": "Whether the endpoint is currently accepting alerts.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "apiUrl",
- "description": "URL at which Prometheus metrics can be queried to populate the metrics dashboard.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the integration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the integration.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "token",
- "description": "Token used to authenticate alert notification requests.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of integration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "AlertManagementIntegrationType",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "url",
- "description": "Endpoint which accepts alert notifications.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "AlertManagementIntegration",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "AlertManagementSeverity",
- "description": "Alert severity values",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "CRITICAL",
- "description": "Critical severity",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "HIGH",
- "description": "High severity",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MEDIUM",
- "description": "Medium severity",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LOW",
- "description": "Low severity",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "INFO",
- "description": "Info severity",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UNKNOWN",
- "description": "Unknown severity",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "AlertManagementStatus",
- "description": "Alert status values",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "TRIGGERED",
- "description": "Triggered status",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ACKNOWLEDGED",
- "description": "Acknowledged status",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "RESOLVED",
- "description": "Resolved status",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "IGNORED",
- "description": "Ignored status",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "AlertSetAssigneesInput",
- "description": "Autogenerated input type of AlertSetAssignees",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the alert to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the alert to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsernames",
- "description": "The usernames to assign to the alert. Replaces existing assignees by default.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "operationMode",
- "description": "The operation to perform. Defaults to REPLACE.",
- "type": {
- "kind": "ENUM",
- "name": "MutationOperationMode",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AlertSetAssigneesPayload",
- "description": "Autogenerated return type of AlertSetAssignees",
- "fields": [
- {
- "name": "alert",
- "description": "The alert after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementAlert",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue created after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todo",
- "description": "The to-do item after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Todo",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "AlertTodoCreateInput",
- "description": "Autogenerated input type of AlertTodoCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the alert to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the alert to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AlertTodoCreatePayload",
- "description": "Autogenerated return type of AlertTodoCreate",
- "fields": [
- {
- "name": "alert",
- "description": "The alert after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementAlert",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue created after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todo",
- "description": "The to-do item after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Todo",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "AnalyticsDevopsAdoptionSegmentID",
- "description": "Identifier of Analytics::DevopsAdoption::Segment.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ApiFuzzingCiConfiguration",
- "description": "Data associated with configuring API fuzzing scans in GitLab CI",
- "fields": [
- {
- "name": "scanModes",
- "description": "All available scan modes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "ApiFuzzingScanMode",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "scanProfiles",
- "description": "All default scan profiles.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ApiFuzzingScanProfile",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "ApiFuzzingCiConfigurationCreateInput",
- "description": "Autogenerated input type of ApiFuzzingCiConfigurationCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "Full path of the project.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "apiSpecificationFile",
- "description": "File path or URL to the file that defines the API surface for scanning. Must be in the format specified by the `scanMode` argument.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "authPassword",
- "description": "CI variable containing the password for authenticating with the target API.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "authUsername",
- "description": "CI variable containing the username for authenticating with the target API.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "scanMode",
- "description": "The mode for API fuzzing scans.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "ApiFuzzingScanMode",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "scanProfile",
- "description": "Name of a default profile to use for scanning. Ex: Quick-10.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "target",
- "description": "URL for the target of API fuzzing scans.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ApiFuzzingCiConfigurationCreatePayload",
- "description": "Autogenerated return type of ApiFuzzingCiConfigurationCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "configurationYaml",
- "description": "A YAML snippet that can be inserted into the project's `.gitlab-ci.yml` to set up API fuzzing scans.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "gitlabCiYamlEditPath",
- "description": "The location at which the project's `.gitlab-ci.yml` file can be edited in the browser.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "ApiFuzzingScanMode",
- "description": "All possible ways to specify the API surface for an API fuzzing scan",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "HAR",
- "description": "The API surface is specified by a HAR file.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "OPENAPI",
- "description": "The API surface is specified by a OPENAPI file.",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ApiFuzzingScanProfile",
- "description": "An API Fuzzing scan profile.",
- "fields": [
- {
- "name": "description",
- "description": "A short description of the profile.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "The unique name of the profile.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "yaml",
- "description": "A syntax highlit HTML representation of the YAML.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "AvailabilityEnum",
- "description": "User availability status",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "NOT_SET",
- "description": "Not Set",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "BUSY",
- "description": "Busy",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AwardEmoji",
- "description": "An emoji awarded by a user",
- "fields": [
- {
- "name": "description",
- "description": "The emoji description.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "emoji",
- "description": "The emoji as an icon.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "The emoji name.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "unicode",
- "description": "The emoji in Unicode.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "unicodeVersion",
- "description": "The Unicode version for this emoji.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "user",
- "description": "The user who awarded the emoji.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "AwardEmojiAddInput",
- "description": "Autogenerated input type of AwardEmojiAdd",
- "fields": null,
- "inputFields": [
- {
- "name": "awardableId",
- "description": "The global ID of the awardable resource.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "AwardableID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The emoji name.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AwardEmojiAddPayload",
- "description": "Autogenerated return type of AwardEmojiAdd",
- "fields": [
- {
- "name": "awardEmoji",
- "description": "The award emoji after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AwardEmoji",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AwardEmojiConnection",
- "description": "The connection type for AwardEmoji.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "AwardEmojiEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "AwardEmoji",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AwardEmojiEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AwardEmoji",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "AwardEmojiRemoveInput",
- "description": "Autogenerated input type of AwardEmojiRemove",
- "fields": null,
- "inputFields": [
- {
- "name": "awardableId",
- "description": "The global ID of the awardable resource.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "AwardableID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The emoji name.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AwardEmojiRemovePayload",
- "description": "Autogenerated return type of AwardEmojiRemove",
- "fields": [
- {
- "name": "awardEmoji",
- "description": "The award emoji after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AwardEmoji",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "AwardEmojiToggleInput",
- "description": "Autogenerated input type of AwardEmojiToggle",
- "fields": null,
- "inputFields": [
- {
- "name": "awardableId",
- "description": "The global ID of the awardable resource.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "AwardableID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The emoji name.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AwardEmojiTogglePayload",
- "description": "Autogenerated return type of AwardEmojiToggle",
- "fields": [
- {
- "name": "awardEmoji",
- "description": "The award emoji after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AwardEmoji",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "toggledOn",
- "description": "Indicates the status of the emoji. True if the toggle awarded the emoji, and false if the toggle removed the emoji.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "AwardableID",
- "description": "Identifier of Awardable.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BaseService",
- "description": null,
- "fields": [
- {
- "name": "active",
- "description": "Indicates if the service is active.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Class name of the service.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Service",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "BigInt",
- "description": "Represents non-fractional signed whole numeric values. Since the value may exceed the size of a 32-bit integer, it's encoded as a string.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Blob",
- "description": null,
- "fields": [
- {
- "name": "flatPath",
- "description": "Flat path of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lfsOid",
- "description": "LFS ID of the blob.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mode",
- "description": "Blob mode in numeric format.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Path of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sha",
- "description": "Last commit SHA for the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of tree entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "EntryType",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webPath",
- "description": "Web path of the blob.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL of the blob.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Entry",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BlobConnection",
- "description": "The connection type for Blob.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "BlobEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Blob",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BlobEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Blob",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "BlobViewersType",
- "description": "Types of blob viewers",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "rich",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "simple",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "auxiliary",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Board",
- "description": "Represents a project or group board",
- "fields": [
- {
- "name": "assignee",
- "description": "The board assignee.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epics",
- "description": "Epics associated with board issues.",
- "args": [
- {
- "name": "issueFilters",
- "description": "Filters applied when selecting issues on the board.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "BoardIssueInput",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardEpicConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hideBacklogList",
- "description": "Whether or not backlog list is hidden.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hideClosedList",
- "description": "Whether or not closed list is hidden.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID (global ID) of the board.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iteration",
- "description": "The board iteration.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Iteration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "labels",
- "description": "Labels of the board.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "LabelConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lists",
- "description": "Lists of the board.",
- "args": [
- {
- "name": "id",
- "description": "Find a list by its global ID.",
- "type": {
- "kind": "SCALAR",
- "name": "ListID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "issueFilters",
- "description": "Filters applied when getting issue metadata in the board list.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "BoardIssueInput",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardListConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "milestone",
- "description": "The board milestone.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Milestone",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the board.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webPath",
- "description": "Web path of the board.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL of the board.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "weight",
- "description": "Weight of the board.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BoardConnection",
- "description": "The connection type for Board.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "BoardEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Board",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BoardEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Board",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BoardEpic",
- "description": "Represents an epic on an issue board",
- "fields": [
- {
- "name": "author",
- "description": "Author of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "awardEmoji",
- "description": "A list of award emojis associated with the epic.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AwardEmojiConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "children",
- "description": "Children (sub-epics) of the epic.",
- "args": [
- {
- "name": "startDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.start.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "timeframe",
- "description": "List items overlapping the given timeframe.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "Timeframe",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "IID of the epic, e.g., \"1\".",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iids",
- "description": "List of IIDs of epics, e.g., [1, 2].",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter epics by state.",
- "type": {
- "kind": "ENUM",
- "name": "EpicState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for epic title or description.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "List epics by sort order.",
- "type": {
- "kind": "ENUM",
- "name": "EpicSort",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Filter epics by author.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labelName",
- "description": "Filter epics by labels.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Filter epics by milestone title, computed from epic's issues.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iidStartsWith",
- "description": "Filter epics by IID for autocomplete.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "includeDescendantGroups",
- "description": "Include epics from descendant groups.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "true"
- },
- {
- "name": "confidential",
- "description": "Filter epics by given confidentiality.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "closedAt",
- "description": "Timestamp of when the epic was closed.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "confidential",
- "description": "Indicates if the epic is confidential.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp of when the epic was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "currentUserTodos",
- "description": "To-do items for the current user.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "State of the to-do items.",
- "type": {
- "kind": "ENUM",
- "name": "TodoStateEnum",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TodoConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descendantCounts",
- "description": "Number of open and closed descendant epics and issues.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicDescendantCount",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descendantWeightSum",
- "description": "Total weight of open and closed issues in the epic and its descendants.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicDescendantWeights",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussions",
- "description": "All discussions on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiscussionConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "downvotes",
- "description": "Number of downvotes the epic has received.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dueDate",
- "description": "Due date of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dueDateFixed",
- "description": "Fixed due date of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dueDateFromMilestones",
- "description": "Inherited due date of the epic from milestones.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dueDateIsFixed",
- "description": "Indicates if the due date has been manually set.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "events",
- "description": "A list of events associated with the object.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EventConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "group",
- "description": "Group to which the epic belongs.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Group",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hasChildren",
- "description": "Indicates if the epic has children.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hasIssues",
- "description": "Indicates if the epic has direct issues.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hasParent",
- "description": "Indicates if the epic has a parent epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "healthStatus",
- "description": "Current health status of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicHealthStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iid",
- "description": "Internal ID of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issues",
- "description": "A list of issues associated with the epic.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicIssueConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "labels",
- "description": "Labels assigned to the epic.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "LabelConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notes",
- "description": "All notes on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NoteConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "parent",
- "description": "Parent epic of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "participants",
- "description": "List of participants for the epic.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UserConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "reference",
- "description": "Internal reference of the epic. Returned in shortened format by default.",
- "args": [
- {
- "name": "full",
- "description": "Indicates if the reference should be returned in full.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "relationPath",
- "description": "URI path of the epic-issue relationship.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "relativePosition",
- "description": "The relative position of the epic in the epic tree.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startDate",
- "description": "Start date of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startDateFixed",
- "description": "Fixed start date of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startDateFromMilestones",
- "description": "Inherited start date of the epic from milestones.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startDateIsFixed",
- "description": "Indicates if the start date has been manually set.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "State of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "EpicState",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "subscribed",
- "description": "Indicates the currently logged in user is subscribed to the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp of when the epic was updated.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "upvotes",
- "description": "Number of upvotes the epic has received.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userDiscussionsCount",
- "description": "Number of user discussions in the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userNotesCount",
- "description": "Number of user notes of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "EpicPermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPreferences",
- "description": "User preferences for the epic on the issue board.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardEpicUserPreferences",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webPath",
- "description": "Web path of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Noteable",
- "ofType": null
- },
- {
- "kind": "INTERFACE",
- "name": "CurrentUserTodos",
- "ofType": null
- },
- {
- "kind": "INTERFACE",
- "name": "Eventable",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BoardEpicConnection",
- "description": "The connection type for BoardEpic.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "BoardEpicEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "BoardEpic",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BoardEpicEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardEpic",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BoardEpicUserPreferences",
- "description": "Represents user preferences for a board epic",
- "fields": [
- {
- "name": "collapsed",
- "description": "Indicates epic should be displayed as collapsed.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "BoardID",
- "description": "Identifier of Board.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "BoardIssueInput",
- "description": null,
- "fields": null,
- "inputFields": [
- {
- "name": "labelName",
- "description": "Filter by label name.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Filter by milestone title.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsername",
- "description": "Filter by assignee username.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Filter by author username.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "releaseTag",
- "description": "Filter by release tag.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "myReactionEmoji",
- "description": "Filter by reaction emoji.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "epicId",
- "description": "Filter by epic ID. Incompatible with epicWildcardId.",
- "type": {
- "kind": "SCALAR",
- "name": "EpicID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iterationTitle",
- "description": "Filter by iteration title.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "weight",
- "description": "Filter by weight.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "not",
- "description": "List of negated params. Warning: this argument is experimental and a subject to change in future.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "NegatedBoardIssueInput",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for issue title or description.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "epicWildcardId",
- "description": "Filter by epic ID wildcard. Incompatible with epicId.",
- "type": {
- "kind": "ENUM",
- "name": "EpicWildcardId",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iterationWildcardId",
- "description": "Filter by iteration ID wildcard.",
- "type": {
- "kind": "ENUM",
- "name": "IterationWildcardId",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BoardList",
- "description": "Represents a list for an issue board",
- "fields": [
- {
- "name": "assignee",
- "description": "Assignee in the list.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "collapsed",
- "description": "Indicates if list is collapsed for this user.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID (global ID) of the list.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issues",
- "description": "Board issues.",
- "args": [
- {
- "name": "filters",
- "description": "Filters applied when selecting issues in the board list.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "BoardIssueInput",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issuesCount",
- "description": "Count of issues in the list.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iteration",
- "description": "Iteration of the list.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Iteration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "label",
- "description": "Label of the list.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Label",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "limitMetric",
- "description": "The current limit metric for the list.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "ListLimitMetric",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "listType",
- "description": "Type of the list.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "maxIssueCount",
- "description": "Maximum number of issues in the list.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "maxIssueWeight",
- "description": "Maximum weight of issues in the list.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "milestone",
- "description": "Milestone of the list.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Milestone",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "position",
- "description": "Position of list within the board.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the list.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "totalWeight",
- "description": "Total weight of all issues in the list.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BoardListConnection",
- "description": "The connection type for BoardList.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "BoardListEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "BoardList",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "BoardListCreateInput",
- "description": "Autogenerated input type of BoardListCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "backlog",
- "description": "Create the backlog list.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labelId",
- "description": "Global ID of an existing label.",
- "type": {
- "kind": "SCALAR",
- "name": "LabelID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "boardId",
- "description": "Global ID of the issue board to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "BoardID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "milestoneId",
- "description": "Global ID of an existing milestone.",
- "type": {
- "kind": "SCALAR",
- "name": "MilestoneID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iterationId",
- "description": "Global ID of an existing iteration.",
- "type": {
- "kind": "SCALAR",
- "name": "IterationID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeId",
- "description": "Global ID of an existing user.",
- "type": {
- "kind": "SCALAR",
- "name": "UserID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BoardListCreatePayload",
- "description": "Autogenerated return type of BoardListCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "list",
- "description": "Issue list in the issue board.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardList",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BoardListEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardList",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "BoardListUpdateLimitMetricsInput",
- "description": "Autogenerated input type of BoardListUpdateLimitMetrics",
- "fields": null,
- "inputFields": [
- {
- "name": "listId",
- "description": "The global ID of the list.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ListID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "limitMetric",
- "description": "The new limit metric type for the list.",
- "type": {
- "kind": "ENUM",
- "name": "ListLimitMetric",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "maxIssueCount",
- "description": "The new maximum issue count limit.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "maxIssueWeight",
- "description": "The new maximum issue weight limit.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BoardListUpdateLimitMetricsPayload",
- "description": "Autogenerated return type of BoardListUpdateLimitMetrics",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "list",
- "description": "The updated list.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardList",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "BoardsEpicBoardID",
- "description": "Identifier of Boards::EpicBoard.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "BoardsEpicListID",
- "description": "Identifier of Boards::EpicList.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "Boolean",
- "description": "Represents `true` or `false` values.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Branch",
- "description": null,
- "fields": [
- {
- "name": "commit",
- "description": "Commit for the branch.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Commit",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the branch.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BurnupChartDailyTotals",
- "description": "Represents the total number of issues and their weights for a particular day",
- "fields": [
- {
- "name": "completedCount",
- "description": "Number of closed issues as of this day.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "completedWeight",
- "description": "Total weight of closed issues as of this day.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "date",
- "description": "Date for burnup totals.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "scopeCount",
- "description": "Number of issues as of this day.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "scopeWeight",
- "description": "Total weight of issues as of this day.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiApplicationSettings",
- "description": null,
- "fields": [
- {
- "name": "keepLatestArtifact",
- "description": "Whether to keep the latest jobs artifacts.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiBuildNeed",
- "description": null,
- "fields": [
- {
- "name": "name",
- "description": "Name of the job we need to complete.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiBuildNeedConnection",
- "description": "The connection type for CiBuildNeed.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiBuildNeedEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiBuildNeed",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiBuildNeedEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiBuildNeed",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CiCdSettingsUpdateInput",
- "description": "Autogenerated input type of CiCdSettingsUpdate",
- "fields": null,
- "inputFields": [
- {
- "name": "fullPath",
- "description": "Full Path of the project the settings belong to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "keepLatestArtifact",
- "description": "Indicates if the latest artifact should be kept for this project.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiCdSettingsUpdatePayload",
- "description": "Autogenerated return type of CiCdSettingsUpdate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfig",
- "description": null,
- "fields": [
- {
- "name": "errors",
- "description": "Linting errors.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergedYaml",
- "description": "Merged CI configuration YAML.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "stages",
- "description": "Stages of the pipeline.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiConfigStageConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "status",
- "description": "Status of linting, can be either valid or invalid.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "CiConfigStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfigGroup",
- "description": null,
- "fields": [
- {
- "name": "jobs",
- "description": "Jobs in group.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiConfigJobConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the job group.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "size",
- "description": "Size of the job group.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfigGroupConnection",
- "description": "The connection type for CiConfigGroup.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiConfigGroupEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiConfigGroup",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfigGroupEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiConfigGroup",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfigJob",
- "description": null,
- "fields": [
- {
- "name": "afterScript",
- "description": "Override a set of commands that are executed after the job.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "allowFailure",
- "description": "Allow job to fail.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "beforeScript",
- "description": "Override a set of commands that are executed before the job.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "environment",
- "description": "Name of an environment to which the job deploys.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "except",
- "description": "Limit when jobs are not created.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiConfigJobRestriction",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "groupName",
- "description": "Name of the job group.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the job.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "needs",
- "description": "Builds that must complete before the jobs run.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiConfigNeedConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "only",
- "description": "Jobs are created when these conditions do not apply.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiConfigJobRestriction",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "script",
- "description": "Shell script that is executed by a runner.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "stage",
- "description": "Name of the job stage.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tags",
- "description": "List of tags that are used to select a runner.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "when",
- "description": "When to run the job.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfigJobConnection",
- "description": "The connection type for CiConfigJob.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiConfigJobEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiConfigJob",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfigJobEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiConfigJob",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfigJobRestriction",
- "description": null,
- "fields": [
- {
- "name": "refs",
- "description": "The Git refs the job restriction applies to.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfigNeed",
- "description": null,
- "fields": [
- {
- "name": "name",
- "description": "Name of the need.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfigNeedConnection",
- "description": "The connection type for CiConfigNeed.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiConfigNeedEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiConfigNeed",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfigNeedEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiConfigNeed",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfigStage",
- "description": null,
- "fields": [
- {
- "name": "groups",
- "description": "Groups of jobs for the stage.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiConfigGroupConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the stage.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfigStageConnection",
- "description": "The connection type for CiConfigStage.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiConfigStageEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiConfigStage",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfigStageEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiConfigStage",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "CiConfigStatus",
- "description": "Values for YAML processor result",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "VALID",
- "description": "The configuration file is valid",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "INVALID",
- "description": "The configuration file is not valid",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiGroup",
- "description": null,
- "fields": [
- {
- "name": "detailedStatus",
- "description": "Detailed status of the group.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DetailedStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "jobs",
- "description": "Jobs in group.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiJobConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the job group.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "size",
- "description": "Size of the group.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiGroupConnection",
- "description": "The connection type for CiGroup.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiGroupEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiGroup",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiGroupEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiGroup",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiJob",
- "description": null,
- "fields": [
- {
- "name": "artifacts",
- "description": "Artifacts generated by the job.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiJobArtifactConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "detailedStatus",
- "description": "Detailed status of the job.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DetailedStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the job.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "needs",
- "description": "References to builds that must complete before the jobs run.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiBuildNeedConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipeline",
- "description": "Pipeline the job belongs to.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Pipeline",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "scheduledAt",
- "description": "Schedule for the build.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiJobArtifact",
- "description": null,
- "fields": [
- {
- "name": "downloadPath",
- "description": "URL for downloading the artifact's file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fileType",
- "description": "File type of the artifact.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "JobArtifactFileType",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiJobArtifactConnection",
- "description": "The connection type for CiJobArtifact.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiJobArtifactEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiJobArtifact",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiJobArtifactEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiJobArtifact",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiJobConnection",
- "description": "The connection type for CiJob.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiJobEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiJob",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiJobEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiJob",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "CiPipelineID",
- "description": "Identifier of Ci::Pipeline.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiStage",
- "description": null,
- "fields": [
- {
- "name": "detailedStatus",
- "description": "Detailed status of the stage.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DetailedStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "groups",
- "description": "Group of jobs for the stage.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiGroupConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the stage.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiStageConnection",
- "description": "The connection type for CiStage.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiStageEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiStage",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiStageEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiStage",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ClusterAgent",
- "description": null,
- "fields": [
- {
- "name": "createdAt",
- "description": "Timestamp the cluster agent was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdByUser",
- "description": "User object, containing information about the person who created the agent.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the cluster agent.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the cluster agent.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "The project this cluster agent is associated with.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tokens",
- "description": "Tokens associated with the cluster agent.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ClusterAgentTokenConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp the cluster agent was updated.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ClusterAgentConnection",
- "description": "The connection type for ClusterAgent.",
- "fields": [
- {
- "name": "count",
- "description": "Total count of collection.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ClusterAgentEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ClusterAgent",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "ClusterAgentDeleteInput",
- "description": "Autogenerated input type of ClusterAgentDelete",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "Global ID of the cluster agent that will be deleted.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ClustersAgentID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ClusterAgentDeletePayload",
- "description": "Autogenerated return type of ClusterAgentDelete",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ClusterAgentEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ClusterAgent",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ClusterAgentToken",
- "description": null,
- "fields": [
- {
- "name": "clusterAgent",
- "description": "Cluster agent this token is associated with.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ClusterAgent",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp the token was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdByUser",
- "description": "The user who created the token.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "Global ID of the token.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ClustersAgentTokenID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ClusterAgentTokenConnection",
- "description": "The connection type for ClusterAgentToken.",
- "fields": [
- {
- "name": "count",
- "description": "Total count of collection.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ClusterAgentTokenEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ClusterAgentToken",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "ClusterAgentTokenCreateInput",
- "description": "Autogenerated input type of ClusterAgentTokenCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "clusterAgentId",
- "description": "Global ID of the cluster agent that will be associated with the new token.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ClustersAgentID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ClusterAgentTokenCreatePayload",
- "description": "Autogenerated return type of ClusterAgentTokenCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "secret",
- "description": "Token secret value. Make sure you save it - you won't be able to access it again.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "token",
- "description": "Token created after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ClusterAgentToken",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "ClusterAgentTokenDeleteInput",
- "description": "Autogenerated input type of ClusterAgentTokenDelete",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "Global ID of the cluster agent token that will be deleted.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ClustersAgentTokenID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ClusterAgentTokenDeletePayload",
- "description": "Autogenerated return type of ClusterAgentTokenDelete",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ClusterAgentTokenEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ClusterAgentToken",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "ClustersAgentID",
- "description": "Identifier of Clusters::Agent.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "ClustersAgentTokenID",
- "description": "Identifier of Clusters::AgentToken.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "ClustersClusterID",
- "description": "Identifier of Clusters::Cluster.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CodeCoverageActivity",
- "description": "Represents the code coverage activity for a group",
- "fields": [
- {
- "name": "averageCoverage",
- "description": "Average percentage of the different code coverage results available for the group.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "coverageCount",
- "description": "Number of different code coverage results available for the group.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "date",
- "description": "Date when the code coverage was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Date",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "projectCount",
- "description": "Number of projects with code coverage results for the group.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CodeCoverageActivityConnection",
- "description": "The connection type for CodeCoverageActivity.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CodeCoverageActivityEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CodeCoverageActivity",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CodeCoverageActivityEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CodeCoverageActivity",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CodeCoverageSummary",
- "description": "Represents the code coverage summary for a project",
- "fields": [
- {
- "name": "averageCoverage",
- "description": "Average percentage of the different code coverage results available for the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "coverageCount",
- "description": "Number of different code coverage results available.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastUpdatedOn",
- "description": "Latest date when the code coverage was created for the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Date",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Commit",
- "description": null,
- "fields": [
- {
- "name": "author",
- "description": "Author of the commit.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "authorGravatar",
- "description": "Commit authors gravatar.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "authorName",
- "description": "Commit authors name.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "authoredDate",
- "description": "Timestamp of when the commit was authored.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the commit message.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descriptionHtml",
- "description": "The GitLab Flavored Markdown rendering of `description`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID (global ID) of the commit.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "message",
- "description": "Raw commit message.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelines",
- "description": "Pipelines of the commit ordered latest first.",
- "args": [
- {
- "name": "status",
- "description": "Filter pipelines by their status.",
- "type": {
- "kind": "ENUM",
- "name": "PipelineStatusEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "ref",
- "description": "Filter pipelines by the ref they are run for.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sha",
- "description": "Filter pipelines by the sha of the commit they are run for.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PipelineConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sha",
- "description": "SHA1 ID of the commit.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "shortId",
- "description": "Short SHA1 ID of the commit.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "signatureHtml",
- "description": "Rendered HTML of the commit signature.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the commit message.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "titleHtml",
- "description": "The GitLab Flavored Markdown rendering of `title`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webPath",
- "description": "Web path of the commit.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL of the commit.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CommitAction",
- "description": null,
- "fields": null,
- "inputFields": [
- {
- "name": "action",
- "description": "The action to perform, create, delete, move, update, chmod.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "CommitActionMode",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "filePath",
- "description": "Full path to the file.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "content",
- "description": "Content of the file.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "previousPath",
- "description": "Original full path to the file being moved.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "lastCommitId",
- "description": "Last known file commit ID.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "executeFilemode",
- "description": "Enables/disables the execute flag on the file.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "encoding",
- "description": "Encoding of the file. Default is text.",
- "type": {
- "kind": "ENUM",
- "name": "CommitEncoding",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "CommitActionMode",
- "description": "Mode of a commit action",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "CREATE",
- "description": "Create command",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DELETE",
- "description": "Delete command",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MOVE",
- "description": "Move command",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UPDATE",
- "description": "Update command",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CHMOD",
- "description": "Chmod command",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CommitConnection",
- "description": "The connection type for Commit.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CommitEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Commit",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CommitCreateInput",
- "description": "Autogenerated input type of CommitCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "Project full path the branch is associated with.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "branch",
- "description": "Name of the branch to commit into, it can be a new branch.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "startBranch",
- "description": "If on a new branch, name of the original branch.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "message",
- "description": "Raw commit message.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "actions",
- "description": "Array of action hashes to commit as a batch.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CommitAction",
- "ofType": null
- }
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CommitCreatePayload",
- "description": "Autogenerated return type of CommitCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "commit",
- "description": "The commit after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Commit",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CommitEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Commit",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "CommitEncoding",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "TEXT",
- "description": "Text encoding",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "BASE64",
- "description": "Base64 encoding",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ComplianceFramework",
- "description": "Represents a ComplianceFramework associated with a Project",
- "fields": [
- {
- "name": "color",
- "description": "Hexadecimal representation of compliance framework's label color.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the compliance framework.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "Compliance framework ID.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the compliance framework.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineConfigurationFullPath",
- "description": "Full path of the compliance pipeline configuration stored in a project repository, such as `.gitlab/.compliance-gitlab-ci.yml@compliance/hippa`.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ComplianceFrameworkConnection",
- "description": "The connection type for ComplianceFramework.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ComplianceFrameworkEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ComplianceFramework",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ComplianceFrameworkEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ComplianceFramework",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "ComplianceFrameworkInput",
- "description": null,
- "fields": null,
- "inputFields": [
- {
- "name": "name",
- "description": "New name for the compliance framework.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "New description for the compliance framework.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "color",
- "description": "New color representation of the compliance framework in hex format. e.g. #FCA121.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "pipelineConfigurationFullPath",
- "description": "Full path of the compliance pipeline configuration stored in a project repository, such as `.gitlab/.compliance-gitlab-ci.yml@compliance/hippa`.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "ComplianceManagementFrameworkID",
- "description": "Identifier of ComplianceManagement::Framework.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ComposerMetadata",
- "description": "Composer metadata",
- "fields": [
- {
- "name": "composerJson",
- "description": "Data of the Composer JSON file.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PackageComposerJsonType",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "targetSha",
- "description": "Target SHA of the package.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "ConfigureSastInput",
- "description": "Autogenerated input type of ConfigureSast",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "Full path of the project.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "configuration",
- "description": "SAST CI configuration for the project.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "SastCiConfigurationInput",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ConfigureSastPayload",
- "description": "Autogenerated return type of ConfigureSast",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "status",
- "description": "Status of creating the commit for the supplied SAST CI configuration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "successPath",
- "description": "Redirect path to use when the response is successful.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ContainerExpirationPolicy",
- "description": "A tag expiration policy designed to keep only the images that matter most",
- "fields": [
- {
- "name": "cadence",
- "description": "This container expiration policy schedule.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "ContainerExpirationPolicyCadenceEnum",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp of when the container expiration policy was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "enabled",
- "description": "Indicates whether this container expiration policy is enabled.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "keepN",
- "description": "Number of tags to retain.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "ContainerExpirationPolicyKeepEnum",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nameRegex",
- "description": "Tags with names matching this regex pattern will expire.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "UntrustedRegexp",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nameRegexKeep",
- "description": "Tags with names matching this regex pattern will be preserved.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "UntrustedRegexp",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nextRunAt",
- "description": "Next time that this container expiration policy will get executed.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "olderThan",
- "description": "Tags older that this will expire.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "ContainerExpirationPolicyOlderThanEnum",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp of when the container expiration policy was updated.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "ContainerExpirationPolicyCadenceEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "EVERY_DAY",
- "description": "Every day",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "EVERY_WEEK",
- "description": "Every week",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "EVERY_TWO_WEEKS",
- "description": "Every two weeks",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "EVERY_MONTH",
- "description": "Every month",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "EVERY_THREE_MONTHS",
- "description": "Every three months",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "ContainerExpirationPolicyKeepEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "ONE_TAG",
- "description": "1 tag per image name",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FIVE_TAGS",
- "description": "5 tags per image name",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "TEN_TAGS",
- "description": "10 tags per image name",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "TWENTY_FIVE_TAGS",
- "description": "25 tags per image name",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FIFTY_TAGS",
- "description": "50 tags per image name",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ONE_HUNDRED_TAGS",
- "description": "100 tags per image name",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "ContainerExpirationPolicyOlderThanEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "SEVEN_DAYS",
- "description": "7 days until tags are automatically removed",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FOURTEEN_DAYS",
- "description": "14 days until tags are automatically removed",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "THIRTY_DAYS",
- "description": "30 days until tags are automatically removed",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "NINETY_DAYS",
- "description": "90 days until tags are automatically removed",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ContainerRepository",
- "description": "A container repository",
- "fields": [
- {
- "name": "canDelete",
- "description": "Can the current user delete the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp when the container repository was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "expirationPolicyCleanupStatus",
- "description": "The tags cleanup status for the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "ContainerRepositoryCleanupStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "expirationPolicyStartedAt",
- "description": "Timestamp when the cleanup done by the expiration policy was started on the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "location",
- "description": "URL of the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Path of the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "Project of the container registry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "status",
- "description": "Status of the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "ContainerRepositoryStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tagsCount",
- "description": "Number of tags associated with this image.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp when the container repository was updated.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "ContainerRepositoryCleanupStatus",
- "description": "Status of the tags cleanup of a container repository",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "UNSCHEDULED",
- "description": "The tags cleanup is not scheduled. This is the default state.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SCHEDULED",
- "description": "The tags cleanup is scheduled and is going to be executed shortly.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UNFINISHED",
- "description": "The tags cleanup has been partially executed. There are still remaining tags to delete.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ONGOING",
- "description": "The tags cleanup is ongoing.",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ContainerRepositoryConnection",
- "description": "The connection type for ContainerRepository.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ContainerRepositoryEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ContainerRepository",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ContainerRepositoryDetails",
- "description": "Details of a container repository",
- "fields": [
- {
- "name": "canDelete",
- "description": "Can the current user delete the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp when the container repository was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "expirationPolicyCleanupStatus",
- "description": "The tags cleanup status for the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "ContainerRepositoryCleanupStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "expirationPolicyStartedAt",
- "description": "Timestamp when the cleanup done by the expiration policy was started on the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "location",
- "description": "URL of the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Path of the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "Project of the container registry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "status",
- "description": "Status of the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "ContainerRepositoryStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tags",
- "description": "Tags of the container repository.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ContainerRepositoryTagConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tagsCount",
- "description": "Number of tags associated with this image.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp when the container repository was updated.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ContainerRepositoryEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ContainerRepository",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "ContainerRepositoryID",
- "description": "Identifier of ContainerRepository.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "ContainerRepositorySort",
- "description": "Values for sorting container repositories",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "updated_desc",
- "description": "Updated at descending order",
- "isDeprecated": true,
- "deprecationReason": "Use UPDATED_DESC. Deprecated in 13.5."
- },
- {
- "name": "updated_asc",
- "description": "Updated at ascending order",
- "isDeprecated": true,
- "deprecationReason": "Use UPDATED_ASC. Deprecated in 13.5."
- },
- {
- "name": "created_desc",
- "description": "Created at descending order",
- "isDeprecated": true,
- "deprecationReason": "Use CREATED_DESC. Deprecated in 13.5."
- },
- {
- "name": "created_asc",
- "description": "Created at ascending order",
- "isDeprecated": true,
- "deprecationReason": "Use CREATED_ASC. Deprecated in 13.5."
- },
- {
- "name": "UPDATED_DESC",
- "description": "Updated at descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UPDATED_ASC",
- "description": "Updated at ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED_DESC",
- "description": "Created at descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED_ASC",
- "description": "Created at ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "NAME_ASC",
- "description": "Name by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "NAME_DESC",
- "description": "Name by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "ContainerRepositoryStatus",
- "description": "Status of a container repository",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "DELETE_SCHEDULED",
- "description": "Delete Scheduled status.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DELETE_FAILED",
- "description": "Delete Failed status.",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ContainerRepositoryTag",
- "description": "A tag from a container repository",
- "fields": [
- {
- "name": "canDelete",
- "description": "Can the current user delete this tag.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp when the tag was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "digest",
- "description": "Digest of the tag.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "location",
- "description": "URL of the tag.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the tag.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Path of the tag.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "revision",
- "description": "Revision of the tag.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "shortRevision",
- "description": "Short revision of the tag.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "totalSize",
- "description": "The size of the tag.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "BigInt",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ContainerRepositoryTagConnection",
- "description": "The connection type for ContainerRepositoryTag.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ContainerRepositoryTagEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ContainerRepositoryTag",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ContainerRepositoryTagEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ContainerRepositoryTag",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateAlertIssueInput",
- "description": "Autogenerated input type of CreateAlertIssue",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the alert to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the alert to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateAlertIssuePayload",
- "description": "Autogenerated return type of CreateAlertIssue",
- "fields": [
- {
- "name": "alert",
- "description": "The alert after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementAlert",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue created after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todo",
- "description": "The to-do item after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Todo",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateAnnotationInput",
- "description": "Autogenerated input type of CreateAnnotation",
- "fields": null,
- "inputFields": [
- {
- "name": "environmentId",
- "description": "The global ID of the environment to add an annotation to.",
- "type": {
- "kind": "SCALAR",
- "name": "EnvironmentID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clusterId",
- "description": "The global ID of the cluster to add an annotation to.",
- "type": {
- "kind": "SCALAR",
- "name": "ClustersClusterID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "startingAt",
- "description": "Timestamp indicating starting moment to which the annotation relates.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "endingAt",
- "description": "Timestamp indicating ending moment to which the annotation relates.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "dashboardPath",
- "description": "The path to a file defining the dashboard on which the annotation should be added.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "The description of the annotation.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateAnnotationPayload",
- "description": "Autogenerated return type of CreateAnnotation",
- "fields": [
- {
- "name": "annotation",
- "description": "The created annotation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MetricsDashboardAnnotation",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateBoardInput",
- "description": "Autogenerated input type of CreateBoard",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "Full path of the project with which the resource is associated.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "groupPath",
- "description": "Full path of the group with which the resource is associated.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The board name.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "hideBacklogList",
- "description": "Whether or not backlog list is hidden.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "hideClosedList",
- "description": "Whether or not closed list is hidden.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeId",
- "description": "The ID of user to be assigned to the board.",
- "type": {
- "kind": "SCALAR",
- "name": "UserID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "milestoneId",
- "description": "The ID of milestone to be assigned to the board.",
- "type": {
- "kind": "SCALAR",
- "name": "MilestoneID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iterationId",
- "description": "The ID of iteration to be assigned to the board.",
- "type": {
- "kind": "SCALAR",
- "name": "IterationID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "weight",
- "description": "The weight value to be assigned to the board.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labels",
- "description": "Labels of the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "labelIds",
- "description": "The IDs of labels to be added to the board.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "LabelID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateBoardPayload",
- "description": "Autogenerated return type of CreateBoard",
- "fields": [
- {
- "name": "board",
- "description": "The board after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Board",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateBranchInput",
- "description": "Autogenerated input type of CreateBranch",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "Project full path the branch is associated with.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "Name of the branch.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "ref",
- "description": "Branch name or commit SHA to create branch from.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateBranchPayload",
- "description": "Autogenerated return type of CreateBranch",
- "fields": [
- {
- "name": "branch",
- "description": "Branch after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Branch",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateClusterAgentInput",
- "description": "Autogenerated input type of CreateClusterAgent",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "Full path of the associated project for this cluster agent.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "Name of the cluster agent.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateClusterAgentPayload",
- "description": "Autogenerated return type of CreateClusterAgent",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clusterAgent",
- "description": "Cluster agent created after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ClusterAgent",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateComplianceFrameworkInput",
- "description": "Autogenerated input type of CreateComplianceFramework",
- "fields": null,
- "inputFields": [
- {
- "name": "namespacePath",
- "description": "Full path of the namespace to add the compliance framework to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "params",
- "description": "Parameters to update the compliance framework with.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "ComplianceFrameworkInput",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateComplianceFrameworkPayload",
- "description": "Autogenerated return type of CreateComplianceFramework",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "framework",
- "description": "The created compliance framework.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ComplianceFramework",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateCustomEmojiInput",
- "description": "Autogenerated input type of CreateCustomEmoji",
- "fields": null,
- "inputFields": [
- {
- "name": "groupPath",
- "description": "Namespace full path the emoji is associated with.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "Name of the emoji.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "url",
- "description": "Location of the emoji file.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateCustomEmojiPayload",
- "description": "Autogenerated return type of CreateCustomEmoji",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "customEmoji",
- "description": "The new custom emoji.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CustomEmoji",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateDevopsAdoptionSegmentInput",
- "description": "Autogenerated input type of CreateDevopsAdoptionSegment",
- "fields": null,
- "inputFields": [
- {
- "name": "namespaceId",
- "description": "Namespace ID to set for the segment.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "NamespaceID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateDevopsAdoptionSegmentPayload",
- "description": "Autogenerated return type of CreateDevopsAdoptionSegment",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "segment",
- "description": "The segment after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DevopsAdoptionSegment",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateDiffNoteInput",
- "description": "Autogenerated input type of CreateDiffNote",
- "fields": null,
- "inputFields": [
- {
- "name": "noteableId",
- "description": "The global ID of the resource to add a note to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "NoteableID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "body",
- "description": "Content of the note.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "confidential",
- "description": "The confidentiality flag of a note. Default is false.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "position",
- "description": "The position of this note on a diff.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DiffPositionInput",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateDiffNotePayload",
- "description": "Autogenerated return type of CreateDiffNote",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "note",
- "description": "The note after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Note",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateEpicInput",
- "description": "Autogenerated input type of CreateEpic",
- "fields": null,
- "inputFields": [
- {
- "name": "groupPath",
- "description": "The group the epic to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "The title of the epic.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "The description of the epic.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "confidential",
- "description": "Indicates if the epic is confidential.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "startDateFixed",
- "description": "The start date of the epic.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "dueDateFixed",
- "description": "The end date of the epic.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "startDateIsFixed",
- "description": "Indicates start date should be sourced from start_date_fixed field not the issue milestones.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "dueDateIsFixed",
- "description": "Indicates end date should be sourced from due_date_fixed field not the issue milestones.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "addLabelIds",
- "description": "The IDs of labels to be added to the epic.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "removeLabelIds",
- "description": "The IDs of labels to be removed from the epic.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateEpicPayload",
- "description": "Autogenerated return type of CreateEpic",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epic",
- "description": "The created epic.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateImageDiffNoteInput",
- "description": "Autogenerated input type of CreateImageDiffNote",
- "fields": null,
- "inputFields": [
- {
- "name": "noteableId",
- "description": "The global ID of the resource to add a note to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "NoteableID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "body",
- "description": "Content of the note.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "confidential",
- "description": "The confidentiality flag of a note. Default is false.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "position",
- "description": "The position of this note on a diff.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DiffImagePositionInput",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateImageDiffNotePayload",
- "description": "Autogenerated return type of CreateImageDiffNote",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "note",
- "description": "The note after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Note",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateIssueInput",
- "description": "Autogenerated input type of CreateIssue",
- "fields": null,
- "inputFields": [
- {
- "name": "description",
- "description": "Description of the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "dueDate",
- "description": "Due date of the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "confidential",
- "description": "Indicates the issue is confidential.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "locked",
- "description": "Indicates discussion is locked on the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "projectPath",
- "description": "Project full path the issue is associated with.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID (internal ID) of a project issue. Only admins and project owners can modify.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "Title of the issue.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "milestoneId",
- "description": "The ID of the milestone to assign to the issue. On update milestone will be removed if set to null.",
- "type": {
- "kind": "SCALAR",
- "name": "MilestoneID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labels",
- "description": "Labels of the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "labelIds",
- "description": "The IDs of labels to be added to the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "LabelID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp when the issue was created. Available only for admins and project owners.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "mergeRequestToResolveDiscussionsOf",
- "description": "The IID of a merge request for which to resolve discussions.",
- "type": {
- "kind": "SCALAR",
- "name": "MergeRequestID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "discussionToResolve",
- "description": "The ID of a discussion to resolve. Also pass `merge_request_to_resolve_discussions_of`.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeIds",
- "description": "The array of user IDs to assign to the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "UserID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "healthStatus",
- "description": "The desired health status.",
- "type": {
- "kind": "ENUM",
- "name": "HealthStatus",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "weight",
- "description": "The weight of the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "epicId",
- "description": "The ID of an epic to associate the issue with.",
- "type": {
- "kind": "SCALAR",
- "name": "EpicID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateIssuePayload",
- "description": "Autogenerated return type of CreateIssue",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateIterationInput",
- "description": "Autogenerated input type of CreateIteration",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "Full path of the project with which the resource is associated.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "groupPath",
- "description": "Full path of the group with which the resource is associated.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "The title of the iteration.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "The description of the iteration.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "startDate",
- "description": "The start date of the iteration.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "dueDate",
- "description": "The end date of the iteration.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateIterationPayload",
- "description": "Autogenerated return type of CreateIteration",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iteration",
- "description": "The created iteration.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Iteration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateNoteInput",
- "description": "Autogenerated input type of CreateNote",
- "fields": null,
- "inputFields": [
- {
- "name": "noteableId",
- "description": "The global ID of the resource to add a note to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "NoteableID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "body",
- "description": "Content of the note.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "confidential",
- "description": "The confidentiality flag of a note. Default is false.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "discussionId",
- "description": "The global ID of the discussion this note is in reply to.",
- "type": {
- "kind": "SCALAR",
- "name": "DiscussionID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateNotePayload",
- "description": "Autogenerated return type of CreateNote",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "note",
- "description": "The note after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Note",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateRequirementInput",
- "description": "Autogenerated input type of CreateRequirement",
- "fields": null,
- "inputFields": [
- {
- "name": "title",
- "description": "Title of the requirement.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "Description of the requirement.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "projectPath",
- "description": "Full project path the requirement is associated with.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateRequirementPayload",
- "description": "Autogenerated return type of CreateRequirement",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "requirement",
- "description": "Requirement after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Requirement",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateSnippetInput",
- "description": "Autogenerated input type of CreateSnippet",
- "fields": null,
- "inputFields": [
- {
- "name": "captchaResponse",
- "description": "A valid CAPTCHA response value obtained by using the provided captchaSiteKey with a CAPTCHA API to present a challenge to be solved on the client. Required to resubmit if the previous operation returned \"NeedsCaptchaResponse: true\".",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "spamLogId",
- "description": "The spam log ID which must be passed along with a valid CAPTCHA response for the operation to be completed. Required to resubmit if the previous operation returned \"NeedsCaptchaResponse: true\".",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "Title of the snippet.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "Description of the snippet.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "visibilityLevel",
- "description": "The visibility level of the snippet.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VisibilityLevelsEnum",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "projectPath",
- "description": "The project full path the snippet is associated with.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "uploadedFiles",
- "description": "The paths to files uploaded in the snippet description.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "blobActions",
- "description": "Actions to perform over the snippet repository and blobs.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "SnippetBlobActionInputType",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateSnippetPayload",
- "description": "Autogenerated return type of CreateSnippet",
- "fields": [
- {
- "name": "captchaSiteKey",
- "description": "The CAPTCHA site key which must be used to render a challenge for the user to solve to obtain a valid captchaResponse value. Included only when an operation was not completed because \"NeedsCaptchaResponse\" is true.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "needsCaptchaResponse",
- "description": "Indicates whether the operation was detected as possible spam and not completed. If CAPTCHA is enabled, the request must be resubmitted with a valid CAPTCHA response and spam_log_id included for the operation to be completed. Included only when an operation was not completed because \"NeedsCaptchaResponse\" is true.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "snippet",
- "description": "The snippet after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Snippet",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "spam",
- "description": "Indicates whether the operation was detected as definite spam. There is no option to resubmit the request with a CAPTCHA response.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "spamLogId",
- "description": "The spam log ID which must be passed along with a valid CAPTCHA response for an operation to be completed. Included only when an operation was not completed because \"NeedsCaptchaResponse\" is true.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateTestCaseInput",
- "description": "Autogenerated input type of CreateTestCase",
- "fields": null,
- "inputFields": [
- {
- "name": "title",
- "description": "The test case title.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "The test case description.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labelIds",
- "description": "The IDs of labels to be added to the test case.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "projectPath",
- "description": "The project full path to create the test case.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateTestCasePayload",
- "description": "Autogenerated return type of CreateTestCase",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "testCase",
- "description": "The test case created.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INTERFACE",
- "name": "CurrentUserTodos",
- "description": null,
- "fields": [
- {
- "name": "currentUserTodos",
- "description": "To-do items for the current user.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "State of the to-do items.",
- "type": {
- "kind": "ENUM",
- "name": "TodoStateEnum",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TodoConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": [
- {
- "kind": "OBJECT",
- "name": "BoardEpic",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "Design",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicIssue",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- }
- ]
- },
- {
- "kind": "OBJECT",
- "name": "CustomEmoji",
- "description": "A custom emoji uploaded by user",
- "fields": [
- {
- "name": "external",
- "description": "Whether the emoji is an external link.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "The ID of the emoji.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "CustomEmojiID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "The name of the emoji.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "url",
- "description": "The link to file of the emoji.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CustomEmojiConnection",
- "description": "The connection type for CustomEmoji.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CustomEmojiEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CustomEmoji",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CustomEmojiEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CustomEmoji",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "CustomEmojiID",
- "description": "Identifier of CustomEmoji.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastOnDemandScanCreateInput",
- "description": "Autogenerated input type of DastOnDemandScanCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "fullPath",
- "description": "The project the site profile belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "dastSiteProfileId",
- "description": "ID of the site profile to be used for the scan.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastSiteProfileID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "dastScannerProfileId",
- "description": "ID of the scanner profile to be used for the scan.",
- "type": {
- "kind": "SCALAR",
- "name": "DastScannerProfileID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastOnDemandScanCreatePayload",
- "description": "Autogenerated return type of DastOnDemandScanCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineUrl",
- "description": "URL of the pipeline that was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastProfile",
- "description": "Represents a DAST Profile",
- "fields": [
- {
- "name": "dastScannerProfile",
- "description": "The associated scanner profile.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastScannerProfile",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastSiteProfile",
- "description": "The associated site profile.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastSiteProfile",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "The description of the scan.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "editPath",
- "description": "Relative web path to the edit page of a profile.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the profile.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastProfileID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "The name of the profile.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastProfileConnection",
- "description": "The connection type for DastProfile.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DastProfileEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DastProfile",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastProfileCreateInput",
- "description": "Autogenerated input type of DastProfileCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "fullPath",
- "description": "The project the profile belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The name of the profile.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "The description of the profile. Defaults to an empty string.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": "\"\""
- },
- {
- "name": "dastSiteProfileId",
- "description": "ID of the site profile to be associated.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastSiteProfileID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "dastScannerProfileId",
- "description": "ID of the scanner profile to be associated.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastScannerProfileID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "runAfterCreate",
- "description": "Run scan using profile after creation. Defaults to false.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastProfileCreatePayload",
- "description": "Autogenerated return type of DastProfileCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastProfile",
- "description": "The created profile.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastProfile",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineUrl",
- "description": "The URL of the pipeline that was created. Requires `runAfterCreate` to be set to `true`.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastProfileDeleteInput",
- "description": "Autogenerated input type of DastProfileDelete",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the profile to be deleted.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastProfileID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastProfileDeletePayload",
- "description": "Autogenerated return type of DastProfileDelete",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastProfileEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastProfile",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "DastProfileID",
- "description": "Identifier of Dast::Profile.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastProfileRunInput",
- "description": "Autogenerated input type of DastProfileRun",
- "fields": null,
- "inputFields": [
- {
- "name": "fullPath",
- "description": "Full path for the project the scanner profile belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "ID of the profile to be used for the scan.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastProfileID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastProfileRunPayload",
- "description": "Autogenerated return type of DastProfileRun",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineUrl",
- "description": "URL of the pipeline that was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastProfileUpdateInput",
- "description": "Autogenerated input type of DastProfileUpdate",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the profile to be deleted.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastProfileID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "fullPath",
- "description": "The project the profile belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The name of the profile.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "The description of the profile. Defaults to an empty string.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": "\"\""
- },
- {
- "name": "dastSiteProfileId",
- "description": "ID of the site profile to be associated.",
- "type": {
- "kind": "SCALAR",
- "name": "DastSiteProfileID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "dastScannerProfileId",
- "description": "ID of the scanner profile to be associated.",
- "type": {
- "kind": "SCALAR",
- "name": "DastScannerProfileID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "runAfterUpdate",
- "description": "Run scan using profile after update. Defaults to false.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastProfileUpdatePayload",
- "description": "Autogenerated return type of DastProfileUpdate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastProfile",
- "description": "The updated profile.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastProfile",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineUrl",
- "description": "The URL of the pipeline that was created. Requires the input argument `runAfterUpdate` to be set to `true` when calling the mutation, otherwise no pipeline will be created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "DastScanTypeEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "PASSIVE",
- "description": "Passive DAST scan. This scan will not make active attacks against the target site.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ACTIVE",
- "description": "Active DAST scan. This scan will make active attacks against the target site.",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastScannerProfile",
- "description": "Represents a DAST scanner profile",
- "fields": [
- {
- "name": "editPath",
- "description": "Relative web path to the edit page of a scanner profile.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "globalId",
- "description": "ID of the DAST scanner profile. Deprecated in 13.6: Use `id`.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastScannerProfileID",
- "ofType": null
- }
- },
- "isDeprecated": true,
- "deprecationReason": "Use `id`. Deprecated in 13.6."
- },
- {
- "name": "id",
- "description": "ID of the DAST scanner profile.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastScannerProfileID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "profileName",
- "description": "Name of the DAST scanner profile.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "scanType",
- "description": "Indicates the type of DAST scan that will run. Either a Passive Scan or an Active Scan.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "DastScanTypeEnum",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "showDebugMessages",
- "description": "Indicates if debug messages should be included in DAST console output. True to include the debug messages.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "spiderTimeout",
- "description": "The maximum number of minutes allowed for the spider to traverse the site.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "targetTimeout",
- "description": "The maximum number of seconds allowed for the site under test to respond to a request.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "useAjaxSpider",
- "description": "Indicates if the AJAX spider should be used to crawl the target site. True to run the AJAX spider in addition to the traditional spider, and false to run only the traditional spider.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastScannerProfileConnection",
- "description": "The connection type for DastScannerProfile.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DastScannerProfileEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DastScannerProfile",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastScannerProfileCreateInput",
- "description": "Autogenerated input type of DastScannerProfileCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "fullPath",
- "description": "The project the scanner profile belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "profileName",
- "description": "The name of the scanner profile.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "spiderTimeout",
- "description": "The maximum number of minutes allowed for the spider to traverse the site.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "targetTimeout",
- "description": "The maximum number of seconds allowed for the site under test to respond to a request.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "scanType",
- "description": "Indicates the type of DAST scan that will run. Either a Passive Scan or an Active Scan.",
- "type": {
- "kind": "ENUM",
- "name": "DastScanTypeEnum",
- "ofType": null
- },
- "defaultValue": "PASSIVE"
- },
- {
- "name": "useAjaxSpider",
- "description": "Indicates if the AJAX spider should be used to crawl the target site. True to run the AJAX spider in addition to the traditional spider, and false to run only the traditional spider.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "showDebugMessages",
- "description": "Indicates if debug messages should be included in DAST console output. True to include the debug messages.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastScannerProfileCreatePayload",
- "description": "Autogenerated return type of DastScannerProfileCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "globalId",
- "description": "ID of the scanner profile. Deprecated in 13.6: Use `id`.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "DastScannerProfileID",
- "ofType": null
- },
- "isDeprecated": true,
- "deprecationReason": "Use `id`. Deprecated in 13.6."
- },
- {
- "name": "id",
- "description": "ID of the scanner profile.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "DastScannerProfileID",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastScannerProfileDeleteInput",
- "description": "Autogenerated input type of DastScannerProfileDelete",
- "fields": null,
- "inputFields": [
- {
- "name": "fullPath",
- "description": "Full path for the project the scanner profile belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "ID of the scanner profile to be deleted.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastScannerProfileID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastScannerProfileDeletePayload",
- "description": "Autogenerated return type of DastScannerProfileDelete",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastScannerProfileEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastScannerProfile",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "DastScannerProfileID",
- "description": "Identifier of DastScannerProfile.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastScannerProfileUpdateInput",
- "description": "Autogenerated input type of DastScannerProfileUpdate",
- "fields": null,
- "inputFields": [
- {
- "name": "fullPath",
- "description": "The project the scanner profile belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "ID of the scanner profile to be updated.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastScannerProfileID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "profileName",
- "description": "The name of the scanner profile.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "spiderTimeout",
- "description": "The maximum number of minutes allowed for the spider to traverse the site.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "targetTimeout",
- "description": "The maximum number of seconds allowed for the site under test to respond to a request.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "scanType",
- "description": "Indicates the type of DAST scan that will run. Either a Passive Scan or an Active Scan.",
- "type": {
- "kind": "ENUM",
- "name": "DastScanTypeEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "useAjaxSpider",
- "description": "Indicates if the AJAX spider should be used to crawl the target site. True to run the AJAX spider in addition to the traditional spider, and false to run only the traditional spider.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "showDebugMessages",
- "description": "Indicates if debug messages should be included in DAST console output. True to include the debug messages.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastScannerProfileUpdatePayload",
- "description": "Autogenerated return type of DastScannerProfileUpdate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the scanner profile.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "DastScannerProfileID",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastSiteProfile",
- "description": "Represents a DAST Site Profile",
- "fields": [
- {
- "name": "editPath",
- "description": "Relative web path to the edit page of a site profile.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the site profile.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastSiteProfileID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "normalizedTargetUrl",
- "description": "Normalized URL of the target to be scanned.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "profileName",
- "description": "The name of the site profile.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "targetUrl",
- "description": "The URL of the target to be scanned.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DastSiteProfilePermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "validationStatus",
- "description": "The current validation status of the site profile.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "DastSiteProfileValidationStatusEnum",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastSiteProfileConnection",
- "description": "The connection type for DastSiteProfile.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DastSiteProfileEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DastSiteProfile",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastSiteProfileCreateInput",
- "description": "Autogenerated input type of DastSiteProfileCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "fullPath",
- "description": "The project the site profile belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "profileName",
- "description": "The name of the site profile.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "targetUrl",
- "description": "The URL of the target to be scanned.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastSiteProfileCreatePayload",
- "description": "Autogenerated return type of DastSiteProfileCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the site profile.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "DastSiteProfileID",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastSiteProfileDeleteInput",
- "description": "Autogenerated input type of DastSiteProfileDelete",
- "fields": null,
- "inputFields": [
- {
- "name": "fullPath",
- "description": "The project the site profile belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "ID of the site profile to be deleted.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastSiteProfileID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastSiteProfileDeletePayload",
- "description": "Autogenerated return type of DastSiteProfileDelete",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastSiteProfileEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastSiteProfile",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "DastSiteProfileID",
- "description": "Identifier of DastSiteProfile.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastSiteProfilePermissions",
- "description": "Check permissions for the current user on site profile",
- "fields": [
- {
- "name": "createOnDemandDastScan",
- "description": "Indicates the user can perform `create_on_demand_dast_scan` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastSiteProfileUpdateInput",
- "description": "Autogenerated input type of DastSiteProfileUpdate",
- "fields": null,
- "inputFields": [
- {
- "name": "fullPath",
- "description": "The project the site profile belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "ID of the site profile to be updated.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastSiteProfileID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "profileName",
- "description": "The name of the site profile.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "targetUrl",
- "description": "The URL of the target to be scanned.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastSiteProfileUpdatePayload",
- "description": "Autogenerated return type of DastSiteProfileUpdate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the site profile.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "DastSiteProfileID",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "DastSiteProfileValidationStatusEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "NONE",
- "description": "No site validation exists",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PENDING_VALIDATION",
- "description": "Site validation process has not started",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "INPROGRESS_VALIDATION",
- "description": "Site validation process is in progress",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PASSED_VALIDATION",
- "description": "Site validation process finished successfully",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FAILED_VALIDATION",
- "description": "Site validation process finished but failed",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastSiteTokenCreateInput",
- "description": "Autogenerated input type of DastSiteTokenCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "fullPath",
- "description": "The project the site token belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "targetUrl",
- "description": "The URL of the target to be validated.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastSiteTokenCreatePayload",
- "description": "Autogenerated return type of DastSiteTokenCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the site token.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "DastSiteTokenID",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "status",
- "description": "The current validation status of the target.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "DastSiteProfileValidationStatusEnum",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "token",
- "description": "Token string.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "DastSiteTokenID",
- "description": "Identifier of DastSiteToken.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastSiteValidation",
- "description": "Represents a DAST Site Validation",
- "fields": [
- {
- "name": "id",
- "description": "Global ID of the site validation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastSiteValidationID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "normalizedTargetUrl",
- "description": "Normalized URL of the target to be validated.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "status",
- "description": "Status of the site validation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "DastSiteProfileValidationStatusEnum",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastSiteValidationConnection",
- "description": "The connection type for DastSiteValidation.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DastSiteValidationEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DastSiteValidation",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastSiteValidationCreateInput",
- "description": "Autogenerated input type of DastSiteValidationCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "fullPath",
- "description": "The project the site profile belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "dastSiteTokenId",
- "description": "ID of the site token.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastSiteTokenID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "validationPath",
- "description": "The path to be requested during validation.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "strategy",
- "description": "The validation strategy to be used.",
- "type": {
- "kind": "ENUM",
- "name": "DastSiteValidationStrategyEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastSiteValidationCreatePayload",
- "description": "Autogenerated return type of DastSiteValidationCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the site validation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "DastSiteValidationID",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "status",
- "description": "The current validation status.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "DastSiteProfileValidationStatusEnum",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastSiteValidationEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastSiteValidation",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "DastSiteValidationID",
- "description": "Identifier of DastSiteValidation.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastSiteValidationRevokeInput",
- "description": "Autogenerated input type of DastSiteValidationRevoke",
- "fields": null,
- "inputFields": [
- {
- "name": "fullPath",
- "description": "The project the site validation belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "normalizedTargetUrl",
- "description": "Normalized URL of the target to be revoked.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastSiteValidationRevokePayload",
- "description": "Autogenerated return type of DastSiteValidationRevoke",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "DastSiteValidationStrategyEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "TEXT_FILE",
- "description": "Text file validation",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "HEADER",
- "description": "Header validation",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "DataVisualizationColorEnum",
- "description": "Color of the data visualization palette",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "BLUE",
- "description": "Blue color",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ORANGE",
- "description": "Orange color",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "AQUA",
- "description": "Aqua color",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "GREEN",
- "description": "Green color",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MAGENTA",
- "description": "Magenta color",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "DataVisualizationWeightEnum",
- "description": "Weight of the data visualization palette",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "WEIGHT_50",
- "description": "50 weight",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEIGHT_100",
- "description": "100 weight",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEIGHT_200",
- "description": "200 weight",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEIGHT_300",
- "description": "300 weight",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEIGHT_400",
- "description": "400 weight",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEIGHT_500",
- "description": "500 weight",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEIGHT_600",
- "description": "600 weight",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEIGHT_700",
- "description": "700 weight",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEIGHT_800",
- "description": "800 weight",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEIGHT_900",
- "description": "900 weight",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEIGHT_950",
- "description": "950 weight",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "Date",
- "description": "Date represented in ISO 8601",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DeleteAnnotationInput",
- "description": "Autogenerated input type of DeleteAnnotation",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "Global ID of the annotation to delete.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "MetricsDashboardAnnotationID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DeleteAnnotationPayload",
- "description": "Autogenerated return type of DeleteAnnotation",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DeleteDevopsAdoptionSegmentInput",
- "description": "Autogenerated input type of DeleteDevopsAdoptionSegment",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the segment.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "AnalyticsDevopsAdoptionSegmentID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DeleteDevopsAdoptionSegmentPayload",
- "description": "Autogenerated return type of DeleteDevopsAdoptionSegment",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DeleteJobsResponse",
- "description": "The response from the AdminSidekiqQueuesDeleteJobs mutation",
- "fields": [
- {
- "name": "completed",
- "description": "Whether or not the entire queue was processed in time; if not, retrying the same request is safe.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "deletedJobs",
- "description": "The number of matching jobs deleted.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "queueSize",
- "description": "The queue size after processing.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Design",
- "description": "A single design",
- "fields": [
- {
- "name": "currentUserTodos",
- "description": "To-do items for the current user.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "State of the to-do items.",
- "type": {
- "kind": "ENUM",
- "name": "TodoStateEnum",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TodoConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "diffRefs",
- "description": "The diff refs for this design.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiffRefs",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussions",
- "description": "All discussions on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiscussionConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "event",
- "description": "How this design was changed in the current version.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "DesignVersionEvent",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "filename",
- "description": "The filename of the design.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fullPath",
- "description": "The full path to the design file.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "The ID of this design.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "image",
- "description": "The URL of the full-sized image.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "imageV432x230",
- "description": "The URL of the design resized to fit within the bounds of 432x230. This will be `null` if the image has not been generated",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue the design belongs to.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notes",
- "description": "All notes on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NoteConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notesCount",
- "description": "The total count of user-created notes for this design.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "The project the design belongs to.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "versions",
- "description": "All versions related to this design ordered newest first.",
- "args": [
- {
- "name": "earlierOrEqualToSha",
- "description": "The SHA256 of the most recent acceptable version.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "earlierOrEqualToId",
- "description": "The Global ID of the most recent acceptable version.",
- "type": {
- "kind": "SCALAR",
- "name": "DesignManagementVersionID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DesignVersionConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Noteable",
- "ofType": null
- },
- {
- "kind": "INTERFACE",
- "name": "DesignFields",
- "ofType": null
- },
- {
- "kind": "INTERFACE",
- "name": "CurrentUserTodos",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DesignAtVersion",
- "description": "A design pinned to a specific version. The image field reflects the design as of the associated version",
- "fields": [
- {
- "name": "design",
- "description": "The underlying design.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Design",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "diffRefs",
- "description": "The diff refs for this design.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiffRefs",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "event",
- "description": "How this design was changed in the current version.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "DesignVersionEvent",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "filename",
- "description": "The filename of the design.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fullPath",
- "description": "The full path to the design file.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "The ID of this design.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "image",
- "description": "The URL of the full-sized image.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "imageV432x230",
- "description": "The URL of the design resized to fit within the bounds of 432x230. This will be `null` if the image has not been generated",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue the design belongs to.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notesCount",
- "description": "The total count of user-created notes for this design.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "The project the design belongs to.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "version",
- "description": "The version this design-at-versions is pinned to.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DesignVersion",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "DesignFields",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DesignAtVersionConnection",
- "description": "The connection type for DesignAtVersion.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DesignAtVersionEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DesignAtVersion",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DesignAtVersionEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DesignAtVersion",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DesignCollection",
- "description": "A collection of designs",
- "fields": [
- {
- "name": "copyState",
- "description": "Copy state of the design collection.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "DesignCollectionCopyState",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "design",
- "description": "Find a specific design.",
- "args": [
- {
- "name": "id",
- "description": "Find a design by its ID.",
- "type": {
- "kind": "SCALAR",
- "name": "DesignManagementDesignID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "filename",
- "description": "Find a design by its filename.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Design",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "designAtVersion",
- "description": "Find a design as of a version.",
- "args": [
- {
- "name": "id",
- "description": "The Global ID of the design at this version.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DesignManagementDesignAtVersionID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DesignAtVersion",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "designs",
- "description": "All designs for the design collection.",
- "args": [
- {
- "name": "ids",
- "description": "Filters designs by their ID.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DesignManagementDesignID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "filenames",
- "description": "Filters designs by their filename.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "atVersion",
- "description": "Filters designs to only those that existed at the version. If argument is omitted or nil then all designs will reflect the latest version",
- "type": {
- "kind": "SCALAR",
- "name": "DesignManagementVersionID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DesignConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "Issue associated with the design collection.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "Project associated with the design collection.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "version",
- "description": "A specific version.",
- "args": [
- {
- "name": "sha",
- "description": "The SHA256 of a specific version.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "The Global ID of the version.",
- "type": {
- "kind": "SCALAR",
- "name": "DesignManagementVersionID",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DesignVersion",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "versions",
- "description": "All versions related to all designs, ordered newest first.",
- "args": [
- {
- "name": "earlierOrEqualToSha",
- "description": "The SHA256 of the most recent acceptable version.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "earlierOrEqualToId",
- "description": "The Global ID of the most recent acceptable version.",
- "type": {
- "kind": "SCALAR",
- "name": "DesignManagementVersionID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DesignVersionConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "DesignCollectionCopyState",
- "description": "Copy state of a DesignCollection",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "READY",
- "description": "The DesignCollection has no copy in progress",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "IN_PROGRESS",
- "description": "The DesignCollection is being copied",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ERROR",
- "description": "The DesignCollection encountered an error during a copy",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DesignConnection",
- "description": "The connection type for Design.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DesignEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Design",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DesignEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Design",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INTERFACE",
- "name": "DesignFields",
- "description": null,
- "fields": [
- {
- "name": "diffRefs",
- "description": "The diff refs for this design.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiffRefs",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "event",
- "description": "How this design was changed in the current version.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "DesignVersionEvent",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "filename",
- "description": "The filename of the design.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fullPath",
- "description": "The full path to the design file.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "The ID of this design.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "image",
- "description": "The URL of the full-sized image.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "imageV432x230",
- "description": "The URL of the design resized to fit within the bounds of 432x230. This will be `null` if the image has not been generated",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue the design belongs to.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notesCount",
- "description": "The total count of user-created notes for this design.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "The project the design belongs to.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": [
- {
- "kind": "OBJECT",
- "name": "Design",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "DesignAtVersion",
- "ofType": null
- }
- ]
- },
- {
- "kind": "OBJECT",
- "name": "DesignManagement",
- "description": null,
- "fields": [
- {
- "name": "designAtVersion",
- "description": "Find a design as of a version.",
- "args": [
- {
- "name": "id",
- "description": "The Global ID of the design at this version.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DesignManagementDesignAtVersionID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DesignAtVersion",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "version",
- "description": "Find a version.",
- "args": [
- {
- "name": "id",
- "description": "The Global ID of the version.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DesignManagementVersionID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DesignVersion",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DesignManagementDeleteInput",
- "description": "Autogenerated input type of DesignManagementDelete",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project where the issue is to upload designs for.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to modify designs for.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "filenames",
- "description": "The filenames of the designs to delete.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DesignManagementDeletePayload",
- "description": "Autogenerated return type of DesignManagementDelete",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "version",
- "description": "The new version in which the designs are deleted.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DesignVersion",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "DesignManagementDesignAtVersionID",
- "description": "Identifier of DesignManagement::DesignAtVersion.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "DesignManagementDesignID",
- "description": "Identifier of DesignManagement::Design.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DesignManagementMoveInput",
- "description": "Autogenerated input type of DesignManagementMove",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the design to move.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DesignManagementDesignID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "previous",
- "description": "ID of the immediately preceding design.",
- "type": {
- "kind": "SCALAR",
- "name": "DesignManagementDesignID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "next",
- "description": "ID of the immediately following design.",
- "type": {
- "kind": "SCALAR",
- "name": "DesignManagementDesignID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DesignManagementMovePayload",
- "description": "Autogenerated return type of DesignManagementMove",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "designCollection",
- "description": "The current state of the collection.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DesignCollection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DesignManagementUploadInput",
- "description": "Autogenerated input type of DesignManagementUpload",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project where the issue is to upload designs for.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to modify designs for.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "files",
- "description": "The files to upload.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Upload",
- "ofType": null
- }
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DesignManagementUploadPayload",
- "description": "Autogenerated return type of DesignManagementUpload",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "designs",
- "description": "The designs that were uploaded by the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Design",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "skippedDesigns",
- "description": "Any designs that were skipped from the upload due to there being no change to their content since their last version",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Design",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "DesignManagementVersionID",
- "description": "Identifier of DesignManagement::Version.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DesignVersion",
- "description": "A specific version in which designs were added, modified or deleted",
- "fields": [
- {
- "name": "designAtVersion",
- "description": "A particular design as of this version, provided it is visible at this version.",
- "args": [
- {
- "name": "id",
- "description": "The ID of the DesignAtVersion.",
- "type": {
- "kind": "SCALAR",
- "name": "DesignManagementDesignAtVersionID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "designId",
- "description": "The ID of a specific design.",
- "type": {
- "kind": "SCALAR",
- "name": "DesignManagementDesignID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "filename",
- "description": "The filename of a specific design.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DesignAtVersion",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "designs",
- "description": "All designs that were changed in the version.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DesignConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "designsAtVersion",
- "description": "All designs that are visible at this version, as of this version.",
- "args": [
- {
- "name": "ids",
- "description": "Filters designs by their ID.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DesignManagementDesignID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "filenames",
- "description": "Filters designs by their filename.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DesignAtVersionConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the design version.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sha",
- "description": "SHA of the design version.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DesignVersionConnection",
- "description": "The connection type for DesignVersion.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DesignVersionEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DesignVersion",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DesignVersionEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DesignVersion",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "DesignVersionEvent",
- "description": "Mutation event of a design within a version",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "NONE",
- "description": "No change",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATION",
- "description": "A creation event",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MODIFICATION",
- "description": "A modification event",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DELETION",
- "description": "A deletion event",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DestroyBoardInput",
- "description": "Autogenerated input type of DestroyBoard",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the board to destroy.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "BoardID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DestroyBoardListInput",
- "description": "Autogenerated input type of DestroyBoardList",
- "fields": null,
- "inputFields": [
- {
- "name": "listId",
- "description": "Global ID of the list to destroy. Only label lists are accepted.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ListID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DestroyBoardListPayload",
- "description": "Autogenerated return type of DestroyBoardList",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "list",
- "description": "The list after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardList",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DestroyBoardPayload",
- "description": "Autogenerated return type of DestroyBoard",
- "fields": [
- {
- "name": "board",
- "description": "The board after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Board",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DestroyComplianceFrameworkInput",
- "description": "Autogenerated input type of DestroyComplianceFramework",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the compliance framework to destroy.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ComplianceManagementFrameworkID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DestroyComplianceFrameworkPayload",
- "description": "Autogenerated return type of DestroyComplianceFramework",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DestroyContainerRepositoryInput",
- "description": "Autogenerated input type of DestroyContainerRepository",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the container repository.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ContainerRepositoryID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DestroyContainerRepositoryPayload",
- "description": "Autogenerated return type of DestroyContainerRepository",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "containerRepository",
- "description": "The container repository policy after scheduling the deletion.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ContainerRepository",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DestroyContainerRepositoryTagsInput",
- "description": "Autogenerated input type of DestroyContainerRepositoryTags",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the container repository.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ContainerRepositoryID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "tagNames",
- "description": "Container repository tag(s) to delete. Total number can't be greater than 20",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DestroyContainerRepositoryTagsPayload",
- "description": "Autogenerated return type of DestroyContainerRepositoryTags",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "deletedTagNames",
- "description": "Deleted container repository tags.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DestroyNoteInput",
- "description": "Autogenerated input type of DestroyNote",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the note to destroy.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "NoteID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DestroyNotePayload",
- "description": "Autogenerated return type of DestroyNote",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "note",
- "description": "The note after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Note",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DestroySnippetInput",
- "description": "Autogenerated input type of DestroySnippet",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the snippet to destroy.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "SnippetID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DestroySnippetPayload",
- "description": "Autogenerated return type of DestroySnippet",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "snippet",
- "description": "The snippet after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Snippet",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DetailedStatus",
- "description": null,
- "fields": [
- {
- "name": "action",
- "description": "Action information for the status. This includes method, button title, icon, path, and title.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "StatusAction",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "detailsPath",
- "description": "Path of the details for the status.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "favicon",
- "description": "Favicon of the status.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "group",
- "description": "Group of the status.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hasDetails",
- "description": "Indicates if the status has further details.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "icon",
- "description": "Icon of the status.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "label",
- "description": "Label of the status.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "text",
- "description": "Text of the status.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tooltip",
- "description": "Tooltip associated with the status.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DevopsAdoptionSegment",
- "description": "Segment",
- "fields": [
- {
- "name": "id",
- "description": "ID of the segment.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "latestSnapshot",
- "description": "The latest adoption metrics for the segment.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DevopsAdoptionSnapshot",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "namespace",
- "description": "Segment namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Namespace",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DevopsAdoptionSegmentConnection",
- "description": "The connection type for DevopsAdoptionSegment.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DevopsAdoptionSegmentEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DevopsAdoptionSegment",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DevopsAdoptionSegmentEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DevopsAdoptionSegment",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DevopsAdoptionSnapshot",
- "description": "Snapshot",
- "fields": [
- {
- "name": "deploySucceeded",
- "description": "At least one deployment succeeded.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "endTime",
- "description": "The end time for the snapshot where the data points were collected.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueOpened",
- "description": "At least one issue was opened.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestApproved",
- "description": "At least one merge request was approved.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestOpened",
- "description": "At least one merge request was opened.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineSucceeded",
- "description": "At least one pipeline succeeded.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "recordedAt",
- "description": "The time the snapshot was recorded.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "runnerConfigured",
- "description": "At least one runner was used.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "securityScanSucceeded",
- "description": "At least one security scan succeeded.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startTime",
- "description": "The start time for the snapshot where the data points were collected.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DiffImagePositionInput",
- "description": null,
- "fields": null,
- "inputFields": [
- {
- "name": "headSha",
- "description": "SHA of the HEAD at the time the comment was made.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "baseSha",
- "description": "Merge base of the branch the comment was made on.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "startSha",
- "description": "SHA of the branch being compared against.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "paths",
- "description": "The paths of the file that was changed. Both of the properties of this input are optional, but at least one of them is required",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DiffPathsInput",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "x",
- "description": "X position of the note.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "y",
- "description": "Y position of the note.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "width",
- "description": "Total width of the image.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "height",
- "description": "Total height of the image.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "DiffNoteID",
- "description": "Identifier of DiffNote.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DiffPathsInput",
- "description": null,
- "fields": null,
- "inputFields": [
- {
- "name": "oldPath",
- "description": "The path of the file on the start sha.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "newPath",
- "description": "The path of the file on the head sha.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DiffPosition",
- "description": null,
- "fields": [
- {
- "name": "diffRefs",
- "description": "Information about the branch, HEAD, and base at the time of commenting.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiffRefs",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "filePath",
- "description": "Path of the file that was changed.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "height",
- "description": "Total height of the image.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "newLine",
- "description": "Line on HEAD SHA that was changed.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "newPath",
- "description": "Path of the file on the HEAD SHA.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "oldLine",
- "description": "Line on start SHA that was changed.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "oldPath",
- "description": "Path of the file on the start SHA.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "positionType",
- "description": "Type of file the position refers to.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "DiffPositionType",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "width",
- "description": "Total width of the image.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "x",
- "description": "X position of the note.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "y",
- "description": "Y position of the note.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DiffPositionInput",
- "description": null,
- "fields": null,
- "inputFields": [
- {
- "name": "headSha",
- "description": "SHA of the HEAD at the time the comment was made.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "baseSha",
- "description": "Merge base of the branch the comment was made on.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "startSha",
- "description": "SHA of the branch being compared against.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "paths",
- "description": "The paths of the file that was changed. Both of the properties of this input are optional, but at least one of them is required",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DiffPathsInput",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "oldLine",
- "description": "Line on start SHA that was changed.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "newLine",
- "description": "Line on HEAD SHA that was changed.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "DiffPositionType",
- "description": "Type of file the position refers to",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "text",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "image",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DiffRefs",
- "description": null,
- "fields": [
- {
- "name": "baseSha",
- "description": "Merge base of the branch the comment was made on.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "headSha",
- "description": "SHA of the HEAD at the time the comment was made.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startSha",
- "description": "SHA of the branch being compared against.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DiffStats",
- "description": "Changes to a single file",
- "fields": [
- {
- "name": "additions",
- "description": "Number of lines added to this file.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "deletions",
- "description": "Number of lines deleted from this file.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "File path, relative to repository root.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DiffStatsSummary",
- "description": "Aggregated summary of changes",
- "fields": [
- {
- "name": "additions",
- "description": "Number of lines added.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "changes",
- "description": "Number of lines changed.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "deletions",
- "description": "Number of lines deleted.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fileCount",
- "description": "Number of files changed.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Discussion",
- "description": null,
- "fields": [
- {
- "name": "createdAt",
- "description": "Timestamp of the discussion's creation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of this discussion.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DiscussionID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notes",
- "description": "All notes in the discussion.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NoteConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "replyId",
- "description": "ID used to reply to this discussion.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DiscussionID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolvable",
- "description": "Indicates if the object can be resolved.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolved",
- "description": "Indicates if the object is resolved.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolvedAt",
- "description": "Timestamp of when the object was resolved.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolvedBy",
- "description": "User who resolved the object.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "ResolvableInterface",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DiscussionConnection",
- "description": "The connection type for Discussion.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiscussionEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Discussion",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DiscussionEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Discussion",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "DiscussionID",
- "description": "Identifier of Discussion.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DiscussionToggleResolveInput",
- "description": "Autogenerated input type of DiscussionToggleResolve",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the discussion.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DiscussionID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "resolve",
- "description": "Will resolve the discussion when true, and unresolve the discussion when false.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DiscussionToggleResolvePayload",
- "description": "Autogenerated return type of DiscussionToggleResolve",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussion",
- "description": "The discussion after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Discussion",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DismissVulnerabilityInput",
- "description": "Autogenerated input type of DismissVulnerability",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the vulnerability to be dismissed.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "VulnerabilityID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "comment",
- "description": "Comment why vulnerability should be dismissed.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "dismissalReason",
- "description": "Reason why vulnerability should be dismissed.",
- "type": {
- "kind": "ENUM",
- "name": "VulnerabilityDismissalReason",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DismissVulnerabilityPayload",
- "description": "Autogenerated return type of DismissVulnerability",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerability",
- "description": "The vulnerability after dismissal.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Vulnerability",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INTERFACE",
- "name": "Entry",
- "description": null,
- "fields": [
- {
- "name": "flatPath",
- "description": "Flat path of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Path of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sha",
- "description": "Last commit SHA for the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of tree entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "EntryType",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": [
- {
- "kind": "OBJECT",
- "name": "Blob",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "Submodule",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "TreeEntry",
- "ofType": null
- }
- ]
- },
- {
- "kind": "ENUM",
- "name": "EntryType",
- "description": "Type of a tree entry",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "tree",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "blob",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "commit",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Environment",
- "description": "Describes where code is deployed for a project",
- "fields": [
- {
- "name": "id",
- "description": "ID of the environment.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "latestOpenedMostSevereAlert",
- "description": "The most severe open alert for the environment. If multiple alerts have equal severity, the most recent is returned.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementAlert",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "metricsDashboard",
- "description": "Metrics dashboard schema for the environment.",
- "args": [
- {
- "name": "path",
- "description": "Path to a file which defines metrics dashboard eg: 'config/prometheus/common_metrics.yml'.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MetricsDashboard",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Human-readable name of the environment.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "The path to the environment.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "State of the environment, for example: available/stopped.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EnvironmentConnection",
- "description": "The connection type for Environment.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "EnvironmentEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Environment",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EnvironmentEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Environment",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "EnvironmentID",
- "description": "Identifier of Environment.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "EnvironmentsCanaryIngressUpdateInput",
- "description": "Autogenerated input type of EnvironmentsCanaryIngressUpdate",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the environment to update.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "EnvironmentID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "weight",
- "description": "The weight of the Canary Ingress.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EnvironmentsCanaryIngressUpdatePayload",
- "description": "Autogenerated return type of EnvironmentsCanaryIngressUpdate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Epic",
- "description": "Represents an epic",
- "fields": [
- {
- "name": "author",
- "description": "Author of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "awardEmoji",
- "description": "A list of award emojis associated with the epic.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AwardEmojiConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "children",
- "description": "Children (sub-epics) of the epic.",
- "args": [
- {
- "name": "startDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.start.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "timeframe",
- "description": "List items overlapping the given timeframe.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "Timeframe",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "IID of the epic, e.g., \"1\".",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iids",
- "description": "List of IIDs of epics, e.g., [1, 2].",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter epics by state.",
- "type": {
- "kind": "ENUM",
- "name": "EpicState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for epic title or description.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "List epics by sort order.",
- "type": {
- "kind": "ENUM",
- "name": "EpicSort",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Filter epics by author.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labelName",
- "description": "Filter epics by labels.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Filter epics by milestone title, computed from epic's issues.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iidStartsWith",
- "description": "Filter epics by IID for autocomplete.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "includeDescendantGroups",
- "description": "Include epics from descendant groups.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "true"
- },
- {
- "name": "confidential",
- "description": "Filter epics by given confidentiality.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "closedAt",
- "description": "Timestamp of when the epic was closed.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "confidential",
- "description": "Indicates if the epic is confidential.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp of when the epic was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "currentUserTodos",
- "description": "To-do items for the current user.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "State of the to-do items.",
- "type": {
- "kind": "ENUM",
- "name": "TodoStateEnum",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TodoConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descendantCounts",
- "description": "Number of open and closed descendant epics and issues.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicDescendantCount",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descendantWeightSum",
- "description": "Total weight of open and closed issues in the epic and its descendants.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicDescendantWeights",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussions",
- "description": "All discussions on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiscussionConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "downvotes",
- "description": "Number of downvotes the epic has received.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dueDate",
- "description": "Due date of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dueDateFixed",
- "description": "Fixed due date of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dueDateFromMilestones",
- "description": "Inherited due date of the epic from milestones.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dueDateIsFixed",
- "description": "Indicates if the due date has been manually set.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "events",
- "description": "A list of events associated with the object.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EventConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "group",
- "description": "Group to which the epic belongs.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Group",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hasChildren",
- "description": "Indicates if the epic has children.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hasIssues",
- "description": "Indicates if the epic has direct issues.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hasParent",
- "description": "Indicates if the epic has a parent epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "healthStatus",
- "description": "Current health status of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicHealthStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iid",
- "description": "Internal ID of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issues",
- "description": "A list of issues associated with the epic.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicIssueConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "labels",
- "description": "Labels assigned to the epic.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "LabelConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notes",
- "description": "All notes on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NoteConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "parent",
- "description": "Parent epic of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "participants",
- "description": "List of participants for the epic.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UserConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "reference",
- "description": "Internal reference of the epic. Returned in shortened format by default.",
- "args": [
- {
- "name": "full",
- "description": "Indicates if the reference should be returned in full.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "relationPath",
- "description": "URI path of the epic-issue relationship.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "relativePosition",
- "description": "The relative position of the epic in the epic tree.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startDate",
- "description": "Start date of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startDateFixed",
- "description": "Fixed start date of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startDateFromMilestones",
- "description": "Inherited start date of the epic from milestones.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startDateIsFixed",
- "description": "Indicates if the start date has been manually set.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "State of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "EpicState",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "subscribed",
- "description": "Indicates the currently logged in user is subscribed to the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp of when the epic was updated.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "upvotes",
- "description": "Number of upvotes the epic has received.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userDiscussionsCount",
- "description": "Number of user discussions in the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userNotesCount",
- "description": "Number of user notes of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "EpicPermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webPath",
- "description": "Web path of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Noteable",
- "ofType": null
- },
- {
- "kind": "INTERFACE",
- "name": "CurrentUserTodos",
- "ofType": null
- },
- {
- "kind": "INTERFACE",
- "name": "Eventable",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "EpicAddIssueInput",
- "description": "Autogenerated input type of EpicAddIssue",
- "fields": null,
- "inputFields": [
- {
- "name": "iid",
- "description": "The IID of the epic to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "groupPath",
- "description": "The group the epic to mutate belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "projectPath",
- "description": "The full path of the project the issue belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "issueIid",
- "description": "The IID of the issue to be added.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicAddIssuePayload",
- "description": "Autogenerated return type of EpicAddIssue",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epic",
- "description": "The epic after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epicIssue",
- "description": "The epic-issue relation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicIssue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicBoard",
- "description": "Represents an epic board",
- "fields": [
- {
- "name": "id",
- "description": "Global ID of the board.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "BoardsEpicBoardID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lists",
- "description": "Epic board lists.",
- "args": [
- {
- "name": "id",
- "description": "Find an epic board list by ID.",
- "type": {
- "kind": "SCALAR",
- "name": "BoardsEpicListID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicListConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the board.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicBoardConnection",
- "description": "The connection type for EpicBoard.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "EpicBoardEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "EpicBoard",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "EpicBoardCreateInput",
- "description": "Autogenerated input type of EpicBoardCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "name",
- "description": "The board name.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "hideBacklogList",
- "description": "Whether or not backlog list is hidden.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "hideClosedList",
- "description": "Whether or not closed list is hidden.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "groupPath",
- "description": "Full path of the group with which the resource is associated.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicBoardCreatePayload",
- "description": "Autogenerated return type of EpicBoardCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epicBoard",
- "description": "The created epic board.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicBoard",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicBoardEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicBoard",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "EpicBoardListCreateInput",
- "description": "Autogenerated input type of EpicBoardListCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "backlog",
- "description": "Create the backlog list.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labelId",
- "description": "Global ID of an existing label.",
- "type": {
- "kind": "SCALAR",
- "name": "LabelID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "boardId",
- "description": "Global ID of the issue board to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "BoardsEpicBoardID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicBoardListCreatePayload",
- "description": "Autogenerated return type of EpicBoardListCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "list",
- "description": "Epic list in the epic board.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicList",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicConnection",
- "description": "The connection type for Epic.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "EpicEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicDescendantCount",
- "description": "Counts of descendent epics",
- "fields": [
- {
- "name": "closedEpics",
- "description": "Number of closed child epics.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "closedIssues",
- "description": "Number of closed epic issues.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "openedEpics",
- "description": "Number of opened child epics.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "openedIssues",
- "description": "Number of opened epic issues.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicDescendantWeights",
- "description": "Total weight of open and closed descendant issues",
- "fields": [
- {
- "name": "closedIssues",
- "description": "Total weight of completed (closed) issues in this epic, including epic descendants.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "openedIssues",
- "description": "Total weight of opened issues in this epic, including epic descendants.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicHealthStatus",
- "description": "Health status of child issues",
- "fields": [
- {
- "name": "issuesAtRisk",
- "description": "Number of issues at risk.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issuesNeedingAttention",
- "description": "Number of issues that need attention.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issuesOnTrack",
- "description": "Number of issues on track.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "EpicID",
- "description": "Identifier of Epic.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicIssue",
- "description": "Relationship between an epic and an issue",
- "fields": [
- {
- "name": "alertManagementAlert",
- "description": "Alert associated to this issue.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementAlert",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "assignees",
- "description": "Assignees of the issue.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UserConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "author",
- "description": "User that created the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "blocked",
- "description": "Indicates the issue is blocked.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "blockedByCount",
- "description": "Count of issues blocking this issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "closedAt",
- "description": "Timestamp of when the issue was closed.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "confidential",
- "description": "Indicates the issue is confidential.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createNoteEmail",
- "description": "User specific email address for the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp of when the issue was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "currentUserTodos",
- "description": "To-do items for the current user.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "State of the to-do items.",
- "type": {
- "kind": "ENUM",
- "name": "TodoStateEnum",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TodoConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descriptionHtml",
- "description": "The GitLab Flavored Markdown rendering of `description`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "designCollection",
- "description": "Collection of design images associated with this issue.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DesignCollection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussionLocked",
- "description": "Indicates discussion is locked on the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussions",
- "description": "All discussions on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiscussionConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "downvotes",
- "description": "Number of downvotes the issue has received.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dueDate",
- "description": "Due date of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "emailsDisabled",
- "description": "Indicates if a project has email notifications disabled: `true` if email notifications are disabled.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epic",
- "description": "Epic to which this issue belongs.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epicIssueId",
- "description": "ID of the epic-issue relation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "healthStatus",
- "description": "Current health status.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "HealthStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "humanTimeEstimate",
- "description": "Human-readable time estimate of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "humanTotalTimeSpent",
- "description": "Human-readable total time reported as spent on the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "Global ID of the epic-issue relation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iid",
- "description": "Internal ID of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iteration",
- "description": "Iteration of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Iteration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "labels",
- "description": "Labels of the issue.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "LabelConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "metricImages",
- "description": "Metric images associated to the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "MetricImage",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "milestone",
- "description": "Milestone of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Milestone",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "moved",
- "description": "Indicates if issue got moved from other project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "movedTo",
- "description": "Updated Issue after it got moved to another project.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notes",
- "description": "All notes on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NoteConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "participants",
- "description": "List of participants in the issue.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UserConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "reference",
- "description": "Internal reference of the issue. Returned in shortened format by default.",
- "args": [
- {
- "name": "full",
- "description": "Boolean option specifying whether the reference should be returned in full.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "relationPath",
- "description": "URI path of the epic-issue relation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "relativePosition",
- "description": "Relative position of the issue (used for positioning in epic tree and issue boards).",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "severity",
- "description": "Severity level of the incident.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "IssuableSeverity",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "slaDueAt",
- "description": "Timestamp of when the issue SLA expires.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "State of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "IssueState",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "statusPagePublishedIncident",
- "description": "Indicates whether an issue is published to the status page.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "subscribed",
- "description": "Indicates the currently logged in user is subscribed to the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "taskCompletionStatus",
- "description": "Task completion status of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TaskCompletionStatus",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "timeEstimate",
- "description": "Time estimate of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "titleHtml",
- "description": "The GitLab Flavored Markdown rendering of `title`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "totalTimeSpent",
- "description": "Total time reported as spent on the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "IssueType",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp of when the issue was last updated.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedBy",
- "description": "User that last updated the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "upvotes",
- "description": "Number of upvotes the issue has received.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userDiscussionsCount",
- "description": "Number of user discussions in the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userNotesCount",
- "description": "Number of user notes of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "IssuePermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webPath",
- "description": "Web path of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "weight",
- "description": "Weight of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Noteable",
- "ofType": null
- },
- {
- "kind": "INTERFACE",
- "name": "CurrentUserTodos",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicIssueConnection",
- "description": "The connection type for EpicIssue.",
- "fields": [
- {
- "name": "count",
- "description": "Total count of collection.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "EpicIssueEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "EpicIssue",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "weight",
- "description": "Total weight of issues collection.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicIssueEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicIssue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicList",
- "description": "Represents an epic board list",
- "fields": [
- {
- "name": "epics",
- "description": "List epics.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "Global ID of the board list.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "BoardsEpicListID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "label",
- "description": "Label of the list.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Label",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "listType",
- "description": "Type of the list.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "position",
- "description": "Position of the list within the board.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the list.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicListConnection",
- "description": "The connection type for EpicList.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "EpicListEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "EpicList",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicListEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicList",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicPermissions",
- "description": "Check permissions for the current user on an epic",
- "fields": [
- {
- "name": "adminEpic",
- "description": "Indicates the user can perform `admin_epic` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "awardEmoji",
- "description": "Indicates the user can perform `award_emoji` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createEpic",
- "description": "Indicates the user can perform `create_epic` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createNote",
- "description": "Indicates the user can perform `create_note` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyEpic",
- "description": "Indicates the user can perform `destroy_epic` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readEpic",
- "description": "Indicates the user can perform `read_epic` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readEpicIid",
- "description": "Indicates the user can perform `read_epic_iid` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateEpic",
- "description": "Indicates the user can perform `update_epic` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "EpicSetSubscriptionInput",
- "description": "Autogenerated input type of EpicSetSubscription",
- "fields": null,
- "inputFields": [
- {
- "name": "iid",
- "description": "The IID of the epic to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "groupPath",
- "description": "The group the epic to mutate belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "subscribedState",
- "description": "The desired state of the subscription.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicSetSubscriptionPayload",
- "description": "Autogenerated return type of EpicSetSubscription",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epic",
- "description": "The epic after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "EpicSort",
- "description": "Roadmap sort values",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "start_date_desc",
- "description": "Start date at descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "start_date_asc",
- "description": "Start date at ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "end_date_desc",
- "description": "End date at descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "end_date_asc",
- "description": "End date at ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "EpicState",
- "description": "State of an epic",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "all",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "opened",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "closed",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "EpicStateEvent",
- "description": "State event of an epic",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "REOPEN",
- "description": "Reopen the epic",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CLOSE",
- "description": "Close the epic",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "EpicTreeNodeFieldsInputType",
- "description": "A node of an epic tree.",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The ID of the epic_issue or epic that is being moved.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "EpicTreeSortingID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "adjacentReferenceId",
- "description": "The ID of the epic_issue or issue that the actual epic or issue is switched with.",
- "type": {
- "kind": "SCALAR",
- "name": "EpicTreeSortingID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "relativePosition",
- "description": "The type of the switch, after or before allowed.",
- "type": {
- "kind": "ENUM",
- "name": "MoveType",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "newParentId",
- "description": "ID of the new parent epic.",
- "type": {
- "kind": "SCALAR",
- "name": "EpicID",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "EpicTreeReorderInput",
- "description": "Autogenerated input type of EpicTreeReorder",
- "fields": null,
- "inputFields": [
- {
- "name": "baseEpicId",
- "description": "The ID of the base epic of the tree.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "EpicID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "moved",
- "description": "Parameters for updating the tree positions.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "EpicTreeNodeFieldsInputType",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicTreeReorderPayload",
- "description": "Autogenerated return type of EpicTreeReorder",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "EpicTreeSortingID",
- "description": "Identifier of EpicTreeSorting.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "EpicWildcardId",
- "description": "Epic ID wildcard values",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "NONE",
- "description": "No epic is assigned",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ANY",
- "description": "Any epic is assigned",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Event",
- "description": "Representing an event",
- "fields": [
- {
- "name": "action",
- "description": "Action of the event.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "EventAction",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "author",
- "description": "Author of this event.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "When this event was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the event.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "When this event was updated.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "EventAction",
- "description": "Event action",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "CREATED",
- "description": "Created action",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UPDATED",
- "description": "Updated action",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CLOSED",
- "description": "Closed action",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "REOPENED",
- "description": "Reopened action",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PUSHED",
- "description": "Pushed action",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "COMMENTED",
- "description": "Commented action",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MERGED",
- "description": "Merged action",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "JOINED",
- "description": "Joined action",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LEFT",
- "description": "Left action",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DESTROYED",
- "description": "Destroyed action",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "EXPIRED",
- "description": "Expired action",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "APPROVED",
- "description": "Approved action",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ARCHIVED",
- "description": "Archived action",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EventConnection",
- "description": "The connection type for Event.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "EventEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Event",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EventEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Event",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INTERFACE",
- "name": "Eventable",
- "description": null,
- "fields": [
- {
- "name": "events",
- "description": "A list of events associated with the object.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EventConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": [
- {
- "kind": "OBJECT",
- "name": "BoardEpic",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- }
- ]
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "ExportRequirementsInput",
- "description": "Autogenerated input type of ExportRequirements",
- "fields": null,
- "inputFields": [
- {
- "name": "sort",
- "description": "List requirements by sort order.",
- "type": {
- "kind": "ENUM",
- "name": "Sort",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter requirements by state.",
- "type": {
- "kind": "ENUM",
- "name": "RequirementState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for requirement title.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Filter requirements by author username.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "projectPath",
- "description": "Full project path the requirements are associated with.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "selectedFields",
- "description": "List of selected requirements fields to be exported.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ExportRequirementsPayload",
- "description": "Autogenerated return type of ExportRequirements",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ExternalIssue",
- "description": "Represents an external issue",
- "fields": [
- {
- "name": "createdAt",
- "description": "Timestamp of when the issue was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "externalTracker",
- "description": "Type of external tracker.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "relativeReference",
- "description": "Relative reference of the issue in the external tracker.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "status",
- "description": "Status of the issue in the external tracker.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the issue in the external tracker.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp of when the issue was updated.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "URL to the issue in the external tracker.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "Float",
- "description": "Represents signed double-precision fractional values as specified by [IEEE 754](https://en.wikipedia.org/wiki/IEEE_floating_point).",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "GeoNode",
- "description": null,
- "fields": [
- {
- "name": "containerRepositoriesMaxCapacity",
- "description": "The maximum concurrency of container repository sync for this secondary node.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "enabled",
- "description": "Indicates whether this Geo node is enabled.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "filesMaxCapacity",
- "description": "The maximum concurrency of LFS/attachment backfill for this secondary node.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of this GeoNode.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "internalUrl",
- "description": "The URL defined on the primary node that secondary nodes should use to contact it.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestDiffRegistries",
- "description": "Find merge request diff registries on this Geo node.",
- "args": [
- {
- "name": "ids",
- "description": "Filters registries by their ID.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestDiffRegistryConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "minimumReverificationInterval",
- "description": "The interval (in days) in which the repository verification is valid. Once expired, it will be reverified.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "The unique identifier for this Geo node.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "packageFileRegistries",
- "description": "Package file registries of the GeoNode.",
- "args": [
- {
- "name": "ids",
- "description": "Filters registries by their ID.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PackageFileRegistryConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "primary",
- "description": "Indicates whether this Geo node is the primary.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "reposMaxCapacity",
- "description": "The maximum concurrency of repository backfill for this secondary node.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "selectiveSyncNamespaces",
- "description": "The namespaces that should be synced, if `selective_sync_type` == `namespaces`.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "NamespaceConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "selectiveSyncShards",
- "description": "The repository storages whose projects should be synced, if `selective_sync_type` == `shards`.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "selectiveSyncType",
- "description": "Indicates if syncing is limited to only specific groups, or shards.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "snippetRepositoryRegistries",
- "description": "Find snippet repository registries on this Geo node.",
- "args": [
- {
- "name": "ids",
- "description": "Filters registries by their ID.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SnippetRepositoryRegistryConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "syncObjectStorage",
- "description": "Indicates if this secondary node will replicate blobs in Object Storage.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "terraformStateVersionRegistries",
- "description": "Find terraform state version registries on this Geo node.",
- "args": [
- {
- "name": "ids",
- "description": "Filters registries by their ID.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TerraformStateVersionRegistryConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "url",
- "description": "The user-facing URL for this Geo node.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "verificationMaxCapacity",
- "description": "The maximum concurrency of repository verification for this secondary node.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "GitlabErrorTrackingDetailedErrorID",
- "description": "Identifier of Gitlab::ErrorTracking::DetailedError.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "GitlabSubscriptionActivateInput",
- "description": "Autogenerated input type of GitlabSubscriptionActivate",
- "fields": null,
- "inputFields": [
- {
- "name": "activationCode",
- "description": "Activation code received after purchasing a GitLab subscription.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "GitlabSubscriptionActivatePayload",
- "description": "Autogenerated return type of GitlabSubscriptionActivate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "GrafanaIntegration",
- "description": null,
- "fields": [
- {
- "name": "createdAt",
- "description": "Timestamp of the issue's creation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "enabled",
- "description": "Indicates whether Grafana integration is enabled.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "grafanaUrl",
- "description": "URL for the Grafana host for the Grafana integration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "Internal ID of the Grafana integration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp of the issue's last activity.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Group",
- "description": null,
- "fields": [
- {
- "name": "actualRepositorySizeLimit",
- "description": "Size limit for repositories in the namespace in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "additionalPurchasedStorageSize",
- "description": "Additional storage purchased for the root namespace in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "autoDevopsEnabled",
- "description": "Indicates whether Auto DevOps is enabled for all projects within this group.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "avatarUrl",
- "description": "Avatar URL of the group.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "board",
- "description": "A single board of the group.",
- "args": [
- {
- "name": "id",
- "description": "The board's ID.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "BoardID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Board",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "boards",
- "description": "Boards of the group.",
- "args": [
- {
- "name": "id",
- "description": "Find a board by its ID.",
- "type": {
- "kind": "SCALAR",
- "name": "BoardID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "codeCoverageActivities",
- "description": "Represents the code coverage activity for this group.",
- "args": [
- {
- "name": "startDate",
- "description": "First day for which to fetch code coverage activity (maximum time window is set to 90 days).",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Date",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CodeCoverageActivityConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "complianceFrameworks",
- "description": "Compliance frameworks available to projects in this namespace. Available only when feature flag `ff_custom_compliance_frameworks` is enabled.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "Global ID of a specific compliance framework to return.",
- "type": {
- "kind": "SCALAR",
- "name": "ComplianceManagementFrameworkID",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ComplianceFrameworkConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "containerRepositories",
- "description": "Container repositories of the group.",
- "args": [
- {
- "name": "name",
- "description": "Filter the container repositories by their name.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort container repositories by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "ContainerRepositorySort",
- "ofType": null
- },
- "defaultValue": "created_desc"
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ContainerRepositoryConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "containerRepositoriesCount",
- "description": "Number of container repositories in the group.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "containsLockedProjects",
- "description": "Includes at least one project where the repository size exceeds the limit.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "customEmoji",
- "description": "Custom emoji within this namespace. Available only when feature flag `custom_emoji` is enabled.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CustomEmojiConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descriptionHtml",
- "description": "The GitLab Flavored Markdown rendering of `description`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "emailsDisabled",
- "description": "Indicates if a group has email notifications disabled.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epic",
- "description": "Find a single epic.",
- "args": [
- {
- "name": "startDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.start.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "timeframe",
- "description": "List items overlapping the given timeframe.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "Timeframe",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "IID of the epic, e.g., \"1\".",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iids",
- "description": "List of IIDs of epics, e.g., [1, 2].",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter epics by state.",
- "type": {
- "kind": "ENUM",
- "name": "EpicState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for epic title or description.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "List epics by sort order.",
- "type": {
- "kind": "ENUM",
- "name": "EpicSort",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Filter epics by author.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labelName",
- "description": "Filter epics by labels.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Filter epics by milestone title, computed from epic's issues.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iidStartsWith",
- "description": "Filter epics by IID for autocomplete.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "includeDescendantGroups",
- "description": "Include epics from descendant groups.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "true"
- },
- {
- "name": "confidential",
- "description": "Filter epics by given confidentiality.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epicBoard",
- "description": "Find a single epic board.",
- "args": [
- {
- "name": "id",
- "description": "Find an epic board by ID.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "BoardsEpicBoardID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicBoard",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epicBoards",
- "description": "Find epic boards.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicBoardConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epics",
- "description": "Find epics.",
- "args": [
- {
- "name": "startDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.start.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "timeframe",
- "description": "List items overlapping the given timeframe.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "Timeframe",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "IID of the epic, e.g., \"1\".",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iids",
- "description": "List of IIDs of epics, e.g., [1, 2].",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter epics by state.",
- "type": {
- "kind": "ENUM",
- "name": "EpicState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for epic title or description.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "List epics by sort order.",
- "type": {
- "kind": "ENUM",
- "name": "EpicSort",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Filter epics by author.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labelName",
- "description": "Filter epics by labels.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Filter epics by milestone title, computed from epic's issues.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iidStartsWith",
- "description": "Filter epics by IID for autocomplete.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "includeDescendantGroups",
- "description": "Include epics from descendant groups.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "true"
- },
- {
- "name": "confidential",
- "description": "Filter epics by given confidentiality.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epicsEnabled",
- "description": "Indicates if Epics are enabled for namespace",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fullName",
- "description": "Full name of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fullPath",
- "description": "Full path of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "groupMembers",
- "description": "A membership of a user within this group.",
- "args": [
- {
- "name": "search",
- "description": "Search query.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "relations",
- "description": "Filter members by the given member relations.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "GroupMemberRelation",
- "ofType": null
- }
- }
- },
- "defaultValue": "[DIRECT, INHERITED]"
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "GroupMemberConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "groupTimelogsEnabled",
- "description": "Indicates if Group timelogs are enabled for namespace",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "isTemporaryStorageIncreaseEnabled",
- "description": "Status of the temporary storage increase.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issues",
- "description": "Issues for projects in this group.",
- "args": [
- {
- "name": "iid",
- "description": "IID of the issue. For example, \"1\".",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iids",
- "description": "List of IIDs of issues. For example, [1, 2].",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "labelName",
- "description": "Labels applied to this issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Milestone applied to this issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Username of the author of the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsername",
- "description": "Username of a user assigned to the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsernames",
- "description": "Usernames of users assigned to the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "assigneeId",
- "description": "ID of a user assigned to the issues, \"none\" and \"any\" values are supported.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "createdBefore",
- "description": "Issues created before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "createdAfter",
- "description": "Issues created after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "updatedBefore",
- "description": "Issues updated before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "updatedAfter",
- "description": "Issues updated after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "closedBefore",
- "description": "Issues closed before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "closedAfter",
- "description": "Issues closed after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for issue title or description.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "types",
- "description": "Filter issues by the given issue types.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "IssueType",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Current state of this issue.",
- "type": {
- "kind": "ENUM",
- "name": "IssuableState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort issues by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "IssueSort",
- "ofType": null
- },
- "defaultValue": "created_desc"
- },
- {
- "name": "iterationId",
- "description": "Iterations applied to the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "epicId",
- "description": "ID of an epic associated with the issues, \"none\" and \"any\" values are supported.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "includeSubgroups",
- "description": "Include issues belonging to subgroups",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iterations",
- "description": "Find iterations.",
- "args": [
- {
- "name": "startDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.start.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "timeframe",
- "description": "List items overlapping the given timeframe.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "Timeframe",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter iterations by state.",
- "type": {
- "kind": "ENUM",
- "name": "IterationState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "Fuzzy search by title.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "Global ID of the Iteration to look up.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "Internal ID of the Iteration to look up.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "includeAncestors",
- "description": "Whether to include ancestor iterations. Defaults to true.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IterationConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "label",
- "description": "A label available on this group.",
- "args": [
- {
- "name": "title",
- "description": "Title of the label.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Label",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "labels",
- "description": "Labels available on this group.",
- "args": [
- {
- "name": "searchTerm",
- "description": "A search term to find labels with.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "includeAncestorGroups",
- "description": "Include labels from ancestor groups.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "includeDescendantGroups",
- "description": "Include labels from descendant groups.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "onlyGroupLabels",
- "description": "Include only group level labels.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "LabelConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lfsEnabled",
- "description": "Indicates if Large File Storage (LFS) is enabled for namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mentionsDisabled",
- "description": "Indicates if a group is disabled from getting mentioned.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequests",
- "description": "Merge requests for projects in this group.",
- "args": [
- {
- "name": "iids",
- "description": "Array of IIDs of merge requests, for example `[1, 2]`.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "sourceBranches",
- "description": "Array of source branch names. All resolved merge requests will have one of these branches as their source.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "targetBranches",
- "description": "Array of target branch names. All resolved merge requests will have one of these branches as their target.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "A merge request state. If provided, all resolved merge requests will have this state.",
- "type": {
- "kind": "ENUM",
- "name": "MergeRequestState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labels",
- "description": "Array of label names. All resolved merge requests will have all of these labels.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "mergedAfter",
- "description": "Merge requests merged after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "mergedBefore",
- "description": "Merge requests merged before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Title of the milestone.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort merge requests by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "MergeRequestSort",
- "ofType": null
- },
- "defaultValue": "created_desc"
- },
- {
- "name": "includeSubgroups",
- "description": "Include merge requests belonging to subgroups",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "assigneeUsername",
- "description": "Username of the assignee.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Username of the author.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "milestones",
- "description": "Milestones of the group.",
- "args": [
- {
- "name": "startDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.start.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "timeframe",
- "description": "List items overlapping the given timeframe.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "Timeframe",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "ids",
- "description": "Array of global milestone IDs, e.g., \"gid://gitlab/Milestone/1\".",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter milestones by state.",
- "type": {
- "kind": "ENUM",
- "name": "MilestoneStateEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "The title of the milestone.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "searchTitle",
- "description": "A search string for the title.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "containingDate",
- "description": "A date that the milestone contains.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "includeDescendants",
- "description": "Also return milestones in all subgroups and subprojects.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MilestoneConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "packageSettings",
- "description": "The package settings for the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PackageSettings",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "parent",
- "description": "Parent group.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Group",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Path of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "projectCreationLevel",
- "description": "The permission level required to create projects in the group.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "projects",
- "description": "Projects within this namespace.",
- "args": [
- {
- "name": "includeSubgroups",
- "description": "Include also subgroup projects.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "search",
- "description": "Search project with most similar names or paths.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": "null"
- },
- {
- "name": "sort",
- "description": "Sort projects by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "NamespaceProjectSort",
- "ofType": null
- },
- "defaultValue": "null"
- },
- {
- "name": "hasVulnerabilities",
- "description": "Returns only the projects which have vulnerabilities.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ProjectConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "repositorySizeExcessProjectCount",
- "description": "Number of projects in the root namespace where the repository size exceeds the limit.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "requestAccessEnabled",
- "description": "Indicates if users can request access to namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "requireTwoFactorAuthentication",
- "description": "Indicates if all users in this group are required to set up two-factor authentication.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "rootStorageStatistics",
- "description": "Aggregated storage statistics of the namespace. Only available for root namespaces.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RootStorageStatistics",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "shareWithGroupLock",
- "description": "Indicates if sharing a project with another group within this group is prevented.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "stats",
- "description": "Group statistics.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "GroupStats",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "storageSizeLimit",
- "description": "Total storage limit of the root namespace in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "subgroupCreationLevel",
- "description": "The permission level required to create subgroups within the group.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "temporaryStorageIncreaseEndsOn",
- "description": "Date until the temporary storage increase is active.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "timelogs",
- "description": "Time logged in issues by group members.",
- "args": [
- {
- "name": "startDate",
- "description": "List time logs within a date range where the logged date is equal to or after startDate.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "List time logs within a date range where the logged date is equal to or before endDate.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "startTime",
- "description": "List time-logs within a time range where the logged time is equal to or after startTime.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "endTime",
- "description": "List time-logs within a time range where the logged time is equal to or before endTime.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TimelogConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "totalRepositorySize",
- "description": "Total repository size of all projects in the root namespace in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "totalRepositorySizeExcess",
- "description": "Total excess repository size of all projects in the root namespace in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "twoFactorGracePeriod",
- "description": "Time before two-factor authentication is enforced.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "GroupPermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "visibility",
- "description": "Visibility of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilities",
- "description": "Vulnerabilities reported on the projects in the group and its subgroups.",
- "args": [
- {
- "name": "projectId",
- "description": "Filter vulnerabilities by project.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "reportType",
- "description": "Filter vulnerabilities by report type.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityReportType",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "severity",
- "description": "Filter vulnerabilities by severity.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilitySeverity",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter vulnerabilities by state.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityState",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "scanner",
- "description": "Filter vulnerabilities by VulnerabilityScanner.externalId.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "List vulnerabilities by sort order.",
- "type": {
- "kind": "ENUM",
- "name": "VulnerabilitySort",
- "ofType": null
- },
- "defaultValue": "severity_desc"
- },
- {
- "name": "hasResolution",
- "description": "Returns only the vulnerabilities which have been resolved on default branch.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "hasIssues",
- "description": "Returns only the vulnerabilities which have linked issues.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilitiesCountByDay",
- "description": "Number of vulnerabilities per day for the projects in the group and its subgroups.",
- "args": [
- {
- "name": "startDate",
- "description": "First day for which to fetch vulnerability history.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "Last day for which to fetch vulnerability history.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilitiesCountByDayAndSeverity",
- "description": "Number of vulnerabilities per severity level, per day, for the projects in the group and its subgroups. Deprecated in 13.3: Use `vulnerabilitiesCountByDay`.",
- "args": [
- {
- "name": "startDate",
- "description": "First day for which to fetch vulnerability history.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "Last day for which to fetch vulnerability history.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayAndSeverityConnection",
- "ofType": null
- },
- "isDeprecated": true,
- "deprecationReason": "Use `vulnerabilitiesCountByDay`. Deprecated in 13.3."
- },
- {
- "name": "vulnerabilityGrades",
- "description": "Represents vulnerable project counts for each grade.",
- "args": [
- {
- "name": "includeSubgroups",
- "description": "Include grades belonging to subgroups.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerableProjectsByGrade",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilityScanners",
- "description": "Vulnerability scanners reported on the project vulnerabilities of the group and its subgroups.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityScannerConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilitySeveritiesCount",
- "description": "Counts for each vulnerability severity in the group and its subgroups.",
- "args": [
- {
- "name": "projectId",
- "description": "Filter vulnerabilities by project.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "reportType",
- "description": "Filter vulnerabilities by report type.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityReportType",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "severity",
- "description": "Filter vulnerabilities by severity.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilitySeverity",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter vulnerabilities by state.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityState",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "scanner",
- "description": "Filter vulnerabilities by scanner.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilitySeveritiesCount",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL of the group.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "GroupID",
- "description": "Identifier of Group.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "GroupMember",
- "description": "Represents a Group Membership",
- "fields": [
- {
- "name": "accessLevel",
- "description": "GitLab::Access level.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AccessLevel",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Date and time the membership was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdBy",
- "description": "User that authorized membership.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "expiresAt",
- "description": "Date and time the membership expires.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "group",
- "description": "Group that a User is a member of.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Group",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the member.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Date and time the membership was last updated.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "user",
- "description": "User that is associated with the member object.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "GroupPermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "MemberInterface",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "GroupMemberConnection",
- "description": "The connection type for GroupMember.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "GroupMemberEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "GroupMember",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "GroupMemberEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "GroupMember",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "GroupMemberRelation",
- "description": "Group member relation",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "DIRECT",
- "description": "Direct members",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "INHERITED",
- "description": "Inherited members",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DESCENDANTS",
- "description": "Descendants members",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "GroupPermissions",
- "description": null,
- "fields": [
- {
- "name": "readGroup",
- "description": "Indicates the user can perform `read_group` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "GroupReleaseStats",
- "description": "Contains release-related statistics about a group",
- "fields": [
- {
- "name": "releasesCount",
- "description": "Total number of releases in all descendant projects of the group. Will always return `null` if `group_level_release_statistics` feature flag is disabled",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "releasesPercentage",
- "description": "Percentage of the group's descendant projects that have at least one release. Will always return `null` if `group_level_release_statistics` feature flag is disabled",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "GroupStats",
- "description": "Contains statistics about a group",
- "fields": [
- {
- "name": "releaseStats",
- "description": "Statistics related to releases within the group.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "GroupReleaseStats",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "HealthStatus",
- "description": "Health status of an issue or epic",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "onTrack",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "needsAttention",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "atRisk",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "HttpIntegrationCreateInput",
- "description": "Autogenerated input type of HttpIntegrationCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project to create the integration in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The name of the integration.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "active",
- "description": "Whether the integration is receiving alerts.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "payloadExample",
- "description": "The example of an alert payload.",
- "type": {
- "kind": "SCALAR",
- "name": "JsonString",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "payloadAttributeMappings",
- "description": "The custom mapping of GitLab alert attributes to fields from the payload_example.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "AlertManagementPayloadAlertFieldInput",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "HttpIntegrationCreatePayload",
- "description": "Autogenerated return type of HttpIntegrationCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "integration",
- "description": "The HTTP integration.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementHttpIntegration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "HttpIntegrationDestroyInput",
- "description": "Autogenerated input type of HttpIntegrationDestroy",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The ID of the integration to remove.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "AlertManagementHttpIntegrationID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "HttpIntegrationDestroyPayload",
- "description": "Autogenerated return type of HttpIntegrationDestroy",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "integration",
- "description": "The HTTP integration.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementHttpIntegration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "HttpIntegrationResetTokenInput",
- "description": "Autogenerated input type of HttpIntegrationResetToken",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The ID of the integration to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "AlertManagementHttpIntegrationID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "HttpIntegrationResetTokenPayload",
- "description": "Autogenerated return type of HttpIntegrationResetToken",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "integration",
- "description": "The HTTP integration.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementHttpIntegration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "HttpIntegrationUpdateInput",
- "description": "Autogenerated input type of HttpIntegrationUpdate",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The ID of the integration to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "AlertManagementHttpIntegrationID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The name of the integration.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "active",
- "description": "Whether the integration is receiving alerts.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "payloadExample",
- "description": "The example of an alert payload.",
- "type": {
- "kind": "SCALAR",
- "name": "JsonString",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "payloadAttributeMappings",
- "description": "The custom mapping of GitLab alert attributes to fields from the payload_example.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "AlertManagementPayloadAlertFieldInput",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "HttpIntegrationUpdatePayload",
- "description": "Autogenerated return type of HttpIntegrationUpdate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "integration",
- "description": "The HTTP integration.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementHttpIntegration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "ID",
- "description": "Represents a unique identifier that is Base64 obfuscated. It is often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `\"VXNlci0xMA==\"`) or integer (such as `4`) input value will be accepted as an ID.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "description": "An ISO 8601-encoded date",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "IncidentManagementOncallParticipantID",
- "description": "Identifier of IncidentManagement::OncallParticipant.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallRotation",
- "description": "Describes an incident management on-call rotation",
- "fields": [
- {
- "name": "id",
- "description": "ID of the on-call rotation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "IncidentManagementOncallRotationID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "length",
- "description": "Length of the on-call schedule, in the units specified by lengthUnit.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lengthUnit",
- "description": "Unit of the on-call rotation length.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "OncallRotationUnitEnum",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the on-call rotation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "participants",
- "description": "Participants of the on-call rotation.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "OncallParticipantTypeConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "shifts",
- "description": "Blocks of time for which a participant is on-call within a given time frame. Time frame cannot exceed one month.",
- "args": [
- {
- "name": "startTime",
- "description": "Start of timeframe to include shifts for.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "endTime",
- "description": "End of timeframe to include shifts for. Cannot exceed one month after start.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallShiftConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startsAt",
- "description": "Start date of the on-call rotation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallRotationConnection",
- "description": "The connection type for IncidentManagementOncallRotation.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallRotationEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallRotation",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallRotationEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallRotation",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "IncidentManagementOncallRotationID",
- "description": "Identifier of IncidentManagement::OncallRotation.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallSchedule",
- "description": "Describes an incident management on-call schedule",
- "fields": [
- {
- "name": "description",
- "description": "Description of the on-call schedule.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iid",
- "description": "Internal ID of the on-call schedule.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the on-call schedule.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "rotations",
- "description": "On-call rotations for the on-call schedule.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallRotationConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "timezone",
- "description": "Time zone of the on-call schedule.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallScheduleConnection",
- "description": "The connection type for IncidentManagementOncallSchedule.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallScheduleEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallSchedule",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallScheduleEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallSchedule",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallShift",
- "description": "A block of time for which a participant is on-call.",
- "fields": [
- {
- "name": "endsAt",
- "description": "End time of the on-call shift.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "participant",
- "description": "Participant assigned to the on-call shift.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "OncallParticipantType",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startsAt",
- "description": "Start time of the on-call shift.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallShiftConnection",
- "description": "The connection type for IncidentManagementOncallShift.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallShiftEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallShift",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallShiftEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallShift",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "InstanceSecurityDashboard",
- "description": null,
- "fields": [
- {
- "name": "projects",
- "description": "Projects selected in Instance Security Dashboard.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ProjectConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilityGrades",
- "description": "Represents vulnerable project counts for each grade.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerableProjectsByGrade",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilityScanners",
- "description": "Vulnerability scanners reported on the vulnerabilities from projects selected in Instance Security Dashboard.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityScannerConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilitySeveritiesCount",
- "description": "Counts for each vulnerability severity from projects selected in Instance Security Dashboard.",
- "args": [
- {
- "name": "projectId",
- "description": "Filter vulnerabilities by project.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "reportType",
- "description": "Filter vulnerabilities by report type.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityReportType",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "severity",
- "description": "Filter vulnerabilities by severity.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilitySeverity",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter vulnerabilities by state.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityState",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "scanner",
- "description": "Filter vulnerabilities by scanner.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilitySeveritiesCount",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "InstanceStatisticsMeasurement",
- "description": "Represents a recorded measurement (object count) for the Admins",
- "fields": [
- {
- "name": "count",
- "description": "Object count.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "identifier",
- "description": "The type of objects being measured.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "MeasurementIdentifier",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "recordedAt",
- "description": "The time the measurement was recorded.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "InstanceStatisticsMeasurementConnection",
- "description": "The connection type for InstanceStatisticsMeasurement.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "InstanceStatisticsMeasurementEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "InstanceStatisticsMeasurement",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "InstanceStatisticsMeasurementEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "InstanceStatisticsMeasurement",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "Int",
- "description": "Represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "IssuableSeverity",
- "description": "Incident severity",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "UNKNOWN",
- "description": "Unknown severity",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LOW",
- "description": "Low severity",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MEDIUM",
- "description": "Medium severity",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "HIGH",
- "description": "High severity",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CRITICAL",
- "description": "Critical severity",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "IssuableState",
- "description": "State of a GitLab issue or merge request",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "opened",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "closed",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "locked",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "all",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Issue",
- "description": null,
- "fields": [
- {
- "name": "alertManagementAlert",
- "description": "Alert associated to this issue.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementAlert",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "assignees",
- "description": "Assignees of the issue.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UserConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "author",
- "description": "User that created the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "blocked",
- "description": "Indicates the issue is blocked.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "blockedByCount",
- "description": "Count of issues blocking this issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "closedAt",
- "description": "Timestamp of when the issue was closed.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "confidential",
- "description": "Indicates the issue is confidential.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createNoteEmail",
- "description": "User specific email address for the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp of when the issue was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "currentUserTodos",
- "description": "To-do items for the current user.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "State of the to-do items.",
- "type": {
- "kind": "ENUM",
- "name": "TodoStateEnum",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TodoConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descriptionHtml",
- "description": "The GitLab Flavored Markdown rendering of `description`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "designCollection",
- "description": "Collection of design images associated with this issue.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DesignCollection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussionLocked",
- "description": "Indicates discussion is locked on the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussions",
- "description": "All discussions on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiscussionConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "downvotes",
- "description": "Number of downvotes the issue has received.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dueDate",
- "description": "Due date of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "emailsDisabled",
- "description": "Indicates if a project has email notifications disabled: `true` if email notifications are disabled.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epic",
- "description": "Epic to which this issue belongs.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "healthStatus",
- "description": "Current health status.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "HealthStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "humanTimeEstimate",
- "description": "Human-readable time estimate of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "humanTotalTimeSpent",
- "description": "Human-readable total time reported as spent on the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iid",
- "description": "Internal ID of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iteration",
- "description": "Iteration of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Iteration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "labels",
- "description": "Labels of the issue.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "LabelConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "metricImages",
- "description": "Metric images associated to the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "MetricImage",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "milestone",
- "description": "Milestone of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Milestone",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "moved",
- "description": "Indicates if issue got moved from other project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "movedTo",
- "description": "Updated Issue after it got moved to another project.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notes",
- "description": "All notes on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NoteConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "participants",
- "description": "List of participants in the issue.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UserConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "reference",
- "description": "Internal reference of the issue. Returned in shortened format by default.",
- "args": [
- {
- "name": "full",
- "description": "Boolean option specifying whether the reference should be returned in full.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "relativePosition",
- "description": "Relative position of the issue (used for positioning in epic tree and issue boards).",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "severity",
- "description": "Severity level of the incident.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "IssuableSeverity",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "slaDueAt",
- "description": "Timestamp of when the issue SLA expires.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "State of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "IssueState",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "statusPagePublishedIncident",
- "description": "Indicates whether an issue is published to the status page.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "subscribed",
- "description": "Indicates the currently logged in user is subscribed to the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "taskCompletionStatus",
- "description": "Task completion status of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TaskCompletionStatus",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "timeEstimate",
- "description": "Time estimate of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "titleHtml",
- "description": "The GitLab Flavored Markdown rendering of `title`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "totalTimeSpent",
- "description": "Total time reported as spent on the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "IssueType",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp of when the issue was last updated.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedBy",
- "description": "User that last updated the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "upvotes",
- "description": "Number of upvotes the issue has received.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userDiscussionsCount",
- "description": "Number of user discussions in the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userNotesCount",
- "description": "Number of user notes of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "IssuePermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webPath",
- "description": "Web path of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "weight",
- "description": "Weight of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Noteable",
- "ofType": null
- },
- {
- "kind": "INTERFACE",
- "name": "CurrentUserTodos",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueConnection",
- "description": "The connection type for Issue.",
- "fields": [
- {
- "name": "count",
- "description": "Total count of collection.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "IssueEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "weight",
- "description": "Total weight of issues collection.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "IssueID",
- "description": "Identifier of Issue.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "IssueMoveInput",
- "description": "Autogenerated input type of IssueMove",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the issue to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "targetProjectPath",
- "description": "The project to move the issue to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "IssueMoveListInput",
- "description": "Autogenerated input type of IssueMoveList",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "Project the issue to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "IID of the issue to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "boardId",
- "description": "Global ID of the board that the issue is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "fromListId",
- "description": "ID of the board list that the issue will be moved from.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "toListId",
- "description": "ID of the board list that the issue will be moved to.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "moveBeforeId",
- "description": "ID of issue that should be placed before the current issue.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "moveAfterId",
- "description": "ID of issue that should be placed after the current issue.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "epicId",
- "description": "The ID of the parent epic. NULL when removing the association.",
- "type": {
- "kind": "SCALAR",
- "name": "EpicID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueMoveListPayload",
- "description": "Autogenerated return type of IssueMoveList",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueMovePayload",
- "description": "Autogenerated return type of IssueMove",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssuePermissions",
- "description": "Check permissions for the current user on a issue",
- "fields": [
- {
- "name": "adminIssue",
- "description": "Indicates the user can perform `admin_issue` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createDesign",
- "description": "Indicates the user can perform `create_design` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createNote",
- "description": "Indicates the user can perform `create_note` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyDesign",
- "description": "Indicates the user can perform `destroy_design` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readDesign",
- "description": "Indicates the user can perform `read_design` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readIssue",
- "description": "Indicates the user can perform `read_issue` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "reopenIssue",
- "description": "Indicates the user can perform `reopen_issue` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateIssue",
- "description": "Indicates the user can perform `update_issue` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetAssigneesInput",
- "description": "Autogenerated input type of IssueSetAssignees",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the issue to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsernames",
- "description": "The usernames to assign to the resource. Replaces existing assignees by default.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "operationMode",
- "description": "The operation to perform. Defaults to REPLACE.",
- "type": {
- "kind": "ENUM",
- "name": "MutationOperationMode",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueSetAssigneesPayload",
- "description": "Autogenerated return type of IssueSetAssignees",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetConfidentialInput",
- "description": "Autogenerated input type of IssueSetConfidential",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the issue to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "confidential",
- "description": "Whether or not to set the issue as a confidential.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueSetConfidentialPayload",
- "description": "Autogenerated return type of IssueSetConfidential",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetDueDateInput",
- "description": "Autogenerated input type of IssueSetDueDate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the issue to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "dueDate",
- "description": "The desired due date for the issue.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueSetDueDatePayload",
- "description": "Autogenerated return type of IssueSetDueDate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetEpicInput",
- "description": "Autogenerated input type of IssueSetEpic",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the issue to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "epicId",
- "description": "Global ID of the epic to be assigned to the issue, epic will be removed if absent or set to null",
- "type": {
- "kind": "SCALAR",
- "name": "EpicID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueSetEpicPayload",
- "description": "Autogenerated return type of IssueSetEpic",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetIterationInput",
- "description": "Autogenerated input type of IssueSetIteration",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the issue to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iterationId",
- "description": "The iteration to assign to the issue.\n",
- "type": {
- "kind": "SCALAR",
- "name": "IterationID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueSetIterationPayload",
- "description": "Autogenerated return type of IssueSetIteration",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetLockedInput",
- "description": "Autogenerated input type of IssueSetLocked",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the issue to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "locked",
- "description": "Whether or not to lock discussion on the issue.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueSetLockedPayload",
- "description": "Autogenerated return type of IssueSetLocked",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetSeverityInput",
- "description": "Autogenerated input type of IssueSetSeverity",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the issue to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "severity",
- "description": "Set the incident severity level.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "IssuableSeverity",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueSetSeverityPayload",
- "description": "Autogenerated return type of IssueSetSeverity",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetSubscriptionInput",
- "description": "Autogenerated input type of IssueSetSubscription",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the issue to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "subscribedState",
- "description": "The desired state of the subscription.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueSetSubscriptionPayload",
- "description": "Autogenerated return type of IssueSetSubscription",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetWeightInput",
- "description": "Autogenerated input type of IssueSetWeight",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the issue to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "weight",
- "description": "The desired weight for the issue.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueSetWeightPayload",
- "description": "Autogenerated return type of IssueSetWeight",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "IssueSort",
- "description": "Values for sorting issues",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "updated_desc",
- "description": "Updated at descending order",
- "isDeprecated": true,
- "deprecationReason": "Use UPDATED_DESC. Deprecated in 13.5."
- },
- {
- "name": "updated_asc",
- "description": "Updated at ascending order",
- "isDeprecated": true,
- "deprecationReason": "Use UPDATED_ASC. Deprecated in 13.5."
- },
- {
- "name": "created_desc",
- "description": "Created at descending order",
- "isDeprecated": true,
- "deprecationReason": "Use CREATED_DESC. Deprecated in 13.5."
- },
- {
- "name": "created_asc",
- "description": "Created at ascending order",
- "isDeprecated": true,
- "deprecationReason": "Use CREATED_ASC. Deprecated in 13.5."
- },
- {
- "name": "UPDATED_DESC",
- "description": "Updated at descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UPDATED_ASC",
- "description": "Updated at ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED_DESC",
- "description": "Created at descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED_ASC",
- "description": "Created at ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PRIORITY_ASC",
- "description": "Priority by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PRIORITY_DESC",
- "description": "Priority by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LABEL_PRIORITY_ASC",
- "description": "Label priority by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LABEL_PRIORITY_DESC",
- "description": "Label priority by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MILESTONE_DUE_ASC",
- "description": "Milestone due date by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MILESTONE_DUE_DESC",
- "description": "Milestone due date by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DUE_DATE_ASC",
- "description": "Due date by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DUE_DATE_DESC",
- "description": "Due date by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "RELATIVE_POSITION_ASC",
- "description": "Relative position by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SEVERITY_ASC",
- "description": "Severity from less critical to more critical",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SEVERITY_DESC",
- "description": "Severity from more critical to less critical",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEIGHT_ASC",
- "description": "Weight by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEIGHT_DESC",
- "description": "Weight by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PUBLISHED_ASC",
- "description": "Published issues shown last",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PUBLISHED_DESC",
- "description": "Published issues shown first",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SLA_DUE_AT_ASC",
- "description": "Issues with earliest SLA due time shown first",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SLA_DUE_AT_DESC",
- "description": "Issues with latest SLA due time shown first",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "IssueState",
- "description": "State of a GitLab issue",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "opened",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "closed",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "locked",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "all",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "IssueStateEvent",
- "description": "Values for issue state events",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "REOPEN",
- "description": "Reopens the issue",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CLOSE",
- "description": "Closes the issue",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueStatusCountsType",
- "description": "Represents total number of issues for the represented statuses",
- "fields": [
- {
- "name": "all",
- "description": "Number of issues with status ALL for the project",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "closed",
- "description": "Number of issues with status CLOSED for the project",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "opened",
- "description": "Number of issues with status OPENED for the project",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "IssueType",
- "description": "Issue type",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "ISSUE",
- "description": "Issue issue type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "INCIDENT",
- "description": "Incident issue type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "TEST_CASE",
- "description": "Test Case issue type",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Iteration",
- "description": "Represents an iteration object",
- "fields": [
- {
- "name": "createdAt",
- "description": "Timestamp of iteration creation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the iteration.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descriptionHtml",
- "description": "The GitLab Flavored Markdown rendering of `description`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dueDate",
- "description": "Timestamp of the iteration due date.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the iteration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iid",
- "description": "Internal ID of the iteration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "report",
- "description": "Historically accurate report about the timebox.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TimeboxReport",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "scopedPath",
- "description": "Web path of the iteration, scoped to the query parent. Only valid for Project parents. Returns null in other contexts.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "scopedUrl",
- "description": "Web URL of the iteration, scoped to the query parent. Only valid for Project parents. Returns null in other contexts.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startDate",
- "description": "Timestamp of the iteration start date.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "State of the iteration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "IterationState",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the iteration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp of last iteration update.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webPath",
- "description": "Web path of the iteration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL of the iteration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "TimeboxReportInterface",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IterationConnection",
- "description": "The connection type for Iteration.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "IterationEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Iteration",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IterationEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Iteration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "IterationID",
- "description": "Identifier of Iteration.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "IterationState",
- "description": "State of a GitLab iteration",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "upcoming",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "started",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "opened",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "closed",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "all",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "IterationWildcardId",
- "description": "Iteration ID wildcard values",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "NONE",
- "description": "No iteration is assigned",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ANY",
- "description": "An iteration is assigned",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CURRENT",
- "description": "Current iteration",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "JSON",
- "description": "Represents untyped JSON",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "JiraImport",
- "description": null,
- "fields": [
- {
- "name": "createdAt",
- "description": "Timestamp of when the Jira import was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "failedToImportCount",
- "description": "Count of issues that failed to import.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "importedIssuesCount",
- "description": "Count of issues that were successfully imported.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "jiraProjectKey",
- "description": "Project key for the imported Jira project.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "scheduledAt",
- "description": "Timestamp of when the Jira import was scheduled.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "scheduledBy",
- "description": "User that started the Jira import.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "totalIssueCount",
- "description": "Total count of issues that were attempted to import.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "JiraImportConnection",
- "description": "The connection type for JiraImport.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "JiraImportEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "JiraImport",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "JiraImportEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "JiraImport",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "JiraImportStartInput",
- "description": "Autogenerated input type of JiraImportStart",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project to import the Jira project into.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "jiraProjectKey",
- "description": "Project key of the importer Jira project.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "jiraProjectName",
- "description": "Project name of the importer Jira project.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "usersMapping",
- "description": "The mapping of Jira to GitLab users.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "JiraUsersMappingInputType",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "JiraImportStartPayload",
- "description": "Autogenerated return type of JiraImportStart",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "jiraImport",
- "description": "The Jira import data after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "JiraImport",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "JiraImportUsersInput",
- "description": "Autogenerated input type of JiraImportUsers",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project to import the Jira users into.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "startAt",
- "description": "The index of the record the import should started at, default 0 (50 records returned).",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "JiraImportUsersPayload",
- "description": "Autogenerated return type of JiraImportUsers",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "jiraUsers",
- "description": "Users returned from Jira, matched by email and name if possible.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "JiraUser",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "JiraProject",
- "description": null,
- "fields": [
- {
- "name": "key",
- "description": "Key of the Jira project.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the Jira project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "projectId",
- "description": "ID of the Jira project.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "JiraProjectConnection",
- "description": "The connection type for JiraProject.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "JiraProjectEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "JiraProject",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "JiraProjectEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "JiraProject",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "JiraService",
- "description": null,
- "fields": [
- {
- "name": "active",
- "description": "Indicates if the service is active.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "projects",
- "description": "List of all Jira projects fetched through Jira REST API.",
- "args": [
- {
- "name": "name",
- "description": "Project name or key.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "JiraProjectConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Class name of the service.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Service",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "JiraUser",
- "description": null,
- "fields": [
- {
- "name": "gitlabId",
- "description": "ID of the matched GitLab user.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "gitlabName",
- "description": "Name of the matched GitLab user.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "gitlabUsername",
- "description": "Username of the matched GitLab user.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "jiraAccountId",
- "description": "Account ID of the Jira user.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "jiraDisplayName",
- "description": "Display name of the Jira user.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "jiraEmail",
- "description": "Email of the Jira user, returned only for users with public emails.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "JiraUsersMappingInputType",
- "description": null,
- "fields": null,
- "inputFields": [
- {
- "name": "jiraAccountId",
- "description": "Jira account ID of the user.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "gitlabId",
- "description": "Id of the GitLab user.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "JobArtifactFileType",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "ARCHIVE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "METADATA",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "TRACE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "JUNIT",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "METRICS",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "METRICS_REFEREE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "NETWORK_REFEREE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DOTENV",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "COBERTURA",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CLUSTER_APPLICATIONS",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LSIF",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SAST",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SECRET_DETECTION",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DEPENDENCY_SCANNING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CONTAINER_SCANNING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DAST",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LICENSE_MANAGEMENT",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LICENSE_SCANNING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ACCESSIBILITY",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CODEQUALITY",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PERFORMANCE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "BROWSER_PERFORMANCE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LOAD_PERFORMANCE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "TERRAFORM",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "REQUIREMENTS",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "COVERAGE_FUZZING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "API_FUZZING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "JsonString",
- "description": "JSON object as raw string",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Label",
- "description": null,
- "fields": [
- {
- "name": "color",
- "description": "Background color of the label.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the label (Markdown rendered as HTML for caching).",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descriptionHtml",
- "description": "The GitLab Flavored Markdown rendering of `description`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "Label ID.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "textColor",
- "description": "Text color of the label.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Content of the label.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "LabelConnection",
- "description": "The connection type for Label.",
- "fields": [
- {
- "name": "count",
- "description": "Total count of collection.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "LabelEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Label",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "LabelCreateInput",
- "description": "Autogenerated input type of LabelCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "Full path of the project with which the resource is associated.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "groupPath",
- "description": "Full path of the group with which the resource is associated.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "Title of the label.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "Description of the label.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "color",
- "description": "The color of the label given in 6-digit hex notation with leading '#' sign (e.g. #FFAABB) or one of the CSS color names in https://developer.mozilla.org/en-US/docs/Web/CSS/color_value#Color_keywords.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": "\"#6699cc\""
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "LabelCreatePayload",
- "description": "Autogenerated return type of LabelCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "label",
- "description": "The label after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Label",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "LabelEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Label",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "LabelID",
- "description": "Identifier of Label.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "ListID",
- "description": "Identifier of List.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "ListLimitMetric",
- "description": "List limit metric setting",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "all_metrics",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue_count",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue_weights",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "MarkAsSpamSnippetInput",
- "description": "Autogenerated input type of MarkAsSpamSnippet",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the snippet to update.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "SnippetID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MarkAsSpamSnippetPayload",
- "description": "Autogenerated return type of MarkAsSpamSnippet",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "snippet",
- "description": "The snippet after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Snippet",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "MeasurementIdentifier",
- "description": "Possible identifier types for a measurement",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "PROJECTS",
- "description": "Project count",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "USERS",
- "description": "User count",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ISSUES",
- "description": "Issue count",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MERGE_REQUESTS",
- "description": "Merge request count",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "GROUPS",
- "description": "Group count",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PIPELINES",
- "description": "Pipeline count",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PIPELINES_SUCCEEDED",
- "description": "Pipeline count with success status",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PIPELINES_FAILED",
- "description": "Pipeline count with failed status",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PIPELINES_CANCELED",
- "description": "Pipeline count with canceled status",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PIPELINES_SKIPPED",
- "description": "Pipeline count with skipped status",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "INTERFACE",
- "name": "MemberInterface",
- "description": null,
- "fields": [
- {
- "name": "accessLevel",
- "description": "GitLab::Access level.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AccessLevel",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Date and time the membership was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdBy",
- "description": "User that authorized membership.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "expiresAt",
- "description": "Date and time the membership expires.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the member.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Date and time the membership was last updated.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "user",
- "description": "User that is associated with the member object.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": [
- {
- "kind": "OBJECT",
- "name": "GroupMember",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "ProjectMember",
- "ofType": null
- }
- ]
- },
- {
- "kind": "OBJECT",
- "name": "MemberInterfaceConnection",
- "description": "The connection type for MemberInterface.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "MemberInterfaceEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "INTERFACE",
- "name": "MemberInterface",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MemberInterfaceEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "INTERFACE",
- "name": "MemberInterface",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "description": null,
- "fields": [
- {
- "name": "allowCollaboration",
- "description": "Indicates if members of the target project can push to the fork.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "approvalsLeft",
- "description": "Number of approvals left.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "approvalsRequired",
- "description": "Number of approvals required.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "approved",
- "description": "Indicates if the merge request has all the required approvals. Returns true if no required approvals are configured.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "approvedBy",
- "description": "Users who approved the merge request.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UserConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "assignees",
- "description": "Assignees of the merge request.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UserConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "author",
- "description": "User who created this merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "autoMergeEnabled",
- "description": "Indicates if auto merge is enabled for the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "autoMergeStrategy",
- "description": "Selected auto merge strategy.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "availableAutoMergeStrategies",
- "description": "Array of available auto merge strategies.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "commitCount",
- "description": "Number of commits in the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "commitsWithoutMergeCommits",
- "description": "Merge request commits excluding merge commits.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CommitConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "conflicts",
- "description": "Indicates if the merge request has conflicts.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp of when the merge request was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "currentUserTodos",
- "description": "To-do items for the current user.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "State of the to-do items.",
- "type": {
- "kind": "ENUM",
- "name": "TodoStateEnum",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TodoConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "defaultMergeCommitMessage",
- "description": "Default merge commit message of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "defaultMergeCommitMessageWithDescription",
- "description": "Default merge commit message of the merge request with description.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "defaultSquashCommitMessage",
- "description": "Default squash commit message of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the merge request (Markdown rendered as HTML for caching).",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descriptionHtml",
- "description": "The GitLab Flavored Markdown rendering of `description`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "diffHeadSha",
- "description": "Diff head SHA of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "diffRefs",
- "description": "References of the base SHA, the head SHA, and the start SHA for this merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DiffRefs",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "diffStats",
- "description": "Details about which files were changed in this merge request.",
- "args": [
- {
- "name": "path",
- "description": "A specific file-path.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiffStats",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "diffStatsSummary",
- "description": "Summary of which files were changed in this merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DiffStatsSummary",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussionLocked",
- "description": "Indicates if comments on the merge request are locked to members only.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussions",
- "description": "All discussions on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiscussionConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "downvotes",
- "description": "Number of downvotes for the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "forceRemoveSourceBranch",
- "description": "Indicates if the project settings will lead to source branch deletion after merge.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hasCi",
- "description": "Indicates if the merge request has CI.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hasSecurityReports",
- "description": "Indicates if the source branch has any security reports.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "headPipeline",
- "description": "The pipeline running on the branch HEAD of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Pipeline",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iid",
- "description": "Internal ID of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "inProgressMergeCommitSha",
- "description": "Commit SHA of the merge request if merge is in progress.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "labels",
- "description": "Labels of the merge request.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "LabelConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeCommitSha",
- "description": "SHA of the merge request commit (set once merged).",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeError",
- "description": "Error message due to a merge error.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeOngoing",
- "description": "Indicates if a merge is currently occurring.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeStatus",
- "description": "Status of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeTrainsCount",
- "description": "Number of merge requests in the merge train.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeUser",
- "description": "User who merged this merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeWhenPipelineSucceeds",
- "description": "Indicates if the merge has been set to be merged when its pipeline succeeds (MWPS).",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeable",
- "description": "Indicates if the merge request is mergeable.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeableDiscussionsState",
- "description": "Indicates if all discussions in the merge request have been resolved, allowing the merge request to be merged.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergedAt",
- "description": "Timestamp of when the merge request was merged, null if not merged.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "milestone",
- "description": "The milestone of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Milestone",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notes",
- "description": "All notes on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NoteConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "participants",
- "description": "Participants in the merge request. This includes the author, assignees, reviewers, and users mentioned in notes.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UserConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelines",
- "description": "Pipelines for the merge request. Note: for performance reasons, no more than the most recent 500 pipelines will be returned.",
- "args": [
- {
- "name": "status",
- "description": "Filter pipelines by their status.",
- "type": {
- "kind": "ENUM",
- "name": "PipelineStatusEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "ref",
- "description": "Filter pipelines by the ref they are run for.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sha",
- "description": "Filter pipelines by the sha of the commit they are run for.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PipelineConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "Alias for target_project.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "projectId",
- "description": "ID of the merge request project.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "rebaseCommitSha",
- "description": "Rebase commit SHA of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "rebaseInProgress",
- "description": "Indicates if there is a rebase currently in progress for the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "reference",
- "description": "Internal reference of the merge request. Returned in shortened format by default.",
- "args": [
- {
- "name": "full",
- "description": "Boolean option specifying whether the reference should be returned in full.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "reviewers",
- "description": "Users from whom a review has been requested.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UserConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "securityAutoFix",
- "description": "Indicates if the merge request is created by @GitLab-Security-Bot.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "shouldBeRebased",
- "description": "Indicates if the merge request will be rebased.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "shouldRemoveSourceBranch",
- "description": "Indicates if the source branch of the merge request will be deleted after merge.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sourceBranch",
- "description": "Source branch of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sourceBranchExists",
- "description": "Indicates if the source branch of the merge request exists.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sourceBranchProtected",
- "description": "Indicates if the source branch is protected.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sourceProject",
- "description": "Source project of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sourceProjectId",
- "description": "ID of the merge request source project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "squash",
- "description": "Indicates if squash on merge is enabled.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "squashOnMerge",
- "description": "Indicates if squash on merge is enabled.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "State of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "MergeRequestState",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "subscribed",
- "description": "Indicates if the currently logged in user is subscribed to this merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "targetBranch",
- "description": "Target branch of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "targetBranchExists",
- "description": "Indicates if the target branch of the merge request exists.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "targetProject",
- "description": "Target project of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "targetProjectId",
- "description": "ID of the merge request target project.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "taskCompletionStatus",
- "description": "Completion status of tasks",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TaskCompletionStatus",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "timeEstimate",
- "description": "Time estimate of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "titleHtml",
- "description": "The GitLab Flavored Markdown rendering of `title`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "totalTimeSpent",
- "description": "Total time reported as spent on the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp of when the merge request was last updated.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "upvotes",
- "description": "Number of upvotes for the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userDiscussionsCount",
- "description": "Number of user discussions in the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userNotesCount",
- "description": "User notes count of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "MergeRequestPermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "workInProgress",
- "description": "Indicates if the merge request is a work in progress (WIP).",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Noteable",
- "ofType": null
- },
- {
- "kind": "INTERFACE",
- "name": "CurrentUserTodos",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestConnection",
- "description": "The connection type for MergeRequest.",
- "fields": [
- {
- "name": "count",
- "description": "Total count of collection.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "MergeRequestEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "totalTimeToMerge",
- "description": "Total sum of time to merge, in seconds, for the collection of merge requests.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestCreateInput",
- "description": "Autogenerated input type of MergeRequestCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "Project full path the merge request is associated with.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "Title of the merge request.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "sourceBranch",
- "description": "Source branch of the merge request.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "targetBranch",
- "description": "Target branch of the merge request.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "Description of the merge request (Markdown rendered as HTML for caching).",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labels",
- "description": "Labels of the merge request.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestCreatePayload",
- "description": "Autogenerated return type of MergeRequestCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequest",
- "description": "The merge request after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestDiffRegistry",
- "description": "Represents the Geo sync and verification state of a Merge Request diff",
- "fields": [
- {
- "name": "createdAt",
- "description": "Timestamp when the MergeRequestDiffRegistry was created",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the MergeRequestDiffRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastSyncFailure",
- "description": "Error message during sync of the MergeRequestDiffRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastSyncedAt",
- "description": "Timestamp of the most recent successful sync of the MergeRequestDiffRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestDiffId",
- "description": "ID of the Merge Request diff.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "retryAt",
- "description": "Timestamp after which the MergeRequestDiffRegistry should be resynced",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "retryCount",
- "description": "Number of consecutive failed sync attempts of the MergeRequestDiffRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "Sync state of the MergeRequestDiffRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "RegistryState",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestDiffRegistryConnection",
- "description": "The connection type for MergeRequestDiffRegistry.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "MergeRequestDiffRegistryEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "MergeRequestDiffRegistry",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestDiffRegistryEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestDiffRegistry",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "MergeRequestID",
- "description": "Identifier of MergeRequest.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "MergeRequestNewState",
- "description": "New state to apply to a merge request.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "OPEN",
- "description": "Open the merge request if it is closed.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CLOSED",
- "description": "Close the merge request if it is open.",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestPermissions",
- "description": "Check permissions for the current user on a merge request",
- "fields": [
- {
- "name": "adminMergeRequest",
- "description": "Indicates the user can perform `admin_merge_request` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "canMerge",
- "description": "Indicates the user can perform `can_merge` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "cherryPickOnCurrentMergeRequest",
- "description": "Indicates the user can perform `cherry_pick_on_current_merge_request` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createNote",
- "description": "Indicates the user can perform `create_note` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pushToSourceBranch",
- "description": "Indicates the user can perform `push_to_source_branch` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readMergeRequest",
- "description": "Indicates the user can perform `read_merge_request` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "removeSourceBranch",
- "description": "Indicates the user can perform `remove_source_branch` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "revertOnCurrentMergeRequest",
- "description": "Indicates the user can perform `revert_on_current_merge_request` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateMergeRequest",
- "description": "Indicates the user can perform `update_merge_request` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestReviewerRereviewInput",
- "description": "Autogenerated input type of MergeRequestReviewerRereview",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the merge request to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the merge request to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "userId",
- "description": "The user ID for the user that has been requested for a new review.\n",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "UserID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestReviewerRereviewPayload",
- "description": "Autogenerated return type of MergeRequestReviewerRereview",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequest",
- "description": "The merge request after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestSetAssigneesInput",
- "description": "Autogenerated input type of MergeRequestSetAssignees",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the merge request to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the merge request to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsernames",
- "description": "The usernames to assign to the resource. Replaces existing assignees by default.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "operationMode",
- "description": "The operation to perform. Defaults to REPLACE.",
- "type": {
- "kind": "ENUM",
- "name": "MutationOperationMode",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestSetAssigneesPayload",
- "description": "Autogenerated return type of MergeRequestSetAssignees",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequest",
- "description": "The merge request after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestSetLabelsInput",
- "description": "Autogenerated input type of MergeRequestSetLabels",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the merge request to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the merge request to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "labelIds",
- "description": "The Label IDs to set. Replaces existing labels by default.\n",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "LabelID",
- "ofType": null
- }
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "operationMode",
- "description": "Changes the operation mode. Defaults to REPLACE.\n",
- "type": {
- "kind": "ENUM",
- "name": "MutationOperationMode",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestSetLabelsPayload",
- "description": "Autogenerated return type of MergeRequestSetLabels",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequest",
- "description": "The merge request after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestSetLockedInput",
- "description": "Autogenerated input type of MergeRequestSetLocked",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the merge request to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the merge request to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "locked",
- "description": "Whether or not to lock the merge request.\n",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestSetLockedPayload",
- "description": "Autogenerated return type of MergeRequestSetLocked",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequest",
- "description": "The merge request after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestSetMilestoneInput",
- "description": "Autogenerated input type of MergeRequestSetMilestone",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the merge request to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the merge request to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "milestoneId",
- "description": "The milestone to assign to the merge request.\n",
- "type": {
- "kind": "SCALAR",
- "name": "MilestoneID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestSetMilestonePayload",
- "description": "Autogenerated return type of MergeRequestSetMilestone",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequest",
- "description": "The merge request after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestSetSubscriptionInput",
- "description": "Autogenerated input type of MergeRequestSetSubscription",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the merge request to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the merge request to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "subscribedState",
- "description": "The desired state of the subscription.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestSetSubscriptionPayload",
- "description": "Autogenerated return type of MergeRequestSetSubscription",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequest",
- "description": "The merge request after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestSetWipInput",
- "description": "Autogenerated input type of MergeRequestSetWip",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the merge request to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the merge request to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "wip",
- "description": "Whether or not to set the merge request as a WIP.\n",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestSetWipPayload",
- "description": "Autogenerated return type of MergeRequestSetWip",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequest",
- "description": "The merge request after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "MergeRequestSort",
- "description": "Values for sorting merge requests",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "updated_desc",
- "description": "Updated at descending order",
- "isDeprecated": true,
- "deprecationReason": "Use UPDATED_DESC. Deprecated in 13.5."
- },
- {
- "name": "updated_asc",
- "description": "Updated at ascending order",
- "isDeprecated": true,
- "deprecationReason": "Use UPDATED_ASC. Deprecated in 13.5."
- },
- {
- "name": "created_desc",
- "description": "Created at descending order",
- "isDeprecated": true,
- "deprecationReason": "Use CREATED_DESC. Deprecated in 13.5."
- },
- {
- "name": "created_asc",
- "description": "Created at ascending order",
- "isDeprecated": true,
- "deprecationReason": "Use CREATED_ASC. Deprecated in 13.5."
- },
- {
- "name": "UPDATED_DESC",
- "description": "Updated at descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UPDATED_ASC",
- "description": "Updated at ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED_DESC",
- "description": "Created at descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED_ASC",
- "description": "Created at ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PRIORITY_ASC",
- "description": "Priority by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PRIORITY_DESC",
- "description": "Priority by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LABEL_PRIORITY_ASC",
- "description": "Label priority by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LABEL_PRIORITY_DESC",
- "description": "Label priority by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MILESTONE_DUE_ASC",
- "description": "Milestone due date by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MILESTONE_DUE_DESC",
- "description": "Milestone due date by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MERGED_AT_ASC",
- "description": "Merge time by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MERGED_AT_DESC",
- "description": "Merge time by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "MergeRequestState",
- "description": "State of a GitLab merge request",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "opened",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "closed",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "locked",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "all",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "merged",
- "description": "Merge Request has been merged",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestUpdateInput",
- "description": "Autogenerated input type of MergeRequestUpdate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the merge request to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the merge request to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "Title of the merge request.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "targetBranch",
- "description": "Target branch of the merge request.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "Description of the merge request (Markdown rendered as HTML for caching).",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "The action to perform to change the state.",
- "type": {
- "kind": "ENUM",
- "name": "MergeRequestNewState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestUpdatePayload",
- "description": "Autogenerated return type of MergeRequestUpdate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequest",
- "description": "The merge request after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Metadata",
- "description": null,
- "fields": [
- {
- "name": "revision",
- "description": "Revision.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "version",
- "description": "Version.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MetricImage",
- "description": "Represents a metric image upload",
- "fields": [
- {
- "name": "fileName",
- "description": "File name of the metric image.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "filePath",
- "description": "File path of the metric image.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the metric upload.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iid",
- "description": "Internal ID of the metric upload.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "url",
- "description": "URL of the metric source.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MetricsDashboard",
- "description": null,
- "fields": [
- {
- "name": "annotations",
- "description": "Annotations added to the dashboard.",
- "args": [
- {
- "name": "from",
- "description": "Timestamp marking date and time from which annotations need to be fetched.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "to",
- "description": "Timestamp marking date and time to which annotations need to be fetched.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MetricsDashboardAnnotationConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Path to a file with the dashboard definition.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "schemaValidationWarnings",
- "description": "Dashboard schema validation warnings.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MetricsDashboardAnnotation",
- "description": null,
- "fields": [
- {
- "name": "description",
- "description": "Description of the annotation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "endingAt",
- "description": "Timestamp marking end of annotated time span.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the annotation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "panelId",
- "description": "ID of a dashboard panel to which the annotation should be scoped.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startingAt",
- "description": "Timestamp marking start of annotated time span.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MetricsDashboardAnnotationConnection",
- "description": "The connection type for MetricsDashboardAnnotation.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "MetricsDashboardAnnotationEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "MetricsDashboardAnnotation",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MetricsDashboardAnnotationEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MetricsDashboardAnnotation",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "MetricsDashboardAnnotationID",
- "description": "Identifier of Metrics::Dashboard::Annotation.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Milestone",
- "description": "Represents a milestone",
- "fields": [
- {
- "name": "createdAt",
- "description": "Timestamp of milestone creation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the milestone.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dueDate",
- "description": "Timestamp of the milestone due date.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "groupMilestone",
- "description": "Indicates if milestone is at group level.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the milestone.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "projectMilestone",
- "description": "Indicates if milestone is at project level.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "report",
- "description": "Historically accurate report about the timebox.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TimeboxReport",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startDate",
- "description": "Timestamp of the milestone start date.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "State of the milestone.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "MilestoneStateEnum",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "stats",
- "description": "Milestone statistics.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MilestoneStats",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "subgroupMilestone",
- "description": "Indicates if milestone is at subgroup level.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the milestone.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp of last milestone update.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webPath",
- "description": "Web path of the milestone.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "TimeboxReportInterface",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MilestoneConnection",
- "description": "The connection type for Milestone.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "MilestoneEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Milestone",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MilestoneEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Milestone",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "MilestoneID",
- "description": "Identifier of Milestone.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "MilestoneStateEnum",
- "description": "Current state of milestone",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "active",
- "description": "Milestone is currently active",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "closed",
- "description": "Milestone is closed",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MilestoneStats",
- "description": "Contains statistics about a milestone",
- "fields": [
- {
- "name": "closedIssuesCount",
- "description": "Number of closed issues associated with the milestone.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "totalIssuesCount",
- "description": "Total number of issues associated with the milestone.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "MoveType",
- "description": "The position to which the adjacent object should be moved",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "before",
- "description": "The adjacent object will be moved before the object that is being moved",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "after",
- "description": "The adjacent object will be moved after the object that is being moved",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Mutation",
- "description": null,
- "fields": [
- {
- "name": "addAwardEmoji",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "AddAwardEmojiInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AddAwardEmojiPayload",
- "ofType": null
- },
- "isDeprecated": true,
- "deprecationReason": "Use awardEmojiAdd. Deprecated in 13.2."
- },
- {
- "name": "addProjectToSecurityDashboard",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "AddProjectToSecurityDashboardInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AddProjectToSecurityDashboardPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "adminSidekiqQueuesDeleteJobs",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "AdminSidekiqQueuesDeleteJobsInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AdminSidekiqQueuesDeleteJobsPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "alertSetAssignees",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "AlertSetAssigneesInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertSetAssigneesPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "alertTodoCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "AlertTodoCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertTodoCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "apiFuzzingCiConfigurationCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "ApiFuzzingCiConfigurationCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ApiFuzzingCiConfigurationCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "awardEmojiAdd",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "AwardEmojiAddInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AwardEmojiAddPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "awardEmojiRemove",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "AwardEmojiRemoveInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AwardEmojiRemovePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "awardEmojiToggle",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "AwardEmojiToggleInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AwardEmojiTogglePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "boardListCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "BoardListCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardListCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "boardListUpdateLimitMetrics",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "BoardListUpdateLimitMetricsInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardListUpdateLimitMetricsPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ciCdSettingsUpdate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CiCdSettingsUpdateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiCdSettingsUpdatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clusterAgentDelete",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "ClusterAgentDeleteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ClusterAgentDeletePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clusterAgentTokenCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "ClusterAgentTokenCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ClusterAgentTokenCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clusterAgentTokenDelete",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "ClusterAgentTokenDeleteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ClusterAgentTokenDeletePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "commitCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CommitCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CommitCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "configureSast",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "ConfigureSastInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ConfigureSastPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createAlertIssue",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateAlertIssueInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateAlertIssuePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createAnnotation",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateAnnotationInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateAnnotationPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createBoard",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateBoardInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateBoardPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createBranch",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateBranchInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateBranchPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createClusterAgent",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateClusterAgentInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateClusterAgentPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createComplianceFramework",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateComplianceFrameworkInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateComplianceFrameworkPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createCustomEmoji",
- "description": " Available only when feature flag `custom_emoji` is enabled.",
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateCustomEmojiInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateCustomEmojiPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createDevopsAdoptionSegment",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateDevopsAdoptionSegmentInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateDevopsAdoptionSegmentPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createDiffNote",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateDiffNoteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateDiffNotePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createEpic",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateEpicInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateEpicPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createImageDiffNote",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateImageDiffNoteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateImageDiffNotePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createIssue",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateIssueInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateIssuePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createIteration",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateIterationInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateIterationPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createNote",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateNoteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateNotePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createRequirement",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateRequirementInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateRequirementPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createSnippet",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateSnippetInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateSnippetPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createTestCase",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateTestCaseInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateTestCasePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastOnDemandScanCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastOnDemandScanCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastOnDemandScanCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastProfileCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastProfileCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastProfileCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastProfileDelete",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastProfileDeleteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastProfileDeletePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastProfileRun",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastProfileRunInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastProfileRunPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastProfileUpdate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastProfileUpdateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastProfileUpdatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastScannerProfileCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastScannerProfileCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastScannerProfileCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastScannerProfileDelete",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastScannerProfileDeleteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastScannerProfileDeletePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastScannerProfileUpdate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastScannerProfileUpdateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastScannerProfileUpdatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastSiteProfileCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastSiteProfileCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastSiteProfileCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastSiteProfileDelete",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastSiteProfileDeleteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastSiteProfileDeletePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastSiteProfileUpdate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastSiteProfileUpdateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastSiteProfileUpdatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastSiteTokenCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastSiteTokenCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastSiteTokenCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastSiteValidationCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastSiteValidationCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastSiteValidationCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastSiteValidationRevoke",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastSiteValidationRevokeInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastSiteValidationRevokePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "deleteAnnotation",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DeleteAnnotationInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DeleteAnnotationPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "deleteDevopsAdoptionSegment",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DeleteDevopsAdoptionSegmentInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DeleteDevopsAdoptionSegmentPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "designManagementDelete",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DesignManagementDeleteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DesignManagementDeletePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "designManagementMove",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DesignManagementMoveInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DesignManagementMovePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "designManagementUpload",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DesignManagementUploadInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DesignManagementUploadPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyBoard",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DestroyBoardInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DestroyBoardPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyBoardList",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DestroyBoardListInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DestroyBoardListPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyComplianceFramework",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DestroyComplianceFrameworkInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DestroyComplianceFrameworkPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyContainerRepository",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DestroyContainerRepositoryInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DestroyContainerRepositoryPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyContainerRepositoryTags",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DestroyContainerRepositoryTagsInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DestroyContainerRepositoryTagsPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyNote",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DestroyNoteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DestroyNotePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroySnippet",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DestroySnippetInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DestroySnippetPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussionToggleResolve",
- "description": "Toggles the resolved state of a discussion",
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DiscussionToggleResolveInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DiscussionToggleResolvePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dismissVulnerability",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DismissVulnerabilityInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DismissVulnerabilityPayload",
- "ofType": null
- },
- "isDeprecated": true,
- "deprecationReason": "Use vulnerabilityDismiss. Deprecated in 13.5."
- },
- {
- "name": "environmentsCanaryIngressUpdate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "EnvironmentsCanaryIngressUpdateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EnvironmentsCanaryIngressUpdatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epicAddIssue",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "EpicAddIssueInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicAddIssuePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epicBoardCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "EpicBoardCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicBoardCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epicBoardListCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "EpicBoardListCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicBoardListCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epicSetSubscription",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "EpicSetSubscriptionInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicSetSubscriptionPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epicTreeReorder",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "EpicTreeReorderInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicTreeReorderPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "exportRequirements",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "ExportRequirementsInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ExportRequirementsPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "gitlabSubscriptionActivate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "GitlabSubscriptionActivateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "GitlabSubscriptionActivatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "httpIntegrationCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "HttpIntegrationCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "HttpIntegrationCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "httpIntegrationDestroy",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "HttpIntegrationDestroyInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "HttpIntegrationDestroyPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "httpIntegrationResetToken",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "HttpIntegrationResetTokenInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "HttpIntegrationResetTokenPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "httpIntegrationUpdate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "HttpIntegrationUpdateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "HttpIntegrationUpdatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueMove",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "IssueMoveInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueMovePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueMoveList",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "IssueMoveListInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueMoveListPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueSetAssignees",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetAssigneesInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueSetAssigneesPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueSetConfidential",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetConfidentialInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueSetConfidentialPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueSetDueDate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetDueDateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueSetDueDatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueSetEpic",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetEpicInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueSetEpicPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueSetIteration",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetIterationInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueSetIterationPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueSetLocked",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetLockedInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueSetLockedPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueSetSeverity",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetSeverityInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueSetSeverityPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueSetSubscription",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetSubscriptionInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueSetSubscriptionPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueSetWeight",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetWeightInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueSetWeightPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "jiraImportStart",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "JiraImportStartInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "JiraImportStartPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "jiraImportUsers",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "JiraImportUsersInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "JiraImportUsersPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "labelCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "LabelCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "LabelCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "markAsSpamSnippet",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "MarkAsSpamSnippetInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MarkAsSpamSnippetPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestReviewerRereview",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestReviewerRereviewInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestReviewerRereviewPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestSetAssignees",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestSetAssigneesInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestSetAssigneesPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestSetLabels",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestSetLabelsInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestSetLabelsPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestSetLocked",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestSetLockedInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestSetLockedPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestSetMilestone",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestSetMilestoneInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestSetMilestonePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestSetSubscription",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestSetSubscriptionInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestSetSubscriptionPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestSetWip",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestSetWipInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestSetWipPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestUpdate",
- "description": "Update attributes of a merge request",
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestUpdateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestUpdatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "namespaceIncreaseStorageTemporarily",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "NamespaceIncreaseStorageTemporarilyInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "NamespaceIncreaseStorageTemporarilyPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "oncallRotationCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "OncallRotationCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "OncallRotationCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "oncallRotationDestroy",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "OncallRotationDestroyInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "OncallRotationDestroyPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "oncallScheduleCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "OncallScheduleCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "OncallScheduleCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "oncallScheduleDestroy",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "OncallScheduleDestroyInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "OncallScheduleDestroyPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "oncallScheduleUpdate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "OncallScheduleUpdateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "OncallScheduleUpdatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineCancel",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "PipelineCancelInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PipelineCancelPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineDestroy",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "PipelineDestroyInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PipelineDestroyPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineRetry",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "PipelineRetryInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PipelineRetryPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "prometheusIntegrationCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "PrometheusIntegrationCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PrometheusIntegrationCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "prometheusIntegrationResetToken",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "PrometheusIntegrationResetTokenInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PrometheusIntegrationResetTokenPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "prometheusIntegrationUpdate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "PrometheusIntegrationUpdateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PrometheusIntegrationUpdatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "promoteToEpic",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "PromoteToEpicInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PromoteToEpicPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "releaseCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "ReleaseCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ReleaseCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "releaseDelete",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "ReleaseDeleteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ReleaseDeletePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "releaseUpdate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "ReleaseUpdateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ReleaseUpdatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "removeAwardEmoji",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "RemoveAwardEmojiInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RemoveAwardEmojiPayload",
- "ofType": null
- },
- "isDeprecated": true,
- "deprecationReason": "Use awardEmojiRemove. Deprecated in 13.2."
- },
- {
- "name": "removeProjectFromSecurityDashboard",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "RemoveProjectFromSecurityDashboardInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RemoveProjectFromSecurityDashboardPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "repositionImageDiffNote",
- "description": "Repositions a DiffNote on an image (a `Note` where the `position.positionType` is `\"image\"`)",
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "RepositionImageDiffNoteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RepositionImageDiffNotePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "revertVulnerabilityToDetected",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "RevertVulnerabilityToDetectedInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RevertVulnerabilityToDetectedPayload",
- "ofType": null
- },
- "isDeprecated": true,
- "deprecationReason": "Use vulnerabilityRevertToDetected. Deprecated in 13.5."
- },
- {
- "name": "runDastScan",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "RunDASTScanInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RunDASTScanPayload",
- "ofType": null
- },
- "isDeprecated": true,
- "deprecationReason": "Use DastOnDemandScanCreate. Deprecated in 13.4."
- },
- {
- "name": "terraformStateDelete",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "TerraformStateDeleteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TerraformStateDeletePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "terraformStateLock",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "TerraformStateLockInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TerraformStateLockPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "terraformStateUnlock",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "TerraformStateUnlockInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TerraformStateUnlockPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todoCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "TodoCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TodoCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todoMarkDone",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "TodoMarkDoneInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TodoMarkDonePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todoRestore",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "TodoRestoreInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TodoRestorePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todoRestoreMany",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "TodoRestoreManyInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TodoRestoreManyPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todosMarkAllDone",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "TodosMarkAllDoneInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TodosMarkAllDonePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "toggleAwardEmoji",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "ToggleAwardEmojiInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ToggleAwardEmojiPayload",
- "ofType": null
- },
- "isDeprecated": true,
- "deprecationReason": "Use awardEmojiToggle. Deprecated in 13.2."
- },
- {
- "name": "updateAlertStatus",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateAlertStatusInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateAlertStatusPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateBoard",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateBoardInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateBoardPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateBoardEpicUserPreferences",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateBoardEpicUserPreferencesInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateBoardEpicUserPreferencesPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateBoardList",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateBoardListInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateBoardListPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateComplianceFramework",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateComplianceFrameworkInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateComplianceFrameworkPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateContainerExpirationPolicy",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateContainerExpirationPolicyInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateContainerExpirationPolicyPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateEpic",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateEpicInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateEpicPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateImageDiffNote",
- "description": "Updates a DiffNote on an image (a `Note` where the `position.positionType` is `\"image\"`). If the body of the Note contains only quick actions, the Note will be destroyed during the update, and no Note will be returned",
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateImageDiffNoteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateImageDiffNotePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateIssue",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateIssueInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateIssuePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateIteration",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateIterationInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateIterationPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateNamespacePackageSettings",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateNamespacePackageSettingsInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateNamespacePackageSettingsPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateNote",
- "description": "Updates a Note. If the body of the Note contains only quick actions, the Note will be destroyed during the update, and no Note will be returned",
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateNoteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateNotePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateRequirement",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateRequirementInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateRequirementPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateSnippet",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateSnippetInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateSnippetPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilityConfirm",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "VulnerabilityConfirmInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityConfirmPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilityDismiss",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "VulnerabilityDismissInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityDismissPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilityExternalIssueLinkCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "VulnerabilityExternalIssueLinkCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityExternalIssueLinkCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilityExternalIssueLinkDestroy",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "VulnerabilityExternalIssueLinkDestroyInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityExternalIssueLinkDestroyPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilityResolve",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "VulnerabilityResolveInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityResolvePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilityRevertToDetected",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "VulnerabilityRevertToDetectedInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityRevertToDetectedPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "MutationOperationMode",
- "description": "Different toggles for changing mutator behavior",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "REPLACE",
- "description": "Performs a replace operation",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "APPEND",
- "description": "Performs an append operation",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "REMOVE",
- "description": "Performs a removal operation",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Namespace",
- "description": null,
- "fields": [
- {
- "name": "actualRepositorySizeLimit",
- "description": "Size limit for repositories in the namespace in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "additionalPurchasedStorageSize",
- "description": "Additional storage purchased for the root namespace in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "complianceFrameworks",
- "description": "Compliance frameworks available to projects in this namespace. Available only when feature flag `ff_custom_compliance_frameworks` is enabled.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "Global ID of a specific compliance framework to return.",
- "type": {
- "kind": "SCALAR",
- "name": "ComplianceManagementFrameworkID",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ComplianceFrameworkConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "containsLockedProjects",
- "description": "Includes at least one project where the repository size exceeds the limit.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descriptionHtml",
- "description": "The GitLab Flavored Markdown rendering of `description`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fullName",
- "description": "Full name of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fullPath",
- "description": "Full path of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "isTemporaryStorageIncreaseEnabled",
- "description": "Status of the temporary storage increase.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lfsEnabled",
- "description": "Indicates if Large File Storage (LFS) is enabled for namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "packageSettings",
- "description": "The package settings for the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PackageSettings",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Path of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "projects",
- "description": "Projects within this namespace.",
- "args": [
- {
- "name": "includeSubgroups",
- "description": "Include also subgroup projects.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "search",
- "description": "Search project with most similar names or paths.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": "null"
- },
- {
- "name": "sort",
- "description": "Sort projects by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "NamespaceProjectSort",
- "ofType": null
- },
- "defaultValue": "null"
- },
- {
- "name": "hasVulnerabilities",
- "description": "Returns only the projects which have vulnerabilities.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ProjectConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "repositorySizeExcessProjectCount",
- "description": "Number of projects in the root namespace where the repository size exceeds the limit.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "requestAccessEnabled",
- "description": "Indicates if users can request access to namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "rootStorageStatistics",
- "description": "Aggregated storage statistics of the namespace. Only available for root namespaces.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RootStorageStatistics",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "storageSizeLimit",
- "description": "Total storage limit of the root namespace in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "temporaryStorageIncreaseEndsOn",
- "description": "Date until the temporary storage increase is active.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "totalRepositorySize",
- "description": "Total repository size of all projects in the root namespace in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "totalRepositorySizeExcess",
- "description": "Total excess repository size of all projects in the root namespace in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "visibility",
- "description": "Visibility of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "NamespaceConnection",
- "description": "The connection type for Namespace.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NamespaceEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Namespace",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "NamespaceEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Namespace",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "NamespaceID",
- "description": "Identifier of Namespace.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "NamespaceIncreaseStorageTemporarilyInput",
- "description": "Autogenerated input type of NamespaceIncreaseStorageTemporarily",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the namespace to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "NamespaceID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "NamespaceIncreaseStorageTemporarilyPayload",
- "description": "Autogenerated return type of NamespaceIncreaseStorageTemporarily",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "namespace",
- "description": "The namespace after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Namespace",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "NamespaceProjectSort",
- "description": "Values for sorting projects",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "SIMILARITY",
- "description": "Most similar to the search query",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "STORAGE",
- "description": "Sort by storage size",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "NegatedBoardIssueInput",
- "description": null,
- "fields": null,
- "inputFields": [
- {
- "name": "labelName",
- "description": "Filter by label name.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Filter by milestone title.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsername",
- "description": "Filter by assignee username.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Filter by author username.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "releaseTag",
- "description": "Filter by release tag.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "myReactionEmoji",
- "description": "Filter by reaction emoji.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "epicId",
- "description": "Filter by epic ID. Incompatible with epicWildcardId.",
- "type": {
- "kind": "SCALAR",
- "name": "EpicID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iterationTitle",
- "description": "Filter by iteration title.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "weight",
- "description": "Filter by weight.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Note",
- "description": null,
- "fields": [
- {
- "name": "author",
- "description": "User who wrote this note.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "body",
- "description": "Content of the note.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "bodyHtml",
- "description": "The GitLab Flavored Markdown rendering of `note`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "confidential",
- "description": "Indicates if this note is confidential.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp of the note creation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussion",
- "description": "The discussion this note is a part of.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Discussion",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the note.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "NoteID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "position",
- "description": "The position of this note on a diff.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DiffPosition",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "Project associated with the note.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolvable",
- "description": "Indicates if the object can be resolved.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolved",
- "description": "Indicates if the object is resolved.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolvedAt",
- "description": "Timestamp of when the object was resolved.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolvedBy",
- "description": "User who resolved the object.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "system",
- "description": "Indicates whether this note was created by the system or by a user.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "systemNoteIconName",
- "description": "Name of the icon corresponding to a system note.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp of the note's last activity.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "url",
- "description": "URL to view this Note in the Web UI.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NotePermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "ResolvableInterface",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "NoteConnection",
- "description": "The connection type for Note.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NoteEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Note",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "NoteEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Note",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "NoteID",
- "description": "Identifier of Note.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "NotePermissions",
- "description": null,
- "fields": [
- {
- "name": "adminNote",
- "description": "Indicates the user can perform `admin_note` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "awardEmoji",
- "description": "Indicates the user can perform `award_emoji` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createNote",
- "description": "Indicates the user can perform `create_note` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readNote",
- "description": "Indicates the user can perform `read_note` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "repositionNote",
- "description": "Indicates the user can perform `reposition_note` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolveNote",
- "description": "Indicates the user can perform `resolve_note` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INTERFACE",
- "name": "Noteable",
- "description": null,
- "fields": [
- {
- "name": "discussions",
- "description": "All discussions on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiscussionConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notes",
- "description": "All notes on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NoteConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": [
- {
- "kind": "OBJECT",
- "name": "AlertManagementAlert",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "BoardEpic",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "Design",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicIssue",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "Snippet",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "Vulnerability",
- "ofType": null
- }
- ]
- },
- {
- "kind": "SCALAR",
- "name": "NoteableID",
- "description": "Identifier of Noteable.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "OncallParticipantType",
- "description": "The rotation participant and color palette",
- "fields": [
- {
- "name": "colorPalette",
- "description": "The color palette to assign to the on-call user. For example \"blue\".",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "colorWeight",
- "description": "The color weight to assign to for the on-call user, for example \"500\". Max 4 chars. For easy identification of the user.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the on-call participant.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "IncidentManagementOncallParticipantID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "user",
- "description": "The user who is participating.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "OncallParticipantTypeConnection",
- "description": "The connection type for OncallParticipantType.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "OncallParticipantTypeEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "OncallParticipantType",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "OncallParticipantTypeEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "OncallParticipantType",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "OncallRotationCreateInput",
- "description": "Autogenerated input type of OncallRotationCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project to create the on-call schedule in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "scheduleIid",
- "description": "The IID of the on-call schedule to create the on-call rotation in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The name of the on-call rotation.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "startsAt",
- "description": "The start date and time of the on-call rotation, in the timezone of the on-call schedule.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "OncallRotationDateInputType",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "rotationLength",
- "description": "The rotation length of the on-call rotation.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "OncallRotationLengthInputType",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "participants",
- "description": "The usernames of users participating in the on-call rotation.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "OncallUserInputType",
- "ofType": null
- }
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "OncallRotationCreatePayload",
- "description": "Autogenerated return type of OncallRotationCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "oncallRotation",
- "description": "The on-call rotation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallRotation",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "OncallRotationDateInputType",
- "description": "Date input type for on-call rotation",
- "fields": null,
- "inputFields": [
- {
- "name": "date",
- "description": "The date component of the date in YYYY-MM-DD format.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "time",
- "description": "The time component of the date in 24hr HH:MM format.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "OncallRotationDestroyInput",
- "description": "Autogenerated input type of OncallRotationDestroy",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project to remove the on-call schedule from.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "scheduleIid",
- "description": "The IID of the on-call schedule to the on-call rotation belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "The ID of the on-call rotation to remove.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "IncidentManagementOncallRotationID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "OncallRotationDestroyPayload",
- "description": "Autogenerated return type of OncallRotationDestroy",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "oncallRotation",
- "description": "The on-call rotation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallRotation",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "OncallRotationLengthInputType",
- "description": "The rotation length of the on-call rotation",
- "fields": null,
- "inputFields": [
- {
- "name": "length",
- "description": "The rotation length of the on-call rotation.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "unit",
- "description": "The unit of the rotation length of the on-call rotation.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "OncallRotationUnitEnum",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "OncallRotationUnitEnum",
- "description": "Rotation length unit of an on-call rotation",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "HOURS",
- "description": "Hours",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DAYS",
- "description": "Days",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEEKS",
- "description": "Weeks",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "OncallScheduleCreateInput",
- "description": "Autogenerated input type of OncallScheduleCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project to create the on-call schedule in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The name of the on-call schedule.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "The description of the on-call schedule.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "timezone",
- "description": "The timezone of the on-call schedule.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "OncallScheduleCreatePayload",
- "description": "Autogenerated return type of OncallScheduleCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "oncallSchedule",
- "description": "The on-call schedule.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallSchedule",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "OncallScheduleDestroyInput",
- "description": "Autogenerated input type of OncallScheduleDestroy",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project to remove the on-call schedule from.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The on-call schedule internal ID to remove.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "OncallScheduleDestroyPayload",
- "description": "Autogenerated return type of OncallScheduleDestroy",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "oncallSchedule",
- "description": "The on-call schedule.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallSchedule",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "OncallScheduleUpdateInput",
- "description": "Autogenerated input type of OncallScheduleUpdate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project to update the on-call schedule in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The on-call schedule internal ID to update.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The name of the on-call schedule.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "The description of the on-call schedule.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "timezone",
- "description": "The timezone of the on-call schedule.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "OncallScheduleUpdatePayload",
- "description": "Autogenerated return type of OncallScheduleUpdate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "oncallSchedule",
- "description": "The on-call schedule.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallSchedule",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "OncallUserInputType",
- "description": "The rotation user and color palette",
- "fields": null,
- "inputFields": [
- {
- "name": "username",
- "description": "The username of the user to participate in the on-call rotation, such as `user_one`.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "colorPalette",
- "description": "A value of DataVisualizationColorEnum. The color from the palette to assign to the on-call user.",
- "type": {
- "kind": "ENUM",
- "name": "DataVisualizationColorEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "colorWeight",
- "description": "A value of DataVisualizationWeightEnum. The color weight to assign to for the on-call user.",
- "type": {
- "kind": "ENUM",
- "name": "DataVisualizationWeightEnum",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Package",
- "description": "Represents a package in the Package Registry",
- "fields": [
- {
- "name": "createdAt",
- "description": "Date of creation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the package.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "PackagesPackageID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "metadata",
- "description": "Package metadata.",
- "args": [
-
- ],
- "type": {
- "kind": "UNION",
- "name": "PackageMetadata",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the package.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "packageType",
- "description": "Package type.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "PackageTypeEnum",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelines",
- "description": "Pipelines that built the package.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PipelineConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "Project where the package is stored.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tags",
- "description": "Package tags.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PackageTagConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Date of most recent update.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "version",
- "description": "Version string.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "versions",
- "description": "The other versions of the package.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PackageWithoutVersionsConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PackageComposerJsonType",
- "description": "Represents a composer JSON file",
- "fields": [
- {
- "name": "license",
- "description": "The license set in the Composer JSON file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "The name set in the Composer JSON file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "The type set in the Composer JSON file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "version",
- "description": "The version set in the Composer JSON file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PackageConnection",
- "description": "The connection type for Package.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PackageEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Package",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PackageEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Package",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PackageFileRegistry",
- "description": "Represents the Geo sync and verification state of a package file",
- "fields": [
- {
- "name": "createdAt",
- "description": "Timestamp when the PackageFileRegistry was created",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the PackageFileRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastSyncFailure",
- "description": "Error message during sync of the PackageFileRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastSyncedAt",
- "description": "Timestamp of the most recent successful sync of the PackageFileRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "packageFileId",
- "description": "ID of the PackageFile.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "retryAt",
- "description": "Timestamp after which the PackageFileRegistry should be resynced",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "retryCount",
- "description": "Number of consecutive failed sync attempts of the PackageFileRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "Sync state of the PackageFileRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "RegistryState",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PackageFileRegistryConnection",
- "description": "The connection type for PackageFileRegistry.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PackageFileRegistryEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PackageFileRegistry",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PackageFileRegistryEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PackageFileRegistry",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "UNION",
- "name": "PackageMetadata",
- "description": "Represents metadata associated with a Package",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": [
- {
- "kind": "OBJECT",
- "name": "ComposerMetadata",
- "ofType": null
- }
- ]
- },
- {
- "kind": "OBJECT",
- "name": "PackageSettings",
- "description": "Namespace-level Package Registry settings",
- "fields": [
- {
- "name": "mavenDuplicateExceptionRegex",
- "description": "When maven_duplicates_allowed is false, you can publish duplicate packages with names that match this regex. Otherwise, this setting has no effect.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "UntrustedRegexp",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mavenDuplicatesAllowed",
- "description": "Indicates whether duplicate Maven packages are allowed for this namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PackageTag",
- "description": "Represents a package tag",
- "fields": [
- {
- "name": "createdAt",
- "description": "The created date.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "The ID of the tag.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "The name of the tag.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "The updated date.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PackageTagConnection",
- "description": "The connection type for PackageTag.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PackageTagEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PackageTag",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PackageTagEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PackageTag",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "PackageTypeEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "MAVEN",
- "description": "Packages from the Maven package manager",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "NPM",
- "description": "Packages from the npm package manager",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CONAN",
- "description": "Packages from the Conan package manager",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "NUGET",
- "description": "Packages from the Nuget package manager",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PYPI",
- "description": "Packages from the PyPI package manager",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "COMPOSER",
- "description": "Packages from the Composer package manager",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "GENERIC",
- "description": "Packages from the Generic package manager",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "GOLANG",
- "description": "Packages from the Golang package manager",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DEBIAN",
- "description": "Packages from the Debian package manager",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "RUBYGEMS",
- "description": "Packages from the Rubygems package manager",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PackageWithoutVersions",
- "description": "Represents a version of a package in the Package Registry",
- "fields": [
- {
- "name": "createdAt",
- "description": "Date of creation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the package.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "PackagesPackageID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "metadata",
- "description": "Package metadata.",
- "args": [
-
- ],
- "type": {
- "kind": "UNION",
- "name": "PackageMetadata",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the package.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "packageType",
- "description": "Package type.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "PackageTypeEnum",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelines",
- "description": "Pipelines that built the package.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PipelineConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "Project where the package is stored.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tags",
- "description": "Package tags.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PackageTagConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Date of most recent update.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "version",
- "description": "Version string.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PackageWithoutVersionsConnection",
- "description": "The connection type for PackageWithoutVersions.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PackageWithoutVersionsEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PackageWithoutVersions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PackageWithoutVersionsEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PackageWithoutVersions",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "PackagesPackageID",
- "description": "Identifier of Packages::Package.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PageInfo",
- "description": "Information about pagination in a connection.",
- "fields": [
- {
- "name": "endCursor",
- "description": "When paginating forwards, the cursor to continue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hasNextPage",
- "description": "When paginating forwards, are there more items?",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hasPreviousPage",
- "description": "When paginating backwards, are there more items?",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startCursor",
- "description": "When paginating backwards, the cursor to continue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Pipeline",
- "description": null,
- "fields": [
- {
- "name": "active",
- "description": "Indicates if the pipeline is active.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "beforeSha",
- "description": "Base SHA of the source branch.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "cancelable",
- "description": "Specifies if a pipeline can be canceled.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "committedAt",
- "description": "Timestamp of the pipeline's commit.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "configSource",
- "description": "Configuration source of the pipeline (UNKNOWN_SOURCE, REPOSITORY_SOURCE, AUTO_DEVOPS_SOURCE, WEBIDE_SOURCE, REMOTE_SOURCE, EXTERNAL_PROJECT_SOURCE, BRIDGE_SOURCE, PARAMETER_SOURCE, COMPLIANCE_SOURCE)",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "PipelineConfigSourceEnum",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "coverage",
- "description": "Coverage percentage.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp of the pipeline's creation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "detailedStatus",
- "description": "Detailed status of the pipeline.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DetailedStatus",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "downstream",
- "description": "Pipelines this pipeline will trigger.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PipelineConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "duration",
- "description": "Duration of the pipeline in seconds.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "finishedAt",
- "description": "Timestamp of the pipeline's completion.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the pipeline.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iid",
- "description": "Internal ID of the pipeline.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "jobs",
- "description": "Jobs belonging to the pipeline.",
- "args": [
- {
- "name": "securityReportTypes",
- "description": "Filter jobs by the type of security report they produce.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "SecurityReportTypeEnum",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiJobConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Relative path to the pipeline's page.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "Project the pipeline belongs to.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "retryable",
- "description": "Specifies if a pipeline can be retried.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "securityReportSummary",
- "description": "Vulnerability and scanned resource counts for each security scanner of the pipeline.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SecurityReportSummary",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sha",
- "description": "SHA of the pipeline's commit.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sourceJob",
- "description": "Job where pipeline was triggered from.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiJob",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "stages",
- "description": "Stages of the pipeline.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiStageConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startedAt",
- "description": "Timestamp when the pipeline was started.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "status",
- "description": "Status of the pipeline (CREATED, WAITING_FOR_RESOURCE, PREPARING, PENDING, RUNNING, FAILED, SUCCESS, CANCELED, SKIPPED, MANUAL, SCHEDULED)",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "PipelineStatusEnum",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp of the pipeline's last activity.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "upstream",
- "description": "Pipeline that triggered the pipeline.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Pipeline",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "user",
- "description": "Pipeline user.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PipelinePermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "warnings",
- "description": "Indicates if a pipeline has warnings.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PipelineAnalytics",
- "description": null,
- "fields": [
- {
- "name": "monthPipelinesLabels",
- "description": "Labels for the monthly pipeline count.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "monthPipelinesSuccessful",
- "description": "Total monthly successful pipeline count.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "monthPipelinesTotals",
- "description": "Total monthly pipeline count.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineTimesLabels",
- "description": "Pipeline times labels.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineTimesValues",
- "description": "Pipeline times.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "weekPipelinesLabels",
- "description": "Labels for the weekly pipeline count.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "weekPipelinesSuccessful",
- "description": "Total weekly successful pipeline count.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "weekPipelinesTotals",
- "description": "Total weekly pipeline count.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "yearPipelinesLabels",
- "description": "Labels for the yearly pipeline count.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "yearPipelinesSuccessful",
- "description": "Total yearly successful pipeline count.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "yearPipelinesTotals",
- "description": "Total yearly pipeline count.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "PipelineCancelInput",
- "description": "Autogenerated input type of PipelineCancel",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The ID of the pipeline to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "CiPipelineID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PipelineCancelPayload",
- "description": "Autogenerated return type of PipelineCancel",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "PipelineConfigSourceEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "UNKNOWN_SOURCE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "REPOSITORY_SOURCE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "AUTO_DEVOPS_SOURCE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEBIDE_SOURCE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "REMOTE_SOURCE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "EXTERNAL_PROJECT_SOURCE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "BRIDGE_SOURCE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PARAMETER_SOURCE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "COMPLIANCE_SOURCE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PipelineConnection",
- "description": "The connection type for Pipeline.",
- "fields": [
- {
- "name": "count",
- "description": "Total count of collection.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PipelineEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Pipeline",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "PipelineDestroyInput",
- "description": "Autogenerated input type of PipelineDestroy",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The ID of the pipeline to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "CiPipelineID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PipelineDestroyPayload",
- "description": "Autogenerated return type of PipelineDestroy",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PipelineEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Pipeline",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PipelinePermissions",
- "description": null,
- "fields": [
- {
- "name": "adminPipeline",
- "description": "Indicates the user can perform `admin_pipeline` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyPipeline",
- "description": "Indicates the user can perform `destroy_pipeline` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatePipeline",
- "description": "Indicates the user can perform `update_pipeline` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "PipelineRetryInput",
- "description": "Autogenerated input type of PipelineRetry",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The ID of the pipeline to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "CiPipelineID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PipelineRetryPayload",
- "description": "Autogenerated return type of PipelineRetry",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipeline",
- "description": "The pipeline after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Pipeline",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "PipelineStatusEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "CREATED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WAITING_FOR_RESOURCE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PREPARING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PENDING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "RUNNING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FAILED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SUCCESS",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CANCELED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SKIPPED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MANUAL",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SCHEDULED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Project",
- "description": null,
- "fields": [
- {
- "name": "actualRepositorySizeLimit",
- "description": "Size limit for the repository in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "alertManagementAlert",
- "description": "A single Alert Management alert of the project.",
- "args": [
- {
- "name": "iid",
- "description": "IID of the alert. For example, \"1\".",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "statuses",
- "description": "Alerts with the specified statues. For example, [TRIGGERED].",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "AlertManagementStatus",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort alerts by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "AlertManagementAlertSort",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "domain",
- "description": "Filter query for given domain.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "AlertManagementDomainFilter",
- "ofType": null
- }
- },
- "defaultValue": "operations"
- },
- {
- "name": "search",
- "description": "Search query for title, description, service, or monitoring_tool.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsername",
- "description": "Username of a user assigned to the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementAlert",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "alertManagementAlertStatusCounts",
- "description": "Counts of alerts by status for the project.",
- "args": [
- {
- "name": "search",
- "description": "Search query for title, description, service, or monitoring_tool.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsername",
- "description": "Username of a user assigned to the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementAlertStatusCountsType",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "alertManagementAlerts",
- "description": "Alert Management alerts of the project.",
- "args": [
- {
- "name": "iid",
- "description": "IID of the alert. For example, \"1\".",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "statuses",
- "description": "Alerts with the specified statues. For example, [TRIGGERED].",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "AlertManagementStatus",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort alerts by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "AlertManagementAlertSort",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "domain",
- "description": "Filter query for given domain.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "AlertManagementDomainFilter",
- "ofType": null
- }
- },
- "defaultValue": "operations"
- },
- {
- "name": "search",
- "description": "Search query for title, description, service, or monitoring_tool.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsername",
- "description": "Username of a user assigned to the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementAlertConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "alertManagementIntegrations",
- "description": "Integrations which can receive alerts for the project.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementIntegrationConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "alertManagementPayloadFields",
- "description": "Extract alert fields from payload for custom mapping.",
- "args": [
- {
- "name": "payloadExample",
- "description": "Sample payload for extracting alert fields for custom mappings.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "AlertManagementPayloadAlertField",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "allowMergeOnSkippedPipeline",
- "description": "If `only_allow_merge_if_pipeline_succeeds` is true, indicates if merge requests of the project can also be merged with skipped jobs.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "apiFuzzingCiConfiguration",
- "description": "API fuzzing configuration for the project. Available only when feature flag `api_fuzzing_configuration_ui` is enabled.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ApiFuzzingCiConfiguration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "archived",
- "description": "Indicates the archived status of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "autocloseReferencedIssues",
- "description": "Indicates if issues referenced by merge requests and commits within the default branch are closed automatically.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "avatarUrl",
- "description": "URL to avatar image file of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "board",
- "description": "A single board of the project.",
- "args": [
- {
- "name": "id",
- "description": "The board's ID.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "BoardID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Board",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "boards",
- "description": "Boards of the project.",
- "args": [
- {
- "name": "id",
- "description": "Find a board by its ID.",
- "type": {
- "kind": "SCALAR",
- "name": "BoardID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ciCdSettings",
- "description": "CI/CD settings for the project.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ProjectCiCdSetting",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clusterAgent",
- "description": "Find a single cluster agent by name.",
- "args": [
- {
- "name": "name",
- "description": "Name of the cluster agent.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ClusterAgent",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clusterAgents",
- "description": "Cluster agents associated with the project.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ClusterAgentConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "codeCoverageSummary",
- "description": "Code coverage summary associated with the project.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CodeCoverageSummary",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "complianceFrameworks",
- "description": "Compliance frameworks associated with the project.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ComplianceFrameworkConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "containerExpirationPolicy",
- "description": "The container expiration policy of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ContainerExpirationPolicy",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "containerRegistryEnabled",
- "description": "Indicates if the project stores Docker container images in a container registry.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "containerRepositories",
- "description": "Container repositories of the project.",
- "args": [
- {
- "name": "name",
- "description": "Filter the container repositories by their name.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort container repositories by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "ContainerRepositorySort",
- "ofType": null
- },
- "defaultValue": "created_desc"
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ContainerRepositoryConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "containerRepositoriesCount",
- "description": "Number of container repositories in the project.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp of the project creation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastProfiles",
- "description": "DAST Profiles associated with the project. Always returns no nodes if `dast_saved_scans` is disabled.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastProfileConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastScannerProfiles",
- "description": "The DAST scanner profiles associated with the project.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastScannerProfileConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastSiteProfile",
- "description": "DAST Site Profile associated with the project.",
- "args": [
- {
- "name": "id",
- "description": "ID of the site profile.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastSiteProfileID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastSiteProfile",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastSiteProfiles",
- "description": "DAST Site Profiles associated with the project.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastSiteProfileConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastSiteValidations",
- "description": "DAST Site Validations associated with the project. Always returns no nodes if `security_on_demand_scans_site_validation` is disabled.",
- "args": [
- {
- "name": "normalizedTargetUrls",
- "description": "Normalized URL of the target to be scanned.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastSiteValidationConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Short description of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descriptionHtml",
- "description": "The GitLab Flavored Markdown rendering of `description`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "environment",
- "description": "A single environment of the project.",
- "args": [
- {
- "name": "name",
- "description": "Name of the environment.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for environment name.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "states",
- "description": "States of environments that should be included in result.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Environment",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "environments",
- "description": "Environments of the project.",
- "args": [
- {
- "name": "name",
- "description": "Name of the environment.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for environment name.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "states",
- "description": "States of environments that should be included in result.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EnvironmentConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "forksCount",
- "description": "Number of times the project has been forked.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fullPath",
- "description": "Full path of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "grafanaIntegration",
- "description": "Grafana integration details for the project.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "GrafanaIntegration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "group",
- "description": "Group of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Group",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "httpUrlToRepo",
- "description": "URL to connect to the project via HTTPS.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "importStatus",
- "description": "Status of import background job of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "incidentManagementOncallSchedules",
- "description": "Incident Management On-call schedules of the project.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallScheduleConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "A single issue of the project.",
- "args": [
- {
- "name": "iid",
- "description": "IID of the issue. For example, \"1\".",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iids",
- "description": "List of IIDs of issues. For example, [1, 2].",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "labelName",
- "description": "Labels applied to this issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Milestone applied to this issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Username of the author of the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsername",
- "description": "Username of a user assigned to the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsernames",
- "description": "Usernames of users assigned to the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "assigneeId",
- "description": "ID of a user assigned to the issues, \"none\" and \"any\" values are supported.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "createdBefore",
- "description": "Issues created before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "createdAfter",
- "description": "Issues created after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "updatedBefore",
- "description": "Issues updated before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "updatedAfter",
- "description": "Issues updated after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "closedBefore",
- "description": "Issues closed before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "closedAfter",
- "description": "Issues closed after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for issue title or description.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "types",
- "description": "Filter issues by the given issue types.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "IssueType",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Current state of this issue.",
- "type": {
- "kind": "ENUM",
- "name": "IssuableState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort issues by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "IssueSort",
- "ofType": null
- },
- "defaultValue": "created_desc"
- },
- {
- "name": "iterationId",
- "description": "Iterations applied to the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "epicId",
- "description": "ID of an epic associated with the issues, \"none\" and \"any\" values are supported.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueStatusCounts",
- "description": "Counts of issues by status for the project.",
- "args": [
- {
- "name": "iid",
- "description": "IID of the issue. For example, \"1\".",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iids",
- "description": "List of IIDs of issues. For example, [1, 2].",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "labelName",
- "description": "Labels applied to this issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Milestone applied to this issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Username of the author of the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsername",
- "description": "Username of a user assigned to the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsernames",
- "description": "Usernames of users assigned to the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "assigneeId",
- "description": "ID of a user assigned to the issues, \"none\" and \"any\" values are supported.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "createdBefore",
- "description": "Issues created before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "createdAfter",
- "description": "Issues created after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "updatedBefore",
- "description": "Issues updated before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "updatedAfter",
- "description": "Issues updated after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "closedBefore",
- "description": "Issues closed before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "closedAfter",
- "description": "Issues closed after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for issue title or description.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "types",
- "description": "Filter issues by the given issue types.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "IssueType",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueStatusCountsType",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issues",
- "description": "Issues of the project.",
- "args": [
- {
- "name": "iid",
- "description": "IID of the issue. For example, \"1\".",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iids",
- "description": "List of IIDs of issues. For example, [1, 2].",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "labelName",
- "description": "Labels applied to this issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Milestone applied to this issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Username of the author of the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsername",
- "description": "Username of a user assigned to the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsernames",
- "description": "Usernames of users assigned to the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "assigneeId",
- "description": "ID of a user assigned to the issues, \"none\" and \"any\" values are supported.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "createdBefore",
- "description": "Issues created before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "createdAfter",
- "description": "Issues created after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "updatedBefore",
- "description": "Issues updated before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "updatedAfter",
- "description": "Issues updated after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "closedBefore",
- "description": "Issues closed before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "closedAfter",
- "description": "Issues closed after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for issue title or description.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "types",
- "description": "Filter issues by the given issue types.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "IssueType",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Current state of this issue.",
- "type": {
- "kind": "ENUM",
- "name": "IssuableState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort issues by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "IssueSort",
- "ofType": null
- },
- "defaultValue": "created_desc"
- },
- {
- "name": "iterationId",
- "description": "Iterations applied to the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "epicId",
- "description": "ID of an epic associated with the issues, \"none\" and \"any\" values are supported.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issuesEnabled",
- "description": "Indicates if Issues are enabled for the current user",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iterations",
- "description": "Find iterations.",
- "args": [
- {
- "name": "startDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.start.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "timeframe",
- "description": "List items overlapping the given timeframe.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "Timeframe",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter iterations by state.",
- "type": {
- "kind": "ENUM",
- "name": "IterationState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "Fuzzy search by title.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "Global ID of the Iteration to look up.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "Internal ID of the Iteration to look up.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "includeAncestors",
- "description": "Whether to include ancestor iterations. Defaults to true.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IterationConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "jiraImportStatus",
- "description": "Status of Jira import background job of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "jiraImports",
- "description": "Jira imports into the project.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "JiraImportConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "jobsEnabled",
- "description": "Indicates if CI/CD pipeline jobs are enabled for the current user.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "label",
- "description": "A label available on this project.",
- "args": [
- {
- "name": "title",
- "description": "Title of the label.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Label",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "labels",
- "description": "Labels available on this project.",
- "args": [
- {
- "name": "searchTerm",
- "description": "A search term to find labels with.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "includeAncestorGroups",
- "description": "Include labels from ancestor groups.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "LabelConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastActivityAt",
- "description": "Timestamp of the project last activity.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lfsEnabled",
- "description": "Indicates if the project has Large File Storage (LFS) enabled.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequest",
- "description": "A single merge request of the project.",
- "args": [
- {
- "name": "iid",
- "description": "IID of the merge request, for example `1`.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequests",
- "description": "Merge requests of the project.",
- "args": [
- {
- "name": "iids",
- "description": "Array of IIDs of merge requests, for example `[1, 2]`.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "sourceBranches",
- "description": "Array of source branch names. All resolved merge requests will have one of these branches as their source.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "targetBranches",
- "description": "Array of target branch names. All resolved merge requests will have one of these branches as their target.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "A merge request state. If provided, all resolved merge requests will have this state.",
- "type": {
- "kind": "ENUM",
- "name": "MergeRequestState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labels",
- "description": "Array of label names. All resolved merge requests will have all of these labels.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "mergedAfter",
- "description": "Merge requests merged after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "mergedBefore",
- "description": "Merge requests merged before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Title of the milestone.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort merge requests by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "MergeRequestSort",
- "ofType": null
- },
- "defaultValue": "created_desc"
- },
- {
- "name": "assigneeUsername",
- "description": "Username of the assignee.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Username of the author.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "reviewerUsername",
- "description": "Username of the reviewer.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestsEnabled",
- "description": "Indicates if Merge Requests are enabled for the current user",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestsFfOnlyEnabled",
- "description": "Indicates if no merge commits should be created and all merges should instead be fast-forwarded, which means that merging is only allowed if the branch could be fast-forwarded.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "milestones",
- "description": "Milestones of the project.",
- "args": [
- {
- "name": "startDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.start.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "timeframe",
- "description": "List items overlapping the given timeframe.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "Timeframe",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "ids",
- "description": "Array of global milestone IDs, e.g., \"gid://gitlab/Milestone/1\".",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter milestones by state.",
- "type": {
- "kind": "ENUM",
- "name": "MilestoneStateEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "The title of the milestone.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "searchTitle",
- "description": "A search string for the title.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "containingDate",
- "description": "A date that the milestone contains.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "includeAncestors",
- "description": "Also return milestones in the project's parent group and its ancestors.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MilestoneConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the project (without namespace).",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nameWithNamespace",
- "description": "Full name of the project with its namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "namespace",
- "description": "Namespace of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Namespace",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "onlyAllowMergeIfAllDiscussionsAreResolved",
- "description": "Indicates if merge requests of the project can only be merged when all the discussions are resolved.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "onlyAllowMergeIfPipelineSucceeds",
- "description": "Indicates if merge requests of the project can only be merged with successful jobs.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "openIssuesCount",
- "description": "Number of open issues for the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "packages",
- "description": "Packages of the project.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PackageConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Path of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipeline",
- "description": "Build pipeline of the project.",
- "args": [
- {
- "name": "iid",
- "description": "IID of the Pipeline, e.g., \"1\".",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Pipeline",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineAnalytics",
- "description": "Pipeline analytics.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PipelineAnalytics",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelines",
- "description": "Build pipelines of the project.",
- "args": [
- {
- "name": "status",
- "description": "Filter pipelines by their status.",
- "type": {
- "kind": "ENUM",
- "name": "PipelineStatusEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "ref",
- "description": "Filter pipelines by the ref they are run for.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sha",
- "description": "Filter pipelines by the sha of the commit they are run for.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PipelineConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "printingMergeRequestLinkEnabled",
- "description": "Indicates if a link to create or view a merge request should display after a push to Git repositories of the project from the command line.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "projectMembers",
- "description": "Members of the project.",
- "args": [
- {
- "name": "search",
- "description": "Search query.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "relations",
- "description": "Filter members by the given member relations.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "ProjectMemberRelation",
- "ofType": null
- }
- }
- },
- "defaultValue": "[DIRECT, INHERITED]"
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MemberInterfaceConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "publicJobs",
- "description": "Indicates if there is public access to pipelines and job details of the project, including output logs and artifacts.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "release",
- "description": "A single release of the project.",
- "args": [
- {
- "name": "tagName",
- "description": "The name of the tag associated to the release.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Release",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "releases",
- "description": "Releases of the project.",
- "args": [
- {
- "name": "sort",
- "description": "Sort releases by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "ReleaseSort",
- "ofType": null
- },
- "defaultValue": "RELEASED_AT_DESC"
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ReleaseConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "removeSourceBranchAfterMerge",
- "description": "Indicates if `Delete source branch` option should be enabled by default for all new merge requests of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "repository",
- "description": "Git repository of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Repository",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "repositorySizeExcess",
- "description": "Size of repository that exceeds the limit in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "requestAccessEnabled",
- "description": "Indicates if users can request member access to the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "requirement",
- "description": "Find a single requirement.",
- "args": [
- {
- "name": "sort",
- "description": "List requirements by sort order.",
- "type": {
- "kind": "ENUM",
- "name": "Sort",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter requirements by state.",
- "type": {
- "kind": "ENUM",
- "name": "RequirementState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for requirement title.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Filter requirements by author username.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "IID of the requirement, e.g., \"1\".",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iids",
- "description": "List of IIDs of requirements, e.g., [1, 2].",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "lastTestReportState",
- "description": "The state of latest requirement test report.",
- "type": {
- "kind": "ENUM",
- "name": "TestReportState",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Requirement",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "requirementStatesCount",
- "description": "Number of requirements for the project by their state.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RequirementStatesCount",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "requirements",
- "description": "Find requirements.",
- "args": [
- {
- "name": "sort",
- "description": "List requirements by sort order.",
- "type": {
- "kind": "ENUM",
- "name": "Sort",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter requirements by state.",
- "type": {
- "kind": "ENUM",
- "name": "RequirementState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for requirement title.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Filter requirements by author username.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "IID of the requirement, e.g., \"1\".",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iids",
- "description": "List of IIDs of requirements, e.g., [1, 2].",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "lastTestReportState",
- "description": "The state of latest requirement test report.",
- "type": {
- "kind": "ENUM",
- "name": "TestReportState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RequirementConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sastCiConfiguration",
- "description": "SAST CI configuration for the project.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SastCiConfiguration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "securityDashboardPath",
- "description": "Path to project's security dashboard.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "securityScanners",
- "description": "Information about security analyzers used in the project.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SecurityScanners",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sentryDetailedError",
- "description": "Detailed version of a Sentry error on the project.",
- "args": [
- {
- "name": "id",
- "description": "ID of the Sentry issue.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "GitlabErrorTrackingDetailedErrorID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SentryDetailedError",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sentryErrors",
- "description": "Paginated collection of Sentry errors on the project.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SentryErrorCollection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "serviceDeskAddress",
- "description": "E-mail address of the service desk.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "serviceDeskEnabled",
- "description": "Indicates if the project has service desk enabled.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "services",
- "description": "Project services.",
- "args": [
- {
- "name": "active",
- "description": "Indicates if the service is active.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "type",
- "description": "Class name of the service.",
- "type": {
- "kind": "ENUM",
- "name": "ServiceType",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ServiceConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sharedRunnersEnabled",
- "description": "Indicates if shared runners are enabled for the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "snippets",
- "description": "Snippets of the project.",
- "args": [
- {
- "name": "ids",
- "description": "Array of global snippet ids, e.g., \"gid://gitlab/ProjectSnippet/1\".",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "SnippetID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "visibility",
- "description": "The visibility of the snippet.",
- "type": {
- "kind": "ENUM",
- "name": "VisibilityScopesEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SnippetConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "snippetsEnabled",
- "description": "Indicates if Snippets are enabled for the current user",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "squashReadOnly",
- "description": "Indicates if `squashReadOnly` is enabled.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sshUrlToRepo",
- "description": "URL to connect to the project via SSH.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "starCount",
- "description": "Number of times the project has been starred.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "statistics",
- "description": "Statistics of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ProjectStatistics",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "suggestionCommitMessage",
- "description": "The commit message used to apply merge request suggestions.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tagList",
- "description": "List of project topics (not Git tags).",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "terraformState",
- "description": "Find a single Terraform state by name.",
- "args": [
- {
- "name": "name",
- "description": "Name of the Terraform state.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TerraformState",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "terraformStates",
- "description": "Terraform states associated with the project.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TerraformStateConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ProjectPermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "visibility",
- "description": "Visibility of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilities",
- "description": "Vulnerabilities reported on the project.",
- "args": [
- {
- "name": "projectId",
- "description": "Filter vulnerabilities by project.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "reportType",
- "description": "Filter vulnerabilities by report type.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityReportType",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "severity",
- "description": "Filter vulnerabilities by severity.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilitySeverity",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter vulnerabilities by state.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityState",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "scanner",
- "description": "Filter vulnerabilities by VulnerabilityScanner.externalId.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "List vulnerabilities by sort order.",
- "type": {
- "kind": "ENUM",
- "name": "VulnerabilitySort",
- "ofType": null
- },
- "defaultValue": "severity_desc"
- },
- {
- "name": "hasResolution",
- "description": "Returns only the vulnerabilities which have been resolved on default branch.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "hasIssues",
- "description": "Returns only the vulnerabilities which have linked issues.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilitiesCountByDay",
- "description": "Number of vulnerabilities per day for the project.",
- "args": [
- {
- "name": "startDate",
- "description": "First day for which to fetch vulnerability history.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "Last day for which to fetch vulnerability history.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilityScanners",
- "description": "Vulnerability scanners reported on the project vulnerabilities.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityScannerConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilitySeveritiesCount",
- "description": "Counts for each vulnerability severity in the project.",
- "args": [
- {
- "name": "projectId",
- "description": "Filter vulnerabilities by project.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "reportType",
- "description": "Filter vulnerabilities by report type.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityReportType",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "severity",
- "description": "Filter vulnerabilities by severity.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilitySeverity",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter vulnerabilities by state.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityState",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "scanner",
- "description": "Filter vulnerabilities by scanner.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilitySeveritiesCount",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "wikiEnabled",
- "description": "Indicates if Wikis are enabled for the current user",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ProjectCiCdSetting",
- "description": null,
- "fields": [
- {
- "name": "keepLatestArtifact",
- "description": "Whether to keep the latest builds artifacts.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergePipelinesEnabled",
- "description": "Whether merge pipelines are enabled.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeTrainsEnabled",
- "description": "Whether merge trains are enabled.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "Project the CI/CD settings belong to.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ProjectConnection",
- "description": "The connection type for Project.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ProjectEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ProjectEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "ProjectID",
- "description": "Identifier of Project.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ProjectMember",
- "description": "Represents a Project Membership",
- "fields": [
- {
- "name": "accessLevel",
- "description": "GitLab::Access level.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AccessLevel",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Date and time the membership was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdBy",
- "description": "User that authorized membership.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "expiresAt",
- "description": "Date and time the membership expires.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the member.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "Project that User is a member of.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Date and time the membership was last updated.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "user",
- "description": "User that is associated with the member object.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ProjectPermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "MemberInterface",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ProjectMemberConnection",
- "description": "The connection type for ProjectMember.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ProjectMemberEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ProjectMember",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ProjectMemberEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ProjectMember",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "ProjectMemberRelation",
- "description": "Project member relation",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "DIRECT",
- "description": "Direct members",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "INHERITED",
- "description": "Inherited members",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DESCENDANTS",
- "description": "Descendants members",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "INVITED_GROUPS",
- "description": "Invited Groups members",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ProjectPermissions",
- "description": null,
- "fields": [
- {
- "name": "adminOperations",
- "description": "Indicates the user can perform `admin_operations` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "adminProject",
- "description": "Indicates the user can perform `admin_project` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "adminRemoteMirror",
- "description": "Indicates the user can perform `admin_remote_mirror` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "adminWiki",
- "description": "Indicates the user can perform `admin_wiki` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "archiveProject",
- "description": "Indicates the user can perform `archive_project` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "changeNamespace",
- "description": "Indicates the user can perform `change_namespace` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "changeVisibilityLevel",
- "description": "Indicates the user can perform `change_visibility_level` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createDeployment",
- "description": "Indicates the user can perform `create_deployment` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createDesign",
- "description": "Indicates the user can perform `create_design` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createIssue",
- "description": "Indicates the user can perform `create_issue` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createLabel",
- "description": "Indicates the user can perform `create_label` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createMergeRequestFrom",
- "description": "Indicates the user can perform `create_merge_request_from` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createMergeRequestIn",
- "description": "Indicates the user can perform `create_merge_request_in` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createPages",
- "description": "Indicates the user can perform `create_pages` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createPipeline",
- "description": "Indicates the user can perform `create_pipeline` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createPipelineSchedule",
- "description": "Indicates the user can perform `create_pipeline_schedule` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createSnippet",
- "description": "Indicates the user can perform `create_snippet` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createWiki",
- "description": "Indicates the user can perform `create_wiki` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyDesign",
- "description": "Indicates the user can perform `destroy_design` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyPages",
- "description": "Indicates the user can perform `destroy_pages` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyWiki",
- "description": "Indicates the user can perform `destroy_wiki` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "downloadCode",
- "description": "Indicates the user can perform `download_code` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "downloadWikiCode",
- "description": "Indicates the user can perform `download_wiki_code` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "forkProject",
- "description": "Indicates the user can perform `fork_project` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pushCode",
- "description": "Indicates the user can perform `push_code` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pushToDeleteProtectedBranch",
- "description": "Indicates the user can perform `push_to_delete_protected_branch` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readCommitStatus",
- "description": "Indicates the user can perform `read_commit_status` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readCycleAnalytics",
- "description": "Indicates the user can perform `read_cycle_analytics` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readDesign",
- "description": "Indicates the user can perform `read_design` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readMergeRequest",
- "description": "Indicates the user can perform `read_merge_request` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readPagesContent",
- "description": "Indicates the user can perform `read_pages_content` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readProject",
- "description": "Indicates the user can perform `read_project` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readProjectMember",
- "description": "Indicates the user can perform `read_project_member` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readWiki",
- "description": "Indicates the user can perform `read_wiki` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "removeForkProject",
- "description": "Indicates the user can perform `remove_fork_project` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "removePages",
- "description": "Indicates the user can perform `remove_pages` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "removeProject",
- "description": "Indicates the user can perform `remove_project` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "renameProject",
- "description": "Indicates the user can perform `rename_project` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "requestAccess",
- "description": "Indicates the user can perform `request_access` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatePages",
- "description": "Indicates the user can perform `update_pages` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateWiki",
- "description": "Indicates the user can perform `update_wiki` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "uploadFile",
- "description": "Indicates the user can perform `upload_file` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ProjectStatistics",
- "description": null,
- "fields": [
- {
- "name": "buildArtifactsSize",
- "description": "Build artifacts size of the project in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "commitCount",
- "description": "Commit count of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lfsObjectsSize",
- "description": "Large File Storage (LFS) object size of the project in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "packagesSize",
- "description": "Packages size of the project in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "repositorySize",
- "description": "Repository size of the project in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "snippetsSize",
- "description": "Snippets size of the project in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "storageSize",
- "description": "Storage size of the project in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "uploadsSize",
- "description": "Uploads size of the project in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "wikiSize",
- "description": "Wiki size of the project in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PrometheusAlert",
- "description": "The alert condition for Prometheus",
- "fields": [
- {
- "name": "humanizedText",
- "description": "The human-readable text of the alert condition.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the alert condition.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "PrometheusIntegrationCreateInput",
- "description": "Autogenerated input type of PrometheusIntegrationCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project to create the integration in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "active",
- "description": "Whether the integration is receiving alerts.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "apiUrl",
- "description": "Endpoint at which prometheus can be queried.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PrometheusIntegrationCreatePayload",
- "description": "Autogenerated return type of PrometheusIntegrationCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "integration",
- "description": "The newly created integration.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementPrometheusIntegration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "PrometheusIntegrationResetTokenInput",
- "description": "Autogenerated input type of PrometheusIntegrationResetToken",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The ID of the integration to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "PrometheusServiceID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PrometheusIntegrationResetTokenPayload",
- "description": "Autogenerated return type of PrometheusIntegrationResetToken",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "integration",
- "description": "The newly created integration.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementPrometheusIntegration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "PrometheusIntegrationUpdateInput",
- "description": "Autogenerated input type of PrometheusIntegrationUpdate",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The ID of the integration to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "PrometheusServiceID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "active",
- "description": "Whether the integration is receiving alerts.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "apiUrl",
- "description": "Endpoint at which prometheus can be queried.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PrometheusIntegrationUpdatePayload",
- "description": "Autogenerated return type of PrometheusIntegrationUpdate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "integration",
- "description": "The newly created integration.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementPrometheusIntegration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "PrometheusServiceID",
- "description": "Identifier of PrometheusService.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "PromoteToEpicInput",
- "description": "Autogenerated input type of PromoteToEpic",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the issue to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "groupPath",
- "description": "The group the promoted epic will belong to.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PromoteToEpicPayload",
- "description": "Autogenerated return type of PromoteToEpic",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epic",
- "description": "The epic after issue promotion.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Query",
- "description": null,
- "fields": [
- {
- "name": "ciApplicationSettings",
- "description": "CI related settings that apply to the entire instance.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiApplicationSettings",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ciConfig",
- "description": "Get linted and processed contents of a CI config. Should not be requested more than once per request.",
- "args": [
- {
- "name": "projectPath",
- "description": "The project of the CI config.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "content",
- "description": "Contents of '.gitlab-ci.yml'.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "dryRun",
- "description": "Run pipeline creation simulation, or only do static check.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiConfig",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "containerRepository",
- "description": "Find a container repository.",
- "args": [
- {
- "name": "id",
- "description": "The global ID of the container repository.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ContainerRepositoryID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ContainerRepositoryDetails",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "currentUser",
- "description": "Get information about current user.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "designManagement",
- "description": "Fields related to design management.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DesignManagement",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "devopsAdoptionSegments",
- "description": "Get configured DevOps adoption segments on the instance.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DevopsAdoptionSegmentConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "echo",
- "description": "Text to echo back.",
- "args": [
- {
- "name": "text",
- "description": "Text to echo back.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "geoNode",
- "description": "Find a Geo node.",
- "args": [
- {
- "name": "name",
- "description": "The name of the Geo node. Defaults to the current Geo node name.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "GeoNode",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "group",
- "description": "Find a group.",
- "args": [
- {
- "name": "fullPath",
- "description": "The full path of the project, group or namespace, e.g., \"gitlab-org/gitlab-foss\".",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Group",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "instanceSecurityDashboard",
- "description": "Fields related to Instance Security Dashboard.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "InstanceSecurityDashboard",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "instanceStatisticsMeasurements",
- "description": "Get statistics on the instance.",
- "args": [
- {
- "name": "identifier",
- "description": "The type of measurement/statistics to retrieve.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "MeasurementIdentifier",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "recordedAfter",
- "description": "Measurement recorded after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "recordedBefore",
- "description": "Measurement recorded before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "InstanceStatisticsMeasurementConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "Find an issue.",
- "args": [
- {
- "name": "id",
- "description": "The global ID of the Issue.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "IssueID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iteration",
- "description": "Find an iteration.",
- "args": [
- {
- "name": "id",
- "description": "Find an iteration by its ID.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "IterationID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Iteration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "metadata",
- "description": "Metadata about GitLab.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Metadata",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "milestone",
- "description": "Find a milestone.",
- "args": [
- {
- "name": "id",
- "description": "Find a milestone by its ID.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "MilestoneID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Milestone",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "namespace",
- "description": "Find a namespace.",
- "args": [
- {
- "name": "fullPath",
- "description": "The full path of the project, group or namespace, e.g., \"gitlab-org/gitlab-foss\".",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Namespace",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "package",
- "description": "Find a package.",
- "args": [
- {
- "name": "id",
- "description": "The global ID of the package.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "PackagesPackageID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Package",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "Find a project.",
- "args": [
- {
- "name": "fullPath",
- "description": "The full path of the project, group or namespace, e.g., \"gitlab-org/gitlab-foss\".",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "projects",
- "description": "Find projects visible to the current user.",
- "args": [
- {
- "name": "membership",
- "description": "Limit projects that the current user is a member of.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for project name, path, or description.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "ids",
- "description": "Filter projects by IDs.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "searchNamespaces",
- "description": "Include namespace in project search.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort order of results.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ProjectConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "runnerPlatforms",
- "description": "Supported runner platforms.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RunnerPlatformConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "runnerSetup",
- "description": "Get runner setup instructions.",
- "args": [
- {
- "name": "platform",
- "description": "Platform to generate the instructions for.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "architecture",
- "description": "Architecture to generate the instructions for.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "projectId",
- "description": "Project to register the runner for.",
- "type": {
- "kind": "SCALAR",
- "name": "ProjectID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "groupId",
- "description": "Group to register the runner for.",
- "type": {
- "kind": "SCALAR",
- "name": "GroupID",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RunnerSetup",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "snippets",
- "description": "Find Snippets visible to the current user.",
- "args": [
- {
- "name": "ids",
- "description": "Array of global snippet ids, e.g., \"gid://gitlab/ProjectSnippet/1\".",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "SnippetID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "visibility",
- "description": "The visibility of the snippet.",
- "type": {
- "kind": "ENUM",
- "name": "VisibilityScopesEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "authorId",
- "description": "The ID of an author.",
- "type": {
- "kind": "SCALAR",
- "name": "UserID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "projectId",
- "description": "The ID of a project.",
- "type": {
- "kind": "SCALAR",
- "name": "ProjectID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "type",
- "description": "The type of snippet.",
- "type": {
- "kind": "ENUM",
- "name": "TypeEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "explore",
- "description": "Explore personal snippets.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SnippetConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "user",
- "description": "Find a user.",
- "args": [
- {
- "name": "id",
- "description": "ID of the User.",
- "type": {
- "kind": "SCALAR",
- "name": "UserID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "username",
- "description": "Username of the User.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "users",
- "description": "Find users.",
- "args": [
- {
- "name": "ids",
- "description": "List of user Global IDs.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "usernames",
- "description": "List of usernames.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort users by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "Sort",
- "ofType": null
- },
- "defaultValue": "created_desc"
- },
- {
- "name": "search",
- "description": "Query to search users by name, username, or primary email.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "admins",
- "description": "Return only admin users.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UserConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilities",
- "description": "Vulnerabilities reported on projects on the current user's instance security dashboard.",
- "args": [
- {
- "name": "projectId",
- "description": "Filter vulnerabilities by project.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "reportType",
- "description": "Filter vulnerabilities by report type.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityReportType",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "severity",
- "description": "Filter vulnerabilities by severity.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilitySeverity",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter vulnerabilities by state.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityState",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "scanner",
- "description": "Filter vulnerabilities by VulnerabilityScanner.externalId.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "List vulnerabilities by sort order.",
- "type": {
- "kind": "ENUM",
- "name": "VulnerabilitySort",
- "ofType": null
- },
- "defaultValue": "severity_desc"
- },
- {
- "name": "hasResolution",
- "description": "Returns only the vulnerabilities which have been resolved on default branch.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "hasIssues",
- "description": "Returns only the vulnerabilities which have linked issues.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilitiesCountByDay",
- "description": "Number of vulnerabilities per day for the projects on the current user's instance security dashboard.",
- "args": [
- {
- "name": "startDate",
- "description": "First day for which to fetch vulnerability history.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "Last day for which to fetch vulnerability history.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilitiesCountByDayAndSeverity",
- "description": "Number of vulnerabilities per severity level, per day, for the projects on the current user's instance security dashboard. Deprecated in 13.3: Use `vulnerabilitiesCountByDay`.",
- "args": [
- {
- "name": "startDate",
- "description": "First day for which to fetch vulnerability history.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "Last day for which to fetch vulnerability history.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayAndSeverityConnection",
- "ofType": null
- },
- "isDeprecated": true,
- "deprecationReason": "Use `vulnerabilitiesCountByDay`. Deprecated in 13.3."
- },
- {
- "name": "vulnerability",
- "description": "Find a vulnerability.",
- "args": [
- {
- "name": "id",
- "description": "The Global ID of the Vulnerability.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "VulnerabilityID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Vulnerability",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "RegistryState",
- "description": "State of a Geo registry",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "PENDING",
- "description": "Registry waiting to be synced",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "STARTED",
- "description": "Registry currently syncing",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SYNCED",
- "description": "Registry that is synced",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FAILED",
- "description": "Registry that failed to sync",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Release",
- "description": "Represents a release",
- "fields": [
- {
- "name": "assets",
- "description": "Assets of the release.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ReleaseAssets",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "author",
- "description": "User that created the release.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "commit",
- "description": "The commit associated with the release.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Commit",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp of when the release was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description (also known as \"release notes\") of the release.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descriptionHtml",
- "description": "The GitLab Flavored Markdown rendering of `description`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "evidences",
- "description": "Evidence for the release.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ReleaseEvidenceConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "links",
- "description": "Links of the release.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ReleaseLinks",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "milestones",
- "description": "Milestones associated to the release.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MilestoneConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the release.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "releasedAt",
- "description": "Timestamp of when the release was released.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tagName",
- "description": "Name of the tag associated with the release.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tagPath",
- "description": "Relative web path to the tag associated with the release.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "upcomingRelease",
- "description": "Indicates the release is an upcoming release.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseAssetLink",
- "description": "Represents an asset link associated with a release",
- "fields": [
- {
- "name": "directAssetUrl",
- "description": "Direct asset URL of the link.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "external",
- "description": "Indicates the link points to an external resource.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the link.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "linkType",
- "description": "Type of the link: `other`, `runbook`, `image`, `package`; defaults to `other`.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "ReleaseAssetLinkType",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the link.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "url",
- "description": "URL of the link.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseAssetLinkConnection",
- "description": "The connection type for ReleaseAssetLink.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ReleaseAssetLinkEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ReleaseAssetLink",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseAssetLinkEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ReleaseAssetLink",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "ReleaseAssetLinkInput",
- "description": "Fields that are available when modifying a release asset link",
- "fields": null,
- "inputFields": [
- {
- "name": "name",
- "description": "Name of the asset link.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "url",
- "description": "URL of the asset link.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "directAssetPath",
- "description": "Relative path for a direct asset link.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "linkType",
- "description": "The type of the asset link.",
- "type": {
- "kind": "ENUM",
- "name": "ReleaseAssetLinkType",
- "ofType": null
- },
- "defaultValue": "OTHER"
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "ReleaseAssetLinkType",
- "description": "Type of the link: `other`, `runbook`, `image`, `package`",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "OTHER",
- "description": "Other link type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "RUNBOOK",
- "description": "Runbook link type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PACKAGE",
- "description": "Package link type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "IMAGE",
- "description": "Image link type",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseAssets",
- "description": "A container for all assets associated with a release",
- "fields": [
- {
- "name": "count",
- "description": "Number of assets of the release.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "links",
- "description": "Asset links of the release.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ReleaseAssetLinkConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sources",
- "description": "Sources of the release.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ReleaseSourceConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "ReleaseAssetsInput",
- "description": "Fields that are available when modifying release assets",
- "fields": null,
- "inputFields": [
- {
- "name": "links",
- "description": "A list of asset links to associate to the release.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "ReleaseAssetLinkInput",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseConnection",
- "description": "The connection type for Release.",
- "fields": [
- {
- "name": "count",
- "description": "Total count of collection.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ReleaseEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Release",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "ReleaseCreateInput",
- "description": "Autogenerated input type of ReleaseCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "Full path of the project the release is associated with.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "tagName",
- "description": "Name of the tag to associate with the release.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "ref",
- "description": "The commit SHA or branch name to use if creating a new tag.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "Name of the release.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "Description (also known as \"release notes\") of the release.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "releasedAt",
- "description": "The date when the release will be/was ready. Defaults to the current time.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "milestones",
- "description": "The title of each milestone the release is associated with. GitLab Premium customers can specify group milestones.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "assets",
- "description": "Assets associated to the release.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "ReleaseAssetsInput",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseCreatePayload",
- "description": "Autogenerated return type of ReleaseCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "release",
- "description": "The release after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Release",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "ReleaseDeleteInput",
- "description": "Autogenerated input type of ReleaseDelete",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "Full path of the project the release is associated with.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "tagName",
- "description": "Name of the tag associated with the release to delete.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseDeletePayload",
- "description": "Autogenerated return type of ReleaseDelete",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "release",
- "description": "The deleted release.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Release",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Release",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseEvidence",
- "description": "Evidence for a release",
- "fields": [
- {
- "name": "collectedAt",
- "description": "Timestamp when the evidence was collected.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "filepath",
- "description": "URL from where the evidence can be downloaded.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the evidence.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sha",
- "description": "SHA1 ID of the evidence hash.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseEvidenceConnection",
- "description": "The connection type for ReleaseEvidence.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ReleaseEvidenceEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ReleaseEvidence",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseEvidenceEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ReleaseEvidence",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseLinks",
- "description": null,
- "fields": [
- {
- "name": "closedIssuesUrl",
- "description": "HTTP URL of the issues page, filtered by this release and `state=closed`.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "closedMergeRequestsUrl",
- "description": "HTTP URL of the merge request page , filtered by this release and `state=closed`.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "editUrl",
- "description": "HTTP URL of the release's edit page.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergedMergeRequestsUrl",
- "description": "HTTP URL of the merge request page , filtered by this release and `state=merged`.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "openedIssuesUrl",
- "description": "HTTP URL of the issues page, filtered by this release and `state=open`.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "openedMergeRequestsUrl",
- "description": "HTTP URL of the merge request page, filtered by this release and `state=open`.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "selfUrl",
- "description": "HTTP URL of the release.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "ReleaseSort",
- "description": "Values for sorting releases",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "CREATED_DESC",
- "description": "Created at descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED_ASC",
- "description": "Created at ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "RELEASED_AT_DESC",
- "description": "Released at by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "RELEASED_AT_ASC",
- "description": "Released at by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseSource",
- "description": "Represents the source code attached to a release in a particular format",
- "fields": [
- {
- "name": "format",
- "description": "Format of the source.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "url",
- "description": "Download URL of the source.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseSourceConnection",
- "description": "The connection type for ReleaseSource.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ReleaseSourceEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ReleaseSource",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseSourceEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ReleaseSource",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "ReleaseUpdateInput",
- "description": "Autogenerated input type of ReleaseUpdate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "Full path of the project the release is associated with.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "tagName",
- "description": "Name of the tag associated with the release.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "Name of the release.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "Description (release notes) of the release.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "releasedAt",
- "description": "The release date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "milestones",
- "description": "The title of each milestone the release is associated with. GitLab Premium customers can specify group milestones.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseUpdatePayload",
- "description": "Autogenerated return type of ReleaseUpdate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "release",
- "description": "The release after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Release",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "RemoveAwardEmojiInput",
- "description": "Autogenerated input type of RemoveAwardEmoji",
- "fields": null,
- "inputFields": [
- {
- "name": "awardableId",
- "description": "The global ID of the awardable resource.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "AwardableID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The emoji name.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RemoveAwardEmojiPayload",
- "description": "Autogenerated return type of RemoveAwardEmoji",
- "fields": [
- {
- "name": "awardEmoji",
- "description": "The award emoji after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AwardEmoji",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "RemoveProjectFromSecurityDashboardInput",
- "description": "Autogenerated input type of RemoveProjectFromSecurityDashboard",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the project to remove from the Instance Security Dashboard.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ProjectID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RemoveProjectFromSecurityDashboardPayload",
- "description": "Autogenerated return type of RemoveProjectFromSecurityDashboard",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "RepositionImageDiffNoteInput",
- "description": "Autogenerated input type of RepositionImageDiffNote",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the DiffNote to update.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DiffNoteID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "position",
- "description": "The position of this note on a diff.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateDiffImagePositionInput",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RepositionImageDiffNotePayload",
- "description": "Autogenerated return type of RepositionImageDiffNote",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "note",
- "description": "The note after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Note",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Repository",
- "description": null,
- "fields": [
- {
- "name": "empty",
- "description": "Indicates repository has no visible content.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "exists",
- "description": "Indicates a corresponding Git repository exists on disk.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "rootRef",
- "description": "Default branch of the repository.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tree",
- "description": "Tree of the repository.",
- "args": [
- {
- "name": "path",
- "description": "The path to get the tree for. Default value is the root of the repository.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": "\"\""
- },
- {
- "name": "ref",
- "description": "The commit ref to get the tree for. Default value is HEAD.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": "\"head\""
- },
- {
- "name": "recursive",
- "description": "Used to get a recursive tree. Default is false.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Tree",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Requirement",
- "description": "Represents a requirement",
- "fields": [
- {
- "name": "author",
- "description": "Author of the requirement.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp of when the requirement was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the requirement.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descriptionHtml",
- "description": "The GitLab Flavored Markdown rendering of `description`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the requirement.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iid",
- "description": "Internal ID of the requirement.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastTestReportManuallyCreated",
- "description": "Indicates if latest test report was created by user.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastTestReportState",
- "description": "Latest requirement test report state.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "TestReportState",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "Project to which the requirement belongs.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "State of the requirement.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "RequirementState",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "testReports",
- "description": "Test reports of the requirement.",
- "args": [
- {
- "name": "sort",
- "description": "List test reports by sort order.",
- "type": {
- "kind": "ENUM",
- "name": "Sort",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TestReportConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the requirement.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "titleHtml",
- "description": "The GitLab Flavored Markdown rendering of `title`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp of when the requirement was last updated.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "RequirementPermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RequirementConnection",
- "description": "The connection type for Requirement.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "RequirementEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Requirement",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RequirementEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Requirement",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RequirementPermissions",
- "description": "Check permissions for the current user on a requirement",
- "fields": [
- {
- "name": "adminRequirement",
- "description": "Indicates the user can perform `admin_requirement` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createRequirement",
- "description": "Indicates the user can perform `create_requirement` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyRequirement",
- "description": "Indicates the user can perform `destroy_requirement` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readRequirement",
- "description": "Indicates the user can perform `read_requirement` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateRequirement",
- "description": "Indicates the user can perform `update_requirement` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "RequirementState",
- "description": "State of a requirement",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "OPENED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ARCHIVED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RequirementStatesCount",
- "description": "Counts of requirements by their state",
- "fields": [
- {
- "name": "archived",
- "description": "Number of archived requirements.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "opened",
- "description": "Number of opened requirements.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INTERFACE",
- "name": "ResolvableInterface",
- "description": null,
- "fields": [
- {
- "name": "resolvable",
- "description": "Indicates if the object can be resolved.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolved",
- "description": "Indicates if the object is resolved.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolvedAt",
- "description": "Timestamp of when the object was resolved.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolvedBy",
- "description": "User who resolved the object.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": [
- {
- "kind": "OBJECT",
- "name": "Discussion",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "Note",
- "ofType": null
- }
- ]
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "RevertVulnerabilityToDetectedInput",
- "description": "Autogenerated input type of RevertVulnerabilityToDetected",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the vulnerability to be reverted.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "VulnerabilityID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RevertVulnerabilityToDetectedPayload",
- "description": "Autogenerated return type of RevertVulnerabilityToDetected",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerability",
- "description": "The vulnerability after revert.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Vulnerability",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RootStorageStatistics",
- "description": null,
- "fields": [
- {
- "name": "buildArtifactsSize",
- "description": "The CI artifacts size in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lfsObjectsSize",
- "description": "The LFS objects size in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "packagesSize",
- "description": "The packages size in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineArtifactsSize",
- "description": "The CI pipeline artifacts size in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "repositorySize",
- "description": "The Git repository size in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "snippetsSize",
- "description": "The snippets size in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "storageSize",
- "description": "The total storage in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "uploadsSize",
- "description": "The uploads size in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "wikiSize",
- "description": "The wiki size in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "RunDASTScanInput",
- "description": "Autogenerated input type of RunDASTScan",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the DAST scan belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "targetUrl",
- "description": "The URL of the target to be scanned.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "branch",
- "description": "The branch to be associated with the scan.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "scanType",
- "description": "The type of scan to be run.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "DastScanTypeEnum",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RunDASTScanPayload",
- "description": "Autogenerated return type of RunDASTScan",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineUrl",
- "description": "URL of the pipeline that was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RunnerArchitecture",
- "description": null,
- "fields": [
- {
- "name": "downloadLocation",
- "description": "Download location for the runner for the platform architecture.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the runner platform architecture.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RunnerArchitectureConnection",
- "description": "The connection type for RunnerArchitecture.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "RunnerArchitectureEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "RunnerArchitecture",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RunnerArchitectureEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RunnerArchitecture",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RunnerPlatform",
- "description": null,
- "fields": [
- {
- "name": "architectures",
- "description": "Runner architectures supported for the platform.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RunnerArchitectureConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "humanReadableName",
- "description": "Human readable name of the runner platform.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name slug of the runner platform.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RunnerPlatformConnection",
- "description": "The connection type for RunnerPlatform.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "RunnerPlatformEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "RunnerPlatform",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RunnerPlatformEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RunnerPlatform",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RunnerSetup",
- "description": null,
- "fields": [
- {
- "name": "installInstructions",
- "description": "Instructions for installing the runner on the specified architecture.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "registerInstructions",
- "description": "Instructions for registering the runner.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SastCiConfiguration",
- "description": "Represents a CI configuration of SAST",
- "fields": [
- {
- "name": "analyzers",
- "description": "List of analyzers entities attached to SAST configuration.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationAnalyzersEntityConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "global",
- "description": "List of global entities related to SAST configuration.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationEntityConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipeline",
- "description": "List of pipeline entities related to SAST configuration.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationEntityConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SastCiConfigurationAnalyzersEntity",
- "description": "Represents an analyzer entity in SAST CI configuration",
- "fields": [
- {
- "name": "description",
- "description": "Analyzer description that is displayed on the form.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "enabled",
- "description": "Indicates whether an analyzer is enabled.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "label",
- "description": "Analyzer label used in the config UI.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the analyzer.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "variables",
- "description": "List of supported variables.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationEntityConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SastCiConfigurationAnalyzersEntityConnection",
- "description": "The connection type for SastCiConfigurationAnalyzersEntity.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationAnalyzersEntityEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationAnalyzersEntity",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SastCiConfigurationAnalyzersEntityEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationAnalyzersEntity",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "SastCiConfigurationAnalyzersEntityInput",
- "description": "Represents the analyzers entity in SAST CI configuration",
- "fields": null,
- "inputFields": [
- {
- "name": "name",
- "description": "Name of analyzer.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "enabled",
- "description": "State of the analyzer.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "variables",
- "description": "List of variables for the analyzer.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "SastCiConfigurationEntityInput",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SastCiConfigurationEntity",
- "description": "Represents an entity in SAST CI configuration",
- "fields": [
- {
- "name": "defaultValue",
- "description": "Default value that is used if value is empty.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Entity description that is displayed on the form.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "field",
- "description": "CI keyword of entity.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "label",
- "description": "Label for entity used in the form.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "options",
- "description": "Different possible values of the field.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationOptionsEntityConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "size",
- "description": "Size of the UI component.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "SastUiComponentSize",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of the field value.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "value",
- "description": "Current value of the entity.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SastCiConfigurationEntityConnection",
- "description": "The connection type for SastCiConfigurationEntity.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationEntityEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationEntity",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SastCiConfigurationEntityEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationEntity",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "SastCiConfigurationEntityInput",
- "description": "Represents an entity in SAST CI configuration",
- "fields": null,
- "inputFields": [
- {
- "name": "field",
- "description": "CI keyword of entity.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "defaultValue",
- "description": "Default value that is used if value is empty.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "value",
- "description": "Current value of the entity.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "SastCiConfigurationInput",
- "description": "Represents a CI configuration of SAST",
- "fields": null,
- "inputFields": [
- {
- "name": "global",
- "description": "List of global entities related to SAST configuration.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "SastCiConfigurationEntityInput",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "pipeline",
- "description": "List of pipeline entities related to SAST configuration.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "SastCiConfigurationEntityInput",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "analyzers",
- "description": "List of analyzers and related variables for the SAST configuration.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "SastCiConfigurationAnalyzersEntityInput",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SastCiConfigurationOptionsEntity",
- "description": "Represents an entity for options in SAST CI configuration",
- "fields": [
- {
- "name": "label",
- "description": "Label of option entity.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "value",
- "description": "Value of option entity.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SastCiConfigurationOptionsEntityConnection",
- "description": "The connection type for SastCiConfigurationOptionsEntity.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationOptionsEntityEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationOptionsEntity",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SastCiConfigurationOptionsEntityEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationOptionsEntity",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "SastUiComponentSize",
- "description": "Size of UI component in SAST configuration page",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "SMALL",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MEDIUM",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LARGE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ScannedResource",
- "description": "Represents a resource scanned by a security scan",
- "fields": [
- {
- "name": "requestMethod",
- "description": "The HTTP request method used to access the URL.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "url",
- "description": "The URL scanned by the scanner.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ScannedResourceConnection",
- "description": "The connection type for ScannedResource.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ScannedResourceEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ScannedResource",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ScannedResourceEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ScannedResource",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SecurityReportSummary",
- "description": "Represents summary of a security report",
- "fields": [
- {
- "name": "apiFuzzing",
- "description": "Aggregated counts for the `api_fuzzing` scan",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SecurityReportSummarySection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "containerScanning",
- "description": "Aggregated counts for the `container_scanning` scan",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SecurityReportSummarySection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "coverageFuzzing",
- "description": "Aggregated counts for the `coverage_fuzzing` scan",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SecurityReportSummarySection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dast",
- "description": "Aggregated counts for the `dast` scan",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SecurityReportSummarySection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dependencyScanning",
- "description": "Aggregated counts for the `dependency_scanning` scan",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SecurityReportSummarySection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sast",
- "description": "Aggregated counts for the `sast` scan",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SecurityReportSummarySection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "secretDetection",
- "description": "Aggregated counts for the `secret_detection` scan",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SecurityReportSummarySection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SecurityReportSummarySection",
- "description": "Represents a section of a summary of a security report",
- "fields": [
- {
- "name": "scannedResources",
- "description": "A list of the first 20 scanned resources.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ScannedResourceConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "scannedResourcesCount",
- "description": "Total number of scanned resources.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "scannedResourcesCsvPath",
- "description": "Path to download all the scanned resources in CSV format.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilitiesCount",
- "description": "Total number of vulnerabilities.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "SecurityReportTypeEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "SAST",
- "description": "SAST scan report",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DAST",
- "description": "DAST scan report",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DEPENDENCY_SCANNING",
- "description": "DEPENDENCY SCANNING scan report",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CONTAINER_SCANNING",
- "description": "CONTAINER SCANNING scan report",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SECRET_DETECTION",
- "description": "SECRET DETECTION scan report",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "COVERAGE_FUZZING",
- "description": "COVERAGE FUZZING scan report",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "API_FUZZING",
- "description": "API FUZZING scan report",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "SecurityScannerType",
- "description": "The type of the security scanner",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "SAST",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DAST",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DEPENDENCY_SCANNING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CONTAINER_SCANNING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SECRET_DETECTION",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "COVERAGE_FUZZING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "API_FUZZING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SecurityScanners",
- "description": "Represents a list of security scanners",
- "fields": [
- {
- "name": "available",
- "description": "List of analyzers which are available for the project.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "SecurityScannerType",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "enabled",
- "description": "List of analyzers which are enabled for the project.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "SecurityScannerType",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineRun",
- "description": "List of analyzers which ran successfully in the latest pipeline.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "SecurityScannerType",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SentryDetailedError",
- "description": "A Sentry error",
- "fields": [
- {
- "name": "count",
- "description": "Count of occurrences.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "culprit",
- "description": "Culprit of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "externalBaseUrl",
- "description": "External Base URL of the Sentry Instance.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "externalUrl",
- "description": "External URL of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "firstReleaseLastCommit",
- "description": "Commit the error was first seen.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "firstReleaseShortVersion",
- "description": "Release short version the error was first seen.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "firstReleaseVersion",
- "description": "Release version the error was first seen.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "firstSeen",
- "description": "Timestamp when the error was first seen.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "frequency",
- "description": "Last 24hr stats of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SentryErrorFrequency",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "gitlabCommit",
- "description": "GitLab commit SHA attributed to the Error based on the release version.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "gitlabCommitPath",
- "description": "Path to the GitLab page for the GitLab commit attributed to the error.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "gitlabIssuePath",
- "description": "URL of GitLab Issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID (global ID) of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastReleaseLastCommit",
- "description": "Commit the error was last seen.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastReleaseShortVersion",
- "description": "Release short version the error was last seen.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastReleaseVersion",
- "description": "Release version the error was last seen.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastSeen",
- "description": "Timestamp when the error was last seen.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "message",
- "description": "Sentry metadata message of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sentryId",
- "description": "ID (Sentry ID) of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sentryProjectId",
- "description": "ID of the project (Sentry project).",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sentryProjectName",
- "description": "Name of the project affected by the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sentryProjectSlug",
- "description": "Slug of the project affected by the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "shortId",
- "description": "Short ID (Sentry ID) of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "status",
- "description": "Status of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "SentryErrorStatus",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tags",
- "description": "Tags associated with the Sentry Error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SentryErrorTags",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userCount",
- "description": "Count of users affected by the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SentryError",
- "description": "A Sentry error. A simplified version of SentryDetailedError",
- "fields": [
- {
- "name": "count",
- "description": "Count of occurrences.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "culprit",
- "description": "Culprit of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "externalUrl",
- "description": "External URL of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "firstSeen",
- "description": "Timestamp when the error was first seen.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "frequency",
- "description": "Last 24hr stats of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SentryErrorFrequency",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID (global ID) of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastSeen",
- "description": "Timestamp when the error was last seen.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "message",
- "description": "Sentry metadata message of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sentryId",
- "description": "ID (Sentry ID) of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sentryProjectId",
- "description": "ID of the project (Sentry project).",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sentryProjectName",
- "description": "Name of the project affected by the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sentryProjectSlug",
- "description": "Slug of the project affected by the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "shortId",
- "description": "Short ID (Sentry ID) of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "status",
- "description": "Status of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "SentryErrorStatus",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userCount",
- "description": "Count of users affected by the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SentryErrorCollection",
- "description": "An object containing a collection of Sentry errors, and a detailed error",
- "fields": [
- {
- "name": "detailedError",
- "description": "Detailed version of a Sentry error on the project.",
- "args": [
- {
- "name": "id",
- "description": "ID of the Sentry issue.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "GitlabErrorTrackingDetailedErrorID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SentryDetailedError",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errorStackTrace",
- "description": "Stack Trace of Sentry Error.",
- "args": [
- {
- "name": "id",
- "description": "ID of the Sentry issue.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "GitlabErrorTrackingDetailedErrorID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SentryErrorStackTrace",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Collection of Sentry Errors.",
- "args": [
- {
- "name": "searchTerm",
- "description": "Search query for the Sentry error details.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Attribute to sort on. Options are frequency, first_seen, last_seen. last_seen is default.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SentryErrorConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "externalUrl",
- "description": "External URL for Sentry.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SentryErrorConnection",
- "description": "The connection type for SentryError.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SentryErrorEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SentryError",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SentryErrorEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SentryError",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SentryErrorFrequency",
- "description": null,
- "fields": [
- {
- "name": "count",
- "description": "Count of errors received since the previously recorded time.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "time",
- "description": "Time the error frequency stats were recorded.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SentryErrorStackTrace",
- "description": "An object containing a stack trace entry for a Sentry error",
- "fields": [
- {
- "name": "dateReceived",
- "description": "Time the stack trace was received by Sentry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueId",
- "description": "ID of the Sentry error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "stackTraceEntries",
- "description": "Stack trace entries for the Sentry error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SentryErrorStackTraceEntry",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SentryErrorStackTraceContext",
- "description": "An object context for a Sentry error stack trace",
- "fields": [
- {
- "name": "code",
- "description": "Code number of the context.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "line",
- "description": "Line number of the context.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SentryErrorStackTraceEntry",
- "description": "An object containing a stack trace entry for a Sentry error",
- "fields": [
- {
- "name": "col",
- "description": "Function in which the Sentry error occurred.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fileName",
- "description": "File in which the Sentry error occurred.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "function",
- "description": "Function in which the Sentry error occurred.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "line",
- "description": "Function in which the Sentry error occurred.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "traceContext",
- "description": "Context of the Sentry error.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SentryErrorStackTraceContext",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "SentryErrorStatus",
- "description": "State of a Sentry error",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "RESOLVED",
- "description": "Error has been resolved",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "RESOLVED_IN_NEXT_RELEASE",
- "description": "Error has been ignored until next release",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UNRESOLVED",
- "description": "Error is unresolved",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "IGNORED",
- "description": "Error has been ignored",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SentryErrorTags",
- "description": "State of a Sentry error",
- "fields": [
- {
- "name": "level",
- "description": "Severity level of the Sentry Error.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "logger",
- "description": "Logger of the Sentry Error.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INTERFACE",
- "name": "Service",
- "description": null,
- "fields": [
- {
- "name": "active",
- "description": "Indicates if the service is active.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Class name of the service.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": [
- {
- "kind": "OBJECT",
- "name": "BaseService",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "JiraService",
- "ofType": null
- }
- ]
- },
- {
- "kind": "OBJECT",
- "name": "ServiceConnection",
- "description": "The connection type for Service.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ServiceEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "INTERFACE",
- "name": "Service",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ServiceEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "INTERFACE",
- "name": "Service",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "ServiceType",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "ASANA_SERVICE",
- "description": "AsanaService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ASSEMBLA_SERVICE",
- "description": "AssemblaService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "BAMBOO_SERVICE",
- "description": "BambooService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "BUGZILLA_SERVICE",
- "description": "BugzillaService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "BUILDKITE_SERVICE",
- "description": "BuildkiteService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CAMPFIRE_SERVICE",
- "description": "CampfireService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CONFLUENCE_SERVICE",
- "description": "ConfluenceService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CUSTOM_ISSUE_TRACKER_SERVICE",
- "description": "CustomIssueTrackerService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DATADOG_SERVICE",
- "description": "DatadogService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DISCORD_SERVICE",
- "description": "DiscordService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DRONE_CI_SERVICE",
- "description": "DroneCiService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "EMAILS_ON_PUSH_SERVICE",
- "description": "EmailsOnPushService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "EWM_SERVICE",
- "description": "EwmService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "EXTERNAL_WIKI_SERVICE",
- "description": "ExternalWikiService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FLOWDOCK_SERVICE",
- "description": "FlowdockService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "GITHUB_SERVICE",
- "description": "GithubService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "HANGOUTS_CHAT_SERVICE",
- "description": "HangoutsChatService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "HIPCHAT_SERVICE",
- "description": "HipchatService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "IRKER_SERVICE",
- "description": "IrkerService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "JENKINS_SERVICE",
- "description": "JenkinsService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "JIRA_SERVICE",
- "description": "JiraService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MATTERMOST_SERVICE",
- "description": "MattermostService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MATTERMOST_SLASH_COMMANDS_SERVICE",
- "description": "MattermostSlashCommandsService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MICROSOFT_TEAMS_SERVICE",
- "description": "MicrosoftTeamsService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PACKAGIST_SERVICE",
- "description": "PackagistService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PIPELINES_EMAIL_SERVICE",
- "description": "PipelinesEmailService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PIVOTALTRACKER_SERVICE",
- "description": "PivotaltrackerService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PROMETHEUS_SERVICE",
- "description": "PrometheusService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PUSHOVER_SERVICE",
- "description": "PushoverService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "REDMINE_SERVICE",
- "description": "RedmineService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SLACK_SERVICE",
- "description": "SlackService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SLACK_SLASH_COMMANDS_SERVICE",
- "description": "SlackSlashCommandsService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "TEAMCITY_SERVICE",
- "description": "TeamcityService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UNIFY_CIRCUIT_SERVICE",
- "description": "UnifyCircuitService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEBEX_TEAMS_SERVICE",
- "description": "WebexTeamsService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "YOUTRACK_SERVICE",
- "description": "YoutrackService type",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Snippet",
- "description": "Represents a snippet entry",
- "fields": [
- {
- "name": "author",
- "description": "The owner of the snippet.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "blob",
- "description": "Snippet blob. Deprecated in 13.3: Use `blobs`.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SnippetBlob",
- "ofType": null
- }
- },
- "isDeprecated": true,
- "deprecationReason": "Use `blobs`. Deprecated in 13.3."
- },
- {
- "name": "blobs",
- "description": "Snippet blobs.",
- "args": [
- {
- "name": "paths",
- "description": "Paths of the blobs.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SnippetBlobConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp this snippet was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the snippet.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descriptionHtml",
- "description": "The GitLab Flavored Markdown rendering of `description`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussions",
- "description": "All discussions on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiscussionConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fileName",
- "description": "File Name of the snippet.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "httpUrlToRepo",
- "description": "HTTP URL to the snippet repository.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the snippet.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "SnippetID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notes",
- "description": "All notes on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NoteConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "The project the snippet is associated with.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "rawUrl",
- "description": "Raw URL of the snippet.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sshUrlToRepo",
- "description": "SSH URL to the snippet repository.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the snippet.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp this snippet was updated.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SnippetPermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "visibilityLevel",
- "description": "Visibility Level of the snippet.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VisibilityLevelsEnum",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL of the snippet.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Noteable",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SnippetBlob",
- "description": "Represents the snippet blob",
- "fields": [
- {
- "name": "binary",
- "description": "Shows whether the blob is binary.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "externalStorage",
- "description": "Blob external storage.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mode",
- "description": "Blob mode.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Blob name.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Blob path.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "plainData",
- "description": "Blob plain highlighted data.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "rawPath",
- "description": "Blob raw content endpoint path.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "renderedAsText",
- "description": "Shows whether the blob is rendered as text.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "richData",
- "description": "Blob highlighted data.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "richViewer",
- "description": "Blob content rich viewer.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SnippetBlobViewer",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "simpleViewer",
- "description": "Blob content simple viewer.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SnippetBlobViewer",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "size",
- "description": "Blob size.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "SnippetBlobActionEnum",
- "description": "Type of a snippet blob input action",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "create",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "update",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "delete",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "move",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "SnippetBlobActionInputType",
- "description": "Represents an action to perform over a snippet file",
- "fields": null,
- "inputFields": [
- {
- "name": "action",
- "description": "Type of input action.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "SnippetBlobActionEnum",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "previousPath",
- "description": "Previous path of the snippet file.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "filePath",
- "description": "Path of the snippet file.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "content",
- "description": "Snippet file content.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SnippetBlobConnection",
- "description": "The connection type for SnippetBlob.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SnippetBlobEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SnippetBlob",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SnippetBlobEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SnippetBlob",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SnippetBlobViewer",
- "description": "Represents how the blob content should be displayed",
- "fields": [
- {
- "name": "collapsed",
- "description": "Shows whether the blob should be displayed collapsed.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fileType",
- "description": "Content file type.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "loadAsync",
- "description": "Shows whether the blob content is loaded asynchronously.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "loadingPartialName",
- "description": "Loading partial name.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "renderError",
- "description": "Error rendering the blob content.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tooLarge",
- "description": "Shows whether the blob too large to be displayed.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of blob viewer.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "BlobViewersType",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SnippetConnection",
- "description": "The connection type for Snippet.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SnippetEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Snippet",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SnippetEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Snippet",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "SnippetID",
- "description": "Identifier of Snippet.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SnippetPermissions",
- "description": null,
- "fields": [
- {
- "name": "adminSnippet",
- "description": "Indicates the user can perform `admin_snippet` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "awardEmoji",
- "description": "Indicates the user can perform `award_emoji` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createNote",
- "description": "Indicates the user can perform `create_note` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readSnippet",
- "description": "Indicates the user can perform `read_snippet` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "reportSnippet",
- "description": "Indicates the user can perform `report_snippet` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateSnippet",
- "description": "Indicates the user can perform `update_snippet` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SnippetRepositoryRegistry",
- "description": "Represents the Geo sync and verification state of a snippet repository",
- "fields": [
- {
- "name": "createdAt",
- "description": "Timestamp when the SnippetRepositoryRegistry was created",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the SnippetRepositoryRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastSyncFailure",
- "description": "Error message during sync of the SnippetRepositoryRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastSyncedAt",
- "description": "Timestamp of the most recent successful sync of the SnippetRepositoryRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "retryAt",
- "description": "Timestamp after which the SnippetRepositoryRegistry should be resynced",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "retryCount",
- "description": "Number of consecutive failed sync attempts of the SnippetRepositoryRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "snippetRepositoryId",
- "description": "ID of the Snippet Repository.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "Sync state of the SnippetRepositoryRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "RegistryState",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SnippetRepositoryRegistryConnection",
- "description": "The connection type for SnippetRepositoryRegistry.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SnippetRepositoryRegistryEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SnippetRepositoryRegistry",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SnippetRepositoryRegistryEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SnippetRepositoryRegistry",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "Sort",
- "description": "Common sort values",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "updated_desc",
- "description": "Updated at descending order",
- "isDeprecated": true,
- "deprecationReason": "Use UPDATED_DESC. Deprecated in 13.5."
- },
- {
- "name": "updated_asc",
- "description": "Updated at ascending order",
- "isDeprecated": true,
- "deprecationReason": "Use UPDATED_ASC. Deprecated in 13.5."
- },
- {
- "name": "created_desc",
- "description": "Created at descending order",
- "isDeprecated": true,
- "deprecationReason": "Use CREATED_DESC. Deprecated in 13.5."
- },
- {
- "name": "created_asc",
- "description": "Created at ascending order",
- "isDeprecated": true,
- "deprecationReason": "Use CREATED_ASC. Deprecated in 13.5."
- },
- {
- "name": "UPDATED_DESC",
- "description": "Updated at descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UPDATED_ASC",
- "description": "Updated at ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED_DESC",
- "description": "Created at descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED_ASC",
- "description": "Created at ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "StatusAction",
- "description": null,
- "fields": [
- {
- "name": "buttonTitle",
- "description": "Title for the button, for example: Retry this job.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "icon",
- "description": "Icon used in the action button.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "method",
- "description": "Method for the action, for example: :post.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Path for the action.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title for the action, for example: Retry.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "String",
- "description": "Represents textual data as UTF-8 character sequences. This type is most often used by GraphQL to represent free-form human-readable text.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Submodule",
- "description": null,
- "fields": [
- {
- "name": "flatPath",
- "description": "Flat path of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Path of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sha",
- "description": "Last commit SHA for the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "treeUrl",
- "description": "Tree URL for the sub-module.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of tree entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "EntryType",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL for the sub-module.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Entry",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SubmoduleConnection",
- "description": "The connection type for Submodule.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SubmoduleEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Submodule",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SubmoduleEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Submodule",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TaskCompletionStatus",
- "description": "Completion status of tasks",
- "fields": [
- {
- "name": "completedCount",
- "description": "Number of completed tasks.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "count",
- "description": "Number of total tasks.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TerraformState",
- "description": null,
- "fields": [
- {
- "name": "createdAt",
- "description": "Timestamp the Terraform state was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the Terraform state.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "latestVersion",
- "description": "The latest version of the Terraform state.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TerraformStateVersion",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lockedAt",
- "description": "Timestamp the Terraform state was locked.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lockedByUser",
- "description": "The user currently holding a lock on the Terraform state.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the Terraform state.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp the Terraform state was updated.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TerraformStateConnection",
- "description": "The connection type for TerraformState.",
- "fields": [
- {
- "name": "count",
- "description": "Total count of collection.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TerraformStateEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TerraformState",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "TerraformStateDeleteInput",
- "description": "Autogenerated input type of TerraformStateDelete",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "Global ID of the Terraform state.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "TerraformStateID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TerraformStateDeletePayload",
- "description": "Autogenerated return type of TerraformStateDelete",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TerraformStateEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TerraformState",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "TerraformStateID",
- "description": "Identifier of Terraform::State.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "TerraformStateLockInput",
- "description": "Autogenerated input type of TerraformStateLock",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "Global ID of the Terraform state.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "TerraformStateID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TerraformStateLockPayload",
- "description": "Autogenerated return type of TerraformStateLock",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "TerraformStateUnlockInput",
- "description": "Autogenerated input type of TerraformStateUnlock",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "Global ID of the Terraform state.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "TerraformStateID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TerraformStateUnlockPayload",
- "description": "Autogenerated return type of TerraformStateUnlock",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TerraformStateVersion",
- "description": null,
- "fields": [
- {
- "name": "createdAt",
- "description": "Timestamp the version was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdByUser",
- "description": "The user that created this version.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "downloadPath",
- "description": "URL for downloading the version's JSON file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the Terraform state version.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "job",
- "description": "The job that created this version.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiJob",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "serial",
- "description": "Serial number of the version.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp the version was updated.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TerraformStateVersionRegistry",
- "description": "Represents the Geo sync and verification state of a terraform state version",
- "fields": [
- {
- "name": "createdAt",
- "description": "Timestamp when the TerraformStateVersionRegistry was created",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the TerraformStateVersionRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastSyncFailure",
- "description": "Error message during sync of the TerraformStateVersionRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastSyncedAt",
- "description": "Timestamp of the most recent successful sync of the TerraformStateVersionRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "retryAt",
- "description": "Timestamp after which the TerraformStateVersionRegistry should be resynced",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "retryCount",
- "description": "Number of consecutive failed sync attempts of the TerraformStateVersionRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "Sync state of the TerraformStateVersionRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "RegistryState",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "terraformStateVersionId",
- "description": "ID of the terraform state version.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TerraformStateVersionRegistryConnection",
- "description": "The connection type for TerraformStateVersionRegistry.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TerraformStateVersionRegistryEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TerraformStateVersionRegistry",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TerraformStateVersionRegistryEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TerraformStateVersionRegistry",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TestReport",
- "description": "Represents a requirement test report",
- "fields": [
- {
- "name": "author",
- "description": "Author of the test report.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp of when the test report was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the test report.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "State of the test report.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "TestReportState",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TestReportConnection",
- "description": "The connection type for TestReport.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TestReportEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TestReport",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TestReportEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TestReport",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "TestReportState",
- "description": "State of a test report",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "PASSED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FAILED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "Time",
- "description": "Time represented in ISO 8601",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TimeReportStats",
- "description": "Represents the time report stats for timeboxes",
- "fields": [
- {
- "name": "complete",
- "description": "Completed issues metrics.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TimeboxMetrics",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "incomplete",
- "description": "Incomplete issues metrics.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TimeboxMetrics",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "total",
- "description": "Total issues metrics.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TimeboxMetrics",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TimeboxMetrics",
- "description": "Represents measured stats metrics for timeboxes",
- "fields": [
- {
- "name": "count",
- "description": "The count metric.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "weight",
- "description": "The weight metric.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TimeboxReport",
- "description": "Represents a historically accurate report about the timebox",
- "fields": [
- {
- "name": "burnupTimeSeries",
- "description": "Daily scope and completed totals for burnup charts.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "BurnupChartDailyTotals",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "stats",
- "description": "Represents the time report stats for the timebox.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TimeReportStats",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INTERFACE",
- "name": "TimeboxReportInterface",
- "description": null,
- "fields": [
- {
- "name": "report",
- "description": "Historically accurate report about the timebox.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TimeboxReport",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": [
- {
- "kind": "OBJECT",
- "name": "Iteration",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "Milestone",
- "ofType": null
- }
- ]
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "Timeframe",
- "description": "A time-frame defined as a closed inclusive range of two dates",
- "fields": null,
- "inputFields": [
- {
- "name": "start",
- "description": "The start of the range.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Date",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "end",
- "description": "The end of the range.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Date",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Timelog",
- "description": null,
- "fields": [
- {
- "name": "issue",
- "description": "The issue that logged time was added to.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "note",
- "description": "The note where the quick action to add the logged time was executed.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Note",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "spentAt",
- "description": "Timestamp of when the time tracked was spent at.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "timeSpent",
- "description": "The time spent displayed in seconds.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "user",
- "description": "The user that logged the time.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TimelogConnection",
- "description": "The connection type for Timelog.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TimelogEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Timelog",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TimelogEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Timelog",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Todo",
- "description": "Representing a to-do entry",
- "fields": [
- {
- "name": "action",
- "description": "Action of the to-do item.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "TodoActionEnum",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "author",
- "description": "The author of this to-do item.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "body",
- "description": "Body of the to-do item.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp this to-do item was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "group",
- "description": "Group this to-do item is associated with.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Group",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the to-do item.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "The project this to-do item is associated with.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "State of the to-do item.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "TodoStateEnum",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "targetType",
- "description": "Target type of the to-do item.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "TodoTargetEnum",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "TodoActionEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "assigned",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mentioned",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "build_failed",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "marked",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "approval_required",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "unmergeable",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "directly_addressed",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TodoConnection",
- "description": "The connection type for Todo.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TodoEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Todo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "TodoCreateInput",
- "description": "Autogenerated input type of TodoCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "targetId",
- "description": "The global ID of the to-do item's parent. Issues, merge requests, designs and epics are supported.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "TodoableID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TodoCreatePayload",
- "description": "Autogenerated return type of TodoCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todo",
- "description": "The to-do item created.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Todo",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TodoEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Todo",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "TodoID",
- "description": "Identifier of Todo.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "TodoMarkDoneInput",
- "description": "Autogenerated input type of TodoMarkDone",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the to-do item to mark as done.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "TodoID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TodoMarkDonePayload",
- "description": "Autogenerated return type of TodoMarkDone",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todo",
- "description": "The requested to-do item.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Todo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "TodoRestoreInput",
- "description": "Autogenerated input type of TodoRestore",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the to-do item to restore.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "TodoID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "TodoRestoreManyInput",
- "description": "Autogenerated input type of TodoRestoreMany",
- "fields": null,
- "inputFields": [
- {
- "name": "ids",
- "description": "The global IDs of the to-do items to restore (a maximum of 50 is supported at once).",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "TodoID",
- "ofType": null
- }
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TodoRestoreManyPayload",
- "description": "Autogenerated return type of TodoRestoreMany",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todos",
- "description": "Updated to-do items.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Todo",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedIds",
- "description": "The IDs of the updated to-do items. Deprecated in 13.2: Use to-do items.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "TodoID",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": true,
- "deprecationReason": "Use to-do items. Deprecated in 13.2."
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TodoRestorePayload",
- "description": "Autogenerated return type of TodoRestore",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todo",
- "description": "The requested to-do item.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Todo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "TodoStateEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "pending",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "done",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "TodoTargetEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "COMMIT",
- "description": "A Commit",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ISSUE",
- "description": "An Issue",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MERGEREQUEST",
- "description": "A MergeRequest",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DESIGN",
- "description": "A Design",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ALERT",
- "description": "An Alert",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "EPIC",
- "description": "An Epic",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "TodoableID",
- "description": "Identifier of Todoable.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "TodosMarkAllDoneInput",
- "description": "Autogenerated input type of TodosMarkAllDone",
- "fields": null,
- "inputFields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TodosMarkAllDonePayload",
- "description": "Autogenerated return type of TodosMarkAllDone",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todos",
- "description": "Updated to-do items.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Todo",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedIds",
- "description": "IDs of the updated to-do items. Deprecated in 13.2: Use to-do items.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "TodoID",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": true,
- "deprecationReason": "Use to-do items. Deprecated in 13.2."
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "ToggleAwardEmojiInput",
- "description": "Autogenerated input type of ToggleAwardEmoji",
- "fields": null,
- "inputFields": [
- {
- "name": "awardableId",
- "description": "The global ID of the awardable resource.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "AwardableID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The emoji name.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ToggleAwardEmojiPayload",
- "description": "Autogenerated return type of ToggleAwardEmoji",
- "fields": [
- {
- "name": "awardEmoji",
- "description": "The award emoji after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AwardEmoji",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "toggledOn",
- "description": "Indicates the status of the emoji. True if the toggle awarded the emoji, and false if the toggle removed the emoji.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Tree",
- "description": null,
- "fields": [
- {
- "name": "blobs",
- "description": "Blobs of the tree.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "BlobConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastCommit",
- "description": "Last commit for the tree.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Commit",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "submodules",
- "description": "Sub-modules of the tree.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SubmoduleConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "trees",
- "description": "Trees of the tree.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TreeEntryConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TreeEntry",
- "description": "Represents a directory",
- "fields": [
- {
- "name": "flatPath",
- "description": "Flat path of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Path of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sha",
- "description": "Last commit SHA for the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of tree entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "EntryType",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webPath",
- "description": "Web path for the tree entry (directory).",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL for the tree entry (directory).",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Entry",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TreeEntryConnection",
- "description": "The connection type for TreeEntry.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TreeEntryEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TreeEntry",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TreeEntryEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TreeEntry",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "TypeEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "personal",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "UntrustedRegexp",
- "description": "A regexp containing patterns sourced from user input",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateAlertStatusInput",
- "description": "Autogenerated input type of UpdateAlertStatus",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the alert to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the alert to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "status",
- "description": "The status to set the alert.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "AlertManagementStatus",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateAlertStatusPayload",
- "description": "Autogenerated return type of UpdateAlertStatus",
- "fields": [
- {
- "name": "alert",
- "description": "The alert after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementAlert",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue created after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todo",
- "description": "The to-do item after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Todo",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateBoardEpicUserPreferencesInput",
- "description": "Autogenerated input type of UpdateBoardEpicUserPreferences",
- "fields": null,
- "inputFields": [
- {
- "name": "boardId",
- "description": "The board global ID.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "BoardID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "epicId",
- "description": "ID of an epic to set preferences for.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "EpicID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "collapsed",
- "description": "Whether the epic should be collapsed in the board.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateBoardEpicUserPreferencesPayload",
- "description": "Autogenerated return type of UpdateBoardEpicUserPreferences",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epicUserPreferences",
- "description": "User preferences for the epic in the board after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardEpicUserPreferences",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateBoardInput",
- "description": "Autogenerated input type of UpdateBoard",
- "fields": null,
- "inputFields": [
- {
- "name": "name",
- "description": "The board name.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "hideBacklogList",
- "description": "Whether or not backlog list is hidden.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "hideClosedList",
- "description": "Whether or not closed list is hidden.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "The board global ID.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "BoardID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "assigneeId",
- "description": "The ID of user to be assigned to the board.",
- "type": {
- "kind": "SCALAR",
- "name": "UserID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "milestoneId",
- "description": "The ID of milestone to be assigned to the board.",
- "type": {
- "kind": "SCALAR",
- "name": "MilestoneID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iterationId",
- "description": "The ID of iteration to be assigned to the board.",
- "type": {
- "kind": "SCALAR",
- "name": "IterationID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "weight",
- "description": "The weight value to be assigned to the board.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labels",
- "description": "Labels of the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "labelIds",
- "description": "The IDs of labels to be added to the board.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "LabelID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateBoardListInput",
- "description": "Autogenerated input type of UpdateBoardList",
- "fields": null,
- "inputFields": [
- {
- "name": "listId",
- "description": "Global ID of the list.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ListID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "position",
- "description": "Position of list within the board.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "collapsed",
- "description": "Indicates if list is collapsed for this user.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateBoardListPayload",
- "description": "Autogenerated return type of UpdateBoardList",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "list",
- "description": "Mutated list.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardList",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateBoardPayload",
- "description": "Autogenerated return type of UpdateBoard",
- "fields": [
- {
- "name": "board",
- "description": "The board after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Board",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateComplianceFrameworkInput",
- "description": "Autogenerated input type of UpdateComplianceFramework",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the compliance framework to update.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ComplianceManagementFrameworkID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "params",
- "description": "Parameters to update the compliance framework with.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "ComplianceFrameworkInput",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateComplianceFrameworkPayload",
- "description": "Autogenerated return type of UpdateComplianceFramework",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "complianceFramework",
- "description": "The compliance framework after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ComplianceFramework",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateContainerExpirationPolicyInput",
- "description": "Autogenerated input type of UpdateContainerExpirationPolicy",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project path where the container expiration policy is located.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "enabled",
- "description": "Indicates whether this container expiration policy is enabled.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "cadence",
- "description": "This container expiration policy schedule.",
- "type": {
- "kind": "ENUM",
- "name": "ContainerExpirationPolicyCadenceEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "olderThan",
- "description": "Tags older that this will expire.",
- "type": {
- "kind": "ENUM",
- "name": "ContainerExpirationPolicyOlderThanEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "keepN",
- "description": "Number of tags to retain.",
- "type": {
- "kind": "ENUM",
- "name": "ContainerExpirationPolicyKeepEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "nameRegex",
- "description": "Tags with names matching this regex pattern will expire.",
- "type": {
- "kind": "SCALAR",
- "name": "UntrustedRegexp",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "nameRegexKeep",
- "description": "Tags with names matching this regex pattern will be preserved.",
- "type": {
- "kind": "SCALAR",
- "name": "UntrustedRegexp",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateContainerExpirationPolicyPayload",
- "description": "Autogenerated return type of UpdateContainerExpirationPolicy",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "containerExpirationPolicy",
- "description": "The container expiration policy after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ContainerExpirationPolicy",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateDiffImagePositionInput",
- "description": null,
- "fields": null,
- "inputFields": [
- {
- "name": "x",
- "description": "X position of the note.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "y",
- "description": "Y position of the note.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "width",
- "description": "Total width of the image.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "height",
- "description": "Total height of the image.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateEpicInput",
- "description": "Autogenerated input type of UpdateEpic",
- "fields": null,
- "inputFields": [
- {
- "name": "iid",
- "description": "The IID of the epic to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "groupPath",
- "description": "The group the epic to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "The title of the epic.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "The description of the epic.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "confidential",
- "description": "Indicates if the epic is confidential.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "startDateFixed",
- "description": "The start date of the epic.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "dueDateFixed",
- "description": "The end date of the epic.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "startDateIsFixed",
- "description": "Indicates start date should be sourced from start_date_fixed field not the issue milestones.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "dueDateIsFixed",
- "description": "Indicates end date should be sourced from due_date_fixed field not the issue milestones.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "addLabelIds",
- "description": "The IDs of labels to be added to the epic.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "removeLabelIds",
- "description": "The IDs of labels to be removed from the epic.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "stateEvent",
- "description": "State event for the epic.",
- "type": {
- "kind": "ENUM",
- "name": "EpicStateEvent",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateEpicPayload",
- "description": "Autogenerated return type of UpdateEpic",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epic",
- "description": "The epic after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateImageDiffNoteInput",
- "description": "Autogenerated input type of UpdateImageDiffNote",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the note to update.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "NoteID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "body",
- "description": "Content of the note.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "position",
- "description": "The position of this note on a diff.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateDiffImagePositionInput",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateImageDiffNotePayload",
- "description": "Autogenerated return type of UpdateImageDiffNote",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "note",
- "description": "The note after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Note",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateIssueInput",
- "description": "Autogenerated input type of UpdateIssue",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the issue to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "Description of the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "dueDate",
- "description": "Due date of the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "confidential",
- "description": "Indicates the issue is confidential.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "locked",
- "description": "Indicates discussion is locked on the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "Title of the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "milestoneId",
- "description": "The ID of the milestone to assign to the issue. On update milestone will be removed if set to null.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "addLabelIds",
- "description": "The IDs of labels to be added to the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "removeLabelIds",
- "description": "The IDs of labels to be removed from the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "stateEvent",
- "description": "Close or reopen an issue.",
- "type": {
- "kind": "ENUM",
- "name": "IssueStateEvent",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "healthStatus",
- "description": "The desired health status.",
- "type": {
- "kind": "ENUM",
- "name": "HealthStatus",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "weight",
- "description": "The weight of the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "epicId",
- "description": "The ID of the parent epic. NULL when removing the association.",
- "type": {
- "kind": "SCALAR",
- "name": "EpicID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateIssuePayload",
- "description": "Autogenerated return type of UpdateIssue",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateIterationInput",
- "description": "Autogenerated input type of UpdateIteration",
- "fields": null,
- "inputFields": [
- {
- "name": "groupPath",
- "description": "Group of the iteration.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "Global ID of the iteration.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "Title of the iteration.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "Description of the iteration.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "startDate",
- "description": "Start date of the iteration.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "dueDate",
- "description": "End date of the iteration.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateIterationPayload",
- "description": "Autogenerated return type of UpdateIteration",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iteration",
- "description": "Updated iteration.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Iteration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateNamespacePackageSettingsInput",
- "description": "Autogenerated input type of UpdateNamespacePackageSettings",
- "fields": null,
- "inputFields": [
- {
- "name": "namespacePath",
- "description": "The namespace path where the namespace package setting is located.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "mavenDuplicatesAllowed",
- "description": "Indicates whether duplicate Maven packages are allowed for this namespace.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "mavenDuplicateExceptionRegex",
- "description": "When maven_duplicates_allowed is false, you can publish duplicate packages with names that match this regex. Otherwise, this setting has no effect.",
- "type": {
- "kind": "SCALAR",
- "name": "UntrustedRegexp",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateNamespacePackageSettingsPayload",
- "description": "Autogenerated return type of UpdateNamespacePackageSettings",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "packageSettings",
- "description": "The namespace package setting after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PackageSettings",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateNoteInput",
- "description": "Autogenerated input type of UpdateNote",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the note to update.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "NoteID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "body",
- "description": "Content of the note.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "confidential",
- "description": "The confidentiality flag of a note. Default is false.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateNotePayload",
- "description": "Autogenerated return type of UpdateNote",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "note",
- "description": "The note after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Note",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateRequirementInput",
- "description": "Autogenerated input type of UpdateRequirement",
- "fields": null,
- "inputFields": [
- {
- "name": "title",
- "description": "Title of the requirement.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "Description of the requirement.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "projectPath",
- "description": "Full project path the requirement is associated with.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "State of the requirement.",
- "type": {
- "kind": "ENUM",
- "name": "RequirementState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the requirement to update.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "lastTestReportState",
- "description": "Creates a test report for the requirement with the given state.",
- "type": {
- "kind": "ENUM",
- "name": "TestReportState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateRequirementPayload",
- "description": "Autogenerated return type of UpdateRequirement",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "requirement",
- "description": "Requirement after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Requirement",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateSnippetInput",
- "description": "Autogenerated input type of UpdateSnippet",
- "fields": null,
- "inputFields": [
- {
- "name": "captchaResponse",
- "description": "A valid CAPTCHA response value obtained by using the provided captchaSiteKey with a CAPTCHA API to present a challenge to be solved on the client. Required to resubmit if the previous operation returned \"NeedsCaptchaResponse: true\".",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "spamLogId",
- "description": "The spam log ID which must be passed along with a valid CAPTCHA response for the operation to be completed. Required to resubmit if the previous operation returned \"NeedsCaptchaResponse: true\".",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "The global ID of the snippet to update.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "SnippetID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "Title of the snippet.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "Description of the snippet.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "visibilityLevel",
- "description": "The visibility level of the snippet.",
- "type": {
- "kind": "ENUM",
- "name": "VisibilityLevelsEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "blobActions",
- "description": "Actions to perform over the snippet repository and blobs.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "SnippetBlobActionInputType",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateSnippetPayload",
- "description": "Autogenerated return type of UpdateSnippet",
- "fields": [
- {
- "name": "captchaSiteKey",
- "description": "The CAPTCHA site key which must be used to render a challenge for the user to solve to obtain a valid captchaResponse value. Included only when an operation was not completed because \"NeedsCaptchaResponse\" is true.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "needsCaptchaResponse",
- "description": "Indicates whether the operation was detected as possible spam and not completed. If CAPTCHA is enabled, the request must be resubmitted with a valid CAPTCHA response and spam_log_id included for the operation to be completed. Included only when an operation was not completed because \"NeedsCaptchaResponse\" is true.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "snippet",
- "description": "The snippet after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Snippet",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "spam",
- "description": "Indicates whether the operation was detected as definite spam. There is no option to resubmit the request with a CAPTCHA response.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "spamLogId",
- "description": "The spam log ID which must be passed along with a valid CAPTCHA response for an operation to be completed. Included only when an operation was not completed because \"NeedsCaptchaResponse\" is true.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "Upload",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "User",
- "description": null,
- "fields": [
- {
- "name": "assignedMergeRequests",
- "description": "Merge Requests assigned to the user.",
- "args": [
- {
- "name": "iids",
- "description": "Array of IIDs of merge requests, for example `[1, 2]`.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "sourceBranches",
- "description": "Array of source branch names. All resolved merge requests will have one of these branches as their source.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "targetBranches",
- "description": "Array of target branch names. All resolved merge requests will have one of these branches as their target.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "A merge request state. If provided, all resolved merge requests will have this state.",
- "type": {
- "kind": "ENUM",
- "name": "MergeRequestState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labels",
- "description": "Array of label names. All resolved merge requests will have all of these labels.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "mergedAfter",
- "description": "Merge requests merged after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "mergedBefore",
- "description": "Merge requests merged before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Title of the milestone.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort merge requests by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "MergeRequestSort",
- "ofType": null
- },
- "defaultValue": "created_desc"
- },
- {
- "name": "projectPath",
- "description": "The full-path of the project the authored merge requests should be in. Incompatible with projectId.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "projectId",
- "description": "The global ID of the project the authored merge requests should be in. Incompatible with projectPath.",
- "type": {
- "kind": "SCALAR",
- "name": "ProjectID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Username of the author.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "reviewerUsername",
- "description": "Username of the reviewer.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "authoredMergeRequests",
- "description": "Merge Requests authored by the user.",
- "args": [
- {
- "name": "iids",
- "description": "Array of IIDs of merge requests, for example `[1, 2]`.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "sourceBranches",
- "description": "Array of source branch names. All resolved merge requests will have one of these branches as their source.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "targetBranches",
- "description": "Array of target branch names. All resolved merge requests will have one of these branches as their target.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "A merge request state. If provided, all resolved merge requests will have this state.",
- "type": {
- "kind": "ENUM",
- "name": "MergeRequestState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labels",
- "description": "Array of label names. All resolved merge requests will have all of these labels.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "mergedAfter",
- "description": "Merge requests merged after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "mergedBefore",
- "description": "Merge requests merged before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Title of the milestone.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort merge requests by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "MergeRequestSort",
- "ofType": null
- },
- "defaultValue": "created_desc"
- },
- {
- "name": "projectPath",
- "description": "The full-path of the project the authored merge requests should be in. Incompatible with projectId.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "projectId",
- "description": "The global ID of the project the authored merge requests should be in. Incompatible with projectPath.",
- "type": {
- "kind": "SCALAR",
- "name": "ProjectID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsername",
- "description": "Username of the assignee.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "reviewerUsername",
- "description": "Username of the reviewer.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "avatarUrl",
- "description": "URL of the user's avatar.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "bot",
- "description": "Indicates if the user is a bot.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "email",
- "description": "User email. Deprecated in 13.7: Use public_email.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": true,
- "deprecationReason": "Use public_email. Deprecated in 13.7."
- },
- {
- "name": "groupCount",
- "description": "Group count for the user. Available only when feature flag `user_group_counts` is enabled.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "groupMemberships",
- "description": "Group memberships of the user.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "GroupMemberConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the user.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "location",
- "description": "The location of the user.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Human-readable name of the user.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "projectMemberships",
- "description": "Project memberships of the user.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ProjectMemberConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "publicEmail",
- "description": "User's public email.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "reviewRequestedMergeRequests",
- "description": "Merge Requests assigned to the user for review.",
- "args": [
- {
- "name": "iids",
- "description": "Array of IIDs of merge requests, for example `[1, 2]`.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "sourceBranches",
- "description": "Array of source branch names. All resolved merge requests will have one of these branches as their source.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "targetBranches",
- "description": "Array of target branch names. All resolved merge requests will have one of these branches as their target.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "A merge request state. If provided, all resolved merge requests will have this state.",
- "type": {
- "kind": "ENUM",
- "name": "MergeRequestState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labels",
- "description": "Array of label names. All resolved merge requests will have all of these labels.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "mergedAfter",
- "description": "Merge requests merged after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "mergedBefore",
- "description": "Merge requests merged before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Title of the milestone.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort merge requests by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "MergeRequestSort",
- "ofType": null
- },
- "defaultValue": "created_desc"
- },
- {
- "name": "projectPath",
- "description": "The full-path of the project the authored merge requests should be in. Incompatible with projectId.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "projectId",
- "description": "The global ID of the project the authored merge requests should be in. Incompatible with projectPath.",
- "type": {
- "kind": "SCALAR",
- "name": "ProjectID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Username of the author.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsername",
- "description": "Username of the assignee.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "snippets",
- "description": "Snippets authored by the user.",
- "args": [
- {
- "name": "ids",
- "description": "Array of global snippet ids, e.g., \"gid://gitlab/ProjectSnippet/1\".",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "SnippetID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "visibility",
- "description": "The visibility of the snippet.",
- "type": {
- "kind": "ENUM",
- "name": "VisibilityScopesEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "type",
- "description": "The type of snippet.",
- "type": {
- "kind": "ENUM",
- "name": "TypeEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SnippetConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "starredProjects",
- "description": "Projects starred by the user.",
- "args": [
- {
- "name": "search",
- "description": "Search query.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ProjectConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "State of the user.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "UserState",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "status",
- "description": "User status.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UserStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todos",
- "description": "To-do items of the user.",
- "args": [
- {
- "name": "action",
- "description": "The action to be filtered.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "TodoActionEnum",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "authorId",
- "description": "The ID of an author.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "projectId",
- "description": "The ID of a project.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "groupId",
- "description": "The ID of a group.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "The state of the todo.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "TodoStateEnum",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "type",
- "description": "The type of the todo.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "TodoTargetEnum",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TodoConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "UserPermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "username",
- "description": "Username of the user. Unique within this instance of GitLab.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webPath",
- "description": "Web path of the user.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL of the user.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UserConnection",
- "description": "The connection type for User.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "UserEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UserEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "UserID",
- "description": "Identifier of User.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UserPermissions",
- "description": null,
- "fields": [
- {
- "name": "createSnippet",
- "description": "Indicates the user can perform `create_snippet` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "UserState",
- "description": "Possible states of a user",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "active",
- "description": "The user is active and is able to use the system",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "blocked",
- "description": "The user has been blocked and is prevented from using the system",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "deactivated",
- "description": "The user is no longer active and is unable to use the system",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UserStatus",
- "description": null,
- "fields": [
- {
- "name": "availability",
- "description": "User availability status.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "AvailabilityEnum",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "emoji",
- "description": "String representation of emoji.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "message",
- "description": "User status message.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "messageHtml",
- "description": "HTML of the user status message",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "VisibilityLevelsEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "private",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "internal",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "public",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "VisibilityScopesEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "private",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "internal",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "public",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDay",
- "description": "Represents the count of vulnerabilities by severity on a particular day. This data is retained for 365 days",
- "fields": [
- {
- "name": "critical",
- "description": "Total number of vulnerabilities on a particular day with critical severity",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "date",
- "description": "Date for the count.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "high",
- "description": "Total number of vulnerabilities on a particular day with high severity",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "info",
- "description": "Total number of vulnerabilities on a particular day with info severity",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "low",
- "description": "Total number of vulnerabilities on a particular day with low severity",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "medium",
- "description": "Total number of vulnerabilities on a particular day with medium severity",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "total",
- "description": "Total number of vulnerabilities on a particular day.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "unknown",
- "description": "Total number of vulnerabilities on a particular day with unknown severity",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayAndSeverity",
- "description": "Represents the number of vulnerabilities for a particular severity on a particular day. This data is retained for 365 days",
- "fields": [
- {
- "name": "count",
- "description": "Number of vulnerabilities.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "day",
- "description": "Date for the count.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "severity",
- "description": "Severity of the counted vulnerabilities.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "VulnerabilitySeverity",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayAndSeverityConnection",
- "description": "The connection type for VulnerabilitiesCountByDayAndSeverity.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayAndSeverityEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayAndSeverity",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayAndSeverityEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayAndSeverity",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayConnection",
- "description": "The connection type for VulnerabilitiesCountByDay.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDay",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDay",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "VulnerabilitiesExternalIssueLinkID",
- "description": "Identifier of Vulnerabilities::ExternalIssueLink.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Vulnerability",
- "description": "Represents a vulnerability",
- "fields": [
- {
- "name": "confirmedAt",
- "description": "Timestamp of when the vulnerability state was changed to confirmed.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "confirmedBy",
- "description": "The user that confirmed the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "details",
- "description": "Details of the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "UNION",
- "name": "VulnerabilityDetail",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "detectedAt",
- "description": "Timestamp of when the vulnerability was first detected.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussions",
- "description": "All discussions on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiscussionConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dismissedAt",
- "description": "Timestamp of when the vulnerability state was changed to dismissed.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dismissedBy",
- "description": "The user that dismissed the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "externalIssueLinks",
- "description": "List of external issue links related to the vulnerability.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilityExternalIssueLinkConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hasSolutions",
- "description": "Indicates whether there is a solution available for this vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "GraphQL ID of the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "identifiers",
- "description": "Identifiers of the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilityIdentifier",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueLinks",
- "description": "List of issue links related to the vulnerability.",
- "args": [
- {
- "name": "linkType",
- "description": "Filter issue links by link type.",
- "type": {
- "kind": "ENUM",
- "name": "VulnerabilityIssueLinkType",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilityIssueLinkConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "location",
- "description": "Location metadata for the vulnerability. Its fields depend on the type of security scan that found the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "UNION",
- "name": "VulnerabilityLocation",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequest",
- "description": "Merge request that fixes the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notes",
- "description": "All notes on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NoteConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "primaryIdentifier",
- "description": "Primary identifier of the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityIdentifier",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "The project on which the vulnerability was found.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "reportType",
- "description": "Type of the security report that found the vulnerability (SAST, DEPENDENCY_SCANNING, CONTAINER_SCANNING, DAST, SECRET_DETECTION, COVERAGE_FUZZING, API_FUZZING)",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "VulnerabilityReportType",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolvedAt",
- "description": "Timestamp of when the vulnerability state was changed to resolved.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolvedBy",
- "description": "The user that resolved the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolvedOnDefaultBranch",
- "description": "Indicates whether the vulnerability is fixed on the default branch or not.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "scanner",
- "description": "Scanner metadata for the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityScanner",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "severity",
- "description": "Severity of the vulnerability (INFO, UNKNOWN, LOW, MEDIUM, HIGH, CRITICAL)",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "VulnerabilitySeverity",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "State of the vulnerability (DETECTED, CONFIRMED, RESOLVED, DISMISSED)",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "VulnerabilityState",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userNotesCount",
- "description": "Number of user notes attached to the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilityPermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilityPath",
- "description": "URL to the vulnerability's details page.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Noteable",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "VulnerabilityConfirmInput",
- "description": "Autogenerated input type of VulnerabilityConfirm",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the vulnerability to be confirmed.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "VulnerabilityID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityConfirmPayload",
- "description": "Autogenerated return type of VulnerabilityConfirm",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerability",
- "description": "The vulnerability after state change.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Vulnerability",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityConnection",
- "description": "The connection type for Vulnerability.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilityEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Vulnerability",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "UNION",
- "name": "VulnerabilityDetail",
- "description": "Represents a vulnerability detail field. The fields with data will depend on the vulnerability detail type",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": [
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailBase",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailBoolean",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailCode",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailCommit",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailDiff",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailFileLocation",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailInt",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailList",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailMarkdown",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailModuleLocation",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailTable",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailText",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailUrl",
- "ofType": null
- }
- ]
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailBase",
- "description": "Represents the vulnerability details base",
- "fields": [
- {
- "name": "description",
- "description": "Description of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fieldName",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailBoolean",
- "description": "Represents the vulnerability details boolean value",
- "fields": [
- {
- "name": "description",
- "description": "Description of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fieldName",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "value",
- "description": "Value of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailCode",
- "description": "Represents the vulnerability details code field",
- "fields": [
- {
- "name": "description",
- "description": "Description of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fieldName",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lang",
- "description": "Language of the code.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "value",
- "description": "Source code.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailCommit",
- "description": "Represents the vulnerability details commit field",
- "fields": [
- {
- "name": "description",
- "description": "Description of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fieldName",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "value",
- "description": "The commit SHA value.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailDiff",
- "description": "Represents the vulnerability details diff field",
- "fields": [
- {
- "name": "after",
- "description": "Value of the field after the change.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "before",
- "description": "Value of the field before the change.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fieldName",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailFileLocation",
- "description": "Represents the vulnerability details location within a file in the project",
- "fields": [
- {
- "name": "description",
- "description": "Description of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fieldName",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fileName",
- "description": "File name.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lineEnd",
- "description": "End line number of the file location.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lineStart",
- "description": "Start line number of the file location.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailInt",
- "description": "Represents the vulnerability details integer value",
- "fields": [
- {
- "name": "description",
- "description": "Description of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fieldName",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "value",
- "description": "Value of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailList",
- "description": "Represents the vulnerability details list value",
- "fields": [
- {
- "name": "description",
- "description": "Description of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fieldName",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "items",
- "description": "List of details.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "UNION",
- "name": "VulnerabilityDetail",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailMarkdown",
- "description": "Represents the vulnerability details Markdown field",
- "fields": [
- {
- "name": "description",
- "description": "Description of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fieldName",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "value",
- "description": "Value of the Markdown field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailModuleLocation",
- "description": "Represents the vulnerability details location within a file in the project",
- "fields": [
- {
- "name": "description",
- "description": "Description of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fieldName",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "moduleName",
- "description": "Module name.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "offset",
- "description": "Offset of the module location.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailTable",
- "description": "Represents the vulnerability details table value",
- "fields": [
- {
- "name": "description",
- "description": "Description of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fieldName",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "headers",
- "description": "Table headers.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "UNION",
- "name": "VulnerabilityDetail",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "rows",
- "description": "Table rows.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "UNION",
- "name": "VulnerabilityDetail",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailText",
- "description": "Represents the vulnerability details text field",
- "fields": [
- {
- "name": "description",
- "description": "Description of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fieldName",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "value",
- "description": "Value of the text field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailUrl",
- "description": "Represents the vulnerability details URL field",
- "fields": [
- {
- "name": "description",
- "description": "Description of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fieldName",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "href",
- "description": "Href of the URL.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "text",
- "description": "Text of the URL.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "VulnerabilityDismissInput",
- "description": "Autogenerated input type of VulnerabilityDismiss",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the vulnerability to be dismissed.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "VulnerabilityID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "comment",
- "description": "Comment why vulnerability should be dismissed.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "dismissalReason",
- "description": "Reason why vulnerability should be dismissed.",
- "type": {
- "kind": "ENUM",
- "name": "VulnerabilityDismissalReason",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDismissPayload",
- "description": "Autogenerated return type of VulnerabilityDismiss",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerability",
- "description": "The vulnerability after dismissal.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Vulnerability",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "VulnerabilityDismissalReason",
- "description": "The dismissal reason of the Vulnerability",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "ACCEPTABLE_RISK",
- "description": "The likelihood of the Vulnerability occurring and its impact are deemed acceptable",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FALSE_POSITIVE",
- "description": "The Vulnerability was incorrectly identified as being present",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MITIGATING_CONTROL",
- "description": "There is a mitigating control that eliminates the Vulnerability or makes its risk acceptable",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "USED_IN_TESTS",
- "description": "The Vulnerability is used in tests and does not pose an actual risk",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "NOT_APPLICABLE",
- "description": "Other reasons for dismissal",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Vulnerability",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityExternalIssueLink",
- "description": "Represents an external issue link of a vulnerability",
- "fields": [
- {
- "name": "externalIssue",
- "description": "The external issue attached to the issue link.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ExternalIssue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "GraphQL ID of the external issue link.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "VulnerabilitiesExternalIssueLinkID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "linkType",
- "description": "Type of the external issue link.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityExternalIssueLinkType",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityExternalIssueLinkConnection",
- "description": "The connection type for VulnerabilityExternalIssueLink.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilityExternalIssueLinkEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilityExternalIssueLink",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "VulnerabilityExternalIssueLinkCreateInput",
- "description": "Autogenerated input type of VulnerabilityExternalIssueLinkCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the vulnerability.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "VulnerabilityID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "linkType",
- "description": "Type of the external issue link.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityExternalIssueLinkType",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "externalTracker",
- "description": "External tracker type of the external issue link.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityExternalIssueLinkExternalTracker",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityExternalIssueLinkCreatePayload",
- "description": "Autogenerated return type of VulnerabilityExternalIssueLinkCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "externalIssueLink",
- "description": "The created external issue link.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityExternalIssueLink",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "VulnerabilityExternalIssueLinkDestroyInput",
- "description": "Autogenerated input type of VulnerabilityExternalIssueLinkDestroy",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the vulnerability external issue link.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "VulnerabilitiesExternalIssueLinkID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityExternalIssueLinkDestroyPayload",
- "description": "Autogenerated return type of VulnerabilityExternalIssueLinkDestroy",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityExternalIssueLinkEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityExternalIssueLink",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "VulnerabilityExternalIssueLinkExternalTracker",
- "description": "The external tracker of the external issue link related to a vulnerability",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "JIRA",
- "description": "Jira external tracker",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "VulnerabilityExternalIssueLinkType",
- "description": "The type of the external issue link related to a vulnerability",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "CREATED",
- "description": "Created link type",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "VulnerabilityGrade",
- "description": "The grade of the vulnerable project",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "A",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "B",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "C",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "D",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "F",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "VulnerabilityID",
- "description": "Identifier of Vulnerability.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityIdentifier",
- "description": "Represents a vulnerability identifier",
- "fields": [
- {
- "name": "externalId",
- "description": "External ID of the vulnerability identifier.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "externalType",
- "description": "External type of the vulnerability identifier.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the vulnerability identifier.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "url",
- "description": "URL of the vulnerability identifier.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityIssueLink",
- "description": "Represents an issue link of a vulnerability",
- "fields": [
- {
- "name": "id",
- "description": "GraphQL ID of the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue attached to issue link.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "linkType",
- "description": "Type of the issue link.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityIssueLinkType",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityIssueLinkConnection",
- "description": "The connection type for VulnerabilityIssueLink.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilityIssueLinkEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilityIssueLink",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityIssueLinkEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityIssueLink",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "VulnerabilityIssueLinkType",
- "description": "The type of the issue link related to a vulnerability",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "RELATED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "UNION",
- "name": "VulnerabilityLocation",
- "description": "Represents a vulnerability location. The fields with data will depend on the vulnerability report type",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": [
- {
- "kind": "OBJECT",
- "name": "VulnerabilityLocationContainerScanning",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityLocationCoverageFuzzing",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityLocationDast",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityLocationDependencyScanning",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityLocationSast",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityLocationSecretDetection",
- "ofType": null
- }
- ]
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityLocationContainerScanning",
- "description": "Represents the location of a vulnerability found by a container security scan",
- "fields": [
- {
- "name": "dependency",
- "description": "Dependency containing the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerableDependency",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "image",
- "description": "Name of the vulnerable container image.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "operatingSystem",
- "description": "Operating system that runs on the vulnerable container image.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityLocationCoverageFuzzing",
- "description": "Represents the location of a vulnerability found by a Coverage Fuzzing scan",
- "fields": [
- {
- "name": "blobPath",
- "description": "Blob path to the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "endLine",
- "description": "Number of the last relevant line in the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "file",
- "description": "Path to the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startLine",
- "description": "Number of the first relevant line in the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerableClass",
- "description": "Class containing the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerableMethod",
- "description": "Method containing the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityLocationDast",
- "description": "Represents the location of a vulnerability found by a DAST scan",
- "fields": [
- {
- "name": "hostname",
- "description": "Domain name of the vulnerable request.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "param",
- "description": "Query parameter for the URL on which the vulnerability occurred.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "URL path and query string of the vulnerable request.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "requestMethod",
- "description": "HTTP method of the vulnerable request.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityLocationDependencyScanning",
- "description": "Represents the location of a vulnerability found by a dependency security scan",
- "fields": [
- {
- "name": "blobPath",
- "description": "Blob path to the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dependency",
- "description": "Dependency containing the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerableDependency",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "file",
- "description": "Path to the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityLocationSast",
- "description": "Represents the location of a vulnerability found by a SAST scan",
- "fields": [
- {
- "name": "blobPath",
- "description": "Blob path to the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "endLine",
- "description": "Number of the last relevant line in the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "file",
- "description": "Path to the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startLine",
- "description": "Number of the first relevant line in the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerableClass",
- "description": "Class containing the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerableMethod",
- "description": "Method containing the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityLocationSecretDetection",
- "description": "Represents the location of a vulnerability found by a secret detection scan",
- "fields": [
- {
- "name": "blobPath",
- "description": "Blob path to the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "endLine",
- "description": "Number of the last relevant line in the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "file",
- "description": "Path to the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startLine",
- "description": "Number of the first relevant line in the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerableClass",
- "description": "Class containing the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerableMethod",
- "description": "Method containing the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityPermissions",
- "description": "Check permissions for the current user on a vulnerability",
- "fields": [
- {
- "name": "adminVulnerability",
- "description": "Indicates the user can perform `admin_vulnerability` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "adminVulnerabilityExternalIssueLink",
- "description": "Indicates the user can perform `admin_vulnerability_external_issue_link` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "adminVulnerabilityIssueLink",
- "description": "Indicates the user can perform `admin_vulnerability_issue_link` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createVulnerability",
- "description": "Indicates the user can perform `create_vulnerability` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createVulnerabilityExport",
- "description": "Indicates the user can perform `create_vulnerability_export` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createVulnerabilityFeedback",
- "description": "Indicates the user can perform `create_vulnerability_feedback` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyVulnerabilityFeedback",
- "description": "Indicates the user can perform `destroy_vulnerability_feedback` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readVulnerabilityFeedback",
- "description": "Indicates the user can perform `read_vulnerability_feedback` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateVulnerabilityFeedback",
- "description": "Indicates the user can perform `update_vulnerability_feedback` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "VulnerabilityReportType",
- "description": "The type of the security scan that found the vulnerability",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "SAST",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DEPENDENCY_SCANNING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CONTAINER_SCANNING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DAST",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SECRET_DETECTION",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "COVERAGE_FUZZING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "API_FUZZING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "VulnerabilityResolveInput",
- "description": "Autogenerated input type of VulnerabilityResolve",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the vulnerability to be resolved.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "VulnerabilityID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityResolvePayload",
- "description": "Autogenerated return type of VulnerabilityResolve",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerability",
- "description": "The vulnerability after state change.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Vulnerability",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "VulnerabilityRevertToDetectedInput",
- "description": "Autogenerated input type of VulnerabilityRevertToDetected",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the vulnerability to be reverted.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "VulnerabilityID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityRevertToDetectedPayload",
- "description": "Autogenerated return type of VulnerabilityRevertToDetected",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerability",
- "description": "The vulnerability after revert.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Vulnerability",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityScanner",
- "description": "Represents a vulnerability scanner",
- "fields": [
- {
- "name": "externalId",
- "description": "External ID of the vulnerability scanner.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the vulnerability scanner.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "reportType",
- "description": "Type of the vulnerability report.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "VulnerabilityReportType",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vendor",
- "description": "Vendor of the vulnerability scanner.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityScannerConnection",
- "description": "The connection type for VulnerabilityScanner.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilityScannerEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilityScanner",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityScannerEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityScanner",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilitySeveritiesCount",
- "description": "Represents vulnerability counts by severity",
- "fields": [
- {
- "name": "critical",
- "description": "Number of vulnerabilities of CRITICAL severity of the project",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "high",
- "description": "Number of vulnerabilities of HIGH severity of the project",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "info",
- "description": "Number of vulnerabilities of INFO severity of the project",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "low",
- "description": "Number of vulnerabilities of LOW severity of the project",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "medium",
- "description": "Number of vulnerabilities of MEDIUM severity of the project",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "unknown",
- "description": "Number of vulnerabilities of UNKNOWN severity of the project",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "VulnerabilitySeverity",
- "description": "The severity of the vulnerability",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "INFO",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UNKNOWN",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LOW",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MEDIUM",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "HIGH",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CRITICAL",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "VulnerabilitySort",
- "description": "Vulnerability sort values",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "severity_desc",
- "description": "Severity in descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "severity_asc",
- "description": "Severity in ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title_desc",
- "description": "Title in descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title_asc",
- "description": "Title in ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "detected_desc",
- "description": "Detection timestamp in descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "detected_asc",
- "description": "Detection timestamp in ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "report_type_desc",
- "description": "Report Type in descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "report_type_asc",
- "description": "Report Type in ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state_desc",
- "description": "State in descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state_asc",
- "description": "State in ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "VulnerabilityState",
- "description": "The state of the vulnerability",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "DETECTED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CONFIRMED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "RESOLVED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DISMISSED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerableDependency",
- "description": "Represents a vulnerable dependency. Used in vulnerability location data",
- "fields": [
- {
- "name": "package",
- "description": "The package associated with the vulnerable dependency.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerablePackage",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "version",
- "description": "The version of the vulnerable dependency.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerablePackage",
- "description": "Represents a vulnerable package. Used in vulnerability dependency data",
- "fields": [
- {
- "name": "name",
- "description": "The name of the vulnerable package.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerableProjectsByGrade",
- "description": "Represents vulnerability letter grades with associated projects",
- "fields": [
- {
- "name": "count",
- "description": "Number of projects within this grade.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "grade",
- "description": "Grade based on the highest severity vulnerability present.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityGrade",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "projects",
- "description": "Projects within this grade.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ProjectConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "__Directive",
- "description": "A Directive provides a way to describe alternate runtime execution and type validation behavior in a GraphQL document.\n\nIn some cases, you need to provide options to alter GraphQL's execution behavior in ways field arguments will not suffice, such as conditionally including or skipping a field. Directives provide this by describing additional information to the executor.",
- "fields": [
- {
- "name": "args",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "__InputValue",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "locations",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "__DirectiveLocation",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "onField",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": true,
- "deprecationReason": "Use `locations`."
- },
- {
- "name": "onFragment",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": true,
- "deprecationReason": "Use `locations`."
- },
- {
- "name": "onOperation",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": true,
- "deprecationReason": "Use `locations`."
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "__DirectiveLocation",
- "description": "A Directive can be adjacent to many parts of the GraphQL language, a __DirectiveLocation describes one such possible adjacencies.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "QUERY",
- "description": "Location adjacent to a query operation.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MUTATION",
- "description": "Location adjacent to a mutation operation.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SUBSCRIPTION",
- "description": "Location adjacent to a subscription operation.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FIELD",
- "description": "Location adjacent to a field.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FRAGMENT_DEFINITION",
- "description": "Location adjacent to a fragment definition.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FRAGMENT_SPREAD",
- "description": "Location adjacent to a fragment spread.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "INLINE_FRAGMENT",
- "description": "Location adjacent to an inline fragment.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SCHEMA",
- "description": "Location adjacent to a schema definition.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SCALAR",
- "description": "Location adjacent to a scalar definition.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "OBJECT",
- "description": "Location adjacent to an object type definition.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FIELD_DEFINITION",
- "description": "Location adjacent to a field definition.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ARGUMENT_DEFINITION",
- "description": "Location adjacent to an argument definition.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "INTERFACE",
- "description": "Location adjacent to an interface definition.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UNION",
- "description": "Location adjacent to a union definition.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ENUM",
- "description": "Location adjacent to an enum definition.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ENUM_VALUE",
- "description": "Location adjacent to an enum value definition.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "INPUT_OBJECT",
- "description": "Location adjacent to an input object type definition.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "INPUT_FIELD_DEFINITION",
- "description": "Location adjacent to an input object field definition.",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "__EnumValue",
- "description": "One possible value for a given Enum. Enum values are unique values, not a placeholder for a string or numeric value. However an Enum value is returned in a JSON response as a string.",
- "fields": [
- {
- "name": "deprecationReason",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "isDeprecated",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "__Field",
- "description": "Object and Interface types are described by a list of Fields, each of which has a name, potentially a list of arguments, and a return type.",
- "fields": [
- {
- "name": "args",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "__InputValue",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "deprecationReason",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "isDeprecated",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "__Type",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "__InputValue",
- "description": "Arguments provided to Fields or Directives and the input fields of an InputObject are represented as Input Values which describe their type and optionally a default value.",
- "fields": [
- {
- "name": "defaultValue",
- "description": "A GraphQL-formatted string representing the default value for this input value.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "__Type",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "__Schema",
- "description": "A GraphQL Schema defines the capabilities of a GraphQL server. It exposes all available types and directives on the server, as well as the entry points for query, mutation, and subscription operations.",
- "fields": [
- {
- "name": "directives",
- "description": "A list of all directives supported by this server.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "__Directive",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mutationType",
- "description": "If this server supports mutation, the type that mutation operations will be rooted at.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "__Type",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "queryType",
- "description": "The type that query operations will be rooted at.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "__Type",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "subscriptionType",
- "description": "If this server support subscription, the type that subscription operations will be rooted at.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "__Type",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "types",
- "description": "A list of all types supported by this server.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "__Type",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "__Type",
- "description": "The fundamental unit of any GraphQL Schema is the type. There are many kinds of types in GraphQL as represented by the `__TypeKind` enum.\n\nDepending on the kind of a type, certain fields describe information about that type. Scalar types provide no information beyond a name and description, while Enum types provide their values. Object and Interface types provide the fields they describe. Abstract types, Union and Interface, provide the Object types possible at runtime. List and NonNull types compose other types.",
- "fields": [
- {
- "name": "description",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "enumValues",
- "description": null,
- "args": [
- {
- "name": "includeDeprecated",
- "description": null,
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- }
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "__EnumValue",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fields",
- "description": null,
- "args": [
- {
- "name": "includeDeprecated",
- "description": null,
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- }
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "__Field",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "inputFields",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "__InputValue",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "interfaces",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "__Type",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "kind",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "__TypeKind",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ofType",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "__Type",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "possibleTypes",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "__Type",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "__TypeKind",
- "description": "An enum describing what kind of type a given `__Type` is.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "SCALAR",
- "description": "Indicates this type is a scalar.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "OBJECT",
- "description": "Indicates this type is an object. `fields` and `interfaces` are valid fields.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "INTERFACE",
- "description": "Indicates this type is an interface. `fields` and `possibleTypes` are valid fields.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UNION",
- "description": "Indicates this type is a union. `possibleTypes` is a valid field.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ENUM",
- "description": "Indicates this type is an enum. `enumValues` is a valid field.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "INPUT_OBJECT",
- "description": "Indicates this type is an input object. `inputFields` is a valid field.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LIST",
- "description": "Indicates this type is a list. `ofType` is a valid field.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "NON_NULL",
- "description": "Indicates this type is a non-null. `ofType` is a valid field.",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- }
- ],
- "directives": [
- {
- "name": "include",
- "description": "Directs the executor to include this field or fragment only when the `if` argument is true.",
- "locations": [
- "FIELD",
- "FRAGMENT_SPREAD",
- "INLINE_FRAGMENT"
- ],
- "args": [
- {
- "name": "if",
- "description": "Included when true.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ]
- },
- {
- "name": "skip",
- "description": "Directs the executor to skip this field or fragment when the `if` argument is true.",
- "locations": [
- "FIELD",
- "FRAGMENT_SPREAD",
- "INLINE_FRAGMENT"
- ],
- "args": [
- {
- "name": "if",
- "description": "Skipped when true.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ]
- },
- {
- "name": "deprecated",
- "description": "Marks an element of a GraphQL schema as no longer supported.",
- "locations": [
- "FIELD_DEFINITION",
- "ENUM_VALUE"
- ],
- "args": [
- {
- "name": "reason",
- "description": "Explains why this element was deprecated, usually also including a suggestion for how to access supported similar data. Formatted in [Markdown](https://daringfireball.net/projects/markdown/).",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": "\"No longer supported\""
- }
- ]
- }
- ]
- }
- }
-} \ No newline at end of file
diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md
index f49a12568ed..df5d082df77 100644
--- a/doc/api/graphql/reference/index.md
+++ b/doc/api/graphql/reference/index.md
@@ -21,11 +21,345 @@ fields and methods on a model are available via GraphQL.
WARNING:
Fields that are deprecated are marked with **{warning-solid}**.
-Items (fields, enums, etc) that have been removed according to our [deprecation process](../index.md#deprecation-process) can be found
+Items (fields, enums, etc) that have been removed according to our [deprecation process](../index.md#deprecation-and-removal-process) can be found
in [Removed Items](../removed_items.md).
<!-- vale gitlab.Spelling = NO -->
+## `Query` type
+
+The `Query` type contains the API's top-level entry points for all executable queries.
+
+### `ciApplicationSettings`
+
+CI related settings that apply to the entire instance.
+
+### `ciConfig`
+
+Get linted and processed contents of a CI config. Should not be requested more than once per request.
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `content` | String! | Contents of `.gitlab-ci.yml`. |
+| `dryRun` | Boolean | Run pipeline creation simulation, or only do static check. |
+| `projectPath` | ID! | The project of the CI config. |
+
+### `containerRepository`
+
+Find a container repository.
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `id` | ContainerRepositoryID! | The global ID of the container repository. |
+
+### `currentUser`
+
+Get information about current user.
+
+### `designManagement`
+
+Fields related to design management.
+
+### `devopsAdoptionSegments`
+
+Get configured DevOps adoption segments on the instance.
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `after` | String | Returns the elements in the list that come after the specified cursor. |
+| `before` | String | Returns the elements in the list that come before the specified cursor. |
+| `first` | Int | Returns the first _n_ elements from the list. |
+| `last` | Int | Returns the last _n_ elements from the list. |
+
+### `echo`
+
+Text to echo back.
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `text` | String! | Text to echo back. |
+
+### `geoNode`
+
+Find a Geo node.
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `name` | String | The name of the Geo node. Defaults to the current Geo node name. |
+
+### `group`
+
+Find a group.
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `fullPath` | ID! | The full path of the project, group or namespace, e.g., `gitlab-org/gitlab-foss`. |
+
+### `instanceSecurityDashboard`
+
+Fields related to Instance Security Dashboard.
+
+### `instanceStatisticsMeasurements`
+
+Get statistics on the instance. Deprecated in 13.10: This field was renamed. Use the `usageTrendsMeasurements` field instead.
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `after` | String | Returns the elements in the list that come after the specified cursor. |
+| `before` | String | Returns the elements in the list that come before the specified cursor. |
+| `first` | Int | Returns the first _n_ elements from the list. |
+| `identifier` | MeasurementIdentifier! | The type of measurement/statistics to retrieve. |
+| `last` | Int | Returns the last _n_ elements from the list. |
+| `recordedAfter` | Time | Measurement recorded after this date. |
+| `recordedBefore` | Time | Measurement recorded before this date. |
+
+### `issue`
+
+Find an Issue.
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `id` | IssueID! | The global ID of the Issue. |
+
+### `iteration`
+
+Find an iteration.
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `id` | IterationID! | Find an iteration by its ID. |
+
+### `metadata`
+
+Metadata about GitLab.
+
+### `milestone`
+
+Find a milestone.
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `id` | MilestoneID! | Find a milestone by its ID. |
+
+### `namespace`
+
+Find a namespace.
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `fullPath` | ID! | The full path of the project, group or namespace, e.g., `gitlab-org/gitlab-foss`. |
+
+### `package`
+
+Find a package.
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `id` | PackagesPackageID! | The global ID of the package. |
+
+### `project`
+
+Find a project.
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `fullPath` | ID! | The full path of the project, group or namespace, e.g., `gitlab-org/gitlab-foss`. |
+
+### `projects`
+
+Find projects visible to the current user.
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `after` | String | Returns the elements in the list that come after the specified cursor. |
+| `before` | String | Returns the elements in the list that come before the specified cursor. |
+| `first` | Int | Returns the first _n_ elements from the list. |
+| `ids` | ID! => Array | Filter projects by IDs. |
+| `last` | Int | Returns the last _n_ elements from the list. |
+| `membership` | Boolean | Limit projects that the current user is a member of. |
+| `search` | String | Search query for project name, path, or description. |
+| `searchNamespaces` | Boolean | Include namespace in project search. |
+| `sort` | String | Sort order of results. |
+
+### `runnerPlatforms`
+
+Supported runner platforms.
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `after` | String | Returns the elements in the list that come after the specified cursor. |
+| `before` | String | Returns the elements in the list that come before the specified cursor. |
+| `first` | Int | Returns the first _n_ elements from the list. |
+| `last` | Int | Returns the last _n_ elements from the list. |
+
+### `runnerSetup`
+
+Get runner setup instructions.
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `architecture` | String! | Architecture to generate the instructions for. |
+| `groupId` | GroupID | Group to register the runner for. |
+| `platform` | String! | Platform to generate the instructions for. |
+| `projectId` | ProjectID | Project to register the runner for. |
+
+### `snippets`
+
+Find Snippets visible to the current user.
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `after` | String | Returns the elements in the list that come after the specified cursor. |
+| `authorId` | UserID | The ID of an author. |
+| `before` | String | Returns the elements in the list that come before the specified cursor. |
+| `explore` | Boolean | Explore personal snippets. |
+| `first` | Int | Returns the first _n_ elements from the list. |
+| `ids` | SnippetID! => Array | Array of global snippet IDs. For example, `gid://gitlab/ProjectSnippet/1`. |
+| `last` | Int | Returns the last _n_ elements from the list. |
+| `projectId` | ProjectID | The ID of a project. |
+| `type` | TypeEnum | The type of snippet. |
+| `visibility` | VisibilityScopesEnum | The visibility of the snippet. |
+
+### `usageTrendsMeasurements`
+
+Get statistics on the instance.
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `after` | String | Returns the elements in the list that come after the specified cursor. |
+| `before` | String | Returns the elements in the list that come before the specified cursor. |
+| `first` | Int | Returns the first _n_ elements from the list. |
+| `identifier` | MeasurementIdentifier! | The type of measurement/statistics to retrieve. |
+| `last` | Int | Returns the last _n_ elements from the list. |
+| `recordedAfter` | Time | Measurement recorded after this date. |
+| `recordedBefore` | Time | Measurement recorded before this date. |
+
+### `user`
+
+Find a user.
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `id` | UserID | ID of the User. |
+| `username` | String | Username of the User. |
+
+### `users`
+
+Find users.
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `admins` | Boolean | Return only admin users. |
+| `after` | String | Returns the elements in the list that come after the specified cursor. |
+| `before` | String | Returns the elements in the list that come before the specified cursor. |
+| `first` | Int | Returns the first _n_ elements from the list. |
+| `ids` | ID! => Array | List of user Global IDs. |
+| `last` | Int | Returns the last _n_ elements from the list. |
+| `search` | String | Query to search users by name, username, or primary email. |
+| `sort` | Sort | Sort users by this criteria. |
+| `usernames` | String! => Array | List of usernames. |
+
+### `vulnerabilities`
+
+Vulnerabilities reported on projects on the current user's instance security dashboard.
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `after` | String | Returns the elements in the list that come after the specified cursor. |
+| `before` | String | Returns the elements in the list that come before the specified cursor. |
+| `first` | Int | Returns the first _n_ elements from the list. |
+| `hasIssues` | Boolean | Returns only the vulnerabilities which have linked issues. |
+| `hasResolution` | Boolean | Returns only the vulnerabilities which have been resolved on default branch. |
+| `last` | Int | Returns the last _n_ elements from the list. |
+| `projectId` | ID! => Array | Filter vulnerabilities by project. |
+| `reportType` | VulnerabilityReportType! => Array | Filter vulnerabilities by report type. |
+| `scanner` | String! => Array | Filter vulnerabilities by VulnerabilityScanner.externalId. |
+| `severity` | VulnerabilitySeverity! => Array | Filter vulnerabilities by severity. |
+| `sort` | VulnerabilitySort | List vulnerabilities by sort order. |
+| `state` | VulnerabilityState! => Array | Filter vulnerabilities by state. |
+
+### `vulnerabilitiesCountByDay`
+
+Number of vulnerabilities per day for the projects on the current user's instance security dashboard.
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `after` | String | Returns the elements in the list that come after the specified cursor. |
+| `before` | String | Returns the elements in the list that come before the specified cursor. |
+| `endDate` | ISO8601Date! | Last day for which to fetch vulnerability history. |
+| `first` | Int | Returns the first _n_ elements from the list. |
+| `last` | Int | Returns the last _n_ elements from the list. |
+| `startDate` | ISO8601Date! | First day for which to fetch vulnerability history. |
+
+### `vulnerabilitiesCountByDayAndSeverity`
+
+Number of vulnerabilities per severity level, per day, for the projects on the current user's instance security dashboard. Deprecated in 13.3: Use `vulnerabilitiesCountByDay`.
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `after` | String | Returns the elements in the list that come after the specified cursor. |
+| `before` | String | Returns the elements in the list that come before the specified cursor. |
+| `endDate` | ISO8601Date! | Last day for which to fetch vulnerability history. |
+| `first` | Int | Returns the first _n_ elements from the list. |
+| `last` | Int | Returns the last _n_ elements from the list. |
+| `startDate` | ISO8601Date! | First day for which to fetch vulnerability history. |
+
+### `vulnerability`
+
+Find a vulnerability.
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `id` | VulnerabilityID! | The Global ID of the Vulnerability. |
+
## Object types
Object types represent the resources that the GitLab GraphQL API can return.
@@ -37,7 +371,7 @@ For more information, see
[Object Types and Fields](https://graphql.org/learn/schema/#object-types-and-fields)
on `graphql.org`.
-### AccessLevel
+### `AccessLevel`
Represents the access level of a relationship between a User and object that it is related to.
@@ -46,7 +380,7 @@ Represents the access level of a relationship between a User and object that it
| `integerValue` | Int | Integer representation of access level. |
| `stringValue` | AccessLevelEnum | String representation of access level. |
-### AddAwardEmojiPayload
+### `AddAwardEmojiPayload`
Autogenerated return type of AddAwardEmoji.
@@ -56,7 +390,7 @@ Autogenerated return type of AddAwardEmoji.
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### AddProjectToSecurityDashboardPayload
+### `AddProjectToSecurityDashboardPayload`
Autogenerated return type of AddProjectToSecurityDashboard.
@@ -66,7 +400,7 @@ Autogenerated return type of AddProjectToSecurityDashboard.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `project` | Project | Project that was added to the Instance Security Dashboard. |
-### AdminSidekiqQueuesDeleteJobsPayload
+### `AdminSidekiqQueuesDeleteJobsPayload`
Autogenerated return type of AdminSidekiqQueuesDeleteJobs.
@@ -76,7 +410,7 @@ Autogenerated return type of AdminSidekiqQueuesDeleteJobs.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `result` | DeleteJobsResponse | Information about the status of the deletion request. |
-### AlertManagementAlert
+### `AlertManagementAlert`
Describes an alert from the project's Alert Management.
@@ -93,7 +427,8 @@ Describes an alert from the project's Alert Management.
| `eventCount` | Int | Number of events of this alert. |
| `hosts` | String! => Array | List of hosts the alert came from. |
| `iid` | ID! | Internal ID of the alert. |
-| `issueIid` | ID | Internal ID of the GitLab issue attached to the alert. |
+| `issue` | Issue | Issue attached to the alert. |
+| `issueIid` **{warning-solid}** | ID | **Deprecated:** Use issue field. Deprecated in 13.10. |
| `metricsDashboardUrl` | String | URL for metrics embed for the alert. |
| `monitoringTool` | String | Monitoring tool the alert came from. |
| `notes` | NoteConnection! | All notes on this noteable. |
@@ -107,7 +442,7 @@ Describes an alert from the project's Alert Management.
| `todos` | TodoConnection | To-do items of the current user for the alert. |
| `updatedAt` | Time | Timestamp the alert was last updated. |
-### AlertManagementAlertStatusCountsType
+### `AlertManagementAlertStatusCountsType`
Represents total number of alerts for the represented categories.
@@ -120,7 +455,7 @@ Represents total number of alerts for the represented categories.
| `resolved` | Int | Number of alerts with status RESOLVED for the project |
| `triggered` | Int | Number of alerts with status TRIGGERED for the project |
-### AlertManagementHttpIntegration
+### `AlertManagementHttpIntegration`
An endpoint and credentials used to accept alerts for a project.
@@ -130,11 +465,14 @@ An endpoint and credentials used to accept alerts for a project.
| `apiUrl` | String | URL at which Prometheus metrics can be queried to populate the metrics dashboard. |
| `id` | ID! | ID of the integration. |
| `name` | String | Name of the integration. |
+| `payloadAlertFields` | AlertManagementPayloadAlertField! => Array | Extract alert fields from payload example for custom mapping. |
+| `payloadAttributeMappings` | AlertManagementPayloadAlertMappingField! => Array | The custom mapping of GitLab alert attributes to fields from the payload_example. |
+| `payloadExample` | JsonString | The example of an alert payload. |
| `token` | String | Token used to authenticate alert notification requests. |
| `type` | AlertManagementIntegrationType! | Type of integration. |
| `url` | String | Endpoint which accepts alert notifications. |
-### AlertManagementPayloadAlertField
+### `AlertManagementPayloadAlertField`
Parsed field from an alert used for custom mappings.
@@ -144,7 +482,18 @@ Parsed field from an alert used for custom mappings.
| `path` | String! => Array | Path to value inside payload JSON. |
| `type` | AlertManagementPayloadAlertFieldType | Type of the parsed value. |
-### AlertManagementPrometheusIntegration
+### `AlertManagementPayloadAlertMappingField`
+
+Parsed field (with its name) from an alert used for custom mappings.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `fieldName` | AlertManagementPayloadAlertFieldName | A GitLab alert field name. |
+| `label` | String | Human-readable label of the payload path. |
+| `path` | String! => Array | Path to value inside payload JSON. |
+| `type` | AlertManagementPayloadAlertFieldType | Type of the parsed value. |
+
+### `AlertManagementPrometheusIntegration`
An endpoint and credentials used to accept Prometheus alerts for a project.
@@ -158,7 +507,7 @@ An endpoint and credentials used to accept Prometheus alerts for a project.
| `type` | AlertManagementIntegrationType! | Type of integration. |
| `url` | String | Endpoint which accepts alert notifications. |
-### AlertSetAssigneesPayload
+### `AlertSetAssigneesPayload`
Autogenerated return type of AlertSetAssignees.
@@ -170,7 +519,7 @@ Autogenerated return type of AlertSetAssignees.
| `issue` | Issue | The issue created after mutation. |
| `todo` | Todo | The to-do item after mutation. |
-### AlertTodoCreatePayload
+### `AlertTodoCreatePayload`
Autogenerated return type of AlertTodoCreate.
@@ -182,7 +531,7 @@ Autogenerated return type of AlertTodoCreate.
| `issue` | Issue | The issue created after mutation. |
| `todo` | Todo | The to-do item after mutation. |
-### ApiFuzzingCiConfiguration
+### `ApiFuzzingCiConfiguration`
Data associated with configuring API fuzzing scans in GitLab CI.
@@ -191,7 +540,7 @@ Data associated with configuring API fuzzing scans in GitLab CI.
| `scanModes` | ApiFuzzingScanMode! => Array | All available scan modes. |
| `scanProfiles` | ApiFuzzingScanProfile! => Array | All default scan profiles. |
-### ApiFuzzingCiConfigurationCreatePayload
+### `ApiFuzzingCiConfigurationCreatePayload`
Autogenerated return type of ApiFuzzingCiConfigurationCreate.
@@ -202,9 +551,9 @@ Autogenerated return type of ApiFuzzingCiConfigurationCreate.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `gitlabCiYamlEditPath` | String | The location at which the project's `.gitlab-ci.yml` file can be edited in the browser. |
-### ApiFuzzingScanProfile
+### `ApiFuzzingScanProfile`
-An API Fuzzing scan profile..
+An API Fuzzing scan profile.
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -212,7 +561,7 @@ An API Fuzzing scan profile..
| `name` | String | The unique name of the profile. |
| `yaml` | String | A syntax highlit HTML representation of the YAML. |
-### AwardEmoji
+### `AwardEmoji`
An emoji awarded by a user.
@@ -225,7 +574,7 @@ An emoji awarded by a user.
| `unicodeVersion` | String! | The Unicode version for this emoji. |
| `user` | User! | The user who awarded the emoji. |
-### AwardEmojiAddPayload
+### `AwardEmojiAddPayload`
Autogenerated return type of AwardEmojiAdd.
@@ -235,7 +584,7 @@ Autogenerated return type of AwardEmojiAdd.
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### AwardEmojiRemovePayload
+### `AwardEmojiRemovePayload`
Autogenerated return type of AwardEmojiRemove.
@@ -245,7 +594,7 @@ Autogenerated return type of AwardEmojiRemove.
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### AwardEmojiTogglePayload
+### `AwardEmojiTogglePayload`
Autogenerated return type of AwardEmojiToggle.
@@ -256,14 +605,14 @@ Autogenerated return type of AwardEmojiToggle.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `toggledOn` | Boolean! | Indicates the status of the emoji. True if the toggle awarded the emoji, and false if the toggle removed the emoji. |
-### BaseService
+### `BaseService`
| Field | Type | Description |
| ----- | ---- | ----------- |
| `active` | Boolean | Indicates if the service is active. |
| `type` | String | Class name of the service. |
-### Blob
+### `Blob`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -278,9 +627,9 @@ Autogenerated return type of AwardEmojiToggle.
| `webPath` | String | Web path of the blob. |
| `webUrl` | String | Web URL of the blob. |
-### Board
+### `Board`
-Represents a project or group board.
+Represents a project or group issue board.
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -298,7 +647,7 @@ Represents a project or group board.
| `webUrl` | String! | Web URL of the board. |
| `weight` | Int | Weight of the board. |
-### BoardEpic
+### `BoardEpic`
Represents an epic on an issue board.
@@ -352,7 +701,7 @@ Represents an epic on an issue board.
| `webPath` | String! | Web path of the epic. |
| `webUrl` | String! | Web URL of the epic. |
-### BoardEpicUserPreferences
+### `BoardEpicUserPreferences`
Represents user preferences for a board epic.
@@ -360,14 +709,14 @@ Represents user preferences for a board epic.
| ----- | ---- | ----------- |
| `collapsed` | Boolean! | Indicates epic should be displayed as collapsed. |
-### BoardList
+### `BoardList`
Represents a list for an issue board.
| Field | Type | Description |
| ----- | ---- | ----------- |
| `assignee` | User | Assignee in the list. |
-| `collapsed` | Boolean | Indicates if list is collapsed for this user. |
+| `collapsed` | Boolean | Indicates if the list is collapsed for this user. |
| `id` | ID! | ID (global ID) of the list. |
| `issues` | IssueConnection | Board issues. |
| `issuesCount` | Int | Count of issues in the list. |
@@ -382,7 +731,7 @@ Represents a list for an issue board.
| `title` | String! | Title of the list. |
| `totalWeight` | Int | Total weight of all issues in the list. |
-### BoardListCreatePayload
+### `BoardListCreatePayload`
Autogenerated return type of BoardListCreate.
@@ -392,7 +741,7 @@ Autogenerated return type of BoardListCreate.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `list` | BoardList | Issue list in the issue board. |
-### BoardListUpdateLimitMetricsPayload
+### `BoardListUpdateLimitMetricsPayload`
Autogenerated return type of BoardListUpdateLimitMetrics.
@@ -402,14 +751,24 @@ Autogenerated return type of BoardListUpdateLimitMetrics.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `list` | BoardList | The updated list. |
-### Branch
+### `Branch`
| Field | Type | Description |
| ----- | ---- | ----------- |
| `commit` | Commit | Commit for the branch. |
| `name` | String! | Name of the branch. |
-### BurnupChartDailyTotals
+### `BulkFindOrCreateDevopsAdoptionSegmentsPayload`
+
+Autogenerated return type of BulkFindOrCreateDevopsAdoptionSegments.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
+| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `segments` | DevopsAdoptionSegment! => Array | Created segments after mutation. |
+
+### `BurnupChartDailyTotals`
Represents the total number of issues and their weights for a particular day.
@@ -421,19 +780,19 @@ Represents the total number of issues and their weights for a particular day.
| `scopeCount` | Int! | Number of issues as of this day. |
| `scopeWeight` | Int! | Total weight of issues as of this day. |
-### CiApplicationSettings
+### `CiApplicationSettings`
| Field | Type | Description |
| ----- | ---- | ----------- |
| `keepLatestArtifact` | Boolean | Whether to keep the latest jobs artifacts. |
-### CiBuildNeed
+### `CiBuildNeed`
| Field | Type | Description |
| ----- | ---- | ----------- |
| `name` | String | Name of the job we need to complete. |
-### CiCdSettingsUpdatePayload
+### `CiCdSettingsUpdatePayload`
Autogenerated return type of CiCdSettingsUpdate.
@@ -442,7 +801,7 @@ Autogenerated return type of CiCdSettingsUpdate.
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### CiConfig
+### `CiConfig`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -451,7 +810,7 @@ Autogenerated return type of CiCdSettingsUpdate.
| `stages` | CiConfigStageConnection | Stages of the pipeline. |
| `status` | CiConfigStatus | Status of linting, can be either valid or invalid. |
-### CiConfigGroup
+### `CiConfigGroup`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -459,7 +818,7 @@ Autogenerated return type of CiCdSettingsUpdate.
| `name` | String | Name of the job group. |
| `size` | Int | Size of the job group. |
-### CiConfigJob
+### `CiConfigJob`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -477,26 +836,26 @@ Autogenerated return type of CiCdSettingsUpdate.
| `tags` | String! => Array | List of tags that are used to select a runner. |
| `when` | String | When to run the job. |
-### CiConfigJobRestriction
+### `CiConfigJobRestriction`
| Field | Type | Description |
| ----- | ---- | ----------- |
| `refs` | String! => Array | The Git refs the job restriction applies to. |
-### CiConfigNeed
+### `CiConfigNeed`
| Field | Type | Description |
| ----- | ---- | ----------- |
| `name` | String | Name of the need. |
-### CiConfigStage
+### `CiConfigStage`
| Field | Type | Description |
| ----- | ---- | ----------- |
| `groups` | CiConfigGroupConnection | Groups of jobs for the stage. |
| `name` | String | Name of the stage. |
-### CiGroup
+### `CiGroup`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -505,25 +864,27 @@ Autogenerated return type of CiCdSettingsUpdate.
| `name` | String | Name of the job group. |
| `size` | Int | Size of the group. |
-### CiJob
+### `CiJob`
| Field | Type | Description |
| ----- | ---- | ----------- |
| `artifacts` | CiJobArtifactConnection | Artifacts generated by the job. |
| `detailedStatus` | DetailedStatus | Detailed status of the job. |
+| `duration` | Int | Duration of the job in seconds. |
+| `finishedAt` | Time | When a job has finished running. |
| `name` | String | Name of the job. |
| `needs` | CiBuildNeedConnection | References to builds that must complete before the jobs run. |
| `pipeline` | Pipeline | Pipeline the job belongs to. |
| `scheduledAt` | Time | Schedule for the build. |
-### CiJobArtifact
+### `CiJobArtifact`
| Field | Type | Description |
| ----- | ---- | ----------- |
| `downloadPath` | String | URL for downloading the artifact's file. |
| `fileType` | JobArtifactFileType | File type of the artifact. |
-### CiStage
+### `CiStage`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -531,7 +892,7 @@ Autogenerated return type of CiCdSettingsUpdate.
| `groups` | CiGroupConnection | Group of jobs for the stage. |
| `name` | String | Name of the stage. |
-### ClusterAgent
+### `ClusterAgent`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -542,8 +903,9 @@ Autogenerated return type of CiCdSettingsUpdate.
| `project` | Project | The project this cluster agent is associated with. |
| `tokens` | ClusterAgentTokenConnection | Tokens associated with the cluster agent. |
| `updatedAt` | Time | Timestamp the cluster agent was updated. |
+| `webPath` | String | Web path of the cluster agent. |
-### ClusterAgentDeletePayload
+### `ClusterAgentDeletePayload`
Autogenerated return type of ClusterAgentDelete.
@@ -552,16 +914,18 @@ Autogenerated return type of ClusterAgentDelete.
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### ClusterAgentToken
+### `ClusterAgentToken`
| Field | Type | Description |
| ----- | ---- | ----------- |
| `clusterAgent` | ClusterAgent | Cluster agent this token is associated with. |
| `createdAt` | Time | Timestamp the token was created. |
| `createdByUser` | User | The user who created the token. |
+| `description` | String | Description of the token. |
| `id` | ClustersAgentTokenID! | Global ID of the token. |
+| `name` | String | Name given to the token. |
-### ClusterAgentTokenCreatePayload
+### `ClusterAgentTokenCreatePayload`
Autogenerated return type of ClusterAgentTokenCreate.
@@ -572,7 +936,7 @@ Autogenerated return type of ClusterAgentTokenCreate.
| `secret` | String | Token secret value. Make sure you save it - you won't be able to access it again. |
| `token` | ClusterAgentToken | Token created after mutation. |
-### ClusterAgentTokenDeletePayload
+### `ClusterAgentTokenDeletePayload`
Autogenerated return type of ClusterAgentTokenDelete.
@@ -581,7 +945,7 @@ Autogenerated return type of ClusterAgentTokenDelete.
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### CodeCoverageActivity
+### `CodeCoverageActivity`
Represents the code coverage activity for a group.
@@ -592,7 +956,7 @@ Represents the code coverage activity for a group.
| `date` | Date! | Date when the code coverage was created. |
| `projectCount` | Int | Number of projects with code coverage results for the group. |
-### CodeCoverageSummary
+### `CodeCoverageSummary`
Represents the code coverage summary for a project.
@@ -602,7 +966,7 @@ Represents the code coverage summary for a project.
| `coverageCount` | Int | Number of different code coverage results available. |
| `lastUpdatedOn` | Date | Latest date when the code coverage was created for the project. |
-### Commit
+### `Commit`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -623,7 +987,7 @@ Represents the code coverage summary for a project.
| `webPath` | String! | Web path of the commit. |
| `webUrl` | String! | Web URL of the commit. |
-### CommitCreatePayload
+### `CommitCreatePayload`
Autogenerated return type of CommitCreate.
@@ -633,7 +997,7 @@ Autogenerated return type of CommitCreate.
| `commit` | Commit | The commit after mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### ComplianceFramework
+### `ComplianceFramework`
Represents a ComplianceFramework associated with a Project.
@@ -643,9 +1007,9 @@ Represents a ComplianceFramework associated with a Project.
| `description` | String! | Description of the compliance framework. |
| `id` | ID! | Compliance framework ID. |
| `name` | String! | Name of the compliance framework. |
-| `pipelineConfigurationFullPath` | String | Full path of the compliance pipeline configuration stored in a project repository, such as `.gitlab/.compliance-gitlab-ci.yml@compliance/hippa`. |
+| `pipelineConfigurationFullPath` | String | Full path of the compliance pipeline configuration stored in a project repository, such as `.gitlab/.compliance-gitlab-ci.yml@compliance/hipaa` **(ULTIMATE)**. |
-### ComposerMetadata
+### `ComposerMetadata`
Composer metadata.
@@ -654,7 +1018,7 @@ Composer metadata.
| `composerJson` | PackageComposerJsonType! | Data of the Composer JSON file. |
| `targetSha` | String! | Target SHA of the package. |
-### ConfigureSastPayload
+### `ConfigureSastPayload`
Autogenerated return type of ConfigureSast.
@@ -665,7 +1029,7 @@ Autogenerated return type of ConfigureSast.
| `status` | String! | Status of creating the commit for the supplied SAST CI configuration. |
| `successPath` | String | Redirect path to use when the response is successful. |
-### ContainerExpirationPolicy
+### `ContainerExpirationPolicy`
A tag expiration policy designed to keep only the images that matter most.
@@ -681,7 +1045,7 @@ A tag expiration policy designed to keep only the images that matter most.
| `olderThan` | ContainerExpirationPolicyOlderThanEnum | Tags older that this will expire. |
| `updatedAt` | Time! | Timestamp of when the container expiration policy was updated. |
-### ContainerRepository
+### `ContainerRepository`
A container repository.
@@ -700,7 +1064,7 @@ A container repository.
| `tagsCount` | Int! | Number of tags associated with this image. |
| `updatedAt` | Time! | Timestamp when the container repository was updated. |
-### ContainerRepositoryDetails
+### `ContainerRepositoryDetails`
Details of a container repository.
@@ -720,7 +1084,7 @@ Details of a container repository.
| `tagsCount` | Int! | Number of tags associated with this image. |
| `updatedAt` | Time! | Timestamp when the container repository was updated. |
-### ContainerRepositoryTag
+### `ContainerRepositoryTag`
A tag from a container repository.
@@ -736,7 +1100,7 @@ A tag from a container repository.
| `shortRevision` | String | Short revision of the tag. |
| `totalSize` | BigInt | The size of the tag. |
-### CreateAlertIssuePayload
+### `CreateAlertIssuePayload`
Autogenerated return type of CreateAlertIssue.
@@ -748,7 +1112,7 @@ Autogenerated return type of CreateAlertIssue.
| `issue` | Issue | The issue created after mutation. |
| `todo` | Todo | The to-do item after mutation. |
-### CreateAnnotationPayload
+### `CreateAnnotationPayload`
Autogenerated return type of CreateAnnotation.
@@ -758,7 +1122,7 @@ Autogenerated return type of CreateAnnotation.
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### CreateBoardPayload
+### `CreateBoardPayload`
Autogenerated return type of CreateBoard.
@@ -768,7 +1132,7 @@ Autogenerated return type of CreateBoard.
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### CreateBranchPayload
+### `CreateBranchPayload`
Autogenerated return type of CreateBranch.
@@ -778,7 +1142,7 @@ Autogenerated return type of CreateBranch.
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### CreateClusterAgentPayload
+### `CreateClusterAgentPayload`
Autogenerated return type of CreateClusterAgent.
@@ -788,7 +1152,7 @@ Autogenerated return type of CreateClusterAgent.
| `clusterAgent` | ClusterAgent | Cluster agent created after mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### CreateComplianceFrameworkPayload
+### `CreateComplianceFrameworkPayload`
Autogenerated return type of CreateComplianceFramework.
@@ -798,7 +1162,7 @@ Autogenerated return type of CreateComplianceFramework.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `framework` | ComplianceFramework | The created compliance framework. |
-### CreateCustomEmojiPayload
+### `CreateCustomEmojiPayload`
Autogenerated return type of CreateCustomEmoji.
@@ -808,7 +1172,7 @@ Autogenerated return type of CreateCustomEmoji.
| `customEmoji` | CustomEmoji | The new custom emoji. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### CreateDevopsAdoptionSegmentPayload
+### `CreateDevopsAdoptionSegmentPayload`
Autogenerated return type of CreateDevopsAdoptionSegment.
@@ -818,7 +1182,7 @@ Autogenerated return type of CreateDevopsAdoptionSegment.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `segment` | DevopsAdoptionSegment | The segment after mutation. |
-### CreateDiffNotePayload
+### `CreateDiffNotePayload`
Autogenerated return type of CreateDiffNote.
@@ -828,7 +1192,7 @@ Autogenerated return type of CreateDiffNote.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `note` | Note | The note after mutation. |
-### CreateEpicPayload
+### `CreateEpicPayload`
Autogenerated return type of CreateEpic.
@@ -838,7 +1202,7 @@ Autogenerated return type of CreateEpic.
| `epic` | Epic | The created epic. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### CreateImageDiffNotePayload
+### `CreateImageDiffNotePayload`
Autogenerated return type of CreateImageDiffNote.
@@ -848,7 +1212,7 @@ Autogenerated return type of CreateImageDiffNote.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `note` | Note | The note after mutation. |
-### CreateIssuePayload
+### `CreateIssuePayload`
Autogenerated return type of CreateIssue.
@@ -858,7 +1222,7 @@ Autogenerated return type of CreateIssue.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `issue` | Issue | The issue after mutation. |
-### CreateIterationPayload
+### `CreateIterationPayload`
Autogenerated return type of CreateIteration.
@@ -868,7 +1232,7 @@ Autogenerated return type of CreateIteration.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `iteration` | Iteration | The created iteration. |
-### CreateNotePayload
+### `CreateNotePayload`
Autogenerated return type of CreateNote.
@@ -878,7 +1242,7 @@ Autogenerated return type of CreateNote.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `note` | Note | The note after mutation. |
-### CreateRequirementPayload
+### `CreateRequirementPayload`
Autogenerated return type of CreateRequirement.
@@ -888,7 +1252,7 @@ Autogenerated return type of CreateRequirement.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `requirement` | Requirement | Requirement after mutation. |
-### CreateSnippetPayload
+### `CreateSnippetPayload`
Autogenerated return type of CreateSnippet.
@@ -902,7 +1266,7 @@ Autogenerated return type of CreateSnippet.
| `spam` | Boolean | Indicates whether the operation was detected as definite spam. There is no option to resubmit the request with a CAPTCHA response. |
| `spamLogId` | Int | The spam log ID which must be passed along with a valid CAPTCHA response for an operation to be completed. Included only when an operation was not completed because "NeedsCaptchaResponse" is true. |
-### CreateTestCasePayload
+### `CreateTestCasePayload`
Autogenerated return type of CreateTestCase.
@@ -912,7 +1276,7 @@ Autogenerated return type of CreateTestCase.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `testCase` | Issue | The test case created. |
-### CustomEmoji
+### `CustomEmoji`
A custom emoji uploaded by user.
@@ -923,7 +1287,7 @@ A custom emoji uploaded by user.
| `name` | String! | The name of the emoji. |
| `url` | String! | The link to file of the emoji. |
-### DastOnDemandScanCreatePayload
+### `DastOnDemandScanCreatePayload`
Autogenerated return type of DastOnDemandScanCreate.
@@ -933,12 +1297,13 @@ Autogenerated return type of DastOnDemandScanCreate.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `pipelineUrl` | String | URL of the pipeline that was created. |
-### DastProfile
+### `DastProfile`
Represents a DAST Profile.
| Field | Type | Description |
| ----- | ---- | ----------- |
+| `branch` | DastProfileBranch | The associated branch. Will always return `null` if `dast_branch_selection` feature flag is disabled. |
| `dastScannerProfile` | DastScannerProfile | The associated scanner profile. |
| `dastSiteProfile` | DastSiteProfile | The associated site profile. |
| `description` | String | The description of the scan. |
@@ -946,7 +1311,16 @@ Represents a DAST Profile.
| `id` | DastProfileID! | ID of the profile. |
| `name` | String | The name of the profile. |
-### DastProfileCreatePayload
+### `DastProfileBranch`
+
+Represents a DAST Profile Branch.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `exists` | Boolean | Indicates whether or not the branch exists. |
+| `name` | String | The name of the branch. |
+
+### `DastProfileCreatePayload`
Autogenerated return type of DastProfileCreate.
@@ -957,7 +1331,7 @@ Autogenerated return type of DastProfileCreate.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `pipelineUrl` | String | The URL of the pipeline that was created. Requires `runAfterCreate` to be set to `true`. |
-### DastProfileDeletePayload
+### `DastProfileDeletePayload`
Autogenerated return type of DastProfileDelete.
@@ -966,7 +1340,7 @@ Autogenerated return type of DastProfileDelete.
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### DastProfileRunPayload
+### `DastProfileRunPayload`
Autogenerated return type of DastProfileRun.
@@ -976,7 +1350,7 @@ Autogenerated return type of DastProfileRun.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `pipelineUrl` | String | URL of the pipeline that was created. |
-### DastProfileUpdatePayload
+### `DastProfileUpdatePayload`
Autogenerated return type of DastProfileUpdate.
@@ -987,7 +1361,7 @@ Autogenerated return type of DastProfileUpdate.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `pipelineUrl` | String | The URL of the pipeline that was created. Requires the input argument `runAfterUpdate` to be set to `true` when calling the mutation, otherwise no pipeline will be created. |
-### DastScannerProfile
+### `DastScannerProfile`
Represents a DAST scanner profile.
@@ -997,13 +1371,14 @@ Represents a DAST scanner profile.
| `globalId` **{warning-solid}** | DastScannerProfileID! | **Deprecated:** Use `id`. Deprecated in 13.6. |
| `id` | DastScannerProfileID! | ID of the DAST scanner profile. |
| `profileName` | String | Name of the DAST scanner profile. |
+| `referencedInSecurityPolicies` | String! => Array | List of security policy names that are referencing given project. |
| `scanType` | DastScanTypeEnum | Indicates the type of DAST scan that will run. Either a Passive Scan or an Active Scan. |
| `showDebugMessages` | Boolean! | Indicates if debug messages should be included in DAST console output. True to include the debug messages. |
| `spiderTimeout` | Int | The maximum number of minutes allowed for the spider to traverse the site. |
| `targetTimeout` | Int | The maximum number of seconds allowed for the site under test to respond to a request. |
| `useAjaxSpider` | Boolean! | Indicates if the AJAX spider should be used to crawl the target site. True to run the AJAX spider in addition to the traditional spider, and false to run only the traditional spider. |
-### DastScannerProfileCreatePayload
+### `DastScannerProfileCreatePayload`
Autogenerated return type of DastScannerProfileCreate.
@@ -1014,7 +1389,7 @@ Autogenerated return type of DastScannerProfileCreate.
| `globalId` **{warning-solid}** | DastScannerProfileID | **Deprecated:** Use `id`. Deprecated in 13.6. |
| `id` | DastScannerProfileID | ID of the scanner profile. |
-### DastScannerProfileDeletePayload
+### `DastScannerProfileDeletePayload`
Autogenerated return type of DastScannerProfileDelete.
@@ -1023,7 +1398,7 @@ Autogenerated return type of DastScannerProfileDelete.
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### DastScannerProfileUpdatePayload
+### `DastScannerProfileUpdatePayload`
Autogenerated return type of DastScannerProfileUpdate.
@@ -1033,7 +1408,7 @@ Autogenerated return type of DastScannerProfileUpdate.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `id` | DastScannerProfileID | ID of the scanner profile. |
-### DastSiteProfile
+### `DastSiteProfile`
Represents a DAST Site Profile.
@@ -1043,11 +1418,12 @@ Represents a DAST Site Profile.
| `id` | DastSiteProfileID! | ID of the site profile. |
| `normalizedTargetUrl` | String | Normalized URL of the target to be scanned. |
| `profileName` | String | The name of the site profile. |
+| `referencedInSecurityPolicies` | String! => Array | List of security policy names that are referencing given project. |
| `targetUrl` | String | The URL of the target to be scanned. |
| `userPermissions` | DastSiteProfilePermissions! | Permissions for the current user on the resource |
| `validationStatus` | DastSiteProfileValidationStatusEnum | The current validation status of the site profile. |
-### DastSiteProfileCreatePayload
+### `DastSiteProfileCreatePayload`
Autogenerated return type of DastSiteProfileCreate.
@@ -1057,7 +1433,7 @@ Autogenerated return type of DastSiteProfileCreate.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `id` | DastSiteProfileID | ID of the site profile. |
-### DastSiteProfileDeletePayload
+### `DastSiteProfileDeletePayload`
Autogenerated return type of DastSiteProfileDelete.
@@ -1066,7 +1442,7 @@ Autogenerated return type of DastSiteProfileDelete.
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### DastSiteProfilePermissions
+### `DastSiteProfilePermissions`
Check permissions for the current user on site profile.
@@ -1074,7 +1450,7 @@ Check permissions for the current user on site profile.
| ----- | ---- | ----------- |
| `createOnDemandDastScan` | Boolean! | Indicates the user can perform `create_on_demand_dast_scan` on this resource |
-### DastSiteProfileUpdatePayload
+### `DastSiteProfileUpdatePayload`
Autogenerated return type of DastSiteProfileUpdate.
@@ -1084,7 +1460,7 @@ Autogenerated return type of DastSiteProfileUpdate.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `id` | DastSiteProfileID | ID of the site profile. |
-### DastSiteTokenCreatePayload
+### `DastSiteTokenCreatePayload`
Autogenerated return type of DastSiteTokenCreate.
@@ -1096,7 +1472,7 @@ Autogenerated return type of DastSiteTokenCreate.
| `status` | DastSiteProfileValidationStatusEnum | The current validation status of the target. |
| `token` | String | Token string. |
-### DastSiteValidation
+### `DastSiteValidation`
Represents a DAST Site Validation.
@@ -1106,7 +1482,7 @@ Represents a DAST Site Validation.
| `normalizedTargetUrl` | String | Normalized URL of the target to be validated. |
| `status` | DastSiteProfileValidationStatusEnum! | Status of the site validation. |
-### DastSiteValidationCreatePayload
+### `DastSiteValidationCreatePayload`
Autogenerated return type of DastSiteValidationCreate.
@@ -1117,7 +1493,7 @@ Autogenerated return type of DastSiteValidationCreate.
| `id` | DastSiteValidationID | ID of the site validation. |
| `status` | DastSiteProfileValidationStatusEnum | The current validation status. |
-### DastSiteValidationRevokePayload
+### `DastSiteValidationRevokePayload`
Autogenerated return type of DastSiteValidationRevoke.
@@ -1126,7 +1502,7 @@ Autogenerated return type of DastSiteValidationRevoke.
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### DeleteAnnotationPayload
+### `DeleteAnnotationPayload`
Autogenerated return type of DeleteAnnotation.
@@ -1135,7 +1511,7 @@ Autogenerated return type of DeleteAnnotation.
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### DeleteDevopsAdoptionSegmentPayload
+### `DeleteDevopsAdoptionSegmentPayload`
Autogenerated return type of DeleteDevopsAdoptionSegment.
@@ -1144,7 +1520,7 @@ Autogenerated return type of DeleteDevopsAdoptionSegment.
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### DeleteJobsResponse
+### `DeleteJobsResponse`
The response from the AdminSidekiqQueuesDeleteJobs mutation.
@@ -1154,7 +1530,7 @@ The response from the AdminSidekiqQueuesDeleteJobs mutation.
| `deletedJobs` | Int | The number of matching jobs deleted. |
| `queueSize` | Int | The queue size after processing. |
-### Design
+### `Design`
A single design.
@@ -1175,7 +1551,7 @@ A single design.
| `project` | Project! | The project the design belongs to. |
| `versions` | DesignVersionConnection! | All versions related to this design ordered newest first. |
-### DesignAtVersion
+### `DesignAtVersion`
A design pinned to a specific version. The image field reflects the design as of the associated version.
@@ -1194,7 +1570,7 @@ A design pinned to a specific version. The image field reflects the design as of
| `project` | Project! | The project the design belongs to. |
| `version` | DesignVersion! | The version this design-at-versions is pinned to. |
-### DesignCollection
+### `DesignCollection`
A collection of designs.
@@ -1209,14 +1585,14 @@ A collection of designs.
| `version` | DesignVersion | A specific version. |
| `versions` | DesignVersionConnection! | All versions related to all designs, ordered newest first. |
-### DesignManagement
+### `DesignManagement`
| Field | Type | Description |
| ----- | ---- | ----------- |
| `designAtVersion` | DesignAtVersion | Find a design as of a version. |
| `version` | DesignVersion | Find a version. |
-### DesignManagementDeletePayload
+### `DesignManagementDeletePayload`
Autogenerated return type of DesignManagementDelete.
@@ -1226,7 +1602,7 @@ Autogenerated return type of DesignManagementDelete.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `version` | DesignVersion | The new version in which the designs are deleted. |
-### DesignManagementMovePayload
+### `DesignManagementMovePayload`
Autogenerated return type of DesignManagementMove.
@@ -1236,7 +1612,7 @@ Autogenerated return type of DesignManagementMove.
| `designCollection` | DesignCollection | The current state of the collection. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### DesignManagementUploadPayload
+### `DesignManagementUploadPayload`
Autogenerated return type of DesignManagementUpload.
@@ -1247,7 +1623,7 @@ Autogenerated return type of DesignManagementUpload.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `skippedDesigns` | Design! => Array | Any designs that were skipped from the upload due to there being no change to their content since their last version |
-### DesignVersion
+### `DesignVersion`
A specific version in which designs were added, modified or deleted.
@@ -1259,7 +1635,7 @@ A specific version in which designs were added, modified or deleted.
| `id` | ID! | ID of the design version. |
| `sha` | ID! | SHA of the design version. |
-### DestroyBoardListPayload
+### `DestroyBoardListPayload`
Autogenerated return type of DestroyBoardList.
@@ -1269,7 +1645,7 @@ Autogenerated return type of DestroyBoardList.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `list` | BoardList | The list after mutation. |
-### DestroyBoardPayload
+### `DestroyBoardPayload`
Autogenerated return type of DestroyBoard.
@@ -1279,7 +1655,7 @@ Autogenerated return type of DestroyBoard.
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### DestroyComplianceFrameworkPayload
+### `DestroyComplianceFrameworkPayload`
Autogenerated return type of DestroyComplianceFramework.
@@ -1288,7 +1664,7 @@ Autogenerated return type of DestroyComplianceFramework.
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### DestroyContainerRepositoryPayload
+### `DestroyContainerRepositoryPayload`
Autogenerated return type of DestroyContainerRepository.
@@ -1298,7 +1674,7 @@ Autogenerated return type of DestroyContainerRepository.
| `containerRepository` | ContainerRepository! | The container repository policy after scheduling the deletion. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### DestroyContainerRepositoryTagsPayload
+### `DestroyContainerRepositoryTagsPayload`
Autogenerated return type of DestroyContainerRepositoryTags.
@@ -1308,7 +1684,7 @@ Autogenerated return type of DestroyContainerRepositoryTags.
| `deletedTagNames` | String! => Array | Deleted container repository tags. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### DestroyNotePayload
+### `DestroyNotePayload`
Autogenerated return type of DestroyNote.
@@ -1318,7 +1694,7 @@ Autogenerated return type of DestroyNote.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `note` | Note | The note after mutation. |
-### DestroySnippetPayload
+### `DestroySnippetPayload`
Autogenerated return type of DestroySnippet.
@@ -1328,7 +1704,7 @@ Autogenerated return type of DestroySnippet.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `snippet` | Snippet | The snippet after mutation. |
-### DetailedStatus
+### `DetailedStatus`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -1342,7 +1718,7 @@ Autogenerated return type of DestroySnippet.
| `text` | String | Text of the status. |
| `tooltip` | String | Tooltip associated with the status. |
-### DevopsAdoptionSegment
+### `DevopsAdoptionSegment`
Segment.
@@ -1352,7 +1728,7 @@ Segment.
| `latestSnapshot` | DevopsAdoptionSnapshot | The latest adoption metrics for the segment. |
| `namespace` | Namespace | Segment namespace. |
-### DevopsAdoptionSnapshot
+### `DevopsAdoptionSnapshot`
Snapshot.
@@ -1369,7 +1745,7 @@ Snapshot.
| `securityScanSucceeded` | Boolean! | At least one security scan succeeded. |
| `startTime` | Time! | The start time for the snapshot where the data points were collected. |
-### DiffPosition
+### `DiffPosition`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -1385,7 +1761,7 @@ Snapshot.
| `x` | Int | X position of the note. |
| `y` | Int | Y position of the note. |
-### DiffRefs
+### `DiffRefs`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -1393,7 +1769,7 @@ Snapshot.
| `headSha` | String! | SHA of the HEAD at the time the comment was made. |
| `startSha` | String! | SHA of the branch being compared against. |
-### DiffStats
+### `DiffStats`
Changes to a single file.
@@ -1403,7 +1779,7 @@ Changes to a single file.
| `deletions` | Int! | Number of lines deleted from this file. |
| `path` | String! | File path, relative to repository root. |
-### DiffStatsSummary
+### `DiffStatsSummary`
Aggregated summary of changes.
@@ -1414,7 +1790,7 @@ Aggregated summary of changes.
| `deletions` | Int! | Number of lines deleted. |
| `fileCount` | Int! | Number of files changed. |
-### Discussion
+### `Discussion`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -1427,7 +1803,7 @@ Aggregated summary of changes.
| `resolvedAt` | Time | Timestamp of when the object was resolved. |
| `resolvedBy` | User | User who resolved the object. |
-### DiscussionToggleResolvePayload
+### `DiscussionToggleResolvePayload`
Autogenerated return type of DiscussionToggleResolve.
@@ -1437,7 +1813,7 @@ Autogenerated return type of DiscussionToggleResolve.
| `discussion` | Discussion | The discussion after mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### DismissVulnerabilityPayload
+### `DismissVulnerabilityPayload`
Autogenerated return type of DismissVulnerability.
@@ -1447,7 +1823,7 @@ Autogenerated return type of DismissVulnerability.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `vulnerability` | Vulnerability | The vulnerability after dismissal. |
-### Environment
+### `Environment`
Describes where code is deployed for a project.
@@ -1460,7 +1836,7 @@ Describes where code is deployed for a project.
| `path` | String! | The path to the environment. |
| `state` | String! | State of the environment, for example: available/stopped. |
-### EnvironmentsCanaryIngressUpdatePayload
+### `EnvironmentsCanaryIngressUpdatePayload`
Autogenerated return type of EnvironmentsCanaryIngressUpdate.
@@ -1469,7 +1845,7 @@ Autogenerated return type of EnvironmentsCanaryIngressUpdate.
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### Epic
+### `Epic`
Represents an epic.
@@ -1522,7 +1898,7 @@ Represents an epic.
| `webPath` | String! | Web path of the epic. |
| `webUrl` | String! | Web URL of the epic. |
-### EpicAddIssuePayload
+### `EpicAddIssuePayload`
Autogenerated return type of EpicAddIssue.
@@ -1533,17 +1909,22 @@ Autogenerated return type of EpicAddIssue.
| `epicIssue` | EpicIssue | The epic-issue relation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### EpicBoard
+### `EpicBoard`
Represents an epic board.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `id` | BoardsEpicBoardID! | Global ID of the board. |
+| `hideBacklogList` | Boolean | Whether or not backlog list is hidden. |
+| `hideClosedList` | Boolean | Whether or not closed list is hidden. |
+| `id` | BoardsEpicBoardID! | Global ID of the epic board. |
+| `labels` | LabelConnection | Labels of the board. |
| `lists` | EpicListConnection | Epic board lists. |
-| `name` | String | Name of the board. |
+| `name` | String | Name of the epic board. |
+| `webPath` | String! | Web path of the epic board. |
+| `webUrl` | String! | Web URL of the epic board. |
-### EpicBoardCreatePayload
+### `EpicBoardCreatePayload`
Autogenerated return type of EpicBoardCreate.
@@ -1553,7 +1934,7 @@ Autogenerated return type of EpicBoardCreate.
| `epicBoard` | EpicBoard | The created epic board. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### EpicBoardListCreatePayload
+### `EpicBoardListCreatePayload`
Autogenerated return type of EpicBoardListCreate.
@@ -1563,7 +1944,17 @@ Autogenerated return type of EpicBoardListCreate.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `list` | EpicList | Epic list in the epic board. |
-### EpicDescendantCount
+### `EpicBoardUpdatePayload`
+
+Autogenerated return type of EpicBoardUpdate.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
+| `epicBoard` | EpicBoard | The updated epic board. |
+| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+
+### `EpicDescendantCount`
Counts of descendent epics.
@@ -1574,7 +1965,7 @@ Counts of descendent epics.
| `openedEpics` | Int | Number of opened child epics. |
| `openedIssues` | Int | Number of opened epic issues. |
-### EpicDescendantWeights
+### `EpicDescendantWeights`
Total weight of open and closed descendant issues.
@@ -1583,7 +1974,7 @@ Total weight of open and closed descendant issues.
| `closedIssues` | Int | Total weight of completed (closed) issues in this epic, including epic descendants. |
| `openedIssues` | Int | Total weight of opened issues in this epic, including epic descendants. |
-### EpicHealthStatus
+### `EpicHealthStatus`
Health status of child issues.
@@ -1593,7 +1984,7 @@ Health status of child issues.
| `issuesNeedingAttention` | Int | Number of issues that need attention. |
| `issuesOnTrack` | Int | Number of issues on track. |
-### EpicIssue
+### `EpicIssue`
Relationship between an epic and an issue.
@@ -1604,6 +1995,7 @@ Relationship between an epic and an issue.
| `author` | User! | User that created the issue. |
| `blocked` | Boolean! | Indicates the issue is blocked. |
| `blockedByCount` | Int | Count of issues blocking this issue. |
+| `blockedByIssues` | IssueConnection | Issues blocking this issue. |
| `closedAt` | Time | Timestamp of when the issue was closed. |
| `confidential` | Boolean! | Indicates the issue is confidential. |
| `createNoteEmail` | String | User specific email address for the issue. |
@@ -1656,20 +2048,31 @@ Relationship between an epic and an issue.
| `webUrl` | String! | Web URL of the issue. |
| `weight` | Int | Weight of the issue. |
-### EpicList
+### `EpicList`
Represents an epic board list.
| Field | Type | Description |
| ----- | ---- | ----------- |
+| `collapsed` | Boolean | Indicates if this list is collapsed for this user. |
| `epics` | EpicConnection | List epics. |
+| `epicsCount` | Int | Count of epics in the list. |
| `id` | BoardsEpicListID! | Global ID of the board list. |
| `label` | Label | Label of the list. |
| `listType` | String! | Type of the list. |
| `position` | Int | Position of the list within the board. |
| `title` | String! | Title of the list. |
-### EpicPermissions
+### `EpicMoveListPayload`
+
+Autogenerated return type of EpicMoveList.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
+| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+
+### `EpicPermissions`
Check permissions for the current user on an epic.
@@ -1684,7 +2087,7 @@ Check permissions for the current user on an epic.
| `readEpicIid` | Boolean! | Indicates the user can perform `read_epic_iid` on this resource |
| `updateEpic` | Boolean! | Indicates the user can perform `update_epic` on this resource |
-### EpicSetSubscriptionPayload
+### `EpicSetSubscriptionPayload`
Autogenerated return type of EpicSetSubscription.
@@ -1694,7 +2097,7 @@ Autogenerated return type of EpicSetSubscription.
| `epic` | Epic | The epic after mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### EpicTreeReorderPayload
+### `EpicTreeReorderPayload`
Autogenerated return type of EpicTreeReorder.
@@ -1703,7 +2106,7 @@ Autogenerated return type of EpicTreeReorder.
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### Event
+### `Event`
Representing an event.
@@ -1715,7 +2118,7 @@ Representing an event.
| `id` | ID! | ID of the event. |
| `updatedAt` | Time! | When this event was updated. |
-### ExportRequirementsPayload
+### `ExportRequirementsPayload`
Autogenerated return type of ExportRequirements.
@@ -1724,7 +2127,7 @@ Autogenerated return type of ExportRequirements.
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### ExternalIssue
+### `ExternalIssue`
Represents an external issue.
@@ -1738,13 +2141,14 @@ Represents an external issue.
| `updatedAt` | Time | Timestamp of when the issue was updated. |
| `webUrl` | String | URL to the issue in the external tracker. |
-### GeoNode
+### `GeoNode`
| Field | Type | Description |
| ----- | ---- | ----------- |
| `containerRepositoriesMaxCapacity` | Int | The maximum concurrency of container repository sync for this secondary node. |
| `enabled` | Boolean | Indicates whether this Geo node is enabled. |
| `filesMaxCapacity` | Int | The maximum concurrency of LFS/attachment backfill for this secondary node. |
+| `groupWikiRepositoryRegistries` | GroupWikiRepositoryRegistryConnection | Find group wiki repository registries on this Geo node. Available only when feature flag `geo_group_wiki_repository_replication` is enabled. |
| `id` | ID! | ID of this GeoNode. |
| `internalUrl` | String | The URL defined on the primary node that secondary nodes should use to contact it. |
| `mergeRequestDiffRegistries` | MergeRequestDiffRegistryConnection | Find merge request diff registries on this Geo node. |
@@ -1762,7 +2166,7 @@ Represents an external issue.
| `url` | String | The user-facing URL for this Geo node. |
| `verificationMaxCapacity` | Int | The maximum concurrency of repository verification for this secondary node. |
-### GitlabSubscriptionActivatePayload
+### `GitlabSubscriptionActivatePayload`
Autogenerated return type of GitlabSubscriptionActivate.
@@ -1771,7 +2175,7 @@ Autogenerated return type of GitlabSubscriptionActivate.
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### GrafanaIntegration
+### `GrafanaIntegration`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -1781,7 +2185,7 @@ Autogenerated return type of GitlabSubscriptionActivate.
| `id` | ID! | Internal ID of the Grafana integration. |
| `updatedAt` | Time! | Timestamp of the issue's last activity. |
-### Group
+### `Group`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -1821,6 +2225,7 @@ Autogenerated return type of GitlabSubscriptionActivate.
| `milestones` | MilestoneConnection | Milestones of the group. |
| `name` | String! | Name of the namespace. |
| `packageSettings` | PackageSettings | The package settings for the namespace. |
+| `packages` | PackageConnection | Packages of the group. |
| `parent` | Group | Parent group. |
| `path` | String! | Path of the namespace. |
| `projectCreationLevel` | String | The permission level required to create projects in the group. |
@@ -1848,7 +2253,7 @@ Autogenerated return type of GitlabSubscriptionActivate.
| `vulnerabilitySeveritiesCount` | VulnerabilitySeveritiesCount | Counts for each vulnerability severity in the group and its subgroups. |
| `webUrl` | String! | Web URL of the group. |
-### GroupMember
+### `GroupMember`
Represents a Group Membership.
@@ -1864,13 +2269,13 @@ Represents a Group Membership.
| `user` | User! | User that is associated with the member object. |
| `userPermissions` | GroupPermissions! | Permissions for the current user on the resource |
-### GroupPermissions
+### `GroupPermissions`
| Field | Type | Description |
| ----- | ---- | ----------- |
| `readGroup` | Boolean! | Indicates the user can perform `read_group` on this resource |
-### GroupReleaseStats
+### `GroupReleaseStats`
Contains release-related statistics about a group.
@@ -1879,7 +2284,7 @@ Contains release-related statistics about a group.
| `releasesCount` | Int | Total number of releases in all descendant projects of the group. Will always return `null` if `group_level_release_statistics` feature flag is disabled |
| `releasesPercentage` | Int | Percentage of the group's descendant projects that have at least one release. Will always return `null` if `group_level_release_statistics` feature flag is disabled |
-### GroupStats
+### `GroupStats`
Contains statistics about a group.
@@ -1887,7 +2292,22 @@ Contains statistics about a group.
| ----- | ---- | ----------- |
| `releaseStats` | GroupReleaseStats | Statistics related to releases within the group. |
-### HttpIntegrationCreatePayload
+### `GroupWikiRepositoryRegistry`
+
+Represents the Geo sync and verification state of a group wiki repository.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `createdAt` | Time | Timestamp when the GroupWikiRepositoryRegistry was created |
+| `groupWikiRepositoryId` | ID! | ID of the Group Wiki Repository. |
+| `id` | ID! | ID of the GroupWikiRepositoryRegistry |
+| `lastSyncFailure` | String | Error message during sync of the GroupWikiRepositoryRegistry |
+| `lastSyncedAt` | Time | Timestamp of the most recent successful sync of the GroupWikiRepositoryRegistry |
+| `retryAt` | Time | Timestamp after which the GroupWikiRepositoryRegistry should be resynced |
+| `retryCount` | Int | Number of consecutive failed sync attempts of the GroupWikiRepositoryRegistry |
+| `state` | RegistryState | Sync state of the GroupWikiRepositoryRegistry |
+
+### `HttpIntegrationCreatePayload`
Autogenerated return type of HttpIntegrationCreate.
@@ -1897,7 +2317,7 @@ Autogenerated return type of HttpIntegrationCreate.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `integration` | AlertManagementHttpIntegration | The HTTP integration. |
-### HttpIntegrationDestroyPayload
+### `HttpIntegrationDestroyPayload`
Autogenerated return type of HttpIntegrationDestroy.
@@ -1907,7 +2327,7 @@ Autogenerated return type of HttpIntegrationDestroy.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `integration` | AlertManagementHttpIntegration | The HTTP integration. |
-### HttpIntegrationResetTokenPayload
+### `HttpIntegrationResetTokenPayload`
Autogenerated return type of HttpIntegrationResetToken.
@@ -1917,7 +2337,7 @@ Autogenerated return type of HttpIntegrationResetToken.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `integration` | AlertManagementHttpIntegration | The HTTP integration. |
-### HttpIntegrationUpdatePayload
+### `HttpIntegrationUpdatePayload`
Autogenerated return type of HttpIntegrationUpdate.
@@ -1927,12 +2347,14 @@ Autogenerated return type of HttpIntegrationUpdate.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `integration` | AlertManagementHttpIntegration | The HTTP integration. |
-### IncidentManagementOncallRotation
+### `IncidentManagementOncallRotation`
Describes an incident management on-call rotation.
| Field | Type | Description |
| ----- | ---- | ----------- |
+| `activePeriod` | OncallRotationActivePeriodType | Active period for the on-call rotation. |
+| `endsAt` | Time | End date and time of the on-call rotation. |
| `id` | IncidentManagementOncallRotationID! | ID of the on-call rotation. |
| `length` | Int | Length of the on-call schedule, in the units specified by lengthUnit. |
| `lengthUnit` | OncallRotationUnitEnum | Unit of the on-call rotation length. |
@@ -1941,7 +2363,7 @@ Describes an incident management on-call rotation.
| `shifts` | IncidentManagementOncallShiftConnection | Blocks of time for which a participant is on-call within a given time frame. Time frame cannot exceed one month. |
| `startsAt` | Time | Start date of the on-call rotation. |
-### IncidentManagementOncallSchedule
+### `IncidentManagementOncallSchedule`
Describes an incident management on-call schedule.
@@ -1953,9 +2375,9 @@ Describes an incident management on-call schedule.
| `rotations` | IncidentManagementOncallRotationConnection! | On-call rotations for the on-call schedule. |
| `timezone` | String! | Time zone of the on-call schedule. |
-### IncidentManagementOncallShift
+### `IncidentManagementOncallShift`
-A block of time for which a participant is on-call..
+A block of time for which a participant is on-call.
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -1963,7 +2385,7 @@ A block of time for which a participant is on-call..
| `participant` | OncallParticipantType | Participant assigned to the on-call shift. |
| `startsAt` | Time | Start time of the on-call shift. |
-### InstanceSecurityDashboard
+### `InstanceSecurityDashboard`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -1972,17 +2394,7 @@ A block of time for which a participant is on-call..
| `vulnerabilityScanners` | VulnerabilityScannerConnection | Vulnerability scanners reported on the vulnerabilities from projects selected in Instance Security Dashboard. |
| `vulnerabilitySeveritiesCount` | VulnerabilitySeveritiesCount | Counts for each vulnerability severity from projects selected in Instance Security Dashboard. |
-### InstanceStatisticsMeasurement
-
-Represents a recorded measurement (object count) for the Admins.
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| `count` | Int! | Object count. |
-| `identifier` | MeasurementIdentifier! | The type of objects being measured. |
-| `recordedAt` | Time | The time the measurement was recorded. |
-
-### Issue
+### `Issue`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -1991,6 +2403,7 @@ Represents a recorded measurement (object count) for the Admins.
| `author` | User! | User that created the issue. |
| `blocked` | Boolean! | Indicates the issue is blocked. |
| `blockedByCount` | Int | Count of issues blocking this issue. |
+| `blockedByIssues` | IssueConnection | Issues blocking this issue. |
| `closedAt` | Time | Timestamp of when the issue was closed. |
| `confidential` | Boolean! | Indicates the issue is confidential. |
| `createNoteEmail` | String | User specific email address for the issue. |
@@ -2041,7 +2454,7 @@ Represents a recorded measurement (object count) for the Admins.
| `webUrl` | String! | Web URL of the issue. |
| `weight` | Int | Weight of the issue. |
-### IssueMoveListPayload
+### `IssueMoveListPayload`
Autogenerated return type of IssueMoveList.
@@ -2051,7 +2464,7 @@ Autogenerated return type of IssueMoveList.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `issue` | Issue | The issue after mutation. |
-### IssueMovePayload
+### `IssueMovePayload`
Autogenerated return type of IssueMove.
@@ -2061,7 +2474,7 @@ Autogenerated return type of IssueMove.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `issue` | Issue | The issue after mutation. |
-### IssuePermissions
+### `IssuePermissions`
Check permissions for the current user on a issue.
@@ -2076,7 +2489,7 @@ Check permissions for the current user on a issue.
| `reopenIssue` | Boolean! | Indicates the user can perform `reopen_issue` on this resource |
| `updateIssue` | Boolean! | Indicates the user can perform `update_issue` on this resource |
-### IssueSetAssigneesPayload
+### `IssueSetAssigneesPayload`
Autogenerated return type of IssueSetAssignees.
@@ -2086,7 +2499,7 @@ Autogenerated return type of IssueSetAssignees.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `issue` | Issue | The issue after mutation. |
-### IssueSetConfidentialPayload
+### `IssueSetConfidentialPayload`
Autogenerated return type of IssueSetConfidential.
@@ -2096,7 +2509,7 @@ Autogenerated return type of IssueSetConfidential.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `issue` | Issue | The issue after mutation. |
-### IssueSetDueDatePayload
+### `IssueSetDueDatePayload`
Autogenerated return type of IssueSetDueDate.
@@ -2106,7 +2519,7 @@ Autogenerated return type of IssueSetDueDate.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `issue` | Issue | The issue after mutation. |
-### IssueSetEpicPayload
+### `IssueSetEpicPayload`
Autogenerated return type of IssueSetEpic.
@@ -2116,7 +2529,7 @@ Autogenerated return type of IssueSetEpic.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `issue` | Issue | The issue after mutation. |
-### IssueSetIterationPayload
+### `IssueSetIterationPayload`
Autogenerated return type of IssueSetIteration.
@@ -2126,7 +2539,7 @@ Autogenerated return type of IssueSetIteration.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `issue` | Issue | The issue after mutation. |
-### IssueSetLockedPayload
+### `IssueSetLockedPayload`
Autogenerated return type of IssueSetLocked.
@@ -2136,7 +2549,7 @@ Autogenerated return type of IssueSetLocked.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `issue` | Issue | The issue after mutation. |
-### IssueSetSeverityPayload
+### `IssueSetSeverityPayload`
Autogenerated return type of IssueSetSeverity.
@@ -2146,7 +2559,7 @@ Autogenerated return type of IssueSetSeverity.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `issue` | Issue | The issue after mutation. |
-### IssueSetSubscriptionPayload
+### `IssueSetSubscriptionPayload`
Autogenerated return type of IssueSetSubscription.
@@ -2156,7 +2569,7 @@ Autogenerated return type of IssueSetSubscription.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `issue` | Issue | The issue after mutation. |
-### IssueSetWeightPayload
+### `IssueSetWeightPayload`
Autogenerated return type of IssueSetWeight.
@@ -2166,7 +2579,7 @@ Autogenerated return type of IssueSetWeight.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `issue` | Issue | The issue after mutation. |
-### IssueStatusCountsType
+### `IssueStatusCountsType`
Represents total number of issues for the represented statuses.
@@ -2176,7 +2589,7 @@ Represents total number of issues for the represented statuses.
| `closed` | Int | Number of issues with status CLOSED for the project |
| `opened` | Int | Number of issues with status OPENED for the project |
-### Iteration
+### `Iteration`
Represents an iteration object.
@@ -2198,7 +2611,31 @@ Represents an iteration object.
| `webPath` | String! | Web path of the iteration. |
| `webUrl` | String! | Web URL of the iteration. |
-### JiraImport
+### `IterationCadence`
+
+Represents an iteration cadence.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `active` | Boolean | Whether the iteration cadence is active. |
+| `automatic` | Boolean | Whether the iteration cadence should automatically generate future iterations. |
+| `durationInWeeks` | Int! | Duration in weeks of the iterations within this cadence. |
+| `id` | IterationsCadenceID! | Global ID of the iteration cadence. |
+| `iterationsInAdvance` | Int! | Future iterations to be created when iteration cadence is set to automatic. |
+| `startDate` | Time | Timestamp of the iteration cadence start date. |
+| `title` | String! | Title of the iteration cadence. |
+
+### `IterationCadenceCreatePayload`
+
+Autogenerated return type of IterationCadenceCreate.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
+| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `iterationCadence` | IterationCadence | The created iteration cadence. |
+
+### `JiraImport`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -2210,7 +2647,7 @@ Represents an iteration object.
| `scheduledBy` | User | User that started the Jira import. |
| `totalIssueCount` | Int! | Total count of issues that were attempted to import. |
-### JiraImportStartPayload
+### `JiraImportStartPayload`
Autogenerated return type of JiraImportStart.
@@ -2220,7 +2657,7 @@ Autogenerated return type of JiraImportStart.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `jiraImport` | JiraImport | The Jira import data after mutation. |
-### JiraImportUsersPayload
+### `JiraImportUsersPayload`
Autogenerated return type of JiraImportUsers.
@@ -2230,7 +2667,7 @@ Autogenerated return type of JiraImportUsers.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `jiraUsers` | JiraUser! => Array | Users returned from Jira, matched by email and name if possible. |
-### JiraProject
+### `JiraProject`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -2238,7 +2675,7 @@ Autogenerated return type of JiraImportUsers.
| `name` | String | Name of the Jira project. |
| `projectId` | Int! | ID of the Jira project. |
-### JiraService
+### `JiraService`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -2246,7 +2683,7 @@ Autogenerated return type of JiraImportUsers.
| `projects` | JiraProjectConnection | List of all Jira projects fetched through Jira REST API. |
| `type` | String | Class name of the service. |
-### JiraUser
+### `JiraUser`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -2257,18 +2694,20 @@ Autogenerated return type of JiraImportUsers.
| `jiraDisplayName` | String! | Display name of the Jira user. |
| `jiraEmail` | String | Email of the Jira user, returned only for users with public emails. |
-### Label
+### `Label`
| Field | Type | Description |
| ----- | ---- | ----------- |
| `color` | String! | Background color of the label. |
+| `createdAt` | Time! | When this label was created. |
| `description` | String | Description of the label (Markdown rendered as HTML for caching). |
| `descriptionHtml` | String | The GitLab Flavored Markdown rendering of `description` |
| `id` | ID! | Label ID. |
| `textColor` | String! | Text color of the label. |
| `title` | String! | Content of the label. |
+| `updatedAt` | Time! | When this label was last updated. |
-### LabelCreatePayload
+### `LabelCreatePayload`
Autogenerated return type of LabelCreate.
@@ -2278,7 +2717,7 @@ Autogenerated return type of LabelCreate.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `label` | Label | The label after mutation. |
-### MarkAsSpamSnippetPayload
+### `MarkAsSpamSnippetPayload`
Autogenerated return type of MarkAsSpamSnippet.
@@ -2288,7 +2727,7 @@ Autogenerated return type of MarkAsSpamSnippet.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `snippet` | Snippet | The snippet after mutation. |
-### MergeRequest
+### `MergeRequest`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -2318,6 +2757,7 @@ Autogenerated return type of MarkAsSpamSnippet.
| `diffStatsSummary` | DiffStatsSummary | Summary of which files were changed in this merge request. |
| `discussionLocked` | Boolean! | Indicates if comments on the merge request are locked to members only. |
| `discussions` | DiscussionConnection! | All discussions on this noteable. |
+| `divergedFromTargetBranch` | Boolean! | Indicates if the source branch is behind the target branch. |
| `downvotes` | Int! | Number of downvotes for the merge request. |
| `forceRemoveSourceBranch` | Boolean | Indicates if the project settings will lead to source branch deletion after merge. |
| `hasCi` | Boolean! | Indicates if the merge request has CI. |
@@ -2348,6 +2788,7 @@ Autogenerated return type of MarkAsSpamSnippet.
| `reference` | String! | Internal reference of the merge request. Returned in shortened format by default. |
| `reviewers` | UserConnection | Users from whom a review has been requested. |
| `securityAutoFix` | Boolean | Indicates if the merge request is created by @GitLab-Security-Bot. |
+| `securityReportsUpToDateOnTargetBranch` | Boolean! | Indicates if the target branch security reports are out of date. |
| `shouldBeRebased` | Boolean! | Indicates if the merge request will be rebased. |
| `shouldRemoveSourceBranch` | Boolean | Indicates if the source branch of the merge request will be deleted after merge. |
| `sourceBranch` | String! | Source branch of the merge request. |
@@ -2374,9 +2815,19 @@ Autogenerated return type of MarkAsSpamSnippet.
| `userNotesCount` | Int | User notes count of the merge request. |
| `userPermissions` | MergeRequestPermissions! | Permissions for the current user on the resource |
| `webUrl` | String | Web URL of the merge request. |
-| `workInProgress` | Boolean! | Indicates if the merge request is a work in progress (WIP). |
+| `workInProgress` | Boolean! | Indicates if the merge request is a draft. |
+
+### `MergeRequestAcceptPayload`
+
+Autogenerated return type of MergeRequestAccept.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
+| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `mergeRequest` | MergeRequest | The merge request after mutation. |
-### MergeRequestCreatePayload
+### `MergeRequestCreatePayload`
Autogenerated return type of MergeRequestCreate.
@@ -2386,7 +2837,7 @@ Autogenerated return type of MergeRequestCreate.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `mergeRequest` | MergeRequest | The merge request after mutation. |
-### MergeRequestDiffRegistry
+### `MergeRequestDiffRegistry`
Represents the Geo sync and verification state of a Merge Request diff.
@@ -2401,7 +2852,7 @@ Represents the Geo sync and verification state of a Merge Request diff.
| `retryCount` | Int | Number of consecutive failed sync attempts of the MergeRequestDiffRegistry |
| `state` | RegistryState | Sync state of the MergeRequestDiffRegistry |
-### MergeRequestPermissions
+### `MergeRequestPermissions`
Check permissions for the current user on a merge request.
@@ -2417,7 +2868,7 @@ Check permissions for the current user on a merge request.
| `revertOnCurrentMergeRequest` | Boolean! | Indicates the user can perform `revert_on_current_merge_request` on this resource |
| `updateMergeRequest` | Boolean! | Indicates the user can perform `update_merge_request` on this resource |
-### MergeRequestReviewerRereviewPayload
+### `MergeRequestReviewerRereviewPayload`
Autogenerated return type of MergeRequestReviewerRereview.
@@ -2427,7 +2878,7 @@ Autogenerated return type of MergeRequestReviewerRereview.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `mergeRequest` | MergeRequest | The merge request after mutation. |
-### MergeRequestSetAssigneesPayload
+### `MergeRequestSetAssigneesPayload`
Autogenerated return type of MergeRequestSetAssignees.
@@ -2437,7 +2888,7 @@ Autogenerated return type of MergeRequestSetAssignees.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `mergeRequest` | MergeRequest | The merge request after mutation. |
-### MergeRequestSetLabelsPayload
+### `MergeRequestSetLabelsPayload`
Autogenerated return type of MergeRequestSetLabels.
@@ -2447,7 +2898,7 @@ Autogenerated return type of MergeRequestSetLabels.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `mergeRequest` | MergeRequest | The merge request after mutation. |
-### MergeRequestSetLockedPayload
+### `MergeRequestSetLockedPayload`
Autogenerated return type of MergeRequestSetLocked.
@@ -2457,7 +2908,7 @@ Autogenerated return type of MergeRequestSetLocked.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `mergeRequest` | MergeRequest | The merge request after mutation. |
-### MergeRequestSetMilestonePayload
+### `MergeRequestSetMilestonePayload`
Autogenerated return type of MergeRequestSetMilestone.
@@ -2467,7 +2918,7 @@ Autogenerated return type of MergeRequestSetMilestone.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `mergeRequest` | MergeRequest | The merge request after mutation. |
-### MergeRequestSetSubscriptionPayload
+### `MergeRequestSetSubscriptionPayload`
Autogenerated return type of MergeRequestSetSubscription.
@@ -2477,7 +2928,7 @@ Autogenerated return type of MergeRequestSetSubscription.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `mergeRequest` | MergeRequest | The merge request after mutation. |
-### MergeRequestSetWipPayload
+### `MergeRequestSetWipPayload`
Autogenerated return type of MergeRequestSetWip.
@@ -2487,7 +2938,7 @@ Autogenerated return type of MergeRequestSetWip.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `mergeRequest` | MergeRequest | The merge request after mutation. |
-### MergeRequestUpdatePayload
+### `MergeRequestUpdatePayload`
Autogenerated return type of MergeRequestUpdate.
@@ -2497,14 +2948,14 @@ Autogenerated return type of MergeRequestUpdate.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `mergeRequest` | MergeRequest | The merge request after mutation. |
-### Metadata
+### `Metadata`
| Field | Type | Description |
| ----- | ---- | ----------- |
| `revision` | String! | Revision. |
| `version` | String! | Version. |
-### MetricImage
+### `MetricImage`
Represents a metric image upload.
@@ -2516,7 +2967,7 @@ Represents a metric image upload.
| `iid` | ID! | Internal ID of the metric upload. |
| `url` | String! | URL of the metric source. |
-### MetricsDashboard
+### `MetricsDashboard`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -2524,7 +2975,7 @@ Represents a metric image upload.
| `path` | String | Path to a file with the dashboard definition. |
| `schemaValidationWarnings` | String! => Array | Dashboard schema validation warnings. |
-### MetricsDashboardAnnotation
+### `MetricsDashboardAnnotation`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -2534,7 +2985,7 @@ Represents a metric image upload.
| `panelId` | String | ID of a dashboard panel to which the annotation should be scoped. |
| `startingAt` | Time | Timestamp marking start of annotated time span. |
-### Milestone
+### `Milestone`
Represents a milestone.
@@ -2555,7 +3006,7 @@ Represents a milestone.
| `updatedAt` | Time! | Timestamp of last milestone update. |
| `webPath` | String! | Web path of the milestone. |
-### MilestoneStats
+### `MilestoneStats`
Contains statistics about a milestone.
@@ -2564,7 +3015,7 @@ Contains statistics about a milestone.
| `closedIssuesCount` | Int | Number of closed issues associated with the milestone. |
| `totalIssuesCount` | Int | Total number of issues associated with the milestone. |
-### Namespace
+### `Namespace`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -2592,7 +3043,7 @@ Contains statistics about a milestone.
| `totalRepositorySizeExcess` | Float | Total excess repository size of all projects in the root namespace in bytes. |
| `visibility` | String | Visibility of the namespace. |
-### NamespaceIncreaseStorageTemporarilyPayload
+### `NamespaceIncreaseStorageTemporarilyPayload`
Autogenerated return type of NamespaceIncreaseStorageTemporarily.
@@ -2602,7 +3053,7 @@ Autogenerated return type of NamespaceIncreaseStorageTemporarily.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `namespace` | Namespace | The namespace after mutation. |
-### Note
+### `Note`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -2625,7 +3076,7 @@ Autogenerated return type of NamespaceIncreaseStorageTemporarily.
| `url` | String | URL to view this Note in the Web UI. |
| `userPermissions` | NotePermissions! | Permissions for the current user on the resource |
-### NotePermissions
+### `NotePermissions`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -2636,7 +3087,7 @@ Autogenerated return type of NamespaceIncreaseStorageTemporarily.
| `repositionNote` | Boolean! | Indicates the user can perform `reposition_note` on this resource |
| `resolveNote` | Boolean! | Indicates the user can perform `resolve_note` on this resource |
-### OncallParticipantType
+### `OncallParticipantType`
The rotation participant and color palette.
@@ -2647,7 +3098,16 @@ The rotation participant and color palette.
| `id` | IncidentManagementOncallParticipantID! | ID of the on-call participant. |
| `user` | User! | The user who is participating. |
-### OncallRotationCreatePayload
+### `OncallRotationActivePeriodType`
+
+Active period time range for on-call rotation.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `endTime` | String | The end of the rotation active period. |
+| `startTime` | String | The start of the rotation active period. |
+
+### `OncallRotationCreatePayload`
Autogenerated return type of OncallRotationCreate.
@@ -2657,7 +3117,7 @@ Autogenerated return type of OncallRotationCreate.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `oncallRotation` | IncidentManagementOncallRotation | The on-call rotation. |
-### OncallRotationDestroyPayload
+### `OncallRotationDestroyPayload`
Autogenerated return type of OncallRotationDestroy.
@@ -2667,7 +3127,7 @@ Autogenerated return type of OncallRotationDestroy.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `oncallRotation` | IncidentManagementOncallRotation | The on-call rotation. |
-### OncallScheduleCreatePayload
+### `OncallScheduleCreatePayload`
Autogenerated return type of OncallScheduleCreate.
@@ -2677,7 +3137,7 @@ Autogenerated return type of OncallScheduleCreate.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `oncallSchedule` | IncidentManagementOncallSchedule | The on-call schedule. |
-### OncallScheduleDestroyPayload
+### `OncallScheduleDestroyPayload`
Autogenerated return type of OncallScheduleDestroy.
@@ -2687,7 +3147,7 @@ Autogenerated return type of OncallScheduleDestroy.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `oncallSchedule` | IncidentManagementOncallSchedule | The on-call schedule. |
-### OncallScheduleUpdatePayload
+### `OncallScheduleUpdatePayload`
Autogenerated return type of OncallScheduleUpdate.
@@ -2697,7 +3157,7 @@ Autogenerated return type of OncallScheduleUpdate.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `oncallSchedule` | IncidentManagementOncallSchedule | The on-call schedule. |
-### Package
+### `Package`
Represents a package in the Package Registry.
@@ -2715,7 +3175,7 @@ Represents a package in the Package Registry.
| `version` | String | Version string. |
| `versions` | PackageWithoutVersionsConnection | The other versions of the package. |
-### PackageComposerJsonType
+### `PackageComposerJsonType`
Represents a composer JSON file.
@@ -2726,7 +3186,7 @@ Represents a composer JSON file.
| `type` | String | The type set in the Composer JSON file. |
| `version` | String | The version set in the Composer JSON file. |
-### PackageFileRegistry
+### `PackageFileRegistry`
Represents the Geo sync and verification state of a package file.
@@ -2741,7 +3201,7 @@ Represents the Geo sync and verification state of a package file.
| `retryCount` | Int | Number of consecutive failed sync attempts of the PackageFileRegistry |
| `state` | RegistryState | Sync state of the PackageFileRegistry |
-### PackageSettings
+### `PackageSettings`
Namespace-level Package Registry settings.
@@ -2750,7 +3210,7 @@ Namespace-level Package Registry settings.
| `mavenDuplicateExceptionRegex` | UntrustedRegexp | When maven_duplicates_allowed is false, you can publish duplicate packages with names that match this regex. Otherwise, this setting has no effect. |
| `mavenDuplicatesAllowed` | Boolean! | Indicates whether duplicate Maven packages are allowed for this namespace. |
-### PackageTag
+### `PackageTag`
Represents a package tag.
@@ -2761,7 +3221,7 @@ Represents a package tag.
| `name` | String! | The name of the tag. |
| `updatedAt` | Time! | The updated date. |
-### PackageWithoutVersions
+### `PackageWithoutVersions`
Represents a version of a package in the Package Registry.
@@ -2778,9 +3238,9 @@ Represents a version of a package in the Package Registry.
| `updatedAt` | Time! | Date of most recent update. |
| `version` | String | Version string. |
-### PageInfo
+### `PageInfo`
-Information about pagination in a connection..
+Information about pagination in a connection.
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -2789,13 +3249,14 @@ Information about pagination in a connection..
| `hasPreviousPage` | Boolean! | When paginating backwards, are there more items? |
| `startCursor` | String | When paginating backwards, the cursor to continue. |
-### Pipeline
+### `Pipeline`
| Field | Type | Description |
| ----- | ---- | ----------- |
| `active` | Boolean! | Indicates if the pipeline is active. |
| `beforeSha` | String | Base SHA of the source branch. |
| `cancelable` | Boolean! | Specifies if a pipeline can be canceled. |
+| `commitPath` | String | Path to the commit that triggered the pipeline. |
| `committedAt` | Time | Timestamp of the pipeline's commit. |
| `configSource` | PipelineConfigSourceEnum | Configuration source of the pipeline (UNKNOWN_SOURCE, REPOSITORY_SOURCE, AUTO_DEVOPS_SOURCE, WEBIDE_SOURCE, REMOTE_SOURCE, EXTERNAL_PROJECT_SOURCE, BRIDGE_SOURCE, PARAMETER_SOURCE, COMPLIANCE_SOURCE) |
| `coverage` | Float | Coverage percentage. |
@@ -2810,6 +3271,7 @@ Information about pagination in a connection..
| `path` | String | Relative path to the pipeline's page. |
| `project` | Project | Project the pipeline belongs to. |
| `retryable` | Boolean! | Specifies if a pipeline can be retried. |
+| `securityReportFindings` | PipelineSecurityReportFindingConnection | Vulnerability findings reported on the pipeline. |
| `securityReportSummary` | SecurityReportSummary | Vulnerability and scanned resource counts for each security scanner of the pipeline. |
| `sha` | String! | SHA of the pipeline's commit. |
| `sourceJob` | CiJob | Job where pipeline was triggered from. |
@@ -2822,7 +3284,7 @@ Information about pagination in a connection..
| `userPermissions` | PipelinePermissions! | Permissions for the current user on the resource |
| `warnings` | Boolean! | Indicates if a pipeline has warnings. |
-### PipelineAnalytics
+### `PipelineAnalytics`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -2838,7 +3300,7 @@ Information about pagination in a connection..
| `yearPipelinesSuccessful` | Int! => Array | Total yearly successful pipeline count. |
| `yearPipelinesTotals` | Int! => Array | Total yearly pipeline count. |
-### PipelineCancelPayload
+### `PipelineCancelPayload`
Autogenerated return type of PipelineCancel.
@@ -2847,7 +3309,7 @@ Autogenerated return type of PipelineCancel.
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### PipelineDestroyPayload
+### `PipelineDestroyPayload`
Autogenerated return type of PipelineDestroy.
@@ -2856,7 +3318,7 @@ Autogenerated return type of PipelineDestroy.
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### PipelinePermissions
+### `PipelinePermissions`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -2864,7 +3326,7 @@ Autogenerated return type of PipelineDestroy.
| `destroyPipeline` | Boolean! | Indicates the user can perform `destroy_pipeline` on this resource |
| `updatePipeline` | Boolean! | Indicates the user can perform `update_pipeline` on this resource |
-### PipelineRetryPayload
+### `PipelineRetryPayload`
Autogenerated return type of PipelineRetry.
@@ -2874,7 +3336,26 @@ Autogenerated return type of PipelineRetry.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `pipeline` | Pipeline | The pipeline after mutation. |
-### Project
+### `PipelineSecurityReportFinding`
+
+Represents vulnerability finding of a security report on the pipeline.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `confidence` | String | Type of the security report that found the vulnerability. |
+| `description` | String | Description of the vulnerability finding. |
+| `identifiers` | VulnerabilityIdentifier! => Array | Identifiers of the vulnerabilit finding. |
+| `location` | VulnerabilityLocation | Location metadata for the vulnerability. Its fields depend on the type of security scan that found the vulnerability. |
+| `name` | String | Name of the vulnerability finding. |
+| `project` | Project | The project on which the vulnerability finding was found. |
+| `projectFingerprint` | String | Name of the vulnerability finding. |
+| `reportType` | VulnerabilityReportType | Type of the security report that found the vulnerability finding. |
+| `scanner` | VulnerabilityScanner | Scanner metadata for the vulnerability. |
+| `severity` | VulnerabilitySeverity | Severity of the vulnerability finding. |
+| `solution` | String | URL to the vulnerability's details page. |
+| `uuid` | String | Name of the vulnerability finding. |
+
+### `Project`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -2882,6 +3363,7 @@ Autogenerated return type of PipelineRetry.
| `alertManagementAlert` | AlertManagementAlert | A single Alert Management alert of the project. |
| `alertManagementAlertStatusCounts` | AlertManagementAlertStatusCountsType | Counts of alerts by status for the project. |
| `alertManagementAlerts` | AlertManagementAlertConnection | Alert Management alerts of the project. |
+| `alertManagementHttpIntegrations` | AlertManagementHttpIntegrationConnection | HTTP Integrations which can receive alerts for the project. |
| `alertManagementIntegrations` | AlertManagementIntegrationConnection | Integrations which can receive alerts for the project. |
| `alertManagementPayloadFields` | AlertManagementPayloadAlertField! => Array | Extract alert fields from payload for custom mapping. |
| `allowMergeOnSkippedPipeline` | Boolean | If `only_allow_merge_if_pipeline_succeeds` is true, indicates if merge requests of the project can also be merged with skipped jobs. |
@@ -2905,7 +3387,7 @@ Autogenerated return type of PipelineRetry.
| `dastScannerProfiles` | DastScannerProfileConnection | The DAST scanner profiles associated with the project. |
| `dastSiteProfile` | DastSiteProfile | DAST Site Profile associated with the project. |
| `dastSiteProfiles` | DastSiteProfileConnection | DAST Site Profiles associated with the project. |
-| `dastSiteValidations` | DastSiteValidationConnection | DAST Site Validations associated with the project. Always returns no nodes if `security_on_demand_scans_site_validation` is disabled. |
+| `dastSiteValidations` | DastSiteValidationConnection | DAST Site Validations associated with the project. |
| `description` | String | Short description of the project. |
| `descriptionHtml` | String | The GitLab Flavored Markdown rendering of `description` |
| `environment` | Environment | A single environment of the project. |
@@ -2949,6 +3431,7 @@ Autogenerated return type of PipelineRetry.
| `printingMergeRequestLinkEnabled` | Boolean | Indicates if a link to create or view a merge request should display after a push to Git repositories of the project from the command line. |
| `projectMembers` | MemberInterfaceConnection | Members of the project. |
| `publicJobs` | Boolean | Indicates if there is public access to pipelines and job details of the project, including output logs and artifacts. |
+| `pushRules` | PushRules | The project's push rules settings. |
| `release` | Release | A single release of the project. |
| `releases` | ReleaseConnection | Releases of the project. |
| `removeSourceBranchAfterMerge` | Boolean | Indicates if `Delete source branch` option should be enabled by default for all new merge requests of the project. |
@@ -2986,7 +3469,7 @@ Autogenerated return type of PipelineRetry.
| `webUrl` | String | Web URL of the project. |
| `wikiEnabled` | Boolean | Indicates if Wikis are enabled for the current user |
-### ProjectCiCdSetting
+### `ProjectCiCdSetting`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -2995,7 +3478,7 @@ Autogenerated return type of PipelineRetry.
| `mergeTrainsEnabled` | Boolean | Whether merge trains are enabled. |
| `project` | Project | Project the CI/CD settings belong to. |
-### ProjectMember
+### `ProjectMember`
Represents a Project Membership.
@@ -3011,7 +3494,7 @@ Represents a Project Membership.
| `user` | User! | User that is associated with the member object. |
| `userPermissions` | ProjectPermissions! | Permissions for the current user on the resource |
-### ProjectPermissions
+### `ProjectPermissions`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -3058,7 +3541,7 @@ Represents a Project Membership.
| `updateWiki` | Boolean! | Indicates the user can perform `update_wiki` on this resource |
| `uploadFile` | Boolean! | Indicates the user can perform `upload_file` on this resource |
-### ProjectStatistics
+### `ProjectStatistics`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -3072,7 +3555,7 @@ Represents a Project Membership.
| `uploadsSize` | Float | Uploads size of the project in bytes. |
| `wikiSize` | Float | Wiki size of the project in bytes. |
-### PrometheusAlert
+### `PrometheusAlert`
The alert condition for Prometheus.
@@ -3081,7 +3564,7 @@ The alert condition for Prometheus.
| `humanizedText` | String! | The human-readable text of the alert condition. |
| `id` | ID! | ID of the alert condition. |
-### PrometheusIntegrationCreatePayload
+### `PrometheusIntegrationCreatePayload`
Autogenerated return type of PrometheusIntegrationCreate.
@@ -3091,7 +3574,7 @@ Autogenerated return type of PrometheusIntegrationCreate.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `integration` | AlertManagementPrometheusIntegration | The newly created integration. |
-### PrometheusIntegrationResetTokenPayload
+### `PrometheusIntegrationResetTokenPayload`
Autogenerated return type of PrometheusIntegrationResetToken.
@@ -3101,7 +3584,7 @@ Autogenerated return type of PrometheusIntegrationResetToken.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `integration` | AlertManagementPrometheusIntegration | The newly created integration. |
-### PrometheusIntegrationUpdatePayload
+### `PrometheusIntegrationUpdatePayload`
Autogenerated return type of PrometheusIntegrationUpdate.
@@ -3111,7 +3594,7 @@ Autogenerated return type of PrometheusIntegrationUpdate.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `integration` | AlertManagementPrometheusIntegration | The newly created integration. |
-### PromoteToEpicPayload
+### `PromoteToEpicPayload`
Autogenerated return type of PromoteToEpic.
@@ -3122,7 +3605,15 @@ Autogenerated return type of PromoteToEpic.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `issue` | Issue | The issue after mutation. |
-### Release
+### `PushRules`
+
+Represents rules that commit pushes must follow.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `rejectUnsignedCommits` | Boolean! | Indicates whether commits not signed through GPG will be rejected. |
+
+### `Release`
Represents a release.
@@ -3143,7 +3634,7 @@ Represents a release.
| `tagPath` | String | Relative web path to the tag associated with the release. |
| `upcomingRelease` | Boolean | Indicates the release is an upcoming release. |
-### ReleaseAssetLink
+### `ReleaseAssetLink`
Represents an asset link associated with a release.
@@ -3156,7 +3647,17 @@ Represents an asset link associated with a release.
| `name` | String | Name of the link. |
| `url` | String | URL of the link. |
-### ReleaseAssets
+### `ReleaseAssetLinkCreatePayload`
+
+Autogenerated return type of ReleaseAssetLinkCreate.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
+| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `link` | ReleaseAssetLink | The asset link after mutation. |
+
+### `ReleaseAssets`
A container for all assets associated with a release.
@@ -3166,7 +3667,7 @@ A container for all assets associated with a release.
| `links` | ReleaseAssetLinkConnection | Asset links of the release. |
| `sources` | ReleaseSourceConnection | Sources of the release. |
-### ReleaseCreatePayload
+### `ReleaseCreatePayload`
Autogenerated return type of ReleaseCreate.
@@ -3176,7 +3677,7 @@ Autogenerated return type of ReleaseCreate.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `release` | Release | The release after mutation. |
-### ReleaseDeletePayload
+### `ReleaseDeletePayload`
Autogenerated return type of ReleaseDelete.
@@ -3186,7 +3687,7 @@ Autogenerated return type of ReleaseDelete.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `release` | Release | The deleted release. |
-### ReleaseEvidence
+### `ReleaseEvidence`
Evidence for a release.
@@ -3197,7 +3698,7 @@ Evidence for a release.
| `id` | ID! | ID of the evidence. |
| `sha` | String | SHA1 ID of the evidence hash. |
-### ReleaseLinks
+### `ReleaseLinks`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -3209,7 +3710,7 @@ Evidence for a release.
| `openedMergeRequestsUrl` | String | HTTP URL of the merge request page, filtered by this release and `state=open`. |
| `selfUrl` | String | HTTP URL of the release. |
-### ReleaseSource
+### `ReleaseSource`
Represents the source code attached to a release in a particular format.
@@ -3218,7 +3719,7 @@ Represents the source code attached to a release in a particular format.
| `format` | String | Format of the source. |
| `url` | String | Download URL of the source. |
-### ReleaseUpdatePayload
+### `ReleaseUpdatePayload`
Autogenerated return type of ReleaseUpdate.
@@ -3228,7 +3729,7 @@ Autogenerated return type of ReleaseUpdate.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `release` | Release | The release after mutation. |
-### RemoveAwardEmojiPayload
+### `RemoveAwardEmojiPayload`
Autogenerated return type of RemoveAwardEmoji.
@@ -3238,7 +3739,7 @@ Autogenerated return type of RemoveAwardEmoji.
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### RemoveProjectFromSecurityDashboardPayload
+### `RemoveProjectFromSecurityDashboardPayload`
Autogenerated return type of RemoveProjectFromSecurityDashboard.
@@ -3247,7 +3748,7 @@ Autogenerated return type of RemoveProjectFromSecurityDashboard.
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### RepositionImageDiffNotePayload
+### `RepositionImageDiffNotePayload`
Autogenerated return type of RepositionImageDiffNote.
@@ -3257,7 +3758,7 @@ Autogenerated return type of RepositionImageDiffNote.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `note` | Note | The note after mutation. |
-### Repository
+### `Repository`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -3266,7 +3767,7 @@ Autogenerated return type of RepositionImageDiffNote.
| `rootRef` | String | Default branch of the repository. |
| `tree` | Tree | Tree of the repository. |
-### Requirement
+### `Requirement`
Represents a requirement.
@@ -3288,7 +3789,7 @@ Represents a requirement.
| `updatedAt` | Time! | Timestamp of when the requirement was last updated. |
| `userPermissions` | RequirementPermissions! | Permissions for the current user on the resource |
-### RequirementPermissions
+### `RequirementPermissions`
Check permissions for the current user on a requirement.
@@ -3300,7 +3801,7 @@ Check permissions for the current user on a requirement.
| `readRequirement` | Boolean! | Indicates the user can perform `read_requirement` on this resource |
| `updateRequirement` | Boolean! | Indicates the user can perform `update_requirement` on this resource |
-### RequirementStatesCount
+### `RequirementStatesCount`
Counts of requirements by their state.
@@ -3309,7 +3810,7 @@ Counts of requirements by their state.
| `archived` | Int | Number of archived requirements. |
| `opened` | Int | Number of opened requirements. |
-### RevertVulnerabilityToDetectedPayload
+### `RevertVulnerabilityToDetectedPayload`
Autogenerated return type of RevertVulnerabilityToDetected.
@@ -3319,7 +3820,7 @@ Autogenerated return type of RevertVulnerabilityToDetected.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `vulnerability` | Vulnerability | The vulnerability after revert. |
-### RootStorageStatistics
+### `RootStorageStatistics`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -3333,7 +3834,7 @@ Autogenerated return type of RevertVulnerabilityToDetected.
| `uploadsSize` | Float! | The uploads size in bytes. |
| `wikiSize` | Float! | The wiki size in bytes. |
-### RunDASTScanPayload
+### `RunDASTScanPayload`
Autogenerated return type of RunDASTScan.
@@ -3343,14 +3844,14 @@ Autogenerated return type of RunDASTScan.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `pipelineUrl` | String | URL of the pipeline that was created. |
-### RunnerArchitecture
+### `RunnerArchitecture`
| Field | Type | Description |
| ----- | ---- | ----------- |
| `downloadLocation` | String! | Download location for the runner for the platform architecture. |
| `name` | String! | Name of the runner platform architecture. |
-### RunnerPlatform
+### `RunnerPlatform`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -3358,14 +3859,14 @@ Autogenerated return type of RunDASTScan.
| `humanReadableName` | String! | Human readable name of the runner platform. |
| `name` | String! | Name slug of the runner platform. |
-### RunnerSetup
+### `RunnerSetup`
| Field | Type | Description |
| ----- | ---- | ----------- |
| `installInstructions` | String! | Instructions for installing the runner on the specified architecture. |
| `registerInstructions` | String | Instructions for registering the runner. |
-### SastCiConfiguration
+### `SastCiConfiguration`
Represents a CI configuration of SAST.
@@ -3375,7 +3876,7 @@ Represents a CI configuration of SAST.
| `global` | SastCiConfigurationEntityConnection | List of global entities related to SAST configuration. |
| `pipeline` | SastCiConfigurationEntityConnection | List of pipeline entities related to SAST configuration. |
-### SastCiConfigurationAnalyzersEntity
+### `SastCiConfigurationAnalyzersEntity`
Represents an analyzer entity in SAST CI configuration.
@@ -3387,7 +3888,7 @@ Represents an analyzer entity in SAST CI configuration.
| `name` | String | Name of the analyzer. |
| `variables` | SastCiConfigurationEntityConnection | List of supported variables. |
-### SastCiConfigurationEntity
+### `SastCiConfigurationEntity`
Represents an entity in SAST CI configuration.
@@ -3402,7 +3903,7 @@ Represents an entity in SAST CI configuration.
| `type` | String | Type of the field value. |
| `value` | String | Current value of the entity. |
-### SastCiConfigurationOptionsEntity
+### `SastCiConfigurationOptionsEntity`
Represents an entity for options in SAST CI configuration.
@@ -3411,7 +3912,7 @@ Represents an entity for options in SAST CI configuration.
| `label` | String | Label of option entity. |
| `value` | String | Value of option entity. |
-### ScannedResource
+### `ScannedResource`
Represents a resource scanned by a security scan.
@@ -3420,7 +3921,7 @@ Represents a resource scanned by a security scan.
| `requestMethod` | String | The HTTP request method used to access the URL. |
| `url` | String | The URL scanned by the scanner. |
-### SecurityReportSummary
+### `SecurityReportSummary`
Represents summary of a security report.
@@ -3434,7 +3935,7 @@ Represents summary of a security report.
| `sast` | SecurityReportSummarySection | Aggregated counts for the `sast` scan |
| `secretDetection` | SecurityReportSummarySection | Aggregated counts for the `secret_detection` scan |
-### SecurityReportSummarySection
+### `SecurityReportSummarySection`
Represents a section of a summary of a security report.
@@ -3445,7 +3946,7 @@ Represents a section of a summary of a security report.
| `scannedResourcesCsvPath` | String | Path to download all the scanned resources in CSV format. |
| `vulnerabilitiesCount` | Int | Total number of vulnerabilities. |
-### SecurityScanners
+### `SecurityScanners`
Represents a list of security scanners.
@@ -3455,7 +3956,7 @@ Represents a list of security scanners.
| `enabled` | SecurityScannerType! => Array | List of analyzers which are enabled for the project. |
| `pipelineRun` | SecurityScannerType! => Array | List of analyzers which ran successfully in the latest pipeline. |
-### SentryDetailedError
+### `SentryDetailedError`
A Sentry error.
@@ -3490,7 +3991,7 @@ A Sentry error.
| `type` | String! | Type of the error. |
| `userCount` | Int! | Count of users affected by the error. |
-### SentryError
+### `SentryError`
A Sentry error. A simplified version of SentryDetailedError.
@@ -3514,7 +4015,7 @@ A Sentry error. A simplified version of SentryDetailedError.
| `type` | String! | Type of the error. |
| `userCount` | Int! | Count of users affected by the error. |
-### SentryErrorCollection
+### `SentryErrorCollection`
An object containing a collection of Sentry errors, and a detailed error.
@@ -3525,14 +4026,14 @@ An object containing a collection of Sentry errors, and a detailed error.
| `errors` | SentryErrorConnection | Collection of Sentry Errors. |
| `externalUrl` | String | External URL for Sentry. |
-### SentryErrorFrequency
+### `SentryErrorFrequency`
| Field | Type | Description |
| ----- | ---- | ----------- |
| `count` | Int! | Count of errors received since the previously recorded time. |
| `time` | Time! | Time the error frequency stats were recorded. |
-### SentryErrorStackTrace
+### `SentryErrorStackTrace`
An object containing a stack trace entry for a Sentry error.
@@ -3542,7 +4043,7 @@ An object containing a stack trace entry for a Sentry error.
| `issueId` | String! | ID of the Sentry error. |
| `stackTraceEntries` | SentryErrorStackTraceEntry! => Array | Stack trace entries for the Sentry error. |
-### SentryErrorStackTraceContext
+### `SentryErrorStackTraceContext`
An object context for a Sentry error stack trace.
@@ -3551,7 +4052,7 @@ An object context for a Sentry error stack trace.
| `code` | String! | Code number of the context. |
| `line` | Int! | Line number of the context. |
-### SentryErrorStackTraceEntry
+### `SentryErrorStackTraceEntry`
An object containing a stack trace entry for a Sentry error.
@@ -3563,7 +4064,7 @@ An object containing a stack trace entry for a Sentry error.
| `line` | String | Function in which the Sentry error occurred. |
| `traceContext` | SentryErrorStackTraceContext! => Array | Context of the Sentry error. |
-### SentryErrorTags
+### `SentryErrorTags`
State of a Sentry error.
@@ -3572,7 +4073,7 @@ State of a Sentry error.
| `level` | String | Severity level of the Sentry Error. |
| `logger` | String | Logger of the Sentry Error. |
-### Snippet
+### `Snippet`
Represents a snippet entry.
@@ -3598,7 +4099,7 @@ Represents a snippet entry.
| `visibilityLevel` | VisibilityLevelsEnum! | Visibility Level of the snippet. |
| `webUrl` | String! | Web URL of the snippet. |
-### SnippetBlob
+### `SnippetBlob`
Represents the snippet blob.
@@ -3617,7 +4118,7 @@ Represents the snippet blob.
| `simpleViewer` | SnippetBlobViewer! | Blob content simple viewer. |
| `size` | Int! | Blob size. |
-### SnippetBlobViewer
+### `SnippetBlobViewer`
Represents how the blob content should be displayed.
@@ -3631,7 +4132,7 @@ Represents how the blob content should be displayed.
| `tooLarge` | Boolean! | Shows whether the blob too large to be displayed. |
| `type` | BlobViewersType! | Type of blob viewer. |
-### SnippetPermissions
+### `SnippetPermissions`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -3642,7 +4143,7 @@ Represents how the blob content should be displayed.
| `reportSnippet` | Boolean! | Indicates the user can perform `report_snippet` on this resource |
| `updateSnippet` | Boolean! | Indicates the user can perform `update_snippet` on this resource |
-### SnippetRepositoryRegistry
+### `SnippetRepositoryRegistry`
Represents the Geo sync and verification state of a snippet repository.
@@ -3657,7 +4158,7 @@ Represents the Geo sync and verification state of a snippet repository.
| `snippetRepositoryId` | ID! | ID of the Snippet Repository. |
| `state` | RegistryState | Sync state of the SnippetRepositoryRegistry |
-### StatusAction
+### `StatusAction`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -3667,7 +4168,7 @@ Represents the Geo sync and verification state of a snippet repository.
| `path` | String | Path for the action. |
| `title` | String | Title for the action, for example: Retry. |
-### Submodule
+### `Submodule`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -3680,7 +4181,7 @@ Represents the Geo sync and verification state of a snippet repository.
| `type` | EntryType! | Type of tree entry. |
| `webUrl` | String | Web URL for the sub-module. |
-### TaskCompletionStatus
+### `TaskCompletionStatus`
Completion status of tasks.
@@ -3689,7 +4190,7 @@ Completion status of tasks.
| `completedCount` | Int! | Number of completed tasks. |
| `count` | Int! | Number of total tasks. |
-### TerraformState
+### `TerraformState`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -3701,7 +4202,7 @@ Completion status of tasks.
| `name` | String! | Name of the Terraform state. |
| `updatedAt` | Time! | Timestamp the Terraform state was updated. |
-### TerraformStateDeletePayload
+### `TerraformStateDeletePayload`
Autogenerated return type of TerraformStateDelete.
@@ -3710,7 +4211,7 @@ Autogenerated return type of TerraformStateDelete.
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### TerraformStateLockPayload
+### `TerraformStateLockPayload`
Autogenerated return type of TerraformStateLock.
@@ -3719,7 +4220,7 @@ Autogenerated return type of TerraformStateLock.
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### TerraformStateUnlockPayload
+### `TerraformStateUnlockPayload`
Autogenerated return type of TerraformStateUnlock.
@@ -3728,7 +4229,7 @@ Autogenerated return type of TerraformStateUnlock.
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### TerraformStateVersion
+### `TerraformStateVersion`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -3740,7 +4241,7 @@ Autogenerated return type of TerraformStateUnlock.
| `serial` | Int | Serial number of the version. |
| `updatedAt` | Time! | Timestamp the version was updated. |
-### TerraformStateVersionRegistry
+### `TerraformStateVersionRegistry`
Represents the Geo sync and verification state of a terraform state version.
@@ -3755,7 +4256,7 @@ Represents the Geo sync and verification state of a terraform state version.
| `state` | RegistryState | Sync state of the TerraformStateVersionRegistry |
| `terraformStateVersionId` | ID! | ID of the terraform state version. |
-### TestReport
+### `TestReport`
Represents a requirement test report.
@@ -3766,7 +4267,7 @@ Represents a requirement test report.
| `id` | ID! | ID of the test report. |
| `state` | TestReportState! | State of the test report. |
-### TimeReportStats
+### `TimeReportStats`
Represents the time report stats for timeboxes.
@@ -3776,7 +4277,7 @@ Represents the time report stats for timeboxes.
| `incomplete` | TimeboxMetrics | Incomplete issues metrics. |
| `total` | TimeboxMetrics | Total issues metrics. |
-### TimeboxMetrics
+### `TimeboxMetrics`
Represents measured stats metrics for timeboxes.
@@ -3785,7 +4286,7 @@ Represents measured stats metrics for timeboxes.
| `count` | Int! | The count metric. |
| `weight` | Int! | The weight metric. |
-### TimeboxReport
+### `TimeboxReport`
Represents a historically accurate report about the timebox.
@@ -3794,7 +4295,7 @@ Represents a historically accurate report about the timebox.
| `burnupTimeSeries` | BurnupChartDailyTotals! => Array | Daily scope and completed totals for burnup charts. |
| `stats` | TimeReportStats | Represents the time report stats for the timebox. |
-### Timelog
+### `Timelog`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -3804,7 +4305,7 @@ Represents a historically accurate report about the timebox.
| `timeSpent` | Int! | The time spent displayed in seconds. |
| `user` | User! | The user that logged the time. |
-### Todo
+### `Todo`
Representing a to-do entry.
@@ -3820,7 +4321,7 @@ Representing a to-do entry.
| `state` | TodoStateEnum! | State of the to-do item. |
| `targetType` | TodoTargetEnum! | Target type of the to-do item. |
-### TodoCreatePayload
+### `TodoCreatePayload`
Autogenerated return type of TodoCreate.
@@ -3830,7 +4331,7 @@ Autogenerated return type of TodoCreate.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `todo` | Todo | The to-do item created. |
-### TodoMarkDonePayload
+### `TodoMarkDonePayload`
Autogenerated return type of TodoMarkDone.
@@ -3840,7 +4341,7 @@ Autogenerated return type of TodoMarkDone.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `todo` | Todo! | The requested to-do item. |
-### TodoRestoreManyPayload
+### `TodoRestoreManyPayload`
Autogenerated return type of TodoRestoreMany.
@@ -3851,7 +4352,7 @@ Autogenerated return type of TodoRestoreMany.
| `todos` | Todo! => Array | Updated to-do items. |
| `updatedIds` **{warning-solid}** | TodoID! => Array | **Deprecated:** Use to-do items. Deprecated in 13.2. |
-### TodoRestorePayload
+### `TodoRestorePayload`
Autogenerated return type of TodoRestore.
@@ -3861,7 +4362,7 @@ Autogenerated return type of TodoRestore.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `todo` | Todo! | The requested to-do item. |
-### TodosMarkAllDonePayload
+### `TodosMarkAllDonePayload`
Autogenerated return type of TodosMarkAllDone.
@@ -3872,7 +4373,7 @@ Autogenerated return type of TodosMarkAllDone.
| `todos` | Todo! => Array | Updated to-do items. |
| `updatedIds` **{warning-solid}** | TodoID! => Array | **Deprecated:** Use to-do items. Deprecated in 13.2. |
-### ToggleAwardEmojiPayload
+### `ToggleAwardEmojiPayload`
Autogenerated return type of ToggleAwardEmoji.
@@ -3883,7 +4384,7 @@ Autogenerated return type of ToggleAwardEmoji.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `toggledOn` | Boolean! | Indicates the status of the emoji. True if the toggle awarded the emoji, and false if the toggle removed the emoji. |
-### Tree
+### `Tree`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -3892,7 +4393,7 @@ Autogenerated return type of ToggleAwardEmoji.
| `submodules` | SubmoduleConnection! | Sub-modules of the tree. |
| `trees` | TreeEntryConnection! | Trees of the tree. |
-### TreeEntry
+### `TreeEntry`
Represents a directory.
@@ -3907,7 +4408,7 @@ Represents a directory.
| `webPath` | String | Web path for the tree entry (directory). |
| `webUrl` | String | Web URL for the tree entry (directory). |
-### UpdateAlertStatusPayload
+### `UpdateAlertStatusPayload`
Autogenerated return type of UpdateAlertStatus.
@@ -3919,7 +4420,7 @@ Autogenerated return type of UpdateAlertStatus.
| `issue` | Issue | The issue created after mutation. |
| `todo` | Todo | The to-do item after mutation. |
-### UpdateBoardEpicUserPreferencesPayload
+### `UpdateBoardEpicUserPreferencesPayload`
Autogenerated return type of UpdateBoardEpicUserPreferences.
@@ -3929,7 +4430,7 @@ Autogenerated return type of UpdateBoardEpicUserPreferences.
| `epicUserPreferences` | BoardEpicUserPreferences | User preferences for the epic in the board after mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### UpdateBoardListPayload
+### `UpdateBoardListPayload`
Autogenerated return type of UpdateBoardList.
@@ -3939,7 +4440,7 @@ Autogenerated return type of UpdateBoardList.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `list` | BoardList | Mutated list. |
-### UpdateBoardPayload
+### `UpdateBoardPayload`
Autogenerated return type of UpdateBoard.
@@ -3949,7 +4450,7 @@ Autogenerated return type of UpdateBoard.
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### UpdateComplianceFrameworkPayload
+### `UpdateComplianceFrameworkPayload`
Autogenerated return type of UpdateComplianceFramework.
@@ -3959,7 +4460,7 @@ Autogenerated return type of UpdateComplianceFramework.
| `complianceFramework` | ComplianceFramework | The compliance framework after mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### UpdateContainerExpirationPolicyPayload
+### `UpdateContainerExpirationPolicyPayload`
Autogenerated return type of UpdateContainerExpirationPolicy.
@@ -3969,7 +4470,7 @@ Autogenerated return type of UpdateContainerExpirationPolicy.
| `containerExpirationPolicy` | ContainerExpirationPolicy | The container expiration policy after mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### UpdateEpicPayload
+### `UpdateEpicPayload`
Autogenerated return type of UpdateEpic.
@@ -3979,7 +4480,7 @@ Autogenerated return type of UpdateEpic.
| `epic` | Epic | The epic after mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### UpdateImageDiffNotePayload
+### `UpdateImageDiffNotePayload`
Autogenerated return type of UpdateImageDiffNote.
@@ -3989,7 +4490,7 @@ Autogenerated return type of UpdateImageDiffNote.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `note` | Note | The note after mutation. |
-### UpdateIssuePayload
+### `UpdateIssuePayload`
Autogenerated return type of UpdateIssue.
@@ -3999,7 +4500,7 @@ Autogenerated return type of UpdateIssue.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `issue` | Issue | The issue after mutation. |
-### UpdateIterationPayload
+### `UpdateIterationPayload`
Autogenerated return type of UpdateIteration.
@@ -4009,7 +4510,7 @@ Autogenerated return type of UpdateIteration.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `iteration` | Iteration | Updated iteration. |
-### UpdateNamespacePackageSettingsPayload
+### `UpdateNamespacePackageSettingsPayload`
Autogenerated return type of UpdateNamespacePackageSettings.
@@ -4019,7 +4520,7 @@ Autogenerated return type of UpdateNamespacePackageSettings.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `packageSettings` | PackageSettings | The namespace package setting after mutation. |
-### UpdateNotePayload
+### `UpdateNotePayload`
Autogenerated return type of UpdateNote.
@@ -4029,7 +4530,7 @@ Autogenerated return type of UpdateNote.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `note` | Note | The note after mutation. |
-### UpdateRequirementPayload
+### `UpdateRequirementPayload`
Autogenerated return type of UpdateRequirement.
@@ -4039,7 +4540,7 @@ Autogenerated return type of UpdateRequirement.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `requirement` | Requirement | Requirement after mutation. |
-### UpdateSnippetPayload
+### `UpdateSnippetPayload`
Autogenerated return type of UpdateSnippet.
@@ -4053,7 +4554,17 @@ Autogenerated return type of UpdateSnippet.
| `spam` | Boolean | Indicates whether the operation was detected as definite spam. There is no option to resubmit the request with a CAPTCHA response. |
| `spamLogId` | Int | The spam log ID which must be passed along with a valid CAPTCHA response for an operation to be completed. Included only when an operation was not completed because "NeedsCaptchaResponse" is true. |
-### User
+### `UsageTrendsMeasurement`
+
+Represents a recorded measurement (object count) for the Admins.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `count` | Int! | Object count. |
+| `identifier` | MeasurementIdentifier! | The type of objects being measured. |
+| `recordedAt` | Time | The time the measurement was recorded. |
+
+### `User`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -4061,6 +4572,7 @@ Autogenerated return type of UpdateSnippet.
| `authoredMergeRequests` | MergeRequestConnection | Merge Requests authored by the user. |
| `avatarUrl` | String | URL of the user's avatar. |
| `bot` | Boolean! | Indicates if the user is a bot. |
+| `callouts` | UserCalloutConnection | User callouts that belong to the user. |
| `email` **{warning-solid}** | String | **Deprecated:** Use public_email. Deprecated in 13.7. |
| `groupCount` | Int | Group count for the user. Available only when feature flag `user_group_counts` is enabled. |
| `groupMemberships` | GroupMemberConnection | Group memberships of the user. |
@@ -4080,13 +4592,30 @@ Autogenerated return type of UpdateSnippet.
| `webPath` | String! | Web path of the user. |
| `webUrl` | String! | Web URL of the user. |
-### UserPermissions
+### `UserCallout`
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `dismissedAt` | Time | Date when the callout was dismissed. |
+| `featureName` | UserCalloutFeatureNameEnum! | Name of the feature that the callout is for. |
+
+### `UserCalloutCreatePayload`
+
+Autogenerated return type of UserCalloutCreate.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
+| `errors` | String! => Array | Errors encountered during execution of the mutation. |
+| `userCallout` | UserCallout! | The user callout dismissed. |
+
+### `UserPermissions`
| Field | Type | Description |
| ----- | ---- | ----------- |
| `createSnippet` | Boolean! | Indicates the user can perform `create_snippet` on this resource |
-### UserStatus
+### `UserStatus`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -4095,7 +4624,7 @@ Autogenerated return type of UpdateSnippet.
| `message` | String | User status message. |
| `messageHtml` | String | HTML of the user status message |
-### VulnerabilitiesCountByDay
+### `VulnerabilitiesCountByDay`
Represents the count of vulnerabilities by severity on a particular day. This data is retained for 365 days.
@@ -4110,7 +4639,7 @@ Represents the count of vulnerabilities by severity on a particular day. This da
| `total` | Int! | Total number of vulnerabilities on a particular day. |
| `unknown` | Int! | Total number of vulnerabilities on a particular day with unknown severity |
-### VulnerabilitiesCountByDayAndSeverity
+### `VulnerabilitiesCountByDayAndSeverity`
Represents the number of vulnerabilities for a particular severity on a particular day. This data is retained for 365 days.
@@ -4120,7 +4649,7 @@ Represents the number of vulnerabilities for a particular severity on a particul
| `day` | ISO8601Date | Date for the count. |
| `severity` | VulnerabilitySeverity | Severity of the counted vulnerabilities. |
-### Vulnerability
+### `Vulnerability`
Represents a vulnerability.
@@ -4144,7 +4673,7 @@ Represents a vulnerability.
| `notes` | NoteConnection! | All notes on this noteable. |
| `primaryIdentifier` | VulnerabilityIdentifier | Primary identifier of the vulnerability. |
| `project` | Project | The project on which the vulnerability was found. |
-| `reportType` | VulnerabilityReportType | Type of the security report that found the vulnerability (SAST, DEPENDENCY_SCANNING, CONTAINER_SCANNING, DAST, SECRET_DETECTION, COVERAGE_FUZZING, API_FUZZING) |
+| `reportType` | VulnerabilityReportType | Type of the security report that found the vulnerability (SAST, DEPENDENCY_SCANNING, CONTAINER_SCANNING, DAST, SECRET_DETECTION, COVERAGE_FUZZING, API_FUZZING). `Scan Type` in the UI. |
| `resolvedAt` | Time | Timestamp of when the vulnerability state was changed to resolved. |
| `resolvedBy` | User | The user that resolved the vulnerability. |
| `resolvedOnDefaultBranch` | Boolean! | Indicates whether the vulnerability is fixed on the default branch or not. |
@@ -4156,7 +4685,7 @@ Represents a vulnerability.
| `userPermissions` | VulnerabilityPermissions! | Permissions for the current user on the resource |
| `vulnerabilityPath` | String | URL to the vulnerability's details page. |
-### VulnerabilityConfirmPayload
+### `VulnerabilityConfirmPayload`
Autogenerated return type of VulnerabilityConfirm.
@@ -4166,51 +4695,51 @@ Autogenerated return type of VulnerabilityConfirm.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `vulnerability` | Vulnerability | The vulnerability after state change. |
-### VulnerabilityDetailBase
+### `VulnerabilityDetailBase`
Represents the vulnerability details base.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String! | Description of the field. |
+| `description` | String | Description of the field. |
| `fieldName` | String | Name of the field. |
-| `name` | String! | Name of the field. |
+| `name` | String | Name of the field. |
-### VulnerabilityDetailBoolean
+### `VulnerabilityDetailBoolean`
Represents the vulnerability details boolean value.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String! | Description of the field. |
+| `description` | String | Description of the field. |
| `fieldName` | String | Name of the field. |
-| `name` | String! | Name of the field. |
+| `name` | String | Name of the field. |
| `value` | Boolean! | Value of the field. |
-### VulnerabilityDetailCode
+### `VulnerabilityDetailCode`
Represents the vulnerability details code field.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String! | Description of the field. |
+| `description` | String | Description of the field. |
| `fieldName` | String | Name of the field. |
| `lang` | String | Language of the code. |
-| `name` | String! | Name of the field. |
+| `name` | String | Name of the field. |
| `value` | String! | Source code. |
-### VulnerabilityDetailCommit
+### `VulnerabilityDetailCommit`
Represents the vulnerability details commit field.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String! | Description of the field. |
+| `description` | String | Description of the field. |
| `fieldName` | String | Name of the field. |
-| `name` | String! | Name of the field. |
+| `name` | String | Name of the field. |
| `value` | String! | The commit SHA value. |
-### VulnerabilityDetailDiff
+### `VulnerabilityDetailDiff`
Represents the vulnerability details diff field.
@@ -4218,104 +4747,104 @@ Represents the vulnerability details diff field.
| ----- | ---- | ----------- |
| `after` | String! | Value of the field after the change. |
| `before` | String! | Value of the field before the change. |
-| `description` | String! | Description of the field. |
+| `description` | String | Description of the field. |
| `fieldName` | String | Name of the field. |
-| `name` | String! | Name of the field. |
+| `name` | String | Name of the field. |
-### VulnerabilityDetailFileLocation
+### `VulnerabilityDetailFileLocation`
Represents the vulnerability details location within a file in the project.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String! | Description of the field. |
+| `description` | String | Description of the field. |
| `fieldName` | String | Name of the field. |
| `fileName` | String! | File name. |
| `lineEnd` | Int! | End line number of the file location. |
| `lineStart` | Int! | Start line number of the file location. |
-| `name` | String! | Name of the field. |
+| `name` | String | Name of the field. |
-### VulnerabilityDetailInt
+### `VulnerabilityDetailInt`
Represents the vulnerability details integer value.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String! | Description of the field. |
+| `description` | String | Description of the field. |
| `fieldName` | String | Name of the field. |
-| `name` | String! | Name of the field. |
+| `name` | String | Name of the field. |
| `value` | Int! | Value of the field. |
-### VulnerabilityDetailList
+### `VulnerabilityDetailList`
Represents the vulnerability details list value.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String! | Description of the field. |
+| `description` | String | Description of the field. |
| `fieldName` | String | Name of the field. |
| `items` | VulnerabilityDetail! => Array | List of details. |
-| `name` | String! | Name of the field. |
+| `name` | String | Name of the field. |
-### VulnerabilityDetailMarkdown
+### `VulnerabilityDetailMarkdown`
Represents the vulnerability details Markdown field.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String! | Description of the field. |
+| `description` | String | Description of the field. |
| `fieldName` | String | Name of the field. |
-| `name` | String! | Name of the field. |
+| `name` | String | Name of the field. |
| `value` | String! | Value of the Markdown field. |
-### VulnerabilityDetailModuleLocation
+### `VulnerabilityDetailModuleLocation`
Represents the vulnerability details location within a file in the project.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String! | Description of the field. |
+| `description` | String | Description of the field. |
| `fieldName` | String | Name of the field. |
| `moduleName` | String! | Module name. |
-| `name` | String! | Name of the field. |
+| `name` | String | Name of the field. |
| `offset` | Int! | Offset of the module location. |
-### VulnerabilityDetailTable
+### `VulnerabilityDetailTable`
Represents the vulnerability details table value.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String! | Description of the field. |
+| `description` | String | Description of the field. |
| `fieldName` | String | Name of the field. |
| `headers` | VulnerabilityDetail! => Array | Table headers. |
-| `name` | String! | Name of the field. |
+| `name` | String | Name of the field. |
| `rows` | VulnerabilityDetail! => Array | Table rows. |
-### VulnerabilityDetailText
+### `VulnerabilityDetailText`
Represents the vulnerability details text field.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String! | Description of the field. |
+| `description` | String | Description of the field. |
| `fieldName` | String | Name of the field. |
-| `name` | String! | Name of the field. |
+| `name` | String | Name of the field. |
| `value` | String! | Value of the text field. |
-### VulnerabilityDetailUrl
+### `VulnerabilityDetailUrl`
Represents the vulnerability details URL field.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String! | Description of the field. |
+| `description` | String | Description of the field. |
| `fieldName` | String | Name of the field. |
| `href` | String! | Href of the URL. |
-| `name` | String! | Name of the field. |
+| `name` | String | Name of the field. |
| `text` | String | Text of the URL. |
-### VulnerabilityDismissPayload
+### `VulnerabilityDismissPayload`
Autogenerated return type of VulnerabilityDismiss.
@@ -4325,7 +4854,7 @@ Autogenerated return type of VulnerabilityDismiss.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `vulnerability` | Vulnerability | The vulnerability after dismissal. |
-### VulnerabilityExternalIssueLink
+### `VulnerabilityExternalIssueLink`
Represents an external issue link of a vulnerability.
@@ -4335,7 +4864,7 @@ Represents an external issue link of a vulnerability.
| `id` | VulnerabilitiesExternalIssueLinkID! | GraphQL ID of the external issue link. |
| `linkType` | VulnerabilityExternalIssueLinkType! | Type of the external issue link. |
-### VulnerabilityExternalIssueLinkCreatePayload
+### `VulnerabilityExternalIssueLinkCreatePayload`
Autogenerated return type of VulnerabilityExternalIssueLinkCreate.
@@ -4345,7 +4874,7 @@ Autogenerated return type of VulnerabilityExternalIssueLinkCreate.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `externalIssueLink` | VulnerabilityExternalIssueLink | The created external issue link. |
-### VulnerabilityExternalIssueLinkDestroyPayload
+### `VulnerabilityExternalIssueLinkDestroyPayload`
Autogenerated return type of VulnerabilityExternalIssueLinkDestroy.
@@ -4354,7 +4883,7 @@ Autogenerated return type of VulnerabilityExternalIssueLinkDestroy.
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-### VulnerabilityIdentifier
+### `VulnerabilityIdentifier`
Represents a vulnerability identifier.
@@ -4365,7 +4894,7 @@ Represents a vulnerability identifier.
| `name` | String | Name of the vulnerability identifier. |
| `url` | String | URL of the vulnerability identifier. |
-### VulnerabilityIssueLink
+### `VulnerabilityIssueLink`
Represents an issue link of a vulnerability.
@@ -4375,7 +4904,7 @@ Represents an issue link of a vulnerability.
| `issue` | Issue! | The issue attached to issue link. |
| `linkType` | VulnerabilityIssueLinkType! | Type of the issue link. |
-### VulnerabilityLocationContainerScanning
+### `VulnerabilityLocationContainerScanning`
Represents the location of a vulnerability found by a container security scan.
@@ -4385,7 +4914,7 @@ Represents the location of a vulnerability found by a container security scan.
| `image` | String | Name of the vulnerable container image. |
| `operatingSystem` | String | Operating system that runs on the vulnerable container image. |
-### VulnerabilityLocationCoverageFuzzing
+### `VulnerabilityLocationCoverageFuzzing`
Represents the location of a vulnerability found by a Coverage Fuzzing scan.
@@ -4398,7 +4927,7 @@ Represents the location of a vulnerability found by a Coverage Fuzzing scan.
| `vulnerableClass` | String | Class containing the vulnerability. |
| `vulnerableMethod` | String | Method containing the vulnerability. |
-### VulnerabilityLocationDast
+### `VulnerabilityLocationDast`
Represents the location of a vulnerability found by a DAST scan.
@@ -4409,7 +4938,7 @@ Represents the location of a vulnerability found by a DAST scan.
| `path` | String | URL path and query string of the vulnerable request. |
| `requestMethod` | String | HTTP method of the vulnerable request. |
-### VulnerabilityLocationDependencyScanning
+### `VulnerabilityLocationDependencyScanning`
Represents the location of a vulnerability found by a dependency security scan.
@@ -4419,7 +4948,7 @@ Represents the location of a vulnerability found by a dependency security scan.
| `dependency` | VulnerableDependency | Dependency containing the vulnerability. |
| `file` | String | Path to the vulnerable file. |
-### VulnerabilityLocationSast
+### `VulnerabilityLocationSast`
Represents the location of a vulnerability found by a SAST scan.
@@ -4432,7 +4961,7 @@ Represents the location of a vulnerability found by a SAST scan.
| `vulnerableClass` | String | Class containing the vulnerability. |
| `vulnerableMethod` | String | Method containing the vulnerability. |
-### VulnerabilityLocationSecretDetection
+### `VulnerabilityLocationSecretDetection`
Represents the location of a vulnerability found by a secret detection scan.
@@ -4445,7 +4974,7 @@ Represents the location of a vulnerability found by a secret detection scan.
| `vulnerableClass` | String | Class containing the vulnerability. |
| `vulnerableMethod` | String | Method containing the vulnerability. |
-### VulnerabilityPermissions
+### `VulnerabilityPermissions`
Check permissions for the current user on a vulnerability.
@@ -4461,7 +4990,7 @@ Check permissions for the current user on a vulnerability.
| `readVulnerabilityFeedback` | Boolean! | Indicates the user can perform `read_vulnerability_feedback` on this resource |
| `updateVulnerabilityFeedback` | Boolean! | Indicates the user can perform `update_vulnerability_feedback` on this resource |
-### VulnerabilityResolvePayload
+### `VulnerabilityResolvePayload`
Autogenerated return type of VulnerabilityResolve.
@@ -4471,7 +5000,7 @@ Autogenerated return type of VulnerabilityResolve.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `vulnerability` | Vulnerability | The vulnerability after state change. |
-### VulnerabilityRevertToDetectedPayload
+### `VulnerabilityRevertToDetectedPayload`
Autogenerated return type of VulnerabilityRevertToDetected.
@@ -4481,7 +5010,7 @@ Autogenerated return type of VulnerabilityRevertToDetected.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `vulnerability` | Vulnerability | The vulnerability after revert. |
-### VulnerabilityScanner
+### `VulnerabilityScanner`
Represents a vulnerability scanner.
@@ -4492,7 +5021,7 @@ Represents a vulnerability scanner.
| `reportType` | VulnerabilityReportType | Type of the vulnerability report. |
| `vendor` | String | Vendor of the vulnerability scanner. |
-### VulnerabilitySeveritiesCount
+### `VulnerabilitySeveritiesCount`
Represents vulnerability counts by severity.
@@ -4505,7 +5034,7 @@ Represents vulnerability counts by severity.
| `medium` | Int | Number of vulnerabilities of MEDIUM severity of the project |
| `unknown` | Int | Number of vulnerabilities of UNKNOWN severity of the project |
-### VulnerableDependency
+### `VulnerableDependency`
Represents a vulnerable dependency. Used in vulnerability location data.
@@ -4514,7 +5043,7 @@ Represents a vulnerable dependency. Used in vulnerability location data.
| `package` | VulnerablePackage | The package associated with the vulnerable dependency. |
| `version` | String | The version of the vulnerable dependency. |
-### VulnerablePackage
+### `VulnerablePackage`
Represents a vulnerable package. Used in vulnerability dependency data.
@@ -4522,7 +5051,7 @@ Represents a vulnerable package. Used in vulnerability dependency data.
| ----- | ---- | ----------- |
| `name` | String | The name of the vulnerable package. |
-### VulnerableProjectsByGrade
+### `VulnerableProjectsByGrade`
Represents vulnerability letter grades with associated projects.
@@ -4541,67 +5070,68 @@ For more information, see
[Enumeration Types](https://graphql.org/learn/schema/#enumeration-types)
on `graphql.org`.
-### AccessLevelEnum
+### `AccessLevelEnum`
Access level to a resource.
| Value | Description |
| ----- | ----------- |
-| `DEVELOPER` | |
-| `GUEST` | |
-| `MAINTAINER` | |
-| `NO_ACCESS` | |
-| `OWNER` | |
-| `REPORTER` | |
+| `DEVELOPER` | Developer access |
+| `GUEST` | Guest access |
+| `MAINTAINER` | Maintainer access |
+| `MINIMAL_ACCESS` | Minimal access |
+| `NO_ACCESS` | No access |
+| `OWNER` | Owner access |
+| `REPORTER` | Reporter access |
-### AlertManagementAlertSort
+### `AlertManagementAlertSort`
Values for sorting alerts.
| Value | Description |
| ----- | ----------- |
-| `CREATED_ASC` | Created at ascending order |
-| `CREATED_DESC` | Created at descending order |
-| `CREATED_TIME_ASC` | Created time by ascending order |
-| `CREATED_TIME_DESC` | Created time by descending order |
-| `ENDED_AT_ASC` | End time by ascending order |
-| `ENDED_AT_DESC` | End time by descending order |
-| `EVENT_COUNT_ASC` | Events count by ascending order |
-| `EVENT_COUNT_DESC` | Events count by descending order |
-| `SEVERITY_ASC` | Severity from less critical to more critical |
-| `SEVERITY_DESC` | Severity from more critical to less critical |
-| `STARTED_AT_ASC` | Start time by ascending order |
-| `STARTED_AT_DESC` | Start time by descending order |
-| `STATUS_ASC` | Status by order: Ignored > Resolved > Acknowledged > Triggered |
-| `STATUS_DESC` | Status by order: Triggered > Acknowledged > Resolved > Ignored |
-| `UPDATED_ASC` | Updated at ascending order |
-| `UPDATED_DESC` | Updated at descending order |
-| `UPDATED_TIME_ASC` | Created time by ascending order |
-| `UPDATED_TIME_DESC` | Created time by descending order |
+| `CREATED_ASC` | Created at ascending order. |
+| `CREATED_DESC` | Created at descending order. |
+| `CREATED_TIME_ASC` | Created time by ascending order. |
+| `CREATED_TIME_DESC` | Created time by descending order. |
+| `ENDED_AT_ASC` | End time by ascending order. |
+| `ENDED_AT_DESC` | End time by descending order. |
+| `EVENT_COUNT_ASC` | Events count by ascending order. |
+| `EVENT_COUNT_DESC` | Events count by descending order. |
+| `SEVERITY_ASC` | Severity from less critical to more critical. |
+| `SEVERITY_DESC` | Severity from more critical to less critical. |
+| `STARTED_AT_ASC` | Start time by ascending order. |
+| `STARTED_AT_DESC` | Start time by descending order. |
+| `STATUS_ASC` | Status by order: Ignored > Resolved > Acknowledged > Triggered. |
+| `STATUS_DESC` | Status by order: Triggered > Acknowledged > Resolved > Ignored. |
+| `UPDATED_ASC` | Updated at ascending order. |
+| `UPDATED_DESC` | Updated at descending order. |
+| `UPDATED_TIME_ASC` | Created time by ascending order. |
+| `UPDATED_TIME_DESC` | Created time by descending order. |
| `created_asc` **{warning-solid}** | **Deprecated:** Use CREATED_ASC. Deprecated in 13.5. |
| `created_desc` **{warning-solid}** | **Deprecated:** Use CREATED_DESC. Deprecated in 13.5. |
| `updated_asc` **{warning-solid}** | **Deprecated:** Use UPDATED_ASC. Deprecated in 13.5. |
| `updated_desc` **{warning-solid}** | **Deprecated:** Use UPDATED_DESC. Deprecated in 13.5. |
-### AlertManagementDomainFilter
+### `AlertManagementDomainFilter`
Filters the alerts based on given domain.
| Value | Description |
| ----- | ----------- |
-| `operations` | Alerts for operations domain |
-| `threat_monitoring` | Alerts for threat monitoring domain |
+| `operations` | Alerts for operations domain. |
+| `threat_monitoring` | Alerts for threat monitoring domain. |
-### AlertManagementIntegrationType
+### `AlertManagementIntegrationType`
Values of types of integrations.
| Value | Description |
| ----- | ----------- |
-| `HTTP` | Integration with any monitoring tool |
-| `PROMETHEUS` | Prometheus integration |
+| `HTTP` | Integration with any monitoring tool. |
+| `PROMETHEUS` | Prometheus integration. |
-### AlertManagementPayloadAlertFieldName
+### `AlertManagementPayloadAlertFieldName`
Values for alert field names used in the custom mapping.
@@ -4618,17 +5148,17 @@ Values for alert field names used in the custom mapping.
| `START_TIME` | The time of the incident. |
| `TITLE` | The title of the incident. |
-### AlertManagementPayloadAlertFieldType
+### `AlertManagementPayloadAlertFieldType`
Values for alert field types used in the custom mapping.
| Value | Description |
| ----- | ----------- |
-| `ARRAY` | Array field type |
-| `DATETIME` | DateTime field type |
-| `STRING` | String field type |
+| `ARRAY` | Array field type. |
+| `DATETIME` | DateTime field type. |
+| `STRING` | String field type. |
-### AlertManagementSeverity
+### `AlertManagementSeverity`
Alert severity values.
@@ -4641,7 +5171,7 @@ Alert severity values.
| `MEDIUM` | Medium severity |
| `UNKNOWN` | Unknown severity |
-### AlertManagementStatus
+### `AlertManagementStatus`
Alert status values.
@@ -4652,7 +5182,7 @@ Alert status values.
| `RESOLVED` | Resolved status |
| `TRIGGERED` | Triggered status |
-### ApiFuzzingScanMode
+### `ApiFuzzingScanMode`
All possible ways to specify the API surface for an API fuzzing scan.
@@ -4660,8 +5190,9 @@ All possible ways to specify the API surface for an API fuzzing scan.
| ----- | ----------- |
| `HAR` | The API surface is specified by a HAR file. |
| `OPENAPI` | The API surface is specified by a OPENAPI file. |
+| `POSTMAN` | The API surface is specified by a POSTMAN file. |
-### AvailabilityEnum
+### `AvailabilityEnum`
User availability status.
@@ -4670,45 +5201,45 @@ User availability status.
| `BUSY` | Busy |
| `NOT_SET` | Not Set |
-### BlobViewersType
+### `BlobViewersType`
Types of blob viewers.
| Value | Description |
| ----- | ----------- |
-| `auxiliary` | |
-| `rich` | |
-| `simple` | |
+| `auxiliary` | Auxiliary blob viewers type. |
+| `rich` | Rich blob viewers type. |
+| `simple` | Simple blob viewers type. |
-### CiConfigStatus
+### `CiConfigStatus`
Values for YAML processor result.
| Value | Description |
| ----- | ----------- |
-| `INVALID` | The configuration file is not valid |
-| `VALID` | The configuration file is valid |
+| `INVALID` | The configuration file is not valid. |
+| `VALID` | The configuration file is valid. |
-### CommitActionMode
+### `CommitActionMode`
Mode of a commit action.
| Value | Description |
| ----- | ----------- |
-| `CHMOD` | Chmod command |
-| `CREATE` | Create command |
-| `DELETE` | Delete command |
-| `MOVE` | Move command |
-| `UPDATE` | Update command |
+| `CHMOD` | Chmod command. |
+| `CREATE` | Create command. |
+| `DELETE` | Delete command. |
+| `MOVE` | Move command. |
+| `UPDATE` | Update command. |
-### CommitEncoding
+### `CommitEncoding`
| Value | Description |
| ----- | ----------- |
-| `BASE64` | Base64 encoding |
-| `TEXT` | Text encoding |
+| `BASE64` | Base64 encoding. |
+| `TEXT` | Text encoding. |
-### ContainerExpirationPolicyCadenceEnum
+### `ContainerExpirationPolicyCadenceEnum`
| Value | Description |
| ----- | ----------- |
@@ -4718,7 +5249,7 @@ Mode of a commit action.
| `EVERY_TWO_WEEKS` | Every two weeks |
| `EVERY_WEEK` | Every week |
-### ContainerExpirationPolicyKeepEnum
+### `ContainerExpirationPolicyKeepEnum`
| Value | Description |
| ----- | ----------- |
@@ -4729,7 +5260,7 @@ Mode of a commit action.
| `TEN_TAGS` | 10 tags per image name |
| `TWENTY_FIVE_TAGS` | 25 tags per image name |
-### ContainerExpirationPolicyOlderThanEnum
+### `ContainerExpirationPolicyOlderThanEnum`
| Value | Description |
| ----- | ----------- |
@@ -4738,7 +5269,7 @@ Mode of a commit action.
| `SEVEN_DAYS` | 7 days until tags are automatically removed |
| `THIRTY_DAYS` | 30 days until tags are automatically removed |
-### ContainerRepositoryCleanupStatus
+### `ContainerRepositoryCleanupStatus`
Status of the tags cleanup of a container repository.
@@ -4749,24 +5280,24 @@ Status of the tags cleanup of a container repository.
| `UNFINISHED` | The tags cleanup has been partially executed. There are still remaining tags to delete. |
| `UNSCHEDULED` | The tags cleanup is not scheduled. This is the default state. |
-### ContainerRepositorySort
+### `ContainerRepositorySort`
Values for sorting container repositories.
| Value | Description |
| ----- | ----------- |
-| `CREATED_ASC` | Created at ascending order |
-| `CREATED_DESC` | Created at descending order |
-| `NAME_ASC` | Name by ascending order |
-| `NAME_DESC` | Name by descending order |
-| `UPDATED_ASC` | Updated at ascending order |
-| `UPDATED_DESC` | Updated at descending order |
+| `CREATED_ASC` | Created at ascending order. |
+| `CREATED_DESC` | Created at descending order. |
+| `NAME_ASC` | Name by ascending order. |
+| `NAME_DESC` | Name by descending order. |
+| `UPDATED_ASC` | Updated at ascending order. |
+| `UPDATED_DESC` | Updated at descending order. |
| `created_asc` **{warning-solid}** | **Deprecated:** Use CREATED_ASC. Deprecated in 13.5. |
| `created_desc` **{warning-solid}** | **Deprecated:** Use CREATED_DESC. Deprecated in 13.5. |
| `updated_asc` **{warning-solid}** | **Deprecated:** Use UPDATED_ASC. Deprecated in 13.5. |
| `updated_desc` **{warning-solid}** | **Deprecated:** Use UPDATED_DESC. Deprecated in 13.5. |
-### ContainerRepositoryStatus
+### `ContainerRepositoryStatus`
Status of a container repository.
@@ -4775,31 +5306,31 @@ Status of a container repository.
| `DELETE_FAILED` | Delete Failed status. |
| `DELETE_SCHEDULED` | Delete Scheduled status. |
-### DastScanTypeEnum
+### `DastScanTypeEnum`
| Value | Description |
| ----- | ----------- |
| `ACTIVE` | Active DAST scan. This scan will make active attacks against the target site. |
| `PASSIVE` | Passive DAST scan. This scan will not make active attacks against the target site. |
-### DastSiteProfileValidationStatusEnum
+### `DastSiteProfileValidationStatusEnum`
| Value | Description |
| ----- | ----------- |
-| `FAILED_VALIDATION` | Site validation process finished but failed |
-| `INPROGRESS_VALIDATION` | Site validation process is in progress |
-| `NONE` | No site validation exists |
-| `PASSED_VALIDATION` | Site validation process finished successfully |
-| `PENDING_VALIDATION` | Site validation process has not started |
+| `FAILED_VALIDATION` | Site validation process finished but failed. |
+| `INPROGRESS_VALIDATION` | Site validation process is in progress. |
+| `NONE` | No site validation exists. |
+| `PASSED_VALIDATION` | Site validation process finished successfully. |
+| `PENDING_VALIDATION` | Site validation process has not started. |
-### DastSiteValidationStrategyEnum
+### `DastSiteValidationStrategyEnum`
| Value | Description |
| ----- | ----------- |
-| `HEADER` | Header validation |
-| `TEXT_FILE` | Text file validation |
+| `HEADER` | Header validation. |
+| `TEXT_FILE` | Text file validation. |
-### DataVisualizationColorEnum
+### `DataVisualizationColorEnum`
Color of the data visualization palette.
@@ -4811,7 +5342,7 @@ Color of the data visualization palette.
| `MAGENTA` | Magenta color |
| `ORANGE` | Orange color |
-### DataVisualizationWeightEnum
+### `DataVisualizationWeightEnum`
Weight of the data visualization palette.
@@ -4829,7 +5360,7 @@ Weight of the data visualization palette.
| `WEIGHT_900` | 900 weight |
| `WEIGHT_950` | 950 weight |
-### DesignCollectionCopyState
+### `DesignCollectionCopyState`
Copy state of a DesignCollection.
@@ -4839,7 +5370,7 @@ Copy state of a DesignCollection.
| `IN_PROGRESS` | The DesignCollection is being copied |
| `READY` | The DesignCollection has no copy in progress |
-### DesignVersionEvent
+### `DesignVersionEvent`
Mutation event of a design within a version.
@@ -4848,18 +5379,18 @@ Mutation event of a design within a version.
| `CREATION` | A creation event |
| `DELETION` | A deletion event |
| `MODIFICATION` | A modification event |
-| `NONE` | No change |
+| `NONE` | No change. |
-### DiffPositionType
+### `DiffPositionType`
Type of file the position refers to.
| Value | Description |
| ----- | ----------- |
-| `image` | |
-| `text` | |
+| `image` | An image |
+| `text` | A text file |
-### EntryType
+### `EntryType`
Type of a tree entry.
@@ -4869,18 +5400,18 @@ Type of a tree entry.
| `commit` | |
| `tree` | |
-### EpicSort
+### `EpicSort`
Roadmap sort values.
| Value | Description |
| ----- | ----------- |
-| `end_date_asc` | End date at ascending order |
-| `end_date_desc` | End date at descending order |
-| `start_date_asc` | Start date at ascending order |
-| `start_date_desc` | Start date at descending order |
+| `end_date_asc` | End date at ascending order. |
+| `end_date_desc` | End date at descending order. |
+| `start_date_asc` | Start date at ascending order. |
+| `start_date_desc` | Start date at descending order. |
-### EpicState
+### `EpicState`
State of an epic.
@@ -4890,25 +5421,25 @@ State of an epic.
| `closed` | |
| `opened` | |
-### EpicStateEvent
+### `EpicStateEvent`
State event of an epic.
| Value | Description |
| ----- | ----------- |
-| `CLOSE` | Close the epic |
-| `REOPEN` | Reopen the epic |
+| `CLOSE` | Close the epic. |
+| `REOPEN` | Reopen the epic. |
-### EpicWildcardId
+### `EpicWildcardId`
Epic ID wildcard values.
| Value | Description |
| ----- | ----------- |
-| `ANY` | Any epic is assigned |
-| `NONE` | No epic is assigned |
+| `ANY` | Any epic is assigned. |
+| `NONE` | No epic is assigned. |
-### EventAction
+### `EventAction`
Event action.
@@ -4928,7 +5459,7 @@ Event action.
| `REOPENED` | Reopened action |
| `UPDATED` | Updated action |
-### GroupMemberRelation
+### `GroupMemberRelation`
Group member relation.
@@ -4938,7 +5469,7 @@ Group member relation.
| `DIRECT` | Direct members |
| `INHERITED` | Inherited members |
-### HealthStatus
+### `HealthStatus`
Health status of an issue or epic.
@@ -4948,7 +5479,7 @@ Health status of an issue or epic.
| `needsAttention` | |
| `onTrack` | |
-### IssuableSeverity
+### `IssuableSeverity`
Incident severity.
@@ -4960,70 +5491,70 @@ Incident severity.
| `MEDIUM` | Medium severity |
| `UNKNOWN` | Unknown severity |
-### IssuableState
+### `IssuableState`
State of a GitLab issue or merge request.
| Value | Description |
| ----- | ----------- |
-| `all` | |
-| `closed` | |
-| `locked` | |
-| `opened` | |
+| `all` | All available. |
+| `closed` | In closed state. |
+| `locked` | Discussion has been locked. |
+| `opened` | In open state. |
-### IssueSort
+### `IssueSort`
Values for sorting issues.
| Value | Description |
| ----- | ----------- |
-| `CREATED_ASC` | Created at ascending order |
-| `CREATED_DESC` | Created at descending order |
-| `DUE_DATE_ASC` | Due date by ascending order |
-| `DUE_DATE_DESC` | Due date by descending order |
-| `LABEL_PRIORITY_ASC` | Label priority by ascending order |
-| `LABEL_PRIORITY_DESC` | Label priority by descending order |
-| `MILESTONE_DUE_ASC` | Milestone due date by ascending order |
-| `MILESTONE_DUE_DESC` | Milestone due date by descending order |
-| `PRIORITY_ASC` | Priority by ascending order |
-| `PRIORITY_DESC` | Priority by descending order |
-| `PUBLISHED_ASC` | Published issues shown last |
-| `PUBLISHED_DESC` | Published issues shown first |
-| `RELATIVE_POSITION_ASC` | Relative position by ascending order |
-| `SEVERITY_ASC` | Severity from less critical to more critical |
-| `SEVERITY_DESC` | Severity from more critical to less critical |
-| `SLA_DUE_AT_ASC` | Issues with earliest SLA due time shown first |
-| `SLA_DUE_AT_DESC` | Issues with latest SLA due time shown first |
-| `UPDATED_ASC` | Updated at ascending order |
-| `UPDATED_DESC` | Updated at descending order |
-| `WEIGHT_ASC` | Weight by ascending order |
-| `WEIGHT_DESC` | Weight by descending order |
+| `CREATED_ASC` | Created at ascending order. |
+| `CREATED_DESC` | Created at descending order. |
+| `DUE_DATE_ASC` | Due date by ascending order. |
+| `DUE_DATE_DESC` | Due date by descending order. |
+| `LABEL_PRIORITY_ASC` | Label priority by ascending order. |
+| `LABEL_PRIORITY_DESC` | Label priority by descending order. |
+| `MILESTONE_DUE_ASC` | Milestone due date by ascending order. |
+| `MILESTONE_DUE_DESC` | Milestone due date by descending order. |
+| `PRIORITY_ASC` | Priority by ascending order. |
+| `PRIORITY_DESC` | Priority by descending order. |
+| `PUBLISHED_ASC` | Published issues shown last. |
+| `PUBLISHED_DESC` | Published issues shown first. |
+| `RELATIVE_POSITION_ASC` | Relative position by ascending order. |
+| `SEVERITY_ASC` | Severity from less critical to more critical. |
+| `SEVERITY_DESC` | Severity from more critical to less critical. |
+| `SLA_DUE_AT_ASC` | Issues with earliest SLA due time shown first. |
+| `SLA_DUE_AT_DESC` | Issues with latest SLA due time shown first. |
+| `UPDATED_ASC` | Updated at ascending order. |
+| `UPDATED_DESC` | Updated at descending order. |
+| `WEIGHT_ASC` | Weight by ascending order. |
+| `WEIGHT_DESC` | Weight by descending order. |
| `created_asc` **{warning-solid}** | **Deprecated:** Use CREATED_ASC. Deprecated in 13.5. |
| `created_desc` **{warning-solid}** | **Deprecated:** Use CREATED_DESC. Deprecated in 13.5. |
| `updated_asc` **{warning-solid}** | **Deprecated:** Use UPDATED_ASC. Deprecated in 13.5. |
| `updated_desc` **{warning-solid}** | **Deprecated:** Use UPDATED_DESC. Deprecated in 13.5. |
-### IssueState
+### `IssueState`
State of a GitLab issue.
| Value | Description |
| ----- | ----------- |
-| `all` | |
-| `closed` | |
-| `locked` | |
-| `opened` | |
+| `all` | All available. |
+| `closed` | In closed state. |
+| `locked` | Discussion has been locked. |
+| `opened` | In open state. |
-### IssueStateEvent
+### `IssueStateEvent`
Values for issue state events.
| Value | Description |
| ----- | ----------- |
-| `CLOSE` | Closes the issue |
-| `REOPEN` | Reopens the issue |
+| `CLOSE` | Closes the issue. |
+| `REOPEN` | Reopens the issue. |
-### IssueType
+### `IssueType`
Issue type.
@@ -5033,7 +5564,7 @@ Issue type.
| `ISSUE` | Issue issue type |
| `TEST_CASE` | Test Case issue type |
-### IterationState
+### `IterationState`
State of a GitLab iteration.
@@ -5045,49 +5576,49 @@ State of a GitLab iteration.
| `started` | |
| `upcoming` | |
-### IterationWildcardId
+### `IterationWildcardId`
Iteration ID wildcard values.
| Value | Description |
| ----- | ----------- |
-| `ANY` | An iteration is assigned |
-| `CURRENT` | Current iteration |
-| `NONE` | No iteration is assigned |
+| `ANY` | An iteration is assigned. |
+| `CURRENT` | Current iteration. |
+| `NONE` | No iteration is assigned. |
-### JobArtifactFileType
+### `JobArtifactFileType`
| Value | Description |
| ----- | ----------- |
-| `ACCESSIBILITY` | |
-| `API_FUZZING` | |
-| `ARCHIVE` | |
-| `BROWSER_PERFORMANCE` | |
-| `CLUSTER_APPLICATIONS` | |
-| `COBERTURA` | |
-| `CODEQUALITY` | |
-| `CONTAINER_SCANNING` | |
-| `COVERAGE_FUZZING` | |
-| `DAST` | |
-| `DEPENDENCY_SCANNING` | |
-| `DOTENV` | |
-| `JUNIT` | |
-| `LICENSE_MANAGEMENT` | |
-| `LICENSE_SCANNING` | |
-| `LOAD_PERFORMANCE` | |
-| `LSIF` | |
-| `METADATA` | |
-| `METRICS` | |
-| `METRICS_REFEREE` | |
-| `NETWORK_REFEREE` | |
-| `PERFORMANCE` | |
-| `REQUIREMENTS` | |
-| `SAST` | |
-| `SECRET_DETECTION` | |
-| `TERRAFORM` | |
-| `TRACE` | |
-
-### ListLimitMetric
+| `ACCESSIBILITY` | ACCESSIBILITY job artifact file type. |
+| `API_FUZZING` | API FUZZING job artifact file type. |
+| `ARCHIVE` | ARCHIVE job artifact file type. |
+| `BROWSER_PERFORMANCE` | BROWSER PERFORMANCE job artifact file type. |
+| `CLUSTER_APPLICATIONS` | CLUSTER APPLICATIONS job artifact file type. |
+| `COBERTURA` | COBERTURA job artifact file type. |
+| `CODEQUALITY` | CODE QUALITY job artifact file type. |
+| `CONTAINER_SCANNING` | CONTAINER SCANNING job artifact file type. |
+| `COVERAGE_FUZZING` | COVERAGE FUZZING job artifact file type. |
+| `DAST` | DAST job artifact file type. |
+| `DEPENDENCY_SCANNING` | DEPENDENCY SCANNING job artifact file type. |
+| `DOTENV` | DOTENV job artifact file type. |
+| `JUNIT` | JUNIT job artifact file type. |
+| `LICENSE_MANAGEMENT` | LICENSE MANAGEMENT job artifact file type. |
+| `LICENSE_SCANNING` | LICENSE SCANNING job artifact file type. |
+| `LOAD_PERFORMANCE` | LOAD PERFORMANCE job artifact file type. |
+| `LSIF` | LSIF job artifact file type. |
+| `METADATA` | METADATA job artifact file type. |
+| `METRICS` | METRICS job artifact file type. |
+| `METRICS_REFEREE` | METRICS REFEREE job artifact file type. |
+| `NETWORK_REFEREE` | NETWORK REFEREE job artifact file type. |
+| `PERFORMANCE` | PERFORMANCE job artifact file type. |
+| `REQUIREMENTS` | REQUIREMENTS job artifact file type. |
+| `SAST` | SAST job artifact file type. |
+| `SECRET_DETECTION` | SECRET DETECTION job artifact file type. |
+| `TERRAFORM` | TERRAFORM job artifact file type. |
+| `TRACE` | TRACE job artifact file type. |
+
+### `ListLimitMetric`
List limit metric setting.
@@ -5097,105 +5628,113 @@ List limit metric setting.
| `issue_count` | |
| `issue_weights` | |
-### MeasurementIdentifier
+### `MeasurementIdentifier`
Possible identifier types for a measurement.
| Value | Description |
| ----- | ----------- |
-| `GROUPS` | Group count |
-| `ISSUES` | Issue count |
-| `MERGE_REQUESTS` | Merge request count |
-| `PIPELINES` | Pipeline count |
-| `PIPELINES_CANCELED` | Pipeline count with canceled status |
-| `PIPELINES_FAILED` | Pipeline count with failed status |
-| `PIPELINES_SKIPPED` | Pipeline count with skipped status |
-| `PIPELINES_SUCCEEDED` | Pipeline count with success status |
-| `PROJECTS` | Project count |
-| `USERS` | User count |
+| `GROUPS` | Group count. |
+| `ISSUES` | Issue count. |
+| `MERGE_REQUESTS` | Merge request count. |
+| `PIPELINES` | Pipeline count. |
+| `PIPELINES_CANCELED` | Pipeline count with canceled status. |
+| `PIPELINES_FAILED` | Pipeline count with failed status. |
+| `PIPELINES_SKIPPED` | Pipeline count with skipped status. |
+| `PIPELINES_SUCCEEDED` | Pipeline count with success status. |
+| `PROJECTS` | Project count. |
+| `USERS` | User count. |
-### MergeRequestNewState
+### `MergeRequestNewState`
-New state to apply to a merge request..
+New state to apply to a merge request.
| Value | Description |
| ----- | ----------- |
| `CLOSED` | Close the merge request if it is open. |
| `OPEN` | Open the merge request if it is closed. |
-### MergeRequestSort
+### `MergeRequestSort`
Values for sorting merge requests.
| Value | Description |
| ----- | ----------- |
-| `CREATED_ASC` | Created at ascending order |
-| `CREATED_DESC` | Created at descending order |
-| `LABEL_PRIORITY_ASC` | Label priority by ascending order |
-| `LABEL_PRIORITY_DESC` | Label priority by descending order |
-| `MERGED_AT_ASC` | Merge time by ascending order |
-| `MERGED_AT_DESC` | Merge time by descending order |
-| `MILESTONE_DUE_ASC` | Milestone due date by ascending order |
-| `MILESTONE_DUE_DESC` | Milestone due date by descending order |
-| `PRIORITY_ASC` | Priority by ascending order |
-| `PRIORITY_DESC` | Priority by descending order |
-| `UPDATED_ASC` | Updated at ascending order |
-| `UPDATED_DESC` | Updated at descending order |
+| `CREATED_ASC` | Created at ascending order. |
+| `CREATED_DESC` | Created at descending order. |
+| `LABEL_PRIORITY_ASC` | Label priority by ascending order. |
+| `LABEL_PRIORITY_DESC` | Label priority by descending order. |
+| `MERGED_AT_ASC` | Merge time by ascending order. |
+| `MERGED_AT_DESC` | Merge time by descending order. |
+| `MILESTONE_DUE_ASC` | Milestone due date by ascending order. |
+| `MILESTONE_DUE_DESC` | Milestone due date by descending order. |
+| `PRIORITY_ASC` | Priority by ascending order. |
+| `PRIORITY_DESC` | Priority by descending order. |
+| `UPDATED_ASC` | Updated at ascending order. |
+| `UPDATED_DESC` | Updated at descending order. |
| `created_asc` **{warning-solid}** | **Deprecated:** Use CREATED_ASC. Deprecated in 13.5. |
| `created_desc` **{warning-solid}** | **Deprecated:** Use CREATED_DESC. Deprecated in 13.5. |
| `updated_asc` **{warning-solid}** | **Deprecated:** Use UPDATED_ASC. Deprecated in 13.5. |
| `updated_desc` **{warning-solid}** | **Deprecated:** Use UPDATED_DESC. Deprecated in 13.5. |
-### MergeRequestState
+### `MergeRequestState`
State of a GitLab merge request.
| Value | Description |
| ----- | ----------- |
-| `all` | |
-| `closed` | |
-| `locked` | |
-| `merged` | Merge Request has been merged |
-| `opened` | |
+| `all` | All available. |
+| `closed` | In closed state. |
+| `locked` | Discussion has been locked. |
+| `merged` | Merge Request has been merged. |
+| `opened` | In open state. |
+
+### `MergeStrategyEnum`
+
+| Value | Description |
+| ----- | ----------- |
+| `ADD_TO_MERGE_TRAIN_WHEN_PIPELINE_SUCCEEDS` | Use the add_to_merge_train_when_pipeline_succeeds merge strategy. |
+| `MERGE_TRAIN` | Use the merge_train merge strategy. |
+| `MERGE_WHEN_PIPELINE_SUCCEEDS` | Use the merge_when_pipeline_succeeds merge strategy. |
-### MilestoneStateEnum
+### `MilestoneStateEnum`
Current state of milestone.
| Value | Description |
| ----- | ----------- |
-| `active` | Milestone is currently active |
-| `closed` | Milestone is closed |
+| `active` | Milestone is currently active. |
+| `closed` | Milestone is closed. |
-### MoveType
+### `MoveType`
The position to which the adjacent object should be moved.
| Value | Description |
| ----- | ----------- |
-| `after` | The adjacent object will be moved after the object that is being moved |
-| `before` | The adjacent object will be moved before the object that is being moved |
+| `after` | The adjacent object will be moved after the object that is being moved. |
+| `before` | The adjacent object will be moved before the object that is being moved. |
-### MutationOperationMode
+### `MutationOperationMode`
Different toggles for changing mutator behavior.
| Value | Description |
| ----- | ----------- |
-| `APPEND` | Performs an append operation |
-| `REMOVE` | Performs a removal operation |
-| `REPLACE` | Performs a replace operation |
+| `APPEND` | Performs an append operation. |
+| `REMOVE` | Performs a removal operation. |
+| `REPLACE` | Performs a replace operation. |
-### NamespaceProjectSort
+### `NamespaceProjectSort`
Values for sorting projects.
| Value | Description |
| ----- | ----------- |
-| `SIMILARITY` | Most similar to the search query |
-| `STORAGE` | Sort by storage size |
+| `SIMILARITY` | Most similar to the search query. |
+| `STORAGE` | Sort by storage size. |
-### OncallRotationUnitEnum
+### `OncallRotationUnitEnum`
Rotation length unit of an on-call rotation.
@@ -5205,7 +5744,7 @@ Rotation length unit of an on-call rotation.
| `HOURS` | Hours |
| `WEEKS` | Weeks |
-### PackageTypeEnum
+### `PackageTypeEnum`
| Value | Description |
| ----- | ----------- |
@@ -5220,7 +5759,7 @@ Rotation length unit of an on-call rotation.
| `PYPI` | Packages from the PyPI package manager |
| `RUBYGEMS` | Packages from the Rubygems package manager |
-### PipelineConfigSourceEnum
+### `PipelineConfigSourceEnum`
| Value | Description |
| ----- | ----------- |
@@ -5234,7 +5773,7 @@ Rotation length unit of an on-call rotation.
| `UNKNOWN_SOURCE` | |
| `WEBIDE_SOURCE` | |
-### PipelineStatusEnum
+### `PipelineStatusEnum`
| Value | Description |
| ----- | ----------- |
@@ -5250,7 +5789,7 @@ Rotation length unit of an on-call rotation.
| `SUCCESS` | |
| `WAITING_FOR_RESOURCE` | |
-### ProjectMemberRelation
+### `ProjectMemberRelation`
Project member relation.
@@ -5261,18 +5800,18 @@ Project member relation.
| `INHERITED` | Inherited members |
| `INVITED_GROUPS` | Invited Groups members |
-### RegistryState
+### `RegistryState`
State of a Geo registry.
| Value | Description |
| ----- | ----------- |
-| `FAILED` | Registry that failed to sync |
-| `PENDING` | Registry waiting to be synced |
-| `STARTED` | Registry currently syncing |
-| `SYNCED` | Registry that is synced |
+| `FAILED` | Registry that failed to sync. |
+| `PENDING` | Registry waiting to be synced. |
+| `STARTED` | Registry currently syncing. |
+| `SYNCED` | Registry that is synced. |
-### ReleaseAssetLinkType
+### `ReleaseAssetLinkType`
Type of the link: `other`, `runbook`, `image`, `package`.
@@ -5283,18 +5822,18 @@ Type of the link: `other`, `runbook`, `image`, `package`.
| `PACKAGE` | Package link type |
| `RUNBOOK` | Runbook link type |
-### ReleaseSort
+### `ReleaseSort`
Values for sorting releases.
| Value | Description |
| ----- | ----------- |
-| `CREATED_ASC` | Created at ascending order |
-| `CREATED_DESC` | Created at descending order |
-| `RELEASED_AT_ASC` | Released at by ascending order |
-| `RELEASED_AT_DESC` | Released at by descending order |
+| `CREATED_ASC` | Created at ascending order. |
+| `CREATED_DESC` | Created at descending order. |
+| `RELEASED_AT_ASC` | Released at by ascending order. |
+| `RELEASED_AT_DESC` | Released at by descending order. |
-### RequirementState
+### `RequirementState`
State of a requirement.
@@ -5303,17 +5842,27 @@ State of a requirement.
| `ARCHIVED` | |
| `OPENED` | |
-### SastUiComponentSize
+### `RequirementStatusFilter`
+
+Status of a requirement based on last test report.
+
+| Value | Description |
+| ----- | ----------- |
+| `FAILED` | |
+| `MISSING` | Requirements without any test report. |
+| `PASSED` | |
+
+### `SastUiComponentSize`
Size of UI component in SAST configuration page.
| Value | Description |
| ----- | ----------- |
-| `LARGE` | |
-| `MEDIUM` | |
-| `SMALL` | |
+| `LARGE` | The size of UI component in SAST configuration page is large. |
+| `MEDIUM` | The size of UI component in SAST configuration page is medium. |
+| `SMALL` | The size of UI component in SAST configuration page is small. |
-### SecurityReportTypeEnum
+### `SecurityReportTypeEnum`
| Value | Description |
| ----- | ----------- |
@@ -5325,7 +5874,7 @@ Size of UI component in SAST configuration page.
| `SAST` | SAST scan report |
| `SECRET_DETECTION` | SECRET DETECTION scan report |
-### SecurityScannerType
+### `SecurityScannerType`
The type of the security scanner.
@@ -5339,18 +5888,18 @@ The type of the security scanner.
| `SAST` | |
| `SECRET_DETECTION` | |
-### SentryErrorStatus
+### `SentryErrorStatus`
State of a Sentry error.
| Value | Description |
| ----- | ----------- |
-| `IGNORED` | Error has been ignored |
-| `RESOLVED` | Error has been resolved |
-| `RESOLVED_IN_NEXT_RELEASE` | Error has been ignored until next release |
-| `UNRESOLVED` | Error is unresolved |
+| `IGNORED` | Error has been ignored. |
+| `RESOLVED` | Error has been resolved. |
+| `RESOLVED_IN_NEXT_RELEASE` | Error has been ignored until next release. |
+| `UNRESOLVED` | Error is unresolved. |
-### ServiceType
+### `ServiceType`
| Value | Description |
| ----- | ----------- |
@@ -5391,7 +5940,7 @@ State of a Sentry error.
| `WEBEX_TEAMS_SERVICE` | WebexTeamsService type |
| `YOUTRACK_SERVICE` | YoutrackService type |
-### SnippetBlobActionEnum
+### `SnippetBlobActionEnum`
Type of a snippet blob input action.
@@ -5402,22 +5951,22 @@ Type of a snippet blob input action.
| `move` | |
| `update` | |
-### Sort
+### `Sort`
Common sort values.
| Value | Description |
| ----- | ----------- |
-| `CREATED_ASC` | Created at ascending order |
-| `CREATED_DESC` | Created at descending order |
-| `UPDATED_ASC` | Updated at ascending order |
-| `UPDATED_DESC` | Updated at descending order |
+| `CREATED_ASC` | Created at ascending order. |
+| `CREATED_DESC` | Created at descending order. |
+| `UPDATED_ASC` | Updated at ascending order. |
+| `UPDATED_DESC` | Updated at descending order. |
| `created_asc` **{warning-solid}** | **Deprecated:** Use CREATED_ASC. Deprecated in 13.5. |
| `created_desc` **{warning-solid}** | **Deprecated:** Use CREATED_DESC. Deprecated in 13.5. |
| `updated_asc` **{warning-solid}** | **Deprecated:** Use UPDATED_ASC. Deprecated in 13.5. |
| `updated_desc` **{warning-solid}** | **Deprecated:** Use UPDATED_DESC. Deprecated in 13.5. |
-### TestReportState
+### `TestReportState`
State of a test report.
@@ -5426,62 +5975,97 @@ State of a test report.
| `FAILED` | |
| `PASSED` | |
-### TodoActionEnum
+### `TodoActionEnum`
| Value | Description |
| ----- | ----------- |
-| `approval_required` | |
-| `assigned` | |
-| `build_failed` | |
-| `directly_addressed` | |
-| `marked` | |
-| `mentioned` | |
-| `unmergeable` | |
-
-### TodoStateEnum
+| `approval_required` | User was set as an approver. |
+| `assigned` | User was assigned. |
+| `build_failed` | Build triggered by the user failed. |
+| `directly_addressed` | User was directly addressed. |
+| `marked` | User added a TODO. |
+| `mentioned` | User was mentioned. |
+| `merge_train_removed` | Merge request authored by the user was removed from the merge train. |
+| `review_requested` | Review was requested from the user. |
+| `unmergeable` | Merge request authored by the user could not be merged. |
+
+### `TodoStateEnum`
| Value | Description |
| ----- | ----------- |
-| `done` | |
-| `pending` | |
+| `done` | The state of the todo is done. |
+| `pending` | The state of the todo is pending. |
-### TodoTargetEnum
+### `TodoTargetEnum`
| Value | Description |
| ----- | ----------- |
-| `ALERT` | An Alert |
-| `COMMIT` | A Commit |
-| `DESIGN` | A Design |
-| `EPIC` | An Epic |
-| `ISSUE` | An Issue |
-| `MERGEREQUEST` | A MergeRequest |
+| `ALERT` | An Alert. |
+| `COMMIT` | A Commit. |
+| `DESIGN` | A Design. |
+| `EPIC` | An Epic. |
+| `ISSUE` | An Issue. |
+| `MERGEREQUEST` | A MergeRequest. |
-### TypeEnum
+### `TypeEnum`
| Value | Description |
| ----- | ----------- |
| `personal` | |
| `project` | |
-### UserState
+### `UserCalloutFeatureNameEnum`
+
+Name of the feature that the callout is for.
+
+| Value | Description |
+| ----- | ----------- |
+| `ACCOUNT_RECOVERY_REGULAR_CHECK` | Callout feature name for account_recovery_regular_check. |
+| `ACTIVE_USER_COUNT_THRESHOLD` | Callout feature name for active_user_count_threshold. |
+| `ADMIN_INTEGRATIONS_MOVED` | Callout feature name for admin_integrations_moved. |
+| `BUY_PIPELINE_MINUTES_NOTIFICATION_DOT` | Callout feature name for buy_pipeline_minutes_notification_dot. |
+| `CANARY_DEPLOYMENT` | Callout feature name for canary_deployment. |
+| `CLUSTER_SECURITY_WARNING` | Callout feature name for cluster_security_warning. |
+| `CUSTOMIZE_HOMEPAGE` | Callout feature name for customize_homepage. |
+| `EOA_BRONZE_PLAN_BANNER` | Callout feature name for eoa_bronze_plan_banner. |
+| `FEATURE_FLAGS_NEW_VERSION` | Callout feature name for feature_flags_new_version. |
+| `GCP_SIGNUP_OFFER` | Callout feature name for gcp_signup_offer. |
+| `GEO_ENABLE_HASHED_STORAGE` | Callout feature name for geo_enable_hashed_storage. |
+| `GEO_MIGRATE_HASHED_STORAGE` | Callout feature name for geo_migrate_hashed_storage. |
+| `GKE_CLUSTER_INTEGRATION` | Callout feature name for gke_cluster_integration. |
+| `GOLD_TRIAL_BILLINGS` | Callout feature name for gold_trial_billings. |
+| `NEW_USER_SIGNUPS_CAP_REACHED` | Callout feature name for new_user_signups_cap_reached. |
+| `PERSONAL_ACCESS_TOKEN_EXPIRY` | Callout feature name for personal_access_token_expiry. |
+| `REGISTRATION_ENABLED_CALLOUT` | Callout feature name for registration_enabled_callout. |
+| `SERVICE_TEMPLATES_DEPRECATED` | Callout feature name for service_templates_deprecated. |
+| `SUGGEST_PIPELINE` | Callout feature name for suggest_pipeline. |
+| `SUGGEST_POPOVER_DISMISSED` | Callout feature name for suggest_popover_dismissed. |
+| `TABS_POSITION_HIGHLIGHT` | Callout feature name for tabs_position_highlight. |
+| `THREAT_MONITORING_INFO` | Callout feature name for threat_monitoring_info. |
+| `ULTIMATE_TRIAL` | Callout feature name for ultimate_trial. |
+| `UNFINISHED_TAG_CLEANUP_CALLOUT` | Callout feature name for unfinished_tag_cleanup_callout. |
+| `WEBHOOKS_MOVED` | Callout feature name for webhooks_moved. |
+| `WEB_IDE_ALERT_DISMISSED` | Callout feature name for web_ide_alert_dismissed. |
+
+### `UserState`
Possible states of a user.
| Value | Description |
| ----- | ----------- |
-| `active` | The user is active and is able to use the system |
-| `blocked` | The user has been blocked and is prevented from using the system |
-| `deactivated` | The user is no longer active and is unable to use the system |
+| `active` | The user is active and is able to use the system. |
+| `blocked` | The user has been blocked and is prevented from using the system. |
+| `deactivated` | The user is no longer active and is unable to use the system. |
-### VisibilityLevelsEnum
+### `VisibilityLevelsEnum`
| Value | Description |
| ----- | ----------- |
-| `internal` | |
-| `private` | |
-| `public` | |
+| `internal` | Internal visibility level. |
+| `private` | Private visibility level. |
+| `public` | Public visibility level. |
-### VisibilityScopesEnum
+### `VisibilityScopesEnum`
| Value | Description |
| ----- | ----------- |
@@ -5489,7 +6073,7 @@ Possible states of a user.
| `private` | |
| `public` | |
-### VulnerabilityDismissalReason
+### `VulnerabilityDismissalReason`
The dismissal reason of the Vulnerability.
@@ -5501,7 +6085,7 @@ The dismissal reason of the Vulnerability.
| `NOT_APPLICABLE` | Other reasons for dismissal |
| `USED_IN_TESTS` | The Vulnerability is used in tests and does not pose an actual risk |
-### VulnerabilityExternalIssueLinkExternalTracker
+### `VulnerabilityExternalIssueLinkExternalTracker`
The external tracker of the external issue link related to a vulnerability.
@@ -5509,7 +6093,7 @@ The external tracker of the external issue link related to a vulnerability.
| ----- | ----------- |
| `JIRA` | Jira external tracker |
-### VulnerabilityExternalIssueLinkType
+### `VulnerabilityExternalIssueLinkType`
The type of the external issue link related to a vulnerability.
@@ -5517,7 +6101,7 @@ The type of the external issue link related to a vulnerability.
| ----- | ----------- |
| `CREATED` | Created link type |
-### VulnerabilityGrade
+### `VulnerabilityGrade`
The grade of the vulnerable project.
@@ -5529,7 +6113,7 @@ The grade of the vulnerable project.
| `D` | |
| `F` | |
-### VulnerabilityIssueLinkType
+### `VulnerabilityIssueLinkType`
The type of the issue link related to a vulnerability.
@@ -5538,7 +6122,7 @@ The type of the issue link related to a vulnerability.
| `CREATED` | |
| `RELATED` | |
-### VulnerabilityReportType
+### `VulnerabilityReportType`
The type of the security scan that found the vulnerability.
@@ -5552,7 +6136,7 @@ The type of the security scan that found the vulnerability.
| `SAST` | |
| `SECRET_DETECTION` | |
-### VulnerabilitySeverity
+### `VulnerabilitySeverity`
The severity of the vulnerability.
@@ -5565,24 +6149,24 @@ The severity of the vulnerability.
| `MEDIUM` | |
| `UNKNOWN` | |
-### VulnerabilitySort
+### `VulnerabilitySort`
Vulnerability sort values.
| Value | Description |
| ----- | ----------- |
-| `detected_asc` | Detection timestamp in ascending order |
-| `detected_desc` | Detection timestamp in descending order |
-| `report_type_asc` | Report Type in ascending order |
-| `report_type_desc` | Report Type in descending order |
-| `severity_asc` | Severity in ascending order |
-| `severity_desc` | Severity in descending order |
-| `state_asc` | State in ascending order |
-| `state_desc` | State in descending order |
-| `title_asc` | Title in ascending order |
-| `title_desc` | Title in descending order |
-
-### VulnerabilityState
+| `detected_asc` | Detection timestamp in ascending order. |
+| `detected_desc` | Detection timestamp in descending order. |
+| `report_type_asc` | Report Type in ascending order. |
+| `report_type_desc` | Report Type in descending order. |
+| `severity_asc` | Severity in ascending order. |
+| `severity_desc` | Severity in descending order. |
+| `state_asc` | State in ascending order. |
+| `state_desc` | State in descending order. |
+| `title_asc` | Title in ascending order. |
+| `title_desc` | Title in descending order. |
+
+### `VulnerabilityState`
The state of the vulnerability.
diff --git a/doc/api/graphql/removed_items.md b/doc/api/graphql/removed_items.md
index 2761c1a1c84..a76f1fb7418 100644
--- a/doc/api/graphql/removed_items.md
+++ b/doc/api/graphql/removed_items.md
@@ -8,7 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
GraphQL is a versionless API, unlike the REST API.
Occasionally, items have to be updated or removed from the GraphQL API.
-According to our [process for removing items](index.md#deprecation-process), here are the items that have been removed.
+According to our [process for removing items](index.md#deprecation-and-removal-process), here are the items that have been removed.
## GitLab 13.6
diff --git a/doc/api/group_repository_storage_moves.md b/doc/api/group_repository_storage_moves.md
index 8a19a43d31f..f4d89c34f38 100644
--- a/doc/api/group_repository_storage_moves.md
+++ b/doc/api/group_repository_storage_moves.md
@@ -197,7 +197,7 @@ Supported attributes:
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `group_id` | integer | yes | ID of the group. |
-| `destination_storage_name` | string | no | Name of the destination storage shard. In [GitLab 13.5 and later](https://gitlab.com/gitlab-org/gitaly/-/issues/3209), the storage is selected automatically if not provided. |
+| `destination_storage_name` | string | no | Name of the destination storage shard. In [GitLab 13.5 and later](https://gitlab.com/gitlab-org/gitaly/-/issues/3209), the storage is selected [automatically based on storage weights](../administration/repository_storage_paths.md#configure-where-new-repositories-are-stored) if not provided. |
Example request:
@@ -236,7 +236,7 @@ Supported attributes:
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `source_storage_name` | string | yes | Name of the source storage shard. |
-| `destination_storage_name` | string | no | Name of the destination storage shard. The storage is selected automatically if not provided. |
+| `destination_storage_name` | string | no | Name of the destination storage shard. The storage is selected [automatically based on storage weights](../administration/repository_storage_paths.md#configure-where-new-repositories-are-stored) if not provided. |
Example request:
diff --git a/doc/api/groups.md b/doc/api/groups.md
index 6031d780436..b3ab00b362e 100644
--- a/doc/api/groups.md
+++ b/doc/api/groups.md
@@ -1258,7 +1258,7 @@ Read more in the [Group Import/Export](group_import_export.md) documentation.
## Share Groups with Groups
-These endpoints create and delete links for sharing a group with another group. For more information, see the related discussion in the [GitLab Groups](../user/group/index.md#sharing-a-group-with-another-group) page.
+These endpoints create and delete links for sharing a group with another group. For more information, see the related discussion in the [GitLab Groups](../user/group/index.md#share-a-group-with-another-group) page.
### Create a link to share a group with another group
diff --git a/doc/api/invitations.md b/doc/api/invitations.md
index 7259dddec8c..905e4c2e288 100644
--- a/doc/api/invitations.md
+++ b/doc/api/invitations.md
@@ -38,7 +38,7 @@ POST /projects/:id/invitations
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `id` | integer/string | yes | The ID or [URL-encoded path of the project or group](README.md#namespaced-path-encoding) owned by the authenticated user |
-| `email` | integer/string | yes | The email of the new member or multiple emails separated by commas |
+| `email` | string | yes | The email of the new member or multiple emails separated by commas |
| `access_level` | integer | yes | A valid access level |
| `expires_at` | string | no | A date string in the format YEAR-MONTH-DAY |
@@ -107,6 +107,36 @@ Example response:
]
```
+## Update an invitation to a group or project
+
+Updates a pending invitation's access level or access expiry date.
+
+```plaintext
+PUT /groups/:id/invitations/:email
+PUT /projects/:id/invitations/:email
+```
+
+| Attribute | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project or group](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `email` | string | yes | The email address to which the invitation was previously sent. |
+| `access_level` | integer | no | A valid access level (defaults: `30`, developer access level). |
+| `expires_at` | string | no | A date string in ISO 8601 format (`YYYY-MM-DDTHH:MM:SSZ`). |
+
+```shell
+curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/55/invitations/email@example.org?access_level=40"
+curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/55/invitations/email@example.org?access_level=40"
+```
+
+Example response:
+
+```json
+{
+ "expires_at": "2012-10-22T14:13:35Z",
+ "access_level": 40,
+}
+```
+
## Delete an invitation to a group or project
Deletes a pending invitation by email address.
diff --git a/doc/api/issues.md b/doc/api/issues.md
index c333967b36c..23028b44169 100644
--- a/doc/api/issues.md
+++ b/doc/api/issues.md
@@ -67,7 +67,7 @@ GET /issues?state=opened
| `milestone` | string | no | The milestone title. `None` lists all issues with no milestone. `Any` lists all issues that have an assigned milestone. |
| `my_reaction_emoji` | string | no | Return issues reacted by the authenticated user by the given `emoji`. `None` returns issues not given a reaction. `Any` returns issues given at least one reaction. _([Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/14016) in GitLab 10.0)_ |
| `non_archived` | boolean | no | Return issues only from non-archived projects. If `false`, the response returns issues from both archived and non-archived projects. Default is `true`. _(Introduced in [GitLab 13.0](https://gitlab.com/gitlab-org/gitlab/-/issues/197170))_ |
-| `not` | Hash | no | Return issues that do not match the parameters supplied. Accepts: `labels`, `milestone`, `author_id`, `author_username`, `assignee_id`, `assignee_username`, `my_reaction_emoji` |
+| `not` | Hash | no | Return issues that do not match the parameters supplied. Accepts: `assignee_id`, `assignee_username`, `author_id`, `author_username`, `iids`, `iteration_id`, `iteration_title`, `labels`, `milestone`, and `weight`. |
| `order_by` | string | no | Return issues ordered by `created_at`, `updated_at`, `priority`, `due_date`, `relative_position`, `label_priority`, `milestone_due`, `popularity`, `weight` fields. Default is `created_at` |
| `scope` | string | no | Return issues for the given scope: `created_by_me`, `assigned_to_me` or `all`. Defaults to `created_by_me`<br> For versions before 11.0, use the now deprecated `created-by-me` or `assigned-to-me` scopes instead.<br> _([Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/13004) in GitLab 9.5. [Changed to snake_case](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/18935) in GitLab 11.0)_ |
| `search` | string | no | Search issues against their `title` and `description` |
diff --git a/doc/api/jobs.md b/doc/api/jobs.md
index 18d2e5ec3df..08c6b92c78e 100644
--- a/doc/api/jobs.md
+++ b/doc/api/jobs.md
@@ -380,6 +380,76 @@ Example of response
]
```
+## Get job token's job
+
+Retrieve the job that generated a job token.
+
+```plaintext
+GET /job
+```
+
+Examples
+
+```shell
+curl --header "JOB-TOKEN: <your_job_token>" "https://gitlab.example.com/api/v4/job"
+curl "https://gitlab.example.com/api/v4/job?job_token=<your_job_token>"
+```
+
+Example of response
+
+```json
+{
+ "commit": {
+ "author_email": "admin@example.com",
+ "author_name": "Administrator",
+ "created_at": "2015-12-24T16:51:14.000+01:00",
+ "id": "0ff3ae198f8601a285adcf5c0fff204ee6fba5fd",
+ "message": "Test the CI integration.",
+ "short_id": "0ff3ae19",
+ "title": "Test the CI integration."
+ },
+ "coverage": null,
+ "allow_failure": false,
+ "created_at": "2015-12-24T15:51:21.880Z",
+ "started_at": "2015-12-24T17:54:30.733Z",
+ "finished_at": "2015-12-24T17:54:31.198Z",
+ "duration": 0.465,
+ "artifacts_expire_at": "2016-01-23T17:54:31.198Z",
+ "id": 8,
+ "name": "rubocop",
+ "pipeline": {
+ "id": 6,
+ "ref": "master",
+ "sha": "0ff3ae198f8601a285adcf5c0fff204ee6fba5fd",
+ "status": "pending"
+ },
+ "ref": "master",
+ "artifacts": [],
+ "runner": null,
+ "stage": "test",
+ "status": "failed",
+ "tag": false,
+ "web_url": "https://example.com/foo/bar/-/jobs/8",
+ "user": {
+ "id": 1,
+ "name": "Administrator",
+ "username": "root",
+ "state": "active",
+ "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon",
+ "web_url": "http://gitlab.dev/root",
+ "created_at": "2015-12-21T13:14:24.077Z",
+ "bio": null,
+ "location": null,
+ "public_email": "",
+ "skype": "",
+ "linkedin": "",
+ "twitter": "",
+ "website_url": "",
+ "organization": ""
+ }
+}
+```
+
## Get a single job
Get a single job of a project
diff --git a/doc/api/members.md b/doc/api/members.md
index bf2bf8c1220..286be10dd6e 100644
--- a/doc/api/members.md
+++ b/doc/api/members.md
@@ -237,6 +237,8 @@ Example response:
Gets a list of group members that count as billable. The list includes members in the subgroup or subproject.
+This API endpoint works on top-level groups only. It does not work on subgroups.
+
NOTE:
Unlike other API endpoints, billable members is updated once per day at 12:00 UTC.
@@ -308,6 +310,27 @@ Example response:
]
```
+## Remove a billable member from a group
+
+Removes a billable member from a group and its subgroups and projects.
+
+The user does not need to be a group member to qualify for removal.
+For example, if the user was added directly to a project within the group, you can
+still use this API to remove them.
+
+```plaintext
+DELETE /groups/:id/billable_members/:user_id
+```
+
+| Attribute | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `user_id` | integer | yes | The user ID of the member |
+
+```shell
+curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/:id/billable_members/:user_id"
+```
+
## Add a member to a group or project
Adds a member to a group or project.
diff --git a/doc/api/merge_request_approvals.md b/doc/api/merge_request_approvals.md
index 5b8bad1d685..ea049c46e73 100644
--- a/doc/api/merge_request_approvals.md
+++ b/doc/api/merge_request_approvals.md
@@ -388,7 +388,7 @@ You can update project approval rules using the following endpoint:
PUT /projects/:id/approval_rules/:approval_rule_id
```
-**Important:** Approvers and groups not in the `users`/`groups` parameters will be **removed**
+**Important:** Approvers and groups not in the `users`/`groups` parameters are **removed**
**Parameters:**
@@ -516,7 +516,7 @@ the following endpoint:
PUT /projects/:id/approvers
```
-**Important:** Approvers and groups not in the request will be **removed**
+**Important:** Approvers and groups not in the request are **removed**
**Parameters:**
@@ -567,6 +567,120 @@ PUT /projects/:id/approvers
}
```
+## External Project-level MR approvals **(ULTIMATE)**
+
+Configuration for approvals on a specific Merge Request which makes a call to an external HTTP resource.
+
+> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/3869) in GitLab 13.10.
+> - It's [deployed behind a feature flag](../user/feature_flags.md), disabled by default.
+> - It's disabled on GitLab.com.
+> - It's not recommended for production use.
+> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-external-project-level-mr-approvals). **(ULTIMATE SELF)**
+
+### Get project external approval rules **(ULTIMATE)**
+
+You can request information about a project's external approval rules using the following endpoint:
+
+```plaintext
+GET /projects/:id/external_approval_rules
+```
+
+**Parameters:**
+
+| Attribute | Type | Required | Description |
+|---------------------|---------|----------|---------------------|
+| `id` | integer | yes | The ID of a project |
+
+```json
+[
+ {
+ "id": 1,
+ "name": "Compliance Check",
+ "project_id": 6,
+ "external_url": "https://gitlab.com/example/test.json",
+ "protected_branches": [
+ {
+ "id": 14,
+ "project_id": 6,
+ "name": "master",
+ "created_at": "2020-10-12T14:04:50.787Z",
+ "updated_at": "2020-10-12T14:04:50.787Z",
+ "code_owner_approval_required": false
+ }
+ ]
+ }
+]
+```
+
+### Create external approval rule **(ULTIMATE)**
+
+You can create a new external approval rule for a project using the following endpoint:
+
+```plaintext
+POST /projects/:id/external_approval_rules
+```
+
+| Attribute | Type | Required | Description |
+|------------------------|----------------|----------|----------------------------------------------------|
+| `id` | integer | yes | The ID of a project |
+| `name` | string | yes | Display name of approval rule |
+| `external_url` | string | yes | URL of external approval resource |
+| `protected_branch_ids` | `array<Integer>` | no | The ids of protected branches to scope the rule by |
+
+### Delete external approval rule **(ULTIMATE)**
+
+You can delete an external approval rule for a project using the following endpoint:
+
+```plaintext
+DELETE /projects/:id/external_approval_rules/:rule_id
+```
+
+| Attribute | Type | Required | Description |
+|------------------------|----------------|----------|----------------------------------------------------|
+| `rule_id` | integer | yes | The ID of an approval rule |
+| `id` | integer | yes | The ID of a project |
+
+### Update external approval rule **(ULTIMATE)**
+
+You can update an existing external approval rule for a project using the following endpoint:
+
+```plaintext
+PATCH /projects/:id/external_approval_rules/:rule_id
+```
+
+| Attribute | Type | Required | Description |
+|------------------------|----------------|----------|----------------------------------------------------|
+| `id` | integer | yes | The ID of a project |
+| `rule_id` | integer | yes | The ID of an external approval rule |
+| `name` | string | no | Display name of approval rule |
+| `external_url` | string | no | URL of external approval resource |
+| `protected_branch_ids` | `array<Integer>` | no | The ids of protected branches to scope the rule by |
+
+### Enable or disable External Project-level MR approvals **(ULTIMATE SELF)**
+
+Enable or disable External Project-level MR approvals 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](../user/feature_flags.md)
+can enable it.
+
+To enable it:
+
+```ruby
+# For the instance
+Feature.enable(:ff_compliance_approval_gates)
+# For a single project
+Feature.enable(:ff_compliance_approval_gates, Project.find(<project id>))
+```
+
+To disable it:
+
+```ruby
+# For the instance
+Feature.disable(:ff_compliance_approval_gates)
+# For a single project
+Feature.disable(:ff_compliance_approval_gates, Project.find(<project id>))
+```
+
## Merge Request-level MR approvals
Configuration for approvals on a specific Merge Request. Must be authenticated for all endpoints.
@@ -670,7 +784,7 @@ the following endpoint:
PUT /projects/:id/merge_requests/:merge_request_iid/approvers
```
-**Important:** Approvers and groups not in the request will be **removed**
+**Important:** Approvers and groups not in the request are **removed**
**Parameters:**
@@ -741,8 +855,8 @@ You can request information about a merge request's approval state by using the
GET /projects/:id/merge_requests/:merge_request_iid/approval_state
```
-The `approval_rules_overwritten` will be `true` if the merge request level rules
-are created for the merge request. If there's none, it'll be `false`.
+The `approval_rules_overwritten` are `true` if the merge request level rules
+are created for the merge request. If there are none, it is `false`.
This includes additional information about the users who have already approved
(`approved_by`) and whether a rule is already approved (`approved`).
@@ -905,8 +1019,8 @@ POST /projects/:id/merge_requests/:merge_request_iid/approval_rules
| `group_ids` | Array | no | The ids of groups as approvers |
**Important:** When `approval_project_rule_id` is set, the `name`, `users` and
-`groups` of project-level rule will be copied. The `approvals_required` specified
-will be used.
+`groups` of project-level rule are copied. The `approvals_required` specified
+is used.
```json
{
@@ -977,7 +1091,7 @@ You can update merge request approval rules using the following endpoint:
PUT /projects/:id/merge_requests/:merge_request_iid/approval_rules/:approval_rule_id
```
-**Important:** Approvers and groups not in the `users`/`groups` parameters will be **removed**
+**Important:** Approvers and groups not in the `users`/`groups` parameters are **removed**
**Important:** Updating a `report_approver` or `code_owner` rule is not allowed.
These are system generated rules.
@@ -1098,7 +1212,7 @@ POST /projects/:id/merge_requests/:merge_request_iid/approve
The `sha` parameter works in the same way as
when [accepting a merge request](merge_requests.md#accept-mr): if it is passed, then it must
match the current HEAD of the merge request for the approval to be added. If it
-does not match, the response code will be `409`.
+does not match, the response code is `409`.
```json
{
diff --git a/doc/api/merge_request_context_commits.md b/doc/api/merge_request_context_commits.md
index 0b4b96b889b..cd38d972320 100644
--- a/doc/api/merge_request_context_commits.md
+++ b/doc/api/merge_request_context_commits.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+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"
type: reference, api
---
diff --git a/doc/api/merge_requests.md b/doc/api/merge_requests.md
index d9bcba96fdc..b77b1a59cd9 100644
--- a/doc/api/merge_requests.md
+++ b/doc/api/merge_requests.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+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"
type: reference, api
---
@@ -44,7 +44,10 @@ is fetched from its project, `relative` format would be the same as `short` form
diffs associated with the set of changes have the same size limitations applied as other diffs
returned by the API or viewed via the UI. When these limits impact the results, the `overflow`
field contains a value of `true`. Diff data without these limits applied can be retrieved by
-adding the `access_raw_diffs` parameter, but it is slower and more resource-intensive.
+adding the `access_raw_diffs` parameter, accessing diffs not from the database but from Gitaly directly.
+This approach is generally slower and more resource-intensive, but isn't subject to size limits
+placed on database-backed diffs. [Limits inherent to Gitaly](../development/diffs.md#diff-limits)
+still apply.
## List merge requests
@@ -101,7 +104,7 @@ Parameters:
| `target_branch` | string | no | Return merge requests with the given target branch. |
| `search` | string | no | Search merge requests against their `title` and `description`. |
| `in` | string | no | Modify the scope of the `search` attribute. `title`, `description`, or a string joining them with comma. Default is `title,description`. |
-| `wip` | string | no | Filter merge requests against their `wip` status. `yes` to return *only* WIP merge requests, `no` to return *non* WIP merge requests. |
+| `wip` | string | no | Filter merge requests against their `wip` status. `yes` to return *only* draft merge requests, `no` to return *non-draft* merge requests. |
| `not` | Hash | no | Return merge requests that do not match the parameters supplied. Accepts: `labels`, `milestone`, `author_id`, `author_username`, `assignee_id`, `assignee_username`, `reviewer_id`, `reviewer_username`, `my_reaction_emoji`. |
| `environment` | string | no | Returns merge requests deployed to the given environment. Expected in ISO 8601 format (`2019-03-15T08:00:00Z`) |
| `deployed_before` | datetime | no | Return merge requests deployed before the given date/time. Expected in ISO 8601 format (`2019-03-15T08:00:00Z`) |
@@ -287,7 +290,7 @@ Parameters:
| `source_branch` | string | no | Return merge requests with the given source branch. |
| `target_branch` | string | no | Return merge requests with the given target branch. |
| `search` | string | no | Search merge requests against their `title` and `description`. |
-| `wip` | string | no | Filter merge requests against their `wip` status. `yes` to return *only* WIP merge requests, `no` to return *non* WIP merge requests. |
+| `wip` | string | no | Filter merge requests against their `wip` status. `yes` to return *only* draft merge requests, `no` to return *non-draft* merge requests. |
| `not` | Hash | no | Return merge requests that do not match the parameters supplied. Accepts: `labels`, `milestone`, `author_id`, `author_username`, `assignee_id`, `assignee_username`, `reviewer_id`, `reviewer_username`, `my_reaction_emoji`. |
```json
@@ -846,7 +849,7 @@ Parameters:
|----------------------------------|----------------|----------|------------------------------------------------------------------------------------------------------------------|
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
| `merge_request_iid` | integer | yes | The internal ID of the merge request. |
-| `access_raw_diffs` | boolean | no | Retrieve change diffs without size limitations. |
+| `access_raw_diffs` | boolean | no | Retrieve change diffs via Gitaly. |
```json
{
@@ -1061,7 +1064,7 @@ POST /projects/:id/merge_requests
| `title` | string | yes | Title of MR. |
| `assignee_id` | integer | no | Assignee user ID. |
| `assignee_ids` | integer array | no | The ID of the user(s) to assign the MR to. Set to `0` or provide an empty value to unassign all assignees. |
-| `reviewer_ids` | integer array | no | The ID of the user(s) added as a reviewer to the MR. If set to `0` or left empty, there will be no reviewers added. |
+| `reviewer_ids` | integer array | no | The ID of the user(s) added as a reviewer to the MR. If set to `0` or left empty, no reviewers are added. |
| `description` | string | no | Description of MR. Limited to 1,048,576 characters. |
| `target_project_id` | integer | no | The target project (numeric ID). |
| `labels` | string | no | Labels for MR as a comma-separated list. |
diff --git a/doc/api/merge_trains.md b/doc/api/merge_trains.md
index d8c0acb3896..9fc17930c92 100644
--- a/doc/api/merge_trains.md
+++ b/doc/api/merge_trains.md
@@ -26,7 +26,7 @@ Read more on [pagination](README.md#pagination).
Get all Merge Trains of the requested project:
-```txt
+```shell
GET /projects/:id/merge_trains
GET /projects/:id/merge_trains?scope=complete
```
diff --git a/doc/api/notification_settings.md b/doc/api/notification_settings.md
index a85c6475331..57eac61de46 100644
--- a/doc/api/notification_settings.md
+++ b/doc/api/notification_settings.md
@@ -39,6 +39,7 @@ If the `custom` level is used, specific email events can be controlled. Availabl
- `fixed_pipeline`
- `success_pipeline`
- `moved_project`
+- `merge_when_pipeline_succeeds`
- `new_epic` **(ULTIMATE)**
## Global notification settings
@@ -94,6 +95,7 @@ curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab
| `fixed_pipeline` | boolean | no | Enable/disable this notification |
| `success_pipeline` | boolean | no | Enable/disable this notification |
| `moved_project` | boolean | no | Enable/disable this notification ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/30371) in GitLab 13.3) |
+| `merge_when_pipeline_succeeds` | boolean | no | Enable/disable this notification ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/244840) in GitLab 13.9) |
| `new_epic` | boolean | no | Enable/disable this notification ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/5863) in GitLab 11.3) **(ULTIMATE)** |
Example response:
@@ -165,6 +167,7 @@ curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab
| `fixed_pipeline` | boolean | no | Enable/disable this notification |
| `success_pipeline` | boolean | no | Enable/disable this notification |
| `moved_project` | boolean | no | Enable/disable this notification ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/30371) in GitLab 13.3) |
+| `merge_when_pipeline_succeeds` | boolean | no | Enable/disable this notification ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/244840) in GitLab 13.9) |
| `new_epic` | boolean | no | Enable/disable this notification ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/5863) in GitLab 11.3) **(ULTIMATE)** |
Example responses:
diff --git a/doc/api/oauth2.md b/doc/api/oauth2.md
index 92d109cac5f..2bcf86a031c 100644
--- a/doc/api/oauth2.md
+++ b/doc/api/oauth2.md
@@ -270,13 +270,18 @@ the following parameters:
}
```
-Also you must use HTTP Basic authentication using the `client_id` and`client_secret`
-values to authenticate the client that performs a request.
-
Example cURL request:
```shell
echo 'grant_type=password&username=<your_username>&password=<your_password>' > auth.txt
+curl --data "@auth.txt" --request POST "https://gitlab.example.com/oauth/token"
+```
+
+You can also use this grant flow with registered OAuth applications, by using
+HTTP Basic Authentication with the application's `client_id` and `client_secret`:
+
+```shell
+echo 'grant_type=password&username=<your_username>&password=<your_password>' > auth.txt
curl --data "@auth.txt" --user client_id:client_secret --request POST "https://gitlab.example.com/oauth/token"
```
@@ -354,3 +359,13 @@ These are aliases for `scope` and `expires_in` respectively, and have been inclu
prevent breaking changes introduced in [doorkeeper 5.0.2](https://github.com/doorkeeper-gem/doorkeeper/wiki/Migration-from-old-versions#from-4x-to-5x).
Don't rely on these fields as they will be removed in a later release.
+
+## OAuth2 tokens and GitLab registries
+
+Standard OAuth2 tokens support different degrees of access to GitLab registries, as they:
+
+- Do not allow users to authenticate to:
+ - The GitLab [Container registry](../user/packages/container_registry/index.md#authenticate-with-the-container-registry).
+ - Packages listed in the GitLab [Package registry](../user/packages/package_registry/index.md).
+- Allow users to get, list, and delete registries through
+ the [Container registry API](container_registry.md).
diff --git a/doc/api/openapi/openapi_interactive.md b/doc/api/openapi/openapi_interactive.md
index 0f1544b139d..95d7bba8081 100644
--- a/doc/api/openapi/openapi_interactive.md
+++ b/doc/api/openapi/openapi_interactive.md
@@ -27,7 +27,7 @@ and example server responses. Some parameters include a default or a list of all
![API viewer screenshot](img/apiviewer04-fs8.png)
-## Starting an interactive sesssion
+## Starting an interactive session
A [Personal access token](../../user/profile/personal_access_tokens.md) (PAT) is one way to
start an interactive session. To do this, select **Authorize** from the main page, and a
diff --git a/doc/api/plan_limits.md b/doc/api/plan_limits.md
new file mode 100644
index 00000000000..105cf13f9de
--- /dev/null
+++ b/doc/api/plan_limits.md
@@ -0,0 +1,81 @@
+---
+stage: Manage
+group: Access
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Plan limits API **(FREE)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54232) in GitLab 13.10.
+
+The plan limits API allows you to maintain the application limits for the existing subscription plans.
+
+The existing plans depend on the GitLab edition. In the Community Edition, only the plan `default`
+is available. In the Enterprise Edition, additional plans are available as well.
+
+NOTE:
+Administrator access is required to use this API.
+
+## Get current plan limits
+
+List the current limits of a plan on the GitLab instance.
+
+```plaintext
+GET /application/plan_limits
+```
+
+| Attribute | Type | Required | Description |
+| --------------------------------- | ------- | -------- | ----------- |
+| `plan_name` | string | no | Name of the plan to get the limits from. Default: `default`. |
+
+```shell
+curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/application/plan_limits"
+```
+
+Example response:
+
+```json
+{
+ "conan_max_file_size": 3221225472,
+ "generic_packages_max_file_size": 5368709120,
+ "maven_max_file_size": 3221225472,
+ "npm_max_file_size": 524288000,
+ "nuget_max_file_size": 524288000,
+ "pypi_max_file_size": 3221225472
+}
+```
+
+## Change plan limits
+
+Modify the limits of a plan on the GitLab instance.
+
+```plaintext
+PUT /application/plan_limits
+```
+
+| Attribute | Type | Required | Description |
+| --------------------------------- | ------- | -------- | ----------- |
+| `plan_name` | string | yes | Name of the plan to update. |
+| `conan_max_file_size` | integer | no | Maximum Conan package file size in bytes. |
+| `generic_packages_max_file_size` | integer | no | Maximum generic package file size in bytes. |
+| `maven_max_file_size` | integer | no | Maximum Maven package file size in bytes. |
+| `npm_max_file_size` | integer | no | Maximum NPM package file size in bytes. |
+| `nuget_max_file_size` | integer | no | Maximum NuGet package file size in bytes. |
+| `pypi_max_file_size` | integer | no | Maximum PyPI package file size in bytes. |
+
+```shell
+curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/application/plan_limits?plan_name=default&conan_max_file_size=3221225472"
+```
+
+Example response:
+
+```json
+{
+ "conan_max_file_size": 3221225472,
+ "generic_packages_max_file_size": 5368709120,
+ "maven_max_file_size": 3221225472,
+ "npm_max_file_size": 524288000,
+ "nuget_max_file_size": 524288000,
+ "pypi_max_file_size": 3221225472
+}
+```
diff --git a/doc/api/project_badges.md b/doc/api/project_badges.md
index 041f67157f7..58f5b000958 100644
--- a/doc/api/project_badges.md
+++ b/doc/api/project_badges.md
@@ -11,14 +11,14 @@ type: reference, api
## Placeholder tokens
-Badges support placeholders that will be replaced in real time in both the link and image URL. The allowed placeholders are:
+Badges support placeholders that are replaced in real time in both the link and image URL. The allowed placeholders are:
<!-- vale gitlab.Spelling = NO -->
-- **%{project_path}**: will be replaced by the project path.
-- **%{project_id}**: will be replaced by the project ID.
-- **%{default_branch}**: will be replaced by the project default branch.
-- **%{commit_sha}**: will be replaced by the last project's commit SHA.
+- **%{project_path}**: Replaced by the project path.
+- **%{project_id}**: Replaced by the project ID.
+- **%{default_branch}**: Replaced by the project default branch.
+- **%{commit_sha}**: Replaced by the last project's commit SHA.
<!-- vale gitlab.Spelling = YES -->
## List all badges of a project
@@ -162,7 +162,7 @@ Example response:
## Remove a badge from a project
-Removes a badge from a project. Only project's badges will be removed by using this endpoint.
+Removes a badge from a project. Only project badges are removed by using this endpoint.
```plaintext
DELETE /projects/:id/badges/:badge_id
diff --git a/doc/api/project_import_export.md b/doc/api/project_import_export.md
index cd8adf49f1d..c895a7c4155 100644
--- a/doc/api/project_import_export.md
+++ b/doc/api/project_import_export.md
@@ -50,7 +50,7 @@ curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitla
```
NOTE:
-The upload request will be sent with `Content-Type: application/gzip` header. Ensure that your pre-signed URL includes this as part of the signature.
+The upload request is sent with `Content-Type: application/gzip` header. Ensure that your pre-signed URL includes this as part of the signature.
## Export status
@@ -138,14 +138,14 @@ POST /projects/import
| Attribute | Type | Required | Description |
| --------- | -------------- | -------- | ---------------------------------------- |
-| `namespace` | integer/string | no | The ID or path of the namespace that the project will be imported to. Defaults to the current user's namespace |
+| `namespace` | integer/string | no | The ID or path of the namespace to import the project to. Defaults to the current user's namespace |
| `name` | string | no | The name of the project to be imported. Defaults to the path of the project if not provided |
| `file` | string | yes | The file to be uploaded |
| `path` | string | yes | Name and path for new project |
-| `overwrite` | boolean | no | If there is a project with the same path the import will overwrite it. Default to false |
+| `overwrite` | boolean | no | If there is a project with the same path the import overwrites it. Default to false |
| `override_params` | Hash | no | Supports all fields defined in the [Project API](projects.md) |
-The override parameters passed will take precedence over all values defined inside the export file.
+The override parameters passed take precedence over all values defined inside the export file.
To upload a file from your file system, use the `--form` argument. This causes
cURL to post data using the header `Content-Type: multipart/form-data`.
@@ -220,7 +220,7 @@ Status can be one of:
- `started`
- `finished`
-If the status is `failed`, it will include the import error message under `import_error`.
+If the status is `failed`, it includes the import error message under `import_error`.
If the status is `failed`, `started` or `finished`, the `failed_relations` array might
be populated with any occurrences of relations that failed to import either due to
unrecoverable errors or because retries were exhausted (a typical example are query timeouts.)
diff --git a/doc/api/project_repository_storage_moves.md b/doc/api/project_repository_storage_moves.md
index be922b441d6..a7fe25d03cd 100644
--- a/doc/api/project_repository_storage_moves.md
+++ b/doc/api/project_repository_storage_moves.md
@@ -211,7 +211,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `project_id` | integer | yes | ID of the project |
-| `destination_storage_name` | string | no | Name of the destination storage shard. In [GitLab 13.5 and later](https://gitlab.com/gitlab-org/gitaly/-/issues/3209), the storage is selected automatically if not provided |
+| `destination_storage_name` | string | no | Name of the destination storage shard. In [GitLab 13.5 and later](https://gitlab.com/gitlab-org/gitaly/-/issues/3209), the storage is selected [automatically based on storage weights](../administration/repository_storage_paths.md#configure-where-new-repositories-are-stored) if not provided |
Example request:
@@ -255,7 +255,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `source_storage_name` | string | yes | Name of the source storage shard. |
-| `destination_storage_name` | string | no | Name of the destination storage shard. The storage is selected automatically if not provided. |
+| `destination_storage_name` | string | no | Name of the destination storage shard. The storage is selected [automatically based on storage weights](../administration/repository_storage_paths.md#configure-where-new-repositories-are-stored) if not provided. |
Example request:
diff --git a/doc/api/project_snippets.md b/doc/api/project_snippets.md
index c5adf361fb6..b07a4a4addf 100644
--- a/doc/api/project_snippets.md
+++ b/doc/api/project_snippets.md
@@ -5,7 +5,7 @@ info: "To determine the technical writer assigned to the Stage/Group associated
type: reference, api
---
-# Project snippets
+# Project snippets **(FREE)**
## Snippet visibility level
diff --git a/doc/api/project_templates.md b/doc/api/project_templates.md
index 6251d31660c..186b6a956a4 100644
--- a/doc/api/project_templates.md
+++ b/doc/api/project_templates.md
@@ -16,7 +16,7 @@ This API is a project-specific version of these endpoints:
- [Issue and merge request templates](../user/project/description_templates.md)
([introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/37890) in GitLab 13.3)
-It deprecates these endpoints, which will be removed for API version 5.
+It deprecates these endpoints, which are scheduled for removal in API version 5.
In addition to templates common to the entire instance, project-specific
templates are also available from this API endpoint.
@@ -34,7 +34,7 @@ GET /projects/:id/templates/:type
| Attribute | Type | Required | Description |
| ---------- | ------ | -------- | ----------- |
| `id` | integer / string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
-| `type` | string | yes | The type `(dockerfiles|gitignores|gitlab_ci_ymls|licenses|issues|merge_requests)` of the template |
+| `type` | string | yes | The type of the template. Accepted values are: `dockerfiles`, `gitignores`, `gitlab_ci_ymls`, `licenses`, `issues`, `merge_requests` |
Example response (licenses):
@@ -100,7 +100,7 @@ GET /projects/:id/templates/:type/:name
| Attribute | Type | Required | Description |
| ---------- | ------ | -------- | ----------- |
| `id` | integer / string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
-| `type` | string | yes| The type `(dockerfiles|gitignores|gitlab_ci_ymls|licenses|issues|merge_requests)` of the template |
+| `type` | string | yes| The type of the template. One of: `dockerfiles`, `gitignores`, `gitlab_ci_ymls`, `licenses`, `issues`, or `merge_requests`. |
| `name` | string | yes | The key of the template, as obtained from the collection endpoint |
| `source_template_project_id` | integer | no | The project ID where a given template is being stored. This is useful when multiple templates from different projects have the same name. If multiple templates have the same name, the match from `closest ancestor` is returned if `source_template_project_id` is not specified |
| `project` | string | no | The project name to use when expanding placeholders in the template. Only affects licenses |
diff --git a/doc/api/project_vulnerabilities.md b/doc/api/project_vulnerabilities.md
index 1f6a1a58276..969ebe1f9c6 100644
--- a/doc/api/project_vulnerabilities.md
+++ b/doc/api/project_vulnerabilities.md
@@ -18,7 +18,7 @@ Every API call to vulnerabilities must be [authenticated](README.md#authenticati
Vulnerability permissions inherit permissions from their project. If a project is
private, and a user isn't a member of the project to which the vulnerability
-belongs, requests to that project will return a `404 Not Found` status code.
+belongs, requests to that project returns a `404 Not Found` status code.
## Vulnerabilities pagination
@@ -32,7 +32,7 @@ List all of a project's vulnerabilities.
If an authenticated user does not have permission to
[use the Project Security Dashboard](../user/permissions.md#project-members-permissions),
-`GET` requests for vulnerabilities of this project will result in a `403` status code.
+`GET` requests for vulnerabilities of this project result in a `403` status code.
```plaintext
GET /projects/:id/vulnerabilities
@@ -109,7 +109,7 @@ Creates a new vulnerability.
If an authenticated user does not have a permission to
[create a new vulnerability](../user/permissions.md#project-members-permissions),
-this request will result in a `403` status code.
+this request results in a `403` status code.
```plaintext
POST /projects/:id/vulnerabilities?finding_id=<your_finding_id>
@@ -118,7 +118,7 @@ POST /projects/:id/vulnerabilities?finding_id=<your_finding_id>
| Attribute | Type | Required | Description |
| ------------------- | ----------------- | ---------- | -----------------------------------------------------------------------------------------------------------------------------|
| `id` | integer or string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) which the authenticated user is a member of |
-| `finding_id` | integer or string | yes | The ID of a Vulnerability Finding from which the new Vulnerability will be created |
+| `finding_id` | integer or string | yes | The ID of a Vulnerability Finding to create the new Vulnerability from |
The other attributes of a newly created Vulnerability are populated from
its source Vulnerability Finding, or with these default values:
diff --git a/doc/api/projects.md b/doc/api/projects.md
index 321a95af8b5..46997a1e8ae 100644
--- a/doc/api/projects.md
+++ b/doc/api/projects.md
@@ -45,8 +45,8 @@ 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. |
-| `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 |
+| `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. |
| `min_access_level` | integer | **{dotted-circle}** No | Limit by current user minimal [access level](members.md#valid-access-levels). |
| `order_by` | string | **{dotted-circle}** No | Return projects ordered by `id`, `name`, `path`, `created_at`, `updated_at`, or `last_activity_at` fields. `repository_size`, `storage_size`, `packages_size` or `wiki_size` fields are only allowed for admins. Default is `created_at`. |
@@ -179,6 +179,7 @@ When the user is authenticated and `simple` is not set this returns something li
"packages_size": 0,
"snippets_size": 0
},
+ "container_registry_image_prefix": "registry.example.com/diaspora/diaspora-client",
"_links": {
"self": "http://example.com/api/v4/projects",
"issues": "http://example.com/api/v4/projects/1/issues",
@@ -284,6 +285,7 @@ When the user is authenticated and `simple` is not set this returns something li
"packages_size": 0,
"snippets_size": 0
},
+ "container_registry_image_prefix": "registry.example.com/brightbox/puppet",
"_links": {
"self": "http://example.com/api/v4/projects",
"issues": "http://example.com/api/v4/projects/1/issues",
@@ -439,6 +441,7 @@ GET /users/:user_id/projects
"packages_size": 0,
"snippets_size": 0
},
+ "container_registry_image_prefix": "registry.example.com/diaspora/diaspora-client",
"_links": {
"self": "http://example.com/api/v4/projects",
"issues": "http://example.com/api/v4/projects/1/issues",
@@ -544,6 +547,7 @@ GET /users/:user_id/projects
"packages_size": 0,
"snippets_size": 0
},
+ "container_registry_image_prefix": "registry.example.com/brightbox/puppet",
"_links": {
"self": "http://example.com/api/v4/projects",
"issues": "http://example.com/api/v4/projects/1/issues",
@@ -658,6 +662,7 @@ Example response:
"lfs_objects_size": 0,
"job_artifacts_size": 0
},
+ "container_registry_image_prefix": "registry.example.com/diaspora/diaspora-client",
"_links": {
"self": "http://example.com/api/v4/projects",
"issues": "http://example.com/api/v4/projects/1/issues",
@@ -758,6 +763,7 @@ Example response:
"lfs_objects_size": 0,
"job_artifacts_size": 0
},
+ "container_registry_image_prefix": "registry.example.com/brightbox/puppet",
"_links": {
"self": "http://example.com/api/v4/projects",
"issues": "http://example.com/api/v4/projects/1/issues",
@@ -921,6 +927,7 @@ GET /projects/:id
"packages_size": 0,
"snippets_size": 0
},
+ "container_registry_image_prefix": "registry.example.com/diaspora/diaspora-client",
"_links": {
"self": "http://example.com/api/v4/projects",
"issues": "http://example.com/api/v4/projects/1/issues",
@@ -998,6 +1005,23 @@ If the project is a fork, and you provide a valid token to authenticate, the
}
```
+### Templates for issues and merge requests **(PREMIUM)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55718) in GitLab 13.10.
+
+Users of [GitLab Premium or higher](https://about.gitlab.com/pricing/)
+can also see the `issues_template` and `merge_requests_template` parameters for managing
+[issue and merge request description templates](../user/project/description_templates.md).
+
+```json
+{
+ "id": 3,
+ "issues_template": null,
+ "merge_requests_template": null,
+ ...
+}
+```
+
## Get project users
Get the users list of a project.
@@ -1033,6 +1057,43 @@ GET /projects/:id/users
]
```
+## List a project's groups
+
+Get a list of ancestor groups for this project.
+
+```plaintext
+GET /projects/:id/groups
+```
+
+| Attribute | Type | Required | Description |
+|-----------------------------|-------------------|------------------------|-------------|
+| `id` | integer/string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `search` | string | **{dotted-circle}** No | Search for specific groups. |
+| `skip_groups` | array of integers | **{dotted-circle}** No | Skip the group IDs passed. |
+| `with_shared` | boolean | **{dotted-circle}** No | Include projects shared with this group. Default is `false`. |
+| `shared_min_access_level` | integer | **{dotted-circle}** No | Limit to shared groups with at least this [access level](members.md#valid-access-levels). |
+
+```json
+[
+ {
+ "id": 1,
+ "name": "Foobar Group",
+ "avatar_url": "http://localhost:3000/uploads/group/avatar/1/foo.jpg",
+ "web_url": "http://localhost:3000/groups/foo-bar",
+ "full_name": "Foobar Group",
+ "full_path": "foo-bar",
+ },
+ {
+ "id": 2,
+ "name": "Shared Group",
+ "avatar_url": "http://gitlab.example.com/uploads/group/avatar/1/bar.jpg",
+ "web_url": "http://gitlab.example.com/groups/foo/bar",
+ "full_name": "Shared Group",
+ "full_path": "foo/shared",
+ }
+]
+```
+
## Get project events
Refer to the [Events API documentation](events.md#list-a-projects-visible-events).
@@ -1052,7 +1113,7 @@ POST /projects
| Attribute | Type | Required | Description |
|-------------------------------------------------------------|---------|------------------------|-------------|
| `allow_merge_on_skipped_pipeline` | boolean | **{dotted-circle}** No | Set whether or not merge requests can be merged with skipped jobs. |
-| `analytics_access_level` | string | no | One of `disabled`, `private` or `enabled` |
+| `analytics_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private` or `enabled` |
| `approvals_before_merge` **(PREMIUM)** | integer | **{dotted-circle}** No | How many approvers should approve merge requests by default. |
| `auto_cancel_pending_pipelines` | string | **{dotted-circle}** No | Auto-cancel pending pipelines. This isn't a boolean, but enabled/disabled. |
| `auto_devops_deploy_strategy` | string | **{dotted-circle}** No | Auto Deploy strategy (`continuous`, `manual` or `timed_incremental`). |
@@ -1061,7 +1122,7 @@ POST /projects
| `avatar` | mixed | **{dotted-circle}** No | Image file for avatar of the project. |
| `build_coverage_regex` | string | **{dotted-circle}** No | Test coverage parsing. |
| `build_git_strategy` | string | **{dotted-circle}** No | The Git strategy. Defaults to `fetch`. |
-| `build_timeout` | integer | **{dotted-circle}** No | The maximum amount of time in minutes that a job is able run (in seconds). |
+| `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). |
@@ -1126,7 +1187,7 @@ POST /projects/user/:user_id
| Attribute | Type | Required | Description |
|-------------------------------------------------------------|---------|------------------------|-------------|
| `allow_merge_on_skipped_pipeline` | boolean | **{dotted-circle}** No | Set whether or not merge requests can be merged with skipped jobs. |
-| `analytics_access_level` | string | no | One of `disabled`, `private` or `enabled` |
+| `analytics_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private` or `enabled` |
| `approvals_before_merge` **(PREMIUM)** | integer | **{dotted-circle}** No | How many approvers should approve merge requests by default. |
| `auto_cancel_pending_pipelines` | string | **{dotted-circle}** No | Auto-cancel pending pipelines. This isn't a boolean, but enabled/disabled. |
| `auto_devops_deploy_strategy` | string | **{dotted-circle}** No | Auto Deploy strategy (`continuous`, `manual` or `timed_incremental`). |
@@ -1199,7 +1260,7 @@ PUT /projects/:id
| Attribute | Type | Required | Description |
|-------------------------------------------------------------|----------------|------------------------|-------------|
| `allow_merge_on_skipped_pipeline` | boolean | **{dotted-circle}** No | Set whether or not merge requests can be merged with skipped jobs. |
-| `analytics_access_level` | string | no | One of `disabled`, `private` or `enabled` |
+| `analytics_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private` or `enabled` |
| `approvals_before_merge` **(PREMIUM)** | integer | **{dotted-circle}** No | How many approvers should approve merge request by default. |
| `auto_cancel_pending_pipelines` | string | **{dotted-circle}** No | Auto-cancel pending pipelines. This isn't a boolean, but enabled/disabled. |
| `auto_devops_deploy_strategy` | string | **{dotted-circle}** No | Auto Deploy strategy (`continuous`, `manual`, or `timed_incremental`). |
@@ -1259,6 +1320,8 @@ PUT /projects/:id
| `visibility` | string | **{dotted-circle}** No | See [project visibility level](#project-visibility-level). |
| `wiki_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private`, or `enabled`. |
| `wiki_enabled` | boolean | **{dotted-circle}** No | _(Deprecated)_ Enable wiki for this project. Use `wiki_access_level` instead. |
+| `issues_template` **(PREMIUM)** | string | **{dotted-circle}** No | Default description for Issues. Description is parsed with GitLab Flavored Markdown. See [Templates for issues and merge requests](#templates-for-issues-and-merge-requests). |
+| `merge_requests_template` **(PREMIUM)** | string | **{dotted-circle}** No | Default description for Merge Requests. Description is parsed with GitLab Flavored Markdown. See [Templates for issues and merge requests](#templates-for-issues-and-merge-requests). |
## Fork project
@@ -1373,6 +1436,7 @@ Example responses:
"merge_method": "merge",
"autoclose_referenced_issues": true,
"suggestion_commit_message": null,
+ "container_registry_image_prefix": "registry.example.com/diaspora/diaspora-project-site",
"_links": {
"self": "http://example.com/api/v4/projects",
"issues": "http://example.com/api/v4/projects/1/issues",
@@ -1467,6 +1531,7 @@ Example response:
"merge_method": "merge",
"autoclose_referenced_issues": true,
"suggestion_commit_message": null,
+ "container_registry_image_prefix": "registry.example.com/diaspora/diaspora-project-site",
"_links": {
"self": "http://example.com/api/v4/projects",
"issues": "http://example.com/api/v4/projects/1/issues",
@@ -1559,6 +1624,7 @@ Example response:
"merge_method": "merge",
"autoclose_referenced_issues": true,
"suggestion_commit_message": null,
+ "container_registry_image_prefix": "registry.example.com/diaspora/diaspora-project-site",
"_links": {
"self": "http://example.com/api/v4/projects",
"issues": "http://example.com/api/v4/projects/1/issues",
@@ -1745,6 +1811,7 @@ Example response:
"merge_method": "merge",
"autoclose_referenced_issues": true,
"suggestion_commit_message": null,
+ "container_registry_image_prefix": "registry.example.com/diaspora/diaspora-project-site",
"_links": {
"self": "http://example.com/api/v4/projects",
"issues": "http://example.com/api/v4/projects/1/issues",
@@ -1858,6 +1925,7 @@ Example response:
"merge_method": "merge",
"autoclose_referenced_issues": true,
"suggestion_commit_message": null,
+ "container_registry_image_prefix": "registry.example.com/diaspora/diaspora-project-site",
"_links": {
"self": "http://example.com/api/v4/projects",
"issues": "http://example.com/api/v4/projects/1/issues",
@@ -1878,7 +1946,7 @@ This endpoint:
merge requests).
- From [GitLab 13.2](https://gitlab.com/gitlab-org/gitlab/-/issues/220382) on
[Premium or higher](https://about.gitlab.com/pricing/) tiers, group
- admins can [configure](../user/group/index.md#enabling-delayed-project-removal)
+ admins can [configure](../user/group/index.md#enable-delayed-project-removal)
projects within a group to be deleted after a delayed period. When enabled,
actual deletion happens after the number of days specified in the
[default deletion delay](../user/admin_area/settings/visibility_and_access_controls.md#default-deletion-delay).
@@ -1886,7 +1954,7 @@ This endpoint:
WARNING:
The default behavior of [Delayed Project deletion](https://gitlab.com/gitlab-org/gitlab/-/issues/32935)
in GitLab 12.6 was changed to [Immediate deletion](https://gitlab.com/gitlab-org/gitlab/-/issues/220382)
-in GitLab 13.2, as discussed in [Enabling delayed project removal](../user/group/index.md#enabling-delayed-project-removal).
+in GitLab 13.2, as discussed in [Enable delayed project removal](../user/group/index.md#enable-delayed-project-removal).
```plaintext
DELETE /projects/:id
@@ -2354,6 +2422,7 @@ Example response:
"avatar_url": null,
"web_url": "https://gitlab.example.com/groups/cute-cats"
},
+ "container_registry_image_prefix": "registry.example.com/cute-cats/hello-world",
"_links": {
"self": "https://gitlab.example.com/api/v4/projects/7",
"issues": "https://gitlab.example.com/api/v4/projects/7/issues",
@@ -2471,12 +2540,6 @@ curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitla
Read more in the [Project Badges](project_badges.md) documentation.
-## Issue and merge request description templates
-
-The non-default [issue and merge request description templates](../user/project/description_templates.md)
-are managed inside the project's repository. So you can manage them with the API
-through the [Repositories API](repositories.md) and the [Repository Files API](repository_files.md).
-
## Download snapshot of a Git repository
> Introduced in GitLab 10.7
diff --git a/doc/api/protected_branches.md b/doc/api/protected_branches.md
index 12ba40d5df5..e5560360532 100644
--- a/doc/api/protected_branches.md
+++ b/doc/api/protected_branches.md
@@ -56,7 +56,8 @@ Example response:
"access_level_description": "Maintainers"
}
],
- "code_owner_approval_required": "false"
+ "allow_force_push":false,
+ "code_owner_approval_required": false
},
...
]
@@ -88,7 +89,8 @@ Example response:
"access_level_description": "Example Merge Group"
}
],
- "code_owner_approval_required": "false"
+ "allow_force_push":false,
+ "code_owner_approval_required": false
},
...
]
@@ -129,7 +131,8 @@ Example response:
"access_level_description": "Maintainers"
}
],
- "code_owner_approval_required": "false"
+ "allow_force_push":false,
+ "code_owner_approval_required": false
}
```
@@ -158,7 +161,8 @@ Example response:
"access_level_description": "Example Merge Group"
}
],
- "code_owner_approval_required": "false"
+ "allow_force_push":false,
+ "code_owner_approval_required": false
}
```
@@ -182,6 +186,7 @@ curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitla
| `push_access_level` | string | no | Access levels allowed to push (defaults: `40`, maintainer access level) |
| `merge_access_level` | string | no | Access levels allowed to merge (defaults: `40`, maintainer access level) |
| `unprotect_access_level` | string | no | Access levels allowed to unprotect (defaults: `40`, maintainer access level) |
+| `allow_force_push` | boolean | no | Allow force push for all users with push access. (defaults: false) |
| `allowed_to_push` | array | no | **(PREMIUM)** Array of access levels allowed to push, with each described by a hash |
| `allowed_to_merge` | array | no | **(PREMIUM)** Array of access levels allowed to merge, with each described by a hash |
| `allowed_to_unprotect` | array | no | **(PREMIUM)** Array of access levels allowed to unprotect, with each described by a hash |
@@ -211,7 +216,8 @@ Example response:
"access_level_description": "Maintainers"
}
],
- "code_owner_approval_required": "false"
+ "allow_force_push":false,
+ "code_owner_approval_required": false
}
```
@@ -248,7 +254,8 @@ Example response:
"access_level_description": "Maintainers"
}
],
- "code_owner_approval_required": "false"
+ "allow_force_push":false,
+ "code_owner_approval_required": false
}
```
@@ -291,7 +298,8 @@ Example response:
"access_level_description": "Maintainers"
}
],
- "code_owner_approval_required": "false"
+ "allow_force_push":false,
+ "code_owner_approval_required": false
}
```
@@ -354,6 +362,7 @@ Example response:
"group_id": null
}
],
+ "allow_force_push":false,
"code_owner_approval_required": false
}
```
diff --git a/doc/api/releases/index.md b/doc/api/releases/index.md
index be9512ed0e0..67e441ee7e4 100644
--- a/doc/api/releases/index.md
+++ b/doc/api/releases/index.md
@@ -350,7 +350,7 @@ Example response:
## Create a release
-Create a Release. You need push access to the repository to create a Release.
+Create a release. Developer level access to the project is required to create a release.
```plaintext
POST /projects/:id/releases
@@ -524,7 +524,7 @@ Example response:
## Update a release
-Update a Release.
+Update a release. Developer level access to the project is required to update a release.
```plaintext
PUT /projects/:id/releases/:tag_name
@@ -631,7 +631,7 @@ Example response:
## Delete a Release
-Delete a Release. Deleting a Release doesn't delete the associated tag.
+Delete a release. Deleting a release doesn't delete the associated tag. Maintainer level access to the project is required to delete a release.
```plaintext
DELETE /projects/:id/releases/:tag_name
diff --git a/doc/api/remote_mirrors.md b/doc/api/remote_mirrors.md
index 638d4a3b917..c85454d66ee 100644
--- a/doc/api/remote_mirrors.md
+++ b/doc/api/remote_mirrors.md
@@ -48,14 +48,14 @@ Example response:
```
NOTE:
-For security reasons, the `url` attribute will always be scrubbed of username
+For security reasons, the `url` attribute is always scrubbed of username
and password information.
## Create a remote mirror
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/24189) in GitLab 12.9.
-Create a remote mirror for a project. The mirror will be disabled by default. You can enable it by including the optional parameter `enabled` when creating it:
+Create a remote mirror for a project. The mirror is disabled by default. You can enable it by including the optional parameter `enabled` when creating it:
```plaintext
POST /projects/:id/remote_mirrors
diff --git a/doc/api/repositories.md b/doc/api/repositories.md
index b0b3160e075..50dc0803646 100644
--- a/doc/api/repositories.md
+++ b/doc/api/repositories.md
@@ -285,8 +285,8 @@ Example response:
Generate changelog data based on commits in a repository.
-Given a version (using semantic versioning) and a range of commits,
-GitLab generates a changelog for all commits that use a particular
+Given a version (using [semantic versioning](https://semver.org/)) and a range
+of commits, GitLab generates a changelog for all commits that use a particular
[Git trailer](https://git-scm.com/docs/git-interpret-trailers).
The output of this process is a new section in a changelog file in the Git
@@ -303,7 +303,7 @@ Supported attributes:
| :-------- | :------- | :--------- | :---------- |
| `version` | string | yes | The version to generate the changelog for. The format must follow [semantic versioning](https://semver.org/). |
| `from` | string | no | The start of the range of commits (as a SHA) to use for generating the changelog. This commit itself isn't included in the list. |
-| `to` | string | yes | The end of the range of commits (as a SHA) to use for the changelog. This commit _is_ included in the list. |
+| `to` | string | no | The end of the range of commits (as a SHA) to use for the changelog. This commit _is_ included in the list. Defaults to the branch specified in the `branch` attribute. |
| `date` | datetime | no | The date and time of the release, defaults to the current time. |
| `branch` | string | no | The branch to commit the changelog changes to, defaults to the project's default branch. |
| `trailer` | string | no | The Git trailer to use for including commits, defaults to `Changelog`. |
@@ -311,28 +311,72 @@ Supported attributes:
| `message` | string | no | The commit message to produce when committing the changes, defaults to `Add changelog for version X` where X is the value of the `version` argument. |
If the `from` attribute is unspecified, GitLab uses the Git tag of the last
-version that came before the version specified in the `version` attribute. For
-this to work, your project must create Git tags for versions using the
-following format:
+stable version that came before the version specified in the `version`
+attribute. For this to work, your project must create Git tags for versions
+using one of the following formats:
-```plaintext
-vX.Y.Z
-```
+- `vX.Y.Z`
+- `X.Y.Z`
-Where `X.Y.Z` is a version that follows semantic versioning. For example,
-consider a project with the following tags:
+Where `X.Y.Z` is a version that follows [semantic
+versioning](https://semver.org/). For example, consider a project with the
+following tags:
+- v1.0.0-pre1
- v1.0.0
- v1.1.0
- v2.0.0
If the `version` attribute is `2.1.0`, GitLab uses tag v2.0.0. And when the
-version is `1.1.1`, or `1.2.0`, GitLab uses tag v1.1.0.
+version is `1.1.1`, or `1.2.0`, GitLab uses tag v1.1.0. The tag `v1.0.0-pre1` is
+never used, because pre-release tags are ignored.
If `from` is unspecified and no tag to use is found, the API produces an error.
To solve such an error, you must explicitly specify a value for the `from`
attribute.
+### Examples
+
+These examples use [cURL](https://curl.se/) to perform HTTP requests.
+The example commands use these values:
+
+- **Project ID**: 42
+- **Location**: hosted on GitLab.com
+- **Example API token**: `token`
+
+This command generates a changelog for version `1.0.0`.
+
+The commit range:
+
+- Starts with the tag of the last release.
+- Ends with the last commit on the target branch. The default target branch is the project's default branch.
+
+If the last tag is `v0.9.0` and the default branch is `main`, the range of commits
+included in this example is `v0.9.0..main`:
+
+```shell
+curl --header "PRIVATE-TOKEN: token" --data "version=1.0.0" "https://gitlab.com/api/v4/projects/42/repository/changelog"
+```
+
+To generate the data on a different branch, specify the `branch` parameter. This
+command generates data from the `foo` branch:
+
+```shell
+curl --header "PRIVATE-TOKEN: token" --data "version=1.0.0&branch=foo" "https://gitlab.com/api/v4/projects/42/repository/changelog"
+```
+
+To use a different trailer, use the `trailer` parameter:
+
+```shell
+curl --header "PRIVATE-TOKEN: token" --data "version=1.0.0&trailer=Type" "https://gitlab.com/api/v4/projects/42/repository/changelog"
+```
+
+To store the results in a different file, use the `file` parameter:
+
+```shell
+curl --header "PRIVATE-TOKEN: token" --data "version=1.0.0&file=NEWS" "https://gitlab.com/api/v4/projects/42/repository/changelog"
+```
+
### How it works
Changelogs are generated based on commit titles. Commits are only included if
@@ -351,6 +395,26 @@ these as the changelog entries. You can enrich entries with additional data,
such as a link to the merge request or details about the commit author. You can
[customize the format of a changelog](#customize-the-changelog-output) section with a template.
+### Reverted commits
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55537) in GitLab 13.10.
+
+When generating a changelog for a range, GitLab ignores commits both added and
+reverted in that range. Revert commits themselves _are_ included if they use the
+Git trailer used for generating changelogs.
+
+Imagine the following scenario: you have three commits: A, B, and C. To generate
+changelogs, you use the default trailer `Changelog`. Both A and B use this
+trailer. Commit C is a commit that reverts commit B. When generating a changelog
+for this range, GitLab only includes commit A.
+
+Revert commits are detected by looking for commits where the message contains
+the pattern `This reverts commit SHA`, where `SHA` is the SHA of the commit that
+is reverted.
+
+If a revert commit includes the trailer used for generating changelogs
+(`Changelog` in the above example), the revert commit itself _is_ included.
+
### Customize the changelog output
The output is customized using a YAML configuration file stored in your
diff --git a/doc/api/repository_submodules.md b/doc/api/repository_submodules.md
index c014bb44861..1d7ca903fee 100644
--- a/doc/api/repository_submodules.md
+++ b/doc/api/repository_submodules.md
@@ -26,7 +26,7 @@ PUT /projects/:id/repository/submodules/:submodule
| `submodule` | string | yes | URL-encoded full path to the submodule. For example, `lib%2Fclass%2Erb` |
| `branch` | string | yes | Name of the branch to commit into |
| `commit_sha` | string | yes | Full commit SHA to update the submodule to |
-| `commit_message` | string | no | Commit message. If no message is provided, a default one will be set |
+| `commit_message` | string | no | Commit message. If no message is provided, a default is set |
```shell
curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/repository/submodules/lib%2Fmodules%2Fexample" \
diff --git a/doc/api/resource_access_tokens.md b/doc/api/resource_access_tokens.md
index 50f5ea73634..2b6400a6f0d 100644
--- a/doc/api/resource_access_tokens.md
+++ b/doc/api/resource_access_tokens.md
@@ -78,7 +78,8 @@ curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
"created_at" : "2021-01-21T19:35:37.921Z",
"user_id" : 166,
"id" : 58,
- "expires_at" : "2021-01-31"
+ "expires_at" : "2021-01-31",
+ "token" : "D4y...Wzr"
}
```
diff --git a/doc/api/search.md b/doc/api/search.md
index 9e1407fdffd..c8f24c0924a 100644
--- a/doc/api/search.md
+++ b/doc/api/search.md
@@ -12,7 +12,7 @@ type: reference, api
Every API call to search must be authenticated.
-## Global Search API
+## Advanced Search API
Search globally across the GitLab instance.
@@ -26,8 +26,8 @@ GET /search
| `search` | string | yes | The search query |
| `state` | string | no | Filter by state. Issues and merge requests are supported; it is ignored for other scopes. |
| `confidential` | boolean | no | Filter by confidentiality. Issues scope is supported; it is ignored for other scopes. |
-| `order_by` | string | no | Allowed values are `created_at` only. If this is not set, the results will either be sorted by `created_at` in descending order for basic search, or by the most relevant documents when using advanced search.|
-| `sort` | string | no | Allowed values are `asc` or `desc` only. If this is not set, the results will either be sorted by `created_at` in descending order for basic search, or by the most relevant documents when using advanced search.|
+| `order_by` | string | no | Allowed values are `created_at` only. If this is not set, the results are either sorted by `created_at` in descending order for basic search, or by the most relevant documents when using advanced search.|
+| `sort` | string | no | Allowed values are `asc` or `desc` only. If this is not set, the results are either sorted by `created_at` in descending order for basic search, or by the most relevant documents when using advanced search.|
Search the expression within the specified scope. Currently these scopes are supported: projects, issues, merge_requests, milestones, snippet_titles, users.
@@ -295,7 +295,7 @@ Example response:
```
NOTE:
-`filename` is deprecated in favor of `path`. Both return the full path of the file inside the repository, but in the future `filename` will be only the filename and not the full path. For details, see [issue 34521](https://gitlab.com/gitlab-org/gitlab/-/issues/34521).
+`filename` is deprecated in favor of `path`. Both return the full path of the file inside the repository, but in the future `filename` is intended to be only the filename and not the full path. For details, see [issue 34521](https://gitlab.com/gitlab-org/gitlab/-/issues/34521).
### Scope: commits **(PREMIUM)**
@@ -371,7 +371,7 @@ Example response:
```
NOTE:
-`filename` is deprecated in favor of `path`. Both return the full path of the file inside the repository, but in the future `filename` will be only the file name and not the full path. For details, see [issue 34521](https://gitlab.com/gitlab-org/gitlab/-/issues/34521).
+`filename` is deprecated in favor of `path`. Both return the full path of the file inside the repository, but in the future `filename` is intended to be only the filename and not the full path. For details, see [issue 34521](https://gitlab.com/gitlab-org/gitlab/-/issues/34521).
### Scope: notes **(PREMIUM)**
@@ -434,7 +434,7 @@ Example response:
Search within the specified group.
-If a user is not a member of a group and the group is private, a `GET` request on that group will result to a `404` status code.
+If a user is not a member of a group and the group is private, a `GET` request on that group results in a `404` status code.
```plaintext
GET /groups/:id/search
@@ -447,8 +447,8 @@ GET /groups/:id/search
| `search` | string | yes | The search query |
| `state` | string | no | Filter by state. Issues and merge requests are supported; it is ignored for other scopes. |
| `confidential` | boolean | no | Filter by confidentiality. Issues scope is supported; it is ignored for other scopes. |
-| `order_by` | string | no | Allowed values are `created_at` only. If this is not set, the results will either be sorted by `created_at` in descending order for basic search, or by the most relevant documents when using advanced search.|
-| `sort` | string | no | Allowed values are `asc` or `desc` only. If this is not set, the results will either be sorted by `created_at` in descending order for basic search, or by the most relevant documents when using advanced search.|
+| `order_by` | string | no | Allowed values are `created_at` only. If this is not set, the results are either sorted by `created_at` in descending order for basic search, or by the most relevant documents when using advanced search.|
+| `sort` | string | no | Allowed values are `asc` or `desc` only. If this is not set, the results are either sorted by `created_at` in descending order for basic search, or by the most relevant documents when using advanced search.|
Search the expression within the specified scope. Currently these scopes are supported: projects, issues, merge_requests, milestones, users.
@@ -685,7 +685,7 @@ Example response:
```
NOTE:
-`filename` is deprecated in favor of `path`. Both return the full path of the file inside the repository, but in the future `filename` will be only the filename and not the full path. For details, see [issue 34521](https://gitlab.com/gitlab-org/gitlab/-/issues/34521).
+`filename` is deprecated in favor of `path`. Both return the full path of the file inside the repository, but in the future `filename` is intended to be only the filename and not the full path. For details, see [issue 34521](https://gitlab.com/gitlab-org/gitlab/-/issues/34521).
### Scope: commits **(PREMIUM)**
@@ -761,7 +761,7 @@ Example response:
```
NOTE:
-`filename` is deprecated in favor of `path`. Both return the full path of the file inside the repository, but in the future `filename` will be only the file name and not the full path. For details, see [issue 34521](https://gitlab.com/gitlab-org/gitlab/-/issues/34521).
+`filename` is deprecated in favor of `path`. Both return the full path of the file inside the repository, but in the future `filename` is intended to be only the filename and not the full path. For details, see [issue 34521](https://gitlab.com/gitlab-org/gitlab/-/issues/34521).
### Scope: notes **(PREMIUM)**
@@ -824,7 +824,7 @@ Example response:
Search within the specified project.
-If a user is not a member of a project and the project is private, a `GET` request on that project will result to a `404` status code.
+If a user is not a member of a project and the project is private, a `GET` request on that project results in a `404` status code.
```plaintext
GET /projects/:id/search
@@ -838,8 +838,8 @@ GET /projects/:id/search
| `ref` | string | no | The name of a repository branch or tag to search on. The project's default branch is used by default. This is only applicable for scopes: commits, blobs, and wiki_blobs. |
| `state` | string | no | Filter by state. Issues and merge requests are supported; it is ignored for other scopes. |
| `confidential` | boolean | no | Filter by confidentiality. Issues scope is supported; it is ignored for other scopes. |
-| `order_by` | string | no | Allowed values are `created_at` only. If this is not set, the results will either be sorted by `created_at` in descending order for basic search, or by the most relevant documents when using advanced search.|
-| `sort` | string | no | Allowed values are `asc` or `desc` only. If this is not set, the results will either be sorted by `created_at` in descending order for basic search, or by the most relevant documents when using advanced search.|
+| `order_by` | string | no | Allowed values are `created_at` only. If this is not set, the results are either sorted by `created_at` in descending order for basic search, or by the most relevant documents when using advanced search.|
+| `sort` | string | no | Allowed values are `asc` or `desc` only. If this is not set, the results are either sorted by `created_at` in descending order for basic search, or by the most relevant documents when using advanced search.|
Search the expression within the specified scope. Currently these scopes are supported: issues, merge_requests, milestones, notes, wiki_blobs, commits, blobs, users.
@@ -1096,7 +1096,7 @@ Example response:
```
NOTE:
-`filename` is deprecated in favor of `path`. Both return the full path of the file inside the repository, but in the future `filename` will be only the filename and not the full path. For details, see [issue 34521](https://gitlab.com/gitlab-org/gitlab/-/issues/34521).
+`filename` is deprecated in favor of `path`. Both return the full path of the file inside the repository, but in the future `filename` are intended to be only the filename and not the full path. For details, see [issue 34521](https://gitlab.com/gitlab-org/gitlab/-/issues/34521).
### Scope: commits **(PREMIUM)**
@@ -1178,7 +1178,7 @@ Example response:
```
NOTE:
-`filename` is deprecated in favor of `path`. Both return the full path of the file inside the repository, but in the future `filename` will be only the filename and not the full path. For details, see [issue 34521](https://gitlab.com/gitlab-org/gitlab/-/issues/34521).
+`filename` is deprecated in favor of `path`. Both return the full path of the file inside the repository, but in the future `filename` is intended to be only the filename and not the full path. For details, see [issue 34521](https://gitlab.com/gitlab-org/gitlab/-/issues/34521).
### Scope: users
diff --git a/doc/api/services.md b/doc/api/services.md
index 16431937c7a..765f459e704 100644
--- a/doc/api/services.md
+++ b/doc/api/services.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Services API
+# Services API **(FREE)**
NOTE:
This API requires an access token with Maintainer or Owner permissions
diff --git a/doc/api/settings.md b/doc/api/settings.md
index 2fd58917aad..91cbbeaf50a 100644
--- a/doc/api/settings.md
+++ b/doc/api/settings.md
@@ -305,8 +305,10 @@ listed in the descriptions of the relevant settings.
| `housekeeping_incremental_repack_period` | integer | required by: `housekeeping_enabled` | Number of Git pushes after which an incremental `git repack` is run. |
| `html_emails_enabled` | boolean | no | Enable HTML emails. |
| `import_sources` | array of strings | no | Sources to allow project import from, possible values: `github`, `bitbucket`, `bitbucket_server`, `gitlab`, `fogbugz`, `git`, `gitlab_project`, `gitea`, `manifest`, and `phabricator`. |
+| `in_product_marketing_emails_enabled` | boolean | no | Enable in-product marketing emails. Enabled by default. |
| `invisible_captcha_enabled` | boolean | no | <!-- vale gitlab.Spelling = NO --> Enable Invisible Captcha <!-- vale gitlab.Spelling = YES --> 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. |
| `local_markdown_version` | integer | no | Increase this value when any cached Markdown should be invalidated. |
| `maintenance_mode_message` | string | no | **(PREMIUM)** Message displayed when instance is in maintenance mode |
| `maintenance_mode` | boolean | no | **(PREMIUM)** When instance is in maintenance mode, non-administrative users can sign in with read-only access and make read-only API requests |
@@ -334,7 +336,7 @@ listed in the descriptions of the relevant settings.
| `polling_interval_multiplier` | decimal | no | Interval multiplier used by endpoints that perform polling. Set to `0` to disable polling. |
| `project_export_enabled` | boolean | no | Enable project export. |
| `prometheus_metrics_enabled` | boolean | no | Enable Prometheus metrics. |
-| `protected_ci_variables` | boolean | no | Environment variables are protected by default. |
+| `protected_ci_variables` | boolean | no | CI/CD variables are protected by default. |
| `pseudonymizer_enabled` | boolean | no | **(PREMIUM)** When enabled, GitLab runs a background job that produces pseudonymized CSVs of the GitLab database to upload to your configured object storage directory.
| `push_event_activities_limit` | integer | no | Number of changes (branches or tags) in a single push to determine whether individual push events or bulk push events are created. [Bulk push events are created](../user/admin_area/settings/push_event_activities_limit.md) if it surpasses that value. |
| `push_event_hooks_limit` | integer | no | Number of changes (branches or tags) in a single push to determine whether webhooks and services fire or not. Webhooks and services aren't submitted if it surpasses that value. |
@@ -398,3 +400,8 @@ listed in the descriptions of the relevant settings.
| `version_check_enabled` | boolean | no | Let GitLab inform you when an update is available. |
| `web_ide_clientside_preview_enabled` | boolean | no | Live Preview (allow live previews of JavaScript projects in the Web IDE using CodeSandbox Live Preview). |
| `wiki_page_max_content_bytes` | integer | no | Maximum wiki page content size in **bytes**. Default: 52428800 Bytes (50 MB). The minimum value is 1024 bytes. |
+
+### Package Registry: Package file size limits
+
+The package file size limits are not part of the Application settings API.
+Instead, these settings can be accessed using the [Plan limits API](plan_limits.md).
diff --git a/doc/api/snippet_repository_storage_moves.md b/doc/api/snippet_repository_storage_moves.md
index 393ca30c28d..80037dd7aa3 100644
--- a/doc/api/snippet_repository_storage_moves.md
+++ b/doc/api/snippet_repository_storage_moves.md
@@ -225,7 +225,7 @@ Supported attributes:
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `snippet_id` | integer | yes | ID of the snippet. |
-| `destination_storage_name` | string | no | Name of the destination storage shard. In [GitLab 13.5 and later](https://gitlab.com/gitlab-org/gitaly/-/issues/3209), the storage is selected automatically if not provided. |
+| `destination_storage_name` | string | no | Name of the destination storage shard. In [GitLab 13.5 and later](https://gitlab.com/gitlab-org/gitaly/-/issues/3209), the storage is selected [automatically based on storage weights](../administration/repository_storage_paths.md#configure-where-new-repositories-are-stored) if not provided. |
Example request:
@@ -274,7 +274,7 @@ Supported attributes:
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `source_storage_name` | string | yes | Name of the source storage shard. |
-| `destination_storage_name` | string | no | Name of the destination storage shard. The storage is selected automatically if not provided. |
+| `destination_storage_name` | string | no | Name of the destination storage shard. The storage is selected [automatically based on storage weights](../administration/repository_storage_paths.md#configure-where-new-repositories-are-stored) if not provided. |
Example request:
diff --git a/doc/api/snippets.md b/doc/api/snippets.md
index 670045df66d..cf1cfa567db 100644
--- a/doc/api/snippets.md
+++ b/doc/api/snippets.md
@@ -5,11 +5,13 @@ info: "To determine the technical writer assigned to the Stage/Group associated
type: reference, api
---
-# Snippets API
+# Snippets API **(FREE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/6373) in GitLab 8.15.
-Snippets API operates on [snippets](../user/snippets.md).
+Snippets API operates on [snippets](../user/snippets.md). Related APIs exist for
+[project snippets](project_snippets.md) and
+[moving snippets between storages](snippet_repository_storage_moves.md).
## Snippet visibility level
@@ -230,7 +232,7 @@ curl --request POST "https://gitlab.example.com/api/v4/snippets" \
"content": "Hello world",
"file_path": "test.txt"
}
- ]
+ ]
}
```
@@ -289,14 +291,12 @@ Parameters:
| `content` | string | no | Deprecated: Use `files` instead. Content of a snippet |
| `description` | string | no | Description of a snippet |
| `visibility` | string | no | Snippet's [visibility](#snippet-visibility-level) |
-| `files` | array of hashes | no | An array of snippet files |
+| `files` | array of hashes | sometimes | An array of snippet files. Required when updating snippets with multiple files. |
| `files:action` | string | yes | Type of action to perform on the file, one of: 'create', 'update', 'delete', 'move' |
| `files:file_path` | string | no | File path of the snippet file |
| `files:previous_path` | string | no | Previous path of the snippet file |
| `files:content` | string | no | Content of the snippet file |
-Updates to snippets with multiple files *must* use the `files` attribute.
-
Example request:
```shell
diff --git a/doc/api/tags.md b/doc/api/tags.md
index eef4504aa5b..3ac4e8bb6ab 100644
--- a/doc/api/tags.md
+++ b/doc/api/tags.md
@@ -160,11 +160,10 @@ Example response:
}
```
-The message will be `null` when creating a lightweight tag otherwise
-it will contain the annotation.
+The message is `null` when creating a lightweight tag. Otherwise, it contains the annotation.
-The target will contain the tag objects ID when creating annotated tags,
-otherwise it will contain the commit ID when creating lightweight tags.
+The target contains the tag objects ID when creating annotated tags,
+otherwise it contains the commit ID when creating lightweight tags.
In case of an error,
status code `405` with an explaining error message is returned.
diff --git a/doc/api/users.md b/doc/api/users.md
index 76b0bb3491c..b8917f3e215 100644
--- a/doc/api/users.md
+++ b/doc/api/users.md
@@ -53,6 +53,9 @@ For example:
GET /users?username=jack_smith
```
+NOTE:
+Username search is case insensitive.
+
In addition, you can filter users based on the states `blocked` and `active`.
It does not support `active=false` or `blocked=false`. The list of billable users
is the total number of users minus the blocked users.
@@ -65,17 +68,33 @@ GET /users?active=true
GET /users?blocked=true
```
+In addition, you can search for external users only with `external=true`.
+It does not support `external=false`.
+
+```plaintext
+GET /users?external=true
+```
+
GitLab supports bot users such as the [alert bot](../operations/incident_management/integrations.md)
or the [support bot](../user/project/service_desk.md#support-bot-user).
-To exclude these users from the users' list, you can use the parameter `exclude_internal=true`
+You can exclude the following types of [internal users](../development/internal_users.md#internal-users)
+from the users' list, with the `exclude_internal=true` parameter,
([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/241144) in GitLab 13.4).
+- Alert bot
+- Support bot
+
+However, this action does not exclude [project bot users](../user/project/settings/project_access_tokens.md#project-bot-users).
+
```plaintext
GET /users?exclude_internal=true
```
-NOTE:
-Username search is case insensitive.
+In addition, to exclude external users from the users' list, you can use the parameter `exclude_external=true`.
+
+```plaintext
+GET /users?exclude_external=true
+```
### For admins
@@ -217,10 +236,6 @@ For example:
GET /users?extern_uid=1234567&provider=github
```
-Instance administrators can search for users who are external with: `/users?external=true`
-
-You cannot search for external users if you are not an instance administrator.
-
You can search users by creation date time range with:
```plaintext
@@ -433,6 +448,7 @@ Parameters:
| `theme_id` | No | The GitLab theme for the user (see [the user preference docs](../user/profile/preferences.md#navigation-theme) for more information) |
| `twitter` | No | Twitter account |
| `username` | Yes | Username |
+| `view_diffs_file_by_file` | No | Flag indicating the user sees only one file diff per page |
| `website_url` | No | Website URL |
## User modification
@@ -474,6 +490,7 @@ Parameters:
| `theme_id` | No | The GitLab theme for the user (see [the user preference docs](../user/profile/preferences.md#navigation-theme) for more information) |
| `twitter` | No | Twitter account |
| `username` | No | Username |
+| `view_diffs_file_by_file` | No | Flag indicating the user sees only one file diff per page |
| `website_url` | No | Website URL |
On password update, the user is forced to change it upon next login.
diff --git a/doc/api/vulnerability_findings.md b/doc/api/vulnerability_findings.md
index 95e4774ae96..4144a912617 100644
--- a/doc/api/vulnerability_findings.md
+++ b/doc/api/vulnerability_findings.md
@@ -49,7 +49,6 @@ GET /projects/:id/vulnerability_findings?scope=all
GET /projects/:id/vulnerability_findings?scope=dismissed
GET /projects/:id/vulnerability_findings?severity=high
GET /projects/:id/vulnerability_findings?confidence=unknown,experimental
-GET /projects/:id/vulnerability_findings?scanner=bandit,find_sec_bugs
GET /projects/:id/vulnerability_findings?pipeline_id=42
```
@@ -63,7 +62,6 @@ Beginning with GitLab 12.9, the `undefined` severity and confidence level is no
| `scope` | string | no | Returns vulnerability findings for the given scope: `all` or `dismissed`. Defaults to `dismissed`. |
| `severity` | string array | no | Returns vulnerability findings belonging to specified severity level: `info`, `unknown`, `low`, `medium`, `high`, or `critical`. Defaults to all. |
| `confidence` | string array | no | Returns vulnerability findings belonging to specified confidence level: `ignore`, `unknown`, `experimental`, `low`, `medium`, `high`, or `confirmed`. Defaults to all. |
-| `scanner` | string array | no | Returns vulnerability findings detected by specified scanner.
| `pipeline_id` | integer/string | no | Returns vulnerability findings belonging to specified pipeline. |
```shell
diff --git a/doc/api/wikis.md b/doc/api/wikis.md
index 43587da9473..1b8d091e3fd 100644
--- a/doc/api/wikis.md
+++ b/doc/api/wikis.md
@@ -5,7 +5,7 @@ info: "To determine the technical writer assigned to the Stage/Group associated
type: reference, api
---
-# Project wikis API
+# Project wikis API **(FREE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/13372) in GitLab 10.0.
diff --git a/doc/architecture/blueprints/container_registry_metadata_database/index.md b/doc/architecture/blueprints/container_registry_metadata_database/index.md
new file mode 100644
index 00000000000..f9b59ec92f9
--- /dev/null
+++ b/doc/architecture/blueprints/container_registry_metadata_database/index.md
@@ -0,0 +1,359 @@
+---
+stage: package
+group: package
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers
+comments: false
+description: 'Container Registry metadata database'
+---
+
+# Container Registry Metadata Database
+
+## Usage of the GitLab Container Registry
+
+With the [Container Registry](https://gitlab.com/gitlab-org/container-registry) integrated into GitLab, every GitLab project can have its own space to store its Docker images. You can use the registry to build, push and share images using the Docker client, CI/CD or the GitLab API.
+
+Each day on GitLab.com, between [150k and 200k images are pushed to the registry](https://app.periscopedata.com/app/gitlab/527857/Package-GitLab.com-Stage-Activity-Dashboard?widget=9620193&udv=0), generating about [700k API events](https://app.periscopedata.com/app/gitlab/527857/Package-GitLab.com-Stage-Activity-Dashboard?widget=7601761&udv=0). It’s also worth noting that although some customers use other registry vendors, [more than 96% of instances](https://app.periscopedata.com/app/gitlab/527857/Package-GitLab.com-Stage-Activity-Dashboard?widget=9832282&udv=0) are using the GitLab Container Registry.
+
+For GitLab.com and for GitLab customers, the Container Registry is a critical component to building and deploying software.
+
+## Current Architecture
+
+The Container Registry is a single [Go](https://golang.org/) application. Its only dependency is the storage backend on which images and metadata are stored.
+
+```mermaid
+graph LR
+ C((Client)) -- HTTP request --> R(Container Registry) -- Upload/download blobs --> B(Storage Backend)
+ R -- Write/read metadata --> B
+```
+
+Client applications (e.g. GitLab Rails and Docker CLI) interact with the Container Registry through its [HTTP API](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md). The most common operations are pushing and pulling images to/from the registry, which require a series of HTTP requests in a specific order. The request flow for these operations is detailed [here](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs-gitlab/push-pull-request-flow.md).
+
+The registry supports multiple [storage backends](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/configuration.md#storage), including Google Cloud Storage (GCS) which is used for the GitLab.com registry. In the storage backend, images are stored as blobs, deduplicated, and shared across repositories. These are then linked (like a symlink) to each repository that relies on them, giving them access to the central storage location.
+
+The name and hierarchy of repositories, as well as image manifests and tags are also stored in the storage backend, represented by a nested structure of folders and files. [This video](https://www.youtube.com/watch?v=i5mbF2bgWoM&feature=youtu.be) gives a practical overview of the registry storage structure.
+
+### Clients
+
+The Container Registry has two main clients: the GitLab Rails application and the Docker client/CLI.
+
+#### Docker
+
+The Docker client (`docker` CLI) interacts with the GitLab Container Registry mainly using the [login](https://docs.docker.com/engine/reference/commandline/login/), [push](https://docs.docker.com/engine/reference/commandline/push/) and [pull](https://docs.docker.com/engine/reference/commandline/pull/) commands.
+
+##### Login and Authentication
+
+GitLab Rails is the default token-based authentication provider for the GitLab Container Registry.
+
+Once the registry receives a request sent by an unauthenticated Docker client, it will reply with `401 Unauthorized` and instruct the client to obtain a token from the GitLab Rails API. The Docker client will then request a Bearer token and embed it in the `Authorization` header of all requests. The registry is responsible for determining if the user is authentication/authorized to perform those requests based on the provided token.
+
+```mermaid
+sequenceDiagram
+ participant C as Docker client
+ participant R as GitLab Container Registry
+ participant G as GitLab Rails
+
+ C->>R: docker login gitlab.example.com
+ R->>C: 401 Unauthorized
+ Note left of R: The response includes the realm (e.g., https://gitlab.example.com/jwt/auth)<br> from where a token should be obtained
+ C->>G: Obtain Bearer token
+ G->>C: 200 OK
+ C-->>R: Push/pull requests
+ Note right of C: Bearer token included in the Authorization header
+```
+
+Please refer to the [Docker documentation](https://docs.docker.com/registry/spec/auth/token/) for more details.
+
+##### Push and Pull
+
+Push and pull commands are used to upload and download images, more precisely manifests and blobs. The push/pull flow is described in the [documentation](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs-gitlab/push-pull-request-flow.md).
+
+#### GitLab Rails
+
+GitLab Rails interacts with the registry through the HTTP API and consumes its webhook notifications.
+
+##### From GitLab Rails to Registry
+
+The single entrypoint for the registry is the [HTTP API](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md). GitLab Rails invokes the API to perform all operations, which include:
+
+| Operation | UI | Background | Observations |
+| ------------------------------------------------------------ | ------------------ | ------------------------ | ------------------------------------------------------------ |
+| [Check API version](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#api-version-check) | :heavy_check_mark: | :heavy_check_mark: | Used globally to ensure that the registry supports the Docker Distribution V2 API, as well as for identifying whether GitLab Rails is talking to the GitLab Container Registry or a third-party one (used to toggle features only available in the former). |
+| [List repository tags](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#listing-image-tags) | :heavy_check_mark: | :heavy_check_mark: | Used to list and show tags in the UI. Used to list tags in the background for [cleanup policies](../../../user/packages/container_registry/#cleanup-policy) and [Geo replication](../../../administration/geo/replication/docker_registry.md). |
+| [Check if manifest exists](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#existing-manifests) | :heavy_check_mark: | :heavy_multiplication_x: | Used to get the digest of a manifest by tag. This is then used to pull the manifest and show the tag details in the UI. |
+| [Pull manifest](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#pulling-an-image-manifest) | :heavy_check_mark: | :heavy_multiplication_x: | Used to show the image size and the manifest digest in the tag details UI. |
+| [Pull blob](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#pulling-a-layer) | :heavy_check_mark: | :heavy_multiplication_x: | Used to show the configuration digest and the creation date in the tag details UI. |
+| [Delete tag](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#deleting-a-tag) | :heavy_check_mark: | :heavy_check_mark: | Used to delete a tag from the UI and in background (cleanup policies). |
+
+A valid authentication token is generated in GitLab Rails and embedded in all these requests before sending them to the registry.
+
+##### From Registry to GitLab Rails
+
+The registry supports [webhook notifications](https://docs.docker.com/registry/notifications/) to notify external applications when an event occurs, such as an image push.
+
+For GitLab, the registry is currently [configured](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/configuration.md#notifications) to deliver notifications for image push events to the GitLab Rails API. These notifications are currently used for Snowplow metrics and Geo replication.
+
+### Challenges
+
+#### Garbage Collection
+
+The container registry relies on an offline *mark* and *sweep* garbage collection (GC) algorithm. To run it, the registry needs to be either shutdown or set to read-only, remaining like that during the whole GC run.
+
+During the *mark* phase, the registry analyzes all repositories, creating a list of configurations, layers, and manifests that are referenced/linked in each one of them. The registry will then list all existing configurations, layers, and manifests (stored centrally) and obtain a list of those that are not referenced/linked in any repository. This is the list of blobs eligible for deletion.
+
+With the output from the *mark* phase in hand, the registry starts the *sweep* phase, where it will loop over all blobs identified as eligible for deletion and delete them from the storage backend, one by one.
+
+Doing this for a huge registry may require multiple hours/days to complete, during which the registry must remain in read-only mode. This is not feasible for platforms with tight availability requirements, such as GitLab.com.
+
+This limitation is also described in the upstream [Docker Distribution documentation](https://github.com/docker/distribution/blob/749f6afb4572201e3c37325d0ffedb6f32be8950/ROADMAP.md#deletes).
+
+#### Performance
+
+Due to the current architecture and its reliance on the (possibly remote) storage backend to store repository and image metadata, even the most basic operations, such as listing repositories or tags, can become prohibitively slow, and it only gets worse as the registry grows in size.
+
+For example, to be able to tell which repositories exist, the registry has to walk through all folders in the storage backend and identify repositories in them. Only when all folders that exist have been visited, the registry can then reply to the client with the list of repositories. If using a remote storage backend (such as GCS or S3), performance becomes even worse, as for each visited folder multiple HTTP requests are required to list and inspect their contents.
+
+#### Consistency
+
+Some storage backends, like S3, can only provide [eventual consistency](https://docs.aws.amazon.com/AmazonS3/latest/dev/Introduction.html#ConsistencyModel). As an example, reading a blob after deleting it can succeed for a short amount of time. Eventual consistency could be problematic when paired with online garbage collection, as read requests at the API level could continue to succeed for deleted blobs.
+
+#### Insights
+
+For similar reasons as highlighted above, currently, it's not feasible to extract valuable information from the registry, such as how much space a repository is using, which repositories are using the most space, which ones are more active, detailed push/pull metrics for each image or tag, and others. Not having access to these insights and metrics strongly weakens the ability to make informed decisions in regards to the product strategy.
+
+#### Additional Features
+
+Due to the metadata limitations, it's currently not feasible to implement valuable features such as [pagination](https://gitlab.com/gitlab-org/container-registry/-/issues/13#note_271769891), filtering and sorting for HTTP API, and more advanced features such as the ability to [distinguish between Docker and Helm charts images](https://gitlab.com/gitlab-org/gitlab/issues/38047).
+
+Because of all these constraints, we decided to [freeze the development of new features](https://gitlab.com/gitlab-org/container-registry/-/issues/44) until we have a solution in place to overcome all these foundational limitations.
+
+## New Architecture
+
+To overcome all challenges described above, we started an effort to migrate the registry metadata (the list of blobs, repositories, and which manifest/layers are referenced/linked in each one of them) from the storage backend into a [PostgreSQL database](#database).
+
+The ultimate goal of the new architecture is to enable online garbage collection ([&2313](https://gitlab.com/groups/gitlab-org/-/epics/2313)), but once the database is in place, we will also be able to implement all features that have been blocked by the metadata limitations. The performance of the existing API should drastically increase as well.
+
+The introduction of a database will affect the registry architecture, as we will have one more component involved:
+
+```mermaid
+graph LR
+ C((Client)) -- HTTP request --> R(Container Registry) -- Upload/download blobs --> B(Storage Backend)
+ R -- Write/read metadata --> D[(Database)]
+```
+
+With a database in place, the registry will no longer use the storage backend to write and read metadata. Instead, metadata will be stored and manipulated on the PostgreSQL database. The storage backend will then be used only for uploading and downloading blobs.
+
+The interaction between the registry and its clients, including GitLab Rails and the Docker client, will remain unchanged, as documented in the [Current Architecture](#current-architecture) section. The architectural changes and the database are internal only. The registry HTTP API and webhook notifications will also remain unchanged.
+
+### Database
+
+Following the GitLab [Go standards and style guidelines](../../../development/go_guide), no ORM is used to manage the database, only the [`database/sql`](https://golang.org/pkg/database/sql/) package from the Go standard library, a PostgreSQL driver ([`lib/pq`](https://pkg.go.dev/github.com/lib/pq?tab=doc)) and raw SQL queries, over a TCP connection pool.
+
+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).
+
+#### Partitioning
+
+The registry database will be partitioned from start to achieve greater performance (by limiting the amount of data to act upon and enable parallel execution), easier maintenance (by splitting tables and indexes into smaller units), and high availability (with partition independence). By partitioning the database from start we can also facilitate a sharding implementation later on if necessary.
+
+Although blobs are shared across repositories, manifest and tag metadata are scoped by repository. This is also visible at the API level, where all write and read requests (except [listing repositories](https://gitlab.com/gitlab-org/container-registry/-/blob/a113d0f0ab29b49cf88e173ee871893a9fc56a90/docs/spec/api.md#listing-repositories)) are scoped by repository, with its namespace being part of the request URI. For this reason, after [identifying access patterns](https://gitlab.com/gitlab-org/gitlab/-/issues/234255), we decided to partition manifests and tags by repository and blobs by digest, ensuring that lookups are always performed by partition key for optimal performance. The initial version of the partitioned schema was documented [here](https://gitlab.com/gitlab-com/www-gitlab-com/-/merge_requests/60918).
+
+#### GitLab.com
+
+Due to scale, performance and isolation concerns, for GitLab.com the registry database will be on a separate dedicated PostgreSQL cluster. Please see [#93](https://gitlab.com/gitlab-org/container-registry/-/issues/93) and [GitLab-com/gl-infra/infrastructure#10109](https://gitlab.com/gitlab-com/gl-infra/infrastructure/-/issues/10109) for additional context.
+
+The diagram below illustrates the architecture of the database cluster:
+
+![GitLab.com database architecture](https://gitlab.com/gitlab-org/gitlab/uploads/949ae16d993bca6d4813830dfc501aa2/gitlabcom_database_architecture.png)
+
+##### Expected Rate and Size Requirements
+
+[Rate](https://gitlab.com/gitlab-org/container-registry/-/issues/94) and [size](https://gitlab.com/gitlab-org/container-registry/-/issues/61#note_446609886) requirements for the GitLab.com database were extrapolated based on the `dev.gitlab.org` registry and are available in the linked issues.
+
+#### Self-Managed Instances
+
+By default, for self-managed instances, the registry will have a separate logical database in the same PostgreSQL instance/cluster as the GitLab database. However, it will be possible to configure the registry to use a separate instance/cluster if needed.
+
+#### PostgreSQL
+
+During the discussion of the [initial database schema](https://gitlab.com/gitlab-org/gitlab/-/issues/207147), we have decided to opt for PostgreSQL over other database engines mainly because:
+
+- It offers all the features we need, including the ACID guarantees of an RDBMS, and partitioning;
+- It is already used for GitLab, thus we have the required experience and tools in place to manage it;
+- We want to offer self-managed customers the possibility of hosting the registry database within the same PostgreSQL instance that they already have for GitLab.
+
+##### Version 12
+
+PostgreSQL introduced significant improvements for partitioning in [version 12](https://www.postgresql.org/docs/12/release-12.html#id-1.11.6.9.5), among which we highlight:
+
+- It's now possible for foreign keys to reference partitioned tables. This is a hard requirement for this project not only to guarantee consistency and integrity but also to enable cascading deletes at the database level;
+- Major performance improvements for inserts, selects, and updates with less locking and consistent performance for a large number of partitions ([benchmarks](https://www.2ndquadrant.com/en/blog/postgresql-12-partitioning));
+- Major improvements to the planning algorithm for tables with a large number of partitions, with some tests finding speedups of up to 10,000 times ([source](https://aws.amazon.com/blogs/database/postgresql-12-a-deep-dive-into-some-new-functionality/));
+- Attaching new partitions to an existing table no longer requires locking the entire table;
+- Bulk load (`COPY`) now uses bulk inserts instead of inserting one row at a time;
+
+To leverage these features and performance improvements, we need to use PostgreSQL 12 from the start.
+
+GitLab currently ships with PostgreSQL 11 for self-managed instances. That is _likely_ to change in 14.0, with PostgreSQL 12 becoming the minimum required version, which will likely happen before the upgraded registry becomes available for self-managed instances. If not, self-managed instances will have two options:
+
+1. Administrators can manually provision and configure a separate PostgreSQL 12 database for the registry, allowing them to benefit from features provided by the new registry and its metadata database.
+1. Continue to use the current registry without the database if online garbage collection is not a concern or provisioning a separate database is not possible. We will continue supporting the current version with security backports and bug fixes for the foreseeable feature.
+
+It's important to note that apart from online garbage collection, the metadata database's availability will unblock the implementation of many requested features for the GitLab Container Registry, which will only be available for instances using the new version backed by the metadata database.
+
+### Availability
+
+Apart from the authentication service and the blob storage backend, the registry gains one more dependency with the new architecture - the database. Given that the registry can only be as reliable as its dependencies, the database deployment should be projected for high availability. A gradual migration approach should help to identify and mitigate implementation and resource constraints for high availability environments.
+
+#### HTTP API
+
+This is a list of all the registry HTTP API operations and how they depend on the storage backend and the new database. The registry will return an error response if any dependencies are not available when processing a request.
+
+| Operation | Method | Path | Requires Database | Requires Storage | Used by GitLab Rails * |
+|--------------------------------------------------------------------------------------------------------------------------------|----------|-----------------------------------------|-------------------|------------------|------------------------|
+| [Check API version](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#api-version-check) | `GET` | `/v2/` | ✖ | ✖ | ✔ |
+| [List repositories](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#listing-repositories) | `GET` | `/v2/_catalog` | ✔ | ✖ | ✖ |
+| [List repository tags](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#listing-image-tags) | `GET` | `/v2/<name>/tags/list` | ✔ | ✖ | ✔ |
+| [Delete tag](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#deleting-a-tag) | `DELETE` | `/v2/<name>/tags/reference/<reference>` | ✔ | ✖ | ✔ |
+| [Check if manifest exists](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#existing-manifests) | `HEAD` | `/v2/<name>/manifests/<reference>` | ✔ | ✖ | ✔ |
+| [Pull manifest](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#pulling-an-image-manifest) | `GET` | `/v2/<name>/manifests/<reference>` | ✔ | ✖ | ✔ |
+| [Push manifest](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#pushing-an-image-manifest) | `PUT` | `/v2/<name>/manifests/<reference>` | ✔ | ✖ | ✖ |
+| [Delete manifest](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#deleting-an-image) | `DELETE` | `/v2/<name>/manifests/<reference>` | ✔ | ✖ | ✖ |
+| [Check if blob exists](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#existing-layers) | `HEAD` | `/v2/<name>/blobs/<digest>` | ✔ | ✖ | ✖ |
+| [Pull blob](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#fetch-blob) | `GET` | `/v2/<name>/blobs/<digest>` | ✔ | ✔ | ✔ |
+| [Delete blob](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#delete-blob) | `DELETE` | `/v2/<name>/blobs/<digest>` | ✔ | ✖ | ✖ |
+| [Start blob upload](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#starting-an-upload) | `POST` | `/v2/<name>/blobs/uploads/` | ✔ | ✔ | ✖ |
+| [Check blob upload status](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#get-blob-upload) | `GET` | `/v2/<name>/blobs/uploads/<uuid>` | ✔ | ✔ | ✖ |
+| [Push blob chunk](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#chunked-upload-1) | `PATCH` | `/v2/<name>/blobs/uploads/<uuid>` | ✔ | ✔ | ✖ |
+| [Complete blob upload](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#put-blob-upload) | `PUT` | `/v2/<name>/blobs/uploads/<uuid>` | ✔ | ✔ | ✖ |
+| [Cancel blob upload](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md#canceling-an-upload) | `DELETE` | `/v2/<name>/blobs/uploads/<uuid>` | ✔ | ✔ | ✖ |
+
+`*` Please refer to the [list of interactions between registry and Rails](#from-gitlab-rails-to-registry) to know why and how.
+
+#### Failure Scenarios
+
+With the addition of a database, it is essential to highlight possible failure scenarios, how we expect the registry to behave in such conditions, and their impact on the registry availability and functionality.
+
+##### Database Failover
+
+In case of refused connections or timeouts when attempting to connect to the database, which might happen during a failover scenario, the registry will discard broken connections upfront and attempt to open a new one from the pool immediately.
+
+The application will not panic in this scenario. It will try to establish a new connection for every request. If failed, an HTTP `503 Service Unavailable` error is returned to clients, and the error is logged and reported to Sentry. There is no retry cadence. The registry will only try to establish a new connection when another request that requires database access is received.
+
+It is also possible to configure the registry to periodically check the health of the database server using a TCP health checker with a configurable interval and threshold ([docs](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/configuration.md#tcp)). In case the health check fails, incoming requests will be halted with an HTTP `503 Service Unavailable` error.
+
+Once the database server is available again, the registry will gracefully reconnect on the next incoming request, restoring the full API functionality without human intervention.
+
+The expected registry behavior will be covered with integration tests, using a programmable TCP proxy between the registry and a database server to simulate a failover scenario.
+
+##### Connection Pool Saturation
+
+If unable to pull a connection from the pool to serve a given request, the registry will timeout and return an HTTP `500 Internal Server Error` error to the client and report the error to Sentry. These issues should trigger a development escalation to investigate why the pool is being exhausted. There might be too much load for the preconfigured pool size, or there might be transactions holding on to connections for too long.
+
+Prometheus metrics should be used to create alerts to act on a possible saturation before the application starts erroring. Special attention will be paid to these scenarios during the gradual migration of the GitLab.com registry, where we will have limited, gradual, and controlled exposure on the new registry nodes. During that process, we can identify usage patterns, observe metrics, and fine tune both infrastructure and application settings accordingly as the load increases. If needed, a rate limiting algorithm may be applied to limit impact. Decisions will be based on real data to avoid overly restrictive measures and premature optimizations.
+
+The expected registry behavior will be covered with integration tests by manipulating the pool size and spawning multiple concurrent requests against the API, putting pressure on the pool and eventually exhausting its capacity.
+
+##### Latency
+
+Excessive latency on established connections is hard to detect and debug, as these might not raise an application error or network timeout in normal circumstances but usually precede them.
+
+For this reason, the duration of database queries used to serve HTTP API requests should be instrumented using metrics, allowing the detection of unusual variations and trigger alarms accordingly before an excessive latency becomes a timeout or service unavailability.
+
+The expected registry behavior will be covered with integration tests, using a programmable TCP proxy between the registry and a database server to simulate increasing latency scenarios.
+
+##### Problematic Migrations
+
+Apart from unusual network and systems conditions, problematic migrations and data failures can also affect the database availability and, as a consequence, the registry availability.
+
+Database migrations will adhere to the same [development best practices](../../../development/database/) used for GitLab Rails, except Rails-specific methods and tools, as the registry is a Go application with no ORM, and migrations are therefore expressed with raw SQL statements. Regardless, all changes will require a review and approval from the Database team.
+
+Database migrations will be idempotent, with guard clauses used whenever necessary. It is also intended to guarantee that they are forward compatible. For a clustered environment, a node running registry version `N` should not cause any issues when the database schema is from version `N`+1.
+
+### Observability
+
+Adding one more component to the system makes it even more critical to guarantee that we have proper observability over the registry's behavior and its dependencies. It should be guaranteed that we have all the necessary tools in place before rolling out the new registry backed by the metadata database.
+
+For this purpose, [error reporting with Sentry](https://gitlab.com/gitlab-com/gl-infra/infrastructure/-/issues/11297), [improved structured logging](https://gitlab.com/gitlab-com/gl-infra/infrastructure/-/issues/10933), and [improved HTTP metrics](https://gitlab.com/gitlab-com/gl-infra/infrastructure/-/issues/10935) were already implemented and released. At the time of writing, the GitLab.com rollout is in progress.
+
+Additionally, the Prometheus metrics will be augmented with [details on the database connection pool](https://gitlab.com/gitlab-org/container-registry/-/issues/238). These will be added to the registry Grafana dashboards, joining the existing HTTP API, deployment, and storage metrics. The database cluster for the registry [will also have metrics and alerts](https://gitlab.com/gitlab-com/gl-infra/infrastructure/-/issues/11447).
+
+Together, these resources should provide an adequate level of insight into the registry's performance and behavior.
+
+### New Features and Breaking Changes
+
+#### Third-Party Container Registries
+
+GitLab ships with the GitLab Container Registry by default, but it's also compatible with third-party registries, as long as they comply with the [Docker Distribution V2 Specification](https://docs.docker.com/registry/spec/api/), now superseded by the [Open Container Initiative (OCI) Image Specification](https://github.com/opencontainers/image-spec/blob/master/spec.md).
+
+So far, we strived to maintain full compatibility with third-party registries when adding new features. For example, in 12.8, we introduced a new [tag delete feature](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/23325) to delete a single tag without deleting the underlying manifest. Because this feature is not part of the Docker or OCI specifications, we have kept the previous behavior as a fallback option to maintain compatibility with third-party registries.
+
+However, this will likely change in the future. Apart from online garbage collection, and as described in [challenges](#challenges), the metadata database will unblock the implementation of many requested features for the GitLab Container Registry in the mid/long term. Most of these features will only be available for instances using the GitLab Container Registry. They are not part of the Docker Distribution or OCI specifications, neither we will be able to provide a compatible fallback option.
+
+For this reason, any features that require the use of the GitLab Container Registry will be disabled if using a third-party registry, for as long as third-party registries continue to be supported.
+
+#### Synchronizing Changes With GitLab Rails
+
+Currently, the GitLab Rails and GitLab Container Registry releases and deployments have been fully independent, as we have not introduced any new API features or breaking changes, apart from the described tag delete feature.
+
+The registry will remain independent from GitLab Rails changes, but in the mid/long term, the implementation of new features or breaking changes will imply a corresponding change in GitLab Rails, so the latter will depend on a specific minimum version of the registry.
+
+For example, to track the size of each repository, we may extend the metadata database to store that information and then propagate it to GitLab Rails by extending the HTTP API that it consumes. In GitLab Rails, this new information would likely be stored in its database and processed to offer a new feature at the UI/API level.
+
+This kind of changes will require a synchronization between the GitLab Rails and the GitLab Container Registry releases and deployments, as the former will depend on a specific version of the latter.
+
+##### Feature Toggling
+
+All GitLab Rails features dependent on a specific version of the registry should be guarded by validating the registry vendor and version.
+
+This is already done to determine whether a tag should be deleted using the new tag delete feature (only available in the GitLab Container Registry v2.8.1+) or the old method. In this case, GitLab Rails sends an `OPTIONS` request to the registry tag route to determine whether the `DELETE` method is supported or not.
+
+Alternatively, and as the universal long-term solution, we need to determine the registry vendor, version, and supported features (the last two are only applicable if the vendor is GitLab) and persist it in the GitLab Rails database. This information can then be used in realtime to toggle features or fallback to alternative methods, if possible. The initial implementation of this approach was introduced as part of [#204839](https://gitlab.com/gitlab-org/gitlab/-/issues/204839). Currently, it's only used for metrics purposes. Further improvements are required to guarantee that the version information is kept up to date in self-managed instances, where the registry may be hot swapped.
+
+##### Release and Deployment
+
+As described above, feature toggling offers a last line of defense against desynchronized releases and deployments, ensuring that GitLab Rails remains functional in case the registry version that supports new features is not yet available.
+
+However, the release and deployment of GitLab Rails and the GitLab Container Registry should be synchronized to avoid any delays. Contrary to GitLab Rails, the registry release and deployment are manual processes, so special attention must be paid by maintainers to ensure that the GitLab Rails changes are only released and deployed after the corresponding registry changes.
+
+As a solution to strengthen this process, a file can be added to the GitLab Rails codebase, containing the minimum required version of the registry. This file should be updated with every change that depends on a specific version of the registry. It should also be considered when releasing and deploying GitLab Rails, ensuring that the pipeline only goes through once the specified minimum required registry version is deployed.
+
+## Iterations
+
+1. Design metadata database schema;
+1. Add support for managing metadata using the database;
+1. Design plans and tools to facilitate the migration of small, medium and large repositories;
+1. Implement online garbage collection;
+1. Create database clusters in staging and production for GitLab.com;
+1. Create automated deployment pipeline for GitLab.com;
+1. Deployment and gradual migration of the existing registry for GitLab.com;
+1. Rollout support for the metadata database to self-managed installs.
+
+A more detailed list of all tasks, as well as periodic progress updates can be found in the epic [&2313](https://gitlab.com/groups/gitlab-org/-/epics/2313).
+
+## Relevant Links
+
+- [Allow admin to run garbage collection with zero downtime](https://gitlab.com/groups/gitlab-org/-/epics/2313)
+- [Proposal for continuous, on-demand online garbage collection](https://gitlab.com/gitlab-org/container-registry/-/issues/199)
+- [Gradual migration proposal for the GitLab.com container registry](https://gitlab.com/gitlab-org/container-registry/-/issues/191)
+- [Create a self-serve registry deployment](https://gitlab.com/groups/gitlab-com/gl-infra/-/epics/316)
+- [Database cluster for container registry](https://gitlab.com/gitlab-com/gl-infra/infrastructure/-/issues/11154)
+
+## Who
+
+Proposal:
+
+| Role | Who
+|------------------------------|-------------------------|
+| Author | João Pereira |
+| Architecture Evolution Coach | Gerardo Lopez-Fernandez |
+| Engineering Leader | |
+| Domain Expert | Hayley Swimelar |
+
+DRIs:
+
+| Role | Who
+|------------------------------|------------------------|
+| Product | Tim Rizzi |
+| Leadership | |
+| Engineering | João Pereira |
diff --git a/doc/ci/README.md b/doc/ci/README.md
index 9b555c0ee68..b1bcb578daf 100644
--- a/doc/ci/README.md
+++ b/doc/ci/README.md
@@ -37,6 +37,9 @@ the development cycle, ensuring that all the code deployed to
production complies with the code standards you established for
your app.
+GitLab can also automatically detect, build, test, deploy, and
+monitor your applications by using [Auto DevOps](../topics/autodevops/index.md).
+
For a complete overview of these methodologies and GitLab CI/CD,
read the [Introduction to CI/CD with GitLab](introduction/index.md).
diff --git a/doc/ci/ci_cd_for_external_repos/github_integration.md b/doc/ci/ci_cd_for_external_repos/github_integration.md
index 2a8b050b224..deadc4458a2 100644
--- a/doc/ci/ci_cd_for_external_repos/github_integration.md
+++ b/doc/ci/ci_cd_for_external_repos/github_integration.md
@@ -22,7 +22,7 @@ cannot be used to authenticate with GitHub as an external CI/CD repository.
## Connect with Personal Access Token
Personal access tokens can only be used to connect GitHub.com
-repositories to GitLab, and the GitHub user must have the [owner role](https://docs.github.com/en/free-pro-team@latest/github/getting-started-with-github/access-permissions-on-github).
+repositories to GitLab, and the GitHub user must have the [owner role](https://docs.github.com/en/github/getting-started-with-github/access-permissions-on-github).
To perform a one-off authorization with GitHub to grant GitLab access your
repositories:
diff --git a/doc/ci/cloud_deployment/ecs/img/container-name.png b/doc/ci/cloud_deployment/ecs/img/container-name.png
new file mode 100644
index 00000000000..c2b4f23454b
--- /dev/null
+++ b/doc/ci/cloud_deployment/ecs/img/container-name.png
Binary files differ
diff --git a/doc/ci/cloud_deployment/ecs/img/container-port-mapping.png b/doc/ci/cloud_deployment/ecs/img/container-port-mapping.png
new file mode 100644
index 00000000000..ca390bf68a0
--- /dev/null
+++ b/doc/ci/cloud_deployment/ecs/img/container-port-mapping.png
Binary files differ
diff --git a/doc/ci/cloud_deployment/ecs/img/ecs-launch-status.png b/doc/ci/cloud_deployment/ecs/img/ecs-launch-status.png
new file mode 100644
index 00000000000..389c05d9026
--- /dev/null
+++ b/doc/ci/cloud_deployment/ecs/img/ecs-launch-status.png
Binary files differ
diff --git a/doc/ci/cloud_deployment/ecs/img/ecs-policy.png b/doc/ci/cloud_deployment/ecs/img/ecs-policy.png
new file mode 100644
index 00000000000..088a45bb065
--- /dev/null
+++ b/doc/ci/cloud_deployment/ecs/img/ecs-policy.png
Binary files differ
diff --git a/doc/ci/cloud_deployment/ecs/img/ecs-task-definitions.png b/doc/ci/cloud_deployment/ecs/img/ecs-task-definitions.png
new file mode 100644
index 00000000000..e91a8656ae0
--- /dev/null
+++ b/doc/ci/cloud_deployment/ecs/img/ecs-task-definitions.png
Binary files differ
diff --git a/doc/ci/cloud_deployment/ecs/img/initial-pipeline.png b/doc/ci/cloud_deployment/ecs/img/initial-pipeline.png
new file mode 100644
index 00000000000..7072f550586
--- /dev/null
+++ b/doc/ci/cloud_deployment/ecs/img/initial-pipeline.png
Binary files differ
diff --git a/doc/ci/cloud_deployment/ecs/img/rails-template.png b/doc/ci/cloud_deployment/ecs/img/rails-template.png
new file mode 100644
index 00000000000..02c67f8dd21
--- /dev/null
+++ b/doc/ci/cloud_deployment/ecs/img/rails-template.png
Binary files differ
diff --git a/doc/ci/cloud_deployment/ecs/img/registry.png b/doc/ci/cloud_deployment/ecs/img/registry.png
new file mode 100644
index 00000000000..694d83fd0ce
--- /dev/null
+++ b/doc/ci/cloud_deployment/ecs/img/registry.png
Binary files differ
diff --git a/doc/ci/cloud_deployment/ecs/img/service-parameter.png b/doc/ci/cloud_deployment/ecs/img/service-parameter.png
new file mode 100644
index 00000000000..7252601571b
--- /dev/null
+++ b/doc/ci/cloud_deployment/ecs/img/service-parameter.png
Binary files differ
diff --git a/doc/ci/cloud_deployment/ecs/img/service-running.png b/doc/ci/cloud_deployment/ecs/img/service-running.png
new file mode 100644
index 00000000000..2b78960d5f4
--- /dev/null
+++ b/doc/ci/cloud_deployment/ecs/img/service-running.png
Binary files differ
diff --git a/doc/ci/cloud_deployment/ecs/img/view-running-app-2.png b/doc/ci/cloud_deployment/ecs/img/view-running-app-2.png
new file mode 100644
index 00000000000..e64a378e11c
--- /dev/null
+++ b/doc/ci/cloud_deployment/ecs/img/view-running-app-2.png
Binary files differ
diff --git a/doc/ci/cloud_deployment/ecs/img/view-running-app.png b/doc/ci/cloud_deployment/ecs/img/view-running-app.png
new file mode 100644
index 00000000000..360dd285182
--- /dev/null
+++ b/doc/ci/cloud_deployment/ecs/img/view-running-app.png
Binary files differ
diff --git a/doc/ci/cloud_deployment/ecs/quick_start_guide.md b/doc/ci/cloud_deployment/ecs/quick_start_guide.md
new file mode 100644
index 00000000000..f75680ccd8c
--- /dev/null
+++ b/doc/ci/cloud_deployment/ecs/quick_start_guide.md
@@ -0,0 +1,250 @@
+---
+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
+---
+
+# Getting started with Continuous Deployment to AWS Elastic Container Service **(FREE)**
+
+This step-by-step guide helps you use [Continuous Deployment to ECS](../index.md#deploy-your-application-to-the-aws-elastic-container-service-ecs)
+that deploys a project hosted on GitLab.com to [Elastic Container Service](https://aws.amazon.com/ecs/)
+(ECS) on AWS.
+
+In this guide, you begin by creating an ECS cluster manually using the AWS console. You create and
+deploy a simple application that you create from a GitLab template.
+
+These instructions work for both SaaS and self-managed GitLab instances.
+Ensure your own [runners are configured](../../runners/README.md).
+
+## Prerequisites
+
+- An [AWS account](https://aws.amazon.com/premiumsupport/knowledge-center/create-and-activate-aws-account/).
+ Sign in with an existing AWS account or create a new one.
+- In this guide, you create an infrastructure in [`us-east-2` region](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html).
+ You can use any region, but do not change it after you begin.
+
+## Create an infrastructure and initial deployment on AWS
+
+For deploying an application from GitLab, you must first create an infrastructure and initial
+deployment on AWS.
+This includes an [ECS cluster](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/clusters.html)
+and related components, such as
+[ECS task definitions](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definitions.html),
+[ECS services](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_services.html),
+and containerized application image.
+
+For the first step here, you create a demo application from a project template.
+
+### Create a new project from a template
+
+Use a GitLab project template to get started. As the name suggests, these projects provide a
+bare-bones application built on some well-known frameworks.
+
+1. In GitLab, click the plus icon (**{plus-square}**) at the top of the navigation bar, and select
+ **New project**.
+
+1. Click the **Create from template** button, where you can choose from a Ruby on Rails, Spring, or
+ NodeJS Express project. For this guide, use the Ruby on Rails template.
+
+ ![Select project template](img/rails-template.png)
+
+1. Give your project a name. In this example, it's named `ecs-demo`. Make it public so that you can
+ take advantage of the features available in the
+ [GitLab Ultimate plan](https://about.gitlab.com/pricing/).
+
+1. Click **Create project**.
+
+Now that you created a demo project, you must containerize the application and push it to the
+container registry.
+
+### Push a containerized application image to GitLab Container Registry
+
+[ECS](https://aws.amazon.com/ecs/) is a container orchestration service, meaning that you must
+provide a containerized application image during the infrastructure build. To do so, you can use
+GitLab [Auto Build](../../../topics/autodevops/stages.md#auto-build)
+and [Container Registry](../../../user/packages/container_registry/index.md).
+
+1. Go to **ecs-demo** project on GitLab.
+1. Click **Setup up CI/CD**. It brings you to a [`.gitlab-ci.yml`](../../README.md#getting-started)
+ creation form.
+1. Copy and paste the following content into the empty `.gitlab-ci.yml`. This defines
+ [a pipeline for continuous deployment to ECS](../index.md#deploy-your-application-to-the-aws-elastic-container-service-ecs).
+
+ ```yaml
+ include:
+ - template: AWS/Deploy-ECS.gitlab-ci.yml
+ ```
+
+1. Click **Commit Changes**. It automatically triggers a new pipeline. In this pipeline, the `build`
+ job containerizes the application and pushes the image to [GitLab Container Registry](../../../user/packages/container_registry/index.md).
+
+ ![Create project](img/initial-pipeline.png)
+
+1. Visit **Packages & Registries > Container Registry**. Make sure the application image has been
+ pushed.
+
+ ![Create project](img/registry.png)
+
+Now you have a containerized application image that can be pulled from AWS. Next, you define the
+spec of how this application image is used in AWS.
+
+Note that the `production_ecs` job fails because ECS Cluster is not connected yet. You'll fix this
+later.
+
+### Create an ECS task definition
+
+[ECS Task definitions](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definitions.html)
+is a specification about how the application image is started by an [ECS service](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_services.html).
+
+1. Go to **ECS > Task Definitions** on [AWS console](https://aws.amazon.com/).
+1. Click **Create new Task Definition**.
+
+ ![Create project](img/ecs-task-definitions.png)
+
+1. Choose **EC2** as the launch type. Click **Next Step**.
+1. Set `ecs_demo` to **Task Definition Name**.
+1. Set `512` to **Task Size > Task memory** and **Task CPU**.
+1. Click **Container Definitions > Add container**. This opens a container registration form.
+1. Set `web` to **Container name**.
+1. Set `registry.gitlab.com/<your-namespace>/ecs-demo/master:latest` to **Image**.
+ Alternatively, you can copy and paste the image path from the [GitLab Container Registry page](#push-a-containerized-application-image-to-gitlab-container-registry).
+
+ ![Create project](img/container-name.png)
+
+1. Add a port mapping. Set `80` to **Host Port** and `5000` to **Container port**.
+
+ ![Create project](img/container-port-mapping.png)
+
+1. Click **Create**.
+
+Now you have the initial task definition. Next, you create an actual infrastructure to run the
+application image.
+
+### Create an ECS cluster
+
+An [ECS cluster](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/clusters.html)
+is a virtual group of [ECS services](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_services.html).
+It's also associated with EC2 or Fargate as the computation resource.
+
+1. Go to **ECS > Clusters** on [AWS console](https://aws.amazon.com/).
+1. Click **Create Cluster**.
+1. Select **EC2 Linux + Networking** as the cluster template. Click **Next Step**.
+1. Set `ecs-demo` to **Cluster Name**.
+1. Choose the default [VPC](https://aws.amazon.com/vpc/?vpc-blogs.sort-by=item.additionalFields.createdDate&vpc-blogs.sort-order=desc)
+ in **Networking**. If there are no existing VPCs, you can leave it as-is to create a new one.
+1. Set all available subnets of the VPC to **Subnets**.
+1. Click **Create**.
+1. Make sure that the ECS cluster has been successfully created.
+
+ ![Create project](img/ecs-launch-status.png)
+
+Now you can register an ECS service to the ECS cluster in the next step.
+
+Note the following:
+
+- Optionally, you can set a SSH key pair in the creation form. This allows you to SSH to the EC2
+ instance for debugging.
+- If you don't choose an existing VPC, it creates a new VPC by default. This could cause an error if
+ it reaches the maximum allowed number of internet gateways on your account.
+- The cluster requires an EC2 instance, meaning it costs you [according to the instance-type](https://aws.amazon.com/ec2/pricing/on-demand/).
+
+### Create an ECS Service
+
+[ECS service](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_services.html)
+is a daemon to create an application container based on the [ECS task definition](#create-an-ecs-task-definition).
+
+1. Go to **ECS > Clusters > ecs-demo > Services** on the [AWS console](https://aws.amazon.com/)
+1. Click **Deploy**. This opens a service creation form.
+1. Select `EC2` in **Launch Type**.
+1. Set `ecs_demo` to **Task definition**. This corresponds to [the task definition you created above](#create-an-ecs-task-definition).
+1. Set `ecs_demo` to **Service name**.
+1. Set `1` to **Desired tasks**.
+
+ ![Create project](img/service-parameter.png)
+
+1. Click **Deploy**.
+1. Make sure that the created service is active.
+
+ ![Create project](img/service-running.png)
+
+Note that AWS's console UI changes from time to time. If you can't find a relevant component in the
+instructions, select the closest one.
+
+### View the demo application
+
+Now, the demo application is accessible from the internet.
+
+1. Go to **EC2 > Instances** on the [AWS console](https://aws.amazon.com/)
+1. Search by `ECS Instance` to find the corresponding EC2 instance that [the ECS cluster created](#create-an-ecs-cluster).
+1. Click the ID of the EC2 instance. This brings you to the instance detail page.
+1. Copy **Public IPv4 address** and paste it in the browser. Now you can see the demo application
+ running.
+
+ ![Create project](img/view-running-app.png)
+
+In this guide, HTTPS/SSL is **NOT** configured. You can access to the application through HTTP only
+(for example, `http://<ec2-ipv4-address>`).
+
+## Setup Continuous Deployment from GitLab
+
+Now that you have an application running on ECS, you can set up continuous deployment from GitLab.
+
+### Create a new IAM user as a deployer
+
+For GitLab to access the ECS cluster, service, and task definition that you created above, You must
+create a deployer user on AWS:
+
+1. Go to **IAM > Users** on [AWS console](https://aws.amazon.com/).
+1. Click **Add user**.
+1. Set `ecs_demo` to **User name**.
+1. Enable **Programmatic access** checkbox. Click **Next: Permissions**.
+1. Select `Attach existing policies directly` in **Set permissions**.
+1. Select `AmazonECS_FullAccess` from the policy list. Click **Next: Tags** and **Next: Review**.
+
+ ![Create project](img/ecs-policy.png)
+
+1. Click **Create user**.
+1. Take note of the **Access key ID** and **Secret access key** of the created user.
+
+NOTE:
+Do not share the secret access key in a public place. You must save it in a secure place.
+
+### Setup credentials in GitLab to let pipeline jobs access to ECS
+
+You can register the access information in [GitLab Environment Variables](../../variables/README.md#create-a-custom-variable-in-the-ui).
+These variables are injected into the pipeline jobs and can access the ECS API.
+
+1. Go to **ecs-demo** project on GitLab.
+1. Go to **Settings > CI/CD > Variables**.
+1. Click **Add Variable** and set the following key-value pairs.
+
+ |Key|Value|Note|
+ |---|---|---|
+ |`AWS_ACCESS_KEY_ID`|`<Access key ID of the deployer>`| For authenticating `aws` CLI. |
+ |`AWS_SECRET_ACCESS_KEY`|`<Secret access key of the deployer>`| For authenticating `aws` CLI. |
+ |`AWS_DEFAULT_REGION`|`us-east-2`| For authenticating `aws` CLI. |
+ |`CI_AWS_ECS_CLUSTER`|`ecs-demo`| The ECS cluster is accessed by `production_ecs` job. |
+ |`CI_AWS_ECS_SERVICE`|`ecs_demo`| The ECS service of the cluster is updated by `production_ecs` job. |
+ |`CI_AWS_ECS_TASK_DEFINITION`|`ecs_demo`| The ECS task definition is updated by `production_ecs` job. |
+
+### Make a change to the demo application
+
+Change a file in the project and see if it's reflected in the demo application on ECS:
+
+1. Go to **ecs-demo** project on GitLab.
+1. Open the file at **app > views > welcome > index.html.erb**.
+1. Click **Edit**.
+1. Change the text to `You're on ECS!`.
+1. Click **Commit Changes**. This automatically triggers a new pipeline. Wait until it finishes.
+1. [Access the running application on the ECS cluster](#view-the-demo-application). You should see
+ this:
+
+ ![Create project](img/view-running-app-2.png)
+
+Congratulations! You successfully set up continuous deployment to ECS.
+
+## Further reading
+
+- If you're interested in more of the continuous deployments to clouds, see [cloud deployments](../index.md).
+- If you want to quickly set up DevSecOps in your project, see [Auto DevOps](../../../topics/autodevops/index.md).
+- If you want to quickly set up the production-grade environment, see [the 5 Minute Production App](https://gitlab.com/gitlab-org/5-minute-production-app/deploy-template/-/blob/master/README.md).
diff --git a/doc/ci/cloud_deployment/index.md b/doc/ci/cloud_deployment/index.md
index ccacb3c61d3..1e53414cd1e 100644
--- a/doc/ci/cloud_deployment/index.md
+++ b/doc/ci/cloud_deployment/index.md
@@ -20,6 +20,11 @@ CI/CD pipeline, you can interact with your chosen cloud provider more easily.
GitLab provides Docker images that you can use to [run AWS commands from GitLab CI/CD](#run-aws-commands-from-gitlab-cicd), and a template to make
it easier to [deploy to AWS](#deploy-your-application-to-the-aws-elastic-container-service-ecs).
+### Quick start
+
+If you're using GitLab.com, see the [quick start guide](ecs/quick_start_guide.md)
+for setting up Continuous Deployment to [AWS Elastic Container Service](https://aws.amazon.com/ecs/) (ECS).
+
### Run AWS commands from GitLab CI/CD
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/31167) in GitLab 12.6.
@@ -37,7 +42,7 @@ Some credentials are required to be able to run `aws` commands:
NOTE:
A new **Access key ID** and **Secret access key** are generated. Please take a note of them right away.
-1. In your GitLab project, go to **Settings > CI / CD**. Set the following as
+1. In your GitLab project, go to **Settings > CI/CD**. Set the following as
[CI/CD variables](../variables/README.md)
(see table below):
@@ -319,4 +324,4 @@ For a video walkthrough of this configuration process, see [Auto Deploy to EC2](
## Deploy to Google Cloud
-- [Deploying with GitLab on Google Cloud](https://about.gitlab.com/solutions/google-cloud-platform/)
+- [Deploying with GitLab on Google Cloud](https://about.gitlab.com/partners/technology-partners/google-cloud-platform/)
diff --git a/doc/ci/docker/index.md b/doc/ci/docker/index.md
index 18a9d63b694..0897bb183e5 100644
--- a/doc/ci/docker/index.md
+++ b/doc/ci/docker/index.md
@@ -8,11 +8,18 @@ type: index
# Docker integration
-GitLab CI/CD can be combined with [Docker](https://www.docker.com) to enable
-integration between the two.
+There are two primary ways to incorporate [Docker](https://www.docker.com) in your CI/CD workflow.
-The following documentation is available for using GitLab CI/CD with Docker:
+- **[Run your CI/CD jobs](using_docker_images.md) in Docker containers.**
-- [Building Docker images with GitLab CI/CD](using_docker_build.md).
-- [Using Docker images](using_docker_images.md).
-- [Building images with kaniko and GitLab CI/CD](using_kaniko.md).
+ You can create CI/CD jobs to do things like test, build, or publish
+ an application. These jobs can run in Docker containers.
+
+ For example, you can tell GitLab CI/CD to use a Node image that's hosted on Docker Hub
+ or in the GitLab Container Registry. Your job then runs in a container that's based on the image.
+ The container has all the Node dependencies you need to build your app.
+
+- **Use [Docker](using_docker_build.md) or [kaniko](using_kaniko.md) to build Docker images.**
+
+ You can create CI/CD jobs to build Docker images and publish
+ them to a container registry.
diff --git a/doc/ci/docker/using_docker_build.md b/doc/ci/docker/using_docker_build.md
index 46ced9b4d6d..2091a80bdf2 100644
--- a/doc/ci/docker/using_docker_build.md
+++ b/doc/ci/docker/using_docker_build.md
@@ -5,34 +5,18 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: concepts, howto
---
-# Building Docker images with GitLab CI/CD
+# Use Docker to build Docker images
-You can use GitLab CI/CD with Docker Engine to build and test Docker-based projects.
-
-For example, you might want to:
-
-1. Create an application image.
-1. Run tests against the created image.
-1. Push image to a remote registry.
-1. Deploy to a server from the pushed image.
-
-Or, if your application already has a `Dockerfile`, you can
-use it to create and test an image:
-
-```shell
-docker build -t my-image dockerfiles/
-docker run my-image /script/to/run/tests
-docker tag my-image my-registry:5000/my-image
-docker push my-registry:5000/my-image
-```
+You can use GitLab CI/CD with Docker to create Docker images.
+For example, you can create a Docker image of your application,
+test it, and publish it to a container registry.
To run Docker commands in your CI/CD jobs, you must configure
-GitLab Runner to enable `docker` support.
+GitLab Runner to support `docker` commands.
## Enable Docker commands in your CI/CD jobs
-There are three ways to enable the use of `docker build` and `docker run`
-during jobs, each with their own tradeoffs. You can use:
+To enable Docker commands for your CI/CD jobs, you can use:
- [The shell executor](#use-the-shell-executor)
- [The Docker executor with the Docker image (Docker-in-Docker)](#use-the-docker-executor-with-the-docker-image-docker-in-docker)
@@ -47,12 +31,9 @@ to learn more about how these runners are configured.
### Use the shell executor
-One way to configure GitLab Runner for `docker` support is to use the
-`shell` executor.
-
-After you register a runner and select the `shell` executor,
-your job scripts are executed as the `gitlab-runner` user.
-This user needs permission to run Docker commands.
+You can include Docker commands in your CI/CD jobs if your runner is configured to
+use the `shell` executor. The `gitlab-runner` user runs the Docker commands, but
+needs permission to run them.
1. [Install](https://gitlab.com/gitlab-org/gitlab-runner/#installation) GitLab Runner.
1. [Register](https://docs.gitlab.com/runner/register/) a runner.
@@ -100,9 +81,11 @@ Learn more about the [security of the `docker` group](https://blog.zopyx.com/on-
### Use the Docker executor with the Docker image (Docker-in-Docker)
-Another way to configure GitLab Runner for `docker` support is to
-register a runner with the Docker executor and use the [Docker image](https://hub.docker.com/_/docker/)
-to run your job scripts. This configuration is referred to as "Docker-in-Docker."
+You can use "Docker-in-Docker" to run commands in your CI/CD jobs:
+
+- Register a runner that uses the Docker executor.
+- Use the [Docker image](https://hub.docker.com/_/docker/) provided by Docker to
+ run the jobs that need Docker commands.
The Docker image has all of the `docker` tools installed
and can run the job script in context of the image in privileged mode.
@@ -111,14 +94,18 @@ The `docker-compose` command is not available in this configuration by default.
To use `docker-compose` in your job scripts, follow the `docker-compose`
[installation instructions](https://docs.docker.com/compose/install/).
+An example project that uses this approach can be found here: <https://gitlab.com/gitlab-examples/docker>.
+
WARNING:
When you enable `--docker-privileged`, you are effectively disabling all of
the security mechanisms of containers and exposing your host to privilege
-escalation which can lead to container breakout. For more information, check
+escalation. Doing this can lead to container breakout. For more information, check
out the official Docker documentation on
[runtime privilege and Linux capabilities](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities).
-Docker-in-Docker works well, and is the recommended configuration, but it is
+#### Limitations of Docker-in-Docker
+
+Docker-in-Docker is the recommended configuration, but it is
not without its own challenges:
- When using Docker-in-Docker, each job is in a clean environment without the past
@@ -144,8 +131,6 @@ not without its own challenges:
- docker run -v "$MOUNT_POINT:/mnt" my-docker-image
```
-An example project using this approach can be found here: <https://gitlab.com/gitlab-examples/docker>.
-
In the examples below, we are using Docker images tags to specify a
specific version, such as `docker:19.03.12`. If tags like `docker:stable`
are used, you have no control over what version is used. This can lead to
@@ -373,9 +358,8 @@ build:
### Use Docker socket binding
-Another way to configure GitLab Runner for `docker` support is to
-bind-mount `/var/run/docker.sock` into the
-container so that Docker is available in the context of the image.
+To use Docker commands in your CI/CD jobs, you can bind-mount `/var/run/docker.sock` into the
+container. Docker is then available in the context of the image.
NOTE:
If you bind the Docker socket and you are
@@ -478,13 +462,10 @@ services:
> [Introduced](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/27173) in GitLab Runner 13.6.
-If you are an administrator of GitLab Runner and you have the `dind`
-service defined for the [Docker
-executor](https://docs.gitlab.com/runner/configuration/advanced-configuration.html#the-runnersdockerservices-section),
-or the [Kubernetes
-executor](https://docs.gitlab.com/runner/executors/kubernetes.html#using-services)
-you can specify the `command` to configure the registry mirror for the
-Docker daemon.
+If you are a GitLab Runner administrator, you can specify the `command` to configure the registry mirror
+for the Docker daemon. The `dind` service must be defined for the
+[Docker](https://docs.gitlab.com/runner/configuration/advanced-configuration.html#the-runnersdockerservices-section)
+or [Kubernetes executor](https://docs.gitlab.com/runner/executors/kubernetes.html#using-services).
Docker:
@@ -516,11 +497,10 @@ Kubernetes:
##### Docker executor inside GitLab Runner configuration
-If you are an administrator of GitLab Runner and you want to use
-the mirror for every `dind` service, update the
+If you are a GitLab Runner administrator, you can use
+the mirror for every `dind` service. Update the
[configuration](https://docs.gitlab.com/runner/configuration/advanced-configuration.html)
-to specify a [volume
-mount](https://docs.gitlab.com/runner/configuration/advanced-configuration.html#volumes-in-the-runnersdocker-section).
+to specify a [volume mount](https://docs.gitlab.com/runner/configuration/advanced-configuration.html#volumes-in-the-runnersdocker-section).
For example, if you have a `/opt/docker/daemon.json` file with the following
content:
@@ -552,11 +532,10 @@ picked up by the `dind` service.
> [Introduced](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/3223) in GitLab Runner 13.6.
-If you are an administrator of GitLab Runner and you want to use
-the mirror for every `dind` service, update the
+If you are a GitLab Runner administrator, you can use
+the mirror for every `dind` service. Update the
[configuration](https://docs.gitlab.com/runner/configuration/advanced-configuration.html)
-to specify a [ConfigMap volume
-mount](https://docs.gitlab.com/runner/executors/kubernetes.html#using-volumes).
+to specify a [ConfigMap volume mount](https://docs.gitlab.com/runner/executors/kubernetes.html#using-volumes).
For example, if you have a `/tmp/daemon.json` file with the following
content:
@@ -602,7 +581,7 @@ The configuration is picked up by the `dind` service.
When you use Docker-in-Docker, the [normal authentication
methods](using_docker_images.html#define-an-image-from-a-private-container-registry)
-won't work because a fresh Docker daemon is started with the service.
+don't work because a fresh Docker daemon is started with the service.
### Option 1: Run `docker login`
@@ -634,14 +613,14 @@ empty or remove it.
If you are an administrator for GitLab Runner, you can mount a file
with the authentication configuration to `~/.docker/config.json`.
-Then every job that the runner picks up will be authenticated already. If you
+Then every job that the runner picks up is authenticated already. If you
are using the official `docker:19.03.13` image, the home directory is
under `/root`.
If you mount the configuration file, any `docker` command
that modifies the `~/.docker/config.json` (for example, `docker login`)
fails, because the file is mounted as read-only. Do not change it from
-read-only, because other problems will occur.
+read-only, because problems occur.
Here is an example of `/opt/.docker/config.json` that follows the
[`DOCKER_AUTH_CONFIG`](using_docker_images.md#determining-your-docker_auth_config-data)
@@ -743,8 +722,8 @@ build:
When using Docker-in-Docker, Docker downloads all layers of your image every
time you create a build. Recent versions of Docker (Docker 1.13 and above) can
-use a pre-existing image as a cache during the `docker build` step, considerably
-speeding up the build process.
+use a pre-existing image as a cache during the `docker build` step. This considerably
+speeds up the build process.
### How Docker caching works
@@ -754,8 +733,8 @@ any changes. Change in one layer causes all subsequent layers to be recreated.
You can specify a tagged image to be used as a cache source for the `docker build`
command by using the `--cache-from` argument. Multiple images can be specified
-as a cache source by using multiple `--cache-from` arguments. Keep in mind that
-any image that's used with the `--cache-from` argument must first be pulled
+as a cache source by using multiple `--cache-from` arguments. Any image that's used
+with the `--cache-from` argument must first be pulled
(using `docker pull`) before it can be used as a cache source.
### Using Docker caching
@@ -872,4 +851,4 @@ If:
- This is the first time setting it up, carefully read
[using Docker in Docker workflow](#use-the-docker-executor-with-the-docker-image-docker-in-docker).
- You are upgrading from v18.09 or earlier, read our
- [upgrade guide](https://about.gitlab.com/releases/2019/07/31/docker-in-docker-with-docker-19-dot-03/).
+ [upgrade guide](https://about.gitlab.com/blog/2019/07/31/docker-in-docker-with-docker-19-dot-03/).
diff --git a/doc/ci/docker/using_docker_images.md b/doc/ci/docker/using_docker_images.md
index 67450d442a9..e8028a862c4 100644
--- a/doc/ci/docker/using_docker_images.md
+++ b/doc/ci/docker/using_docker_images.md
@@ -5,29 +5,25 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: concepts, howto
---
-# Using Docker images
+# Run your CI/CD jobs in Docker containers
-GitLab CI/CD in conjunction with [GitLab Runner](../runners/README.md) can use
-[Docker Engine](https://www.docker.com/) to test and build any application.
+You can run your CI/CD jobs in separate, isolated Docker containers.
-Docker is an open-source project that has predefined images you can use to
-run applications in independent "containers." These containers run in a single Linux
-instance. [Docker Hub](https://hub.docker.com/) is a database of pre-built images you can
-use to test and build your applications.
+When you run a Docker container on your local machine, it acts as a reproducible build environment.
+You can run tests in the container, instead of testing on a dedicated CI/CD server.
-When you use Docker with GitLab CI/CD, Docker runs each job in a separate and isolated
-container. You specify the container image in the project's
-[`.gitlab-ci.yml`](../yaml/README.md) file.
+To run CI/CD jobs in a Docker container, you need to:
-Docker containers provide a reproducible build environment that
-can run on your workstation. When a Docker container is running, you can test
-commands from your shell, rather than having to
-test them on a dedicated CI server.
+- Register a runner that uses the Docker executor. Then all jobs run in a Docker container.
+- Specify an image in your `.gitlab-ci.yml` file. The runner creates a container from this image
+ and runs the jobs in it.
+- Optional. Specify other images in your `.gitlab-ci.yml` file. These containers are known as
+ ["services"](#what-is-a-service) and you can use them to run services like MySQL separately.
-## Register Docker Runner
+## Register a runner that uses the Docker executor
-To use GitLab Runner with Docker you need to [register a new runner](https://docs.gitlab.com/runner/register/)
-to use the `docker` executor.
+To use GitLab Runner with Docker you need to [register a runner](https://docs.gitlab.com/runner/register/)
+that uses the Docker executor.
In this example, we first set up a temporary template to supply the services:
diff --git a/doc/ci/docker/using_kaniko.md b/doc/ci/docker/using_kaniko.md
index 2122cf2bf16..0344e736dd4 100644
--- a/doc/ci/docker/using_kaniko.md
+++ b/doc/ci/docker/using_kaniko.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: howto
---
-# Building images with kaniko and GitLab CI/CD
+# Use kaniko to build Docker images
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/45512) in GitLab 11.2. Requires GitLab Runner 11.2 and above.
diff --git a/doc/ci/environments/deployment_safety.md b/doc/ci/environments/deployment_safety.md
index eecc8ffd18f..358117ed796 100644
--- a/doc/ci/environments/deployment_safety.md
+++ b/doc/ci/environments/deployment_safety.md
@@ -74,15 +74,15 @@ runs by enabling the [Skip outdated deployment jobs](../pipelines/settings.md#sk
Example of a problematic pipeline flow **before** enabling Skip outdated deployment jobs:
-1. Pipeline-A is created on the `master` branch.
-1. Later, Pipeline-B is created on the `master` branch (with a newer commit SHA).
+1. Pipeline-A is created on the default branch.
+1. Later, Pipeline-B is created on the default branch (with a newer commit SHA).
1. The `deploy` job in Pipeline-B finishes first, and deploys the newer code.
1. The `deploy` job in Pipeline-A finished later, and deploys the older code, **overwriting** the newer (latest) deployment.
The improved pipeline flow **after** enabling Skip outdated deployment jobs:
-1. Pipeline-A is created on the `master` branch.
-1. Later, Pipeline-B is created on the `master` branch (with a newer SHA).
+1. Pipeline-A is created on the default branch.
+1. Later, Pipeline-B is created on the default branch (with a newer SHA).
1. The `deploy` job in Pipeline-B finishes first, and deploys the newer code.
1. The `deploy` job in Pipeline-A is automatically cancelled, so that it doesn't overwrite the deployment from the newer pipeline.
diff --git a/doc/ci/environments/img/deployments_list.png b/doc/ci/environments/img/deployments_list.png
new file mode 100644
index 00000000000..95afc092d86
--- /dev/null
+++ b/doc/ci/environments/img/deployments_list.png
Binary files differ
diff --git a/doc/ci/environments/img/environment_auto_stop_v13_10.png b/doc/ci/environments/img/environment_auto_stop_v13_10.png
new file mode 100644
index 00000000000..1525f670ff2
--- /dev/null
+++ b/doc/ci/environments/img/environment_auto_stop_v13_10.png
Binary files differ
diff --git a/doc/ci/environments/img/environments_dynamic_groups_v13_10.png b/doc/ci/environments/img/environments_dynamic_groups_v13_10.png
new file mode 100644
index 00000000000..cf3f9f7c781
--- /dev/null
+++ b/doc/ci/environments/img/environments_dynamic_groups_v13_10.png
Binary files differ
diff --git a/doc/ci/environments/img/environments_list.png b/doc/ci/environments/img/environments_list.png
new file mode 100644
index 00000000000..6ddfd858ab6
--- /dev/null
+++ b/doc/ci/environments/img/environments_list.png
Binary files differ
diff --git a/doc/ci/environments/img/environments_terminal_button_on_index_v13_10.png b/doc/ci/environments/img/environments_terminal_button_on_index_v13_10.png
new file mode 100644
index 00000000000..13c8d1cd523
--- /dev/null
+++ b/doc/ci/environments/img/environments_terminal_button_on_index_v13_10.png
Binary files differ
diff --git a/doc/ci/environments/img/environments_terminal_button_on_show_v13_10.png b/doc/ci/environments/img/environments_terminal_button_on_show_v13_10.png
new file mode 100644
index 00000000000..fcc3e2b6631
--- /dev/null
+++ b/doc/ci/environments/img/environments_terminal_button_on_show_v13_10.png
Binary files differ
diff --git a/doc/ci/environments/index.md b/doc/ci/environments/index.md
index b49fcd72172..1aa8d6a3618 100644
--- a/doc/ci/environments/index.md
+++ b/doc/ci/environments/index.md
@@ -10,261 +10,125 @@ disqus_identifier: 'https://docs.gitlab.com/ee/ci/environments.html'
> Introduced in GitLab 8.9.
-Environments allow control of the continuous deployment of your software,
-all within GitLab.
+Environments describe where code is deployed.
-## Introduction
-
-There are many stages required in the software development process before the software is ready
-for public consumption.
-
-For example:
-
-1. Develop your code.
-1. Test your code.
-1. Deploy your code into a testing or staging environment before you release it to the public.
-
-This helps find bugs in your software, and also in the deployment process as well.
-
-GitLab CI/CD is capable of not only testing or building your projects, but also
-deploying them in your infrastructure, with the added benefit of giving you a
-way to track your deployments. In other words, you always know what is
-currently being deployed or has been deployed on your servers.
-
-It's important to know that:
-
-- Environments are like tags for your CI jobs, describing where code gets deployed.
-- Deployments are created when [GitLab CI/CD](../yaml/README.md) is used to deploy versions of code to environments.
+Each time [GitLab CI/CD](../yaml/README.md) deploys a version of code to an environment,
+a deployment is created.
GitLab:
-- Provides a full history of your deployments for each environment.
-- Keeps track of your deployments, so you always know what is currently being deployed on your
+- Provides a full history of deployments to each environment.
+- Tracks your deployments, so you always know what is deployed on your
servers.
-If you have a deployment service such as [Kubernetes](../../user/project/clusters/index.md)
-associated with your project, you can use it to assist with your deployments, and
-can even access a [web terminal](#web-terminals) for your environment from within GitLab!
-
-## Configuring environments
-
-Configuring environments involves:
-
-1. Understanding how [pipelines](../pipelines/index.md) work.
-1. Defining environments in your project's [`.gitlab-ci.yml`](../yaml/README.md) file.
-1. Creating a job configured to deploy your application. For example, a deploy job configured with [`environment`](../yaml/README.md#environment) to deploy your application to a [Kubernetes cluster](../../user/project/clusters/index.md).
-
-The rest of this section illustrates how to configure environments and deployments using
-an example scenario. It assumes you have already:
-
-- Created a [project](../../user/project/working_with_projects.md#create-a-project) in GitLab.
-- Set up [a runner](../runners/README.md).
-
-In the scenario:
-
-- We are developing an application.
-- We want to run tests and build our app on all branches.
-- Our default branch is `master`.
-- We deploy the app only when a pipeline on `master` branch is run.
-
-### Defining environments
-
-Let's consider the following `.gitlab-ci.yml` example:
-
-```yaml
-stages:
- - test
- - build
- - deploy
-
-test:
- stage: test
- script: echo "Running tests"
-
-build:
- stage: build
- script: echo "Building the app"
-
-deploy_staging:
- stage: deploy
- script:
- - echo "Deploy to staging server"
- environment:
- name: staging
- url: https://staging.example.com
- only:
- - master
-```
+If you have a deployment service like [Kubernetes](../../user/project/clusters/index.md)
+associated with your project, you can use it to assist with your deployments.
+You can even access a [web terminal](#web-terminals) for your environment from within GitLab.
-We have defined three [stages](../yaml/README.md#stages):
+## View environments and deployments
-- `test`
-- `build`
-- `deploy`
+Prerequisites:
-The jobs assigned to these stages run in this order. If any job fails, then
-the pipeline fails and jobs that are assigned to the next stage don't run.
+- You must have a minimum of [Reporter permission](../../user/permissions.md#project-members-permissions).
-In our case:
+To view a list of environments and deployments:
-- The `test` job runs first.
-- Then the `build` job.
-- Lastly the `deploy_staging` job.
+1. Go to the project's **Operations > Environments** page.
+ The environments are displayed.
-With this configuration, we:
+ ![Environments list](img/environments_list.png)
-- Check that the tests pass.
-- Ensure that our app is able to be built successfully.
-- Lastly we deploy to the staging server.
+1. To view a list of deployments for an environment, select the environment name,
+ for example, `staging`.
-Note that the `environment` keyword defines where the app is deployed. The environment `name` and
-`url` is exposed in various places within GitLab. Each time a job that has an environment specified
-succeeds, a deployment is recorded along with the Git SHA and environment name.
+ ![Deployments list](img/deployments_list.png)
-WARNING:
-Some characters are not allowed in environment names. Use only letters,
-numbers, spaces, and `-`, `_`, `/`, `{`, `}`, or `.`. Also, it must not start nor end with `/`.
+Deployments show up in this list only after a deployment job has created them.
-In summary, with the above `.gitlab-ci.yml` we have achieved the following:
+## Types of environments
-- All branches run the `test` and `build` jobs.
-- The `deploy_staging` job runs [only](../yaml/README.md#onlyexcept-basic) on the `master`
- branch, which means all merge requests that are created from branches don't
- get deployed to the staging server.
-- When a merge request is merged, all jobs run and the `deploy_staging`
- job deploys our code to a staging server while the deployment
- is recorded in an environment named `staging`.
+There are two types of environments:
-#### CI/CD variables and runners
+- Static environments have static names, like `staging` or `production`.
+- Dynamic environments have dynamic names. Dynamic environments
+ are a fundamental part of [Review apps](../review_apps/index.md).
-Starting with GitLab 8.15, the environment name is exposed to the runner in
-two forms:
+### Create a static environment
-- `$CI_ENVIRONMENT_NAME`. The name given in `.gitlab-ci.yml` (with any CI/CD variables
- expanded).
-- `$CI_ENVIRONMENT_SLUG`. A "cleaned-up" version of the name, suitable for use in URLs,
- DNS, etc.
-
-If you change the name of an existing environment, the:
-
-- `$CI_ENVIRONMENT_NAME` variable is updated with the new environment name.
-- `$CI_ENVIRONMENT_SLUG` variable remains unchanged to prevent unintended side
- effects.
+You can create an environment and deployment in the UI or in your `.gitlab-ci.yml` file.
-Starting with GitLab 9.3, the environment URL is exposed to the runner via
-`$CI_ENVIRONMENT_URL`. The URL is expanded from either:
+In the UI:
-- `.gitlab-ci.yml`.
-- The external URL from the environment if not defined in `.gitlab-ci.yml`.
+1. Go to the project's **Operations > Environments** page.
+1. Select **New environment**.
+1. Enter a name and external URL.
+1. Select **Save**.
-#### Set dynamic environment URLs after a job finishes
+In your `.gitlab-ci.yml` file:
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/17066) in GitLab 12.9.
+1. Specify a name for the environment and optionally, a URL, which determines the deployment URL.
+ For example:
-In a job script, you can specify a static [environment URL](#using-the-environment-url).
-However, there may be times when you want a dynamic URL. For example,
-if you deploy a Review App to an external hosting
-service that generates a random URL per deployment, like `https://94dd65b.amazonaws.com/qa-lambda-1234567`,
-you don't know the URL before the deployment script finishes.
-If you want to use the environment URL in GitLab, you would have to update it manually.
+ ```yaml
+ deploy_staging:
+ stage: deploy
+ script:
+ - echo "Deploy to staging server"
+ environment:
+ name: staging
+ url: https://staging.example.com
+ ```
-To address this problem, you can configure a deployment job to report back a set of
-variables, including the URL that was dynamically-generated by the external service.
-GitLab supports the [dotenv (`.env`)](https://github.com/bkeepers/dotenv) file format,
-and expands the `environment:url` value with variables defined in the `.env` file.
+1. Trigger a deployment. (For example, by creating and pushing a commit.)
-To use this feature, specify the
-[`artifacts:reports:dotenv`](../pipelines/job_artifacts.md#artifactsreportsdotenv) keyword in `.gitlab-ci.yml`.
+When the job runs, the environment and deployment are created.
-<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
-For an overview, see [Set dynamic URLs after a job finished](https://youtu.be/70jDXtOf4Ig).
+NOTE:
+Some characters cannot be used in environment names.
+For more information about the `environment` keywords, see
+[the `.gitlab-ci.yml` keyword reference](../yaml/README.md#environment).
-##### Example of setting dynamic environment URLs
+### Create a dynamic environment
-The following example shows a Review App that creates a new environment
-per merge request. The `review` job is triggered by every push, and
-creates or updates an environment named `review/your-branch-name`.
-The environment URL is set to `$DYNAMIC_ENVIRONMENT_URL`:
+To create a dynamic name and URL for an environment, you can use
+[predefined CI/CD variables](../variables/predefined_variables.md). For example:
```yaml
-review:
- script:
- - DYNAMIC_ENVIRONMENT_URL=$(deploy-script) # In script, get the environment URL.
- - echo "DYNAMIC_ENVIRONMENT_URL=$DYNAMIC_ENVIRONMENT_URL" >> deploy.env # Add the value to a dotenv file.
- artifacts:
- reports:
- dotenv: deploy.env # Report back dotenv file to rails.
- environment:
- name: review/$CI_COMMIT_REF_SLUG
- url: $DYNAMIC_ENVIRONMENT_URL # and set the variable produced in script to `environment:url`
- on_stop: stop_review
-
-stop_review:
+deploy_review:
+ stage: deploy
script:
- - ./teardown-environment
- when: manual
+ - echo "Deploy a review app"
environment:
- name: review/$CI_COMMIT_REF_SLUG
- action: stop
+ name: review/$CI_COMMIT_REF_NAME
+ url: https://$CI_ENVIRONMENT_SLUG.example.com
+ only:
+ - branches
+ except:
+ - master
```
-As soon as the `review` job finishes, GitLab updates the `review/your-branch-name`
-environment's URL.
-It parses the `deploy.env` report artifact, registers a list of variables as runtime-created,
-uses it for expanding `environment:url: $DYNAMIC_ENVIRONMENT_URL` and sets it to the environment URL.
-You can also specify a static part of the URL at `environment:url:`, such as
-`https://$DYNAMIC_ENVIRONMENT_URL`. If the value of `DYNAMIC_ENVIRONMENT_URL` is
-`example.com`, the final result is `https://example.com`.
-
-The assigned URL for the `review/your-branch-name` environment is [visible in the UI](#using-the-environment-url).
-
-Note the following:
+In this example:
-- `stop_review` doesn't generate a dotenv report artifact, so it doesn't recognize the
- `DYNAMIC_ENVIRONMENT_URL` environment variable. Therefore you shouldn't set `environment:url:` in the
- `stop_review` job.
-- If the environment URL isn't valid (for example, the URL is malformed), the system doesn't update
- the environment URL.
-- If the script that runs in `stop_review` exists only in your repository and therefore can't use
- `GIT_STRATEGY: none`, configure [pipelines for merge requests](../../ci/merge_request_pipelines/index.md)
- for these jobs. This ensures that runners can fetch the repository even after a feature branch is
- deleted. For more information, see [Ref Specs for Runners](../pipelines/index.md#ref-specs-for-runners).
+- The `name` is `review/$CI_COMMIT_REF_NAME`. Because the [environment name](../yaml/README.md#environmentname)
+ can contain slashes (`/`), you can use this pattern to distinguish between dynamic and static environments.
+- For the `url`, you could use `$CI_COMMIT_REF_NAME`, but because this value
+ may contain a `/` or other characters that would not be valid in a domain name or URL,
+ use `$CI_ENVIRONMENT_SLUG` instead. The `$CI_ENVIRONMENT_SLUG` variable is guaranteed to be unique.
-### Configuring manual deployments
+You do not have to use the same prefix or only slashes (`/`) in the dynamic environment name.
+However, when you use this format, you can [group similar environments](#group-similar-environments).
-Adding `when: manual` to an automatically executed job's configuration converts it to
-a job requiring manual action.
+NOTE:
+Some variables cannot be used as environment names or URLs.
+For more information about the `environment` keywords, see
+[the `.gitlab-ci.yml` keyword reference](../yaml/README.md#environment).
-To expand on the [previous example](#defining-environments), the following includes
-another job that deploys our app to a production server and is
-tracked by a `production` environment.
+## Configure manual deployments
-The `.gitlab-ci.yml` file for this is as follows:
+You can create a job that requires someone to manually start the deployment.
+For example:
```yaml
-stages:
- - test
- - build
- - deploy
-
-test:
- stage: test
- script: echo "Running tests"
-
-build:
- stage: build
- script: echo "Building the app"
-
-deploy_staging:
- stage: deploy
- script:
- - echo "Deploy to staging server"
- environment:
- name: staging
- url: https://staging.example.com
- only:
- - master
-
deploy_prod:
stage: deploy
script:
@@ -279,106 +143,12 @@ deploy_prod:
The `when: manual` action:
-- Exposes a "play" button in the GitLab UI for that job.
-- Means the `deploy_prod` job is only triggered when the "play" button is clicked.
-
-You can find the "play" button in the pipelines, environments, deployments, and jobs views.
-
-| View | Screenshot |
-|:----------------|:-------------------------------------------------------------------------------|
-| Pipelines | ![Pipelines manual action](../img/environments_manual_action_pipelines.png) |
-| Single pipeline | ![Pipelines manual action](../img/environments_manual_action_single_pipeline.png) |
-| Environments | ![Environments manual action](../img/environments_manual_action_environments.png) |
-| Deployments | ![Deployments manual action](../img/environments_manual_action_deployments.png) |
-| Jobs | ![Builds manual action](../img/environments_manual_action_jobs.png) |
-
-Clicking the play button in any view triggers the `deploy_prod` job. The deployment is recorded as a
-new environment named `production`.
-
-If your environment's name is `production` (all lowercase), it's recorded in
-[Value Stream Analytics](../../user/analytics/value_stream_analytics.md).
-
-### Configuring dynamic environments
-
-Regular environments are good when deploying to "stable" environments like staging or production.
-
-However, for environments for branches other than `master`, dynamic environments
-can be used. Dynamic environments make it possible to create environments on the fly by
-declaring their names dynamically in `.gitlab-ci.yml`.
-
-Dynamic environments are a fundamental part of [Review apps](../review_apps/index.md).
-
-#### Allowed variables
-
-The `name` and `url` keywords for dynamic environments can use most available CI/CD variables,
-including:
-
-- [Predefined CI/CD variables](../variables/README.md#predefined-cicd-variables)
-- [Project and group CI/CD variables](../variables/README.md)
-- [`.gitlab-ci.yml` CI/CD variables](../yaml/README.md#variables)
+- Exposes a play button for the job in the GitLab UI.
+- Means the `deploy_prod` job is only triggered when the play button is clicked.
-However, you cannot use variables defined:
+You can find the play button in the pipelines, environments, deployments, and jobs views.
-- Under `script`.
-- On the runner's side.
-
-There are also other variables that are unsupported in the context of `environment:name`.
-For more information, see [Where variables can be used](../variables/where_variables_can_be_used.md).
-
-#### Example configuration
-
-Runners expose various [predefined CI/CD variables](../variables/predefined_variables.md) when a job runs, so
-you can use them as environment names.
-
-In the following example, the job deploys to all branches except `master`:
-
-```yaml
-deploy_review:
- stage: deploy
- script:
- - echo "Deploy a review app"
- environment:
- name: review/$CI_COMMIT_REF_NAME
- url: https://$CI_ENVIRONMENT_SLUG.example.com
- only:
- - branches
- except:
- - master
-```
-
-In this example:
-
-- The job's name is `deploy_review` and it runs on the `deploy` stage.
-- We set the `environment` with the `environment:name` as `review/$CI_COMMIT_REF_NAME`.
- Since the [environment name](../yaml/README.md#environmentname) can contain slashes (`/`), we can
- use this pattern to distinguish between dynamic and regular environments.
-- We tell the job to run [`only`](../yaml/README.md#onlyexcept-basic) on branches,
- [`except`](../yaml/README.md#onlyexcept-basic) `master`.
-
-For the value of:
-
-- `environment:name`, the first part is `review`, followed by a `/` and then `$CI_COMMIT_REF_NAME`,
- which receives the value of the branch name.
-- `environment:url`, we want a specific and distinct URL for each branch. `$CI_COMMIT_REF_NAME`
- may contain a `/` or other characters that would be invalid in a domain name or URL,
- so we use `$CI_ENVIRONMENT_SLUG` to guarantee that we get a valid URL.
-
- For example, given a `$CI_COMMIT_REF_NAME` of `100-Do-The-Thing`, the URL is something
- like `https://100-do-the-4f99a2.example.com`. Again, the way you set up
- the web server to serve these requests is based on your setup.
-
- We have used `$CI_ENVIRONMENT_SLUG` here because it is guaranteed to be unique. If
- you're using a workflow like [GitLab Flow](../../topics/gitlab_flow.md), collisions
- are unlikely and you may prefer environment names to be more closely based on the
- branch name. In that case, you could use `$CI_COMMIT_REF_NAME` in `environment:url` in
- the example above: `https://$CI_COMMIT_REF_NAME.example.com`, which would give a URL
- of `https://100-do-the-thing.example.com`.
-
-You aren't required to use the same prefix or only slashes (`/`) in the dynamic environments' names.
-However, using this format enables the [grouping similar environments](#grouping-similar-environments)
-feature.
-
-### Configuring Kubernetes deployments
+## Configure Kubernetes deployments
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/27630) in GitLab 12.6.
@@ -413,237 +183,147 @@ deploy:
- master
```
-When deploying to a Kubernetes cluster using the GitLab Kubernetes integration,
-information about the cluster and namespace is displayed above the job
+When you use the GitLab Kubernetes integration to deploy to a Kubernetes cluster,
+cluster and namespace information is displayed above the job
trace on the deployment job page:
![Deployment cluster information](../img/environments_deployment_cluster_v12_8.png)
-#### Configuring incremental rollouts
+### Configure incremental rollouts
Learn how to release production changes to only a portion of your Kubernetes pods with
[incremental rollouts](../environments/incremental_rollouts.md).
-### Deployment safety
+## CI/CD variables for environments and deployments
-Deployment jobs can be more sensitive than other jobs in a pipeline,
-and might need to be treated with an extra care. There are multiple features
-in GitLab that helps maintain deployment security and stability.
+When you create an environment, you specify the name and URL.
-- [Restrict write-access to a critical environment](deployment_safety.md#restrict-write-access-to-a-critical-environment)
-- [Limit the job-concurrency for deployment jobs](deployment_safety.md#ensure-only-one-deployment-job-runs-at-a-time)
-- [Skip outdated deployment jobs](deployment_safety.md#skip-outdated-deployment-jobs)
-- [Prevent deployments during deploy freeze windows](deployment_safety.md#prevent-deployments-during-deploy-freeze-windows)
+If you want to use the name or URL in another job, you can use:
-### Complete example
+- `$CI_ENVIRONMENT_NAME`. The name defined in the `.gitlab-ci.yml` file.
+- `$CI_ENVIRONMENT_SLUG`. A "cleaned-up" version of the name, suitable for use in URL and DNS, for example.
+ This variable is guaranteed to be unique.
+- `$CI_ENVIRONMENT_URL`. The environment's URL, which was specified in the
+ `.gitlab-ci.yml` file or automatically assigned.
-The configuration in this section provides a full development workflow where your app is:
+If you change the name of an existing environment, the:
-- Tested.
-- Built.
-- Deployed as a Review App.
-- Deployed to a staging server after the merge request is merged.
-- Finally, able to be manually deployed to the production server.
+- `$CI_ENVIRONMENT_NAME` variable is updated with the new environment name.
+- `$CI_ENVIRONMENT_SLUG` variable remains unchanged to prevent unintended side
+ effects.
-The following combines the previous configuration examples, including:
+## Set dynamic environment URLs after a job finishes
-- Defining [simple environments](#defining-environments) for testing, building, and deployment to staging.
-- Adding [manual actions](#configuring-manual-deployments) for deployment to production.
-- Creating [dynamic environments](#configuring-dynamic-environments) for deployments for reviewing.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/17066) in GitLab 12.9.
-```yaml
-stages:
- - test
- - build
- - deploy
+In a job script, you can specify a static environment URL.
+However, there may be times when you want a dynamic URL. For example,
+if you deploy a Review App to an external hosting
+service that generates a random URL per deployment, like `https://94dd65b.amazonaws.com/qa-lambda-1234567`.
+In this case, you don't know the URL before the deployment script finishes.
+If you want to use the environment URL in GitLab, you would have to update it manually.
-test:
- stage: test
- script: echo "Running tests"
+To address this problem, you can configure a deployment job to report back a set of
+variables. These variables include the URL that was dynamically-generated by the external service.
+GitLab supports the [dotenv (`.env`)](https://github.com/bkeepers/dotenv) file format,
+and expands the `environment:url` value with variables defined in the `.env` file.
-build:
- stage: build
- script: echo "Building the app"
+To use this feature, specify the
+[`artifacts:reports:dotenv`](../pipelines/job_artifacts.md#artifactsreportsdotenv) keyword in `.gitlab-ci.yml`.
-deploy_review:
- stage: deploy
- script:
- - echo "Deploy a review app"
- environment:
- name: review/$CI_COMMIT_REF_NAME
- url: https://$CI_ENVIRONMENT_SLUG.example.com
- only:
- - branches
- except:
- - master
+<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
+For an overview, see [Set dynamic URLs after a job finished](https://youtu.be/70jDXtOf4Ig).
-deploy_staging:
- stage: deploy
- script:
- - echo "Deploy to staging server"
- environment:
- name: staging
- url: https://staging.example.com
- only:
- - master
+### Example of setting dynamic environment URLs
-deploy_prod:
- stage: deploy
+The following example shows a Review App that creates a new environment
+per merge request. The `review` job is triggered by every push, and
+creates or updates an environment named `review/your-branch-name`.
+The environment URL is set to `$DYNAMIC_ENVIRONMENT_URL`:
+
+```yaml
+review:
script:
- - echo "Deploy to production server"
+ - DYNAMIC_ENVIRONMENT_URL=$(deploy-script) # In script, get the environment URL.
+ - echo "DYNAMIC_ENVIRONMENT_URL=$DYNAMIC_ENVIRONMENT_URL" >> deploy.env # Add the value to a dotenv file.
+ artifacts:
+ reports:
+ dotenv: deploy.env # Report back dotenv file to rails.
environment:
- name: production
- url: https://example.com
- when: manual
- only:
- - master
-```
-
-A more realistic example would also include copying files to a location where a
-webserver (for example, NGINX) could then access and serve them.
-
-The example below copies the `public` directory to `/srv/nginx/$CI_COMMIT_REF_SLUG/public`:
+ name: review/$CI_COMMIT_REF_SLUG
+ url: $DYNAMIC_ENVIRONMENT_URL # and set the variable produced in script to `environment:url`
+ on_stop: stop_review
-```yaml
-review_app:
- stage: deploy
+stop_review:
script:
- - rsync -av --delete public /srv/nginx/$CI_COMMIT_REF_SLUG
+ - ./teardown-environment
+ when: manual
environment:
- name: review/$CI_COMMIT_REF_NAME
- url: https://$CI_COMMIT_REF_SLUG.example.com
+ name: review/$CI_COMMIT_REF_SLUG
+ action: stop
```
-This example requires that NGINX and GitLab Runner are set up on the server this job runs on.
-
-See the [limitations](#limitations) section for some edge cases regarding the naming of your
-branches and Review Apps.
-
-The complete example provides the following workflow to developers:
-
-- Create a branch locally.
-- Make changes and commit them.
-- Push the branch to GitLab.
-- Create a merge request.
-
-Behind the scenes, the runner:
-
-- Picks up the changes and starts running the jobs.
-- Runs the jobs sequentially as defined in `stages`:
- - First, run the tests.
- - If the tests succeed, build the app.
- - If the build succeeds, the app is deployed to an environment with a name specific to the
- branch.
-
-So now, every branch:
-
-- Gets its own environment.
-- Is deployed to its own unique location, with the added benefit of:
- - Having a [history of deployments](#viewing-deployment-history).
- - Being able to [rollback changes](#retrying-and-rolling-back) if needed.
-
-For more information, see [Using the environment URL](#using-the-environment-url).
+As soon as the `review` job finishes, GitLab updates the `review/your-branch-name`
+environment's URL.
+It parses the `deploy.env` report artifact, registers a list of variables as runtime-created,
+uses it for expanding `environment:url: $DYNAMIC_ENVIRONMENT_URL` and sets it to the environment URL.
+You can also specify a static part of the URL at `environment:url:`, such as
+`https://$DYNAMIC_ENVIRONMENT_URL`. If the value of `DYNAMIC_ENVIRONMENT_URL` is
+`example.com`, the final result is `https://example.com`.
-### Protected environments
+The assigned URL for the `review/your-branch-name` environment is visible in the UI.
-Environments can be "protected", restricting access to them.
+Note the following:
-For more information, see [Protected environments](protected_environments.md).
+- `stop_review` doesn't generate a dotenv report artifact, so it doesn't recognize the
+ `DYNAMIC_ENVIRONMENT_URL` environment variable. Therefore you shouldn't set `environment:url:` in the
+ `stop_review` job.
+- If the environment URL isn't valid (for example, the URL is malformed), the system doesn't update
+ the environment URL.
+- If the script that runs in `stop_review` exists only in your repository and therefore can't use
+ `GIT_STRATEGY: none`, configure [pipelines for merge requests](../../ci/merge_request_pipelines/index.md)
+ for these jobs. This ensures that runners can fetch the repository even after a feature branch is
+ deleted. For more information, see [Ref Specs for Runners](../pipelines/index.md#ref-specs-for-runners).
## Working with environments
Once environments are configured, GitLab provides many features for working with them,
as documented below.
-### Viewing environments and deployments
-
-A list of environments and deployment statuses is available on each project's **Operations > Environments** page.
-
-For example:
+### Environment rollback
-![Environment view](../img/environments_available_13_7.png)
+When you roll back a deployment on a specific commit,
+a _new_ deployment is created. This deployment has its own unique job ID.
+It points to the commit you're rolling back to.
-This example shows:
+For the rollback to succeed, the deployment process must be defined in
+the job's `script`.
-- The environment's name with a link to its deployments.
-- The last deployment ID number and who performed it.
-- The job ID of the last deployment with its respective job name.
-- The commit information of the last deployment, such as who committed it, to what
- branch, and the Git SHA of the commit.
-- The exact time the last deployment was performed.
-- The upcoming deployment, if a deployment for the environment is in progress.
-- When the environment stops automatically.
-- A button that takes you to the URL that you defined under the `environment` keyword
- in `.gitlab-ci.yml`.
-- A number of deployment actions, including:
- - Prevent the environment from [stopping automatically](#automatically-stopping-an-environment).
- - [Open the live environment](#using-the-environment-url).
- - Trigger [a manual deployment to a different environment](#configuring-manual-deployments).
- - [Retry the deployment](#retrying-and-rolling-back).
- - [Stop the environment](#stopping-an-environment).
-
-The information shown in the **Environments** page is limited to the latest
-deployments, but an environment can have multiple deployments.
-
-> **Notes:**
->
-> - While you can create environments manually in the web interface, we recommend
-> that you define your environments in `.gitlab-ci.yml` first. They will
-> be automatically created for you after the first deploy.
-> - The environments page can only be viewed by users with [Reporter permission](../../user/permissions.md#project-members-permissions)
-> and above. For more information on permissions, see the [permissions documentation](../../user/permissions.md).
-> - Only deploys that happen after your `.gitlab-ci.yml` is properly configured
-> show up in the **Environment** and **Last deployment** lists.
-
-### Viewing deployment history
-
-GitLab keeps track of your deployments, so you:
-
-- Always know what is currently being deployed on your servers.
-- Can have the full history of your deployments for every environment.
-
-Clicking on an environment shows the history of its deployments. Here's an example **Environments** page
-with multiple deployments:
-
-![Deployments](../img/deployments_view.png)
-
-This view is similar to the **Environments** page, but all deployments are shown. Also in this view
-is a **Rollback** button. For more information, see [Retrying and rolling back](#retrying-and-rolling-back).
-
-### Retrying and rolling back
+#### Retry or roll back a deployment
If there is a problem with a deployment, you can retry it or roll it back.
To retry or rollback a deployment:
-1. Navigate to **Operations > Environments**.
-1. Click on the environment.
-1. In the deployment history list for the environment, click the:
- - **Retry** button next to the last deployment, to retry that deployment.
- - **Rollback** button next to a previously successful deployment, to roll back to that deployment.
+1. Go to the project's **Operations > Environments**.
+1. Select the environment.
+1. To the right of the deployment name:
+ - To retry a deployment, select **Re-deploy to environment**.
+ - To roll back to a deployment, next to a previously successful deployment, select **Rollback environment**.
-#### What to expect with a rollback
+### Environment URL
-Pressing the **Rollback** button on a specific commit triggers a _new_ deployment with its own
-unique job ID. This new deployment points to the commit you're
-rolling back to.
+The [environment URL](../yaml/README.md#environmenturl) is displayed in a few
+places in GitLab:
-Note that the defined deployment process in the job's `script` determines whether the rollback
-succeeds.
-
-### Using the environment URL
-
-The [environment URL](../yaml/README.md#environmenturl) is exposed in a few
-places within GitLab:
-
-- In a merge request widget as a link:
+- In a merge request as a link:
![Environment URL in merge request](../img/environments_mr_review_app.png)
- In the Environments view as a button:
- ![Environment URL in environments](../img/environments_available_13_7.png)
+ ![Environment URL in environments](../img/environments_available_13_10.png)
- In the Deployments view as a button:
![Environment URL in deployments](../img/deployments_view.png)
-You can see this information in a merge request itself if:
+You can see this information in a merge request if:
- The merge request is eventually merged to the default branch (usually `master`).
- That branch also deploys to an environment (for example, `staging` or `production`).
@@ -659,24 +339,27 @@ from source files to public pages in the environment set for Review Apps.
### Stopping an environment
-Stopping an environment:
+When you stop an environment:
-- Moves it from the list of **Available** environments to the list of **Stopped**
- environments on the [**Environments** page](#viewing-environments-and-deployments).
-- Executes an [`on_stop` action](../yaml/README.md#environmenton_stop), if defined.
+- On the **Environments** page, it moves from the list of **Available** environments
+ to the list of **Stopped** environments.
+- An [`on_stop` action](../yaml/README.md#environmenton_stop), if defined, is executed.
-This is often used when multiple developers are working on a project at the same time,
-each of them pushing to their own branches, causing many dynamic environments to be created.
-
-Starting with GitLab 8.14, dynamic environments stop automatically when their associated branch is
+Dynamic environments stop automatically when their associated branch is
deleted.
-#### Automatically stopping an environment
+#### Stop an environment when a branch is deleted
+
+You can configure environments to stop when a branch is deleted.
-Environments can be stopped automatically using special configuration.
+The following example shows a `deploy_review` job that calls a `stop_review` job
+to clean up and stop the environment. The `stop_review` job must be in the same
+`stage` as the `deploy_review` job.
-Consider the following example where the `deploy_review` job calls `stop_review`
-to clean up and stop the environment:
+Both jobs must have the same [`rules`](../yaml/README.md#onlyexcept-basic)
+or [`only/except`](../yaml/README.md#onlyexcept-basic) configuration. Otherwise,
+the `stop_review` job might not be included in all pipelines that include the
+`deploy_review` job, and you cannot trigger `action: stop` to stop the environment automatically.
```yaml
deploy_review:
@@ -702,55 +385,30 @@ stop_review:
when: manual
```
-If you can't use [Pipelines for merge requests](../merge_request_pipelines/index.md),
-setting the [`GIT_STRATEGY`](../runners/README.md#git-strategy) to `none` is necessary in the
-`stop_review` job so that the [runner](https://docs.gitlab.com/runner/) doesn't
+If you can't use [pipelines for merge requests](../merge_request_pipelines/index.md),
+set the [`GIT_STRATEGY`](../runners/README.md#git-strategy) to `none` in the
+`stop_review` job. Then the [runner](https://docs.gitlab.com/runner/) doesn't
try to check out the code after the branch is deleted.
-When you have an environment that has a stop action defined (typically when
-the environment describes a Review App), GitLab automatically triggers a
-stop action when the associated branch is deleted. The `stop_review` job must
-be in the same `stage` as the `deploy_review` job in order for the environment
-to automatically stop.
+Read more in the [`.gitlab-ci.yml` reference](../yaml/README.md#environmenton_stop).
-Additionally, both jobs should have matching [`rules`](../yaml/README.md#onlyexcept-basic)
-or [`only/except`](../yaml/README.md#onlyexcept-basic) configuration. In the example
-above, if the configuration isn't identical, the `stop_review` job might not be
-included in all pipelines that include the `deploy_review` job, and it isn't
-possible to trigger `action: stop` to stop the environment automatically.
-
-You can read more in the [`.gitlab-ci.yml` reference](../yaml/README.md#environmenton_stop).
-
-#### Environments auto-stop
+#### Stop an environment after a certain time period
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/20956) in GitLab 12.8.
-You can set an expiry time for environments and stop them automatically after a certain period.
-
-For example, consider the use of this feature with Review App environments. When you set up Review
-Apps, sometimes they keep running for a long time because some merge requests are left open and
-forgotten. Such idle environments waste resources and should be terminated as soon as possible.
-
-To address this problem, you can specify an optional expiration date for Review App environments.
-When the expiry time is reached, GitLab automatically triggers a job to stop the environment,
-eliminating the need of manually doing so. In case an environment is updated, the expiration is
-renewed ensuring that only active merge requests keep running Review Apps.
+You can set environments to stop automatically after a certain time period.
-To enable this feature, you must specify the [`environment:auto_stop_in`](../yaml/README.md#environmentauto_stop_in)
-keyword in `.gitlab-ci.yml`. You can specify a human-friendly date as the value, such as
-`1 hour and 30 minutes` or `1 day`. `auto_stop_in` uses the same format of
-[`artifacts:expire_in` docs](../yaml/README.md#artifactsexpire_in).
+In your `.gitlab-ci.yml` file, specify the [`environment:auto_stop_in`](../yaml/README.md#environmentauto_stop_in)
+keyword. You can specify a human-friendly date as the value, such as `1 hour and 30 minutes` or `1 day`.
+After the time period passes, GitLab automatically triggers a job to stop the environment.
-Note that due to resource limitation, a background worker for stopping environments only runs once
+Due to resource limitations, a background worker for stopping environments only runs once
every hour. This means that environments aren't stopped at the exact timestamp specified, but are
instead stopped when the hourly cron worker detects expired environments.
-##### Auto-stop example
-
-In the following example, there is a basic review app setup that creates a new environment
-per merge request. The `review_app` job is triggered by every push and
-creates or updates an environment named `review/your-branch-name`.
-The environment keeps running until `stop_review_app` is executed:
+In the following example, each merge request creates a new Review App environment.
+Each push triggers the `review_app` job and an environment named `review/your-branch-name`
+is created or updated. The environment runs until `stop_review_app` is executed:
```yaml
review_app:
@@ -772,54 +430,54 @@ stop_review_app:
when: manual
```
-As long as a merge request is active and keeps getting new commits,
-the review app doesn't stop, so developers don't need to worry about
-re-initiating review app.
+As long as the merge request is active and keeps getting new commits,
+the Review App doesn't stop. Developers don't need to worry about
+re-initiating Review App.
-On the other hand, since `stop_review_app` is set to `auto_stop_in: 1 week`,
-if a merge request becomes inactive for more than a week,
+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.
-You can also check the expiration date of environments through the GitLab UI. To do so,
-go to **Operations > Environments > Environment**. You can see the auto-stop period
-at the left-top section and a pin-mark button at the right-top section. This pin-mark
-button can be used to prevent auto-stopping the environment. By clicking this button, the
-`auto_stop_in` setting is overwritten and the environment is active until it's stopped manually.
+#### View a deployment's scheduled stop time
-![Environment auto stop](../img/environment_auto_stop_v12_8.png)
+You can view a deployment's expiration date in the GitLab UI.
-#### Delete a stopped environment
+1. Go to the project's **Operations > Environments** page.
+1. Select the name of the deployment.
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/20620) in GitLab 12.10.
+In the top left, next to the environment name, the expiration date is displayed.
-You can delete [stopped environments](#stopping-an-environment) in one of two
-ways: through the GitLab UI or through the API.
+#### Override a deployment's scheduled stop time
-##### Delete environments through the UI
+You can manually override a deployment's expiration date.
-To view the list of **Stopped** environments, navigate to **Operations > Environments**
-and click the **Stopped** tab.
+1. Go to the project's **Operations > Environments** page.
+1. Select the deployment name.
+1. In the top right, select the thumbtack (**{thumbtack}**).
-From there, you can click the **Delete** button directly, or you can click the
-environment name to see its details and **Delete** it from there.
+![Environment auto stop](img/environment_auto_stop_v13_10.png)
-You can also delete environments by viewing the details for a
-stopped environment:
+The `auto_stop_in` setting is overwritten and the environment remains active until it's stopped manually.
- 1. Navigate to **Operations > Environments**.
- 1. Click on the name of an environment within the **Stopped** environments list.
- 1. Click on the **Delete** button that appears at the top for all stopped environments.
- 1. Finally, confirm your chosen environment in the modal that appears to delete it.
+#### Delete a stopped environment
-##### Delete environments through the API
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/20620) in GitLab 12.10.
+
+You can delete [stopped environments](#stopping-an-environment) in the GitLab UI or by using
+[the API](../../api/environments.md#delete-an-environment).
-Environments can also be deleted by using the [Environments API](../../api/environments.md#delete-an-environment).
+To delete a stopped environment in the GitLab UI:
+
+1. Go to the project's **Operations > Environments** page.
+1. Select the **Stopped** tab.
+1. Next to the environment you want to delete, select **Delete environment**.
+1. On the confirmation dialog box, select **Delete environment**.
### Prepare an environment
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/208655) in GitLab 13.2.
-By default, GitLab creates a [deployment](#viewing-deployment-history) every time a
+By default, GitLab creates a deployment every time a
build with the specified environment runs. Newer deployments can also
[cancel older ones](deployment_safety.md#skip-outdated-deployment-jobs).
@@ -840,19 +498,19 @@ build:
url: https://staging.example.com
```
-### Grouping similar environments
+### Group similar environments
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/7015) in GitLab 8.14.
-As documented in [Configuring dynamic environments](#configuring-dynamic-environments), you can
-prepend environment name with a word, followed by a `/`, and finally the branch
-name, which is automatically defined by the `CI_COMMIT_REF_NAME` predefined CI/CD variable.
+You can group environments into collapsible sections in the UI.
+
+For example, if all of your environments start with the name `review`,
+then in the UI, the environments are grouped under that heading:
-In short, environments that are named like `type/foo` are all presented under the same
-group, named `type`.
+![Environment groups](img/environments_dynamic_groups_v13_10.png)
-In our [minimal example](#example-configuration), we named the environments `review/$CI_COMMIT_REF_NAME`
-where `$CI_COMMIT_REF_NAME` is the branch name. Here is a snippet of the example:
+The following example shows how to start your environment names with `review`.
+The `$CI_COMMIT_REF_NAME` variable is populated with the branch name at runtime:
```yaml
deploy_review:
@@ -863,11 +521,6 @@ deploy_review:
name: review/$CI_COMMIT_REF_NAME
```
-In this case, if you visit the **Environments** page and the branches
-exist, you should see something like:
-
-![Environment groups](../img/environments_dynamic_groups.png)
-
### Environment incident management
You have successfully setup a Continuous Delivery/Deployment workflow in your project.
@@ -897,7 +550,7 @@ severity is shown, so you can identify which environments need immediate attenti
When the issue that triggered the alert is resolved, it is removed and is no
longer visible on the environment page.
-If the alert requires a [rollback](#retrying-and-rolling-back), you can select the
+If the alert requires a [rollback](#retry-or-roll-back-a-deployment), you can select the
deployment tab from the environment page and select which deployment to roll back to.
#### Auto Rollback **(ULTIMATE)**
@@ -939,8 +592,6 @@ Once configured, GitLab attempts to retrieve [supported performance metrics](../
for any environment that has had a successful deployment. If monitoring data was
successfully retrieved, a **Monitoring** button appears for each environment.
-![Environment Detail with Metrics](../img/deployments_view.png)
-
Clicking the **Monitoring** button displays a new page showing up to the last
8 hours of performance data. It may take a minute or two for data to appear
after initial deployment.
@@ -971,13 +622,13 @@ Note that container-based deployments often lack basic tools (like an editor), a
be stopped or restarted at any time. If this happens, you lose all your
changes. Treat this as a debugging tool, not a comprehensive online IDE.
-Once enabled, your environments gain a **Terminal** button:
+Once enabled, your environments display a **Terminal** button:
-![Terminal button on environment index](../img/environments_terminal_button_on_index.png)
+![Terminal button on environment index](img/environments_terminal_button_on_index_v13_10.png)
You can also access the terminal button from the page for a specific environment:
-![Terminal button for an environment](../img/environments_terminal_button_on_show.png)
+![Terminal button for an environment](img/environments_terminal_button_on_show_v13_10.png)
Wherever you find it, clicking the button takes you to a separate page to
establish the terminal session:
@@ -1054,24 +705,15 @@ such as [Review Apps](../review_apps/index.md) (`review/*`).
Note that the most _specific_ spec takes precedence over the other wildcard matching. In this case,
the `review/feature-1` spec takes precedence over `review/*` and `*` specs.
-### Environments Dashboard **(PREMIUM)**
-
-See [Environments Dashboard](../environments/environments_dashboard.md) for a summary of each
-environment's operational health.
-
-## Limitations
-
-In the `environment: name`, you are limited to only the [predefined CI/CD variables](../variables/predefined_variables.md).
-Re-using variables defined inside `script` as part of the environment name doesn't work.
-
-## Further reading
-
-Below are some links you may find interesting:
+## Related topics
-- [The `.gitlab-ci.yml` definition of environments](../yaml/README.md#environment)
-- [A blog post on Deployments & Environments](https://about.gitlab.com/blog/2016/08/26/ci-deployment-and-environments/)
-- [Review Apps - Use dynamic environments to deploy your code for every branch](../review_apps/index.md)
-- [Deploy Boards for your applications running on Kubernetes](../../user/project/deploy_boards.md)
+- [Use GitLab CI to deploy to multiple environments (blog post)](https://about.gitlab.com/blog/2021/02/05/ci-deployment-and-environments/)
+- [Review Apps](../review_apps/index.md): Use dynamic environments to deploy your code for every branch.
+- [Deploy Boards](../../user/project/deploy_boards.md): View the status of your applications running on Kubernetes.
+- [Protected environments](protected_environments.md): Determine who can deploy code to your environments.
+- [Environments Dashboard](../environments/environments_dashboard.md): View a summary of each
+ environment's operational health. **(PREMIUM)**
+- [Deployment safety](deployment_safety.md#restrict-write-access-to-a-critical-environment): Secure your deployments.
<!-- ## Troubleshooting
diff --git a/doc/ci/environments/protected_environments.md b/doc/ci/environments/protected_environments.md
index 2636e59723a..9a639fde5f6 100644
--- a/doc/ci/environments/protected_environments.md
+++ b/doc/ci/environments/protected_environments.md
@@ -70,7 +70,7 @@ Alternatively, you can use the API to protect an environment:
name: ${CI_JOB_NAME}
```
-1. Use the UI to [create a new group](../../user/group/index.md#create-a-new-group).
+1. Use the UI to [create a new group](../../user/group/index.md#create-a-group).
For example, this group is called `protected-access-group` and has the group ID `9899826`. Note
that the rest of the examples in these steps use this group.
@@ -125,10 +125,18 @@ they have the following privileges:
## Deployment-only access to protected environments
Users granted access to a protected environment, but not push or merge access
-to the branch deployed to it, are only granted access to deploy the environment.
+to the branch deployed to it, are only granted access to deploy the environment. An individual in a
+group with the Reporter permission, or in groups added to the project with Reporter permissions,
+appears in the dropdown menu for deployment-only access.
-Note that deployment-only access is the only possible access level for users with
-[Reporter permissions](../../user/permissions.md).
+To add deployment-only access:
+
+1. Add a group with Reporter permissions.
+1. Add user(s) to the group.
+1. Invite the group to be a project member.
+1. Follow the steps outlined in [Protecting Environments](#protecting-environments).
+
+Note that deployment-only access is the only possible access level for groups with [Reporter permissions](../../user/permissions.md).
## Modifying and unprotecting environments
diff --git a/doc/ci/examples/README.md b/doc/ci/examples/README.md
index b48dd561a66..fc6807fd191 100644
--- a/doc/ci/examples/README.md
+++ b/doc/ci/examples/README.md
@@ -25,7 +25,6 @@ The following table lists examples with step-by-step tutorials that are containe
| Use case | Resource |
|-------------------------------|----------|
| Browser performance testing | [Browser Performance Testing with the Sitespeed.io container](../../user/project/merge_requests/browser_performance_testing.md). |
-| Clojure | [Test a Clojure application with GitLab CI/CD](test-clojure-application.md). |
| Deployment with Dpl | [Using `dpl` as deployment tool](deployment/README.md). |
| GitLab Pages | See the [GitLab Pages](../../user/project/pages/index.md) documentation for a complete example of deploying a static site. |
| End-to-end testing | [End-to-end testing with GitLab CI/CD and WebdriverIO](end_to_end_testing_webdriverio/index.md). |
@@ -35,8 +34,6 @@ The following table lists examples with step-by-step tutorials that are containe
| PHP with Laravel, Envoy | [Test and deploy Laravel applications with GitLab CI/CD and Envoy](laravel_with_gitlab_and_envoy/index.md). |
| PHP with npm, SCP | [Running Composer and npm scripts with deployment via SCP in GitLab CI/CD](deployment/composer-npm-deploy.md). |
| PHP with PHPunit, `atoum` | [Testing PHP projects](php.md). |
-| Python on Heroku | [Test and deploy a Python application with GitLab CI/CD](test-and-deploy-python-application-to-heroku.md). |
-| Ruby on Heroku | [Test and deploy a Ruby application with GitLab CI/CD](test-and-deploy-ruby-application-to-heroku.md). |
| Secrets management with Vault | [Authenticating and Reading Secrets With HashiCorp Vault](authenticating-with-hashicorp-vault/index.md). |
### Contributed examples
@@ -47,10 +44,13 @@ separate example projects:
| Use case | Resource |
|-------------------------------|----------|
+| Clojure | [Test a Clojure application with GitLab CI/CD](https://gitlab.com/gitlab-examples/clojure-web-application). |
| Game development | [DevOps and Game Development with GitLab CI/CD](https://gitlab.com/gitlab-examples/gitlab-game-demo/). |
| Java with Maven | [How to deploy Maven projects to Artifactory with GitLab CI/CD](https://gitlab.com/gitlab-examples/maven/simple-maven-example). |
| Java with Spring Boot | [Deploy a Spring Boot application to Cloud Foundry with GitLab CI/CD](https://gitlab.com/gitlab-examples/spring-gitlab-cf-deploy-demo). |
| Parallel testing Ruby & JS | [GitLab CI/CD parallel jobs testing for Ruby & JavaScript projects](https://docs.knapsackpro.com/2019/how-to-run-parallel-jobs-for-rspec-tests-on-gitlab-ci-pipeline-and-speed-up-ruby-javascript-testing). |
+| Python on Heroku | [Test and deploy a Python application with GitLab CI/CD](https://gitlab.com/gitlab-examples/python-getting-started). |
+| Ruby on Heroku | [Test and deploy a Ruby application with GitLab CI/CD](https://gitlab.com/gitlab-examples/ruby-getting-started). |
| Scala on Heroku | [Test and deploy a Scala application to Heroku](https://gitlab.com/gitlab-examples/scala-sbt). |
## CI/CD templates
diff --git a/doc/ci/examples/authenticating-with-hashicorp-vault/index.md b/doc/ci/examples/authenticating-with-hashicorp-vault/index.md
index 2d8c92a1a74..40ba7cff5f9 100644
--- a/doc/ci/examples/authenticating-with-hashicorp-vault/index.md
+++ b/doc/ci/examples/authenticating-with-hashicorp-vault/index.md
@@ -53,7 +53,9 @@ The JWT's payload looks like this:
"job_id": "1212", #
"ref": "auto-deploy-2020-04-01", # Git ref for this job
"ref_type": "branch", # Git ref type, branch or tag
- "ref_protected": "true" # true if this git ref is protected, false otherwise
+ "ref_protected": "true", # true if this git ref is protected, false otherwise
+ "environment": "production", # Environment this job deploys to, if present (GitLab 13.9 and later)
+ "environment_protected": "true" # true if deployed environment is protected, false otherwise (GitLab 13.9 and later)
}
```
@@ -178,7 +180,7 @@ $ vault write auth/jwt/config \
For the full list of available configuration options, see Vault's [API documentation](https://www.vaultproject.io/api/auth/jwt#configure).
-The following job, when run for the `master` branch, is able to read secrets under `secret/myproject/staging/`, but not the secrets under `secret/myproject/production/`:
+The following job, when run for the default branch, is able to read secrets under `secret/myproject/staging/`, but not the secrets under `secret/myproject/production/`:
```yaml
read_secrets:
diff --git a/doc/ci/examples/deployment/README.md b/doc/ci/examples/deployment/README.md
index 779ca98084f..4d2c22a17f0 100644
--- a/doc/ci/examples/deployment/README.md
+++ b/doc/ci/examples/deployment/README.md
@@ -116,7 +116,7 @@ We also use two secure variables:
## Storing API keys
To add secure variables, navigate to your project's
-**Settings > CI / CD > Variables**. The variables that are defined
+**Settings > CI/CD > Variables**. The variables that are defined
in the project settings are sent along with the build script to the runner.
The secure variables are stored out of the repository. Never store secrets in
your project's `.gitlab-ci.yml`. It is also important that the secret's value
@@ -128,4 +128,4 @@ or `%` (for Windows Batch runners):
1. `$VARIABLE` - use it for non-Windows runners
1. `%VARIABLE%` - use it for Windows Batch runners
-Read more about the [CI variables](../../variables/README.md).
+Read more about the [CI/CD variables](../../variables/README.md).
diff --git a/doc/ci/examples/deployment/composer-npm-deploy.md b/doc/ci/examples/deployment/composer-npm-deploy.md
index 2d7ba2bc759..62607320410 100644
--- a/doc/ci/examples/deployment/composer-npm-deploy.md
+++ b/doc/ci/examples/deployment/composer-npm-deploy.md
@@ -122,7 +122,7 @@ Therefore, for a production environment we use additional steps to ensure that a
Since this was a WordPress project, I gave real life code snippets. Some further ideas you can pursue:
-- Having a slightly different script for `master` branch allows you to deploy to a production server from that branch and to a stage server from any other branches.
+- Having a slightly different script for the default branch allows you to deploy to a production server from that branch and to a stage server from any other branches.
- Instead of pushing it live, you can push it to WordPress official repository (with creating a SVN commit, etc.).
- You could generate i18n text domains on the fly.
diff --git a/doc/ci/examples/end_to_end_testing_webdriverio/index.md b/doc/ci/examples/end_to_end_testing_webdriverio/index.md
index e20e86e8936..07bad3afc65 100644
--- a/doc/ci/examples/end_to_end_testing_webdriverio/index.md
+++ b/doc/ci/examples/end_to_end_testing_webdriverio/index.md
@@ -50,14 +50,14 @@ infrastructure is up and running, and that your units of code work well together
[Selenium](https://www.selenium.dev/) is a piece of software that can control web browsers, e.g., to make them
visit a specific URL or interact with elements on the page. It can be programmatically controlled
from a variety of programming languages. In this article we're going to be using the
-[WebdriverIO](https://webdriver.io/) JavaScript bindings, but the general concept should carry over
+[WebdriverIO](http://v4.webdriver.io/) JavaScript bindings, but the general concept should carry over
pretty well to
[other programming languages supported by Selenium](https://www.selenium.dev/documentation/en/legacy_docs/selenium_rc/).
## Writing tests
You can write tests using
-[several testing frameworks supported by WebdriverIO](https://webdriver.io/guide/testrunner/frameworks.html).
+[several testing frameworks supported by WebdriverIO](http://v4.webdriver.io/guide/testrunner/frameworks.html).
We will be using [Jasmine](https://jasmine.github.io/) here:
```javascript
@@ -82,14 +82,14 @@ multiple tests, such as making sure you are logged in.
The function `it` defines an individual test.
-[The `browser` object](https://webdriver.io/guide/testrunner/browserobject.html) is WebdriverIO's
-special sauce. It provides most of [the WebdriverIO API methods](https://webdriver.io/api.html) that are the key to
+[The `browser` object](http://v4.webdriver.io/guide/testrunner/browserobject.html) is WebdriverIO's
+special sauce. It provides most of [the WebdriverIO API methods](http://v4.webdriver.io/docs/api/) that are the key to
steering the browser. In this case, we can use
-[`browser.url`](https://webdriver.io/api/protocol/url.html) to visit `/page-that-does-not-exist` to
-hit our 404 page. We can then use [`browser.getUrl`](https://webdriver.io/api/property/getUrl.html)
+[`browser.url`](http://v4.webdriver.io/api/protocol/url.html) to visit `/page-that-does-not-exist` to
+hit our 404 page. We can then use [`browser.getUrl`](http://v4.webdriver.io/api/property/getUrl.html)
to verify that the current page is indeed at the location we specified. To interact with the page,
we can simply pass CSS selectors to
-[`browser.element`](https://webdriver.io/api/protocol/element.html) to get access to elements on the
+[`browser.element`](http://v4.webdriver.io/api/protocol/element.html) to get access to elements on the
page and to interact with them - for example, to click on the link back to the home page.
The simple test shown above
@@ -111,9 +111,9 @@ you can use [the Webpack Dev Server WebdriverIO plugin](https://www.npmjs.com/pa
that automatically starts a development server before executing the tests.
The WebdriverIO documentation has
-[an overview of all configuration options](https://webdriver.io/guide/getstarted/configuration.html), but the
+[an overview of all configuration options](http://v4.webdriver.io/guide/getstarted/configuration.html), but the
easiest way to get started is to start with
-[WebdriverIO's default configuration](https://webdriver.io/guide/testrunner/configurationfile.html), which
+[WebdriverIO's default configuration](http://v4.webdriver.io/guide/testrunner/configurationfile.html), which
provides an overview of all available options. The two options that are going to be most relevant now are the
`specs` option, which is an array of paths to your tests, and the `baseUrl` option, which points to where your app is
running. And finally, we will need to tell WebdriverIO in which browsers we would like to run our
@@ -186,7 +186,7 @@ e2e:chrome:
Now that we have a job to run the end-to-end tests in, we need to tell WebdriverIO how to connect to
the Selenium servers running alongside it. We've already cheated a bit above by
-passing the value of the [`host`](https://webdriver.io/guide/getstarted/configuration.html#host)
+passing the value of the [`host`](http://v4.webdriver.io/guide/getstarted/configuration.html#host)
option as an argument to `npm run confidence-check` on the command line.
However, we still need to tell WebdriverIO which browser is available for it to use.
@@ -253,7 +253,7 @@ production project, see:
- [Flockademic's `.gitlab-ci.yml`](https://gitlab.com/Flockademic/Flockademic/blob/dev/.gitlab-ci.yml)
- [Flockademic's tests](https://gitlab.com/Flockademic/Flockademic/tree/dev/__e2e__)
-There's plenty more that WebdriverIO can do. For example, you can configure a [`screenshotPath`](https://webdriver.io/guide/getstarted/configuration.html#screenshotPath) to tell WebdriverIO to take
+There's plenty more that WebdriverIO can do. For example, you can configure a [`screenshotPath`](http://v4.webdriver.io/guide/getstarted/configuration.html#screenshotPath) to tell WebdriverIO to take
a screenshot when tests are failing. Then tell GitLab CI/CD to store those
[artifacts](../../yaml/README.md#artifacts), and you'll be able to see what went
wrong within GitLab.
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 a02a5347734..2acd7315630 100644
--- a/doc/ci/examples/laravel_with_gitlab_and_envoy/index.md
+++ b/doc/ci/examples/laravel_with_gitlab_and_envoy/index.md
@@ -128,7 +128,7 @@ We'll use this variable in the `.gitlab-ci.yml` later, to easily connect to our
![variables page](img/variables_page.png)
-We also need to add the public key to **Project** > **Settings** > **Repository** as a [Deploy Key](../../../ssh/README.md#deploy-keys), which gives us the ability to access our repository from the server through [SSH protocol](../../../gitlab-basics/command-line-commands.md#start-working-on-your-project).
+We also need to add the public key to **Project** > **Settings** > **Repository** as a [Deploy Key](../../../user/project/deploy_keys/index.md), which gives us the ability to access our repository from the server through [SSH protocol](../../../gitlab-basics/command-line-commands.md#start-working-on-your-project).
```shell
# As the deployer user on the server
@@ -619,7 +619,7 @@ deploy_production:
- master
```
-You may also want to add another job for [staging environment](https://about.gitlab.com/blog/2016/08/26/ci-deployment-and-environments/), to final test your application before deploying to production.
+You may also want to add another job for [staging environment](https://about.gitlab.com/blog/2021/02/05/ci-deployment-and-environments/), to final test your application before deploying to production.
### Turn on GitLab CI/CD
diff --git a/doc/ci/examples/semantic-release.md b/doc/ci/examples/semantic-release.md
index c0fc93fe1b3..28a0080626a 100644
--- a/doc/ci/examples/semantic-release.md
+++ b/doc/ci/examples/semantic-release.md
@@ -91,7 +91,7 @@ As part of publishing a package, semantic-release increases the version number i
1. Navigate to **Project > Settings > Access Tokens**.
1. Give the token a name, and select the `api` scope.
1. Click **Create project access token** and copy its value.
-1. Navigate to **Project > Settings > CI / CD > Variables**.
+1. Navigate to **Project > Settings > CI/CD > Variables**.
1. Click **Add Variable**.
1. In the **Key** field, enter `GITLAB_TOKEN`. In the **Value** field, paste the token created above. Check the **Mask variable** option and click **Add variable**.
@@ -126,7 +126,7 @@ Test the pipeline by creating a commit with a message like:
fix: testing patch releases
```
-Push the commit to `master`. The pipeline should create a new release (`v1.0.0`) on the project's **Releases** page and publish a new version of the package to the project's **Package Registry** page.
+Push the commit to the default branch. The pipeline should create a new release (`v1.0.0`) on the project's **Releases** page and publish a new version of the package to the project's **Package Registry** page.
To create a minor release, use a commit message like:
diff --git a/doc/ci/examples/test-and-deploy-python-application-to-heroku.md b/doc/ci/examples/test-and-deploy-python-application-to-heroku.md
index 28d00362309..4a6555a58a6 100644
--- a/doc/ci/examples/test-and-deploy-python-application-to-heroku.md
+++ b/doc/ci/examples/test-and-deploy-python-application-to-heroku.md
@@ -1,101 +1,8 @@
---
-stage: Verify
-group: Continuous Integration
-info: To 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: tutorial
+redirect_to: 'README.md#contributed-examples'
---
-# Test and deploy a Python application with GitLab CI/CD
+This document was moved to [another location](README.md#contributed-examples).
-This example will guide you how to run tests in your Python application and deploy it automatically as Heroku application.
-
-You can also view or fork the complete [example source](https://gitlab.com/ayufan/python-getting-started).
-
-## Configure project
-
-This is what the `.gitlab-ci.yml` file looks like for this project:
-
-```yaml
-stages:
- - test
- - deploy
-
-test:
- stage: test
- script:
- # this configures Django application to use attached postgres database that is run on `postgres` host
- - export DATABASE_URL=postgres://postgres:@postgres:5432/python-test-app
- - apt-get update -qy
- - apt-get install -y python-dev python-pip
- - pip install -r requirements.txt
- - python manage.py test
-
-staging:
- stage: deploy
- script:
- - apt-get update -qy
- - apt-get install -y ruby-dev
- - gem install dpl
- - dpl --provider=heroku --app=gitlab-ci-python-test-staging --api-key=$HEROKU_STAGING_API_KEY
- only:
- - master
-
-production:
- stage: deploy
- script:
- - apt-get update -qy
- - apt-get install -y ruby-dev
- - gem install dpl
- - dpl --provider=heroku --app=gitlab-ci-python-test-prod --api-key=$HEROKU_PRODUCTION_API_KEY
- only:
- - tags
-```
-
-This project has three jobs:
-
-- `test` - used to test Django application.
-- `staging` - used to automatically deploy staging environment every push to `master` branch.
-- `production` - used to automatically deploy production environment for every created tag.
-
-## Store API keys
-
-You'll need to create two variables in **Settings > CI/CD > Variables** in your GitLab project:
-
-- `HEROKU_STAGING_API_KEY` - Heroku API key used to deploy staging app.
-- `HEROKU_PRODUCTION_API_KEY` - Heroku API key used to deploy production app.
-
-Find your Heroku API key in [Manage Account](https://dashboard.heroku.com/account).
-
-## Create Heroku application
-
-For each of your environments, you'll need to create a new Heroku application.
-You can do this through the [Dashboard](https://dashboard.heroku.com/).
-
-## Create a runner
-
-First install [Docker Engine](https://docs.docker.com/installation/).
-
-To build this project you also need to have [GitLab Runner](https://docs.gitlab.com/runner/index.html).
-You can use public runners available on `gitlab.com` or you can register your own:
-
-```shell
-cat > /tmp/test-config.template.toml << EOF
-[[runners]]
-[runners.docker]
-[[runners.docker.services]]
-name = "postgres:latest"
-EOF
-
-gitlab-runner register \
- --non-interactive \
- --url "https://gitlab.com/" \
- --registration-token "PROJECT_REGISTRATION_TOKEN" \
- --description "python-3.5" \
- --executor "docker" \
- --template-config /tmp/test-config.template.toml \
- --docker-image python:3.5
-```
-
-With the command above, you create a runner that uses the [`python:3.5`](https://hub.docker.com/_/python) image and uses a [PostgreSQL](https://hub.docker.com/_/postgres) database.
-
-To access the PostgreSQL database, connect to `host: postgres` as user `postgres` with no password.
+<!-- This redirect file can be deleted after 2021-06-01. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ci/examples/test-and-deploy-ruby-application-to-heroku.md b/doc/ci/examples/test-and-deploy-ruby-application-to-heroku.md
index 5bf0b3d01be..4a6555a58a6 100644
--- a/doc/ci/examples/test-and-deploy-ruby-application-to-heroku.md
+++ b/doc/ci/examples/test-and-deploy-ruby-application-to-heroku.md
@@ -1,97 +1,8 @@
---
-stage: Verify
-group: Continuous Integration
-info: To 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: tutorial
+redirect_to: 'README.md#contributed-examples'
---
-# Test and deploy a Ruby application with GitLab CI/CD
+This document was moved to [another location](README.md#contributed-examples).
-This example will guide you through how to run tests in your Ruby on Rails application and deploy it automatically as a Heroku application.
-
-You can also view or fork the complete [example source](https://gitlab.com/ayufan/ruby-getting-started) and view the logs of its past [CI jobs](https://gitlab.com/ayufan/ruby-getting-started/-/jobs?scope=finished).
-
-## Configure the project
-
-This is what the `.gitlab-ci.yml` file looks like for this project:
-
-```yaml
-test:
- stage: test
- script:
- - apt-get update -qy
- - apt-get install -y nodejs
- - bundle install --path /cache
- - bundle exec rake db:create RAILS_ENV=test
- - bundle exec rake test
-
-staging:
- stage: deploy
- script:
- - gem install dpl --pre
- - dpl heroku api --app=gitlab-ci-ruby-test-staging --api-key=$HEROKU_STAGING_API_KEY
- only:
- - master
-
-production:
- stage: deploy
- script:
- - gem install dpl --pre
- - dpl heroku api --app=gitlab-ci-ruby-test-prod --api-key=$HEROKU_PRODUCTION_API_KEY
- only:
- - tags
-```
-
-This project has three jobs:
-
-- `test` - used to test Rails application.
-- `staging` - used to automatically deploy staging environment every push to `master` branch.
-- `production` - used to automatically deploy production environment for every created tag.
-
-## Store API keys
-
-You'll need to create two CI/CD variables in your project's **Settings > CI/CD > Variables** and do not check **Protect variable** or **Mask variable**:
-
-- `HEROKU_STAGING_API_KEY` - Heroku API key used to deploy staging app.
-- `HEROKU_PRODUCTION_API_KEY` - Heroku API key used to deploy production app.
-
-Find your Heroku API key in [Manage Account](https://dashboard.heroku.com/account).
-
-## Create Heroku application
-
-For each of your environments, you'll need to create a new Heroku application.
-You can do this through the [Heroku Dashboard](https://dashboard.heroku.com/).
-
-## Create a runner
-
-First install [Docker Engine](https://docs.docker.com/installation/).
-
-To build this project you also need to have [GitLab Runner](https://docs.gitlab.com/runner/).
-You can use public runners available on `gitlab.com` or register your own. Start by
-creating a template configuration file to pass complex configuration:
-
-```shell
-cat > /tmp/test-config.template.toml << EOF
-[[runners]]
-[runners.docker]
-[[runners.docker.services]]
-name = "postgres:latest"
-EOF
-```
-
-Finally, register the runner, passing the newly-created template configuration file:
-
-```shell
-gitlab-runner register \
- --non-interactive \
- --url "https://gitlab.com/" \
- --registration-token "PROJECT_REGISTRATION_TOKEN" \
- --description "ruby:2.6" \
- --executor "docker" \
- --template-config /tmp/test-config.template.toml \
- --docker-image ruby:2.6
-```
-
-With the command above, you create a runner that uses the [`ruby:2.6`](https://hub.docker.com/_/ruby) image and uses a [PostgreSQL](https://hub.docker.com/_/postgres) database.
-
-To access the PostgreSQL database, connect to `host: postgres` as user `postgres` with no password.
+<!-- This redirect file can be deleted after 2021-06-01. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ci/examples/test-clojure-application.md b/doc/ci/examples/test-clojure-application.md
index b6691930a2c..8aa1fb21275 100644
--- a/doc/ci/examples/test-clojure-application.md
+++ b/doc/ci/examples/test-clojure-application.md
@@ -1,46 +1,8 @@
---
-stage: Verify
-group: Continuous Integration
-info: To 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: tutorial
+redirect_to: 'README.md#contributed-examples'
---
-NOTE:
-This document has not been updated recently and could be out of date. For the latest documentation, see the [GitLab CI/CD](../README.md) page and the [GitLab CI/CD Pipeline Configuration Reference](../yaml/README.md).
+This document was moved to [another location](README.md#contributed-examples).
-# Test a Clojure application with GitLab CI/CD
-
-This example will guide you how to run tests on your Clojure application.
-
-You can view or fork the [example source](https://gitlab.com/dzaporozhets/clojure-web-application) and view the logs of its past [CI jobs](https://gitlab.com/dzaporozhets/clojure-web-application/builds?scope=finished).
-
-## Configure the project
-
-This is what the `.gitlab-ci.yml` file looks like for this project:
-
-```yaml
-variables:
- POSTGRES_DB: sample-test
- DATABASE_URL: "postgresql://postgres@postgres:5432/sample-test"
-
-before_script:
- - apt-get update -y
- - apt-get install default-jre postgresql-client -y
- - wget https://raw.githubusercontent.com/technomancy/leiningen/stable/bin/lein
- - chmod a+x lein
- - export LEIN_ROOT=1
- - PATH=$PATH:.
- - lein deps
- - lein migratus migrate
-
-test:
- script:
- - lein test
-```
-
-In `before_script`, we install JRE and [Leiningen](https://leiningen.org/).
-
-The sample project uses the [migratus](https://github.com/yogthos/migratus) library to manage database migrations, and
-we have added a database migration as the last step of `before_script`.
-
-You can use public runners available on `gitlab.com` for testing your application with this configuration.
+<!-- This redirect file can be deleted after 2021-05-26. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ci/git_submodules.md b/doc/ci/git_submodules.md
index d9a40c1feb6..01df4f63c92 100644
--- a/doc/ci/git_submodules.md
+++ b/doc/ci/git_submodules.md
@@ -5,38 +5,23 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: reference
---
-# Using Git submodules with GitLab CI
+# Using Git submodules with GitLab CI/CD
-> **Notes:**
->
-> - GitLab 8.12 introduced a new [CI job permissions model](../user/project/new_ci_build_permissions_model.md) and you
-> are encouraged to upgrade your GitLab instance if you haven't done already.
-> If you are **not** using GitLab 8.12 or higher, you would need to work your way
-> around submodules in order to access the sources of e.g., `gitlab.com/group/project`
-> with the use of [SSH keys](ssh_keys/index.md).
-> - With GitLab 8.12 onward, your permissions are used to evaluate what a CI job
-> can access. More information about how this system works can be found in the
-> [Jobs permissions model](../user/permissions.md#job-permissions).
-> - The HTTP(S) Git protocol [must be enabled](../user/admin_area/settings/visibility_and_access_controls.md#enabled-git-access-protocols) in your GitLab instance.
+Use [Git submodules](https://git-scm.com/book/en/v2/Git-Tools-Submodules) to keep
+a Git repository as a subdirectory of another Git repository. You can clone another
+repository into your project and keep your commits separate.
-## Configuring the `.gitmodules` file
+## Configure the `.gitmodules` file
-If dealing with [Git submodules](https://git-scm.com/book/en/v2/Git-Tools-Submodules), your project probably has a file
-named `.gitmodules`.
+When you use Git submodules, your project should have a file named `.gitmodules`.
+You might need to modify it to work in a GitLab CI/CD job.
-Let's consider the following example:
+For example, your `.gitmodules` configuration might look like the following if:
-1. Your project is located at `https://gitlab.com/secret-group/my-project`.
-1. To checkout your sources you usually use an SSH address like
- `git@gitlab.com:secret-group/my-project.git`.
-1. Your project depends on `https://gitlab.com/group/project`, which you want
- to include as a submodule.
-
-If you are using GitLab 8.12+ and your submodule is on the same GitLab server,
-you must update your `.gitmodules` file to use **relative URLs**.
-Since Git allows the usage of relative URLs for your `.gitmodules` configuration,
-this easily allows you to use HTTP(S) for cloning all your CI jobs and SSH
-for all your local checkouts. The `.gitmodules` would look like:
+- Your project is located at `https://gitlab.com/secret-group/my-project`.
+- Your project depends on `https://gitlab.com/group/project`, which you want
+ to include as a submodule.
+- You check out your sources with an SSH address like `git@gitlab.com:secret-group/my-project.git`.
```ini
[submodule "project"]
@@ -44,14 +29,16 @@ for all your local checkouts. The `.gitmodules` would look like:
url = ../../group/project.git
```
-The above configuration instructs Git to automatically deduce the URL that
-should be used when cloning sources. Whether you use HTTP(S) or SSH, Git uses
-that same channel and it makes all your CI jobs use HTTP(S).
-GitLab CI/CD only uses HTTP(S) for cloning your sources, and all your local
-clones continue using SSH.
+When your submodule is on the same GitLab server, you should use relative URLs in
+your `.gitmodules` file. Then you can clone with HTTPS in all your CI/CD jobs. You
+can also use SSH for all your local checkouts.
+
+The above configuration instructs Git to automatically deduce the URL to
+use when cloning sources. Git uses the same configuration for both HTTPS and SSH.
+GitLab CI/CD uses HTTPS for cloning your sources, and you can continue to use SSH
+to clone locally.
-For all other submodules not located on the same GitLab server, use the full
-HTTP(S) protocol URL:
+For submodules not located on the same GitLab server, use the full URL:
```ini
[submodule "project-x"]
@@ -59,45 +46,16 @@ HTTP(S) protocol URL:
url = https://gitserver.com/group/project-x.git
```
-Once `.gitmodules` is correctly configured, you can move on to
-[configuring your `.gitlab-ci.yml`](#using-git-submodules-in-your-ci-jobs).
-
-## Using Git submodules in your CI jobs
+## Use Git submodules in CI/CD jobs
-There are a few steps you need to take in order to make submodules work
-correctly with your CI jobs:
+To make submodules work correctly in CI/CD jobs:
-1. First, make sure you have used [relative URLs](#configuring-the-gitmodules-file)
- for the submodules located in the same GitLab server.
-1. Next, if you are using `gitlab-runner` v1.10+, you can set the
- `GIT_SUBMODULE_STRATEGY` variable to either `normal` or `recursive` to tell
- the runner to fetch your submodules before the job:
+1. Make sure you use [relative URLs](#configure-the-gitmodules-file)
+ for submodules located in the same GitLab server.
+1. You can set the `GIT_SUBMODULE_STRATEGY` variable to either `normal` or `recursive`
+ to tell the runner to [fetch your submodules before the job](runners/README.md#git-submodule-strategy):
```yaml
variables:
GIT_SUBMODULE_STRATEGY: recursive
```
-
- See the [GitLab Runner documentation](runners/README.md#git-submodule-strategy)
- for more details about `GIT_SUBMODULE_STRATEGY`.
-
-1. If you are using an older version of `gitlab-runner`, then use
- `git submodule sync/update` in `before_script`:
-
- ```yaml
- before_script:
- - git submodule sync --recursive
- - git submodule update --init --recursive
- ```
-
- `--recursive` should be used in either both or none (`sync/update`) depending on
- whether you have recursive submodules.
-
-The rationale to set the `sync` and `update` in `before_script` is because of
-the way Git submodules work. On a fresh runner workspace, Git sets the
-submodule URL including the token in `.git/config`
-(or `.git/modules/<submodule>/config`) based on `.gitmodules` and the current
-remote URL. On subsequent jobs on the same runner, `.git/config` is cached
-and already contains a full URL for the submodule, corresponding to the previous
-job, and to **a token from a previous job**. `sync` allows to force updating
-the full URL.
diff --git a/doc/ci/img/deployments_view.png b/doc/ci/img/deployments_view.png
index 9e2b7e89577..4d49f5ea5bd 100644
--- a/doc/ci/img/deployments_view.png
+++ b/doc/ci/img/deployments_view.png
Binary files differ
diff --git a/doc/ci/img/environment_auto_stop_v12_8.png b/doc/ci/img/environment_auto_stop_v12_8.png
deleted file mode 100644
index f098938ef04..00000000000
--- a/doc/ci/img/environment_auto_stop_v12_8.png
+++ /dev/null
Binary files differ
diff --git a/doc/ci/img/environments_available_13_10.png b/doc/ci/img/environments_available_13_10.png
new file mode 100644
index 00000000000..94ffb0032fa
--- /dev/null
+++ b/doc/ci/img/environments_available_13_10.png
Binary files differ
diff --git a/doc/ci/img/environments_available_13_7.png b/doc/ci/img/environments_available_13_7.png
deleted file mode 100644
index 2e1f56c5894..00000000000
--- a/doc/ci/img/environments_available_13_7.png
+++ /dev/null
Binary files differ
diff --git a/doc/ci/img/environments_dynamic_groups.png b/doc/ci/img/environments_dynamic_groups.png
deleted file mode 100644
index 37828ccd0c1..00000000000
--- a/doc/ci/img/environments_dynamic_groups.png
+++ /dev/null
Binary files differ
diff --git a/doc/ci/img/environments_manual_action_deployments.png b/doc/ci/img/environments_manual_action_deployments.png
deleted file mode 100644
index c5959c0003e..00000000000
--- a/doc/ci/img/environments_manual_action_deployments.png
+++ /dev/null
Binary files differ
diff --git a/doc/ci/img/environments_manual_action_environments.png b/doc/ci/img/environments_manual_action_environments.png
deleted file mode 100644
index b2ec27cc721..00000000000
--- a/doc/ci/img/environments_manual_action_environments.png
+++ /dev/null
Binary files differ
diff --git a/doc/ci/img/environments_manual_action_jobs.png b/doc/ci/img/environments_manual_action_jobs.png
deleted file mode 100644
index d948ee5da9e..00000000000
--- a/doc/ci/img/environments_manual_action_jobs.png
+++ /dev/null
Binary files differ
diff --git a/doc/ci/img/environments_manual_action_pipelines.png b/doc/ci/img/environments_manual_action_pipelines.png
deleted file mode 100644
index 332850afb7f..00000000000
--- a/doc/ci/img/environments_manual_action_pipelines.png
+++ /dev/null
Binary files differ
diff --git a/doc/ci/img/environments_manual_action_single_pipeline.png b/doc/ci/img/environments_manual_action_single_pipeline.png
deleted file mode 100644
index 8c1c0c1d993..00000000000
--- a/doc/ci/img/environments_manual_action_single_pipeline.png
+++ /dev/null
Binary files differ
diff --git a/doc/ci/img/environments_terminal_button_on_index.png b/doc/ci/img/environments_terminal_button_on_index.png
deleted file mode 100644
index 40110ff325f..00000000000
--- a/doc/ci/img/environments_terminal_button_on_index.png
+++ /dev/null
Binary files differ
diff --git a/doc/ci/img/environments_terminal_button_on_show.png b/doc/ci/img/environments_terminal_button_on_show.png
deleted file mode 100644
index e96ca9c9c7e..00000000000
--- a/doc/ci/img/environments_terminal_button_on_show.png
+++ /dev/null
Binary files differ
diff --git a/doc/ci/jobs/index.md b/doc/ci/jobs/index.md
index d1fe6db3ee4..0c5fa59da8e 100644
--- a/doc/ci/jobs/index.md
+++ b/doc/ci/jobs/index.md
@@ -153,7 +153,7 @@ Job grouping is evaluated with an improved regular expression to group jobs by n
The new implementation removes one or more `: [...]`, `X Y`, `X/Y`, or `X\Y` sequences
from the **end** of job names only.
-Matching substrings occuring at the beginning or in the middle of build names are
+Matching substrings occurring at the beginning or in the middle of build names are
no longer removed.
## Specifying variables when running manual jobs
@@ -187,7 +187,7 @@ For example, if you start rolling out new code and:
- Users do not experience trouble, GitLab can automatically complete the deployment from 0% to 100%.
- Users experience trouble with the new code, you can stop the timed incremental rollout by canceling the pipeline
- and [rolling](../environments/index.md#retrying-and-rolling-back) back to the last stable version.
+ and [rolling](../environments/index.md#retry-or-roll-back-a-deployment) back to the last stable version.
![Pipelines example](img/pipeline_incremental_rollout.png)
diff --git a/doc/ci/merge_request_pipelines/index.md b/doc/ci/merge_request_pipelines/index.md
index 5c3cf6ec02e..aa596247d8c 100644
--- a/doc/ci/merge_request_pipelines/index.md
+++ b/doc/ci/merge_request_pipelines/index.md
@@ -213,7 +213,7 @@ The variable names begin with the `CI_MERGE_REQUEST_` prefix.
### Two pipelines created when pushing to a merge request
If you are experiencing duplicated pipelines when using `rules`, take a look at
-the [important differences between `rules` and `only`/`except`](../yaml/README.md#prevent-duplicate-pipelines),
+the [important differences between `rules` and `only`/`except`](../yaml/README.md#avoid-duplicate-pipelines),
which helps you get your starting configuration correct.
If you are seeing two pipelines when using `only/except`, please see the caveats
diff --git a/doc/ci/merge_request_pipelines/pipelines_for_merged_results/index.md b/doc/ci/merge_request_pipelines/pipelines_for_merged_results/index.md
index e83789efdbf..72603ed94c0 100644
--- a/doc/ci/merge_request_pipelines/pipelines_for_merged_results/index.md
+++ b/doc/ci/merge_request_pipelines/pipelines_for_merged_results/index.md
@@ -32,7 +32,7 @@ can still be successfully merged into the target.
When the merge request can't be merged, the pipeline runs against the source branch only. For example, when:
- The target branch has changes that conflict with the changes in the source branch.
-- The merge request is a [**Draft** merge request](../../../user/project/merge_requests/work_in_progress_merge_requests.md).
+- The merge request is a [**Draft** merge request](../../../user/project/merge_requests/drafts.md).
In these cases, the pipeline runs as a [pipeline for merge requests](../index.md)
and is labeled as `detached`. If these cases no longer exist, new pipelines
diff --git a/doc/ci/metrics_reports.md b/doc/ci/metrics_reports.md
index 3966e5e3e89..ed14e61c54b 100644
--- a/doc/ci/metrics_reports.md
+++ b/doc/ci/metrics_reports.md
@@ -26,12 +26,14 @@ Consider the following examples of data that can use Metrics Reports:
## How it works
-Metrics are read from the metrics report (default: `metrics.txt`). They are parsed and displayed in the MR widget.
+Metrics for a branch are read from the latest metrics report artifact (default filename: `metrics.txt`) as string values.
-All values are considered strings and string compare is used to find differences between the latest available `metrics` artifact from:
+For an MR, the values of these metrics from the feature branch are compared to the values from the target branch. Then they are displayed in the MR widget in this order:
-- `master`
-- The feature branch
+- Existing metrics with changed values.
+- Metrics that have been added by the MR. Marked with a **New** badge.
+- Metrics that have been removed by the MR. Marked with a **Removed** badge.
+- Existing metrics with unchanged values.
## How to set it up
diff --git a/doc/ci/multi_project_pipelines.md b/doc/ci/multi_project_pipelines.md
index 4c186b8a64e..9736f8c1418 100644
--- a/doc/ci/multi_project_pipelines.md
+++ b/doc/ci/multi_project_pipelines.md
@@ -314,7 +314,7 @@ Some features are not implemented yet. For example, support for environments.
You can trigger a pipeline in your project whenever a pipeline finishes for a new
tag in a different project:
-1. Go to the project's **Settings > CI / CD** page, and expand the **Pipeline subscriptions** section.
+1. Go to the project's **Settings > CI/CD** page, and expand the **Pipeline subscriptions** section.
1. Enter the project you want to subscribe to, in the format `<namespace>/<project>`.
For example, if the project is `https://gitlab.com/gitlab-org/gitlab`, use `gitlab-org/gitlab`.
1. Click subscribe.
diff --git a/doc/ci/pipeline_editor/index.md b/doc/ci/pipeline_editor/index.md
index 9f4a1afe2f9..aabdc6cd36b 100644
--- a/doc/ci/pipeline_editor/index.md
+++ b/doc/ci/pipeline_editor/index.md
@@ -8,10 +8,7 @@ type: reference
# Pipeline Editor **(FREE)**
> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/4540) in GitLab 13.8.
-> - It's [deployed behind a feature flag](../../user/feature_flags.md), enabled by default.
-> - It's enabled on GitLab.com.
-> - It's recommended for production use.
-> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-pipeline-editor). **(FREE SELF)**
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/270059) in GitLab 13.10.
WARNING:
This feature might not be available to you. Check the **version history** note above for details.
@@ -30,7 +27,7 @@ From the pipeline editor page you can:
NOTE:
You must already have [a `.gitlab-ci.yml` file](../quick_start/index.md#create-a-gitlab-ciyml-file)
-on the default branch (usually `master`) of your project to use the editor.
+on the default branch of your project to use the editor.
## Validate CI configuration
@@ -68,7 +65,6 @@ reflected in the CI lint. It displays the same results as the existing [CI Lint
WARNING:
This feature might not be available to you. Check the **version history** note above for details.
-It is not accessible if the [pipeline editor is disabled](#enable-or-disable-pipeline-editor).
To view a visualization of your `gitlab-ci.yml` configuration, in your project,
go to **CI/CD > Editor**, and then select the **Visualize** tab. The
@@ -107,7 +103,7 @@ Feature.enable(:ci_config_visualization_tab)
## View expanded configuration
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/246801) in GitLab 13.9.
-> - It is [deployed behind a feature flag](../../user/feature_flags.md), disabled by default.
+> - It is [deployed behind a feature flag](../../user/feature_flags.md), enabled by default.
> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-expanded-configuration). **(FREE SELF)**
To view the fully expanded CI/CD configuration as one combined file, go to the
@@ -122,20 +118,20 @@ where:
### Enable or disable expanded configuration **(FREE SELF)**
Expanded CI/CD configuration is under development and not ready for production use.
-It is deployed behind a feature flag that is **disabled by default**.
+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 enable it.
-To enable it:
+To disable it:
```ruby
-Feature.enable(:ci_config_visualization_tab)
+Feature.disable(:ci_config_merged_tab)
```
-To disable it:
+To enable it:
```ruby
-Feature.disable(:ci_config_visualization_tab)
+Feature.enable(:ci_config_merged_tab)
```
## Commit changes to CI configuration
@@ -150,22 +146,3 @@ If you enter a new branch name, the **Start a new merge request with these chang
checkbox appears. Select it to start a new merge request after you commit the changes.
![The commit form with a new branch](img/pipeline_editor_commit_v13_8.png)
-
-## Enable or disable pipeline editor **(FREE SELF)**
-
-The pipeline editor 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 disable it.
-
-To disable it:
-
-```ruby
-Feature.disable(:ci_pipeline_editor_page)
-```
-
-To enable it:
-
-```ruby
-Feature.enable(:ci_pipeline_editor_page)
-```
diff --git a/doc/ci/pipelines/img/pipelines_settings_test_coverage.png b/doc/ci/pipelines/img/pipelines_settings_test_coverage.png
deleted file mode 100644
index 13ed69be810..00000000000
--- a/doc/ci/pipelines/img/pipelines_settings_test_coverage.png
+++ /dev/null
Binary files differ
diff --git a/doc/ci/pipelines/index.md b/doc/ci/pipelines/index.md
index 6bc0d9bddd9..d5ccb8d020c 100644
--- a/doc/ci/pipelines/index.md
+++ b/doc/ci/pipelines/index.md
@@ -96,7 +96,7 @@ This table lists the refspecs injected for each pipeline type:
The refs `refs/heads/<name>` and `refs/tags/<name>` exist in your
project repository. GitLab generates the special ref `refs/pipelines/<id>` during a
running pipeline job. This ref can be created even after the associated branch or tag has been
-deleted. It's therefore useful in some features such as [automatically stopping an environment](../environments/index.md#automatically-stopping-an-environment),
+deleted. It's therefore useful in some features such as [automatically stopping an environment](../environments/index.md#stopping-an-environment),
and [merge trains](../merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md)
that might run pipelines after branch deletion.
@@ -137,10 +137,10 @@ To execute a pipeline manually:
1. Navigate to your project's **CI/CD > Pipelines**.
1. Select the **Run Pipeline** button.
1. On the **Run Pipeline** page:
- 1. Select the branch to run the pipeline for in the **Create for** field.
+ 1. Select the branch or tag to run the pipeline for in the **Run for branch name or tag** field.
1. Enter any [environment variables](../variables/README.md) required for the pipeline run.
You can set specific variables to have their [values prefilled in the form](#prefill-variables-in-manual-pipelines).
- 1. Click the **Create pipeline** button.
+ 1. Click the **Run pipeline** button.
The pipeline now executes the jobs as configured.
@@ -208,7 +208,7 @@ You can do this straight from the pipeline graph. Just click the play button
to execute that particular job.
For example, your pipeline might start automatically, but it requires manual action to
-[deploy to production](../environments/index.md#configuring-manual-deployments). In the example below, the `production`
+[deploy to production](../environments/index.md#configure-manual-deployments). In the example below, the `production`
stage has a job with a manual action.
![Pipelines example](img/pipelines.png)
diff --git a/doc/ci/pipelines/schedules.md b/doc/ci/pipelines/schedules.md
index a8e310c1f0d..752e2a97fad 100644
--- a/doc/ci/pipelines/schedules.md
+++ b/doc/ci/pipelines/schedules.md
@@ -36,7 +36,7 @@ Otherwise the pipeline is not created.
To schedule a pipeline for project:
-1. Navigate to the project's **CI / CD > Schedules** page.
+1. Navigate to the project's **CI/CD > Schedules** page.
1. Click the **New schedule** button.
1. Fill in the **Schedule a new pipeline** form.
1. Click the **Save pipeline schedule** button.
diff --git a/doc/ci/pipelines/settings.md b/doc/ci/pipelines/settings.md
index 32221b78039..e607bae53bd 100644
--- a/doc/ci/pipelines/settings.md
+++ b/doc/ci/pipelines/settings.md
@@ -6,7 +6,7 @@ disqus_identifier: 'https://docs.gitlab.com/ee/user/project/pipelines/settings.h
type: reference, howto
---
-# Pipeline settings
+# Pipeline settings **(FREE)**
To reach the pipelines settings navigate to your project's
**Settings > CI/CD**.
@@ -17,6 +17,11 @@ The following settings can be configured per project.
For an overview, watch the video [GitLab CI Pipeline, Artifacts, and Environments](https://www.youtube.com/watch?v=PCKDICEe10s).
Watch also [GitLab CI pipeline tutorial for beginners](https://www.youtube.com/watch?v=Jav4vbUrqII).
+You can use the pipeline status to determine if a merge request can be merged:
+
+- [Merge when pipeline succeeds](../../user/project/merge_requests/merge_when_pipeline_succeeds.md).
+- [Only allow merge requests to be merged if the pipeline succeeds](../../user/project/merge_requests/merge_when_pipeline_succeeds.md#only-allow-merge-requests-to-be-merged-if-the-pipeline-succeeds).
+
## Git strategy
With Git strategy, you can choose the default way your repository is fetched
@@ -24,7 +29,7 @@ from GitLab in a job.
There are two options. Using:
-- `git clone`, which is slower since it clones the repository from scratch
+- `git clone`, which is slower because it clones the repository from scratch
for every job, ensuring that the local working copy is always pristine.
- `git fetch`, which is default in GitLab and faster as it re-uses the local working copy (falling
back to clone if it doesn't exist).
@@ -70,20 +75,19 @@ For information about setting a maximum artifact size for a project, see
## Custom CI/CD configuration path
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/12509) in GitLab 9.4.
-> - [Support for external `.gitlab-ci.yml` locations](https://gitlab.com/gitlab-org/gitlab/-/issues/14376) introduced in GitLab 12.6.
+> [Support for external `.gitlab-ci.yml` locations](https://gitlab.com/gitlab-org/gitlab/-/issues/14376) introduced in GitLab 12.6.
By default we look for the `.gitlab-ci.yml` file in the project's root
directory. If needed, you can specify an alternate path and filename, including locations outside the project.
To customize the path:
-1. Go to the project's **Settings > CI / CD**.
+1. Go to the project's **Settings > CI/CD**.
1. Expand the **General pipelines** section.
1. Provide a value in the **CI/CD configuration file** field.
1. Click **Save changes**.
-If the CI configuration is stored within the repository in a non-default
+If the CI configuration is stored in the repository in a non-default
location, the path must be relative to the root directory. Examples of valid
paths and file names include:
@@ -96,7 +100,7 @@ If hosting the CI configuration on an external site, the URL link must end with
- `http://example.com/generate/ci/config.yml`
-If hosting the CI configuration in a different project within GitLab, the path must be relative
+If hosting the CI configuration in a different project in GitLab, the path must be relative
to the root directory in the other project. Include the group and project name at the end:
- `.gitlab-ci.yml@mygroup/another-project`
@@ -114,10 +118,10 @@ able to edit it.
## Test coverage parsing
If you use test coverage in your code, GitLab can capture its output in the
-job log using a regular expression. In the pipelines settings, search for the
-"Test coverage parsing" section.
+job log using a regular expression.
-![Pipelines settings test coverage](img/pipelines_settings_test_coverage.png)
+In your project, go to **Settings > CI/CD** and expand the **General pipelines**
+section. Enter the regular expression in the **Test coverage parsing** field.
Leave blank if you want to disable it or enter a Ruby regular expression. You
can use <https://rubular.com> to test your regex. The regex returns the **last**
@@ -133,19 +137,21 @@ averaged.
<!-- vale gitlab.Spelling = NO -->
-| Coverage Tool | Sample regular expression |
-|------------------------------------------------|---------------------------|
-| Simplecov (Ruby) | `\(\d+.\d+\%\) covered` |
-| pytest-cov (Python) | `^TOTAL.+?(\d+\%)$` |
+| Coverage Tool | Sample regular expression |
+|------------------------------------------------|-----------------------------------------------|
+| Simplecov (Ruby) | `\(\d+.\d+\%\) covered` |
+| pytest-cov (Python) | `^TOTAL.+?(\d+\%)$` |
| Scoverage (Scala) | `Statement coverage[A-Za-z\.*]\s*:\s*([^%]+)` |
-| `phpunit --coverage-text --colors=never` (PHP) | `^\s*Lines:\s*\d+.\d+\%` |
-| gcovr (C/C++) | `^TOTAL.*\s+(\d+\%)$` |
-| `tap --coverage-report=text-summary` (NodeJS) | `^Statements\s*:\s*([^%]+)` |
-| `nyc npm test` (NodeJS) | `All files[^|]*\|[^|]*\s+([\d\.]+)` |
-| excoveralls (Elixir) | `\[TOTAL\]\s+(\d+\.\d+)%` |
-| `mix test --cover` (Elixir) | `\d+.\d+\%\s+\|\s+Total` |
-| JaCoCo (Java/Kotlin) | `Total.*?([0-9]{1,3})%` |
-| `go test -cover` (Go) | `coverage: \d+.\d+% of statements` |
+| `phpunit --coverage-text --colors=never` (PHP) | `^\s*Lines:\s*\d+.\d+\%` |
+| gcovr (C/C++) | `^TOTAL.*\s+(\d+\%)$` |
+| `tap --coverage-report=text-summary` (NodeJS) | `^Statements\s*:\s*([^%]+)` |
+| `nyc npm test` (NodeJS) | `All files[^|]*\|[^|]*\s+([\d\.]+)` |
+| excoveralls (Elixir) | `\[TOTAL\]\s+(\d+\.\d+)%` |
+| `mix test --cover` (Elixir) | `\d+.\d+\%\s+\|\s+Total` |
+| JaCoCo (Java/Kotlin) | `Total.*?([0-9]{1,3})%` |
+| `go test -cover` (Go) | `coverage: \d+.\d+% of statements` |
+| .Net (OpenCover) | `(Visited Points).*\((.*)\)` |
+| .Net (`dotnet test` line coverage) | `Total\s*\|\s*(\d+\.?\d+)` |
<!-- vale gitlab.Spelling = YES -->
@@ -157,11 +163,13 @@ averaged.
To see the evolution of your project code coverage over time,
you can view a graph or download a CSV file with this data. From your project:
-1. Go to **{chart}** **Project Analytics > Repository** to see the historic data for each job listed in the dropdown above the graph.
+1. Go to **Project Analytics > Repository** to see the historic data for each job listed in the dropdown above the graph.
1. If you want a CSV file of that data, click **Download raw data (`.csv`)**
![Code coverage graph of a project over time](img/code_coverage_graph_v13_1.png)
+Code coverage data is also [available at the group level](../../user/group/repositories_analytics/index.md).
+
### Removing color codes
Some test coverage tools output with ANSI color codes that aren't
@@ -215,11 +223,9 @@ If **Public pipelines** is disabled:
## Auto-cancel redundant pipelines
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/9362) in GitLab 9.1.
-
You can set pending or running pipelines to cancel automatically when a new pipeline runs on the same branch. You can enable this in the project settings:
-1. Go to **Settings > CI / CD**.
+1. Go to **Settings > CI/CD**.
1. Expand **General Pipelines**.
1. Check the **Auto-cancel redundant pipelines** checkbox.
1. Click **Save changes**.
@@ -232,14 +238,14 @@ running job can be cancelled before it completes.
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/25276) in GitLab 12.9.
Your project may have multiple concurrent deployment jobs that are
-scheduled to run within the same time frame.
+scheduled to run in the same time frame.
This can lead to a situation where an older deployment job runs after a
newer one, which may not be what you want.
To avoid this scenario:
-1. Go to **Settings > CI / CD**.
+1. Go to **Settings > CI/CD**.
1. Expand **General pipelines**.
1. Check the **Skip outdated deployment jobs** checkbox.
1. Click **Save changes**.
@@ -272,15 +278,15 @@ pages.
### Pipeline status badge
-Depending on the status of your job, a badge can have the following values:
+Depending on the status of your pipeline, a badge can have the following values:
-- pending
-- running
-- passed
-- failed
-- skipped
-- canceled
-- unknown
+- `pending`
+- `running`
+- `passed`
+- `failed`
+- `skipped`
+- `canceled`
+- `unknown`
You can access a pipeline status badge image using the following link:
@@ -321,29 +327,27 @@ into your `README.md`:
Pipeline badges can be rendered in different styles by adding the `style=style_name` parameter to the URL. Two styles are available:
-#### Flat (default)
+- Flat (default):
-```plaintext
-https://gitlab.example.com/<namespace>/<project>/badges/<branch>/coverage.svg?style=flat
-```
+ ```plaintext
+ https://gitlab.example.com/<namespace>/<project>/badges/<branch>/coverage.svg?style=flat
+ ```
-![Badge flat style](https://gitlab.com/gitlab-org/gitlab/badges/master/coverage.svg?job=coverage&style=flat)
+ ![Badge flat style](https://gitlab.com/gitlab-org/gitlab/badges/master/coverage.svg?job=coverage&style=flat)
-#### Flat square
+- Flat square ([Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/30120) in GitLab 11.8):
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/30120) in GitLab 11.8.
+ ```plaintext
+ https://gitlab.example.com/<namespace>/<project>/badges/<branch>/coverage.svg?style=flat-square
+ ```
-```plaintext
-https://gitlab.example.com/<namespace>/<project>/badges/<branch>/coverage.svg?style=flat-square
-```
-
-![Badge flat square style](https://gitlab.com/gitlab-org/gitlab/badges/master/coverage.svg?job=coverage&style=flat-square)
+ ![Badge flat square style](https://gitlab.com/gitlab-org/gitlab/badges/master/coverage.svg?job=coverage&style=flat-square)
### Custom badge text
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/17555) in GitLab 13.1.
-The text for a badge can be customized. This can be useful to differentiate between multiple coverage jobs that run in the same pipeline. Customize the badge text and width by adding the `key_text=custom_text` and `key_width=custom_key_width` parameters to the URL:
+The text for a badge can be customized to differentiate between multiple coverage jobs that run in the same pipeline. Customize the badge text and width by adding the `key_text=custom_text` and `key_width=custom_key_width` parameters to the URL:
```plaintext
https://gitlab.com/gitlab-org/gitlab/badges/master/coverage.svg?job=karma&key_text=Frontend+Coverage&key_width=130
@@ -351,10 +355,6 @@ https://gitlab.com/gitlab-org/gitlab/badges/master/coverage.svg?job=karma&key_te
![Badge with custom text and width](https://gitlab.com/gitlab-org/gitlab/badges/master/coverage.svg?job=karma&key_text=Frontend+Coverage&key_width=130)
-## CI/CD Variables
-
-[CI/CD variables](../variables/README.md) can be set to be available to a runner.
-
<!-- ## Troubleshooting
Include any troubleshooting steps that you can foresee. If you know beforehand what issues
diff --git a/doc/ci/quick_start/index.md b/doc/ci/quick_start/index.md
index 711bf0c0e7a..664523a08e4 100644
--- a/doc/ci/quick_start/index.md
+++ b/doc/ci/quick_start/index.md
@@ -66,7 +66,7 @@ In this file, you define:
- The decisions the runner should make when specific conditions are encountered.
For example, you might want to run a suite of tests when you commit to
-any branch except `master`. When you commit to `master`, you want
+any branch except the default branch. When you commit to the default branch, you want
to run the same suite, but also publish your application.
All of this is defined in the `.gitlab-ci.yml` file.
@@ -117,15 +117,22 @@ The pipeline starts when the commit is committed.
#### `.gitlab-ci.yml` tips
-- If you want the runner to use a Docker image to run the jobs, edit the `.gitlab-ci.yml` file
- to include your image name:
+- If you want the runner to [use a Docker container to run the jobs](../docker/using_docker_images.md),
+ edit the `.gitlab-ci.yml` file
+ to include an image name:
```yaml
default:
image: ruby:2.7.2
```
- This command tells the runner to use a Ruby image from Docker Hub.
+ This command tells the runner to use a Ruby image from Docker Hub
+ and to run the jobs in a container that's generated from the image.
+
+ This process is different than
+ [building an application as a Docker container](../docker/using_docker_build.md).
+ Your application does not need to be built as a Docker container to
+ run CI/CD jobs in Docker containers.
- To validate your `.gitlab-ci.yml` file, use the
[CI Lint tool](../lint.md), which is available in every project.
diff --git a/doc/ci/review_apps/index.md b/doc/ci/review_apps/index.md
index 9de6a1162bd..bd9a60e952c 100644
--- a/doc/ci/review_apps/index.md
+++ b/doc/ci/review_apps/index.md
@@ -12,6 +12,10 @@ type: reference
Review Apps is a collaboration tool that takes the hard work out of providing an environment to showcase product changes.
+NOTE:
+If you have a Kubernetes cluster, you can automate this feature in your applications
+by using [Auto DevOps](../../topics/autodevops/index.md).
+
## Introduction
Review Apps:
@@ -27,8 +31,8 @@ In the above example:
- A Review App is built every time a commit is pushed to `topic branch`.
- The reviewer fails two reviews before passing the third review.
-- After the review has passed, `topic branch` is merged into `master` where it is deployed to staging.
-- After having been approved in staging, the changes that were merged into `master` are deployed in to production.
+- After the review passes, `topic branch` is merged into the default branch, where it's deployed to staging.
+- After its approval in staging, the changes that were merged into the default branch are deployed to production.
## How Review Apps work
@@ -52,7 +56,7 @@ After adding Review Apps to your workflow, you follow the branched Git flow. Tha
## Configuring Review Apps
-Review Apps are built on [dynamic environments](../environments/index.md#configuring-dynamic-environments), which allow you to dynamically create a new environment for each branch.
+Review Apps are built on [dynamic environments](../environments/index.md#create-a-dynamic-environment), which allow you to dynamically create a new environment for each branch.
The process of configuring Review Apps is as follows:
@@ -85,7 +89,7 @@ you can copy and paste into `.gitlab-ci.yml` as a starting point. To do so:
## Review Apps auto-stop
-See how to [configure Review Apps environments to expire and auto-stop](../environments/index.md#environments-auto-stop)
+See how to [configure Review Apps environments to expire and auto-stop](../environments/index.md#stop-an-environment-after-a-certain-time-period)
after a given period of time.
## Review Apps examples
@@ -317,7 +321,3 @@ the user must enter a [personal access token](../../user/profile/personal_access
with `api` scope before submitting feedback.
This same method can be used to require authentication for any public projects.
-
-## Limitations
-
-Review App limitations are the same as [environments limitations](../environments/index.md#limitations).
diff --git a/doc/ci/runners/README.md b/doc/ci/runners/README.md
index bf7552ad609..d09daea9a75 100644
--- a/doc/ci/runners/README.md
+++ b/doc/ci/runners/README.md
@@ -38,7 +38,7 @@ multiple projects.
If you are using a self-managed instance of GitLab:
- Your administrator can install and register shared runners by
- going to your project's **Settings > CI / CD**, expanding the **Runners** section,
+ going to your project's **Settings > CI/CD**, expanding the **Runners** section,
and clicking **Show runner installation instructions**.
These instructions are also available [in the documentation](https://docs.gitlab.com/runner/install/index.html).
- The administrator can also configure a maximum number of shared runner [pipeline minutes for
@@ -220,7 +220,7 @@ Specific runners process jobs by using a first in, first out ([FIFO](https://en.
NOTE:
Specific runners do not get shared with forked projects automatically.
-A fork *does* copy the CI / CD settings of the cloned repository.
+A fork *does* copy the CI/CD settings of the cloned repository.
#### Create a specific runner
diff --git a/doc/ci/ssh_keys/index.md b/doc/ci/ssh_keys/index.md
index 2cdef176a22..72a99efc9bc 100644
--- a/doc/ci/ssh_keys/index.md
+++ b/doc/ci/ssh_keys/index.md
@@ -33,7 +33,7 @@ with any type of [executor](https://docs.gitlab.com/runner/executors/)
1. Run the [`ssh-agent`](https://linux.die.net/man/1/ssh-agent) during job to load
the private key.
1. Copy the public key to the servers you want to have access to (usually in
- `~/.ssh/authorized_keys`) or add it as a [deploy key](../../ssh/README.md#deploy-keys)
+ `~/.ssh/authorized_keys`) or add it as a [deploy key](../../user/project/deploy_keys/index.md)
if you are accessing a private GitLab repository.
The private key is displayed in the job log, unless you enable
@@ -101,7 +101,7 @@ to access it. This is where an SSH key pair comes in handy.
1. As a final step, add the _public_ key from the one you created in the first
step to the services that you want to have an access to from within the build
environment. If you are accessing a private GitLab repository you need to add
- it as a [deploy key](../../ssh/README.md#deploy-keys).
+ it as a [deploy key](../../user/project/deploy_keys/index.md).
That's it! You can now have access to private servers or repositories in your
build environment.
@@ -130,7 +130,7 @@ on, and use that key for all projects that are run on this machine.
1. As a final step, add the _public_ key from the one you created earlier to the
services that you want to have an access to from within the build environment.
If you are accessing a private GitLab repository you need to add it as a
- [deploy key](../../ssh/README.md#deploy-keys).
+ [deploy key](../../user/project/deploy_keys/index.md).
After generating the key, try to sign in to the remote server to accept the
fingerprint:
diff --git a/doc/ci/test_cases/img/test_case_list_v13_6.png b/doc/ci/test_cases/img/test_case_list_v13_6.png
deleted file mode 100644
index b5d89582558..00000000000
--- a/doc/ci/test_cases/img/test_case_list_v13_6.png
+++ /dev/null
Binary files differ
diff --git a/doc/ci/test_cases/img/test_case_show_v13_10.png b/doc/ci/test_cases/img/test_case_show_v13_10.png
new file mode 100644
index 00000000000..81e87dfcff8
--- /dev/null
+++ b/doc/ci/test_cases/img/test_case_show_v13_10.png
Binary files differ
diff --git a/doc/ci/test_cases/img/test_case_show_v13_6.png b/doc/ci/test_cases/img/test_case_show_v13_6.png
deleted file mode 100644
index bbd7601cf30..00000000000
--- a/doc/ci/test_cases/img/test_case_show_v13_6.png
+++ /dev/null
Binary files differ
diff --git a/doc/ci/test_cases/index.md b/doc/ci/test_cases/index.md
index 6385b1638ff..4bd38f4043a 100644
--- a/doc/ci/test_cases/index.md
+++ b/doc/ci/test_cases/index.md
@@ -13,7 +13,7 @@ type: reference
Test cases in GitLab can help your teams create testing scenarios in their existing development platform.
-This can help the Implementation and Testing teams collaborate, because they no longer have to
+Now your Implementation and Testing teams can collaborate better, as they no longer have to
use external test planning tools, which require additional overhead, context switching, and expense.
## Create a test case
@@ -22,7 +22,7 @@ Users with Reporter or higher [permissions](../../user/permissions.md) can creat
To create a test case in a GitLab project:
-1. Navigate to **CI/CD > Test Cases**.
+1. Go to **CI/CD > Test Cases**.
1. Select the **New test case** button. You are taken to the new test case form. Here you can enter
the new case's title, [description](../../user/markdown.md), attach a file, and assign [labels](../../user/project/labels.md).
1. Select the **Submit test case** button. You are taken to view the new test case.
@@ -34,14 +34,12 @@ issue list with a search query, including labels or the test case's title.
Users with Guest or higher [permissions](../../user/permissions.md) can view test cases.
-![Test case list page](img/test_case_list_v13_6.png)
-
To view a test case:
-1. In a project, navigate to **CI/CD > Test Cases**.
+1. In a project, go to **CI/CD > Test Cases**.
1. Select the title of the test case you want to view. You are taken to the test case page.
-![An example test case page](img/test_case_show_v13_6.png)
+![An example test case page](img/test_case_show_v13_10.png)
## Edit a test case
@@ -68,7 +66,7 @@ To archive a test case, on the test case's page, select the **Archive test case*
To view archived test cases:
-1. Navigate to **CI/CD > Test Cases**.
+1. Go to **CI/CD > Test Cases**.
1. Select **Archived**.
## Reopen an archived test case
diff --git a/doc/ci/triggers/README.md b/doc/ci/triggers/README.md
index b4cea48a362..fa97cbdfcec 100644
--- a/doc/ci/triggers/README.md
+++ b/doc/ci/triggers/README.md
@@ -188,10 +188,10 @@ source repository. Be sure to URL-encode `ref` if it contains slashes.
### Using webhook payload in the triggered pipeline
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/31197) in GitLab 13.9.
-> - It's [deployed behind a feature flag](../../user/feature_flags.md), disabled by default.
-> - It's disabled on GitLab.com.
-> - It's not recommended for production use.
-> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-the-trigger_payload-variable). **(FREE SELF)**
+> - It's [deployed behind a feature flag](../../user/feature_flags.md), enabled by default.
+> - It's enabled on GitLab.com.
+> - It's recommended for production use.
+> - For GitLab self-managed instances, GitLab administrators can opt to [disable it](#enable-or-disable-the-trigger_payload-variable). **(FREE SELF)**
WARNING:
This feature might not be available to you. Check the **version history** note above for details.
@@ -203,21 +203,21 @@ so you can access the data with `cat $TRIGGER_PAYLOAD` or a similar command.
#### Enable or disable the `TRIGGER_PAYLOAD` variable
-The `TRIGGER_PAYLOAD` CI/CD variable is under development and not ready for production use. It is
-deployed behind a feature flag that is **disabled by default**.
+The `TRIGGER_PAYLOAD` CI/CD variable 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 enable it.
+can opt to disable it.
-To enable it:
+To disable it:
```ruby
-Feature.enable(:ci_trigger_payload_into_pipeline)
+Feature.disable(:ci_trigger_payload_into_pipeline)
```
-To disable it:
+To enable it:
```ruby
-Feature.disable(:ci_trigger_payload_into_pipeline)
+Feature.enable(:ci_trigger_payload_into_pipeline)
```
## Making use of trigger variables
diff --git a/doc/ci/troubleshooting.md b/doc/ci/troubleshooting.md
index cddcf76236a..d4b9282ac38 100644
--- a/doc/ci/troubleshooting.md
+++ b/doc/ci/troubleshooting.md
@@ -119,7 +119,7 @@ associated with it. Usually one pipeline is a merge request pipeline, and the ot
is a branch pipeline.
This is usually caused by the `rules` configuration, and there are several ways to
-[prevent duplicate pipelines](yaml/README.md#prevent-duplicate-pipelines).
+[prevent duplicate pipelines](yaml/README.md#avoid-duplicate-pipelines).
#### A job is not in the pipeline
@@ -141,7 +141,7 @@ be checked to make sure the jobs are added to the correct pipeline type. For
example, if a merge request pipeline did not run, the jobs may have been added to
a branch pipeline instead.
-It's also possible that your [`workflow: rules`](yaml/README.md#workflowrules) configuration
+It's also possible that your [`workflow: rules`](yaml/README.md#workflow) configuration
blocked the pipeline, or allowed the wrong pipeline type.
### A job runs unexpectedly
@@ -164,7 +164,7 @@ a branch to its remote repository. To illustrate the problem, suppose you've had
1. A user creates a feature branch named `example` and pushes it to a remote repository.
1. A new pipeline starts running on the `example` branch.
-1. A user rebases the `example` branch on the latest `master` branch and force-pushes it to its remote repository.
+1. A user rebases the `example` branch on the latest default branch and force-pushes it to its remote repository.
1. A new pipeline starts running on the `example` branch again, however,
the previous pipeline (2) fails because of `fatal: reference is not a tree:` error.
@@ -258,8 +258,8 @@ When you use [`rules`](yaml/README.md#rules) with a `when:` clause without an `i
clause, multiple pipelines may run. Usually this occurs when you push a commit to
a branch that has an open merge request associated with it.
-To [prevent duplicate pipelines](yaml/README.md#prevent-duplicate-pipelines), use
-[`workflow: rules`](yaml/README.md#workflowrules) or rewrite your rules to control
+To [prevent duplicate pipelines](yaml/README.md#avoid-duplicate-pipelines), use
+[`workflow: rules`](yaml/README.md#workflow) or rewrite your rules to control
which pipelines can run.
### Console workaround if job using resource_group gets stuck
diff --git a/doc/ci/unit_test_reports.md b/doc/ci/unit_test_reports.md
index ee060f33d01..e20d2a90192 100644
--- a/doc/ci/unit_test_reports.md
+++ b/doc/ci/unit_test_reports.md
@@ -28,7 +28,7 @@ in the pipeline detail view.
Consider the following workflow:
-1. Your `master` branch is rock solid, your project is using GitLab CI/CD and
+1. Your default branch is rock solid, your project is using GitLab CI/CD and
your pipelines indicate that there isn't anything broken.
1. Someone from your team submits a merge request, a test fails and the pipeline
gets the known red icon. To investigate more, you have to go through the job
@@ -44,7 +44,7 @@ First, GitLab Runner uploads all [JUnit report format XML files](https://www.ibm
as [artifacts](pipelines/job_artifacts.md#artifactsreportsjunit) to GitLab. Then, when you visit a merge request, GitLab starts
comparing the head and base branch's JUnit report format XML files, where:
-- The base branch is the target branch (usually `master`).
+- The base branch is the target branch (usually the default branch).
- The head branch is the source branch (the latest pipeline in each merge request).
The reports panel has a summary showing how many tests failed, how many had errors
@@ -197,7 +197,7 @@ There are a few tools that can produce JUnit report format XML files in C/C++.
#### GoogleTest
In the following example, `gtest` is used to generate the test reports.
-If there are multiple gtest executables created for different architectures (`x86`, `x64` or `arm`),
+If there are multiple `gtest` executables created for different architectures (`x86`, `x64` or `arm`),
you will be required to run each test providing a unique filename. The results
will then be aggregated together.
diff --git a/doc/ci/variables/README.md b/doc/ci/variables/README.md
index b6228e26175..5da501d4d8b 100644
--- a/doc/ci/variables/README.md
+++ b/doc/ci/variables/README.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: reference
---
-# GitLab CI/CD variables
+# GitLab CI/CD variables **(FREE)**
CI/CD variables are part of the environment in which [pipelines](../pipelines/index.md)
and jobs run. For example, you could:
@@ -161,7 +161,7 @@ You can use tools like [the AWS CLI](https://docs.aws.amazon.com/cli/latest/user
and [`kubectl`](https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/#the-kubeconfig-environment-variable)
to customize your configuration by using **File** type variables.
-Previously, a common pattern was to read the value of a CI variable, save it in a file, and then
+Previously, a common pattern was to read the value of a CI/CD variable, save it in a file, and then
use that file in your script:
```shell
diff --git a/doc/ci/variables/predefined_variables.md b/doc/ci/variables/predefined_variables.md
index 8d2df82a212..9d598c43ef0 100644
--- a/doc/ci/variables/predefined_variables.md
+++ b/doc/ci/variables/predefined_variables.md
@@ -7,142 +7,160 @@ type: reference
# Predefined variables reference
-For an introduction on this subject, read through the
-[CI/CD variables](README.md) document.
+Predefined [CI/CD variables](README.md) are available in every GitLab CI/CD pipeline.
-Some of the predefined variables are available only if a minimum
-version of [GitLab Runner](https://docs.gitlab.com/runner/) is used. Consult the table below to find the
-version of GitLab Runner that's required.
+Some variables are only available with more recent versions of [GitLab Runner](https://docs.gitlab.com/runner/).
-You can add a command to your `.gitlab-ci.yml` file to
-[output the values of all variables available for a job](README.md#list-all-environment-variables).
+You can [output the values of all variables available for a job](README.md#list-all-environment-variables)
+with a `script` command.
-Kubernetes-specific variables are detailed in the
-[Kubernetes deployment variables](../../user/project/clusters/index.md#deployment-variables) section.
+There are also [Kubernetes-specific deployment variables](../../user/project/clusters/index.md#deployment-variables).
+
+| Variable | GitLab | Runner | Description |
+|------------------------------------------|--------|--------|-------------|
+| `CHAT_CHANNEL` | 10.6 | all | The Source chat channel that triggered the [ChatOps](../chatops/index.md) command. |
+| `CHAT_INPUT` | 10.6 | all | The additional arguments passed with the [ChatOps](../chatops/index.md) command. |
+| `CI` | all | 0.4 | Available for all jobs executed in CI/CD. `true` when available. |
+| `CI_API_V4_URL` | 11.7 | all | The GitLab API v4 root URL. |
+| `CI_BUILDS_DIR` | all | 11.10 | The top-level directory where builds are executed. |
+| `CI_COMMIT_BEFORE_SHA` | 11.2 | all | The previous latest commit present on a branch. Is always `0000000000000000000000000000000000000000` in pipelines for merge requests. |
+| `CI_COMMIT_BRANCH` | 12.6 | 0.5 | The commit branch name. Available in branch pipelines, including pipelines for the default branch. Not available in merge request pipelines or tag pipelines. |
+| `CI_COMMIT_DESCRIPTION` | 10.8 | all | The description of the commit. If the title is shorter than 100 characters, the message without the first line. |
+| `CI_COMMIT_MESSAGE` | 10.8 | all | The full commit message. |
+| `CI_COMMIT_REF_NAME` | 9.0 | all | The branch or tag name for which project is built. |
+| `CI_COMMIT_REF_PROTECTED` | 11.11 | all | `true` if the job is running for a protected reference. |
+| `CI_COMMIT_REF_SLUG` | 9.0 | all | `CI_COMMIT_REF_NAME` in lowercase, shortened to 63 bytes, and with everything except `0-9` and `a-z` replaced with `-`. No leading / trailing `-`. Use in URLs, host names and domain names. |
+| `CI_COMMIT_SHA` | 9.0 | all | The commit revision the project is built for. |
+| `CI_COMMIT_SHORT_SHA` | 11.7 | all | The first eight characters of `CI_COMMIT_SHA`. |
+| `CI_COMMIT_TAG` | 9.0 | 0.5 | The commit tag name. Available only in pipelines for tags. |
+| `CI_COMMIT_TIMESTAMP` | 13.4 | all | The timestamp of the commit in the ISO 8601 format. |
+| `CI_COMMIT_TITLE` | 10.8 | all | The title of the commit. The full first line of the message. |
+| `CI_CONCURRENT_ID` | all | 11.10 | The unique ID of build execution in a single executor. |
+| `CI_CONCURRENT_PROJECT_ID` | all | 11.10 | The unique ID of build execution in a single executor and project. |
+| `CI_CONFIG_PATH` | 9.4 | 0.5 | The path to the CI/CD configuration file. Defaults to `.gitlab-ci.yml`. |
+| `CI_DEBUG_TRACE` | all | 1.7 | `true` if [debug logging (tracing)](README.md#debug-logging) is enabled. |
+| `CI_DEFAULT_BRANCH` | 12.4 | all | The name of the project's default branch. |
+| `CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX` | 13.7 | all | The image prefix for pulling images through the Dependency Proxy. |
+| `CI_DEPENDENCY_PROXY_PASSWORD` | 13.7 | all | The password to pull images through the Dependency Proxy. |
+| `CI_DEPENDENCY_PROXY_SERVER` | 13.7 | all | The server for logging in to the Dependency Proxy. This is equivalent to `$CI_SERVER_HOST:$CI_SERVER_PORT`. |
+| `CI_DEPENDENCY_PROXY_USER` | 13.7 | all | The username to pull images through the Dependency Proxy. |
+| `CI_DEPLOY_FREEZE` | 13.2 | all | Only available if the pipeline runs during a [deploy freeze window](../../user/project/releases/index.md#prevent-unintentional-releases-by-setting-a-deploy-freeze). `true` when available. |
+| `CI_DEPLOY_PASSWORD` | 10.8 | all | The authentication password of the [GitLab Deploy Token](../../user/project/deploy_tokens/index.md#gitlab-deploy-token), if the project has one. |
+| `CI_DEPLOY_USER` | 10.8 | all | The authentication username of the [GitLab Deploy Token](../../user/project/deploy_tokens/index.md#gitlab-deploy-token), if the project has one. |
+| `CI_DISPOSABLE_ENVIRONMENT` | all | 10.1 | Only available if the job is executed in a disposable environment (something that is created only for this job and disposed of/destroyed after the execution - all executors except `shell` and `ssh`). `true` when available. |
+| `CI_ENVIRONMENT_NAME` | 8.15 | all | The name of the environment for this job. Available if [`environment:name`](../yaml/README.md#environmentname) is set. |
+| `CI_ENVIRONMENT_SLUG` | 8.15 | all | The simplified version of the environment name, suitable for inclusion in DNS, URLs, Kubernetes labels, and so on. Available if [`environment:name`](../yaml/README.md#environmentname) is set. |
+| `CI_ENVIRONMENT_URL` | 9.3 | all | The URL of the environment for this job. Available if [`environment:url`](../yaml/README.md#environmenturl) is set. |
+| `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. |
+| `CI_JOB_JWT` | 12.10 | all | A RS256 JSON web token to authenticate with third party systems that support JWT authentication, for example [HashiCorp's Vault](../secrets/index.md). |
+| `CI_JOB_MANUAL` | 8.12 | all | `true` if a job was started manually. |
+| `CI_JOB_NAME` | 9.0 | 0.5 | The name of the job. |
+| `CI_JOB_STAGE` | 9.0 | 0.5 | The name of the job's stage. |
+| `CI_JOB_STATUS` | all | 13.5 | The status of the job as each runner stage is executed. Use with [`after_script`](../yaml/README.md#after_script). Can be `success`, `failed`, or `canceled`. |
+| `CI_JOB_TOKEN` | 9.0 | 1.2 | A token to authenticate with [certain API endpoints](../../api/README.md#gitlab-ci-job-token) or download [dependent repositories](../../user/project/new_ci_build_permissions_model.md#dependent-repositories). The token is valid as long as the job is running. |
+| `CI_JOB_URL` | 11.1 | 0.5 | The job details URL. |
+| `CI_JOB_STARTED_AT` | 13.10 | all | The UTC datetime when a job started, in [ISO 8601](https://tools.ietf.org/html/rfc3339#appendix-A) format. |
+| `CI_KUBERNETES_ACTIVE` | 13.0 | all | Only available if the pipeline has a Kubernetes cluster available for deployments. `true` when available. |
+| `CI_NODE_INDEX` | 11.5 | all | The index of the job in the job set. Only available if the job uses [`parallel`](../yaml/README.md#parallel). |
+| `CI_NODE_TOTAL` | 11.5 | all | The total number of instances of this job running in parallel. Set to `1` if the job does not use [`parallel`](../yaml/README.md#parallel). |
+| `CI_OPEN_MERGE_REQUESTS` | 13.8 | all | A comma-separated list of up to four merge requests that use the current branch and project as the merge request source. Only available in branch and merge request pipelines if the branch has an associated merge request. For example, `gitlab-org/gitlab!333,gitlab-org/gitlab-foss!11`. |
+| `CI_PAGES_DOMAIN` | 11.8 | all | The configured domain that hosts GitLab Pages. |
+| `CI_PAGES_URL` | 11.8 | all | The URL for a GitLab Pages site. Always a subdomain of `CI_PAGES_DOMAIN`. |
+| `CI_PIPELINE_ID` | 8.10 | all | The instance-level ID of the current pipeline. This ID is unique across all projects on the GitLab instance. |
+| `CI_PIPELINE_IID` | 11.0 | all | The project-level IID (internal ID) of the current pipeline. This ID is unique only within the current project. |
+| `CI_PIPELINE_SOURCE` | 10.0 | all | How the pipeline was triggered. Can be `push`, `web`, `schedule`, `api`, `external`, `chat`, `webide`, `merge_request_event`, `external_pull_request_event`, `parent_pipeline`, [`trigger`, or `pipeline`](../triggers/README.md#authentication-tokens). |
+| `CI_PIPELINE_TRIGGERED` | all | all | `true` if the job was [triggered](../triggers/README.md). |
+| `CI_PIPELINE_URL` | 11.1 | 0.5 | The URL for the pipeline details. |
+| `CI_PIPELINE_CREATED_AT` | 13.10 | all | The UTC datetime when the pipeline was created, in [ISO 8601](https://tools.ietf.org/html/rfc3339#appendix-A) format. |
+| `CI_PROJECT_CONFIG_PATH` | 13.8 | all | (Deprecated) The CI configuration path for the project. [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/321334) in GitLab 13.10. [Removal planned](https://gitlab.com/gitlab-org/gitlab/-/issues/322807) for GitLab 14.0. |
+| `CI_PROJECT_DIR` | all | all | The full path the repository is cloned to, and where the job runs from. If the GitLab Runner `builds_dir` parameter is set, this variable is set relative to the value of `builds_dir`. For more information, see the [Advanced GitLab Runner configuration](https://docs.gitlab.com/runner/configuration/advanced-configuration.html#the-runners-section). |
+| `CI_PROJECT_ID` | all | all | The ID of the current project. This ID is unique across all projects on the GitLab instance. |
+| `CI_PROJECT_NAME` | 8.10 | 0.5 | The name of the directory for the project. For example if the project URL is `gitlab.example.com/group-name/project-1`, `CI_PROJECT_NAME` is `project-1`. |
+| `CI_PROJECT_NAMESPACE` | 8.10 | 0.5 | The project namespace (username or group name) of the job. |
+| `CI_PROJECT_PATH_SLUG` | 9.3 | all | `$CI_PROJECT_PATH` in lowercase with characters that are not `a-z` or `0-9` replaced with `-`. Use in URLs and domain names. |
+| `CI_PROJECT_PATH` | 8.10 | 0.5 | The project namespace with the project name included. |
+| `CI_PROJECT_REPOSITORY_LANGUAGES` | 12.3 | all | A comma-separated, lowercase list of the languages used in the repository. For example `ruby,javascript,html,css`. |
+| `CI_PROJECT_ROOT_NAMESPACE` | 13.2 | 0.5 | The root project namespace (username or group name) of the job. For example, if `CI_PROJECT_NAMESPACE` is `root-group/child-group/grandchild-group`, `CI_PROJECT_ROOT_NAMESPACE` is `root-group`. |
+| `CI_PROJECT_TITLE` | 12.4 | all | The human-readable project name as displayed in the GitLab web interface. |
+| `CI_PROJECT_URL` | 8.10 | 0.5 | The HTTP(S) address of the project. |
+| `CI_PROJECT_VISIBILITY` | 10.3 | all | The project visibility. Can be `internal`, `private`, or `public`. |
+| `CI_REGISTRY_IMAGE` | 8.10 | 0.5 | The address of the project's Container Registry. Only available if the Container Registry is enabled for the project. |
+| `CI_REGISTRY_PASSWORD` | 9.0 | all | The password to push containers to the project's GitLab Container Registry. Only available if the Container Registry is enabled for the project. |
+| `CI_REGISTRY_USER` | 9.0 | all | The username to push containers to the project's GitLab Container Registry. Only available if the Container Registry is enabled for the project. |
+| `CI_REGISTRY` | 8.10 | 0.5 | The address of the GitLab Container Registry. Only available if the Container Registry is enabled for the project. This variable includes a `:port` value if one is specified in the registry configuration. |
+| `CI_REPOSITORY_URL` | 9.0 | all | The URL to clone the Git repository. |
+| `CI_RUNNER_DESCRIPTION` | 8.10 | 0.5 | The description of the runner. |
+| `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_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`. |
+| `CI_SERVER_NAME` | all | all | The name of CI/CD server that coordinates jobs. |
+| `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_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`. |
+| `CI_SERVER_VERSION_PATCH` | 11.4 | all | The patch version of the GitLab instance. For example, if the GitLab version is `13.6.1`, the `CI_SERVER_VERSION_PATCH` is `1`. |
+| `CI_SERVER_VERSION` | all | all | The full version of the GitLab instance. |
+| `CI_SERVER` | all | all | Available for all jobs executed in CI/CD. `yes` when available. |
+| `CI_SHARED_ENVIRONMENT` | all | 10.1 | Only available if the job is executed in a shared environment (something that is persisted across CI/CD invocations, like the `shell` or `ssh` executor). `true` when available. |
+| `GITLAB_CI` | all | all | Available for all jobs executed in CI/CD. `true` when available. |
+| `GITLAB_FEATURES` | 10.6 | all | The comma-separated list of licensed features available for the GitLab instance and license. |
+| `GITLAB_USER_EMAIL` | 8.12 | all | The email of the user who started the job. |
+| `GITLAB_USER_ID` | 8.12 | all | The ID of the user who started the job. |
+| `GITLAB_USER_LOGIN` | 10.0 | all | The username of the user who started the job. |
+| `GITLAB_USER_NAME` | 10.0 | all | The name of the user who started the job. |
+| `TRIGGER_PAYLOAD` | 13.9 | all | The webhook payload. Only available when a pipeline is [triggered with a webhook](../triggers/README.md#using-webhook-payload-in-the-triggered-pipeline). |
+
+## Predefined variables for merge request pipelines
+
+These variables are available when:
+
+- The pipelines [are merge request pipelines](../merge_request_pipelines/index.md).
+- The merge request is open.
+
+| Variable | GitLab | Runner | Description |
+|----------------------------------------|--------|--------|-------------|
+| `CI_MERGE_REQUEST_ASSIGNEES` | 11.9 | all | Comma-separated list of usernames of assignees for the merge request. |
+| `CI_MERGE_REQUEST_ID` | 11.6 | all | The instance-level ID of the merge request. This is a unique ID across all projects on GitLab. |
+| `CI_MERGE_REQUEST_IID` | 11.6 | all | The project-level IID (internal ID) of the merge request. This ID is unique for the current project. |
+| `CI_MERGE_REQUEST_LABELS` | 11.9 | all | Comma-separated label names of the merge request. |
+| `CI_MERGE_REQUEST_MILESTONE` | 11.9 | all | The milestone title of the merge request. |
+| `CI_MERGE_REQUEST_PROJECT_ID` | 11.6 | all | The ID of the project of the merge request. |
+| `CI_MERGE_REQUEST_PROJECT_PATH` | 11.6 | all | The path of the project of the merge request. For example `namespace/awesome-project`. |
+| `CI_MERGE_REQUEST_PROJECT_URL` | 11.6 | all | The URL of the project of the merge request. For example, `http://192.168.10.15:3000/namespace/awesome-project`. |
+| `CI_MERGE_REQUEST_REF_PATH` | 11.6 | all | The ref path of the merge request. For example, `refs/merge-requests/1/head`. |
+| `CI_MERGE_REQUEST_SOURCE_BRANCH_NAME` | 11.6 | all | The source branch name of the merge request. |
+| `CI_MERGE_REQUEST_SOURCE_BRANCH_SHA` | 11.9 | all | The HEAD SHA of the source branch of the merge request. The variable is empty in merge request pipelines. The SHA is present only in [merged results pipelines](../merge_request_pipelines/pipelines_for_merged_results/index.md). **(PREMIUM)** |
+| `CI_MERGE_REQUEST_SOURCE_PROJECT_ID` | 11.6 | all | The ID of the source project of the merge request. |
+| `CI_MERGE_REQUEST_SOURCE_PROJECT_PATH` | 11.6 | all | The path of the source project of the merge request. |
+| `CI_MERGE_REQUEST_SOURCE_PROJECT_URL` | 11.6 | all | The URL of the source project of the merge request. |
+| `CI_MERGE_REQUEST_TARGET_BRANCH_NAME` | 11.6 | all | The target branch name of the merge request. |
+| `CI_MERGE_REQUEST_TARGET_BRANCH_SHA` | 11.9 | all | The HEAD SHA of the target branch of the merge request. The variable is empty in merge request pipelines. The SHA is present only in [merged results pipelines](../merge_request_pipelines/pipelines_for_merged_results/index.md). **(PREMIUM)** |
+| `CI_MERGE_REQUEST_TITLE` | 11.9 | all | The title of the merge request. |
+| `CI_MERGE_REQUEST_EVENT_TYPE` | 12.3 | all | The event type of the merge request. Can be `detached`, `merged_result` or `merge_train`. |
+| `CI_MERGE_REQUEST_DIFF_ID` | 13.7 | all | The version of the merge request diff. |
+| `CI_MERGE_REQUEST_DIFF_BASE_SHA` | 13.7 | all | The base SHA of the merge request diff. |
+
+## Predefined variables for external pull request pipelines
+
+These variables are only available when:
+
+- The pipelines are [external pull requests pipelines](../ci_cd_for_external_repos/index.md#pipelines-for-external-pull-requests)
+- The pull request is open.
| Variable | GitLab | Runner | Description |
|-----------------------------------------------|--------|--------|-------------|
-| `CHAT_CHANNEL` | 10.6 | all | Source chat channel which triggered the [ChatOps](../chatops/index.md) command. |
-| `CHAT_INPUT` | 10.6 | all | Additional arguments passed in the [ChatOps](../chatops/index.md) command. |
-| `CI` | all | 0.4 | Mark that job is executed in CI environment. |
-| `CI_API_V4_URL` | 11.7 | all | The GitLab API v4 root URL. |
-| `CI_BUILDS_DIR` | all | 11.10 | Top-level directory where builds are executed. |
-| `CI_COMMIT_BEFORE_SHA` | 11.2 | all | The previous latest commit present on a branch. Is always `0000000000000000000000000000000000000000` in pipelines for merge requests. |
-| `CI_COMMIT_DESCRIPTION` | 10.8 | all | The description of the commit: the message without first line, if the title is shorter than 100 characters; full message in other case. |
-| `CI_COMMIT_MESSAGE` | 10.8 | all | The full commit message. |
-| `CI_COMMIT_REF_NAME` | 9.0 | all | The branch or tag name for which project is built. |
-| `CI_COMMIT_REF_PROTECTED` | 11.11 | all | `true` if the job is running on a protected reference, `false` if not. |
-| `CI_COMMIT_REF_SLUG` | 9.0 | all | `$CI_COMMIT_REF_NAME` in lowercase, shortened to 63 bytes, and with everything except `0-9` and `a-z` replaced with `-`. No leading / trailing `-`. Use in URLs, host names and domain names. |
-| `CI_COMMIT_SHA` | 9.0 | all | The commit revision for which project is built. |
-| `CI_COMMIT_SHORT_SHA` | 11.7 | all | The first eight characters of `CI_COMMIT_SHA`. |
-| `CI_COMMIT_BRANCH` | 12.6 | 0.5 | The commit branch name. Present in branch pipelines, including pipelines for the default branch. Not present in merge request pipelines or tag pipelines. |
-| `CI_COMMIT_TAG` | 9.0 | 0.5 | The commit tag name. Present only when building tags. |
-| `CI_COMMIT_TITLE` | 10.8 | all | The title of the commit - the full first line of the message. |
-| `CI_COMMIT_TIMESTAMP` | 13.4 | all | The timestamp of the commit in the ISO 8601 format. |
-| `CI_CONCURRENT_ID` | all | 11.10 | Unique ID of build execution in a single executor. |
-| `CI_CONCURRENT_PROJECT_ID` | all | 11.10 | Unique ID of build execution in a single executor and project. |
-| `CI_CONFIG_PATH` | 9.4 | 0.5 | The path to CI configuration file. Defaults to `.gitlab-ci.yml`. |
-| `CI_DEBUG_TRACE` | all | 1.7 | Whether [debug logging (tracing)](README.md#debug-logging) is enabled. |
-| `CI_DEFAULT_BRANCH` | 12.4 | all | The name of the default branch for the project. |
-| `CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX` | 13.7 | all | The image prefix for pulling images through the Dependency Proxy. |
-| `CI_DEPENDENCY_PROXY_SERVER` | 13.7 | all | The server for logging in to the Dependency Proxy. This is equivalent to `$CI_SERVER_HOST:$CI_SERVER_PORT`. |
-| `CI_DEPENDENCY_PROXY_PASSWORD` | 13.7 | all | The password to use to pull images through the Dependency Proxy. |
-| `CI_DEPENDENCY_PROXY_USER` | 13.7 | all | The username to use to pull images through the Dependency Proxy. |
-| `CI_DEPLOY_FREEZE` | 13.2 | all | Included with the value `true` if the pipeline runs during a [deploy freeze window](../../user/project/releases/index.md#prevent-unintentional-releases-by-setting-a-deploy-freeze). |
-| `CI_DEPLOY_PASSWORD` | 10.8 | all | Authentication password of the [GitLab Deploy Token](../../user/project/deploy_tokens/index.md#gitlab-deploy-token), only present if the Project has one related. |
-| `CI_DEPLOY_USER` | 10.8 | all | Authentication username of the [GitLab Deploy Token](../../user/project/deploy_tokens/index.md#gitlab-deploy-token), only present if the Project has one related. |
-| `CI_DISPOSABLE_ENVIRONMENT` | all | 10.1 | Marks that the job is executed in a disposable environment (something that is created only for this job and disposed of/destroyed after the execution - all executors except `shell` and `ssh`). If the environment is disposable, it is set to true, otherwise it is not defined at all. |
-| `CI_ENVIRONMENT_NAME` | 8.15 | all | The name of the environment for this job. Only present if [`environment:name`](../yaml/README.md#environmentname) is set. |
-| `CI_ENVIRONMENT_SLUG` | 8.15 | all | A simplified version of the environment name, suitable for inclusion in DNS, URLs, Kubernetes labels, and so on. Only present if [`environment:name`](../yaml/README.md#environmentname) is set. |
-| `CI_ENVIRONMENT_URL` | 9.3 | all | The URL of the environment for this job. Only present if [`environment:url`](../yaml/README.md#environmenturl) is set. |
-| `CI_EXTERNAL_PULL_REQUEST_IID` | 12.3 | all | Pull Request ID from GitHub if the [pipelines are for external pull requests](../ci_cd_for_external_repos/index.md#pipelines-for-external-pull-requests). Available only if `only: [external_pull_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the pull request is open. |
-| `CI_EXTERNAL_PULL_REQUEST_SOURCE_REPOSITORY` | 13.3 | all | The source repository name of the pull request if [the pipelines are for external pull requests](../ci_cd_for_external_repos/index.md#pipelines-for-external-pull-requests). Available only if `only: [external_pull_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the pull request is open. |
-| `CI_EXTERNAL_PULL_REQUEST_TARGET_REPOSITORY` | 13.3 | all | The target repository name of the pull request if [the pipelines are for external pull requests](../ci_cd_for_external_repos/index.md#pipelines-for-external-pull-requests). Available only if `only: [external_pull_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the pull request is open. |
-| `CI_EXTERNAL_PULL_REQUEST_SOURCE_BRANCH_NAME` | 12.3 | all | The source branch name of the pull request if [the pipelines are for external pull requests](../ci_cd_for_external_repos/index.md#pipelines-for-external-pull-requests). Available only if `only: [external_pull_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the pull request is open. |
-| `CI_EXTERNAL_PULL_REQUEST_SOURCE_BRANCH_SHA` | 12.3 | all | The HEAD SHA of the source branch of the pull request if [the pipelines are for external pull requests](../ci_cd_for_external_repos/index.md#pipelines-for-external-pull-requests). Available only if `only: [external_pull_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the pull request is open. |
-| `CI_EXTERNAL_PULL_REQUEST_TARGET_BRANCH_NAME` | 12.3 | all | The target branch name of the pull request if [the pipelines are for external pull requests](../ci_cd_for_external_repos/index.md#pipelines-for-external-pull-requests). Available only if `only: [external_pull_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the pull request is open. |
-| `CI_EXTERNAL_PULL_REQUEST_TARGET_BRANCH_SHA` | 12.3 | all | The HEAD SHA of the target branch of the pull request if [the pipelines are for external pull requests](../ci_cd_for_external_repos/index.md#pipelines-for-external-pull-requests). Available only if `only: [external_pull_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the pull request is open. |
-| `CI_HAS_OPEN_REQUIREMENTS` | 13.1 | all | Included with the value `true` only if the pipeline's project has any open [requirements](../../user/project/requirements/index.md). Not included if there are no open requirements for the pipeline's project. |
-| `CI_OPEN_MERGE_REQUESTS` | 13.8 | all | Available in branch and merge request pipelines. Contains a comma-separated list of up to four merge requests that use the current branch and project as the merge request source. For example `gitlab-org/gitlab!333,gitlab-org/gitlab-foss!11`. |
-| `CI_JOB_ID` | 9.0 | all | The unique ID of the current job that GitLab CI/CD uses internally. |
-| `CI_JOB_IMAGE` | 12.9 | 12.9 | The name of the image running the CI job. |
-| `CI_JOB_MANUAL` | 8.12 | all | The flag to indicate that job was manually started. |
-| `CI_JOB_NAME` | 9.0 | 0.5 | The name of the job as defined in `.gitlab-ci.yml`. |
-| `CI_JOB_STAGE` | 9.0 | 0.5 | The name of the stage as defined in `.gitlab-ci.yml`. |
-| `CI_JOB_STATUS` | all | 13.5 | The state of the job as each runner stage is executed. Use with [`after_script`](../yaml/README.md#after_script) where `CI_JOB_STATUS` can be either: `success`, `failed` or `canceled`. |
-| `CI_JOB_TOKEN` | 9.0 | 1.2 | Token used for authenticating with [a few API endpoints](../../api/README.md#gitlab-ci-job-token) and downloading [dependent repositories](../../user/project/new_ci_build_permissions_model.md#dependent-repositories). The token is valid as long as the job is running. |
-| `CI_JOB_JWT` | 12.10 | all | RS256 JSON web token that can be used for authenticating with third party systems that support JWT authentication, for example [HashiCorp's Vault](../secrets/index.md). |
-| `CI_JOB_URL` | 11.1 | 0.5 | Job details URL. |
-| `CI_KUBERNETES_ACTIVE` | 13.0 | all | Included with the value `true` only if the pipeline has a Kubernetes cluster available for deployments. Not included if no cluster is available. Can be used as an alternative to [`only:kubernetes`/`except:kubernetes`](../yaml/README.md#onlykubernetesexceptkubernetes) with [`rules:if`](../yaml/README.md#rulesif). |
-| `CI_MERGE_REQUEST_ASSIGNEES` | 11.9 | all | Comma-separated list of username(s) of assignee(s) for the merge request if [the pipelines are for merge requests](../merge_request_pipelines/index.md). Available only if `only: [merge_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the merge request is created. |
-| `CI_MERGE_REQUEST_ID` | 11.6 | all | The instance-level ID of the merge request. Only available if [the pipelines are for merge requests](../merge_request_pipelines/index.md) and the merge request is created. This is a unique ID across all projects on GitLab. |
-| `CI_MERGE_REQUEST_IID` | 11.6 | all | The project-level IID (internal ID) of the merge request. Only available If [the pipelines are for merge requests](../merge_request_pipelines/index.md) and the merge request is created. This ID is unique for the current project. |
-| `CI_MERGE_REQUEST_LABELS` | 11.9 | all | Comma-separated label names of the merge request if [the pipelines are for merge requests](../merge_request_pipelines/index.md). Available only if `only: [merge_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the merge request is created. |
-| `CI_MERGE_REQUEST_MILESTONE` | 11.9 | all | The milestone title of the merge request if [the pipelines are for merge requests](../merge_request_pipelines/index.md). Available only if `only: [merge_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the merge request is created. |
-| `CI_MERGE_REQUEST_PROJECT_ID` | 11.6 | all | The ID of the project of the merge request if [the pipelines are for merge requests](../merge_request_pipelines/index.md). Available only if `only: [merge_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the merge request is created. |
-| `CI_MERGE_REQUEST_PROJECT_PATH` | 11.6 | all | The path of the project of the merge request if [the pipelines are for merge requests](../merge_request_pipelines/index.md) (for example `namespace/awesome-project`). Available only if `only: [merge_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the merge request is created. |
-| `CI_MERGE_REQUEST_PROJECT_URL` | 11.6 | all | The URL of the project of the merge request if [the pipelines are for merge requests](../merge_request_pipelines/index.md) (for example `http://192.168.10.15:3000/namespace/awesome-project`). Available only if `only: [merge_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the merge request is created. |
-| `CI_MERGE_REQUEST_REF_PATH` | 11.6 | all | The ref path of the merge request if [the pipelines are for merge requests](../merge_request_pipelines/index.md). (for example `refs/merge-requests/1/head`). Available only if `only: [merge_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the merge request is created. |
-| `CI_MERGE_REQUEST_SOURCE_BRANCH_NAME` | 11.6 | all | The source branch name of the merge request if [the pipelines are for merge requests](../merge_request_pipelines/index.md). Available only if `only: [merge_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the merge request is created. |
-| `CI_MERGE_REQUEST_SOURCE_BRANCH_SHA` | 11.9 | all | The HEAD SHA of the source branch of the merge request if [the pipelines are for merge requests](../merge_request_pipelines/index.md). Available only if `only: [merge_requests]` or [`rules`](../yaml/README.md#rules) syntax is used, the merge request is created, and the pipeline is a [merged result pipeline](../merge_request_pipelines/pipelines_for_merged_results/index.md). **(PREMIUM)** |
-| `CI_MERGE_REQUEST_SOURCE_PROJECT_ID` | 11.6 | all | The ID of the source project of the merge request if [the pipelines are for merge requests](../merge_request_pipelines/index.md). Available only if `only: [merge_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the merge request is created. |
-| `CI_MERGE_REQUEST_SOURCE_PROJECT_PATH` | 11.6 | all | The path of the source project of the merge request if [the pipelines are for merge requests](../merge_request_pipelines/index.md). Available only if `only: [merge_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the merge request is created. |
-| `CI_MERGE_REQUEST_SOURCE_PROJECT_URL` | 11.6 | all | The URL of the source project of the merge request if [the pipelines are for merge requests](../merge_request_pipelines/index.md). Available only if `only: [merge_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the merge request is created. |
-| `CI_MERGE_REQUEST_TARGET_BRANCH_NAME` | 11.6 | all | The target branch name of the merge request if [the pipelines are for merge requests](../merge_request_pipelines/index.md). Available only if `only: [merge_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the merge request is created. |
-| `CI_MERGE_REQUEST_TARGET_BRANCH_SHA` | 11.9 | all | The HEAD SHA of the target branch of the merge request if [the pipelines are for merge requests](../merge_request_pipelines/index.md). Available only if `only: [merge_requests]` or [`rules`](../yaml/README.md#rules) syntax is used, the merge request is created, and the pipeline is a [merged result pipeline](../merge_request_pipelines/pipelines_for_merged_results/index.md). **(PREMIUM)** |
-| `CI_MERGE_REQUEST_TITLE` | 11.9 | all | The title of the merge request if [the pipelines are for merge requests](../merge_request_pipelines/index.md). Available only if `only: [merge_requests]` or [`rules`](../yaml/README.md#rules) syntax is used and the merge request is created. |
-| `CI_MERGE_REQUEST_EVENT_TYPE` | 12.3 | all | The event type of the merge request, if [the pipelines are for merge requests](../merge_request_pipelines/index.md). Can be `detached`, `merged_result` or `merge_train`. |
-| `CI_MERGE_REQUEST_DIFF_ID` | 13.7 | all | The version of the merge request diff, if [the pipelines are for merge requests](../merge_request_pipelines/index.md). |
-| `CI_MERGE_REQUEST_DIFF_BASE_SHA` | 13.7 | all | The base SHA of the merge request diff, if [the pipelines are for merge requests](../merge_request_pipelines/index.md). |
-| `CI_NODE_INDEX` | 11.5 | all | Index of the job in the job set. If the job is not parallelized, this variable is not set. |
-| `CI_NODE_TOTAL` | 11.5 | all | Total number of instances of this job running in parallel. If the job is not parallelized, this variable is set to `1`. |
-| `CI_PAGES_DOMAIN` | 11.8 | all | The configured domain that hosts GitLab Pages. |
-| `CI_PAGES_URL` | 11.8 | all | URL to GitLab Pages-built pages. Always belongs to a subdomain of `CI_PAGES_DOMAIN`. |
-| `CI_PIPELINE_ID` | 8.10 | all | The instance-level ID of the current pipeline. This is a unique ID across all projects on GitLab. |
-| `CI_PIPELINE_IID` | 11.0 | all | The project-level IID (internal ID) of the current pipeline. This ID is unique for the current project. |
-| `CI_PIPELINE_SOURCE` | 10.0 | all | Indicates how the pipeline was triggered. Possible options are: `push`, `web`, `schedule`, `api`, `external`, `chat`, `webide`, `merge_request_event`, `external_pull_request_event`, `parent_pipeline`, [`trigger`, or `pipeline`](../triggers/README.md#authentication-tokens). For pipelines created before GitLab 9.5, this is displayed as `unknown`. |
-| `CI_PIPELINE_TRIGGERED` | all | all | The flag to indicate that job was [triggered](../triggers/README.md). |
-| `CI_PIPELINE_URL` | 11.1 | 0.5 | Pipeline details URL. |
-| `CI_PROJECT_CONFIG_PATH` | 13.8 | all | The CI configuration path for the project. |
-| `CI_PROJECT_DIR` | all | all | The full path where the repository is cloned and where the job is run. If the GitLab Runner `builds_dir` parameter is set, this variable is set relative to the value of `builds_dir`. For more information, see [Advanced configuration](https://docs.gitlab.com/runner/configuration/advanced-configuration.html#the-runners-section) for GitLab Runner. |
-| `CI_PROJECT_ID` | all | all | The unique ID of the current project that GitLab CI/CD uses internally. |
-| `CI_PROJECT_NAME` | 8.10 | 0.5 | The name of the directory for the project that is being built. For example, if the project URL is `gitlab.example.com/group-name/project-1`, the `CI_PROJECT_NAME` would be `project-1`. |
-| `CI_PROJECT_NAMESPACE` | 8.10 | 0.5 | The project namespace (username or group name) that is being built. |
-| `CI_PROJECT_ROOT_NAMESPACE` | 13.2 | 0.5 | The **root** project namespace (username or group name) that is being built. For example, if `CI_PROJECT_NAMESPACE` is `root-group/child-group/grandchild-group`, `CI_PROJECT_ROOT_NAMESPACE` would be `root-group`. |
-| `CI_PROJECT_PATH` | 8.10 | 0.5 | The namespace with project name. |
-| `CI_PROJECT_PATH_SLUG` | 9.3 | all | `$CI_PROJECT_PATH` in lowercase and with everything except `0-9` and `a-z` replaced with `-`. Use in URLs and domain names. |
-| `CI_PROJECT_REPOSITORY_LANGUAGES` | 12.3 | all | Comma-separated, lowercase list of the languages used in the repository (for example `ruby,javascript,html,css`). |
-| `CI_PROJECT_TITLE` | 12.4 | all | The human-readable project name as displayed in the GitLab web interface. |
-| `CI_PROJECT_URL` | 8.10 | 0.5 | The HTTP(S) address to access project. |
-| `CI_PROJECT_VISIBILITY` | 10.3 | all | The project visibility (internal, private, public). |
-| `CI_REGISTRY` | 8.10 | 0.5 | If the Container Registry is enabled it returns the address of the GitLab Container Registry. This variable includes a `:port` value if one has been specified in the registry configuration. |
-| `CI_REGISTRY_IMAGE` | 8.10 | 0.5 | If the Container Registry is enabled for the project it returns the address of the registry tied to the specific project. |
-| `CI_REGISTRY_PASSWORD` | 9.0 | all | The password to use to push containers to the GitLab Container Registry, for the current project. |
-| `CI_REGISTRY_USER` | 9.0 | all | The username to use to push containers to the GitLab Container Registry, for the current project. |
-| `CI_REPOSITORY_URL` | 9.0 | all | The URL to clone the Git repository. |
-| `CI_RUNNER_DESCRIPTION` | 8.10 | 0.5 | The description of the runner as saved in GitLab. |
-| `CI_RUNNER_EXECUTABLE_ARCH` | all | 10.6 | The OS/architecture of the GitLab Runner executable (note that this is not necessarily the same as the environment of the executor). |
-| `CI_RUNNER_ID` | 8.10 | 0.5 | The unique ID of runner being used. |
-| `CI_RUNNER_REVISION` | all | 10.6 | GitLab Runner revision that is executing the current 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_TAGS` | 8.10 | 0.5 | The defined runner tags. |
-| `CI_RUNNER_VERSION` | all | 10.6 | GitLab Runner version that is executing the current job. |
-| `CI_SERVER` | all | all | Mark that job is executed in CI environment. |
-| `CI_SERVER_URL` | 12.7 | all | The base URL of the GitLab instance, including protocol and port (like `https://gitlab.example.com:8080`). |
-| `CI_SERVER_HOST` | 12.1 | all | Host component of the GitLab instance URL, without protocol and port (like `gitlab.example.com`). |
-| `CI_SERVER_PORT` | 12.8 | all | Port component of the GitLab instance URL, without host and protocol (like `3000`). |
-| `CI_SERVER_PROTOCOL` | 12.8 | all | Protocol component of the GitLab instance URL, without host and port (like `https`). |
-| `CI_SERVER_NAME` | all | all | The name of CI server that is used to coordinate jobs. |
-| `CI_SERVER_REVISION` | all | all | GitLab revision that is used to schedule jobs. |
-| `CI_SERVER_VERSION` | all | all | GitLab version that is used to schedule jobs. |
-| `CI_SERVER_VERSION_MAJOR` | 11.4 | all | GitLab version major component. |
-| `CI_SERVER_VERSION_MINOR` | 11.4 | all | GitLab version minor component. |
-| `CI_SERVER_VERSION_PATCH` | 11.4 | all | GitLab version patch component. |
-| `CI_SHARED_ENVIRONMENT` | all | 10.1 | Marks that the job is executed in a shared environment (something that is persisted across CI invocations like `shell` or `ssh` executor). If the environment is shared, it is set to true, otherwise it is not defined at all. |
-| `GITLAB_CI` | all | all | Mark that job is executed in GitLab CI/CD environment. |
-| `GITLAB_FEATURES` | 10.6 | all | The comma separated list of licensed features available for your instance and plan. |
-| `GITLAB_USER_EMAIL` | 8.12 | all | The email of the user who started the job. |
-| `GITLAB_USER_ID` | 8.12 | all | The ID of the user who started the job. |
-| `GITLAB_USER_LOGIN` | 10.0 | all | The login username of the user who started the job. |
-| `GITLAB_USER_NAME` | 10.0 | all | The real name of the user who started the job. |
-| `TRIGGER_PAYLOAD` | 13.9 | all | This variable is available when a pipeline is [triggered with a webhook](../triggers/README.md#using-webhook-payload-in-the-triggered-pipeline) |
+| `CI_EXTERNAL_PULL_REQUEST_IID` | 12.3 | all | Pull request ID from GitHub. |
+| `CI_EXTERNAL_PULL_REQUEST_SOURCE_REPOSITORY` | 13.3 | all | The source repository name of the pull request. |
+| `CI_EXTERNAL_PULL_REQUEST_TARGET_REPOSITORY` | 13.3 | all | The target repository name of the pull request. |
+| `CI_EXTERNAL_PULL_REQUEST_SOURCE_BRANCH_NAME` | 12.3 | all | The source branch name of the pull request. |
+| `CI_EXTERNAL_PULL_REQUEST_SOURCE_BRANCH_SHA` | 12.3 | all | The HEAD SHA of the source branch of the pull request. |
+| `CI_EXTERNAL_PULL_REQUEST_TARGET_BRANCH_NAME` | 12.3 | all | The target branch name of the pull request. |
+| `CI_EXTERNAL_PULL_REQUEST_TARGET_BRANCH_SHA` | 12.3 | all | The HEAD SHA of the target branch of the pull request. |
diff --git a/doc/ci/variables/where_variables_can_be_used.md b/doc/ci/variables/where_variables_can_be_used.md
index d057fe9c4cc..16c02b3482b 100644
--- a/doc/ci/variables/where_variables_can_be_used.md
+++ b/doc/ci/variables/where_variables_can_be_used.md
@@ -109,6 +109,7 @@ The following variables are known as "persisted":
- `CI_PIPELINE_ID`
- `CI_JOB_ID`
- `CI_JOB_TOKEN`
+- `CI_JOB_STARTED_AT`
- `CI_BUILD_ID`
- `CI_BUILD_TOKEN`
- `CI_REGISTRY_USER`
diff --git a/doc/ci/yaml/README.md b/doc/ci/yaml/README.md
index 2abfbd3a5b4..959a619f986 100644
--- a/doc/ci/yaml/README.md
+++ b/doc/ci/yaml/README.md
@@ -7,7 +7,7 @@ type: reference
<!-- markdownlint-disable MD044 -->
<!-- vale gitlab.Spelling = NO -->
-# Keyword reference for the .gitlab-ci.yml file
+# Keyword reference for the .gitlab-ci.yml file **(FREE)**
<!-- vale gitlab.Spelling = YES -->
<!-- markdownlint-enable MD044 -->
@@ -26,41 +26,43 @@ A job is defined as a list of keywords that define the job's behavior.
The keywords available for jobs are:
-| Keyword | Description |
-|:---------------------------------------------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| [`script`](#script) | Shell script that is executed by a runner. |
-| [`after_script`](#after_script) | Override a set of commands that are executed after job. |
-| [`allow_failure`](#allow_failure) | Allow job to fail. A failed job does not cause the pipeline to fail. |
-| [`artifacts`](#artifacts) | List of files and directories to attach to a job on success. Also available: `artifacts:paths`, `artifacts:exclude`, `artifacts:expose_as`, `artifacts:name`, `artifacts:untracked`, `artifacts:when`, `artifacts:expire_in`, and `artifacts:reports`. |
-| [`before_script`](#before_script) | Override a set of commands that are executed before job. |
-| [`cache`](#cache) | List of files that should be cached between subsequent runs. Also available: `cache:paths`, `cache:key`, `cache:untracked`, `cache:when`, and `cache:policy`. |
-| [`coverage`](#coverage) | Code coverage settings for a given job. |
-| [`dependencies`](#dependencies) | Restrict which artifacts are passed to a specific job by providing a list of jobs to fetch artifacts from. |
-| [`environment`](#environment) | Name of an environment to which the job deploys. Also available: `environment:name`, `environment:url`, `environment:on_stop`, `environment:auto_stop_in`, and `environment:action`. |
-| [`except`](#onlyexcept-basic) | Limit when jobs are not created. Also available: [`except:refs`, `except:kubernetes`, `except:variables`, and `except:changes`](#onlyexcept-advanced). |
-| [`extends`](#extends) | Configuration entries that this job inherits from. |
-| [`image`](#image) | Use Docker images. Also available: `image:name` and `image:entrypoint`. |
-| [`include`](#include) | Include external YAML files. Also available: `include:local`, `include:file`, `include:template`, and `include:remote`. |
-| [`interruptible`](#interruptible) | Defines if a job can be canceled when made redundant by a newer run. |
-| [`only`](#onlyexcept-basic) | Limit when jobs are created. Also available: [`only:refs`, `only:kubernetes`, `only:variables`, and `only:changes`](#onlyexcept-advanced). |
-| [`pages`](#pages) | Upload the result of a job to use with GitLab Pages. |
-| [`parallel`](#parallel) | How many instances of a job should be run in parallel. |
-| [`release`](#release) | Instructs the runner to generate a [Release](../../user/project/releases/index.md) object. |
-| [`resource_group`](#resource_group) | Limit job concurrency. |
-| [`retry`](#retry) | When and how many times a job can be auto-retried in case of a failure. |
-| [`rules`](#rules) | List of conditions to evaluate and determine selected attributes of a job, and whether or not it's created. |
-| [`services`](#services) | Use Docker services images. Also available: `services:name`, `services:alias`, `services:entrypoint`, and `services:command`. |
-| [`stage`](#stage) | Defines a job stage (default: `test`). |
-| [`tags`](#tags) | List of tags that are used to select a runner. |
-| [`timeout`](#timeout) | Define a custom job-level timeout that takes precedence over the project-wide setting. |
-| [`trigger`](#trigger) | Defines a downstream pipeline trigger. |
-| [`variables`](#variables) | Define job variables on a job level. |
-| [`when`](#when) | When to run job. Also available: `when:manual` and `when:delayed`. |
+| Keyword | Description |
+| :-----------------------------------|:------------|
+| [`after_script`](#after_script) | Override a set of commands that are executed after job. |
+| [`allow_failure`](#allow_failure) | Allow job to fail. A failed job does not cause the pipeline to fail. |
+| [`artifacts`](#artifacts) | List of files and directories to attach to a job on success. |
+| [`before_script`](#before_script) | Override a set of commands that are executed before job. |
+| [`cache`](#cache) | List of files that should be cached between subsequent runs. |
+| [`coverage`](#coverage) | Code coverage settings for a given job. |
+| [`dependencies`](#dependencies) | Restrict which artifacts are passed to a specific job by providing a list of jobs to fetch artifacts from. |
+| [`environment`](#environment) | Name of an environment to which the job deploys. |
+| [`except`](#onlyexcept-basic) | Limit when jobs are not created. |
+| [`extends`](#extends) | Configuration entries that this job inherits from. |
+| [`image`](#image) | Use Docker images. |
+| [`include`](#include) | Include external YAML files. |
+| [`inherit`](#inherit) | Select which global defaults all jobs inherit. |
+| [`interruptible`](#interruptible) | Defines if a job can be canceled when made redundant by a newer run. |
+| [`needs`](#needs) | Execute jobs earlier than the stage ordering. |
+| [`only`](#onlyexcept-basic) | Limit when jobs are created. |
+| [`pages`](#pages) | Upload the result of a job to use with GitLab Pages. |
+| [`parallel`](#parallel) | How many instances of a job should be run in parallel. |
+| [`release`](#release) | Instructs the runner to generate a [release](../../user/project/releases/index.md) object. |
+| [`resource_group`](#resource_group) | Limit job concurrency. |
+| [`retry`](#retry) | When and how many times a job can be auto-retried in case of a failure. |
+| [`rules`](#rules) | List of conditions to evaluate and determine selected attributes of a job, and whether or not it's created. |
+| [`script`](#script) | Shell script that is executed by a runner. |
+| [`secrets`](#secrets) | The CI/CD secrets the job needs. |
+| [`services`](#services) | Use Docker services images. |
+| [`stage`](#stage) | Defines a job stage. |
+| [`tags`](#tags) | List of tags that are used to select a runner. |
+| [`timeout`](#timeout) | Define a custom job-level timeout that takes precedence over the project-wide setting. |
+| [`trigger`](#trigger) | Defines a downstream pipeline trigger. |
+| [`variables`](#variables) | Define job variables on a job level. |
+| [`when`](#when) | When to run job. |
### Unavailable names for jobs
-Each job must have a unique name, but there are a few reserved `keywords` that
-can't be used as job names:
+You can't use these keywords as job names:
- `image`
- `services`
@@ -72,38 +74,27 @@ can't be used as job names:
- `cache`
- `include`
-### Reserved keywords
+### Custom default keyword values
-If you get a validation error when you use specific values (for example, `true` or `false`), try to:
+You can set global defaults for some keywords. Jobs that do not define one or more
+of the listed keywords use the value defined in the `default:` section.
-- Quote them.
-- Change them to a different form. For example, `/bin/true`.
+These job keywords can be defined inside a `default:` section:
-## Global keywords
-
-Some keywords are defined at a global level and affect all jobs in the pipeline.
-
-### Global defaults
-
-Some keywords can be set globally as the default for all jobs with the
-`default:` keyword. Default keywords can then be overridden by job-specific
-configuration.
-
-The following job keywords can be defined inside a `default:` block:
-
-- [`image`](#image)
-- [`services`](#services)
-- [`before_script`](#before_script)
- [`after_script`](#after_script)
-- [`tags`](#tags)
-- [`cache`](#cache)
- [`artifacts`](#artifacts)
+- [`before_script`](#before_script)
+- [`cache`](#cache)
+- [`image`](#image)
+- [`interruptible`](#interruptible)
- [`retry`](#retry)
+- [`services`](#services)
+- [`tags`](#tags)
- [`timeout`](#timeout)
-- [`interruptible`](#interruptible)
-In the following example, the `ruby:2.5` image is set as the default for all
-jobs except the `rspec 2.6` job, which uses the `ruby:2.6` image:
+The following example sets the `ruby:2.5` image as the default for all jobs in the pipeline.
+The `rspec 2.6` job does not use the default, because it overrides the default with
+a job-specific `image:` section:
```yaml
default:
@@ -117,87 +108,16 @@ rspec 2.6:
script: bundle exec rspec
```
-#### `inherit`
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/207484) in GitLab 12.9.
-
-You can disable inheritance of globally defined defaults
-and variables with the `inherit:` keyword.
-
-To enable or disable the inheritance of all `default:` or `variables:` keywords, use:
-
-- `default: true` or `default: false`
-- `variables: true` or `variables: false`
-
-To inherit only a subset of `default:` keywords or `variables:`, specify what
-you wish to inherit. Anything not listed is **not** inherited. Use
-one of the following formats:
-
-```yaml
-inherit:
- default: [keyword1, keyword2]
- variables: [VARIABLE1, VARIABLE2]
-```
-
-Or:
-
-```yaml
-inherit:
- default:
- - keyword1
- - keyword2
- variables:
- - VARIABLE1
- - VARIABLE2
-```
-
-In the example below:
-
-- `rubocop`:
- - inherits: Nothing.
-- `rspec`:
- - inherits: the default `image` and the `WEBHOOK_URL` variable.
- - does **not** inherit: the default `before_script` and the `DOMAIN` variable.
-- `capybara`:
- - inherits: the default `before_script` and `image`.
- - does **not** inherit: the `DOMAIN` and `WEBHOOK_URL` variables.
-- `karma`:
- - inherits: the default `image` and `before_script`, and the `DOMAIN` variable.
- - does **not** inherit: `WEBHOOK_URL` variable.
-
-```yaml
-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
+## Global keywords
-capybara:
- inherit:
- variables: false
- script: bundle exec capybara
+Some keywords are not defined in a job. These keywords control pipeline behavior
+or import additional pipeline configuration:
-karma:
- inherit:
- default: true
- variables: [DOMAIN]
- script: karma
-```
+| Keyword | Description |
+|-------------------------|:------------|
+| [`stages`](#stages) | The names and order of the pipeline stages. |
+| [`workflow`](#workflow) | Control what types of pipeline run. |
+| [`include`](#include) | Import configuration from other YAML files. |
### `stages`
@@ -235,13 +155,13 @@ If a job does not specify a [`stage`](#stage), the job is assigned the `test` st
To make a job start earlier and ignore the stage order, use
the [`needs`](#needs) keyword.
-### `workflow:rules`
+### `workflow`
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/29654) in GitLab 12.5
-The top-level `workflow:` keyword determines whether or not a pipeline is created.
-It accepts a single `rules:` keyword that is similar to [`rules:` defined in jobs](#rules).
-Use it to define what can trigger a new pipeline.
+Use `workflow:` to determine whether or not a pipeline is created.
+Define this keyword at the top level, with a single `rules:` keyword that
+is similar to [`rules:` defined in jobs](#rules).
You can use the [`workflow:rules` templates](#workflowrules-templates) to import
a preconfigured `workflow: rules` entry.
@@ -266,15 +186,15 @@ Some example `if` clauses for `workflow: rules`:
See the [common `if` clauses for `rules`](#common-if-clauses-for-rules) for more examples.
-For example, in the following configuration, pipelines run for all `push` events (changes to
-branches and new tags). Pipelines for push events with `-wip` in the commit message
+In the following example, pipelines run for all `push` events (changes to
+branches and new tags). Pipelines for push events with `-draft` in the commit message
don't run, because they are set to `when: never`. Pipelines for schedules or merge requests
don't run either, because no rules evaluate to true for them:
```yaml
workflow:
rules:
- - if: $CI_COMMIT_MESSAGE =~ /-wip$/
+ - if: $CI_COMMIT_MESSAGE =~ /-draft$/
when: never
- if: '$CI_PIPELINE_SOURCE == "push"'
```
@@ -300,13 +220,13 @@ The final `when: always` rule runs all other pipeline types, **including** merge
request pipelines.
If your rules match both branch pipelines and merge request pipelines,
-[duplicate pipelines](#prevent-duplicate-pipelines) can occur.
+[duplicate pipelines](#avoid-duplicate-pipelines) can occur.
#### `workflow:rules` templates
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/217732) in GitLab 13.0.
-We provide templates that set up `workflow: rules`
+GitLab provides templates that set up `workflow: rules`
for common scenarios. These templates help prevent duplicate pipelines.
The [`Branch-Pipelines` template](https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/gitlab/ci/templates/Workflows/Branch-Pipelines.gitlab-ci.yml)
@@ -314,12 +234,12 @@ makes your pipelines run for branches and tags.
Branch pipeline status is displayed in merge requests that use the branch
as a source. However, this pipeline type does not support any features offered by
-[Merge Request Pipelines](../merge_request_pipelines/), like
-[Pipelines for Merge Results](../merge_request_pipelines/#pipelines-for-merged-results)
-or [Merge Trains](../merge_request_pipelines/pipelines_for_merged_results/merge_trains/).
-Use this template if you are intentionally avoiding those features.
+[merge request pipelines](../merge_request_pipelines/), like
+[pipelines for merge results](../merge_request_pipelines/#pipelines-for-merged-results)
+or [merge trains](../merge_request_pipelines/pipelines_for_merged_results/merge_trains/).
+This template intentionally avoids those features.
-It is [included](#include) as follows:
+To [include](#include) it:
```yaml
include:
@@ -327,25 +247,74 @@ include:
```
The [`MergeRequest-Pipelines` template](https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/gitlab/ci/templates/Workflows/MergeRequest-Pipelines.gitlab-ci.yml)
-makes your pipelines run for the default branch (usually `master`), tags, and
+makes your pipelines run for the default branch, tags, and
all types of merge request pipelines. Use this template if you use any of the
-the [Pipelines for Merge Requests features](../merge_request_pipelines/), as mentioned
-above.
+the [pipelines for merge requests features](../merge_request_pipelines/).
-It is [included](#include) as follows:
+To [include](#include) it:
```yaml
include:
- template: 'Workflows/MergeRequest-Pipelines.gitlab-ci.yml'
```
+#### Switch between branch pipelines and merge request pipelines
+
+> [Introduced in](https://gitlab.com/gitlab-org/gitlab/-/issues/201845) GitLab 13.8.
+
+To make the pipeline switch from branch pipelines to merge request pipelines after
+a merge request is created, add a `workflow: rules` section to your `.gitlab-ci.yml` file.
+
+If you use both pipeline types at the same time, [duplicate pipelines](#avoid-duplicate-pipelines)
+might run at the same time. To prevent duplicate pipelines, use the
+[`CI_OPEN_MERGE_REQUESTS` variable](../variables/predefined_variables.md).
+
+The following example is for a project that runs branch and merge request pipelines only,
+but does not run pipelines for any other case. It runs:
+
+- Branch pipelines when a merge request is not open for the branch.
+- Merge request pipelines when a merge request is open for the branch.
+
+```yaml
+workflow:
+ rules:
+ - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
+ - if: '$CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS'
+ when: never
+ - if: '$CI_COMMIT_BRANCH'
+```
+
+If the pipeline is triggered by:
+
+- A merge request, run a merge request pipeline. For example, a merge request pipeline
+ can be triggered by a push to a branch with an associated open merge request.
+- A change to a branch, but a merge request is open for that branch, do not run a branch pipeline.
+- A change to a branch, but without any open merge requests, run a branch pipeline.
+
+You can also add a rule to an existing `workflow` section to switch from branch pipelines
+to merge request pipelines when a merge request is created.
+
+Add this rule to the top of the `workflow` section, followed by the other rules that
+were already present:
+
+```yaml
+workflow:
+ rules:
+ - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS && $CI_PIPELINE_SOURCE == "push"
+ when: never
+ - ... # Previously defined workflow rules here
+```
+
+[Triggered pipelines](../triggers/README.md) that run on a branch have a `$CI_COMMIT_BRANCH`
+set and could be blocked by a similar rule. Triggered pipelines have a pipeline source
+of `trigger` or `pipeline`, so `&& $CI_PIPELINE_SOURCE == "push"` ensures the rule
+does not block triggered pipelines.
+
### `include`
-> - Introduced in [GitLab Premium](https://about.gitlab.com/pricing/) 10.5.
-> - Available for Starter, Premium, and Ultimate in GitLab 10.6 and later.
-> - [Moved](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/42861) to GitLab Free in 11.4.
+> [Moved](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/42861) to GitLab Free in 11.4.
-Use the `include` keyword to include external YAML files in your CI/CD configuration.
+Use `include` to include external YAML files in your CI/CD configuration.
You can break down one long `gitlab-ci.yml` file into multiple files to increase readability,
or reduce duplication of the same configuration in multiple places.
@@ -355,8 +324,8 @@ You can also store template files in a central repository and `include` them in
otherwise the external file is not included.
You can't use [YAML anchors](#anchors) across different YAML files sourced by `include`.
-You can only refer to anchors in the same file. Instead of YAML anchors, you can
-use the [`extends` keyword](#extends).
+You can only refer to anchors in the same file. To reuse configuration from different
+YAML files, use [`!reference` tags](#reference-tags) or the [`extends` keyword](#extends).
`include` supports the following inclusion methods:
@@ -367,11 +336,11 @@ use the [`extends` keyword](#extends).
| [`remote`](#includeremote) | Include a file from a remote URL. Must be publicly accessible. |
| [`template`](#includetemplate) | Include templates that are provided by GitLab. |
-The `.gitlab-ci.yml` file configuration included by all methods is evaluated when the pipeline is created.
-The configuration is a snapshot in time and persisted in the database. Any changes to
-the referenced `.gitlab-ci.yml` file configuration is not reflected in GitLab until the next pipeline is created.
+When the pipeline starts, the `.gitlab-ci.yml` file configuration included by all methods is evaluated.
+The configuration is a snapshot in time and persists in the database. GitLab does not reflect any changes to
+the referenced `.gitlab-ci.yml` file configuration until the next pipeline starts.
-The files defined by `include` are:
+The `include` files are:
- Deep merged with those in the `.gitlab-ci.yml` file.
- Always evaluated first and merged with the content of the `.gitlab-ci.yml` file,
@@ -395,13 +364,13 @@ include:
file: '.compliance-gitlab-ci.yml'
```
-For an example of how you can include these predefined variables, and their impact on CI jobs,
-see the following [CI/CD variable demo](https://youtu.be/4XR8gw3Pkos).
+For an example of how you can include these predefined variables, and the variables' impact on CI/CD jobs,
+see this [CI/CD variable demo](https://youtu.be/4XR8gw3Pkos).
#### `include:local`
-`include:local` includes a file that is in the same repository as the `.gitlab-ci.yml` file.
-It's referenced with full paths relative to the root directory (`/`).
+Use `include:local` to include a file that is in the same repository as the `.gitlab-ci.yml` file.
+Use a full path relative to the root directory (`/`).
If you use `include:local`, make sure that both the `.gitlab-ci.yml` file and the local file
are on the same branch.
@@ -418,7 +387,7 @@ include:
- local: '/templates/.gitlab-ci-template.yml'
```
-This can be defined as a short local include:
+You can also use shorter syntax to define the path:
```yaml
include: '.gitlab-ci-production.yml'
@@ -432,8 +401,9 @@ Use local includes instead of symbolic links.
To include files from another private project on the same GitLab instance,
use `include:file`. You can use `include:file` in combination with `include:project` only.
+Use a full path, relative to the root directory (`/`).
-The included file is referenced with a full path, relative to the root directory (`/`). For example:
+For example:
```yaml
include:
@@ -441,7 +411,7 @@ include:
file: '/templates/.gitlab-ci-template.yml'
```
-You can also specify a `ref`. If not specified, it defaults to the `HEAD` of the project:
+You can also specify a `ref`. If you do not specify a value, the ref defaults to the `HEAD` of the project:
```yaml
include:
@@ -530,15 +500,15 @@ to resolve all files is 30 seconds.
#### Additional `includes` examples
-There is a list of [additional `includes` examples](includes.md) available.
+View [additional `includes` examples](includes.md).
## Keyword details
-The following are detailed explanations for keywords used to configure CI/CD pipelines.
+The following topics explain how to use keywords to configure CI/CD pipelines.
### `image`
-Used to specify [a Docker image](../docker/using_docker_images.md#what-is-an-image) to use for the job.
+Use `image` to specify [a Docker image](../docker/using_docker_images.md#what-is-an-image) to use for the job.
For:
@@ -559,13 +529,13 @@ For more information, see [Available settings for `image`](../docker/using_docke
#### `services`
-Used to specify a [service Docker image](../docker/using_docker_images.md#what-is-a-service), linked to a base image specified in [`image`](#image).
+Use `services` to specify a [service Docker image](../docker/using_docker_images.md#what-is-a-service), linked to a base image specified in [`image`](#image).
For:
- Usage examples, see [Define `image` and `services` from `.gitlab-ci.yml`](../docker/using_docker_images.md#define-image-and-services-from-gitlab-ciyml).
- Detailed usage information, refer to [Docker integration](../docker/index.md) documentation.
-- For example services, see [GitLab CI/CD Services](../services/index.md).
+- Example services, see [GitLab CI/CD Services](../services/index.md).
##### `services:name`
@@ -593,8 +563,11 @@ For more information, see [Available settings for `services`](../docker/using_do
### `script`
-`script` is the only required keyword that a job needs. It's a shell script
-that is executed by the runner. For example:
+Use `script` to specify a shell script for the runner to execute.
+
+All jobs except [trigger jobs](#trigger) require a `script` keyword.
+
+For example:
```yaml
job:
@@ -603,7 +576,7 @@ job:
You can use [YAML anchors with `script`](#yaml-anchors-for-scripts).
-This keyword can also contain several commands in an array:
+The `script` keyword can also contain several commands in an array:
```yaml
job:
@@ -637,7 +610,7 @@ job:
You can verify the syntax is valid with the [CI Lint](../lint.md) tool.
-Be careful when using these special characters as well:
+Be careful when using these characters as well:
- `{`, `}`, `[`, `]`, `,`, `&`, `*`, `#`, `?`, `|`, `-`, `<`, `>`, `=`, `!`, `%`, `@`, `` ` ``.
@@ -657,10 +630,10 @@ job:
Use `before_script` to define an array of commands that should run before each job,
but after [artifacts](#artifacts) are restored.
-Scripts specified in `before_script` are concatenated with any scripts specified
-in the main [`script`](#script), and executed together in a single shell.
+Scripts you specify in `before_script` are concatenated with any scripts you specify
+in the main [`script`](#script). The combine scripts execute together in a single shell.
-It's possible to overwrite a globally defined `before_script` if you define it in a job:
+You can overwrite a globally-defined `before_script` if you define it in a job:
```yaml
default:
@@ -685,11 +658,11 @@ You can use [YAML anchors with `before_script`](#yaml-anchors-for-scripts).
Use `after_script` to define an array of commands that run after each job,
including failed jobs.
-If a job times out or is cancelled, the `after_script` commands are not executed.
-Support for executing `after_script` commands for timed-out or cancelled jobs
-[is planned](https://gitlab.com/gitlab-org/gitlab/-/issues/15603).
+If a job times out or is cancelled, the `after_script` commands do not execute.
+An [issue](https://gitlab.com/gitlab-org/gitlab/-/issues/15603) exists to support
+executing `after_script` commands for timed-out or cancelled jobs.
-Scripts specified in `after_script` are executed in a new shell, separate from any
+Scripts you specify in `after_script` execute in a new shell, separate from any
`before_script` or `script` scripts. As a result, they:
- Have a current working directory set back to the default.
@@ -722,7 +695,7 @@ You can use [YAML anchors with `after_script`](#yaml-anchors-for-scripts).
#### Script syntax
-You can use special syntax in [`script`](README.md#script) sections to:
+You can use syntax in [`script`](README.md#script) sections to:
- [Split long commands](script.md#split-long-commands) into multiline commands.
- [Use color codes](script.md#add-color-codes-to-script-output) to make job logs easier to review.
@@ -731,9 +704,19 @@ You can use special syntax in [`script`](README.md#script) sections to:
### `stage`
-`stage` is defined per-job and relies on [`stages`](#stages), which is defined
-globally. Use `stage` to define which stage a job runs in, and jobs of the same
-`stage` are executed in parallel (subject to [certain conditions](#use-your-own-runners)). For example:
+Use `stage` to define which stage a job runs in. Jobs in the same
+`stage` can execute in parallel (subject to [certain conditions](#use-your-own-runners)).
+
+Jobs without a `stage` entry use the `test` stage by default. If you do not define
+[`stages`](#stages) in the pipeline, you can use the 5 default stages, which execute in
+this order:
+
+- [`.pre`](#pre-and-post)
+- `build`
+- `test`
+- `deploy`
+- [`.post`](#pre-and-post)
+For example:
```yaml
stages:
@@ -779,45 +762,39 @@ is greater than `1`.
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/31441) in GitLab 12.4.
-The following stages are available to every pipeline:
+Use `pre` and `post` for jobs that need to run first or last in a pipeline.
-- `.pre`, which is guaranteed to always be the first stage in a pipeline.
-- `.post`, which is guaranteed to always be the last stage in a pipeline.
+- `.pre` is guaranteed to always be the first stage in a pipeline.
+- `.post` is guaranteed to always be the last stage in a pipeline.
User-defined stages are executed after `.pre` and before `.post`.
-A pipeline is not created if all jobs are in `.pre` or `.post` stages.
-
-The order of `.pre` and `.post` can't be changed, even if defined out of order in the `.gitlab-ci.yml` file.
-For example, the following are equivalent configuration:
+You must have a job in at least one stage other than `.pre` or `.post`.
-- Configured in order:
+You can't change the order of `.pre` and `.post`, even if you define them out of order in the `.gitlab-ci.yml` file.
+For example, the following configurations are equivalent:
- ```yaml
- stages:
- - .pre
- - a
- - b
- - .post
- ```
-
-- Configured out of order:
-
- ```yaml
- stages:
- - a
- - .pre
- - b
- - .post
- ```
+```yaml
+stages:
+ - .pre
+ - a
+ - b
+ - .post
+```
-- Not explicitly configured:
+```yaml
+stages:
+ - a
+ - .pre
+ - b
+ - .post
+```
- ```yaml
- stages:
- - a
- - b
- ```
+```yaml
+stages:
+ - a
+ - b
+```
### `extends`
@@ -827,7 +804,7 @@ Use `extends` to reuse configuration sections. It's an alternative to [YAML anch
and is a little more flexible and readable. You can use `extends` to reuse configuration
from [included configuration files](#use-extends-and-include-together).
-In this example, the `rspec` job uses the configuration from the `.tests` template job.
+In the following example, the `rspec` job uses the configuration from the `.tests` template job.
GitLab:
- Performs a reverse deep merge based on the keys.
@@ -898,8 +875,8 @@ In GitLab 12.0 and later, it's also possible to use multiple parents for
#### Merge details
-`extends` is able to merge hashes but not arrays.
-The algorithm used for merge is "closest scope wins", so
+You can use `extends` to merge hashes but not arrays.
+The algorithm used for merge is "closest scope wins," so
keys from the last member always override anything defined on other
levels. For example:
@@ -951,7 +928,7 @@ rspec:
- rake rspec
```
-Note that in the example above:
+In this example:
- The `variables` sections merge, but `URL: "http://docker-url.internal"` overwrites `URL: "http://my-url.internal"`.
- `tags: ['docker']` overwrites `tags: ['production']`.
@@ -963,8 +940,8 @@ Note that in the example above:
To reuse configuration from different configuration files,
combine `extends` and [`include`](#include).
-In this example, a `script` is defined in the `included.yml` file.
-Then, in the `.gitlab-ci.yml` file, you use `extends` to refer
+In the following example, a `script` is defined in the `included.yml` file.
+Then, in the `.gitlab-ci.yml` file, `extends` refers
to the contents of the `script`:
- `included.yml`:
@@ -989,11 +966,11 @@ to the contents of the `script`:
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/27863) in GitLab 12.3.
-Use the `rules` keyword to include or exclude jobs in pipelines.
+Use `rules` to include or exclude jobs in pipelines.
-Rules are evaluated *in order* until the first match. When matched, the job
+Rules are evaluated *in order* until the first match. When a match is found, the job
is either included or excluded from the pipeline, depending on the configuration.
-If included, the job also has [certain attributes](#rules-attributes)
+The job can also have [certain attributes](#rules-attributes)
added to it.
`rules` replaces [`only/except`](#onlyexcept-basic) and they can't be used together
@@ -1052,7 +1029,7 @@ The job is not added to the pipeline:
`when: always`.
- If a rule matches, and has `when: never` as the attribute.
-This example uses `if` to strictly limit when jobs run:
+The following example uses `if` to strictly limit when jobs run:
```yaml
job:
@@ -1100,15 +1077,14 @@ WARNING:
If you use a `when:` clause as the final rule (not including `when: never`), two
simultaneous pipelines may start. Both push pipelines and merge request pipelines can
be triggered by the same event (a push to the source branch for an open merge request).
-See how to [prevent duplicate pipelines](#prevent-duplicate-pipelines)
+See how to [prevent duplicate pipelines](#avoid-duplicate-pipelines)
for more details.
-#### Prevent duplicate pipelines
+#### Avoid duplicate pipelines
-Jobs defined with `rules` can trigger multiple pipelines with the same action. You
-don't have to explicitly configure rules for each type of pipeline to trigger them
-accidentally. Rules that are too broad could cause simultaneous pipelines of a different
-type to run unexpectedly.
+If a job uses `rules`, a single action, like pushing a commit to a branch, can trigger
+multiple pipelines. You don't have to explicitly configure rules for multiple types
+of pipeline to trigger them accidentally.
Some configurations that have the potential to cause duplicate pipelines cause a
[pipeline warning](../troubleshooting.md#pipeline-warnings) to be displayed.
@@ -1130,12 +1106,10 @@ other pipelines, including **both** push (branch) and merge request pipelines. W
this configuration, every push to an open merge request's source branch
causes duplicated pipelines.
-There are multiple ways to avoid duplicate pipelines:
-
-- Use [`workflow: rules`](#workflowrules) to specify which types of pipelines
- can run. To eliminate duplicate pipelines, use merge request pipelines only
- or push (branch) pipelines only.
+To avoid duplicate pipelines, you can:
+- Use [`workflow`](#workflow) to specify which types of pipelines
+ can run.
- Rewrite the rules to run the job only in very specific cases,
and avoid a final `when:` rule:
@@ -1146,7 +1120,7 @@ There are multiple ways to avoid duplicate pipelines:
- if: '$CUSTOM_VARIABLE == "true" && $CI_PIPELINE_SOURCE == "merge_request_event"'
```
-You can prevent duplicate pipelines by changing the job rules to avoid either push (branch)
+You can also avoid duplicate pipelines by changing the job rules to avoid either push (branch)
pipelines or merge request pipelines. However, if you use a `- when: always` rule without
`workflow: rules`, GitLab still displays a [pipeline warning](../troubleshooting.md#pipeline-warnings).
@@ -1162,7 +1136,8 @@ job:
- when: always
```
-Do not include both push and merge request pipelines in the same job:
+You should not include both push and merge request pipelines in the same job without
+[`workflow:rules` that prevent duplicate pipelines](#switch-between-branch-pipelines-and-merge-request-pipelines):
```yaml
job:
@@ -1192,22 +1167,13 @@ runs the other job (`job-with-rules`). Jobs with no rules default
to [`except: merge_requests`](#onlyexcept-basic), so `job-with-no-rules`
runs in all cases except merge requests.
-It is not possible to define rules based on whether or not a branch has an open
-merge request associated with it. You can't configure a job to be included in:
-
-- Only branch pipelines when the branch doesn't have a merge request associated with it.
-- Only merge request pipelines when the branch has a merge request associated with it.
-
-See the [related issue](https://gitlab.com/gitlab-org/gitlab/-/issues/201845) for more details.
-
#### `rules:if`
-`rules:if` clauses determine whether or not jobs are added to a pipeline by evaluating
-an `if` statement. If the `if` statement is true, the job is either included
-or excluded from a pipeline. In plain English, `if` rules can be interpreted as one of:
+Use `rules:if` clauses to specify when to add a job to a pipeline:
-- "If this rule evaluates to true, add the job" (default).
-- "If this rule evaluates to true, do not add the job" (by adding `when: never`).
+- If an `if` statement is true, add the job to the pipeline.
+- If an `if` statement is true, but it's combined with `when: never`, do not add the job to the pipeline.
+- If no `if` statements are true, do not add the job to the pipeline.
`rules:if` differs slightly from `only:variables` by accepting only a single
expression string per rule, rather than an array of them. Any set of expressions to be
@@ -1265,7 +1231,9 @@ check the value of the `$CI_PIPELINE_SOURCE` variable:
| `web` | For pipelines created by using **Run pipeline** button in the GitLab UI, from the project's **CI/CD > Pipelines** section. |
| `webide` | For pipelines created by using the [WebIDE](../../user/project/web_ide/index.md). |
-For example:
+The following example runs the job as a manual job in scheduled pipelines or in push
+pipelines (to branches or tags), with `when: on_success` (default). It does not
+add the job to any other pipeline type.
```yaml
job:
@@ -1277,11 +1245,8 @@ job:
- if: '$CI_PIPELINE_SOURCE == "push"'
```
-This example runs the job as a manual job in scheduled pipelines or in push
-pipelines (to branches or tags), with `when: on_success` (default). It does not
-add the job to any other pipeline type.
-
-Another example:
+The following example runs the job as a `when: on_success` job in [merge request pipelines](../merge_request_pipelines/index.md)
+and scheduled pipelines. It does not run in any other pipeline type.
```yaml
job:
@@ -1291,16 +1256,13 @@ job:
- if: '$CI_PIPELINE_SOURCE == "schedule"'
```
-This example runs the job as a `when: on_success` job in [merge request pipelines](../merge_request_pipelines/index.md)
-and scheduled pipelines. It does not run in any other pipeline type.
-
Other commonly used variables for `if` clauses:
- `if: $CI_COMMIT_TAG`: If changes are pushed for a tag.
- `if: $CI_COMMIT_BRANCH`: If changes are pushed to any branch.
-- `if: '$CI_COMMIT_BRANCH == "master"'`: If changes are pushed to `master`.
+- `if: '$CI_COMMIT_BRANCH == "main"'`: If changes are pushed to `main`.
- `if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'`: If changes are pushed to the default
- branch (usually `master`). Use when you want to have the same configuration in multiple
+ branch. Use when you want to have the same configuration in multiple
projects with different default branches.
- `if: '$CI_COMMIT_BRANCH =~ /regex-expression/'`: If the commit branch matches a regular expression.
- `if: '$CUSTOM_VARIABLE !~ /regex-expression/'`: If the [custom variable](../variables/README.md#custom-cicd-variables)
@@ -1310,11 +1272,11 @@ Other commonly used variables for `if` clauses:
#### `rules:changes`
-`rules:changes` determines whether or not to add jobs to a pipeline by checking for
+Use `rules:changes` to specify when to add a job to a pipeline by checking for
changes to specific files.
-`rules: changes` works exactly the same way as [`only: changes` and `except: changes`](#onlychangesexceptchanges),
-accepting an array of paths. It's recommended to only use `rules: changes` with branch
+`rules: changes` works the same way as [`only: changes` and `except: changes`](#onlychangesexceptchanges).
+It accepts an array of paths. You should use `rules: changes` only with branch
pipelines or merge request pipelines. For example, it's common to use `rules: changes`
with merge request pipelines:
@@ -1337,7 +1299,7 @@ In this example:
- If `Dockerfile` has not changed, do not add job to any pipeline (same as `when: never`).
To use `rules: changes` with branch pipelines instead of merge request pipelines,
-change the `if:` clause in the example above to:
+change the `if:` clause in the previous example to:
```yaml
rules:
@@ -1359,7 +1321,7 @@ if there is no `if:` statement that limits the job to branch or merge request pi
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/34272) in GitLab 13.6.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/267192) in GitLab 13.7.
-CI/CD variables can be used in `rules:changes` expressions to determine when
+You can use CI/CD variables in `rules:changes` expressions to determine when
to add jobs to a pipeline:
```yaml
@@ -1372,7 +1334,7 @@ docker build:
- $DOCKERFILES_DIR/*
```
-You can use The `$` character for both variables and paths. For example, if the
+You can use the `$` character for both variables and paths. For example, if the
`$DOCKERFILES_DIR` variable exists, its value is used. If it does not exist, the
`$` is interpreted as being part of a path.
@@ -1380,10 +1342,10 @@ You can use The `$` character for both variables and paths. For example, if the
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/24021) in GitLab 12.4.
-`exists` accepts an array of paths and matches if any of these paths exist
-as files in the repository.
+Use `exists` to run a job when certain files exist in the repository.
+You can use an array of paths.
-In this example, `job` runs if a `Dockerfile` exists anywhere in the repository:
+In the following example, `job` runs if a `Dockerfile` exists anywhere in the repository:
```yaml
job:
@@ -1416,11 +1378,11 @@ For performance reasons, GitLab matches a maximum of 10,000 `exists` patterns. A
You can use [`allow_failure: true`](#allow_failure) in `rules:` to allow a job to fail, or a manual job to
wait for action, without stopping the pipeline itself. All jobs that use `rules:` default to `allow_failure: false`
-if `allow_failure:` is not defined.
+if you do not define `allow_failure:`.
The rule-level `rules:allow_failure` option overrides the job-level
-[`allow_failure`](#allow_failure) option, and is only applied when the job is
-triggered by the particular rule.
+[`allow_failure`](#allow_failure) option, and is only applied when
+the particular rule triggers the job.
```yaml
job:
@@ -1436,16 +1398,9 @@ In this example, if the first rule matches, then the job has `when: manual` and
#### `rules:variables`
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/209864) in GitLab 13.7.
-> - It was [deployed behind a feature flag](../../user/feature_flags.md), disabled by default.
-> - [Became enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/289803) on GitLab 13.8.
-> - It's enabled on GitLab.com.
-> - It's recommended for production use.
-> - For GitLab self-managed instances, GitLab administrators can opt to [disable it](#enable-or-disable-rulesvariables). **(FREE SELF)**
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/289803) in GitLab 13.10.
-WARNING:
-This feature might not be available to you. Check the **version history** note above for details.
-
-You can use [`variables`](#variables) in `rules:` to define variables for specific conditions.
+Use [`variables`](#variables) in `rules:` to define variables for specific conditions.
For example:
@@ -1465,25 +1420,6 @@ job:
- echo "Run another script if $IS_A_FEATURE exists"
```
-##### Enable or disable rules:variables **(FREE SELF)**
-
-rules:variables is under development but ready for production use.
-It is deployed behind a feature flag that is **enabled by default**.
-[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
-can opt to disable it.
-
-To enable it:
-
-```ruby
-Feature.enable(:ci_rules_variables)
-```
-
-To disable it:
-
-```ruby
-Feature.disable(:ci_rules_variables)
-```
-
#### Complex rule clauses
To conjoin `if`, `changes`, and `exists` clauses with an `AND`, use them in the
@@ -1540,14 +1476,14 @@ to add jobs to pipelines, use [`rules`](#rules).
1. `except` defines the names of branches and tags the job does
**not** run for.
-There are a few rules that apply to the usage of job policy:
+A few rules apply to the usage of job policy:
- `only` and `except` are inclusive. If both `only` and `except` are defined
in a job specification, the ref is filtered by `only` and `except`.
- `only` and `except` can use regular expressions ([supported regexp syntax](#supported-onlyexcept-regexp-syntax)).
- `only` and `except` can specify a repository path to filter jobs for forks.
-In addition, `only` and `except` can use special keywords:
+In addition, `only` and `except` can use these keywords:
| **Value** | **Description** |
|--------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
@@ -1568,8 +1504,8 @@ Scheduled pipelines run on specific branches, so jobs configured with `only: bra
run on scheduled pipelines too. Add `except: schedules` to prevent jobs with `only: branches`
from running on scheduled pipelines.
-In the example below, `job` runs only for refs that start with `issue-`,
-whereas all branches are skipped:
+In the following example, `job` runs only for refs that start with `issue-`.
+All branches are skipped:
```yaml
job:
@@ -1581,8 +1517,8 @@ job:
- branches
```
-Pattern matching is case-sensitive by default. Use `i` flag modifier, like
-`/pattern/i` to make a pattern case-insensitive:
+Pattern matching is case-sensitive by default. Use the `i` flag modifier, like
+`/pattern/i`, to make a pattern case-insensitive:
```yaml
job:
@@ -1594,8 +1530,11 @@ job:
- branches
```
-In this example, `job` runs only for refs that are tagged, or if a build is
-explicitly requested by an API trigger or a [Pipeline Schedule](../pipelines/schedules.md):
+In the following example, `job` runs only for:
+
+- Git tags
+- [Triggers](../triggers/README.md#trigger-token)
+- [Scheduled pipelines](../pipelines/schedules.md)
```yaml
job:
@@ -1606,8 +1545,7 @@ job:
- schedules
```
-Use the repository path to have jobs executed only for the parent
-repository and not forks:
+To execute jobs only for the parent repository and not forks:
```yaml
job:
@@ -1618,11 +1556,11 @@ job:
- /^release/.*$/@gitlab-org/gitlab
```
-The above example runs `job` for all branches on `gitlab-org/gitlab`,
-except `master` and those with names prefixed with `release/`.
+This example runs `job` for all branches on `gitlab-org/gitlab`,
+except `master` and branches that start with `release/`.
If a job does not have an `only` rule, `only: ['branches', 'tags']` is set by
-default. If it does not have an `except` rule, it's empty.
+default. If the job does not have an `except` rule, it's empty.
For example, `job1` and `job2` are essentially the same:
@@ -1698,7 +1636,7 @@ the pipeline if the following is true:
- `(any listed refs are true) AND (any listed variables are true) AND (any listed changes are true) AND (any chosen Kubernetes status matches)`
-In the example below, the `test` job is `only` created when **all** of the following are true:
+In the following example, the `test` job is `only` created when **all** of the following are true:
- The pipeline is [scheduled](../pipelines/schedules.md) **or** runs for `master`.
- The `variables` keyword matches.
@@ -1721,7 +1659,7 @@ added if the following is true:
- `(any listed refs are true) OR (any listed variables are true) OR (any listed changes are true) OR (a chosen Kubernetes status matches)`
-In the example below, the `test` job is **not** created when **any** of the following are true:
+In the following example, the `test` job is **not** created when **any** of the following are true:
- The pipeline runs for the `master` branch.
- There are changes to the `README.md` file in the root directory of the repository.
@@ -1743,7 +1681,7 @@ test:
The `refs` strategy can take the same values as the
[simplified only/except configuration](#onlyexcept-basic).
-In the example below, the `deploy` job is created only when the
+In the following example, the `deploy` job is created only when the
pipeline is [scheduled](../pipelines/schedules.md) or runs for the `master` branch:
```yaml
@@ -1760,7 +1698,7 @@ deploy:
The `kubernetes` strategy accepts only the `active` keyword.
-In the example below, the `deploy` job is created only when the
+In the following example, the `deploy` job is created only when the
Kubernetes service is active in the project:
```yaml
@@ -1831,7 +1769,7 @@ In pipelines with [sources other than the three above](../variables/predefined_v
You can configure jobs to use `only: changes` with other `only: refs` keywords. However,
those jobs ignore the changes and always run.
-In this example, when you push commits to an existing branch, the `docker build` job
+In the following example, when you push commits to an existing branch, the `docker build` job
runs only if any of these files change:
- The `Dockerfile` file.
@@ -1928,7 +1866,7 @@ docker build service one:
- service-one/**/*
```
-In the example above, the pipeline might fail because of changes to a file in `service-one/**/*`.
+In this example, the pipeline might fail because of changes to a file in `service-one/**/*`.
A later commit that doesn't have changes in `service-one/**/*`
but does have changes to the `Dockerfile` can pass. The job
@@ -1962,13 +1900,22 @@ All files are considered to have changed when a scheduled pipeline runs.
> - In GitLab 12.3, maximum number of jobs in `needs` array raised from five to 50.
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/30631) in GitLab 12.8, `needs: []` lets jobs start immediately.
-Use the `needs:` keyword to execute jobs out-of-order. Relationships between jobs
+Use `needs:` to execute jobs out-of-order. Relationships between jobs
that use `needs` can be visualized as a [directed acyclic graph](../directed_acyclic_graph/index.md).
You can ignore stage ordering and run some jobs without waiting for others to complete.
Jobs in multiple stages can run concurrently.
-Let's consider the following example:
+The following example creates four paths of execution:
+
+- Linter: the `lint` job runs immediately without waiting for the `build` stage
+ to complete because it has no needs (`needs: []`).
+- Linux path: the `linux:rspec` and `linux:rubocop` jobs runs as soon as the `linux:build`
+ job finishes without waiting for `mac:build` to finish.
+- macOS path: the `mac:rspec` and `mac:rubocop` jobs runs as soon as the `mac:build`
+ job finishes, without waiting for `linux:build` to finish.
+- The `production` job runs as soon as all previous jobs finish; in this case:
+ `linux:build`, `linux:rspec`, `linux:rubocop`, `mac:build`, `mac:rspec`, `mac:rubocop`.
```yaml
linux:build:
@@ -2001,20 +1948,6 @@ production:
stage: deploy
```
-This example creates four paths of execution:
-
-- Linter: the `lint` job runs immediately without waiting for the `build` stage to complete because it has no needs (`needs: []`).
-
-- Linux path: the `linux:rspec` and `linux:rubocop` jobs runs as soon
- as the `linux:build` job finishes without waiting for `mac:build` to finish.
-
-- macOS path: the `mac:rspec` and `mac:rubocop` jobs runs as soon
- as the `mac:build` job finishes, without waiting for `linux:build` to finish.
-
-- The `production` job runs as soon as all previous jobs
- finish; in this case: `linux:build`, `linux:rspec`, `linux:rubocop`,
- `mac:build`, `mac:rspec`, `mac:rubocop`.
-
#### Requirements and limitations
- If `needs:` is set to point to a job that is not instantiated
@@ -2031,7 +1964,7 @@ This example creates four paths of execution:
- `needs:` is similar to `dependencies:` in that it must use jobs from prior stages,
meaning it's impossible to create circular dependencies. Depending on jobs in the
current stage is not possible either, but support [is planned](https://gitlab.com/gitlab-org/gitlab/-/issues/30632).
-- Related to the above, stages must be explicitly defined for all jobs
+- Stages must be explicitly defined for all jobs
that have the keyword `needs:` or are referred to by one.
##### Changing the `needs:` job limit **(FREE SELF)**
@@ -2054,7 +1987,7 @@ To disable directed acyclic graphs (DAG), set the limit to `0`.
Use `artifacts: true` (default) or `artifacts: false` to control when artifacts are
downloaded in jobs that use `needs`.
-In this example, the `rspec` job downloads the `build_job` artifacts, but the
+In the following example, the `rspec` job downloads the `build_job` artifacts, but the
`rubocop` job does not:
```yaml
@@ -2077,7 +2010,7 @@ rubocop:
artifacts: false
```
-In this example, the `rspec` job downloads the artifacts from all three `build_jobs`.
+In the following example, the `rspec` job downloads the artifacts from all three `build_jobs`.
`artifacts` is:
- Set to true for `build_job_1`.
@@ -2128,7 +2061,7 @@ The user running the pipeline must have at least `reporter` access to the group
Use `needs` to download artifacts from different pipelines in the current project.
Set the `project` keyword as the current project's name, and specify a ref.
-In this example, `build_job` downloads the artifacts for the latest successful
+In the following example, `build_job` downloads the artifacts for the latest successful
`build-1` job with the `other-ref` ref:
```yaml
@@ -2160,12 +2093,13 @@ build_job:
artifacts: true
```
-Downloading artifacts from jobs that are run in [`parallel:`](#parallel) is not supported.
+You can't download artifacts from jobs that run in [`parallel:`](#parallel).
+
+To download artifacts between [parent-child pipelines](../parent_child_pipelines.md),
+use [`needs:pipeline`](#artifact-downloads-to-child-pipelines).
-To download artifacts between [parent-child pipelines](../parent_child_pipelines.md) use [`needs:pipeline`](#artifact-downloads-to-child-pipelines).
-Downloading artifacts from the same ref as the currently running pipeline is not
-recommended because artifacts could be overridden by concurrent pipelines running
-on the same ref.
+You should not download artifacts from the same ref as a running pipeline. Concurrent
+pipelines running on the same ref could override the artifacts.
##### Artifact downloads to child pipelines
@@ -2217,7 +2151,7 @@ available for the project.
When you register a runner, you can specify the runner's tags, for
example `ruby`, `postgres`, `development`.
-In this example, the job is run by a runner that
+In the following example, the job is run by a runner that
has both `ruby` and `postgres` tags defined.
```yaml
@@ -2266,7 +2200,7 @@ Assuming all other jobs are successful, the job's stage and its pipeline
show the same orange warning. However, the associated commit is marked as
"passed", without warnings.
-In the example below, `job1` and `job2` run in parallel, but if `job1`
+In the following example, `job1` and `job2` run in parallel. If `job1`
fails, it doesn't stop the next stage from running, because it's marked with
`allow_failure: true`:
@@ -2331,9 +2265,14 @@ The valid values of `when` are:
Added in GitLab 11.14.
1. `never`:
- With [`rules`](#rules), don't execute job.
- - With [`workflow:rules`](#workflowrules), don't run pipeline.
+ - With [`workflow`](#workflow), don't run pipeline.
-For example:
+In the following example, the script:
+
+1. Executes `cleanup_build_job` only when `build_job` fails.
+1. Always executes `cleanup_job` as the last step in pipeline regardless of
+ success or failure.
+1. Executes `deploy_job` when you run it manually in the GitLab UI.
```yaml
stages:
@@ -2372,13 +2311,6 @@ cleanup_job:
when: always
```
-The above script:
-
-1. Executes `cleanup_build_job` only when `build_job` fails.
-1. Always executes `cleanup_job` as the last step in pipeline regardless of
- success or failure.
-1. Executes `deploy_job` when you run it manually in the GitLab UI.
-
#### `when:manual`
A manual job is a type of job that is not executed automatically and must be explicitly
@@ -2386,7 +2318,8 @@ started by a user. You might want to use manual jobs for things like deploying t
To make a job manual, add `when: manual` to its configuration.
-Manual jobs can be started from the pipeline, job, [environment](../environments/index.md#configuring-manual-deployments),
+When the pipeline starts, manual jobs display as skipped and do not run automatically.
+They can be started from the pipeline, job, [environment](../environments/index.md#configure-manual-deployments),
and deployment views.
Manual jobs can be either optional or blocking:
@@ -2441,7 +2374,7 @@ To protect a manual job:
```
1. In the [protected environments settings](../environments/protected_environments.md#protecting-environments),
- select the environment (`production` in the example above) and add the users, roles or groups
+ select the environment (`production` in this example) and add the users, roles or groups
that are authorized to trigger the manual job to the **Allowed to Deploy** list. Only those in
this list can trigger this manual job, as well as GitLab administrators
who are always able to use protected environments.
@@ -2492,10 +2425,7 @@ Soon GitLab Runner picks up and starts the job.
### `environment`
Use `environment` to define the [environment](../environments/index.md) that a job deploys to.
-If `environment` is specified and no environment under that name exists, a new
-one is created automatically.
-
-In its simplest form, the `environment` keyword can be defined like:
+For example:
```yaml
deploy to production:
@@ -2504,34 +2434,20 @@ deploy to production:
environment: production
```
-In the above example, the `deploy to production` job is marked as doing a
-deployment to the `production` environment.
-
-#### `environment:name`
+You can assign a value to the `environment` keyword by using:
-The `environment: name` keyword can use any of the defined CI/CD [variables](#variables),
-including predefined, secure, or variables defined in the `.gitlab-ci.yml` file.
+- Plain text, like `production`.
+- Variables, including CI/CD variables, predefined, secure, or variables
+ defined in the `.gitlab-ci.yml` file.
You can't use variables defined in a `script` section.
-The `environment` name can contain:
+If you specify an `environment` and no environment with that name exists,
+an environment is created.
-- letters
-- digits
-- spaces
-- `-`
-- `_`
-- `/`
-- `$`
-- `{`
-- `}`
-
-Common names are `qa`, `staging`, and `production`, but you can use whatever
-name works with your workflow.
+#### `environment:name`
-Instead of defining the name of the environment right after the `environment`
-keyword, it's also possible to define it as a separate value. For that, use
-the `name` keyword under `environment`:
+Set a name for an [environment](../environments/index.md). For example:
```yaml
deploy to production:
@@ -2541,18 +2457,32 @@ deploy to production:
name: production
```
-#### `environment:url`
+Common environment names are `qa`, `staging`, and `production`, but you can use any
+name you want.
+
+You can assign a value to the `name` keyword by using:
-The `environment:url` keyword can use any of the defined CI/CD [variables](#variables),
-including predefined, secure, or variables defined in the `.gitlab-ci.yml` file.
+- Plain text, like `staging`.
+- Variables, including CI/CD variables, predefined, secure, or variables
+ defined in the `.gitlab-ci.yml` file.
You can't use variables defined in a `script` section.
-This optional value exposes buttons that take you to the defined URL
+The environment `name` can contain:
+
+- Letters
+- Digits
+- Spaces
+- `-`
+- `_`
+- `/`
+- `$`
+- `{`
+- `}`
+
+#### `environment:url`
-In this example, if the job finishes successfully, it creates buttons
-in the merge requests and in the environments/deployments pages that point
-to `https://prod.example.com`.
+Set a URL for an [environment](../environments/index.md). For example:
```yaml
deploy to production:
@@ -2563,12 +2493,18 @@ deploy to production:
url: https://prod.example.com
```
-#### `environment:on_stop`
+After the job completes, you can access the URL by using a button in the merge request,
+environment, or deployment pages.
+
+You can assign a value to the `url` keyword by using:
+
+- Plain text, like `https://prod.example.com`.
+- Variables, including CI/CD variables, predefined, secure, or variables
+ defined in the `.gitlab-ci.yml` file.
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/22191) in GitLab 8.13.
-> - Starting with GitLab 8.14, when you have an environment that has a stop action
-> defined, GitLab automatically triggers a stop action when the associated
-> branch is deleted.
+You can't use variables defined in a `script` section.
+
+#### `environment:on_stop`
Closing (stopping) environments can be achieved with the `on_stop` keyword
defined under `environment`. It declares a different job that runs to close the
@@ -2578,8 +2514,6 @@ Read the `environment:action` section for an example.
#### `environment:action`
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/22191) in GitLab 8.13.
-
Use the `action` keyword to specify jobs that prepare, start, or stop environments.
| **Value** | **Description** |
@@ -2618,7 +2552,7 @@ it is set to `manual`, so it needs a [manual action](#whenmanual) from
the GitLab UI to run.
Also in the example, `GIT_STRATEGY` is set to `none`. If the
-`stop_review_app` job is [automatically triggered](../environments/index.md#automatically-stopping-an-environment),
+`stop_review_app` job is [automatically triggered](../environments/index.md#stopping-an-environment),
the runner won’t try to check out the code after the branch is deleted.
The example also overwrites global variables. If your `stop` `environment` job depends
@@ -2627,14 +2561,18 @@ to change the job without overriding the global variables.
The `stop_review_app` job is **required** to have the following keywords defined:
-- `when` - [reference](#when)
+- `when`, defined at either:
+ - [The job level](#when).
+ - [In a rules clause](#rules). If you use `rules:` and `when: manual`, you should
+ also set [`allow_failure: true`](#allow_failure) so the pipeline can complete
+ even if the job doesn't run.
- `environment:name`
- `environment:action`
Additionally, both jobs should have matching [`rules`](../yaml/README.md#onlyexcept-basic)
or [`only/except`](../yaml/README.md#onlyexcept-basic) configuration.
-In the example above, if the configuration is not identical:
+In the examples above, if the configuration is not identical:
- The `stop_review_app` job might not be included in all pipelines that include the `review_app` job.
- It is not possible to trigger the `action: stop` to stop the environment automatically.
@@ -2660,7 +2598,7 @@ When the environment for `review_app` is created, the environment's lifetime is
Every time the review app is deployed, that lifetime is also reset to `1 day`.
For more information, see
-[the environments auto-stop documentation](../environments/index.md#environments-auto-stop)
+[the environments auto-stop documentation](../environments/index.md#stop-an-environment-after-a-certain-time-period)
#### `environment:kubernetes`
@@ -2686,7 +2624,7 @@ environment, using the `production`
[Kubernetes namespace](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/).
For more information, see
-[Available settings for `kubernetes`](../environments/index.md#configuring-kubernetes-deployments).
+[Available settings for `kubernetes`](../environments/index.md#configure-kubernetes-deployments).
NOTE:
Kubernetes configuration is not supported for Kubernetes clusters
@@ -2722,7 +2660,7 @@ as Review Apps. You can see an example that uses Review Apps at
### `cache`
-Use the `cache` keyword to specify a list of files and directories to
+Use `cache` to specify a list of files and directories to
cache between jobs. You can only use paths that are in the local working copy.
If `cache` is defined outside the scope of jobs, it's set
@@ -2812,7 +2750,62 @@ URI-encoded `%2F`. A value made only of dots (`.`, `%2E`) is also forbidden.
You can specify a [fallback cache key](#fallback-cache-key) to use if the specified `cache:key` is not found.
-##### Fallback cache key
+##### Multiple caches
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/32814) in GitLab 13.10.
+> - It's [deployed behind a feature flag](../../user/feature_flags.md), disabled by default.
+> - It's disabled on GitLab.com.
+> - It's not recommended for production use.
+> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-multiple-caches). **(FREE SELF)**
+
+WARNING:
+This feature might not be available to you. Check the **version history** note above for details.
+
+You can have a maximum of four caches:
+
+```yaml
+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...
+```
+
+If multiple caches are combined with a [Fallback cache key](#fallback-cache-key),
+the fallback is fetched multiple times if multiple caches are not found.
+
+##### Enable or disable multiple caches **(FREE SELF)**
+
+The multiple caches 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.
+
+To enable it:
+
+```ruby
+Feature.enable(:multiple_cache_per_job)
+```
+
+To disable it:
+
+```ruby
+Feature.disable(:multiple_cache_per_job)
+```
+
+#### Fallback cache key
> [Introduced](https://gitlab.com/gitlab-org/gitlab-runner/-/merge_requests/1534) in GitLab Runner 13.4.
@@ -2823,7 +2816,7 @@ to download cache that's tagged with `test`.
If a cache with this tag is not found, you can use `CACHE_FALLBACK_KEY` to
specify a cache to use when none exists.
-In this example, if the `$CI_COMMIT_REF_SLUG` is not found, the job uses the key defined
+In the following example, if the `$CI_COMMIT_REF_SLUG` is not found, the job uses the key defined
by the `CACHE_FALLBACK_KEY` variable:
```yaml
@@ -2860,7 +2853,7 @@ cache:
- node_modules
```
-In this example we're creating a cache for Ruby and Node.js dependencies that
+This example creates a cache for Ruby and Node.js dependencies that
is tied to current versions of the `Gemfile.lock` and `package.json` files. Whenever one of
these files changes, a new cache key is computed and a new cache is created. Any future
job runs that use the same `Gemfile.lock` and `package.json` with `cache:key:files`
@@ -2994,7 +2987,7 @@ To do so, add `policy: push` to the job.
### `artifacts`
-Use the `artifacts` keyword to specify a list of files and directories that are
+Use `artifacts` to specify a list of files and directories that are
attached to the job when it [succeeds, fails, or always](#artifactswhen).
The artifacts are sent to GitLab after the job finishes. They are
@@ -3461,8 +3454,7 @@ for more details.
### `retry`
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/3442) in GitLab 9.5.
-> - [Behavior expanded](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/3515) in GitLab 11.5 to control which failures to retry on.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/3515) in GitLab 11.5, you can control which failures to retry on.
Use `retry` to configure how many times a job is retried in
case of a failure.
@@ -3474,7 +3466,7 @@ If `retry` is set to `2`, and a job succeeds in a second run (first retry), it i
The `retry` value must be a positive integer, from `0` to `2`
(two retries maximum, three runs in total).
-This example retries all failure cases:
+The following example retries all failure cases:
```yaml
test:
@@ -3636,7 +3628,7 @@ deploystacks:
STACK: [data, processing]
```
-This example generates 10 parallel `deploystacks` jobs, each with different values
+The following example generates 10 parallel `deploystacks` jobs, each with different values
for `PROVIDER` and `STACK`:
```plaintext
@@ -3821,6 +3813,10 @@ To force the `trigger` job to wait for the downstream (multi-project or child) p
pipeline completes. At that point, the `trigger` job completes and displays the same status as
the downstream job.
+This setting can help keep your pipeline execution linear. In the following example, jobs from
+subsequent stages wait for the triggered pipeline to successfully complete before
+starting, which reduces parallelization.
+
```yaml
trigger_job:
trigger:
@@ -3828,10 +3824,6 @@ trigger_job:
strategy: depend
```
-This setting can help keep your pipeline execution linear. In the example above, jobs from
-subsequent stages wait for the triggered pipeline to successfully complete before
-starting, which reduces parallelization.
-
#### Trigger a pipeline by API call
To force a rebuild of a specific branch, tag, or commit, you can use an API call
@@ -3858,7 +3850,12 @@ When enabled, a pipeline is immediately canceled when a new pipeline starts on t
Set jobs as interruptible that can be safely canceled once started (for instance, a build job).
-For example:
+In the following example, a new pipeline run causes an existing running pipeline to be:
+
+- Canceled, if only `step-1` is running or pending.
+- Not canceled, once `step-2` starts running.
+
+After an uninterruptible job starts running, the pipeline cannot be canceled.
```yaml
stages:
@@ -3884,13 +3881,6 @@ step-3:
interruptible: true
```
-In the example above, a new pipeline run causes an existing running pipeline to be:
-
-- Canceled, if only `step-1` is running or pending.
-- Not canceled, once `step-2` starts running.
-
-When an uninterruptible job is running, the pipeline cannot be canceled, regardless of the final job's state.
-
### `resource_group`
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/15536) in GitLab 12.7.
@@ -3937,7 +3927,7 @@ executions. The [`trigger` keyword](#trigger) can trigger downstream pipelines.
[`resource_group` keyword](#resource_group) can co-exist with it. This is useful to control the
concurrency for deployment pipelines, while running non-sensitive jobs concurrently.
-This example has two pipeline configurations in a project. When a pipeline starts running,
+The following example has two pipeline configurations in a project. When a pipeline starts running,
non-sensitive jobs are executed first and aren't affected by concurrent executions in other
pipelines. However, GitLab ensures that there are no other deployment pipelines running before
triggering a deployment (child) pipeline. If other deployment pipelines are running, GitLab waits
@@ -3978,7 +3968,7 @@ deployment:
script: echo "Deploying..."
```
-Note that you must define [`strategy: depend`](#linking-pipelines-with-triggerstrategy)
+You must define [`strategy: depend`](#linking-pipelines-with-triggerstrategy)
with the `trigger` keyword. This ensures that the lock isn't released until the downstream pipeline
finishes.
@@ -3986,7 +3976,7 @@ finishes.
> [Introduced](https://gitlab.com/gitlab-org/gitlab/merge_requests/19298) in GitLab 13.2.
-`release` indicates that the job creates a [Release](../../user/project/releases/index.md).
+Use `release` to create a [release](../../user/project/releases/index.md).
These keywords are supported:
@@ -3997,18 +3987,18 @@ These keywords are supported:
- [`milestones`](#releasemilestones) (optional)
- [`released_at`](#releasereleased_at) (optional)
-The Release is created only if the job processes without error. If the Rails API
-returns an error during Release creation, the `release` job fails.
+The release is created only if the job processes without error. If the Rails API
+returns an error during release creation, the `release` job fails.
#### `release-cli` Docker image
-The Docker image to use for the `release-cli` must be specified, using the following directive:
+You must specify the Docker image to use for the `release-cli`:
```yaml
image: registry.gitlab.com/gitlab-org/release-cli:latest
```
-#### Script
+#### `script`
All jobs except [trigger](#trigger) jobs must have the `script` keyword. A `release`
job can use the output from script commands, but you can use a placeholder script if
@@ -4041,11 +4031,12 @@ android-release:
#### `release:tag_name`
-The `tag_name` must be specified. It can refer to an existing Git tag or can be specified by the user.
+You must specify a `tag_name` for the release. The tag can refer to an existing Git tag or
+you can specify a new tag.
When the specified tag doesn't exist in the repository, a new tag is created from the associated SHA of the pipeline.
-For example, when creating a Release from a Git tag:
+For example, when creating a release from a Git tag:
```yaml
job:
@@ -4064,17 +4055,17 @@ job:
description: 'Release description'
```
-- The Release is created only if the job's main script succeeds.
-- If the Release already exists, it is not updated and the job with the `release` keyword fails.
+- The release is created only if the job's main script succeeds.
+- If the release already exists, it is not updated and the job with the `release` keyword fails.
- The `release` section executes after the `script` tag and before the `after_script`.
#### `release:name`
-The Release name. If omitted, it is populated with the value of `release: tag_name`.
+The release name. If omitted, it is populated with the value of `release: tag_name`.
#### `release:description`
-Specifies the long description of the Release. You can also specify a file that contains the
+Specifies the long description of the release. You can also specify a file that contains the
description.
##### Read description from a file
@@ -4112,8 +4103,7 @@ released_at: '2021-03-15T08:00:00Z'
#### Complete example for `release`
-Combining the individual examples given above for `release` results in the following
-code snippets. There are two options, depending on how you generate the
+If you combine the previous examples for `release`, you get two options, depending on how you generate the
tags. You can't use these options together, so choose one:
- To create a release when you push a Git tag, or when you add a Git tag
@@ -4197,7 +4187,7 @@ The entries under the `release` node are transformed into a `bash` command line
to the Docker container, which contains the [release-cli](https://gitlab.com/gitlab-org/release-cli).
You can also call the `release-cli` directly from a `script` entry.
-For example, using the YAML described above:
+For example, if you use the YAML described previously:
```shell
release-cli create --name "Release $CI_COMMIT_SHA" --description "Created using the release-cli $EXTRA_DESCRIPTION" --tag-name "v${MAJOR}.${MINOR}.${REVISION}" --ref "$CI_COMMIT_SHA" --released-at "2020-07-15T08:00:00Z" --milestone "m1" --milestone "m2" --milestone "m3"
@@ -4207,7 +4197,7 @@ release-cli create --name "Release $CI_COMMIT_SHA" --description "Created using
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/33014) in GitLab 13.4.
-`secrets` indicates the [CI/CD Secrets](../secrets/index.md) this job needs. It should be a hash,
+Use `secrets` to specify the [CI/CD Secrets](../secrets/index.md) the job needs. It should be a hash,
and the keys should be the names of the variables that are made available to the job.
The value of each secret is saved in a temporary file. This file's path is stored in these
variables.
@@ -4216,7 +4206,8 @@ variables.
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/28321) in GitLab 13.4.
-`vault` keyword specifies secrets provided by [Hashicorp's Vault](https://www.vaultproject.io/).
+Use `vault` to specify secrets provided by [Hashicorp's Vault](https://www.vaultproject.io/).
+
This syntax has multiple forms. The shortest form assumes the use of the
[KV-V2](https://www.vaultproject.io/docs/secrets/kv/kv-v2) secrets engine,
mounted at the default path `kv-v2`. The last part of the secret's path is the
@@ -4254,14 +4245,13 @@ job:
### `pages`
-`pages` is a special job that uploads static content to GitLab that
-is then published as a website. It has a special syntax, so the two
-requirements below must be met:
+Use `pages` to upload static content to GitLab. The content
+is then published as a website. You must:
-- Any static content must be placed under a `public/` directory.
-- `artifacts` with a path to the `public/` directory must be defined.
+- Place any static content in a `public/` directory.
+- Define [`artifacts`](#artifacts) with a path to the `public/` directory.
-The example below moves all files from the root of the project to the
+The following example moves all files from the root of the project to the
`public/` directory. The `.public` workaround is so `cp` does not also copy
`public/` to itself in an infinite loop:
@@ -4279,7 +4269,89 @@ pages:
- master
```
-Read more on [GitLab Pages user documentation](../../user/project/pages/index.md).
+View the [GitLab Pages user documentation](../../user/project/pages/index.md).
+
+### `inherit`
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/207484) in GitLab 12.9.
+
+Use `inherit:` to control inheritance of globally-defined defaults
+and variables.
+
+To enable or disable the inheritance of all `default:` or `variables:` keywords, use:
+
+- `default: true` or `default: false`
+- `variables: true` or `variables: false`
+
+To inherit only a subset of `default:` keywords or `variables:`, specify what
+you wish to inherit. Anything not listed is **not** inherited. Use
+one of the following formats:
+
+```yaml
+inherit:
+ default: [keyword1, keyword2]
+ variables: [VARIABLE1, VARIABLE2]
+```
+
+Or:
+
+```yaml
+inherit:
+ default:
+ - keyword1
+ - keyword2
+ variables:
+ - VARIABLE1
+ - VARIABLE2
+```
+
+In the following example:
+
+- `rubocop`:
+ - inherits: Nothing.
+- `rspec`:
+ - inherits: the default `image` and the `WEBHOOK_URL` variable.
+ - does **not** inherit: the default `before_script` and the `DOMAIN` variable.
+- `capybara`:
+ - inherits: the default `before_script` and `image`.
+ - does **not** inherit: the `DOMAIN` and `WEBHOOK_URL` variables.
+- `karma`:
+ - inherits: the default `image` and `before_script`, and the `DOMAIN` variable.
+ - does **not** inherit: `WEBHOOK_URL` variable.
+
+```yaml
+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
+```
## `variables`
@@ -4337,7 +4409,7 @@ You can use [YAML anchors for variables](#yaml-anchors-for-variables).
> [Introduced in](https://gitlab.com/gitlab-org/gitlab/-/issues/30101) GitLab 13.7.
-You can use the `value` and `description` keywords to define [variables that are prefilled](../pipelines/index.md#prefill-variables-in-manual-pipelines)
+Use the `value` and `description` keywords to define [variables that are prefilled](../pipelines/index.md#prefill-variables-in-manual-pipelines)
when [running a pipeline manually](../pipelines/index.md#run-a-pipeline-manually):
```yaml
@@ -4349,7 +4421,7 @@ variables:
### Configure runner behavior with variables
-You can use [CI/CD variables](../variables/README.md) to configure runner Git behavior:
+You can use [CI/CD variables](../variables/README.md) to configure how the runner processes Git requests:
- [`GIT_STRATEGY`](../runners/README.md#git-strategy)
- [`GIT_SUBMODULE_STRATEGY`](../runners/README.md#git-submodule-strategy)
@@ -4365,16 +4437,16 @@ You can use [CI/CD variables](../variables/README.md) to configure runner Git be
You can also use variables to configure how many times a runner
[attempts certain stages of job execution](../runners/README.md#job-stages-attempts).
-## Special YAML features
+## YAML-specific features
-It's possible to use special YAML features like anchors (`&`), aliases (`*`)
+In your `.gitlab-ci.yml` file, you can use YAML-specific features like anchors (`&`), aliases (`*`),
and map merging (`<<`). Use these features to reduce the complexity
of the code in the `.gitlab-ci.yml` file.
Read more about the various [YAML features](https://learnxinyminutes.com/docs/yaml/).
-In most cases, the [`extends` keyword](#extends) is more user friendly and should
-be used over these special YAML features.
+In most cases, the [`extends` keyword](#extends) is more user friendly and you should
+use it when possible.
You can use YAML anchors to merge YAML arrays.
@@ -4387,9 +4459,10 @@ Use anchors to duplicate or inherit properties. Use anchors with [hidden jobs](#
to provide templates for your jobs. When there are duplicate keys, GitLab
performs a reverse deep merge based on the keys.
-You can't use YAML anchors across multiple files when leveraging the [`include`](#include)
-feature. Anchors are only valid in the file they were defined in. Instead
-of using YAML anchors, you can use the [`extends` keyword](#extends).
+You can't use YAML anchors across multiple files when using the [`include`](#include)
+keyword. Anchors are only valid in the file they were defined in. To reuse configuration
+from different YAML files, use [`!reference` tags](#reference-tags) or the
+[`extends` keyword](#extends).
The following example uses anchors and map merging. It creates two jobs,
`test1` and `test2`, that inherit the `.job_template` configuration, each
@@ -4414,8 +4487,8 @@ test2:
```
`&` sets up the name of the anchor (`job_configuration`), `<<` means "merge the
-given hash into the current one", and `*` includes the named anchor
-(`job_configuration` again). The expanded version of the example above is:
+given hash into the current one," and `*` includes the named anchor
+(`job_configuration` again). The expanded version of this example is:
```yaml
.job_template:
@@ -4555,7 +4628,7 @@ Use [YAML anchors](#anchors) with `variables` to repeat assignment
of variables across multiple jobs. You can also use YAML anchors when a job
requires a specific `variables` block that would otherwise override the global variables.
-In the example below, we override the `GIT_STRATEGY` variable without affecting
+The following example shows how override the `GIT_STRATEGY` variable without affecting
the use of the `SAMPLE_VARIABLE` variable:
```yaml
@@ -4575,7 +4648,7 @@ job_no_git_strategy:
### Hide jobs
-If you want to temporarily 'disable' a job, rather than commenting out all the
+If you want to temporarily disable a job, rather than commenting out all the
lines where the job is defined:
```yaml
@@ -4594,7 +4667,7 @@ GitLab CI/CD. In the following example, `.hidden_job` is ignored:
```
Use this feature to ignore jobs, or use the
-[special YAML features](#special-yaml-features) and transform the hidden jobs
+[YAML-specific features](#yaml-specific-features) and transform the hidden jobs
into templates.
### `!reference` tags
@@ -4606,7 +4679,7 @@ sections and reuse it in the current section. Unlike [YAML anchors](#anchors), y
use `!reference` tags to reuse configuration from [included](#include) configuration
files as well.
-In this example, a `script` and an `after_script` from two different locations are
+In the following example, a `script` and an `after_script` from two different locations are
reused in the `test` job:
- `setup.yml`:
@@ -4635,7 +4708,7 @@ reused in the `test` job:
- !reference [.teardown, after_script]
```
-In this example, `test-vars-1` reuses the all the variables in `.vars`, while `test-vars-2`
+In the following example, `test-vars-1` reuses the all the variables in `.vars`, while `test-vars-2`
selects a specific variable and reuses it as a new `MY_VAR` variable.
```yaml
@@ -4699,7 +4772,7 @@ Defining `image`, `services`, `cache`, `before_script`, and
`after_script` globally is deprecated. Support could be removed
from a future release.
-Use [`default:`](#global-defaults) instead. For example:
+Use [`default:`](#custom-default-keyword-values) instead. For example:
```yaml
default:
diff --git a/doc/ci/yaml/gitlab_ci_yaml.md b/doc/ci/yaml/gitlab_ci_yaml.md
index 765b982dbeb..851c9776c45 100644
--- a/doc/ci/yaml/gitlab_ci_yaml.md
+++ b/doc/ci/yaml/gitlab_ci_yaml.md
@@ -27,6 +27,7 @@ In the `.gitlab-ci.yml` file, you can define:
The scripts are grouped into **jobs**, and jobs run as part of a larger
**pipeline**. You can group multiple independent jobs into **stages** that run in a defined order.
+The CI/CD configuration needs at least one job that is [not hidden](README.md#hide-jobs).
You should organize your jobs in a sequence that suits your application and is in accordance with
the tests you wish to perform. To [visualize](../pipeline_editor/index.md#visualize-ci-configuration) the process, imagine
@@ -84,7 +85,7 @@ displayed by GitLab:
![pipeline status](img/pipeline_status.png)
If anything goes wrong, you can
-[roll back](../environments/index.md#retrying-and-rolling-back) the changes:
+[roll back](../environments/index.md#retry-or-roll-back-a-deployment) the changes:
![rollback button](img/rollback.png)
diff --git a/doc/ci/yaml/script.md b/doc/ci/yaml/script.md
index 5750fe1ba61..4fc52995fc1 100644
--- a/doc/ci/yaml/script.md
+++ b/doc/ci/yaml/script.md
@@ -121,10 +121,10 @@ job:
- echo -e "\e[31mThis text is red,\e[0m but this text isn't\e[31m however this text is red again."
```
-You can define the color codes in Shell variables, or even [custom environment variables](../variables/README.md#custom-cicd-variables),
+You can define the color codes in Shell environment variables, or even [custom CI/CD variables](../variables/README.md#custom-cicd-variables),
which makes the commands easier to read and reusable.
-For example, using the same example as above and variables defined in a `before_script`:
+For example, using the same example as above and environment variables defined in a `before_script`:
```yaml
job:
@@ -145,3 +145,34 @@ job:
- Write-Host $TXT_RED"This text is red,"$TXT_CLEAR" but this text isn't"$TXT_RED" however this text is red again."
- Write-Host "This text is not colored"
```
+
+## Troubleshooting
+
+### `Syntax is incorrect` in scripts that use `:`
+
+If you use a colon (`:`) in a script, GitLab might output:
+
+- `Syntax is incorrect`
+- `script config should be a string or a nested array of strings up to 10 levels deep`
+
+For example, if you use `"PRIVATE-TOKEN: ${PRIVATE_TOKEN}"` as part of a cURL command:
+
+```yaml
+pages-job:
+ stage: deploy
+ script:
+ - curl --header 'PRIVATE-TOKEN: ${PRIVATE_TOKEN}' "https://gitlab.example.com/api/v4/projects"
+```
+
+The YAML parser thinks the `:` defines a YAML keyword, and outputs the
+`Syntax is incorrect` error.
+
+To use commands that contain a colon, you should wrap the whole command
+in single quotes. You might need to change existing single quotes (`'`) into double quotes (`"`):
+
+```yaml
+pages-job:
+ stage: deploy
+ script:
+ - 'curl --header "PRIVATE-TOKEN: ${PRIVATE_TOKEN}" "https://gitlab.example.com/api/v4/projects"'
+```
diff --git a/doc/development/README.md b/doc/development/README.md
index 3d5335feb11..43ceb737dde 100644
--- a/doc/development/README.md
+++ b/doc/development/README.md
@@ -261,7 +261,7 @@ See [database guidelines](database/index.md).
## Product Intelligence guides
- [Product Intelligence guide](https://about.gitlab.com/handbook/product/product-intelligence-guide/)
-- [Usage Ping guide](usage_ping.md)
+- [Usage Ping guide](usage_ping/index.md)
- [Snowplow guide](snowplow.md)
## Experiment guide
@@ -287,6 +287,7 @@ See [database guidelines](database/index.md).
## Domain-specific guides
- [CI/CD development documentation](cicd/index.md)
+- [AppSec development documentation](appsec/index.md)
## Other Development guides
diff --git a/doc/development/agent/user_stories.md b/doc/development/agent/user_stories.md
index 609be47a3cb..ab135cad9d3 100644
--- a/doc/development/agent/user_stories.md
+++ b/doc/development/agent/user_stories.md
@@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Kubernetes Agent user stories **(PREMIUM SELF)**
-The [personas in action](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#user-personas)
+The [personas in action](https://about.gitlab.com/handbook/marketing/strategic-marketing/roles-personas/#user-personas)
for the Kubernetes Agent are:
- [Sasha, the Software Developer](https://about.gitlab.com/handbook/marketing/strategic-marketing/roles-personas/#sasha-software-developer).
diff --git a/doc/development/api_graphql_styleguide.md b/doc/development/api_graphql_styleguide.md
index 85098689392..8bac02c99af 100644
--- a/doc/development/api_graphql_styleguide.md
+++ b/doc/development/api_graphql_styleguide.md
@@ -13,7 +13,7 @@ This document outlines the style guide for the GitLab [GraphQL API](../api/graph
<!-- vale gitlab.Spelling = NO -->
We use the [GraphQL Ruby gem](https://graphql-ruby.org/) written by [Robert Mosolgo](https://github.com/rmosolgo/).
<!-- vale gitlab.Spelling = YES -->
-In addition, we have a subscription to [GraphQL Pro](https://www.graphql.pro). For details see [GraphQL Pro subscription](graphql_guide/graphql_pro.md).
+In addition, we have a subscription to [GraphQL Pro](https://graphql.pro/). For details see [GraphQL Pro subscription](graphql_guide/graphql_pro.md).
All GraphQL queries are directed to a single endpoint
([`app/controllers/graphql_controller.rb#execute`](https://gitlab.com/gitlab-org/gitlab/blob/master/app%2Fcontrollers%2Fgraphql_controller.rb)),
@@ -76,6 +76,28 @@ Rake task.
Requests time out at 30 seconds.
+## Breaking changes
+
+The GitLab GraphQL API is [versionless](https://graphql.org/learn/best-practices/#versioning) which means
+developers must familiarize themselves with our [deprecation cycle of breaking changes](#breaking-changes).
+
+Breaking changes are:
+
+- Removing or renaming a field, argument, enum value or mutation.
+- Changing the type of a field, argument or enum value.
+- Raising the [complexity](#max-complexity) of a field or complexity multipliers in a resolver.
+- Changing a field from being _not_ nullable (`null: false`) to nullable (`null: true`), as
+discussed in [Nullable fields](#nullable-fields).
+- Changing an argument from being optional (`required: false`) to being required (`required: true`).
+- Changing the [max page size](#page-size-limit) of a connection.
+- Lowering the global limits for query complexity and depth.
+- Anything else that can result in queries hitting a limit that previously was allowed.
+
+Fields that use the [`feature_flag` property](#feature_flag-property) and the flag is disabled by default are exempt
+from the deprecation process, and can be removed at any time without notice.
+
+See the [deprecating fields and enum values](#deprecating-fields-arguments-and-enum-values) section for how to deprecate items.
+
## Global IDs
The GitLab GraphQL API uses Global IDs (i.e: `"gid://gitlab/MyObject/123"`)
@@ -448,7 +470,7 @@ fails. Consider this when toggling the visibility of the feature on or off on
production.
The `feature_flag` property does not allow the use of
-[feature gates based on actors](../development/feature_flags/development.md).
+[feature gates based on actors](../development/feature_flags/index.md).
This means that the feature flag cannot be toggled only for particular
projects, groups, or users, but instead can only be toggled globally for
everyone.
@@ -490,15 +512,18 @@ def foo
end
```
-## Deprecating fields and enum values
+## Deprecating fields, arguments, and enum values
The GitLab GraphQL API is versionless, which means we maintain backwards
-compatibility with older versions of the API with every change. Rather
-than removing a field or [enum value](#enums), we need to _deprecate_ it instead.
+compatibility with older versions of the API with every change.
+
+Rather than removing fields, arguments, or [enum values](#enums), they
+must be _deprecated_ instead.
+
The deprecated parts of the schema can then be removed in a future release
-in accordance with the [GitLab deprecation process](../api/graphql/index.md#deprecation-process).
+in accordance with the [GitLab deprecation process](../api/graphql/index.md#deprecation-and-removal-process).
-Fields and enum values are deprecated using the `deprecated` property.
+Fields, arguments, and enum values are deprecated using the `deprecated` property.
The value of the property is a `Hash` of:
- `reason` - Reason for the deprecation.
@@ -518,14 +543,15 @@ is appended to the `description`.
### Deprecation reason style guide
-Where the reason for deprecation is due to the field or enum value being
-replaced, the `reason` must be:
+Where the reason for deprecation is due to the field, argument, or enum value being
+replaced, the `reason` must indicate the replacement. For example, the
+following is a `reason` for a replaced field:
```plaintext
Use `otherFieldName`
```
-Example:
+Examples:
```ruby
field :designs, ::Types::DesignManagement::DesignCollectionType, null: true,
@@ -544,8 +570,8 @@ module Types
end
```
-If the field is not being replaced by another field, a descriptive
-deprecation `reason` should be given.
+If the field, argument, or enum value being deprecated is not being replaced,
+a descriptive deprecation `reason` should be given.
See also [Aliasing and deprecating mutations](#aliasing-and-deprecating-mutations).
@@ -594,7 +620,7 @@ end
```
Enum values can be deprecated using the
-[`deprecated` keyword](#deprecating-fields-and-enum-values).
+[`deprecated` keyword](#deprecating-fields-arguments-and-enum-values).
### Defining GraphQL enums dynamically from Rails enums
@@ -1567,7 +1593,7 @@ mount_aliased_mutation 'BarMutation', Mutations::FooMutation
```
This allows us to rename a mutation and continue to support the old name,
-when coupled with the [`deprecated`](#deprecating-fields-and-enum-values)
+when coupled with the [`deprecated`](#deprecating-fields-arguments-and-enum-values)
argument.
Example:
diff --git a/doc/development/application_limits.md b/doc/development/application_limits.md
index 3608636dd55..c42e9224105 100644
--- a/doc/development/application_limits.md
+++ b/doc/development/application_limits.md
@@ -139,14 +139,14 @@ end
Self-managed:
-- `default` - Everyone
+- `default`: Everyone.
GitLab.com:
-- `default` - Any system-wide feature
-- `free` - Namespaces and projects with a Free subscription
-- `bronze`- Namespaces and projects with a Bronze subscription
-- `silver` - Namespaces and projects with a Silver subscription
-- `gold` - Namespaces and projects with a Gold subscription
+- `default`: Any system-wide feature.
+- `free`: Namespaces and projects with a Free subscription.
+- `bronze`: Namespaces and projects with a Bronze subscription. This tier is no longer available for purchase.
+- `silver`: Namespaces and projects with a Premium subscription.
+- `gold`: Namespaces and projects with an Ultimate subscription.
The `test` environment doesn't have any plans.
diff --git a/doc/development/appsec/index.md b/doc/development/appsec/index.md
new file mode 100644
index 00000000000..e8ce885e75d
--- /dev/null
+++ b/doc/development/appsec/index.md
@@ -0,0 +1,32 @@
+---
+stage: Secure, Protect
+group: all
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+type: index, dev, reference
+---
+
+# Application Security development documentation
+
+Development guides that are specific to the stages that work on Application Security features are listed here.
+
+Please go to [Application Security](../../user/application_security/index.md) if you are looking for documentation on how to use those features.
+
+## Namespaces
+
+Application Security code in the Rails monolith is organized into the following namespaces, which generally follows
+the feature categories in the [Secure](https://about.gitlab.com/stages-devops-lifecycle/secure/) and [Protect](https://about.gitlab.com/stages-devops-lifecycle/protect/) stages.
+
+- `AppSec`: shared code.
+ - `AppSec::ContainerScanning`: Container Scanning code.
+ - `AppSec::Dast`: DAST code.
+ - `AppSec::DependencyScanning`: Dependency Scanning code.
+ - `AppSec::Fuzzing::Api`: API Fuzzing code.
+ - `AppSec::Fuzzing::Coverage`: Coverage Fuzzing code.
+ - `AppSec::Fuzzing`: Shared fuzzing code.
+ - `AppSec::LicenseCompliance`: License Compliance code.
+ - `AppSec::Sast`: SAST code.
+ - `AppSec::SecretDetection`: Secret Detection code.
+ - `AppSec::VulnMgmt`: Vulnerability Management code.
+
+Most AppSec code does not conform to these namespace guidelines. When developing, make an effort
+to move existing code into the appropriate namespace whenever possible.
diff --git a/doc/development/architecture.md b/doc/development/architecture.md
index 69055131ae8..5564d0722b0 100644
--- a/doc/development/architecture.md
+++ b/doc/development/architecture.md
@@ -224,17 +224,7 @@ Component statuses are linked to configuration documentation for each component.
### Component list
-Table description links:
-
-- [Omnibus GitLab](https://docs.gitlab.com/omnibus/)
-- [GitLab Environment Toolkit (GET)](https://gitlab.com/gitlab-org/quality/gitlab-environment-toolkit)
-- [GitLab chart](https://docs.gitlab.com/charts/)
-- [Minikube Minimal](https://docs.gitlab.com/charts/development/minikube/#deploying-gitlab-with-minimal-settings)
-- [GitLab.com](https://gitlab.com)
-- [Source](../install/installation.md)
-- [GDK](https://gitlab.com/gitlab-org/gitlab-development-kit)
-
-| Component | Description | Omnibus GitLab | GitLab Environment Toolkit (GET) | GitLab chart | Minikube Minimal | GitLab.com | Source | GDK | CE/EE |
+| Component | Description | [Omnibus GitLab](https://docs.gitlab.com/omnibus/) | [GitLab Environment Toolkit (GET)](https://gitlab.com/gitlab-org/quality/gitlab-environment-toolkit) | [GitLab chart](https://docs.gitlab.com/charts/) | [Minikube Minimal](https://docs.gitlab.com/charts/development/minikube/#deploying-gitlab-with-minimal-settings) | [GitLab.com](https://gitlab.com) | [Source](../install/installation.md) | [GDK](https://gitlab.com/gitlab-org/gitlab-development-kit) | [CE/EE](https://about.gitlab.com/install/ce-or-ee/) |
|-------------------------------------------------------|----------------------------------------------------------------------|:--------------:|:--------------:|:------------:|:----------------:|:----------:|:------:|:---:|:-------:|
| [Certificate Management](#certificate-management) | TLS Settings, Let's Encrypt | ✅ | ✅ | ✅ | ⚙ | ✅ | ⚙ | ⚙ | CE & EE |
| [Consul](#consul) | Database node discovery, failover | ⚙ | ✅ | ⌠| ⌠| ✅ | ⌠| ⌠| EE Only |
@@ -332,7 +322,7 @@ Consul is a tool for service discovery and configuration. Consul is distributed,
- Configuration:
- [Omnibus](https://docs.gitlab.com/omnibus/settings/database.html#disabling-automatic-database-migration)
- [Charts](https://docs.gitlab.com/charts/charts/gitlab/migrations/)
- - [Source](../update/upgrading_from_source.md#14-install-libraries-migrations-etc)
+ - [Source](../update/upgrading_from_source.md#10-install-libraries-migrations-etc)
- Layer: Core Service (Data)
#### Elasticsearch
@@ -651,7 +641,7 @@ Redis is packaged to provide a place to store:
- [Project page](https://github.com/docker/distribution/blob/master/README.md)
- Configuration:
- - [Omnibus](../update/upgrading_from_source.md#14-install-libraries-migrations-etc)
+ - [Omnibus](../update/upgrading_from_source.md#10-install-libraries-migrations-etc)
- [Charts](https://docs.gitlab.com/charts/charts/registry/)
- [Source](../administration/packages/container_registry.md#enable-the-container-registry)
- [GDK](https://gitlab.com/gitlab-org/gitlab-development-kit/blob/master/doc/howto/registry.md)
@@ -909,7 +899,7 @@ in Rails, scheduled to run whenever an SSH key is modified by a user.
instead of keys. In this case, `AuthorizedKeysCommand` is replaced with an
`AuthorizedPrincipalsCommand`. This extracts a username from the certificate
without using the Rails internal API, which is used instead of `key_id` in the
-`/api/internal/allowed` call later.
+[`/api/internal/allowed`](internal_api.md) call later.
GitLab Shell also has a few operations that do not involve Gitaly, such as
resetting two-factor authentication codes. These are handled in the same way,
diff --git a/doc/development/auto_devops.md b/doc/development/auto_devops.md
index eaf1d712f17..c127858d3e7 100644
--- a/doc/development/auto_devops.md
+++ b/doc/development/auto_devops.md
@@ -47,12 +47,12 @@ found in
## Development environment
-Configuring [GDK for Auto
-DevOps](https://gitlab.com/gitlab-org/gitlab-development-kit/blob/master/doc/howto/auto_devops.md).
+See the [Simple way to develop/test Kubernetes workflows with a local cluster](https://gitlab.com/gitlab-org/gitlab-development-kit/-/issues/1064)
+issue for discussion around setting up Auto DevOps development environments.
## Monitoring on GitLab.com
The metric
-[`auto_devops_completed_pipelines_total`](https://thanos-query.ops.gitlab.net/graph?g0.range_input=72h&g0.max_source_resolution=0s&g0.expr=sum(increase(auto_devops_pipelines_completed_total%7Benvironment%3D%22gprd%22%7D%5B60m%5D))%20by%20(status)&g0.tab=0)
+[`auto_devops_completed_pipelines_total`](https://thanos.gitlab.net/graph?g0.range_input=72h&g0.max_source_resolution=0s&g0.expr=sum(increase(auto_devops_pipelines_completed_total%7Benvironment%3D%22gprd%22%7D%5B60m%5D))%20by%20(status)&g0.tab=0)
(only available to GitLab team members) counts completed Auto DevOps
pipelines, labeled by status.
diff --git a/doc/development/build_test_package.md b/doc/development/build_test_package.md
index 421ee5d0c84..1506017c6d5 100644
--- a/doc/development/build_test_package.md
+++ b/doc/development/build_test_package.md
@@ -40,7 +40,7 @@ used to trigger the build.
In scenarios where a configuration change is to be introduced and Omnibus GitLab
repository already has the necessary changes in a specific branch, you can build
-a package against that branch through an environment variable named
-`OMNIBUS_BRANCH`. To do this, specify that environment variable with the name of
+a package against that branch through a CI/CD variable named
+`OMNIBUS_BRANCH`. To do this, specify that variable with the name of
the branch as value in `.gitlab-ci.yml` and push a commit. This will create a
manual job that can be used to trigger the build.
diff --git a/doc/development/changelog.md b/doc/development/changelog.md
index f2c8aa4db62..98a3e75bb3c 100644
--- a/doc/development/changelog.md
+++ b/doc/development/changelog.md
@@ -45,7 +45,7 @@ the `author` field. GitLab team members **should not**.
**must** have a changelog entry, without `merge_request` value
and with `type` set to `security`.
- Any user-facing change **must** have a changelog entry. This includes both visual changes (regardless of how minor), and changes to the rendered DOM which impact how a screen reader may announce the content.
-- Any client-facing change to our REST and GraphQL APIs **must** have a changelog entry. This includes modifying complexity of GraphQL fields.
+- Any client-facing change to our REST and GraphQL APIs **must** have a changelog entry. See the [complete list what comprises a GraphQL breaking change](api_graphql_styleguide.md#breaking-changes).
- Performance improvements **should** have a changelog entry.
- Changes that need to be documented in the Product Intelligence [Event Dictionary](https://about.gitlab.com/handbook/product/product-intelligence-guide/#event-dictionary)
also require a changelog entry.
@@ -57,8 +57,7 @@ the `author` field. GitLab team members **should not**.
- Any change behind an enabled feature flag **should** have a changelog entry.
- Any change that adds new usage data metrics and changes that needs to be documented in Product Intelligence [Event Dictionary](https://about.gitlab.com/handbook/product/product-intelligence-guide/#event-dictionary) **should** have a changelog entry.
- A change that adds snowplow events **should** have a changelog entry -
-- A change that [removes a feature flag](feature_flags/development.md) **should** have a changelog entry -
- only if the feature flag did not default to true already.
+- A change that [removes a feature flag](feature_flags/index.md) **must** have a changelog entry.
- A fix for a regression introduced and then fixed in the same release (i.e.,
fixing a bug introduced during a monthly release candidate) **should not**
have a changelog entry.
diff --git a/doc/development/chatops_on_gitlabcom.md b/doc/development/chatops_on_gitlabcom.md
index 0341abf5eeb..4ae49103d1b 100644
--- a/doc/development/chatops_on_gitlabcom.md
+++ b/doc/development/chatops_on_gitlabcom.md
@@ -61,4 +61,4 @@ To request access to ChatOps on GitLab.com:
- [ChatOps Usage](../ci/chatops/index.md)
- [Understanding EXPLAIN plans](understanding_explain_plans.md)
-- [Feature Groups](feature_flags/development.md#feature-groups)
+- [Feature Groups](feature_flags/index.md#feature-groups)
diff --git a/doc/development/cicd/templates.md b/doc/development/cicd/templates.md
index 94b03634e25..3e7ae39cb7d 100644
--- a/doc/development/cicd/templates.md
+++ b/doc/development/cicd/templates.md
@@ -47,7 +47,7 @@ performance:
```
and users include this template with passing an argument to the `performance` job.
-This can be done by specifying the environment variable `TARGET_URL` in _their_ `.gitlab-ci.yml`:
+This can be done by specifying the CI/CD variable `TARGET_URL` in _their_ `.gitlab-ci.yml`:
```yaml
include:
@@ -88,7 +88,7 @@ for example `Jobs/Deploy.gitlab-ci.yml`.
You can make a new stable template by copying [the latest template](#latest-version)
available in a major milestone release of GitLab like `13.0`. All breaking changes
must be announced in a blog post before the official release, for example
-[GitLab.com is moving to 13.0, with narrow breaking changes](https://about.gitlab.com/releases/2020/05/06/gitlab-com-13-0-breaking-changes/)
+[GitLab.com is moving to 13.0, with narrow breaking changes](https://about.gitlab.com/blog/2020/05/06/gitlab-com-13-0-breaking-changes/)
You can change a stable template version in a minor GitLab release like `13.1` if:
@@ -180,7 +180,7 @@ is updated in a major version GitLab release.
## Security
A template could contain malicious code. For example, a template that contains the `export` shell command in a job
-might accidentally expose project secret variables in a job log.
+might accidentally expose secret project CI/CD variables in a job log.
If you're unsure if it's secure or not, you need to ask security experts for cross-validation.
## Contribute CI/CD Template Merge Requests
diff --git a/doc/development/code_intelligence/index.md b/doc/development/code_intelligence/index.md
index ac962e3ae3e..790ba1539b7 100644
--- a/doc/development/code_intelligence/index.md
+++ b/doc/development/code_intelligence/index.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+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/code_review.md b/doc/development/code_review.md
index dada6adcce7..483f2a4648a 100644
--- a/doc/development/code_review.md
+++ b/doc/development/code_review.md
@@ -283,6 +283,8 @@ first time.
you forget to remove any debugging code?
- Consider providing instructions on how to test the merge request. This can be
helpful for reviewers not familiar with the product feature or area of the codebase.
+- If you know your change depends on another being merged first, note it in the
+ description and set an [merge request dependency](../user/project/merge_requests/merge_request_dependencies.md).
- Be grateful for the reviewer's suggestions. (`Good call. I'll make that change.`)
- Don't take it personally. The review is of the code, not of you.
- Explain why the code exists. ("It's like that because of these reasons. Would
@@ -345,6 +347,8 @@ experience, refactors the existing code). Then:
- For non-mandatory suggestions, decorate with (non-blocking) so the author knows they can
optionally resolve within the merge request or follow-up at a later stage.
- There's a [Chrome/Firefox add-on](https://gitlab.com/conventionalcomments/conventional-comments-button) which you can use to apply [Conventional Comment](https://conventionalcomments.org/) prefixes.
+- Ensure there are no open dependencies. Check [related issues](../user/project/issues/related_issues.md) for blockers. Clarify with the author(s)
+if necessary. If blocked by one or more open MRs, set an [MR dependency](../user/project/merge_requests/merge_request_dependencies.md).
- After a round of line notes, it can be helpful to post a summary note such as
"Looks good to me", or "Just a couple things to address."
- Assign the merge request to the author if changes are required following your
@@ -390,6 +394,8 @@ When ready to merge:
- **Start a new merge request pipeline with the `Run Pipeline` button in the merge
request's "Pipelines" tab, and enable "Merge When Pipeline Succeeds" (MWPS).** Note that:
+ - If **[master is broken](https://about.gitlab.com/handbook/engineering/workflow/#broken-master),
+ do not merge the merge request**. Follow these specific [handbook instructions](https://about.gitlab.com/handbook/engineering/workflow/#maintaining-throughput-during-broken-master).
- If the **latest [Pipeline for Merged Results](../ci/merge_request_pipelines/pipelines_for_merged_results/#pipelines-for-merged-results)** finished less than 2 hours ago, you
might merge without starting a new pipeline as the merge request is close
enough to `master`.
@@ -397,10 +403,6 @@ When ready to merge:
Before triggering the pipeline, review all changes for **malicious code**.
If you cannot trigger the pipeline, review the status of the fork relative to `master`.
If it's more than 100 commits behind, ask the author to rebase it before merging.
- - If [master is broken](https://about.gitlab.com/handbook/engineering/workflow/#broken-master),
- in addition to the two above rules, check that any failure also happens
- in `master` and post a link to the ~"master:broken" issue before clicking the
- red "Merge" button.
- When you set the MR to "Merge When Pipeline Succeeds", you should take over
subsequent revisions for anything that would be spotted after that.
diff --git a/doc/development/contributing/issue_workflow.md b/doc/development/contributing/issue_workflow.md
index da38d1e73b4..25ab931e236 100644
--- a/doc/development/contributing/issue_workflow.md
+++ b/doc/development/contributing/issue_workflow.md
@@ -181,7 +181,7 @@ For instance, the "DevOps Report" category is represented by the
`devops_reports.name` value is "DevOps Reports".
If a category's label doesn't respect this naming convention, it should be specified
-with [the `label` attribute](https://about.gitlab.com/handbook/marketing/website/#category-attributes)
+with [the `label` attribute](https://about.gitlab.com/handbook/marketing/inbound-marketing/digital-experience/website/#category-attributes)
in <https://gitlab.com/gitlab-com/www-gitlab-com/blob/master/data/categories.yml>.
### Feature labels
diff --git a/doc/development/contributing/merge_request_workflow.md b/doc/development/contributing/merge_request_workflow.md
index 166f7b350bf..9051b621bcd 100644
--- a/doc/development/contributing/merge_request_workflow.md
+++ b/doc/development/contributing/merge_request_workflow.md
@@ -68,10 +68,11 @@ request is as follows:
1. Use the syntax `Solves #XXX`, `Closes #XXX`, or `Refs #XXX` to mention the issue(s) your merge
request addresses. Referenced issues do not [close automatically](../../user/project/issues/managing_issues.md#closing-issues-automatically).
You must close them manually once the merge request is merged.
+ 1. The MR must include *Before* and *After* screenshots if UI changes are made.
+ 1. Include any steps or setup required to ensure reviewers can view the changes you've made (e.g. include any information about feature flags).
1. If you're allowed to, set a relevant milestone and [labels](issue_workflow.md).
1. UI changes should use available components from the GitLab Design System,
- [Pajamas](https://design.gitlab.com/). The MR must include *Before* and
- *After* screenshots.
+ [Pajamas](https://design.gitlab.com/).
1. If the MR changes CSS classes, please include the list of affected pages, which
can be found by running `grep css-class ./app -R`.
1. If your MR touches code that executes shell commands, reads or opens files, or
diff --git a/doc/development/contributing/style_guides.md b/doc/development/contributing/style_guides.md
index 2a2cfebe964..444a067a780 100644
--- a/doc/development/contributing/style_guides.md
+++ b/doc/development/contributing/style_guides.md
@@ -56,10 +56,10 @@ The current Lefthook configuration can be found in [`lefthook.yml`](https://gitl
Before you push your changes, Lefthook automatically runs the following checks:
- Danger: Runs a subset of checks that `danger-review` runs on your merge requests.
-- ES lint: Run `yarn eslint` checks (with the [`.eslintrc.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.eslintrc.yml) configuration) on the modified `*.{js,vue}` files. Tags: `frontend`, `style`.
+- ES lint: Run `yarn run lint:eslint` checks (with the [`.eslintrc.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.eslintrc.yml) configuration) on the modified `*.{js,vue}` files. Tags: `frontend`, `style`.
- HAML lint: Run `bundle exec haml-lint` checks (with the [`.haml-lint.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.haml-lint.yml) configuration) on the modified `*.html.haml` files. Tags: `view`, `haml`, `style`.
- Markdown lint: Run `yarn markdownlint` checks on the modified `*.md` files. Tags: `documentation`, `style`.
-- SCSS lint: Run `bundle exec scss-lint` checks (with the [`.scss-lint.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.scss-lint.yml) configuration) on the modified `*.scss{,.css}` files. Tags: `stylesheet`, `css`, `style`.
+- SCSS lint: Run `yarn lint:stylelint` checks (with the [`.stylelintrc`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.stylelintrc) configuration) on the modified `*.scss{,.css}` files. Tags: `stylesheet`, `css`, `style`.
- RuboCop: Run `bundle exec rubocop` checks (with the [`.rubocop.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.rubocop.yml) configuration) on the modified `*.rb` files. Tags: `backend`, `style`.
- Vale: Run `vale` checks (with the [`.vale.ini`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.vale.ini) configuration) on the modified `*.md` files. Tags: `documentation`, `style`.
@@ -146,7 +146,7 @@ One way to generate the initial list is to run the `todo` auto generation,
with `exclude limit` set to a high number.
```shell
-bundle exec rubocop --auto-gen-config --auto-gen-only-exclude --exclude-limit=10000
+bundle exec rubocop --auto-gen-config --auto-gen-only-exclude --exclude-limit=100000
```
You can then move the list from the freshly generated `.rubocop_todo.yml` for the Cop being actively
@@ -154,6 +154,16 @@ resolved and place it in the `.rubocop_manual_todo.yml`. In this scenario, do no
changes to the `.rubocop_todo.yml` as an `exclude limit` that is higher than 15 will make the
`.rubocop_todo.yml` hard to parse.
+### Reveal existing RuboCop exceptions
+
+To reveal existing RuboCop exceptions in the code that have been excluded via `.rubocop_todo.yml` and
+`.rubocop_manual_todo.yml`, set the environment variable `REVEAL_RUBOCOP_TODO` to `1`.
+
+This allows you to reveal existing RuboCop exceptions during your daily work cycle and fix them along the way.
+
+NOTE:
+Permanent `Exclude`s should be defined in `.rubocop.yml` instead of `.rubocop_manual_todo.yml`.
+
## Database migrations
See the dedicated [Database Migrations Style Guide](../migration_style_guide.md).
diff --git a/doc/development/database/client_side_connection_pool.md b/doc/development/database/client_side_connection_pool.md
index 1a30d2d73a3..8316a75ac8d 100644
--- a/doc/development/database/client_side_connection_pool.md
+++ b/doc/development/database/client_side_connection_pool.md
@@ -43,7 +43,7 @@ hardcoded value (10).
At this point, we need to investigate what is using more connections
than we anticipated. To do that, we can use the
`gitlab_ruby_threads_running_threads` metric. For example, [this
-graph](https://thanos-query.ops.gitlab.net/graph?g0.range_input=1h&g0.max_source_resolution=0s&g0.expr=sum%20by%20(thread_name)%20(%20gitlab_ruby_threads_running_threads%7Buses_db_connection%3D%22yes%22%7D%20)&g0.tab=0)
+graph](https://thanos.gitlab.net/graph?g0.range_input=1h&g0.max_source_resolution=0s&g0.expr=sum%20by%20(thread_name)%20(%20gitlab_ruby_threads_running_threads%7Buses_db_connection%3D%22yes%22%7D%20)&g0.tab=0)
shows all running threads that connect to the database by their
name. Threads labeled `puma worker` or `sidekiq_worker_thread` are
the threads that define `Gitlab::Runtime.max_threads` so those are
diff --git a/doc/development/database/index.md b/doc/development/database/index.md
index 367ef455898..870ae1542bd 100644
--- a/doc/development/database/index.md
+++ b/doc/development/database/index.md
@@ -69,3 +69,4 @@ info: To determine the technical writer assigned to the Stage/Group associated w
## Miscellaneous
- [Maintenance operations](maintenance_operations.md)
+- [Update multiple database objects](setting_multiple_values.md)
diff --git a/doc/development/database/setting_multiple_values.md b/doc/development/database/setting_multiple_values.md
index 54870380047..0f23aae9f79 100644
--- a/doc/development/database/setting_multiple_values.md
+++ b/doc/development/database/setting_multiple_values.md
@@ -4,24 +4,22 @@ 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
---
-# Setting Multiple Values
+# Update multiple database objects
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/32921) in GitLab 13.5.
-There's often a need to update multiple objects with new values for one
-or more columns. One method of doing this is using `Relation#update_all`:
+You can update multiple database objects with new values for one or more columns.
+One method is to use `Relation#update_all`:
```ruby
user.issues.open.update_all(due_date: 7.days.from_now) # (1)
user.issues.update_all('relative_position = relative_position + 1') # (2)
```
-But what do you do if you cannot express the update as either a static value (1)
-or as a calculation (2)?
-
-Thankfully we can use `UPDATE FROM` to express the need to update multiple rows
-with distinct values in a single query. One can either use a temporary table, or
-a Common Table Expression (CTE), and then use that as the source of the updates:
+If you cannot express the update as either a static value (1) or as a calculation (2),
+use `UPDATE FROM` to express the need to update multiple rows with distinct values
+in a single query. Create a temporary table, or a Common Table Expression (CTE),
+and use it as the source of the updates:
```sql
with updates(obj_id, new_title, new_weight) as (
@@ -34,23 +32,22 @@ update issues
where id = obj_id
```
-The bad news: there is no way to express this in ActiveRecord or even dropping
-down to ARel. The `UpdateManager` does not support `update from`, so this
-is not expressible.
-
-The good news: we supply an abstraction to help you generate these kinds of
-updates, called `Gitlab::Database::BulkUpdate`. This constructs queries such as the
-above, and uses binding parameters to avoid SQL injection.
+You can't express this in ActiveRecord, or by dropping down to [Arel](https://api.rubyonrails.org/v6.1.0/classes/Arel.html),
+because the `UpdateManager` does not support `update from`. However, we supply
+an abstraction to help you generate these kinds of updates: `Gitlab::Database::BulkUpdate`.
+This abstraction constructs queries like the previous example, and uses
+binding parameters to avoid SQL injection.
## Usage
-To use this, we need:
+To use `Gitlab::Database::BulkUpdate`, we need:
-- the list of columns to update
-- a mapping from object/ID to the new values to set for that object
-- a way to determine the table for each object
+- The list of columns to update.
+- A mapping from the object (or ID) to the new values to set for that object.
+- A way to determine the table for each object.
-For example, we can express the query above as:
+For example, we can express the example query in a way that determines the
+table by calling `object.class.table_name`:
```ruby
issue_a = Issue.find(..)
@@ -63,10 +60,7 @@ issue_b = Issue.find(..)
})
```
-Here the table can be determined automatically, from calling
-`object.class.table_name`, so we don't need to provide anything.
-
-We can even pass heterogeneous sets of objects, if the updates all make sense
+You can even pass heterogeneous sets of objects, if the updates all make sense
for them:
```ruby
@@ -82,8 +76,8 @@ merge_request = MergeRequest.find(..)
})
```
-If your objects do not return the correct model class (perhaps because they are
-part of a union), then we need to specify this explicitly in a block:
+If your objects do not return the correct model class, such as if they are part
+of a union, then specify the model class explicitly in a block:
```ruby
bazzes = params
@@ -103,7 +97,10 @@ end
## Caveats
-Note that this is a **very low level** tool, and operates on the raw column
-values. Enumerations and state fields must be translated into their underlying
-representations, for example, and nested associations are not supported. No
-validations or hooks are called.
+This tool is **very low level**, and operates directly on the raw column
+values. You should consider these issues if you implement it:
+
+- Enumerations and state fields must be translated into their underlying
+ representations.
+- Nested associations are not supported.
+- No validations or hooks are called.
diff --git a/doc/development/database_query_comments.md b/doc/development/database_query_comments.md
index 8a5abad3815..39b14074073 100644
--- a/doc/development/database_query_comments.md
+++ b/doc/development/database_query_comments.md
@@ -39,24 +39,11 @@ Examples of queries with comments as observed in `development.log`:
1. Rails:
```sql
- SELECT "project_features".* FROM "project_features" WHERE "project_features"."project_id" = $1 LIMIT $2 [["project_id", 5], ["LIMIT", 1]] /*application:web,controller:jobs,action:trace,correlation_id:rYF4mey9CH3,line:/app/policies/project_policy.rb:504:in `feature_available?'*/
+ /*application:web,controller:jobs,action:trace,correlation_id:rYF4mey9CH3,line:/app/policies/project_policy.rb:504:in `feature_available?'*/ SELECT "project_features".* FROM "project_features" WHERE "project_features"."project_id" = $1 LIMIT $2 [["project_id", 5], ["LIMIT", 1]]
```
1. Sidekiq:
```sql
- SELECT "ci_pipelines".* FROM "ci_pipelines" WHERE "ci_pipelines"."id" = $1 LIMIT $2 [["id", 64], ["LIMIT", 1]] /*application:sidekiq,jid:e7d6668a39a991e323009833,job_class:ExpireJobCacheWorker,correlation_id:rYF4mey9CH3,line:/app/workers/expire_job_cache_worker.rb:14:in `perform'*/
+ /*application:sidekiq,jid:e7d6668a39a991e323009833,job_class:ExpireJobCacheWorker,correlation_id:rYF4mey9CH3,line:/app/workers/expire_job_cache_worker.rb:14:in `perform'*/ SELECT "ci_pipelines".* FROM "ci_pipelines" WHERE "ci_pipelines"."id" = $1 LIMIT $2 [["id", 64], ["LIMIT", 1]]
```
-
-## Enable/Disable the feature
-
-Enabling or disabling the feature requires a **restart/SIGHUP** of the Web and
-Sidekiq workers, as the feature flag's state is memoized upon starting up.
-
-The `feature_flag` for this feature is **disabled** by default. You can enable
-or disable it with:
-
-```ruby
-Feature.enable(:marginalia)
-Feature.disable(:marginalia)
-```
diff --git a/doc/development/directory_structure.md b/doc/development/directory_structure.md
index c2329feb941..c96e2cc3254 100644
--- a/doc/development/directory_structure.md
+++ b/doc/development/directory_structure.md
@@ -34,3 +34,61 @@ module MyDomain
end
end
```
+
+### About namespace naming
+
+A good guideline for naming a top-level namespace (bounded context) is to use the related
+feature category. For example, `Continuous Integration` feature category maps to `Ci::` namespace.
+
+Alternatively a new class could be added to `Projects::` or `Groups::` if it's either:
+
+- Strictly related to one of these domains. For example `Projects::Alias`.
+- A new component that does not have yet a more specific domain. In this case, when
+ a more explicit domain does emerge we would need to move the class to a more specific
+ namespace.
+
+Do not use the [stage or group name](https://about.gitlab.com/handbook/product/categories/#devops-stages)
+since a feature category could be reassigned to a different group in the future.
+
+```ruby
+# bad
+module Create
+ class Commit
+ end
+end
+
+# good
+module Repositories
+ class Commit
+ end
+end
+```
+
+On the other hand, a feature category may sometimes be too granular. Features tend to be
+treated differently according to Product and Marketing, while they may share a lot of
+domain models and behavior under the hood. In this case, having too many bounded contexts
+could make them shallow and more coupled with other contexts.
+
+Bounded contexts (or top-level namespaces) can be seen as macro-components in the overall app.
+Good bounded contexts should be [deep](https://medium.com/@nakabonne/depth-of-module-f62dac3c2fdb)
+so consider having nested namespaces to further break down complex parts of the domain.
+E.g. `Ci::Config::`.
+
+For example, instead of having separate and granular bounded contexts like: `ContainerScanning::`,
+`ContainerHostSecurity::`, `ContainerNetworkSecurity::`, we could have:
+
+```ruby
+module ContainerSecurity
+ module HostSecurity
+ end
+
+ module NetworkSecurity
+ end
+
+ module Scanning
+ end
+end
+```
+
+If classes that are defined into a namespace have a lot in common with classes in other namespaces,
+chances are that these two namespaces are part of the same bounded context.
diff --git a/doc/development/distributed_tracing.md b/doc/development/distributed_tracing.md
index eb20e721e46..17967c5f63c 100644
--- a/doc/development/distributed_tracing.md
+++ b/doc/development/distributed_tracing.md
@@ -206,7 +206,7 @@ If `GITLAB_TRACING` is not configured correctly, this issue is logged:
By default, GitLab ships with the Jaeger tracer, but other tracers can be included at compile time.
Details of how this can be done are included in the [LabKit tracing
-documentation](https://godoc.org/gitlab.com/gitlab-org/labkit/tracing).
+documentation](https://pkg.go.dev/gitlab.com/gitlab-org/labkit/tracing).
If no log messages about tracing are emitted, the `GITLAB_TRACING` environment variable is likely
not set.
diff --git a/doc/development/documentation/feature_flags.md b/doc/development/documentation/feature_flags.md
index c9c291abd2c..8fe3f0cbf8e 100644
--- a/doc/development/documentation/feature_flags.md
+++ b/doc/development/documentation/feature_flags.md
@@ -14,9 +14,13 @@ feature flag depends on its state (enabled or disabled). When the state
changes, the developer who made the change **must update the documentation**
accordingly.
+Every feature introduced to the codebase, even if it's behind a feature flag,
+must be documented. For context, see the
+[latest merge request that updated this guideline](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/47917#note_459984428).
+
## Criteria
-According to the process of [deploying GitLab features behind feature flags](../feature_flags/process.md):
+According to the process of [deploying GitLab features behind feature flags](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle):
> - _By default, feature flags should be off._
> - _Feature flags should remain in the codebase for a short period as possible to reduce the need for feature flag accounting._
diff --git a/doc/development/documentation/site_architecture/index.md b/doc/development/documentation/site_architecture/index.md
index 92fd17f9d3e..70fa80b3306 100644
--- a/doc/development/documentation/site_architecture/index.md
+++ b/doc/development/documentation/site_architecture/index.md
@@ -118,7 +118,7 @@ If you change the Dockerfile configuration and rebuild the images, you can break
pipeline in the main `gitlab` repository as well as in `gitlab-docs`. Create an image with
a different name first and test it to ensure you do not break the pipelines.
-1. In [`gitlab-docs`](https://gitlab.com/gitlab-org/gitlab-docs), go to **{rocket}** **CI / CD > Pipelines**.
+1. In [`gitlab-docs`](https://gitlab.com/gitlab-org/gitlab-docs), go to **{rocket}** **CI/CD > Pipelines**.
1. Click the **Run Pipeline** button.
1. See that a new pipeline is running. The jobs that build the images are in the first
stage, `build-images`. You can click the pipeline number to see the larger pipeline
@@ -137,7 +137,7 @@ and deploys it to <https://docs.gitlab.com>.
If you need to build and deploy the site immediately (must have maintainer level permissions):
-1. In [`gitlab-docs`](https://gitlab.com/gitlab-org/gitlab-docs), go to **{rocket}** **CI / CD > Schedules**.
+1. In [`gitlab-docs`](https://gitlab.com/gitlab-org/gitlab-docs), go to **{rocket}** **CI/CD > Schedules**.
1. For the `Build docs.gitlab.com every 4 hours` scheduled pipeline, click the **play** (**{play}**) button.
Read more about the [deployment process](deployment_process.md).
diff --git a/doc/development/documentation/site_architecture/release_process.md b/doc/development/documentation/site_architecture/release_process.md
index ba5363dbb71..7bdf3fbdcf8 100644
--- a/doc/development/documentation/site_architecture/release_process.md
+++ b/doc/development/documentation/site_architecture/release_process.md
@@ -4,191 +4,165 @@ 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
---
-# GitLab Docs monthly release process
+# Monthly release process
-When a new GitLab version is released on the 22nd, we need to create the respective
-single Docker image, and update some files so that the dropdown works correctly.
+When a new GitLab version is released on the 22nd, we need to release the published documentation
+for the new version.
-## 1. Add the chart version
+This should be done as soon as possible after the GitLab version is announced, so that:
-Since the charts use a different version number than all the other GitLab
-products, we need to add a
-[version mapping](https://docs.gitlab.com/charts/installation/version_mappings.html):
+- The published documentation includes the three most recent minor releases of the current major
+ version, and the most recent minor releases of the last two major versions. For example 13.9,
+ 13.8, 13.7, 12.10, and 11.11.
+- Documentation updates after the 22nd are for the next release. The versions drop down
+ should have the current milestone with `-pre` appended to it, for example `13.10-pre`.
-The charts stable branch is not created automatically like the other products.
-There's an [issue to track this](https://gitlab.com/gitlab-org/charts/gitlab/-/issues/1442).
-It is usually created on the 21st or the 22nd.
+Each documentation release:
-To add a new charts version:
+- Has a dedicated branch, named in the format `XX.yy`.
+- Has a Docker image that contains a build of that branch.
+
+For example:
+
+- For [GitLab 13.9](https://docs.gitlab.com/13.9/index.html), the
+ [stable branch](https://gitlab.com/gitlab-org/gitlab-docs/-/tree/13.9) and Docker image:
+ [`registry.gitlab.com/gitlab-org/gitlab-docs:13.9`](https://gitlab.com/gitlab-org/gitlab-docs/container_registry/631635).
+- For [GitLab 13.8](https://docs.gitlab.com/13.8/index.html), the
+ [stable branch](https://gitlab.com/gitlab-org/gitlab-docs/-/tree/13.8) and Docker image:
+ [`registry.gitlab.com/gitlab-org/gitlab-docs:13.8`](https://gitlab.com/gitlab-org/gitlab-docs/container_registry/631635).
+
+To set up a documentation release, follow these steps:
+
+1. [Add the charts version](#add-chart-version), so that the documentation is built using the
+ [version of the charts project that maps to](https://docs.gitlab.com/charts/installation/version_mappings.html)
+ the GitLab release. This step may have been completed already.
+1. [Create a stable branch and Docker image](#create-stable-branch-and-docker-image-for-release) for
+ the new version.
+1. [Create a release merge request](#create-release-merge-request) for the new version, which
+ updates the version dropdown menu for the current documentation and adds the release to the
+ Docker configuration. For example, the
+ [release merge request for 13.9](https://gitlab.com/gitlab-org/gitlab-docs/-/merge_requests/1555).
+1. [Update the three online versions](#update-dropdown-for-online-versions), so that they display the new release on their
+ version dropdown menus. For example:
+ - The merge request to [update the 13.9 version dropdown menu for the 13.9 release](https://gitlab.com/gitlab-org/gitlab-docs/-/merge_requests/1556).
+ - The merge request to [update the 13.8 version dropdown menu for the 13.9 release](https://gitlab.com/gitlab-org/gitlab-docs/-/merge_requests/1557).
+ - The merge request to [update the 13.7 version dropdown menu for the 13.9 release](https://gitlab.com/gitlab-org/gitlab-docs/-/merge_requests/1558).
+1. [Merge the release merge request and run the necessary Docker image builds](#merge-release-merge-request-and-run-docker-image-builds).
+
+## Add chart version
+
+To add a new charts version for the release:
1. Make sure you're in the root path of the `gitlab-docs` repository.
1. Open `content/_data/chart_versions.yaml` and add the new stable branch version using the
- version mapping. Note that only the `major.minor` version is needed.
+ [version mapping](https://docs.gitlab.com/charts/installation/version_mappings.html). Only the
+ `major.minor` version is needed.
1. Create a new merge request and merge it.
NOTE:
-It can be handy to create the future mappings since they are pretty much known.
-In that case, when a new GitLab version is released, you don't have to repeat
-this first step.
+If you have time, add anticipated future mappings to `content/_data/chart_versions.yaml`. This saves
+a step for the next GitLab release.
-## 2. Create an image for a single version
+## Create stable branch and Docker image for release
-The single docs version must be created before the release merge request, but
-this needs to happen when the stable branches for all products have been created.
+To create a stable branch and Docker image for the release:
1. Make sure you're in the root path of the `gitlab-docs` repository.
-1. Run the Rake task to create the single version:
+1. Run the Rake task to create the single version. For example, to create the 13.9 release branch
+ and perform others tasks:
```shell
- ./bin/rake "release:single[12.0]"
+ ./bin/rake "release:single[13.9]"
```
- A new `Dockerfile.12.0` should have been created and `.gitlab-ci.yml` should
- have the branches variables updated into a new branch. They are automatically
- committed.
+ A branch for the release is created, a new `Dockerfile.13.9` is created, and `.gitlab-ci.yml`
+ has branches variables updated into a new branch. These files are automatically committed.
+
+1. Push the newly created branch, but **don't create a merge request**. After you push, the
+ `image:docs-single` job creates a new Docker image tagged with the name of the branch you created
+ earlier. You can see the Docker image in the `registry` environment at
+ <https://gitlab.com/gitlab-org/gitlab-docs/-/environments/folders/registry>.
-1. Push the newly created branch, but **don't create a merge request**.
- After you push, the `image:docs-single` job creates a new Docker image
- tagged with the branch name you created in the first step. In the end, the
- image is uploaded in the [Container Registry](https://gitlab.com/gitlab-org/gitlab-docs/container_registry)
- and it is listed under the `registry` environment folder at
- `https://gitlab.com/gitlab-org/gitlab-docs/-/environments/folders/registry` (must
- have developer access).
+For example, see [the 13.9 release pipeline](https://gitlab.com/gitlab-org/gitlab-docs/-/pipelines/260288747).
-Optionally, you can test locally by building the image and running it:
+Optionally, you can test locally by:
-```shell
-docker build -t docs:12.0 -f Dockerfile.12.0 .
-docker run -it --rm -p 4000:4000 docs:12.0
-```
+1. Building the image and running it. For example, for GitLab 13.9 documentation:
-Visit `http://localhost:4000/12.0/` to see if everything works correctly.
+ ```shell
+ docker build -t docs:13.9 -f Dockerfile.13.9 .
+ docker run -it --rm -p 4000:4000 docs:13.9
+ ```
-## 3. Create the release merge request
+1. Visiting <http://localhost:4000/13.9/> to see if everything works correctly.
+
+## Create release merge request
NOTE:
-To be [automated](https://gitlab.com/gitlab-org/gitlab-docs/-/issues/750).
+An [epic is open](https://gitlab.com/groups/gitlab-org/-/epics/4361) to automate this step.
-Now it's time to create the monthly release merge request that adds the new
-version and rotates the old one:
+To create the release merge request for the release:
1. Make sure you're in the root path of the `gitlab-docs` repository.
-1. Create a branch `release-X-Y`:
+1. Create a branch `release-X-Y`. For example:
```shell
git checkout master
- git checkout -b release-12-0
+ git checkout -b release-13-9
```
-1. **Rotate the online and offline versions:**
-
- At any given time, there are 4 browsable online versions: one pulled from
- the upstream master branches (docs for GitLab.com) and the three latest
- stable versions.
+1. Edit `content/_data/versions.yaml` and update the lists of versions to reflect the new release:
- Edit `content/_data/versions.yaml` and rotate the versions to reflect the
- new changes:
+ - Add the latest version to the `online:` section.
+ - Move the oldest version in `online:` to the `offline:` section. There should now be three
+ versions in `online:`.
- - `online`: The 3 latest stable versions.
- - `offline`: All the previous versions offered as an offline archive.
+1. Update these Dockerfiles:
-1. **Update the `:latest` and `:archives` Docker images:**
+ - `dockerfiles/Dockerfile.archives`: Add the latest version to the top of the list.
+ - `Dockerfile.master`: Remove the oldest version, and add the newest version to the
+ top of the list.
- The following two Dockerfiles need to be updated:
-
- 1. `dockerfiles/Dockerfile.archives` - Add the latest version at the top of
- the list.
- 1. `Dockerfile.master` - Rotate the versions (oldest gets removed and latest
- is added at the top of the list).
-
-1. In the end, there should be four files in total that have changed.
- Commit and push to create the merge request using the "Release" template:
+1. Commit and push to create the merge request. For example:
```shell
git add content/ Dockerfile.master dockerfiles/Dockerfile.archives
- git commit -m "Release 12.0"
- git push origin release-12-0
+ git commit -m "Release 13.9"
+ git push origin release-13-9
```
-## 4. Update the dropdown for all online versions
-
-The versions dropdown is in a way "hardcoded". When the site is built, it looks
-at the contents of `content/_data/versions.yaml` and based on that, the dropdown
-is populated. Older branches have different content, which means the
-dropdown list is one or more releases behind. Remember that the new changes of
-the dropdown are included in the unmerged `release-X-Y` branch.
+Do not merge the release merge request yet.
-The content of `content/_data/versions.yaml` needs to change for all online
-versions (stable branches `X.Y` of the `gitlab-docs` project):
+## Update dropdown for online versions
-1. Run the Rake task that creates all the respective merge requests needed to
- update the dropdowns. Set these to automatically be merged when their
- pipelines succeed:
+To update`content/_data/versions.yaml` for all online versions (stable branches `X.Y` of the
+`gitlab-docs` project):
- NOTE:
- The `release-X-Y` branch needs to be present locally,
- and you need to have switched to it, otherwise the Rake task fails.
+1. Run the Rake task that creates all of the necessary merge requests to update the dropdowns. For
+ example, for the 13.9 release:
```shell
- git checkout release-X-Y
+ git checkout release-13-9
./bin/rake release:dropdowns
```
-1. [Visit the merge requests page](https://gitlab.com/gitlab-org/gitlab-docs/-/merge_requests?label_name%5B%5D=release)
- to check that their pipelines pass, and once all are merged, proceed to the
- following and final step.
+ These merge requests are set to automatically merge.
-NOTE:
-In case a pipeline fails, see [troubleshooting](#troubleshooting).
+1. [Visit the merge requests page](https://gitlab.com/gitlab-org/gitlab-docs/-/merge_requests?label_name%5B%5D=release)
+ to check that their pipelines pass. After all MRs are merged, proceed to the following and final
+ step.
-## 5. Merge the release merge request
+## Merge release merge request and run Docker image builds
-The dropdown merge requests should have now been merged into their respective
-version (stable `X.Y` branch), which triggers another pipeline. At this point,
-you need to only babysit the pipelines and make sure they don't fail:
+The merge requests for the dropdowns should now all be merged into their respective stable branches.
+Each merge triggers a new pipeline for each stable branch. Wait for the stable branch pipelines to
+complete, then:
1. Check the [pipelines page](https://gitlab.com/gitlab-org/gitlab-docs/pipelines)
and make sure all stable branches have green pipelines.
-1. After all the pipelines of the online versions succeed, merge the release merge request.
+1. After all the pipelines succeed, merge the [release merge request](#create-release-merge-request).
1. Finally, run the
[`Build docker images weekly` pipeline](https://gitlab.com/gitlab-org/gitlab-docs/pipeline_schedules)
that builds the `:latest` and `:archives` Docker images.
-Once the scheduled pipeline succeeds, the docs site is deployed with all
-new versions online.
-
-## Troubleshooting
-
-Releasing a new version is a long process that involves many moving parts.
-
-### `test_internal_links_and_anchors` failing on dropdown merge requests
-
-WARNING:
-We now pin versions in the `.gitlab-ci.yml` of the respective branch,
-so the steps below are deprecated.
-
-When [updating the dropdown for the stable versions](#4-update-the-dropdown-for-all-online-versions),
-there may be cases where some links might fail. The process of how the
-dropdown MRs are created have a caveat, and that is that the tests run by
-pulling the master branches of all products, instead of the respective stable
-ones.
-
-In a real world scenario, the [Update 12.2 dropdown to match that of 12.4](https://gitlab.com/gitlab-org/gitlab-docs/-/merge_requests/604)
-merge request failed because of the [`test_internal_links_and_anchors` test](https://gitlab.com/gitlab-org/gitlab-docs/-/jobs/328042431).
-
-This happened because there has been a rename of a product (`gitlab-monitor` to `gitlab-exporter`)
-and the old name was still referenced in the 12.2 docs. If the respective stable
-branches for 12.2 were used, this wouldn't have failed, but as we can see from
-the [`compile_dev` job](https://gitlab.com/gitlab-org/gitlab-docs/-/jobs/328042427),
-the `master` branches were pulled.
-
-To fix this, re-run the pipeline (`https://gitlab.com/gitlab-org/gitlab-docs/pipelines/new`)
-for the `update-12-2-for-release-12-4` branch, by including the following environment variables:
-
-- `BRANCH_CE` set to `12-2-stable`
-- `BRANCH_EE` set to `12-2-stable-ee`
-- `BRANCH_OMNIBUS` set to `12-2-stable`
-- `BRANCH_RUNNER` set to `12-2-stable`
-- `BRANCH_CHARTS` set to `2-2-stable`
-
-This should make the MR pass.
+As the last step in the scheduled pipeline, the documentation site deploys with all new versions.
diff --git a/doc/development/documentation/styleguide.md b/doc/development/documentation/styleguide.md
deleted file mode 100644
index ade0b89a92c..00000000000
--- a/doc/development/documentation/styleguide.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-redirect_to: 'styleguide/index.md'
----
-
-This document was moved to [another location](styleguide/index.md).
-
-<!-- This redirect file can be deleted after <2022-02-13>. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/development/documentation/styleguide/index.md b/doc/development/documentation/styleguide/index.md
index 7737aa58506..4831e5bbce5 100644
--- a/doc/development/documentation/styleguide/index.md
+++ b/doc/development/documentation/styleguide/index.md
@@ -108,7 +108,7 @@ of GitLab more efficient.
New information that would be useful toward the future usage or troubleshooting
of GitLab should not be written directly in a forum or other messaging system,
-but added to a documentation MR and then referenced, as described above.
+but added to a documentation MR and then referenced, as described above.
The more we reflexively add information to the documentation, the more
the documentation helps others efficiently accomplish tasks and solve problems.
@@ -601,6 +601,7 @@ Follow these guidelines for punctuation:
| 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).) | --- |
@@ -1606,34 +1607,32 @@ displayed for the page or feature.
#### Version text in the **Version History**
-If all content in a section is related, add version text after the header
-for the section. The version information must be surrounded by blank lines, and
-each entry should be on its own line.
+If all content in a section is related, add version text after the header for
+the section. The version information must:
-Add the version history information as a blockquote:
+- Be surrounded by blank lines.
+- Start with `>`. If there are multiple bullets, each line must start with `> -`.
+- The string must include these words in this order (capitalization doesn't matter):
+ - `introduced`, `deprecated`, `moved`
+ - `in` or `to`
+ - `GitLab`
+- Whenever possible, include a link to the completed issue, merge request, or epic
+ that introduced the feature. An issue is preferred over a merge request, and
+ a merge request is preferred over an epic.
```markdown
## Feature name
-> Introduced in GitLab 11.3.
+> [Introduced](<link-to-issue>) in GitLab 11.3.
This feature does something.
-```
-Whenever possible, version text should have a link to the completed issue, merge
-request, or epic that introduced the feature. An issue is preferred over a merge
-request, and a merge request is preferred over an epic. For example:
+## Feature name 2
-```markdown
-> [Introduced](<link-to-issue>) in GitLab 11.3.
-```
-
-If you're adding information about new features or changes in a release, update
-the blockquote to use a bulleted list:
-
-```markdown
> - [Introduced](<link-to-issue>) in GitLab 11.3.
-> - Enabled by default in GitLab 11.4.
+> - [Enabled by default](<link-to-issue>) in GitLab 11.4.
+
+This feature does something else.
```
If a feature is moved to another tier:
diff --git a/doc/development/documentation/testing.md b/doc/development/documentation/testing.md
index f3d6e0a5c71..eed544911cb 100644
--- a/doc/development/documentation/testing.md
+++ b/doc/development/documentation/testing.md
@@ -272,7 +272,11 @@ To configure Vale in your editor, install one of the following as appropriate:
In the extension's settings:
- Select the **Use CLI** checkbox.
- - In the **Config** setting, enter an absolute path to [`.vale.ini`](https://gitlab.com/gitlab-org/gitlab/blob/master/.vale.ini) in one of the cloned GitLab repositories on your computer.
+ - In the <!-- vale gitlab.Spelling = NO --> **Config** setting, enter an absolute
+ path to [`.vale.ini`](https://gitlab.com/gitlab-org/gitlab/blob/master/.vale.ini)
+ in one of the cloned GitLab repositories on your computer.
+ <!-- vale gitlab.Spelling = YES -->
+
- In the **Path** setting, enter the absolute path to the Vale binary. In most
cases, `vale` should work. To find the location, run `which vale` in a terminal.
diff --git a/doc/development/elasticsearch.md b/doc/development/elasticsearch.md
index 3392bd1fbf6..3f14ca454fe 100644
--- a/doc/development/elasticsearch.md
+++ b/doc/development/elasticsearch.md
@@ -184,7 +184,7 @@ If the current version is `v12p1`, and we need to create a new version for `v12p
1. Change the namespace for files under `v12p1` folder from `Latest` to `V12p1`
1. Make changes to files under the `latest` folder as needed
-## Creating a new Global Search migration
+## Creating a new Advanced Search migration
> This functionality was introduced by [#234046](https://gitlab.com/gitlab-org/gitlab/-/issues/234046).
@@ -219,7 +219,9 @@ Any update to the Elastic index mappings should be replicated in [`Elastic::Late
Migrations can be built with a retry limit and have the ability to be [failed and marked as halted](https://gitlab.com/gitlab-org/gitlab/-/blob/66e899b6637372a4faf61cfd2f254cbdd2fb9f6d/ee/lib/elastic/migration.rb#L40).
Any data or index cleanup needed to support migration retries should be handled within the migration.
-### Migration options supported by the [`Elastic::MigrationWorker`](https://gitlab.com/gitlab-org/gitlab/blob/master/ee/app/workers/elastic/migration_worker.rb)
+### Migration options supported by the `Elastic::MigrationWorker`
+
+[`Elastic::MigrationWorker`](https://gitlab.com/gitlab-org/gitlab/blob/master/ee/app/workers/elastic/migration_worker.rb) supports the following migration options:
- `batched!` - Allow the migration to run in batches. If set, the [`Elastic::MigrationWorker`](https://gitlab.com/gitlab-org/gitlab/blob/master/ee/app/workers/elastic/migration_worker.rb)
will re-enqueue itself with a delay which is set using the `throttle_delay` option described below. The batching
@@ -230,6 +232,9 @@ enough time to finish. Additionally, the time should be less than 30 minutes sin
[`Elastic::MigrationWorker`](https://gitlab.com/gitlab-org/gitlab/blob/master/ee/app/workers/elastic/migration_worker.rb)
cron worker runs. Default value is 5 minutes.
+- `pause_indexing!` - Pause indexing while the migration runs. This setting will record the indexing setting before
+the migration runs and set it back to that value when the migration is completed.
+
```ruby
# frozen_string_literal: true
@@ -242,6 +247,102 @@ class BatchedMigrationName < Elastic::Migration
end
```
+### Multi-version compatibility
+
+These Advanced Search migrations, like any other GitLab changes, need to support the case where
+[multiple versions of the application are running at the same time](multi_version_compatibility.md).
+
+Depending on the order of deployment, it's possible that the migration
+has started or finished and there's still a server running the application code from before the
+migration. We need to take this into consideration until we can [ensure all Advanced Search migrations
+start after the deployment has finished](https://gitlab.com/gitlab-org/gitlab/-/issues/321619).
+
+### Reverting a migration
+
+Because Elasticsearch does not support transactions, we always need to design our
+migrations to accommodate a situation where the application
+code is reverted after the migration has started or after it is finished.
+
+For this reason we generally defer destructive actions (for example, deletions after
+some data is moved) to a later merge request after the migrations have
+completed successfully. To be safe, for self-managed customers we should also
+defer it to another release if there is risk of important data loss.
+
+### Best practices for Advanced Search migrations
+
+Follow these best practices for best results:
+
+- When working in batches, keep the batch size under 9,000 documents
+ and `throttle_delay` over 3 minutes. The bulk indexer is set to run
+ every 1 minute and process a batch of 10,000 documents. These limits
+ allow the bulk indexer time to process records before another migration
+ batch is attempted.
+- To ensure that document counts are up to date, it is recommended to refresh
+ the index before checking if a migration is completed.
+- Add logging statements to each migration when the migration starts, when a
+ completion check occurs, and when the migration is completed. These logs
+ are helpful when debugging issues with migrations.
+- Pause indexing if you're using any Elasticsearch Reindex API operations.
+- Consider adding a retry limit if there is potential for the migration to fail.
+ This ensures that migrations can be halted if an issue occurs.
+
+## Deleting Advanced Search migrations in a major version upgrade
+
+Since our Advanced Search migrations usually require us to support multiple
+code paths for a long period of time, it's important to clean those up when we
+safely can.
+
+We choose to use GitLab major version upgrades as a safe time to remove
+backwards compatibility for indices that have not been fully migrated. We
+[document this in our upgrade
+documentation](../update/index.md#upgrading-to-a-new-major-version). We also
+choose to remove the migration code and tests so that:
+
+- We don't need to maintain any code that is called from our Advanced Search
+ migrations.
+- We don't waste CI time running tests for migrations that we don't support
+ anymore.
+
+To be extra safe, we will not delete migrations that were created in the last
+minor version before the major upgrade. So, if the we are upgrading to `%14.0`,
+we should not delete migrations that were only added in `%13.11`. This is an
+extra safety net as we expect there are migrations that get merged that may
+take multiple weeks to finish on GitLab.com. It would be bad if we upgraded
+GitLab.com to `%14.0` before the migrations in `%13.11` were finished. Since
+our deployments to GitLab.com are automated and we currently don't have
+automated checks to prevent this, the extra precaution is warranted.
+Additionally, even if we did have automated checks to prevent it, we wouldn't
+actually want to hold up GitLab.com deployments on Advanced Search migrations,
+as they may still have another week to go, and that's too long to block
+deployments.
+
+### Process for removing migrations
+
+For every migration that was created 2 minor versions before the major version
+being upgraded to, we do the following:
+
+1. Confirm the migration has actually completed successfully for GitLab.com.
+1. Replace the content of `migrate` and `completed?` methods as follows:
+
+ ```ruby
+ def migrate
+ log_raise "Migration has been deleted in the last major version upgrade." \
+ "Migrations are supposed to be finished before upgrading major version https://docs.gitlab.com/ee/update/#upgrading-to-a-new-major-version ." \
+ "In order to correct this issue you will need to reacreate your index from scratch https://docs.gitlab.com/ee/integration/elasticsearch.html#last-resort-to-recreate-an-index ."
+ end
+
+ def completed?
+ false
+ end
+ ```
+
+1. Delete any spec files to support this migration.
+1. Remove any logic handling backwards compatibility for this migration. You
+ can find this by looking for
+ `Elastic::DataMigrationService.migration_has_finished?(:migration_name_in_lowercase)`.
+1. Create a merge request with these changes. Noting that we should not
+ accidentally merge this before the major release is started.
+
## Performance Monitoring
### Prometheus
diff --git a/doc/development/experiment_guide/experimentation.md b/doc/development/experiment_guide/experimentation.md
new file mode 100644
index 00000000000..7135f8acd9b
--- /dev/null
+++ b/doc/development/experiment_guide/experimentation.md
@@ -0,0 +1,399 @@
+---
+stage: Growth
+group: Activation
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Create an A/B test with `Experimentation Module`
+
+## Implement the experiment
+
+1. Add the experiment to the `Gitlab::Experimentation::EXPERIMENTS` hash in
+ [`experimentation.rb`](https://gitlab.com/gitlab-org/gitlab/blob/master/lib%2Fgitlab%2Fexperimentation.rb):
+
+ ```ruby
+ EXPERIMENTS = {
+ other_experiment: {
+ #...
+ },
+ # Add your experiment here:
+ signup_flow: {
+ tracking_category: 'Growth::Activation::Experiment::SignUpFlow' # Used for providing the category when setting up tracking data
+ }
+ }.freeze
+ ```
+
+1. Use the experiment in the code.
+
+ Experiments can be performed on a `subject`. The provided `subject` should
+ respond to `to_global_id` or `to_s`.
+ The resulting string is bucketed and assigned to either the control or the
+ experimental group, so you must always provide the same `subject`
+ for an experiment to have the same experience.
+
+ 1. Use this standard for the experiment in a controller:
+
+ - Experiment run for a user:
+
+ ```ruby
+ class ProjectController < ApplicationController
+ def show
+ # experiment_enabled?(:experiment_key) is also available in views and helpers
+ if experiment_enabled?(:signup_flow, subject: current_user)
+ # render the experiment
+ else
+ # render the original version
+ end
+ end
+ end
+ ```
+
+ - Experiment run for a namespace:
+
+ ```ruby
+ if experiment_enabled?(:signup_flow, subject: namespace)
+ # experiment code
+ else
+ # control code
+ end
+ ```
+
+ When no subject is given, it falls back to a cookie that gets set and is consistent until
+ the cookie gets deleted.
+
+ ```ruby
+ class RegistrationController < ApplicationController
+ def show
+ # falls back to a cookie
+ if experiment_enabled?(:signup_flow)
+ # render the experiment
+ else
+ # render the original version
+ end
+ end
+ end
+ ```
+
+ 1. Make the experiment available to the frontend in a controller. This example
+ checks whether the experiment is enabled and pushes the result to the frontend:
+
+ ```ruby
+ before_action do
+ push_frontend_experiment(:signup_flow, subject: current_user)
+ end
+ ```
+
+ You can check the state of the feature flag in JavaScript:
+
+ ```javascript
+ import { isExperimentEnabled } from '~/experimentation';
+
+ if ( isExperimentEnabled('signupFlow') ) {
+ // ...
+ }
+ ```
+
+You can also run an experiment outside of the controller scope, such as in a worker:
+
+```ruby
+class SomeWorker
+ def perform
+ # Check if the experiment is active at all (the percentage_of_time_value > 0)
+ return unless Gitlab::Experimentation.active?(:experiment_key)
+
+ # Since we cannot access cookies in a worker, we need to bucket models
+ # based on a unique, unchanging attribute instead.
+ # It is therefore necessery to always provide the same subject.
+ if Gitlab::Experimentation.in_experiment_group?(:experiment_key, subject: user)
+ # execute experimental code
+ else
+ # execute control code
+ end
+ end
+end
+```
+
+## Implement tracking events
+
+To determine whether the experiment is a success or not, we must implement tracking events
+to acquire data for analyzing. We can send events to Snowplow via either the backend or frontend.
+Read the [product intelligence guide](https://about.gitlab.com/handbook/product/product-intelligence-guide/) for more details.
+
+### Track backend events
+
+The framework provides a helper method that is available in controllers:
+
+```ruby
+before_action do
+ track_experiment_event(:signup_flow, 'action', 'value', subject: current_user)
+end
+```
+
+To test it:
+
+```ruby
+context 'when the experiment is active and the user is in the experimental group' do
+ before do
+ stub_experiment(signup_flow: true)
+ stub_experiment_for_subject(signup_flow: true)
+ end
+
+ it 'tracks an event', :snowplow do
+ subject
+
+ expect_snowplow_event(
+ category: 'Growth::Activation::Experiment::SignUpFlow',
+ action: 'action',
+ value: 'value',
+ label: 'experimentation_subject_id',
+ property: 'experimental_group'
+ )
+ end
+end
+```
+
+### Track frontend events
+
+The framework provides a helper method that is available in controllers:
+
+```ruby
+before_action do
+ push_frontend_experiment(:signup_flow, subject: current_user)
+ frontend_experimentation_tracking_data(:signup_flow, 'action', 'value', subject: current_user)
+end
+```
+
+This pushes tracking data to `gon.experiments` and `gon.tracking_data`.
+
+```ruby
+expect(Gon.experiments['signupFlow']).to eq(true)
+
+expect(Gon.tracking_data).to eq(
+ {
+ category: 'Growth::Activation::Experiment::SignUpFlow',
+ action: 'action',
+ value: 'value',
+ label: 'experimentation_subject_id',
+ property: 'experimental_group'
+ }
+)
+```
+
+To track it:
+
+```javascript
+import { isExperimentEnabled } from '~/lib/utils/experimentation';
+import Tracking from '~/tracking';
+
+document.addEventListener('DOMContentLoaded', () => {
+ const signupFlowExperimentEnabled = isExperimentEnabled('signupFlow');
+
+ if (signupFlowExperimentEnabled && gon.tracking_data) {
+ const { category, action, ...data } = gon.tracking_data;
+
+ Tracking.event(category, action, data);
+ }
+}
+```
+
+To test it in Jest:
+
+```javascript
+import { withGonExperiment } from 'helpers/experimentation_helper';
+import Tracking from '~/tracking';
+
+describe('event tracking', () => {
+ describe('with tracking data', () => {
+ withGonExperiment('signupFlow');
+
+ beforeEach(() => {
+ jest.spyOn(Tracking, 'event').mockImplementation(() => {});
+
+ gon.tracking_data = {
+ category: 'Growth::Activation::Experiment::SignUpFlow',
+ action: 'action',
+ value: 'value',
+ label: 'experimentation_subject_id',
+ property: 'experimental_group'
+ };
+ });
+
+ it('should track data', () => {
+ performAction()
+
+ expect(Tracking.event).toHaveBeenCalledWith(
+ 'Growth::Activation::Experiment::SignUpFlow',
+ 'action',
+ {
+ value: 'value',
+ label: 'experimentation_subject_id',
+ property: 'experimental_group'
+ },
+ );
+ });
+ });
+});
+```
+
+## Record experiment user
+
+In addition to the anonymous tracking of events, we can also record which users
+have participated in which experiments, and whether they were given the control
+experience or the experimental experience.
+
+The `record_experiment_user` helper method is available to all controllers, and it
+enables you to record these experiment participants (the current user) and which
+experience they were given:
+
+```ruby
+before_action do
+ record_experiment_user(:signup_flow)
+end
+```
+
+Subsequent calls to this method for the same experiment and the same user have no
+effect unless the user is then enrolled into a different experience. This happens
+when we roll out the experimental experience to a greater percentage of users.
+
+This data is completely separate from the [events tracking data](#implement-tracking-events).
+They are not linked together in any way.
+
+### Add context
+
+You can add arbitrary context data in a hash which gets stored as part of the experiment
+user record. New calls to the `record_experiment_user` with newer contexts are merged
+deeply into the existing context.
+
+This data can then be used by data analytics dashboards.
+
+```ruby
+before_action do
+ record_experiment_user(:signup_flow, foo: 42, bar: { a: 22})
+ # context is { "foo" => 42, "bar" => { "a" => 22 }}
+end
+
+# Additional contexts for newer record calls are merged deeply
+record_experiment_user(:signup_flow, foo: 40, bar: { b: 2 }, thor: 3)
+# context becomes { "foo" => 40, "bar" => { "a" => 22, "b" => 2 }, "thor" => 3}
+```
+
+## Record experiment conversion event
+
+Along with the tracking of backend and frontend events and the
+[recording of experiment participants](#record-experiment-user), we can also record
+when a user performs the desired conversion event action. For example:
+
+- **Experimental experience:** Show an in-product nudge to test if the change causes more
+ people to sign up for trials.
+- **Conversion event:** The user starts a trial.
+
+The `record_experiment_conversion_event` helper method is available to all controllers.
+Use it to record the conversion event for the current user, regardless of whether
+the user is in the control or experimental group:
+
+```ruby
+before_action do
+ record_experiment_conversion_event(:signup_flow)
+end
+```
+
+Note that the use of this method requires that we have first
+[recorded the user](#record-experiment-user) as being part of the experiment.
+
+## Enable the experiment
+
+After all merge requests have been merged, use [ChatOps](../../ci/chatops/index.md) in the
+[appropriate channel](../feature_flags/controls.md#communicate-the-change) to start the experiment for 10% of the users.
+The feature flag should have the name of the experiment with the `_experiment_percentage` suffix appended.
+For visibility, share any commands run against production in the `#s_growth` channel:
+
+ ```shell
+ /chatops run feature set signup_flow_experiment_percentage 10
+ ```
+
+ If you notice issues with the experiment, you can disable the experiment by removing the feature flag:
+
+ ```shell
+ /chatops run feature delete signup_flow_experiment_percentage
+ ```
+
+## Add user to experiment group manually
+
+To force the application to add your current user into the experiment group,
+add a query string parameter to the path where the experiment runs. If you add the
+query string parameter, the experiment works only for this request, and doesn't work
+after following links or submitting forms.
+
+For example, to forcibly enable the `EXPERIMENT_KEY` experiment, add `force_experiment=EXPERIMENT_KEY`
+to the URL:
+
+```shell
+https://gitlab.com/<EXPERIMENT_ENTRY_URL>?force_experiment=<EXPERIMENT_KEY>
+```
+
+## Add user to experiment group with a cookie
+
+You can force the current user into the experiment group for `<EXPERIMENT_KEY>`
+during the browser session by using your browser's developer tools:
+
+```javascript
+document.cookie = "force_experiment=<EXPERIMENT_KEY>; path=/";
+```
+
+Use a comma to list more than one experiment to be forced:
+
+```javascript
+document.cookie = "force_experiment=<EXPERIMENT_KEY>,<ANOTHER_EXPERIMENT_KEY>; path=/";
+```
+
+To clear the experiments, unset the `force_experiment` cookie:
+
+```javascript
+document.cookie = "force_experiment=; path=/";
+```
+
+## Testing and test helpers
+
+### RSpec
+
+Use the following in RSpec to mock the experiment:
+
+```ruby
+context 'when the experiment is active' do
+ before do
+ stub_experiment(signup_flow: true)
+ end
+
+ context 'when the user is in the experimental group' do
+ before do
+ stub_experiment_for_subject(signup_flow: true)
+ end
+
+ it { is_expected.to do_experimental_thing }
+ end
+
+ context 'when the user is in the control group' do
+ before do
+ stub_experiment_for_subject(signup_flow: false)
+ end
+
+ it { is_expected.to do_control_thing }
+ end
+end
+```
+
+### Jest
+
+Use the following in Jest to mock the experiment:
+
+```javascript
+import { withGonExperiment } from 'helpers/experimentation_helper';
+
+describe('given experiment is enabled', () => {
+ withGonExperiment('signupFlow');
+
+ it('should do the experimental thing', () => {
+ expect(wrapper.find('.js-some-experiment-triggered-element')).toEqual(expect.any(Element));
+ });
+});
+```
diff --git a/doc/development/experiment_guide/gitlab_experiment.md b/doc/development/experiment_guide/gitlab_experiment.md
new file mode 100644
index 00000000000..6b15449b812
--- /dev/null
+++ b/doc/development/experiment_guide/gitlab_experiment.md
@@ -0,0 +1,547 @@
+---
+stage: Growth
+group: Adoption
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Implementing an A/B/n experiment using GLEX
+
+## Introduction
+
+`Gitlab::Experiment` (GLEX) is tightly coupled with the concepts provided by
+[Feature flags in development of GitLab](../feature_flags/index.md). Here, we refer
+to this layer as feature flags, and may also use the term Flipper, because we
+built our development and experiment feature flags atop it.
+
+You're strongly encouraged to read and understand the
+[Feature flags in development of GitLab](../feature_flags/index.md) portion of the
+documentation before considering running experiments. Experiments add additional
+concepts which may seem confusing or advanced without understanding the underpinnings
+of how GitLab uses feature flags in development. One concept: GLEX supports multivariate
+experiments, which are sometimes referred to as A/B/n tests.
+
+The [`gitlab-experiment` project](https://gitlab.com/gitlab-org/gitlab-experiment)
+exists in a separate repository, so it can be shared across any GitLab property that uses
+Ruby. You should feel comfortable reading the documentation on that project as well
+if you want to dig into more advanced topics.
+
+## Glossary of terms
+
+To ensure a shared language, you should understand these fundamental terms we use
+when communicating about experiments:
+
+- `experiment`: Any deviation of code paths we want to run at some times, but not others.
+- `context`: A consistent experience we provide in an experiment.
+- `control`: The default, or "original" code path.
+- `candidate`: Defines an experiment with only one code path.
+- `variant(s)`: Defines an experiment with multiple code paths.
+
+### How it works
+
+Use this decision tree diagram to understand how GLEX works. When an experiment runs,
+the following logic is executed to determine what variant should be provided,
+given how the experiment has been defined and using the provided context:
+
+```mermaid
+graph TD
+ GP[General Pool/Population] --> Running?
+ Running? -->|Yes| Cached?[Cached? / Pre-segmented?]
+ Running? -->|No| Excluded[Control / No Tracking]
+ Cached? -->|No| Excluded?
+ Cached? -->|Yes| Cached[Cached Value]
+ Excluded? -->|Yes / Cached| Excluded
+ Excluded? -->|No| Segmented?
+ Segmented? -->|Yes / Cached| VariantA
+ Segmented? -->|No| Included?[Experiment Group?]
+ Included? -->|Yes| Rollout
+ Included? -->|No| Control
+ Rollout -->|Cached| VariantA
+ Rollout -->|Cached| VariantB
+ Rollout -->|Cached| VariantC
+
+classDef included fill:#380d75,color:#ffffff,stroke:none
+classDef excluded fill:#fca121,stroke:none
+classDef cached fill:#2e2e2e,color:#ffffff,stroke:none
+classDef default fill:#fff,stroke:#6e49cb
+
+class VariantA,VariantB,VariantC included
+class Control,Excluded excluded
+class Cached cached
+```
+
+## Implement an experiment
+
+Start by generating a feature flag using the `bin/feature-flag` command as you
+normally would for a development feature flag, making sure to use `experiment` for
+the type. For the sake of documentation let's name our feature flag (and experiment)
+"pill_color".
+
+```shell
+bin/feature-flag pill_color -t experiment
+```
+
+After you generate the desired feature flag, you can immediately implement an
+experiment in code. An experiment implementation can be as simple as:
+
+```ruby
+experiment(:pill_color, actor: current_user) do |e|
+ e.use { 'control' }
+ e.try(:red) { 'red' }
+ e.try(:blue) { 'blue' }
+end
+```
+
+When this code executes, the experiment is run, a variant is assigned, and (if within a
+controller or view) a `window.gon.experiment.pillColor` object will be available in the
+client layer, with details like:
+
+- The assigned variant.
+- The context key for client tracking events.
+
+In addition, when an experiment runs, an event is tracked for
+the experiment `:assignment`. We cover more about events, tracking, and
+the client layer later.
+
+In local development, you can make the experiment active by using the feature flag
+interface. You can also target specific cases by providing the relevant experiment
+to the call to enable the feature flag:
+
+```ruby
+# Enable for everyone
+Feature.enable(:pill_color)
+
+# Get the `experiment` method -- already available in controllers, views, and mailers.
+include Gitlab::Experiment::Dsl
+# Enable for only the first user
+Feature.enable(:pill_color, experiment(:pill_color, actor: User.first))
+```
+
+To roll out your experiment feature flag on an environment, run
+the following command using ChatOps (which is covered in more depth in the
+[Feature flags in development of GitLab](../feature_flags/index.md) documentation).
+This command creates a scenario where half of everyone who encounters
+the experiment would be assigned the _control_, 25% would be assigned the _red_
+variant, and 25% would be assigned the _blue_ variant:
+
+```slack
+/chatops run feature set pill_color 50 --actors
+```
+
+For an even distribution in this example, change the command to set it to 66% instead
+of 50.
+
+NOTE:
+To immediately stop running an experiment, use the
+`/chatops run feature set pill_color false` command.
+
+WARNING:
+We strongly recommend using the `--actors` flag when using the ChatOps commands,
+as anything else may give odd behaviors due to how the caching of variant assignment is
+handled.
+
+We can also implement this experiment in a HAML file with HTML wrappings:
+
+```haml
+#cta-interface
+ - experiment(:pill_color, actor: current_user) do |e|
+ - e.use do
+ .pill-button control
+ - e.try(:red) do
+ .pill-button.red red
+ - e.try(:blue) do
+ .pill-button.blue blue
+```
+
+### The importance of context
+
+In our previous example experiment, our context (this is an important term) is a hash
+that's set to `{ actor: current_user }`. Context must be unique based on how you
+want to run your experiment, and should be understood at a lower level.
+
+It's expected, and recommended, that you use some of these
+contexts to simplify reporting:
+
+- `{ actor: current_user }`: Assigns a variant and is "sticky" to each user
+ (or "client" if `current_user` is nil) who enters the experiment.
+- `{ project: project }`: Assigns a variant and is "sticky" to the project currently
+ being viewed. If running your experiment is more useful when viewing a project,
+ rather than when a specific user is viewing any project, consider this approach.
+- `{ group: group }`: Similar to the project example, but applies to a wider
+ scope of projects and users.
+- `{ actor: current_user, project: project }`: Assigns a variant and is "sticky"
+ to the user who is viewing the given project. This creates a different variant
+ assignment possibility for every project that `current_user` views. Understand this
+ can create a large cache size if an experiment like this in a highly trafficked part
+ of the application.
+- `{ wday: Time.current.wday }`: Assigns a variant based on the current day of the
+ week. In this example, it would consistently assign one variant on Friday, and a
+ potentially different variant on Saturday.
+
+Context is critical to how you define and report on your experiment. It's usually
+the most important aspect of how you choose to implement your experiment, so consider
+it carefully, and discuss it with the wider team if needed. Also, take into account
+that the context you choose affects our cache size.
+
+After the above examples, we can state the general case: *given a specific
+and consistent context, we can provide a consistent experience and track events for
+that experience.* To dive a bit deeper into the implementation details: a context key
+is generated from the context that's provided. Use this context key to:
+
+- Determine the assigned variant.
+- Identify events tracked against that context key.
+
+We can think about this as the experience that we've rendered, which is both dictated
+and tracked by the context key. The context key is used to track the interaction and
+results of the experience we've rendered to that context key. These concepts are
+somewhat abstract and hard to understand initially, but this approach enables us to
+communicate about experiments as something that's wider than just user behavior.
+
+NOTE:
+Using `actor:` utilizes cookies if the `current_user` is nil. If you don't need
+cookies though - meaning that the exposed functionality would only be visible to
+signed in users - `{ user: current_user }` would be just as effective.
+
+WARNING:
+The caching of variant assignment is done by using this context, and so consider
+your impact on the cache size when defining your experiment. If you use
+`{ time: Time.current }` you would be inflating the cache size every time the
+experiment is run. Not only that, your experiment would not be "sticky" and events
+wouldn't be resolvable.
+
+### Advanced experimentation
+
+GLEX allows for two general implementation styles:
+
+1. The simple experiment style described previously.
+1. A more advanced style where an experiment class can be provided.
+
+The advanced style is handled by naming convention, and works similar to what you
+would expect in Rails.
+
+To generate a custom experiment class that can override the defaults in
+`ApplicationExperiment` (our base GLEX implementation), use the rails generator:
+
+```shell
+rails generate gitlab:experiment pill_color control red blue
+```
+
+This generates an experiment class in `app/experiments/pill_color_experiment.rb`
+with the variants (or _behaviors_) we've provided to the generator. Here's an example
+of how that class would look after migrating the previous example into it:
+
+```ruby
+class PillColorExperiment < ApplicationExperiment
+ def control_behavior
+ 'control'
+ end
+
+ def red_behavior
+ 'red'
+ end
+
+ def blue_behavior
+ 'blue'
+ end
+end
+```
+
+We can now simplify where we run our experiment to the following call, instead of
+providing the block we were initially providing, by explicitly calling `run`:
+
+```ruby
+experiment(:pill_color, actor: current_user).run
+```
+
+The _behavior_ methods we defined in our experiment class represent the default
+implementation. You can still use the block syntax to override these _behavior_
+methods however, so the following would also be valid:
+
+```ruby
+experiment(:pill_color, actor: current_user) do |e|
+ e.use { '<strong>control</strong>' }
+end
+```
+
+NOTE:
+When passing a block to the `experiment` method, it is implicitly invoked as
+if `run` has been called.
+
+#### Segmentation rules
+
+You can use runtime segmentation rules to, for instance, segment contexts into a specific
+variant. The `segment` method is a callback (like `before_action`) and so allows providing
+a block or method name.
+
+In this example, any user named `'Richard'` would always be assigned the _red_
+variant, and any account older than 2 weeks old would be assigned the _blue_ variant:
+
+```ruby
+class PillColorExperiment < ApplicationExperiment
+ segment(variant: :red) { context.actor.first_name == 'Richard' }
+ segment :old_account?, variant: :blue
+
+ # ...behaviors
+
+ private
+
+ def old_account?
+ context.actor.created_at < 2.weeks.ago
+ end
+end
+```
+
+When an experiment runs, the segmentation rules are executed in the order they're
+defined. The first segmentation rule to produce a truthy result assigns the variant.
+
+In our example, any user named `'Richard'`, regardless of account age, will always
+be assigned the _red_ variant. If you want the opposite logic, flip the order.
+
+NOTE:
+Keep in mind when defining segmentation rules: after a truthy result, the remaining
+segmentation rules are skipped to achieve optimal performance.
+
+#### Exclusion rules
+
+Exclusion rules are similar to segmentation rules, but are intended to determine
+if a context should even be considered as something we should include in the experiment
+and track events toward. Exclusion means we don't care about the events in relation
+to the given context.
+
+These examples exclude all users named `'Richard'`, *and* any account
+older than 2 weeks old. Not only are they given the control behavior - which could
+be nothing - but no events are tracked in these cases as well.
+
+```ruby
+class PillColorExperiment < ApplicationExperiment
+ exclude :old_account?, ->{ context.actor.first_name == 'Richard' }
+
+ # ...behaviors
+
+ private
+
+ def old_account?
+ context.actor.created_at < 2.weeks.ago
+ end
+end
+```
+
+We can also do exclusion when we run the experiment. For instance,
+if we wanted to prevent the inclusion of non-administrators in an experiment, consider
+the following experiment. This type of logic enables us to do complex experiments
+while preventing us from passing things into our experiments, because
+we want to minimize passing things into our experiments:
+
+```ruby
+experiment(:pill_color, actor: current_user) do |e|
+ e.exclude! unless can?(current_user, :admin_project, project)
+end
+```
+
+You may also need to check exclusion in custom tracking logic by calling `should_track?`:
+
+```ruby
+class PillColorExperiment < ApplicationExperiment
+ # ...behaviors
+
+ def expensive_tracking_logic
+ return unless should_track?
+
+ track(:my_event, value: expensive_method_call)
+ end
+end
+```
+
+Exclusion rules aren't the best way to determine if an experiment is active. Override
+the `enabled?` method for a high-level way of determining if an experiment should
+run and track. Make the `enabled?` check as efficient as possible because it's the
+first early opt-out path an experiment can implement.
+
+### Tracking events
+
+One of the most important aspects of experiments is gathering data and reporting on
+it. GLEX provides an interface that allows tracking events across an experiment.
+You can implement it consistently if you provide the same context between
+calls to your experiment. If you do not yet understand context, you should read
+about contexts now.
+
+We can assume we run the experiment in one or a few places, but
+track events potentially in many places. The tracking call remains the same, with
+the arguments you would normally use when
+[tracking events using snowplow](../snowplow.md). The easiest example
+of tracking an event in Ruby would be:
+
+```ruby
+experiment(:pill_color, actor: current_user).track(:created)
+```
+
+When you run an experiment with any of these examples, an `:assigned` event
+is tracked automatically by default. All events that are tracked from an
+experiment have a special
+[experiment context](https://gitlab.com/gitlab-org/iglu/-/blob/master/public/schemas/com.gitlab/gitlab_experiment/jsonschema/1-0-0)
+added to the event. This can be used - typically by the data team - to create a connection
+between the events on a given experiment.
+
+If our current user hasn't encountered the experiment yet (meaning where the experiment
+is run), and we track an event for them, they are assigned a variant and see
+that variant if they ever encountered the experiment later, when an `:assignment`
+event would be tracked at that time for them.
+
+NOTE:
+GitLab tries to be sensitive and respectful of our customers regarding tracking,
+so GLEX allows us to implement an experiment without ever tracking identifying
+IDs. It's not always possible, though, based on experiment reporting requirements.
+You may be asked from time to time to track a specific record ID in experiments.
+The approach is largely up to the PM and engineer creating the implementation.
+No recommendations are provided here at this time.
+
+## Test with RSpec
+
+This gem provides some RSpec helpers and custom matchers. These are in flux as of GitLab 13.10.
+
+First, require the RSpec support file to mix in some of the basics:
+
+```ruby
+require 'gitlab/experiment/rspec'
+```
+
+You still need to include matchers and other aspects, which happens
+automatically for files in `spec/experiments`, but for other files and specs
+you want to include it in, you can specify the `:experiment` type:
+
+```ruby
+it "tests", :experiment do
+end
+```
+
+### Stub helpers
+
+You can stub experiments using `stub_experiments`. Pass it a hash using experiment
+names as the keys, and the variants you want each to resolve to, as the values:
+
+```ruby
+# Ensures the experiments named `:example` & `:example2` are both
+# "enabled" and that each will resolve to the given variant
+# (`:my_variant` & `:control` respectively).
+stub_experiments(example: :my_variant, example2: :control)
+
+experiment(:example) do |e|
+ e.enabled? # => true
+ e.variant.name # => 'my_variant'
+end
+
+experiment(:example2) do |e|
+ e.enabled? # => true
+ e.variant.name # => 'control'
+end
+```
+
+### Exclusion and segmentation matchers
+
+You can also test the exclusion and segmentation matchers.
+
+```ruby
+class ExampleExperiment < ApplicationExperiment
+ exclude { context.actor.first_name == 'Richard' }
+ segment(variant: :candidate) { context.actor.username == 'jejacks0n' }
+end
+
+excluded = double(username: 'rdiggitty', first_name: 'Richard')
+segmented = double(username: 'jejacks0n', first_name: 'Jeremy')
+
+# exclude matcher
+expect(experiment(:example)).to exclude(actor: excluded)
+expect(experiment(:example)).not_to exclude(actor: segmented)
+
+# segment matcher
+expect(experiment(:example)).to segment(actor: segmented).into(:candidate)
+expect(experiment(:example)).not_to segment(actor: excluded)
+```
+
+### Tracking matcher
+
+Tracking events is a major aspect of experimentation. We try
+to provide a flexible way to ensure your tracking calls are covered.
+
+You can do this on the instance level or at an "any instance" level:
+
+```ruby
+subject = experiment(:example)
+
+expect(subject).to track(:my_event)
+
+subject.track(:my_event)
+```
+
+You can use the `on_any_instance` chain method to specify that it could happen on
+any instance of the experiment. This helps you if you're calling
+`experiment(:example).track` downstream:
+
+```ruby
+expect(experiment(:example)).to track(:my_event).on_any_instance
+
+experiment(:example).track(:my_event)
+```
+
+A full example of the methods you can chain onto the `track` matcher:
+
+```ruby
+expect(experiment(:example)).to track(:my_event, value: 1, property: '_property_')
+ .on_any_instance
+ .with_context(foo: :bar)
+ .for(:variant_name)
+
+experiment(:example, :variant_name, foo: :bar).track(:my_event, value: 1, property: '_property_')
+```
+
+## Experiments in the client layer
+
+This is in flux as of GitLab 13.10, and can't be documented just yet.
+
+Any experiment that's been run in the request lifecycle surfaces in `window.gon.experiment`,
+and matches [this schema](https://gitlab.com/gitlab-org/iglu/-/blob/master/public/schemas/com.gitlab/gitlab_experiment/jsonschema/1-0-0)
+so you can use it when resolving some concepts around experimentation in the client layer.
+
+## Notes on feature flags
+
+NOTE:
+We use the terms "enabled" and "disabled" here, even though it's against our
+[documentation style guide recommendations](../documentation/styleguide/index.md#avoid-ableist-language)
+because these are the terms that the feature flag documentation uses.
+
+You may already be familiar with the concept of feature flags in GitLab, but using
+feature flags in experiments is a bit different. While in general terms, a feature flag
+is viewed as being either `on` or `off`, this isn't accurate for experiments.
+
+Generally, `off` means that when we ask if a feature flag is enabled, it will always
+return `false`, and `on` means that it will always return `true`. An interim state,
+considered `conditional`, also exists. GLEX takes advantage of this trinary state of
+feature flags. To understand this `conditional` aspect: consider that either of these
+settings puts a feature flag into this state:
+
+- Setting a `percentage_of_actors` of any percent greater than 0%.
+- Enabling it for a single user or group.
+
+Conditional means that it returns `true` in some situations, but not all situations.
+
+When a feature flag is disabled (meaning the state is `off`), the experiment is
+considered _inactive_. You can visualize this in the [decision tree diagram](#how-it-works)
+as reaching the first [Running?] node, and traversing the negative path.
+
+When a feature flag is rolled out to a `percentage_of_actors` or similar (meaning the
+state is `conditional`) the experiment is considered to be _running_
+where sometimes the control is assigned, and sometimes the candidate is assigned.
+We don't refer to this as being enabled, because that's a confusing and overloaded
+term here. In the experiment terms, our experiment is _running_, and the feature flag is
+`conditional`.
+
+When a feature flag is enabled (meaning the state is `on`), the candidate will always be
+assigned.
+
+We should try to be consistent with our terms, and so for experiments, we have an
+_inactive_ experiment until we set the feature flag to `conditional`. After which,
+our experiment is then considered _running_. If you choose to "enable" your feature flag,
+you should consider the experiment to be _resolved_, because everyone is assigned
+the candidate unless they've opted out of experimentation.
+
+As of GitLab 13.10, work is being done to improve this process and how we communicate
+about it.
diff --git a/doc/development/experiment_guide/index.md b/doc/development/experiment_guide/index.md
index 21c61324dc1..15430831f4a 100644
--- a/doc/development/experiment_guide/index.md
+++ b/doc/development/experiment_guide/index.md
@@ -8,7 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
Experiments can be conducted by any GitLab team, most often the teams from the [Growth Sub-department](https://about.gitlab.com/handbook/engineering/development/growth/). Experiments are not tied to releases because they primarily target GitLab.com.
-Experiments are run as an A/B test and are behind a feature flag to turn the test on or off. Based on the data the experiment generates, the team decides if the experiment had a positive impact and should be made the new default or rolled back.
+Experiments are run as an A/B/n test, and are behind a feature flag to turn the test on or off. Based on the data the experiment generates, the team decides if the experiment had a positive impact and should be made the new default, or rolled back.
## Experiment tracking issue
@@ -36,386 +36,27 @@ and link to the issue that resolves the experiment. If the experiment is
successful and becomes part of the product, any follow up issues should be
addressed.
-## Experiments using `gitlab-experiment`
+## Implementing an experiment
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/300383) in GitLab 13.7.
-> - It's [deployed behind a feature flag](../../user/feature_flags.md), disabled by default.
-> - It's enabled on GitLab.com.
-> - It is not yet intended for use in GitLab self-managed instances.
+There are currently two options when implementing an experiment.
-[GitLab Experiment](https://gitlab.com/gitlab-org/gitlab-experiment/) is a gem included
-in GitLab that can be used for running experiments.
+One is built into GitLab directly and has been around for a while (this is called
+`Exerimentation Module`), and the other is provided by
+[`gitlab-experiment`](https://gitlab.com/gitlab-org/gitlab-experiment) and is referred
+to as `Gitlab::Experiment` -- GLEX for short.
-## How to create an A/B test using `experimentation.rb`
+Both approaches use [experiment](../feature_flags/index.md#experiment-type)
+feature flags, and there is currently no strong suggestion to use one over the other.
-### Implement the experiment
+| Feature | `Experimentation Module` | GLEX |
+| -------------------- |------------------------- | ---- |
+| Record user grouping | Yes | No |
+| Uses feature flags | Yes | Yes |
+| Multivariate (A/B/n) | No | Yes |
-1. Add the experiment to the `Gitlab::Experimentation::EXPERIMENTS` hash in [`experimentation.rb`](https://gitlab.com/gitlab-org/gitlab/blob/master/lib%2Fgitlab%2Fexperimentation.rb):
+- [Implementing an A/B experiment using `Experimentation Module`](experimentation.md)
+- [Implementing an A/B/n experiment using GLEX](gitlab_experiment.md)
- ```ruby
- EXPERIMENTS = {
- other_experiment: {
- #...
- },
- # Add your experiment here:
- signup_flow: {
- tracking_category: 'Growth::Activation::Experiment::SignUpFlow' # Used for providing the category when setting up tracking data
- }
- }.freeze
- ```
-
-1. Use the experiment in the code.
-
- Experiments can be performed on a `subject`. The `subject` that gets provided needs to respond to `to_global_id` or `to_s`.
- The resulting string is bucketed and assigned to either the control or the experimental group. It's therefore necessary to always provide the same `subject` for an experiment to have the same experience.
-
- - Use this standard for the experiment in a controller:
-
- Experiment run for a user:
-
- ```ruby
- class ProjectController < ApplicationController
- def show
- # experiment_enabled?(:experiment_key) is also available in views and helpers
- if experiment_enabled?(:signup_flow, subject: current_user)
- # render the experiment
- else
- # render the original version
- end
- end
- end
- ```
-
- or experiment run for a namespace:
-
- ```ruby
- if experiment_enabled?(:signup_flow, subject: namespace)
- # experiment code
- else
- # control code
- end
- ```
-
- When no subject is given, it falls back to a cookie that gets set and is consistent until
- the cookie gets deleted.
-
- ```ruby
- class RegistrationController < ApplicationController
- def show
- # falls back to a cookie
- if experiment_enabled?(:signup_flow)
- # render the experiment
- else
- # render the original version
- end
- end
- end
- ```
-
- - Make the experiment available to the frontend in a controller:
-
- ```ruby
- before_action do
- push_frontend_experiment(:signup_flow, subject: current_user)
- end
- ```
-
- The above checks whether the experiment is enabled and pushes the result to the frontend.
-
- You can check the state of the feature flag in JavaScript:
-
- ```javascript
- import { isExperimentEnabled } from '~/experimentation';
-
- if ( isExperimentEnabled('signupFlow') ) {
- // ...
- }
- ```
-
- - It is also possible to run an experiment outside of the controller scope, for example in a worker:
-
- ```ruby
- class SomeWorker
- def perform
- # Check if the experiment is active at all (the percentage_of_time_value > 0)
- return unless Gitlab::Experimentation.active?(:experiment_key)
-
- # Since we cannot access cookies in a worker, we need to bucket models based on a unique, unchanging attribute instead.
- # It is therefore necessery to always provide the same subject.
- if Gitlab::Experimentation.in_experiment_group?(:experiment_key, subject: user)
- # execute experimental code
- else
- # execute control code
- end
- end
- end
- ```
-
-### Implement the tracking events
-
-To determine whether the experiment is a success or not, we must implement tracking events
-to acquire data for analyzing. We can send events to Snowplow via either the backend or frontend.
-Read the [product intelligence guide](https://about.gitlab.com/handbook/product/product-intelligence-guide/) for more details.
-
-#### Track backend events
-
-The framework provides the following helper method that is available in controllers:
-
-```ruby
-before_action do
- track_experiment_event(:signup_flow, 'action', 'value', subject: current_user)
-end
-```
-
-Which can be tested as follows:
-
-```ruby
-context 'when the experiment is active and the user is in the experimental group' do
- before do
- stub_experiment(signup_flow: true)
- stub_experiment_for_subject(signup_flow: true)
- end
-
- it 'tracks an event', :snowplow do
- subject
-
- expect_snowplow_event(
- category: 'Growth::Activation::Experiment::SignUpFlow',
- action: 'action',
- value: 'value',
- label: 'experimentation_subject_id',
- property: 'experimental_group'
- )
- end
-end
-```
-
-#### Track frontend events
-
-The framework provides the following helper method that is available in controllers:
-
-```ruby
-before_action do
- push_frontend_experiment(:signup_flow, subject: current_user)
- frontend_experimentation_tracking_data(:signup_flow, 'action', 'value', subject: current_user)
-end
-```
-
-This pushes tracking data to `gon.experiments` and `gon.tracking_data`.
-
-```ruby
-expect(Gon.experiments['signupFlow']).to eq(true)
-
-expect(Gon.tracking_data).to eq(
- {
- category: 'Growth::Activation::Experiment::SignUpFlow',
- action: 'action',
- value: 'value',
- label: 'experimentation_subject_id',
- property: 'experimental_group'
- }
-)
-```
-
-Which can then be used for tracking as follows:
-
-```javascript
-import { isExperimentEnabled } from '~/lib/utils/experimentation';
-import Tracking from '~/tracking';
-
-document.addEventListener('DOMContentLoaded', () => {
- const signupFlowExperimentEnabled = isExperimentEnabled('signupFlow');
-
- if (signupFlowExperimentEnabled && gon.tracking_data) {
- const { category, action, ...data } = gon.tracking_data;
-
- Tracking.event(category, action, data);
- }
-}
-```
-
-Which can be tested in Jest as follows:
-
-```javascript
-import { withGonExperiment } from 'helpers/experimentation_helper';
-import Tracking from '~/tracking';
-
-describe('event tracking', () => {
- describe('with tracking data', () => {
- withGonExperiment('signupFlow');
-
- beforeEach(() => {
- jest.spyOn(Tracking, 'event').mockImplementation(() => {});
-
- gon.tracking_data = {
- category: 'Growth::Activation::Experiment::SignUpFlow',
- action: 'action',
- value: 'value',
- label: 'experimentation_subject_id',
- property: 'experimental_group'
- };
- });
-
- it('should track data', () => {
- performAction()
-
- expect(Tracking.event).toHaveBeenCalledWith(
- 'Growth::Activation::Experiment::SignUpFlow',
- 'action',
- {
- value: 'value',
- label: 'experimentation_subject_id',
- property: 'experimental_group'
- },
- );
- });
- });
-});
-```
-
-### Record experiment user
-
-In addition to the anonymous tracking of events, we can also record which users have participated in which experiments and whether they were given the control experience or the experimental experience.
-
-The `record_experiment_user` helper method is available to all controllers, and it enables you to record these experiment participants (the current user) and which experience they were given:
-
-```ruby
-before_action do
- record_experiment_user(:signup_flow)
-end
-```
-
-Subsequent calls to this method for the same experiment and the same user have no effect unless the user has gets enrolled into a different experience. This happens when we roll out the experimental experience to a greater percentage of users.
-
-Note that this data is completely separate from the [events tracking data](#implement-the-tracking-events). They are not linked together in any way.
-
-#### Add context
-
-You can add arbitrary context data in a hash which gets stored as part of the experiment user record. New calls to the `record_experiment_user` with newer contexts get merged deeply into the existing context.
-
-This data can then be used by data analytics dashboards.
-
-```ruby
-before_action do
- record_experiment_user(:signup_flow, foo: 42, bar: { a: 22})
- # context is { "foo" => 42, "bar" => { "a" => 22 }}
-end
-
-# Additional contexts for newer record calls are merged deeply
-record_experiment_user(:signup_flow, foo: 40, bar: { b: 2 }, thor: 3)
-# context becomes { "foo" => 40, "bar" => { "a" => 22, "b" => 2 }, "thor" => 3}
-```
-
-### Record experiment conversion event
-
-Along with the tracking of backend and frontend events and the [recording of experiment participants](#record-experiment-user), we can also record when a user performs the desired conversion event action. For example:
-
-- **Experimental experience:** Show an in-product nudge to see if it causes more people to sign up for trials.
-- **Conversion event:** The user starts a trial.
-
-The `record_experiment_conversion_event` helper method is available to all controllers. It enables us to record the conversion event for the current user, regardless of whether they are in the control or experimental group:
-
-```ruby
-before_action do
- record_experiment_conversion_event(:signup_flow)
-end
-```
-
-Note that the use of this method requires that we have first [recorded the user as being part of the experiment](#record-experiment-user).
-
-### Enable the experiment
-
-After all merge requests have been merged, use [`chatops`](../../ci/chatops/index.md) in the
-[appropriate channel](../feature_flags/controls.md#communicate-the-change) to start the experiment for 10% of the users.
-The feature flag should have the name of the experiment with the `_experiment_percentage` suffix appended.
-For visibility, please also share any commands run against production in the `#s_growth` channel:
-
- ```shell
- /chatops run feature set signup_flow_experiment_percentage 10
- ```
-
- If you notice issues with the experiment, you can disable the experiment by removing the feature flag:
-
- ```shell
- /chatops run feature delete signup_flow_experiment_percentage
- ```
-
-### Manually force the current user to be in the experiment group
-
-You may force the application to put your current user in the experiment group. To do so
-add a query string parameter to the path where the experiment runs. If you do so,
-the experiment will work only for this request and won't work after following links or submitting forms.
-
-For example, to forcibly enable the `EXPERIMENT_KEY` experiment, add `force_experiment=EXPERIMENT_KEY`
-to the URL:
-
-```shell
-https://gitlab.com/<EXPERIMENT_ENTRY_URL>?force_experiment=<EXPERIMENT_KEY>
-```
-
-### A cookie-based approach to force an experiment
-
-It's possible to force the current user to be in the experiment group for `<EXPERIMENT_KEY>`
-during the browser session by using your browser's developer tools:
-
-```javascript
-document.cookie = "force_experiment=<EXPERIMENT_KEY>; path=/";
-```
-
-Use a comma to list more than one experiment to be forced:
-
-```javascript
-document.cookie = "force_experiment=<EXPERIMENT_KEY>,<ANOTHER_EXPERIMENT_KEY>; path=/";
-```
-
-To clear the experiments, unset the `force_experiment` cookie:
-
-```javascript
-document.cookie = "force_experiment=; path=/";
-```
-
-### Testing and test helpers
-
-#### RSpec
-
-Use the following in RSpec to mock the experiment:
-
-```ruby
-context 'when the experiment is active' do
- before do
- stub_experiment(signup_flow: true)
- end
-
- context 'when the user is in the experimental group' do
- before do
- stub_experiment_for_subject(signup_flow: true)
- end
-
- it { is_expected.to do_experimental_thing }
- end
-
- context 'when the user is in the control group' do
- before do
- stub_experiment_for_subject(signup_flow: false)
- end
-
- it { is_expected.to do_control_thing }
- end
-end
-```
-
-#### Jest
-
-Use the following in Jest to mock the experiment:
-
-```javascript
-import { withGonExperiment } from 'helpers/experimentation_helper';
-
-describe('given experiment is enabled', () => {
- withGonExperiment('signupFlow');
-
- it('should do the experimental thing', () => {
- expect(wrapper.find('.js-some-experiment-triggered-element')).toEqual(expect.any(Element));
- });
-});
-```
+Historical Context: `Experimentation Module` was built iteratively with the needs that
+appeared while implementing Growth sub-department experiments, while GLEX was built
+with the learnings of the team and an easier to use API.
diff --git a/doc/development/export_csv.md b/doc/development/export_csv.md
index 0bf12149779..c301b6b9d66 100644
--- a/doc/development/export_csv.md
+++ b/doc/development/export_csv.md
@@ -14,7 +14,7 @@ This document lists the different implementations of CSV export in GitLab codeba
| Downloading | - Query and write data in batches to a temporary file.<br>- Loads the file into memory.<br>- Sends the file to the client. | - Report available immediately. | - Large amount of data might cause request timeout.<br>- Memory intensive.<br>- Request expires when user navigates to a different page. | [Export Chain of Custody Report](../user/compliance/compliance_dashboard/#chain-of-custody-report) |
| As email attachment | - Asynchronously process the query with background job.<br>- Email uses the export as an attachment. | - Asynchronous processing. | - Requires users use a different app (email) to download the CSV.<br>- Email providers may limit attachment size. | - [Export Issues](../user/project/issues/csv_export.md)<br>- [Export Merge Requests](../user/project/merge_requests/csv_export.md) |
| As downloadable link in email (*) | - Asynchronously process the query with background job.<br>- Email uses an export link. | - Asynchronous processing.<br>- Bypasses email provider attachment size limit. | - Requires users use a different app (email).<br>- Requires additional storage and cleanup. | [Export User Permissions](https://gitlab.com/gitlab-org/gitlab/-/issues/1772) |
-| Polling (non-persistent state) | - Asynchronously processes the query with the background job.<br>- Frontend(FE) polls every few seconds to check if CSV file is ready. | - Asynchronous processing.<br>- Automatically downloads to local machine on completion.<br>- In-app solution. | - Non-persistable request - request expires when user navigates to a different page.<br>- API is processed for each polling request. | [Export Vulnerabilities](../user/application_security/vulnerability_report/#export-vulnerabilities) |
+| Polling (non-persistent state) | - Asynchronously processes the query with the background job.<br>- Frontend(FE) polls every few seconds to check if CSV file is ready. | - Asynchronous processing.<br>- Automatically downloads to local machine on completion.<br>- In-app solution. | - Non-persistable request - request expires when user navigates to a different page.<br>- API is processed for each polling request. | [Export Vulnerabilities](../user/application_security/vulnerability_report/#export-vulnerability-details) |
| Polling (persistent state) (*) | - Asynchronously processes the query with background job.<br>- Backend (BE) maintains the export state<br>- FE polls every few seconds to check status.<br>- FE shows 'Download link' when export is ready.<br>- User can download or regenerate a new report. | - Asynchronous processing.<br>- No database calls made during the polling requests (HTTP 304 status is returned until export status changes).<br>- Does not require user to stay on page until export is complete.<br>- In-app solution.<br>- Can be expanded into a generic CSV feature (such as dashboard / CSV API). | - Requires to maintain export states in DB.<br>- Does not automatically download the CSV export to local machine, requires users to click 'Download' button. | [Export Merge Commits Report](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/43055) |
NOTE:
diff --git a/doc/development/fe_guide/accessibility.md b/doc/development/fe_guide/accessibility.md
index 5ad1a701fac..5f22c13ca06 100644
--- a/doc/development/fe_guide/accessibility.md
+++ b/doc/development/fe_guide/accessibility.md
@@ -4,14 +4,195 @@ 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
---
-# Accessibility & Readability
+# Accessibility
+
+Accessibility is important for users who use screen readers or rely on keyboard-only functionality
+to ensure they have an equivalent experience to sighted mouse users.
+
+This page contains guidelines we should follow.
+
+## Quick summary
+
+Since [no ARIA is better than bad ARIA](https://www.w3.org/TR/wai-aria-practices/#no_aria_better_bad_aria),
+review the following recommendations before using `aria-*`, `role`, and `tabindex`.
+Use semantic HTML, which typically has accessibility semantics baked in, but always be sure to test with
+[relevant combinations of screen readers and browsers](https://www.accessibility-developer-guide.com/knowledge/screen-readers/relevant-combinations/).
+
+In [WebAIM's accessibility analysis of the top million home pages](https://webaim.org/projects/million/#aria),
+they found that "ARIA correlated to higher detectable errors".
+It is likely that *misuse* of ARIA is a big cause of increased errors,
+so when in doubt don't use `aria-*`, `role`, and `tabindex`, and stick with semantic HTML.
+
+## Provide accessible names to screen readers
+
+To provide markup with accessible names, ensure every:
+
+- `input` has an associated `label`.
+- `button` and `a` have child text, or `aria-label` when text isn’t present.
+ For example, an icon button with no visible text.
+- `img` has an `alt` attribute.
+- `fieldset` has `legend` as its first child.
+- `figure` has `figcaption` as its first child.
+- `table` has `caption` as its first child.
+
+If the `label`, child text, or child element is not visually desired,
+use `.gl-sr-only` to hide the element from everything but screen readers.
+
+Ensure the accessible name is descriptive enough to be understood in isolation.
+
+```html
+// bad
+<button>Submit</button>
+<a href="url">page</a>
+
+// good
+<button>Submit review</button>
+<a href="url">GitLab's accessibility page</a>
+```
+
+## Role
+
+In general, avoid using `role`.
+Use semantic HTML elements that implicitly have a `role` instead.
+
+| Bad | Good |
+| --- | --- |
+| `<div role="button">` | `<button>` |
+| `<div role="img">` | `<img>` |
+| `<div role="link">` | `<a>` |
+| `<div role="header">` | `<h1>` to `<h6>` |
+| `<div role="textbox">` | `<input>` or `<textarea>` |
+| `<div role="article">` | `<article>` |
+| `<div role="list">` | `<ol>` or `<ul>` |
+| `<div role="listitem">` | `<li>` |
+| `<div role="table">` | `<table>` |
+| `<div role="rowgroup">` | `<thead>`, `<tbody>`, or `<tfoot>` |
+| `<div role="row">` | `<tr>` |
+| `<div role="columnheader">` | `<th>` |
+| `<div role="cell">` | `<td>` |
+
+## Support keyboard-only use
+
+Keyboard users rely on focus outlines to understand where they are on the page. Therefore, if an
+element is interactive you must ensure:
+
+- It can receive keyboard focus.
+- It has a visible focus state.
+
+Use semantic HTML, such as `a` and `button`, which provides these behaviours by default.
+
+See the [Pajamas Keyboard-only page](https://design.gitlab.com/accessibility-audits/2-keyboard-only/) for more detail.
+
+## Tabindex
+
+Prefer **no** `tabindex` to using `tabindex`, since:
+
+- Using semantic HTML such as `button` implicitly provides `tabindex="0"`
+- Tabbing order should match the visual reading order and positive `tabindex`s interfere with this
+
+### Avoid using `tabindex="0"` to make an element interactive
+
+Use interactive elements instead of `div`s and `span`s.
+For example:
+
+- If the element should be clickable, use a `button`
+- If the element should be text editable, use an `input` or `textarea`
+
+Once the markup is semantically complete, use CSS to update it to its desired visual state.
+
+```html
+// bad
+<div role="button" tabindex="0" @click="expand">Expand</div>
+
+// good
+<button @click="expand">Expand</button>
+```
+
+### Do not use `tabindex="0"` on interactive elements
+
+Interactive elements are already tab accessible so adding `tabindex` is redundant.
+
+```html
+// bad
+<a href="help" tabindex="0">Help</a>
+<button tabindex="0">Submit</button>
+
+// good
+<a href="help">Help</a>
+<button>Submit</button>
+```
+
+### Do not use `tabindex="0"` on elements for screen readers to read
+
+Screen readers can read text that is not tab accessible.
+The use of `tabindex="0"` is unnecessary and can cause problems,
+as screen reader users then expect to be able to interact with it.
+
+```html
+// bad
+<span tabindex="0" :aria-label="message">{{ message }}</span>
+
+// good
+<p>{{ message }}</p>
+```
+
+### Do not use a positive `tabindex`
+
+[Always avoid using `tabindex="1"`](https://webaim.org/techniques/keyboard/tabindex#overview)
+or greater.
+
+## Hiding elements
+
+Use the following table to hide elements from users, when appropriate.
+
+| Hide from sighted users | Hide from screen readers | Hide from both sighted and screen reader users |
+| --- | --- | --- |
+| `.gl-sr-only` | `aria-hidden="true"` | `display: none`, `visibility: hidden`, or `hidden` attribute |
+
+### Hide decorative images from screen readers
+
+To reduce noise for screen reader users, hide decorative images using `alt=""`.
+If the image is not an `img` element, such as an inline SVG, you can hide it by adding both `role="img"` and `alt=""`.
+
+`gl-icon` components automatically hide their icons from screen readers so `aria-hidden="true"` is
+unnecessary when using `gl-icon`.
+
+```html
+// good - decorative images hidden from screen readers
+<img src="decorative.jpg" alt="">
+<svg role="img" alt="">
+<gl-icon name="epic"/>
+```
+
+## When should ARIA be used
+
+No ARIA is required when using semantic HTML because it incorporates accessibility.
+
+However, there are some UI patterns and widgets that do not have semantic HTML equivalents.
+Building such widgets require ARIA to make them understandable to screen readers.
+Proper research and testing should be done to ensure compliance with ARIA.
+
+Ideally, these widgets would exist only in [GitLab UI](https://gitlab-org.gitlab.io/gitlab-ui/).
+Use of ARIA would then only occur in [GitLab UI](https://gitlab.com/gitlab-org/gitlab-ui/) and not [GitLab](https://gitlab.com/gitlab-org/gitlab/).
## Resources
-[Chrome Accessibility Developer Tools](https://github.com/GoogleChrome/accessibility-developer-tools)
-assist with testing for potential accessibility problems in GitLab.
+### Viewing the browser accessibility tree
+
+- [Firefox DevTools guide](https://developer.mozilla.org/en-US/docs/Tools/Accessibility_inspector#accessing_the_accessibility_inspector)
+- [Chrome DevTools guide](https://developers.google.com/web/tools/chrome-devtools/accessibility/reference#pane)
+
+### Browser extensions
+
+We have two options for Web accessibility testing:
+
+- [axe](https://www.deque.com/axe/) for [Firefox](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/)
+- [axe](https://www.deque.com/axe/) for [Chrome](https://chrome.google.com/webstore/detail/axe-devtools-web-accessib/lhdoppojpmngadmnindnejefpokejbdd)
-The [axe](https://www.deque.com/axe/) browser extension (available for [Firefox](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/) and [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd)) provides running audits and feedback on markup, CSS, and even potentially problematic color usages.
+### Other links
-Accessibility best-practices and more in-depth information are available on
-[the Audit Rules page](https://github.com/GoogleChrome/accessibility-developer-tools/wiki/Audit-Rules) for the Chrome Accessibility Developer Tools. The [Awesome Accessibility](https://github.com/brunopulis/awesome-a11y) list is a compilation of accessibility-related material.
+- [The A11Y Project](https://www.a11yproject.com/) is a good resource for accessibility
+- [Awesome Accessibility](https://github.com/brunopulis/awesome-a11y)
+ is a compilation of accessibility-related material
+- You can read [Chrome Accessibility Developer Tools'](https://github.com/GoogleChrome/accessibility-developer-tools)
+ rules on its [Audit Rules page](https://github.com/GoogleChrome/accessibility-developer-tools/wiki/Audit-Rules)
diff --git a/doc/development/fe_guide/architecture.md b/doc/development/fe_guide/architecture.md
index c51f99ca9d2..afaf6df8f8a 100644
--- a/doc/development/fe_guide/architecture.md
+++ b/doc/development/fe_guide/architecture.md
@@ -17,6 +17,13 @@ when appropriate.
You can find the Frontend Architecture experts on the [team page](https://about.gitlab.com/company/team/).
+## Widget Architecture
+
+The [Plan stage](https://about.gitlab.com/handbook/engineering/development/dev/fe-plan/)
+is refactoring the right sidebar to consist of **widgets**. They have a specific architecture to be
+reusable and to expose an interface that can be used by external Vue applications on the page.
+Learn more about the [widget architecture](widgets.md).
+
## Examples
You can find [documentation about the desired architecture](vue.md) for a new
diff --git a/doc/development/fe_guide/dark_mode.md b/doc/development/fe_guide/dark_mode.md
index dd7ffd1ee6c..34901bbb1e6 100644
--- a/doc/development/fe_guide/dark_mode.md
+++ b/doc/development/fe_guide/dark_mode.md
@@ -17,7 +17,7 @@ Note the following:
- The dark mode palette is defined in `app/assets/stylesheets/themes/_dark.scss`.
This is loaded _before_ application.scss to generate `application_dark.css`
- We define two types of variables in `_dark.scss`:
- - SCSS variables are used in framework, components, and utitlity classes.
+ - SCSS variables are used in framework, components, and utility classes.
- CSS variables are used for any colors within the `app/assets/stylesheets/page_bundles` directory.
- `app/views/layouts/_head.html.haml` then loads application or application_dark based on the user's theme preference.
@@ -68,7 +68,7 @@ We [plan to add](https://gitlab.com/gitlab-org/gitlab/-/issues/301147) the CSS v
## When to use SCSS variables
There are a few things we do in SCSS that we cannot (easily) do with CSS, such as the following
-functions:
+functions:
- `lighten`
- `darken`
diff --git a/doc/development/fe_guide/dependencies.md b/doc/development/fe_guide/dependencies.md
index 8fe03544f85..bf46e8e16ce 100644
--- a/doc/development/fe_guide/dependencies.md
+++ b/doc/development/fe_guide/dependencies.md
@@ -20,7 +20,7 @@ This distinction is used by omnibus to determine which dependencies it requires
Exceptions are made for some tools that we require in the
`compile-production-assets` CI job such as `webpack-bundle-analyzer` to analyze our
-production assets post-compile.
+production assets post-compile.
## Updating dependencies
diff --git a/doc/development/fe_guide/editor_lite.md b/doc/development/fe_guide/editor_lite.md
index f783a97fbd3..5ad0c753ced 100644
--- a/doc/development/fe_guide/editor_lite.md
+++ b/doc/development/fe_guide/editor_lite.md
@@ -4,116 +4,141 @@ 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
---
-# Editor Lite
+# Editor Lite **(FREE)**
-## Background
+**Editor Lite** provides the editing experience at GitLab. This thin wrapper around
+[the Monaco editor](https://microsoft.github.io/monaco-editor/) provides necessary
+helpers and abstractions, and extends Monaco [using extensions](#extensions). Multiple
+GitLab features use it, including:
-**Editor Lite** is a technological product driving features like [Web Editor](../../user/project/repository/web_editor.md), [Snippets](../../user/snippets.md), and [CI Linter](../../ci/lint.md). Editor Lite is the driving technology for any single-file editing experience across the product.
-
-Editor Lite is a thin wrapper around [the Monaco editor](https://microsoft.github.io/monaco-editor/index.html) that provides the necessary helpers and abstractions and extends Monaco using extensions.
+- [Web IDE](../../user/project/web_ide/index.md)
+- [CI Linter](../../ci/lint.md)
+- [Snippets](../../user/snippets.md)
+- [Web Editor](../../user/project/repository/web_editor.md)
## How to use Editor Lite
-Editor Lite is framework-agnostic and can be used in any application, whether it's Rails or Vue. For the convenience of integration, we have the dedicated `<editor-lite>` Vue component, but in general, the integration of Editor Lite is pretty straightforward:
+Editor Lite is framework-agnostic and can be used in any application, including both
+Rails and Vue. To help with integration, we have the dedicated `<editor-lite>`
+Vue component, but the integration of Editor Lite is generally straightforward:
1. Import Editor Lite:
-```javascript
-import EditorLite from '~/editor/editor_lite';
-```
+ ```javascript
+ import EditorLite from '~/editor/editor_lite';
+ ```
1. Initialize global editor for the view:
-```javascript
-const editor = new EditorLite({
- // Editor Options.
- // The list of all accepted options can be found at
- // https://microsoft.github.io/monaco-editor/api/enums/monaco.editor.editoroption.html
-});
-```
+ ```javascript
+ const editor = new EditorLite({
+ // Editor Options.
+ // The list of all accepted options can be found at
+ // https://microsoft.github.io/monaco-editor/api/enums/monaco.editor.editoroption.html
+ });
+ ```
1. Create an editor's instance:
-```javascript
-editor.createInstance({
- // Editor Lite configuration options.
-})
-```
+ ```javascript
+ editor.createInstance({
+ // Editor Lite configuration options.
+ })
+ ```
An instance of Editor Lite accepts the following configuration options:
| Option | Required? | Description |
-| ---- | ---- | ---- |
-| `el` | `true` | `HTML Node`: element on which to render the editor |
-| `blobPath` | `false` | `String`: the name of a file to render in the editor. It is used to identify the correct syntax highlighter to use with that or another file type. Can accept wildcard as in `*.js` when the actual filename isn't known or doesn't play any role |
-| `blobContent` | `false` | `String`: the initial content to be rendered in the editor |
-| `extensions` | `false` | `Array`: extensions to use in this instance |
-| `blobGlobalId` | `false` | `String`: auto-generated property.<br>**Note:** this prop might go away in the future. Do not pass `blobGlobalId` unless you know what you're doing.|
-| [Editor Options](https://microsoft.github.io/monaco-editor/api/enums/monaco.editor.editoroption.html) | `false` | `Object(s)`: any prop outside of the list above is treated as an Editor Option for this particular instance. This way, one can override global Editor Options on the instance level. |
+| -------------- | ------- | ---- |
+| `el` | `true` | `HTML Node`: The element on which to render the editor. |
+| `blobPath` | `false` | `String`: The name of a file to render in the editor, used to identify the correct syntax highlighter to use with that file, or another file type. Can accept wildcards like `*.js` when the actual filename isn't known or doesn't play any role. |
+| `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. |
## API
-The editor follows the same public API as [provided by Monaco editor](https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.istandalonecodeeditor.html) with just a few additional functions on the instance level:
+The editor uses the same public API as
+[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 _instance_ level|
-| `use` | Array of objects | Array of **extensions** to apply to the instance. Accepts only the array of _objects_, which means that the extensions' ES6 modules should be fetched and resolved in your views/components before being passed to `use`. This prop is available on _instance_ (applies extension to this particular instance) and _global editor_ (applies the same extension to all instances) levels. |
+| 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 |
## Tips
1. Editor's loading state.
-Editor Lite comes with the loading state built-in, making spinners and loaders rarely needed in HTML. To benefit the built-in loading state, set the `data-editor-loading` property on the HTML element that is supposed to contain the editor. Editor Lite shows the loader automatically while it's bootstrapping.
-![Editor Lite: loading state](img/editor_lite_loading.png)
+ The loading state is built in to Editor Lite, making spinners and loaders
+ rarely needed in HTML. To benefit the built-in loading state, set the `data-editor-loading`
+ property on the HTML element that should contain the editor. When bootstrapping,
+ Editor Lite shows the loader automatically.
+
+ ![Editor Lite: loading state](img/editor_lite_loading.png)
1. Update syntax highlighting if the filename changes.
-```javascript
-// fileNameEl here is the HTML input element that contains the file name
-fileNameEl.addEventListener('change', () => {
- this.editor.updateModelLanguage(fileNameEl.value);
-});
-```
+ ```javascript
+ // fileNameEl here is the HTML input element that contains the file name
+ fileNameEl.addEventListener('change', () => {
+ this.editor.updateModelLanguage(fileNameEl.value);
+ });
+ ```
1. Get the editor's content.
-We might set up listeners on the editor for every change but it rapidly can become an expensive operation. Instead , we can get editor's content when it's needed. For example on a form's submission:
+ We may set up listeners on the editor for every change, but it rapidly can become
+ an expensive operation. Instead, get the editor's content when it's needed.
+ For example, on a form's submission:
-```javascript
-form.addEventListener('submit', () => {
- my_content_variable = this.editor.getValue();
-});
-```
+ ```javascript
+ form.addEventListener('submit', () => {
+ my_content_variable = this.editor.getValue();
+ });
+ ```
1. Performance
-Even though Editor Lite itself is extremely slim, it still depends on Monaco editor. Monaco is not an easily tree-shakeable module. Hence, every time you add Editor Lite to a view, the JavaScript bundle's size significantly increases, affecting your view's loading performance. It is recommended to import the editor on demand on those views where it is not 100% certain that the editor is needed. Or if the editor is a secondary element of the view. Loading Editor Lite on demand is no different from loading any other module:
+ Even though Editor Lite itself is extremely slim, it still depends on Monaco editor,
+ which adds weight. Every time you add Editor Lite to a view, the JavaScript bundle's
+ size significantly increases, affecting your view's loading performance. We recommend
+ you import the editor on demand if either:
-```javascript
-someActionFunction() {
- import(/* webpackChunkName: 'EditorLite' */ '~/editor/editor_lite').
- then(({ default: EditorLite }) => {
- const editor = new EditorLite();
- ...
- });
- ...
-}
-```
+ - You're uncertain if the view needs the editor.
+ - The editor is a secondary element of the view.
+
+ Loading Editor Lite on demand is handled like loading any other module:
+
+ ```javascript
+ someActionFunction() {
+ import(/* webpackChunkName: 'EditorLite' */ '~/editor/editor_lite').
+ then(({ default: EditorLite }) => {
+ const editor = new EditorLite();
+ ...
+ });
+ ...
+ }
+ ```
## Extensions
-Editor Lite has been built to provide a universal, extensible editing tool to the whole product,
-which would not depend on any particular group. Even though the Editor Lite's core is owned by
+Editor Lite provides a universal, extensible editing tool to the whole product,
+and doesn't depend on any particular group. Even though the Editor Lite's core is owned by
[Create::Editor FE Team](https://about.gitlab.com/handbook/engineering/development/dev/create-editor/),
-the main functional elements — extensions — can be owned by any group. Editor Lite extensions' main idea
-is that the core of the editor remains very slim and stable. At the same time, whatever new functionality
-is needed can be added as an extension to this core, without touching the core itself. Any group is allowed
-to build and own new editing functionality without being afraid of it being broken or overridden with
-the Editor Lite changes.
+any group can own the extensions—the main functional elements. The goal of
+Editor Lite extensions is to keep the editor's core slim and stable. Any
+needed features can be added as extensions to this core. Any group can
+build and own new editing features without worrying about changes to Editor Lite
+breaking or overriding them.
-Structurally, the complete implementation of Editor Lite could be presented as the following diagram:
+You can depend on other modules in your extensions. This organization helps keep
+the size of Editor Lite's core at bay by importing dependencies only when needed.
+
+Structurally, the complete implementation of Editor Lite can be presented as this diagram:
```mermaid
graph TD;
@@ -125,7 +150,7 @@ graph TD;
A[Editor Lite]---Z[Monaco]
```
-Technically, an extension is just an ES6 module that exports a JavaScript object:
+An extension is an ES6 module that exports a JavaScript object:
```javascript
import { Position } from 'monaco-editor';
@@ -138,10 +163,9 @@ export default {
```
-Important things to note here:
-
-- We can depend on other modules in our extensions. This organization helps keep the size of Editor Lite's core at bay by importing dependencies only when needed.
-- `this` in extension's functions refers to the current Editor Lite instance. Using `this`, you get access to the complete instance's API, such as the `setPosition()` method in this particular case.
+In the extension's functions, `this` refers to the current Editor Lite instance.
+Using `this`, you get access to the complete instance's API, such as the
+`setPosition()` method in this particular case.
### Using an existing extension
@@ -159,7 +183,11 @@ editor.use(MyExtension);
### Creating an extension
-Let's create our first Editor Lite extension. Extensions are ES6 modules exporting a basic `Object` that is used to extend Editor Lite's functionality. As a test, let's create an extension that extends Editor Lite with a new function that, when called, outputs editor's content in `alert`.
+Let's create our first Editor Lite extension. Extensions are
+[ES6 modules](https://hacks.mozilla.org/2015/08/es6-in-depth-modules/) exporting a
+basic `Object`, used to extend Editor Lite's features. As a test, let's
+create an extension that extends Editor Lite with a new function that, when called,
+outputs the editor's content in `alert`.
`~/my_folder/my_fancy_extension.js:`
@@ -171,7 +199,10 @@ export default {
};
```
-And that's it with our extension! Note that we're using `this` as a reference to the instance. And through it, we get access to the complete underlying [Monaco editor API](https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.istandalonecodeeditor.html) like `getValue()` in this case.
+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),
+which includes functions like `getValue()`.
Now let's use our extension:
@@ -191,7 +222,11 @@ someButton.addEventListener('click', () => {
});
```
-First of all, we import Editor Lite and our new extension. Then we create the editor and its instance. By default Editor Lite has no `throwContentAtMe` method. But the `editor.use(MyFancyExtension)` line brings that method to our instance. After that, we can use it any time we need it. In this case, we call it when some theoretical button has been clicked.
+First of all, we import Editor Lite and our new extension. Then we create the
+editor and its instance. By default Editor Lite has no `throwContentAtMe` method.
+But the `editor.use(MyFancyExtension)` line brings that method to our instance.
+After that, we can use it any time we need it. In this case, we call it when some
+theoretical button has been clicked.
This script would result in an alert containing the editor's content when `someButton` is clicked.
@@ -201,27 +236,28 @@ This script would result in an alert containing the editor's content when `someB
1. Performance
-Just like Editor Lite itself, any extension can be loaded on demand to not harm loading performance of the views:
+ Just like Editor Lite itself, any extension can be loaded on demand to not harm
+ loading performance of the views:
-```javascript
-const EditorPromise = import(
- /* webpackChunkName: 'EditorLite' */ '~/editor/editor_lite'
-);
-const MarkdownExtensionPromise = import('~/editor/editor_markdown_ext');
-
-Promise.all([EditorPromise, MarkdownExtensionPromise])
- .then(([{ default: EditorLite }, { default: MarkdownExtension }]) => {
- const editor = new EditorLite().createInstance({
- ...
- });
- editor.use(MarkdownExtension);
- });
-```
+ ```javascript
+ const EditorPromise = import(
+ /* webpackChunkName: 'EditorLite' */ '~/editor/editor_lite'
+ );
+ const MarkdownExtensionPromise = import('~/editor/editor_markdown_ext');
+
+ Promise.all([EditorPromise, MarkdownExtensionPromise])
+ .then(([{ default: EditorLite }, { default: MarkdownExtension }]) => {
+ const editor = new EditorLite().createInstance({
+ ...
+ });
+ editor.use(MarkdownExtension);
+ });
+ ```
1. Using multiple extensions
-Just pass the array of extensions to your `use` method:
+ Just pass the array of extensions to your `use` method:
-```javascript
-editor.use([FileTemplateExtension, MyFancyExtension]);
-```
+ ```javascript
+ editor.use([FileTemplateExtension, MyFancyExtension]);
+ ```
diff --git a/doc/development/fe_guide/graphql.md b/doc/development/fe_guide/graphql.md
index a53d9fee029..2e812d9fa0a 100644
--- a/doc/development/fe_guide/graphql.md
+++ b/doc/development/fe_guide/graphql.md
@@ -63,6 +63,7 @@ see [Immutability and cache updates](#immutability-and-cache-updates) for more i
If you use VS Code, the Apollo GraphQL extension supports autocompletion in `.graphql` files. To set up
the GraphQL extension, follow these steps:
+1. Generate the schema: `bundle exec rake gitlab:graphql:schema:dump`
1. Add an `apollo.config.js` file to the root of your `gitlab` local directory.
1. Populate the file with the following content:
@@ -72,7 +73,7 @@ the GraphQL extension, follow these steps:
includes: ['./app/assets/javascripts/**/*.graphql', './ee/app/assets/javascripts/**/*.graphql'],
service: {
name: 'GitLab',
- localSchemaFile: './doc/api/graphql/reference/gitlab_schema.graphql',
+ localSchemaFile: './tmp/tests/graphql/gitlab_schema.graphql',
},
},
};
@@ -422,7 +423,7 @@ query getAuthorData($authorNameEnabled: Boolean = false) {
```
Then in the Vue (or JavaScript) call to the query we can pass in our feature flag. This feature
-flag needs to be already set up correctly. See the [feature flag documentation](../feature_flags/development.md)
+flag needs to be already set up correctly. See the [feature flag documentation](../feature_flags/index.md)
for the correct way to do this.
```javascript
@@ -768,6 +769,23 @@ export default {
### Testing
+#### Generating the GraphQL schema
+
+Some of our tests load the schema JSON files. To generate these files, run:
+
+```shell
+bundle exec rake gitlab:graphql:schema:dump
+```
+
+You should run this task after pulling from upstream, or when rebasing your
+branch. This is run automatically as part of `gdk update`.
+
+NOTE:
+If you use the RubyMine IDE, and have marked the `tmp` directory as
+"Excluded", you should "Mark Directory As -> Not Excluded" for
+`gitlab/tmp/tests/graphql`. This will allow the **JS GraphQL** plugin to
+automatically find and index the schema.
+
#### Mocking response as component data
<!-- vale gitlab.Spelling = NO -->
@@ -1093,6 +1111,45 @@ it('calls a mutation with correct parameters and reorders designs', async () =>
});
```
+To mock multiple query response states, success and failure, Apollo Client's native retry behavior can combine with Jest's mock functions to create a series of responses. These do not need to be advanced manually, but they do need to be awaited in specific fashion.
+
+```javascript
+describe('when query times out', () => {
+ const advanceApolloTimers = async () => {
+ jest.runOnlyPendingTimers();
+ await wrapper.vm.$nextTick();
+ await wrapper.vm.$nextTick();
+ };
+
+ beforeEach(async () => {
+ const failSucceedFail = jest
+ .fn()
+ .mockResolvedValueOnce({ errors: [{ message: 'timeout' }] })
+ .mockResolvedValueOnce(mockPipelineResponse)
+ .mockResolvedValueOnce({ errors: [{ message: 'timeout' }] });
+
+ createComponentWithApollo(failSucceedFail);
+ await wrapper.vm.$nextTick();
+ });
+
+ it('shows correct errors and does not overwrite populated data when data is empty', async () => {
+ /* fails at first, shows error, no data yet */
+ expect(getAlert().exists()).toBe(true);
+ expect(getGraph().exists()).toBe(false);
+
+ /* succeeds, clears error, shows graph */
+ await advanceApolloTimers();
+ expect(getAlert().exists()).toBe(false);
+ expect(getGraph().exists()).toBe(true);
+
+ /* fails again, alert retuns but data persists */
+ await advanceApolloTimers();
+ expect(getAlert().exists()).toBe(true);
+ expect(getGraph().exists()).toBe(true);
+ });
+});
+```
+
#### Testing `@client` queries
##### Using mock resolvers
diff --git a/doc/development/fe_guide/index.md b/doc/development/fe_guide/index.md
index 711c6a5f875..1315520342e 100644
--- a/doc/development/fe_guide/index.md
+++ b/doc/development/fe_guide/index.md
@@ -104,7 +104,7 @@ See the relevant style guides for our guidelines and for information on linting:
- [JavaScript](style/javascript.md). Our guide is based on
the excellent [Airbnb](https://github.com/airbnb/javascript) style guide with a few small
changes.
-- [SCSS](style/scss.md): our SCSS conventions which are enforced through [`scss-lint`](https://github.com/sds/scss-lint).
+- [SCSS](style/scss.md): [our SCSS conventions](https://gitlab.com/gitlab-org/frontend/gitlab-stylelint-config) which are enforced through [`stylelint`](https://stylelint.io).
- [HTML](style/html.md). Guidelines for writing HTML code consistent with the rest of the codebase.
- [Vue](style/vue.md). Guidelines and conventions for Vue code may be found here.
diff --git a/doc/development/fe_guide/security.md b/doc/development/fe_guide/security.md
index df4613d521d..f5486e075a2 100644
--- a/doc/development/fe_guide/security.md
+++ b/doc/development/fe_guide/security.md
@@ -8,7 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
## Resources
-[Mozilla’s HTTP Observatory CLI](https://github.com/mozilla/http-observatory-cli) and
+[Mozilla’s HTTP Observatory CLI](https://github.com/mozilla/http-observatory-cli) and
[Qualys SSL Labs Server Test](https://www.ssllabs.com/ssltest/analyze.html) are good resources for finding
potential problems and ensuring compliance with security best practices.
diff --git a/doc/development/fe_guide/style/html.md b/doc/development/fe_guide/style/html.md
index e53686de1a0..18f72a9655c 100644
--- a/doc/development/fe_guide/style/html.md
+++ b/doc/development/fe_guide/style/html.md
@@ -6,6 +6,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# HTML style guide
+See also our [accessibility page](../accessibility.md).
+
## Semantic elements
[Semantic elements](https://developer.mozilla.org/en-US/docs/Glossary/Semantics) are HTML tags that
@@ -52,30 +54,27 @@ Button tags requires a `type` attribute according to the [W3C HTML specification
<button type="button"></button>
```
-### Button role
-
-If an HTML element has an `onClick` handler but is not a button, it should have `role="button"`. This is [more accessible](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/button_role).
-
-```html
-// bad
-<div onClick="doSomething"></div>
-
-// good
-<div role="button" onClick="doSomething"></div>
-```
-
## Links
### Blank target
+Avoid forcing links to open in a new window as this reduces the control the user has over the link.
+However, it might be a good idea to use a blank target when replacing the current page with
+the link makes the user lose content or progress.
+
Use `rel="noopener noreferrer"` whenever your links open in a new window, i.e. `target="_blank"`. This prevents a security vulnerability [documented by JitBit](https://www.jitbit.com/alexblog/256-targetblank---the-most-underestimated-vulnerability-ever/).
+When using `gl-link`, using `target="_blank"` is sufficient as it automatically adds `rel="noopener noreferrer"` to the link.
+
```html
// bad
<a href="url" target="_blank"></a>
// good
<a href="url" target="_blank" rel="noopener noreferrer"></a>
+
+// good
+<gl-link href="url" target="_blank"></gl-link>
```
### Fake links
diff --git a/doc/development/fe_guide/style/index.md b/doc/development/fe_guide/style/index.md
index 89a3d874184..f3da78647be 100644
--- a/doc/development/fe_guide/style/index.md
+++ b/doc/development/fe_guide/style/index.md
@@ -16,7 +16,7 @@ changes.
## SCSS style guide
-Our [SCSS conventions](scss.md) which are enforced through [`scss-lint`](https://github.com/sds/scss-lint).
+Our [SCSS conventions](scss.md) which are enforced through [`stylelint`](https://stylelint.io).
## HTML style guide
diff --git a/doc/development/fe_guide/style/javascript.md b/doc/development/fe_guide/style/javascript.md
index 5c35b880eab..334372af1f4 100644
--- a/doc/development/fe_guide/style/javascript.md
+++ b/doc/development/fe_guide/style/javascript.md
@@ -14,7 +14,7 @@ In addition to the style guidelines set by Airbnb, we also have a few specific r
listed below.
NOTE:
-You can run ESLint locally by running `yarn eslint`
+You can run ESLint locally by running `yarn run lint:eslint:all` or `yarn run lint:eslint $PATH_TO_FILE`.
## Avoid forEach
@@ -294,3 +294,24 @@ Strive to write many small pure functions and minimize where mutations occur
var c = pureFunction(values.foo);
```
+
+## Export constants as primitives
+
+Prefer exporting constant primitives with a common namespace over exporting objects. This allows for better compile-time reference checks and helps to avoid accidential `undefined`s at runtime. In addition, it helps in reducing bundle sizes.
+
+Only export the constants as a collection (array, or object) when there is a need to iterate over them, for instance, for a prop validator.
+
+ ```javascript
+ // bad
+ export const VARIANT = {
+ WARNING: 'warning',
+ ERROR: 'error',
+ };
+
+ // good
+ export const VARIANT_WARNING = 'warning';
+ export const VARIANT_ERROR = 'error';
+
+ // good, if the constants need to be iterated over
+ export const VARIANTS = [VARIANT_WARNING, VARIANT_ERROR];
+ ```
diff --git a/doc/development/fe_guide/style/scss.md b/doc/development/fe_guide/style/scss.md
index 1d0b3c2b7fc..c0817626360 100644
--- a/doc/development/fe_guide/style/scss.md
+++ b/doc/development/fe_guide/style/scss.md
@@ -99,7 +99,7 @@ ul {
// Best
// prefer an existing utility class over adding existing styles
-```0
+```
Class names are also preferable to IDs. Rules that use IDs
are not-reusable, as there can only be one affected element on
@@ -132,16 +132,14 @@ Before adding a new variable for a color or a size, guarantee:
## Linting
-We use [SCSS Lint](https://github.com/sds/scss-lint) to check for style guide conformity. It uses the
-ruleset in `.scss-lint.yml`, which is located in the home directory of the
-project.
+We use [stylelint](https://stylelint.io) to check for style guide conformity. It uses the
+ruleset in `.stylelintrc` and rules from [our SCSS configuration](https://gitlab.com/gitlab-org/frontend/gitlab-stylelint-config). `.stylelintrc` is located in the home directory of the project.
-To check if any warnings are produced by your changes, run `rake
-scss_lint` in the GitLab directory. SCSS Lint also runs in GitLab CI/CD to
+To check if any warnings are produced by your changes, run `yarn lint:stylelint` in the GitLab directory. Stylelint also runs in GitLab CI/CD to
catch any warnings.
If the Rake task is throwing warnings you don't understand, SCSS Lint's
-documentation includes [a full list of their linters](https://github.com/sds/scss-lint/blob/master/lib/scss_lint/linter/README.md).
+documentation includes [a full list of their rules](https://stylelint.io/user-guide/rules/list).
### Fixing issues
diff --git a/doc/development/fe_guide/style/vue.md b/doc/development/fe_guide/style/vue.md
index 0288238a9e5..d62145b4a4c 100644
--- a/doc/development/fe_guide/style/vue.md
+++ b/doc/development/fe_guide/style/vue.md
@@ -432,41 +432,7 @@ must be unique. It's advised to use `kebab-case` namespaces.
Useful links:
1. [`key`](https://vuejs.org/v2/guide/list.html#key)
-1. [Vue Style Guide: Keyed v-for](https://vuejs.org/v2/style-guide/#Keyed-v-for-essential )
-
-## Vue and Bootstrap
-
-1. Tooltips: Do not rely on `has-tooltip` class name for Vue components
-
- ```html
- // bad
- <span
- class="has-tooltip"
- title="Some tooltip text">
- Text
- </span>
-
- // good
- <span
- v-tooltip
- title="Some tooltip text">
- Text
- </span>
- ```
-
-1. Tooltips: When using a tooltip, include the tooltip directive, `./app/assets/javascripts/vue_shared/directives/tooltip.js`
-
-1. Don't change `data-original-title`.
-
- ```html
- // bad
- <span data-original-title="tooltip text">Foo</span>
-
- // good
- <span title="tooltip text">Foo</span>
-
- $('span').tooltip('_fixTitle');
- ```
+1. [Vue Style Guide: Keyed v-for](https://vuejs.org/v2/style-guide/#Keyed-v-for-essential)
## Vue testing
diff --git a/doc/development/fe_guide/tooling.md b/doc/development/fe_guide/tooling.md
index 7a2d8fccdbf..1ab97d8a1f5 100644
--- a/doc/development/fe_guide/tooling.md
+++ b/doc/development/fe_guide/tooling.md
@@ -17,7 +17,7 @@ This section describes yarn scripts that are available to validate and apply aut
To check all staged files (based on `git diff`) with ESLint, run the following script:
```shell
-yarn eslint-staged
+yarn run lint:eslint:staged
```
A list of problems found are logged to the console.
@@ -25,15 +25,21 @@ A list of problems found are logged to the console.
To apply automatic ESLint fixes to all staged files (based on `git diff`), run the following script:
```shell
-yarn eslint-staged-fix
+yarn run lint:eslint:staged:fix
```
If manual changes are required, a list of changes are sent to the console.
+To check a specific file in the repository with ESLINT, run the following script (replacing $PATH_TO_FILE):
+
+```shell
+yarn run lint:eslint $PATH_TO_FILE
+```
+
To check **all** files in the repository with ESLint, run the following script:
```shell
-yarn eslint
+yarn run lint:eslint:all
```
A list of problems found are logged to the console.
@@ -41,7 +47,7 @@ A list of problems found are logged to the console.
To apply automatic ESLint fixes to **all** files in the repository, run the following script:
```shell
-yarn eslint-fix
+yarn run lint:eslint:all:fix
```
If manual changes are required, a list of changes are sent to the console.
@@ -98,6 +104,57 @@ When declaring multiple globals, always use one `/* global [name] */` line per v
/* global jQuery */
```
+### Deprecating functions with `import/no-deprecated`
+
+Our `@gitlab/eslint-plugin` Node module contains the [`eslint-plugin-import`](https://gitlab.com/gitlab-org/frontend/eslint-plugin) package.
+
+We can use the [`import/no-deprecated`](https://github.com/benmosher/eslint-plugin-import/blob/HEAD/docs/rules/no-deprecated.md) rule to deprecate functions using a JSDoc block with a `@deprecated` tag:
+
+```javascript
+/**
+ * Convert search query into an object
+ *
+ * @param {String} query from "document.location.search"
+ * @param {Object} options
+ * @param {Boolean} options.gatherArrays - gather array values into an Array
+ * @returns {Object}
+ *
+ * ex: "?one=1&two=2" into {one: 1, two: 2}
+ * @deprecated Please use `queryToObject` instead. See https://gitlab.com/gitlab-org/gitlab/-/issues/283982 for more information
+ */
+export function queryToObject(query, options = {}) {
+ ...
+}
+```
+
+It is strongly encouraged that you:
+
+- Put in an **alternative path for developers** looking to use this function.
+- **Provide a link to the issue** that tracks the migration process.
+
+NOTE:
+Uses are detected if you import the deprecated function into another file. They are not detected when the function is used in the same file.
+
+Running `$ yarn eslint` after this will give us the list of deprecated usages:
+
+```shell
+$ yarn eslint
+
+./app/assets/javascripts/issuable_form.js
+ 9:10 error Deprecated: Please use `queryToObject` instead. See https://gitlab.com/gitlab-org/gitlab/-/issues/283982 for more information import/no-deprecated
+ 33:23 error Deprecated: Please use `queryToObject` instead. See https://gitlab.com/gitlab-org/gitlab/-/issues/283982 for more information import/no-deprecated
+...
+```
+
+Grep for disabled cases of this rule to generate a working list to create issues from, so you can track the effort of removing deprecated uses:
+
+```shell
+$ grep "eslint-disable.*import/no-deprecated" -r .
+
+./app/assets/javascripts/issuable_form.js:import { queryToObject, objectToQuery } from './lib/utils/url_utility'; // eslint-disable-line import/no-deprecate
+./app/assets/javascripts/issuable_form.js: // eslint-disable-next-line import/no-deprecated
+```
+
## Formatting with Prettier
> Support for `.graphql` [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/227280) in GitLab 13.2.
@@ -125,44 +182,28 @@ Please take care that you only let Prettier format the same file types as the gl
The following yarn scripts are available to do global formatting:
```shell
-yarn prettier-staged-save
+yarn run lint:prettier:staged:fix
```
Updates all staged files (based on `git diff`) with Prettier and saves the needed changes.
```shell
-yarn prettier-staged
+yarn run lint:prettier:staged
```
Checks all staged files (based on `git diff`) with Prettier and log which files would need manual updating to the console.
```shell
-yarn prettier-all
+yarn run lint:prettier
```
Checks all files with Prettier and logs which files need manual updating to the console.
```shell
-yarn prettier-all-save
-```
-
-Formats all files in the repository with Prettier. (This should only be used to test global rule updates otherwise you would end up with huge MR's).
-
-The source of these Yarn scripts can be found in `/scripts/frontend/prettier.js`.
-
-#### Scripts during Conversion period
-
-```shell
-node ./scripts/frontend/prettier.js check-all ./vendor/
-```
-
-This iterates over all files in a specific folder, and checks them.
-
-```shell
-node ./scripts/frontend/prettier.js save-all ./vendor/
+yarn run lint:prettier:fix
```
-This iterates over all files in a specific folder and saves them.
+Formats all files in the repository with Prettier.
### VSCode Settings
diff --git a/doc/development/fe_guide/vue.md b/doc/development/fe_guide/vue.md
index 5b902e1b16e..220a4a107aa 100644
--- a/doc/development/fe_guide/vue.md
+++ b/doc/development/fe_guide/vue.md
@@ -237,6 +237,9 @@ Each Vue component has a unique output. This output is always present in the ren
Although each method of a Vue component can be tested individually, our goal is to test the output
of the render function, which represents the state at all times.
+Visit the [Vue testing guide](https://vuejs.org/v2/guide/testing.html#Unit-Testing) for help
+testing the rendered output.
+
Here's an example of a well structured unit test for [this Vue component](#appendix---vue-component-subject-under-test):
```javascript
@@ -331,11 +334,6 @@ describe('~/todos/app.vue', () => {
});
```
-### Test the component's output
-
-The main return value of a Vue component is the rendered output. In order to test the component we
-need to test the rendered output. Visit the [Vue testing guide](https://vuejs.org/v2/guide/testing.html#Unit-Testing).
-
### Child components
1. Test any directive that defines if/how child component is rendered (for example, `v-if` and `v-for`).
diff --git a/doc/development/fe_guide/vuex.md b/doc/development/fe_guide/vuex.md
index cc1d9ccab77..d44ab64ae5d 100644
--- a/doc/development/fe_guide/vuex.md
+++ b/doc/development/fe_guide/vuex.md
@@ -440,12 +440,11 @@ components, we need to include the store and provide the correct state:
//component_spec.js
import Vue from 'vue';
import Vuex from 'vuex';
-import { mount, createLocalVue } from '@vue/test-utils';
+import { mount } from '@vue/test-utils';
import { createStore } from './store';
import Component from './component.vue'
-const localVue = createLocalVue();
-localVue.use(Vuex);
+Vue.use(Vuex);
describe('component', () => {
let store;
@@ -455,7 +454,6 @@ describe('component', () => {
store = createStore();
wrapper = mount(Component, {
- localVue,
store,
});
};
@@ -483,6 +481,11 @@ describe('component', () => {
});
```
+Some test files may still use the
+[deprecated `createLocalVue` function](https://gitlab.com/gitlab-org/gitlab/-/issues/220482)
+from `@vue/test-utils` and `localVue.use(Vuex)`. This is unnecessary, and should be
+avoided or removed when possible.
+
### Two way data binding
When storing form data in Vuex, it is sometimes necessary to update the value stored. The store
diff --git a/doc/development/fe_guide/widgets.md b/doc/development/fe_guide/widgets.md
new file mode 100644
index 00000000000..02876afe597
--- /dev/null
+++ b/doc/development/fe_guide/widgets.md
@@ -0,0 +1,143 @@
+---
+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
+---
+
+# Widgets
+
+Frontend widgets are standalone Vue applications or Vue component trees that can be added on a page
+to handle a part of the functionality.
+
+Good examples of widgets are [sidebar assignees](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/assets/javascripts/sidebar/components/assignees/sidebar_assignees_widget.vue) and [sidebar confidentiality](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_widget.vue).
+
+When building a widget, we should follow a few principles described below.
+
+## Vue Apollo is required
+
+All widgets should use the same stack (Vue + Apollo Client).
+To make it happen, we must add Vue Apollo to the application root (if we use a widget
+as a component) or provide it directly to a widget. For sidebar widgets, use the
+[sidebar Apollo Client and Apollo Provider](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/assets/javascripts/sidebar/graphql.js):
+
+```javascript
+import SidebarConfidentialityWidget from '~/sidebar/components/confidential/sidebar_confidentiality_widget.vue';
+import { apolloProvider } from '~/sidebar/graphql';
+
+function mountConfidentialComponent() {
+ new Vue({
+ apolloProvider,
+ components: {
+ SidebarConfidentialityWidget,
+ },
+ /* ... */
+ });
+}
+```
+
+## Required injections
+
+All editable sidebar widgets should use [`SidebarEditableItem`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/assets/javascripts/sidebar/components/sidebar_editable_item.vue) to handle collapsed/expanded state. This component requires the `canUpdate` property provided in the application root.
+
+## No global state mappings
+
+We aim to make widgets as reusable as possible. That's why we should avoid adding any external state
+bindings to widgets or to their child components. This includes Vuex mappings and mediator stores.
+
+## Widget's responsibility
+
+A widget is responsible for fetching and updating an entity it's designed for (assignees, iterations, and so on).
+This means a widget should **always** fetch data (if it's not in Apollo cache already).
+Even if we provide an initial value to the widget, it should perform a GraphQL query in the background
+to be stored in Apollo cache.
+
+Eventually, when we have an Apollo Client cache as a global application state, we won't need to pass
+initial data to the sidebar widget. Then it will be capable of retrieving the data from the cache.
+
+## Using GraphQL queries and mutations
+
+We need widgets to be flexible to work with different entities (epics, issues, merge requests, and so on).
+Because we need different GraphQL queries and mutations for different sidebars, we create
+[_mappings_](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/assets/javascripts/sidebar/constants.js#L9):
+
+```javascript
+export const assigneesQueries = {
+ [IssuableType.Issue]: {
+ query: getIssueParticipants,
+ mutation: updateAssigneesMutation,
+ },
+ [IssuableType.MergeRequest]: {
+ query: getMergeRequestParticipants,
+ mutation: updateMergeRequestParticipantsMutation,
+ },
+};
+```
+
+To handle the same logic for query updates, we **alias** query fields. For example:
+
+- `group` or `project` become `workspace`
+- `issue`, `epic`, or `mergeRequest` become `issuable`
+
+Unfortunately, Apollo assigns aliased fields a typename of `undefined`, so we need to fetch `__typename` explicitly:
+
+```plaintext
+query issueConfidential($fullPath: ID!, $iid: String) {
+ workspace: project(fullPath: $fullPath) {
+ __typename
+ issuable: issue(iid: $iid) {
+ __typename
+ id
+ confidential
+ }
+ }
+}
+```
+
+## Communication with other Vue applications
+
+If we need to communicate the changes of the widget state (for example, after successful mutation)
+to the parent application, we should emit an event:
+
+```javascript
+updateAssignees(assigneeUsernames) {
+ return this.$apollo
+ .mutate({
+ mutation: this.$options.assigneesQueries[this.issuableType].mutation,
+ variables: {...},
+ })
+ .then(({ data }) => {
+ const assignees = data.issueSetAssignees?.issue?.assignees?.nodes || [];
+ this.$emit('assignees-updated', assignees);
+ })
+}
+```
+
+Sometimes, we want to listen to the changes on the different Vue application like `NotesApp`.
+In this case, we can use a renderless component that imports a client and listens to a certain query:
+
+```javascript
+import { fetchPolicies } from '~/lib/graphql';
+import { confidentialityQueries } from '~/sidebar/constants';
+import { defaultClient as gqlClient } from '~/sidebar/graphql';
+
+created() {
+ if (this.issuableType !== IssuableType.Issue) {
+ return;
+ }
+
+ gqlClient
+ .watchQuery({
+ query: confidentialityQueries[this.issuableType].query,
+ variables: {...},
+ fetchPolicy: fetchPolicies.CACHE_ONLY,
+ })
+ .subscribe((res) => {
+ this.setConfidentiality(issuable.confidential);
+ });
+},
+methods: {
+ ...mapActions(['setConfidentiality']),
+},
+```
+
+[View an example of such a component.](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/assets/javascripts/notes/components/sidebar_subscription.vue)
diff --git a/doc/development/feature_flags/controls.md b/doc/development/feature_flags/controls.md
index 21ac152c469..fc327a2defc 100644
--- a/doc/development/feature_flags/controls.md
+++ b/doc/development/feature_flags/controls.md
@@ -36,7 +36,7 @@ easier to measure the impact of both separately.
The GitLab feature library (using
[Flipper](https://github.com/jnunemaker/flipper), and covered in the [Feature
-Flags process](process.md) guide) supports rolling out changes to a percentage of
+Flags process](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle) guide) supports rolling out changes to a percentage of
time to users. This in turn can be controlled using [GitLab ChatOps](../../ci/chatops/index.md).
For an up to date list of feature flag commands please see [the source
@@ -240,7 +240,7 @@ To disable a feature flag that has been enabled for a specific project you can r
/chatops run feature set --group=gitlab-org some_feature false
```
-You cannot selectively disable feature flags for a specific project/group/user without applying a [specific method of implementing](development.md#selectively-disable-by-actor) the feature flags.
+You cannot selectively disable feature flags for a specific project/group/user without applying a [specific method of implementing](index.md#selectively-disable-by-actor) the feature flags.
### Feature flag change logging
@@ -276,17 +276,19 @@ and reduces confidence in our testing suite covering all possible combinations.
Additionally, a feature flag overwritten in some of the environments can result
in undefined and untested system behavior.
-To remove a feature flag:
+To remove a feature flag, open **one merge request** to make the changes. In the MR:
-1. Open a new merge request with the ~"feature flag" label so
- release managers are aware the changes are hidden behind a feature flag.
+1. Add the ~"feature flag" label so release managers are aware the changes are hidden behind a feature flag.
1. If the merge request has to be picked into a stable branch, add the
appropriate `~"Pick into X.Y"` label, for example `~"Pick into 13.0"`.
- See [the feature flag process](process.md#including-a-feature-behind-feature-flag-in-the-final-release)
+ See [the feature flag process](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle#including-a-feature-behind-feature-flag-in-the-final-release)
for further details.
-1. Remove all references to the feature flag from the codebase.
+1. Remove all references to the feature flag from the codebase, including tests.
1. Remove the YAML definition for the feature from the repository.
-1. Clean up the feature flag from all environments with `/chatops run feature delete some_feature`.
+
+Once the above MR has been merged, you should:
+
+1. [Clean up the feature flag from all environments](#cleanup-chatops) with `/chatops run feature delete some_feature`.
1. Close the rollout issue for the feature flag after the feature flag is removed from the codebase.
### Cleanup ChatOps
diff --git a/doc/development/feature_flags/development.md b/doc/development/feature_flags/development.md
index 0cdfa3e68d7..79efd6d5502 100644
--- a/doc/development/feature_flags/development.md
+++ b/doc/development/feature_flags/development.md
@@ -1,593 +1,7 @@
---
-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: 'index.md'
---
-# Developing with feature flags
-
-This document provides guidelines on how to use feature flags
-in the GitLab codebase to conditionally enable features
-and test them.
-
-Features that are developed and merged behind a feature flag
-should not include a changelog entry. The entry should be added either in the merge
-request removing the feature flag or the merge request where the default value of
-the feature flag is set to enabled. If the feature contains any database migrations, it
-*should* include a changelog entry for the database changes.
-
-WARNING:
-All newly-introduced feature flags should be [disabled by default](process.md#feature-flags-in-gitlab-development).
-
-NOTE:
-This document is the subject of continued work as part of an epic to [improve internal usage of Feature Flags](https://gitlab.com/groups/gitlab-org/-/epics/3551). Raise any suggestions as new issues and attach them to the epic.
-
-## Risk of a broken master (main) branch
-
-Feature flags **must** be used in the MR that introduces them. Not doing so causes a
-[broken master](https://about.gitlab.com/handbook/engineering/workflow/#broken-master) scenario due
-to the `rspec:feature-flags` job that only runs on the `master` branch.
-
-## Types of feature flags
-
-Choose a feature flag type that matches the expected usage.
-
-### `development` type
-
-`development` feature flags are short-lived feature flags,
-used so that unfinished code can be deployed in production.
-
-A `development` feature flag should have a rollout issue,
-ideally created using the [Feature Flag Roll Out template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/issue_templates/Feature%20Flag%20Roll%20Out.md).
-
-This is the default type used when calling `Feature.enabled?`.
-
-### `ops` type
-
-`ops` feature flags are long-lived feature flags that control operational aspects
-of GitLab product behavior. For example, feature flags that disable features that might
-have a performance impact, like special Sidekiq worker behavior.
-
-`ops` feature flags likely do not have rollout issues, as it is hard to
-predict when they are enabled or disabled.
-
-To use `ops` feature flags, you must append `type: :ops` to `Feature.enabled?`
-invocations:
-
-```ruby
-# Check if feature flag is enabled
-Feature.enabled?(:my_ops_flag, project, type: :ops)
-
-# Check if feature flag is disabled
-Feature.disabled?(:my_ops_flag, project, type: :ops)
-
-# Push feature flag to Frontend
-push_frontend_feature_flag(:my_ops_flag, project, type: :ops)
-```
-
-### `experiment` type
-
-`experiment` feature flags are used for A/B testing on GitLab.com.
-
-An `experiment` feature flag should conform to the same standards as a `development` feature flag,
-although the interface has some differences. More information can be found in the [experiment guide](../experiment_guide/index.md).
-
-## Feature flag definition and validation
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/229161) in GitLab 13.3.
-
-During development (`RAILS_ENV=development`) or testing (`RAILS_ENV=test`) all feature flag usage is being strictly validated.
-
-This process is meant to ensure consistent feature flag usage in the codebase. All feature flags **must**:
-
-- Be known. Only use feature flags that are explicitly defined.
-- Not be defined twice. They have to be defined either in FOSS or EE, but not both.
-- Use a valid and consistent `type:` across all invocations.
-- Use the same `default_enabled:` across all invocations.
-- Have an owner.
-
-All feature flags known to GitLab are self-documented in YAML files stored in:
-
-- [`config/feature_flags`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/config/feature_flags)
-- [`ee/config/feature_flags`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/ee/config/feature_flags)
-
-Each feature flag is defined in a separate YAML file consisting of a number of fields:
-
-| Field | Required | Description |
-|---------------------|----------|----------------------------------------------------------------|
-| `name` | yes | Name of the feature flag. |
-| `type` | yes | Type of feature flag. |
-| `default_enabled` | yes | The default state of the feature flag that is strictly validated, with `default_enabled:` passed as an argument. |
-| `introduced_by_url` | no | The URL to the Merge Request that introduced the feature flag. |
-| `rollout_issue_url` | no | The URL to the Issue covering the feature flag rollout. |
-| `group` | no | The [group](https://about.gitlab.com/handbook/product/categories/#devops-stages) that owns the feature flag. |
-
-NOTE:
-All validations are skipped when running in `RAILS_ENV=production`.
-
-## Create a new feature flag
-
-The GitLab codebase provides [`bin/feature-flag`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/bin/feature-flag),
-a dedicated tool to create new feature flag definitions.
-The tool asks various questions about the new feature flag, then creates
-a YAML definition in `config/feature_flags` or `ee/config/feature_flags`.
-
-Only feature flags that have a YAML definition file can be used when running the development or testing environments.
-
-```shell
-$ bin/feature-flag my_feature_flag
->> Specify the group introducing the feature flag, like `group::apm`:
-?> group::memory
-
->> URL of the MR introducing the feature flag (enter to skip):
-?> https://gitlab.com/gitlab-org/gitlab/-/merge_requests/38602
-
->> Open this URL and fill in the rest of the details:
-https://gitlab.com/gitlab-org/gitlab/-/issues/new?issue%5Btitle%5D=%5BFeature+flag%5D+Rollout+of+%60test-flag%60&issuable_template=Feature+Flag+Roll+Out
-
->> URL of the rollout issue (enter to skip):
-?> https://gitlab.com/gitlab-org/gitlab/-/issues/232533
-create config/feature_flags/development/my_feature_flag.yml
----
-name: my_feature_flag
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/38602
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/232533
-group: group::memory
-type: development
-default_enabled: false
-```
-
-NOTE:
-To create a feature flag that is only used in EE, add the `--ee` flag: `bin/feature-flag --ee`
-
-## Delete a feature flag
-
-See [cleaning up feature flags](controls.md#cleaning-up) for more information about
-deleting feature flags.
-
-## Develop with a feature flag
-
-There are two main ways of using Feature Flags in the GitLab codebase:
-
-- [Backend code (Rails)](#backend)
-- [Frontend code (VueJS)](#frontend)
-
-### Backend
-
-The feature flag interface is defined in [`lib/feature.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/feature.rb).
-This interface provides a set of methods to check if the feature flag is enabled or disabled:
-
-```ruby
-if Feature.enabled?(:my_feature_flag, project)
- # execute code if feature flag is enabled
-else
- # execute code if feature flag is disabled
-end
-
-if Feature.disabled?(:my_feature_flag, project)
- # execute code if feature flag is disabled
-end
-```
-
-In rare cases you may want to make a feature enabled by default. If so, explain the reasoning
-in the merge request. Use `default_enabled: true` when checking the feature flag state:
-
-```ruby
-if Feature.enabled?(:feature_flag, project, default_enabled: true)
- # execute code if feature flag is enabled
-else
- # execute code if feature flag is disabled
-end
-
-if Feature.disabled?(:my_feature_flag, project, default_enabled: true)
- # execute code if feature flag is disabled
-end
-```
-
-If not specified, `default_enabled` is `false`.
-
-To force reading the `default_enabled` value from the relative YAML definition file, use
-`default_enabled: :yaml`:
-
-```ruby
-if Feature.enabled?(:feature_flag, project, default_enabled: :yaml)
- # execute code if feature flag is enabled
-end
-```
-
-```ruby
-if Feature.disabled?(:feature_flag, project, default_enabled: :yaml)
- # execute code if feature flag is disabled
-end
-```
-
-This allows to use the same feature flag check across various parts of the codebase and
-maintain the status of `default_enabled` in the YAML definition file which is the SSOT.
-
-If `default_enabled: :yaml` is used, a YAML definition is expected or an error is raised
-in development or test environment, while returning `false` on production.
-
-If not specified, the default feature flag type for `Feature.enabled?` and `Feature.disabled?`
-is `type: development`. For all other feature flag types, you must specify the `type:`:
-
-```ruby
-if Feature.enabled?(:feature_flag, project, type: :ops)
- # execute code if ops feature flag is enabled
-else
- # execute code if ops feature flag is disabled
-end
-
-if Feature.disabled?(:my_feature_flag, project, type: :ops)
- # execute code if feature flag is disabled
-end
-```
-
-WARNING:
-Don't use feature flags at application load time. For example, using the `Feature` class in
-`config/initializers/*` or at the class level could cause an unexpected error. This error occurs
-because a database that a feature flag adapter might depend on doesn't exist at load time
-(especially for fresh installations). Checking for the database's existence at the caller isn't
-recommended, as some adapters don't require a database at all (for example, the HTTP adapter). The
-feature flag setup check must be abstracted in the `Feature` namespace. This approach also requires
-application reload when the feature flag changes. You must therefore ask SREs to reload the
-Web/API/Sidekiq fleet on production, which takes time to fully rollout/rollback the changes. For
-these reasons, use environment variables (for example, `ENV['YOUR_FEATURE_NAME']`) or `gitlab.yml`
-instead.
-
-Here's an example of a pattern that you should avoid:
-
-```ruby
-class MyClass
- if Feature.enabled?(:...)
- new_process
- else
- legacy_process
- end
-end
-```
-
-### Frontend
-
-Use the `push_frontend_feature_flag` method for frontend code, which is
-available to all controllers that inherit from `ApplicationController`. You can use
-this method to expose the state of a feature flag, for example:
-
-```ruby
-before_action do
- # Prefer to scope it per project or user e.g.
- push_frontend_feature_flag(:vim_bindings, project)
-end
-
-def index
- # ...
-end
-
-def edit
- # ...
-end
-```
-
-You can then check the state of the feature flag in JavaScript as follows:
-
-```javascript
-if ( gon.features.vimBindings ) {
- // ...
-}
-```
-
-The name of the feature flag in JavaScript is always camelCase,
-so checking for `gon.features.vim_bindings` would not work.
-
-See the [Vue guide](../fe_guide/vue.md#accessing-feature-flags) for details about
-how to access feature flags in a Vue component.
-
-In rare cases you may want to make a feature enabled by default. If so, explain the reasoning
-in the merge request. Use `default_enabled: true` when checking the feature flag state:
-
-```ruby
-before_action do
- # Prefer to scope it per project or user e.g.
- push_frontend_feature_flag(:vim_bindings, project, default_enabled: true)
-end
-```
-
-If not specified, the default feature flag type for `push_frontend_feature_flag`
-is `type: development`. For all other feature flag types, you must specify the `type:`:
-
-```ruby
-before_action do
- push_frontend_feature_flag(:vim_bindings, project, type: :ops)
-end
-```
-
-### Feature actors
-
-**It is strongly advised to use actors with feature flags.** Actors provide a simple
-way to enable a feature flag only for a given project, group or user. This makes debugging
-easier, as you can filter logs and errors for example, based on actors. This also makes it possible
-to enable the feature on the `gitlab-org` or `gitlab-com` groups first, while the rest of
-the users aren't impacted.
-
-Actors also provide an easy way to do a percentage rollout of a feature in a sticky way.
-If a 1% rollout enabled a feature for a specific actor, that actor will continue to have the feature enabled at
-10%, 50%, and 100%.
-
-GitLab currently supports the following models as feature flag actors:
-
-- `User`
-- `Project`
-- `Group`
-
-The actor is a second parameter of the `Feature.enabled?` call. The
-same actor type must be used consistently for all invocations of `Feature.enabled?`.
-
-```ruby
-Feature.enabled?(:feature_flag, project)
-Feature.enabled?(:feature_flag, group)
-Feature.enabled?(:feature_flag, user)
-```
-
-#### Selectively disable by actor
-
-By default you cannot selectively disable a feature flag by actor.
-
-```shell
-# This will not work how you would expect.
-/chatops run feature set some_feature true
-/chatops run feature set --project=gitlab-org/gitlab some_feature false
-```
-
-However, if you add two feature flags, you can write your conditional statement in such a way that the equivalent selective disable is possible.
-
-```ruby
-Feature.enabled?(:a_feature, project) && Feature.disabled?(:a_feature_override, project)
-```
-
-```shell
-# This will enable a feature flag globally, except for gitlab-org/gitlab
-/chatops run feature set a_feature true
-/chatops run feature set --project=gitlab-org/gitlab a_feature_override true
-```
-
-### Enable additional objects as actors
-
-To use feature gates based on actors, the model needs to respond to
-`flipper_id`. For example, to enable for the Foo model:
-
-```ruby
-class Foo < ActiveRecord::Base
- include FeatureGate
-end
-```
-
-Only models that `include FeatureGate` or expose `flipper_id` method can be
-used as an actor for `Feature.enabled?`.
-
-### Feature flags for licensed features
-
-You can't use a feature flag with the same name as a licensed feature name, because
-it would cause a naming collision. This was [widely discussed and removed](https://gitlab.com/gitlab-org/gitlab/-/issues/259611)
-because it is confusing.
-
-To check for licensed features, add a dedicated feature flag under a different name
-and check it explicitly, for example:
-
-```ruby
-Feature.enabled?(:licensed_feature_feature_flag, project) &&
- project.feature_available?(:licensed_feature)
-```
-
-### Feature groups
-
-Feature groups must be defined statically in `lib/feature.rb` (in the
-`.register_feature_groups` method), but their implementation can obviously be
-dynamic (querying the DB, for example).
-
-Once defined in `lib/feature.rb`, you can to activate a
-feature for a given feature group via the [`feature_group` parameter of the features API](../../api/features.md#set-or-create-a-feature)
-
-### Enabling a feature flag locally (in development)
-
-In the rails console (`rails c`), enter the following command to enable a feature flag:
-
-```ruby
-Feature.enable(:feature_flag_name)
-```
-
-Similarly, the following command disables a feature flag:
-
-```ruby
-Feature.disable(:feature_flag_name)
-```
-
-You can also enable a feature flag for a given gate:
-
-```ruby
-Feature.enable(:feature_flag_name, Project.find_by_full_path("root/my-project"))
-```
-
-### Removing a feature flag locally (in development)
-
-When manually enabling or disabling a feature flag from the Rails console, its default value gets overwritten.
-This can cause confusion when changing the flag's `default_enabled` attribute.
-
-To reset the feature flag to the default status, you can remove it in the rails console (`rails c`)
-as follows:
-
-```ruby
-Feature.remove(:feature_flag_name)
-```
-
-## Feature flags in tests
-
-Introducing a feature flag into the codebase creates an additional code path that should be tested.
-It is strongly advised to test all code affected by a feature flag, both when **enabled** and **disabled**
-to ensure the feature works properly.
-
-When using the testing environment, all feature flags are enabled by default.
-
-WARNING:
-This does not apply to end-to-end (QA) tests, which [do not disable feature flags by default](#end-to-end-qa-tests). There is a different [process for using feature flags in end-to-end tests](../testing_guide/end_to_end/feature_flags.md).
-
-To disable a feature flag in a test, use the `stub_feature_flags`
-helper. For example, to globally disable the `ci_live_trace` feature
-flag in a test:
-
-```ruby
-stub_feature_flags(ci_live_trace: false)
-
-Feature.enabled?(:ci_live_trace) # => false
-```
-
-If you wish to set up a test where a feature flag is enabled only
-for some actors and not others, you can specify this in options
-passed to the helper. For example, to enable the `ci_live_trace`
-feature flag for a specific project:
-
-```ruby
-project1, project2 = build_list(:project, 2)
-
-# Feature will only be enabled for project1
-stub_feature_flags(ci_live_trace: project1)
-
-Feature.enabled?(:ci_live_trace) # => false
-Feature.enabled?(:ci_live_trace, project1) # => true
-Feature.enabled?(:ci_live_trace, project2) # => false
-```
-
-The behavior of FlipperGate is as follows:
-
-1. You can enable an override for a specified actor to be enabled.
-1. You can disable (remove) an override for a specified actor,
- falling back to the default state.
-1. There's no way to model that you explicitly disabled a specified actor.
-
-```ruby
-Feature.enable(:my_feature)
-Feature.disable(:my_feature, project1)
-Feature.enabled?(:my_feature) # => true
-Feature.enabled?(:my_feature, project1) # => true
-
-Feature.disable(:my_feature2)
-Feature.enable(:my_feature2, project1)
-Feature.enabled?(:my_feature2) # => false
-Feature.enabled?(:my_feature2, project1) # => true
-```
-
-### `have_pushed_frontend_feature_flags`
-
-Use `have_pushed_frontend_feature_flags` to test if [`push_frontend_feature_flag`](#frontend)
-has added the feature flag to the HTML.
-
-For example,
-
-```ruby
-stub_feature_flags(value_stream_analytics_path_navigation: false)
-
-visit group_analytics_cycle_analytics_path(group)
-
-expect(page).to have_pushed_frontend_feature_flags(valueStreamAnalyticsPathNavigation: false)
-```
-
-### `stub_feature_flags` vs `Feature.enable*`
-
-It is preferred to use `stub_feature_flags` to enable feature flags
-in the testing environment. This method provides a simple and well described
-interface for simple use cases.
-
-However, in some cases more complex behavior needs to be tested,
-like percentage rollouts of feature flags. This can be done using
-`.enable_percentage_of_time` or `.enable_percentage_of_actors`:
-
-```ruby
-# Good: feature needs to be explicitly disabled, as it is enabled by default if not defined
-stub_feature_flags(my_feature: false)
-stub_feature_flags(my_feature: true)
-stub_feature_flags(my_feature: project)
-stub_feature_flags(my_feature: [project, project2])
-
-# Bad
-Feature.enable(:my_feature_2)
-
-# Good: enable my_feature for 50% of time
-Feature.enable_percentage_of_time(:my_feature_3, 50)
-
-# Good: enable my_feature for 50% of actors/gates/things
-Feature.enable_percentage_of_actors(:my_feature_4, 50)
-```
-
-Each feature flag that has a defined state is persisted
-during test execution time:
-
-```ruby
-Feature.persisted_names.include?('my_feature') => true
-Feature.persisted_names.include?('my_feature_2') => true
-Feature.persisted_names.include?('my_feature_3') => true
-Feature.persisted_names.include?('my_feature_4') => true
-```
-
-### Stubbing actor
-
-When you want to enable a feature flag for a specific actor only,
-you can stub its representation. A gate that is passed
-as an argument to `Feature.enabled?` and `Feature.disabled?` must be an object
-that includes `FeatureGate`.
-
-In specs you can use the `stub_feature_flag_gate` method that allows you to
-quickly create a custom actor:
-
-```ruby
-gate = stub_feature_flag_gate('CustomActor')
-
-stub_feature_flags(ci_live_trace: gate)
-
-Feature.enabled?(:ci_live_trace) # => false
-Feature.enabled?(:ci_live_trace, gate) # => true
-```
-
-You can also disable a feature flag for a specific actor:
-
-```ruby
-gate = stub_feature_flag_gate('CustomActor')
-
-stub_feature_flags(ci_live_trace: false, thing: gate)
-```
-
-### Controlling feature flags engine in tests
-
-Our Flipper engine in the test environment works in a memory mode `Flipper::Adapters::Memory`.
-`production` and `development` modes use `Flipper::Adapters::ActiveRecord`.
-
-You can control whether the `Flipper::Adapters::Memory` or `ActiveRecord` mode is being used.
-
-#### `stub_feature_flags: true` (default and preferred)
-
-In this mode Flipper is configured to use `Flipper::Adapters::Memory` and mark all feature
-flags to be on-by-default and persisted on a first use. This overwrites the `default_enabled:`
-of `Feature.enabled?` and `Feature.disabled?` returning always `true` unless feature flag
-is persisted.
-
-Make sure behavior under feature flag doesn't go untested in some non-specific contexts.
-
-### `stub_feature_flags: false`
-
-This disables a memory-stubbed flipper, and uses `Flipper::Adapters::ActiveRecord`
-a mode that is used by `production` and `development`.
-
-You should use this mode only when you really want to tests aspects of Flipper
-with how it interacts with `ActiveRecord`.
-
-### End-to-end (QA) tests
-
-Toggling feature flags works differently in end-to-end (QA) tests. The end-to-end test framework does not have direct access to
-Rails or the database, so it can't use Flipper. Instead, it uses [the public API](../../api/features.md#set-or-create-a-feature). Each end-to-end test can [enable or disable a feature flag during the test](../testing_guide/end_to_end/feature_flags.md). Alternatively, you can enable or disable a feature flag before one or more tests when you [run them from your GitLab repository's `qa` directory](https://gitlab.com/gitlab-org/gitlab/tree/master/qa#running-tests-with-a-feature-flag-enabled-or-disabled), or if you [run the tests via GitLab QA](https://gitlab.com/gitlab-org/gitlab-qa/-/blob/master/docs/what_tests_can_be_run.md#running-tests-with-a-feature-flag-enabled).
-
-[As noted above, feature flags are not enabled by default in end-to-end tests.](#feature-flags-in-tests)
-This means that end-to-end tests will run with feature flags in the default state implemented in the source
-code, or with the feature flag in its current state on the GitLab instance under test, unless the
-test is written to enable/disable a feature flag explicitly.
-
-When a feature flag is changed on Staging or on GitLab.com, a Slack message will be posted to the `#qa-staging` or `#qa-production` channels to inform
-the pipeline triage DRI so that they can more easily determine if any failures are related to a feature flag change. However, if you are working on a change you can
-help to avoid unexpected failures by [confirming that the end-to-end tests pass with a feature flag enabled.](../testing_guide/end_to_end/feature_flags.md#confirming-that-end-to-end-tests-pass-with-a-feature-flag-enabled)
+This document was moved to [another location](index.md).
+<!-- This redirect file can be deleted after 2021-06-01. -->
+<!-- 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/development/feature_flags/index.md b/doc/development/feature_flags/index.md
index 4890cc5da35..5c98dc2e473 100644
--- a/doc/development/feature_flags/index.md
+++ b/doc/development/feature_flags/index.md
@@ -1,75 +1,636 @@
---
+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"
---
-# Feature flags in development of GitLab
+# Developing with feature flags
**NOTE**:
The documentation below covers feature flags used by GitLab to deploy its own features, which **is not** the same
as the [feature flags offered as part of the product](../../operations/feature_flags.md).
-## When to use feature flags
+This document provides guidelines on how to use feature flags
+in the GitLab codebase to conditionally enable features
+and test them.
-Developers are required to use feature flags for changes that could affect availability of existing GitLab functionality (if it only affects the new feature you're making that is probably acceptable).
-Such changes include:
+Features that are developed and merged behind a feature flag
+should not include a changelog entry. The entry should be added either in the merge
+request removing the feature flag or the merge request where the default value of
+the feature flag is set to enabled. If the feature contains any database migrations, it
+*should* include a changelog entry for the database changes.
-1. New features in high traffic areas (e.g. a new merge request widget, new option in issues/epics, new CI functionality).
-1. Complex performance improvements that may require additional testing in production (e.g. rewriting complex queries, changes to frequently used API endpoints).
-1. Invasive changes to the user interface (e.g. introducing a new navigation bar, removal of a sidebar, UI element change in issues or MR interface).
-1. Introducing dependencies on third-party services (e.g. adding support for importing projects).
-1. Changes to features that can cause data corruption or cause data loss (e.g. features processing repository data or user uploaded content).
+WARNING:
+All newly-introduced feature flags should be [disabled by default](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle/#feature-flags-in-gitlab-development).
-Situations where you might consider not using a feature flag:
+NOTE:
+This document is the subject of continued work as part of an epic to [improve internal usage of Feature Flags](https://gitlab.com/groups/gitlab-org/-/epics/3551). Raise any suggestions as new issues and attach them to the epic.
-1. Adding a new API endpoint
-1. Introducing new features in low traffic areas (e.g. adding a new export functionality in the admin area/group settings/project settings)
-1. Non-invasive frontend changes (e.g. changing the color of a button, or moving a UI element in a low traffic area)
+## Feature flags in GitLab development
-In all cases, those working on the changes should ask themselves:
+The following highlights should be considered when deciding if feature flags
+should be leveraged:
-> Why do I need to add a feature flag? If I don't add one, what options do I have to control the impact on application reliability, and user experience?
+- By default, the feature flags should be **off**.
+- Feature flags should remain in the codebase for as short period as possible
+ to reduce the need for feature flag accounting.
+- The person operating with feature flags is responsible for clearly communicating
+ the status of a feature behind the feature flag with responsible stakeholders. The
+ issue description should be updated with the feature flag name and whether it is
+ defaulted on or off as soon it is evident that a feature flag is needed.
+- Merge requests that make changes hidden behind a feature flag, or remove an
+ existing feature flag because a feature is deemed stable must have the
+ ~"feature flag" label assigned.
+- When development of a feature will be spread across multiple merge
+ requests, you can use the following workflow:
-For perspective on why we limit our use of feature flags please see
-<i class="fa fa-youtube-play youtube" aria-hidden="true"></i> [Feature flags only when needed](https://www.youtube.com/watch?v=DQaGqyolOd8).
+ 1. [Create a new feature flag](#create-a-new-feature-flag)
+ which is **off** by default, in the first merge request which uses the flag.
+ Flags [should not be added separately](#risk-of-a-broken-master-main-branch).
+ 1. Submit incremental changes via one or more merge requests, ensuring that any
+ new code added can only be reached if the feature flag is **on**.
+ You can keep the feature flag enabled on your local GDK during development.
+ 1. When the feature is ready to be tested, enable the feature flag for
+ a specific project and ensure that there are no issues with the implementation.
+ 1. When the feature is ready to be announced, create a merge request that adds
+ documentation about the feature, including [documentation for the feature flag itself](../documentation/feature_flags.md),
+ and a changelog entry. In the same merge request either flip the feature flag to
+ be **on by default** or remove it entirely in order to enable the new behavior.
-In case you are uncertain if a feature flag is necessary, simply ask about this in an early merge request, and those reviewing the changes will likely provide you with an answer.
+One might be tempted to think that feature flags will delay the release of a
+feature by at least one month (= one release). This is not the case. A feature
+flag does not have to stick around for a specific amount of time
+(e.g. at least one release), instead they should stick around until the feature
+is deemed stable. Stable means it works on GitLab.com without causing any
+problems, such as outages.
-When using a feature flag for UI elements, make sure to _also_ use a feature
-flag for the underlying backend code, if there is any. This ensures there is
-absolutely no way to use the feature until it is enabled.
+## Risk of a broken master (main) branch
-## How to use Feature Flags
+Feature flags **must** be used in the MR that introduces them. Not doing so causes a
+[broken master](https://about.gitlab.com/handbook/engineering/workflow/#broken-master) scenario due
+to the `rspec:feature-flags` job that only runs on the `master` branch.
-Feature flags can be used to gradually deploy changes, regardless of whether
-they are new features or performance improvements. By using feature flags,
-you can determine the impact of GitLab-directed changes, while still being able
-to disable those changes without having to revert an entire release.
+## Types of feature flags
-For an overview about starting with feature flags in GitLab development,
-use this [training template](https://gitlab.com/gitlab-com/www-gitlab-com/-/blob/master/.gitlab/issue_templates/feature-flag-training.md).
+Choose a feature flag type that matches the expected usage.
-Before using feature flags for GitLab development, review the following development guides:
+### `development` type
-1. [Process for using features flags](process.md): When you should use
- feature flags in the development of GitLab, what's the cost of using them,
- and how to include them in a release.
-1. [Developing with feature flags](development.md): Learn about the types of
- feature flags, their definition and validation, how to create them, frontend and
- backend details, and other information.
-1. [Documenting features deployed behind feature flags](../documentation/feature_flags.md):
- How to document features deployed behind feature flags, and how to update the
- documentation for features' flags when their states change.
-1. [Controlling feature flags](controls.md): Learn the process for deploying
- a new feature, enabling it on GitLab.com, communicating the change,
- logging, and cleaning up.
+`development` feature flags are short-lived feature flags,
+used so that unfinished code can be deployed in production.
-User guides:
+A `development` feature flag should have a rollout issue,
+ideally created using the [Feature Flag Roll Out template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/issue_templates/Feature%20Flag%20Roll%20Out.md).
-1. [How GitLab administrators can enable and disable features behind flags](../../administration/feature_flags.md):
- An explanation for GitLab administrators about how they can
- enable or disable GitLab features behind feature flags.
-1. [What "features deployed behind flags" means to the GitLab user](../../user/feature_flags.md):
- An explanation for GitLab users regarding how certain features
- might not be available to them until they are enabled.
+This is the default type used when calling `Feature.enabled?`.
+
+### `ops` type
+
+`ops` feature flags are long-lived feature flags that control operational aspects
+of GitLab product behavior. For example, feature flags that disable features that might
+have a performance impact, like special Sidekiq worker behavior.
+
+`ops` feature flags likely do not have rollout issues, as it is hard to
+predict when they are enabled or disabled.
+
+To use `ops` feature flags, you must append `type: :ops` to `Feature.enabled?`
+invocations:
+
+```ruby
+# Check if feature flag is enabled
+Feature.enabled?(:my_ops_flag, project, type: :ops)
+
+# Check if feature flag is disabled
+Feature.disabled?(:my_ops_flag, project, type: :ops)
+
+# Push feature flag to Frontend
+push_frontend_feature_flag(:my_ops_flag, project, type: :ops)
+```
+
+### `experiment` type
+
+`experiment` feature flags are used for A/B testing on GitLab.com.
+
+An `experiment` feature flag should conform to the same standards as a `development` feature flag,
+although the interface has some differences. An experiment feature flag should have a rollout issue,
+ideally created using the [Experiment Tracking template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/issue_templates/experiment_tracking_template.md). More information can be found in the [experiment guide](../experiment_guide/index.md).
+
+## Feature flag definition and validation
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/229161) in GitLab 13.3.
+
+During development (`RAILS_ENV=development`) or testing (`RAILS_ENV=test`) all feature flag usage is being strictly validated.
+
+This process is meant to ensure consistent feature flag usage in the codebase. All feature flags **must**:
+
+- Be known. Only use feature flags that are explicitly defined.
+- Not be defined twice. They have to be defined either in FOSS or EE, but not both.
+- Use a valid and consistent `type:` across all invocations.
+- Use the same `default_enabled:` across all invocations.
+- Have an owner.
+
+All feature flags known to GitLab are self-documented in YAML files stored in:
+
+- [`config/feature_flags`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/config/feature_flags)
+- [`ee/config/feature_flags`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/ee/config/feature_flags)
+
+Each feature flag is defined in a separate YAML file consisting of a number of fields:
+
+| Field | Required | Description |
+|---------------------|----------|----------------------------------------------------------------|
+| `name` | yes | Name of the feature flag. |
+| `type` | yes | Type of feature flag. |
+| `default_enabled` | yes | The default state of the feature flag that is strictly validated, with `default_enabled:` passed as an argument. |
+| `introduced_by_url` | no | The URL to the Merge Request that introduced the feature flag. |
+| `rollout_issue_url` | no | The URL to the Issue covering the feature flag rollout. |
+| `group` | no | The [group](https://about.gitlab.com/handbook/product/categories/#devops-stages) that owns the feature flag. |
+
+NOTE:
+All validations are skipped when running in `RAILS_ENV=production`.
+
+## Create a new feature flag
+
+The GitLab codebase provides [`bin/feature-flag`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/bin/feature-flag),
+a dedicated tool to create new feature flag definitions.
+The tool asks various questions about the new feature flag, then creates
+a YAML definition in `config/feature_flags` or `ee/config/feature_flags`.
+
+Only feature flags that have a YAML definition file can be used when running the development or testing environments.
+
+```shell
+$ bin/feature-flag my_feature_flag
+>> Specify the group introducing the feature flag, like `group::apm`:
+?> group::memory
+
+>> URL of the MR introducing the feature flag (enter to skip):
+?> https://gitlab.com/gitlab-org/gitlab/-/merge_requests/38602
+
+>> Open this URL and fill in the rest of the details:
+https://gitlab.com/gitlab-org/gitlab/-/issues/new?issue%5Btitle%5D=%5BFeature+flag%5D+Rollout+of+%60test-flag%60&issuable_template=Feature+Flag+Roll+Out
+
+>> URL of the rollout issue (enter to skip):
+?> https://gitlab.com/gitlab-org/gitlab/-/issues/232533
+create config/feature_flags/development/my_feature_flag.yml
+---
+name: my_feature_flag
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/38602
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/232533
+group: group::memory
+type: development
+default_enabled: false
+```
+
+NOTE:
+To create a feature flag that is only used in EE, add the `--ee` flag: `bin/feature-flag --ee`
+
+## Delete a feature flag
+
+See [cleaning up feature flags](controls.md#cleaning-up) for more information about
+deleting feature flags.
+
+## Develop with a feature flag
+
+There are two main ways of using Feature Flags in the GitLab codebase:
+
+- [Backend code (Rails)](#backend)
+- [Frontend code (VueJS)](#frontend)
+
+### Backend
+
+The feature flag interface is defined in [`lib/feature.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/feature.rb).
+This interface provides a set of methods to check if the feature flag is enabled or disabled:
+
+```ruby
+if Feature.enabled?(:my_feature_flag, project)
+ # execute code if feature flag is enabled
+else
+ # execute code if feature flag is disabled
+end
+
+if Feature.disabled?(:my_feature_flag, project)
+ # execute code if feature flag is disabled
+end
+```
+
+In rare cases you may want to make a feature enabled by default. If so, explain the reasoning
+in the merge request. Use `default_enabled: true` when checking the feature flag state:
+
+```ruby
+if Feature.enabled?(:feature_flag, project, default_enabled: true)
+ # execute code if feature flag is enabled
+else
+ # execute code if feature flag is disabled
+end
+
+if Feature.disabled?(:my_feature_flag, project, default_enabled: true)
+ # execute code if feature flag is disabled
+end
+```
+
+If not specified, `default_enabled` is `false`.
+
+To force reading the `default_enabled` value from the relative YAML definition file, use
+`default_enabled: :yaml`:
+
+```ruby
+if Feature.enabled?(:feature_flag, project, default_enabled: :yaml)
+ # execute code if feature flag is enabled
+end
+```
+
+```ruby
+if Feature.disabled?(:feature_flag, project, default_enabled: :yaml)
+ # execute code if feature flag is disabled
+end
+```
+
+This allows to use the same feature flag check across various parts of the codebase and
+maintain the status of `default_enabled` in the YAML definition file which is the SSOT.
+
+If `default_enabled: :yaml` is used, a YAML definition is expected or an error is raised
+in development or test environment, while returning `false` on production.
+
+If not specified, the default feature flag type for `Feature.enabled?` and `Feature.disabled?`
+is `type: development`. For all other feature flag types, you must specify the `type:`:
+
+```ruby
+if Feature.enabled?(:feature_flag, project, type: :ops)
+ # execute code if ops feature flag is enabled
+else
+ # execute code if ops feature flag is disabled
+end
+
+if Feature.disabled?(:my_feature_flag, project, type: :ops)
+ # execute code if feature flag is disabled
+end
+```
+
+WARNING:
+Don't use feature flags at application load time. For example, using the `Feature` class in
+`config/initializers/*` or at the class level could cause an unexpected error. This error occurs
+because a database that a feature flag adapter might depend on doesn't exist at load time
+(especially for fresh installations). Checking for the database's existence at the caller isn't
+recommended, as some adapters don't require a database at all (for example, the HTTP adapter). The
+feature flag setup check must be abstracted in the `Feature` namespace. This approach also requires
+application reload when the feature flag changes. You must therefore ask SREs to reload the
+Web/API/Sidekiq fleet on production, which takes time to fully rollout/rollback the changes. For
+these reasons, use environment variables (for example, `ENV['YOUR_FEATURE_NAME']`) or `gitlab.yml`
+instead.
+
+Here's an example of a pattern that you should avoid:
+
+```ruby
+class MyClass
+ if Feature.enabled?(:...)
+ new_process
+ else
+ legacy_process
+ end
+end
+```
+
+### Frontend
+
+Use the `push_frontend_feature_flag` method for frontend code, which is
+available to all controllers that inherit from `ApplicationController`. You can use
+this method to expose the state of a feature flag, for example:
+
+```ruby
+before_action do
+ # Prefer to scope it per project or user e.g.
+ push_frontend_feature_flag(:vim_bindings, project)
+end
+
+def index
+ # ...
+end
+
+def edit
+ # ...
+end
+```
+
+You can then check the state of the feature flag in JavaScript as follows:
+
+```javascript
+if ( gon.features.vimBindings ) {
+ // ...
+}
+```
+
+The name of the feature flag in JavaScript is always camelCase,
+so checking for `gon.features.vim_bindings` would not work.
+
+See the [Vue guide](../fe_guide/vue.md#accessing-feature-flags) for details about
+how to access feature flags in a Vue component.
+
+In rare cases you may want to make a feature enabled by default. If so, explain the reasoning
+in the merge request. Use `default_enabled: true` when checking the feature flag state:
+
+```ruby
+before_action do
+ # Prefer to scope it per project or user e.g.
+ push_frontend_feature_flag(:vim_bindings, project, default_enabled: true)
+end
+```
+
+If not specified, the default feature flag type for `push_frontend_feature_flag`
+is `type: development`. For all other feature flag types, you must specify the `type:`:
+
+```ruby
+before_action do
+ push_frontend_feature_flag(:vim_bindings, project, type: :ops)
+end
+```
+
+### Feature actors
+
+**It is strongly advised to use actors with feature flags.** Actors provide a simple
+way to enable a feature flag only for a given project, group or user. This makes debugging
+easier, as you can filter logs and errors for example, based on actors. This also makes it possible
+to enable the feature on the `gitlab-org` or `gitlab-com` groups first, while the rest of
+the users aren't impacted.
+
+Actors also provide an easy way to do a percentage rollout of a feature in a sticky way.
+If a 1% rollout enabled a feature for a specific actor, that actor will continue to have the feature enabled at
+10%, 50%, and 100%.
+
+GitLab currently supports the following models as feature flag actors:
+
+- `User`
+- `Project`
+- `Group`
+
+The actor is a second parameter of the `Feature.enabled?` call. The
+same actor type must be used consistently for all invocations of `Feature.enabled?`.
+
+```ruby
+Feature.enabled?(:feature_flag, project)
+Feature.enabled?(:feature_flag, group)
+Feature.enabled?(:feature_flag, user)
+```
+
+#### Selectively disable by actor
+
+By default you cannot selectively disable a feature flag by actor.
+
+```shell
+# This will not work how you would expect.
+/chatops run feature set some_feature true
+/chatops run feature set --project=gitlab-org/gitlab some_feature false
+```
+
+However, if you add two feature flags, you can write your conditional statement in such a way that the equivalent selective disable is possible.
+
+```ruby
+Feature.enabled?(:a_feature, project) && Feature.disabled?(:a_feature_override, project)
+```
+
+```shell
+# This will enable a feature flag globally, except for gitlab-org/gitlab
+/chatops run feature set a_feature true
+/chatops run feature set --project=gitlab-org/gitlab a_feature_override true
+```
+
+### Enable additional objects as actors
+
+To use feature gates based on actors, the model needs to respond to
+`flipper_id`. For example, to enable for the Foo model:
+
+```ruby
+class Foo < ActiveRecord::Base
+ include FeatureGate
+end
+```
+
+Only models that `include FeatureGate` or expose `flipper_id` method can be
+used as an actor for `Feature.enabled?`.
+
+### Feature flags for licensed features
+
+You can't use a feature flag with the same name as a licensed feature name, because
+it would cause a naming collision. This was [widely discussed and removed](https://gitlab.com/gitlab-org/gitlab/-/issues/259611)
+because it is confusing.
+
+To check for licensed features, add a dedicated feature flag under a different name
+and check it explicitly, for example:
+
+```ruby
+Feature.enabled?(:licensed_feature_feature_flag, project) &&
+ project.feature_available?(:licensed_feature)
+```
+
+### Feature groups
+
+Feature groups must be defined statically in `lib/feature.rb` (in the
+`.register_feature_groups` method), but their implementation can obviously be
+dynamic (querying the DB, for example).
+
+Once defined in `lib/feature.rb`, you can to activate a
+feature for a given feature group via the [`feature_group` parameter of the features API](../../api/features.md#set-or-create-a-feature)
+
+### Enabling a feature flag locally (in development)
+
+In the rails console (`rails c`), enter the following command to enable a feature flag:
+
+```ruby
+Feature.enable(:feature_flag_name)
+```
+
+Similarly, the following command disables a feature flag:
+
+```ruby
+Feature.disable(:feature_flag_name)
+```
+
+You can also enable a feature flag for a given gate:
+
+```ruby
+Feature.enable(:feature_flag_name, Project.find_by_full_path("root/my-project"))
+```
+
+### Removing a feature flag locally (in development)
+
+When manually enabling or disabling a feature flag from the Rails console, its default value gets overwritten.
+This can cause confusion when changing the flag's `default_enabled` attribute.
+
+To reset the feature flag to the default status, you can remove it in the rails console (`rails c`)
+as follows:
+
+```ruby
+Feature.remove(:feature_flag_name)
+```
+
+## Feature flags in tests
+
+Introducing a feature flag into the codebase creates an additional code path that should be tested.
+It is strongly advised to test all code affected by a feature flag, both when **enabled** and **disabled**
+to ensure the feature works properly.
+
+When using the testing environment, all feature flags are enabled by default.
+
+WARNING:
+This does not apply to end-to-end (QA) tests, which [do not disable feature flags by default](#end-to-end-qa-tests). There is a different [process for using feature flags in end-to-end tests](../testing_guide/end_to_end/feature_flags.md).
+
+To disable a feature flag in a test, use the `stub_feature_flags`
+helper. For example, to globally disable the `ci_live_trace` feature
+flag in a test:
+
+```ruby
+stub_feature_flags(ci_live_trace: false)
+
+Feature.enabled?(:ci_live_trace) # => false
+```
+
+If you wish to set up a test where a feature flag is enabled only
+for some actors and not others, you can specify this in options
+passed to the helper. For example, to enable the `ci_live_trace`
+feature flag for a specific project:
+
+```ruby
+project1, project2 = build_list(:project, 2)
+
+# Feature will only be enabled for project1
+stub_feature_flags(ci_live_trace: project1)
+
+Feature.enabled?(:ci_live_trace) # => false
+Feature.enabled?(:ci_live_trace, project1) # => true
+Feature.enabled?(:ci_live_trace, project2) # => false
+```
+
+The behavior of FlipperGate is as follows:
+
+1. You can enable an override for a specified actor to be enabled.
+1. You can disable (remove) an override for a specified actor,
+ falling back to the default state.
+1. There's no way to model that you explicitly disabled a specified actor.
+
+```ruby
+Feature.enable(:my_feature)
+Feature.disable(:my_feature, project1)
+Feature.enabled?(:my_feature) # => true
+Feature.enabled?(:my_feature, project1) # => true
+
+Feature.disable(:my_feature2)
+Feature.enable(:my_feature2, project1)
+Feature.enabled?(:my_feature2) # => false
+Feature.enabled?(:my_feature2, project1) # => true
+```
+
+### `have_pushed_frontend_feature_flags`
+
+Use `have_pushed_frontend_feature_flags` to test if [`push_frontend_feature_flag`](#frontend)
+has added the feature flag to the HTML.
+
+For example,
+
+```ruby
+stub_feature_flags(value_stream_analytics_path_navigation: false)
+
+visit group_analytics_cycle_analytics_path(group)
+
+expect(page).to have_pushed_frontend_feature_flags(valueStreamAnalyticsPathNavigation: false)
+```
+
+### `stub_feature_flags` vs `Feature.enable*`
+
+It is preferred to use `stub_feature_flags` to enable feature flags
+in the testing environment. This method provides a simple and well described
+interface for simple use cases.
+
+However, in some cases more complex behavior needs to be tested,
+like percentage rollouts of feature flags. This can be done using
+`.enable_percentage_of_time` or `.enable_percentage_of_actors`:
+
+```ruby
+# Good: feature needs to be explicitly disabled, as it is enabled by default if not defined
+stub_feature_flags(my_feature: false)
+stub_feature_flags(my_feature: true)
+stub_feature_flags(my_feature: project)
+stub_feature_flags(my_feature: [project, project2])
+
+# Bad
+Feature.enable(:my_feature_2)
+
+# Good: enable my_feature for 50% of time
+Feature.enable_percentage_of_time(:my_feature_3, 50)
+
+# Good: enable my_feature for 50% of actors/gates/things
+Feature.enable_percentage_of_actors(:my_feature_4, 50)
+```
+
+Each feature flag that has a defined state is persisted
+during test execution time:
+
+```ruby
+Feature.persisted_names.include?('my_feature') => true
+Feature.persisted_names.include?('my_feature_2') => true
+Feature.persisted_names.include?('my_feature_3') => true
+Feature.persisted_names.include?('my_feature_4') => true
+```
+
+### Stubbing actor
+
+When you want to enable a feature flag for a specific actor only,
+you can stub its representation. A gate that is passed
+as an argument to `Feature.enabled?` and `Feature.disabled?` must be an object
+that includes `FeatureGate`.
+
+In specs you can use the `stub_feature_flag_gate` method that allows you to
+quickly create a custom actor:
+
+```ruby
+gate = stub_feature_flag_gate('CustomActor')
+
+stub_feature_flags(ci_live_trace: gate)
+
+Feature.enabled?(:ci_live_trace) # => false
+Feature.enabled?(:ci_live_trace, gate) # => true
+```
+
+You can also disable a feature flag for a specific actor:
+
+```ruby
+gate = stub_feature_flag_gate('CustomActor')
+
+stub_feature_flags(ci_live_trace: false, thing: gate)
+```
+
+### Controlling feature flags engine in tests
+
+Our Flipper engine in the test environment works in a memory mode `Flipper::Adapters::Memory`.
+`production` and `development` modes use `Flipper::Adapters::ActiveRecord`.
+
+You can control whether the `Flipper::Adapters::Memory` or `ActiveRecord` mode is being used.
+
+#### `stub_feature_flags: true` (default and preferred)
+
+In this mode Flipper is configured to use `Flipper::Adapters::Memory` and mark all feature
+flags to be on-by-default and persisted on a first use. This overwrites the `default_enabled:`
+of `Feature.enabled?` and `Feature.disabled?` returning always `true` unless feature flag
+is persisted.
+
+Make sure behavior under feature flag doesn't go untested in some non-specific contexts.
+
+### `stub_feature_flags: false`
+
+This disables a memory-stubbed flipper, and uses `Flipper::Adapters::ActiveRecord`
+a mode that is used by `production` and `development`.
+
+You should use this mode only when you really want to tests aspects of Flipper
+with how it interacts with `ActiveRecord`.
+
+### End-to-end (QA) tests
+
+Toggling feature flags works differently in end-to-end (QA) tests. The end-to-end test framework does not have direct access to
+Rails or the database, so it can't use Flipper. Instead, it uses [the public API](../../api/features.md#set-or-create-a-feature). Each end-to-end test can [enable or disable a feature flag during the test](../testing_guide/end_to_end/feature_flags.md). Alternatively, you can enable or disable a feature flag before one or more tests when you [run them from your GitLab repository's `qa` directory](https://gitlab.com/gitlab-org/gitlab/tree/master/qa#running-tests-with-a-feature-flag-enabled-or-disabled), or if you [run the tests via GitLab QA](https://gitlab.com/gitlab-org/gitlab-qa/-/blob/master/docs/what_tests_can_be_run.md#running-tests-with-a-feature-flag-enabled).
+
+[As noted above, feature flags are not enabled by default in end-to-end tests.](#feature-flags-in-tests)
+This means that end-to-end tests will run with feature flags in the default state implemented in the source
+code, or with the feature flag in its current state on the GitLab instance under test, unless the
+test is written to enable/disable a feature flag explicitly.
+
+When a feature flag is changed on Staging or on GitLab.com, a Slack message will be posted to the `#qa-staging` or `#qa-production` channels to inform
+the pipeline triage DRI so that they can more easily determine if any failures are related to a feature flag change. However, if you are working on a change you can
+help to avoid unexpected failures by [confirming that the end-to-end tests pass with a feature flag enabled.](../testing_guide/end_to_end/feature_flags.md#confirming-that-end-to-end-tests-pass-with-a-feature-flag-enabled)
diff --git a/doc/development/feature_flags/process.md b/doc/development/feature_flags/process.md
index 65a6d01e0a2..247dafe9f0b 100644
--- a/doc/development/feature_flags/process.md
+++ b/doc/development/feature_flags/process.md
@@ -1,177 +1,8 @@
---
-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: 'https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle/'
---
-# Feature flags process
+This document was moved to [another location](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle/).
-## Feature flags for user applications
-
-This document only covers feature flags used in the development of GitLab
-itself. Feature flags in deployed user applications can be found at
-[Feature Flags feature documentation](../../operations/feature_flags.md).
-
-## Feature flags in GitLab development
-
-The following highlights should be considered when deciding if feature flags
-should be leveraged:
-
-- By default, the feature flags should be **off**.
-- Feature flags should remain in the codebase for as short period as possible
- to reduce the need for feature flag accounting.
-- The person operating with feature flags is responsible for clearly communicating
- the status of a feature behind the feature flag with responsible stakeholders. The
- issue description should be updated with the feature flag name and whether it is
- defaulted on or off as soon it is evident that a feature flag is needed.
-- Merge requests that make changes hidden behind a feature flag, or remove an
- existing feature flag because a feature is deemed stable must have the
- ~"feature flag" label assigned.
-- When development of a feature will be spread across multiple merge
- requests, you can use the following workflow:
-
- 1. [Create a new feature flag](development.md#create-a-new-feature-flag)
- which is **off** by default, in the first merge request which uses the flag.
- Flags [should not be added separately](development.md#risk-of-a-broken-master-main-branch).
- 1. Submit incremental changes via one or more merge requests, ensuring that any
- new code added can only be reached if the feature flag is **on**.
- You can keep the feature flag enabled on your local GDK during development.
- 1. When the feature is ready to be tested, enable the feature flag for
- a specific project and ensure that there are no issues with the implementation.
- 1. When the feature is ready to be announced, create a merge request that adds
- documentation about the feature, including [documentation for the feature flag itself](../documentation/feature_flags.md),
- and a changelog entry. In the same merge request either flip the feature flag to
- be **on by default** or remove it entirely in order to enable the new behavior.
-
-One might be tempted to think that feature flags will delay the release of a
-feature by at least one month (= one release). This is not the case. A feature
-flag does not have to stick around for a specific amount of time
-(e.g. at least one release), instead they should stick around until the feature
-is deemed stable. Stable means it works on GitLab.com without causing any
-problems, such as outages.
-
-Please also read the [development guide for feature flags](development.md).
-
-### Including a feature behind feature flag in the final release
-
-In order to build a final release and present the feature for self-managed
-users, the feature flag should be at least defaulted to **on**. If the feature
-is deemed stable and there is confidence that removing the feature flag is safe,
-consider removing the feature flag altogether. It's _strongly_ recommended that
-the feature flag is [enabled **globally** on **production**](controls.md#enabling-a-feature-for-gitlabcom) for **at least one day**
-before making this decision. Unexpected bugs are sometimes discovered during this period.
-
-The process for enabling features that are disabled by default can take 5-6 days
-from when the merge request is first reviewed to when the change is deployed to
-GitLab.com. However, it is recommended to allow 10-14 days for this activity to
-account for unforeseen problems.
-
-Feature flags must be [documented according to their state (enabled/disabled)](../documentation/feature_flags.md),
-and when the state changes, docs **must** be updated accordingly.
-
-NOTE:
-Take into consideration that such action can make the feature available on
-GitLab.com shortly after the change to the feature flag is merged.
-
-Changing the default state or removing the feature flag has to be done before
-the 22nd of the month, _at least_ 3-4 working days before, in order for the change
-to be included in the final self-managed release.
-
-In addition to this, the feature behind feature flag should:
-
-- Run in all GitLab.com environments for a sufficient period of time. This time
- period depends on the feature behind the feature flag, but as a general rule of
- thumb 2-4 working days should be sufficient to gather enough feedback.
-- The feature should be exposed to all users within the GitLab.com plan during
- the above mentioned period of time. Exposing the feature to a smaller percentage
- or only a group of users might not expose a sufficient amount of information to aid in
- making a decision on feature stability.
-
-While rare, release managers may decide to reject picking or revert a change in
-a stable branch, even when feature flags are used. This might be necessary if
-the changes are deemed problematic, too invasive, or there simply isn't enough
-time to properly measure how the changes behave on GitLab.com.
-
-### The cost of feature flags
-
-When reading the above, one might be tempted to think this procedure is going to
-add a lot of work. Fortunately, this is not the case, and we'll show why. For
-this example we'll specify the cost of the work to do as a number, ranging from
-0 to infinity. The greater the number, the more expensive the work is. The cost
-does _not_ translate to time, it's just a way of measuring complexity of one
-change relative to another.
-
-Let's say we are building a new feature, and we have determined that the cost of
-this is 10. We have also determined that the cost of adding a feature flag check
-in a variety of places is 1. If we do not use feature flags, and our feature
-works as intended, our total cost is 10. This however is the best case scenario.
-Optimizing for the best case scenario is guaranteed to lead to trouble, whereas
-optimizing for the worst case scenario is almost always better.
-
-To illustrate this, let's say our feature causes an outage, and there's no
-immediate way to resolve it. This means we'd have to take the following steps to
-resolve the outage:
-
-1. Revert the release.
-1. Perform any cleanups that might be necessary, depending on the changes that
- were made.
-1. Revert the commit, ensuring the "master" branch remains stable. This is
- especially necessary if solving the problem can take days or even weeks.
-1. Pick the revert commit into the appropriate stable branches, ensuring we
- don't block any future releases until the problem is resolved.
-
-As history has shown, these steps are time consuming, complex, often involve
-many developers, and worst of all: our users will have a bad experience using
-GitLab.com until the problem is resolved.
-
-Now let's say that all of this has an associated cost of 10. This means that in
-the worst case scenario, which we should optimize for, our total cost is now 20.
-
-If we had used a feature flag, things would have been very different. We don't
-need to revert a release, and because feature flags are disabled by default we
-don't need to revert and pick any Git commits. In fact, all we have to do is
-disable the feature, and in the worst case, perform cleanup. Let's say that
-the cost of this is 2. In this case, our best case cost is 11: 10 to build the
-feature, and 1 to add the feature flag. The worst case cost is now 13:
-
-- 10 to build the feature.
-- 1 to add the feature flag.
-- 2 to disable and clean up.
-
-Here we can see that in the best case scenario the work necessary is only a tiny
-bit more compared to not using a feature flag. Meanwhile, the process of
-reverting our changes has been made significantly and reliably cheaper.
-
-In other words, feature flags do not slow down the development process. Instead,
-they speed up the process as managing incidents now becomes _much_ easier. Once
-continuous deployments are easier to perform, the time to iterate on a feature
-is reduced even further, as you no longer need to wait weeks before your changes
-are available on GitLab.com.
-
-### The benefits of feature flags
-
-It may seem like feature flags are configuration, which goes against our [convention-over-configuration](https://about.gitlab.com/handbook/product/product-principles/#convention-over-configuration)
-principle. However, configuration is by definition something that is user-manageable.
-Feature flags are not intended to be user-editable. Instead, they are intended as a tool for Engineers
-and Site Reliability Engineers to use to de-risk their changes. Feature flags are the shim that gets us
-to Continuous Delivery with our monorepo and without having to deploy the entire codebase on every change.
-Feature flags are created to ensure that we can safely rollout our work on our terms.
-If we use Feature Flags as a configuration, we are doing it wrong and are indeed in violation of our
-principles. If something needs to be configured, we should intentionally make it configuration from the
-first moment.
-
-Some of the benefits of using development-type feature flags are:
-
-1. It enables Continuous Delivery for GitLab.com.
-1. It significantly reduces Mean-Time-To-Recovery.
-1. It helps engineers to monitor and reduce the impact of their changes gradually, at any scale,
- allowing us to be more metrics-driven and execute good DevOps practices, [shifting some responsibility "left"](https://devops.com/why-its-time-for-site-reliability-engineering-to-shift-left/).
-1. Controlled feature rollout timing: without feature flags, we would need to wait until a specific
- deployment was complete (which at GitLab could be at any time).
-1. Increased psychological safety: when a feature flag is used, an engineer has the confidence that if anything goes wrong they can quickly disable the code and minimize the impact of a change that might be risky.
-1. Improved throughput: when a change is less risky because a flag exists, theoretical tests about
- scalability can potentially become unnecessary or less important. This allows an engineer to
- potentially test a feature on a small project, monitor the impact, and proceed. The alternative might
- be to build complex benchmarks locally, or on staging, or on another GitLab deployment, which has a
- large impact on the time it can take to build and release a feature.
+<!-- This redirect file can be deleted after 2021-06-01. -->
+<!-- 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/development/features_inside_dot_gitlab.md b/doc/development/features_inside_dot_gitlab.md
index 08adb7faeb2..36b9064bbc4 100644
--- a/doc/development/features_inside_dot_gitlab.md
+++ b/doc/development/features_inside_dot_gitlab.md
@@ -10,8 +10,8 @@ We have implemented standard features that depend on configuration files in the
When implementing new features, please refer to these existing features to avoid conflicts:
- [Custom Dashboards](../operations/metrics/dashboards/index.md#add-a-new-dashboard-to-your-project): `.gitlab/dashboards/`.
-- [Issue Templates](../user/project/description_templates.md#creating-issue-templates): `.gitlab/issue_templates/`.
-- [Merge Request Templates](../user/project/description_templates.md#creating-merge-request-templates): `.gitlab/merge_request_templates/`.
+- [Issue Templates](../user/project/description_templates.md#create-an-issue-template): `.gitlab/issue_templates/`.
+- [Merge Request Templates](../user/project/description_templates.md#create-a-merge-request-template): `.gitlab/merge_request_templates/`.
- [GitLab Kubernetes Agents](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/master/doc/configuration_repository.md#layout): `.gitlab/agents/`.
- [CODEOWNERS](../user/project/code_owners.md#how-to-set-up-code-owners): `.gitlab/CODEOWNERS`.
- [Route Maps](../ci/review_apps/#route-maps): `.gitlab/route-map.yml`.
diff --git a/doc/development/gemfile.md b/doc/development/gemfile.md
index 0be772db12e..f50e19bc383 100644
--- a/doc/development/gemfile.md
+++ b/doc/development/gemfile.md
@@ -31,3 +31,58 @@ You should also update npm packages that follow the current version of Rails:
- `@rails/ujs`
- `@rails/actioncable`
+
+## Upgrading dependencies because of vulnerabilities
+
+When upgrading dependencies because of a vulnerability, we
+should pin the minimal version of the gem in which the vulnerability
+was fixed in our Gemfile to avoid accidentally downgrading.
+
+For example, consider that the gem `license_finder` has `thor` as its
+dependency. `thor` was found vulnerable until its version `1.1.1`,
+which includes the vulnerability fix.
+
+In the Gemfile, make sure to pin `thor` to `1.1.1`. The direct
+dependency `license_finder` should already have the version specified.
+
+```ruby
+gem 'license_finder', '~> 6.0'
+# Dependency of license_finder with fix for vulnerability
+# _link to initial security issue that will become public in time_
+gem 'thor', '>= 1.1.1'
+```
+
+Here we're using the operator `>=` (greater than or equal to) rather
+than `~>` ([pessimistic
+operator](https://thoughtbot.com/blog/rubys-pessimistic-operator))
+making it possible to upgrade `license_finder` or any other gem to a
+version that depends on `thor 1.2`.
+
+Simlarly, if `license_finder` had a vulnerability fixed in 6.0.1, we
+should add:
+
+```ruby
+gem 'license_finder', '~> 6.0', '>= 6.0.1'
+```
+
+This way, other dependencies rather than `license_finder` can
+still depend on a newer version of `thor`, such as `6.0.2`, but would
+not be able to depend on the vulnerable version `6.0.0`.
+
+A downgrade like that could happen if we introduced a new dependency
+that also relied on thor but had its version pinned to a vulnerable
+one. These changes are easy to miss in the `Gemfile.lock`. Pinning the
+version would result in a conflict that would need to be solved.
+
+To avoid upgrading indirect dependencies, we can use [`bundle update
+--conservative`](https://bundler.io/man/bundle-update.1.html#OPTIONS).
+
+When submitting a merge request including a dependency update,
+include a link to the Gem diff between the 2 versions in the merge request
+description. You can find this link on `rubygems.org` under
+**Review Changes**. When you click it, RubyGems generates a comparison
+between the versions on `diffend.io`. For example, this is the gem
+diff for [`thor` 1.0.0 vs
+1.0.1](https://my.diffend.io/gems/thor/1.0.0/1.0.1). Use the
+links directly generated from RubyGems, since the links from GitLab or other code-hosting
+platforms might not reflect the code that's actually published.
diff --git a/doc/development/git_object_deduplication.md b/doc/development/git_object_deduplication.md
index 00993cc2932..d9ff88aef60 100644
--- a/doc/development/git_object_deduplication.md
+++ b/doc/development/git_object_deduplication.md
@@ -1,7 +1,8 @@
---
-stage: none
-group: unassigned
+stage: Create
+group: Gitaly
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+type: reference
---
# How Git object deduplication works in GitLab
diff --git a/doc/development/go_guide/index.md b/doc/development/go_guide/index.md
index f352db918ed..745ec50bdcd 100644
--- a/doc/development/go_guide/index.md
+++ b/doc/development/go_guide/index.md
@@ -91,7 +91,7 @@ projects:
- Avoid global variables, even in packages. By doing so you introduce side
effects if the package is included multiple times.
- Use `goimports` before committing.
- [`goimports`](https://godoc.org/golang.org/x/tools/cmd/goimports)
+ [`goimports`](https://pkg.go.dev/golang.org/x/tools/cmd/goimports)
is a tool that automatically formats Go source code using
[`Gofmt`](https://golang.org/cmd/gofmt/), in addition to formatting import lines,
adding missing ones and removing unreferenced ones.
@@ -202,9 +202,9 @@ code readability and test output.
### Better output in tests
When comparing expected and actual values in tests, use
-[`testify/require.Equal`](https://godoc.org/github.com/stretchr/testify/require#Equal),
-[`testify/require.EqualError`](https://godoc.org/github.com/stretchr/testify/require#EqualError),
-[`testify/require.EqualValues`](https://godoc.org/github.com/stretchr/testify/require#EqualValues),
+[`testify/require.Equal`](https://pkg.go.dev/github.com/stretchr/testify/require#Equal),
+[`testify/require.EqualError`](https://pkg.go.dev/github.com/stretchr/testify/require#EqualError),
+[`testify/require.EqualValues`](https://pkg.go.dev/github.com/stretchr/testify/require#EqualValues),
and others to improve readability when comparing structs, errors,
large portions of text, or JSON documents:
@@ -363,12 +363,12 @@ There are a few guidelines one should follow when using the
[Logrus](https://github.com/sirupsen/logrus) package:
- When printing an error use
- [WithError](https://godoc.org/github.com/sirupsen/logrus#WithError). For
+ [WithError](https://pkg.go.dev/github.com/sirupsen/logrus#WithError). For
example, `logrus.WithError(err).Error("Failed to do something")`.
- Since we use [structured logging](#structured-json-logging) we can log
fields in the context of that code path, such as the URI of the request using
- [`WithField`](https://godoc.org/github.com/sirupsen/logrus#WithField) or
- [`WithFields`](https://godoc.org/github.com/sirupsen/logrus#WithFields). For
+ [`WithField`](https://pkg.go.dev/github.com/sirupsen/logrus#WithField) or
+ [`WithFields`](https://pkg.go.dev/github.com/sirupsen/logrus#WithFields). For
example, `logrus.WithField("file", "/app/go").Info("Opening dir")`. If you
have to log multiple keys, always use `WithFields` instead of calling
`WithField` more than once.
@@ -488,7 +488,7 @@ The following are some style guidelines that are specific to the Secure Team.
### Code style and format
Use `goimports -local gitlab.com/gitlab-org` before committing.
-[`goimports`](https://godoc.org/golang.org/x/tools/cmd/goimports)
+[`goimports`](https://pkg.go.dev/golang.org/x/tools/cmd/goimports)
is a tool that automatically formats Go source code using
[`Gofmt`](https://golang.org/cmd/gofmt/), in addition to formatting import lines,
adding missing ones and removing unreferenced ones.
diff --git a/doc/development/graphql_guide/graphql_pro.md b/doc/development/graphql_guide/graphql_pro.md
index 6f62d86af40..ca20d66dd87 100644
--- a/doc/development/graphql_guide/graphql_pro.md
+++ b/doc/development/graphql_guide/graphql_pro.md
@@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# GraphQL Pro
-GraphQL has become a key technology in GitLab and is implemented using the
+GraphQL has become a key technology in GitLab and is implemented using the
[GraphQL Ruby gem](https://graphql-ruby.org). As such, we've purchased a subscription to
[GraphQL Pro](https://graphql.pro).
@@ -15,7 +15,7 @@ The main purpose is for support. Per the website:
> As a GraphQL::Pro customer, you get direct access to the GraphQL Ruby gem
> creator and maintainer. Get prioritized support for issues and requests.
-Note that we **cannot** use the Pro version directly in our product, since we are
+Note that we **cannot** use the Pro version directly in our product, since we are
an Open Core product - we can not require customers to purchase the Pro version, nor can we ship it.
Details on the billing account and gem licensing can be found in the Engineering 1Password vault.
diff --git a/doc/development/graphql_guide/index.md b/doc/development/graphql_guide/index.md
index fd6d8992f94..4ecb34835aa 100644
--- a/doc/development/graphql_guide/index.md
+++ b/doc/development/graphql_guide/index.md
@@ -17,6 +17,6 @@ feedback, and suggestions.
- [GraphQL API documentation style guide](../documentation/graphql_styleguide.md): documentation
style guide for GraphQL.
- [GraphQL API](../../api/graphql/index.md): user documentation for the GitLab GraphQL API.
-- [GraphQL BatchLoader](batchloader.md): development documentation on the batchloader.
+- [GraphQL BatchLoader](batchloader.md): development documentation on the BatchLoader.
- [GraphQL pagination](pagination.md): development documentation on pagination.
- [GraphQL Pro](graphql_pro.md): information on our GraphQL Pro subscription.
diff --git a/doc/development/i18n/translation.md b/doc/development/i18n/translation.md
index 25dc854d2a3..7fb49521106 100644
--- a/doc/development/i18n/translation.md
+++ b/doc/development/i18n/translation.md
@@ -22,9 +22,17 @@ You may create a new account or use any of their supported sign in services.
GitLab is being translated into many languages.
-1. Select the language you would like to contribute translations to by clicking the flag
+1. Find the language that you want to contribute to, in our
+ [GitLab Crowdin project](https://crowdin.com/project/gitlab-ee).
+ - If the language that you're looking for is available, proceed
+ to the next step.
+ - If the language you are looking for is not available,
+ [open an issue](https://gitlab.com/gitlab-org/gitlab/-/issues?scope=all&utf8=✓&state=all&label_name[]=Category%3AInternationalization). Notify our Crowdin
+ administrators by including `@gitlab-org/manage/import` in your issue.
+ in the issue.
+ - After the issue/Merge Request is complete, restart this procedure.
1. Next, you can view list of files and folders.
- Click `gitlab.pot` to open the translation editor.
+ Select `gitlab.pot` to open the translation editor.
### Translation Editor
diff --git a/doc/development/image_scaling.md b/doc/development/image_scaling.md
index d447b6baf57..79687b66711 100644
--- a/doc/development/image_scaling.md
+++ b/doc/development/image_scaling.md
@@ -73,7 +73,7 @@ we simply follow the path we take to serve any ordinary upload.
### Workhorse
Assuming Rails decided the request to be valid, Workhorse will take over. Upon receiving the `send-scaled-image`
-instruction through the Rails response, a [special response injecter](https://gitlab.com/gitlab-org/gitlab-workhorse/-/blob/master/internal/imageresizer/image_resizer.go)
+instruction through the Rails response, a [special response injector](https://gitlab.com/gitlab-org/gitlab-workhorse/-/blob/master/internal/imageresizer/image_resizer.go)
will be invoked that knows how to rescale images. The only inputs it requires are the location of the image
(a path if the image resides in block storage, or a URL to remote storage otherwise) and the desired width.
Workhorse will handle the location transparently so Rails does not need to be concerned with where the image
diff --git a/doc/development/integrations/jenkins.md b/doc/development/integrations/jenkins.md
index 16aba023fab..f54abfd17fd 100644
--- a/doc/development/integrations/jenkins.md
+++ b/doc/development/integrations/jenkins.md
@@ -8,6 +8,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
This is a step by step guide on how to set up [Jenkins](https://www.jenkins.io/) on your local machine and connect to it from your GitLab instance. GitLab triggers webhooks on Jenkins, and Jenkins connects to GitLab using the API. By running both applications on the same machine, we can make sure they are able to access each other.
+For configuring an existing Jenkins integration, read [Jenkins CI service](../../integration/jenkins.md).
+
## Install Jenkins
Install Jenkins and start the service using Homebrew.
@@ -39,62 +41,20 @@ Jenkins uses the GitLab API and needs an access token.
## Configure Jenkins
-Configure your GitLab API connection in Jenkins.
-
-1. Make sure the GitLab plugin is installed on Jenkins. You can manage plugins in **Manage Jenkins > Manage Plugins**.
-1. Set up the GitLab connection:
- 1. Go to **Manage Jenkins > Configure System**.
- 1. Find the **GitLab** section and check the **Enable authentication for '/project' end-point** checkbox.
-1. To add your credentials, click **Add** then choose **Jenkins Credential Provider**.
-1. Choose **GitLab API token** as the type of token.
-1. Paste your GitLab access token and click **Add**.
-1. Choose your credentials from the dropdown menu.
-1. Add your GitLab host URL. Normally `http://localhost:3000/`.
-1. Click **Save Settings**.
-
-For more details, see [GitLab documentation about Jenkins CI](../../integration/jenkins.md).
+To configure your GitLab API connection in Jenkins, read
+[Configure the Jenkins server](../../integration/jenkins.md#configure-the-jenkins-server).
## Configure Jenkins Project
-Set up the Jenkins project to run your build on. A **Freestyle** project is the easiest
-option because the Jenkins plugin updates the build status on GitLab. In a **Pipeline** project, updating the status on GitLab needs to be configured in a script.
-
-1. On your Jenkins instance, go to **New Item**.
-1. Pick a name, choose **Freestyle** or **Pipeline** and click **ok**.
-1. Choose your GitLab connection from the dropdown.
-1. Check the **Build when a change is pushed to GitLab** checkbox.
-1. Check the following checkboxes:
-
- - **Accepted Merge Request Events**
- - **Closed Merge Request Events**
-
-1. If you created a **Freestyle** project, choose **Publish build status to GitLab** in the **Post-build Actions** section.
-
- If you created a **Pipeline** project, updating the status on GitLab has to be done by the pipeline script. Add GitLab update steps as in this example:
-
- ```groovy
- pipeline {
- agent any
-
- stages {
- stage('gitlab') {
- steps {
- echo 'Notify GitLab'
- updateGitlabCommitStatus name: 'build', state: 'pending'
- updateGitlabCommitStatus name: 'build', state: 'success'
- }
- }
- }
- }
- ```
+To set up the Jenkins project you intend to run your build on, read
+[Configure the Jenkins project](../../integration/jenkins.md#configure-the-jenkins-project).
## Configure your GitLab project
-To activate the Jenkins service:
+You can configure your integration between Jenkins and GitLab:
-1. Go to your project's page, then **Settings > Integrations > Jenkins CI**.
-1. Check the **Active** checkbox and the triggers for **Push** and **Merge request**.
-1. Fill in your Jenkins host, project name, username and password and click **Test settings and save changes**.
+- With the [recommended approach for Jenkins integration](../../integration/jenkins.md#recommended-jenkins-integration).
+- [Using a webhook](../../integration/jenkins.md#webhook-integration).
## Test your setup
diff --git a/doc/development/integrations/jira_connect.md b/doc/development/integrations/jira_connect.md
index bfe523ee390..860fd88612f 100644
--- a/doc/development/integrations/jira_connect.md
+++ b/doc/development/integrations/jira_connect.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Set up a development environment
+# Set up a development environment **(FREE)**
The following are required to install and test the app:
diff --git a/doc/development/integrations/secure.md b/doc/development/integrations/secure.md
index 1d5aced5869..fda75dad119 100644
--- a/doc/development/integrations/secure.md
+++ b/doc/development/integrations/secure.md
@@ -89,7 +89,7 @@ it's declared under the `reports:sast` key in the job definition, not because of
### Policies
Certain GitLab workflows, such as [AutoDevOps](../../topics/autodevops/customize.md#disable-jobs),
-define variables to indicate that given scans should be disabled. You can check for this by looking
+define CI/CD variables to indicate that given scans should be disabled. You can check for this by looking
for variables such as `DEPENDENCY_SCANNING_DISABLED`, `CONTAINER_SCANNING_DISABLED`,
`SAST_DISABLED`, and `DAST_DISABLED`. If appropriate based on the scanner type, you should then
disable running the custom scanner.
@@ -97,7 +97,7 @@ disable running the custom scanner.
GitLab also defines a `CI_PROJECT_REPOSITORY_LANGUAGES` variable, which provides the list of
languages in the repository. Depending on this value, your scanner may or may not do something different.
Language detection currently relies on the [`linguist`](https://github.com/github/linguist) Ruby gem.
-See [GitLab CI/CD predefined variables](../../ci/variables/predefined_variables.md).
+See the [predefined CI/CD variables](../../ci/variables/predefined_variables.md).
#### Policy checking example
@@ -170,23 +170,23 @@ It also generates text output on the standard output and standard error streams,
### Variables
-All CI variables are passed to the scanner as environment variables.
-The scanned project is described by the [predefined CI variables](../../ci/variables/README.md).
+All CI/CD variables are passed to the scanner as environment variables.
+The scanned project is described by the [predefined CI/CD variables](../../ci/variables/README.md).
#### SAST and Dependency Scanning
-SAST and Dependency Scanning scanners must scan the files in the project directory, given by the `CI_PROJECT_DIR` variable.
+SAST and Dependency Scanning scanners must scan the files in the project directory, given by the `CI_PROJECT_DIR` CI/CD variable.
#### Container Scanning
In order to be consistent with the official Container Scanning for GitLab,
scanners must scan the Docker image whose name and tag are given by
`CI_APPLICATION_REPOSITORY` and `CI_APPLICATION_TAG`, respectively. If the `DOCKER_IMAGE`
-variable is provided, then the `CI_APPLICATION_REPOSITORY` and `CI_APPLICATION_TAG` variables
+CI/CD variable is provided, then the `CI_APPLICATION_REPOSITORY` and `CI_APPLICATION_TAG` variables
are ignored, and the image specified in the `DOCKER_IMAGE` variable is scanned instead.
If not provided, `CI_APPLICATION_REPOSITORY` should default to
-`$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG`, which is a combination of predefined CI variables.
+`$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG`, which is a combination of predefined CI/CD variables.
`CI_APPLICATION_TAG` should default to `CI_COMMIT_SHA`.
The scanner should sign in the Docker registry
@@ -197,13 +197,13 @@ If these are not defined, then the scanner should use
#### Configuration files
While scanners may use `CI_PROJECT_DIR` to load specific configuration files,
-it is recommended to expose configuration as environment variables, not files.
+it is recommended to expose configuration as CI/CD variables, not files.
### Output file
-Like any artifact uploaded to the GitLab CI/CD,
+Like any artifact uploaded to GitLab CI/CD,
the Secure report generated by the scanner must be written in the project directory,
-given by the `CI_PROJECT_DIR` environment variable.
+given by the `CI_PROJECT_DIR` CI/CD variable.
It is recommended to name the output file after the type of scanning, and to use `gl-` as a prefix.
Since all Secure reports are JSON files, it is recommended to use `.json` as a file extension.
@@ -242,7 +242,7 @@ Also, we recommend prefixing error messages with `[ERRO]`, warnings with `[WARN]
#### Logging level
The scanner should filter out a log message if its log level is lower than the
-one set in the `SECURE_LOG_LEVEL` variable. For instance, `info` and `warn`
+one set in the `SECURE_LOG_LEVEL` CI/CD variable. For instance, `info` and `warn`
messages should be skipped when `SECURE_LOG_LEVEL` is set to `error`. Accepted
values are as follows, listed from highest to lowest:
@@ -263,14 +263,14 @@ and what `bundle audit` writes to the standard output.
If the command line fails, then it should be logged with the `error` log level;
this makes it possible to debug the problem without having to change the log level to `debug` and rerun the scanning job.
-#### common logutil package
+#### common `logutil` package
If you are using [go](https://golang.org/) and
[common](https://gitlab.com/gitlab-org/security-products/analyzers/common),
-then it is suggested that you use [logrus](https://github.com/Sirupsen/logrus)
-and [common's logutil package](https://gitlab.com/gitlab-org/security-products/analyzers/common/-/tree/master/logutil)
-to configure the formatter for [logrus](https://github.com/Sirupsen/logrus).
-See the [logutil README.md](https://gitlab.com/gitlab-org/security-products/analyzers/common/-/tree/master/logutil/README.md)
+then it is suggested that you use [Logrus](https://github.com/Sirupsen/logrus)
+and [common's `logutil` package](https://gitlab.com/gitlab-org/security-products/analyzers/common/-/tree/master/logutil)
+to configure the formatter for [Logrus](https://github.com/Sirupsen/logrus).
+See the [`logutil` README](https://gitlab.com/gitlab-org/security-products/analyzers/common/-/tree/master/logutil/README.md)
## Report
@@ -548,7 +548,7 @@ of the available SAST Analyzers and what data is currently available.
The `remediations` field of the report is an array of remediation objects.
Each remediation describes a patch that can be applied to
-[automatically fix](../../user/application_security/#automatic-remediation-for-vulnerabilities)
+[automatically fix](../../user/application_security/#apply-an-automatic-remediation-for-a-vulnerability)
a set of vulnerabilities.
Here is an example of a report that contains remediations.
diff --git a/doc/development/integrations/secure_partner_integration.md b/doc/development/integrations/secure_partner_integration.md
index 364e18ad015..17bce13583c 100644
--- a/doc/development/integrations/secure_partner_integration.md
+++ b/doc/development/integrations/secure_partner_integration.md
@@ -13,7 +13,7 @@ guidelines so you can build an integration that fits with the workflow GitLab
users are already familiar with.
This page also provides resources for the technical work associated
-with [onboarding as a partner](https://about.gitlab.com/partners/integrate/).
+with [onboarding as a partner](https://about.gitlab.com/partners/technology-partners/integrate/).
The steps below are a high-level view of what needs to be done to complete an
integration as well as linking to more detailed resources for how to do so.
@@ -101,7 +101,7 @@ and complete an integration with the Secure stage.
- Users can interact with the findings from your artifact within their workflow. They can dismiss the findings or accept them and create a backlog issue.
- To automatically create issues without user interaction, use the [issue API](../../api/issues.md).
1. Optional: Provide auto-remediation steps:
- - If you specified `remediations` in your artifact, it is proposed through our [automatic remediation](../../user/application_security/index.md#automatic-remediation-for-vulnerabilities)
+ - If you specified `remediations` in your artifact, it is proposed through our [automatic remediation](../../user/application_security/index.md#apply-an-automatic-remediation-for-a-vulnerability)
interface.
1. Demo the integration to GitLab:
- After you have tested and are ready to demo your integration please
diff --git a/doc/development/internal_api.md b/doc/development/internal_api.md
index dce0877b1b7..7c4f869d1a7 100644
--- a/doc/development/internal_api.md
+++ b/doc/development/internal_api.md
@@ -35,12 +35,12 @@ This is called by [Gitaly](https://gitlab.com/gitlab-org/gitaly) and
[GitLab Shell](https://gitlab.com/gitlab-org/gitlab-shell) to check access to a
repository.
-When called from GitLab Shell no changes are passed and the internal
-API replies with the information needed to pass the request on to
-Gitaly.
+- **When called from GitLab Shell**: No changes are passed, and the internal
+ API replies with the information needed to pass the request on to Gitaly.
+- **When called from Gitaly in a `pre-receive` hook**: The changes are passed
+ and validated to determine if the push is allowed.
-When called from Gitaly in a `pre-receive` hook the changes are passed
-and those are validated to determine if the push is allowed.
+Calls are limited to 50 seconds each.
```plaintext
POST /internal/allowed
@@ -470,7 +470,7 @@ curl --request POST --header "Gitlab-Kas-Api-Request: <JWT token>" --header "A
## Subscriptions
-The subscriptions endpoint is used by `[customers.gitlab.com](https://gitlab.com/gitlab-org/customers-gitlab-com)` (CustomersDot)
+The subscriptions endpoint is used by [CustomersDot](https://gitlab.com/gitlab-org/customers-gitlab-com) (`customers.gitlab.com`)
in order to apply subscriptions including trials, and add-on purchases, for personal namespaces or top-level groups within GitLab.com.
### Creating a subscription
@@ -488,7 +488,7 @@ POST /namespaces/:id/gitlab_subscription
| `plan_code` | string | no | Subscription tier code |
| `seats` | integer | no | Number of seats in subscription |
| `max_seats_used` | integer | no | Highest number of active users in the last month |
-| `auto_renew` | boolean | no | Whether subscription will auto renew on end date |
+| `auto_renew` | boolean | no | Whether subscription auto-renews on end date |
| `trial` | boolean | no | Whether subscription is a trial |
| `trial_starts_on` | date | no | Start date of trial |
| `trial_ends_on` | date | no | End date of trial |
@@ -539,7 +539,7 @@ PUT /namespaces/:id/gitlab_subscription
| `plan_code` | string | no | Subscription tier code |
| `seats` | integer | no | Number of seats in subscription |
| `max_seats_used` | integer | no | Highest number of active users in the last month |
-| `auto_renew` | boolean | no | Whether subscription will auto renew on end date |
+| `auto_renew` | boolean | no | Whether subscription auto-renews on end date |
| `trial` | boolean | no | Whether subscription is a trial |
| `trial_starts_on` | date | no | Start date of trial. Required if trial is true. |
| `trial_ends_on` | date | no | End date of trial |
diff --git a/doc/development/licensed_feature_availability.md b/doc/development/licensed_feature_availability.md
index 377e31f6ab7..a9fc0414297 100644
--- a/doc/development/licensed_feature_availability.md
+++ b/doc/development/licensed_feature_availability.md
@@ -4,7 +4,7 @@ group: License
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Licensed feature availability **(STARTER)**
+# Licensed feature availability
As of GitLab 9.4, we've been supporting a simplified version of licensed
feature availability checks via `ee/app/models/license.rb`, both for
@@ -17,9 +17,9 @@ feature such as [Related issues](../user/project/issues/related_issues.md) or
[Service Desk](../user/project/service_desk.md),
it should be restricted on namespace scope.
-1. Add the feature symbol on `EES_FEATURES`, `EEP_FEATURES` or `EEU_FEATURES` constants in
- `ee/app/models/license.rb`. Note on `ee/app/models/ee/namespace.rb` that _Bronze_ GitLab.com
- features maps to on-premise _EES_, _Silver_ to _EEP_ and _Gold_ to _EEU_.
+1. Add the feature symbol on `EES_FEATURES`, `EEP_FEATURES`, or `EEU_FEATURES` constants in
+ `ee/app/models/license.rb`. Note that the prefix `EES` signifies Starter, `EEP` signifies
+ Premium, and `EEU` signifies Ultimate.
1. Check using:
```ruby
@@ -35,7 +35,7 @@ the instance license.
1. Add the feature symbol on `EES_FEATURES`, `EEP_FEATURES` or `EEU_FEATURES` constants in
`ee/app/models/license.rb`.
-1. Add the same feature symbol to `GLOBAL_FEATURES`
+1. Add the same feature symbol to `GLOBAL_FEATURES`.
1. Check using:
```ruby
diff --git a/doc/development/maintenance_mode.md b/doc/development/maintenance_mode.md
index 6b5a6045bb9..f05a731a331 100644
--- a/doc/development/maintenance_mode.md
+++ b/doc/development/maintenance_mode.md
@@ -13,7 +13,7 @@ GitLab Maintenance Mode **only** blocks writes from HTTP and SSH requests at the
- [the read-only database method](https://gitlab.com/gitlab-org/gitlab/blob/2425e9de50c678413ceaad6ee3bf66f42b7e228c/ee/lib/ee/gitlab/database.rb#L13), which toggles special behavior when we are not allowed to write to the database. [Search the codebase for `Gitlab::Database.read_only?`.](https://gitlab.com/search?utf8=%E2%9C%93&search=Gitlab%3A%3ADatabase.read_only%3F&group_id=9970&project_id=278964&scope=blobs&search_code=false&snippets=false&repository_ref=)
- [the read-only middleware](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/ee/gitlab/middleware/read_only/controller.rb), where HTTP requests that cause database writes are blocked, unless explicitly allowed.
-- [Git push access via SSH is denied](https://gitlab.com/gitlab-org/gitlab/-/blob/2425e9de50c678413ceaad6ee3bf66f42b7e228c/ee/lib/ee/gitlab/git_access.rb#L13) by returning 401 when `gitlab-shell` POSTs to `/internal/allowed` to [check if access is allowed](internal_api.md#git-authentication).
+- [Git push access via SSH is denied](https://gitlab.com/gitlab-org/gitlab/-/blob/2425e9de50c678413ceaad6ee3bf66f42b7e228c/ee/lib/ee/gitlab/git_access.rb#L13) by returning 401 when `gitlab-shell` POSTs to [`/internal/allowed`](internal_api.md) to [check if access is allowed](internal_api.md#git-authentication).
- [Container registry authentication service](https://gitlab.com/gitlab-org/gitlab/-/blob/2425e9de50c678413ceaad6ee3bf66f42b7e228c/ee/app/services/ee/auth/container_registry_authentication_service.rb#L12), where updates to the container registry are blocked.
The database itself is not in read-only mode (except in a Geo secondary site) and can be written by sources other than the ones blocked.
diff --git a/doc/development/merge_request_performance_guidelines.md b/doc/development/merge_request_performance_guidelines.md
index 8d5b2db828e..50362269c1b 100644
--- a/doc/development/merge_request_performance_guidelines.md
+++ b/doc/development/merge_request_performance_guidelines.md
@@ -459,7 +459,7 @@ Performance deficiencies should be addressed right away after we merge initial
changes.
Read more about when and how feature flags should be used in
-[Feature flags in GitLab development](feature_flags/process.md#feature-flags-in-gitlab-development).
+[Feature flags in GitLab development](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle#feature-flags-in-gitlab-development).
## Storage
diff --git a/doc/development/migration_style_guide.md b/doc/development/migration_style_guide.md
index e1205346585..fcecc556052 100644
--- a/doc/development/migration_style_guide.md
+++ b/doc/development/migration_style_guide.md
@@ -374,7 +374,7 @@ standard Rails migration helper methods. Calling more than one migration
helper is not a problem if they're executed on the same table.
Using the `with_lock_retries` helper method is advised when a database
-migration involves one of the [high-traffic tables](https://gitlab.com/gitlab-org/gitlab/-/blob/master/rubocop/rubocop-migrations.yml#L3).
+migration involves one of the [high-traffic tables](#high-traffic-tables).
Example changes:
@@ -605,9 +605,10 @@ When adding a foreign-key constraint to an existing column in a non-empty table,
we have to employ `add_concurrent_foreign_key` and `add_concurrent_index`
instead of `add_reference`.
-For an empty table (such as a fresh one), it is recommended to use
-`add_reference` in a single-transaction migration, combining it with other
-operations that don't require `disable_ddl_transaction!`.
+If you have a new or empty table that doesn't reference a
+[high-traffic table](#high-traffic-tables),
+we recommend that you use `add_reference` in a single-transaction migration. You can
+combine it with other operations that don't require `disable_ddl_transaction!`.
You can read more about adding [foreign key constraints to an existing column](database/add_foreign_key_to_existing_column.md).
@@ -708,11 +709,8 @@ Dropping a database table is uncommon, and the `drop_table` method
provided by Rails is generally considered safe. Before dropping the table,
please consider the following:
-If your table has foreign keys on a high-traffic table (like `projects`), then
-the `DROP TABLE` statement might fail with **statement timeout** error. Determining
-what tables are high traffic can be difficult. Self-managed instances might
-use different features of GitLab with different usage patterns, thus making
-assumptions based on GitLab.com is not enough.
+If your table has foreign keys on a [high-traffic table](#high-traffic-tables) (like `projects`), then
+the `DROP TABLE` statement is likely to stall concurrent traffic until it fails with **statement timeout** error.
Table **has no records** (feature was never in use) and **no foreign
keys**:
@@ -1027,3 +1025,20 @@ D, [2020-07-06T00:37:12.653459 #130101] DEBUG -- : AddAndSeedMyColumn::User Up
D, [2020-07-06T00:37:12.653648 #130101] DEBUG -- : ↳ config/initializers/config_initializers_active_record_locking.rb:13:in `_update_row'
== 20200705232821 AddAndSeedMyColumn: migrated (0.1706s) =====================
```
+
+## High traffic tables
+
+Here's a list of current [high-traffic tables](https://gitlab.com/gitlab-org/gitlab/-/blob/master/rubocop/rubocop-migrations.yml).
+
+Determining what tables are high-traffic can be difficult. Self-managed instances might use
+different features of GitLab with different usage patterns, thus making assumptions based
+on GitLab.com not enough.
+
+To identify a high-traffic table for GitLab.com the following measures are considered.
+Note that the metrics linked here are GitLab-internal only:
+
+- [Read operations](https://thanos.gitlab.net/graph?g0.range_input=2h&g0.max_source_resolution=0s&g0.expr=topk(500%2C%20sum%20by%20(relname)%20(rate(pg_stat_user_tables_seq_tup_read%7Benvironment%3D%22gprd%22%7D%5B12h%5D)%20%2B%20rate(pg_stat_user_tables_idx_scan%7Benvironment%3D%22gprd%22%7D%5B12h%5D)%20%2B%20rate(pg_stat_user_tables_idx_tup_fetch%7Benvironment%3D%22gprd%22%7D%5B12h%5D)))&g0.tab=1)
+- [Number of records](https://thanos.gitlab.net/graph?g0.range_input=2h&g0.max_source_resolution=0s&g0.expr=topk(500%2C%20sum%20by%20(relname)%20(rate(pg_stat_user_tables_n_live_tup%7Benvironment%3D%22gprd%22%7D%5B12h%5D)))&g0.tab=1)
+- [Size](https://thanos.gitlab.net/graph?g0.range_input=2h&g0.max_source_resolution=0s&g0.expr=topk(500%2C%20sum%20by%20(relname)%20(rate(pg_total_relation_size_bytes%7Benvironment%3D%22gprd%22%7D%5B12h%5D)))&g0.tab=1) is greater than 10 GB
+
+Any table which has some high read operation compared to current [high-traffic tables](https://gitlab.com/gitlab-org/gitlab/-/blob/master/rubocop/rubocop-migrations.yml#L4) might be a good candidate.
diff --git a/doc/development/multi_version_compatibility.md b/doc/development/multi_version_compatibility.md
index 25f4b3b5699..ff831bfa348 100644
--- a/doc/development/multi_version_compatibility.md
+++ b/doc/development/multi_version_compatibility.md
@@ -207,7 +207,7 @@ variable `CI_NODE_TOTAL` being an integer failed. This was caused because after
1. Old code: Runners requested a job from an API node that is running the previous version.
1. As a result, the [new code](https://gitlab.com/gitlab-org/gitlab/blob/42b82a9a3ac5a96f9152aad6cbc583c42b9fb082/app/models/concerns/ci/contextable.rb#L104)
was not run on the API server. The runner's request failed because the
-older API server tried return the `CI_NODE_TOTAL` CI variable, but
+older API server tried return the `CI_NODE_TOTAL` CI/CD variable, but
instead of sending an integer value (e.g. 9), it sent a serialized
`Hash` value (`{:number=>9, :total=>9}`).
diff --git a/doc/development/namespaces_storage_statistics.md b/doc/development/namespaces_storage_statistics.md
index 373b1e38dfc..587e1091e77 100644
--- a/doc/development/namespaces_storage_statistics.md
+++ b/doc/development/namespaces_storage_statistics.md
@@ -140,7 +140,7 @@ Even though this approach would make aggregating much easier, it has some major
- We'd have to migrate **all namespaces** by adding and filling a new column. Because of the size of the table, dealing with time/cost would be significant. The background migration would take approximately `153h`, see <https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/29772>.
- Background migration has to be shipped one release before, delaying the functionality by another milestone.
-### Attempt E (final): Update the namespace storage statistics in async way
+### Attempt E (final): Update the namespace storage statistics asynchronously
This approach consists of continuing to use the incremental statistics updates we already have,
but we refresh them through Sidekiq jobs and in different transactions:
@@ -149,7 +149,7 @@ but we refresh them through Sidekiq jobs and in different transactions:
1. Whenever the statistics of a project changes, insert a row into `namespace_aggregation_schedules`
- We don't insert a new row if there's already one related to the root namespace.
- Keeping in mind the length of the transaction that involves updating `project_statistics`(<https://gitlab.com/gitlab-org/gitlab/-/issues/29070>), the insertion should be done in a different transaction and through a Sidekiq Job.
-1. After inserting the row, we schedule another worker to be executed async at two different moments:
+1. After inserting the row, we schedule another worker to be executed asynchronously at two different moments:
- One enqueued for immediate execution and another one scheduled in `1.5h` hours.
- We only schedule the jobs, if we can obtain a `1.5h` lease on Redis on a key based on the root namespace ID.
- If we can't obtain the lease, it indicates there's another aggregation already in progress, or scheduled in no more than `1.5h`.
@@ -161,7 +161,7 @@ but we refresh them through Sidekiq jobs and in different transactions:
This implementation has the following benefits:
-- All the updates are done async, so we're not increasing the length of the transactions for `project_statistics`.
+- All the updates are done asynchronously, so we're not increasing the length of the transactions for `project_statistics`.
- We're doing the update in a single SQL query.
- It is compatible with PostgreSQL and MySQL.
- No background migration required.
diff --git a/doc/development/new_fe_guide/development/components.md b/doc/development/new_fe_guide/development/components.md
index 1d56419028e..ec714c9c26f 100644
--- a/doc/development/new_fe_guide/development/components.md
+++ b/doc/development/new_fe_guide/development/components.md
@@ -19,7 +19,7 @@ D3 is very popular across many projects outside of GitLab:
- [The New York Times](https://archive.nytimes.com/www.nytimes.com/interactive/2012/02/13/us/politics/2013-budget-proposal-graphic.html)
- [plot.ly](https://plotly.com/)
-- [Droptask](https://www.ayoa.com/previously-droptask/)
+- [Ayoa](https://www.ayoa.com/previously-droptask/)
Within GitLab, D3 has been used for the following notable features
diff --git a/doc/development/new_fe_guide/tips.md b/doc/development/new_fe_guide/tips.md
index d38e261b99f..c60d70b3b16 100644
--- a/doc/development/new_fe_guide/tips.md
+++ b/doc/development/new_fe_guide/tips.md
@@ -16,18 +16,18 @@ yarn clean
## Creating feature flags in development
-The process for creating a feature flag is the same as [enabling a feature flag in development](../feature_flags/development.md#enabling-a-feature-flag-locally-in-development).
+The process for creating a feature flag is the same as [enabling a feature flag in development](../feature_flags/index.md#enabling-a-feature-flag-locally-in-development).
Your feature flag can now be:
-- [Made available to the frontend](../feature_flags/development.md#frontend) via the `gon`
-- Queried in [tests](../feature_flags/development.md#feature-flags-in-tests)
+- [Made available to the frontend](../feature_flags/index.md#frontend) via the `gon`
+- Queried in [tests](../feature_flags/index.md#feature-flags-in-tests)
- Queried in HAML templates and Ruby files via the `Feature.enabled?(:my_shiny_new_feature_flag)` method
### More on feature flags
- [Deleting a feature flag](../../api/features.md#delete-a-feature)
-- [Manage feature flags](../feature_flags/process.md)
+- [Manage feature flags](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle)
- [Feature flags API](../../api/features.md)
## Running tests locally
diff --git a/doc/development/packages.md b/doc/development/packages.md
index 2476c876b77..e8c326da974 100644
--- a/doc/development/packages.md
+++ b/doc/development/packages.md
@@ -6,20 +6,18 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Packages
-This document guides you through adding another [package management system](../administration/packages/index.md) support to GitLab.
+This document guides you through adding support to GitLab for a new a [package management system](../administration/packages/index.md).
-See already supported package types in [Packages documentation](../administration/packages/index.md)
+See the already supported formats in the [Packages & Registries documentation](../user/packages/index.md)
-Since GitLab packages' UI is pretty generic, it is possible to add basic new
-package system support with solely backend changes. This guide is superficial and does
-not cover the way the code should be written. However, you can find a good example
-by looking at the following merge requests:
+It is possible to add a new format with only backend changes.
+This guide is superficial and does not cover the way the code should be written.
+However, you can find a good example by looking at the following merge requests:
-- [npm registry support](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/8673).
-- [Maven repository](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/6607).
-- [Composer repository for PHP dependencies](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/22415).
-- [Terraform modules registry](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18834).
-- [Instance-level endpoint for Maven repository](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/8757).
+- [npm registry support](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/8673)
+- [Maven repository](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/6607)
+- [Instance-level API for Maven repository](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/8757)
+- [NuGet group-level API](https://gitlab.com/gitlab-org/gitlab/-/issues/36423)
## General information
@@ -60,26 +58,13 @@ project are visible. Alternatively, a group-level endpoint may be used to allow
within a given group. Lastly, an instance-level endpoint can be used to allow visibility to all packages within an
entire GitLab instance.
-Using group and project level endpoints allows for more flexibility in package naming, however, more remotes
-have to be managed. Using instance level endpoints requires [stricter naming conventions](#naming-conventions).
+As an MVC, we recommend beginning with a project-level endpoint. A typical iteration plan for remote hierarchies is to go from:
-The current state of existing package registries availability is:
+- Publish and install in a project
+- Install from a group
+- Publish and install in an Instance (this is for Self-Managed customers)
-| Repository Type | Project Level | Group Level | Instance Level |
-|------------------|---------------|-------------|----------------|
-| Maven | Yes | Yes | Yes |
-| Conan | Yes | No - [open issue](https://gitlab.com/gitlab-org/gitlab/-/issues/11679) | Yes |
-| npm | No - [open issue](https://gitlab.com/gitlab-org/gitlab/-/issues/36853) | Yes | No - [open issue](https://gitlab.com/gitlab-org/gitlab/-/issues/36853) |
-| NuGet | Yes | Yes | No - [open issue](https://gitlab.com/gitlab-org/gitlab/-/issues/36425) |
-| PyPI | Yes | No | No |
-| Go | Yes | No - [open issue](https://gitlab.com/gitlab-org/gitlab/-/issues/213900) | No - [open-issue](https://gitlab.com/gitlab-org/gitlab/-/issues/213902) |
-| Composer | Yes | Yes | No |
-| Generic | Yes | No | No |
-
-NOTE:
-npm is currently a hybrid of the instance level and group level.
-It is using the top-level group or namespace as the defining portion of the name
-(for example, `@my-group-name/my-package-name`).
+Using instance-level endpoints requires [stricter naming conventions](#naming-conventions).
NOTE:
Composer package naming scope is Instance Level.
@@ -116,8 +101,8 @@ Packages can be configured to use object storage, therefore your code must suppo
The way new package systems are integrated in GitLab is using an [MVC](https://about.gitlab.com/handbook/values/#minimum-viable-change-mvc). Therefore, the first iteration should support the bare minimum user actions:
-- Authentication
-- Uploading a package
+- Authentication with a GitLab job, personal access, project access, or deploy token
+- Uploading a package and displaying basic metadata in the user interface
- Pulling a package
- Required actions
@@ -137,7 +122,7 @@ There are usually 2 phases for the MVC:
When implementing a new package manager, it is tempting to create one large merge request containing all of the
necessary endpoints and services necessary to support basic usage. Instead, put the
-API endpoints behind a [feature flag](feature_flags/development.md) and
+API endpoints behind a [feature flag](feature_flags/index.md) and
submit each endpoint or behavior (download, upload, etc) in a different merge request to shorten the review
process.
@@ -242,6 +227,17 @@ create the package record. Workhorse provides a variety of file metadata such as
For testing purposes, you may want to [enable object storage](https://gitlab.com/gitlab-org/gitlab-development-kit/blob/master/doc/howto/object_storage.md)
in your local development environment.
+#### File size limits
+
+Files uploaded to the GitLab Package Registry are [limited by format](../administration/instance_limits.md#package-registry-limits).
+On GitLab.com, these are typically set to 5GB to help prevent timeout issues and abuse.
+
+When a new package type is added to the `Packages::Package` model, a size limit must be added
+similar to [this example](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52639/diffs#382f879fb09b0212e3cedd99e6c46e2083867216),
+or the [related test](https://gitlab.com/gitlab-org/gitlab/-/blob/fe4ba43766781371cebfacd78364a1de762917cd/spec/models/packages/package_spec.rb#L761)
+must be updated if file size limits do not apply. The only reason a size limit does not apply is if
+the package format does not upload and store package files.
+
#### Rate Limits on GitLab.com
Package manager clients can make rapid requests that exceed the
diff --git a/doc/development/performance.md b/doc/development/performance.md
index 3b4525dc8ee..e93dc26e4fc 100644
--- a/doc/development/performance.md
+++ b/doc/development/performance.md
@@ -256,7 +256,7 @@ The following configuration options can be configured:
- `STACKPROF_MODE`: See [sampling modes](https://github.com/tmm1/stackprof#sampling).
Defaults to `cpu`.
- `STACKPROF_INTERVAL`: Sampling interval. Unit semantics depend on `STACKPROF_MODE`.
- For `object` mode this is a per-event interval (every `n`th event is sampled)
+ For `object` mode this is a per-event interval (every `nth` event is sampled)
and defaults to `1000`.
For other modes such as `cpu` this is a frequency and defaults to `10000` μs (100hz).
- `STACKPROF_FILE_PREFIX`: File path prefix where profiles are stored. Defaults
@@ -293,7 +293,7 @@ worker processes), selecting the latter.
For Sidekiq, the signal can be sent to the `sidekiq-cluster` process via `pkill
-USR2 bin/sidekiq-cluster`, which forwards the signal to all Sidekiq
-children. Alternatively, you can also select a specific pid of interest.
+children. Alternatively, you can also select a specific PID of interest.
Production profiles can be especially noisy. It can be helpful to visualize them
as a [flame graph](https://github.com/brendangregg/FlameGraph). This can be done
@@ -306,7 +306,7 @@ bundle exec stackprof --stackcollapse /tmp/stackprof.55769.c6c3906452.profile |
## RSpec profiling
The GitLab development environment also includes the
-[rspec_profiling](https://github.com/foraker/rspec_profiling) gem, which is used
+[`rspec_profiling`](https://github.com/foraker/rspec_profiling) gem, which is used
to collect data on spec execution times. This is useful for analyzing the
performance of the test suite itself, or seeing how the performance of a spec
may have changed over time.
@@ -347,13 +347,112 @@ example, you can find which tests take longest to run or which execute the most
queries. This can be handy for optimizing our tests or identifying performance
issues in our code.
-## Memory profiling
+## Memory optimization
-We can use two approaches, often in combination, to track down memory issues:
+We can use a set of different techniques, often in combination, to track down memory issues:
- Leaving the code intact and wrapping a profiler around it.
+- Use memory allocation counters for requests and services.
- Monitor memory usage of the process while disabling/enabling different parts of the code we suspect could be problematic.
+### Memory allocations
+
+Ruby shipped with GitLab includes a special patch to allow [tracing memory allocations](https://gitlab.com/gitlab-org/gitlab/-/issues/296530).
+This patch is available by default for
+[Omnibus](https://gitlab.com/gitlab-org/omnibus-gitlab/-/merge_requests/4948),
+[CNG](https://gitlab.com/gitlab-org/build/CNG/-/merge_requests/591),
+[GitLab CI](https://gitlab.com/gitlab-org/gitlab-build-images/-/merge_requests/355),
+[GCK](https://gitlab.com/gitlab-org/gitlab-compose-kit/-/merge_requests/149)
+and can additionally be enabled for [GDK](https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/master/doc/advanced.md#apply-custom-patches-for-ruby).
+
+This patch provides a set of 3 metrics that makes it easier to understand efficiency of memory usage for a given codepath:
+
+- `mem_objects`: the number of objects allocated.
+- `mem_bytes`: the number of bytes allocated by malloc.
+- `mem_mallocs`: the number of malloc allocations.
+
+The number of objects and bytes allocated impact how often GC cycles happen.
+Fewer objects allocations result in a significantly more responsive application.
+
+It is advised that web server requests do not allocate more than `100k mem_objects`
+and `100M mem_bytes`. You can view the current usage on [GitLab.com](https://log.gprd.gitlab.net/goto/3a9678bb595e3f89a0c7b5c61bcc47b9).
+
+#### Checking memory pressure of own code
+
+There are two ways of measuring your own code:
+
+1. Review `api_json.log`, `development_json.log`, `sidekiq.log` that includes memory allocation counters.
+1. Use `Gitlab::Memory::Instrumentation.with_memory_allocations` for a given codeblock and log it.
+1. Use [Measuring module](service_measurement.md)
+
+```json
+{"time":"2021-02-15T11:20:40.821Z","severity":"INFO","duration_s":0.27412,"db_duration_s":0.05755,"view_duration_s":0.21657,"status":201,"method":"POST","path":"/api/v4/projects/user/1","mem_objects":86705,"mem_bytes":4277179,"mem_mallocs":22693,"correlation_id":"...}
+```
+
+#### Different types of allocations
+
+The `mem_*` values represent different aspects of how objects and memory are allocated in Ruby:
+
+- The following example will create around of `1000` of `mem_objects` since strings
+ can be frozen, and while the underlying string object remains the same, we still need to allocate 1000 references to this string:
+
+ ```ruby
+ Gitlab::Memory::Instrumentation.with_memory_allocations do
+ 1_000.times { '0123456789' }
+ end
+
+ => {:mem_objects=>1001, :mem_bytes=>0, :mem_mallocs=>0}
+ ```
+
+- The following example will create around of `1000` of `mem_objects`, as strings are created dynamically.
+ Each of them will not allocate additional memory, as they fit into Ruby slot of 40 bytes:
+
+ ```ruby
+ Gitlab::Memory::Instrumentation.with_memory_allocations do
+ s = '0'
+ 1_000.times { s * 23 }
+ end
+
+ => {:mem_objects=>1002, :mem_bytes=>0, :mem_mallocs=>0}
+ ```
+
+- The following example will create around of `1000` of `mem_objects`, as strings are created dynamically.
+ Each of them will allocate additional memory as strings are larger than Ruby slot of 40 bytes:
+
+ ```ruby
+ Gitlab::Memory::Instrumentation.with_memory_allocations do
+ s = '0'
+ 1_000.times { s * 24 }
+ end
+
+ => {:mem_objects=>1002, :mem_bytes=>32000, :mem_mallocs=>1000}
+ ```
+
+- The following example will allocate over 40kB of data, and perform only a single memory allocation.
+ The existing object will be reallocated/resized on subsequent iterations:
+
+ ```ruby
+ Gitlab::Memory::Instrumentation.with_memory_allocations do
+ str = ''
+ append = '0123456789012345678901234567890123456789' # 40 bytes
+ 1_000.times { str.concat(append) }
+ end
+ => {:mem_objects=>3, :mem_bytes=>49152, :mem_mallocs=>1}
+ ```
+
+- The following example will create over 1k of objects, perform over 1k of allocations, each time mutating the object.
+ This does result in copying a lot of data and perform a lot of memory allocations
+ (as represented by `mem_bytes` counter) indicating very inefficient method of appending string:
+
+ ```ruby
+ Gitlab::Memory::Instrumentation.with_memory_allocations do
+ str = ''
+ append = '0123456789012345678901234567890123456789' # 40 bytes
+ 1_000.times { str += append }
+ end
+ => {:mem_objects=>1003, :mem_bytes=>21968752, :mem_mallocs=>1000}
+ ```
+
### Using Memory Profiler
We can use `memory_profiler` for profiling.
@@ -409,7 +508,7 @@ Fragmented Ruby heap snapshot could look like this:
![Ruby heap fragmentation](img/memory_ruby_heap_fragmentation.png)
-Memory fragmentation could be reduced by tuning GC parameters as described in [this post by Nate Berkopec](https://www.speedshop.co/2017/12/04/malloc-doubles-ruby-memory.html). This should be considered as a tradeoff, as it may affect overall performance of memory allocation and GC cycles.
+Memory fragmentation could be reduced by tuning GC parameters [as described in this post](https://www.speedshop.co/2017/12/04/malloc-doubles-ruby-memory.html). This should be considered as a tradeoff, as it may affect overall performance of memory allocation and GC cycles.
## Importance of Changes
diff --git a/doc/development/pipelines.md b/doc/development/pipelines.md
index 4d931899da6..64ee12e9550 100644
--- a/doc/development/pipelines.md
+++ b/doc/development/pipelines.md
@@ -19,7 +19,7 @@ as much as possible.
## Overview
-Pipelines for the GitLab project are created using the [`workflow:rules` keyword](../ci/yaml/README.md#workflowrules)
+Pipelines for the GitLab project are created using the [`workflow:rules` keyword](../ci/yaml/README.md#workflow)
feature of the GitLab CI/CD.
Pipelines are always created for the following scenarios:
@@ -29,7 +29,7 @@ Pipelines are always created for the following scenarios:
- Tags.
- Stable, `auto-deploy`, and security branches.
-Pipeline creation is also affected by the following CI variables:
+Pipeline creation is also affected by the following CI/CD variables:
- If `$FORCE_GITLAB_CI` is set, pipelines are created.
- If `$GITLAB_INTERNAL` is not set, pipelines are not created.
@@ -414,10 +414,10 @@ The `rspec fail-fast` is a no-op if there are more than 10 test files related to
Merge Request. This prevents `rspec fail-fast` duration from exceeding the average
`rspec` job duration and defeating its purpose.
-This number can be overridden by setting a CI variable named `RSPEC_FAIL_FAST_TEST_FILE_COUNT_THRESHOLD`.
+This number can be overridden by setting a CI/CD variable named `RSPEC_FAIL_FAST_TEST_FILE_COUNT_THRESHOLD`.
NOTE:
-This experiment is only enabled when the CI variable `RSPEC_FAIL_FAST_ENABLED=true` is set.
+This experiment is only enabled when the CI/CD variable `RSPEC_FAIL_FAST_ENABLED=true` is set.
#### Determining related test files in a Merge Request
@@ -426,7 +426,7 @@ We are using a custom mapping between source file to test files, maintained in t
### PostgreSQL versions testing
-Even though [Omnibus defaults to PG12 for new installs and upgrades](https://docs.gitlab.com/omnibus/package-information/postgresql_versions.md),
+Even though [Omnibus defaults to PG12 for new installs and upgrades](https://docs.gitlab.com/omnibus/package-information/postgresql_versions.html),
our test suite is currently running against PG11, since GitLab.com still runs on PG11.
We do run our test suite against PG12 on nightly scheduled pipelines as well as upon specific
@@ -531,8 +531,7 @@ several reasons:
The pre-clone step works by using the `CI_PRE_CLONE_SCRIPT` variable
[defined by GitLab.com shared runners](../user/gitlab_com/index.md#pre-clone-script).
-The `CI_PRE_CLONE_SCRIPT` is currently defined as a project CI/CD
-variable:
+The `CI_PRE_CLONE_SCRIPT` is currently defined as a project CI/CD variable:
```shell
echo "Downloading archived master..."
@@ -638,7 +637,7 @@ Some of the jobs are using images from Docker Hub, where we also use
`${GITLAB_DEPENDENCY_PROXY}` as a prefix to the image path, so that we pull
images from our [Dependency Proxy](../user/packages/dependency_proxy/index.md).
-`${GITLAB_DEPENDENCY_PROXY}` is a group variable defined in
+`${GITLAB_DEPENDENCY_PROXY}` is a group CI/CD variable defined in
[`gitlab-org`](https://gitlab.com/gitlab-org) as
`${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/`. This means when we use an image
defined as:
@@ -653,7 +652,7 @@ Docker Hub unless `${GITLAB_DEPENDENCY_PROXY}` is also defined there.
### Default variables
-In addition to the [predefined variables](../ci/variables/predefined_variables.md),
+In addition to the [predefined CI/CD variables](../ci/variables/predefined_variables.md),
each pipeline includes default variables defined in
[`.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/blob/master/.gitlab-ci.yml).
@@ -679,7 +678,7 @@ that are scoped to a single [configuration keyword](../ci/yaml/README.md#job-key
| `.use-pg12` | Allows a job to use the `postgres:12` and `redis:4.0-alpine` services. |
| `.use-pg12-ee` | Same as `.use-pg12` but also use the `docker.elastic.co/elasticsearch/elasticsearch:7.9.2` services. |
| `.use-kaniko` | Allows a job to use the `kaniko` tool to build Docker images. |
-| `.as-if-foss` | Simulate the FOSS project by setting the `FOSS_ONLY='1'` environment variable. |
+| `.as-if-foss` | Simulate the FOSS project by setting the `FOSS_ONLY='1'` CI/CD variable. |
| `.use-docker-in-docker` | Allows a job to use Docker in Docker. |
### `rules`, `if:` conditions and `changes:` patterns
@@ -704,13 +703,13 @@ and included in `rules` definitions via [YAML anchors](../ci/yaml/README.md#anch
| `if-not-canonical-namespace` | Matches if the project isn't in the canonical (`gitlab-org/`) or security (`gitlab-org/security`) namespace. | Use to create a job for forks (by using `when: on_success|manual`), or **not** create a job for forks (by using `when: never`). |
| `if-not-ee` | Matches if the project isn't EE (i.e. project name isn't `gitlab` or `gitlab-ee`). | Use to create a job only in the FOSS project (by using `when: on_success|manual`), or **not** create a job if the project is EE (by using `when: never`). |
| `if-not-foss` | Matches if the project isn't FOSS (i.e. project name isn't `gitlab-foss`, `gitlab-ce`, or `gitlabhq`). | Use to create a job only in the EE project (by using `when: on_success|manual`), or **not** create a job if the project is FOSS (by using `when: never`). |
-| `if-default-refs` | Matches if the pipeline is for `master`, `/^[\d-]+-stable(-ee)?$/` (stable branches), `/^\d+-\d+-auto-deploy-\d+$/` (auto-deploy branches), `/^security\//` (security branches), merge requests, and tags. | Note that jobs aren't created for branches with this default configuration. |
-| `if-master-refs` | Matches if the current branch is `master`. | |
-| `if-master-push` | Matches if the current branch is `master` and pipeline source is `push`. | |
-| `if-master-schedule-2-hourly` | Matches if the current branch is `master` and pipeline runs on a 2-hourly schedule. | |
-| `if-master-schedule-nightly` | Matches if the current branch is `master` and pipeline runs on a nightly schedule. | |
+| `if-default-refs` | Matches if the pipeline is for `master`, `main`, `/^[\d-]+-stable(-ee)?$/` (stable branches), `/^\d+-\d+-auto-deploy-\d+$/` (auto-deploy branches), `/^security\//` (security branches), merge requests, and tags. | Note that jobs aren't created for branches with this default configuration. |
+| `if-master-refs` | Matches if the current branch is `master` or `main`. | |
+| `if-master-push` | Matches if the current branch is `master` or `main` and pipeline source is `push`. | |
+| `if-master-schedule-2-hourly` | Matches if the current branch is `master` or `main` and pipeline runs on a 2-hourly schedule. | |
+| `if-master-schedule-nightly` | Matches if the current branch is `master` or `main` and pipeline runs on a nightly schedule. | |
| `if-auto-deploy-branches` | Matches if the current branch is an auto-deploy one. | |
-| `if-master-or-tag` | Matches if the pipeline is for the `master` branch or for a tag. | |
+| `if-master-or-tag` | Matches if the pipeline is for the `master` or `main` branch or for a tag. | |
| `if-merge-request` | Matches if the pipeline is for a merge request. | |
| `if-merge-request-title-as-if-foss` | Matches if the pipeline is for a merge request and the MR title includes "RUN AS-IF-FOSS". | |
| `if-merge-request-title-update-caches` | Matches if the pipeline is for a merge request and the MR title includes "UPDATE CACHE". | |
@@ -719,14 +718,14 @@ and included in `rules` definitions via [YAML anchors](../ci/yaml/README.md#anch
| `if-security-schedule` | Matches if the pipeline is for a security scheduled pipeline. | |
| `if-nightly-master-schedule` | Matches if the pipeline is for a `master` scheduled pipeline with `$NIGHTLY` set. | |
| `if-dot-com-gitlab-org-schedule` | Limits jobs creation to scheduled pipelines for the `gitlab-org` group on GitLab.com. | |
-| `if-dot-com-gitlab-org-master` | Limits jobs creation to the `master` branch for the `gitlab-org` group on GitLab.com. | |
+| `if-dot-com-gitlab-org-master` | Limits jobs creation to the `master` or `main` branch for the `gitlab-org` group on GitLab.com. | |
| `if-dot-com-gitlab-org-merge-request` | Limits jobs creation to merge requests for the `gitlab-org` group on GitLab.com. | |
| `if-dot-com-gitlab-org-and-security-tag` | Limits job creation to tags for the `gitlab-org` and `gitlab-org/security` groups on GitLab.com. | |
| `if-dot-com-gitlab-org-and-security-merge-request` | Limit jobs creation to merge requests for the `gitlab-org` and `gitlab-org/security` groups on GitLab.com. | |
| `if-dot-com-gitlab-org-and-security-tag` | Limit jobs creation to tags for the `gitlab-org` and `gitlab-org/security` groups on GitLab.com. | |
| `if-dot-com-ee-schedule` | Limits jobs to scheduled pipelines for the `gitlab-org/gitlab` project on GitLab.com. | |
| `if-cache-credentials-schedule` | Limits jobs to scheduled pipelines with the `$CI_REPO_CACHE_CREDENTIALS` variable set. | |
-| `if-rspec-fail-fast-disabled` | Limits jobs to pipelines with `$RSPEC_FAIL_FAST_ENABLED` variable not set to `"true"`. | |
+| `if-rspec-fail-fast-disabled` | Limits jobs to pipelines with `$RSPEC_FAIL_FAST_ENABLED` CI/CD variable not set to `"true"`. | |
| `if-rspec-fail-fast-skipped` | Matches if the pipeline is for a merge request and the MR title includes "SKIP RSPEC FAIL-FAST". | |
| `if-security-pipeline-merge-result` | Matches if the pipeline is for a security merge request triggered by `@gitlab-release-tools-bot`. | |
diff --git a/doc/development/product_analytics/usage_ping.md b/doc/development/product_analytics/usage_ping.md
index 79075157ce4..43acf5b7e3f 100644
--- a/doc/development/product_analytics/usage_ping.md
+++ b/doc/development/product_analytics/usage_ping.md
@@ -1,8 +1,8 @@
---
-redirect_to: '../usage_ping.md'
+redirect_to: '../usage_ping/index.md'
---
-This document was moved to [another location](../usage_ping.md).
+This document was moved to [another location](../usage_ping/index.md).
<!-- This redirect file can be deleted after April 1, 2021. -->
<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/development/prometheus.md b/doc/development/prometheus.md
deleted file mode 100644
index 62f30871f54..00000000000
--- a/doc/development/prometheus.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-redirect_to: '../user/project/integrations/prometheus.md'
----
-
-This document was moved to [another location](../user/project/integrations/prometheus.md).
-
-<!-- This redirect file can be deleted after February 1, 2021. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/development/query_performance.md b/doc/development/query_performance.md
index 3cb1b10c417..87e26cf42df 100644
--- a/doc/development/query_performance.md
+++ b/doc/development/query_performance.md
@@ -21,11 +21,11 @@ When you are optimizing your SQL queries, there are two dimensions to pay attent
| Queries in a migration | `100ms` | This is different than the total [migration time](database_review.md#timing-guidelines-for-migrations). |
| Concurrent operations in a migration | `5min` | Concurrent operations do not block the database, but they block the GitLab update. This includes operations such as `add_concurrent_index` and `add_concurrent_foreign_key`. |
| Background migrations | `1s` | |
-| Usage Ping | `1s` | See the [usage ping docs](usage_ping.md#developing-and-testing-usage-ping) for more details. |
+| Usage Ping | `1s` | See the [usage ping docs](usage_ping/index.md#developing-and-testing-usage-ping) for more details. |
- When analyzing your query's performance, pay attention to if the time you are seeing is on a [cold or warm cache](#cold-and-warm-cache). These guidelines apply for both cache types.
- When working with batched queries, change the range and batch size to see how it effects the query timing and caching.
-- If an existing query is already underperforming, make an effort to improve it. If it is too complex or would stall development, create a follow-up so it can be addressed in a timely manner. You can always ask the database reviewer or maintainer for help and guidance.
+- If an existing query is not performing well, make an effort to improve it. If it is too complex or would stall development, create a follow-up so it can be addressed in a timely manner. You can always ask the database reviewer or maintainer for help and guidance.
## Cold and warm cache
diff --git a/doc/development/rake_tasks.md b/doc/development/rake_tasks.md
index 13bb39a4a6c..98b386497df 100644
--- a/doc/development/rake_tasks.md
+++ b/doc/development/rake_tasks.md
@@ -340,3 +340,7 @@ bundle exec rake gitlab:graphql:schema:dump
```
This uses GraphQL Ruby's built-in Rake tasks to generate files in both [IDL](https://www.prisma.io/blog/graphql-sdl-schema-definition-language-6755bcb9ce51) and JSON formats.
+
+### Update documentation and schema definitions
+
+The following command combines the intent of [Update GraphQL documentation and schema definitions](#update-graphql-documentation-and-schema-definitions) and [Update machine-readable schema files](#update-machine-readable-schema-files):
diff --git a/doc/development/redis.md b/doc/development/redis.md
index 9f90c5ee760..c7111db0cdc 100644
--- a/doc/development/redis.md
+++ b/doc/development/redis.md
@@ -120,14 +120,13 @@ This shows commands that have taken a long time and may be a performance
concern.
The
-[fluent-plugin-redis-slowlog](https://gitlab.com/gitlab-org/fluent-plugin-redis-slowlog)
-project is responsible for taking the slowlog entries from Redis and
-passing to fluentd (and ultimately Elasticsearch).
+[`fluent-plugin-redis-slowlog`](https://gitlab.com/gitlab-org/fluent-plugin-redis-slowlog)
+project is responsible for taking the `slowlog` entries from Redis and
+passing to Fluentd (and ultimately Elasticsearch).
## Analyzing the entire keyspace
-The [Redis Keyspace
-Analyzer](https://gitlab.com/gitlab-com/gl-infra/redis-keyspace-analyzer)
+The [Redis Keyspace Analyzer](https://gitlab.com/gitlab-com/gl-infra/redis-keyspace-analyzer)
project contains tools for dumping the full key list and memory usage of a Redis
instance, and then analyzing those lists while eliminating potentially sensitive
data from the results. It can be used to find the most frequent key patterns, or
diff --git a/doc/development/secure_coding_guidelines.md b/doc/development/secure_coding_guidelines.md
index 41a7defbc26..e9c95a14236 100644
--- a/doc/development/secure_coding_guidelines.md
+++ b/doc/development/secure_coding_guidelines.md
@@ -195,7 +195,7 @@ Go's [`regexp`](https://golang.org/pkg/regexp/) package uses `re2` and isn't vul
- [Rubular](https://rubular.com/) is a nice online tool to fiddle with Ruby Regexps.
- [Runaway Regular Expressions](https://www.regular-expressions.info/catastrophic.html)
- [The impact of regular expression denial of service (ReDoS) in practice: an empirical study at the ecosystem scale](https://people.cs.vt.edu/~davisjam/downloads/publications/DavisCoghlanServantLee-EcosystemREDOS-ESECFSE18.pdf). This research paper discusses approaches to automatically detect ReDoS vulnerabilities.
-- [Freezing the web: A study of redos vulnerabilities in JavaScript-based web servers](https://www.usenix.org/system/files/conference/usenixsecurity18/sec18-staicu.pdf). Another research paper about detecting ReDoS vulnerabilities.
+- [Freezing the web: A study of ReDoS vulnerabilities in JavaScript-based web servers](https://www.usenix.org/system/files/conference/usenixsecurity18/sec18-staicu.pdf). Another research paper about detecting ReDoS vulnerabilities.
## Server Side Request Forgery (SSRF)
diff --git a/doc/development/service_measurement.md b/doc/development/service_measurement.md
index 91fb8248db4..895ac540838 100644
--- a/doc/development/service_measurement.md
+++ b/doc/development/service_measurement.md
@@ -75,7 +75,7 @@ To actually use it, you need to enable measuring for the desired service by enab
### Enabling measurement using feature flags
In the following example, the `:gitlab_service_measuring_projects_import_service`
-[feature flag](feature_flags/development.md#enabling-a-feature-flag-locally-in-development) is used to enable the measuring feature
+[feature flag](feature_flags/index.md#enabling-a-feature-flag-locally-in-development) is used to enable the measuring feature
for `Projects::ImportService`.
From ChatOps:
diff --git a/doc/development/sidekiq_style_guide.md b/doc/development/sidekiq_style_guide.md
index ce00934b35c..cff199c8b1d 100644
--- a/doc/development/sidekiq_style_guide.md
+++ b/doc/development/sidekiq_style_guide.md
@@ -588,7 +588,7 @@ the `.with_route` scope defined on all `Routable`s.
### Cron workers
-The context is automatically cleared for workers in the Cronjob queue
+The context is automatically cleared for workers in the cronjob queue
(`include CronjobQueue`), even when scheduling them from
requests. We do this to avoid incorrect metadata when other jobs are
scheduled from the cron worker.
diff --git a/doc/development/snowplow.md b/doc/development/snowplow.md
index a56e85ba50d..f5689068654 100644
--- a/doc/development/snowplow.md
+++ b/doc/development/snowplow.md
@@ -11,7 +11,7 @@ This guide provides an overview of how Snowplow works, and implementation detail
For more information about Product Intelligence, see:
- [Product Intelligence Guide](https://about.gitlab.com/handbook/product/product-intelligence-guide/)
-- [Usage Ping Guide](usage_ping.md)
+- [Usage Ping Guide](usage_ping/index.md)
More useful links:
@@ -358,6 +358,7 @@ There are several tools for developing and testing Snowplow Event
1. For frontend events, in the MR description section, add a screenshot of the event's relevant section using the [Snowplow Analytics Debugger](https://chrome.google.com/webstore/detail/snowplow-analytics-debugg/jbnlcgeengmijcghameodeaenefieedm) Chrome browser extension.
1. For backend events, please use Snowplow Micro and add the output of the Snowplow Micro good events `GET http://localhost:9090/micro/good`.
+1. Include a member of the Product Intelligence team as a reviewer of your MR. Mention `@gitlab-org/growth/product_intelligence/engineers` in your MR to request a review.
### Snowplow Analytics Debugger Chrome Extension
@@ -484,9 +485,9 @@ For GitLab.com, we're setting up a [QA and Testing environment](https://gitlab.c
### `gitlab_standard`
-We are currently working towards 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/) with every event. See [Standardize Snowplow Schema](https://gitlab.com/groups/gitlab-org/-/epics/5218) for details.
-The [`StandardContext`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/tracking/standard_context.rb) class represents this schema in the application.
+The [`StandardContext`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/tracking/standard_context.rb) class represents this schema in the application.
| Field Name | Required | Type | Description |
|----------------|---------------------|-----------------------|---------------------------------------------------------------------------------------------|
diff --git a/doc/development/sql.md b/doc/development/sql.md
index f68ca44efa8..8726c1331e8 100644
--- a/doc/development/sql.md
+++ b/doc/development/sql.md
@@ -12,13 +12,13 @@ either using ActiveRecord/Arel or raw SQL queries.
## Using LIKE Statements
The most common way to search for data is using the `LIKE` statement. For
-example, to get all issues with a title starting with "WIP:" you'd write the
+example, to get all issues with a title starting with "Draft:" you'd write the
following query:
```sql
SELECT *
FROM issues
-WHERE title LIKE 'WIP:%';
+WHERE title LIKE 'Draft:%';
```
On PostgreSQL the `LIKE` statement is case-sensitive. To perform a case-insensitive
@@ -28,13 +28,13 @@ To handle this automatically you should use `LIKE` queries using Arel instead
of raw SQL fragments, as Arel automatically uses `ILIKE` on PostgreSQL.
```ruby
-Issue.where('title LIKE ?', 'WIP:%')
+Issue.where('title LIKE ?', 'Draft:%')
```
You'd write this instead:
```ruby
-Issue.where(Issue.arel_table[:title].matches('WIP:%'))
+Issue.where(Issue.arel_table[:title].matches('Draft:%'))
```
Here `matches` generates the correct `LIKE` / `ILIKE` statement depending on the
@@ -45,7 +45,7 @@ If you need to chain multiple `OR` conditions you can also do this using Arel:
```ruby
table = Issue.arel_table
-Issue.where(table[:title].matches('WIP:%').or(table[:foo].matches('WIP:%')))
+Issue.where(table[:title].matches('Draft:%').or(table[:foo].matches('Draft:%')))
```
On PostgreSQL, this produces:
@@ -53,7 +53,7 @@ On PostgreSQL, this produces:
```sql
SELECT *
FROM issues
-WHERE (title ILIKE 'WIP:%' OR foo ILIKE 'WIP:%')
+WHERE (title ILIKE 'Draft:%' OR foo ILIKE 'Draft:%')
```
## LIKE & Indexes
@@ -64,7 +64,7 @@ the start. For example, this will not use any indexes:
```sql
SELECT *
FROM issues
-WHERE title ILIKE '%WIP:%';
+WHERE title ILIKE '%Draft:%';
```
Because the value for `ILIKE` starts with a wildcard the database is not able to
diff --git a/doc/development/testing_guide/best_practices.md b/doc/development/testing_guide/best_practices.md
index 79ff46ae352..ee8401e08d4 100644
--- a/doc/development/testing_guide/best_practices.md
+++ b/doc/development/testing_guide/best_practices.md
@@ -168,7 +168,7 @@ can be used:
```ruby
RSpec.describe API::Search, factory_default: :keep do
- let_it_be(:namespace) { create_default(:namespace) }
+ let_it_be(:namespace) { create_default(:namespace).freeze }
```
Then every project we create uses this `namespace`, without us having to pass
@@ -176,13 +176,17 @@ it as `namespace: namespace`. In order to make it work along with `let_it_be`, `
must be explicitly specified. That keeps the default factory for every example in a suite instead of
recreating it for each example.
+Objects created inside a `factory_default: :keep`, and using
+`create_default` inside a `let_it_be` should be frozen to prevent accidental reliance
+between test examples.
+
Maybe we don't need to create 208 different projects - we
can create one and reuse it. In addition, we can see that only about 1/3 of the
projects we create are ones we ask for (76/208). There is benefit in setting
a default value for projects as well:
```ruby
- let_it_be(:project) { create_default(:project) }
+ let_it_be(:project) { create_default(:project).freeze }
```
In this case, the `total time` and `top-level time` numbers match more closely:
@@ -541,7 +545,7 @@ end
### Feature flags in tests
-This section was moved to [developing with feature flags](../feature_flags/development.md).
+This section was moved to [developing with feature flags](../feature_flags/index.md).
### Pristine test environments
@@ -796,10 +800,11 @@ end
```
WARNING:
-Only use simple values as input in the `where` block. Using procs, stateful
+Only use simple values as input in the `where` block. Using
+<!-- vale gitlab.Spelling = NO --> procs, stateful
objects, FactoryBot-created objects, and similar items can lead to
[unexpected results](https://github.com/tomykaira/rspec-parameterized/issues/8).
-
+<!-- vale gitlab.Spelling = YES -->
### Prometheus tests
Prometheus metrics may be preserved from one test run to another. To ensure that metrics are
@@ -981,6 +986,7 @@ GitLab uses [factory_bot](https://github.com/thoughtbot/factory_bot) as a test f
See [issue #262624](https://gitlab.com/gitlab-org/gitlab/-/issues/262624) for further context.
- Factories don't have to be limited to `ActiveRecord` objects.
[See example](https://gitlab.com/gitlab-org/gitlab-foss/commit/0b8cefd3b2385a21cfed779bd659978c0402766d).
+- Factories and their traits should produce valid objects that are [verified by specs](https://gitlab.com/gitlab-org/gitlab/-/blob/master/spec/factories_spec.rb).
### Fixtures
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 a5a2d2a1113..2b4212a0172 100644
--- a/doc/development/testing_guide/end_to_end/best_practices.md
+++ b/doc/development/testing_guide/end_to_end/best_practices.md
@@ -309,10 +309,10 @@ This action can also unintentionally click other elements, altering the test sta
# Clicking another element to blur an input
def add_issue_to_epic(issue_url)
find_element(:issue_actions_split_button).find('button', text: 'Add an issue').click
- fill_element :add_issue_input, issue_url
+ fill_element(:add_issue_input, issue_url)
# Clicking the title blurs the input
- click_element :title
- click_element :add_issue_button
+ click_element(:title)
+ click_element(:add_issue_button)
end
# Using native mouse click events in the case of a mask/overlay
diff --git a/doc/development/testing_guide/end_to_end/dynamic_element_validation.md b/doc/development/testing_guide/end_to_end/dynamic_element_validation.md
index 1e7f528f6ff..6c504e6fa28 100644
--- a/doc/development/testing_guide/end_to_end/dynamic_element_validation.md
+++ b/doc/development/testing_guide/end_to_end/dynamic_element_validation.md
@@ -39,7 +39,7 @@ appear on the webpage, or the test to navigate away from the page entirely.
Dynamic element validation is instituted when using
```ruby
-click_element :my_element, Some::Page
+click_element(:my_element, Some::Page)
```
### Required Elements
@@ -79,7 +79,7 @@ class MyPage < Page::Base
end
def open_layer
- click_element :my_element, Layer::MyLayer
+ click_element(:my_element, Layer::MyLayer)
end
end
@@ -109,7 +109,7 @@ Given the [source](#examples) ...
```ruby
def open_layer
- click_element :my_element, Layer::MyLayer
+ click_element(:my_element, Layer::MyLayer)
end
```
diff --git a/doc/development/testing_guide/end_to_end/environment_selection.md b/doc/development/testing_guide/end_to_end/environment_selection.md
index 7e34b6c265d..bcdf0e104dd 100644
--- a/doc/development/testing_guide/end_to_end/environment_selection.md
+++ b/doc/development/testing_guide/end_to_end/environment_selection.md
@@ -58,7 +58,7 @@ end
If the test has a `before` or `after`, you must add the `only` metadata
to the outer `RSpec.describe`.
-If you want to run an `only: { :pipeline }` tagged test on your local GDK make sure either the `CI_PROJECT_NAME` environment variable is unset, or that the `CI_PROJECT_NAME` environment variable matches the specified pipeline in the `only: { :pipeline }` tag, or just delete the `only: { :pipeline }` tag.
+If you want to run an `only: { :pipeline }` tagged test on your local GDK make sure either the `CI_PROJECT_NAME` CI/CD variable is unset, or that the `CI_PROJECT_NAME` variable matches the specified pipeline in the `only: { :pipeline }` tag, or just delete the `only: { :pipeline }` tag.
## Quarantining a test for a specific environment
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 1bc33b79c7c..e3719393d41 100644
--- a/doc/development/testing_guide/end_to_end/feature_flags.md
+++ b/doc/development/testing_guide/end_to_end/feature_flags.md
@@ -18,8 +18,8 @@ Please be sure to include the tag `:requires_admin` so that the test can be skip
where admin access is not available.
WARNING:
-You are strongly advised to [enable feature flags only for a group, project, user](../../feature_flags/development.md#feature-actors),
-or [feature group](../../feature_flags/development.md#feature-groups). This makes it possible to
+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.
For example, the code below would enable a feature flag named `:feature_flag_name` for the project
diff --git a/doc/development/testing_guide/end_to_end/page_objects.md b/doc/development/testing_guide/end_to_end/page_objects.md
index d9309f74e0e..b124ac430f6 100644
--- a/doc/development/testing_guide/end_to_end/page_objects.md
+++ b/doc/development/testing_guide/end_to_end/page_objects.md
@@ -201,7 +201,7 @@ We can select on that specific issue by matching on the Rails model.
```ruby
class Page::Project::Issues::Index < Page::Base
def has_issue?(issue)
- has_element? :issue, issue_title: issue
+ has_element?(:issue, issue_title: issue)
end
end
```
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 b6293ec41b8..ea48a3aa8b8 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
@@ -151,7 +151,7 @@ To run the Monitor tests locally, against the GDK, please follow the preparation
1. The test setup deploys the app in a Kubernetes cluster, using the Auto DevOps deployment strategy.
To enable Auto DevOps in GDK, follow the [associated setup](https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/master/doc/howto/auto_devops/index.md#setup) instructions. If you have problems, review the [troubleshooting guide](https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/master/doc/howto/auto_devops/tips_and_troubleshooting.md) or reach out to the `#gdk` channel in the internal GitLab Slack.
1. Do [secure your GitLab instance](https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/master/doc/howto/auto_devops/index.md#secure-your-gitlab-instance) since it is now publicly accessible on `https://[YOUR-PORT].qa-tunnel.gitlab.info`.
-1. Install the Kubernetes command line tool known as `kubectl`. Use the [official installation instructions](https://kubernetes.io/docs/tasks/tools/install-kubectl/).
+1. Install the Kubernetes command line tool known as `kubectl`. Use the [official installation instructions](https://kubernetes.io/docs/tasks/tools/).
You might see NGINX issues when you run `gdk start` or `gdk restart`. In that case, run `sft login` to revalidate your credentials and regain access the QA Tunnel.
diff --git a/doc/development/testing_guide/end_to_end/style_guide.md b/doc/development/testing_guide/end_to_end/style_guide.md
index ac4d26df794..f9c13d5dd67 100644
--- a/doc/development/testing_guide/end_to_end/style_guide.md
+++ b/doc/development/testing_guide/end_to_end/style_guide.md
@@ -19,7 +19,7 @@ E.g.:
```ruby
def click_ci_cd_pipelines
within_sidebar do
- click_element :link_pipelines
+ click_element(:link_pipelines)
end
end
```
diff --git a/doc/development/testing_guide/frontend_testing.md b/doc/development/testing_guide/frontend_testing.md
index 73fce3a38d7..9facca10142 100644
--- a/doc/development/testing_guide/frontend_testing.md
+++ b/doc/development/testing_guide/frontend_testing.md
@@ -126,7 +126,7 @@ It does not make sense to test our `getFahrenheit` function because underneath i
Let's take a short look into Vue land. Vue is a critical part of the GitLab JavaScript codebase. When writing specs for Vue components, a common gotcha is to actually end up testing Vue provided functionality, because it appears to be the easiest thing to test. Here's an example taken from our codebase.
```javascript
-// Component
+// Component script
{
computed: {
hasMetricTypes() {
@@ -135,27 +135,46 @@ Let's take a short look into Vue land. Vue is a critical part of the GitLab Java
}
```
-and here's the corresponding spec
+```html
+<!-- Component template -->
+<template>
+ <gl-dropdown v-if="hasMetricTypes">
+ <!-- Dropdown content -->
+ </gl-dropdown>
+</template>
+```
+
+Testing the `hasMetricTypes` computed prop would seem like a given here. But to test if the computed property is returning the length of `metricTypes`, is testing the Vue library itself. There is no value in this, besides it adding to the test suite. It's better to test a component in the way the user interacts with it: checking the rendered template.
```javascript
- describe('computed', () => {
- describe('hasMetricTypes', () => {
- it('returns true if metricTypes exist', () => {
- factory({ metricTypes });
- expect(wrapper.vm.hasMetricTypes).toBe(2);
- });
-
- it('returns true if no metricTypes exist', () => {
- factory();
- expect(wrapper.vm.hasMetricTypes).toBe(0);
- });
+// Bad
+describe('computed', () => {
+ describe('hasMetricTypes', () => {
+ it('returns true if metricTypes exist', () => {
+ factory({ metricTypes });
+ expect(wrapper.vm.hasMetricTypes).toBe(2);
+ });
+
+ it('returns true if no metricTypes exist', () => {
+ factory();
+ expect(wrapper.vm.hasMetricTypes).toBe(0);
});
+ });
});
-```
-Testing the `hasMetricTypes` computed prop would seem like a given, but to test if the computed property is returning the length of `metricTypes`, is testing the Vue library itself. There is no value in this, besides it adding to the test suite. Better is to test it in the way the user interacts with it. Probably through the template.
+// Good
+it('displays a dropdown if metricTypes exist', () => {
+ factory({ metricTypes });
+ expect(wrapper.findComponent(GlDropdown).exists()).toBe(true);
+});
+
+it('does not display a dropdown if no metricTypes exist', () => {
+ factory();
+ expect(wrapper.findComponent(GlDropdown).exists()).toBe(false);
+});
+```
-Keep an eye out for these kinds of tests, as they just make updating logic more fragile and tedious than it needs to be. This is also true for other libraries.
+Keep an eye out for these kinds of tests, as they just make updating logic more fragile and tedious than it needs to be. This is also true for other libraries. A rule of thumb here is: if you are checking a `wrapper.vm` property, you should probably stop and rethink the test to check the rendered template instead.
Some more examples can be found in the [Frontend unit tests section](testing_levels.md#frontend-unit-tests)
@@ -193,7 +212,7 @@ When it comes to querying DOM elements in your tests, it is best to uniquely and
the element.
Preferentially, this is done by targeting what the user actually sees using [DOM Testing Library](https://testing-library.com/docs/dom-testing-library/intro/).
-When selecting by text it is best to use [`getByRole` or `findByRole`](https://testing-library.com/docs/dom-testing-library/api-queries/#byrole)
+When selecting by text it is best to use [`getByRole` or `findByRole`](https://testing-library.com/docs/queries/byrole/)
as these enforce accessibility best practices as well. The examples below demonstrate the order of preference.
When writing Vue component unit tests, it can be wise to query children by component, so that the unit test can focus on comprehensive value coverage
@@ -539,21 +558,6 @@ When looking at this initially you'd suspect that the component is setup before
This is however not entirely true as the `destroy` method does not remove everything which has been mutated on the `wrapper` object. For functional components, destroy only removes the rendered DOM elements from the document.
-In order to ensure that a clean wrapper object and DOM are being used in each test, the breakdown of the component should rather be performed as follows:
-
-```javascript
- afterEach(() => {
- wrapper.destroy();
- wrapper = null;
- });
-```
-
-<!-- vale gitlab.Spelling = NO -->
-
-See also the [Vue Test Utils documentation on `destroy`](https://vue-test-utils.vuejs.org/api/wrapper/#destroy).
-
-<!-- vale gitlab.Spelling = YES -->
-
### Jest best practices
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/34209) in GitLab 13.2.
@@ -687,7 +691,7 @@ Similarly, if you really need to use the real `Date` class, then you can import
```javascript
import { useRealDate } from 'helpers/fake_date';
-// NOTE: `useRealDate` cannot be called during test execution (i.e. inside `it`, `beforeEach`, `beforeAll`, etc.).
+// NOTE: `useRealDate` cannot be called during test execution (i.e. inside `it`, `beforeEach`, `beforeAll`, etc.).
describe('with real date', () => {
useRealDate();
});
@@ -1034,7 +1038,7 @@ describe "Admin::AbuseReports", :js do
end
```
-### Jest test timeout due to async imports
+### Jest test timeout due to asynchronous imports
If a module asynchronously imports some other modules at runtime, these modules must be
transpiled by the Jest loaders at runtime. It's possible that this can cause [Jest to timeout](https://gitlab.com/gitlab-org/gitlab/-/issues/280809).
@@ -1183,6 +1187,95 @@ You can download any older version of Firefox from the releases FTP server, <htt
1. Open up a terminal and run `/Applications/Firefox_Old.app/Contents/MacOS/firefox-bin -profilemanager` to create a new profile specific to that Firefox version.
1. Once the profile has been created, quit the app, and run it again like normal. You now have a working older Firefox version.
+## Snapshots
+
+By now you've probably heard of [Jest snapshot tests](https://jestjs.io/docs/en/snapshot-testing) and why they are useful for various reasons.
+To use them within GitLab, there are a few guidelines that should be highlighted:
+
+- Treat snapshots as code
+- Don't think of a snapshot file as a Blackbox
+- Care for the output of the snapshot, otherwise, it's not providing any real value. This will usually involve reading the generated snapshot file as you would read any other piece of code
+
+Think of a snapshot test as a simple way to store a raw `String` representation of what you've put into the item being tested. This can be used to evaluate changes in a component, a store, a complex piece of generated output, etc. You can see more in the list below for some recommended `Do's and Don'ts`.
+While snapshot tests can be a very powerful tool. They are meant to supplement, not to replace unit tests.
+
+Jest provides a great set of docs on [best practices](https://jestjs.io/docs/en/snapshot-testing#best-practices) that we should keep in mind when creating snapshots.
+
+### How does a snapshot work?
+
+A snapshot is purely a stringified version of what you ask to be tested on the lefthand side of the function call. This means any kind of changes you make to the formatting of the string has an impact on the outcome. This process is done by leveraging serializers for an automatic transform step. For Vue this is already taken care of by leveraging the `vue-jest` package, which offers the proper serializer.
+
+Should the outcome of your spec be different from what is in the generated snapshot file, you'll be notified about it by a failing test in your test suite.
+
+Find all the details in Jests official documentation [https://jestjs.io/docs/en/snapshot-testing](https://jestjs.io/docs/en/snapshot-testing)
+
+### How to take a snapshot
+
+```javascript
+it('makes the name look pretty', () => {
+ expect(prettifyName('Homer Simpson')).toMatchSnapshot()
+})
+```
+
+When this test runs the first time a fresh `.snap` file will be created. It will look something like this:
+
+```txt
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`makes the name look pretty`] = `
+Sir Homer Simpson the Third
+`
+```
+
+Now, every time you call this test, the new snapshot will be evaluated against the previously created version. This should highlight the fact that it's important to understand the content of your snapshot file and treat it with care. Snapshots will lose their value if the output of the snapshot is too big or complex to read, this means keeping snapshots isolated to human-readable items that can be either evaluated in a merge request review or are guaranteed to never change.
+The same can be done for `wrappers` or `elements`
+
+```javascript
+it('renders the component correctly', () => {
+ expect(wrapper).toMatchSnapshot()
+ expect(wrapper.element).toMatchSnapshot();
+})
+```
+
+The above test will create two snapshots, what's important is to decide which of the snapshots provide more value for the codebase safety i.e. if one of these snapshots changes, does that highlight a possible un-wanted break in the codebase? This can help catch unexpected changes if something in an underlying dependency changes without our knowledge.
+
+### Pros and Cons
+
+**Pros**
+
+- Speed up the creation of unit tests
+- Easy to maintain
+- Provides a good safety net to protect against accidental breakage of important HTML structures
+
+**Cons**
+
+- Is not a catch-all solution that replaces the work of integration or unit tests
+- No meaningful assertions or expectations within snapshots
+- When carelessly used with [GitLab UI](https://gitlab.com/gitlab-org/gitlab-ui) it can create fragility in tests when the underlying library changes the HTML of a component we are testing
+
+A good guideline to follow: the more complex the component you may want to steer away from just snapshot testing. But that's not to say you can't still snapshot test and test your component as normal.
+
+### When to use
+
+**Use snapshots when**
+
+- to capture a components rendered output
+- to fully or partially match templates
+- to match readable data structures
+- to verify correctly composed native HTML elements
+- as a safety net for critical structures so others don't break it by accident
+- Template heavy component
+- Not a lot of logic in the component
+- Composed of native HTML elements
+
+### When not to use
+
+**Don't use snapshots when**
+
+- To capture large data structures just to have something
+- To just have some kind of test written
+- To capture highly volatile ui elements without stubbing them (Think of GitLab UI version updates)
+
---
[Return to Testing documentation](index.md)
diff --git a/doc/development/testing_guide/review_apps.md b/doc/development/testing_guide/review_apps.md
index f1c74f990cb..c4194be23a4 100644
--- a/doc/development/testing_guide/review_apps.md
+++ b/doc/development/testing_guide/review_apps.md
@@ -109,10 +109,10 @@ subgraph "CNG-mirror pipeline"
### Auto-stopping of Review Apps
Review Apps are automatically stopped 2 days after the last deployment thanks to
-the [Environment auto-stop](../../ci/environments/index.md#environments-auto-stop) feature.
+the [Environment auto-stop](../../ci/environments/index.md#stop-an-environment-after-a-certain-time-period) feature.
If you need your Review App to stay up for a longer time, you can
-[pin its environment](../../ci/environments/index.md#auto-stop-example) or retry the
+[pin its environment](../../ci/environments/index.md#override-a-deployments-scheduled-stop-time) or retry the
`review-deploy` job to update the "latest deployed at" time.
The `review-cleanup` job that automatically runs in scheduled
diff --git a/doc/development/transient/prevention-patterns.md b/doc/development/transient/prevention-patterns.md
index 4c1e4d373e7..2bfd188fd43 100644
--- a/doc/development/transient/prevention-patterns.md
+++ b/doc/development/transient/prevention-patterns.md
@@ -10,7 +10,7 @@ This page will cover architectural patterns and tips for developers to follow to
## Common root causes
-We've noticed a few root causes that come up frequently when addressing transient bugs.
+We've noticed a few root causes that come up frequently when addressing transient bugs.
- Needs better state management in the backend or frontend.
- Frontend code needs improvements.
diff --git a/doc/development/usage_ping.md b/doc/development/usage_ping.md
index 3618d18b1bb..b8f08caaebd 100644
--- a/doc/development/usage_ping.md
+++ b/doc/development/usage_ping.md
@@ -1,1188 +1,7 @@
---
-stage: Growth
-group: Product Intelligence
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+redirect_to: 'usage_ping/index.md'
---
-# Usage Ping Guide
-
-> Introduced in GitLab Ultimate 11.2, more statistics.
-
-This guide describes Usage Ping's purpose and how it's implemented.
-
-For more information about Product Intelligence, see:
-
-- [Product Intelligence Guide](https://about.gitlab.com/handbook/product/product-intelligence-guide/)
-- [Snowplow Guide](snowplow.md)
-
-More useful links:
-
-- [Product Intelligence Direction](https://about.gitlab.com/direction/product-intelligence/)
-- [Data Analysis Process](https://about.gitlab.com/handbook/business-ops/data-team/#data-analysis-process/)
-- [Data for Product Managers](https://about.gitlab.com/handbook/business-ops/data-team/programs/data-for-product-managers/)
-- [Data Infrastructure](https://about.gitlab.com/handbook/business-ops/data-team/platform/infrastructure/)
-
-## What is Usage Ping?
-
-- GitLab sends a weekly payload containing usage data to GitLab Inc. Usage Ping provides high-level data to help our product, support, and sales teams. It does not send any project names, usernames, or any other specific data. The information from the usage ping is not anonymous, it is linked to the hostname of the instance. Sending usage ping is optional, and any instance can disable analytics.
-- The usage data is primarily composed of row counts for different tables in the instance’s database. By comparing these counts month over month (or week over week), we can get a rough sense for how an instance is using the different features within the product. In addition to counts, other facts
- that help us classify and understand GitLab installations are collected.
-- Usage ping is important to GitLab as we use it to calculate our Stage Monthly Active Users (SMAU) which helps us measure the success of our stages and features.
-- While usage ping is enabled, GitLab gathers data from the other instances and can show usage statistics of your instance to your users.
-
-### Why should we enable Usage Ping?
-
-- The main purpose of Usage Ping is to build a better GitLab. Data about how GitLab is used is collected to better understand feature/stage adoption and usage, which helps us understand how GitLab is adding value and helps our team better understand the reasons why people use GitLab and with this knowledge we're able to make better product decisions.
-- As a benefit of having the usage ping active, GitLab lets you analyze the users’ activities over time of your GitLab installation.
-- As a benefit of having the usage ping active, GitLab provides you with The DevOps Report,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.
-- Usage Ping is enabled by default. To disable it, see [Disable Usage Ping](#disable-usage-ping).
-
-### Limitations
-
-- Usage Ping does not track frontend events things like page views, link clicks, or user sessions, and only focuses on aggregated backend events.
-- Because of these limitations we recommend instrumenting your products with Snowplow for more detailed analytics on GitLab.com and use Usage Ping to track aggregated backend events on self-managed.
-
-## Usage Ping payload
-
-You can view the exact JSON payload sent to GitLab Inc. in the administration panel. To view the payload:
-
-1. Navigate to **Admin Area > Settings > Metrics and profiling**.
-1. Expand the **Usage statistics** section.
-1. Click the **Preview payload** button.
-
-For an example payload, see [Example Usage Ping payload](#example-usage-ping-payload).
-
-## Disable Usage Ping
-
-To disable Usage Ping in the GitLab UI, go to the **Settings** page of your administration panel and uncheck the **Usage Ping** checkbox.
-
-To disable Usage Ping and prevent it from being configured in the future through the administration panel, Omnibus installs can set the following in [`gitlab.rb`](https://docs.gitlab.com/omnibus/settings/configuration.html#configuration-options):
-
-```ruby
-gitlab_rails['usage_ping_enabled'] = false
-```
-
-Source installations can set the following in `gitlab.yml`:
-
-```yaml
-production: &base
- # ...
- gitlab:
- # ...
- usage_ping_enabled: false
-```
-
-## Usage Ping request flow
-
-The following example shows a basic request/response flow between a GitLab instance, the Versions Application, the License Application, Salesforce, the GitLab S3 Bucket, the GitLab Snowflake Data Warehouse, and Sisense:
-
-```mermaid
-sequenceDiagram
- participant GitLab Instance
- participant Versions Application
- participant Licenses Application
- participant Salesforce
- participant S3 Bucket
- participant Snowflake DW
- participant Sisense Dashboards
- GitLab Instance->>Versions Application: Send Usage Ping
- loop Process usage data
- Versions Application->>Versions Application: Parse usage data
- Versions Application->>Versions Application: Write to database
- Versions Application->>Versions Application: Update license ping time
- end
- loop Process data for Salesforce
- Versions Application-xLicenses Application: Request Zuora subscription id
- Licenses Application-xVersions Application: Zuora subscription id
- Versions Application-xSalesforce: Request Zuora account id by Zuora subscription id
- Salesforce-xVersions Application: Zuora account id
- Versions Application-xSalesforce: Usage data for the Zuora account
- end
- Versions Application->>S3 Bucket: Export Versions database
- S3 Bucket->>Snowflake DW: Import data
- Snowflake DW->>Snowflake DW: Transform data using dbt
- Snowflake DW->>Sisense Dashboards: Data available for querying
- Versions Application->>GitLab Instance: DevOps Report (Conversational Development Index)
-```
-
-## How Usage Ping works
-
-1. The Usage Ping [cron job](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/workers/gitlab_usage_ping_worker.rb#L30) is set in Sidekiq to run weekly.
-1. When the cron job runs, it calls [`Gitlab::UsageData.to_json`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/services/submit_usage_ping_service.rb#L22).
-1. `Gitlab::UsageData.to_json` [cascades down](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data.rb#L22) to ~400+ other counter method calls.
-1. The response of all methods calls are [merged together](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data.rb#L14) into a single JSON payload in `Gitlab::UsageData.to_json`.
-1. The JSON payload is then [posted to the Versions application]( https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/services/submit_usage_ping_service.rb#L20)
- If a firewall exception is needed, the required URL depends on several things. If
- the hostname is `version.gitlab.com`, the protocol is `TCP`, and the port number is `443`,
- the required URL is <https://version.gitlab.com/>.
-
-## Usage Ping Metric Life cycle
-
-### 1. New metrics addition
-
-Please follow the [Implementing Usage Ping](#implementing-usage-ping) guide.
-
-### 2. Existing metric change
-
-Because we do not control when customers update their self-managed instances of GitLab,
-we **STRONGLY DISCOURAGE** changes to the logic used to calculate any metric.
-Any such changes lead to inconsistent reports from multiple GitLab instances.
-If there is a problem with an existing metric, it's best to deprecate the existing metric,
-and use it, side by side, with the desired new metric.
-
-Example:
-Consider following change. Before GitLab 12.6, the `example_metric` was implemented as:
-
-```ruby
-{
- ...
- example_metric: distinct_count(Project, :creator_id)
-}
-```
-
-For GitLab 12.6, the metric was changed to filter out archived projects:
-
-```ruby
-{
- ...
- example_metric: distinct_count(Project.non_archived, :creator_id)
-}
-```
-
-In this scenario all instances running up to GitLab 12.5 continue to report `example_metric`,
-including all archived projects, while all instances running GitLab 12.6 and higher filters
-out such projects. As Usage Ping data is collected from all reporting instances, the
-resulting dataset includes mixed data, which distorts any following business analysis.
-
-The correct approach is to add a new metric for GitLab 12.6 release with updated logic:
-
-```ruby
-{
- ...
- example_metric_without_archived: distinct_count(Project.non_archived, :creator_id)
-}
-```
-
-and update existing business analysis artefacts to use `example_metric_without_archived` instead of `example_metric`
-
-### 3. Metrics deprecation and removal
-
-The process for deprecating and removing metrics is currently under development. For
-more information, see the following [issue](https://gitlab.com/gitlab-org/gitlab/-/issues/284637).
-
-## Implementing Usage Ping
-
-Usage Ping consists of two kinds of data, counters and observations. Counters track how often a certain event
-happened over time, such as how many CI pipelines have run. They are monotonic and always trend up.
-Observations are facts collected from one or more GitLab instances and can carry arbitrary data. There are no
-general guidelines around how to collect those, due to the individual nature of that data.
-
-There are several types of counters which are all found in `usage_data.rb`:
-
-- **Ordinary Batch Counters:** Simple count of a given ActiveRecord_Relation
-- **Distinct Batch Counters:** Distinct count of a given ActiveRecord_Relation in a given column
-- **Sum Batch Counters:** Sum the values of a given ActiveRecord_Relation in a given column
-- **Alternative Counters:** Used for settings and configurations
-- **Redis Counters:** Used for in-memory counts.
-
-NOTE:
-Only use the provided counter methods. Each counter method contains a built in fail safe to isolate each counter to avoid breaking the entire Usage Ping.
-
-### Why batch counting
-
-For large tables, PostgreSQL can take a long time to count rows due to MVCC [(Multi-version Concurrency Control)](https://en.wikipedia.org/wiki/Multiversion_concurrency_control). Batch counting is a counting method where a single large query is broken into multiple smaller queries. For example, instead of a single query querying 1,000,000 records, with batch counting, you can execute 100 queries of 10,000 records each. Batch counting is useful for avoiding database timeouts as each batch query is significantly shorter than one single long running query.
-
-For GitLab.com, there are extremely large tables with 15 second query timeouts, so we use batch counting to avoid encountering timeouts. Here are the sizes of some GitLab.com tables:
-
-| Table | Row counts in millions |
-|------------------------------|------------------------|
-| `merge_request_diff_commits` | 2280 |
-| `ci_build_trace_sections` | 1764 |
-| `merge_request_diff_files` | 1082 |
-| `events` | 514 |
-
-We have several batch counting methods available:
-
-- `Ordinary Batch Counters`
-- `Distinct Batch Counters`
-- `Sum Batch Counters`
-- `Estimated Batch Counters`
-
-Batch counting requires indexes on columns to calculate max, min, and range queries. In some cases,
-you may need to add a specialized index on the columns involved in a counter.
-
-### Ordinary Batch Counters
-
-Handles `ActiveRecord::StatementInvalid` error
-
-Simple count of a given ActiveRecord_Relation, does a non-distinct batch count, smartly reduces batch_size and handles errors.
-
-Method: `count(relation, column = nil, batch: true, start: nil, finish: nil)`
-
-Arguments:
-
-- `relation` the ActiveRecord_Relation to perform the count
-- `column` the column to perform the count on, by default is the primary key
-- `batch`: default `true` to use batch counting
-- `start`: custom start of the batch counting to avoid complex min calculations
-- `end`: custom end of the batch counting to avoid complex min calculations
-
-Examples:
-
-```ruby
-count(User.active)
-count(::Clusters::Cluster.aws_installed.enabled, :cluster_id)
-count(::Clusters::Cluster.aws_installed.enabled, :cluster_id, start: ::Clusters::Cluster.minimum(:id), finish: ::Clusters::Cluster.maximum(:id))
-```
-
-### Distinct Batch Counters
-
-Handles `ActiveRecord::StatementInvalid` error
-
-Distinct count of a given ActiveRecord_Relation on given column, a distinct batch count, smartly reduces batch_size and handles errors.
-
-Method: `distinct_count(relation, column = nil, batch: true, batch_size: nil, start: nil, finish: nil)`
-
-Arguments:
-
-- `relation` the ActiveRecord_Relation to perform the count
-- `column` the column to perform the distinct count, by default is the primary key
-- `batch`: default `true` to use batch counting
-- `batch_size`: if none set it uses default value 10000 from `Gitlab::Database::BatchCounter`
-- `start`: custom start of the batch counting to avoid complex min calculations
-- `end`: custom end of the batch counting to avoid complex min calculations
-
-WARNING:
-Counting over non-unique columns can lead to performance issues. Take a look at the [iterating tables in batches](iterating_tables_in_batches.md) guide for more details.
-
-Examples:
-
-```ruby
-distinct_count(::Project, :creator_id)
-distinct_count(::Note.with_suggestions.where(time_period), :author_id, start: ::User.minimum(:id), finish: ::User.maximum(:id))
-distinct_count(::Clusters::Applications::CertManager.where(time_period).available.joins(:cluster), 'clusters.user_id')
-```
-
-### Sum Batch Counters
-
-Handles `ActiveRecord::StatementInvalid` error
-
-Sum the values of a given ActiveRecord_Relation on given column and handles errors.
-
-Method: `sum(relation, column, batch_size: nil, start: nil, finish: nil)`
-
-Arguments:
-
-- `relation` the ActiveRecord_Relation to perform the operation
-- `column` the column to sum on
-- `batch_size`: if none set it uses default value 1000 from `Gitlab::Database::BatchCounter`
-- `start`: custom start of the batch counting to avoid complex min calculations
-- `end`: custom end of the batch counting to avoid complex min calculations
-
-Examples:
-
-```ruby
-sum(JiraImportState.finished, :imported_issues_count)
-```
-
-### Grouping & Batch Operations
-
-The `count`, `distinct_count`, and `sum` batch counters can accept an `ActiveRecord::Relation`
-object, which groups by a specified column. With a grouped relation, the methods do batch counting,
-handle errors, and returns a hash table of key-value pairs.
-
-Examples:
-
-```ruby
-count(Namespace.group(:type))
-# returns => {nil=>179, "Group"=>54}
-
-distinct_count(Project.group(:visibility_level), :creator_id)
-# returns => {0=>1, 10=>1, 20=>11}
-
-sum(Issue.group(:state_id), :weight))
-# returns => {1=>3542, 2=>6820}
-```
-
-### Estimated Batch Counters
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/48233) in GitLab 13.7.
-
-Estimated batch counter functionality handles `ActiveRecord::StatementInvalid` errors
-when used through the provided `estimate_batch_distinct_count` method.
-Errors return a value of `-1`.
-
-WARNING:
-This functionality estimates a distinct count of a specific ActiveRecord_Relation in a given column,
-which uses the [HyperLogLog](http://algo.inria.fr/flajolet/Publications/FlFuGaMe07.pdf) algorithm.
-As the HyperLogLog algorithm is probabilistic, the **results always include error**.
-The highest encountered error rate is 4.9%.
-
-When correctly used, the `estimate_batch_distinct_count` method enables efficient counting over
-columns that contain non-unique values, which can not be assured by other counters.
-
-Method: [`estimate_batch_distinct_count(relation, column = nil, batch_size: nil, start: nil, finish: nil)`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/utils/usage_data.rb#L63)
-
-The method includes the following arguments:
-
-- `relation`: The ActiveRecord_Relation to perform the count.
-- `column`: The column to perform the distinct count. The default is the primary key.
-- `batch_size`: The default is 10,000, from `Gitlab::Database::PostgresHll::BatchDistinctCounter::DEFAULT_BATCH_SIZE`.
-- `start`: The custom start of the batch count, to avoid complex minimum calculations.
-- `finish`: The custom end of the batch count to avoid complex maximum calculations.
-
-The method includes the following prerequisites:
-
-1. The supplied `relation` must include the primary key defined as the numeric column.
- For example: `id bigint NOT NULL`.
-1. The `estimate_batch_distinct_count` can handle a joined relation. To use its ability to
- count non-unique columns, the joined relation **must NOT** have a one-to-many relationship,
- such as `has_many :boards`.
-1. Both `start` and `finish` arguments should always represent primary key relationship values,
- even if the estimated count refers to another column, for example:
-
- ```ruby
- estimate_batch_distinct_count(::Note, :author_id, start: ::Note.minimum(:id), finish: ::Note.maximum(:id))
- ```
-
-Examples:
-
-1. Simple execution of estimated batch counter, with only relation provided,
- returned value represents estimated number of unique values in `id` column
- (which is the primary key) of `Project` relation:
-
- ```ruby
- estimate_batch_distinct_count(::Project)
- ```
-
-1. Execution of estimated batch counter, where provided relation has applied
- additional filter (`.where(time_period)`), number of unique values estimated
- in custom column (`:author_id`), and parameters: `start` and `finish` together
- apply boundaries that defines range of provided relation to analyze:
-
- ```ruby
- estimate_batch_distinct_count(::Note.with_suggestions.where(time_period), :author_id, start: ::Note.minimum(:id), finish: ::Note.maximum(:id))
- ```
-
-1. Execution of estimated batch counter with joined relation (`joins(:cluster)`),
- for a custom column (`'clusters.user_id'`):
-
- ```ruby
- estimate_batch_distinct_count(::Clusters::Applications::CertManager.where(time_period).available.joins(:cluster), 'clusters.user_id')
- ```
-
-When instrumenting metric with usage of estimated batch counter please add
-`_estimated` suffix to its name, for example:
-
-```ruby
- "counts": {
- "ci_builds_estimated": estimate_batch_distinct_count(Ci::Build),
- ...
-```
-
-### Redis Counters
-
-Handles `::Redis::CommandError` and `Gitlab::UsageDataCounters::BaseCounter::UnknownEvent`
-returns -1 when a block is sent or hash with all values -1 when a `counter(Gitlab::UsageDataCounters)` is sent
-different behavior due to 2 different implementations of Redis counter
-
-Method: `redis_usage_data(counter, &block)`
-
-Arguments:
-
-- `counter`: a counter from `Gitlab::UsageDataCounters`, that has `fallback_totals` method implemented
-- or a `block`: which is evaluated
-
-#### Ordinary Redis Counters
-
-Examples of implementation:
-
-- Using Redis methods [`INCR`](https://redis.io/commands/incr), [`GET`](https://redis.io/commands/get), and [`Gitlab::UsageDataCounters::WikiPageCounter`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/wiki_page_counter.rb)
-- Using Redis methods [`HINCRBY`](https://redis.io/commands/hincrby), [`HGETALL`](https://redis.io/commands/hgetall), and [`Gitlab::UsageCounters::PodLogs`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_counters/pod_logs.rb)
-
-##### UsageData API Tracking
-
-<!-- There's nearly identical content in `##### Adding new events`. If you fix errors here, you may need to fix the same errors in the other location. -->
-
-1. Track event using `UsageData` API
-
- Increment event count using ordinary Redis counter, for given event name.
-
- Tracking events using the `UsageData` API requires the `usage_data_api` feature flag to be enabled, which is enabled by default.
-
- API requests are protected by checking for a valid CSRF token.
-
- To be able to increment the values, the related feature `usage_data_<event_name>` should be enabled.
-
- ```plaintext
- POST /usage_data/increment_counter
- ```
-
- | Attribute | Type | Required | Description |
- | :-------- | :--- | :------- | :---------- |
- | `event` | string | yes | The event name it should be tracked |
-
- Response
-
- - `200` if event was tracked
- - `400 Bad request` if event parameter is missing
- - `401 Unauthorized` if user is not authenticated
- - `403 Forbidden` for invalid CSRF token provided
-
-1. Track events using JavaScript/Vue API helper which calls the API above
-
- Note that `usage_data_api` and `usage_data_#{event_name}` should be enabled to be able to track events
-
- ```javascript
- import api from '~/api';
-
- api.trackRedisCounterEvent('my_already_defined_event_name'),
- ```
-
-#### Redis HLL Counters
-
-WARNING:
-HyperLogLog (HLL) is a probabilistic algorithm and its **results always includes some small error**. According to [Redis documentation](https://redis.io/commands/pfcount), data from
-used HLL implementation is "approximated with a standard error of 0.81%".
-
-With `Gitlab::UsageDataCounters::HLLRedisCounter` we have available data structures used to count unique values.
-
-Implemented using Redis methods [PFADD](https://redis.io/commands/pfadd) and [PFCOUNT](https://redis.io/commands/pfcount).
-
-##### Adding new events
-
-1. Define events in [`known_events`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/known_events/).
-
- Example event:
-
- ```yaml
- - name: i_compliance_credential_inventory
- category: compliance
- redis_slot: compliance
- expiry: 42 # 6 weeks
- aggregation: weekly
- ```
-
- Keys:
-
- - `name`: unique event name.
-
- Name format `<prefix>_<redis_slot>_name`.
-
- Use one of the following prefixes for the event's name:
-
- - `g_` for group, as an event which is tracked for group.
- - `p_` for project, as an event which is tracked for project.
- - `i_` for instance, as an event which is tracked for instance.
- - `a_` for events encompassing all `g_`, `p_`, `i_`.
- - `o_` for other.
-
- Consider including in the event's name the Redis slot to be able to count totals for a specific category.
-
- Example names: `i_compliance_credential_inventory`, `g_analytics_contribution`.
-
- - `category`: event category. Used for getting total counts for events in a category, for easier
- access to a group of events.
- - `redis_slot`: optional Redis slot; default value: event name. Used if needed to calculate totals
- for a group of metrics. Ensure keys are in the same slot. For example:
- `i_compliance_credential_inventory` with `redis_slot: 'compliance'` builds Redis key
- `i_{compliance}_credential_inventory-2020-34`. If `redis_slot` is not defined the Redis key will
- be `{i_compliance_credential_inventory}-2020-34`.
- - `expiry`: expiry time in days. Default: 29 days for daily aggregation and 6 weeks for weekly
- aggregation.
- - `aggregation`: may be set to a `:daily` or `:weekly` key. Defines how counting data is stored in Redis.
- Aggregation on a `daily` basis does not pull more fine grained data.
- - `feature_flag`: optional `default_enabled: :yaml`. If no feature flag is set then the tracking is enabled. For details, see our [GitLab internal Feature flags](feature_flags/) documentation. The feature flags are owned by the group adding the event tracking.
-
-Use one of the following methods to track events:
-
-1. Track event in controller using `RedisTracking` module with `track_redis_hll_event(*controller_actions, name:, if: nil)`.
-
- Arguments:
-
- - `controller_actions`: controller actions we want to track.
- - `name`: event name.
- - `if`: optional custom conditions, using the same format as with Rails callbacks.
-
- Example usage:
-
- ```ruby
- # controller
- class ProjectsController < Projects::ApplicationController
- include RedisTracking
-
- skip_before_action :authenticate_user!, only: :show
- track_redis_hll_event :index, :show, name: 'g_compliance_example_feature_visitors'
-
- def index
- render html: 'index'
- end
-
- def new
- render html: 'new'
- end
-
- def show
- render html: 'show'
- end
- end
- ```
-
-1. Track event in API using `increment_unique_values(event_name, values)` helper method.
-
- To be able to track the event, Usage Ping must be enabled and the event feature `usage_data_<event_name>` must be enabled.
-
- Arguments:
-
- - `event_name`: event name.
- - `values`: values counted, one value or array of values.
-
- Example usage:
-
- ```ruby
- get ':id/registry/repositories' do
- repositories = ContainerRepositoriesFinder.new(
- user: current_user, subject: user_group
- ).execute
-
- increment_unique_values('i_list_repositories', current_user.id)
-
- present paginate(repositories), with: Entities::ContainerRegistry::Repository, tags: params[:tags], tags_count: params[:tags_count]
- end
- ```
-
-1. Track event using `track_usage_event(event_name, values) in services and GraphQL
-
- Increment unique values count using Redis HLL, for given event name.
-
- Example:
-
- [Track usage event for incident created in service](https://gitlab.com/gitlab-org/gitlab/-/blob/v13.8.3-ee/app/services/issues/update_service.rb#L66)
-
- [Track usage event for incident created in GraphQL](https://gitlab.com/gitlab-org/gitlab/-/blob/v13.8.3-ee/app/graphql/mutations/alert_management/update_alert_status.rb#L16)
-
- ```ruby
- track_usage_event(:incident_management_incident_created, current_user.id)
- ```
-
-<!-- There's nearly identical content in `##### UsageData API Tracking`. If you find / fix errors here, you may need to fix errors in that section too. -->
-
-1. Track event using `UsageData` API
-
- Increment unique users count using Redis HLL, for given event name.
-
- Tracking events using the `UsageData` API requires the `usage_data_api` feature flag to be enabled, which is enabled by default.
-
- API requests are protected by checking for a valid CSRF token.
-
- To increment the values, the related feature `usage_data_<event_name>` should be
- set to `default_enabled: true`. For more information, see
- [Feature flags in development of GitLab](feature_flags/index.md).
-
- ```plaintext
- POST /usage_data/increment_unique_users
- ```
-
- | Attribute | Type | Required | Description |
- | :-------- | :--- | :------- | :---------- |
- | `event` | string | yes | The event name it should be tracked |
-
- Response
-
- Return 200 if tracking failed for any reason.
-
- - `200` if event was tracked or any errors
- - `400 Bad request` if event parameter is missing
- - `401 Unauthorized` if user is not authenticated
- - `403 Forbidden` for invalid CSRF token provided
-
-1. Track events using JavaScript/Vue API helper which calls the API above
-
- Example usage for an existing event already defined in [known events](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/known_events/):
-
- Usage Data API is behind `usage_data_api` feature flag which, as of GitLab 13.7, is
- now set to `default_enabled: true`.
-
- Each event tracked using Usage Data API is behind a feature flag `usage_data_#{event_name}` which should be `default_enabled: true`
-
- ```javascript
- import api from '~/api';
-
- api.trackRedisHllUserEvent('my_already_defined_event_name'),
- ```
-
-1. Get event data using `Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(event_names:, start_date:, end_date:, context: '')`.
-
- Arguments:
-
- - `event_names`: the list of event names.
- - `start_date`: start date of the period for which we want to get event data.
- - `end_date`: end date of the period for which we want to get event data.
- - `context`: context of the event. Allowed values are `default`, `free`, `bronze`, `silver`, `gold`, `starter`, `premium`, `ultimate`.
-
-1. Testing tracking and getting unique events
-
-Trigger events in rails console by using `track_event` method
-
- ```ruby
- Gitlab::UsageDataCounters::HLLRedisCounter.track_event('g_compliance_audit_events', values: 1)
- Gitlab::UsageDataCounters::HLLRedisCounter.track_event('g_compliance_audit_events', values: [2, 3])
- ```
-
-Next, get the unique events for the current week.
-
- ```ruby
- # Get unique events for metric for current_week
- Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(event_names: 'g_compliance_audit_events',
- start_date: Date.current.beginning_of_week, end_date: Date.current.next_week)
- ```
-
-##### Recommendations
-
-We have the following recommendations for [Adding new events](#adding-new-events):
-
-- Event aggregation: weekly.
-- Key expiry time:
- - Daily: 29 days.
- - Weekly: 42 days.
-- When adding new metrics, use a [feature flag](../operations/feature_flags.md) to control the impact.
-- For feature flags triggered by another service, set `default_enabled: false`,
- - Events can be triggered using the `UsageData` API, which helps when there are > 10 events per change
-
-##### Enable/Disable Redis HLL tracking
-
-Events are tracked behind [feature flags](feature_flags/index.md) due to concerns for Redis performance and scalability.
-
-For a full list of events and corresponding feature flags see, [known_events](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/known_events/) files.
-
-To enable or disable tracking for specific event within <https://gitlab.com> or <https://about.staging.gitlab.com>, run commands such as the following to
-[enable or disable the corresponding feature](feature_flags/index.md).
-
-```shell
-/chatops run feature set <feature_name> true
-/chatops run feature set <feature_name> false
-```
-
-##### Known events are added automatically in usage data payload
-
-All events added in [`known_events/common.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/known_events/common.yml) are automatically added to usage data generation under the `redis_hll_counters` key. This column is stored in [version-app as a JSON](https://gitlab.com/gitlab-services/version-gitlab-com/-/blob/master/db/schema.rb#L209).
-For each event we add metrics for the weekly and monthly time frames, and totals for each where applicable:
-
-- `#{event_name}_weekly`: Data for 7 days for daily [aggregation](#adding-new-events) events and data for the last complete week for weekly [aggregation](#adding-new-events) events.
-- `#{event_name}_monthly`: Data for 28 days for daily [aggregation](#adding-new-events) events and data for the last 4 complete weeks for weekly [aggregation](#adding-new-events) events.
-
-Redis HLL implementation calculates automatic total metrics, if there are more than one metric for the same category, aggregation and Redis slot.
-
-- `#{category}_total_unique_counts_weekly`: Total unique counts for events in the same category for the last 7 days or the last complete week, if events are in the same Redis slot and we have more than one metric.
-- `#{category}_total_unique_counts_monthly`: Total unique counts for events in same category for the last 28 days or the last 4 complete weeks, if events are in the same Redis slot and we have more than one metric.
-
-Example of `redis_hll_counters` data:
-
-```ruby
-{:redis_hll_counters=>
- {"compliance"=>
- {"g_compliance_dashboard_weekly"=>0,
- "g_compliance_dashboard_monthly"=>0,
- "g_compliance_audit_events_weekly"=>0,
- "g_compliance_audit_events_monthly"=>0,
- "compliance_total_unique_counts_weekly"=>0,
- "compliance_total_unique_counts_monthly"=>0},
- "analytics"=>
- {"g_analytics_contribution_weekly"=>0,
- "g_analytics_contribution_monthly"=>0,
- "g_analytics_insights_weekly"=>0,
- "g_analytics_insights_monthly"=>0,
- "analytics_total_unique_counts_weekly"=>0,
- "analytics_total_unique_counts_monthly"=>0},
- "ide_edit"=>
- {"g_edit_by_web_ide_weekly"=>0,
- "g_edit_by_web_ide_monthly"=>0,
- "g_edit_by_sfe_weekly"=>0,
- "g_edit_by_sfe_monthly"=>0,
- "ide_edit_total_unique_counts_weekly"=>0,
- "ide_edit_total_unique_counts_monthly"=>0},
- "search"=>
- {"i_search_total_weekly"=>0, "i_search_total_monthly"=>0, "i_search_advanced_weekly"=>0, "i_search_advanced_monthly"=>0, "i_search_paid_weekly"=>0, "i_search_paid_monthly"=>0, "search_total_unique_counts_weekly"=>0, "search_total_unique_counts_monthly"=>0},
- "source_code"=>{"wiki_action_weekly"=>0, "wiki_action_monthly"=>0}
- }
-```
-
-Example usage:
-
-```ruby
-# Redis Counters
-redis_usage_data(Gitlab::UsageDataCounters::WikiPageCounter)
-redis_usage_data { ::Gitlab::UsageCounters::PodLogs.usage_totals[:total] }
-
-# Define events in common.yml https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/known_events/common.yml
-
-# Tracking events
-Gitlab::UsageDataCounters::HLLRedisCounter.track_event('expand_vulnerabilities', values: visitor_id)
-
-# Get unique events for metric
-redis_usage_data { Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(event_names: 'expand_vulnerabilities', start_date: 28.days.ago, end_date: Date.current) }
-```
-
-### Alternative Counters
-
-Handles `StandardError` and fallbacks into -1 this way not all measures fail if we encounter one exception.
-Mainly used for settings and configurations.
-
-Method: `alt_usage_data(value = nil, fallback: -1, &block)`
-
-Arguments:
-
-- `value`: a simple static value in which case the value is simply returned.
-- or a `block`: which is evaluated
-- `fallback: -1`: the common value used for any metrics that are failing.
-
-Example of usage:
-
-```ruby
-alt_usage_data { Gitlab::VERSION }
-alt_usage_data { Gitlab::CurrentSettings.uuid }
-alt_usage_data(999)
-```
-
-### Prometheus Queries
-
-In those cases where operational metrics should be part of Usage Ping, a database or Redis query is unlikely
-to provide useful data. Instead, Prometheus might be more appropriate, since most GitLab architectural
-components publish metrics to it that can be queried back, aggregated, and included as usage data.
-
-NOTE:
-Prometheus as a data source for Usage Ping is currently only available for single-node Omnibus installations
-that are running the [bundled Prometheus](../administration/monitoring/prometheus/index.md) instance.
-
-To query Prometheus for metrics, a helper method is available to `yield` a fully configured
-`PrometheusClient`, given it is available as per the note above:
-
-```ruby
-with_prometheus_client do |client|
- response = client.query('<your query>')
- ...
-end
-```
-
-Please refer to [the `PrometheusClient` definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/prometheus_client.rb)
-for how to use its API to query for data.
-
-## Developing and testing Usage Ping
-
-### 1. Naming and placing the metrics
-
-Add the metric in one of the top level keys
-
-- `license`: for license related metrics.
-- `settings`: for settings related metrics.
-- `counts_weekly`: for counters that have data for the most recent 7 days.
-- `counts_monthly`: for counters that have data for the most recent 28 days.
-- `counts`: for counters that have data for all time.
-
-### 2. Use your Rails console to manually test counters
-
-```ruby
-# count
-Gitlab::UsageData.count(User.active)
-Gitlab::UsageData.count(::Clusters::Cluster.aws_installed.enabled, :cluster_id)
-
-# count distinct
-Gitlab::UsageData.distinct_count(::Project, :creator_id)
-Gitlab::UsageData.distinct_count(::Note.with_suggestions.where(time_period), :author_id, start: ::User.minimum(:id), finish: ::User.maximum(:id))
-```
-
-### 3. Generate the SQL query
-
-Your Rails console returns the generated SQL queries.
-
-Example:
-
-```ruby
-pry(main)> Gitlab::UsageData.count(User.active)
- (2.6ms) SELECT "features"."key" FROM "features"
- (15.3ms) SELECT MIN("users"."id") FROM "users" WHERE ("users"."state" IN ('active')) AND ("users"."user_type" IS NULL OR "users"."user_type" IN (6, 4))
- (2.4ms) SELECT MAX("users"."id") FROM "users" WHERE ("users"."state" IN ('active')) AND ("users"."user_type" IS NULL OR "users"."user_type" IN (6, 4))
- (1.9ms) SELECT COUNT("users"."id") FROM "users" WHERE ("users"."state" IN ('active')) AND ("users"."user_type" IS NULL OR "users"."user_type" IN (6, 4)) AND "users"."id" BETWEEN 1 AND 100000
-```
-
-### 4. Optimize queries with #database-lab
-
-Paste the SQL query into `#database-lab` to see how the query performs at scale.
-
-- `#database-lab` is a Slack channel which uses a production-sized environment to test your queries.
-- GitLab.com’s production database has a 15 second timeout.
-- Any single query must stay below [1 second execution time](query_performance.md#timing-guidelines-for-queries) with cold caches.
-- Add a specialized index on columns involved to reduce the execution time.
-
-To have an understanding of the query's execution we add in the MR description the following information:
-
-- For counters that have a `time_period` test we add information for both cases:
- - `time_period = {}` for all time periods
- - `time_period = { created_at: 28.days.ago..Time.current }` for last 28 days period
-- Execution plan and query time before and after optimization
-- Query generated for the index and time
-- Migration output for up and down execution
-
-We also use `#database-lab` and [explain.depesz.com](https://explain.depesz.com/). For more details, see the [database review guide](database_review.md#preparation-when-adding-or-modifying-queries).
-
-#### Optimization recommendations and examples
-
-- Use specialized indexes [example 1](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/26871), [example 2](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/26445).
-- Use defined `start` and `finish`, and simple queries, because these values can be memoized and reused, [example](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/37155).
-- Avoid joins and write the queries as simply as possible, [example](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/36316).
-- Set a custom `batch_size` for `distinct_count`, [example](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/38000).
-
-### 5. Add the metric definition
-
-When adding, changing, or updating metrics, please update the [Event Dictionary's **Usage Ping** table](https://about.gitlab.com/handbook/product/product-intelligence-guide/#event-dictionary).
-
-### 6. Add new metric to Versions Application
-
-Check if new metrics need to be added to the Versions Application. See `usage_data` [schema](https://gitlab.com/gitlab-services/version-gitlab-com/-/blob/master/db/schema.rb#L147) and usage data [parameters accepted](https://gitlab.com/gitlab-services/version-gitlab-com/-/blob/master/app/services/usage_ping.rb). Any metrics added under the `counts` key are saved in the `stats` column.
-
-### 7. Add the feature label
-
-Add the `feature` label to the Merge Request for new Usage Ping metrics. These are user-facing changes and are part of expanding the Usage Ping feature.
-
-### 8. Add a changelog file
-
-Ensure you comply with the [Changelog entries guide](changelog.md).
-
-### 9. Ask for a Product Intelligence Review
-
-On GitLab.com, we have DangerBot setup to monitor Product Intelligence related files and DangerBot recommends a Product Intelligence review. Mention `@gitlab-org/growth/product_intelligence/engineers` in your MR for a review.
-
-### 10. Verify your metric
-
-On GitLab.com, the Product Intelligence team regularly monitors Usage Ping. They may alert you that your metrics need further optimization to run quicker and with greater success. You may also use the [Usage Ping QA dashboard](https://app.periscopedata.com/app/gitlab/632033/Usage-Ping-QA) to check how well your metric performs. The dashboard allows filtering by GitLab version, by "Self-managed" & "SaaS" and shows you how many failures have occurred for each metric. Whenever you notice a high failure rate, you may re-optimize your metric.
-
-### Optional: Test Prometheus based Usage Ping
-
-If the data submitted includes metrics [queried from Prometheus](#prometheus-queries) that you would like to inspect and verify,
-then you need to ensure that a Prometheus server is running locally, and that furthermore the respective GitLab components
-are exporting metrics to it. If you do not need to test data coming from Prometheus, no further action
-is necessary, since Usage Ping should degrade gracefully in the absence of a running Prometheus server.
-
-There are currently three kinds of components that may export data to Prometheus, and which are included in Usage Ping:
-
-- [`node_exporter`](https://github.com/prometheus/node_exporter) - Exports node metrics from the host machine
-- [`gitlab-exporter`](https://gitlab.com/gitlab-org/gitlab-exporter) - Exports process metrics from various GitLab components
-- various GitLab services such as Sidekiq and the Rails server that export their own metrics
-
-#### Test with an Omnibus container
-
-This is the recommended approach to test Prometheus based Usage Ping.
-
-The easiest way to verify your changes is to build a new Omnibus image from your code branch by using CI, then download the image
-and run a local container instance:
-
-1. From your merge request, click on the `qa` stage, then trigger the `package-and-qa` job. This job triggers an Omnibus
-build in a [downstream pipeline of the `omnibus-gitlab-mirror` project](https://gitlab.com/gitlab-org/build/omnibus-gitlab-mirror/-/pipelines).
-1. In the downstream pipeline, wait for the `gitlab-docker` job to finish.
-1. Open the job logs and locate the full container name including the version. It takes the following form: `registry.gitlab.com/gitlab-org/build/omnibus-gitlab-mirror/gitlab-ee:<VERSION>`.
-1. On your local machine, make sure you are signed in to the GitLab Docker registry. You can find the instructions for this in
-[Authenticate to the GitLab Container Registry](../user/packages/container_registry/index.md#authenticate-with-the-container-registry).
-1. Once signed in, download the new image by using `docker pull registry.gitlab.com/gitlab-org/build/omnibus-gitlab-mirror/gitlab-ee:<VERSION>`
-1. For more information about working with and running Omnibus GitLab containers in Docker, please refer to [GitLab Docker images](https://docs.gitlab.com/omnibus/docker/README.html) in the Omnibus documentation.
-
-#### Test with GitLab development toolkits
-
-This is the less recommended approach, since it comes with a number of difficulties when emulating a real GitLab deployment.
-
-The [GDK](https://gitlab.com/gitlab-org/gitlab-development-kit) is not currently set up to run a Prometheus server or `node_exporter` alongside other GitLab components. If you would
-like to do so, [Monitoring the GDK with Prometheus](https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/master/doc/howto/prometheus/index.md#monitoring-the-gdk-with-prometheus) is a good start.
-
-The [GCK](https://gitlab.com/gitlab-org/gitlab-compose-kit) has limited support for testing Prometheus based Usage Ping.
-By default, it already comes with a fully configured Prometheus service that is set up to scrape a number of components,
-but with the following limitations:
-
-- It does not currently run a `gitlab-exporter` instance, so several `process_*` metrics from services such as Gitaly may be missing.
-- While it runs a `node_exporter`, `docker-compose` services emulate hosts, meaning that it would normally report itself to not be associated
-with any of the other services that are running. That is not how node metrics are reported in a production setup, where `node_exporter`
-always runs as a process alongside other GitLab components on any given node. From Usage Ping's perspective none of the node data would therefore
-appear to be associated to any of the services running, since they all appear to be running on different hosts. To alleviate this problem, the `node_exporter` in GCK was arbitrarily "assigned" to the `web` service, meaning only for this service `node_*` metrics appears in Usage Ping.
-
-## Aggregated metrics
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/45979) in GitLab 13.6.
-
-WARNING:
-This feature is intended solely for internal GitLab use.
-
-To add data for aggregated metrics into Usage Ping payload you should add corresponding definition in [`aggregated_metrics`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/aggregated_metrics/). Each aggregate definition includes following parts:
-
-- name: unique name under which aggregate metric is added to Usage Ping payload
-- operator: operator that defines how aggregated metric data is counted. Available operators are:
- - `OR`: removes duplicates and counts all entries that triggered any of listed events
- - `AND`: removes duplicates and counts all elements that were observed triggering all of following events
-- events: list of events names (from [`known_events/`](#known-events-are-added-automatically-in-usage-data-payload)) to aggregate into metric. All events in this list must have the same `redis_slot` and `aggregation` attributes.
-- feature_flag: name of [development feature flag](feature_flags/development.md#development-type) that is checked before
-metrics aggregation is performed. Corresponding feature flag should have `default_enabled` attribute set to `false`.
-`feature_flag` attribute is **OPTIONAL** and can be omitted, when `feature_flag` is missing no feature flag is checked.
-
-Example aggregated metric entries:
-
-```yaml
-- name: product_analytics_test_metrics_union
- operator: OR
- events: ['i_search_total', 'i_search_advanced', 'i_search_paid']
-- name: product_analytics_test_metrics_intersection_with_feautre_flag
- operator: AND
- events: ['i_search_total', 'i_search_advanced', 'i_search_paid']
- feature_flag: example_aggregated_metric
-```
-
-Aggregated metrics are added under `aggregated_metrics` key in both `counts_weekly` and `counts_monthly` top level keys in Usage Ping payload.
-
-```ruby
-{
- :counts_monthly => {
- :deployments => 1003,
- :successful_deployments => 78,
- :failed_deployments => 275,
- :packages => 155,
- :personal_snippets => 2106,
- :project_snippets => 407,
- :promoted_issues => 719,
- :aggregated_metrics => {
- :product_analytics_test_metrics_union => 7,
- :product_analytics_test_metrics_intersection_with_feautre_flag => 2
- },
- :snippets => 2513
- }
-}
-```
-
-## Example Usage Ping payload
-
-The following is example content of the Usage Ping payload.
-
-```json
-{
- "uuid": "0000000-0000-0000-0000-000000000000",
- "hostname": "example.com",
- "version": "12.10.0-pre",
- "installation_type": "omnibus-gitlab",
- "active_user_count": 999,
- "recorded_at": "2020-04-17T07:43:54.162+00:00",
- "edition": "EEU",
- "license_md5": "00000000000000000000000000000000",
- "license_id": null,
- "historical_max_users": 999,
- "licensee": {
- "Name": "ABC, Inc.",
- "Email": "email@example.com",
- "Company": "ABC, Inc."
- },
- "license_user_count": 999,
- "license_starts_at": "2020-01-01",
- "license_expires_at": "2021-01-01",
- "license_plan": "ultimate",
- "license_add_ons": {
- },
- "license_trial": false,
- "counts": {
- "assignee_lists": 999,
- "boards": 999,
- "ci_builds": 999,
- ...
- },
- "container_registry_enabled": true,
- "dependency_proxy_enabled": false,
- "gitlab_shared_runners_enabled": true,
- "gravatar_enabled": true,
- "influxdb_metrics_enabled": true,
- "ldap_enabled": false,
- "mattermost_enabled": false,
- "omniauth_enabled": true,
- "prometheus_enabled": false,
- "prometheus_metrics_enabled": false,
- "reply_by_email_enabled": "incoming+%{key}@incoming.gitlab.com",
- "signup_enabled": true,
- "web_ide_clientside_preview_enabled": true,
- "ingress_modsecurity_enabled": true,
- "projects_with_expiration_policy_disabled": 999,
- "projects_with_expiration_policy_enabled": 999,
- ...
- "elasticsearch_enabled": true,
- "license_trial_ends_on": null,
- "geo_enabled": false,
- "git": {
- "version": {
- "major": 2,
- "minor": 26,
- "patch": 1
- }
- },
- "gitaly": {
- "version": "12.10.0-rc1-93-g40980d40",
- "servers": 56,
- "clusters": 14,
- "filesystems": [
- "EXT_2_3_4"
- ]
- },
- "gitlab_pages": {
- "enabled": true,
- "version": "1.17.0"
- },
- "container_registry_server": {
- "vendor": "gitlab",
- "version": "2.9.1-gitlab"
- },
- "database": {
- "adapter": "postgresql",
- "version": "9.6.15",
- "pg_system_id": 6842684531675334351
- },
- "analytics_unique_visits": {
- "g_analytics_contribution": 999,
- ...
- },
- "usage_activity_by_stage": {
- "configure": {
- "project_clusters_enabled": 999,
- ...
- },
- "create": {
- "merge_requests": 999,
- ...
- },
- "manage": {
- "events": 999,
- ...
- },
- "monitor": {
- "clusters": 999,
- ...
- },
- "package": {
- "projects_with_packages": 999
- },
- "plan": {
- "issues": 999,
- ...
- },
- "release": {
- "deployments": 999,
- ...
- },
- "secure": {
- "user_container_scanning_jobs": 999,
- ...
- },
- "verify": {
- "ci_builds": 999,
- ...
- }
- },
- "usage_activity_by_stage_monthly": {
- "configure": {
- "project_clusters_enabled": 999,
- ...
- },
- "create": {
- "merge_requests": 999,
- ...
- },
- "manage": {
- "events": 999,
- ...
- },
- "monitor": {
- "clusters": 999,
- ...
- },
- "package": {
- "projects_with_packages": 999
- },
- "plan": {
- "issues": 999,
- ...
- },
- "release": {
- "deployments": 999,
- ...
- },
- "secure": {
- "user_container_scanning_jobs": 999,
- ...
- },
- "verify": {
- "ci_builds": 999,
- ...
- }
- },
- "topology": {
- "duration_s": 0.013836685999194742,
- "application_requests_per_hour": 4224,
- "query_apdex_weekly_average": 0.996,
- "failures": [],
- "nodes": [
- {
- "node_memory_total_bytes": 33269903360,
- "node_memory_utilization": 0.35,
- "node_cpus": 16,
- "node_cpu_utilization": 0.2,
- "node_uname_info": {
- "machine": "x86_64",
- "sysname": "Linux",
- "release": "4.19.76-linuxkit"
- },
- "node_services": [
- {
- "name": "web",
- "process_count": 16,
- "process_memory_pss": 233349888,
- "process_memory_rss": 788220927,
- "process_memory_uss": 195295487,
- "server": "puma"
- },
- {
- "name": "sidekiq",
- "process_count": 1,
- "process_memory_pss": 734080000,
- "process_memory_rss": 750051328,
- "process_memory_uss": 731533312
- },
- ...
- ],
- ...
- },
- ...
- ]
- }
-}
-```
-
-## Notable changes
-
-In GitLab 13.5, `pg_system_id` was added to send the [PostgreSQL system identifier](https://www.2ndquadrant.com/en/blog/support-for-postgresqls-system-identifier-in-barman/).
-
-## Exporting Usage Ping SQL queries and definitions
-
-Two Rake tasks exist to export Usage Ping definitions.
-
-- The Rake tasks export the raw SQL queries for `count`, `distinct_count`, `sum`.
-- The Rake tasks export the Redis counter class or the line of the Redis block for `redis_usage_data`.
-- The Rake tasks calculate the `alt_usage_data` metrics.
-
-In the home directory of your local GitLab installation run the following Rake tasks for the YAML and JSON versions respectively:
-
-```shell
-# for YAML export
-bin/rake gitlab:usage_data:dump_sql_in_yaml
-
-# for JSON export
-bin/rake gitlab:usage_data:dump_sql_in_json
-
-# You may pipe the output into a file
-bin/rake gitlab:usage_data:dump_sql_in_yaml > ~/Desktop/usage-metrics-2020-09-02.yaml
-```
-
-## Generating and troubleshooting usage ping
-
-To get a usage ping, or to troubleshoot caching issues on your GitLab instance, please follow [instructions to generate usage ping](../administration/troubleshooting/gitlab_rails_cheat_sheet.md#generate-usage-ping).
+This document was moved to [another location](usage_ping/index.md).
+<!-- This redirect file can be deleted after <2021-05-23>. -->
+<!-- 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/development/usage_ping/dictionary.md b/doc/development/usage_ping/dictionary.md
index ca3e0f1aae6..0daaee62f28 100644
--- a/doc/development/usage_ping/dictionary.md
+++ b/doc/development/usage_ping/dictionary.md
@@ -24,864 +24,17458 @@ bundle exec rake gitlab:usage_data:generate_metrics_dictionary
The Metrics Dictionary is based on the following metrics definition YAML files:
-- [`config/metrics`]('https://gitlab.com/gitlab-org/gitlab/-/tree/master/config/metrics')
+- [`config/metrics`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/config/metrics)
- [`ee/config/metrics`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/ee/config/metrics)
+
Each table includes a `milestone`, which corresponds to the GitLab version when the metric
was released.
-## `active_user_count`
+## Metrics Definitions
+
+### `active_user_count`
This is named the instance_user_count in the Versions application.
-| field | value |
-| --- | --- |
-| `key_path` | **`active_user_count`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | Database |
-| `distribution` | ce, ee |
-| `tier` | free, premium, ultimate |
-| `skip_validation` | true |
-
-## `container_registry_enabled`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210204124829_active_user_count.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `analytics_unique_visits.analytics_unique_visits_for_any_target`
+
+Visits to any of the pages listed above per week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174908_analytics_unique_visits_for_any_target.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.analytics_unique_visits_for_any_target_monthly`
+
+Visits to any of the pages listed above per month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216174910_analytics_unique_visits_for_any_target_monthly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.g_analytics_contribution`
+
+Visits to /groups/:group/-/contribution_analytics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174836_g_analytics_contribution.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.g_analytics_insights`
+
+Visits to /groups/:group/-/insights
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174838_g_analytics_insights.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.g_analytics_issues`
+
+Visits to /groups/:group/-/issues_analytics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174840_g_analytics_issues.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.g_analytics_merge_request`
+
+Visits to /groups/:group/-/analytics/merge_request_analytics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174902_g_analytics_merge_request.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.g_analytics_productivity`
+
+Visits to /groups/:group/-/analytics/productivity_analytics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174842_g_analytics_productivity.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.g_analytics_valuestream`
+
+Visits to /groups/:group/-/analytics/value_stream_analytics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174844_g_analytics_valuestream.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.i_analytics_cohorts`
+
+Visits to /-/instance_statistics/cohorts
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174858_i_analytics_cohorts.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.i_analytics_dev_ops_score`
+
+Visits to /-/instance_statistics/dev_ops_score
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174900_i_analytics_dev_ops_score.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.i_analytics_instance_statistics`
+
+Visit to /admin/instance_statistics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174906_i_analytics_instance_statistics.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.p_analytics_code_reviews`
+
+Visits to /:group/:project/-/analytics/code_reviews
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174848_p_analytics_code_reviews.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.p_analytics_insights`
+
+Visits to /:group/:project/insights
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174852_p_analytics_insights.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.p_analytics_issues`
+
+Visits to /:group/:project/-/analytics/issues_analytics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174854_p_analytics_issues.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.p_analytics_merge_request`
+
+Visits to /:group/:project/-/analytics/merge_request_analytics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174904_p_analytics_merge_request.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.p_analytics_pipelines`
+
+Visits to /:group/:project/pipelines/charts
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174846_p_analytics_pipelines.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.p_analytics_repo`
+
+Visits to /:group/:project/-/graphs/master/charts
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174856_p_analytics_repo.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.p_analytics_valuestream`
+
+Visits to /:group/:project/-/value_stream_analytics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174850_p_analytics_valuestream.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `compliance_unique_visits.a_compliance_audit_events_api`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183912_a_compliance_audit_events_api.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `compliance_unique_visits.compliance_unique_visits_for_any_target`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183914_compliance_unique_visits_for_any_target.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `compliance_unique_visits.compliance_unique_visits_for_any_target_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183916_compliance_unique_visits_for_any_target_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `compliance_unique_visits.g_compliance_audit_events`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183906_g_compliance_audit_events.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `compliance_unique_visits.g_compliance_dashboard`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183904_g_compliance_dashboard.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `compliance_unique_visits.i_compliance_audit_events`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183908_i_compliance_audit_events.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `compliance_unique_visits.i_compliance_credential_inventory`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183910_i_compliance_credential_inventory.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `container_registry_enabled`
Whether container registry is enabled
-| field | value |
-| --- | --- |
-| `key_path` | **`container_registry_enabled`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | boolean |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `counts.deployments`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124858_container_registry_enabled.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `container_registry_server.vendor`
+
+Identifies if a user is using an external container registry and what type
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181051_vendor.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `container_registry_server.version`
+
+Identifies the version of the external registry being used
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210216181053_version.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.alert_bot_incident_issues`
+
+Count of issues created by the alert bot automatically
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180449_alert_bot_incident_issues.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.all_searches`
+
+Total Searches for All Basic Search and Advanced Search in self-managed and SaaS
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180413_all_searches.yml)
+
+Group: `group::global search`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.api_fuzzing_dnd_jobs`
+
+Count of API Fuzzing `docker-in-docker` jobs run by job name
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180346_api_fuzzing_dnd_jobs.yml)
+
+Group: `group::fuzz testing`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.api_fuzzing_jobs`
+
+Count of API Fuzzing jobs run by job name
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180344_api_fuzzing_jobs.yml)
+
+Group: `group::fuzz testing`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.assignee_lists`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216181100_assignee_lists.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers:
+
+### `counts.auto_devops_disabled`
+
+Projects with Auto DevOps template disabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175231_auto_devops_disabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.auto_devops_enabled`
+
+Projects with Auto DevOps template enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175229_auto_devops_enabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.boards`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181252_boards.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.ci_builds`
+
+Unique builds in project
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175510_ci_builds.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.ci_external_pipelines`
+
+Total pipelines in external repositories
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175514_ci_external_pipelines.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.ci_internal_pipelines`
+
+Total pipelines in GitLab repositories
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175512_ci_internal_pipelines.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.ci_pipeline_config_auto_devops`
+
+Total pipelines from an Auto DevOps template
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175516_ci_pipeline_config_auto_devops.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.ci_pipeline_config_repository`
+
+Total Pipelines from templates in repository
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175518_ci_pipeline_config_repository.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.ci_pipeline_schedules`
+
+Pipeline schedules in GitLab
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175523_ci_pipeline_schedules.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.ci_runners`
+
+Total configured Runners in project
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175520_ci_runners.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.ci_triggers`
+
+Total configured Triggers in project
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175521_ci_triggers.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.clusters`
+
+Total GitLab Managed clusters both enabled and disabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175232_clusters.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_applications_cert_managers`
+
+Total GitLab Managed clusters with GitLab Managed App:Cert Manager installed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175259_clusters_applications_cert_managers.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_applications_cilium`
+
+Total GitLab Managed clusters with GitLab Managed App:Cilium installed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175312_clusters_applications_cilium.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_applications_crossplane`
+
+Total GitLab Managed clusters with GitLab Managed App:Crossplane installed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175301_clusters_applications_crossplane.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_applications_elastic_stack`
+
+Total GitLab Managed clusters with GitLab Managed App:Elastic Stack installed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175309_clusters_applications_elastic_stack.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_applications_helm`
+
+Total GitLab Managed clusters with GitLab Managed App:Helm enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175255_clusters_applications_helm.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_applications_ingress`
+
+Total GitLab Managed clusters with GitLab Managed App:Ingress installed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175257_clusters_applications_ingress.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_applications_jupyter`
+
+Total GitLab Managed clusters with GitLab Managed App:Jupyter installed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175310_clusters_applications_jupyter.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_applications_knative`
+
+Total GitLab Managed clusters with GitLab Managed App:Knative installed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175307_clusters_applications_knative.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_applications_prometheus`
+
+Total GitLab Managed clusters with GitLab Managed App:Prometheus installed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175303_clusters_applications_prometheus.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_applications_runner`
+
+Total GitLab Managed clusters with GitLab Managed App:Runner installed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175305_clusters_applications_runner.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_disabled`
+
+Total GitLab Managed disabled clusters
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175242_clusters_disabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_enabled`
+
+Total GitLab Managed clusters currently enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175234_clusters_enabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_management_project`
+
+Total GitLab Managed clusters with defined cluster management project
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175314_clusters_management_project.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_platforms_eks`
+
+Total GitLab Managed clusters provisioned with GitLab on AWS EKS
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175250_clusters_platforms_eks.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_platforms_gke`
+
+Total GitLab Managed clusters provisioned with GitLab on GCE GKE
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175251_clusters_platforms_gke.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_platforms_user`
+
+Total GitLab Managed clusters that are user provisioned
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175253_clusters_platforms_user.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.commit_comment`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182004_commit_comment.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.confidential_epics`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181205_confidential_epics.yml)
+
+Group: `group::portfolio management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.container_scanning_jobs`
+
+Count of Container Scanning jobs run
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175458_container_scanning_jobs.yml)
+
+Group: `group::container security`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `counts.coverage_fuzzing_jobs`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183146_coverage_fuzzing_jobs.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.cycle_analytics_views`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174832_cycle_analytics_views.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.dast_jobs`
+
+Count of DAST jobs run
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175612_dast_jobs.yml)
+
+Group: `group::dynamic analysis`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.dast_on_demand_pipelines`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183149_dast_on_demand_pipelines.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.dependency_list_usages_total`
+
+Count to Dependency List page views
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175211_dependency_list_usages_total.yml)
+
+Group: `group::composition analysis`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `counts.dependency_scanning_jobs`
+
+Count of Dependency Scanning jobs run
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175213_dependency_scanning_jobs.yml)
+
+Group: `group::composition analysis`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `counts.deploy_keys`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181908_deploy_keys.yml)
+
+Group: `group::release`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.deployments`
Total deployments count
-| field | value |
-| --- | --- |
-| `key_path` | **`counts.deployments`** |
-| `product_section` | ops |
-| `product_stage` | release |
-| `product_group` | `group::ops release` |
-| `value_type` | number |
-| `status` | data_available |
-| `milestone` | 8.12 |
-| `introduced_by_url` | [Introduced by](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/735) |
-| `time_frame` | all |
-| `data_source` | Database |
-| `distribution` | ee, ce |
-| `tier` | free, premium, ultimate |
-
-## `counts.geo_nodes`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210201124934_deployments.yml)
+
+Group: `group::ops release`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.design_management_designs_create`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180740_design_management_designs_create.yml)
+
+Group: `group::knowledge`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.design_management_designs_delete`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180743_design_management_designs_delete.yml)
+
+Group: `group::knowledge`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.design_management_designs_update`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180741_design_management_designs_update.yml)
+
+Group: `group::knowledge`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.environments`
+
+Total available and stopped environments
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181914_environments.yml)
+
+Group: `group::release`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.epic_issues`
+
+Count of issues that are assigned to an epic
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216181208_epic_issues.yml)
+
+Group: `group::portfolio management`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.epics`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181206_epics.yml)
+
+Group: `group::portfolio management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.epics_deepest_relationship_level`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216181212_epics_deepest_relationship_level.yml)
+
+Group: `group::portfolio management`
+
+Status: `data_available`
+
+Tiers:
+
+### `counts.failed_deployments`
+
+Total failed deployments
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181912_failed_deployments.yml)
+
+Group: `group::release`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.feature_flags`
+
+Number of feature flag toggles
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181249_feature_flags.yml)
+
+Group: `group::progressive delivery`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.geo_event_log_max_id`
+
+Number of replication events on a Geo primary
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216180405_geo_event_log_max_id.yml)
+
+Group: `group::geo`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.geo_nodes`
Total number of sites in a Geo deployment
-| field | value |
-| --- | --- |
-| `key_path` | **`counts.geo_nodes`** |
-| `product_section` | enablement |
-| `product_stage` | enablement |
-| `product_group` | `group::geo` |
-| `product_category` | disaster_recovery |
-| `value_type` | integer |
-| `status` | data_available |
-| `milestone` | 11.2 |
-| `time_frame` | all |
-| `data_source` | Database |
-| `distribution` | ee |
-| `tier` | premium, ultimate |
-
-## `counts.license_management_jobs`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210201124936_geo_nodes.yml)
+
+Group: `group::geo`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.grafana_integrated_projects`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180927_grafana_integrated_projects.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.group_clusters_disabled`
+
+Total GitLab Managed disabled clusters previously attached to groups
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175246_group_clusters_disabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.group_clusters_enabled`
+
+Total GitLab Managed clusters attached to groups
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175238_group_clusters_enabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups`
+
+Total count of groups as of usage ping snapshot
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180750_groups.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_asana_active`
+
+Count of groups with active integrations for Asana
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175625_groups_asana_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_assembla_active`
+
+Count of groups with active integrations for Assembla
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175636_groups_assembla_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_bamboo_active`
+
+Count of groups with active integrations for Bamboo CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175647_groups_bamboo_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_bugzilla_active`
+
+Count of groups with active integrations for Bugzilla
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175659_groups_bugzilla_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_buildkite_active`
+
+Count of groups with active integrations for Buildkite
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175710_groups_buildkite_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_campfire_active`
+
+Count of groups with active integrations for Campfire
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175721_groups_campfire_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_confluence_active`
+
+Count of groups with active integrations for Confluence
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175733_groups_confluence_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_custom_issue_tracker_active`
+
+Count of groups with active integrations for a Custom Issue Tracker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175744_groups_custom_issue_tracker_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_datadog_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182549_groups_datadog_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.groups_discord_active`
+
+Count of groups with active integrations for Discord
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175755_groups_discord_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_drone_ci_active`
+
+Count of groups with active integrations for Drone CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175806_groups_drone_ci_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_emails_on_push_active`
+
+Count of groups with active integrations for Emails on Push
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175817_groups_emails_on_push_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_ewm_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182616_groups_ewm_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.groups_external_wiki_active`
+
+Count of groups with active integrations for External Wiki
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175828_groups_external_wiki_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_flowdock_active`
+
+Count of groups with active integrations for Flowdock
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175839_groups_flowdock_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_github_active`
+
+Count of groups with active integrations for GitHub
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175850_groups_github_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_hangouts_chat_active`
+
+Count of groups with active integrations for Hangouts Chat
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175901_groups_hangouts_chat_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_hipchat_active`
+
+Count of groups with active integrations for HipChat
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175912_groups_hipchat_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_asana_active`
+
+Count of active groups inheriting integrations for Asana
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175632_groups_inheriting_asana_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_assembla_active`
+
+Count of active groups inheriting integrations for Assembla
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175644_groups_inheriting_assembla_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_bamboo_active`
+
+Count of active groups inheriting integrations for Bamboo CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175655_groups_inheriting_bamboo_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_bugzilla_active`
+
+Count of active groups inheriting integrations for Bugzilla
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175706_groups_inheriting_bugzilla_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_buildkite_active`
+
+Count of active groups inheriting integrations for Buildkite
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175717_groups_inheriting_buildkite_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_campfire_active`
+
+Count of active groups inheriting integrations for Campfire
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175729_groups_inheriting_campfire_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_confluence_active`
+
+Count of active groups inheriting integrations for Confluence
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175740_groups_inheriting_confluence_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_custom_issue_tracker_active`
+
+Count of active groups inheriting integrations for a Custom Issue Tracker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175751_groups_inheriting_custom_issue_tracker_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_datadog_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182557_groups_inheriting_datadog_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.groups_inheriting_discord_active`
+
+Count of active groups inheriting integrations for Discord
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175802_groups_inheriting_discord_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_drone_ci_active`
+
+Count of active groups inheriting integrations for Drone CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175813_groups_inheriting_drone_ci_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_emails_on_push_active`
+
+Count of active groups inheriting integrations for Emails on Push
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175824_groups_inheriting_emails_on_push_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_ewm_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182623_groups_inheriting_ewm_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.groups_inheriting_external_wiki_active`
+
+Count of active groups inheriting integrations for External Wiki
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175835_groups_inheriting_external_wiki_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_flowdock_active`
+
+Count of active groups inheriting integrations for Flowdock
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175846_groups_inheriting_flowdock_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_github_active`
+
+Count of active groups inheriting integrations for GitHub
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175857_groups_inheriting_github_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_hangouts_chat_active`
+
+Count of active groups inheriting integrations for Hangouts Chat
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175908_groups_inheriting_hangouts_chat_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_hipchat_active`
+
+Count of active groups inheriting integrations for HipChat
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175919_groups_inheriting_hipchat_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_irker_active`
+
+Count of active groups inheriting integrations for Irker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175930_groups_inheriting_irker_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_jenkins_active`
+
+Count of active groups inheriting integrations for Jenkins
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175941_groups_inheriting_jenkins_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_jira_active`
+
+Count of active groups inheriting integrations for Jira
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175952_groups_inheriting_jira_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_mattermost_active`
+
+Count of active groups inheriting integrations for Mattermost
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180003_groups_inheriting_mattermost_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_mattermost_slash_commands_active`
+
+Count of active groups inheriting integrations for Mattermost (slash commands)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180014_groups_inheriting_mattermost_slash_commands_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_microsoft_teams_active`
+
+Count of active groups inheriting integrations for Microsoft Teams
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180025_groups_inheriting_microsoft_teams_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_mock_ci_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182732_groups_inheriting_mock_ci_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.groups_inheriting_mock_monitoring_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182743_groups_inheriting_mock_monitoring_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.groups_inheriting_packagist_active`
+
+Count of active groups inheriting integrations for Packagist
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180036_groups_inheriting_packagist_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_pipelines_email_active`
+
+Count of active groups inheriting integrations for Pipeline Emails
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180047_groups_inheriting_pipelines_email_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_pivotaltracker_active`
+
+Count of active groups inheriting integrations for Pivotal Tracker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180058_groups_inheriting_pivotaltracker_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_prometheus_active`
+
+Count of active groups inheriting integrations for Prometheus
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180940_groups_inheriting_prometheus_active.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_pushover_active`
+
+Count of active groups inheriting integrations for Pushover
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180109_groups_inheriting_pushover_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_redmine_active`
+
+Count of active groups inheriting integrations for Redmine
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180120_groups_inheriting_redmine_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_slack_active`
+
+Count of active groups inheriting integrations for Slack
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180131_groups_inheriting_slack_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_slack_slash_commands_active`
+
+Count of active groups inheriting integrations for Slack (slash commands)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180142_groups_inheriting_slack_slash_commands_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_teamcity_active`
+
+Count of active groups inheriting integrations for Teamcity CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180153_groups_inheriting_teamcity_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_unify_circuit_active`
+
+Count of active groups inheriting integrations for Unifiy Circuit
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180204_groups_inheriting_unify_circuit_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_webex_teams_active`
+
+Count of active groups inheriting integrations for Webex Teams
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180215_groups_inheriting_webex_teams_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_youtrack_active`
+
+Count of active groups inheriting integrations for YouTrack
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180226_groups_inheriting_youtrack_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_irker_active`
+
+Count of groups with active integrations for Irker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175923_groups_irker_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_jenkins_active`
+
+Count of groups with active integrations for Jenkins
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175934_groups_jenkins_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_jira_active`
+
+Count of groups with active integrations for Jira
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175945_groups_jira_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_mattermost_active`
+
+Count of groups with active integrations for Mattermost
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175956_groups_mattermost_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_mattermost_slash_commands_active`
+
+Count of groups with active integrations for Mattermost (slash commands)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180006_groups_mattermost_slash_commands_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_microsoft_teams_active`
+
+Count of groups with active integrations for Microsoft Teams
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180018_groups_microsoft_teams_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_mock_ci_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182724_groups_mock_ci_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.groups_mock_monitoring_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182736_groups_mock_monitoring_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.groups_packagist_active`
+
+Count of groups with active integrations for Packagist
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180029_groups_packagist_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_pipelines_email_active`
+
+Count of groups with active integrations for Pipeline Emails
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180040_groups_pipelines_email_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_pivotaltracker_active`
+
+Count of groups with active integrations for Pivotal Tracker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180051_groups_pivotaltracker_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_prometheus_active`
+
+Count of groups with active integrations for Prometheus
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180933_groups_prometheus_active.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_pushover_active`
+
+Count of groups with active integrations for Pushover
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180102_groups_pushover_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_redmine_active`
+
+Count of groups with active integrations for Redmine
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180113_groups_redmine_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_slack_active`
+
+Count of groups with active integrations for Slack
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180124_groups_slack_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_slack_slash_commands_active`
+
+Count of groups with active integrations for Slack (slash commands)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180135_groups_slack_slash_commands_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_teamcity_active`
+
+Count of groups with active integrations for Teamcity CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180146_groups_teamcity_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_unify_circuit_active`
+
+Count of groups with active integrations for Unifiy Circuit
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180157_groups_unify_circuit_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_webex_teams_active`
+
+Count of groups with active integrations for Webex Teams
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180208_groups_webex_teams_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_youtrack_active`
+
+Count of groups with active integrations for YouTrack
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180219_groups_youtrack_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.in_review_folder`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181916_in_review_folder.yml)
+
+Group: `group::release`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.incident_issues`
+
+Count of incidents (issues where issue_type=incident)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180447_incident_issues.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.incident_labeled_issues`
+
+Count of all issues with the label=incident
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180451_incident_labeled_issues.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.ingress_modsecurity_blocking`
+
+Whether or not ModSecurity is set to blocking mode
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175452_ingress_modsecurity_blocking.yml)
+
+Group: `group::container security`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.ingress_modsecurity_disabled`
+
+Whether or not ModSecurity is disabled within Ingress
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175454_ingress_modsecurity_disabled.yml)
+
+Group: `group::container security`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.ingress_modsecurity_logging`
+
+Whether or not ModSecurity is set to logging mode
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175450_ingress_modsecurity_logging.yml)
+
+Group: `group::container security`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.ingress_modsecurity_not_installed`
+
+Whether or not ModSecurity has not been installed into the cluster
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175456_ingress_modsecurity_not_installed.yml)
+
+Group: `group::container security`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.ingress_modsecurity_packets_anomalous`
+
+Cumulative count of packets identified as anomalous by ModSecurity since Usage Ping was last reported
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175444_ingress_modsecurity_packets_anomalous.yml)
+
+Group: `group::container security`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.ingress_modsecurity_packets_processed`
+
+Cumulative count of packets processed by ModSecurity since Usage Ping was last reported
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175442_ingress_modsecurity_packets_processed.yml)
+
+Group: `group::container security`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.ingress_modsecurity_statistics_unavailable`
+
+Whether or not ModSecurity statistics are unavailable
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175441_ingress_modsecurity_statistics_unavailable.yml)
+
+Group: `group::container security`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `counts.instance_clusters_disabled`
+
+Total GitLab Managed disabled clusters previously attached to the instance
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175248_instance_clusters_disabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instance_clusters_enabled`
+
+Total GitLab Managed clusters attached to the instance
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175240_instance_clusters_enabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_asana_active`
+
+Count of active instance-level integrations for Asana
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175628_instances_asana_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_assembla_active`
+
+Count of active instance-level integrations for Assembla
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175640_instances_assembla_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_bamboo_active`
+
+Count of active instance-level integrations for Bamboo CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175651_instances_bamboo_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_bugzilla_active`
+
+Count of active instance-level integrations for Bugzilla
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175702_instances_bugzilla_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_buildkite_active`
+
+Count of active instance-level integrations for Buildkite
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175714_instances_buildkite_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_campfire_active`
+
+Count of active instance-level integrations for Campfire
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175725_instances_campfire_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_confluence_active`
+
+Count of active instance-level integrations for Confluence
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175736_instances_confluence_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_custom_issue_tracker_active`
+
+Count of active instance-level integrations for a Custom Issue Tracker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175747_instances_custom_issue_tracker_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_datadog_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182553_instances_datadog_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.instances_discord_active`
+
+Count of active instance-level integrations for Discord
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175758_instances_discord_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_drone_ci_active`
+
+Count of active instance-level integrations for Drone CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175809_instances_drone_ci_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_emails_on_push_active`
+
+Count of active instance-level integrations for Emails on Push
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175820_instances_emails_on_push_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_ewm_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182620_instances_ewm_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.instances_external_wiki_active`
+
+Count of active instance-level integrations for External Wiki
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175831_instances_external_wiki_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_flowdock_active`
+
+Count of active instance-level integrations for Flowdock
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175842_instances_flowdock_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_github_active`
+
+Count of active instance-level integrations for GitHub
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175853_instances_github_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_hangouts_chat_active`
+
+Count of active instance-level integrations for Hangouts Chat
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175904_instances_hangouts_chat_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_hipchat_active`
+
+Count of active instance-level integrations for HipChat
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175915_instances_hipchat_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_irker_active`
+
+Count of active instance-level integrations for Irker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175926_instances_irker_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_jenkins_active`
+
+Count of active instance-level integrations for Jenkins
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175937_instances_jenkins_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_jira_active`
+
+Count of active instance-level integrations for Jira
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175948_instances_jira_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_mattermost_active`
+
+Count of active instance-level integrations for Mattermost
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175959_instances_mattermost_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_mattermost_slash_commands_active`
+
+Count of active instance-level integrations for Mattermost (slash commands)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180010_instances_mattermost_slash_commands_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_microsoft_teams_active`
+
+Count of active instance-level integrations for Microsoft Teams
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180021_instances_microsoft_teams_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_mock_ci_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182728_instances_mock_ci_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.instances_mock_monitoring_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182739_instances_mock_monitoring_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.instances_packagist_active`
+
+Count of active instance-level integrations for Packagist
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180032_instances_packagist_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_pipelines_email_active`
+
+Count of active instance-level integrations for Pipeline Emails
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180043_instances_pipelines_email_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_pivotaltracker_active`
+
+Count of active instance-level integrations for Pivotal Tracker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180054_instances_pivotaltracker_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_prometheus_active`
+
+Count of active instance-level integrations for Prometheus
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180936_instances_prometheus_active.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_pushover_active`
+
+Count of active instance-level integrations for Pushover
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180105_instances_pushover_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_redmine_active`
+
+Count of active instance-level integrations for Redmine
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180116_instances_redmine_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_slack_active`
+
+Count of active instance-level integrations for Slack
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180127_instances_slack_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_slack_slash_commands_active`
+
+Count of active instance-level integrations for Slack (slash commands)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180138_instances_slack_slash_commands_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_teamcity_active`
+
+Count of active instance-level integrations for Teamcity CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180149_instances_teamcity_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_unify_circuit_active`
+
+Count of active instance-level integrations for Unifiy Circuit
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180201_instances_unify_circuit_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_webex_teams_active`
+
+Count of active instance-level integrations for Webex Teams
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180212_instances_webex_teams_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_youtrack_active`
+
+Count of active instance-level integrations for YouTrack
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180223_instances_youtrack_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.issues`
+
+Count of Issues created
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181102_issues.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.issues_created_from_alerts`
+
+Count of issues created automatically on alerts from GitLab-Managed Prometheus
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180441_issues_created_from_alerts.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.issues_created_from_gitlab_error_tracking_ui`
+
+Count of issues manually created from the GitLab UI on Sentry errors
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180434_issues_created_from_gitlab_error_tracking_ui.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.issues_created_gitlab_alerts`
+
+Count of all issues created from GitLab alerts (bot and non-bot)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180443_issues_created_gitlab_alerts.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.issues_created_manually_from_alerts`
+
+Count of issues created manually by non-bot users from GitLab alerts
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180445_issues_created_manually_from_alerts.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.issues_using_zoom_quick_actions`
+
+Count of issues where a user have added AND removed a zoom meeting using slash commands
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180438_issues_using_zoom_quick_actions.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.issues_with_associated_zoom_link`
+
+Count of issues where a user has linked a Zoom meeting
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180436_issues_with_associated_zoom_link.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.issues_with_embedded_grafana_charts_approx`
+
+Count of issues where a user has embedded a Grafana chart
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180440_issues_with_embedded_grafana_charts_approx.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.issues_with_health_status`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181210_issues_with_health_status.yml)
+
+Group: `group::portfolio management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.jira_imports_projects_count`
+
+Count of Projects that imported Issues from Jira
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181259_jira_imports_projects_count.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.jira_imports_total_imported_count`
+
+Count of Issues imported from Jira
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181258_jira_imports_total_imported_count.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.jira_imports_total_imported_issues_count`
+
+Count of Jira imports run
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181301_jira_imports_total_imported_issues_count.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.keys`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180752_keys.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.kubernetes_agent_gitops_sync`
+
+Count of GitOps Sync events
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175328_kubernetes_agent_gitops_sync.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.kubernetes_agents`
+
+Count of Kubernetes agents
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175316_kubernetes_agents.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.kubernetes_agents_with_token`
+
+Count of Kubernetes agents with at least one token
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175318_kubernetes_agents_with_token.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.label_lists`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181104_label_lists.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.labels`
+
+Count of Labels
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181111_labels.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.ldap_group_links`
+
+Number of groups that are synced via LDAP group sync `https://docs.gitlab.com/ee/user/group/index.html#manage-group-memberships-via-ldap`
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216174822_ldap_group_links.yml)
+
+Group: `group::access`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.ldap_keys`
+
+Number of keys synced as part of LDAP `https://docs.gitlab.com/ee/administration/auth/ldap/#ldap-sync-configuration-settings`
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216174824_ldap_keys.yml)
+
+Group: `group::access`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.ldap_users`
+
+Number of users that are linked to LDAP
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174826_ldap_users.yml)
+
+Group: `group::access`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.lfs_objects`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181009_lfs_objects.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.license_management_jobs`
Name on the GitLab license
-| field | value |
-| --- | --- |
-| `key_path` | **`counts.license_management_jobs`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | number |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | Database |
-| `distribution` | |
-| `tier` | premium, ultimate |
-| `skip_validation` | true |
-
-## `counts_monthly.deployments`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210204124854_license_management_jobs.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.licenses_list_views`
+
+Count to License List page views
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210216175210_licenses_list_views.yml)
+
+Group: `group::composition analysis`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `counts.merge_request_comment`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175041_merge_request_comment.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.merge_request_create`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175043_merge_request_create.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.merge_requests`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175039_merge_requests.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.merged_merge_requests_using_approval_rules`
+
+Count of merge requests merged using approval rules
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175206_merged_merge_requests_using_approval_rules.yml)
+
+Group: `group::compliance`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.milestone_lists`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181106_milestone_lists.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.milestones`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181108_milestones.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.navbar_searches`
+
+Total Searches using the navbar for All Basic Search and Advanced Search in self-managed and SaaS
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180414_navbar_searches.yml)
+
+Group: `group::global search`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.network_policy_drops`
+
+Cumulative count of packets dropped by Cilium (Container Network Security) since Usage Ping was last reported
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175448_network_policy_drops.yml)
+
+Group: `group::container security`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.network_policy_forwards`
+
+Cumulative count of packets forwarded by Cilium (Container Network Security) since Usage Ping was last reported
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175446_network_policy_forwards.yml)
+
+Group: `group::container security`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.notes`
+
+Count of Notes across all objects that use them
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181113_notes.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.operations_dashboard_default_dashboard`
+
+Active users with enabled operations dashboard
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180942_operations_dashboard_default_dashboard.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.operations_dashboard_users_with_projects_added`
+
+Active users with projects on operations dashboard
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180944_operations_dashboard_users_with_projects_added.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_composer_delete_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182855_package_events_i_package_composer_delete_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_composer_pull_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182857_package_events_i_package_composer_pull_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_composer_push_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182859_package_events_i_package_composer_push_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_conan_delete_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182901_package_events_i_package_conan_delete_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_conan_pull_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182903_package_events_i_package_conan_pull_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_conan_push_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182905_package_events_i_package_conan_push_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_container_delete_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182907_package_events_i_package_container_delete_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_container_pull_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182909_package_events_i_package_container_pull_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_container_push_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182911_package_events_i_package_container_push_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_debian_delete_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182913_package_events_i_package_debian_delete_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_debian_pull_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182915_package_events_i_package_debian_pull_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_debian_push_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182917_package_events_i_package_debian_push_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_delete_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182919_package_events_i_package_delete_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_delete_package_by_deploy_token`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182921_package_events_i_package_delete_package_by_deploy_token.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_delete_package_by_guest`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182923_package_events_i_package_delete_package_by_guest.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_delete_package_by_user`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182925_package_events_i_package_delete_package_by_user.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_generic_delete_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182927_package_events_i_package_generic_delete_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_generic_pull_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182929_package_events_i_package_generic_pull_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_generic_push_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182931_package_events_i_package_generic_push_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_golang_delete_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182933_package_events_i_package_golang_delete_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_golang_pull_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182934_package_events_i_package_golang_pull_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_golang_push_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182936_package_events_i_package_golang_push_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_maven_delete_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182938_package_events_i_package_maven_delete_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_maven_pull_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182940_package_events_i_package_maven_pull_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_maven_push_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182942_package_events_i_package_maven_push_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_npm_delete_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182944_package_events_i_package_npm_delete_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_npm_pull_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182946_package_events_i_package_npm_pull_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_npm_push_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182948_package_events_i_package_npm_push_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_nuget_delete_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182950_package_events_i_package_nuget_delete_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_nuget_pull_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182952_package_events_i_package_nuget_pull_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_nuget_push_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182954_package_events_i_package_nuget_push_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_pull_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182956_package_events_i_package_pull_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_pull_package_by_deploy_token`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182958_package_events_i_package_pull_package_by_deploy_token.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_pull_package_by_guest`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183000_package_events_i_package_pull_package_by_guest.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_pull_package_by_user`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183002_package_events_i_package_pull_package_by_user.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_push_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183004_package_events_i_package_push_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_push_package_by_deploy_token`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183005_package_events_i_package_push_package_by_deploy_token.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_push_package_by_guest`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183007_package_events_i_package_push_package_by_guest.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_push_package_by_user`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183009_package_events_i_package_push_package_by_user.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_pypi_delete_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183011_package_events_i_package_pypi_delete_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_pypi_pull_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183013_package_events_i_package_pypi_pull_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_pypi_push_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183015_package_events_i_package_pypi_push_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_tag_delete_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183017_package_events_i_package_tag_delete_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_tag_pull_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183019_package_events_i_package_tag_pull_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.package_events_i_package_tag_push_package`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183021_package_events_i_package_tag_push_package.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.packages`
+
+Number of packages
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181012_packages.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.pages_domains`
+
+Total GitLab Pages domains
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181946_pages_domains.yml)
+
+Group: `group::release management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.personal_snippets`
+
+Count of Personal Snippets
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180239_personal_snippets.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.pod_logs_usages_total`
+
+Count the total number of log views
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175021_pod_logs_usages_total.yml)
+
+Group: `group::apm`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.pool_repositories`
+
+Count of unique object pool repositories for fork deduplication
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180410_pool_repositories.yml)
+
+Group: `group::gitaly`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.productivity_analytics_views`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174834_productivity_analytics_views.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.project_clusters_disabled`
+
+Total GitLab Managed disabled clusters previously attached to projects
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175244_project_clusters_disabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.project_clusters_enabled`
+
+Total GitLab Managed clusters attached to projects
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175236_project_clusters_enabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.project_snippets`
+
+Count of Project Snippetss
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180241_project_snippets.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects`
+
+Count of Projects
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181254_projects.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_asana_active`
+
+Count of projects with active integrations for Asana
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175623_projects_asana_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_assembla_active`
+
+Count of projects with active integrations for Assembla
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175634_projects_assembla_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_bamboo_active`
+
+Count of projects with active integrations for Bamboo CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175645_projects_bamboo_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_bugzilla_active`
+
+Count of projects with active integrations for Bugzilla
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175657_projects_bugzilla_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_buildkite_active`
+
+Count of projects with active integrations for Buildkite
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175708_projects_buildkite_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_campfire_active`
+
+Count of projects with active integrations for Campfire
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175719_projects_campfire_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_confluence_active`
+
+Count of projects with active integrations for Confluence
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175731_projects_confluence_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_creating_incidents`
+
+Counts of Projects that have created incidents
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180453_projects_creating_incidents.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_custom_issue_tracker_active`
+
+Count of projects with active integrations for a Custom Issue Tracker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175742_projects_custom_issue_tracker_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_datadog_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182547_projects_datadog_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_discord_active`
+
+Count of projects with active integrations for Discord
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175753_projects_discord_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_drone_ci_active`
+
+Count of projects with active integrations for Drone CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175804_projects_drone_ci_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_emails_on_push_active`
+
+Count of projects with active integrations for Emails on Push
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175815_projects_emails_on_push_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_ewm_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182614_projects_ewm_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_external_wiki_active`
+
+Count of projects with active integrations for External Wiki
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175826_projects_external_wiki_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_flowdock_active`
+
+Count of projects with active integrations for Flowdock
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175837_projects_flowdock_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_github_active`
+
+Count of projects with active integrations for GitHub
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175848_projects_github_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_hangouts_chat_active`
+
+Count of projects with active integrations for Hangouts Chat
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175859_projects_hangouts_chat_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_hipchat_active`
+
+Count of projects with active integrations for HipChat
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175910_projects_hipchat_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_imported_from_github`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180628_projects_imported_from_github.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_inheriting_asana_active`
+
+Count of active projects inheriting integrations for Asana
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175630_projects_inheriting_asana_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_assembla_active`
+
+Count of active projects inheriting integrations for Assembla
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175642_projects_inheriting_assembla_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_bamboo_active`
+
+Count of active projects inheriting integrations for Bamboo CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175653_projects_inheriting_bamboo_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_bugzilla_active`
+
+Count of active projects inheriting integrations for Bugzilla
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175704_projects_inheriting_bugzilla_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_buildkite_active`
+
+Count of active projects inheriting integrations for Buildkite
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175716_projects_inheriting_buildkite_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_campfire_active`
+
+Count of active projects inheriting integrations for Campfire
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175727_projects_inheriting_campfire_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_confluence_active`
+
+Count of active projects inheriting integrations for Confluence
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175738_projects_inheriting_confluence_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_custom_issue_tracker_active`
+
+Count of active projects inheriting integrations for a Custom Issue Tracker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175749_projects_inheriting_custom_issue_tracker_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_datadog_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182555_projects_inheriting_datadog_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_inheriting_discord_active`
+
+Count of active projects inheriting integrations for Discord
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175800_projects_inheriting_discord_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_drone_ci_active`
+
+Count of active projects inheriting integrations for Drone CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175811_projects_inheriting_drone_ci_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_emails_on_push_active`
+
+Count of active projects inheriting integrations for Emails on Push
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175822_projects_inheriting_emails_on_push_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_ewm_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182622_projects_inheriting_ewm_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_inheriting_external_wiki_active`
+
+Count of active projects inheriting integrations for External Wiki
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175833_projects_inheriting_external_wiki_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_flowdock_active`
+
+Count of active projects inheriting integrations for Flowdock
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175844_projects_inheriting_flowdock_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_github_active`
+
+Count of active projects inheriting integrations for GitHub
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175855_projects_inheriting_github_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_hangouts_chat_active`
+
+Count of active projects inheriting integrations for Hangouts Chat
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175906_projects_inheriting_hangouts_chat_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_hipchat_active`
+
+Count of active projects inheriting integrations for HipChat
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175917_projects_inheriting_hipchat_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_irker_active`
+
+Count of active projects inheriting integrations for Irker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175928_projects_inheriting_irker_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_jenkins_active`
+
+Count of active projects inheriting integrations for Jenkins
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175939_projects_inheriting_jenkins_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_jira_active`
+
+Count of active projects inheriting integrations for Jira
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175950_projects_inheriting_jira_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_mattermost_active`
+
+Count of active projects inheriting integrations for Mattermost
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180001_projects_inheriting_mattermost_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_mattermost_slash_commands_active`
+
+Count of active projects inheriting integrations for Mattermost (slash commands)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180012_projects_inheriting_mattermost_slash_commands_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_microsoft_teams_active`
+
+Count of active projects inheriting integrations for Microsoft Teams
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180023_projects_inheriting_microsoft_teams_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_mock_ci_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182730_projects_inheriting_mock_ci_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_inheriting_mock_monitoring_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182741_projects_inheriting_mock_monitoring_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_inheriting_packagist_active`
+
+Count of active projects inheriting integrations for Packagist
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180034_projects_inheriting_packagist_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_pipelines_email_active`
+
+Count of active projects inheriting integrations for Pipeline Emails
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180045_projects_inheriting_pipelines_email_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_pivotaltracker_active`
+
+Count of active projects inheriting integrations for Pivotal Tracker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180056_projects_inheriting_pivotaltracker_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_prometheus_active`
+
+Count of active projects inheriting integrations for Prometheus
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180938_projects_inheriting_prometheus_active.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_pushover_active`
+
+Count of active projects inheriting integrations for Pushover
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180107_projects_inheriting_pushover_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_redmine_active`
+
+Count of active projects inheriting integrations for Redmine
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180118_projects_inheriting_redmine_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_slack_active`
+
+Count of active projects inheriting integrations for Slack
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180129_projects_inheriting_slack_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_slack_slash_commands_active`
+
+Count of active projects inheriting integrations for Slack (slash commands)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180140_projects_inheriting_slack_slash_commands_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_teamcity_active`
+
+Count of active projects inheriting integrations for Teamcity CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180151_projects_inheriting_teamcity_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_unify_circuit_active`
+
+Count of active projects inheriting integrations for Unifiy Circuit
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180203_projects_inheriting_unify_circuit_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_webex_teams_active`
+
+Count of active projects inheriting integrations for Webex Teams
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180214_projects_inheriting_webex_teams_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_youtrack_active`
+
+Count of active projects inheriting integrations for YouTrack
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180225_projects_inheriting_youtrack_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_irker_active`
+
+Count of projects with active integrations for Irker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175921_projects_irker_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_jenkins_active`
+
+Count of projects with active integrations for Jenkins
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175932_projects_jenkins_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_jira_active`
+
+Count of projects with active integrations for Jira
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175943_projects_jira_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_jira_cloud_active`
+
+Count of active integrations with Jira Cloud (Saas)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180230_projects_jira_cloud_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_jira_dvcs_cloud_active`
+
+Count of active integrations with Jira Cloud (DVCS Connector)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180232_projects_jira_dvcs_cloud_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_jira_dvcs_server_active`
+
+Count of active integrations with Jira Software (DVCS connector)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180234_projects_jira_dvcs_server_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_jira_issuelist_active`
+
+Total Jira Issue feature enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216180236_projects_jira_issuelist_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.projects_jira_server_active`
+
+Count of active integrations with Jira Software (server)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180228_projects_jira_server_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_mattermost_active`
+
+Count of projects with active integrations for Mattermost
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175954_projects_mattermost_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_mattermost_slash_commands_active`
+
+Count of projects with active integrations for Mattermost (slash commands)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180005_projects_mattermost_slash_commands_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_microsoft_teams_active`
+
+Count of projects with active integrations for Microsoft Teams
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180016_projects_microsoft_teams_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_mirrored_with_pipelines_enabled`
+
+Projects with repository mirroring enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181920_projects_mirrored_with_pipelines_enabled.yml)
+
+Group: `group::release`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_mock_ci_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182722_projects_mock_ci_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_mock_monitoring_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182734_projects_mock_monitoring_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_packagist_active`
+
+Count of projects with active integrations for Packagist
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180027_projects_packagist_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_pipelines_email_active`
+
+Count of projects with active integrations for Pipeline Emails
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180038_projects_pipelines_email_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_pivotaltracker_active`
+
+Count of projects with active integrations for Pivotal Tracker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180049_projects_pivotaltracker_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_prometheus_active`
+
+Count of projects with active integrations for Prometheus
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180931_projects_prometheus_active.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_pushover_active`
+
+Count of projects with active integrations for Pushover
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180100_projects_pushover_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_redmine_active`
+
+Count of projects with active integrations for Redmine
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180111_projects_redmine_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_reporting_ci_cd_back_to_github`
+
+Projects with a GitHub service pipeline enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182212_projects_reporting_ci_cd_back_to_github.yml)
+
+Group: `group::continuous_integration`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.projects_slack_active`
+
+Count of projects with active integrations for Slack
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180122_projects_slack_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_slack_slash_commands_active`
+
+Count of projects with active integrations for Slack (slash commands)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180133_projects_slack_slash_commands_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_teamcity_active`
+
+Count of projects with active integrations for Teamcity CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180144_projects_teamcity_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_unify_circuit_active`
+
+Count of projects with active integrations for Unifiy Circuit
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180155_projects_unify_circuit_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_webex_teams_active`
+
+Count of projects with active integrations for Webex Teams
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180206_projects_webex_teams_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_with_alerts_created`
+
+Count of projects with alerts created in given time period
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180458_projects_with_alerts_created.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_with_alerts_service_enabled`
+
+Count of projects that have enabled the Alerts service
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180456_projects_with_alerts_service_enabled.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_with_enabled_alert_integrations`
+
+Count of projects with at least 1 enabled integration
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180500_projects_with_enabled_alert_integrations.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_with_error_tracking_enabled`
+
+Count of projects that have enabled Error tracking via Sentry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180454_projects_with_error_tracking_enabled.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_with_expiration_policy_disabled`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181014_projects_with_expiration_policy_disabled.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_with_expiration_policy_enabled`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181016_projects_with_expiration_policy_enabled.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_with_expiration_policy_enabled_with_cadence_set_to_14d`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181033_projects_with_expiration_policy_enabled_with_cadence_set_to_14d.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_with_expiration_policy_enabled_with_cadence_set_to_1d`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181029_projects_with_expiration_policy_enabled_with_cadence_set_to_1d.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_with_expiration_policy_enabled_with_cadence_set_to_1month`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181035_projects_with_expiration_policy_enabled_with_cadence_set_to_1month.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_with_expiration_policy_enabled_with_cadence_set_to_3month`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181037_projects_with_expiration_policy_enabled_with_cadence_set_to_3month.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_with_expiration_policy_enabled_with_cadence_set_to_7d`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181031_projects_with_expiration_policy_enabled_with_cadence_set_to_7d.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_with_expiration_policy_enabled_with_keep_n_set_to_1`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216181018_projects_with_expiration_policy_enabled_with_keep_n_set_to_1.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers:
+
+### `counts.projects_with_expiration_policy_enabled_with_keep_n_set_to_10`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216181022_projects_with_expiration_policy_enabled_with_keep_n_set_to_10.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers:
+
+### `counts.projects_with_expiration_policy_enabled_with_keep_n_set_to_100`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216181027_projects_with_expiration_policy_enabled_with_keep_n_set_to_100.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers:
+
+### `counts.projects_with_expiration_policy_enabled_with_keep_n_set_to_25`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216181024_projects_with_expiration_policy_enabled_with_keep_n_set_to_25.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers:
+
+### `counts.projects_with_expiration_policy_enabled_with_keep_n_set_to_5`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216181020_projects_with_expiration_policy_enabled_with_keep_n_set_to_5.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers:
+
+### `counts.projects_with_expiration_policy_enabled_with_keep_n_set_to_50`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216181025_projects_with_expiration_policy_enabled_with_keep_n_set_to_50.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers:
+
+### `counts.projects_with_expiration_policy_enabled_with_keep_n_unset`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216181046_projects_with_expiration_policy_enabled_with_keep_n_unset.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers:
+
+### `counts.projects_with_expiration_policy_enabled_with_older_than_set_to_14d`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181040_projects_with_expiration_policy_enabled_with_older_than_set_to_14d.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_with_expiration_policy_enabled_with_older_than_set_to_30d`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181042_projects_with_expiration_policy_enabled_with_older_than_set_to_30d.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_with_expiration_policy_enabled_with_older_than_set_to_7d`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181038_projects_with_expiration_policy_enabled_with_older_than_set_to_7d.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_with_expiration_policy_enabled_with_older_than_set_to_90d`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181044_projects_with_expiration_policy_enabled_with_older_than_set_to_90d.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_with_expiration_policy_enabled_with_older_than_unset`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181048_projects_with_expiration_policy_enabled_with_older_than_unset.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_with_packages`
+
+Projects with package registry configured
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181011_projects_with_packages.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_with_prometheus_alerts`
+
+Projects with Prometheus alerting enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175019_projects_with_prometheus_alerts.yml)
+
+Group: `group::apm`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_with_repositories_enabled`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181959_projects_with_repositories_enabled.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_with_terraform_reports`
+
+Count of projects with Terraform MR reports
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175320_projects_with_terraform_reports.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_with_terraform_states`
+
+Count of projects with GitLab Managed Terraform State
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175322_projects_with_terraform_states.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_with_tracing_enabled`
+
+Projects with tracing enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180929_projects_with_tracing_enabled.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_youtrack_active`
+
+Count of projects with active integrations for YouTrack
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180217_projects_youtrack_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.protected_branches`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182001_protected_branches.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.protected_branches_except_default`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182454_protected_branches_except_default.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.releases`
+
+Unique release tags
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181918_releases.yml)
+
+Group: `group::release`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.remote_mirrors`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182002_remote_mirrors.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.requirement_test_reports_ci`
+
+Count of requirement test reports created from CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175032_requirement_test_reports_ci.yml)
+
+Group: `group::certify`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `counts.requirement_test_reports_manual`
+
+Count of requirement test reports created manually
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175030_requirement_test_reports_manual.yml)
+
+Group: `group::certify`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `counts.requirements_created`
+
+Count of requirements created
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175028_requirements_created.yml)
+
+Group: `group::certify`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.requirements_with_test_report`
+
+Count of requirements having a test report
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175034_requirements_with_test_report.yml)
+
+Group: `group::certify`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `counts.sast_jobs`
+
+Count of SAST CI jobs for the month. Job names ending in '-sast'
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182112_sast_jobs.yml)
+
+Group: `group::static analysis`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.secret_detection_jobs`
+
+Count of 'secret-detection' CI jobs fro the month.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182114_secret_detection_jobs.yml)
+
+Group: `group::static analysis`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.service_desk_enabled_projects`
+
+Count of service desk enabled projects
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175024_service_desk_enabled_projects.yml)
+
+Group: `group::certify`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.service_desk_issues`
+
+Count of service desk issues
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175026_service_desk_issues.yml)
+
+Group: `group::certify`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.snippet_comment`
+
+Count of comments on Snippets
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180253_snippet_comment.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.snippet_create`
+
+Count of newly created Snippets
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180255_snippet_create.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.snippet_update`
+
+Count of updates to existing Snippets
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180257_snippet_update.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.snippets`
+
+Count of all Snippets
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180306_snippets.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.source_code_pushes`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182006_source_code_pushes.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.static_site_editor_commits`
+
+Count of commits created via Static Site Editor
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180301_static_site_editor_commits.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.static_site_editor_merge_requests`
+
+Count of merge requests created via Static Site Editor
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180303_static_site_editor_merge_requests.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.static_site_editor_views`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180259_static_site_editor_views.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.status_page_incident_publishes`
+
+Cumulative count of usages of publish operation
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180502_status_page_incident_publishes.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.status_page_incident_unpublishes`
+
+Cumulative count of usages of unpublish operation
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180504_status_page_incident_unpublishes.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.status_page_issues`
+
+Issues published to a Status Page
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180507_status_page_issues.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.status_page_projects`
+
+Projects with status page enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180506_status_page_projects.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.successful_deployments`
+
+Total successful deployments
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181911_successful_deployments.yml)
+
+Group: `group::release`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.suggestions`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175037_suggestions.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.template_repositories`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182008_template_repositories.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.templates_asana_active`
+
+Count of active service templates for Asana
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175627_templates_asana_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_assembla_active`
+
+Count of active service templates for Assembla
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175638_templates_assembla_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_bamboo_active`
+
+Count of active service templates for Bamboo CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175649_templates_bamboo_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_bugzilla_active`
+
+Count of active service templates for Bugzilla
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175701_templates_bugzilla_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_buildkite_active`
+
+Count of active service templates for Buildkite
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175712_templates_buildkite_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_campfire_active`
+
+Count of active service templates for Campfire
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175723_templates_campfire_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_confluence_active`
+
+Count of active service templates for Confluence
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175734_templates_confluence_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_custom_issue_tracker_active`
+
+Count of active service templates for a Custom Issue Tracker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175745_templates_custom_issue_tracker_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_datadog_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182551_templates_datadog_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.templates_discord_active`
+
+Count of active service templates for Discord
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175756_templates_discord_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_drone_ci_active`
+
+Count of active service templates for Drone CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175807_templates_drone_ci_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_emails_on_push_active`
+
+Count of active service templates for Emails on Push
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175818_templates_emails_on_push_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_ewm_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182618_templates_ewm_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.templates_external_wiki_active`
+
+Count of active service templates for External Wiki
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175829_templates_external_wiki_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_flowdock_active`
+
+Count of active service templates for Flowdock
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175840_templates_flowdock_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_github_active`
+
+Count of active service templates for GitHub
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175851_templates_github_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_hangouts_chat_active`
+
+Count of active service templates for Hangouts Chat
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175902_templates_hangouts_chat_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_hipchat_active`
+
+Count of active service templates for HipChat
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175913_templates_hipchat_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_irker_active`
+
+Count of active service templates for Irker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175924_templates_irker_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_jenkins_active`
+
+Count of active service templates for Jenkins
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175935_templates_jenkins_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_jira_active`
+
+Count of active service templates for Jira
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175946_templates_jira_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_mattermost_active`
+
+Count of active service templates for Mattermost
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175957_templates_mattermost_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_mattermost_slash_commands_active`
+
+Count of active service templates for Mattermost (slash commands)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180008_templates_mattermost_slash_commands_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_microsoft_teams_active`
+
+Count of active service templates for Microsoft Teams
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180019_templates_microsoft_teams_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_mock_ci_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182726_templates_mock_ci_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.templates_mock_monitoring_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182738_templates_mock_monitoring_active.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.templates_packagist_active`
+
+Count of active service templates for Packagist
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180030_templates_packagist_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_pipelines_email_active`
+
+Count of active service templates for Pipeline Emails
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180041_templates_pipelines_email_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_pivotaltracker_active`
+
+Count of active service templates for Pivotal Tracker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180052_templates_pivotaltracker_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_prometheus_active`
+
+Count of active service templates for Prometheus
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180934_templates_prometheus_active.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_pushover_active`
+
+Count of active service templates for Pushover
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180104_templates_pushover_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_redmine_active`
+
+Count of active service templates for Redmine
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180115_templates_redmine_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_slack_active`
+
+Count of active service templates for Slack
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180126_templates_slack_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_slack_slash_commands_active`
+
+Count of active service templates for Slack (slash commands)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180137_templates_slack_slash_commands_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_teamcity_active`
+
+Count of active service templates for Teamcity CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180148_templates_teamcity_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_unify_circuit_active`
+
+Count of active service templates for Unifiy Circuit
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180159_templates_unify_circuit_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_webex_teams_active`
+
+Count of active service templates for Webex Teams
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180210_templates_webex_teams_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_youtrack_active`
+
+Count of active service templates for YouTrack
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180221_templates_youtrack_active.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.terraform_reports`
+
+Count of Terraform MR reports generated
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175324_terraform_reports.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.terraform_states`
+
+Count of GitLab Managed Terraform States used
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175326_terraform_states.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.todos`
+
+Count of ToDos
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181256_todos.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.uploads`
+
+Count of Uploads via Notes and Descriptions
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181109_uploads.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.user_preferences_group_overview_details`
+
+Count of users who set personal preference to see Details on Group overview page
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182203_user_preferences_group_overview_details.yml)
+
+Group: `group::threat insights`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `counts.user_preferences_group_overview_security_dashboard`
+
+Count of users who set personal preference to see Security Dashboard on Group overview page
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182205_user_preferences_group_overview_security_dashboard.yml)
+
+Group: `group::threat insights`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `counts.user_preferences_user_gitpod_enabled`
+
+Count all users with their GitPod setting enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180304_user_preferences_user_gitpod_enabled.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.web_hooks`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175621_web_hooks.yml)
+
+Group: `group::ecosystem`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.web_ide_commits`
+
+Count of Commits made from Web IDE
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180242_web_ide_commits.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.web_ide_merge_requests`
+
+Count of Merge Requests created from Web IDE
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180246_web_ide_merge_requests.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.web_ide_pipelines`
+
+Count of Pipeline tab views in Web IDE
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180252_web_ide_pipelines.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.web_ide_previews`
+
+Count of Live Preview tab views in Web IDE
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180248_web_ide_previews.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.web_ide_terminals`
+
+Count of Web Terminal Tab views in Web IDE
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180250_web_ide_terminals.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.web_ide_views`
+
+Count of Views of the Web IDE
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180244_web_ide_views.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.wiki_pages_create`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180734_wiki_pages_create.yml)
+
+Group: `group::knowledge`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.wiki_pages_delete`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180738_wiki_pages_delete.yml)
+
+Group: `group::knowledge`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.wiki_pages_update`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180736_wiki_pages_update.yml)
+
+Group: `group::knowledge`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.wiki_pages_view`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183023_wiki_pages_view.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts_monthly.aggregated_metrics.compliance_features_track_unique_visits_union`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183201_compliance_features_track_unique_visits_union.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts_monthly.aggregated_metrics.i_testing_paid_monthly_active_user_total`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183209_i_testing_paid_monthly_active_user_total.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts_monthly.aggregated_metrics.incident_management_alerts_total_unique_counts`
+
+Count of unique users per month to take an action on an alert
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180509_incident_management_alerts_total_unique_counts.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts_monthly.aggregated_metrics.incident_management_incidents_total_unique_counts`
+
+Count of unique users per month to take an action on an incident
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180511_incident_management_incidents_total_unique_counts.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts_monthly.aggregated_metrics.product_analytics_test_metrics_intersection`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183205_product_analytics_test_metrics_intersection.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts_monthly.aggregated_metrics.product_analytics_test_metrics_union`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183203_product_analytics_test_metrics_union.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts_monthly.deployments`
Total deployments count for recent 28 days
-| field | value |
-| --- | --- |
-| `key_path` | **`counts_monthly.deployments`** |
-| `product_section` | ops |
-| `product_stage` | release |
-| `product_group` | `group::ops release` |
-| `product_category` | |
-| `value_type` | number |
-| `status` | data_available |
-| `milestone` | 13.2 |
-| `introduced_by_url` | [Introduced by](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/35493) |
-| `time_frame` | 28d |
-| `data_source` | Database |
-| `distribution` | ee, ce |
-| `tier` | free, premium, ultimate |
-
-## `database.adapter`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210201124930_deployments.yml)
+
+Group: `group::ops release`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts_monthly.failed_deployments`
+
+Total failed deployments
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181924_failed_deployments.yml)
+
+Group: `group::release`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts_monthly.packages`
+
+Monthly count of Packages
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181050_packages.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts_monthly.personal_snippets`
+
+Monthly count of Personal Snippets
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180308_personal_snippets.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts_monthly.project_snippets`
+
+Monthly count of Project Snippets
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180310_project_snippets.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts_monthly.projects_with_alerts_created`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183159_projects_with_alerts_created.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts_monthly.snippets`
+
+Monthly count of All Snippets
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180312_snippets.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts_monthly.successful_deployments`
+
+Total successful deployments
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181923_successful_deployments.yml)
+
+Group: `group::release`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts_weekly.aggregated_metrics.compliance_features_track_unique_visits_union`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216183211_compliance_features_track_unique_visits_union.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `counts_weekly.aggregated_metrics.i_testing_paid_monthly_active_user_total`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216183219_i_testing_paid_monthly_active_user_total.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `counts_weekly.aggregated_metrics.incident_management_alerts_total_unique_counts`
+
+Count of unique users per week to take an action on an alert
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180513_incident_management_alerts_total_unique_counts.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers:
+
+### `counts_weekly.aggregated_metrics.incident_management_incidents_total_unique_counts`
+
+Count of unique users per week to take an action on an incident
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180515_incident_management_incidents_total_unique_counts.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers:
+
+### `counts_weekly.aggregated_metrics.product_analytics_test_metrics_intersection`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216183215_product_analytics_test_metrics_intersection.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `counts_weekly.aggregated_metrics.product_analytics_test_metrics_union`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216183213_product_analytics_test_metrics_union.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `database.adapter`
This metric only returns a value of PostgreSQL in supported versions of GitLab. It could be removed from the usage ping. Historically MySQL was also supported.
-| field | value |
-| --- | --- |
-| `key_path` | **`database.adapter`** |
-| `product_section` | enablement |
-| `product_stage` | enablement |
-| `product_group` | `group::enablement distribution` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | Database |
-| `distribution` | ee, ce |
-| `tier` | free, premium, ultimate |
-
-## `dependency_proxy_enabled`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210201124935_database_adapter.yml)
+
+Group: `group::enablement distribution`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `database.pg_system_id`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183248_pg_system_id.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `database.version`
+
+The version of the PostgreSQL database.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210216175609_version.yml)
+
+Group: `group::distribution`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `dependency_proxy_enabled`
Whether dependency proxy is enabled
-| field | value |
-| --- | --- |
-| `key_path` | **`dependency_proxy_enabled`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | boolean |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `elasticsearch_enabled`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124900_dependency_proxy_enabled.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `edition`
+
+Edition of GitLab such as EE, CE, Bronze, Silver, Gold
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210216175604_edition.yml)
+
+Group: `group::distribution`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `elasticsearch_enabled`
Whether Elasticsearch is enabled
-| field | value |
-| --- | --- |
-| `key_path` | **`elasticsearch_enabled`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | boolean |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `gitaly.clusters`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/settings/20210204124924_elasticsearch_enabled.yml)
+
+Group: `group::global search`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `g_project_management_epic_created_monthly`
+
+Count of MAU creating epics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210305144719_g_product_planning_epic_created_monthly.yml)
+
+Group: `group::product planning`
+
+Status: `implemented`
+
+Tiers: `premium`, `ultimate`
+
+### `g_project_management_epic_created_weekly`
+
+Count of WAU creating epics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210305145820_g_product_planning_epic_created_weekly.yml)
+
+Group: `group::product planning`
+
+Status: `implemented`
+
+Tiers: `premium`, `ultimate`
+
+### `geo_enabled`
+
+Is Geo enabled?
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/settings/20210216180406_geo_enabled.yml)
+
+Group: `group::geo`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `git.version`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210216183237_version.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `gitaly.clusters`
Total GitLab Managed clusters both enabled and disabled
-| field | value |
-| --- | --- |
-| `key_path` | **`gitaly.clusters`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | number |
-| `status` | data_available |
-| `time_frame` | all |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `gitaly.servers`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210204124932_clusters.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `gitaly.filesystems`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183241_filesystems.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `gitaly.servers`
Total Gitalty Servers
-| field | value |
-| --- | --- |
-| `key_path` | **`gitaly.servers`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | number |
-| `status` | data_available |
-| `time_frame` | all |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `gitaly.version`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210204124930_servers.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `gitaly.version`
Version of Gitaly
-| field | value |
-| --- | --- |
-| `key_path` | **`gitaly.version`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `gitlab_pages.enabled`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210204124928_version.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `gitlab_pages.enabled`
Whether GitLab Pages is enabled
-| field | value |
-| --- | --- |
-| `key_path` | **`gitlab_pages.enabled`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | boolean |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `gitlab_pages.version`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124934_enabled.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `gitlab_pages.version`
The version number of GitLab Pages
-| field | value |
-| --- | --- |
-| `key_path` | **`gitlab_pages.version`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `gitlab_shared_runners_enabled`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210204124936_version.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `gitlab_shared_runners_enabled`
Whether shared runners is enabled
-| field | value |
-| --- | --- |
-| `key_path` | **`gitlab_shared_runners_enabled`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | boolean |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `grafana_link_enabled`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124902_gitlab_shared_runners_enabled.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `gitpod_enabled`
+
+Whether gitpod is enabled in the instance
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180314_gitpod_enabled.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `grafana_link_enabled`
Whether Grafana is enabled
-| field | value |
-| --- | --- |
-| `key_path` | **`grafana_link_enabled`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | boolean |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `gravatar_enabled`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124922_grafana_link_enabled.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `gravatar_enabled`
Whether gravatar is enabled
-| field | value |
-| --- | --- |
-| `key_path` | **`gravatar_enabled`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | boolean |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `historical_max_users`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124904_gravatar_enabled.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `historical_max_users`
The maximum active user count. Active is defined in UsersStatistics model.
-| field | value |
-| --- | --- |
-| `key_path` | **`historical_max_users`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | ee |
-| `tier` | premium, ultimate |
-| `skip_validation` | true |
-
-## `hostname`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210204124835_historical_max_users.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `hostname`
Host name of GitLab instance
-| field | value |
-| --- | --- |
-| `key_path` | **`hostname`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | ce, ee |
-| `tier` | free, premium, ultimate |
-| `skip_validation` | true |
-
-## `instance_auto_devops_enabled`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210204124827_hostname.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `ingress_modsecurity_enabled`
+
+Whether or not ModSecurity is enabled within Ingress
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216175459_ingress_modsecurity_enabled.yml)
+
+Group: `group::container security`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `installation_type`
+
+The installation method used to install GitLab (Omnibus, Helm, etc)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210216175602_installation_type.yml)
+
+Group: `group::distribution`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `instance_auto_devops_enabled`
Whether auto DevOps is enabled
-| field | value |
-| --- | --- |
-| `key_path` | **`instance_auto_devops_enabled`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | boolean |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `ldap_enabled`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124856_instance_auto_devops_enabled.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `ldap_enabled`
Whether LDAP is enabled
-| field | value |
-| --- | --- |
-| `key_path` | **`ldap_enabled`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | boolean |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `license_expires_at`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124906_ldap_enabled.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `license_expires_at`
The date the license ends
-| field | value |
-| --- | --- |
-| `key_path` | **`license_expires_at`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | ee |
-| `tier` | premium, ultimate |
-| `skip_validation` | true |
-
-## `license_id`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210204124847_license_expires_at.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `license_id`
The ID of the license
-| field | value |
-| --- | --- |
-| `key_path` | **`license_id`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | ee |
-| `tier` | premium, ultimate |
-| `skip_validation` | true |
-
-## `license_md5`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210204124833_license_id.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `license_md5`
The license key of the GitLab instance
-| field | value |
-| --- | --- |
-| `key_path` | **`license_md5`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | ee |
-| `tier` | free, premium, ultimate |
-| `skip_validation` | true |
-
-## `license_plan`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210204124831_license_md5.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `license_plan`
The plan of the GitLab license
-| field | value |
-| --- | --- |
-| `key_path` | **`license_plan`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | ee |
-| `tier` | premium, ultimate |
-| `skip_validation` | true |
-
-## `license_starts_at`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210204124849_license_plan.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `license_starts_at`
The date the license starts
-| field | value |
-| --- | --- |
-| `key_path` | **`license_starts_at`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | ee |
-| `tier` | premium, ultimate |
-| `skip_validation` | true |
-
-## `license_subscription_id`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210204124845_license_starts_at.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `license_subscription_id`
Licese zuora_subscription_id
-| field | value |
-| --- | --- |
-| `key_path` | **`license_subscription_id`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | ee |
-| `tier` | premium, ultimate |
-| `skip_validation` | true |
-
-## `license_trial`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210204124852_license_subscription_id.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `license_trial`
Whether this is a trial license or not
-| field | value |
-| --- | --- |
-| `key_path` | **`license_trial`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | boolean |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | ee |
-| `tier` | premium, ultimate |
-| `skip_validation` | true |
-
-## `license_trial_ends_on`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/settings/20210204124851_license_trial.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `license_trial_ends_on`
Date the license ends on
-| field | value |
-| --- | --- |
-| `key_path` | **`license_trial_ends_on`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `license_user_count`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210204124926_license_trial_ends_on.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `license_user_count`
The number of users included in the license
-| field | value |
-| --- | --- |
-| `key_path` | **`license_user_count`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | Database |
-| `distribution` | ee |
-| `tier` | premium, ultimate |
-| `skip_validation` | true |
-
-## `licensee.Company`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210204124843_license_user_count.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `licensee.Company`
Company on the GitLab license
-| field | value |
-| --- | --- |
-| `key_path` | **`licensee.Company`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | ee |
-| `tier` | premium, ultimate |
-| `skip_validation` | true |
-
-## `licensee.Email`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210204124841_company.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `licensee.Email`
Email on the GitLab license
-| field | value |
-| --- | --- |
-| `key_path` | **`licensee.Email`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | ee |
-| `tier` | premium, ultimate |
-| `skip_validation` | true |
-
-## `licensee.Name`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210204124839_email.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `licensee.Name`
Name on the GitLab license
-| field | value |
-| --- | --- |
-| `key_path` | **`licensee.Name`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | ee |
-| `tier` | premium, ultimate |
-| `skip_validation` | true |
-
-## `mattermost_enabled`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210204124837_name.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `mail.smtp_server`
+
+The value of the SMTP server that is used
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174829_smtp_server.yml)
+
+Group: `group::acquisition`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `mattermost_enabled`
Whether Mattermost is enabled
-| field | value |
-| --- | --- |
-| `key_path` | **`mattermost_enabled`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | boolean |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `omniauth_enabled`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124908_mattermost_enabled.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `object_store.artifacts.enabled`
+
+Whether Object Storage is enabled for Artifacts
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180836_enabled.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.artifacts.object_store.background_upload`
+
+Whether Background Upload for Object Storage is enabled for Artifacts
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180841_background_upload.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.artifacts.object_store.direct_upload`
+
+Whether Direct Upload for Object Storage is enabled for Artifacts
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180840_direct_upload.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.artifacts.object_store.enabled`
+
+Whether Object Storage is enabled for Artifacts
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180838_enabled.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.artifacts.object_store.provider`
+
+What Object Storage provider has been configured for Artifacts
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180843_provider.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.external_diffs.enabled`
+
+Whether Object Storage is enabled for External Diffs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180845_enabled.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.external_diffs.object_store.background_upload`
+
+Whether Background Upload for Object Storage is enabled for External Diffs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180851_background_upload.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.external_diffs.object_store.direct_upload`
+
+Whether Direct Upload for Object Storage is enabled for External Diffs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180849_direct_upload.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.external_diffs.object_store.enabled`
+
+Whether Object Storage is enabled for External Diffs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180847_enabled.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.external_diffs.object_store.provider`
+
+What Object Storage provider has been configured for External Diffs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180852_provider.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.lfs.enabled`
+
+Whether Object Storage is enabled for LFS
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180854_enabled.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.lfs.object_store.background_upload`
+
+Whether Background Upload for Object Storage is enabled for LFS
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180900_background_upload.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.lfs.object_store.direct_upload`
+
+Whether Direct Upload for Object Storage is enabled for LFS
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180858_direct_upload.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.lfs.object_store.enabled`
+
+Whether Object Storage is enabled for LFS
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180856_enabled.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.lfs.object_store.provider`
+
+What Object Storage provider has been configured for LFS
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180902_provider.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.packages.enabled`
+
+Whether Object Storage is enabled for Uploads
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180913_enabled.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.packages.object_store.background_upload`
+
+Whether Background Upload for Object Storage is enabled for Packages
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180918_background_upload.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.packages.object_store.direct_upload`
+
+Whether Direct Upload for Object Storage is enabled for Packages
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180916_direct_upload.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.packages.object_store.enabled`
+
+Whether Object Storage is enabled for Packages
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180915_enabled.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.packages.object_store.provider`
+
+What Object Storage provider has been configured for Packages
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180920_provider.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.uploads.enabled`
+
+Whether Object Storage is enabled for Uploads
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180903_enabled.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.uploads.object_store.background_upload`
+
+Whether Background Upload for Object Storage is enabled for Uploads
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180909_background_upload.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.uploads.object_store.direct_upload`
+
+Whether Direct Upload for Object Storage is enabled for Uploads
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180907_direct_upload.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.uploads.object_store.enabled`
+
+Whether Object Storage is enabled for Uploads
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180905_enabled.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.uploads.object_store.provider`
+
+What Object Storage provider has been configured for Uploads
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180911_provider.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `omniauth_enabled`
Whether OmniAuth is enabled
-| field | value |
-| --- | --- |
-| `key_path` | **`omniauth_enabled`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | boolean |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `prometheus_enabled`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124910_omniauth_enabled.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `prometheus_enabled`
Whether the bundled Prometheus is enabled
-| field | value |
-| --- | --- |
-| `key_path` | **`prometheus_enabled`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | boolean |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `prometheus_metrics_enabled`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124912_prometheus_enabled.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `prometheus_metrics_enabled`
Whether Prometheus Metrics endpoint is enabled
-| field | value |
-| --- | --- |
-| `key_path` | **`prometheus_metrics_enabled`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | boolean |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `recorded_at`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124914_prometheus_metrics_enabled.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `recorded_at`
When the Usage Ping computation was started
-| field | value |
-| --- | --- |
-| `key_path` | **`recorded_at`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `milestone` | 8.1 |
-| `introduced_by_url` | [Introduced by](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/557) |
-| `time_frame` | none |
-| `data_source` | Ruby |
-| `distribution` | ee, ce |
-| `tier` | free, premium, ultimate |
-
-## `recording_ce_finished_at`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210201124932_recorded_at.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `recording_ce_finished_at`
When the core features were computed
-| field | value |
-| --- | --- |
-| `key_path` | **`recording_ce_finished_at`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | ce, ee |
-| `tier` | |
-| `skip_validation` | true |
-
-## `recording_ee_finished_at`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210204124938_recording_ce_finished_at.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `recording_ee_finished_at`
When the EE-specific features were computed
-| field | value |
-| --- | --- |
-| `key_path` | **`recording_ee_finished_at`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | ee |
-| `tier` | |
-| `skip_validation` | true |
-
-## `redis_hll_counters.issues_edit.g_project_management_issue_title_changed_weekly`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210204124940_recording_ee_finished_at.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.analytics_total_unique_counts_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175016_analytics_total_unique_counts_monthly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.analytics_total_unique_counts_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216175014_analytics_total_unique_counts_weekly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.g_analytics_contribution_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216174914_g_analytics_contribution_monthly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.g_analytics_contribution_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216174912_g_analytics_contribution_weekly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.g_analytics_insights_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216174918_g_analytics_insights_monthly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.g_analytics_insights_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216174916_g_analytics_insights_weekly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.g_analytics_issues_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216174921_g_analytics_issues_monthly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.g_analytics_issues_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216174919_g_analytics_issues_weekly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.g_analytics_merge_request_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175004_g_analytics_merge_request_monthly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.g_analytics_merge_request_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216175002_g_analytics_merge_request_weekly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.g_analytics_productivity_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216174926_g_analytics_productivity_monthly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.g_analytics_productivity_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216174923_g_analytics_productivity_weekly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.g_analytics_valuestream_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216174929_g_analytics_valuestream_monthly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.g_analytics_valuestream_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216174927_g_analytics_valuestream_weekly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.i_analytics_cohorts_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216174956_i_analytics_cohorts_monthly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.i_analytics_cohorts_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216174955_i_analytics_cohorts_weekly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.i_analytics_dev_ops_score_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175000_i_analytics_dev_ops_score_monthly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.i_analytics_dev_ops_score_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216174958_i_analytics_dev_ops_score_weekly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.i_analytics_instance_statistics_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175012_i_analytics_instance_statistics_monthly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.i_analytics_instance_statistics_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216175010_i_analytics_instance_statistics_weekly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.p_analytics_code_reviews_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216174937_p_analytics_code_reviews_monthly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.p_analytics_code_reviews_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216174935_p_analytics_code_reviews_weekly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.p_analytics_insights_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216174945_p_analytics_insights_monthly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.p_analytics_insights_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216174943_p_analytics_insights_weekly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.p_analytics_issues_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216174949_p_analytics_issues_monthly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.p_analytics_issues_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216174947_p_analytics_issues_weekly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.p_analytics_merge_request_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175008_p_analytics_merge_request_monthly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.p_analytics_merge_request_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216175006_p_analytics_merge_request_weekly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.p_analytics_pipelines_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216174933_p_analytics_pipelines_monthly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.p_analytics_pipelines_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216174931_p_analytics_pipelines_weekly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.p_analytics_repo_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216174953_p_analytics_repo_monthly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.p_analytics_repo_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216174951_p_analytics_repo_weekly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.p_analytics_valuestream_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216174941_p_analytics_valuestream_monthly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.p_analytics_valuestream_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216174939_p_analytics_valuestream_weekly.yml)
+
+Group: `group::analytics`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_secrets_management.i_ci_secrets_management_vault_build_created_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184251_i_ci_secrets_management_vault_build_created_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ci_secrets_management.i_ci_secrets_management_vault_build_created_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184249_i_ci_secrets_management_vault_build_created_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.ci_templates_total_unique_counts_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184559_ci_templates_total_unique_counts_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ci_templates.ci_templates_total_unique_counts_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184557_ci_templates_total_unique_counts_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_5_min_production_app_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184517_p_ci_templates_5_min_production_app_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_5_min_production_app_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184515_p_ci_templates_5_min_production_app_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_auto_devops_build_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184534_p_ci_templates_auto_devops_build_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_auto_devops_build_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184532_p_ci_templates_auto_devops_build_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_auto_devops_deploy_latest_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184542_p_ci_templates_auto_devops_deploy_latest_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_auto_devops_deploy_latest_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184540_p_ci_templates_auto_devops_deploy_latest_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_auto_devops_deploy_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184538_p_ci_templates_auto_devops_deploy_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_auto_devops_deploy_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184536_p_ci_templates_auto_devops_deploy_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_auto_devops_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184523_p_ci_templates_auto_devops_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_auto_devops_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184520_p_ci_templates_auto_devops_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_aws_cf_deploy_ec2_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184526_p_ci_templates_aws_cf_deploy_ec2_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_aws_cf_deploy_ec2_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184524_p_ci_templates_aws_cf_deploy_ec2_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_aws_deploy_ecs_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184530_p_ci_templates_aws_deploy_ecs_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_aws_deploy_ecs_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184528_p_ci_templates_aws_deploy_ecs_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_build_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184502_p_ci_templates_implicit_auto_devops_build_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_build_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184500_p_ci_templates_implicit_auto_devops_build_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_deploy_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184506_p_ci_templates_implicit_auto_devops_deploy_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_deploy_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184504_p_ci_templates_implicit_auto_devops_deploy_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184458_p_ci_templates_implicit_auto_devops_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184456_p_ci_templates_implicit_auto_devops_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_implicit_security_sast_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184510_p_ci_templates_implicit_security_sast_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_implicit_security_sast_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184508_p_ci_templates_implicit_security_sast_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_implicit_security_secret_detection_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184513_p_ci_templates_implicit_security_secret_detection_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_implicit_security_secret_detection_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184512_p_ci_templates_implicit_security_secret_detection_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_security_sast_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184546_p_ci_templates_security_sast_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_security_sast_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184544_p_ci_templates_security_sast_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_security_secret_detection_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184551_p_ci_templates_security_secret_detection_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_security_secret_detection_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184549_p_ci_templates_security_secret_detection_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_terraform_base_latest_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184555_p_ci_templates_terraform_base_latest_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_terraform_base_latest_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184553_p_ci_templates_terraform_base_latest_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.code_review_total_unique_counts_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184454_code_review_total_unique_counts_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.code_review_total_unique_counts_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184452_code_review_total_unique_counts_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_edit_mr_desc_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184342_i_code_review_edit_mr_desc_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_edit_mr_desc_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184340_i_code_review_edit_mr_desc_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_edit_mr_title_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184338_i_code_review_edit_mr_title_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_edit_mr_title_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184336_i_code_review_edit_mr_title_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_mr_diffs_monthly`
+
+Count of unique merge requests per week|month with diffs viewed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175120_i_code_review_mr_diffs_monthly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_mr_diffs_weekly`
+
+Count of unique merge requests per week|month with diffs viewed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216175118_i_code_review_mr_diffs_weekly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_mr_single_file_diffs_monthly`
+
+Count of unique merge requests per week|month with diffs viewed file by file
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175128_i_code_review_mr_single_file_diffs_monthly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_mr_single_file_diffs_weekly`
+
+Count of unique merge requests per week|month with diffs viewed file by file
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216175126_i_code_review_mr_single_file_diffs_weekly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_add_suggestion_monthly`
+
+Count of unique users per month who added a suggestion
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175159_i_code_review_user_add_suggestion_monthly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_add_suggestion_weekly`
+
+Count of unique users per week who added a suggestion
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216175158_i_code_review_user_add_suggestion_weekly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_apply_suggestion_monthly`
+
+Count of unique users per month who applied a suggestion
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175203_i_code_review_user_apply_suggestion_monthly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_apply_suggestion_weekly`
+
+Count of unique users per week who applied a suggestion
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216175201_i_code_review_user_apply_suggestion_weekly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_approval_rule_added_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184434_i_code_review_user_approval_rule_added_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_approval_rule_added_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184432_i_code_review_user_approval_rule_added_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_approval_rule_deleted_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184438_i_code_review_user_approval_rule_deleted_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_approval_rule_deleted_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184436_i_code_review_user_approval_rule_deleted_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_approval_rule_edited_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184442_i_code_review_user_approval_rule_edited_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_approval_rule_edited_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184440_i_code_review_user_approval_rule_edited_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_approve_mr_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184322_i_code_review_user_approve_mr_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_approve_mr_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184320_i_code_review_user_approve_mr_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_assigned_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184418_i_code_review_user_assigned_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_assigned_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184416_i_code_review_user_assigned_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_assignees_changed_monthly`
+
+Count of unique users per month who changed assignees of a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210302114145_i_code_review_user_assignees_changed_monthly.yml)
+
+Group: `group::code review`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_assignees_changed_weekly`
+
+Count of unique users per week who changed assignees of a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302114202_i_code_review_user_assignees_changed_weekly.yml)
+
+Group: `group::code review`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_close_mr_monthly`
+
+Count of unique users per week|month who closed a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175136_i_code_review_user_close_mr_monthly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_close_mr_weekly`
+
+Count of unique users per week|month who closed a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216175134_i_code_review_user_close_mr_weekly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_create_mr_comment_monthly`
+
+Count of unique users per week|month who commented on a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175148_i_code_review_user_create_mr_comment_monthly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_create_mr_comment_weekly`
+
+Count of unique users per week|month who commented on a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216175146_i_code_review_user_create_mr_comment_weekly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_create_mr_from_issue_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184450_i_code_review_user_create_mr_from_issue_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_create_mr_from_issue_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184448_i_code_review_user_create_mr_from_issue_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_create_mr_monthly`
+
+Count of unique users per week|month who created a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175132_i_code_review_user_create_mr_monthly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_create_mr_weekly`
+
+Count of unique users per week|month who created a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216175130_i_code_review_user_create_mr_weekly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_create_multiline_mr_comment_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184401_i_code_review_user_create_multiline_mr_comment_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_create_multiline_mr_comment_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184359_i_code_review_user_create_multiline_mr_comment_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_create_review_note_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184353_i_code_review_user_create_review_note_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_create_review_note_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184351_i_code_review_user_create_review_note_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_edit_mr_comment_monthly`
+
+Count of unique users per week|month who edited a comment on a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175152_i_code_review_user_edit_mr_comment_monthly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_edit_mr_comment_weekly`
+
+Count of unique users per week|month who edited a comment on a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216175150_i_code_review_user_edit_mr_comment_weekly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_edit_multiline_mr_comment_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184405_i_code_review_user_edit_multiline_mr_comment_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_edit_multiline_mr_comment_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184403_i_code_review_user_edit_multiline_mr_comment_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_labels_changed_monthly`
+
+Count of unique users per month who changed labels of a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210302110607_i_code_review_user_labels_changed_monthly.yml)
+
+Group: `group::code review`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_labels_changed_weekly`
+
+Count of unique users per week who changed labels of a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302110548_i_code_review_user_labels_changed_weekly.yml)
+
+Group: `group::code review`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_marked_as_draft_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184422_i_code_review_user_marked_as_draft_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_marked_as_draft_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184420_i_code_review_user_marked_as_draft_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_merge_mr_monthly`
+
+Count of unique users per week|month who merged a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175144_i_code_review_user_merge_mr_monthly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_merge_mr_weekly`
+
+Count of unique users per week|month who merged a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216175142_i_code_review_user_merge_mr_weekly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_milestone_changed_monthly`
+
+Count of unique users per month who changed milestone of a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210302110520_i_code_review_user_milestone_changed_monthly.yml)
+
+Group: `group::code review`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_milestone_changed_weekly`
+
+Count of unique users per week who changed milestone of a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302110403_i_code_review_user_milestone_changed_weekly.yml)
+
+Group: `group::code review`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_mr_discussion_locked_monthly`
+
+Count of unique users per month who locked a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210301103859_i_code_review_user_mr_discussion_locked_monthly.yml)
+
+Group: `group::code review`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_mr_discussion_locked_weekly`
+
+Count of unique users per week who locked a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302105318_i_code_review_user_mr_discussion_locked_weekly.yml)
+
+Group: `group::code review`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_mr_discussion_unlocked_monthly`
+
+Count of unique users per month who unlocked a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210301103925_i_code_review_user_mr_discussion_unlocked_monthly.yml)
+
+Group: `group::code review`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_mr_discussion_unlocked_weekly`
+
+Count of unique users per week who unlocked a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302105258_i_code_review_user_mr_discussion_unlocked_weekly.yml)
+
+Group: `group::code review`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_publish_review_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184357_i_code_review_user_publish_review_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_publish_review_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184355_i_code_review_user_publish_review_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_remove_mr_comment_monthly`
+
+Count of unique users per week|month who removed a comment on a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175156_i_code_review_user_remove_mr_comment_monthly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_remove_mr_comment_weekly`
+
+Count of unique users per week|month who removed a comment on a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216175154_i_code_review_user_remove_mr_comment_weekly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_remove_multiline_mr_comment_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184409_i_code_review_user_remove_multiline_mr_comment_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_remove_multiline_mr_comment_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184407_i_code_review_user_remove_multiline_mr_comment_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_reopen_mr_monthly`
+
+Count of unique users per week|month who reopened a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175140_i_code_review_user_reopen_mr_monthly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_reopen_mr_weekly`
+
+Count of unique users per week|month who reopened a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216175138_i_code_review_user_reopen_mr_weekly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_resolve_thread_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184330_i_code_review_user_resolve_thread_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_resolve_thread_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184328_i_code_review_user_resolve_thread_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_review_requested_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184430_i_code_review_user_review_requested_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_review_requested_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184428_i_code_review_user_review_requested_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_reviewers_changed_monthly`
+
+Count of unique users per month who changed reviewers of a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210302114219_i_code_review_user_reviewers_changed_monthly.yml)
+
+Group: `group::code review`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_reviewers_changed_weekly`
+
+Count of unique users per week who changed reviewers of a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302114235_i_code_review_user_reviewers_changed_weekly.yml)
+
+Group: `group::code review`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_single_file_diffs_monthly`
+
+Count of unique users per week|month with diffs viewed file by file
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175124_i_code_review_user_single_file_diffs_monthly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_single_file_diffs_weekly`
+
+Count of unique users per week|month with diffs viewed file by file
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216175122_i_code_review_user_single_file_diffs_weekly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_time_estimate_changed_monthly`
+
+Count of unique users per month who changed time estimate of a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210301102134_i_code_review_user_time_estimate_changed_monthly.yml)
+
+Group: `group::code review`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_time_estimate_changed_weekly`
+
+Count of unique users per week who changed time estimate of a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302103539_i_code_review_user_time_estimate_changed_weekly.yml)
+
+Group: `group::code review`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_time_spent_changed_monthly`
+
+Count of unique users per month who changed time spent on a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210301102204_i_code_review_user_time_spent_changed_monthly.yml)
+
+Group: `group::code review`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_time_spent_changed_weekly`
+
+Count of unique users per week who changed time spent on a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302103615_i_code_review_user_time_spent_changed_weekly.yml)
+
+Group: `group::code review`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_toggled_task_item_status_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184312_i_code_review_user_toggled_task_item_status_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_toggled_task_item_status_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184310_i_code_review_user_toggled_task_item_status_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_unapprove_mr_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184326_i_code_review_user_unapprove_mr_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_unapprove_mr_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184324_i_code_review_user_unapprove_mr_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_unmarked_as_draft_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184426_i_code_review_user_unmarked_as_draft_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_unmarked_as_draft_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184424_i_code_review_user_unmarked_as_draft_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_unresolve_thread_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184334_i_code_review_user_unresolve_thread_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_unresolve_thread_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184332_i_code_review_user_unresolve_thread_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.i_code_review_user_vs_code_api_request_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184446_i_code_review_user_vs_code_api_request_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.code_review.i_code_review_user_vs_code_api_request_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184444_i_code_review_user_vs_code_api_request_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.compliance.a_compliance_audit_events_api_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183942_a_compliance_audit_events_api_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.compliance.a_compliance_audit_events_api_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216183940_a_compliance_audit_events_api_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.compliance.compliance_total_unique_counts_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183946_compliance_total_unique_counts_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.compliance.compliance_total_unique_counts_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216183944_compliance_total_unique_counts_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.compliance.g_compliance_audit_events_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183930_g_compliance_audit_events_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.compliance.g_compliance_audit_events_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216183928_g_compliance_audit_events_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.compliance.g_compliance_dashboard_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183926_g_compliance_dashboard_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.compliance.g_compliance_dashboard_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216183924_g_compliance_dashboard_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.compliance.i_compliance_audit_events_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183934_i_compliance_audit_events_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.compliance.i_compliance_audit_events_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216183932_i_compliance_audit_events_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.compliance.i_compliance_credential_inventory_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183938_i_compliance_credential_inventory_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.compliance.i_compliance_credential_inventory_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216183936_i_compliance_credential_inventory_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.deploy_token_packages.deploy_token_packages_total_unique_counts_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184850_deploy_token_packages_total_unique_counts_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.deploy_token_packages.deploy_token_packages_total_unique_counts_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184848_deploy_token_packages_total_unique_counts_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.deploy_token_packages.i_package_composer_deploy_token_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184806_i_package_composer_deploy_token_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.deploy_token_packages.i_package_composer_deploy_token_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184805_i_package_composer_deploy_token_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.deploy_token_packages.i_package_conan_deploy_token_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184810_i_package_conan_deploy_token_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.deploy_token_packages.i_package_conan_deploy_token_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184808_i_package_conan_deploy_token_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.deploy_token_packages.i_package_container_deploy_token_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184814_i_package_container_deploy_token_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.deploy_token_packages.i_package_container_deploy_token_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184812_i_package_container_deploy_token_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.deploy_token_packages.i_package_debian_deploy_token_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184818_i_package_debian_deploy_token_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.deploy_token_packages.i_package_debian_deploy_token_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184816_i_package_debian_deploy_token_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.deploy_token_packages.i_package_generic_deploy_token_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184822_i_package_generic_deploy_token_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.deploy_token_packages.i_package_generic_deploy_token_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184820_i_package_generic_deploy_token_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.deploy_token_packages.i_package_golang_deploy_token_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184826_i_package_golang_deploy_token_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.deploy_token_packages.i_package_golang_deploy_token_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184824_i_package_golang_deploy_token_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.deploy_token_packages.i_package_maven_deploy_token_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184830_i_package_maven_deploy_token_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.deploy_token_packages.i_package_maven_deploy_token_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184828_i_package_maven_deploy_token_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.deploy_token_packages.i_package_npm_deploy_token_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184834_i_package_npm_deploy_token_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.deploy_token_packages.i_package_npm_deploy_token_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184832_i_package_npm_deploy_token_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.deploy_token_packages.i_package_nuget_deploy_token_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184838_i_package_nuget_deploy_token_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.deploy_token_packages.i_package_nuget_deploy_token_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184836_i_package_nuget_deploy_token_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.deploy_token_packages.i_package_pypi_deploy_token_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184842_i_package_pypi_deploy_token_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.deploy_token_packages.i_package_pypi_deploy_token_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184840_i_package_pypi_deploy_token_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.deploy_token_packages.i_package_tag_deploy_token_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184846_i_package_tag_deploy_token_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.deploy_token_packages.i_package_tag_deploy_token_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184844_i_package_tag_deploy_token_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ecosystem.ecosystem_total_unique_counts_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184957_ecosystem_total_unique_counts_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ecosystem.ecosystem_total_unique_counts_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184955_ecosystem_total_unique_counts_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ecosystem.i_ecosystem_jira_service_close_issue_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184941_i_ecosystem_jira_service_close_issue_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_jira_service_close_issue_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184939_i_ecosystem_jira_service_close_issue_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ecosystem.i_ecosystem_jira_service_create_issue_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184953_i_ecosystem_jira_service_create_issue_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_jira_service_create_issue_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184951_i_ecosystem_jira_service_create_issue_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ecosystem.i_ecosystem_jira_service_cross_reference_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184945_i_ecosystem_jira_service_cross_reference_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_jira_service_cross_reference_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184943_i_ecosystem_jira_service_cross_reference_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ecosystem.i_ecosystem_jira_service_list_issues_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184949_i_ecosystem_jira_service_list_issues_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_jira_service_list_issues_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184947_i_ecosystem_jira_service_list_issues_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_confidential_issue_notification_monthly`
+
+Calculated unique users to trigger a Slack message by performing an action on a confidential issue by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210303152233_i_ecosystem_slack_service_confidential_issue_notification_monthly.yml)
+
+Group: `group::ecosystem`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_confidential_issue_notification_weekly`
+
+Calculated unique users to trigger a Slack message by performing an action on a confidential issue by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302104814_i_ecosystem_slack_service_confidential_issue_notification_weekly.yml)
+
+Group: `group::ecosystem`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_confidential_note_notification_monthly`
+
+Calculated unique users to trigger a Slack message by creating a confidential note by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210303152144_i_ecosystem_slack_service_confidential_note_notification_monthly.yml)
+
+Group: `group::ecosystem`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_confidential_note_notification_weekly`
+
+Calculated unique users to trigger a Slack message by creating a confidential note by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302104556_i_ecosystem_slack_service_confidential_note_notification_weekly.yml)
+
+Group: `group::ecosystem`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_deployment_notification_monthly`
+
+Calculated unique users to trigger a Slack message by performing a deployment by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210303150912_i_ecosystem_slack_service_deployment_notification_monthly.yml)
+
+Group: `group::ecosystem`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_deployment_notification_weekly`
+
+Calculated unique users to trigger a Slack message by performing a deployment by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302103755_i_ecosystem_slack_service_deployment_notification_weekly.yml)
+
+Group: `group::ecosystem`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_issue_notification_monthly`
+
+Calculated unique users to trigger a Slack message by performing an action on an issue by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210303150507_i_ecosystem_slack_service_issue_notification_monthly.yml)
+
+Group: `group::ecosystem`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_issue_notification_weekly`
+
+Calculated unique users to trigger a Slack message by performing an action on an issue by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302103002_i_ecosystem_slack_service_issue_notification_weekly.yml)
+
+Group: `group::ecosystem`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_merge_request_notification_monthly`
+
+Calculated unique users to trigger a Slack message by performing an action on a merge request by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210303151831_i_ecosystem_slack_service_merge_request_notification_monthly.yml)
+
+Group: `group::ecosystem`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_merge_request_notification_weekly`
+
+Calculated unique users to trigger a Slack message by performing an action on a merge request by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302104007_i_ecosystem_slack_service_merge_request_notification_weekly.yml)
+
+Group: `group::ecosystem`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_note_notification_monthly`
+
+Calculated unique users to trigger a Slack message by creating a note by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210303151946_i_ecosystem_slack_service_note_notification_monthly.yml)
+
+Group: `group::ecosystem`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_note_notification_weekly`
+
+Calculated unique users to trigger a Slack message by creating a note by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302104047_i_ecosystem_slack_service_note_notification_weekly.yml)
+
+Group: `group::ecosystem`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_push_notification_monthly`
+
+Calculated unique users to trigger a Slack message by performing a Git push by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210303150654_i_ecosystem_slack_service_push_notification_monthly.yml)
+
+Group: `group::ecosystem`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_push_notification_weekly`
+
+Calculated unique users to trigger a Slack message by performing a Git push by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302103629_i_ecosystem_slack_service_push_notification_weekly.yml)
+
+Group: `group::ecosystem`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_tag_push_notification_monthly`
+
+Calculated unique users to trigger a Slack message by performing a tag push by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210303152049_i_ecosystem_slack_service_tag_push_notification_monthly.yml)
+
+Group: `group::ecosystem`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_tag_push_notification_weekly`
+
+Calculated unique users to trigger a Slack message by performing a tag push by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302104144_i_ecosystem_slack_service_tag_push_notification_weekly.yml)
+
+Group: `group::ecosystem`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_wiki_page_notification_monthly`
+
+Calculated unique users to trigger a Slack message by performing an action on a wiki page by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210303151609_i_ecosystem_slack_service_wiki_page_notification_monthly.yml)
+
+Group: `group::ecosystem`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_wiki_page_notification_weekly`
+
+Calculated unique users to trigger a Slack message by performing an action on a wiki page by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302103907_i_ecosystem_slack_service_wiki_page_notification_weekly.yml)
+
+Group: `group::ecosystem`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ide_edit.g_edit_by_sfe_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180334_g_edit_by_sfe_monthly.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ide_edit.g_edit_by_sfe_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180332_g_edit_by_sfe_weekly.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ide_edit.g_edit_by_snippet_ide_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180338_g_edit_by_snippet_ide_monthly.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ide_edit.g_edit_by_snippet_ide_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180336_g_edit_by_snippet_ide_weekly.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ide_edit.g_edit_by_sse_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184024_g_edit_by_sse_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ide_edit.g_edit_by_sse_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184022_g_edit_by_sse_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ide_edit.g_edit_by_web_ide_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180330_g_edit_by_web_ide_monthly.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ide_edit.g_edit_by_web_ide_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180328_g_edit_by_web_ide_weekly.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ide_edit.ide_edit_total_unique_counts_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180341_ide_edit_total_unique_counts_monthly.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ide_edit.ide_edit_total_unique_counts_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180339_ide_edit_total_unique_counts_weekly.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.incident_management.incident_management_alert_assigned_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180533_incident_management_alert_assigned_monthly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.incident_management.incident_management_alert_assigned_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180532_incident_management_alert_assigned_weekly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.incident_management.incident_management_alert_status_changed_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180530_incident_management_alert_status_changed_monthly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.incident_management.incident_management_alert_status_changed_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180528_incident_management_alert_status_changed_weekly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.incident_management.incident_management_alert_todo_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180537_incident_management_alert_todo_monthly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.incident_management.incident_management_alert_todo_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180535_incident_management_alert_todo_weekly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.incident_management.incident_management_incident_assigned_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180552_incident_management_incident_assigned_monthly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.incident_management.incident_management_incident_assigned_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180550_incident_management_incident_assigned_weekly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.incident_management.incident_management_incident_change_confidential_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180618_incident_management_incident_change_confidential_monthly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.incident_management.incident_management_incident_change_confidential_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180616_incident_management_incident_change_confidential_weekly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.incident_management.incident_management_incident_closed_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180548_incident_management_incident_closed_monthly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.incident_management.incident_management_incident_closed_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180546_incident_management_incident_closed_weekly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.incident_management.incident_management_incident_comment_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180559_incident_management_incident_comment_monthly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.incident_management.incident_management_incident_comment_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180558_incident_management_incident_comment_weekly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.incident_management.incident_management_incident_created_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180541_incident_management_incident_created_monthly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.incident_management.incident_management_incident_created_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180539_incident_management_incident_created_weekly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.incident_management.incident_management_incident_published_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180607_incident_management_incident_published_monthly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.incident_management.incident_management_incident_published_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180605_incident_management_incident_published_weekly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.incident_management.incident_management_incident_relate_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180611_incident_management_incident_relate_monthly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.incident_management.incident_management_incident_relate_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180609_incident_management_incident_relate_weekly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.incident_management.incident_management_incident_reopened_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180545_incident_management_incident_reopened_monthly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.incident_management.incident_management_incident_reopened_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180543_incident_management_incident_reopened_weekly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.incident_management.incident_management_incident_todo_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180556_incident_management_incident_todo_monthly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.incident_management.incident_management_incident_todo_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180554_incident_management_incident_todo_weekly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.incident_management.incident_management_incident_unrelate_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180614_incident_management_incident_unrelate_monthly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.incident_management.incident_management_incident_unrelate_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180612_incident_management_incident_unrelate_weekly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.incident_management.incident_management_incident_zoom_meeting_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216180603_incident_management_incident_zoom_meeting_monthly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.incident_management.incident_management_incident_zoom_meeting_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180601_incident_management_incident_zoom_meeting_weekly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.incident_management.incident_management_total_unique_counts_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180622_incident_management_total_unique_counts_monthly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.incident_management.incident_management_total_unique_counts_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180620_incident_management_total_unique_counts_weekly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.incident_management_alerts.incident_management_alert_create_incident_monthly`
+
+Count of unique users per month to create an incident corresponding to an alert
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180625_incident_management_alert_create_incident_monthly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.incident_management_alerts.incident_management_alert_create_incident_weekly`
+
+Count of unique users per week to create an incident corresponding to an alert
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180623_incident_management_alert_create_incident_weekly.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_added_to_epic_monthly`
+
+Count of MAU adding an issue to an epic
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181414_g_project_management_issue_added_to_epic_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_added_to_epic_weekly`
+
+Count of WAU adding an issue to an epic
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181413_g_project_management_issue_added_to_epic_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_assignee_changed_monthly`
+
+Count of MAU changing issue assignees
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216181311_g_project_management_issue_assignee_changed_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_assignee_changed_weekly`
+
+Count of WAU changing issue assignees
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181310_g_project_management_issue_assignee_changed_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_changed_epic_monthly`
+
+Count of MAU changing the epic on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181420_g_project_management_issue_changed_epic_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_changed_epic_weekly`
+
+Count of WAU changing the epic on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181418_g_project_management_issue_changed_epic_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_cloned_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181501_g_project_management_issue_cloned_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_cloned_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181459_g_project_management_issue_cloned_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_closed_monthly`
+
+Count of MAU closing an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181326_g_project_management_issue_closed_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_closed_weekly`
+
+Count of WAU closing an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181324_g_project_management_issue_closed_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_comment_added_monthly`
+
+Count of MAU commenting on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181446_g_project_management_issue_comment_added_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_comment_added_weekly`
+
+Count of WAU commenting on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181444_g_project_management_issue_comment_added_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_comment_edited_monthly`
+
+Count of MAU editing a comment on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181450_g_project_management_issue_comment_edited_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_comment_edited_weekly`
+
+Count of WAU editing a comment on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181448_g_project_management_issue_comment_edited_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_comment_removed_monthly`
+
+Count of MAU deleting a comment from an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181453_g_project_management_issue_comment_removed_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_comment_removed_weekly`
+
+Count of WAU deleting a comment from an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181451_g_project_management_issue_comment_removed_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_created_monthly`
+
+Count of MAU creating new issues
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181323_g_project_management_issue_created_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_created_weekly`
+
+Count of WAU creating issues
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181321_g_project_management_issue_created_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_cross_referenced_monthly`
+
+Count of MAU referencing an issue from somewhere else
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181348_g_project_management_issue_cross_referenced_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_cross_referenced_weekly`
+
+Count of WAU referncing an issue from somewhere else
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181347_g_project_management_issue_cross_referenced_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_description_changed_monthly`
+
+Count of MAU editing an issue description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181308_g_project_management_issue_description_changed_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_description_changed_weekly`
+
+Count of WAU editing an issue description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181306_g_project_management_issue_description_changed_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_designs_added_monthly`
+
+Count of MAU adding a design to an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181424_g_project_management_issue_designs_added_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_designs_added_weekly`
+
+Count of WAU adding a design to an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181422_g_project_management_issue_designs_added_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_designs_modified_monthly`
+
+Count of MAU modifying a design on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181427_g_project_management_issue_designs_modified_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_designs_modified_weekly`
+
+Count of WAU modifying a design on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181425_g_project_management_issue_designs_modified_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_designs_removed_monthly`
+
+Count of MAU removing a design from an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181431_g_project_management_issue_designs_removed_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_designs_removed_weekly`
+
+Count of WAU removing a design from an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181429_g_project_management_issue_designs_removed_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_due_date_changed_monthly`
+
+Count of MAU changing an issue due date
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181435_g_project_management_issue_due_date_changed_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_due_date_changed_weekly`
+
+Count of WAU changing an issue due date
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181433_g_project_management_issue_due_date_changed_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_health_status_changed_monthly`
+
+Count of MAU changing the health status on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181457_g_project_management_issue_health_status_changed_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_health_status_changed_weekly`
+
+Count of WAU changing the health status on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181455_g_project_management_issue_health_status_changed_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_iteration_changed_monthly`
+
+Count of MAU changing an issue's iteration
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181341_g_project_management_issue_iteration_changed_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_iteration_changed_weekly`
+
+Count of WAU changing an issue's iteration
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181339_g_project_management_issue_iteration_changed_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_label_changed_monthly`
+
+Count of MAU changing an issue's label
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181334_g_project_management_issue_label_changed_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_label_changed_weekly`
+
+Count of WAU changing an issue's label
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181332_g_project_management_issue_label_changed_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_locked_monthly`
+
+Count of MAU locking an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181407_g_project_management_issue_locked_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_locked_weekly`
+
+Count of WAU locking an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181405_g_project_management_issue_locked_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_made_confidential_monthly`
+
+Count of MAU making an issue confidential
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181315_g_project_management_issue_made_confidential_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_made_confidential_weekly`
+
+Count of WAU making an issue confidential
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181313_g_project_management_issue_made_confidential_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_made_visible_monthly`
+
+Count of MAU making an issue not confidential
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181319_g_project_management_issue_made_visible_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_made_visible_weekly`
+
+Count of WAU making an issue not confidential
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181317_g_project_management_issue_made_visible_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_marked_as_duplicate_monthly`
+
+Count of MAU marking an issue as a duplicate
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181403_g_project_management_issue_marked_as_duplicate_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_marked_as_duplicate_weekly`
+
+Count of WAU marking an issue as a duplicate
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181401_g_project_management_issue_marked_as_duplicate_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_milestone_changed_monthly`
+
+Count of MAU changing an issue's milestone
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181337_g_project_management_issue_milestone_changed_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_milestone_changed_weekly`
+
+Count of WAU changing an issue's milestone
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181336_g_project_management_issue_milestone_changed_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_moved_monthly`
+
+Count of MAU moving an issue to another project
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181352_g_project_management_issue_moved_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_moved_weekly`
+
+Count of WAU moving an issue to another project
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181350_g_project_management_issue_moved_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_related_monthly`
+
+Count of MAU relating an issue to another issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181356_g_project_management_issue_related_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_related_weekly`
+
+Count of WAU relating an issue to another issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181354_g_project_management_issue_related_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_removed_from_epic_monthly`
+
+Count of MAU removing an issue from an epic
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181416_g_project_management_issue_removed_from_epic_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_removed_from_epic_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184221_g_project_management_issue_removed_from_epic_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_reopened_monthly`
+
+Count of MAU re-opening a closed issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181330_g_project_management_issue_reopened_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_reopened_weekly`
+
+Count of WAU re-opening a closed issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181328_g_project_management_issue_reopened_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_time_estimate_changed_monthly`
+
+Count of MAU changing an issue time estimate
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181438_g_project_management_issue_time_estimate_changed_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_time_estimate_changed_weekly`
+
+Count of WAU changing an issue time estimate
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181437_g_project_management_issue_time_estimate_changed_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_time_spent_changed_monthly`
+
+Count of MAU recording time spent on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181442_g_project_management_issue_time_spent_changed_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_time_spent_changed_weekly`
+
+Count of WAU recording time spent on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181440_g_project_management_issue_time_spent_changed_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_title_changed_monthly`
+
+Count of MAU editing an issue title
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181304_g_project_management_issue_title_changed_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_title_changed_weekly`
Distinct users count that changed issue title in a group for last recent week
-| field | value |
-| --- | --- |
-| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_title_changed_weekly`** |
-| `product_stage` | plan |
-| `product_group` | `group::project management` |
-| `product_category` | issue_tracking |
-| `value_type` | number |
-| `status` | data_available |
-| `milestone` | 13.6 |
-| `introduced_by_url` | [Introduced by](https://gitlab.com/gitlab-org/gitlab/-/issues/229918) |
-| `time_frame` | 7d |
-| `data_source` | Redis_hll |
-| `distribution` | ee, ce |
-| `tier` | free, premium, ultimate |
-
-## `reply_by_email_enabled`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210201124931_g_project_management_issue_title_changed_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_unlocked_monthly`
+
+Count of MAU marking an issue as blocked or blocked by
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181411_g_project_management_issue_unlocked_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_unlocked_weekly`
+
+Count of WAU marking an issue as blocked or blocked by
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181409_g_project_management_issue_unlocked_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_unrelated_monthly`
+
+Count of MAU unrelating an issue to another issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181400_g_project_management_issue_unrelated_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_unrelated_weekly`
+
+Count of WAU unrelating an issue to another issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181358_g_project_management_issue_unrelated_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_weight_changed_monthly`
+
+Count of MAU changing an issue's weight
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181345_g_project_management_issue_weight_changed_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_weight_changed_weekly`
+
+Count of WAU changing an issue's weight
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181343_g_project_management_issue_weight_changed_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.issues_edit_total_unique_counts_monthly`
+
+Count of MAU taking an action related to an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181504_issues_edit_total_unique_counts_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.issues_edit.issues_edit_total_unique_counts_weekly`
+
+Count of WAU taking an action related to an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181503_issues_edit_total_unique_counts_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.pipeline_authoring.o_pipeline_authoring_unique_users_committing_ciconfigfile_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184303_o_pipeline_authoring_unique_users_committing_ciconfigfile_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.pipeline_authoring.o_pipeline_authoring_unique_users_committing_ciconfigfile_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184301_o_pipeline_authoring_unique_users_committing_ciconfigfile_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.pipeline_authoring.o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile_monthly`
+
+Monthly unique user count having merge requests which contains the CI config file
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210301144228_o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile_monthly.yml)
+
+Group: `group::pipeline authoring`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.pipeline_authoring.o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile_weekly`
+
+Weekly unique user count having merge requests which contains the CI config file
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210301144209_o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile_weekly.yml)
+
+Group: `group::pipeline authoring`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_approve_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181508_i_quickactions_approve_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_approve_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181506_i_quickactions_approve_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_assign_multiple_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181516_i_quickactions_assign_multiple_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_assign_multiple_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181514_i_quickactions_assign_multiple_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_assign_reviewer_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181523_i_quickactions_assign_reviewer_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_assign_reviewer_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181521_i_quickactions_assign_reviewer_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_assign_self_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181519_i_quickactions_assign_self_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_assign_self_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181517_i_quickactions_assign_self_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_assign_single_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181512_i_quickactions_assign_single_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_assign_single_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181510_i_quickactions_assign_single_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_award_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181527_i_quickactions_award_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_award_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181525_i_quickactions_award_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_board_move_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181530_i_quickactions_board_move_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_board_move_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181529_i_quickactions_board_move_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_child_epic_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181534_i_quickactions_child_epic_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_child_epic_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181532_i_quickactions_child_epic_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_clear_weight_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181538_i_quickactions_clear_weight_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_clear_weight_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181536_i_quickactions_clear_weight_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_clone_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181541_i_quickactions_clone_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_clone_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181540_i_quickactions_clone_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_close_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181545_i_quickactions_close_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_close_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181543_i_quickactions_close_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_confidential_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181549_i_quickactions_confidential_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_confidential_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181547_i_quickactions_confidential_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_copy_metadata_issue_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181556_i_quickactions_copy_metadata_issue_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_copy_metadata_issue_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181554_i_quickactions_copy_metadata_issue_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_copy_metadata_merge_request_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181553_i_quickactions_copy_metadata_merge_request_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_copy_metadata_merge_request_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181551_i_quickactions_copy_metadata_merge_request_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_create_merge_request_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181600_i_quickactions_create_merge_request_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_create_merge_request_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181558_i_quickactions_create_merge_request_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_done_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181604_i_quickactions_done_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_done_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181602_i_quickactions_done_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_draft_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181607_i_quickactions_draft_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_draft_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181605_i_quickactions_draft_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_due_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181611_i_quickactions_due_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_due_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181609_i_quickactions_due_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_duplicate_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181615_i_quickactions_duplicate_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_duplicate_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181613_i_quickactions_duplicate_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_epic_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181618_i_quickactions_epic_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_epic_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181617_i_quickactions_epic_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_estimate_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181622_i_quickactions_estimate_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_estimate_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181620_i_quickactions_estimate_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_invite_email_multiple_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210222041235_i_quickactions_invite_email_multiple_monthly.yml)
+
+Group: `group::product planning`
+
+Status: `implemented`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_invite_email_single_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210222041219_i_quickactions_invite_email_single_monthly.yml)
+
+Group: `group::product planning`
+
+Status: `implemented`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_iteration_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181626_i_quickactions_iteration_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_iteration_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181624_i_quickactions_iteration_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_label_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181629_i_quickactions_label_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_label_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181628_i_quickactions_label_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_lock_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181633_i_quickactions_lock_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_lock_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181631_i_quickactions_lock_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_merge_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181637_i_quickactions_merge_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_merge_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181635_i_quickactions_merge_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_milestone_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181641_i_quickactions_milestone_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_milestone_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181639_i_quickactions_milestone_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_move_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181644_i_quickactions_move_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_move_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181642_i_quickactions_move_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_parent_epic_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181648_i_quickactions_parent_epic_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_parent_epic_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181646_i_quickactions_parent_epic_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_promote_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181652_i_quickactions_promote_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_promote_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181650_i_quickactions_promote_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_publish_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181655_i_quickactions_publish_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_publish_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181654_i_quickactions_publish_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_reassign_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181659_i_quickactions_reassign_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_reassign_reviewer_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181703_i_quickactions_reassign_reviewer_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_reassign_reviewer_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181701_i_quickactions_reassign_reviewer_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_reassign_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181657_i_quickactions_reassign_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_rebase_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181707_i_quickactions_rebase_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_rebase_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181705_i_quickactions_rebase_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_relabel_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181710_i_quickactions_relabel_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_relabel_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181708_i_quickactions_relabel_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_relate_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181714_i_quickactions_relate_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_relate_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181712_i_quickactions_relate_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_child_epic_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181718_i_quickactions_remove_child_epic_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_child_epic_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181716_i_quickactions_remove_child_epic_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_due_date_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181721_i_quickactions_remove_due_date_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_due_date_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181719_i_quickactions_remove_due_date_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_epic_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181725_i_quickactions_remove_epic_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_epic_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181723_i_quickactions_remove_epic_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_estimate_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181729_i_quickactions_remove_estimate_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_estimate_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181727_i_quickactions_remove_estimate_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_iteration_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181732_i_quickactions_remove_iteration_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_iteration_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181731_i_quickactions_remove_iteration_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_milestone_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181736_i_quickactions_remove_milestone_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_milestone_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181734_i_quickactions_remove_milestone_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_parent_epic_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181740_i_quickactions_remove_parent_epic_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_parent_epic_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181738_i_quickactions_remove_parent_epic_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_time_spent_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181744_i_quickactions_remove_time_spent_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_time_spent_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181742_i_quickactions_remove_time_spent_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_zoom_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181747_i_quickactions_remove_zoom_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_zoom_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181745_i_quickactions_remove_zoom_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_reopen_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181751_i_quickactions_reopen_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_reopen_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181749_i_quickactions_reopen_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_shrug_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181755_i_quickactions_shrug_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_shrug_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181753_i_quickactions_shrug_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_spend_add_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181802_i_quickactions_spend_add_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_spend_add_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181800_i_quickactions_spend_add_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_spend_subtract_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181758_i_quickactions_spend_subtract_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_spend_subtract_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181756_i_quickactions_spend_subtract_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_submit_review_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181806_i_quickactions_submit_review_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_submit_review_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181804_i_quickactions_submit_review_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_subscribe_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181809_i_quickactions_subscribe_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_subscribe_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181808_i_quickactions_subscribe_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_tableflip_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181813_i_quickactions_tableflip_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_tableflip_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181811_i_quickactions_tableflip_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_tag_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181817_i_quickactions_tag_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_tag_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181815_i_quickactions_tag_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_target_branch_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181821_i_quickactions_target_branch_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_target_branch_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181819_i_quickactions_target_branch_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_title_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181824_i_quickactions_title_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_title_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181822_i_quickactions_title_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_todo_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181828_i_quickactions_todo_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_todo_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181826_i_quickactions_todo_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_unassign_all_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181835_i_quickactions_unassign_all_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_unassign_all_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181833_i_quickactions_unassign_all_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_unassign_reviewer_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181839_i_quickactions_unassign_reviewer_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_unassign_reviewer_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181837_i_quickactions_unassign_reviewer_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_unassign_specific_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181832_i_quickactions_unassign_specific_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_unassign_specific_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181830_i_quickactions_unassign_specific_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_unlabel_all_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181846_i_quickactions_unlabel_all_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_unlabel_all_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181845_i_quickactions_unlabel_all_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_unlabel_specific_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181843_i_quickactions_unlabel_specific_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_unlabel_specific_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181841_i_quickactions_unlabel_specific_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_unlock_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181850_i_quickactions_unlock_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_unlock_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181848_i_quickactions_unlock_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_unsubscribe_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181854_i_quickactions_unsubscribe_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_unsubscribe_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181852_i_quickactions_unsubscribe_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_weight_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181857_i_quickactions_weight_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_weight_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181856_i_quickactions_weight_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_wip_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181901_i_quickactions_wip_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_wip_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181859_i_quickactions_wip_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.i_quickactions_zoom_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181905_i_quickactions_zoom_monthly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.i_quickactions_zoom_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181903_i_quickactions_zoom_weekly.yml)
+
+Group: `group::project management`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.quickactions.quickactions_total_unique_counts_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184803_quickactions_total_unique_counts_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.quickactions.quickactions_total_unique_counts_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184801_quickactions_total_unique_counts_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.search.i_search_advanced_monthly`
+
+Calculated unique users to perform Advanced searches by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216180427_i_search_advanced_monthly.yml)
+
+Group: `group::global search`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.search.i_search_advanced_weekly`
+
+Calculated unique users to perform Advanced searches by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180425_i_search_advanced_weekly.yml)
+
+Group: `group::global search`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.search.i_search_paid_monthly`
+
+Calculated unique users to perform a search with a paid license enabled by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216184035_i_search_paid_monthly.yml)
+
+Group: `group::global search`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.search.i_search_paid_weekly`
+
+Calculated unique users to perform a search with a paid license enabled by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184033_i_search_paid_weekly.yml)
+
+Group: `group::global search`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.search.i_search_total_monthly`
+
+Calculated unique users to perform Basic or Advanced searches by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180424_i_search_total_monthly.yml)
+
+Group: `group::global search`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.search.i_search_total_weekly`
+
+Calculated unique users to perform Basic or Advanced searches by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180422_i_search_total_weekly.yml)
+
+Group: `group::global search`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.search.search_total_unique_counts_monthly`
+
+Total unique users for i_search_total, i_search_advanced, i_search_paid for recent 28 days. This metric is redundant because advanced will be a subset of paid and paid will be a subset of total. i_search_total is more appropriate if you just want the total
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180431_search_total_unique_counts_monthly.yml)
+
+Group: `group::global search`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.search.search_total_unique_counts_weekly`
+
+Calculated unique users to perform Basic or Advanced searches by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180429_search_total_unique_counts_weekly.yml)
+
+Group: `group::global search`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.snippets.i_snippets_show_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184255_i_snippets_show_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.snippets.i_snippets_show_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184253_i_snippets_show_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.source_code.design_action_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182106_design_action_monthly.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.source_code.design_action_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216182104_design_action_weekly.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.source_code.git_write_action_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184047_git_write_action_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.source_code.git_write_action_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184045_git_write_action_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.source_code.i_source_code_code_intelligence_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175117_i_source_code_code_intelligence_monthly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.source_code.i_source_code_code_intelligence_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216175114_i_source_code_code_intelligence_weekly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.source_code.merge_request_action_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175113_merge_request_action_monthly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.source_code.merge_request_action_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216175111_merge_request_action_weekly.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.source_code.project_action_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182109_project_action_monthly.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.source_code.project_action_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216182107_project_action_weekly.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.source_code.wiki_action_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182102_wiki_action_monthly.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.source_code.wiki_action_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216182100_wiki_action_weekly.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.terraform.p_terraform_state_api_unique_users_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184259_p_terraform_state_api_unique_users_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.terraform.p_terraform_state_api_unique_users_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184257_p_terraform_state_api_unique_users_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.testing.i_testing_full_code_quality_report_total_monthly`
+
+Count of unique users per week|month who visit the full code quality report
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182147_i_testing_full_code_quality_report_total_monthly.yml)
+
+Group: `group::testing`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_full_code_quality_report_total_weekly`
+
+Count of unique users per week|month who visit the full code quality report
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216182145_i_testing_full_code_quality_report_total_weekly.yml)
+
+Group: `group::testing`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_group_code_coverage_project_click_total_monthly`
+
+Count of unique users per week|month who click on a project link in the group code coverage table
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182153_i_testing_group_code_coverage_project_click_total_monthly.yml)
+
+Group: `group::testing`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_group_code_coverage_project_click_total_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184132_i_testing_group_code_coverage_project_click_total_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.testing.i_testing_group_code_coverage_visit_total_monthly`
+
+Count of unique users per week|month who visited the group code coverage page
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182143_i_testing_group_code_coverage_visit_total_monthly.yml)
+
+Group: `group::testing`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_group_code_coverage_visit_total_weekly`
+
+Count of unique users per week|month who visited the group code coverage page
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216182141_i_testing_group_code_coverage_visit_total_weekly.yml)
+
+Group: `group::testing`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_load_performance_widget_total_monthly`
+
+Count of unique users per week|month who expanded the load performance report MR widget
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182156_i_testing_load_performance_widget_total_monthly.yml)
+
+Group: `group::testing`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_load_performance_widget_total_weekly`
+
+Count of unique users per week|month who expanded the load performance report MR widget
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216182154_i_testing_load_performance_widget_total_weekly.yml)
+
+Group: `group::testing`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_metrics_report_artifact_uploaders_monthly`
+
+Internal Tracking to count number of unit tests parsed for planning of future code testing features. Data available [here](https://app.periscopedata.com/app/gitlab/788674/Verify:Testing-Group-Metrics?widget=10454394&udv=0)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182200_i_testing_metrics_report_artifact_uploaders_monthly.yml)
+
+Group: `group::testing`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_metrics_report_artifact_uploaders_weekly`
+
+Internal Tracking to count number of unit tests parsed for planning of future code testing features. Data available [here](https://app.periscopedata.com/app/gitlab/788674/Verify:Testing-Group-Metrics?widget=10454394&udv=0)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216182158_i_testing_metrics_report_artifact_uploaders_weekly.yml)
+
+Group: `group::testing`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_metrics_report_widget_total_monthly`
+
+Count of unique users per week|month who expanded the metrics report MR widget
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182139_i_testing_metrics_report_widget_total_monthly.yml)
+
+Group: `group::testing`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_metrics_report_widget_total_weekly`
+
+Count of unique users per week|month who expanded the metrics report MR widget
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216182138_i_testing_metrics_report_widget_total_weekly.yml)
+
+Group: `group::testing`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_test_case_parsed_monthly`
+
+Internal Tracking to count number of unit tests parsed for planning of future code testing features. Data available [here](https://app.periscopedata.com/app/gitlab/788674/Verify:Testing-Group-Metrics?widget=10454394&udv=0)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182136_i_testing_test_case_parsed_monthly.yml)
+
+Group: `group::testing`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_test_case_parsed_weekly`
+
+Internal Tracking to count number of unit tests parsed for planning of future code testing features. Data available [here](https://app.periscopedata.com/app/gitlab/788674/Verify:Testing-Group-Metrics?widget=10454394&udv=0)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216182134_i_testing_test_case_parsed_weekly.yml)
+
+Group: `group::testing`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_web_performance_widget_total_monthly`
+
+Count of unique users per week|month who expanded the browser performance report MR widget
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182151_i_testing_web_performance_widget_total_monthly.yml)
+
+Group: `group::testing`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_web_performance_widget_total_weekly`
+
+Count of unique users per week|month who expanded the browser performance report MR widget
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216182149_i_testing_web_performance_widget_total_weekly.yml)
+
+Group: `group::testing`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.testing.testing_total_unique_counts_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184140_testing_total_unique_counts_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.testing.testing_total_unique_counts_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184138_testing_total_unique_counts_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.user_packages.i_package_composer_user_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184854_i_package_composer_user_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.user_packages.i_package_composer_user_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184852_i_package_composer_user_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.user_packages.i_package_conan_user_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184858_i_package_conan_user_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.user_packages.i_package_conan_user_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184856_i_package_conan_user_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.user_packages.i_package_container_user_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184902_i_package_container_user_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.user_packages.i_package_container_user_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184900_i_package_container_user_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.user_packages.i_package_debian_user_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184906_i_package_debian_user_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.user_packages.i_package_debian_user_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184904_i_package_debian_user_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.user_packages.i_package_generic_user_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184910_i_package_generic_user_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.user_packages.i_package_generic_user_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184908_i_package_generic_user_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.user_packages.i_package_golang_user_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184913_i_package_golang_user_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.user_packages.i_package_golang_user_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184911_i_package_golang_user_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.user_packages.i_package_maven_user_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184917_i_package_maven_user_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.user_packages.i_package_maven_user_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184916_i_package_maven_user_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.user_packages.i_package_npm_user_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184921_i_package_npm_user_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.user_packages.i_package_npm_user_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184919_i_package_npm_user_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.user_packages.i_package_nuget_user_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184925_i_package_nuget_user_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.user_packages.i_package_nuget_user_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184923_i_package_nuget_user_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.user_packages.i_package_pypi_user_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184929_i_package_pypi_user_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.user_packages.i_package_pypi_user_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184927_i_package_pypi_user_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.user_packages.i_package_tag_user_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184933_i_package_tag_user_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.user_packages.i_package_tag_user_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184931_i_package_tag_user_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.user_packages.user_packages_total_unique_counts_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184937_user_packages_total_unique_counts_monthly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.user_packages.user_packages_total_unique_counts_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184935_user_packages_total_unique_counts_weekly.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers:
+
+### `reply_by_email_enabled`
Whether incoming email is setup
-| field | value |
-| --- | --- |
-| `key_path` | **`reply_by_email_enabled`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | boolean |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `signup_enabled`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124916_reply_by_email_enabled.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `search_unique_visits.i_search_advanced`
+
+Calculated unique users to perform Advanced searches by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216180418_i_search_advanced.yml)
+
+Group: `group::global search`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `search_unique_visits.i_search_paid`
+
+Calculated unique users to perform a search with a paid license enabled by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216180420_i_search_paid.yml)
+
+Group: `group::global search`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `search_unique_visits.i_search_total`
+
+Calculated unique users to perform Basic or Advanced searches by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180416_i_search_total.yml)
+
+Group: `group::global search`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `search_unique_visits.search_unique_visits_for_any_target_monthly`
+
+Total unique users for i_search_total, i_search_advanced, i_search_paid for recent 28 days. This metric is redundant because advanced will be a subset of paid and paid will be a subset of total. i_search_total is more appropriate if you just want the total
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183922_search_unique_visits_for_any_target_monthly.yml)
+
+Group: `group::global search`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `search_unique_visits.search_unique_visits_for_any_target_weekly`
+
+Total unique users for i_search_total, i_search_advanced, i_search_paid for recent 7 days. This metric is redundant because advanced will be a subset of paid and paid will be a subset of total. i_search_total is more appropriate if you just want the total
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216183920_search_unique_visits_for_any_target_weekly.yml)
+
+Group: `group::global search`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `settings.ldap_encrypted_secrets_enabled`
+
+Is encrypted LDAP secrets configured?
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216175606_ldap_encrypted_secrets_enabled.yml)
+
+Group: `group::distribution`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `settings.operating_system`
+
+Information about the operating system running GitLab
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210225045628_operating_system.yml)
+
+Group: `group::distribution`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `signup_enabled`
Whether public signup is enabled
-| field | value |
-| --- | --- |
-| `key_path` | **`signup_enabled`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | boolean |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
-
-## `uuid`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124918_signup_enabled.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `topology.duration_s`
+
+Time it took to collect topology data
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180922_duration_s.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `topology.failures`
+
+Contains information about failed queries
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180924_failures.yml)
+
+Group: `group::memory`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.clusters_applications_cert_managers`
+
+Total GitLab Managed clusters with GitLab Managed App:Cert Manager installed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175329_clusters_applications_cert_managers.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.clusters_applications_helm`
+
+Total GitLab Managed clusters with GitLab Managed App:Helm enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175331_clusters_applications_helm.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.clusters_applications_ingress`
+
+Total GitLab Managed clusters with GitLab Managed App:Ingress installed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175333_clusters_applications_ingress.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.clusters_applications_knative`
+
+Total GitLab Managed clusters with GitLab Managed App:Knative installed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175335_clusters_applications_knative.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.clusters_disabled`
+
+Total GitLab Managed disabled clusters
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175339_clusters_disabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.clusters_enabled`
+
+Total GitLab Managed clusters currently enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175341_clusters_enabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.clusters_management_project`
+
+Total GitLab Managed clusters with defined cluster management project
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175337_clusters_management_project.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.clusters_platforms_eks`
+
+Total GitLab Managed clusters provisioned with GitLab on AWS EKS
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175345_clusters_platforms_eks.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.clusters_platforms_gke`
+
+Total GitLab Managed clusters provisioned with GitLab on GCE GKE
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175343_clusters_platforms_gke.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.clusters_platforms_user`
+
+Total GitLab Managed clusters that are user provisioned
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175346_clusters_platforms_user.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.group_clusters_disabled`
+
+Total GitLab Managed disabled clusters attached to groups
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175352_group_clusters_disabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.group_clusters_enabled`
+
+Total GitLab Managed enabled clusters attached to groups
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175354_group_clusters_enabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.instance_clusters_disabled`
+
+Total GitLab Managed disabled clusters attached to the instance
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175348_instance_clusters_disabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.instance_clusters_enabled`
+
+Total GitLab Managed enabled clusters attached to the instance
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175350_instance_clusters_enabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.project_clusters_disabled`
+
+Total GitLab Managed disabled clusters attached to projects
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175356_project_clusters_disabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.project_clusters_enabled`
+
+Total GitLab Managed enabled clusters attached to projects
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175358_project_clusters_enabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.projects_slack_notifications_active`
+
+Unique projects with Slack webhook enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175400_projects_slack_notifications_active.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.configure.projects_slack_slash_active`
+
+Unique projects with Slack ‘/’ commands enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175402_projects_slack_slash_active.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.configure.projects_with_prometheus_alerts`
+
+Projects with Prometheus alerting enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175403_projects_with_prometheus_alerts.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.create.approval_project_rules`
+
+Number of project approval rules
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182030_approval_project_rules.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.create.approval_project_rules_with_exact_required_approvers`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183355_approval_project_rules_with_exact_required_approvers.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.create.approval_project_rules_with_less_approvers_than_required`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183354_approval_project_rules_with_less_approvers_than_required.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.create.approval_project_rules_with_more_approvers_than_required`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183352_approval_project_rules_with_more_approvers_than_required.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.create.approval_project_rules_with_target_branch`
+
+Number of project approval rules with not default target branch
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182032_approval_project_rules_with_target_branch.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.create.deploy_keys`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182010_deploy_keys.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.create.keys`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182012_keys.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.create.merge_requests`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175045_merge_requests.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.create.merge_requests_with_added_rules`
+
+Merge Requests with added rules
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175047_merge_requests_with_added_rules.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.create.merge_requests_with_optional_codeowners`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175049_merge_requests_with_optional_codeowners.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.create.merge_requests_with_overridden_project_rules`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183339_merge_requests_with_overridden_project_rules.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.create.merge_requests_with_required_codeowners`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175051_merge_requests_with_required_codeowners.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.create.projects_enforcing_code_owner_approval`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182019_projects_enforcing_code_owner_approval.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.create.projects_imported_from_github`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180630_projects_imported_from_github.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.create.projects_with_disable_overriding_approvers_per_merge_request`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182014_projects_with_disable_overriding_approvers_per_merge_request.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.create.projects_with_repositories_enabled`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182023_projects_with_repositories_enabled.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.create.projects_with_sectional_code_owner_rules`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182021_projects_with_sectional_code_owner_rules.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.create.projects_without_disable_overriding_approvers_per_merge_request`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182015_projects_without_disable_overriding_approvers_per_merge_request.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.create.protected_branches`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182025_protected_branches.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.create.remote_mirrors`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182017_remote_mirrors.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.create.snippets`
+
+Snippets
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180316_snippets.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.create.suggestions`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175053_suggestions.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.create.total_number_of_locked_files`
+
+The total number of exclusive file locks (through the CLI)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182028_total_number_of_locked_files.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.create.total_number_of_path_locks`
+
+The total number of default branch locks done through the GitLab UI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182027_total_number_of_path_locks.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.create.users_using_lfs_locks`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183346_users_using_lfs_locks.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.create.users_using_path_locks`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183344_users_using_path_locks.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.bulk_imports.gitlab`
+
+Distinct count of users that triggered an import using the Group Migration tool
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180634_gitlab.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.bulk_imports.gitlab_v1`
+
+Count of imports using GitLab Migration
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180636_gitlab_v1.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.events`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180754_events.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.group_imports.gitlab_migration`
+
+Count of groups imported using GitLab Migration
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180703_gitlab_migration.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.group_imports.group_import`
+
+Count of group imports using Group Import/Export
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180702_group_import.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.group_saml_enabled`
+
+Has the instance enabled Group SAML SSO `https://docs.gitlab.com/ee/user/group/saml_sso/` on at least 1 group?
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/settings/20210216180813_group_saml_enabled.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers: `premium`
+
+### `usage_activity_by_stage.manage.groups`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180756_groups.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.groups_imported`
+
+Distinct count of users that imported groups using Group Import
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180729_groups_imported.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.issue_imports.csv`
+
+Count of (attempted) imports from csv files
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180700_csv.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.issue_imports.fogbugz`
+
+Count of projects imported from fogbugz
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180656_fogbugz.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.issue_imports.jira`
+
+Count of projects imported from Jira
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180654_jira.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.issue_imports.phabricator`
+
+Count of projects imported from phabricator
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180658_phabricator.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.issues_imported.csv`
+
+Distinct count of users that imported issues into projects using CSV upload
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180727_csv.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.issues_imported.fogbugz`
+
+Distinct count of users that imported issues into projects using FogBugz
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180724_fogbugz.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.issues_imported.jira`
+
+Distinct count of users that imported issues into projects using Jira
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180722_jira.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.issues_imported.phabricator`
+
+Distinct count of users that imported issues into projects using Phabricator
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180726_phabricator.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.ldap_admin_sync_enabled`
+
+Has the instance configured LDAP Admin Sync `https://docs.gitlab.com/ee/administration/auth/ldap/#administrator-sync`?
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/settings/20210216180811_ldap_admin_sync_enabled.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.manage.ldap_group_sync_enabled`
+
+Has the instance configured LDAP Group Sync `https://docs.gitlab.com/ee/administration/auth/ldap/#group-sync`?
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/settings/20210216180809_ldap_group_sync_enabled.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.manage.ldap_keys`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180800_ldap_keys.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.ldap_servers`
+
+Number of LDAP servers configured for the instance `https://docs.gitlab.com/ee/administration/auth/ldap/#multiple-ldap-servers`
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216180807_ldap_servers.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.manage.ldap_users`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180801_ldap_users.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.omniauth_providers`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183400_omniauth_providers.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.project_imports.bitbucket`
+
+Count of projects imported from Bitbucket
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180643_bitbucket.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.project_imports.bitbucket_server`
+
+Count of projects imported from Bitbucket Server
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180645_bitbucket_server.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.project_imports.git`
+
+Count of projects imported by URL
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180649_git.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.project_imports.gitea`
+
+Count of projects imported from Gitea
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180647_gitea.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.project_imports.github`
+
+Count of projects imported from GitHub
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180641_github.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.project_imports.gitlab`
+
+Count of projects imported from GitLab.com
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180639_gitlab.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.project_imports.gitlab_migration`
+
+Count of projects imported using GitLab Migration
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180652_gitlab_migration.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.project_imports.gitlab_project`
+
+Count of projects imported using Project Import/Export
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180638_gitlab_project.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.project_imports.manifest`
+
+Count of projects imported using manifst file
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180650_manifest.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.projects_imported.bitbucket`
+
+Distinct count of users that imported projects from Bitbucket Cloud
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180713_bitbucket.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.projects_imported.bitbucket_server`
+
+Distinct count of users that imported projects from Bitbucket Server
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180715_bitbucket_server.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.projects_imported.git`
+
+Distinct count of users that imported projects using Import by URL
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180718_git.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.projects_imported.gitea`
+
+Distinct count of users that imported projects from Gitea
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180716_gitea.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.projects_imported.github`
+
+Distinct count of users that imported projects from GitHub
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180711_github.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.projects_imported.gitlab`
+
+Distinct count of users that imported projects from GitLab.com
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180709_gitlab.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.projects_imported.gitlab_project`
+
+Distinct count of users that imported projects using Project Import/Export
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180707_gitlab_project.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.projects_imported.manifest`
+
+Distinct count of users that imported projects using Manifest file
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180720_manifest.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.projects_imported.total`
+
+Total count of all projects imported with import_source NOT NULL
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180705_total.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.projects_with_compliance_framework`
+
+Number of projects labeled with a compliance framework label [see](https://gitlab.com/gitlab-org/gitlab/-/issues/118671)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216180805_projects_with_compliance_framework.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.manage.unique_users_all_imports`
+
+Distinct count of users that triggered any kind of import
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180632_unique_users_all_imports.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.user_auth_by_provider.google_oauth2`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183410_google_oauth2.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.user_auth_by_provider.standard`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183408_standard.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.user_auth_by_provider.two-factor`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183402_two-factor.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.user_auth_by_provider.two-factor-via-u2f-device`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183404_two-factor-via-u2f-device.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.user_auth_by_provider.two-factor-via-webauthn-device`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183406_two-factor-via-webauthn-device.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.users_created`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180758_users_created.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.value_stream_management_customized_group_stages`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216180803_value_stream_management_customized_group_stages.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.monitor.clusters`
+
+Total GitLab Managed clusters both enabled and disabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180945_clusters.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.monitor.clusters_applications_prometheus`
+
+Total GitLab Managed clusters with Prometheus enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180947_clusters_applications_prometheus.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.monitor.operations_dashboard_default_dashboard`
+
+Active users with enabled operations dashboard
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180949_operations_dashboard_default_dashboard.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.monitor.operations_dashboard_users_with_projects_added`
+
+Active users with projects on operations dashboard
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180953_operations_dashboard_users_with_projects_added.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.monitor.projects_incident_sla_enabled`
+
+Projects where Incident SLA is enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180522_projects_incident_sla_enabled.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.monitor.projects_with_alert_incidents`
+
+Count of unique projects with an incident from an alert
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180520_projects_with_alert_incidents.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.monitor.projects_with_error_tracking_enabled`
+
+Projects where error tracking is enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180517_projects_with_error_tracking_enabled.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.monitor.projects_with_incidents`
+
+Count of unique projects with an incident
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180518_projects_with_incidents.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.monitor.projects_with_tracing_enabled`
+
+Projects with tracing enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180951_projects_with_tracing_enabled.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.package.projects_with_packages`
+
+Projects with package registry configured
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181055_projects_with_packages.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.plan.assignee_lists`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216181132_assignee_lists.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.plan.epics`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181134_epics.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.plan.issues`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181115_issues.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.plan.label_lists`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181135_label_lists.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.plan.milestone_lists`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181137_milestone_lists.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.plan.notes`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181117_notes.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.plan.projects`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181119_projects.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.plan.projects_jira_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181126_projects_jira_active.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.plan.projects_jira_dvcs_cloud_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181128_projects_jira_dvcs_cloud_active.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.plan.projects_jira_dvcs_server_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181130_projects_jira_dvcs_server_active.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.plan.service_desk_enabled_projects`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181122_service_desk_enabled_projects.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.plan.service_desk_issues`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181124_service_desk_issues.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.plan.todos`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181121_todos.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.release.deployments`
+
+Unique users triggering deployments
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181926_deployments.yml)
+
+Group: `group::release`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.release.failed_deployments`
+
+Total failed deployments
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181928_failed_deployments.yml)
+
+Group: `group::release`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.release.projects_mirrored_with_pipelines_enabled`
+
+Projects with repository mirroring enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181934_projects_mirrored_with_pipelines_enabled.yml)
+
+Group: `group::release`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.release.releases`
+
+Unique users creating release tags
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181930_releases.yml)
+
+Group: `group::release`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.release.successful_deployments`
+
+Total successful deployments
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181932_successful_deployments.yml)
+
+Group: `group::release`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.secure.api_fuzzing_scans`
+
+Counts API fuzzing jobs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216180353_api_fuzzing_scans.yml)
+
+Group: `group::fuzz testing`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.secure.container_scanning_scans`
+
+Counts container scanning jobs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175503_container_scanning_scans.yml)
+
+Group: `group::container security`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage.secure.coverage_fuzzing_scans`
+
+Counts fuzzing jobs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216180352_coverage_fuzzing_scans.yml)
+
+Group: `group::fuzz testing`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.secure.dast_scans`
+
+Counts dast jobs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182122_dast_scans.yml)
+
+Group: `group::static analysis`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.secure.dependency_scanning_scans`
+
+Counts dependency scanning jobs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175220_dependency_scanning_scans.yml)
+
+Group: `group::composition analysis`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage.secure.sast_scans`
+
+Counts sast jobs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182120_sast_scans.yml)
+
+Group: `group::static analysis`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.secure.secret_detection_scans`
+
+Counts secret detection jobs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182123_secret_detection_scans.yml)
+
+Group: `group::static analysis`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.secure.user_api_fuzzing_dnd_jobs`
+
+Count of API Fuzzing `docker-in-docker` jobs by job name
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180350_user_api_fuzzing_dnd_jobs.yml)
+
+Group: `group::fuzz testing`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.secure.user_api_fuzzing_jobs`
+
+Count of API Fuzzing jobs by job name
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180348_user_api_fuzzing_jobs.yml)
+
+Group: `group::fuzz testing`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.secure.user_container_scanning_jobs`
+
+no idea, Count of Container Scanning jobs run, it implies user but AFAIK we don't track per user
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175501_user_container_scanning_jobs.yml)
+
+Group: `group::container security`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage.secure.user_coverage_fuzzing_jobs`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183514_user_coverage_fuzzing_jobs.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.secure.user_dast_jobs`
+
+Count of DAST jobs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175614_user_dast_jobs.yml)
+
+Group: `group::dynamic analysis`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.secure.user_dependency_scanning_jobs`
+
+no idea, Count of Dependency Scanning jobs run, it implies user but AFAIK we don't track per user
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175216_user_dependency_scanning_jobs.yml)
+
+Group: `group::composition analysis`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage.secure.user_license_management_jobs`
+
+no idea, Count of License Scanning jobs run, it implies user but AFAIK we don't track per user
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210216175218_user_license_management_jobs.yml)
+
+Group: `group::composition analysis`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage.secure.user_preferences_group_overview_security_dashboard`
+
+Users who set personal preference to see Details on Group overview page
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182207_user_preferences_group_overview_security_dashboard.yml)
+
+Group: `group::threat insights`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage.secure.user_sast_jobs`
+
+Count of SAST jobs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182116_user_sast_jobs.yml)
+
+Group: `group::static analysis`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.secure.user_secret_detection_jobs`
+
+Count of Secret Detection Jobs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182118_user_secret_detection_jobs.yml)
+
+Group: `group::static analysis`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.secure.user_unique_users_all_secure_scanners`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181954_user_unique_users_all_secure_scanners.yml)
+
+Group: `group::secure`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.verify.ci_builds`
+
+Unique builds in project
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175525_ci_builds.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.verify.ci_external_pipelines`
+
+Total pipelines in external repositories
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175527_ci_external_pipelines.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.verify.ci_internal_pipelines`
+
+Total pipelines in GitLab repositories
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175529_ci_internal_pipelines.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.verify.ci_pipeline_config_auto_devops`
+
+Total pipelines from an Auto DevOps template
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175531_ci_pipeline_config_auto_devops.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.verify.ci_pipeline_config_repository`
+
+Total Pipelines from templates in repository
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175533_ci_pipeline_config_repository.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.verify.ci_pipeline_schedules`
+
+Pipeline schedules in GitLab
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175535_ci_pipeline_schedules.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.verify.ci_pipelines`
+
+Distinct Users triggering Total pipelines
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175537_ci_pipelines.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.verify.ci_triggers`
+
+Total configured Triggers in project
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175539_ci_triggers.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.verify.clusters_applications_runner`
+
+Total GitLab Managed clusters with Runner enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181949_clusters_applications_runner.yml)
+
+Group: `group::runner`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.verify.projects_reporting_ci_cd_back_to_github`
+
+Projects with a GitHub service pipeline enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175540_projects_reporting_ci_cd_back_to_github.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.clusters_applications_cert_managers`
+
+Total GitLab Managed clusters with Cert Manager enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175405_clusters_applications_cert_managers.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.clusters_applications_helm`
+
+Total GitLab Managed clusters with Helm enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175407_clusters_applications_helm.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.clusters_applications_ingress`
+
+Total GitLab Managed clusters with Ingress enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175409_clusters_applications_ingress.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.clusters_applications_knative`
+
+Total GitLab Managed clusters with Knative enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175411_clusters_applications_knative.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.clusters_disabled`
+
+Total GitLab Managed disabled clusters
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175415_clusters_disabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.clusters_enabled`
+
+Total GitLab Managed clusters currently enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175417_clusters_enabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.clusters_management_project`
+
+Total GitLab Managed clusters with defined cluster management project
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175413_clusters_management_project.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.clusters_platforms_eks`
+
+Total GitLab Managed clusters provisioned with GitLab on AWS EKS
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175420_clusters_platforms_eks.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.clusters_platforms_gke`
+
+Total GitLab Managed clusters provisioned with GitLab on GCE GKE
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175419_clusters_platforms_gke.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.clusters_platforms_user`
+
+Total GitLab Managed clusters that are user provisioned
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175422_clusters_platforms_user.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.group_clusters_disabled`
+
+Total GitLab Managed disabled clusters attached to groups
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175428_group_clusters_disabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.group_clusters_enabled`
+
+Total GitLab Managed enabled clusters attached to groups
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175430_group_clusters_enabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.instance_clusters_disabled`
+
+Total GitLab Managed disabled clusters attached to the instance
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175424_instance_clusters_disabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.instance_clusters_enabled`
+
+Total GitLab Managed enabled clusters attached to the instance
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175426_instance_clusters_enabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.project_clusters_disabled`
+
+Total GitLab Managed disabled clusters attached to projects
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175432_project_clusters_disabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.project_clusters_enabled`
+
+Total GitLab Managed enabled clusters attached to projects
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175434_project_clusters_enabled.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.projects_slack_notifications_active`
+
+Unique projects with Slack webhook enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216175436_projects_slack_notifications_active.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage_monthly.configure.projects_slack_slash_active`
+
+Unique projects with Slack ‘/’ commands enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216175437_projects_slack_slash_active.yml)
+
+Group: `group::configure`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage_monthly.configure.projects_with_prometheus_alerts`
+
+Projects with Prometheus alerting enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180955_projects_with_prometheus_alerts.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.action_monthly_active_users_design_management`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180745_action_monthly_active_users_design_management.yml)
+
+Group: `group::knowledge`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.action_monthly_active_users_git_write`
+
+Aggregated value for wiki, design and project repo actions
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182041_action_monthly_active_users_git_write.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.action_monthly_active_users_ide_edit`
+
+Count unique edit actions when users used an IDE, no matter which one
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180327_action_monthly_active_users_ide_edit.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.action_monthly_active_users_project_repo`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182040_action_monthly_active_users_project_repo.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.action_monthly_active_users_sfe_edit`
+
+Count unique edit actions using the single file editor
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180321_action_monthly_active_users_sfe_edit.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.action_monthly_active_users_snippet_editor_edit`
+
+Count unique edit actions using the snippet editor
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180323_action_monthly_active_users_snippet_editor_edit.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.action_monthly_active_users_sse_edit`
+
+Count unique edit actions using the static site editor
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180325_action_monthly_active_users_sse_edit.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.action_monthly_active_users_web_ide_edit`
+
+Count unique edit actions using the web IDE
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180319_action_monthly_active_users_web_ide_edit.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.action_monthly_active_users_wiki_repo`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180747_action_monthly_active_users_wiki_repo.yml)
+
+Group: `group::knowledge`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.approval_project_rules`
+
+Number of project approval rules
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182056_approval_project_rules.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage_monthly.create.approval_project_rules_with_exact_required_approvers`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183622_approval_project_rules_with_exact_required_approvers.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.approval_project_rules_with_less_approvers_than_required`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183620_approval_project_rules_with_less_approvers_than_required.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.approval_project_rules_with_more_approvers_than_required`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183618_approval_project_rules_with_more_approvers_than_required.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.approval_project_rules_with_target_branch`
+
+Number of project approval rules with not default target branch
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182058_approval_project_rules_with_target_branch.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage_monthly.create.deploy_keys`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182034_deploy_keys.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.keys`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182036_keys.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.merge_requests`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175055_merge_requests.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.merge_requests_users`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175101_merge_requests_users.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.merge_requests_with_added_rules`
+
+Merge Requests with added rules
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216175103_merge_requests_with_added_rules.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage_monthly.create.merge_requests_with_optional_codeowners`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216175105_merge_requests_with_optional_codeowners.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage_monthly.create.merge_requests_with_overridden_project_rules`
+
+Number of merge requests that have local rules that have overwritten a project rule
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182047_merge_requests_with_overridden_project_rules.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage_monthly.create.merge_requests_with_required_codeowners`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216175107_merge_requests_with_required_codeowners.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage_monthly.create.projects_enforcing_code_owner_approval`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182043_projects_enforcing_code_owner_approval.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.projects_imported_from_github`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180731_projects_imported_from_github.yml)
+
+Group: `group::import`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.projects_with_disable_overriding_approvers_per_merge_request`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175057_projects_with_disable_overriding_approvers_per_merge_request.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.projects_with_repositories_enabled`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182049_projects_with_repositories_enabled.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.projects_with_sectional_code_owner_rules`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182045_projects_with_sectional_code_owner_rules.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.projects_without_disable_overriding_approvers_per_merge_request`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175059_projects_without_disable_overriding_approvers_per_merge_request.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.protected_branches`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182051_protected_branches.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.remote_mirrors`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182038_remote_mirrors.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.snippets`
+
+Monthly Snippets
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180317_snippets.yml)
+
+Group: `group::editor`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.create.suggestions`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175109_suggestions.yml)
+
+Group: `group::code review`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.total_number_of_locked_files`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183614_total_number_of_locked_files.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.total_number_of_path_locks`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183613_total_number_of_path_locks.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.users_using_lfs_locks`
+
+Number of users that have used default branch locks through the UI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182054_users_using_lfs_locks.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage_monthly.create.users_using_path_locks`
+
+Number of users that have used exclusive file locks through the CLI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182053_users_using_path_locks.yml)
+
+Group: `group::source code`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage_monthly.manage.bulk_imports.gitlab`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183640_gitlab.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.bulk_imports.gitlab_v1`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183642_gitlab_v1.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.events`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180814_events.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.group_imports.gitlab_migration`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183711_gitlab_migration.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.group_imports.group_import`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183709_group_import.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.group_saml_enabled`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/settings/20210216180833_group_saml_enabled.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage_monthly.manage.groups`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180816_groups.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.groups_imported`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183737_groups_imported.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.issue_imports.csv`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183707_csv.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.issue_imports.fogbugz`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183703_fogbugz.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.issue_imports.jira`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183701_jira.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.issue_imports.phabricator`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183705_phabricator.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.issues_imported.csv`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183735_csv.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.issues_imported.fogbugz`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183731_fogbugz.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.issues_imported.jira`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183730_jira.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.issues_imported.phabricator`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183733_phabricator.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.ldap_admin_sync_enabled`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/settings/20210216180831_ldap_admin_sync_enabled.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage_monthly.manage.ldap_group_sync_enabled`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/settings/20210216180829_ldap_group_sync_enabled.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage_monthly.manage.ldap_keys`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180820_ldap_keys.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.ldap_servers`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216180827_ldap_servers.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage_monthly.manage.ldap_users`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180822_ldap_users.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.omniauth_providers`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183627_omniauth_providers.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.project_imports.bitbucket`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183650_bitbucket.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.project_imports.bitbucket_server`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183652_bitbucket_server.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.project_imports.git`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183655_git.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.project_imports.gitea`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183653_gitea.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.project_imports.github`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183648_github.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.project_imports.gitlab`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183646_gitlab.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.project_imports.gitlab_migration`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183659_gitlab_migration.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.project_imports.gitlab_project`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183644_gitlab_project.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.project_imports.manifest`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183657_manifest.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.projects_imported.bitbucket`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183720_bitbucket.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.projects_imported.bitbucket_server`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183722_bitbucket_server.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.projects_imported.git`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183726_git.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.projects_imported.gitea`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183724_gitea.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.projects_imported.github`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183718_github.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.projects_imported.gitlab`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183716_gitlab.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.projects_imported.gitlab_project`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183714_gitlab_project.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.projects_imported.manifest`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183728_manifest.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.projects_imported.total`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183712_total.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.projects_with_compliance_framework`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216180825_projects_with_compliance_framework.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage_monthly.manage.unique_users_all_imports`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183638_unique_users_all_imports.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.user_auth_by_provider.google_oauth2`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183636_google_oauth2.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.user_auth_by_provider.standard`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183634_standard.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.user_auth_by_provider.two-factor`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183629_two-factor.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.user_auth_by_provider.two-factor-via-u2f-device`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183631_two-factor-via-u2f-device.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.user_auth_by_provider.two-factor-via-webauthn-device`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183633_two-factor-via-webauthn-device.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.users_created`
+
+Number of users created in the month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180818_users_created.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.value_stream_management_customized_group_stages`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216180824_value_stream_management_customized_group_stages.yml)
+
+Group: `group::manage`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage_monthly.monitor.clusters`
+
+Total GitLab Managed clusters both enabled and disabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180956_clusters.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.monitor.clusters_applications_prometheus`
+
+Total GitLab Managed clusters with Prometheus enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180958_clusters_applications_prometheus.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.monitor.operations_dashboard_default_dashboard`
+
+Active users with enabled operations dashboard
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181000_operations_dashboard_default_dashboard.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.monitor.operations_dashboard_users_with_projects_added`
+
+Active users with projects on operations dashboard
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181006_operations_dashboard_users_with_projects_added.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.monitor.projects_incident_sla_enabled`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183753_projects_incident_sla_enabled.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.monitor.projects_with_alert_incidents`
+
+Count of unique projects with an incident from an alert created in the last month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180526_projects_with_alert_incidents.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.monitor.projects_with_error_tracking_enabled`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181004_projects_with_error_tracking_enabled.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.monitor.projects_with_incidents`
+
+Count of unique projects with an incident created in the last month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180524_projects_with_incidents.yml)
+
+Group: `group::health`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.monitor.projects_with_tracing_enabled`
+
+Projects with tracing enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181002_projects_with_tracing_enabled.yml)
+
+Group: `group::monitor`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.package.projects_with_packages`
+
+Incident confidential status changed event
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181057_projects_with_packages.yml)
+
+Group: `group::package`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.plan.assignee_lists`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216181156_assignee_lists.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage_monthly.plan.epics`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181158_epics.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.plan.issues`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181139_issues.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.plan.label_lists`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181200_label_lists.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.plan.milestone_lists`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181201_milestone_lists.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.plan.notes`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181141_notes.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.plan.projects`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181143_projects.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.plan.projects_jira_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181150_projects_jira_active.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.plan.projects_jira_dvcs_cloud_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181152_projects_jira_dvcs_cloud_active.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.plan.projects_jira_dvcs_server_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181154_projects_jira_dvcs_server_active.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.plan.service_desk_enabled_projects`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181147_service_desk_enabled_projects.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.plan.service_desk_issues`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181148_service_desk_issues.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.plan.todos`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181145_todos.yml)
+
+Group: `group::plan`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.release.deployments`
+
+Unique users triggering deployments
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181935_deployments.yml)
+
+Group: `group::release`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.release.failed_deployments`
+
+Total failed deployments
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181937_failed_deployments.yml)
+
+Group: `group::release`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.release.projects_mirrored_with_pipelines_enabled`
+
+Projects with repository mirroring enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181943_projects_mirrored_with_pipelines_enabled.yml)
+
+Group: `group::release`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.release.releases`
+
+Unique users creating release tags
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181939_releases.yml)
+
+Group: `group::release`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.release.successful_deployments`
+
+Total successful deployments
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181941_successful_deployments.yml)
+
+Group: `group::release`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.secure.api_fuzzing_pipeline`
+
+Counts of Pipelines that have at least 1 API Fuzzing Testing job
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216180401_api_fuzzing_pipeline.yml)
+
+Group: `group::fuzz testing`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.api_fuzzing_scans`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183838_api_fuzzing_scans.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.secure.container_scanning_pipeline`
+
+no idea, what is this when did it get added? guess pipelines containing a CS job
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216175507_container_scanning_pipeline.yml)
+
+Group: `group::container security`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.container_scanning_scans`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183830_container_scanning_scans.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.secure.coverage_fuzzing_pipeline`
+
+Counts of Pipelines that have at least 1 coverage-guided Fuzz Testing job
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216180359_coverage_fuzzing_pipeline.yml)
+
+Group: `group::fuzz testing`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.coverage_fuzzing_scans`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183836_coverage_fuzzing_scans.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.secure.dast_pipeline`
+
+Count of pipelines that have at least 1 DAST job
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175618_dast_pipeline.yml)
+
+Group: `group::dynamic analysis`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.dast_scans`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183832_dast_scans.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.secure.dependency_scanning_pipeline`
+
+no idea, what is this when did it get added? guess pipelines containing a DS job
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216175226_dependency_scanning_pipeline.yml)
+
+Group: `group::composition analysis`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.dependency_scanning_scans`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183828_dependency_scanning_scans.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.secure.sast_pipeline`
+
+Counts of Pipelines that have at least 1 SAST job
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182129_sast_pipeline.yml)
+
+Group: `group::static analysis`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.sast_scans`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183826_sast_scans.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.secure.secret_detection_pipeline`
+
+Counts of Pipelines that have at least 1 Secret Detection job
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182131_secret_detection_pipeline.yml)
+
+Group: `group::static analysis`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.secret_detection_scans`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183834_secret_detection_scans.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.secure.user_api_fuzzing_dnd_jobs`
+
+Count of API Fuzzing `docker-in-docker` jobs by job names
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180357_user_api_fuzzing_dnd_jobs.yml)
+
+Group: `group::fuzz testing`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.secure.user_api_fuzzing_jobs`
+
+Count of API Fuzzing jobs by job name
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180355_user_api_fuzzing_jobs.yml)
+
+Group: `group::fuzz testing`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.secure.user_container_scanning_jobs`
+
+no idea, Count of Container Scanning jobs run, it implies user and monthly, but AFAIK we don't track per user
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216175505_user_container_scanning_jobs.yml)
+
+Group: `group::container security`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.user_coverage_fuzzing_jobs`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183817_user_coverage_fuzzing_jobs.yml)
+
+Group: ``
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.secure.user_dast_jobs`
+
+Users who run a DAST job
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175616_user_dast_jobs.yml)
+
+Group: `group::dynamic analysis`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.secure.user_dependency_scanning_jobs`
+
+no idea, Count of Dependency Scanning jobs run, it implies user and monthly, but AFAIK we don't track per user
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216175222_user_dependency_scanning_jobs.yml)
+
+Group: `group::composition analysis`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.user_license_management_jobs`
+
+no idea, Count of License Scanning jobs run, it implies user and monthly, but AFAIK we don't track per user
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210216175224_user_license_management_jobs.yml)
+
+Group: `group::composition analysis`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.user_preferences_group_overview_security_dashboard`
+
+Users who set personal preference to see Security Dashboard on Group overview page
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182209_user_preferences_group_overview_security_dashboard.yml)
+
+Group: `group::threat insights`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.user_sast_jobs`
+
+Users who run a SAST job
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182125_user_sast_jobs.yml)
+
+Group: `group::static analysis`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.user_secret_detection_jobs`
+
+Users who run a Secret Detection job
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182127_user_secret_detection_jobs.yml)
+
+Group: `group::static analysis`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.user_unique_users_all_secure_scanners`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181956_user_unique_users_all_secure_scanners.yml)
+
+Group: `group::secure`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.verify.ci_builds`
+
+Unique builds in project
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175542_ci_builds.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.verify.ci_external_pipelines`
+
+Total pipelines in external repositories
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175544_ci_external_pipelines.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.verify.ci_internal_pipelines`
+
+Total pipelines in GitLab repositories
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175546_ci_internal_pipelines.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.verify.ci_pipeline_config_auto_devops`
+
+Total pipelines from an Auto DevOps template
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175548_ci_pipeline_config_auto_devops.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.verify.ci_pipeline_config_repository`
+
+Total Pipelines from templates in repository
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175550_ci_pipeline_config_repository.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.verify.ci_pipeline_schedules`
+
+Pipeline schedules in GitLab
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175552_ci_pipeline_schedules.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.verify.ci_pipelines`
+
+ Distinct users triggering pipelines in a month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175554_ci_pipelines.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.verify.ci_triggers`
+
+Total configured Triggers in project
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175556_ci_triggers.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.verify.clusters_applications_runner`
+
+Total GitLab Managed clusters with Runner enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181951_clusters_applications_runner.yml)
+
+Group: `group::runner`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.verify.projects_reporting_ci_cd_back_to_github`
+
+Projects with a GitHub service pipeline enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216175558_projects_reporting_ci_cd_back_to_github.yml)
+
+Group: `group::continuous integration`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `uuid`
GitLab instance unique identifier
-| field | value |
-| --- | --- |
-| `key_path` | **`uuid`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | string |
-| `status` | data_available |
-| `milestone` | 9.1 |
-| `introduced_by_url` | [Introduced by](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/1521) |
-| `time_frame` | none |
-| `data_source` | Database |
-| `distribution` | ee, ce |
-| `tier` | free, premium, ultimate |
-
-## `web_ide_clientside_preview_enabled`
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210201124933_uuid.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `version`
+
+Version of GitLab instance
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210216175601_version.yml)
+
+Group: `group::distribution`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `web_ide_clientside_preview_enabled`
Whether web ide clientside preview is enabled
-| field | value |
-| --- | --- |
-| `key_path` | **`web_ide_clientside_preview_enabled`** |
-| `product_section` | growth |
-| `product_stage` | growth |
-| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
-| `value_type` | boolean |
-| `status` | data_available |
-| `time_frame` | none |
-| `data_source` | |
-| `distribution` | |
-| `tier` | |
-| `skip_validation` | true |
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124920_web_ide_clientside_preview_enabled.yml)
+
+Group: `group::product intelligence`
+
+Status: `data_available`
+
+Tiers: `free`
diff --git a/doc/development/usage_ping/index.md b/doc/development/usage_ping/index.md
new file mode 100644
index 00000000000..604d59f42e1
--- /dev/null
+++ b/doc/development/usage_ping/index.md
@@ -0,0 +1,1337 @@
+---
+stage: Growth
+group: Product Intelligence
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Usage Ping Guide
+
+> Introduced in GitLab Ultimate 11.2, more statistics.
+
+This guide describes Usage Ping's purpose and how it's implemented.
+
+For more information about Product Intelligence, see:
+
+- [Product Intelligence Guide](https://about.gitlab.com/handbook/product/product-intelligence-guide/)
+- [Snowplow Guide](../snowplow.md)
+
+More links:
+
+- [Product Intelligence Direction](https://about.gitlab.com/direction/product-intelligence/)
+- [Data Analysis Process](https://about.gitlab.com/handbook/business-ops/data-team/#data-analysis-process/)
+- [Data for Product Managers](https://about.gitlab.com/handbook/business-ops/data-team/programs/data-for-product-managers/)
+- [Data Infrastructure](https://about.gitlab.com/handbook/business-ops/data-team/platform/infrastructure/)
+
+## What is Usage Ping?
+
+- GitLab sends a weekly payload containing usage data to GitLab Inc. Usage Ping provides high-level data to help our product, support, and sales teams. It does not send any project names, usernames, or any other specific data. The information from the usage ping is not anonymous, it is linked to the hostname of the instance. Sending usage ping is optional, and any instance can disable analytics.
+- The usage data is primarily composed of row counts for different tables in the instance’s database. By comparing these counts month over month (or week over week), we can get a rough sense for how an instance is using the different features in the product. In addition to counts, other facts
+ that help us classify and understand GitLab installations are collected.
+- Usage ping is important to GitLab as we use it to calculate our Stage Monthly Active Users (SMAU) which helps us measure the success of our stages and features.
+- While usage ping is enabled, GitLab gathers data from the other instances and can show usage statistics of your instance to your users.
+
+### Why should we enable Usage Ping?
+
+- The main purpose of Usage Ping is to build a better GitLab. Data about how GitLab is used is collected to better understand feature/stage adoption and usage, which helps us understand how GitLab is adding value and helps our team better understand the reasons why people use GitLab and with this knowledge we're able to make better product decisions.
+- As a benefit of having the usage ping active, GitLab lets you analyze the users’ activities over time of your GitLab installation.
+- As a benefit of having the usage ping active, GitLab provides you with The DevOps Report,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.
+- Usage Ping is enabled by default. To disable it, see [Disable Usage Ping](#disable-usage-ping).
+
+### Limitations
+
+- Usage Ping does not track frontend events things like page views, link clicks, or user sessions, and only focuses on aggregated backend events.
+- Because of these limitations we recommend instrumenting your products with Snowplow for more detailed analytics on GitLab.com and use Usage Ping to track aggregated backend events on self-managed.
+
+## Usage Ping payload
+
+You can view the exact JSON payload sent to GitLab Inc. in the administration panel. To view the payload:
+
+1. Navigate to **Admin Area > Settings > Metrics and profiling**.
+1. Expand the **Usage statistics** section.
+1. Click the **Preview payload** button.
+
+For an example payload, see [Example Usage Ping payload](#example-usage-ping-payload).
+
+## Disable Usage Ping
+
+To disable Usage Ping in the GitLab UI, go to the **Settings** page of your administration panel and uncheck the **Usage Ping** checkbox.
+
+To disable Usage Ping and prevent it from being configured in the future through the administration panel, Omnibus installs can set the following in [`gitlab.rb`](https://docs.gitlab.com/omnibus/settings/configuration.html#configuration-options):
+
+```ruby
+gitlab_rails['usage_ping_enabled'] = false
+```
+
+Source installations can set the following in `gitlab.yml`:
+
+```yaml
+production: &base
+ # ...
+ gitlab:
+ # ...
+ usage_ping_enabled: false
+```
+
+## Usage Ping request flow
+
+The following example shows a basic request/response flow between a GitLab instance, the Versions Application, the License Application, Salesforce, the GitLab S3 Bucket, the GitLab Snowflake Data Warehouse, and Sisense:
+
+```mermaid
+sequenceDiagram
+ participant GitLab Instance
+ participant Versions Application
+ participant Licenses Application
+ participant Salesforce
+ participant S3 Bucket
+ participant Snowflake DW
+ participant Sisense Dashboards
+ GitLab Instance->>Versions Application: Send Usage Ping
+ loop Process usage data
+ Versions Application->>Versions Application: Parse usage data
+ Versions Application->>Versions Application: Write to database
+ Versions Application->>Versions Application: Update license ping time
+ end
+ loop Process data for Salesforce
+ Versions Application-xLicenses Application: Request Zuora subscription id
+ Licenses Application-xVersions Application: Zuora subscription id
+ Versions Application-xSalesforce: Request Zuora account id by Zuora subscription id
+ Salesforce-xVersions Application: Zuora account id
+ Versions Application-xSalesforce: Usage data for the Zuora account
+ end
+ Versions Application->>S3 Bucket: Export Versions database
+ S3 Bucket->>Snowflake DW: Import data
+ Snowflake DW->>Snowflake DW: Transform data using dbt
+ Snowflake DW->>Sisense Dashboards: Data available for querying
+ Versions Application->>GitLab Instance: DevOps Report (Conversational Development Index)
+```
+
+## How Usage Ping works
+
+1. The Usage Ping [cron job](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/workers/gitlab_usage_ping_worker.rb#L30) is set in Sidekiq to run weekly.
+1. When the cron job runs, it calls [`Gitlab::UsageData.to_json`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/services/submit_usage_ping_service.rb#L22).
+1. `Gitlab::UsageData.to_json` [cascades down](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data.rb#L22) to ~400+ other counter method calls.
+1. The response of all methods calls are [merged together](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data.rb#L14) into a single JSON payload in `Gitlab::UsageData.to_json`.
+1. The JSON payload is then [posted to the Versions application]( https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/services/submit_usage_ping_service.rb#L20)
+ If a firewall exception is needed, the required URL depends on several things. If
+ the hostname is `version.gitlab.com`, the protocol is `TCP`, and the port number is `443`,
+ the required URL is <https://version.gitlab.com/>.
+
+## Usage Ping Metric Life cycle
+
+### 1. New metrics addition
+
+Please follow the [Implementing Usage Ping](#implementing-usage-ping) guide.
+
+### 2. Existing metric change
+
+Because we do not control when customers update their self-managed instances of GitLab,
+we **STRONGLY DISCOURAGE** changes to the logic used to calculate any metric.
+Any such changes lead to inconsistent reports from multiple GitLab instances.
+If there is a problem with an existing metric, it's best to deprecate the existing metric,
+and use it, side by side, with the desired new metric.
+
+Example:
+Consider following change. Before GitLab 12.6, the `example_metric` was implemented as:
+
+```ruby
+{
+ ...
+ example_metric: distinct_count(Project, :creator_id)
+}
+```
+
+For GitLab 12.6, the metric was changed to filter out archived projects:
+
+```ruby
+{
+ ...
+ example_metric: distinct_count(Project.non_archived, :creator_id)
+}
+```
+
+In this scenario all instances running up to GitLab 12.5 continue to report `example_metric`,
+including all archived projects, while all instances running GitLab 12.6 and higher filters
+out such projects. As Usage Ping data is collected from all reporting instances, the
+resulting dataset includes mixed data, which distorts any following business analysis.
+
+The correct approach is to add a new metric for GitLab 12.6 release with updated logic:
+
+```ruby
+{
+ ...
+ example_metric_without_archived: distinct_count(Project.non_archived, :creator_id)
+}
+```
+
+and update existing business analysis artefacts to use `example_metric_without_archived` instead of `example_metric`
+
+### 3. Metrics deprecation and removal
+
+The process for deprecating and removing metrics is under development. For
+more information, see the following [issue](https://gitlab.com/gitlab-org/gitlab/-/issues/284637).
+
+## Implementing Usage Ping
+
+Usage Ping consists of two kinds of data, counters and observations. Counters track how often a certain event
+happened over time, such as how many CI pipelines have run. They are monotonic and always trend up.
+Observations are facts collected from one or more GitLab instances and can carry arbitrary data. There are no
+general guidelines around how to collect those, due to the individual nature of that data.
+
+There are several types of counters which are all found in `usage_data.rb`:
+
+- **Ordinary Batch Counters:** Simple count of a given ActiveRecord_Relation
+- **Distinct Batch Counters:** Distinct count of a given ActiveRecord_Relation in a given column
+- **Sum Batch Counters:** Sum the values of a given ActiveRecord_Relation in a given column
+- **Alternative Counters:** Used for settings and configurations
+- **Redis Counters:** Used for in-memory counts.
+
+NOTE:
+Only use the provided counter methods. Each counter method contains a built in fail safe to isolate each counter to avoid breaking the entire Usage Ping.
+
+### Why batch counting
+
+For large tables, PostgreSQL can take a long time to count rows due to MVCC [(Multi-version Concurrency Control)](https://en.wikipedia.org/wiki/Multiversion_concurrency_control). Batch counting is a counting method where a single large query is broken into multiple smaller queries. For example, instead of a single query querying 1,000,000 records, with batch counting, you can execute 100 queries of 10,000 records each. Batch counting is useful for avoiding database timeouts as each batch query is significantly shorter than one single long running query.
+
+For GitLab.com, there are extremely large tables with 15 second query timeouts, so we use batch counting to avoid encountering timeouts. Here are the sizes of some GitLab.com tables:
+
+| Table | Row counts in millions |
+|------------------------------|------------------------|
+| `merge_request_diff_commits` | 2280 |
+| `ci_build_trace_sections` | 1764 |
+| `merge_request_diff_files` | 1082 |
+| `events` | 514 |
+
+We have several batch counting methods available:
+
+- [Ordinary Batch Counters](#ordinary-batch-counters)
+- [Distinct Batch Counters](#distinct-batch-counters)
+- [Sum Batch Counters](#sum-batch-counters)
+- [Estimated Batch Counters](#estimated-batch-counters)
+
+Batch counting requires indexes on columns to calculate max, min, and range queries. In some cases,
+you may need to add a specialized index on the columns involved in a counter.
+
+### Ordinary Batch Counters
+
+Handles `ActiveRecord::StatementInvalid` error
+
+Simple count of a given `ActiveRecord_Relation`, does a non-distinct batch count, smartly reduces `batch_size`, and handles errors.
+
+Method: `count(relation, column = nil, batch: true, start: nil, finish: nil)`
+
+Arguments:
+
+- `relation` the ActiveRecord_Relation to perform the count
+- `column` the column to perform the count on, by default is the primary key
+- `batch`: default `true` to use batch counting
+- `start`: custom start of the batch counting to avoid complex min calculations
+- `end`: custom end of the batch counting to avoid complex min calculations
+
+Examples:
+
+```ruby
+count(User.active)
+count(::Clusters::Cluster.aws_installed.enabled, :cluster_id)
+count(::Clusters::Cluster.aws_installed.enabled, :cluster_id, start: ::Clusters::Cluster.minimum(:id), finish: ::Clusters::Cluster.maximum(:id))
+```
+
+### Distinct Batch Counters
+
+Handles `ActiveRecord::StatementInvalid` error
+
+Distinct count of a given `ActiveRecord_Relation` on given column, a distinct batch count, smartly reduces `batch_size`, and handles errors.
+
+Method: `distinct_count(relation, column = nil, batch: true, batch_size: nil, start: nil, finish: nil)`
+
+Arguments:
+
+- `relation` the ActiveRecord_Relation to perform the count
+- `column` the column to perform the distinct count, by default is the primary key
+- `batch`: default `true` to use batch counting
+- `batch_size`: if none set it uses default value 10000 from `Gitlab::Database::BatchCounter`
+- `start`: custom start of the batch counting to avoid complex min calculations
+- `end`: custom end of the batch counting to avoid complex min calculations
+
+WARNING:
+Counting over non-unique columns can lead to performance issues. Take a look at the [iterating tables in batches](../iterating_tables_in_batches.md) guide for more details.
+
+Examples:
+
+```ruby
+distinct_count(::Project, :creator_id)
+distinct_count(::Note.with_suggestions.where(time_period), :author_id, start: ::User.minimum(:id), finish: ::User.maximum(:id))
+distinct_count(::Clusters::Applications::CertManager.where(time_period).available.joins(:cluster), 'clusters.user_id')
+```
+
+### Sum Batch Counters
+
+Handles `ActiveRecord::StatementInvalid` error
+
+Sum the values of a given ActiveRecord_Relation on given column and handles errors.
+
+Method: `sum(relation, column, batch_size: nil, start: nil, finish: nil)`
+
+Arguments:
+
+- `relation` the ActiveRecord_Relation to perform the operation
+- `column` the column to sum on
+- `batch_size`: if none set it uses default value 1000 from `Gitlab::Database::BatchCounter`
+- `start`: custom start of the batch counting to avoid complex min calculations
+- `end`: custom end of the batch counting to avoid complex min calculations
+
+Examples:
+
+```ruby
+sum(JiraImportState.finished, :imported_issues_count)
+```
+
+### Grouping & Batch Operations
+
+The `count`, `distinct_count`, and `sum` batch counters can accept an `ActiveRecord::Relation`
+object, which groups by a specified column. With a grouped relation, the methods do batch counting,
+handle errors, and returns a hash table of key-value pairs.
+
+Examples:
+
+```ruby
+count(Namespace.group(:type))
+# returns => {nil=>179, "Group"=>54}
+
+distinct_count(Project.group(:visibility_level), :creator_id)
+# returns => {0=>1, 10=>1, 20=>11}
+
+sum(Issue.group(:state_id), :weight))
+# returns => {1=>3542, 2=>6820}
+```
+
+### Estimated Batch Counters
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/48233) in GitLab 13.7.
+
+Estimated batch counter functionality handles `ActiveRecord::StatementInvalid` errors
+when used through the provided `estimate_batch_distinct_count` method.
+Errors return a value of `-1`.
+
+WARNING:
+This functionality estimates a distinct count of a specific ActiveRecord_Relation in a given column,
+which uses the [HyperLogLog](http://algo.inria.fr/flajolet/Publications/FlFuGaMe07.pdf) algorithm.
+As the HyperLogLog algorithm is probabilistic, the **results always include error**.
+The highest encountered error rate is 4.9%.
+
+When correctly used, the `estimate_batch_distinct_count` method enables efficient counting over
+columns that contain non-unique values, which can not be assured by other counters.
+
+#### estimate_batch_distinct_count method
+
+Method: `estimate_batch_distinct_count(relation, column = nil, batch_size: nil, start: nil, finish: nil)`
+
+The [method](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/utils/usage_data.rb#L63)
+includes the following arguments:
+
+- `relation`: The ActiveRecord_Relation to perform the count.
+- `column`: The column to perform the distinct count. The default is the primary key.
+- `batch_size`: From `Gitlab::Database::PostgresHll::BatchDistinctCounter::DEFAULT_BATCH_SIZE`. Default value: 10,000.
+- `start`: The custom start of the batch count, to avoid complex minimum calculations.
+- `finish`: The custom end of the batch count to avoid complex maximum calculations.
+
+The method includes the following prerequisites:
+
+1. The supplied `relation` must include the primary key defined as the numeric column.
+ For example: `id bigint NOT NULL`.
+1. The `estimate_batch_distinct_count` can handle a joined relation. To use its ability to
+ count non-unique columns, the joined relation **must NOT** have a one-to-many relationship,
+ such as `has_many :boards`.
+1. Both `start` and `finish` arguments should always represent primary key relationship values,
+ even if the estimated count refers to another column, for example:
+
+ ```ruby
+ estimate_batch_distinct_count(::Note, :author_id, start: ::Note.minimum(:id), finish: ::Note.maximum(:id))
+ ```
+
+Examples:
+
+1. Simple execution of estimated batch counter, with only relation provided,
+ returned value represents estimated number of unique values in `id` column
+ (which is the primary key) of `Project` relation:
+
+ ```ruby
+ estimate_batch_distinct_count(::Project)
+ ```
+
+1. Execution of estimated batch counter, where provided relation has applied
+ additional filter (`.where(time_period)`), number of unique values estimated
+ in custom column (`:author_id`), and parameters: `start` and `finish` together
+ apply boundaries that defines range of provided relation to analyze:
+
+ ```ruby
+ estimate_batch_distinct_count(::Note.with_suggestions.where(time_period), :author_id, start: ::Note.minimum(:id), finish: ::Note.maximum(:id))
+ ```
+
+1. Execution of estimated batch counter with joined relation (`joins(:cluster)`),
+ for a custom column (`'clusters.user_id'`):
+
+ ```ruby
+ estimate_batch_distinct_count(::Clusters::Applications::CertManager.where(time_period).available.joins(:cluster), 'clusters.user_id')
+ ```
+
+When instrumenting metric with usage of estimated batch counter please add
+`_estimated` suffix to its name, for example:
+
+```ruby
+ "counts": {
+ "ci_builds_estimated": estimate_batch_distinct_count(Ci::Build),
+ ...
+```
+
+### Redis Counters
+
+Handles `::Redis::CommandError` and `Gitlab::UsageDataCounters::BaseCounter::UnknownEvent`
+returns -1 when a block is sent or hash with all values -1 when a `counter(Gitlab::UsageDataCounters)` is sent
+different behavior due to 2 different implementations of Redis counter
+
+Method: `redis_usage_data(counter, &block)`
+
+Arguments:
+
+- `counter`: a counter from `Gitlab::UsageDataCounters`, that has `fallback_totals` method implemented
+- or a `block`: which is evaluated
+
+#### Ordinary Redis Counters
+
+Examples of implementation:
+
+- Using Redis methods [`INCR`](https://redis.io/commands/incr), [`GET`](https://redis.io/commands/get), and [`Gitlab::UsageDataCounters::WikiPageCounter`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/wiki_page_counter.rb)
+- Using Redis methods [`HINCRBY`](https://redis.io/commands/hincrby), [`HGETALL`](https://redis.io/commands/hgetall), and [`Gitlab::UsageCounters::PodLogs`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_counters/pod_logs.rb)
+
+##### UsageData API Tracking
+
+<!-- There's nearly identical content in `##### Adding new events`. If you fix errors here, you may need to fix the same errors in the other location. -->
+
+1. Track event using `UsageData` API
+
+ Increment event count using ordinary Redis counter, for given event name.
+
+ Tracking events using the `UsageData` API requires the `usage_data_api` feature flag to be enabled, which is enabled by default.
+
+ API requests are protected by checking for a valid CSRF token.
+
+ To be able to increment the values, the related feature `usage_data_<event_name>` should be enabled.
+
+ ```plaintext
+ POST /usage_data/increment_counter
+ ```
+
+ | Attribute | Type | Required | Description |
+ | :-------- | :--- | :------- | :---------- |
+ | `event` | string | yes | The event name it should be tracked |
+
+ Response
+
+ - `200` if event was tracked
+ - `400 Bad request` if event parameter is missing
+ - `401 Unauthorized` if user is not authenticated
+ - `403 Forbidden` for invalid CSRF token provided
+
+1. Track events using JavaScript/Vue API helper which calls the API above
+
+ Note that `usage_data_api` and `usage_data_#{event_name}` should be enabled to be able to track events
+
+ ```javascript
+ import api from '~/api';
+
+ api.trackRedisCounterEvent('my_already_defined_event_name'),
+ ```
+
+#### Redis HLL Counters
+
+WARNING:
+HyperLogLog (HLL) is a probabilistic algorithm and its **results always includes some small error**. According to [Redis documentation](https://redis.io/commands/pfcount), data from
+used HLL implementation is "approximated with a standard error of 0.81%".
+
+With `Gitlab::UsageDataCounters::HLLRedisCounter` we have available data structures used to count unique values.
+
+Implemented using Redis methods [PFADD](https://redis.io/commands/pfadd) and [PFCOUNT](https://redis.io/commands/pfcount).
+
+##### Adding new events
+
+1. Define events in [`known_events`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/known_events/).
+
+ Example event:
+
+ ```yaml
+ - name: i_compliance_credential_inventory
+ category: compliance
+ redis_slot: compliance
+ expiry: 42 # 6 weeks
+ aggregation: weekly
+ ```
+
+ Keys:
+
+ - `name`: unique event name.
+
+ Name format `<prefix>_<redis_slot>_name`.
+
+ Use one of the following prefixes for the event's name:
+
+ - `g_` for group, as an event which is tracked for group.
+ - `p_` for project, as an event which is tracked for project.
+ - `i_` for instance, as an event which is tracked for instance.
+ - `a_` for events encompassing all `g_`, `p_`, `i_`.
+ - `o_` for other.
+
+ Consider including in the event's name the Redis slot to be able to count totals for a specific category.
+
+ Example names: `i_compliance_credential_inventory`, `g_analytics_contribution`.
+
+ - `category`: event category. Used for getting total counts for events in a category, for easier
+ access to a group of events.
+ - `redis_slot`: optional Redis slot; default value: event name. Used if needed to calculate totals
+ for a group of metrics. Ensure keys are in the same slot. For example:
+ `i_compliance_credential_inventory` with `redis_slot: 'compliance'` builds Redis key
+ `i_{compliance}_credential_inventory-2020-34`. If `redis_slot` is not defined the Redis key will
+ be `{i_compliance_credential_inventory}-2020-34`.
+ - `expiry`: expiry time in days. Default: 29 days for daily aggregation and 6 weeks for weekly
+ aggregation.
+ - `aggregation`: may be set to a `:daily` or `:weekly` key. Defines how counting data is stored in Redis.
+ Aggregation on a `daily` basis does not pull more fine grained data.
+ - `feature_flag`: optional `default_enabled: :yaml`. If no feature flag is set then the tracking is enabled. For details, see our [GitLab internal Feature flags](../feature_flags/index.md) documentation. The feature flags are owned by the group adding the event tracking.
+
+Use one of the following methods to track events:
+
+1. Track event in controller using `RedisTracking` module with `track_redis_hll_event(*controller_actions, name:, if: nil)`.
+
+ Arguments:
+
+ - `controller_actions`: controller actions we want to track.
+ - `name`: event name.
+ - `if`: optional custom conditions, using the same format as with Rails callbacks.
+
+ Example usage:
+
+ ```ruby
+ # controller
+ class ProjectsController < Projects::ApplicationController
+ include RedisTracking
+
+ skip_before_action :authenticate_user!, only: :show
+ track_redis_hll_event :index, :show, name: 'g_compliance_example_feature_visitors'
+
+ def index
+ render html: 'index'
+ end
+
+ def new
+ render html: 'new'
+ end
+
+ def show
+ render html: 'show'
+ end
+ end
+ ```
+
+1. Track event in API using `increment_unique_values(event_name, values)` helper method.
+
+ To be able to track the event, Usage Ping must be enabled and the event feature `usage_data_<event_name>` must be enabled.
+
+ Arguments:
+
+ - `event_name`: event name.
+ - `values`: values counted, one value or array of values.
+
+ Example usage:
+
+ ```ruby
+ get ':id/registry/repositories' do
+ repositories = ContainerRepositoriesFinder.new(
+ user: current_user, subject: user_group
+ ).execute
+
+ increment_unique_values('i_list_repositories', current_user.id)
+
+ present paginate(repositories), with: Entities::ContainerRegistry::Repository, tags: params[:tags], tags_count: params[:tags_count]
+ end
+ ```
+
+1. Track event using `track_usage_event(event_name, values)` in services and GraphQL
+
+ Increment unique values count using Redis HLL, for given event name.
+
+ Example:
+
+ [Track usage event for incident created in service](https://gitlab.com/gitlab-org/gitlab/-/blob/v13.8.3-ee/app/services/issues/update_service.rb#L66)
+
+ [Track usage event for incident created in GraphQL](https://gitlab.com/gitlab-org/gitlab/-/blob/v13.8.3-ee/app/graphql/mutations/alert_management/update_alert_status.rb#L16)
+
+ ```ruby
+ track_usage_event(:incident_management_incident_created, current_user.id)
+ ```
+
+<!-- There's nearly identical content in `##### UsageData API Tracking`. If you find / fix errors here, you may need to fix errors in that section too. -->
+
+1. Track event using `UsageData` API
+
+ Increment unique users count using Redis HLL, for given event name.
+
+ Tracking events using the `UsageData` API requires the `usage_data_api` feature flag to be enabled, which is enabled by default.
+
+ API requests are protected by checking for a valid CSRF token.
+
+ To increment the values, the related feature `usage_data_<event_name>` should be
+ set to `default_enabled: true`. For more information, see
+ [Feature flags in development of GitLab](../feature_flags/index.md).
+
+ ```plaintext
+ POST /usage_data/increment_unique_users
+ ```
+
+ | Attribute | Type | Required | Description |
+ | :-------- | :--- | :------- | :---------- |
+ | `event` | string | yes | The event name it should be tracked |
+
+ Response
+
+ Return 200 if tracking failed for any reason.
+
+ - `200` if event was tracked or any errors
+ - `400 Bad request` if event parameter is missing
+ - `401 Unauthorized` if user is not authenticated
+ - `403 Forbidden` for invalid CSRF token provided
+
+1. Track events using JavaScript/Vue API helper which calls the API above
+
+ Example usage for an existing event already defined in [known events](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/known_events/):
+
+ Usage Data API is behind `usage_data_api` feature flag which, as of GitLab 13.7, is
+ now set to `default_enabled: true`.
+
+ Each event tracked using Usage Data API is behind a feature flag `usage_data_#{event_name}` which should be `default_enabled: true`
+
+ ```javascript
+ import api from '~/api';
+
+ api.trackRedisHllUserEvent('my_already_defined_event_name'),
+ ```
+
+1. Get event data using `Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(event_names:, start_date:, end_date:, context: '')`.
+
+ Arguments:
+
+ - `event_names`: the list of event names.
+ - `start_date`: start date of the period for which we want to get event data.
+ - `end_date`: end date of the period for which we want to get event data.
+ - `context`: context of the event. Allowed values are `default`, `free`, `bronze`, `silver`, `gold`, `starter`, `premium`, `ultimate`.
+
+1. Testing tracking and getting unique events
+
+Trigger events in rails console by using `track_event` method
+
+ ```ruby
+ Gitlab::UsageDataCounters::HLLRedisCounter.track_event('g_compliance_audit_events', values: 1)
+ Gitlab::UsageDataCounters::HLLRedisCounter.track_event('g_compliance_audit_events', values: [2, 3])
+ ```
+
+Next, get the unique events for the current week.
+
+ ```ruby
+ # Get unique events for metric for current_week
+ Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(event_names: 'g_compliance_audit_events',
+ start_date: Date.current.beginning_of_week, end_date: Date.current.next_week)
+ ```
+
+##### Recommendations
+
+We have the following recommendations for [Adding new events](#adding-new-events):
+
+- Event aggregation: weekly.
+- Key expiry time:
+ - Daily: 29 days.
+ - Weekly: 42 days.
+- When adding new metrics, use a [feature flag](../../operations/feature_flags.md) to control the impact.
+- For feature flags triggered by another service, set `default_enabled: false`,
+ - Events can be triggered using the `UsageData` API, which helps when there are > 10 events per change
+
+##### Enable/Disable Redis HLL tracking
+
+Events are tracked behind [feature flags](../feature_flags/index.md) due to concerns for Redis performance and scalability.
+
+For a full list of events and corresponding feature flags see, [known_events](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/known_events/) files.
+
+To enable or disable tracking for specific event in <https://gitlab.com> or <https://about.staging.gitlab.com>, run commands such as the following to
+[enable or disable the corresponding feature](../feature_flags/index.md).
+
+```shell
+/chatops run feature set <feature_name> true
+/chatops run feature set <feature_name> false
+```
+
+##### Known events are added automatically in usage data payload
+
+All events added in [`known_events/common.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/known_events/common.yml) are automatically added to usage data generation under the `redis_hll_counters` key. This column is stored in [version-app as a JSON](https://gitlab.com/gitlab-services/version-gitlab-com/-/blob/master/db/schema.rb#L209).
+For each event we add metrics for the weekly and monthly time frames, and totals for each where applicable:
+
+- `#{event_name}_weekly`: Data for 7 days for daily [aggregation](#adding-new-events) events and data for the last complete week for weekly [aggregation](#adding-new-events) events.
+- `#{event_name}_monthly`: Data for 28 days for daily [aggregation](#adding-new-events) events and data for the last 4 complete weeks for weekly [aggregation](#adding-new-events) events.
+
+Redis HLL implementation calculates automatic total metrics, if there are more than one metric for the same category, aggregation, and Redis slot.
+
+- `#{category}_total_unique_counts_weekly`: Total unique counts for events in the same category for the last 7 days or the last complete week, if events are in the same Redis slot and we have more than one metric.
+- `#{category}_total_unique_counts_monthly`: Total unique counts for events in same category for the last 28 days or the last 4 complete weeks, if events are in the same Redis slot and we have more than one metric.
+
+Example of `redis_hll_counters` data:
+
+```ruby
+{:redis_hll_counters=>
+ {"compliance"=>
+ {"g_compliance_dashboard_weekly"=>0,
+ "g_compliance_dashboard_monthly"=>0,
+ "g_compliance_audit_events_weekly"=>0,
+ "g_compliance_audit_events_monthly"=>0,
+ "compliance_total_unique_counts_weekly"=>0,
+ "compliance_total_unique_counts_monthly"=>0},
+ "analytics"=>
+ {"g_analytics_contribution_weekly"=>0,
+ "g_analytics_contribution_monthly"=>0,
+ "g_analytics_insights_weekly"=>0,
+ "g_analytics_insights_monthly"=>0,
+ "analytics_total_unique_counts_weekly"=>0,
+ "analytics_total_unique_counts_monthly"=>0},
+ "ide_edit"=>
+ {"g_edit_by_web_ide_weekly"=>0,
+ "g_edit_by_web_ide_monthly"=>0,
+ "g_edit_by_sfe_weekly"=>0,
+ "g_edit_by_sfe_monthly"=>0,
+ "ide_edit_total_unique_counts_weekly"=>0,
+ "ide_edit_total_unique_counts_monthly"=>0},
+ "search"=>
+ {"i_search_total_weekly"=>0, "i_search_total_monthly"=>0, "i_search_advanced_weekly"=>0, "i_search_advanced_monthly"=>0, "i_search_paid_weekly"=>0, "i_search_paid_monthly"=>0, "search_total_unique_counts_weekly"=>0, "search_total_unique_counts_monthly"=>0},
+ "source_code"=>{"wiki_action_weekly"=>0, "wiki_action_monthly"=>0}
+ }
+```
+
+Example usage:
+
+```ruby
+# Redis Counters
+redis_usage_data(Gitlab::UsageDataCounters::WikiPageCounter)
+redis_usage_data { ::Gitlab::UsageCounters::PodLogs.usage_totals[:total] }
+
+# Define events in common.yml https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/known_events/common.yml
+
+# Tracking events
+Gitlab::UsageDataCounters::HLLRedisCounter.track_event('expand_vulnerabilities', values: visitor_id)
+
+# Get unique events for metric
+redis_usage_data { Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(event_names: 'expand_vulnerabilities', start_date: 28.days.ago, end_date: Date.current) }
+```
+
+### Alternative Counters
+
+Handles `StandardError` and fallbacks into -1 this way not all measures fail if we encounter one exception.
+Mainly used for settings and configurations.
+
+Method: `alt_usage_data(value = nil, fallback: -1, &block)`
+
+Arguments:
+
+- `value`: a simple static value in which case the value is simply returned.
+- or a `block`: which is evaluated
+- `fallback: -1`: the common value used for any metrics that are failing.
+
+Usage:
+
+```ruby
+alt_usage_data { Gitlab::VERSION }
+alt_usage_data { Gitlab::CurrentSettings.uuid }
+alt_usage_data(999)
+```
+
+### Adding counters to build new metrics
+
+When adding the results of two counters, use the `add` usage data method that
+handles fallback values and exceptions. It also generates a valid [SQL export](#exporting-usage-ping-sql-queries-and-definitions).
+
+Example usage:
+
+```ruby
+add(User.active, User.bot)
+```
+
+### Prometheus Queries
+
+In those cases where operational metrics should be part of Usage Ping, a database or Redis query is unlikely
+to provide useful data. Instead, Prometheus might be more appropriate, because most GitLab architectural
+components publish metrics to it that can be queried back, aggregated, and included as usage data.
+
+NOTE:
+Prometheus as a data source for Usage Ping is currently only available for single-node Omnibus installations
+that are running the [bundled Prometheus](../../administration/monitoring/prometheus/index.md) instance.
+
+To query Prometheus for metrics, a helper method is available to `yield` a fully configured
+`PrometheusClient`, given it is available as per the note above:
+
+```ruby
+with_prometheus_client do |client|
+ response = client.query('<your query>')
+ ...
+end
+```
+
+Please refer to [the `PrometheusClient` definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/prometheus_client.rb)
+for how to use its API to query for data.
+
+## Developing and testing Usage Ping
+
+### 1. Naming and placing the metrics
+
+Add the metric in one of the top level keys
+
+- `license`: for license related metrics.
+- `settings`: for settings related metrics.
+- `counts_weekly`: for counters that have data for the most recent 7 days.
+- `counts_monthly`: for counters that have data for the most recent 28 days.
+- `counts`: for counters that have data for all time.
+
+### 2. Use your Rails console to manually test counters
+
+```ruby
+# count
+Gitlab::UsageData.count(User.active)
+Gitlab::UsageData.count(::Clusters::Cluster.aws_installed.enabled, :cluster_id)
+
+# count distinct
+Gitlab::UsageData.distinct_count(::Project, :creator_id)
+Gitlab::UsageData.distinct_count(::Note.with_suggestions.where(time_period), :author_id, start: ::User.minimum(:id), finish: ::User.maximum(:id))
+```
+
+### 3. Generate the SQL query
+
+Your Rails console returns the generated SQL queries.
+
+Example:
+
+```ruby
+pry(main)> Gitlab::UsageData.count(User.active)
+ (2.6ms) SELECT "features"."key" FROM "features"
+ (15.3ms) SELECT MIN("users"."id") FROM "users" WHERE ("users"."state" IN ('active')) AND ("users"."user_type" IS NULL OR "users"."user_type" IN (6, 4))
+ (2.4ms) SELECT MAX("users"."id") FROM "users" WHERE ("users"."state" IN ('active')) AND ("users"."user_type" IS NULL OR "users"."user_type" IN (6, 4))
+ (1.9ms) SELECT COUNT("users"."id") FROM "users" WHERE ("users"."state" IN ('active')) AND ("users"."user_type" IS NULL OR "users"."user_type" IN (6, 4)) AND "users"."id" BETWEEN 1 AND 100000
+```
+
+### 4. Optimize queries with #database-lab
+
+Paste the SQL query into `#database-lab` to see how the query performs at scale.
+
+- `#database-lab` is a Slack channel which uses a production-sized environment to test your queries.
+- GitLab.com’s production database has a 15 second timeout.
+- Any single query must stay below [1 second execution time](../query_performance.md#timing-guidelines-for-queries) with cold caches.
+- Add a specialized index on columns involved to reduce the execution time.
+
+To have an understanding of the query's execution we add in the MR description the following information:
+
+- For counters that have a `time_period` test we add information for both cases:
+ - `time_period = {}` for all time periods
+ - `time_period = { created_at: 28.days.ago..Time.current }` for last 28 days period
+- Execution plan and query time before and after optimization
+- Query generated for the index and time
+- Migration output for up and down execution
+
+We also use `#database-lab` and [explain.depesz.com](https://explain.depesz.com/). For more details, see the [database review guide](../database_review.md#preparation-when-adding-or-modifying-queries).
+
+#### Optimization recommendations and examples
+
+- Use specialized indexes [example 1](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/26871), [example 2](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/26445).
+- Use defined `start` and `finish`, and simple queries. These values can be memoized and reused, [example](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/37155).
+- Avoid joins and write the queries as simply as possible, [example](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/36316).
+- Set a custom `batch_size` for `distinct_count`, [example](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/38000).
+
+### 5. Add the metric definition
+
+[Check Metrics Dictionary Guide](metrics_dictionary.md)
+
+When adding, updating, or removing metrics, please update the [Metrics Dictionary](dictionary.md).
+
+### 6. Add new metric to Versions Application
+
+Check if new metrics need to be added to the Versions Application. See `usage_data` [schema](https://gitlab.com/gitlab-services/version-gitlab-com/-/blob/master/db/schema.rb#L147) and usage data [parameters accepted](https://gitlab.com/gitlab-services/version-gitlab-com/-/blob/master/app/services/usage_ping.rb). Any metrics added under the `counts` key are saved in the `stats` column.
+
+### 7. Add the feature label
+
+Add the `feature` label to the Merge Request for new Usage Ping metrics. These are user-facing changes and are part of expanding the Usage Ping feature.
+
+### 8. Add a changelog file
+
+Ensure you comply with the [Changelog entries guide](../changelog.md).
+
+### 9. Ask for a Product Intelligence Review
+
+On GitLab.com, we have DangerBot setup to monitor Product Intelligence related files and DangerBot recommends a [Product Intelligence review](product_intelligence_review.md). Mention `@gitlab-org/growth/product_intelligence/engineers` in your MR for a review.
+
+### 10. Verify your metric
+
+On GitLab.com, the Product Intelligence team regularly monitors Usage Ping. They may alert you that your metrics need further optimization to run quicker and with greater success. You may also use the [Usage Ping QA dashboard](https://app.periscopedata.com/app/gitlab/632033/Usage-Ping-QA) to check how well your metric performs. The dashboard allows filtering by GitLab version, by "Self-managed" & "SaaS" and shows you how many failures have occurred for each metric. Whenever you notice a high failure rate, you may re-optimize your metric.
+
+### Optional: Test Prometheus based Usage Ping
+
+If the data submitted includes metrics [queried from Prometheus](#prometheus-queries) that you would like to inspect and verify,
+then you need to ensure that a Prometheus server is running locally, and that furthermore the respective GitLab components
+are exporting metrics to it. If you do not need to test data coming from Prometheus, no further action
+is necessary. Usage Ping should degrade gracefully in the absence of a running Prometheus server.
+
+There are three kinds of components that may export data to Prometheus, and which are included in Usage Ping:
+
+- [`node_exporter`](https://github.com/prometheus/node_exporter) - Exports node metrics from the host machine
+- [`gitlab-exporter`](https://gitlab.com/gitlab-org/gitlab-exporter) - Exports process metrics from various GitLab components
+- various GitLab services such as Sidekiq and the Rails server that export their own metrics
+
+#### Test with an Omnibus container
+
+This is the recommended approach to test Prometheus based Usage Ping.
+
+The easiest way to verify your changes is to build a new Omnibus image from your code branch by using CI, then download the image
+and run a local container instance:
+
+1. From your merge request, click on the `qa` stage, then trigger the `package-and-qa` job. This job triggers an Omnibus
+build in a [downstream pipeline of the `omnibus-gitlab-mirror` project](https://gitlab.com/gitlab-org/build/omnibus-gitlab-mirror/-/pipelines).
+1. In the downstream pipeline, wait for the `gitlab-docker` job to finish.
+1. Open the job logs and locate the full container name including the version. It takes the following form: `registry.gitlab.com/gitlab-org/build/omnibus-gitlab-mirror/gitlab-ee:<VERSION>`.
+1. On your local machine, make sure you are signed in to the GitLab Docker registry. You can find the instructions for this in
+[Authenticate to the GitLab Container Registry](../../user/packages/container_registry/index.md#authenticate-with-the-container-registry).
+1. Once signed in, download the new image by using `docker pull registry.gitlab.com/gitlab-org/build/omnibus-gitlab-mirror/gitlab-ee:<VERSION>`
+1. For more information about working with and running Omnibus GitLab containers in Docker, please refer to [GitLab Docker images](https://docs.gitlab.com/omnibus/docker/README.html) in the Omnibus documentation.
+
+#### Test with GitLab development toolkits
+
+This is the less recommended approach, because it comes with a number of difficulties when emulating a real GitLab deployment.
+
+The [GDK](https://gitlab.com/gitlab-org/gitlab-development-kit) is not set up to run a Prometheus server or `node_exporter` alongside other GitLab components. If you would
+like to do so, [Monitoring the GDK with Prometheus](https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/master/doc/howto/prometheus/index.md#monitoring-the-gdk-with-prometheus) is a good start.
+
+The [GCK](https://gitlab.com/gitlab-org/gitlab-compose-kit) has limited support for testing Prometheus based Usage Ping.
+By default, it already comes with a fully configured Prometheus service that is set up to scrape a number of components,
+but with the following limitations:
+
+- It does not run a `gitlab-exporter` instance, so several `process_*` metrics from services such as Gitaly may be missing.
+- While it runs a `node_exporter`, `docker-compose` services emulate hosts, meaning that it would normally report itself to not be associated
+with any of the other services that are running. That is not how node metrics are reported in a production setup, where `node_exporter`
+always runs as a process alongside other GitLab components on any given node. From Usage Ping's perspective none of the node data would therefore
+appear to be associated to any of the services running, because they all appear to be running on different hosts. To alleviate this problem, the `node_exporter` in GCK was arbitrarily "assigned" to the `web` service, meaning only for this service `node_*` metrics appears in Usage Ping.
+
+## Aggregated metrics
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/45979) in GitLab 13.6.
+
+WARNING:
+This feature is intended solely for internal GitLab use.
+
+To add data for aggregated metrics into Usage Ping payload you should add corresponding definition at [`lib/gitlab/usage_data_counters/aggregated_metrics/*.yaml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/aggregated_metrics/) for metrics available at Community Edition and at [`ee/lib/gitlab/usage_data_counters/aggregated_metrics/*.yaml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/gitlab/usage_data_counters/aggregated_metrics/) for Enterprise Edition ones.
+
+Each aggregate definition includes following parts:
+
+- `name`: Unique name under which the aggregate metric is added to the Usage Ping payload.
+- `operator`: Operator that defines how the aggregated metric data is counted. Available operators are:
+ - `OR`: Removes duplicates and counts all entries that triggered any of listed events.
+ - `AND`: Removes duplicates and counts all elements that were observed triggering all of following events.
+- `time_frame`: One or more valid time frames. Use these to limit the data included in aggregated metric to events within a specific date-range. Valid time frames are:
+ - `7d`: Last seven days of data.
+ - `28d`: Last twenty eight days of data.
+ - `all`: All historical data, only available for `database` sourced aggregated metrics.
+- `source`: Data source used to collect all events data included in aggregated metric. Valid data sources are:
+ - [`database`](#database-sourced-aggregated-metrics)
+ - [`redis`](#redis-sourced-aggregated-metrics)
+- `events`: list of events names to aggregate into metric. All events in this list must
+ relay on the same data source. Additional data source requirements are described in the
+ [Database sourced aggregated metrics](#database-sourced-aggregated-metrics) and
+ [Redis sourced aggregated metrics](#redis-sourced-aggregated-metrics) sections.
+- `feature_flag`: Name of [development feature flag](../feature_flags/index.md#development-type)
+ that is checked before metrics aggregation is performed. Corresponding feature flag
+ should have `default_enabled` attribute set to `false`. The `feature_flag` attribute
+ is optional and can be omitted. When `feature_flag` is missing, no feature flag is checked.
+
+Example aggregated metric entries:
+
+```yaml
+- name: example_metrics_union
+ operator: OR
+ events: ['i_search_total', 'i_search_advanced', 'i_search_paid']
+ source: redis
+ time_frame:
+ - 7d
+ - 28d
+- name: example_metrics_intersection
+ operator: AND
+ source: database
+ time_frame:
+ - 28d
+ - all
+ events: ['dependency_scanning_pipeline_all_time', 'container_scanning_pipeline_all_time']
+ feature_flag: example_aggregated_metric
+```
+
+Aggregated metrics collected in `7d` and `28d` time frames are added into Usage Ping payload under the `aggregated_metrics` sub-key in the `counts_weekly` and `counts_monthly` top level keys.
+
+```ruby
+{
+ :counts_monthly => {
+ :deployments => 1003,
+ :successful_deployments => 78,
+ :failed_deployments => 275,
+ :packages => 155,
+ :personal_snippets => 2106,
+ :project_snippets => 407,
+ :promoted_issues => 719,
+ :aggregated_metrics => {
+ :example_metrics_union => 7,
+ :example_metrics_intersection => 2
+ },
+ :snippets => 2513
+ }
+}
+```
+
+Aggregated metrics for `all` time frame are present in the `count` top level key, with the `aggregate_` prefix added to their name.
+
+For example:
+
+`example_metrics_intersection`
+
+Becomes:
+
+`counts.aggregate_example_metrics_intersection`
+
+```ruby
+{
+ :counts => {
+ :deployments => 11003,
+ :successful_deployments => 178,
+ :failed_deployments => 1275,
+ :aggregate_example_metrics_intersection => 12
+ }
+}
+```
+
+### Redis sourced aggregated metrics
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/45979) in GitLab 13.6.
+
+To declare the aggregate of events collected with [Redis HLL Counters](#redis-hll-counters),
+you must fulfill the following requirements:
+
+1. All events listed at `events` attribute must come from
+ [`known_events/*.yml`](#known-events-are-added-automatically-in-usage-data-payload) files.
+1. All events listed at `events` attribute must have the same `redis_slot` attribute.
+1. All events listed at `events` attribute must have the same `aggregation` attribute.
+1. `time_frame` does not include `all` value, which is unavailable for Redis sourced aggregated metrics.
+
+### Database sourced aggregated metrics
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52784) in GitLab 13.9.
+> - It's [deployed behind a feature flag](../../user/feature_flags.md), disabled by default.
+> - It's enabled on GitLab.com.
+
+To declare an aggregate of metrics based on events collected from database, follow
+these steps:
+
+1. [Persist the metrics for aggregation](#persist-metrics-for-aggregation).
+1. [Add new aggregated metric definition](#add-new-aggregated-metric-definition).
+
+#### Persist metrics for aggregation
+
+Only metrics calculated with [Estimated Batch Counters](#estimated-batch-counters)
+can be persisted for database sourced aggregated metrics. To persist a metric,
+inject a Ruby block into the
+[estimate_batch_distinct_count](#estimate_batch_distinct_count-method) method.
+This block should invoke the
+`Gitlab::Usage::Metrics::Aggregates::Sources::PostgresHll.save_aggregated_metrics`
+[method](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage/metrics/aggregates/sources/postgres_hll.rb#L21),
+which stores `estimate_batch_distinct_count` results for future use in aggregated metrics.
+
+The `Gitlab::Usage::Metrics::Aggregates::Sources::PostgresHll.save_aggregated_metrics`
+method accepts the following arguments:
+
+- `metric_name`: The name of metric to use for aggregations. Should be the same
+ as the key under which the metric is added into Usage Ping.
+- `recorded_at_timestamp`: The timestamp representing the moment when a given
+ Usage Ping payload was collected. You should use the convenience method `recorded_at`
+ to fill `recorded_at_timestamp` argument, like this: `recorded_at_timestamp: recorded_at`
+- `time_period`: The time period used to build the `relation` argument passed into
+ `estimate_batch_distinct_count`. To collect the metric with all available historical
+ data, set a `nil` value as time period: `time_period: nil`.
+- `data`: HyperLogLog buckets structure representing unique entries in `relation`.
+ The `estimate_batch_distinct_count` method always passes the correct argument
+ into the block, so `data` argument must always have a value equal to block argument,
+ like this: `data: result`
+
+Example metrics persistence:
+
+```ruby
+class UsageData
+ def count_secure_pipelines(time_period)
+ ...
+ relation = ::Security::Scan.latest_successful_by_build.by_scan_types(scan_type).where(security_scans: time_period)
+
+ pipelines_with_secure_jobs['dependency_scanning_pipeline'] = estimate_batch_distinct_count(relation, :commit_id, batch_size: 1000, start: start_id, finish: finish_id) do |result|
+ ::Gitlab::Usage::Metrics::Aggregates::Sources::PostgresHll
+ .save_aggregated_metrics(metric_name: 'dependency_scanning_pipeline', recorded_at_timestamp: recorded_at, time_period: time_period, data: result)
+ end
+ end
+end
+```
+
+#### Add new aggregated metric definition
+
+After all metrics are persisted, you can add an aggregated metric definition at
+[`aggregated_metrics/`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/aggregated_metrics/).
+
+To declare the aggregate of metrics collected with [Estimated Batch Counters](#estimated-batch-counters),
+you must fulfill the following requirements:
+
+- Metrics names listed in the `events:` attribute, have to use the same names you passed in the `metric_name` argument while persisting metrics in previous step.
+- Every metric listed in the `events:` attribute, has to be persisted for **every** selected `time_frame:` value.
+
+Example definition:
+
+```yaml
+- name: example_metrics_intersection_database_sourced
+ operator: AND
+ source: database
+ events: ['dependency_scanning_pipeline', 'container_scanning_pipeline']
+ time_frame:
+ - 28d
+ - all
+```
+
+## Example Usage Ping payload
+
+The following is example content of the Usage Ping payload.
+
+```json
+{
+ "uuid": "0000000-0000-0000-0000-000000000000",
+ "hostname": "example.com",
+ "version": "12.10.0-pre",
+ "installation_type": "omnibus-gitlab",
+ "active_user_count": 999,
+ "recorded_at": "2020-04-17T07:43:54.162+00:00",
+ "edition": "EEU",
+ "license_md5": "00000000000000000000000000000000",
+ "license_id": null,
+ "historical_max_users": 999,
+ "licensee": {
+ "Name": "ABC, Inc.",
+ "Email": "email@example.com",
+ "Company": "ABC, Inc."
+ },
+ "license_user_count": 999,
+ "license_starts_at": "2020-01-01",
+ "license_expires_at": "2021-01-01",
+ "license_plan": "ultimate",
+ "license_add_ons": {
+ },
+ "license_trial": false,
+ "counts": {
+ "assignee_lists": 999,
+ "boards": 999,
+ "ci_builds": 999,
+ ...
+ },
+ "container_registry_enabled": true,
+ "dependency_proxy_enabled": false,
+ "gitlab_shared_runners_enabled": true,
+ "gravatar_enabled": true,
+ "influxdb_metrics_enabled": true,
+ "ldap_enabled": false,
+ "mattermost_enabled": false,
+ "omniauth_enabled": true,
+ "prometheus_enabled": false,
+ "prometheus_metrics_enabled": false,
+ "reply_by_email_enabled": "incoming+%{key}@incoming.gitlab.com",
+ "signup_enabled": true,
+ "web_ide_clientside_preview_enabled": true,
+ "ingress_modsecurity_enabled": true,
+ "projects_with_expiration_policy_disabled": 999,
+ "projects_with_expiration_policy_enabled": 999,
+ ...
+ "elasticsearch_enabled": true,
+ "license_trial_ends_on": null,
+ "geo_enabled": false,
+ "git": {
+ "version": {
+ "major": 2,
+ "minor": 26,
+ "patch": 1
+ }
+ },
+ "gitaly": {
+ "version": "12.10.0-rc1-93-g40980d40",
+ "servers": 56,
+ "clusters": 14,
+ "filesystems": [
+ "EXT_2_3_4"
+ ]
+ },
+ "gitlab_pages": {
+ "enabled": true,
+ "version": "1.17.0"
+ },
+ "container_registry_server": {
+ "vendor": "gitlab",
+ "version": "2.9.1-gitlab"
+ },
+ "database": {
+ "adapter": "postgresql",
+ "version": "9.6.15",
+ "pg_system_id": 6842684531675334351
+ },
+ "analytics_unique_visits": {
+ "g_analytics_contribution": 999,
+ ...
+ },
+ "usage_activity_by_stage": {
+ "configure": {
+ "project_clusters_enabled": 999,
+ ...
+ },
+ "create": {
+ "merge_requests": 999,
+ ...
+ },
+ "manage": {
+ "events": 999,
+ ...
+ },
+ "monitor": {
+ "clusters": 999,
+ ...
+ },
+ "package": {
+ "projects_with_packages": 999
+ },
+ "plan": {
+ "issues": 999,
+ ...
+ },
+ "release": {
+ "deployments": 999,
+ ...
+ },
+ "secure": {
+ "user_container_scanning_jobs": 999,
+ ...
+ },
+ "verify": {
+ "ci_builds": 999,
+ ...
+ }
+ },
+ "usage_activity_by_stage_monthly": {
+ "configure": {
+ "project_clusters_enabled": 999,
+ ...
+ },
+ "create": {
+ "merge_requests": 999,
+ ...
+ },
+ "manage": {
+ "events": 999,
+ ...
+ },
+ "monitor": {
+ "clusters": 999,
+ ...
+ },
+ "package": {
+ "projects_with_packages": 999
+ },
+ "plan": {
+ "issues": 999,
+ ...
+ },
+ "release": {
+ "deployments": 999,
+ ...
+ },
+ "secure": {
+ "user_container_scanning_jobs": 999,
+ ...
+ },
+ "verify": {
+ "ci_builds": 999,
+ ...
+ }
+ },
+ "topology": {
+ "duration_s": 0.013836685999194742,
+ "application_requests_per_hour": 4224,
+ "query_apdex_weekly_average": 0.996,
+ "failures": [],
+ "nodes": [
+ {
+ "node_memory_total_bytes": 33269903360,
+ "node_memory_utilization": 0.35,
+ "node_cpus": 16,
+ "node_cpu_utilization": 0.2,
+ "node_uname_info": {
+ "machine": "x86_64",
+ "sysname": "Linux",
+ "release": "4.19.76-linuxkit"
+ },
+ "node_services": [
+ {
+ "name": "web",
+ "process_count": 16,
+ "process_memory_pss": 233349888,
+ "process_memory_rss": 788220927,
+ "process_memory_uss": 195295487,
+ "server": "puma"
+ },
+ {
+ "name": "sidekiq",
+ "process_count": 1,
+ "process_memory_pss": 734080000,
+ "process_memory_rss": 750051328,
+ "process_memory_uss": 731533312
+ },
+ ...
+ ],
+ ...
+ },
+ ...
+ ]
+ }
+}
+```
+
+## Notable changes
+
+In GitLab 13.5, `pg_system_id` was added to send the [PostgreSQL system identifier](https://www.2ndquadrant.com/en/blog/support-for-postgresqls-system-identifier-in-barman/).
+
+## Exporting Usage Ping SQL queries and definitions
+
+Two Rake tasks exist to export Usage Ping definitions.
+
+- The Rake tasks export the raw SQL queries for `count`, `distinct_count`, `sum`.
+- The Rake tasks export the Redis counter class or the line of the Redis block for `redis_usage_data`.
+- The Rake tasks calculate the `alt_usage_data` metrics.
+
+In the home directory of your local GitLab installation run the following Rake tasks for the YAML and JSON versions respectively:
+
+```shell
+# for YAML export
+bin/rake gitlab:usage_data:dump_sql_in_yaml
+
+# for JSON export
+bin/rake gitlab:usage_data:dump_sql_in_json
+
+# You may pipe the output into a file
+bin/rake gitlab:usage_data:dump_sql_in_yaml > ~/Desktop/usage-metrics-2020-09-02.yaml
+```
+
+## Generating and troubleshooting usage ping
+
+To get a usage ping, or to troubleshoot caching issues on your GitLab instance, please follow [instructions to generate usage ping](../../administration/troubleshooting/gitlab_rails_cheat_sheet.md#generate-usage-ping).
diff --git a/doc/development/usage_ping/metrics_dictionary.md b/doc/development/usage_ping/metrics_dictionary.md
index 406a223b204..3f43aaa916f 100644
--- a/doc/development/usage_ping/metrics_dictionary.md
+++ b/doc/development/usage_ping/metrics_dictionary.md
@@ -28,20 +28,22 @@ Each metric is defined in a separate YAML file consisting of a number of fields:
|---------------------|----------|----------------------------------------------------------------|
| `key_path` | yes | JSON key path for the metric, location in Usage Ping payload. |
| `description` | yes | |
-| `value_type` | yes | |
-| `status` | yes | |
-| `product_group` | yes | The [group](https://about.gitlab.com/handbook/product/categories/#devops-stages) that owns the metric. |
-| `time_frame` | yes | `string`; may be set to a value like "7d" |
-| `data_source` | yes | `string`: may be set to a value like `database` or `redis_hll`. |
-| `distribution` | yes | The [distribution](https://about.gitlab.com/handbook/marketing/strategic-marketing/tiers/#definitions) where the metric applies. |
-| `tier` | yes | The [tier]( https://about.gitlab.com/handbook/marketing/strategic-marketing/tiers/) where the metric applies. |
-| `product_category` | no | The [product category](https://gitlab.com/gitlab-com/www-gitlab-com/blob/master/data/categories.yml) for the metric. |
+| `product_section` | yes | The [section](https://gitlab.com/gitlab-com/www-gitlab-com/-/blob/master/data/sections.yml). |
| `product_stage` | no | The [stage](https://gitlab.com/gitlab-com/www-gitlab-com/blob/master/data/stages.yml) for the metric. |
+| `product_group` | yes | The [group](https://gitlab.com/gitlab-com/www-gitlab-com/blob/master/data/stages.yml) that owns the metric. |
+| `product_category` | no | The [product category](https://gitlab.com/gitlab-com/www-gitlab-com/blob/master/data/categories.yml) for the metric. |
+| `value_type` | yes | `string`; one of `string`, `number`, `boolean`. |
+| `status` | yes | `string`; status of the metric, may be set to `data_available`, `planned`, `in_progress`, `implemented`, `not_used`, `deprecated` |
+| `time_frame` | yes | `string`; may be set to a value like `7d`, `28d`, `all`, `none`. |
+| `data_source` | yes | `string`; may be set to a value like `database`, `redis`, `redis_hll`, `prometheus`, `ruby`. |
+| `distribution` | yes | `array`; may be set to one of `ce, ee` or `ee`. The [distribution](https://about.gitlab.com/handbook/marketing/strategic-marketing/tiers/#definitions) where the tracked feature is available. |
+| `tier` | yes | `array`; may be set to one of `free, premium, ultimate`, `premium, ultimate` or `ultimate`. The [tier]( https://about.gitlab.com/handbook/marketing/strategic-marketing/tiers/) where the tracked feature is available. |
| `milestone` | no | The milestone when the metric is introduced. |
| `milestone_removed` | no | The milestone when the metric is removed. |
| `introduced_by_url` | no | The URL to the Merge Request that introduced the metric. |
+| `skip_validation` | no | This should **not** be set. [Used for imported metrics until we review, update and make them valid](https://gitlab.com/groups/gitlab-org/-/epics/5425). |
-### Example metric definition
+### Example YAML metric definition
The linked [`uuid`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/uuid.yml)
YAML file includes an example metric definition, where the `uuid` metric is the GitLab
@@ -50,18 +52,19 @@ instance unique identifier.
```yaml
key_path: uuid
description: GitLab instance unique identifier
-value_type: string
product_category: collection
+product_section: growth
product_stage: growth
+product_group: group::product intelligence
+value_type: string
status: data_available
milestone: 9.1
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/1521
-product_group: group::product intelligence
time_frame: none
data_source: database
distribution:
-- ee
- ce
+- ee
tier:
- free
- premium
@@ -91,3 +94,9 @@ To create a metric definition used in EE, add the `--ee` flag.
bundle exec rails generate gitlab:usage_metric_definition counts.issues --ee --dir=7d
create ee/config/metrics/counts_7d/issues.yml
```
+
+## Metrics added dynamic to Usage Ping payload
+
+The [Redis HLL metrics](index.md#known-events-are-added-automatically-in-usage-data-payload) are added automatically to Usage Ping payload.
+
+A YAML metric definition is required for each metric.
diff --git a/doc/development/usage_ping/product_intelligence_review.md b/doc/development/usage_ping/product_intelligence_review.md
new file mode 100644
index 00000000000..c667bc8354c
--- /dev/null
+++ b/doc/development/usage_ping/product_intelligence_review.md
@@ -0,0 +1,80 @@
+---
+stage: Growth
+group: Product Intelligence
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Product Intelligence review guidelines
+
+This page includes introductory material for a
+[Product Intelligence](https://about.gitlab.com/handbook/engineering/development/growth/product-intelligence/)
+review, and is specific to Product Intelligence reviews. For broader advice and
+general best practices for code reviews, refer to our [code review guide](../code_review.md).
+
+## Resources for Product Intelligence reviewers
+
+- [Usage Ping Guide](index.md)
+- [Snowplow Guide](../snowplow.md)
+- [Metrics Dictionary](metrics_dictionary.md)
+
+## Review process
+
+We recommend a Product Intelligence review when an application update touches
+Product Intelligence files.
+
+- Changes that touch `usage_data*` files.
+- Changes to the Metrics Dictionary including files in:
+ - [`config/metrics`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/config/metrics).
+ - [`ee/config/metrics`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/ee/config/metrics).
+ - [`dictionary.md`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/development/usage_ping/dictionary.md).
+ - [`schema.json`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/schema.json).
+- Changes to `tracking` files.
+- Changes to Product Intelligence tooling. For example,
+ [`Gitlab::UsageMetricDefinitionGenerator`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/generators/gitlab/usage_metric_definition_generator.rb)
+
+### Roles and process
+
+The merge request **author** should:
+
+- Decide whether a Product Intelligence review is needed.
+- If a Product Intelligence review is needed, add the labels
+ `~product intelligence` and `~product intelligence::review pending`.
+- Assign an
+ [engineer](https://gitlab.com/groups/gitlab-org/growth/product-intelligence/engineers/-/group_members?with_inherited_permissions=exclude) from the Product Intelligence team for a review.
+- Set the correct attributes in YAML metrics:
+ - `product_section`, `product_stage`, `product_group`, `product_category`
+ - Provide a clear description of the metric.
+- Update the
+ [Metrics Dictionary](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/development/usage_ping/dictionary.md) if it is needed.
+- Add a changelog [according to guidelines](../changelog.md).
+
+The Product Intelligence **reviewer** should:
+
+- Perform a first-pass review on the merge request and suggest improvements to the author.
+- Approve the MR, and relabel the MR with `~"product intelligence::approved"`.
+
+## Review workload distribution
+
+[Danger bot](../dangerbot.md) adds the list of Product Intelligence changed files
+and pings the
+[`@gitlab-org/growth/product-intelligence/engineers`](https://gitlab.com/groups/gitlab-org/growth/product-intelligence/engineers/-/group_members?with_inherited_permissions=exclude) group for merge requests
+that are not drafts.
+
+Any of the Product Intelligence engineers can be assigned for the Product Intelligence review.
+
+### How to review for Product Intelligence
+
+- Check the [metrics location](index.md#1-naming-and-placing-the-metrics) in
+ the Usage Ping JSON payload.
+- Add `~database` label and ask for [database review](../database_review.md) for
+ metrics that are based on Database.
+- For tracking using Redis HLL (HyperLogLog):
+ - Check the Redis slot.
+ - Check if a [feature flag is needed](index.md#recommendations).
+- Metrics YAML definitions:
+ - Check the metric `description`.
+ - Check the metrics `key_path`.
+ - Check the `product_section`, `product_stage`, `product_group`, `product_category`.
+ Read the [stages file](https://gitlab.com/gitlab-com/www-gitlab-com/blob/master/data/stages.yml).
+ - Check the file location. Consider the time frame, and if the file should be under `ee`.
+ - Check the tiers.
diff --git a/doc/development/wikis.md b/doc/development/wikis.md
index 7995afb1e17..f47c87137ae 100644
--- a/doc/development/wikis.md
+++ b/doc/development/wikis.md
@@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
description: "GitLab's development guidelines for Wikis"
---
-# Wikis development guide
+# Wikis development guide **(FREE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/227027) in GitLab 13.5.
diff --git a/doc/gitlab-basics/create-branch.md b/doc/gitlab-basics/create-branch.md
index 9f4f46e5bd3..8135c16bc1e 100644
--- a/doc/gitlab-basics/create-branch.md
+++ b/doc/gitlab-basics/create-branch.md
@@ -13,7 +13,7 @@ When you create a new branch (in your [terminal](start-using-git.md#create-a-bra
[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 `master` 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 will be tracked in your branch.
+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).
diff --git a/doc/gitlab-basics/feature_branch_workflow.md b/doc/gitlab-basics/feature_branch_workflow.md
index 682bc1aec0b..99d346f2b01 100644
--- a/doc/gitlab-basics/feature_branch_workflow.md
+++ b/doc/gitlab-basics/feature_branch_workflow.md
@@ -35,4 +35,4 @@ disqus_identifier: 'https://docs.gitlab.com/ee/workflow/workflow.html'
1. Create a merge request.
-1. Your team lead will review the code &amp; merge it to the main branch.
+1. Your team lead reviews the code and merges it to the main branch.
diff --git a/doc/gitlab-basics/index.md b/doc/gitlab-basics/index.md
index 8052fd27bb3..774931aad72 100644
--- a/doc/gitlab-basics/index.md
+++ b/doc/gitlab-basics/index.md
@@ -9,7 +9,7 @@ type: index
# GitLab basics guides **(FREE)**
This section provides resources to help you start working with GitLab and Git by focusing
-on the basic features that you will need to use.
+on the basic features that you must use.
This documentation is split into the following groups:
@@ -23,7 +23,7 @@ The following are guides to basic GitLab functionality:
- [Create and add your SSH public key](../ssh/README.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-new-group), to combine and administer
+- [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).
@@ -41,7 +41,7 @@ The following are guides to basic GitLab functionality:
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 will help you get further acclimated to working on the command line.
+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.
diff --git a/doc/gitlab-basics/start-using-git.md b/doc/gitlab-basics/start-using-git.md
index a2d286379d2..3c824cb5286 100644
--- a/doc/gitlab-basics/start-using-git.md
+++ b/doc/gitlab-basics/start-using-git.md
@@ -17,10 +17,10 @@ directly in the browser, you’ll eventually need to use Git through the command
tasks.
For example, if you need to fix complex merge conflicts, rebase branches,
-merge manually, or undo and roll back commits, you'll need to use Git from
+merge manually, or undo and roll back commits, you musto use Git from
the command line and then push your changes to the remote server.
-This guide will help you get started with Git through the command line and can be your reference
+This guide helps you get started with Git through the command line and can be your reference
for Git commands in the future. If you're only looking for a quick reference of Git commands, you
can download the GitLab [Git Cheat Sheet](https://about.gitlab.com/images/press/git-cheat-sheet.pdf).
@@ -39,12 +39,12 @@ You don't need a GitLab account to use Git locally, but for the purpose of this
recommend registering and signing into your account before starting. Some commands need a
connection between the files in your computer and their version on a remote server.
-You'll also need to open a [command shell](#command-shell) and have
+You must also open a [command shell](#command-shell) and have
[Git installed](#install-git) in your computer.
### Command shell
-To execute Git commands in your computer, you'll need to open a command shell (also known as command
+To execute Git commands in your computer, you must open a command shell (also known as command
prompt, terminal, and command line) of your preference. Here are some suggestions:
- For macOS users:
@@ -66,18 +66,18 @@ computer:
git --version
```
-If you have Git installed, the output will be:
+If you have Git installed, the output is:
```shell
git version X.Y.Z
```
-If your computer doesn't recognize `git` as a command, you'll need to [install Git](../topics/git/how_to_install_git/index.md).
+If your computer doesn't recognize `git` as a command, you must [install Git](../topics/git/how_to_install_git/index.md).
After that, run `git --version` again to verify whether it was correctly installed.
## Configure Git
-To start using Git from your computer, you'll need to enter your credentials (user name and email)
+To start using Git from your computer, you must enter your credentials (user name and email)
to identify you as the author of your work. The user name and email should match the ones you're
using on GitLab.
@@ -100,7 +100,7 @@ git config --global --list
```
The `--global` option tells Git to always use this information for anything you do on your system.
-If you omit `--global` or use `--local`, the configuration will be applied only to the current
+If you omit `--global` or use `--local`, the configuration is applied only to the current
repository.
You can read more on how Git manages configurations in the
@@ -113,7 +113,7 @@ You have two options:
- Authenticate on a project-by-project basis through HTTPS, and enter your credentials every time
you perform an operation between your computer and GitLab.
-- Authenticate through SSH once and GitLab won't ask your credentials every time you pull, push,
+- Authenticate through SSH once and GitLab no longer requests your credentials every time you pull, push,
and clone.
To start the authentication process, we'll [clone](#clone-a-repository) an existing repository
@@ -121,8 +121,8 @@ to our computer:
- If you want to use **SSH** to authenticate, follow the instructions on the [SSH documentation](../ssh/README.md)
to set it up before cloning.
-- If you want to use **HTTPS**, GitLab will request your user name and password:
- - If you have 2FA enabled for your account, you'll have to use a [Personal Access Token](../user/profile/personal_access_tokens.md)
+- If you want to use **HTTPS**, GitLab requests your user name and password:
+ - If you have 2FA enabled for your account, you must use a [Personal Access Token](../user/profile/personal_access_tokens.md)
with **read_repository** or **write_repository** permissions instead of your account's password.
Create one before cloning.
- If you don't have 2FA enabled, use your account's password.
@@ -158,14 +158,15 @@ A **project** in GitLab is what holds a repository, which holds your files.
Often, the word "repository" is shortened to "repo".
<!-- vale gitlab.Spelling = YES -->
<!-- vale gitlab.SubstitutionWarning = YES -->
+
### Fork
When you want to copy someone else's repository, you [**fork**](../user/project/repository/forking_workflow.md#creating-a-fork)
-the project. By forking it, you'll create a copy of the project into your own
+the project. By forking it, you create a copy of the project into your own
namespace to have read and write permissions to modify the project files
and settings.
-For example, if you fork this project, <https://gitlab.com/gitlab-tests/sample-project/> into your namespace, you'll create your own copy of the repository in your namespace (`https://gitlab.com/your-namespace/sample-project/`). From there, you can clone it into your computer,
+For example, if you fork this project, <https://gitlab.com/gitlab-tests/sample-project/> into your namespace, you create your own copy of the repository in your namespace (`https://gitlab.com/your-namespace/sample-project/`). From there, you can clone it into your computer,
work on its files, and (optionally) submit proposed changes back to the
original repository if you'd like.
@@ -175,7 +176,7 @@ To create a copy of a remote repository's files on your computer, you can either
**download** or **clone**. If you download, you cannot sync it with the
remote repository on GitLab.
-Cloning a repository is the same as downloading, except it preserves the Git connection
+[Cloning](#clone-a-repository) a repository is the same as downloading, except it preserves the Git connection
with the remote repository. This allows you to modify the files locally and
upload the changes to the remote repository on GitLab.
@@ -185,19 +186,19 @@ After you saved a local copy of a repository and modified its files on your comp
changes to GitLab. This is referred to as **pushing** to GitLab, as this is achieved by the command
[`git push`](#send-changes-to-gitlabcom).
-When the remote repository changes, your local copy will be behind it. You can update it with the new
+When the remote repository changes, your local copy is behind it. You can update it with the new
changes in the remote repository.
This is referred to as **pulling** from GitLab, as this is achieved by the command
[`git pull`](#download-the-latest-changes-in-the-project).
## Basic Git commands
-For the purposes of this guide, we will use this example project on GitLab.com:
+For the purposes of this guide, we use this example project on GitLab.com:
[https://gitlab.com/gitlab-tests/sample-project/](https://gitlab.com/gitlab-tests/sample-project/).
To use it, log into GitLab.com and fork the example project into your
namespace to have your own copy to playing with. Your sample
-project will be available under `https://gitlab.com/<your-namespace>/sample-project/`.
+project is available under `https://gitlab.com/<your-namespace>/sample-project/`.
You can also choose any other project to follow this guide. Then, replace the
example URLs with your own project's.
@@ -210,11 +211,13 @@ to GitLab, see how to [convert a local folder into a Git repository](#convert-a-
### Clone a repository
To start working locally on an existing remote repository, clone it with the
-command `git clone <repository path>`. You can either clone it via [HTTPS](#clone-via-https) or [SSH](#clone-via-ssh), according to your preferred [authentication method](#git-authentication-methods).
+command `git clone <repository path>`. You can either clone it via [HTTPS](#clone-via-https)
+or [SSH](#clone-via-ssh), according to your preferred [authentication method](#git-authentication-methods).
You can find both paths (HTTPS and SSH) by navigating to your project's landing page
-and clicking **Clone**. GitLab will prompt you with both paths, from which you can copy
-and paste in your command line.
+and clicking **Clone**. GitLab prompts you with both paths, from which you can copy
+and paste in your command line. You can also
+[clone and open directly in Visual Studio Code](../user/project/repository/index.md#clone-and-open-in-apple-xcode).
For example, considering our [sample project](https://gitlab.com/gitlab-tests/sample-project/):
@@ -224,7 +227,7 @@ For example, considering our [sample project](https://gitlab.com/gitlab-tests/sa
To get started, open a terminal window in the directory you wish to add the
repository files into, and run one of the `git clone` commands as described below.
-Both commands will download a copy of the files in a folder named after the project's
+Both commands download a copy of the files in a folder named after the project's
name and preserve the connection with the remote repository.
You can then navigate to the new directory with `cd sample-project` and start working on it
locally.
@@ -253,8 +256,8 @@ git clone git@gitlab.com:gitlab-org/gitlab.git
### Convert a local directory into a repository
When you have your files in a local folder and want to convert it into
-a repository, you'll need to _initialize_ the folder through the `git init`
-command. This will instruct Git to begin to track that directory as a
+a repository, you must _initialize_ the folder through the `git init`
+command. This instructs Git to begin to track that directory as a
repository. To do so, open the terminal on the directory you'd like to convert
and run:
@@ -271,9 +274,9 @@ so that Git can upload your files into the correct project.
#### Add a remote repository
-By "adding a remote repository" to your local directory you'll tell Git that
+By "adding a remote repository" to your local directory you tell Git that
the path to that specific project in GitLab corresponds to that specific
-folder you have in your computer. This way, your local folder will be
+folder you have in your computer. This way, your local folder is
identified by Git as the local content for that specific remote project.
To add a remote repository to your local copy:
@@ -320,7 +323,7 @@ The `-v` flag stands for verbose.
## Branching
-If you want to add code to a project but you're not sure if it will work properly, or you're
+If you want to add code to a project but you're not sure if it works properly, or you're
collaborating on the project with others, and don't want your work to get mixed up, it's a good idea
to work on a different **branch**.
@@ -384,7 +387,7 @@ git diff
### Add and commit local changes
-You'll see any local changes in red when you type `git status`. These changes may
+Local changes are shown in red when you type `git status`. These changes may
be new, modified, or deleted files/folders. Use `git add` to first stage (prepare)
a local file/folder for committing. Then use `git commit` to commit (save) the staged
files:
@@ -420,8 +423,8 @@ For example, to push your local commits to the _`master`_ branch of the _`origin
git push origin master
```
-On certain occasions, Git won't allow you to push to your repository, and then
-you'll need to [force an update](../topics/git/git_rebase.md#force-push).
+On certain occasions, Git disallows pushes to your repository, and then
+you must [force an update](../topics/git/git_rebase.md#force-push).
NOTE:
To create a merge request from a fork to an upstream repository, see the
diff --git a/doc/install/aws/index.md b/doc/install/aws/index.md
index 8fa1883da59..b18a537bf8b 100644
--- a/doc/install/aws/index.md
+++ b/doc/install/aws/index.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: howto
---
-# Installing GitLab on Amazon Web Services (AWS)
+# Installing GitLab on Amazon Web Services (AWS) **(FREE SELF)**
This page offers a walkthrough of a common configuration
for GitLab on AWS using the official GitLab Linux package. You should customize it to accommodate your needs.
@@ -449,9 +449,8 @@ We will need a preconfigured, custom GitLab AMI to use in our launch configurati
From the EC2 dashboard:
-1. Click **Launch Instance** and select **Community AMIs** from the left menu.
-1. In the search bar, search for `GitLab EE <version>` where `<version>` is the latest version as seen on the [releases page](https://about.gitlab.com/releases/). Select the latest patch release, for example `GitLab EE 12.9.2`.
-1. Select an instance type based on your workload. Consult the [hardware requirements](../../install/requirements.md#hardware-requirements) to choose one that fits your needs (at least `c5.xlarge`, which is sufficient to accommodate 100 users).
+1. Use the section below titled "[Find official GitLab-created AMI IDs on AWS](#find-official-gitlab-created-ami-ids-on-aws)" to find the correct AMI to launch.
+1. After clicking **Launch** on the desired AMI, select an instance type based on your workload. Consult the [hardware requirements](../../install/requirements.md#hardware-requirements) to choose one that fits your needs (at least `c5.xlarge`, which is sufficient to accommodate 100 users).
1. Click **Configure Instance Details**:
1. In the **Network** dropdown, select `gitlab-vpc`, the VPC we created earlier.
1. In the **Subnet** dropdown, select `gitlab-private-10.0.1.0` from the list of subnets we created earlier.
@@ -585,9 +584,9 @@ Let's create an EC2 instance where we'll install Gitaly:
1. Finally, acknowledge that you have access to the selected private key file or create a new one. Click **Launch Instances**.
NOTE:
-Instead of storing configuration _and_ repository data on the root volume, you can also choose to add an additional EBS volume for repository storage. Follow the same guidance as above. See the [Amazon EBS pricing](https://aws.amazon.com/ebs/pricing/). We do not recommend using EFS as it may negatively impact the performance of GitLab. You can review the [relevant documentation](../../administration/nfs.md#avoid-using-awss-elastic-file-system-efs) for more details.
+Instead of storing configuration _and_ repository data on the root volume, you can also choose to add an additional EBS volume for repository storage. Follow the same guidance as above. See the [Amazon EBS pricing](https://aws.amazon.com/ebs/pricing/). We do not recommend using EFS as it may negatively impact the performance of GitLab. You can review the [relevant documentation](../../administration/nfs.md#avoid-using-cloud-based-file-systems) for more details.
-Now that we have our EC2 instance ready, follow the [documentation to install GitLab and set up Gitaly on its own server](../../administration/gitaly/index.md#run-gitaly-on-its-own-server). Perform the client setup steps from that document on the [GitLab instance we created](#install-gitlab) above.
+Now that we have our EC2 instance ready, follow the [documentation to install GitLab and set up Gitaly on its own server](../../administration/gitaly/configure_gitaly.md#run-gitaly-on-its-own-server). Perform the client setup steps from that document on the [GitLab instance we created](#install-gitlab) above.
#### Add Support for Proxied SSL
@@ -789,6 +788,24 @@ For GitLab 12.1 and earlier, use `gitlab-rake gitlab:backup:create`.
After a few minutes, the new version should be up and running.
+## Find official GitLab-created AMI IDs on AWS
+
+To find the AMIs generated by GitLab:
+
+1. Login to AWS Web Console, so that clicking the links below will take you directly to the AMI list.
+1. Pick the edition you want:
+
+ - [GitLab Enterprise Edition](https://console.aws.amazon.com/ec2/v2/home?region=us-east-1#Images:visibility=public-images;ownerAlias=782774275127;search=GitLab%20EE;sort=desc:name): If you want to unlock the enterprise features, a license is needed. Recommended for this guide.
+ - [GitLab Community Edition](https://console.aws.amazon.com/ec2/v2/home?region=us-east-1#Images:visibility=public-images;ownerAlias=782774275127;search=GitLab%20CE;sort=desc:name): The open source version of GitLab.
+ - [GitLab Premium or Ultimate Marketplace (Prelicensed)](https://console.aws.amazon.com/ec2/v2/home?region=us-east-1#Images:visibility=public-images;source=Marketplace;search=GitLab%20EE;sort=desc:name): 5 user license built into per-minute billing.
+1. AMI IDs are unique per region, so once you've loaded one of the above, select the desired target region in the upper right of the console to see the appropriate AMIs.
+1. Once the console is loaded, you can add additional search criteria to narrow further. For instance, `13.` to find only 13.x versions.
+1. To launch an EC2 Machine with one of the listed AMIs, check the box at the start of the relevant row, and select the "Launch" button near the top of left of the page.
+
+NOTE:
+If you are trying to restore from an older version of GitLab while moving to AWS, find the
+[Enterprise and Community Editions Before 11.10.3](https://console.aws.amazon.com/ec2/v2/home?region=us-east-1#Images:visibility=public-images;ownerAlias=855262394183;sort=desc:name).
+
## Conclusion
In this guide, we went mostly through scaling and some redundancy options,
diff --git a/doc/install/azure/index.md b/doc/install/azure/index.md
index 15906bc056f..0c0a4457413 100644
--- a/doc/install/azure/index.md
+++ b/doc/install/azure/index.md
@@ -6,7 +6,7 @@ description: 'Learn how to spin up a pre-configured GitLab VM on Microsoft Azure
type: howto
---
-# Install GitLab on Microsoft Azure
+# Install GitLab on Microsoft Azure **(FREE SELF)**
WARNING:
This guide is deprecated and pending an update. For the time being, use the GitLab
@@ -351,7 +351,7 @@ Remember to sign in with the username and password you specified when you
[created your Azure VM](#basics).
If you need to reset your VM password, read
-[how to reset SSH credentials for a user on an Azure VM](https://docs.microsoft.com/en-us/azure/virtual-machines/troubleshooting/troubleshoot-ssh-connection).
+[how to reset SSH credentials for a user on an Azure VM](https://docs.microsoft.com/en-us/troubleshoot/azure/virtual-machines/troubleshoot-ssh-connection).
#### SSH from the command-line
@@ -433,7 +433,7 @@ Check out our other [Technical Articles](../../topics/index.md) or browse the [G
- [Azure - Marketplace](https://azuremarketplace.microsoft.com/en-us/marketplace/)
- [Azure Portal](https://portal.azure.com)
- [Azure - Pricing Calculator](https://azure.microsoft.com/en-us/pricing/calculator/)
- - [Azure - Troubleshoot SSH Connections to an Azure Linux VM](https://docs.microsoft.com/en-us/azure/virtual-machines/troubleshooting/troubleshoot-ssh-connection)
+ - [Azure - Troubleshoot SSH Connections to an Azure Linux VM](https://docs.microsoft.com/en-us/troubleshoot/azure/virtual-machines/troubleshoot-ssh-connection)
- [Azure - Properly Shutdown an Azure VM](https://build5nines.com/properly-shutdown-azure-vm-to-save-money/)
- [SSH](https://en.wikipedia.org/wiki/Secure_Shell), [PuTTY](https://www.putty.org) and [Using SSH in PuTTY](https://mediatemple.net/community/products/dv/204404604/using-ssh-in-putty-)
diff --git a/doc/install/digitaloceandocker.md b/doc/install/digitaloceandocker.md
index edd081c66c1..845fc3f04e8 100644
--- a/doc/install/digitaloceandocker.md
+++ b/doc/install/digitaloceandocker.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: howto
---
-# Digital Ocean and Docker Machine test environment
+# Digital Ocean and Docker Machine test environment **(FREE SELF)**
This guide is for quickly testing different versions of GitLab and not
recommended for ease of future upgrades or keeping the data you create.
diff --git a/doc/install/docker.md b/doc/install/docker.md
index 0cc73c2d64e..064c93776a8 100644
--- a/doc/install/docker.md
+++ b/doc/install/docker.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: index
---
-# Install GitLab with Docker
+# Install GitLab with Docker **(FREE SELF)**
[Docker](https://www.docker.com) and container technology have been revolutionizing the software world for the past few years. They combine the performance and efficiency of native execution with the abstraction, security, and immutability of virtualization.
diff --git a/doc/install/google_cloud_platform/index.md b/doc/install/google_cloud_platform/index.md
index 7f38970a2b1..766788da061 100644
--- a/doc/install/google_cloud_platform/index.md
+++ b/doc/install/google_cloud_platform/index.md
@@ -6,7 +6,7 @@ description: 'Learn how to install a GitLab instance on Google Cloud Platform.'
type: howto
---
-# Installing GitLab on Google Cloud Platform
+# Installing GitLab on Google Cloud Platform **(FREE SELF)**
This guide will help you install GitLab on a [Google Cloud Platform (GCP)](https://cloud.google.com/) using the official GitLab Linux package. You should customize it to accommodate your needs.
diff --git a/doc/install/index.md b/doc/install/index.md
index 948365ce548..1e6f0bb95c2 100644
--- a/doc/install/index.md
+++ b/doc/install/index.md
@@ -9,110 +9,49 @@ type: index
# Installation **(FREE SELF)**
-GitLab can be installed in most GNU/Linux distributions and with several
+GitLab can be installed in most GNU/Linux distributions, and with several
cloud providers. To get the best experience from GitLab, you must balance
performance, reliability, ease of administration (backups, upgrades, and
troubleshooting), and the cost of hosting.
-Depending on your platform, select from the following available methods to
-install GitLab:
-
-- [_Omnibus GitLab_](#installing-gitlab-on-linux-using-the-omnibus-gitlab-package-recommended):
- The official deb/rpm packages that contain a bundle of GitLab and the
- components it depends on, including PostgreSQL, Redis, and Sidekiq.
-- [_GitLab Helm chart_](#installing-gitlab-on-kubernetes-via-the-gitlab-helm-charts):
- The cloud native Helm chart for installing GitLab and all of its components
- on Kubernetes.
-- [_Docker_](#installing-gitlab-with-docker): The Omnibus GitLab packages,
- Dockerized.
-- [_Source_](#installing-gitlab-from-source): Install GitLab and all of its
- components from scratch.
-- [_Cloud provider_](#installing-gitlab-on-cloud-providers): Install directly
- from platforms like AWS, Azure, and GCP.
-
-If you're not sure which installation method to use, we recommend you use
-Omnibus GitLab. The Omnibus GitLab packages are mature,
-[scalable](../administration/reference_architectures/index.md), and are used
-today on GitLab.com. The Helm charts are recommended for those who are familiar
-with Kubernetes.
-
## Requirements
Before you install GitLab, be sure to review the [system requirements](requirements.md).
The system requirements include details about the minimum hardware, software,
database, and additional requirements to support GitLab.
-## Installing GitLab on Linux using the Omnibus GitLab package (recommended)
-
-The Omnibus GitLab package uses our official deb/rpm repositories, and is
-recommended for most users.
-
-If you need additional scale or resilience, we recommend deploying
-GitLab as described in our [reference architecture documentation](../administration/reference_architectures/index.md).
-
-[**> Install GitLab using the Omnibus GitLab package.**](https://about.gitlab.com/install/)
-
-### GitLab Environment Toolkit (alpha)
-
-The [GitLab Environment Toolkit](https://gitlab.com/gitlab-org/quality/gitlab-environment-toolkit) provides a set of automation tools to easily deploy a [reference architecture](../administration/reference_architectures/index.md) on most major cloud providers.
-
-It is currently in alpha, and is not recommended for production use.
-
-[**> Install a GitLab reference architecture using the GitLab Environment Toolkit.**](https://gitlab.com/gitlab-org/quality/gitlab-environment-toolkit#documentation)
+## Choose the installation method
-## Installing GitLab on Kubernetes via the GitLab Helm charts
-
-When installing GitLab on Kubernetes, there are some trade-offs that you
-need to be aware of:
-
-- Administration and troubleshooting requires Kubernetes knowledge.
-- It can be more expensive for smaller installations. The default installation
- requires more resources than a single node Omnibus deployment, as most services
- are deployed in a redundant fashion.
-- There are some feature [limitations to be aware of](https://docs.gitlab.com/charts/#limitations).
-
-Due to these trade-offs, having Kubernetes experience is a requirement for
-using this method. We recommend being familiar with Kubernetes before using it
-to deploy GitLab in production. The methods for management, observability, and
-some concepts are different than traditional deployments.
-
-[**> Install GitLab on Kubernetes using the GitLab Helm charts.**](https://docs.gitlab.com/charts/)
-
-## Installing GitLab with Docker
-
-GitLab maintains a set of official Docker images based on the Omnibus GitLab
-package.
-
-[**> Install GitLab using the official GitLab Docker images.**](docker.md)
-
-## Installing GitLab from source
-
-If the Omnibus GitLab package isn't available for your distribution, you can
-install GitLab from source. This can be useful with unsupported systems, like
-\*BSD. For an overview of the directory structure, see the
-[structure documentation](installation.md#gitlab-directory-structure).
+Depending on your platform, select from the following available methods to
+install GitLab:
-[**> Install GitLab from source.**](installation.md)
+| Installation method | Description | When to choose |
+|----------------------------------------------------------------|-------------|----------------|
+| [Linux package](https://docs.gitlab.com/omnibus/installation/) | The official deb/rpm packages (also known as Omnibus GitLab) that contains a bundle of GitLab and the components it depends on, including PostgreSQL, Redis, and Sidekiq. | This is the recommended method 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/>- There are some feature [limitations to be aware of](https://docs.gitlab.com/charts/#limitations).<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. |
+| [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/quality/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. | Since GET is in beta and not yet recommended for production use, use this method if you want to test deploying GitLab in scalable environment. |
-## Installing GitLab on cloud providers
+## Install GitLab on cloud providers
-GitLab can be installed on a variety of cloud providers by using any of
-the above methods, provided the cloud provider supports it.
+Regardless of the installation method, you can install GitLab on several cloud
+providers, assuming the cloud provider supports it. Here are several possible installation
+methods, the majority which use the Linux packages:
-- [Install on AWS](aws/index.md): Install Omnibus GitLab on AWS using the community AMIs that GitLab provides.
-- [Install GitLab on Google Cloud Platform](google_cloud_platform/index.md): Install Omnibus GitLab on a VM in GCP.
-- [Install GitLab on Azure](azure/index.md): Install Omnibus GitLab from Azure Marketplace.
-- [Install GitLab on OpenShift](https://docs.gitlab.com/charts/installation/cloud/openshift.html): Install GitLab on OpenShift by using the GitLab Helm charts.
-- [Install GitLab on DigitalOcean](https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-gitlab-on-ubuntu-18-04): Install Omnibus GitLab on DigitalOcean.
-- _Testing only!_ [DigitalOcean and Docker Machine](digitaloceandocker.md):
- Quickly test any version of GitLab on DigitalOcean using Docker Machine.
+| Cloud provider | Description |
+|---------------------------------------------------------------|-------------|
+| [AWS (HA)](aws/index.md) | Install GitLab on AWS using the community AMIs provided by GitLab. |
+| [Google Cloud Platform (GCP)](google_cloud_platform/index.md) | Install GitLab on a VM in GCP. |
+| [Azure](azure/index.md) | Install GitLab from Azure Marketplace. |
+| [DigitalOcean](https://about.gitlab.com/blog/2016/04/27/getting-started-with-gitlab-and-digitalocean/) | Install GitLab on DigitalOcean. You can also [test GitLab on DigitalOcean using Docker Machine](digitaloceandocker.md). |
## Next steps
Here are a few resources you might want to check out after completing the
installation:
-- [Upload a license](../user/admin_area/license.md) or [start a free trial](https://about.gitlab.com/free-trial/):
+- [Upload a license](../user/admin_area/license.md) or [start a free trial](https://about.gitlab.com/free-trial/):
Activate all GitLab Enterprise Edition functionality with a license.
- [Set up runners](https://docs.gitlab.com/runner/): Set up one or more GitLab
Runners, the agents that are responsible for all of the GitLab CI/CD features.
diff --git a/doc/install/installation.md b/doc/install/installation.md
index f246f975acf..8497b2b5269 100644
--- a/doc/install/installation.md
+++ b/doc/install/installation.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: howto
---
-# Installation from source
+# Installation from source **(FREE SELF)**
This is the official installation guide to set up a production GitLab server
using the source files. To set up a **development installation** or for many
@@ -108,9 +108,8 @@ Install the required packages (needed to compile Ruby and native extensions to R
```shell
sudo apt-get install -y build-essential zlib1g-dev libyaml-dev libssl-dev libgdbm-dev libre2-dev \
- libreadline-dev libncurses5-dev libffi-dev curl openssh-server checkinstall libxml2-dev \
- libxslt-dev libcurl4-openssl-dev libicu-dev logrotate rsync python-docutils pkg-config cmake \
- runit-systemd
+ libreadline-dev libncurses5-dev libffi-dev curl openssh-server libxml2-dev libxslt-dev \
+ libcurl4-openssl-dev libicu-dev logrotate rsync python-docutils pkg-config cmake runit-systemd
```
Ubuntu 14.04 (Trusty Tahr) doesn't have the `libre2-dev` package available, but
@@ -288,9 +287,9 @@ In GitLab 12.1 and later, only PostgreSQL is supported. In GitLab 13.0 and later
```shell
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
- RELEASE=$(lsb_release -cs) echo "deb http://apt.postgresql.org/pub/repos/apt/ ${RELEASE}"-pgdg main | sudo tee /etc/apt/sources.list.d/pgdg.list
+ sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
sudo apt update
- sudo apt -y install postgresql-11 postgresql-client-11 libpq-dev
+ sudo apt -y install postgresql-12 postgresql-client-12 libpq-dev
```
1. Verify the PostgreSQL version you have is supported by the version of GitLab you're
@@ -571,7 +570,9 @@ Install the gems (if you want to use Kerberos for user authentication, omit
`kerberos` in the `--without` option below):
```shell
-sudo -u git -H bundle install --deployment --without development test mysql aws kerberos
+sudo -u git -H bundle config set deployment 'true'
+sudo -u git -H bundle config set without 'development test mysql aws kerberos'
+sudo -u git -H bundle install
```
### Install GitLab Shell
diff --git a/doc/install/openshift_and_gitlab/index.md b/doc/install/openshift_and_gitlab/index.md
index 3ee899958af..3dbcbcfc90c 100644
--- a/doc/install/openshift_and_gitlab/index.md
+++ b/doc/install/openshift_and_gitlab/index.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: howto
---
-# How to install GitLab on OpenShift Origin 3
+# How to install GitLab on OpenShift Origin 3 **(FREE SELF)**
WARNING:
This article is deprecated. Use the official Kubernetes Helm charts for
@@ -38,7 +38,7 @@ already, go ahead and install the following components as they are essential to
test OpenShift easily:
- [VirtualBox](https://www.virtualbox.org/wiki/Downloads)
-- [Vagrant](https://www.vagrantup.com/downloads.html)
+- [Vagrant](https://www.vagrantup.com/downloads)
- [OpenShift Client](https://docs.okd.io/3.11/cli_reference/get_started_cli.html) (`oc` for short)
It is also important to mention that for the purposes of this tutorial, the
diff --git a/doc/install/postgresql_extensions.md b/doc/install/postgresql_extensions.md
index ed108a35c4b..8d5a2a79b72 100644
--- a/doc/install/postgresql_extensions.md
+++ b/doc/install/postgresql_extensions.md
@@ -4,13 +4,17 @@ group: unassigned
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Managing PostgreSQL extensions
+# Managing PostgreSQL extensions **(FREE SELF)**
This guide documents how to manage PostgreSQL extensions for installations with an external
PostgreSQL database.
-GitLab requires certain extensions to be installed into the GitLab database. For example,
-GitLab relies on `pg_trgm` and the `btree_gist` extensions.
+The following extensions must be loaded into the GitLab database:
+
+| Extension | Minimum GitLab version |
+|--------------|------------------------|
+| `pg_trgm` | 8.6 |
+| `btree_gist` | 13.1 |
In order to install extensions, PostgreSQL requires the user to have superuser privileges.
Typically, the GitLab database user is not a superuser. Therefore, regular database migrations
diff --git a/doc/install/relative_url.md b/doc/install/relative_url.md
index 90026e6e49e..e0971d7f354 100644
--- a/doc/install/relative_url.md
+++ b/doc/install/relative_url.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: reference
---
-# Install GitLab under a relative URL
+# Install GitLab under a relative URL **(FREE SELF)**
While it is recommended to install GitLab on its own (sub)domain, sometimes
this is not possible due to a variety of reasons. In that case, GitLab can also
diff --git a/doc/install/requirements.md b/doc/install/requirements.md
index da07453c2ce..a1343dd5f98 100644
--- a/doc/install/requirements.md
+++ b/doc/install/requirements.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: reference
---
-# Requirements
+# Requirements **(FREE SELF)**
This page includes useful information on the supported Operating Systems as well
as the hardware requirements that are needed to install and use GitLab.
@@ -80,7 +80,7 @@ From GitLab 13.1:
Beginning in GitLab 12.9, we only support Node.js 10.13.0 or higher, and we have dropped
support for Node.js 8. (Node.js 6 support was dropped in GitLab 11.8)
-We recommend Node 12.x, as it's faster.
+We recommend Node 14.x, as it's faster.
GitLab uses [webpack](https://webpack.js.org/) to compile frontend assets, which requires a minimum
version of Node.js 10.13.0.
@@ -110,7 +110,8 @@ Apart from a local hard drive you can also mount a volume that supports the netw
If you have enough RAM and a recent CPU the speed of GitLab is mainly limited by hard drive seek times. Having a fast drive (7200 RPM and up) or a solid state drive (SSD) will improve the responsiveness of GitLab.
NOTE:
-Since file system performance may affect the overall performance of GitLab, [we don't recommend using AWS EFS for storage](../administration/nfs.md#avoid-using-awss-elastic-file-system-efs).
+Since file system performance may affect the overall performance of GitLab,
+[we don't recommend using cloud-based file systems for storage](../administration/nfs.md#avoid-using-cloud-based-file-systems).
### CPU
@@ -151,18 +152,24 @@ MySQL/MariaDB are advised to [migrate to PostgreSQL](../update/mysql_to_postgres
The server running PostgreSQL should have _at least_ 5-10 GB of storage
available, though the exact requirements [depend on the number of users](../administration/reference_architectures/index.md).
-We highly recommend users to use the minimum PostgreSQL versions specified below as these are the versions used for development and testing.
+We highly recommend using the minimum PostgreSQL versions (as specified in
+the following table) as these were used for development and testing:
-GitLab version | Minimum PostgreSQL version
--|-
-10.0 | 9.6
-13.0 | 11
+| GitLab version | Minimum PostgreSQL version |
+|----------------|----------------------------|
+| 10.0 | 9.6 |
+| 13.0 | 11 |
-You must also ensure the `pg_trgm` and `btree_gist` extensions are [loaded into every
-GitLab database](postgresql_extensions.html).
+You must also ensure the following extensions are [loaded into every
+GitLab database](postgresql_extensions.html):
+
+| Extension | Minimum GitLab version |
+| ------------ | ---------------------- |
+| `pg_trgm` | 8.6 |
+| `btree_gist` | 13.1 |
NOTE:
-Support for [PostgreSQL 9.6 and 10 has been removed in GitLab 13.0](https://about.gitlab.com/releases/2020/05/22/gitlab-13-0-released/#postgresql-11-is-now-the-minimum-required-version-to-install-gitlab) so that GitLab can benefit from PostgreSQL 11 improvements, such as partitioning. For the schedule of transitioning to PostgreSQL 12, see [the related epic](https://gitlab.com/groups/gitlab-org/-/epics/2184).
+Support for [PostgreSQL 9.6 and 10 was removed in GitLab 13.0](https://about.gitlab.com/releases/2020/05/22/gitlab-13-0-released/#postgresql-11-is-now-the-minimum-required-version-to-install-gitlab) so that GitLab can benefit from PostgreSQL 11 improvements, such as partitioning. For the schedule of transitioning to PostgreSQL 12, see [the related epic](https://gitlab.com/groups/gitlab-org/-/epics/2184).
#### Additional requirements for GitLab Geo
diff --git a/doc/integration/README.md b/doc/integration/README.md
index 7d38dd6222a..9c3d39327f8 100644
--- a/doc/integration/README.md
+++ b/doc/integration/README.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
comments: false
---
-# GitLab integrations
+# GitLab integrations **(FREE)**
GitLab can be integrated with external services for enhanced functionality.
@@ -59,8 +59,7 @@ GitLab can be integrated with the following enhancements:
or [Kroki](../administration/integration/kroki.md) to use diagrams in AsciiDoc and Markdown documents.
- Attach merge requests to [Trello](trello_power_up.md) cards.
- Enable integrated code intelligence powered by [Sourcegraph](sourcegraph.md).
-- Add [Elasticsearch](elasticsearch.md) for [Advanced Search](../user/search/advanced_global_search.md),
- [Advanced System Search](../user/search/advanced_search_syntax.md), and faster searching.
+- Add [Elasticsearch](elasticsearch.md) for [Advanced Search](../user/search/advanced_search.md).
## Integrations
diff --git a/doc/integration/akismet.md b/doc/integration/akismet.md
index a2720c82fe7..d2e20b225cc 100644
--- a/doc/integration/akismet.md
+++ b/doc/integration/akismet.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Akismet
+# Akismet **(FREE)**
GitLab leverages [Akismet](https://akismet.com/) to protect against spam.
GitLab uses Akismet to prevent the creation of spam issues on public projects. Issues
diff --git a/doc/integration/auth0.md b/doc/integration/auth0.md
index 7e531682faf..6b8b07c3707 100644
--- a/doc/integration/auth0.md
+++ b/doc/integration/auth0.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Auth0 OmniAuth Provider
+# Auth0 OmniAuth Provider **(FREE SELF)**
To enable the Auth0 OmniAuth provider, you must create an Auth0 account, and an
application.
diff --git a/doc/integration/azure.md b/doc/integration/azure.md
index c83ef650f54..61a8290e664 100644
--- a/doc/integration/azure.md
+++ b/doc/integration/azure.md
@@ -4,11 +4,12 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Microsoft Azure OAuth2 OmniAuth Provider
+# Microsoft Azure OAuth2 OmniAuth Provider **(FREE)**
NOTE:
Per Microsoft, this provider uses the [older Azure Active Directory v1.0 endpoint](https://docs.microsoft.com/en-us/azure/active-directory/azuread-dev/v1-protocols-oauth-code).
Microsoft documentation suggests that you should use the [OpenID Connect protocol to use the v2 endpoints](../administration/auth/oidc.md#microsoft-azure) for new projects.
+To use v2 endpoints via OmniAuth, please follow [Microsoft Azure OAuth2 OmniAuth Provider v2 instructions](#microsoft-azure-oauth2-omniauth-provider-v2).
To enable the Microsoft Azure OAuth2 OmniAuth provider, you must register your application with Azure. Azure generates a client ID and secret key for you to use.
@@ -94,3 +95,106 @@ sign in and authorize the GitLab application. If successful, you are returned to
Read [Enable OmniAuth for an Existing User](omniauth.md#enable-omniauth-for-an-existing-user)
for information on how existing GitLab users can connect to their newly-available Azure AD accounts.
+
+## Microsoft Azure OAuth2 OmniAuth Provider v2
+
+In order to use v2 endpoints provided by Microsoft Azure Active Directory you must to configure it via Azure OAuth2 OmniAuth Provider v2.
+
+### Registering an Azure application
+
+To enable the Microsoft Azure OAuth2 OmniAuth provider, you must register your application with Azure. Azure generates a client ID and secret key for you to use.
+
+Sign in to the [Azure Portal](https://portal.azure.com), and follow the instructions in
+the [Microsoft Quickstart documentation](https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-register-app).
+
+As you go through the Microsoft procedure, keep the following in mind:
+
+- If you have multiple instances of Azure Active Directory, you can switch to the desired tenant.
+- You're setting up a Web application.
+- The redirect URI requires the URL of the Azure OAuth callback of your GitLab
+ installation. For example, `https://gitlab.example.com/users/auth/azure_activedirectory_v2/callback`.
+ The type dropdown should be set to **Web**.
+- The `client ID` and `client secret` are terms associated with OAuth 2. In some Microsoft documentation,
+ the terms may be listed as `Application ID` and `Application Secret`.
+- If you need to generate a new client secret, follow the Microsoft documentation
+ for [creating a new application secret](https://docs.microsoft.com/en-us/azure/active-directory/develop/howto-create-service-principal-portal#create-a-new-application-secret).
+- Save the client ID and client secret for your new app, as the client secret is only
+ displayed one time.
+
+### Adding API permissions (scopes)
+
+Once you have created an application, follow the [Microsoft Quickstart documentation to expose a web API](https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-configure-app-expose-web-apis). Be sure to add the following delegated permissions under the Microsoft Graph API:
+
+- `email`
+- `openid`
+- `profile`
+
+### Configuring GitLab
+
+1. On your GitLab server, open the configuration file.
+
+ For Omnibus GitLab:
+
+ ```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. Refer to [Initial OmniAuth Configuration](omniauth.md#initial-omniauth-configuration)
+ for initial settings.
+
+1. Add the provider configuration:
+
+ For Omnibus GitLab:
+
+ ```ruby
+ gitlab_rails['omniauth_providers'] = [
+ {
+ "name" => "azure_activedirectory_v2",
+ "args" => {
+ "client_id" => "CLIENT ID",
+ "client_secret" => "CLIENT SECRET",
+ "tenant_id" => "TENANT ID",
+ }
+ }
+ ]
+ ```
+
+ For installations from source:
+
+ ```yaml
+ - { name: 'azure_activedirectory_v2',
+ args: { client_id: "CLIENT ID",
+ client_secret: "CLIENT SECRET",
+ tenant_id: "TENANT ID" } }
+ ```
+
+ The `base_azure_url` is optional and can be added for different locales;
+ such as `base_azure_url: "https://login.microsoftonline.de"`.
+
+ The `scope` parameter is optional and can be added to `args`. Default `scope` is: `openid profile email`.
+
+1. Replace `CLIENT ID`, `CLIENT SECRET`, and `TENANT ID` with the values you got above.
+
+1. Save the configuration file.
+
+1. Reconfigure or restart GitLab, depending on your installation method:
+
+ - *If you installed from Omnibus GitLab,*
+ [reconfigure](../administration/restart_gitlab.md#omnibus-gitlab-reconfigure) GitLab.
+ - *If you installed from source,*
+ [restart GitLab](../administration/restart_gitlab.md#installations-from-source).
+
+On the sign-in page, you should now see a Microsoft icon below the regular sign-in form.
+Select the icon to begin the authentication process. Microsoft then asks you to
+sign in and authorize the GitLab application. If successful, you are returned to GitLab and signed in.
+
+Read [Enable OmniAuth for an Existing User](omniauth.md#enable-omniauth-for-an-existing-user)
+for information on how existing GitLab users can connect to their newly available Azure AD accounts.
diff --git a/doc/integration/bitbucket.md b/doc/integration/bitbucket.md
index 8999f4da9a2..a492b891248 100644
--- a/doc/integration/bitbucket.md
+++ b/doc/integration/bitbucket.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Integrate your GitLab server with Bitbucket Cloud
+# Integrate your GitLab server with Bitbucket Cloud **(FREE)**
NOTE:
Starting from GitLab 11.4, OmniAuth is enabled by default. If you're using an
@@ -26,6 +26,11 @@ To enable the Bitbucket OmniAuth provider you must register your application
with Bitbucket.org. Bitbucket generates an application ID and secret key for
you to use.
+WARNING:
+To help prevent an [OAuth 2 covert redirect](https://oauth.net/advisories/2014-1-covert-redirect/)
+vulnerability in which users' GitLab accounts could be compromised, append `/users/auth`
+to the end of the Bitbucket authorization callback URL.
+
1. Sign in to [Bitbucket.org](https://bitbucket.org).
1. Navigate to your individual user settings (**Bitbucket settings**) or a team's
settings (**Manage team**), depending on how you want the application registered.
@@ -40,9 +45,7 @@ you to use.
- **Application description:** *(Optional)* Fill this in if you wish.
- **Callback URL:** (Required in GitLab versions 8.15 and greater)
The URL to your GitLab installation, such as
- `https://gitlab.example.com/users/auth`. Be sure to append `/users/auth` to
- the end of the callback URL to prevent an
- [OAuth2 convert redirect](http://tetraph.com/covert_redirect/) vulnerability.
+ `https://gitlab.example.com/users/auth`.
Leaving this field empty
[results in an `Invalid redirect_uri` message](https://confluence.atlassian.com/bitbucket/oauth-faq-338365710.html).
- **URL:** The URL to your GitLab installation, such as `https://gitlab.example.com`.
diff --git a/doc/integration/cas.md b/doc/integration/cas.md
index b444143b03e..59f41ab4368 100644
--- a/doc/integration/cas.md
+++ b/doc/integration/cas.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# CAS OmniAuth Provider
+# CAS OmniAuth Provider **(FREE)**
To enable the CAS OmniAuth provider you must register your application with your CAS instance. This requires the service URL GitLab supplies to CAS. It should be something like: `https://gitlab.example.com:443/users/auth/cas3/callback?url`. By default handling for SLO is enabled, you only need to configure CAS for back-channel logout.
diff --git a/doc/integration/elasticsearch.md b/doc/integration/elasticsearch.md
index 389c7aabdf5..5c9149ef49b 100644
--- a/doc/integration/elasticsearch.md
+++ b/doc/integration/elasticsearch.md
@@ -11,10 +11,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
This document describes how to enable Advanced Search. After
Advanced Search is enabled, you'll have the benefit of fast search response times
-and the advantage of the following special searches:
-
-- [Advanced Search](../user/search/advanced_global_search.md)
-- [Advanced Search Syntax](../user/search/advanced_search_syntax.md)
+and the advantage of the [special searches](../user/search/advanced_search.md).
## Version requirements
@@ -41,7 +38,7 @@ each node should have:
- [Memory](https://www.elastic.co/guide/en/elasticsearch/guide/current/hardware.html#_memory): 8 GiB (minimum).
- [CPU](https://www.elastic.co/guide/en/elasticsearch/guide/current/hardware.html#_cpus): Modern processor with multiple cores.
-- [Storage](https://www.elastic.co/guide/en/elasticsearch/guide/current/hardware.html#_disks): Use SSD storage. You will need enough storage for 50% of the total size of your Git repositories.
+- [Storage](https://www.elastic.co/guide/en/elasticsearch/guide/current/hardware.html#_disks): Use SSD storage. The total storage size of all Elasticsearch nodes is about 50% of the total size of your Git repositories. It includes one primary and one replica.
A few notes on CPU and storage:
@@ -56,6 +53,12 @@ A few notes on CPU and storage:
to any spinning media for Elasticsearch. In testing, nodes that use SSD storage
see boosts in both query and indexing performance.
+- We've introduced the [`estimate_cluster_size`](#gitlab-advanced-search-rake-tasks)
+ Rake task to estimate the Advanced Search storage requirements in advance, which
+- The [`estimate_cluster_size`](#gitlab-advanced-search-rake-tasks) Rake task estimates the
+ Advanced Search storage requirements in advance. The Rake task uses total repository size
+ for the calculation. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/221177) in GitLab 13.10.
+
Keep in mind, these are **minimum requirements** for Elasticsearch.
Heavily-used Elasticsearch clusters will likely require considerably more
resources.
@@ -218,8 +221,8 @@ The following Elasticsearch settings are available:
| `Elasticsearch indexing` | Enables or disables Elasticsearch indexing and creates an empty index if one does not already exist. You may want to enable indexing but disable search in order to give the index time to be fully completed, for example. Also, keep in mind that this option doesn't have any impact on existing data, this only enables/disables the background indexer which tracks data changes and ensures new data is indexed. |
| `Pause Elasticsearch indexing` | Enables or disables temporary indexing pause. This is useful for cluster migration/reindexing. All changes are still tracked, but they are not committed to the Elasticsearch index until resumed. |
| `Search with Elasticsearch enabled` | Enables or disables using Elasticsearch in search. |
-| `URL` | The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., `http://host1, https://host2:9200`). If your Elasticsearch instance is password protected, pass the `username:password` in the URL (e.g., `http://<username>:<password>@<elastic_host>:9200/`). |
-| `Number of Elasticsearch shards` | Elasticsearch indexes are split into multiple shards for performance reasons. In general, larger indexes need to have more shards. Changes to this value do not take effect until the index is recreated. You can read more about tradeoffs in the [Elasticsearch documentation](https://www.elastic.co/guide/en/elasticsearch/reference/current/scalability.html). |
+| `URL` | The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., `http://host1, https://host2:9200`). If your Elasticsearch instance is password protected, pass the `username:password` in the URL (e.g., `http://<username>:<password>@<elastic_host>:9200/`). Special characters in the username or password should use [percentage encoding](https://en.wikipedia.org/wiki/Percent-encoding). |
+| `Number of Elasticsearch shards` | Elasticsearch indexes are split into multiple shards for performance reasons. In general, you should use at least 5 shards, and indexes with tens of millions of documents need to have more shards ([see below](#guidance-on-choosing-optimal-cluster-configuration)). Changes to this value do not take effect until the index is recreated. You can read more about tradeoffs in the [Elasticsearch documentation](https://www.elastic.co/guide/en/elasticsearch/reference/current/scalability.html). |
| `Number of Elasticsearch replicas` | Each Elasticsearch shard can have a number of replicas. These are a complete copy of the shard, and can provide increased query performance or resilience against hardware failure. Increasing this value will greatly increase total disk space required by the index. |
| `Limit namespaces and projects that can be indexed` | Enabling this will allow you to select namespaces and projects to index. All other namespaces and projects will use database search instead. Please note that if you enable this option but do not select any namespaces or projects, none will be indexed. [Read more below](#limiting-namespaces-and-projects).
| `Using AWS hosted Elasticsearch with IAM credentials` | Sign your Elasticsearch requests using [AWS IAM authorization](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html), [AWS EC2 Instance Profile Credentials](https://docs.aws.amazon.com/codedeploy/latest/userguide/getting-started-create-iam-instance-profile.html#getting-started-create-iam-instance-profile-cli), or [AWS ECS Tasks Credentials](https://docs.aws.amazon.com/AmazonECS/latest/userguide/task-iam-roles.html). Please refer to [Identity and Access Management in Amazon Elasticsearch Service](https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-ac.html) for details of AWS hosted Elasticsearch domain access policy configuration. |
@@ -232,6 +235,12 @@ The following Elasticsearch settings are available:
| `Bulk request concurrency` | The Bulk request concurrency indicates how many of the GitLab Golang-based indexer processes (or threads) can run in parallel to collect data to subsequently submit to Elasticsearch’s Bulk API. This increases indexing performance, but fills the Elasticsearch bulk requests queue faster. This setting should be used together with the Maximum bulk request size setting (see above) and needs to accommodate the resource constraints of both the Elasticsearch host(s) and the host(s) running the GitLab Golang-based indexer either from the `gitlab-rake` command or the Sidekiq tasks. |
| `Client request timeout` | Elasticsearch HTTP client request timeout value in seconds. `0` means using the system default timeout value, which depends on the libraries that GitLab application is built upon. |
+WARNING:
+Increasing the values of `Maximum bulk request size (MiB)` and `Bulk request concurrency` can negatively impact
+Sidekiq performance. Return them to their default values if you see increased `scheduling_latency_s` durations
+in your Sidekiq logs. For more information, see
+[issue 322147](https://gitlab.com/gitlab-org/gitlab/-/issues/322147).
+
### Limiting namespaces and projects
If you select `Limit namespaces and projects that can be indexed`, more options will become available.
@@ -335,7 +344,7 @@ Sometimes, you might want to abandon the unfinished reindex job and resume the i
1. Uncheck the "Pause Elasticsearch indexing" checkbox in **Admin Area > Settings > Advanced Search**.
-## Background migrations
+## Advanced Search migrations
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/234046) in GitLab 13.6.
@@ -343,7 +352,7 @@ With reindex migrations running in the background, there's no need for a manual
intervention. This usually happens in situations where new features are added to
Advanced Search, which means adding or changing the way content is indexed.
-To confirm that the background migrations ran, you can check with:
+To confirm that the Advanced Search migrations ran, you can check with:
```shell
curl "$CLUSTER_URL/gitlab-production-migrations/_search?q=*" | jq .
@@ -393,6 +402,21 @@ debug why the migration was halted and make any changes before retrying the migr
fixed the cause of the failure, click "Retry migration", and the migration will be scheduled to be retried
in the background.
+If you cannot get the migration to succeed, you may
+consider the [last resort to recreate the index from
+scratch](#last-resort-to-recreate-an-index). This may allow you to skip over
+the problem because a newly created index will skip all migrations as the index
+will be recreated with the correct up-to-date schema.
+
+### All migrations must be finished before doing a major upgrade
+
+Before doing a major version GitLab upgrade, you should have completed all
+migrations that exist up until the latest minor version before that major
+version. If you have halted migrations, these will need to be resolved and
+[retried](#retry-a-halted-migration) before proceeding with a major version
+upgrade. Read more about [upgrading to a new major
+version](../update/index.md#upgrading-to-a-new-major-version).
+
## GitLab Advanced Search Rake tasks
Rake tasks are available to:
@@ -415,7 +439,9 @@ The following are some available Rake tasks:
| [`sudo gitlab-rake gitlab:elastic:index_snippets`](https://gitlab.com/gitlab-org/gitlab/blob/master/ee/lib/tasks/gitlab/elastic.rake) | Performs an Elasticsearch import that indexes the snippets data. |
| [`sudo gitlab-rake gitlab:elastic:projects_not_indexed`](https://gitlab.com/gitlab-org/gitlab/blob/master/ee/lib/tasks/gitlab/elastic.rake) | Displays which projects are not indexed. |
| [`sudo gitlab-rake gitlab:elastic:reindex_cluster`](https://gitlab.com/gitlab-org/gitlab/blob/master/ee/lib/tasks/gitlab/elastic.rake) | Schedules a zero-downtime cluster reindexing task. This feature should be used with an index that was created after GitLab 13.0. |
-| [`sudo gitlab-rake gitlab:elastic:mark_reindex_failed`](https://gitlab.com/gitlab-org/gitlab/blob/master/ee/lib/tasks/gitlab/elastic.rake)`] | Mark the most recent re-index job as failed. |
+| [`sudo gitlab-rake gitlab:elastic:mark_reindex_failed`](https://gitlab.com/gitlab-org/gitlab/blob/master/ee/lib/tasks/gitlab/elastic.rake) | Mark the most recent re-index job as failed. |
+| [`sudo gitlab-rake gitlab:elastic:list_pending_migrations`](https://gitlab.com/gitlab-org/gitlab/blob/master/ee/lib/tasks/gitlab/elastic.rake) | List pending migrations. Pending migrations include those that have not yet started, have started but not finished, and those that are halted. |
+| [`sudo gitlab-rake gitlab:elastic:estimate_cluster_size`](https://gitlab.com/gitlab-org/gitlab/blob/master/ee/lib/tasks/gitlab/elastic.rake) | Get an estimate of cluster size based on the total repository size. |
### Environment variables
@@ -465,7 +491,12 @@ For basic guidance on choosing a cluster configuration you may refer to [Elastic
- `Heap size` should be set to no more than 50% of your physical RAM. Additionally, it shouldn't be set to more than the threshold for zero-based compressed oops. The exact threshold varies, but 26 GB is safe on most systems, but can also be as large as 30 GB on some systems. See [Heap size settings](https://www.elastic.co/guide/en/elasticsearch/reference/current/important-settings.html#heap-size-settings) and [Setting JVM options](https://www.elastic.co/guide/en/elasticsearch/reference/current/jvm-options.html) for more details.
- Number of CPUs (CPU cores) per node usually corresponds to the `Number of Elasticsearch shards` setting described below.
- A good guideline is to ensure you keep the number of shards per node below 20 per GB heap it has configured. A node with a 30GB heap should therefore have a maximum of 600 shards, but the further below this limit you can keep it the better. This will generally help the cluster stay in good health.
-- Small shards result in small segments, which increases overhead. Aim to keep the average shard size between at least a few GB and a few tens of GB. Another consideration is the number of documents, you should aim for this simple formula for the number of shards: `number of expected documents / 5M +1`.
+- Number of Elasticsearch shards:
+ - Small shards result in small segments, which increases overhead. Aim to keep the average shard size between at least a few GB and a few tens of GB.
+ - Another consideration is the number of documents. To determine the number of shards to use, sum the numbers in the **Admin Area > Dashboard > Statistics** pane (the number of documents to be indexed), divide by 5 million, and add 5. For example:
+ - If you have fewer than about 2,000,000 documents, use the default of 5 shards
+ - 10,000,000 documents: `10000000/5000000 + 5` = 7 shards
+ - 100,000,000 documents: `100000000/5000000 + 5` = 25 shards
- `refresh_interval` is a per index setting. You may want to adjust that from default `1s` to a bigger value if you don't need data in real-time. This will change how soon you will see fresh results. If that's important for you, you should leave it as close as possible to the default value.
- You might want to raise [`indices.memory.index_buffer_size`](https://www.elastic.co/guide/en/elasticsearch/reference/current/indexing-buffer.html) to 30% or 40% if you have a lot of heavy indexing operations.
@@ -873,3 +904,35 @@ Improvements to the `code_analyzer` pattern and filters are being discussed in [
### Some binary files may not be searchable by name
In GitLab 13.9, a change was made where [binary file names are being indexed](https://gitlab.com/gitlab-org/gitlab/-/issues/301083). However, without indexing all projects' data from scratch, only binary files that are added or updated after the GitLab 13.9 release are searchable.
+
+### Last resort to recreate an index
+
+There may be cases where somehow data never got indexed and it's not in the
+queue, or the index is somehow in a state where migrations just simply cannot
+proceed. It is always best to try to troubleshoot the root cause of the problem
+using the above [troubleshooting](#troubleshooting) steps.
+
+If there are no other options, then you always have the option of recreating the
+entire index from scratch. If you have a small GitLab installation, this can
+sometimes be a quick way to resolve a problem, but if you have a large GitLab
+installation, then this will likely take a very long time to complete. Until the
+index is fully recreated, your index will not be serving correct search results,
+so you may want to disable **Search with Elasticsearch** while it is running.
+
+If you are sure you've read the above caveats and want to proceed, then you
+should run the following Rake task to recreate the entire index from scratch:
+
+**For Omnibus installations**
+
+```shell
+# WARNING: DO NOT RUN THIS UNTIL YOU READ THE DESCRIPTION ABOVE
+sudo gitlab-rake gitlab:elastic:index
+```
+
+**For installations from source**
+
+```shell
+# WARNING: DO NOT RUN THIS UNTIL YOU READ THE DESCRIPTION ABOVE
+cd /home/git/gitlab
+sudo -u git -H bundle exec rake gitlab:elastic:index
+```
diff --git a/doc/integration/external-issue-tracker.md b/doc/integration/external-issue-tracker.md
index b1eb9d0d2fe..4e00057c4b7 100644
--- a/doc/integration/external-issue-tracker.md
+++ b/doc/integration/external-issue-tracker.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# External issue tracker
+# External issue tracker **(FREE)**
GitLab has a great [issue tracker](../user/project/issues/index.md) but you can also use an external
one. External issue trackers are configurable per GitLab project.
diff --git a/doc/integration/facebook.md b/doc/integration/facebook.md
index b86958726a7..c901fdfdd10 100644
--- a/doc/integration/facebook.md
+++ b/doc/integration/facebook.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Facebook OAuth2 OmniAuth Provider
+# Facebook OAuth2 OmniAuth Provider **(FREE)**
To enable the Facebook OmniAuth provider you must register your application with Facebook. Facebook generates an app ID and secret key for you to use.
diff --git a/doc/integration/github.md b/doc/integration/github.md
index 0239ba0e818..4d8adfe42f1 100644
--- a/doc/integration/github.md
+++ b/doc/integration/github.md
@@ -4,24 +4,31 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Integrate your GitLab instance with GitHub
+# Integrate your GitLab instance with GitHub **(FREE)**
You can integrate your GitLab instance with GitHub.com and GitHub Enterprise. This integration
enables users to import projects from GitHub, or sign in to your GitLab instance
with their GitHub account.
+## Security check
+
+Some integrations risk compromising GitLab accounts. To help mitigate this
+[OAuth 2 covert redirect](https://oauth.net/advisories/2014-1-covert-redirect/)
+vulnerability, append `/users/auth` to the end of the authorization callback URL.
+
+However, as far as we know, GitHub does not validate the subdomain part of the `redirect_uri`.
+This means that a subdomain takeover, an XSS, or an open redirect on any subdomain of
+your website could enable the covert redirect attack.
+
## Enabling GitHub OAuth
-To enable the GitHub OmniAuth provider, you need an OAuth 2 Client ID and Client Secret from GitHub. To get these credentials, sign into GitHub and follow their procedure for [Creating an OAuth App](https://docs.github.com/apps/building-oauth-apps/creating-an-oauth-app/).
+To enable the GitHub OmniAuth provider, you need an OAuth 2 Client ID and Client Secret from GitHub. To get these credentials, sign into GitHub and follow their procedure for [Creating an OAuth App](https://docs.github.com/en/developers/apps/creating-an-oauth-app).
When you create an OAuth 2 app in GitHub, you need the following information:
- The URL of your GitLab instance, such as `https://gitlab.example.com`.
- The authorization callback URL; in this case, `https://gitlab.example.com/users/auth`. Include the port number if your GitLab instance uses a non-default port.
-NOTE:
-To prevent an [OAuth2 covert redirect](https://oauth.net/advisories/2014-1-covert-redirect/) vulnerability, append `/users/auth` to the end of the GitHub authorization callback URL.
-
See [Initial OmniAuth Configuration](omniauth.md#initial-omniauth-configuration) for initial settings.
After you have configured the GitHub provider, you need the following information. You must substitute that information in the GitLab configuration file in these next steps.
diff --git a/doc/integration/gitlab.md b/doc/integration/gitlab.md
index 97c5332c438..7e21685fd54 100644
--- a/doc/integration/gitlab.md
+++ b/doc/integration/gitlab.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Integrate your server with GitLab.com
+# Integrate your server with GitLab.com **(FREE)**
Import projects from GitLab.com and login to your GitLab instance with your GitLab.com account.
diff --git a/doc/integration/gitpod.md b/doc/integration/gitpod.md
index 7dc710615fb..e62e3de29c2 100644
--- a/doc/integration/gitpod.md
+++ b/doc/integration/gitpod.md
@@ -5,7 +5,7 @@ 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"
---
-# Gitpod Integration
+# Gitpod Integration **(FREE)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/228893) in GitLab 13.4.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/258206) in GitLab 13.8
@@ -34,9 +34,8 @@ To learn more about Gitpod, see their [features](https://www.gitpod.io/features/
With the Gitpod integration enabled for your GitLab instance, to enable it for yourself:
1. In the top-right corner, select your avatar.
-1. Select **Edit profile**.
-1. In the left sidebar, select **Account**.
-1. Under **Integrations**, locate the **Gitpod** section.
+1. Select **Preferences**.
+1. Under **Preferences**, locate the **Integrations** section.
1. Check the **Enable Gitpod integration** checkbox and select the **Save changes** button.
## Configure a self-managed instance **(FREE SELF)**
diff --git a/doc/integration/gmail_action_buttons_for_gitlab.md b/doc/integration/gmail_action_buttons_for_gitlab.md
index af9972e825e..fa0e79d4c0b 100644
--- a/doc/integration/gmail_action_buttons_for_gitlab.md
+++ b/doc/integration/gmail_action_buttons_for_gitlab.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Gmail actions buttons for GitLab
+# Gmail actions buttons for GitLab **(FREE)**
GitLab supports [Google actions in email](https://developers.google.com/gmail/markup/actions/actions-overview).
diff --git a/doc/integration/google.md b/doc/integration/google.md
index cd00c854fea..0e4c9b78b5f 100644
--- a/doc/integration/google.md
+++ b/doc/integration/google.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Google OAuth2 OmniAuth Provider
+# Google OAuth2 OmniAuth Provider **(FREE)**
To enable the Google OAuth2 OmniAuth provider you must register your application
with Google. Google generates a client ID and secret key for you to use.
diff --git a/doc/integration/img/oauth_provider_admin_application.png b/doc/integration/img/oauth_provider_admin_application.png
deleted file mode 100644
index 353114fea30..00000000000
--- a/doc/integration/img/oauth_provider_admin_application.png
+++ /dev/null
Binary files differ
diff --git a/doc/integration/jenkins.md b/doc/integration/jenkins.md
index b51ce5de8d7..1250ddee584 100644
--- a/doc/integration/jenkins.md
+++ b/doc/integration/jenkins.md
@@ -31,7 +31,8 @@ the ['GitLab vs. Jenkins' comparison page](https://about.gitlab.com/devops-tools
NOTE:
This documentation focuses only on how to **configure** a Jenkins *integration* with
-GitLab. Learn how to **migrate** from Jenkins to GitLab CI/CD in our
+GitLab. Learn how to set up Jenkins [on your local machine](../development/integrations/jenkins.md)
+in our developer documentation, and how to **migrate** from Jenkins to GitLab CI/CD in our
[Migrating from Jenkins](../ci/migration/jenkins.md) documentation.
## Configure GitLab integration with Jenkins
@@ -138,9 +139,11 @@ Set up the Jenkins project you intend to run your build on.
## Configure the GitLab project
-Configure the GitLab integration with Jenkins.
+Configure the GitLab integration with Jenkins in one of the following ways.
-### Option 1: Jenkins integration (recommended)
+### Recommended Jenkins integration
+
+GitLab recommends this approach for Jenkins integrations.
1. Create a new GitLab project or choose an existing one.
1. Go to **Settings > Integrations**, then select **Jenkins CI**.
@@ -159,7 +162,7 @@ Configure the GitLab integration with Jenkins.
authentication.
1. Click **Test settings and save changes**. GitLab tests the connection to Jenkins.
-### Option 2: Webhook
+### Webhook integration
If you are unable to provide GitLab with your Jenkins server login, you can use this option
to integrate GitLab and Jenkins.
@@ -167,7 +170,8 @@ to integrate GitLab and Jenkins.
1. In the configuration of your Jenkins job, in the GitLab configuration section, click **Advanced**.
1. Click the **Generate** button under the **Secret Token** field.
1. Copy the resulting token, and save the job configuration.
-1. In GitLab, create a webhook for your project, enter the trigger URL (such as `https://JENKINS_URL/project/YOUR_JOB`) and paste the token in the **Secret Token** field.
+1. In GitLab, create a webhook for your project, enter the trigger URL
+ (such as `https://JENKINS_URL/project/YOUR_JOB`) and paste the token in the **Secret Token** field.
1. After you add the webhook, click the **Test** button, and it should succeed.
## Troubleshooting
diff --git a/doc/integration/jenkins_deprecated.md b/doc/integration/jenkins_deprecated.md
index 2ed87456ea1..61d1deace4f 100644
--- a/doc/integration/jenkins_deprecated.md
+++ b/doc/integration/jenkins_deprecated.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Jenkins CI (deprecated) service
+# Jenkins CI (deprecated) service **(FREE)**
NOTE:
In GitLab 8.3, Jenkins integration using the
@@ -42,7 +42,7 @@ In GitLab, perform the following steps.
Jenkins needs read access to the GitLab repository. We already specified a
private key to use in Jenkins, now we need to add a public one to the GitLab
project. For that case we need a Deploy key. Read the documentation on
-[how to set up a Deploy key](../ssh/README.md#deploy-keys).
+[how to set up a Deploy key](../user/project/deploy_keys/index.md).
### Jenkins service
diff --git a/doc/integration/oauth2_generic.md b/doc/integration/oauth2_generic.md
index 41656bd2216..84490757c16 100644
--- a/doc/integration/oauth2_generic.md
+++ b/doc/integration/oauth2_generic.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Sign into GitLab with (almost) any OAuth2 provider
+# Sign into GitLab with (almost) any OAuth2 provider **(FREE)**
The `omniauth-oauth2-generic` gem allows Single Sign-On between GitLab and your own OAuth2 provider
(or any OAuth2 provider compatible with this gem)
diff --git a/doc/integration/omniauth.md b/doc/integration/omniauth.md
index cf033018e17..e3b18c0b82b 100644
--- a/doc/integration/omniauth.md
+++ b/doc/integration/omniauth.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# OmniAuth
+# OmniAuth **(FREE)**
GitLab leverages OmniAuth to allow users to sign in using Twitter, GitHub, and
other popular services. [OmniAuth](https://rubygems.org/gems/omniauth/) is
@@ -239,7 +239,6 @@ from the OmniAuth provider's documentation.
If you have successfully set up a provider that is not shipped with GitLab itself,
please let us know.
-Share your experience [in the public Wiki](https://github.com/gitlabhq/gitlab-public-wiki/wiki/Custom-omniauth-provider-configurations).
You can help others by reporting successful configurations and probably share a
few insights or provide warnings for common errors or pitfalls.
diff --git a/doc/integration/openid_connect_provider.md b/doc/integration/openid_connect_provider.md
index 4455ace3e1f..b37c5064063 100644
--- a/doc/integration/openid_connect_provider.md
+++ b/doc/integration/openid_connect_provider.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# GitLab as OpenID Connect identity provider
+# GitLab as OpenID Connect identity provider **(FREE)**
This document is about using GitLab as an OpenID Connect identity provider
to sign in to other services.
diff --git a/doc/integration/recaptcha.md b/doc/integration/recaptcha.md
index 8f090dfc588..9ffc89e2c13 100644
--- a/doc/integration/recaptcha.md
+++ b/doc/integration/recaptcha.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# reCAPTCHA
+# reCAPTCHA **(FREE)**
GitLab leverages [Google's reCAPTCHA](https://www.google.com/recaptcha/about/)
to protect against spam and abuse. GitLab displays the CAPTCHA form on the sign-up page
diff --git a/doc/integration/salesforce.md b/doc/integration/salesforce.md
index 156109518a6..102b89298a1 100644
--- a/doc/integration/salesforce.md
+++ b/doc/integration/salesforce.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Salesforce OmniAuth Provider
+# Salesforce OmniAuth Provider **(FREE)**
You can integrate your GitLab instance with [Salesforce](https://www.salesforce.com/) to enable users to log in to your GitLab instance with their Salesforce account.
diff --git a/doc/integration/saml.md b/doc/integration/saml.md
index 9b6ad3f2755..d68cf8e2f34 100644
--- a/doc/integration/saml.md
+++ b/doc/integration/saml.md
@@ -13,15 +13,15 @@ You should also reference the [OmniAuth documentation](omniauth.md) for general
## Common SAML Terms
-| Term | Description |
-|------|-------------|
-| Identity Provider (IdP) | The service which manages your user identities such as ADFS, Okta, Onelogin, or Ping Identity. |
-| Service Provider (SP) | SAML considers GitLab to be a service provider. |
-| Assertion | A piece of information about a user's identity, such as their name or role. Also known as claims or attributes. |
-| SSO | Single Sign-On. |
+| Term | Description |
+|--------------------------------|-------------|
+| Identity Provider (IdP) | The service which manages your user identities, such as ADFS, Okta, OneLogin, or Ping Identity. |
+| Service Provider (SP) | SAML considers GitLab to be a service provider. |
+| Assertion | A piece of information about a user's identity, such as their name or role. Also known as claims or attributes. |
+| SSO | Single Sign-On. |
| Assertion consumer service URL | The callback on GitLab where users will be redirected after successfully authenticating with the identity provider. |
-| Issuer | How GitLab identifies itself to the identity provider. Also known as a "Relying party trust identifier". |
-| Certificate fingerprint | Used to confirm that communications over SAML are secure by checking that the server is signing communications with the correct certificate. Also known as a certificate thumbprint. |
+| Issuer | How GitLab identifies itself to the identity provider. Also known as a "Relying party trust identifier". |
+| Certificate fingerprint | Used to confirm that communications over SAML are secure by checking that the server is signing communications with the correct certificate. Also known as a certificate thumbprint. |
## General Setup
@@ -265,7 +265,7 @@ considered admin users.
### Auditor groups **(PREMIUM SELF)**
-> Introduced in [GitLab Starter](https://about.gitlab.com/pricing/) 11.4.
+> Introduced in GitLab 11.4.
The requirements are the same as the previous settings, your IdP needs to pass Group information to GitLab, you need to tell
GitLab where to look for the groups in the SAML response, and which group(s) should be
@@ -454,8 +454,6 @@ args: {
### `uid_attribute`
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/17734) in GitLab 10.7.
-
By default, the `uid` is set as the `name_id` in the SAML response. If you'd like to designate a unique attribute for the `uid`, you can set the `uid_attribute`. In the example below, the value of `uid` attribute in the SAML response is set as the `uid_attribute`.
```yaml
diff --git a/doc/integration/shibboleth.md b/doc/integration/shibboleth.md
index 3b92f2858ac..c4cf19747be 100644
--- a/doc/integration/shibboleth.md
+++ b/doc/integration/shibboleth.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Shibboleth OmniAuth Provider
+# Shibboleth OmniAuth Provider **(FREE)**
NOTE:
The preferred approach for integrating a Shibboleth authentication system
diff --git a/doc/integration/slash_commands.md b/doc/integration/slash_commands.md
index 0dcf86cc46d..2c133c1de76 100644
--- a/doc/integration/slash_commands.md
+++ b/doc/integration/slash_commands.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Slash Commands
+# Slash Commands **(FREE)**
> - [Moved](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/24780) to GitLab Free in 11.9.
diff --git a/doc/integration/trello_power_up.md b/doc/integration/trello_power_up.md
index 1a1b6cd101f..e8956271508 100644
--- a/doc/integration/trello_power_up.md
+++ b/doc/integration/trello_power_up.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Trello Power-Up
+# Trello Power-Up **(FREE)**
The GitLab Trello Power-Up enables you to seamlessly attach
GitLab **merge requests** to Trello cards.
diff --git a/doc/integration/twitter.md b/doc/integration/twitter.md
index 8404352d0e9..58e111be73c 100644
--- a/doc/integration/twitter.md
+++ b/doc/integration/twitter.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Twitter OAuth2 OmniAuth Provider
+# Twitter OAuth2 OmniAuth Provider **(FREE)**
To enable the Twitter OmniAuth provider you must register your application with Twitter. Twitter generates a client ID and secret key for you to use.
diff --git a/doc/intro/index.md b/doc/intro/index.md
index 1ab7553d3a8..a40293955a9 100644
--- a/doc/intro/index.md
+++ b/doc/intro/index.md
@@ -12,7 +12,7 @@ comments: false
Create projects and groups.
- [Create a new project](../user/project/working_with_projects.md#create-a-project)
-- [Create a new group](../user/group/index.md#create-a-new-group)
+- [Create a new group](../user/group/index.md#create-a-group)
## Prioritize
diff --git a/doc/operations/feature_flags.md b/doc/operations/feature_flags.md
index f23880554a6..216e6adcdaf 100644
--- a/doc/operations/feature_flags.md
+++ b/doc/operations/feature_flags.md
@@ -79,8 +79,8 @@ is 200. For GitLab SaaS, the maximum number is determined by [tier](https://abou
You can apply a feature flag strategy across multiple environments, without defining
the strategy multiple times.
-GitLab Feature Flags use [Unleash](https://unleash.github.io) as the feature flag
-engine. In Unleash, there are [strategies](https://unleash.github.io/docs/activation_strategy)
+GitLab Feature Flags use [Unleash](https://docs.getunleash.io/) as the feature flag
+engine. In Unleash, there are [strategies](https://docs.getunleash.io/docs/activation_strategy)
for granular feature flag controls. GitLab Feature Flags can have multiple strategies,
and the supported strategies are:
@@ -95,7 +95,7 @@ and clicking **{pencil}** (edit).
### All users
-Enables the feature for all users. It uses the [`default`](https://unleash.github.io/docs/activation_strategy#default)
+Enables the feature for all users. It uses the [`default`](https://docs.getunleash.io/docs/activation_strategy#default)
Unleash activation strategy.
### Percent Rollout
diff --git a/doc/operations/incident_management/incidents.md b/doc/operations/incident_management/incidents.md
index f0bb9a8e950..317797376fc 100644
--- a/doc/operations/incident_management/incidents.md
+++ b/doc/operations/incident_management/incidents.md
@@ -54,7 +54,7 @@ With Maintainer or higher [permissions](../../user/permissions.md), you can enab
1. Navigate to **Settings > Operations > Incidents** and expand **Incidents**.
1. Check the **Create an incident** checkbox.
1. To customize the incident, select an
- [issue template](../../user/project/description_templates.md#creating-issue-templates).
+ [issue template](../../user/project/description_templates.md#create-an-issue-template).
1. To send [an email notification](paging.md#email-notifications) to users
with [Developer permissions](../../user/permissions.md), select
**Send a separate email notification to Developers**. Email notifications are
diff --git a/doc/operations/incident_management/integrations.md b/doc/operations/incident_management/integrations.md
index b3e7d9c544d..d5f3643695a 100644
--- a/doc/operations/incident_management/integrations.md
+++ b/doc/operations/incident_management/integrations.md
@@ -4,7 +4,7 @@ group: Health
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Alert integrations **(FREE)**
+# Integrations **(FREE)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13203) in GitLab Ultimate 12.4.
> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/42640) to GitLab Free in 12.8.
@@ -79,7 +79,7 @@ to configure alerts for this integration.
## Customize the alert payload outside of GitLab
For all integration types, you can customize the payload by sending the following
-parameters. All fields are optional. If the incoming alert does not contain a value for the `Title` field, a default value of `New: Incident` will be applied.
+parameters. All fields are optional. If the incoming alert does not contain a value for the `Title` field, a default value of `New: Alert` will be applied.
| Property | Type | Description |
| ------------------------- | --------------- | ----------- |
diff --git a/doc/operations/incident_management/paging.md b/doc/operations/incident_management/paging.md
index dd04cd63a54..4801f94d494 100644
--- a/doc/operations/incident_management/paging.md
+++ b/doc/operations/incident_management/paging.md
@@ -23,14 +23,12 @@ you never miss a page.
## Email notifications
-Email notifications are available in projects that have been
-[configured to create incidents automatically](incidents.md#create-incidents-automatically)
-for triggered alerts. Project members with the **Owner** or **Maintainer** roles are
-sent an email notification automatically. (This is not configurable.) To optionally
-send additional email notifications to project members with the **Developer** role:
+Email notifications are available in projects for triggered alerts. Project
+members with the **Owner** or **Maintainer** roles have the option to receive
+a single email notification for new alerts.
1. Navigate to **Settings > Operations**.
1. Expand the **Incidents** section.
-1. In the **Alert Integration** tab, select the **Send a separate email notification to Developers**
- check box.
+1. In the **Alert Integration** tab, select the checkbox
+ **Send a single email notification to Owners and Maintainers for new alerts**.
1. Select **Save changes**.
diff --git a/doc/operations/incident_management/status_page.md b/doc/operations/incident_management/status_page.md
index fe0bfa3318b..46f0a6f278c 100644
--- a/doc/operations/incident_management/status_page.md
+++ b/doc/operations/incident_management/status_page.md
@@ -80,7 +80,7 @@ the necessary CI/CD variables to deploy the Status Page to AWS S3:
- `AWS_DEFAULT_REGION` - The AWS region.
- `AWS_ACCESS_KEY_ID` - The AWS access key ID.
- `AWS_SECRET_ACCESS_KEY` - The AWS secret.
-1. Navigate to **CI / CD > Pipelines > Run Pipeline**, and run the pipeline to
+1. Navigate to **CI/CD > Pipelines > Run Pipeline**, and run the pipeline to
deploy the Status Page to S3.
WARNING:
diff --git a/doc/operations/metrics/dashboards/variables.md b/doc/operations/metrics/dashboards/variables.md
index c0d0f65cc65..df2dd0939bb 100644
--- a/doc/operations/metrics/dashboards/variables.md
+++ b/doc/operations/metrics/dashboards/variables.md
@@ -16,7 +16,7 @@ Queries that continue to use the old format display no data.
## Predefined variables
-GitLab supports a limited set of [CI variables](../../../ci/variables/README.md)
+GitLab supports a limited set of [CI/CD variables](../../../ci/variables/README.md)
in the Prometheus query. This is particularly useful for identifying a specific
environment, for example with `ci_environment_slug`. Variables for Prometheus queries
must be lowercase. The supported variables are:
diff --git a/doc/operations/metrics/embed.md b/doc/operations/metrics/embed.md
index e5ab391afe5..87d84bfdfc0 100644
--- a/doc/operations/metrics/embed.md
+++ b/doc/operations/metrics/embed.md
@@ -4,10 +4,10 @@ group: Health
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Embedding metric charts within GitLab-flavored Markdown **(FREE)**
+# Embedding metric charts within GitLab Flavored Markdown **(FREE)**
You can display metrics charts within
-[GitLab Flavored Markdown](../../user/markdown.md#gitlab-flavored-markdown-gfm)
+[GitLab Flavored Markdown](../../user/markdown.md#gitlab-flavored-markdown)
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
diff --git a/doc/raketasks/backup_restore.md b/doc/raketasks/backup_restore.md
index 20131a795c5..48fa847e170 100644
--- a/doc/raketasks/backup_restore.md
+++ b/doc/raketasks/backup_restore.md
@@ -1,6 +1,6 @@
---
stage: Enablement
-group: Distribution
+group: Geo
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
@@ -629,7 +629,7 @@ directory that you want to copy the tarballs to is the root of your mounted
directory, use `.` instead.
Because file system performance may affect overall GitLab performance,
-[GitLab doesn't recommend using EFS for storage](../administration/nfs.md#avoid-using-awss-elastic-file-system-efs).
+[GitLab doesn't recommend using cloud-based file systems for storage](../administration/nfs.md#avoid-using-cloud-based-file-systems).
For Omnibus GitLab packages:
@@ -1017,7 +1017,7 @@ issue.
The GitLab Helm chart uses a different process, documented in
[restoring a GitLab Helm chart installation](https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/backup-restore/restore.md).
-### Restoring only one or a few project(s) or group(s) from a backup
+### Restoring only one or a few projects or groups from a backup
Although the Rake task used to restore a GitLab instance doesn't support
restoring a single project or group, you can use a workaround by restoring
diff --git a/doc/raketasks/index.md b/doc/raketasks/index.md
index be7e55cba9b..ab0505f065e 100644
--- a/doc/raketasks/index.md
+++ b/doc/raketasks/index.md
@@ -42,7 +42,7 @@ The following are available Rake tasks:
| [Repository storage](../administration/raketasks/storage.md) | List and migrate existing projects and attachments from legacy storage to hashed storage. |
| [Uploads migrate](../administration/raketasks/uploads/migrate.md) | Migrate uploads between storage local and object storage. |
| [Uploads sanitize](../administration/raketasks/uploads/sanitize.md) | Remove EXIF data from images uploaded to earlier versions of GitLab. |
-| [Usage data](../administration/troubleshooting/gitlab_rails_cheat_sheet.md#generate-usage-ping) | Generate and troubleshoot [Usage Ping](../development/usage_ping.md).|
+| [Usage data](../administration/troubleshooting/gitlab_rails_cheat_sheet.md#generate-usage-ping) | Generate and troubleshoot [Usage Ping](../development/usage_ping/index.md).|
| [User management](user_management.md) | Perform user management tasks. |
| [Webhooks administration](web_hooks.md) | Maintain project Webhooks. |
| [X.509 signatures](x509_signatures.md) | Update X.509 commit signatures, useful if certificate store has changed. |
diff --git a/doc/security/README.md b/doc/security/README.md
index b009fe5c8da..9b9d4f030ac 100644
--- a/doc/security/README.md
+++ b/doc/security/README.md
@@ -24,6 +24,7 @@ type: index
- [Security of running jobs](https://docs.gitlab.com/runner/security/)
- [Proxying images](asset_proxy.md)
- [CI/CD variables](cicd_variables.md)
+- [Token overview](token_overview.md)
## Securing your GitLab installation
diff --git a/doc/security/token_overview.md b/doc/security/token_overview.md
new file mode 100644
index 00000000000..2bb4ffa8eec
--- /dev/null
+++ b/doc/security/token_overview.md
@@ -0,0 +1,108 @@
+---
+stage: Manage
+group: Access
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+type: reference
+---
+
+# GitLab Token overview
+
+This document lists tokens used in GitLab, their purpose and, where applicable, security guidance.
+
+## Personal access tokens
+
+You can create [Personal access tokens](../user/profile/personal_access_tokens.md) to authenticate with:
+
+- The GitLab API.
+- GitLab repositories.
+- The GitLab registry.
+
+You can limit the scope and expiration date of your personal access tokens. By default,
+they inherit permissions from the user who created them.
+
+## OAuth2 tokens
+
+GitLab can serve as an [OAuth2 provider](../api/oauth2.md) to allow other services to access the GitLab API on a user’s behalf.
+
+You can limit the scope and lifetime of your OAuth2 tokens.
+
+## Impersonation tokens
+
+An [Impersonation token](../api/README.md#impersonation-tokens) is a special type of personal access
+token. It can be created only by an administrator for a specific user. Impersonation tokens can
+help you build applications or scripts that authenticate with the GitLab API, repositories, and the GitLab registry as a specific user.
+
+You can limit the scope and set an expiration date for an impersonation token.
+
+## Project access tokens
+
+[Project access tokens](../user/project/settings/project_access_tokens.md#project-access-tokens)
+are scoped to a project. As with [Personal access tokens](#personal-access-tokens), you can use them to authenticate with:
+
+- The GitLab API.
+- GitLab repositories.
+- The GitLab registry.
+
+You can limit the scope and expiration date of project access tokens. When you
+create a project access token, GitLab creates a [project bot user](../user/project/settings/project_access_tokens.md#project-bot-users). Project
+bot users are service accounts and do not count as licensed seats.
+
+## Deploy tokens
+
+[Deploy tokens](../user/project/deploy_tokens/index.md) allow you to download (`git clone`) or push and pull packages and container registry images of a project without having a user and a password. Deploy tokens cannot be used with the GitLab API.
+
+Deploy tokens can be managed by project maintainers and owners.
+
+## Deploy keys
+
+[Deploy keys](../user/project/deploy_keys/index.md) allow read-only or read-write access to your repositories by importing an SSH public key into your GitLab instance. Deploy keys cannot be used with the GitLab API or the registry.
+
+This is useful, for example, for cloning repositories to your Continuous Integration (CI) server. By using deploy keys, you don’t have to set up a fake user account.
+
+Project maintainers and owners can add or enable a deploy key for a project repository
+
+## Runner registration tokens
+
+Runner registration tokens are used to [register](https://docs.gitlab.com/runner/register/) a [runner](https://docs.gitlab.com/runner/) with GitLab. Group or project owners or instance admins can obtain them through the GitLab user interface. The registration token is limited to runner registration and has no further scope.
+
+You can use the runner registration token to add runners that execute jobs in a project or group. The runner has access to the project’s code, so be careful when assigning project and group-level permissions.
+
+## Runner authentication tokens (also called runner tokens)
+
+After registration, the runner receives an authentication token, which it uses to authenticate with GitLab when picking up jobs from the job queue. The authentication token is stored locally in the runner's [`config.toml`](https://docs.gitlab.com/runner/configuration/advanced-configuration.html) file.
+
+After authentication with GitLab, the runner receives a [job token](../user/project/new_ci_build_permissions_model.md#job-token), which it uses to execute the job.
+
+In case of Docker Machine/Kubernetes/VirtualBox/Parallels/SSH executors, the execution environment has no access to the runner authentication token, because it stays on the runner machine. They have access to the job token only, which is needed to execute the job.
+
+Malicious access to a runner's file system may expose the `config.toml` file and thus the authentication token, allowing an attacker to [clone the runner](https://docs.gitlab.com/runner/security/#cloning-a-runner).
+
+## CI/CD job tokens
+
+The [CI/CD](../api/README.md#gitlab-ci-job-token) job token
+is a short lived token only valid for the duration of a job. It gives a CI/CD job
+access to a limited amount of [API endpoints](../api/README.md#gitlab-ci-job-token).
+API authentication uses the job token, by using the authorization of the user
+triggering the job.
+
+The job token is secured by its short life-time and limited scope. It could possibly be leaked if multiple jobs run on the same machine ([like with the shell runner](https://docs.gitlab.com/runner/security/#usage-of-shell-executor)). On Docker Machine runners, configuring [`MaxBuilds=1`](https://docs.gitlab.com/runner/configuration/advanced-configuration.html#the-runnersmachine-section) is recommended to make sure runner machines only ever run one build and are destroyed afterwards. This may impact performance, as provisioning machines takes some time.
+
+## Available scopes
+
+This table shows available scopes per token. Scopes can be limited further on token creation.
+
+| | API access | Registry access | Repository access |
+|-----------------------------|------------|-----------------|-------------------|
+| Personal access token | ✅ | ✅ | ✅ |
+| OAuth2 token | ✅ | 🚫 | ✅ |
+| Impersonation token | ✅ | ✅ | ✅ |
+| Project access token | ✅(1) | ✅(1) | ✅(1) |
+| Deploy token | 🚫 | ✅ | ✅ |
+| Deploy key | 🚫 | 🚫 | ✅ |
+| Runner registration token | 🚫 | 🚫 | ✴ï¸(2) |
+| Runner authentication token | 🚫 | 🚫 | ✴ï¸(2) |
+| Job token | ✴ï¸(3) | 🚫 | ✅ |
+
+1. Limited to the one project.
+1. Runner registration and authentication token don't provide direct access to repositories, but can be used to register and authenticate a new runner that may execute jobs which do have access to the repository
+1. Limited to certain [endpoints](../api/README.md#gitlab-ci-job-token).
diff --git a/doc/security/two_factor_authentication.md b/doc/security/two_factor_authentication.md
index 7a9ed9d435d..1abd4502eb5 100644
--- a/doc/security/two_factor_authentication.md
+++ b/doc/security/two_factor_authentication.md
@@ -61,7 +61,7 @@ The following are important notes about 2FA:
2FA for the project. For example, if project *P* belongs to 2FA-enabled group *A* and
is shared with 2FA-disabled group *B*, members of group *B* can access project *P*
without 2FA. To ensure this scenario doesn't occur,
- [prevent sharing of projects](../user/group/index.md#share-with-group-lock)
+ [prevent sharing of projects](../user/group/index.md#prevent-a-project-from-being-shared-with-groups)
for the 2FA-enabled group.
- If you add additional members to a project within a group or subgroup that has
2FA enabled, 2FA is **not** required for those individually added members.
@@ -129,8 +129,15 @@ verification can be done via a GitLab Shell command:
ssh git@<hostname> 2fa_verify
```
-Once the OTP is verified, Git over SSH operations can be used for 15 minutes
-with the associated SSH key.
+Once the OTP is verified, Git over SSH operations can be used for a session duration of
+15 minutes (default) with the associated SSH key.
+
+### Security limitation
+
+2FA does not protect users with compromised *private* SSH keys.
+
+Once an OTP is verified, anyone can run Git over SSH with that private SSH key for
+the configured [session duration](../user/admin_area/settings/account_and_limit_settings.md#customize-session-duration-for-git-operations-when-2fa-is-enabled).
### Enable or disable Two-factor Authentication (2FA) for Git operations
diff --git a/doc/ssh/README.md b/doc/ssh/README.md
index 815d8c13c43..b15cd96d09e 100644
--- a/doc/ssh/README.md
+++ b/doc/ssh/README.md
@@ -7,19 +7,12 @@ type: howto, reference
# GitLab and SSH keys
-Git is a distributed version control system, which means you can work locally.
-In addition, you can also share or "push" your changes to other servers.
-GitLab supports secure communication between Git and its servers using SSH keys.
+Git is a distributed version control system, which means you can work locally,
+then share or "push" your changes to a server. In this case, the server is GitLab.
-The SSH protocol provides this security and allows you to authenticate to the
-GitLab remote server without supplying your username or password each time.
-
-This page can help you configure secure SSH keys which you can use to help secure
-connections to GitLab repositories.
-
-- If you need information on creating SSH keys, start with our [options for SSH keys](#supported-ssh-key-types).
-- If you have SSH keys dedicated for your GitLab account, you may be interested in [Working with non-default SSH key pair paths](#working-with-non-default-ssh-key-pair-paths).
-- If you already have an SSH key pair, you can go to how you can [add an SSH key to your GitLab account](#add-an-ssh-key-to-your-gitlab-account).
+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
@@ -31,7 +24,7 @@ To use SSH to communicate with GitLab, you need:
To view the version of SSH installed on your system, run `ssh -V`.
GitLab does [not support installation on Microsoft Windows](../install/requirements.md#microsoft-windows),
-but you can set up SSH keys on the Windows [client](#options-for-microsoft-windows).
+but you can set up SSH keys on the Windows [client](#use-ssh-on-microsoft-windows).
## Supported SSH key types
@@ -84,7 +77,7 @@ If you do not have an existing SSH key pair, generate a new one.
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
@@ -104,10 +97,10 @@ If you do not have an existing SSH key pair, generate a new one.
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](#deploy-keys)
+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](#working-with-non-default-ssh-key-pair-paths).
+ 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/ssh/passphrase/):
@@ -118,15 +111,47 @@ If you do not have an existing SSH key pair, generate a new one.
1. A confirmation is displayed, including information about where your files are stored.
-A public and private key are generated.
+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 type this command:
+1. Open a terminal and run this command:
```shell
ssh-keygen -p -f /path/to/ssh_key
@@ -140,7 +165,7 @@ 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 type this command:
+1. Open a terminal and run this command:
```shell
ssh-keygen -o -f ~/.ssh/id_rsa
@@ -155,19 +180,18 @@ OpenSSH format.
## Add an SSH key to your GitLab account
-Now you can copy the SSH key you created to your GitLab account.
+To use SSH with GitLab, copy your public key to your GitLab account.
-1. Copy your **public** SSH key to a location that saves information in text format.
- The following options saves information for ED25519 keys to the clipboard
- for the noted operating system:
+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
- pbcopy < ~/.ssh/id_ed25519.pub
+ tr -d '\n' < ~/.ssh/id_ed25519.pub | pbcopy
```
- **Linux (requires the `xclip` package):**
+ **Linux** (requires the `xclip` package):
```shell
xclip -sel clip < ~/.ssh/id_ed25519.pub
@@ -179,128 +203,83 @@ Now you can copy the SSH key you created to your GitLab account.
cat ~/.ssh/id_ed25519.pub | clip
```
- If you're using an RSA key, substitute accordingly.
+ Replace `id_ed25519.pub` with your filename. For example, use `id_rsa.pub` for RSA.
-1. Navigate to `https://gitlab.com` or your local GitLab instance URL and sign in.
-1. In the top-right corner, select your avatar.
-1. Select **Edit profile**.
-1. In the left sidebar, select **SSH Keys**.
-1. Paste the public key that you copied into the **Key** text box.
-1. Make sure your key includes a descriptive name in the **Title** text box, such as _Work Laptop_ or
+1. Sign in to GitLab.
+1. In the top right corner, select your avatar.
+1. Select **Settings**.
+1. From 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-ed25519` or `ssh-rsa`, and may end with a comment.
+1. In the **Title** text box, type a description, like _Work Laptop_ or
_Home Workstation_.
-1. Include an (optional) expiry date for the key under "Expires at" section. (Introduced in [GitLab 12.9](https://gitlab.com/gitlab-org/gitlab/-/issues/36243).)
-1. Click the **Add key** button.
-
-SSH keys that have "expired" using this procedure are valid in GitLab workflows.
-As the GitLab-configured expiration date is not included in the SSH key itself,
-you can still export public SSH keys as needed.
-
-NOTE:
-If you manually copied your public SSH key make sure you copied the entire
-key starting with `ssh-ed25519` (or `ssh-rsa`) and ending with your email address.
+1. Optional. In the **Expires at** box, select an expiration date. (Introduced in [GitLab 12.9](https://gitlab.com/gitlab-org/gitlab/-/issues/36243).)
+ The expiration date is informational only, and does not prevent you from using
+ the key. However, administrators can view expiration dates and
+ use them for guidance when [deleting keys](../user/admin_area/credentials_inventory.md#delete-a-users-ssh-key).
+1. Select **Add key**.
-## Two-factor Authentication (2FA)
+## Verify that you can connect
-You can set up two-factor authentication (2FA) for
-[Git over SSH](../security/two_factor_authentication.md#two-factor-authentication-2fa-for-git-over-ssh-operations).
+Verify that your SSH key was added correctly.
-## Testing that everything is set up 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:
-To test whether your SSH key was added correctly, run the following
-command in your terminal (replace `gitlab.com` with the domain of
-your GitLab instance):
-
-```shell
-ssh -T git@gitlab.com
-```
-
-The first time you connect to GitLab via SSH, you should verify the
-authenticity of the GitLab host that you're connecting to.
-For example, when connecting to GitLab.com, answer `yes` to add GitLab.com to
-the list of trusted hosts:
-
-```plaintext
-The authenticity of host 'gitlab.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.com' (ECDSA) to the list of known hosts.
-```
-
-NOTE:
-For GitLab.com, consult the
-[SSH host keys fingerprints](../user/gitlab_com/index.md#ssh-host-keys-fingerprints),
-section to make sure you're connecting to the correct server. For example, you can see
-the ECDSA key fingerprint shown above in the linked section.
-
-Once added to the list of known hosts, you should validate the
-authenticity of the GitLab host, once again. Run the above command
-again, and you should receive a _Welcome to GitLab, `@username`!_ message.
+ ```shell
+ ssh -T git@gitlab.example.com
+ ```
-If the welcome message doesn't appear, you can troubleshoot the problem by running `ssh`
-in verbose mode with the following command:
+1. If this is the first time you connect, you should verify the
+ authenticity of the GitLab host. If you see a message like:
-```shell
-ssh -Tvvv git@gitlab.com
-```
+ ```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.
+ ```
-## Working with non-default SSH key pair paths
+ Type `yes` and press Enter.
-If you used a non-default file path for your GitLab SSH key pair,
-configure your SSH client to point to your GitLab private SSH key.
+1. Run the `ssh -T git@gitlab.example.com` command again. You should receive a _Welcome to GitLab, `@username`!_ message.
-To make these changes, run the following commands:
+If the welcome message doesn't appear, you can troubleshoot by running `ssh`
+in verbose mode:
```shell
-eval $(ssh-agent -s)
-ssh-add <path to private SSH key>
-```
-
-Now save these settings to the `~/.ssh/config` file. Two examples
-for SSH keys dedicated to GitLab are shown here:
-
-```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
+ssh -Tvvv git@gitlab.example.com
```
-Public SSH keys need to be unique to GitLab, as they bind to your account.
-Your SSH key is the only identifier you have when pushing code via SSH,
-that's why it needs to uniquely map to a single user.
+## Use different keys for different repositories
-## Per-repository SSH keys
+You can use a different key for each repository.
-If you want to use different keys depending on the repository you are working
-on, you can issue the following command while inside your 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 does not use the SSH Agent and requires at least Git 2.10.
+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`.
-## Multiple accounts on a single GitLab instance
+## Use different accounts on a single GitLab instance
-The [per-repository](#per-repository-ssh-keys) method also works for using
-multiple accounts within 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.
-Alternatively, it is possible to directly assign aliases to hosts in
-`~.ssh/config`. SSH and, by extension, Git fails to log in if there is
-an `IdentityFile` set outside of a `Host` block in `.ssh/config`. This is
-due to how SSH assembles `IdentityFile` entries and is not changed by
-setting `IdentitiesOnly` to `yes`. `IdentityFile` entries should point to
-the private key of an SSH key pair.
+Instead, you can assign aliases to hosts in the `~.ssh/config` file.
-NOTE:
-Private and public keys should be readable by the user only. Accomplish this
-on Linux and macOS by running: `chmod 0400 ~/.ssh/<example_ssh_key>` and
-`chmod 0400 ~/.ssh/<example_sh_key.pub>`.
+- 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
@@ -316,59 +295,60 @@ Host <user_2.gitlab.com>
IdentityFile ~/.ssh/<example_ssh_key2>
```
-NOTE:
-The example `Host` aliases are defined as `user_1.gitlab.com` and
-`user_2.gitlab.com` for efficiency and transparency. Advanced configurations
-are more difficult to maintain; using this type of alias makes it easier to
-understand when using other tools such as `git remote` sub-commands. SSH
-would understand any string as a `Host` alias thus `Tanuki1` and `Tanuki2`,
-despite giving very little context as to where they point, would also work.
-
-Cloning the `gitlab` repository normally looks like this:
-
-```shell
-git clone git@gitlab.com:gitlab-org/gitlab.git
-```
-
-To clone it for `user_1`, replace `gitlab.com` with the SSH alias `user_1.gitlab.com`:
+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
```
-Fix a previously cloned repository using the `git remote` command.
-
-The example below assumes the remote repository is aliased as `origin`.
+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
```
-## Deploy keys
+NOTE:
+Private and public keys contain sensitive data. Ensure the permissions
+on the files make them readable to you but not accessible to others.
-Read the [documentation on deploy keys](../user/project/deploy_keys/index.md).
+## Configure two-factor authentication (2FA)
-## Applications
+You can set up two-factor authentication (2FA) for
+[Git over SSH](../security/two_factor_authentication.md#two-factor-authentication-2fa-for-git-over-ssh-operations).
-### Eclipse
+## 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).
-## SSH on the GitLab server
+## Use SSH on Microsoft Windows
+
+If you're running Windows 10, you can use the [Windows Subsystem for Linux (WSL)](https://docs.microsoft.com/en-us/windows/wsl/install-win10)
+with [WSL 2](https://docs.microsoft.com/en-us/windows/wsl/install-win10#update-to-wsl-2).
+You can use WSL to install Linux distributions, which include the Git and SSH clients.
-GitLab integrates with the system-installed SSH daemon, designating a user
+For other versions of Windows, you can install the Git and SSH clients by using
+[Git for Windows](https://gitforwindows.org).
+
+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
-connecting to the GitLab server over SSH are identified by their SSH key instead
+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. Although it is possible to modify the SSH configuration for this user to,
-e.g., provide a private SSH key to authenticate these requests by, this practice
+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.
-The GitLab check process includes a check for this condition, and directs you
-to this section if your server is configured like this, for example:
+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
@@ -383,30 +363,16 @@ Git user has default SSH configuration? ... no
Please fix the error above and rerun the checks.
```
-Remove the custom configuration as soon as you're able to. These customizations
-are *explicitly not supported* and may stop working at any time.
-
-### Options for Microsoft Windows
-
-If you're running Windows 10, the [Windows Subsystem for Linux (WSL)](https://docs.microsoft.com/en-us/windows/wsl/install-win10), and its latest [WSL 2](https://docs.microsoft.com/en-us/windows/wsl/install-win10#update-to-wsl-2) version,
-support the installation of different Linux distributions, which include the Git and SSH clients.
-
-For current versions of Windows, you can also install the Git and SSH clients with
-[Git for Windows](https://gitforwindows.org).
-
-Alternative tools include:
-
-- [Cygwin](https://www.cygwin.com)
-- [PuttyGen](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html)
+Remove the custom configuration as soon as you can. These customizations
+are **explicitly not supported** and may stop working at any time.
-## Troubleshooting
+## Troubleshooting SSH connections
-If on Git clone you are prompted for a password like `git@gitlab.com's password:`
-something is wrong with your SSH setup.
+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 manually registering your private SSH key using `ssh-agent` as documented
- earlier in this document
-- Try to debug the connection by running `ssh -Tv git@example.com`
- (replacing `example.com` with your GitLab domain)
+ 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.
diff --git a/doc/subscriptions/bronze_starter.md b/doc/subscriptions/bronze_starter.md
index 8b223953007..303f734bc24 100644
--- a/doc/subscriptions/bronze_starter.md
+++ b/doc/subscriptions/bronze_starter.md
@@ -20,15 +20,15 @@ the tiers are no longer mentioned in GitLab documentation:
[per-group charts](../user/project/milestones/index.md#group-burndown-charts)
- [Code owners](../user/project/code_owners.md)
- Description templates:
- - [Setting a default template for merge requests and issues](../user/project/description_templates.md#setting-a-default-template-for-merge-requests-and-issues)
+ - [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)
- Groups:
- - [Creating group memberships via CN](../user/group/index.md#creating-group-links-via-cn)
+ - [Creating group memberships via CN](../user/group/index.md#create-group-links-via-cn)
- [Group push rules](../user/group/index.md#group-push-rules)
- [Managing group memberships via LDAP](../user/group/index.md#manage-group-memberships-via-ldap)
- - [Member locking](../user/group/index.md#member-lock)
- - [Overriding user permissions](../user/group/index.md#overriding-user-permissions)
- - [User contribution analysis](../user/group/index.md#user-contribution-analysis)
+ - [Member locking](../user/group/index.md#prevent-members-from-being-added-to-a-group)
+ - [Overriding user permissions](../user/group/index.md#override-user-permissions)
+ - [User contribution analytics](../user/group/contribution_analytics/index.md)
- [Kerberos integration](../integration/kerberos.md)
- Issue Boards:
- [Configurable issue boards](../user/project/issue_board.md#configurable-issue-boards)
@@ -107,8 +107,7 @@ the tiers are no longer mentioned in GitLab documentation:
- Search:
- [Filtering merge requests by approvers](../user/search/index.md#filtering-merge-requests-by-approvers)
- [Filtering merge requests by "approved by"](../user/search/index.md#filtering-merge-requests-by-approved-by)
- - [Advanced Global Search (Elasticsearch)](../user/search/advanced_global_search.md)
- - [Advanced Search Syntax](../user/search/advanced_search_syntax.md)
+ - [Advanced Search (Elasticsearch)](../user/search/advanced_search.md)
- [Service Desk](../user/project/service_desk.md)
- [Storage usage statistics](../user/usage_quotas.md#storage-usage-statistics)
@@ -130,7 +129,7 @@ Bronze-level subscribers:
- [Group iterations API](../api/group_iterations.md)
- Project milestones API: [Get all burndown chart events for a single milestone](../api/milestones.md#get-all-burndown-chart-events-for-a-single-milestone)
- [Project iterations API](../api/iterations.md)
- - Fields in the [Search API](../api/search.md) available only to [Advanced Global Search (Elasticsearch)](../integration/elasticsearch.md) users
+ - Fields in the [Search API](../api/search.md) available only to [Advanced Search (Elasticsearch)](../integration/elasticsearch.md) users
- Fields in the [Merge requests API](../api/merge_requests.md) for [merge request approvals](../user/project/merge_requests/merge_request_approvals.md)
- Fields in the [Protected branches API](../api/protected_branches.md) that specify users or groups allowed to merge
- [Merge request approvals API](../api/merge_request_approvals.md)
diff --git a/doc/subscriptions/gitlab_com/index.md b/doc/subscriptions/gitlab_com/index.md
index b7a1243be72..17aa83d8765 100644
--- a/doc/subscriptions/gitlab_com/index.md
+++ b/doc/subscriptions/gitlab_com/index.md
@@ -37,7 +37,9 @@ Every occupied seat is counted in the subscription, with the following exception
NOTE:
To support the open source community and encourage the development of open
source projects, GitLab grants access to **Ultimate** features for all GitLab SaaS
-**public** projects, regardless of the subscription.
+**public** projects, regardless of the subscription. GitLab also provides qualifying
+open source projects with 50,000 CI minutes and free access to the Ultimate tier for
+groups through the [GitLab for Open Source program](https://about.gitlab.com/solutions/open-source/).
## Obtain a GitLab SaaS subscription
diff --git a/doc/topics/autodevops/customize.md b/doc/topics/autodevops/customize.md
index b7f2a0768ef..7dcecb9af1e 100644
--- a/doc/topics/autodevops/customize.md
+++ b/doc/topics/autodevops/customize.md
@@ -17,7 +17,7 @@ staging and canary deployments,
## Custom buildpacks
If the automatic buildpack detection fails for your project, or if you want to
-use a custom buildpack, you can override the buildpack using a project variable
+use a custom buildpack, you can override the buildpack using a project CI/CD variable
or a `.buildpacks` file in your project:
- **Project variable** - Create a project variable `BUILDPACK_URL` with the URL
@@ -43,7 +43,7 @@ can't use the `.buildpacks` file. The buildpack
in the backend to parse the `.buildpacks` file, does not provide the necessary commands
`bin/test-compile` and `bin/test`.
-If your goal is to use only a single custom buildpack, you should provide the project variable
+If your goal is to use only a single custom buildpack, you should provide the project CI/CD variable
`BUILDPACK_URL` instead.
## Custom `Dockerfile`
@@ -55,13 +55,13 @@ builds a Docker image based on the Dockerfile, rather than using buildpacks.
This can be much faster and result in smaller images, especially if your
Dockerfile is based on [Alpine](https://hub.docker.com/_/alpine/).
-If you set the `DOCKERFILE_PATH` CI variable, Auto Build looks for a Dockerfile there
+If you set the `DOCKERFILE_PATH` CI/CD variable, Auto Build looks for a Dockerfile there
instead.
## Passing arguments to `docker build`
Arguments can be passed to the `docker build` command using the
-`AUTO_DEVOPS_BUILD_IMAGE_EXTRA_ARGS` project variable. For example, to build a
+`AUTO_DEVOPS_BUILD_IMAGE_EXTRA_ARGS` project CI/CD variable. For example, to build a
Docker image based on based on the `ruby:alpine` instead of the default `ruby:latest`:
1. Set `AUTO_DEVOPS_BUILD_IMAGE_EXTRA_ARGS` to `--build-arg=RUBY_VERSION=alpine`.
@@ -93,12 +93,12 @@ You can extend and manage your Auto DevOps configuration with GitLab APIs:
- [Editing groups](../../api/groups.md#update-group).
- [Editing projects](../../api/projects.md#edit-project).
-## Forward CI variables to the build environment
+## Forward CI/CD variables to the build environment
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/25514) in GitLab 12.3, but available in versions 11.9 and above.
-CI variables can be forwarded into the build environment using the
-`AUTO_DEVOPS_BUILD_IMAGE_FORWARDED_CI_VARIABLES` CI variable.
+CI/CD variables can be forwarded into the build environment using the
+`AUTO_DEVOPS_BUILD_IMAGE_FORWARDED_CI_VARIABLES` CI/CD variable.
The forwarded variables should be specified by name in a comma-separated
list. For example, to forward the variables `CI_COMMIT_SHA` and
`CI_ENVIRONMENT_NAME`, set `AUTO_DEVOPS_BUILD_IMAGE_FORWARDED_CI_VARIABLES`
@@ -130,7 +130,7 @@ feature to use the `--secret` flag.
Auto DevOps uses [Helm](https://helm.sh/) to deploy your application to Kubernetes.
You can override the Helm chart used by bundling up a chart into your project
-repository or by specifying a project variable:
+repository or by specifying a project CI/CD variable:
- **Bundled chart** - If your project has a `./chart` directory with a `Chart.yaml`
file in it, Auto DevOps detects the chart and uses it instead of the
@@ -151,17 +151,17 @@ You can override the default values in the `values.yaml` file in the
- Adding a file named `.gitlab/auto-deploy-values.yaml` to your repository, which is
automatically used, if found.
- Adding a file with a different name or path to the repository, and setting the
- `HELM_UPGRADE_VALUES_FILE` [environment variable](#environment-variables) with
+ `HELM_UPGRADE_VALUES_FILE` [CI/CD variable](#cicd-variables) with
the path and name.
NOTE:
-For GitLab 12.5 and earlier, use the `HELM_UPGRADE_EXTRA_ARGS` environment variable
+For GitLab 12.5 and earlier, use the `HELM_UPGRADE_EXTRA_ARGS` variable
to override the default chart values by setting `HELM_UPGRADE_EXTRA_ARGS` to `--values <my-values.yaml>`.
## Customize the `helm upgrade` command
You can customize the `helm upgrade` command used in the [auto-deploy-image](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image)
-by passing options to the command with the `HELM_UPGRADE_EXTRA_ARGS` variable.
+by passing options to the command with the `HELM_UPGRADE_EXTRA_ARGS` CI/CD variable.
For example, set the value of `HELM_UPGRADE_EXTRA_ARGS` to `--no-hooks` to disable
pre-upgrade and post-upgrade hooks when the command is executed.
@@ -170,7 +170,7 @@ list of options.
## Custom Helm chart per environment
-You can specify the use of a custom Helm chart per environment by scoping the environment variable
+You can specify the use of a custom Helm chart per environment by scoping the CI/CD variable
to the desired environment. See [Limiting environment scopes of variables](../../ci/variables/README.md#limit-the-environment-scopes-of-cicd-variables).
## Customizing `.gitlab-ci.yml`
@@ -204,7 +204,7 @@ into your project and edit it as needed.
For clusters not managed by GitLab, you can customize the namespace in
`.gitlab-ci.yml` by specifying
-[`environment:kubernetes:namespace`](../../ci/environments/index.md#configuring-kubernetes-deployments).
+[`environment:kubernetes:namespace`](../../ci/environments/index.md#configure-kubernetes-deployments).
For example, the following configuration overrides the namespace used for
`production` deployments:
@@ -260,7 +260,7 @@ the [GitLab 12.10 based templates](https://gitlab.com/gitlab-org/auto-devops-v12
To support applications requiring a database,
[PostgreSQL](https://www.postgresql.org/) is provisioned by default. The credentials to access
the database are preconfigured, but can be customized by setting the associated
-[variables](#environment-variables). You can use these credentials to define a `DATABASE_URL`:
+[CI/CD variables](#cicd-variables). You can use these credentials to define a `DATABASE_URL`:
```yaml
postgres://user:password@postgres-host:postgres-port/postgres-database
@@ -269,7 +269,7 @@ postgres://user:password@postgres-host:postgres-port/postgres-database
### Upgrading PostgresSQL
WARNING:
-The variable `AUTO_DEVOPS_POSTGRES_CHANNEL` that controls default provisioned
+The CI/CD variable `AUTO_DEVOPS_POSTGRES_CHANNEL` that controls default provisioned
PostgreSQL was changed to `2` in [GitLab 13.0](https://gitlab.com/gitlab-org/gitlab/-/issues/210499).
To keep using the old PostgreSQL, set the `AUTO_DEVOPS_POSTGRES_CHANNEL` variable to
`1`.
@@ -290,17 +290,17 @@ production environments, for some use cases, it may not be sufficiently secure o
resilient, and you may want to use an external managed provider (such as
AWS Relational Database Service) for PostgreSQL.
-You must define environment-scoped variables for `POSTGRES_ENABLED` and
+You must define environment-scoped CI/CD variables for `POSTGRES_ENABLED` and
`DATABASE_URL` in your project's CI/CD settings:
1. Disable the built-in PostgreSQL installation for the required environments using
- scoped [environment variables](../../ci/environments/index.md#scoping-environments-with-specs).
+ environment-scoped [CI/CD variables](../../ci/environments/index.md#scoping-environments-with-specs).
For this use case, it's likely that only `production` must be added to this
list. The built-in PostgreSQL setup for Review Apps and staging is sufficient.
![Auto Metrics](img/disable_postgres.png)
-1. Define the `DATABASE_URL` CI variable as a scoped environment variable that is
+1. Define the `DATABASE_URL` variable as an environment-scoped variable that is
available to your application. This should be a URL in the following format:
```yaml
@@ -310,7 +310,7 @@ You must define environment-scoped variables for `POSTGRES_ENABLED` and
You must ensure that your Kubernetes cluster has network access to wherever
PostgreSQL is hosted.
-## Environment variables
+## CI/CD variables
The following variables can be used for setting up the Auto DevOps domain,
providing a custom Helm chart, or scaling your application. PostgreSQL can
@@ -318,10 +318,10 @@ also be customized, and you can use a [custom buildpack](#custom-buildpacks).
### Build and deployment
-The following table lists variables related to building and deploying
+The following table lists CI/CD variables related to building and deploying
applications.
-| **Variable** | **Description** |
+| **CI/CD Variable** | **Description** |
|-----------------------------------------|------------------------------------|
| `ADDITIONAL_HOSTS` | Fully qualified domain names specified as a comma-separated list that are added to the Ingress hosts. |
| `<ENVIRONMENT>_ADDITIONAL_HOSTS` | For a specific environment, the fully qualified domain names specified as a comma-separated list that are added to the Ingress hosts. This takes precedence over `ADDITIONAL_HOSTS`. |
@@ -329,7 +329,7 @@ applications.
| `AUTO_DEVOPS_BUILD_IMAGE_CNB_ENABLED` | When set to a non-empty value and no `Dockerfile` is present, Auto Build builds your application using Cloud Native Buildpacks instead of Herokuish. [More details](stages.md#auto-build-using-cloud-native-buildpacks-beta). |
| `AUTO_DEVOPS_BUILD_IMAGE_CNB_BUILDER` | The builder used when building with Cloud Native Buildpacks. The default builder is `heroku/buildpacks:18`. [More details](stages.md#auto-build-using-cloud-native-buildpacks-beta). |
| `AUTO_DEVOPS_BUILD_IMAGE_EXTRA_ARGS` | Extra arguments to be passed to the `docker build` command. Note that using quotes doesn't prevent word splitting. [More details](#passing-arguments-to-docker-build). |
-| `AUTO_DEVOPS_BUILD_IMAGE_FORWARDED_CI_VARIABLES` | A [comma-separated list of CI variable names](#forward-ci-variables-to-the-build-environment) to be forwarded to the build environment (the buildpack builder or `docker build`). |
+| `AUTO_DEVOPS_BUILD_IMAGE_FORWARDED_CI_VARIABLES` | A [comma-separated list of CI/CD variable names](#forward-cicd-variables-to-the-build-environment) to be forwarded to the build environment (the buildpack builder or `docker build`). |
| `AUTO_DEVOPS_CHART` | Helm Chart used to deploy your apps. Defaults to the one [provided by GitLab](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/tree/master/assets/auto-deploy-app). |
| `AUTO_DEVOPS_CHART_REPOSITORY` | Helm Chart repository used to search for charts. Defaults to `https://charts.gitlab.io`. |
| `AUTO_DEVOPS_CHART_REPOSITORY_NAME` | From GitLab 11.11, used to set the name of the Helm repository. Defaults to `gitlab`. |
@@ -367,9 +367,9 @@ Auto DevOps can undo your changes.
### Database
-The following table lists variables related to the database.
+The following table lists CI/CD variables related to the database.
-| **Variable** | **Description** |
+| **CI/CD Variable** | **Description** |
|-----------------------------------------|------------------------------------|
| `DB_INITIALIZE` | From GitLab 11.4, used to specify the command to run to initialize the application's PostgreSQL database. Runs inside the application pod. |
| `DB_MIGRATE` | From GitLab 11.4, used to specify the command to run to migrate the application's PostgreSQL database. Runs inside the application pod. |
@@ -383,7 +383,7 @@ The following table lists variables related to the database.
The following table lists variables used to disable jobs.
-| **Job Name** | **Variable** | **GitLab version** | **Description** |
+| **Job Name** | **CI/CDVariable** | **GitLab version** | **Description** |
|----------------------------------------|---------------------------------|-----------------------|-----------------|
| `.fuzz_base` | `COVFUZZ_DISABLED` | [From GitLab 13.2](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/34984) | [Read more](../../user/application_security/coverage_fuzzing/) about how `.fuzz_base` provide capability for your own jobs. If the variable is present, your jobs aren't created. |
| `apifuzzer_fuzz` | `API_FUZZING_DISABLED` | [From GitLab 13.3](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/39135) | If the variable is present, the job isn't created. |
@@ -433,7 +433,7 @@ The following table lists variables used to disable jobs.
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/49056) in GitLab 11.7.
Some applications need to define secret variables that are accessible by the deployed
-application. Auto DevOps detects variables starting with `K8S_SECRET_`, and makes
+application. Auto DevOps detects CI/CD variables starting with `K8S_SECRET_`, and makes
these prefixed variables available to the deployed application as environment variables.
To configure your application variables:
@@ -545,7 +545,7 @@ The normal behavior of Auto DevOps is to use continuous deployment, pushing
automatically to the `production` environment every time a new pipeline is run
on the default branch. However, there are cases where you might want to use a
staging environment, and deploy to production manually. For this scenario, the
-`STAGING_ENABLED` environment variable was introduced.
+`STAGING_ENABLED` CI/CD variable was introduced.
If you define `STAGING_ENABLED` with a non-empty value, then GitLab automatically deploys the application
to a `staging` environment, and creates a `production_manual` job for
@@ -584,7 +584,7 @@ are created:
1. `rollout 50%`
1. `rollout 100%`
-The percentage is based on the `REPLICAS` variable, and defines the number of
+The percentage is based on the `REPLICAS` CI/CD variable, and defines the number of
pods you want to have for your deployment. If the value is `10`, and you run the
`10%` rollout job, there is `1` new pod and `9` old ones.
@@ -593,7 +593,7 @@ required to go from `10%` to `100%`, you can jump to whatever job you want.
You can also scale down by running a lower percentage job, just before hitting
`100%`. Once you get to `100%`, you can't scale down, and you'd have to roll
back by redeploying the old version using the
-[rollback button](../../ci/environments/index.md#retrying-and-rolling-back) in the
+[rollback button](../../ci/environments/index.md#retry-or-roll-back-a-deployment) in the
environment page.
Below, you can see how the pipeline appears if the rollout or staging
@@ -616,8 +616,8 @@ With `INCREMENTAL_ROLLOUT_MODE` set to `manual` and with `STAGING_ENABLED`
![Rollout and staging enabled](img/rollout_staging_enabled.png)
WARNING:
-Before GitLab 11.4, the presence of the `INCREMENTAL_ROLLOUT_ENABLED` environment
-variable enabled this feature. This configuration is deprecated, and is scheduled to be
+Before GitLab 11.4, the presence of the `INCREMENTAL_ROLLOUT_ENABLED` CI/CD variable
+enabled this feature. This configuration is deprecated, and is scheduled to be
removed in the future.
### Timed incremental rollout to production **(PREMIUM)**
@@ -632,7 +632,7 @@ This configuration is based on
Everything behaves the same way, except:
-- To enable it, set the `INCREMENTAL_ROLLOUT_MODE` variable to `timed`.
+- To enable it, set the `INCREMENTAL_ROLLOUT_MODE` CI/CD variable to `timed`.
- Instead of the standard `production` job, the following jobs are created with
a 5 minute delay between each:
@@ -651,7 +651,7 @@ permissions on new projects when Auto DevOps is not enabled:
The banner can be disabled for:
- A user, when they dismiss it themselves.
-- A project, by explicitly [disabling Auto DevOps](index.md#enablingdisabling-auto-devops).
+- A project, by explicitly [disabling Auto DevOps](index.md#enable-or-disable-auto-devops).
- An entire GitLab instance:
- By an administrator running the following in a Rails console:
diff --git a/doc/topics/autodevops/img/alexj_autodevops_min_v13_8.png b/doc/topics/autodevops/img/alexj_autodevops_min_v13_8.png
deleted file mode 100644
index 7dc37737835..00000000000
--- a/doc/topics/autodevops/img/alexj_autodevops_min_v13_8.png
+++ /dev/null
Binary files differ
diff --git a/doc/topics/autodevops/img/kai_autodevops_min_v13_8.png b/doc/topics/autodevops/img/kai_autodevops_min_v13_8.png
deleted file mode 100644
index fa3ab4c1820..00000000000
--- a/doc/topics/autodevops/img/kai_autodevops_min_v13_8.png
+++ /dev/null
Binary files differ
diff --git a/doc/topics/autodevops/index.md b/doc/topics/autodevops/index.md
index d95e5568e0b..dbb63275a06 100644
--- a/doc/topics/autodevops/index.md
+++ b/doc/topics/autodevops/index.md
@@ -6,69 +6,134 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Auto DevOps **(FREE)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/37115) in GitLab 10.0.
-> - Generally available on GitLab 11.0.
-
-Auto DevOps are default CI/CD templates that auto-discover the source code you have. They
-enable GitLab to automatically detect, build, test, deploy, and monitor your applications.
-Leveraging [CI/CD best practices](../../ci/pipelines/pipeline_efficiency.md) and tools,
-Auto DevOps aims to simplify the setup and execution of a mature and modern software
-development lifecycle.
-
-## Overview
-
-You can spend a lot of effort to set up the workflow and processes required to
-build, deploy, and monitor your project. It gets worse when your company has
-hundreds, if not thousands, of projects to maintain. With new projects
-constantly starting up, the entire software development process becomes
-impossibly complex to manage.
-
-Auto DevOps provides you a seamless software development process by
-automatically detecting all dependencies and language technologies required to
-test, build, package, deploy, and monitor every project with minimal
-configuration. Automation enables consistency across your projects, seamless
-management of processes, and faster creation of new projects: push your code,
-and GitLab does the rest, improving your productivity and efficiency.
+> - Introduced in GitLab 11.0 for general availability.
+
+GitLab Auto DevOps helps to reduce the complexity of software delivery by
+setting up pipelines and integrations for you. Instead of requiring you to
+manually configure your entire GitLab environment, Auto DevOps configures
+many of these areas for you, including security auditing and vulnerability
+testing.
+
+Using Auto DevOps, you can:
+
+- Detect the language of your code.
+- Automatically build, test, and measure code quality.
+- Scan for potential vulnerabilities, security flaws, and licensing issues.
+- Monitor in real-time.
+- Deploy your application.
+
+The functionality of Auto DevOps is based on default CI/CD templates that
+auto-discover your source code. These templates enable GitLab to provide
+consistency across your projects, seamless management of processes, and faster
+creation of new projects. Leveraging [CI/CD best practices](../../ci/pipelines/pipeline_efficiency.md)
+and tools, Auto DevOps lets you push your code, with GitLab doing the rest,
+improving your productivity and efficiency.
<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
-For an introduction to Auto DevOps, watch [AutoDevOps in GitLab 11.0](https://youtu.be/0Tc0YYBxqi4).
+For an introduction to Auto DevOps, watch [AutoDevOps in GitLab 11.0](https://youtu.be/0Tc0YYBxqi4) or see this [overview](https://about.gitlab.com/stages-devops-lifecycle/auto-devops/).
For requirements, read [Requirements for Auto DevOps](requirements.md) for more information.
-For a developer's guide, read [Auto DevOps development guide](../../development/auto_devops.md).
+For GitLab contributors, see the [Auto DevOps development guide](../../development/auto_devops.md).
-### Share your feedback
+## Enable or disable Auto DevOps
-As Auto DevOps continues to gain popularity, and lowers the barrier to entry for
-getting started with DevOps and CI/CD, see what our wider community is saying:
+Auto DevOps is enabled by default for all projects in self-managed instances
+(as of [GitLab 11.3](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/41729)),
+but not for GitLab SaaS instances.
-From [AlexJonesax](https://twitter.com/AlexJonesax) and [KaiPMDH](https://twitter.com/KaiPMDH) on Twitter:
+When first using Auto DevOps, review the [requirements](requirements.md) to
+ensure all the necessary components to make full use of Auto DevOps are
+available. First-time users should follow the [quick start guide](quick_start_guide.md).
-![Alex on Twitter: Auto DevOps in GitLab doesn't just lower the bar to entry, it removes the bar and holds your hand.](img/alexj_autodevops_min_v13_8.png)
+Depending on your instance type, you can enable or disable Auto DevOps at the
+following levels:
-![Kai on Twitter: When I saw this on the Auto DevOps stuff, my mind was blown...](img/kai_autodevops_min_v13_8.png)
+| Instance type | [Project](#at-the-project-level) | [Group](#at-the-group-level) | [Instance](#at-the-instance-level) (Admin Area) |
+|---------------------|------------------------|------------------------|------------------------|
+| GitLab SaaS | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No |
+| GitLab self-managed | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes |
-We welcome everyone to [share your experience by tagging GitLab on Twitter](https://twitter.com/gitlab).
+When you enable AutoDevOps for your instance, it attempts to run on all
+pipelines in each project, but will automatically disable itself for individual
+projects on their first pipeline failure. An instance administrator can enable
+or disable this default in the [Auto DevOps settings](../../user/admin_area/settings/continuous_integration.md#auto-devops).
-## Enabled by default
+Since [GitLab 12.7](https://gitlab.com/gitlab-org/gitlab/-/issues/26655),
+Auto DevOps runs on pipelines automatically only if a [`Dockerfile` or matching buildpack](stages.md#auto-build)
+exists.
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/41729) in GitLab 11.3.
+If a [CI/CD configuration file](../../ci/yaml/README.md) is present in the
+project, it isn't changed and won't be affected by Auto DevOps.
-On self-managed instances, Auto DevOps is enabled by default for all projects.
-It attempts to run on all pipelines in each project. An instance administrator can
-enable or disable this default in the
-[Auto DevOps settings](../../user/admin_area/settings/continuous_integration.md#auto-devops).
-Auto DevOps automatically disables in individual projects on their first pipeline failure,
+### At the project level
-NOTE:
-Auto DevOps is not enabled by default on GitLab.com.
+When you enable Auto DevOps for a project, ensure that your project does not have a `.gitlab-ci.yml` present. If it exists, remove it before enabling Auto DevOps.
-Since [GitLab 12.7](https://gitlab.com/gitlab-org/gitlab/-/issues/26655), Auto DevOps
-runs on pipelines automatically only if a [`Dockerfile` or matching buildpack](stages.md#auto-build)
-exists.
+To enable it:
+
+1. Go to your project's **Settings > CI/CD > Auto DevOps**.
+1. Select the **Default to Auto DevOps pipeline** checkbox to enable it.
+1. (Optional, but recommended) When enabling, you can add in the
+ [base domain](#auto-devops-base-domain) Auto DevOps uses to
+ [deploy your application](stages.md#auto-deploy),
+ and choose the [deployment strategy](#deployment-strategy).
+1. Click **Save changes** for the changes to take effect.
+
+After enabling the feature, an Auto DevOps pipeline is triggered on the `master` branch.
+
+### At the group level
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/52447) in GitLab 11.10.
+
+Only administrators and group owners can enable or disable Auto DevOps at the group level.
+
+When enabling or disabling Auto DevOps at group level, group configuration is
+implicitly used for the subgroups and projects inside that group, unless Auto DevOps
+is specifically enabled or disabled on the subgroup or project.
+
+To enable or disable Auto DevOps at the group level:
+
+1. Go to your group's **Settings > CI/CD > Auto DevOps** page.
+1. Select the **Default to Auto DevOps pipeline** checkbox to enable it.
+1. Click **Save changes** for the changes to take effect.
+
+### At the instance level **(FREE SELF)**
+
+Even when disabled at the instance level, group owners and project maintainers
+can still enable Auto DevOps at the group and project level, respectively.
+
+1. As an administrator, go to **Admin Area > Settings > CI/CD > Continuous Integration and Deployment**.
+1. Select **Default to Auto DevOps pipeline for all projects** to enable it.
+1. (Optional) You can set up the Auto DevOps [base domain](#auto-devops-base-domain),
+ for Auto Deploy and Auto Review Apps to use.
+1. Click **Save changes** for the changes to take effect.
+
+### Deployment strategy
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/38542) in GitLab 11.0.
-If a [CI/CD configuration file](../../ci/yaml/README.md) is present in the project,
-it continues to be used, whether or not Auto DevOps is enabled.
+You can change the deployment strategy used by Auto DevOps by visiting your
+project's **Settings > CI/CD > Auto DevOps**. The following options
+are available:
+
+- **Continuous deployment to production**: Enables [Auto Deploy](stages.md#auto-deploy)
+ with `master` branch directly deployed to production.
+- **Continuous deployment to production using timed incremental rollout**: Sets the
+ [`INCREMENTAL_ROLLOUT_MODE`](customize.md#timed-incremental-rollout-to-production) variable
+ to `timed`. Production deployments execute with a 5 minute delay between
+ each increment in rollout.
+- **Automatic deployment to staging, manual deployment to production**: Sets the
+ [`STAGING_ENABLED`](customize.md#deploy-policy-for-staging-and-production-environments) and
+ [`INCREMENTAL_ROLLOUT_MODE`](customize.md#incremental-rollout-to-production) variables
+ to `1` and `manual`. This means:
+
+ - `master` branch is directly deployed to staging.
+ - Manual actions are provided for incremental rollout to production.
+
+NOTE:
+Use the [blue-green deployment](../../ci/environments/incremental_rollouts.md#blue-green-deployment) technique
+to minimize downtime and risk.
## Quick start
@@ -110,20 +175,20 @@ Depending on your target platform, some features might not be available to you.
Comprised of a set of [stages](stages.md), Auto DevOps brings these best practices to your
project in a simple and automatic way:
-1. [Auto Build](stages.md#auto-build)
-1. [Auto Test](stages.md#auto-test)
-1. [Auto Code Quality](stages.md#auto-code-quality)
-1. [Auto SAST (Static Application Security Testing)](stages.md#auto-sast)
-1. [Auto Secret Detection](stages.md#auto-secret-detection)
-1. [Auto Dependency Scanning](stages.md#auto-dependency-scanning) **(ULTIMATE)**
-1. [Auto License Compliance](stages.md#auto-license-compliance) **(ULTIMATE)**
-1. [Auto Container Scanning](stages.md#auto-container-scanning) **(ULTIMATE)**
-1. [Auto Review Apps](stages.md#auto-review-apps)
-1. [Auto DAST (Dynamic Application Security Testing)](stages.md#auto-dast) **(ULTIMATE)**
-1. [Auto Deploy](stages.md#auto-deploy)
-1. [Auto Browser Performance Testing](stages.md#auto-browser-performance-testing) **(PREMIUM)**
-1. [Auto Monitoring](stages.md#auto-monitoring)
-1. [Auto Code Intelligence](stages.md#auto-code-intelligence)
+- [Auto Browser Performance Testing](stages.md#auto-browser-performance-testing)
+- [Auto Build](stages.md#auto-build)
+- [Auto Code Intelligence](stages.md#auto-code-intelligence)
+- [Auto Code Quality](stages.md#auto-code-quality)
+- [Auto Container Scanning](stages.md#auto-container-scanning)
+- [Auto DAST (Dynamic Application Security Testing)](stages.md#auto-dast)
+- [Auto Dependency Scanning](stages.md#auto-dependency-scanning)
+- [Auto Deploy](stages.md#auto-deploy)
+- [Auto License Compliance](stages.md#auto-license-compliance)
+- [Auto Monitoring](stages.md#auto-monitoring)
+- [Auto Review Apps](stages.md#auto-review-apps)
+- [Auto SAST (Static Application Security Testing)](stages.md#auto-sast)
+- [Auto Secret Detection](stages.md#auto-secret-detection)
+- [Auto Test](stages.md#auto-test)
As Auto DevOps relies on many different components, you should have a basic
knowledge of the following:
@@ -162,7 +227,7 @@ any of the following places:
[groups](../../user/group/clusters/index.md#base-domain)
- or at the project level as a variable: `KUBE_INGRESS_BASE_DOMAIN`
- or at the group level as a variable: `KUBE_INGRESS_BASE_DOMAIN`
-- or as an instance-wide fallback in **Admin Area > Settings** under the
+- or as an instance-wide fallback in **Admin Area > Settings > CI/CD** under the
**Continuous Integration and Delivery** section
The base domain variable `KUBE_INGRESS_BASE_DOMAIN` follows the same order of precedence
@@ -193,83 +258,6 @@ to the Kubernetes pods running your application.
See [Auto DevOps requirements for Amazon ECS](requirements.md#auto-devops-requirements-for-amazon-ecs).
-## Enabling/Disabling Auto DevOps
-
-When first using Auto DevOps, review the [requirements](requirements.md) to ensure
-all the necessary components to make full use of Auto DevOps are available. First-time
-users should follow the [quick start guide](quick_start_guide.md).
-
-GitLab.com users can enable or disable Auto DevOps only at the project level.
-Self-managed users can enable or disable Auto DevOps at the project, group, or
-instance level.
-
-### At the project level
-
-If enabling, check that your project does not have a `.gitlab-ci.yml`, or if one exists, remove it.
-
-1. Go to your project's **Settings > CI/CD > Auto DevOps**.
-1. Select the **Default to Auto DevOps pipeline** checkbox to enable it.
-1. (Optional, but recommended) When enabling, you can add in the
- [base domain](#auto-devops-base-domain) Auto DevOps uses to
- [deploy your application](stages.md#auto-deploy),
- and choose the [deployment strategy](#deployment-strategy).
-1. Click **Save changes** for the changes to take effect.
-
-After enabling the feature, an Auto DevOps pipeline is triggered on the `master` branch.
-
-### At the group level
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/52447) in GitLab 11.10.
-
-Only administrators and group owners can enable or disable Auto DevOps at the group level.
-
-When enabling or disabling Auto DevOps at group level, group configuration is
-implicitly used for the subgroups and projects inside that group, unless Auto DevOps
-is specifically enabled or disabled on the subgroup or project.
-
-To enable or disable Auto DevOps at the group level:
-
-1. Go to your group's **Settings > CI/CD > Auto DevOps** page.
-1. Select the **Default to Auto DevOps pipeline** checkbox to enable it.
-1. Click **Save changes** for the changes to take effect.
-
-### At the instance level (Administrators only)
-
-Even when disabled at the instance level, group owners and project maintainers can still enable
-Auto DevOps at the group and project level, respectively.
-
-1. Go to **Admin Area > Settings > Continuous Integration and Deployment**.
-1. Select **Default to Auto DevOps pipeline for all projects** to enable it.
-1. (Optional) You can set up the Auto DevOps [base domain](#auto-devops-base-domain),
- for Auto Deploy and Auto Review Apps to use.
-1. Click **Save changes** for the changes to take effect.
-
-### Deployment strategy
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/38542) in GitLab 11.0.
-
-You can change the deployment strategy used by Auto DevOps by visiting your
-project's **Settings > CI/CD > Auto DevOps**. The following options
-are available:
-
-- **Continuous deployment to production**: Enables [Auto Deploy](stages.md#auto-deploy)
- with `master` branch directly deployed to production.
-- **Continuous deployment to production using timed incremental rollout**: Sets the
- [`INCREMENTAL_ROLLOUT_MODE`](customize.md#timed-incremental-rollout-to-production) variable
- to `timed`. Production deployments execute with a 5 minute delay between
- each increment in rollout.
-- **Automatic deployment to staging, manual deployment to production**: Sets the
- [`STAGING_ENABLED`](customize.md#deploy-policy-for-staging-and-production-environments) and
- [`INCREMENTAL_ROLLOUT_MODE`](customize.md#incremental-rollout-to-production) variables
- to `1` and `manual`. This means:
-
- - `master` branch is directly deployed to staging.
- - Manual actions are provided for incremental rollout to production.
-
-NOTE:
-Use the [blue-green deployment](../../ci/environments/incremental_rollouts.md#blue-green-deployment) technique
-to minimize downtime and risk.
-
## Using multiple Kubernetes clusters
When using Auto DevOps, you can deploy different environments to
@@ -333,7 +321,7 @@ simplify configuration and prevent any unforeseen issues.
The GitLab integration with Helm does not support installing applications when
behind a proxy. Users who want to do so must inject their proxy settings
into the installation pods at runtime, such as by using a
-[`PodPreset`](https://kubernetes.io/docs/concepts/workloads/pods/podpreset/):
+[`PodPreset`](https://v1-19.docs.kubernetes.io/docs/concepts/workloads/pods/podpreset/):
```yaml
apiVersion: settings.k8s.io/v1alpha1
@@ -349,245 +337,5 @@ spec:
value: "PUT_YOUR_HTTPS_PROXY_HERE"
```
-## Troubleshooting
-
-### Unable to select a buildpack
-
-Auto Build and Auto Test may fail to detect your language or framework with the
-following error:
-
-```plaintext
-Step 5/11 : RUN /bin/herokuish buildpack build
- ---> Running in eb468cd46085
- -----> Unable to select a buildpack
-The command '/bin/sh -c /bin/herokuish buildpack build' returned a non-zero code: 1
-```
-
-The following are possible reasons:
-
-- Your application may be missing the key files the buildpack is looking for.
- Ruby applications require a `Gemfile` to be properly detected,
- even though it's possible to write a Ruby app without a `Gemfile`.
-- No buildpack may exist for your application. Try specifying a
- [custom buildpack](customize.md#custom-buildpacks).
-
-### Pipeline that extends Auto DevOps with only / except fails
-
-If your pipeline fails with the following message:
-
-```plaintext
-Found errors in your .gitlab-ci.yml:
-
- jobs:test config key may not be used with `rules`: only
-```
-
-This error appears when the included job’s rules configuration has been overridden with the `only` or `except` syntax.
-To fix this issue, you must either:
-
-- Transition your `only/except` syntax to rules.
-- (Temporarily) Pin your templates to the [GitLab 12.10 based templates](https://gitlab.com/gitlab-org/auto-devops-v12-10).
-
-### Failure to create a Kubernetes namespace
-
-Auto Deploy fails if GitLab can't create a Kubernetes namespace and
-service account for your project. For help debugging this issue, see
-[Troubleshooting failed deployment jobs](../../user/project/clusters/index.md#troubleshooting).
-
-### Detected an existing PostgreSQL database
-
-After upgrading to GitLab 13.0, you may encounter this message when deploying
-with Auto DevOps:
-
-```plaintext
-Detected an existing PostgreSQL database installed on the
-deprecated channel 1, but the current channel is set to 2. The default
-channel changed to 2 in of GitLab 13.0.
-[...]
-```
-
-Auto DevOps, by default, installs an in-cluster PostgreSQL database alongside
-your application. The default installation method changed in GitLab 13.0, and
-upgrading existing databases requires user involvement. The two installation
-methods are:
-
-- **channel 1 (deprecated):** Pulls in the database as a dependency of the associated
- Helm chart. Only supports Kubernetes versions up to version 1.15.
-- **channel 2 (current):** Installs the database as an independent Helm chart. Required
- for using the in-cluster database feature with Kubernetes versions 1.16 and greater.
-
-If you receive this error, you can do one of the following actions:
-
-- You can *safely* ignore the warning and continue using the channel 1 PostgreSQL
- database by setting `AUTO_DEVOPS_POSTGRES_CHANNEL` to `1` and redeploying.
-
-- You can delete the channel 1 PostgreSQL database and install a fresh channel 2
- database by setting `AUTO_DEVOPS_POSTGRES_DELETE_V1` to a non-empty value and
- redeploying.
-
- WARNING:
- Deleting the channel 1 PostgreSQL database permanently deletes the existing
- channel 1 database and all its data. See
- [Upgrading PostgreSQL](upgrading_postgresql.md)
- for more information on backing up and upgrading your database.
-
-- If you are not using the in-cluster database, you can set
- `POSTGRES_ENABLED` to `false` and re-deploy. This option is especially relevant to
- users of *custom charts without the in-chart PostgreSQL dependency*.
- Database auto-detection is based on the `postgresql.enabled` Helm value for
- your release. This value is set based on the `POSTGRES_ENABLED` CI variable
- and persisted by Helm, regardless of whether or not your chart uses the
- variable.
-
-WARNING:
-Setting `POSTGRES_ENABLED` to `false` permanently deletes any existing
-channel 1 database for your environment.
-
-### Error: unable to recognize "": no matches for kind "Deployment" in version "extensions/v1beta1"
-
-After upgrading your Kubernetes cluster to [v1.16+](stages.md#kubernetes-116),
-you may encounter this message when deploying with Auto DevOps:
-
-```plaintext
-UPGRADE FAILED
-Error: failed decoding reader into objects: unable to recognize "": no matches for kind "Deployment" in version "extensions/v1beta1"
-```
-
-This can occur if your current deployments on the environment namespace were deployed with a
-deprecated/removed API that doesn't exist in Kubernetes v1.16+. For example,
-if [your in-cluster PostgreSQL was installed in a legacy way](#detected-an-existing-postgresql-database),
-the resource was created via the `extensions/v1beta1` API. However, the deployment resource
-was moved to the `app/v1` API in v1.16.
-
-To recover such outdated resources, you must convert the current deployments by mapping legacy APIs
-to newer APIs. There is a helper tool called [`mapkubeapis`](https://github.com/hickeyma/helm-mapkubeapis)
-that works for this problem. Follow these steps to use the tool in Auto DevOps:
-
-1. Modify your `.gitlab-ci.yml` with:
-
- ```yaml
- include:
- - template: Auto-DevOps.gitlab-ci.yml
- - remote: https://gitlab.com/shinya.maeda/ci-templates/-/raw/master/map-deprecated-api.gitlab-ci.yml
-
- variables:
- HELM_VERSION_FOR_MAPKUBEAPIS: "v2" # If you're using auto-depoy-image v2 or above, please specify "v3".
- ```
-
-1. Run the job `<environment-name>:map-deprecated-api`. Ensure that this job succeeds before moving
- to the next step. You should see something like the following output:
-
- ```shell
- 2020/10/06 07:20:49 Found deprecated or removed Kubernetes API:
- "apiVersion: extensions/v1beta1
- kind: Deployment"
- Supported API equivalent:
- "apiVersion: apps/v1
- kind: Deployment"
- ```
-
-1. Revert your `.gitlab-ci.yml` to the previous version. You no longer need to include the
- supplemental template `map-deprecated-api`.
-
-1. Continue the deployments as usual.
-
-### Error: error initializing: Looks like "https://kubernetes-charts.storage.googleapis.com" is not a valid chart repository or cannot be reached
-
-As [announced in the official CNCF blog post](https://www.cncf.io/blog/2020/10/07/important-reminder-for-all-helm-users-stable-incubator-repos-are-deprecated-and-all-images-are-changing-location/),
-the stable Helm chart repository was deprecated and removed on November 13th, 2020.
-You may encounter this error after that date.
-
-Some GitLab features had dependencies on the stable chart. To mitigate the impact, we changed them
-to use new official repositories or the [Helm Stable Archive repository maintained by GitLab](https://gitlab.com/gitlab-org/cluster-integration/helm-stable-archive).
-Auto Deploy contains [an example fix](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/merge_requests/127).
-
-In Auto Deploy, `v1.0.6+` of `auto-deploy-image` no longer adds the deprecated stable repository to
-the `helm` command. If you use a custom chart and it relies on the deprecated stable repository,
-specify an older `auto-deploy-image` like this example:
-
-```yaml
-include:
- - template: Auto-DevOps.gitlab-ci.yml
-
-.auto-deploy:
- image: "registry.gitlab.com/gitlab-org/cluster-integration/auto-deploy-image:v1.0.5"
-```
-
-Keep in mind that this approach stops working when the stable repository is removed,
-so you must eventually fix your custom chart.
-
-To fix your custom chart:
-
-1. In your chart directory, update the `repository` value in your `requirements.yaml` file from :
-
- ```yaml
- repository: "https://kubernetes-charts.storage.googleapis.com/"
- ```
-
- to:
-
- ```yaml
- repository: "https://charts.helm.sh/stable"
- ```
-
-1. In your chart directory, run `helm dep update .` using the same Helm major version as Auto DevOps.
-1. Commit the changes for the `requirements.yaml` file.
-1. If you previously had a `requirements.lock` file, commit the changes to the file.
- If you did not previously have a `requirements.lock` file in your chart,
- you do not need to commit the new one. This file is optional, but when present,
- it's used to verify the integrity of the downloaded dependencies.
-
-You can find more information in
-[issue #263778, "Migrate PostgreSQL from stable Helm repository"](https://gitlab.com/gitlab-org/gitlab/-/issues/263778).
-
-### Error: release .... failed: timed out waiting for the condition
-
-When getting started with Auto DevOps, you may encounter this error when first
-deploying your application:
-
-```plaintext
-INSTALL FAILED
-PURGING CHART
-Error: release staging failed: timed out waiting for the condition
-```
-
-This is most likely caused by a failed liveness (or readiness) probe attempted
-during the deployment process. By default, these probes are run against the root
-page of the deployed application on port 5000. If your application isn't configured
-to serve anything at the root page, or is configured to run on a specific port
-*other* than 5000, this check fails.
-
-If it fails, you should see these failures in the events for the relevant
-Kubernetes namespace. These events look like the following example:
-
-```plaintext
-LAST SEEN TYPE REASON OBJECT MESSAGE
-3m20s Warning Unhealthy pod/staging-85db88dcb6-rxd6g Readiness probe failed: Get http://10.192.0.6:5000/: dial tcp 10.192.0.6:5000: connect: connection refused
-3m32s Warning Unhealthy pod/staging-85db88dcb6-rxd6g Liveness probe failed: Get http://10.192.0.6:5000/: dial tcp 10.192.0.6:5000: connect: connection refused
-```
-
-To change the port used for the liveness checks, pass
-[custom values to the Helm chart](customize.md#customize-values-for-helm-chart)
-used by Auto DevOps:
-
-1. Create a directory and file at the root of your repository named `.gitlab/auto-deploy-values.yaml`.
-
-1. Populate the file with the following content, replacing the port values with
- the actual port number your application is configured to use:
-
- ```yaml
- service:
- internalPort: <port_value>
- externalPort: <port_value>
- ```
-
-1. Commit your changes.
-
-After committing your changes, subsequent probes should use the newly-defined ports.
-The page that's probed can also be changed by overriding the `livenessProbe.path`
-and `readinessProbe.path` values (shown in the
-[default `values.yaml`](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/blob/master/assets/auto-deploy-app/values.yaml)
-file) in the same fashion.
-
-## Development guides
-
-[Development guide for Auto DevOps](../../development/auto_devops.md)
+<!-- DO NOT ADD TROUBLESHOOTING INFO HERE -->
+<!-- Troubleshooting information has moved to troubleshooting.md -->
diff --git a/doc/topics/autodevops/quick_start_guide.md b/doc/topics/autodevops/quick_start_guide.md
index cd951e53bd1..631180f696c 100644
--- a/doc/topics/autodevops/quick_start_guide.md
+++ b/doc/topics/autodevops/quick_start_guide.md
@@ -222,7 +222,7 @@ you to common environment tasks:
- **Terminal** (**{terminal}**) - Opens a [web terminal](../../ci/environments/index.md#web-terminals)
session inside the container where the application is running
- **Re-deploy to environment** (**{repeat}**) - For more information, see
- [Retrying and rolling back](../../ci/environments/index.md#retrying-and-rolling-back)
+ [Retrying and rolling back](../../ci/environments/index.md#retry-or-roll-back-a-deployment)
- **Stop environment** (**{stop}**) - For more information, see
[Stopping an environment](../../ci/environments/index.md#stopping-an-environment)
@@ -234,8 +234,8 @@ takes you to the pod's logs page.
NOTE:
The example shows only one pod hosting the application at the moment, but you can add
-more pods by defining the [`REPLICAS` variable](customize.md#environment-variables)
-in **Settings > CI/CD > Environment variables**.
+more pods by defining the [`REPLICAS` CI/CD variable](customize.md#cicd-variables)
+in **Settings > CI/CD > Variables**.
### Work with branches
@@ -307,7 +307,7 @@ and customized to fit your workflow. Here are some helpful resources for further
1. [Auto DevOps](index.md)
1. [Multiple Kubernetes clusters](index.md#using-multiple-kubernetes-clusters)
1. [Incremental rollout to production](customize.md#incremental-rollout-to-production) **(PREMIUM)**
-1. [Disable jobs you don't need with environment variables](customize.md#environment-variables)
+1. [Disable jobs you don't need with CI/CD variables](customize.md#cicd-variables)
1. [Use a static IP for your cluster](../../user/clusters/applications.md#using-a-static-ip)
1. [Use your own buildpacks to build your application](customize.md#custom-buildpacks)
1. [Prometheus monitoring](../../user/project/integrations/prometheus.md)
diff --git a/doc/topics/autodevops/requirements.md b/doc/topics/autodevops/requirements.md
index 930938b7571..d536282cca4 100644
--- a/doc/topics/autodevops/requirements.md
+++ b/doc/topics/autodevops/requirements.md
@@ -101,7 +101,7 @@ If you don't have Kubernetes or Prometheus installed, then
[Auto Deploy](stages.md#auto-deploy), and [Auto Monitoring](stages.md#auto-monitoring)
are skipped.
-After all requirements are met, you can [enable Auto DevOps](index.md#enablingdisabling-auto-devops).
+After all requirements are met, you can [enable Auto DevOps](index.md#enable-or-disable-auto-devops).
## Auto DevOps requirements for Amazon ECS
@@ -109,10 +109,10 @@ After all requirements are met, you can [enable Auto DevOps](index.md#enablingdi
You can choose to target [AWS ECS](../../ci/cloud_deployment/index.md) as a deployment platform instead of using Kubernetes.
-To get started on Auto DevOps to AWS ECS, you must add a specific Environment
-Variable. To do so, follow these steps:
+To get started on Auto DevOps to AWS ECS, you must add a specific CI/CD variable.
+To do so, follow these steps:
-1. In your project, go to **Settings > CI / CD** and expand the **Variables**
+1. In your project, go to **Settings > CI/CD** and expand the **Variables**
section.
1. Specify which AWS platform to target during the Auto DevOps deployment
@@ -121,7 +121,7 @@ Variable. To do so, follow these steps:
- `ECS` if you're not enforcing any launch type check when deploying to ECS.
When you trigger a pipeline, if you have Auto DevOps enabled and if you have correctly
-[entered AWS credentials as environment variables](../../ci/cloud_deployment/index.md#deploy-your-application-to-the-aws-elastic-container-service-ecs),
+[entered AWS credentials as variables](../../ci/cloud_deployment/index.md#deploy-your-application-to-the-aws-elastic-container-service-ecs),
your application is deployed to AWS ECS.
[GitLab Managed Apps](../../user/clusters/applications.md) are not available when deploying to AWS ECS.
@@ -145,7 +145,7 @@ own pipeline, as the override stops working when the name changes.
You can target [AWS EC2](../../ci/cloud_deployment/index.md)
as a deployment platform instead of Kubernetes. To use Auto DevOps with AWS EC2, you must add a
-specific environment variable.
+specific CI/CD variable.
For more details, see [Custom build job for Auto DevOps](../../ci/cloud_deployment/index.md#custom-build-job-for-auto-devops)
for deployments to AWS EC2.
diff --git a/doc/topics/autodevops/stages.md b/doc/topics/autodevops/stages.md
index f1244a1ad1b..913c221d8ec 100644
--- a/doc/topics/autodevops/stages.md
+++ b/doc/topics/autodevops/stages.md
@@ -53,7 +53,7 @@ For the requirements of other languages and frameworks, read the
NOTE:
If Auto Build fails despite the project meeting the buildpack requirements, set
-a project variable `TRACE=true` to enable verbose logging, which may help you
+a project CI/CD variable `TRACE=true` to enable verbose logging, which may help you
troubleshoot.
### Auto Build using Cloud Native Buildpacks (beta)
@@ -62,9 +62,9 @@ troubleshoot.
Auto Build supports building your application using [Cloud Native Buildpacks](https://buildpacks.io)
through the [`pack` command](https://github.com/buildpacks/pack). To use Cloud Native Buildpacks,
-set the CI variable `AUTO_DEVOPS_BUILD_IMAGE_CNB_ENABLED` to a non-empty
+set the CI/CD variable `AUTO_DEVOPS_BUILD_IMAGE_CNB_ENABLED` to a non-empty
value. The default builder is `heroku/buildpacks:18` but a different builder
-can be selected using the CI variable `AUTO_DEVOPS_BUILD_IMAGE_CNB_BUILDER`.
+can be selected using the CI/CD variable `AUTO_DEVOPS_BUILD_IMAGE_CNB_BUILDER`.
Cloud Native Buildpacks (CNBs) are an evolution of Heroku buildpacks, and
GitLab expects them to eventually supersede Herokuish-based builds within Auto DevOps. For more
@@ -103,7 +103,9 @@ NOTE:
Not all buildpacks supported by [Auto Build](#auto-build) are supported by Auto Test.
Auto Test uses [Herokuish](https://gitlab.com/gitlab-org/gitlab/-/issues/212689), *not*
Cloud Native Buildpacks, and only buildpacks that implement the
+<!-- vale gitlab.Spelling = NO -->
[Testpack API](https://devcenter.heroku.com/articles/testpack-api) are supported.
+<!-- vale gitlab.Spelling = YES -->
### Currently supported languages
@@ -284,7 +286,7 @@ see the documentation.
### Overriding the DAST target
To use a custom target instead of the auto-deployed review apps,
-set a `DAST_WEBSITE` environment variable to the URL for DAST to scan.
+set a `DAST_WEBSITE` CI/CD variable to the URL for DAST to scan.
WARNING:
If [DAST Full Scan](../../user/application_security/dast/index.md#full-scan) is
@@ -297,10 +299,10 @@ data loss or corruption.
You can disable DAST:
-- On all branches by setting the `DAST_DISABLED` environment variable to `"true"`.
+- On all branches by setting the `DAST_DISABLED` CI/CD variable to `"true"`.
- Only on the default branch by setting the `DAST_DISABLED_FOR_DEFAULT_BRANCH`
- environment variable to `"true"`.
-- Only on feature branches by setting `REVIEW_DISABLED` environment variable to
+ variable to `"true"`.
+- Only on feature branches by setting `REVIEW_DISABLED` variable to
`"true"`. This also disables the Review App.
## Auto Browser Performance Testing **(PREMIUM)**
@@ -336,15 +338,16 @@ uploads the report as an artifact.
Some initial setup is required. A [k6](https://k6.io/) test needs to be
written that's tailored to your specific application. The test also needs to be
-configured so it can pick up the environment's dynamic URL via an environment variable.
+configured so it can pick up the environment's dynamic URL via a CI/CD variable.
Any load performance test result differences between the source and target branches are also
[shown in the merge request widget](../../user/project/merge_requests/load_performance_testing.md).
## Auto Deploy
-This is an optional step, since many projects don't have a Kubernetes cluster
-available. If the [requirements](requirements.md) are not met, the job is skipped.
+[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/216008) in GitLab 13.6, you have the choice to deploy to [Amazon Elastic Compute Cloud (Amazon EC2)](https://aws.amazon.com/ec2/) in addition to a Kubernetes cluster.
+
+Auto Deploy is an optional step for Auto DevOps. If the [requirements](requirements.md) are not met, the job is skipped.
After a branch or merge request is merged into the project's default branch (usually
`master`), Auto Deploy deploys the application to a `production` environment in
@@ -356,7 +359,7 @@ default, but the
[Auto DevOps template](https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml)
contains job definitions for these tasks if you want to enable them.
-You can use [environment variables](customize.md#environment-variables) to automatically
+You can use [CI/CD variables](customize.md#cicd-variables) to automatically
scale your pod replicas, and to apply custom arguments to the Auto DevOps `helm upgrade`
commands. This is an easy way to
[customize the Auto Deploy Helm chart](customize.md#custom-helm-chart).
@@ -440,7 +443,7 @@ On GitLab 12.9 and 12.10, opting into
`AUTO_DEVOPS_POSTGRES_CHANNEL` version `2` deletes the version `1` PostgreSQL
database. Follow the [guide to upgrading PostgreSQL](upgrading_postgresql.md)
to back up and restore your database before opting into version `2` (On
-GitLab 13.0, an additional variable is required to trigger the database
+GitLab 13.0, an additional CI/CD variable is required to trigger the database
deletion).
### Migrations
@@ -448,7 +451,7 @@ deletion).
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/21955) in GitLab 11.4
You can configure database initialization and migrations for PostgreSQL to run
-within the application pod by setting the project variables `DB_INITIALIZE` and
+within the application pod by setting the project CI/CD variables `DB_INITIALIZE` and
`DB_MIGRATE` respectively.
If present, `DB_INITIALIZE` is run as a shell command within an application pod
@@ -500,7 +503,7 @@ access to a Redis instance. Auto DevOps doesn't deploy this instance for you, so
you must:
- Maintain your own Redis instance.
-- Set a CI variable `K8S_SECRET_REDIS_URL`, which is the URL of this instance,
+- Set a CI/CD variable `K8S_SECRET_REDIS_URL`, which is the URL of this instance,
to ensure it's passed into your deployments.
After configuring your worker to respond to health checks, run a Sidekiq
@@ -527,7 +530,8 @@ workers:
### Network Policy
-> [Introduced](https://gitlab.com/gitlab-org/charts/auto-deploy-app/-/merge_requests/30) in GitLab 12.7.
+- [Introduced](https://gitlab.com/gitlab-org/charts/auto-deploy-app/-/merge_requests/30) in GitLab 12.7.
+- [Deprecated](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/merge_requests/184) in GitLab 13.9.
By default, all Kubernetes pods are
[non-isolated](https://kubernetes.io/docs/concepts/services-networking/network-policies/#isolated-and-non-isolated-pods),
@@ -578,6 +582,76 @@ networkPolicy:
For more information on installing Network Policies, see
[Install Cilium using GitLab CI/CD](../../user/clusters/applications.md#install-cilium-using-gitlab-cicd).
+### Cilium Network Policy
+
+> [Introduced](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/merge_requests/184) in GitLab 13.9.
+
+By default, all Kubernetes pods are
+[non-isolated](https://kubernetes.io/docs/concepts/services-networking/network-policies/#isolated-and-non-isolated-pods),
+and accept traffic to and from any source. You can use
+[CiliumNetworkPolicy](https://docs.cilium.io/en/v1.8/concepts/kubernetes/policy/#ciliumnetworkpolicy)
+to restrict connections to and from selected pods, namespaces, and the internet.
+
+#### Requirements
+
+As the default network plugin for Kubernetes (`kubenet`)
+[does not implement](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/#kubenet)
+support for it, you must have [Cilium](https://docs.cilium.io/en/v1.8/intro/) as your Kubernetes network plugin.
+
+The [Cilium](https://cilium.io/) network plugin can be
+installed as a [cluster application](../../user/clusters/applications.md#install-cilium-using-gitlab-cicd)
+to enable support for network policies.
+
+#### Configuration
+
+You can enable deployment of a network policy by setting the following
+in the `.gitlab/auto-deploy-values.yaml` file:
+
+```yaml
+ciliumNetworkPolicy:
+ enabled: true
+```
+
+The default policy deployed by the Auto Deploy pipeline allows
+traffic within a local namespace, and from the `gitlab-managed-apps`
+namespace. All other inbound connections are blocked. Outbound
+traffic (for example, to the internet) is not affected by the default policy.
+
+You can also provide a custom [policy specification](https://docs.cilium.io/en/v1.8/policy/language/#simple-ingress-allow)
+in the `.gitlab/auto-deploy-values.yaml` file, for example:
+
+```yaml
+ciliumNetworkPolicy:
+ enabled: true
+ spec:
+ endpointSelector:
+ matchLabels:
+ app.gitlab.com/env: staging
+ ingress:
+ - fromEndpoints:
+ - matchLabels:
+ app.gitlab.com/managed_by: gitlab
+```
+
+#### Enabling Alerts
+
+You can also enable alerts. Network policies with alerts are considered only if
+[GitLab Kubernetes Agent](../../user/clusters/agent/index.md)
+has been integrated.
+
+You can enable alerts as follows:
+
+```yaml
+ciliumNetworkPolicy:
+ enabled: true
+ alerts:
+ enabled: true
+
+```
+
+For more information on installing Network Policies, see
+[Install Cilium using GitLab CI/CD](../../user/clusters/applications.md#install-cilium-using-gitlab-cicd).
+
### Web Application Firewall (ModSecurity) customization
> [Introduced](https://gitlab.com/gitlab-org/charts/auto-deploy-app/-/merge_requests/44) in GitLab 12.8.
@@ -664,7 +738,7 @@ GitLab provides some initial alerts for you after you install Prometheus:
To use Auto Monitoring:
1. [Install and configure the Auto DevOps requirements](requirements.md).
-1. [Enable Auto DevOps](index.md#enablingdisabling-auto-devops), if you haven't done already.
+1. [Enable Auto DevOps](index.md#enable-or-disable-auto-devops), if you haven't done already.
1. Navigate to your project's **{rocket}** **CI/CD > Pipelines** and click **Run Pipeline**.
1. After the pipeline finishes successfully, open the
[monitoring dashboard for a deployed environment](../../ci/environments/index.md#monitoring-environments)
@@ -686,5 +760,5 @@ You can follow the [code intelligence epic](https://gitlab.com/groups/gitlab-org
for updates.
This stage is enabled by default. You can disable it by adding the
-`CODE_INTELLIGENCE_DISABLED` environment variable. Read more about
+`CODE_INTELLIGENCE_DISABLED` CI/CD variable. Read more about
[disabling Auto DevOps jobs](../../topics/autodevops/customize.md#disable-jobs).
diff --git a/doc/topics/autodevops/troubleshooting.md b/doc/topics/autodevops/troubleshooting.md
new file mode 100644
index 00000000000..ed75dd4e262
--- /dev/null
+++ b/doc/topics/autodevops/troubleshooting.md
@@ -0,0 +1,247 @@
+---
+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
+---
+
+# Troubleshooting Auto DevOps **(FREE)**
+
+The information in this documentation page describes common errors when using
+Auto DevOps, and any available workarounds.
+
+## Unable to select a buildpack
+
+Auto Build and Auto Test may fail to detect your language or framework with the
+following error:
+
+```plaintext
+Step 5/11 : RUN /bin/herokuish buildpack build
+ ---> Running in eb468cd46085
+ -----> Unable to select a buildpack
+The command '/bin/sh -c /bin/herokuish buildpack build' returned a non-zero code: 1
+```
+
+The following are possible reasons:
+
+- Your application may be missing the key files the buildpack is looking for.
+ Ruby applications require a `Gemfile` to be properly detected,
+ even though it's possible to write a Ruby app without a `Gemfile`.
+- No buildpack may exist for your application. Try specifying a
+ [custom buildpack](customize.md#custom-buildpacks).
+
+## Pipeline that extends Auto DevOps with only / except fails
+
+If your pipeline fails with the following message:
+
+```plaintext
+Found errors in your .gitlab-ci.yml:
+
+ jobs:test config key may not be used with `rules`: only
+```
+
+This error appears when the included job’s rules configuration has been overridden with the `only` or `except` syntax.
+To fix this issue, you must either:
+
+- Transition your `only/except` syntax to rules.
+- (Temporarily) Pin your templates to the [GitLab 12.10 based templates](https://gitlab.com/gitlab-org/auto-devops-v12-10).
+
+## Failure to create a Kubernetes namespace
+
+Auto Deploy fails if GitLab can't create a Kubernetes namespace and
+service account for your project. For help debugging this issue, see
+[Troubleshooting failed deployment jobs](../../user/project/clusters/index.md#troubleshooting).
+
+## Detected an existing PostgreSQL database
+
+After upgrading to GitLab 13.0, you may encounter this message when deploying
+with Auto DevOps:
+
+```plaintext
+Detected an existing PostgreSQL database installed on the
+deprecated channel 1, but the current channel is set to 2. The default
+channel changed to 2 in of GitLab 13.0.
+[...]
+```
+
+Auto DevOps, by default, installs an in-cluster PostgreSQL database alongside
+your application. The default installation method changed in GitLab 13.0, and
+upgrading existing databases requires user involvement. The two installation
+methods are:
+
+- **channel 1 (deprecated):** Pulls in the database as a dependency of the associated
+ Helm chart. Only supports Kubernetes versions up to version 1.15.
+- **channel 2 (current):** Installs the database as an independent Helm chart. Required
+ for using the in-cluster database feature with Kubernetes versions 1.16 and greater.
+
+If you receive this error, you can do one of the following actions:
+
+- You can *safely* ignore the warning and continue using the channel 1 PostgreSQL
+ database by setting `AUTO_DEVOPS_POSTGRES_CHANNEL` to `1` and redeploying.
+
+- You can delete the channel 1 PostgreSQL database and install a fresh channel 2
+ database by setting `AUTO_DEVOPS_POSTGRES_DELETE_V1` to a non-empty value and
+ redeploying.
+
+ WARNING:
+ Deleting the channel 1 PostgreSQL database permanently deletes the existing
+ channel 1 database and all its data. See
+ [Upgrading PostgreSQL](upgrading_postgresql.md)
+ for more information on backing up and upgrading your database.
+
+- If you are not using the in-cluster database, you can set
+ `POSTGRES_ENABLED` to `false` and re-deploy. This option is especially relevant to
+ users of *custom charts without the in-chart PostgreSQL dependency*.
+ Database auto-detection is based on the `postgresql.enabled` Helm value for
+ your release. This value is set based on the `POSTGRES_ENABLED` CI/CD variable
+ and persisted by Helm, regardless of whether or not your chart uses the
+ variable.
+
+WARNING:
+Setting `POSTGRES_ENABLED` to `false` permanently deletes any existing
+channel 1 database for your environment.
+
+## Error: unable to recognize "": no matches for kind "Deployment" in version "extensions/v1beta1"
+
+After upgrading your Kubernetes cluster to [v1.16+](stages.md#kubernetes-116),
+you may encounter this message when deploying with Auto DevOps:
+
+```plaintext
+UPGRADE FAILED
+Error: failed decoding reader into objects: unable to recognize "": no matches for kind "Deployment" in version "extensions/v1beta1"
+```
+
+This can occur if your current deployments on the environment namespace were deployed with a
+deprecated/removed API that doesn't exist in Kubernetes v1.16+. For example,
+if [your in-cluster PostgreSQL was installed in a legacy way](#detected-an-existing-postgresql-database),
+the resource was created via the `extensions/v1beta1` API. However, the deployment resource
+was moved to the `app/v1` API in v1.16.
+
+To recover such outdated resources, you must convert the current deployments by mapping legacy APIs
+to newer APIs. There is a helper tool called [`mapkubeapis`](https://github.com/hickeyma/helm-mapkubeapis)
+that works for this problem. Follow these steps to use the tool in Auto DevOps:
+
+1. Modify your `.gitlab-ci.yml` with:
+
+ ```yaml
+ include:
+ - template: Auto-DevOps.gitlab-ci.yml
+ - remote: https://gitlab.com/shinya.maeda/ci-templates/-/raw/master/map-deprecated-api.gitlab-ci.yml
+
+ variables:
+ HELM_VERSION_FOR_MAPKUBEAPIS: "v2" # If you're using auto-depoy-image v2 or above, please specify "v3".
+ ```
+
+1. Run the job `<environment-name>:map-deprecated-api`. Ensure that this job succeeds before moving
+ to the next step. You should see something like the following output:
+
+ ```shell
+ 2020/10/06 07:20:49 Found deprecated or removed Kubernetes API:
+ "apiVersion: extensions/v1beta1
+ kind: Deployment"
+ Supported API equivalent:
+ "apiVersion: apps/v1
+ kind: Deployment"
+ ```
+
+1. Revert your `.gitlab-ci.yml` to the previous version. You no longer need to include the
+ supplemental template `map-deprecated-api`.
+
+1. Continue the deployments as usual.
+
+## Error: error initializing: Looks like "https://kubernetes-charts.storage.googleapis.com" is not a valid chart repository or cannot be reached
+
+As [announced in the official CNCF blog post](https://www.cncf.io/blog/2020/10/07/important-reminder-for-all-helm-users-stable-incubator-repos-are-deprecated-and-all-images-are-changing-location/),
+the stable Helm chart repository was deprecated and removed on November 13th, 2020.
+You may encounter this error after that date.
+
+Some GitLab features had dependencies on the stable chart. To mitigate the impact, we changed them
+to use new official repositories or the [Helm Stable Archive repository maintained by GitLab](https://gitlab.com/gitlab-org/cluster-integration/helm-stable-archive).
+Auto Deploy contains [an example fix](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/merge_requests/127).
+
+In Auto Deploy, `v1.0.6+` of `auto-deploy-image` no longer adds the deprecated stable repository to
+the `helm` command. If you use a custom chart and it relies on the deprecated stable repository,
+specify an older `auto-deploy-image` like this example:
+
+```yaml
+include:
+ - template: Auto-DevOps.gitlab-ci.yml
+
+.auto-deploy:
+ image: "registry.gitlab.com/gitlab-org/cluster-integration/auto-deploy-image:v1.0.5"
+```
+
+Keep in mind that this approach stops working when the stable repository is removed,
+so you must eventually fix your custom chart.
+
+To fix your custom chart:
+
+1. In your chart directory, update the `repository` value in your `requirements.yaml` file from :
+
+ ```yaml
+ repository: "https://kubernetes-charts.storage.googleapis.com/"
+ ```
+
+ to:
+
+ ```yaml
+ repository: "https://charts.helm.sh/stable"
+ ```
+
+1. In your chart directory, run `helm dep update .` using the same Helm major version as Auto DevOps.
+1. Commit the changes for the `requirements.yaml` file.
+1. If you previously had a `requirements.lock` file, commit the changes to the file.
+ If you did not previously have a `requirements.lock` file in your chart,
+ you do not need to commit the new one. This file is optional, but when present,
+ it's used to verify the integrity of the downloaded dependencies.
+
+You can find more information in
+[issue #263778, "Migrate PostgreSQL from stable Helm repository"](https://gitlab.com/gitlab-org/gitlab/-/issues/263778).
+
+## Error: release .... failed: timed out waiting for the condition
+
+When getting started with Auto DevOps, you may encounter this error when first
+deploying your application:
+
+```plaintext
+INSTALL FAILED
+PURGING CHART
+Error: release staging failed: timed out waiting for the condition
+```
+
+This is most likely caused by a failed liveness (or readiness) probe attempted
+during the deployment process. By default, these probes are run against the root
+page of the deployed application on port 5000. If your application isn't configured
+to serve anything at the root page, or is configured to run on a specific port
+*other* than 5000, this check fails.
+
+If it fails, you should see these failures in the events for the relevant
+Kubernetes namespace. These events look like the following example:
+
+```plaintext
+LAST SEEN TYPE REASON OBJECT MESSAGE
+3m20s Warning Unhealthy pod/staging-85db88dcb6-rxd6g Readiness probe failed: Get http://10.192.0.6:5000/: dial tcp 10.192.0.6:5000: connect: connection refused
+3m32s Warning Unhealthy pod/staging-85db88dcb6-rxd6g Liveness probe failed: Get http://10.192.0.6:5000/: dial tcp 10.192.0.6:5000: connect: connection refused
+```
+
+To change the port used for the liveness checks, pass
+[custom values to the Helm chart](customize.md#customize-values-for-helm-chart)
+used by Auto DevOps:
+
+1. Create a directory and file at the root of your repository named `.gitlab/auto-deploy-values.yaml`.
+
+1. Populate the file with the following content, replacing the port values with
+ the actual port number your application is configured to use:
+
+ ```yaml
+ service:
+ internalPort: <port_value>
+ externalPort: <port_value>
+ ```
+
+1. Commit your changes.
+
+After committing your changes, subsequent probes should use the newly-defined ports.
+The page that's probed can also be changed by overriding the `livenessProbe.path`
+and `readinessProbe.path` values (shown in the
+[default `values.yaml`](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/blob/master/assets/auto-deploy-app/values.yaml)
+file) in the same fashion.
diff --git a/doc/topics/autodevops/upgrading_auto_deploy_dependencies.md b/doc/topics/autodevops/upgrading_auto_deploy_dependencies.md
index 5f8dfcdfc05..0dabb80204a 100644
--- a/doc/topics/autodevops/upgrading_auto_deploy_dependencies.md
+++ b/doc/topics/autodevops/upgrading_auto_deploy_dependencies.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: reference
---
-# Upgrading deployments for newer Auto Deploy dependencies (Auto Deploy template, auto-deploy-image and auto-deploy-app chart)
+# Upgrading deployments for newer Auto Deploy dependencies
[Auto Deploy](stages.md#auto-deploy) is a feature that deploys your application to a Kubernetes cluster.
It consists of several dependencies:
@@ -114,7 +114,7 @@ If your Auto DevOps project has an active environment that was deployed with the
job saves a backup for 1 week in a job artifact called `helm-2-release-backups`.
The backup is in a Kubernetes manifest file that can be restored using
`kubectl apply -f $backup`.
-1. Remove the `MIGRATE_HELM_2TO3` variable.
+1. Remove the `MIGRATE_HELM_2TO3` CI/CD variable.
#### In-Cluster PostgreSQL Channel 2
@@ -145,11 +145,11 @@ steps to upgrade to v2:
them to `production` first to delete the unstable tracks.
1. Verify your project is [using the v2 `auto-deploy-image`](#verify-dependency-versions).
If not, [specify the version](#use-a-specific-version-of-auto-deploy-dependencies).
-1. Add an `AUTO_DEVOPS_FORCE_DEPLOY_V2` environment variable with a value of `true`
+1. Add an `AUTO_DEVOPS_FORCE_DEPLOY_V2` CI/CD variable with a value of `true`
in the GitLab CI/CD settings.
1. Create a new pipeline and run the `production` job to renew the resource architecture
with the v2 `auto-deploy-app chart`.
-1. Remove the `AUTO_DEVOPS_FORCE_DEPLOY_V2` environment variable.
+1. Remove the `AUTO_DEVOPS_FORCE_DEPLOY_V2` variable.
### Use a specific version of Auto Deploy dependencies
@@ -167,7 +167,7 @@ include:
### Ignore warnings and continue deploying
If you are certain that the new chart version is safe to be deployed, you can add
-the `AUTO_DEVOPS_FORCE_DEPLOY_V<major-version-number>` [environment variable](customize.md#build-and-deployment)
+the `AUTO_DEVOPS_FORCE_DEPLOY_V<major-version-number>` [CI/CD variable](customize.md#build-and-deployment)
to force the deployment to continue.
For example, if you want to deploy the `v2.0.0` chart on a deployment that previously
diff --git a/doc/topics/autodevops/upgrading_postgresql.md b/doc/topics/autodevops/upgrading_postgresql.md
index a0c4a41f90d..35b9d2e055c 100644
--- a/doc/topics/autodevops/upgrading_postgresql.md
+++ b/doc/topics/autodevops/upgrading_postgresql.md
@@ -27,14 +27,14 @@ involves:
## Prerequisites
1. Install
- [`kubectl`](https://kubernetes.io/docs/tasks/tools/install-kubectl/).
+ [`kubectl`](https://kubernetes.io/docs/tasks/tools/).
1. Ensure that you can access your Kubernetes cluster using `kubectl`.
This varies based on Kubernetes providers.
1. Prepare for downtime. The steps below include taking the application offline
so that the in-cluster database does not get modified after the database dump is created.
1. Ensure you have not set `POSTGRES_ENABLED` to `false`, as this setting deletes
any existing channel 1 database. For more information, see
- [Detected an existing PostgreSQL database](index.md#detected-an-existing-postgresql-database).
+ [Detected an existing PostgreSQL database](troubleshooting.md#detected-an-existing-postgresql-database).
NOTE:
If you have configured Auto DevOps to have staging,
diff --git a/doc/topics/git/cherry_picking.md b/doc/topics/git/cherry_picking.md
new file mode 100644
index 00000000000..5a0867371bb
--- /dev/null
+++ b/doc/topics/git/cherry_picking.md
@@ -0,0 +1,53 @@
+---
+stage: Create
+group: Source Code
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+comments: false
+---
+
+# Cherry Pick
+
+Given an existing commit on one branch, apply the change to another branch.
+
+This can be useful for backporting bug fixes to previous release branches. Make
+the commit on the default branch, and then cherry pick it into the release branch.
+
+## Sample workflow
+
+1. Check out a new `stable` branch from the default branch:
+
+ ```shell
+ git checkout master
+ git checkout -b stable
+ ```
+
+1. Change back to the default branch:
+
+ ```shell
+ git checkout master
+ ```
+
+1. Make any required changes, then commit the changes:
+
+ ```shell
+ git add changed_file.rb
+ git commit -m 'Fix bugs in changed_file.rb'
+ ```
+
+1. Review the commit log and copy the SHA of the latest commit:
+
+ ```shell
+ git log
+ ```
+
+1. Check out the `stable` branch:
+
+ ```shell
+ git checkout stable
+ ```
+
+1. Cherry pick the commit by using the SHA copied previously:
+
+ ```shell
+ git cherry-pick <commit SHA>
+ ```
diff --git a/doc/topics/git/feature_branch_development.md b/doc/topics/git/feature_branch_development.md
index 842c39f0bfd..5f4b5632f33 100644
--- a/doc/topics/git/feature_branch_development.md
+++ b/doc/topics/git/feature_branch_development.md
@@ -56,7 +56,7 @@ In this case, the feature branch would be `release-X-Y`. Assuming the `release-X
![Create merge request](img/create_merge_request_v13_1.png)
-1. After you click **Create merge request**, you'll see an option to **Change branches**. Select that option.
+1. After you click **Create merge request**, an option to **Change branches** displays. Select that option.
1. In the **New Merge Request** screen, you can now select the **Source** and **Target** branches.
In the screenshot shown,
@@ -73,10 +73,10 @@ we have selected `test-branch` as the source, and `release-13-0` as the target.
From test-branch into release-13-0
```
- An entry like this confirms that your MR will **not** merge into master.
+ An entry like this confirms your merge request's destination.
1. Make any additional changes in the **New Merge Request** screen, and click **Submit merge request**.
-1. In the new merge request, look for **Request to merge**. You'll see an entry similar to:
+1. In the new merge request, look for **Request to merge**. An entry similar to this displays:
```plaintext
Request to merge test-branch into release-13-0
diff --git a/doc/topics/git/how_to_install_git/index.md b/doc/topics/git/how_to_install_git/index.md
index 17c5f31705f..8b097c4c1da 100644
--- a/doc/topics/git/how_to_install_git/index.md
+++ b/doc/topics/git/how_to_install_git/index.md
@@ -9,9 +9,9 @@ type: howto
# Installing Git **(FREE)**
To begin contributing to GitLab projects,
-you will need to install the Git client on your computer.
+you must install the Git client on your computer.
-This article will show you how to install Git on macOS, Ubuntu Linux and Windows.
+This article shows you how to install Git on macOS, Ubuntu Linux and Windows.
Information on [installing Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)
is also available at the official Git website.
diff --git a/doc/topics/git/index.md b/doc/topics/git/index.md
index 52e8a42de76..2c28bdcb0ed 100644
--- a/doc/topics/git/index.md
+++ b/doc/topics/git/index.md
@@ -14,7 +14,7 @@ large projects with speed and efficiency.
[GitLab](https://about.gitlab.com) is a Git-based fully integrated platform for
software development. Besides Git's functionalities, GitLab has a lot of
powerful [features](https://about.gitlab.com/features/) to enhance your
-[workflow](https://about.gitlab.com/blog/2016/10/25/gitlab-workflow-an-overview/).
+[workflow](https://about.gitlab.com/topics/version-control/what-is-gitlab-workflow/).
We've gathered some resources to help you to get the best from Git with GitLab.
@@ -22,7 +22,7 @@ More information is also available on the [Git website](https://git-scm.com).
## Getting started
-The following resources will help you get started with Git:
+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.
@@ -42,7 +42,7 @@ The following resources will help you get started with Git:
- [Git stash](../../university/training/topics/stash.md)
- [Git file blame](../../user/project/repository/git_blame.md)
- [Git file history](../../user/project/repository/git_history.md)
-- [Git tags](../../university/training/user_training.md#tags)
+- [Git tags](tags.md)
### Concepts
@@ -84,7 +84,7 @@ The following are advanced topics for those who want to get the most out of Git:
- [Introduction to Git rebase, force-push, and merge conflicts](git_rebase.md)
- [Server Hooks](../../administration/server_hooks.md)
- [Git Attributes](../../user/project/git_attributes.md)
-- Git Submodules: [Using Git submodules with GitLab CI](../../ci/git_submodules.md#using-git-submodules-with-gitlab-ci)
+- Git Submodules: [Using Git submodules with GitLab CI](../../ci/git_submodules.md)
- [Partial Clone](partial_clone.md)
## API
diff --git a/doc/topics/git/lfs/index.md b/doc/topics/git/lfs/index.md
index 14bb28d2477..11c0fcc2373 100644
--- a/doc/topics/git/lfs/index.md
+++ b/doc/topics/git/lfs/index.md
@@ -269,3 +269,46 @@ You might choose to do this if you are using an appliance like a <!-- vale gitla
GitLab can't verify LFS objects. Pushes then fail if you have GitLab LFS support enabled.
To stop push failure, LFS support can be disabled in the [Project settings](../../../user/project/settings/index.md), which also disables GitLab LFS value-adds (Verifying LFS objects, UI integration for LFS).
+
+### Missing LFS objects
+
+An error about a missing LFS object may occur in either of these situations:
+
+- When migrating LFS objects from disk to object storage, with error messages like:
+
+ ```plaintext
+ ERROR -- : Failed to transfer LFS object
+ 006622269c61b41bf14a22bbe0e43be3acf86a4a446afb4250c3794ea47541a7
+ with error: No such file or directory @ rb_sysopen -
+ /var/opt/gitlab/gitlab-rails/shared/lfs-objects/00/66/22269c61b41bf14a22bbe0e43be3acf86a4a446afb4250c3794ea47541a7
+ ```
+
+ (Line breaks have been added for legibility.)
+
+- When running the
+ [integrity check for LFS objects](../../../administration/raketasks/check.md#uploaded-files-integrity)
+ with the `VERBOSE=1` parameter.
+
+The database can have records for LFS objects which are not on disk. The database entry may
+[prevent a new copy of the object being pushed](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/49241).
+To delete these references:
+
+1. [Start a rails console](../../../administration/operations/rails_console.md).
+1. Query the object that's reported as missing in the rails console, to return a file path:
+
+ ```ruby
+ lfs_object = LfsObject.find_by(oid: '006622269c61b41bf14a22bbe0e43be3acf86a4a446afb4250c3794ea47541a7')
+ lfs_object.file.path
+ ```
+
+1. Check on disk if it exists:
+
+ ```shell
+ ls -al /var/opt/gitlab/gitlab-rails/shared/lfs-objects/00/66/22269c61b41bf14a22bbe0e43be3acf86a4a446afb4250c3794ea47541a7
+ ```
+
+1. If the file is not present, remove the database record via the rails console:
+
+ ```ruby
+ lfs_object.destroy
+ ```
diff --git a/doc/topics/git/numerous_undo_possibilities_in_git/index.md b/doc/topics/git/numerous_undo_possibilities_in_git/index.md
index c263609125f..76fc9bc92b0 100644
--- a/doc/topics/git/numerous_undo_possibilities_in_git/index.md
+++ b/doc/topics/git/numerous_undo_possibilities_in_git/index.md
@@ -64,7 +64,7 @@ To avoid chaos with
development workflows have to be followed. It depends on your internal
workflow how certain changes or commits can be undone or changed.
-[GitLab Flow](https://about.gitlab.com/blog/2014/09/29/gitlab-flow/) provides a good
+[GitLab Flow](https://about.gitlab.com/topics/version-control/what-is-gitlab-flow/) provides a good
balance between developers clashing with each other while
developing the same feature and cooperating seamlessly. However, it does not enable
joined development of the same feature by multiple developers by default.
diff --git a/doc/topics/git/partial_clone.md b/doc/topics/git/partial_clone.md
index d9c239486f5..7f2543f040a 100644
--- a/doc/topics/git/partial_clone.md
+++ b/doc/topics/git/partial_clone.md
@@ -23,13 +23,13 @@ Git 2.22.0 or later is required.
> [Introduced](https://gitlab.com/gitlab-org/gitaly/-/issues/2553) in GitLab 12.10.
Storing large binary files in Git is normally discouraged, because every large
-file added will be downloaded by everyone who clones or fetches changes
+file added is downloaded by everyone who clones or fetches changes
thereafter. This is slow, if not a complete obstruction when working from a slow
or unreliable internet connection.
Using partial clone with a file size filter solves this problem, by excluding
troublesome large files from clones and fetches. When Git encounters a missing
-file, it will be downloaded on demand.
+file, it's downloaded on demand.
When cloning a repository, use the `--filter=blob:limit=<size>` argument. For example,
to clone the repository excluding files larger than 1 megabyte:
@@ -58,7 +58,7 @@ Updating files: 100% (13008/13008), done.
Filtering content: 100% (3/3), 131.24 MiB | 4.65 MiB/s, done.
```
-The output will be longer because Git will first clone the repository excluding
+The output is longer because Git first clones the repository excluding
files larger than 1 megabyte, and second download any missing large files needed
to checkout the `master` branch.
@@ -109,8 +109,8 @@ For more details, see the Git documentation for
## Filter by file path
WARNING:
-Partial Clone using `sparse` filters is experimental, slow, and will
-significantly increase Gitaly resource utilization when cloning and fetching.
+Partial Clone using `sparse` filters is experimental, slow, and
+significantly increases Gitaly resource utilization when cloning and fetching.
Deeper integration between Partial Clone and Sparse Checkout is being explored
through the `--filter=sparse:oid=<blob-ish>` filter spec, but this is highly
@@ -143,7 +143,7 @@ For more details, see the Git documentation for
```
1. **Create a new Git repository and fetch.** Support for `--filter=sparse:oid`
- using the clone command is incomplete, so we will emulate the clone command
+ using the clone command is incomplete, so we emulate the clone command
by hand, using `git init` and `git fetch`. Follow
[issue tracking support for `--filter=sparse:oid`](https://gitlab.com/gitlab-org/git/-/issues/4)
for updates.
@@ -171,7 +171,7 @@ For more details, see the Git documentation for
WARNING:
Git integrations with `bash`, `zsh`, etc and editors that automatically
- show Git status information often run `git fetch` which will fetch the
+ show Git status information often run `git fetch` which fetches the
entire repository. You many need to disable or reconfigure these
integrations.
diff --git a/doc/topics/git/tags.md b/doc/topics/git/tags.md
new file mode 100644
index 00000000000..76e3cff3edc
--- /dev/null
+++ b/doc/topics/git/tags.md
@@ -0,0 +1,41 @@
+---
+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
+---
+
+# Tags
+
+Tags are useful for marking certain deployments and releases for later
+reference. Git supports two types of tags:
+
+- Annotated tags: An unchangeable part of Git history.
+- Lightweight (soft) tags: Tags that can be set and removed as needed.
+
+Many projects combine an annotated release tag with a stable branch. Consider
+setting deployment or release tags automatically.
+
+## Tags sample workflow
+
+1. Create a lightweight tag.
+1. Create an annotated tag.
+1. Push the tags to the remote repository.
+
+```shell
+git checkout master
+
+# Lightweight tag
+git tag my_lightweight_tag
+
+# Annotated tag
+git tag -a v1.0 -m ‘Version 1.0’
+
+# Show list of the existing tags
+git tag
+
+git push origin --tags
+```
+
+## Additional resources
+
+- [Tagging](https://git-scm.com/book/en/v2/Git-Basics-Tagging) Git reference page
diff --git a/doc/topics/git/troubleshooting_git.md b/doc/topics/git/troubleshooting_git.md
index 528a9a4ba00..be4903e2cb9 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/README.md#troubleshooting) documentation.
+instructions in the [SSH troubleshooting](../../ssh/README.md#troubleshooting-ssh-connections) documentation.
If you're a GitLab administrator and have access to the server, you can also prevent
session timeouts by configuring SSH `keep alive` either on the client or on the server.
diff --git a/doc/topics/gitlab_flow.md b/doc/topics/gitlab_flow.md
index d02573a0e06..c238951be51 100644
--- a/doc/topics/gitlab_flow.md
+++ b/doc/topics/gitlab_flow.md
@@ -187,7 +187,7 @@ The name of a branch might be dictated by organizational standards.
When you are done or want to discuss the code, open a merge request.
A merge request is an online place to discuss the change and review the code.
-If you open the merge request but do not assign it to anyone, it is a [draft merge request](../user/project/merge_requests/work_in_progress_merge_requests.md).
+If you open the merge request but do not assign it to anyone, it is a [draft merge request](../user/project/merge_requests/drafts.md).
These are used to discuss the proposed implementation but are not ready for inclusion in the `master` branch yet.
Start the title of the merge request with `[Draft]`, `Draft:` or `(Draft)` to prevent it from being merged before it's ready.
diff --git a/doc/university/index.md b/doc/university/index.md
index 8b6c2d834f9..0d194c7708d 100644
--- a/doc/university/index.md
+++ b/doc/university/index.md
@@ -55,7 +55,7 @@ The GitLab University curriculum is composed of GitLab videos, screencasts, pres
1. [Creating a Project in GitLab - Video](https://www.youtube.com/watch?v=7p0hrpNaJ14)
1. [How to Create Files and Directories](https://about.gitlab.com/blog/2016/02/10/feature-highlight-create-files-and-directories-from-files-page/)
1. [GitLab To-Do List](https://about.gitlab.com/blog/2016/03/02/gitlab-todos-feature-highlight/)
-1. [GitLab Work in Progress (WIP) Flag](https://about.gitlab.com/blog/2016/01/08/feature-highlight-wip/)
+1. [GitLab Draft Flag](https://about.gitlab.com/blog/2016/01/08/feature-highlight-wip/)
### 1.5. Migrating from other Source Control
@@ -120,7 +120,7 @@ The GitLab University curriculum is composed of GitLab videos, screencasts, pres
1. [GitLab and Docker - Video](https://www.youtube.com/watch?v=ugOrCcbdHko&index=12&list=PLFGfElNsQthbQu_IWlNOxul0TbS_2JH-e)
1. [How we scale GitLab with built in Docker](https://about.gitlab.com/blog/2016/06/21/how-we-scale-gitlab-by-having-docker-built-in/)
1. [Continuous Integration, Delivery, and Deployment with GitLab](https://about.gitlab.com/blog/2016/08/05/continuous-integration-delivery-and-deployment-with-gitlab/)
-1. [Deployments and Environments](https://about.gitlab.com/blog/2016/08/26/ci-deployment-and-environments/)
+1. [Deployments and Environments](https://about.gitlab.com/blog/2021/02/05/ci-deployment-and-environments/)
1. [Sequential, Parallel or Custom Pipelines](https://about.gitlab.com/blog/2016/07/29/the-basics-of-gitlab-ci/)
1. [Setting up GitLab Runner For Continuous Integration](https://about.gitlab.com/blog/2016/03/01/gitlab-runner-with-docker/)
1. [Setting up GitLab Runner on DigitalOcean](https://about.gitlab.com/blog/2016/04/19/how-to-set-up-gitlab-runner-on-digitalocean/)
@@ -134,7 +134,7 @@ The GitLab University curriculum is composed of GitLab videos, screencasts, pres
1. [GitLab Flow - Video](https://youtu.be/enMumwvLAug?list=PLFGfElNsQthZnwMUFi6rqkyUZkI00OxIV)
1. [GitLab Flow vs Forking in GitLab - Video](https://www.youtube.com/watch?v=UGotqAUACZA)
-1. [GitLab Flow Overview](https://about.gitlab.com/blog/2014/09/29/gitlab-flow/)
+1. [GitLab Flow Overview](https://about.gitlab.com/topics/version-control/what-is-gitlab-flow/)
1. [Always Start with an Issue](https://about.gitlab.com/blog/2016/03/03/start-with-an-issue/)
1. [GitLab Flow Documentation](../topics/gitlab_flow.md)
diff --git a/doc/university/training/gitlab_flow/feature_branches.png b/doc/university/training/gitlab_flow/feature_branches.png
deleted file mode 100644
index 612e0248222..00000000000
--- a/doc/university/training/gitlab_flow/feature_branches.png
+++ /dev/null
Binary files differ
diff --git a/doc/university/training/index.md b/doc/university/training/index.md
index 13cf4184560..f69bd51b341 100644
--- a/doc/university/training/index.md
+++ b/doc/university/training/index.md
@@ -34,7 +34,6 @@ This section contains the following topics:
- [Merge conflicts](topics/merge_conflicts.md).
- [Rollback commits](topics/rollback_commits.md).
- [Subtree](topics/subtree.md).
-- [Tags](topics/tags.md).
- [Unstage](topics/unstage.md).
## Additional Resources
diff --git a/doc/university/training/topics/cherry_picking.md b/doc/university/training/topics/cherry_picking.md
index 2f806ad2590..f0f815baa94 100644
--- a/doc/university/training/topics/cherry_picking.md
+++ b/doc/university/training/topics/cherry_picking.md
@@ -1,36 +1,8 @@
---
-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
-comments: false
+redirect_to: '../../../topics/git/cherry_picking.md'
---
-# Cherry Pick
+This document was moved to [another location](../../../topics/git/cherry_picking.md).
-- Given an existing commit on one branch, apply the change to another branch
-- Useful for backporting bug fixes to previous release branches
-- Make the commit on the master branch and pick in to stable
-
-## Cherry Pick sample workflow
-
-1. Check out a new 'stable' branch from 'master'
-1. Change back to 'master'
-1. Edit '`cherry_pick.rb`' and commit the changes.
-1. Check commit log to get the commit SHA
-1. Check out the 'stable' branch
-1. Cherry pick the commit using the SHA obtained earlier
-
-```shell
-git checkout master
-git checkout -b stable
-git checkout master
-
-# Edit `cherry_pick.rb`
-git add cherry_pick.rb
-git commit -m 'Fix bugs in cherry_pick.rb'
-git log
-# Copy commit SHA
-git checkout stable
-
-git cherry-pick <commit SHA>
-```
+<!-- This redirect file can be deleted after <2021-06-01>. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/university/training/topics/tags.md b/doc/university/training/topics/tags.md
index ca438e04a55..28fd8400d99 100644
--- a/doc/university/training/topics/tags.md
+++ b/doc/university/training/topics/tags.md
@@ -1,52 +1,8 @@
---
-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
-comments: false
-type: reference
+redirect_to: '../../../topics/git/tags.md'
---
-# Tags
+This document was moved to [another location](../../../topics/git/tags.md).
-- Useful for marking deployments and releases
-- Annotated tags are an unchangeable part of Git history
-- Soft/lightweight tags can be set and removed at will
-- Many projects combine an annotated release tag with a stable branch
-- Consider setting deployment/release tags automatically
-
-## Tags sample workflow
-
-- Create a lightweight tag
-- Create an annotated tag
-- Push the tags to the remote repository
-
-```shell
-git checkout master
-
-# Lightweight tag
-git tag my_lightweight_tag
-
-# Annotated tag
-git tag -a v1.0 -m ‘Version 1.0’
-
-# Show list of the existing tags
-git tag
-
-git push origin --tags
-```
-
-**Additional resources**
-
-<https://git-scm.com/book/en/Git-Basics-Tagging>
-
-<!-- ## 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 <2021-06-01>. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/update/index.md b/doc/update/index.md
index a07a6f4b0b7..555c30136de 100644
--- a/doc/update/index.md
+++ b/doc/update/index.md
@@ -138,6 +138,35 @@ pending_job_classes = scheduled_queue.select { |job| job["class"] == "Background
pending_job_classes.each { |job_class| Gitlab::BackgroundMigration.steal(job_class) }
```
+## Checking for pending Advanced Search migrations
+
+This section is only applicable if you have enabled the [Elasticsearch
+integration](../integration/elasticsearch.md).
+
+Major releases require all [Advanced Search
+migrations](../integration/elasticsearch.md#advanced-search-migrations) to
+be finished from the most recent minor release in your current version
+before the major version upgrade. You can find pending migrations by
+running the following command:
+
+**For Omnibus installations**
+
+```shell
+sudo gitlab-rake gitlab:elastic:list_pending_migrations
+```
+
+**For installations from source**
+
+```shell
+cd /home/git/gitlab
+sudo -u git -H bundle exec rake gitlab:elastic:list_pending_migrations
+```
+
+### What do I do if my Advanced Search migrations are stuck?
+
+See [how to retry a halted
+migration](../integration/elasticsearch.md#retry-a-halted-migration).
+
## Upgrade paths
Although you can generally upgrade through multiple GitLab versions in one go,
@@ -147,7 +176,7 @@ Find where your version sits in the upgrade path below, and upgrade GitLab
accordingly, while also consulting the
[version-specific upgrade instructions](#version-specific-upgrading-instructions):
-`8.11.x` -> `8.12.0` -> `8.17.7` -> `9.5.10` -> `10.8.7` -> `11.11.8` -> `12.0.12` -> `12.1.17` -> `12.10.14` -> `13.0.14` -> `13.1.11` - > `13.x (latest)`
+`8.11.Z` -> `8.12.0` -> `8.17.7` -> `9.5.10` -> `10.8.7` -> `11.11.8` -> `12.0.12` -> `12.1.17` -> `12.10.14` -> `13.0.14` -> `13.1.11` - > [latest `13.Y.Z`](https://about.gitlab.com/releases/categories/releases/)
The following table, while not exhaustive, shows some examples of the supported
upgrade paths.
@@ -174,13 +203,20 @@ Identify a [supported upgrade path](#upgrade-paths).
More significant migrations may occur during major release upgrades. To ensure these are successful:
-1. Increment to the first minor version (`x.0.x`) during the major version jump.
+1. Increment to the first minor version (`X.0.Z`) during the major version jump.
1. Proceed with upgrading to a newer release.
It's also important to ensure that any background migrations have been fully completed
before upgrading to a new major version. To see the current size of the `background_migration` queue,
[Check for background migrations before upgrading](#checking-for-background-migrations-before-upgrading).
+If you have enabled the [Elasticsearch
+integration](../integration/elasticsearch.md), then you will also need to ensure
+all Advanced Search migrations are completed in the last minor version within
+your current version. Be sure to [check for pending Advanced Search
+migrations](#checking-for-pending-advanced-search-migrations) before proceeding
+with the major version upgrade.
+
If your GitLab instance has any runners associated with it, it is very
important to upgrade GitLab Runner to match the GitLab minor version that was
upgraded to. This is to ensure [compatibility with GitLab versions](https://docs.gitlab.com/runner/#compatibility-with-gitlab-versions).
@@ -235,7 +271,7 @@ which is the latest patch release of 9.4. When GitLab 9.5.0 is released this
installation can be safely upgraded to 9.5.0 without requiring downtime if the
requirements mentioned above are met. You can also skip 9.5.0 and upgrade to
9.5.1 after it's released, but you **can not** upgrade straight to 9.6.0; you
-_have_ to first upgrade to a 9.5.x release.
+_have_ to first upgrade to a 9.5.Z release.
**Example 2:** You are running a large GitLab installation using version 9.4.2,
which is the latest patch release of 9.4. GitLab 9.5 includes some background
@@ -243,7 +279,7 @@ migrations, and 10.0 will require these to be completed (processing any
remaining jobs for you). Skipping 9.5 is not possible without downtime, and due
to the background migrations would require potentially hours of downtime
depending on how long it takes for the background migrations to complete. To
-work around this you will have to upgrade to 9.5.x first, then wait at least a
+work around this you will have to upgrade to 9.5.Z first, then wait at least a
week before upgrading to 10.0.
**Example 3:** You use MySQL as the database for GitLab. Any upgrade to a new
@@ -361,9 +397,9 @@ with the older Rails version - which could cause non-GET requests to
fail for [multi-node GitLab installations](https://docs.gitlab.com/omnibus/update/#multi-node--ha-deployment).
So, if you are using multiple Rails servers and specifically upgrading from 13.0,
-all servers must first be upgraded to 13.1.X before upgrading to 13.2.0 or later:
+all servers must first be upgraded to 13.1.Z before upgrading to 13.2.0 or later:
-1. Ensure all GitLab web nodes are on GitLab 13.1.X.
+1. Ensure all GitLab web nodes are on GitLab 13.1.Z.
1. Optionally, enable the `global_csrf_token` feature flag to enable new
method of CSRF token generation:
@@ -383,33 +419,33 @@ any downgrades would result to all sessions being invalidated and users are logg
### 12.1.0
-If you are planning to upgrade from `12.0.x` to `12.10.x`, it is necessary to
-perform an intermediary upgrade to `12.1.x` before upgrading to `12.10.x` to
+If you are planning to upgrade from `12.0.Z` to `12.10.Z`, it is necessary to
+perform an intermediary upgrade to `12.1.Z` before upgrading to `12.10.Z` to
avoid issues like [#215141](https://gitlab.com/gitlab-org/gitlab/-/issues/215141).
### 12.0.0
In 12.0.0 we made various database related changes. These changes require that
-users first upgrade to the latest 11.11 patch release. After upgraded to 11.11.x,
-users can upgrade to 12.0.x. Failure to do so may result in database migrations
+users first upgrade to the latest 11.11 patch release. After upgraded to 11.11.Z,
+users can upgrade to 12.0.Z. Failure to do so may result in database migrations
not being applied, which could lead to application errors.
-It is also required that you upgrade to 12.0.x before moving to a later version
-of 12.x.
+It is also required that you upgrade to 12.0.Z before moving to a later version
+of 12.Y.
Example 1: you are currently using GitLab 11.11.8, which is the latest patch
-release for 11.11.x. You can upgrade as usual to 12.0.x.
+release for 11.11.Z. You can upgrade as usual to 12.0.Z.
-Example 2: you are currently using a version of GitLab 10.x. To upgrade, first
-upgrade to the last 10.x release (10.8.7) then the last 11.x release (11.11.8).
-After upgraded to 11.11.8 you can safely upgrade to 12.0.x.
+Example 2: you are currently using a version of GitLab 10.Y. To upgrade, first
+upgrade to the last 10.Y release (10.8.7) then the last 11.Y release (11.11.8).
+After upgraded to 11.11.8 you can safely upgrade to 12.0.Z.
See our [documentation on upgrade paths](../policy/maintenance.md#upgrade-recommendations)
for more information.
### Upgrades from versions earlier than 8.12
-- `8.11.x` and earlier: you might have to upgrade to `8.12.0` specifically before you can upgrade to `8.17.7`. This was [reported in an issue](https://gitlab.com/gitlab-org/gitlab/-/issues/207259).
+- `8.11.Z` and earlier: you might have to upgrade to `8.12.0` specifically before you can upgrade to `8.17.7`. This was [reported in an issue](https://gitlab.com/gitlab-org/gitlab/-/issues/207259).
- [CI changes prior to version 8.0](https://docs.gitlab.com/omnibus/update/README.html#updating-gitlab-ci-from-prior-540-to-version-714-via-omnibus-gitlab)
when it was merged into GitLab.
diff --git a/doc/update/upgrading_from_ce_to_ee.md b/doc/update/upgrading_from_ce_to_ee.md
index 36f0078a4f7..71fd4efb16d 100644
--- a/doc/update/upgrading_from_ce_to_ee.md
+++ b/doc/update/upgrading_from_ce_to_ee.md
@@ -63,7 +63,9 @@ sudo -u git -H git checkout EE_BRANCH
```shell
cd /home/git/gitlab
-sudo -u git -H bundle install --deployment --without development test mysql aws kerberos
+sudo -u git -H bundle config set deployment 'true'
+sudo -u git -H bundle config set without 'development test mysql aws kerberos'
+sudo -u git -H bundle install
# Optional: clean up old gems
sudo -u git -H bundle clean
diff --git a/doc/update/upgrading_from_source.md b/doc/update/upgrading_from_source.md
index a76e9fb4504..42acb7552e4 100644
--- a/doc/update/upgrading_from_source.md
+++ b/doc/update/upgrading_from_source.md
@@ -127,49 +127,41 @@ Git v2.28 is recommended.
To check you are running the minimum required Git version, see
[Git versions](../install/requirements.md#git-versions).
-In Debian or Ubuntu:
-
-```shell
-# Make sure Git is version 2.29.0 or higher
-git --version
+From GitLab 13.6, we recommend you use the [Git version provided by
+Gitaly](https://gitlab.com/gitlab-org/gitaly/-/issues/2729)
+that:
-# Remove packaged Git
-sudo apt-get remove git-core
+- Is always at the version required by GitLab.
+- May contain custom patches required for proper operation.
+```shell
# Install dependencies
-sudo apt-get install -y libcurl4-openssl-dev libexpat1-dev gettext libz-dev libssl-dev build-essential
-
-# Download and compile pcre2 from source
-curl --silent --show-error --location "https://ftp.pcre.org/pub/pcre/pcre2-10.33.tar.gz" --output pcre2.tar.gz
-tar -xzf pcre2.tar.gz
-cd pcre2-10.33
-chmod +x configure
-./configure --prefix=/usr --enable-jit
-make
-make install
-
-# Download and compile from source
-cd /tmp
-curl --remote-name --location --progress "https://www.kernel.org/pub/software/scm/git/git-2.29.0.tar.gz"
-echo 'fa08dc8424ef80c0f9bf307877f9e2e49f1a6049e873530d6747c2be770742ff git-2.29.0.tar.gz' | shasum -a256 -c - && tar -xzf git-2.29.0.tar.gz
-cd git-2.29.0/
-./configure --with-libpcre
-make prefix=/usr/local all
+sudo apt-get install -y libcurl4-openssl-dev libexpat1-dev gettext libz-dev libssl-dev libpcre2-dev build-essential
-# Install into /usr/local/bin
-sudo make prefix=/usr/local install
+# Clone the Gitaly repository
+git clone https://gitlab.com/gitlab-org/gitaly.git -b <X-Y-stable> /tmp/gitaly
-# You should edit config/gitlab.yml, change the git -> bin_path to /usr/local/bin/git
+# Compile and install Git
+cd /tmp/gitaly
+sudo make git GIT_PREFIX=/usr/local
```
+Replace `<X-Y-stable>` with the stable branch that matches the GitLab version you want to
+install. For example, if you want to install GitLab 13.6, use the branch name `13-6-stable`.
+
+Remember to set `git -> bin_path` to `/usr/local/bin/git` in `config/gitlab.yml`.
+
### 7. Update PostgreSQL
WARNING:
From GitLab 13.0, you must use at least PostgreSQL 11.
-The latest version of GitLab might depend on a more recent PostgreSQL version than what you are currently running (see the [PostgreSQL requirements](../install/requirements.md#postgresql-requirements)).
+The latest version of GitLab might depend on a more recent PostgreSQL version
+than what you're currently running. You may also need to enable some
+extensions. For more information, see the
+[PostgreSQL requirements](../install/requirements.md#postgresql-requirements)
-In order to upgrade PostgreSQL, please refer to its [documentation](https://www.postgresql.org/docs/11/upgrading.html).
+To upgrade PostgreSQL, refer to its [documentation](https://www.postgresql.org/docs/11/upgrading.html).
### 8. Get latest code
@@ -177,8 +169,7 @@ In order to upgrade PostgreSQL, please refer to its [documentation](https://www.
cd /home/git/gitlab
sudo -u git -H git fetch --all --prune
-sudo -u git -H git checkout -- db/structure.sql # local changes will be restored automatically
-sudo -u git -H git checkout -- locale
+sudo -u git -H git checkout -- Gemfile.lock db/structure.sql locale
```
For GitLab Community Edition:
@@ -199,55 +190,7 @@ cd /home/git/gitlab
sudo -u git -H git checkout BRANCH-ee
```
-### 9. Update GitLab Shell
-
-```shell
-cd /home/git/gitlab-shell
-
-sudo -u git -H git fetch --all --tags --prune
-sudo -u git -H git checkout v$(</home/git/gitlab/GITLAB_SHELL_VERSION)
-sudo -u git -H make build
-```
-
-### 10. Update GitLab Workhorse
-
-Install and compile GitLab Workhorse.
-
-```shell
-cd /home/git/gitlab
-
-sudo -u git -H bundle exec rake "gitlab:workhorse:install[/home/git/gitlab-workhorse]" RAILS_ENV=production
-```
-
-### 11. Update Gitaly
-
-#### Compile Gitaly
-
-```shell
-cd /home/git/gitaly
-sudo -u git -H git fetch --all --tags --prune
-sudo -u git -H git checkout v$(</home/git/gitlab/GITALY_SERVER_VERSION)
-sudo -u git -H make
-```
-
-### 12. Update GitLab Pages
-
-#### Only needed if you use GitLab Pages
-
-Install and compile GitLab Pages. GitLab Pages uses
-[GNU Make](https://www.gnu.org/software/make/).
-If you are not using Linux you may have to run `gmake` instead of
-`make` below.
-
-```shell
-cd /home/git/gitlab-pages
-
-sudo -u git -H git fetch --all --tags --prune
-sudo -u git -H git checkout v$(</home/git/gitlab/GITLAB_PAGES_VERSION)
-sudo -u git -H make
-```
-
-### 13. Update configuration files
+### 9. Update configuration files
#### New configuration options for `gitlab.yml`
@@ -320,12 +263,17 @@ For Ubuntu 16.04.1 LTS:
sudo systemctl daemon-reload
```
-### 14. Install libraries, migrations, etc
+### 10. Install libraries, migrations, etc
```shell
cd /home/git/gitlab
-sudo -u git -H bundle install --deployment --without development test mysql aws kerberos
+# If you haven't done so during installation or a previous upgrade already
+sudo -u git -H bundle config set deployment 'true'
+sudo -u git -H bundle config set without 'development test mysql aws kerberos'
+
+# Update gems
+sudo -u git -H bundle install
# Optional: clean up old gems
sudo -u git -H bundle clean
@@ -334,7 +282,6 @@ sudo -u git -H bundle clean
sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production
# Compile GetText PO files
-
sudo -u git -H bundle exec rake gettext:compile RAILS_ENV=production
# Update node dependencies and recompile assets
@@ -344,6 +291,54 @@ sudo -u git -H bundle exec rake yarn:install gitlab:assets:clean gitlab:assets:c
sudo -u git -H bundle exec rake cache:clear RAILS_ENV=production
```
+### 11. Update GitLab Shell
+
+```shell
+cd /home/git/gitlab-shell
+
+sudo -u git -H git fetch --all --tags --prune
+sudo -u git -H git checkout v$(</home/git/gitlab/GITLAB_SHELL_VERSION)
+sudo -u git -H make build
+```
+
+### 12. Update GitLab Workhorse
+
+Install and compile GitLab Workhorse.
+
+```shell
+cd /home/git/gitlab
+
+sudo -u git -H bundle exec rake "gitlab:workhorse:install[/home/git/gitlab-workhorse]" RAILS_ENV=production
+```
+
+### 13. Update Gitaly
+
+#### Compile Gitaly
+
+```shell
+cd /home/git/gitaly
+sudo -u git -H git fetch --all --tags --prune
+sudo -u git -H git checkout v$(</home/git/gitlab/GITALY_SERVER_VERSION)
+sudo -u git -H make
+```
+
+### 14. Update GitLab Pages
+
+#### Only needed if you use GitLab Pages
+
+Install and compile GitLab Pages. GitLab Pages uses
+[GNU Make](https://www.gnu.org/software/make/).
+If you are not using Linux you may have to run `gmake` instead of
+`make` below.
+
+```shell
+cd /home/git/gitlab-pages
+
+sudo -u git -H git fetch --all --tags --prune
+sudo -u git -H git checkout v$(</home/git/gitlab/GITLAB_PAGES_VERSION)
+sudo -u git -H make
+```
+
### 15. Start application
```shell
diff --git a/doc/user/abuse_reports.md b/doc/user/abuse_reports.md
index 935fca8209f..e2f2038f240 100644
--- a/doc/user/abuse_reports.md
+++ b/doc/user/abuse_reports.md
@@ -4,7 +4,7 @@ group: unassigned
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Abuse reports
+# Abuse reports **(FREE)**
You can report abuse from other GitLab users to GitLab administrators.
@@ -12,7 +12,7 @@ A GitLab administrator [can then choose](admin_area/abuse_reports.md) to:
- Remove the user, which deletes them from the instance.
- Block the user, which denies them access to the instance.
-- Or remove the report, which retains the users access to the instance.
+- Or remove the report, which retains the user's access to the instance.
You can report a user through their:
diff --git a/doc/user/admin_area/analytics/index.md b/doc/user/admin_area/analytics/index.md
index 5cf5e33f2d2..bea22745e7b 100644
--- a/doc/user/admin_area/analytics/index.md
+++ b/doc/user/admin_area/analytics/index.md
@@ -14,4 +14,3 @@ There are several kinds of statistics:
- [DevOps Report](dev_ops_report.md): Provides an overview of your entire instance's feature usage. **(FREE)**
- [Usage Trends](usage_trends.md): Shows how much data your instance contains, and how that is changing. **(FREE)**
-- [User Cohorts](user_cohorts.md): Display the monthly cohorts of new users and their activities over time. **(FREE)**
diff --git a/doc/user/admin_area/analytics/instance_statistics.md b/doc/user/admin_area/analytics/instance_statistics.md
deleted file mode 100644
index e44dd891029..00000000000
--- a/doc/user/admin_area/analytics/instance_statistics.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-redirect_to: 'usage_trends.md'
----
-
-This document was moved to [another location](usage_trends.md).
-
-<!-- This redirect file can be deleted after <2022-03-20>. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/user/admin_area/analytics/usage_trends.md b/doc/user/admin_area/analytics/usage_trends.md
index 0c0cae09c16..38cd2dee4e9 100644
--- a/doc/user/admin_area/analytics/usage_trends.md
+++ b/doc/user/admin_area/analytics/usage_trends.md
@@ -40,22 +40,3 @@ in the categories shown in [Total counts](#total-counts).
These charts help you visualize how rapidly these records are being created on your instance.
![Instance Activity Pipelines chart](img/instance_activity_pipelines_chart_v13_6.png)
-
-### Enable or disable Usage Trends
-
-In GitLab version 13.5 only, Usage Trends was under development and not ready for production use.
-It was deployed behind a feature flag that was **disabled by default**.
-[GitLab administrators with access to the GitLab Rails console](../../../administration/feature_flags.md)
-can opt to enable it.
-
-To enable it:
-
-```ruby
-Feature.enable(:instance_statistics)
-```
-
-To disable it:
-
-```ruby
-Feature.disable(:instance_statistics)
-```
diff --git a/doc/user/admin_area/analytics/user_cohorts.md b/doc/user/admin_area/analytics/user_cohorts.md
index a7c93160b69..ca5dff85757 100644
--- a/doc/user/admin_area/analytics/user_cohorts.md
+++ b/doc/user/admin_area/analytics/user_cohorts.md
@@ -1,36 +1,8 @@
---
-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_cohorts.md'
---
-# Cohorts **(FREE)**
+This document was moved to [another location](../user_cohorts.md).
-As a benefit of having the [usage ping active](../settings/usage_statistics.md),
-you can analyze your users' GitLab activities over time.
-
-To see user cohorts, go to **Admin Area > Overview > Users**.
-
-## Overview
-
-How do you interpret the user cohorts table? Let's review an example with the
-following user cohorts:
-
-![User cohort example](img/cohorts_v13_9.png)
-
-For the cohort of March 2020, three users were added to this server and have
-been active since this month. One month later (April 2020), two users are still
-active. Five months later (August 2020), one user from this cohort is still
-active, or 33% of the original cohort of three that joined in March.
-
-The **Inactive users** column shows the number of users who were added during
-the month, but who never had any activity in the instance.
-
-How do we measure the activity of users? GitLab considers a user active if:
-
-- The user signs in.
-- The user has Git activity (whether push or pull).
-- The user visits pages related to dashboards, projects, issues, or merge
- requests ([introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/54947) in GitLab 11.8).
-- The user uses the API.
-- The user uses the GraphQL API.
+<!-- This redirect file can be deleted after <2021-06-01>. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/user/admin_area/approving_users.md b/doc/user/admin_area/approving_users.md
index af4d4e86e69..9141d7f488d 100644
--- a/doc/user/admin_area/approving_users.md
+++ b/doc/user/admin_area/approving_users.md
@@ -7,30 +7,49 @@ type: howto
# Users pending approval
-> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/4491) in GitLab 13.5.
+A user in _pending approval_ state requires action by an administrator. A user sign up can be in a
+pending approval state because an administrator has enabled either, or both, of the following
+options:
-When [Require admin approval for new sign-ups](settings/sign_up_restrictions.md#require-administrator-approval-for-new-sign-ups) is enabled, any user that signs up for an account using the registration form is placed under a **Pending approval** state.
+- [Require admin approval for new sign-ups](settings/sign_up_restrictions.md#require-administrator-approval-for-new-sign-ups) setting.
+- [User cap](settings/sign_up_restrictions.md#user-cap).
-A user pending approval is functionally identical to a [blocked](blocking_unblocking_users.md) user.
+When a user registers for an account while this setting is enabled:
+
+- The user is placed in a **Pending approval** state.
+- The user sees a message telling them their account is awaiting approval by an administrator.
A user pending approval:
-- Will not be able to sign in.
-- Cannot access Git repositories or the API.
-- Will not receive any notifications from GitLab.
+- Is functionally identical to a [blocked](blocking_unblocking_users.md) user.
+- Cannot sign in.
+- Cannot access Git repositories or the GitLab API.
+- Does not receive any notifications from GitLab.
- Does not consume a [seat](../../subscriptions/self_managed/index.md#billable-users).
-## Approving a user
+An administrator must [approve their sign up](#approve-or-reject-a-user-sign-up) to allow them to
+sign in.
+
+## View user sign ups pending approval
+
+To view user sign ups pending approval:
+
+1. Go to **Admin Area > Overview > Users**.
+1. Select the **Pending approval** tab.
+
+## Approve or reject a user sign up
+
+A user sign up pending approval can be approved or rejected from the Admin Area.
-A user that is pending approval can be approved from the Admin Area. To do this:
+To approve or reject a user sign up:
-1. Navigate to **Admin Area > Overview > Users**.
-1. Click on the **Pending approval** tab.
-1. Select a user.
-1. Under the **Account** tab, click **Approve user**.
+1. Go to **Admin Area > Overview > Users**.
+1. Select the **Pending approval** tab.
+1. In the user's row select settings (**{settings}**).
+1. Select **Approve** or **Reject**.
Approving a user:
-1. Activates their account.
-1. Changes the user's state to active and it consumes a
-[seat](../../subscriptions/self_managed/index.md#billable-users).
+- Activates their account.
+- Changes the user's state to active.
+- Consumes a subscription [seat](../../subscriptions/self_managed/index.md#billable-users).
diff --git a/doc/user/admin_area/credentials_inventory.md b/doc/user/admin_area/credentials_inventory.md
index 02659276b53..053cee82634 100644
--- a/doc/user/admin_area/credentials_inventory.md
+++ b/doc/user/admin_area/credentials_inventory.md
@@ -11,7 +11,9 @@ type: howto
GitLab administrators are responsible for the overall security of their instance. To assist, GitLab provides a Credentials inventory to keep track of all the credentials that can be used to access their self-managed instance.
-Using Credentials inventory, you can see all the personal access tokens (PAT) and SSH keys that exist in your GitLab instance. In addition, you can [revoke](#revoke-a-users-personal-access-token) and [delete](#delete-a-users-ssh-key) and see:
+Using Credentials inventory, you can see all the personal access tokens (PAT), SSH keys, and GPG keys
+that exist in your GitLab instance. In addition, you can [revoke](#revoke-a-users-personal-access-token)
+and [delete](#delete-a-users-ssh-key) and see:
- Who they belong to.
- Their access scope.
@@ -23,7 +25,7 @@ To access the Credentials inventory, navigate to **Admin Area > Credentials**.
The following is an example of the Credentials inventory page:
-![Credentials inventory page](img/credentials_inventory_v13_4.png)
+![Credentials inventory page](img/credentials_inventory_v13_10.png)
## Revoke a user's personal access token
@@ -31,7 +33,7 @@ The following is an example of the Credentials inventory page:
If you see a **Revoke** button, you can revoke that user's PAT. Whether you see a **Revoke** button depends on the token state, and if an expiration date has been set. For more information, see the following table:
-| Token state | [Token expiry enforced?](settings/account_and_limit_settings.md#optional-enforcement-of-personal-access-token-expiry) | Show Revoke button? | Comments |
+| Token state | [Token expiration enforced?](settings/account_and_limit_settings.md#optional-non-enforcement-of-personal-access-token-expiration) | Show Revoke button? | Comments |
|-------------|------------------------|--------------------|----------------------------------------------------------------------------|
| Active | Yes | Yes | Allows administrators to revoke the PAT, such as for a compromised account |
| Active | No | Yes | Allows administrators to revoke the PAT, such as for a compromised account |
@@ -50,3 +52,39 @@ You can **Delete** a user's SSH key by navigating to the credentials inventory's
The instance then notifies the user.
![Credentials inventory page - SSH keys](img/credentials_inventory_ssh_keys_v13_5.png)
+
+## Review existing GPG keys
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/282429) in GitLab 13.10.
+> - It's [deployed behind a feature flag](../feature_flags.md), disabled by default.
+> - It's disabled on GitLab.com.
+> - It's not recommended for production use.
+> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-the-gpg-keys-view).
+
+You can view all existing GPG in your GitLab instance by navigating to the
+credentials inventory GPG Keys tab, as well as the following properties:
+
+- Who the GPG key belongs to.
+- The ID of the GPG key.
+- Whether the GPG key is [verified or unverified](../project/repository/gpg_signed_commits/index.md)
+
+![Credentials inventory page - GPG keys](img/credentials_inventory_gpg_keys_v13_10.png)
+
+### Enable or disable the GPG keys view
+
+Enabling or disabling the GPG keys view is under development and not ready for production use. It is
+deployed behind a feature flag that is **disabled by default**.
+[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
+can enable it.
+
+To enable it:
+
+```ruby
+Feature.enable(:credential_inventory_gpg_keys)
+```
+
+To disable it:
+
+```ruby
+Feature.disable(:credential_inventory_gpg_keys)
+```
diff --git a/doc/user/admin_area/analytics/img/cohorts_v13_9.png b/doc/user/admin_area/img/cohorts_v13_9.png
index 6a616b201c9..6a616b201c9 100644
--- a/doc/user/admin_area/analytics/img/cohorts_v13_9.png
+++ b/doc/user/admin_area/img/cohorts_v13_9.png
Binary files differ
diff --git a/doc/user/admin_area/img/credentials_inventory_gpg_keys_v13_10.png b/doc/user/admin_area/img/credentials_inventory_gpg_keys_v13_10.png
new file mode 100644
index 00000000000..2486332c477
--- /dev/null
+++ b/doc/user/admin_area/img/credentials_inventory_gpg_keys_v13_10.png
Binary files differ
diff --git a/doc/user/admin_area/img/credentials_inventory_v13_10.png b/doc/user/admin_area/img/credentials_inventory_v13_10.png
new file mode 100644
index 00000000000..e41bbf35a8e
--- /dev/null
+++ b/doc/user/admin_area/img/credentials_inventory_v13_10.png
Binary files differ
diff --git a/doc/user/admin_area/img/credentials_inventory_v13_4.png b/doc/user/admin_area/img/credentials_inventory_v13_4.png
deleted file mode 100644
index 06925ea2f6f..00000000000
--- a/doc/user/admin_area/img/credentials_inventory_v13_4.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/admin_area/index.md b/doc/user/admin_area/index.md
index b5e51e8d4c0..40e0e2856bd 100644
--- a/doc/user/admin_area/index.md
+++ b/doc/user/admin_area/index.md
@@ -33,7 +33,7 @@ The Admin Area is made up of the following sections:
| **{cloud-gear}** Kubernetes | Create and manage instance-level [Kubernetes clusters](../instance/clusters/index.md). |
| **{push-rules}** Push rules **(STARTER ONLY)** | Configure pre-defined Git [push rules](../../push_rules/push_rules.md) for projects. Also, configure [merge requests approvers rules](merge_requests_approvals.md). **(PREMIUM SELF)** |
| **{location-dot}** Geo **(PREMIUM SELF)** | Configure and maintain [Geo nodes](geo_nodes.md). |
-| **{key}** Deploy keys | Create instance-wide [SSH deploy keys](../../ssh/README.md#deploy-keys). |
+| **{key}** Deploy keys | Create instance-wide [SSH deploy keys](../project/deploy_keys/index.md). |
| **{lock}** Credentials **(ULTIMATE SELF)** | View [credentials](credentials_inventory.md) that can be used to access your instance. |
| **{template}** Service Templates | Create [service templates](../project/integrations/services_templates.md) for projects. |
| **{labels}** Labels | Create and maintain [labels](labels.md) for your GitLab instance. |
@@ -157,6 +157,22 @@ All impersonation activities are [captured with audit events](../../administrati
![user impersonation button](img/impersonate_user_button_v13_8.png)
+#### User Permission Export **(PREMIUM SELF)**
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/1772) in GitLab 13.8.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/292436) in GitLab 13.9.
+
+An administrator can export user permissions for all users in the GitLab instance from the Admin Area's Users page.
+The export lists direct membership the users have in groups and projects.
+
+The following data is included in the export:
+
+- Username
+- Email
+- Type
+- Path
+- Access level ([Project](../permissions.md#project-members-permissions) and [Group](../permissions.md#group-members-permissions))
+
#### Users statistics
The **Users statistics** page provides an overview of user accounts by role. These statistics are
@@ -170,6 +186,10 @@ The following totals are also included:
GitLab billing is based on the number of [**Billable users**](../../subscriptions/self_managed/index.md#billable-users).
+### User cohorts
+
+The [Cohorts](user_cohorts.md) tab displays the monthly cohorts of new users and their activities over time.
+
### Administering Groups
You can administer all groups in the GitLab instance from the Admin Area's Groups page.
@@ -187,7 +207,7 @@ sort order is by **Last created**.
To search for groups by name, enter your criteria in the search field. The group search is case
insensitive, and applies partial matching.
-To [Create a new group](../group/index.md#create-a-new-group) click **New group**.
+To [Create a new group](../group/index.md#create-a-group) click **New group**.
### Administering Jobs
diff --git a/doc/user/admin_area/license.md b/doc/user/admin_area/license.md
index 505f54e9ae9..89417de4bab 100644
--- a/doc/user/admin_area/license.md
+++ b/doc/user/admin_area/license.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: howto
---
-# Activate GitLab EE with a license **(STARTER ONLY)**
+# Activate GitLab EE with a license **(PREMIUM SELF)**
To activate all GitLab Enterprise Edition (EE) functionality, you need to upload
a license. It's only possible to activate GitLab Enterprise Edition, so first verify which edition
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 70416c224c7..0f391118215 100644
--- a/doc/user/admin_area/settings/account_and_limit_settings.md
+++ b/doc/user/admin_area/settings/account_and_limit_settings.md
@@ -152,20 +152,20 @@ To set a limit on how long these sessions are valid:
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/3649) in GitLab Ultimate 12.6.
-Users can optionally specify an expiration date for
+Users can optionally specify a lifetime for
[personal access tokens](../../profile/personal_access_tokens.md).
-This expiration date is not a requirement, and can be set to any arbitrary date.
+This lifetime is not a requirement, and can be set to any arbitrary number of days.
Personal access tokens are the only tokens needed for programmatic access to GitLab.
However, organizations with security requirements may want to enforce more protection by
requiring the regular rotation of these tokens.
-### Setting a limit
+### Setting a lifetime
-Only a GitLab administrator can set a limit. Leaving it empty means
+Only a GitLab administrator can set a lifetime. Leaving it empty means
there are no restrictions.
-To set a limit on how long personal access tokens are valid:
+To set a lifetime on how long personal access tokens are valid:
1. Navigate to **Admin Area > Settings > General**.
1. Expand the **Account and limit** section.
@@ -180,24 +180,28 @@ Once a lifetime for personal access tokens is set, GitLab:
allowed lifetime. Three hours is given to allow administrators to change the allowed lifetime,
or remove it, before revocation takes place.
-## Enforcement of SSH key expiration **(ULTIMATE SELF)**
+## Optional enforcement of SSH key expiration **(ULTIMATE SELF)**
-GitLab administrators can choose to enforce the expiration of SSH keys after their expiration dates.
-If you enable this feature, this disables all _expired_ SSH keys.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/250480) in GitLab 13.9.
-To do this:
+By default, expired SSH keys **can still be used**.
+You can prevent the use of expired SSH keys with the following steps:
1. Navigate to **Admin Area > Settings > General**.
1. Expand the **Account and limit** section.
1. Select the **Enforce SSH key expiration** checkbox.
-## Optional enforcement of Personal Access Token expiry **(ULTIMATE SELF)**
+Enforcing SSH key expiration immediately disables all expired SSH keys.
+
+For more information, see the following issue on [SSH key expiration](https://gitlab.com/gitlab-org/gitlab/-/issues/320970).
+
+## Optional non-enforcement of Personal Access Token expiration **(ULTIMATE SELF)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/214723) in GitLab Ultimate 13.1.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/296881) in GitLab 13.9.
-GitLab administrators can choose to prevent personal access tokens from expiring
-automatically. The tokens are usable after the expiry date, unless they are revoked explicitly.
+By default, expired personal access tokens (PATs) cannot be used.
+You can allow the use of expired PATs with the following steps:
To do this:
diff --git a/doc/user/admin_area/settings/continuous_integration.md b/doc/user/admin_area/settings/continuous_integration.md
index 761fc6477d6..3d19bde9a26 100644
--- a/doc/user/admin_area/settings/continuous_integration.md
+++ b/doc/user/admin_area/settings/continuous_integration.md
@@ -27,7 +27,7 @@ From now on, every existing project and newly created ones that don't have a
`.gitlab-ci.yml`, will use the Auto DevOps pipelines.
If you want to disable it for a specific project, you can do so in
-[its settings](../../../topics/autodevops/index.md#enablingdisabling-auto-devops).
+[its settings](../../../topics/autodevops/index.md#enable-or-disable-auto-devops).
## Maximum artifacts size **(FREE SELF)**
@@ -50,15 +50,15 @@ To change it at the:
1. Change the value of maximum artifacts size (in MB).
1. Click **Save changes** for the changes to take effect.
-- [Group level](../../group/index.md#group-settings) (this will override the instance setting):
+- Group level (this will override the instance setting):
- 1. Go to the group's **Settings > CI / CD > General Pipelines**.
+ 1. Go to the group's **Settings > CI/CD > General Pipelines**.
1. Change the value of **maximum artifacts size (in MB)**.
1. Click **Save changes** for the changes to take effect.
-- [Project level](../../../ci/pipelines/settings.md) (this will override the instance and group settings):
+- Project level (this will override the instance and group settings):
- 1. Go to the project's **Settings > CI / CD > General Pipelines**.
+ 1. Go to the project's **Settings > CI/CD > General Pipelines**.
1. Change the value of **maximum artifacts size (in MB)**.
1. Click **Save changes** for the changes to take effect.
@@ -99,6 +99,13 @@ are allowed to expire.
This setting takes precedence over the [project level setting](../../../ci/pipelines/job_artifacts.md#keep-artifacts-from-most-recent-successful-jobs).
If disabled at the instance level, you cannot enable this per-project.
+To disable the setting:
+
+1. Go to **Admin Area > Settings > CI/CD**.
+1. Expand **Continuous Integration and Deployment**.
+1. Clear the **Keep the latest artifacts for all jobs in the latest successful pipelines** checkbox.
+1. Click **Save changes**
+
When you disable the feature, the latest artifacts do not immediately expire.
A new pipeline must run before the latest artifacts can expire and be deleted.
diff --git a/doc/user/admin_area/settings/index.md b/doc/user/admin_area/settings/index.md
index 3377b1674db..cbdc617d7d9 100644
--- a/doc/user/admin_area/settings/index.md
+++ b/doc/user/admin_area/settings/index.md
@@ -35,7 +35,7 @@ Access the default page for admin area settings by navigating to **Admin Area >
| ------ | ----------- |
| [Elasticsearch](../../../integration/elasticsearch.md#enabling-advanced-search) | Elasticsearch integration. Elasticsearch AWS IAM. |
| [Kroki](../../../administration/integration/kroki.md#enable-kroki-in-gitlab) | Allow rendering of diagrams in AsciiDoc and Markdown documents using [kroki.io](https://kroki.io). |
-| [PlantUML](../../../administration/integration/plantuml.md#gitlab) | Allow rendering of PlantUML diagrams in AsciiDoc and Markdown documents. |
+| [PlantUML](../../../administration/integration/plantuml.md) | Allow rendering of PlantUML diagrams in documents. |
| [Slack application](../../../user/project/integrations/gitlab_slack_application.md#configuration) **(FREE SAAS)** | Slack integration allows you to interact with GitLab via slash commands in a chat window. This option is only available on GitLab.com, though it may be [available for self-managed instances in the future](https://gitlab.com/gitlab-org/gitlab/-/issues/28164). |
| [Third party offers](third_party_offers.md) | Control the display of third party offers. |
| [Snowplow](../../../development/snowplow.md) | Configure the Snowplow integration. |
diff --git a/doc/user/admin_area/settings/instance_template_repository.md b/doc/user/admin_area/settings/instance_template_repository.md
index 7630f0c2fbd..600d99934aa 100644
--- a/doc/user/admin_area/settings/instance_template_repository.md
+++ b/doc/user/admin_area/settings/instance_template_repository.md
@@ -5,9 +5,9 @@ info: "To determine the technical writer assigned to the Stage/Group associated
type: reference
---
-# Instance template repository **(PREMIUM SELF)** **(FREE)**
+# Instance template repository **(PREMIUM SELF)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/5986) in [GitLab Premium](https://about.gitlab.com/pricing/) 11.3.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/5986) in GitLab Premium 11.3.
In hosted systems, enterprises often have a need to share their own templates
across teams. This feature allows an administrator to pick a project to be the
@@ -23,7 +23,7 @@ select the project to serve as the custom template repository.
![File templates in the Admin Area](img/file_template_admin_area.png)
After that, you can add custom templates to the selected repository and use them for the entire instance.
-They will be available on the [Web Editor's dropdown](../../project/repository/web_editor.md#template-dropdowns)
+They are available in the [Web Editor's dropdown](../../project/repository/web_editor.md#template-dropdowns)
and through the [API settings](../../../api/settings.md).
Templates must be added to a specific subdirectory in the repository,
@@ -60,12 +60,12 @@ extension and not be empty. So, the hierarchy should look like this:
|-- another_metrics-dashboard.yml
```
-Your custom templates will be displayed on the dropdown menu when a new file is added through the GitLab UI:
+Your custom templates are displayed on the dropdown menu when a new file is added through the GitLab UI:
![Custom template dropdown menu](img/file_template_user_dropdown.png)
-If this feature is disabled or no templates are present, there will be
-no "Custom" section in the selection dropdown.
+If this feature is disabled or no templates are present,
+no **Custom** section displays in the selection dropdown.
<!-- ## Troubleshooting
diff --git a/doc/user/admin_area/settings/project_integration_management.md b/doc/user/admin_area/settings/project_integration_management.md
index 18491f92650..0b9f039880a 100644
--- a/doc/user/admin_area/settings/project_integration_management.md
+++ b/doc/user/admin_area/settings/project_integration_management.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Project integration management
+# Project integration management **(FREE)**
Project integrations can be configured and enabled by project administrators. As a GitLab instance
administrator, you can set default configuration parameters for a given integration that all projects
diff --git a/doc/user/admin_area/settings/push_event_activities_limit.md b/doc/user/admin_area/settings/push_event_activities_limit.md
index 1d6424face0..7032c1031a9 100644
--- a/doc/user/admin_area/settings/push_event_activities_limit.md
+++ b/doc/user/admin_area/settings/push_event_activities_limit.md
@@ -14,7 +14,7 @@ allowed at once. If the number of events is greater than this, GitLab creates
bulk push event instead.
For example, if 4 branches are pushed and the limit is currently set to 3,
-you'll see the following in the activity feed:
+the activity feed displays:
![Bulk push event](img/bulk_push_event_v12_4.png)
diff --git a/doc/user/admin_area/settings/sign_up_restrictions.md b/doc/user/admin_area/settings/sign_up_restrictions.md
index 0945471b11b..0078db286a8 100644
--- a/doc/user/admin_area/settings/sign_up_restrictions.md
+++ b/doc/user/admin_area/settings/sign_up_restrictions.md
@@ -30,7 +30,7 @@ To disable sign ups:
> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/4491) in GitLab 13.5.
> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/267568) in GitLab 13.6.
-When this setting is enabled, any user visiting your GitLab domain and signing up for a new account must be explicitly [approved](../approving_users.md#approving-a-user) by an administrator before they can start using their account. This setting is enabled by default for newly created instances. This setting is only applicable if sign ups are enabled.
+When this setting is enabled, any user visiting your GitLab domain and signing up for a new account must be explicitly [approved](../approving_users.md#approve-or-reject-a-user-sign-up) by an administrator before they can start using their account. In GitLab 13.6 and later, this setting is enabled by default for new GitLab instances. It is only applicable if sign ups are enabled.
To require administrator approval for new sign ups:
@@ -56,10 +56,29 @@ To enforce confirmation of the email address used for new sign ups:
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/292600) in GitLab 13.9.
When the number of billable users reaches the user cap, any user who is added or requests access must be
-[approved](../approving_users.md#approving-a-user) by an administrator before they can start using
+[approved](../approving_users.md#approve-or-reject-a-user-sign-up) by an administrator before they can start using
their account.
-If an administrator increases or removes the user cap, the users in pending approval state are
+If an administrator [increases](#set-the-user-cap-number) or [removes](#remove-the-user-cap) the
+user cap, the users in pending approval state are automatically approved in a background job.
+
+### Set the user cap number
+
+1. Go to **Admin Area > Settings > General**.
+1. Expand **Sign-up restrictions**.
+1. Enter a number in **User cap**.
+1. Select **Save changes**.
+
+New user sign ups are subject to the user cap restriction.
+
+## Remove the user cap
+
+1. Go to **Admin Area > Settings > General**.
+1. Expand **Sign-up restrictions**.
+1. Remove the number from **User cap**.
+1. Select **Save changes**.
+
+New users sign ups are not subject to the user cap restriction. Users in pending approval state are
automatically approved in a background job.
## Soft email confirmation
diff --git a/doc/user/admin_area/settings/usage_statistics.md b/doc/user/admin_area/settings/usage_statistics.md
index 2bb6adbc32b..ada44115cec 100644
--- a/doc/user/admin_area/settings/usage_statistics.md
+++ b/doc/user/admin_area/settings/usage_statistics.md
@@ -61,7 +61,7 @@ sequenceDiagram
## Usage Ping **(FREE SELF)**
-See [Usage Ping guide](../../../development/usage_ping.md).
+See [Usage Ping guide](../../../development/usage_ping/index.md).
## Instance-level analytics availability
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 0fcdbf3ca90..e335a9031d5 100644
--- a/doc/user/admin_area/settings/visibility_and_access_controls.md
+++ b/doc/user/admin_area/settings/visibility_and_access_controls.md
@@ -29,7 +29,7 @@ To change the default branch protection:
For more details, see [Protected branches](../../project/protected_branches.md).
-To change this setting for a specific group, see [Default branch protection for groups](../../group/index.md#changing-the-default-branch-protection-of-a-group)
+To change this setting for a specific group, see [Default branch protection for groups](../../group/index.md#change-the-default-branch-protection-of-a-group)
### Disable group owners from updating default branch protection **(PREMIUM SELF)**
@@ -55,7 +55,7 @@ To change the default project creation protection:
1. Select the desired option.
1. Click **Save changes**.
-For more details, see [Default project-creation level](../../group/index.md#default-project-creation-level).
+For more details, see [Specify who can add projects to a group](../../group/index.md#specify-who-can-add-projects-to-a-group).
## Default project deletion protection **(PREMIUM SELF)**
@@ -79,7 +79,7 @@ The default behavior of [Delayed Project deletion](https://gitlab.com/gitlab-org
[Immediate deletion](https://gitlab.com/gitlab-org/gitlab/-/issues/220382) in GitLab 13.2.
Projects in a group (but not a personal namespace) can be deleted after a delayed period, by
-[configuring in Group Settings](../../group/index.md#enabling-delayed-project-removal).
+[configuring in Group Settings](../../group/index.md#enable-delayed-project-removal).
The default period is seven days, and can be changed. Setting this period to `0` enables immediate removal
of projects or groups.
diff --git a/doc/user/admin_area/user_cohorts.md b/doc/user/admin_area/user_cohorts.md
new file mode 100644
index 00000000000..f3c913b409a
--- /dev/null
+++ b/doc/user/admin_area/user_cohorts.md
@@ -0,0 +1,36 @@
+---
+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
+---
+
+# Cohorts **(FREE)**
+
+As a benefit of having the [usage ping active](settings/usage_statistics.md),
+you can analyze your users' GitLab activities over time.
+
+To see user cohorts, go to **Admin Area > Overview > Users**.
+
+## Overview
+
+How do you interpret the user cohorts table? Let's review an example with the
+following user cohorts:
+
+![User cohort example](img/cohorts_v13_9.png)
+
+For the cohort of March 2020, three users were added to this server and have
+been active since this month. One month later (April 2020), two users are still
+active. Five months later (August 2020), one user from this cohort is still
+active, or 33% of the original cohort of three that joined in March.
+
+The **Inactive users** column shows the number of users who were added during
+the month, but who never had any activity in the instance.
+
+How do we measure the activity of users? GitLab considers a user active if:
+
+- The user signs in.
+- The user has Git activity (whether push or pull).
+- The user visits pages related to dashboards, projects, issues, or merge
+ requests ([introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/54947) in GitLab 11.8).
+- The user uses the API.
+- The user uses the GraphQL API.
diff --git a/doc/user/analytics/img/mr_mean_time_to_merge_metric_v13_9.png b/doc/user/analytics/img/mr_mean_time_to_merge_metric_v13_9.png
new file mode 100644
index 00000000000..ad108dabf73
--- /dev/null
+++ b/doc/user/analytics/img/mr_mean_time_to_merge_metric_v13_9.png
Binary files differ
diff --git a/doc/user/analytics/index.md b/doc/user/analytics/index.md
index f5da373ee6d..fe35d575373 100644
--- a/doc/user/analytics/index.md
+++ b/doc/user/analytics/index.md
@@ -61,6 +61,6 @@ The following analytics features are available at the project level:
- [Insights](../project/insights/index.md). **(ULTIMATE)**
- [Issue](../group/issues_analytics/index.md). **(PREMIUM)**
- [Merge Request](merge_request_analytics.md), enabled with the `project_merge_request_analytics`
- [feature flag](../../development/feature_flags/development.md#enabling-a-feature-flag-locally-in-development). **(PREMIUM)**
+ [feature flag](../../development/feature_flags/index.md#enabling-a-feature-flag-locally-in-development). **(PREMIUM)**
- [Repository](repository_analytics.md). **(FREE)**
- [Value Stream](value_stream_analytics.md). **(FREE)**
diff --git a/doc/user/analytics/merge_request_analytics.md b/doc/user/analytics/merge_request_analytics.md
index 3edbe3e8aa4..909eb7e585f 100644
--- a/doc/user/analytics/merge_request_analytics.md
+++ b/doc/user/analytics/merge_request_analytics.md
@@ -39,6 +39,15 @@ Merge Request Analytics could be used when:
The following visualizations and data are available, representing all merge requests that were merged in the given date range.
+### Mean time to merge
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/229389) in GitLab 13.9.
+
+The mean time to merge (MTTM) metric shows the average time between when a merge request is created,
+and when it is merged. To view how the MTTM changes over time, compare MTTM across different date ranges.
+
+![Mean time to merge](img/mr_mean_time_to_merge_metric_v13_9.png "Merge Request Analytics - MTTM metric showing the average time it takes from initiating a MR to being merged")
+
### Throughput chart
The throughput chart shows the number of merge requests merged per month.
diff --git a/doc/user/application_security/api_fuzzing/img/api_fuzzing_postman_collection_edit_variable.png b/doc/user/application_security/api_fuzzing/img/api_fuzzing_postman_collection_edit_variable.png
new file mode 100644
index 00000000000..3a2799ecdc1
--- /dev/null
+++ b/doc/user/application_security/api_fuzzing/img/api_fuzzing_postman_collection_edit_variable.png
Binary files differ
diff --git a/doc/user/application_security/api_fuzzing/img/api_fuzzing_postman_environment_edit_variable.png b/doc/user/application_security/api_fuzzing/img/api_fuzzing_postman_environment_edit_variable.png
new file mode 100644
index 00000000000..656ba7652cd
--- /dev/null
+++ b/doc/user/application_security/api_fuzzing/img/api_fuzzing_postman_environment_edit_variable.png
Binary files differ
diff --git a/doc/user/application_security/api_fuzzing/img/api_fuzzing_postman_request_edit.png b/doc/user/application_security/api_fuzzing/img/api_fuzzing_postman_request_edit.png
new file mode 100644
index 00000000000..3750af8f455
--- /dev/null
+++ b/doc/user/application_security/api_fuzzing/img/api_fuzzing_postman_request_edit.png
Binary files differ
diff --git a/doc/user/application_security/api_fuzzing/index.md b/doc/user/application_security/api_fuzzing/index.md
index 49311ccc7cd..f2b43e0abd9 100644
--- a/doc/user/application_security/api_fuzzing/index.md
+++ b/doc/user/application_security/api_fuzzing/index.md
@@ -25,7 +25,7 @@ you can run fuzz tests as part your CI/CD workflow.
- GraphQL
- Form bodies, JSON, or XML
- One of the following assets to provide APIs to test:
- - OpenAPI v2 API definition
+ - OpenAPI v2 or v3 API definition
- HTTP Archive (HAR) of API requests to test
- Postman Collection v2.0 or v2.1
@@ -54,7 +54,7 @@ changes, other pipelines, or other scanners) during a scan could cause inaccurat
There are three ways to perform scans. See the configuration section for the one you wish to use:
-- [OpenAPI v2 specification](#openapi-specification)
+- [OpenAPI v2 or v3 specification](#openapi-specification)
- [HTTP Archive (HAR)](#http-archive-har)
- [Postman Collection v2.0 or v2.1](#postman-collection)
@@ -64,13 +64,29 @@ Examples of both configurations can be found here:
- [Example HTTP Archive (HAR) project](https://gitlab.com/gitlab-org/security-products/demos/api-fuzzing-example/-/tree/har)
- [Example Postman Collection project](https://gitlab.com/gitlab-org/security-products/demos/api-fuzzing/postman-api-fuzzing-example)
+WARNING:
+GitLab 14.0 will require that you place API fuzzing configuration files (for example,
+`gitlab-api-fuzzing-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.
+
### OpenAPI Specification
+> Support for OpenAPI Specification v3 was
+> [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/228652) in GitLab 13.9.
+
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 by using
an OpenAPI specification to provide information about the target API to test. OpenAPI specifications
are provided as a file system resource or URL.
+API fuzzing uses an OpenAPI document to generate the request body. When a request body is required,
+the body generation is limited to these body types:
+
+- `application/x-www-form-urlencoded`
+- `multipart/form-data`
+- `application/json`
+
Follow these steps to configure API fuzzing in GitLab with an OpenAPI specification:
1. To use API fuzzing, you must [include](../../../ci/yaml/README.md#includetemplate)
@@ -100,7 +116,7 @@ Follow these steps to configure API fuzzing in GitLab with an OpenAPI specificat
FUZZAPI_PROFILE: Quick-10
```
-1. Provide the location of the OpenAPI v2 specification. You can provide the specification as a file
+1. Provide the location of the OpenAPI specification. You can provide the specification as a file
or URL. Specify the location by adding the `FUZZAPI_OPENAPI` variable:
```yaml
@@ -327,6 +343,60 @@ WARNING:
the API can, it may also trigger bugs in the API. This includes actions like modifying and deleting
data. Only run fuzzing against a test server.
+#### 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/).
+You can use variables to store and reuse values in your requests and scripts. For example, you can
+edit the collection to add variables to the document:
+
+![Edit collection variable tab View](img/api_fuzzing_postman_collection_edit_variable.png)
+
+You can then use the variables in sections such as URL, headers, and others:
+
+![Edit request using variables View](img/api_fuzzing_postman_request_edit.png)
+
+Variables can be defined at different [scopes](https://learning.postman.com/docs/sending-requests/variables/#variable-scopes)
+(for example, Global, Collection, Environment, Local, and Data). In this example, they're defined at
+the Environment scope:
+
+![Edit environment variables View](img/api_fuzzing_postman_environment_edit_variable.png)
+
+When you export a Postman collection, only Postman collection variables are exported into the
+Postman file. For example, Postman does not export environment-scoped variables into the Postman
+file.
+
+By default, the API fuzzer uses the Postman file to resolve Postman variable values. If a JSON file
+is set in a GitLab CI environment 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`.
+
+Here is an example of using `FUZZAPI_POSTMAN_COLLECTION_VARIABLES`:
+
+```yaml
+include:
+ - template: API-Fuzzing.gitlab-ci.yml
+
+variables:
+ FUZZAPI_PROFILE: Quick-10
+ FUZZAPI_POSTMAN_COLLECTION: postman-collection_serviceA.json
+ FUZZAPI_TARGET_URL: http://test-deployment/
+ FUZZAPI_POSTMAN_COLLECTION_VARIABLES: variable-collection-dictionary.json
+```
+
+The file `variable-collection-dictionary.json` is a JSON document. This JSON is an object with
+key-value pairs for properties. The keys are the variables' names, and the values are the variables'
+values. For example:
+
+ ```json
+ {
+ "base_url": "http://127.0.0.1/",
+ "token": "Token 84816165151"
+ }
+ ```
+
### Authentication
Authentication is handled by providing the authentication token as a header or cookie. You can
@@ -502,6 +572,7 @@ repository's root as `.gitlab-api-fuzzing.yml`.
|[`FUZZAPI_OPENAPI`](#openapi-specification) | OpenAPI specification file or URL. |
|[`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. |
|[`FUZZAPI_OVERRIDES_FILE`](#overrides) | Path to a JSON file containing overrides. |
|[`FUZZAPI_OVERRIDES_ENV`](#overrides) | JSON string containing headers to override. |
|[`FUZZAPI_OVERRIDES_CMD`](#overrides) | Overrides command. |
@@ -523,11 +594,19 @@ repository's root as `.gitlab-api-fuzzing.yml`.
### Overrides
-API Fuzzing provides a method to add or override headers and cookies for all outbound HTTP requests.
+API Fuzzing provides a method to add or override specific items in your request, for example:
+
+- Headers
+- Cookies
+- Query string
+- Form data
+- JSON nodes
+- XML nodes
+
You can use this to inject semantic version headers, authentication, and so on. The
[authentication section](#authentication) includes examples of using overrides for that purpose.
-Overrides use a JSON document to define the headers and cookies:
+Overrides use a JSON document, where each type of override is represented by a JSON object:
```json
{
@@ -538,6 +617,22 @@ Overrides use a JSON document to define the headers and cookies:
"cookies": {
"cookie1": "value",
"cookie2": "value"
+ },
+ "query": {
+ "query-string1": "value",
+ "query-string2": "value"
+ },
+ "body-form": {
+ "form-param1": "value",
+ "form-param1": "value",
+ },
+ "body-json": {
+ "json-path1": "value",
+ "json-path2": "value",
+ },
+ "body-xml" : {
+ "xpath1": "value",
+ "xpath2": "value",
}
}
```
@@ -565,7 +660,94 @@ Example of setting both a header and cookie:
}
```
-You can provide this JSON document as a file or CI/CD variable. You may also provide a command
+Example usage for setting a `body-form` override:
+
+```json
+{
+ "body-form": {
+ "username": "john.doe"
+ }
+}
+```
+
+The override engine uses `body-form` when the request body has only form-data content.
+
+Example usage for setting a `body-json` override:
+
+```json
+{
+ "body-json": {
+ "$.credentials.access-token": "iddqd!42.$"
+ }
+}
+```
+
+Note that each JSON property name in the object `body-json` is set to a [JSON Path](https://goessner.net/articles/JsonPath/)
+expression. The JSON Path expression `$.credentials.access-token` identifies the node to be
+overridden with the value `iddqd!42.$`. The override engine uses `body-json` when the request body
+has only [JSON](https://www.json.org/json-en.html) content.
+
+For example, if the body is set to the following JSON:
+
+```json
+{
+ "credentials" : {
+ "username" :"john.doe",
+ "access-token" : "non-valid-password"
+ }
+}
+```
+
+It is changed to:
+
+```json
+{
+ "credentials" : {
+ "username" :"john.doe",
+ "access-token" : "iddqd!42.$"
+ }
+}
+```
+
+Here's an example for setting a `body-xml` override. The first entry overrides an XML attribute and
+the second entry overrides an XML element:
+
+```json
+{
+ "body-xml" : {
+ "/credentials/@isEnabled": "true",
+ "/credentials/access-token/text()" : "iddqd!42.$"
+ }
+}
+```
+
+Note that each JSON property name in the object `body-xml` is set to an
+[XPath v2](https://www.w3.org/TR/xpath20/)
+expression. The XPath expression `/credentials/@isEnabled` identifies the attribute node to override
+with the value `true`. The XPath expression `/credentials/access-token/text()` identifies the
+element node to override with the value `iddqd!42.$`. The override engine uses `body-xml` when the
+request body has only [XML](https://www.w3.org/XML/)
+content.
+
+For example, if the body is set to the following XML:
+
+```xml
+<credentials isEnabled="false">
+ <username>john.doe</username>
+ <access-token>non-valid-password</access-token>
+</credentials>
+```
+
+It is changed to:
+
+```xml
+<credentials isEnabled="true">
+ <username>john.doe</username>
+ <access-token>iddqd!42.$</access-token>
+</credentials>
+```
+
+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
@@ -762,7 +944,7 @@ pipelines. For more information, see the [Security Dashboard documentation](../s
Fuzzing faults show up as vulnerabilities with a severity of Unknown.
Once a fault is found, you can interact with it. Read more on how to
-[interact with the vulnerabilities](../index.md#interacting-with-the-vulnerabilities).
+[address the vulnerabilities](../index.md#addressing-vulnerabilities).
## Handling False Positives
diff --git a/doc/user/application_security/configuration/index.md b/doc/user/application_security/configuration/index.md
index fe21fdc1f15..4f00f228da8 100644
--- a/doc/user/application_security/configuration/index.md
+++ b/doc/user/application_security/configuration/index.md
@@ -5,14 +5,22 @@ group: Static Analysis
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Security Configuration **(ULTIMATE)**
+# Security Configuration **(FREE)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20711) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.6.
-> - SAST configuration was [enabled](https://gitlab.com/groups/gitlab-org/-/epics/3659) in 13.3 and [improved](https://gitlab.com/gitlab-org/gitlab/-/issues/232862) in 13.4.
-> - DAST Profiles feature was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/40474) in 13.4.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20711) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.6. **(ULTIMATE)**
+> - SAST configuration was [enabled](https://gitlab.com/groups/gitlab-org/-/epics/3659) in 13.3 and [improved](https://gitlab.com/gitlab-org/gitlab/-/issues/232862) in 13.4. **(ULTIMATE)**
+> - DAST Profiles feature was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/40474) in 13.4. **(ULTIMATE)**
+> - A simplified version was made [available in all tiers](https://gitlab.com/gitlab-org/gitlab/-/issues/294076) in GitLab 13.9. **(FREE)**
+> - It's [deployed behind a feature flag](../../feature_flags.md), disabled by default.
+> - It's enabled on GitLab.com.
+> - It's recommended for production use.
+> - For GitLab self-managed instances, GitLab administrators can opt to [enable it](#enable-or-disable-security-configuration). **(FREE SELF)**
+> - It can be enabled or disabled for a single project.
+
+WARNING:
+This feature might not be available to you. Check the **version history** note above for details.
-The Security Configuration page displays the configuration state of each security control in the
-current project.
+The Security Configuration page displays what security scans are available, links to documentation and also simple enablement tools for the current project.
To view a project's security configuration, go to the project's home page,
then in the left sidebar go to **Security & Compliance > Configuration**.
@@ -20,10 +28,11 @@ then in the left sidebar go to **Security & Compliance > Configuration**.
For each security control the page displays:
- **Security Control:** Name, description, and a documentation link.
-- **Status:** The security control's status (enabled, not enabled, or available).
- **Manage:** A management option or a documentation link.
-## Status
+## Status **(ULTIMATE)**
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20711) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.6.
The status of each security control is determined by the project's latest default branch
[CI pipeline](../../../ci/pipelines/index.md).
@@ -35,7 +44,7 @@ all security features are configured by default.
For SAST, click **View history** to see the `.gitlab-ci.yml` file's history.
-## Manage
+## Manage **(ULTIMATE)**
You can configure the following security controls:
@@ -45,3 +54,25 @@ You can configure the following security controls:
- Click either **Enable** or **Configure** to use SAST for the current project. For more details, see [Configure SAST in the UI](../sast/index.md#configure-sast-in-the-ui).
- DAST Profiles
- Click **Manage** to manage the available DAST profiles used for on-demand scans. For more details, see [DAST on-demand scans](../dast/index.md#on-demand-scans).
+
+### Enable or disable Security Configuration **(FREE SELF)**
+
+Security Configuration is under development but 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 opt to enable it.
+
+NOTE:
+This does not apply to GitLab Ultimate.
+
+To enable it:
+
+```ruby
+Feature.enable(:secure_security_and_compliance_configuration_page_on_ce)
+```
+
+To disable it:
+
+```ruby
+Feature.disable(:secure_security_and_compliance_configuration_page_on_ce)
+```
diff --git a/doc/user/application_security/container_scanning/index.md b/doc/user/application_security/container_scanning/index.md
index 6eec1418ef0..909065d7907 100644
--- a/doc/user/application_security/container_scanning/index.md
+++ b/doc/user/application_security/container_scanning/index.md
@@ -32,7 +32,7 @@ To integrate security scanners other than Clair and Klar into GitLab, see
You can enable container scanning by doing one of the following:
- [Include the CI job](#configuration) in your existing `.gitlab-ci.yml` file.
-- Implicitly use [Auto Container Scanning](../../../topics/autodevops/stages.md#auto-container-scanning)
+- Implicitly use [Auto Container Scanning](../../../topics/autodevops/stages.md#auto-container-scanning),
provided by [Auto DevOps](../../../topics/autodevops/index.md).
GitLab compares the found vulnerabilities between the source and target branches, and shows the
@@ -455,7 +455,7 @@ For more information about the vulnerabilities database update, check the
## Interacting with the vulnerabilities
-After a vulnerability is found, you can [interact with it](../index.md#interacting-with-the-vulnerabilities).
+After a vulnerability is found, you can [address it](../index.md#addressing-vulnerabilities).
## Solutions for vulnerabilities (auto-remediation)
@@ -469,7 +469,7 @@ file, it's necessary to set [`GIT_STRATEGY: fetch`](../../../ci/runners/README.m
your `.gitlab-ci.yml` file by following the instructions described in this document's
[overriding the container scanning template](#overriding-the-container-scanning-template) section.
-Read more about the [solutions for vulnerabilities](../index.md#automatic-remediation-for-vulnerabilities).
+Read more about the [solutions for vulnerabilities](../index.md#apply-an-automatic-remediation-for-a-vulnerability).
## Troubleshooting
diff --git a/doc/user/application_security/coverage_fuzzing/index.md b/doc/user/application_security/coverage_fuzzing/index.md
index 9e42b3e403a..94a7d5268b7 100644
--- a/doc/user/application_security/coverage_fuzzing/index.md
+++ b/doc/user/application_security/coverage_fuzzing/index.md
@@ -237,7 +237,7 @@ The `covfuzz-ci.yml` is the same as that in the [original synchronous example](h
## Interacting with the vulnerabilities
-After a vulnerability is found, you can [interact with it](../index.md#interacting-with-the-vulnerabilities).
+After a vulnerability is found, you can [address it](../index.md#addressing-vulnerabilities).
The merge request widget lists the vulnerability and contains a button for downloading the fuzzing
artifacts. By clicking one of the detected vulnerabilities, you can see its details.
diff --git a/doc/user/application_security/dast/img/dast_single_v13_0.png b/doc/user/application_security/dast/img/dast_single_v13_0.png
deleted file mode 100644
index 1d528fa0ace..00000000000
--- a/doc/user/application_security/dast/img/dast_single_v13_0.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/application_security/dast/index.md b/doc/user/application_security/dast/index.md
index 3950c856b40..209dd7ad251 100644
--- a/doc/user/application_security/dast/index.md
+++ b/doc/user/application_security/dast/index.md
@@ -9,98 +9,82 @@ type: reference, howto
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/4348) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 10.4.
-Running [static checks](../sast/index.md) on your code is the first step to detect
-vulnerabilities that can put the security of your code at risk. Yet, once
-deployed, your application is exposed to a new category of possible attacks,
-such as cross-site scripting or broken authentication flaws. This is where
-Dynamic Application Security Testing (DAST) comes into place.
+Your application may be exposed to a new category of attacks once deployed into a new environment. For
+example, application server misconfigurations or incorrect assumptions about security controls may
+not be visible from source code alone. Dynamic Application Security Testing (DAST) checks an
+application for these types of vulnerabilities in a deployed environment. GitLab DAST uses the
+popular open source tool [OWASP Zed Attack Proxy](https://www.zaproxy.org/) to analyze your running
+web application.
NOTE:
The whitepaper ["A Seismic Shift in Application Security"](https://about.gitlab.com/resources/whitepaper-seismic-shift-application-security/)
explains how 4 of the top 6 attacks were application based. Download it to learn how to protect your
organization.
-## Overview
-
-If you're using [GitLab CI/CD](../../../ci/README.md), you can analyze your running web applications
-for known vulnerabilities using Dynamic Application Security Testing (DAST).
-You can take advantage of DAST by either [including the CI job](#configuration) in
-your existing `.gitlab-ci.yml` file or by implicitly using
-[Auto DAST](../../../topics/autodevops/stages.md#auto-dast),
-provided by [Auto DevOps](../../../topics/autodevops/index.md).
-
-GitLab checks the DAST report, compares the found vulnerabilities between the source and target
-branches, and shows the information on the merge request.
+In GitLab, DAST is commonly initiated by a merge request and runs as a job in the CI/CD pipeline.
+You can also run a DAST scan on demand, outside the CI/CD pipeline. Your running web application is
+analyzed for known vulnerabilities. GitLab checks the DAST report, compares the vulnerabilities
+found between the source and target branches, and shows any relevant findings on the merge request.
Note that this comparison logic uses only the latest pipeline executed for the target branch's base
commit. Running the pipeline on any other commit has no effect on the merge request.
-![DAST Widget](img/dast_v13_4.png)
+![DAST widget, showing the vulnerability statistics and a list of vulnerabilities](img/dast_v13_4.png)
-By clicking on one of the detected linked vulnerabilities, you can
-see the details and the URL(s) affected.
+## Enable DAST
-![DAST Widget Clicked](img/dast_single_v13_0.png)
+### Prerequisites
-[Dynamic Application Security Testing (DAST)](https://en.wikipedia.org/wiki/Dynamic_Application_Security_Testing)
-uses the popular open source tool [OWASP Zed Attack Proxy](https://www.zaproxy.org/)
-to perform an analysis on your running web application.
+- GitLab Runner with the [`docker` executor](https://docs.gitlab.com/runner/executors/docker.html).
-By default, DAST executes [ZAP Baseline Scan](https://www.zaproxy.org/docs/docker/baseline-scan/)
-and performs passive scanning only. It doesn't actively attack your application.
-However, DAST can be [configured](#full-scan)
-to also perform an *active scan*: attack your application and produce a more extensive security report.
-It can be very useful combined with [Review Apps](../../../ci/review_apps/index.md).
+To enable DAST, either:
-Note that a pipeline may consist of multiple jobs, including SAST and DAST scanning. If any job
-fails to finish for any reason, the security dashboard doesn't show DAST scanner output. For
-example, if the DAST job finishes but the SAST job fails, the security dashboard doesn't show DAST
-results. On failure, the analyzer outputs an
-[exit code](../../../development/integrations/secure.md#exit-code).
+- Enable [Auto DAST](../../../topics/autodevops/stages.md#auto-dast), provided by
+ [Auto DevOps](../../../topics/autodevops/index.md).
+- [Include the DAST template](#dast-cicd-template) in your existing `.gitlab-ci.yml` file.
-## Use cases
+### DAST CI/CD template
-It helps you automatically find security vulnerabilities in your running web
-applications while you're developing and testing your applications.
+The DAST job is defined in a CI/CD template file you reference in your CI/CD configuration file. The
+template is included with GitLab. Updates to the template are provided with GitLab upgrades. You
+benefit from any improvements and additions.
-## Requirements
+The following templates are available:
-To run a DAST job, you need GitLab Runner with the
-[`docker` executor](https://docs.gitlab.com/runner/executors/docker.html).
+- [`DAST.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Security/DAST.gitlab-ci.yml):
+ Stable version of the DAST CI/CD template.
+- [`DAST.latest.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/DAST.latest.gitlab-ci.yml):
+ Latest version of the DAST template. ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/254325)
+ in GitLab 13.8). Please note that the latest version may include breaking changes. Check the
+ [DAST troubleshooting guide](#troubleshooting) if you experience problems.
-## Configuration
+Use the stable template unless you need a feature provided only in the latest template.
-For GitLab 11.9 and later, to enable DAST, you must
-[include](../../../ci/yaml/README.md#includetemplate) the
-[`DAST.gitlab-ci.yml` template](https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Security/DAST.gitlab-ci.yml)
-that's provided as a part of your GitLab installation. For GitLab versions earlier
-than 11.9, you can copy and use the job as defined in that template.
+See the CI/CD [documentation](../../../development/cicd/templates.md#latest-version)
+on template versioning for more information.
-Add the following to your `.gitlab-ci.yml` file:
+#### Include the DAST template
-```yaml
-include:
- - template: DAST.gitlab-ci.yml
+The method of including the DAST template depends on the GitLab version:
-variables:
- DAST_WEBSITE: https://example.com
-```
+- In GitLab 11.9 and later, [include](../../../ci/yaml/README.md#includetemplate) the
+ `DAST.gitlab-ci.yml` template.
-### Latest template
+ Add the following to your `.gitlab-ci.yml` file:
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/254325) in GitLab 13.8
+ ```yaml
+ include:
+ - template: DAST.gitlab-ci.yml
-To use the latest version of the DAST template, include
-`DAST.latest.gitlab-ci.yml` instead of `DAST.gitlab-ci.yml`.
-See the CI/CD [documentation](../../../development/cicd/templates.md#latest-version)
-on template versioning for more information.
+ variables:
+ DAST_WEBSITE: https://example.com
+ ```
-Please note that the latest version may include breaking changes. Check the
-[DAST troubleshooting guide](#troubleshooting) if you experience problems.
+- In GitLab 11.8 and earlier, copy the template's content into your `.gitlab_ci.yml` file.
-### Template options
+#### Template options
-There are two ways to define the URL to be scanned by DAST:
+Running a DAST scan requires a URL. There are two ways to define the URL to be scanned by DAST:
1. Set the `DAST_WEBSITE` [CI/CD variable](../../../ci/yaml/README.md#variables).
@@ -125,7 +109,7 @@ There are two ways to define the URL to be scanned by DAST:
If both values are set, the `DAST_WEBSITE` value takes precedence.
The included template creates a `dast` job in your CI/CD pipeline and scans
-your project's source code for possible vulnerabilities.
+your project's running application for possible vulnerabilities.
The results are saved as a
[DAST report artifact](../../../ci/pipelines/job_artifacts.md#artifactsreportsdast)
@@ -143,9 +127,93 @@ image. Using the `DAST_VERSION` variable, you can choose how DAST updates:
Find the latest DAST versions on the [Releases](https://gitlab.com/gitlab-org/security-products/dast/-/releases) page.
-### When DAST scans run
+## Deployment options
+
+Depending on the complexity of the target application, there are a few options as to how to deploy and configure
+the DAST template. A set of example applications with their configurations have been made available in our
+[DAST demonstrations](https://gitlab.com/gitlab-org/security-products/demos/dast/) project.
+
+### Review Apps
+
+Review Apps are the most involved method of deploying your DAST target application. To assist in the process,
+we created a Review App deployment using Google Kubernetes Engine (GKE). This example can be found in our
+[Review Apps - GKE](https://gitlab.com/gitlab-org/security-products/demos/dast/review-app-gke) project along with detailed
+instructions in the [README.md](https://gitlab.com/gitlab-org/security-products/demos/dast/review-app-gke/-/blob/master/README.md)
+on how to configure Review Apps for DAST.
+
+### Docker Services
+
+If your application utilizes Docker containers you have another option for deploying and scanning with DAST.
+After your Docker build job completes and your image is added to your container registry, you can utilize the image as a
+[service](../../../ci/docker/using_docker_images.md#what-is-a-service).
+
+By using service definitions in your `gitlab-ci.yml`, you can scan services with the DAST analyzer.
+
+```yaml
+stages:
+ - build
+ - dast
+
+include:
+ - template: DAST.gitlab-ci.yml
+
+# Deploys the container to the GitLab container registry
+deploy:
+ services:
+ - name: docker:dind
+ alias: dind
+ image: docker:19.03.5
+ stage: build
+ script:
+ - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
+ - docker pull $CI_REGISTRY_IMAGE:latest || true
+ - docker build --tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA --tag $CI_REGISTRY_IMAGE:latest .
+ - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
+ - docker push $CI_REGISTRY_IMAGE:latest
+
+services: # use services to link your app container to the dast job
+ - name: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
+ alias: yourapp
+
+variables:
+ DAST_FULL_SCAN_ENABLED: "true" # do a full scan
+ DAST_ZAP_USE_AJAX_SPIDER: "true" # use the ajax spider
+```
+
+Most applications depend on multiple services such as databases or caching services. By default, services defined in the services fields cannot communicate
+with each another. To allow communication between services, enable the `FF_NETWORK_PER_BUILD` [feature flag](https://docs.gitlab.com/runner/configuration/feature-flags.html#available-feature-flags).
+
+```yaml
+variables:
+ FF_NETWORK_PER_BUILD: "true" # enable network per build so all services can communicate on the same network
+
+services: # use services to link the container to the dast job
+ - name: mongo:latest
+ alias: mongo
+ - name: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
+ alias: yourapp
+```
+
+### DAST application analysis
+
+DAST can analyze applications in two ways:
+
+- Passive scan only (DAST default). DAST executes
+ [ZAP's Baseline Scan](https://www.zaproxy.org/docs/docker/baseline-scan/) and doesn't
+ actively attack your application.
+- Passive and active scan. DAST can be [configured](#full-scan) to also perform an active scan
+ to attack your application and produce a more extensive security report. It can be very
+ useful when combined with [Review Apps](../../../ci/review_apps/index.md).
+
+Note that a pipeline may consist of multiple jobs, including SAST and DAST scanning. If any job
+fails to finish for any reason, the security dashboard doesn't show DAST scanner output. For
+example, if the DAST job finishes but the SAST job fails, the security dashboard doesn't show DAST
+results. On failure, the analyzer outputs an
+[exit code](../../../development/integrations/secure.md#exit-code).
+
+#### DAST job order
-When using `DAST.gitlab-ci.yml` template, the `dast` job is run last as shown in
+When using the `DAST.gitlab-ci.yml` template, the `dast` job is run last as shown in
the example below. To ensure DAST is scanning the latest code, your CI pipeline
should deploy changes to the web server in one of the jobs preceding the `dast` job.
@@ -247,6 +315,9 @@ tips for optimizing DAST scans in a [blog post](https://about.gitlab.com/blog/20
#### Domain validation
+WARNING:
+In GitLab 13.8, domain validation, outside of the new on-demand scan site profile validation, was deprecated. In GitLab 14.0, domain validation in CI/CD jobs will be permanently removed.
+
The DAST job can be run anywhere, which means you can accidentally hit live web servers
and potentially damage them. You could even take down your production environment.
For that reason, you should use domain validation.
@@ -472,7 +543,7 @@ URLs to scan can be specified by either of the following methods:
To define the URLs to scan in a file, create a plain text file with one path per line.
-```txt
+```plaintext
page1.html
/page2.html
category/shoes/page1.html
@@ -676,7 +747,7 @@ successfully run. For more information, see [Offline environments](../offline_de
To use DAST in an offline environment, you need:
-- GitLab Runner with the [`docker` or `kubernetes` executor](#requirements).
+- GitLab Runner with the [`docker` or `kubernetes` executor](#prerequisites).
- Docker Container Registry with a locally available copy of the DAST
[container image](https://gitlab.com/gitlab-org/security-products/dast), found in the
[DAST container registry](https://gitlab.com/gitlab-org/security-products/dast/container_registry).
@@ -831,7 +902,7 @@ To delete an on-demand scan:
1. In the saved scan's row select **More actions** (**{ellipsis_v}**), then select **Delete**.
1. Select **Delete** to confirm the deletion.
-## Site profile
+### Site profile
A site profile describes the attributes of a web site to scan on demand with DAST. A site profile is
required for an on-demand DAST scan.
@@ -841,7 +912,7 @@ A site profile contains the following:
- **Profile name**: A name you assign to the site to be scanned.
- **Target URL**: The URL that DAST runs against.
-### Site profile validation
+#### Site profile validation
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/233020) in GitLab 13.8.
@@ -858,7 +929,7 @@ follows:
Both methods are equivalent in functionality. Use whichever is feasible.
-### Create a site profile
+#### Create a site profile
To create a site profile:
@@ -869,7 +940,7 @@ To create a site profile:
The site profile is created.
-### Edit a site profile
+#### Edit a site profile
To edit an existing site profile:
@@ -881,7 +952,7 @@ To edit an existing site profile:
The site profile is updated with the edited details.
-### Delete a site profile
+#### Delete a site profile
To delete an existing site profile:
@@ -893,7 +964,7 @@ To delete an existing site profile:
The site profile is deleted.
-### Validate a site profile
+#### Validate a site profile
Prerequisites:
@@ -921,7 +992,7 @@ The site is validated and an active scan can run against it.
If a validated site profile's target URL is edited, the site's validation status is revoked.
-### Revoke a site profile's validation status
+#### Revoke a site profile's validation status
Note that all site profiles with the same URL have their validation status revoked.
@@ -977,7 +1048,7 @@ app.get('/dast-website-target', function(req, res) {
})
```
-## Scanner profile
+### Scanner profile
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/222767) in GitLab 13.4.
> - [Added](https://gitlab.com/gitlab-org/gitlab/-/issues/225804) in GitLab 13.5: scan mode, AJAX spider, debug messages.
@@ -992,7 +1063,7 @@ A scanner profile defines the scanner settings used to run an on-demand scan:
- **AJAX spider:** Run the AJAX spider, in addition to the traditional spider, to crawl the target site.
- **Debug messages:** Include debug messages in the DAST console output.
-### Create a scanner profile
+#### Create a scanner profile
To create a scanner profile:
@@ -1002,7 +1073,7 @@ To create a scanner profile:
1. Complete the form. For details of each field, see [Scanner profile](#scanner-profile).
1. Click **Save profile**.
-### Edit a scanner profile
+#### Edit a scanner profile
To edit a scanner profile:
@@ -1015,7 +1086,7 @@ To edit a scanner profile:
The scanner profile is updated with the edited details.
-### Delete a scanner profile
+#### Delete a scanner profile
To delete a scanner profile:
@@ -1099,7 +1170,7 @@ variables:
## Interacting with the vulnerabilities
Once a vulnerability is found, you can interact with it. Read more on how to
-[interact with the vulnerabilities](../index.md#interacting-with-the-vulnerabilities).
+[address the vulnerabilities](../index.md#addressing-vulnerabilities).
## Vulnerabilities database update
diff --git a/doc/user/application_security/dependency_scanning/index.md b/doc/user/application_security/dependency_scanning/index.md
index 11d27140e42..f87ea8edc7b 100644
--- a/doc/user/application_security/dependency_scanning/index.md
+++ b/doc/user/application_security/dependency_scanning/index.md
@@ -19,10 +19,13 @@ vulnerable. You can then take action to protect your application.
If you're using [GitLab CI/CD](../../../ci/README.md), you can use dependency scanning to analyze
your dependencies for known vulnerabilities. GitLab scans all dependencies, including transitive
dependencies (also known as nested dependencies). You can take advantage of dependency scanning by
-either [including the dependency scanning template](#configuration)
-in your existing `.gitlab-ci.yml` file, or by implicitly using
-the [auto dependency scanning](../../../topics/autodevops/stages.md#auto-dependency-scanning)
-provided by [Auto DevOps](../../../topics/autodevops/index.md).
+either:
+
+- [Including the dependency scanning template](#configuration)
+ in your existing `.gitlab-ci.yml` file.
+- Implicitly using
+ the [auto dependency scanning](../../../topics/autodevops/stages.md#auto-dependency-scanning)
+ provided by [Auto DevOps](../../../topics/autodevops/index.md).
GitLab checks the dependency scanning report, compares the found vulnerabilities
between the source and target branches, and shows the information on the
@@ -59,16 +62,16 @@ The following languages and dependency managers are supported:
| Package Managers | Languages | Supported files | Scan tools |
| ------------------- | --------- | --------------- | ------------ |
-| [Bundler](https://bundler.io/) | Ruby | `Gemfile.lock`, `gems.locked` | [Gemnasium](https://gitlab.com/gitlab-org/security-products/gemnasium), [bundler-audit](https://github.com/rubysec/bundler-audit) |
-| [Composer](https://getcomposer.org/) | PHP | `composer.lock` | [Gemnasium](https://gitlab.com/gitlab-org/security-products/gemnasium) |
-| [Conan](https://conan.io/) | C, C++ | [`conan.lock`](https://docs.conan.io/en/latest/versioning/lockfiles.html) | [Gemnasium](https://gitlab.com/gitlab-org/security-products/gemnasium) |
-| [Golang](https://golang.org/) | Go | `go.sum` | [Gemnasium](https://gitlab.com/gitlab-org/security-products/gemnasium) |
-| [Gradle](https://gradle.org/), [Maven](https://maven.apache.org/) | Java | `build.gradle`, `build.gradle.kts`, `pom.xml` | [Gemnasium](https://gitlab.com/gitlab-org/security-products/gemnasium) |
-| [npm](https://www.npmjs.com/), [yarn](https://classic.yarnpkg.com/en/) 1.x | JavaScript | `package-lock.json`, `npm-shrinkwrap.json`, `yarn.lock` | [Gemnasium](https://gitlab.com/gitlab-org/security-products/gemnasium) |
+| [Bundler](https://bundler.io/) | Ruby | `Gemfile.lock`, `gems.locked` | [Gemnasium](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium), [bundler-audit](https://github.com/rubysec/bundler-audit) |
+| [Composer](https://getcomposer.org/) | PHP | `composer.lock` | [Gemnasium](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium) |
+| [Conan](https://conan.io/) | C, C++ | [`conan.lock`](https://docs.conan.io/en/latest/versioning/lockfiles.html) | [Gemnasium](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium) |
+| [Golang](https://golang.org/) | Go | `go.sum` | [Gemnasium](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium) |
+| [Gradle](https://gradle.org/), [Maven](https://maven.apache.org/) | Java | `build.gradle`, `build.gradle.kts`, `pom.xml` | [Gemnasium](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium) |
+| [npm](https://www.npmjs.com/), [yarn](https://classic.yarnpkg.com/en/) 1.x | JavaScript | `package-lock.json`, `npm-shrinkwrap.json`, `yarn.lock` | [Gemnasium](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium) |
| [npm](https://www.npmjs.com/) (7 and earlier), [yarn](https://classic.yarnpkg.com/en/) 1.x | JavaScript | `package.json` | [Retire.js](https://retirejs.github.io/retire.js/) |
-| [NuGet](https://www.nuget.org/) 4.9+ | .NET, C# | [`packages.lock.json`](https://docs.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files#enabling-lock-file) | [Gemnasium](https://gitlab.com/gitlab-org/security-products/gemnasium) |
-| [`setuptools`](https://setuptools.readthedocs.io/en/latest/), [pip](https://pip.pypa.io/en/stable/), [Pipenv](https://pipenv.pypa.io/en/latest/) (*1*) | Python | `setup.py`, `requirements.txt`, `requirements.pip`, `requires.txt`, `Pipfile`, `Pipfile.lock` | [Gemnasium](https://gitlab.com/gitlab-org/security-products/gemnasium) |
-| [sbt](https://www.scala-sbt.org/) (*2*) | Scala | `build.sbt` | [Gemnasium](https://gitlab.com/gitlab-org/security-products/gemnasium) |
+| [NuGet](https://www.nuget.org/) 4.9+ | .NET, C# | [`packages.lock.json`](https://docs.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files#enabling-lock-file) | [Gemnasium](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium) |
+| [`setuptools`](https://setuptools.readthedocs.io/en/latest/), [pip](https://pip.pypa.io/en/stable/), [Pipenv](https://pipenv.pypa.io/en/latest/) (*1*) | Python | `setup.py`, `requirements.txt`, `requirements.pip`, `requires.txt`, `Pipfile`, `Pipfile.lock` | [Gemnasium](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium) |
+| [sbt](https://www.scala-sbt.org/) (*2*) | Scala | `build.sbt` | [Gemnasium](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium) |
1. [Pipenv](https://pipenv.pypa.io/en/latest/) projects are scanned when a `Pipfile` is present.
1. Support for [sbt](https://www.scala-sbt.org/) 1.3 and above was added in GitLab 13.9.
@@ -77,7 +80,7 @@ Plans are underway for supporting the following languages, dependency managers,
| Package Managers | Languages | Supported files | Scan tools | Issue |
| ------------------- | --------- | --------------- | ---------- | ----- |
-| [Poetry](https://python-poetry.org/) | Python | `poetry.lock` | [Gemnasium](https://gitlab.com/gitlab-org/security-products/gemnasium) | [GitLab#7006](https://gitlab.com/gitlab-org/gitlab/-/issues/7006) |
+| [Poetry](https://python-poetry.org/) | Python | `poetry.lock` | [Gemnasium](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium) | [GitLab#7006](https://gitlab.com/gitlab-org/gitlab/-/issues/7006) |
## Contribute your scanner
@@ -223,13 +226,13 @@ Read more on [how to use private Maven repositories](../index.md#using-private-m
## Interacting with the vulnerabilities
Once a vulnerability is found, you can interact with it. Read more on how to
-[interact with the vulnerabilities](../index.md#interacting-with-the-vulnerabilities).
+[address the vulnerabilities](../index.md#addressing-vulnerabilities).
## Solutions for vulnerabilities (auto-remediation)
Some vulnerabilities can be fixed by applying the solution that GitLab
automatically generates. Read more about the
-[solutions for vulnerabilities](../index.md#automatic-remediation-for-vulnerabilities).
+[solutions for vulnerabilities](../index.md#apply-an-automatic-remediation-for-a-vulnerability).
## Security Dashboard
@@ -507,7 +510,7 @@ ensure that it can reach your private repository. Here is an example configurati
### Referencing local dependencies using a path in JavaScript projects
The [Retire.js](https://gitlab.com/gitlab-org/security-products/analyzers/retire.js) analyzer
-doesn't support dependency references made with [local paths](https://docs.npmjs.com/cli/v6/configuring-npm/package-json#local-paths)
+doesn't support dependency references made with [local paths](https://docs.npmjs.com/cli/v6/configuring-npm/package-json/#local-paths)
in the `package.json` of JavaScript projects. The dependency scan outputs the following error for
such references:
diff --git a/doc/user/application_security/img/create_mr_from_vulnerability_v13_4.png b/doc/user/application_security/img/create_mr_from_vulnerability_v13_4.png
index a914c2996f7..54ccfa24374 100644
--- a/doc/user/application_security/img/create_mr_from_vulnerability_v13_4.png
+++ b/doc/user/application_security/img/create_mr_from_vulnerability_v13_4.png
Binary files differ
diff --git a/doc/user/application_security/img/vulnerability_page_merge_request_button_v13_1.png b/doc/user/application_security/img/vulnerability_page_merge_request_button_v13_1.png
deleted file mode 100644
index a3034a7db04..00000000000
--- a/doc/user/application_security/img/vulnerability_page_merge_request_button_v13_1.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/application_security/img/vulnerability_related_issues_add_button_v13_2.png b/doc/user/application_security/img/vulnerability_related_issues_add_button_v13_2.png
deleted file mode 100644
index 10d9effb811..00000000000
--- a/doc/user/application_security/img/vulnerability_related_issues_add_button_v13_2.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/application_security/img/vulnerability_related_issues_remove_v13_2.gif b/doc/user/application_security/img/vulnerability_related_issues_remove_v13_2.gif
deleted file mode 100644
index 22acba5fe1e..00000000000
--- a/doc/user/application_security/img/vulnerability_related_issues_remove_v13_2.gif
+++ /dev/null
Binary files differ
diff --git a/doc/user/application_security/index.md b/doc/user/application_security/index.md
index 4a23cd874be..b0457ec0690 100644
--- a/doc/user/application_security/index.md
+++ b/doc/user/application_security/index.md
@@ -5,17 +5,20 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: reference, howto
---
-# GitLab Secure **(ULTIMATE)**
+# Application security **(ULTIMATE)**
GitLab can check your application for security vulnerabilities that may lead to unauthorized access,
data leaks, denial of services, and more. GitLab reports vulnerabilities in the merge request so you
-can fix them before merging. The [Security Dashboard](security_dashboard/index.md) provides a
-high-level view of vulnerabilities detected in your projects, pipeline, and groups. The [Threat Monitoring](threat_monitoring/index.md)
-page provides runtime security metrics for application environments. With the information provided,
-you can immediately begin risk analysis and remediation.
+can fix them before you merge.
+
+- The [Security Dashboard](security_dashboard/index.md) provides a
+ high-level view of vulnerabilities detected in your projects, pipeline, and groups.
+- The [Threat Monitoring](threat_monitoring/index.md) page provides runtime security metrics
+ for application environments. With the information provided,
+ you can immediately begin risk analysis and remediation.
<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
-For an overview of application security with GitLab, see
+For an overview of GitLab application security, see
[Security Deep Dive](https://www.youtube.com/watch?v=k4vEJnGYy84).
## Quick start
@@ -123,7 +126,7 @@ latest versions of the scanning tools without having to do anything. There are s
with this approach, however, and there is a
[plan to resolve them](https://gitlab.com/gitlab-org/gitlab/-/issues/9725).
-## Viewing security scan information in merge requests **(FREE)**
+## View security scan information in merge requests **(FREE)**
> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/4393) in GitLab Free 13.5.
> - Made [available in all tiers](https://gitlab.com/gitlab-org/gitlab/-/issues/273205) in 13.6.
@@ -136,25 +139,7 @@ reports are available to download. To download a report, click on the
![Security widget](img/security_widget_v13_7.png)
-## Interacting with the vulnerabilities
-
-> Introduced in [GitLab Ultimate](https://about.gitlab.com/pricing/) 10.8.
-
-Each security vulnerability in the merge request report or the
-[Vulnerability Report](vulnerability_report/index.md) is actionable. Click an entry to view detailed
-information with several options:
-
-- [Dismiss vulnerability](#dismissing-a-vulnerability): Dismissing a vulnerability styles it in
- strikethrough.
-- [Create issue](vulnerabilities/index.md#create-a-gitlab-issue-for-a-vulnerability): Create a new issue with the title and
- description pre-populated with information from the vulnerability report. By default, such issues
- are [confidential](../project/issues/confidential_issues.md).
-- [Automatic Remediation](#automatic-remediation-for-vulnerabilities): For some vulnerabilities,
- a solution is provided for how to fix the vulnerability.
-
-![Interacting with security reports](img/interacting_with_vulnerability_v13_3.png)
-
-### View details of a DAST vulnerability
+## View details of a DAST vulnerability
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/36332) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.1.
@@ -165,11 +150,10 @@ investigate and rectify the underlying cause.
To view details of DAST vulnerabilities:
1. To see all vulnerabilities detected:
-
- In a project, go to the project's **{shield}** **Security & Compliance** page.
- Only in a merge request, go the merge request's **Security** tab.
-1. Click on the vulnerability's description. The following details are provided:
+1. Select the vulnerability's description. The following details are provided:
| Field | Description |
|:-----------------|:------------------------------------------------------------------ |
@@ -187,14 +171,14 @@ To view details of DAST vulnerabilities:
| Links | Links to further details of the detected vulnerability. |
| Solution | Details of a recommended solution to the vulnerability (optional). |
-#### Hide sensitive information in headers
+### Hide sensitive information in headers
HTTP request and response headers may contain sensitive information, including cookies and
authorization credentials. By default, content of specific headers are masked in DAST vulnerability
reports. You can specify the list of all headers to be masked. For details, see
[Hide sensitive information](dast/index.md#hide-sensitive-information).
-### View details of an API Fuzzing vulnerability
+## View details of an API Fuzzing vulnerability
> Introduced in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.7.
@@ -231,65 +215,79 @@ Follow these steps to view details of a fuzzing fault:
| Severity | Severity of the finding is always Unknown. |
| Scanner Type | Scanner used to perform testing. |
-### Dismissing a vulnerability
+## Addressing vulnerabilities
-To dismiss a vulnerability, you must set its status to Dismissed. This dismisses the vulnerability
-for the entire project. Follow these steps to do so:
+> Introduced in [GitLab Ultimate](https://about.gitlab.com/pricing/) 10.8.
-1. Select the vulnerability in the Security Dashboard.
-1. Select **Dismissed** from the **Status** selector menu at the top-right.
+For each security vulnerability in a merge request or [Vulnerability Report](vulnerability_report/index.md),
+you can:
+
+- [Dismiss the vulnerability](#dismiss-a-vulnerability).
+- Create a [confidential](../project/issues/confidential_issues.md)
+ [issue](vulnerabilities/index.md#create-a-gitlab-issue-for-a-vulnerability).
+- Apply an [automatically remediation](#apply-an-automatic-remediation-for-a-vulnerability).
-You can undo this action by selecting a different status from the same menu.
+### Dismiss a vulnerability
-#### Adding a dismissal reason
+> Introduced in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.0, a dismissal reason.
-> Introduced in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.0.
+You can dismiss a vulnerability for the entire project.
-When dismissing a vulnerability, it's often helpful to provide a reason for doing so. Upon setting a
-vulnerability's status to Dismissed, a text box appears for you to add a comment with your
-dismissal. Once added, you can edit or delete it. This allows you to add and update context for a
-vulnerability as you learn more over time.
+1. Select the vulnerability in the Security Dashboard.
+1. In the top-right, from the **Status** selector menu, select **Dismissed**.
+1. Optional. Add a reason for the dismissal and select **Save comment**.
-![Dismissed vulnerability comment](img/adding_a_dismissal_reason_v13_4.png)
+To undo this action, select a different status from the same menu.
-#### Dismissing multiple vulnerabilities
+#### Dismiss multiple vulnerabilities
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/35816) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.9.
-You can dismiss multiple vulnerabilities at once, providing an optional reason.
-Selecting the checkboxes on the side of each vulnerability in the list selects that individual vulnerability.
-Alternatively, you can select all the vulnerabilities in the list by selecting the checkbox in the table header.
-Deselecting the checkbox in the header deselects all the vulnerabilities in the list.
-After you have selected some vulnerabilities, a menu appears at the top of the table that allows you to select a dismissal reason.
-Pressing the "Dismiss Selected" button dismisses all the selected vulnerabilities at once, with the reason you chose.
+You can dismiss multiple vulnerabilities at once.
-![Multiple vulnerability dismissal](img/multi_select_v12_9.png)
+1. In the list of vulnerabilities, select the checkbox for each vulnerability you want to dismiss.
+ To select all, select the checkbox in the table header.
+1. Above the table, select a dismissal reason.
+1. Select **Dismiss Selected**.
### Create an issue for a vulnerability
-You can create a GitLab issue, or a Jira issue (if it's enabled) for a vulnerability. For more
-details, see [Vulnerability Pages](vulnerabilities/index.md).
+You can create a GitLab or Jira issue for a vulnerability. For details, see [Vulnerability Pages](vulnerabilities/index.md).
+
+#### Link to an existing issue
+
+If you already have an open issue, you can link to it from the vulnerability.
+
+- The vulnerability page shows related issues, but the issue page doesn't show the vulnerability it's related to.
+- An issue can only be related to one vulnerability at a time.
+- Issues can be linked across groups and projects.
+
+To link to an existing issue:
+
+1. Open the vulnerability.
+1. In the **Related Issues** section, select the plus (**{plus}**) icon.
+1. In the text box that appears, type an issue number or paste an issue link.
+ - Type `#` followed by a number to show an autocomplete menu.
+ - You can enter multiple issues at once. Press the space bar after each issue number or link to converts them to tags.
+1. Select **Add**.
-### Automatic remediation for vulnerabilities
+To remove an issue, to the right of the issue number, select **{close}**.
+
+![Vulnerability related issues text box tags animation](img/vulnerability_related_issues_text_box_tags_v13_2.gif)
+
+### Apply an automatic remediation for a vulnerability
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/5656) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 11.7.
Some vulnerabilities can be fixed by applying the solution that GitLab automatically generates.
-Although the feature name is Automatic Remediation, this feature is also commonly called
-Auto-Remediation, Auto Remediation, or Suggested Solutions. The following scanners are supported:
+The following scanners are supported:
-- [Dependency Scanning](dependency_scanning/index.md):
+- [Dependency Scanning](dependency_scanning/index.md).
Automatic Patch creation is only available for Node.js projects managed with
`yarn`.
-- [Container Scanning](container_scanning/index.md)
-
-When an automatic solution is available, the button in the header shows **Resolve with merge request**:
+- [Container Scanning](container_scanning/index.md).
-![Resolve with Merge Request button](img/vulnerability_page_merge_request_button_v13_1.png)
-
-Selecting the button creates a merge request with the solution.
-
-#### Manually applying the suggested patch
+#### Manually apply the suggested patch
To manually apply the patch that GitLab generated for a vulnerability:
@@ -301,49 +299,22 @@ To manually apply the patch that GitLab generated for a vulnerability:
1. Run `git apply remediation.patch`.
1. Verify and commit the changes to your branch.
-#### Creating a merge request from a vulnerability
+#### Create a merge request with the suggested patch
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/9224) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 11.9.
-In certain cases, GitLab allows you to create a merge request that automatically remediates the
+In some cases, you can create a merge request that automatically remediates the
vulnerability. Any vulnerability that has a
-[solution](#automatic-remediation-for-vulnerabilities) can have a merge
+[solution](#apply-an-automatic-remediation-for-a-vulnerability) can have a merge
request created to automatically solve the issue.
-If this action is available, the vulnerability page or modal contains a **Create merge request** button.
-Click this button to create a merge request to apply the solution onto the source branch.
-
-![Create merge request from vulnerability](img/create_mr_from_vulnerability_v13_4.png)
-
-### Managing related issues for a vulnerability
-
-Issues can be linked to a vulnerability using the related issues block on the vulnerability page.
-The relationship is uni-directional. The vulnerability page shows related issues, but the issue page
-doesn't show the vulnerability it's related to. An issue can only be related to one vulnerability at
-a time. Issues can be linked across groups and projects.
-
-#### Adding a related issue
-
-You can link an issue by clicking the **{plus}** button in the **Related Issues** block.
-
-![Vulnerability related issues add button](img/vulnerability_related_issues_add_button_v13_2.png)
-
-A text box appears that lets you type an issue number or paste an issue link. You can enter multiple
-issues at once. Pressing the space bar after each issue number or link converts them to tags that
-you can remove by clicking the **{close}** icon to the tag's right. Typing `#` followed by a number
-shows an autocomplete menu. Click an issue in the menu to add it as a tag. When you're finished
-entering issues, click the **Add** button to link the issues to the vulnerability. Alternatively,
-click **Cancel** to exit without linking any issues.
-
-![Vulnerability related issues text box tags animation](img/vulnerability_related_issues_text_box_tags_v13_2.gif)
-
-### Removing a related issue
+If this action is available:
-Click the **{close}** icon to right of an issue to remove it as a related issue. Note that this only
-removes it as a related issue of the vulnerability; it doesn't modify or remove the issue itself.
-You can link it to the vulnerability again if desired.
+1. Select the **Resolve with merge request** dropdown, then select **Resolve with merge request**.
+
+ ![Create merge request from vulnerability](img/create_mr_from_vulnerability_v13_4.png)
-![Vulnerability related issues remove issue animation](img/vulnerability_related_issues_remove_v13_2.gif)
+A merge request is created. It that applies the solution to the source branch.
## Security approvals in merge requests
diff --git a/doc/user/application_security/offline_deployments/index.md b/doc/user/application_security/offline_deployments/index.md
index 9d16fb75410..7c013a2a9de 100644
--- a/doc/user/application_security/offline_deployments/index.md
+++ b/doc/user/application_security/offline_deployments/index.md
@@ -59,14 +59,14 @@ mirroring the packages inside your own offline network.
### Interacting with the vulnerabilities
Once a vulnerability is found, you can interact with it. Read more on how to
-[interact with the vulnerabilities](../index.md#interacting-with-the-vulnerabilities).
+[address the vulnerabilities](../index.md#addressing-vulnerabilities).
Please note that in some cases the reported vulnerabilities provide metadata that can contain
external links exposed in the UI. These links might not be accessible within an offline environment.
### Automatic remediation for vulnerabilities
-The [automatic remediation for vulnerabilities](../index.md#automatic-remediation-for-vulnerabilities) feature is available for offline Dependency Scanning and Container Scanning, but may not work
+The [automatic remediation for vulnerabilities](../index.md#apply-an-automatic-remediation-for-a-vulnerability) feature is available for offline Dependency Scanning and Container Scanning, but may not work
depending on your instance's configuration. We can only suggest solutions, which are generally more
current versions that have been patched, when we are able to access up-to-date registry services
hosting the latest versions of that dependency or image.
diff --git a/doc/user/application_security/sast/index.md b/doc/user/application_security/sast/index.md
index 880edebfeda..091dc2f5d36 100644
--- a/doc/user/application_security/sast/index.md
+++ b/doc/user/application_security/sast/index.md
@@ -83,8 +83,9 @@ You can also [view our language roadmap](https://about.gitlab.com/direction/secu
| Objective-C (iOS) | [MobSF (beta)](https://github.com/MobSF/Mobile-Security-Framework-MobSF) | 13.5 |
| PHP | [phpcs-security-audit](https://github.com/FloeDesignTechnologies/phpcs-security-audit) | 10.8 |
| Python ([pip](https://pip.pypa.io/en/stable/)) | [bandit](https://github.com/PyCQA/bandit) | 10.3 |
-| Python | [semgrep](https://semgrep.dev) | 13.9 |
+| Python | [Semgrep](https://semgrep.dev) | 13.9 |
| React | [ESLint react plugin](https://github.com/yannickcr/eslint-plugin-react) | 12.5 |
+| Ruby | [brakeman](https://brakemanscanner.org) | 13.9 |
| Ruby on Rails | [brakeman](https://brakemanscanner.org) | 10.3 |
| Scala ([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.0 (SBT) & 11.9 (Ant, Gradle, Maven) |
| Swift (iOS) | [MobSF (beta)](https://github.com/MobSF/Mobile-Security-Framework-MobSF) | 13.5 |
@@ -130,16 +131,16 @@ 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](#customizing-the-sast-settings) | **{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}** |
-| [Interaction with Vulnerabilities](#interacting-with-the-vulnerabilities) | **{dotted-circle}** | **{check-circle}** |
-| [Access to Security Dashboard](#security-dashboard) | **{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}** |
+| Capability | In Free | In Ultimate |
+|:-------------------------------------------------------------------------------------------------------------|:--------------------|:-------------------|
+| [Configure SAST Scanners](#configuration) | **{check-circle}** | **{check-circle}** |
+| [Customize SAST Settings](#customizing-the-sast-settings) | **{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/index.md#addressing-vulnerabilities) | **{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}** |
## Contribute your scanner
@@ -149,7 +150,7 @@ The [Security Scanner Integration](../../../development/integrations/secure.md)
To configure SAST for a project you can:
-- Use [Auto SAST](../../../topics/autodevops/stages.md#auto-sast) provided by
+- Use [Auto SAST](../../../topics/autodevops/stages.md#auto-sast), provided by
[Auto DevOps](../../../topics/autodevops/index.md).
- [Configure SAST manually](#configure-sast-manually).
- [Configure SAST using the UI](#configure-sast-in-the-ui) (introduced in GitLab 13.3).
@@ -610,31 +611,6 @@ Here's an example SAST report:
}
```
-## Secret detection
-
-Learn more about [Secret Detection](../secret_detection).
-
-## Security Dashboard **(ULTIMATE)**
-
-The Security Dashboard is a good place to get an overview of all the security
-vulnerabilities in your groups, projects and pipelines. Read more about the
-[Security Dashboard](../security_dashboard/index.md).
-
-## Interacting with the vulnerabilities **(ULTIMATE)**
-
-Once a vulnerability is found, you can interact with it. Read more on how to
-[interact with the vulnerabilities](../index.md#interacting-with-the-vulnerabilities).
-
-## Vulnerabilities database
-
-Vulnerabilities contained in the vulnerability database can be searched
-and viewed at the [GitLab vulnerability advisory database](https://advisories.gitlab.com).
-
-### Vulnerabilities database update
-
-For more information about the vulnerabilities database update, check the
-[maintenance table](../index.md#maintenance-and-update-of-the-vulnerabilities-database).
-
## Running SAST in an offline environment
For self-managed GitLab instances in an environment with limited, restricted, or intermittent access
diff --git a/doc/user/application_security/secret_detection/index.md b/doc/user/application_security/secret_detection/index.md
index 98177e804f3..d2a576e9e03 100644
--- a/doc/user/application_security/secret_detection/index.md
+++ b/doc/user/application_security/secret_detection/index.md
@@ -5,7 +5,7 @@ group: Static Analysis
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Secret Detection
+# Secret Detection **(FREE)**
> - [Introduced](https://about.gitlab.com/releases/2019/03/22/gitlab-11-9-released/#detect-secrets-and-credentials-in-the-repository) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 11.9.
> - Made [available in all tiers](https://gitlab.com/gitlab-org/gitlab/-/issues/222788) in 13.3.
@@ -102,8 +102,7 @@ as shown in the following table:
Secret Detection is performed by a [specific analyzer](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/Secret-Detection.gitlab-ci.yml)
during the `secret-detection` job. It runs regardless of your app's programming language.
-The Secret Detection analyzer includes [Gitleaks](https://github.com/zricethezav/gitleaks) and
-[TruffleHog](https://github.com/dxa4481/truffleHog) checks.
+The Secret Detection analyzer includes [Gitleaks](https://github.com/zricethezav/gitleaks) checks.
Note that the Secret Detection analyzer ignores Password-in-URL vulnerabilities if the password
begins with a dollar sign (`$`), as this likely indicates the password is an environment variable.
@@ -112,7 +111,7 @@ For example, `https://username:$password@example.com/path/to/repo` isn't detecte
NOTE:
You don't have to configure Secret Detection manually as shown in this section if you're using
-[Auto Secret Detection](../../../topics/autodevops/stages.md#auto-secret-detection)
+[Auto Secret Detection](../../../topics/autodevops/stages.md#auto-secret-detection),
provided by [Auto DevOps](../../../topics/autodevops/index.md).
To enable Secret Detection for GitLab 13.1 and later, you must include the
@@ -200,7 +199,7 @@ Secret Detection can be customized by defining available CI/CD variables:
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/211387) in GitLab 13.5.
You can customize the default secret detection rules provided with GitLab.
-Customization allows you to exclude rules and add new rules.
+Customization allows replace the default secret detection rules with rules that you define.
To create a custom ruleset:
@@ -258,7 +257,7 @@ want to perform a full secret scan. Running a secret scan on the full history ca
especially for larger repositories with lengthy Git histories. We recommend not setting this CI/CD variable
as part of your normal job definition.
-A new configuration variable ([`SECRET_DETECTION_HISTORIC_SCAN`](../sast/#vulnerability-filters))
+A new configuration variable ([`SECRET_DETECTION_HISTORIC_SCAN`](#available-variables))
can be set to change the behavior of the GitLab Secret Detection scan to run on the entire Git history of a repository.
We have created a [short video walkthrough](https://youtu.be/wDtc_K00Y0A) showcasing how you can perform a full history secret scan.
diff --git a/doc/user/application_security/security_dashboard/img/pipeline_security_dashboard_v13_10.png b/doc/user/application_security/security_dashboard/img/pipeline_security_dashboard_v13_10.png
new file mode 100644
index 00000000000..72b24a3fd28
--- /dev/null
+++ b/doc/user/application_security/security_dashboard/img/pipeline_security_dashboard_v13_10.png
Binary files differ
diff --git a/doc/user/application_security/security_dashboard/index.md b/doc/user/application_security/security_dashboard/index.md
index b08c19bee47..a708f72b6fc 100644
--- a/doc/user/application_security/security_dashboard/index.md
+++ b/doc/user/application_security/security_dashboard/index.md
@@ -35,9 +35,7 @@ The security dashboard and vulnerability report displays information about vulne
- [Static Application Security Testing](../sast/index.md)
- And [others](../index.md#security-scanning-tools)!
-## Requirements
-
-To use the security dashboards and vulnerability reports:
+## Prerequisites
1. At least one project inside a group must be configured with at least one of
the [supported reports](#supported-reports).
@@ -52,7 +50,7 @@ To use the security dashboards and vulnerability reports:
At the pipeline level, the Security section displays the vulnerabilities present in the branch of
the project the pipeline ran against.
-![Pipeline Security Dashboard](img/pipeline_security_dashboard_v13_3.png)
+![Pipeline Security Dashboard](img/pipeline_security_dashboard_v13_10.png)
Visit the page for any pipeline that ran any of the [supported reports](#supported-reports). To view
the pipeline's security findings, select the **Security** tab when viewing the pipeline.
@@ -63,13 +61,21 @@ job finishes but the DAST job fails, the security dashboard doesn't show SAST re
the analyzer outputs an
[exit code](../../../development/integrations/secure.md#exit-code).
+### Scan details
+
+> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/3728) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.10.
+
+The **Scan details** section lists the scans run in the pipeline and the total number of
+vulnerabilities per scan. For the DAST scan, select **Download scanned resources** to download a
+CSV file containing details of the resources scanned.
+
## Project Security Dashboard
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/235558) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.6.
At the project level, the Security Dashboard displays a chart with the number of vulnerabilities over time.
Access it by navigating to **Security & Compliance > Security Dashboard**. We display historical
-data up to 365 days.
+data up to 365 days. The chart's data is updated daily.
![Project Security Dashboard](img/project_security_dashboard_chart_v13_6.png)
@@ -175,7 +181,7 @@ lock files. Python projects can have lock files, but GitLab Secure tools don't s
## Security scans using Auto DevOps
When using [Auto DevOps](../../../topics/autodevops/index.md), use
-[special environment variables](../../../topics/autodevops/customize.md#environment-variables)
+[special environment variables](../../../topics/autodevops/customize.md#cicd-variables)
to configure daily security scans.
<!-- ## Troubleshooting
@@ -190,4 +196,4 @@ 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. -->
-Read more on how to [interact with the vulnerabilities](../index.md#interacting-with-the-vulnerabilities).
+Read more on how to [address the vulnerabilities](../index.md#addressing-vulnerabilities).
diff --git a/doc/user/application_security/threat_monitoring/index.md b/doc/user/application_security/threat_monitoring/index.md
index 13bde2ed38b..747d31df356 100644
--- a/doc/user/application_security/threat_monitoring/index.md
+++ b/doc/user/application_security/threat_monitoring/index.md
@@ -186,7 +186,7 @@ There are two ways to create policy alerts:
Once added, the UI updates and displays a warning about the dangers of too many alerts.
-#### Enable or disable Policy Alerts **(FREE SELF)**
+#### Enable or disable Policy Alerts **(ULTIMATE)**
Policy Alerts is under development but ready for production use.
It is deployed behind a feature flag that is **enabled by default**.
@@ -223,4 +223,6 @@ checkbox **Hide dismissed alerts**.
![Policy Alert List](img/threat_monitoring_policy_alert_list_v13_9.png)
+Clicking an alert's name takes the user to the [alert details page](../../../operations/incident_management/alerts.md#alert-details-page).
+
For information on work in progress for the alerts dashboard, see [this epic](https://gitlab.com/groups/gitlab-org/-/epics/5041).
diff --git a/doc/user/application_security/vulnerabilities/index.md b/doc/user/application_security/vulnerabilities/index.md
index 50f05b687f7..416db5b07fc 100644
--- a/doc/user/application_security/vulnerabilities/index.md
+++ b/doc/user/application_security/vulnerabilities/index.md
@@ -19,8 +19,7 @@ Each security vulnerability in a project's [Vulnerability Report](../vulnerabili
On the vulnerability's page, you can:
- [Change the vulnerability's status](#change-vulnerability-status).
-- [Create a GitLab issue](#create-a-gitlab-issue-for-a-vulnerability).
-- [Create a Jira issue](#create-a-jira-issue-for-a-vulnerability).
+- [Create an issue](#create-an-issue-for-a-vulnerability).
- [Link issues to the vulnerability](#link-gitlab-issues-to-the-vulnerability).
- [Automatically remediate the vulnerability](#automatically-remediate-the-vulnerability), if an
automatic solution is available.
@@ -40,7 +39,21 @@ the following values:
A timeline shows you when the vulnerability status has changed
and allows you to comment on a change.
-## Create a GitLab issue for a vulnerability
+## Create an issue for a vulnerability
+
+From a vulnerability's page you can create an issue to track all action taken to resolve or
+mitigate it.
+
+From a vulnerability you can create either:
+
+- [A GitLab issue](#create-a-gitlab-issue-for-a-vulnerability) (default).
+- [A Jira issue](#create-a-jira-issue-for-a-vulnerability).
+
+Creating a Jira issue requires that
+[Jira integration](../../project/integrations/jira_integrations.md) is enabled on the project. Note
+that when Jira integration is enabled, the GitLab issue feature is not available.
+
+### Create a GitLab issue for a vulnerability
To create a GitLab issue for a vulnerability:
@@ -50,7 +63,7 @@ To create a GitLab issue for a vulnerability:
An issue is created in the project, prepopulated with information from the vulnerability report.
The issue is then opened so you can take further action.
-## Create a Jira issue for a vulnerability
+### Create a Jira issue for a vulnerability
> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/4677) in GitLab 13.9.
> - It's [deployed behind a feature flag](../../../user/feature_flags.md), enabled by default.
@@ -64,16 +77,18 @@ This feature might not be available to you. Check the **version history** note a
Prerequisites:
-- [Enable Jira integration for vulnerabilities](../../project/integrations/jira.md). Select
- **Enable Jira issues creation from vulnerabilities** when configuring the integration.
+- [Enable Jira integration](../../project/integrations/jira.md).
+ The **Enable Jira issues creation from vulnerabilities** option must be selected as part of the configuration.
+- Each user must have a personal Jira user account with permission to create issues in the target project.
To create a Jira issue for a vulnerability:
1. Go to the vulnerability's page.
1. Select **Create Jira issue**.
+1. If you're not already logged in to Jira, log in.
-An issue is created in the linked Jira project, with the **Summary** and **Description** fields
-pre-populated. The Jira issue is then opened in a new browser tab.
+The Jira issue is created and opened in a new browser tab. The **Summary** and **Description**
+fields are pre-populated from the vulnerability's details.
### Enable or disable Jira integration for vulnerabilities **(ULTIMATE SELF)**
@@ -108,4 +123,4 @@ Linked issues are shown in the Vulnerability Report and the vulnerability's page
## Automatically remediate the vulnerability
You can fix some vulnerabilities by applying the solution that GitLab automatically
-generates for you. [Read more about the automatic remediation for vulnerabilities feature](../index.md#automatic-remediation-for-vulnerabilities).
+generates for you. [Read more about the automatic remediation for vulnerabilities feature](../index.md#apply-an-automatic-remediation-for-a-vulnerability).
diff --git a/doc/user/application_security/vulnerability_report/img/project_security_dashboard_dismissal_v13_9.png b/doc/user/application_security/vulnerability_report/img/project_security_dashboard_dismissal_v13_9.png
deleted file mode 100644
index ef96cf31fa4..00000000000
--- a/doc/user/application_security/vulnerability_report/img/project_security_dashboard_dismissal_v13_9.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/application_security/vulnerability_report/img/project_security_dashboard_status_change_v13_9.png b/doc/user/application_security/vulnerability_report/img/project_security_dashboard_status_change_v13_9.png
new file mode 100644
index 00000000000..f9f60810f20
--- /dev/null
+++ b/doc/user/application_security/vulnerability_report/img/project_security_dashboard_status_change_v13_9.png
Binary files differ
diff --git a/doc/user/application_security/vulnerability_report/img/vulnerability_details_create_issue_v13_7.png b/doc/user/application_security/vulnerability_report/img/vulnerability_details_create_issue_v13_7.png
deleted file mode 100644
index 5184ad85fa9..00000000000
--- a/doc/user/application_security/vulnerability_report/img/vulnerability_details_create_issue_v13_7.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/application_security/vulnerability_report/index.md b/doc/user/application_security/vulnerability_report/index.md
index 28083e09f1c..33d92f5e461 100644
--- a/doc/user/application_security/vulnerability_report/index.md
+++ b/doc/user/application_security/vulnerability_report/index.md
@@ -5,51 +5,107 @@ group: Threat Insights
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# GitLab Vulnerability Reports **(ULTIMATE)**
+# Vulnerability Report **(ULTIMATE)**
-Each vulnerability report contains vulnerabilities from the scans of the most recent branch merged into the default branch.
+The Vulnerability Report provides information about vulnerabilities from scans of the branch most
+recently merged into the default branch. It is available at the instance, group, and project level.
-The vulnerability reports display the total number of vulnerabilities by severity (for example,
-Critical, High, Medium, Low, Info, Unknown). Below this, a table shows each vulnerability's detected date, status, severity, description, identifier, the scanner where it was detected, and activity (including related issues or available solutions). By default, the vulnerability report is filtered to display all detected and confirmed vulnerabilities.
+The Vulnerability Report contains:
+
+- Totals of vulnerabilities per severity level.
+- Filters for common vulnerability attributes.
+- Details of each vulnerability, presented in tabular layout.
+
+The project-level Vulnerability Report also contains:
+
+- A time stamp showing when it was updated, including a link to the latest pipeline.
+- The number of failures that occurred in the most recent pipeline. Select the failure
+ notification to view the **Failed jobs** tab of the pipeline's page.
![Vulnerability Report](img/group_vulnerability_report_v13_9.png)
-You can filter which vulnerabilities display by:
+From the Vulnerability Report you can:
+
+- [Filter the list of vulnerabilities](#filter-the-list-of-vulnerabilities).
+- [View more details about a vulnerability](#view-details-of-a-vulnerability).
+- [View an issue raised for a vulnerability](#view-issues-raised-for-a-vulnerability).
+- [Change the status of vulnerabilities](#change-status-of-vulnerabilities).
+- [Export details of vulnerabilities](#export-vulnerability-details).
+
+## Vulnerability filters
+
+You can filter the vulnerabilities table by:
+
+| Filter | Available options |
+|:---------|:------------------|
+| Status | Detected, Confirmed, Dismissed, Resolved. |
+| Severity | Critical, High, Medium, Low, Info, Unknown. |
+| Scanner | [Available scanners](../index.md#security-scanning-tools). |
+| Project | For more details, see [Project filter](#project-filter). |
+| Activity | For more details, see [Activity filter](#activity-filter). |
+
+### Filter the list of vulnerabilities
+
+To filter the list of vulnerabilities:
+
+1. Select a filter.
+1. Select values from the dropdown.
+1. Repeat the above steps for each desired filter.
+
+The vulnerability table is applied immediately. The vulnerability severity totals are also updated.
+
+The filters' criteria are combined to show only vulnerabilities matching all criteria.
+An exception to this behavior is the Activity filter. For more details about how it works, see
+[Activity filter](#activity-filter).
+
+### Project filter
+
+The content of the Project filter depends on the current level:
+
+| Level | Content of the Project filter |
+|:---------------|:------------------------------|
+| Instance level | Only projects you've [added to the instance-level Security Center](../security_dashboard/index.md#adding-projects-to-the-security-center). |
+| Group level | All projects in the group. |
+| Project level | Not applicable. |
-| Filter | Available Options |
-| --- | --- |
-| Status | Detected, Confirmed, Dismissed, Resolved |
-| Severity | Critical, High, Medium, Low, Info, Unknown |
-| Scanner | [Available Scanners](../index.md#security-scanning-tools) |
-| Project | Projects configured in the Security Center settings, or all projects in the group for the group level report. This filter is not displayed on the project level vulnerability report |
-| Activity | Vulnerabilities with issues and vulnerabilities that are no longer detected in the default branch |
+### Activity filter
-The Activity filter behaves differently from the other Vulnerability Report filters. The other filter options all OR together to show results from any vulnerability matching one of the filter criteria. With the Activity filter, the selected values form mutually exclusive sets to allow for precisely locating the desired vulnerability records. Additionally, not all options can be selected in combination. Selection behavior when using the Activity filter:
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/259255) in GitLab 13.9
-| Activity Selection | Results Displayed |
-| --- | --- |
-| All | Vulnerabilities with any Activity status (same as ignoring this filter). Selecting this will deselect any other Activity filter options. |
-| No activity | Only vulnerabilities without either an associated Issue or that are no longer detected. Selecting this will deselect any other Activity filter options. |
-| With issues | Only vulnerabilities with one or more associated issues. Does not include vulnerabilities that also are no longer detected. |
-| No longer detected | Only vulnerabilities that are no longer detected in the latest pipeline scan of the `default` branch. Does not include vulnerabilities with one or more associated issues. |
+The Activity filter behaves differently from the other filters. The selected values form mutually
+exclusive sets to allow for precisely locating the desired vulnerability records. Additionally, not
+all options can be selected in combination.
+
+Selection behavior when using the Activity filter:
+
+| Activity selection | Results displayed |
+|:------------------------------------|:------------------|
+| All | Vulnerabilities with any Activity status (same as ignoring this filter). Selecting this will deselect any other Activity filter options. |
+| No activity | Only vulnerabilities without either an associated Issue or that are no longer detected. Selecting this will deselect any other Activity filter options. |
+| With issues | Only vulnerabilities with one or more associated issues. Does not include vulnerabilities that also are no longer detected. |
+| No longer detected | Only vulnerabilities that are no longer detected in the latest pipeline scan of the `default` branch. Does not include vulnerabilities with one or more associated issues. |
| With issues and No longer detected | Only vulnerabilities that have one or more associated issues and also are no longer detected in the latest pipeline scan of the `default` branch. |
-Clicking any vulnerability in the table takes you to its
-[vulnerability details](../vulnerabilities) page to see more information on that vulnerability.
+## View details of a vulnerability
+
+To view more details of a vulnerability, select the vulnerability's **Description**. The
+[vulnerability's details](../vulnerabilities) page is opened.
+
+## View issues raised for a vulnerability
The **Activity** column indicates the number of issues that have been created for the vulnerability.
Hover over an **Activity** entry and select a link go to that issue.
![Display attached issues](img/vulnerability_list_table_v13_9.png)
-Contents of the unfiltered vulnerability report can be exported using our [export feature](#export-vulnerabilities).
+## Change status of vulnerabilities
-You can also dismiss vulnerabilities in the table:
+To change the status of vulnerabilities in the table:
-1. Select the checkbox for each vulnerability you want to dismiss.
-1. In the menu that appears, select the reason for dismissal and click **Dismiss Selected**.
+1. Select the checkbox for each vulnerability you want to update the status of.
+1. In the dropdown that appears select the desired status, then select **Change status**.
-![Project Vulnerability Report](img/project_security_dashboard_dismissal_v13_9.png)
+![Project Vulnerability Report](img/project_security_dashboard_status_change_v13_9.png)
## Project Vulnerability Report
@@ -66,30 +122,37 @@ the **Failed jobs** tab of the pipeline page.
![Project Vulnerability Report](img/project_security_dashboard_v13_9.png)
-## Export vulnerabilities
+## Export vulnerability details
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/213014) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.10.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/213014) in the Security Center (previously known as the Instance Security Dashboard) and project-level Vulnerability Report (previously known as the Project Security Dashboard) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.0.
+> - [Added](https://gitlab.com/gitlab-org/gitlab/-/issues/213013) to the group-level Vulnerability Report in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.1.
-You can export all your vulnerabilities in CSV (comma separated values) format by clicking the
-**{upload}** **Export** button located at top right of the Security Dashboard. When the report is
-ready, the CSV report downloads to your local machine. The report contains all vulnerabilities for
-the projects defined in the Security Dashboard, as filters don't apply to the export function.
-
-NOTE:
-It may take several minutes for the download to start if your project contains
-thousands of vulnerabilities. Don't close the page until the download finishes.
+You can export details of the vulnerabilities listed in the Vulnerability Report. The export format
+is CSV (comma separated values). Note that all vulnerabilities are included because filters don't
+apply to the export.
-The fields in the export include:
+Fields included are:
-- Group Name
-- Project Name
-- Scanner Type
-- Scanner Name
+- Group name
+- Project name
+- Scanner type
+- Scanner name
- Status
- Vulnerability
- Details
-- Additional Information
+- Additional information
- Severity
- [CVE](https://cve.mitre.org/) (Common Vulnerabilities and Exposures)
- [CWE](https://cwe.mitre.org/) (Common Weakness Enumeration)
-- Other Identifiers
+- Other identifiers
+
+### Export details in CSV format
+
+To export details of all vulnerabilities listed in the Vulnerability Report, select **Export**.
+
+The details are retrieved from the database, then the CSV file is downloaded to your local
+computer.
+
+NOTE:
+It may take several minutes for the download to start if your project contains
+thousands of vulnerabilities. Don't close the page until the download finishes.
diff --git a/doc/user/asciidoc.md b/doc/user/asciidoc.md
index 07593c98da9..6d6460ca50f 100644
--- a/doc/user/asciidoc.md
+++ b/doc/user/asciidoc.md
@@ -30,7 +30,7 @@ Line comments, which are lines that start with `//`, are skipped:
A blank line separates paragraphs.
-A paragraph with the `[%hardbreaks]` option will preserve line breaks:
+A paragraph with the `[%hardbreaks]` option preserves line breaks:
```plaintext
[%hardbreaks]
@@ -381,7 +381,7 @@ Supported formats (named colors are not supported):
- RGB: `` `RGB[A](R, G, B[, A])` ``
- HSL: `` `HSL[A](H, S, L[, A])` ``
-Color written inside backticks will be followed by a color "chip":
+Color written inside backticks is followed by a color "chip":
```plaintext
- `#F00`
@@ -399,7 +399,7 @@ Color written inside backticks will be followed by a color "chip":
To activate equation and formula support,
set the `stem` attribute in the document's header to `latexmath`.
-Equations and formulas will be rendered using [KaTeX](https://katex.org/):
+Equations and formulas are rendered using [KaTeX](https://katex.org/):
```plaintext
:stem: latexmath
diff --git a/doc/user/clusters/agent/index.md b/doc/user/clusters/agent/index.md
index 6f3d1e197f5..9af339b20c6 100644
--- a/doc/user/clusters/agent/index.md
+++ b/doc/user/clusters/agent/index.md
@@ -21,6 +21,7 @@ tasks in a secure and cloud-native way. It enables:
- Pull-based GitOps deployments by leveraging the
[GitOps Engine](https://github.com/argoproj/gitops-engine).
- Real-time access to API endpoints in a cluster.
+- Alert generation based on [Container network policy](../../application_security/threat_monitoring/index.md#container-network-policy).
Many more features are planned. Please review [our roadmap](https://gitlab.com/groups/gitlab-org/-/epics/3329)
and [our development documentation](../../../development/agent/index.md).
@@ -36,7 +37,7 @@ sequenceDiagram
participant D as Developer
participant A as Application code repository
participant M as Manifest repository
- participant K as Kubernetes agent
+ participant K as Kubernetes Agent
participant C as Agent configuration repository
K->C: Grab the configuration
D->>+A: Pushing code changes
@@ -49,19 +50,17 @@ sequenceDiagram
There are several components that work in concert for the Agent to accomplish GitOps deployments:
-- A properly-configured Kubernetes cluster.
+- A properly-configured Kubernetes cluster where the Agent is running.
- A configuration repository that contains a `config.yaml` file, which tells the
- Agent which repositories to synchronize with.
-- A manifest repository that contains a `manifest.yaml`, which is tracked by the
- Agent and can be auto-generated. Any changes to `manifest.yaml` are applied to the cluster.
+ Agent which repositories to synchronize with the cluster.
+- A manifest repository that contains manifest files. Any changes to manifest files are applied to the cluster.
-These repositories might be the same GitLab project or separate projects.
+You can use the same GitLab project or separate projects for configuration and manifest files, as follows:
-NOTE:
-GitLab recommends you use the same GitLab project for the agent configuration
-and manifest repositories. Our backlog contains issues for adding support for
+- Single GitLab project (recommended): when you use a single repository to hold both the manifest and the configuration files, these projects can be either private or public, as you prefer.
+- Two GitLab projects: when you opt to use two different GitLab projects, one for manifest files, and another for configuration files, the manifests project must be private, while the configuration project can be either private or public. Our backlog contains issues for adding support for
[private manifest repositories outside of the configuration project](https://gitlab.com/gitlab-org/gitlab/-/issues/220912) and
-[group level agents](https://gitlab.com/gitlab-org/gitlab/-/issues/283885).
+[group level agents](https://gitlab.com/gitlab-org/gitlab/-/issues/283885) in the future.
For more details, please refer to our [full architecture documentation](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/master/doc/architecture.md#high-level-architecture) in the Agent project.
@@ -69,12 +68,12 @@ For more details, please refer to our [full architecture documentation](https://
The setup process involves a few steps to enable GitOps deployments:
-1. [Install the Agent server](#install-the-kubernetes-agent-server).
+1. [Install the Agent server](#install-the-kubernetes-agent-server) for your GitLab instance.
1. [Define a configuration repository](#define-a-configuration-repository).
1. [Create an Agent record in GitLab](#create-an-agent-record-in-gitlab).
1. [Generate and copy a Secret token used to connect to the Agent](#create-the-kubernetes-secret).
1. [Install the Agent into the cluster](#install-the-agent-into-the-cluster).
-1. [Create a `manifest.yaml`](#create-a-manifestyaml).
+1. [Create manifest files](#create-manifest-files).
### Upgrades and version compatibility
@@ -92,7 +91,13 @@ Upgrade your agent installations together with GitLab upgrades. To decide which
The available `agentk` and `kas` versions can be found in
[the container registry](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/container_registry/).
-### Install the Kubernetes Agent Server
+### Install the Kubernetes Agent Server **(FREE SELF)**
+
+[Introduced](https://gitlab.com/groups/gitlab-org/-/epics/3834) in GitLab 13.10,
+the GitLab Kubernetes Agent Server (KAS) is available on GitLab.com under `wss://kas.gitlab.com`.
+If you are a GitLab.com user, skip this step and directly
+[set up the configuration repository](#define-a-configuration-repository)
+for your agent.
The GitLab Kubernetes Agent Server (KAS) can be deployed using [Omnibus
GitLab](https://docs.gitlab.com/omnibus/) or the [GitLab
@@ -100,9 +105,6 @@ chart](https://gitlab.com/gitlab-org/charts/gitlab). If you don't already have
GitLab installed, please refer to our [installation
documentation](https://docs.gitlab.com/ee/install/README.html).
-NOTE:
-GitLab plans to include the KAS on [GitLab.com](https://gitlab.com/groups/gitlab-org/-/epics/3834).
-
#### Install with Omnibus
When using the [Omnibus GitLab](https://docs.gitlab.com/omnibus/) package:
@@ -205,7 +207,13 @@ the Agent in subsequent steps. You can create an Agent record either:
}
mutation createToken {
- clusterAgentTokenCreate(input: { clusterAgentId: <cluster-agent-id-taken-from-the-previous-mutation> }) {
+ clusterAgentTokenCreate(
+ input: {
+ clusterAgentId: "<cluster-agent-id-taken-from-the-previous-mutation>"
+ description: "<optional-description-of-token>"
+ name: "<required-name-given-to-token>"
+ }
+ ) {
secret # This is the value you need to use on the next step
token {
createdAt
@@ -223,7 +231,34 @@ the Agent in subsequent steps. You can create an Agent record either:
[Getting started with the GraphQL API page](../../../api/graphql/getting_started.md),
or the [GraphQL Explorer](https://gitlab.com/-/graphql-explorer).
-### Create the Kubernetes secret
+### Install the Agent into the cluster
+
+Next, install the in-cluster component of the Agent.
+
+NOTE:
+For GitLab.com users, the KAS is available at `wss://kas.gitlab.com`.
+
+#### One-liner installation
+
+Replace the value of `agent-token` below with the token received from the previous step. Also, replace `kas-address` with the configured access of the Kubernetes Agent Server:
+
+```shell
+docker run --rm registry.gitlab.com/gitlab-org/cluster-integration/gitlab-agent/cli:latest generate --agent-token=your-agent-token --kas-address=wss://kas.gitlab.example.com --agent-version latest | kubectl apply -f -
+```
+
+To find out the various options the above Docker container supports, run:
+
+```shell
+docker run --rm -it registry.gitlab.com/gitlab-org/cluster-integration/gitlab-agent/cli:latest generate --help
+```
+
+#### Advanced installation
+
+For more advanced configurations, we recommend to use [the `kpt` based installation method](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/tree/master/build/deployment/gitlab-agent).
+
+Otherwise, you can follow below for fully manual, detailed installation steps.
+
+##### Create the Kubernetes secret
After generating the token, you must apply it to the Kubernetes cluster.
@@ -239,9 +274,7 @@ After generating the token, you must apply it to the Kubernetes cluster.
kubectl create secret generic -n <YOUR-DESIRED-NAMESPACE> gitlab-agent-token --from-literal=token='YOUR_AGENT_TOKEN'
```
-### Install the Agent into the cluster
-
-Next, install the in-cluster component of the Agent. This example file contains the
+The following example file contains the
Kubernetes resources required for the Agent to be installed. You can modify this
example [`resources.yml` file](#example-resourcesyml-file) in the following ways:
@@ -253,7 +286,7 @@ example [`resources.yml` file](#example-resourcesyml-file) in the following ways
after you install the `gitlab-kas` sub-chart, or enable `gitlab-kas` for Omnibus GitLab.
When using the sub-chart, you must set `wss://kas.host.tld:443` as
`kas-address`, where `host.tld` is the domain you've setup for your GitLab installation.
- When using Omnibus GitLab, you must set `wss://GitLab.host.tld:443/-/kubernetes-agent` as
+ When using Omnibus GitLab, you must set `wss://GitLab.host.tld:443/-/kubernetes-agent/` as
`kas-address`, where `GitLab.host.tld` is your GitLab hostname.
- When using the sub-chart, specify the `ws` scheme (such as `ws://kas.host.tld:80`)
to use an unencrypted WebSockets connection.
@@ -288,7 +321,7 @@ NAMESPACE NAME READY STATUS RESTARTS AG
gitlab-agent gitlab-agent-77689f7dcb-5skqk 1/1 Running 0 51s
```
-#### Example `resources.yml` file
+##### Example `resources.yml` file
```yaml
apiVersion: v1
@@ -318,7 +351,7 @@ spec:
- --token-file=/config/token
- --kas-address
- wss://kas.host.tld:443 # change this line for the one below if using Omnibus GitLab
- # - wss://gitlab.host.tld:443/-/kubernetes-agent
+ # - wss://gitlab.host.tld:443/-/kubernetes-agent/
volumeMounts:
- name: token-volume
mountPath: /config
@@ -388,11 +421,10 @@ subjects:
namespace: gitlab-agent
```
-### Create a `manifest.yaml`
+### Create manifest files
In a previous step, you configured a `config.yaml` to point to the GitLab projects
-the Agent should synchronize. In each of those projects, you must create a `manifest.yaml`
-file for the Agent to monitor. You can auto-generate this `manifest.yaml` with a
+the Agent should synchronize. Agent monitors each of those projects for changes to the manifest files it contains. You can auto-generate manifest files with a
templating engine or other means.
The agent is authorized to download manifests for the configuration
@@ -400,13 +432,13 @@ project, and public projects. Support for other private projects is
planned in the issue [Agent authorization for private manifest
projects](https://gitlab.com/gitlab-org/gitlab/-/issues/220912).
-Each time you commit and push a change to this file, the Agent logs the change:
+Each time you push a change to a monitored manifest repository, the Agent logs the change:
```plaintext
2020-09-15_14:09:04.87946 gitlab-k8s-agent : time="2020-09-15T10:09:04-04:00" level=info msg="Config: new commit" agent_id=1 commit_id=e6a3651f1faa2e928fe6120e254c122451be4eea
```
-#### Example `manifest.yaml` file
+#### Example manifest file
This file creates an NGINX deployment.
@@ -443,7 +475,52 @@ The following example projects can help you get started with the Kubernetes Agen
### Deploying GitLab Runner with the Agent
You can use the Kubernetes Agent to
-[deploy GitLab Runner in a Kubernetes cluster](http://docs.gitlab.com/runner/install/kubernetes-agent.html).
+[deploy GitLab Runner in a Kubernetes cluster](https://docs.gitlab.com/runner/install/kubernetes-agent.html).
+
+## Kubernetes Network Security Alerts
+
+The GitLab Agent also provides an integration with Cilium. This integration provides a simple way to
+generate network policy-related alerts and to surface those alerts in GitLab.
+
+There are several components that work in concert for the Agent to generate the alerts:
+
+- A working Kubernetes cluster.
+- Cilium integration through either of these options:
+ - Installation through [GitLab Managed Apps](../applications.md#install-cilium-using-gitlab-cicd).
+ - Enablement of [hubble-relay](https://docs.cilium.io/en/v1.8/concepts/overview/#hubble) on an
+ existing installation.
+- One or more network policies through any of these options:
+ - Use the [Container Network Policy editor](../../application_security/threat_monitoring/index.md#container-network-policy-editor) to create and manage policies.
+ - Use an [AutoDevOps](../../application_security/threat_monitoring/index.md#container-network-policy-management) configuration.
+ - Add the required labels and annotations to existing network policies.
+- Use a configuration repository to inform the Agent through a `config.yaml` file, which
+ repositories can synchronize with. This repository might be the same, or a separate GitLab
+ project.
+
+The setup process follows the same steps as [GitOps](#get-started-with-gitops-and-the-gitlab-agent),
+with the following differences:
+
+- When you define a configuration repository, you must do so with [Cilium settings](#define-a-configuration-repository-with-cilium-settings).
+- You do not need to create a `manifest.yaml`.
+
+### Define a configuration repository with Cilium settings
+
+You need a GitLab repository to contain your Agent configuration. The minimal repository layout
+looks like this:
+
+```plaintext
+.gitlab/agents/<agent-name>/config.yaml
+```
+
+Your `config.yaml` file must specify the `host` and `port` of your Hubble Relay service. If your
+Cilium integration was performed through [GitLab Managed Apps](../applications.md#install-cilium-using-gitlab-cicd),
+you can use `hubble-relay.gitlab-managed-apps.svc.cluster.local:80`:
+
+```yaml
+cilium:
+ hubble_relay_address: "<hubble-relay-host>:<hubble-relay-port>"
+ ...
+```
## Management interfaces
@@ -497,15 +574,15 @@ 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.
-### Agent logs - ValidationError(Deployment.metadata
+### Agent logs - ValidationError(Deployment.metadata)
```plaintext
{"level":"info","time":"2020-10-30T08:56:54.329Z","msg":"Synced","project_id":"root/kas-manifest001","resource_key":"apps/Deployment/kas-test001/nginx-deployment","sync_result":"error validating data: [ValidationError(Deployment.metadata): unknown field \"replicas\" in io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta, ValidationError(Deployment.metadata): unknown field \"selector\" in io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta, ValidationError(Deployment.metadata): unknown field \"template\" in io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta]"}
```
-This error is shown if your `manifest.yaml` file is malformed, and Kubernetes can't
-create specified objects. Make sure that your `manifest.yaml` file is valid. You
-may try using it to create objects in Kubernetes directly for more troubleshooting.
+This error is shown if a manifest file is malformed, and Kubernetes can't
+create specified objects. Make sure that your manifest files are valid. You
+may try using them to create objects in Kubernetes directly for more troubleshooting.
### Agent logs - Error while dialing failed to WebSocket dial: failed to send handshake request
@@ -531,3 +608,72 @@ 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.
+
+### Agent logs - Certificate signed by unknown authority
+
+```plaintext
+{"level":"error","time":"2021-02-25T07:22:37.158Z","msg":"Reverse tunnel","mod_name":"reverse_tunnel","error":"Connect(): rpc error: code = Unavailable desc = connection error: desc = \"transport: Error while dialing failed to WebSocket dial: failed to send handshake request: Get \\\"https://GitLabhost.tld:443/-/kubernetes-agent/\\\": x509: certificate signed by unknown authority\""}
+```
+
+This error is shown if your GitLab instance is using a certificate signed by an internal CA that
+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
+will be picked up automatically.
+
+For example, if your internal CA certifciate is `myCA.pem`:
+
+```plaintext
+kubectl -n gitlab-agent create configmap ca-pemstore --from-file=myCA.pem
+```
+
+Then in `resources.yml`:
+
+```plaintext
+ spec:
+ serviceAccountName: gitlab-agent
+ containers:
+ - name: agent
+ image: "registry.gitlab.com/gitlab-org/cluster-integration/gitlab-agent/agentk:latest"
+ args:
+ - --token-file=/config/token
+ - --kas-address
+ - wss://kas.host.tld:443 # change this line for the one below if using Omnibus GitLab
+ # - wss://gitlab.host.tld:443/-/kubernetes-agent
+ volumeMounts:
+ - name: token-volume
+ mountPath: /config
+ - name: ca-pemstore-volume
+ mountPath: /etc/ssl/certs/myCA.pem
+ subPath: myCA.pem
+ volumes:
+ - name: token-volume
+ secret:
+ secretName: gitlab-agent-token
+ - name: ca-pemstore-volume
+ configMap:
+ name: ca-pemstore
+ items:
+ - key: myCA.pem
+ path: myCA.pem
+```
+
+Alternatively, you can mount the certificate file at a different location and include it using the
+`--ca-cert-file` agent parameter:
+
+```plaintext
+ containers:
+ - name: agent
+ image: "registry.gitlab.com/gitlab-org/cluster-integration/gitlab-agent/agentk:latest"
+ args:
+ - --ca-cert-file=/tmp/myCA.pem
+ - --token-file=/config/token
+ - --kas-address
+ - wss://kas.host.tld:443 # change this line for the one below if using Omnibus GitLab
+ # - wss://gitlab.host.tld:443/-/kubernetes-agent
+ volumeMounts:
+ - name: token-volume
+ mountPath: /config
+ - name: ca-pemstore-volume
+ mountPath: /tmp/myCA.pem
+ subPath: myCA.pem
+```
diff --git a/doc/user/clusters/applications.md b/doc/user/clusters/applications.md
index ad92cf9b4ed..5c3b276b90c 100644
--- a/doc/user/clusters/applications.md
+++ b/doc/user/clusters/applications.md
@@ -86,10 +86,9 @@ is saved as a [CI job artifact](../../ci/pipelines/job_artifacts.md).
#### Usage in GitLab versions earlier than 13.5
-For GitLab versions 13.5 and below, the Ingress, Fluentd, Prometheus,
-and Sentry apps are fetched from the central Helm
-[stable repository](https://kubernetes-charts.storage.googleapis.com/). This repository
-[was deleted](https://github.com/helm/charts#deprecation-timeline)
+For GitLab versions 13.5 and earlier, the Ingress, Fluentd, Prometheus, and Sentry
+apps were fetched from the central Helm stable repository (`https://kubernetes-charts.storage.googleapis.com/`).
+This repository [was deleted](https://github.com/helm/charts#deprecation-timeline)
on November 13, 2020. This causes the installation CI/CD pipeline to
fail. Upgrade to GitLab 13.6, or alternatively, you can
use the following `.gitlab-ci.yml`, which has been tested on GitLab 13.5:
@@ -372,7 +371,7 @@ For GitLab Runner to function, you _must_ specify the following:
- `runnerRegistrationToken`: The registration token for adding new runners to GitLab.
This must be [retrieved from your GitLab instance](../../ci/runners/README.md).
-These values can be specified using [CI variables](../../ci/variables/README.md):
+These values can be specified using [CI/CD variables](../../ci/variables/README.md):
- `GITLAB_RUNNER_GITLAB_URL` is used for `gitlabUrl`.
- `GITLAB_RUNNER_REGISTRATION_TOKEN` is used for `runnerRegistrationToken`
@@ -730,7 +729,7 @@ Set:
- "Redirect URI" to `http://<JupyterHub Host>/hub/oauth_callback`.
- "Scope" to `api read_repository write_repository`.
-In addition, the following variables must be specified using [CI variables](../../ci/variables/README.md):
+In addition, the following variables must be specified using [CI/CD variables](../../ci/variables/README.md):
- `JUPYTERHUB_PROXY_SECRET_TOKEN` - Secure string used for signing communications
from the hub. Read [`proxy.secretToken`](https://zero-to-jupyterhub.readthedocs.io/en/stable/reference/reference.html#proxy-secrettoken).
@@ -1469,7 +1468,7 @@ Kubernetes API, giving you access to more advanced querying capabilities. Log
data is deleted after 30 days, using [Curator](https://www.elastic.co/guide/en/elasticsearch/client/curator/5.5/about.html).
The Elastic Stack cluster application is intended as a log aggregation solution
-and is not related to our [Advanced Search](../search/advanced_global_search.md)
+and is not related to our [Advanced Search](../search/advanced_search.md)
functionality, which uses a separate Elasticsearch cluster.
To enable log shipping:
@@ -1655,3 +1654,17 @@ Error: Could not get apiVersions from Kubernetes: unable to retrieve the complet
This is a bug that was introduced in Helm `2.15` and fixed in `3.0.2`. As a workaround,
ensure [`cert-manager`](#cert-manager) is installed successfully prior to installing Prometheus.
+
+### Unable to create a Persistent Volume Claim with DigitalOcean
+
+Trying to create additional block storage volumes might lead to the following error when using DigitalOcean:
+
+```plaintext
+Server requested
+[Warning] pod has unbound immediate PersistentVolumeClaims (repeated 2 times)
+[Normal] pod didn't trigger scale-up (it wouldn't fit if a new node is added):
+Spawn failed: Timeout
+```
+
+This is due to DigitalOcean imposing a few limits with regards to creating additional block storage volumes.
+[Learn more about DigitalOcean Block Storage Volumes limits.](https://www.digitalocean.com/docs/volumes/#limits)
diff --git a/doc/user/compliance/license_compliance/index.md b/doc/user/compliance/license_compliance/index.md
index 74c608fcc38..6c734a76059 100644
--- a/doc/user/compliance/license_compliance/index.md
+++ b/doc/user/compliance/license_compliance/index.md
@@ -14,10 +14,13 @@ project's dependencies for their licenses. You can then decide whether to allow
each license. For example, if your application uses an external (open source) library whose license
is incompatible with yours, then you can deny the use of that license.
-You can take advantage of License Compliance by either [including the job](#configuration)
-in your existing `.gitlab-ci.yml` file or by implicitly using
-[Auto License Compliance](../../../topics/autodevops/stages.md#auto-license-compliance)
-that is provided by [Auto DevOps](../../../topics/autodevops/index.md).
+You can take advantage of License Compliance by either:
+
+- [Including the job](#configuration)
+ in your existing `.gitlab-ci.yml` file.
+- Implicitly using
+ [Auto License Compliance](../../../topics/autodevops/stages.md#auto-license-compliance),
+ provided by [Auto DevOps](../../../topics/autodevops/index.md).
The [License Finder](https://github.com/pivotal/LicenseFinder) scan tool runs as part of the CI/CD
pipeline, and detects the licenses in use. GitLab checks the License Compliance report, compares the
@@ -76,7 +79,7 @@ The reported licenses might be incomplete or inaccurate.
| Elixir | [Mix](https://elixir-lang.org/getting-started/mix-otp/introduction-to-mix.html) |
| C++/C | [Conan](https://conan.io/) |
| Scala | [sbt](https://www.scala-sbt.org/) |
-| Rust | [Cargo](https://crates.io/) |
+| Rust | [Cargo](https://crates.io) |
| PHP | [Composer](https://getcomposer.org/) |
## Requirements
diff --git a/doc/user/discussions/index.md b/doc/user/discussions/index.md
index 9320dbba1b8..0ac79a011ca 100644
--- a/doc/user/discussions/index.md
+++ b/doc/user/discussions/index.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+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"
type: reference, howto
---
@@ -38,27 +38,26 @@ There is a limit of 5,000 comments for every object, for example: issue, epic, a
> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/5022) in GitLab 8.11.
> - Resolvable threads can be added only to merge request diffs.
+> - Resolving comments individually was [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/28750) in GitLab 13.6.
Thread resolution helps keep track of progress during planning or code review.
-Every standard comment or thread in merge requests, commits, commit diffs, and
+Every thread in merge requests, commits, commit diffs, and
snippets is initially displayed as unresolved. They can then be individually resolved by anyone
with at least Developer access to the project or by the author of the change being reviewed.
If the thread has been resolved and a non-member un-resolves their own response,
-this will also unresolve the discussion thread.
-If the non-member then resolves this same response, this will resolve the discussion thread.
+this also unresolves the discussion thread.
+If the non-member then resolves this same response, this resolves the discussion thread.
-The need to resolve all standard comments or threads prevents you from forgetting
-to address feedback and lets you hide threads that are no longer relevant.
+The need to resolve threads prevents you from forgetting to address feedback and lets you
+hide threads that are no longer relevant.
!["A thread between two people on a piece of code"](img/thread_view.png)
### Commit threads in the context of a merge request
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/31847) in GitLab 10.3.
-
For reviewers with commit-based workflow, it may be useful to add threads to
-specific commit diffs in the context of a merge request. These threads will
+specific commit diffs in the context of a merge request. These threads
persist through a commit ID change when:
- force-pushing after a rebase
@@ -67,27 +66,27 @@ persist through a commit ID change when:
To create a commit diff thread:
1. Navigate to the merge request **Commits** tab. A list of commits that
- constitute the merge request will be shown.
+ constitute the merge request are shown.
![Merge request commits tab](img/merge_request_commits_tab.png)
-1. Navigate to a specific commit, click on the **Changes** tab (where you
- will only be presented diffs from the selected commit), and leave a comment.
+1. Navigate to a specific commit, select the **Changes** tab (where you
+ are only be presented diffs from the selected commit), and leave a comment.
![Commit diff discussion in merge request context](img/commit_comment_mr_context.png)
-1. Any threads created this way will be shown in the merge request's
+1. Any threads created this way are shown in the merge request's
**Discussions** tab and are resolvable.
![Merge request Discussions tab](img/commit_comment_mr_discussions_tab.png)
-Threads created this way will only appear in the original merge request
+Threads created this way only appear in the original merge request
and not when navigating to that commit under your project's
**Repository > Commits** page.
NOTE:
When a link of a commit reference is found in a thread inside a merge
-request, it will be automatically converted to a link in the context of the
+request, it is automatically converted to a link in the context of the
current merge request.
### Marking a comment or thread as resolved
@@ -103,8 +102,6 @@ Alternatively, you can mark each comment as resolved individually.
### Move all unresolved threads in a merge request to an issue
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/8266) in GitLab 9.1
-
To continue all open threads from a merge request in a new issue, click the
**Resolve all threads in new issue** button.
@@ -112,17 +109,17 @@ To continue all open threads from a merge request in a new issue, click the
Alternatively, when your project only accepts merge requests [when all threads
are resolved](#only-allow-merge-requests-to-be-merged-if-all-threads-are-resolved),
-there will be an **open an issue to resolve them later** link in the merge
+an **open an issue to resolve them later** link displays in the merge
request widget.
![Link in merge request widget](img/resolve_thread_open_issue_v13_9.png)
-This will prepare an issue with its content referring to the merge request and
+This prepares an issue with its content referring to the merge request and
the unresolved threads.
![Issue mentioning threads in a merge request](img/preview_issue_for_threads.png)
-Hitting **Submit issue** will cause all threads to be marked as resolved and
+Hitting **Submit issue** causes all threads to be marked as resolved and
add a note referring to the newly created issue.
![Mark threads as resolved notice](img/resolve_thread_issue_notice.png)
@@ -131,24 +128,20 @@ You can now proceed to merge the merge request from the UI.
### Moving a single thread to a new issue
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/8266) in GitLab 9.1
-
To create a new issue for a single thread, you can use the **Resolve this
thread in a new issue** button.
![Create issue for thread](img/new_issue_for_thread.png)
-This will direct you to a new issue prefilled with the content of the
+This directs you to a new issue prefilled with the content of the
thread, similar to the issues created for delegating multiple
-threads at once. Saving the issue will mark the thread as resolved and
+threads at once. Saving the issue marks the thread as resolved and
add a note to the merge request thread referencing the new issue.
![New issue for a single thread](img/preview_issue_for_thread.png)
### Only allow merge requests to be merged if all threads are resolved
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/7125) in GitLab 8.14.
-
You can prevent merge requests from being merged until all threads are
resolved.
@@ -158,15 +151,13 @@ box and hit **Save** for the changes to take effect.
![Only allow merge if all the threads are resolved settings](img/only_allow_merge_if_all_threads_are_resolved.png)
-From now on, you will not be able to merge from the UI until all threads
+From now on, you can't merge from the UI until all threads
are resolved.
![Only allow merge if all the threads are resolved message](img/resolve_thread_open_issue_v13_9.png)
### Automatically resolve merge request diff threads when they become outdated
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/14053) in GitLab 10.0.
-
You can automatically resolve merge request diff threads on lines modified
with a new push.
@@ -176,7 +167,7 @@ merge request diffs threads on lines changed with a push** check box and hit
![Automatically resolve merge request diff threads when they become outdated](img/automatically_resolve_outdated_discussions.png)
-From now on, any threads on a diff will be resolved by default if a push
+From now on, any threads on a diff are resolved by default if a push
makes that diff section outdated. Threads on lines that don't change and
top-level resolvable threads are not automatically resolved.
@@ -186,33 +177,29 @@ You can add comments and threads to a particular commit under your
project's **Repository > Commits**.
WARNING:
-Threads created this way will be lost if the commit ID changes after a
+Threads created this way are lost if the commit ID changes after a
force push.
## Threaded discussions
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/7527) in GitLab 9.1.
-
While resolvable threads are only available to merge request diffs,
threads can also be added without a diff. You can start a specific
-thread which will look like a thread, on issues, commits, snippets, and
+thread which looks like a thread, on issues, commits, snippets, and
merge requests.
-To start a threaded discussion, click on the **Comment** button toggle dropdown,
-select **Start thread** and click **Start thread** when you're ready to
+To start a threaded discussion, select the **Comment** button toggle dropdown,
+select **Start thread**, and then select **Start thread** when you're ready to
post the comment.
![Comment type toggle](img/comment_type_toggle.gif)
-This will post a comment with a single thread to allow you to discuss specific
+This posts a comment with a single thread to allow you to discuss specific
comments in greater detail.
![Thread comment](img/discussion_comment.png)
## Image threads
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/14061) in GitLab 10.1.
-
Sometimes a thread is revolved around an image. With image threads,
you can easily target a specific coordinate of an image and start a thread
around it. Image threads are available in merge requests and commit detail views.
@@ -223,33 +210,31 @@ Simply click anywhere on the image to create a new thread.
![Start image thread](img/start_image_discussion.gif)
-After you click on the image, a comment form will be displayed that would be the start
-of your thread. Once you save your comment, you will see a new badge displayed on
+After you select the image, a comment form is displayed that would be the start
+of your thread. After you save your comment, a new badge is displayed on
top of your image. This badge represents your thread.
NOTE:
This thread badge is typically associated with a number that is only used as a visual
reference for each thread. In the merge request thread tab,
-this badge will be indicated with a comment icon since each thread will render a new
+this badge is indicated with a comment icon, because each thread renders a new
image section.
Image threads also work on diffs that replace an existing image. In this diff view
mode, you can toggle the different view modes and still see the thread point badges.
-| 2-up | Swipe | Onion Skin |
-| :-----------: | :----------: | :----------: |
+| 2-up | Swipe | Onion Skin |
+|:-----------:|:----------:|:----------:|
| ![2-up view](img/two_up_view.png) | ![swipe view](img/swipe_view.png) | ![onion skin view](img/onion_skin_view.png) |
Image threads also work well with resolvable threads. Resolved threads
-on diffs (not on the merge request discussion tab) will appear collapsed on page
-load and will have a corresponding badge counter to match the counter on the image.
+on diffs (not on the merge request discussion tab) appear collapsed on page
+load and have a corresponding badge counter to match the counter on the image.
![Image resolved thread](img/image_resolved_discussion.png)
## Lock discussions
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/14531) in GitLab 10.1.
-
For large projects with many contributors, it may be useful to stop threads
in issues or merge requests in these scenarios:
@@ -279,7 +264,7 @@ edit existing comments. Non-team members are restricted from adding or editing c
| :-----------: | :----------: |
| ![Comment form member](img/lock_form_member.png) | ![Comment form non-member](img/lock_form_non_member.png) |
-Additionally, locked issues and merge requests can not be reopened.
+Additionally, locked issues and merge requests can't be reopened.
## Confidential Comments
@@ -292,29 +277,29 @@ Additionally, locked issues and merge requests can not be reopened.
WARNING:
This feature might not be available to you. Check the **version history** note above for details.
-When creating a comment, you can decide to make it visible only to the project members (users with Reporter and higher permissions).
+When creating a comment, you can make it visible only to the project members (users with Reporter and higher permissions).
-To create a confidential comment, select the **Make this comment confidential** checkbox before you submit it.
+To create a confidential comment, select the **Make this comment confidential** check box before you submit it.
![Confidential comments](img/confidential_comments_v13_9.png)
-## Merge Request Reviews
+## Merge request reviews
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/4213) in [GitLab Premium](https://about.gitlab.com/pricing/) 11.4.
> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/28154) to GitLab Free in 13.1.
-When looking at a Merge Request diff, you are able to start a review.
-This allows you to create comments inside a Merge Request that are **only visible to you** until published,
+When looking at a merge request diff, you are able to start a review.
+This allows you to create comments inside a merge request that are **only visible to you** until published,
in order to allow you to submit them all as a single action.
### Starting a review
-In order to start a review, simply write a comment on a diff as normal under the **Changes** tab
-in an MR and click on the **Start a review** button.
+To start a review, write a comment on a diff as normal under the **Changes** tab
+in a merge request, and then select **Start a review**.
![Starting a review](img/mr_review_start.png)
-Once a review is started, you will see any comments that are part of this review marked `Pending`.
+After a review is started, any comments that are part of this review are marked `Pending`.
All comments that are part of a review show two buttons:
- **Finish review**: Submits all comments that are part of the review, making them visible to other users.
@@ -322,7 +307,7 @@ All comments that are part of a review show two buttons:
![A comment that is part of a review](img/pending_review_comment.png)
-You can use [quick actions](../project/quick_actions.md) inside review comments. The comment will show the actions that will be performed once published.
+You can use [quick actions](../project/quick_actions.md) inside review comments. The comment shows the actions to perform after publication.
![A review comment with quick actions](img/review_comment_quickactions.png)
@@ -330,19 +315,19 @@ To add more comments to a review, start writing a comment as normal and click th
![Adding a second comment to a review](img/mr_review_second_comment.png)
-This will add the comment to the review.
+This adds the comment to the review.
![Second review comment](img/mr_review_second_comment_added.png)
### Resolving/Unresolving threads
Review comments can also resolve/unresolve [resolvable threads](#resolvable-comments-and-threads).
-When replying to a comment, you will see a checkbox that you can click in order to resolve or unresolve
-the thread once published.
+When replying to a comment, a checkbox is displayed that you can click to resolve or unresolve
+the thread after publication.
![Resolve checkbox](img/mr_review_resolve.png)
-If a particular pending comment will resolve or unresolve the thread, this will be shown on the pending
+If a particular pending comment resolves or unresolves the thread, this is shown on the pending
comment itself.
![Resolve status](img/mr_review_resolve2.png)
@@ -351,12 +336,12 @@ comment itself.
### Submitting a review
-If you have any comments that have not been submitted, you will see a bar at the
+If you have any comments that have not been submitted, a bar displays at the
bottom of the screen with two buttons:
- **Discard**: Discards all comments that have not been submitted.
- **Finish review**: Opens a list of comments ready to be submitted for review.
- Clicking **Submit review** will publish all comments. Any quick actions
+ Clicking **Submit review** publishes all comments. Any quick actions
submitted are performed at this time.
Alternatively, to finish the entire review from a pending comment:
@@ -366,14 +351,14 @@ Alternatively, to finish the entire review from a pending comment:
![Review submission](img/review_preview.png)
-Submitting the review will send a single email to every notifiable user of the
+Submitting the review sends a single email to every notifiable user of the
merge request with all the comments associated to it.
Replying to this email will, consequentially, create a new comment on the associated merge request.
## Filtering notes
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/26723) in GitLab 11.5.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/26723) in GitLab 11.5.
For issues with many comments like activity notes and user comments, sometimes
finding useful information can be hard. There is a way to filter comments from single notes and threads for merge requests and issues.
@@ -387,24 +372,21 @@ From a merge request's **Discussion** tab, or from an epic/issue overview, find
![Notes filters dropdown options](img/index_notes_filters.png)
-After you select one of the filters in a given issue or MR, GitLab will save
-your preference, so that it will persist when you visit the same page again
+After you select one of the filters in a given issue or merge request, GitLab saves
+your preference, so that it persists when you visit the same page again
from any device you're logged into.
## Suggest Changes
> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/18008) in GitLab 11.6.
-> - Custom commit messages for suggestions was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/25381) in GitLab 13.9.
-> - Custom commit messages for suggestions was deployed behind a [feature flag](../feature_flags.md), disabled by default.
-> - Custom commit messages for suggestions became enabled by default on GitLab 13.9.
-> - Custom commit messages for suggestions is enabled on GitLab.com and is recommended for production use.
-> - For GitLab self-managed instances, GitLab administrators can opt to [disabled it](#enable-or-disable-custom-commit-messages-for-suggestions). **(FREE SELF)**
-
-As a reviewer, you're able to suggest code changes with a simple
-Markdown syntax in Merge Request Diff threads. Then, the
-Merge Request author (or other users with appropriate
+> - Custom commit messages for suggestions was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/25381) in GitLab 13.9 behind a [feature flag](../feature_flags.md), disabled by default.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/297404) in GitLab 13.10.
+
+As a reviewer, you're able to suggest code changes with a
+Markdown syntax in merge request diff threads. Then, the
+merge request author (or other users with appropriate
[permission](../permissions.md)) is able to apply these
-Suggestions with a click, which will generate a commit in
+Suggestions with a click, which generates a commit in
the merge request authored by the user that applied them.
1. Choose a line of code to be changed, add a new comment, then click
@@ -425,19 +407,18 @@ the merge request authored by the user that applied them.
1. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/25381) in GitLab 13.9,
you can opt to add a custom commit message to describe your change. If you don't
- specify it, the default commit message will be used. Note that [this feature may not be available to you](#enable-or-disable-custom-commit-messages-for-suggestions).
- Also, it is not supported for [batch suggestions](#batch-suggestions).
+ specify it, the default commit message is used. It is not supported for [batch suggestions](#batch-suggestions).
![Custom commit](img/custom_commit_v13_9.png)
-After the author applies a Suggestion, it will be marked with the **Applied** label,
-the thread will be automatically resolved, and GitLab will create a new commit
+After the author applies a Suggestion, it is marked with the **Applied** label,
+the thread is automatically resolved, and GitLab creates a new commit
and push the suggested change directly into the codebase in the merge request's
branch. [Developer permission](../permissions.md) is required to do so.
### Multi-line Suggestions
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/53310) in GitLab 11.10.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/53310) in GitLab 11.10.
Reviewers can also suggest changes to multiple lines with a single Suggestion
within merge request diff threads by adjusting the range offsets. The
@@ -469,12 +450,12 @@ instead of the usual three.
### Configure the commit message for applied Suggestions
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13086) in GitLab 12.7.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13086) in GitLab 12.7.
GitLab uses a default commit message
when applying Suggestions: `Apply %{suggestions_count} suggestion(s) to %{files_count} file(s)`
-For example, consider that a user applied 3 suggestions to 2 different files, the default commit message will be: **Apply 3 suggestion(s) to 2 file(s)**
+For example, consider that a user applied 3 suggestions to 2 different files, the default commit message is: **Apply 3 suggestion(s) to 2 file(s)**
These commit messages can be customized to follow any guidelines you might have. To do so, expand the **Merge requests**
tab within your project's **General** settings and change the
@@ -484,23 +465,23 @@ tab within your project's **General** settings and change the
You can also use following variables besides static text:
-| Variable | Description | Output example |
-|---|---|---|
-| `%{branch_name}` | The name of the branch the Suggestion(s) was(were) applied to. | `my-feature-branch` |
-| `%{files_count}` | The number of file(s) to which Suggestion(s) was(were) applied.| **2** |
-| `%{file_paths}` | The path(s) of the file(s) Suggestion(s) was(were) applied to. Paths are separated by commas.| `docs/index.md, docs/about.md` |
-| `%{project_path}` | The project path. | `my-group/my-project` |
-| `%{project_name}` | The human-readable name of the project. | **My Project** |
+| Variable | Description | Output example |
+|------------------------|-------------|----------------|
+| `%{branch_name}` | The name of the branch the Suggestion(s) was(were) applied to. | `my-feature-branch` |
+| `%{files_count}` | The number of file(s) to which Suggestion(s) was(were) applied.| **2** |
+| `%{file_paths}` | The path(s) of the file(s) Suggestion(s) was(were) applied to. Paths are separated by commas.| `docs/index.md, docs/about.md` |
+| `%{project_path}` | The project path. | `my-group/my-project` |
+| `%{project_name}` | The human-readable name of the project. | **My Project** |
| `%{suggestions_count}` | The number of Suggestions applied.| **3** |
-| `%{username}` | The username of the user applying Suggestion(s). | `user_1` |
-| `%{user_full_name}` | The full name of the user applying Suggestion(s). | **User 1** |
+| `%{username}` | The username of the user applying Suggestion(s). | `user_1` |
+| `%{user_full_name}` | The full name of the user applying Suggestion(s). | **User 1** |
For example, to customize the commit message to output
**Addresses user_1's review**, set the custom text to
`Addresses %{username}'s review`.
NOTE:
-Custom commit messages for each applied Suggestion (and for batch Suggestions) will be
+Custom commit messages for each applied Suggestion is
introduced by [#25381](https://gitlab.com/gitlab-org/gitlab/-/issues/25381).
### Batch Suggestions
@@ -514,7 +495,7 @@ introduced by [#25381](https://gitlab.com/gitlab-org/gitlab/-/issues/25381).
You can apply multiple suggestions at once to reduce the number of commits added
to your branch to address your reviewers' requests.
-1. To start a batch of suggestions that will be applied with a single commit, click **Add suggestion to batch**:
+1. To start a batch of suggestions to apply with a single commit, click **Add suggestion to batch**:
![A code change suggestion displayed, with the button to add the suggestion to a batch highlighted.](img/add_first_suggestion_to_batch_v13_1.jpg "Add a suggestion to a batch")
@@ -532,7 +513,7 @@ to your branch to address your reviewers' requests.
## Start a thread by replying to a standard comment
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/30299) in GitLab 11.9
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/30299) in GitLab 11.9
To reply to a standard (non-thread) comment, you can use the **Reply to comment** button.
@@ -540,20 +521,20 @@ To reply to a standard (non-thread) comment, you can use the **Reply to comment*
The **Reply to comment** button is only displayed if you have permissions to reply to an existing thread, or start a thread from a standard comment.
-Clicking on the **Reply to comment** button will bring the reply area into focus and you can type your reply.
+Clicking on the **Reply to comment** button brings the reply area into focus and you can type your reply.
![Reply to comment feature](img/reply_to_comment.gif)
-Replying to a non-thread comment will convert the non-thread comment to a
+Replying to a non-thread comment converts the non-thread comment to a
thread after the reply is submitted. This conversion is considered an edit
-to the original comment, so a note about when it was last edited will appear underneath it.
+to the original comment, so a note about when it was last edited appears underneath it.
-This feature only exists for Issues, Merge requests, and Epics. Commits, Snippets and Merge request diff threads are
+This feature exists only for issues, merge requests, and epics. Commits, snippets, and merge request diff threads are
not supported yet.
## Assign an issue to the commenting user
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/191455) in GitLab 13.1.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/191455) in GitLab 13.1.
You can assign an issue to a user who made a comment.
@@ -582,25 +563,6 @@ To disable it:
Feature.disable(:confidential_notes)
```
-## Enable or disable Custom commit messages for suggestions **(FREE SELF)**
-
-Custom commit messages for suggestions 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 custom commit messages for suggestions:
-
-```ruby
-Feature.disable(:suggestions_custom_commit)
-```
-
-To enable custom commit messages for suggestions:
-
-```ruby
-Feature.enable(:suggestions_custom_commit)
-```
-
## Enable or disable Batch Suggestions **(FREE SELF)**
Batch Suggestions is
diff --git a/doc/user/group/custom_project_templates.md b/doc/user/group/custom_project_templates.md
index a59b1f2e9b2..813d2b8e265 100644
--- a/doc/user/group/custom_project_templates.md
+++ b/doc/user/group/custom_project_templates.md
@@ -11,7 +11,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
Custom project templates are useful for organizations that need to create many similar types of [projects](../project/index.md) and want to start from the same jumping-off point.
-## Setting up Group-level Project Templates
+## Setting up group-level project templates
To use a custom project template for a new project you need to:
@@ -30,7 +30,7 @@ To use a custom project template for a new project you need to:
Here is a sample group/project structure for a hypothetical "Acme Co" for project templates:
-```txt
+```plaintext
# GitLab instance and group
gitlab.com/acmeco/
# Subgroups
diff --git a/doc/user/group/epics/index.md b/doc/user/group/epics/index.md
index c76b07481b2..1cb024ceb01 100644
--- a/doc/user/group/epics/index.md
+++ b/doc/user/group/epics/index.md
@@ -154,7 +154,7 @@ You can also consult the [group permissions table](../../permissions.md#group-me
- Comments: collaborate on that epic by posting comments in its thread.
These text fields also fully support
- [GitLab Flavored Markdown](../../markdown.md#gitlab-flavored-markdown-gfm).
+ [GitLab Flavored Markdown](../../markdown.md#gitlab-flavored-markdown).
## Comment or start a thread
diff --git a/doc/user/group/epics/manage_epics.md b/doc/user/group/epics/manage_epics.md
index d4c1a5fc768..3c5e140965a 100644
--- a/doc/user/group/epics/manage_epics.md
+++ b/doc/user/group/epics/manage_epics.md
@@ -75,6 +75,9 @@ A modal appears to confirm your action.
Deleting an epic releases all existing issues from their associated epic in the system.
+WARNING:
+If you delete an epic, all its child epics and their descendants are deleted as well. If needed, you can [remove child epics](#remove-a-child-epic-from-a-parent-epic) from the parent epic before you delete it.
+
## Close an epic
Whenever you decide that there is no longer need for that epic,
@@ -243,7 +246,7 @@ To move an issue to another epic:
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`
-[quick action](../../project/quick_actions.md#quick-actions-for-issues-merge-requests-and-epics).
+[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
related to the issue public as epics are public to group members.
diff --git a/doc/user/group/img/access_requests_management.png b/doc/user/group/img/access_requests_management.png
deleted file mode 100644
index 7de6a1c0a5e..00000000000
--- a/doc/user/group/img/access_requests_management.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/add_new_members_v13_7.png b/doc/user/group/img/add_new_members_v13_7.png
deleted file mode 100644
index 7e06bdf8fd1..00000000000
--- a/doc/user/group/img/add_new_members_v13_7.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/create_new_group_info.png b/doc/user/group/img/create_new_group_info.png
deleted file mode 100644
index bd724240c37..00000000000
--- a/doc/user/group/img/create_new_group_info.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/create_new_project_from_group_v13_6.png b/doc/user/group/img/create_new_project_from_group_v13_6.png
deleted file mode 100644
index 72d19817686..00000000000
--- a/doc/user/group/img/create_new_project_from_group_v13_6.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/group_activity_analytics_v12_10.png b/doc/user/group/img/group_activity_analytics_v12_10.png
deleted file mode 100644
index e49594c155b..00000000000
--- a/doc/user/group/img/group_activity_analytics_v12_10.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/group_activity_analytics_v13_10.png b/doc/user/group/img/group_activity_analytics_v13_10.png
new file mode 100644
index 00000000000..b6e9b04861d
--- /dev/null
+++ b/doc/user/group/img/group_activity_analytics_v13_10.png
Binary files differ
diff --git a/doc/user/group/img/group_file_template_dropdown.png b/doc/user/group/img/group_file_template_dropdown.png
deleted file mode 100644
index f0586772218..00000000000
--- a/doc/user/group/img/group_file_template_dropdown.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/group_members_filter_2fa_disabled_13_7.png b/doc/user/group/img/group_members_filter_2fa_disabled_13_7.png
deleted file mode 100644
index 8336103bad1..00000000000
--- a/doc/user/group/img/group_members_filter_2fa_disabled_13_7.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/group_members_filter_2fa_enabled_13_7.png b/doc/user/group/img/group_members_filter_2fa_enabled_13_7.png
deleted file mode 100644
index eb27906b583..00000000000
--- a/doc/user/group/img/group_members_filter_2fa_enabled_13_7.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/group_members_filter_direct_13_7.png b/doc/user/group/img/group_members_filter_direct_13_7.png
deleted file mode 100644
index c1b2d996e59..00000000000
--- a/doc/user/group/img/group_members_filter_direct_13_7.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/group_members_filter_inherited_13_7.png b/doc/user/group/img/group_members_filter_inherited_13_7.png
deleted file mode 100644
index f75990f9da8..00000000000
--- a/doc/user/group/img/group_members_filter_inherited_13_7.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/group_members_search_13_7.png b/doc/user/group/img/group_members_search_13_7.png
deleted file mode 100644
index 21f36fc75f8..00000000000
--- a/doc/user/group/img/group_members_search_13_7.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/group_members_sort_13_7.png b/doc/user/group/img/group_members_sort_13_7.png
deleted file mode 100644
index 5d307da649a..00000000000
--- a/doc/user/group/img/group_members_sort_13_7.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/group_settings.png b/doc/user/group/img/group_settings.png
deleted file mode 100644
index f3a75f1bde8..00000000000
--- a/doc/user/group/img/group_settings.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/groups.png b/doc/user/group/img/groups.png
deleted file mode 100644
index 2e27d46b370..00000000000
--- a/doc/user/group/img/groups.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/ldap_sync_cn_v13_1.png b/doc/user/group/img/ldap_sync_cn_v13_1.png
deleted file mode 100644
index 279b3192328..00000000000
--- a/doc/user/group/img/ldap_sync_cn_v13_1.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/ldap_sync_filter_v13_1.png b/doc/user/group/img/ldap_sync_filter_v13_1.png
deleted file mode 100644
index 655bed58d46..00000000000
--- a/doc/user/group/img/ldap_sync_filter_v13_1.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/manual_permissions_v13_7.png b/doc/user/group/img/manual_permissions_v13_7.png
deleted file mode 100644
index fcea0121915..00000000000
--- a/doc/user/group/img/manual_permissions_v13_7.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/member_lock.png b/doc/user/group/img/member_lock.png
deleted file mode 100644
index 3f1382e76c6..00000000000
--- a/doc/user/group/img/member_lock.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/new_group_from_groups.png b/doc/user/group/img/new_group_from_groups.png
deleted file mode 100644
index ffafac1b1cd..00000000000
--- a/doc/user/group/img/new_group_from_groups.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/new_group_from_other_pages.png b/doc/user/group/img/new_group_from_other_pages.png
deleted file mode 100644
index f84501d1ff2..00000000000
--- a/doc/user/group/img/new_group_from_other_pages.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/request_access_button.png b/doc/user/group/img/request_access_button.png
deleted file mode 100644
index 4d73990ec7e..00000000000
--- a/doc/user/group/img/request_access_button.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/select_group_dropdown.png b/doc/user/group/img/select_group_dropdown.png
deleted file mode 100644
index 4948cefb65f..00000000000
--- a/doc/user/group/img/select_group_dropdown.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/select_group_dropdown_13_10.png b/doc/user/group/img/select_group_dropdown_13_10.png
new file mode 100644
index 00000000000..bf0d927b653
--- /dev/null
+++ b/doc/user/group/img/select_group_dropdown_13_10.png
Binary files differ
diff --git a/doc/user/group/img/share_with_group_lock.png b/doc/user/group/img/share_with_group_lock.png
deleted file mode 100644
index 77b00d8a248..00000000000
--- a/doc/user/group/img/share_with_group_lock.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/img/withdraw_access_request_button.png b/doc/user/group/img/withdraw_access_request_button.png
deleted file mode 100644
index a5fe78eb090..00000000000
--- a/doc/user/group/img/withdraw_access_request_button.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/import/index.md b/doc/user/group/import/index.md
index f4d15dce1cd..302f12273cb 100644
--- a/doc/user/group/import/index.md
+++ b/doc/user/group/import/index.md
@@ -20,11 +20,23 @@ Using GitLab Group Migration, you can migrate existing top-level groups from Git
The following resources are migrated to the target instance:
-- Groups
+- Groups ([Introduced in 13.7](https://gitlab.com/groups/gitlab-org/-/epics/4374))
- description
- attributes
- subgroups
-- Epics
+- Group Labels ([Introduced in 13.9](https://gitlab.com/gitlab-org/gitlab/-/issues/292429))
+ - title
+ - description
+ - color
+ - created_at ([Introduced in 13.10](https://gitlab.com/gitlab-org/gitlab/-/issues/300007))
+ - updated_at ([Introduced in 13.10](https://gitlab.com/gitlab-org/gitlab/-/issues/300007))
+- Members ([Introduced in 13.9](https://gitlab.com/gitlab-org/gitlab/-/issues/299415))
+ Group members are associated with the imported group if:
+ - The user already exists in the target GitLab instance and
+ - The user has a public email in the source GitLab instance that matches a
+ confirmed email in the target GitLab instance
+ confirmed email in the target GitLab instance
+- Epics ([Introduced in 13.7](https://gitlab.com/gitlab-org/gitlab/-/issues/250281))
- title
- description
- state (open / closed)
@@ -32,6 +44,28 @@ The following resources are migrated to the target instance:
- due date
- epic order on boards
- confidentiality
+ - labels ([Introduced in 13.9](https://gitlab.com/gitlab-org/gitlab/-/issues/297460))
+ - author ([Introduced in 13.9](https://gitlab.com/gitlab-org/gitlab/-/issues/298745))
+ - parent epic ([Introduced in 13.9](https://gitlab.com/gitlab-org/gitlab/-/issues/297459))
+ - emoji award ([Introduced in 13.9](https://gitlab.com/gitlab-org/gitlab/-/issues/297466))
+ - events ([Introduced in 13.10](https://gitlab.com/gitlab-org/gitlab/-/issues/297465))
+- Milestones ([Introduced in 13.10](https://gitlab.com/gitlab-org/gitlab/-/issues/292427))
+ - title
+ - description
+ - state (active / closed)
+ - start date
+ - due date
+ - created at
+ - updated at
+- Iterations ([Introduced in 13.10](https://gitlab.com/gitlab-org/gitlab/-/issues/292428))
+ - iid
+ - title
+ - description
+ - state (upcoming / started / closed)
+ - start date
+ - due date
+ - created at
+ - updated at
Any other items are **not** migrated.
diff --git a/doc/user/group/index.md b/doc/user/group/index.md
index 4c63bae7e44..655a0dcb00f 100644
--- a/doc/user/group/index.md
+++ b/doc/user/group/index.md
@@ -5,56 +5,36 @@ group: Access
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Groups
+# Groups **(FREE)**
-With GitLab Groups, you can:
+In GitLab, you can put related projects together in a group.
-- Assemble related projects together.
-- Grant members access to several projects at once.
+For example, you might create a group for your company members and a subgroup for each individual team.
+You can name the group `company-team`, and the subgroups `backend-team`, `frontend-team`, and `production-team`.
-For a video introduction to GitLab Groups, see [GitLab University: Repositories, Projects and Groups](https://www.youtube.com/watch?v=4TWfh1aKHHw).
+Then you can:
-Groups can also be nested in [subgroups](subgroups/index.md).
+- Grant members access to multiple projects at once.
+- Add to-do items for all of the group members at once.
+- View the [issues](../project/issues/index.md#issues-list) and
+ [merge requests](../project/merge_requests/reviewing_and_managing_merge_requests.md#view-merge-requests-for-all-projects-in-a-group)
+ for all projects in the group, together in a single list view.
+- [Bulk edit](../group/bulk_editing/index.md) issues, epics, and merge requests.
-Find your groups by clicking **Groups > Your Groups** in the top navigation.
+You can also create [subgroups](subgroups/index.md).
-![GitLab Groups](img/groups.png)
+## View groups
-> The **Groups** dropdown in the top navigation was [introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/36234) in [GitLab 11.1](https://about.gitlab.com/releases/2018/07/22/gitlab-11-1-released/#groups-dropdown-in-navigation).
+To view groups:
-The **Groups** page displays:
+1. In the top menu, select **Groups > Your Groups**. All groups you are a member of are displayed.
+1. To view a list of public groups, select **Explore public groups**.
-- All groups you are a member of, when **Your groups** is selected.
-- A list of public groups, when **Explore public groups** is selected.
+You can also view groups by namespace.
-Each group on the **Groups** page is listed with:
+### Namespaces
-- How many subgroups it has.
-- How many projects it contains.
-- How many members the group has, not including members inherited from parent group(s).
-- The group's visibility.
-- A link to the group's settings, if you have sufficient permissions.
-- A link to leave the group, if you are a member.
-
-## Use cases
-
-You can create groups for numerous reasons. To name a couple:
-
-- Grant access to multiple projects and multiple team members in fewer steps by organizing related projects under the same [namespace](#namespaces) and adding members to the top-level group.
-- Make it easier to `@mention` all of your team at once in issues and merge requests by creating a group and including the appropriate members.
-
-For example, you could create a group for your company members, and create a [subgroup](subgroups/index.md) for each individual team. Let's say you create a group called `company-team`, and you create subgroups in this group for the individual teams `backend-team`, `frontend-team`, and `production-team`.
-
-- When you start a new implementation from an issue, you add a comment:
- _"`@company-team`, let's do it! `@company-team/backend-team` you're good to go!"_
-- When your backend team needs help from frontend, they add a comment:
- _"`@company-team/frontend-team` could you help us here please?"_
-- When the frontend team completes their implementation, they comment:
- _"`@company-team/backend-team`, it's done! Let's ship it `@company-team/production-team`!"_
-
-## Namespaces
-
-In GitLab, a namespace is a unique name to be used as a user name, a group name, or a subgroup name.
+In GitLab, a namespace is a unique name and URL for a user, a group, or subgroup.
- `http://gitlab.example.com/username`
- `http://gitlab.example.com/groupname`
@@ -62,154 +42,106 @@ In GitLab, a namespace is a unique name to be used as a user name, a group name,
For example, consider a user named Alex:
-1. Alex creates an account on GitLab.com with the username `alex`;
- their profile will be accessed under `https://gitlab.example.com/alex`
-1. Alex creates a group for their team with the group name `alex-team`;
- the group and its projects will be accessed under `https://gitlab.example.com/alex-team`
-1. Alex creates a subgroup of `alex-team` with the subgroup name `marketing`;
- this subgroup and its projects will be accessed under `https://gitlab.example.com/alex-team/marketing`
-
-By doing so:
-
-- Any team member mentions Alex with `@alex`
-- Alex mentions everyone from their team with `@alex-team`
-- Alex mentions only the marketing team with `@alex-team/marketing`
-
-## Issues and merge requests within a group
-
-Issues and merge requests are part of projects. For a given group, you can view all of the
-[issues](../project/issues/index.md#issues-list) and [merge requests](../project/merge_requests/reviewing_and_managing_merge_requests.md#view-merge-requests-for-all-projects-in-a-group) across all projects in that group,
-together in a single list view.
-
-### Bulk editing issues and merge requests
-
-For details, see [bulk editing issues and merge requests](../group/bulk_editing/index.md).
-
-## Create a new group
-
-> For a list of words that are not allowed to be used as group names see the
-> [reserved names](../reserved_names.md).
-
-To create a new Group, either:
-
-- In the top menu, click **Groups** and then **Your Groups**, and click the green button **New group**.
-
- ![new group from groups page](img/new_group_from_groups.png)
+1. Alex creates an account with the username `alex`: `https://gitlab.example.com/alex`
+1. Alex creates a group for their team with the group name `alex-team`.
+ The group and its projects are available at: `https://gitlab.example.com/alex-team`
+1. Alex creates a subgroup of `alex-team` with the subgroup name `marketing`.
+ The subgroup and its projects are available at: `https://gitlab.example.com/alex-team/marketing`
-- Or, in the top menu, expand the `plus` sign and choose **New group**.
+## Create a group
- ![new group from elsewhere](img/new_group_from_other_pages.png)
+To create a group:
-Add the following information:
-
-![new group information](img/create_new_group_info.png)
-
-1. The **Group name** will automatically populate the URL. Optionally, you can change it.
- This is the name that displays in group views.
- The name can contain only:
+1. From the top menu, either:
+ - Select **Groups > Your Groups**, and on the right, select the **New group** button.
+ - To the left of the search box, select the plus sign and then **New group**.
+1. For the **Group name**, use only:
- Alphanumeric characters
+ - Emojis
- Underscores
- - Dashes and dots
- - Spaces
-1. The **Group URL** is the namespace under which your projects will be hosted.
- The URL can contain only:
+ - Dashes, dots, spaces, and parentheses (however, it cannot start with any of these characters)
+
+ For a list of words that cannot be used as group names, see [reserved names](../reserved_names.md).
+
+1. For the **Group URL**, which is used for the [namespace](#namespaces),
+ use only:
- Alphanumeric characters
- Underscores
- Dashes and dots (it cannot start with dashes or end in a dot)
-1. Optionally, you can add a brief description to tell others
- what this group is about.
-1. Optionally, choose an avatar for your group.
1. Choose the [visibility level](../../public_access/public_access.md).
+1. Invite GitLab members or other users to join the group.
-For more details on creating groups, watch the video [GitLab Namespaces (users, groups and subgroups)](https://youtu.be/r0sJgjR2f5A).
+<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
+For details about groups, watch [GitLab Namespaces (users, groups and subgroups)](https://youtu.be/r0sJgjR2f5A).
## Add users to a group
-A benefit of putting multiple projects in one group is that you can
-give a user access to all projects in the group with one action.
-
-Add members to a group by navigating to the group's dashboard and clicking **Members**.
-
-![add members to group](img/add_new_members_v13_7.png)
-
-Select the [permission level](../permissions.md#permissions), and add the new member. You can also set the expiring date for that user; this is the date on which they will no longer have access to your group.
-
-Consider a group with two projects:
-
-- On the **Group Members** page, you can now add a new user to the group.
-- Now, because this user is a **Developer** member of the group, they automatically
- get **Developer** access to **all projects** within that group.
+You can give a user access to all projects in a group.
-To increase the access level of an existing user for a specific project,
-add them again as a new member to the project with the desired permission level.
+1. From the top menu, select **Groups > Your Groups**.
+1. Find your group and select it.
+1. From the left sidebar, select **Members**.
+1. Fill in the fields.
+ - The role applies to all projects in the group. [Learn more about permissions](../permissions.md#permissions).
+ - On the **Access expiration date**, the user can no longer access projects in the group.
## Request access to a group
-As a group owner, you can enable or disable the ability for non-members to request access to
-your group. Go to the group settings, and click **Allow users to request access**.
+As a user, you can request to be a member of a group, if an administrator allows it.
-As a user, you can request to be a member of a group, if that setting is enabled. Go to the group for which you'd like to be a member, and click the **Request Access** button on the right
-side of your screen.
+1. From the top menu, select **Groups > Your Groups**.
+1. Find the group and select it.
+1. Under the group name, select **Request Access**.
-![Request access button](img/request_access_button.png)
+As many as ten of the most-recently-active group owners receive an email with your request.
+Any group owner can approve or decline the request.
-Once access is requested:
+If you change your mind before your request is approved, select
+**Withdraw Access Request**.
-- Up to ten group owners are notified of your request via email.
- Email is sent to the most recently active group owners.
-- Any group owner can approve or decline your request on the members page.
+## Prevent users from requesting access to a group
-![Manage access requests](img/access_requests_management.png)
+As a group owner, you can prevent non-members from requesting access to
+your group.
-If you change your mind before your request is approved, just click the
-**Withdraw Access Request** button.
-
-![Withdraw access request button](img/withdraw_access_request_button.png)
-
-## Changing the owner of a group
+1. From the top menu, select **Groups > Your Groups**.
+1. Find the group and select it.
+1. From the left menu, select **Settings > General**.
+1. Expand the **Permissions, LFS, 2FA** section.
+1. Clear the **Allow users to request access** checkbox.
+1. Select **Save changes**.
-Ownership of a group means at least one of its members has
-[Owner permission](../permissions.md#group-members-permissions). Groups must have at
-least one owner.
+## Change the owner of a group
-Changing the owner of a group with only one owner is possible. To change the sole owner
-of a group:
+You can change the owner of a group. Each group must always have at least one
+member with [Owner permission](../permissions.md#group-members-permissions).
- As an administrator:
- 1. Go to the group's **{users}** **Members** tab.
+ 1. Go to the group and from the left menu, select **Members**.
1. Give a different member **Owner** permissions.
1. Refresh the page. You can now remove **Owner** permissions from the original owner.
- As the current group's owner:
- 1. Go to the group's **{users}** **Members** tab.
+ 1. Go to the group and from the left menu, select **Members**.
1. Give a different member **Owner** permissions.
1. Have the new owner sign in and remove **Owner** permissions from you.
## Remove a member from the group
-Only users with permissions of [Owner](../permissions.md#group-members-permissions) can manage
-group members.
-
-You can remove a member from the group if the given member has a direct membership in the group. If
-membership is inherited from a parent group, then the member can be removed only from the parent
-group itself.
-
-When removing a member, you can decide whether to unassign the user from all issues and merge
-requests they are currently assigned or leave the assignments as they are.
+Prerequisites:
-- **Unassigning the removed member** from all issues and merge requests might be helpful when a user
- is leaving a private group and you wish to revoke their access to any issues and merge requests
- they are assigned.
-- **Keeping the issues and merge requests assigned** might be helpful for groups that accept public
- contributions where a user doesn't have to be a member to be able to contribute to issues and
- merge requests.
+- You must have [Owner permissions](../permissions.md#group-members-permissions).
+- The member must have direct membership in the group. If
+ membership is inherited from a parent group, then the member can be removed
+ from the parent group only.
To remove a member from a group:
-1. In a group, go to **{users}** **Members**.
-1. Click the **Delete** **{remove}** button next to a group member you want to remove.
- A **Remove member** modal appears.
-1. (Optional) Select the **Also unassign this user from related issues and merge requests** checkbox.
-1. Click **Remove member**.
+1. Go to the group.
+1. From the left menu, select **Members**.
+1. Next to the member you want to remove, select **Delete**.
+1. Optional. On the **Remove member** confirmation box, select the
+ **Also unassign this user from related issues and merge requests** checkbox.
+1. Select **Remove member**.
## Filter and sort members in a group
@@ -217,56 +149,49 @@ To remove a member from a group:
> - [Improved](https://gitlab.com/gitlab-org/gitlab/-/issues/228675) in GitLab 13.7.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/289911) in GitLab 13.8.
-The following sections illustrate how you can filter and sort members in a group. To view these options,
-navigate to your desired group, go to **Members**, and include the noted search terms.
-
-### Membership filter
-
-By default, inherited and direct members are displayed. The [membership](subgroups/index.md#membership) filter can be used to display only inherited or only direct members.
-
-#### Only display inherited members
-
-Include `Membership` `=` `Inherited` in the search text box.
+To find members in a group, you can sort, filter, or search.
-![Group members filter inherited](img/group_members_filter_inherited_13_7.png)
+### Filter a group
-#### Only display direct members
+Filter a group to find members. By default, all members in the group and subgroups are displayed.
-Include `Membership` `=` `Direct` in the search text box.
+1. Go to the group and select **Members**.
+1. Above the list of members, in the **Filter members** box, enter filter criteria.
+ - To view members in the group only, select **Membership = Direct**.
+ - To view members of the group and its subgroups, select **Membership = Inherited**.
+ - To view members with two-factor authentication enabled or disabled, select **2FA = Enabled** or **Disabled**.
-![Group members filter direct](img/group_members_filter_direct_13_7.png)
+### Search a group
-### 2FA filter
-
-[Owner](../permissions.md#group-members-permissions) permissions required.
-
-By default, members with 2FA enabled and disabled are displayed. The 2FA filter can be used to display only members with 2FA enabled or only members with 2FA disabled.
-
-#### Only display members with 2FA enabled
-
-Include `2FA` `=` `Enabled` in the search text box.
-
-![Group members filter 2FA enabled](img/group_members_filter_2fa_enabled_13_7.png)
-
-#### Only display members with 2FA disabled
+You can search for members by name, username, or email.
-Include `2FA` `=` `Disabled` in the search text box.
+1. Go to the group and select **Members**.
+1. Above the list of members, in the **Filter members** box, enter search criteria.
+1. To the right of the **Filter members** box, select the magnifying glass (**{search}**).
-![Group members filter 2FA disabled](img/group_members_filter_2fa_disabled_13_7.png)
+### Sort members in a group
-### Search
+You can sort members by **Account**, **Access granted**, **Max role**, or **Last sign-in**.
-You can search for members by name, username, or email.
+1. Go to the group and select **Members**.
+1. Above the list of members, on the top right, from the **Account** list, select
+ the criteria to filter by.
+1. To switch the sort between ascending and descending, to the right of the **Account** list, select the
+ arrow (**{sort-lowest}** or **{sort-highest}**).
-![Group members search](img/group_members_search_13_7.png)
+## Mention a group in an issue or merge request
-### Sort
+When you mention a group in a comment, every member of the group gets a to-do item
+added to their To-do list.
-You can sort members by **Account**, **Access granted**, **Max role**, or **Last sign-in** in ascending or descending order.
+1. Open the MR or issue.
+1. In a comment, type `@` followed by the user, group, or subgroup namespace.
+ For example, `@alex`, `@alex-team`, or `@alex-team/marketing`.
+1. Select **Comment**.
-![Group members sort](img/group_members_sort_13_7.png)
+A to-do item is created for all the group and subgroup members.
-## Changing the default branch protection of a group
+## Change the default branch protection of a group
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/7583) in GitLab 12.9.
@@ -289,15 +214,11 @@ In [GitLab Premium or higher](https://about.gitlab.com/pricing/), GitLab adminis
There are two different ways to add a new project to a group:
- Select a group, and then click **New project**. You can then continue [creating your project](../../user/project/working_with_projects.md#create-a-project).
+- While you are creating a project, select a group from the dropdown menu.
- ![New project](img/create_new_project_from_group_v13_6.png)
-
-- While you are creating a project, select a group namespace
- you've already created from the dropdown menu.
+ ![Select group](img/select_group_dropdown_13_10.png)
- ![Select group](img/select_group_dropdown.png)
-
-### Default project-creation level
+### Specify who can add projects to a group
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/2534) in [GitLab Premium](https://about.gitlab.com/pricing/) 10.5.
> - Brought to [GitLab Starter](https://about.gitlab.com/pricing/) in 10.7.
@@ -314,154 +235,103 @@ To change this setting for a specific group:
To change this setting globally, see [Default project creation protection](../admin_area/settings/visibility_and_access_controls.md#default-project-creation-protection).
-## View group details
-
-A group's **Details** page includes tabs for:
-
-- Subgroups and projects.
-- Shared projects.
-- Archived projects.
-
-### Group activity analytics overview
+## Group activity analytics **(PREMIUM)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/207164) in GitLab [Starter](https://about.gitlab.com/pricing/) 12.10 as
-a [beta feature](https://about.gitlab.com/handbook/product/#beta)
-
-The group details view also shows the number of the following items created in the last 90 days: **(PREMIUM)**
-
-- Merge requests.
-- Issues.
-- Members.
-
-These Group Activity Analytics can be enabled with the `group_activity_analytics` [feature flag](../../development/feature_flags/development.md#enabling-a-feature-flag-locally-in-development).
-
-![Recent Group Activity](img/group_activity_analytics_v12_10.png)
-
-For details, see the section on how you can [View group activity](#view-group-activity).
+a [beta feature](https://about.gitlab.com/handbook/product/#beta).
-## View group activity
+For a group, you can view how many merge requests, issues, and members were created in the last 90 days.
-A group's **Activity** page displays the most recent actions taken in a group, including:
+These Group Activity Analytics can be enabled with the `group_activity_analytics` [feature flag](../../development/feature_flags/index.md#enabling-a-feature-flag-locally-in-development).
-- **Push events**: Recent pushes to branches.
-- **Merge events**: Recent merges.
-- **Issue events**: Issues opened or closed.
-- **Epic events**: Epics opened or closed.
-- **Comments**: Comments opened or closed.
-- **Team**: Team members who have joined or left the group.
-- **Wiki**: Wikis created, deleted, or updated.
+![Recent Group Activity](img/group_activity_analytics_v13_10.png)
-The entire activity feed is also available in Atom format by clicking the
-**RSS** icon.
+### View group activity
-To view a group's **Activity** page:
+You can view the most recent actions taken in a group.
-1. Go to the group's page.
-1. In the left navigation menu, go to **Group Overview** and select **Activity**.
+1. From the top menu, select **Groups > Your Groups**.
+1. Find the group and select it.
+1. From the left menu, select **Group overview > Activity**.
-## Transfer projects into groups
+To view the activity feed in Atom format, select the
+**RSS** (**{rss}**) icon.
-Learn how to [transfer a project into a group](../project/settings/index.md#transferring-an-existing-project-into-another-namespace).
-
-## Sharing a project with a group
-
-You can [share your projects with a group](../project/members/share_project_with_groups.md)
-and give all group members access to the project at once.
-
-Alternatively, you can [lock the sharing with group feature](#share-with-group-lock).
-
-## Sharing a group with another group
+## Share a group with another group
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/18328) in GitLab 12.7.
-Similarly to [sharing a project with a group](#sharing-a-project-with-a-group),
-you can share a group with another group to give direct group members access
+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 is not valid for inherited members.
-To share a given group, for example, 'Frontend' with another group, for example,
-'Engineering':
+To share a given group, for example, `Frontend` with another group, for example,
+`Engineering`:
-1. Navigate to your 'Frontend' group page and use the left navigation menu to go
- to your group **Members**.
+1. Go to the `Frontend` group.
+1. From the left menu, select **Members**.
1. Select the **Invite group** tab.
-1. Add 'Engineering' with the maximum access level of your choice.
-1. Click **Invite**.
+1. In the **Select a group to invite** list, select `Engineering`.
+1. For the **Max access level**, select an access level.
+1. Select **Invite**.
-All the members of the 'Engineering' group will have been added to 'Frontend'.
+All the members of the `Engineering` group are added to the `Frontend` group.
## Manage group memberships via LDAP **(PREMIUM SELF)**
-Group syncing allows LDAP groups to be mapped to GitLab groups. This provides more control over per-group user management. To configure group syncing edit the `group_base` **DN** (`'OU=Global Groups,OU=GitLab INT,DC=GitLab,DC=org'`). This **OU** contains all groups that will be associated with GitLab groups.
+Group syncing allows LDAP groups to be mapped to GitLab groups. This provides more control over per-group user management. To configure group syncing, edit the `group_base` **DN** (`'OU=Global Groups,OU=GitLab INT,DC=GitLab,DC=org'`). This **OU** contains all groups that will be associated with GitLab groups.
-Group links can be created using either a CN or a filter. These group links are created on the **Group Settings -> LDAP Synchronization** page. After configuring the link, it may take over an hour for the users to sync with the GitLab group.
+Group links can be created by using either a CN or a filter. To create these group links, go to the group's **Settings > LDAP Synchronization** page. After configuring the link, it may take more than an hour for the users to sync with the GitLab group.
For more information on the administration of LDAP and group sync, refer to the [main LDAP documentation](../../administration/auth/ldap/index.md#group-sync).
NOTE:
-If an LDAP user is a group member when LDAP Synchronization is added, and they are not part of the LDAP group, they will be removed from the group.
+When you add LDAP synchronization, if an LDAP user is a group member and they are not part of the LDAP group, they are removed from the group.
-### Creating group links via CN **(PREMIUM SELF)**
+### Create group links via CN **(PREMIUM SELF)**
To create group links via CN:
<!-- vale gitlab.Spelling = NO -->
1. Select the **LDAP Server** for the link.
-1. Select `LDAP Group cn` as the **Sync method**.
-1. In the **LDAP Group cn** text input box, begin typing the CN of the group. There will be a dropdown menu with matching CNs within the configured `group_base`. Select your CN from this list.
+1. As the **Sync method**, select `LDAP Group cn`.
+1. In the **LDAP Group cn** field, begin typing the CN of the group. There is a dropdown menu with matching CNs in the configured `group_base`. Select your CN from this list.
1. In the **LDAP Access** section, select the [permission level](../permissions.md) for users synced in this group.
-1. Click the `Add Synchronization` button to save this group link.
-
-![Creating group links via CN](img/ldap_sync_cn_v13_1.png)
+1. Select the **Add Synchronization** button.
<!-- vale gitlab.Spelling = YES -->
-### Creating group links via filter **(PREMIUM SELF)**
+### Create group links via filter **(PREMIUM SELF)**
To create group links via filter:
1. Select the **LDAP Server** for the link.
-1. Select `LDAP user filter` as the **Sync method**.
+1. As the **Sync method**, select `LDAP user filter`.
1. Input your filter in the **LDAP User filter** box. Follow the [documentation on user filters](../../administration/auth/ldap/index.md#set-up-ldap-user-filter).
1. In the **LDAP Access** section, select the [permission level](../permissions.md) for users synced in this group.
-1. Click the `Add Synchronization` button to save this group link.
+1. Select the **Add Synchronization** button.
-![Creating group links via filter](img/ldap_sync_filter_v13_1.png)
+### Override user permissions **(PREMIUM SELF)**
-### Overriding user permissions **(PREMIUM SELF)**
-
-In GitLab [8.15](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/822) and later, LDAP user permissions can now be manually overridden by an admin user. To override a user's permissions:
+LDAP user permissions can be manually overridden by an administrator. To override a user's permissions:
1. Go to your group's **Members** page.
-1. Select the pencil icon in the row for the user you are editing.
-1. Select the brown `Edit permissions` button in the modal.
-
-![Setting manual permissions](img/manual_permissions_v13_7.png)
-
-Now you will be able to edit the user's permissions from the **Members** page.
-
-## Epics **(ULTIMATE)**
+1. In the row for the user you are editing, select the pencil (**{pencil}**) icon.
+1. Select the brown **Edit permissions** button in the modal.
-> Introduced in [GitLab Ultimate](https://about.gitlab.com/pricing/) 10.2.
-
-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.
-
-[Learn more about Epics.](epics/index.md)
+Now you can edit the user's permissions from the **Members** page.
## Group wikis **(PREMIUM)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13195) in [GitLab Premium](https://about.gitlab.com/pricing/) 13.5.
-Group wikis work the same way as [project wikis](../project/wiki/index.md), please refer to those docs for details on usage.
+Group wikis work the same way as [project wikis](../project/wiki/index.md).
Group wikis can be edited by members with [Developer permissions](../../user/permissions.md#group-members-permissions)
and above.
-Group wiki repositories can be moved through the [Group repository storage moves API](../../api/group_repository_storage_moves.md).
-
-### Group wikis limitations
+You can move group wiki repositories by using the [Group repository storage moves API](../../api/group_repository_storage_moves.md).
There are a few limitations compared to project wikis:
@@ -469,33 +339,11 @@ There are a few limitations compared to project wikis:
- Group wikis are not included in global search and Geo replication.
- Changes to group wikis don't show up in the group's activity feed.
-For updates, you can follow:
-
-- [The epic tracking feature parity with project wikis](https://gitlab.com/groups/gitlab-org/-/epics/2782).
-
-## Group Security Dashboard **(ULTIMATE)**
-
-Get an overview of the vulnerabilities of all the projects in a group and its subgroups.
-
-[Learn more about the Group Security Dashboard.](../application_security/security_dashboard/index.md)
-
-## Insights **(ULTIMATE)**
-
-> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/725) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.0.
+For updates, follow [the epic that tracks feature parity with project wikis](https://gitlab.com/groups/gitlab-org/-/epics/2782).
-Configure the Insights that matter for your groups or projects, allowing users
-to explore data such as:
+## Transfer a group
-- Triage hygiene
-- Issues created/closed per a given period
-- Average time for merge requests to be merged
-- Much more
-
-[Learn more about Insights](insights/index.md).
-
-## Transferring groups
-
-From GitLab 10.5, you can transfer groups in the following ways:
+You can transfer groups in the following ways:
- Transfer a subgroup to a new parent group.
- Convert a top-level group into a subgroup by transferring it to the desired group.
@@ -506,214 +354,173 @@ When transferring groups, note:
- Changing a group's parent can have unintended side effects. See [Redirects when changing repository paths](../project/repository/index.md#redirects-when-changing-repository-paths).
- You can only transfer groups to groups you manage.
- You must update your local repositories to point to the new location.
-- If the immediate parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will change to match the new parent group's visibility.
+- If the immediate parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects change to match the new parent group's visibility.
- Only explicit group membership is transferred, not inherited membership. If the group's owners have only inherited membership, this leaves the group without an owner. In this case, the user transferring the group becomes the group's owner.
-- Transfers will fail if [packages](../packages/index.md) exist in any of the projects within the group, or in any of its subgroups.
-
-## Group settings
-
-After creating a group, you can manage its settings by navigating to
-the group's dashboard, and clicking **Settings**.
+- Transfers fail if [packages](../packages/index.md) exist in any of the projects in the group, or in any of its subgroups.
-![group settings](img/group_settings.png)
-
-### General settings
-
-In addition to editing any settings you previously
-set when [creating the group](#create-a-new-group), you can also
-access further configurations for your group.
-
-#### Changing a group's path
+## Change a group's path
Changing a group's path (group URL) can have unintended side effects. Read
-[how redirects will behave](../project/repository/index.md#redirects-when-changing-repository-paths)
-before proceeding.
+[how redirects behave](../project/repository/index.md#redirects-when-changing-repository-paths)
+before you proceed.
-If you are vacating the path so it can be claimed by another group or user,
-you may need to rename the group too, since both names and paths must
+If you are changing the path so it can be claimed by another group or user,
+you may need to rename the group too. Both names and paths must
be unique.
+To retain ownership of the original namespace and protect the URL redirects,
+create a new group and transfer projects to it instead.
+
To change your group path (group URL):
-1. Navigate to your group's **Settings > General** page.
+1. Go to your group's **Settings > General** page.
1. Expand the **Path, transfer, remove** section.
-1. Enter a new name under **Change group URL**.
-1. Click **Change group URL**.
+1. Under **Change group URL**, enter a new name.
+1. Select **Change group URL**.
WARNING:
-It is currently not possible to rename a namespace if it contains a
+It is not possible to rename a namespace if it contains a
project with [Container Registry](../packages/container_registry/index.md) tags,
because the project cannot be moved.
-NOTE:
-If you want to retain ownership over the original namespace and
-protect the URL redirects, then instead of changing a group's path or renaming a
-username, you can create a new group and transfer projects to it.
-
-### Group repository settings
-
-You can change settings that are specific to repositories in your group.
-
-#### Custom initial branch name **(FREE)**
+## Use a custom name for the initial branch
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/43290) in GitLab 13.6.
By default, when you create a new project in GitLab, the initial branch is called `master`.
For groups, a group owner can customize the initial branch name to something
-else. This way, every new project created under that group from then on will start from the custom branch name rather than `master`. To do so:
+else. This way, every new project created under that group from then on starts from the custom branch name rather than `master`.
+
+To use a custom name for the initial branch:
-1. Go to the **Group page > Settings > Repository** and expand **Default initial
- branch name**.
+1. Go to the group's **Settings > Repository** page.
+1. Expand the **Default initial branch name** section.
1. Change the default initial branch to a custom name of your choice.
-1. **Save Changes**.
+1. Select **Save changes**.
-### Remove a group
+## Remove a group
To remove a group and its contents:
-1. Navigate to your group's **Settings > General** page.
+1. Go to your group's **Settings > General** page.
1. Expand the **Path, transfer, remove** section.
-1. In the Remove group section, click the **Remove group** button.
-1. Confirm the action when asked to.
+1. In the Remove group section, select **Remove group**.
+1. Confirm the action.
-This action either:
+This action removes the group. It also adds a background job to delete all projects in the group.
-- Removes the group, and also queues a background job to delete all projects in that group.
-- Since [GitLab 12.8](https://gitlab.com/gitlab-org/gitlab/-/issues/33257), on [Premium](https://about.gitlab.com/pricing/premium/) or higher tiers, this action adds a background job to mark a group for deletion. By default, the job schedules the deletion 7 days in the future. You can modify this waiting period through the [instance settings](../admin_area/settings/visibility_and_access_controls.md#default-deletion-delay).
+Specifically:
-Since [GitLab 13.6](https://gitlab.com/gitlab-org/gitlab/-/issues/39504), if the user who sets up the deletion leaves or is otherwise removed from the group before the
-actual deletion happens, the job is cancelled, and the group is no longer scheduled for deletion.
+- In [GitLab 12.8 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/33257), on [Premium](https://about.gitlab.com/pricing/premium/) or higher tiers, this action adds a background job to mark a group for deletion. By default, the job schedules the deletion 7 days in the future. You can modify this waiting period through the [instance settings](../admin_area/settings/visibility_and_access_controls.md#default-deletion-delay).
+- In [GitLab 13.6 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/39504), if the user who sets up the deletion is removed from the group before the
+deletion happens, the job is cancelled, and the group is no longer scheduled for deletion.
-### Restore a group **(PREMIUM)**
+## Restore a group **(PREMIUM)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/33257) in GitLab 12.8.
To restore a group that is marked for deletion:
-1. Navigate to your group's **Settings > General** page.
+1. Go to your group's **Settings > General** page.
1. Expand the **Path, transfer, remove** section.
-1. In the Restore group section, click the **Restore group** button.
+1. In the Restore group section, select **Restore group**.
-#### Enforce 2FA to group members
-
-Add a security layer to your group by
-[enforcing two-factor authentication (2FA)](../../security/two_factor_authentication.md#enforcing-2fa-for-all-users-in-a-group)
-for all group members.
-
-#### Share with group lock
+## Prevent a project from being shared with groups
Prevent projects in a group from [sharing
a project with another group](../project/members/share_project_with_groups.md) to enable tighter control over project access.
-For example, let's say you have two distinct teams (Group A and Group B) working together in a project, and to inherit the group membership, you share the project between the
-two groups A and B. **Share with group lock** prevents any project within
-the group from being shared with another group,
-guaranteeing that only the right group members have access to those projects.
+To prevent a project from being shared with other groups:
-To enable this feature, navigate to the group settings page. Select
-**Share with group lock** and **Save the group**.
-
-![Checkbox for share with group lock](img/share_with_group_lock.png)
+1. Go to the group's **Settings > General** page.
+1. Expand the **Permissions, LFS, 2FA** section.
+1. Select **Prevent sharing a project within <group_name> with other groups**.
+1. Select **Save changes**.
-#### Member Lock **(PREMIUM)**
+## Prevent members from being added to a group **(PREMIUM)**
-Member lock lets a group owner prevent any new project membership to all of the
-projects within a group, allowing tighter control over project membership.
+As a group owner, you can prevent any new project membership for all
+projects in a group, allowing tighter control over project membership.
For example, if you want to lock the group for an [Audit Event](../../administration/audit_events.md),
-enable Member lock to guarantee that project membership cannot be modified during that audit.
-
-To enable this feature:
+you can guarantee that project membership cannot be modified during the audit.
-1. Navigate to the group's **Settings > General** page.
-1. Expand the **Permissions, LFS, 2FA** section, and select **Member lock**.
-1. Click **Save changes**.
+To prevent members from being added to a group:
-![Checkbox for membership lock](img/member_lock.png)
+1. Go to the group's **Settings > General** page.
+1. Expand the **Permissions, LFS, 2FA** section.
+1. Under **Member lock**, select **Prevent adding new members to project membership within this group**.
+1. Select **Save changes**.
-This will disable the option for all users who previously had permissions to
-operate project memberships, so no new users can be added. Furthermore, any
-request to add a new user to a project through API will not be possible.
+All users who previously had permissions can no longer add members to a group.
+API requests to add a new user to a project are not possible.
-#### IP access restriction **(PREMIUM)**
+## Restrict group access by IP address **(PREMIUM)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/1985) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.0.
> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/215410) to [GitLab Premium](https://about.gitlab.com/pricing/) in 13.1.
NOTE:
-IP Access Restrictions are currently not functioning as expected on GitLab.com. Some users
-may experience blocked Git operations or have difficulties accessing projects. Please
-review the [following bug report](https://gitlab.com/gitlab-org/gitlab/-/issues/271673) for
-more information.
+IP access restrictions are not functioning as expected on GitLab.com. If enabled,
+users cannot perform Git operations through SSH, or access projects in the UI.
+For more information, [see this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/271673).
-To make sure only people from within your organization can access particular
-resources, you have the option to restrict access to groups and their
-underlying subgroups, projects, issues, and so on, by IP address. This can help ensure that
-particular content doesn't leave the premises, while not blocking off access to
-the entire instance. IP access restrictions can only be configured at the group level.
+To ensure only people from your organization can access particular
+resources, you can restrict access to groups by IP address. This setting applies to all subgroups,
+projects, issues, and so on.
-Add one or more allowed IP subnets using CIDR notation to the group settings and anyone
-coming from a different IP address won't be able to access the restricted
-content.
+IP access restrictions can be configured at the group level only.
-Restriction currently applies to:
+This restriction applies to:
-- UI.
-- [From GitLab 12.3](https://gitlab.com/gitlab-org/gitlab/-/issues/12874), API access.
-- [From GitLab 12.4](https://gitlab.com/gitlab-org/gitlab/-/issues/32113), Git actions via SSH.
+- The GitLab UI.
+- [In GitLab 12.3 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/12874), the API.
+- [In GitLab 12.4 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/32113), Git actions via SSH.
-To avoid accidental lock-out, admins and group owners are able to access
-the group regardless of the IP restriction.
+Administrators and group owners are able to access the group regardless of the IP restriction.
-To enable this feature:
+To restrict group access by IP address:
-1. Navigate to the group’s **Settings > General** page.
-1. Expand the **Permissions, LFS, 2FA** section, and enter IP address ranges into **Allow access to the following IP addresses** field.
-1. Click **Save changes**.
+1. Go to the group’s **Settings > General** page.
+1. Expand the **Permissions, LFS, 2FA** section.
+1. In the **Allow access to the following IP addresses** field, enter IP address ranges in CIDR notation.
+1. Select **Save changes**.
![Domain restriction by IP address](img/restrict-by-ip.gif)
-#### Allowed domain restriction **(PREMIUM)**
+## Restrict group access by domain **(PREMIUM)**
>- [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/7297) in [GitLab Premium](https://about.gitlab.com/pricing/) 12.2.
->- Support for specifying multiple email domains [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/33143) in GitLab 13.1
+>- Support for specifying multiple email domains [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/33143) added in GitLab 13.1.
-You can restrict access to groups by allowing only users with email addresses in particular domains to be added to the group.
+You can prevent users with email addresses in specific domains from being added to a group.
-Add email domains you want to allow and users with emails from different domains won't be allowed to be added to this group.
-
-Some domains cannot be restricted. These are the most popular public email domains, such as:
+To restrict group access by domain:
-- `gmail.com`
-- `yahoo.com`
-- `hotmail.com`
-- `aol.com`
-- `msn.com`
-- `hotmail.co.uk`
-- `hotmail.fr`
-- `live.com`
-- `outlook.com`
-- `icloud.com`
-
-To enable this feature:
-
-1. Navigate to the group's **Settings > General** page.
-1. Expand the **Permissions, LFS, 2FA** section, and enter the domain names into **Restrict membership by email** field.
-1. Click **Save changes**.
+1. Go to the group's **Settings > General** page.
+1. Expand the **Permissions, LFS, 2FA** section.
+1. In the **Restrict membership by email** field, enter the domain names.
+1. Select **Save changes**.
![Domain restriction by email](img/restrict-by-email.gif)
-This will enable the domain-checking for all new users added to the group from this moment on.
+Any time you attempt to add a new user, they are compared against this list.
+
+Some domains cannot be restricted. These are the most popular public email domains, such as:
+
+- `gmail.com`, `yahoo.com`, `aol.com`, `icloud.com`
+- `hotmail.com`, `hotmail.co.uk`, `hotmail.fr`
+- `msn.com`, `live.com`, `outlook.com`
NOTE:
-Domain restrictions only apply to groups and do not prevent users from being added as members of projects owned by the restricted group.
+Domain restrictions apply to groups only. They do not prevent users from being added as members of projects owned by the restricted group.
-#### Group file templates **(PREMIUM)**
+## Group file templates **(PREMIUM)**
-Group file templates allow you to share a set of templates for common file
+Use group file templates to share a set of templates for common file
types with every project in a group. It is analogous to the
-[instance template repository](../admin_area/settings/instance_template_repository.md)
-feature, and the selected project should follow the same naming conventions as
+[instance template repository](../admin_area/settings/instance_template_repository.md).
+The selected project should follow the same naming conventions as
are documented on that page.
You can only choose projects in the group as the template source.
@@ -721,38 +528,38 @@ This includes projects shared with the group, but it **excludes** projects in
subgroups or parent groups of the group being configured.
You can configure this feature for both subgroups and immediate parent groups. A project
-in a subgroup will have access to the templates for that subgroup, as well as
+in a subgroup has access to the templates for that subgroup, as well as
any immediate parent groups.
-![Group file template dropdown](img/group_file_template_dropdown.png)
+To learn how to create templates for issues and merge requests, see
+[Description templates](../project/description_templates.md).
-To enable this feature, navigate to the group settings page, expand the
-**Templates** section, choose a project to act as the template repository, and
-**Save group**.
+Define project templates at a group level by setting a group as the template source.
+[Learn more about group-level project templates](custom_project_templates.md). **(PREMIUM)**
-![Group file template settings](img/group_file_template_settings.png)
+### Enable group file template **(PREMIUM)**
-To learn how to create templates for issues and merge requests, visit
-[Description templates](../project/description_templates.md).
+To enable group file templates:
-#### Group-level project templates **(PREMIUM)**
-
-Define project templates at a group level by setting a group as the template source.
-[Learn more about group-level project templates](custom_project_templates.md).
+1. Go to the group's **Settings > General** page.
+1. Expand the **Templates** section.
+1. Choose a project to act as the template repository.
+1. Select **Save changes**.
-#### Disabling email notifications
+## Disable email notifications
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/23585) in GitLab 12.2.
You can disable all email notifications related to the group, which includes its subgroups and projects.
-To enable this feature:
+To disable email notifications:
-1. Navigate to the group's **Settings > General** page.
-1. Expand the **Permissions, LFS, 2FA** section, and select **Disable email notifications**.
-1. Click **Save changes**.
+1. Go to the group's **Settings > General** page.
+1. Expand the **Permissions, LFS, 2FA** section.
+1. Select **Disable email notifications**.
+1. Select **Save changes**.
-#### Disabling group mentions
+## Disable group mentions
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/21301) in GitLab 12.6.
@@ -763,120 +570,95 @@ Groups with disabled mentions are visualized accordingly in the autocompletion d
This is particularly helpful for groups with a large number of users.
-To enable this feature:
+To disable group mentions:
-1. Navigate to the group's **Settings > General** page.
-1. Expand the **Permissions, LFS, 2FA** section, and select **Disable group mentions**.
-1. Click **Save changes**.
+1. Go to the group's **Settings > General** page.
+1. Expand the **Permissions, LFS, 2FA** section.
+1. Select **Disable group mentions**.
+1. Select **Save changes**.
-#### Enabling delayed Project removal **(PREMIUM)**
+## Enable delayed project removal **(PREMIUM)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/220382) in GitLab 13.2.
-By default, projects within a group are deleted immediately.
+By default, projects in a group are deleted immediately.
Optionally, on [Premium](https://about.gitlab.com/pricing/) or higher tiers,
-you can configure the projects within a group to be deleted after a delayed interval.
+you can configure the projects in a group to be deleted after a delayed interval.
-During this interval period, the projects will be in a read-only state and can be restored, if required.
-The interval period defaults to 7 days, and can be modified by an admin in the [instance settings](../admin_area/settings/visibility_and_access_controls.md#default-deletion-delay).
+During this interval period, the projects are in a read-only state and can be restored, if required.
+The interval period defaults to 7 days, and can be modified by an administrator in the [instance settings](../admin_area/settings/visibility_and_access_controls.md#default-deletion-delay).
To enable delayed deletion of projects:
-1. Navigate to the group's **Settings > General** page.
-1. Expand the **Permissions, LFS, 2FA** section, and check **Enable delayed project removal**.
-1. Click **Save changes**.
+1. Go to the group's **Settings > General** page.
+1. Expand the **Permissions, LFS, 2FA** section.
+1. Check **Enable delayed project removal**.
+1. Select **Save changes**.
NOTE:
The group setting for delayed deletion is not inherited by subgroups and has to be individually defined for each group.
-#### Prevent project forking outside group **(PREMIUM)**
+## Prevent project forking outside group **(PREMIUM)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/216987) in GitLab 13.3.
-By default, projects within a group can be forked.
+By default, projects in a group can be forked.
Optionally, on [Premium](https://about.gitlab.com/pricing/) or higher tiers,
-you can prevent the projects within a group from being forked outside of the current top-level group.
+you can prevent the projects in a group from being forked outside of the current top-level group.
Previously this setting was available only for groups enforcing group managed account. This setting will be
-removed from SAML setting page and migrated to group setting, but in the interim period of changes both of those settings will be taken into consideration, if even one is set to `true` then it will be assumed group does not allow forking projects outside.
+removed from SAML setting page and migrated to group settings. In the interim period, both of these settings are taken into consideration.
+If even one is set to `true` then it will be assumed the group does not allow forking projects outside.
To enable prevent project forking:
-1. Navigate to the top-level group's **Settings > General** page.
-1. Expand the **Permissions, LFS, 2FA** section, and check **Prevent project forking outside current group**.
-1. Click **Save changes**.
-
-### Advanced settings
-
-- **Projects**: View all projects within that group, add members to each project,
- access each project's settings, and remove any project, all from the same screen.
-- **Webhooks**: Configure [webhooks](../project/integrations/webhooks.md) for your group.
-- **Kubernetes cluster integration**: Connect your GitLab group with [Kubernetes clusters](clusters/index.md).
-- **Audit Events**: View [Audit Events](../../administration/audit_events.md)
- for the group. **(PREMIUM SELF)**
-- **Pipelines quota**: Keep track of the [pipeline quota](../admin_area/settings/continuous_integration.md) for the group.
-- **Integrations**: Configure [integrations](../admin_area/settings/project_integration_management.md) for your group.
+1. Go to the top-level group's **Settings > General** page.
+1. Expand the **Permissions, LFS, 2FA** section.
+1. Check **Prevent project forking outside current group**.
+1. Select **Save changes**.
-#### Group push rules **(PREMIUM)**
+## Group push rules **(PREMIUM)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/34370) in [GitLab Starter](https://about.gitlab.com/pricing/) 12.8.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/224129) in GitLab 13.4.
Group push rules allow group maintainers to set
-[push rules](../../push_rules/push_rules.md) for newly created projects within the specific group.
+[push rules](../../push_rules/push_rules.md) for newly created projects in the specific group.
-To configure push rules for a group, navigate to **{push-rules}** on the group's
-sidebar.
+To configure push rules for a group:
-When set, new subgroups have push rules set for them based on either:
+1. Go to the groups's **Push Rules** page.
+1. Select the settings you want.
+1. Select **Save Push Rules**.
+
+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.
-### Maximum artifacts size **(FREE SELF)**
-
-For information about setting a maximum artifact size for a group, see
-[Maximum artifacts size](../admin_area/settings/continuous_integration.md#maximum-artifacts-size).
-
-## User contribution analysis **(PREMIUM)**
-
-With [GitLab Contribution Analytics](contribution_analytics/index.md),
-you have an overview of the contributions (pushes, merge requests,
-and issues) performed by your group members.
-
-## Issue analytics **(PREMIUM)**
-
-With [GitLab Issue Analytics](issues_analytics/index.md), you can see a bar chart of the number of issues created each month in your groups.
-
-## Repositories analytics **(PREMIUM)**
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/263478) in GitLab 13.6.
-> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/276003) in GitLab 13.7.
-
-With [GitLab Repositories Analytics](repositories_analytics/index.md), you can view overall activity of all projects with code coverage.
-
-## Dependency Proxy
-
-Use GitLab as a [dependency proxy](../packages/dependency_proxy/index.md) for upstream Docker images.
-
-<!-- ## 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. -->
-
-## DORA4 analytics overview **(ULTIMATE ONLY)**
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/291747) in GitLab [Ultimate](https://about.gitlab.com/pricing/) 13.9 as a [Beta feature](https://about.gitlab.com/handbook/product/gitlab-the-product/#beta).
-
-Group details include the following analytics:
-
-- Deployment Frequency
-
-For more information, see [DORA4 Project Analytics API](../../api/dora4_group_analytics.md).
+## Related topics
+
+- [Maximum artifacts size](../admin_area/settings/continuous_integration.md#maximum-artifacts-size). **(FREE SELF)**
+- [Repositories analytics](repositories_analytics/index.md): View overall activity of all projects with code coverage. **(PREMIUM)**
+- [Contribution analytics](contribution_analytics/index.md): View the contributions (pushes, merge requests,
+ and issues) of group members. **(PREMIUM)**
+- [Issue analytics](issues_analytics/index.md): View a bar chart of your group's number of issues per month. **(PREMIUM)**
+- Use GitLab as a [dependency proxy](../packages/dependency_proxy/index.md) for upstream Docker images.
+- [DORA4 Project Analytics API](../../api/dora4_group_analytics.md): View deployment frequency analytics.
+ [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/291747) in GitLab Ultimate 13.9 as a
+ [Beta feature](https://about.gitlab.com/handbook/product/gitlab-the-product/#beta). **(ULTIMATE SELF)**
+- [Epics](epics/index.md): Track groups of issues that share a theme. **(ULTIMATE)**
+- [Security Dashboard](../application_security/security_dashboard/index.md): View the vulnerabilities of all
+ the projects in a group and its subgroups. **(ULTIMATE)**
+- [Insights](insights/index.md): Configure insights like triage hygiene, issues created/closed per a given period, and
+ average time for merge requests to be merged. **(ULTIMATE)**
+- [Webhooks](../project/integrations/webhooks.md).
+- [Kubernetes cluster integration](clusters/index.md).
+- [Audit Events](../../administration/audit_events.md#group-events). **(PREMIUM)**
+- [Pipelines quota](../admin_area/settings/continuous_integration.md): Keep track of the pipeline quota for the group.
+- [Integrations](../admin_area/settings/project_integration_management.md).
+- [Transfer a project into a group](../project/settings/index.md#transferring-an-existing-project-into-another-namespace).
+- [Share a project with a group](../project/members/share_project_with_groups.md): Give all group members access to the project at once.
+- [Lock the sharing with group feature](#prevent-a-project-from-being-shared-with-groups).
+- [Enforce two-factor authentication (2FA)](../../security/two_factor_authentication.md#enforcing-2fa-for-all-users-in-a-group): Enforce 2FA
+ for all group members.
diff --git a/doc/user/group/repositories_analytics/index.md b/doc/user/group/repositories_analytics/index.md
index 1cb7c05bb5f..42522723047 100644
--- a/doc/user/group/repositories_analytics/index.md
+++ b/doc/user/group/repositories_analytics/index.md
@@ -40,6 +40,9 @@ To see the latest code coverage for each project in your group:
1. Go to **Analytics > Repositories** in the group (not from a project).
1. In the **Latest test coverage results** section, use the **Select projects** dropdown to choose the projects you want to check.
+You can download code coverage data for specific projects using
+[code coverage history](../../../ci/pipelines/settings.md#code-coverage-history).
+
## Download historic test coverage data
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/215104) in [GitLab Premium](https://about.gitlab.com/pricing/) 13.4.
diff --git a/doc/user/group/roadmap/index.md b/doc/user/group/roadmap/index.md
index e2c01987e36..9b3ae75b39c 100644
--- a/doc/user/group/roadmap/index.md
+++ b/doc/user/group/roadmap/index.md
@@ -41,7 +41,7 @@ toggle the list of the milestone bars.
> - Filtering roadmaps by milestone is enabled on GitLab.com.
> - Filtering roadmaps by milestone is recommended for production use.
> - For GitLab self-managed instances, GitLab administrators can opt to [disable it](#enable-or-disable-filtering-roadmaps-by-milestone). **(PREMIUM SELF)**
-> - Filtering by epic confidentiality [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/218624) in GitLab 13.8.
+> - Filtering by epic confidentiality [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/218624) in GitLab 13.9.
WARNING:
Filtering roadmaps by milestone might not be available to you. Check the **version history** note above for details.
diff --git a/doc/user/group/saml_sso/group_managed_accounts.md b/doc/user/group/saml_sso/group_managed_accounts.md
index dd0888a610f..9f2cafd456b 100644
--- a/doc/user/group/saml_sso/group_managed_accounts.md
+++ b/doc/user/group/saml_sso/group_managed_accounts.md
@@ -37,17 +37,7 @@ Since use of the group-managed account requires the use of SSO, users of group-m
- The user is unable to access the group (their credentials no longer work on the identity provider when prompted to use SSO).
- Contributions in the group (for example, issues and merge requests) remains intact.
-## Assertions
-
-When using group-managed accounts, the following user details need to be passed to GitLab as SAML
-assertions to be able to create a user.
-
-| Field | Supported keys |
-|-----------------|----------------|
-| Email (required)| `email`, `mail` |
-| Full Name | `name` |
-| First Name | `first_name`, `firstname`, `firstName` |
-| Last Name | `last_name`, `lastname`, `lastName` |
+Please refer to our [SAML SSO for Groups page](../index.md) for information on how to configure SAML.
## Feature flag **(PREMIUM SELF)**
diff --git a/doc/user/group/saml_sso/index.md b/doc/user/group/saml_sso/index.md
index d1c490b0769..5079b927fbe 100644
--- a/doc/user/group/saml_sso/index.md
+++ b/doc/user/group/saml_sso/index.md
@@ -25,7 +25,8 @@ SAML SSO is only configurable at the top-level group.
1. Navigate to the group and select **Settings > SAML SSO**.
1. Configure your SAML server using the **Assertion consumer service URL**, **Identifier**, and **GitLab single sign-on URL**. Alternatively GitLab provides [metadata XML configuration](#metadata-configuration). See [specific identity provider documentation](#providers) for more details.
1. Configure the SAML response to include a NameID that uniquely identifies each user.
-1. Configure [required assertions](group_managed_accounts.md#assertions) if using [Group Managed Accounts](group_managed_accounts.md).
+1. Configure [required assertions](#assertions) at minimum containing
+ 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](#glossary) initiated calls in order to link existing GitLab accounts.
1. Once the identity provider is set up, move on to [configuring GitLab](#configuring-gitlab).
@@ -53,6 +54,19 @@ Once users have signed into GitLab using the SSO SAML setup, changing the `NameI
We recommend setting the NameID format to `Persistent` unless using a field (such as email) that requires a different format.
+### Assertions
+
+For users to be created with the right information with the improved [user access and management](#user-access-and-management),
+the following user details need to be passed to GitLab as SAML assertions.
+
+| Field | Supported keys |
+|-----------------|----------------|
+| Email (required)| `email`, `mail` |
+| Username | `username`, `nickname` |
+| Full Name | `name` |
+| First Name | `first_name`, `firstname`, `firstName` |
+| Last Name | `last_name`, `lastname`, `lastName` |
+
### Metadata configuration
GitLab provides metadata XML that can be used to configure your Identity Provider.
@@ -87,9 +101,8 @@ Please note that the certificate [fingerprint algorithm](#additional-providers-a
With this option enabled, users must go through your group's GitLab single sign-on URL. They may also be added via SCIM, if configured. Users can't be added manually, and may only access project/group resources via the UI by signing in through the SSO URL.
However, users are not prompted to sign in through SSO on each visit. GitLab checks whether a user
-has authenticated through SSO. If it's been more than 7 days since the last sign-in, GitLab
+has authenticated through SSO. If it's been more than 1 day since the last sign-in, GitLab
prompts the user to sign in again through SSO.
-You can see more information about how long a session is valid in our [user profile documentation](../../profile/#why-do-i-keep-getting-signed-out).
We intend to add a similar SSO requirement for [Git and API activity](https://gitlab.com/gitlab-org/gitlab/-/issues/9152).
@@ -148,8 +161,11 @@ For NameID, the following settings are recommended; for SCIM, the following sett
### OneLogin setup notes
-The GitLab app listed in the OneLogin app catalog is for self-managed GitLab instances.
-For GitLab.com, use a generic SAML Test Connector such as the SAML Test Connector (Advanced).
+OneLogin supports their own [GitLab (SaaS)](https://onelogin.service-now.com/support?id=kb_article&sys_id=92e4160adbf16cd0ca1c400e0b961923&kb_category=50984e84db738300d5505eea4b961913)
+application.
+
+If you decide to use the OneLogin generic [SAML Test Connector (Advanced)](https://onelogin.service-now.com/support?id=kb_article&sys_id=b2c19353dbde7b8024c780c74b9619fb&kb_category=93e869b0db185340d5505eea4b961934),
+we recommend the following settings:
| GitLab Setting | OneLogin Field |
|--------------|----------------|
@@ -170,7 +186,7 @@ For more information, see our [discussion on providers](#providers).
Your identity provider may have relevant documentation. It may be generic SAML documentation, or specifically targeted for GitLab. Examples:
- [ADFS (Active Directory Federation Services)](https://docs.microsoft.com/en-us/windows-server/identity/ad-fs/operations/create-a-relying-party-trust)
-- [Auth0](https://auth0.com/docs/protocols/saml-configuration-options/configure-auth0-as-saml-identity-provider)
+- [Auth0](https://auth0.com/docs/protocols/saml-protocol/configure-auth0-as-saml-identity-provider)
- [Google Workspace](https://support.google.com/a/answer/6087519?hl=en)
- [JumpCloud](https://support.jumpcloud.com/support/s/article/single-sign-on-sso-with-gitlab-2019-08-21-10-36-47)
- [PingOne by Ping Identity](https://docs.pingidentity.com/bundle/pingone/page/xsh1564020480660-1.html)
@@ -348,6 +364,11 @@ the user gets the highest access level from the groups. For example, if one grou
is linked as `Guest` and another `Maintainer`, a user in both groups gets `Maintainer`
access.
+Users who are not members of any mapped SAML groups are removed from the GitLab group.
+
+You can prevent accidental member removal. For example, if you have a SAML group link for `Owner` level access
+in a top-level group, you should also set up a group link for all other members.
+
## Glossary
| Term | Description |
diff --git a/doc/user/group/saml_sso/scim_setup.md b/doc/user/group/saml_sso/scim_setup.md
index 3a34a4b0599..d248729b615 100644
--- a/doc/user/group/saml_sso/scim_setup.md
+++ b/doc/user/group/saml_sso/scim_setup.md
@@ -161,6 +161,11 @@ 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.
+### OneLogin
+
+OneLogin provides a "GitLab (SaaS)" app in their catalog, which includes a SCIM integration.
+As the app is developed by OneLogin, please reach out to OneLogin if you encounter issues.
+
## User access and linking setup
The following diagram is a general outline on what happens when you add users to your SCIM app:
@@ -204,6 +209,10 @@ graph TD
B -->|Yes| D[GitLab removes user from GitLab group]
```
+During the synchronization process, all of your users get GitLab accounts, welcoming them
+to their respective groups, with an invitation email. When implementing SCIM provisioning,
+you may want to warn your security-conscious employees about this email.
+
## Troubleshooting
This section contains possible solutions for problems you might encounter.
diff --git a/doc/user/group/subgroups/index.md b/doc/user/group/subgroups/index.md
index 59812fc2b2f..16430b49549 100644
--- a/doc/user/group/subgroups/index.md
+++ b/doc/user/group/subgroups/index.md
@@ -1,6 +1,6 @@
---
-stage: none
-group: unassigned
+stage: Manage
+group: Access
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
type: reference, howto, concepts
---
@@ -147,7 +147,7 @@ From the image above, we can deduce the following things:
- Administrator is the Owner and member of **all** subgroups and for that reason,
as with User 3, the **Source** column indicates **Direct member**.
-Members can be [filtered by inherited or direct membership](../index.md#membership-filter).
+Members can be [filtered by inherited or direct membership](../index.md#filter-a-group).
### Overriding the ancestor group membership
diff --git a/doc/user/img/gitlab_snippet_v13_0.png b/doc/user/img/gitlab_snippet_v13_0.png
deleted file mode 100644
index 33194c512df..00000000000
--- a/doc/user/img/gitlab_snippet_v13_0.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/img/gitlab_snippet_v13_5.png b/doc/user/img/gitlab_snippet_v13_5.png
deleted file mode 100644
index 3fce1d25c3d..00000000000
--- a/doc/user/img/gitlab_snippet_v13_5.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/img/new_personal_snippet_from_project_v12_10.png b/doc/user/img/new_personal_snippet_from_project_v12_10.png
deleted file mode 100644
index af8cce01208..00000000000
--- a/doc/user/img/new_personal_snippet_from_project_v12_10.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/img/new_personal_snippet_v12_10.png b/doc/user/img/new_personal_snippet_v12_10.png
deleted file mode 100644
index a995e4d4b40..00000000000
--- a/doc/user/img/new_personal_snippet_v12_10.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/index.md b/doc/user/index.md
index a678038507f..dfbba7e9c19 100644
--- a/doc/user/index.md
+++ b/doc/user/index.md
@@ -31,10 +31,10 @@ For more information, see [All GitLab Features](https://about.gitlab.com/feature
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/).
-- [GitLab Workflow: An Overview](https://about.gitlab.com/blog/2016/10/25/gitlab-workflow-an-overview/#gitlab-workflow-use-case-scenario).
+- [GitLab Workflow: An Overview](https://about.gitlab.com/topics/version-control/what-is-gitlab-workflow/#gitlab-workflow-a-use-case-scenario).
- [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/blog/2016/07/07/trends-version-control-innersourcing/).
+- [Trends in Version Control Land: Innersourcing](https://about.gitlab.com/topics/version-control/what-is-innersource/).
## Use cases
@@ -61,7 +61,7 @@ With GitLab Enterprise Edition, you can also:
- [Multiple Issue Boards](project/issue_board.md#multiple-issue-boards).
- Create formal relationships between issues with [Related 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_global_search.md) and [Advanced Search Syntax](search/advanced_search_syntax.md) for faster, more advanced code search across your entire GitLab instance.
+- Leverage [Elasticsearch](../integration/elasticsearch.md) with [Advanced Search](search/advanced_search.md) for faster, more advanced code search across your entire GitLab instance.
- [Authenticate users with Kerberos](../integration/kerberos.md).
- [Mirror a repository](project/repository/repository_mirroring.md) from elsewhere on your local server.
- View your entire CI/CD pipeline involving more than one project with [Multiple-Project Pipelines](../ci/multi_project_pipelines.md).
diff --git a/doc/user/infrastructure/index.md b/doc/user/infrastructure/index.md
index 6ba5e49d553..b202359847c 100644
--- a/doc/user/infrastructure/index.md
+++ b/doc/user/infrastructure/index.md
@@ -52,9 +52,9 @@ This video from January 2021 walks you through all the GitLab Terraform integrat
## GitLab Managed Terraform state
-[Terraform remote backends](https://www.terraform.io/docs/backends/index.html)
+[Terraform remote backends](https://www.terraform.io/docs/language/settings/backends/index.html)
enable you to store the state file in a remote, shared store. GitLab uses the
-[Terraform HTTP backend](https://www.terraform.io/docs/backends/types/http.html)
+[Terraform HTTP backend](https://www.terraform.io/docs/language/settings/backends/http.html)
to securely store the state files in local storage (the default) or
[the remote store of your choice](../../administration/terraform_state.md).
diff --git a/doc/user/infrastructure/terraform_state.md b/doc/user/infrastructure/terraform_state.md
index ae35ebce0dc..2cd5ed8ac78 100644
--- a/doc/user/infrastructure/terraform_state.md
+++ b/doc/user/infrastructure/terraform_state.md
@@ -8,9 +8,9 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2673) in GitLab 13.0.
-[Terraform remote backends](https://www.terraform.io/docs/backends/index.html)
+[Terraform remote backends](https://www.terraform.io/docs/language/settings/backends/index.html)
enable you to store the state file in a remote, shared store. GitLab uses the
-[Terraform HTTP backend](https://www.terraform.io/docs/backends/types/http.html)
+[Terraform HTTP backend](https://www.terraform.io/docs/language/settings/backends/http.html)
to securely store the state files in local storage (the default) or
[the remote store of your choice](../../administration/terraform_state.md).
@@ -96,7 +96,7 @@ Next, [configure the backend](#configure-the-backend).
After executing the `terraform init` command, you must configure the Terraform backend
and the CI YAML file:
-1. In your Terraform project, define the [HTTP backend](https://www.terraform.io/docs/backends/types/http.html)
+1. In your Terraform project, define the [HTTP backend](https://www.terraform.io/docs/language/settings/backends/http.html)
by adding the following code block in a `.tf` file (such as `backend.tf`) to
define the remote backend:
@@ -116,7 +116,7 @@ and the CI YAML file:
image: registry.gitlab.com/gitlab-org/terraform-images/stable:latest
```
-1. In the `.gitlab-ci.yml` file, define some environment variables to ease
+1. In the `.gitlab-ci.yml` file, define some CI/CD variables to ease
development. In this example, `TF_ROOT` is the directory where the Terraform
commands must be executed, `TF_ADDRESS` is the URL to the state on the GitLab
instance where this pipeline runs, and the final path segment in `TF_ADDRESS`
@@ -203,16 +203,16 @@ See [this reference project](https://gitlab.com/gitlab-org/configure/examples/gi
## Using a GitLab managed Terraform state backend as a remote data source
You can use a GitLab-managed Terraform state as a
-[Terraform data source](https://www.terraform.io/docs/providers/terraform/d/remote_state.html).
+[Terraform data source](https://www.terraform.io/docs/language/state/remote-state-data.html).
To use your existing Terraform state backend as a data source, provide the following details
-as [Terraform input variables](https://www.terraform.io/docs/configuration/variables.html):
+as [Terraform input variables](https://www.terraform.io/docs/language/values/variables.html):
- **address**: The URL of the remote state backend you want to use as a data source.
For example, `https://gitlab.com/api/v4/projects/<TARGET-PROJECT-ID>/terraform/state/<TARGET-STATE-NAME>`.
- **username**: The username to authenticate with the data source. If you are using a [Personal Access Token](../profile/personal_access_tokens.md) for
authentication, this is your GitLab username. If you are using GitLab CI, this is `'gitlab-ci-token'`.
- **password**: The password to authenticate with the data source. If you are using a Personal Access Token for
- authentication, this is the token value. If you are using GitLab CI, it is the contents of the `${CI_JOB_TOKEN}` CI variable.
+ authentication, this is the token value. If you are using GitLab CI, it is the contents of the `${CI_JOB_TOKEN}` CI/CD variable.
An example setup is shown below:
diff --git a/doc/user/markdown.md b/doc/user/markdown.md
index 5f974d75522..0c257f2fb70 100644
--- a/doc/user/markdown.md
+++ b/doc/user/markdown.md
@@ -18,13 +18,13 @@ for a complete Kramdown reference.
NOTE:
We encourage you to view this document as [rendered by GitLab itself](https://gitlab.com/gitlab-org/gitlab/blob/master/doc/user/markdown.md).
-## GitLab Flavored Markdown (GFM)
+## GitLab Flavored Markdown
-GitLab uses "GitLab Flavored Markdown" (GFM). It extends the [CommonMark specification](https://spec.commonmark.org/current/)
+GitLab uses "GitLab Flavored Markdown". It extends the [CommonMark specification](https://spec.commonmark.org/current/)
(which is based on standard Markdown) in several ways to add more features.
-It was inspired by [GitHub Flavored Markdown](https://docs.github.com/en/free-pro-team@latest/github/writing-on-github/basic-writing-and-formatting-syntax).
+It was inspired by [GitHub Flavored Markdown](https://docs.github.com/en/github/writing-on-github/basic-writing-and-formatting-syntax).
-You can use GFM in the following areas:
+You can use GitLab Flavored Markdown in the following areas:
- Comments
- Issues
@@ -92,12 +92,12 @@ if any changes are needed.
`diff_redcarpet_cmark` is not an officially supported product.
-### GFM extends standard Markdown
+### GitLab Flavored Markdown extends standard Markdown
GitLab makes full use of the standard (CommonMark) formatting, but also includes more
helpful features for GitLab users.
-It makes use of [new Markdown features](#new-gfm-markdown-extensions),
+It makes use of [new Markdown features](#new-gitlab-flavored-markdown-extensions),
not found in standard Markdown:
- [Color chips written in HEX, RGB or HSL](#colors)
@@ -124,7 +124,7 @@ changing how standard Markdown is used:
| [line breaks](#line-breaks) | [more line break control](#newlines) |
| [links](#links) | [automatically linking URLs](#url-auto-linking) |
-## New GFM Markdown extensions
+## New GitLab Flavored Markdown extensions
### Colors
@@ -251,7 +251,7 @@ If this section isn't rendered correctly, [view it in GitLab](https://gitlab.com
```markdown
Sometimes you want to :monkey: around a bit and add some :star2: to your :speech_balloon:. Well we have a gift for you:
-:zap: You can use emoji anywhere GFM is supported. :v:
+:zap: You can use emoji anywhere GitLab Flavored Markdown is supported. :v:
You can use it to point out a :bug: or warn about :speak_no_evil: patches. And if someone improves your really :snail: code, send them some :birthday:. People :heart: you for that.
@@ -262,7 +262,7 @@ Consult the [Emoji Cheat Sheet](https://www.emojicopy.com) for a list of all sup
Sometimes you want to <img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/app/assets/images/emoji/monkey.png" width="20px" height="20px" style="display:inline;margin:0;border: 0"> around a bit and add some <img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/app/assets/images/emoji/star2.png" width="20px" height="20px" style="display:inline;margin:0;border: 0"> to your <img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/app/assets/images/emoji/speech_balloon.png" width="20px" height="20px" style="display:inline;margin:0;border: 0">. Well we have a gift for you:
-<img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/app/assets/images/emoji/zap.png" width="20px" height="20px" style="display:inline;margin:0;border: 0">You can use emoji anywhere GFM is supported. <img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/app/assets/images/emoji/v.png" width="20px" height="20px" style="display:inline;margin:0;border: 0">
+<img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/app/assets/images/emoji/zap.png" width="20px" height="20px" style="display:inline;margin:0;border: 0">You can use emoji anywhere GitLab Flavored Markdown is supported. <img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/app/assets/images/emoji/v.png" width="20px" height="20px" style="display:inline;margin:0;border: 0">
You can use it to point out a<img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/app/assets/images/emoji/bug.png" width="20px" height="20px" style="display:inline;margin:0;border: 0"> or warn about <img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/app/assets/images/emoji/speak_no_evil.png" width="20px" height="20px" style="display:inline;margin:0;border: 0"> patches. If someone improves your really <img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/app/assets/images/emoji/snail.png" width="20px" height="20px" style="display:inline;margin:0;border: 0"> code, send them some <img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/app/assets/images/emoji/birthday.png" width="20px" height="20px" style="display:inline;margin:0;border: 0">. People <img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/app/assets/images/emoji/heart.png" width="20px" height="20px" style="display:inline;margin:0;border: 0"> you for that.
@@ -424,14 +424,14 @@ the [Asciidoctor user manual](https://asciidoctor.org/docs/user-manual/#activati
### Special GitLab references
-GFM recognizes special GitLab related references. For example, you can reference
-an issue, a commit, a team member, or even an entire project team. GFM turns
+GitLab Flavored Markdown recognizes special GitLab related references. For example, you can reference
+an issue, a commit, a team member, or even an entire project team. GitLab Flavored Markdown turns
that reference into a link so you can navigate between them.
-Additionally, GFM recognizes certain cross-project references and also has a shorthand
+Additionally, GitLab Flavored Markdown recognizes certain cross-project references and also has a shorthand
version to reference other projects from the same namespace.
-GFM recognizes the following:
+GitLab Flavored Markdown recognizes the following:
| references | input | cross-project reference | shortcut inside same namespace |
| :------------------------------ | :------------------------- | :-------------------------------------- | :----------------------------- |
@@ -462,7 +462,8 @@ GFM recognizes the following:
For example, referencing an issue by using `#123` formats the output as a link
to issue number 123 with text `#123`. Likewise, a link to issue number 123 is
-recognized and formatted with text `#123`.
+recognized and formatted with text `#123`. If you don't want `#123` to link to an issue,
+add a leading backslash `\#123`.
In addition to this, links to some objects are also recognized and formatted. Some examples of these are:
@@ -630,7 +631,7 @@ Quote break.
If this section isn't rendered correctly, [view it in GitLab](https://gitlab.com/gitlab-org/gitlab/blob/master/doc/user/markdown.md#multiline-blockquote).
-GFM extends the standard Markdown by also supporting multi-line blockquotes
+GitLab Flavored Markdown extends the standard Markdown by also supporting multi-line blockquotes
fenced by `>>>`:
```markdown
@@ -778,7 +779,7 @@ But let's throw in a <b>tag</b>.
There are multiple ways to emphasize text in Markdown. You can italicize, bold, strikethrough,
and combine these emphasis styles together.
-Strikethrough is not part of the core Markdown standard, but is part of GFM.
+Strikethrough is not part of the core Markdown standard, but is part of GitLab Flavored Markdown.
Examples:
@@ -807,7 +808,7 @@ If this section isn't rendered correctly,
Avoid italicizing a portion of a word, especially when you're
dealing with code and names that often appear with multiple underscores.
-GFM extends the standard Markdown standard by ignoring multiple underlines in words,
+GitLab Flavored Markdown extends the standard Markdown standard by ignoring multiple underlines in words,
to allow better rendering of Markdown documents discussing code:
```markdown
@@ -899,7 +900,7 @@ Alt-H2
#### Header IDs and links
-GFM extends the standard Markdown standard so that all Markdown-rendered headers automatically
+GitLab Flavored Markdown extends the standard Markdown standard so that all Markdown-rendered headers automatically
get IDs, which can be linked to, except in comments.
On hover, a link to those IDs becomes visible to make it easier to copy the link to
@@ -1193,7 +1194,7 @@ in the *same paragraph*.
#### Newlines
-GFM adheres to the Markdown specification in how [paragraphs and line breaks are handled](https://spec.commonmark.org/current/).
+GitLab Flavored Markdown adheres to the Markdown specification in how [paragraphs and line breaks are handled](https://spec.commonmark.org/current/).
A paragraph is one or more consecutive lines of text, separated by one or
more blank lines (two newlines at the end of the first paragraph), as [explained above](#line-breaks).
@@ -1275,7 +1276,7 @@ points the link to `wikis/style` only when the link is inside of a wiki Markdown
#### URL auto-linking
-GFM auto-links almost any URL you put into your text:
+GitLab Flavored Markdown auto-links almost any URL you put into your text:
```markdown
- https://www.google.com
@@ -1322,7 +1323,7 @@ Examples:
<!--
The "2." and "4." in the example above are changed to "1." below, to match the style
standards on docs.gitlab.com.
-See https://docs.gitlab.com/ee/development/documentation/styleguide.html#lists
+See https://docs.gitlab.com/ee/development/documentation/styleguide/index.html#lists
-->
1. First ordered list item
@@ -1356,7 +1357,7 @@ They can even:
<!--
The "*" and "+" in the example above are changed to "-" below, to match the style
standards on docs.gitlab.com.
-See https://docs.gitlab.com/ee/development/documentation/styleguide.html#lists
+See https://docs.gitlab.com/ee/development/documentation/styleguide/index.html#lists
-->
Unordered lists can:
@@ -1418,7 +1419,7 @@ Example:
### Superscripts / Subscripts
-CommonMark and GFM don't support the Redcarpet superscript syntax ( `x^2` ).
+CommonMark and GitLab Flavored Markdown don't support the Redcarpet superscript syntax ( `x^2` ).
Use the standard HTML syntax for superscripts and subscripts:
```html
@@ -1435,7 +1436,7 @@ while the equation for the theory of relativity is E = mc<sup>2</sup>.
### Tables
-Tables are not part of the core Markdown spec, but they are part of GFM.
+Tables are not part of the core Markdown spec, but they are part of GitLab Flavored Markdown.
1. The first line contains the headers, separated by "pipes" (`|`).
1. The second line separates the headers from the cells, and must contain three or more dashes.
diff --git a/doc/user/packages/conan_repository/index.md b/doc/user/packages/conan_repository/index.md
index c115f94b964..3b8be68cff6 100644
--- a/doc/user/packages/conan_repository/index.md
+++ b/doc/user/packages/conan_repository/index.md
@@ -171,6 +171,10 @@ convention.
## Authenticate to the Package Registry
+GitLab requires authentication to upload packages, and to install packages
+from private and internal projects. (You can, however, install packages
+from public projects without authentication.)
+
To authenticate to the Package Registry, you need one of the following:
- A [personal access token](../../../user/profile/personal_access_tokens.md)
@@ -302,8 +306,9 @@ file.
Prerequisites:
- The Conan remote [must be configured](#add-the-package-registry-as-a-conan-remote).
-- [Authentication](#authenticate-to-the-package-registry) with the
- Package Registry must be configured.
+- For private and internal projects, you must configure
+ [Authentication](#authenticate-to-the-package-registry)
+ with the Package Registry.
1. In the project where you want to install the package as a dependency, open
`conanfile.txt`. Or, in the root of your project, create a file called
diff --git a/doc/user/packages/container_registry/index.md b/doc/user/packages/container_registry/index.md
index e3a469c4b6c..eae114b49f2 100644
--- a/doc/user/packages/container_registry/index.md
+++ b/doc/user/packages/container_registry/index.md
@@ -577,7 +577,7 @@ Here are examples of regex patterns you may want to use:
(?:v.+|master|release.*)
```
-### Set cleanup limits to conserve resources
+### Set cleanup limits to conserve resources
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/288812) in GitLab 13.9.
> - It's [deployed behind a feature flag](../../feature_flags.md), disabled by default.
@@ -595,7 +595,7 @@ To prevent server resource starvation, the following application settings are av
- `container_registry_delete_tags_service_timeout`. The maximum time, in seconds, that the cleanup process can take to delete a batch of tags.
- `container_registry_cleanup_tags_service_max_list_size`. The maximum number of tags that can be deleted in a single execution. Additional tags must be deleted in another execution.
We recommend starting with a low number, like `100`, and increasing it after monitoring that container images are properly deleted.
-
+
For self-managed instances, those settings can be updated in the [Rails console](../../../administration/operations/rails_console.md#starting-a-rails-console-session):
```ruby
@@ -699,7 +699,7 @@ project or branch name. Special characters can include:
- Leading underscore
- Trailing hyphen/dash
-To get around this, you can [change the group path](../../group/index.md#changing-a-groups-path),
+To get around this, you can [change the group path](../../group/index.md#change-a-groups-path),
[change the project path](../../project/settings/index.md#renaming-a-repository) or change the branch
name.
diff --git a/doc/user/packages/dependency_proxy/index.md b/doc/user/packages/dependency_proxy/index.md
index fdf0caba090..5b096f846e6 100644
--- a/doc/user/packages/dependency_proxy/index.md
+++ b/doc/user/packages/dependency_proxy/index.md
@@ -4,12 +4,13 @@ group: Package
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Dependency Proxy
+# Dependency Proxy **(FREE)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/7934) in [GitLab Premium](https://about.gitlab.com/pricing/) 11.11.
-> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/273655) to [GitLab Core](https://about.gitlab.com/pricing/) in GitLab 13.6.
-> - [Support for private groups](https://gitlab.com/gitlab-org/gitlab/-/issues/11582) in [GitLab Core](https://about.gitlab.com/pricing/) 13.7.
-> - Anonymous access to images in public groups is no longer available starting in [GitLab Core](https://about.gitlab.com/pricing/) 13.7.
+> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/273655) to GitLab Free in GitLab 13.6.
+> - [Support for private groups](https://gitlab.com/gitlab-org/gitlab/-/issues/11582) in GitLab Free 13.7.
+> - Anonymous access to images in public groups is no longer available starting in GitLab Free 13.7.
+> - [Support for pull-by-digest and Docker version 20.x](https://gitlab.com/gitlab-org/gitlab/-/issues/290944) in GitLab Free 13.10.
The GitLab Dependency Proxy is a local proxy you can use for your frequently-accessed
upstream images.
@@ -17,11 +18,6 @@ upstream images.
In the case of CI/CD, the Dependency Proxy receives a request and returns the
upstream image from a registry, acting as a pull-through cache.
-NOTE:
-The Dependency Proxy is not compatible with Docker version 20.x and later.
-If you are using the Dependency Proxy, Docker version 19.x.x is recommended until
-[issue #290944](https://gitlab.com/gitlab-org/gitlab/-/issues/290944) is resolved.
-
## Prerequisites
The Dependency Proxy must be [enabled by an administrator](../../../administration/packages/dependency_proxy.md).
@@ -60,7 +56,7 @@ Prerequisites:
### Authenticate with the Dependency Proxy
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/11582) in [GitLab Core](https://about.gitlab.com/pricing/) 13.7.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/11582) in GitLab Free 13.7.
> - It's [deployed behind a feature flag](../../feature_flags.md), enabled by default.
> - It's enabled on GitLab.com.
> - It's recommended for production use.
@@ -162,7 +158,7 @@ the [Dependency Proxy API](../../../api/dependency_proxy.md).
## Docker Hub rate limits and the Dependency Proxy
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/241639) in [GitLab Core](https://about.gitlab.com/pricing/) 13.7.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/241639) in GitLab Free 13.7.
<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
Watch how to [use the Dependency Proxy to help avoid Docker Hub rate limits](https://youtu.be/Nc4nUo7Pq08).
diff --git a/doc/user/packages/generic_packages/index.md b/doc/user/packages/generic_packages/index.md
index 73b84c04b6d..b9186e99357 100644
--- a/doc/user/packages/generic_packages/index.md
+++ b/doc/user/packages/generic_packages/index.md
@@ -40,7 +40,7 @@ Prerequisites:
- You need to [authenticate with the API](../../../api/README.md#authentication). If authenticating with a deploy token, it must be configured with the `write_package_registry` scope.
```plaintext
-PUT /projects/:id/packages/generic/:package_name/:package_version/:file_name
+PUT /projects/:id/packages/generic/:package_name/:package_version/:file_name?status=:status
```
| Attribute | Type | Required | Description |
@@ -53,12 +53,28 @@ PUT /projects/:id/packages/generic/:package_name/:package_version/:file_name
Provide the file context in the request body.
-Example request:
+Example request using a personal access token:
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" \
--upload-file path/to/file.txt \
- "https://gitlab.example.com/api/v4/projects/24/packages/generic/my_package/0.0.1/file.txt"
+ "https://gitlab.example.com/api/v4/projects/24/packages/generic/my_package/0.0.1/file.txt?status=hidden"
+```
+
+Example response:
+
+```json
+{
+ "message":"201 Created"
+}
+```
+
+Example request using a deploy token:
+
+```shell
+curl --header "DEPLOY-TOKEN: <deploy_token>" \
+ --upload-file path/to/file.txt \
+ "https://gitlab.example.com/api/v4/projects/24/packages/generic/my_package/0.0.1/file.txt?status=hidden"
```
Example response:
diff --git a/doc/user/packages/go_proxy/index.md b/doc/user/packages/go_proxy/index.md
index c9397f8d9f6..1fdc34e820e 100644
--- a/doc/user/packages/go_proxy/index.md
+++ b/doc/user/packages/go_proxy/index.md
@@ -96,7 +96,7 @@ following steps work only if GitLab is configured for HTTPS:
Create a [personal access token](../../profile/personal_access_tokens.md) with
the scope set to `api` or `read_api`.
-Open your [`~/.netrc`](https://ec.haxx.se/usingcurl/usingcurl-netrc) file
+Open your [`~/.netrc`](https://everything.curl.dev/usingcurl/netrc) file
and add the following text. Replace the variables in `< >` with your values.
```plaintext
diff --git a/doc/user/packages/index.md b/doc/user/packages/index.md
index d2bd9ef5646..03738eb0b9e 100644
--- a/doc/user/packages/index.md
+++ b/doc/user/packages/index.md
@@ -43,14 +43,14 @@ guides you through the process.
| CocoaPods | [#36890](https://gitlab.com/gitlab-org/gitlab/-/issues/36890) |
| Conda | [#36891](https://gitlab.com/gitlab-org/gitlab/-/issues/36891) |
| CRAN | [#36892](https://gitlab.com/gitlab-org/gitlab/-/issues/36892) |
-| Debian | [WIP: Merge Request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/44746) |
+| Debian | [Draft: Merge Request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/50438) |
| Opkg | [#36894](https://gitlab.com/gitlab-org/gitlab/-/issues/36894) |
| P2 | [#36895](https://gitlab.com/gitlab-org/gitlab/-/issues/36895) |
| Puppet | [#36897](https://gitlab.com/gitlab-org/gitlab/-/issues/36897) |
| RPM | [#5932](https://gitlab.com/gitlab-org/gitlab/-/issues/5932) |
| RubyGems | [#803](https://gitlab.com/gitlab-org/gitlab/-/issues/803) |
| SBT | [#36898](https://gitlab.com/gitlab-org/gitlab/-/issues/36898) |
-| Terraform | [WIP: Merge Request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18834) |
+| Terraform | [Draft: Merge Request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18834) |
| Vagrant | [#36899](https://gitlab.com/gitlab-org/gitlab/-/issues/36899) |
<!-- vale gitlab.Spelling = YES -->
diff --git a/doc/user/packages/npm_registry/index.md b/doc/user/packages/npm_registry/index.md
index b1075e19b7b..f048440e383 100644
--- a/doc/user/packages/npm_registry/index.md
+++ b/doc/user/packages/npm_registry/index.md
@@ -86,7 +86,9 @@ A `package.json` file is created.
To use the GitLab endpoint for npm packages, choose an option:
- **Project-level**: Use when you have few npm packages and they are not in
- the same GitLab group.
+ the same GitLab group. The [package naming convention](#package-naming-convention) is not enforced at this level.
+ Instead, you should use a [scope](https://docs.npmjs.com/cli/v6/using-npm/scope) for your package.
+ When you use a scope, the registry URL is [updated](#authenticate-to-the-package-registry) only for that scope.
- **Instance-level**: Use when you have many npm packages in different
GitLab groups or in their own namespace. Be sure to comply with the [package naming convention](#package-naming-convention).
@@ -151,7 +153,7 @@ npm config set '//gitlab.example.com/api/v4/packages/npm/:_authToken' "<your_tok
- `<your_token>` is your personal access token or deploy token.
- Replace `gitlab.example.com` with your domain name.
-You should now be able to publish and install npm packages in your project.
+You should now be able to install npm packages in your project.
If you encounter an error with [Yarn](https://classic.yarnpkg.com/en/), view
[troubleshooting steps](#troubleshooting).
@@ -204,9 +206,14 @@ Then, you can run `npm publish` either locally or by using GitLab CI/CD.
## Package naming convention
-Your npm package name must be in the format of `@scope/package-name`.
+When you use the [instance-level endpoint](#use-the-gitlab-endpoint-for-npm-packages), only the packages with names in the format of `@scope/package-name` are available.
-- The `@scope` is the root namespace of the GitLab project. It must match exactly, including the case.
+- The `@scope` is the root namespace of the GitLab project. To follow npm's convention, it should be
+ lowercase. However, the GitLab package registry allows for uppercase. Before GitLab 13.10, the
+ `@scope` had to be a case-sensitive match of the GitLab project's root namespace. This was
+ problematic because the npm public registry does not allow uppercase letters. GitLab 13.10 relaxes
+ this requirement and translates uppercase in the GitLab `@scope` to lowercase for npm. For
+ example, a package `@MyScope/package-name` in GitLab becomes `@myscope/package-name` for npm.
- The `package-name` can be whatever you want.
For example, if your project is `https://gitlab.example.com/my-org/engineering-group/team-amazing/analytics`,
@@ -216,7 +223,8 @@ the root namespace is `my-org`. When you publish a package, it must have `my-org
| ---------------------- | ----------------------- | --------- |
| `my-org/bar` | `@my-org/bar` | Yes |
| `my-org/bar/baz` | `@my-org/baz` | Yes |
-| `My-org/Bar/baz` | `@My-org/Baz` | Yes |
+| `My-Org/Bar/baz` | `@my-org/Baz` | Yes |
+| `My-Org/Bar/baz` | `@My-Org/Baz` | Yes |
| `my-org/bar/buz` | `@my-org/anything` | Yes |
| `gitlab-org/gitlab` | `@gitlab-org/gitlab` | Yes |
| `gitlab-org/gitlab` | `@foo/bar` | No |
@@ -229,8 +237,7 @@ In GitLab, this regex validates all package names from all package managers:
This regex allows almost all of the characters that npm allows, with a few exceptions (for example, `~` is not allowed).
-The regex also allows for capital letters, while npm does not. Capital letters are needed because the scope must be
-identical to the root namespace of the project.
+The regex also allows for capital letters, while npm does not.
WARNING:
When you update the path of a user or group, or transfer a subgroup or project,
@@ -302,8 +309,9 @@ the same version more than once, even if it has been deleted.
## Install a package
npm packages are commonly-installed by using the `npm` or `yarn` commands
-in a JavaScript project. You can install a package from the scope of a project, group,
-or instance.
+in a JavaScript project. You can install a package from the scope of a project or instance.
+
+If multiple packages have the same name and version, when you install a package, the most recently-published package is retrieved.
1. Set the URL for scoped packages by running:
diff --git a/doc/user/packages/nuget_repository/index.md b/doc/user/packages/nuget_repository/index.md
index 101bb810a0e..e1b61f28818 100644
--- a/doc/user/packages/nuget_repository/index.md
+++ b/doc/user/packages/nuget_repository/index.md
@@ -219,7 +219,7 @@ To use the [project-level](#use-the-gitlab-endpoint-for-nuget-packages) Package
<configuration>
<packageSources>
<clear />
- <add key="gitlab" value="https://gitlab.example.com/api/v4/project/<your_project_id>/packages/nuget/index.json" />
+ <add key="gitlab" value="https://gitlab.example.com/api/v4/projects/<your_project_id>/packages/nuget/index.json" />
</packageSources>
<packageSourceCredentials>
<gitlab>
diff --git a/doc/user/packages/package_registry/index.md b/doc/user/packages/package_registry/index.md
index 19796de0f51..2fd05ac1748 100644
--- a/doc/user/packages/package_registry/index.md
+++ b/doc/user/packages/package_registry/index.md
@@ -4,7 +4,7 @@ group: Package
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Package Registry
+# Package Registry **(FREE)**
> [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/221259) to GitLab Free in 13.3.
diff --git a/doc/user/packages/pypi_repository/index.md b/doc/user/packages/pypi_repository/index.md
index 763dbee3a82..a6cc5cf1f07 100644
--- a/doc/user/packages/pypi_repository/index.md
+++ b/doc/user/packages/pypi_repository/index.md
@@ -174,11 +174,10 @@ index-servers =
[gitlab]
repository = https://gitlab.example.com/api/v4/projects/<project_id>/packages/pypi
-username = __token__
-password = <your personal access token>
+username = <your_personal_access_token_name>
+password = <your_personal_access_token>
```
-- `username` must be `__token__` exactly.
- Your project ID is on your project's home page.
### Authenticate with a deploy token
@@ -317,24 +316,31 @@ more than once, a `404 Bad Request` error occurs.
To install the latest version of a package, use the following command:
```shell
-pip install --extra-index-url https://__token__:<personal_access_token>@gitlab.example.com/api/v4/projects/<project_id>/packages/pypi/simple --no-deps <package_name>
+pip install --index-url https://<personal_access_token_name>:<personal_access_token>@gitlab.example.com/api/v4/projects/<project_id>/packages/pypi/simple --no-deps <package_name>
```
- `<package_name>` is the package name.
+- `<personal_access_token_name>` is a personal access token name with the `read_api` scope.
- `<personal_access_token>` is a personal access token with the `read_api` scope.
- `<project_id>` is the project ID.
+In these commands, you can use `--extra-index-url` instead of `--index-url`. However, using
+`--extra-index-url` makes you vulnerable to dependency confusion attacks because it checks the PyPi
+repository for the package before it checks the custom repository. `--extra-index-url` adds the
+provided URL as an additional registry which the client checks if the package is present.
+`--index-url` tells the client to check for the package on the provided URL only.
+
If you were following the guide and want to install the
`MyPyPiPackage` package, you can run:
```shell
-pip install mypypipackage --no-deps --extra-index-url https://__token__:<personal_access_token>@gitlab.example.com/api/v4/projects/<your_project_id>/packages/pypi/simple
+pip install mypypipackage --no-deps --index-url https://<personal_access_token_name>:<personal_access_token>@gitlab.example.com/api/v4/projects/<your_project_id>/packages/pypi/simple
```
This message indicates that the package was installed successfully:
```plaintext
-Looking in indexes: https://__token__:****@gitlab.example.com/api/v4/projects/<your_project_id>/packages/pypi/simple
+Looking in indexes: https://<personal_access_token_name>:****@gitlab.example.com/api/v4/projects/<your_project_id>/packages/pypi/simple
Collecting mypypipackage
Downloading https://gitlab.example.com/api/v4/projects/<your_project_id>/packages/pypi/files/d53334205552a355fee8ca35a164512ef7334f33d309e60240d57073ee4386e6/mypypipackage-0.0.1-py3-none-any.whl (1.6 kB)
Installing collected packages: mypypipackage
diff --git a/doc/user/packages/workflows/monorepo.md b/doc/user/packages/workflows/monorepo.md
deleted file mode 100644
index abba9df6ec2..00000000000
--- a/doc/user/packages/workflows/monorepo.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: '../npm_registry/index.md'
-disqus_identifier: 'https://docs.gitlab.com/ee/user/packages/workflows/monorepo.html'
----
-
-This document was moved to [another location](../npm_registry/index.md).
-
-<!-- This redirect file can be deleted after <2021-02-14>. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/user/packages/workflows/project_registry.md b/doc/user/packages/workflows/project_registry.md
index 9b99b126996..c63c2cc9989 100644
--- a/doc/user/packages/workflows/project_registry.md
+++ b/doc/user/packages/workflows/project_registry.md
@@ -77,6 +77,11 @@ depending on your final package recipe. For example:
CONAN_LOGIN_USERNAME=<gitlab-username> CONAN_PASSWORD=<personal_access_token> conan upload MyPackage/1.0.0@foo+bar+my-proj/channel --all --remote=gitlab
```
+### Composer
+
+You can't publish a Composer package outside of its project. An [issue](https://gitlab.com/gitlab-org/gitlab/-/issues/250633)
+exists to implement functionality that allows you to publish such packages to other projects.
+
### All other package types
[All package types supported by GitLab](../index.md) can be published in
diff --git a/doc/user/permissions.md b/doc/user/permissions.md
index 68a68ed65ad..bde589661f9 100644
--- a/doc/user/permissions.md
+++ b/doc/user/permissions.md
@@ -78,6 +78,7 @@ The following table depicts the various user permission levels in a project.
| Assign reviewers | | ✓ | ✓ | ✓ | ✓ |
| Label issues | | ✓ | ✓ | ✓ | ✓ |
| Set issue weight | | ✓ | ✓ | ✓ | ✓ |
+| [Set issue estimate and record time spent](project/time_tracking.md) | | ✓ | ✓ | ✓ | ✓ |
| Lock issue threads | | ✓ | ✓ | ✓ | ✓ |
| Manage issue tracker | | ✓ | ✓ | ✓ | ✓ |
| Manage related issues | | ✓ | ✓ | ✓ | ✓ |
@@ -104,7 +105,8 @@ The following table depicts the various user permission levels in a project.
| Publish [packages](packages/index.md) | | | ✓ | ✓ | ✓ |
| Create/edit/delete a Cleanup policy | | | ✓ | ✓ | ✓ |
| Upload [Design Management](project/issues/design_management.md) files | | | ✓ | ✓ | ✓ |
-| Create/edit/delete [Releases](project/releases/index.md)| | | ✓ | ✓ | ✓ |
+| Create/edit [releases](project/releases/index.md)| | | ✓ | ✓ | ✓ |
+| Delete [releases](project/releases/index.md)| | | | ✓ | ✓ |
| Create new branches | | | ✓ | ✓ | ✓ |
| Push to non-protected branches | | | ✓ | ✓ | ✓ |
| Force push to non-protected branches | | | ✓ | ✓ | ✓ |
@@ -173,6 +175,7 @@ The following table depicts the various user permission levels in a project.
| View project Audit Events | | | ✓ (*12*) | ✓ | ✓ |
| Manage [push rules](../push_rules/push_rules.md) | | | | ✓ | ✓ |
| Manage [project access tokens](project/settings/project_access_tokens.md) **(FREE SELF)** | | | | ✓ | ✓ |
+| View 2FA status of members | | | | ✓ | ✓ |
| Switch visibility level | | | | | ✓ |
| Transfer project to another namespace | | | | | ✓ |
| Rename project | | | | | ✓ |
@@ -194,7 +197,7 @@ The following table depicts the various user permission levels in a project.
1. If the [branch is protected](project/protected_branches.md#using-the-allowed-to-merge-and-allowed-to-push-settings), this depends on the access Developers and Maintainers are given.
1. Guest users can access GitLab [**Releases**](project/releases/index.md) for downloading assets but are not allowed to download the source code nor see repository information like tags and commits.
1. Actions are limited only to records owned (referenced) by user.
-1. When [Share Group Lock](group/index.md#share-with-group-lock) is enabled the project can't be shared with other groups. It does not affect group with group sharing.
+1. When [Share Group Lock](group/index.md#prevent-a-project-from-being-shared-with-groups) is enabled the project can't be shared with other groups. It does not affect group with group sharing.
1. For information on eligible approvers for merge requests, see
[Eligible approvers](project/merge_requests/merge_request_approvals.md#eligible-approvers).
1. Owner permission is only available at the group or personal namespace level (and for instance admins) and is inherited by its projects.
@@ -293,6 +296,7 @@ group.
| View Value Stream analytics | ✓ | ✓ | ✓ | ✓ | ✓ |
| View Billing **(FREE SAAS)** | | | | | ✓ (4) |
| View Usage Quotas **(FREE SAAS)** | | | | | ✓ (4) |
+| View 2FA status of members | | | | | ✓ |
| Filter members by 2FA status | | | | | ✓ |
| Administer project compliance frameworks | | | | | ✓ |
@@ -301,9 +305,9 @@ group.
1. Introduced in GitLab 12.2.
1. Default project creation role can be changed at:
- The [instance level](admin_area/settings/visibility_and_access_controls.md#default-project-creation-protection).
- - The [group level](group/index.md#default-project-creation-level).
+ - The [group level](group/index.md#specify-who-can-add-projects-to-a-group).
1. Does not apply to subgroups.
-1. Developers can push commits to the default branch of a new project only if the [default branch protection](group/index.md#changing-the-default-branch-protection-of-a-group) is set to "Partially protected" or "Not protected".
+1. Developers can push commits to the default branch of a new project only if the [default branch protection](group/index.md#change-the-default-branch-protection-of-a-group) is set to "Partially protected" or "Not protected".
1. In addition, if your group is public or internal, all users who can see the group can also see group wiki pages.
1. Users can only view events based on their individual actions.
diff --git a/doc/user/profile/account/two_factor_authentication.md b/doc/user/profile/account/two_factor_authentication.md
index 44bf97bdd42..69efe455c53 100644
--- a/doc/user/profile/account/two_factor_authentication.md
+++ b/doc/user/profile/account/two_factor_authentication.md
@@ -49,11 +49,13 @@ To enable 2FA:
1. Select **Enable Two-factor Authentication**.
1. **On your device (usually your phone):**
1. Install a compatible application, like:
- - [Authenticator](https://mattrubin.me/authenticator/): open source app for iOS devices.
- - [andOTP](https://github.com/andOTP/andOTP): feature rich open source app for Android which supports PGP encrypted backups.
- - [FreeOTP](https://freeotp.github.io/): open source app for Android.
- - [Google Authenticator](https://support.google.com/accounts/answer/1066447?hl=en): proprietary app for iOS and Android.
- - [SailOTP](https://openrepos.net/content/seiichiro0185/sailotp): open source app for SailFish OS.
+ - [Authy](https://authy.com/)
+ - [Duo Mobile](https://duo.com/product/multi-factor-authentication-mfa/duo-mobile-app)
+ - [LastPass](https://lastpass.com/auth/)
+ - [Authenticator](https://mattrubin.me/authenticator/)
+ - [andOTP](https://github.com/andOTP/andOTP)
+ - [Google Authenticator](https://support.google.com/accounts/answer/1066447?hl=en)
+ - [SailOTP](https://openrepos.net/content/seiichiro0185/sailotp)
1. In the application, add a new entry in one of two ways:
- Scan the code presented in GitLab with your device's camera to add the
entry automatically.
@@ -159,7 +161,7 @@ have FortiToken configured in FortiToken Cloud.
You'll also need a `client_id` and `client_secret` to configure FortiToken Cloud.
To get these, see the `REST API Guide` at
-[`Fortinet Document Library`](https://docs.fortinet.com/document/fortitoken-cloud/20.4.d/rest-api).
+[`Fortinet Document Library`](https://docs.fortinet.com/document/fortitoken-cloud/latest/rest-api).
First configure FortiToken Cloud in GitLab. On your GitLab server:
diff --git a/doc/user/profile/img/busy_indicator_note_header_v13_9.png b/doc/user/profile/img/busy_indicator_note_header_v13_9.png
new file mode 100644
index 00000000000..63301ebdc14
--- /dev/null
+++ b/doc/user/profile/img/busy_indicator_note_header_v13_9.png
Binary files differ
diff --git a/doc/user/profile/img/busy_indicator_notes_v13_9.png b/doc/user/profile/img/busy_indicator_notes_v13_9.png
new file mode 100644
index 00000000000..2efe075c72b
--- /dev/null
+++ b/doc/user/profile/img/busy_indicator_notes_v13_9.png
Binary files differ
diff --git a/doc/user/profile/img/busy_indicator_profile_page_v13_6.png b/doc/user/profile/img/busy_indicator_profile_page_v13_6.png
new file mode 100644
index 00000000000..c8e969f38db
--- /dev/null
+++ b/doc/user/profile/img/busy_indicator_profile_page_v13_6.png
Binary files differ
diff --git a/doc/user/profile/img/busy_indicator_settings_menu_v13_6.png b/doc/user/profile/img/busy_indicator_settings_menu_v13_6.png
new file mode 100644
index 00000000000..711638541dd
--- /dev/null
+++ b/doc/user/profile/img/busy_indicator_settings_menu_v13_6.png
Binary files differ
diff --git a/doc/user/profile/img/busy_indicator_sidebar_collapsed_v13_9.png b/doc/user/profile/img/busy_indicator_sidebar_collapsed_v13_9.png
new file mode 100644
index 00000000000..3dca88ec8cc
--- /dev/null
+++ b/doc/user/profile/img/busy_indicator_sidebar_collapsed_v13_9.png
Binary files differ
diff --git a/doc/user/profile/img/busy_indicator_sidebar_v13_9.png b/doc/user/profile/img/busy_indicator_sidebar_v13_9.png
new file mode 100644
index 00000000000..83024b319bf
--- /dev/null
+++ b/doc/user/profile/img/busy_indicator_sidebar_v13_9.png
Binary files differ
diff --git a/doc/user/profile/img/busy_indicator_user_popovers_v13_6.png b/doc/user/profile/img/busy_indicator_user_popovers_v13_6.png
new file mode 100644
index 00000000000..16fb0e6556b
--- /dev/null
+++ b/doc/user/profile/img/busy_indicator_user_popovers_v13_6.png
Binary files differ
diff --git a/doc/user/profile/index.md b/doc/user/profile/index.md
index d2cbf9e4acd..65d83c2b413 100644
--- a/doc/user/profile/index.md
+++ b/doc/user/profile/index.md
@@ -40,9 +40,9 @@ On your profile page, you can see the following information:
- Contributed projects: [projects](../project/index.md) you contributed to
- Personal projects: your personal projects (respecting the project's visibility level)
- Starred projects: projects you starred
-- Snippets: your personal code [snippets](../snippets.md#personal-snippets)
-- Followers: people following you
-- Following: people you are following
+- Snippets: your personal code [snippets](../snippets.md)
+- Followers: people [following](../index.md#user-activity) you
+- Following: people you are [following](../index.md#user-activity)
Profile page with active Following view:
@@ -233,6 +233,26 @@ To set the busy status indicator, either:
1. Select **Edit profile**.
1. Select the **Busy** checkbox.
+ Once selected, you can see the busy status in various locations in the user interface.
+
+ Username:
+
+ | Profile page | Settings menu | User popovers |
+ | --- | --- | --- |
+ | ![Busy status - profile page](img/busy_indicator_profile_page_v13_6.png) | ![Busy status - settings menu](img/busy_indicator_settings_menu_v13_6.png) | ![Busy status - user popovers](img/busy_indicator_user_popovers_v13_6.png) |
+
+ Issue and merge request sidebar:
+
+ | Sidebar| Collapsed sidebar |
+ | --- | --- |
+ | ![Busy status - sidebar](img/busy_indicator_sidebar_v13_9.png) | ![Busy status - sidebar collapsed](img/busy_indicator_sidebar_collapsed_v13_9.png) |
+
+ Notes:
+
+ | Notes | Note headers |
+ | --- | --- |
+ | ![Busy status - notes](img/busy_indicator_notes_v13_9.png) | ![Busy status - note header](img/busy_indicator_note_header_v13_9.png) |
+
### Disable busy status feature
The busy status feature is deployed behind a feature flag and is **enabled by default**.
diff --git a/doc/user/profile/notifications.md b/doc/user/profile/notifications.md
index 703154945db..4f28558cca6 100644
--- a/doc/user/profile/notifications.md
+++ b/doc/user/profile/notifications.md
@@ -206,7 +206,8 @@ epics:
| Failed pipeline | The author of the pipeline |
| Fixed pipeline ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/24309) in GitLab 13.1.) | The author of the pipeline. Enabled by default. |
| Merge merge request | |
-| Merge when pipeline succeeds ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/211961) in GitLab 13.4) | |
+| Merge when pipeline succeeds ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/211961) in GitLab 13.4) | Author, Participants, Watchers, Subscribers, and Custom notification level with this event selected. `Note:` Custom notification level is ignored for Author, Watchers and Subscribers |
+| Merge request [marked as ready](../project/merge_requests/drafts.md) (introduced in [GitLab 13.10](https://gitlab.com/gitlab-org/gitlab/-/issues/15332)) | Watchers and participants |
| New comment | Participants, Watchers, Subscribers, and Custom notification level with this event selected, plus anyone mentioned by `@username` in the comment, with notification level "Mention" or higher |
| New epic | |
| New issue | |
diff --git a/doc/user/profile/personal_access_tokens.md b/doc/user/profile/personal_access_tokens.md
index 99db0c4b898..d32971a7618 100644
--- a/doc/user/profile/personal_access_tokens.md
+++ b/doc/user/profile/personal_access_tokens.md
@@ -21,7 +21,7 @@ Personal access tokens expire on the date you define, at midnight UTC.
- GitLab runs a check at 01:00 AM UTC every day to identify personal access tokens that expire in under seven days. The owners of these tokens are notified by email.
- GitLab runs a check at 02:00 AM UTC every day to identify personal access tokens that expired on the current date. The owners of these tokens are notified by email.
- In GitLab Ultimate, administrators may [limit the lifetime of personal access tokens](../admin_area/settings/account_and_limit_settings.md#limiting-lifetime-of-personal-access-tokens).
-- In GitLab Ultimate, administrators may [toggle enforcement of personal access token expiry](../admin_area/settings/account_and_limit_settings.md#optional-enforcement-of-personal-access-token-expiry).
+- In GitLab Ultimate, administrators may [toggle enforcement of personal access token expiration](../admin_area/settings/account_and_limit_settings.md#optional-non-enforcement-of-personal-access-token-expiration).
For examples of how you can use a personal access token to authenticate with the API, see the following section from our [API Docs](../../api/README.md#personalproject-access-tokens).
diff --git a/doc/user/profile/preferences.md b/doc/user/profile/preferences.md
index 464edf13a7e..78900e145b7 100644
--- a/doc/user/profile/preferences.md
+++ b/doc/user/profile/preferences.md
@@ -58,12 +58,10 @@ Dark mode is available as a navigation theme, for MVC and compatibility reasons.
the future, we plan to make it configurable in its own section along with support for
[different navigation themes](https://gitlab.com/gitlab-org/gitlab/-/issues/219512).
-NOTE:
Dark theme only works with the **Dark** syntax highlighting theme.
## Syntax highlighting theme
-NOTE:
GitLab uses the [rouge Ruby library](http://rouge.jneen.net/ "Rouge website")
for syntax highlighting outside of any Editor context. The WebIDE (like Snippets)
uses [Monaco Editor](https://microsoft.github.io/monaco-editor/) and it's provided
@@ -88,11 +86,7 @@ The default syntax theme is White, and you can choose among 5 different themes:
![Profile preferences syntax highlighting themes](img/profile-preferences-syntax-themes.png)
-[Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2389) in 13.0, the theme
-you choose also applies to the [Web IDE](../project/web_ide/index.md)'s code editor and [Snippets](../snippets.md).
-The themes are available only in the Web IDE file editor, except for the [dark theme](https://gitlab.com/gitlab-org/gitlab/-/issues/209808) and
-the [Solarized dark theme](https://gitlab.com/gitlab-org/gitlab/-/issues/219228),
-which apply to the entire Web IDE screen.
+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).
## Behavior
@@ -114,12 +108,13 @@ select few, the amount of activity on the default Dashboard page can be
overwhelming. Changing this setting allows you to redefine your default
dashboard.
-You have 8 options here that you can use for your default dashboard view:
+You can include the following options for your default dashboard view:
- Your projects (default)
- Starred projects
- Your projects' activity
- Starred projects' activity
+- Followed Users' Activity
- Your groups
- Your [To-Do List](../todos.md)
- Assigned Issues
diff --git a/doc/user/project/autocomplete_characters.md b/doc/user/project/autocomplete_characters.md
index 8d8ff942d05..aa8c21fc781 100644
--- a/doc/user/project/autocomplete_characters.md
+++ b/doc/user/project/autocomplete_characters.md
@@ -15,25 +15,24 @@ Markdown fields. When you start typing a word in a Markdown field with one of
the following characters, GitLab progressively autocompletes against a set of
matching values. The string matching is not case sensitive.
-| Character | Autocompletes |
-| :-------- | :------------ |
-| `~` | Labels |
-| `%` | Milestones |
-| `@` | Users and groups |
-| `#` | Issues |
-| `!` | Merge requests |
-| `&` | Epics |
-| `$` | Snippets |
-| `:` | Emoji |
-| `/` | Quick Actions |
-
-Up to 5 of the most relevant matches are displayed in a popup list. When you
-select an item from the list, the value is entered in the field. The more
-characters you enter, the more precise the matches are.
+| Character | Autocompletes | Relevant matches shown |
+| :-------- | :------------ | :---- |
+| `~` | Labels | 20 |
+| `%` | Milestones | 5 |
+| `@` | Users and groups | 10 |
+| `#` | Issues | 5 |
+| `!` | Merge requests | 5 |
+| `&` | Epics | 5 |
+| `$` | Snippets | 5 |
+| `:` | Emoji | 5 |
+| `/` | Quick Actions | 100 |
+
+When you select an item from the list, the value is entered in the field.
+The more characters you enter, the more precise the matches are.
Autocomplete characters are useful when combined with [Quick Actions](quick_actions.md).
-## Example
+## User autocomplete
Assume your GitLab instance includes the following users:
@@ -49,17 +48,9 @@ Assume your GitLab instance includes the following users:
<!-- vale gitlab.Spelling = YES -->
-In an Issue comment, entering `@l` results in the following popup list
-appearing. Note that user `shelba` is not included, because the list includes
-only the 5 users most relevant to the Issue.
-
-![Popup list which includes users whose username or name contains the letter `l`](img/autocomplete_characters_example1_v12_0.png)
-
-If you continue to type, `@le`, the popup list changes to the following. The
-popup now only includes users where `le` appears in their username, or a word in
-their name.
-
-![Popup list which includes users whose username or name contains the string](img/autocomplete_characters_example2_v12_0.png)
+User autocompletion sorts by the users whose username or name start with your query first.
+For example, typing `@lea` shows `leanna` first and typing `@ros` shows `Rosemarie Rogahn` and `Rosy Grant` first.
+Any usernames or names that include your query are shown afterwards in the autocomplete menu.
You can also search across the full name to find a user.
-To find `Rosy Grant`, even if their username is for example `hunter2`, you can type their full name without spaces like `@rosygrant`.
+To find `Rosy Grant`, even if their username is for example `alessandra`, you can type their full name without spaces like `@rosygrant`.
diff --git a/doc/user/project/badges.md b/doc/user/project/badges.md
index 7e6bba30001..783232ca7f9 100644
--- a/doc/user/project/badges.md
+++ b/doc/user/project/badges.md
@@ -19,7 +19,7 @@ project maintainers.
## Project badges
-Badges can be added to a project by Maintainers or Owners, and will then be visible on the project's overview page.
+Badges can be added to a project by Maintainers or Owners, and are visible on the project's overview page.
If you find that you have to add the same badges to several projects, you may want to add them at the [group level](#group-badges).
To add a new badge to a project:
@@ -52,7 +52,7 @@ To add this badge to a project:
## Group badges
-Badges can be added to a group and will then be visible on every project's
+Badges can be added to a group and are visible on every project's
overview page that's under that group. In this case, they cannot be edited or
deleted on the project level. If you need to have individual badges for each
project, consider adding them on the [project level](#project-badges) or use
@@ -75,7 +75,7 @@ Badges directly associated with a project can be configured on the
## Placeholders
The URL a badge points to, as well as the image URL, can contain placeholders
-which will be evaluated when displaying the badge. The following placeholders
+which are evaluated when displaying the badge. The following placeholders
are available:
- `%{project_path}`: Path of a project including the parent groups
diff --git a/doc/user/project/clusters/add_eks_clusters.md b/doc/user/project/clusters/add_eks_clusters.md
index eb6b8302667..e329ec4f903 100644
--- a/doc/user/project/clusters/add_eks_clusters.md
+++ b/doc/user/project/clusters/add_eks_clusters.md
@@ -140,13 +140,11 @@ To create and add a new Kubernetes cluster to your project, group, or instance:
1. Click **Review policy**.
1. Enter a suitable name for this policy, and click **Create Policy**. You can now close this window.
-1. In the [IAM Management Console](https://console.aws.amazon.com/iam/home), create an EKS management IAM role.
- To do so, follow the [Amazon EKS cluster IAM role](https://docs.aws.amazon.com/eks/latest/userguide/service_IAM_role.html) instructions
- to create a IAM role suitable for managing the AWS EKS cluster's resources on your behalf.
+1. In the [IAM Management Console](https://console.aws.amazon.com/iam/home), create an **EKS IAM role** following the [Amazon EKS cluster IAM role instructions](https://docs.aws.amazon.com/eks/latest/userguide/service_IAM_role.html). This role should exist so that Kubernetes clusters managed by Amazon EKS can make calls to other AWS services on your behalf to manage the resources that you use with the service.
In addition to the policies that guide suggests, you must also include the `AmazonEKSClusterPolicy`
policy for this role in order for GitLab to manage the EKS cluster correctly.
-1. In the [IAM Management Console](https://console.aws.amazon.com/iam/home), create an IAM role:
- 1. From the left panel, select **Roles**.
+1. In the [IAM Management Console](https://console.aws.amazon.com/iam/home), create another IAM role which will be used by GitLab to authenticate with AWS. Follow these steps to create it:
+ 1. On the AWS IAM console, select **Roles** from the left panel.
1. Click **Create role**.
1. Under `Select type of trusted entity`, select **Another AWS account**.
1. Enter the Account ID from GitLab into the `Account ID` field.
@@ -326,7 +324,7 @@ If a default Storage Class doesn't already exist and is desired, follow Amazon's
to create one.
Alternatively, disable PostgreSQL by setting the project variable
-[`POSTGRES_ENABLED`](../../../topics/autodevops/customize.md#environment-variables) to `false`.
+[`POSTGRES_ENABLED`](../../../topics/autodevops/customize.md#cicd-variables) to `false`.
### Deploy the app to EKS
diff --git a/doc/user/project/clusters/index.md b/doc/user/project/clusters/index.md
index d3d434762ab..aabda474043 100644
--- a/doc/user/project/clusters/index.md
+++ b/doc/user/project/clusters/index.md
@@ -58,7 +58,6 @@ Kubernetes version to any supported version at any time:
- 1.17 (support ends on September 22, 2021)
- 1.16 (support ends on July 22, 2021)
- 1.15 (support ends on May 22, 2021)
-- 1.14 (deprecated, support ends on December 22, 2020)
Some GitLab features may support versions outside the range provided here.
@@ -87,7 +86,7 @@ differentiates the new cluster from the rest.
When adding more than one Kubernetes cluster to your project, you need to differentiate
them with an environment scope. The environment scope associates clusters with [environments](../../../ci/environments/index.md) similar to how the
-[environment-specific variables](../../../ci/variables/README.md#limit-the-environment-scopes-of-cicd-variables) work.
+[environment-specific CI/CD variables](../../../ci/variables/README.md#limit-the-environment-scopes-of-cicd-variables) work.
The default environment scope is `*`, which means all jobs, regardless of their
environment, use that cluster. Each scope can be used only by a single cluster
@@ -201,7 +200,7 @@ To clear the cache:
You do not need to specify a base domain on cluster settings when using GitLab Serverless. The domain in that case
is specified as part of the Knative installation. See [Installing Applications](#installing-applications).
-Specifying a base domain automatically sets `KUBE_INGRESS_BASE_DOMAIN` as an environment variable.
+Specifying a base domain automatically sets `KUBE_INGRESS_BASE_DOMAIN` as an deployment variable.
If you are using [Auto DevOps](../../../topics/autodevops/index.md), this domain is used for the different
stages. For example, Auto Review Apps and Auto Deploy.
@@ -289,7 +288,7 @@ A Kubernetes cluster can be the destination for a deployment job. If
the cluster from your jobs using tools such as `kubectl` or `helm`.
- You don't use the GitLab cluster integration, you can still deploy to your
cluster. However, you must configure Kubernetes tools yourself
- using [environment variables](../../../ci/variables/README.md#custom-cicd-variables)
+ using [CI/CD variables](../../../ci/variables/README.md#custom-cicd-variables)
before you can interact with the cluster from your jobs.
### Deployment variables
@@ -313,9 +312,9 @@ following command in your deployment job script, for Kubernetes to access the re
The Kubernetes cluster integration exposes these
[deployment variables](../../../ci/variables/README.md#deployment-variables) in the
GitLab CI/CD build environment to deployment jobs. Deployment jobs have
-[defined a target environment](../../../ci/environments/index.md#defining-environments).
+[defined a target environment](../../../ci/environments/index.md).
-| Variable | Description |
+| Deployment Variable | Description |
|----------------------------|-------------|
| `KUBE_URL` | Equal to the API URL. |
| `KUBE_TOKEN` | The Kubernetes token of the [environment service account](add_remove_clusters.md#access-controls). Prior to GitLab 11.5, `KUBE_TOKEN` was the Kubernetes token of the main service account of the cluster integration. |
@@ -346,14 +345,14 @@ You can customize the deployment namespace in a few ways:
- For **non-managed** clusters, the auto-generated namespace is set in the `KUBECONFIG`,
but the user is responsible for ensuring its existence. You can fully customize
this value using
- [`environment:kubernetes:namespace`](../../../ci/environments/index.md#configuring-kubernetes-deployments)
+ [`environment:kubernetes:namespace`](../../../ci/environments/index.md#configure-kubernetes-deployments)
in `.gitlab-ci.yml`.
When you customize the namespace, existing environments remain linked to their current
namespaces until you [clear the cluster cache](#clearing-the-cluster-cache).
WARNING:
-By default, anyone who can create a deployment job can access any CI variable in
+By default, anyone who can create a deployment job can access any CI/CD variable in
an environment's deployment job. This includes `KUBECONFIG`, which gives access to
any secret available to the associated service account in your cluster.
To keep your production credentials safe, consider using
@@ -407,7 +406,7 @@ deployments, replica sets, and pods are annotated with:
- `app.gitlab.com/app: $CI_PROJECT_PATH_SLUG`
`$CI_ENVIRONMENT_SLUG` and `$CI_PROJECT_PATH_SLUG` are the values of
-the CI variables.
+the CI/CD variables.
You must be the project owner or have `maintainer` permissions to use terminals.
Support is limited to the first container in the first pod of your environment.
@@ -432,8 +431,8 @@ Reasons for failure include:
- The token you gave GitLab does not have [`cluster-admin`](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#user-facing-roles)
privileges required by GitLab.
-- Missing `KUBECONFIG` or `KUBE_TOKEN` variables. To be passed to your job, they must have a matching
- [`environment:name`](../../../ci/environments/index.md#defining-environments). If your job has no
+- Missing `KUBECONFIG` or `KUBE_TOKEN` deployment variables. To be passed to your job, they must have a matching
+ [`environment:name`](../../../ci/environments/index.md). If your job has no
`environment:name` set, the Kubernetes credentials are not passed to it.
NOTE:
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 0c4ec72ed5b..d64ebfd9385 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
@@ -15,7 +15,7 @@ applications through GMAv2 exclusively when using Container Network Security.
The following steps are recommended to install and use Container Host Security through GitLab:
1. [Install at least one runner and connect it to GitLab](https://docs.gitlab.com/runner/).
-1. [Create a group](../../../../group/#create-a-new-group).
+1. [Create a group](../../../../group/#create-a-group).
1. [Connect a Kubernetes cluster to the group](../../add_remove_clusters.md).
1. [Create a cluster management project and associate it with the Kubernetes cluster](../../../../clusters/management_project.md).
@@ -57,7 +57,7 @@ initial troubleshooting steps that resolve the most common problems:
1. If things still aren't working, a more assertive set of actions may help get things back to a
good state:
- - Stop and [delete the problematic environment](../../../../../ci/environments/#delete-environments-through-the-ui)
+ - Stop and [delete the problematic environment](../../../../../ci/environments/#delete-a-stopped-environment)
in GitLab.
- Delete the relevant namespace in Kubernetes by running
`kubectl delete namespaces <insert-some-namespace-name>` in your Kubernetes cluster.
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 e530f0dfcda..14db98c7ce7 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
@@ -15,7 +15,7 @@ applications through GMAv2 exclusively when using Container Network Security.
The following steps are recommended to install and use Container Network Security through GitLab:
1. [Install at least one runner and connect it to GitLab](https://docs.gitlab.com/runner/).
-1. [Create a group](../../../../group/#create-a-new-group).
+1. [Create a group](../../../../group/#create-a-group).
1. [Connect a Kubernetes cluster to the group](../../add_remove_clusters.md).
1. [Create a cluster management project and associate it with the Kubernetes cluster](../../../../clusters/management_project.md).
@@ -131,7 +131,7 @@ initial troubleshooting steps that resolve the most common problems:
1. If things still aren't working, a more assertive set of actions may help get things back into a
good state:
- - Stop and [delete the problematic environment](../../../../../ci/environments/index.md#delete-environments-through-the-ui) in GitLab.
+ - Stop and [delete the problematic environment](../../../../../ci/environments/index.md#delete-a-stopped-environment) in GitLab.
- Delete the relevant namespace in Kubernetes by running `kubectl delete namespaces <insert-some-namespace-name>` in your Kubernetes cluster.
- Rerun the application project pipeline to redeploy the application.
diff --git a/doc/user/project/clusters/serverless/aws.md b/doc/user/project/clusters/serverless/aws.md
index 192a7c7cd39..f78fb2ed1ef 100644
--- a/doc/user/project/clusters/serverless/aws.md
+++ b/doc/user/project/clusters/serverless/aws.md
@@ -367,12 +367,11 @@ sam init -h
### Setting up your AWS credentials with your GitLab account
In order to interact with your AWS account, the GitLab CI/CD pipelines require both
-`AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` to be set in the project's CI/CD
-variables.
+`AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` to be set in the project's CI/CD variables.
To set these:
-1. Navigate to the project's **Settings > CI / CD**.
+1. Navigate to the project's **Settings > CI/CD**.
1. Expand the **Variables** section and create entries for `AWS_ACCESS_KEY_ID` and
`AWS_SECRET_ACCESS_KEY`.
1. Mask the credentials so they do not show in logs using the **Masked** toggle.
@@ -424,8 +423,8 @@ deploys your application. If your:
- Incompatible versions of software. For example, Python runtime version might be
different from the Python on the build machine. Address this by installing the
required versions of the software.
- - You may not be able to access your AWS account from GitLab. Check the environment
- variables you set up with AWS credentials.
+ - You may not be able to access your AWS account from GitLab. Check the CI/CD variables
+ you set up with AWS credentials.
- You may not have permission to deploy a serverless application. Make sure you
provide all required permissions to deploy a serverless application.
diff --git a/doc/user/project/clusters/serverless/index.md b/doc/user/project/clusters/serverless/index.md
index c7ed8d6d2a5..0f7f5e23e59 100644
--- a/doc/user/project/clusters/serverless/index.md
+++ b/doc/user/project/clusters/serverless/index.md
@@ -90,7 +90,7 @@ memory. **RBAC must be enabled.**
NOTE:
Running `kubectl` commands on your cluster requires setting up access to the cluster first.
For clusters created on GKE, see [GKE Cluster Access](https://cloud.google.com/kubernetes-engine/docs/how-to/cluster-access-for-kubectl),
- for other platforms [Install kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/).
+ for other platforms [Install kubectl](https://kubernetes.io/docs/tasks/tools/).
1. The Ingress is now available at this address and routes incoming requests to the proper service based on the DNS
name in the request. To support this, a wildcard DNS record should be created for the desired domain name. For example,
@@ -396,7 +396,7 @@ kubectl create secret generic my-secrets -n "$KUBE_NAMESPACE" --from-literal MY_
#### Part of deployment job
-You can extend your `.gitlab-ci.yml` to create the secrets during deployment using the [environment variables](../../../../ci/variables/README.md)
+You can extend your `.gitlab-ci.yml` to create the secrets during deployment using the [CI/CD variables](../../../../ci/variables/README.md)
stored securely under your GitLab project.
```yaml
@@ -521,7 +521,7 @@ Running `kubectl` commands on your cluster requires setting up access to the
cluster first. For clusters created on:
- GKE, see [GKE Cluster Access](https://cloud.google.com/kubernetes-engine/docs/how-to/cluster-access-for-kubectl)
-- Other platforms, see [Install and Set Up kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/).
+- Other platforms, see [Install and Set Up kubectl](https://kubernetes.io/docs/tasks/tools/).
### Enable request log template
@@ -769,7 +769,7 @@ or with other versions of Python.
Running `kubectl` commands on your cluster requires setting up access to the cluster first.
For clusters created on GKE, see
[GKE Cluster Access](https://cloud.google.com/kubernetes-engine/docs/how-to/cluster-access-for-kubectl).
- For other platforms, [install `kubectl`](https://kubernetes.io/docs/tasks/tools/install-kubectl/).
+ For other platforms, [install `kubectl`](https://kubernetes.io/docs/tasks/tools/).
```shell
kubectl create --namespace istio-system secret tls istio-ingressgateway-certs \
diff --git a/doc/user/project/code_intelligence.md b/doc/user/project/code_intelligence.md
index 0e8c1bf8f4d..f1071af7c1f 100644
--- a/doc/user/project/code_intelligence.md
+++ b/doc/user/project/code_intelligence.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+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"
type: reference
---
@@ -19,10 +19,13 @@ Code Intelligence is built into GitLab and powered by [LSIF](https://lsif.dev/)
(Language Server Index Format), a file format for precomputed code
intelligence data.
+NOTE:
+You can automate this feature in your applications by using [Auto DevOps](../../topics/autodevops/index.md).
+
## Configuration
Enable code intelligence for a project by adding a GitLab CI/CD job to the project's
-`.gitlab-ci.yml` which will generate the LSIF artifact:
+`.gitlab-ci.yml` which generates the LSIF artifact:
```yaml
code_navigation:
diff --git a/doc/user/project/deploy_boards.md b/doc/user/project/deploy_boards.md
index 72695580d9d..368417ac00b 100644
--- a/doc/user/project/deploy_boards.md
+++ b/doc/user/project/deploy_boards.md
@@ -16,6 +16,10 @@ of the pods in the deployment. Developers and other teammates can view the
progress and status of a rollout, pod by pod, in the workflow they already use
without any need to access Kubernetes.
+NOTE:
+If you have a Kubernetes cluster, you can Auto Deploy applications to production
+environments by using [Auto DevOps](../../topics/autodevops/index.md).
+
## Overview
With Deploy Boards you can gain more insight into deploys with benefits such as:
@@ -71,7 +75,7 @@ specific environment, there are a lot of use cases. To name a few:
To display the Deploy Boards for a specific [environment](../../ci/environments/index.md) you should:
-1. Have [defined an environment](../../ci/environments/index.md#defining-environments) with a deploy stage.
+1. Have [defined an environment](../../ci/environments/index.md) with a deploy stage.
1. Have a Kubernetes cluster up and running.
@@ -86,11 +90,11 @@ To display the Deploy Boards for a specific [environment](../../ci/environments/
[`kubernetes`](https://docs.gitlab.com/runner/executors/kubernetes.html) executor.
1. Configure the [Kubernetes integration](clusters/index.md) in your project for the
cluster. The Kubernetes namespace is of particular note as you need it
- for your deployment scripts (exposed by the `KUBE_NAMESPACE` environment variable).
+ for your deployment scripts (exposed by the `KUBE_NAMESPACE` deployment variable).
1. Ensure Kubernetes annotations of `app.gitlab.com/env: $CI_ENVIRONMENT_SLUG`
and `app.gitlab.com/app: $CI_PROJECT_PATH_SLUG` are applied to the
deployments, replica sets, and pods, where `$CI_ENVIRONMENT_SLUG` and
- `$CI_PROJECT_PATH_SLUG` are the values of the CI variables. This is so we can
+ `$CI_PROJECT_PATH_SLUG` are the values of the CI/CD variables. This is so we can
lookup the proper environment in a cluster/namespace which may have more
than one. These resources should be contained in the namespace defined in
the Kubernetes service setting. You can use an [Auto deploy](../../topics/autodevops/stages.md#auto-deploy) `.gitlab-ci.yml`
@@ -159,6 +163,6 @@ version of your application.
## Further reading
- [GitLab Auto deploy](../../topics/autodevops/stages.md#auto-deploy)
-- [GitLab CI/CD environment variables](../../ci/variables/README.md)
+- [GitLab CI/CD variables](../../ci/variables/README.md)
- [Environments and deployments](../../ci/environments/index.md)
- [Kubernetes deploy example](https://gitlab.com/gitlab-examples/kubernetes-deploy)
diff --git a/doc/user/project/deploy_tokens/index.md b/doc/user/project/deploy_tokens/index.md
index 6f05c40eefc..8606ce36a82 100644
--- a/doc/user/project/deploy_tokens/index.md
+++ b/doc/user/project/deploy_tokens/index.md
@@ -10,7 +10,7 @@ type: howto
> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/17894) in GitLab 10.7.
> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/199370) from **Settings > Repository** in GitLab 12.9.
> - [Added `write_registry` scope](https://gitlab.com/gitlab-org/gitlab/-/issues/22743) in GitLab 12.10.
-> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/29280) from **Settings > CI / CD** in GitLab 12.10.1.
+> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/29280) from **Settings > CI/CD** in GitLab 12.10.1.
> - [Added package registry scopes](https://gitlab.com/gitlab-org/gitlab/-/issues/213566) in GitLab 13.0.
Deploy tokens allow you to download (`git clone`) or push and pull packages and
@@ -20,7 +20,7 @@ Deploy tokens can be managed by [maintainers only](../../permissions.md).
Deploy tokens cannot be used with the GitLab API.
-If you have a key pair, you might want to use [deploy keys](../../../ssh/README.md#deploy-keys)
+If you have a key pair, you might want to use [deploy keys](../../project/deploy_keys/index.md)
instead.
## Creating a Deploy Token
@@ -130,6 +130,22 @@ To pull packages in the GitLab package registry, you must:
1. For the [package type of your choice](../../packages/index.md), follow the
authentication instructions for deploy tokens.
+Example request publishing a generic package using a deploy token:
+
+```shell
+curl --header "DEPLOY-TOKEN: <deploy_token>" \
+ --upload-file path/to/file.txt \
+ "https://gitlab.example.com/api/v4/projects/24/packages/generic/my_package/0.0.1/file.txt?status=hidden"
+```
+
+Example response:
+
+```json
+{
+ "message":"201 Created"
+}
+```
+
### Push or upload packages
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/213566) in GitLab 13.0.
@@ -169,7 +185,7 @@ apply consistently when cloning the repository of related projects.
There's a special case when it comes to Deploy Tokens. If a user creates one
named `gitlab-deploy-token`, the username and token of the Deploy Token is
-automatically exposed to the CI/CD jobs as environment variables: `CI_DEPLOY_USER`
+automatically exposed to the CI/CD jobs as CI/CD variables: `CI_DEPLOY_USER`
and `CI_DEPLOY_PASSWORD`, respectively.
After you create the token, you can sign in to the Container Registry by using
@@ -180,7 +196,6 @@ docker login -u $CI_DEPLOY_USER -p $CI_DEPLOY_PASSWORD $CI_REGISTRY
```
NOTE:
-The special handling for the `gitlab-deploy-token` deploy token is not currently
-implemented for group deploy tokens. For the deploy token to be available for
-CI/CD jobs, it must be created at the project level. For details, see
-[this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/214014).
+The special handling for the `gitlab-deploy-token` deploy token is not
+implemented for group deploy tokens. To make the group-level deploy token available for
+CI/CD jobs, use the workaround in [issue 214014](https://gitlab.com/gitlab-org/gitlab/-/issues/214014).
diff --git a/doc/user/project/description_templates.md b/doc/user/project/description_templates.md
index c56470ee07a..e3fa7ca6dc0 100644
--- a/doc/user/project/description_templates.md
+++ b/doc/user/project/description_templates.md
@@ -37,10 +37,10 @@ To learn how to create templates for various file types in groups, visit
images guidelines, link to the related issue, reviewer name, and so on.
- You can also create issues and merge request templates for different
stages of your workflow, for example, feature proposal, feature improvement, or a bug report.
-- You can use an [issue description template](#creating-issue-templates) as a
+- You can use an [issue description template](#create-an-issue-template) as a
[Service Desk email template](service_desk.md#new-service-desk-issues).
-## Creating issue templates
+## Create an issue template
Create a new Markdown (`.md`) file inside the `.gitlab/issue_templates/`
directory in your repository. Commit and push to your default branch.
@@ -65,13 +65,13 @@ To create the `.gitlab/issue_templates` directory:
To check if this has worked correctly, [create a new issue](issues/managing_issues.md#create-a-new-issue)
and see if you can choose a description template.
-## Creating merge request templates
+## Create a merge request template
Similarly to issue templates, create a new Markdown (`.md`) file inside the
`.gitlab/merge_request_templates/` directory in your repository. Commit and
push to your default branch.
-## Using the templates
+## Use the templates
Let's take for example that you've created the file `.gitlab/issue_templates/Bug.md`.
This enables the `Bug` dropdown option when creating or editing issues. When
@@ -85,9 +85,45 @@ For example: `https://gitlab.com/gitlab-org/gitlab/-/issues/new?issuable_templat
![Description templates](img/description_templates.png)
-## Setting a default template for merge requests and issues **(PREMIUM)**
+### Set an issue and merge request description template at group level **(PREMIUM)**
-> - Moved to GitLab Premium in 13.9.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52360) in GitLab 13.9.
+> - It's [deployed behind a feature flag](../feature_flags.md), disabled by default.
+> - It's disabled by default on GitLab.com.
+> - To use it in GitLab self-managed instances, ask a GitLab administrator to
+ [enable it](#enable-or-disable-issue-and-merge-request-description-templates-at-group-and-instance-level).
+
+Templates can be useful because you can create a template once and use it multiple times.
+To re-use templates [you've created](../project/description_templates.md#create-an-issue-template):
+
+1. Go to the group's **Settings > General > Templates**.
+1. From the dropdown, select your template project as the template repository at group level.
+
+![Group template settings](../group/img/group_file_template_settings.png)
+
+### Set an issue and merge request description template at instance level **(PREMIUM ONLY)**
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52360) in GitLab 13.9.
+> - It's [deployed behind a feature flag](../feature_flags.md), disabled by default.
+> - It's disabled by default on GitLab.com.
+> - To use it in GitLab self-managed instances, ask a GitLab administrator to
+ [enable it](#enable-or-disable-issue-and-merge-request-description-templates-at-group-and-instance-level).
+
+Similar to group templates, issue and merge request templates can also be set up at the instance level.
+This results in those templates being available in all projects within the instance.
+Only instance administrators can set instance-level templates.
+
+To set the instance-level description template repository:
+
+1. Select the **Admin Area** icon (**{admin}**).
+1. Go to **Settings > Templates**.
+1. From the dropdown, select your template project as the template repository at instance level.
+
+Learn more about [instance template repository](../admin_area/settings/instance_template_repository.md).
+
+![Setting templates in the Admin Area](../admin_area/settings/img/file_template_admin_area.png)
+
+### Set a default template for merge requests and issues **(PREMIUM)**
The visibility of issues or merge requests should be set to either "Everyone
with access" or "Only Project Members" in your project's **Settings / Visibility, project features, permissions** section, otherwise the
@@ -110,6 +146,10 @@ After you add the description, hit **Save changes** for the settings to take
effect. Now, every time a new merge request or issue is created, it is
pre-filled with the text you entered in the template(s).
+[GitLab versions 13.10 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/885)
+provide `issues_template` and `merge_requests_template` attributes in the
+[Projects API](../../api/projects.md) to help you keep your templates up to date.
+
## Description template example
We make use of description templates for issues and merge requests in the GitLab project.
@@ -159,3 +199,28 @@ it's very hard to read otherwise.)
/cc @project-manager
/assign @qa-tester
```
+
+## Enable or disable issue and merge request description templates at group and instance level
+
+Setting issue and merge request description templates at group and instance levels
+is under development and not ready for production use. It is deployed behind a
+feature flag that is **disabled by default**.
+[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
+can enable it.
+
+To enable it:
+
+```ruby
+Feature.enable(:inherited_issuable_templates)
+```
+
+To disable it:
+
+```ruby
+Feature.disable(:inherited_issuable_templates)
+```
+
+The feature flag affects these features:
+
+- Setting a templates project as issue and merge request description templates source at group level.
+- Setting a templates project as issue and merge request description templates source at instance level.
diff --git a/doc/user/project/file_lock.md b/doc/user/project/file_lock.md
index 5c24ec6caf6..4edb6fbdad9 100644
--- a/doc/user/project/file_lock.md
+++ b/doc/user/project/file_lock.md
@@ -36,9 +36,9 @@ GitLab supports two different modes of file locking:
Locks can be created by any person who has at least
[Developer permissions](../permissions.md) to the repository.
-Only the user who locked the file or directory can edit locked files. Others
-users will be prevented from modifying locked files by pushing, merging,
-or any other means, and will be shown an error like: `The path '.gitignore' is
+Only the user who locked the file or directory can edit locked files. Other
+users are prevented from modifying locked files by pushing, merging,
+or any other means, and are shown an error like: `The path '.gitignore' is
locked by Administrator`.
## Exclusive file locks **(FREE)**
@@ -60,7 +60,7 @@ Before getting started, make sure you have [Git LFS installed](../../topics/git/
git-lfs --version
```
-If it doesn't recognize this command, you'll have to install it. There are
+If it doesn't recognize this command, you must install it. There are
several [installation methods](https://git-lfs.github.com/) that you can
choose according to your OS. To install it with Homebrew:
@@ -70,7 +70,7 @@ brew install git-lfs
Once installed, **open your local repository in a terminal window** and
install Git LFS in your repository. If you're sure that LFS is already installed,
-you can skip this step. If you're unsure, re-installing it won't do any harm:
+you can skip this step. If you're unsure, re-installing it does no harm:
```shell
git lfs install
@@ -84,14 +84,14 @@ You need [Maintainer permissions](../permissions.md) to configure
Exclusive File Locks for your project through the command line.
The first thing to do before using File Locking is to tell Git LFS which
-kind of files are lockable. The following command will store PNG files
+kind of files are lockable. The following command stores PNG files
in LFS and flag them as lockable:
```shell
git lfs track "*.png" --lockable
```
-After executing the above command a file named `.gitattributes` will be
+After executing the above command a file named `.gitattributes` is
created or updated with the following content:
```shell
@@ -110,9 +110,9 @@ implements the LFS File Locking API). To do that you can edit the
The `.gitattributes` file is key to the process and **must**
be pushed to the remote repository for the changes to take effect.
-After a file type has been registered as lockable, Git LFS will make
-them read-only on the file system automatically. This means you will
-need to **lock the file** before [editing it](#edit-lockable-files).
+After a file type has been registered as lockable, Git LFS makes
+them read-only on the file system automatically. This means you
+must **lock the file** before [editing it](#edit-lockable-files).
### Lock files
@@ -168,7 +168,7 @@ git lfs locks
The output lists the locked files followed by the user who locked each of them
and the files' IDs.
-On the repository file tree, GitLab will display an LFS badge for files
+On the repository file tree, GitLab displays an LFS badge for files
tracked by Git LFS plus a padlock icon on exclusively-locked files:
![LFS-Locked files](img/lfs_locked_files_v13_2.png)
@@ -176,7 +176,7 @@ tracked by Git LFS plus a padlock icon on exclusively-locked files:
You can also [view and remove existing locks](#view-and-remove-existing-locks) from the GitLab UI.
NOTE:
-When you rename an exclusively-locked file, the lock is lost. You'll have to
+When you rename an exclusively-locked file, the lock is lost. You must
lock it again to keep it locked.
### Edit lockable files
@@ -204,7 +204,7 @@ or higher tiers.
Default branch file and directory locks only apply to the default branch set in
the project's settings (usually `master`).
-Changes to locked files on the default branch will be blocked, including merge
+Changes to locked files on the default branch are blocked, including merge
requests that modify locked files. Unlock the file to allow changes.
### Lock a file or a directory
@@ -216,10 +216,10 @@ To lock a file:
![Locking file](img/file_lock.png)
-An **Unlock** button will be displayed if the file is already locked, and
-will be disabled if you do not have permission to unlock the file.
+An **Unlock** button is displayed if the file is already locked, and
+is disabled if you do not have permission to unlock the file.
-If you did not lock the file, hovering your cursor over the button will show
+If you did not lock the file, hovering your cursor over the button shows
who locked the file.
### View and remove existing locks
diff --git a/doc/user/project/git_attributes.md b/doc/user/project/git_attributes.md
index 2806f6e48d1..11d1db195e1 100644
--- a/doc/user/project/git_attributes.md
+++ b/doc/user/project/git_attributes.md
@@ -17,7 +17,7 @@ directory of your repository and push it to the default branch of your project.
## Encoding Requirements
The `.gitattributes` file _must_ be encoded in UTF-8 and _must not_ contain a
-Byte Order Mark. If a different encoding is used, the file's contents will be
+Byte Order Mark. If a different encoding is used, the file's contents are
ignored.
## Syntax Highlighting
diff --git a/doc/user/project/img/autocomplete_characters_example1_v12_0.png b/doc/user/project/img/autocomplete_characters_example1_v12_0.png
deleted file mode 100644
index 9c6fa923b80..00000000000
--- a/doc/user/project/img/autocomplete_characters_example1_v12_0.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/img/autocomplete_characters_example2_v12_0.png b/doc/user/project/img/autocomplete_characters_example2_v12_0.png
deleted file mode 100644
index b2e8a782a0b..00000000000
--- a/doc/user/project/img/autocomplete_characters_example2_v12_0.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/img/code_owners_approval_new_protected_branch_v12_4.png b/doc/user/project/img/code_owners_approval_new_protected_branch_v12_4.png
deleted file mode 100644
index fc2893aa4d5..00000000000
--- a/doc/user/project/img/code_owners_approval_new_protected_branch_v12_4.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/img/code_owners_approval_new_protected_branch_v13_10.png b/doc/user/project/img/code_owners_approval_new_protected_branch_v13_10.png
new file mode 100644
index 00000000000..ee4ee2c6d71
--- /dev/null
+++ b/doc/user/project/img/code_owners_approval_new_protected_branch_v13_10.png
Binary files differ
diff --git a/doc/user/project/img/code_owners_approval_protected_branch_v12_4.png b/doc/user/project/img/code_owners_approval_protected_branch_v12_4.png
deleted file mode 100644
index 59da6874d14..00000000000
--- a/doc/user/project/img/code_owners_approval_protected_branch_v12_4.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/img/code_owners_approval_protected_branch_v13_10.png b/doc/user/project/img/code_owners_approval_protected_branch_v13_10.png
new file mode 100644
index 00000000000..220eb207132
--- /dev/null
+++ b/doc/user/project/img/code_owners_approval_protected_branch_v13_10.png
Binary files differ
diff --git a/doc/user/project/img/issue_boards_remove_issue_v13_6.png b/doc/user/project/img/issue_boards_remove_issue_v13_6.png
deleted file mode 100644
index c980759ad0c..00000000000
--- a/doc/user/project/img/issue_boards_remove_issue_v13_6.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/import/github.md b/doc/user/project/import/github.md
index c135b1be54a..eb426a9f126 100644
--- a/doc/user/project/import/github.md
+++ b/doc/user/project/import/github.md
@@ -49,8 +49,9 @@ The steps you take depend on whether you are importing from GitHub.com or GitHub
[GitHub Rake task](../../../administration/raketasks/github_import.md) to import
projects without the constraints of a [Sidekiq](../../../development/sidekiq_style_guide.md) worker.
- If you're importing from GitHub Enterprise to your self-managed GitLab instance, you must first enable
- [GitHub integration](../../../integration/github.md). However, you cannot import projects from GitHub Enterprise to GitLab.com.
-- If you're importing from GitHub.com to your self-managed GitLab instance, you do not need to set up GitHub integration.
+ [GitHub integration](../../../integration/github.md).
+ - To import projects from GitHub Enterprise to GitLab.com, use the [Import API](../../../api/import.md).
+- If you're importing from GitHub.com to your self-managed GitLab instance, you do not need to set up GitHub integration. You can use the [Import API](../../../api/import.md).
## How it works
@@ -62,7 +63,7 @@ must meet one of the following conditions prior to the import:
- Have previously logged in to a GitLab account using the GitHub icon.
- Have a GitHub account with a publicly visible
- [primary email address](https://docs.github.com/en/free-pro-team@latest/rest/reference/users#get-a-user)
+ [primary email address](https://docs.github.com/en/rest/reference/users#get-a-user)
on their profile that matches their GitLab account's primary or secondary email address.
If a user referenced in the project is not found in the GitLab database, the project creator (typically the user
@@ -91,7 +92,7 @@ Before you begin, ensure that any GitHub users who you want to map to GitLab use
- A GitLab account that has logged in using the GitHub icon
\- or -
-- A GitLab account with an email address that matches the [publicly visible email address](https://docs.github.com/en/free-pro-team@latest/rest/reference/users#get-a-user) in the profile of the GitHub user
+- A GitLab account with an email address that matches the [publicly visible email address](https://docs.github.com/en/rest/reference/users#get-a-user) in the profile of the GitHub user
User-matching attempts occur in that order, and if a user is not identified either way, the activity is associated with
the user account that is performing the import.
diff --git a/doc/user/project/index.md b/doc/user/project/index.md
index a8ab1cbbb63..7e5801a2382 100644
--- a/doc/user/project/index.md
+++ b/doc/user/project/index.md
@@ -154,9 +154,7 @@ There are numerous [APIs](../../api/README.md) to use with your projects:
- [Aliases](../../api/project_aliases.md)
- [DORA4 Analytics](../../api/dora4_project_analytics.md)
-## DORA4 analytics overview **(ULTIMATE ONLY)**
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/279039) in GitLab [Ultimate](https://about.gitlab.com/pricing/) 13.7 as a [Beta feature](https://about.gitlab.com/handbook/product/gitlab-the-product/#beta).
+## DORA4 analytics overview
Project details include the following analytics:
diff --git a/doc/user/project/integrations/bamboo.md b/doc/user/project/integrations/bamboo.md
index fb9314f7504..3b012ab4430 100644
--- a/doc/user/project/integrations/bamboo.md
+++ b/doc/user/project/integrations/bamboo.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Atlassian Bamboo CI Service
+# Atlassian Bamboo CI Service **(FREE)**
GitLab provides integration with Atlassian Bamboo for continuous integration.
When configured, pushes to a project trigger a build in Bamboo automatically.
diff --git a/doc/user/project/integrations/bugzilla.md b/doc/user/project/integrations/bugzilla.md
index 4e2ee9b3662..7e14515d98e 100644
--- a/doc/user/project/integrations/bugzilla.md
+++ b/doc/user/project/integrations/bugzilla.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Bugzilla Service
+# Bugzilla Service **(FREE)**
Navigate to the [Integrations page](overview.md#accessing-integrations),
select the **Bugzilla** service and fill in the required details as described
diff --git a/doc/user/project/integrations/custom_issue_tracker.md b/doc/user/project/integrations/custom_issue_tracker.md
index 143f0e2a25d..9cc4e980212 100644
--- a/doc/user/project/integrations/custom_issue_tracker.md
+++ b/doc/user/project/integrations/custom_issue_tracker.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Custom Issue Tracker service
+# Custom Issue Tracker service **(FREE)**
To enable the Custom Issue Tracker integration in a project:
diff --git a/doc/user/project/integrations/discord_notifications.md b/doc/user/project/integrations/discord_notifications.md
index 8e0a167a968..624c0252f23 100644
--- a/doc/user/project/integrations/discord_notifications.md
+++ b/doc/user/project/integrations/discord_notifications.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Discord Notifications service
+# Discord Notifications service **(FREE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/22684) in GitLab 11.6.
diff --git a/doc/user/project/integrations/emails_on_push.md b/doc/user/project/integrations/emails_on_push.md
index 2274913d349..4970e20974b 100644
--- a/doc/user/project/integrations/emails_on_push.md
+++ b/doc/user/project/integrations/emails_on_push.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Enabling emails on push
+# Enabling emails on push **(FREE)**
By enabling this service, you receive email notifications for every change
that is pushed to your project.
diff --git a/doc/user/project/integrations/github.md b/doc/user/project/integrations/github.md
index 5ef36ff4074..1c0309cab87 100644
--- a/doc/user/project/integrations/github.md
+++ b/doc/user/project/integrations/github.md
@@ -20,7 +20,7 @@ and is automatically configured on [GitHub import](../../../integration/github.m
### Complete these steps on GitHub
-This integration requires a [GitHub API token](https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/creating-a-personal-access-token)
+This integration requires a [GitHub API token](https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token)
with `repo:status` access granted:
1. Go to your "Personal access tokens" page at <https://github.com/settings/tokens>
diff --git a/doc/user/project/integrations/hangouts_chat.md b/doc/user/project/integrations/hangouts_chat.md
index 06dcca6eb44..d0efebd4da7 100644
--- a/doc/user/project/integrations/hangouts_chat.md
+++ b/doc/user/project/integrations/hangouts_chat.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Hangouts Chat service
+# Hangouts Chat service **(FREE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/43756) in GitLab 11.2.
diff --git a/doc/user/project/integrations/hipchat.md b/doc/user/project/integrations/hipchat.md
index 7b90d8d7cfd..f66fc0a0f6a 100644
--- a/doc/user/project/integrations/hipchat.md
+++ b/doc/user/project/integrations/hipchat.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Atlassian HipChat
+# Atlassian HipChat **(FREE)**
GitLab provides a way to send HipChat notifications upon a number of events,
such as when a user pushes code, creates a branch or tag, adds a comment, and
diff --git a/doc/user/project/integrations/img/mattermost_config_help.png b/doc/user/project/integrations/img/mattermost_config_help.png
deleted file mode 100644
index dd3481bc1f6..00000000000
--- a/doc/user/project/integrations/img/mattermost_config_help.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/integrations/img/mattermost_console_integrations.png b/doc/user/project/integrations/img/mattermost_console_integrations.png
deleted file mode 100644
index 625b57d4dc9..00000000000
--- a/doc/user/project/integrations/img/mattermost_console_integrations.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/integrations/img/mattermost_goto_console.png b/doc/user/project/integrations/img/mattermost_goto_console.png
deleted file mode 100644
index 8bacbe485f4..00000000000
--- a/doc/user/project/integrations/img/mattermost_goto_console.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/integrations/img/mattermost_slash_command_configuration.png b/doc/user/project/integrations/img/mattermost_slash_command_configuration.png
deleted file mode 100644
index f9e9de439ca..00000000000
--- a/doc/user/project/integrations/img/mattermost_slash_command_configuration.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/integrations/img/mattermost_slash_command_token.png b/doc/user/project/integrations/img/mattermost_slash_command_token.png
deleted file mode 100644
index c38f37c203c..00000000000
--- a/doc/user/project/integrations/img/mattermost_slash_command_token.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/integrations/img/mattermost_team_integrations.png b/doc/user/project/integrations/img/mattermost_team_integrations.png
deleted file mode 100644
index c2b68256e11..00000000000
--- a/doc/user/project/integrations/img/mattermost_team_integrations.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/integrations/index.md b/doc/user/project/integrations/index.md
index 0e5163e992a..5628a9bc5e5 100644
--- a/doc/user/project/integrations/index.md
+++ b/doc/user/project/integrations/index.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Project integrations
+# Project integrations **(FREE)**
You can find the available integrations under your project's
**Settings > Integrations** page. You need to have at least
diff --git a/doc/user/project/integrations/irker.md b/doc/user/project/integrations/irker.md
index 58f7ea3279f..e75561b3ddb 100644
--- a/doc/user/project/integrations/irker.md
+++ b/doc/user/project/integrations/irker.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Irker IRC Gateway
+# Irker IRC Gateway **(FREE)**
GitLab provides a way to push update messages to an Irker server. When
configured, pushes to a project trigger the service to send data directly
diff --git a/doc/user/project/integrations/jira.md b/doc/user/project/integrations/jira.md
index 5857c3da803..0878e1c9386 100644
--- a/doc/user/project/integrations/jira.md
+++ b/doc/user/project/integrations/jira.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To 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 integration
+# GitLab Jira integration **(FREE)**
You can use Jira to track work implemented in GitLab. The Jira integration with GitLab makes the
process of working across these systems more efficient.
diff --git a/doc/user/project/integrations/jira_cloud_configuration.md b/doc/user/project/integrations/jira_cloud_configuration.md
index e9f30f32308..8e25af3f884 100644
--- a/doc/user/project/integrations/jira_cloud_configuration.md
+++ b/doc/user/project/integrations/jira_cloud_configuration.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Create an API token in Jira on Atlassian cloud
+# Create an API token in Jira on Atlassian cloud **(FREE)**
For [integrations with Jira](jira.md), an API token is needed when integrating with Jira
on Atlassian cloud. To create an API token:
diff --git a/doc/user/project/integrations/jira_integrations.md b/doc/user/project/integrations/jira_integrations.md
index 6a1529f001a..6b938238320 100644
--- a/doc/user/project/integrations/jira_integrations.md
+++ b/doc/user/project/integrations/jira_integrations.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Jira integrations
+# Jira integrations **(FREE)**
GitLab can be integrated with [Jira](https://www.atlassian.com/software/jira).
diff --git a/doc/user/project/integrations/jira_server_configuration.md b/doc/user/project/integrations/jira_server_configuration.md
index 5bb17388a1e..b1ab2076dc0 100644
--- a/doc/user/project/integrations/jira_server_configuration.md
+++ b/doc/user/project/integrations/jira_server_configuration.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Create Jira Server username and password
+# Create Jira Server username and password **(FREE)**
For [integrations with Jira](jira.md), you must create a user account in Jira to have access to
all projects that need to integrate with GitLab.
diff --git a/doc/user/project/integrations/mattermost.md b/doc/user/project/integrations/mattermost.md
index db190f47b01..6a93fc0fb06 100644
--- a/doc/user/project/integrations/mattermost.md
+++ b/doc/user/project/integrations/mattermost.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Mattermost Notifications Service
+# Mattermost Notifications Service **(FREE)**
The Mattermost Notifications Service allows your GitLab project to send events (e.g., `issue created`) to your existing Mattermost team as notifications. This requires configurations in both Mattermost and GitLab.
diff --git a/doc/user/project/integrations/mattermost_slash_commands.md b/doc/user/project/integrations/mattermost_slash_commands.md
index 6c8a0ded2ae..20f5b73b37c 100644
--- a/doc/user/project/integrations/mattermost_slash_commands.md
+++ b/doc/user/project/integrations/mattermost_slash_commands.md
@@ -4,118 +4,121 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Mattermost slash commands
+# Mattermost slash commands **(FREE)**
-> Introduced in GitLab 8.14
+If your team uses [Mattermost](https://mattermost.com/) as a chat service, you can
+integrate GitLab commands into Mattermost chat. This integration enables users to
+run common operations, such as creating a GitLab issue, from the Mattermost chat
+environment.
-Mattermost commands give users an extra interface to perform common operations
-from the chat environment. This allows one to, for example, create an issue as
-soon as the idea was discussed in Mattermost.
-
-GitLab can also send events (e.g., `issue created`) to Mattermost as notifications.
-This is the separately configured [Mattermost Notifications Service](mattermost.md).
+GitLab can also send events (such as `issue created`) to Mattermost as part of the
+separately configured [Mattermost Notifications Service](mattermost.md).
## Prerequisites
-Mattermost 3.4 and up is required.
+Mattermost [3.4 or later](https://mattermost.com/blog/category/releases/) is required.
+GitLab provides different methods of configuring Mattermost slash commands, depending
+on your configuration:
-If you have the Omnibus GitLab package installed, Mattermost is already bundled
-in it. All you have to do is configure it. Read more in the
-[Omnibus GitLab Mattermost documentation](https://docs.gitlab.com/omnibus/gitlab-mattermost/).
+- **Omnibus GitLab installations**: Mattermost is bundled with
+ [Omnibus GitLab](https://docs.gitlab.com/omnibus/). To configure Mattermost for Omnibus GitLab, read the
+ [Omnibus GitLab Mattermost documentation](https://docs.gitlab.com/omnibus/gitlab-mattermost/).
+- **If Mattermost is installed on the same server as GitLab**, use the
+ [automated configuration](#automated-configuration).
+- **For all other installations**, use the [manual configuration](#manual-configuration).
## Automated configuration
If Mattermost is installed on the same server as GitLab, the configuration process can be
done for you by GitLab.
-Go to the Mattermost Slash Command service on your project and click the 'Add to Mattermost' button.
+Go to the Mattermost Slash Command service on your project and click **Add to Mattermost** button.
## Manual configuration
-The configuration consists of two parts. First you need to enable the slash
-commands in Mattermost and then enable the service in GitLab.
-
-### Step 1. Enable custom slash commands in Mattermost
-
-This step is only required when using a source install. Omnibus installs are
-preconfigured with the right settings.
-
-The first thing to do in Mattermost is to enable custom slash commands from
-the administrator console.
-
-1. Log in with an account that has administrator privileges and navigate to the system
- console.
-
- ![Mattermost go to console](img/mattermost_goto_console.png)
-
-1. Click **Integration Management** and set **Enable Custom Slash Commands**,
- **Enable integrations to override usernames**, and **Enable
- integrations to override profile picture icons** to true
+To manually configure slash commands in Mattermost, you must:
- ![Mattermost console](img/mattermost_console_integrations.png)
+1. [Enable custom slash commands](#enable-custom-slash-commands) in Mattermost.
+1. [Get configuration values](#get-configuration-values-from-gitlab) from GitLab.
+1. [Create a new slash command](#create-a-slash-command) in Mattermost.
+1. [Provide the Mattermost token](#provide-the-mattermost-token-to-gitlab) to GitLab.
-1. Click **Save** at the bottom to save the changes.
+### Enable custom slash commands
-### Step 2. Open the Mattermost slash commands service in GitLab
+NOTE:
+Omnibus GitLab installations are preconfigured. This step is required only for
+installations from source.
-1. Open a new tab for GitLab, go to your project's
- [Integrations page](overview.md#accessing-integrations)
- and select the **Mattermost command** service to configure it.
- A screen appears with all the values you need to copy in Mattermost as
- described in the next step. Leave the window open.
+To enable custom slash commands from the Mattermost administrator console:
- NOTE:
- GitLab offers some values for the Mattermost settings. Only **Request URL** is required
- as offered, all the others are just suggestions.
+1. Sign in to Mattermost as a user with administrator privileges.
+1. Next to your username, click the **{ellipsis_v}** **Settings** icon, and
+ select **System Console**.
+1. Select **Integration Management**, and set these values to `TRUE`:
+ - **Enable Custom Slash Commands**
+ - **Enable integrations to override usernames**
+ - **Enable integrations to override profile picture icons**
+1. Click **Save**, but do not close this browser tab, because you need it in
+ a later step.
- ![Mattermost setup instructions](img/mattermost_config_help.png)
+### Get configuration values from GitLab
-1. Proceed to the next step and create a slash command in Mattermost with the
- above values.
+After you enable custom slash commands in Mattermost, you need configuration
+information from GitLab. To get this information:
-### Step 3. Create a new custom slash command in Mattermost
+1. In a different browser tab than your current Mattermost session, sign in to
+ GitLab as a user with [administrator permissions](../../permissions.md).
+1. In the top navigation bar, go to **{admin}** **Admin Area**.
+1. In the left menu, go to **Settings > Integrations** and select
+ **Mattermost slash commands**.
+1. GitLab displays potential values for Mattermost settings. Copy the **Request URL**
+ as you need it for the next step. All other values are suggestions.
+1. Do not close this browser tab, because you need it in future steps.
-Now that you have enabled custom slash commands in Mattermost and opened
-the Mattermost slash commands service in GitLab, it's time to copy these values
-in a new slash command.
+Next, create a slash command in Mattermost with the values from GitLab.
-1. Back to Mattermost, under your team page settings, you should see the
- **Integrations** option.
+### Create a slash command
- ![Mattermost team integrations](img/mattermost_team_integrations.png)
+To create a slash command, you need the values you obtained from GitLab in
+the previous step:
-1. Go to the **Slash Commands** integration and add a new one by clicking the
- **Add Slash Command** button.
+1. In the Mattermost tab you left open when you
+ [enabled custom slash commands](#enable-custom-slash-commands), go to your
+ team page.
+1. Click the **{ellipsis_v}** **Settings** icon, and select **Integrations**.
+1. In the left menu, select **Slash commands**.
+1. Click **Add Slash Command**:
![Mattermost add command](img/mattermost_add_slash_command.png)
-
-1. Fill in the options for the custom command as described in
- [step 2](#step-2-open-the-mattermost-slash-commands-service-in-gitlab).
-
- NOTE:
- If you plan on connecting multiple projects, pick a slash command trigger
- word that relates to your projects such as `/gitlab-project-name` or even
- just `/project-name`. Only use `/gitlab` if you plan to only connect a single
- project to your Mattermost team.
-
- ![Mattermost add command configuration](img/mattermost_slash_command_configuration.png)
-
-1. After you set up all the values, copy the token (we use it below) and
- click **Done**.
-
- ![Mattermost slash command token](img/mattermost_slash_command_token.png)
-
-### Step 4. Copy the Mattermost token into the Mattermost slash command service
-
-1. In GitLab, paste the Mattermost token you copied in the previous step and
+1. Provide a **Display Name** and **Description** for your new command.
+1. Provide a **Command Trigger Word** according to your application's configuration:
+
+ - **If you intend to only connect one project to your Mattermost team**: Use
+ `/gitlab` for your trigger word.
+ - **If you intend to connect multiple projects**: Use a trigger word that relates
+ to your project, such as `/project-name` or `/gitlab-project-name`.
+1. For **Request URL**, provide the value you copied from GitLab when you
+ [viewed configuration values](#get-configuration-values-from-gitlab).
+1. For all other values, you may use the suggestions from GitLab or use your
+ preferred values.
+1. Copy the **Token** value, as you need it in a later step, and click **Done**.
+
+### Provide the Mattermost token to GitLab
+
+When you create a new slash command in Mattermost, it generates a token you must
+provide to GitLab:
+
+1. In the GitLab browser tab from
+ [getting configuration values from GitLab](#get-configuration-values-from-gitlab),
+ select the **Active** check box to enable this configuration.
+1. In the **Token** field, paste the token you obtained from Mattermost.
ensure that the **Active** toggle is enabled.
![Mattermost copy token to GitLab](img/mattermost_gitlab_token.png)
1. Click **Save changes** for the changes to take effect.
-You are now set to start using slash commands in Mattermost that talk to the
-GitLab project you configured.
+Your slash command can now communicate with your GitLab project.
## Authorizing Mattermost to interact with GitLab
@@ -132,7 +135,7 @@ GitLab using the Mattermost commands.
## Available slash commands
-The available slash commands are:
+The available slash commands for Mattermost are:
| Command | Description | Example |
| ------- | ----------- | ------- |
@@ -152,7 +155,7 @@ the [permissions you have on the project](../../permissions.md#project-members-p
## Troubleshooting
-If an event is not being triggered, confirm that the channel you're using is a public one, as
+If an event is not being triggered, confirm that the channel you're using is a public one.
Mattermost webhooks do not have access to private channels.
If a private channel is required, you can edit the webhook's channel in Mattermost and
diff --git a/doc/user/project/integrations/microsoft_teams.md b/doc/user/project/integrations/microsoft_teams.md
index 136da05d0e8..41e0938fc3b 100644
--- a/doc/user/project/integrations/microsoft_teams.md
+++ b/doc/user/project/integrations/microsoft_teams.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Microsoft Teams service
+# Microsoft Teams service **(FREE)**
## On Microsoft Teams
diff --git a/doc/user/project/integrations/mock_ci.md b/doc/user/project/integrations/mock_ci.md
index 18f0ad6b275..934510fd155 100644
--- a/doc/user/project/integrations/mock_ci.md
+++ b/doc/user/project/integrations/mock_ci.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Mock CI Service
+# Mock CI Service **(FREE)**
**NB: This service is only listed if you are in a development environment!**
diff --git a/doc/user/project/integrations/overview.md b/doc/user/project/integrations/overview.md
index b22a7c0295e..f6590b6ba2f 100644
--- a/doc/user/project/integrations/overview.md
+++ b/doc/user/project/integrations/overview.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Integrations
+# Integrations **(FREE)**
Integrations allow you to integrate GitLab with other applications. They
are a bit like plugins in that they allow a lot of freedom in adding
diff --git a/doc/user/project/integrations/prometheus_library/cloudwatch.md b/doc/user/project/integrations/prometheus_library/cloudwatch.md
index 4a88010a343..04abb922175 100644
--- a/doc/user/project/integrations/prometheus_library/cloudwatch.md
+++ b/doc/user/project/integrations/prometheus_library/cloudwatch.md
@@ -6,31 +6,38 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Monitoring AWS resources **(FREE)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/12621) in GitLab 9.4
-
-GitLab has support for automatically detecting and monitoring AWS resources, starting with the [Elastic Load Balancer](https://aws.amazon.com/elasticloadbalancing/). This is provided by leveraging the official [Cloudwatch exporter](https://github.com/prometheus/cloudwatch_exporter), which translates [Cloudwatch metrics](https://aws.amazon.com/cloudwatch/) into a Prometheus readable form.
+GitLab supports automatically detecting and monitoring AWS resources, starting
+with the [Elastic Load Balancer](https://aws.amazon.com/elasticloadbalancing/) (ELB).
+This is provided by leveraging the official [Cloudwatch exporter](https://github.com/prometheus/cloudwatch_exporter), which translates [Cloudwatch metrics](https://aws.amazon.com/cloudwatch/) into
+a Prometheus readable form.
## Requirements
-The [Prometheus service](../prometheus.md) must be enabled.
+You must enable the [Prometheus service](../prometheus.md).
-## Metrics supported
+## Supported metrics
-| Name | Query |
-| ---- | ----- |
+| Name | Query |
+|----------------------|-------|
| Throughput (req/sec) | `sum(aws_elb_request_count_sum{%{environment_filter}}) / 60` |
-| Latency (ms) | `avg(aws_elb_latency_average{%{environment_filter}}) * 1000` |
-| HTTP Error Rate (%) | `sum(aws_elb_httpcode_backend_5_xx_sum{%{environment_filter}}) / sum(aws_elb_request_count_sum{%{environment_filter}})` |
+| Latency (ms) | `avg(aws_elb_latency_average{%{environment_filter}}) * 1000` |
+| HTTP Error Rate (%) | `sum(aws_elb_httpcode_backend_5_xx_sum{%{environment_filter}}) / sum(aws_elb_request_count_sum{%{environment_filter}})` |
## Configuring Prometheus to monitor for Cloudwatch metrics
-To get started with Cloudwatch monitoring, you should install and configure the [Cloudwatch exporter](https://github.com/prometheus/cloudwatch_exporter) which retrieves and parses the specified Cloudwatch metrics and translates them into a Prometheus monitoring endpoint.
+To get started with Cloudwatch monitoring, install and configure the
+[Cloudwatch exporter](https://github.com/prometheus/cloudwatch_exporter). The
+Cloudwatch exporter retrieves and parses the specified Cloudwatch metrics, and
+translates them into a Prometheus monitoring endpoint.
-Right now, the only AWS resource supported is the Elastic Load Balancer, whose Cloudwatch metrics are [documented here](https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-cloudwatch-metrics.html).
+The only supported AWS resource is the Elastic Load Balancer, whose Cloudwatch
+metrics are [documented here](https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-cloudwatch-metrics.html).
-A sample Cloudwatch Exporter configuration file, configured for basic AWS ELB monitoring, is [available for download](../samples/cloudwatch.yml).
+You can [download a sample Cloudwatch Exporter configuration file](../samples/cloudwatch.yml)
+that's configured for basic AWS ELB monitoring.
## Specifying the Environment label
-In order to isolate and only display relevant metrics for a given environment
-however, GitLab needs a method to detect which labels are associated. To do this, GitLab [looks for an `environment` label](index.md#identifying-environments).
+To isolate and display only the relevant metrics for a given environment,
+GitLab needs a method to detect which labels are associated. To do this, GitLab
+[looks for an `environment` label](index.md#identifying-environments).
diff --git a/doc/user/project/integrations/redmine.md b/doc/user/project/integrations/redmine.md
index 38d6194b390..256ffe84ee2 100644
--- a/doc/user/project/integrations/redmine.md
+++ b/doc/user/project/integrations/redmine.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Redmine Service
+# Redmine Service **(FREE)**
1. To enable the Redmine integration in a project, navigate to the
[Integrations page](overview.md#accessing-integrations), click
diff --git a/doc/user/project/integrations/servicenow.md b/doc/user/project/integrations/servicenow.md
index 1de69f60a34..bdc05552c31 100644
--- a/doc/user/project/integrations/servicenow.md
+++ b/doc/user/project/integrations/servicenow.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# ServiceNow integration
+# ServiceNow integration **(FREE)**
ServiceNow offers several integrations to help centralize and automate your
management of GitLab workflows.
diff --git a/doc/user/project/integrations/services_templates.md b/doc/user/project/integrations/services_templates.md
index 7507792bb02..66810d8a01b 100644
--- a/doc/user/project/integrations/services_templates.md
+++ b/doc/user/project/integrations/services_templates.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Service templates
+# Service templates **(FREE)**
WARNING:
Service templates are [deprecated and scheduled to be removed](https://gitlab.com/gitlab-org/gitlab/-/issues/268032)
diff --git a/doc/user/project/integrations/slack.md b/doc/user/project/integrations/slack.md
index ab798675278..17d1c3adcb5 100644
--- a/doc/user/project/integrations/slack.md
+++ b/doc/user/project/integrations/slack.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Slack Notifications Service
+# Slack Notifications Service **(FREE)**
The Slack Notifications Service allows your GitLab project to send events
(such as issue creation) to your existing Slack team as notifications. Setting up
diff --git a/doc/user/project/integrations/unify_circuit.md b/doc/user/project/integrations/unify_circuit.md
index e8dcb577aba..3e5e368722e 100644
--- a/doc/user/project/integrations/unify_circuit.md
+++ b/doc/user/project/integrations/unify_circuit.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Unify Circuit service
+# Unify Circuit service **(FREE)**
The Unify Circuit service sends notifications from GitLab to the conversation for which the webhook was created.
diff --git a/doc/user/project/integrations/webex_teams.md b/doc/user/project/integrations/webex_teams.md
index 8a3383fd0e7..6820412808f 100644
--- a/doc/user/project/integrations/webex_teams.md
+++ b/doc/user/project/integrations/webex_teams.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Webex Teams service
+# Webex Teams service **(FREE)**
You can configure GitLab to send notifications to a Webex Teams space.
diff --git a/doc/user/project/integrations/webhooks.md b/doc/user/project/integrations/webhooks.md
index 0cf01adef13..bf289c9707c 100644
--- a/doc/user/project/integrations/webhooks.md
+++ b/doc/user/project/integrations/webhooks.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Webhooks
+# Webhooks **(FREE)**
Project webhooks allow you to trigger a percent-encoded URL if, for example, new code is pushed or
a new issue is created. You can configure webhooks to listen for specific events
@@ -1133,6 +1133,10 @@ X-Gitlab-Event: Pipeline Hook
"artifacts_file":{
"filename": null,
"size": null
+ },
+ "environment": {
+ "name": "production",
+ "action": "start"
}
},
{
@@ -1167,7 +1171,8 @@ X-Gitlab-Event: Pipeline Hook
"artifacts_file":{
"filename": null,
"size": null
- }
+ },
+ "environment": null
},
{
"id": 378,
@@ -1200,7 +1205,8 @@ X-Gitlab-Event: Pipeline Hook
"artifacts_file":{
"filename": null,
"size": null
- }
+ },
+ "environment": null
},
{
"id": 376,
@@ -1233,7 +1239,8 @@ X-Gitlab-Event: Pipeline Hook
"artifacts_file":{
"filename": null,
"size": null
- }
+ },
+ "environment": null
},
{
"id": 379,
@@ -1257,6 +1264,10 @@ X-Gitlab-Event: Pipeline Hook
"artifacts_file":{
"filename": null,
"size": null
+ },
+ "environment": {
+ "name": "staging",
+ "action": "start"
}
}
]
@@ -1329,7 +1340,8 @@ X-Gitlab-Event: Job Hook
"linux",
"docker"
]
- }
+ },
+ "environment": null
}
```
@@ -1554,7 +1566,7 @@ X-Gitlab-Event: Subgroup Hook
```
NOTE:
-Webhooks for when a [subgroup is removed from a group](#subgroup-removed-from-a-group) are not triggered when a [subgroup is transferred to a new parent group](../../group/index.md#transferring-groups)
+Webhooks for when a [subgroup is removed from a group](#subgroup-removed-from-a-group) are not triggered when a [subgroup is transferred to a new parent group](../../group/index.md#transfer-a-group)
### Feature Flag events
diff --git a/doc/user/project/integrations/youtrack.md b/doc/user/project/integrations/youtrack.md
index f9b3c083a54..f9f61de9d6b 100644
--- a/doc/user/project/integrations/youtrack.md
+++ b/doc/user/project/integrations/youtrack.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# YouTrack Service
+# YouTrack Service **(FREE)**
JetBrains [YouTrack](https://www.jetbrains.com/help/youtrack/standalone/YouTrack-Documentation.html) is a web-based issue tracking and project management platform.
diff --git a/doc/user/project/issue_board.md b/doc/user/project/issue_board.md
index e4f42b97b84..a537972dff7 100644
--- a/doc/user/project/issue_board.md
+++ b/doc/user/project/issue_board.md
@@ -87,9 +87,9 @@ To delete the currently active issue board:
You can tailor GitLab issue boards to your own preferred workflow.
Here are some common use cases for issue boards.
-For examples of using issue boards along with [epics](../group/epics/index.md) **(PREMIUM)**,
-[issue health status](issues/index.md#health-status) **(ULTIMATE)**, and
-[scoped labels](labels.md#scoped-labels) **(PREMIUM)** for various Agile frameworks, check:
+For examples of using issue boards along with [epics](../group/epics/index.md),
+[issue health status](issues/index.md#health-status), and
+[scoped labels](labels.md#scoped-labels) for various Agile frameworks, check:
- The [How to use GitLab for Agile portfolio planning and project management](https://about.gitlab.com/blog/2020/11/11/gitlab-for-agile-portfolio-planning-project-management/) blog post (November 2020)
- <i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
@@ -154,7 +154,7 @@ for them.
NOTE:
For a broader use case, please see the blog post
-[GitLab Workflow, an Overview](https://about.gitlab.com/blog/2016/10/25/gitlab-workflow-an-overview/#gitlab-workflow-use-case-scenario).
+[GitLab Workflow, an Overview](https://about.gitlab.com/topics/version-control/what-is-gitlab-workflow/#gitlab-workflow-a-use-case-scenario).
For a real use case example, you can read why
[Codepen decided to adopt issue boards](https://about.gitlab.com/blog/2017/01/27/codepen-welcome-to-gitlab/#project-management-everything-in-one-place)
to improve their workflow with multiple boards.
@@ -277,6 +277,32 @@ group and its descendant subgroups. Similarly, you can only filter by group labe
boards. When updating milestones and labels for an issue through the sidebar update mechanism, again only
group-level objects are available.
+#### GraphQL-based sidebar for group issue boards **(PREMIUM)**
+
+<!-- When the feature flag is removed, integrate this section into the above ("Group issue boards"). -->
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/285074) in GitLab 13.9.
+> - It's [deployed behind a feature flag](../feature_flags.md), disabled by default.
+> - It's disabled on GitLab.com.
+> - It's not recommended for production use.
+> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-graphql-based-sidebar-for-group-issue-boards). **(PREMIUM SELF)**
+
+WARNING:
+This feature might not be available to you. Check the **version history** note above for details.
+
+The work-in-progress GraphQL-based sidebar for group issue boards brings better performance and the
+ability to edit issue titles in the issue sidebar.
+
+To **edit an issue's title** in the issue sidebar:
+
+1. In a group issue board, select the issue card. The issue sidebar opens on the right.
+1. Next to the issue's title, select **Edit**.
+
+This is work in progress as of GitLab 13.9. Learn more about the known issues in
+[MR 51480](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/51480).
+
+<!-- Add this at the end of the file -->
+
### Assignee lists **(PREMIUM)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/5784) in [GitLab Premium](https://about.gitlab.com/pricing/) 11.0.
@@ -317,6 +343,7 @@ As in other list types, click the trash icon to remove a list.
> - Grouping by epic [introduced](https://gitlab.com/groups/gitlab-org/-/epics/3352) in [GitLab Premium](https://about.gitlab.com/pricing/) 13.6.
> - Editing issue titles in the issue sidebar [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/232745) in GitLab 13.8.
+> - Editing iteration in the issue sidebar [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/290232) in GitLab 13.9.
With swimlanes you can visualize issues grouped by epic.
Your issue board keeps all the other features, but with a different visual organization of issues.
@@ -456,31 +483,16 @@ the list by filtering by the following:
- Release
- Weight
-#### Enable or disable adding issues to the list **(FREE SELF)**
-
-Adding issues to the list is deployed behind a feature flag that is **disabled by default**.
-[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
-can enable it.
-
-To enable it:
-
-```ruby
-Feature.enable(:add_issues_button)
-```
-
-To disable it:
-
-```ruby
-Feature.disable(:add_issues_button)
-```
-
### Remove an issue from a list
-Removing an issue from a list can be done by clicking the issue card and then
-clicking the **Remove from board** button in the sidebar. The
-respective label is removed.
+> The **Remove from board** button was [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/229507) in GitLab 13.10.
+
+When an issue should no longer belong to a list, you can remove it.
+The steps depend on the scope of the list:
-![Remove issue from list](img/issue_boards_remove_issue_v13_6.png)
+1. To open the right sidebar, select the issue card.
+1. Remove what's keeping the issue in the list.
+ If it's a label list, remove the label. If it's an [assignee list](#assignee-lists), unassign the user.
### Filter issues
@@ -593,3 +605,40 @@ A few things to remember:
- For performance and visibility reasons, each list shows the first 20 issues
by default. If you have more than 20 issues, start scrolling down and the next
20 appear.
+
+## Enable or disable GraphQL-based sidebar for group issue boards **(PREMIUM SELF)**
+
+GraphQL-based sidebar for group issue boards is under development and not ready for production use.
+It is deployed behind a feature flag that is **disabled by default**.
+[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
+can enable it.
+
+To enable it:
+
+```ruby
+Feature.enable(:graphql_board_lists)
+```
+
+To disable it:
+
+```ruby
+Feature.disable(:graphql_board_lists)
+```
+
+## Enable or disable adding issues to the list **(FREE SELF)**
+
+Adding issues to the list is deployed behind a feature flag that is **disabled by default**.
+[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
+can enable it.
+
+To enable it:
+
+```ruby
+Feature.enable(:add_issues_button)
+```
+
+To disable it:
+
+```ruby
+Feature.disable(:add_issues_button)
+```
diff --git a/doc/user/project/issues/associate_zoom_meeting.md b/doc/user/project/issues/associate_zoom_meeting.md
index d81fe19c5b9..f98e94c66ae 100644
--- a/doc/user/project/issues/associate_zoom_meeting.md
+++ b/doc/user/project/issues/associate_zoom_meeting.md
@@ -17,7 +17,7 @@ team members can join swiftly without requesting a link.
## Adding a Zoom meeting to an issue
To associate a Zoom meeting with an issue, you can use GitLab
-[quick actions](../quick_actions.md#quick-actions-for-issues-merge-requests-and-epics).
+[quick actions](../quick_actions.md#issues-merge-requests-and-epics).
In an issue, leave a comment using the `/zoom` quick action followed by a valid Zoom link:
diff --git a/doc/user/project/issues/index.md b/doc/user/project/issues/index.md
index e398c6f86d0..c97196ff861 100644
--- a/doc/user/project/issues/index.md
+++ b/doc/user/project/issues/index.md
@@ -137,7 +137,7 @@ You can mark two issues as related, so that when viewing one, the other is alway
listed in its [Related Issues](related_issues.md) section. This can help display important
context, such as past work, dependencies, or duplicates.
-Users on [GitLab Starter, GitLab Bronze, and higher tiers](https://about.gitlab.com/pricing/), can
+Users of [GitLab Premium](https://about.gitlab.com/pricing/) or higher can
also mark issues as blocking or blocked by another issue.
### Crosslinking issues
@@ -162,9 +162,9 @@ Up to five similar issues, sorted by most recently updated, are displayed below
### Health status **(ULTIMATE)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/36427) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.10.
-> - Health status of closed issues [can't be edited](https://gitlab.com/gitlab-org/gitlab/-/issues/220867) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.4 and later.
-> - Issue health status visible in issue lists [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/45141) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.6.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/36427) in GitLab Ultimate 12.10.
+> - Health status of closed issues [can't be edited](https://gitlab.com/gitlab-org/gitlab/-/issues/220867) in GitLab Ultimate 13.4 and later.
+> - Issue health status visible in issue lists [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/45141) in GitLab Ultimate 13.6.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/213567) in GitLab 13.7.
To help you track issue statuses, you can assign a status to each issue.
@@ -184,7 +184,7 @@ You can then see issue statuses in the [issue list](#issues-list) and the
## Other Issue actions
-- [Create an issue from a template](../../project/description_templates.md#using-the-templates)
+- [Create an issue from a template](../../project/description_templates.md#use-the-templates)
- [Set a due date](due_dates.md)
- [Bulk edit issues](../bulk_editing.md) - From the Issues List, select multiple issues
in order to change their status, assignee, milestone, or labels in bulk.
diff --git a/doc/user/project/issues/issue_data_and_actions.md b/doc/user/project/issues/issue_data_and_actions.md
index c3adce33826..90c918792d7 100644
--- a/doc/user/project/issues/issue_data_and_actions.md
+++ b/doc/user/project/issues/issue_data_and_actions.md
@@ -186,7 +186,7 @@ This icon is only displayed if the user has permission to edit the issue.
### Description
The plain text title and description of the issue fill the top center of the issue page.
-The description fully supports [GitLab Flavored Markdown](../../markdown.md#gitlab-flavored-markdown-gfm),
+The description fully supports [GitLab Flavored Markdown](../../markdown.md#gitlab-flavored-markdown),
allowing many formatting options.
[In GitLab 12.6](https://gitlab.com/gitlab-org/gitlab/-/issues/10103) and later, changes to an
@@ -249,7 +249,7 @@ Also:
### Create Merge Request
-Create a new branch and [**Draft** merge request](../merge_requests/work_in_progress_merge_requests.md)
+Create a new branch and [**Draft** merge request](../merge_requests/drafts.md)
in one action. The branch is named `issuenumber-title` by default, but you can
choose any name, and GitLab verifies that it is not already in use. The merge request
inherits the milestone and labels of the issue, and is set to automatically
@@ -281,7 +281,7 @@ or newest items to be shown first.
### Comments
Collaborate in the issue by posting comments in its thread. This text field also fully
-supports [GitLab Flavored Markdown](../../markdown.md#gitlab-flavored-markdown-gfm).
+supports [GitLab Flavored Markdown](../../markdown.md#gitlab-flavored-markdown).
### Submit comment, start a thread, or comment and close
@@ -301,7 +301,7 @@ You can also close the issue from here, so you don't need to scroll to the top o
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/31103) in GitLab 12.3.
You can attach and remove Zoom meetings to issues using the `/zoom` and `/remove_zoom` [quick actions](../quick_actions.md) as part of
-[GitLab Flavored Markdown](../../markdown.md#gitlab-flavored-markdown-gfm).
+[GitLab Flavored Markdown](../../markdown.md#gitlab-flavored-markdown).
Attaching a [Zoom](https://zoom.us) call an issue
results in a **Join Zoom meeting** button at the top of the issue, just under the header.
diff --git a/doc/user/project/issues/managing_issues.md b/doc/user/project/issues/managing_issues.md
index f1739726cf8..cfb22881431 100644
--- a/doc/user/project/issues/managing_issues.md
+++ b/doc/user/project/issues/managing_issues.md
@@ -298,7 +298,7 @@ To promote an issue to an epic:
1. In an issue, select the vertical ellipsis (**{ellipsis_v}**) button.
1. Select **Promote to epic**.
-Alternatively, you can use the `/promote` [quick action](../quick_actions.md#quick-actions-for-issues-merge-requests-and-epics).
+Alternatively, you can use the `/promote` [quick action](../quick_actions.md#issues-merge-requests-and-epics).
Read more about promoting an issue to an epic on the [Manage epics page](../../group/epics/manage_epics.md#promote-an-issue-to-an-epic).
@@ -313,5 +313,5 @@ To add an issue to an [iteration](../../group/iterations/index.md):
1. Click an iteration you'd like to associate this issue with.
You can also use the `/iteration`
-[quick action](../quick_actions.md#quick-actions-for-issues-merge-requests-and-epics)
+[quick action](../quick_actions.md#issues-merge-requests-and-epics)
in a comment or description field.
diff --git a/doc/user/project/members/img/project_members_filter_v12_6.png b/doc/user/project/members/img/project_members_filter_v12_6.png
deleted file mode 100644
index 692fdfe00a1..00000000000
--- a/doc/user/project/members/img/project_members_filter_v12_6.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/members/index.md b/doc/user/project/members/index.md
index 00474098487..057c2930706 100644
--- a/doc/user/project/members/index.md
+++ b/doc/user/project/members/index.md
@@ -37,10 +37,7 @@ From the image above, we can deduce the following things:
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/21727) in GitLab 12.6.
> - [Improved](https://gitlab.com/groups/gitlab-org/-/epics/4901) in GitLab 13.9.
-> - Improvements are [deployed behind a feature flag](../../feature_flags.md), enabled by default.
-> - Improvements are enabled on GitLab.com.
-> - Improvements are recommended for production use.
-> - For GitLab self-managed instances, GitLab administrators can opt to [disable improvements](#enable-or-disable-improvements-to-project-member-management). **(FREE SELF)**
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/299954) in GitLab 13.10.
The following sections illustrate how you can filter and sort members in a project. To view these options,
navigate to your desired project, go to **Members**, and include the noted search terms.
@@ -199,27 +196,3 @@ To remove a member from a project:
A **Remove member** modal appears.
1. (Optional) Select the **Also unassign this user from related issues and merge requests** checkbox.
1. Click **Remove member**.
-
-## Enable or disable improvements to project member management **(FREE SELF)**
-
-Project member management improvements are 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 the improvements.
-
-To disable them:
-
-```ruby
-# For the instance
-Feature.disable(:vue_project_members_list)
-# For a single project
-Feature.disable(:vue_project_members_list, Project.find(<project id>))
-```
-
-To enable them:
-
-```ruby
-# For the instance
-Feature.enable(:vue_project_members_list)
-# For a single project
-Feature.enable(:vue_project_members_list, Project.find(<project id>))
-```
diff --git a/doc/user/project/members/share_project_with_groups.md b/doc/user/project/members/share_project_with_groups.md
index 7000988d9bf..8ca403783cb 100644
--- a/doc/user/project/members/share_project_with_groups.md
+++ b/doc/user/project/members/share_project_with_groups.md
@@ -62,4 +62,4 @@ It is possible to prevent projects in a group from [sharing
a project with another group](../members/share_project_with_groups.md).
This allows for tighter control over project access.
-Learn more about [Share with group lock](../../group/index.md#share-with-group-lock).
+Learn more about [Share with group lock](../../group/index.md#prevent-a-project-from-being-shared-with-groups).
diff --git a/doc/user/project/merge_requests/allow_collaboration.md b/doc/user/project/merge_requests/allow_collaboration.md
index 7aa7673366d..5917d67c398 100644
--- a/doc/user/project/merge_requests/allow_collaboration.md
+++ b/doc/user/project/merge_requests/allow_collaboration.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+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
type: reference, howto
---
@@ -18,15 +18,15 @@ This feature is available for merge requests across forked projects that are
publicly accessible.
When enabled for a merge request, members with merge access to the target
-branch of the project will be granted write permissions to the source branch
+branch of the project is granted write permissions to the source branch
of the merge request.
## Enabling commit edits from upstream members
In [GitLab 13.7 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/23308),
this setting is enabled by default. It can be changed by users with Developer
-permissions to the source project. Once enabled, upstream members will also be
-able to retry the pipelines and jobs of the merge request:
+permissions to the source project. Once enabled, upstream members can
+retry the pipelines and jobs of the merge request:
1. While creating or editing a merge request, select the checkbox **Allow
commits from members who can merge to the target branch**.
@@ -64,7 +64,7 @@ Here's how the process would look like:
git checkout -b thedude-awesome-project-update-docs FETCH_HEAD
```
- This will fetch the branch of the forked project and then create a local branch
+ This fetches the branch of the forked project and then create a local branch
based off the fetched branch.
1. Make any changes you want and commit.
@@ -74,7 +74,7 @@ Here's how the process would look like:
git push git@gitlab.com:thedude/awesome-project.git thedude-awesome-project-update-docs:update-docs
```
- Note the colon (`:`) between the two branches. The above command will push the
+ Note the colon (`:`) between the two branches. The above command pushes the
local branch `thedude-awesome-project-update-docs` to the
`update-docs` branch of the `git@gitlab.com:thedude/awesome-project.git` repository.
diff --git a/doc/user/project/merge_requests/authorization_for_merge_requests.md b/doc/user/project/merge_requests/authorization_for_merge_requests.md
index 36481ac0133..aa43d34cdd9 100644
--- a/doc/user/project/merge_requests/authorization_for_merge_requests.md
+++ b/doc/user/project/merge_requests/authorization_for_merge_requests.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+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
type: concepts
---
diff --git a/doc/user/project/merge_requests/browser_performance_testing.md b/doc/user/project/merge_requests/browser_performance_testing.md
index 6fa2340c7a4..7a869ed071a 100644
--- a/doc/user/project/merge_requests/browser_performance_testing.md
+++ b/doc/user/project/merge_requests/browser_performance_testing.md
@@ -13,6 +13,9 @@ If your application offers a web interface and you're using
[GitLab CI/CD](../../../ci/README.md), you can quickly determine the rendering performance
impact of pending code changes in the browser.
+NOTE:
+You can automate this feature in your applications by using [Auto DevOps](../../../topics/autodevops/index.md).
+
## Overview
GitLab uses [Sitespeed.io](https://www.sitespeed.io), a free and open source
@@ -90,7 +93,7 @@ that you can later download and analyze. This implementation always takes the la
Browser Performance artifact available. If [GitLab Pages](../pages/index.md) is enabled,
you can view the report directly in your browser.
-You can also customize the jobs with environment variables:
+You can also customize the jobs with CI/CD variables:
- `SITESPEED_IMAGE`: Configure the Docker image to use for the job (default `sitespeedio/sitespeed.io`), but not the image version.
- `SITESPEED_VERSION`: Configure the version of the Docker image to use for the job (default `14.1.0`).
@@ -115,7 +118,7 @@ performance:
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/27599) in GitLab 13.0.
You can configure the sensitivity of degradation alerts to avoid getting alerts for minor drops in metrics.
-This is done by setting the `DEGRADATION_THRESHOLD` variable. In the example below, the alert only shows up
+This is done by setting the `DEGRADATION_THRESHOLD` CI/CD variable. In the example below, the alert only shows up
if the `Total Score` metric degrades by 5 points or more:
```yaml
@@ -186,7 +189,7 @@ GitLab version:
- In GitLab 12.4 [a job template was made available](https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Verify/Browser-Performance.gitlab-ci.yml).
- In 13.2 the feature was renamed from `Performance` to `Browser Performance` with
-additional template variables. The job name in the template is still `performance`
+additional template CI/CD variables. The job name in the template is still `performance`
for compatibility reasons, but may be renamed to match in a future iteration.
- For 11.5 to 12.3 no template is available and the job has to be defined manually as follows:
diff --git a/doc/user/project/merge_requests/code_quality.md b/doc/user/project/merge_requests/code_quality.md
index 55dc0bcc41a..42c2547a618 100644
--- a/doc/user/project/merge_requests/code_quality.md
+++ b/doc/user/project/merge_requests/code_quality.md
@@ -22,8 +22,7 @@ Code Quality:
[GitLab Code
Quality](https://gitlab.com/gitlab-org/ci-cd/codequality) project using [default Code Climate configurations](https://gitlab.com/gitlab-org/ci-cd/codequality/-/tree/master/codeclimate_defaults).
- Can make use of a [template](#example-configuration).
-- Is available with [Auto
- DevOps](../../../topics/autodevops/stages.md#auto-code-quality).
+- Is available by using [Auto Code Quality](../../../topics/autodevops/stages.md#auto-code-quality), provided by [Auto DevOps](../../../topics/autodevops/index.md).
- Can be extended through [Analysis Plugins](https://docs.codeclimate.com/docs/list-of-engines) or a [custom tool](#implementing-a-custom-tool).
## Code Quality Widget
@@ -90,7 +89,7 @@ scans your source code for code quality issues. The report is saved as a
that you can later download and analyze.
It's also possible to override the URL to the Code Quality image by
-setting the `CODE_QUALITY_IMAGE` variable. This is particularly useful if you want
+setting the `CODE_QUALITY_IMAGE` CI/CD variable. This is particularly useful if you want
to lock in a specific version of Code Quality, or use a fork of it:
```yaml
@@ -236,12 +235,12 @@ was chosen as an operational decision by the runner team, instead of exposing `d
### Disabling the code quality job
-The `code_quality` job doesn't run if the `$CODE_QUALITY_DISABLED` environment
-variable is present. Please refer to the environment variables [documentation](../../../ci/variables/README.md)
+The `code_quality` job doesn't run if the `$CODE_QUALITY_DISABLED` CI/CD variable
+is present. Please refer to the CI/CD variables [documentation](../../../ci/variables/README.md)
to learn more about how to define one.
-To disable the `code_quality` job, add `CODE_QUALITY_DISABLED` as a custom environment
-variable. This can be done:
+To disable the `code_quality` job, add `CODE_QUALITY_DISABLED` as a custom CI/CD variable.
+This can be done:
- For the whole project, [in the project settings](../../../ci/variables/README.md#create-a-custom-variable-in-the-ui)
or [CI/CD configuration](../../../ci/variables/README.md#create-a-custom-variable-in-the-ui).
@@ -268,7 +267,7 @@ code_quality:
- if: '$CI_COMMIT_TAG || $CI_COMMIT_BRANCH'
```
-If you are using merge request pipelines, your `rules` (or [`workflow: rules`](../../../ci/yaml/README.md#workflowrules))
+If you are using merge request pipelines, your `rules` (or [`workflow: rules`](../../../ci/yaml/README.md#workflow))
might look like this example:
```yaml
@@ -365,7 +364,7 @@ After the Code Quality job completes:
In [GitLab 13.6 and later](https://gitlab.com/gitlab-org/ci-cd/codequality/-/issues/10),
it is possible to generate an HTML report file by setting the `REPORT_FORMAT`
-variable to `html`. This is useful if you just want to view the report in a more
+CI/CD variable to `html`. This is useful if you just want to view the report in a more
human-readable format or to publish this artifact on GitLab Pages for even
easier reviewing.
@@ -509,6 +508,7 @@ This can be due to multiple reasons:
nothing is displayed.
- The [`artifacts:expire_in`](../../../ci/yaml/README.md#artifactsexpire_in) CI/CD
setting can cause the Code Quality artifact(s) to expire faster than desired.
+- The widgets use the pipeline of the latest commit to the target branch. If commits are made to the default branch that do not run the code quality job, this may cause the Merge Request widget to have no base report for comparison.
- If you use the [`REPORT_STDOUT` environment variable](https://gitlab.com/gitlab-org/ci-cd/codequality#environment-variables), no report file is generated and nothing displays in the merge request.
- Large `gl-code-quality-report.json` files (esp. >10 MB) are [known to prevent the report from being displayed](https://gitlab.com/gitlab-org/gitlab/-/issues/2737).
As a work-around, try removing [properties](https://github.com/codeclimate/platform/blob/master/spec/analyzers/SPEC.md#data-types)
diff --git a/doc/user/project/merge_requests/creating_merge_requests.md b/doc/user/project/merge_requests/creating_merge_requests.md
index 5cfedc6c9f1..58e80504212 100644
--- a/doc/user/project/merge_requests/creating_merge_requests.md
+++ b/doc/user/project/merge_requests/creating_merge_requests.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+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
type: howto
description: "How to create Merge Requests in GitLab."
@@ -30,11 +30,16 @@ button and start a merge request from there.
## New Merge Request page
-On the **New Merge Request** page, start by filling in the title
-and description for the merge request. If there are already
-commits on the branch, the title is prefilled with the first
-line of the first commit message, and the description is
-prefilled with any additional lines in the commit message.
+On the **New Merge Request** page, start by filling in the title and description
+for the merge request. If commits already exist on the branch, GitLab suggests a
+merge request title for you:
+
+- **If a multi-line commit message exists**: GitLab adds the first line of the
+ first multi-line commit message as the title. Any additional lines in that
+ commit message become the description.
+- **If no multi-line commit message exists**: GitLab adds the branch name as the
+ title, and leaves the description blank.
+
The title is the only field that is mandatory in all cases.
From there, you can fill it with information (title, description,
diff --git a/doc/user/project/merge_requests/drafts.md b/doc/user/project/merge_requests/drafts.md
new file mode 100644
index 00000000000..a030961e219
--- /dev/null
+++ b/doc/user/project/merge_requests/drafts.md
@@ -0,0 +1,99 @@
+---
+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
+type: reference, concepts
+disqus_identifier: 'https://docs.gitlab.com/ee/user/project/merge_requests/work_in_progress_merge_requests.html'
+---
+
+# Draft merge requests **(FREE)**
+
+If a merge request isn't ready to merge, potentially because of continued development
+or open threads, you can prevent it from being accepted before you
+[mark it as ready](#mark-merge-requests-as-ready). Flag it as a draft to disable
+the **Merge** button until you remove the **Draft** flag:
+
+![Blocked Merge Button](img/draft_blocked_merge_button_v13_10.png)
+
+## Mark merge requests as drafts
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/32692) in GitLab 13.2, Work-In-Progress (WIP) merge requests were renamed to **Draft**. Support for using **WIP** is scheduled for removal in GitLab 14.0.
+> - **Mark as draft** and **Mark as ready** buttons [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/227421) in GitLab 13.5.
+
+There are several ways to flag a merge request as a draft:
+
+- **Viewing a merge request**: In the top right corner of the merge request, click **Mark as draft**.
+- **Creating or editing a merge request**: Add `[Draft]`, `Draft:` or `(Draft)` to
+ the beginning of the merge request's title, or click **Start the title with Draft:**
+ below the **Title** field.
+- **Commenting in an existing merge request**: Add the `/draft`
+ [quick action](../quick_actions.md#issues-merge-requests-and-epics)
+ in a comment. This quick action is a toggle, and can be repeated to change the status
+ again. This quick action discards any other text in the comment.
+- **Creating a commit**: Add `draft:`, `Draft:`, `fixup!`, or `Fixup!` to the
+ beginning of a commit message targeting the merge request's source branch. This
+ is not a toggle, and adding this text again in a later commit doesn't mark the
+ merge request as ready.
+
+WARNING:
+Adding `WIP:` to the start of the merge request's title still marks a merge request
+as a draft. This feature is scheduled for removal in GitLab 14.0. Use `Draft:` instead.
+
+## Mark merge requests as ready
+
+When a merge request is ready to be merged, you can remove the `Draft` flag in several ways:
+
+- **Viewing a merge request**: In the top right corner of the merge request, click **Mark as ready**.
+ Users with [Developer or greater permissions](../../permissions.md)
+ can also scroll to the bottom of the merge request description and click **Mark as ready**:
+
+ ![Mark as ready](img/draft_blocked_merge_button_v13_10.png)
+
+- **Editing an existing merge request**: Remove `[Draft]`, `Draft:` or `(Draft)`
+ from the beginning of the title, or click **Remove the Draft: prefix from the title**
+ below the **Title** field.
+- **Commenting in an existing merge request**: Add the `/draft`
+ [quick action](../quick_actions.md#issues-merge-requests-and-epics)
+ in a comment in the merge request. This quick action is a toggle, and can be repeated
+ to change the status back. This quick action discards any other text in the comment.
+
+In [GitLab 13.10 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/15332),
+when you mark a merge request as ready, notifications are triggered to
+[merge request participants and watchers](../../profile/notifications.md#notifications-on-issues-merge-requests-and-epics).
+
+## Include or exclude drafts when searching
+
+When viewing or searching in your project's merge requests list, you can include or exclude
+draft merge requests:
+
+1. In your project, select **Merge Requests** from the left sidebar.
+1. In the navigation bar, click **Open**, **Merged**, **Closed**, or **All** to
+ filter by merge request status.
+1. Click the search box to display a list of filters and select **Draft**, or
+ enter the word `draft`.
+1. Select `=`.
+1. Select **Yes** to include drafts, or **No** to exclude, and press **Return**
+ to update the list of merge requests:
+
+ ![Filter draft merge requests](img/filter_draft_merge_requests_v13_10.png)
+
+## Pipelines for drafts
+
+When the [pipelines for merged results](../../../ci/merge_request_pipelines/pipelines_for_merged_results/index.md)
+feature is enabled, draft merge requests run
+[merge request pipelines](../../../ci/merge_request_pipelines/index.md) only.
+
+To run pipelines for merged results, you must
+[mark the merge request as ready](#mark-merge-requests-as-ready).
+
+<!-- ## 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/project/merge_requests/fast_forward_merge.md b/doc/user/project/merge_requests/fast_forward_merge.md
index c4a34f9c65c..b1e8d761f5c 100644
--- a/doc/user/project/merge_requests/fast_forward_merge.md
+++ b/doc/user/project/merge_requests/fast_forward_merge.md
@@ -17,7 +17,7 @@ to accept merge requests without creating merge commits.
When the fast-forward merge
([`--ff-only`](https://git-scm.com/docs/git-merge#git-merge---ff-only)) setting
-is enabled, no merge commits will be created and all merges are fast-forwarded,
+is enabled, no merge commits are created and all merges are fast-forwarded,
which means that merging is only allowed if the branch can be fast-forwarded.
When a fast-forward merge is not possible, the user is given the option to rebase.
@@ -28,19 +28,19 @@ When a fast-forward merge is not possible, the user is given the option to rebas
1. Select the **Fast-forward merge** option
1. Hit **Save changes** for the changes to take effect
-Now, when you visit the merge request page, you will be able to accept it
+Now, when you visit the merge request page, you can accept it
**only if a fast-forward merge is possible**.
![Fast forward merge request](img/ff_merge_mr.png)
If a fast-forward merge is not possible but a conflict free rebase is possible,
-a rebase button will be offered.
+a rebase button is offered.
![Fast forward merge request](img/ff_merge_rebase.png)
If the target branch is ahead of the source branch and a conflict free rebase is
not possible, you need to rebase the
-source branch locally before you will be able to do a fast-forward merge.
+source branch locally before you can do a fast-forward merge.
![Fast forward merge rebase locally](img/ff_merge_rebase_locally.png)
diff --git a/doc/user/project/merge_requests/getting_started.md b/doc/user/project/merge_requests/getting_started.md
index b1a57d9c3e6..f25228729cf 100644
--- a/doc/user/project/merge_requests/getting_started.md
+++ b/doc/user/project/merge_requests/getting_started.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+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
type: index, reference
description: "Getting started with Merge Requests."
@@ -60,7 +60,7 @@ request's page at the top-right side:
- [Close issues automatically](#merge-requests-to-close-issues) when they are merged.
- Enable the [delete source branch when merge request is accepted](#deleting-the-source-branch) option to keep your repository clean.
- Enable the [squash commits when merge request is accepted](squash_and_merge.md) option to combine all the commits into one before merging, thus keep a clean commit history in your repository.
-- Set the merge request as a [**Draft**](work_in_progress_merge_requests.md) to avoid accidental merges before it is ready.
+- Set the merge request as a [**Draft**](drafts.md) to avoid accidental merges before it is ready.
After you have created the merge request, you can also:
@@ -84,7 +84,7 @@ See also other [features associated to merge requests](reviewing_and_managing_me
Choose an assignee to designate someone as the person responsible
for the first [review of the merge request](reviewing_and_managing_merge_requests.md).
Open the drop down box to search for the user you wish to assign,
-and the merge request will be added to their
+and the merge request is added to their
[assigned merge request list](../../search/index.md#issues-and-merge-requests).
#### Multiple assignees **(PREMIUM)**
@@ -110,7 +110,7 @@ dropdown menu.
It is also possible to manage multiple assignees:
- When creating a merge request.
-- Using [quick actions](../quick_actions.md#quick-actions-for-issues-merge-requests-and-epics).
+- Using [quick actions](../quick_actions.md#issues-merge-requests-and-epics).
### Reviewer
@@ -122,17 +122,19 @@ Requesting a code review is an important part of contributing code. However, dec
your code and asking for a review are no easy tasks. Using the "assignee" field for both authors and
reviewers makes it hard for others to determine who's doing what on a merge request.
-GitLab Merge Request Reviewers easily allow authors to request a review as well as see the status of the
-review. By selecting one or more users from the **Reviewers** field in the merge request's right-hand
-sidebar, the assigned reviewers will receive a notification of the request to review the merge request.
+The Merge Request Reviewers feature enables you to request a review of your work, and
+see the status of the review. Reviewers help distinguish the roles of the users
+involved in the merge request. In comparison to an **Assignee**, who is directly
+responsible for creating or merging a merge request, a **Reviewer** is a team member
+who may only be involved in one aspect of the merge request, such as a peer review.
-This makes it easy to determine the relevant roles for the users involved in the merge request, as well as formally requesting a review from a peer.
-
-To request it, open the **Reviewers** drop-down box to search for the user you wish to get a review from.
+To request a review of a merge request, expand the **Reviewers** select box in
+the right-hand sidebar. Search for the users you want to request a review from.
+When selected, GitLab creates a [to-do list item](../../todos.md) for each reviewer.
#### Approval Rule information for Reviewers **(PREMIUM)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/233736) in GitLab 13.8. For this version only, GitLab administrators can opt to [enable it](#enable-or-disable-approval-rule-information).
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/233736) in GitLab 13.8.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/293742) in GitLab 13.9.
When editing the **Reviewers** field in a new or existing merge request, GitLab
@@ -162,6 +164,13 @@ the author of the merge request can request a new review from the reviewer:
GitLab creates a new [to-do item](../../todos.md) for the reviewer, and sends
them a notification email.
+#### Approval status
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/292936) in GitLab 13.10.
+
+If a user in the reviewer list has approved the merge request, a green tick symbol is
+shown to the right of their name.
+
### Merge requests to close issues
If the merge request is being created to resolve an issue, you can
@@ -198,9 +207,9 @@ is set for deletion, the merge request widget displays the
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/320902) in GitLab 13.9.
> - It's [deployed behind a feature flag](../../feature_flags.md), disabled by default.
-> - It's disabled on GitLab.com.
-> - It's not recommended for production use.
-> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-branch-retargeting-on-merge).
+> - [Became enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/320895) on GitLab 13.10.
+> - It's recommended for production use.
+> - To use it in GitLab self-managed instances, ask a GitLab administrator to [disable it](#enable-or-disable-branch-retargeting-on-merge). **(FREE SELF)**
In specific circumstances, GitLab can retarget the destination branch of
open merge request, if the destination branch merges while the merge request is
@@ -221,6 +230,12 @@ GitLab retargets up to four merge requests when their target branch is merged in
`master`, so you don't need to perform this operation manually. Merge requests from
forks are not retargeted.
+The feature today works only one a merge. Clicking the `Remove source branch` button
+after the merge request was merged will not automatically retarget merge request.
+The feature today works only on merge. Clicking the **Remove source branch** button
+after the merge request was merged will not automatically retarget a merge request.
+This improvement is [tracked as a follow-up](https://gitlab.com/gitlab-org/gitlab/-/issues/321559).
+
## Recommendations and best practices for Merge Requests
- When working locally in your branch, add multiple commits and only push when
@@ -231,33 +246,6 @@ forks are not retargeted.
reviews are faster and your changes are less prone to errors.
- Do not use capital letters nor special chars in branch names.
-## Enable or disable Approval Rule information **(PREMIUM SELF)**
-
-> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/293742) in GitLab 13.9.
-
-Merge Request Reviewers is under development and ready for production use.
-It is deployed behind a feature flag that is **enabled by default**.
-[GitLab administrators with access to the GitLab Rails console](../../../administration/feature_flags.md)
-can opt to disable it.
-
-To enable it:
-
-```ruby
-# For the instance
-Feature.enable(:reviewer_approval_rules)
-# For a single project
-Feature.enable(:reviewer_approval_rules, Project.find(<project id>))
-```
-
-To disable it:
-
-```ruby
-# For the instance
-Feature.disable(:reviewer_approval_rules)
-# For a single project
-Feature.disable(:reviewer_approval_rules, Project.find(<project id>))
-```
-
### Enable or disable branch retargeting on merge **(FREE SELF)**
Automatically retargeting merge requests is under development but ready for production use.
diff --git a/doc/user/project/merge_requests/img/comment-on-any-diff-line.png b/doc/user/project/merge_requests/img/comment-on-any-diff-line.png
deleted file mode 100644
index cff5acb98ef..00000000000
--- a/doc/user/project/merge_requests/img/comment-on-any-diff-line.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/merge_requests/img/comment-on-any-diff-line_v13_10.png b/doc/user/project/merge_requests/img/comment-on-any-diff-line_v13_10.png
new file mode 100644
index 00000000000..a31fea85be9
--- /dev/null
+++ b/doc/user/project/merge_requests/img/comment-on-any-diff-line_v13_10.png
Binary files differ
diff --git a/doc/user/project/merge_requests/img/draft_blocked_merge_button_v13_10.png b/doc/user/project/merge_requests/img/draft_blocked_merge_button_v13_10.png
new file mode 100644
index 00000000000..3bac9f7fee8
--- /dev/null
+++ b/doc/user/project/merge_requests/img/draft_blocked_merge_button_v13_10.png
Binary files differ
diff --git a/doc/user/project/merge_requests/img/draft_blocked_merge_button_v13_2.png b/doc/user/project/merge_requests/img/draft_blocked_merge_button_v13_2.png
deleted file mode 100644
index f7968772500..00000000000
--- a/doc/user/project/merge_requests/img/draft_blocked_merge_button_v13_2.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/merge_requests/img/filter_draft_merge_requests_v13_10.png b/doc/user/project/merge_requests/img/filter_draft_merge_requests_v13_10.png
new file mode 100644
index 00000000000..4458df987d6
--- /dev/null
+++ b/doc/user/project/merge_requests/img/filter_draft_merge_requests_v13_10.png
Binary files differ
diff --git a/doc/user/project/merge_requests/img/filter_wip_merge_requests.png b/doc/user/project/merge_requests/img/filter_wip_merge_requests.png
deleted file mode 100644
index 0989b41e2a4..00000000000
--- a/doc/user/project/merge_requests/img/filter_wip_merge_requests.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/merge_requests/img/multiline-comment-highlighted.png b/doc/user/project/merge_requests/img/multiline-comment-highlighted.png
deleted file mode 100644
index 1bdcc37e274..00000000000
--- a/doc/user/project/merge_requests/img/multiline-comment-highlighted.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/merge_requests/img/scoped_to_protected_branch_v12_8.png b/doc/user/project/merge_requests/img/scoped_to_protected_branch_v12_8.png
deleted file mode 100644
index 9446ed66c38..00000000000
--- a/doc/user/project/merge_requests/img/scoped_to_protected_branch_v12_8.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/merge_requests/img/scoped_to_protected_branch_v13_10.png b/doc/user/project/merge_requests/img/scoped_to_protected_branch_v13_10.png
new file mode 100644
index 00000000000..b1c2e147134
--- /dev/null
+++ b/doc/user/project/merge_requests/img/scoped_to_protected_branch_v13_10.png
Binary files differ
diff --git a/doc/user/project/merge_requests/img/update_approval_rule_v13_10.png b/doc/user/project/merge_requests/img/update_approval_rule_v13_10.png
new file mode 100644
index 00000000000..c0cc0db600c
--- /dev/null
+++ b/doc/user/project/merge_requests/img/update_approval_rule_v13_10.png
Binary files differ
diff --git a/doc/user/project/merge_requests/img/update_approval_rule_v13_4.png b/doc/user/project/merge_requests/img/update_approval_rule_v13_4.png
deleted file mode 100644
index af713b48140..00000000000
--- a/doc/user/project/merge_requests/img/update_approval_rule_v13_4.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/merge_requests/index.md b/doc/user/project/merge_requests/index.md
index 8ccf50e48b8..99e0193d496 100644
--- a/doc/user/project/merge_requests/index.md
+++ b/doc/user/project/merge_requests/index.md
@@ -1,16 +1,29 @@
---
stage: Create
-group: Source Code
+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
type: index, reference
---
# Merge requests **(FREE)**
-A Merge Request (**MR**) is a _request_ to _merge_ one branch into another.
+Whenever you need to merge one branch into another branch with GitLab, you
+must create a merge request (MR).
-Use merge requests to visualize and collaborate on proposed changes
-to source code.
+Using merge requests, you can visualize and collaborate on proposed changes to
+source code. Merge requests display information about the proposed code changes,
+including:
+
+- A description of the request.
+- Code changes and inline code reviews.
+- Information about CI/CD pipelines.
+- A comment section for discussion threads.
+- The list of commits.
+
+Based on your workflow, after review you can merge a merge request into its
+target branch.
+
+To get started, read the [introduction to merge requests](getting_started.md).
## Use cases
@@ -36,21 +49,9 @@ B. Consider you're a web developer writing a webpage for your company's website:
1. Your changes are previewed with [Review Apps](../../../ci/review_apps/index.md)
1. You request your web designers for their implementation
1. You request the [approval](merge_request_approvals.md) from your manager **(STARTER)**
-1. Once approved, your merge request is [squashed and merged](squash_and_merge.md), and [deployed to staging with GitLab Pages](https://about.gitlab.com/blog/2016/08/26/ci-deployment-and-environments/)
+1. Once approved, your merge request is [squashed and merged](squash_and_merge.md), and [deployed to staging with GitLab Pages](https://about.gitlab.com/blog/2021/02/05/ci-deployment-and-environments/)
1. Your production team [cherry picks](cherry_pick_changes.md) the merge commit into production
-## Overview
-
-Merge requests (aka "MRs") display a great deal of information about the changes proposed.
-The body of an MR contains its description, along with its widget (displaying information
-about CI/CD pipelines, when present), followed by the discussion threads of the people
-collaborating with that MR.
-
-MRs also contain navigation tabs from which you can see the discussion happening on the thread,
-the list of commits, the list of pipelines and jobs, the code changes, and inline code reviews.
-
-To get started, read the [introduction to merge requests](getting_started.md).
-
## Merge request navigation tabs at the top
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/33813) in GitLab 12.6. This positioning is experimental.
diff --git a/doc/user/project/merge_requests/load_performance_testing.md b/doc/user/project/merge_requests/load_performance_testing.md
index 9154897d42d..e8062fadcfe 100644
--- a/doc/user/project/merge_requests/load_performance_testing.md
+++ b/doc/user/project/merge_requests/load_performance_testing.md
@@ -104,8 +104,8 @@ An example configuration workflow:
1. Set up GitLab Runner to run Docker containers, like the
[Docker-in-Docker workflow](../../../ci/docker/using_docker_build.md#use-the-docker-executor-with-the-docker-image-docker-in-docker).
-1. Configure the default Load Performance Testing CI job in your `.gitlab-ci.yml` file.
- You need to include the template and configure it with variables:
+1. Configure the default Load Performance Testing CI/CD job in your `.gitlab-ci.yml` file.
+ You need to include the template and configure it with CI/CD variables:
```yaml
include:
@@ -153,7 +153,7 @@ but it can be extended to work with [review apps](../../../ci/review_apps) or
[dynamic environments](../../../ci/environments) with a few extra steps.
The best approach is to capture the dynamic URL in a [`.env` file](https://docs.docker.com/compose/env-file/)
-as a job artifact to be shared, then use a custom environment variable we've provided named `K6_DOCKER_OPTIONS`
+as a job artifact to be shared, then use a custom CI/CD variable we've provided named `K6_DOCKER_OPTIONS`
to configure the k6 Docker container to use the file. With this, k6 can then use any
environment variables from the `.env` file in scripts using standard JavaScript,
such as: ``http.get(`${__ENV.ENVIRONMENT_URL}`)``.
diff --git a/doc/user/project/merge_requests/merge_request_approvals.md b/doc/user/project/merge_requests/merge_request_approvals.md
index 1fcc09a9d8a..3d3e04842f8 100644
--- a/doc/user/project/merge_requests/merge_request_approvals.md
+++ b/doc/user/project/merge_requests/merge_request_approvals.md
@@ -79,7 +79,8 @@ An individual user can be added as an approver for a project if they are a membe
- The project's immediate parent group.
- A group that has access to the project via a [share](../members/share_project_with_groups.md).
-A group of users can also be added as approvers. In the future, group approvers may be
+A group of users can also be added as approvers, though they only count as approvers if
+they have direct membership to the group. In the future, group approvers may be
[restricted to only groups with share access to the project](https://gitlab.com/gitlab-org/gitlab/-/issues/2048).
If a user is added as an individual approver and is also part of a group approver,
@@ -138,17 +139,17 @@ to push or merge code to any branches.
To enable this access:
-1. [Create a new group](../../group/index.md#create-a-new-group), and then
+1. [Create a new group](../../group/index.md#create-a-group), and then
[add the user to the group](../../group/index.md#add-users-to-a-group),
ensuring you select the Reporter role for the user.
1. [Share the project with your group](../members/share_project_with_groups.md#sharing-a-project-with-a-group-of-users),
based on the Reporter role.
1. Navigate to your project's **Settings > General**, and in the
**Merge request approvals** section, click **Expand**.
-1. [Add the group](../../group/index.md#create-a-new-group) to the permission list
- for the protected branch.
+1. Select **Add approval rule** or **Update approval rule**.
+1. [Add the group](../../group/index.md#create-a-group) to the permission list.
-![Update approval rule](img/update_approval_rule_v13_4.png)
+![Update approval rule](img/update_approval_rule_v13_10.png)
#### Adding / editing a default approval rule
@@ -239,7 +240,7 @@ the **Target branch** dropdown.
Alternatively, you can select a very specific protected branch from the **Target branch** dropdown:
-![Scoped to protected branch](img/scoped_to_protected_branch_v12_8.png)
+![Scoped to protected branch](img/scoped_to_protected_branch_v13_10.png)
To enable this configuration, see [Code Owner’s approvals for protected branches](../protected_branches.md#protected-branches-approval-by-code-owners).
diff --git a/doc/user/project/merge_requests/merge_request_dependencies.md b/doc/user/project/merge_requests/merge_request_dependencies.md
index 646d77391a3..2d7ba853258 100644
--- a/doc/user/project/merge_requests/merge_request_dependencies.md
+++ b/doc/user/project/merge_requests/merge_request_dependencies.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+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
type: reference, concepts
---
@@ -40,8 +40,7 @@ require changes to `awesome-lib`, and so necessitate two merge requests. Merging
the `awesome-project` merge request before the `awesome-lib` one would
break the `master`branch.
-The `awesome-project` merge request could be [marked as
-**Draft**](work_in_progress_merge_requests.md),
+The `awesome-project` merge request could be [marked as **Draft**](drafts.md),
and the reason for the draft stated included in the comments. However, this
requires the state of the `awesome-lib` merge request to be manually
tracked, and doesn't scale well if the `awesome-project` merge request
@@ -85,7 +84,7 @@ merge request widget:
![Dependencies in merge request widget](img/dependencies_view_v12_2.png)
Until all dependencies have, themselves, been merged, the **Merge**
-button will be disabled for the dependent merge request. In
+button is disabled for the dependent merge request. In
particular, note that **closed merge requests** still prevent their
dependents from being merged - it is impossible to automatically
determine whether the dependency expressed by a closed merge request
diff --git a/doc/user/project/merge_requests/merge_when_pipeline_succeeds.md b/doc/user/project/merge_requests/merge_when_pipeline_succeeds.md
index d33a8e40aac..58f2c310375 100644
--- a/doc/user/project/merge_requests/merge_when_pipeline_succeeds.md
+++ b/doc/user/project/merge_requests/merge_when_pipeline_succeeds.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+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
type: reference, concepts
---
@@ -94,7 +94,7 @@ merge-request-pipeline-job:
```
You should avoid configuration like this, and only use branch (`push`) pipelines
-or merge request pipelines, when possible. See [`rules` documentation](../../../ci/yaml/README.md#prevent-duplicate-pipelines)
+or merge request pipelines, when possible. See [`rules` documentation](../../../ci/yaml/README.md#avoid-duplicate-pipelines)
for details on avoiding two pipelines for a single merge request.
### Skipped pipelines
diff --git a/doc/user/project/merge_requests/resolve_conflicts.md b/doc/user/project/merge_requests/resolve_conflicts.md
index a53b5032e1d..4d5d89d6508 100644
--- a/doc/user/project/merge_requests/resolve_conflicts.md
+++ b/doc/user/project/merge_requests/resolve_conflicts.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+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
type: reference, concepts
---
diff --git a/doc/user/project/merge_requests/revert_changes.md b/doc/user/project/merge_requests/revert_changes.md
index d5d0578c07c..a798f2c9b85 100644
--- a/doc/user/project/merge_requests/revert_changes.md
+++ b/doc/user/project/merge_requests/revert_changes.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+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
type: reference, concepts
---
@@ -13,27 +13,26 @@ by clicking the **Revert** button in merge requests and commit details.
## Reverting a merge request
NOTE:
-The **Revert** button will only be available for merge requests
+The **Revert** button is available only for merge requests
created in GitLab 8.5 and later. However, you can still revert a merge request
by reverting the merge commit from the list of Commits page.
NOTE:
-The **Revert** button will only be shown for projects that use the
+The **Revert** button is shown only for projects that use the
merge method "Merge Commit", which can be set under the project's
**Settings > General > Merge request**. [Fast-forward commits](fast_forward_merge.md)
-can not be reverted via the MR view.
+can not be reverted by using the merge request view.
-After the Merge Request has been merged, a **Revert** button will be available
+After the merge request has been merged, use the **Revert** button
to revert the changes introduced by that merge request.
-![Revert Merge Request](img/cherry_pick_changes_mr.png)
+![Revert merge request](img/cherry_pick_changes_mr.png)
-After you click that button, a modal will appear where you can choose to
+After you click that button, a modal appears where you can choose to
revert the changes directly into the selected branch or you can opt to
create a new merge request with the revert changes.
-After the merge request has been reverted, the **Revert** button will not be
-available anymore.
+After the merge request has been reverted, the **Revert** button is no longer available.
## Reverting a commit
@@ -45,14 +44,13 @@ Similar to reverting a merge request, you can opt to revert the changes
directly into the target branch or create a new merge request to revert the
changes.
-After the commit has been reverted, the **Revert** button will not be available
-anymore.
+After a commit is reverted, the **Revert** button is no longer available.
-Please note that when reverting merge commits, the mainline will always be the
-first parent. If you want to use a different mainline then you need to do that
+When reverting merge commits, the mainline is always the
+first parent. If you want to use a different mainline, you need to do that
from the command line.
-Here is a quick example to revert a merge commit using the second parent as the
+Here's an example to revert a merge commit using the second parent as the
mainline:
```shell
diff --git a/doc/user/project/merge_requests/reviewing_and_managing_merge_requests.md b/doc/user/project/merge_requests/reviewing_and_managing_merge_requests.md
index 94f48fa544f..406a79217d0 100644
--- a/doc/user/project/merge_requests/reviewing_and_managing_merge_requests.md
+++ b/doc/user/project/merge_requests/reviewing_and_managing_merge_requests.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+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
type: index, reference
---
@@ -187,27 +187,31 @@ Feature.disable(:local_file_reviews)
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/13950) in GitLab 11.5.
In a merge request, you can leave comments in any part of the file being changed.
-In the Merge Request Diff UI, click the **{comment}** **comment** icon in the gutter
-to expand the diff lines and leave a comment, just as you would for a changed line.
+In the Merge Request Diff UI, you can:
-![Comment on any diff file line](img/comment-on-any-diff-line.png)
+- **Comment on a single line**: Click the **{comment}** **comment** icon in the
+ gutter to expand the diff lines and display a comment box.
+- [**Comment on multiple lines**](#commenting-on-multiple-lines).
### Commenting on multiple lines
> - [Introduced](https://gitlab.com/gitlab-org/ux-research/-/issues/870) in GitLab 13.2.
+> - [Added](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49875) click-and-drag features in GitLab 13.8.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/299121) in GitLab 13.9.
-GitLab provides a way to select which lines of code a comment refers to. After starting a comment
-a dropdown selector is shown to select the first line that this comment refers to.
-The last line is the line that the comment icon was initially clicked on.
+When commenting on a diff, you can select which lines of code your comment refers
+to by either:
-New comments default to single line comments by having the first and last lines
-the same. Selecting a different starting line turns this into a multiline comment.
+![Comment on any diff file line](img/comment-on-any-diff-line_v13_10.png)
-![Multiline comment selection highlighted](img/multiline-comment-highlighted.png)
+- Clicking and dragging the **{comment}** **comment** icon in the gutter to highlight
+ lines in the diff. GitLab expands the diff lines and displays a comment box.
+- After starting a comment by clicking the **{comment}** **comment** icon in the
+ gutter, select the first line number your comment refers to in the **Commenting on lines**
+ select box. New comments default to single-line comments, unless you select
+ a different starting line.
-Once a multiline comment is saved the lines of code pertaining to that comment are listed directly
-above it.
+Multiline comments display the comment's line numbers above the body of the comment:
![Multiline comment selection displayed above comment](img/multiline-comment-saved.png)
diff --git a/doc/user/project/merge_requests/squash_and_merge.md b/doc/user/project/merge_requests/squash_and_merge.md
index 1b99b1b5c44..f500c18a32e 100644
--- a/doc/user/project/merge_requests/squash_and_merge.md
+++ b/doc/user/project/merge_requests/squash_and_merge.md
@@ -31,7 +31,7 @@ NOTE:
The squashed commit in this example is followed by a merge commit, because the merge method for this repository uses a merge commit. You can disable merge commits in
**Project Settings > General > Merge requests > Merge method > Fast-forward merge**.
-The squashed commit's commit message will be either:
+The squashed commit's commit message is either:
- Taken from the first multi-line commit message in the merge.
- The merge request's title if no multi-line commit message is found.
@@ -60,7 +60,7 @@ This way, the history of your base branch remains clean with
meaningful commit messages and:
- It's simpler to [revert](revert_changes.md) if necessary.
-- The merged branch will retain the full commit history.
+- The merged branch retains the full commit history.
## Enabling squash for a merge request
@@ -113,18 +113,18 @@ squashing can itself be considered equivalent to rebasing.
With Squash Commits Options you can configure the behavior of Squash and Merge for your project.
To set it up, navigate to your project's **Settings > General** and expand **Merge requests**.
-You will find the following options to choose, which will affect existing and new merge requests
+You can choose from these options, which affect existing and new merge requests
submitted to your project:
- **Do not allow**: users cannot use Squash and Merge to squash all the commits immediately before
- merging. The checkbox to enable or disable it will be unchecked and hidden from the users.
-- **Allow**: users will have the option to enable Squash and Merge on a merge request basis.
- The checkbox will be unchecked (disabled) by default, but and the user is allowed to enable it.
-- **Encourage**: users will have the option to enable Squash and Merge on a merge request basis.
- The checkbox will be checked (enabled) by default to encourage its use, but the user is allowed to
+ merging. The checkbox to enable or disable it is unchecked and hidden from the users.
+- **Allow**: users can enable Squash and Merge on a merge request basis.
+ The checkbox is unchecked (disabled) by default, but and the user is allowed to enable it.
+- **Encourage**: users can enable Squash and Merge on a merge request basis.
+ The checkbox is checked (enabled) by default to encourage its use, but the user is allowed to
disable it.
-- **Require**: Squash and Merge is enabled for all merge requests, so it will always be performed.
- The checkbox to enable or disable it will be checked and hidden from the users.
+- **Require**: Squash and Merge is enabled for all merge requests, so it is always performed.
+ The checkbox to enable or disable it is checked and hidden from the users.
The Squash and Merge checkbox is displayed when you create a merge request and when you edit the description of an existing one, except when Squash Commit Options is set to **Do not allow** or **Require**.
diff --git a/doc/user/project/merge_requests/test_coverage_visualization.md b/doc/user/project/merge_requests/test_coverage_visualization.md
index e60f2f712d3..9f839dbd274 100644
--- a/doc/user/project/merge_requests/test_coverage_visualization.md
+++ b/doc/user/project/merge_requests/test_coverage_visualization.md
@@ -219,3 +219,32 @@ run tests:
reports:
cobertura: coverage.xml
```
+
+### C/C++ example
+
+The following [`gitlab-ci.yml`](../../../ci/yaml/README.md) example for C/C++ with
+`gcc` or `g++` as the compiler uses [`gcovr`](https://gcovr.com/en/stable/) to generate the coverage
+output file in Cobertura XML format.
+
+This example assumes:
+
+- That the `Makefile` is created by `cmake` in the `build` directory,
+ within another job in a previous stage.
+ (If you use `automake` to generate the `Makefile`,
+ then you need to call `make check` instead of `make test`.)
+- `cmake` (or `automake`) has set the compiler option `--coverage`.
+
+```yaml
+run tests:
+ stage: test
+ script:
+ - cd build
+ - make test
+ - gcovr --xml-pretty --exclude-unreachable-branches --print-summary -o coverage.xml --root ${CI_PROJECT_DIR}
+ coverage: /^\s*lines:\s*\d+.\d+\%/
+ artifacts:
+ name: ${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHA}
+ expire_in: 2 days
+ reports:
+ cobertura: build/coverage.xml
+```
diff --git a/doc/user/project/merge_requests/versions.md b/doc/user/project/merge_requests/versions.md
index 8f3ce9186f1..2c77957c98d 100644
--- a/doc/user/project/merge_requests/versions.md
+++ b/doc/user/project/merge_requests/versions.md
@@ -64,7 +64,7 @@ In GitLab 12.10, we added a comparison mode, which
shows a diff calculated by simulating how it would look like once merged - a more accurate
representation of the changes rather than using the base of the two
branches. The new mode is available from the comparison target drop down
-by selecting **master (HEAD)**. In GitLab 13.9, it
+by selecting **master (HEAD)**. In GitLab 13.9, it
[replaced](https://gitlab.com/gitlab-org/gitlab/-/issues/198458) the
old default comparison. For technical details, additional information is available in the
[developer documentation](../../../development/diffs.md#merge-request-diffs-against-the-head-of-the-target-branch).
diff --git a/doc/user/project/merge_requests/work_in_progress_merge_requests.md b/doc/user/project/merge_requests/work_in_progress_merge_requests.md
index 43ab03114fa..4b854da116e 100644
--- a/doc/user/project/merge_requests/work_in_progress_merge_requests.md
+++ b/doc/user/project/merge_requests/work_in_progress_merge_requests.md
@@ -1,78 +1,8 @@
---
-stage: Create
-group: Source Code
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-type: reference, concepts
+redirect_to: 'drafts.md'
---
-# Draft merge requests **(FREE)**
+This document was moved to [another location](drafts.md).
-If a merge request is not yet ready to be merged, perhaps due to continued development
-or open threads, you can prevent it from being accepted before it's ready by flagging
-it as a **Draft**. This disables the **Merge** button, preventing it from
-being merged. It stays disabled until the **Draft** flag has been removed.
-
-![Blocked Merge Button](img/draft_blocked_merge_button_v13_2.png)
-
-When [pipelines for merged results](../../../ci/merge_request_pipelines/pipelines_for_merged_results/index.md)
-is enabled, draft merge requests run [merge request pipelines](../../../ci/merge_request_pipelines/index.md)
-only.
-
-To run pipelines for merged results, you must [remove the draft status](#removing-the-draft-flag-from-a-merge-request).
-
-## Adding the "Draft" flag to a merge request
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/32692) in GitLab 13.2, Work-In-Progress (WIP) merge requests were renamed to **Draft**. Support for using **WIP** is scheduled for removal in GitLab 14.0.
-> - **Mark as draft** and **Mark as ready** buttons [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/227421) in GitLab 13.5.
-
-There are several ways to flag a merge request as a Draft:
-
-- Click the **Mark as draft** button on the top-right corner of the merge request's page.
-- Add `[Draft]`, `Draft:` or `(Draft)` to the start of the merge request's title. Clicking on
- **Start the title with Draft:**, under the title box, when editing the merge request's
- description has the same effect.
-- **Deprecated** Add `[WIP]` or `WIP:` to the start of the merge request's title.
- **WIP** still works but was deprecated in favor of **Draft**. It is scheduled for removal in the next major version (GitLab 14.0).
-- Add the `/draft` (or `/wip`) [quick action](../quick_actions.md#quick-actions-for-issues-merge-requests-and-epics)
- in a comment in the merge request. This is a toggle, and can be repeated
- to change the status back. Note that any other text in the comment is discarded.
-- Add `draft:`, `Draft:`, `fixup!`, or `Fixup!` to the beginning of a commit message targeting the
- merge request's source branch. This is not a toggle, and doing it again in another
- commit has no effect.
-
-## Removing the "Draft" flag from a merge request
-
-Similar to above, when a Merge Request is ready to be merged, you can remove the
-`Draft` flag in several ways:
-
-- Click the **Mark as ready** button on the top-right corner of the merge request's page.
-- Remove `[Draft]`, `Draft:` or `(Draft)` from the start of the merge request's title. Clicking on
- **Remove the Draft: prefix from the title**, under the title box, when editing the merge
- request's description, has the same effect.
-- Add the `/draft` (or `/wip`) [quick action](../quick_actions.md#quick-actions-for-issues-merge-requests-and-epics)
- in a comment in the merge request. This is a toggle, and can be repeated
- to change the status back. Note that any other text in the comment is discarded.
-- Click on the **Resolve Draft status** button near the bottom of the merge request description,
- next to the **Merge** button (see [image above](#draft-merge-requests)).
- Must have at least Developer level permissions on the project for the button to
- be visible.
-
-## Including/excluding WIP merge requests when searching
-
-When viewing/searching the merge requests list, you can choose to include or exclude
-WIP merge requests. Add a **WIP** filter in the search box, and choose **Yes**
-to include, or **No** to exclude.
-
-![Filter WIP MRs](img/filter_wip_merge_requests.png)
-
-<!-- ## Troubleshooting
-
-Include any troubleshooting steps that you can foresee. If you know beforehand what issues
-one might have when setting this up, or when something is changed, or on upgrading, it's
-important to describe those, too. Think of things that may go wrong and include them here.
-This is important to minimize requests for support, and to avoid doc comments with
-questions that you know someone might ask.
-
-Each scenario can be a third-level heading, 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 <2021-05-19>. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/user/project/milestones/burndown_charts.md b/doc/user/project/milestones/burndown_charts.md
deleted file mode 100644
index 2985e5da2ab..00000000000
--- a/doc/user/project/milestones/burndown_charts.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-redirect_to: 'burndown_and_burnup_charts.md'
----
-
-This document was moved to [another location](burndown_and_burnup_charts.md).
-
-<!-- This redirect file can be deleted after February 1, 2021. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
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 e0d5e8be535..30dd337d9d8 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
@@ -41,7 +41,7 @@ configuration for the Pages site to generate properly.
If everything is configured correctly, the site can take approximately 30 minutes to deploy.
-You can watch the pipeline run by navigating to **CI / CD > Pipelines**.
+You can watch the pipeline run by navigating to **CI/CD > Pipelines**.
When the pipeline is finished, go to **Settings > Pages** to find the link to
your Pages website.
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 3f2df634e3a..8368b38bc80 100644
--- a/doc/user/project/pages/getting_started/pages_from_scratch.md
+++ b/doc/user/project/pages/getting_started/pages_from_scratch.md
@@ -152,7 +152,7 @@ pages:
```
Now save and commit the `.gitlab-ci.yml` file. You can watch the pipeline run
-by going to **CI / CD > Pipelines**.
+by going to **CI/CD > Pipelines**.
When it succeeds, go to **Settings > Pages** to view the URL where your site
is now available.
@@ -396,7 +396,7 @@ but also pushes with **continuous tests** to feature-branches,
For more information, see the following blog posts.
- [Use GitLab CI/CD `environments` to deploy your
- web app to staging and production](https://about.gitlab.com/blog/2016/08/26/ci-deployment-and-environments/).
+ web app to staging and production](https://about.gitlab.com/blog/2021/02/05/ci-deployment-and-environments/).
- Learn [how to run jobs sequentially,
in parallel, or build a custom pipeline](https://about.gitlab.com/blog/2016/07/29/the-basics-of-gitlab-ci/).
- Learn [how to pull specific directories from different projects](https://about.gitlab.com/blog/2016/12/07/building-a-new-gitlab-docs-site-with-nanoc-gitlab-ci-and-gitlab-pages/)
diff --git a/doc/user/project/pages/index.md b/doc/user/project/pages/index.md
index 6eb06972945..2a0e1207bf5 100644
--- a/doc/user/project/pages/index.md
+++ b/doc/user/project/pages/index.md
@@ -46,9 +46,9 @@ To create a GitLab Pages website:
| Document | Description |
| -------- | ----------- |
-| [Fork a sample project](getting_started/pages_forked_sample_project.md) | Create a new project with Pages already configured by forking a sample project. |
| [Use a new project template](getting_started/pages_new_project_template.md) | Create a new project with Pages already configured by using a new project template. |
| [Use a `.gitlab-ci.yml` template](getting_started/pages_ci_cd_template.md) | Add a Pages site to an existing project. Use a pre-populated CI template file. |
+| [Fork a sample project](getting_started/pages_forked_sample_project.md) | Create a new project with Pages already configured by forking a sample project. |
| [Create a `gitlab-ci.yml` file from scratch](getting_started/pages_from_scratch.md) | Add a Pages site to an existing project. Learn how to create and configure your own CI file. |
To update a GitLab Pages website:
@@ -116,7 +116,7 @@ to use and adapt to your own needs:
- [Posting to your GitLab Pages blog from iOS](https://about.gitlab.com/blog/2016/08/19/posting-to-your-gitlab-pages-blog-from-ios/).
- [GitLab CI: Run jobs sequentially, in parallel, or build a custom pipeline](https://about.gitlab.com/blog/2016/07/29/the-basics-of-gitlab-ci/).
-- [GitLab CI: Deployment & environments](https://about.gitlab.com/blog/2016/08/26/ci-deployment-and-environments/).
+- [GitLab CI: Deployment & environments](https://about.gitlab.com/blog/2021/02/05/ci-deployment-and-environments/).
- [Building a new GitLab docs site with Nanoc, GitLab CI, and GitLab Pages](https://about.gitlab.com/blog/2016/12/07/building-a-new-gitlab-docs-site-with-nanoc-gitlab-ci-and-gitlab-pages/).
- [Publish code coverage reports with GitLab Pages](https://about.gitlab.com/blog/2016/11/03/publish-code-coverage-report-with-gitlab-pages/).
diff --git a/doc/user/project/protected_branches.md b/doc/user/project/protected_branches.md
index 4629c87f41e..aef96ff12c9 100644
--- a/doc/user/project/protected_branches.md
+++ b/doc/user/project/protected_branches.md
@@ -35,7 +35,7 @@ See the [Changelog](#changelog) section for changes over time.
## Configuring protected branches
To protect a branch, you need to have at least Maintainer permission level.
-The `master` branch is protected by default.
+The default branch for your repository is protected by default.
1. In your project, go to **Settings > Repository**.
1. Scroll to find the **Protected branches** section.
@@ -177,6 +177,41 @@ Deleting a protected branch is allowed only by using the web interface; not from
This means that you can't accidentally delete a protected branch from your
command line or a Git client application.
+## Allow force push on protected branches **(FREE SELF)**
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/15611) in GitLab 13.10.
+> - It's [deployed behind a feature flag](../feature_flags.md), disabled by default.
+> - It's disabled on GitLab.com.
+> - It's not recommended for production use.
+> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-allow-force-push-on-protected-branches).
+
+WARNING:
+This feature might not be available to you. Check the **version history** note above for details.
+
+You can allow force pushes to protected branches by either setting **Allow force push**
+when you protect a new branch, or by configuring an already-protected branch.
+
+To protect a new branch and enable Force push:
+
+1. Navigate to your project's **Settings > Repository**.
+1. Expand **Protected branches**, and scroll to **Protect a branch**.
+ ![Code Owners approval - new protected branch](img/code_owners_approval_new_protected_branch_v13_10.png)
+1. Select a **Branch** or wildcard you'd like to protect.
+1. Select the user levels **Allowed to merge** and **Allowed to push**.
+1. To allow all users with push access to force push, toggle the **Allow force push** slider.
+1. To reject code pushes that change files listed in the `CODEOWNERS` file, toggle
+ **Require approval from code owners**.
+1. Click **Protect**.
+
+To enable force pushes on branches already protected:
+
+1. Navigate to your project's **Settings > Repository**.
+1. Expand **Protected branches** and scroll to **Protected branch**.
+ ![Code Owners approval - branch already protected](img/code_owners_approval_protected_branch_v13_10.png)
+1. Toggle the **Allow force push** slider for the chosen branch.
+
+When enabled, members who are allowed to push to this branch can also force push.
+
## Protected branches approval by Code Owners **(PREMIUM)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13251) in GitLab Premium 12.4.
@@ -193,14 +228,14 @@ To protect a new branch and enable Code Owner's approval:
1. Scroll down to **Protect a branch**, select a **Branch** or wildcard you'd like to protect, select who's **Allowed to merge** and **Allowed to push**, and toggle the **Require approval from code owners** slider.
1. Click **Protect**.
-![Code Owners approval - new protected branch](img/code_owners_approval_new_protected_branch_v12_4.png)
+![Code Owners approval - new protected branch](img/code_owners_approval_new_protected_branch_v13_10.png)
To enable Code Owner's approval to branches already protected:
1. Navigate to your project's **Settings > Repository** and expand **Protected branches**.
1. Scroll down to **Protected branch** and toggle the **Code owner approval** slider for the chosen branch.
-![Code Owners approval - branch already protected](img/code_owners_approval_protected_branch_v12_4.png)
+![Code Owners approval - branch already protected](img/code_owners_approval_protected_branch_v13_10.png)
When enabled, all merge requests targeting these branches require approval
by a Code Owner per matched rule before they can be merged.
@@ -216,6 +251,25 @@ run CI/CD pipelines and execute actions on jobs that are related to those branch
See [Security on protected branches](../../ci/pipelines/index.md#pipeline-security-on-protected-branches)
for details about the pipelines security model.
+## Enable or disable allow force push on protected branches **(FREE SELF)**
+
+Allow force push on protected branches is under development and not ready for
+production use. It is deployed behind a feature flag that is **disabled by default**.
+[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
+can enable it.
+
+To enable it:
+
+```ruby
+Feature.enable(:allow_force_push_to_protected_branches)
+```
+
+To disable it:
+
+```ruby
+Feature.disable(:allow_force_push_to_protected_branches)
+```
+
## Changelog
- **13.5**: [Allow Deploy keys to push to protected branches once more](https://gitlab.com/gitlab-org/gitlab/-/issues/30769).
diff --git a/doc/user/project/push_options.md b/doc/user/project/push_options.md
index f94a4075363..c557c7718c9 100644
--- a/doc/user/project/push_options.md
+++ b/doc/user/project/push_options.md
@@ -34,12 +34,12 @@ git push -o <push_option>
## Push options for GitLab CI/CD
-You can use push options to skip a CI/CD pipeline, or pass environment variables.
+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.variable="<name>=<value>"` | Provide [environment variables](../../ci/variables/README.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) |
+| `ci.variable="<name>=<value>"` | Provide [CI/CD variables](../../ci/variables/README.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`:
@@ -47,7 +47,7 @@ An example of using `ci.skip`:
git push -o ci.skip
```
-An example of passing some environment variables for a pipeline:
+An example of passing some CI/CD variables for a pipeline:
```shell
git push -o ci.variable="MAX_RETRIES=10" -o ci.variable="MAX_TIME=600"
@@ -66,7 +66,7 @@ time as pushing changes:
| `merge_request.remove_source_branch` | Set the merge request to remove the source branch when it's merged. | [12.2](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/64320) |
| `merge_request.title="<title>"` | Set the title of the merge request. Ex: `git push -o merge_request.title="The title I want"`. | [12.2](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/64320) |
| `merge_request.description="<description>"` | Set the description of the merge request. Ex: `git push -o merge_request.description="The description I want"`. | [12.2](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/64320) |
-| `merge_request.label="<label>"` | Add labels to the merge request. If the label does not exist, it will be created. For example, for two labels: `git push -o merge_request.label="label1" -o merge_request.label="label2"`. | [12.3](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/31831) |
+| `merge_request.label="<label>"` | Add labels to the merge request. If the label does not exist, it is created. For example, for two labels: `git push -o merge_request.label="label1" -o merge_request.label="label2"`. | [12.3](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/31831) |
| `merge_request.unlabel="<label>"` | Remove labels from the merge request. For example, for two labels: `git push -o merge_request.unlabel="label1" -o merge_request.unlabel="label2"`. | [12.3](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/31831) |
If you use a push option that requires text with spaces in it, you need to enclose it
@@ -108,7 +108,7 @@ option](#push-options-for-merge-requests):
git config --global alias.mwps "push -o merge_request.create -o merge_request.target=master -o merge_request.merge_when_pipeline_succeeds"
```
-Then to quickly push a local branch that will target master and merge when the
+Then to quickly push a local branch that targets the default branch and merges when the
pipeline succeeds:
```shell
diff --git a/doc/user/project/quick_actions.md b/doc/user/project/quick_actions.md
index ac65fabd6a7..284deabb33c 100644
--- a/doc/user/project/quick_actions.md
+++ b/doc/user/project/quick_actions.md
@@ -5,7 +5,7 @@ group: Project Management
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# GitLab Quick Actions
+# GitLab quick actions **(FREE)**
> - Introduced in [GitLab 12.1](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/26672):
> once an action is executed, an alert appears when a quick action is successfully applied.
@@ -15,114 +15,113 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> `/` into a description or comment field, all available quick actions are displayed in a scrollable list.
> - The rebase quick action was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49800) in GitLab 13.8.
-Quick actions are textual shortcuts for common actions on issues, epics, merge requests,
-and commits that are usually done by clicking buttons or dropdowns in the GitLab UI.
-You can enter these commands in the description or in comments of issues, epics, merge requests, and commits.
-Each command should be on a separate line in order to be properly detected and executed.
-
-## Quick Actions for issues, merge requests and epics
-
-The following quick actions are applicable to descriptions, discussions and threads in:
-
-- Issues
-- Merge requests
-- Epics **(PREMIUM)**
-
-| Command | Issue | Merge request | Epic | Action |
-| :------------------------------------ | :---- | :------------ | :--- | :------------------------------------------------------------------------------------------------------------------------------ |
-| `/approve` | | ✓ | | Approve the merge request. **(STARTER)** |
-| `/assign @user` | ✓ | ✓ | | Assign one user. |
-| `/assign @user1 @user2` | ✓ | ✓ | | Assign multiple users. **(STARTER)** |
-| `/assign me` | ✓ | ✓ | | Assign yourself. |
-| `/assign_reviewer @user` or `/reviewer @user` or `/request_review @user` | | ✓ | | Assign one user as a reviewer. |
-| `/assign_reviewer @user1 @user2` or `/reviewer @user1 @user2` or `/request_review @user1 @user2` | | ✓ | | Assign multiple users as reviewers. **(STARTER)** |
-| `/assign_reviewer me` or `/reviewer me` or `/request_review me` | | ✓ | | Assign yourself as a reviewer. |
-| `/award :emoji:` | ✓ | ✓ | ✓ | Toggle emoji award. |
-| `/child_epic <epic>` | | | ✓ | Add child epic to `<epic>`. The `<epic>` value should be in the format of `&epic`, `group&epic`, or a URL to an epic ([introduced in GitLab 12.0](https://gitlab.com/gitlab-org/gitlab/-/issues/7330)). **(ULTIMATE)** |
-| `/clear_weight` | ✓ | | | Clear weight. **(STARTER)** |
-| `/clone <path/to/project> [--with_notes]`| ✓ | | | Clone the issue to given project, or the current one if no arguments are given ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/9421) in GitLab 13.7). Copies as much data as possible as long as the target project contains equivalent labels, milestones, and so on. Does not copy comments or system notes unless `--with_notes` is provided as an argument. |
-| `/close` | ✓ | ✓ | ✓ | Close. |
-| `/confidential` | ✓ | | | Make confidential. |
-| `/copy_metadata <!merge_request>` | ✓ | ✓ | | Copy labels and milestone from another merge request in the project. |
-| `/copy_metadata <#issue>` | ✓ | ✓ | | Copy labels and milestone from another issue in the project. |
-| `/create_merge_request <branch name>` | ✓ | | | Create a new merge request starting from the current issue. |
-| `/done` | ✓ | ✓ | ✓ | Mark to do as done. |
-| `/draft` | | ✓ | | Toggle the draft status. |
-| `/due <date>` | ✓ | | | Set due date. Examples of valid `<date>` include `in 2 days`, `this Friday` and `December 31st`. |
-| `/duplicate <#issue>` | ✓ | | | Close this issue and mark as a duplicate of another issue. **(FREE)** Also, mark both as related. **(STARTER)** |
-| `/epic <epic>` | ✓ | | | Add to epic `<epic>`. The `<epic>` value should be in the format of `&epic`, `group&epic`, or a URL to an epic. **(PREMIUM)** |
-| `/estimate <<W>w <DD>d <hh>h <mm>m>` | ✓ | ✓ | | Set time estimate. For example, `/estimate 1w 3d 2h 14m`. |
-| `/iteration *iteration:"iteration name"` | ✓ | | | Set iteration. For example, to set the `Late in July` iteration: `/iteration *iteration:"Late in July"` ([introduced in GitLab 13.1](https://gitlab.com/gitlab-org/gitlab/-/issues/196795)). **(STARTER)** |
-| `/label ~label1 ~label2` | ✓ | ✓ | ✓ | Add one or more labels. Label names can also start without a tilde (`~`), but mixed syntax is not supported. |
-| `/lock` | ✓ | ✓ | | Lock the discussions. |
-| `/merge` | | ✓ | | Merge changes. Depending on the project setting, this may be [when the pipeline succeeds](merge_requests/merge_when_pipeline_succeeds.md), adding to a [Merge Train](../../ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md), etc. |
-| `/milestone %milestone` | ✓ | ✓ | | Set milestone. |
-| `/move <path/to/project>` | ✓ | | | Move this issue to another project. |
-| `/parent_epic <epic>` | | | ✓ | Set parent epic to `<epic>`. The `<epic>` value should be in the format of `&epic`, `group&epic`, or a URL to an epic ([introduced in GitLab 12.1](https://gitlab.com/gitlab-org/gitlab/-/issues/10556)). **(ULTIMATE)** |
-| `/promote` | ✓ | | | Promote issue to epic. **(PREMIUM)** |
-| `/publish` | ✓ | | | Publish issue to an associated [Status Page](../../operations/incident_management/status_page.md) ([Introduced in GitLab 13.0](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/30906)) **(ULTIMATE)** |
-| `/reassign @user1 @user2` | ✓ | ✓ | | Replace current assignees with those specified. **(STARTER)** |
-| `/rebase` | | ✓ | | Rebase source branch. This schedules a background task that attempts to rebase the changes in the source branch on the latest commit of the target branch. If `/rebase` is used, `/merge` is ignored to avoid a race condition where the source branch is merged or deleted before it is rebased. If there are merge conflicts, GitLab displays a message that a rebase cannot be scheduled. Rebase failures are displayed with the merge request status. |
-| `/reassign_reviewer @user1 @user2` | | ✓ | | Replace current reviewers with those specified. **(STARTER)** |
-| `/relabel ~label1 ~label2` | ✓ | ✓ | ✓ | Replace current labels with those specified. |
-| `/relate #issue1 #issue2` | ✓ | | | Mark issues as related. **(STARTER)** |
-| `/remove_child_epic <epic>` | | | ✓ | Remove child epic from `<epic>`. The `<epic>` value should be in the format of `&epic`, `group&epic`, or a URL to an epic ([introduced in GitLab 12.0](https://gitlab.com/gitlab-org/gitlab/-/issues/7330)). **(ULTIMATE)** |
-| `/remove_due_date` | ✓ | | | Remove due date. |
-| `/remove_epic` | ✓ | | | Remove from epic. **(PREMIUM)** |
-| `/remove_estimate` | ✓ | ✓ | | Remove time estimate. |
-| `/remove_iteration` | ✓ | | | Remove iteration ([introduced in GitLab 13.1](https://gitlab.com/gitlab-org/gitlab/-/issues/196795)) **(STARTER)** |
-| `/remove_milestone` | ✓ | ✓ | | Remove milestone. |
-| `/remove_parent_epic` | | | ✓ | Remove parent epic from epic ([introduced in GitLab 12.1](https://gitlab.com/gitlab-org/gitlab/-/issues/10556)). **(ULTIMATE)** |
-| `/remove_time_spent` | ✓ | ✓ | | Remove time spent. |
-| `/remove_zoom` | ✓ | | | Remove Zoom meeting from this issue ([introduced in GitLab 12.4](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/16609)). |
-| `/reopen` | ✓ | ✓ | ✓ | Reopen. |
-| `/shrug <comment>` | ✓ | ✓ | ✓ | Append the comment with `¯\_(ツ)_/¯`. |
-| `/spend <time(-<h>h <mm>m)> <date(<YYYY-MM-DD>)>` | ✓ | ✓ | | Subtract spent time. Optionally, specify the date that time was spent on. For example, `/spend time(-1h 30m)` or `/spend time(-1h 30m) date(2018-08-26)`. |
-| `/spend <time(<h>h <mm>m)> <date(<YYYY-MM-DD>)>` | ✓ | ✓ | | Add spent time. Optionally, specify the date that time was spent on. For example, `/spend time(1h 30m)` or `/spend time(1h 30m) date(2018-08-26)`. |
-| `/submit_review` | | ✓ | | Submit a pending review ([introduced in GitLab 12.7](https://gitlab.com/gitlab-org/gitlab/-/issues/8041)). **(PREMIUM)** |
-| `/subscribe` | ✓ | ✓ | ✓ | Subscribe to notifications. |
-| `/tableflip <comment>` | ✓ | ✓ | ✓ | Append the comment with `(╯°□°)╯︵ â”»â”â”»`. |
-| `/target_branch <local branch name>` | | ✓ | | Set target branch. |
-| `/title <new title>` | ✓ | ✓ | ✓ | Change title. |
-| `/todo` | ✓ | ✓ | ✓ | Add a to-do item. |
-| `/unassign @user1 @user2` | ✓ | ✓ | | Remove specific assignees. **(STARTER)** |
-| `/unassign` | | ✓ | | Remove all assignees. |
-| `/unassign_reviewer @user1 @user2` or `/remove_reviewer @user1 @user2` | | ✓ | | Remove specific reviewers. **(STARTER)** |
-| `/unassign_reviewer` or `/remove_reviewer` | | ✓ | | Remove all reviewers. |
-| `/unlabel ~label1 ~label2` or `/remove_label ~label1 ~label2` | ✓ | ✓ | ✓ | Remove specified labels. |
-| `/unlabel` or `/remove_label` | ✓ | ✓ | ✓ | Remove all labels. |
-| `/unlock` | ✓ | ✓ | | Unlock the discussions. |
-| `/unsubscribe` | ✓ | ✓ | ✓ | Unsubscribe from notifications. |
-| `/weight <value>` | ✓ | | | Set weight. Valid options for `<value>` include `0`, `1`, `2`, and so on. **(STARTER)** |
-| `/wip` | | ✓ | | Toggle the draft status. |
-| `/zoom <Zoom URL>` | ✓ | | | Add Zoom meeting to this issue ([introduced in GitLab 12.4](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/16609)). |
-
-## Autocomplete characters
-
-Many quick actions require a parameter, for example: username, milestone, and
-label. [Autocomplete characters](autocomplete_characters.md) can make it easier
-to enter a parameter, compared to selecting items from a list.
-
-## Quick actions parameters
-
-The easiest way to set parameters for quick actions is to use autocomplete. If
-you manually enter a parameter, it must be enclosed in double quotation marks
+Quick actions are text-based shortcuts for common actions that are usually done
+by selecting buttons or dropdowns in the GitLab user interface. You can enter
+these commands in the descriptions or comments of issues, epics, merge requests,
+and commits.
+
+Be sure to enter each quick action on a separate line to allow GitLab to
+properly detect and execute the commands.
+
+## Parameters
+
+Many quick actions require a parameter. For example, the `/assign` quick action
+requires a username. GitLab uses [autocomplete characters](autocomplete_characters.md)
+with quick actions to help users enter parameters, by providing a list of
+available values.
+
+If you manually enter a parameter, it must be enclosed in double quotation marks
(`"`), unless it contains only these characters:
-1. ASCII letters.
-1. Numerals (0-9).
-1. Underscore (`_`), hyphen (`-`), question mark (`?`), dot (`.`), or ampersand (`&`).
+- ASCII letters
+- Numbers (0-9)
+- Underscore (`_`), hyphen (`-`), question mark (`?`), dot (`.`), or ampersand (`&`)
-Parameters are also case-sensitive. Autocomplete handles this, and the insertion
+Parameters are case-sensitive. Autocomplete handles this, and the insertion
of quotation marks, automatically.
-## Quick actions for commit messages
+## Issues, merge requests, and epics
+
+The following quick actions are applicable to descriptions, discussions, and
+threads. Some quick actions might not be available to all subscription tiers.
+
+| Command | Issue | Merge request | Epic | Action |
+|:--------------------------------------|:-----------------------|:-----------------------|:-----------------------|:-------|
+| `/approve` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Approve the merge request. |
+| `/assign @user` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Assign one user. |
+| `/assign @user1 @user2` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Assign multiple users. |
+| `/assign me` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Assign yourself. |
+| `/assign_reviewer @user` or `/reviewer @user` or `/request_review @user` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Assign one user as a reviewer. |
+| `/assign_reviewer @user1 @user2` or `/reviewer @user1 @user2` or `/request_review @user1 @user2` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Assign multiple 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. |
+| `/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 in GitLab 12.0](https://gitlab.com/gitlab-org/gitlab/-/issues/7330)). |
+| `/clear_weight` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Clear weight. |
+| `/clone <path/to/project> [--with_notes]`| **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Clone the issue to given project, or the current one if no arguments are given ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/9421) in GitLab 13.7). Copies as much data as possible as long as the target project contains equivalent labels, milestones, and so on. Does not copy comments or system notes unless `--with_notes` is provided as an argument. |
+| `/close` | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Close. |
+| `/confidential` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Make confidential. |
+| `/copy_metadata <!merge_request>` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Copy labels and milestone from another merge request in the project. |
+| `/copy_metadata <#issue>` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Copy labels and milestone from another issue in the project. |
+| `/create_merge_request <branch name>` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Create a new merge request starting from the current issue. |
+| `/done` | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Mark to do as done. |
+| `/draft` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Toggle the draft status. |
+| `/due <date>` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Set due date. Examples of valid `<date>` include `in 2 days`, `this Friday` and `December 31st`. |
+| `/duplicate <#issue>` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Close this issue and mark as a duplicate of another issue. **(FREE)** Also, mark both as related. |
+| `/epic <epic>` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Add to epic `<epic>`. The `<epic>` value should be in the format of `&epic`, `group&epic`, or a URL to an epic. |
+| `/estimate <<W>w <DD>d <hh>h <mm>m>` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Set time estimate. For example, `/estimate 1w 3d 2h 14m`. |
+| `/invite_email email1 email2` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Add up to six email participants. This action is behind feature flag `issue_email_participants`. |
+| `/iteration *iteration:"iteration name"` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Set iteration. For example, to set the `Late in July` iteration: `/iteration *iteration:"Late in July"` ([introduced in GitLab 13.1](https://gitlab.com/gitlab-org/gitlab/-/issues/196795)). |
+| `/label ~label1 ~label2` | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Add one or more labels. Label names can also start without a tilde (`~`), but mixed syntax is not supported. |
+| `/lock` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Lock the discussions. |
+| `/merge` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Merge changes. Depending on the project setting, this may be [when the pipeline succeeds](merge_requests/merge_when_pipeline_succeeds.md), or adding to a [Merge Train](../../ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md). |
+| `/milestone %milestone` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Set milestone. |
+| `/move <path/to/project>` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Move this issue to another project. |
+| `/parent_epic <epic>` | **{dotted-circle}** No | **{dotted-circle}** No | **{check-circle}** Yes | Set parent epic to `<epic>`. The `<epic>` value should be in the format of `&epic`, `group&epic`, or a URL to an epic ([introduced in GitLab 12.1](https://gitlab.com/gitlab-org/gitlab/-/issues/10556)). |
+| `/promote` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Promote issue to epic. |
+| `/publish` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Publish issue to an associated [Status Page](../../operations/incident_management/status_page.md) ([Introduced in GitLab 13.0](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/30906)) |
+| `/reassign @user1 @user2` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Replace current assignees with those specified. |
+| `/rebase` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Rebase source branch. This schedules a background task that attempts to rebase the changes in the source branch on the latest commit of the target branch. If `/rebase` is used, `/merge` is ignored to avoid a race condition where the source branch is merged or deleted before it is rebased. If there are merge conflicts, GitLab displays a message that a rebase cannot be scheduled. Rebase failures are displayed with the merge request status. |
+| `/reassign_reviewer @user1 @user2` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Replace current reviewers with those specified. |
+| `/relabel ~label1 ~label2` | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Replace current labels with those specified. |
+| `/relate #issue1 #issue2` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Mark issues as related. |
+| `/remove_child_epic <epic>` | **{dotted-circle}** No | **{dotted-circle}** No | **{check-circle}** Yes | Remove child epic from `<epic>`. The `<epic>` value should be in the format of `&epic`, `group&epic`, or a URL to an epic ([introduced in GitLab 12.0](https://gitlab.com/gitlab-org/gitlab/-/issues/7330)). |
+| `/remove_due_date` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Remove due date. |
+| `/remove_epic` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Remove from epic. |
+| `/remove_estimate` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Remove time estimate. |
+| `/remove_iteration` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Remove iteration ([introduced in GitLab 13.1](https://gitlab.com/gitlab-org/gitlab/-/issues/196795)). |
+| `/remove_milestone` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Remove milestone. |
+| `/remove_parent_epic` | **{dotted-circle}** No | **{dotted-circle}** No | **{check-circle}** Yes | Remove parent epic from epic ([introduced in GitLab 12.1](https://gitlab.com/gitlab-org/gitlab/-/issues/10556)). |
+| `/remove_time_spent` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Remove time spent. |
+| `/remove_zoom` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Remove Zoom meeting from this issue ([introduced in GitLab 12.4](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/16609)). |
+| `/reopen` | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Reopen. |
+| `/shrug <comment>` | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Append the comment with `¯\_(ツ)_/¯`. |
+| `/spend <time(-<h>h <mm>m)> <date(<YYYY-MM-DD>)>` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Subtract spent time. Optionally, specify the date that time was spent on. For example, `/spend time(-1h 30m)` or `/spend time(-1h 30m) date(2018-08-26)`. |
+| `/spend <time(<h>h <mm>m)> <date(<YYYY-MM-DD>)>` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Add spent time. Optionally, specify the date that time was spent on. For example, `/spend time(1h 30m)` or `/spend time(1h 30m) date(2018-08-26)`. |
+| `/submit_review` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Submit a pending review ([introduced in GitLab 12.7](https://gitlab.com/gitlab-org/gitlab/-/issues/8041)). |
+| `/subscribe` | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Subscribe to notifications. |
+| `/tableflip <comment>` | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Append the comment with `(╯°□°)╯︵ â”»â”â”»`. |
+| `/target_branch <local branch name>` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Set target branch. |
+| `/title <new title>` | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Change title. |
+| `/todo` | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Add a to-do item. |
+| `/unassign @user1 @user2` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Remove specific assignees. |
+| `/unassign` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Remove all assignees. |
+| `/unassign_reviewer @user1 @user2` or `/remove_reviewer @user1 @user2` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Remove specific reviewers. |
+| `/unassign_reviewer` or `/remove_reviewer` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Remove all reviewers. |
+| `/unlabel ~label1 ~label2` or `/remove_label ~label1 ~label2` | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Remove specified labels. |
+| `/unlabel` or `/remove_label` | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Remove all labels. |
+| `/unlock` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Unlock the discussions. |
+| `/unsubscribe` | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Unsubscribe from notifications. |
+| `/weight <value>` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Set weight. Valid options for `<value>` include `0`, `1`, `2`, and so on. |
+| `/wip` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Toggle the draft status. |
+| `/zoom <Zoom URL>` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Add Zoom meeting to this issue ([introduced in GitLab 12.4](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/16609)). |
+
+## Commit messages
The following quick actions are applicable for commit messages:
| Command | Action |
-| :---------------------- | :---------------------------------------- |
-| `/tag v1.2.3 <message>` | Tags this commit with an optional message |
+|:----------------------- |:------------------------------------------|
+| `/tag v1.2.3 <message>` | Tags the commit with an optional message. |
<!-- ## Troubleshooting
diff --git a/doc/user/project/releases/index.md b/doc/user/project/releases/index.md
index b5751797870..7348e17a017 100644
--- a/doc/user/project/releases/index.md
+++ b/doc/user/project/releases/index.md
@@ -66,14 +66,11 @@ To create a new release through the GitLab UI:
1. Navigate to **Project overview > Releases** and click the **New release**
button.
-1. In the [**Tag name**](#tag-name) box, enter a name.
-
- Creating a release based on an existing tag using the user
- interface is not yet supported. However, this is possible using the
- [Releases API](../../../api/releases/index.md#create-a-release).
-
-1. In the **Create from** list, select a branch, tag, or commit SHA to use when
- creating the new tag.
+1. Open the [**Tag name**](#tag-name) dropdown. Select an existing tag or type
+ in a new tag name. Selecting an existing tag that is already associated with
+ a release will result in a validation error.
+1. If creating a new tag, open the **Create from** dropdown. Select a
+ branch, tag, or commit SHA to use when creating the new tag.
1. Optionally, fill out any additional information about the release, such as its
[title](#title), [milestones](#associate-milestones-with-a-release),
[release notes](#release-notes-description), or [assets links](#links).
@@ -214,7 +211,7 @@ To set a deploy freeze window in the UI, complete these steps:
1. Sign in to GitLab as a user with project Maintainer [permissions](../../permissions.md).
1. Navigate to **Project overview**.
-1. In the left navigation menu, navigate to **Settings > CI / CD**.
+1. In the left navigation menu, navigate to **Settings > CI/CD**.
1. Scroll to **Deploy freezes**.
1. Click **Expand** to see the deploy freeze table.
1. Click **Add deploy freeze** to open the deploy freeze modal.
@@ -475,7 +472,7 @@ terminal.
Read the [Release CLI documentation](https://gitlab.com/gitlab-org/release-cli/-/blob/master/docs/index.md)
for details.
-## Release Metrics **(PREMIUM)**
+## Release Metrics **(ULTIMATE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/259703) in GitLab Premium 13.9.
diff --git a/doc/user/project/repository/branches/img/branch_filter_search_box.png b/doc/user/project/repository/branches/img/branch_filter_search_box.png
deleted file mode 100644
index 5dc300cf24e..00000000000
--- a/doc/user/project/repository/branches/img/branch_filter_search_box.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/repository/branches/img/branch_filter_search_box_v13_10.png b/doc/user/project/repository/branches/img/branch_filter_search_box_v13_10.png
new file mode 100644
index 00000000000..da7d5268b3b
--- /dev/null
+++ b/doc/user/project/repository/branches/img/branch_filter_search_box_v13_10.png
Binary files differ
diff --git a/doc/user/project/repository/branches/img/compare_branches.png b/doc/user/project/repository/branches/img/compare_branches.png
deleted file mode 100644
index e6f88da4989..00000000000
--- a/doc/user/project/repository/branches/img/compare_branches.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/repository/branches/img/compare_branches_v13_10.png b/doc/user/project/repository/branches/img/compare_branches_v13_10.png
new file mode 100644
index 00000000000..2b9a5751938
--- /dev/null
+++ b/doc/user/project/repository/branches/img/compare_branches_v13_10.png
Binary files differ
diff --git a/doc/user/project/repository/branches/img/repository_filter_search_box_v13_10.png b/doc/user/project/repository/branches/img/repository_filter_search_box_v13_10.png
new file mode 100644
index 00000000000..fdda3858c3b
--- /dev/null
+++ b/doc/user/project/repository/branches/img/repository_filter_search_box_v13_10.png
Binary files differ
diff --git a/doc/user/project/repository/branches/index.md b/doc/user/project/repository/branches/index.md
index 4d0cf28593d..d049b2108ee 100644
--- a/doc/user/project/repository/branches/index.md
+++ b/doc/user/project/repository/branches/index.md
@@ -64,7 +64,7 @@ against accidental deletion and forced pushes.
By default, when you create a new project in GitLab, the initial branch is called `master`.
For self-managed instances, a GitLab administrator can customize the initial branch name to something
-else. This way, every new project created from then on will start from the custom branch name rather than `master`. To do so:
+else. This way, every new project created from then on starts from the custom branch name rather than `master`. To do so:
1. Go to the **Admin Area > Settings > Repository** and expand **Default initial
branch name**.
@@ -96,10 +96,11 @@ To compare branches in a repository:
1. Navigate to your project's repository.
1. Select **Repository > Compare** in the sidebar.
-1. Select branches to compare using the [branch filter search box](#branch-filter-search-box)
+1. Select the target repository to compare with the [repository filter search box](#repository-filter-search-box).
+1. Select branches to compare using the [branch filter search box](#branch-filter-search-box).
1. Click **Compare** to view the changes inline:
-![compare branches](img/compare_branches.png)
+ ![compare branches](img/compare_branches_v13_10.png)
## Delete merged branches
@@ -108,17 +109,30 @@ To compare branches in a repository:
![Delete merged branches](img/delete_merged_branches.png)
This feature allows merged branches to be deleted in bulk. Only branches that
-have been merged and [are not protected](../../protected_branches.md) will be deleted as part of
+have been merged and [are not protected](../../protected_branches.md) are deleted as part of
this operation.
It's particularly useful to clean up old branches that were not deleted
automatically when a merge request was merged.
+## Repository filter search box
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52967) in GitLab 13.10.
+
+This feature allows you to search and select a repository quickly when [comparing branches](#compare).
+
+![Repository filter search box](img/repository_filter_search_box_v13_10.png)
+
+Search results appear in the following order:
+
+- Repositories with names exactly matching the search terms.
+- Other repositories with names that include search terms, sorted alphabetically.
+
## Branch filter search box
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/22166) in GitLab 11.5.
-![Branch filter search box](img/branch_filter_search_box.png)
+![Branch filter search box](img/branch_filter_search_box_v13_10.png)
This feature allows you to search and select branches quickly. Search results appear in the following order:
@@ -127,8 +141,8 @@ This feature allows you to search and select branches quickly. Search results ap
Sometimes when you have hundreds of branches you may want a more flexible matching pattern. In such cases you can use the following:
-- `^feature` will only match branch names that begin with 'feature'.
-- `feature$` will only match branch names that end with 'feature'.
+- `^feature` matches only branch names that begin with 'feature'.
+- `feature$` matches only branch names that end with 'feature'.
<!-- ## Troubleshooting
diff --git a/doc/user/project/repository/file_finder.md b/doc/user/project/repository/file_finder.md
index df3e24fbf30..3af7a5045c4 100644
--- a/doc/user/project/repository/file_finder.md
+++ b/doc/user/project/repository/file_finder.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
disqus_identifier: 'https://docs.gitlab.com/ee/workflow/file_finder.html'
---
-# File finder
+# File finder **(FREE)**
> [Introduced](https://github.com/gitlabhq/gitlabhq/pull/9889) in GitLab 8.4.
diff --git a/doc/user/project/repository/forking_workflow.md b/doc/user/project/repository/forking_workflow.md
index 1a5e169ec6b..c8922890deb 100644
--- a/doc/user/project/repository/forking_workflow.md
+++ b/doc/user/project/repository/forking_workflow.md
@@ -31,25 +31,25 @@ Forking a project is, in most cases, a two-step process.
![Choose namespace](img/forking_workflow_choose_namespace_v13_2.png)
-The fork is created. The permissions you have in the namespace are the permissions you will have in the fork.
+The fork is created. The permissions you have in the namespace are your permissions in the fork.
WARNING:
-When a public project with the repository feature set to "Members
-only" is forked, the repository will be public in the fork. The owner
-of the fork will need to manually change the visibility. This is being
+When a public project with the repository feature set to **Members Only**
+is forked, the repository is public in the fork. The owner
+of the fork must manually change the visibility. This is being
fixed in [#36662](https://gitlab.com/gitlab-org/gitlab/-/issues/36662).
## Repository mirroring
You can use [repository mirroring](repository_mirroring.md) to keep your fork synced with the original repository. You can also use `git remote add upstream` to achieve the same result.
-The main difference is that with repository mirroring your remote fork will be automatically kept up-to-date.
+The main difference is that with repository mirroring, your remote fork is automatically kept up-to-date.
-Without mirroring, to work locally you'll have to use `git pull` to update your local repository
+Without mirroring, to work locally you must use `git pull` to update your local repository
with the upstream project, then push the changes back to your fork to update it.
WARNING:
-With mirroring, before approving a merge request, you'll likely be asked to sync; hence automating it is recommended.
+With mirroring, before approving a merge request, you are asked to sync. Because of this, automating it is recommended.
Read more about [How to keep your fork up to date with its origin](https://about.gitlab.com/blog/2016/12/01/how-to-keep-your-fork-up-to-date-with-its-origin/).
@@ -60,7 +60,7 @@ When you are ready to send your code back to the upstream project,
choose your forked project's branch. For **Target branch**, choose the original project's branch.
NOTE:
-When creating a merge request, if the forked project's visibility is more restrictive than the parent project (for example the fork is private, the parent is public), the target branch will default to the forked project's default branch. This prevents potentially exposing the private code of the forked project.
+When creating a merge request, if the forked project's visibility is more restrictive than the parent project (for example the fork is private, the parent is public), the target branch defaults to the forked project's default branch. This prevents potentially exposing the private code of the forked project.
![Selecting branches](img/forking_workflow_branch_select.png)
diff --git a/doc/user/project/repository/git_blame.md b/doc/user/project/repository/git_blame.md
index 81995291911..0f49932d0c6 100644
--- a/doc/user/project/repository/git_blame.md
+++ b/doc/user/project/repository/git_blame.md
@@ -18,13 +18,12 @@ You can find the **Blame** button with each file in a project.
![File blame button](img/file_blame_button_v12_6.png "Blame button")
-When you select the **Blame** button, you'll see a screen with the
-noted information:
+When you select the **Blame** button, this information is shown:
![Git blame output](img/file_blame_output_v12_6.png "Blame button output")
-If you hover over a commit in the UI, you'll see a precise date and time
-for that commit.
+If you hover over a commit in the UI, the commit's precise date and time
+are shown.
## Blame previous commit
@@ -45,7 +44,7 @@ about a `README.md` file in the local directory, run the following command:
git blame README.md
```
-You'll see output similar to the following, which includes the commit time
+The output looks similar to the following, which includes the commit time
in UTC format:
```shell
diff --git a/doc/user/project/repository/git_history.md b/doc/user/project/repository/git_history.md
index 2e27cab4177..1b30a0b0f5f 100644
--- a/doc/user/project/repository/git_history.md
+++ b/doc/user/project/repository/git_history.md
@@ -17,13 +17,12 @@ You can find the **History** button with each file in a project.
![File history button](img/file_history_button_v12_6.png "History button")
-When you select the **History** button, you'll see a screen with the
-noted information:
+When you select the **History** button, this information displays:
![Git log output](img/file_history_output_v12_6.png "History button output")
-If you hover over a commit in the UI, you'll see a precise date and time
-that commit was last modified.
+If you hover over a commit in the UI, the precise date and time of the commit modification
+are shown.
## Associated `git` command
@@ -36,7 +35,7 @@ following command:
git log README.md
```
-You'll see output similar to the following, which includes the commit
+Git displays output similar to the following, which includes the commit
time in UTC format:
```shell
diff --git a/doc/user/project/repository/gpg_signed_commits/index.md b/doc/user/project/repository/gpg_signed_commits/index.md
index 1a46c140507..c41b3ed8615 100644
--- a/doc/user/project/repository/gpg_signed_commits/index.md
+++ b/doc/user/project/repository/gpg_signed_commits/index.md
@@ -40,7 +40,7 @@ For a commit to be verified by GitLab:
## Generating a GPG key
-If you don't already have a GPG key, the following steps will help you get
+If you don't already have a GPG key, the following steps can help you get
started:
1. [Install GPG](https://www.gnupg.org/download/index.html) for your operating system.
@@ -225,8 +225,8 @@ git config --global commit.gpgsign true
## Verifying commits
1. Within a project or [merge request](../../merge_requests/index.md), navigate to
- the **Commits** tab. Signed commits will show a badge containing either
- "Verified" or "Unverified", depending on the verification status of the GPG
+ the **Commits** tab. Signed commits show a badge containing either
+ **Verified** or **Unverified**, depending on the verification status of the GPG
signature.
![Signed and unsigned commits](img/project_signed_and_unsigned_commits.png)
@@ -240,8 +240,8 @@ git config --global commit.gpgsign true
## Revoking a GPG key
Revoking a key **unverifies** already signed commits. Commits that were
-verified by using this key will change to an unverified state. Future commits
-will also stay unverified once you revoke this key. This action should be used
+verified by using this key changes to an unverified state. Future commits
+stay unverified after you revoke this key. This action should be used
in case your key has been compromised.
To revoke a GPG key:
@@ -282,6 +282,7 @@ For more details about GPG, see:
- [Managing OpenPGP Keys](https://riseup.net/en/security/message-security/openpgp/gpg-keys)
- [OpenPGP Best Practices](https://riseup.net/en/security/message-security/openpgp/best-practices)
- [Creating a new GPG key with subkeys](https://www.void.gr/kargig/blog/2013/12/02/creating-a-new-gpg-key-with-subkeys/) (advanced)
+- [Review existing GPG keys in your instance](../../../admin_area/credentials_inventory.md#review-existing-gpg-keys)
<!-- ## Troubleshooting
diff --git a/doc/user/project/repository/index.md b/doc/user/project/repository/index.md
index 5a915ebef89..4dfc922fbad 100644
--- a/doc/user/project/repository/index.md
+++ b/doc/user/project/repository/index.md
@@ -19,8 +19,8 @@ To create a new repository, all you need to do is
Once you create a new project, you can add new files via UI
(read the section below) or via command line.
-To add files from the command line, follow the instructions that will
-be presented on the screen when you create a new project, or read
+To add files from the command line, follow the instructions
+presented on the screen when you create a new project, or read
through them in the [command line basics](../../../gitlab-basics/start-using-git.md)
documentation.
@@ -31,8 +31,7 @@ that you [connect with GitLab via SSH](../../../ssh/README.md).
## Files
Use a repository to store your files in GitLab. In [GitLab 12.10 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/33806),
-you'll see on the repository's file tree an icon next to the filename
-according to its extension:
+an icon identifying the extension is shown next to the filename:
![Repository file icons](img/file_ext_icons_repo_v12_10.png)
@@ -76,7 +75,7 @@ markup languages](https://en.wikipedia.org/wiki/Lightweight_markup_language))
that you can use for the content of your files in a repository. They are mostly
used for documentation purposes.
-Just pick the right extension for your files and GitLab will render them
+Just pick the right extension for your files and GitLab renders them
according to the markup language.
| Markup language | Extensions |
@@ -93,7 +92,7 @@ according to the markup language.
### Repository README and index files
-When a `README` or `index` file is present in a repository, its contents will be
+When a `README` or `index` file is present in a repository, its contents are
automatically pre-rendered by GitLab without opening it.
They can either be plain text or have an extension of a
@@ -101,12 +100,12 @@ They can either be plain text or have an extension of a
Some things to note about precedence:
-1. When both a `README` and an `index` file are present, the `README` will always
- take precedence.
+1. When both a `README` and an `index` file are present, the `README` always
+ takes precedence.
1. When more than one file is present with different extensions, they are
- ordered alphabetically, with the exception of a file without an extension
- which will always be last in precedence. For example, `README.adoc` will take
- precedence over `README.md`, and `README.rst` will take precedence over
+ ordered alphabetically, with the exception of a file without an extension,
+ which is always last in precedence. For example, `README.adoc` takes
+ precedence over `README.md`, and `README.rst` takes precedence over
`README`.
### Jupyter Notebook files
@@ -159,18 +158,18 @@ Via command line, you can commit multiple times before pushing.
- **Commit message:**
A commit message is important to identity what is being changed and,
more importantly, why. In GitLab, you can add keywords to the commit
- message that will perform one of the actions below:
+ message that performs one of the actions below:
- **Trigger a GitLab CI/CD pipeline:**
If you have your project configured with [GitLab CI/CD](../../../ci/README.md),
- you will trigger a pipeline per push, not per commit.
+ you trigger a pipeline per push, not per commit.
- **Skip pipelines:**
- You can add to you commit message the keyword
- [`[ci skip]`](../../../ci/yaml/README.md#skip-pipeline)
- and GitLab CI/CD will skip that pipeline.
+ You can add to your commit message the keyword
+ [`[ci skip]`](../../../ci/yaml/README.md#skip-pipeline),
+ and GitLab CI/CD skips that pipeline.
- **Cross-link issues and merge requests:**
[Cross-linking](../issues/crosslinking_issues.md#from-commit-messages)
is great to keep track of what's is somehow related in your workflow.
- If you mention an issue or a merge request in a commit message, they will be shown
+ If you mention an issue or a merge request in a commit message, they are shown
on their respective thread.
- **Cherry-pick a commit:**
In GitLab, you can
@@ -211,9 +210,9 @@ Find it under your project's **Repository > Graph**.
## Repository Languages
-For the default branch of each repository, GitLab will determine what programming languages
-were used and display this on the projects pages. If this information is missing, it will
-be added after updating the default branch on the project. This process can take up to 5
+For the default branch of each repository, GitLab determines what programming languages
+were used and displays this on the project's pages. If this information is missing, it's
+added after updating the default branch for the project. This process can take up to five
minutes.
![Repository Languages bar](img/repository_languages_v12_2.gif)
@@ -253,8 +252,8 @@ into Xcode on macOS. To do that:
1. Click **Clone**.
1. Select **Xcode**.
-The project will be cloned onto your computer in a folder of your choice and you'll
-be prompted to open in XCode.
+The project is cloned onto your computer in a folder of your choice and you are
+prompted to open XCode.
### Clone and open in Visual Studio Code
@@ -264,10 +263,10 @@ All projects can be cloned into Visual Studio Code. To do that:
1. From the GitLab UI, go to the project's overview page.
1. Click **Clone**.
-1. Select **VS Code**
+1. Select **VS Code**.
+1. Select a folder to clone the project into.
-You'll be prompted to select a folder to clone the project into. When VS Code has
-successfully cloned your project, it will open the folder.
+When VS Code has successfully cloned your project, it opens the folder.
## Download Source Code
@@ -275,7 +274,7 @@ successfully cloned your project, it will open the folder.
> - Support for [including Git LFS blobs](../../../topics/git/lfs#lfs-objects-in-project-archives) was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/15079) in GitLab 13.5.
The source code stored in a repository can be downloaded from the UI.
-By clicking the download icon, a dropdown will open with links to download the following:
+By clicking the download icon, a dropdown opens with links to download the following:
![Download source code](img/download_source_code.png)
@@ -298,7 +297,7 @@ and Git push/pull redirects.
Depending on the situation, different things apply.
When [renaming a user](../../profile/index.md#changing-your-username),
-[changing a group path](../../group/index.md#changing-a-groups-path) or [renaming a repository](../settings/index.md#renaming-a-repository):
+[changing a group path](../../group/index.md#change-a-groups-path) or [renaming a repository](../settings/index.md#renaming-a-repository):
- Existing web URLs for the namespace and anything under it (such as projects) will
redirect to the new URLs.
diff --git a/doc/user/project/repository/jupyter_notebooks/index.md b/doc/user/project/repository/jupyter_notebooks/index.md
index 123df9097f9..e4a3e6d6ef1 100644
--- a/doc/user/project/repository/jupyter_notebooks/index.md
+++ b/doc/user/project/repository/jupyter_notebooks/index.md
@@ -12,12 +12,12 @@ type: reference
interactive computing in many fields and contain a complete record of the
user's sessions and include code, narrative text, equations, and rich output.
-When added to a repository, Jupyter Notebooks with a `.ipynb` extension will be
+When added to a repository, Jupyter Notebooks with a `.ipynb` extension are
rendered to HTML when viewed.
![Jupyter Notebook Rich Output](img/jupyter_notebook.png)
-Interactive features, including JavaScript plots, will not work when viewed in
+Interactive features, including JavaScript plots, don't work when viewed in
GitLab.
## Jupyter Hub as a GitLab Managed App
diff --git a/doc/user/project/repository/repository_mirroring.md b/doc/user/project/repository/repository_mirroring.md
index 4d5e4a5ef02..980c5417da6 100644
--- a/doc/user/project/repository/repository_mirroring.md
+++ b/doc/user/project/repository/repository_mirroring.md
@@ -7,19 +7,19 @@ disqus_identifier: 'https://docs.gitlab.com/ee/workflow/repository_mirroring.htm
# Repository mirroring **(FREE)**
-Repository mirroring allows for mirroring of repositories to and from external sources. It can be
-used to mirror branches, tags, and commits between repositories. It is useful when you want to use
+Repository mirroring allows for the mirroring of repositories to and from external sources. You
+can use it to mirror branches, tags, and commits between repositories. It's useful when you want to use
a repository outside of GitLab.
-A repository mirror at GitLab will be updated automatically. You can also manually trigger an update
-at most once every 5 minutes on GitLab.com with [the limit set by the administrator on self-managed instances](../../../administration/instance_limits.md#pull-mirroring-interval).
+A repository mirror at GitLab updates automatically. You can also manually trigger an update
+at most once every five minutes on GitLab.com with [the limit set by the administrator on self-managed instances](../../../administration/instance_limits.md#pull-mirroring-interval).
There are two kinds of repository mirroring supported by GitLab:
- [Push](#pushing-to-a-remote-repository): for mirroring a GitLab repository to another location. **(FREE)**
- [Pull](#pulling-from-a-remote-repository): for mirroring a repository from another location to GitLab. **(PREMIUM)**
-When the mirror repository is updated, all new branches, tags, and commits will be visible in the
+When the mirror repository is updated, all new branches, tags, and commits are visible in the
project's activity feed.
Users with at least [Developer access](../../permissions.md) to the project can also force an
@@ -37,7 +37,7 @@ The following are some possible use cases for repository mirroring:
- You migrated to GitLab but still need to keep your project in another source. In that case, you
can simply set it up to mirror to GitLab (pull) and all the essential history of commits, tags,
- and branches will be available in your GitLab instance. **(PREMIUM)**
+ and branches are available in your GitLab instance. **(PREMIUM)**
- You have old projects in another source that you don't use actively anymore, but don't want to
remove for archiving purposes. In that case, you can create a push mirror so that your active
GitLab repository can push its changes to the old location.
@@ -49,25 +49,23 @@ The following are some possible use cases for repository mirroring:
## Pushing to a remote repository **(FREE)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/249) in GitLab Enterprise Edition 8.7.
-> - [Moved to GitLab Free](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/18715) in 10.8.
-> - [LFS support over HTTPS added](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/40137) in 13.5
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/40137) in GitLab 13.5: LFS support over HTTPS.
For an existing project, you can set up push mirroring as follows:
-1. Navigate to your project's **Settings > Repository** and expand the **Mirroring repositories** section.
+1. In your project, go to **Settings > Repository**, and then expand the **Mirroring repositories** section.
1. Enter a repository URL.
-1. Select **Push** from the **Mirror direction** dropdown.
+1. In the **Mirror direction** dropdown, select **Push**.
1. Select an authentication method from the **Authentication method** dropdown.
You can authenticate with either a password or an [SSH key](#ssh-authentication).
-1. Check the **Only mirror protected branches** box, if necessary.
-1. Check the **Keep divergent refs** box, if desired.
-1. Click the **Mirror repository** button to save the configuration.
+1. Select the **Only mirror protected branches** check box, if necessary.
+1. Select the **Keep divergent refs** check box, if desired.
+1. Select **Mirror repository** to save the configuration.
![Repository mirroring push settings screen](img/repository_mirroring_push_settings.png)
When push mirroring is enabled, only push commits directly to the mirrored repository to prevent the
-mirror diverging. All changes will end up in the mirrored repository whenever:
+mirror diverging. The mirrored repository receives all changes when:
- Commits are pushed to GitLab.
- A [forced update](#forcing-an-update) is initiated.
@@ -77,7 +75,7 @@ Changes pushed to files in the repository are automatically pushed to the remote
- Within five minutes of being received.
- Within one minute if **Only mirror protected branches** is enabled.
-In the case of a diverged branch, you will see an error indicated at the **Mirroring repositories**
+In the case of a diverged branch, an error displays in the **Mirroring repositories**
section.
### Configuring push mirrors through the API
@@ -87,20 +85,20 @@ You can also create and modify project push mirrors through the
### Keep divergent refs
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/208828) in GitLab 13.0.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/208828) in GitLab 13.0.
By default, if any ref on the remote mirror has diverged from the local
-repository, the *entire push* will fail, and nothing will be updated.
+repository, the *entire push* fails, and no updates occur.
For example, if a repository has `master`, `develop`, and `stable` branches that
have been mirrored to a remote, and then a new commit is added to `develop` on
-the mirror, the next push attempt will fail, leaving `master` and `stable`
+the mirror, the next push attempt fails, leaving `master` and `stable`
out-of-date despite not having diverged. No change on any branch can be mirrored
until the divergence is resolved.
With the **Keep divergent refs** option enabled, the `develop` branch is
-skipped, allowing `master` and `stable` to be updated. The mirror status will
-reflect that `develop` has diverged and was skipped, and be marked as a failed
+skipped, allowing `master` and `stable` to be updated. The mirror status
+reflects that `develop` has diverged and was skipped, and be marked as a failed
update.
NOTE:
@@ -110,18 +108,18 @@ After the mirror is created, this option can currently only be modified via the
To set up a mirror from GitLab to GitHub, you need to follow these steps:
-1. Create a [GitHub personal access token](https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/creating-a-personal-access-token) with the `public_repo` box checked.
+1. Create a [GitHub personal access token](https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token) with the `public_repo` box checked.
1. Fill in the **Git repository URL** field using this format: `https://<your_github_username>@github.com/<your_github_group>/<your_github_project>.git`.
1. Fill in **Password** field with your GitHub personal access token.
-1. Click the **Mirror repository** button.
+1. Select **Mirror repository**.
-The mirrored repository will be listed. For example, `https://*****:*****@github.com/<your_github_group>/<your_github_project>.git`.
+The mirrored repository is listed. For example, `https://*****:*****@github.com/<your_github_group>/<your_github_project>.git`.
-The repository will push soon. To force a push, click the **Update now** (**{retry}**) button.
+The repository pushes shortly thereafter. To force a push, select the **Update now** (**{retry}**) button.
### Setting up a push mirror from GitLab to AWS CodeCommit
-AWS CodeCommit push mirroring is currently the best way to connect GitLab repositories to AWS CodePipeline, as GitLab is not yet supported as one of their Source Code Management (SCM) providers.
+AWS CodeCommit push mirroring is currently the best way to connect GitLab repositories to AWS CodePipeline, as GitLab isn't yet supported as one of their Source Code Management (SCM) providers.
Each new AWS CodePipeline needs significant AWS infrastructure setup. It also requires an individual pipeline per branch.
@@ -159,9 +157,9 @@ To set up a mirror from GitLab to AWS CodeCommit:
}
```
-1. After the user was created, click the AWS IAM user name.
-1. Click the **Security credentials** tab.
-1. Under **HTTPS Git credentials for AWS CodeCommit** click **Generate credentials**.
+1. After the user was created, select the AWS IAM user name.
+1. Select the **Security credentials** tab.
+1. Under **HTTPS Git credentials for AWS CodeCommit** select **Generate credentials**.
NOTE:
This Git user ID and password is specific to communicating with CodeCommit. Do
@@ -169,9 +167,9 @@ To set up a mirror from GitLab to AWS CodeCommit:
1. Copy or download special Git HTTPS user ID and password.
1. In the AWS CodeCommit console, create a new repository to mirror from your GitLab repository.
-1. Open your new repository and click **Clone URL > Clone HTTPS** (not **Clone HTTPS (GRC)**).
+1. Open your new repository, and then select **Clone URL > Clone HTTPS** (not **Clone HTTPS (GRC)**).
1. In GitLab, open the repository to be push-mirrored.
-1. Click **Settings > Repository** and expand **Mirroring repositories**.
+1. Go to **Settings > Repository**, and then expand **Mirroring repositories**.
1. Fill in the **Git repository URL** field using this format:
```plaintext
@@ -185,17 +183,17 @@ To set up a mirror from GitLab to AWS CodeCommit:
1. For **Authentication method**, select **Password** and fill in the **Password** field with the special IAM Git clone user ID **password** created earlier in AWS.
1. The option **Only mirror protected branches** should be good for CodeCommit as it pushes more
frequently (from every five minutes to every minute).
- CodePipeline requires individual pipeline setups for named branches you wish to have a AWS CI setup for. Since feature branches that have dynamic names will not be supported anyway, configuring **Only mirror protected branches** does not cause flexibility problems with CodePipeline integration as long as you are also willing to protect all the named branches you want to build CodePipelines for.
+ CodePipeline requires individual pipeline setups for named branches you wish to have a AWS CI setup for. Because feature branches that have dynamic names are unsupported, configuring **Only mirror protected branches** doesn't cause flexibility problems with CodePipeline integration as long as you are also willing to protect all the named branches you want to build CodePipelines for.
-1. Click **Mirror repository**. You should see the mirrored repository appear:
+1. Select **Mirror repository**. You should see the mirrored repository appear:
```plaintext
https://*****:*****@git-codecommit.<aws-region>.amazonaws.com/v1/repos/<your_codecommit_repo>
```
-To test mirroring by forcing a push, click the half-circle arrows button (hover text is **Update now**).
+To test mirroring by forcing a push, select the half-circle arrows button (hover text is **Update now**).
If **Last successful update** shows a date, you have configured mirroring correctly.
-If it is not working correctly a red `error` tag appears and shows the error message as hover text.
+If it isn't working correctly, a red `error` tag appears and shows the error message as hover text.
### Setting up a push mirror to another GitLab instance with 2FA activated
@@ -203,11 +201,10 @@ If it is not working correctly a red `error` tag appears and shows the error mes
1. On the source GitLab instance:
1. Fill in the **Git repository URL** field using this format: `https://oauth2@<destination host>/<your_gitlab_group_or_name>/<your_gitlab_project>.git`.
1. Fill in the **Password** field with the GitLab personal access token created on the destination GitLab instance.
- 1. Click the **Mirror repository** button.
+ 1. Select **Mirror repository**.
## Pulling from a remote repository **(PREMIUM)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/51) in GitLab Enterprise Edition 8.2.
> - [Added Git LFS support](https://gitlab.com/gitlab-org/gitlab/-/issues/10871) in GitLab 11.11.
> - Moved to GitLab Premium in 13.9.
@@ -219,16 +216,20 @@ to be able to browse its content and its activity using the familiar GitLab inte
To configure mirror pulling for an existing project:
-1. Navigate to your project's **Settings > Repository** and expand the **Mirroring repositories**
- section.
-1. Enter a repository URL.
-1. Select **Pull** from the **Mirror direction** dropdown.
-1. Select an authentication method from the **Authentication method** dropdown, if necessary.
-1. If necessary, check the following boxes:
- - **Overwrite diverged branches**.
- - **Trigger pipelines for mirror updates**.
- - **Only mirror protected branches**.
-1. Click the **Mirror repository** button to save the configuration.
+1. If you [configured two-factor authentication (2FA)](https://docs.github.com/en/github/authenticating-to-github/securing-your-account-with-two-factor-authentication-2fa)
+ for GitHub, create a [personal access token for GitHub](https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token)
+ with the `read_repository` scope. If 2FA is enabled, this personal access
+ token serves as your GitHub password.
+1. In your project, go to **Settings > Repository**, and then expand the
+ **Mirroring repositories** section.
+1. In the **Git repository URL** field, enter a repository URL.
+1. In the **Mirror direction** dropdown, select **Pull**.
+1. In the **Authentication method** dropdown, select your authentication method.
+1. Select from the following checkboxes, if needed:
+ - **Overwrite diverged branches**
+ - **Trigger pipelines for mirror updates**
+ - **Only mirror protected branches**
+1. Select **Mirror repository** to save the configuration.
![Repository mirroring pull settings screen - upper part](img/repository_mirroring_pull_settings_upper.png)
@@ -238,15 +239,15 @@ To configure mirror pulling for an existing project:
Because GitLab is now set to pull changes from the upstream repository, you should not push commits
directly to the repository on GitLab. Instead, any commits should be pushed to the remote repository.
-Changes pushed to the remote repository will be pulled into the GitLab repository, either:
+Changes pushed to the remote repository are pulled into the GitLab repository, either:
- Automatically within a certain period of time.
- When a [forced update](#forcing-an-update) is initiated.
WARNING:
-If you do manually update a branch in the GitLab repository, the branch will become diverged from
-upstream and GitLab will no longer automatically update this branch to prevent any changes from being lost.
-Also note that deleted branches and tags in the upstream repository will not be reflected in the GitLab repository.
+If you do manually update a branch in the GitLab repository, the branch becomes diverged from
+upstream, and GitLab no longer automatically updates this branch to prevent any changes from being lost.
+Deleted branches and tags in the upstream repository are not reflected in the GitLab repository.
### How it works
@@ -259,13 +260,12 @@ Once per minute, a Sidekiq cron job schedules repository mirrors to update, base
Repository mirrors are updated as Sidekiq becomes available to process them. If the process of updating the repository mirror:
-- Succeeds, an update will be enqueued again with at least a 30 minute wait.
-- Fails (for example, a branch diverged from upstream), it will be attempted again later. Mirrors can fail
- up to 14 times before they will not be enqueued for update again.
+- **Succeeds**: An update is enqueued again with at least a 30 minute wait.
+- **Fails**: (For example, a branch diverged from upstream.), The update attempted again later. Mirrors can fail
+ up to 14 times before they are no longer enqueued for updates.
### Overwrite diverged branches **(PREMIUM)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/4559) in GitLab 10.6.
> - Moved to GitLab Premium in 13.9.
You can choose to always update your local branches with remote versions, even if they have
@@ -278,42 +278,39 @@ To use this option, check the **Overwrite diverged branches** box when creating
### Trigger pipelines for mirror updates **(PREMIUM)**
-> Moved to GitLab Premium in 13.9.
+> - Moved to GitLab Premium in 13.9.
-If this option is enabled, pipelines will be triggered when branches or tags are
+If this option is enabled, pipelines trigger when branches or tags are
updated from the remote repository. Depending on the activity of the remote
repository, this may greatly increase the load on your CI runners. Only enable
-this if you know they can handle the load. CI will run using the credentials
+this if you know they can handle the load. CI uses the credentials
assigned when you set up pull mirroring.
### Hard failure **(PREMIUM)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/3117) in GitLab 10.2.
> - Moved to GitLab Premium in 13.9.
-Once the mirroring process is unsuccessfully retried 14 times in a row, it will get marked as hard
-failed. This will become visible in either the:
+After 14 consecutive unsuccessful retries, the mirroring process is marked as a hard failure
+and mirroring attempts stop. This failure is visible in either the:
- Project's main dashboard.
- Pull mirror settings page.
-When a project is hard failed, it will no longer get picked up for mirroring.
You can resume the project mirroring again by [forcing an update](#forcing-an-update).
### Trigger an update using the API **(PREMIUM)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/3453) in GitLab 10.3.
> - Moved to GitLab Premium in 13.9.
Pull mirroring uses polling to detect new branches and commits added upstream, often minutes
afterwards. If you notify GitLab by [API](../../../api/projects.md#start-the-pull-mirroring-process-for-a-project),
-updates will be pulled immediately.
+updates are pulled immediately.
For more information, see [Start the pull mirroring process for a Project](../../../api/projects.md#start-the-pull-mirroring-process-for-a-project).
## Mirror only protected branches **(PREMIUM)**
-> Moved to GitLab Premium in 13.9.
+> - Moved to GitLab Premium in 13.9.
Based on the mirror direction that you choose, you can opt to mirror only the
[protected branches](../protected_branches.md) from/to your remote repository.
@@ -324,7 +321,6 @@ creating a repository mirror. **(PREMIUM)**
## SSH authentication
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/2551) in GitLab 9.5 for Pull mirroring.
> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/22982) in GitLab 11.6 for Push mirroring.
SSH authentication is mutual:
@@ -336,15 +332,15 @@ You provide your credentials as a password or public key. The server that the
other repository resides on provides its credentials as a "host key", the
fingerprint of which needs to be verified manually.
-If you're mirroring over SSH (that is, using an `ssh://` URL), you can authenticate using:
+If you're mirroring over SSH (using an `ssh://` URL), you can authenticate using:
- Password-based authentication, just as over HTTPS.
- Public key authentication. This is often more secure than password authentication,
- especially when the other repository supports [deploy keys](../../../ssh/README.md#deploy-keys).
+ especially when the other repository supports [deploy keys](../deploy_keys/index.md).
To get started:
-1. Navigate to your project's **Settings > Repository** and expand the **Mirroring repositories** section.
+1. In your project, go to **Settings > Repository**, and then expand the **Mirroring repositories** section.
1. Enter an `ssh://` URL for mirroring.
NOTE:
@@ -355,9 +351,9 @@ Entering the URL adds two buttons to the page:
- **Detect host keys**.
- **Input host keys manually**.
-If you click the:
+If you select the:
-- **Detect host keys** button, GitLab will fetch the host keys from the server and display the fingerprints.
+- **Detect host keys** button, GitLab fetches the host keys from the server and display the fingerprints.
- **Input host keys manually** button, a field is displayed where you can paste in host keys.
Assuming you used the former, you now need to verify that the fingerprints are
@@ -366,13 +362,13 @@ fingerprints in the open for you to check:
- [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/regions.html#regions-fingerprints)
- [Bitbucket](https://support.atlassian.com/bitbucket-cloud/docs/configure-ssh-and-two-step-verification/)
-- [GitHub](https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/githubs-ssh-key-fingerprints)
+- [GitHub](https://docs.github.com/en/github/authenticating-to-github/githubs-ssh-key-fingerprints)
- [GitLab.com](../../gitlab_com/index.md#ssh-host-keys-fingerprints)
- [Launchpad](https://help.launchpad.net/SSHFingerprints)
- [Savannah](http://savannah.gnu.org/maintenance/SshAccess/)
- [SourceForge](https://sourceforge.net/p/forge/documentation/SSH%20Key%20Fingerprints/)
-Other providers will vary. If you're running self-managed GitLab, or otherwise
+Other providers vary. If you're running self-managed GitLab, or otherwise
have access to the server for the other repository, you can securely gather the
key fingerprints:
@@ -386,28 +382,28 @@ $ cat /etc/ssh/ssh_host*pub | ssh-keygen -E md5 -l -f -
NOTE:
You may need to exclude `-E md5` for some older versions of SSH.
-When mirroring the repository, GitLab will now check that at least one of the
+When mirroring the repository, GitLab checks that at least one of the
stored host keys matches before connecting. This can prevent malicious code from
being injected into your mirror, or your password being stolen.
### SSH public key authentication
-To use SSH public key authentication, you'll also need to choose that option
+To use SSH public key authentication, you must also choose that option
from the **Authentication method** dropdown. When the mirror is created,
-GitLab generates a 4096-bit RSA key that can be copied by clicking the **Copy SSH public key** button.
+GitLab generates a 4096-bit RSA key that can be copied by selecting the **Copy SSH public key** button.
![Repository mirroring copy SSH public key to clipboard button](img/repository_mirroring_copy_ssh_public_key_button.png)
You then need to add the public SSH key to the other repository's configuration:
- If the other repository is hosted on GitLab, you should add the public SSH key
- as a [deploy key](../../../ssh/README.md#deploy-keys).
+ as a [deploy key](../../project/deploy_keys/index.md).
- If the other repository is hosted elsewhere, you may need to add the key to
your user's `authorized_keys` file. Paste the entire public SSH key into the
file on its own line and save it.
If you need to change the key at any time, you can remove and re-add the mirror
-to generate a new key. You'll have to update the other repository with the new
+to generate a new key. Update the other repository with the new
key to keep the mirror running.
NOTE:
@@ -423,17 +419,17 @@ update button which is available on the **Mirroring repositories** section of th
## Bidirectional mirroring **(PREMIUM)**
-> Moved to GitLab Premium in 13.9.
+> - Moved to GitLab Premium in 13.9.
WARNING:
Bidirectional mirroring may cause conflicts.
If you configure a GitLab repository to both pull from, and push to, the same remote source, there
-is no guarantee that either repository will update correctly. If you set up a repository for
-bidirectional mirroring, you should prepare for the likely conflicts by deciding who will resolve
-them and how they will be resolved.
+is no guarantee that either repository updates correctly. If you set up a repository for
+bidirectional mirroring, you should prepare for the likely conflicts by deciding who resolves
+them and how.
-Rewriting any mirrored commit on either remote will cause conflicts and mirroring to fail. This can
+Rewriting any mirrored commit on either remote causes conflicts and mirroring to fail. This can
be prevented by [mirroring only protected branches](#mirror-only-protected-branches).
You should [protect the branches](../protected_branches.md) you wish to mirror on both
@@ -447,34 +443,35 @@ protected branches.
### Configure a webhook to trigger an immediate pull to GitLab
-Assuming you have already configured the [push](#setting-up-a-push-mirror-to-another-gitlab-instance-with-2fa-activated) and [pull](#pulling-from-a-remote-repository) mirrors in the upstream GitLab instance, to trigger an immediate pull as suggested above, you will need to configure a [Push Event Web Hook](../integrations/webhooks.md#push-events) in the downstream instance.
+Assuming you have already configured the [push](#setting-up-a-push-mirror-to-another-gitlab-instance-with-2fa-activated) and [pull](#pulling-from-a-remote-repository) mirrors in the upstream GitLab instance, to trigger an immediate pull as suggested above, you must configure a [Push Event Web Hook](../integrations/webhooks.md#push-events) in the downstream instance.
To do this:
-- Create a [personal access token](../../profile/personal_access_tokens.md) with `API` scope.
-- Navigate to **Settings > Webhooks**
-- Add the webhook URL which in this case will use the [Pull Mirror API](../../../api/projects.md#start-the-pull-mirroring-process-for-a-project) request to trigger an immediate pull after updates to the repository.
+1. Create a [personal access token](../../profile/personal_access_tokens.md) with `API` scope.
+1. In your project, go to **Settings > Webhooks**.
+1. Add the webhook URL which (in this case) uses the [Pull Mirror API](../../../api/projects.md#start-the-pull-mirroring-process-for-a-project) request to trigger an immediate pull after updates to the repository.
- ```plaintext
- https://gitlab.example.com/api/v4/projects/:id/mirror/pull?private_token=<your_access_token>
- ```
+ ```plaintext
+ https://gitlab.example.com/api/v4/projects/:id/mirror/pull?private_token=<your_access_token>
+ ```
+
+1. Ensure the **Push Events** checkbox is selected.
+1. Select **Add Webhook** to save the webhook.
-- Ensure that the **Push Events** checkbox is selected.
-- Click on **Add Webhook** button to save the webhook.
-- To test the integration click on the **Test** button and confirm GitLab does not return any error.
+To test the integration, select the **Test** button and confirm GitLab doesn't return an error message.
### Preventing conflicts using a `pre-receive` hook
WARNING:
-The solution proposed will negatively impact the performance of
-Git push operations because they will be proxied to the upstream Git
+The solution proposed negatively affects the performance of
+Git push operations because they are proxied to the upstream Git
repository.
A server-side `pre-receive` hook can be used to prevent the race condition
described above by only accepting the push after first pushing the commit to
the upstream Git repository. In this configuration one Git repository acts as
the authoritative upstream, and the other as downstream. The `pre-receive` hook
-will be installed on the downstream repository.
+is installed on the downstream repository.
Read about [configuring Server hooks](../../../administration/server_hooks.md) on the GitLab server.
@@ -540,11 +537,11 @@ fi
Note that this sample has a few limitations:
- This example may not work verbatim for your use case and might need modification.
- - It does not regard different types of authentication mechanisms for the mirror.
- - It does not work with forced updates (rewriting history).
- - Only branches that match the `allowlist` patterns will be proxy pushed.
+ - It doesn't regard different types of authentication mechanisms for the mirror.
+ - It doesn't work with forced updates (rewriting history).
+ - Only branches that match the `allowlist` patterns are proxy pushed.
- The script circumvents the Git hook quarantine environment because the update of `$TARGET_REPO`
- is seen as a ref update and Git will complain about it.
+ is seen as a ref update, and Git displays warnings about it.
### Mirroring with Perforce Helix via Git Fusion **(PREMIUM)**
@@ -560,22 +557,22 @@ mirror projects with GitLab. This may be useful in some situations when migratin
to GitLab where overlapping Perforce Helix workspaces cannot be migrated simultaneously to GitLab.
If using mirroring with Perforce Helix, you should only mirror protected branches. Perforce Helix
-will reject any pushes that rewrite history. Only the fewest number of branches should be mirrored
+rejects any pushes that rewrite history. Only the fewest number of branches should be mirrored
due to the performance limitations of Git Fusion.
When configuring mirroring with Perforce Helix via Git Fusion, the following Git Fusion
settings are recommended:
-- `change-pusher` should be disabled. Otherwise, every commit will be rewritten as being committed
+- `change-pusher` should be disabled. Otherwise, every commit is rewritten as being committed
by the mirroring account, rather than being mapped to existing Perforce Helix users or the `unknown_git` user.
-- `unknown_git` user will be used as the commit author if the GitLab user does not exist in
+- `unknown_git` user is used as the commit author if the GitLab user doesn't exist in
Perforce Helix.
Read about [Git Fusion settings on Perforce.com](https://www.perforce.com/manuals/git-fusion/Content/Git-Fusion/section_vss_bdw_w3.html#section_zdp_zz1_3l).
## Troubleshooting
-Should an error occur during a push, GitLab will display an "Error" highlight for that repository. Details on the error can then be seen by hovering over the highlight text.
+Should an error occur during a push, GitLab displays an **Error** highlight for that repository. Details on the error can then be seen by hovering over the highlight text.
### 13:Received RST_STREAM with error code 2 with GitHub
@@ -584,3 +581,9 @@ If you receive an "13:Received RST_STREAM with error code 2" while mirroring to
### 4:Deadline Exceeded
When upgrading to GitLab 11.11.8 or newer, a change in how usernames are represented means that you may need to update your mirroring username and password to ensure that `%40` characters are replaced with `@`.
+
+### Connection blocked because server only allows public key authentication
+
+As the error indicates, the connection is getting blocked between GitLab and the remote repository. Even if a [TCP Check](../../../administration/raketasks/maintenance.md#check-tcp-connectivity-to-a-remote-site) is successful, you must check any networking components in the route from GitLab to the remote Server to ensure there's no blockage.
+
+For example, we've seen this error when a Firewall was performing a `Deep SSH Inspection` on outgoing packets.
diff --git a/doc/user/project/repository/web_editor.md b/doc/user/project/repository/web_editor.md
index a9e249bb8c3..efa35c1ceac 100644
--- a/doc/user/project/repository/web_editor.md
+++ b/doc/user/project/repository/web_editor.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: howto
---
-# GitLab Web Editor
+# GitLab Web Editor **(FREE)**
Sometimes it's easier to make quick changes directly from the GitLab interface
than to clone the project and use the Git command-line tool. In this feature
@@ -108,7 +108,7 @@ You can see a **Create merge request** dropdown below the issue description.
The **Create merge request** button doesn't display if:
- A branch with the same name already exists.
-- The branch already has a referenced merge request.
+- A merge request already exists for this branch.
- Your project has an active fork relationship.
To make this button appear, one possible workaround is to
diff --git a/doc/user/project/repository/x509_signed_commits/index.md b/doc/user/project/repository/x509_signed_commits/index.md
index 29c1c32145d..c89f3a267ba 100644
--- a/doc/user/project/repository/x509_signed_commits/index.md
+++ b/doc/user/project/repository/x509_signed_commits/index.md
@@ -39,7 +39,7 @@ recommend using certificates from a PKI that are in line with
## Obtaining an X.509 key pair
-If your organization has Public Key Infrastructure (PKI), that PKI will provide
+If your organization has Public Key Infrastructure (PKI), that PKI provides
an S/MIME key.
If you do not have an S/MIME key pair from a PKI, you can either create your
@@ -49,7 +49,7 @@ and some of them generate keys for free.
## Associating your X.509 certificate with Git
-To take advantage of X.509 signing, you will need Git 2.19.0 or later. You can
+To take advantage of X.509 signing, you need Git 2.19.0 or later. You can
check your Git version with:
```shell
diff --git a/doc/user/project/requirements/index.md b/doc/user/project/requirements/index.md
index c7dda81685c..bd37acafd22 100644
--- a/doc/user/project/requirements/index.md
+++ b/doc/user/project/requirements/index.md
@@ -96,18 +96,20 @@ As soon as a requirement is reopened, it no longer appears in the **Archived** t
## Search for a requirement
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/212543) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.1.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/212543) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.1.
+> - Searching by status [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/224614) in GitLab 13.10.
You can search for a requirement from the requirements list page based on the following criteria:
-- Requirement title
+- Title
- Author's username
+- Status (satisfied, failed, or missing)
To search for a requirement:
1. In a project, go to **Requirements > List**.
1. Select the **Search or filter results** field. A dropdown menu appears.
-1. Select the requirement author from the dropdown or enter plain text to search by requirement title.
+1. Select the requirement author or status from the dropdown or enter plain text to search by requirement title.
1. Press <kbd>Enter</kbd> on your keyboard to filter the list.
You can also sort the requirements list by:
@@ -183,7 +185,7 @@ requirements_confirmation:
### Add the manual job to CI conditionally
To configure your CI to include the manual job only when there are some open
-requirements, add a rule which checks `CI_HAS_OPEN_REQUIREMENTS` CI variable.
+requirements, add a rule which checks `CI_HAS_OPEN_REQUIREMENTS` CI/CD variable.
```yaml
requirements_confirmation:
diff --git a/doc/user/project/service_desk.md b/doc/user/project/service_desk.md
index debe5c51d51..383b4df9612 100644
--- a/doc/user/project/service_desk.md
+++ b/doc/user/project/service_desk.md
@@ -73,7 +73,7 @@ To enable Service Desk in your project:
1. Enable the **Activate Service Desk** toggle. This reveals a unique email address to email issues
to the project.
-Service Desk is now enabled for this project! To access it in a project, in the left sidebar, select
+Service Desk is now enabled for this project! To access it in a project, in the left sidebar, select
**Issues > Service Desk**.
WARNING:
@@ -137,13 +137,13 @@ You can use these placeholders to be automatically replaced in each email:
#### New Service Desk issues
-You can select one [issue description template](description_templates.md#creating-issue-templates)
+You can select one [issue description template](description_templates.md#create-an-issue-template)
**per project** to be appended to every new Service Desk issue's description.
Issue description templates should reside in your repository's `.gitlab/issue_templates/` directory.
To use a custom issue template with Service Desk, in your project:
-1. [Create a description template](description_templates.md#creating-issue-templates)
+1. [Create a description template](description_templates.md#create-an-issue-template)
1. Go to **Settings > General > Service Desk**.
1. From the dropdown **Template to append to all Service Desk issues**, select your template.
diff --git a/doc/user/project/settings/import_export.md b/doc/user/project/settings/import_export.md
index 6f230f1798a..7b5a0cbb377 100644
--- a/doc/user/project/settings/import_export.md
+++ b/doc/user/project/settings/import_export.md
@@ -118,16 +118,16 @@ The following items will be exported:
- Issue boards
- Pipelines history
- Push Rules
+- Awards
The following items will **not** be exported:
- Build traces and artifacts
- Container registry images
-- CI variables
+- CI/CD variables
- Webhooks
- Any encrypted tokens
- Merge Request Approvers
-- Awards
NOTE:
For more details on the specific data persisted in a project export, see the
diff --git a/doc/user/project/settings/index.md b/doc/user/project/settings/index.md
index 8ab82fe7296..785618a862a 100644
--- a/doc/user/project/settings/index.md
+++ b/doc/user/project/settings/index.md
@@ -44,6 +44,7 @@ Compliance framework labels do not affect your project settings.
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/276221) in GitLab 13.9.
> - It's [deployed behind a feature flag](../../feature_flags.md), disabled by default.
+> - It can be enabled or disabled for a single group
> - It's disabled on GitLab.com.
> - It's not recommended for production use.
> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-custom-compliance-frameworks). **(PREMIUM)**
@@ -103,8 +104,7 @@ Some features depend on others:
When the **Issues** option is disabled, you can still access **Milestones**
from merge requests.
-- Additionally, if you disable both **Issues** and **Merge Requests**, you will no
- longer have access to:
+- Additionally, if you disable both **Issues** and **Merge Requests**, you cannot access:
- **Labels**
- **Milestones**
@@ -220,7 +220,7 @@ To rename a repository:
1. Click **Change path**.
Remember that this can have unintended side effects since everyone with the
-old URL won't be able to push or pull. Read more about what happens with the
+old URL can't push or pull. Read more about what happens with the
[redirects when renaming repositories](../repository/index.md#redirects-when-changing-repository-paths).
#### Transferring an existing project into another namespace
@@ -243,7 +243,7 @@ To transfer a project:
project to.
1. Confirm the transfer by typing the project's path as instructed.
-Once done, you will be taken to the new project's namespace. At this point,
+Once done, you are redirected to the new project's namespace. At this point,
read what happens with the
[redirects from the old project to the new one](../repository/index.md#redirects-when-changing-repository-paths).
@@ -266,7 +266,7 @@ This action:
- Deletes a project including all associated resources (issues, merge requests etc).
- From [GitLab 13.2](https://gitlab.com/gitlab-org/gitlab/-/issues/220382) on [Premium](https://about.gitlab.com/pricing/) or higher tiers,
-group owners can [configure](../../group/index.md#enabling-delayed-project-removal) projects within a group
+group owners can [configure](../../group/index.md#enable-delayed-project-removal) projects within a group
to be deleted after a delayed period.
When enabled, actual deletion happens after number of days
specified in [instance settings](../../admin_area/settings/visibility_and_access_controls.md#default-deletion-delay).
@@ -293,7 +293,7 @@ If you want to use the fork for yourself and don't need to send
you can safely remove the fork relationship.
WARNING:
-Once removed, the fork relationship cannot be restored. You will no longer be able to send merge requests to the source, and if anyone has forked your project, their fork will also lose the relationship.
+Once removed, the fork relationship cannot be restored. You can't send merge requests to the source, and if anyone has forked your project, their fork also loses the relationship.
To do so:
@@ -330,11 +330,11 @@ can enable it.
To enable it:
```ruby
-Feature.enable(:ff_custom_compliance_frameworks)
+Feature.enable(:ff_custom_compliance_frameworks, Group.find(<group id>))
```
To disable it:
```ruby
-Feature.disable(:ff_custom_compliance_frameworks)
+Feature.disable(:ff_custom_compliance_frameworks, Group.find(<group id>))
```
diff --git a/doc/user/project/settings/project_access_tokens.md b/doc/user/project/settings/project_access_tokens.md
index 590f549577e..cda39508835 100644
--- a/doc/user/project/settings/project_access_tokens.md
+++ b/doc/user/project/settings/project_access_tokens.md
@@ -78,33 +78,3 @@ the following table.
| `write_registry` | Allows write-access (push) to [container registry](../../packages/container_registry/index.md). |
| `read_repository` | Allows read-only access (pull) to the repository. |
| `write_repository` | Allows read-write access (pull, push) to the repository. |
-
-### Enable or disable project access tokens
-
-Project access tokens are deployed behind a feature flag that is **enabled by default**.
-[GitLab administrators with access to the GitLab Rails console](../../../administration/feature_flags.md)
-can disable it for your instance, globally or by project.
-
-To disable it globally:
-
-```ruby
-Feature.disable(:resource_access_token)
-```
-
-To disable it for a specific project:
-
-```ruby
-Feature.disable(:resource_access_token, project)
-```
-
-To enable it globally:
-
-```ruby
-Feature.enable(:resource_access_token)
-```
-
-To enable it for a specific project:
-
-```ruby
-Feature.enable(:resource_access_token, project)
-```
diff --git a/doc/user/project/static_site_editor/index.md b/doc/user/project/static_site_editor/index.md
index 002eb398406..431250a817d 100644
--- a/doc/user/project/static_site_editor/index.md
+++ b/doc/user/project/static_site_editor/index.md
@@ -102,7 +102,7 @@ To edit a file:
in the bottom-right corner.
1. When you're done, click **Submit changes...**.
1. (Optional) Adjust the default title and description of the merge request, to submit
- with your changes. Alternatively, select a [merge request template](../../../user/project/description_templates.md#creating-merge-request-templates)
+ with your changes. Alternatively, select a [merge request template](../../../user/project/description_templates.md#create-a-merge-request-template)
from the dropdown menu and edit it accordingly.
1. Click **Submit changes**.
1. A new merge request is automatically created and you can assign a colleague for review.
diff --git a/doc/user/project/time_tracking.md b/doc/user/project/time_tracking.md
index 2b0ca38c57c..d1e9fe155b4 100644
--- a/doc/user/project/time_tracking.md
+++ b/doc/user/project/time_tracking.md
@@ -40,7 +40,8 @@ Below is an example of how you can use those new quick actions inside a comment.
![Time tracking example in a comment](img/time_tracking_example_v12_2.png)
-Adding time entries (time spent or estimates) is limited to project members.
+Adding time entries (time spent or estimates) is limited to project members
+with [Reporter and higher permission levels](../permissions.md).
### Estimates
diff --git a/doc/user/project/web_ide/img/solarized_dark_theme_v13_1.png b/doc/user/project/web_ide/img/solarized_dark_theme_v13_1.png
index ccb9cf6f126..8eca352a4d0 100644
--- a/doc/user/project/web_ide/img/solarized_dark_theme_v13_1.png
+++ b/doc/user/project/web_ide/img/solarized_dark_theme_v13_1.png
Binary files differ
diff --git a/doc/user/project/web_ide/img/solarized_light_theme_v13_0.png b/doc/user/project/web_ide/img/solarized_light_theme_v13_0.png
deleted file mode 100644
index 6257d78d29e..00000000000
--- a/doc/user/project/web_ide/img/solarized_light_theme_v13_0.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/web_ide/index.md b/doc/user/project/web_ide/index.md
index 07f46cb94f7..57b79875909 100644
--- a/doc/user/project/web_ide/index.md
+++ b/doc/user/project/web_ide/index.md
@@ -71,19 +71,16 @@ Single file editing is based on the [Ace Editor](https://ace.c9.io).
### Themes
-> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2389) in GitLab in 13.0.
+> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2389) in GitLab 13.0.
> - Full Solarized Dark Theme [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/219228) in GitLab 13.1.
+> - Full [Solarized Light](https://gitlab.com/gitlab-org/gitlab/-/issues/221035) and [Monokai](https://gitlab.com/gitlab-org/gitlab/-/issues/221034) Themes introduced in GitLab 13.6.
-All the themes GitLab supports for syntax highlighting are added to the Web IDE's code editor.
+All the themes GitLab supports for syntax highlighting are applied to the Web IDE's entire screen.
You can pick a theme from your [profile preferences](../../profile/preferences.md).
-The themes are available only in the Web IDE file editor, except for the [dark theme](https://gitlab.com/gitlab-org/gitlab/-/issues/209808) and
-the [Solarized dark theme](https://gitlab.com/gitlab-org/gitlab/-/issues/219228),
-which apply to the entire Web IDE screen.
-
-| Solarized Light Theme | Solarized Dark Theme | Dark Theme |
-|---------------------------------------------------------------|-------------------------------------------------------------|-----------------------------------------|
-| ![Solarized Light Theme](img/solarized_light_theme_v13_0.png) | ![Solarized Dark Theme](img/solarized_dark_theme_v13_1.png) | ![Dark Theme](img/dark_theme_v13_0.png) |
+| Solarized Dark Theme | Dark Theme |
+|-------------------------------------------------------------|-----------------------------------------|
+| ![Solarized Dark Theme](img/solarized_dark_theme_v13_1.png) | ![Dark Theme](img/dark_theme_v13_0.png) |
## Schema based validation
@@ -237,7 +234,7 @@ different branch.
When you edit Markdown files in the Web IDE, you can preview your changes by
clicking the **Preview Markdown** tab above the file editor. The Markdown preview
-supports [GitLab Flavored Markdown](../../markdown.md#gitlab-flavored-markdown-gfm).
+supports [GitLab Flavored Markdown](../../markdown.md#gitlab-flavored-markdown).
You can also upload any local images by pasting them directly in the Markdown file.
The image is uploaded to the same directory and is named `image.png` by default.
@@ -424,7 +421,7 @@ terminal:
See [this issue](https://gitlab.com/gitlab-org/webide-file-sync/-/issues/7) for
more information.
- `$CI_PROJECT_DIR` is a
- [predefined environment variable](../../../ci/variables/predefined_variables.md)
+ [predefined CI/CD variable](../../../ci/variables/predefined_variables.md)
for GitLab Runners. This is where your project's repository resides.
After you have configured the web terminal for file syncing, then when the web
diff --git a/doc/user/project/wiki/index.md b/doc/user/project/wiki/index.md
index 187fcb5b3f9..44860a0030e 100644
--- a/doc/user/project/wiki/index.md
+++ b/doc/user/project/wiki/index.md
@@ -24,9 +24,9 @@ a separate Git repository.
## First time creating the Home page
-The first time you visit a Wiki, you will be directed to create the Home page.
-The Home page is necessary to be created since it serves as the landing page
-when viewing a Wiki. You only have to fill in the **Content** section and click
+The first time you visit a Wiki, you are directed to create the Home page.
+The Home page is necessary to be created because it serves as the landing page
+when viewing a Wiki. Complete the **Content** section, and then select
**Create page**. You can always edit it later, so go ahead and write a welcome
message.
@@ -37,38 +37,38 @@ message.
NOTE:
Requires Developer [permissions](../../permissions.md).
-Create a new page by clicking the **New page** button that can be found
+Create a new page by selecting the **New page** button that can be found
in all wiki pages.
-You will be asked to fill in a title for your new wiki page.
+Enter a title for your new wiki page.
You can specify a full path for the wiki page by using '/' in the
-title to indicate subdirectories. Any missing directories will be created
-automatically. For example, a title of `docs/my-page` will create a wiki
+title to indicate subdirectories. Any missing directories are created
+automatically. For example, a title of `docs/my-page` creates a wiki
page with a path `/wikis/docs/my-page`.
-Once you enter the page name, it's time to fill in its content. GitLab wikis
+After you enter the page name, it's time to fill in its content. GitLab wikis
support Markdown, RDoc, AsciiDoc, and Org. For Markdown based pages, all the
[Markdown features](../../markdown.md) are supported and for links there is
some [wiki specific](../../markdown.md#wiki-specific-markdown) behavior.
In the web interface the commit message is optional, but the GitLab Wiki is
-based on Git and needs a commit message, so one will be created for you if you
-do not enter one.
+based on Git and needs a commit message, so one is created for you if you
+don't enter one.
-When you're ready, click the **Create page** and the new page will be created.
+When you're ready, select **Create page** and the new page is created.
![New page](img/wiki_create_new_page.png)
### Attachment storage
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/33475) in GitLab 11.3.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/33475) in GitLab 11.3.
-Starting with GitLab 11.3, any file that is uploaded to the wiki via the GitLab
-interface will be stored in the wiki Git repository, and it will be available
+Any file uploaded to the wiki with the GitLab
+interface is stored in the wiki Git repository, and is available
if you clone the wiki repository locally. All uploaded files prior to GitLab
11.3 are stored in GitLab itself. If you want them to be part of the wiki's Git
-repository, you will have to upload them again.
+repository, you must upload them again.
### Special characters in page titles
@@ -80,7 +80,7 @@ Wiki pages are stored as files in a Git repository, so certain characters have a
### Length restrictions for file and directory names
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/24364) in GitLab 12.8.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/24364) in GitLab 12.8.
Many common file systems have a [limit of 255 bytes for file and directory names](https://en.wikipedia.org/wiki/Comparison_of_file_systems#Limits), and while Git and GitLab both support paths exceeding those limits, the presence of them makes it impossible for users on those file systems to checkout a wiki repository locally.
@@ -99,9 +99,9 @@ Please note that:
You need Developer [permissions](../../permissions.md) or higher to edit a wiki page.
To do so:
-1. Click the edit icon (**{pencil}**).
+1. Select the edit icon (**{pencil}**).
1. Edit the content.
-1. Click **Save changes**.
+1. Select **Save changes**.
### Adding a table of contents
@@ -114,7 +114,7 @@ You need Maintainer [permissions](../../permissions.md) or higher to delete a wi
To do so:
1. Open the page you want to delete.
-1. Click the **Delete page** button.
+1. Select **Delete page**.
1. Confirm the deletion.
## Moving a wiki page
@@ -122,22 +122,22 @@ To do so:
You need Developer [permissions](../../permissions.md) or higher to move a wiki page.
To do so:
-1. Click the edit icon (**{pencil}**).
+1. Select the edit icon (**{pencil}**).
1. Add the new path to the **Title** field.
-1. Click **Save changes**.
+1. Select **Save changes**.
For example, if you have a wiki page called `about` under `company` and you want to
move it to the wiki's root:
-1. Click the edit icon (**{pencil}**).
+1. Select the edit icon (**{pencil}**).
1. Change the **Title** from `about` to `/about`.
-1. Click **Save changes**.
+1. Select **Save changes**.
If you want to do the opposite:
-1. Click the edit icon (**{pencil}**).
+1. Select the edit icon (**{pencil}**).
1. Change the **Title** from `about` to `company/about`.
-1. Click **Save changes**.
+1. Select **Save changes**.
## Viewing a list of all created wiki pages
@@ -148,37 +148,37 @@ found. The list is ordered alphabetically.
![Wiki sidebar](img/wiki_sidebar_v13_5.png)
-If you have many pages, not all will be listed in the sidebar. Click on
+If you have many pages, not all are listed in the sidebar. Select
**View All Pages** to see all of them.
## Viewing the history of a wiki page
The changes of a wiki page over time are recorded in the wiki's Git repository,
-and you can view them by clicking the **Page history** button.
+and you can view them by selecting **Page history**.
From the history page you can see the revision of the page (Git commit SHA), its
author, the commit message, and when it was last updated.
-To see how a previous version of the page looked like, click on a revision
+To see how a previous version of the page looked like, select a revision
number in the **Page version** column.
![Wiki page history](img/wiki_page_history.png)
### Viewing the changes between page versions
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/15242) in GitLab 13.2.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/15242) in GitLab 13.2.
Similar to versioned diff file views, you can see the changes made in a given Wiki page version:
1. Navigate to the Wiki page you're interested in.
-1. Click on **Page history** to see all page versions.
-1. Click on the commit message in the **Changes** column for the version you're interested in:
+1. Select **Page history** to see all page versions.
+1. Select the commit message in the **Changes** column for the version you're interested in.
![Wiki page changes](img/wiki_page_diffs_v13_2.png)
## Wiki activity records
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/14902) in **GitLab 12.10.**
-> - Git events were [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/216014) in **GitLab 13.0.**
+> - Git events were [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/216014) in **GitLab 13.0.**
> - [Feature flag for Git events was removed](https://gitlab.com/gitlab-org/gitlab/-/issues/258665) in **GitLab 13.5**
Wiki events (creation, deletion, and updates) are tracked by GitLab and
@@ -191,12 +191,12 @@ and [project](../working_with_projects.md#project-activity) activity pages.
Since wikis are based on Git repositories, you can clone them locally and edit
them like you would do with every other Git repository.
-On the right sidebar, click on **Clone repository** and follow the on-screen
+In the right sidebar, select **Clone repository** and follow the on-screen
instructions.
Files that you add to your wiki locally must have one of the following
supported extensions, depending on the markup language you wish to use,
-otherwise they will not display when pushed to GitLab:
+otherwise they don't display when pushed to GitLab:
- Markdown extensions: `.mdown`, `.mkd`, `.mkdn`, `.md`, `.markdown`.
- AsciiDoc extensions: `.adoc`, `.ad`, `.asciidoc`.
@@ -204,11 +204,11 @@ otherwise they will not display when pushed to GitLab:
## Customizing sidebar
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/23109) in GitLab 13.8, the sidebar can be customized by clicking the **Edit sidebar** button.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/23109) in GitLab 13.8, the sidebar can be customized by selecting the **Edit sidebar** button.
To customize the Wiki's navigation sidebar, you need Developer permissions to the project.
-On the top-right, click **Edit sidebar** and make your changes. This creates a wiki page named `_sidebar` which fully replaces the default sidebar navigation.
+In the top-right, select **Edit sidebar** and make your changes. This creates a wiki page named `_sidebar` which fully replaces the default sidebar navigation.
Example for `_sidebar` (using Markdown format):
diff --git a/doc/user/project/working_with_projects.md b/doc/user/project/working_with_projects.md
index 3fe6193c414..43df1cce70f 100644
--- a/doc/user/project/working_with_projects.md
+++ b/doc/user/project/working_with_projects.md
@@ -212,7 +212,7 @@ To delete a project, first navigate to the home page for that project.
1. Click **Delete project**
1. Confirm this action by typing in the expected text.
-Projects in personal namespaces are deleted immediately on request. For information on delayed deletion of projects in a group, please see [Enabling delayed project removal](../group/index.md#enabling-delayed-project-removal).
+Projects in personal namespaces are deleted immediately on request. For information on delayed deletion of projects in a group, please see [Enable delayed project removal](../group/index.md#enable-delayed-project-removal).
## Project settings
@@ -278,7 +278,7 @@ databases if the module name or a prefix of it appears in `GONOPRIVATE` or
### Authenticate Go requests
To authenticate requests to private projects made by Go, use a [`.netrc`
-file](https://ec.haxx.se/usingcurl-netrc.html) and a [personal access
+file](https://everything.curl.dev/usingcurl/netrc) and a [personal access
token](../profile/personal_access_tokens.md) in the password field. **This only
works if your GitLab instance can be accessed with HTTPS.** The `go` command
does not transmit credentials over insecure connections. This authenticates
diff --git a/doc/user/search/advanced_global_search.md b/doc/user/search/advanced_global_search.md
deleted file mode 100644
index 2d1a05cd966..00000000000
--- a/doc/user/search/advanced_global_search.md
+++ /dev/null
@@ -1,70 +0,0 @@
----
-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 **(PREMIUM)**
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/109) in GitLab 8.4.
-> - [Moved](../../subscriptions/bronze_starter.md) to GitLab Premium in 13.9.
-
-NOTE:
-Advanced Search (powered by Elasticsearch) is enabled for Bronze and above on GitLab.com since 2020-07-10.
-
-Leverage Elasticsearch for faster, more advanced code search across your entire
-GitLab instance.
-
-This is the user documentation. To install and configure Elasticsearch,
-visit the [administrator documentation](../../integration/elasticsearch.md).
-
-## Overview
-
-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 projects that can help your own project.
-
-GitLab leverages the search capabilities of [Elasticsearch](https://www.elastic.co/elasticsearch/) and enables it when
-searching in:
-
-- Projects
-- Issues
-- Merge requests
-- Milestones
-- Comments
-- Code
-- Commits
-- Wiki
-- Users
-
-## Use cases
-
-The Advanced Search can be useful in various scenarios.
-
-### Faster searches
-
-Advanced Search is based on Elasticsearch, which is a purpose built full text search engine that can be horizontally scaled so that it can provide search results in 1-2 seconds in most cases.
-
-### Promote innersourcing
-
-Your company may consist of many different developer teams each of which has
-their own group where the various projects are hosted. Some of your applications
-may be connected to each other, so your developers need to instantly search
-throughout the GitLab instance and find the code they search for.
-
-## Searching globally
-
-Just use the search as before and GitLab will show you matching code from each
-project you have access to.
-
-![Advanced Search](img/advanced_global_search.png)
-
-You can also use the [Advanced Search Syntax](advanced_search_syntax.md) which
-provides some useful queries.
-
-NOTE:
-Elasticsearch has only data for the default branch. 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 will be served by the basic
-search even if Elasticsearch is enabled.
diff --git a/doc/user/search/advanced_search.md b/doc/user/search/advanced_search.md
new file mode 100644
index 00000000000..d11f02addea
--- /dev/null
+++ b/doc/user/search/advanced_search.md
@@ -0,0 +1,115 @@
+---
+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
+---
+
+# GitLab Advanced Search **(PREMIUM)**
+
+> - Moved to GitLab Premium in 13.9.
+
+NOTE:
+This is the user documentation. To configure the Advanced Search,
+visit the [administrator documentation](../../integration/elasticsearch.md).
+
+GitLab Advanced Search expands on the Basic Search with an additional set of
+features for faster, more advanced searches across the entire GitLab instance
+when searching in:
+
+- Projects
+- Issues
+- Merge requests
+- Milestones
+- Epics
+- Comments
+- Code
+- Commits
+- Wiki
+- Users
+
+The Advanced Search can be useful in various scenarios:
+
+- **Faster searches:**
+ Advanced Search is based on Elasticsearch, which is a purpose-built full
+ text search engine that can be horizontally scaled so that it can provide
+ search results in 1-2 seconds in most cases.
+- **Promote innersourcing:**
+ Your company may consist of many different developer teams each of which has
+ their own group where the various projects are hosted. Some of your applications
+ 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 only data for the default branch. 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 will be 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 will show
+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 - e.g.: searching
+ issues for [`display bug`](https://gitlab.com/search?utf8=%E2%9C%93&snippets=&scope=issues&repository_ref=&search=display+bug&group_id=9970&project_id=278964) and [`bug display`](https://gitlab.com/search?utf8=%E2%9C%93&snippets=&scope=issues&repository_ref=&search=bug+Display&group_id=9970&project_id=278964) will return the same results.
+- To find the exact phrase (stemming still applies), use double quotes: [`"display bug"`](https://gitlab.com/search?utf8=%E2%9C%93&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?utf8=%E2%9C%93&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?utf8=%E2%9C%93&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?utf8=%E2%9C%93&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?utf8=%E2%9C%93&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?utf8=%E2%9C%93&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 (`*`) will be used as the keyword.
+
+Examples:
+
+- Finding a file with any content named `search_results.rb`: [`* filename:search_results.rb`](https://gitlab.com/search?utf8=%E2%9C%93&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?utf8=%E2%9C%93&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?utf8=%E2%9C%93&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?utf8=%E2%9C%93&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?utf8=%E2%9C%93&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?utf8=%E2%9C%93&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?utf8=%E2%9C%93&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?utf8=%E2%9C%93&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 Starter 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:
+
+- Finding `rails` in all files but `Gemfile.lock`: [`rails -filename:Gemfile.lock`](https://gitlab.com/search?utf8=%E2%9C%93&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?utf8=%E2%9C%93&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?utf8=%E2%9C%93&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?utf8=%E2%9C%93&snippets=&scope=blobs&repository_ref=&search=docs+-path%3Adocs%2F&group_id=9970&project_id=278964)
+
+## Search by issue or merge request ID
+
+You can search a specific issue or merge request by its ID with a special prefix.
+
+- To search by issue ID, use prefix `#` followed by issue ID. For example, [#23456](https://gitlab.com/search?utf8=%E2%9C%93&snippets=&scope=issues&repository_ref=&search=%2323456&group_id=9970&project_id=278964)
+- To search by merge request ID, use prefix `!` followed by merge request ID. For example [!23456](https://gitlab.com/search?utf8=%E2%9C%93&snippets=&scope=merge_requests&repository_ref=&search=%2123456&group_id=9970&project_id=278964)
diff --git a/doc/user/search/advanced_search_syntax.md b/doc/user/search/advanced_search_syntax.md
deleted file mode 100644
index 19f7305124e..00000000000
--- a/doc/user/search/advanced_search_syntax.md
+++ /dev/null
@@ -1,90 +0,0 @@
----
-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)**
-
-> - Introduced in [GitLab](https://about.gitlab.com/pricing/) 9.2.
-> - [Moved](../../subscriptions/bronze_starter.md) to GitLab Premium in 13.9.
-
-Use advanced queries for more targeted search results.
-
-This is the user documentation. To install and configure Elasticsearch,
-visit the [administrator documentation](../../integration/elasticsearch.md).
-
-## Overview
-
-The Advanced Search Syntax is a subset of the
-[Advanced Search](advanced_global_search.md), which you can use if you
-want to have more specific search results.
-
-Advanced Search only supports searching the [default branch](../project/repository/branches/index.md#default-branch).
-
-## Using the Advanced Search Syntax
-
-The Advanced Search Syntax supports fuzzy or exact search queries with prefixes,
-boolean operators, and much more.
-
-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 - e.g.: searching
- issues for [`display bug`](https://gitlab.com/search?utf8=%E2%9C%93&snippets=&scope=issues&repository_ref=&search=display+bug&group_id=9970&project_id=278964) and [`bug display`](https://gitlab.com/search?utf8=%E2%9C%93&snippets=&scope=issues&repository_ref=&search=bug+Display&group_id=9970&project_id=278964) will return the same results.
-- To find the exact phrase (stemming still applies), use double quotes: [`"display bug"`](https://gitlab.com/search?utf8=%E2%9C%93&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?utf8=%E2%9C%93&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?utf8=%E2%9C%93&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?utf8=%E2%9C%93&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?utf8=%E2%9C%93&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?utf8=%E2%9C%93&snippets=&scope=blobs&repository_ref=&search=argument+%5C-last&group_id=9970&project_id=278964)
-
-### Syntax search filters
-
-The Advanced Search Syntax 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 (`*`) will be used as the keyword.
-
-Examples:
-
-- Finding a file with any content named `search_results.rb`: [`* filename:search_results.rb`](https://gitlab.com/search?utf8=%E2%9C%93&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?utf8=%E2%9C%93&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?utf8=%E2%9C%93&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?utf8=%E2%9C%93&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?utf8=%E2%9C%93&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?utf8=%E2%9C%93&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?utf8=%E2%9C%93&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?utf8=%E2%9C%93&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 Starter 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:
-
-- Finding `rails` in all files but `Gemfile.lock`: [`rails -filename:Gemfile.lock`](https://gitlab.com/search?utf8=%E2%9C%93&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?utf8=%E2%9C%93&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?utf8=%E2%9C%93&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?utf8=%E2%9C%93&snippets=&scope=blobs&repository_ref=&search=docs+-path%3Adocs%2F&group_id=9970&project_id=278964)
-
-### Search by issue or merge request ID
-
-You can search a specific issue or merge request by its ID with a special prefix.
-
-- To search by issue ID, use prefix `#` followed by issue ID. For example, [#23456](https://gitlab.com/search?utf8=%E2%9C%93&snippets=&scope=issues&repository_ref=&search=%2323456&group_id=9970&project_id=278964)
-- To search by merge request ID, use prefix `!` followed by merge request ID. For example [!23456](https://gitlab.com/search?utf8=%E2%9C%93&snippets=&scope=merge_requests&repository_ref=&search=%2123456&group_id=9970&project_id=278964)
diff --git a/doc/user/search/img/advanced_global_search.png b/doc/user/search/img/advanced_global_search.png
deleted file mode 100644
index 4903bbb07e1..00000000000
--- a/doc/user/search/img/advanced_global_search.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/search/img/advanced_search_v13.10.png b/doc/user/search/img/advanced_search_v13.10.png
new file mode 100644
index 00000000000..39cd54fea75
--- /dev/null
+++ b/doc/user/search/img/advanced_search_v13.10.png
Binary files differ
diff --git a/doc/user/search/index.md b/doc/user/search/index.md
index ffd331248be..f327288ea0a 100644
--- a/doc/user/search/index.md
+++ b/doc/user/search/index.md
@@ -5,7 +5,7 @@ info: "To determine the technical writer assigned to the Stage/Group associated
type: index, reference, howto
---
-# Search through GitLab
+# Search through GitLab **(FREE)**
## Issues and merge requests
@@ -298,34 +298,29 @@ redirected to the commit result and given the option to return to the search res
Leverage Elasticsearch for faster, more advanced code search across your entire
GitLab instance.
-[Learn how to use the Advanced Search.](advanced_global_search.md)
+[Learn how to use the Advanced Search.](advanced_search.md)
-## Advanced Search Syntax **(PREMIUM)**
-
-Use advanced queries for more targeted search results.
-
-[Learn how to use the Advanced Search Syntax.](advanced_search_syntax.md)
-
-## Search project settings
+## Search settings
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/292941) in GitLab 13.8.
+> - [Added to Group, Admin, and User settings](https://gitlab.com/groups/gitlab-org/-/epics/4842) in GitLab 13.9
> - It's [deployed behind a feature flag](../feature_flags.md), disabled by default.
> - It's disabled on GitLab.com.
> - It's not recommended for production use.
-> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-search-project-settings). **(FREE SELF)**
+> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-search-settings). **(FREE SELF)**
WARNING:
This feature might not be available to you. Check the **version history** note above for details.
-You can search inside the project’s settings sections by entering a search
-term in the search box located at the top of the page. The search results
+You can search inside a Project, Group, Admin, or User’s settings by entering
+a search term in the search box located at the top of the page. The search results
appear highlighted in the sections that match the search term.
![Search project settings](img/project_search_general_settings_v13_8.png)
-### Enable or disable Search project settings **(FREE SELF)**
+### Enable or disable Search settings **(FREE SELF)**
-Search project settings is under development and not ready for production use. It is
+Search settings 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.
diff --git a/doc/user/shortcuts.md b/doc/user/shortcuts.md
index 014555cffed..2a3ee09b40b 100644
--- a/doc/user/shortcuts.md
+++ b/doc/user/shortcuts.md
@@ -6,25 +6,32 @@ type: reference
disqus_identifier: 'https://docs.gitlab.com/ee/workflow/shortcuts.html'
---
-# GitLab keyboard shortcuts
+# GitLab keyboard shortcuts **(FREE)**
+
+GitLab has several keyboard shortcuts you can use to access its different
+features.
+
+To display a window in GitLab that lists its keyboard shortcuts, use one of the
+following methods:
+
+- Press <kbd>?</kbd>.
+- In the Help menu in the top right of the appication, select **Keyboard shortcuts**.
-GitLab has many useful keyboard shortcuts to make it easier to access different features.
-You can see a modal listing keyboard shortcuts within GitLab itself by pressing <kbd>?</kbd>,
-or clicking **Keyboard shortcuts** in the Help menu at the top right.
In [GitLab 12.8 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/22113),
-keyboard shortcuts can be disabled using the **Enable**/**Disable** toggle in this modal window.
+you can disable keyboard shortcuts by using the **Keyboard shortcuts** toggle
+at the top of the keyboard shortcut window.
-The [Global Shortcuts](#global-shortcuts) work from any area of GitLab, but you must
-be in specific pages for the other shortcuts to be available, as explained in each
-section below.
+Although [global shortcuts](#global-shortcuts) work from any area of GitLab,
+you must be in specific pages for the other shortcuts to be available, as
+explained in each section.
-## Global Shortcuts
+## Global shortcuts
-These shortcuts are available in most areas of GitLab
+These shortcuts are available in most areas of GitLab:
-| Keyboard Shortcut | Description |
-| ------------------------------- | ----------- |
-| <kbd>?</kbd> | Show/hide shortcut reference sheet. |
+| Keyboard shortcut | Description |
+|---------------------------------|-------------|
+| <kbd>?</kbd> | Show or hide the shortcut reference sheet. |
| <kbd>Shift</kbd> + <kbd>p</kbd> | Go to your Projects page. |
| <kbd>Shift</kbd> + <kbd>g</kbd> | Go to your Groups page. |
| <kbd>Shift</kbd> + <kbd>a</kbd> | Go to your Activity page. |
@@ -34,41 +41,41 @@ These shortcuts are available in most areas of GitLab
| <kbd>Shift</kbd> + <kbd>i</kbd> | Go to your Issues page. |
| <kbd>Shift</kbd> + <kbd>m</kbd> | Go to your Merge requests page.|
| <kbd>Shift</kbd> + <kbd>t</kbd> | Go to your To-Do List page. |
-| <kbd>p</kbd> + <kbd>b</kbd> | Show/hide the Performance Bar. |
+| <kbd>p</kbd> + <kbd>b</kbd> | Show or hide the Performance Bar. |
| <kbd>g</kbd> + <kbd>x</kbd> | Toggle between [GitLab](https://gitlab.com/) and [GitLab Next](https://next.gitlab.com/) (GitLab SaaS only). |
-Additionally, the following shortcuts are available when editing text in text fields,
-for example comments, replies, issue descriptions, and merge request descriptions:
+Additionally, the following shortcuts are available when editing text in text
+fields (for example, comments, replies, issue descriptions, and merge request
+descriptions):
-| Keyboard Shortcut | Description |
-| ---------------------------------------------------------------------- | ----------- |
-| <kbd>↑</kbd> | Edit your last comment. You must be in a blank text field below a thread, and you must already have at least one comment in the thread. |
-| <kbd>⌘</kbd> (Mac) / <kbd>Control</kbd> + <kbd>Shift</kbd> + <kbd>p</kbd> | Toggle Markdown preview, when editing text in a text field that has **Write** and **Preview** tabs at the top. |
+| Keyboard shortcut | Description |
+|---------------------------------------------------------------------------|-------------|
+| <kbd>↑</kbd> | Edit your last comment. You must be in a blank text field below a thread, and you must already have at least one comment in the thread. |
+| <kbd>⌘</kbd> (Mac) / <kbd>Control</kbd> + <kbd>Shift</kbd> + <kbd>p</kbd> | Toggle Markdown preview when editing text in a text field that has **Write** and **Preview** tabs at the top. |
| <kbd>⌘</kbd> (Mac) / <kbd>Control</kbd> + <kbd>b</kbd> | Bold the selected text (surround it with `**`). |
| <kbd>⌘</kbd> (Mac) / <kbd>Control</kbd> + <kbd>i</kbd> | Italicize the selected text (surround it with `_`). |
| <kbd>⌘</kbd> (Mac) / <kbd>Control</kbd> + <kbd>k</kbd> | Add a link (surround the selected text with `[]()`). |
-NOTE:
-The shortcuts for editing in text fields are always enabled, even when
-other keyboard shortcuts are disabled as explained above.
+The shortcuts for editing in text fields are always enabled, even if other
+keyboard shortcuts are disabled.
## Project
-These shortcuts are available from any page within a project. You must type them
+These shortcuts are available from any page in a project. You must type them
relatively quickly to work, and they take you to another page in the project.
-| Keyboard Shortcut | Description |
-| --------------------------- | ----------- |
+| Keyboard shortcut | Description |
+|-----------------------------|-------------|
| <kbd>g</kbd> + <kbd>p</kbd> | Go to the project home page (**Project > Details**). |
| <kbd>g</kbd> + <kbd>v</kbd> | Go to the project activity feed (**Project > Activity**). |
| <kbd>g</kbd> + <kbd>r</kbd> | Go to the project releases list (**Project > Releases**). |
| <kbd>g</kbd> + <kbd>f</kbd> | Go to the [project files](#project-files) list (**Repository > Files**). |
-| <kbd>t</kbd> | Go to the project file search page. (**Repository > Files**, click **Find Files**). |
+| <kbd>t</kbd> | Go to the project file search page. (**Repository > Files**, select **Find Files**). |
| <kbd>g</kbd> + <kbd>c</kbd> | Go to the project commits list (**Repository > Commits**). |
| <kbd>g</kbd> + <kbd>n</kbd> | Go to the [repository graph](#repository-graph) page (**Repository > Graph**). |
| <kbd>g</kbd> + <kbd>d</kbd> | Go to repository charts (**Analytics > Repository Analytics**). |
| <kbd>g</kbd> + <kbd>i</kbd> | Go to the project issues list (**Issues > List**). |
-| <kbd>i</kbd> | Go to the New Issue page (**Issues**, click **New Issue** ). |
+| <kbd>i</kbd> | Go to the New Issue page (**Issues**, select **New Issue** ). |
| <kbd>g</kbd> + <kbd>b</kbd> | Go to the project issue boards list (**Issues > Boards**). |
| <kbd>g</kbd> + <kbd>m</kbd> | Go to the project merge requests list (**Merge Requests**). |
| <kbd>g</kbd> + <kbd>j</kbd> | Go to the CI/CD jobs list (**CI/CD > Jobs**). |
@@ -78,52 +85,52 @@ relatively quickly to work, and they take you to another page in the project.
| <kbd>g</kbd> + <kbd>s</kbd> | Go to the project snippets list (**Snippets**). |
| <kbd>g</kbd> + <kbd>w</kbd> | Go to the project wiki (**Wiki**), if enabled. |
-### Issues and Merge Requests
+### Issues and merge requests
-These shortcuts are available when viewing issues and merge requests.
+These shortcuts are available when viewing issues and merge requests:
-| Keyboard Shortcut | Description |
-| ---------------------------- | ----------- |
+| Keyboard shortcut | Description |
+|------------------------------|-------------|
| <kbd>e</kbd> | Edit description. |
| <kbd>a</kbd> | Change assignee. |
| <kbd>m</kbd> | Change milestone. |
| <kbd>l</kbd> | Change label. |
-| <kbd>r</kbd> | Start writing a comment. If any text is selected, it is quoted in the comment. Can't be used to reply within a thread. |
+| <kbd>r</kbd> | Start writing a comment. Pre-selected text is quoted in the comment. Can't be used to reply in a thread. |
| <kbd>n</kbd> | Move to next unresolved discussion (merge requests only). |
| <kbd>p</kbd> | Move to previous unresolved discussion (merge requests only). |
| <kbd>]</kbd> or <kbd>j</kbd> | Move to next file (merge requests only). |
| <kbd>[</kbd> or <kbd>k</kbd> | Move to previous file (merge requests only). |
| <kbd>b</kbd> | Copy source branch name (merge requests only). |
-### Project Files
+### Project files
-These shortcuts are available when browsing the files in a project (navigate to
-**Repository** > **Files**):
+These shortcuts are available when browsing the files in a project (go to
+**Repository > Files**):
-| Keyboard Shortcut | Description |
-| ----------------- | ----------- |
+| Keyboard shortcut | Description |
+|-------------------|-------------|
| <kbd>↑</kbd> | Move selection up. |
| <kbd>↓</kbd> | Move selection down. |
| <kbd>enter</kbd> | Open selection. |
-| <kbd>Escape</kbd> | Go back to file list screen (only while searching for files, **Repository > Files** then click on **Find File**). |
+| <kbd>Escape</kbd> | Go back to file list screen (only while searching for files, **Repository > Files**, then select **Find File**). |
| <kbd>y</kbd> | Go to file permalink (only while viewing a file). |
### Web IDE
These shortcuts are available when editing a file with the [Web IDE](project/web_ide/index.md):
-| Keyboard Shortcut | Description |
-| ------------------------------------------------------- | ----------- |
+| Keyboard shortcut | Description |
+|------------------------------------------------------------|-------------|
| <kbd>⌘</kbd> (Mac) / <kbd>Control</kbd> + <kbd>p</kbd> | Search for, and then open another file for editing. |
| <kbd>⌘</kbd> (Mac) / <kbd>Control</kbd> + <kbd>Enter</kbd> | Commit (when editing the commit message). |
-### Repository Graph
+### Repository graph
These shortcuts are available when viewing the project [repository graph](project/repository/index.md#repository-graph)
page (navigate to **Repository > Graph**):
-| Keyboard Shortcut | Description |
-| ------------------------------------------------------------------ | ----------- |
+| Keyboard shortcut | Description |
+|--------------------------------------------------------------------|-------------|
| <kbd>â†</kbd> or <kbd>h</kbd> | Scroll left. |
| <kbd>→</kbd> or <kbd>l</kbd> | Scroll right. |
| <kbd>↑</kbd> or <kbd>k</kbd> | Scroll up. |
@@ -135,25 +142,25 @@ page (navigate to **Repository > Graph**):
This shortcut is available when viewing a [wiki page](project/wiki/index.md):
-| Keyboard Shortcut | Description |
-| ----------------- | ----------- |
+| Keyboard shortcut | Description |
+|-------------------|-------------|
| <kbd>e</kbd> | Edit wiki page. |
-### Filtered Search
+### Filtered search
These shortcuts are available when using a [filtered search input](search/index.md):
-| Keyboard Shortcut | Description |
-| ----------------------------------------------------- | ----------- |
-| <kbd>⌘</kbd> (Mac) + <kbd>⌫</kbd> | Clear entire search filter. |
-| <kbd>⌥</kbd> (Mac) / <kbd>Control</kbd> + <kbd>⌫</kbd> | Clear one token at a time. |
+| Keyboard shortcut | Description |
+|--------------------------------------------------------|-------------|
+| <kbd>⌘</kbd> (Mac) + <kbd>⌫</kbd> | Clear entire search filter. |
+| <kbd>⌥</kbd> (Mac) / <kbd>Control</kbd> + <kbd>⌫</kbd> | Clear one token at a time. |
## Epics **(ULTIMATE)**
-These shortcuts are available when viewing [Epics](group/epics/index.md):
+These shortcuts are available when viewing [epics](group/epics/index.md):
-| Keyboard Shortcut | Description |
-| ----------------- | ----------- |
-| <kbd>r</kbd> | Start writing a comment. If any text is selected, it is quoted in the comment. Can't be used to reply within a thread. |
+| Keyboard shortcut | Description |
+|-------------------|-------------|
+| <kbd>r</kbd> | Start writing a comment. Pre-selected text is quoted in the comment. Can't be used to reply in a thread. |
| <kbd>e</kbd> | Edit description. |
| <kbd>l</kbd> | Change label. |
diff --git a/doc/user/snippets.md b/doc/user/snippets.md
index e919e73f404..a2a18c0e8de 100644
--- a/doc/user/snippets.md
+++ b/doc/user/snippets.md
@@ -5,85 +5,100 @@ info: "To determine the technical writer assigned to the Stage/Group associated
type: reference
---
-# Snippets
+# Snippets **(FREE)**
+
+With GitLab snippets, you can store and share bits of code and text with other users.
+You can [comment on](#comment-on-snippets), [clone](#clone-snippets), and
+[use version control](#versioned-snippets) in snippets. They can
+[contain multiple files](#add-or-remove-multiple-files). They also support
+[syntax highlighting](#filenames), [embedding](#embed-snippets), [downloading](#download-snippets),
+and you can maintain your snippets with the [snippets API](../api/snippets.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)
+ 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.
+
+## Create snippets
+
+You can create snippets in multiple ways, depending on whether you want to create a personal or project snippet:
+
+1. Select the kind of snippet you want to create:
+ - **To create a personal snippet**:
+ - *If you're on a project's page,* select the plus icon (**{plus-square-o}**)
+ in the top navigation bar, then select **New snippet** from the **GitLab** (for GitLab.com)
+ or **Your Instance** (self-managed) section of the same dropdown menu.
+ - *For all other pages,* select the plus icon (**{plus-square-o}**)
+ in the top navigation bar, then select **New snippet** from the dropdown menu.
+ - **To create a project snippet**: Go to your project's page. Select the plus icon
+ (**{plus-square-o}**), then select **New snippet** from the **This project** section
+ of the dropdown menu.
+1. Add a **Title** and **Description**.
+1. Name your **File** with an appropriate extension, such as `example.rb` or `index.html`.
+ Filenames with appropriate extensions display [syntax highlighting](#filenames).
+ Failure to add a filename can cause a known
+ [copy-pasting bug](https://gitlab.com/gitlab-org/gitlab/-/issues/22870). If you don't provide a filename, GitLab [creates a name for you](#filenames).
+1. (Optional) Add [multiple files](#add-or-remove-multiple-files) to your snippet.
+1. Select a visibility level, and select **Create snippet**.
+
+After you create a snippet, you can still [add more files to it](#add-or-remove-multiple-files).
+In GitLab versions 13.0 and later, snippets are [versioned by default](#versioned-snippets).
-With GitLab Snippets you can store and share bits of code and text with other users.
-
-![GitLab Snippet](img/gitlab_snippet_v13_0.png)
-
-Snippets can be maintained using [snippets API](../api/snippets.md).
-
-There are two types of snippets:
-
-- Personal snippets.
-- Project snippets.
-
-## Personal snippets
-
-Personal snippets are not related to any project and can be created completely
-independently. There are 3 visibility levels that can be set, public, internal
-and private. See [Public access](../public_access/public_access.md) for more information.
-
-## Project snippets
-
-Project snippets are always related to a specific project.
-See [Project features](project/index.md#project-features) for more information.
-
-## Create a snippet
-
-To create a personal snippet, click the plus icon (**{plus-square-o}**)
-on the top navigation and select **New snippet** from the dropdown menu:
-
-![New personal snippet from non-project pages](img/new_personal_snippet_v12_10.png)
-
-If you're on a project's page but you want to create a new personal snippet,
-click the plus icon (**{plus-square-o}**) and select **New snippet** from the
-lower part of the dropdown (**GitLab** on GitLab.com; **Your Instance** on
-self-managed instances):
+## Discover snippets
-![New personal snippet from project pages](img/new_personal_snippet_from_project_v12_10.png)
+To discover all snippets visible to you in GitLab, you can:
-To create a project snippet, navigate to your project's page and click the
-plus icon (**{plus-square-o}**), then select **New snippet** from the upper
-part of the dropdown (**This project**).
+- **View all snippets visible to you**: In the top navigation bar of your GitLab
+ instance, go to **More > Snippets** to view your snippets dashboard.
+- **Visit [GitLab snippets](http://snippets.gitlab.com/)** for your snippets on GitLab.com.
+- **Explore all public snippets**: In the top navigation bar of your GitLab
+ instance, go to **More > Snippets** and select **Explore snippets** to view
+ [all public snippets](https://gitlab.com/explore/snippets).
+- **View a project's snippets**: In your project,
+ go to **Snippets**.
-![New personal snippet from project pages](img/new_project_snippet_from_project_v12_10.png)
+## Change default visibility of snippets
-From there, add the **Title**, **Description**, and a **File** name with the
-appropriate extension (for example, `example.rb`, `index.html`).
+Project snippets are enabled and available by default. To change their
+default visibility:
-WARNING:
-Make sure to add the filename to get code highlighting and to avoid this
-[copy-pasting bug](https://gitlab.com/gitlab-org/gitlab/-/issues/22870).
+1. In your project,
+ go to **Settings**.
+1. Expand the **Visibility, project features, permissions** section, and scroll to **Snippets**.
+1. Toggle the default visibility, and select whether snippets can be viewed by
+ everyone, or only project members.
+1. Select **Save changes**.
-## Versioned Snippets
+## Versioned snippets
> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/239) in GitLab 13.0.
-Starting in 13.0, snippets (both personal and project snippets)
+In GitLab versions 13.0 and later, snippets (both personal and project snippets)
have version control enabled by default.
This means that all snippets get their own underlying repository initialized with
-a `master` branch at the moment the snippet is created. Whenever a change to the snippet is saved, a
-new commit to the `master` branch is recorded. Commit messages are automatically
-generated. The snippet's repository has only one branch (`master`) by default, deleting
-it or creating other branches is not supported.
+a default branch at the moment the snippet is created. Whenever a change to the snippet is saved, a
+new commit to the default branch is recorded. Commit messages are automatically
+generated. The snippet's repository has only one branch. You can't delete this branch,
+or create other branches.
-Existing snippets are automatically migrated in 13.0. Their current
-content is saved as the initial commit to the snippets' repository.
+Existing snippets were automatically migrated in 13.0. Their current
+content was saved as the initial commit to the snippets' repository.
-### Filenames
+## Filenames
Snippets support syntax highlighting based on the filename and
extension provided for them. While you can submit a snippet
-without specifying a filename and extension, it needs a valid name so the
+without a filename and extension, it needs a valid name so the
content can be created as a file in the snippet's repository.
-If you don't attribute a filename and extension to a snippet,
+If you don't give a snippet a filename and extension,
GitLab adds a filename in the format `snippetfile<x>.txt`
where `<x>` represents a number added to the file, starting with 1. This
-number increments when more snippets without an attributed
-filename are added.
+number increments if you add more unnamed snippets.
When upgrading from an earlier version of GitLab to 13.0, existing snippets
without a supported filename are renamed to a compatible format. For
@@ -92,139 +107,110 @@ changed to `http-a-weird-filename-me` to be included in the snippet's
repository. As snippets are stored by ID, changing their filenames breaks
direct or embedded links to the snippet.
-### Multiple files by Snippet
+## Add or remove multiple files
> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2829) in GitLab 13.5.
-GitLab Snippets support multiple files in one single snippet. This is helpful
-when your code snippet is composed of multiple parts or when they relate
-to a certain context. For example:
+A single snippet can support up to 10 files, which helps keep related files together, such as:
- A snippet that includes a script and its output.
-- A snippet that includes HTML, CSS, and JS code.
+- A snippet that includes HTML, CSS, and JavaScript code.
- A snippet with a `docker-compose.yml` file and its associated `.env` file.
-- A `gulpfile.js` file coupled with a `package.json` file, which together can be
+- A `gulpfile.js` file and a `package.json` file, which together can be
used to bootstrap a project and manage its dependencies.
-Snippets support between 1 and 10 files. They can be managed via Git (because they're [versioned](#versioned-snippets)
-by a Git repository), through the [Snippets API](../api/snippets.md), or in the GitLab UI.
-
-![Multi-file Snippet](img/gitlab_snippet_v13_5.png)
+You can manage these by using Git (because they're [versioned](#versioned-snippets)
+by a Git repository), through the [Snippets API](../api/snippets.md), and in the GitLab UI.
To add a new file to your snippet through the GitLab UI:
1. Go to your snippet in the GitLab UI.
-1. Click **Edit** in the top right.
+1. Select **Edit** in the top right corner.
1. Select **Add another file**.
1. Add your content to the file in the form fields provided.
-1. Click **Save changes**.
+1. Select **Save changes**.
To delete a file from your snippet through the GitLab UI:
1. Go to your snippet in the GitLab UI.
-1. Click **Edit** in the top right.
+1. Select **Edit** in the top right corner.
1. Select **Delete file** alongside the filename of each file
you wish to delete.
-1. Click **Save changes**.
-
-### Cloning snippets
+1. Select **Save changes**.
-Snippets can be cloned as a regular Git repository using SSH or HTTPS. Click the **Clone**
-button above the snippet content to copy the URL of your choice.
+## Clone snippets
-![Clone Snippet](img/snippet_clone_button_v13_0.png)
+Instead of copying a snippet to a local file, you may want to clone a snippet to
+preserve its relationship with the repository, so you can receive or make updates
+as needed. Select the **Clone** button on a snippet to display the URLs to clone with SSH or HTTPS:
-This allows you to have a local copy of the snippet's repository and make
-changes as needed. You can commit those changes and push them to the remote
-`master` branch.
+![Clone snippet](img/snippet_clone_button_v13_0.png)
-### Reduce snippets repository size
-
-Because versioned Snippets are considered as part of the [namespace storage size](../user/admin_area/settings/account_and_limit_settings.md),
-it's recommended to keep snippets' repositories as compact as possible.
-
-For more information about tools to compact repositories,
-see the documentation on [reducing repository size](../user/project/repository/reducing_the_repo_size_using_git.md).
+You can commit changes to a cloned snippet, and push the changes to GitLab.
-### Limitations
+## Embed snippets
-- Binary files are not supported.
-- Creating or deleting branches is not supported. Only a default `master` branch is used.
-- Git tags are not supported in snippet repositories.
-- Snippets' repositories are limited to 10 files. Attempting to push more
- than 10 files results in an error.
-- Revisions are not visible to the user on the GitLab UI, but this feature is planned
- in future iterations. See the [revisions tab issue](https://gitlab.com/gitlab-org/gitlab/-/issues/39271)
- for updates.
-- The [maximum size for a snippet](../administration/snippets/index.md#snippets-content-size-limit)
- is 50 MB, by default.
-- Git LFS is not supported.
+Public snippets can be shared and embedded on any website. You can reuse a GitLab snippet in multiple places, and any change to the source
+is reflected in the embedded snippets. When embedded, users can download it, or view the snippet in raw format.
-## Discover snippets
+To embed a snippet:
-There are two main ways of how you can discover snippets in GitLab.
+1. Confirm your snippet is publicly visible:
+ - *If it's a project snippet*, the project must be public.
+ - The snippet is publicly visible.
+ - In **Project > Settings > Permissions**, the snippets
+ permissions are set to **Everyone with access**.
+1. In your snippet's **Embed** section, select **Copy** to copy a one-line script you can add to any website or blog post. For example:
-For exploring all snippets that are visible to you, you can go to the Snippets
-dashboard of your GitLab instance via the top navigation. For GitLab.com you can
-navigate to an [overview]((https://gitlab.com/dashboard/snippets)) that shows snippets
-you created and allows you to explore all snippets.
+ ```html
+ <script src="https://gitlab.com/namespace/project/snippets/SNIPPET_ID.js"></script>
+ ```
-To discover snippets that belong to a specific project, navigate
-to the Snippets page via the left side navigation on the project page.
-Project snippets are enabled and available by default. You can
-disable them by navigating to your project's **Settings**, expanding
-**Visibility, project features, permissions** and scrolling down to
-**Snippets**. From there, you can toggle to disable them or select a
-different visibility level from the dropdown menu.
+1. Add your script to your file.
-## Snippet comments
+Embedded snippets display a header that shows:
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/12910) in GitLab 9.2.
+- The filename, if defined.
+- The snippet size.
+- A link to GitLab.
+- The actual snippet content.
-With GitLab Snippets you engage in a conversation about that piece of code,
-encouraging user collaboration.
+For example:
-## Downloading snippets
+<script src="https://gitlab.com/gitlab-org/gitlab-foss/snippets/1717978.js"></script>
-You can download the raw content of a snippet.
+## Download snippets
-By default snippets are downloaded with Linux-style line endings (`LF`). If
+You can download the raw content of a snippet. By default, they download with Linux-style line endings (`LF`). If
you want to preserve the original line endings you need to add a parameter `line_ending=raw`
(For example: `https://gitlab.com/snippets/SNIPPET_ID/raw?line_ending=raw`). In case a
snippet was created using the GitLab web interface the original line ending is Windows-like (`CRLF`).
-## Embedded snippets
-
-> Introduced in GitLab 10.8.
+## Comment on snippets
-Public snippets can not only be shared, but also embedded on any website. With
-this, you can reuse a GitLab snippet in multiple places and any change to the source
-is automatically reflected in the embedded snippet.
+With snippets, you engage in a conversation about that piece of code,
+which can encourage user collaboration.
-To embed a snippet, first make sure that:
+## Troubleshooting
-- The project is public (if it's a project snippet)
-- The snippet is public
-- In **Project > Settings > Permissions**, the snippets permissions are
- set to **Everyone with access**
+### Snippet limitations
-After the above conditions are met, the **Embed** section appears in your
-snippet. Click the **Copy** button to copy a one-line
-script that you can add to any website or blog post. For example:
-
-```html
-<script src="https://gitlab.com/namespace/project/snippets/SNIPPET_ID.js"></script>
-```
-
-Here's what an embedded snippet looks like:
-
-<script src="https://gitlab.com/gitlab-org/gitlab-foss/snippets/1717978.js"></script>
+- Binary files are not supported.
+- Creating or deleting branches is not supported. Only the default branch is used.
+- Git tags are not supported in snippet repositories.
+- Snippets' repositories are limited to 10 files. Attempting to push more
+ than 10 files results in an error.
+- Revisions are not visible to the user on the GitLab UI, but this feature is planned
+ in future iterations. See the [revisions tab issue](https://gitlab.com/gitlab-org/gitlab/-/issues/39271)
+ for updates.
+- The [maximum size for a snippet](../administration/snippets/index.md#snippets-content-size-limit)
+ is 50 MB, by default.
+- Git LFS is not supported.
-Embedded snippets are displayed with a header that shows:
+### Reduce snippets repository size
-- The filename, if defined.
-- The snippet size.
-- A link to GitLab.
-- The actual snippet content.
+Because versioned snippets are considered as part of the [namespace storage size](../user/admin_area/settings/account_and_limit_settings.md),
+it's recommended to keep snippets' repositories as compact as possible.
-Actions in the header enable users to see the snippet in raw format, and download it.
+For more information about tools to compact repositories,
+see the documentation on [reducing repository size](../user/project/repository/reducing_the_repo_size_using_git.md).
diff --git a/generator_templates/usage_metric_definition/metric_definition.yml b/generator_templates/usage_metric_definition/metric_definition.yml
index abe9a266dd6..4dbc3edbb54 100644
--- a/generator_templates/usage_metric_definition/metric_definition.yml
+++ b/generator_templates/usage_metric_definition/metric_definition.yml
@@ -1,6 +1,6 @@
---
# See Usage Ping metrics dictionary docs https://docs.gitlab.com/ee/development/usage_ping/metrics_dictionary.html
-key_path: <%= key_path %>
+key_path: <%= key_path %><%= metric_name_suggestion %>
description:
product_section:
product_stage:
@@ -8,7 +8,7 @@ product_group:
product_category:
value_type: <%= value_type %>
status: implemented
-milestone: <%= milestone %>
+milestone: "<%= milestone %>"
introduced_by_url:
time_frame: <%= time_frame %>
data_source:
diff --git a/jest.config.base.js b/jest.config.base.js
index 98c70735d92..4e9b84d1d34 100644
--- a/jest.config.base.js
+++ b/jest.config.base.js
@@ -27,7 +27,7 @@ module.exports = (path) => {
// workaround for eslint-import-resolver-jest only resolving in test files
// see https://github.com/JoinColony/eslint-import-resolver-jest#note
if (isESLint(module)) {
- testMatch = testMatch.map((path) => path.replace('_spec.js', ''));
+ testMatch = testMatch.map((modulePath) => modulePath.replace('_spec.js', ''));
}
const TEST_FIXTURES_PATTERN = 'test_fixtures(/.*)$';
diff --git a/lefthook.yml b/lefthook.yml
index 3469cd9bddf..9284b872e7f 100644
--- a/lefthook.yml
+++ b/lefthook.yml
@@ -5,32 +5,36 @@ pre-push:
run: bundle exec danger dry_run
eslint:
tags: frontend style
- files: git diff --name-only $(git merge-base origin/master HEAD)..HEAD
+ files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
glob: "*.{js,vue}"
- run: yarn eslint --cache --max-warnings 0 --report-unused-disable-directives {files}
+ run: yarn run lint:eslint {files}
haml-lint:
tags: view haml style
- files: git diff --name-only $(git merge-base origin/master HEAD)..HEAD
+ files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
glob: "*.html.haml"
run: bundle exec haml-lint --config .haml-lint.yml {files}
markdownlint:
tags: documentation style
- files: git diff --name-only $(git merge-base origin/master HEAD)..HEAD
+ files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
glob: "doc/*.md"
run: yarn markdownlint {files}
- scss-lint:
+ stylelint:
tags: stylesheet css style
- files: git diff --name-only $(git merge-base origin/master HEAD)..HEAD
+ files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
glob: "*.scss{,.css}"
- exclude: "app/assets/stylesheets/pages/emojis.scss"
- run: bundle exec scss-lint --config .scss-lint.yml {files}
+ run: yarn stylelint -q {files}
+ prettier:
+ tags: frontend style
+ files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
+ glob: "*.{js,vue,graphql}"
+ run: yarn run prettier --check {files}
rubocop:
tags: backend style
- files: git diff --name-only $(git merge-base origin/master HEAD)..HEAD
+ files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
glob: "*.rb"
run: bundle exec rubocop --parallel --force-exclusion {files}
vale: # Requires Vale: https://docs.gitlab.com/ee/development/documentation/#install-linters
tags: documentation style
- files: git diff --name-only $(git merge-base origin/master HEAD)..HEAD
+ files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
glob: "doc/*.md"
run: if command -v vale 2> /dev/null; then vale --config .vale.ini --minAlertLevel error {files}; else echo "Vale not found. Install Vale"; fi
diff --git a/lib/api/admin/plan_limits.rb b/lib/api/admin/plan_limits.rb
new file mode 100644
index 00000000000..92f7d3dce0d
--- /dev/null
+++ b/lib/api/admin/plan_limits.rb
@@ -0,0 +1,57 @@
+# frozen_string_literal: true
+
+module API
+ module Admin
+ class PlanLimits < ::API::Base
+ before { authenticated_as_admin! }
+
+ feature_category :not_owned
+
+ helpers do
+ def current_plan(name)
+ plan = ::Admin::PlansFinder.new({ name: name }).execute
+
+ not_found!('Plan') unless plan
+ plan
+ end
+ end
+
+ desc 'Get current plan limits' do
+ success Entities::PlanLimit
+ end
+ params do
+ optional :plan_name, type: String, values: Plan.all_plans, default: Plan::DEFAULT, desc: 'Name of the plan'
+ end
+ get "application/plan_limits" do
+ params = declared_params(include_missing: false)
+ plan = current_plan(params.delete(:plan_name))
+
+ present plan.actual_limits, with: Entities::PlanLimit
+ end
+
+ desc 'Modify plan limits' do
+ success Entities::PlanLimit
+ end
+ params do
+ requires :plan_name, type: String, values: Plan.all_plans, desc: 'Name of the plan'
+
+ optional :conan_max_file_size, type: Integer, desc: 'Maximum Conan package file size in bytes'
+ optional :generic_packages_max_file_size, type: Integer, desc: 'Maximum generic package file size in bytes'
+ optional :maven_max_file_size, type: Integer, desc: 'Maximum Maven package file size in bytes'
+ optional :npm_max_file_size, type: Integer, desc: 'Maximum NPM package file size in bytes'
+ optional :nuget_max_file_size, type: Integer, desc: 'Maximum NuGet package file size in bytes'
+ optional :pypi_max_file_size, type: Integer, desc: 'Maximum PyPI package file size in bytes'
+ end
+ put "application/plan_limits" do
+ params = declared_params(include_missing: false)
+ plan = current_plan(params.delete(:plan_name))
+
+ if plan.actual_limits.update(params)
+ present plan.actual_limits, with: Entities::PlanLimit
+ else
+ render_validation_error!(plan.actual_limits)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/api/api.rb b/lib/api/api.rb
index 0598f03c7ab..f83a36068dd 100644
--- a/lib/api/api.rb
+++ b/lib/api/api.rb
@@ -58,6 +58,7 @@ module API
user: -> { @current_user },
project: -> { @project },
namespace: -> { @group },
+ runner: -> { @current_runner || @runner },
caller_id: route.origin,
remote_ip: request.ip,
feature_category: feature_category
@@ -147,7 +148,7 @@ module API
# Only overwrite `text/plain+deprecated`
if content_types[api_format] == 'text/plain+deprecated'
- if Feature.enabled?(:api_always_use_application_json)
+ if Feature.enabled?(:api_always_use_application_json, default_enabled: :yaml)
content_type 'application/json'
else
content_type 'text/plain'
@@ -169,6 +170,7 @@ module API
mount ::API::AccessRequests
mount ::API::Admin::Ci::Variables
mount ::API::Admin::InstanceClusters
+ mount ::API::Admin::PlanLimits
mount ::API::Admin::Sidekiq
mount ::API::Appearance
mount ::API::Applications
diff --git a/lib/api/boards.rb b/lib/api/boards.rb
index 5fd4ca3546c..79f4b02f26a 100644
--- a/lib/api/boards.rb
+++ b/lib/api/boards.rb
@@ -30,7 +30,7 @@ module API
use :pagination
end
get '/' do
- authorize!(:read_board, user_project)
+ authorize!(:read_issue_board, user_project)
present paginate(board_parent.boards.with_associations), with: Entities::Board
end
@@ -39,7 +39,7 @@ module API
success Entities::Board
end
get '/:board_id' do
- authorize!(:read_board, user_project)
+ authorize!(:read_issue_board, user_project)
present board, with: Entities::Board
end
@@ -51,7 +51,7 @@ module API
requires :name, type: String, desc: 'The board name'
end
post '/' do
- authorize!(:admin_board, board_parent)
+ authorize!(:admin_issue_board, board_parent)
create_board
end
@@ -64,7 +64,7 @@ module API
use :update_params
end
put '/:board_id' do
- authorize!(:admin_board, board_parent)
+ authorize!(:admin_issue_board, board_parent)
update_board
end
@@ -75,7 +75,7 @@ module API
end
delete '/:board_id' do
- authorize!(:admin_board, board_parent)
+ authorize!(:admin_issue_board, board_parent)
delete_board
end
@@ -93,7 +93,7 @@ module API
use :pagination
end
get '/lists' do
- authorize!(:read_board, user_project)
+ authorize!(:read_issue_board, user_project)
present paginate(board_lists), with: Entities::List
end
@@ -105,7 +105,7 @@ module API
requires :list_id, type: Integer, desc: 'The ID of a list'
end
get '/lists/:list_id' do
- authorize!(:read_board, user_project)
+ authorize!(:read_issue_board, user_project)
present board_lists.find(params[:list_id]), with: Entities::List
end
@@ -117,7 +117,7 @@ module API
use :list_creation_params
end
post '/lists' do
- authorize!(:admin_list, user_project)
+ authorize!(:admin_issue_board_list, user_project)
create_list
end
@@ -133,7 +133,7 @@ module API
put '/lists/:list_id' do
list = board_lists.find(params[:list_id])
- authorize!(:admin_list, user_project)
+ authorize!(:admin_issue_board_list, user_project)
move_list(list)
end
@@ -146,7 +146,7 @@ module API
requires :list_id, type: Integer, desc: 'The ID of a board list'
end
delete "/lists/:list_id" do
- authorize!(:admin_list, user_project)
+ authorize!(:admin_issue_board_list, user_project)
list = board_lists.find(params[:list_id])
destroy_list(list)
diff --git a/lib/api/ci/runner.rb b/lib/api/ci/runner.rb
index 5cfb65e1fbb..80d5e80e21e 100644
--- a/lib/api/ci/runner.rb
+++ b/lib/api/ci/runner.rb
@@ -34,22 +34,22 @@ module API
if runner_registration_token_valid?
# Create shared runner. Requires admin access
attributes.merge(runner_type: :instance_type)
- elsif project = Project.find_by_runners_token(params[:token])
+ elsif @project = Project.find_by_runners_token(params[:token])
# Create a specific runner for the project
- attributes.merge(runner_type: :project_type, projects: [project])
- elsif group = Group.find_by_runners_token(params[:token])
+ attributes.merge(runner_type: :project_type, projects: [@project])
+ elsif @group = Group.find_by_runners_token(params[:token])
# Create a specific runner for the group
- attributes.merge(runner_type: :group_type, groups: [group])
+ attributes.merge(runner_type: :group_type, groups: [@group])
else
forbidden!
end
- runner = ::Ci::Runner.create(attributes)
+ @runner = ::Ci::Runner.create(attributes)
- if runner.persisted?
- present runner, with: Entities::RunnerRegistrationDetails
+ if @runner.persisted?
+ present @runner, with: Entities::RunnerRegistrationDetails
else
- render_validation_error!(runner)
+ render_validation_error!(@runner)
end
end
@@ -62,9 +62,7 @@ module API
delete '/' do
authenticate_runner!
- runner = ::Ci::Runner.find_by_token(params[:token])
-
- destroy_conditionally!(runner)
+ destroy_conditionally!(current_runner)
end
desc 'Validates authentication credentials' do
@@ -81,12 +79,7 @@ module API
end
resource :jobs do
- before do
- Gitlab::ApplicationContext.push(
- user: -> { current_job&.user },
- project: -> { current_job&.project }
- )
- end
+ before { set_application_context }
desc 'Request a job' do
success Entities::JobRequest::Response
diff --git a/lib/api/commit_statuses.rb b/lib/api/commit_statuses.rb
index 26af921432c..e199111c975 100644
--- a/lib/api/commit_statuses.rb
+++ b/lib/api/commit_statuses.rb
@@ -100,7 +100,12 @@ module API
attributes_for_keys(%w[target_url description coverage])
status.update(optional_attributes) if optional_attributes.any?
- render_validation_error!(status) if status.invalid?
+
+ if status.valid?
+ status.update_older_statuses_retried! if Feature.enabled?(:ci_fix_commit_status_retried, user_project, default_enabled: :yaml)
+ else
+ render_validation_error!(status)
+ end
begin
case params[:state]
diff --git a/lib/api/composer_packages.rb b/lib/api/composer_packages.rb
index 1181650fe96..ec7585363e2 100644
--- a/lib/api/composer_packages.rb
+++ b/lib/api/composer_packages.rb
@@ -93,6 +93,20 @@ module API
route_setting :authentication, job_token_allowed: true, basic_auth_personal_access_token: true
+ get ':id/-/packages/composer/p2/*package_name', requirements: COMPOSER_ENDPOINT_REQUIREMENTS, file_path: true do
+ not_found! if packages.empty?
+
+ presenter.package_versions
+ end
+
+ desc 'Composer packages endpoint at group level for package versions metadata'
+
+ params do
+ 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
+
get ':id/-/packages/composer/*package_name', requirements: COMPOSER_ENDPOINT_REQUIREMENTS, file_path: true do
not_found! if packages.empty?
not_found! if params[:sha].blank?
diff --git a/lib/api/concerns/packages/conan_endpoints.rb b/lib/api/concerns/packages/conan_endpoints.rb
index 1796d51324f..eb762be8285 100644
--- a/lib/api/concerns/packages/conan_endpoints.rb
+++ b/lib/api/concerns/packages/conan_endpoints.rb
@@ -42,7 +42,7 @@ module API
# Personal access token will be extracted from Bearer or Basic authorization
# in the overridden find_personal_access_token or find_user_from_job_token helpers
- authenticate!
+ authenticate_non_get!
end
desc 'Ping the Conan API' do
@@ -71,6 +71,10 @@ module API
end
namespace 'users' do
+ before do
+ authenticate!
+ end
+
format :txt
content_type :txt, 'text/plain'
diff --git a/lib/api/concerns/packages/npm_endpoints.rb b/lib/api/concerns/packages/npm_endpoints.rb
index 833288c6013..d6e006df976 100644
--- a/lib/api/concerns/packages/npm_endpoints.rb
+++ b/lib/api/concerns/packages/npm_endpoints.rb
@@ -41,8 +41,8 @@ module API
authorize_read_package!(project)
- packages = ::Packages::Npm::PackageFinder.new(project, package_name)
- .execute
+ packages = ::Packages::Npm::PackageFinder.new(package_name, project: project)
+ .execute
not_found! if packages.empty?
@@ -68,9 +68,8 @@ module API
authorize_create_package!(project)
- package = ::Packages::Npm::PackageFinder
- .new(project, package_name)
- .find_by_version(version)
+ package = ::Packages::Npm::PackageFinder.new(package_name, project: project)
+ .find_by_version(version)
not_found!('Package') unless package
::Packages::Npm::CreateTagService.new(package, tag).execute
@@ -112,9 +111,8 @@ module API
route_setting :authentication, job_token_allowed: true, deploy_token_allowed: true
get '*package_name', format: false, requirements: ::API::Helpers::Packages::Npm::NPM_ENDPOINT_REQUIREMENTS do
package_name = params[:package_name]
-
- packages = ::Packages::Npm::PackageFinder.new(project_or_nil, package_name)
- .execute
+ packages = ::Packages::Npm::PackageFinder.new(package_name, project: project_or_nil)
+ .execute
redirect_request = project_or_nil.blank? || packages.empty?
diff --git a/lib/api/entities/job_request/response.rb b/lib/api/entities/job_request/response.rb
index 8db9aff3dc9..bf22ea1e6e2 100644
--- a/lib/api/entities/job_request/response.rb
+++ b/lib/api/entities/job_request/response.rb
@@ -20,7 +20,7 @@ module API
model
end
- expose :variables
+ expose :runner_variables, as: :variables
expose :steps, using: Entities::JobRequest::Step
expose :image, using: Entities::JobRequest::Image
expose :services, using: Entities::JobRequest::Service
diff --git a/lib/api/entities/plan_limit.rb b/lib/api/entities/plan_limit.rb
new file mode 100644
index 00000000000..40e8b348c18
--- /dev/null
+++ b/lib/api/entities/plan_limit.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ class PlanLimit < Grape::Entity
+ expose :conan_max_file_size
+ expose :generic_packages_max_file_size
+ expose :maven_max_file_size
+ expose :npm_max_file_size
+ expose :nuget_max_file_size
+ expose :pypi_max_file_size
+ end
+ end
+end
diff --git a/lib/api/entities/project.rb b/lib/api/entities/project.rb
index 6ad6123a20e..e332e5e40fa 100644
--- a/lib/api/entities/project.rb
+++ b/lib/api/entities/project.rb
@@ -5,6 +5,8 @@ module API
class Project < BasicProjectDetails
include ::API::Helpers::RelatedResourcesHelpers
+ expose :container_registry_url, as: :container_registry_image_prefix, if: -> (_, _) { Gitlab.config.registry.enabled }
+
expose :_links do
expose :self do |project|
expose_url(api_v4_projects_path(id: project.id))
diff --git a/lib/api/entities/project_repository_storage_move.rb b/lib/api/entities/project_repository_storage_move.rb
deleted file mode 100644
index 191bbaf19d7..00000000000
--- a/lib/api/entities/project_repository_storage_move.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-module API
- module Entities
- class ProjectRepositoryStorageMove < BasicRepositoryStorageMove
- expose :project, using: Entities::ProjectIdentity
- end
- end
-end
diff --git a/lib/api/entities/projects/repository_storage_move.rb b/lib/api/entities/projects/repository_storage_move.rb
new file mode 100644
index 00000000000..7844cd36e02
--- /dev/null
+++ b/lib/api/entities/projects/repository_storage_move.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ module Projects
+ class RepositoryStorageMove < BasicRepositoryStorageMove
+ expose :project, using: Entities::ProjectIdentity
+ end
+ end
+ end
+end
diff --git a/lib/api/entities/protected_branch.rb b/lib/api/entities/protected_branch.rb
index 80c8a791053..e5dbaffb591 100644
--- a/lib/api/entities/protected_branch.rb
+++ b/lib/api/entities/protected_branch.rb
@@ -7,6 +7,7 @@ module API
expose :name
expose :push_access_levels, using: Entities::ProtectedRefAccess
expose :merge_access_levels, using: Entities::ProtectedRefAccess
+ expose :allow_force_push
end
end
end
diff --git a/lib/api/entities/public_group_details.rb b/lib/api/entities/public_group_details.rb
new file mode 100644
index 00000000000..0dfe28d251a
--- /dev/null
+++ b/lib/api/entities/public_group_details.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ class PublicGroupDetails < BasicGroupDetails
+ expose :avatar_url do |group, options|
+ group.avatar_url(only_path: false)
+ end
+ expose :full_name, :full_path
+ end
+ end
+end
diff --git a/lib/api/entities/snippets/repository_storage_move.rb b/lib/api/entities/snippets/repository_storage_move.rb
new file mode 100644
index 00000000000..4e14d1dfba2
--- /dev/null
+++ b/lib/api/entities/snippets/repository_storage_move.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ module Snippets
+ class RepositoryStorageMove < BasicRepositoryStorageMove
+ expose :snippet, using: Entities::BasicSnippet
+ end
+ end
+ end
+end
diff --git a/lib/api/group_boards.rb b/lib/api/group_boards.rb
index 7425e1bd145..90632048354 100644
--- a/lib/api/group_boards.rb
+++ b/lib/api/group_boards.rb
@@ -30,7 +30,7 @@ module API
use :pagination
end
get '/' do
- authorize!(:read_board, user_group)
+ authorize!(:read_issue_board, user_group)
present paginate(board_parent.boards.with_associations), with: Entities::Board
end
@@ -39,7 +39,7 @@ module API
success Entities::Board
end
get '/:board_id' do
- authorize!(:read_board, user_group)
+ authorize!(:read_issue_board, user_group)
present board, with: Entities::Board
end
@@ -51,7 +51,7 @@ module API
use :update_params
end
put '/:board_id' do
- authorize!(:admin_board, board_parent)
+ authorize!(:admin_issue_board, board_parent)
update_board
end
@@ -69,7 +69,7 @@ module API
use :pagination
end
get '/lists' do
- authorize!(:read_board, user_group)
+ authorize!(:read_issue_board, user_group)
present paginate(board_lists), with: Entities::List
end
@@ -81,7 +81,7 @@ module API
requires :list_id, type: Integer, desc: 'The ID of a list'
end
get '/lists/:list_id' do
- authorize!(:read_board, user_group)
+ authorize!(:read_issue_board, user_group)
present board_lists.find(params[:list_id]), with: Entities::List
end
@@ -93,7 +93,7 @@ module API
use :list_creation_params
end
post '/lists' do
- authorize!(:admin_list, user_group)
+ authorize!(:admin_issue_board_list, user_group)
create_list
end
@@ -109,7 +109,7 @@ module API
put '/lists/:list_id' do
list = board_lists.find(params[:list_id])
- authorize!(:admin_list, user_group)
+ authorize!(:admin_issue_board_list, user_group)
move_list(list)
end
@@ -122,7 +122,7 @@ module API
requires :list_id, type: Integer, desc: 'The ID of a board list'
end
delete "/lists/:list_id" do
- authorize!(:admin_list, user_group)
+ authorize!(:admin_issue_board_list, user_group)
list = board_lists.find(params[:list_id])
destroy_list(list)
diff --git a/lib/api/helpers.rb b/lib/api/helpers.rb
index 0abb21c9831..9db4a03c5b9 100644
--- a/lib/api/helpers.rb
+++ b/lib/api/helpers.rb
@@ -467,7 +467,7 @@ module API
def handle_api_exception(exception)
if report_exception?(exception)
define_params_for_grape_middleware
- Gitlab::ErrorTracking.with_context(current_user) do
+ Gitlab::ApplicationContext.with_context(user: current_user) do
Gitlab::ErrorTracking.track_exception(exception)
end
end
diff --git a/lib/api/helpers/issues_helpers.rb b/lib/api/helpers/issues_helpers.rb
index b303f1f845d..2b1ed479692 100644
--- a/lib/api/helpers/issues_helpers.rb
+++ b/lib/api/helpers/issues_helpers.rb
@@ -11,10 +11,7 @@ module API
params :optional_issue_params_ee do
end
- params :optional_issues_params_ee do
- end
-
- params :optional_issue_not_params_ee do
+ params :issues_stats_params_ee do
end
def self.update_params_at_least_one_of
diff --git a/lib/api/helpers/packages/conan/api_helpers.rb b/lib/api/helpers/packages/conan/api_helpers.rb
index 39ecfc171a9..d5f5448fd42 100644
--- a/lib/api/helpers/packages/conan/api_helpers.rb
+++ b/lib/api/helpers/packages/conan/api_helpers.rb
@@ -221,7 +221,7 @@ module API
def find_user_from_job_token
return unless route_authentication_setting[:job_token_allowed]
- job = find_job_from_token || raise(::Gitlab::Auth::UnauthorizedError)
+ job = find_job_from_token || return
@current_authenticated_job = job # rubocop:disable Gitlab/ModuleWithInstanceVariables
job.user
diff --git a/lib/api/helpers/packages/npm.rb b/lib/api/helpers/packages/npm.rb
index c1f6a001201..2d556f889bf 100644
--- a/lib/api/helpers/packages/npm.rb
+++ b/lib/api/helpers/packages/npm.rb
@@ -49,13 +49,28 @@ module API
when :project
params[:id]
when :instance
- ::Packages::Package.npm
- .with_name(params[:package_name])
- .first
- &.project_id
+ namespace_path = namespace_path_from_package_name
+ next unless namespace_path
+
+ namespace = Namespace.top_most
+ .by_path(namespace_path)
+ next unless namespace
+
+ finder = ::Packages::Npm::PackageFinder.new(params[:package_name], namespace: namespace)
+
+ finder.last&.project_id
end
end
end
+
+ # from "@scope/package-name" return "scope" or nil
+ def namespace_path_from_package_name
+ package_name = params[:package_name]
+ return unless package_name.starts_with?('@')
+ return unless package_name.include?('/')
+
+ package_name.match(Gitlab::Regex.npm_package_name_regex)&.captures&.first
+ end
end
end
end
diff --git a/lib/api/helpers/runner.rb b/lib/api/helpers/runner.rb
index 1c85669a626..39586483990 100644
--- a/lib/api/helpers/runner.rb
+++ b/lib/api/helpers/runner.rb
@@ -71,6 +71,15 @@ module API
header 'Job-Status', job.status
forbidden!(reason)
end
+
+ def set_application_context
+ return unless current_job
+
+ Gitlab::ApplicationContext.push(
+ user: -> { current_job.user },
+ project: -> { current_job.project }
+ )
+ end
end
end
end
diff --git a/lib/api/helpers/services_helpers.rb b/lib/api/helpers/services_helpers.rb
index 6101a8d307e..ed3d694f006 100644
--- a/lib/api/helpers/services_helpers.rb
+++ b/lib/api/helpers/services_helpers.rb
@@ -635,7 +635,7 @@ module API
required: true,
name: :google_iap_audience_client_id,
type: String,
- desc: 'Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)'
+ desc: 'Client ID of the IAP-secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)'
},
{
required: true,
diff --git a/lib/api/invitations.rb b/lib/api/invitations.rb
index 2ab1f97afe6..52c32b4d1cf 100644
--- a/lib/api/invitations.rb
+++ b/lib/api/invitations.rb
@@ -49,6 +49,39 @@ module API
present_member_invitations invitations
end
+ desc 'Updates a group or project invitation.' do
+ success Entities::Member
+ end
+ params do
+ requires :email, type: String, desc: 'The email address of the invitation.'
+ optional :access_level, type: Integer, values: Gitlab::Access.all_values, desc: 'A valid access level (defaults: `30`, developer access level).'
+ optional :expires_at, type: DateTime, desc: 'Date string in ISO 8601 format (`YYYY-MM-DDTHH:MM:SSZ`).'
+ end
+ put ":id/invitations/:email", requirements: { email: /[^\/]+/ } do
+ source = find_source(source_type, params.delete(:id))
+ invite_email = params[:email]
+ authorize_admin_source!(source_type, source)
+
+ invite = retrieve_member_invitations(source, invite_email).first
+ not_found! unless invite
+
+ update_params = declared_params(include_missing: false)
+ update_params.delete(:email)
+ bad_request! unless update_params.any?
+
+ result = ::Members::UpdateService
+ .new(current_user, update_params)
+ .execute(invite)
+
+ updated_member = result[:member]
+
+ if result[:status] == :success
+ present_members updated_member
+ else
+ render_validation_error!(updated_member)
+ end
+ end
+
desc 'Removes an invitation from a group or project.'
params do
requires :email, type: String, desc: 'The email address of the invitation'
diff --git a/lib/api/issues.rb b/lib/api/issues.rb
index ea09174f03a..13dac1c174c 100644
--- a/lib/api/issues.rb
+++ b/lib/api/issues.rb
@@ -15,6 +15,24 @@ module API
optional :labels, type: Array[String], coerce_with: ::API::Validations::Types::CommaSeparatedToArray.coerce, desc: 'Comma-separated list of label names'
optional :milestone, type: String, desc: 'Milestone title'
optional :iids, type: Array[Integer], coerce_with: ::API::Validations::Types::CommaSeparatedToIntegerArray.coerce, desc: 'The IID array of issues'
+
+ optional :author_id, type: Integer, desc: 'Return issues which are not authored by the user with the given ID'
+ optional :author_username, type: String, desc: 'Return issues which are not authored by the user with the given username'
+ mutually_exclusive :author_id, :author_username
+
+ optional :assignee_id, type: Integer, desc: 'Return issues which are not assigned to the user with the given ID'
+ optional :assignee_username, type: Array[String], check_assignees_count: true,
+ coerce_with: Validations::Validators::CheckAssigneesCount.coerce,
+ desc: 'Return issues which are not assigned to the user with the given username'
+ mutually_exclusive :assignee_id, :assignee_username
+
+ use :negatable_issue_filter_params_ee
+ end
+
+ params :issues_stats_params do
+ optional :labels, type: Array[String], coerce_with: ::API::Validations::Types::CommaSeparatedToArray.coerce, desc: 'Comma-separated list of label names'
+ optional :milestone, type: String, desc: 'Milestone title'
+ optional :iids, type: Array[Integer], coerce_with: ::API::Validations::Types::CommaSeparatedToIntegerArray.coerce, desc: 'The IID array of issues'
optional :search, type: String, desc: 'Search issues for text present in the title, description, or any combination of these'
optional :in, type: String, desc: '`title`, `description`, or a string joining them with comma'
@@ -29,11 +47,6 @@ module API
desc: 'Return issues which are assigned to the user with the given username'
mutually_exclusive :assignee_id, :assignee_username
- use :negatable_issue_filter_params_ee
- end
-
- params :issues_stats_params do
- use :negatable_issue_filter_params
optional :created_after, type: DateTime, desc: 'Return issues created after the specified time'
optional :created_before, type: DateTime, desc: 'Return issues created before the specified time'
optional :updated_after, type: DateTime, desc: 'Return issues updated after the specified time'
@@ -48,7 +61,7 @@ module API
optional :my_reaction_emoji, type: String, desc: 'Return issues reacted by the authenticated user by the given emoji'
optional :confidential, type: Boolean, desc: 'Filter confidential or public issues'
- use :optional_issues_params_ee
+ use :issues_stats_params_ee
end
params :issues_params do
diff --git a/lib/api/job_artifacts.rb b/lib/api/job_artifacts.rb
index 28737f61f61..033b7217c09 100644
--- a/lib/api/job_artifacts.rb
+++ b/lib/api/job_artifacts.rb
@@ -90,7 +90,7 @@ module API
build = find_build!(params[:job_id])
authorize_read_job_artifacts!(build)
- not_found! unless build.artifacts?
+ not_found! unless build.available_artifacts?
path = Gitlab::Ci::Build::Artifacts::Path
.new(params[:artifact_path])
diff --git a/lib/api/jobs.rb b/lib/api/jobs.rb
index 390dbc892e2..7390219b60e 100644
--- a/lib/api/jobs.rb
+++ b/lib/api/jobs.rb
@@ -8,10 +8,11 @@ module API
feature_category :continuous_integration
- params do
- requires :id, type: String, desc: 'The ID of a project'
- end
resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
+ params do
+ requires :id, type: String, desc: 'The ID of a project'
+ end
+
helpers do
params :optional_scope do
optional :scope, types: [String, Array[String]], desc: 'The scope of builds to show',
@@ -168,6 +169,20 @@ module API
end
end
+ resource :job do
+ desc 'Get current project using job token' do
+ success Entities::Ci::Job
+ end
+ route_setting :authentication, job_token_allowed: true
+ get do
+ # current_authenticated_job will be nil if user is using
+ # a valid authentication that is not CI_JOB_TOKEN
+ not_found!('Job') unless current_authenticated_job
+
+ present current_authenticated_job, with: Entities::Ci::Job
+ end
+ end
+
helpers do
# rubocop: disable CodeReuse/ActiveRecord
def filter_builds(builds, scope)
diff --git a/lib/api/nuget_project_packages.rb b/lib/api/nuget_project_packages.rb
index e071b6bd68f..73ecc140959 100644
--- a/lib/api/nuget_project_packages.rb
+++ b/lib/api/nuget_project_packages.rb
@@ -62,8 +62,9 @@ module API
file_name: PACKAGE_FILENAME
)
- package = ::Packages::Nuget::CreatePackageService.new(project_or_group, current_user, declared_params.merge(build: current_authenticated_job))
- .execute
+ package = ::Packages::CreateTemporaryPackageService.new(
+ project_or_group, current_user, declared_params.merge(build: current_authenticated_job)
+ ).execute(:nuget, name: ::Packages::Nuget::TEMPORARY_PACKAGE_NAME)
package_file = ::Packages::CreatePackageFileService.new(package, file_params.merge(build: current_authenticated_job))
.execute
diff --git a/lib/api/project_packages.rb b/lib/api/project_packages.rb
index 0fdaa4b2656..babc7b9dd58 100644
--- a/lib/api/project_packages.rb
+++ b/lib/api/project_packages.rb
@@ -70,7 +70,11 @@ module API
package = ::Packages::PackageFinder
.new(user_project, params[:package_id]).execute
- destroy_conditionally!(package)
+ destroy_conditionally!(package) do |package|
+ if package.destroy
+ package.sync_maven_metadata(current_user)
+ end
+ end
end
end
end
diff --git a/lib/api/project_repository_storage_moves.rb b/lib/api/project_repository_storage_moves.rb
index 196b7d88500..ab5d8b3a888 100644
--- a/lib/api/project_repository_storage_moves.rb
+++ b/lib/api/project_repository_storage_moves.rb
@@ -11,28 +11,28 @@ module API
resource :project_repository_storage_moves do
desc 'Get a list of all project repository storage moves' do
detail 'This feature was introduced in GitLab 13.0.'
- success Entities::ProjectRepositoryStorageMove
+ success Entities::Projects::RepositoryStorageMove
end
params do
use :pagination
end
get do
- storage_moves = ProjectRepositoryStorageMove.with_projects.order_created_at_desc
+ storage_moves = ::Projects::RepositoryStorageMove.with_projects.order_created_at_desc
- present paginate(storage_moves), with: Entities::ProjectRepositoryStorageMove, current_user: current_user
+ present paginate(storage_moves), with: Entities::Projects::RepositoryStorageMove, current_user: current_user
end
desc 'Get a project repository storage move' do
detail 'This feature was introduced in GitLab 13.0.'
- success Entities::ProjectRepositoryStorageMove
+ success Entities::Projects::RepositoryStorageMove
end
params do
requires :repository_storage_move_id, type: Integer, desc: 'The ID of a project repository storage move'
end
get ':repository_storage_move_id' do
- storage_move = ProjectRepositoryStorageMove.find(params[:repository_storage_move_id])
+ storage_move = ::Projects::RepositoryStorageMove.find(params[:repository_storage_move_id])
- present storage_move, with: Entities::ProjectRepositoryStorageMove, current_user: current_user
+ present storage_move, with: Entities::Projects::RepositoryStorageMove, current_user: current_user
end
desc 'Schedule bulk project repository storage moves' do
@@ -58,7 +58,7 @@ module API
resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
desc 'Get a list of all project repository storage moves' do
detail 'This feature was introduced in GitLab 13.1.'
- success Entities::ProjectRepositoryStorageMove
+ success Entities::Projects::RepositoryStorageMove
end
params do
use :pagination
@@ -66,12 +66,12 @@ module API
get ':id/repository_storage_moves' do
storage_moves = user_project.repository_storage_moves.with_projects.order_created_at_desc
- present paginate(storage_moves), with: Entities::ProjectRepositoryStorageMove, current_user: current_user
+ present paginate(storage_moves), with: Entities::Projects::RepositoryStorageMove, current_user: current_user
end
desc 'Get a project repository storage move' do
detail 'This feature was introduced in GitLab 13.1.'
- success Entities::ProjectRepositoryStorageMove
+ success Entities::Projects::RepositoryStorageMove
end
params do
requires :repository_storage_move_id, type: Integer, desc: 'The ID of a project repository storage move'
@@ -79,12 +79,12 @@ module API
get ':id/repository_storage_moves/:repository_storage_move_id' do
storage_move = user_project.repository_storage_moves.find(params[:repository_storage_move_id])
- present storage_move, with: Entities::ProjectRepositoryStorageMove, current_user: current_user
+ present storage_move, with: Entities::Projects::RepositoryStorageMove, current_user: current_user
end
desc 'Schedule a project repository storage move' do
detail 'This feature was introduced in GitLab 13.1.'
- success Entities::ProjectRepositoryStorageMove
+ success Entities::Projects::RepositoryStorageMove
end
params do
optional :destination_storage_name, type: String, desc: 'The destination storage shard'
@@ -95,7 +95,7 @@ module API
)
if storage_move.schedule
- present storage_move, with: Entities::ProjectRepositoryStorageMove, current_user: current_user
+ present storage_move, with: Entities::Projects::RepositoryStorageMove, current_user: current_user
else
render_validation_error!(storage_move)
end
diff --git a/lib/api/projects.rb b/lib/api/projects.rb
index fca68c3606b..19b63c28f89 100644
--- a/lib/api/projects.rb
+++ b/lib/api/projects.rb
@@ -136,6 +136,17 @@ module API
present records, options
end
+ def present_groups(groups)
+ options = {
+ with: Entities::PublicGroupDetails,
+ current_user: current_user
+ }
+
+ groups, options = with_custom_attributes(groups, options)
+
+ present paginate(groups), options
+ end
+
def translate_params_for_compatibility(params)
params[:builds_enabled] = params.delete(:jobs_enabled) if params.key?(:jobs_enabled)
params
@@ -561,6 +572,25 @@ module API
present paginate(users), with: Entities::UserBasic
end
+ desc 'Get ancestor and shared groups for a project' do
+ success Entities::PublicGroupDetails
+ end
+ params do
+ optional :search, type: String, desc: 'Return list of groups matching the search criteria'
+ optional :skip_groups, type: Array[Integer], coerce_with: ::API::Validations::Types::CommaSeparatedToIntegerArray.coerce, desc: 'Array of group ids to exclude from list'
+ optional :with_shared, type: Boolean, default: false,
+ desc: 'Include shared groups'
+ optional :shared_min_access_level, type: Integer, values: Gitlab::Access.all_values,
+ desc: 'Limit returned shared groups by minimum access level to the project'
+ use :pagination
+ end
+ get ':id/groups', feature_category: :source_code_management do
+ groups = ::Projects::GroupsFinder.new(project: user_project, current_user: current_user, params: declared_params(include_missing: false)).execute
+ groups = groups.search(params[:search]) if params[:search].present?
+
+ present_groups groups
+ end
+
desc 'Start the housekeeping task for a project' do
detail 'This feature was introduced in GitLab 9.0.'
end
diff --git a/lib/api/protected_branches.rb b/lib/api/protected_branches.rb
index 17574739a7c..802dfdec511 100644
--- a/lib/api/protected_branches.rb
+++ b/lib/api/protected_branches.rb
@@ -60,6 +60,9 @@ module API
optional :merge_access_level, type: Integer,
values: ProtectedBranch::MergeAccessLevel.allowed_access_levels,
desc: 'Access levels allowed to merge (defaults: `40`, maintainer access level)'
+ optional :allow_force_push, type: Boolean,
+ default: false,
+ desc: 'Allow force push for all users with push access.'
use :optional_params_ee
end
diff --git a/lib/api/repositories.rb b/lib/api/repositories.rb
index eaedd53aedb..f6ffeeea829 100644
--- a/lib/api/repositories.rb
+++ b/lib/api/repositories.rb
@@ -184,7 +184,7 @@ module API
type: String,
desc: 'The first commit in the range of commits to use for the changelog'
- requires :to,
+ optional :to,
type: String,
desc: 'The last commit in the range of commits to use for the changelog'
diff --git a/lib/api/resource_access_tokens.rb b/lib/api/resource_access_tokens.rb
index 66948f9eaf3..99c278be8e7 100644
--- a/lib/api/resource_access_tokens.rb
+++ b/lib/api/resource_access_tokens.rb
@@ -69,7 +69,7 @@ module API
).execute
if token_response.success?
- present token_response.payload[:access_token], with: Entities::PersonalAccessToken
+ present token_response.payload[:access_token], with: Entities::PersonalAccessTokenWithToken
else
bad_request!(token_response.message)
end
diff --git a/lib/api/rubygem_packages.rb b/lib/api/rubygem_packages.rb
index 7819aab879c..8d2d4586d8d 100644
--- a/lib/api/rubygem_packages.rb
+++ b/lib/api/rubygem_packages.rb
@@ -12,7 +12,7 @@ module API
# The Marshal version can be found by "#{Marshal::MAJOR_VERSION}.#{Marshal::MINOR_VERSION}"
# Updating the version should require a GitLab API version change.
MARSHAL_VERSION = '4.8'
-
+ PACKAGE_FILENAME = 'package.gem'
FILE_NAME_REQUIREMENTS = {
file_name: API::NO_SLASH_URL_PART_REGEX
}.freeze
@@ -26,7 +26,7 @@ module API
before do
require_packages_enabled!
- authenticate!
+ authenticate_non_get!
not_found! unless Feature.enabled?(:rubygem_packages, user_project)
end
@@ -64,8 +64,15 @@ module API
requires :file_name, type: String, desc: 'Package file name'
end
get "gems/:file_name", requirements: FILE_NAME_REQUIREMENTS do
- # To be implemented in https://gitlab.com/gitlab-org/gitlab/-/issues/299283
- not_found!
+ authorize!(:read_package, user_project)
+
+ package_file = ::Packages::PackageFile.for_rubygem_with_file_name(
+ user_project, params[:file_name]
+ ).last!
+
+ track_package_event('pull_package', :rubygems)
+
+ present_carrierwave_file!(package_file.file)
end
namespace 'api/v1' do
@@ -73,27 +80,69 @@ module API
detail 'This feature was introduced in GitLab 13.9'
end
post 'gems/authorize' do
- # To be implemented in https://gitlab.com/gitlab-org/gitlab/-/issues/299263
- not_found!
+ authorize_workhorse!(
+ subject: user_project,
+ has_length: false,
+ maximum_size: user_project.actual_limits.rubygems_max_file_size
+ )
end
desc 'Upload a gem' do
detail 'This feature was introduced in GitLab 13.9'
end
+ params do
+ requires :file, type: ::API::Validations::Types::WorkhorseFile, desc: 'The package file to be published (generated by Multipart middleware)'
+ end
post 'gems' do
- # To be implemented in https://gitlab.com/gitlab-org/gitlab/-/issues/299263
- not_found!
+ authorize_upload!(user_project)
+ bad_request!('File is too large') if user_project.actual_limits.exceeded?(:rubygems_max_file_size, params[:file].size)
+
+ track_package_event('push_package', :rubygems)
+
+ ActiveRecord::Base.transaction do
+ package = ::Packages::CreateTemporaryPackageService.new(
+ user_project, current_user, declared_params.merge(build: current_authenticated_job)
+ ).execute(:rubygems, name: ::Packages::Rubygems::TEMPORARY_PACKAGE_NAME)
+
+ file_params = {
+ file: params[:file],
+ file_name: PACKAGE_FILENAME
+ }
+
+ ::Packages::CreatePackageFileService.new(
+ package, file_params.merge(build: current_authenticated_job)
+ ).execute
+ end
+
+ created!
+ rescue ObjectStorage::RemoteStoreError => e
+ Gitlab::ErrorTracking.track_exception(e, extra: { file_name: params[:file_name], project_id: user_project.id })
+
+ forbidden!
end
desc 'Fetch a list of dependencies' do
detail 'This feature was introduced in GitLab 13.9'
end
params do
- optional :gems, type: String, desc: 'Comma delimited gem names'
+ optional :gems, type: Array[String], coerce_with: ::API::Validations::Types::CommaSeparatedToArray.coerce, desc: 'Comma delimited gem names'
end
get 'dependencies' do
- # To be implemented in https://gitlab.com/gitlab-org/gitlab/-/issues/299282
- not_found!
+ authorize_read_package!
+
+ if params[:gems].blank?
+ status :ok
+ else
+ results = params[:gems].map do |gem_name|
+ service_result = Packages::Rubygems::DependencyResolverService.new(user_project, current_user, gem_name: gem_name).execute
+ render_api_error!(service_result.message, service_result.http_status) if service_result.error?
+
+ service_result.payload
+ end
+
+ content_type 'application/octet-stream'
+ Marshal.dump(results.flatten)
+ end
end
end
end
diff --git a/lib/api/settings.rb b/lib/api/settings.rb
index e7ee8b08d87..64a72b4cb7f 100644
--- a/lib/api/settings.rb
+++ b/lib/api/settings.rb
@@ -91,6 +91,7 @@ module API
optional :import_sources, type: Array[String], coerce_with: Validations::Types::CommaSeparatedToArray.coerce,
values: %w[github bitbucket bitbucket_server gitlab google_code fogbugz git gitlab_project gitea manifest phabricator],
desc: 'Enabled sources for code import during project creation. OmniAuth must be configured for GitHub, Bitbucket, and GitLab.com'
+ optional :in_product_marketing_emails_enabled, type: Boolean, desc: 'By default, in-product marketing emails are enabled. To disable these emails, disable this option.'
optional :invisible_captcha_enabled, type: Boolean, desc: 'Enable Invisible Captcha spam detection during signup.'
optional :max_artifacts_size, type: Integer, desc: "Set the maximum file size for each job's artifacts"
optional :max_attachment_size, type: Integer, desc: 'Maximum attachment size in MB'
diff --git a/lib/api/snippet_repository_storage_moves.rb b/lib/api/snippet_repository_storage_moves.rb
index 84dbc03ba33..e3034191641 100644
--- a/lib/api/snippet_repository_storage_moves.rb
+++ b/lib/api/snippet_repository_storage_moves.rb
@@ -11,28 +11,28 @@ module API
resource :snippet_repository_storage_moves do
desc 'Get a list of all snippet repository storage moves' do
detail 'This feature was introduced in GitLab 13.8.'
- success Entities::SnippetRepositoryStorageMove
+ success Entities::Snippets::RepositoryStorageMove
end
params do
use :pagination
end
get do
- storage_moves = SnippetRepositoryStorageMove.order_created_at_desc
+ storage_moves = ::Snippets::RepositoryStorageMove.order_created_at_desc
- present paginate(storage_moves), with: Entities::SnippetRepositoryStorageMove, current_user: current_user
+ present paginate(storage_moves), with: Entities::Snippets::RepositoryStorageMove, current_user: current_user
end
desc 'Get a snippet repository storage move' do
detail 'This feature was introduced in GitLab 13.8.'
- success Entities::SnippetRepositoryStorageMove
+ success Entities::Snippets::RepositoryStorageMove
end
params do
requires :repository_storage_move_id, type: Integer, desc: 'The ID of a snippet repository storage move'
end
get ':repository_storage_move_id' do
- storage_move = SnippetRepositoryStorageMove.find(params[:repository_storage_move_id])
+ storage_move = ::Snippets::RepositoryStorageMove.find(params[:repository_storage_move_id])
- present storage_move, with: Entities::SnippetRepositoryStorageMove, current_user: current_user
+ present storage_move, with: Entities::Snippets::RepositoryStorageMove, current_user: current_user
end
desc 'Schedule bulk snippet repository storage moves' do
@@ -68,7 +68,7 @@ module API
desc 'Get a list of all snippets repository storage moves' do
detail 'This feature was introduced in GitLab 13.8.'
- success Entities::SnippetRepositoryStorageMove
+ success Entities::Snippets::RepositoryStorageMove
end
params do
use :pagination
@@ -76,12 +76,12 @@ module API
get ':id/repository_storage_moves' do
storage_moves = user_snippet.repository_storage_moves.order_created_at_desc
- present paginate(storage_moves), with: Entities::SnippetRepositoryStorageMove, current_user: current_user
+ present paginate(storage_moves), with: Entities::Snippets::RepositoryStorageMove, current_user: current_user
end
desc 'Get a snippet repository storage move' do
detail 'This feature was introduced in GitLab 13.8.'
- success Entities::SnippetRepositoryStorageMove
+ success Entities::Snippets::RepositoryStorageMove
end
params do
requires :repository_storage_move_id, type: Integer, desc: 'The ID of a snippet repository storage move'
@@ -89,12 +89,12 @@ module API
get ':id/repository_storage_moves/:repository_storage_move_id' do
storage_move = user_snippet.repository_storage_moves.find(params[:repository_storage_move_id])
- present storage_move, with: Entities::SnippetRepositoryStorageMove, current_user: current_user
+ present storage_move, with: Entities::Snippets::RepositoryStorageMove, current_user: current_user
end
desc 'Schedule a snippet repository storage move' do
detail 'This feature was introduced in GitLab 13.8.'
- success Entities::SnippetRepositoryStorageMove
+ success Entities::Snippets::RepositoryStorageMove
end
params do
optional :destination_storage_name, type: String, desc: 'The destination storage shard'
@@ -105,7 +105,7 @@ module API
)
if storage_move.schedule
- present storage_move, with: Entities::SnippetRepositoryStorageMove, current_user: current_user
+ present storage_move, with: Entities::Snippets::RepositoryStorageMove, current_user: current_user
else
render_validation_error!(storage_move)
end
diff --git a/lib/api/users.rb b/lib/api/users.rb
index f91e3c34ef2..b2f99bb18dc 100644
--- a/lib/api/users.rb
+++ b/lib/api/users.rb
@@ -58,6 +58,7 @@ module API
optional :color_scheme_id, type: Integer, desc: 'The color scheme for the file viewer'
optional :private_profile, type: Boolean, desc: 'Flag indicating the user has a private profile'
optional :note, type: String, desc: 'Admin note for this user'
+ optional :view_diffs_file_by_file, type: Boolean, desc: 'Flag indicating the user sees only one file diff per page'
all_or_none_of :extern_uid, :provider
use :optional_params_ee
@@ -82,6 +83,7 @@ module API
optional :search, type: String, desc: 'Search for a username'
optional :active, type: Boolean, default: false, desc: 'Filters only active users'
optional :external, type: Boolean, default: false, desc: 'Filters only external users'
+ optional :exclude_external, as: :non_external, type: Boolean, default: false, desc: 'Filters only non external users'
optional :blocked, type: Boolean, default: false, desc: 'Filters only blocked users'
optional :created_after, type: DateTime, desc: 'Return users created after the specified time'
optional :created_before, type: DateTime, desc: 'Return users created before the specified time'
@@ -97,7 +99,7 @@ module API
end
# rubocop: disable CodeReuse/ActiveRecord
get feature_category: :users do
- authenticated_as_admin! if params[:external].present? || (params[:extern_uid].present? && params[:provider].present?)
+ authenticated_as_admin! if params[:extern_uid].present? && params[:provider].present?
unless current_user&.admin?
params.except!(:created_after, :created_before, :order_by, :sort, :two_factor, :without_projects)
@@ -1071,10 +1073,7 @@ module API
put "status", feature_category: :users do
forbidden! unless can?(current_user, :update_user_status, current_user)
- update_params = declared_params
- update_params.delete(:clear_status_after) if Feature.disabled?(:clear_status_with_quick_options, current_user, default_enabled: :yaml)
-
- if ::Users::SetStatusService.new(current_user, update_params).execute
+ if ::Users::SetStatusService.new(current_user, declared_params).execute
present current_user.status, with: Entities::UserStatus
else
render_validation_error!(current_user.status)
diff --git a/lib/api/v3/github.rb b/lib/api/v3/github.rb
index 327335aec2d..2d25e76626a 100644
--- a/lib/api/v3/github.rb
+++ b/lib/api/v3/github.rb
@@ -194,13 +194,16 @@ module API
# Self-hosted Jira (tested on 7.11.1) requests this endpoint right
# after fetching branches.
+ # rubocop: disable CodeReuse/ActiveRecord
get ':namespace/:project/events' do
user_project = find_project_with_access(params)
merge_requests = authorized_merge_requests_for_project(user_project)
+ merge_requests = merge_requests.preload(:author, :assignees, :metrics, source_project: :namespace, target_project: :namespace)
present paginate(merge_requests), with: ::API::Github::Entities::PullRequestEvent
end
+ # rubocop: enable CodeReuse/ActiveRecord
params do
use :project_full_path
diff --git a/lib/api/wikis.rb b/lib/api/wikis.rb
index 3fa42be47a9..8441aeb10ab 100644
--- a/lib/api/wikis.rb
+++ b/lib/api/wikis.rb
@@ -111,7 +111,7 @@ module API
if response.success?
no_content!
else
- render_api_error!(reponse.message)
+ unprocessable_entity!(response.message)
end
end
diff --git a/lib/backup/repositories.rb b/lib/backup/repositories.rb
index d15114a72a3..79b7b2c61f2 100644
--- a/lib/backup/repositories.rb
+++ b/lib/backup/repositories.rb
@@ -201,7 +201,12 @@ module Backup
PoolRepository.includes(:source_project).find_each do |pool|
progress.puts " - Object pool #{pool.disk_path}..."
- pool.source_project ||= pool.member_projects.first.root_of_fork_network
+ pool.source_project ||= pool.member_projects.first&.root_of_fork_network
+ unless pool.source_project
+ progress.puts " - Object pool #{pool.disk_path}... " + "[SKIPPED]".color(:cyan)
+ next
+ end
+
pool.state = 'none'
pool.save
diff --git a/lib/banzai/filter/autolink_filter.rb b/lib/banzai/filter/autolink_filter.rb
index 0aa1ee8f604..d569711431c 100644
--- a/lib/banzai/filter/autolink_filter.rb
+++ b/lib/banzai/filter/autolink_filter.rb
@@ -120,7 +120,7 @@ module Banzai
end
def autolink_filter(text)
- Gitlab::StringRegexMarker.new(CGI.unescapeHTML(text), text.html_safe).mark(LINK_PATTERN) do |link, left:, right:|
+ Gitlab::StringRegexMarker.new(CGI.unescapeHTML(text), text.html_safe).mark(LINK_PATTERN) do |link, left:, right:, mode:|
autolink_match(link).html_safe
end
end
diff --git a/lib/banzai/filter/markdown_pre_escape_filter.rb b/lib/banzai/filter/markdown_pre_escape_filter.rb
index 9fd77c48659..bedc2d0fd04 100644
--- a/lib/banzai/filter/markdown_pre_escape_filter.rb
+++ b/lib/banzai/filter/markdown_pre_escape_filter.rb
@@ -24,8 +24,10 @@ module Banzai
# This filter does the initial surrounding, and MarkdownPostEscapeFilter
# does the conversion into span tags.
class MarkdownPreEscapeFilter < HTML::Pipeline::TextFilter
- ASCII_PUNCTUATION = %r{([\\][!"#$%&'()*+,-./:;<=>?@\[\\\]^_`{|}~])}.freeze
- LITERAL_KEYWORD = 'cmliteral'
+ # We just need to target those that are special GitLab references
+ REFERENCE_CHARACTERS = '@#!$&~%^'
+ ASCII_PUNCTUATION = %r{([\\][#{REFERENCE_CHARACTERS}])}.freeze
+ LITERAL_KEYWORD = 'cmliteral'
def call
return @text unless Feature.enabled?(:honor_escaped_markdown, context[:group] || context[:project]&.group)
diff --git a/lib/banzai/filter/sanitization_filter.rb b/lib/banzai/filter/sanitization_filter.rb
index f6314040f28..06dddc74eba 100644
--- a/lib/banzai/filter/sanitization_filter.rb
+++ b/lib/banzai/filter/sanitization_filter.rb
@@ -12,8 +12,8 @@ module Banzai
def customize_allowlist(allowlist)
# Allow table alignment; we allow specific text-align values in a
# transformer below
- allowlist[:attributes]['th'] = %w(style)
- allowlist[:attributes]['td'] = %w(style)
+ allowlist[:attributes]['th'] = %w[style]
+ allowlist[:attributes]['td'] = %w[style]
allowlist[:css] = { properties: ['text-align'] }
# Allow the 'data-sourcepos' from CommonMark on all elements
@@ -25,7 +25,7 @@ module Banzai
# Allow `id` in a and li elements for footnotes
# and remove any `id` properties not matching for footnotes
allowlist[:attributes]['a'].push('id')
- allowlist[:attributes]['li'] = %w(id)
+ allowlist[:attributes]['li'] = %w[id]
allowlist[:transformers].push(self.class.remove_non_footnote_ids)
allowlist
@@ -64,3 +64,5 @@ module Banzai
end
end
end
+
+Banzai::Filter::SanitizationFilter.prepend_if_ee('EE::Banzai::Filter::SanitizationFilter')
diff --git a/lib/banzai/filter/spaced_link_filter.rb b/lib/banzai/filter/spaced_link_filter.rb
index 101b55a49e4..f52ffe117d9 100644
--- a/lib/banzai/filter/spaced_link_filter.rb
+++ b/lib/banzai/filter/spaced_link_filter.rb
@@ -76,7 +76,7 @@ module Banzai
end
def spaced_link_filter(text)
- Gitlab::StringRegexMarker.new(CGI.unescapeHTML(text), text.html_safe).mark(LINK_OR_IMAGE_PATTERN) do |link, left:, right:|
+ Gitlab::StringRegexMarker.new(CGI.unescapeHTML(text), text.html_safe).mark(LINK_OR_IMAGE_PATTERN) do |link, left:, right:, mode:|
spaced_link_match(link).html_safe
end
end
diff --git a/lib/banzai/filter/video_link_filter.rb b/lib/banzai/filter/video_link_filter.rb
index 98987ee2019..3789a215dd8 100644
--- a/lib/banzai/filter/video_link_filter.rb
+++ b/lib/banzai/filter/video_link_filter.rb
@@ -15,7 +15,7 @@ module Banzai
end
def extra_element_attrs
- { width: "400" }
+ { width: "400", preload: "metadata" }
end
end
end
diff --git a/lib/bitbucket/collection.rb b/lib/bitbucket/collection.rb
index 9c496daccaa..a6a31de3ce6 100644
--- a/lib/bitbucket/collection.rb
+++ b/lib/bitbucket/collection.rb
@@ -11,13 +11,5 @@ module Bitbucket
lazy
end
-
- def method_missing(method, *args)
- return super unless self.respond_to?(method)
-
- self.__send__(method, *args) do |item| # rubocop:disable GitlabSecurity/PublicSend
- block_given? ? yield(item) : item
- end
- end
end
end
diff --git a/lib/bitbucket_server/collection.rb b/lib/bitbucket_server/collection.rb
index f549acbd87f..2880f587202 100644
--- a/lib/bitbucket_server/collection.rb
+++ b/lib/bitbucket_server/collection.rb
@@ -35,13 +35,5 @@ module BitbucketServer
current_page + 1
end
-
- def method_missing(method, *args)
- return super unless self.respond_to?(method)
-
- self.__send__(method, *args) do |item| # rubocop:disable GitlabSecurity/PublicSend
- block_given? ? yield(item) : item
- end
- end
end
end
diff --git a/lib/bulk_imports/common/loaders/entity_loader.rb b/lib/bulk_imports/common/loaders/entity_loader.rb
deleted file mode 100644
index 8644f3c9dcb..00000000000
--- a/lib/bulk_imports/common/loaders/entity_loader.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-module BulkImports
- module Common
- module Loaders
- class EntityLoader
- def initialize(*args); end
-
- def load(context, entity)
- context.bulk_import.entities.create!(entity)
- end
- end
- end
- end
-end
diff --git a/lib/bulk_imports/common/transformers/award_emoji_transformer.rb b/lib/bulk_imports/common/transformers/award_emoji_transformer.rb
deleted file mode 100644
index 260b47ab917..00000000000
--- a/lib/bulk_imports/common/transformers/award_emoji_transformer.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-# frozen_string_literal: true
-
-module BulkImports
- module Common
- module Transformers
- class AwardEmojiTransformer
- def initialize(*args); end
-
- def transform(context, data)
- user = find_user(context, data&.dig('user', 'public_email')) || context.current_user
-
- data
- .except('user')
- .merge('user_id' => user.id)
- end
-
- private
-
- def find_user(context, email)
- return if email.blank?
-
- context.group.users.find_by_any_email(email, confirmed: true) # rubocop: disable CodeReuse/ActiveRecord
- end
- end
- end
- end
-end
diff --git a/lib/bulk_imports/common/transformers/prohibited_attributes_transformer.rb b/lib/bulk_imports/common/transformers/prohibited_attributes_transformer.rb
index 858c4c8976b..38e2fc0b1b9 100644
--- a/lib/bulk_imports/common/transformers/prohibited_attributes_transformer.rb
+++ b/lib/bulk_imports/common/transformers/prohibited_attributes_transformer.rb
@@ -14,11 +14,9 @@ module BulkImports
/\Aremote_\w+_(url|urls|request_header)\Z/ # carrierwave automatically creates these attribute methods for uploads
).freeze
- def initialize(options = {})
- @options = options
- end
-
def transform(context, data)
+ return unless data
+
data.each_with_object({}) do |(key, value), result|
prohibited = prohibited_key?(key)
diff --git a/lib/bulk_imports/common/transformers/user_reference_transformer.rb b/lib/bulk_imports/common/transformers/user_reference_transformer.rb
new file mode 100644
index 00000000000..ca077b4ef43
--- /dev/null
+++ b/lib/bulk_imports/common/transformers/user_reference_transformer.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+# UserReferenceTransformer replaces specified user
+# reference key with a user id being either:
+# - A user id found by `public_email` in the group
+# - Current user id
+# under a new key `"#{@reference}_id"`.
+module BulkImports
+ module Common
+ module Transformers
+ class UserReferenceTransformer
+ DEFAULT_REFERENCE = 'user'
+
+ def initialize(options = {})
+ @reference = options[:reference] || DEFAULT_REFERENCE
+ @suffixed_reference = "#{@reference}_id"
+ end
+
+ def transform(context, data)
+ return unless data
+
+ user = find_user(context, data&.dig(@reference, 'public_email')) || context.current_user
+
+ data
+ .except(@reference)
+ .merge(@suffixed_reference => user.id)
+ end
+
+ private
+
+ def find_user(context, email)
+ return if email.blank?
+
+ context.group.users.find_by_any_email(email, confirmed: true) # rubocop: disable CodeReuse/ActiveRecord
+ end
+ end
+ end
+ end
+end
diff --git a/lib/bulk_imports/groups/extractors/subgroups_extractor.rb b/lib/bulk_imports/groups/extractors/subgroups_extractor.rb
index b01fb6f68ac..e5e2b9fdbd4 100644
--- a/lib/bulk_imports/groups/extractors/subgroups_extractor.rb
+++ b/lib/bulk_imports/groups/extractors/subgroups_extractor.rb
@@ -4,8 +4,6 @@ module BulkImports
module Groups
module Extractors
class SubgroupsExtractor
- def initialize(*args); end
-
def extract(context)
encoded_parent_path = ERB::Util.url_encode(context.entity.source_full_path)
diff --git a/lib/bulk_imports/groups/graphql/get_labels_query.rb b/lib/bulk_imports/groups/graphql/get_labels_query.rb
index d1fe791c2ce..23efbc33581 100644
--- a/lib/bulk_imports/groups/graphql/get_labels_query.rb
+++ b/lib/bulk_imports/groups/graphql/get_labels_query.rb
@@ -10,7 +10,7 @@ module BulkImports
<<-'GRAPHQL'
query ($full_path: ID!, $cursor: String) {
group(fullPath: $full_path) {
- labels(first: 100, after: $cursor) {
+ labels(first: 100, after: $cursor, onlyGroupLabels: true) {
page_info: pageInfo {
end_cursor: endCursor
has_next_page: hasNextPage
@@ -19,6 +19,8 @@ module BulkImports
title
description
color
+ created_at: createdAt
+ updated_at: updatedAt
}
}
}
diff --git a/lib/bulk_imports/groups/graphql/get_milestones_query.rb b/lib/bulk_imports/groups/graphql/get_milestones_query.rb
new file mode 100644
index 00000000000..2ade87e6fa0
--- /dev/null
+++ b/lib/bulk_imports/groups/graphql/get_milestones_query.rb
@@ -0,0 +1,54 @@
+# frozen_string_literal: true
+
+module BulkImports
+ module Groups
+ module Graphql
+ module GetMilestonesQuery
+ extend self
+
+ def to_s
+ <<-'GRAPHQL'
+ query ($full_path: ID!, $cursor: String) {
+ group(fullPath: $full_path) {
+ milestones(first: 100, after: $cursor, includeDescendants: false) {
+ page_info: pageInfo {
+ end_cursor: endCursor
+ has_next_page: hasNextPage
+ }
+ nodes {
+ title
+ description
+ state
+ start_date: startDate
+ due_date: dueDate
+ created_at: createdAt
+ updated_at: updatedAt
+ }
+ }
+ }
+ }
+ GRAPHQL
+ end
+
+ def variables(context)
+ {
+ full_path: context.entity.source_full_path,
+ cursor: context.entity.next_page_for(:milestones)
+ }
+ end
+
+ def base_path
+ %w[data group milestones]
+ end
+
+ def data_path
+ base_path << 'nodes'
+ end
+
+ def page_info_path
+ base_path << 'page_info'
+ end
+ end
+ end
+ end
+end
diff --git a/lib/bulk_imports/groups/loaders/group_loader.rb b/lib/bulk_imports/groups/loaders/group_loader.rb
index 386fc695182..a631685c2ad 100644
--- a/lib/bulk_imports/groups/loaders/group_loader.rb
+++ b/lib/bulk_imports/groups/loaders/group_loader.rb
@@ -4,10 +4,6 @@ module BulkImports
module Groups
module Loaders
class GroupLoader
- def initialize(options = {})
- @options = options
- end
-
def load(context, data)
return unless user_can_create_group?(context.current_user, data)
diff --git a/lib/bulk_imports/groups/loaders/labels_loader.rb b/lib/bulk_imports/groups/loaders/labels_loader.rb
deleted file mode 100644
index b8c9ba9609c..00000000000
--- a/lib/bulk_imports/groups/loaders/labels_loader.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-module BulkImports
- module Groups
- module Loaders
- class LabelsLoader
- def initialize(*); end
-
- def load(context, data)
- Labels::CreateService.new(data).execute(group: context.group)
- end
- end
- end
- end
-end
diff --git a/lib/bulk_imports/groups/loaders/members_loader.rb b/lib/bulk_imports/groups/loaders/members_loader.rb
deleted file mode 100644
index ccf44b31aee..00000000000
--- a/lib/bulk_imports/groups/loaders/members_loader.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-module BulkImports
- module Groups
- module Loaders
- class MembersLoader
- def initialize(*); end
-
- def load(context, data)
- return unless data
-
- context.group.members.create!(data)
- end
- end
- end
- end
-end
diff --git a/lib/bulk_imports/groups/pipelines/labels_pipeline.rb b/lib/bulk_imports/groups/pipelines/labels_pipeline.rb
index 40dab9b444c..9f8b8682751 100644
--- a/lib/bulk_imports/groups/pipelines/labels_pipeline.rb
+++ b/lib/bulk_imports/groups/pipelines/labels_pipeline.rb
@@ -11,7 +11,9 @@ module BulkImports
transformer Common::Transformers::ProhibitedAttributesTransformer
- loader BulkImports::Groups::Loaders::LabelsLoader
+ def load(context, data)
+ Labels::CreateService.new(data).execute(group: context.group)
+ end
def after_run(extracted_data)
context.entity.update_tracker_for(
diff --git a/lib/bulk_imports/groups/pipelines/members_pipeline.rb b/lib/bulk_imports/groups/pipelines/members_pipeline.rb
index b00c4c1a659..32fc931e8c3 100644
--- a/lib/bulk_imports/groups/pipelines/members_pipeline.rb
+++ b/lib/bulk_imports/groups/pipelines/members_pipeline.rb
@@ -12,7 +12,11 @@ module BulkImports
transformer Common::Transformers::ProhibitedAttributesTransformer
transformer BulkImports::Groups::Transformers::MemberAttributesTransformer
- loader BulkImports::Groups::Loaders::MembersLoader
+ def load(context, data)
+ return unless data
+
+ context.group.members.create!(data)
+ end
def after_run(extracted_data)
context.entity.update_tracker_for(
diff --git a/lib/bulk_imports/groups/pipelines/milestones_pipeline.rb b/lib/bulk_imports/groups/pipelines/milestones_pipeline.rb
new file mode 100644
index 00000000000..8497162e0e7
--- /dev/null
+++ b/lib/bulk_imports/groups/pipelines/milestones_pipeline.rb
@@ -0,0 +1,42 @@
+# frozen_string_literal: true
+
+module BulkImports
+ module Groups
+ module Pipelines
+ class MilestonesPipeline
+ include Pipeline
+
+ extractor BulkImports::Common::Extractors::GraphqlExtractor,
+ query: BulkImports::Groups::Graphql::GetMilestonesQuery
+
+ transformer Common::Transformers::ProhibitedAttributesTransformer
+
+ def load(context, data)
+ return unless data
+
+ raise ::BulkImports::Pipeline::NotAllowedError unless authorized?
+
+ context.group.milestones.create!(data)
+ end
+
+ def after_run(extracted_data)
+ context.entity.update_tracker_for(
+ relation: :milestones,
+ has_next_page: extracted_data.has_next_page?,
+ next_page: extracted_data.next_page
+ )
+
+ if extracted_data.has_next_page?
+ run
+ end
+ end
+
+ private
+
+ def authorized?
+ context.current_user.can?(:admin_milestone, context.group)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/bulk_imports/groups/pipelines/subgroup_entities_pipeline.rb b/lib/bulk_imports/groups/pipelines/subgroup_entities_pipeline.rb
index d7e1a118d0b..c47a8bd1daa 100644
--- a/lib/bulk_imports/groups/pipelines/subgroup_entities_pipeline.rb
+++ b/lib/bulk_imports/groups/pipelines/subgroup_entities_pipeline.rb
@@ -9,7 +9,10 @@ module BulkImports
extractor BulkImports::Groups::Extractors::SubgroupsExtractor
transformer Common::Transformers::ProhibitedAttributesTransformer
transformer BulkImports::Groups::Transformers::SubgroupToEntityTransformer
- loader BulkImports::Common::Loaders::EntityLoader
+
+ def load(context, data)
+ context.bulk_import.entities.create!(data)
+ end
end
end
end
diff --git a/lib/bulk_imports/groups/transformers/group_attributes_transformer.rb b/lib/bulk_imports/groups/transformers/group_attributes_transformer.rb
index 7de9a430421..23e898a7bb2 100644
--- a/lib/bulk_imports/groups/transformers/group_attributes_transformer.rb
+++ b/lib/bulk_imports/groups/transformers/group_attributes_transformer.rb
@@ -4,10 +4,6 @@ module BulkImports
module Groups
module Transformers
class GroupAttributesTransformer
- def initialize(options = {})
- @options = options
- end
-
def transform(context, data)
import_entity = context.entity
@@ -39,12 +35,11 @@ module BulkImports
end
def transform_parent(context, import_entity, data)
- current_user = context.current_user
- namespace = Namespace.find_by_full_path(import_entity.destination_namespace)
-
- return data if namespace == current_user.namespace
+ unless import_entity.destination_namespace.blank?
+ namespace = Namespace.find_by_full_path(import_entity.destination_namespace)
+ data['parent_id'] = namespace.id
+ end
- data['parent_id'] = namespace.id
data
end
diff --git a/lib/bulk_imports/groups/transformers/member_attributes_transformer.rb b/lib/bulk_imports/groups/transformers/member_attributes_transformer.rb
index 622f5b60ffe..e92c898171a 100644
--- a/lib/bulk_imports/groups/transformers/member_attributes_transformer.rb
+++ b/lib/bulk_imports/groups/transformers/member_attributes_transformer.rb
@@ -4,8 +4,6 @@ module BulkImports
module Groups
module Transformers
class MemberAttributesTransformer
- def initialize(*); end
-
def transform(context, data)
data
.then { |data| add_user(data) }
diff --git a/lib/bulk_imports/groups/transformers/subgroup_to_entity_transformer.rb b/lib/bulk_imports/groups/transformers/subgroup_to_entity_transformer.rb
index 6c3c299c2d2..676a6ca8d2a 100644
--- a/lib/bulk_imports/groups/transformers/subgroup_to_entity_transformer.rb
+++ b/lib/bulk_imports/groups/transformers/subgroup_to_entity_transformer.rb
@@ -4,8 +4,6 @@ module BulkImports
module Groups
module Transformers
class SubgroupToEntityTransformer
- def initialize(*args); end
-
def transform(context, entry)
{
source_type: :group_entity,
diff --git a/lib/bulk_imports/importers/group_importer.rb b/lib/bulk_imports/importers/group_importer.rb
index f967b7ad7ab..f016b552fd4 100644
--- a/lib/bulk_imports/importers/group_importer.rb
+++ b/lib/bulk_imports/importers/group_importer.rb
@@ -24,7 +24,8 @@ module BulkImports
BulkImports::Groups::Pipelines::GroupPipeline,
BulkImports::Groups::Pipelines::SubgroupEntitiesPipeline,
BulkImports::Groups::Pipelines::MembersPipeline,
- BulkImports::Groups::Pipelines::LabelsPipeline
+ BulkImports::Groups::Pipelines::LabelsPipeline,
+ BulkImports::Groups::Pipelines::MilestonesPipeline
]
end
end
diff --git a/lib/bulk_imports/pipeline.rb b/lib/bulk_imports/pipeline.rb
index 1d55ad95887..14445162737 100644
--- a/lib/bulk_imports/pipeline.rb
+++ b/lib/bulk_imports/pipeline.rb
@@ -3,9 +3,14 @@
module BulkImports
module Pipeline
extend ActiveSupport::Concern
+ include Gitlab::Utils::StrongMemoize
include Gitlab::ClassAttributes
include Runner
+ NotAllowedError = Class.new(StandardError)
+
+ CACHE_KEY_EXPIRATION = 2.hours
+
def initialize(context)
@context = context
end
@@ -15,16 +20,83 @@ module BulkImports
attr_reader :context
+ # Fetch pipeline extractor.
+ # An extractor is defined either by instance `#extract(context)` method
+ # or by using `extractor` DSL.
+ #
+ # @example
+ # class MyPipeline
+ # extractor MyExtractor, foo: :bar
+ # end
+ #
+ # class MyPipeline
+ # def extract(context)
+ # puts 'Fetch some data'
+ # end
+ # end
+ #
+ # If pipeline implements instance method `extract` - use it
+ # and ignore class `extractor` method implementation.
def extractor
- @extractor ||= instantiate(self.class.get_extractor)
+ @extractor ||= self.respond_to?(:extract) ? self : instantiate(self.class.get_extractor)
end
+ # Fetch pipeline transformers.
+ #
+ # A transformer can be defined using:
+ # - `transformer` class method
+ # - `transform` instance method
+ #
+ # Multiple transformers can be defined within a single
+ # pipeline and run sequentially for each record in the
+ # following order:
+ # - Transformers defined using `transformer` class method
+ # - Instance method `transform`
+ #
+ # Instance method `transform` is always the last to run.
+ #
+ # @example
+ # class MyPipeline
+ # transformer MyTransformerOne, foo: :bar
+ # transformer MyTransformerTwo, foo: :bar
+ #
+ # def transform(context, data)
+ # # perform transformation here
+ # end
+ # end
+ #
+ # In the example above `#transform` is the first to run and
+ # `MyTransformerTwo` method is the last.
def transformers
- @transformers ||= self.class.transformers.map(&method(:instantiate))
+ strong_memoize(:transformers) do
+ defined_transformers = self.class.transformers.map(&method(:instantiate))
+
+ transformers = []
+ transformers << self if respond_to?(:transform)
+ transformers.concat(defined_transformers)
+ transformers
+ end
end
+ # Fetch pipeline loader.
+ # A loader is defined either by instance method `#load(context, data)`
+ # or by using `loader` DSL.
+ #
+ # @example
+ # class MyPipeline
+ # loader MyLoader, foo: :bar
+ # end
+ #
+ # class MyPipeline
+ # def load(context, data)
+ # puts 'Load some data'
+ # end
+ # end
+ #
+ # If pipeline implements instance method `load` - use it
+ # and ignore class `loader` method implementation.
def loader
- @loaders ||= instantiate(self.class.get_loader)
+ @loader ||= self.respond_to?(:load) ? self : instantiate(self.class.get_loader)
end
def pipeline
@@ -32,7 +104,13 @@ module BulkImports
end
def instantiate(class_config)
- class_config[:klass].new(class_config[:options])
+ options = class_config[:options]
+
+ if options
+ class_config[:klass].new(class_config[:options])
+ else
+ class_config[:klass].new
+ end
end
def abort_on_failure?
@@ -58,7 +136,7 @@ module BulkImports
end
def transformers
- class_attributes[:transformers]
+ class_attributes[:transformers] || []
end
def get_loader
diff --git a/lib/bulk_imports/pipeline/runner.rb b/lib/bulk_imports/pipeline/runner.rb
index d39f4121b51..e3535e585cc 100644
--- a/lib/bulk_imports/pipeline/runner.rb
+++ b/lib/bulk_imports/pipeline/runner.rb
@@ -8,7 +8,7 @@ module BulkImports
MarkedAsFailedError = Class.new(StandardError)
def run
- raise MarkedAsFailedError if marked_as_failed?
+ raise MarkedAsFailedError if context.entity.failed?
info(message: 'Pipeline started')
@@ -40,7 +40,7 @@ module BulkImports
private # rubocop:disable Lint/UselessAccessModifier
def run_pipeline_step(step, class_name = nil)
- raise MarkedAsFailedError if marked_as_failed?
+ raise MarkedAsFailedError if context.entity.failed?
info(pipeline_step: step, step_class: class_name)
@@ -62,24 +62,13 @@ module BulkImports
end
def mark_as_failed
- warn(message: 'Pipeline failed', pipeline_class: pipeline)
+ warn(message: 'Pipeline failed')
context.entity.fail_op!
end
- def marked_as_failed?
- return true if context.entity.failed?
-
- false
- end
-
def log_skip(extra = {})
- log = {
- message: 'Skipping due to failed pipeline status',
- pipeline_class: pipeline
- }.merge(extra)
-
- info(log)
+ info({ message: 'Skipping due to failed pipeline status' }.merge(extra))
end
def log_import_failure(exception, step)
@@ -92,25 +81,39 @@ module BulkImports
correlation_id_value: Labkit::Correlation::CorrelationId.current_or_new_id
}
+ error(
+ pipeline_step: step,
+ exception_class: exception.class.to_s,
+ exception_message: exception.message
+ )
+
BulkImports::Failure.create(attributes)
end
+ def info(extra = {})
+ logger.info(log_params(extra))
+ end
+
def warn(extra = {})
logger.warn(log_params(extra))
end
- def info(extra = {})
- logger.info(log_params(extra))
+ def error(extra = {})
+ logger.error(log_params(extra))
end
def log_params(extra)
defaults = {
+ bulk_import_id: context.bulk_import.id,
bulk_import_entity_id: context.entity.id,
bulk_import_entity_type: context.entity.source_type,
- pipeline_class: pipeline
+ pipeline_class: pipeline,
+ context_extra: context.extra
}
- defaults.merge(extra).compact
+ defaults
+ .merge(extra)
+ .reject { |_key, value| value.blank? }
end
def logger
diff --git a/lib/csv_builder.rb b/lib/csv_builder.rb
index a9ef5a83ae8..6116009f171 100644
--- a/lib/csv_builder.rb
+++ b/lib/csv_builder.rb
@@ -16,6 +16,7 @@
class CsvBuilder
DEFAULT_ORDER_BY = 'id'.freeze
DEFAULT_BATCH_SIZE = 1000
+ PREFIX_REGEX = /^[=\+\-@;]/.freeze
attr_reader :rows_written
@@ -114,8 +115,8 @@ class CsvBuilder
def excel_sanitize(line)
return if line.nil?
+ return line unless line.is_a?(String) && line.match?(PREFIX_REGEX)
- line = ["'", line].join if line =~ /^[=\+\-@;]/
- line
+ ["'", line].join
end
end
diff --git a/lib/declarative_policy/policy_dsl.rb b/lib/declarative_policy/policy_dsl.rb
index 96741c0478e..69a2bbcc79e 100644
--- a/lib/declarative_policy/policy_dsl.rb
+++ b/lib/declarative_policy/policy_dsl.rb
@@ -6,7 +6,7 @@ module DeclarativePolicy
# Policy class (context_class here). See Base.rule
#
# Note that the #policy method just performs an #instance_eval,
- # which is useful for multiple #enable or #prevent callse.
+ # which is useful for multiple #enable or #prevent calls.
#
# Also provides a #method_missing proxy to the context
# class's class methods, so that helper methods can be
diff --git a/lib/error_tracking/sentry_client.rb b/lib/error_tracking/sentry_client.rb
new file mode 100644
index 00000000000..68e64fba093
--- /dev/null
+++ b/lib/error_tracking/sentry_client.rb
@@ -0,0 +1,100 @@
+# frozen_string_literal: true
+
+module ErrorTracking
+ class SentryClient
+ include SentryClient::Event
+ include SentryClient::Projects
+ include SentryClient::Issue
+ include SentryClient::Repo
+ include SentryClient::IssueLink
+
+ Error = Class.new(StandardError)
+ MissingKeysError = Class.new(StandardError)
+
+ attr_accessor :url, :token
+
+ def initialize(api_url, token)
+ @url = api_url
+ @token = token
+ end
+
+ private
+
+ def api_urls
+ @api_urls ||= SentryClient::ApiUrls.new(@url)
+ end
+
+ def handle_mapping_exceptions(&block)
+ yield
+ rescue KeyError => e
+ Gitlab::ErrorTracking.track_exception(e)
+ raise MissingKeysError, "Sentry API response is missing keys. #{e.message}"
+ end
+
+ def request_params
+ {
+ headers: {
+ 'Content-Type' => 'application/json',
+ 'Authorization' => "Bearer #{@token}"
+ },
+ follow_redirects: false
+ }
+ end
+
+ def http_get(url, params = {})
+ http_request do
+ Gitlab::HTTP.get(url, **request_params.merge(params))
+ end
+ end
+
+ def http_put(url, params = {})
+ http_request do
+ Gitlab::HTTP.put(url, **request_params.merge(body: params.to_json))
+ end
+ end
+
+ def http_post(url, params = {})
+ http_request do
+ Gitlab::HTTP.post(url, **request_params.merge(body: params.to_json))
+ end
+ end
+
+ def http_request
+ response = handle_request_exceptions do
+ yield
+ end
+
+ handle_response(response)
+ end
+
+ def handle_request_exceptions
+ yield
+ rescue Gitlab::HTTP::Error => e
+ Gitlab::ErrorTracking.track_exception(e)
+ raise_error 'Error when connecting to Sentry'
+ rescue Net::OpenTimeout
+ raise_error 'Connection to Sentry timed out'
+ rescue SocketError
+ raise_error 'Received SocketError when trying to connect to Sentry'
+ rescue OpenSSL::SSL::SSLError
+ raise_error 'Sentry returned invalid SSL data'
+ rescue Errno::ECONNREFUSED
+ raise_error 'Connection refused'
+ rescue => e
+ Gitlab::ErrorTracking.track_exception(e)
+ raise_error "Sentry request failed due to #{e.class}"
+ end
+
+ def handle_response(response)
+ unless response.code.between?(200, 204)
+ raise_error "Sentry response status code: #{response.code}"
+ end
+
+ { body: response.parsed_response, headers: response.headers }
+ end
+
+ def raise_error(message)
+ raise SentryClient::Error, message
+ end
+ end
+end
diff --git a/lib/error_tracking/sentry_client/api_urls.rb b/lib/error_tracking/sentry_client/api_urls.rb
new file mode 100644
index 00000000000..387309bfbdb
--- /dev/null
+++ b/lib/error_tracking/sentry_client/api_urls.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+module ErrorTracking
+ class SentryClient
+ class ApiUrls
+ def initialize(url_base)
+ @uri = URI(url_base).freeze
+ end
+
+ def issues_url
+ with_path(File.join(@uri.path, '/issues/'))
+ end
+
+ def issue_url(issue_id)
+ with_path("/api/0/issues/#{escape(issue_id)}/")
+ end
+
+ def projects_url
+ with_path('/api/0/projects/')
+ end
+
+ def issue_latest_event_url(issue_id)
+ with_path("/api/0/issues/#{escape(issue_id)}/events/latest/")
+ end
+
+ private
+
+ def with_path(new_path)
+ new_uri = @uri.dup
+ # Sentry API returns 404 if there are extra slashes in the URL
+ new_uri.path = new_path.squeeze('/')
+
+ new_uri
+ end
+
+ def escape(param)
+ CGI.escape(param.to_s)
+ end
+ end
+ end
+end
diff --git a/lib/error_tracking/sentry_client/event.rb b/lib/error_tracking/sentry_client/event.rb
new file mode 100644
index 00000000000..93449344d6c
--- /dev/null
+++ b/lib/error_tracking/sentry_client/event.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+module ErrorTracking
+ class SentryClient
+ module Event
+ def issue_latest_event(issue_id:)
+ latest_event = http_get(api_urls.issue_latest_event_url(issue_id))[:body]
+
+ map_to_event(latest_event)
+ end
+
+ private
+
+ def map_to_event(event)
+ stack_trace = parse_stack_trace(event)
+
+ Gitlab::ErrorTracking::ErrorEvent.new(
+ issue_id: event.dig('groupID'),
+ date_received: event.dig('dateReceived'),
+ stack_trace_entries: stack_trace
+ )
+ end
+
+ def parse_stack_trace(event)
+ exception_entry = event.dig('entries')&.detect { |h| h['type'] == 'exception' }
+ return [] unless exception_entry
+
+ exception_values = exception_entry.dig('data', 'values')
+ stack_trace_entry = exception_values&.detect { |h| h['stacktrace'].present? }
+ return [] unless stack_trace_entry
+
+ stack_trace_entry.dig('stacktrace', 'frames') || []
+ end
+ end
+ end
+end
diff --git a/lib/error_tracking/sentry_client/issue.rb b/lib/error_tracking/sentry_client/issue.rb
new file mode 100644
index 00000000000..513fb3daabe
--- /dev/null
+++ b/lib/error_tracking/sentry_client/issue.rb
@@ -0,0 +1,184 @@
+# frozen_string_literal: true
+
+module ErrorTracking
+ class SentryClient
+ module Issue
+ BadRequestError = Class.new(StandardError)
+ ResponseInvalidSizeError = Class.new(StandardError)
+
+ SENTRY_API_SORT_VALUE_MAP = {
+ # <accepted_by_client> => <accepted_by_sentry_api>
+ 'frequency' => 'freq',
+ 'first_seen' => 'new',
+ 'last_seen' => nil
+ }.freeze
+
+ def list_issues(**keyword_args)
+ response = get_issues(**keyword_args)
+
+ issues = response[:issues]
+ pagination = response[:pagination]
+
+ validate_size(issues)
+
+ handle_mapping_exceptions do
+ {
+ issues: map_to_errors(issues),
+ pagination: pagination
+ }
+ end
+ end
+
+ def issue_details(issue_id:)
+ issue = get_issue(issue_id: issue_id)
+
+ map_to_detailed_error(issue)
+ end
+
+ def update_issue(issue_id:, params:)
+ http_put(api_urls.issue_url(issue_id), params)[:body]
+ end
+
+ private
+
+ def get_issues(**keyword_args)
+ response = http_get(
+ api_urls.issues_url,
+ query: list_issue_sentry_query(**keyword_args)
+ )
+
+ {
+ issues: response[:body],
+ pagination: SentryClient::PaginationParser.parse(response[:headers])
+ }
+ 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
+
+ {
+ query: "is:#{issue_status} #{search_term}".strip,
+ limit: limit,
+ sort: SENTRY_API_SORT_VALUE_MAP[sort],
+ cursor: cursor
+ }.compact
+ end
+
+ 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}."
+ end
+
+ def get_issue(issue_id:)
+ http_get(api_urls.issue_url(issue_id))[:body]
+ end
+
+ def parse_gitlab_issue(issue)
+ parse_issue_annotations(issue) || parse_plugin_issue(issue)
+ end
+
+ def parse_issue_annotations(issue)
+ issue
+ .fetch('annotations', [])
+ .reject(&:blank?)
+ .map { |annotation| Nokogiri.make(annotation) }
+ .find { |html| html['href']&.starts_with?(Gitlab.config.gitlab.url) }
+ .try(:[], 'href')
+ end
+
+ def parse_plugin_issue(issue)
+ plugin_issues = issue.fetch('pluginIssues', nil)
+ return unless plugin_issues
+
+ gitlab_plugin = plugin_issues.detect { |item| item['id'] == 'gitlab' }
+ return unless gitlab_plugin
+
+ gitlab_plugin.dig('issue', 'url')
+ end
+
+ def issue_url(id)
+ parse_sentry_url("#{url}/issues/#{id}")
+ end
+
+ def project_url
+ parse_sentry_url(url)
+ end
+
+ def parse_sentry_url(api_url)
+ url = ErrorTracking::ProjectErrorTrackingSetting.extract_sentry_external_url(api_url)
+
+ uri = URI(url)
+ uri.path.squeeze!('/')
+ # Remove trailing slash
+ uri = uri.to_s.delete_suffix('/')
+
+ uri
+ end
+
+ def map_to_errors(issues)
+ issues.map(&method(:map_to_error))
+ end
+
+ def map_to_error(issue)
+ Gitlab::ErrorTracking::Error.new(
+ id: issue.fetch('id'),
+ first_seen: issue.fetch('firstSeen', nil),
+ last_seen: issue.fetch('lastSeen', nil),
+ title: issue.fetch('title', nil),
+ type: issue.fetch('type', nil),
+ user_count: issue.fetch('userCount', nil),
+ count: issue.fetch('count', nil),
+ message: issue.dig('metadata', 'value'),
+ culprit: issue.fetch('culprit', nil),
+ external_url: issue_url(issue.fetch('id')),
+ short_id: issue.fetch('shortId', nil),
+ status: issue.fetch('status', nil),
+ frequency: issue.dig('stats', '24h'),
+ project_id: issue.dig('project', 'id'),
+ project_name: issue.dig('project', 'name'),
+ project_slug: issue.dig('project', 'slug')
+ )
+ end
+
+ def map_to_detailed_error(issue)
+ Gitlab::ErrorTracking::DetailedError.new({
+ id: issue.fetch('id'),
+ first_seen: issue.fetch('firstSeen', nil),
+ last_seen: issue.fetch('lastSeen', nil),
+ tags: extract_tags(issue),
+ title: issue.fetch('title', nil),
+ type: issue.fetch('type', nil),
+ user_count: issue.fetch('userCount', nil),
+ count: issue.fetch('count', nil),
+ message: issue.dig('metadata', 'value'),
+ culprit: issue.fetch('culprit', nil),
+ external_url: issue_url(issue.fetch('id')),
+ external_base_url: project_url,
+ short_id: issue.fetch('shortId', nil),
+ status: issue.fetch('status', nil),
+ frequency: issue.dig('stats', '24h'),
+ gitlab_issue: parse_gitlab_issue(issue),
+ project_id: issue.dig('project', 'id'),
+ project_name: issue.dig('project', 'name'),
+ project_slug: issue.dig('project', 'slug'),
+ first_release_last_commit: issue.dig('firstRelease', 'lastCommit'),
+ first_release_short_version: issue.dig('firstRelease', 'shortVersion'),
+ first_release_version: issue.dig('firstRelease', 'version'),
+ last_release_last_commit: issue.dig('lastRelease', 'lastCommit'),
+ last_release_short_version: issue.dig('lastRelease', 'shortVersion'),
+ last_release_version: issue.dig('lastRelease', 'version')
+ })
+ end
+
+ def extract_tags(issue)
+ {
+ level: issue.fetch('level', nil),
+ logger: issue.fetch('logger', nil)
+ }
+ end
+ end
+ end
+end
diff --git a/lib/error_tracking/sentry_client/issue_link.rb b/lib/error_tracking/sentry_client/issue_link.rb
new file mode 100644
index 00000000000..1c2e8c4147a
--- /dev/null
+++ b/lib/error_tracking/sentry_client/issue_link.rb
@@ -0,0 +1,52 @@
+# frozen_string_literal: true
+
+module ErrorTracking
+ class SentryClient
+ module IssueLink
+ # Creates a link in Sentry corresponding to the provided
+ # Sentry issue and GitLab issue
+ # @param integration_id [Integer, nil] Representing a global
+ # GitLab integration in Sentry. Nil for plugins.
+ # @param sentry_issue_id [Integer] Id for an issue from Sentry
+ # @param issue [Issue] Issue for which the link should be created
+ def create_issue_link(integration_id, sentry_issue_id, issue)
+ return create_plugin_link(sentry_issue_id, issue) unless integration_id
+
+ create_global_integration_link(integration_id, sentry_issue_id, issue)
+ end
+
+ private
+
+ def create_global_integration_link(integration_id, sentry_issue_id, issue)
+ issue_link_url = global_integration_link_api_url(integration_id, sentry_issue_id)
+
+ params = {
+ project: issue.project.id,
+ externalIssue: "#{issue.project.id}##{issue.iid}"
+ }
+
+ http_put(issue_link_url, params)
+ end
+
+ def global_integration_link_api_url(integration_id, sentry_issue_id)
+ issue_link_url = URI(url)
+ issue_link_url.path = "/api/0/groups/#{sentry_issue_id}/integrations/#{integration_id}/"
+
+ issue_link_url
+ end
+
+ def create_plugin_link(sentry_issue_id, issue)
+ issue_link_url = plugin_link_api_url(sentry_issue_id)
+
+ http_post(issue_link_url, issue_id: issue.iid)
+ end
+
+ def plugin_link_api_url(sentry_issue_id)
+ issue_link_url = URI(url)
+ issue_link_url.path = "/api/0/issues/#{sentry_issue_id}/plugins/gitlab/link/"
+
+ issue_link_url
+ end
+ end
+ end
+end
diff --git a/lib/error_tracking/sentry_client/pagination_parser.rb b/lib/error_tracking/sentry_client/pagination_parser.rb
new file mode 100644
index 00000000000..362a5d098f7
--- /dev/null
+++ b/lib/error_tracking/sentry_client/pagination_parser.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+module ErrorTracking
+ class SentryClient
+ module PaginationParser
+ PATTERN = /rel=\"(?<direction>\w+)\";\sresults=\"(?<results>\w+)\";\scursor=\"(?<cursor>.+)\"/.freeze
+
+ def self.parse(headers)
+ links = headers['link'].to_s.split(',')
+
+ links.map { |link| parse_link(link) }.compact.to_h
+ end
+
+ def self.parse_link(link)
+ match = link.match(PATTERN)
+
+ return unless match
+ return if match['results'] != "true"
+
+ [match['direction'], { 'cursor' => match['cursor'] }]
+ end
+ private_class_method :parse_link
+ end
+ end
+end
diff --git a/lib/error_tracking/sentry_client/projects.rb b/lib/error_tracking/sentry_client/projects.rb
new file mode 100644
index 00000000000..9b8daa226b0
--- /dev/null
+++ b/lib/error_tracking/sentry_client/projects.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+module ErrorTracking
+ class SentryClient
+ module Projects
+ def projects
+ projects = get_projects
+
+ handle_mapping_exceptions do
+ map_to_projects(projects)
+ end
+ end
+
+ private
+
+ def get_projects
+ http_get(api_urls.projects_url)[:body]
+ end
+
+ def map_to_projects(projects)
+ projects.map(&method(:map_to_project))
+ end
+
+ def map_to_project(project)
+ organization = project.fetch('organization')
+
+ Gitlab::ErrorTracking::Project.new(
+ id: project.fetch('id', nil),
+ name: project.fetch('name'),
+ slug: project.fetch('slug'),
+ status: project.dig('status'),
+ organization_name: organization.fetch('name'),
+ organization_id: organization.fetch('id', nil),
+ organization_slug: organization.fetch('slug')
+ )
+ end
+ end
+ end
+end
diff --git a/lib/error_tracking/sentry_client/repo.rb b/lib/error_tracking/sentry_client/repo.rb
new file mode 100644
index 00000000000..3baa7e69be6
--- /dev/null
+++ b/lib/error_tracking/sentry_client/repo.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+module ErrorTracking
+ class SentryClient
+ module Repo
+ def repos(organization_slug)
+ repos_url = repos_api_url(organization_slug)
+
+ repos = http_get(repos_url)[:body]
+
+ handle_mapping_exceptions do
+ map_to_repos(repos)
+ end
+ end
+
+ private
+
+ def repos_api_url(organization_slug)
+ repos_url = URI(url)
+ repos_url.path = "/api/0/organizations/#{organization_slug}/repos/"
+
+ repos_url
+ end
+
+ def map_to_repos(repos)
+ repos.map(&method(:map_to_repo))
+ end
+
+ def map_to_repo(repo)
+ Gitlab::ErrorTracking::Repo.new(
+ status: repo.fetch('status'),
+ integration_id: repo.fetch('integrationId'),
+ project_id: repo.fetch('externalSlug')
+ )
+ end
+ end
+ end
+end
diff --git a/lib/expand_variables.rb b/lib/expand_variables.rb
index 06cebab8f0a..d172df4920f 100644
--- a/lib/expand_variables.rb
+++ b/lib/expand_variables.rb
@@ -45,6 +45,9 @@ module ExpandVariables
# Lazily initialise variables
variables = variables.call if variables.is_a?(Proc)
+ # Convert Collection to variables
+ variables = variables.to_hash if variables.is_a?(Gitlab::Ci::Variables::Collection)
+
# Convert hash array to variables
if variables.is_a?(Array)
variables = variables.reduce({}) do |hash, variable|
diff --git a/lib/feature/shared.rb b/lib/feature/shared.rb
index 5ad9af6ff7d..70e5b523adf 100644
--- a/lib/feature/shared.rb
+++ b/lib/feature/shared.rb
@@ -37,18 +37,6 @@ class Feature
push_frontend_feature_flag(:my_ops_flag, project, type: :ops)
EOS
},
- licensed: {
- description: 'Permanent feature flags used to temporarily disable licensed features.',
- deprecated: true,
- optional: true,
- rollout_issue: false,
- ee_only: true,
- default_enabled: true,
- example: <<-EOS
- project.feature_available?(:my_licensed_feature)
- namespace.feature_available?(:my_licensed_feature)
- EOS
- },
experiment: {
description: 'Short lived, used specifically to run A/B/n experiments.',
optional: true,
diff --git a/lib/generators/gitlab/usage_metric_definition_generator.rb b/lib/generators/gitlab/usage_metric_definition_generator.rb
index d3fac4c74f3..7a01050ed0c 100644
--- a/lib/generators/gitlab/usage_metric_definition_generator.rb
+++ b/lib/generators/gitlab/usage_metric_definition_generator.rb
@@ -18,6 +18,9 @@ module Gitlab
Directory.new('license', 'none', 'string')
].freeze
+ TOP_LEVEL_DIR = 'config'
+ TOP_LEVEL_DIR_EE = 'ee'
+
VALID_INPUT_DIRS = (TIME_FRAME_DIRS.flat_map { |d| [d.name, d.time_frame] } - %w(none)).freeze
source_root File.expand_path('../../../generator_templates/usage_metric_definition', __dir__)
@@ -56,15 +59,22 @@ module Gitlab
private
+ def metric_name_suggestion
+ return unless Feature.enabled?(:product_intelligence_metrics_names_suggestions, default_enabled: :yaml)
+
+ "\nname: #{Usage::Metrics::NamesSuggestions::Generator.generate(key_path)}"
+ end
+
def file_path
- path = File.join('config', 'metrics', directory&.name, "#{file_name}.yml")
- path = File.join('ee', path) if ee?
+ path = File.join(TOP_LEVEL_DIR, 'metrics', directory&.name, "#{file_name}.yml")
+ path = File.join(TOP_LEVEL_DIR_EE, path) if ee?
path
end
def validate!
raise "--dir option is required" unless input_dir.present?
raise "Invalid dir #{input_dir}, allowed options are #{VALID_INPUT_DIRS.join(', ')}" unless directory.present?
+ raise "Metric definition with key path '#{key_path}' already exists" if metric_definition_exists?
end
def ee?
@@ -79,11 +89,23 @@ module Gitlab
#
# 20210201124931_g_project_management_issue_title_changed_weekly.yml
def file_name
- "#{Time.now.utc.strftime("%Y%m%d%H%M%S")}_#{key_path.split('.').last}"
+ "#{Time.now.utc.strftime("%Y%m%d%H%M%S")}_#{metric_name}"
end
def directory
@directory ||= TIME_FRAME_DIRS.find { |d| d.match?(input_dir) }
end
+
+ def metric_name
+ key_path.split('.').last
+ end
+
+ def metric_definitions
+ @definitions ||= Gitlab::Usage::MetricDefinition.definitions
+ end
+
+ def metric_definition_exists?
+ metric_definitions[key_path].present?
+ end
end
end
diff --git a/lib/gitlab.rb b/lib/gitlab.rb
index ebf2cdd875a..11ecfb951aa 100644
--- a/lib/gitlab.rb
+++ b/lib/gitlab.rb
@@ -19,6 +19,10 @@ module Gitlab
Settings
end
+ def self.host_with_port
+ "#{self.config.gitlab.host}:#{self.config.gitlab.port}"
+ end
+
def self.revision
@_revision ||= begin
if File.exist?(root.join("REVISION"))
diff --git a/lib/gitlab/alert_management/payload/generic.rb b/lib/gitlab/alert_management/payload/generic.rb
index 0eb1bee8181..e2db9b62dd5 100644
--- a/lib/gitlab/alert_management/payload/generic.rb
+++ b/lib/gitlab/alert_management/payload/generic.rb
@@ -5,7 +5,7 @@ module Gitlab
module AlertManagement
module Payload
class Generic < Base
- DEFAULT_TITLE = 'New: Incident'
+ DEFAULT_TITLE = 'New: Alert'
attribute :description, paths: 'description'
attribute :ends_at, paths: 'end_time', type: :time
diff --git a/lib/gitlab/analytics/cycle_analytics/average.rb b/lib/gitlab/analytics/cycle_analytics/average.rb
new file mode 100644
index 00000000000..a449b71b165
--- /dev/null
+++ b/lib/gitlab/analytics/cycle_analytics/average.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Analytics
+ module CycleAnalytics
+ class Average
+ include Gitlab::Utils::StrongMemoize
+ include StageQueryHelpers
+
+ def initialize(stage:, query:)
+ @stage = stage
+ @query = query
+ end
+
+ def seconds
+ select_average ? select_average['average'] : nil
+ end
+
+ def days
+ seconds ? seconds.fdiv(1.day) : nil
+ end
+
+ private
+
+ attr_reader :stage
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def select_average
+ strong_memoize(:select_average) do
+ execute_query(@query.select(average_in_seconds.as('average')).reorder(nil)).first
+ end
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ def average
+ Arel::Nodes::NamedFunction.new(
+ 'AVG',
+ [duration]
+ )
+ end
+
+ def average_in_seconds
+ Arel::Nodes::Extract.new(average, :epoch)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/analytics/cycle_analytics/data_collector.rb b/lib/gitlab/analytics/cycle_analytics/data_collector.rb
index 5eca364a697..10a008a76d5 100644
--- a/lib/gitlab/analytics/cycle_analytics/data_collector.rb
+++ b/lib/gitlab/analytics/cycle_analytics/data_collector.rb
@@ -31,6 +31,12 @@ module Gitlab
end
end
+ def average
+ strong_memoize(:average) do
+ Average.new(stage: stage, query: query)
+ end
+ end
+
private
attr_reader :stage, :params
diff --git a/lib/gitlab/analytics/cycle_analytics/records_fetcher.rb b/lib/gitlab/analytics/cycle_analytics/records_fetcher.rb
index be5d9be3d64..178ebe0d4d4 100644
--- a/lib/gitlab/analytics/cycle_analytics/records_fetcher.rb
+++ b/lib/gitlab/analytics/cycle_analytics/records_fetcher.rb
@@ -29,6 +29,8 @@ module Gitlab
@stage = stage
@query = query
@params = params
+ @sort = params[:sort] || :end_event
+ @direction = params[:direction] || :desc
end
def serialized_records
@@ -52,7 +54,7 @@ module Gitlab
private
- attr_reader :stage, :query, :params
+ attr_reader :stage, :query, :params, :sort, :direction
def columns
MAPPINGS.fetch(subject_class).fetch(:columns_for_select).map do |column_name|
@@ -90,7 +92,7 @@ module Gitlab
end
def ordered_and_limited_query
- order_by_end_event(query, columns).limit(MAX_RECORDS)
+ order_by(query, sort, direction, columns).limit(MAX_RECORDS)
end
def records
diff --git a/lib/gitlab/analytics/cycle_analytics/sorting.rb b/lib/gitlab/analytics/cycle_analytics/sorting.rb
new file mode 100644
index 00000000000..828879d466d
--- /dev/null
+++ b/lib/gitlab/analytics/cycle_analytics/sorting.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Analytics
+ module CycleAnalytics
+ class Sorting
+ # rubocop: disable CodeReuse/ActiveRecord
+ SORTING_OPTIONS = {
+ end_event: {
+ asc: -> (query, stage) { query.reorder(stage.end_event.timestamp_projection.asc) },
+ desc: -> (query, stage) { query.reorder(stage.end_event.timestamp_projection.desc) }
+ }.freeze,
+ duration: {
+ asc: -> (query, stage) { query.reorder(Arel::Nodes::Subtraction.new(stage.end_event.timestamp_projection, stage.start_event.timestamp_projection).asc) },
+ desc: -> (query, stage) { query.reorder(Arel::Nodes::Subtraction.new(stage.end_event.timestamp_projection, stage.start_event.timestamp_projection).desc) }
+ }.freeze
+ }.freeze
+ # rubocop: enable CodeReuse/ActiveRecord,
+
+ def self.apply(query, stage, sort, direction)
+ sort_lambda = SORTING_OPTIONS.dig(sort, direction) || SORTING_OPTIONS.dig(:end_event, :desc)
+ sort_lambda.call(query, stage)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/analytics/cycle_analytics/stage_events.rb b/lib/gitlab/analytics/cycle_analytics/stage_events.rb
index 27fc8bd9a1a..02b1024b8b3 100644
--- a/lib/gitlab/analytics/cycle_analytics/stage_events.rb
+++ b/lib/gitlab/analytics/cycle_analytics/stage_events.rb
@@ -8,10 +8,12 @@ module Gitlab
# Issue: < 100
# MergeRequest: >= 100 && < 1000
# Custom events for default stages: >= 1000 (legacy)
+ #
+ # To avoid duplications, verify that the value does not exist in ee/lib/ee/gitlab/analytics/cycle_analytics/stage_events.rb
ENUM_MAPPING = {
StageEvents::IssueCreated => 1,
StageEvents::IssueFirstMentionedInCommit => 2,
- StageEvents::IssueDeployedToProduction => 3,
+ StageEvents::IssueDeployedToProduction => 10,
StageEvents::MergeRequestCreated => 100,
StageEvents::MergeRequestFirstDeployedToProduction => 101,
StageEvents::MergeRequestLastBuildFinished => 102,
diff --git a/lib/gitlab/analytics/cycle_analytics/stage_events/stage_event.rb b/lib/gitlab/analytics/cycle_analytics/stage_events/stage_event.rb
index 79738747e71..cfc9300a710 100644
--- a/lib/gitlab/analytics/cycle_analytics/stage_events/stage_event.rb
+++ b/lib/gitlab/analytics/cycle_analytics/stage_events/stage_event.rb
@@ -19,6 +19,10 @@ module Gitlab
raise NotImplementedError
end
+ def markdown_description
+ self.class.name
+ end
+
def self.identifier
raise NotImplementedError
end
diff --git a/lib/gitlab/analytics/cycle_analytics/stage_query_helpers.rb b/lib/gitlab/analytics/cycle_analytics/stage_query_helpers.rb
index 80e426e6e17..777a8278e6e 100644
--- a/lib/gitlab/analytics/cycle_analytics/stage_query_helpers.rb
+++ b/lib/gitlab/analytics/cycle_analytics/stage_query_helpers.rb
@@ -24,8 +24,8 @@ module Gitlab
end
# rubocop: disable CodeReuse/ActiveRecord
- def order_by_end_event(query, extra_columns_to_select = [:id])
- ordered_query = query.reorder(stage.end_event.timestamp_projection.desc)
+ def order_by(query, sort, direction, extra_columns_to_select = [:id])
+ ordered_query = Gitlab::Analytics::CycleAnalytics::Sorting.apply(query, stage, sort, direction)
# When filtering for more than one label, postgres requires the columns in ORDER BY to be present in the GROUP BY clause
if requires_grouping?
diff --git a/lib/gitlab/analytics/instance_statistics/workers_argument_builder.rb b/lib/gitlab/analytics/instance_statistics/workers_argument_builder.rb
deleted file mode 100644
index 54b3bbb3ce6..00000000000
--- a/lib/gitlab/analytics/instance_statistics/workers_argument_builder.rb
+++ /dev/null
@@ -1,47 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Analytics
- module InstanceStatistics
- class WorkersArgumentBuilder
- def initialize(measurement_identifiers: [], recorded_at: Time.zone.now)
- @measurement_identifiers = measurement_identifiers
- @recorded_at = recorded_at
- end
-
- def execute
- measurement_identifiers.map do |measurement_identifier|
- query_scope = query_mappings[measurement_identifier]&.call
-
- next if query_scope.nil?
-
- [measurement_identifier, *determine_start_and_finish(measurement_identifier, query_scope), recorded_at]
- end.compact
- end
-
- private
-
- attr_reader :measurement_identifiers, :recorded_at
-
- # Determining the query range (id range) as early as possible in order to get more accurate counts.
- def determine_start_and_finish(measurement_identifier, query_scope)
- queries = custom_min_max_queries[measurement_identifier]
-
- if queries
- [queries[:minimum_query].call, queries[:maximum_query].call]
- else
- [query_scope.minimum(:id), query_scope.maximum(:id)]
- end
- end
-
- def custom_min_max_queries
- ::Analytics::InstanceStatistics::Measurement.identifier_min_max_queries
- end
-
- def query_mappings
- ::Analytics::InstanceStatistics::Measurement.identifier_query_mapping
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/analytics/usage_trends/workers_argument_builder.rb b/lib/gitlab/analytics/usage_trends/workers_argument_builder.rb
new file mode 100644
index 00000000000..a502f46287d
--- /dev/null
+++ b/lib/gitlab/analytics/usage_trends/workers_argument_builder.rb
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Analytics
+ module UsageTrends
+ class WorkersArgumentBuilder
+ def initialize(measurement_identifiers: [], recorded_at: Time.zone.now)
+ @measurement_identifiers = measurement_identifiers
+ @recorded_at = recorded_at
+ end
+
+ def execute
+ measurement_identifiers.map do |measurement_identifier|
+ query_scope = query_mappings[measurement_identifier]&.call
+
+ next if query_scope.nil?
+
+ [measurement_identifier, *determine_start_and_finish(measurement_identifier, query_scope), recorded_at]
+ end.compact
+ end
+
+ private
+
+ attr_reader :measurement_identifiers, :recorded_at
+
+ # Determining the query range (id range) as early as possible in order to get more accurate counts.
+ def determine_start_and_finish(measurement_identifier, query_scope)
+ queries = custom_min_max_queries[measurement_identifier]
+
+ if queries
+ [queries[:minimum_query].call, queries[:maximum_query].call]
+ else
+ [query_scope.minimum(:id), query_scope.maximum(:id)]
+ end
+ end
+
+ def custom_min_max_queries
+ ::Analytics::UsageTrends::Measurement.identifier_min_max_queries
+ end
+
+ def query_mappings
+ ::Analytics::UsageTrends::Measurement.identifier_query_mapping
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/application_context.rb b/lib/gitlab/application_context.rb
index cefe983848c..a75da3a682b 100644
--- a/lib/gitlab/application_context.rb
+++ b/lib/gitlab/application_context.rb
@@ -4,6 +4,7 @@ module Gitlab
# A GitLab-rails specific accessor for `Labkit::Logging::ApplicationContext`
class ApplicationContext
include Gitlab::Utils::LazyAttributes
+ include Gitlab::Utils::StrongMemoize
Attribute = Struct.new(:name, :type)
@@ -11,6 +12,7 @@ module Gitlab
Attribute.new(:project, Project),
Attribute.new(:namespace, Namespace),
Attribute.new(:user, User),
+ Attribute.new(:runner, ::Ci::Runner),
Attribute.new(:caller_id, String),
Attribute.new(:remote_ip, String),
Attribute.new(:related_class, String),
@@ -27,8 +29,12 @@ module Gitlab
Labkit::Context.push(application_context.to_lazy_hash)
end
+ def self.current
+ Labkit::Context.current.to_h
+ end
+
def self.current_context_include?(attribute_name)
- Labkit::Context.current.to_h.include?(Labkit::Context.log_key(attribute_name))
+ current.include?(Labkit::Context.log_key(attribute_name))
end
def initialize(**args)
@@ -43,8 +49,9 @@ 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)
+ hash[:project] = -> { project_path } if set_values.include?(:project) || set_values.include?(:runner)
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)
@@ -71,7 +78,8 @@ module Gitlab
end
def project_path
- project&.full_path
+ associated_routable = project || runner_project
+ associated_routable&.full_path
end
def username
@@ -79,15 +87,43 @@ module Gitlab
end
def root_namespace_path
- if namespace
- namespace.full_path_components.first
+ associated_routable = namespace || project || runner_project || runner_group
+ associated_routable&.full_path_components&.first
+ end
+
+ def include_namespace?
+ set_values.include?(:namespace) || set_values.include?(:project) || set_values.include?(:runner)
+ end
+
+ def include_client?
+ set_values.include?(:user) || set_values.include?(:runner) || set_values.include?(:remote_ip)
+ end
+
+ def client
+ if user
+ "user/#{user.id}"
+ elsif runner
+ "runner/#{runner.id}"
else
- project&.full_path_components&.first
+ "ip/#{remote_ip}"
end
end
- def include_namespace?
- set_values.include?(:namespace) || set_values.include?(:project)
+ def runner_project
+ strong_memoize(:runner_project) do
+ next unless runner&.project_type?
+
+ projects = runner.projects.take(2) # rubocop: disable CodeReuse/ActiveRecord
+ projects.first if projects.one?
+ end
+ end
+
+ def runner_group
+ strong_memoize(:runner_group) do
+ next unless runner&.group_type?
+
+ runner.groups.first
+ end
end
end
end
diff --git a/lib/gitlab/application_rate_limiter.rb b/lib/gitlab/application_rate_limiter.rb
index 0a69a9c503d..f74edf2b767 100644
--- a/lib/gitlab/application_rate_limiter.rb
+++ b/lib/gitlab/application_rate_limiter.rb
@@ -47,7 +47,7 @@ module Gitlab
# @option scope [Array<ActiveRecord>] Array of ActiveRecord models to scope throttling to a specific request (e.g. per user per project)
# @option threshold [Integer] Optional threshold value to override default one registered in `.rate_limits`
# @option interval [Integer] Optional interval value to override default one registered in `.rate_limits`
- # @option users_allowlist [Array<String>] Optional list of usernames to excepted from the limit. This param will only be functional if Scope includes a current user.
+ # @option users_allowlist [Array<String>] Optional list of usernames to exclude from the limit. This param will only be functional if Scope includes a current user.
#
# @return [Boolean] Whether or not a request should be throttled
def throttled?(key, **options)
diff --git a/lib/gitlab/auth/current_user_mode.rb b/lib/gitlab/auth/current_user_mode.rb
index 0f327a39f61..a6d706c2a49 100644
--- a/lib/gitlab/auth/current_user_mode.rb
+++ b/lib/gitlab/auth/current_user_mode.rb
@@ -77,7 +77,7 @@ module Gitlab
return false unless user
Gitlab::SafeRequestStore.fetch(admin_mode_rs_key) do
- user.admin? && session_with_admin_mode?
+ user.admin? && (privileged_runtime? || session_with_admin_mode?)
end
end
@@ -154,6 +154,11 @@ module Gitlab
Gitlab::SafeRequestStore.delete(admin_mode_rs_key)
Gitlab::SafeRequestStore.delete(admin_mode_requested_rs_key)
end
+
+ # Runtimes which imply shell access get admin mode automatically, see Gitlab::Runtime
+ def privileged_runtime?
+ Gitlab::Runtime.rake? || Gitlab::Runtime.rails_runner? || Gitlab::Runtime.console?
+ end
end
end
end
diff --git a/lib/gitlab/auth/o_auth/provider.rb b/lib/gitlab/auth/o_auth/provider.rb
index 57ff3fcd1f0..ab6ac815601 100644
--- a/lib/gitlab/auth/o_auth/provider.rb
+++ b/lib/gitlab/auth/o_auth/provider.rb
@@ -5,11 +5,12 @@ module Gitlab
module OAuth
class Provider
LABELS = {
- "github" => "GitHub",
- "gitlab" => "GitLab.com",
- "google_oauth2" => "Google",
- "azure_oauth2" => "Azure AD",
- 'atlassian_oauth2' => 'Atlassian'
+ "github" => "GitHub",
+ "gitlab" => "GitLab.com",
+ "google_oauth2" => "Google",
+ "azure_oauth2" => "Azure AD",
+ "azure_activedirectory_v2" => "Azure AD v2",
+ 'atlassian_oauth2' => 'Atlassian'
}.freeze
def self.authentication(user, provider)
diff --git a/lib/gitlab/auth/o_auth/user.rb b/lib/gitlab/auth/o_auth/user.rb
index f556a7f40e9..fe1bf730e76 100644
--- a/lib/gitlab/auth/o_auth/user.rb
+++ b/lib/gitlab/auth/o_auth/user.rb
@@ -239,8 +239,9 @@ module Gitlab
end
def update_profile
- clear_user_synced_attributes_metadata
+ return unless gl_user
+ clear_user_synced_attributes_metadata
return unless sync_profile_from_provider? || creating_linked_ldap_user?
metadata = gl_user.build_user_synced_attributes_metadata
diff --git a/lib/gitlab/avatar_cache.rb b/lib/gitlab/avatar_cache.rb
new file mode 100644
index 00000000000..30c8e089061
--- /dev/null
+++ b/lib/gitlab/avatar_cache.rb
@@ -0,0 +1,86 @@
+# frozen_string_literal: true
+
+module Gitlab
+ class AvatarCache
+ class << self
+ # Increment this if a breaking change requires
+ # immediate cache expiry of all avatar caches.
+ #
+ # @return [Integer]
+ VERSION = 1
+
+ # @return [Symbol]
+ BASE_KEY = :avatar_cache
+
+ # @return [ActiveSupport::Duration]
+ DEFAULT_EXPIRY = 7.days
+
+ # Look up cached avatar data by email address.
+ # This accepts a block to provide the value to be
+ # cached in the event nothing is found.
+ #
+ # Multiple calls in the same request will be served from the
+ # request store.
+ #
+ # @param email [String]
+ # @param additional_keys [*Object] all must respond to `#to_s`
+ # @param expires_in [ActiveSupport::Duration, Integer]
+ # @yield [email, *additional_keys] yields the supplied params back to the block
+ # @return [String]
+ def by_email(email, *additional_keys, expires_in: DEFAULT_EXPIRY)
+ key = email_key(email)
+ subkey = additional_keys.join(":")
+
+ Gitlab::SafeRequestStore.fetch([key, subkey]) do
+ with do |redis|
+ # Look for existing cache value
+ cached = redis.hget(key, subkey)
+
+ # Return the cached entry if set
+ break cached unless cached.nil?
+
+ # Otherwise, call the block to get the value
+ to_cache = yield(email, *additional_keys).to_s
+
+ # Set it in the cache
+ redis.hset(key, subkey, to_cache)
+
+ # Update the expiry time
+ redis.expire(key, expires_in)
+
+ # Return this new value
+ break to_cache
+ end
+ end
+ end
+
+ # Remove one or more emails from the cache
+ #
+ # @param emails [String] one or more emails to delete
+ # @return [Integer] the number of keys deleted
+ def delete_by_email(*emails)
+ return 0 if emails.empty?
+
+ with do |redis|
+ keys = emails.map { |email| email_key(email) }
+
+ Gitlab::Instrumentation::RedisClusterValidator.allow_cross_slot_commands do
+ redis.unlink(*keys)
+ end
+ end
+ end
+
+ private
+
+ # @param email [String]
+ # @return [String]
+ def email_key(email)
+ "#{BASE_KEY}:v#{VERSION}:#{email}"
+ end
+
+ def with(&blk)
+ Gitlab::Redis::Cache.with(&blk) # rubocop:disable CodeReuse/ActiveRecord
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/background_migration/backfill_project_updated_at_after_repository_storage_move.rb b/lib/gitlab/background_migration/backfill_project_updated_at_after_repository_storage_move.rb
index 61eb3b332de..7484027a0fa 100644
--- a/lib/gitlab/background_migration/backfill_project_updated_at_after_repository_storage_move.rb
+++ b/lib/gitlab/background_migration/backfill_project_updated_at_after_repository_storage_move.rb
@@ -5,7 +5,7 @@ module Gitlab
# Update existent project update_at column after their repository storage was moved
class BackfillProjectUpdatedAtAfterRepositoryStorageMove
def perform(*project_ids)
- updated_repository_storages = ProjectRepositoryStorageMove.select("project_id, MAX(updated_at) as updated_at").where(project_id: project_ids).group(:project_id)
+ updated_repository_storages = Projects::RepositoryStorageMove.select("project_id, MAX(updated_at) as updated_at").where(project_id: project_ids).group(:project_id)
Project.connection.execute <<-SQL
WITH repository_storage_cte as (
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
new file mode 100644
index 00000000000..80693728e86
--- /dev/null
+++ b/lib/gitlab/background_migration/batching_strategies/primary_key_batching_strategy.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ module BatchingStrategies
+ # Generic batching class for use with a BatchedBackgroundMigration.
+ # Batches over the given table and column combination, returning the MIN() and MAX()
+ # values for the next batch as an array.
+ #
+ # If no more batches exist in the table, returns nil.
+ class PrimaryKeyBatchingStrategy
+ include Gitlab::Database::DynamicModelHelpers
+
+ # Finds and returns the next batch in the table.
+ #
+ # table_name - The table to batch over
+ # column_name - The column to batch over
+ # batch_min_value - The minimum value which the next batch will start at
+ # batch_size - The size of the next batch
+ def next_batch(table_name, column_name, batch_min_value:, batch_size:)
+ model_class = define_batchable_model(table_name)
+
+ quoted_column_name = model_class.connection.quote_column_name(column_name)
+ relation = model_class.where("#{quoted_column_name} >= ?", batch_min_value)
+ next_batch_bounds = nil
+
+ relation.each_batch(of: batch_size, column: column_name) do |batch| # rubocop:disable Lint/UnreachableLoop
+ next_batch_bounds = batch.pluck(Arel.sql("MIN(#{quoted_column_name}), MAX(#{quoted_column_name})")).first
+
+ break
+ end
+
+ next_batch_bounds
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/background_migration/copy_column_using_background_migration_job.rb b/lib/gitlab/background_migration/copy_column_using_background_migration_job.rb
index 16c0de39a3b..60682bd2ec1 100644
--- a/lib/gitlab/background_migration/copy_column_using_background_migration_job.rb
+++ b/lib/gitlab/background_migration/copy_column_using_background_migration_job.rb
@@ -2,13 +2,11 @@
module Gitlab
module BackgroundMigration
- # Background migration that extends CopyColumn to update the value of a
+ # Background migration that updates the value of a
# column using the value of another column in the same table.
#
# - The {start_id, end_id} arguments are at the start so that it can be used
- # with `queue_background_migration_jobs_by_range_at_intervals`
- # - Provides support for background job tracking through the use of
- # Gitlab::Database::BackgroundMigrationJob
+ # with `queue_batched_background_migration`
# - Uses sub-batching so that we can keep each update's execution time at
# low 100s ms, while being able to update more records per 2 minutes
# that we allow background migration jobs to be scheduled one after the other
@@ -22,28 +20,24 @@ module Gitlab
# start_id - The start ID of the range of rows to update.
# end_id - The end ID of the range of rows to update.
- # table - The name of the table that contains the columns.
- # primary_key - The primary key column of the table.
- # copy_from - The column containing the data to copy.
- # copy_to - The column to copy the data to.
+ # batch_table - The name of the table that contains the columns.
+ # batch_column - The name of the column we use to batch over the table.
# sub_batch_size - We don't want updates to take more than ~100ms
# This allows us to run multiple smaller batches during
# the minimum 2.minute interval that we can schedule jobs
- def perform(start_id, end_id, table, primary_key, copy_from, copy_to, sub_batch_size)
+ # copy_from - The column containing the data to copy.
+ # copy_to - The column to copy the data to.
+ def perform(start_id, end_id, batch_table, batch_column, sub_batch_size, copy_from, copy_to)
quoted_copy_from = connection.quote_column_name(copy_from)
quoted_copy_to = connection.quote_column_name(copy_to)
- parent_batch_relation = relation_scoped_to_range(table, primary_key, start_id, end_id)
+ parent_batch_relation = relation_scoped_to_range(batch_table, batch_column, start_id, end_id)
- parent_batch_relation.each_batch(column: primary_key, of: sub_batch_size) do |sub_batch|
+ parent_batch_relation.each_batch(column: batch_column, of: sub_batch_size) do |sub_batch|
sub_batch.update_all("#{quoted_copy_to}=#{quoted_copy_from}")
sleep(PAUSE_SECONDS)
end
-
- # We have to add all arguments when marking a job as succeeded as they
- # are all used to track the job by `queue_background_migration_jobs_by_range_at_intervals`
- mark_job_as_succeeded(start_id, end_id, table, primary_key, copy_from, copy_to, sub_batch_size)
end
private
@@ -52,10 +46,6 @@ module Gitlab
ActiveRecord::Base.connection
end
- def mark_job_as_succeeded(*arguments)
- Gitlab::Database::BackgroundMigrationJob.mark_all_as_succeeded(self.class.name, arguments)
- end
-
def relation_scoped_to_range(source_table, source_key_column, start_id, stop_id)
define_batchable_model(source_table).where(source_key_column => start_id..stop_id)
end
diff --git a/lib/gitlab/background_migration/merge_request_assignees_migration_progress_check.rb b/lib/gitlab/background_migration/merge_request_assignees_migration_progress_check.rb
deleted file mode 100644
index de0c357ab1c..00000000000
--- a/lib/gitlab/background_migration/merge_request_assignees_migration_progress_check.rb
+++ /dev/null
@@ -1,43 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module BackgroundMigration
- # rubocop: disable Style/Documentation
- class MergeRequestAssigneesMigrationProgressCheck
- include Gitlab::Utils::StrongMemoize
-
- RESCHEDULE_DELAY = 3.hours
- WORKER = 'PopulateMergeRequestAssigneesTable'
- DeadJobsError = Class.new(StandardError)
-
- def perform
- raise DeadJobsError, "Only dead background jobs in the queue for #{WORKER}" if !ongoing? && dead_jobs?
-
- if ongoing?
- BackgroundMigrationWorker.perform_in(RESCHEDULE_DELAY, self.class.name)
- else
- Feature.enable(:multiple_merge_request_assignees)
- end
- end
-
- private
-
- def dead_jobs?
- strong_memoize(:dead_jobs) do
- migration_klass.dead_jobs?(WORKER)
- end
- end
-
- def ongoing?
- strong_memoize(:ongoing) do
- migration_klass.exists?(WORKER) || migration_klass.retrying_jobs?(WORKER)
- end
- end
-
- def migration_klass
- Gitlab::BackgroundMigration
- end
- end
- # rubocop: enable Style/Documentation
- end
-end
diff --git a/lib/gitlab/background_migration/populate_finding_uuid_for_vulnerability_feedback.rb b/lib/gitlab/background_migration/populate_finding_uuid_for_vulnerability_feedback.rb
index 52b09e07fd5..dc31f995ae0 100644
--- a/lib/gitlab/background_migration/populate_finding_uuid_for_vulnerability_feedback.rb
+++ b/lib/gitlab/background_migration/populate_finding_uuid_for_vulnerability_feedback.rb
@@ -61,16 +61,12 @@ module Gitlab
private
def calculated_uuid
- Gitlab::UUID.v5(uuid_components)
- end
-
- def uuid_components
- [
- category,
- vulnerability_finding.primary_identifier.fingerprint,
- vulnerability_finding.location_fingerprint,
- project_id
- ].join('-')
+ ::Security::VulnerabilityUUID.generate(
+ report_type: category,
+ primary_identifier_fingerprint: vulnerability_finding.primary_identifier.fingerprint,
+ location_fingerprint: vulnerability_finding.location_fingerprint,
+ project_id: project_id
+ )
end
def finding_key
diff --git a/lib/gitlab/background_migration/populate_namespace_statistics.rb b/lib/gitlab/background_migration/populate_namespace_statistics.rb
new file mode 100644
index 00000000000..e352ae71de6
--- /dev/null
+++ b/lib/gitlab/background_migration/populate_namespace_statistics.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # 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)
+ end
+ end
+ end
+end
+
+Gitlab::BackgroundMigration::PopulateNamespaceStatistics.prepend_if_ee('EE::Gitlab::BackgroundMigration::PopulateNamespaceStatistics')
diff --git a/lib/gitlab/background_migration/populate_uuids_for_security_findings.rb b/lib/gitlab/background_migration/populate_uuids_for_security_findings.rb
index 3d3970f50e1..4aff9d1e2c1 100644
--- a/lib/gitlab/background_migration/populate_uuids_for_security_findings.rb
+++ b/lib/gitlab/background_migration/populate_uuids_for_security_findings.rb
@@ -10,7 +10,7 @@ module Gitlab
NOP_RELATION.new
end
- def perform(_scan_ids); end
+ def perform(*_scan_ids); end
end
end
end
diff --git a/lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid.rb b/lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid.rb
new file mode 100644
index 00000000000..7b18e617c81
--- /dev/null
+++ b/lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid.rb
@@ -0,0 +1,79 @@
+# frozen_string_literal: true
+
+# rubocop: disable Style/Documentation
+class Gitlab::BackgroundMigration::RecalculateVulnerabilitiesOccurrencesUuid
+ # rubocop: disable Gitlab/NamespacedClass
+ class VulnerabilitiesIdentifier < ActiveRecord::Base
+ self.table_name = "vulnerability_identifiers"
+ has_many :primary_findings, class_name: 'VulnerabilitiesFinding', inverse_of: :primary_identifier, foreign_key: 'primary_identifier_id'
+ end
+
+ class VulnerabilitiesFinding < ActiveRecord::Base
+ self.table_name = "vulnerability_occurrences"
+ belongs_to :primary_identifier, class_name: 'VulnerabilitiesIdentifier', inverse_of: :primary_findings, foreign_key: 'primary_identifier_id'
+ REPORT_TYPES = {
+ sast: 0,
+ dependency_scanning: 1,
+ container_scanning: 2,
+ dast: 3,
+ secret_detection: 4,
+ coverage_fuzzing: 5,
+ api_fuzzing: 6
+ }.with_indifferent_access.freeze
+ enum report_type: REPORT_TYPES
+ end
+
+ class CalculateFindingUUID
+ FINDING_NAMESPACES_IDS = {
+ development: "a143e9e2-41b3-47bc-9a19-081d089229f4",
+ test: "a143e9e2-41b3-47bc-9a19-081d089229f4",
+ staging: "a6930898-a1b2-4365-ab18-12aa474d9b26",
+ production: "58dc0f06-936c-43b3-93bb-71693f1b6570"
+ }.freeze
+
+ NAMESPACE_REGEX = /(\h{8})-(\h{4})-(\h{4})-(\h{4})-(\h{4})(\h{8})/.freeze
+ PACK_PATTERN = "NnnnnN".freeze
+
+ def self.call(value)
+ Digest::UUID.uuid_v5(namespace_id, value)
+ end
+
+ def self.namespace_id
+ namespace_uuid = FINDING_NAMESPACES_IDS.fetch(Rails.env.to_sym)
+ # Digest::UUID is broken when using an UUID in namespace_id
+ # https://github.com/rails/rails/issues/37681#issue-520718028
+ namespace_uuid.scan(NAMESPACE_REGEX).flatten.map { |s| s.to_i(16) }.pack(PACK_PATTERN)
+ end
+ end
+ # rubocop: enable Gitlab/NamespacedClass
+
+ def perform(start_id, end_id)
+ findings = VulnerabilitiesFinding
+ .joins(:primary_identifier)
+ .select(:id, :report_type, :fingerprint, :location_fingerprint, :project_id)
+ .where(id: start_id..end_id)
+
+ mappings = findings.each_with_object({}) do |finding, hash|
+ hash[finding] = { uuid: calculate_uuid_v5_for_finding(finding) }
+ end
+
+ ::Gitlab::Database::BulkUpdate.execute(%i[uuid], mappings)
+ end
+
+ private
+
+ def calculate_uuid_v5_for_finding(vulnerability_finding)
+ return unless vulnerability_finding
+
+ uuid_v5_name_components = {
+ report_type: vulnerability_finding.report_type,
+ primary_identifier_fingerprint: vulnerability_finding.fingerprint,
+ location_fingerprint: vulnerability_finding.location_fingerprint,
+ project_id: vulnerability_finding.project_id
+ }
+
+ name = uuid_v5_name_components.values.join('-')
+
+ CalculateFindingUUID.call(name)
+ end
+end
diff --git a/lib/gitlab/background_migration/set_default_iteration_cadences.rb b/lib/gitlab/background_migration/set_default_iteration_cadences.rb
new file mode 100644
index 00000000000..42f9d33ab71
--- /dev/null
+++ b/lib/gitlab/background_migration/set_default_iteration_cadences.rb
@@ -0,0 +1,60 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # rubocop:disable Style/Documentation
+ class SetDefaultIterationCadences
+ class Iteration < ApplicationRecord
+ self.table_name = 'sprints'
+ end
+
+ class IterationCadence < ApplicationRecord
+ self.table_name = 'iterations_cadences'
+
+ include BulkInsertSafe
+ end
+
+ class Group < ApplicationRecord
+ self.table_name = 'namespaces'
+
+ self.inheritance_column = :_type_disabled
+ end
+
+ def perform(*group_ids)
+ create_iterations_cadences(group_ids)
+ assign_iterations_cadences(group_ids)
+ end
+
+ private
+
+ def create_iterations_cadences(group_ids)
+ groups_with_cadence = IterationCadence.select(:group_id)
+
+ new_cadences = Group.where(id: group_ids).where.not(id: groups_with_cadence).map do |group|
+ last_iteration = Iteration.where(group_id: group.id).order(:start_date)&.last
+
+ next unless last_iteration
+
+ time = Time.now
+ IterationCadence.new(
+ group_id: group.id,
+ title: "#{group.name} Iterations",
+ start_date: last_iteration.start_date,
+ last_run_date: last_iteration.start_date,
+ automatic: false,
+ created_at: time,
+ updated_at: time
+ )
+ end
+
+ IterationCadence.bulk_insert!(new_cadences.compact, skip_duplicates: true)
+ end
+
+ def assign_iterations_cadences(group_ids)
+ IterationCadence.where(group_id: group_ids).each do |cadence|
+ Iteration.where(iterations_cadence_id: nil).where(group_id: cadence.group_id).update_all(iterations_cadence_id: cadence.id)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/blame.rb b/lib/gitlab/blame.rb
index 5382bdab7eb..78a8f39e143 100644
--- a/lib/gitlab/blame.rb
+++ b/lib/gitlab/blame.rb
@@ -19,16 +19,14 @@ module Gitlab
commit = Commit.new(commit, project)
commit.lazy_author # preload author
- sha = commit.sha
- if prev_sha != sha
+ if prev_sha != commit.sha
groups << current_group if current_group
current_group = { commit: commit, lines: [] }
end
- line = highlighted_lines[i].html_safe if highlight
- current_group[:lines] << line
+ current_group[:lines] << (highlight ? highlighted_lines[i].html_safe : line)
- prev_sha = sha
+ prev_sha = commit.sha
i += 1
end
groups << current_group if current_group
diff --git a/lib/gitlab/checks/branch_check.rb b/lib/gitlab/checks/branch_check.rb
index ad2a718ef67..a8287a97cc3 100644
--- a/lib/gitlab/checks/branch_check.rb
+++ b/lib/gitlab/checks/branch_check.rb
@@ -51,7 +51,7 @@ module Gitlab
logger.log_timed(LOG_MESSAGES[:protected_branch_checks]) do
return unless ProtectedBranch.protected?(project, branch_name) # rubocop:disable Cop/AvoidReturnFromBlocks
- if forced_push?
+ if forced_push? && !ProtectedBranch.allow_force_push?(project, branch_name)
raise GitAccess::ForbiddenError, ERROR_MESSAGES[:force_push_protected_branch]
end
end
diff --git a/lib/gitlab/checks/lfs_check.rb b/lib/gitlab/checks/lfs_check.rb
index b70a6a69b93..38f0b82c8b4 100644
--- a/lib/gitlab/checks/lfs_check.rb
+++ b/lib/gitlab/checks/lfs_check.rb
@@ -13,6 +13,7 @@ module Gitlab
return unless project.lfs_enabled?
return if skip_lfs_integrity_check
+ return if deletion?
logger.log_timed(LOG_MESSAGE) do
lfs_check = Checks::LfsIntegrity.new(project, newrev, logger.time_left)
diff --git a/lib/gitlab/ci/build/context/build.rb b/lib/gitlab/ci/build/context/build.rb
index dfd86d3ad72..641aa71fb4e 100644
--- a/lib/gitlab/ci/build/context/build.rb
+++ b/lib/gitlab/ci/build/context/build.rb
@@ -21,7 +21,7 @@ module Gitlab
# to the CI variables to evaluate rules before we persist a Build
# with the result. We should refactor away the extra Build.new,
# but be able to get CI Variables directly from the Seed::Build.
- stub_build.scoped_variables_hash
+ stub_build.scoped_variables
end
end
diff --git a/lib/gitlab/ci/build/context/global.rb b/lib/gitlab/ci/build/context/global.rb
index fdd3ac358d5..dd0bc54d8b2 100644
--- a/lib/gitlab/ci/build/context/global.rb
+++ b/lib/gitlab/ci/build/context/global.rb
@@ -19,8 +19,7 @@ module Gitlab
# to the CI variables to evaluate workflow:rules
# with the result. We should refactor away the extra Build.new,
# but be able to get CI Variables directly from the Seed::Build.
- stub_build.scoped_variables_hash
- .reject { |key, _value| key =~ /\ACI_(JOB|BUILD)/ }
+ stub_build.scoped_variables.reject { |var| var[:key] =~ /\ACI_(JOB|BUILD)/ }
end
end
diff --git a/lib/gitlab/ci/build/credentials/registry/dependency_proxy.rb b/lib/gitlab/ci/build/credentials/registry/dependency_proxy.rb
index b6ac06cfb53..76eec2172b1 100644
--- a/lib/gitlab/ci/build/credentials/registry/dependency_proxy.rb
+++ b/lib/gitlab/ci/build/credentials/registry/dependency_proxy.rb
@@ -7,7 +7,7 @@ module Gitlab
module Registry
class DependencyProxy < GitlabRegistry
def url
- "#{Gitlab.config.gitlab.host}:#{Gitlab.config.gitlab.port}"
+ Gitlab.host_with_port
end
def valid?
diff --git a/lib/gitlab/ci/config.rb b/lib/gitlab/ci/config.rb
index dbb48a81030..d3f030c3b36 100644
--- a/lib/gitlab/ci/config.rb
+++ b/lib/gitlab/ci/config.rb
@@ -99,10 +99,18 @@ module Gitlab
initial_config
end
+ def find_sha(project)
+ branches = project&.repository&.branches || []
+
+ unless branches.empty?
+ project.repository.root_ref_sha
+ end
+ end
+
def build_context(project:, sha:, user:, parent_pipeline:)
Config::External::Context.new(
project: project,
- sha: sha || project&.repository&.root_ref_sha,
+ sha: sha || find_sha(project),
user: user,
parent_pipeline: parent_pipeline,
variables: project&.predefined_variables&.to_runner_variables)
diff --git a/lib/gitlab/ci/config/entry/cache.rb b/lib/gitlab/ci/config/entry/cache.rb
index 6b036182706..cf599ce5294 100644
--- a/lib/gitlab/ci/config/entry/cache.rb
+++ b/lib/gitlab/ci/config/entry/cache.rb
@@ -7,52 +7,90 @@ module Gitlab
##
# Entry that represents a cache configuration
#
- class Cache < ::Gitlab::Config::Entry::Node
- include ::Gitlab::Config::Entry::Configurable
- include ::Gitlab::Config::Entry::Validatable
- include ::Gitlab::Config::Entry::Attributable
-
- ALLOWED_KEYS = %i[key untracked paths when policy].freeze
- ALLOWED_POLICY = %w[pull-push push pull].freeze
- DEFAULT_POLICY = 'pull-push'
- ALLOWED_WHEN = %w[on_success on_failure always].freeze
- DEFAULT_WHEN = 'on_success'
-
- validations do
- validates :config, type: Hash, allowed_keys: ALLOWED_KEYS
- validates :policy,
- inclusion: { in: ALLOWED_POLICY, message: 'should be pull-push, push, or pull' },
- allow_blank: true
-
- with_options allow_nil: true do
- validates :when,
- inclusion: {
- in: ALLOWED_WHEN,
- message: 'should be on_success, on_failure or always'
- }
+ class Cache < ::Gitlab::Config::Entry::Simplifiable
+ strategy :Caches, if: -> (config) { Feature.enabled?(:multiple_cache_per_job) }
+ strategy :Cache, if: -> (config) { Feature.disabled?(:multiple_cache_per_job) }
+
+ class Caches < ::Gitlab::Config::Entry::ComposableArray
+ include ::Gitlab::Config::Entry::Validatable
+
+ MULTIPLE_CACHE_LIMIT = 4
+
+ validations do
+ validates :config, presence: true
+
+ validate do
+ unless config.is_a?(Hash) || config.is_a?(Array)
+ errors.add(:config, 'can only be a Hash or an Array')
+ end
+
+ if config.is_a?(Array) && config.count > MULTIPLE_CACHE_LIMIT
+ errors.add(:config, "no more than #{MULTIPLE_CACHE_LIMIT} caches can be created")
+ end
+ end
+ end
+
+ def initialize(*args)
+ super
+
+ @key = nil
+ end
+
+ def composable_class
+ Entry::Cache::Cache
end
end
- entry :key, Entry::Key,
- description: 'Cache key used to define a cache affinity.'
+ class Cache < ::Gitlab::Config::Entry::Node
+ include ::Gitlab::Config::Entry::Configurable
+ include ::Gitlab::Config::Entry::Validatable
+ include ::Gitlab::Config::Entry::Attributable
+
+ ALLOWED_KEYS = %i[key untracked paths when policy].freeze
+ ALLOWED_POLICY = %w[pull-push push pull].freeze
+ DEFAULT_POLICY = 'pull-push'
+ ALLOWED_WHEN = %w[on_success on_failure always].freeze
+ DEFAULT_WHEN = 'on_success'
+
+ validations do
+ validates :config, type: Hash, allowed_keys: ALLOWED_KEYS
+ validates :policy,
+ inclusion: { in: ALLOWED_POLICY, message: 'should be pull-push, push, or pull' },
+ allow_blank: true
+
+ with_options allow_nil: true do
+ validates :when,
+ inclusion: {
+ in: ALLOWED_WHEN,
+ message: 'should be on_success, on_failure or always'
+ }
+ end
+ end
- entry :untracked, ::Gitlab::Config::Entry::Boolean,
- description: 'Cache all untracked files.'
+ entry :key, Entry::Key,
+ description: 'Cache key used to define a cache affinity.'
- entry :paths, Entry::Paths,
- description: 'Specify which paths should be cached across builds.'
+ entry :untracked, ::Gitlab::Config::Entry::Boolean,
+ description: 'Cache all untracked files.'
- attributes :policy, :when
+ entry :paths, Entry::Paths,
+ description: 'Specify which paths should be cached across builds.'
- def value
- result = super
+ attributes :policy, :when
- result[:key] = key_value
- result[:policy] = policy || DEFAULT_POLICY
- # Use self.when to avoid conflict with reserved word
- result[:when] = self.when || DEFAULT_WHEN
+ def value
+ result = super
+
+ result[:key] = key_value
+ result[:policy] = policy || DEFAULT_POLICY
+ # Use self.when to avoid conflict with reserved word
+ result[:when] = self.when || DEFAULT_WHEN
+
+ result
+ end
+ end
- result
+ class UnknownStrategy < ::Gitlab::Config::Entry::Node
end
end
end
diff --git a/lib/gitlab/ci/config/entry/environment.rb b/lib/gitlab/ci/config/entry/environment.rb
index 64e6d48133f..2066e9be3b1 100644
--- a/lib/gitlab/ci/config/entry/environment.rb
+++ b/lib/gitlab/ci/config/entry/environment.rb
@@ -10,7 +10,7 @@ module Gitlab
class Environment < ::Gitlab::Config::Entry::Node
include ::Gitlab::Config::Entry::Configurable
- ALLOWED_KEYS = %i[name url action on_stop auto_stop_in kubernetes].freeze
+ ALLOWED_KEYS = %i[name url action on_stop auto_stop_in kubernetes deployment_tier].freeze
entry :kubernetes, Entry::Kubernetes, description: 'Kubernetes deployment configuration.'
@@ -47,6 +47,11 @@ module Gitlab
inclusion: { in: %w[start stop prepare], message: 'should be start, stop or prepare' },
allow_nil: true
+ validates :deployment_tier,
+ type: String,
+ inclusion: { in: ::Environment.tiers.keys, message: "must be one of #{::Environment.tiers.keys.join(', ')}" },
+ allow_nil: true
+
validates :on_stop, type: String, allow_nil: true
validates :kubernetes, type: Hash, allow_nil: true
validates :auto_stop_in, duration: true, allow_nil: true
@@ -85,6 +90,10 @@ module Gitlab
value[:auto_stop_in]
end
+ def deployment_tier
+ value[:deployment_tier]
+ end
+
def value
case @config
when String then { name: @config, action: 'start' }
diff --git a/lib/gitlab/ci/features.rb b/lib/gitlab/ci/features.rb
index d1a366125ef..27ea9c2558a 100644
--- a/lib/gitlab/ci/features.rb
+++ b/lib/gitlab/ci/features.rb
@@ -38,10 +38,6 @@ module Gitlab
::Feature.enabled?(:ci_disallow_to_create_merge_request_pipelines_in_target_project, target_project)
end
- def self.project_transactionless_destroy?(project)
- Feature.enabled?(:project_transactionless_destroy, project, default_enabled: false)
- end
-
def self.trace_overwrite?
::Feature.enabled?(:ci_trace_overwrite, type: :ops, default_enabled: false)
end
@@ -55,14 +51,6 @@ module Gitlab
::Feature.enabled?(:ci_trace_log_invalid_chunks, project, type: :ops, default_enabled: false)
end
- def self.ci_pipeline_editor_page_enabled?(project)
- ::Feature.enabled?(:ci_pipeline_editor_page, project, default_enabled: :yaml)
- end
-
- def self.rules_variables_enabled?(project)
- ::Feature.enabled?(:ci_rules_variables, project, default_enabled: true)
- end
-
def self.validate_build_dependencies?(project)
::Feature.enabled?(:ci_validate_build_dependencies, project, default_enabled: :yaml) &&
::Feature.disabled?(:ci_validate_build_dependencies_override, project)
@@ -76,8 +64,8 @@ module Gitlab
::Feature.enabled?(:codequality_backend_comparison, project, default_enabled: :yaml)
end
- def self.use_coverage_data_new_finder?(record)
- ::Feature.enabled?(:coverage_data_new_finder, record, default_enabled: :yaml)
+ def self.multiple_cache_per_job?
+ ::Feature.enabled?(:multiple_cache_per_job, default_enabled: :yaml)
end
end
end
diff --git a/lib/gitlab/ci/jwt.rb b/lib/gitlab/ci/jwt.rb
index 0870c74053a..af06e124736 100644
--- a/lib/gitlab/ci/jwt.rb
+++ b/lib/gitlab/ci/jwt.rb
@@ -60,7 +60,7 @@ module Gitlab
ref_protected: build.protected.to_s
}
- if include_environment_claims?
+ if environment.present?
fields.merge!(
environment: environment.name,
environment_protected: environment_protected?.to_s
@@ -119,10 +119,6 @@ module Gitlab
def environment_protected?
false # Overridden in EE
end
-
- def include_environment_claims?
- Feature.enabled?(:ci_jwt_include_environment) && environment.present?
- end
end
end
end
diff --git a/lib/gitlab/ci/lint.rb b/lib/gitlab/ci/lint.rb
index 364e67db02b..4a7c11ee26e 100644
--- a/lib/gitlab/ci/lint.rb
+++ b/lib/gitlab/ci/lint.rb
@@ -21,7 +21,7 @@ module Gitlab
def initialize(project:, current_user:, sha: nil)
@project = project
@current_user = current_user
- @sha = sha || project.repository.commit.sha
+ @sha = sha || project.repository.commit&.sha
end
def validate(content, dry_run: false)
diff --git a/lib/gitlab/ci/pipeline/chain/cancel_pending_pipelines.rb b/lib/gitlab/ci/pipeline/chain/cancel_pending_pipelines.rb
index f0214bb4e38..1c0dfbdbee3 100644
--- a/lib/gitlab/ci/pipeline/chain/cancel_pending_pipelines.rb
+++ b/lib/gitlab/ci/pipeline/chain/cancel_pending_pipelines.rb
@@ -10,7 +10,7 @@ module Gitlab
def perform!
return unless project.auto_cancel_pending_pipelines?
- Gitlab::OptimisticLocking.retry_lock(auto_cancelable_pipelines) do |cancelables|
+ Gitlab::OptimisticLocking.retry_lock(auto_cancelable_pipelines, name: 'cancel_pending_pipelines') do |cancelables|
cancelables.find_each do |cancelable|
cancelable.auto_cancel_running(pipeline)
end
diff --git a/lib/gitlab/ci/pipeline/expression/statement.rb b/lib/gitlab/ci/pipeline/expression/statement.rb
index 0e81e1bd34c..5f3310dd668 100644
--- a/lib/gitlab/ci/pipeline/expression/statement.rb
+++ b/lib/gitlab/ci/pipeline/expression/statement.rb
@@ -7,9 +7,9 @@ module Gitlab
class Statement
StatementError = Class.new(Expression::ExpressionError)
- def initialize(statement, variables = {})
+ def initialize(statement, variables = nil)
@lexer = Expression::Lexer.new(statement)
- @variables = variables.with_indifferent_access
+ @variables = variables&.to_hash
end
def parse_tree
diff --git a/lib/gitlab/ci/pipeline/seed/build.rb b/lib/gitlab/ci/pipeline/seed/build.rb
index 3770bb4b328..896dba9f117 100644
--- a/lib/gitlab/ci/pipeline/seed/build.rb
+++ b/lib/gitlab/ci/pipeline/seed/build.rb
@@ -28,8 +28,16 @@ module Gitlab
.fabricate(attributes.delete(:except))
@rules = Gitlab::Ci::Build::Rules
.new(attributes.delete(:rules), default_when: 'on_success')
- @cache = Seed::Build::Cache
- .new(pipeline, attributes.delete(:cache))
+
+ if multiple_cache_per_job?
+ cache = Array.wrap(attributes.delete(:cache))
+ @cache = cache.map do |cache|
+ Seed::Build::Cache.new(pipeline, cache)
+ end
+ else
+ @cache = Seed::Build::Cache
+ .new(pipeline, attributes.delete(:cache))
+ end
end
def name
@@ -52,7 +60,7 @@ module Gitlab
return unless included?
strong_memoize(:errors) do
- needs_errors
+ [needs_errors, variable_expansion_errors].compact.flatten
end
end
@@ -153,6 +161,12 @@ module Gitlab
@pipeline.project.actual_limits.ci_needs_size_limit
end
+ def variable_expansion_errors
+ sorted_collection = evaluate_context.variables.sorted_collection(@pipeline.project)
+ errors = sorted_collection.errors
+ ["#{name}: #{errors}"] if errors
+ end
+
def pipeline_attributes
{
pipeline: @pipeline,
@@ -169,15 +183,11 @@ module Gitlab
strong_memoize(:rules_attributes) do
next {} unless @using_rules
- if ::Gitlab::Ci::Features.rules_variables_enabled?(@pipeline.project)
- rules_variables_result = ::Gitlab::Ci::Variables::Helpers.merge_variables(
- @seed_attributes[:yaml_variables], rules_result.variables
- )
+ rules_variables_result = ::Gitlab::Ci::Variables::Helpers.merge_variables(
+ @seed_attributes[:yaml_variables], rules_result.variables
+ )
- rules_result.build_attributes.merge(yaml_variables: rules_variables_result)
- else
- rules_result.build_attributes
- end
+ rules_result.build_attributes.merge(yaml_variables: rules_variables_result)
end
end
@@ -195,7 +205,21 @@ module Gitlab
def cache_attributes
strong_memoize(:cache_attributes) do
- @cache.build_attributes
+ if multiple_cache_per_job?
+ if @cache.empty?
+ {}
+ else
+ { options: { cache: @cache.map(&:attributes) } }
+ end
+ else
+ @cache.build_attributes
+ end
+ end
+ end
+
+ def multiple_cache_per_job?
+ strong_memoize(:multiple_cache_per_job) do
+ ::Gitlab::Ci::Features.multiple_cache_per_job?
end
end
diff --git a/lib/gitlab/ci/pipeline/seed/build/cache.rb b/lib/gitlab/ci/pipeline/seed/build/cache.rb
index 8d6fe13c3b9..78ffaaa7e81 100644
--- a/lib/gitlab/ci/pipeline/seed/build/cache.rb
+++ b/lib/gitlab/ci/pipeline/seed/build/cache.rb
@@ -18,18 +18,18 @@ module Gitlab
raise ArgumentError, "unknown cache keys: #{local_cache.keys}" if local_cache.any?
end
- def build_attributes
+ def attributes
{
- options: {
- cache: {
- key: key_string,
- paths: @paths,
- policy: @policy,
- untracked: @untracked,
- when: @when
- }.compact.presence
- }.compact
- }
+ key: key_string,
+ paths: @paths,
+ policy: @policy,
+ untracked: @untracked,
+ when: @when
+ }.compact
+ end
+
+ def build_attributes
+ { options: { cache: attributes.presence }.compact }
end
private
diff --git a/lib/gitlab/ci/pipeline/seed/environment.rb b/lib/gitlab/ci/pipeline/seed/environment.rb
index 5dff0788ec9..2abedd3b664 100644
--- a/lib/gitlab/ci/pipeline/seed/environment.rb
+++ b/lib/gitlab/ci/pipeline/seed/environment.rb
@@ -13,7 +13,9 @@ module Gitlab
def to_resource
environments.safe_find_or_create_by(name: expanded_environment_name) do |environment|
+ # Initialize the attributes at creation
environment.auto_stop_in = auto_stop_in
+ environment.tier = deployment_tier if ::Feature.enabled?(:environment_tier, job.project, default_enabled: :yaml)
end
end
@@ -27,6 +29,10 @@ module Gitlab
job.environment_auto_stop_in
end
+ def deployment_tier
+ job.environment_deployment_tier
+ end
+
def expanded_environment_name
job.expanded_environment_name
end
diff --git a/lib/gitlab/ci/queue/metrics.rb b/lib/gitlab/ci/queue/metrics.rb
new file mode 100644
index 00000000000..5398c19e536
--- /dev/null
+++ b/lib/gitlab/ci/queue/metrics.rb
@@ -0,0 +1,210 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Ci
+ module Queue
+ class Metrics
+ extend Gitlab::Utils::StrongMemoize
+
+ QUEUE_DURATION_SECONDS_BUCKETS = [1, 3, 10, 30, 60, 300, 900, 1800, 3600].freeze
+ QUEUE_ACTIVE_RUNNERS_BUCKETS = [1, 3, 10, 30, 60, 300, 900, 1800, 3600].freeze
+ QUEUE_DEPTH_TOTAL_BUCKETS = [1, 2, 3, 5, 8, 16, 32, 50, 100, 250, 500, 1000, 2000, 5000].freeze
+ QUEUE_SIZE_TOTAL_BUCKETS = [1, 5, 10, 50, 100, 500, 1000, 2000, 5000].freeze
+ QUEUE_ITERATION_DURATION_SECONDS_BUCKETS = [0.1, 0.3, 0.5, 1, 5, 10, 30, 60, 180, 300].freeze
+
+ METRICS_SHARD_TAG_PREFIX = 'metrics_shard::'
+ DEFAULT_METRICS_SHARD = 'default'
+ JOBS_RUNNING_FOR_PROJECT_MAX_BUCKET = 5.freeze
+
+ OPERATION_COUNTERS = [
+ :build_can_pick,
+ :build_not_pick,
+ :build_not_pending,
+ :build_temporary_locked,
+ :build_conflict_lock,
+ :build_conflict_exception,
+ :build_conflict_transition,
+ :queue_attempt,
+ :queue_conflict,
+ :queue_iteration,
+ :queue_depth_limit,
+ :queue_replication_lag,
+ :runner_pre_assign_checks_failed,
+ :runner_pre_assign_checks_success,
+ :runner_queue_tick
+ ].to_set.freeze
+
+ QUEUE_DEPTH_HISTOGRAMS = [
+ :found,
+ :not_found,
+ :conflict
+ ].to_set.freeze
+
+ attr_reader :runner
+
+ def initialize(runner)
+ @runner = runner
+ end
+
+ def register_failure
+ self.class.failed_attempt_counter.increment
+ self.class.attempt_counter.increment
+ end
+
+ def register_success(job)
+ labels = { shared_runner: runner.instance_type?,
+ jobs_running_for_project: jobs_running_for_project(job),
+ shard: DEFAULT_METRICS_SHARD }
+
+ if runner.instance_type?
+ shard = runner.tag_list.sort.find { |name| name.starts_with?(METRICS_SHARD_TAG_PREFIX) }
+ labels[:shard] = shard.gsub(METRICS_SHARD_TAG_PREFIX, '') if shard
+ end
+
+ self.class.job_queue_duration_seconds.observe(labels, Time.current - job.queued_at) unless job.queued_at.nil?
+ self.class.attempt_counter.increment
+ end
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def jobs_running_for_project(job)
+ return '+Inf' unless runner.instance_type?
+
+ # excluding currently started job
+ running_jobs_count = job.project.builds.running.where(runner: ::Ci::Runner.instance_type)
+ .limit(JOBS_RUNNING_FOR_PROJECT_MAX_BUCKET + 1).count - 1
+ running_jobs_count < JOBS_RUNNING_FOR_PROJECT_MAX_BUCKET ? running_jobs_count : "#{JOBS_RUNNING_FOR_PROJECT_MAX_BUCKET}+"
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ def increment_queue_operation(operation)
+ if !Rails.env.production? && !OPERATION_COUNTERS.include?(operation)
+ raise ArgumentError, "unknown queue operation: #{operation}"
+ end
+
+ self.class.queue_operations_total.increment(operation: operation)
+ end
+
+ def observe_queue_depth(queue, size)
+ return unless Feature.enabled?(:gitlab_ci_builds_queuing_metrics, default_enabled: false)
+
+ if !Rails.env.production? && !QUEUE_DEPTH_HISTOGRAMS.include?(queue)
+ raise ArgumentError, "unknown queue depth label: #{queue}"
+ end
+
+ self.class.queue_depth_total.observe({ queue: queue }, size.to_f)
+ end
+
+ def observe_queue_size(size_proc)
+ return unless Feature.enabled?(:gitlab_ci_builds_queuing_metrics, default_enabled: false)
+
+ self.class.queue_size_total.observe({}, size_proc.call.to_f)
+ end
+
+ def observe_queue_time
+ start_time = ::Gitlab::Metrics::System.monotonic_time
+
+ result = yield
+
+ return result unless Feature.enabled?(:gitlab_ci_builds_queuing_metrics, default_enabled: false)
+
+ seconds = ::Gitlab::Metrics::System.monotonic_time - start_time
+ self.class.queue_iteration_duration_seconds.observe({}, seconds.to_f)
+
+ result
+ end
+
+ def self.observe_active_runners(runners_proc)
+ return unless Feature.enabled?(:gitlab_ci_builds_queuing_metrics, default_enabled: false)
+
+ queue_active_runners_total.observe({}, runners_proc.call.to_f)
+ end
+
+ def self.increment_runner_tick(runner)
+ self.new(runner).increment_queue_operation(:runner_queue_tick)
+ end
+
+ def self.failed_attempt_counter
+ strong_memoize(:failed_attempt_counter) do
+ name = :job_register_attempts_failed_total
+ comment = 'Counts the times a runner tries to register a job'
+
+ Gitlab::Metrics.counter(name, comment)
+ end
+ end
+
+ def self.attempt_counter
+ strong_memoize(:attempt_counter) do
+ name = :job_register_attempts_total
+ comment = 'Counts the times a runner tries to register a job'
+
+ Gitlab::Metrics.counter(name, comment)
+ end
+ end
+
+ def self.job_queue_duration_seconds
+ strong_memoize(:job_queue_duration_seconds) do
+ name = :job_queue_duration_seconds
+ comment = 'Request handling execution time'
+ buckets = QUEUE_DURATION_SECONDS_BUCKETS
+ labels = {}
+
+ Gitlab::Metrics.histogram(name, comment, labels, buckets)
+ end
+ end
+
+ def self.queue_operations_total
+ strong_memoize(:queue_operations_total) do
+ name = :gitlab_ci_queue_operations_total
+ comment = 'Counts all the operations that are happening inside a queue'
+
+ Gitlab::Metrics.counter(name, comment)
+ end
+ end
+
+ def self.queue_depth_total
+ strong_memoize(:queue_depth_total) do
+ name = :gitlab_ci_queue_depth_total
+ comment = 'Size of a CI/CD builds queue in relation to the operation result'
+ buckets = QUEUE_DEPTH_TOTAL_BUCKETS
+ labels = {}
+
+ Gitlab::Metrics.histogram(name, comment, labels, buckets)
+ end
+ end
+
+ def self.queue_size_total
+ strong_memoize(:queue_size_total) do
+ name = :gitlab_ci_queue_size_total
+ comment = 'Size of initialized CI/CD builds queue'
+ buckets = QUEUE_SIZE_TOTAL_BUCKETS
+ labels = {}
+
+ Gitlab::Metrics.histogram(name, comment, labels, buckets)
+ end
+ end
+
+ def self.queue_iteration_duration_seconds
+ strong_memoize(:queue_iteration_duration_seconds) do
+ name = :gitlab_ci_queue_iteration_duration_seconds
+ comment = 'Time it takes to find a build in CI/CD queue'
+ buckets = QUEUE_ITERATION_DURATION_SECONDS_BUCKETS
+ labels = {}
+
+ Gitlab::Metrics.histogram(name, comment, labels, buckets)
+ end
+ end
+
+ def self.queue_active_runners_total
+ strong_memoize(:queue_active_runners_total) do
+ name = :gitlab_ci_queue_active_runners_total
+ comment = 'The amount of active runners that can process queue in a project'
+ buckets = QUEUE_ACTIVE_RUNNERS_BUCKETS
+ labels = {}
+
+ Gitlab::Metrics.histogram(name, comment, labels, buckets)
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/reports/codequality_reports_comparer.rb b/lib/gitlab/ci/reports/codequality_reports_comparer.rb
index 88e02cd9004..10748b8ca02 100644
--- a/lib/gitlab/ci/reports/codequality_reports_comparer.rb
+++ b/lib/gitlab/ci/reports/codequality_reports_comparer.rb
@@ -5,7 +5,7 @@ module Gitlab
module Reports
class CodequalityReportsComparer < ReportsComparer
def initialize(base_report, head_report)
- @base_report = base_report || CodequalityReports.new
+ @base_report = base_report
@head_report = head_report
end
@@ -15,12 +15,16 @@ module Gitlab
def existing_errors
strong_memoize(:existing_errors) do
+ next [] if not_found?
+
base_report.all_degradations & head_report.all_degradations
end
end
def new_errors
strong_memoize(:new_errors) do
+ next [] if not_found?
+
fingerprints = head_report.degradations.keys - base_report.degradations.keys
head_report.degradations.fetch_values(*fingerprints)
end
@@ -28,6 +32,8 @@ module Gitlab
def resolved_errors
strong_memoize(:resolved_errors) do
+ next [] if not_found?
+
fingerprints = base_report.degradations.keys - head_report.degradations.keys
base_report.degradations.fetch_values(*fingerprints)
end
diff --git a/lib/gitlab/ci/reports/reports_comparer.rb b/lib/gitlab/ci/reports/reports_comparer.rb
index d413d3a74f6..16a7f6478b7 100644
--- a/lib/gitlab/ci/reports/reports_comparer.rb
+++ b/lib/gitlab/ci/reports/reports_comparer.rb
@@ -8,6 +8,7 @@ module Gitlab
STATUS_SUCCESS = 'success'
STATUS_FAILED = 'failed'
+ STATUS_NOT_FOUND = 'not_found'
attr_reader :base_report, :head_report
@@ -17,7 +18,13 @@ module Gitlab
end
def status
- success? ? STATUS_SUCCESS : STATUS_FAILED
+ if base_report.nil? || head_report.nil?
+ STATUS_NOT_FOUND
+ elsif success?
+ STATUS_SUCCESS
+ else
+ STATUS_FAILED
+ end
end
def success?
@@ -47,6 +54,10 @@ module Gitlab
def total_count
existing_errors.size + new_errors.size
end
+
+ def not_found?
+ status == STATUS_NOT_FOUND
+ end
end
end
end
diff --git a/lib/gitlab/ci/status/composite.rb b/lib/gitlab/ci/status/composite.rb
index 9a4f5644f7d..5368e020a50 100644
--- a/lib/gitlab/ci/status/composite.rb
+++ b/lib/gitlab/ci/status/composite.rb
@@ -7,7 +7,10 @@ module Gitlab
include Gitlab::Utils::StrongMemoize
# This class accepts an array of arrays/hashes/or objects
- def initialize(all_statuses, with_allow_failure: true, dag: false)
+ #
+ # The parameter `project` is only used for the feature flag check, and will be removed with
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/321972
+ def initialize(all_statuses, with_allow_failure: true, dag: false, project: nil)
unless all_statuses.respond_to?(:pluck)
raise ArgumentError, "all_statuses needs to respond to `.pluck`"
end
@@ -16,6 +19,7 @@ module Gitlab
@status_key = 0
@allow_failure_key = 1 if with_allow_failure
@dag = dag
+ @project = project
consume_all_statuses(all_statuses)
end
@@ -32,7 +36,7 @@ module Gitlab
return if none?
strong_memoize(:status) do
- if @dag && any_of?(:skipped)
+ if @dag && any_skipped_or_ignored?
# The DAG job is skipped if one of the needs does not run at all.
'skipped'
elsif @dag && !only_of?(:success, :failed, :canceled, :skipped, :success_with_warnings)
@@ -90,6 +94,14 @@ module Gitlab
matching == @status_set.size
end
+ def any_skipped_or_ignored?
+ if ::Feature.enabled?(:ci_fix_pipeline_status_for_dag_needs_manual, @project, default_enabled: :yaml)
+ any_of?(:skipped) || any_of?(:ignored)
+ else
+ any_of?(:skipped)
+ end
+ end
+
def consume_all_statuses(all_statuses)
columns = []
columns[@status_key] = :status
diff --git a/lib/gitlab/ci/templates/Chef.gitlab-ci.yml b/lib/gitlab/ci/templates/Chef.gitlab-ci.yml
index 5f17c93b853..d879e27dfcb 100644
--- a/lib/gitlab/ci/templates/Chef.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Chef.gitlab-ci.yml
@@ -20,11 +20,6 @@ stages:
- functional
- deploy
-foodcritic:
- stage: lint
- script:
- - chef exec foodcritic .
-
cookstyle:
stage: lint
script:
diff --git a/lib/gitlab/ci/templates/Jobs/Code-Quality.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/Code-Quality.gitlab-ci.yml
index daed75a42ee..fd6c51ea350 100644
--- a/lib/gitlab/ci/templates/Jobs/Code-Quality.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Jobs/Code-Quality.gitlab-ci.yml
@@ -7,7 +7,7 @@ code_quality:
variables:
DOCKER_DRIVER: overlay2
DOCKER_TLS_CERTDIR: ""
- CODE_QUALITY_IMAGE: "registry.gitlab.com/gitlab-org/ci-cd/codequality:0.85.22"
+ CODE_QUALITY_IMAGE: "registry.gitlab.com/gitlab-org/ci-cd/codequality:0.85.23"
needs: []
script:
- export SOURCE_CODE=$PWD
diff --git a/lib/gitlab/ci/templates/Jobs/Deploy.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/Deploy.gitlab-ci.yml
index c4e194bd658..29edada4041 100644
--- a/lib/gitlab/ci/templates/Jobs/Deploy.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Jobs/Deploy.gitlab-ci.yml
@@ -23,7 +23,7 @@ review:
rules:
- if: '$CI_KUBERNETES_ACTIVE == null || $CI_KUBERNETES_ACTIVE == ""'
when: never
- - if: '$CI_COMMIT_BRANCH == "master"'
+ - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
when: never
- if: '$REVIEW_DISABLED'
when: never
@@ -44,7 +44,7 @@ stop_review:
rules:
- if: '$CI_KUBERNETES_ACTIVE == null || $CI_KUBERNETES_ACTIVE == ""'
when: never
- - if: '$CI_COMMIT_BRANCH == "master"'
+ - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
when: never
- if: '$REVIEW_DISABLED'
when: never
@@ -73,7 +73,7 @@ staging:
rules:
- if: '$CI_KUBERNETES_ACTIVE == null || $CI_KUBERNETES_ACTIVE == ""'
when: never
- - if: '$CI_COMMIT_BRANCH != "master"'
+ - if: '$CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH'
when: never
- if: '$STAGING_ENABLED'
@@ -98,7 +98,7 @@ canary:
rules:
- if: '$CI_KUBERNETES_ACTIVE == null || $CI_KUBERNETES_ACTIVE == ""'
when: never
- - if: '$CI_COMMIT_BRANCH != "master"'
+ - if: '$CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH'
when: never
- if: '$CANARY_ENABLED'
when: manual
@@ -136,7 +136,7 @@ production:
when: never
- if: '$INCREMENTAL_ROLLOUT_MODE'
when: never
- - if: '$CI_COMMIT_BRANCH == "master"'
+ - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
production_manual:
<<: *production_template
@@ -148,12 +148,12 @@ production_manual:
when: never
- if: '$INCREMENTAL_ROLLOUT_MODE'
when: never
- - if: '$CI_COMMIT_BRANCH == "master" && $STAGING_ENABLED'
+ - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $STAGING_ENABLED'
when: manual
- - if: '$CI_COMMIT_BRANCH == "master" && $CANARY_ENABLED'
+ - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CANARY_ENABLED'
when: manual
-# This job implements incremental rollout on for every push to `master`.
+# This job implements incremental rollout on for every push to the default branch.
.rollout: &rollout_template
extends: .auto-deploy
@@ -184,7 +184,7 @@ production_manual:
when: never
- if: '$INCREMENTAL_ROLLOUT_MODE == "timed"'
when: never
- - if: '$CI_COMMIT_BRANCH != "master"'
+ - if: '$CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH'
when: never
# $INCREMENTAL_ROLLOUT_ENABLED is for compatibility with pre-GitLab 11.4 syntax
- if: '$INCREMENTAL_ROLLOUT_MODE == "manual" || $INCREMENTAL_ROLLOUT_ENABLED'
@@ -197,7 +197,7 @@ production_manual:
when: never
- if: '$INCREMENTAL_ROLLOUT_MODE == "manual"'
when: never
- - if: '$CI_COMMIT_BRANCH != "master"'
+ - if: '$CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH'
when: never
- if: '$INCREMENTAL_ROLLOUT_MODE == "timed"'
when: delayed
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 e5b40e5f49a..530ab1d0f99 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 @@
.auto-deploy:
- image: "registry.gitlab.com/gitlab-org/cluster-integration/auto-deploy-image:v2.0.0"
+ image: "registry.gitlab.com/gitlab-org/cluster-integration/auto-deploy-image:v2.6.0"
dependencies: []
review:
@@ -23,7 +23,7 @@ review:
rules:
- if: '$CI_KUBERNETES_ACTIVE == null || $CI_KUBERNETES_ACTIVE == ""'
when: never
- - if: '$CI_COMMIT_BRANCH == "master"'
+ - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
when: never
- if: '$REVIEW_DISABLED'
when: never
@@ -44,7 +44,7 @@ stop_review:
rules:
- if: '$CI_KUBERNETES_ACTIVE == null || $CI_KUBERNETES_ACTIVE == ""'
when: never
- - if: '$CI_COMMIT_BRANCH == "master"'
+ - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
when: never
- if: '$REVIEW_DISABLED'
when: never
@@ -73,7 +73,7 @@ staging:
rules:
- if: '$CI_KUBERNETES_ACTIVE == null || $CI_KUBERNETES_ACTIVE == ""'
when: never
- - if: '$CI_COMMIT_BRANCH != "master"'
+ - if: '$CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH'
when: never
- if: '$STAGING_ENABLED'
@@ -98,7 +98,7 @@ canary:
rules:
- if: '$CI_KUBERNETES_ACTIVE == null || $CI_KUBERNETES_ACTIVE == ""'
when: never
- - if: '$CI_COMMIT_BRANCH != "master"'
+ - if: '$CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH'
when: never
- if: '$CANARY_ENABLED'
when: manual
@@ -135,7 +135,7 @@ production:
when: never
- if: '$INCREMENTAL_ROLLOUT_MODE'
when: never
- - if: '$CI_COMMIT_BRANCH == "master"'
+ - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
production_manual:
<<: *production_template
@@ -147,12 +147,12 @@ production_manual:
when: never
- if: '$INCREMENTAL_ROLLOUT_MODE'
when: never
- - if: '$CI_COMMIT_BRANCH == "master" && $STAGING_ENABLED'
+ - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $STAGING_ENABLED'
when: manual
- - if: '$CI_COMMIT_BRANCH == "master" && $CANARY_ENABLED'
+ - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CANARY_ENABLED'
when: manual
-# This job implements incremental rollout on for every push to `master`.
+# This job implements incremental rollout on for every push to the default branch.
.rollout: &rollout_template
extends: .auto-deploy
@@ -181,7 +181,7 @@ production_manual:
when: never
- if: '$INCREMENTAL_ROLLOUT_MODE == "timed"'
when: never
- - if: '$CI_COMMIT_BRANCH != "master"'
+ - if: '$CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH'
when: never
# $INCREMENTAL_ROLLOUT_ENABLED is for compatibility with pre-GitLab 11.4 syntax
- if: '$INCREMENTAL_ROLLOUT_MODE == "manual" || $INCREMENTAL_ROLLOUT_ENABLED'
@@ -194,7 +194,7 @@ production_manual:
when: never
- if: '$INCREMENTAL_ROLLOUT_MODE == "manual"'
when: never
- - if: '$CI_COMMIT_BRANCH != "master"'
+ - if: '$CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH'
when: never
- if: '$INCREMENTAL_ROLLOUT_MODE == "timed"'
when: delayed
diff --git a/lib/gitlab/ci/templates/Jobs/Deploy/EC2.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/Deploy/EC2.gitlab-ci.yml
index ed2172ef7f5..7efbcab221b 100644
--- a/lib/gitlab/ci/templates/Jobs/Deploy/EC2.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Jobs/Deploy/EC2.gitlab-ci.yml
@@ -20,7 +20,7 @@ review_ec2:
when: never
- if: '$REVIEW_DISABLED'
when: never
- - if: '$CI_COMMIT_BRANCH == "master"'
+ - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
when: never
- if: '$CI_COMMIT_TAG || $CI_COMMIT_BRANCH'
@@ -34,6 +34,6 @@ production_ec2:
when: never
- if: '$CI_KUBERNETES_ACTIVE'
when: never
- - if: '$CI_COMMIT_BRANCH != "master"'
+ - if: '$CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH'
when: never
- if: '$CI_COMMIT_TAG || $CI_COMMIT_BRANCH'
diff --git a/lib/gitlab/ci/templates/Jobs/Deploy/ECS.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/Deploy/ECS.gitlab-ci.yml
index 0289ba1c473..332c58c8695 100644
--- a/lib/gitlab/ci/templates/Jobs/Deploy/ECS.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Jobs/Deploy/ECS.gitlab-ci.yml
@@ -46,7 +46,7 @@ review_ecs:
when: never
- if: '$REVIEW_DISABLED'
when: never
- - if: '$CI_COMMIT_BRANCH == "master"'
+ - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
when: never
- if: '$CI_COMMIT_TAG || $CI_COMMIT_BRANCH'
@@ -62,7 +62,7 @@ stop_review_ecs:
when: never
- if: '$REVIEW_DISABLED'
when: never
- - if: '$CI_COMMIT_BRANCH == "master"'
+ - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
when: never
- if: '$CI_COMMIT_TAG || $CI_COMMIT_BRANCH'
when: manual
@@ -81,7 +81,7 @@ review_fargate:
when: never
- if: '$REVIEW_DISABLED'
when: never
- - if: '$CI_COMMIT_BRANCH == "master"'
+ - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
when: never
- if: '$CI_COMMIT_TAG || $CI_COMMIT_BRANCH'
@@ -97,7 +97,7 @@ stop_review_fargate:
when: never
- if: '$REVIEW_DISABLED'
when: never
- - if: '$CI_COMMIT_BRANCH == "master"'
+ - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
when: never
- if: '$CI_COMMIT_TAG || $CI_COMMIT_BRANCH'
when: manual
@@ -109,7 +109,7 @@ production_ecs:
when: never
- if: '$CI_KUBERNETES_ACTIVE'
when: never
- - if: '$CI_COMMIT_BRANCH != "master"'
+ - if: '$CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH'
when: never
- if: '$CI_COMMIT_TAG || $CI_COMMIT_BRANCH'
@@ -120,6 +120,6 @@ production_fargate:
when: never
- if: '$CI_KUBERNETES_ACTIVE'
when: never
- - if: '$CI_COMMIT_BRANCH != "master"'
+ - if: '$CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH'
when: never
- if: '$CI_COMMIT_TAG || $CI_COMMIT_BRANCH'
diff --git a/lib/gitlab/ci/templates/LaTeX.gitlab-ci.yml b/lib/gitlab/ci/templates/LaTeX.gitlab-ci.yml
index a4aed36889e..e4ed7fadfaa 100644
--- a/lib/gitlab/ci/templates/LaTeX.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/LaTeX.gitlab-ci.yml
@@ -1,11 +1,20 @@
-# use docker image with latex preinstalled
-# since there is no official latex image, use https://github.com/blang/latex-docker
-# possible alternative: https://github.com/natlownes/docker-latex
-image: blang/latex
+---
+variables:
+ # Feel free to choose the image that suits you best.
+ # blang/latex:latest ... Former image used in this template. No longer maintained by author.
+ # listx/texlive:2020 ... The default, referring to TexLive 2020. Current at least to 2021-02-02.
+
+ # Additional alternatives with high Docker pull counts:
+ # thomasweise/docker-texlive-full
+ # thomasweise/texlive
+ # adnrv/texlive
+ LATEX_IMAGE: listx/texlive:2020
build:
+ image: $LATEX_IMAGE
script:
- latexmk -pdf
+
artifacts:
paths:
- "*.pdf"
diff --git a/lib/gitlab/ci/templates/Pages/Brunch.gitlab-ci.yml b/lib/gitlab/ci/templates/Pages/Brunch.gitlab-ci.yml
index d2dd3fbfb75..90cd8472916 100644
--- a/lib/gitlab/ci/templates/Pages/Brunch.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Pages/Brunch.gitlab-ci.yml
@@ -11,5 +11,5 @@ pages:
artifacts:
paths:
- public
- only:
- - master
+ rules:
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
diff --git a/lib/gitlab/ci/templates/Pages/Doxygen.gitlab-ci.yml b/lib/gitlab/ci/templates/Pages/Doxygen.gitlab-ci.yml
index ba422c08614..7435afef572 100644
--- a/lib/gitlab/ci/templates/Pages/Doxygen.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Pages/Doxygen.gitlab-ci.yml
@@ -9,5 +9,5 @@ pages:
artifacts:
paths:
- public
- only:
- - master
+ rules:
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
diff --git a/lib/gitlab/ci/templates/Pages/Gatsby.gitlab-ci.yml b/lib/gitlab/ci/templates/Pages/Gatsby.gitlab-ci.yml
index 3a6eac63892..708c5063cc6 100644
--- a/lib/gitlab/ci/templates/Pages/Gatsby.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Pages/Gatsby.gitlab-ci.yml
@@ -13,5 +13,5 @@ pages:
artifacts:
paths:
- public
- only:
- - master
+ rules:
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
diff --git a/lib/gitlab/ci/templates/Pages/HTML.gitlab-ci.yml b/lib/gitlab/ci/templates/Pages/HTML.gitlab-ci.yml
index 92f25280c6e..694446dd6c9 100644
--- a/lib/gitlab/ci/templates/Pages/HTML.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Pages/HTML.gitlab-ci.yml
@@ -8,5 +8,5 @@ pages:
artifacts:
paths:
- public
- only:
- - master
+ rules:
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
diff --git a/lib/gitlab/ci/templates/Pages/Harp.gitlab-ci.yml b/lib/gitlab/ci/templates/Pages/Harp.gitlab-ci.yml
index 0e206423fa5..a2fd6620909 100644
--- a/lib/gitlab/ci/templates/Pages/Harp.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Pages/Harp.gitlab-ci.yml
@@ -11,5 +11,5 @@ pages:
artifacts:
paths:
- public
- only:
- - master
+ rules:
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
diff --git a/lib/gitlab/ci/templates/Pages/Hexo.gitlab-ci.yml b/lib/gitlab/ci/templates/Pages/Hexo.gitlab-ci.yml
index d91a8d7421f..fd75e47e899 100644
--- a/lib/gitlab/ci/templates/Pages/Hexo.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Pages/Hexo.gitlab-ci.yml
@@ -13,5 +13,5 @@ pages:
paths:
- node_modules
key: project
- only:
- - master
+ rules:
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
diff --git a/lib/gitlab/ci/templates/Pages/Hugo.gitlab-ci.yml b/lib/gitlab/ci/templates/Pages/Hugo.gitlab-ci.yml
index 975cb3b7698..a6a605e35f0 100644
--- a/lib/gitlab/ci/templates/Pages/Hugo.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Pages/Hugo.gitlab-ci.yml
@@ -10,7 +10,8 @@ test:
script:
- hugo
except:
- - master
+ variables:
+ - $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
pages:
script:
@@ -19,4 +20,5 @@ pages:
paths:
- public
only:
- - master
+ variables:
+ - $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
diff --git a/lib/gitlab/ci/templates/Pages/Hyde.gitlab-ci.yml b/lib/gitlab/ci/templates/Pages/Hyde.gitlab-ci.yml
index 7a441a2f70f..1be2f4bad76 100644
--- a/lib/gitlab/ci/templates/Pages/Hyde.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Pages/Hyde.gitlab-ci.yml
@@ -11,7 +11,8 @@ test:
- pip install hyde
- hyde gen
except:
- - master
+ variables:
+ - $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
pages:
stage: deploy
@@ -22,4 +23,5 @@ pages:
paths:
- public
only:
- - master
+ variables:
+ - $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
diff --git a/lib/gitlab/ci/templates/Pages/Jekyll.gitlab-ci.yml b/lib/gitlab/ci/templates/Pages/Jekyll.gitlab-ci.yml
index f2f92fe0704..01e063c50ad 100644
--- a/lib/gitlab/ci/templates/Pages/Jekyll.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Pages/Jekyll.gitlab-ci.yml
@@ -18,7 +18,8 @@ test:
paths:
- test
except:
- - master
+ variables:
+ - $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
pages:
stage: deploy
@@ -28,4 +29,5 @@ pages:
paths:
- public
only:
- - master
+ variables:
+ - $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
diff --git a/lib/gitlab/ci/templates/Pages/Jigsaw.gitlab-ci.yml b/lib/gitlab/ci/templates/Pages/Jigsaw.gitlab-ci.yml
index 2d26b86a328..e39aa8a2063 100644
--- a/lib/gitlab/ci/templates/Pages/Jigsaw.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Pages/Jigsaw.gitlab-ci.yml
@@ -33,5 +33,5 @@ pages:
artifacts:
paths:
- public
- only:
- - master
+ rules:
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
diff --git a/lib/gitlab/ci/templates/Pages/Lektor.gitlab-ci.yml b/lib/gitlab/ci/templates/Pages/Lektor.gitlab-ci.yml
index 93ab8e0be0d..13d3089f4fa 100644
--- a/lib/gitlab/ci/templates/Pages/Lektor.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Pages/Lektor.gitlab-ci.yml
@@ -8,5 +8,5 @@ pages:
artifacts:
paths:
- public
- only:
- - master
+ rules:
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
diff --git a/lib/gitlab/ci/templates/Pages/Metalsmith.gitlab-ci.yml b/lib/gitlab/ci/templates/Pages/Metalsmith.gitlab-ci.yml
index 6524405133a..e65cf3928f2 100644
--- a/lib/gitlab/ci/templates/Pages/Metalsmith.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Pages/Metalsmith.gitlab-ci.yml
@@ -12,5 +12,5 @@ pages:
artifacts:
paths:
- public
- only:
- - master
+ rules:
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
diff --git a/lib/gitlab/ci/templates/Pages/Middleman.gitlab-ci.yml b/lib/gitlab/ci/templates/Pages/Middleman.gitlab-ci.yml
index 462b4737c4e..377fd8c396e 100644
--- a/lib/gitlab/ci/templates/Pages/Middleman.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Pages/Middleman.gitlab-ci.yml
@@ -12,7 +12,8 @@ test:
- bundle install --path vendor
- bundle exec middleman build
except:
- - master
+ variables:
+ - $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
pages:
script:
@@ -23,5 +24,5 @@ pages:
artifacts:
paths:
- public
- only:
- - master
+ rules:
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
diff --git a/lib/gitlab/ci/templates/Pages/Nanoc.gitlab-ci.yml b/lib/gitlab/ci/templates/Pages/Nanoc.gitlab-ci.yml
index b512f8d77e9..89281b41b66 100644
--- a/lib/gitlab/ci/templates/Pages/Nanoc.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Pages/Nanoc.gitlab-ci.yml
@@ -8,5 +8,5 @@ pages:
artifacts:
paths:
- public
- only:
- - master
+ rules:
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
diff --git a/lib/gitlab/ci/templates/Pages/Octopress.gitlab-ci.yml b/lib/gitlab/ci/templates/Pages/Octopress.gitlab-ci.yml
index 4318aadcaa6..8fd4702b90d 100644
--- a/lib/gitlab/ci/templates/Pages/Octopress.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Pages/Octopress.gitlab-ci.yml
@@ -11,5 +11,5 @@ pages:
artifacts:
paths:
- public
- only:
- - master
+ rules:
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
diff --git a/lib/gitlab/ci/templates/Pages/SwaggerUI.gitlab-ci.yml b/lib/gitlab/ci/templates/Pages/SwaggerUI.gitlab-ci.yml
index 8fd08ea7995..9fa8b07f7cb 100644
--- a/lib/gitlab/ci/templates/Pages/SwaggerUI.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Pages/SwaggerUI.gitlab-ci.yml
@@ -25,5 +25,5 @@ pages:
artifacts:
paths:
- public
- only:
- - master
+ rules:
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
diff --git a/lib/gitlab/ci/templates/Security/API-Fuzzing.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/API-Fuzzing.gitlab-ci.yml
index 135f0df99fe..654a03ced5f 100644
--- a/lib/gitlab/ci/templates/Security/API-Fuzzing.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Security/API-Fuzzing.gitlab-ci.yml
@@ -45,13 +45,10 @@ apifuzzer_fuzz:
entrypoint: ["/bin/bash", "-l", "-c"]
variables:
FUZZAPI_PROJECT: $CI_PROJECT_PATH
- FUZZAPI_API: http://apifuzzer:80
+ FUZZAPI_API: http://localhost:80
FUZZAPI_NEW_REPORT: 1
+ FUZZAPI_LOG_SCANNER: gl-apifuzzing-api-scanner.log
TZ: America/Los_Angeles
- services:
- - name: $FUZZAPI_IMAGE
- alias: apifuzzer
- entrypoint: ["dotnet", "/peach/Peach.Web.dll"]
allow_failure: true
rules:
- if: $FUZZAPI_D_TARGET_IMAGE
@@ -80,17 +77,26 @@ apifuzzer_fuzz:
# Make sure asset path exists
- mkdir -p $FUZZAPI_REPORT_ASSET_PATH
#
+ # Start API Security background process
+ - dotnet /peach/Peach.Web.dll &> $FUZZAPI_LOG_SCANNER &
+ - APISEC_PID=$!
+ #
# Start scanning
- worker-entry
#
# Run user provided post-script
- sh -c "$FUZZAPI_POST_SCRIPT"
#
+ # Shutdown API Security
+ - kill $APISEC_PID
+ - wait $APISEC_PID
+ #
artifacts:
when: always
paths:
- $FUZZAPI_REPORT_ASSET_PATH
- $FUZZAPI_REPORT
+ - $FUZZAPI_LOG_SCANNER
reports:
api_fuzzing: $FUZZAPI_REPORT
@@ -172,6 +178,7 @@ apifuzzer_fuzz_dnd:
-e FUZZAPI_HAR \
-e FUZZAPI_OPENAPI \
-e FUZZAPI_POSTMAN_COLLECTION \
+ -e FUZZAPI_POSTMAN_COLLECTION_VARIABLES \
-e FUZZAPI_TARGET_URL \
-e FUZZAPI_OVERRIDES_FILE \
-e FUZZAPI_OVERRIDES_ENV \
@@ -214,6 +221,7 @@ apifuzzer_fuzz_dnd:
-e FUZZAPI_HAR \
-e FUZZAPI_OPENAPI \
-e FUZZAPI_POSTMAN_COLLECTION \
+ -e FUZZAPI_POSTMAN_COLLECTION_VARIABLES \
-e FUZZAPI_TARGET_URL \
-e FUZZAPI_OVERRIDES_FILE \
-e FUZZAPI_OVERRIDES_ENV \
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 5ea2363a0c5..64001c2828a 100644
--- a/lib/gitlab/ci/templates/Security/Container-Scanning.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Security/Container-Scanning.gitlab-ci.yml
@@ -18,6 +18,9 @@ container_scanning:
# file. See https://docs.gitlab.com/ee/user/application_security/container_scanning/index.html#overriding-the-container-scanning-template
# for details
GIT_STRATEGY: none
+ # CS_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.
CS_ANALYZER_IMAGE: $SECURE_ANALYZERS_PREFIX/klar:$CS_MAJOR_VERSION
allow_failure: true
services:
diff --git a/lib/gitlab/ci/templates/Security/Dependency-Scanning.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/Dependency-Scanning.gitlab-ci.yml
index b534dad9593..3039d64514b 100644
--- a/lib/gitlab/ci/templates/Security/Dependency-Scanning.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Security/Dependency-Scanning.gitlab-ci.yml
@@ -38,6 +38,9 @@ gemnasium-dependency_scanning:
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"
rules:
- if: $DEPENDENCY_SCANNING_DISABLED
@@ -61,6 +64,9 @@ gemnasium-maven-dependency_scanning:
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"
rules:
- if: $DEPENDENCY_SCANNING_DISABLED
@@ -79,6 +85,9 @@ gemnasium-python-dependency_scanning:
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"
rules:
- if: $DEPENDENCY_SCANNING_DISABLED
@@ -104,6 +113,9 @@ bundler-audit-dependency_scanning:
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"
rules:
- if: $DEPENDENCY_SCANNING_DISABLED
@@ -119,6 +131,9 @@ retire-js-dependency_scanning:
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"
rules:
- if: $DEPENDENCY_SCANNING_DISABLED
diff --git a/lib/gitlab/ci/templates/Security/SAST.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/SAST.gitlab-ci.yml
index 828352743b4..0391fb429a7 100644
--- a/lib/gitlab/ci/templates/Security/SAST.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Security/SAST.gitlab-ci.yml
@@ -41,6 +41,9 @@ bandit-sast:
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
+ # SAST_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.
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/bandit:$SAST_ANALYZER_IMAGE_TAG"
rules:
- if: $SAST_DISABLED
@@ -57,6 +60,9 @@ brakeman-sast:
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
+ # SAST_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.
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/brakeman:$SAST_ANALYZER_IMAGE_TAG"
rules:
- if: $SAST_DISABLED
@@ -74,6 +80,9 @@ eslint-sast:
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
+ # SAST_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.
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/eslint:$SAST_ANALYZER_IMAGE_TAG"
rules:
- if: $SAST_DISABLED
@@ -94,6 +103,9 @@ flawfinder-sast:
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
+ # SAST_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.
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/flawfinder:$SAST_ANALYZER_IMAGE_TAG"
rules:
- if: $SAST_DISABLED
@@ -111,6 +123,9 @@ kubesec-sast:
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
+ # SAST_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.
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/kubesec:$SAST_ANALYZER_IMAGE_TAG"
rules:
- if: $SAST_DISABLED
@@ -126,6 +141,9 @@ gosec-sast:
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
+ # SAST_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.
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/gosec:$SAST_ANALYZER_IMAGE_TAG"
rules:
- if: $SAST_DISABLED
@@ -140,11 +158,16 @@ gosec-sast:
mobsf-android-sast:
extends: .sast-analyzer
services:
- - name: opensecurity/mobile-security-framework-mobsf:latest
+ # this version must match with analyzer version mentioned in: https://gitlab.com/gitlab-org/security-products/analyzers/mobsf/-/blob/master/Dockerfile
+ # Unfortunately, we need to keep track of mobsf version in 2 different places for now.
+ - name: opensecurity/mobile-security-framework-mobsf:v3.2.9
alias: mobsf
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
+ # SAST_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.
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/mobsf:$SAST_ANALYZER_IMAGE_TAG"
MOBSF_API_KEY: key
rules:
@@ -161,11 +184,16 @@ mobsf-android-sast:
mobsf-ios-sast:
extends: .sast-analyzer
services:
- - name: opensecurity/mobile-security-framework-mobsf:latest
+ # this version must match with analyzer version mentioned in: https://gitlab.com/gitlab-org/security-products/analyzers/mobsf/-/blob/master/Dockerfile
+ # Unfortunately, we need to keep track of mobsf version in 2 different places for now.
+ - name: opensecurity/mobile-security-framework-mobsf:v3.2.9
alias: mobsf
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
+ # SAST_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.
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/mobsf:$SAST_ANALYZER_IMAGE_TAG"
MOBSF_API_KEY: key
rules:
@@ -184,6 +212,9 @@ nodejs-scan-sast:
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
+ # SAST_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.
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/nodejs-scan:$SAST_ANALYZER_IMAGE_TAG"
rules:
- if: $SAST_DISABLED
@@ -200,6 +231,9 @@ phpcs-security-audit-sast:
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
+ # SAST_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.
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/phpcs-security-audit:$SAST_ANALYZER_IMAGE_TAG"
rules:
- if: $SAST_DISABLED
@@ -216,6 +250,9 @@ pmd-apex-sast:
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
+ # SAST_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.
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/pmd-apex:$SAST_ANALYZER_IMAGE_TAG"
rules:
- if: $SAST_DISABLED
@@ -232,6 +269,9 @@ security-code-scan-sast:
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
+ # SAST_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.
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/security-code-scan:$SAST_ANALYZER_IMAGE_TAG"
rules:
- if: $SAST_DISABLED
@@ -249,6 +289,9 @@ semgrep-sast:
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
+ # SAST_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.
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/semgrep:latest"
rules:
- if: $SAST_DISABLED
@@ -266,6 +309,9 @@ sobelow-sast:
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
+ # SAST_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.
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/sobelow:$SAST_ANALYZER_IMAGE_TAG"
rules:
- if: $SAST_DISABLED
@@ -282,6 +328,9 @@ spotbugs-sast:
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
+ # SAST_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.
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/spotbugs:$SAST_ANALYZER_IMAGE_TAG"
rules:
- if: $SAST_EXCLUDED_ANALYZERS =~ /spotbugs/
diff --git a/lib/gitlab/ci/templates/Security/Secret-Detection.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/Secret-Detection.gitlab-ci.yml
index d2a6fa06dd8..c255fb4707a 100644
--- a/lib/gitlab/ci/templates/Security/Secret-Detection.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Security/Secret-Detection.gitlab-ci.yml
@@ -1,7 +1,7 @@
# Read more about this feature here: https://docs.gitlab.com/ee/user/application_security/secret_detection
#
# Configure the scanning tool through the environment variables.
-# List of the variables: https://gitlab.com/gitlab-org/security-products/secret_detection#available-variables
+# List of the variables: https://docs.gitlab.com/ee/user/application_security/secret_detection/#available-variables
# How to set: https://docs.gitlab.com/ee/ci/yaml/#variables
variables:
diff --git a/lib/gitlab/ci/templates/Terraform/Base.latest.gitlab-ci.yml b/lib/gitlab/ci/templates/Terraform/Base.latest.gitlab-ci.yml
index c2db0fc44f1..200388a274c 100644
--- a/lib/gitlab/ci/templates/Terraform/Base.latest.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Terraform/Base.latest.gitlab-ci.yml
@@ -52,7 +52,8 @@ cache:
- gitlab-terraform apply
when: manual
only:
- - master
+ variables:
+ - $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
.destroy: &destroy
stage: cleanup
diff --git a/lib/gitlab/ci/variables/collection.rb b/lib/gitlab/ci/variables/collection.rb
index f7bbb58df7e..45e2c535d3a 100644
--- a/lib/gitlab/ci/variables/collection.rb
+++ b/lib/gitlab/ci/variables/collection.rb
@@ -6,14 +6,22 @@ module Gitlab
class Collection
include Enumerable
- def initialize(variables = [])
+ attr_reader :errors
+
+ def initialize(variables = [], errors = nil)
@variables = []
+ @variables_by_key = {}
+ @errors = errors
variables.each { |variable| self.append(variable) }
end
def append(resource)
- tap { @variables.append(Collection::Item.fabricate(resource)) }
+ item = Collection::Item.fabricate(resource)
+ @variables.append(item)
+ @variables_by_key[item[:key]] = item
+
+ self
end
def concat(resources)
@@ -33,14 +41,31 @@ module Gitlab
end
end
+ def [](key)
+ @variables_by_key[key]
+ end
+
+ def size
+ @variables.size
+ end
+
def to_runner_variables
self.map(&:to_runner_variable)
end
def to_hash
self.to_runner_variables
- .map { |env| [env.fetch(:key), env.fetch(:value)] }
- .to_h.with_indifferent_access
+ .to_h { |env| [env.fetch(:key), env.fetch(:value)] }
+ .with_indifferent_access
+ end
+
+ def reject(&block)
+ Collection.new(@variables.reject(&block))
+ end
+
+ # Returns a sorted Collection object, and sets errors property in case of an error
+ def sorted_collection(project)
+ Sort.new(self, project).collection
end
end
end
diff --git a/lib/gitlab/ci/variables/collection/item.rb b/lib/gitlab/ci/variables/collection/item.rb
index 84a9280e507..b52dfdc4bc1 100644
--- a/lib/gitlab/ci/variables/collection/item.rb
+++ b/lib/gitlab/ci/variables/collection/item.rb
@@ -5,13 +5,20 @@ module Gitlab
module Variables
class Collection
class Item
- def initialize(key:, value:, public: true, file: false, masked: false)
+ include Gitlab::Utils::StrongMemoize
+
+ attr_reader :raw
+
+ def initialize(key:, value:, public: true, file: false, masked: false, raw: false)
raise ArgumentError, "`#{key}` must be of type String or nil value, while it was: #{value.class}" unless
value.is_a?(String) || value.nil?
- @variable = {
- key: key, value: value, public: public, file: file, masked: masked
- }
+ @variable = { key: key, value: value, public: public, file: file, masked: masked }
+ @raw = raw
+ end
+
+ def value
+ @variable.fetch(:value)
end
def [](key)
@@ -22,6 +29,16 @@ module Gitlab
to_runner_variable == self.class.fabricate(other).to_runner_variable
end
+ def depends_on
+ strong_memoize(:depends_on) do
+ next if raw
+
+ next unless ExpandVariables.possible_var_reference?(value)
+
+ value.scan(ExpandVariables::VARIABLES_REGEXP).map(&:first)
+ end
+ end
+
##
# If `file: true` has been provided we expose it, otherwise we
# don't expose `file` attribute at all (stems from what the runner
diff --git a/lib/gitlab/ci/variables/collection/sort.rb b/lib/gitlab/ci/variables/collection/sort.rb
new file mode 100644
index 00000000000..94273ab3d67
--- /dev/null
+++ b/lib/gitlab/ci/variables/collection/sort.rb
@@ -0,0 +1,64 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Ci
+ module Variables
+ class Collection
+ class Sort
+ include TSort
+ include Gitlab::Utils::StrongMemoize
+
+ def initialize(collection, project)
+ raise(ArgumentError, "A Gitlab::Ci::Variables::Collection object was expected") unless
+ collection.is_a?(Collection)
+
+ @collection = collection
+ @project = project
+ end
+
+ def valid?
+ errors.nil?
+ end
+
+ # errors sorts an array of variables, ignoring unknown variable references,
+ # and returning an error string if a circular variable reference is found
+ def errors
+ return if Feature.disabled?(:variable_inside_variable, @project)
+
+ strong_memoize(:errors) do
+ # Check for cyclic dependencies and build error message in that case
+ cyclic_vars = each_strongly_connected_component.filter_map do |component|
+ component.map { |v| v[:key] }.inspect if component.size > 1
+ end
+
+ "circular variable reference detected: #{cyclic_vars.join(', ')}" if cyclic_vars.any?
+ end
+ end
+
+ # collection sorts a collection of variables, ignoring unknown variable references.
+ # If a circular variable reference is found, a new collection with the original array and an error is returned
+ def collection
+ return @collection if Feature.disabled?(:variable_inside_variable, @project)
+
+ return Gitlab::Ci::Variables::Collection.new(@collection, errors) if errors
+
+ Gitlab::Ci::Variables::Collection.new(tsort)
+ end
+
+ private
+
+ def tsort_each_node(&block)
+ @collection.each(&block)
+ end
+
+ def tsort_each_child(var_item, &block)
+ depends_on = var_item.depends_on
+ return unless depends_on
+
+ depends_on.filter_map { |var_ref_name| @collection[var_ref_name] }.each(&block)
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/variables/collection/sorted.rb b/lib/gitlab/ci/variables/collection/sorted.rb
deleted file mode 100644
index e641df10462..00000000000
--- a/lib/gitlab/ci/variables/collection/sorted.rb
+++ /dev/null
@@ -1,78 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Ci
- module Variables
- class Collection
- class Sorted
- include TSort
- include Gitlab::Utils::StrongMemoize
-
- def initialize(variables, project)
- @variables = variables
- @project = project
- end
-
- def valid?
- errors.nil?
- end
-
- # errors sorts an array of variables, ignoring unknown variable references,
- # and returning an error string if a circular variable reference is found
- def errors
- return if Feature.disabled?(:variable_inside_variable, @project)
-
- strong_memoize(:errors) do
- # Check for cyclic dependencies and build error message in that case
- errors = each_strongly_connected_component.filter_map do |component|
- component.map { |v| v[:key] }.inspect if component.size > 1
- end
-
- "circular variable reference detected: #{errors.join(', ')}" if errors.any?
- end
- end
-
- # sort sorts an array of variables, ignoring unknown variable references.
- # If a circular variable reference is found, the original array is returned
- def sort
- return @variables if Feature.disabled?(:variable_inside_variable, @project)
- return @variables if errors
-
- tsort
- end
-
- private
-
- def tsort_each_node(&block)
- @variables.each(&block)
- end
-
- def tsort_each_child(variable, &block)
- each_variable_reference(variable[:value], &block)
- end
-
- def input_vars
- strong_memoize(:input_vars) do
- @variables.index_by { |env| env.fetch(:key) }
- end
- end
-
- def walk_references(value)
- return unless ExpandVariables.possible_var_reference?(value)
-
- value.scan(ExpandVariables::VARIABLES_REGEXP) do |var_ref|
- yield(input_vars, var_ref.first)
- end
- end
-
- def each_variable_reference(value)
- walk_references(value) do |vars_hash, ref_var_name|
- variable = vars_hash.dig(ref_var_name)
- yield variable if variable
- end
- end
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/cycle_analytics/summary/deploy.rb b/lib/gitlab/cycle_analytics/summary/deploy.rb
index aaa2554dbfa..c247ef0d2a7 100644
--- a/lib/gitlab/cycle_analytics/summary/deploy.rb
+++ b/lib/gitlab/cycle_analytics/summary/deploy.rb
@@ -15,16 +15,10 @@ module Gitlab
private
def deployments_count
- if Feature.enabled?(:query_deploymenys_via_finished_at_in_vsa, default_enabled: :yaml)
- DeploymentsFinder
- .new(project: @project, finished_after: @from, finished_before: @to, status: :success)
- .execute
- .count
- else
- query = @project.deployments.success.where("created_at >= ?", @from)
- query = query.where("created_at <= ?", @to) if @to
- query.count
- end
+ DeploymentsFinder
+ .new(project: @project, finished_after: @from, finished_before: @to, status: :success)
+ .execute
+ .count
end
end
end
diff --git a/lib/gitlab/data_builder/build.rb b/lib/gitlab/data_builder/build.rb
index e17bd25e57e..c4af5e6608e 100644
--- a/lib/gitlab/data_builder/build.rb
+++ b/lib/gitlab/data_builder/build.rb
@@ -62,7 +62,9 @@ module Gitlab
git_http_url: project.http_url_to_repo,
git_ssh_url: project.ssh_url_to_repo,
visibility_level: project.visibility_level
- }
+ },
+
+ environment: build_environment(build)
}
data
@@ -86,6 +88,15 @@ module Gitlab
tags: runner.tags&.map(&:name)
}
end
+
+ def build_environment(build)
+ return unless build.has_environment?
+
+ {
+ name: build.expanded_environment_name,
+ action: build.environment_action
+ }
+ end
end
end
end
diff --git a/lib/gitlab/data_builder/pipeline.rb b/lib/gitlab/data_builder/pipeline.rb
index 3036bc57ca5..7fd1b9cd228 100644
--- a/lib/gitlab/data_builder/pipeline.rb
+++ b/lib/gitlab/data_builder/pipeline.rb
@@ -67,7 +67,8 @@ module Gitlab
artifacts_file: {
filename: build.artifacts_file&.filename,
size: build.artifacts_size
- }
+ },
+ environment: environment_hook_attrs(build)
}
end
@@ -80,6 +81,15 @@ module Gitlab
tags: runner.tags&.map(&:name)
}
end
+
+ def environment_hook_attrs(build)
+ return unless build.has_environment?
+
+ {
+ name: build.expanded_environment_name,
+ action: build.environment_action
+ }
+ end
end
end
end
diff --git a/lib/gitlab/database.rb b/lib/gitlab/database.rb
index 45d271a2fd4..2b3c98ffa14 100644
--- a/lib/gitlab/database.rb
+++ b/lib/gitlab/database.rb
@@ -313,28 +313,18 @@ module Gitlab
ActiveRecord::Base.prepend(ActiveRecordBaseTransactionMetrics)
end
- # observe_transaction_duration is called from ActiveRecordBaseTransactionMetrics.transaction and used to
- # record transaction durations.
- def self.observe_transaction_duration(duration_seconds)
- if current_transaction = ::Gitlab::Metrics::Transaction.current
- current_transaction.observe(:gitlab_database_transaction_seconds, duration_seconds) do
- docstring "Time spent in database transactions, in seconds"
- end
- end
- rescue Prometheus::Client::LabelSetValidator::LabelSetError => err
- # Ensure that errors in recording these metrics don't affect the operation of the application
- Gitlab::AppLogger.error("Unable to observe database transaction duration: #{err}")
- end
-
# MonkeyPatch for ActiveRecord::Base for adding observability
module ActiveRecordBaseTransactionMetrics
- # A monkeypatch over ActiveRecord::Base.transaction.
- # It provides observability into transactional methods.
- def transaction(options = {}, &block)
- start_time = Gitlab::Metrics::System.monotonic_time
- super(options, &block)
- ensure
- Gitlab::Database.observe_transaction_duration(Gitlab::Metrics::System.monotonic_time - start_time)
+ extend ActiveSupport::Concern
+
+ class_methods do
+ # A monkeypatch over ActiveRecord::Base.transaction.
+ # It provides observability into transactional methods.
+ def transaction(**options, &block)
+ ActiveSupport::Notifications.instrument('transaction.active_record', { connection: connection }) do
+ super(**options, &block)
+ end
+ end
end
end
end
diff --git a/lib/gitlab/database/background_migration/batched_job.rb b/lib/gitlab/database/background_migration/batched_job.rb
new file mode 100644
index 00000000000..3b624df2bfd
--- /dev/null
+++ b/lib/gitlab/database/background_migration/batched_job.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Database
+ module BackgroundMigration
+ class BatchedJob < ActiveRecord::Base # rubocop:disable Rails/ApplicationRecord
+ self.table_name = :batched_background_migration_jobs
+
+ belongs_to :batched_migration, foreign_key: :batched_background_migration_id
+
+ enum status: {
+ pending: 0,
+ running: 1,
+ failed: 2,
+ succeeded: 3
+ }
+
+ delegate :aborted?, :job_class, :table_name, :column_name, :job_arguments,
+ to: :batched_migration, prefix: :migration
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/database/background_migration/batched_migration.rb b/lib/gitlab/database/background_migration/batched_migration.rb
new file mode 100644
index 00000000000..0c9add9b355
--- /dev/null
+++ b/lib/gitlab/database/background_migration/batched_migration.rb
@@ -0,0 +1,56 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Database
+ module BackgroundMigration
+ class BatchedMigration < ActiveRecord::Base # rubocop:disable Rails/ApplicationRecord
+ JOB_CLASS_MODULE = 'Gitlab::BackgroundMigration'
+ BATCH_CLASS_MODULE = "#{JOB_CLASS_MODULE}::BatchingStrategies".freeze
+
+ self.table_name = :batched_background_migrations
+
+ has_many :batched_jobs, foreign_key: :batched_background_migration_id
+ has_one :last_job, -> { order(id: :desc) },
+ class_name: 'Gitlab::Database::BackgroundMigration::BatchedJob',
+ foreign_key: :batched_background_migration_id
+
+ scope :queue_order, -> { order(id: :asc) }
+
+ enum status: {
+ paused: 0,
+ active: 1,
+ aborted: 2,
+ finished: 3
+ }
+
+ def interval_elapsed?
+ last_job.nil? || last_job.created_at <= Time.current - interval
+ end
+
+ def create_batched_job!(min, max)
+ batched_jobs.create!(min_value: min, max_value: max, batch_size: batch_size, sub_batch_size: sub_batch_size)
+ end
+
+ def next_min_value
+ last_job&.max_value&.next || min_value
+ end
+
+ def job_class
+ "#{JOB_CLASS_MODULE}::#{job_class_name}".constantize
+ end
+
+ def batch_class
+ "#{BATCH_CLASS_MODULE}::#{batch_class_name}".constantize
+ end
+
+ def job_class_name=(class_name)
+ write_attribute(:job_class_name, class_name.demodulize)
+ end
+
+ def batch_class_name=(class_name)
+ write_attribute(:batch_class_name, class_name.demodulize)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/database/background_migration/batched_migration_wrapper.rb b/lib/gitlab/database/background_migration/batched_migration_wrapper.rb
new file mode 100644
index 00000000000..299bd992197
--- /dev/null
+++ b/lib/gitlab/database/background_migration/batched_migration_wrapper.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Database
+ module BackgroundMigration
+ class BatchedMigrationWrapper
+ def perform(batch_tracking_record)
+ start_tracking_execution(batch_tracking_record)
+
+ execute_batch(batch_tracking_record)
+
+ batch_tracking_record.status = :succeeded
+ rescue => e
+ batch_tracking_record.status = :failed
+
+ raise e
+ ensure
+ finish_tracking_execution(batch_tracking_record)
+ end
+
+ private
+
+ def start_tracking_execution(tracking_record)
+ tracking_record.update!(attempts: tracking_record.attempts + 1, status: :running, started_at: Time.current)
+ end
+
+ def execute_batch(tracking_record)
+ job_instance = tracking_record.migration_job_class.new
+
+ job_instance.perform(
+ tracking_record.min_value,
+ tracking_record.max_value,
+ tracking_record.migration_table_name,
+ tracking_record.migration_column_name,
+ tracking_record.sub_batch_size,
+ *tracking_record.migration_job_arguments)
+ end
+
+ def finish_tracking_execution(tracking_record)
+ tracking_record.finished_at = Time.current
+ tracking_record.save!
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/database/background_migration/scheduler.rb b/lib/gitlab/database/background_migration/scheduler.rb
new file mode 100644
index 00000000000..5f8a5ec06a5
--- /dev/null
+++ b/lib/gitlab/database/background_migration/scheduler.rb
@@ -0,0 +1,60 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Database
+ module BackgroundMigration
+ class Scheduler
+ def perform(migration_wrapper: BatchedMigrationWrapper.new)
+ active_migration = BatchedMigration.active.queue_order.first
+
+ return unless active_migration&.interval_elapsed?
+
+ if next_batched_job = create_next_batched_job!(active_migration)
+ migration_wrapper.perform(next_batched_job)
+ else
+ finish_active_migration(active_migration)
+ end
+ end
+
+ private
+
+ def create_next_batched_job!(active_migration)
+ next_batch_range = find_next_batch_range(active_migration)
+
+ return if next_batch_range.nil?
+
+ active_migration.create_batched_job!(next_batch_range.min, next_batch_range.max)
+ end
+
+ def find_next_batch_range(active_migration)
+ batching_strategy = active_migration.batch_class.new
+ batch_min_value = active_migration.next_min_value
+
+ next_batch_bounds = batching_strategy.next_batch(
+ active_migration.table_name,
+ active_migration.column_name,
+ batch_min_value: batch_min_value,
+ batch_size: active_migration.batch_size)
+
+ return if next_batch_bounds.nil?
+
+ clamped_batch_range(active_migration, next_batch_bounds)
+ end
+
+ def clamped_batch_range(active_migration, next_bounds)
+ min_value, max_value = next_bounds
+
+ return if min_value > active_migration.max_value
+
+ max_value = max_value.clamp(min_value, active_migration.max_value)
+
+ (min_value..max_value)
+ end
+
+ def finish_active_migration(active_migration)
+ active_migration.finished!
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/database/migration_helpers.rb b/lib/gitlab/database/migration_helpers.rb
index 6b169a504f3..e8ed3bb1258 100644
--- a/lib/gitlab/database/migration_helpers.rb
+++ b/lib/gitlab/database/migration_helpers.rb
@@ -1015,7 +1015,7 @@ module Gitlab
'CopyColumnUsingBackgroundMigrationJob',
interval,
batch_size: batch_size,
- other_job_arguments: [table, primary_key, column, tmp_column, sub_batch_size],
+ other_job_arguments: [table, primary_key, sub_batch_size, column, tmp_column],
track_jobs: true,
primary_column_name: primary_key
)
diff --git a/lib/gitlab/database/migrations/background_migration_helpers.rb b/lib/gitlab/database/migrations/background_migration_helpers.rb
index 12dcf68da2f..e8cbea72887 100644
--- a/lib/gitlab/database/migrations/background_migration_helpers.rb
+++ b/lib/gitlab/database/migrations/background_migration_helpers.rb
@@ -4,8 +4,12 @@ module Gitlab
module Database
module Migrations
module BackgroundMigrationHelpers
- BACKGROUND_MIGRATION_BATCH_SIZE = 1_000 # Number of rows to process per job
- BACKGROUND_MIGRATION_JOB_BUFFER_SIZE = 1_000 # Number of jobs to bulk queue at a time
+ BATCH_SIZE = 1_000 # Number of rows to process per job
+ SUB_BATCH_SIZE = 100 # Number of rows to process per sub-batch
+ JOB_BUFFER_SIZE = 1_000 # Number of jobs to bulk queue at a time
+ BATCH_CLASS_NAME = 'PrimaryKeyBatchingStrategy' # Default batch class for batched migrations
+ BATCH_MIN_VALUE = 1 # Default minimum value for batched migrations
+ BATCH_MIN_DELAY = 2.minutes.freeze # Minimum delay between batched migrations
# Bulk queues background migration jobs for an entire table, batched by ID range.
# "Bulk" meaning many jobs will be pushed at a time for efficiency.
@@ -31,7 +35,7 @@ module Gitlab
# # do something
# end
# end
- def bulk_queue_background_migration_jobs_by_range(model_class, job_class_name, batch_size: BACKGROUND_MIGRATION_BATCH_SIZE)
+ def bulk_queue_background_migration_jobs_by_range(model_class, job_class_name, batch_size: BATCH_SIZE)
raise "#{model_class} does not have an ID to use for batch ranges" unless model_class.column_names.include?('id')
jobs = []
@@ -40,7 +44,7 @@ module Gitlab
model_class.each_batch(of: batch_size) do |relation|
start_id, end_id = relation.pluck("MIN(#{table_name}.id)", "MAX(#{table_name}.id)").first
- if jobs.length >= BACKGROUND_MIGRATION_JOB_BUFFER_SIZE
+ if jobs.length >= JOB_BUFFER_SIZE
# Note: This code path generally only helps with many millions of rows
# We push multiple jobs at a time to reduce the time spent in
# Sidekiq/Redis operations. We're using this buffer based approach so we
@@ -89,7 +93,7 @@ module Gitlab
# # do something
# end
# end
- def queue_background_migration_jobs_by_range_at_intervals(model_class, job_class_name, delay_interval, batch_size: BACKGROUND_MIGRATION_BATCH_SIZE, other_job_arguments: [], initial_delay: 0, track_jobs: false, primary_column_name: :id)
+ def queue_background_migration_jobs_by_range_at_intervals(model_class, job_class_name, delay_interval, batch_size: BATCH_SIZE, other_job_arguments: [], initial_delay: 0, track_jobs: false, primary_column_name: :id)
raise "#{model_class} does not have an ID column of #{primary_column_name} to use for batch ranges" unless model_class.column_names.include?(primary_column_name.to_s)
raise "#{primary_column_name} is not an integer column" unless model_class.columns_hash[primary_column_name.to_s].type == :integer
@@ -127,6 +131,79 @@ module Gitlab
final_delay
end
+ # Creates a batched background migration for the given table. A batched migration runs one job
+ # at a time, computing the bounds of the next batch based on the current migration settings and the previous
+ # batch bounds. Each job's execution status is tracked in the database as the migration runs. The given job
+ # class must be present in the Gitlab::BackgroundMigration module, and the batch class (if specified) must be
+ # present in the Gitlab::BackgroundMigration::BatchingStrategies module.
+ #
+ # job_class_name - The background migration job class as a string
+ # batch_table_name - The name of the table the migration will batch over
+ # batch_column_name - The name of the column the migration will batch over
+ # job_arguments - Extra arguments to pass to the job instance when the migration runs
+ # job_interval - The pause interval between each job's execution, minimum of 2 minutes
+ # batch_min_value - The value in the column the batching will begin at
+ # batch_max_value - The value in the column the batching will end at, defaults to `SELECT MAX(batch_column)`
+ # batch_class_name - The name of the class that will be called to find the range of each next batch
+ # batch_size - The maximum number of rows per job
+ # sub_batch_size - The maximum number of rows processed per "iteration" within the job
+ #
+ #
+ # *Returns the created BatchedMigration record*
+ #
+ # Example:
+ #
+ # queue_batched_background_migration(
+ # 'CopyColumnUsingBackgroundMigrationJob',
+ # :events,
+ # :id,
+ # job_interval: 2.minutes,
+ # other_job_arguments: ['column1', 'column2'])
+ #
+ # Where the the background migration exists:
+ #
+ # class Gitlab::BackgroundMigration::CopyColumnUsingBackgroundMigrationJob
+ # def perform(start_id, end_id, batch_table, batch_column, sub_batch_size, *other_args)
+ # # do something
+ # end
+ # end
+ def queue_batched_background_migration( # rubocop:disable Metrics/ParameterLists
+ job_class_name,
+ batch_table_name,
+ batch_column_name,
+ *job_arguments,
+ job_interval:,
+ batch_min_value: BATCH_MIN_VALUE,
+ batch_max_value: nil,
+ batch_class_name: BATCH_CLASS_NAME,
+ batch_size: BATCH_SIZE,
+ sub_batch_size: SUB_BATCH_SIZE
+ )
+
+ job_interval = BATCH_MIN_DELAY if job_interval < BATCH_MIN_DELAY
+
+ batch_max_value ||= connection.select_value(<<~SQL)
+ SELECT MAX(#{connection.quote_column_name(batch_column_name)})
+ FROM #{connection.quote_table_name(batch_table_name)}
+ SQL
+
+ migration_status = batch_max_value.nil? ? :finished : :active
+ batch_max_value ||= batch_min_value
+
+ Gitlab::Database::BackgroundMigration::BatchedMigration.create!(
+ job_class_name: job_class_name,
+ table_name: batch_table_name,
+ column_name: batch_column_name,
+ interval: job_interval,
+ min_value: batch_min_value,
+ max_value: batch_max_value,
+ batch_class_name: batch_class_name,
+ batch_size: batch_size,
+ sub_batch_size: sub_batch_size,
+ job_arguments: job_arguments,
+ status: migration_status)
+ end
+
def perform_background_migration_inline?
Rails.env.test? || Rails.env.development?
end
diff --git a/lib/gitlab/database/migrations/observation.rb b/lib/gitlab/database/migrations/observation.rb
index 518c2c560d2..046843824a4 100644
--- a/lib/gitlab/database/migrations/observation.rb
+++ b/lib/gitlab/database/migrations/observation.rb
@@ -7,7 +7,8 @@ module Gitlab
:migration,
:walltime,
:success,
- :total_database_size_change
+ :total_database_size_change,
+ :query_statistics
)
end
end
diff --git a/lib/gitlab/database/migrations/observers.rb b/lib/gitlab/database/migrations/observers.rb
index 4b931d3c19c..592993aeac5 100644
--- a/lib/gitlab/database/migrations/observers.rb
+++ b/lib/gitlab/database/migrations/observers.rb
@@ -6,7 +6,8 @@ module Gitlab
module Observers
def self.all_observers
[
- TotalDatabaseSizeChange.new
+ TotalDatabaseSizeChange.new,
+ QueryStatistics.new
]
end
end
diff --git a/lib/gitlab/database/migrations/observers/query_statistics.rb b/lib/gitlab/database/migrations/observers/query_statistics.rb
new file mode 100644
index 00000000000..466f4724256
--- /dev/null
+++ b/lib/gitlab/database/migrations/observers/query_statistics.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Database
+ module Migrations
+ module Observers
+ # This observer gathers statistics from the pg_stat_statements extension.
+ # Notice that this extension is not installed by default. In case it cannot
+ # be found, the observer does nothing and doesn't throw an error.
+ class QueryStatistics < MigrationObserver
+ include Gitlab::Database::SchemaHelpers
+
+ def before
+ return unless enabled?
+
+ connection.execute('select pg_stat_statements_reset()')
+ end
+
+ def record(observation)
+ return unless enabled?
+
+ observation.query_statistics = connection.execute(<<~SQL)
+ SELECT query, calls, total_time, max_time, mean_time, rows
+ FROM pg_stat_statements
+ ORDER BY total_time DESC
+ SQL
+ end
+
+ private
+
+ def enabled?
+ function_exists?(:pg_stat_statements_reset) && connection.view_exists?(:pg_stat_statements)
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/database/partitioning_migration_helpers/table_management_helpers.rb b/lib/gitlab/database/partitioning_migration_helpers/table_management_helpers.rb
index f4cf576dda7..1c289391e21 100644
--- a/lib/gitlab/database/partitioning_migration_helpers/table_management_helpers.rb
+++ b/lib/gitlab/database/partitioning_migration_helpers/table_management_helpers.rb
@@ -9,7 +9,7 @@ module Gitlab
include ::Gitlab::Database::MigrationHelpers
include ::Gitlab::Database::Migrations::BackgroundMigrationHelpers
- ALLOWED_TABLES = %w[audit_events].freeze
+ ALLOWED_TABLES = %w[audit_events web_hook_logs].freeze
ERROR_SCOPE = 'table partitioning'
MIGRATION_CLASS_NAME = "::#{module_parent_name}::BackfillPartitionedTable"
diff --git a/lib/gitlab/database/similarity_score.rb b/lib/gitlab/database/similarity_score.rb
index ff78fd0218c..40845c0d5e0 100644
--- a/lib/gitlab/database/similarity_score.rb
+++ b/lib/gitlab/database/similarity_score.rb
@@ -74,9 +74,14 @@ module Gitlab
end
# (SIMILARITY ...) + (SIMILARITY ...)
- expressions.inject(first_expression) do |expression1, expression2|
+ additions = expressions.inject(first_expression) do |expression1, expression2|
Arel::Nodes::Addition.new(expression1, expression2)
end
+
+ score_as_numeric = Arel::Nodes::NamedFunction.new('CAST', [Arel::Nodes::Grouping.new(additions).as('numeric')])
+
+ # Rounding the score to two decimals
+ Arel::Nodes::NamedFunction.new('ROUND', [score_as_numeric, 2])
end
def self.order_by_similarity?(arel_query)
diff --git a/lib/gitlab/dependency_linker/base_linker.rb b/lib/gitlab/dependency_linker/base_linker.rb
index d735fb55652..36a840372c5 100644
--- a/lib/gitlab/dependency_linker/base_linker.rb
+++ b/lib/gitlab/dependency_linker/base_linker.rb
@@ -80,7 +80,7 @@ module Gitlab
highlighted_lines.map!.with_index do |rich_line, i|
marker = StringRegexMarker.new((plain_lines[i].chomp! || plain_lines[i]), rich_line.html_safe)
- marker.mark(regex, group: :name) do |text, left:, right:|
+ marker.mark(regex, group: :name) do |text, left:, right:, mode:|
url = yield(text)
url ? link_tag(text, url) : text
end
diff --git a/lib/gitlab/dependency_linker/go_mod_linker.rb b/lib/gitlab/dependency_linker/go_mod_linker.rb
index 4d6fe366333..fae4ee23383 100644
--- a/lib/gitlab/dependency_linker/go_mod_linker.rb
+++ b/lib/gitlab/dependency_linker/go_mod_linker.rb
@@ -22,7 +22,7 @@ module Gitlab
i, j = match.offset(:name)
marker = StringRangeMarker.new(plain_line, rich_line.html_safe)
- marker.mark([i..(j - 1)]) do |text, left:, right:|
+ marker.mark([i..(j - 1)]) do |text, left:, right:, mode:|
url = package_url(text, match[:version])
url ? link_tag(text, url) : text
end
diff --git a/lib/gitlab/dependency_linker/go_sum_linker.rb b/lib/gitlab/dependency_linker/go_sum_linker.rb
index 20dc82ede9f..44826332f66 100644
--- a/lib/gitlab/dependency_linker/go_sum_linker.rb
+++ b/lib/gitlab/dependency_linker/go_sum_linker.rb
@@ -21,7 +21,7 @@ module Gitlab
i2, j2 = match.offset(:checksum)
marker = StringRangeMarker.new(plain_line, rich_line.html_safe)
- marker.mark([i0..(j0 - 1), i2..(j2 - 1)]) do |text, left:, right:|
+ marker.mark([i0..(j0 - 1), i2..(j2 - 1)]) do |text, left:, right:, mode:|
if left
url = package_url(text, match[:version])
url ? link_tag(text, url) : text
diff --git a/lib/gitlab/diff/char_diff.rb b/lib/gitlab/diff/char_diff.rb
index c8bb39e9f5d..1b3af8f75ca 100644
--- a/lib/gitlab/diff/char_diff.rb
+++ b/lib/gitlab/diff/char_diff.rb
@@ -32,12 +32,12 @@ module Gitlab
end
if action == :delete
- old_diffs << (old_pointer..(old_pointer + content_size - 1))
+ old_diffs << MarkerRange.new(old_pointer, old_pointer + content_size - 1, mode: MarkerRange::DELETION)
old_pointer += content_size
end
if action == :insert
- new_diffs << (new_pointer..(new_pointer + content_size - 1))
+ new_diffs << MarkerRange.new(new_pointer, new_pointer + content_size - 1, mode: MarkerRange::ADDITION)
new_pointer += content_size
end
end
diff --git a/lib/gitlab/diff/highlight.rb b/lib/gitlab/diff/highlight.rb
index 035084d4861..baa46e7e306 100644
--- a/lib/gitlab/diff/highlight.rb
+++ b/lib/gitlab/diff/highlight.rb
@@ -31,6 +31,12 @@ module Gitlab
if line_inline_diffs = inline_diffs[i]
begin
+ # MarkerRange objects are converted to Ranges to keep the previous behavior
+ # Issue: https://gitlab.com/gitlab-org/gitlab/-/issues/324068
+ if Feature.disabled?(:introduce_marker_ranges, project, default_enabled: :yaml)
+ line_inline_diffs = line_inline_diffs.map { |marker_range| marker_range.to_range }
+ end
+
rich_line = InlineDiffMarker.new(diff_line.text, rich_line).mark(line_inline_diffs)
# This should only happen when the encoding of the diff doesn't
# match the blob, which is a bug. But we shouldn't fail to render
@@ -67,7 +73,7 @@ module Gitlab
end
def inline_diffs
- @inline_diffs ||= InlineDiff.for_lines(@raw_lines, project: project)
+ @inline_diffs ||= InlineDiff.for_lines(@raw_lines)
end
def old_lines
diff --git a/lib/gitlab/diff/highlight_cache.rb b/lib/gitlab/diff/highlight_cache.rb
index 7932cd2a837..c5e9bfdc321 100644
--- a/lib/gitlab/diff/highlight_cache.rb
+++ b/lib/gitlab/diff/highlight_cache.rb
@@ -7,8 +7,7 @@ module Gitlab
include Gitlab::Utils::StrongMemoize
EXPIRATION = 1.week
- VERSION = 1
- NEXT_VERSION = 2
+ VERSION = 2
delegate :diffable, to: :@diff_collection
delegate :diff_options, to: :@diff_collection
@@ -70,20 +69,17 @@ module Gitlab
def key
strong_memoize(:redis_key) do
- ['highlighted-diff-files', diffable.cache_key, version, diff_options].join(":")
+ [
+ 'highlighted-diff-files',
+ diffable.cache_key, VERSION,
+ diff_options,
+ Feature.enabled?(:introduce_marker_ranges, diffable.project, default_enabled: :yaml)
+ ].join(":")
end
end
private
- def version
- if Feature.enabled?(:improved_merge_diff_highlighting, diffable.project, default_enabled: :yaml)
- NEXT_VERSION
- else
- VERSION
- end
- end
-
def set_highlighted_diff_lines(diff_file, content)
diff_file.highlighted_diff_lines = content.map do |line|
Gitlab::Diff::Line.safe_init_from_hash(line)
diff --git a/lib/gitlab/diff/inline_diff.rb b/lib/gitlab/diff/inline_diff.rb
index cf769262958..dd73e4d6c15 100644
--- a/lib/gitlab/diff/inline_diff.rb
+++ b/lib/gitlab/diff/inline_diff.rb
@@ -3,22 +3,6 @@
module Gitlab
module Diff
class InlineDiff
- # Regex to find a run of deleted lines followed by the same number of added lines
- LINE_PAIRS_PATTERN = %r{
- # Runs start at the beginning of the string (the first line) or after a space (for an unchanged line)
- (?:\A|\s)
-
- # This matches a number of `-`s followed by the same number of `+`s through recursion
- (?<del_ins>
- -
- \g<del_ins>?
- \+
- )
-
- # Runs end at the end of the string (the last line) or before a space (for an unchanged line)
- (?=\s|\z)
- }x.freeze
-
attr_accessor :old_line, :new_line, :offset
def initialize(old_line, new_line, offset: 0)
@@ -27,28 +11,24 @@ module Gitlab
@offset = offset
end
- def inline_diffs(project: nil)
+ def inline_diffs
# Skip inline diff if empty line was replaced with content
return if old_line == ""
- if Feature.enabled?(:improved_merge_diff_highlighting, project, default_enabled: :yaml)
- CharDiff.new(old_line, new_line).changed_ranges(offset: offset)
- else
- deprecated_diff
- end
+ CharDiff.new(old_line, new_line).changed_ranges(offset: offset)
end
class << self
- def for_lines(lines, project: nil)
- changed_line_pairs = find_changed_line_pairs(lines)
+ def for_lines(lines)
+ pair_selector = Gitlab::Diff::PairSelector.new(lines)
inline_diffs = []
- changed_line_pairs.each do |old_index, new_index|
+ pair_selector.each do |old_index, new_index|
old_line = lines[old_index]
new_line = lines[new_index]
- old_diffs, new_diffs = new(old_line, new_line, offset: 1).inline_diffs(project: project)
+ old_diffs, new_diffs = new(old_line, new_line, offset: 1).inline_diffs
inline_diffs[old_index] = old_diffs
inline_diffs[new_index] = new_diffs
@@ -56,74 +36,6 @@ module Gitlab
inline_diffs
end
-
- private
-
- # Finds pairs of old/new line pairs that represent the same line that changed
- # rubocop: disable CodeReuse/ActiveRecord
- def find_changed_line_pairs(lines)
- # Prefixes of all diff lines, indicating their types
- # For example: `" - + -+ ---+++ --+ -++"`
- line_prefixes = lines.each_with_object(+"") { |line, s| s << (line[0] || ' ') }.gsub(/[^ +-]/, ' ')
-
- changed_line_pairs = []
- line_prefixes.scan(LINE_PAIRS_PATTERN) do
- # For `"---+++"`, `begin_index == 0`, `end_index == 6`
- begin_index, end_index = Regexp.last_match.offset(:del_ins)
-
- # For `"---+++"`, `changed_line_count == 3`
- changed_line_count = (end_index - begin_index) / 2
-
- halfway_index = begin_index + changed_line_count
- (begin_index...halfway_index).each do |i|
- # For `"---+++"`, index 1 maps to 1 + 3 = 4
- changed_line_pairs << [i, i + changed_line_count]
- end
- end
-
- changed_line_pairs
- end
- # rubocop: enable CodeReuse/ActiveRecord
- end
-
- private
-
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/299884
- def deprecated_diff
- lcp = longest_common_prefix(old_line, new_line)
- lcs = longest_common_suffix(old_line[lcp..-1], new_line[lcp..-1])
-
- lcp += offset
- old_length = old_line.length + offset
- new_length = new_line.length + offset
-
- old_diff_range = lcp..(old_length - lcs - 1)
- new_diff_range = lcp..(new_length - lcs - 1)
-
- old_diffs = [old_diff_range] if old_diff_range.begin <= old_diff_range.end
- new_diffs = [new_diff_range] if new_diff_range.begin <= new_diff_range.end
-
- [old_diffs, new_diffs]
- end
-
- def longest_common_prefix(a, b) # rubocop:disable Naming/UncommunicativeMethodParamName
- max_length = [a.length, b.length].max
-
- length = 0
- (0..max_length - 1).each do |pos|
- old_char = a[pos]
- new_char = b[pos]
-
- break if old_char != new_char
-
- length += 1
- end
-
- length
- end
-
- def longest_common_suffix(a, b) # rubocop:disable Naming/UncommunicativeMethodParamName
- longest_common_prefix(a.reverse, b.reverse)
end
end
end
diff --git a/lib/gitlab/diff/inline_diff_markdown_marker.rb b/lib/gitlab/diff/inline_diff_markdown_marker.rb
index 3c536c43a9e..d8d596ebce7 100644
--- a/lib/gitlab/diff/inline_diff_markdown_marker.rb
+++ b/lib/gitlab/diff/inline_diff_markdown_marker.rb
@@ -8,8 +8,8 @@ module Gitlab
deletion: "-"
}.freeze
- def mark(line_inline_diffs, mode: nil)
- super(line_inline_diffs) do |text, left:, right:|
+ def mark(line_inline_diffs)
+ super(line_inline_diffs) do |text, left:, right:, mode:|
symbol = MARKDOWN_SYMBOLS[mode]
"{#{symbol}#{text}#{symbol}}"
end
diff --git a/lib/gitlab/diff/inline_diff_marker.rb b/lib/gitlab/diff/inline_diff_marker.rb
index 29dff699ba5..c8cc1c0e649 100644
--- a/lib/gitlab/diff/inline_diff_marker.rb
+++ b/lib/gitlab/diff/inline_diff_marker.rb
@@ -7,8 +7,8 @@ module Gitlab
super(line, rich_line || line)
end
- def mark(line_inline_diffs, mode: nil)
- super(line_inline_diffs) do |text, left:, right:|
+ def mark(line_inline_diffs)
+ super(line_inline_diffs) do |text, left:, right:, mode:|
%{<span class="#{html_class_names(left, right, mode)}">#{text}</span>}.html_safe
end
end
diff --git a/lib/gitlab/diff/pair_selector.rb b/lib/gitlab/diff/pair_selector.rb
new file mode 100644
index 00000000000..2e5ee3a7363
--- /dev/null
+++ b/lib/gitlab/diff/pair_selector.rb
@@ -0,0 +1,58 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Diff
+ class PairSelector
+ include Enumerable
+
+ # Regex to find a run of deleted lines followed by the same number of added lines
+ # rubocop: disable Lint/MixedRegexpCaptureTypes
+ LINE_PAIRS_PATTERN = %r{
+ # Runs start at the beginning of the string (the first line) or after a space (for an unchanged line)
+ (?:\A|\s)
+
+ # This matches a number of `-`s followed by the same number of `+`s through recursion
+ (?<del_ins>
+ -
+ \g<del_ins>?
+ \+
+ )
+
+ # Runs end at the end of the string (the last line) or before a space (for an unchanged line)
+ (?=\s|\z)
+ }x.freeze
+ # rubocop: enable Lint/MixedRegexpCaptureTypes
+
+ def initialize(lines)
+ @lines = lines
+ end
+
+ # Finds pairs of old/new line pairs that represent the same line that changed
+ # rubocop: disable CodeReuse/ActiveRecord
+ def each
+ # Prefixes of all diff lines, indicating their types
+ # For example: `" - + -+ ---+++ --+ -++"`
+ line_prefixes = lines.each_with_object(+"") { |line, s| s << (line[0] || ' ') }.gsub(/[^ +-]/, ' ')
+
+ line_prefixes.scan(LINE_PAIRS_PATTERN) do
+ # For `"---+++"`, `begin_index == 0`, `end_index == 6`
+ begin_index, end_index = Regexp.last_match.offset(:del_ins)
+
+ # For `"---+++"`, `changed_line_count == 3`
+ changed_line_count = (end_index - begin_index) / 2
+
+ halfway_index = begin_index + changed_line_count
+ (begin_index...halfway_index).each do |i|
+ # For `"---+++"`, index 1 maps to 1 + 3 = 4
+ yield [i, i + changed_line_count]
+ end
+ end
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ private
+
+ attr_reader :lines
+ end
+ end
+end
diff --git a/lib/gitlab/email/handler/service_desk_handler.rb b/lib/gitlab/email/handler/service_desk_handler.rb
index d1dd616385d..80e8b726099 100644
--- a/lib/gitlab/email/handler/service_desk_handler.rb
+++ b/lib/gitlab/email/handler/service_desk_handler.rb
@@ -79,7 +79,7 @@ module Gitlab
@issue = Issues::CreateService.new(
project,
User.support_bot,
- title: issue_title,
+ title: mail.subject,
description: message_including_template,
confidential: true,
external_author: from_address
@@ -137,12 +137,6 @@ module Gitlab
(mail.reply_to || []).first || mail.from.first || mail.sender
end
- def issue_title
- from = "(from #{from_address})" if from_address
-
- "Service Desk #{from}: #{mail.subject}"
- end
-
def can_handle_legacy_format?
project_path && project_path.include?('/') && !mail_key.include?('+')
end
diff --git a/lib/gitlab/error_tracking.rb b/lib/gitlab/error_tracking.rb
index 1a8e5aaf07a..dfed8db8df0 100644
--- a/lib/gitlab/error_tracking.rb
+++ b/lib/gitlab/error_tracking.rb
@@ -27,33 +27,16 @@ module Gitlab
config.sanitize_fields = Rails.application.config.filter_parameters.map(&:to_s)
config.processors << ::Gitlab::ErrorTracking::Processor::SidekiqProcessor
config.processors << ::Gitlab::ErrorTracking::Processor::GrpcErrorProcessor
+ config.processors << ::Gitlab::ErrorTracking::Processor::ContextPayloadProcessor
# Sanitize authentication headers
config.sanitize_http_headers = %w[Authorization Private-Token]
- config.tags = extra_tags_from_env.merge(program: Gitlab.process_name)
config.before_send = method(:before_send)
yield config if block_given?
end
end
- def with_context(current_user = nil)
- last_user_context = Raven.context.user
-
- user_context = {
- id: current_user&.id,
- email: current_user&.email,
- username: current_user&.username
- }.compact
-
- Raven.tags_context(default_tags)
- Raven.user_context(user_context)
-
- yield
- ensure
- Raven.user_context(last_user_context)
- end
-
# This should be used when you want to passthrough exception handling:
# rescue and raise to be catched in upper layers of the application.
#
@@ -118,37 +101,20 @@ module Gitlab
end
def process_exception(exception, sentry: false, logging: true, extra:)
- exception.try(:sentry_extra_data)&.tap do |data|
- extra = extra.merge(data) if data.is_a?(Hash)
- end
-
- extra = sanitize_request_parameters(extra)
+ context_payload = Gitlab::ErrorTracking::ContextPayloadGenerator.generate(exception, extra)
if sentry && Raven.configuration.server
- Raven.capture_exception(exception, tags: default_tags, extra: extra)
+ Raven.capture_exception(exception, **context_payload)
end
if logging
- # TODO: this logic could migrate into `Gitlab::ExceptionLogFormatter`
- # and we could also flatten deep nested hashes if required for search
- # (e.g. if `extra` includes hash of hashes).
- # In the current implementation, we don't flatten multi-level folded hashes.
- log_hash = {}
- Raven.context.tags.each { |name, value| log_hash["tags.#{name}"] = value }
- Raven.context.user.each { |name, value| log_hash["user.#{name}"] = value }
- Raven.context.extra.merge(extra).each { |name, value| log_hash["extra.#{name}"] = value }
-
- Gitlab::ExceptionLogFormatter.format!(exception, log_hash)
+ formatter = Gitlab::ErrorTracking::LogFormatter.new
+ log_hash = formatter.generate_log(exception, context_payload)
Gitlab::ErrorTracking::Logger.error(log_hash)
end
end
- def sanitize_request_parameters(parameters)
- filter = ActiveSupport::ParameterFilter.new(::Rails.application.config.filter_parameters)
- filter.filter(parameters)
- end
-
def sentry_dsn
return unless Rails.env.production? || Rails.env.development?
return unless Gitlab.config.sentry.enabled
@@ -160,22 +126,6 @@ module Gitlab
Rails.env.development? || Rails.env.test?
end
- def default_tags
- {
- Labkit::Correlation::CorrelationId::LOG_KEY.to_sym => Labkit::Correlation::CorrelationId.current_id,
- locale: I18n.locale
- }
- end
-
- # Static tags that are set on application start
- def extra_tags_from_env
- Gitlab::Json.parse(ENV.fetch('GITLAB_SENTRY_EXTRA_TAGS', '{}')).to_hash
- rescue => e
- Gitlab::AppLogger.debug("GITLAB_SENTRY_EXTRA_TAGS could not be parsed as JSON: #{e.class.name}: #{e.message}")
-
- {}
- end
-
# Group common, mostly non-actionable exceptions by type and message,
# rather than cause
def custom_fingerprinting(event, ex)
diff --git a/lib/gitlab/error_tracking/context_payload_generator.rb b/lib/gitlab/error_tracking/context_payload_generator.rb
new file mode 100644
index 00000000000..c99283b3d20
--- /dev/null
+++ b/lib/gitlab/error_tracking/context_payload_generator.rb
@@ -0,0 +1,66 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module ErrorTracking
+ class ContextPayloadGenerator
+ def self.generate(exception, extra = {})
+ new.generate(exception, extra)
+ end
+
+ def generate(exception, extra = {})
+ {
+ extra: extra_payload(exception, extra),
+ tags: tags_payload,
+ user: user_payload
+ }
+ end
+
+ private
+
+ def extra_payload(exception, extra)
+ inline_extra = exception.try(:sentry_extra_data)
+ if inline_extra.present? && inline_extra.is_a?(Hash)
+ extra = extra.merge(inline_extra)
+ end
+
+ sanitize_request_parameters(extra)
+ end
+
+ def sanitize_request_parameters(parameters)
+ filter = ActiveSupport::ParameterFilter.new(::Rails.application.config.filter_parameters)
+ filter.filter(parameters)
+ end
+
+ def tags_payload
+ extra_tags_from_env.merge!(
+ program: Gitlab.process_name,
+ locale: I18n.locale,
+ feature_category: current_context['meta.feature_category'],
+ Labkit::Correlation::CorrelationId::LOG_KEY.to_sym => Labkit::Correlation::CorrelationId.current_id
+ )
+ end
+
+ def user_payload
+ {
+ username: current_context['meta.user']
+ }
+ end
+
+ # Static tags that are set on application start
+ def extra_tags_from_env
+ Gitlab::Json.parse(ENV.fetch('GITLAB_SENTRY_EXTRA_TAGS', '{}')).to_hash
+ rescue => e
+ Gitlab::AppLogger.debug("GITLAB_SENTRY_EXTRA_TAGS could not be parsed as JSON: #{e.class.name}: #{e.message}")
+
+ {}
+ end
+
+ def current_context
+ # In case Gitlab::ErrorTracking is used when the app starts
+ return {} unless defined?(::Gitlab::ApplicationContext)
+
+ ::Gitlab::ApplicationContext.current.to_h
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/error_tracking/detailed_error.rb b/lib/gitlab/error_tracking/detailed_error.rb
index 5d272efa64a..d0b3fc176aa 100644
--- a/lib/gitlab/error_tracking/detailed_error.rb
+++ b/lib/gitlab/error_tracking/detailed_error.rb
@@ -1,5 +1,7 @@
# frozen_string_literal: true
+# This should be in the ErrorTracking namespace. For more details, see:
+# https://gitlab.com/gitlab-org/gitlab/-/issues/323342
module Gitlab
module ErrorTracking
class DetailedError
diff --git a/lib/gitlab/error_tracking/error.rb b/lib/gitlab/error_tracking/error.rb
index 6bfb9dae610..a256f87ec3d 100644
--- a/lib/gitlab/error_tracking/error.rb
+++ b/lib/gitlab/error_tracking/error.rb
@@ -1,5 +1,7 @@
# frozen_string_literal: true
+# This should be in the ErrorTracking namespace. For more details, see:
+# https://gitlab.com/gitlab-org/gitlab/-/issues/323342
module Gitlab
module ErrorTracking
class Error
diff --git a/lib/gitlab/error_tracking/error_collection.rb b/lib/gitlab/error_tracking/error_collection.rb
index 56bcb671363..d01064bb677 100644
--- a/lib/gitlab/error_tracking/error_collection.rb
+++ b/lib/gitlab/error_tracking/error_collection.rb
@@ -1,5 +1,7 @@
# frozen_string_literal: true
+# This should be in the ErrorTracking namespace. For more details, see:
+# https://gitlab.com/gitlab-org/gitlab/-/issues/323342
module Gitlab
module ErrorTracking
class ErrorCollection
diff --git a/lib/gitlab/error_tracking/error_event.rb b/lib/gitlab/error_tracking/error_event.rb
index 015d2c0ead0..d80289f6bc9 100644
--- a/lib/gitlab/error_tracking/error_event.rb
+++ b/lib/gitlab/error_tracking/error_event.rb
@@ -1,5 +1,7 @@
# frozen_string_literal: true
+# This should be in the ErrorTracking namespace. For more details, see:
+# https://gitlab.com/gitlab-org/gitlab/-/issues/323342
module Gitlab
module ErrorTracking
class ErrorEvent
diff --git a/lib/gitlab/error_tracking/log_formatter.rb b/lib/gitlab/error_tracking/log_formatter.rb
new file mode 100644
index 00000000000..d004c4e20bb
--- /dev/null
+++ b/lib/gitlab/error_tracking/log_formatter.rb
@@ -0,0 +1,55 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module ErrorTracking
+ class LogFormatter
+ # Note: all the accesses to Raven's contexts here are to keep the
+ # backward-compatibility to Sentry's built-in integrations. In future,
+ # they can be removed.
+ def generate_log(exception, context_payload)
+ payload = {}
+
+ Gitlab::ExceptionLogFormatter.format!(exception, payload)
+ append_user_to_log!(payload, context_payload)
+ append_tags_to_log!(payload, context_payload)
+ append_extra_to_log!(payload, context_payload)
+
+ payload
+ end
+
+ private
+
+ def append_user_to_log!(payload, context_payload)
+ user_context = Raven.context.user.merge(context_payload[:user])
+ user_context.each do |key, value|
+ payload["user.#{key}"] = value
+ end
+ end
+
+ def append_tags_to_log!(payload, context_payload)
+ tags_context = Raven.context.tags.merge(context_payload[:tags])
+ tags_context.each do |key, value|
+ payload["tags.#{key}"] = value
+ end
+ end
+
+ def append_extra_to_log!(payload, context_payload)
+ extra = Raven.context.extra.merge(context_payload[:extra])
+ extra = extra.except(:server)
+
+ # The extra value for sidekiq is a hash whose keys are strings.
+ if extra[:sidekiq].is_a?(Hash) && extra[:sidekiq].key?('args')
+ sidekiq_extra = extra.delete(:sidekiq)
+ sidekiq_extra['args'] = Gitlab::ErrorTracking::Processor::SidekiqProcessor.loggable_arguments(
+ sidekiq_extra['args'], sidekiq_extra['class']
+ )
+ payload["extra.sidekiq"] = sidekiq_extra
+ end
+
+ extra.each do |key, value|
+ payload["extra.#{key}"] = value
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/error_tracking/processor/context_payload_processor.rb b/lib/gitlab/error_tracking/processor/context_payload_processor.rb
new file mode 100644
index 00000000000..5185205e94e
--- /dev/null
+++ b/lib/gitlab/error_tracking/processor/context_payload_processor.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module ErrorTracking
+ module Processor
+ class ContextPayloadProcessor < ::Raven::Processor
+ # This processor is added to inject application context into Sentry
+ # events generated by Sentry built-in integrations. When the
+ # integrations are re-implemented and use Gitlab::ErrorTracking, this
+ # processor should be removed.
+ def process(payload)
+ context_payload = Gitlab::ErrorTracking::ContextPayloadGenerator.generate(nil, {})
+ payload.deep_merge!(context_payload)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/error_tracking/project.rb b/lib/gitlab/error_tracking/project.rb
index 93e81da5034..a4ed8831e38 100644
--- a/lib/gitlab/error_tracking/project.rb
+++ b/lib/gitlab/error_tracking/project.rb
@@ -1,5 +1,7 @@
# frozen_string_literal: true
+# This should be in the ErrorTracking namespace. For more details, see:
+# https://gitlab.com/gitlab-org/gitlab/-/issues/323342
module Gitlab
module ErrorTracking
class Project
diff --git a/lib/gitlab/error_tracking/repo.rb b/lib/gitlab/error_tracking/repo.rb
index 50611943bac..e88ac58ff0f 100644
--- a/lib/gitlab/error_tracking/repo.rb
+++ b/lib/gitlab/error_tracking/repo.rb
@@ -1,5 +1,7 @@
# frozen_string_literal: true
+# This should be in the ErrorTracking namespace. For more details, see:
+# https://gitlab.com/gitlab-org/gitlab/-/issues/323342
module Gitlab
module ErrorTracking
class Repo
diff --git a/lib/gitlab/error_tracking/stack_trace_highlight_decorator.rb b/lib/gitlab/error_tracking/stack_trace_highlight_decorator.rb
index 1e490e52c43..24f4c2a2dcf 100644
--- a/lib/gitlab/error_tracking/stack_trace_highlight_decorator.rb
+++ b/lib/gitlab/error_tracking/stack_trace_highlight_decorator.rb
@@ -1,5 +1,7 @@
# frozen_string_literal: true
+# This should be in the ErrorTracking namespace. For more details, see:
+# https://gitlab.com/gitlab-org/gitlab/-/issues/323342
module Gitlab
module ErrorTracking
module StackTraceHighlightDecorator
diff --git a/lib/gitlab/etag_caching/middleware.rb b/lib/gitlab/etag_caching/middleware.rb
index fc3c05c57b2..8c916375a98 100644
--- a/lib/gitlab/etag_caching/middleware.rb
+++ b/lib/gitlab/etag_caching/middleware.rb
@@ -17,12 +17,12 @@ module Gitlab
def call(env)
request = ActionDispatch::Request.new(env)
- route = Gitlab::EtagCaching::Router.match(request.path_info)
+ route = Gitlab::EtagCaching::Router.match(request)
return @app.call(env) unless route
track_event(:etag_caching_middleware_used, route)
- etag, cached_value_present = get_etag(request)
+ etag, cached_value_present = get_etag(request, route)
if_none_match = env['HTTP_IF_NONE_MATCH']
if if_none_match == etag
@@ -36,8 +36,8 @@ module Gitlab
private
- def get_etag(request)
- cache_key = request.path
+ def get_etag(request, route)
+ cache_key = route.cache_key(request)
store = Gitlab::EtagCaching::Store.new
current_value = store.get(cache_key)
cached_value_present = current_value.present?
diff --git a/lib/gitlab/etag_caching/router.rb b/lib/gitlab/etag_caching/router.rb
index 769ac2784d1..742b72ecde9 100644
--- a/lib/gitlab/etag_caching/router.rb
+++ b/lib/gitlab/etag_caching/router.rb
@@ -2,99 +2,24 @@
module Gitlab
module EtagCaching
- class Router
- Route = Struct.new(:regexp, :name, :feature_category)
- # We enable an ETag for every request matching the regex.
- # To match a regex the path needs to match the following:
- # - Don't contain a reserved word (expect for the words used in the
- # regex itself)
- # - Ending in `noteable/issue/<id>/notes` for the `issue_notes` route
- # - Ending in `issues/id`/realtime_changes` for the `issue_title` route
- USED_IN_ROUTES = %w[noteable issue notes issues realtime_changes
- commit pipelines merge_requests builds
- new environments].freeze
- RESERVED_WORDS = Gitlab::PathRegex::ILLEGAL_PROJECT_PATH_WORDS - USED_IN_ROUTES
- RESERVED_WORDS_REGEX = Regexp.union(*RESERVED_WORDS.map(&Regexp.method(:escape)))
- RESERVED_WORDS_PREFIX = %Q(^(?!.*\/(#{RESERVED_WORDS_REGEX})\/).*)
+ module Router
+ Route = Struct.new(:regexp, :name, :feature_category, :router) do
+ delegate :match, to: :regexp
+ delegate :cache_key, to: :router
+ end
- ROUTES = [
- Gitlab::EtagCaching::Router::Route.new(
- %r(#{RESERVED_WORDS_PREFIX}/noteable/issue/\d+/notes\z),
- 'issue_notes',
- 'issue_tracking'
- ),
- Gitlab::EtagCaching::Router::Route.new(
- %r(#{RESERVED_WORDS_PREFIX}/noteable/merge_request/\d+/notes\z),
- 'merge_request_notes',
- 'code_review'
- ),
- Gitlab::EtagCaching::Router::Route.new(
- %r(#{RESERVED_WORDS_PREFIX}/issues/\d+/realtime_changes\z),
- 'issue_title',
- 'issue_tracking'
- ),
- Gitlab::EtagCaching::Router::Route.new(
- %r(#{RESERVED_WORDS_PREFIX}/commit/\S+/pipelines\.json\z),
- 'commit_pipelines',
- 'continuous_integration'
- ),
- Gitlab::EtagCaching::Router::Route.new(
- %r(#{RESERVED_WORDS_PREFIX}/merge_requests/new\.json\z),
- 'new_merge_request_pipelines',
- 'continuous_integration'
- ),
- Gitlab::EtagCaching::Router::Route.new(
- %r(#{RESERVED_WORDS_PREFIX}/merge_requests/\d+/pipelines\.json\z),
- 'merge_request_pipelines',
- 'continuous_integration'
- ),
- Gitlab::EtagCaching::Router::Route.new(
- %r(#{RESERVED_WORDS_PREFIX}/pipelines\.json\z),
- 'project_pipelines',
- 'continuous_integration'
- ),
- Gitlab::EtagCaching::Router::Route.new(
- %r(#{RESERVED_WORDS_PREFIX}/pipelines/\d+\.json\z),
- 'project_pipeline',
- 'continuous_integration'
- ),
- Gitlab::EtagCaching::Router::Route.new(
- %r(#{RESERVED_WORDS_PREFIX}/builds/\d+\.json\z),
- 'project_build',
- 'continuous_integration'
- ),
- Gitlab::EtagCaching::Router::Route.new(
- %r(#{RESERVED_WORDS_PREFIX}/clusters/\d+/environments\z),
- 'cluster_environments',
- 'continuous_delivery'
- ),
- Gitlab::EtagCaching::Router::Route.new(
- %r(#{RESERVED_WORDS_PREFIX}/environments\.json\z),
- 'environments',
- 'continuous_delivery'
- ),
- Gitlab::EtagCaching::Router::Route.new(
- %r(#{RESERVED_WORDS_PREFIX}/import/github/realtime_changes\.json\z),
- 'realtime_changes_import_github',
- 'importers'
- ),
- Gitlab::EtagCaching::Router::Route.new(
- %r(#{RESERVED_WORDS_PREFIX}/import/gitea/realtime_changes\.json\z),
- 'realtime_changes_import_gitea',
- 'importers'
- ),
- Gitlab::EtagCaching::Router::Route.new(
- %r(#{RESERVED_WORDS_PREFIX}/merge_requests/\d+/cached_widget\.json\z),
- 'merge_request_widget',
- 'code_review'
- )
- ].freeze
+ module Helpers
+ def build_route(attrs)
+ EtagCaching::Router::Route.new(*attrs, self)
+ end
+ end
- def self.match(path)
- ROUTES.find { |route| route.regexp.match(path) }
+ # Performing RESTful routing match before GraphQL would be more expensive
+ # for the GraphQL requests because we need to traverse all of the RESTful
+ # route definitions before falling back to GraphQL.
+ def self.match(request)
+ Router::Graphql.match(request) || Router::Restful.match(request)
end
end
end
end
-
-Gitlab::EtagCaching::Router.prepend_if_ee('EE::Gitlab::EtagCaching::Router')
diff --git a/lib/gitlab/etag_caching/router/graphql.rb b/lib/gitlab/etag_caching/router/graphql.rb
new file mode 100644
index 00000000000..f1737f0ce5a
--- /dev/null
+++ b/lib/gitlab/etag_caching/router/graphql.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module EtagCaching
+ module Router
+ class Graphql
+ extend EtagCaching::Router::Helpers
+ GRAPHQL_ETAG_RESOURCE_HEADER = 'X-GITLAB-GRAPHQL-RESOURCE-ETAG'
+
+ ROUTES = [
+ [
+ %r(\Apipelines/id/\d+\z),
+ 'pipelines_graph',
+ 'continuous_integration'
+ ]
+ ].map(&method(:build_route)).freeze
+
+ def self.match(request)
+ return unless request.path_info == graphql_api_path
+
+ graphql_resource = request.headers[GRAPHQL_ETAG_RESOURCE_HEADER]
+ return unless graphql_resource
+
+ ROUTES.find { |route| route.match(graphql_resource) }
+ end
+
+ def self.cache_key(request)
+ [
+ request.path,
+ request.headers[GRAPHQL_ETAG_RESOURCE_HEADER]
+ ].compact.join(':')
+ end
+
+ def self.graphql_api_path
+ @graphql_api_path ||= Gitlab::Routing.url_helpers.api_graphql_path
+ end
+ private_class_method :graphql_api_path
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/etag_caching/router/restful.rb b/lib/gitlab/etag_caching/router/restful.rb
new file mode 100644
index 00000000000..08c20e30a48
--- /dev/null
+++ b/lib/gitlab/etag_caching/router/restful.rb
@@ -0,0 +1,112 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module EtagCaching
+ module Router
+ class Restful
+ extend EtagCaching::Router::Helpers
+
+ # We enable an ETag for every request matching the regex.
+ # To match a regex the path needs to match the following:
+ # - Don't contain a reserved word (expect for the words used in the
+ # regex itself)
+ # - Ending in `noteable/issue/<id>/notes` for the `issue_notes` route
+ # - Ending in `issues/id`/realtime_changes` for the `issue_title` route
+ USED_IN_ROUTES = %w[noteable issue notes issues realtime_changes
+ commit pipelines merge_requests builds
+ new environments].freeze
+ RESERVED_WORDS = Gitlab::PathRegex::ILLEGAL_PROJECT_PATH_WORDS - USED_IN_ROUTES
+ RESERVED_WORDS_REGEX = Regexp.union(*RESERVED_WORDS.map(&Regexp.method(:escape)))
+ RESERVED_WORDS_PREFIX = %Q(^(?!.*\/(#{RESERVED_WORDS_REGEX})\/).*)
+
+ ROUTES = [
+ [
+ %r(#{RESERVED_WORDS_PREFIX}/noteable/issue/\d+/notes\z),
+ 'issue_notes',
+ 'issue_tracking'
+ ],
+ [
+ %r(#{RESERVED_WORDS_PREFIX}/noteable/merge_request/\d+/notes\z),
+ 'merge_request_notes',
+ 'code_review'
+ ],
+ [
+ %r(#{RESERVED_WORDS_PREFIX}/issues/\d+/realtime_changes\z),
+ 'issue_title',
+ 'issue_tracking'
+ ],
+ [
+ %r(#{RESERVED_WORDS_PREFIX}/commit/\S+/pipelines\.json\z),
+ 'commit_pipelines',
+ 'continuous_integration'
+ ],
+ [
+ %r(#{RESERVED_WORDS_PREFIX}/merge_requests/new\.json\z),
+ 'new_merge_request_pipelines',
+ 'continuous_integration'
+ ],
+ [
+ %r(#{RESERVED_WORDS_PREFIX}/merge_requests/\d+/pipelines\.json\z),
+ 'merge_request_pipelines',
+ 'continuous_integration'
+ ],
+ [
+ %r(#{RESERVED_WORDS_PREFIX}/pipelines\.json\z),
+ 'project_pipelines',
+ 'continuous_integration'
+ ],
+ [
+ %r(#{RESERVED_WORDS_PREFIX}/pipelines/\d+\.json\z),
+ 'project_pipeline',
+ 'continuous_integration'
+ ],
+ [
+ %r(#{RESERVED_WORDS_PREFIX}/builds/\d+\.json\z),
+ 'project_build',
+ 'continuous_integration'
+ ],
+ [
+ %r(#{RESERVED_WORDS_PREFIX}/clusters/\d+/environments\z),
+ 'cluster_environments',
+ 'continuous_delivery'
+ ],
+ [
+ %r(#{RESERVED_WORDS_PREFIX}/environments\.json\z),
+ 'environments',
+ 'continuous_delivery'
+ ],
+ [
+ %r(#{RESERVED_WORDS_PREFIX}/import/github/realtime_changes\.json\z),
+ 'realtime_changes_import_github',
+ 'importers'
+ ],
+ [
+ %r(#{RESERVED_WORDS_PREFIX}/import/gitea/realtime_changes\.json\z),
+ 'realtime_changes_import_gitea',
+ 'importers'
+ ],
+ [
+ %r(#{RESERVED_WORDS_PREFIX}/merge_requests/\d+/cached_widget\.json\z),
+ 'merge_request_widget',
+ 'code_review'
+ ]
+ ].map(&method(:build_route)).freeze
+
+ # Overridden in EE to add more routes
+ def self.all_routes
+ ROUTES
+ end
+
+ def self.match(request)
+ all_routes.find { |route| route.match(request.path_info) }
+ end
+
+ def self.cache_key(request)
+ request.path
+ end
+ end
+ end
+ end
+end
+
+Gitlab::EtagCaching::Router::Restful.prepend_if_ee('EE::Gitlab::EtagCaching::Router::Restful')
diff --git a/lib/gitlab/etag_caching/store.rb b/lib/gitlab/etag_caching/store.rb
index 1d2f0d7bbf4..d0d790a7c72 100644
--- a/lib/gitlab/etag_caching/store.rb
+++ b/lib/gitlab/etag_caching/store.rb
@@ -3,6 +3,8 @@
module Gitlab
module EtagCaching
class Store
+ InvalidKeyError = Class.new(StandardError)
+
EXPIRY_TIME = 20.minutes
SHARED_STATE_NAMESPACE = 'etag:'
@@ -27,9 +29,28 @@ module Gitlab
end
def redis_shared_state_key(key)
- raise 'Invalid key' if !Rails.env.production? && !Gitlab::EtagCaching::Router.match(key)
+ raise InvalidKeyError, "#{key} is invalid" unless valid_key?(key)
"#{SHARED_STATE_NAMESPACE}#{key}"
+ rescue InvalidKeyError => e
+ Gitlab::ErrorTracking.track_and_raise_for_dev_exception(e)
+ end
+
+ def valid_key?(key)
+ return true if skip_validation?
+
+ path, header = key.split(':', 2)
+ env = {
+ 'PATH_INFO' => path,
+ 'HTTP_X_GITLAB_GRAPHQL_RESOURCE_ETAG' => header
+ }
+
+ fake_request = ActionDispatch::Request.new(env)
+ !!Gitlab::EtagCaching::Router.match(fake_request)
+ end
+
+ def skip_validation?
+ Rails.env.production?
end
end
end
diff --git a/lib/gitlab/exception_log_formatter.rb b/lib/gitlab/exception_log_formatter.rb
index 6aff8f909f3..9898651c9e3 100644
--- a/lib/gitlab/exception_log_formatter.rb
+++ b/lib/gitlab/exception_log_formatter.rb
@@ -12,16 +12,6 @@ module Gitlab
'exception.message' => exception.message
)
- payload.delete('extra.server')
-
- payload['extra.sidekiq'].tap do |value|
- if value.is_a?(Hash) && value.key?('args')
- value = value.dup
- payload['extra.sidekiq']['args'] = Gitlab::ErrorTracking::Processor::SidekiqProcessor
- .loggable_arguments(value['args'], value['class'])
- end
- end
-
if exception.backtrace
payload['exception.backtrace'] = Rails.backtrace_cleaner.clean(exception.backtrace)
end
diff --git a/lib/gitlab/experimentation.rb b/lib/gitlab/experimentation.rb
index 423f238a0a2..1bb29ba3eac 100644
--- a/lib/gitlab/experimentation.rb
+++ b/lib/gitlab/experimentation.rb
@@ -34,18 +34,10 @@
module Gitlab
module Experimentation
EXPERIMENTS = {
- ci_notification_dot: {
- tracking_category: 'Growth::Expansion::Experiment::CiNotificationDot',
- use_backwards_compatible_subject_index: true
- },
upgrade_link_in_user_menu_a: {
tracking_category: 'Growth::Expansion::Experiment::UpgradeLinkInUserMenuA',
use_backwards_compatible_subject_index: true
},
- invite_members_version_a: {
- tracking_category: 'Growth::Expansion::Experiment::InviteMembersVersionA',
- use_backwards_compatible_subject_index: true
- },
invite_members_version_b: {
tracking_category: 'Growth::Expansion::Experiment::InviteMembersVersionB',
use_backwards_compatible_subject_index: true
@@ -58,30 +50,16 @@ module Gitlab
tracking_category: 'Growth::Conversion::Experiment::ContactSalesInApp',
use_backwards_compatible_subject_index: true
},
- customize_homepage: {
- tracking_category: 'Growth::Expansion::Experiment::CustomizeHomepage',
- use_backwards_compatible_subject_index: true
- },
- group_only_trials: {
- tracking_category: 'Growth::Conversion::Experiment::GroupOnlyTrials',
- use_backwards_compatible_subject_index: true
- },
remove_known_trial_form_fields: {
tracking_category: 'Growth::Conversion::Experiment::RemoveKnownTrialFormFields'
},
- trimmed_skip_trial_copy: {
- tracking_category: 'Growth::Conversion::Experiment::TrimmedSkipTrialCopy'
- },
- trial_registration_with_social_signin: {
- tracking_category: 'Growth::Conversion::Experiment::TrialRegistrationWithSocialSigning'
- },
invite_members_empty_project_version_a: {
tracking_category: 'Growth::Expansion::Experiment::InviteMembersEmptyProjectVersionA'
},
trial_during_signup: {
tracking_category: 'Growth::Conversion::Experiment::TrialDuringSignup'
},
- ci_syntax_templates: {
+ ci_syntax_templates_b: {
tracking_category: 'Growth::Activation::Experiment::CiSyntaxTemplates',
rollout_strategy: :user
},
diff --git a/lib/gitlab/experimentation/controller_concern.rb b/lib/gitlab/experimentation/controller_concern.rb
index 2b38b12c914..248abfeada5 100644
--- a/lib/gitlab/experimentation/controller_concern.rb
+++ b/lib/gitlab/experimentation/controller_concern.rb
@@ -15,7 +15,7 @@ module Gitlab
included do
before_action :set_experimentation_subject_id_cookie, unless: :dnt_enabled?
- helper_method :experiment_enabled?, :experiment_tracking_category_and_group, :tracking_label
+ helper_method :experiment_enabled?, :experiment_tracking_category_and_group, :record_experiment_group, :tracking_label
end
def set_experimentation_subject_id_cookie
@@ -72,12 +72,22 @@ module Gitlab
::Experiment.add_user(experiment_key, tracking_group(experiment_key, nil, subject: subject), current_user, context)
end
- def record_experiment_conversion_event(experiment_key)
+ def record_experiment_group(experiment_key, group)
+ return if dnt_enabled?
+ return unless Experimentation.active?(experiment_key) && group
+
+ variant_subject = Experimentation.rollout_strategy(experiment_key) == :cookie ? nil : group
+ variant = tracking_group(experiment_key, nil, subject: variant_subject)
+
+ ::Experiment.add_group(experiment_key, group: group, variant: variant)
+ end
+
+ def record_experiment_conversion_event(experiment_key, context = {})
return if dnt_enabled?
return unless current_user
return unless Experimentation.active?(experiment_key)
- ::Experiment.record_conversion_event(experiment_key, current_user)
+ ::Experiment.record_conversion_event(experiment_key, current_user, context)
end
def experiment_tracking_category_and_group(experiment_key, subject: nil)
diff --git a/lib/gitlab/git/blame.rb b/lib/gitlab/git/blame.rb
index b118eda37f8..9e24306c05e 100644
--- a/lib/gitlab/git/blame.rb
+++ b/lib/gitlab/git/blame.rb
@@ -38,9 +38,11 @@ module Gitlab
if line[0, 1] == "\t"
lines << line[1, line.size]
elsif m = /^(\w{40}) (\d+) (\d+)/.match(line)
- commit_id, old_lineno, lineno = m[1], m[2].to_i, m[3].to_i
+ # Removed these instantiations for performance but keeping them for reference:
+ # commit_id, old_lineno, lineno = m[1], m[2].to_i, m[3].to_i
+ commit_id = m[1]
commits[commit_id] = nil unless commits.key?(commit_id)
- info[lineno] = [commit_id, old_lineno]
+ info[m[3].to_i] = [commit_id, m[2].to_i]
end
end
@@ -50,8 +52,7 @@ module Gitlab
# get it together
info.sort.each do |lineno, (commit_id, old_lineno)|
- commit = commits[commit_id]
- final << BlameLine.new(lineno, old_lineno, commit, lines[lineno - 1])
+ final << BlameLine.new(lineno, old_lineno, commits[commit_id], lines[lineno - 1])
end
@lines = final
diff --git a/lib/gitlab/git/commit.rb b/lib/gitlab/git/commit.rb
index 35c3dc5b0b3..ff99803d8de 100644
--- a/lib/gitlab/git/commit.rb
+++ b/lib/gitlab/git/commit.rb
@@ -20,6 +20,7 @@ module Gitlab
].freeze
attr_accessor(*SERIALIZE_KEYS)
+ attr_reader :repository
def ==(other)
return false unless other.is_a?(Gitlab::Git::Commit)
diff --git a/lib/gitlab/gitaly_client.rb b/lib/gitlab/gitaly_client.rb
index 3c7fa88977e..e3788814dd5 100644
--- a/lib/gitlab/gitaly_client.rb
+++ b/lib/gitlab/gitaly_client.rb
@@ -246,9 +246,7 @@ module Gitlab
def self.route_to_primary
return {} unless Gitlab::SafeRequestStore.active?
- return {} unless Gitlab::SafeRequestStore[:gitlab_git_env]
-
- return {} if Gitlab::SafeRequestStore[:gitlab_git_env].empty?
+ return {} if Gitlab::SafeRequestStore[:gitlab_git_env].blank?
{ 'gitaly-route-repository-accessor-policy' => 'primary-only' }
end
diff --git a/lib/gitlab/gitaly_client/storage_settings.rb b/lib/gitlab/gitaly_client/storage_settings.rb
index 5e50ac72965..7edd42f9ef7 100644
--- a/lib/gitlab/gitaly_client/storage_settings.rb
+++ b/lib/gitlab/gitaly_client/storage_settings.rb
@@ -60,7 +60,8 @@ module Gitlab
end
def legacy_disk_path
- if self.class.disk_access_denied?
+ # Do not use self.class due to Spring reloading issues
+ if Gitlab::GitalyClient::StorageSettings.disk_access_denied?
raise DirectPathAccessError, "git disk access denied"
end
diff --git a/lib/gitlab/github_import/importer/pull_request_merged_by_importer.rb b/lib/gitlab/github_import/importer/pull_request_merged_by_importer.rb
index 11181edf0e9..8173fdd5e3e 100644
--- a/lib/gitlab/github_import/importer/pull_request_merged_by_importer.rb
+++ b/lib/gitlab/github_import/importer/pull_request_merged_by_importer.rb
@@ -12,25 +12,27 @@ module Gitlab
def execute
merge_request = project.merge_requests.find_by_iid(pull_request.iid)
+ timestamp = Time.new.utc
+ merged_at = pull_request.merged_at
user_finder = GithubImport::UserFinder.new(project, client)
gitlab_user_id = user_finder.user_id_for(pull_request.merged_by)
- if gitlab_user_id
- timestamp = Time.new.utc
- MergeRequest::Metrics.upsert({
- target_project_id: project.id,
- merge_request_id: merge_request.id,
- merged_by_id: gitlab_user_id,
- created_at: timestamp,
- updated_at: timestamp
- }, unique_by: :merge_request_id)
- else
+ MergeRequest::Metrics.upsert({
+ target_project_id: project.id,
+ merge_request_id: merge_request.id,
+ merged_by_id: gitlab_user_id,
+ merged_at: merged_at,
+ created_at: timestamp,
+ updated_at: timestamp
+ }, unique_by: :merge_request_id)
+
+ unless gitlab_user_id
merge_request.notes.create!(
importing: true,
- note: "*Merged by: #{pull_request.merged_by.login}*",
+ note: missing_author_note,
author_id: project.creator_id,
project: project,
- created_at: pull_request.created_at
+ created_at: merged_at
)
end
end
@@ -38,6 +40,13 @@ module Gitlab
private
attr_reader :project, :pull_request, :client
+
+ def missing_author_note
+ s_("GitHubImporter|*Merged by: %{author} at %{timestamp}*") % {
+ author: pull_request.merged_by.login,
+ timestamp: pull_request.merged_at
+ }
+ end
end
end
end
diff --git a/lib/gitlab/github_import/importer/pull_request_review_importer.rb b/lib/gitlab/github_import/importer/pull_request_review_importer.rb
index 14ee69ba089..9f495913897 100644
--- a/lib/gitlab/github_import/importer/pull_request_review_importer.rb
+++ b/lib/gitlab/github_import/importer/pull_request_review_importer.rb
@@ -77,12 +77,22 @@ module Gitlab
def add_approval!(user_id)
return unless review.review_type == 'APPROVED'
- add_approval_system_note!(user_id)
-
- merge_request.approvals.create!(
+ approval_attribues = {
+ merge_request_id: merge_request.id,
user_id: user_id,
- created_at: review.submitted_at
+ created_at: review.submitted_at,
+ updated_at: review.submitted_at
+ }
+
+ result = ::Approval.insert(
+ approval_attribues,
+ returning: [:id],
+ unique_by: [:user_id, :merge_request_id]
)
+
+ if result.rows.present?
+ add_approval_system_note!(user_id)
+ end
end
def add_approval_system_note!(user_id)
diff --git a/lib/gitlab/gon_helper.rb b/lib/gitlab/gon_helper.rb
index 3dd317c5a64..c7e215c143f 100644
--- a/lib/gitlab/gon_helper.rb
+++ b/lib/gitlab/gon_helper.rb
@@ -7,13 +7,14 @@ module Gitlab
include WebpackHelper
def add_gon_variables
- gon.api_version = 'v4'
- gon.default_avatar_url = default_avatar_url
- gon.max_file_size = Gitlab::CurrentSettings.max_attachment_size
- gon.asset_host = ActionController::Base.asset_host
- gon.webpack_public_path = webpack_public_path
- gon.relative_url_root = Gitlab.config.gitlab.relative_url_root
- gon.user_color_scheme = Gitlab::ColorSchemes.for_user(current_user).css_class
+ gon.api_version = 'v4'
+ gon.default_avatar_url = default_avatar_url
+ gon.max_file_size = Gitlab::CurrentSettings.max_attachment_size
+ gon.asset_host = ActionController::Base.asset_host
+ gon.webpack_public_path = webpack_public_path
+ gon.relative_url_root = Gitlab.config.gitlab.relative_url_root
+ gon.user_color_scheme = Gitlab::ColorSchemes.for_user(current_user).css_class
+ gon.markdown_surround_selection = current_user&.markdown_surround_selection
if Gitlab.config.sentry.enabled
gon.sentry_dsn = Gitlab.config.sentry.clientside_dsn
diff --git a/lib/gitlab/graphql/calls_gitaly.rb b/lib/gitlab/graphql/calls_gitaly.rb
deleted file mode 100644
index 40cd74a34f2..00000000000
--- a/lib/gitlab/graphql/calls_gitaly.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Graphql
- # Wraps the field resolution to count Gitaly calls before and after.
- # Raises an error if the field calls Gitaly but hadn't declared such.
- module CallsGitaly
- extend ActiveSupport::Concern
-
- def self.use(schema_definition)
- schema_definition.instrument(:field, Gitlab::Graphql::CallsGitaly::Instrumentation.new, after_built_ins: true)
- end
- end
- end
-end
diff --git a/lib/gitlab/graphql/calls_gitaly/field_extension.rb b/lib/gitlab/graphql/calls_gitaly/field_extension.rb
new file mode 100644
index 00000000000..32530b47ce3
--- /dev/null
+++ b/lib/gitlab/graphql/calls_gitaly/field_extension.rb
@@ -0,0 +1,87 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Graphql
+ module CallsGitaly
+ # Check if any `calls_gitaly: true` declarations need to be added
+ #
+ # See BaseField: this extension is not applied if the field does not
+ # need it (i.e. it has a constant complexity or knows that it calls
+ # gitaly)
+ class FieldExtension < ::GraphQL::Schema::FieldExtension
+ include Laziness
+
+ def resolve(object:, arguments:, **rest)
+ yield(object, arguments, [current_gitaly_call_count, accounted_for])
+ end
+
+ def after_resolve(value:, memo:, **rest)
+ (value, count) = value_with_count(value, memo)
+ calls_gitaly_check(count)
+ accounted_for(count)
+
+ value
+ end
+
+ private
+
+ # Resolutions are not nested nicely (due to laziness), so we have to
+ # know not just how many calls were made before resolution started, but
+ # also how many were accounted for by fields with the correct settings
+ # in between.
+ #
+ # e.g. the following is not just plausible, but common:
+ #
+ # enter A.user (lazy)
+ # enter A.x
+ # leave A.x
+ # enter A.calls_gitaly
+ # leave A.calls_gitaly (accounts for 1 call)
+ # leave A.user
+ #
+ # In this circumstance we need to mark the calls made by A.calls_gitaly
+ # as accounted for, even though they were made after we yielded
+ # in A.user
+ def value_with_count(value, (previous_count, previous_accounted_for))
+ newly_accounted_for = accounted_for - previous_accounted_for
+ value = force(value)
+ count = [current_gitaly_call_count - (previous_count + newly_accounted_for), 0].max
+
+ [value, count]
+ end
+
+ def current_gitaly_call_count
+ Gitlab::GitalyClient.get_request_count || 0
+ end
+
+ def calls_gitaly_check(calls)
+ return if calls < 1 || field.may_call_gitaly?
+
+ error = RuntimeError.new(<<~ERROR)
+ #{field_name} unexpectedly calls Gitaly!
+
+ Please either specify a constant complexity or add `calls_gitaly: true`
+ to the field declaration
+ ERROR
+ Gitlab::ErrorTracking.track_and_raise_for_dev_exception(error)
+ end
+
+ def accounted_for(count = nil)
+ return 0 unless Gitlab::SafeRequestStore.active?
+
+ Gitlab::SafeRequestStore["graphql_gitaly_accounted_for"] ||= 0
+
+ if count.nil?
+ Gitlab::SafeRequestStore["graphql_gitaly_accounted_for"]
+ else
+ Gitlab::SafeRequestStore["graphql_gitaly_accounted_for"] += count
+ end
+ end
+
+ def field_name
+ "#{field.owner.graphql_name}.#{field.graphql_name}"
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/graphql/calls_gitaly/instrumentation.rb b/lib/gitlab/graphql/calls_gitaly/instrumentation.rb
deleted file mode 100644
index 11d3c50e093..00000000000
--- a/lib/gitlab/graphql/calls_gitaly/instrumentation.rb
+++ /dev/null
@@ -1,40 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Graphql
- module CallsGitaly
- class Instrumentation
- # Check if any `calls_gitaly: true` declarations need to be added
- # Do nothing if a constant complexity was provided
- def instrument(_type, field)
- type_object = field.metadata[:type_class]
- return field unless type_object.respond_to?(:calls_gitaly?)
- return field if type_object.constant_complexity? || type_object.calls_gitaly?
-
- old_resolver_proc = field.resolve_proc
-
- gitaly_wrapped_resolve = -> (typed_object, args, ctx) do
- previous_gitaly_call_count = Gitlab::GitalyClient.get_request_count
- result = old_resolver_proc.call(typed_object, args, ctx)
- current_gitaly_call_count = Gitlab::GitalyClient.get_request_count
- calls_gitaly_check(type_object, current_gitaly_call_count - previous_gitaly_call_count)
- result
- end
-
- field.redefine do
- resolve(gitaly_wrapped_resolve)
- end
- end
-
- def calls_gitaly_check(type_object, calls)
- return if calls < 1
-
- # Will inform you if there needs to be `calls_gitaly: true` as a kwarg in the field declaration
- # if there is at least 1 Gitaly call involved with the field resolution.
- error = RuntimeError.new("Gitaly is called for field '#{type_object.name}' on #{type_object.owner.try(:name)} - please either specify a constant complexity or add `calls_gitaly: true` to the field declaration")
- Gitlab::ErrorTracking.track_and_raise_for_dev_exception(error)
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/graphql/docs/helper.rb b/lib/gitlab/graphql/docs/helper.rb
index ad9e08e189c..68a2a78d0d4 100644
--- a/lib/gitlab/graphql/docs/helper.rb
+++ b/lib/gitlab/graphql/docs/helper.rb
@@ -28,16 +28,20 @@ module Gitlab
end
def render_name_and_description(object)
- content = "### #{object[:name]}\n"
+ content = "### `#{object[:name]}`\n"
if object[:description].present?
- content += "\n#{object[:description]}.\n"
+ content += "\n#{object[:description]}"
+ content += '.' unless object[:description].ends_with?('.')
+ content += "\n"
end
content
end
def sorted_by_name(objects)
+ return [] unless objects.present?
+
objects.sort_by { |o| o[:name] }
end
@@ -98,6 +102,10 @@ module Gitlab
end
end
+ def queries
+ graphql_operation_types.find { |type| type[:name] == 'Query' }.to_h.values_at(:fields, :connections).flatten
+ end
+
# We ignore the built-in enum types.
def enums
graphql_enum_types.select do |enum_type|
diff --git a/lib/gitlab/graphql/docs/templates/default.md.haml b/lib/gitlab/graphql/docs/templates/default.md.haml
index 9dfb9b090a8..5ae83fd51c5 100644
--- a/lib/gitlab/graphql/docs/templates/default.md.haml
+++ b/lib/gitlab/graphql/docs/templates/default.md.haml
@@ -14,13 +14,29 @@
WARNING:
Fields that are deprecated are marked with **{warning-solid}**.
- Items (fields, enums, etc) that have been removed according to our [deprecation process](../index.md#deprecation-process) can be found
+ Items (fields, enums, etc) that have been removed according to our [deprecation process](../index.md#deprecation-and-removal-process) can be found
in [Removed Items](../removed_items.md).
<!-- vale gitlab.Spelling = NO -->
\
:plain
+ ## `Query` type
+
+ The `Query` type contains the API's top-level entry points for all executable queries.
+\
+
+- sorted_by_name(queries).each do |query|
+ = render_name_and_description(query)
+ - unless query[:arguments].empty?
+ ~ "#### Arguments\n"
+ ~ "| Name | Type | Description |"
+ ~ "| ---- | ---- | ----------- |"
+ - sorted_by_name(query[:arguments]).each do |argument|
+ = render_field(argument)
+ \
+
+:plain
## Object types
Object types represent the resources that the GitLab GraphQL API can return.
diff --git a/lib/gitlab/graphql/extensions/externally_paginated_array_extension.rb b/lib/gitlab/graphql/extensions/externally_paginated_array_extension.rb
index 1adedb500e6..f787e7be94a 100644
--- a/lib/gitlab/graphql/extensions/externally_paginated_array_extension.rb
+++ b/lib/gitlab/graphql/extensions/externally_paginated_array_extension.rb
@@ -4,7 +4,7 @@ module Gitlab
module Extensions
class ExternallyPaginatedArrayExtension < GraphQL::Schema::Field::ConnectionExtension
def resolve(object:, arguments:, context:)
- yield(object, arguments)
+ yield(object, arguments, arguments)
end
end
end
diff --git a/lib/gitlab/graphql/pagination/keyset/connection.rb b/lib/gitlab/graphql/pagination/keyset/connection.rb
index f95c91c5706..e525996ec10 100644
--- a/lib/gitlab/graphql/pagination/keyset/connection.rb
+++ b/lib/gitlab/graphql/pagination/keyset/connection.rb
@@ -33,6 +33,7 @@ module Gitlab
include Gitlab::Utils::StrongMemoize
include ::Gitlab::Graphql::ConnectionCollectionMethods
prepend ::Gitlab::Graphql::ConnectionRedaction
+ prepend GenericKeysetPagination
# rubocop: disable Naming/PredicateName
# https://relay.dev/graphql/connections.htm#sec-undefined.PageInfo.Fields
diff --git a/lib/gitlab/graphql/pagination/keyset/generic_keyset_pagination.rb b/lib/gitlab/graphql/pagination/keyset/generic_keyset_pagination.rb
new file mode 100644
index 00000000000..318c6e1734f
--- /dev/null
+++ b/lib/gitlab/graphql/pagination/keyset/generic_keyset_pagination.rb
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Graphql
+ module Pagination
+ module Keyset
+ # Use the generic keyset implementation if the given ActiveRecord scope supports it.
+ # Note: this module is temporary, at some point it will be merged with Keyset::Connection
+ module GenericKeysetPagination
+ extend ActiveSupport::Concern
+
+ def ordered_items
+ return super unless Gitlab::Pagination::Keyset::Order.keyset_aware?(items)
+
+ items
+ end
+
+ def cursor_for(node)
+ return super unless Gitlab::Pagination::Keyset::Order.keyset_aware?(items)
+
+ order = Gitlab::Pagination::Keyset::Order.extract_keyset_order_object(items)
+ encode(order.cursor_attributes_for_node(node).to_json)
+ end
+
+ def slice_nodes(sliced, encoded_cursor, before_or_after)
+ return super unless Gitlab::Pagination::Keyset::Order.keyset_aware?(sliced)
+
+ order = Gitlab::Pagination::Keyset::Order.extract_keyset_order_object(sliced)
+ order = order.reversed_order if before_or_after == :before
+
+ decoded_cursor = ordering_from_encoded_json(encoded_cursor)
+ order.apply_cursor_conditions(sliced, decoded_cursor)
+ end
+
+ def sliced_nodes
+ return super unless Gitlab::Pagination::Keyset::Order.keyset_aware?(items)
+
+ sliced = ordered_items
+ sliced = slice_nodes(sliced, before, :before) if before.present?
+ sliced = slice_nodes(sliced, after, :after) if after.present?
+ sliced
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/graphql/pagination/keyset/last_items.rb b/lib/gitlab/graphql/pagination/keyset/last_items.rb
index 45bf15236c1..960567a6fbc 100644
--- a/lib/gitlab/graphql/pagination/keyset/last_items.rb
+++ b/lib/gitlab/graphql/pagination/keyset/last_items.rb
@@ -10,46 +10,14 @@ module Gitlab
class LastItems
# rubocop: disable CodeReuse/ActiveRecord
def self.take_items(scope, count)
- if custom_order = lookup_custom_reverse_order(scope.order_values)
- items = scope.reorder(*custom_order).first(count) # returns a single record when count is nil
+ if Gitlab::Pagination::Keyset::Order.keyset_aware?(scope)
+ order = Gitlab::Pagination::Keyset::Order.extract_keyset_order_object(scope)
+ items = scope.reorder(order.reversed_order).first(count)
items.is_a?(Array) ? items.reverse : items
else
scope.last(count)
end
end
- # rubocop: enable CodeReuse/ActiveRecord
-
- # Detect special ordering and provide the reversed order
- def self.lookup_custom_reverse_order(order_values)
- if ordering_by_merged_at_and_mr_id_desc?(order_values)
- [
- Gitlab::Database.nulls_first_order('merge_request_metrics.merged_at', 'ASC'), # reversing the order
- MergeRequest.arel_table[:id].asc
- ]
- elsif ordering_by_merged_at_and_mr_id_asc?(order_values)
- [
- Gitlab::Database.nulls_first_order('merge_request_metrics.merged_at', 'DESC'),
- MergeRequest.arel_table[:id].asc
- ]
- end
- end
-
- def self.ordering_by_merged_at_and_mr_id_desc?(order_values)
- order_values.size == 2 &&
- order_values.first.to_s == Gitlab::Database.nulls_last_order('merge_request_metrics.merged_at', 'DESC') &&
- order_values.last.is_a?(Arel::Nodes::Descending) &&
- order_values.last.to_sql == MergeRequest.arel_table[:id].desc.to_sql
- end
-
- def self.ordering_by_merged_at_and_mr_id_asc?(order_values)
- order_values.size == 2 &&
- order_values.first.to_s == Gitlab::Database.nulls_last_order('merge_request_metrics.merged_at', 'ASC') &&
- order_values.last.is_a?(Arel::Nodes::Descending) &&
- order_values.last.to_sql == MergeRequest.arel_table[:id].desc.to_sql
- end
-
- private_class_method :ordering_by_merged_at_and_mr_id_desc?
- private_class_method :ordering_by_merged_at_and_mr_id_asc?
end
end
end
diff --git a/lib/gitlab/graphql/pagination/keyset/order_info.rb b/lib/gitlab/graphql/pagination/keyset/order_info.rb
index d37264c1343..0494329bfd9 100644
--- a/lib/gitlab/graphql/pagination/keyset/order_info.rb
+++ b/lib/gitlab/graphql/pagination/keyset/order_info.rb
@@ -92,8 +92,6 @@ module Gitlab
def extract_attribute_values(order_value)
if ordering_by_lower?(order_value)
[order_value.expr.expressions[0].name.to_s, order_value.direction, order_value.expr]
- elsif ordering_by_similarity?(order_value)
- ['similarity', order_value.direction, order_value.expr]
elsif ordering_by_case?(order_value)
['case_order_value', order_value.direction, order_value.expr]
elsif ordering_by_array_position?(order_value)
@@ -113,11 +111,6 @@ module Gitlab
order_value.expr.is_a?(Arel::Nodes::NamedFunction) && order_value.expr&.name&.downcase == 'array_position'
end
- # determine if ordering using SIMILARITY scoring based on Gitlab::Database::SimilarityScore
- def ordering_by_similarity?(order_value)
- Gitlab::Database::SimilarityScore.order_by_similarity?(order_value)
- end
-
# determine if ordering using CASE
def ordering_by_case?(order_value)
order_value.expr.is_a?(Arel::Nodes::Case)
diff --git a/lib/gitlab/graphql/present.rb b/lib/gitlab/graphql/present.rb
index 6d86d632ab4..fdaf075eb25 100644
--- a/lib/gitlab/graphql/present.rb
+++ b/lib/gitlab/graphql/present.rb
@@ -12,11 +12,30 @@ module Gitlab
def self.presenter_class
@presenter_class
end
+
+ def self.present(object, attrs)
+ klass = @presenter_class
+ return object if !klass || object.is_a?(klass)
+
+ @presenter_class.new(object, **attrs)
+ end
+ end
+
+ def unpresented
+ unwrapped || object
end
- def self.use(schema_definition)
- schema_definition.instrument(:field, ::Gitlab::Graphql::Present::Instrumentation.new)
+ def present(object_type, attrs)
+ return unless object_type.respond_to?(:present)
+
+ self.unwrapped ||= object
+ # @object belongs to Schema::Object, which does not expose a writer.
+ @object = object_type.present(unwrapped, attrs) # rubocop: disable Gitlab/ModuleWithInstanceVariables
end
+
+ private
+
+ attr_accessor :unwrapped
end
end
end
diff --git a/lib/gitlab/graphql/present/field_extension.rb b/lib/gitlab/graphql/present/field_extension.rb
new file mode 100644
index 00000000000..2e211b70d35
--- /dev/null
+++ b/lib/gitlab/graphql/present/field_extension.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Graphql
+ module Present
+ class FieldExtension < ::GraphQL::Schema::FieldExtension
+ SAFE_CONTEXT_KEYS = %i[current_user].freeze
+
+ def resolve(object:, arguments:, context:)
+ attrs = safe_context_values(context)
+
+ # We need to handle the object being either a Schema::Object or an
+ # inner Schema::Object#object. This depends on whether the field
+ # has a @resolver_proc or not.
+ if object.is_a?(::Types::BaseObject)
+ object.present(field.owner, attrs)
+ yield(object, arguments)
+ else
+ # This is the legacy code-path, hit if the field has a @resolver_proc
+ # TODO: remove this when resolve procs are removed from the
+ # graphql-ruby library, and all field instrumentation is removed.
+ # See: https://github.com/rmosolgo/graphql-ruby/issues/3385
+ presented = field.owner.try(:present, object, attrs) || object
+ yield(presented, arguments)
+ end
+ end
+
+ private
+
+ def safe_context_values(context)
+ context.to_h.slice(*SAFE_CONTEXT_KEYS)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/graphql/present/instrumentation.rb b/lib/gitlab/graphql/present/instrumentation.rb
deleted file mode 100644
index b8535575da5..00000000000
--- a/lib/gitlab/graphql/present/instrumentation.rb
+++ /dev/null
@@ -1,49 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Graphql
- module Present
- class Instrumentation
- SAFE_CONTEXT_KEYS = %i[current_user].freeze
-
- def instrument(type, field)
- return field unless field.metadata[:type_class]
-
- presented_in = field.metadata[:type_class].owner
- return field unless presented_in.respond_to?(:presenter_class)
- return field unless presented_in.presenter_class
-
- old_resolver = field.resolve_proc
-
- resolve_with_presenter = -> (presented_type, args, context) do
- # We need to wrap the original presentation type into a type that
- # uses the presenter as an object.
- object = presented_type.object
-
- if object.is_a?(presented_in.presenter_class)
- next old_resolver.call(presented_type, args, context)
- end
-
- attrs = safe_context_values(context)
- presenter = presented_in.presenter_class.new(object, **attrs)
-
- # we have to use the new `authorized_new` method, as `new` is protected
- wrapped = presented_type.class.authorized_new(presenter, context)
-
- old_resolver.call(wrapped, args, context)
- end
-
- field.redefine do
- resolve(resolve_with_presenter)
- end
- end
-
- private
-
- def safe_context_values(context)
- context.to_h.slice(*SAFE_CONTEXT_KEYS)
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/graphql/query_analyzers/logger_analyzer.rb b/lib/gitlab/graphql/query_analyzers/logger_analyzer.rb
index 0665ea8b6c9..8acd27869a9 100644
--- a/lib/gitlab/graphql/query_analyzers/logger_analyzer.rb
+++ b/lib/gitlab/graphql/query_analyzers/logger_analyzer.rb
@@ -9,10 +9,6 @@ module Gitlab
FIELD_USAGE_ANALYZER = GraphQL::Analysis::FieldUsage.new { |query, used_fields, used_deprecated_fields| [used_fields, used_deprecated_fields] }
ALL_ANALYZERS = [COMPLEXITY_ANALYZER, DEPTH_ANALYZER, FIELD_USAGE_ANALYZER].freeze
- def analyze?(query)
- Feature.enabled?(:graphql_logging, default_enabled: true)
- end
-
def initial_value(query)
variables = process_variables(query.provided_variables)
default_initial_values(query).merge({
diff --git a/lib/gitlab/hook_data/project_member_builder.rb b/lib/gitlab/hook_data/project_member_builder.rb
new file mode 100644
index 00000000000..90fc83fdf21
--- /dev/null
+++ b/lib/gitlab/hook_data/project_member_builder.rb
@@ -0,0 +1,66 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module HookData
+ class ProjectMemberBuilder < BaseBuilder
+ alias_method :project_member, :object
+
+ # Sample data
+
+ # {
+ # :created_at=>"2021-03-02T10:43:17Z",
+ # :updated_at=>"2021-03-02T10:43:17Z",
+ # :project_name=>"gitlab",
+ # :project_path=>"gitlab",
+ # :project_path_with_namespace=>"namespace1/gitlab",
+ # :project_id=>1,
+ # :user_username=>"johndoe",
+ # :user_name=>"John Doe",
+ # :user_email=>"john@example.com",
+ # :user_id=>2,
+ # :access_level=>"Developer",
+ # :project_visibility=>"internal",
+ # :event_name=>"user_update_for_team"
+ # }
+
+ def build(event)
+ [
+ timestamps_data,
+ project_member_data,
+ event_data(event)
+ ].reduce(:merge)
+ end
+
+ private
+
+ def project_member_data
+ project = project_member.project || Project.unscoped.find(project_member.source_id)
+
+ {
+ project_name: project.name,
+ project_path: project.path,
+ project_path_with_namespace: project.full_path,
+ project_id: project.id,
+ user_username: project_member.user.username,
+ user_name: project_member.user.name,
+ user_email: project_member.user.email,
+ user_id: project_member.user.id,
+ access_level: project_member.human_access,
+ project_visibility: project.visibility
+ }
+ end
+
+ def event_data(event)
+ event_name = case event
+ when :create
+ 'user_add_to_team'
+ when :destroy
+ 'user_remove_from_team'
+ when :update
+ 'user_update_for_team'
+ end
+ { event_name: event_name }
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/http_connection_adapter.rb b/lib/gitlab/http_connection_adapter.rb
index 84eb60f3a5d..37f618ae879 100644
--- a/lib/gitlab/http_connection_adapter.rb
+++ b/lib/gitlab/http_connection_adapter.rb
@@ -11,13 +11,18 @@
# This option will take precedence over the global setting.
module Gitlab
class HTTPConnectionAdapter < HTTParty::ConnectionAdapter
+ extend ::Gitlab::Utils::Override
+
+ override :connection
def connection
- begin
- @uri, hostname = Gitlab::UrlBlocker.validate!(uri, allow_local_network: allow_local_requests?,
- allow_localhost: allow_local_requests?,
- dns_rebind_protection: dns_rebind_protection?)
- rescue Gitlab::UrlBlocker::BlockedUrlError => e
- raise Gitlab::HTTP::BlockedUrlError, "URL '#{uri}' is blocked: #{e.message}"
+ @uri, hostname = validate_url!(uri)
+
+ if options.key?(:http_proxyaddr)
+ proxy_uri_with_port = uri_with_port(options[:http_proxyaddr], options[:http_proxyport])
+ proxy_uri_validated = validate_url!(proxy_uri_with_port).first
+
+ @options[:http_proxyaddr] = proxy_uri_validated.omit(:port).to_s
+ @options[:http_proxyport] = proxy_uri_validated.port
end
super.tap do |http|
@@ -27,6 +32,14 @@ module Gitlab
private
+ def validate_url!(url)
+ Gitlab::UrlBlocker.validate!(url, allow_local_network: allow_local_requests?,
+ allow_localhost: allow_local_requests?,
+ dns_rebind_protection: dns_rebind_protection?)
+ rescue Gitlab::UrlBlocker::BlockedUrlError => e
+ raise Gitlab::HTTP::BlockedUrlError, "URL '#{url}' is blocked: #{e.message}"
+ end
+
def allow_local_requests?
options.fetch(:allow_local_requests, allow_settings_local_requests?)
end
@@ -40,5 +53,11 @@ module Gitlab
def allow_settings_local_requests?
Gitlab::CurrentSettings.allow_local_requests_from_web_hooks_and_services?
end
+
+ def uri_with_port(address, port)
+ uri = Addressable::URI.parse(address)
+ uri.port = port if port.present?
+ uri
+ end
end
end
diff --git a/lib/gitlab/marginalia.rb b/lib/gitlab/marginalia.rb
index 325a8c5c325..c99cf113638 100644
--- a/lib/gitlab/marginalia.rb
+++ b/lib/gitlab/marginalia.rb
@@ -2,8 +2,6 @@
module Gitlab
module Marginalia
- cattr_accessor :enabled, default: false
-
def self.set_application_name
::Marginalia.application_name = Gitlab.process_name
end
@@ -13,12 +11,5 @@ module Gitlab
::Marginalia::SidekiqInstrumentation.enable!
end
end
-
- def self.set_enabled_from_feature_flag
- # During db:create and db:bootstrap skip feature query as DB is not available yet.
- return false unless Gitlab::Database.cached_table_exists?('features')
-
- self.enabled = Feature.enabled?(:marginalia, type: :ops)
- end
end
end
diff --git a/lib/gitlab/marginalia/active_record_instrumentation.rb b/lib/gitlab/marginalia/active_record_instrumentation.rb
deleted file mode 100644
index 452f472bf6a..00000000000
--- a/lib/gitlab/marginalia/active_record_instrumentation.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-# frozen_string_literal: true
-
-# Patch to annotate sql only when the feature is enabled.
-module Gitlab
- module Marginalia
- module ActiveRecordInstrumentation
- def annotate_sql(sql)
- Gitlab::Marginalia.enabled ? super(sql) : sql
- end
- end
- end
-end
diff --git a/lib/gitlab/marginalia/comment.rb b/lib/gitlab/marginalia/comment.rb
index 7b4e4b06f00..ee15d3b1812 100644
--- a/lib/gitlab/marginalia/comment.rb
+++ b/lib/gitlab/marginalia/comment.rb
@@ -37,6 +37,10 @@ module Gitlab
job
end
end
+
+ def endpoint_id
+ Labkit::Context.current&.get_attribute(:caller_id)
+ end
end
end
end
diff --git a/lib/gitlab/marker_range.rb b/lib/gitlab/marker_range.rb
new file mode 100644
index 00000000000..50a59adebdf
--- /dev/null
+++ b/lib/gitlab/marker_range.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+# It is a Range object extended with `mode` attribute
+# MarkerRange not only keeps information about changed characters, but also
+# the type of changes
+module Gitlab
+ class MarkerRange < Range
+ DELETION = :deletion
+ ADDITION = :addition
+
+ # Converts Range object to MarkerRange class
+ def self.from_range(range)
+ return range if range.is_a?(self)
+
+ new(range.begin, range.end, exclude_end: range.exclude_end?)
+ end
+
+ def initialize(first, last, exclude_end: false, mode: nil)
+ super(first, last, exclude_end)
+ @mode = mode
+ end
+
+ def to_range
+ Range.new(self.begin, self.end, self.exclude_end?)
+ end
+
+ attr_reader :mode
+ end
+end
diff --git a/lib/gitlab/memory/instrumentation.rb b/lib/gitlab/memory/instrumentation.rb
index 76e84e54d3a..8f9f6d19ce8 100644
--- a/lib/gitlab/memory/instrumentation.rb
+++ b/lib/gitlab/memory/instrumentation.rb
@@ -25,7 +25,7 @@ module Gitlab
def self.ensure_feature_flag!
return unless available?
- enabled = Feature.enabled?(:trace_memory_allocations)
+ enabled = Feature.enabled?(:trace_memory_allocations, default_enabled: true)
return if enabled == Thread.trace_memory_allocations
MUTEX.synchronize do
diff --git a/lib/gitlab/metrics/background_transaction.rb b/lib/gitlab/metrics/background_transaction.rb
new file mode 100644
index 00000000000..3dda68bf93f
--- /dev/null
+++ b/lib/gitlab/metrics/background_transaction.rb
@@ -0,0 +1,49 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Metrics
+ class BackgroundTransaction < Transaction
+ # Separate web transaction instance and background transaction instance
+ BACKGROUND_THREAD_KEY = :_gitlab_metrics_background_transaction
+ BACKGROUND_BASE_LABEL_KEYS = %i(endpoint_id feature_category).freeze
+
+ class << self
+ def current
+ Thread.current[BACKGROUND_THREAD_KEY]
+ end
+
+ def prometheus_metric(name, type, &block)
+ fetch_metric(type, name) do
+ # set default metric options
+ docstring "#{name.to_s.humanize} #{type}"
+
+ evaluate(&block)
+ # always filter sensitive labels and merge with base ones
+ label_keys BACKGROUND_BASE_LABEL_KEYS | (label_keys - ::Gitlab::Metrics::Transaction::FILTERED_LABEL_KEYS)
+ end
+ end
+ end
+
+ def run
+ Thread.current[BACKGROUND_THREAD_KEY] = self
+
+ yield
+ ensure
+ Thread.current[BACKGROUND_THREAD_KEY] = nil
+ end
+
+ def labels
+ @labels ||= {
+ endpoint_id: current_context&.get_attribute(:caller_id),
+ feature_category: current_context&.get_attribute(:feature_category)
+ }
+ end
+
+ private
+
+ def current_context
+ Labkit::Context.current
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/metrics/samplers/ruby_sampler.rb b/lib/gitlab/metrics/samplers/ruby_sampler.rb
index 76175b465e4..3d29d38fa1f 100644
--- a/lib/gitlab/metrics/samplers/ruby_sampler.rb
+++ b/lib/gitlab/metrics/samplers/ruby_sampler.rb
@@ -7,7 +7,7 @@ module Gitlab
module Samplers
class RubySampler < BaseSampler
DEFAULT_SAMPLING_INTERVAL_SECONDS = 60
- GC_REPORT_BUCKETS = [0.005, 0.01, 0.02, 0.04, 0.07, 0.1, 0.5].freeze
+ GC_REPORT_BUCKETS = [0.01, 0.05, 0.1, 0.2, 0.3, 0.5, 1].freeze
def initialize(*)
GC::Profiler.clear
diff --git a/lib/gitlab/metrics/subscribers/active_record.rb b/lib/gitlab/metrics/subscribers/active_record.rb
index d725d8d7b29..5eefef02507 100644
--- a/lib/gitlab/metrics/subscribers/active_record.rb
+++ b/lib/gitlab/metrics/subscribers/active_record.rb
@@ -9,6 +9,16 @@ module Gitlab
IGNORABLE_SQL = %w{BEGIN COMMIT}.freeze
DB_COUNTERS = %i{db_count db_write_count db_cached_count}.freeze
+ SQL_COMMANDS_WITH_COMMENTS_REGEX = /\A(\/\*.*\*\/\s)?((?!(.*[^\w'"](DELETE|UPDATE|INSERT INTO)[^\w'"])))(WITH.*)?(SELECT)((?!(FOR UPDATE|FOR SHARE)).)*$/i.freeze
+
+ DURATION_BUCKET = [0.05, 0.1, 0.25].freeze
+
+ # This event is published from ActiveRecordBaseTransactionMetrics and
+ # used to record a database transaction duration when calling
+ # ActiveRecord::Base.transaction {} block.
+ def transaction(event)
+ observe(:gitlab_database_transaction_seconds, event)
+ end
def sql(event)
# Mark this thread as requiring a database connection. This is used
@@ -17,51 +27,57 @@ module Gitlab
Thread.current[:uses_db_connection] = true
payload = event.payload
- return if payload[:name] == 'SCHEMA' || IGNORABLE_SQL.include?(payload[:sql])
+ return if ignored_query?(payload)
- increment_db_counters(payload)
+ increment(:db_count)
+ increment(:db_cached_count) if cached_query?(payload)
+ increment(:db_write_count) unless select_sql_command?(payload)
- current_transaction&.observe(:gitlab_sql_duration_seconds, event.duration / 1000.0) do
- buckets [0.05, 0.1, 0.25]
- end
+ observe(:gitlab_sql_duration_seconds, event)
end
def self.db_counter_payload
return {} unless Gitlab::SafeRequestStore.active?
- DB_COUNTERS.map do |counter|
- [counter, Gitlab::SafeRequestStore[counter].to_i]
- end.to_h
+ payload = {}
+ DB_COUNTERS.each do |counter|
+ payload[counter] = Gitlab::SafeRequestStore[counter].to_i
+ end
+ payload
end
private
- def select_sql_command?(payload)
- payload[:sql].match(/\A((?!(.*[^\w'"](DELETE|UPDATE|INSERT INTO)[^\w'"])))(WITH.*)?(SELECT)((?!(FOR UPDATE|FOR SHARE)).)*$/i)
+ def ignored_query?(payload)
+ payload[:name] == 'SCHEMA' || IGNORABLE_SQL.include?(payload[:sql])
end
- def increment_db_counters(payload)
- increment(:db_count)
-
- if payload.fetch(:cached, payload[:name] == 'CACHE')
- increment(:db_cached_count)
- end
+ def cached_query?(payload)
+ payload.fetch(:cached, payload[:name] == 'CACHE')
+ end
- increment(:db_write_count) unless select_sql_command?(payload)
+ def select_sql_command?(payload)
+ payload[:sql].match(SQL_COMMANDS_WITH_COMMENTS_REGEX)
end
def increment(counter)
current_transaction&.increment("gitlab_transaction_#{counter}_total".to_sym, 1)
- if Gitlab::SafeRequestStore.active?
- Gitlab::SafeRequestStore[counter] = Gitlab::SafeRequestStore[counter].to_i + 1
+ Gitlab::SafeRequestStore[counter] = Gitlab::SafeRequestStore[counter].to_i + 1
+ end
+
+ def observe(histogram, event)
+ current_transaction&.observe(histogram, event.duration / 1000.0) do
+ buckets DURATION_BUCKET
end
end
def current_transaction
- ::Gitlab::Metrics::Transaction.current
+ ::Gitlab::Metrics::WebTransaction.current || ::Gitlab::Metrics::BackgroundTransaction.current
end
end
end
end
end
+
+Gitlab::Metrics::Subscribers::ActiveRecord.prepend_if_ee('EE::Gitlab::Metrics::Subscribers::ActiveRecord')
diff --git a/lib/gitlab/optimistic_locking.rb b/lib/gitlab/optimistic_locking.rb
index d51d718c826..b29240985f1 100644
--- a/lib/gitlab/optimistic_locking.rb
+++ b/lib/gitlab/optimistic_locking.rb
@@ -2,22 +2,61 @@
module Gitlab
module OptimisticLocking
+ MAX_RETRIES = 100
+
module_function
- def retry_lock(subject, retries = nil, &block)
- retries ||= 100
- # TODO(Observability): We should be recording details of the number of retries and the duration of the total execution here
- ActiveRecord::Base.transaction do
- yield(subject)
- end
- rescue ActiveRecord::StaleObjectError
- retries -= 1
- raise unless retries >= 0
+ def retry_lock(subject, max_retries = MAX_RETRIES, name:, &block)
+ start_time = Gitlab::Metrics::System.monotonic_time
+ retry_attempts = 0
+
+ begin
+ ActiveRecord::Base.transaction do
+ yield(subject)
+ end
+ rescue ActiveRecord::StaleObjectError
+ raise unless retry_attempts < max_retries
+
+ subject.reset
- subject.reset
- retry
+ retry_attempts += 1
+ retry
+ ensure
+ retry_lock_histogram.observe({}, retry_attempts)
+
+ log_optimistic_lock_retries(
+ name: name,
+ retry_attempts: retry_attempts,
+ start_time: start_time)
+ end
end
alias_method :retry_optimistic_lock, :retry_lock
+
+ def log_optimistic_lock_retries(name:, retry_attempts:, start_time:)
+ return unless retry_attempts > 0
+
+ elapsed_time = Gitlab::Metrics::System.monotonic_time - start_time
+
+ retry_lock_logger.info(
+ message: "Optimistic Lock released with retries",
+ name: name,
+ retries: retry_attempts,
+ time_s: elapsed_time)
+ end
+
+ def retry_lock_logger
+ @retry_lock_logger ||= Gitlab::Services::Logger.build
+ end
+
+ def retry_lock_histogram
+ @retry_lock_histogram ||=
+ Gitlab::Metrics.histogram(
+ :gitlab_optimistic_locking_retries,
+ 'Number of retry attempts to execute optimistic retry lock',
+ {},
+ [0, 1, 2, 3, 5, 10, 50]
+ )
+ end
end
end
diff --git a/lib/gitlab/pagination/keyset/column_order_definition.rb b/lib/gitlab/pagination/keyset/column_order_definition.rb
new file mode 100644
index 00000000000..0c8ec02a56b
--- /dev/null
+++ b/lib/gitlab/pagination/keyset/column_order_definition.rb
@@ -0,0 +1,224 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Pagination
+ module Keyset
+ # This class stores information for one column (or SQL expression) which can be used in an
+ # ORDER BY SQL clasue.
+ # The goal of this class is to encapsulate all the metadata in one place which are needed to
+ # make keyset pagination work in a generalized way.
+ #
+ # == Arguments
+ #
+ # **order expression** (Arel::Nodes::Node | String)
+ #
+ # The actual SQL expression for the ORDER BY clause.
+ #
+ # Examples:
+ # # Arel column order definition
+ # Project.arel_table[:id].asc # ORDER BY projects.id ASC
+ #
+ # # Arel expression, calculated order definition
+ # Arel::Nodes::NamedFunction.new("COALESCE", [Project.arel_table[:issue_count].asc, 0]).asc # ORDER BY COALESCE(projects.issue_count, 0)
+ #
+ # # Another Arel expression
+ # Arel::Nodes::Multiplication(Issue.arel_table[:weight], Issue.arel_table[:time_spent]).desc
+ #
+ # # Raw string order definition
+ # 'issues.type DESC NULLS LAST'
+ #
+ # **column_expression** (Arel::Nodes::Node | String)
+ #
+ # Expression for the database column or an expression. This value will be used with logical operations (>, <, =, !=)
+ # when building the database query for the next page.
+ #
+ # Examples:
+ # # Arel column reference
+ # Issue.arel_table[:title]
+ #
+ # # Calculated value
+ # Arel::Nodes::Multiplication(Issue.arel_table[:weight], Issue.arel_table[:time_spent])
+ #
+ # **attribute_name** (String | Symbol)
+ #
+ # An attribute on the loaded ActiveRecord model where the value can be obtained.
+ #
+ # Examples:
+ # # Simple attribute definition
+ # attribute_name = :title
+ #
+ # # Later on this attribute will be used like this:
+ # my_record = Issue.find(x)
+ # value = my_record[attribute_name] # reads data from the title column
+ #
+ # # Calculated value based on an Arel or raw SQL expression
+ #
+ # attribute_name = :lowercase_title
+ #
+ # # `lowercase_title` is not is not a table column therefore we need to make sure it's available in the `SELECT` clause
+ #
+ # my_record = Issue.select(:id, 'LOWER(title) as lowercase_title').last
+ # value = my_record[:lowercase_title]
+ #
+ # **distinct**
+ #
+ # Boolean value.
+ #
+ # Tells us whether the database column contains only distinct values. If the column is covered by
+ # a unique index then set to true.
+ #
+ # **nullable** (:not_nullable | :nulls_last | :nulls_first)
+ #
+ # Tells us whether the database column is nullable or not. This information can be
+ # obtained from the DB schema.
+ #
+ # If the column is not nullable, set this attribute to :not_nullable.
+ #
+ # If the column is nullable, then additional information is needed. Based on the ordering, the null values
+ # will show up at the top or at the bottom of the resultset.
+ #
+ # Examples:
+ # # Nulls are showing up at the top (for example: ORDER BY column ASC):
+ # nullable = :nulls_first
+ #
+ # # Nulls are showing up at the bottom (for example: ORDER BY column DESC):
+ # nullable = :nulls_last
+ #
+ # **order_direction**
+ #
+ # :asc or :desc
+ #
+ # Note: this is an optional attribute, the value will be inferred from the order_expression.
+ # Sometimes it's not possible to infer the order automatically. In this case an exception will be
+ # raised (when the query is executed). If the reverse order cannot be computed, it must be provided explicitly.
+ #
+ # **reversed_order_expression**
+ #
+ # The reversed version of the order_expression.
+ #
+ # A ColumnOrderDefinition object is able to reverse itself which is used when paginating backwards.
+ # When a complex order_expression is provided (raw string), then reversing the order automatically
+ # is not possible. In this case an exception will be raised.
+ #
+ # Example:
+ #
+ # order_expression = Project.arel_table[:id].asc
+ # reversed_order_expression = Project.arel_table[:id].desc
+ #
+ # **add_to_projections**
+ #
+ # Set to true if the column is not part of the queried table. (Not part of SELECT *)
+ #
+ # Example:
+ #
+ # - When the order is a calculated expression or the column is in another table (JOIN-ed)
+ #
+ # If the add_to_projections is true, the query builder will automatically add the column to the SELECT values
+ class ColumnOrderDefinition
+ REVERSED_ORDER_DIRECTIONS = { asc: :desc, desc: :asc }.freeze
+ REVERSED_NULL_POSITIONS = { nulls_first: :nulls_last, nulls_last: :nulls_first }.freeze
+ AREL_ORDER_CLASSES = { Arel::Nodes::Ascending => :asc, Arel::Nodes::Descending => :desc }.freeze
+ ALLOWED_NULLABLE_VALUES = [:not_nullable, :nulls_first, :nulls_last].freeze
+
+ attr_reader :attribute_name, :column_expression, :order_expression, :add_to_projections
+
+ def initialize(attribute_name:, order_expression:, column_expression: nil, reversed_order_expression: nil, nullable: :not_nullable, distinct: true, order_direction: nil, add_to_projections: false)
+ @attribute_name = attribute_name
+ @order_expression = order_expression
+ @column_expression = column_expression || calculate_column_expression(order_expression)
+ @distinct = distinct
+ @reversed_order_expression = reversed_order_expression || calculate_reversed_order(order_expression)
+ @nullable = parse_nullable(nullable, distinct)
+ @order_direction = parse_order_direction(order_expression, order_direction)
+ @add_to_projections = add_to_projections
+ end
+
+ def reverse
+ self.class.new(
+ attribute_name: attribute_name,
+ column_expression: column_expression,
+ order_expression: reversed_order_expression,
+ reversed_order_expression: order_expression,
+ nullable: not_nullable? ? :not_nullable : REVERSED_NULL_POSITIONS[nullable],
+ distinct: distinct,
+ order_direction: REVERSED_ORDER_DIRECTIONS[order_direction]
+ )
+ end
+
+ def ascending_order?
+ order_direction == :asc
+ end
+
+ def descending_order?
+ order_direction == :desc
+ end
+
+ def nulls_first?
+ nullable == :nulls_first
+ end
+
+ def nulls_last?
+ nullable == :nulls_last
+ end
+
+ def not_nullable?
+ nullable == :not_nullable
+ end
+
+ def nullable?
+ !not_nullable?
+ end
+
+ def distinct?
+ distinct
+ end
+
+ private
+
+ attr_reader :reversed_order_expression, :nullable, :distinct, :order_direction
+
+ def calculate_reversed_order(order_expression)
+ unless AREL_ORDER_CLASSES.has_key?(order_expression.class) # Arel can reverse simple orders
+ raise "Couldn't determine reversed order for `#{order_expression}`, please provide the `reversed_order_expression` parameter."
+ end
+
+ order_expression.reverse
+ end
+
+ def calculate_column_expression(order_expression)
+ if order_expression.respond_to?(:expr)
+ order_expression.expr
+ else
+ raise("Couldn't calculate the column expression. Please pass an ARel node as the order_expression, not a string.")
+ end
+ end
+
+ def parse_order_direction(order_expression, order_direction)
+ transformed_order_direction = if order_direction.nil? && AREL_ORDER_CLASSES[order_expression.class]
+ AREL_ORDER_CLASSES[order_expression.class]
+ elsif order_direction.present?
+ order_direction.to_s.downcase.to_sym
+ end
+
+ unless REVERSED_ORDER_DIRECTIONS.has_key?(transformed_order_direction)
+ raise "Invalid or missing `order_direction` (value: #{order_direction}) was given, the allowed values are: :asc or :desc"
+ end
+
+ transformed_order_direction
+ end
+
+ def parse_nullable(nullable, distinct)
+ if ALLOWED_NULLABLE_VALUES.exclude?(nullable)
+ raise "Invalid `nullable` is given (value: #{nullable}), the allowed values are: #{ALLOWED_NULLABLE_VALUES.join(', ')}"
+ end
+
+ if nullable != :not_nullable && distinct
+ raise 'Invalid column definition, `distinct` and `nullable` columns are not allowed at the same time'
+ end
+
+ nullable
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/pagination/keyset/order.rb b/lib/gitlab/pagination/keyset/order.rb
new file mode 100644
index 00000000000..e8e68a5c4a5
--- /dev/null
+++ b/lib/gitlab/pagination/keyset/order.rb
@@ -0,0 +1,248 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Pagination
+ module Keyset
+ # This class is a special ORDER BY clause which is compatible with ActiveRecord. It helps
+ # building keyset paginated queries.
+ #
+ # In ActiveRecord we use the `order()` method which will generate the `ORDER BY X` SQL clause
+ #
+ # Project.where(active: true).order(id: :asc)
+ #
+ # # Or
+ #
+ # Project.where(active: true).order(created_at: :asc, id: desc)
+ #
+ # Gitlab::Pagination::Keyset::Order class encapsulates more information about the order columns
+ # in order to implement keyset pagination in a generic way
+ #
+ # - Extract values from a record (usually the last item of the previous query)
+ # - Build query conditions based on the column configuration
+ #
+ # Example 1: Order by primary key
+ #
+ # # Simple order definition for the primary key as an ActiveRecord scope
+ # scope :id_asc_ordered, -> {
+ # keyset_order = Gitlab::Pagination::Keyset::Order.build([
+ # Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ # attribute: :id,
+ # order_expression: Project.arel_table[:id].asc
+ # )
+ # ])
+ #
+ # reorder(keyset_order)
+ # }
+ #
+ # # ... Later in the application code:
+ #
+ # # Compatible with ActiveRecord's `order()` method
+ # page1 = Project.where(active: true).id_asc_ordered.limit(5)
+ # keyset_order = Gitlab::Pagination::Keyset::Order.extract_keyset_order_object(page1)
+ #
+ # last_record = page1.last
+ # cursor_values = keyset_order.cursor_attributes_for_node(last_record) # { id: x }
+ #
+ # page2 = keyset_order.apply_cursor_conditions(Project.where(active: true).id_asc_ordered, cursor_values).limit(5)
+ #
+ # last_record = page2.last
+ # cursor_values = keyset_order.cursor_attributes_for_node(last_record)
+ #
+ # page3 = keyset_order.apply_cursor_conditions(Project.where(active: true).id_asc_ordered, cursor_values).limit(5)
+ #
+ # Example 2: Order by creation time and primary key (primary key is the tie breaker)
+ #
+ # scope :created_at_ordered, -> {
+ # keyset_order = Gitlab::Pagination::Keyset::Order.build([
+ # Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ # attribute: :created_at,
+ # column_expression: Project.arel_table[:created_at],
+ # order_expression: Project.arel_table[:created_at].asc,
+ # distinct: false, # values in the column are not unique
+ # nullable: :nulls_last # we might see NULL values (bottom)
+ # ),
+ # Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ # attribute: :id,
+ # order_expression: Project.arel_table[:id].asc
+ # )
+ # ])
+ #
+ # reorder(keyset_order)
+ # }
+ #
+ class Order < Arel::Nodes::SqlLiteral
+ attr_reader :column_definitions
+
+ def initialize(column_definitions:)
+ @column_definitions = column_definitions
+
+ super(to_sql_literal(@column_definitions))
+ end
+
+ # Tells whether the given ActiveRecord::Relation has keyset ordering
+ def self.keyset_aware?(scope)
+ scope.order_values.first.is_a?(self) && scope.order_values.one?
+ end
+
+ def self.extract_keyset_order_object(scope)
+ scope.order_values.first
+ end
+
+ def self.build(column_definitions)
+ new(column_definitions: column_definitions)
+ end
+
+ def cursor_attributes_for_node(node)
+ column_definitions.each_with_object({}) do |column_definition, hash|
+ field_value = node[column_definition.attribute_name]
+ hash[column_definition.attribute_name] = if field_value.is_a?(Time)
+ field_value.strftime('%Y-%m-%d %H:%M:%S.%N %Z')
+ elsif field_value.nil?
+ nil
+ else
+ field_value.to_s
+ end
+ end
+ end
+
+ # This methods builds the conditions for the keyset pagination
+ #
+ # Example:
+ #
+ # |created_at|id|
+ # |----------|--|
+ # |2020-01-01| 1|
+ # | null| 2|
+ # | null| 3|
+ # |2020-02-01| 4|
+ #
+ # Note: created_at is not distinct and nullable
+ # Order `ORDER BY created_at DESC, id DESC`
+ #
+ # We get the following cursor values from the previous page:
+ # { id: 4, created_at: '2020-02-01' }
+ #
+ # To get the next rows, we need to build the following conditions:
+ #
+ # (created_at = '2020-02-01' AND id < 4) OR (created_at < '2020-01-01')
+ #
+ # DESC ordering ensures that NULL values are on top so we don't need conditions for NULL values
+ #
+ # Another cursor example:
+ # { id: 3, created_at: nil }
+ #
+ # To get the next rows, we need to build the following conditions:
+ #
+ # (id < 3 AND created_at IS NULL) OR (created_at IS NOT NULL)
+ def build_where_values(values)
+ return if values.blank?
+
+ verify_incoming_values!(values)
+
+ where_values = []
+
+ reversed_column_definitions = column_definitions.reverse
+ reversed_column_definitions.each_with_index do |column_definition, i|
+ value = values[column_definition.attribute_name]
+
+ conditions_for_column(column_definition, value).each do |condition|
+ column_definitions_after_index = reversed_column_definitions.last(column_definitions.reverse.size - i - 1)
+
+ equal_conditon_for_rest = column_definitions_after_index.map do |definition|
+ definition.column_expression.eq(values[definition.attribute_name])
+ end
+
+ where_values << Arel::Nodes::Grouping.new(Arel::Nodes::And.new([condition, *equal_conditon_for_rest].compact))
+ end
+ end
+
+ build_or_query(where_values)
+ end
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def apply_cursor_conditions(scope, values = {})
+ scope = apply_custom_projections(scope)
+ scope.where(build_where_values(values))
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ def reversed_order
+ self.class.build(column_definitions.map(&:reverse))
+ end
+
+ private
+
+ # Adds extra columns to the SELECT clause
+ def apply_custom_projections(scope)
+ additional_projections = column_definitions.select(&:add_to_projections).map do |column_definition|
+ # avoid mutating the original column_expression
+ column_definition.column_expression.dup.as(column_definition.attribute_name).to_sql
+ end
+
+ scope = scope.select(*scope.arel.projections, *additional_projections) if additional_projections
+ scope
+ end
+
+ def conditions_for_column(column_definition, value)
+ conditions = []
+ # Depending on the order, build a query condition fragment for taking the next rows
+ if column_definition.distinct? || (!column_definition.distinct? && value.present?)
+ conditions << compare_column_with_value(column_definition, value)
+ end
+
+ # When the column is nullable, additional conditions for NULL a NOT NULL values are necessary.
+ # This depends on the position of the nulls (top or bottom of the resultset).
+ if column_definition.nulls_first? && value.blank?
+ conditions << column_definition.column_expression.not_eq(nil)
+ elsif column_definition.nulls_last? && value.present?
+ conditions << column_definition.column_expression.eq(nil)
+ end
+
+ conditions
+ end
+
+ def compare_column_with_value(column_definition, value)
+ if column_definition.descending_order?
+ column_definition.column_expression.lt(value)
+ else
+ column_definition.column_expression.gt(value)
+ end
+ end
+
+ def build_or_query(expressions)
+ or_expression = expressions.reduce { |or_expression, expression| Arel::Nodes::Or.new(or_expression, expression) }
+
+ Arel::Nodes::Grouping.new(or_expression)
+ end
+
+ def to_sql_literal(column_definitions)
+ column_definitions.map do |column_definition|
+ if column_definition.order_expression.respond_to?(:to_sql)
+ column_definition.order_expression.to_sql
+ else
+ column_definition.order_expression.to_s
+ end
+ end.join(', ')
+ end
+
+ def verify_incoming_values!(values)
+ value_keys = values.keys.map(&:to_s)
+ order_attrbute_names = column_definitions.map(&:attribute_name).map(&:to_s)
+ missing_items = order_attrbute_names - value_keys
+ extra_items = value_keys - order_attrbute_names
+
+ if missing_items.any? || extra_items.any?
+ error_text = ['Incorrect cursor values were given']
+
+ error_text << "Extra items: #{extra_items.join(', ')}" if extra_items.any?
+ error_text << "Missing items: #{missing_items.join(', ')}" if missing_items.any?
+
+ error_text.compact
+
+ raise error_text.join('. ')
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/performance_bar/redis_adapter_when_peek_enabled.rb b/lib/gitlab/performance_bar/redis_adapter_when_peek_enabled.rb
index 133d777fc32..ac5c907465e 100644
--- a/lib/gitlab/performance_bar/redis_adapter_when_peek_enabled.rb
+++ b/lib/gitlab/performance_bar/redis_adapter_when_peek_enabled.rb
@@ -17,7 +17,7 @@ module Gitlab
# to a structured log
# rubocop:disable Gitlab/ModuleWithInstanceVariables
def enqueue_stats_job(request_id)
- return unless gather_stats?
+ return unless Feature.enabled?(:performance_bar_stats)
@client.sadd(GitlabPerformanceBarStatsWorker::STATS_KEY, request_id)
@@ -43,12 +43,6 @@ module Gitlab
)
end
# rubocop:enable Gitlab/ModuleWithInstanceVariables
-
- def gather_stats?
- return unless Feature.enabled?(:performance_bar_stats)
-
- Gitlab.com? || Gitlab.staging? || !Rails.env.production?
- end
end
end
end
diff --git a/lib/gitlab/query_limiting.rb b/lib/gitlab/query_limiting.rb
index 31e6b120e45..5e46e26e14e 100644
--- a/lib/gitlab/query_limiting.rb
+++ b/lib/gitlab/query_limiting.rb
@@ -4,9 +4,8 @@ module Gitlab
module QueryLimiting
# Returns true if we should enable tracking of query counts.
#
- # This is only enabled in production/staging if we're running on GitLab.com.
- # This ensures we don't produce any errors that users can't do anything
- # about themselves.
+ # This is only enabled in development and test to ensure we don't produce
+ # any errors that users of other environments can't do anything about themselves.
def self.enable?
Rails.env.development? || Rails.env.test?
end
@@ -19,7 +18,7 @@ module Gitlab
# The issue URL is only meant to push developers into creating an issue
# instead of blindly whitelisting offending blocks of code.
def self.whitelist(issue_url)
- return unless enable_whitelist?
+ return unless enable?
unless issue_url.start_with?('https://')
raise(
@@ -30,9 +29,5 @@ module Gitlab
Transaction&.current&.whitelisted = true
end
-
- def self.enable_whitelist?
- Rails.env.development? || Rails.env.test?
- end
end
end
diff --git a/lib/gitlab/query_limiting/active_support_subscriber.rb b/lib/gitlab/query_limiting/active_support_subscriber.rb
index 065862174bb..138fae7b641 100644
--- a/lib/gitlab/query_limiting/active_support_subscriber.rb
+++ b/lib/gitlab/query_limiting/active_support_subscriber.rb
@@ -6,9 +6,10 @@ module Gitlab
attach_to :active_record
def sql(event)
- unless event.payload.fetch(:cached, event.payload[:name] == 'CACHE')
- Transaction.current&.increment
- end
+ return if !Transaction.current || event.payload.fetch(:cached, event.payload[:name] == 'CACHE')
+
+ Transaction.current.increment
+ Transaction.current.executed_sql(event.payload[:sql])
end
end
end
diff --git a/lib/gitlab/query_limiting/transaction.rb b/lib/gitlab/query_limiting/transaction.rb
index e8fad067fa6..196072dddda 100644
--- a/lib/gitlab/query_limiting/transaction.rb
+++ b/lib/gitlab/query_limiting/transaction.rb
@@ -15,6 +15,7 @@ module Gitlab
# the sake of keeping things simple we hardcode this value here, it's not
# supposed to be changed very often anyway.
THRESHOLD = 100
+ LOG_THRESHOLD = THRESHOLD * 1.5
# Error that is raised whenever exceeding the maximum number of queries.
ThresholdExceededError = Class.new(StandardError)
@@ -45,6 +46,7 @@ module Gitlab
@action = nil
@count = 0
@whitelisted = false
+ @sql_executed = []
end
# Sends a notification based on the number of executed SQL queries.
@@ -60,6 +62,10 @@ module Gitlab
@count += 1 unless whitelisted
end
+ def executed_sql(sql)
+ @sql_executed << sql if @count <= LOG_THRESHOLD
+ end
+
def raise_error?
Rails.env.test?
end
@@ -71,8 +77,11 @@ module Gitlab
def error_message
header = 'Too many SQL queries were executed'
header = "#{header} in #{action}" if action
+ msg = "a maximum of #{THRESHOLD} is allowed but #{count} SQL queries were executed"
+ log = @sql_executed.each_with_index.map { |sql, i| "#{i}: #{sql}" }.join("\n").presence
+ ellipsis = '...' if @count > LOG_THRESHOLD
- "#{header}: a maximum of #{THRESHOLD} is allowed but #{count} SQL queries were executed"
+ ["#{header}: #{msg}", log, ellipsis].compact.join("\n")
end
end
end
diff --git a/lib/gitlab/quick_actions/issue_actions.rb b/lib/gitlab/quick_actions/issue_actions.rb
index c162ee545c6..7bf348346ea 100644
--- a/lib/gitlab/quick_actions/issue_actions.rb
+++ b/lib/gitlab/quick_actions/issue_actions.rb
@@ -235,6 +235,35 @@ module Gitlab
@execution_message[:remove_zoom] = result.message
end
+ desc _('Add email participant(s)')
+ explanation _('Adds email participant(s)')
+ params 'email1@example.com email2@example.com (up to 6 emails)'
+ types Issue
+ condition do
+ Feature.enabled?(:issue_email_participants, parent) &&
+ current_user.can?(:"admin_#{quick_action_target.to_ability_name}", quick_action_target)
+ end
+ command :invite_email do |emails = ""|
+ MAX_NUMBER_OF_EMAILS = 6
+
+ existing_emails = quick_action_target.email_participants_downcase
+ emails_to_add = emails.split(' ').index_by { |email| [email.downcase, email] }.except(*existing_emails).each_value.first(MAX_NUMBER_OF_EMAILS)
+ added_emails = []
+
+ emails_to_add.each do |email|
+ new_participant = quick_action_target.issue_email_participants.create(email: email)
+ added_emails << email if new_participant.persisted?
+ end
+
+ if added_emails.any?
+ message = _("added %{emails}") % { emails: added_emails.to_sentence }
+ SystemNoteService.add_email_participants(quick_action_target, quick_action_target.project, current_user, message)
+ @execution_message[:invite_email] = message.upcase_first << "."
+ else
+ @execution_message[:invite_email] = _("No email participants were added. Either none were provided, or they already exist.")
+ end
+ end
+
private
def zoom_link_service
diff --git a/lib/gitlab/regex.rb b/lib/gitlab/regex.rb
index 96f2b7570b3..00739c05386 100644
--- a/lib/gitlab/regex.rb
+++ b/lib/gitlab/regex.rb
@@ -61,6 +61,10 @@ module Gitlab
maven_app_name_regex
end
+ def npm_package_name_regex
+ @npm_package_name_regex ||= %r{\A(?:@(#{Gitlab::PathRegex::NAMESPACE_FORMAT_REGEX})/)?[-+\.\_a-zA-Z0-9]+\z}
+ end
+
def nuget_package_name_regex
@nuget_package_name_regex ||= %r{\A[-+\.\_a-zA-Z0-9]+\z}.freeze
end
diff --git a/lib/gitlab/relative_positioning/closed_range.rb b/lib/gitlab/relative_positioning/closed_range.rb
new file mode 100644
index 00000000000..8916d1face5
--- /dev/null
+++ b/lib/gitlab/relative_positioning/closed_range.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module RelativePositioning
+ class ClosedRange < RelativePositioning::Range
+ def initialize(lhs, rhs)
+ @lhs, @rhs = lhs, rhs
+ raise IllegalRange, 'Either lhs or rhs is missing' unless lhs && rhs
+ raise IllegalRange, 'lhs and rhs cannot be the same object' if lhs == rhs
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/relative_positioning/ending_at.rb b/lib/gitlab/relative_positioning/ending_at.rb
new file mode 100644
index 00000000000..61060638ee6
--- /dev/null
+++ b/lib/gitlab/relative_positioning/ending_at.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module RelativePositioning
+ class EndingAt < RelativePositioning::Range
+ include Gitlab::Utils::StrongMemoize
+
+ def initialize(rhs)
+ @rhs = rhs
+ raise IllegalRange, 'rhs is required' unless rhs
+ end
+
+ def lhs
+ strong_memoize(:lhs) { rhs.lhs_neighbour }
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/relative_positioning/range.rb b/lib/gitlab/relative_positioning/range.rb
index 0b0ccdf5be4..3214c72eb8b 100644
--- a/lib/gitlab/relative_positioning/range.rb
+++ b/lib/gitlab/relative_positioning/range.rb
@@ -31,39 +31,5 @@ module Gitlab
other.is_a?(RelativePositioning::Range) && lhs == other.lhs && rhs == other.rhs
end
end
-
- class ClosedRange < RelativePositioning::Range
- def initialize(lhs, rhs)
- @lhs, @rhs = lhs, rhs
- raise IllegalRange, 'Either lhs or rhs is missing' unless lhs && rhs
- raise IllegalRange, 'lhs and rhs cannot be the same object' if lhs == rhs
- end
- end
-
- class StartingFrom < RelativePositioning::Range
- include Gitlab::Utils::StrongMemoize
-
- def initialize(lhs)
- @lhs = lhs
- raise IllegalRange, 'lhs is required' unless lhs
- end
-
- def rhs
- strong_memoize(:rhs) { lhs.rhs_neighbour }
- end
- end
-
- class EndingAt < RelativePositioning::Range
- include Gitlab::Utils::StrongMemoize
-
- def initialize(rhs)
- @rhs = rhs
- raise IllegalRange, 'rhs is required' unless rhs
- end
-
- def lhs
- strong_memoize(:lhs) { rhs.lhs_neighbour }
- end
- end
end
end
diff --git a/lib/gitlab/relative_positioning/starting_from.rb b/lib/gitlab/relative_positioning/starting_from.rb
new file mode 100644
index 00000000000..6ddd35a39ad
--- /dev/null
+++ b/lib/gitlab/relative_positioning/starting_from.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module RelativePositioning
+ class StartingFrom < RelativePositioning::Range
+ include Gitlab::Utils::StrongMemoize
+
+ def initialize(lhs)
+ @lhs = lhs
+ raise IllegalRange, 'lhs is required' unless lhs
+ end
+
+ def rhs
+ strong_memoize(:rhs) { lhs.rhs_neighbour }
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/runtime.rb b/lib/gitlab/runtime.rb
index 647ac169f05..968ef06b085 100644
--- a/lib/gitlab/runtime.rb
+++ b/lib/gitlab/runtime.rb
@@ -82,7 +82,10 @@ module Gitlab
end
def puma_in_clustered_mode?
- puma? && Puma.cli_config.options[:workers].to_i > 0
+ return unless puma?
+ return unless Puma.respond_to?(:cli_config)
+
+ Puma.cli_config.options[:workers].to_i > 0
end
def max_threads
diff --git a/lib/gitlab/setup_helper.rb b/lib/gitlab/setup_helper.rb
index 48f204e0b86..7561e36cc33 100644
--- a/lib/gitlab/setup_helper.rb
+++ b/lib/gitlab/setup_helper.rb
@@ -115,7 +115,7 @@ module Gitlab
config[:storage] = storages
- internal_socket_dir = File.join(gitaly_dir, 'internal_sockets')
+ 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
diff --git a/lib/gitlab/sidekiq_middleware.rb b/lib/gitlab/sidekiq_middleware.rb
index 5f912818605..a2696e17078 100644
--- a/lib/gitlab/sidekiq_middleware.rb
+++ b/lib/gitlab/sidekiq_middleware.rb
@@ -36,6 +36,8 @@ module Gitlab
chain.add ::Gitlab::SidekiqMiddleware::DuplicateJobs::Client
chain.add ::Gitlab::SidekiqStatus::ClientMiddleware
chain.add ::Gitlab::SidekiqMiddleware::AdminMode::Client
+ # Size limiter should be placed at the bottom, but before the metrics midleware
+ chain.add ::Gitlab::SidekiqMiddleware::SizeLimiter::Client
chain.add ::Gitlab::SidekiqMiddleware::ClientMetrics
end
end
diff --git a/lib/gitlab/sidekiq_middleware/server_metrics.rb b/lib/gitlab/sidekiq_middleware/server_metrics.rb
index 4ab8d313ad8..cf768811ffd 100644
--- a/lib/gitlab/sidekiq_middleware/server_metrics.rb
+++ b/lib/gitlab/sidekiq_middleware/server_metrics.rb
@@ -34,7 +34,8 @@ module Gitlab
monotonic_time_start = Gitlab::Metrics::System.monotonic_time
job_thread_cputime_start = get_thread_cputime
begin
- yield
+ transaction = Gitlab::Metrics::BackgroundTransaction.new
+ transaction.run { yield }
job_succeeded = true
ensure
monotonic_time_end = Gitlab::Metrics::System.monotonic_time
diff --git a/lib/gitlab/sidekiq_middleware/size_limiter/client.rb b/lib/gitlab/sidekiq_middleware/size_limiter/client.rb
new file mode 100644
index 00000000000..bc8b1989e78
--- /dev/null
+++ b/lib/gitlab/sidekiq_middleware/size_limiter/client.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module SidekiqMiddleware
+ module SizeLimiter
+ # This midleware is inserted into Sidekiq **client** middleware chain. It
+ # prevents the caller from dispatching a too-large job payload. The job
+ # payload should be small and simple. Read more at:
+ # https://github.com/mperham/sidekiq/wiki/Best-Practices#1-make-your-job-parameters-small-and-simple
+ class Client
+ def call(worker_class, job, queue, _redis_pool)
+ ::Gitlab::SidekiqMiddleware::SizeLimiter::Validator.validate!(worker_class, job)
+
+ yield
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/sidekiq_middleware/size_limiter/exceed_limit_error.rb b/lib/gitlab/sidekiq_middleware/size_limiter/exceed_limit_error.rb
new file mode 100644
index 00000000000..da6c903ccae
--- /dev/null
+++ b/lib/gitlab/sidekiq_middleware/size_limiter/exceed_limit_error.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module SidekiqMiddleware
+ module SizeLimiter
+ # A custom exception for size limiter. It contains worker class and its
+ # size to easier track later
+ class ExceedLimitError < StandardError
+ attr_reader :worker_class, :size, :size_limit
+
+ def initialize(worker_class, size, size_limit)
+ @worker_class = worker_class
+ @size = size
+ @size_limit = size_limit
+
+ super "#{@worker_class} job exceeds payload size limit (#{size}/#{size_limit})"
+ end
+
+ def sentry_extra_data
+ {
+ worker_class: @worker_class.to_s,
+ size: @size.to_i,
+ size_limit: @size_limit.to_i
+ }
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/sidekiq_middleware/size_limiter/validator.rb b/lib/gitlab/sidekiq_middleware/size_limiter/validator.rb
new file mode 100644
index 00000000000..2c50c4a2157
--- /dev/null
+++ b/lib/gitlab/sidekiq_middleware/size_limiter/validator.rb
@@ -0,0 +1,97 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module SidekiqMiddleware
+ module SizeLimiter
+ # Validate a Sidekiq job payload limit based on current configuration.
+ # This validator pulls the configuration from the environment variables:
+ #
+ # - GITLAB_SIDEKIQ_SIZE_LIMITER_MODE: the current mode of the size
+ # limiter. This must be either `track` or `raise`.
+ #
+ # - GITLAB_SIDEKIQ_SIZE_LIMITER_LIMIT_BYTES: the size limit in bytes.
+ #
+ # If the size of job payload after serialization exceeds the limit, an
+ # error is tracked raised adhering to the mode.
+ class Validator
+ def self.validate!(worker_class, job)
+ new(worker_class, job).validate!
+ end
+
+ DEFAULT_SIZE_LIMIT = 0
+
+ MODES = [
+ TRACK_MODE = 'track',
+ RAISE_MODE = 'raise'
+ ].freeze
+
+ attr_reader :mode, :size_limit
+
+ def initialize(
+ worker_class, job,
+ mode: ENV['GITLAB_SIDEKIQ_SIZE_LIMITER_MODE'],
+ size_limit: ENV['GITLAB_SIDEKIQ_SIZE_LIMITER_LIMIT_BYTES']
+ )
+ @worker_class = worker_class
+ @job = job
+
+ @mode = (mode || TRACK_MODE).to_s.strip
+ unless MODES.include?(@mode)
+ ::Sidekiq.logger.warn "Invalid Sidekiq size limiter mode: #{@mode}. Fallback to #{TRACK_MODE} mode."
+ @mode = TRACK_MODE
+ end
+
+ @size_limit = (size_limit || DEFAULT_SIZE_LIMIT).to_i
+ if @size_limit < 0
+ ::Sidekiq.logger.warn "Invalid Sidekiq size limiter limit: #{@size_limit}"
+ end
+ end
+
+ def validate!
+ return unless @size_limit > 0
+
+ return if allow_big_payload?
+ return if job_size <= @size_limit
+
+ exception = ExceedLimitError.new(@worker_class, job_size, @size_limit)
+ # This should belong to Gitlab::ErrorTracking. We'll remove this
+ # after this epic is done:
+ # https://gitlab.com/groups/gitlab-com/gl-infra/-/epics/396
+ exception.set_backtrace(backtrace)
+
+ if raise_mode?
+ raise exception
+ else
+ track(exception)
+ end
+ end
+
+ private
+
+ def job_size
+ # This maynot be the optimal solution, but can be acceptable solution
+ # for now. Internally, Sidekiq calls Sidekiq.dump_json everywhere.
+ # There is no clean way to intefere to prevent double serialization.
+ @job_size ||= ::Sidekiq.dump_json(@job).bytesize
+ end
+
+ def allow_big_payload?
+ worker_class = @worker_class.to_s.safe_constantize
+ worker_class.respond_to?(:big_payload?) && worker_class.big_payload?
+ end
+
+ def raise_mode?
+ @mode == RAISE_MODE
+ end
+
+ def track(exception)
+ Gitlab::ErrorTracking.track_exception(exception)
+ end
+
+ def backtrace
+ Gitlab::BacktraceCleaner.clean_backtrace(caller)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/string_range_marker.rb b/lib/gitlab/string_range_marker.rb
index 780fe4c7725..5ddc88edf50 100644
--- a/lib/gitlab/string_range_marker.rb
+++ b/lib/gitlab/string_range_marker.rb
@@ -15,8 +15,10 @@ module Gitlab
end
end
- def mark(marker_ranges)
- return rich_line unless marker_ranges&.any?
+ def mark(ranges)
+ return rich_line unless ranges&.any?
+
+ marker_ranges = ranges.map { |range| Gitlab::MarkerRange.from_range(range) }
if html_escaped
rich_marker_ranges = []
@@ -24,7 +26,7 @@ module Gitlab
# Map the inline-diff range based on the raw line to character positions in the rich line
rich_positions = position_mapping[range].flatten
# Turn the array of character positions into ranges
- rich_marker_ranges.concat(collapse_ranges(rich_positions))
+ rich_marker_ranges.concat(collapse_ranges(rich_positions, range.mode))
end
else
rich_marker_ranges = marker_ranges
@@ -36,7 +38,7 @@ module Gitlab
offset_range = (range.begin + offset)..(range.end + offset)
original_text = rich_line[offset_range]
- text = yield(original_text, left: i == 0, right: i == rich_marker_ranges.length - 1)
+ text = yield(original_text, left: i == 0, right: i == rich_marker_ranges.length - 1, mode: range.mode)
rich_line[offset_range] = text
@@ -90,21 +92,21 @@ module Gitlab
end
# Takes an array of integers, and returns an array of ranges covering the same integers
- def collapse_ranges(positions)
+ def collapse_ranges(positions, mode)
return [] if positions.empty?
ranges = []
start = prev = positions[0]
- range = start..prev
+ range = MarkerRange.new(start, prev, mode: mode)
positions[1..-1].each do |pos|
if pos == prev + 1
- range = start..pos
+ range = MarkerRange.new(start, pos, mode: mode)
prev = pos
else
ranges << range
start = prev = pos
- range = start..prev
+ range = MarkerRange.new(start, prev, mode: mode)
end
end
ranges << range
diff --git a/lib/gitlab/template/base_template.rb b/lib/gitlab/template/base_template.rb
index 3be77aff07e..dc006877129 100644
--- a/lib/gitlab/template/base_template.rb
+++ b/lib/gitlab/template/base_template.rb
@@ -87,11 +87,11 @@ module Gitlab
raise NotImplementedError
end
- def by_category(category, project = nil)
+ def by_category(category, project = nil, empty_category_title: nil)
directory = category_directory(category)
files = finder(project).list_files_for(directory)
- files.map { |f| new(f, project, category: category) }.sort
+ files.map { |f| new(f, project, category: category.presence || empty_category_title) }.sort
end
def category_directory(category)
diff --git a/lib/gitlab/template/issue_template.rb b/lib/gitlab/template/issue_template.rb
index 30fff9bdae9..6e579018e45 100644
--- a/lib/gitlab/template/issue_template.rb
+++ b/lib/gitlab/template/issue_template.rb
@@ -25,6 +25,10 @@ module Gitlab
# follow-up issue: https://gitlab.com/gitlab-org/gitlab/-/issues/300279
project.repository.issue_template_names_hash
end
+
+ def by_category(category, project = nil, empty_category_title: nil)
+ super(category, project, empty_category_title: _('Project Templates'))
+ end
end
end
end
diff --git a/lib/gitlab/template/merge_request_template.rb b/lib/gitlab/template/merge_request_template.rb
index 7491c8f26c6..241a823d870 100644
--- a/lib/gitlab/template/merge_request_template.rb
+++ b/lib/gitlab/template/merge_request_template.rb
@@ -25,6 +25,10 @@ module Gitlab
# follow-up issue: https://gitlab.com/gitlab-org/gitlab/-/issues/300279
project.repository.merge_request_template_names_hash
end
+
+ def by_category(category, project = nil, empty_category_title: nil)
+ super(category, project, empty_category_title: _('Project Templates'))
+ end
end
end
end
diff --git a/lib/gitlab/tracking/standard_context.rb b/lib/gitlab/tracking/standard_context.rb
index 92fdd008249..8ce16c11267 100644
--- a/lib/gitlab/tracking/standard_context.rb
+++ b/lib/gitlab/tracking/standard_context.rb
@@ -15,10 +15,14 @@ module Gitlab
end
def environment
- return 'production' if Gitlab.com_and_canary?
-
return 'staging' if Gitlab.staging?
+ return 'production' if Gitlab.com?
+
+ return 'org' if Gitlab.org?
+
+ return 'self-managed' if Rails.env.production?
+
'development'
end
diff --git a/lib/gitlab/tree_summary.rb b/lib/gitlab/tree_summary.rb
index bc7b8bd2b94..86cd91f0a32 100644
--- a/lib/gitlab/tree_summary.rb
+++ b/lib/gitlab/tree_summary.rb
@@ -104,12 +104,12 @@ module Gitlab
end
def fetch_last_cached_commits_list
- cache_key = ['projects', project.id, 'last_commits_list', commit.id, ensured_path, offset, limit]
+ cache_key = ['projects', project.id, 'last_commits', commit.id, ensured_path, offset, limit]
commits = Rails.cache.fetch(cache_key, expires_in: CACHE_EXPIRE_IN) do
repository
.list_last_commits_for_tree(commit.id, ensured_path, offset: offset, limit: limit, literal_pathspec: true)
- .transform_values!(&:to_hash)
+ .transform_values! { |commit| commit_to_hash(commit) }
end
commits.transform_values! { |value| Commit.from_hash(value, project) }
@@ -121,6 +121,12 @@ module Gitlab
resolved_commits[commit.id] ||= commit
end
+ def commit_to_hash(commit)
+ commit.to_hash.tap do |hash|
+ hash[:message] = hash[:message].to_s.truncate_bytes(1.kilobyte, omission: '...')
+ end
+ end
+
def commit_path(commit)
Gitlab::Routing.url_helpers.project_commit_path(project, commit)
end
diff --git a/lib/gitlab/usage/docs/helper.rb b/lib/gitlab/usage/docs/helper.rb
index 8483334800b..1dc660e574b 100644
--- a/lib/gitlab/usage/docs/helper.rb
+++ b/lib/gitlab/usage/docs/helper.rb
@@ -5,9 +5,6 @@ module Gitlab
module Docs
# Helper with functions to be used by HAML templates
module Helper
- HEADER = %w(field value).freeze
- SKIP_KEYS = %i(description).freeze
-
def auto_generated_comment
<<-MARKDOWN.strip_heredoc
---
@@ -27,35 +24,33 @@ module Gitlab
end
def render_name(name)
- "## `#{name}`\n"
+ "### `#{name}`"
end
def render_description(object)
- object.description
+ return 'Missing description' unless object[:description].present?
+
+ object[:description]
end
- def render_attribute_row(key, value)
- value = Gitlab::Usage::Docs::ValueFormatter.format(key, value)
- table_row(["`#{key}`", value])
+ def render_yaml_link(yaml_path)
+ "[YAML definition](#{yaml_path})"
end
- def render_attributes_table(object)
- <<~MARKDOWN
+ def render_status(object)
+ "Status: #{format(:status, object[:status])}"
+ end
- #{table_row(HEADER)}
- #{table_row(HEADER.map { '---' })}
- #{table_value_rows(object.attributes)}
- MARKDOWN
+ def render_owner(object)
+ "Group: `#{object[:product_group]}`"
end
- def table_value_rows(attributes)
- attributes.reject { |k, _| k.in?(SKIP_KEYS) }.map do |key, value|
- render_attribute_row(key, value)
- end.join("\n")
+ def render_tiers(object)
+ "Tiers:#{format(:tier, object[:tier])}"
end
- def table_row(array)
- "| #{array.join(' | ')} |"
+ def format(key, value)
+ Gitlab::Usage::Docs::ValueFormatter.format(key, value)
end
end
end
diff --git a/lib/gitlab/usage/docs/templates/default.md.haml b/lib/gitlab/usage/docs/templates/default.md.haml
index 86e93be66c7..19ad668019e 100644
--- a/lib/gitlab/usage/docs/templates/default.md.haml
+++ b/lib/gitlab/usage/docs/templates/default.md.haml
@@ -13,16 +13,26 @@
The Metrics Dictionary is based on the following metrics definition YAML files:
- - [`config/metrics`]('https://gitlab.com/gitlab-org/gitlab/-/tree/master/config/metrics')
+ - [`config/metrics`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/config/metrics)
- [`ee/config/metrics`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/ee/config/metrics)
-Each table includes a `milestone`, which corresponds to the GitLab version when the metric
-was released.
+ Each table includes a `milestone`, which corresponds to the GitLab version when the metric
+ was released.
+
+ ## Metrics Definitions
+
\
- metrics_definitions.each do |name, object|
= render_name(name)
-
- = render_description(object)
-
- = render_attributes_table(object)
+ \
+ = render_description(object.attributes)
+ \
+ = render_yaml_link(object.yaml_path)
+ \
+ = render_owner(object.attributes)
+ \
+ = render_status(object.attributes)
+ \
+ = render_tiers(object.attributes)
+ \
diff --git a/lib/gitlab/usage/docs/value_formatter.rb b/lib/gitlab/usage/docs/value_formatter.rb
index a2dc9b081f8..379e5df4d52 100644
--- a/lib/gitlab/usage/docs/value_formatter.rb
+++ b/lib/gitlab/usage/docs/value_formatter.rb
@@ -5,17 +5,19 @@ module Gitlab
module Docs
class ValueFormatter
def self.format(key, value)
+ return '' unless value.present?
+
case key
when :key_path
"**`#{value}`**"
when :data_source
value.to_s.capitalize
- when :product_group
+ when :product_group, :product_category, :status
"`#{value}`"
when :introduced_by_url
"[Introduced by](#{value})"
when :distribution, :tier
- Array(value).join(', ')
+ Array(value).map { |tier| " `#{tier}`" }.join(',')
else
value
end
diff --git a/lib/gitlab/usage/metric_definition.rb b/lib/gitlab/usage/metric_definition.rb
index 01d202e4d45..3964eb39ad9 100644
--- a/lib/gitlab/usage/metric_definition.rb
+++ b/lib/gitlab/usage/metric_definition.rb
@@ -4,6 +4,7 @@ module Gitlab
module Usage
class MetricDefinition
METRIC_SCHEMA_PATH = Rails.root.join('config', 'metrics', 'schema.json')
+ BASE_REPO_PATH = 'https://gitlab.com/gitlab-org/gitlab/-/blob/master'
attr_reader :path
attr_reader :attributes
@@ -21,6 +22,10 @@ module Gitlab
attributes
end
+ def yaml_path
+ "#{BASE_REPO_PATH}#{path.delete_prefix(Rails.root.to_s)}"
+ end
+
def validate!
unless skip_validation?
self.class.schemer.validate(attributes.stringify_keys).each do |error|
diff --git a/lib/gitlab/usage/metrics/aggregates/aggregate.rb b/lib/gitlab/usage/metrics/aggregates/aggregate.rb
index 1fc40798320..1aeca87d849 100644
--- a/lib/gitlab/usage/metrics/aggregates/aggregate.rb
+++ b/lib/gitlab/usage/metrics/aggregates/aggregate.rb
@@ -11,6 +11,7 @@ module Gitlab
AggregatedMetricError = Class.new(StandardError)
UnknownAggregationOperator = Class.new(AggregatedMetricError)
UnknownAggregationSource = Class.new(AggregatedMetricError)
+ DisallowedAggregationTimeFrame = Class.new(AggregatedMetricError)
DATABASE_SOURCE = 'database'
REDIS_SOURCE = 'redis'
@@ -30,25 +31,38 @@ module Gitlab
@recorded_at = recorded_at
end
+ def all_time_data
+ aggregated_metrics_data(start_date: nil, end_date: nil, time_frame: Gitlab::Utils::UsageData::ALL_TIME_TIME_FRAME_NAME)
+ end
+
def monthly_data
- aggregated_metrics_data(**monthly_time_range)
+ aggregated_metrics_data(**monthly_time_range.merge(time_frame: Gitlab::Utils::UsageData::TWENTY_EIGHT_DAYS_TIME_FRAME_NAME))
end
def weekly_data
- aggregated_metrics_data(**weekly_time_range)
+ aggregated_metrics_data(**weekly_time_range.merge(time_frame: Gitlab::Utils::UsageData::SEVEN_DAYS_TIME_FRAME_NAME))
end
private
attr_accessor :aggregated_metrics, :recorded_at
- def aggregated_metrics_data(start_date:, end_date:)
+ def aggregated_metrics_data(start_date:, end_date:, time_frame:)
aggregated_metrics.each_with_object({}) do |aggregation, data|
next if aggregation[:feature_flag] && Feature.disabled?(aggregation[:feature_flag], default_enabled: :yaml, type: :development)
+ next unless aggregation[:time_frame].include?(time_frame)
case aggregation[:source]
when REDIS_SOURCE
- data[aggregation[:name]] = calculate_count_for_aggregation(aggregation: aggregation, start_date: start_date, end_date: end_date)
+ if time_frame == Gitlab::Utils::UsageData::ALL_TIME_TIME_FRAME_NAME
+ data[aggregation[:name]] = Gitlab::Utils::UsageData::FALLBACK
+ Gitlab::ErrorTracking
+ .track_and_raise_for_dev_exception(
+ DisallowedAggregationTimeFrame.new("Aggregation time frame: 'all' is not allowed for aggregation with source: '#{REDIS_SOURCE}'")
+ )
+ else
+ data[aggregation[:name]] = calculate_count_for_aggregation(aggregation: aggregation, start_date: start_date, end_date: end_date)
+ end
when DATABASE_SOURCE
next unless Feature.enabled?('database_sourced_aggregated_metrics', default_enabled: false, type: :development)
@@ -155,3 +169,5 @@ module Gitlab
end
end
end
+
+Gitlab::Usage::Metrics::Aggregates::Aggregate.prepend_if_ee('EE::Gitlab::Usage::Metrics::Aggregates::Aggregate')
diff --git a/lib/gitlab/usage/metrics/aggregates/sources/postgres_hll.rb b/lib/gitlab/usage/metrics/aggregates/sources/postgres_hll.rb
index 33678d2b813..a01efbdb1a6 100644
--- a/lib/gitlab/usage/metrics/aggregates/sources/postgres_hll.rb
+++ b/lib/gitlab/usage/metrics/aggregates/sources/postgres_hll.rb
@@ -55,15 +55,15 @@ module Gitlab
end
def time_period_to_human_name(time_period)
- return Gitlab::Utils::UsageData::ALL_TIME_PERIOD_HUMAN_NAME if time_period.blank?
+ return Gitlab::Utils::UsageData::ALL_TIME_TIME_FRAME_NAME if time_period.blank?
start_date = time_period.first.to_date
end_date = time_period.last.to_date
if (end_date - start_date).to_i > 7
- Gitlab::Utils::UsageData::MONTHLY_PERIOD_HUMAN_NAME
+ Gitlab::Utils::UsageData::TWENTY_EIGHT_DAYS_TIME_FRAME_NAME
else
- Gitlab::Utils::UsageData::WEEKLY_PERIOD_HUMAN_NAME
+ Gitlab::Utils::UsageData::SEVEN_DAYS_TIME_FRAME_NAME
end
end
end
diff --git a/lib/gitlab/usage/metrics/names_suggestions/generator.rb b/lib/gitlab/usage/metrics/names_suggestions/generator.rb
new file mode 100644
index 00000000000..e560f6979b4
--- /dev/null
+++ b/lib/gitlab/usage/metrics/names_suggestions/generator.rb
@@ -0,0 +1,61 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Usage
+ module Metrics
+ module NamesSuggestions
+ class Generator < ::Gitlab::UsageData
+ FREE_TEXT_METRIC_NAME = "<please fill metric name>"
+
+ class << self
+ def generate(key_path)
+ uncached_data.deep_stringify_keys.dig(*key_path.split('.'))
+ end
+
+ private
+
+ def count(relation, column = nil, batch: true, batch_size: nil, start: nil, finish: nil)
+ "count_#{parse_target_and_source(column, relation)}"
+ end
+
+ def distinct_count(relation, column = nil, batch: true, batch_size: nil, start: nil, finish: nil)
+ "count_distinct_#{parse_target_and_source(column, relation)}"
+ end
+
+ def redis_usage_counter
+ FREE_TEXT_METRIC_NAME
+ end
+
+ def alt_usage_data(*)
+ FREE_TEXT_METRIC_NAME
+ end
+
+ def redis_usage_data_totals(counter)
+ counter.fallback_totals.transform_values { |_| FREE_TEXT_METRIC_NAME}
+ end
+
+ def sum(relation, column, *rest)
+ "sum_#{parse_target_and_source(column, relation)}"
+ end
+
+ def estimate_batch_distinct_count(relation, column = nil, *rest)
+ "estimate_distinct_#{parse_target_and_source(column, relation)}"
+ end
+
+ def add(*args)
+ "add_#{args.join('_and_')}"
+ end
+
+ def parse_target_and_source(column, relation)
+ if column
+ "#{column}_from_#{relation.table_name}"
+ else
+ relation.table_name
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/usage_data.rb b/lib/gitlab/usage_data.rb
index 8e096a9f351..0d9b76f3d34 100644
--- a/lib/gitlab/usage_data.rb
+++ b/lib/gitlab/usage_data.rb
@@ -60,6 +60,7 @@ module Gitlab
.merge(compliance_unique_visits_data)
.merge(search_unique_visits_data)
.merge(redis_hll_counters)
+ .deep_merge(aggregated_metrics_data)
end
end
@@ -192,7 +193,7 @@ module Gitlab
container_expiration_policies_usage,
service_desk_counts
).tap do |data|
- data[:snippets] = data[:personal_snippets] + data[:project_snippets]
+ data[:snippets] = add(data[:personal_snippets], data[:project_snippets])
end
}
end
@@ -224,10 +225,9 @@ module Gitlab
project_snippets: count(ProjectSnippet.where(last_28_days_time_period)),
projects_with_alerts_created: distinct_count(::AlertManagement::Alert.where(last_28_days_time_period), :project_id)
}.merge(
- snowplow_event_counts(last_28_days_time_period(column: :collector_tstamp)),
- aggregated_metrics_monthly
+ snowplow_event_counts(last_28_days_time_period(column: :collector_tstamp))
).tap do |data|
- data[:snippets] = data[:personal_snippets] + data[:project_snippets]
+ data[:snippets] = add(data[:personal_snippets], data[:project_snippets])
end
}
end
@@ -242,17 +242,15 @@ module Gitlab
def system_usage_data_settings
{
settings: {
- ldap_encrypted_secrets_enabled: alt_usage_data(fallback: nil) { Gitlab::Auth::Ldap::Config.encrypted_secrets.active? }
+ ldap_encrypted_secrets_enabled: alt_usage_data(fallback: nil) { Gitlab::Auth::Ldap::Config.encrypted_secrets.active? },
+ operating_system: alt_usage_data(fallback: nil) { operating_system }
}
}
end
def system_usage_data_weekly
{
- counts_weekly: {
- }.merge(
- aggregated_metrics_weekly
- )
+ counts_weekly: {}
}
end
@@ -505,6 +503,17 @@ module Gitlab
end
end
+ def operating_system
+ ohai_data = Ohai::System.new.tap do |oh|
+ oh.all_plugins(['platform'])
+ end.data
+
+ platform = ohai_data['platform']
+ platform = 'raspbian' if ohai_data['platform'] == 'debian' && /armv/.match?(ohai_data['kernel']['machine'])
+
+ "#{platform}-#{ohai_data['platform_version']}"
+ end
+
def last_28_days_time_period(column: :created_at)
{ column => 30.days.ago..2.days.ago }
end
@@ -701,15 +710,13 @@ module Gitlab
{ redis_hll_counters: ::Gitlab::UsageDataCounters::HLLRedisCounter.unique_events_data }
end
- def aggregated_metrics_monthly
- {
- aggregated_metrics: aggregated_metrics.monthly_data
- }
- end
-
- def aggregated_metrics_weekly
+ def aggregated_metrics_data
{
- aggregated_metrics: aggregated_metrics.weekly_data
+ counts_weekly: { aggregated_metrics: aggregated_metrics.weekly_data },
+ counts_monthly: { aggregated_metrics: aggregated_metrics.monthly_data },
+ counts: aggregated_metrics
+ .all_time_data
+ .to_h { |key, value| ["aggregate_#{key}".to_sym, value.round] }
}
end
@@ -821,11 +828,9 @@ module Gitlab
def total_alert_issues
# Remove prometheus table queries once they are deprecated
# To be removed with https://gitlab.com/gitlab-org/gitlab/-/issues/217407.
- [
- count(Issue.with_alert_management_alerts, start: issue_minimum_id, finish: issue_maximum_id),
+ add count(Issue.with_alert_management_alerts, start: issue_minimum_id, finish: issue_maximum_id),
count(::Issue.with_self_managed_prometheus_alert_events, start: issue_minimum_id, finish: issue_maximum_id),
count(::Issue.with_prometheus_alert_events, start: issue_minimum_id, finish: issue_maximum_id)
- ].reduce(:+)
end
def user_minimum_id
@@ -952,7 +957,7 @@ module Gitlab
csv_issue_imports = distinct_count(Issues::CsvImport.where(time_period), :user_id)
group_imports = distinct_count(::GroupImportState.where(time_period), :user_id)
- project_imports + bulk_imports + jira_issue_imports + csv_issue_imports + group_imports
+ add(project_imports, bulk_imports, jira_issue_imports, csv_issue_imports, group_imports)
end
# rubocop:enable CodeReuse/ActiveRecord
diff --git a/lib/gitlab/usage_data_counters/aggregated_metrics/code_review.yml b/lib/gitlab/usage_data_counters/aggregated_metrics/code_review.yml
new file mode 100644
index 00000000000..4c2355d526a
--- /dev/null
+++ b/lib/gitlab/usage_data_counters/aggregated_metrics/code_review.yml
@@ -0,0 +1,108 @@
+# code_review_extension_category_monthly_active_users
+# This is only metrics related to the VS Code Extension for now.
+#
+# code_review_category_monthly_active_users
+# This is the user based metrics. These should only be user based metrics and only be related to the Code Review things inside of GitLab.
+#
+# code_review_group_monthly_active_users
+# This is an aggregation of both of the above aggregations. It's intended to represent all users who interact with our group across all of our categories.
+---
+- name: code_review_group_monthly_active_users
+ operator: OR
+ feature_flag: usage_data_code_review_aggregation
+ source: redis
+ time_frame: [7d, 28d]
+ events: [
+ 'i_code_review_user_single_file_diffs',
+ 'i_code_review_user_create_mr',
+ 'i_code_review_user_close_mr',
+ 'i_code_review_user_reopen_mr',
+ 'i_code_review_user_resolve_thread',
+ 'i_code_review_user_unresolve_thread',
+ 'i_code_review_edit_mr_title',
+ 'i_code_review_edit_mr_desc',
+ 'i_code_review_user_merge_mr',
+ 'i_code_review_user_create_mr_comment',
+ 'i_code_review_user_edit_mr_comment',
+ 'i_code_review_user_remove_mr_comment',
+ 'i_code_review_user_create_review_note',
+ 'i_code_review_user_publish_review',
+ 'i_code_review_user_create_multiline_mr_comment',
+ 'i_code_review_user_edit_multiline_mr_comment',
+ 'i_code_review_user_remove_multiline_mr_comment',
+ 'i_code_review_user_add_suggestion',
+ 'i_code_review_user_apply_suggestion',
+ 'i_code_review_user_assigned',
+ 'i_code_review_user_review_requested',
+ 'i_code_review_user_approve_mr',
+ 'i_code_review_user_unapprove_mr',
+ 'i_code_review_user_marked_as_draft',
+ 'i_code_review_user_unmarked_as_draft',
+ 'i_code_review_user_approval_rule_added',
+ 'i_code_review_user_approval_rule_deleted',
+ 'i_code_review_user_approval_rule_edited',
+ 'i_code_review_user_vs_code_api_request',
+ 'i_code_review_user_toggled_task_item_status',
+ 'i_code_review_user_create_mr_from_issue',
+ 'i_code_review_user_mr_discussion_locked',
+ 'i_code_review_user_mr_discussion_unlocked',
+ 'i_code_review_user_time_estimate_changed',
+ 'i_code_review_user_time_spent_changed',
+ 'i_code_review_user_assignees_changed',
+ 'i_code_review_user_reviewers_changed',
+ 'i_code_review_user_milestone_changed',
+ 'i_code_review_user_labels_changed'
+ ]
+- name: code_review_category_monthly_active_users
+ operator: OR
+ feature_flag: usage_data_code_review_aggregation
+ source: redis
+ time_frame: [7d, 28d]
+ events: [
+ 'i_code_review_user_single_file_diffs',
+ 'i_code_review_user_create_mr',
+ 'i_code_review_user_close_mr',
+ 'i_code_review_user_reopen_mr',
+ 'i_code_review_user_resolve_thread',
+ 'i_code_review_user_unresolve_thread',
+ 'i_code_review_edit_mr_title',
+ 'i_code_review_edit_mr_desc',
+ 'i_code_review_user_merge_mr',
+ 'i_code_review_user_create_mr_comment',
+ 'i_code_review_user_edit_mr_comment',
+ 'i_code_review_user_remove_mr_comment',
+ 'i_code_review_user_create_review_note',
+ 'i_code_review_user_publish_review',
+ 'i_code_review_user_create_multiline_mr_comment',
+ 'i_code_review_user_edit_multiline_mr_comment',
+ 'i_code_review_user_remove_multiline_mr_comment',
+ 'i_code_review_user_add_suggestion',
+ 'i_code_review_user_apply_suggestion',
+ 'i_code_review_user_assigned',
+ 'i_code_review_user_review_requested',
+ 'i_code_review_user_approve_mr',
+ 'i_code_review_user_unapprove_mr',
+ 'i_code_review_user_marked_as_draft',
+ 'i_code_review_user_unmarked_as_draft',
+ 'i_code_review_user_approval_rule_added',
+ 'i_code_review_user_approval_rule_deleted',
+ 'i_code_review_user_approval_rule_edited',
+ 'i_code_review_user_toggled_task_item_status',
+ 'i_code_review_user_create_mr_from_issue',
+ 'i_code_review_user_mr_discussion_locked',
+ 'i_code_review_user_mr_discussion_unlocked',
+ 'i_code_review_user_time_estimate_changed',
+ 'i_code_review_user_time_spent_changed',
+ 'i_code_review_user_assignees_changed',
+ 'i_code_review_user_reviewers_changed',
+ 'i_code_review_user_milestone_changed',
+ 'i_code_review_user_labels_changed'
+ ]
+- name: code_review_extension_category_monthly_active_users
+ operator: OR
+ feature_flag: usage_data_code_review_aggregation
+ source: redis
+ time_frame: [7d, 28d]
+ events: [
+ 'i_code_review_user_vs_code_api_request'
+ ]
diff --git a/lib/gitlab/usage_data_counters/aggregated_metrics/common.yml b/lib/gitlab/usage_data_counters/aggregated_metrics/common.yml
index 4d92202e7fd..73a55b5d5fa 100644
--- a/lib/gitlab/usage_data_counters/aggregated_metrics/common.yml
+++ b/lib/gitlab/usage_data_counters/aggregated_metrics/common.yml
@@ -1,3 +1,5 @@
+# Aggregated metrics that include EE only event names within `events:` attribute have to be defined at ee/lib/gitlab/usage_data_counters/aggregated_metrics/common.yml
+# instead of this file.
#- name: unique name of aggregated metric
# operator: aggregation operator. Valid values are:
# - "OR": counts unique elements that were observed triggering any of following events
@@ -7,6 +9,10 @@
# source: defines which datasource will be used to locate events that should be included in aggregated metric. Valid values are:
# - database
# - redis
+# time_frame: defines time frames for aggregated metrics:
+# - 7d - last 7 days
+# - 28d - last 28 days
+# - all - all historical available data, this time frame is not available for redis source
# feature_flag: name of development feature flag that will be checked before metrics aggregation is performed.
# Corresponding feature flag should have `default_enabled` attribute set to `false`.
# This attribute is OPTIONAL and can be omitted, when `feature_flag` is missing no feature flag will be checked.
@@ -14,18 +20,22 @@
- name: compliance_features_track_unique_visits_union
operator: OR
source: redis
+ time_frame: [7d, 28d]
events: ['g_compliance_audit_events', 'g_compliance_dashboard', 'i_compliance_audit_events', 'a_compliance_audit_events_api', 'i_compliance_credential_inventory']
- name: product_analytics_test_metrics_union
operator: OR
source: redis
+ time_frame: [7d, 28d]
events: ['i_search_total', 'i_search_advanced', 'i_search_paid']
- name: product_analytics_test_metrics_intersection
operator: AND
source: redis
+ time_frame: [7d, 28d]
events: ['i_search_total', 'i_search_advanced', 'i_search_paid']
- name: incident_management_alerts_total_unique_counts
operator: OR
source: redis
+ time_frame: [7d, 28d]
events: [
'incident_management_alert_status_changed',
'incident_management_alert_assigned',
@@ -35,6 +45,7 @@
- name: incident_management_incidents_total_unique_counts
operator: OR
source: redis
+ time_frame: [7d, 28d]
events: [
'incident_management_incident_created',
'incident_management_incident_reopened',
@@ -51,10 +62,11 @@
- name: i_testing_paid_monthly_active_user_total
operator: OR
source: redis
+ time_frame: [7d, 28d]
events: [
- 'i_testing_web_performance_widget_total',
- 'i_testing_full_code_quality_report_total',
- 'i_testing_group_code_coverage_visit_total',
- 'i_testing_load_performance_widget_total',
- 'i_testing_metrics_report_widget_total'
-]
+ 'i_testing_web_performance_widget_total',
+ 'i_testing_full_code_quality_report_total',
+ 'i_testing_group_code_coverage_visit_total',
+ 'i_testing_load_performance_widget_total',
+ 'i_testing_metrics_report_widget_total'
+ ]
diff --git a/lib/gitlab/usage_data_counters/counter_events/package_events.yml b/lib/gitlab/usage_data_counters/counter_events/package_events.yml
index f6bddabdd44..e1648245f3f 100644
--- a/lib/gitlab/usage_data_counters/counter_events/package_events.yml
+++ b/lib/gitlab/usage_data_counters/counter_events/package_events.yml
@@ -41,6 +41,9 @@
- i_package_pypi_delete_package
- i_package_pypi_pull_package
- i_package_pypi_push_package
+- i_package_rubygems_delete_package
+- i_package_rubygems_pull_package
+- i_package_rubygems_push_package
- i_package_tag_delete_package
- i_package_tag_pull_package
- i_package_tag_push_package
diff --git a/lib/gitlab/usage_data_counters/hll_redis_counter.rb b/lib/gitlab/usage_data_counters/hll_redis_counter.rb
index 68ae239debb..336bef081a6 100644
--- a/lib/gitlab/usage_data_counters/hll_redis_counter.rb
+++ b/lib/gitlab/usage_data_counters/hll_redis_counter.rb
@@ -127,11 +127,15 @@ module Gitlab
return unless Gitlab::CurrentSettings.usage_ping_enabled?
event = event_for(event_name)
- raise UnknownEvent, "Unknown event #{event_name}" unless event.present?
+ Gitlab::ErrorTracking.track_and_raise_for_dev_exception(UnknownEvent.new("Unknown event #{event_name}")) unless event.present?
return unless feature_enabled?(event)
Gitlab::Redis::HLL.add(key: redis_key(event, time, context), value: values, expiry: expiry(event))
+ rescue => e
+ # Ignore any exceptions unless is dev or test env
+ # The application flow should not be blocked by erros in tracking
+ Gitlab::ErrorTracking.track_and_raise_for_dev_exception(e)
end
# The array of valid context on which we allow tracking
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 d657c5487d7..18c5dc73de2 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
@@ -164,3 +164,43 @@
category: code_review
aggregation: weekly
feature_flag: usage_data_i_code_review_user_create_mr_from_issue
+- name: i_code_review_user_mr_discussion_locked
+ redis_slot: code_review
+ category: code_review
+ aggregation: weekly
+ feature_flag: usage_data_i_code_review_user_mr_discussion_locked
+- name: i_code_review_user_mr_discussion_unlocked
+ redis_slot: code_review
+ category: code_review
+ aggregation: weekly
+ feature_flag: usage_data_i_code_review_user_mr_discussion_unlocked
+- name: i_code_review_user_time_estimate_changed
+ redis_slot: code_review
+ category: code_review
+ aggregation: weekly
+ feature_flag: usage_data_i_code_review_user_time_estimate_changed
+- name: i_code_review_user_time_spent_changed
+ redis_slot: code_review
+ category: code_review
+ aggregation: weekly
+ feature_flag: usage_data_i_code_review_user_time_spent_changed
+- name: i_code_review_user_assignees_changed
+ redis_slot: code_review
+ category: code_review
+ aggregation: weekly
+ feature_flag: usage_data_i_code_review_user_assignees_changed
+- name: i_code_review_user_reviewers_changed
+ redis_slot: code_review
+ category: code_review
+ aggregation: weekly
+ feature_flag: usage_data_i_code_review_user_reviewers_changed
+- name: i_code_review_user_milestone_changed
+ redis_slot: code_review
+ category: code_review
+ aggregation: weekly
+ feature_flag: usage_data_i_code_review_user_milestone_changed
+- name: i_code_review_user_labels_changed
+ redis_slot: code_review
+ category: code_review
+ aggregation: weekly
+ feature_flag: usage_data_i_code_review_user_labels_changed
diff --git a/lib/gitlab/usage_data_counters/known_events/common.yml b/lib/gitlab/usage_data_counters/known_events/common.yml
index 79f319b2d58..80a79682338 100644
--- a/lib/gitlab/usage_data_counters/known_events/common.yml
+++ b/lib/gitlab/usage_data_counters/known_events/common.yml
@@ -439,3 +439,18 @@
redis_slot: pipeline_authoring
aggregation: weekly
feature_flag: usage_data_unique_users_committing_ciconfigfile
+- name: o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile
+ category: pipeline_authoring
+ redis_slot: pipeline_authoring
+ aggregation: weekly
+ feature_flag: usage_data_o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile
+# Epic events
+#
+# We are using the same slot of issue events 'project_management' for
+# epic events to allow data aggregation.
+# More information in: https://gitlab.com/gitlab-org/gitlab/-/issues/322405
+- name: g_project_management_epic_created
+ category: epics_usage
+ redis_slot: project_management
+ aggregation: daily
+ feature_flag: track_epics_activity
diff --git a/lib/gitlab/usage_data_counters/known_events/ecosystem.yml b/lib/gitlab/usage_data_counters/known_events/ecosystem.yml
index 3fd02164f74..1c765bb1830 100644
--- a/lib/gitlab/usage_data_counters/known_events/ecosystem.yml
+++ b/lib/gitlab/usage_data_counters/known_events/ecosystem.yml
@@ -20,3 +20,49 @@
redis_slot: ecosystem
aggregation: weekly
feature_flag: usage_data_track_ecosystem_jira_service
+- name: i_ecosystem_slack_service_issue_notification
+ category: ecosystem
+ redis_slot: ecosystem
+ aggregation: weekly
+ feature_flag: usage_data_track_ecosystem_slack_service
+- name: i_ecosystem_slack_service_push_notification
+ category: ecosystem
+ redis_slot: ecosystem
+ aggregation: weekly
+ feature_flag: usage_data_track_ecosystem_slack_service
+- name: i_ecosystem_slack_service_deployment_notification
+ category: ecosystem
+ redis_slot: ecosystem
+ aggregation: weekly
+ feature_flag: usage_data_track_ecosystem_slack_service
+- name: i_ecosystem_slack_service_wiki_page_notification
+ category: ecosystem
+ redis_slot: ecosystem
+ aggregation: weekly
+ feature_flag: usage_data_track_ecosystem_slack_service
+- name: i_ecosystem_slack_service_merge_request_notification
+ category: ecosystem
+ redis_slot: ecosystem
+ aggregation: weekly
+ feature_flag: usage_data_track_ecosystem_slack_service
+- name: i_ecosystem_slack_service_note_notification
+ category: ecosystem
+ redis_slot: ecosystem
+ aggregation: weekly
+ feature_flag: usage_data_track_ecosystem_slack_service
+- name: i_ecosystem_slack_service_tag_push_notification
+ category: ecosystem
+ redis_slot: ecosystem
+ aggregation: weekly
+ feature_flag: usage_data_track_ecosystem_slack_service
+- name: i_ecosystem_slack_service_confidential_note_notification
+ category: ecosystem
+ redis_slot: ecosystem
+ aggregation: weekly
+ feature_flag: usage_data_track_ecosystem_slack_service
+- name: i_ecosystem_slack_service_confidential_issue_notification
+ category: ecosystem
+ redis_slot: ecosystem
+ aggregation: weekly
+ feature_flag: usage_data_track_ecosystem_slack_service
+
diff --git a/lib/gitlab/usage_data_counters/known_events/package_events.yml b/lib/gitlab/usage_data_counters/known_events/package_events.yml
index 78a2a587b34..b7e583003c8 100644
--- a/lib/gitlab/usage_data_counters/known_events/package_events.yml
+++ b/lib/gitlab/usage_data_counters/known_events/package_events.yml
@@ -3,109 +3,95 @@
category: deploy_token_packages
aggregation: weekly
redis_slot: package
- feature_flag: collect_package_events_redis
- name: i_package_composer_user
category: user_packages
aggregation: weekly
redis_slot: package
- feature_flag: collect_package_events_redis
- name: i_package_conan_deploy_token
category: deploy_token_packages
aggregation: weekly
redis_slot: package
- feature_flag: collect_package_events_redis
- name: i_package_conan_user
category: user_packages
aggregation: weekly
redis_slot: package
- feature_flag: collect_package_events_redis
- name: i_package_container_deploy_token
category: deploy_token_packages
aggregation: weekly
redis_slot: package
- feature_flag: collect_package_events_redis
- name: i_package_container_user
category: user_packages
aggregation: weekly
redis_slot: package
- feature_flag: collect_package_events_redis
- name: i_package_debian_deploy_token
category: deploy_token_packages
aggregation: weekly
redis_slot: package
- feature_flag: collect_package_events_redis
- name: i_package_debian_user
category: user_packages
aggregation: weekly
redis_slot: package
- feature_flag: collect_package_events_redis
- name: i_package_generic_deploy_token
category: deploy_token_packages
aggregation: weekly
redis_slot: package
- feature_flag: collect_package_events_redis
- name: i_package_generic_user
category: user_packages
aggregation: weekly
redis_slot: package
- feature_flag: collect_package_events_redis
- name: i_package_golang_deploy_token
category: deploy_token_packages
aggregation: weekly
redis_slot: package
- feature_flag: collect_package_events_redis
- name: i_package_golang_user
category: user_packages
aggregation: weekly
redis_slot: package
- feature_flag: collect_package_events_redis
- name: i_package_maven_deploy_token
category: deploy_token_packages
aggregation: weekly
redis_slot: package
- feature_flag: collect_package_events_redis
- name: i_package_maven_user
category: user_packages
aggregation: weekly
redis_slot: package
- feature_flag: collect_package_events_redis
- name: i_package_npm_deploy_token
category: deploy_token_packages
aggregation: weekly
redis_slot: package
- feature_flag: collect_package_events_redis
- name: i_package_npm_user
category: user_packages
aggregation: weekly
redis_slot: package
- feature_flag: collect_package_events_redis
- name: i_package_nuget_deploy_token
category: deploy_token_packages
aggregation: weekly
redis_slot: package
- feature_flag: collect_package_events_redis
- name: i_package_nuget_user
category: user_packages
aggregation: weekly
redis_slot: package
- feature_flag: collect_package_events_redis
- name: i_package_pypi_deploy_token
category: deploy_token_packages
aggregation: weekly
redis_slot: package
- feature_flag: collect_package_events_redis
- name: i_package_pypi_user
category: user_packages
aggregation: weekly
redis_slot: package
- feature_flag: collect_package_events_redis
+- name: i_package_rubygems_deploy_token
+ category: deploy_token_packages
+ aggregation: weekly
+ redis_slot: package
+- name: i_package_rubygems_user
+ category: user_packages
+ aggregation: weekly
+ redis_slot: package
- name: i_package_tag_deploy_token
category: deploy_token_packages
aggregation: weekly
redis_slot: package
- feature_flag: collect_package_events_redis
- name: i_package_tag_user
category: user_packages
aggregation: weekly
redis_slot: package
- feature_flag: collect_package_events_redis
diff --git a/lib/gitlab/usage_data_counters/known_events/quickactions.yml b/lib/gitlab/usage_data_counters/known_events/quickactions.yml
index bf292047da0..0fe65afb237 100644
--- a/lib/gitlab/usage_data_counters/known_events/quickactions.yml
+++ b/lib/gitlab/usage_data_counters/known_events/quickactions.yml
@@ -324,3 +324,13 @@
redis_slot: quickactions
aggregation: weekly
feature_flag: usage_data_track_quickactions
+- name: i_quickactions_invite_email_single
+ category: quickactions
+ redis_slot: quickactions
+ aggregation: weekly
+ feature_flag: usage_data_track_quickactions
+- name: i_quickactions_invite_email_multiple
+ category: quickactions
+ redis_slot: quickactions
+ aggregation: weekly
+ feature_flag: usage_data_track_quickactions
diff --git a/lib/gitlab/usage_data_counters/merge_request_activity_unique_counter.rb b/lib/gitlab/usage_data_counters/merge_request_activity_unique_counter.rb
index b9856e1f74a..eb28a387a97 100644
--- a/lib/gitlab/usage_data_counters/merge_request_activity_unique_counter.rb
+++ b/lib/gitlab/usage_data_counters/merge_request_activity_unique_counter.rb
@@ -35,6 +35,15 @@ module Gitlab
MR_EDIT_MR_TITLE_ACTION = 'i_code_review_edit_mr_title'
MR_EDIT_MR_DESC_ACTION = 'i_code_review_edit_mr_desc'
MR_CREATE_FROM_ISSUE_ACTION = 'i_code_review_user_create_mr_from_issue'
+ MR_DISCUSSION_LOCKED_ACTION = 'i_code_review_user_mr_discussion_locked'
+ MR_DISCUSSION_UNLOCKED_ACTION = 'i_code_review_user_mr_discussion_unlocked'
+ MR_TIME_ESTIMATE_CHANGED_ACTION = 'i_code_review_user_time_estimate_changed'
+ MR_TIME_SPENT_CHANGED_ACTION = 'i_code_review_user_time_spent_changed'
+ MR_ASSIGNEES_CHANGED_ACTION = 'i_code_review_user_assignees_changed'
+ MR_REVIEWERS_CHANGED_ACTION = 'i_code_review_user_reviewers_changed'
+ MR_INCLUDING_CI_CONFIG_ACTION = 'o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile'
+ MR_MILESTONE_CHANGED_ACTION = 'i_code_review_user_milestone_changed'
+ MR_LABELS_CHANGED_ACTION = 'i_code_review_user_labels_changed'
class << self
def track_mr_diffs_action(merge_request:)
@@ -153,6 +162,45 @@ module Gitlab
track_unique_action_by_user(MR_CREATE_FROM_ISSUE_ACTION, user)
end
+ def track_discussion_locked_action(user:)
+ track_unique_action_by_user(MR_DISCUSSION_LOCKED_ACTION, user)
+ end
+
+ def track_discussion_unlocked_action(user:)
+ track_unique_action_by_user(MR_DISCUSSION_UNLOCKED_ACTION, user)
+ end
+
+ def track_time_estimate_changed_action(user:)
+ track_unique_action_by_user(MR_TIME_ESTIMATE_CHANGED_ACTION, user)
+ end
+
+ def track_time_spent_changed_action(user:)
+ track_unique_action_by_user(MR_TIME_SPENT_CHANGED_ACTION, user)
+ end
+
+ def track_assignees_changed_action(user:)
+ track_unique_action_by_user(MR_ASSIGNEES_CHANGED_ACTION, user)
+ end
+
+ def track_reviewers_changed_action(user:)
+ track_unique_action_by_user(MR_REVIEWERS_CHANGED_ACTION, user)
+ end
+
+ def track_mr_including_ci_config(user:, merge_request:)
+ return unless Feature.enabled?(:usage_data_o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile, user, default_enabled: :yaml)
+ return unless merge_request.includes_ci_config?
+
+ track_unique_action_by_user(MR_INCLUDING_CI_CONFIG_ACTION, user)
+ end
+
+ def track_milestone_changed_action(user:)
+ track_unique_action_by_user(MR_MILESTONE_CHANGED_ACTION, user)
+ end
+
+ def track_labels_changed_action(user:)
+ track_unique_action_by_user(MR_LABELS_CHANGED_ACTION, user)
+ end
+
private
def track_unique_action_by_merge_request(action, merge_request)
diff --git a/lib/gitlab/usage_data_counters/quick_action_activity_unique_counter.rb b/lib/gitlab/usage_data_counters/quick_action_activity_unique_counter.rb
index f757b51f73c..15c68fb3945 100644
--- a/lib/gitlab/usage_data_counters/quick_action_activity_unique_counter.rb
+++ b/lib/gitlab/usage_data_counters/quick_action_activity_unique_counter.rb
@@ -34,6 +34,8 @@ module Gitlab
event_name_for_unassign(args)
when 'unlabel', 'remove_label'
event_name_for_unlabel(args)
+ when 'invite_email'
+ 'invite_email' + event_name_quantifier(args.split)
else
name
end
@@ -44,10 +46,8 @@ module Gitlab
if args.count == 1 && args.first == 'me'
'assign_self'
- elsif args.count == 1
- 'assign_single'
else
- 'assign_multiple'
+ 'assign' + event_name_quantifier(args)
end
end
@@ -82,6 +82,14 @@ module Gitlab
'unlabel_all'
end
end
+
+ def event_name_quantifier(args)
+ if args.count == 1
+ '_single'
+ else
+ '_multiple'
+ end
+ end
end
end
end
diff --git a/lib/gitlab/usage_data_queries.rb b/lib/gitlab/usage_data_queries.rb
index b275bdbacde..c00e7a2aa13 100644
--- a/lib/gitlab/usage_data_queries.rb
+++ b/lib/gitlab/usage_data_queries.rb
@@ -32,6 +32,10 @@ module Gitlab
raw_sql(relation, column, :distinct)
end
+ def add(*args)
+ 'SELECT ' + args.map {|arg| "(#{arg})" }.join(' + ')
+ end
+
private
def raw_sql(relation, column, distinct = nil)
diff --git a/lib/gitlab/utils/usage_data.rb b/lib/gitlab/utils/usage_data.rb
index 28dc66e19f8..cb652868d58 100644
--- a/lib/gitlab/utils/usage_data.rb
+++ b/lib/gitlab/utils/usage_data.rb
@@ -24,7 +24,8 @@
# alt_usage_data(fallback: nil) { Gitlab.config.registry.enabled }
#
# * redis_usage_data method
-# handles ::Redis::CommandError, Gitlab::UsageDataCounters::BaseCounter::UnknownEvent
+# handles ::Redis::CommandError, Gitlab::UsageDataCounters::BaseCounter::UnknownEvent,
+# Gitlab::UsageDataCounters::HLLRedisCounter::EventError
# returns -1 when a block is sent or hash with all values -1 when a counter is sent
# different behaviour due to 2 different implementations of redis counter
#
@@ -39,9 +40,9 @@ module Gitlab
FALLBACK = -1
DISTRIBUTED_HLL_FALLBACK = -2
- ALL_TIME_PERIOD_HUMAN_NAME = "all_time"
- WEEKLY_PERIOD_HUMAN_NAME = "weekly"
- MONTHLY_PERIOD_HUMAN_NAME = "monthly"
+ ALL_TIME_TIME_FRAME_NAME = "all"
+ SEVEN_DAYS_TIME_FRAME_NAME = "7d"
+ TWENTY_EIGHT_DAYS_TIME_FRAME_NAME = "28d"
def count(relation, column = nil, batch: true, batch_size: nil, start: nil, finish: nil)
if batch
@@ -86,6 +87,14 @@ module Gitlab
FALLBACK
end
+ def add(*args)
+ return -1 if args.any?(&:negative?)
+
+ args.sum
+ rescue StandardError
+ FALLBACK
+ end
+
def alt_usage_data(value = nil, fallback: FALLBACK, &block)
if block_given?
yield
@@ -126,8 +135,6 @@ module Gitlab
# @param event_name [String] the event name
# @param values [Array|String] the values counted
def track_usage_event(event_name, values)
- return unless Feature.enabled?(:"usage_data_#{event_name}", default_enabled: true)
-
Gitlab::UsageDataCounters::HLLRedisCounter.track_event(event_name.to_s, values: values)
end
@@ -160,7 +167,7 @@ module Gitlab
def redis_usage_counter
yield
- rescue ::Redis::CommandError, Gitlab::UsageDataCounters::BaseCounter::UnknownEvent
+ rescue ::Redis::CommandError, Gitlab::UsageDataCounters::BaseCounter::UnknownEvent, Gitlab::UsageDataCounters::HLLRedisCounter::EventError
FALLBACK
end
diff --git a/lib/gitlab/visibility_level.rb b/lib/gitlab/visibility_level.rb
index 76cf769d041..abfb7e2310e 100644
--- a/lib/gitlab/visibility_level.rb
+++ b/lib/gitlab/visibility_level.rb
@@ -44,9 +44,9 @@ module Gitlab
def options
{
- N_('VisibilityLevel|Private') => PRIVATE,
- N_('VisibilityLevel|Internal') => INTERNAL,
- N_('VisibilityLevel|Public') => PUBLIC
+ s_('VisibilityLevel|Private') => PRIVATE,
+ s_('VisibilityLevel|Internal') => INTERNAL,
+ s_('VisibilityLevel|Public') => PUBLIC
}
end
@@ -104,12 +104,7 @@ module Gitlab
end
def level_name(level)
- level_name = N_('VisibilityLevel|Unknown')
- options.each do |name, lvl|
- level_name = name if lvl == level.to_i
- end
-
- s_(level_name)
+ options.key(level.to_i) || s_('VisibilityLevel|Unknown')
end
def level_value(level)
diff --git a/lib/gitlab/word_diff/chunk_collection.rb b/lib/gitlab/word_diff/chunk_collection.rb
new file mode 100644
index 00000000000..dd388f75302
--- /dev/null
+++ b/lib/gitlab/word_diff/chunk_collection.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module WordDiff
+ class ChunkCollection
+ def initialize
+ @chunks = []
+ end
+
+ def add(chunk)
+ @chunks << chunk
+ end
+
+ def content
+ @chunks.join('')
+ end
+
+ def reset
+ @chunks = []
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/word_diff/line_processor.rb b/lib/gitlab/word_diff/line_processor.rb
new file mode 100644
index 00000000000..49263962dd6
--- /dev/null
+++ b/lib/gitlab/word_diff/line_processor.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+# Converts a line from `git diff --word-diff=porcelain` output into a segment
+#
+# Possible options:
+# 1. Diff hunk
+# 2. Chunk
+# 3. Newline
+module Gitlab
+ module WordDiff
+ class LineProcessor
+ def initialize(line)
+ @line = line
+ end
+
+ def extract
+ return if empty_line?
+ return Segments::DiffHunk.new(full_line) if diff_hunk?
+ return Segments::Newline.new if newline_delimiter?
+
+ Segments::Chunk.new(full_line)
+ end
+
+ private
+
+ attr_reader :line
+
+ def diff_hunk?
+ line =~ /^@@ -/
+ end
+
+ def empty_line?
+ full_line == ' '
+ end
+
+ def newline_delimiter?
+ full_line == '~'
+ end
+
+ def full_line
+ @full_line ||= line.delete("\n")
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/word_diff/parser.rb b/lib/gitlab/word_diff/parser.rb
new file mode 100644
index 00000000000..3b6d4d4d384
--- /dev/null
+++ b/lib/gitlab/word_diff/parser.rb
@@ -0,0 +1,57 @@
+# frozen_string_literal: true
+
+# Converts git diff --word-diff=porcelain output to Gitlab::Diff::Line objects
+# see: https://git-scm.com/docs/git-diff#Documentation/git-diff.txt-porcelain
+module Gitlab
+ module WordDiff
+ class Parser
+ include Enumerable
+
+ def parse(lines, diff_file: nil)
+ return [] if lines.blank?
+
+ # By returning an Enumerator we make it possible to search for a single line (with #find)
+ # without having to instantiate all the others that come after it.
+ Enumerator.new do |yielder|
+ @chunks = ChunkCollection.new
+ @counter = PositionsCounter.new
+
+ lines.each do |line|
+ segment = LineProcessor.new(line).extract
+
+ case segment
+ when Segments::DiffHunk
+ next if segment.first_line?
+
+ counter.set_pos_num(old: segment.pos_old, new: segment.pos_new)
+
+ yielder << build_line(segment.to_s, 'match', parent_file: diff_file)
+
+ when Segments::Chunk
+ @chunks.add(segment)
+
+ when Segments::Newline
+ yielder << build_line(@chunks.content, nil, parent_file: diff_file)
+
+ @chunks.reset
+ counter.increase_pos_num
+ end
+ end
+ end
+ end
+
+ private
+
+ attr_reader :counter
+
+ def build_line(content, type, options = {})
+ Gitlab::Diff::Line.new(
+ content, type,
+ counter.line_obj_index, counter.pos_old, counter.pos_new,
+ **options).tap do
+ counter.increase_obj_index
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/word_diff/positions_counter.rb b/lib/gitlab/word_diff/positions_counter.rb
new file mode 100644
index 00000000000..ca66b43755f
--- /dev/null
+++ b/lib/gitlab/word_diff/positions_counter.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+# Responsible for keeping track of line numbers and created Gitlab::Diff::Line objects
+module Gitlab
+ module WordDiff
+ class PositionsCounter
+ def initialize
+ @pos_old = 1
+ @pos_new = 1
+ @line_obj_index = 0
+ end
+
+ attr_reader :pos_old, :pos_new, :line_obj_index
+
+ def increase_pos_num
+ @pos_old += 1
+ @pos_new += 1
+ end
+
+ def increase_obj_index
+ @line_obj_index += 1
+ end
+
+ def set_pos_num(old:, new:)
+ @pos_old = old
+ @pos_new = new
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/word_diff/segments/chunk.rb b/lib/gitlab/word_diff/segments/chunk.rb
new file mode 100644
index 00000000000..7c5850666f9
--- /dev/null
+++ b/lib/gitlab/word_diff/segments/chunk.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+# Chunk is a part of the line that starts with ` `, `-`, `+`
+# Consecutive chunks build a line. Line that starts with `~` is an identifier of
+# end of the line.
+module Gitlab
+ module WordDiff
+ module Segments
+ class Chunk
+ def initialize(line)
+ @line = line
+ end
+
+ def removed?
+ line[0] == '-'
+ end
+
+ def added?
+ line[0] == '+'
+ end
+
+ def to_s
+ line[1..] || ''
+ end
+
+ def length
+ to_s.length
+ end
+
+ private
+
+ attr_reader :line
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/word_diff/segments/diff_hunk.rb b/lib/gitlab/word_diff/segments/diff_hunk.rb
new file mode 100644
index 00000000000..88b6817676f
--- /dev/null
+++ b/lib/gitlab/word_diff/segments/diff_hunk.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+# Diff hunk is line that starts with @@
+# It contains information about start line numbers
+#
+# Example:
+# @@ -1,4 +1,5 @@
+#
+# See more: https://www.gnu.org/software/diffutils/manual/html_node/Detailed-Unified.html
+module Gitlab
+ module WordDiff
+ module Segments
+ class DiffHunk
+ def initialize(line)
+ @line = line
+ end
+
+ def pos_old
+ line.match(/\-[0-9]*/)[0].to_i.abs rescue 0
+ end
+
+ def pos_new
+ line.match(/\+[0-9]*/)[0].to_i.abs rescue 0
+ end
+
+ def first_line?
+ pos_old <= 1 && pos_new <= 1
+ end
+
+ def to_s
+ line
+ end
+
+ private
+
+ attr_reader :line
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/word_diff/segments/newline.rb b/lib/gitlab/word_diff/segments/newline.rb
new file mode 100644
index 00000000000..de8bbf252ff
--- /dev/null
+++ b/lib/gitlab/word_diff/segments/newline.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module WordDiff
+ module Segments
+ class Newline
+ def to_s
+ ''
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/x509/signature.rb b/lib/gitlab/x509/signature.rb
index 7d4d4d9d13a..edff1540cb3 100644
--- a/lib/gitlab/x509/signature.rb
+++ b/lib/gitlab/x509/signature.rb
@@ -52,6 +52,12 @@ module Gitlab
strong_memoize(:cert_store) do
store = OpenSSL::X509::Store.new
store.set_default_paths
+
+ if Feature.enabled?(:x509_forced_cert_loading, type: :ops)
+ # Forcibly load the default cert file because the OpenSSL library seemingly ignores it
+ store.add_file(OpenSSL::X509::DEFAULT_CERT_FILE) if File.exist?(OpenSSL::X509::DEFAULT_CERT_FILE)
+ end
+
# valid_signing_time? checks the time attributes already
# this flag is required, otherwise expired certificates would become
# unverified when notAfter within certificate attribute is reached
diff --git a/lib/pager_duty/webhook_payload_parser.rb b/lib/pager_duty/webhook_payload_parser.rb
index 11071926cf2..c17e3df1a72 100644
--- a/lib/pager_duty/webhook_payload_parser.rb
+++ b/lib/pager_duty/webhook_payload_parser.rb
@@ -2,7 +2,7 @@
module PagerDuty
class WebhookPayloadParser
- SCHEMA_PATH = File.join('lib', 'pager_duty', 'validator', 'schemas', 'message.json')
+ SCHEMA_PATH = Rails.root.join('lib', 'pager_duty', 'validator', 'schemas', 'message.json')
def initialize(payload)
@payload = payload
@@ -66,7 +66,7 @@ module PagerDuty
end
def valid_message?(message)
- ::JSONSchemer.schema(Pathname.new(SCHEMA_PATH)).valid?(message)
+ ::JSONSchemer.schema(SCHEMA_PATH).valid?(message)
end
end
end
diff --git a/lib/peek/views/active_record.rb b/lib/peek/views/active_record.rb
index 77108bb81ca..523e673e9e1 100644
--- a/lib/peek/views/active_record.rb
+++ b/lib/peek/views/active_record.rb
@@ -39,16 +39,20 @@ module Peek
super
subscribe('sql.active_record') do |_, start, finish, _, data|
- if Gitlab::PerformanceBar.enabled_for_request?
- detail_store << {
- duration: finish - start,
- sql: data[:sql].strip,
- backtrace: Gitlab::BacktraceCleaner.clean_backtrace(caller),
- cached: data[:cached] ? 'cached' : ''
- }
- end
+ detail_store << generate_detail(start, finish, data) if Gitlab::PerformanceBar.enabled_for_request?
end
end
+
+ def generate_detail(start, finish, data)
+ {
+ duration: finish - start,
+ sql: data[:sql].strip,
+ backtrace: Gitlab::BacktraceCleaner.clean_backtrace(caller),
+ cached: data[:cached] ? 'cached' : ''
+ }
+ end
end
end
end
+
+Peek::Views::ActiveRecord.prepend_if_ee('EE::Peek::Views::ActiveRecord')
diff --git a/lib/quality/test_level.rb b/lib/quality/test_level.rb
index 45cfa9b373d..ad9de067375 100644
--- a/lib/quality/test_level.rb
+++ b/lib/quality/test_level.rb
@@ -43,6 +43,7 @@ module Quality
serializers
services
sidekiq
+ spam
support_specs
tasks
uploaders
diff --git a/lib/release_highlights/validator/entry.rb b/lib/release_highlights/validator/entry.rb
index 3c83ca21123..133afcb52ae 100644
--- a/lib/release_highlights/validator/entry.rb
+++ b/lib/release_highlights/validator/entry.rb
@@ -11,7 +11,7 @@ module ReleaseHighlights
validates :title, :body, :stage, presence: true
validates :'self-managed', :'gitlab-com', inclusion: { in: [true, false], message: "must be a boolean" }
- validates :url, :image_url, format: { with: URI::DEFAULT_PARSER.make_regexp, message: 'must be a URL' }
+ validates :url, :image_url, public_url: { dns_rebind_protection: true }
validates :release, numericality: true
validate :validate_published_at
validate :validate_packages
diff --git a/lib/rspec_flaky/config.rb b/lib/rspec_flaky/config.rb
deleted file mode 100644
index 55c1d4747b4..00000000000
--- a/lib/rspec_flaky/config.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-module RspecFlaky
- class Config
- def self.generate_report?
- !!(ENV['FLAKY_RSPEC_GENERATE_REPORT'] =~ /1|true/)
- end
-
- def self.suite_flaky_examples_report_path
- ENV['SUITE_FLAKY_RSPEC_REPORT_PATH'] || Rails.root.join("rspec_flaky/suite-report.json")
- end
-
- def self.flaky_examples_report_path
- ENV['FLAKY_RSPEC_REPORT_PATH'] || Rails.root.join("rspec_flaky/report.json")
- end
-
- def self.new_flaky_examples_report_path
- ENV['NEW_FLAKY_RSPEC_REPORT_PATH'] || Rails.root.join("rspec_flaky/new-report.json")
- end
- end
-end
diff --git a/lib/rspec_flaky/example.rb b/lib/rspec_flaky/example.rb
deleted file mode 100644
index 3c1b05257a0..00000000000
--- a/lib/rspec_flaky/example.rb
+++ /dev/null
@@ -1,48 +0,0 @@
-# frozen_string_literal: true
-
-module RspecFlaky
- # This is a wrapper class for RSpec::Core::Example
- class Example
- delegate :status, :exception, to: :execution_result
-
- def initialize(rspec_example)
- @rspec_example = rspec_example.try(:example) || rspec_example
- end
-
- def uid
- @uid ||= Digest::MD5.hexdigest("#{description}-#{file}")
- end
-
- def example_id
- rspec_example.id
- end
-
- def file
- metadata[:file_path]
- end
-
- def line
- metadata[:line_number]
- end
-
- def description
- metadata[:full_description]
- end
-
- def attempts
- rspec_example.try(:attempts) || 1
- end
-
- private
-
- attr_reader :rspec_example
-
- def metadata
- rspec_example.metadata
- end
-
- def execution_result
- rspec_example.execution_result
- end
- end
-end
diff --git a/lib/rspec_flaky/flaky_example.rb b/lib/rspec_flaky/flaky_example.rb
deleted file mode 100644
index da5dbf06bc9..00000000000
--- a/lib/rspec_flaky/flaky_example.rb
+++ /dev/null
@@ -1,38 +0,0 @@
-# frozen_string_literal: true
-
-module RspecFlaky
- # This represents a flaky RSpec example and is mainly meant to be saved in a JSON file
- class FlakyExample < OpenStruct
- def initialize(example)
- if example.respond_to?(:example_id)
- super(
- example_id: example.example_id,
- file: example.file,
- line: example.line,
- description: example.description,
- last_attempts_count: example.attempts,
- flaky_reports: 0)
- else
- super
- end
- end
-
- def update_flakiness!(last_attempts_count: nil)
- self.first_flaky_at ||= Time.now
- self.last_flaky_at = Time.now
- self.flaky_reports += 1
- self.last_attempts_count = last_attempts_count if last_attempts_count
-
- if ENV['CI_PROJECT_URL'] && ENV['CI_JOB_ID']
- self.last_flaky_job = "#{ENV['CI_PROJECT_URL']}/-/jobs/#{ENV['CI_JOB_ID']}"
- end
- end
-
- def to_h
- super.merge(
- first_flaky_at: first_flaky_at,
- last_flaky_at: last_flaky_at,
- last_flaky_job: last_flaky_job)
- end
- end
-end
diff --git a/lib/rspec_flaky/listener.rb b/lib/rspec_flaky/listener.rb
deleted file mode 100644
index 37e4e16e87e..00000000000
--- a/lib/rspec_flaky/listener.rb
+++ /dev/null
@@ -1,63 +0,0 @@
-# frozen_string_literal: true
-
-require 'json'
-
-require_dependency 'rspec_flaky/config'
-require_dependency 'rspec_flaky/example'
-require_dependency 'rspec_flaky/flaky_example'
-require_dependency 'rspec_flaky/flaky_examples_collection'
-require_dependency 'rspec_flaky/report'
-
-module RspecFlaky
- class Listener
- # - suite_flaky_examples: contains all the currently tracked flacky example
- # for the whole RSpec suite
- # - flaky_examples: contains the examples detected as flaky during the
- # current RSpec run
- attr_reader :suite_flaky_examples, :flaky_examples
-
- def initialize(suite_flaky_examples_json = nil)
- @flaky_examples = RspecFlaky::FlakyExamplesCollection.new
- @suite_flaky_examples = init_suite_flaky_examples(suite_flaky_examples_json)
- end
-
- def example_passed(notification)
- current_example = RspecFlaky::Example.new(notification.example)
-
- return unless current_example.attempts > 1
-
- flaky_example = suite_flaky_examples.fetch(current_example.uid) { RspecFlaky::FlakyExample.new(current_example) }
- flaky_example.update_flakiness!(last_attempts_count: current_example.attempts)
-
- flaky_examples[current_example.uid] = flaky_example
- end
-
- # rubocop:disable Gitlab/RailsLogger
- def dump_summary(_)
- RspecFlaky::Report.new(flaky_examples).write(RspecFlaky::Config.flaky_examples_report_path)
- # write_report_file(flaky_examples, RspecFlaky::Config.flaky_examples_report_path)
-
- new_flaky_examples = flaky_examples - suite_flaky_examples
- if new_flaky_examples.any?
- Rails.logger.warn "\nNew flaky examples detected:\n"
- Rails.logger.warn Gitlab::Json.pretty_generate(new_flaky_examples.to_h)
-
- RspecFlaky::Report.new(new_flaky_examples).write(RspecFlaky::Config.new_flaky_examples_report_path)
- # write_report_file(new_flaky_examples, RspecFlaky::Config.new_flaky_examples_report_path)
- end
- end
- # rubocop:enable Gitlab/RailsLogger
-
- private
-
- def init_suite_flaky_examples(suite_flaky_examples_json = nil)
- if suite_flaky_examples_json
- RspecFlaky::Report.load_json(suite_flaky_examples_json).flaky_examples
- else
- return {} unless File.exist?(RspecFlaky::Config.suite_flaky_examples_report_path)
-
- RspecFlaky::Report.load(RspecFlaky::Config.suite_flaky_examples_report_path).flaky_examples
- end
- end
- end
-end
diff --git a/lib/rspec_flaky/report.rb b/lib/rspec_flaky/report.rb
deleted file mode 100644
index 73f30362cfe..00000000000
--- a/lib/rspec_flaky/report.rb
+++ /dev/null
@@ -1,56 +0,0 @@
-# frozen_string_literal: true
-
-require 'json'
-require 'time'
-
-require_dependency 'rspec_flaky/config'
-require_dependency 'rspec_flaky/flaky_examples_collection'
-
-module RspecFlaky
- # This class is responsible for loading/saving JSON reports, and pruning
- # outdated examples.
- class Report < SimpleDelegator
- OUTDATED_DAYS_THRESHOLD = 7
-
- attr_reader :flaky_examples
-
- def self.load(file_path)
- load_json(File.read(file_path))
- end
-
- def self.load_json(json)
- new(RspecFlaky::FlakyExamplesCollection.new(JSON.parse(json)))
- end
-
- def initialize(flaky_examples)
- unless flaky_examples.is_a?(RspecFlaky::FlakyExamplesCollection)
- raise ArgumentError, "`flaky_examples` must be a RspecFlaky::FlakyExamplesCollection, #{flaky_examples.class} given!"
- end
-
- @flaky_examples = flaky_examples
- super(flaky_examples)
- end
-
- def write(file_path)
- unless RspecFlaky::Config.generate_report?
- puts "! Generating reports is disabled. To enable it, please set the `FLAKY_RSPEC_GENERATE_REPORT=1` !" # rubocop:disable Rails/Output
- return
- end
-
- report_path_dir = File.dirname(file_path)
- FileUtils.mkdir_p(report_path_dir) unless Dir.exist?(report_path_dir)
-
- File.write(file_path, JSON.pretty_generate(flaky_examples.to_h))
- end
-
- def prune_outdated(days: OUTDATED_DAYS_THRESHOLD)
- outdated_date_threshold = Time.now - (3600 * 24 * days)
- updated_hash = flaky_examples.dup
- .delete_if do |uid, hash|
- hash[:last_flaky_at] && Time.parse(hash[:last_flaky_at]).to_i < outdated_date_threshold.to_i
- end
-
- self.class.new(RspecFlaky::FlakyExamplesCollection.new(updated_hash))
- end
- end
-end
diff --git a/lib/sentry/api_urls.rb b/lib/sentry/api_urls.rb
deleted file mode 100644
index 388d0531da1..00000000000
--- a/lib/sentry/api_urls.rb
+++ /dev/null
@@ -1,39 +0,0 @@
-# frozen_string_literal: true
-
-module Sentry
- class ApiUrls
- def initialize(url_base)
- @uri = URI(url_base).freeze
- end
-
- def issues_url
- with_path(File.join(@uri.path, '/issues/'))
- end
-
- def issue_url(issue_id)
- with_path("/api/0/issues/#{escape(issue_id)}/")
- end
-
- def projects_url
- with_path('/api/0/projects/')
- end
-
- def issue_latest_event_url(issue_id)
- with_path("/api/0/issues/#{escape(issue_id)}/events/latest/")
- end
-
- private
-
- def with_path(new_path)
- new_uri = @uri.dup
- # Sentry API returns 404 if there are extra slashes in the URL
- new_uri.path = new_path.squeeze('/')
-
- new_uri
- end
-
- def escape(param)
- CGI.escape(param.to_s)
- end
- end
-end
diff --git a/lib/sentry/client.rb b/lib/sentry/client.rb
deleted file mode 100644
index dbf54a65081..00000000000
--- a/lib/sentry/client.rb
+++ /dev/null
@@ -1,100 +0,0 @@
-# frozen_string_literal: true
-
-module Sentry
- class Client
- include Sentry::Client::Event
- include Sentry::Client::Projects
- include Sentry::Client::Issue
- include Sentry::Client::Repo
- include Sentry::Client::IssueLink
-
- Error = Class.new(StandardError)
- MissingKeysError = Class.new(StandardError)
-
- attr_accessor :url, :token
-
- def initialize(api_url, token)
- @url = api_url
- @token = token
- end
-
- private
-
- def api_urls
- @api_urls ||= Sentry::ApiUrls.new(@url)
- end
-
- def handle_mapping_exceptions(&block)
- yield
- rescue KeyError => e
- Gitlab::ErrorTracking.track_exception(e)
- raise MissingKeysError, "Sentry API response is missing keys. #{e.message}"
- end
-
- def request_params
- {
- headers: {
- 'Content-Type' => 'application/json',
- 'Authorization' => "Bearer #{@token}"
- },
- follow_redirects: false
- }
- end
-
- def http_get(url, params = {})
- http_request do
- Gitlab::HTTP.get(url, **request_params.merge(params))
- end
- end
-
- def http_put(url, params = {})
- http_request do
- Gitlab::HTTP.put(url, **request_params.merge(body: params.to_json))
- end
- end
-
- def http_post(url, params = {})
- http_request do
- Gitlab::HTTP.post(url, **request_params.merge(body: params.to_json))
- end
- end
-
- def http_request
- response = handle_request_exceptions do
- yield
- end
-
- handle_response(response)
- end
-
- def handle_request_exceptions
- yield
- rescue Gitlab::HTTP::Error => e
- Gitlab::ErrorTracking.track_exception(e)
- raise_error 'Error when connecting to Sentry'
- rescue Net::OpenTimeout
- raise_error 'Connection to Sentry timed out'
- rescue SocketError
- raise_error 'Received SocketError when trying to connect to Sentry'
- rescue OpenSSL::SSL::SSLError
- raise_error 'Sentry returned invalid SSL data'
- rescue Errno::ECONNREFUSED
- raise_error 'Connection refused'
- rescue => e
- Gitlab::ErrorTracking.track_exception(e)
- raise_error "Sentry request failed due to #{e.class}"
- end
-
- def handle_response(response)
- unless response.code.between?(200, 204)
- raise_error "Sentry response status code: #{response.code}"
- end
-
- { body: response.parsed_response, headers: response.headers }
- end
-
- def raise_error(message)
- raise Client::Error, message
- end
- end
-end
diff --git a/lib/sentry/client/event.rb b/lib/sentry/client/event.rb
deleted file mode 100644
index 01dfaa25969..00000000000
--- a/lib/sentry/client/event.rb
+++ /dev/null
@@ -1,36 +0,0 @@
-# frozen_string_literal: true
-
-module Sentry
- class Client
- module Event
- def issue_latest_event(issue_id:)
- latest_event = http_get(api_urls.issue_latest_event_url(issue_id))[:body]
-
- map_to_event(latest_event)
- end
-
- private
-
- def map_to_event(event)
- stack_trace = parse_stack_trace(event)
-
- Gitlab::ErrorTracking::ErrorEvent.new(
- issue_id: event.dig('groupID'),
- date_received: event.dig('dateReceived'),
- stack_trace_entries: stack_trace
- )
- end
-
- def parse_stack_trace(event)
- exception_entry = event.dig('entries')&.detect { |h| h['type'] == 'exception' }
- return [] unless exception_entry
-
- exception_values = exception_entry.dig('data', 'values')
- stack_trace_entry = exception_values&.detect { |h| h['stacktrace'].present? }
- return [] unless stack_trace_entry
-
- stack_trace_entry.dig('stacktrace', 'frames') || []
- end
- end
- end
-end
diff --git a/lib/sentry/client/issue.rb b/lib/sentry/client/issue.rb
deleted file mode 100644
index f714bda49fd..00000000000
--- a/lib/sentry/client/issue.rb
+++ /dev/null
@@ -1,184 +0,0 @@
-# frozen_string_literal: true
-
-module Sentry
- class Client
- module Issue
- BadRequestError = Class.new(StandardError)
- ResponseInvalidSizeError = Class.new(StandardError)
-
- SENTRY_API_SORT_VALUE_MAP = {
- # <accepted_by_client> => <accepted_by_sentry_api>
- 'frequency' => 'freq',
- 'first_seen' => 'new',
- 'last_seen' => nil
- }.freeze
-
- def list_issues(**keyword_args)
- response = get_issues(**keyword_args)
-
- issues = response[:issues]
- pagination = response[:pagination]
-
- validate_size(issues)
-
- handle_mapping_exceptions do
- {
- issues: map_to_errors(issues),
- pagination: pagination
- }
- end
- end
-
- def issue_details(issue_id:)
- issue = get_issue(issue_id: issue_id)
-
- map_to_detailed_error(issue)
- end
-
- def update_issue(issue_id:, params:)
- http_put(api_urls.issue_url(issue_id), params)[:body]
- end
-
- private
-
- def get_issues(**keyword_args)
- response = http_get(
- api_urls.issues_url,
- query: list_issue_sentry_query(**keyword_args)
- )
-
- {
- issues: response[:body],
- pagination: Sentry::PaginationParser.parse(response[:headers])
- }
- 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
-
- {
- query: "is:#{issue_status} #{search_term}".strip,
- limit: limit,
- sort: SENTRY_API_SORT_VALUE_MAP[sort],
- cursor: cursor
- }.compact
- end
-
- 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}."
- end
-
- def get_issue(issue_id:)
- http_get(api_urls.issue_url(issue_id))[:body]
- end
-
- def parse_gitlab_issue(issue)
- parse_issue_annotations(issue) || parse_plugin_issue(issue)
- end
-
- def parse_issue_annotations(issue)
- issue
- .fetch('annotations', [])
- .reject(&:blank?)
- .map { |annotation| Nokogiri.make(annotation) }
- .find { |html| html['href']&.starts_with?(Gitlab.config.gitlab.url) }
- .try(:[], 'href')
- end
-
- def parse_plugin_issue(issue)
- plugin_issues = issue.fetch('pluginIssues', nil)
- return unless plugin_issues
-
- gitlab_plugin = plugin_issues.detect { |item| item['id'] == 'gitlab' }
- return unless gitlab_plugin
-
- gitlab_plugin.dig('issue', 'url')
- end
-
- def issue_url(id)
- parse_sentry_url("#{url}/issues/#{id}")
- end
-
- def project_url
- parse_sentry_url(url)
- end
-
- def parse_sentry_url(api_url)
- url = ErrorTracking::ProjectErrorTrackingSetting.extract_sentry_external_url(api_url)
-
- uri = URI(url)
- uri.path.squeeze!('/')
- # Remove trailing slash
- uri = uri.to_s.gsub(/\/\z/, '')
-
- uri
- end
-
- def map_to_errors(issues)
- issues.map(&method(:map_to_error))
- end
-
- def map_to_error(issue)
- Gitlab::ErrorTracking::Error.new(
- id: issue.fetch('id'),
- first_seen: issue.fetch('firstSeen', nil),
- last_seen: issue.fetch('lastSeen', nil),
- title: issue.fetch('title', nil),
- type: issue.fetch('type', nil),
- user_count: issue.fetch('userCount', nil),
- count: issue.fetch('count', nil),
- message: issue.dig('metadata', 'value'),
- culprit: issue.fetch('culprit', nil),
- external_url: issue_url(issue.fetch('id')),
- short_id: issue.fetch('shortId', nil),
- status: issue.fetch('status', nil),
- frequency: issue.dig('stats', '24h'),
- project_id: issue.dig('project', 'id'),
- project_name: issue.dig('project', 'name'),
- project_slug: issue.dig('project', 'slug')
- )
- end
-
- def map_to_detailed_error(issue)
- Gitlab::ErrorTracking::DetailedError.new({
- id: issue.fetch('id'),
- first_seen: issue.fetch('firstSeen', nil),
- last_seen: issue.fetch('lastSeen', nil),
- tags: extract_tags(issue),
- title: issue.fetch('title', nil),
- type: issue.fetch('type', nil),
- user_count: issue.fetch('userCount', nil),
- count: issue.fetch('count', nil),
- message: issue.dig('metadata', 'value'),
- culprit: issue.fetch('culprit', nil),
- external_url: issue_url(issue.fetch('id')),
- external_base_url: project_url,
- short_id: issue.fetch('shortId', nil),
- status: issue.fetch('status', nil),
- frequency: issue.dig('stats', '24h'),
- gitlab_issue: parse_gitlab_issue(issue),
- project_id: issue.dig('project', 'id'),
- project_name: issue.dig('project', 'name'),
- project_slug: issue.dig('project', 'slug'),
- first_release_last_commit: issue.dig('firstRelease', 'lastCommit'),
- first_release_short_version: issue.dig('firstRelease', 'shortVersion'),
- first_release_version: issue.dig('firstRelease', 'version'),
- last_release_last_commit: issue.dig('lastRelease', 'lastCommit'),
- last_release_short_version: issue.dig('lastRelease', 'shortVersion'),
- last_release_version: issue.dig('lastRelease', 'version')
- })
- end
-
- def extract_tags(issue)
- {
- level: issue.fetch('level', nil),
- logger: issue.fetch('logger', nil)
- }
- end
- end
- end
-end
diff --git a/lib/sentry/client/issue_link.rb b/lib/sentry/client/issue_link.rb
deleted file mode 100644
index 91498c19f8b..00000000000
--- a/lib/sentry/client/issue_link.rb
+++ /dev/null
@@ -1,52 +0,0 @@
-# frozen_string_literal: true
-
-module Sentry
- class Client
- module IssueLink
- # Creates a link in Sentry corresponding to the provided
- # Sentry issue and GitLab issue
- # @param integration_id [Integer, nil] Representing a global
- # GitLab integration in Sentry. Nil for plugins.
- # @param sentry_issue_id [Integer] Id for an issue from Sentry
- # @param issue [Issue] Issue for which the link should be created
- def create_issue_link(integration_id, sentry_issue_id, issue)
- return create_plugin_link(sentry_issue_id, issue) unless integration_id
-
- create_global_integration_link(integration_id, sentry_issue_id, issue)
- end
-
- private
-
- def create_global_integration_link(integration_id, sentry_issue_id, issue)
- issue_link_url = global_integration_link_api_url(integration_id, sentry_issue_id)
-
- params = {
- project: issue.project.id,
- externalIssue: "#{issue.project.id}##{issue.iid}"
- }
-
- http_put(issue_link_url, params)
- end
-
- def global_integration_link_api_url(integration_id, sentry_issue_id)
- issue_link_url = URI(url)
- issue_link_url.path = "/api/0/groups/#{sentry_issue_id}/integrations/#{integration_id}/"
-
- issue_link_url
- end
-
- def create_plugin_link(sentry_issue_id, issue)
- issue_link_url = plugin_link_api_url(sentry_issue_id)
-
- http_post(issue_link_url, issue_id: issue.iid)
- end
-
- def plugin_link_api_url(sentry_issue_id)
- issue_link_url = URI(url)
- issue_link_url.path = "/api/0/issues/#{sentry_issue_id}/plugins/gitlab/link/"
-
- issue_link_url
- end
- end
- end
-end
diff --git a/lib/sentry/client/projects.rb b/lib/sentry/client/projects.rb
deleted file mode 100644
index e686d4ff715..00000000000
--- a/lib/sentry/client/projects.rb
+++ /dev/null
@@ -1,39 +0,0 @@
-# frozen_string_literal: true
-
-module Sentry
- class Client
- module Projects
- def projects
- projects = get_projects
-
- handle_mapping_exceptions do
- map_to_projects(projects)
- end
- end
-
- private
-
- def get_projects
- http_get(api_urls.projects_url)[:body]
- end
-
- def map_to_projects(projects)
- projects.map(&method(:map_to_project))
- end
-
- def map_to_project(project)
- organization = project.fetch('organization')
-
- Gitlab::ErrorTracking::Project.new(
- id: project.fetch('id', nil),
- name: project.fetch('name'),
- slug: project.fetch('slug'),
- status: project.dig('status'),
- organization_name: organization.fetch('name'),
- organization_id: organization.fetch('id', nil),
- organization_slug: organization.fetch('slug')
- )
- end
- end
- end
-end
diff --git a/lib/sentry/client/repo.rb b/lib/sentry/client/repo.rb
deleted file mode 100644
index 9a0ed3c7342..00000000000
--- a/lib/sentry/client/repo.rb
+++ /dev/null
@@ -1,38 +0,0 @@
-# frozen_string_literal: true
-
-module Sentry
- class Client
- module Repo
- def repos(organization_slug)
- repos_url = repos_api_url(organization_slug)
-
- repos = http_get(repos_url)[:body]
-
- handle_mapping_exceptions do
- map_to_repos(repos)
- end
- end
-
- private
-
- def repos_api_url(organization_slug)
- repos_url = URI(url)
- repos_url.path = "/api/0/organizations/#{organization_slug}/repos/"
-
- repos_url
- end
-
- def map_to_repos(repos)
- repos.map(&method(:map_to_repo))
- end
-
- def map_to_repo(repo)
- Gitlab::ErrorTracking::Repo.new(
- status: repo.fetch('status'),
- integration_id: repo.fetch('integrationId'),
- project_id: repo.fetch('externalSlug')
- )
- end
- end
- end
-end
diff --git a/lib/sentry/pagination_parser.rb b/lib/sentry/pagination_parser.rb
deleted file mode 100644
index fa9c1dd8694..00000000000
--- a/lib/sentry/pagination_parser.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-module Sentry
- module PaginationParser
- PATTERN = /rel=\"(?<direction>\w+)\";\sresults=\"(?<results>\w+)\";\scursor=\"(?<cursor>.+)\"/.freeze
-
- def self.parse(headers)
- links = headers['link'].to_s.split(',')
-
- links.map { |link| parse_link(link) }.compact.to_h
- end
-
- def self.parse_link(link)
- match = link.match(PATTERN)
-
- return unless match
- return if match['results'] != "true"
-
- [match['direction'], { 'cursor' => match['cursor'] }]
- end
- private_class_method :parse_link
- end
-end
diff --git a/lib/spam/concerns/has_spam_action_response_fields.rb b/lib/spam/concerns/has_spam_action_response_fields.rb
new file mode 100644
index 00000000000..d49f5cd6454
--- /dev/null
+++ b/lib/spam/concerns/has_spam_action_response_fields.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+module Spam
+ module Concerns
+ # This concern is shared by the controller and GraphQL layer to handle
+ # addition of spam/CAPTCHA related fields in the response.
+ module HasSpamActionResponseFields
+ extend ActiveSupport::Concern
+
+ # spam_action_response_fields(spammable) -> hash
+ #
+ # Takes a Spammable as an argument and returns response fields necessary to display a CAPTCHA on
+ # the client.
+ def spam_action_response_fields(spammable)
+ {
+ spam: spammable.spam?,
+ # NOTE: These fields are intentionally named with 'captcha' instead of 'recaptcha', so
+ # that they can be applied to future alternative CAPTCHA implementations other than
+ # reCAPTCHA (such as FriendlyCaptcha) without having to change the response field name
+ # in the API.
+ needs_captcha_response: spammable.render_recaptcha?,
+ spam_log_id: spammable.spam_log&.id,
+ captcha_site_key: Gitlab::CurrentSettings.recaptcha_site_key
+ }
+ end
+
+ # with_spam_action_response_fields(spammable) { {other_fields: true} } -> hash
+ #
+ # Takes a Spammable and a block as arguments.
+ #
+ # The block passed should be a hash, which the spam_action_fields will be merged into.
+ def with_spam_action_response_fields(spammable)
+ yield.merge(spam_action_response_fields(spammable))
+ end
+ end
+ end
+end
diff --git a/lib/system_check/sidekiq_check.rb b/lib/system_check/sidekiq_check.rb
index 4f1533a5b7d..7ac1bd58ede 100644
--- a/lib/system_check/sidekiq_check.rb
+++ b/lib/system_check/sidekiq_check.rb
@@ -15,7 +15,7 @@ module SystemCheck
def check_sidekiq_running
$stdout.print "Running? ... "
- if sidekiq_process_count > 0
+ if sidekiq_worker_process_count > 0
$stdout.puts "yes".color(:green)
else
$stdout.puts "no".color(:red)
@@ -31,15 +31,16 @@ module SystemCheck
end
def only_one_sidekiq_running
- process_count = sidekiq_process_count
- return if process_count == 0
+ worker_count = sidekiq_worker_process_count
+ cluster_count = sidekiq_cluster_process_count
+ return if worker_count == 0
- $stdout.print 'Number of Sidekiq processes ... '
+ $stdout.print 'Number of Sidekiq processes (cluster/worker) ... '
- if process_count == 1
- $stdout.puts '1'.color(:green)
+ if (cluster_count == 1 && worker_count > 0) || (cluster_count == 0 && worker_count == 1)
+ $stdout.puts "#{cluster_count}/#{worker_count}".color(:green)
else
- $stdout.puts "#{process_count}".color(:red)
+ $stdout.puts "#{cluster_count}/#{worker_count}".color(:red)
try_fixing_it(
'sudo service gitlab stop',
"sudo pkill -u #{gitlab_user} -f sidekiq",
@@ -50,9 +51,14 @@ module SystemCheck
end
end
- def sidekiq_process_count
+ def sidekiq_worker_process_count
ps_ux, _ = Gitlab::Popen.popen(%w(ps uxww))
- ps_ux.scan(/sidekiq \d+\.\d+\.\d+/).count
+ ps_ux.lines.grep(/sidekiq \d+\.\d+\.\d+/).count
+ end
+
+ def sidekiq_cluster_process_count
+ ps_ux, _ = Gitlab::Popen.popen(%w(ps uxww))
+ ps_ux.lines.grep(/sidekiq-cluster/).count
end
end
end
diff --git a/lib/tasks/eslint.rake b/lib/tasks/eslint.rake
index ad63de66c81..529f17d4d27 100644
--- a/lib/tasks/eslint.rake
+++ b/lib/tasks/eslint.rake
@@ -3,7 +3,7 @@
unless Rails.env.production?
desc "GitLab | Run ESLint"
task eslint: ['yarn:check'] do
- unless system('yarn run eslint')
+ unless system('yarn run lint:eslint:all')
abort('rake eslint failed')
end
end
diff --git a/lib/tasks/gitlab/graphql.rake b/lib/tasks/gitlab/graphql.rake
index e4eb4604138..77377a7e0fd 100644
--- a/lib/tasks/gitlab/graphql.rake
+++ b/lib/tasks/gitlab/graphql.rake
@@ -6,6 +6,7 @@ require 'graphql/rake_task'
namespace :gitlab do
OUTPUT_DIR = Rails.root.join("doc/api/graphql/reference")
+ TEMP_SCHEMA_DIR = Rails.root.join('tmp/tests/graphql')
TEMPLATES_DIR = 'lib/gitlab/graphql/docs/templates/'
# Make all feature flags enabled so that all feature flag
@@ -27,7 +28,7 @@ namespace :gitlab do
GraphQL::RakeTask.new(
schema_name: 'GitlabSchema',
dependencies: [:environment, :enable_feature_flags],
- directory: OUTPUT_DIR,
+ directory: TEMP_SCHEMA_DIR,
idl_outfile: "gitlab_schema.graphql",
json_outfile: "gitlab_schema.json"
)
@@ -130,18 +131,8 @@ namespace :gitlab do
end
end
- desc 'GitLab | GraphQL | Check if GraphQL schemas are up to date'
- task check_schema: [:environment, :enable_feature_flags] do
- idl_doc = File.read(Rails.root.join(OUTPUT_DIR, 'gitlab_schema.graphql'))
- json_doc = File.read(Rails.root.join(OUTPUT_DIR, 'gitlab_schema.json'))
-
- if idl_doc == GitlabSchema.to_definition && json_doc == GitlabSchema.to_json
- puts "GraphQL schema is up to date"
- else
- format_output('GraphQL schema is outdated! Please update it by running `bundle exec rake gitlab:graphql:schema:dump`.')
- abort
- end
- end
+ desc 'GitLab | GraphQL | Update GraphQL docs and schema'
+ task update_all: [:compile_docs, 'schema:dump']
end
end
diff --git a/lib/tasks/gitlab/packages/composer.rake b/lib/tasks/gitlab/packages/composer.rake
new file mode 100644
index 00000000000..c9bccfe9384
--- /dev/null
+++ b/lib/tasks/gitlab/packages/composer.rake
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+require 'logger'
+
+desc "GitLab | Packages | Build composer cache"
+namespace :gitlab do
+ namespace :packages do
+ task build_composer_cache: :environment do
+ logger = Logger.new(STDOUT)
+ logger.info('Starting to build composer cache files')
+
+ ::Packages::Package.composer.find_in_batches do |packages|
+ packages.group_by { |pkg| [pkg.project_id, pkg.name] }.each do |(project_id, name), packages|
+ logger.info("Building cache for #{project_id} -> #{name}")
+ Gitlab::Composer::Cache.new(project: packages.first.project, name: name).execute
+ end
+ end
+ end
+ end
+end
diff --git a/lib/tasks/gitlab/packages/events.rake b/lib/tasks/gitlab/packages/events.rake
index 4bf4ce430f1..4a6a014acc5 100644
--- a/lib/tasks/gitlab/packages/events.rake
+++ b/lib/tasks/gitlab/packages/events.rake
@@ -51,8 +51,7 @@ namespace :gitlab do
"name" => event_name,
"category" => "#{originator_type}_packages",
"aggregation" => "weekly",
- "redis_slot" => "package",
- "feature_flag" => "collect_package_events_redis"
+ "redis_slot" => "package"
}
end
diff --git a/lib/tasks/lint.rake b/lib/tasks/lint.rake
index 5d60bc41f21..976ec089011 100644
--- a/lib/tasks/lint.rake
+++ b/lib/tasks/lint.rake
@@ -33,7 +33,6 @@ unless Rails.env.production?
tasks = %w[
config_lint
lint:haml
- scss_lint
gettext:lint
lint:static_verification
gitlab:sidekiq:all_queues_yml:check
diff --git a/lib/tasks/scss-lint.rake b/lib/tasks/scss-lint.rake
deleted file mode 100644
index 8a4809f80fd..00000000000
--- a/lib/tasks/scss-lint.rake
+++ /dev/null
@@ -1,12 +0,0 @@
-# frozen_string_literal: true
-
-unless Rails.env.production?
- require 'scss_lint/rake_task'
-
- SCSSLint::RakeTask.new do |t|
- t.config = '.scss-lint.yml'
- # See https://github.com/brigade/scss-lint/issues/726
- # Hack, otherwise linter won't respect scss_files option in config file.
- t.files = []
- end
-end
diff --git a/locale/am_ET/gitlab.po b/locale/am_ET/gitlab.po
index 1986d479e2d..587622aa18b 100644
--- a/locale/am_ET/gitlab.po
+++ b/locale/am_ET/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: am\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:54\n"
+"PO-Revision-Date: 2021-03-05 23:52\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr " ወይሠማጣቀሻዎች (ለáˆáˆ³áˆŒ path/to/project!merge_reques
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr "\"%{path}\" በ\"%{ref}\" ላይ አáˆá‰°áŒˆáŠ˜áˆ"
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -170,6 +173,11 @@ 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] ""
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ msgstr "%{edit_in_new_fork_notice} እንደገና ይህንን commit revert áˆ
msgid "%{edit_in_new_fork_notice} Try to upload a file again."
msgstr "%{edit_in_new_fork_notice} እንደገና á‹á‹­áˆ ለመጫን ይሞክሩá¡á¡"
+msgid "%{emailPrefix}@company.com"
+msgstr ""
+
msgid "%{extra} more downstream pipelines"
msgstr "%{extra} ተጨማሪ downstream pipelines"
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr "%{name} %{resultsString} á‹­á‹­á‹›áˆ"
@@ -682,6 +710,15 @@ msgstr[1] ""
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr "%{number_commits_behind} commits ኅላ %{default_branch}, %{number_commits_ahead} commits በáŠá‰µ"
+msgid "%{oneMonthAgo} - %{today}"
+msgstr ""
+
+msgid "%{oneWeekAgo} - %{today}"
+msgstr ""
+
+msgid "%{oneYearAgo} - %{today}"
+msgstr ""
+
msgid "%{openOrClose} %{noteable}"
msgstr "%{openOrClose} %{noteable}"
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -976,6 +1016,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -988,9 +1031,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1015,9 +1055,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1111,6 +1148,11 @@ 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] ""
@@ -1162,6 +1204,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1282,6 +1327,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1635,9 +1779,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1716,12 +1857,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1818,6 +1965,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1938,6 +2103,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2058,6 +2226,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2091,6 +2268,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2259,6 +2442,15 @@ 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 ""
@@ -2268,6 +2460,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2361,6 +2562,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2394,6 +2607,21 @@ 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 ""
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2483,9 +2714,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2576,9 +2792,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,9 +2813,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,49 +2837,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,76 +2867,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,13 +2927,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2954,7 +3104,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2996,6 +3146,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3146,12 +3293,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3269,6 +3425,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3296,12 +3455,18 @@ 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 ""
@@ -3344,7 +3509,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3395,10 +3566,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3757,9 +3928,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3787,6 +3955,9 @@ 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 erase this build?"
msgstr ""
@@ -4048,12 +4219,6 @@ msgstr[1] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5028,6 +5235,26 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5688,7 +5915,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5703,6 +5930,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6036,21 +6266,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7325,16 +7594,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7349,6 +7642,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7391,6 +7729,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7430,6 +7771,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7451,6 +7795,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8245,10 +8577,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8302,6 +8637,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8314,6 +8652,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8329,6 +8670,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,13 +8991,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8647,7 +9024,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8689,6 +9066,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8722,6 +9102,18 @@ 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 ""
@@ -8886,7 +9278,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 ""
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9261,9 +9682,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9318,6 +9736,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9429,6 +9856,15 @@ 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 ""
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9660,6 +10093,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9678,9 +10114,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9690,19 +10123,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9717,10 +10150,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9735,7 +10165,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9756,10 +10186,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9768,7 +10204,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10047,18 +10482,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,7 +10710,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11048,19 +11468,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
-msgstr ""
-
-msgid "Enter the issue title"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11345,6 +11759,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11369,6 +11786,12 @@ 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 ""
@@ -11396,6 +11819,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11423,6 +11849,9 @@ 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 ""
@@ -11447,9 +11876,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11882,6 +12320,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11915,6 +12356,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12038,10 +12482,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12068,6 +12512,12 @@ 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 ""
@@ -12104,9 +12554,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,10 +12602,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12826,6 +13279,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12856,7 +13345,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12934,9 +13423,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13096,6 +13585,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13135,6 +13627,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13144,6 +13639,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13291,6 +13801,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13330,6 +13840,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13828,6 +14344,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14630,6 +15164,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15703,96 +16240,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16078,9 +16543,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ 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 ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ 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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16972,6 +17518,9 @@ 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 ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] ""
msgstr[1] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17085,6 +17640,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17118,6 +17676,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17169,9 +17730,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17181,6 +17739,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19590,6 +20253,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19737,6 +20406,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19788,6 +20466,9 @@ 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 ""
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ 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."
+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."
@@ -20552,7 +21257,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20579,10 +21290,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20651,6 +21362,9 @@ 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 ""
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20762,6 +21473,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21077,6 +21809,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21284,9 +22028,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21308,10 +22049,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,10 +22154,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ 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 ""
@@ -21665,6 +22415,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21923,21 +22685,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21959,6 +22739,12 @@ 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 ""
@@ -22067,6 +22853,9 @@ 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 ""
@@ -22151,24 +22940,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22205,6 +22976,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22562,6 +23336,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22790,10 +23567,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22805,7 +23579,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,13 +23672,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22937,13 +23714,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22970,16 +23750,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,52 +23816,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23381,6 +24164,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23396,6 +24188,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23408,22 +24206,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23432,6 +24230,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23522,9 +24326,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23675,7 +24476,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23771,7 +24572,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24072,6 +24921,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24243,6 +25098,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,7 +25269,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25595,7 +26480,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25721,6 +26612,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,10 +26627,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,19 +26744,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26161,7 +27062,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26338,6 +27239,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] ""
msgstr[1] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27287,9 +28194,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27479,12 +28383,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27989,67 +28896,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28136,6 +29043,12 @@ 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 ""
@@ -28145,7 +29058,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ 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 ""
@@ -29076,12 +30004,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29112,10 +30046,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29157,7 +30091,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29574,6 +30505,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30382,10 +31325,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30735,6 +31675,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30756,10 +31699,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31308,6 +32266,12 @@ 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|Packages"
msgstr ""
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ 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 ""
@@ -31653,6 +32713,9 @@ 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 ""
@@ -31668,6 +32731,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ 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 ""
@@ -31752,6 +32824,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31912,9 +32990,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32032,6 +33107,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,10 +33847,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32832,9 +33943,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ 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 ""
@@ -33120,6 +34237,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33237,6 +34357,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33642,6 +34762,9 @@ 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 profile"
msgstr ""
@@ -33699,6 +34822,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 ""
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34215,6 +35350,9 @@ 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 ""
@@ -34354,6 +35492,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34698,7 +35836,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35128,6 +36272,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/ar_SA/gitlab.po b/locale/ar_SA/gitlab.po
index 96b2280166e..6deefd8ec50 100644
--- a/locale/ar_SA/gitlab.po
+++ b/locale/ar_SA/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: ar\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:56\n"
+"PO-Revision-Date: 2021-03-05 23:54\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -82,6 +82,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -250,6 +253,15 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "%d epic"
+msgid_plural "%d epics"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "%d error"
msgid_plural "%d errors"
msgstr[0] ""
@@ -565,6 +577,15 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -658,6 +679,9 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -742,6 +766,9 @@ 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 ""
@@ -793,6 +820,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -901,6 +931,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -934,6 +970,15 @@ msgstr[5] ""
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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -985,9 +1030,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1039,6 +1081,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1249,6 +1294,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -1276,6 +1324,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -1288,9 +1339,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1315,9 +1363,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1447,6 +1492,15 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "1 follower"
+msgid_plural "%{count} followers"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "1 group"
msgid_plural "%d groups"
msgstr[0] ""
@@ -1534,6 +1588,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1654,6 +1711,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1753,6 +1813,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -2011,9 +2167,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -2092,12 +2245,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -2194,6 +2353,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2254,6 +2428,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -2314,6 +2491,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2434,6 +2614,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2458,6 +2644,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2467,6 +2656,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2542,6 +2734,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2635,6 +2830,15 @@ 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 ""
@@ -2644,6 +2848,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2728,6 +2935,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2737,6 +2950,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2770,6 +2995,21 @@ 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 ""
@@ -2794,6 +3034,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2863,9 +3106,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2878,24 +3118,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2956,9 +3184,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2968,6 +3193,9 @@ 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 ""
@@ -2977,9 +3205,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -3004,49 +3229,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -3058,9 +3250,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -3070,76 +3259,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
-msgstr ""
-
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -3151,13 +3319,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -3169,9 +3337,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -3184,7 +3349,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -3271,9 +3436,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -3334,7 +3496,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -3376,6 +3538,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3442,12 +3607,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3526,12 +3685,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3556,6 +3721,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3649,6 +3817,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3676,12 +3847,18 @@ 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 ""
@@ -3724,7 +3901,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3763,6 +3943,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3775,10 +3958,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -4153,9 +4336,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -4183,6 +4363,9 @@ 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 erase this build?"
msgstr ""
@@ -4456,12 +4639,6 @@ msgstr[5] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4534,6 +4711,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4960,6 +5140,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4972,12 +5155,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -5050,6 +5245,12 @@ 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 ""
@@ -5140,12 +5341,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -5314,16 +5509,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -5338,6 +5545,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -5371,6 +5581,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -5389,6 +5605,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5440,6 +5659,30 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5575,6 +5818,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5728,12 +5974,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5878,6 +6118,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -6100,7 +6343,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -6115,6 +6358,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6448,21 +6694,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6472,9 +6739,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7483,6 +7762,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7552,6 +7834,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7741,16 +8026,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7765,6 +8074,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7777,9 +8092,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7795,6 +8140,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7807,6 +8161,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7846,6 +8203,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7867,6 +8227,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7921,9 +8284,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -8104,24 +8464,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8584,10 +8935,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8623,9 +8974,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8677,10 +9025,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8707,6 +9055,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8734,6 +9085,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8746,6 +9100,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8761,6 +9118,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8833,6 +9196,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8842,15 +9208,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8869,6 +9250,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8878,6 +9262,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8893,6 +9280,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8998,6 +9388,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -9046,13 +9439,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -9079,7 +9472,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -9121,6 +9514,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -9154,6 +9550,18 @@ 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 ""
@@ -9322,7 +9730,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9478,7 +9886,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9502,6 +9916,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9583,6 +10000,9 @@ 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 ""
@@ -9592,6 +10012,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9616,6 +10039,15 @@ 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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "DastSiteValidation|Validate"
msgstr ""
@@ -9634,6 +10066,9 @@ 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 ""
@@ -9655,6 +10090,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9679,6 +10117,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9697,9 +10138,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9754,6 +10192,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9784,6 +10225,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9841,6 +10285,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9865,6 +10312,15 @@ 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 ""
@@ -10063,13 +10519,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
-msgstr ""
-
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -10078,6 +10531,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -10087,15 +10543,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -10120,6 +10573,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -10138,9 +10594,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -10150,19 +10603,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -10177,10 +10630,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -10195,7 +10645,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -10216,10 +10666,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
+msgstr ""
+
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -10228,7 +10684,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -10258,6 +10714,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -10267,15 +10726,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -10285,6 +10735,15 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10507,18 +10966,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10534,16 +10981,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10564,10 +11011,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10576,18 +11020,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10600,9 +11038,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10612,6 +11047,12 @@ 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 ""
@@ -10639,6 +11080,9 @@ 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|Score"
msgstr ""
@@ -10750,7 +11194,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10957,6 +11401,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -11149,10 +11596,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -11221,12 +11668,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -11347,6 +11788,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11512,19 +11956,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
-msgstr ""
-
-msgid "Enter the issue title"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11809,6 +12247,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11833,6 +12274,12 @@ 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 ""
@@ -11860,6 +12307,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11887,6 +12337,9 @@ 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 ""
@@ -11911,9 +12364,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -12088,6 +12538,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -12253,6 +12706,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -12268,6 +12724,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -12310,6 +12769,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -12346,6 +12808,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -12379,6 +12844,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12502,10 +12970,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12532,6 +13000,12 @@ 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 ""
@@ -12568,9 +13042,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12586,9 +13057,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12622,10 +13090,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12670,7 +13138,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12688,9 +13156,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12733,6 +13198,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -13231,6 +13699,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -13294,6 +13771,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -13324,7 +13837,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -13402,9 +13915,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -13417,6 +13927,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13564,6 +14077,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13603,6 +14119,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13612,6 +14131,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13636,6 +14158,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13663,6 +14191,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13708,6 +14239,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13759,6 +14293,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13783,9 +14320,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13798,6 +14332,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13834,6 +14371,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -14095,9 +14635,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -14248,6 +14785,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -14296,6 +14836,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14629,6 +15172,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14905,6 +15457,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14986,15 +15544,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -15106,6 +15664,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -15364,6 +15925,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15727,7 +16291,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -16153,9 +16717,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -16195,96 +16756,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -16303,12 +16774,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -16360,6 +16837,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -16393,6 +16876,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16561,6 +17047,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16570,9 +17059,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16582,9 +17068,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16624,19 +17143,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16645,18 +17185,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16666,6 +17221,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16888,6 +17449,9 @@ 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 ""
@@ -16963,10 +17527,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -17014,6 +17575,9 @@ 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 ""
@@ -17029,7 +17593,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -17089,6 +17653,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -17113,6 +17680,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -17314,6 +17884,9 @@ 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 ""
@@ -17383,9 +17956,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -17464,6 +18034,9 @@ 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 ""
@@ -17488,6 +18061,9 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17533,6 +18109,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17581,6 +18160,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17614,6 +18196,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17665,9 +18250,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17677,6 +18259,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17890,9 +18562,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -18007,6 +18676,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -18046,7 +18718,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -18406,6 +19078,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -18418,9 +19093,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -18478,6 +19150,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18748,6 +19423,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18829,9 +19507,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18841,9 +19516,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18892,6 +19564,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19609,6 +20284,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19618,6 +20296,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19636,6 +20317,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19852,6 +20536,12 @@ 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 ""
@@ -19870,12 +20560,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -20113,6 +20797,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -20134,6 +20821,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -20176,6 +20866,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -20281,6 +20974,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -20302,9 +20998,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -20332,6 +21034,9 @@ 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 ""
@@ -20368,6 +21073,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20596,13 +21304,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20617,6 +21331,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 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 ""
@@ -20632,9 +21349,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20662,6 +21376,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20716,9 +21433,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20830,6 +21544,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20851,6 +21571,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20884,9 +21607,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -21067,7 +21796,7 @@ 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."
+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."
@@ -21100,7 +21829,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -21115,6 +21844,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -21127,10 +21862,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -21199,6 +21934,9 @@ 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 ""
@@ -21253,9 +21991,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -21310,6 +22045,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -21322,6 +22066,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -21445,9 +22192,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -21466,6 +22210,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -21484,6 +22231,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -21523,6 +22276,9 @@ 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|npm command"
msgstr ""
@@ -21544,15 +22300,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21625,6 +22381,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21682,10 +22447,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21781,6 +22546,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21832,9 +22600,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21856,10 +22621,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21934,15 +22699,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21970,10 +22726,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21988,9 +22744,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -22015,6 +22768,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -22051,9 +22807,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -22087,6 +22840,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -22099,12 +22855,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -22144,6 +22909,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -22156,6 +22924,12 @@ 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 ""
@@ -22213,6 +22987,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -22282,6 +23059,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -22405,12 +23185,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -22471,21 +23257,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -22507,6 +23311,12 @@ 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 ""
@@ -22615,6 +23425,9 @@ 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 ""
@@ -22699,24 +23512,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22753,6 +23548,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -23110,6 +23908,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -23338,10 +24139,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -23353,7 +24151,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -23368,6 +24166,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -23395,16 +24199,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -23443,13 +24244,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -23485,13 +24286,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -23518,16 +24322,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23551,7 +24364,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23575,52 +24388,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23899,10 +24709,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23911,9 +24721,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23929,6 +24736,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23944,6 +24760,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23956,22 +24778,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23980,6 +24802,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -24070,9 +24898,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -24115,9 +24940,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -24130,6 +24952,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -24223,7 +25048,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -24319,7 +25144,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -24412,6 +25279,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -24448,6 +25318,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24628,6 +25501,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24733,6 +25609,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24799,6 +25678,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24967,7 +25849,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -25027,12 +25909,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -25114,6 +25999,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -25141,6 +26032,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -25237,6 +26134,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -25255,6 +26155,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -25375,9 +26278,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -25468,6 +26368,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25852,7 +26755,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25924,6 +26827,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -26011,6 +26917,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -26227,7 +27136,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -26272,12 +27181,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -26290,9 +27205,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -26317,6 +27229,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -26353,6 +27268,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -26362,10 +27283,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -26386,6 +27307,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -26401,9 +27325,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -26431,6 +27352,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -26473,19 +27400,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -26509,15 +27436,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-msgstr[5] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -26560,7 +27478,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -26569,7 +27487,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26656,9 +27574,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26707,7 +27622,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26749,12 +27664,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26797,7 +27718,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26974,6 +27895,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -27166,6 +28090,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -27325,7 +28252,7 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -27619,9 +28546,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27748,6 +28672,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27931,9 +28858,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -28123,12 +29047,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -28633,67 +29560,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28780,6 +29707,12 @@ 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 ""
@@ -28789,7 +29722,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28984,6 +29917,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -29053,6 +29989,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -29065,6 +30004,9 @@ 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 ""
@@ -29086,6 +30028,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -29137,9 +30082,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -29638,6 +30580,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29722,6 +30667,9 @@ 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 ""
@@ -29740,12 +30688,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29776,10 +30730,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29821,7 +30775,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29836,7 +30790,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29878,6 +30832,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29908,6 +30865,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29935,9 +30895,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29950,6 +30907,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -30013,6 +30973,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -30055,18 +31018,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -30238,6 +31189,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -30535,6 +31489,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -30568,6 +31525,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30904,6 +31864,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -31054,10 +32017,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -31120,12 +32083,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -31150,9 +32107,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -31279,8 +32233,8 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
@@ -31288,16 +32242,22 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -31306,13 +32266,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -31399,6 +32356,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -31411,6 +32371,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -31432,10 +32395,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -31501,6 +32464,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -31633,6 +32611,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31804,9 +32785,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31984,6 +32962,12 @@ 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|Packages"
msgstr ""
@@ -32086,6 +33070,96 @@ 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 ""
@@ -32095,7 +33169,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -32116,7 +33190,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -32287,6 +33361,12 @@ 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 ""
@@ -32329,6 +33409,9 @@ 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 ""
@@ -32344,6 +33427,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -32353,9 +33439,15 @@ 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 ""
@@ -32428,6 +33520,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -32545,6 +33640,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -32596,9 +33694,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32716,6 +33811,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32782,6 +33880,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32803,15 +33904,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -33010,6 +34123,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -33031,6 +34150,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -33088,10 +34210,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -33100,7 +34222,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -33127,64 +34249,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -33223,6 +34354,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -33250,7 +34384,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -33421,10 +34555,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -33520,9 +34651,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -33532,6 +34660,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -33598,7 +34729,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -33613,6 +34744,9 @@ 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 ""
@@ -33661,6 +34795,9 @@ 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 ""
@@ -33808,6 +34945,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33925,6 +35065,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -34156,9 +35299,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -34330,6 +35470,9 @@ 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 profile"
msgstr ""
@@ -34387,6 +35530,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -34414,6 +35560,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -34627,6 +35776,9 @@ 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 ""
@@ -34762,6 +35914,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34927,6 +36082,9 @@ msgstr[5] ""
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 ""
@@ -35074,6 +36232,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -35170,9 +36331,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -35218,9 +36376,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -35338,6 +36493,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -35422,7 +36580,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -35503,6 +36661,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -35512,9 +36673,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -35563,9 +36730,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35872,6 +37036,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35899,6 +37069,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35926,9 +37099,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/as_IN/gitlab.po b/locale/as_IN/gitlab.po
index 4563890e6ae..6cbd6d20a83 100644
--- a/locale/as_IN/gitlab.po
+++ b/locale/as_IN/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: as\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:09\n"
+"PO-Revision-Date: 2021-03-05 23:51\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -170,6 +173,11 @@ 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] ""
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ 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 ""
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -682,6 +710,15 @@ 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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -976,6 +1016,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -988,9 +1031,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1015,9 +1055,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1111,6 +1148,11 @@ 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] ""
@@ -1162,6 +1204,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1282,6 +1327,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1635,9 +1779,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1716,12 +1857,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1818,6 +1965,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1938,6 +2103,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2058,6 +2226,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2091,6 +2268,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2259,6 +2442,15 @@ 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 ""
@@ -2268,6 +2460,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2361,6 +2562,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2394,6 +2607,21 @@ 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 ""
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2483,9 +2714,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2576,9 +2792,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,9 +2813,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,49 +2837,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,76 +2867,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,13 +2927,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2954,7 +3104,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2996,6 +3146,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3146,12 +3293,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3269,6 +3425,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3296,12 +3455,18 @@ 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 ""
@@ -3344,7 +3509,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3395,10 +3566,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3757,9 +3928,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3787,6 +3955,9 @@ 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 erase this build?"
msgstr ""
@@ -4048,12 +4219,6 @@ msgstr[1] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5028,6 +5235,26 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5688,7 +5915,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5703,6 +5930,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6036,21 +6266,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7325,16 +7594,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7349,6 +7642,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7391,6 +7729,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7430,6 +7771,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7451,6 +7795,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8245,10 +8577,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8302,6 +8637,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8314,6 +8652,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8329,6 +8670,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,13 +8991,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8647,7 +9024,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8689,6 +9066,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8722,6 +9102,18 @@ 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 ""
@@ -8886,7 +9278,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 ""
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9261,9 +9682,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9318,6 +9736,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9429,6 +9856,15 @@ 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 ""
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9660,6 +10093,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9678,9 +10114,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9690,19 +10123,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9717,10 +10150,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9735,7 +10165,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9756,10 +10186,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9768,7 +10204,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10047,18 +10482,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,7 +10710,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11048,19 +11468,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
-msgstr ""
-
-msgid "Enter the issue title"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11345,6 +11759,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11369,6 +11786,12 @@ 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 ""
@@ -11396,6 +11819,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11423,6 +11849,9 @@ 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 ""
@@ -11447,9 +11876,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11882,6 +12320,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11915,6 +12356,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12038,10 +12482,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12068,6 +12512,12 @@ 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 ""
@@ -12104,9 +12554,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,10 +12602,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12826,6 +13279,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12856,7 +13345,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12934,9 +13423,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13096,6 +13585,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13135,6 +13627,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13144,6 +13639,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13291,6 +13801,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13330,6 +13840,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13828,6 +14344,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14630,6 +15164,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15703,96 +16240,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16078,9 +16543,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ 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 ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ 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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16972,6 +17518,9 @@ 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 ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] ""
msgstr[1] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17085,6 +17640,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17118,6 +17676,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17169,9 +17730,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17181,6 +17739,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19590,6 +20253,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19737,6 +20406,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19788,6 +20466,9 @@ 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 ""
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ 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."
+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."
@@ -20552,7 +21257,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20579,10 +21290,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20651,6 +21362,9 @@ 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 ""
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20762,6 +21473,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21077,6 +21809,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21284,9 +22028,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21308,10 +22049,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,10 +22154,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ 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 ""
@@ -21665,6 +22415,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21923,21 +22685,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21959,6 +22739,12 @@ 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 ""
@@ -22067,6 +22853,9 @@ 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 ""
@@ -22151,24 +22940,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22205,6 +22976,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22562,6 +23336,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22790,10 +23567,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22805,7 +23579,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,13 +23672,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22937,13 +23714,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22970,16 +23750,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,52 +23816,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23381,6 +24164,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23396,6 +24188,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23408,22 +24206,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23432,6 +24230,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23522,9 +24326,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23675,7 +24476,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23771,7 +24572,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24072,6 +24921,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24243,6 +25098,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,7 +25269,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25595,7 +26480,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25721,6 +26612,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,10 +26627,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,19 +26744,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26161,7 +27062,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26338,6 +27239,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] ""
msgstr[1] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27287,9 +28194,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27479,12 +28383,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27989,67 +28896,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28136,6 +29043,12 @@ 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 ""
@@ -28145,7 +29058,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ 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 ""
@@ -29076,12 +30004,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29112,10 +30046,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29157,7 +30091,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29574,6 +30505,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30382,10 +31325,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30735,6 +31675,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30756,10 +31699,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31308,6 +32266,12 @@ 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|Packages"
msgstr ""
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ 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 ""
@@ -31653,6 +32713,9 @@ 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 ""
@@ -31668,6 +32731,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ 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 ""
@@ -31752,6 +32824,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31912,9 +32990,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32032,6 +33107,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,10 +33847,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32832,9 +33943,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ 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 ""
@@ -33120,6 +34237,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33237,6 +34357,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33642,6 +34762,9 @@ 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 profile"
msgstr ""
@@ -33699,6 +34822,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 ""
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34215,6 +35350,9 @@ 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 ""
@@ -34354,6 +35492,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34698,7 +35836,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35128,6 +36272,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/az_AZ/gitlab.po b/locale/az_AZ/gitlab.po
index 4703e5cde81..52c7cb32822 100644
--- a/locale/az_AZ/gitlab.po
+++ b/locale/az_AZ/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: az\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:07\n"
+"PO-Revision-Date: 2021-03-05 23:50\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -170,6 +173,11 @@ 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] ""
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ 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 ""
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -682,6 +710,15 @@ 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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -976,6 +1016,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -988,9 +1031,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1015,9 +1055,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1111,6 +1148,11 @@ 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] ""
@@ -1162,6 +1204,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1282,6 +1327,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1635,9 +1779,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1716,12 +1857,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1818,6 +1965,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1938,6 +2103,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2058,6 +2226,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2091,6 +2268,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2259,6 +2442,15 @@ 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 ""
@@ -2268,6 +2460,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2361,6 +2562,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2394,6 +2607,21 @@ 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 ""
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2483,9 +2714,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2576,9 +2792,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,9 +2813,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,49 +2837,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,76 +2867,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,13 +2927,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2954,7 +3104,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2996,6 +3146,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3146,12 +3293,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3269,6 +3425,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3296,12 +3455,18 @@ 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 ""
@@ -3344,7 +3509,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3395,10 +3566,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3757,9 +3928,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3787,6 +3955,9 @@ 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 erase this build?"
msgstr ""
@@ -4048,12 +4219,6 @@ msgstr[1] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5028,6 +5235,26 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5688,7 +5915,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5703,6 +5930,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6036,21 +6266,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7325,16 +7594,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7349,6 +7642,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7391,6 +7729,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7430,6 +7771,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7451,6 +7795,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8245,10 +8577,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8302,6 +8637,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8314,6 +8652,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8329,6 +8670,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,13 +8991,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8647,7 +9024,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8689,6 +9066,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8722,6 +9102,18 @@ 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 ""
@@ -8886,7 +9278,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 ""
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9261,9 +9682,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9318,6 +9736,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9429,6 +9856,15 @@ 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 ""
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9660,6 +10093,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9678,9 +10114,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9690,19 +10123,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9717,10 +10150,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9735,7 +10165,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9756,10 +10186,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9768,7 +10204,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10047,18 +10482,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,7 +10710,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11048,19 +11468,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
-msgstr ""
-
-msgid "Enter the issue title"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11345,6 +11759,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11369,6 +11786,12 @@ 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 ""
@@ -11396,6 +11819,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11423,6 +11849,9 @@ 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 ""
@@ -11447,9 +11876,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11882,6 +12320,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11915,6 +12356,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12038,10 +12482,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12068,6 +12512,12 @@ 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 ""
@@ -12104,9 +12554,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,10 +12602,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12826,6 +13279,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12856,7 +13345,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12934,9 +13423,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13096,6 +13585,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13135,6 +13627,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13144,6 +13639,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13291,6 +13801,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13330,6 +13840,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13828,6 +14344,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14630,6 +15164,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15703,96 +16240,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16078,9 +16543,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ 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 ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ 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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16972,6 +17518,9 @@ 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 ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] ""
msgstr[1] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17085,6 +17640,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17118,6 +17676,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17169,9 +17730,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17181,6 +17739,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19590,6 +20253,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19737,6 +20406,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19788,6 +20466,9 @@ 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 ""
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ 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."
+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."
@@ -20552,7 +21257,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20579,10 +21290,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20651,6 +21362,9 @@ 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 ""
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20762,6 +21473,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21077,6 +21809,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21284,9 +22028,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21308,10 +22049,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,10 +22154,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ 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 ""
@@ -21665,6 +22415,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21923,21 +22685,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21959,6 +22739,12 @@ 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 ""
@@ -22067,6 +22853,9 @@ 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 ""
@@ -22151,24 +22940,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22205,6 +22976,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22562,6 +23336,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22790,10 +23567,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22805,7 +23579,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,13 +23672,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22937,13 +23714,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22970,16 +23750,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,52 +23816,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23381,6 +24164,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23396,6 +24188,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23408,22 +24206,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23432,6 +24230,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23522,9 +24326,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23675,7 +24476,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23771,7 +24572,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24072,6 +24921,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24243,6 +25098,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,7 +25269,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25595,7 +26480,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25721,6 +26612,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,10 +26627,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,19 +26744,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26161,7 +27062,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26338,6 +27239,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] ""
msgstr[1] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27287,9 +28194,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27479,12 +28383,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27989,67 +28896,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28136,6 +29043,12 @@ 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 ""
@@ -28145,7 +29058,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ 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 ""
@@ -29076,12 +30004,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29112,10 +30046,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29157,7 +30091,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29574,6 +30505,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30382,10 +31325,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30735,6 +31675,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30756,10 +31699,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31308,6 +32266,12 @@ 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|Packages"
msgstr ""
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ 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 ""
@@ -31653,6 +32713,9 @@ 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 ""
@@ -31668,6 +32731,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ 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 ""
@@ -31752,6 +32824,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31912,9 +32990,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32032,6 +33107,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,10 +33847,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32832,9 +33943,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ 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 ""
@@ -33120,6 +34237,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33237,6 +34357,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33642,6 +34762,9 @@ 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 profile"
msgstr ""
@@ -33699,6 +34822,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 ""
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34215,6 +35350,9 @@ 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 ""
@@ -34354,6 +35492,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34698,7 +35836,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35128,6 +36272,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/ba_RU/gitlab.po b/locale/ba_RU/gitlab.po
index 2330e50d445..293c3a7bead 100644
--- a/locale/ba_RU/gitlab.po
+++ b/locale/ba_RU/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: ba\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:10\n"
+"PO-Revision-Date: 2021-03-05 23:52\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -72,6 +72,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -150,6 +153,10 @@ msgid "%d day"
msgid_plural "%d days"
msgstr[0] ""
+msgid "%d epic"
+msgid_plural "%d epics"
+msgstr[0] ""
+
msgid "%d error"
msgid_plural "%d errors"
msgstr[0] ""
@@ -290,6 +297,10 @@ msgid "%d vulnerability dismissed"
msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -363,6 +374,9 @@ msgid "%{count} issue selected"
msgid_plural "%{count} issues selected"
msgstr[0] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -432,6 +446,9 @@ 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 ""
@@ -483,6 +500,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -591,6 +611,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -619,6 +645,15 @@ msgstr[0] ""
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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -665,9 +700,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -709,6 +741,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -879,6 +914,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -901,6 +939,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -913,9 +954,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -940,9 +978,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1027,6 +1062,10 @@ msgid "1 deploy key"
msgid_plural "%d deploy keys"
msgstr[0] ""
+msgid "1 follower"
+msgid_plural "%{count} followers"
+msgstr[0] ""
+
msgid "1 group"
msgid_plural "%d groups"
msgstr[0] ""
@@ -1069,6 +1108,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1189,6 +1231,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1288,6 +1333,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1541,9 +1682,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1622,12 +1760,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1724,6 +1868,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1784,6 +1943,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1844,6 +2006,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -1964,6 +2129,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -1988,6 +2159,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -1997,6 +2171,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2072,6 +2249,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2165,6 +2345,15 @@ 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 ""
@@ -2174,6 +2363,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2258,6 +2450,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2267,6 +2465,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2300,6 +2510,21 @@ 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 ""
@@ -2324,6 +2549,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2388,9 +2616,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2403,24 +2628,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2481,9 +2694,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2493,6 +2703,9 @@ 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 ""
@@ -2502,9 +2715,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2529,49 +2739,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2583,9 +2760,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2595,76 +2769,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
-msgstr ""
-
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2676,13 +2829,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2694,9 +2847,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2709,7 +2859,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2796,9 +2946,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2859,7 +3006,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2901,6 +3048,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -2967,12 +3117,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3051,12 +3195,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3081,6 +3231,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3174,6 +3327,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3201,12 +3357,18 @@ 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 ""
@@ -3249,7 +3411,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3288,6 +3453,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3300,10 +3468,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3658,9 +3826,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3688,6 +3853,9 @@ 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 erase this build?"
msgstr ""
@@ -3946,12 +4114,6 @@ msgstr[0] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4024,6 +4186,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4450,6 +4615,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4462,12 +4630,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4535,6 +4715,12 @@ 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 ""
@@ -4625,12 +4811,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -4799,16 +4979,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4823,6 +5015,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4856,6 +5051,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4874,6 +5075,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -4925,6 +5129,25 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5060,6 +5283,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5213,12 +5439,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5363,6 +5583,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5585,7 +5808,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5600,6 +5823,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -5933,21 +6159,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -5957,9 +6204,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6968,6 +7227,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7037,6 +7299,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7221,16 +7486,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
+msgstr ""
+
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Create merge request"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7245,6 +7534,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7257,9 +7552,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7275,6 +7600,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7287,6 +7621,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7326,6 +7663,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7347,6 +7687,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7401,9 +7744,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7574,24 +7914,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8049,10 +8380,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8088,9 +8419,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8137,10 +8465,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8167,6 +8495,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8194,6 +8525,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8206,6 +8540,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8221,6 +8558,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8293,6 +8636,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8302,15 +8648,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8329,6 +8690,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8338,6 +8702,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8353,6 +8720,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8458,6 +8828,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8506,13 +8879,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8539,7 +8912,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8581,6 +8954,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8614,6 +8990,18 @@ 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 ""
@@ -8777,7 +9165,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -8933,7 +9321,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -8957,6 +9351,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9038,6 +9435,9 @@ 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 ""
@@ -9047,6 +9447,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9071,6 +9474,10 @@ 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] ""
+
msgid "DastSiteValidation|Validate"
msgstr ""
@@ -9089,6 +9496,9 @@ 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 ""
@@ -9110,6 +9520,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9134,6 +9547,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9152,9 +9568,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9209,6 +9622,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9239,6 +9655,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9296,6 +9715,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9320,6 +9742,15 @@ 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 ""
@@ -9488,13 +9919,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
-msgstr ""
-
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9503,6 +9931,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9512,15 +9943,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9545,6 +9973,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9563,9 +9994,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9575,19 +10003,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9602,10 +10030,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9620,7 +10045,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9641,10 +10066,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9653,7 +10084,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9683,6 +10114,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9692,15 +10126,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9710,6 +10135,10 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+
msgid "Deployment|API"
msgstr ""
@@ -9932,18 +10361,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -9959,16 +10376,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -9989,10 +10406,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10001,18 +10415,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10025,9 +10433,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10037,6 +10442,12 @@ 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 ""
@@ -10064,6 +10475,9 @@ 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|Score"
msgstr ""
@@ -10175,7 +10589,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10377,6 +10791,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10569,10 +10986,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10641,12 +11058,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10767,6 +11178,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -10932,19 +11346,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the issue title"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request description"
-msgstr ""
-
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11229,6 +11637,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11253,6 +11664,12 @@ 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 ""
@@ -11280,6 +11697,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11307,6 +11727,9 @@ 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 ""
@@ -11331,9 +11754,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11508,6 +11928,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11673,6 +12096,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11688,6 +12114,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11730,6 +12159,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11766,6 +12198,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11799,6 +12234,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -11922,10 +12360,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -11952,6 +12390,12 @@ 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 ""
@@ -11988,9 +12432,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12006,9 +12447,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12042,10 +12480,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12090,7 +12528,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12108,9 +12546,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12153,6 +12588,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12646,6 +13084,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12709,6 +13156,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12739,7 +13222,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12817,9 +13300,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12832,6 +13312,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -12979,6 +13462,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13018,6 +13504,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13027,6 +13516,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13051,6 +13543,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13078,6 +13576,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13123,6 +13624,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13174,6 +13678,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13198,9 +13705,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13213,6 +13717,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13249,6 +13756,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13510,9 +14020,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13663,6 +14170,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13711,6 +14221,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14044,6 +14557,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14320,6 +14842,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14401,15 +14929,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14511,6 +15039,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14759,6 +15290,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15117,7 +15651,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15543,9 +16077,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15580,96 +16111,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15688,12 +16129,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15745,6 +16192,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15778,6 +16231,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -15946,6 +16402,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -15955,9 +16414,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -15967,9 +16423,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16009,19 +16498,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16030,18 +16540,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16051,6 +16576,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16273,6 +16804,9 @@ 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 ""
@@ -16348,10 +16882,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16399,6 +16930,9 @@ 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 ""
@@ -16414,7 +16948,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16474,6 +17008,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16498,6 +17035,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16699,6 +17239,9 @@ 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 ""
@@ -16768,9 +17311,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16849,6 +17389,9 @@ 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 ""
@@ -16868,6 +17411,9 @@ msgid "Last %d day"
msgid_plural "Last %d days"
msgstr[0] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -16913,6 +17459,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -16961,6 +17510,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -16994,6 +17546,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17045,9 +17600,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17057,6 +17609,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17240,9 +17882,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17352,6 +17991,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17391,7 +18033,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17751,6 +18393,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17763,9 +18408,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17823,6 +18465,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18093,6 +18738,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18174,9 +18822,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18186,9 +18831,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18237,6 +18879,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -18944,6 +19589,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -18953,6 +19601,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -18971,6 +19622,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19177,6 +19831,12 @@ 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 ""
@@ -19195,12 +19855,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19433,6 +20087,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19454,6 +20111,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19496,6 +20156,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19601,6 +20264,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19622,9 +20288,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19652,6 +20324,9 @@ 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 ""
@@ -19688,6 +20363,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -19916,13 +20594,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -19937,6 +20621,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 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 ""
@@ -19952,9 +20639,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -19982,6 +20666,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20036,9 +20723,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20150,6 +20834,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20171,6 +20861,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20204,9 +20897,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20382,7 +21081,7 @@ 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."
+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."
@@ -20415,7 +21114,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20430,6 +21129,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20442,10 +21147,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20514,6 +21219,9 @@ 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 ""
@@ -20568,9 +21276,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20625,6 +21330,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20637,6 +21351,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20760,9 +21477,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20781,6 +21495,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20799,6 +21516,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20838,6 +21561,9 @@ 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|npm command"
msgstr ""
@@ -20859,15 +21585,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -20940,6 +21666,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -20997,10 +21732,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21096,6 +21831,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21147,9 +21885,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21171,10 +21906,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21249,15 +21984,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21285,10 +22011,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21303,9 +22029,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21330,6 +22053,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21366,9 +22092,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21402,6 +22125,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21414,12 +22140,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21459,6 +22194,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21471,6 +22209,12 @@ 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 ""
@@ -21528,6 +22272,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21597,6 +22344,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21720,12 +22470,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21786,21 +22542,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21822,6 +22596,12 @@ 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 ""
@@ -21930,6 +22710,9 @@ 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 ""
@@ -22014,24 +22797,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22068,6 +22833,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22425,6 +23193,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22653,10 +23424,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22668,7 +23436,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22683,6 +23451,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22710,16 +23484,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22758,13 +23529,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22800,13 +23571,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22833,16 +23607,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -22866,7 +23649,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -22890,52 +23673,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23214,10 +23994,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23226,9 +24006,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23244,6 +24021,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23259,6 +24045,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23271,22 +24063,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23295,6 +24087,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23385,9 +24183,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23430,9 +24225,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23445,6 +24237,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23538,7 +24333,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23634,7 +24429,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23727,6 +24564,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23763,6 +24603,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -23933,6 +24776,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24038,6 +24884,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24104,6 +24953,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24272,7 +25124,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24322,12 +25174,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24399,6 +25254,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24426,6 +25287,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24522,6 +25389,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24540,6 +25410,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24650,9 +25523,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24743,6 +25613,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25117,7 +25990,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25189,6 +26062,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25276,6 +26152,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25437,7 +26316,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25482,12 +26361,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25500,9 +26385,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25527,6 +26409,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25563,6 +26448,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25572,10 +26463,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25596,6 +26487,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25611,9 +26505,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25641,6 +26532,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25683,19 +26580,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25719,10 +26616,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25765,7 +26658,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25774,7 +26667,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -25861,9 +26754,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -25912,7 +26802,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -25954,12 +26844,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26002,7 +26898,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26179,6 +27075,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26371,6 +27270,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26525,7 +27427,7 @@ msgid "Showing %d event"
msgid_plural "Showing %d events"
msgstr[0] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26814,9 +27716,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -26943,6 +27842,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27126,9 +28028,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27318,12 +28217,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27828,67 +28730,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -27975,6 +28877,12 @@ 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 ""
@@ -27984,7 +28892,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28179,6 +29087,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28238,6 +29149,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28250,6 +29164,9 @@ 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 ""
@@ -28271,6 +29188,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28317,9 +29237,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28808,6 +29725,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -28892,6 +29812,9 @@ 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 ""
@@ -28910,12 +29833,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -28946,10 +29875,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -28991,7 +29920,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29006,7 +29935,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29048,6 +29977,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29078,6 +30010,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29105,9 +30040,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29120,6 +30052,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29183,6 +30118,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29225,18 +30163,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29408,6 +30334,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29705,6 +30634,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29738,6 +30670,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30064,6 +30999,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30214,10 +31152,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30280,12 +31218,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30310,9 +31242,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30439,20 +31368,26 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30461,13 +31396,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30554,6 +31486,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30566,6 +31501,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30587,10 +31525,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30656,6 +31594,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30788,6 +31741,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -30959,9 +31915,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31139,6 +32092,12 @@ 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|Packages"
msgstr ""
@@ -31241,6 +32200,96 @@ 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 ""
@@ -31250,7 +32299,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31271,7 +32320,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31442,6 +32491,12 @@ 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 ""
@@ -31484,6 +32539,9 @@ 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 ""
@@ -31499,6 +32557,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31508,9 +32569,15 @@ 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 ""
@@ -31583,6 +32650,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31700,6 +32770,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31741,9 +32814,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -31861,6 +32931,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -31927,6 +33000,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -31948,15 +33024,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32155,6 +33243,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32176,6 +33270,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32233,10 +33330,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32245,7 +33342,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32272,64 +33369,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32368,6 +33474,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32395,7 +33504,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32561,10 +33670,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32660,9 +33766,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32672,6 +33775,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32738,7 +33844,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32753,6 +33859,9 @@ 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 ""
@@ -32801,6 +33910,9 @@ 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 ""
@@ -32948,6 +34060,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33065,6 +34180,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33296,9 +34414,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33470,6 +34585,9 @@ 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 profile"
msgstr ""
@@ -33527,6 +34645,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33549,6 +34670,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33762,6 +34886,9 @@ 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 ""
@@ -33892,6 +35019,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34037,6 +35167,9 @@ msgstr[0] ""
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 ""
@@ -34174,6 +35307,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34270,9 +35406,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34313,9 +35446,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34433,6 +35563,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34517,7 +35650,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34598,6 +35731,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34607,9 +35743,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34658,9 +35800,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -34942,6 +36081,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -34969,6 +36114,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -34996,9 +36144,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/bg/gitlab.po b/locale/bg/gitlab.po
index c3f8e4d8ba3..4d3b1a04cfa 100644
--- a/locale/bg/gitlab.po
+++ b/locale/bg/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: bg\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:56\n"
+"PO-Revision-Date: 2021-03-05 23:54\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -170,6 +173,11 @@ 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] ""
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ 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 ""
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -682,6 +710,15 @@ 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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -976,6 +1016,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -988,9 +1031,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1015,9 +1055,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1111,6 +1148,11 @@ 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] ""
@@ -1162,6 +1204,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1282,6 +1327,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1635,9 +1779,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1716,12 +1857,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1818,6 +1965,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1938,6 +2103,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2058,6 +2226,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2091,6 +2268,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2259,6 +2442,15 @@ 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 ""
@@ -2268,6 +2460,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2361,6 +2562,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2394,6 +2607,21 @@ 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 ""
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2483,9 +2714,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2576,9 +2792,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,9 +2813,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,49 +2837,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,76 +2867,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
-msgstr ""
-
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,13 +2927,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2954,7 +3104,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2996,6 +3146,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3146,12 +3293,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3269,6 +3425,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3296,12 +3455,18 @@ 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 ""
@@ -3344,7 +3509,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3395,10 +3566,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3757,9 +3928,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3787,6 +3955,9 @@ 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 erase this build?"
msgstr ""
@@ -4048,12 +4219,6 @@ msgstr[1] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr "ТърÑете в клоните"
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr "Превключване на клона"
-
msgid "Branches"
msgstr "Клони"
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5028,6 +5235,26 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr "Отказ"
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr "Избиране в клона"
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr "ОтмÑна в клона"
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5688,7 +5915,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5703,6 +5930,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr "отказано"
@@ -6036,21 +6266,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7325,16 +7594,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7349,6 +7642,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7391,6 +7729,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7430,6 +7771,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7451,6 +7795,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8245,10 +8577,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8302,6 +8637,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8314,6 +8652,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8329,6 +8670,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,13 +8991,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8647,8 +9024,8 @@ msgstr ""
msgid "Custom notification events"
msgstr "ПерÑонализирани ÑÑŠÐ±Ð¸Ñ‚Ð¸Ñ Ð·Ð° извеÑÑ‚Ñване"
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
-msgstr "ПерÑонализираните нива на извеÑÑ‚Ñване Ñа Ñъщите като нивата за учаÑтие. С перÑонализираните нива на извеÑÑ‚Ñване ще можете да получавате и извеÑÑ‚Ð¸Ñ Ð·Ð° избрани ÑъбитиÑ. За да научите повече, прегледайте %{notification_link}."
+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 ""
@@ -8689,6 +9066,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8722,6 +9102,18 @@ 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 ""
@@ -8886,7 +9278,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 ""
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9261,9 +9682,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9318,6 +9736,9 @@ msgstr "Задайте потребителÑки шаблон, използва
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr ""
msgid "Delete"
msgstr "Изтриване"
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9429,6 +9856,15 @@ 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 ""
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
-msgstr ""
-
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9660,6 +10093,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9678,9 +10114,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9690,19 +10123,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9717,10 +10150,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9735,7 +10165,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9756,10 +10186,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9768,7 +10204,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10047,18 +10482,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,7 +10710,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11048,19 +11468,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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."
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the issue description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the issue title"
-msgstr ""
-
-msgid "Enter the merge request description"
-msgstr ""
-
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11345,6 +11759,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11369,6 +11786,12 @@ 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 ""
@@ -11396,6 +11819,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11423,6 +11849,9 @@ 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 ""
@@ -11447,9 +11876,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11882,6 +12320,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11915,6 +12356,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12038,10 +12482,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12068,6 +12512,12 @@ 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 ""
@@ -12104,9 +12554,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,10 +12602,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12826,6 +13279,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr "Разклонение на"
@@ -12856,7 +13345,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12934,9 +13423,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13096,6 +13585,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13135,6 +13627,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13144,6 +13639,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13291,6 +13801,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13330,6 +13840,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13828,6 +14344,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14630,6 +15164,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15703,96 +16240,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16078,9 +16543,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ 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 ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ 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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16972,6 +17518,9 @@ 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 ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] "ПоÑÐ»ÐµÐ´Ð½Ð¸Ñ %d ден"
msgstr[1] "ПоÑледните %d дни"
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17085,6 +17640,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17118,6 +17676,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17169,9 +17730,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr "Ðаучете повече в"
@@ -17181,6 +17739,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr "Ðов клон"
@@ -19590,6 +20253,9 @@ msgstr ""
msgid "New directory"
msgstr "Ðова папка"
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr "Ðова заÑвка за Ñливане"
@@ -19737,6 +20406,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19788,6 +20466,9 @@ 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 ""
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr ""
msgid "Notification events"
msgstr "Ð¡ÑŠÐ±Ð¸Ñ‚Ð¸Ñ Ð·Ð° извеÑÑ‚Ñване"
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr "Прилагане на заÑвка за Ñливане"
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr "УчаÑтие"
msgid "NotificationLevel|Watch"
msgstr "Ðаблюдение"
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ 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."
+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."
@@ -20552,7 +21257,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20579,10 +21290,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20651,6 +21362,9 @@ 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 ""
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20762,6 +21473,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21077,6 +21809,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21284,9 +22028,6 @@ msgstr "План за Ñхема"
msgid "Pipeline Schedules"
msgstr "Планове за Ñхема"
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21308,10 +22049,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr "Графики за Ñхемите"
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,10 +22154,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ 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 ""
@@ -21665,6 +22415,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21923,21 +22685,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21959,6 +22739,12 @@ 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 ""
@@ -22067,6 +22853,9 @@ 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 ""
@@ -22151,24 +22940,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22205,6 +22976,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22562,6 +23336,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22790,10 +23567,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22805,7 +23579,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,13 +23672,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22937,13 +23714,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22970,16 +23750,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,52 +23816,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23381,6 +24164,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23396,6 +24188,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23408,22 +24206,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23432,6 +24230,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23522,9 +24326,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23675,7 +24476,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23771,7 +24572,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24072,6 +24921,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24243,6 +25098,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,7 +25269,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr "ЗаÑвка за доÑтъп"
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25595,7 +26480,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25721,6 +26612,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,10 +26627,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,19 +26744,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26161,7 +27062,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26338,6 +27239,9 @@ msgstr "Задайте парола на акаунта Ñи, за да може
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] "Показване на %d Ñъбитие"
msgstr[1] "Показване на %d ÑъбитиÑ"
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27287,9 +28194,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27479,12 +28383,15 @@ msgstr "Създайте %{new_merge_request} Ñ Ñ‚ÐµÐ·Ð¸ промени"
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27989,67 +28896,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28136,6 +29043,12 @@ 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 ""
@@ -28145,7 +29058,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr "Етапът на подготовка за издаване показÐ
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ 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 ""
@@ -29076,12 +30004,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29112,10 +30046,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29157,7 +30091,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29574,6 +30505,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30382,10 +31325,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30735,6 +31675,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30756,10 +31699,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31308,6 +32266,12 @@ 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|Packages"
msgstr ""
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ 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 ""
@@ -31653,6 +32713,9 @@ 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 ""
@@ -31668,6 +32731,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ 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 ""
@@ -31752,6 +32824,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31912,9 +32990,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32032,6 +33107,9 @@ msgstr "ÐеизвеÑтно"
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,10 +33847,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32832,9 +33943,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ 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 ""
@@ -33120,6 +34237,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33237,6 +34357,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr "Ðе можете да Ñъздавате повече проекти"
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33642,6 +34762,9 @@ 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 profile"
msgstr ""
@@ -33699,6 +34822,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 ""
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34215,6 +35350,9 @@ 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 ""
@@ -34354,6 +35492,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34698,7 +35836,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr "извеÑÑ‚Ð¸Ñ Ð¿Ð¾ е-поща"
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35128,6 +36272,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/bn_BD/gitlab.po b/locale/bn_BD/gitlab.po
index 90466370bb0..8c7de4a7da9 100644
--- a/locale/bn_BD/gitlab.po
+++ b/locale/bn_BD/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: bn\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:06\n"
+"PO-Revision-Date: 2021-03-05 23:49\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -170,6 +173,11 @@ 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] ""
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ 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 ""
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -682,6 +710,15 @@ 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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -976,6 +1016,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -988,9 +1031,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1015,9 +1055,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1111,6 +1148,11 @@ 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] ""
@@ -1162,6 +1204,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1282,6 +1327,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1635,9 +1779,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1716,12 +1857,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1818,6 +1965,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1938,6 +2103,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2058,6 +2226,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2091,6 +2268,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2259,6 +2442,15 @@ 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 ""
@@ -2268,6 +2460,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2361,6 +2562,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2394,6 +2607,21 @@ 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 ""
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2483,9 +2714,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2576,9 +2792,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,9 +2813,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,49 +2837,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,76 +2867,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,13 +2927,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2954,7 +3104,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2996,6 +3146,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3146,12 +3293,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3269,6 +3425,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3296,12 +3455,18 @@ 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 ""
@@ -3344,7 +3509,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3395,10 +3566,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3757,9 +3928,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3787,6 +3955,9 @@ 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 erase this build?"
msgstr ""
@@ -4048,12 +4219,6 @@ msgstr[1] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5028,6 +5235,26 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5688,7 +5915,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5703,6 +5930,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6036,21 +6266,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7325,16 +7594,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7349,6 +7642,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7391,6 +7729,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7430,6 +7771,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7451,6 +7795,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8245,10 +8577,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8302,6 +8637,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8314,6 +8652,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8329,6 +8670,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,13 +8991,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8647,7 +9024,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8689,6 +9066,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8722,6 +9102,18 @@ 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 ""
@@ -8886,7 +9278,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 ""
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9261,9 +9682,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9318,6 +9736,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9429,6 +9856,15 @@ 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 ""
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9660,6 +10093,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9678,9 +10114,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9690,19 +10123,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9717,10 +10150,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9735,7 +10165,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9756,10 +10186,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9768,7 +10204,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10047,18 +10482,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,7 +10710,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11048,19 +11468,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
-msgstr ""
-
-msgid "Enter the issue title"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11345,6 +11759,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11369,6 +11786,12 @@ 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 ""
@@ -11396,6 +11819,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11423,6 +11849,9 @@ 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 ""
@@ -11447,9 +11876,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11882,6 +12320,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11915,6 +12356,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12038,10 +12482,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12068,6 +12512,12 @@ 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 ""
@@ -12104,9 +12554,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,10 +12602,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12826,6 +13279,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12856,7 +13345,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12934,9 +13423,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13096,6 +13585,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13135,6 +13627,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13144,6 +13639,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13291,6 +13801,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13330,6 +13840,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13828,6 +14344,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14630,6 +15164,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15703,96 +16240,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16078,9 +16543,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ 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 ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ 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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16972,6 +17518,9 @@ 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 ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] ""
msgstr[1] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17085,6 +17640,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17118,6 +17676,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17169,9 +17730,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17181,6 +17739,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19590,6 +20253,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19737,6 +20406,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19788,6 +20466,9 @@ 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 ""
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ 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."
+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."
@@ -20552,7 +21257,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20579,10 +21290,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20651,6 +21362,9 @@ 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 ""
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20762,6 +21473,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21077,6 +21809,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21284,9 +22028,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21308,10 +22049,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,10 +22154,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ 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 ""
@@ -21665,6 +22415,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21923,21 +22685,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21959,6 +22739,12 @@ 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 ""
@@ -22067,6 +22853,9 @@ 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 ""
@@ -22151,24 +22940,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22205,6 +22976,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22562,6 +23336,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22790,10 +23567,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22805,7 +23579,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,13 +23672,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22937,13 +23714,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22970,16 +23750,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,52 +23816,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23381,6 +24164,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23396,6 +24188,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23408,22 +24206,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23432,6 +24230,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23522,9 +24326,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23675,7 +24476,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23771,7 +24572,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24072,6 +24921,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24243,6 +25098,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,7 +25269,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25595,7 +26480,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25721,6 +26612,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,10 +26627,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,19 +26744,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26161,7 +27062,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26338,6 +27239,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] ""
msgstr[1] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27287,9 +28194,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27479,12 +28383,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27989,67 +28896,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28136,6 +29043,12 @@ 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 ""
@@ -28145,7 +29058,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ 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 ""
@@ -29076,12 +30004,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29112,10 +30046,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29157,7 +30091,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29574,6 +30505,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30382,10 +31325,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30735,6 +31675,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30756,10 +31699,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31308,6 +32266,12 @@ 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|Packages"
msgstr ""
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ 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 ""
@@ -31653,6 +32713,9 @@ 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 ""
@@ -31668,6 +32731,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ 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 ""
@@ -31752,6 +32824,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31912,9 +32990,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32032,6 +33107,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,10 +33847,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32832,9 +33943,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ 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 ""
@@ -33120,6 +34237,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33237,6 +34357,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33642,6 +34762,9 @@ 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 profile"
msgstr ""
@@ -33699,6 +34822,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 ""
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34215,6 +35350,9 @@ 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 ""
@@ -34354,6 +35492,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34698,7 +35836,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35128,6 +36272,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/bn_IN/gitlab.po b/locale/bn_IN/gitlab.po
index de6a0d7dc94..916a44f5a68 100644
--- a/locale/bn_IN/gitlab.po
+++ b/locale/bn_IN/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: bn-IN\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:54\n"
+"PO-Revision-Date: 2021-03-05 23:52\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -170,6 +173,11 @@ 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] ""
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ 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 ""
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -682,6 +710,15 @@ 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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -976,6 +1016,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -988,9 +1031,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1015,9 +1055,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1111,6 +1148,11 @@ 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] ""
@@ -1162,6 +1204,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1282,6 +1327,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1635,9 +1779,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1716,12 +1857,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1818,6 +1965,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1938,6 +2103,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2058,6 +2226,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2091,6 +2268,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2259,6 +2442,15 @@ 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 ""
@@ -2268,6 +2460,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2361,6 +2562,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2394,6 +2607,21 @@ 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 ""
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2483,9 +2714,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2576,9 +2792,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,9 +2813,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,49 +2837,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,76 +2867,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,13 +2927,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2954,7 +3104,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2996,6 +3146,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3146,12 +3293,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3269,6 +3425,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3296,12 +3455,18 @@ 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 ""
@@ -3344,7 +3509,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3395,10 +3566,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3757,9 +3928,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3787,6 +3955,9 @@ 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 erase this build?"
msgstr ""
@@ -4048,12 +4219,6 @@ msgstr[1] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5028,6 +5235,26 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5688,7 +5915,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5703,6 +5930,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6036,21 +6266,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7325,16 +7594,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7349,6 +7642,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7391,6 +7729,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7430,6 +7771,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7451,6 +7795,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8245,10 +8577,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8302,6 +8637,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8314,6 +8652,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8329,6 +8670,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,13 +8991,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8647,7 +9024,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8689,6 +9066,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8722,6 +9102,18 @@ 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 ""
@@ -8886,7 +9278,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 ""
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9261,9 +9682,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9318,6 +9736,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9429,6 +9856,15 @@ 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 ""
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9660,6 +10093,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9678,9 +10114,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9690,19 +10123,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9717,10 +10150,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9735,7 +10165,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9756,10 +10186,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9768,7 +10204,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10047,18 +10482,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,7 +10710,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11048,19 +11468,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
-msgstr ""
-
-msgid "Enter the issue title"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11345,6 +11759,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11369,6 +11786,12 @@ 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 ""
@@ -11396,6 +11819,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11423,6 +11849,9 @@ 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 ""
@@ -11447,9 +11876,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11882,6 +12320,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11915,6 +12356,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12038,10 +12482,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12068,6 +12512,12 @@ 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 ""
@@ -12104,9 +12554,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,10 +12602,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12826,6 +13279,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12856,7 +13345,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12934,9 +13423,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13096,6 +13585,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13135,6 +13627,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13144,6 +13639,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13291,6 +13801,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13330,6 +13840,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13828,6 +14344,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14630,6 +15164,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15703,96 +16240,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16078,9 +16543,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ 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 ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ 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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16972,6 +17518,9 @@ 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 ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] ""
msgstr[1] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17085,6 +17640,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17118,6 +17676,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17169,9 +17730,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17181,6 +17739,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19590,6 +20253,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19737,6 +20406,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19788,6 +20466,9 @@ 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 ""
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ 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."
+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."
@@ -20552,7 +21257,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20579,10 +21290,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20651,6 +21362,9 @@ 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 ""
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20762,6 +21473,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21077,6 +21809,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21284,9 +22028,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21308,10 +22049,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,10 +22154,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ 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 ""
@@ -21665,6 +22415,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21923,21 +22685,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21959,6 +22739,12 @@ 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 ""
@@ -22067,6 +22853,9 @@ 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 ""
@@ -22151,24 +22940,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22205,6 +22976,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22562,6 +23336,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22790,10 +23567,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22805,7 +23579,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,13 +23672,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22937,13 +23714,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22970,16 +23750,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,52 +23816,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23381,6 +24164,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23396,6 +24188,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23408,22 +24206,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23432,6 +24230,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23522,9 +24326,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23675,7 +24476,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23771,7 +24572,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24072,6 +24921,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24243,6 +25098,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,7 +25269,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25595,7 +26480,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25721,6 +26612,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,10 +26627,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,19 +26744,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26161,7 +27062,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26338,6 +27239,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] ""
msgstr[1] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27287,9 +28194,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27479,12 +28383,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27989,67 +28896,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28136,6 +29043,12 @@ 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 ""
@@ -28145,7 +29058,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ 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 ""
@@ -29076,12 +30004,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29112,10 +30046,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29157,7 +30091,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29574,6 +30505,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30382,10 +31325,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30735,6 +31675,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30756,10 +31699,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31308,6 +32266,12 @@ 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|Packages"
msgstr ""
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ 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 ""
@@ -31653,6 +32713,9 @@ 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 ""
@@ -31668,6 +32731,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ 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 ""
@@ -31752,6 +32824,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31912,9 +32990,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32032,6 +33107,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,10 +33847,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32832,9 +33943,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ 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 ""
@@ -33120,6 +34237,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33237,6 +34357,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33642,6 +34762,9 @@ 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 profile"
msgstr ""
@@ -33699,6 +34822,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 ""
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34215,6 +35350,9 @@ 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 ""
@@ -34354,6 +35492,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34698,7 +35836,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35128,6 +36272,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/br_FR/gitlab.po b/locale/br_FR/gitlab.po
new file mode 100644
index 00000000000..b421f6d720b
--- /dev/null
+++ b/locale/br_FR/gitlab.po
@@ -0,0 +1,36990 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: gitlab-ee\n"
+"Report-Msgid-Bugs-To: \n"
+"Last-Translator: \n"
+"Language-Team: Breton\n"
+"Language: br_FR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=5; plural=(n%10==1 && (n%100!=11 || n%100!=71 || n%100!=91) ? 0 : n%10==2 && (n%100!=12 || n%100!=72 || n%100!=92) ? 1 : ((n%10>=3 && n%10<=4) || n%10==9) && ((n%100 < 10 || n%100 > 19) || (n%100 < 70 || n%100 > 79) || (n%100 < 90 || n%100 > 99)) ? 2 : (n!=0 && n%1;\n"
+"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-ID: 6\n"
+"PO-Revision-Date: 2021-03-05 23:51\n"
+
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
+msgstr ""
+
+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 "
+msgstr ""
+
+msgid " and %{sliced}"
+msgstr ""
+
+msgid " degraded on %d point"
+msgid_plural " degraded on %d points"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid " improved on %d point"
+msgid_plural " improved on %d points"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+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 "\"%{path}\" did not exist on \"%{ref}\""
+msgstr ""
+
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
+msgid "\"el\" parameter is required for createInstance()"
+msgstr ""
+
+msgid "%d Approval"
+msgid_plural "%d Approvals"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d Other"
+msgid_plural "%d Others"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d Package"
+msgid_plural "%d Packages"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d Scanned URL"
+msgid_plural "%d Scanned URLs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d URL scanned"
+msgid_plural "%d URLs scanned"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d approver"
+msgid_plural "%d approvers"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d approver (you've approved)"
+msgid_plural "%d approvers (you've approved)"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d changed file"
+msgid_plural "%d changed files"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d child epic"
+msgid_plural "%d child epics"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d code quality issue"
+msgid_plural "%d code quality issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d comment on this commit"
+msgid_plural "%d comments on this commit"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d commit"
+msgid_plural "%d commits"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d commit behind"
+msgid_plural "%d commits behind"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d commit,"
+msgid_plural "%d commits,"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d commits"
+msgstr ""
+
+msgid "%d completed issue"
+msgid_plural "%d completed issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d contribution"
+msgid_plural "%d contributions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d epic"
+msgid_plural "%d epics"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d error"
+msgid_plural "%d errors"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d error found:"
+msgid_plural "%d errors found:"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d exporter"
+msgid_plural "%d exporters"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d failed"
+msgid_plural "%d failed"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d failed security job"
+msgid_plural "%d failed security jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d fixed test result"
+msgid_plural "%d fixed test results"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d group"
+msgid_plural "%d groups"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d group selected"
+msgid_plural "%d groups selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d inaccessible merge request"
+msgid_plural "%d inaccessible merge requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d issue"
+msgid_plural "%d issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d issue in this group"
+msgid_plural "%d issues in this group"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d issue successfully imported with the label"
+msgid_plural "%d issues successfully imported with the label"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d layer"
+msgid_plural "%d layers"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d merge request"
+msgid_plural "%d merge requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d 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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d metric"
+msgid_plural "%d metrics"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d milestone"
+msgid_plural "%d milestones"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d more comment"
+msgid_plural "%d more comments"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d open issue"
+msgid_plural "%d open issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d pending comment"
+msgid_plural "%d pending comments"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d previously merged commit"
+msgid_plural "%d previously merged commits"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d project"
+msgid_plural "%d projects"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d project selected"
+msgid_plural "%d projects selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d request with warnings"
+msgid_plural "%d requests with warnings"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d shard selected"
+msgid_plural "%d shards selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d tag"
+msgid_plural "%d tags"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d tag per image name"
+msgid_plural "%d tags per image name"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d unassigned issue"
+msgid_plural "%d unassigned issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d unresolved thread"
+msgid_plural "%d unresolved threads"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d vulnerability"
+msgid_plural "%d vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d vulnerability dismissed"
+msgid_plural "%d vulnerabilities dismissed"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d warning found:"
+msgid_plural "%d warnings found:"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%{actionText} & %{openOrClose} %{noteable}"
+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 ""
+
+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 "%{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_timeago}"
+msgstr ""
+
+msgid "%{completedCount} completed weight"
+msgstr ""
+
+msgid "%{completedWeight} of %{totalWeight} weight completed"
+msgstr ""
+
+msgid "%{containerScanningLinkStart}Container Scanning%{containerScanningLinkEnd} and/or %{dependencyScanningLinkStart}Dependency Scanning%{dependencyScanningLinkEnd} must be enabled. %{securityBotLinkStart}GitLab-Security-Bot%{securityBotLinkEnd} will be the author of the auto-created merge request. %{moreInfoLinkStart}More information%{moreInfoLinkEnd}."
+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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%{count} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} files touched"
+msgstr ""
+
+msgid "%{count} issue selected"
+msgid_plural "%{count} issues selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%{count} items per page"
+msgstr ""
+
+msgid "%{count} merge request selected"
+msgid_plural "%{count} merge requests selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%{count} more"
+msgstr ""
+
+msgid "%{count} more assignees"
+msgstr ""
+
+msgid "%{count} more release"
+msgid_plural "%{count} more releases"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
+msgid "%{count} participant"
+msgid_plural "%{count} participants"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%{count} related %{pluralized_subject}: %{links}"
+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; %{default_branch_link_start}search on %{default_branch} instead%{default_branch_link_end}."
+msgstr ""
+
+msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
+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 "%{global_id} is not a valid ID for %{expected_type}."
+msgstr ""
+
+msgid "%{group_docs_link_start}Groups%{group_docs_link_end} allow you to manage and collaborate across multiple projects. Members of a group have access to all of its projects."
+msgstr ""
+
+msgid "%{group_name} group members"
+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; opened %{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 "%{issueType} actions"
+msgstr ""
+
+msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
+msgid "%{issuesSize} with a limit of %{maxIssueCount}"
+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}Scan Type:%{labelEnd} %{reportType}"
+msgstr ""
+
+msgid "%{labelStart}Scanner:%{labelEnd} %{scanner}"
+msgstr ""
+
+msgid "%{labelStart}Sent request:%{labelEnd} %{headers}"
+msgstr ""
+
+msgid "%{labelStart}Severity:%{labelEnd} %{severity}"
+msgstr ""
+
+msgid "%{labelStart}Unmodified response:%{labelEnd} %{headers}"
+msgstr ""
+
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
+msgid "%{label_name} %{span_open}will be permanently deleted from %{subject_name}. This cannot be undone.%{span_close}"
+msgstr ""
+
+msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA), that give digital certificates in order to enable HTTPS (SSL/TLS) for websites."
+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 "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
+msgid "%{link_start}Read more%{link_end} about role permissions"
+msgstr ""
+
+msgid "%{link_start}Remove the %{draft_or_wip_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} or %{wip_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
+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_name} (Past due)"
+msgstr ""
+
+msgid "%{milestone} (expired)"
+msgstr ""
+
+msgid "%{milliseconds}ms"
+msgstr ""
+
+msgid "%{mrText}, this issue will be closed automatically."
+msgstr ""
+
+msgid "%{name_with_link} 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} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
+msgstr ""
+
+msgid "%{name} %{status}"
+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 scheduled for %{action}"
+msgstr ""
+
+msgid "%{name}'s avatar"
+msgstr ""
+
+msgid "%{name}(%{url}) 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}(%{url}) has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
+msgstr ""
+
+msgid "%{no_of_days} day"
+msgid_plural "%{no_of_days} days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+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 "%{openOrClose} %{noteable}"
+msgstr ""
+
+msgid "%{openedEpics} open, %{closedEpics} closed"
+msgstr ""
+
+msgid "%{openedIssues} open, %{closedIssues} 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 "%{primary} (%{secondary})"
+msgstr ""
+
+msgid "%{ref} cannot be added: %{error}"
+msgstr ""
+
+msgid "%{releases} release"
+msgid_plural "%{releases} releases"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+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 "%{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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%{securityScanner} result is not available because a pipeline has not been run since it was enabled. %{linkStart}Run a pipeline%{linkEnd}"
+msgid_plural "%{securityScanner} results are not available because a pipeline has not been run since it was enabled. %{linkStart}Run a pipeline%{linkEnd}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+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 "%{startDate} - %{endDate}"
+msgstr ""
+
+msgid "%{start} to %{end}"
+msgstr ""
+
+msgid "%{state} epics"
+msgstr ""
+
+msgid "%{strongStart}Deletes%{strongEnd} source branch"
+msgstr ""
+
+msgid "%{strongStart}Note:%{strongEnd} Once a custom stage has been added you can re-order stages by dragging them into the desired position."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgstr ""
+
+msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
+msgid_plural "%{strong_start}%{branch_count}%{strong_end} Branches"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%{strong_start}%{commit_count}%{strong_end} Commit"
+msgid_plural "%{strong_start}%{commit_count}%{strong_end} Commits"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%{strong_start}%{count} approval rule%{strong_end} requires eligible members to approve before merging."
+msgid_plural "%{strong_start}%{count} approval rules%{strong_end} require eligible members to approve before merging."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%{strong_start}%{count} eligible member%{strong_end} must approve to merge."
+msgid_plural "%{strong_start}%{count} eligible members%{strong_end} must approve to merge."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%{strong_start}%{count} member%{strong_end} must approve to merge. Anyone with role Developer or higher can approve."
+msgid_plural "%{strong_start}%{count} members%{strong_end} must approve to merge. Anyone with role Developer or higher can approve."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%{strong_start}%{tag_count}%{strong_end} Tag"
+msgid_plural "%{strong_start}%{tag_count}%{strong_end} Tags"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+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} %{files}"
+msgid_plural "%{text} %{files} files"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+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 "%{token}..."
+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 "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
+msgid "%{userName} (cannot merge)"
+msgstr ""
+
+msgid "%{userName}'s avatar"
+msgstr ""
+
+msgid "%{user_name} profile page"
+msgstr ""
+
+msgid "%{username} has asked for a GitLab account on your instance %{host}:"
+msgstr ""
+
+msgid "%{username}'s avatar"
+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 "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
+msgstr ""
+
+msgid "&lt; 1 hour"
+msgstr ""
+
+msgid "'%{data}' at %{location} does not match format: %{format}"
+msgstr ""
+
+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 "'%{name}' stage already exists"
+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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+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 "(max size 15 MB)"
+msgstr ""
+
+msgid "(removed)"
+msgstr ""
+
+msgid "(revoked)"
+msgstr ""
+
+msgid "* * * * *"
+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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "+%{approvers} more approvers"
+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 ", or "
+msgstr ""
+
+msgid "- Available to run jobs."
+msgstr ""
+
+msgid "- Event"
+msgid_plural "- Events"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "- Not available to run jobs."
+msgstr ""
+
+msgid "- User"
+msgid_plural "- Users"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "- of - weight completed"
+msgstr ""
+
+msgid "- show less"
+msgstr ""
+
+msgid "."
+msgstr ""
+
+msgid "0 bytes"
+msgstr ""
+
+msgid "0 for unlimited"
+msgstr ""
+
+msgid "0 for unlimited, only effective with remote storage enabled."
+msgstr ""
+
+msgid "0t1DgySidms"
+msgstr ""
+
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "1 Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "1 closed issue"
+msgid_plural "%{issues} closed issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "1 closed merge request"
+msgid_plural "%{merge_requests} closed merge requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "1 day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "1 deploy key"
+msgid_plural "%d deploy keys"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "1 follower"
+msgid_plural "%{count} followers"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "1 group"
+msgid_plural "%d groups"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "1 hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "1 merged merge request"
+msgid_plural "%{merge_requests} merged merge requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "1 minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "1 open issue"
+msgid_plural "%{issues} open issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "1 open merge request"
+msgid_plural "%{merge_requests} open merge requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "1 pipeline"
+msgid_plural "%d pipelines"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "1 role"
+msgid_plural "%d roles"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "1 user"
+msgid_plural "%{num} users"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "1-9 contributions"
+msgstr ""
+
+msgid "10-19 contributions"
+msgstr ""
+
+msgid "1000+"
+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 Let's Encrypt account will be configured for this GitLab installation using your email address. You will receive emails to warn of expiring certificates."
+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 description is required"
+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 fork is a copy of a project."
+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 label list displays issues with the selected label."
+msgstr ""
+
+msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
+msgstr ""
+
+msgid "A maximum of %{count} participants can be added"
+msgstr ""
+
+msgid "A member of the abuse team will review your report as soon as possible."
+msgstr ""
+
+msgid "A merge request approval is required when a security report contains a new vulnerability of high, critical, or unknown severity."
+msgstr ""
+
+msgid "A merge request approval is required when the license compliance report contains a denied license."
+msgstr ""
+
+msgid "A merge request hasn't yet been merged"
+msgstr ""
+
+msgid "A new Auto DevOps pipeline has been created, go to %{pipelines_link_start}Pipelines page%{pipelines_link_end} 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 branch will be created in your fork and a new merge request will be started."
+msgstr ""
+
+msgid "A new impersonation token 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 plain-text response to show to clients that hit the rate limit."
+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 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 is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
+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 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 secure token that identifies an external storage request."
+msgstr ""
+
+msgid "A sign-in to your account has been made from the following IP address: %{ip}"
+msgstr ""
+
+msgid "A string appended to the project path to form the Service Desk email address."
+msgstr ""
+
+msgid "A title is required"
+msgstr ""
+
+msgid "A user can only participate in a rotation once"
+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 Fuzzing"
+msgstr ""
+
+msgid "API Fuzzing Configuration"
+msgstr ""
+
+msgid "API Help"
+msgstr ""
+
+msgid "API Token"
+msgstr ""
+
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
+msgid "AWS Access Key"
+msgstr ""
+
+msgid "AWS Access Key. Only required if not using role instance credentials"
+msgstr ""
+
+msgid "AWS Secret Access Key"
+msgstr ""
+
+msgid "AWS Secret Access Key. Only required if not using role instance credentials"
+msgstr ""
+
+msgid "AWS service error: %{error}"
+msgstr ""
+
+msgid "Abort"
+msgstr ""
+
+msgid "About GitLab"
+msgstr ""
+
+msgid "About GitLab CE"
+msgstr ""
+
+msgid "About auto deploy"
+msgstr ""
+
+msgid "About this feature"
+msgstr ""
+
+msgid "Abuse Reports"
+msgstr ""
+
+msgid "Abuse reports"
+msgstr ""
+
+msgid "Accept invitation"
+msgstr ""
+
+msgid "Accept terms"
+msgstr ""
+
+msgid "Acceptable for use in this project"
+msgstr ""
+
+msgid "Access Tokens"
+msgstr ""
+
+msgid "Access denied for your LDAP account."
+msgstr ""
+
+msgid "Access denied! Please verify you can add deploy keys to this repository."
+msgstr ""
+
+msgid "Access denied: %{error}"
+msgstr ""
+
+msgid "Access expiration date"
+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 to Pages websites are controlled based on the user's membership to a given project. By checking this box, users will be required to be logged in to have access to all Pages websites in your instance."
+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|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 gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgstr ""
+
+msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgstr ""
+
+msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+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 is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgstr ""
+
+msgid "AccessTokens|Your incoming email token is used to authenticate 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 is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgstr ""
+
+msgid "AccessTokens|reset it"
+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: %{account}"
+msgstr ""
+
+msgid "Action to take when receiving an alert. %{docsLink}"
+msgstr ""
+
+msgid "Actions"
+msgstr ""
+
+msgid "Activate Service Desk"
+msgstr ""
+
+msgid "Activate user activity analysis"
+msgstr ""
+
+msgid "Active"
+msgstr ""
+
+msgid "Active %{type} (%{token_length})"
+msgstr ""
+
+msgid "Active Sessions"
+msgstr ""
+
+msgid "Activity"
+msgstr ""
+
+msgid "Add"
+msgstr ""
+
+msgid "Add \"%{value}\""
+msgstr ""
+
+msgid "Add %d issue"
+msgid_plural "Add %d issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+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 GitLab to Slack"
+msgstr ""
+
+msgid "Add Group Webhooks and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Add Jaeger URL"
+msgstr ""
+
+msgid "Add Kubernetes cluster"
+msgstr ""
+
+msgid "Add LICENSE"
+msgstr ""
+
+msgid "Add New Node"
+msgstr ""
+
+msgid "Add README"
+msgstr ""
+
+msgid "Add Variable"
+msgstr ""
+
+msgid "Add Zoom meeting"
+msgstr ""
+
+msgid "Add a %{type}"
+msgstr ""
+
+msgid "Add a GPG key"
+msgstr ""
+
+msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
+msgstr ""
+
+msgid "Add a bullet list"
+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 general comment to this %{noteableDisplayName}."
+msgstr ""
+
+msgid "Add a general comment to this %{noteable_name}."
+msgstr ""
+
+msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
+msgstr ""
+
+msgid "Add a line"
+msgstr ""
+
+msgid "Add a link"
+msgstr ""
+
+msgid "Add a new issue"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
+msgid "Add a related issue"
+msgstr ""
+
+msgid "Add a table"
+msgstr ""
+
+msgid "Add a task list"
+msgstr ""
+
+msgid "Add a to do"
+msgstr ""
+
+msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
+msgstr ""
+
+msgid "Add an SSH key"
+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 child epic to an epic"
+msgstr ""
+
+msgid "Add comment now"
+msgstr ""
+
+msgid "Add comment to design"
+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 domain"
+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 issues"
+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 previously merged commits"
+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 to Slack"
+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 user(s) to the group:"
+msgstr ""
+
+msgid "Add users to group"
+msgstr ""
+
+msgid "Add variable"
+msgstr ""
+
+msgid "Add webhook"
+msgstr ""
+
+msgid "Add/remove"
+msgstr ""
+
+msgid "AddContextCommits|Add previously merged commits"
+msgstr ""
+
+msgid "AddContextCommits|Add/remove"
+msgstr ""
+
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+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 at"
+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 text"
+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 "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 Area"
+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|Groups"
+msgstr ""
+
+msgid "AdminArea|Guest"
+msgstr ""
+
+msgid "AdminArea|Included Free in license"
+msgstr ""
+
+msgid "AdminArea|Latest groups"
+msgstr ""
+
+msgid "AdminArea|Latest projects"
+msgstr ""
+
+msgid "AdminArea|Latest users"
+msgstr ""
+
+msgid "AdminArea|Maintainer"
+msgstr ""
+
+msgid "AdminArea|New group"
+msgstr ""
+
+msgid "AdminArea|New project"
+msgstr ""
+
+msgid "AdminArea|New user"
+msgstr ""
+
+msgid "AdminArea|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 "AdminArea|Owner"
+msgstr ""
+
+msgid "AdminArea|Projects"
+msgstr ""
+
+msgid "AdminArea|Reporter"
+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|User cap"
+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 "AdminNote|Note"
+msgstr ""
+
+msgid "AdminProjects| You’re about to permanently delete the project %{projectName}, its repository, and all related resources including issues, merge requests, etc.. Once 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|Apply integration settings to all Projects"
+msgstr ""
+
+msgid "AdminSettings|Auto DevOps domain"
+msgstr ""
+
+msgid "AdminSettings|Disable feed token"
+msgstr ""
+
+msgid "AdminSettings|Enable shared runners for new projects"
+msgstr ""
+
+msgid "AdminSettings|Environment variables are protected by default"
+msgstr ""
+
+msgid "AdminSettings|Feed token"
+msgstr ""
+
+msgid "AdminSettings|Go to General Settings"
+msgstr ""
+
+msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
+msgstr ""
+
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
+msgid "AdminSettings|Moved to integrations"
+msgstr ""
+
+msgid "AdminSettings|No required pipeline"
+msgstr ""
+
+msgid "AdminSettings|PlantUML, Slack application, Third party offers, Snowplow, Amazon EKS have moved to Settings &gt; General."
+msgstr ""
+
+msgid "AdminSettings|Required pipeline configuration"
+msgstr ""
+
+msgid "AdminSettings|Select a pipeline configuration file"
+msgstr ""
+
+msgid "AdminSettings|Select a template"
+msgstr ""
+
+msgid "AdminSettings|Service Templates will soon be deprecated."
+msgstr ""
+
+msgid "AdminSettings|Service template allows you to set default values for integrations"
+msgstr ""
+
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
+msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgstr ""
+
+msgid "AdminSettings|Some settings have moved"
+msgstr ""
+
+msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
+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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
+msgstr ""
+
+msgid "AdminSettings|Try using the latest version of Integrations instead."
+msgstr ""
+
+msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+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|(Blocked)"
+msgstr ""
+
+msgid "AdminUsers|(Deactivated)"
+msgstr ""
+
+msgid "AdminUsers|(Internal)"
+msgstr ""
+
+msgid "AdminUsers|(Pending approval)"
+msgstr ""
+
+msgid "AdminUsers|2FA Disabled"
+msgstr ""
+
+msgid "AdminUsers|2FA Enabled"
+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"
+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|Administrators have access to all groups, projects and users and can manage all features in this installation"
+msgstr ""
+
+msgid "AdminUsers|Admins"
+msgstr ""
+
+msgid "AdminUsers|Approve"
+msgstr ""
+
+msgid "AdminUsers|Approve user"
+msgstr ""
+
+msgid "AdminUsers|Approved users can:"
+msgstr ""
+
+msgid "AdminUsers|Are you sure?"
+msgstr ""
+
+msgid "AdminUsers|Automatically marked as default internal user"
+msgstr ""
+
+msgid "AdminUsers|Be added to groups and projects"
+msgstr ""
+
+msgid "AdminUsers|Block"
+msgstr ""
+
+msgid "AdminUsers|Block this user"
+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|Deactivate"
+msgstr ""
+
+msgid "AdminUsers|Deactivate user"
+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"
+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|It's you!"
+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 request"
+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 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|This user has requested access"
+msgstr ""
+
+msgid "AdminUsers|To confirm, type %{projectName}"
+msgstr ""
+
+msgid "AdminUsers|To confirm, type %{username}"
+msgstr ""
+
+msgid "AdminUsers|Unblock"
+msgstr ""
+
+msgid "AdminUsers|Unblock user"
+msgstr ""
+
+msgid "AdminUsers|Unblock user %{username}?"
+msgstr ""
+
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+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 cannot remove your own admin rights."
+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|View pending user approvals"
+msgstr ""
+
+msgid "Admin|Your instance has reached its user cap"
+msgstr ""
+
+msgid "Advanced"
+msgstr ""
+
+msgid "Advanced Search"
+msgstr ""
+
+msgid "Advanced Search with Elasticsearch"
+msgstr ""
+
+msgid "Advanced Settings"
+msgstr ""
+
+msgid "Advanced export options"
+msgstr ""
+
+msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
+msgstr ""
+
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
+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 sign-out path"
+msgstr ""
+
+msgid "After that, you will not be able to use merge approvals or code quality as well as many other features."
+msgstr ""
+
+msgid "After that, you will not be able to use merge approvals or epics as well as many other features."
+msgstr ""
+
+msgid "After that, you will not be able to use merge approvals or epics as well as many security features."
+msgstr ""
+
+msgid "Alert"
+msgid_plural "Alerts"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+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|Add new integration"
+msgstr ""
+
+msgid "AlertSettings|Authorization key"
+msgstr ""
+
+msgid "AlertSettings|Configure details"
+msgstr ""
+
+msgid "AlertSettings|Customize alert payload mapping (optional)"
+msgstr ""
+
+msgid "AlertSettings|Delete integration"
+msgstr ""
+
+msgid "AlertSettings|Edit payload"
+msgstr ""
+
+msgid "AlertSettings|Enter integration name"
+msgstr ""
+
+msgid "AlertSettings|External Prometheus"
+msgstr ""
+
+msgid "AlertSettings|HTTP Endpoint"
+msgstr ""
+
+msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
+msgstr ""
+
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
+msgstr ""
+
+msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
+msgstr ""
+
+msgid "AlertSettings|Name integration"
+msgstr ""
+
+msgid "AlertSettings|Parse payload for custom mapping"
+msgstr ""
+
+msgid "AlertSettings|Proceed with editing"
+msgstr ""
+
+msgid "AlertSettings|Prometheus API base URL"
+msgstr ""
+
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
+msgstr ""
+
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
+msgstr ""
+
+msgid "AlertSettings|Reset Key"
+msgstr ""
+
+msgid "AlertSettings|Reset the mapping"
+msgstr ""
+
+msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
+msgstr ""
+
+msgid "AlertSettings|Sample alert payload (optional)"
+msgstr ""
+
+msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
+msgstr ""
+
+msgid "AlertSettings|Save integration"
+msgstr ""
+
+msgid "AlertSettings|Select integration type"
+msgstr ""
+
+msgid "AlertSettings|Send"
+msgstr ""
+
+msgid "AlertSettings|Send test alert"
+msgstr ""
+
+msgid "AlertSettings|URL cannot be blank and must start with http or https"
+msgstr ""
+
+msgid "AlertSettings|Utilize the URL and authorization key below to authorize Prometheus to send alerts to GitLab. Review the Prometheus documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgstr ""
+
+msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgstr ""
+
+msgid "AlertSettings|View credentials"
+msgstr ""
+
+msgid "AlertSettings|Webhook URL"
+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|Your integration was successfully updated."
+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|Current integrations"
+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 has been successfully removed."
+msgstr ""
+
+msgid "AlertsIntegrations|The integration has been successfully saved. Alerts from this new integration should now appear on your alerts list."
+msgstr ""
+
+msgid "AlertsIntegrations|The integration token could not be reset. Please try again."
+msgstr ""
+
+msgid "AlertsIntegrations|The test alert has been successfully sent, and should now be visible on your alerts list."
+msgstr ""
+
+msgid "AlertsIntegrations|You have opted to delete the %{integrationName} integration. Do you want to proceed? It means you will no longer receive alerts from this endpoint in your alert list, and this action cannot be undone."
+msgstr ""
+
+msgid "Algorithm"
+msgstr ""
+
+msgid "All"
+msgstr ""
+
+msgid "All %{replicableType} are being scheduled for %{action}"
+msgstr ""
+
+msgid "All (default)"
+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 epics"
+msgstr ""
+
+msgid "All features are enabled for blank projects, from templates, or when importing, but you can disable them afterward in the project settings."
+msgstr ""
+
+msgid "All groups and projects"
+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 URL%{relative_url_link_end}."
+msgstr ""
+
+msgid "All projects"
+msgstr ""
+
+msgid "All projects selected"
+msgstr ""
+
+msgid "All threads resolved"
+msgstr ""
+
+msgid "All users must have a name."
+msgstr ""
+
+msgid "Allow \"%{group_name}\" to sign you in"
+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 only the selected protocols to be used for Git access."
+msgstr ""
+
+msgid "Allow overrides to approval lists per merge request (MR)"
+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 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 rendering of PlantUML diagrams in Asciidoc documents."
+msgstr ""
+
+msgid "Allow rendering of diagrams in AsciiDoc and Markdown documents using %{link}."
+msgstr ""
+
+msgid "Allow repository mirroring to be configured by project maintainers"
+msgstr ""
+
+msgid "Allow requests to the local network from hooks and services."
+msgstr ""
+
+msgid "Allow requests to the local network from system hooks"
+msgstr ""
+
+msgid "Allow requests to the local network from web hooks and services"
+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 node to replicate content on Object Storage"
+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 domains for sign-ups"
+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 "Also called \"Issuer\" or \"Relying party trust identifier\""
+msgstr ""
+
+msgid "Also called \"Relying party service URL\" or \"Reply URL\""
+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"
+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 "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
+msgstr ""
+
+msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
+msgstr ""
+
+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 empty index will be created if one does not already exist"
+msgstr ""
+
+msgid "An error has occurred"
+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 previewing the blob"
+msgstr ""
+
+msgid "An error occurred when removing the label."
+msgstr ""
+
+msgid "An error occurred when toggling the notification subscription"
+msgstr ""
+
+msgid "An error occurred when updating the issue due date"
+msgstr ""
+
+msgid "An error occurred when updating the issue title"
+msgstr ""
+
+msgid "An error occurred when updating the issue weight"
+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 branches. Retry the search."
+msgstr ""
+
+msgid "An error occurred while fetching codequality mr diff reports."
+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 markdown preview"
+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 sidebar data"
+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 board lists. Please try again."
+msgstr ""
+
+msgid "An error occurred while fetching the builds."
+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 pipeline."
+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 generating a username. Please try again."
+msgstr ""
+
+msgid "An error occurred while getting autocomplete data. Please refresh the page and try again."
+msgstr ""
+
+msgid "An error occurred while getting files for - %{branchId}"
+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 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 project creation UI"
+msgstr ""
+
+msgid "An error occurred while loading the access tokens form, please try again."
+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 members, 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 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 requesting data from the Jira service"
+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 searching users."
+msgstr ""
+
+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 milestone."
+msgstr ""
+
+msgid "An error occurred while updating the notification settings. 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 instance-level serverless domain already exists."
+msgstr ""
+
+msgid "An issue already exists"
+msgstr ""
+
+msgid "An issue can be a bug, a todo or a feature request that needs to be discussed in a project. Besides, issues are searchable and filterable."
+msgstr ""
+
+msgid "An issue title is required"
+msgstr ""
+
+msgid "An unauthenticated user"
+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 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 source code and git history for secrets."
+msgstr ""
+
+msgid "Analyze your source code for known vulnerabilities."
+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 branch"
+msgstr ""
+
+msgid "Any eligible user"
+msgstr ""
+
+msgid "Any encrypted tokens"
+msgstr ""
+
+msgid "Any files larger than this limit will not be indexed, and thus will not be searchable."
+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 "Any user"
+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 "Applications"
+msgstr ""
+
+msgid "Applied"
+msgstr ""
+
+msgid "Apply"
+msgstr ""
+
+msgid "Apply a label"
+msgstr ""
+
+msgid "Apply a template"
+msgstr ""
+
+msgid "Apply changes"
+msgstr ""
+
+msgid "Apply suggestion"
+msgstr ""
+
+msgid "Apply suggestions"
+msgstr ""
+
+msgid "Apply template"
+msgstr ""
+
+msgid "Apply this approval rule to any branch or a specific protected branch."
+msgstr ""
+
+msgid "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 "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "ApprovalRuleRemove|Approvals from this member are not revoked."
+msgid_plural "ApprovalRuleRemove|Approvals from these members are not revoked."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "ApprovalRuleRemove|You are about to remove the %{name} approver group which has %{nMembers}."
+msgstr ""
+
+msgid "ApprovalRuleSummary|%d member"
+msgid_plural "ApprovalRuleSummary|%d members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "ApprovalRule|Approval rules"
+msgstr ""
+
+msgid "ApprovalRule|Approvals required"
+msgstr ""
+
+msgid "ApprovalRule|Approvers"
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|Rule name"
+msgstr ""
+
+msgid "ApprovalRule|Target branch"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
+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 "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 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 delete this project?"
+msgstr ""
+
+msgid "Are you sure that you want to archive this project?"
+msgstr ""
+
+msgid "Are you sure that you want to unarchive this project?"
+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 device? This action cannot be undone."
+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 erase this build?"
+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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+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 regenerate the public key? You will have to update the public key on the remote server before mirroring will work again."
+msgstr ""
+
+msgid "Are you sure you want to reindex?"
+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 identity?"
+msgstr ""
+
+msgid "Are you sure you want to remove this list?"
+msgstr ""
+
+msgid "Are you sure you want to reset the SCIM token? SCIM provisioning will stop working until the new token is updated."
+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 nickname?"
+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 stop this environment?"
+msgstr ""
+
+msgid "Are you sure you want to unlock %{path_lock_path}?"
+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 "Are you sure? This will invalidate your registered applications and U2F / WebAuthn devices."
+msgstr ""
+
+msgid "Are you sure? This will invalidate your registered applications and U2F devices."
+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|Asana - Teamwork without email"
+msgstr ""
+
+msgid "AsanaService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgstr ""
+
+msgid "AsanaService|User Personal Access Token. User must have access to task, all comments will be attributed to this user."
+msgstr ""
+
+msgid "Ascending"
+msgstr ""
+
+msgid "Ask your group maintainer 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 some issues to this milestone."
+msgstr ""
+
+msgid "Assign to"
+msgstr ""
+
+msgid "Assign to commenting user"
+msgstr ""
+
+msgid "Assign yourself to these issues"
+msgstr ""
+
+msgid "Assign yourself to this issue"
+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 %{name}"
+msgstr ""
+
+msgid "Assigned to me"
+msgstr ""
+
+msgid "Assigned to you"
+msgstr ""
+
+msgid "Assignee"
+msgid_plural "%d Assignees"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "Assignee has no permissions"
+msgstr ""
+
+msgid "Assignee lists not available with your current license"
+msgstr ""
+
+msgid "Assignee lists show all issues assigned to the selected user."
+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 logging option is required to be enabled"
+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 a file"
+msgid_plural "Attaching %d files"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "Attaching the file failed."
+msgstr ""
+
+msgid "Audit Events"
+msgstr ""
+
+msgid "Audit Events is a way to keep track of important events that happened in GitLab."
+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|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 "Aug"
+msgstr ""
+
+msgid "August"
+msgstr ""
+
+msgid "Authenticate"
+msgstr ""
+
+msgid "Authenticate with GitHub"
+msgstr ""
+
+msgid "Authenticated API request rate limit"
+msgstr ""
+
+msgid "Authenticated web request rate limit"
+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 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 "Authors: %{authors}"
+msgstr ""
+
+msgid "Auto DevOps"
+msgstr ""
+
+msgid "Auto DevOps enabled"
+msgstr ""
+
+msgid "Auto DevOps, runners and job artifacts"
+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 "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 "Automatically close incidents when the associated Prometheus alert resolves."
+msgstr ""
+
+msgid "Automatically create merge requests for vulnerabilities that have fixes available."
+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 for dependency and container scanning"
+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 for %{name}"
+msgstr ""
+
+msgid "Avatar will be removed. Are you sure?"
+msgstr ""
+
+msgid "Average per day: %{average}"
+msgstr ""
+
+msgid "Back to page %{number}"
+msgstr ""
+
+msgid "Background Color"
+msgstr ""
+
+msgid "Background Jobs"
+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 "Balsamiq file could not be loaded."
+msgstr ""
+
+msgid "BambooService|A continuous integration and build server"
+msgstr ""
+
+msgid "BambooService|A user with API access, if applicable"
+msgstr ""
+
+msgid "BambooService|Atlassian Bamboo CI"
+msgstr ""
+
+msgid "BambooService|Bamboo build plan key like KEY"
+msgstr ""
+
+msgid "BambooService|Bamboo root URL like https://bamboo.example.com"
+msgstr ""
+
+msgid "BambooService|You must set up automatic revision labeling and a repository trigger in Bamboo."
+msgstr ""
+
+msgid "Based on"
+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 "Begin with the selected commit"
+msgstr ""
+
+msgid "Below are the fingerprints for the current instance SSH host keys."
+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} plan."
+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|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|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|monthly"
+msgstr ""
+
+msgid "BillingPlans|per user"
+msgstr ""
+
+msgid "BillingPlan|Contact sales"
+msgstr ""
+
+msgid "BillingPlan|Upgrade"
+msgstr ""
+
+msgid "BillingPlan|Upgrade for free"
+msgstr ""
+
+msgid "Billing|An email address is only visible for users with public emails."
+msgstr ""
+
+msgid "Billing|An error occurred while loading billable members list"
+msgstr ""
+
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
+msgid "Billing|Enter at least three characters to search."
+msgstr ""
+
+msgid "Billing|Group"
+msgstr ""
+
+msgid "Billing|No users to display."
+msgstr ""
+
+msgid "Billing|Private"
+msgstr ""
+
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
+msgid "Billing|Type to search"
+msgstr ""
+
+msgid "Billing|User was successfully removed"
+msgstr ""
+
+msgid "Billing|Users occupying seats in"
+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 "Block user"
+msgstr ""
+
+msgid "Blocked"
+msgstr ""
+
+msgid "Blocked by %d issue"
+msgid_plural "Blocked by %d issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "Blocked issue"
+msgstr ""
+
+msgid "Blocking issues"
+msgstr ""
+
+msgid "Blocks"
+msgstr ""
+
+msgid "Blog"
+msgstr ""
+
+msgid "Board scope affects which issues are displayed for anyone who visits this board"
+msgstr ""
+
+msgid "BoardNewIssue|No matching results"
+msgstr ""
+
+msgid "BoardNewIssue|Projects"
+msgstr ""
+
+msgid "BoardNewIssue|Search projects"
+msgstr ""
+
+msgid "BoardNewIssue|Select a project"
+msgstr ""
+
+msgid "Boards"
+msgstr ""
+
+msgid "Boards and Board Lists"
+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 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 generating lists. Please reload the page."
+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 list. Please try again."
+msgstr ""
+
+msgid "Boards|Board"
+msgstr ""
+
+msgid "Boards|Collapse"
+msgstr ""
+
+msgid "Boards|Edit board"
+msgstr ""
+
+msgid "Boards|Expand"
+msgstr ""
+
+msgid "Boards|View scope"
+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 issues"
+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 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|Cant 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 merged branches"
+msgstr ""
+
+msgid "Branches|Delete protected branch"
+msgstr ""
+
+msgid "Branches|Delete protected branch '%{branch_name}'?"
+msgstr ""
+
+msgid "Branches|Deleting the '%{branch_name}' 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 %{delete_protected_branch}, 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|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|Sort by"
+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 %{default_branch}."
+msgstr ""
+
+msgid "Branches|To avoid data loss, consider merging this branch before deleting it."
+msgstr ""
+
+msgid "Branches|To confirm, type %{branch_name_confirmation}:"
+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|You’re about to permanently delete the protected branch %{branch_name}."
+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 "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|Existing groups"
+msgstr ""
+
+msgid "BulkImport|From source group"
+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|Importing the group failed"
+msgstr ""
+
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+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|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|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 "Burndown charts are now fixed. This means that removing issues from a milestone after it has expired won't affect the chart. You can view the old chart using the %{strongStart}Legacy burndown chart%{strongEnd} button."
+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 License"
+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 clicking Register, I agree that I have read and accepted the %{company_name} %{linkStart}Terms of Use and Privacy Policy%{linkEnd}"
+msgstr ""
+
+msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
+msgstr ""
+
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
+msgid "By default, all projects and groups will use the global notifications setting."
+msgstr ""
+
+msgid "By default, if any ref (branch, tag, or commit) on the remote mirror has diverged from the local repository, the entire push will fail, and nothing will be updated. Choose this option to override this behavior. After the mirror is created, this can only be modified via the API."
+msgstr ""
+
+msgid "ByAuthor|by"
+msgstr ""
+
+msgid "CHANGELOG"
+msgstr ""
+
+msgid "CI / CD"
+msgstr ""
+
+msgid "CI / CD Analytics"
+msgstr ""
+
+msgid "CI / CD Settings"
+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 configuration"
+msgstr ""
+
+msgid "CI/CD configuration file"
+msgstr ""
+
+msgid "CI/CD for external repo"
+msgstr ""
+
+msgid "CI/CD settings"
+msgstr ""
+
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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|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|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgstr ""
+
+msgid "CICD|The Auto DevOps pipeline will run 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 "Callback URL"
+msgstr ""
+
+msgid "Can be manually deployed to"
+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, keep project"
+msgstr ""
+
+msgid "Canceled deployment to"
+msgstr ""
+
+msgid "Cancelling Preview"
+msgstr ""
+
+msgid "Cannot be assigned to other projects."
+msgstr ""
+
+msgid "Cannot be merged automatically"
+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 enable shared runners because parent group does not allow it"
+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 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 set confidential epic for a non-confidential issue"
+msgstr ""
+
+msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
+msgstr ""
+
+msgid "Cannot skip two factor authentication setup"
+msgstr ""
+
+msgid "Capacity threshold"
+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 milestone"
+msgstr ""
+
+msgid "Change path"
+msgstr ""
+
+msgid "Change permissions"
+msgstr ""
+
+msgid "Change reviewer(s)"
+msgstr ""
+
+msgid "Change reviewer(s)."
+msgstr ""
+
+msgid "Change status"
+msgstr ""
+
+msgid "Change subscription"
+msgstr ""
+
+msgid "Change template"
+msgstr ""
+
+msgid "Change this value to influence how frequently the GitLab UI polls for updates."
+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|A new branch will be created in your fork and a new merge request will be started."
+msgstr ""
+
+msgid "ChangeTypeAction|Cherry-pick"
+msgstr ""
+
+msgid "ChangeTypeAction|Pick into branch"
+msgstr ""
+
+msgid "ChangeTypeAction|Revert"
+msgstr ""
+
+msgid "ChangeTypeAction|Revert in branch"
+msgstr ""
+
+msgid "ChangeTypeAction|Search branches"
+msgstr ""
+
+msgid "ChangeTypeAction|Start a %{newMergeRequest} with these changes"
+msgstr ""
+
+msgid "ChangeTypeAction|Switch branch"
+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 assignee(s)."
+msgstr ""
+
+msgid "Changed reviewer(s)."
+msgstr ""
+
+msgid "Changed the title to \"%{title_param}\"."
+msgstr ""
+
+msgid "Changes"
+msgstr ""
+
+msgid "Changes affect new repositories only. If not specified, Git's default name %{branch_name_default} will be used."
+msgstr ""
+
+msgid "Changes affect new repositories only. If not specified, either the configured application-wide default or Git's default name %{branch_name_default} will be used."
+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 are still tracked. Useful for cluster/index migrations."
+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 "Changes won't take place until the index is %{link_start}recreated%{link_end}."
+msgstr ""
+
+msgid "Changing group URL can have unintended side effects."
+msgstr ""
+
+msgid "Channel handle (e.g. town-square)"
+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 %{docs_link_start}documentation%{docs_link_end}."
+msgstr ""
+
+msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
+msgstr ""
+
+msgid "Check your Docker 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 URL availability..."
+msgstr ""
+
+msgid "Checking group path availability..."
+msgstr ""
+
+msgid "Checking username availability..."
+msgstr ""
+
+msgid "Checkout"
+msgstr ""
+
+msgid "Checkout|$%{selectedPlanPrice} per user per year"
+msgstr ""
+
+msgid "Checkout|%{cardType} ending in %{lastFourDigits}"
+msgstr ""
+
+msgid "Checkout|%{name}'s GitLab subscription"
+msgstr ""
+
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
+msgid "Checkout|(x%{numberOfUsers})"
+msgstr ""
+
+msgid "Checkout|Billing address"
+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|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 register credit card. Please try again."
+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|Select"
+msgstr ""
+
+msgid "Checkout|State"
+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|Total"
+msgstr ""
+
+msgid "Checkout|Users"
+msgstr ""
+
+msgid "Checkout|You'll create your new group after checkout"
+msgstr ""
+
+msgid "Checkout|Your organization"
+msgstr ""
+
+msgid "Checkout|Your subscription will be applied to this group"
+msgstr ""
+
+msgid "Checkout|Zip code"
+msgstr ""
+
+msgid "Checkout|company or team"
+msgstr ""
+
+msgid "Cherry-pick this commit"
+msgstr ""
+
+msgid "Cherry-pick this merge request"
+msgstr ""
+
+msgid "Child"
+msgstr ""
+
+msgid "Child epic does not exist."
+msgstr ""
+
+msgid "Child epic doesn't exist."
+msgstr ""
+
+msgid "Chinese language support using"
+msgstr ""
+
+msgid "Choose a branch/tag (e.g. %{master}) or enter a commit (e.g. %{sha}) to see what's changed or to create a merge request."
+msgstr ""
+
+msgid "Choose a file"
+msgstr ""
+
+msgid "Choose a group"
+msgstr ""
+
+msgid "Choose a role permission"
+msgstr ""
+
+msgid "Choose a template"
+msgstr ""
+
+msgid "Choose a template..."
+msgstr ""
+
+msgid "Choose a type..."
+msgstr ""
+
+msgid "Choose any color"
+msgstr ""
+
+msgid "Choose any color."
+msgstr ""
+
+msgid "Choose any color. Or you can choose one of the suggested colors below"
+msgstr ""
+
+msgid "Choose file…"
+msgstr ""
+
+msgid "Choose labels"
+msgstr ""
+
+msgid "Choose specific groups or storage shards"
+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|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 ""
+
+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 recent searches"
+msgstr ""
+
+msgid "Clear search"
+msgstr ""
+
+msgid "Clear search input"
+msgstr ""
+
+msgid "Clear start date"
+msgstr ""
+
+msgid "Clear templates search input"
+msgstr ""
+
+msgid "Clear weight"
+msgstr ""
+
+msgid "Cleared weight."
+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 button below."
+msgstr ""
+
+msgid "Click to expand it."
+msgstr ""
+
+msgid "Click to expand text"
+msgstr ""
+
+msgid "Client authentication certificate"
+msgstr ""
+
+msgid "Client authentication key"
+msgstr ""
+
+msgid "Client authentication key password"
+msgstr ""
+
+msgid "Client request timeout"
+msgstr ""
+
+msgid "Clients"
+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 "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 %{tabname}"
+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 epics"
+msgstr ""
+
+msgid "Closed issues"
+msgstr ""
+
+msgid "Closed this %{quick_action_target}."
+msgstr ""
+
+msgid "Closed: %{closed}"
+msgstr ""
+
+msgid "Closes this %{quick_action_target}."
+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 specificed for Stages::ClusterEndpointInserter"
+msgstr ""
+
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
+msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
+msgstr ""
+
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
+msgid "ClusterAgents|Configuration"
+msgstr ""
+
+msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
+msgstr ""
+
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
+msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
+msgstr ""
+
+msgid "ClusterAgents|Integrate with the GitLab Agent"
+msgstr ""
+
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Name"
+msgstr ""
+
+msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
+msgstr ""
+
+msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
+msgid "ClusterAgent|This feature is only available for premium plans"
+msgstr ""
+
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+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 "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
+msgstr ""
+
+msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
+msgstr ""
+
+msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgstr ""
+
+msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
+msgstr ""
+
+msgid "ClusterIntegration|%{title} uninstalled successfully."
+msgstr ""
+
+msgid "ClusterIntegration|%{title} updated successfully."
+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|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 ""
+
+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|All data not committed to GitLab will be deleted and cannot be restored."
+msgstr ""
+
+msgid "ClusterIntegration|All data will be deleted and cannot be restored."
+msgstr ""
+
+msgid "ClusterIntegration|All installed applications and related resources"
+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|Alternatively, "
+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|Any running pipelines will be canceled."
+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|Blocking mode"
+msgstr ""
+
+msgid "ClusterIntegration|CA Certificate"
+msgstr ""
+
+msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
+msgstr ""
+
+msgid "ClusterIntegration|Cert-Manager"
+msgstr ""
+
+msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
+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 applications to install on your Kubernetes cluster."
+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 (alpha)"
+msgstr ""
+
+msgid "ClusterIntegration|Cluster name is required."
+msgstr ""
+
+msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
+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|Clusters connected with a certificate"
+msgstr ""
+
+msgid "ClusterIntegration|Connect cluster with certificate"
+msgstr ""
+
+msgid "ClusterIntegration|Connect existing cluster"
+msgstr ""
+
+msgid "ClusterIntegration|Connection Error"
+msgstr ""
+
+msgid "ClusterIntegration|Copy API URL"
+msgstr ""
+
+msgid "ClusterIntegration|Copy CA Certificate"
+msgstr ""
+
+msgid "ClusterIntegration|Copy Ingress Endpoint"
+msgstr ""
+
+msgid "ClusterIntegration|Copy Jupyter Hostname"
+msgstr ""
+
+msgid "ClusterIntegration|Copy Knative Endpoint"
+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 provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
+msgstr ""
+
+msgid "ClusterIntegration|Create cluster on"
+msgstr ""
+
+msgid "ClusterIntegration|Create new cluster"
+msgstr ""
+
+msgid "ClusterIntegration|Create new cluster on EKS"
+msgstr ""
+
+msgid "ClusterIntegration|Create new cluster on GKE"
+msgstr ""
+
+msgid "ClusterIntegration|Creating Kubernetes cluster"
+msgstr ""
+
+msgid "ClusterIntegration|Crossplane"
+msgstr ""
+
+msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
+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|Elastic Stack"
+msgstr ""
+
+msgid "ClusterIntegration|Enable Cloud Run for Anthos"
+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|Enabled stack"
+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|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|Fluentd"
+msgstr ""
+
+msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
+msgstr ""
+
+msgid "ClusterIntegration|GitLab Agent managed clusters"
+msgstr ""
+
+msgid "ClusterIntegration|GitLab Container Network Policies"
+msgstr ""
+
+msgid "ClusterIntegration|GitLab Integration"
+msgstr ""
+
+msgid "ClusterIntegration|GitLab Runner"
+msgstr ""
+
+msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
+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|Global default"
+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|Helm release failed to install"
+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 ""
+
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus in the Applications tab."
+msgstr ""
+
+msgid "ClusterIntegration|Ingress"
+msgstr ""
+
+msgid "ClusterIntegration|Ingress Endpoint"
+msgstr ""
+
+msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
+msgstr ""
+
+msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
+msgstr ""
+
+msgid "ClusterIntegration|Instance cluster"
+msgstr ""
+
+msgid "ClusterIntegration|Instance type"
+msgstr ""
+
+msgid "ClusterIntegration|Integrate Kubernetes with a cluster certificate"
+msgstr ""
+
+msgid "ClusterIntegration|Integrate with a cluster certificate"
+msgstr ""
+
+msgid "ClusterIntegration|Issuer Email"
+msgstr ""
+
+msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
+msgstr ""
+
+msgid "ClusterIntegration|Jupyter Hostname"
+msgstr ""
+
+msgid "ClusterIntegration|JupyterHub"
+msgstr ""
+
+msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
+msgstr ""
+
+msgid "ClusterIntegration|Key pair name"
+msgstr ""
+
+msgid "ClusterIntegration|Knative"
+msgstr ""
+
+msgid "ClusterIntegration|Knative Domain Name:"
+msgstr ""
+
+msgid "ClusterIntegration|Knative Endpoint:"
+msgstr ""
+
+msgid "ClusterIntegration|Knative domain name was updated successfully."
+msgstr ""
+
+msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
+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 clusters allow you to use review apps, deploy your applications, run your pipelines, and much more in an easy way."
+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|Legacy Helm Tiller server"
+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|Logging mode"
+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 deployment cluster found for this job"
+msgstr ""
+
+msgid "ClusterIntegration|No deployment found for this job"
+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 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 ""
+
+msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
+msgstr ""
+
+msgid "ClusterIntegration|Project cluster"
+msgstr ""
+
+msgid "ClusterIntegration|Project namespace (optional, unique)"
+msgstr ""
+
+msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
+msgstr ""
+
+msgid "ClusterIntegration|Prometheus"
+msgstr ""
+
+msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
+msgstr ""
+
+msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
+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|Real-time web application monitoring, logging and access control. %{linkStart}More information%{linkEnd}"
+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|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
+msgstr ""
+
+msgid "ClusterIntegration|Request to begin installing failed"
+msgstr ""
+
+msgid "ClusterIntegration|Request to begin uninstalling failed"
+msgstr ""
+
+msgid "ClusterIntegration|SIEM Hostname"
+msgstr ""
+
+msgid "ClusterIntegration|SIEM Port"
+msgstr ""
+
+msgid "ClusterIntegration|SIEM Protocol"
+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 domains"
+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 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 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 stack to install Crossplane."
+msgstr ""
+
+msgid "ClusterIntegration|Select a zone to choose a network"
+msgstr ""
+
+msgid "ClusterIntegration|Select existing domain or use new"
+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 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|Send Container Network Policies Logs"
+msgstr ""
+
+msgid "ClusterIntegration|Send Web Application Firewall Logs"
+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|Set the global mode for the WAF in this cluster. This can be overridden at the environmental level."
+msgstr ""
+
+msgid "ClusterIntegration|Something went wrong on our end."
+msgstr ""
+
+msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
+msgstr ""
+
+msgid "ClusterIntegration|Something went wrong while installing %{title}"
+msgstr ""
+
+msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
+msgstr ""
+
+msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
+msgstr ""
+
+msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
+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 %{gitlabNamespace} namespace"
+msgstr ""
+
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+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 associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
+msgstr ""
+
+msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
+msgstr ""
+
+msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
+msgstr ""
+
+msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
+msgstr ""
+
+msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
+msgstr ""
+
+msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
+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 access your application after deployment, point a wildcard DNS to the Knative Endpoint."
+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|Uninstall %{appTitle}"
+msgstr ""
+
+msgid "ClusterIntegration|Unknown Error"
+msgstr ""
+
+msgid "ClusterIntegration|Update %{appTitle}"
+msgstr ""
+
+msgid "ClusterIntegration|Update failed. Please check the logs and try again."
+msgstr ""
+
+msgid "ClusterIntegration|Use %{query}"
+msgstr ""
+
+msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
+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|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 ""
+
+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 are about to uninstall %{appTitle} from your cluster."
+msgstr ""
+
+msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
+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 must have an RBAC-enabled cluster to install Knative."
+msgstr ""
+
+msgid "ClusterIntegration|You must specify a domain before you can install Knative."
+msgstr ""
+
+msgid "ClusterIntegration|You should select at least two subnets"
+msgstr ""
+
+msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
+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|can be used instead of a custom domain. "
+msgstr ""
+
+msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
+msgstr ""
+
+msgid "ClusterIntegration|meets the requirements"
+msgstr ""
+
+msgid "ClusterIntegration|sign up"
+msgstr ""
+
+msgid "ClusterIntergation|Select a VPC"
+msgstr ""
+
+msgid "ClusterIntergation|Select a network"
+msgstr ""
+
+msgid "ClusterIntergation|Select a security group"
+msgstr ""
+
+msgid "ClusterIntergation|Select a subnet"
+msgstr ""
+
+msgid "ClusterIntergation|Select a subnetwork"
+msgstr ""
+
+msgid "ClusterIntergation|Select an instance type"
+msgstr ""
+
+msgid "ClusterIntergation|Select key pair"
+msgstr ""
+
+msgid "ClusterIntergation|Select service role"
+msgstr ""
+
+msgid "Clusters|An error occurred while loading clusters"
+msgstr ""
+
+msgid "Code"
+msgstr ""
+
+msgid "Code Coverage: %{coveragePercentage}"
+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 "CodeIntelligence|This is the definition"
+msgstr ""
+
+msgid "CodeNavigation|No references found"
+msgstr ""
+
+msgid "CodeOwner|Pattern"
+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 sidebar"
+msgstr ""
+
+msgid "Collapses this file (only for you) until it’s changed again."
+msgstr ""
+
+msgid "Collector hostname"
+msgstr ""
+
+msgid "ComboSearch is not defined"
+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 & close %{noteable_name}"
+msgstr ""
+
+msgid "Comment & reopen %{noteable_name}"
+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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "Commit %{commit_id}"
+msgstr ""
+
+msgid "Commit (when editing commit message)"
+msgstr ""
+
+msgid "Commit Message"
+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 name"
+msgstr ""
+
+msgid "Compare"
+msgstr ""
+
+msgid "Compare %{oldCommitId}...%{newCommitId}"
+msgstr ""
+
+msgid "Compare Git revisions"
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
+msgstr ""
+
+msgid "Complete"
+msgstr ""
+
+msgid "Completed"
+msgstr ""
+
+msgid "Compliance"
+msgstr ""
+
+msgid "Compliance Dashboard"
+msgstr ""
+
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
+msgid "ComplianceDashboard|created by:"
+msgstr ""
+
+msgid "ComplianceFrameworks|Add framework"
+msgstr ""
+
+msgid "ComplianceFrameworks|All"
+msgstr ""
+
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
+msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
+msgstr ""
+
+msgid "ComplianceFrameworks|Regulated"
+msgstr ""
+
+msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
+msgstr ""
+
+msgid "ComplianceFrameworks|Unable to save this compliance framework. Please try again"
+msgstr ""
+
+msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
+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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
+msgid "ComplianceFramework|GDPR"
+msgstr ""
+
+msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
+msgstr ""
+
+msgid "ComplianceFramework|HIPAA"
+msgstr ""
+
+msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
+msgstr ""
+
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
+msgid "ComplianceFramework|PCI-DSS"
+msgstr ""
+
+msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
+msgstr ""
+
+msgid "ComplianceFramework|SOC 2"
+msgstr ""
+
+msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
+msgstr ""
+
+msgid "ComplianceFramework|SOX"
+msgstr ""
+
+msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
+msgstr ""
+
+msgid "ComplianceFramework|This project is regulated by %{framework}."
+msgstr ""
+
+msgid "Confidence"
+msgstr ""
+
+msgid "Confidential"
+msgstr ""
+
+msgid "Confidentiality"
+msgstr ""
+
+msgid "Configuration"
+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 Let's Encrypt"
+msgstr ""
+
+msgid "Configure Prometheus"
+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 automatic git checks and housekeeping on repositories."
+msgstr ""
+
+msgid "Configure existing installation"
+msgstr ""
+
+msgid "Configure limit for issues created per minute by web and API requests."
+msgstr ""
+
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
+msgid "Configure limits for Project/Group Import/Export."
+msgstr ""
+
+msgid "Configure limits for web and API requests."
+msgstr ""
+
+msgid "Configure limits on the number of inbound alerts able to be sent to a project."
+msgstr ""
+
+msgid "Configure paths to be protected by Rack Attack."
+msgstr ""
+
+msgid "Configure repository mirroring."
+msgstr ""
+
+msgid "Configure storage path settings."
+msgstr ""
+
+msgid "Configure the %{link} integration."
+msgstr ""
+
+msgid "Configure the way a user creates a new account."
+msgstr ""
+
+msgid "Configure which lists are shown for anyone who visits this board"
+msgstr ""
+
+msgid "Confirm"
+msgstr ""
+
+msgid "Confirmation email sent to %{email}"
+msgstr ""
+
+msgid "Confirmation required"
+msgstr ""
+
+msgid "Confluence"
+msgstr ""
+
+msgid "ConfluenceService|Confluence Workspace"
+msgstr ""
+
+msgid "ConfluenceService|Connect a Confluence Cloud Workspace to GitLab"
+msgstr ""
+
+msgid "ConfluenceService|Enabling the Confluence Workspace will disable the default GitLab Wiki. Your GitLab Wiki data will be saved and you can always re-enable it later by turning off this integration"
+msgstr ""
+
+msgid "ConfluenceService|The URL of the Confluence Workspace"
+msgstr ""
+
+msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
+msgstr ""
+
+msgid "Congratulations, your free trial is activated."
+msgstr ""
+
+msgid "Connect"
+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 Sales to upgrade"
+msgstr ""
+
+msgid "Contact support"
+msgstr ""
+
+msgid "Container Registry"
+msgstr ""
+
+msgid "Container Scanning"
+msgstr ""
+
+msgid "Container does not exist"
+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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "ContainerRegistry|%{count} Tag"
+msgid_plural "ContainerRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "ContainerRegistry|%{imageName} tags"
+msgstr ""
+
+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|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 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 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"
+msgstr ""
+
+msgid "ContainerRegistry|Deleting the image repository will delete all images and tags inside. This action cannot be undone."
+msgstr ""
+
+msgid "ContainerRegistry|Deletion disabled due to missing or insufficient permissions."
+msgstr ""
+
+msgid "ContainerRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "ContainerRegistry|Docker connection error"
+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 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|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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "ContainerRegistry|Remove tags matching:"
+msgstr ""
+
+msgid "ContainerRegistry|Remove tags older than:"
+msgstr ""
+
+msgid "ContainerRegistry|Remove these tags"
+msgstr ""
+
+msgid "ContainerRegistry|Run 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 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 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 Registry, which could be due to an issue with your project name or path. %{docLinkStart}More information%{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 "Contains %{count} blobs of images (%{size})"
+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."
+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 the display of third party offers."
+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 %{protocol} clone URL"
+msgstr ""
+
+msgid "Copy %{proxy_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 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 email address"
+msgstr ""
+
+msgid "Copy environment"
+msgstr ""
+
+msgid "Copy evidence SHA"
+msgstr ""
+
+msgid "Copy file contents"
+msgstr ""
+
+msgid "Copy file path"
+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 value"
+msgstr ""
+
+msgid "Copy to clipboard"
+msgstr ""
+
+msgid "Copy token"
+msgstr ""
+
+msgid "Copy trigger token"
+msgstr ""
+
+msgid "Copy value"
+msgstr ""
+
+msgid "CorpusManagement|Fuzz testing corpus management"
+msgstr ""
+
+msgid "Could not add admins as members"
+msgstr ""
+
+msgid "Could not archive %{design}. Please try again."
+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 find design."
+msgstr ""
+
+msgid "Could not find iteration"
+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 the trigger."
+msgstr ""
+
+msgid "Could not restore the group"
+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 revoke project access token %{project_access_token_name}."
+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 "Country"
+msgstr ""
+
+msgid "Coverage"
+msgstr ""
+
+msgid "Coverage Fuzzing"
+msgstr ""
+
+msgid "Coverage value for this pipeline was calculated by the coverage value of %d job."
+msgid_plural "Coverage value for this pipeline was calculated by averaging the resulting coverage values of %d jobs."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "Create"
+msgstr ""
+
+msgid "Create %{environment}"
+msgstr ""
+
+msgid "Create %{type}"
+msgstr ""
+
+msgid "Create New Directory"
+msgstr ""
+
+msgid "Create New Domain"
+msgstr ""
+
+msgid "Create Project"
+msgstr ""
+
+msgid "Create Value Stream"
+msgstr ""
+
+msgid "Create a GitLab account first, and then connect it to your %{label} account."
+msgstr ""
+
+msgid "Create a Mattermost team for this group"
+msgstr ""
+
+msgid "Create a local proxy for storing frequently used upstream images. %{link_start}Learn more%{link_end} about dependency proxies."
+msgstr ""
+
+msgid "Create a merge request"
+msgstr ""
+
+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 repository"
+msgstr ""
+
+msgid "Create a personal access token on your account to pull or push via %{protocol}."
+msgstr ""
+
+msgid "Create a project pre-populated with the necessary files to get you started quickly."
+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 blank project"
+msgstr ""
+
+msgid "Create branch"
+msgstr ""
+
+msgid "Create commit"
+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 from template"
+msgstr ""
+
+msgid "Create group"
+msgstr ""
+
+msgid "Create group label"
+msgstr ""
+
+msgid "Create issue"
+msgstr ""
+
+msgid "Create iteration"
+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 CI/CD pipeline"
+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 issue in Jira"
+msgstr ""
+
+msgid "Create new label"
+msgstr ""
+
+msgid "Create new..."
+msgstr ""
+
+msgid "Create project"
+msgstr ""
+
+msgid "Create project label"
+msgstr ""
+
+msgid "Create release"
+msgstr ""
+
+msgid "Create requirement"
+msgstr ""
+
+msgid "Create snippet"
+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 "CreateTokenToCloneLink|create a personal access token"
+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 Value Stream"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create from default template"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create from no template"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create new 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 %{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 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 "Credentials"
+msgstr ""
+
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
+msgid "CredentialsInventory|No credentials found"
+msgstr ""
+
+msgid "CredentialsInventory|Personal Access Tokens"
+msgstr ""
+
+msgid "CredentialsInventory|SSH Keys"
+msgstr ""
+
+msgid "Critical vulnerabilities present"
+msgstr ""
+
+msgid "Cron Timezone"
+msgstr ""
+
+msgid "Cron time zone"
+msgstr ""
+
+msgid "Crossplane"
+msgstr ""
+
+msgid "Current"
+msgstr ""
+
+msgid "Current Branch"
+msgstr ""
+
+msgid "Current Project"
+msgstr ""
+
+msgid "Current forks will keep their visibility level."
+msgstr ""
+
+msgid "Current node"
+msgstr ""
+
+msgid "Current node must be the primary node or you will be locking yourself out"
+msgstr ""
+
+msgid "Current password"
+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 "CustomCycleAnalytics|Add a stage"
+msgstr ""
+
+msgid "CustomCycleAnalytics|Add stage"
+msgstr ""
+
+msgid "CustomCycleAnalytics|Editing stage"
+msgstr ""
+
+msgid "CustomCycleAnalytics|End event label"
+msgstr ""
+
+msgid "CustomCycleAnalytics|New stage"
+msgstr ""
+
+msgid "CustomCycleAnalytics|Stage name already exists"
+msgstr ""
+
+msgid "CustomCycleAnalytics|Start event label"
+msgstr ""
+
+msgid "Customer Portal"
+msgstr ""
+
+msgid "Customizable by an administrator."
+msgstr ""
+
+msgid "Customizable by owners."
+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 "CustomizeHomepageBanner|Do you want to customize this page?"
+msgstr ""
+
+msgid "CustomizeHomepageBanner|Go to preferences"
+msgstr ""
+
+msgid "CustomizeHomepageBanner|This page shows a list of your projects by default but it can be changed to show projects' activity, groups, your to-do list, assigned issues, assigned merge requests, and more. You can change this under \"Homepage content\" in your preferences"
+msgstr ""
+
+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|%{stageCount} stages selected"
+msgstr ""
+
+msgid "CycleAnalytics|All stages"
+msgstr ""
+
+msgid "CycleAnalytics|Date"
+msgstr ""
+
+msgid "CycleAnalytics|Days to completion"
+msgstr ""
+
+msgid "CycleAnalytics|Display chart filters"
+msgstr ""
+
+msgid "CycleAnalytics|No stages selected"
+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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "CycleAnalytics|Select labels"
+msgstr ""
+
+msgid "CycleAnalytics|Show"
+msgstr ""
+
+msgid "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCount} labels"
+msgstr ""
+
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgstr ""
+
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgstr ""
+
+msgid "CycleAnalytics|Stages"
+msgstr ""
+
+msgid "CycleAnalytics|Tasks by type"
+msgstr ""
+
+msgid "CycleAnalytics|The given date range is larger than 180 days"
+msgstr ""
+
+msgid "CycleAnalytics|The total time spent in the selected stage for the items that were completed on each date. Data limited to the last 500 items."
+msgstr ""
+
+msgid "CycleAnalytics|Total days to completion"
+msgstr ""
+
+msgid "CycleAnalytics|Type of work"
+msgstr ""
+
+msgid "CycleAnalytics|group dropdown filter"
+msgstr ""
+
+msgid "CycleAnalytics|not allowed for the given start event"
+msgstr ""
+
+msgid "CycleAnalytics|project dropdown filter"
+msgstr ""
+
+msgid "CycleAnalytics|stage dropdown"
+msgstr ""
+
+msgid "DAG visualization requires at least 3 dependent jobs."
+msgstr ""
+
+msgid "DAST Scans"
+msgstr ""
+
+msgid "DNS"
+msgstr ""
+
+msgid "Dashboard"
+msgstr ""
+
+msgid "Dashboard uid not found"
+msgstr ""
+
+msgid "DashboardProjects|All"
+msgstr ""
+
+msgid "DashboardProjects|Personal"
+msgstr ""
+
+msgid "DashboardProjects|Trending"
+msgstr ""
+
+msgid "Dashboards"
+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 "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|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|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 saved scan. Please refresh the page, or try again later."
+msgstr ""
+
+msgid "DastProfiles|Could not delete saved scans:"
+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 saved scans. Please refresh the page, or try again later."
+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 Scan"
+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|Error Details"
+msgstr ""
+
+msgid "DastProfiles|Excluded URLs"
+msgstr ""
+
+msgid "DastProfiles|Excluded URLs (Optional)"
+msgstr ""
+
+msgid "DastProfiles|Hide debug messages"
+msgstr ""
+
+msgid "DastProfiles|Include debug messages in the DAST console output."
+msgstr ""
+
+msgid "DastProfiles|Manage DAST scans"
+msgstr ""
+
+msgid "DastProfiles|Manage 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 scans saved 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|Please enter a valid timeout value"
+msgstr ""
+
+msgid "DastProfiles|Profile name"
+msgstr ""
+
+msgid "DastProfiles|Request headers"
+msgstr ""
+
+msgid "DastProfiles|Run scan"
+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|Saved Scans"
+msgstr ""
+
+msgid "DastProfiles|Scan"
+msgstr ""
+
+msgid "DastProfiles|Scan mode"
+msgstr ""
+
+msgid "DastProfiles|Scanner Profile"
+msgstr ""
+
+msgid "DastProfiles|Scanner Profiles"
+msgstr ""
+
+msgid "DastProfiles|Scanner name"
+msgstr ""
+
+msgid "DastProfiles|Show debug messages"
+msgstr ""
+
+msgid "DastProfiles|Site Profile"
+msgstr ""
+
+msgid "DastProfiles|Site Profiles"
+msgstr ""
+
+msgid "DastProfiles|Site name"
+msgstr ""
+
+msgid "DastProfiles|Spider timeout"
+msgstr ""
+
+msgid "DastProfiles|Target"
+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|Turn on AJAX spider"
+msgstr ""
+
+msgid "DastProfiles|URL"
+msgstr ""
+
+msgid "DastProfiles|Username"
+msgstr ""
+
+msgid "DastProfiles|Username form field"
+msgstr ""
+
+msgid "DastProfiles|Validated"
+msgstr ""
+
+msgid "DastProfiles|Validation status"
+msgstr ""
+
+msgid "DastSiteValidation|Copy HTTP header 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|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 text to the target site"
+msgstr ""
+
+msgid "DastSiteValidation|Step 3 - Confirm header 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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+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 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 "Database update failed"
+msgstr ""
+
+msgid "Datasource name not found"
+msgstr ""
+
+msgid "Date"
+msgstr ""
+
+msgid "Date picker"
+msgstr ""
+
+msgid "Date range"
+msgstr ""
+
+msgid "Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
+msgid "Date range is greater than %{quarter_days} 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 "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 "Default CI configuration path"
+msgstr ""
+
+msgid "Default artifacts expiration"
+msgstr ""
+
+msgid "Default branch"
+msgstr ""
+
+msgid "Default branch and protected branches"
+msgstr ""
+
+msgid "Default classification label"
+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 initial branch name"
+msgstr ""
+
+msgid "Default project deletion protection"
+msgstr ""
+
+msgid "Default projects limit"
+msgstr ""
+
+msgid "Default: Map a FogBugz account ID to a full name"
+msgstr ""
+
+msgid "DefaultBranchLabel|default"
+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 approval settings."
+msgstr ""
+
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+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 "Definition"
+msgstr ""
+
+msgid "Delayed Project Deletion (%{adjourned_deletion})"
+msgstr ""
+
+msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
+msgstr ""
+
+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|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 Value Stream"
+msgstr ""
+
+msgid "Delete account"
+msgstr ""
+
+msgid "Delete artifacts"
+msgstr ""
+
+msgid "Delete badge"
+msgstr ""
+
+msgid "Delete comment"
+msgstr ""
+
+msgid "Delete domain"
+msgstr ""
+
+msgid "Delete label"
+msgstr ""
+
+msgid "Delete label: %{label_name} ?"
+msgstr ""
+
+msgid "Delete pipeline"
+msgstr ""
+
+msgid "Delete project"
+msgstr ""
+
+msgid "Delete project. Are you ABSOLUTELY SURE?"
+msgstr ""
+
+msgid "Delete serverless domain?"
+msgstr ""
+
+msgid "Delete snippet"
+msgstr ""
+
+msgid "Delete snippet?"
+msgstr ""
+
+msgid "Delete source branch"
+msgstr ""
+
+msgid "Delete subscription"
+msgstr ""
+
+msgid "Delete this attachment"
+msgstr ""
+
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
+msgid "Delete user list"
+msgstr ""
+
+msgid "Delete variable"
+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 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 Projects"
+msgstr ""
+
+msgid "Deleted chat nickname: %{chat_name}!"
+msgstr ""
+
+msgid "Deleted projects"
+msgstr ""
+
+msgid "Deleted projects cannot be restored!"
+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, merge requests, etc."
+msgstr ""
+
+msgid "Deletion pending. This project will be removed on %{date}. Repository and other project resources are read-only."
+msgstr ""
+
+msgid "Denied"
+msgstr ""
+
+msgid "Denied authorization of chat nickname %{user_name}."
+msgstr ""
+
+msgid "Denied domains for sign-ups"
+msgstr ""
+
+msgid "Deny"
+msgstr ""
+
+msgid "Deny access request"
+msgstr ""
+
+msgid "Denylist file"
+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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "Dependencies|%d more"
+msgid_plural "Dependencies|%d more"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "Dependencies|%d vulnerability detected"
+msgid_plural "Dependencies|%d vulnerabilities detected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+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 proxy"
+msgstr ""
+
+msgid "Dependency proxy URL"
+msgstr ""
+
+msgid "Dependency proxy feature is limited to public groups for now."
+msgstr ""
+
+msgid "DependencyProxy|Toggle Dependency Proxy"
+msgstr ""
+
+msgid "Depends on %d merge request being merged"
+msgid_plural "Depends on %d merge requests being merged"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "Depends on %{strongStart}%{closedCount} closed%{strongEnd} merge request."
+msgid_plural "Depends on %{strongStart}%{closedCount} closed%{strongEnd} merge requests."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "Deploy"
+msgid_plural "Deploys"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "Deploy Keys"
+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 to..."
+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|Freeze end"
+msgstr ""
+
+msgid "DeployFreeze|Freeze start"
+msgstr ""
+
+msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{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 "DeployKeys|You are going to remove this deploy key. Are you sure?"
+msgstr ""
+
+msgid "DeployTokens|Active Deploy Tokens (%{active_tokens})"
+msgstr ""
+
+msgid "DeployTokens|Add a deploy token"
+msgstr ""
+
+msgid "DeployTokens|Allows read access to the package registry."
+msgstr ""
+
+msgid "DeployTokens|Allows read-only access to registry images."
+msgstr ""
+
+msgid "DeployTokens|Allows read-only access to the repository."
+msgstr ""
+
+msgid "DeployTokens|Allows write access to registry images."
+msgstr ""
+
+msgid "DeployTokens|Allows write access to the package registry."
+msgstr ""
+
+msgid "DeployTokens|Copy deploy token"
+msgstr ""
+
+msgid "DeployTokens|Copy username"
+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|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|Pick a name for your unique deploy token."
+msgstr ""
+
+msgid "DeployTokens|Revoke"
+msgstr ""
+
+msgid "DeployTokens|Revoke %{b_start}%{name}%{b_end}?"
+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|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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|You are about to revoke %{b_start}%{name}%{b_end}."
+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 Frequency"
+msgstr ""
+
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
+msgid "DeploymentFrequencyCharts|Date"
+msgstr ""
+
+msgid "DeploymentFrequencyCharts|Deployments"
+msgstr ""
+
+msgid "DeploymentFrequencyCharts|Deployments charts"
+msgstr ""
+
+msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
+msgstr ""
+
+msgid "DeploymentFrequencyCharts|These charts display the frequency of deployments to the production environment, as part of the DORA 4 metrics. The environment must be named %{codeStart}production%{codeEnd} for its data to appear in these charts."
+msgstr ""
+
+msgid "Deployments"
+msgstr ""
+
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "Deployment|API"
+msgstr ""
+
+msgid "Deployment|This deployment was created using the API"
+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 "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 templates allow you to define context-specific templates for issue and merge request description fields for your project."
+msgstr ""
+
+msgid "Description:"
+msgstr ""
+
+msgid "Descriptive label"
+msgstr ""
+
+msgid "Deselect all"
+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."
+msgstr ""
+
+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|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."
+msgstr ""
+
+msgid "DesignManagement|Your designs are being copied and are on their way… Please refresh to update."
+msgstr ""
+
+msgid "DesignManagement|and %{moreCount} more."
+msgstr ""
+
+msgid "Designs"
+msgstr ""
+
+msgid "Destroy"
+msgstr ""
+
+msgid "Detail"
+msgstr ""
+
+msgid "Details"
+msgstr ""
+
+msgid "Details (default)"
+msgstr ""
+
+msgid "Detect host keys"
+msgstr ""
+
+msgid "DevOps Report"
+msgstr ""
+
+msgid "DevopsAdoption|%{selectedCount} group selected"
+msgstr ""
+
+msgid "DevopsAdoption|%{selectedCount} groups selected"
+msgstr ""
+
+msgid "DevopsAdoption|Add Group"
+msgstr ""
+
+msgid "DevopsAdoption|Add a group to get started"
+msgstr ""
+
+msgid "DevopsAdoption|Adopted"
+msgstr ""
+
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
+msgstr ""
+
+msgid "DevopsAdoption|An error occurred while saving 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 1 MR opened"
+msgstr ""
+
+msgid "DevopsAdoption|At least 1 approval on an MR"
+msgstr ""
+
+msgid "DevopsAdoption|At least 1 deploy"
+msgstr ""
+
+msgid "DevopsAdoption|At least 1 issue opened"
+msgstr ""
+
+msgid "DevopsAdoption|At least 1 pipeline successfully run"
+msgstr ""
+
+msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
+msgstr ""
+
+msgid "DevopsAdoption|Confirm remove Group"
+msgstr ""
+
+msgid "DevopsAdoption|Deploys"
+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|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
+msgstr ""
+
+msgid "DevopsAdoption|Filter by name"
+msgstr ""
+
+msgid "DevopsAdoption|Issues"
+msgstr ""
+
+msgid "DevopsAdoption|MRs"
+msgstr ""
+
+msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
+msgstr ""
+
+msgid "DevopsAdoption|My group"
+msgstr ""
+
+msgid "DevopsAdoption|No filter results."
+msgstr ""
+
+msgid "DevopsAdoption|Not adopted"
+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|Save changes"
+msgstr ""
+
+msgid "DevopsAdoption|Scanning"
+msgstr ""
+
+msgid "DevopsAdoption|There was an error fetching Group adoption data. Please refresh the page to try again."
+msgstr ""
+
+msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page to try again."
+msgstr ""
+
+msgid "DevopsReport|Adoption"
+msgstr ""
+
+msgid "DevopsReport|DevOps"
+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|Score"
+msgstr ""
+
+msgid "Diff content limits"
+msgstr ""
+
+msgid "Diff limits"
+msgstr ""
+
+msgid "Diff view settings"
+msgstr ""
+
+msgid "Difference between start date and now"
+msgstr ""
+
+msgid "DiffsCompareBaseBranch|(HEAD)"
+msgstr ""
+
+msgid "DiffsCompareBaseBranch|(base)"
+msgstr ""
+
+msgid "Diffs|No file name available"
+msgstr ""
+
+msgid "Diffs|Show %{unfoldCount} lines"
+msgstr ""
+
+msgid "Diffs|Show all unchanged lines"
+msgstr ""
+
+msgid "Diffs|Something went wrong while fetching diff lines."
+msgstr ""
+
+msgid "Direct member"
+msgstr ""
+
+msgid "Direction"
+msgstr ""
+
+msgid "Directory name"
+msgstr ""
+
+msgid "Disable"
+msgstr ""
+
+msgid "Disable for this project"
+msgstr ""
+
+msgid "Disable group runners"
+msgstr ""
+
+msgid "Disable public access to Pages sites"
+msgstr ""
+
+msgid "Disable shared runners"
+msgstr ""
+
+msgid "Disable two-factor authentication"
+msgstr ""
+
+msgid "Disabled"
+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|Receive event notifications in Discord"
+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|Give feedback for this page"
+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"
+msgstr ""
+
+msgid "Discuss a specific suggestion or question that needs to be resolved"
+msgstr ""
+
+msgid "Discuss a specific suggestion or question that needs to be resolved."
+msgstr ""
+
+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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "Dismiss DevOps Report introduction"
+msgstr ""
+
+msgid "Dismiss Merge Request promotion"
+msgstr ""
+
+msgid "Dismiss Value Stream Analytics introduction box"
+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 alerts from all your monitoring tools directly within GitLab."
+msgstr ""
+
+msgid "Display name"
+msgstr ""
+
+msgid "Display rendered file"
+msgstr ""
+
+msgid "Display source"
+msgstr ""
+
+msgid "Do not display offers from third parties within GitLab"
+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 "Domain"
+msgstr ""
+
+msgid "Domain cannot be deleted while associated to one or more clusters."
+msgstr ""
+
+msgid "Domain denylist"
+msgstr ""
+
+msgid "Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled"
+msgstr ""
+
+msgid "Domain was successfully created."
+msgstr ""
+
+msgid "Domain was successfully deleted."
+msgstr ""
+
+msgid "Domain was successfully updated."
+msgstr ""
+
+msgid "Don't have an account yet?"
+msgstr ""
+
+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 usage data"
+msgstr ""
+
+msgid "Don't show again"
+msgstr ""
+
+msgid "Done"
+msgstr ""
+
+msgid "Download"
+msgstr ""
+
+msgid "Download %{format}"
+msgstr ""
+
+msgid "Download %{format}:"
+msgstr ""
+
+msgid "Download %{name} artifact"
+msgstr ""
+
+msgid "Download CSV"
+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 license"
+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 merge requests can't be merged."
+msgstr ""
+
+msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
+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 "Due Date"
+msgstr ""
+
+msgid "Due date"
+msgstr ""
+
+msgid "Duration"
+msgstr ""
+
+msgid "Duration for the last 30 commits"
+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 "Edit"
+msgstr ""
+
+msgid "Edit %{issuable}"
+msgstr ""
+
+msgid "Edit %{name}"
+msgstr ""
+
+msgid "Edit Comment"
+msgstr ""
+
+msgid "Edit Deploy Key"
+msgstr ""
+
+msgid "Edit Geo Node"
+msgstr ""
+
+msgid "Edit Group Hook"
+msgstr ""
+
+msgid "Edit Label"
+msgstr ""
+
+msgid "Edit Milestone"
+msgstr ""
+
+msgid "Edit Password"
+msgstr ""
+
+msgid "Edit Pipeline Schedule %{id}"
+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 description"
+msgstr ""
+
+msgid "Edit environment"
+msgstr ""
+
+msgid "Edit files in the editor and commit changes here"
+msgstr ""
+
+msgid "Edit fork in Web IDE"
+msgstr ""
+
+msgid "Edit group: %{group_name}"
+msgstr ""
+
+msgid "Edit identity for %{user_name}"
+msgstr ""
+
+msgid "Edit in Web IDE"
+msgstr ""
+
+msgid "Edit in single-file editor"
+msgstr ""
+
+msgid "Edit inline"
+msgstr ""
+
+msgid "Edit issues"
+msgstr ""
+
+msgid "Edit iteration"
+msgstr ""
+
+msgid "Edit public deploy key"
+msgstr ""
+
+msgid "Edit sidebar"
+msgstr ""
+
+msgid "Edit stage"
+msgstr ""
+
+msgid "Edit this file only."
+msgstr ""
+
+msgid "Edit this release"
+msgstr ""
+
+msgid "Edit title and description"
+msgstr ""
+
+msgid "Edit wiki page"
+msgstr ""
+
+msgid "Edit your most recent comment in a thread (from an empty textarea)"
+msgstr ""
+
+msgid "Edited"
+msgstr ""
+
+msgid "Edited %{timeago}"
+msgstr ""
+
+msgid "Editing"
+msgstr ""
+
+msgid "Editor Lite instance is required to set up an extension."
+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 reindexing is already in progress"
+msgstr ""
+
+msgid "Elasticsearch reindexing triggered"
+msgstr ""
+
+msgid "Elasticsearch returned status code: %{status_code}"
+msgstr ""
+
+msgid "Elasticsearch zero-downtime reindexing"
+msgstr ""
+
+msgid "Elastic|None. Select namespaces to index."
+msgstr ""
+
+msgid "Elastic|None. Select projects to index."
+msgstr ""
+
+msgid "Email"
+msgstr ""
+
+msgid "Email %{number}"
+msgstr ""
+
+msgid "Email Notification"
+msgstr ""
+
+msgid "Email a new %{name} to this project"
+msgstr ""
+
+msgid "Email address to use for Support Desk"
+msgstr ""
+
+msgid "Email could not be sent"
+msgstr ""
+
+msgid "Email display name"
+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 restrictions"
+msgstr ""
+
+msgid "Email restrictions for sign-ups"
+msgstr ""
+
+msgid "Email sent"
+msgstr ""
+
+msgid "Email the pipelines status to a list of recipients."
+msgstr ""
+
+msgid "Email updates (optional)"
+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|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 "Emails separated by comma"
+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 is part of the domain GitLab is running on (e.g. %{domains})."
+msgstr ""
+
+msgid "Embed"
+msgstr ""
+
+msgid "Empty file"
+msgstr ""
+
+msgid "Enable"
+msgstr ""
+
+msgid "Enable %{linkStart}Gitpod%{linkEnd} integration to launch a development environment in your browser directly from GitLab."
+msgstr ""
+
+msgid "Enable Auto DevOps"
+msgstr ""
+
+msgid "Enable Gitpod"
+msgstr ""
+
+msgid "Enable Gitpod?"
+msgstr ""
+
+msgid "Enable HTML emails"
+msgstr ""
+
+msgid "Enable Incident Management inbound alert limit"
+msgstr ""
+
+msgid "Enable Invisible Captcha during sign up"
+msgstr ""
+
+msgid "Enable Kroki"
+msgstr ""
+
+msgid "Enable PlantUML"
+msgstr ""
+
+msgid "Enable Pseudonymizer data collection"
+msgstr ""
+
+msgid "Enable SSL verification"
+msgstr ""
+
+msgid "Enable Seat Link"
+msgstr ""
+
+msgid "Enable Spam Check via external API endpoint"
+msgstr ""
+
+msgid "Enable access to Grafana"
+msgstr ""
+
+msgid "Enable access to the Performance Bar for a given group."
+msgstr ""
+
+msgid "Enable and configure Grafana."
+msgstr ""
+
+msgid "Enable and configure Prometheus metrics."
+msgstr ""
+
+msgid "Enable and disable Service Desk. Some additional configuration might be required. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Enable classification control using an external service"
+msgstr ""
+
+msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
+msgstr ""
+
+msgid "Enable email restrictions for sign ups"
+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 in-product marketing emails"
+msgstr ""
+
+msgid "Enable integration"
+msgstr ""
+
+msgid "Enable kuromoji custom analyzer: Indexing"
+msgstr ""
+
+msgid "Enable kuromoji custom analyzer: Search"
+msgstr ""
+
+msgid "Enable maintenance mode"
+msgstr ""
+
+msgid "Enable mirror configuration"
+msgstr ""
+
+msgid "Enable or disable Seat Link."
+msgstr ""
+
+msgid "Enable or disable keyboard shortcuts"
+msgstr ""
+
+msgid "Enable or disable the Pseudonymizer data collection."
+msgstr ""
+
+msgid "Enable or disable version check and usage ping."
+msgstr ""
+
+msgid "Enable protected paths rate limit"
+msgstr ""
+
+msgid "Enable proxy"
+msgstr ""
+
+msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgstr ""
+
+msgid "Enable shared runners"
+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 snowplow tracking"
+msgstr ""
+
+msgid "Enable two-factor authentication"
+msgstr ""
+
+msgid "Enable usage ping"
+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|Close"
+msgstr ""
+
+msgid "EnableReviewApp|Copy snippet text"
+msgstr ""
+
+msgid "Enabled"
+msgstr ""
+
+msgid "Enabled Git access protocols"
+msgstr ""
+
+msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
+msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
+msgstr ""
+
+msgid "Encountered an error while rendering: %{err}"
+msgstr ""
+
+msgid "End Time"
+msgstr ""
+
+msgid "Ends at (UTC)"
+msgstr ""
+
+msgid "Ends on"
+msgstr ""
+
+msgid "Ends: %{endsAt}"
+msgstr ""
+
+msgid "Enforce DNS rebinding attack protection"
+msgstr ""
+
+msgid "Enforce SSH key expiration"
+msgstr ""
+
+msgid "Enforce personal access token expiration"
+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 2FA for Admin Mode"
+msgstr ""
+
+msgid "Enter Admin Mode"
+msgstr ""
+
+msgid "Enter IP address range"
+msgstr ""
+
+msgid "Enter a number"
+msgstr ""
+
+msgid "Enter an integer number between 0 and 100"
+msgstr ""
+
+msgid "Enter an integer number number between 0 and 100"
+msgstr ""
+
+msgid "Enter at least three characters to search"
+msgstr ""
+
+msgid "Enter domain"
+msgstr ""
+
+msgid "Enter in your Bitbucket Server URL and personal access token below"
+msgstr ""
+
+msgid "Enter in your Phabricator Server URL and personal access token below"
+msgstr ""
+
+msgid "Enter merge request URLs"
+msgstr ""
+
+msgid "Enter new %{field_title}"
+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 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 weights for storages for new repositories."
+msgstr ""
+
+msgid "Enter your password to approve"
+msgstr ""
+
+msgid "Environment"
+msgstr ""
+
+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 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 %{link_to_read_more}."
+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|More information"
+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. %{readMoreLink}"
+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 in"
+msgstr ""
+
+msgid "Environments|Auto stops %{auto_stop_time}"
+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|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|Managed apps"
+msgstr ""
+
+msgid "Environments|More information"
+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|Note that this action will stop the environment, but it will %{emphasis_start}not%{emphasis_end} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ci_config_link_start}.gitlab-ci.yml%{ci_config_link_end} file."
+msgstr ""
+
+msgid "Environments|Open live environment"
+msgstr ""
+
+msgid "Environments|Pod name"
+msgstr ""
+
+msgid "Environments|Re-deploy"
+msgstr ""
+
+msgid "Environments|Re-deploy environment %{environment_name}?"
+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 %{environment_name}?"
+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"
+msgstr ""
+
+msgid "Environments|Stopping %{environmentName}"
+msgstr ""
+
+msgid "Environments|There was an error fetching the logs. Please try again."
+msgstr ""
+
+msgid "Environments|This action will relaunch the job for commit %{commit_id}, putting the environment in a previous version. Are you sure you want to continue?"
+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 %{environment_name} for commit %{commit_id}, 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|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 right now"
+msgstr ""
+
+msgid "Environments|protected"
+msgstr ""
+
+msgid "Epic"
+msgstr ""
+
+msgid "Epic Boards"
+msgstr ""
+
+msgid "Epic cannot be found."
+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|How can I solve this?"
+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|These dates affect how your epics appear in the roadmap. Dates from milestones come from the milestones assigned to issues in the epic. You can also set fixed dates or remove them entirely."
+msgstr ""
+
+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 iteration"
+msgstr ""
+
+msgid "Error creating repository for snippet with id %{snippet_id}"
+msgstr ""
+
+msgid "Error creating the snippet"
+msgstr ""
+
+msgid "Error deleting %{issuableType}"
+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 when toggling the notification subscription"
+msgstr ""
+
+msgid "Error occurred while updating the issue status"
+msgstr ""
+
+msgid "Error occurred while updating the issue weight"
+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 blocked"
+msgstr ""
+
+msgid "Error occurred. User was not confirmed"
+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 loading the project data. 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: 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 find AWS role for current user"
+msgstr ""
+
+msgid "ErrorTracking|Active"
+msgstr ""
+
+msgid "ErrorTracking|After adding your Auth Token, use the 'Connect' button to load projects"
+msgstr ""
+
+msgid "ErrorTracking|Auth Token"
+msgstr ""
+
+msgid "ErrorTracking|Click 'Connect' to re-establish the connection to Sentry and activate the dropdown."
+msgstr ""
+
+msgid "ErrorTracking|Connection has failed. Re-check Auth Token and try again."
+msgstr ""
+
+msgid "ErrorTracking|If you self-host Sentry, enter the full URL of your Sentry instance. If you're using Sentry's hosted solution, enter https://sentry.io"
+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 "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 "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 "Events in %{project_path}"
+msgstr ""
+
+msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
+msgstr ""
+
+msgid "Every day"
+msgstr ""
+
+msgid "Every day (at %{time})"
+msgstr ""
+
+msgid "Every month"
+msgstr ""
+
+msgid "Every month (Day %{day} at %{time})"
+msgstr ""
+
+msgid "Every three months"
+msgstr ""
+
+msgid "Every two weeks"
+msgstr ""
+
+msgid "Every week"
+msgstr ""
+
+msgid "Every week (%{weekday} at %{time})"
+msgstr ""
+
+msgid "Everyone"
+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 plain HTML"
+msgstr ""
+
+msgid "Evidence collection"
+msgstr ""
+
+msgid "Ex: Example.com"
+msgstr ""
+
+msgid "Exactly one of %{attributes} is required"
+msgstr ""
+
+msgid "Example: %{ip_address}. %{read_more_link}."
+msgstr ""
+
+msgid "Example: @sub\\.company\\.com$"
+msgstr ""
+
+msgid "Example: Usage = single query. (Requested) / (Capacity) = multiple queries combined into a formula."
+msgstr ""
+
+msgid "Except policy:"
+msgstr ""
+
+msgid "Exceptions"
+msgstr ""
+
+msgid "Excess storage"
+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 "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 sidebar"
+msgstr ""
+
+msgid "Expected documents: %{expected_documents}"
+msgstr ""
+
+msgid "Experienced"
+msgstr ""
+
+msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgstr ""
+
+msgid "Expiration"
+msgstr ""
+
+msgid "Expiration date"
+msgstr ""
+
+msgid "Expired"
+msgstr ""
+
+msgid "Expired %{expiredOn}"
+msgstr ""
+
+msgid "Expired:"
+msgstr ""
+
+msgid "Expires"
+msgstr ""
+
+msgid "Expires at"
+msgstr ""
+
+msgid "Expires at (optional)"
+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 projects"
+msgstr ""
+
+msgid "Explore public groups"
+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 to a new GitLab instance. Once complete, you can import the data file from the \"New Group\" page."
+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 Classification Policy Authorization"
+msgstr ""
+
+msgid "External ID"
+msgstr ""
+
+msgid "External URL"
+msgstr ""
+
+msgid "External Wiki"
+msgstr ""
+
+msgid "External authentication"
+msgstr ""
+
+msgid "External authorization denied access to this project"
+msgstr ""
+
+msgid "External authorization request timeout"
+msgstr ""
+
+msgid "External storage URL"
+msgstr ""
+
+msgid "External storage authentication token"
+msgstr ""
+
+msgid "ExternalAuthorizationService|Classification label"
+msgstr ""
+
+msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used."
+msgstr ""
+
+msgid "ExternalWikiService|External Wiki"
+msgstr ""
+
+msgid "ExternalWikiService|Replaces the link to the internal wiki with a link to an external wiki."
+msgstr ""
+
+msgid "ExternalWikiService|The URL of the external 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 assign a reviewer because no user was found."
+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 Merge Request. Please try again."
+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 project 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 generate report, please try again after sometime"
+msgstr ""
+
+msgid "Failed to get ref."
+msgstr ""
+
+msgid "Failed to install."
+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 labels. Please try again."
+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 sidebar lock status"
+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 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 issue from board, please try again."
+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 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 issues, please try again."
+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 "Failed to verify domain ownership"
+msgstr ""
+
+msgid "Failure"
+msgstr ""
+
+msgid "False positive"
+msgstr ""
+
+msgid "Fast-forward merge is not possible. Rebase the source branch onto %{targetBranch} to allow this merge request to be merged."
+msgstr ""
+
+msgid "Fast-forward merge is not possible. Rebase the source branch onto the target branch."
+msgstr ""
+
+msgid "Fast-forward merge without a merge commit"
+msgstr ""
+
+msgid "Faster releases. Better code. Less pain."
+msgstr ""
+
+msgid "Favicon was successfully removed."
+msgstr ""
+
+msgid "Feature Flags"
+msgstr ""
+
+msgid "Feature flag is not enabled on the environment's project."
+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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+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|* (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 Spec"
+msgstr ""
+
+msgid "FeatureFlags|Environment Specs"
+msgstr ""
+
+msgid "FeatureFlags|Feature Flag"
+msgstr ""
+
+msgid "FeatureFlags|Feature Flag User List Details"
+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|Flag is read-only"
+msgstr ""
+
+msgid "FeatureFlags|Get started with feature flags"
+msgstr ""
+
+msgid "FeatureFlags|Get started with user lists"
+msgstr ""
+
+msgid "FeatureFlags|GitLab is moving to a new way of managing feature flags. This feature flag is read-only, and it will be removed in 14.0. Please create a new feature flag."
+msgstr ""
+
+msgid "FeatureFlags|ID"
+msgstr ""
+
+msgid "FeatureFlags|Inactive"
+msgstr ""
+
+msgid "FeatureFlags|Inactive flag for %{scope}"
+msgstr ""
+
+msgid "FeatureFlags|Include additional user IDs"
+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|Loading user lists"
+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|New user list"
+msgstr ""
+
+msgid "FeatureFlags|No user list selected"
+msgstr ""
+
+msgid "FeatureFlags|Percent of users"
+msgstr ""
+
+msgid "FeatureFlags|Percent rollout"
+msgstr ""
+
+msgid "FeatureFlags|Percent rollout (logged in users)"
+msgstr ""
+
+msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
+msgstr ""
+
+msgid "FeatureFlags|Protected"
+msgstr ""
+
+msgid "FeatureFlags|Remove"
+msgstr ""
+
+msgid "FeatureFlags|Rollout Percentage"
+msgstr ""
+
+msgid "FeatureFlags|Rollout Strategy"
+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|Target environments"
+msgstr ""
+
+msgid "FeatureFlags|There was an error fetching the feature flags."
+msgstr ""
+
+msgid "FeatureFlags|There was an error fetching the user lists."
+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|User lists allow you to define a set of users to use with Feature Flags."
+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 the branch for this merge request"
+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 format is no longer supported"
+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 synchronization concurrency limit"
+msgstr ""
+
+msgid "File templates"
+msgstr ""
+
+msgid "File upload error."
+msgstr ""
+
+msgid "Filename"
+msgstr ""
+
+msgid "Files"
+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 %{issuable_type} that are currently closed."
+msgstr ""
+
+msgid "Filter by %{issuable_type} that are currently opened."
+msgstr ""
+
+msgid "Filter by %{page_context_word} that are currently opened."
+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 name"
+msgstr ""
+
+msgid "Filter by name"
+msgstr ""
+
+msgid "Filter by status"
+msgstr ""
+
+msgid "Filter by test cases that are currently archived."
+msgstr ""
+
+msgid "Filter by test cases that are currently opened."
+msgstr ""
+
+msgid "Filter by two-factor authentication"
+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 your repositories by name"
+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 Seen"
+msgstr ""
+
+msgid "First day of the week"
+msgstr ""
+
+msgid "First name"
+msgstr ""
+
+msgid "First seen"
+msgstr ""
+
+msgid "Fixed burndown chart"
+msgstr ""
+
+msgid "Fixed date"
+msgstr ""
+
+msgid "Fixed due date"
+msgstr ""
+
+msgid "Fixed start date"
+msgstr ""
+
+msgid "Fixed:"
+msgstr ""
+
+msgid "Flags"
+msgstr ""
+
+msgid "FlowdockService|Flowdock Git source token"
+msgstr ""
+
+msgid "FlowdockService|Flowdock is a collaboration web app for technical teams."
+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 help setting up the Service Desk for your instance, please contact an administrator."
+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 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, please review %{link_start_tag}Jaeger's configuration doc%{link_end_tag}"
+msgstr ""
+
+msgid "For more information, see the File Hooks documentation."
+msgstr ""
+
+msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
+msgstr ""
+
+msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{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|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
+msgstr ""
+
+msgid "ForkedFromProjectPath|Forked from an inaccessible project"
+msgstr ""
+
+msgid "Forking a repository allows you to make changes without affecting the original project."
+msgstr ""
+
+msgid "Forking in progress"
+msgstr ""
+
+msgid "Forks"
+msgstr ""
+
+msgid "Format: %{dateFormat}"
+msgstr ""
+
+msgid "Found errors in your %{gitlab_ci_yml}:"
+msgstr ""
+
+msgid "Found errors in your .gitlab-ci.yml:"
+msgstr ""
+
+msgid "Framework successfully deleted"
+msgstr ""
+
+msgid "Free Trial"
+msgstr ""
+
+msgid "Free Trial of GitLab.com Ultimate"
+msgstr ""
+
+msgid "Freeze end"
+msgstr ""
+
+msgid "Freeze start"
+msgstr ""
+
+msgid "Frequency"
+msgstr ""
+
+msgid "Friday"
+msgstr ""
+
+msgid "From"
+msgstr ""
+
+msgid "From %{code_open}%{source_title}%{code_close} into"
+msgstr ""
+
+msgid "From %{providerTitle}"
+msgstr ""
+
+msgid "From issue creation until deploy to production"
+msgstr ""
+
+msgid "From merge request merge until deploy to production"
+msgstr ""
+
+msgid "From the Kubernetes cluster details view, applications list, install GitLab Runner."
+msgstr ""
+
+msgid "Full name"
+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 "Generate a default set of labels"
+msgstr ""
+
+msgid "Generate key"
+msgstr ""
+
+msgid "Generate new export"
+msgstr ""
+
+msgid "Generate new token"
+msgstr ""
+
+msgid "Generic package file size in bytes"
+msgstr ""
+
+msgid "Geo"
+msgstr ""
+
+msgid "Geo Nodes"
+msgstr ""
+
+msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
+msgstr ""
+
+msgid "Geo Replication"
+msgstr ""
+
+msgid "Geo Settings"
+msgstr ""
+
+msgid "Geo nodes are paused using a command run on the node"
+msgstr ""
+
+msgid "Geo sites"
+msgstr ""
+
+msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
+msgstr ""
+
+msgid "GeoNodeSyncStatus|Node is failing or broken."
+msgstr ""
+
+msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
+msgstr ""
+
+msgid "GeoNodes|Consult Geo troubleshooting information"
+msgstr ""
+
+msgid "GeoNodes|Data replication lag"
+msgstr ""
+
+msgid "GeoNodes|Does not match the primary storage configuration"
+msgstr ""
+
+msgid "GeoNodes|Full"
+msgstr ""
+
+msgid "GeoNodes|GitLab version"
+msgstr ""
+
+msgid "GeoNodes|GitLab version does not match the primary node version"
+msgstr ""
+
+msgid "GeoNodes|Health status"
+msgstr ""
+
+msgid "GeoNodes|Internal URL"
+msgstr ""
+
+msgid "GeoNodes|Last event ID processed by cursor"
+msgstr ""
+
+msgid "GeoNodes|Last event ID seen from primary"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Geo node statuses"
+msgstr ""
+
+msgid "GeoNodes|Loading nodes"
+msgstr ""
+
+msgid "GeoNodes|New node"
+msgstr ""
+
+msgid "GeoNodes|Node Authentication was successfully repaired."
+msgstr ""
+
+msgid "GeoNodes|Node URL"
+msgstr ""
+
+msgid "GeoNodes|Node was successfully removed."
+msgstr ""
+
+msgid "GeoNodes|Node's status was updated %{timeAgo}."
+msgstr ""
+
+msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
+msgstr ""
+
+msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
+msgstr ""
+
+msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
+msgstr ""
+
+msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
+msgstr ""
+
+msgid "GeoNodes|Replication slot WAL"
+msgstr ""
+
+msgid "GeoNodes|Replication slots"
+msgstr ""
+
+msgid "GeoNodes|Replication status"
+msgstr ""
+
+msgid "GeoNodes|Selective (%{syncLabel})"
+msgstr ""
+
+msgid "GeoNodes|Selective synchronization"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while changing node status"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while fetching nodes"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while removing node"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while repairing node"
+msgstr ""
+
+msgid "GeoNodes|Storage config"
+msgstr ""
+
+msgid "GeoNodes|Sync settings"
+msgstr ""
+
+msgid "GeoNodes|Unused slots"
+msgstr ""
+
+msgid "GeoNodes|Updated %{timeAgo}"
+msgstr ""
+
+msgid "GeoNodes|Used slots"
+msgstr ""
+
+msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
+msgstr ""
+
+msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
+msgstr ""
+
+msgid "GeoNodes|primary node"
+msgstr ""
+
+msgid "GeoNodes|secondary nodes"
+msgstr ""
+
+msgid "Geo|%{itemTitle} checksum progress"
+msgstr ""
+
+msgid "Geo|%{itemTitle} verification progress"
+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|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 %{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|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|Could not remove tracking entry for an existing project."
+msgstr ""
+
+msgid "Geo|Could not remove tracking entry for an existing upload."
+msgstr ""
+
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
+msgid "Geo|Failed"
+msgstr ""
+
+msgid "Geo|Filter by status"
+msgstr ""
+
+msgid "Geo|Geo Status"
+msgstr ""
+
+msgid "Geo|Geo sites"
+msgstr ""
+
+msgid "Geo|Go to the primary site"
+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|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|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|Node name can't be blank"
+msgstr ""
+
+msgid "Geo|Node name should be between 1 and 255 characters"
+msgstr ""
+
+msgid "Geo|Not synced yet"
+msgstr ""
+
+msgid "Geo|Pending synchronization"
+msgstr ""
+
+msgid "Geo|Pending verification"
+msgstr ""
+
+msgid "Geo|Please refer to Geo Troubleshooting."
+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|Redownload"
+msgstr ""
+
+msgid "Geo|Remove"
+msgstr ""
+
+msgid "Geo|Remove entry"
+msgstr ""
+
+msgid "Geo|Remove tracking database entry"
+msgstr ""
+
+msgid "Geo|Resync"
+msgstr ""
+
+msgid "Geo|Resync all"
+msgstr ""
+
+msgid "Geo|Retry count"
+msgstr ""
+
+msgid "Geo|Reverify"
+msgstr ""
+
+msgid "Geo|Reverify all"
+msgstr ""
+
+msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
+msgstr ""
+
+msgid "Geo|Secondary node"
+msgstr ""
+
+msgid "Geo|Secondary site"
+msgstr ""
+
+msgid "Geo|Status"
+msgstr ""
+
+msgid "Geo|Synced"
+msgstr ""
+
+msgid "Geo|Synced at"
+msgstr ""
+
+msgid "Geo|Synchronization failed - %{error}"
+msgstr ""
+
+msgid "Geo|Synchronization of %{itemTitle} is disabled."
+msgstr ""
+
+msgid "Geo|The database is currently %{db_lag} behind the primary node."
+msgstr ""
+
+msgid "Geo|The node is currently %{minutes_behind} behind the primary node."
+msgstr ""
+
+msgid "Geo|There are no %{replicable_type} to show"
+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|Tracking entry for upload (%{type}/%{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|Unknown state"
+msgstr ""
+
+msgid "Geo|Verification failed - %{error}"
+msgstr ""
+
+msgid "Geo|Waiting for scheduler"
+msgstr ""
+
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
+msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
+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 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 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 Pages"
+msgstr ""
+
+msgid "GitLab Shell"
+msgstr ""
+
+msgid "GitLab Support Bot"
+msgstr ""
+
+msgid "GitLab Team Member"
+msgstr ""
+
+msgid "GitLab User"
+msgstr ""
+
+msgid "GitLab Workhorse"
+msgstr ""
+
+msgid "GitLab account request rejected"
+msgstr ""
+
+msgid "GitLab commit"
+msgstr ""
+
+msgid "GitLab export"
+msgstr ""
+
+msgid "GitLab for Slack"
+msgstr ""
+
+msgid "GitLab group: %{source_link}"
+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 obtaining a Let's Encrypt SSL certificate for this domain. This process can take some time. Please try again later."
+msgstr ""
+
+msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgstr ""
+
+msgid "GitLab member or Email address"
+msgstr ""
+
+msgid "GitLab metadata URL"
+msgstr ""
+
+msgid "GitLab project export"
+msgstr ""
+
+msgid "GitLab restart is required to apply changes."
+msgstr ""
+
+msgid "GitLab single sign-on URL"
+msgstr ""
+
+msgid "GitLab username"
+msgstr ""
+
+msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
+msgstr ""
+
+msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr ""
+
+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|It may take up to 30 minutes before the site is available after the first deployment."
+msgstr ""
+
+msgid "GitLabPages|Learn more."
+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"
+msgstr ""
+
+msgid "GitLabPages|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 follow a %{samples_link_start}sample project%{link_end} or use a %{templates_link_start}GitLab CI template%{link_end}."
+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 using Pages under the general domain of a GitLab instance (%{pages_host}), you cannot use HTTPS with sub-subdomains. This means that if your username/groupname contains a dot it will not work. This is a limitation of the HTTP Over TLS protocol. HTTP pages will continue to work provided you don't redirect HTTP to HTTPS."
+msgstr ""
+
+msgid "GitLabPages|With GitLab Pages you can host your static websites on GitLab. Combined with the power of GitLab CI and the help of GitLab Runner you can deploy static pages for your individual projects, your user or your group."
+msgstr ""
+
+msgid "GitLabPages|Your pages are served under:"
+msgstr ""
+
+msgid "Gitaly"
+msgstr ""
+
+msgid "Gitaly Servers"
+msgstr ""
+
+msgid "Gitaly relative path:"
+msgstr ""
+
+msgid "Gitaly storage name:"
+msgstr ""
+
+msgid "Gitaly|Address"
+msgstr ""
+
+msgid "Gitea Host URL"
+msgstr ""
+
+msgid "Gitea Import"
+msgstr ""
+
+msgid "Gitlab Pages"
+msgstr ""
+
+msgid "Gitpod"
+msgstr ""
+
+msgid "Gitpod|Add the URL to your Gitpod instance configured to read your GitLab projects."
+msgstr ""
+
+msgid "Gitpod|Enable Gitpod integration"
+msgstr ""
+
+msgid "Gitpod|Gitpod URL"
+msgstr ""
+
+msgid "Gitpod|e.g. https://gitpod.example.com"
+msgstr ""
+
+msgid "Given access %{time_ago}"
+msgstr ""
+
+msgid "Given epic is already related to this epic."
+msgstr ""
+
+msgid "Global Shortcuts"
+msgstr ""
+
+msgid "Global notification settings"
+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 %{tagStart}Open issues%{tagEnd} and select some issues to add to your board."
+msgstr ""
+
+msgid "Go full screen"
+msgstr ""
+
+msgid "Go to Integrations"
+msgstr ""
+
+msgid "Go to Webhooks"
+msgstr ""
+
+msgid "Go to commits"
+msgstr ""
+
+msgid "Go to definition"
+msgstr ""
+
+msgid "Go to environments"
+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 fork"
+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 parent"
+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 activity feed"
+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 Platform"
+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 "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|Embed Grafana charts in GitLab issues."
+msgstr ""
+
+msgid "GrafanaIntegration|Enter the Grafana API Token."
+msgstr ""
+
+msgid "GrafanaIntegration|Enter the base URL of the Grafana instance."
+msgstr ""
+
+msgid "GrafanaIntegration|Grafana URL"
+msgstr ""
+
+msgid "GrafanaIntegration|Grafana authentication"
+msgstr ""
+
+msgid "Grant access"
+msgstr ""
+
+msgid "Grant write permissions to this key"
+msgstr ""
+
+msgid "Graph"
+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 Audit Events"
+msgstr ""
+
+msgid "Group Git LFS status:"
+msgstr ""
+
+msgid "Group Hooks"
+msgstr ""
+
+msgid "Group ID"
+msgstr ""
+
+msgid "Group ID: %{group_id}"
+msgstr ""
+
+msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
+msgstr ""
+
+msgid "Group SAML must be enabled to test"
+msgstr ""
+
+msgid "Group URL"
+msgstr ""
+
+msgid "Group Wikis"
+msgstr ""
+
+msgid "Group avatar"
+msgstr ""
+
+msgid "Group by"
+msgstr ""
+
+msgid "Group description (optional)"
+msgstr ""
+
+msgid "Group details"
+msgstr ""
+
+msgid "Group export could not be started."
+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 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 info:"
+msgstr ""
+
+msgid "Group is required when cluster_type is :group"
+msgstr ""
+
+msgid "Group maintainers can register group runners in the %{link}"
+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"
+msgstr ""
+
+msgid "Group overview content"
+msgstr ""
+
+msgid "Group path is already taken. Suggestions: "
+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 push rule exists, try updating"
+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-level events in %{group_name} (no project-level events)"
+msgstr ""
+
+msgid "Group: %{group_name}"
+msgstr ""
+
+msgid "Group: %{name}"
+msgstr ""
+
+msgid "GroupActivityMetrics|Issues opened"
+msgstr ""
+
+msgid "GroupActivityMetrics|Members added"
+msgstr ""
+
+msgid "GroupActivityMetrics|Merge Requests opened"
+msgstr ""
+
+msgid "GroupActivityMetrics|Recent activity (last 90 days)"
+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 "GroupRoadmap|%{dateWord} – No end date"
+msgstr ""
+
+msgid "GroupRoadmap|%{startDateInWords} – %{endDateInWords}"
+msgstr ""
+
+msgid "GroupRoadmap|No start and end date"
+msgstr ""
+
+msgid "GroupRoadmap|No start date – %{dateWord}"
+msgstr ""
+
+msgid "GroupRoadmap|Roadmaps can display up to 1,000 epics. These appear in your selected sort order."
+msgstr ""
+
+msgid "GroupRoadmap|Some of your epics might not be visible"
+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|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 "GroupSAML|Active SAML Group Links (%{count})"
+msgstr ""
+
+msgid "GroupSAML|Are you sure you want to remove the SAML group link?"
+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 this group."
+msgstr ""
+
+msgid "GroupSAML|Enforce users to have dedicated group managed accounts for this group."
+msgstr ""
+
+msgid "GroupSAML|Enforced SSO"
+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"
+msgstr ""
+
+msgid "GroupSAML|Prohibit outer forks for this group."
+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 API endpoint URL"
+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 "
+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 enforced SSO, you first need to enable SAML authentication."
+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|Toggle SAML authentication"
+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|Your SCIM token"
+msgstr ""
+
+msgid "GroupSAML|as %{access_level}"
+msgstr ""
+
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
+msgstr ""
+
+msgid "GroupSAML|should be \"persistent\""
+msgstr ""
+
+msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgstr ""
+
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
+msgid "GroupSettings|Apply integration settings to all Projects"
+msgstr ""
+
+msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
+msgstr ""
+
+msgid "GroupSettings|Badges"
+msgstr ""
+
+msgid "GroupSettings|Be careful. Changing a group's parent can have unintended %{side_effects_link_start}side effects%{side_effects_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 group URL can have unintended side effects."
+msgstr ""
+
+msgid "GroupSettings|Compliance frameworks"
+msgstr ""
+
+msgid "GroupSettings|Configure frameworks to apply enforceable rules to projects."
+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 delayed project removal"
+msgstr ""
+
+msgid "GroupSettings|Export group"
+msgstr ""
+
+msgid "GroupSettings|If the parent group's visibility is lower than the group current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
+msgstr ""
+
+msgid "GroupSettings|Integrations configured here will automatically apply to all projects in this group."
+msgstr ""
+
+msgid "GroupSettings|Learn more about group-level project templates."
+msgstr ""
+
+msgid "GroupSettings|New runners registration token has been generated!"
+msgstr ""
+
+msgid "GroupSettings|Pipeline settings was updated for the group"
+msgstr ""
+
+msgid "GroupSettings|Please choose a group URL with no special characters."
+msgstr ""
+
+msgid "GroupSettings|Prevent forking outside of the group"
+msgstr ""
+
+msgid "GroupSettings|Prevent forking setting was not saved"
+msgstr ""
+
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgstr ""
+
+msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{customization_link} in instance settings"
+msgstr ""
+
+msgid "GroupSettings|Select a sub-group as the custom project template source for this group."
+msgstr ""
+
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+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|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
+msgstr ""
+
+msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
+msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
+msgstr ""
+
+msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
+msgstr ""
+
+msgid "GroupSettings|Transfer group"
+msgstr ""
+
+msgid "GroupSettings|What are badges?"
+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 (%{groups})"
+msgstr ""
+
+msgid "Groups and projects"
+msgstr ""
+
+msgid "Groups and subgroups"
+msgstr ""
+
+msgid "Groups can also be nested by creating %{subgroup_docs_link_start}subgroups%{subgroup_docs_link_end}."
+msgstr ""
+
+msgid "Groups to synchronize"
+msgstr ""
+
+msgid "Groups with access to %{strong_open}%{project_name}%{strong_close}"
+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|Connect instance"
+msgstr ""
+
+msgid "GroupsNew|Contact an administrator to enable options for importing your group."
+msgstr ""
+
+msgid "GroupsNew|Create"
+msgstr ""
+
+msgid "GroupsNew|Create group"
+msgstr ""
+
+msgid "GroupsNew|GitLab source URL"
+msgstr ""
+
+msgid "GroupsNew|Import"
+msgstr ""
+
+msgid "GroupsNew|Import group"
+msgstr ""
+
+msgid "GroupsNew|Import groups from another instance of GitLab"
+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 ""
+
+msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgstr ""
+
+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|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|Edit group"
+msgstr ""
+
+msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner."
+msgstr ""
+
+msgid "GroupsTree|Leave this 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|Search by name"
+msgstr ""
+
+msgid "Guideline"
+msgstr ""
+
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 "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 your users email"
+msgstr ""
+
+msgid "Header logo was successfully removed."
+msgstr ""
+
+msgid "Header message"
+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 there"
+msgstr ""
+
+msgid "Hello, %{username}!"
+msgstr ""
+
+msgid "Help"
+msgstr ""
+
+msgid "Help page"
+msgstr ""
+
+msgid "Help page text and support page url."
+msgstr ""
+
+msgid "Helps prevent bots from brute-force attacks."
+msgstr ""
+
+msgid "Helps prevent bots from creating accounts."
+msgstr ""
+
+msgid "Helps reduce alert volume (e.g. if creating too many issues)"
+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 "Hide"
+msgstr ""
+
+msgid "Hide archived projects"
+msgstr ""
+
+msgid "Hide chart"
+msgid_plural "Hide charts"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "Hide comments 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 help"
+msgstr ""
+
+msgid "Hide payload"
+msgstr ""
+
+msgid "Hide shared projects"
+msgstr ""
+
+msgid "Hide stage"
+msgstr ""
+
+msgid "Hide value"
+msgid_plural "Hide values"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "Hide values"
+msgstr ""
+
+msgid "High or unknown vulnerabilities present"
+msgstr ""
+
+msgid "Highest number of requests per minute for each raw path, default to 300. To disable throttling set to 0."
+msgstr ""
+
+msgid "Highest role:"
+msgstr ""
+
+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 "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 "Hour (UTC)"
+msgstr ""
+
+msgid "Housekeeping"
+msgstr ""
+
+msgid "Housekeeping successfully started"
+msgstr ""
+
+msgid "Housekeeping, export, path, transfer, remove, archive."
+msgstr ""
+
+msgid "How do I configure runners?"
+msgstr ""
+
+msgid "How do I generate it?"
+msgstr ""
+
+msgid "How do I mirror repositories?"
+msgstr ""
+
+msgid "How does cleanup work?"
+msgstr ""
+
+msgid "How it works"
+msgstr ""
+
+msgid "How many days need to pass between marking entity for deletion and actual removing it."
+msgstr ""
+
+msgid "How many replicas each Elasticsearch shard has."
+msgstr ""
+
+msgid "How many shards to split the Elasticsearch index over."
+msgstr ""
+
+msgid "How many users will be evaluating the trial?"
+msgstr ""
+
+msgid "However, you are already a member of this %{member_source}. Sign in using a different account to accept the invitation."
+msgstr ""
+
+msgid "I accept the %{terms_link}"
+msgstr ""
+
+msgid "I accept the|Terms of Service and Privacy Policy"
+msgstr ""
+
+msgid "I forgot my password"
+msgstr ""
+
+msgid "I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)"
+msgstr ""
+
+msgid "I'd like to receive updates about GitLab via email"
+msgstr ""
+
+msgid "ID"
+msgstr ""
+
+msgid "ID:"
+msgstr ""
+
+msgid "IDE"
+msgstr ""
+
+msgid "IDE|Allow live previews of JavaScript projects in the Web IDE using CodeSandbox Live Preview."
+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 subnet restriction only allowed for top-level groups"
+msgstr ""
+
+msgid "Identifier"
+msgstr ""
+
+msgid "Identifiers"
+msgstr ""
+
+msgid "Identities"
+msgstr ""
+
+msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
+msgstr ""
+
+msgid "If blank, 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 admins will be able to configure repository mirroring."
+msgstr ""
+
+msgid "If enabled, GitLab will handle Object Storage replication using Geo. %{linkStart}More information%{linkEnd}"
+msgstr ""
+
+msgid "If enabled, access to projects will be validated on an external service using their classification label."
+msgstr ""
+
+msgid "If enabled, only protected branches will be mirrored."
+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 is no previous license or if the previous license has expired, some GitLab functionality will be blocked until a new, valid license is uploaded."
+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 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 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 remove this license, GitLab will fall back on the previous license, if any."
+msgstr ""
+
+msgid "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 "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 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 "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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "Import %d repository"
+msgid_plural "Import %d repositories"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "Import CSV"
+msgstr ""
+
+msgid "Import Projects from Gitea"
+msgstr ""
+
+msgid "Import an exported GitLab project"
+msgstr ""
+
+msgid "Import failed due to a GitHub error: %{original}"
+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 in progress"
+msgstr ""
+
+msgid "Import in progress. Refresh page to see newly added issues."
+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 ""
+
+msgid "Import project"
+msgstr ""
+
+msgid "Import project from"
+msgstr ""
+
+msgid "Import project members"
+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 "Import/Export Rate Limits"
+msgstr ""
+
+msgid "Import/Export illustration"
+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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "Improve Merge Requests and customer support with GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Improve customer support with Service Desk"
+msgstr ""
+
+msgid "Improve search with Advanced Search and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "In %{time_to_now}"
+msgstr ""
+
+msgid "In case of pull mirroring, your user will be the author of all events in the activity feed that are the result of an update, like new branches being created or new commits being pushed to existing branches."
+msgstr ""
+
+msgid "In order to enable Service Desk for your instance, you must first set up incoming email."
+msgstr ""
+
+msgid "In progress"
+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|*GitLab*, noun: a synonym for efficient teams"
+msgstr ""
+
+msgid "InProductMarketing|...and you can get a free trial of GitLab Gold"
+msgstr ""
+
+msgid "InProductMarketing|3 ways to dive into GitLab CI/CD"
+msgstr ""
+
+msgid "InProductMarketing|Actually, GitLab makes the team work (better)"
+msgstr ""
+
+msgid "InProductMarketing|And finally %{deploy_link} a Python application."
+msgstr ""
+
+msgid "InProductMarketing|Are your runners ready?"
+msgstr ""
+
+msgid "InProductMarketing|Automated security scans directly within GitLab"
+msgstr ""
+
+msgid "InProductMarketing|Beef up your security"
+msgstr ""
+
+msgid "InProductMarketing|Better code in less time"
+msgstr ""
+
+msgid "InProductMarketing|Blog"
+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|Code owners and required merge approvals are part of the paid tiers of GitLab. You can start a free 30-day trial of GitLab Gold and enable these features in less than 5 minutes with no credit card required."
+msgstr ""
+
+msgid "InProductMarketing|Create a project in GitLab in 5 minutes"
+msgstr ""
+
+msgid "InProductMarketing|Create your first project!"
+msgstr ""
+
+msgid "InProductMarketing|Did you know teams that use GitLab are far more efficient?"
+msgstr ""
+
+msgid "InProductMarketing|Dig in and create a project and a repo"
+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|Feel the need for speed?"
+msgstr ""
+
+msgid "InProductMarketing|Find out how your teams are really doing"
+msgstr ""
+
+msgid "InProductMarketing|Follow our steps"
+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 Gold 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 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|Go for the gold!"
+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 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|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|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|Launch GitLab CI/CD in 20 minutes or less"
+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|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|Need an alternative to importing?"
+msgstr ""
+
+msgid "InProductMarketing|Our tool brings all the things together"
+msgstr ""
+
+msgid "InProductMarketing|Rapid development, simplified"
+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|Start a GitLab Gold trial today in less than one minute, no credit card required."
+msgstr ""
+
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC 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 Gold free trial"
+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 your first steps with GitLab"
+msgstr ""
+
+msgid "InProductMarketing|Take your source code management to the next level"
+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 %{series} of 3 in the %{track} series."
+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 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|Try GitLab Gold for free"
+msgstr ""
+
+msgid "InProductMarketing|Try it out"
+msgstr ""
+
+msgid "InProductMarketing|Try it yourself"
+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|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 Gold and your teams will be on it from day one."
+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 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|using a CI/CD template"
+msgstr ""
+
+msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
+msgstr ""
+
+msgid "Incident"
+msgstr ""
+
+msgid "Incident Management Limits"
+msgstr ""
+
+msgid "Incident template (optional)"
+msgstr ""
+
+msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
+msgstr ""
+
+msgid "IncidentManagement|%{minutes} minutes remaining"
+msgstr ""
+
+msgid "IncidentManagement|All"
+msgstr ""
+
+msgid "IncidentManagement|All alerts promoted to incidents will automatically be displayed within the list. You can also create a new incident using the button below."
+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|No incidents to display."
+msgstr ""
+
+msgid "IncidentManagement|Open"
+msgstr ""
+
+msgid "IncidentManagement|Published"
+msgstr ""
+
+msgid "IncidentManagement|Published to status page"
+msgstr ""
+
+msgid "IncidentManagement|Severity"
+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|Unassigned"
+msgstr ""
+
+msgid "IncidentManagement|Unknown"
+msgstr ""
+
+msgid "IncidentManagement|Unpublished"
+msgstr ""
+
+msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
+msgstr ""
+
+msgid "IncidentSettings|Alert integration"
+msgstr ""
+
+msgid "IncidentSettings|Grafana integration"
+msgstr ""
+
+msgid "IncidentSettings|Incident settings"
+msgstr ""
+
+msgid "IncidentSettings|Incidents"
+msgstr ""
+
+msgid "IncidentSettings|PagerDuty integration"
+msgstr ""
+
+msgid "IncidentSettings|Set up integrations with external tools to help better manage incidents."
+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 will apply to all new incidents within the project"
+msgstr ""
+
+msgid "IncidentSettings|You may choose to introduce a countdown timer in incident issues to better track Service Level Agreements (SLAs). The timer is automatically started when the incident is created, and sets a time limit for the incident to be resolved in. When activated, \"time to SLA\" countdown will appear on all new incidents."
+msgstr ""
+
+msgid "IncidentSettings|hours"
+msgstr ""
+
+msgid "IncidentSettings|minutes"
+msgstr ""
+
+msgid "Incidents"
+msgstr ""
+
+msgid "Incidents|Add a URL"
+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 uploading your image."
+msgstr ""
+
+msgid "Incidents|You can optionally add a URL to link users to the original graph."
+msgstr ""
+
+msgid "Incident|Alert details"
+msgstr ""
+
+msgid "Incident|Are you sure you wish to delete this image?"
+msgstr ""
+
+msgid "Incident|Deleting %{filename}"
+msgstr ""
+
+msgid "Incident|Metrics"
+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 "Include a Terms of Service agreement and Privacy Policy that all users must accept."
+msgstr ""
+
+msgid "Include author name in notification email body"
+msgstr ""
+
+msgid "Include description in commit message"
+msgstr ""
+
+msgid "Include merge request description"
+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 "Indent"
+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 "Information about additional Pages templates and how to install them can be found in our %{pages_getting_started_guide}."
+msgstr ""
+
+msgid "Inherited"
+msgstr ""
+
+msgid "Inherited:"
+msgstr ""
+
+msgid "Inline"
+msgstr ""
+
+msgid "Input host keys manually"
+msgstr ""
+
+msgid "Input the remote repository URL"
+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 image"
+msgstr ""
+
+msgid "Insert inline code"
+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"
+msgstr ""
+
+msgid "Install GitLab Runner and ensure it's running."
+msgstr ""
+
+msgid "Install GitLab Runner on Kubernetes"
+msgstr ""
+
+msgid "Install on clusters"
+msgstr ""
+
+msgid "Installation"
+msgstr ""
+
+msgid "Installed"
+msgstr ""
+
+msgid "Installing"
+msgstr ""
+
+msgid "Instance"
+msgid_plural "Instances"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+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 overview"
+msgstr ""
+
+msgid "Integration"
+msgstr ""
+
+msgid "Integration Settings"
+msgstr ""
+
+msgid "Integrations"
+msgstr ""
+
+msgid "Integrations|%{integration} settings saved and active."
+msgstr ""
+
+msgid "Integrations|%{integration} settings saved, but not active."
+msgstr ""
+
+msgid "Integrations|Add namespace"
+msgstr ""
+
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
+msgid "Integrations|All details"
+msgstr ""
+
+msgid "Integrations|All projects inheriting these settings will also be reset."
+msgstr ""
+
+msgid "Integrations|Browser limitations"
+msgstr ""
+
+msgid "Integrations|Comment detail:"
+msgstr ""
+
+msgid "Integrations|Comment settings:"
+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|Default settings are inherited from the group level."
+msgstr ""
+
+msgid "Integrations|Default settings are inherited from the instance level."
+msgstr ""
+
+msgid "Integrations|Enable comments"
+msgstr ""
+
+msgid "Integrations|Failed to link namespace. Please try again."
+msgstr ""
+
+msgid "Integrations|Failed to load namespaces. Please try again."
+msgstr ""
+
+msgid "Integrations|Includes Standard plus entire commit message, commit hash, and issue IDs"
+msgstr ""
+
+msgid "Integrations|Includes commit title and branch"
+msgstr ""
+
+msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
+msgstr ""
+
+msgid "Integrations|Link namespaces"
+msgstr ""
+
+msgid "Integrations|Linked namespaces"
+msgstr ""
+
+msgid "Integrations|Namespaces are your GitLab groups and subgroups that will be linked to this Jira instance."
+msgstr ""
+
+msgid "Integrations|No available namespaces."
+msgstr ""
+
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+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|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|Sign in to add namespaces"
+msgstr ""
+
+msgid "Integrations|Standard"
+msgstr ""
+
+msgid "Integrations|This integration, and inheriting projects were reset."
+msgstr ""
+
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
+msgid "Integrations|To keep this project going, create a new issue."
+msgstr ""
+
+msgid "Integrations|Update your projects on Packagist, the main Composer repository"
+msgstr ""
+
+msgid "Integrations|Use custom settings"
+msgstr ""
+
+msgid "Integrations|Use default settings"
+msgstr ""
+
+msgid "Integrations|Use the GitLab Slack application"
+msgstr ""
+
+msgid "Integrations|When a Jira issue is mentioned in a commit or merge request a remote link and comment (if enabled) will be created."
+msgstr ""
+
+msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
+msgstr ""
+
+msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
+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 users"
+msgstr ""
+
+msgid "Internal users cannot be deactivated"
+msgstr ""
+
+msgid "Interval Pattern"
+msgstr ""
+
+msgid "Introducing Value Stream Analytics"
+msgstr ""
+
+msgid "Introducing Your DevOps Report"
+msgstr ""
+
+msgid "Invalid Insights config file detected"
+msgstr ""
+
+msgid "Invalid Login or password"
+msgstr ""
+
+msgid "Invalid OS"
+msgstr ""
+
+msgid "Invalid 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 query"
+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 "Invitation"
+msgstr ""
+
+msgid "Invitation declined"
+msgstr ""
+
+msgid "Invite"
+msgstr ""
+
+msgid "Invite \"%{email}\" by email"
+msgstr ""
+
+msgid "Invite \"%{trimmed}\" by email"
+msgstr ""
+
+msgid "Invite Members"
+msgstr ""
+
+msgid "Invite a group"
+msgstr ""
+
+msgid "Invite group"
+msgstr ""
+
+msgid "Invite member"
+msgstr ""
+
+msgid "Invite members"
+msgstr ""
+
+msgid "Invite your team"
+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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 are invited!"
+msgstr ""
+
+msgid "InviteEmail|You have been invited to join the %{project_or_group_name} %{project_or_group} as a %{role}"
+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 role permission"
+msgstr ""
+
+msgid "InviteMembersModal|Close invite team members"
+msgstr ""
+
+msgid "InviteMembersModal|GitLab member or Email address"
+msgstr ""
+
+msgid "InviteMembersModal|Invite"
+msgstr ""
+
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
+msgid "InviteMembersModal|Invite team members"
+msgstr ""
+
+msgid "InviteMembersModal|Members were successfully added"
+msgstr ""
+
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
+msgid "InviteMembersModal|Search for members to invite"
+msgstr ""
+
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
+msgid "InviteMembersModal|Some of the members could not be added"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+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|Don't worry, you can always invite teammates later"
+msgstr ""
+
+msgid "InviteMember|Invite Members (optional)"
+msgstr ""
+
+msgid "InviteMember|Invite another member"
+msgstr ""
+
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
+msgid "InviteMember|Invite members"
+msgstr ""
+
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
+msgid "InviteMember|Invite your team"
+msgstr ""
+
+msgid "InviteMember|Invite your teammates"
+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 "InviteMember|Oops, this feature isn't ready yet"
+msgstr ""
+
+msgid "InviteMember|See who can invite members for you"
+msgstr ""
+
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
+msgid "InviteMember|Until then, ask an owner to invite new project members for you"
+msgstr ""
+
+msgid "InviteMember|We're working to allow everyone to invite new members, making it easier for teams to get started with GitLab"
+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 "Is blocked by"
+msgstr ""
+
+msgid "Is this GitLab trial for your company?"
+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 already promoted to epic."
+msgstr ""
+
+msgid "Issue cannot be found."
+msgstr ""
+
+msgid "Issue created from vulnerability %{vulnerability_link}"
+msgstr ""
+
+msgid "Issue details"
+msgstr ""
+
+msgid "Issue events"
+msgstr ""
+
+msgid "Issue first deployed to production"
+msgstr ""
+
+msgid "Issue label"
+msgstr ""
+
+msgid "Issue or Merge Request ID is required"
+msgstr ""
+
+msgid "Issue published on status page."
+msgstr ""
+
+msgid "Issue title"
+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|Due date"
+msgstr ""
+
+msgid "IssueAnalytics|Failed to load issues. Please try again."
+msgstr ""
+
+msgid "IssueAnalytics|Issue"
+msgstr ""
+
+msgid "IssueAnalytics|Milestone"
+msgstr ""
+
+msgid "IssueAnalytics|Opened by"
+msgstr ""
+
+msgid "IssueAnalytics|Status"
+msgstr ""
+
+msgid "IssueAnalytics|Weight"
+msgstr ""
+
+msgid "IssueBoards|An error occurred while assigning the selected epic to the issue."
+msgstr ""
+
+msgid "IssueBoards|An error occurred while fetching the assigned epic of the selected issue."
+msgstr ""
+
+msgid "IssueBoards|An error occurred while setting notifications status. Please try again."
+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, activate a license to see them again."
+msgstr ""
+
+msgid "IssueBoards|Switch board"
+msgstr ""
+
+msgid "IssueTracker|Bugzilla issue tracker"
+msgstr ""
+
+msgid "IssueTracker|Custom issue tracker"
+msgstr ""
+
+msgid "IssueTracker|EWM work items tracker"
+msgstr ""
+
+msgid "IssueTracker|Redmine issue tracker"
+msgstr ""
+
+msgid "IssueTracker|YouTrack issue tracker"
+msgstr ""
+
+msgid "Issues"
+msgstr ""
+
+msgid "Issues Rate Limits"
+msgstr ""
+
+msgid "Issues and Merge Requests"
+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 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 opened"
+msgstr ""
+
+msgid "IssuesAnalytics|Issues opened 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 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 "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 "Iteration|Dates cannot overlap with other existing Iterations within this group"
+msgstr ""
+
+msgid "Iteration|cannot be more than 500 years in the future"
+msgstr ""
+
+msgid "I’m familiar with the basics of DevOps."
+msgstr ""
+
+msgid "I’m not familiar with the basics of DevOps."
+msgstr ""
+
+msgid "Jaeger URL"
+msgstr ""
+
+msgid "Jaeger tracing"
+msgstr ""
+
+msgid "Jan"
+msgstr ""
+
+msgid "January"
+msgstr ""
+
+msgid "Japanese language support using"
+msgstr ""
+
+msgid "Jira Issues"
+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 "JiraService| on branch %{branch_link}"
+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|Define the type of Jira issue to create from a vulnerability."
+msgstr ""
+
+msgid "JiraService|Displaying Jira issues while leaving the GitLab issue functionality enabled might be confusing. Consider %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+msgstr ""
+
+msgid "JiraService|Enable Jira issues"
+msgstr ""
+
+msgid "JiraService|Enable Jira issues creation from vulnerabilities"
+msgstr ""
+
+msgid "JiraService|Events for %{noteable_model_name} are disabled."
+msgstr ""
+
+msgid "JiraService|Fetch issue types for this Jira project"
+msgstr ""
+
+msgid "JiraService|For example, 12, 24"
+msgstr ""
+
+msgid "JiraService|GitLab for Jira Configuration"
+msgstr ""
+
+msgid "JiraService|If different from Web URL"
+msgstr ""
+
+msgid "JiraService|Issue List"
+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 Issues"
+msgstr ""
+
+msgid "JiraService|Jira comments will be created when an issue gets referenced in a commit."
+msgstr ""
+
+msgid "JiraService|Jira comments will be created when an issue gets referenced in a merge request."
+msgstr ""
+
+msgid "JiraService|Jira issue tracker"
+msgstr ""
+
+msgid "JiraService|Jira issue type"
+msgstr ""
+
+msgid "JiraService|Jira project key"
+msgstr ""
+
+msgid "JiraService|Jira workflow transition IDs"
+msgstr ""
+
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+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 transition IDs for Jira workflow transitions. %{link_start}Learn more%{link_end}"
+msgstr ""
+
+msgid "JiraService|Sign in to GitLab.com to get started."
+msgstr ""
+
+msgid "JiraService|This feature requires a Premium plan."
+msgstr ""
+
+msgid "JiraService|This issue is synchronized with Jira"
+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|Username or Email"
+msgstr ""
+
+msgid "JiraService|Using Jira for issue tracking?"
+msgstr ""
+
+msgid "JiraService|View Jira issues in GitLab"
+msgstr ""
+
+msgid "JiraService|Warning: All GitLab users that have access to this GitLab project will be able to view all issues from the Jira project specified below."
+msgstr ""
+
+msgid "JiraService|Web URL"
+msgstr ""
+
+msgid "JiraService|Work on Jira issues without leaving GitLab. Adds a Jira menu to access your list of Jira issues and view any issue as read-only."
+msgstr ""
+
+msgid "JiraService|e.g. AB"
+msgstr ""
+
+msgid "JiraService|transition ids can have only numbers which can be split with , or ;"
+msgstr ""
+
+msgid "Job"
+msgstr ""
+
+msgid "Job Failed #%{build_id}"
+msgstr ""
+
+msgid "Job 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|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|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|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|Browse"
+msgstr ""
+
+msgid "Job|Complete Raw"
+msgstr ""
+
+msgid "Job|Download"
+msgstr ""
+
+msgid "Job|Erase job log"
+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|Pipeline"
+msgstr ""
+
+msgid "Job|Scroll to bottom"
+msgstr ""
+
+msgid "Job|Scroll to top"
+msgstr ""
+
+msgid "Job|Show complete raw"
+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|for"
+msgstr ""
+
+msgid "Job|into"
+msgstr ""
+
+msgid "Job|with"
+msgstr ""
+
+msgid "Join Zoom meeting"
+msgstr ""
+
+msgid "Joined %{time_ago}"
+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 "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|Ctrl+"
+msgstr ""
+
+msgid "KeyboardShortcuts|Global Shortcuts"
+msgstr ""
+
+msgid "KeyboardShortcuts|Toggle GitLab Next"
+msgstr ""
+
+msgid "KeyboardShortcuts|Toggle the Performance Bar"
+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 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 "LFS"
+msgstr ""
+
+msgid "LFS object"
+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 lists show all issues with the selected label."
+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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+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 Pipeline"
+msgstr ""
+
+msgid "Last Seen"
+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 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 repository check run"
+msgstr ""
+
+msgid "Last seen"
+msgstr ""
+
+msgid "Last sign-in"
+msgstr ""
+
+msgid "Last successful sync"
+msgstr ""
+
+msgid "Last successful update"
+msgstr ""
+
+msgid "Last time verified"
+msgstr ""
+
+msgid "Last update"
+msgstr ""
+
+msgid "Last update attempt"
+msgstr ""
+
+msgid "Last updated"
+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 "Lead"
+msgstr ""
+
+msgid "Lead Time"
+msgstr ""
+
+msgid "Learn CI/CD syntax"
+msgstr ""
+
+msgid "Learn GitLab"
+msgstr ""
+
+msgid "Learn GitLab - Ultimate trial"
+msgstr ""
+
+msgid "Learn GitLab|Trial only"
+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 how to enable synchronization"
+msgstr ""
+
+msgid "Learn more"
+msgstr ""
+
+msgid "Learn more about %{username}"
+msgstr ""
+
+msgid "Learn more about Auto DevOps"
+msgstr ""
+
+msgid "Learn more about License-Check"
+msgstr ""
+
+msgid "Learn more about Needs relationships"
+msgstr ""
+
+msgid "Learn more about Vulnerability-Check"
+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 signing commits"
+msgstr ""
+
+msgid "Learn more in the"
+msgstr ""
+
+msgid "Learn more in the|pipeline schedules documentation"
+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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
+msgstr ""
+
+msgid "Leave Admin Mode"
+msgstr ""
+
+msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
+msgstr ""
+
+msgid "Leave edit mode? All unsaved changes will be lost."
+msgstr ""
+
+msgid "Leave group"
+msgstr ""
+
+msgid "Leave project"
+msgstr ""
+
+msgid "Leave zen mode"
+msgstr ""
+
+msgid "Legacy burndown chart"
+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 "License"
+msgstr ""
+
+msgid "License Compliance"
+msgstr ""
+
+msgid "License History"
+msgstr ""
+
+msgid "License ID:"
+msgstr ""
+
+msgid "License overview"
+msgstr ""
+
+msgid "License-Check"
+msgstr ""
+
+msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are active"
+msgstr ""
+
+msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
+msgstr ""
+
+msgid "LicenseCompliance|Acceptable license to be used in the project"
+msgstr ""
+
+msgid "LicenseCompliance|Add a license"
+msgstr ""
+
+msgid "LicenseCompliance|Add license and related policy"
+msgstr ""
+
+msgid "LicenseCompliance|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 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] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only; approval required"
+msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only; approval required"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "LicenseCompliance|License Compliance detected %d license for the source branch only"
+msgid_plural "LicenseCompliance|License Compliance detected %d licenses for the source branch only"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "LicenseCompliance|License Compliance detected %d new license"
+msgid_plural "LicenseCompliance|License Compliance detected %d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "LicenseCompliance|License Compliance detected %d new license and policy violation"
+msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and policy violations"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "LicenseCompliance|License Compliance detected %d new license and policy violation; approval required"
+msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and policy violations; approval required"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+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|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|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 Features"
+msgstr ""
+
+msgid "Licensed to"
+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|Disallow Merge request if detected and will instruct the developer to remove"
+msgstr ""
+
+msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+msgstr ""
+
+msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
+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 license list details information about the licenses used within your project."
+msgstr ""
+
+msgid "Licenses|View license details for your project"
+msgstr ""
+
+msgid "License|Buy license"
+msgstr ""
+
+msgid "License|License"
+msgstr ""
+
+msgid "License|You can restore access to the Gold features at any time by upgrading."
+msgstr ""
+
+msgid "License|You can start a free trial of GitLab Ultimate without any obligation or payment details."
+msgstr ""
+
+msgid "License|You do not have a license."
+msgstr ""
+
+msgid "License|Your License"
+msgstr ""
+
+msgid "License|Your free trial of GitLab Ultimate expired on %{trial_ends_on}."
+msgstr ""
+
+msgid "Limit display of time tracking units to hours."
+msgstr ""
+
+msgid "Limit namespaces and projects that can be indexed"
+msgstr ""
+
+msgid "Limit the number of concurrent operations this secondary node can run in the background."
+msgstr ""
+
+msgid "Limited to showing %d event at most"
+msgid_plural "Limited to showing %d events at most"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "Line changes"
+msgstr ""
+
+msgid "Link"
+msgstr ""
+
+msgid "Link Prometheus monitoring to GitLab."
+msgstr ""
+
+msgid "Link copied"
+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 "Linked emails (%{email_count})"
+msgstr ""
+
+msgid "Linked issues"
+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 users to be excluded from the 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 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 issues"
+msgstr ""
+
+msgid "Loading more"
+msgstr ""
+
+msgid "Loading snippet"
+msgstr ""
+
+msgid "Loading the GitLab IDE..."
+msgstr ""
+
+msgid "Loading..."
+msgstr ""
+
+msgid "Loading…"
+msgstr ""
+
+msgid "Local IP addresses and domain names that hooks and services may access."
+msgstr ""
+
+msgid "Localization"
+msgstr ""
+
+msgid "Location"
+msgstr ""
+
+msgid "Lock"
+msgstr ""
+
+msgid "Lock %{issuableDisplayName}"
+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 "Login with smartcard"
+msgstr ""
+
+msgid "Logo was successfully removed."
+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 "Maintenance mode"
+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"
+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 you've authorized to use your account."
+msgstr ""
+
+msgid "Manage group labels"
+msgstr ""
+
+msgid "Manage labels"
+msgstr ""
+
+msgid "Manage milestones"
+msgstr ""
+
+msgid "Manage project labels"
+msgstr ""
+
+msgid "Manage storage usage"
+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 "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 %{originating_vulnerability}."
+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 as resolved"
+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 "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 "Marked For Deletion At - %{deletion_time}"
+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 "MattermostService|Add to Mattermost"
+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|See list of available commands in Mattermost after setting up this service, by entering"
+msgstr ""
+
+msgid "MattermostService|Suggestions:"
+msgstr ""
+
+msgid "MattermostService|This service allows users to perform common operations on this project by entering slash commands in Mattermost."
+msgstr ""
+
+msgid "Max 100,000 events"
+msgstr ""
+
+msgid "Max 20 characters"
+msgstr ""
+
+msgid "Max Group Export Download requests per minute per user"
+msgstr ""
+
+msgid "Max Group Export requests per minute per user"
+msgstr ""
+
+msgid "Max Group Import requests per minute per user"
+msgstr ""
+
+msgid "Max Project Export Download requests per minute per user"
+msgstr ""
+
+msgid "Max Project Export requests per minute per user"
+msgstr ""
+
+msgid "Max Project Import requests per minute per user"
+msgstr ""
+
+msgid "Max access level"
+msgstr ""
+
+msgid "Max file size is 200 KB."
+msgstr ""
+
+msgid "Max requests per minute per user"
+msgstr ""
+
+msgid "Max role"
+msgstr ""
+
+msgid "MaxBuilds"
+msgstr ""
+
+msgid "Maximum Conan package 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 Users"
+msgstr ""
+
+msgid "Maximum allowable lifetime for personal access token (days)"
+msgstr ""
+
+msgid "Maximum artifacts size"
+msgstr ""
+
+msgid "Maximum artifacts size (MB)"
+msgstr ""
+
+msgid "Maximum attachment size (MB)"
+msgstr ""
+
+msgid "Maximum bulk request size (MiB)"
+msgstr ""
+
+msgid "Maximum capacity"
+msgstr ""
+
+msgid "Maximum concurrency of Elasticsearch bulk requests per indexing operation."
+msgstr ""
+
+msgid "Maximum delay (Minutes)"
+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 2MB. Please select a smaller file."
+msgstr ""
+
+msgid "Maximum import size (MB)"
+msgstr ""
+
+msgid "Maximum job timeout"
+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 npm package file size in bytes"
+msgstr ""
+
+msgid "Maximum number of %{name} (%{count}) exceeded"
+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 page reached"
+msgstr ""
+
+msgid "Maximum push size (MB)"
+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 time between updates that a mirror can have when scheduled to synchronize."
+msgstr ""
+
+msgid "May"
+msgstr ""
+
+msgid "Mean time to merge"
+msgstr ""
+
+msgid "Measured in bytes of code. Excludes generated and vendored code."
+msgstr ""
+
+msgid "Median"
+msgstr ""
+
+msgid "Medium vulnerabilities present"
+msgstr ""
+
+msgid "Member lock"
+msgstr ""
+
+msgid "Member since %{date}"
+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 invited to %{strong_start}%{project_name}%{strong_end}"
+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 %{strong_open}%{project_name}%{strong_close}"
+msgstr ""
+
+msgid "Members of a group may only view projects they have permission to access"
+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|Expired"
+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|No expiration set"
+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 "Members|in %{time}"
+msgstr ""
+
+msgid "Member|Deny access"
+msgstr ""
+
+msgid "Member|Remove member"
+msgstr ""
+
+msgid "Member|Revoke invite"
+msgstr ""
+
+msgid "Memory Usage"
+msgstr ""
+
+msgid "Merge"
+msgstr ""
+
+msgid "Merge Conflicts"
+msgstr ""
+
+msgid "Merge Request"
+msgstr ""
+
+msgid "Merge Request Analytics"
+msgstr ""
+
+msgid "Merge Request Approvals"
+msgstr ""
+
+msgid "Merge Request Commits"
+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 commit SHA"
+msgstr ""
+
+msgid "Merge commit message"
+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 %{iid} authored by %{authorName}"
+msgstr ""
+
+msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
+msgstr ""
+
+msgid "Merge request (MR) approvals"
+msgstr ""
+
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
+msgid "Merge request approvals"
+msgstr ""
+
+msgid "Merge request approvals allow you to set the number of necessary approvals and predefine a list of approvers that will need to approve every merge request in a project."
+msgstr ""
+
+msgid "Merge request dependencies"
+msgstr ""
+
+msgid "Merge request events"
+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 requests are read-only in a secondary Geo node"
+msgstr ""
+
+msgid "Merge the branch and fix any conflicts that come up"
+msgstr ""
+
+msgid "Merge when pipeline succeeds"
+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 "MergeRequestDiffs|Commenting on lines %{selectStart}start%{selectEnd} to %{end}"
+msgstr ""
+
+msgid "MergeRequestDiffs|Select comment starting line"
+msgstr ""
+
+msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
+msgstr ""
+
+msgid "MergeRequests|An error occurred while saving the draft comment."
+msgstr ""
+
+msgid "MergeRequests|Failed to squash. Should be done manually."
+msgstr ""
+
+msgid "MergeRequests|Resolve this thread in a new issue"
+msgstr ""
+
+msgid "MergeRequests|Saving the comment failed"
+msgstr ""
+
+msgid "MergeRequests|Squash task canceled: another squash is already in progress."
+msgstr ""
+
+msgid "MergeRequests|This project does not allow squashing commits when merge requests are accepted."
+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|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 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 "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::Dashboard::Annotation|Annotation can't belong to both a cluster and an environment at the same time"
+msgstr ""
+
+msgid "Metrics::Dashboard::Annotation|Annotation has not been deleted"
+msgstr ""
+
+msgid "Metrics::Dashboard::Annotation|Annotation must belong to a cluster or an environment"
+msgstr ""
+
+msgid "Metrics::Dashboard::Annotation|Dashboard with requested path can not be found"
+msgstr ""
+
+msgid "Metrics::Dashboard::Annotation|You are not authorized to create annotation for selected cluster"
+msgstr ""
+
+msgid "Metrics::Dashboard::Annotation|You are not authorized to create annotation for selected environment"
+msgstr ""
+
+msgid "Metrics::Dashboard::Annotation|You are not authorized to delete this annotation"
+msgstr ""
+
+msgid "Metrics::Dashboard::Annotation|can't be before starting_at time"
+msgstr ""
+
+msgid "Metrics::UsersStarredDashboards|Dashboard with requested path can not be found"
+msgstr ""
+
+msgid "Metrics::UsersStarredDashboards|You are not authorized to add star to this dashboard"
+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 dashboard"
+msgstr ""
+
+msgid "MetricsSettings|UTC (Coordinated Universal Time)"
+msgstr ""
+
+msgid "MetricsSettings|User's local timezone"
+msgstr ""
+
+msgid "Metrics|1. Define and preview panel"
+msgstr ""
+
+msgid "Metrics|2. Paste panel YAML into dashboard"
+msgstr ""
+
+msgid "Metrics|Add metric"
+msgstr ""
+
+msgid "Metrics|Add panel"
+msgstr ""
+
+msgid "Metrics|Avg"
+msgstr ""
+
+msgid "Metrics|Back to dashboard"
+msgstr ""
+
+msgid "Metrics|Cancel"
+msgstr ""
+
+msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
+msgstr ""
+
+msgid "Metrics|Collapse panel"
+msgstr ""
+
+msgid "Metrics|Collapse panel (Esc)"
+msgstr ""
+
+msgid "Metrics|Copy YAML"
+msgstr ""
+
+msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
+msgstr ""
+
+msgid "Metrics|Create custom dashboard %{fileName}"
+msgstr ""
+
+msgid "Metrics|Create metric"
+msgstr ""
+
+msgid "Metrics|Create new dashboard"
+msgstr ""
+
+msgid "Metrics|Create your dashboard configuration file"
+msgstr ""
+
+msgid "Metrics|Current"
+msgstr ""
+
+msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
+msgstr ""
+
+msgid "Metrics|Define panel YAML below to preview panel."
+msgstr ""
+
+msgid "Metrics|Delete metric"
+msgstr ""
+
+msgid "Metrics|Delete metric?"
+msgstr ""
+
+msgid "Metrics|Duplicate"
+msgstr ""
+
+msgid "Metrics|Duplicate current dashboard"
+msgstr ""
+
+msgid "Metrics|Duplicate dashboard"
+msgstr ""
+
+msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
+msgstr ""
+
+msgid "Metrics|Duplicating..."
+msgstr ""
+
+msgid "Metrics|Edit dashboard YAML"
+msgstr ""
+
+msgid "Metrics|Edit metric"
+msgid_plural "Metrics|Edit metrics"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "Metrics|Expand panel"
+msgstr ""
+
+msgid "Metrics|For grouping similar metrics"
+msgstr ""
+
+msgid "Metrics|Invalid time range, please verify."
+msgstr ""
+
+msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
+msgstr ""
+
+msgid "Metrics|Legend label (optional)"
+msgstr ""
+
+msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
+msgstr ""
+
+msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
+msgstr ""
+
+msgid "Metrics|Manage chart links"
+msgstr ""
+
+msgid "Metrics|Max"
+msgstr ""
+
+msgid "Metrics|Metrics Settings"
+msgstr ""
+
+msgid "Metrics|Min"
+msgstr ""
+
+msgid "Metrics|More actions"
+msgstr ""
+
+msgid "Metrics|Must be a valid PromQL query."
+msgstr ""
+
+msgid "Metrics|New metric"
+msgstr ""
+
+msgid "Metrics|Open repository"
+msgstr ""
+
+msgid "Metrics|Panel YAML"
+msgstr ""
+
+msgid "Metrics|Panel YAML copied"
+msgstr ""
+
+msgid "Metrics|Preview panel"
+msgstr ""
+
+msgid "Metrics|PromQL query is valid"
+msgstr ""
+
+msgid "Metrics|Prometheus Query Documentation"
+msgstr ""
+
+msgid "Metrics|Refresh Prometheus data"
+msgstr ""
+
+msgid "Metrics|Refresh dashboard"
+msgstr ""
+
+msgid "Metrics|Select a value"
+msgstr ""
+
+msgid "Metrics|Set refresh rate"
+msgstr ""
+
+msgid "Metrics|Star dashboard"
+msgstr ""
+
+msgid "Metrics|There was an error creating the dashboard."
+msgstr ""
+
+msgid "Metrics|There was an error creating the dashboard. %{error}"
+msgstr ""
+
+msgid "Metrics|There was an error fetching annotations. Please try again."
+msgstr ""
+
+msgid "Metrics|There was an error fetching the environments data, please try again"
+msgstr ""
+
+msgid "Metrics|There was an error getting annotations information."
+msgstr ""
+
+msgid "Metrics|There was an error getting dashboard validation warnings information."
+msgstr ""
+
+msgid "Metrics|There was an error getting deployment information."
+msgstr ""
+
+msgid "Metrics|There was an error getting environments information."
+msgstr ""
+
+msgid "Metrics|There was an error getting options for variable \"%{name}\"."
+msgstr ""
+
+msgid "Metrics|There was an error trying to validate your query"
+msgstr ""
+
+msgid "Metrics|There was an error while retrieving metrics"
+msgstr ""
+
+msgid "Metrics|There was an error while retrieving metrics. %{message}"
+msgstr ""
+
+msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
+msgstr ""
+
+msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unit label"
+msgstr ""
+
+msgid "Metrics|Unstar dashboard"
+msgstr ""
+
+msgid "Metrics|Used as a title for the chart"
+msgstr ""
+
+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|View runbook - %{label}"
+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 "Microsoft Azure"
+msgstr ""
+
+msgid "Middleman project with Static Site Editor support"
+msgstr ""
+
+msgid "Migrate your data from an external source like GitHub, Bitbucket, or another instance of GitLab."
+msgstr ""
+
+msgid "Migrated %{success_count}/%{total_count} files."
+msgstr ""
+
+msgid "Migration has been scheduled to be retried"
+msgstr ""
+
+msgid "Migration successful."
+msgstr ""
+
+msgid "Milestone"
+msgid_plural "Milestones"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "Milestone lists not available with your current license"
+msgstr ""
+
+msgid "Milestone lists show all issues from the selected milestone."
+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|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|No milestones found"
+msgstr ""
+
+msgid "Milestones|Ongoing Issues (open and assigned)"
+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|This action cannot be reversed."
+msgstr ""
+
+msgid "Milestones|Unstarted Issues (open and unassigned)"
+msgstr ""
+
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgstr ""
+
+msgid "Minimum interval in days"
+msgstr ""
+
+msgid "Minimum password length (number of characters)"
+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 "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 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 your errors by integrating with Sentry."
+msgstr ""
+
+msgid "Monitoring"
+msgstr ""
+
+msgid "Month"
+msgstr ""
+
+msgid "Months"
+msgstr ""
+
+msgid "More"
+msgstr ""
+
+msgid "More Information"
+msgstr ""
+
+msgid "More Slack commands"
+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 "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 "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 "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 "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}More information%{linkEnd}"
+msgstr ""
+
+msgid "My Awesome Group"
+msgstr ""
+
+msgid "My company or team"
+msgstr ""
+
+msgid "My-Reaction"
+msgstr ""
+
+msgid "N/A"
+msgstr ""
+
+msgid "Name"
+msgstr ""
+
+msgid "Name has already been 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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+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 %{locked_project_count} project. To unlock it, please purchase additional storage"
+msgid_plural "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on %{locked_project_count} projects. To unlock them, please purchase additional storage"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To learn more about reducing storage capacity please visit our docs."
+msgstr ""
+
+msgid "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 "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 "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 "Needs"
+msgstr ""
+
+msgid "Needs attention"
+msgstr ""
+
+msgid "Network"
+msgstr ""
+
+msgid "Network Policy|New rule"
+msgstr ""
+
+msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
+msgstr ""
+
+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|+ Add alert"
+msgstr ""
+
+msgid "NetworkPolicies|.yaml"
+msgstr ""
+
+msgid "NetworkPolicies|.yaml mode"
+msgstr ""
+
+msgid "NetworkPolicies|Actions"
+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|Choose whether to enforce this policy."
+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|Description"
+msgstr ""
+
+msgid "NetworkPolicies|Edit policy"
+msgstr ""
+
+msgid "NetworkPolicies|Editor mode"
+msgstr ""
+
+msgid "NetworkPolicies|Enforcement status"
+msgstr ""
+
+msgid "NetworkPolicies|Environment does not have deployment platform"
+msgstr ""
+
+msgid "NetworkPolicies|IP/subnet"
+msgstr ""
+
+msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
+msgstr ""
+
+msgid "NetworkPolicies|Invalid or empty policy"
+msgstr ""
+
+msgid "NetworkPolicies|Kubernetes error: %{error}"
+msgstr ""
+
+msgid "NetworkPolicies|Last modified"
+msgstr ""
+
+msgid "NetworkPolicies|Name"
+msgstr ""
+
+msgid "NetworkPolicies|Namespace"
+msgstr ""
+
+msgid "NetworkPolicies|Network Policy"
+msgstr ""
+
+msgid "NetworkPolicies|Network traffic"
+msgstr ""
+
+msgid "NetworkPolicies|New policy"
+msgstr ""
+
+msgid "NetworkPolicies|No policies detected"
+msgstr ""
+
+msgid "NetworkPolicies|None selected"
+msgstr ""
+
+msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
+msgstr ""
+
+msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
+msgstr ""
+
+msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
+msgstr ""
+
+msgid "NetworkPolicies|Policy definition"
+msgstr ""
+
+msgid "NetworkPolicies|Policy description"
+msgstr ""
+
+msgid "NetworkPolicies|Policy editor"
+msgstr ""
+
+msgid "NetworkPolicies|Policy preview"
+msgstr ""
+
+msgid "NetworkPolicies|Policy status"
+msgstr ""
+
+msgid "NetworkPolicies|Policy type"
+msgstr ""
+
+msgid "NetworkPolicies|Rule"
+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|Rules"
+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|Status"
+msgstr ""
+
+msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
+msgstr ""
+
+msgid "NetworkPolicies|Unable to parse policy"
+msgstr ""
+
+msgid "NetworkPolicies|YAML editor"
+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 "Never"
+msgstr ""
+
+msgid "New"
+msgstr ""
+
+msgid "New %{issueType}"
+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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "New Jira import"
+msgstr ""
+
+msgid "New Label"
+msgstr ""
+
+msgid "New Merge Request"
+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 changes were added. %{linkStart}Reload the page to review them%{linkEnd}"
+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 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 title"
+msgstr ""
+
+msgid "New iteration"
+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 password"
+msgstr ""
+
+msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgstr ""
+
+msgid "New project"
+msgstr ""
+
+msgid "New release"
+msgstr ""
+
+msgid "New requirement"
+msgstr ""
+
+msgid "New response for issue #%{issue_iid}:"
+msgstr ""
+
+msgid "New runner. Has not connected yet"
+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 users set to external"
+msgstr ""
+
+msgid "New! Suggest changes directly"
+msgstr ""
+
+msgid "New..."
+msgstr ""
+
+msgid "Newest first"
+msgstr ""
+
+msgid "Newly registered users will by default be external"
+msgstr ""
+
+msgid "Next"
+msgstr ""
+
+msgid "Next commit"
+msgstr ""
+
+msgid "Next file in diff"
+msgstr ""
+
+msgid "Next unresolved discussion"
+msgstr ""
+
+msgid "Nickname"
+msgstr ""
+
+msgid "No"
+msgstr ""
+
+msgid "No %{header} for this request."
+msgstr ""
+
+msgid "No %{providerTitle} repositories found"
+msgstr ""
+
+msgid "No Epic"
+msgstr ""
+
+msgid "No Matching Results"
+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 assignee"
+msgstr ""
+
+msgid "No authentication methods configured."
+msgstr ""
+
+msgid "No available groups to fork the project."
+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 commits present here"
+msgstr ""
+
+msgid "No compliance frameworks are in use."
+msgstr ""
+
+msgid "No compliance frameworks are in use. Create one using the GraphQL API."
+msgstr ""
+
+msgid "No confirmation email received? Please check your spam folder or"
+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 required."
+msgstr ""
+
+msgid "No data found"
+msgstr ""
+
+msgid "No data to display"
+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 grouping"
+msgstr ""
+
+msgid "No issues found"
+msgstr ""
+
+msgid "No iteration"
+msgstr ""
+
+msgid "No iterations found"
+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 labels"
+msgstr ""
+
+msgid "No matching results"
+msgstr ""
+
+msgid "No matching results for \"%{query}\""
+msgstr ""
+
+msgid "No matching results..."
+msgstr ""
+
+msgid "No members found"
+msgstr ""
+
+msgid "No merge requests found"
+msgstr ""
+
+msgid "No messages were logged"
+msgstr ""
+
+msgid "No milestone"
+msgstr ""
+
+msgid "No milestones to show"
+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 public groups"
+msgstr ""
+
+msgid "No ref selected"
+msgstr ""
+
+msgid "No related merge requests found."
+msgstr ""
+
+msgid "No repository"
+msgstr ""
+
+msgid "No required pipeline"
+msgstr ""
+
+msgid "No runner executable"
+msgstr ""
+
+msgid "No runners found"
+msgstr ""
+
+msgid "No schedules"
+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 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 webhooks found, add one in the form above."
+msgstr ""
+
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
+msgstr ""
+
+msgid "No. 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 can sign in with read-only access and make read-only API requests."
+msgstr ""
+
+msgid "None"
+msgstr ""
+
+msgid "None of the group milestones have the same project as the release"
+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 applicable to personal namespaced projects, which are deleted immediately on request."
+msgstr ""
+
+msgid "Not available"
+msgstr ""
+
+msgid "Not available for private projects"
+msgstr ""
+
+msgid "Not available for protected branches"
+msgstr ""
+
+msgid "Not available to run jobs."
+msgstr ""
+
+msgid "Not confidential"
+msgstr ""
+
+msgid "Not enough data"
+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 parameters are invalid: %{errors}"
+msgstr ""
+
+msgid "Note that pushing to GitLab requires write access to this repository."
+msgstr ""
+
+msgid "Note that 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 "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 "NoteForm|Note"
+msgstr ""
+
+msgid "Notes Rate Limits"
+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 project members"
+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 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 "Nothing to synchronize"
+msgstr ""
+
+msgid "Notification events"
+msgstr ""
+
+msgid "Notification setting - %{notification_title}"
+msgstr ""
+
+msgid "Notification settings saved"
+msgstr ""
+
+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 "Novice"
+msgstr ""
+
+msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
+msgstr ""
+
+msgid "Number of %{itemTitle}"
+msgstr ""
+
+msgid "Number of Elasticsearch replicas"
+msgstr ""
+
+msgid "Number of Elasticsearch shards"
+msgstr ""
+
+msgid "Number of LOCs per commit"
+msgstr ""
+
+msgid "Number of changes (branches or tags) in a single push to determine whether individual push events or bulk push event will be created. Bulk push event will be created if it surpasses that value."
+msgstr ""
+
+msgid "Number of changes (branches or tags) in a single push to determine whether webhooks and services will be fired or not. Webhooks and services won't be submitted if it surpasses that value."
+msgstr ""
+
+msgid "Number of commits"
+msgstr ""
+
+msgid "Number of commits per MR"
+msgstr ""
+
+msgid "Number of employees"
+msgstr ""
+
+msgid "Number of events"
+msgstr ""
+
+msgid "Number of events for this project: %{total_count}."
+msgstr ""
+
+msgid "Number of files touched"
+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 "Oldest first"
+msgstr ""
+
+msgid "OmniAuth"
+msgstr ""
+
+msgid "Omnibus Protected Paths throttle is active, and takes priority over these settings. From 12.4, Omnibus throttle is deprecated and will be removed in a future release. Please read the %{relative_url_link_start}Migrating Protected Paths documentation%{relative_url_link_end}."
+msgstr ""
+
+msgid "On"
+msgstr ""
+
+msgid "On track"
+msgstr ""
+
+msgid "On-call Schedules"
+msgstr ""
+
+msgid "On-call schedules"
+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 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|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|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"
+msgstr ""
+
+msgid "OnCallSchedules|On-call schedule for the %{timezone}"
+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|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|Your schedule has been successfully created and all alerts from this project will now be routed to this schedule. Currently, only one schedule can be created per project. More coming soon! To add individual users to this schedule, use the add a rotation button."
+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|Description (optional)"
+msgstr ""
+
+msgid "OnDemandScans|Edit on-demand DAST scan"
+msgstr ""
+
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgstr ""
+
+msgid "OnDemandScans|Manage DAST scans"
+msgstr ""
+
+msgid "OnDemandScans|Manage profiles"
+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|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 run outside the DevOps cycle and find vulnerabilities in your projects. %{learnMoreLinkStart}Learn more%{learnMoreLinkEnd}"
+msgstr ""
+
+msgid "OnDemandScans|Run scan"
+msgstr ""
+
+msgid "OnDemandScans|Save and run scan"
+msgstr ""
+
+msgid "OnDemandScans|Save scan"
+msgstr ""
+
+msgid "OnDemandScans|Scan name"
+msgstr ""
+
+msgid "OnDemandScans|Scanner profile"
+msgstr ""
+
+msgid "OnDemandScans|Select one of the existing profiles"
+msgstr ""
+
+msgid "OnDemandScans|Site profile"
+msgstr ""
+
+msgid "OnDemandScans|Use existing scanner profile"
+msgstr ""
+
+msgid "OnDemandScans|Use existing site profile"
+msgstr ""
+
+msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgstr ""
+
+msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgstr ""
+
+msgid "Once a project is permanently deleted, it %{strongStart}cannot be recovered%{strongEnd}. Permanently deleting this project will %{strongStart}immediately delete%{strongEnd} its repositories and %{strongStart}all related resources%{strongEnd}, including issues, merge requests etc."
+msgstr ""
+
+msgid "Once a project is permanently deleted, it cannot be recovered. You will lose this project's repository and all related resources, including issues, merge requests etc."
+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 the exported file is ready, you will receive a notification email with a download link, or you can download it from this page."
+msgstr ""
+
+msgid "Once you confirm and press \"Reduce project visibility\":"
+msgstr ""
+
+msgid "One more item"
+msgid_plural "%d more items"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+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 this projects shows up in the search and on the dashboard."
+msgstr ""
+
+msgid "Only admins can delete project"
+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 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 ""
+
+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 API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
+msgid "Open Selection"
+msgstr ""
+
+msgid "Open comment type dropdown"
+msgstr ""
+
+msgid "Open epics"
+msgstr ""
+
+msgid "Open errors"
+msgstr ""
+
+msgid "Open in file view"
+msgstr ""
+
+msgid "Open in your IDE"
+msgstr ""
+
+msgid "Open issues"
+msgstr ""
+
+msgid "Open raw"
+msgstr ""
+
+msgid "Open registration is enabled on your instance."
+msgstr ""
+
+msgid "Open sidebar"
+msgstr ""
+
+msgid "Open: %{open}"
+msgstr ""
+
+msgid "Opened"
+msgstr ""
+
+msgid "Opened %{epicTimeagoDate}"
+msgstr ""
+
+msgid "Opened MRs"
+msgstr ""
+
+msgid "Opened issues"
+msgstr ""
+
+msgid "OpenedNDaysAgo|Opened"
+msgstr ""
+
+msgid "Opens in a 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 "Operations Settings"
+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 "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 "Our documentation includes an example DevOps Score report."
+msgstr ""
+
+msgid "Out-of-compliance with this project's policies and should be removed"
+msgstr ""
+
+msgid "Outbound 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 "Package Registry"
+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 type must be Conan"
+msgstr ""
+
+msgid "Package type must be Debian"
+msgstr ""
+
+msgid "Package type must be Maven"
+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} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
+msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
+msgstr ""
+
+msgid "PackageRegistry|Add Conan Remote"
+msgstr ""
+
+msgid "PackageRegistry|Add NuGet Source"
+msgstr ""
+
+msgid "PackageRegistry|Add composer registry"
+msgstr ""
+
+msgid "PackageRegistry|An error occurred while saving the settings"
+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|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 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 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 yarn command"
+msgstr ""
+
+msgid "PackageRegistry|Copy yarn setup command"
+msgstr ""
+
+msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package Version"
+msgstr ""
+
+msgid "PackageRegistry|Delete package"
+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|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
+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|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 has %{number} archived update"
+msgstr ""
+
+msgid "PackageRegistry|Package has %{number} archived updates"
+msgstr ""
+
+msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
+msgstr ""
+
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
+msgid "PackageRegistry|Pip Command"
+msgstr ""
+
+msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
+msgstr ""
+
+msgid "PackageRegistry|PyPI"
+msgstr ""
+
+msgid "PackageRegistry|Recipe: %{recipe}"
+msgstr ""
+
+msgid "PackageRegistry|Remove package"
+msgstr ""
+
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
+msgid "PackageRegistry|Sorry, your filter produced no results"
+msgstr ""
+
+msgid "PackageRegistry|Source project located at %{link}"
+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|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|npm command"
+msgstr ""
+
+msgid "PackageRegistry|published by %{author}"
+msgstr ""
+
+msgid "PackageRegistry|yarn command"
+msgstr ""
+
+msgid "PackageType|Composer"
+msgstr ""
+
+msgid "PackageType|Conan"
+msgstr ""
+
+msgid "PackageType|Generic"
+msgstr ""
+
+msgid "PackageType|Maven"
+msgstr ""
+
+msgid "PackageType|NuGet"
+msgstr ""
+
+msgid "PackageType|PyPI"
+msgstr ""
+
+msgid "PackageType|npm"
+msgstr ""
+
+msgid "Packages"
+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 "Pages getting started guide"
+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|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 "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+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 "Partial token for reference only"
+msgstr ""
+
+msgid "Participants"
+msgstr ""
+
+msgid "Pass job variables"
+msgstr ""
+
+msgid "Passed"
+msgstr ""
+
+msgid "Passed on"
+msgstr ""
+
+msgid "Password"
+msgstr ""
+
+msgid "Password (optional)"
+msgstr ""
+
+msgid "Password Policy Guidelines"
+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 "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 your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
+msgstr ""
+
+msgid "Patch to apply"
+msgstr ""
+
+msgid "Path"
+msgstr ""
+
+msgid "Path:"
+msgstr ""
+
+msgid "Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "Pause"
+msgstr ""
+
+msgid "Pause Elasticsearch indexing"
+msgstr ""
+
+msgid "Pause replication"
+msgstr ""
+
+msgid "Paused runners don't accept new jobs"
+msgstr ""
+
+msgid "Pending"
+msgstr ""
+
+msgid "Pending comments"
+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 common operations on GitLab project"
+msgstr ""
+
+msgid "Performance optimization"
+msgstr ""
+
+msgid "PerformanceBar|Bullet notifications"
+msgstr ""
+
+msgid "PerformanceBar|Download"
+msgstr ""
+
+msgid "PerformanceBar|Elasticsearch calls"
+msgstr ""
+
+msgid "PerformanceBar|External Http calls"
+msgstr ""
+
+msgid "PerformanceBar|Frontend resources"
+msgstr ""
+
+msgid "PerformanceBar|Gitaly calls"
+msgstr ""
+
+msgid "PerformanceBar|Redis calls"
+msgstr ""
+
+msgid "PerformanceBar|Rugged calls"
+msgstr ""
+
+msgid "PerformanceBar|SQL queries"
+msgstr ""
+
+msgid "PerformanceBar|Stats"
+msgstr ""
+
+msgid "PerformanceBar|trace"
+msgstr ""
+
+msgid "Permissions"
+msgstr ""
+
+msgid "Permissions Help"
+msgstr ""
+
+msgid "Permissions, LFS, 2FA"
+msgstr ""
+
+msgid "Personal Access Token"
+msgstr ""
+
+msgid "Personal Access Token prefix"
+msgstr ""
+
+msgid "Personal project creation is not allowed. Please contact your administrator with questions"
+msgstr ""
+
+msgid "Phabricator Server Import"
+msgstr ""
+
+msgid "Phabricator Server URL"
+msgstr ""
+
+msgid "Phabricator Tasks"
+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 Schedule"
+msgstr ""
+
+msgid "Pipeline Schedules"
+msgstr ""
+
+msgid "Pipeline minutes quota"
+msgstr ""
+
+msgid "Pipeline minutes quota:"
+msgstr ""
+
+msgid "Pipeline ran in fork of project"
+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 "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 "PipelineStatusTooltip|Pipeline: %{ciStatus}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
+msgid "Pipelines"
+msgstr ""
+
+msgid "Pipelines charts"
+msgstr ""
+
+msgid "Pipelines emails"
+msgstr ""
+
+msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
+msgstr ""
+
+msgid "Pipelines settings for '%{project_name}' were successfully updated."
+msgstr ""
+
+msgid "Pipelines|API"
+msgstr ""
+
+msgid "Pipelines|Are you sure you want to run this pipeline?"
+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|Child pipeline"
+msgstr ""
+
+msgid "Pipelines|Clear Runner Caches"
+msgstr ""
+
+msgid "Pipelines|Copy trigger token"
+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 started with 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|Group %{namespace_name} has %{percentage}%% or less Shared Runner Pipeline minutes remaining. Once it runs out, no new jobs or pipelines in its projects will run."
+msgstr ""
+
+msgid "Pipelines|Group %{namespace_name} has exceeded its pipeline minutes quota. Unless you buy additional pipeline minutes, no new jobs or pipelines in its projects will run."
+msgstr ""
+
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+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|Lint"
+msgstr ""
+
+msgid "Pipelines|Loading Pipelines"
+msgstr ""
+
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
+msgid "Pipelines|More Information"
+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|Revoke"
+msgstr ""
+
+msgid "Pipelines|Run Pipeline"
+msgstr ""
+
+msgid "Pipelines|Something went wrong while cleaning runners cache."
+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 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 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|Validating GitLab CI configuration…"
+msgstr ""
+
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
+msgid "Pipelines|Visualize"
+msgstr ""
+
+msgid "Pipelines|Write pipeline configuration"
+msgstr ""
+
+msgid "Pipelines|invalid"
+msgstr ""
+
+msgid "Pipelines|parent"
+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|Commit"
+msgstr ""
+
+msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
+msgstr ""
+
+msgid "Pipeline|Coverage"
+msgstr ""
+
+msgid "Pipeline|Created"
+msgstr ""
+
+msgid "Pipeline|Date"
+msgstr ""
+
+msgid "Pipeline|Detached merge request pipeline"
+msgstr ""
+
+msgid "Pipeline|Duration"
+msgstr ""
+
+msgid "Pipeline|Existing branch name or tag"
+msgstr ""
+
+msgid "Pipeline|Failed"
+msgstr ""
+
+msgid "Pipeline|Key"
+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 Pipeline"
+msgstr ""
+
+msgid "Pipeline|Run for"
+msgstr ""
+
+msgid "Pipeline|Run for branch name or tag"
+msgstr ""
+
+msgid "Pipeline|Running"
+msgstr ""
+
+msgid "Pipeline|Search branches"
+msgstr ""
+
+msgid "Pipeline|Skipped"
+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|Specify variable values to be used in this run. The values specified in %{settings_link} 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|Trigger author"
+msgstr ""
+
+msgid "Pipeline|Triggerer"
+msgstr ""
+
+msgid "Pipeline|Value"
+msgstr ""
+
+msgid "Pipeline|Variables"
+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|on"
+msgstr ""
+
+msgid "Pipeline|with stage"
+msgstr ""
+
+msgid "Pipeline|with stages"
+msgstr ""
+
+msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgstr ""
+
+msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgstr ""
+
+msgid "PivotalTrackerService|Project Management Software (Source Commits Endpoint)"
+msgstr ""
+
+msgid "Plain diff"
+msgstr ""
+
+msgid "Plan"
+msgstr ""
+
+msgid "Plan:"
+msgstr ""
+
+msgid "PlantUML"
+msgstr ""
+
+msgid "Play"
+msgstr ""
+
+msgid "Play all manual"
+msgstr ""
+
+msgid "Please %{link_to_register} or %{link_to_sign_in} to comment"
+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 add a list to your board first"
+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 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 check your email to confirm your account"
+msgstr ""
+
+msgid "Please choose a file"
+msgstr ""
+
+msgid "Please choose a group URL with no special characters."
+msgstr ""
+
+msgid "Please complete your profile with email address"
+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 enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
+msgstr ""
+
+msgid "Please ensure your account's %{account_link_start}recovery settings%{account_link_end} are up to date."
+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 or upload a license."
+msgstr ""
+
+msgid "Please fill in a descriptive name for your group."
+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 only enable search after installing the plugin, enabling indexing and recreating the index"
+msgstr ""
+
+msgid "Please provide a name"
+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 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 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 set a new password before proceeding."
+msgstr ""
+
+msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
+msgstr ""
+
+msgid "Please solve the captcha"
+msgstr ""
+
+msgid "Please solve the reCAPTCHA"
+msgstr ""
+
+msgid "Please try again"
+msgstr ""
+
+msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgstr ""
+
+msgid "Please type the following to confirm:"
+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 "Plugins directory is deprecated and will be removed in 14.0. Please move this file into /file_hooks directory."
+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. Duplicate URLs are not allowed."
+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|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 mins 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|These settings will update how dates and times are displayed for you."
+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 display"
+msgstr ""
+
+msgid "Preferences|Time format"
+msgstr ""
+
+msgid "Preferences|Time preferences"
+msgstr ""
+
+msgid "Preferences|Use relative times"
+msgstr ""
+
+msgid "Press %{key}-C to copy"
+msgstr ""
+
+msgid "Prev"
+msgstr ""
+
+msgid "Prevent MR approvals by author."
+msgstr ""
+
+msgid "Prevent MR approvals by the author."
+msgstr ""
+
+msgid "Prevent MR approvals from users who make commits to the MR."
+msgstr ""
+
+msgid "Prevent adding new members to project membership within this group"
+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 modifying MR approval rules."
+msgstr ""
+
+msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgstr ""
+
+msgid "Preview"
+msgstr ""
+
+msgid "Preview Markdown"
+msgstr ""
+
+msgid "Preview changes"
+msgstr ""
+
+msgid "Preview payload"
+msgstr ""
+
+msgid "Previous Artifacts"
+msgstr ""
+
+msgid "Previous commit"
+msgstr ""
+
+msgid "Previous file in diff"
+msgstr ""
+
+msgid "Previous unresolved discussion"
+msgstr ""
+
+msgid "Primary"
+msgstr ""
+
+msgid "Print codes"
+msgstr ""
+
+msgid "Prioritize"
+msgstr ""
+
+msgid "Prioritize label"
+msgstr ""
+
+msgid "Prioritized Labels"
+msgstr ""
+
+msgid "Prioritized label"
+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 "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 "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|\"Busy\" will be shown next to your name"
+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|Avatar cropper"
+msgstr ""
+
+msgid "Profiles|Avatar will be removed. Are you sure?"
+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|Click on icon to activate signin with one of the following services"
+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 profiles"
+msgstr ""
+
+msgid "Profiles|Edit Profile"
+msgstr ""
+
+msgid "Profiles|Enter your name, so people you know can recognize you"
+msgstr ""
+
+msgid "Profiles|Expires at"
+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|Give your individual key a title."
+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 password"
+msgstr ""
+
+msgid "Profiles|Invalid username"
+msgstr ""
+
+msgid "Profiles|Key"
+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|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|Public Avatar"
+msgstr ""
+
+msgid "Profiles|Public email"
+msgstr ""
+
+msgid "Profiles|Remove avatar"
+msgstr ""
+
+msgid "Profiles|Set new profile picture"
+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 doesn't look like a public SSH key, are you sure you want to add it? It will be publicly visible."
+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|Two-Factor Authentication"
+msgstr ""
+
+msgid "Profiles|Type your %{confirmationValue} to confirm:"
+msgstr ""
+
+msgid "Profiles|Typically starts with \"ssh-ed25519 …\" or \"ssh-rsa …\""
+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|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 set your current timezone here"
+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 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 key has expired"
+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|e.g. My MacBook key"
+msgstr ""
+
+msgid "Profiles|username"
+msgstr ""
+
+msgid "Profiles|website.com"
+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 "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 Audit Events"
+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 already deleted"
+msgstr ""
+
+msgid "Project and wiki repositories"
+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 details"
+msgstr ""
+
+msgid "Project does not exist or you don't have permission to perform this action"
+msgstr ""
+
+msgid "Project export could not be deleted."
+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 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 info:"
+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 name suffix"
+msgstr ""
+
+msgid "Project navigation"
+msgstr ""
+
+msgid "Project order will not be saved as local storage is not available."
+msgstr ""
+
+msgid "Project overview"
+msgstr ""
+
+msgid "Project path"
+msgstr ""
+
+msgid "Project scanning help page"
+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 "ProjectLifecycle|Stage"
+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 have reached your project limit"
+msgstr ""
+
+msgid "ProjectOverview|You must sign in to star a project"
+msgstr ""
+
+msgid "ProjectPage|Project ID: %{project_id}"
+msgstr ""
+
+msgid "ProjectSelect| or group"
+msgstr ""
+
+msgid "ProjectSelect|Search for project"
+msgstr ""
+
+msgid "ProjectService|%{service_title}: status off"
+msgstr ""
+
+msgid "ProjectService|%{service_title}: status on"
+msgstr ""
+
+msgid "ProjectService|Event will be triggered by a push to the repository"
+msgstr ""
+
+msgid "ProjectService|Event will be triggered when a commit is created/updated"
+msgstr ""
+
+msgid "ProjectService|Event will be triggered when a confidential issue is created/updated/closed"
+msgstr ""
+
+msgid "ProjectService|Event will be triggered when a deployment starts or finishes"
+msgstr ""
+
+msgid "ProjectService|Event will be triggered when a merge request is created/updated/merged"
+msgstr ""
+
+msgid "ProjectService|Event will be triggered when a new tag is pushed to the repository"
+msgstr ""
+
+msgid "ProjectService|Event will be triggered when a new, unique alert is recorded"
+msgstr ""
+
+msgid "ProjectService|Event will be triggered when a pipeline status changes"
+msgstr ""
+
+msgid "ProjectService|Event will be triggered when a wiki page is created/updated"
+msgstr ""
+
+msgid "ProjectService|Event will be triggered when an issue is created/updated/closed"
+msgstr ""
+
+msgid "ProjectService|Event will be triggered when someone adds a comment"
+msgstr ""
+
+msgid "ProjectService|Event will be triggered when someone adds a comment on a confidential issue"
+msgstr ""
+
+msgid "ProjectService|Perform common operations on GitLab project: %{project_name}"
+msgstr ""
+
+msgid "ProjectService|To set up this service:"
+msgstr ""
+
+msgid "ProjectSettings|Additional merge request capabilities that influence how and when merges will be performed"
+msgstr ""
+
+msgid "ProjectSettings|All discussions must be resolved"
+msgstr ""
+
+msgid "ProjectSettings|Allow"
+msgstr ""
+
+msgid "ProjectSettings|Allow editing commit messages"
+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 your merge method, merge options, merge checks, and merge suggestions."
+msgstr ""
+
+msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
+msgstr ""
+
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+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|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."
+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|Forks"
+msgstr ""
+
+msgid "ProjectSettings|Git Large File Storage (LFS)"
+msgstr ""
+
+msgid "ProjectSettings|Global"
+msgstr ""
+
+msgid "ProjectSettings|If pipelines for merge requests are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches."
+msgstr ""
+
+msgid "ProjectSettings|Internal"
+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|Lightweight issue tracking system."
+msgstr ""
+
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
+msgstr ""
+
+msgid "ProjectSettings|Merge checks"
+msgstr ""
+
+msgid "ProjectSettings|Merge commit"
+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 suggestions"
+msgstr ""
+
+msgid "ProjectSettings|No merge commits are created"
+msgstr ""
+
+msgid "ProjectSettings|Note: the container registry is always visible when a project is public"
+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"
+msgstr ""
+
+msgid "ProjectSettings|Pipelines must succeed"
+msgstr ""
+
+msgid "ProjectSettings|Pipelines need to be configured to enable this feature."
+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|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
+msgstr ""
+
+msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made 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/view merge request when pushing from the command line"
+msgstr ""
+
+msgid "ProjectSettings|Skipped pipelines are considered successful"
+msgstr ""
+
+msgid "ProjectSettings|Snippets"
+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|The commit message used to apply merge request suggestions"
+msgstr ""
+
+msgid "ProjectSettings|The variables GitLab supports:"
+msgstr ""
+
+msgid "ProjectSettings|These checks must pass before merge requests can be merged"
+msgstr ""
+
+msgid "ProjectSettings|This introduces the risk of merging changes that will not pass the pipeline."
+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|This will dictate the commit history when you merge a merge request"
+msgstr ""
+
+msgid "ProjectSettings|Transfer project"
+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 will only have 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|What are badges?"
+msgstr ""
+
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgstr ""
+
+msgid "ProjectSettings|When conflicts arise 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/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|Static Site Editor/Middleman"
+msgstr ""
+
+msgid "ProjectTemplates|iOS (Swift)"
+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 shared with %{group_name}"
+msgstr ""
+
+msgid "Projects that belong to a group are prefixed with the group namespace. Existing projects may be moved into a group."
+msgstr ""
+
+msgid "Projects to index"
+msgstr ""
+
+msgid "Projects will be permanently deleted after a %{waiting_period}-day waiting period."
+msgstr ""
+
+msgid "Projects will be permanently deleted immediately."
+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 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|Blank"
+msgstr ""
+
+msgid "ProjectsNew|Blank project"
+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 blank project"
+msgstr ""
+
+msgid "ProjectsNew|Create from template"
+msgstr ""
+
+msgid "ProjectsNew|Create new project"
+msgstr ""
+
+msgid "ProjectsNew|Creating project & repository."
+msgstr ""
+
+msgid "ProjectsNew|Description format"
+msgstr ""
+
+msgid "ProjectsNew|Import"
+msgstr ""
+
+msgid "ProjectsNew|Import project"
+msgstr ""
+
+msgid "ProjectsNew|Initialize repository with a README"
+msgstr ""
+
+msgid "ProjectsNew|No import options available"
+msgstr ""
+
+msgid "ProjectsNew|Please wait a moment, this page will automatically refresh when ready."
+msgstr ""
+
+msgid "ProjectsNew|Project description %{tag_start}(optional)%{tag_end}"
+msgstr ""
+
+msgid "ProjectsNew|Run CI/CD for external repository"
+msgstr ""
+
+msgid "ProjectsNew|Template"
+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|%{count} alerts applied"
+msgstr ""
+
+msgid "PrometheusAlerts|%{firingCount} firing"
+msgstr ""
+
+msgid "PrometheusAlerts|Add alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Edit alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error creating alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error deleting alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error fetching alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error saving alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Firing: %{alerts}"
+msgstr ""
+
+msgid "PrometheusAlerts|Firing: %{alert}"
+msgstr ""
+
+msgid "PrometheusAlerts|Operator"
+msgstr ""
+
+msgid "PrometheusAlerts|Runbook URL (optional)"
+msgstr ""
+
+msgid "PrometheusAlerts|Select query"
+msgstr ""
+
+msgid "PrometheusAlerts|Threshold"
+msgstr ""
+
+msgid "PrometheusAlerts|exceeded"
+msgstr ""
+
+msgid "PrometheusAlerts|https://gitlab.com/gitlab-com/runbooks"
+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"
+msgstr ""
+
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
+msgstr ""
+
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
+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|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|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
+msgid "PrometheusService|Install Prometheus on clusters"
+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|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+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|PrometheusService|The ID of the IAP-secured resource."
+msgstr ""
+
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+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 enable the installation of Prometheus on your clusters, 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 has been deprecated."
+msgstr ""
+
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
+msgid "Promote"
+msgstr ""
+
+msgid "Promote confidential issue to a non-confidential epic"
+msgstr ""
+
+msgid "Promote issue to an epic"
+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 confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
+msgstr ""
+
+msgid "Promoted issue to an epic."
+msgstr ""
+
+msgid "Promotion is not supported."
+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|Dismiss burndown charts 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 milestones with Burndown Charts."
+msgstr ""
+
+msgid "Promotions|Learn more"
+msgstr ""
+
+msgid "Promotions|Not now, thanks!"
+msgstr ""
+
+msgid "Promotions|See the other features in the %{subscription_link_start}bronze plan%{subscription_link_end}"
+msgstr ""
+
+msgid "Promotions|Start GitLab Ultimate trial"
+msgstr ""
+
+msgid "Promotions|This feature is locked."
+msgstr ""
+
+msgid "Promotions|Track activity with Contribution Analytics."
+msgstr ""
+
+msgid "Promotions|Try it for free"
+msgstr ""
+
+msgid "Promotions|Upgrade plan"
+msgstr ""
+
+msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
+msgstr ""
+
+msgid "Promotions|Upgrade your plan to improve milestones with Burndown Charts."
+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|With Contribution Analytics you can have an overview for the activity of issues, merge requests, and push events of your organization and its members."
+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"
+msgstr ""
+
+msgid "Protected Tag"
+msgstr ""
+
+msgid "Protected Tags"
+msgstr ""
+
+msgid "Protected branches"
+msgstr ""
+
+msgid "Protected environments"
+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|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:"
+msgstr ""
+
+msgid "ProtectedBranch|Code owner approval"
+msgstr ""
+
+msgid "ProtectedBranch|Does not apply to users allowed to push."
+msgstr ""
+
+msgid "ProtectedBranch|Protect"
+msgstr ""
+
+msgid "ProtectedBranch|Protect a branch"
+msgstr ""
+
+msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
+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 code owner approval"
+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|Select an environment"
+msgstr ""
+
+msgid "ProtectedEnvironment|Select users"
+msgstr ""
+
+msgid "ProtectedEnvironment|Select users to deploy and manage Feature Flag settings"
+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 "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgstr ""
+
+msgid "Protocol"
+msgstr ""
+
+msgid "Provider"
+msgstr ""
+
+msgid "Proxy support for this API is not available currently"
+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 (%{deploy_keys_count})"
+msgstr ""
+
+msgid "Public pipelines"
+msgstr ""
+
+msgid "Public projects Minutes cost factor"
+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 "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 the result of the merge 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|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|Pushover makes it easy to get real-time notifications on your Android device, iPhone, iPad, and Desktop."
+msgstr ""
+
+msgid "PushoverService|See project %{project_full_name}"
+msgstr ""
+
+msgid "PushoverService|Total commits count: %{total_commits_count}"
+msgstr ""
+
+msgid "PushoverService|Your application key"
+msgstr ""
+
+msgid "PushoverService|Your user key"
+msgstr ""
+
+msgid "Quarters"
+msgstr ""
+
+msgid "Query"
+msgstr ""
+
+msgid "Query cannot be processed"
+msgstr ""
+
+msgid "Query is valid"
+msgstr ""
+
+msgid "Queued"
+msgstr ""
+
+msgid "Quick actions can be used in the issues description and comment boxes."
+msgstr ""
+
+msgid "Quick range"
+msgstr ""
+
+msgid "Quickly and easily edit multiple files in your project."
+msgstr ""
+
+msgid "README"
+msgstr ""
+
+msgid "Rails"
+msgstr ""
+
+msgid "Rake Tasks Help"
+msgstr ""
+
+msgid "Random"
+msgstr ""
+
+msgid "Raw blob request rate limit per minute"
+msgstr ""
+
+msgid "Re-authentication period expired or never requested. Please try again"
+msgstr ""
+
+msgid "Re-authentication required"
+msgstr ""
+
+msgid "Re-request review"
+msgstr ""
+
+msgid "Re-verification interval"
+msgstr ""
+
+msgid "Read more"
+msgstr ""
+
+msgid "Read more about project permissions %{help_link_open}here%{help_link_close}"
+msgstr ""
+
+msgid "Read more about related issues"
+msgstr ""
+
+msgid "Real-time features"
+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 "Receive alerts from manually configured Prometheus servers."
+msgstr ""
+
+msgid "Receive notifications about your own activity"
+msgstr ""
+
+msgid "Receive product marketing emails"
+msgstr ""
+
+msgid "Recent"
+msgstr ""
+
+msgid "Recent Activity"
+msgstr ""
+
+msgid "Recent Project Activity"
+msgstr ""
+
+msgid "Recent Searches Service is unavailable"
+msgstr ""
+
+msgid "Recent jobs served by this runner"
+msgstr ""
+
+msgid "Recent searches"
+msgstr ""
+
+msgid "Reconfigure"
+msgstr ""
+
+msgid "Recover hidden stage"
+msgstr ""
+
+msgid "Recovering projects"
+msgstr ""
+
+msgid "Recovery Codes"
+msgstr ""
+
+msgid "Redirect to SAML provider to test configuration"
+msgstr ""
+
+msgid "Redis"
+msgstr ""
+
+msgid "Reduce project visibility"
+msgstr ""
+
+msgid "Reduce this project’s visibility?"
+msgstr ""
+
+msgid "Reference:"
+msgstr ""
+
+msgid "References"
+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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "Regenerate export"
+msgstr ""
+
+msgid "Regenerate instance ID"
+msgstr ""
+
+msgid "Regenerate key"
+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 that Elasticsearch is configured"
+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 a runner on a Kubernetes cluster. %{link_to_help_page}"
+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|Checkout"
+msgstr ""
+
+msgid "Registration|Your GitLab group"
+msgstr ""
+
+msgid "Registration|Your first project"
+msgstr ""
+
+msgid "Registration|Your profile"
+msgstr ""
+
+msgid "Registry setup"
+msgstr ""
+
+msgid "Regulate approvals by authors/committers. Affects all projects."
+msgstr ""
+
+msgid "Reindexing Status: %{status}"
+msgstr ""
+
+msgid "Rejected (closed)"
+msgstr ""
+
+msgid "Related Issues"
+msgstr ""
+
+msgid "Related issues"
+msgstr ""
+
+msgid "Related merge requests"
+msgstr ""
+
+msgid "Relates to"
+msgstr ""
+
+msgid "Release"
+msgid_plural "Releases"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+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%{codeEnd}, %{codeStart}v2.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 "Remediations"
+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 all or specific assignee(s)"
+msgstr ""
+
+msgid "Remove all or specific label(s)"
+msgstr ""
+
+msgid "Remove all or specific reviewer(s)"
+msgstr ""
+
+msgid "Remove approver"
+msgstr ""
+
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
+msgid "Remove asset link"
+msgstr ""
+
+msgid "Remove assignee"
+msgstr ""
+
+msgid "Remove avatar"
+msgstr ""
+
+msgid "Remove card"
+msgstr ""
+
+msgid "Remove child epic from an epic"
+msgstr ""
+
+msgid "Remove description history"
+msgstr ""
+
+msgid "Remove due date"
+msgstr ""
+
+msgid "Remove file"
+msgstr ""
+
+msgid "Remove fork relationship"
+msgstr ""
+
+msgid "Remove from batch"
+msgstr ""
+
+msgid "Remove from board"
+msgstr ""
+
+msgid "Remove from epic"
+msgstr ""
+
+msgid "Remove group"
+msgstr ""
+
+msgid "Remove iteration"
+msgstr ""
+
+msgid "Remove license"
+msgstr ""
+
+msgid "Remove limit"
+msgstr ""
+
+msgid "Remove list"
+msgstr ""
+
+msgid "Remove member"
+msgstr ""
+
+msgid "Remove milestone"
+msgstr ""
+
+msgid "Remove node"
+msgstr ""
+
+msgid "Remove parent epic from an epic"
+msgstr ""
+
+msgid "Remove primary node"
+msgstr ""
+
+msgid "Remove priority"
+msgstr ""
+
+msgid "Remove report"
+msgstr ""
+
+msgid "Remove reviewer"
+msgstr ""
+
+msgid "Remove runner"
+msgstr ""
+
+msgid "Remove secondary node"
+msgstr ""
+
+msgid "Remove spent time"
+msgstr ""
+
+msgid "Remove stage"
+msgstr ""
+
+msgid "Remove time estimate"
+msgstr ""
+
+msgid "Remove user"
+msgstr ""
+
+msgid "Remove user & report"
+msgstr ""
+
+msgid "Remove user from group"
+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 %{type} with id %{id}"
+msgstr ""
+
+msgid "Removed all labels."
+msgstr ""
+
+msgid "Removed an issue from an epic."
+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 "RemovedProjects|Projects which are removed and are yet to be permanently removed are visible here."
+msgstr ""
+
+msgid "RemovedProjects|You haven’t removed any projects."
+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 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 "Renew subscription"
+msgstr ""
+
+msgid "Reopen"
+msgstr ""
+
+msgid "Reopen %{issueType}"
+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 "Repair authentication"
+msgstr ""
+
+msgid "Replace"
+msgstr ""
+
+msgid "Replace all label(s)"
+msgstr ""
+
+msgid "Replaced all labels with %{label_references} %{label_text}."
+msgstr ""
+
+msgid "Replaces the clone URL root."
+msgstr ""
+
+msgid "Replication"
+msgstr ""
+
+msgid "Replication details"
+msgstr ""
+
+msgid "Replication enabled"
+msgstr ""
+
+msgid "Replication paused"
+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 "Reported %{timeAgo} by %{reportedBy}"
+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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+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[3] ""
+msgstr[4] ""
+
+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|Class"
+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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+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[3] ""
+msgstr[4] ""
+
+msgid "Reports|Failure"
+msgstr ""
+
+msgid "Reports|Identifier"
+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|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 results are being parsed"
+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|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|Last Update"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Latest test coverage results"
+msgstr ""
+
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+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|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 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 must contain at least 1 file."
+msgstr ""
+
+msgid "Repository size is above the limit."
+msgstr ""
+
+msgid "Repository static objects"
+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} / LFS: %{counter_lfs_objects} / Snippets: %{counter_snippets} / Packages: %{counter_packages} / Uploads: %{counter_uploads}"
+msgstr ""
+
+msgid "RepositorySettingsAccessLevel|Select"
+msgstr ""
+
+msgid "Request Access"
+msgstr ""
+
+msgid "Request details"
+msgstr ""
+
+msgid "Request new confirmation email"
+msgstr ""
+
+msgid "Request parameter %{param} is missing."
+msgstr ""
+
+msgid "Request review from"
+msgstr ""
+
+msgid "Request to link SAML account must be authorized"
+msgstr ""
+
+msgid "Requested"
+msgstr ""
+
+msgid "Requested %{time_ago}"
+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 to these domain(s)/address(es) on the local network will be allowed when local requests from hooks and services are not allowed. IP ranges such as 1:0:0:0:0:0:0:0/124 or 127.0.0.0/28 are supported. Domain wildcards are not supported currently. Use comma, semicolon, or newline to separate multiple entries. The allowlist can hold a maximum of 1000 entries. Domains should use IDNA encoding. Ex: example.com, 192.168.1.1, 127.0.0.0/28, xn--itlab-j1a.com."
+msgstr ""
+
+msgid "Require admin approval for new sign-ups"
+msgstr ""
+
+msgid "Require all users in this group to setup two-factor authentication"
+msgstr ""
+
+msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
+msgstr ""
+
+msgid "Require new approvals when new commits are added to an MR."
+msgstr ""
+
+msgid "Require user password for approvals."
+msgstr ""
+
+msgid "Require users to prove ownership of custom domains"
+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 "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 approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "Requires values to meet regular expression requirements."
+msgstr ""
+
+msgid "Resend Request"
+msgstr ""
+
+msgid "Resend confirmation email"
+msgstr ""
+
+msgid "Resend invite"
+msgstr ""
+
+msgid "Resend it"
+msgstr ""
+
+msgid "Reset"
+msgstr ""
+
+msgid "Reset authorization key"
+msgstr ""
+
+msgid "Reset authorization key?"
+msgstr ""
+
+msgid "Reset filters"
+msgstr ""
+
+msgid "Reset health check access token"
+msgstr ""
+
+msgid "Reset key"
+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 all threads in new issue"
+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 "Resolves IP addresses once and uses them to submit requests"
+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 Terminal"
+msgstr ""
+
+msgid "Restore"
+msgstr ""
+
+msgid "Restore group"
+msgstr ""
+
+msgid "Restore project"
+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 membership by email domain"
+msgstr ""
+
+msgid "Restrict projects for this runner"
+msgstr ""
+
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
+msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
+msgstr ""
+
+msgid "Resume"
+msgstr ""
+
+msgid "Resync"
+msgstr ""
+
+msgid "Resync all"
+msgstr ""
+
+msgid "Resync all %{replicableType}"
+msgstr ""
+
+msgid "Retry"
+msgstr ""
+
+msgid "Retry job"
+msgstr ""
+
+msgid "Retry migration"
+msgstr ""
+
+msgid "Retry this job"
+msgstr ""
+
+msgid "Retry this job in order to create the necessary resources."
+msgstr ""
+
+msgid "Retry update"
+msgstr ""
+
+msgid "Retry verification"
+msgstr ""
+
+msgid "Reveal value"
+msgid_plural "Reveal values"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+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 requested from %{name}"
+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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "Reviewer(s)"
+msgstr ""
+
+msgid "Reviewers"
+msgstr ""
+
+msgid "Reviewing"
+msgstr ""
+
+msgid "Reviewing (merge request !%{mergeRequestId})"
+msgstr ""
+
+msgid "Revoke"
+msgstr ""
+
+msgid "Revoked"
+msgstr ""
+
+msgid "Revoked impersonation token %{token_name}!"
+msgstr ""
+
+msgid "Revoked personal access token %{personal_access_token_name}!"
+msgstr ""
+
+msgid "Revoked project access token %{project_access_token_name}!"
+msgstr ""
+
+msgid "RightSidebar|Issue email: %{copyText}"
+msgstr ""
+
+msgid "RightSidebar|adding a"
+msgstr ""
+
+msgid "RightSidebar|deleting the"
+msgstr ""
+
+msgid "Roadmap"
+msgstr ""
+
+msgid "Role"
+msgstr ""
+
+msgid "Rollback"
+msgstr ""
+
+msgid "Rook"
+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 CI/CD pipelines for external repositories"
+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 is %{status}, last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runner token"
+msgstr ""
+
+msgid "Runner tokens"
+msgstr ""
+
+msgid "Runner was not deleted because it is assigned to multiple projects."
+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 can be:"
+msgstr ""
+
+msgid "Runners currently online: %{active_runners_count}"
+msgstr ""
+
+msgid "Runners page."
+msgstr ""
+
+msgid "Runners|Active"
+msgstr ""
+
+msgid "Runners|An error has occurred fetching instructions"
+msgstr ""
+
+msgid "Runners|Architecture"
+msgstr ""
+
+msgid "Runners|Can run untagged jobs"
+msgstr ""
+
+msgid "Runners|Copy instructions"
+msgstr ""
+
+msgid "Runners|Description"
+msgstr ""
+
+msgid "Runners|Download Latest Binary"
+msgstr ""
+
+msgid "Runners|Download and Install Binary"
+msgstr ""
+
+msgid "Runners|Group"
+msgstr ""
+
+msgid "Runners|IP Address"
+msgstr ""
+
+msgid "Runners|Install a Runner"
+msgstr ""
+
+msgid "Runners|Last contact"
+msgstr ""
+
+msgid "Runners|Locked to this project"
+msgstr ""
+
+msgid "Runners|Maximum job timeout"
+msgstr ""
+
+msgid "Runners|Name"
+msgstr ""
+
+msgid "Runners|Platform"
+msgstr ""
+
+msgid "Runners|Property Name"
+msgstr ""
+
+msgid "Runners|Protected"
+msgstr ""
+
+msgid "Runners|Register Runner"
+msgstr ""
+
+msgid "Runners|Revision"
+msgstr ""
+
+msgid "Runners|Shared"
+msgstr ""
+
+msgid "Runners|Show Runner installation instructions"
+msgstr ""
+
+msgid "Runners|Specific"
+msgstr ""
+
+msgid "Runners|Tags"
+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|Value"
+msgstr ""
+
+msgid "Runners|Version"
+msgstr ""
+
+msgid "Runners|View installation instructions"
+msgstr ""
+
+msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
+msgstr ""
+
+msgid "Running"
+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 "Runs jobs from all unassigned projects in its group."
+msgstr ""
+
+msgid "Runs jobs from all unassigned projects."
+msgstr ""
+
+msgid "Runs jobs from assigned projects."
+msgstr ""
+
+msgid "SAML"
+msgstr ""
+
+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 allow you to establish a secure connection between your computer and GitLab."
+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 Value Stream"
+msgstr ""
+
+msgid "Save application"
+msgstr ""
+
+msgid "Save changes"
+msgstr ""
+
+msgid "Save changes before testing"
+msgstr ""
+
+msgid "Save comment"
+msgstr ""
+
+msgid "Save password"
+msgstr ""
+
+msgid "Save pipeline schedule"
+msgstr ""
+
+msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
+msgstr ""
+
+msgid "Saved scan settings and target site settings which are reusable."
+msgstr ""
+
+msgid "Saving"
+msgstr ""
+
+msgid "Saving project."
+msgstr ""
+
+msgid "Scanner"
+msgstr ""
+
+msgid "Schedule a new pipeline"
+msgstr ""
+
+msgid "Scheduled"
+msgstr ""
+
+msgid "Scheduled Deletion At - %{permanent_deletion_time}"
+msgstr ""
+
+msgid "Scheduled a rebase of branch %{branch}."
+msgstr ""
+
+msgid "Scheduled to merge this merge request (%{strategy})."
+msgstr ""
+
+msgid "Schedules"
+msgstr ""
+
+msgid "Schedules to merge this merge request (%{strategy})."
+msgstr ""
+
+msgid "Scheduling"
+msgstr ""
+
+msgid "Scheduling Pipelines"
+msgstr ""
+
+msgid "Scope"
+msgstr ""
+
+msgid "Scope board to current iteration"
+msgstr ""
+
+msgid "Scopes"
+msgstr ""
+
+msgid "Scopes [Select 1 or more]"
+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 Jira issues"
+msgstr ""
+
+msgid "Search a group"
+msgstr ""
+
+msgid "Search an environment spec"
+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 projects, issues, etc."
+msgstr ""
+
+msgid "Search for this text"
+msgstr ""
+
+msgid "Search forks"
+msgstr ""
+
+msgid "Search labels"
+msgstr ""
+
+msgid "Search merge requests"
+msgstr ""
+
+msgid "Search milestones"
+msgstr ""
+
+msgid "Search or filter results..."
+msgstr ""
+
+msgid "Search or filter results…"
+msgstr ""
+
+msgid "Search or jump to…"
+msgstr ""
+
+msgid "Search project"
+msgstr ""
+
+msgid "Search projects"
+msgstr ""
+
+msgid "Search projects..."
+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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "SearchResults|comment"
+msgid_plural "SearchResults|comments"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "SearchResults|commit"
+msgid_plural "SearchResults|commits"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "SearchResults|epic"
+msgid_plural "SearchResults|epics"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "SearchResults|issue"
+msgid_plural "SearchResults|issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "SearchResults|merge request"
+msgid_plural "SearchResults|merge requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "SearchResults|milestone"
+msgid_plural "SearchResults|milestones"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "SearchResults|project"
+msgid_plural "SearchResults|projects"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "SearchResults|snippet"
+msgid_plural "SearchResults|snippets"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "SearchResults|user"
+msgid_plural "SearchResults|users"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "SearchResults|wiki result"
+msgid_plural "SearchResults|wiki results"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "Searching by both author and message is currently not supported."
+msgstr ""
+
+msgid "Seat Link"
+msgstr ""
+
+msgid "Seat Link is disabled, and cannot be configured through this form."
+msgstr ""
+
+msgid "SeatUsage|Seat usage"
+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 "Seconds"
+msgstr ""
+
+msgid "Secret"
+msgstr ""
+
+msgid "Secret Detection"
+msgstr ""
+
+msgid "Secret token"
+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|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
+msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
+msgstr ""
+
+msgid "SecurityApprovals|Requires approval for vulnerabilities of Critical, High, or Unknown severity. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "SecurityConfiguration|An error occurred while creating the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|Available for on-demand DAST"
+msgstr ""
+
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
+msgstr ""
+
+msgid "SecurityConfiguration|Configure via Merge Request"
+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"
+msgstr ""
+
+msgid "SecurityConfiguration|Enabled"
+msgstr ""
+
+msgid "SecurityConfiguration|Enabled with Auto DevOps"
+msgstr ""
+
+msgid "SecurityConfiguration|Feature documentation for %{featureName}"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage"
+msgstr ""
+
+msgid "SecurityConfiguration|More information"
+msgstr ""
+
+msgid "SecurityConfiguration|Not enabled"
+msgstr ""
+
+msgid "SecurityConfiguration|SAST Analyzers"
+msgstr ""
+
+msgid "SecurityConfiguration|SAST Configuration"
+msgstr ""
+
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
+msgid "SecurityConfiguration|Security Control"
+msgstr ""
+
+msgid "SecurityConfiguration|Status"
+msgstr ""
+
+msgid "SecurityConfiguration|Testing & Compliance"
+msgstr ""
+
+msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
+msgstr ""
+
+msgid "SecurityConfiguration|View history"
+msgstr ""
+
+msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
+msgstr ""
+
+msgid "SecurityReports|%{firstProject} and %{secondProject}"
+msgstr ""
+
+msgid "SecurityReports|%{firstProject}, %{secondProject}, and %{rest}"
+msgstr ""
+
+msgid "SecurityReports|Add a project to your dashboard"
+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|Add projects to your group"
+msgstr ""
+
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
+msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
+msgstr ""
+
+msgid "SecurityReports|Comment deleted on '%{vulnerabilityName}'"
+msgstr ""
+
+msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
+msgstr ""
+
+msgid "SecurityReports|Create Jira issue"
+msgstr ""
+
+msgid "SecurityReports|Create issue"
+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 Report"
+msgstr ""
+
+msgid "SecurityReports|Download results"
+msgstr ""
+
+msgid "SecurityReports|Download scanned resources"
+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|Failed to get security report information. Please reload the page or try again later."
+msgstr ""
+
+msgid "SecurityReports|Fuzzing artifacts"
+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|Monitor vulnerabilities in your code"
+msgstr ""
+
+msgid "SecurityReports|Monitored projects"
+msgstr ""
+
+msgid "SecurityReports|More info"
+msgstr ""
+
+msgid "SecurityReports|More information"
+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|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|Scan details"
+msgstr ""
+
+msgid "SecurityReports|Scanner"
+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|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|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
+msgstr ""
+
+msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Select \"Edit dashboard\" to add and remove projects."
+msgstr ""
+
+msgid "SecurityReports|The security dashboard displays the latest security report. Use it to find and fix vulnerabilities."
+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|To widen your search, change or remove filters above"
+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 Report"
+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|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
+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 "Security|Policies"
+msgstr ""
+
+msgid "See GitLab's %{password_policy_guidelines}"
+msgstr ""
+
+msgid "See metrics"
+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 GitLab project to link with your Slack team"
+msgstr ""
+
+msgid "Select Page"
+msgstr ""
+
+msgid "Select Stack"
+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 ""
+
+msgid "Select a namespace to fork the project"
+msgstr ""
+
+msgid "Select a new namespace"
+msgstr ""
+
+msgid "Select a project"
+msgstr ""
+
+msgid "Select a project to read Insights configuration file"
+msgstr ""
+
+msgid "Select a reason"
+msgstr ""
+
+msgid "Select a repository"
+msgstr ""
+
+msgid "Select a template repository"
+msgstr ""
+
+msgid "Select a template type"
+msgstr ""
+
+msgid "Select a timezone"
+msgstr ""
+
+msgid "Select all"
+msgstr ""
+
+msgid "Select an existing Kubernetes cluster or create a new one."
+msgstr ""
+
+msgid "Select assignee"
+msgstr ""
+
+msgid "Select branch"
+msgstr ""
+
+msgid "Select due date"
+msgstr ""
+
+msgid "Select epic"
+msgstr ""
+
+msgid "Select file"
+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 projects"
+msgstr ""
+
+msgid "Select required regulatory standard."
+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 subscription"
+msgstr ""
+
+msgid "Select target branch"
+msgstr ""
+
+msgid "Select the custom project template source group."
+msgstr ""
+
+msgid "Select timezone"
+msgstr ""
+
+msgid "Select type"
+msgstr ""
+
+msgid "Select user"
+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 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|Disable self monitoring?"
+msgstr ""
+
+msgid "SelfMonitoring|Disabling this feature will delete the self monitoring project. Are you sure you want to delete the project?"
+msgstr ""
+
+msgid "SelfMonitoring|Enable or disable instance self monitoring"
+msgstr ""
+
+msgid "SelfMonitoring|Enabling this feature creates a %{projectLinkStart}project%{projectLinkEnd} that can be used to monitor the health of your instance."
+msgstr ""
+
+msgid "SelfMonitoring|Enabling this feature creates a project that can be used to monitor the health of your instance."
+msgstr ""
+
+msgid "SelfMonitoring|Self monitoring"
+msgstr ""
+
+msgid "SelfMonitoring|Self monitoring project has been successfully created."
+msgstr ""
+
+msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
+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 notification"
+msgstr ""
+
+msgid "Send message"
+msgstr ""
+
+msgid "Send report"
+msgstr ""
+
+msgid "Send usage data"
+msgstr ""
+
+msgid "Sentry API URL"
+msgstr ""
+
+msgid "Sentry event"
+msgstr ""
+
+msgid "Sep"
+msgstr ""
+
+msgid "Separate topics with commas."
+msgstr ""
+
+msgid "September"
+msgstr ""
+
+msgid "SeriesFinalConjunction|and"
+msgstr ""
+
+msgid "Serve repository static objects (e.g. archives, blobs, ...) from an external storage (e.g. a CDN)."
+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 domain"
+msgstr ""
+
+msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgstr ""
+
+msgid "ServerlessDetails|Install Prometheus"
+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|Help shape the future of Serverless at GitLab"
+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|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
+msgstr ""
+
+msgid "Serverless|Install Knative"
+msgstr ""
+
+msgid "Serverless|Learn more about Serverless"
+msgstr ""
+
+msgid "Serverless|No functions available"
+msgstr ""
+
+msgid "Serverless|Sign up for First Look"
+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|We are continually striving to improve our Serverless functionality. As a Knative user, we would love to hear how we can make this experience better for you. Sign up for GitLab First Look today and we will be in touch shortly."
+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 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 Desk is enabled but not yet active"
+msgstr ""
+
+msgid "Service Desk is not enabled"
+msgstr ""
+
+msgid "Service Desk is not supported"
+msgstr ""
+
+msgid "Service Templates"
+msgstr ""
+
+msgid "Service URL"
+msgstr ""
+
+msgid "Session ID"
+msgstr ""
+
+msgid "Session duration (minutes)"
+msgstr ""
+
+msgid "Set %{epic_ref} as the parent epic."
+msgstr ""
+
+msgid "Set .gitlab-ci.yml to enable or configure SAST"
+msgstr ""
+
+msgid "Set .gitlab-ci.yml to enable or configure SAST security scanning 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 "Set a default description template to be used for new issues. %{link_start}What are description templates?%{link_end}"
+msgstr ""
+
+msgid "Set a password on your account to pull or push via %{protocol}."
+msgstr ""
+
+msgid "Set a template repository for projects in this group"
+msgstr ""
+
+msgid "Set access permissions for this token."
+msgstr ""
+
+msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
+msgstr ""
+
+msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
+msgstr ""
+
+msgid "Set due date"
+msgstr ""
+
+msgid "Set instance-wide template repository"
+msgstr ""
+
+msgid "Set iteration"
+msgstr ""
+
+msgid "Set limit to 0 to allow any file size."
+msgstr ""
+
+msgid "Set max session time for web terminal."
+msgstr ""
+
+msgid "Set milestone"
+msgstr ""
+
+msgid "Set new password"
+msgstr ""
+
+msgid "Set notification email for abuse reports."
+msgstr ""
+
+msgid "Set parent epic to an epic"
+msgstr ""
+
+msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
+msgstr ""
+
+msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
+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 each job's artifacts. 0 for unlimited. The default unit is in seconds, but you can define an alternative. For example: %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
+msgstr ""
+
+msgid "Set the default name of the initial branch when creating new repositories through the user interface."
+msgstr ""
+
+msgid "Set the due date to %{due_date}."
+msgstr ""
+
+msgid "Set the duration for which the jobs will be considered as old and expired. Once that time passes, the jobs will be archived and no longer able to be retried. Make it empty to never expire jobs. It has to be no less than 1 day, for example: %{code_open}15 days%{code_close}, %{code_open}1 month%{code_close}, %{code_open}2 years%{code_close}."
+msgstr ""
+
+msgid "Set the iteration to %{iteration_reference}."
+msgstr ""
+
+msgid "Set the maximum file size for each job's artifacts"
+msgstr ""
+
+msgid "Set the maximum number of pipeline minutes that a group can use on shared Runners per month. 0 for unlimited."
+msgstr ""
+
+msgid "Set the milestone to %{milestone_reference}."
+msgstr ""
+
+msgid "Set the timeout in seconds to send a secondary node status to the primary and IPs allowed for the secondary nodes."
+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 automatically"
+msgstr ""
+
+msgid "Set up a %{type} runner manually"
+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 node."
+msgstr ""
+
+msgid "SetPasswordToCloneLink|set a password"
+msgstr ""
+
+msgid "SetStatusModal|\"Busy\" will be shown next to your name"
+msgstr ""
+
+msgid "SetStatusModal|Add status emoji"
+msgstr ""
+
+msgid "SetStatusModal|Busy"
+msgstr ""
+
+msgid "SetStatusModal|Clear status"
+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 "Sets %{epic_ref} as parent epic."
+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 time estimate to %{time_estimate}."
+msgstr ""
+
+msgid "Sets weight to %{weight}."
+msgstr ""
+
+msgid "Setting this to 0 means using the system default timeout value."
+msgstr ""
+
+msgid "Settings"
+msgstr ""
+
+msgid "Settings related to the use and experience of using GitLab's Package Registry."
+msgstr ""
+
+msgid "Setup"
+msgstr ""
+
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
+msgid "Severity"
+msgstr ""
+
+msgid "SeverityWidget|Severity"
+msgstr ""
+
+msgid "SeverityWidget|Severity: %{severity}"
+msgstr ""
+
+msgid "SeverityWidget|There was an error while updating severity."
+msgstr ""
+
+msgid "Shards (%{shards})"
+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 disabled on group level"
+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 "Sherlock Transactions"
+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 all activity"
+msgstr ""
+
+msgid "Show all issues."
+msgstr ""
+
+msgid "Show all members"
+msgstr ""
+
+msgid "Show all test cases."
+msgstr ""
+
+msgid "Show archived projects"
+msgstr ""
+
+msgid "Show archived projects only"
+msgstr ""
+
+msgid "Show command"
+msgstr ""
+
+msgid "Show comments"
+msgstr ""
+
+msgid "Show comments on this file"
+msgstr ""
+
+msgid "Show comments only"
+msgstr ""
+
+msgid "Show commit description"
+msgstr ""
+
+msgid "Show complete raw log"
+msgstr ""
+
+msgid "Show details"
+msgstr ""
+
+msgid "Show file browser"
+msgstr ""
+
+msgid "Show file contents"
+msgstr ""
+
+msgid "Show labels"
+msgstr ""
+
+msgid "Show latest version"
+msgstr ""
+
+msgid "Show links anyways"
+msgstr ""
+
+msgid "Show list"
+msgstr ""
+
+msgid "Show me advanced features"
+msgstr ""
+
+msgid "Show me how to add a pipeline"
+msgstr ""
+
+msgid "Show me the basics"
+msgstr ""
+
+msgid "Show one file at a time"
+msgstr ""
+
+msgid "Show only direct members"
+msgstr ""
+
+msgid "Show only inherited members"
+msgstr ""
+
+msgid "Show parent pages"
+msgstr ""
+
+msgid "Show parent subgroups"
+msgstr ""
+
+msgid "Show the Closed list"
+msgstr ""
+
+msgid "Show the Open list"
+msgstr ""
+
+msgid "Show whitespace changes"
+msgstr ""
+
+msgid "Showing %d event"
+msgid_plural "Showing %d events"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "Showing %{limit} of %{total_count} issues. "
+msgstr ""
+
+msgid "Showing %{pageSize} of %{total} issues"
+msgstr ""
+
+msgid "Showing all issues"
+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|Assign health status"
+msgstr ""
+
+msgid "Sidebar|Health status"
+msgstr ""
+
+msgid "Sidebar|No status"
+msgstr ""
+
+msgid "Sidebar|None"
+msgstr ""
+
+msgid "Sidebar|Only numeral characters allowed"
+msgstr ""
+
+msgid "Sidebar|Weight"
+msgstr ""
+
+msgid "Sign in"
+msgstr ""
+
+msgid "Sign in / Register"
+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 Single Sign-On"
+msgstr ""
+
+msgid "Sign in with smart card"
+msgstr ""
+
+msgid "Sign out"
+msgstr ""
+
+msgid "Sign out & Register"
+msgstr ""
+
+msgid "Sign up"
+msgstr ""
+
+msgid "Sign up was successful! Please confirm your email to sign in."
+msgstr ""
+
+msgid "Sign-in restrictions"
+msgstr ""
+
+msgid "Sign-in text"
+msgstr ""
+
+msgid "Sign-up restrictions"
+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 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 "Single or combined queries"
+msgstr ""
+
+msgid "Size"
+msgstr ""
+
+msgid "Size and domain settings for static websites"
+msgstr ""
+
+msgid "Size limit per repository (MB)"
+msgstr ""
+
+msgid "Size settings for static websites"
+msgstr ""
+
+msgid "Skip outdated deployment jobs"
+msgstr ""
+
+msgid "Skipped"
+msgstr ""
+
+msgid "Skipped deployment to"
+msgstr ""
+
+msgid "Slack application"
+msgstr ""
+
+msgid "Slack channels (e.g. general, development)"
+msgstr ""
+
+msgid "Slack integration allows you to interact with GitLab via slash commands in a chat window."
+msgstr ""
+
+msgid "SlackIntegration|%{strong_open}Note:%{strong_close} Usernames and private channels are not supported."
+msgstr ""
+
+msgid "SlackIntegration|%{webhooks_link_start}Add an incoming webhook%{webhooks_link_end} in your Slack team. The default channel can be overridden for each event."
+msgstr ""
+
+msgid "SlackIntegration|Paste the %{strong_open}Webhook URL%{strong_close} into the field below."
+msgstr ""
+
+msgid "SlackIntegration|Select events below to enable notifications. The %{strong_open}Slack channel names%{strong_close} and %{strong_open}Slack username%{strong_close} fields are optional."
+msgstr ""
+
+msgid "SlackIntegration|This service sends notifications about project events to Slack channels. To set up this service:"
+msgstr ""
+
+msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgstr ""
+
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgstr ""
+
+msgid "SlackService|Fill in the word that works best for your team."
+msgstr ""
+
+msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgstr ""
+
+msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgstr ""
+
+msgid "Smartcard"
+msgstr ""
+
+msgid "Smartcard authentication failed: client certificate header is missing."
+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|Add another file %{num}/%{total}"
+msgstr ""
+
+msgid "Snippets|Delete file"
+msgstr ""
+
+msgid "Snippets|Description (optional)"
+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 changes are not shown"
+msgstr ""
+
+msgid "Some child epics may be hidden due to applied filters"
+msgstr ""
+
+msgid "Some common domains are not allowed. %{read_more_link}."
+msgstr ""
+
+msgid "Some email servers do not support overriding the email sender name. Enable this option to include the name of the author of the issue, merge request or comment in the email body instead."
+msgstr ""
+
+msgid "Some of the designs you tried uploading did not change:"
+msgstr ""
+
+msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
+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 "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 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 ""
+
+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 package."
+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 %{listType} list"
+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 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 the environments for this merge request. Please try again."
+msgstr ""
+
+msgid "Something went wrong while fetching the package."
+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 merging this merge request. Please try again."
+msgstr ""
+
+msgid "Something went wrong while moving issues."
+msgstr ""
+
+msgid "Something went wrong while obtaining the Let's Encrypt certificate."
+msgstr ""
+
+msgid "Something went wrong while performing the action."
+msgstr ""
+
+msgid "Something went wrong while promoting the issue to an epic. Please try again."
+msgstr ""
+
+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} confidentiality."
+msgstr ""
+
+msgid "Something went wrong while stopping this environment. Please try again."
+msgstr ""
+
+msgid "Something went wrong while toggling auto-fix settings, please try again later."
+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 epics matched your search"
+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|Access level, ascending"
+msgstr ""
+
+msgid "SortOptions|Access level, descending"
+msgstr ""
+
+msgid "SortOptions|Blocking"
+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|Last joined"
+msgstr ""
+
+msgid "SortOptions|Last updated"
+msgstr ""
+
+msgid "SortOptions|Least popular"
+msgstr ""
+
+msgid "SortOptions|Less weight"
+msgstr ""
+
+msgid "SortOptions|Manual"
+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 joined"
+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|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 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 "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|If checked, only public projects will have code intelligence and communicate with Sourcegraph."
+msgstr ""
+
+msgid "SourcegraphAdmin|More information"
+msgstr ""
+
+msgid "SourcegraphAdmin|Save changes"
+msgstr ""
+
+msgid "SourcegraphAdmin|Sourcegraph URL"
+msgstr ""
+
+msgid "SourcegraphAdmin|e.g. 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 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 e-mail address regex pattern to identify default internal users."
+msgstr ""
+
+msgid "Speed up your pipelines with Needs relationships"
+msgstr ""
+
+msgid "Squash commit message"
+msgstr ""
+
+msgid "Squash commits"
+msgstr ""
+
+msgid "Stack trace"
+msgstr ""
+
+msgid "Stacktrace snippet"
+msgstr ""
+
+msgid "Stage"
+msgstr ""
+
+msgid "Stage data updated"
+msgstr ""
+
+msgid "Stage removed"
+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 and due date"
+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 merge train"
+msgstr ""
+
+msgid "Start merge train when pipeline succeeds"
+msgstr ""
+
+msgid "Start search"
+msgstr ""
+
+msgid "Start thread"
+msgstr ""
+
+msgid "Start thread & close %{noteable_name}"
+msgstr ""
+
+msgid "Start thread & reopen %{noteable_name}"
+msgstr ""
+
+msgid "Start your Free Ultimate Trial"
+msgstr ""
+
+msgid "Start your free trial"
+msgstr ""
+
+msgid "Start your trial"
+msgstr ""
+
+msgid "Started"
+msgstr ""
+
+msgid "Started %{startsIn}"
+msgstr ""
+
+msgid "Started asynchronous removal of all repository check states."
+msgstr ""
+
+msgid "Started:"
+msgstr ""
+
+msgid "Starting..."
+msgstr ""
+
+msgid "Starts %{startsIn}"
+msgstr ""
+
+msgid "Starts at (UTC)"
+msgstr ""
+
+msgid "Starts on"
+msgstr ""
+
+msgid "Starts: %{startsAt}"
+msgstr ""
+
+msgid "State your message to activate"
+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 "StatusPage|AWS Secret access key"
+msgstr ""
+
+msgid "StatusPage|AWS access key ID"
+msgstr ""
+
+msgid "StatusPage|AWS documentation"
+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|For help with configuration, visit %{docsLink}"
+msgstr ""
+
+msgid "StatusPage|S3 Bucket name"
+msgstr ""
+
+msgid "StatusPage|Status page"
+msgstr ""
+
+msgid "StatusPage|Status page URL"
+msgstr ""
+
+msgid "StatusPage|Status page frontend documentation"
+msgstr ""
+
+msgid "StatusPage|To publish incidents to an external status page, GitLab will store a JSON file in your Amazon S3 account in a location accessible to your external status page service. 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 1."
+msgstr ""
+
+msgid "Step 2."
+msgstr ""
+
+msgid "Step 3."
+msgstr ""
+
+msgid "Step 4."
+msgstr ""
+
+msgid "Still, we recommend keeping a backup saved somewhere. Otherwise, if you ever need it and have lost it, you will need to request GitLab Inc. to send it to you again."
+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 "Subgroup milestone"
+msgstr ""
+
+msgid "Subgroup navigation"
+msgstr ""
+
+msgid "Subgroup overview"
+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 %{humanized_resource_name}"
+msgstr ""
+
+msgid "Submit a review"
+msgstr ""
+
+msgid "Submit as spam"
+msgstr ""
+
+msgid "Submit changes"
+msgstr ""
+
+msgid "Submit changes..."
+msgstr ""
+
+msgid "Submit feedback"
+msgstr ""
+
+msgid "Submit issue"
+msgstr ""
+
+msgid "Submit review"
+msgstr ""
+
+msgid "Submit search"
+msgstr ""
+
+msgid "Submit the current review."
+msgstr ""
+
+msgid "Submit your changes"
+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 "Subscribes to this %{quick_action_target}."
+msgstr ""
+
+msgid "Subscription"
+msgstr ""
+
+msgid "Subscription deletion failed."
+msgstr ""
+
+msgid "Subscription successfully applied to \"%{group_name}\""
+msgstr ""
+
+msgid "Subscription successfully created."
+msgstr ""
+
+msgid "Subscription successfully deleted."
+msgstr ""
+
+msgid "SubscriptionTable|Add seats"
+msgstr ""
+
+msgid "SubscriptionTable|An error occurred while loading billable members list"
+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|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|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|Upgrade"
+msgstr ""
+
+msgid "SubscriptionTable|Usage"
+msgstr ""
+
+msgid "SubscriptionTable|Usage count is performed once a day at 12:00 PM."
+msgstr ""
+
+msgid "Subscriptions"
+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 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 unblocked"
+msgstr ""
+
+msgid "Successfully unlocked"
+msgstr ""
+
+msgid "Successfully verified domain ownership"
+msgstr ""
+
+msgid "Suggest code changes which can be immediately applied in one click. Try it out!"
+msgstr ""
+
+msgid "Suggested Solutions"
+msgstr ""
+
+msgid "Suggested change"
+msgstr ""
+
+msgid "Suggested solutions help link"
+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 "Sunday"
+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 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 information"
+msgstr ""
+
+msgid "Sync now"
+msgstr ""
+
+msgid "Synced"
+msgstr ""
+
+msgid "Synchronization disabled"
+msgstr ""
+
+msgid "Synchronization settings"
+msgstr ""
+
+msgid "Syncing…"
+msgstr ""
+
+msgid "Syntax is correct."
+msgstr ""
+
+msgid "Syntax is incorrect."
+msgstr ""
+
+msgid "System"
+msgstr ""
+
+msgid "System Hooks"
+msgstr ""
+
+msgid "System Hooks Help"
+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 ""
+
+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 "Tag"
+msgstr ""
+
+msgid "Tag list:"
+msgstr ""
+
+msgid "Tag name"
+msgstr ""
+
+msgid "Tag name is required"
+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|Sort by"
+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|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 "Target Branch"
+msgstr ""
+
+msgid "Target Path"
+msgstr ""
+
+msgid "Target branch"
+msgstr ""
+
+msgid "Target-Branch"
+msgstr ""
+
+msgid "Task ID: %{elastic_task}"
+msgstr ""
+
+msgid "Team"
+msgstr ""
+
+msgid "Team domain"
+msgstr ""
+
+msgid "Telephone number"
+msgstr ""
+
+msgid "Template"
+msgstr ""
+
+msgid "Template to append to all Service Desk issues"
+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 "Terraform"
+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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "Terraform|%{number} Terraform report was generated in your pipelines"
+msgid_plural "Terraform|%{number} Terraform reports were generated in your pipelines"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "Terraform|%{user} updated %{timeAgo}"
+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|Details"
+msgstr ""
+
+msgid "Terraform|Download JSON"
+msgstr ""
+
+msgid "Terraform|Find out how to use the %{linkStart}GitLab managed Terraform State%{linkEnd}"
+msgstr ""
+
+msgid "Terraform|Generating the report caused an error."
+msgstr ""
+
+msgid "Terraform|Get started with Terraform"
+msgstr ""
+
+msgid "Terraform|Job status"
+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|The report %{name} failed to generate."
+msgstr ""
+
+msgid "Terraform|The report %{name} was generated in your pipelines."
+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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
+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 cases are not available for this project"
+msgstr ""
+
+msgid "Test coverage parsing"
+msgstr ""
+
+msgid "Test coverage: %d hit"
+msgid_plural "Test coverage: %d hits"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+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 Todo."
+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 todo 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|Jobs"
+msgstr ""
+
+msgid "TestReports|Tests"
+msgstr ""
+
+msgid "TestReports|There are no test cases to display."
+msgstr ""
+
+msgid "TestReports|There are no test suites to show."
+msgstr ""
+
+msgid "TestReports|There are no tests to show."
+msgstr ""
+
+msgid "TestReports|There was an error fetching the summary."
+msgstr ""
+
+msgid "TestReports|There was an error fetching the test suite."
+msgstr ""
+
+msgid "Tests"
+msgstr ""
+
+msgid "Thank you for signing up for your free trial! You will get additional instructions in your inbox shortly."
+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 your purchase!"
+msgstr ""
+
+msgid "That is ok, I do not 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 \"Require approval from CODEOWNERS\" setting was moved to %{banner_link_start}Protected Branches%{banner_link_end}"
+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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "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 "The CSV export will be created in the background. Once finished, it will be sent to %{strong_open}%{email}%{strong_close} in an attachment."
+msgstr ""
+
+msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgstr ""
+
+msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
+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 URL defined on the primary node that secondary nodes should use to contact it."
+msgstr ""
+
+msgid "The URL defined on the primary node that secondary nodes should use to contact it. %{linkStart}More information%{linkEnd}"
+msgstr ""
+
+msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
+msgstr ""
+
+msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
+msgstr ""
+
+msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
+msgstr ""
+
+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 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 coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
+msgstr ""
+
+msgid "The collection of events added to the data gathered for that stage."
+msgstr ""
+
+msgid "The commit does not exist"
+msgstr ""
+
+msgid "The comparison view may be inaccurate due to merge conflicts."
+msgstr ""
+
+msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
+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 issue"
+msgstr ""
+
+msgid "The current user is not authorized to access the job log."
+msgstr ""
+
+msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgstr ""
+
+msgid "The default CI configuration path for new projects."
+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 designs you tried uploading did not change."
+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 errors we encountered were:"
+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 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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+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 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 can be fully restored"
+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 will be placed in 'pending removal' state"
+msgstr ""
+
+msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
+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 stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
+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 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 maximum file size allowed is %{size}."
+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 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 merge request can now be merged."
+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 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 passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
+msgstr ""
+
+msgid "The phase of the development lifecycle."
+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 planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
+msgstr ""
+
+msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
+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 pseudonymizer data collection is disabled. When enabled, GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr ""
+
+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 remote mirror took to long to complete."
+msgstr ""
+
+msgid "The remote repository is being updated..."
+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 review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
+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 schedule time must be in the future!"
+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 specified tab is invalid, please select another"
+msgstr ""
+
+msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgstr ""
+
+msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+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 testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
+msgstr ""
+
+msgid "The time taken by each data entry gathered by that stage."
+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 usage ping is disabled, and cannot be configured through this form."
+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 value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
+msgstr ""
+
+msgid "The value of the provided variable exceeds the %{count} character limit"
+msgstr ""
+
+msgid "The visualization will appear in this tab when the CI/CD configuration file is populated with valid syntax."
+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 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 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 to show."
+msgstr ""
+
+msgid "There are no issues with the selected labels"
+msgstr ""
+
+msgid "There are no labels yet"
+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 variables yet."
+msgstr ""
+
+msgid "There are pending advanced search migrations. Indexing must remain paused until the migrations are completed."
+msgstr ""
+
+msgid "There are running deployments on the environment. Please retry later."
+msgstr ""
+
+msgid "There is a halted Elasticsearch migration"
+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 groups."
+msgstr ""
+
+msgid "There was a problem fetching labels."
+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 the keep latest artifacts setting."
+msgstr ""
+
+msgid "There was a problem fetching users."
+msgstr ""
+
+msgid "There was a problem refreshing the data, please try again"
+msgstr ""
+
+msgid "There was a problem saving your custom stage, please try again"
+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} todo."
+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 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 the %{replicableType}"
+msgstr ""
+
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
+msgid "There was an error fetching the Geo Settings"
+msgstr ""
+
+msgid "There was an error fetching the Node'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 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 merge request approval settings."
+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 removing your custom stage, please try again"
+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 Node."
+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 merge request approval settings."
+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 updating the stage order. Please try reloading the page."
+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 %{requestTypeName} data."
+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 with the reCAPTCHA. Please solve the reCAPTCHA again."
+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 paths are protected for POST requests."
+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 "Third Party Advisory Link"
+msgstr ""
+
+msgid "Third party offers"
+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%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+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 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 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 cannot be undone. You will lose this project's repository and all related resources, including issues, merge requests, etc."
+msgstr ""
+
+msgid "This action has been performed too many times. Try again later."
+msgstr ""
+
+msgid "This action will %{strongOpen}permanently delete%{strongClose} %{codeOpen}%{project}%{codeClose} %{strongOpen}immediately%{strongClose}, including its repositories and all related resources, including issues, merge requests, etc."
+msgstr ""
+
+msgid "This action will %{strongOpen}permanently delete%{strongClose} %{codeOpen}%{project}%{codeClose} %{strongOpen}on %{date}%{strongClose}, including its repositories and all related resources, including issues, merge requests, etc."
+msgstr ""
+
+msgid "This also resolves all related threads"
+msgstr ""
+
+msgid "This also resolves this thread"
+msgstr ""
+
+msgid "This application was created by %{link_to_owner}."
+msgstr ""
+
+msgid "This application will be able to:"
+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 comment has changed since you started editing, please 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 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 credential has expired"
+msgstr ""
+
+msgid "This date is after the due date, so this epic won't appear in the roadmap."
+msgstr ""
+
+msgid "This date is before the start date, so this epic won't appear in the roadmap."
+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 diff was suppressed by a .gitattributes entry."
+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'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 feature should be used with an index that was created after 13.0"
+msgstr ""
+
+msgid "This field is required."
+msgstr ""
+
+msgid "This graph has a large number of jobs and showing the links between them may have performance implications."
+msgstr ""
+
+msgid "This 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, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
+msgstr ""
+
+msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
+msgstr ""
+
+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 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 Premium feature"
+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 merge train pipeline"
+msgstr ""
+
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
+msgid "This is a security log of important events involving your account."
+msgstr ""
+
+msgid "This is a self-managed instance of GitLab."
+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 is currently blocked by the following issues:"
+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 does not have a trace."
+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 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 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 is still a draft."
+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 project"
+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 archived and cannot be commented on."
+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 removed on %{date}"
+msgstr ""
+
+msgid "This project will be removed on %{date} since its parent group '%{parent_group_name}' has been scheduled for removal."
+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 processes jobs for all projects in its group and subgroups."
+msgstr ""
+
+msgid "This runner processes jobs for all unassigned projects."
+msgstr ""
+
+msgid "This runner processes jobs for assigned projects only."
+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 will update the hostname that is used to generate private commit emails. %{learn_more}"
+msgstr ""
+
+msgid "This subscription is for"
+msgstr ""
+
+msgid "This suggestion already matches its content."
+msgstr ""
+
+msgid "This user cannot be unlocked manually from GitLab"
+msgstr ""
+
+msgid "This user does not have a pending request"
+msgstr ""
+
+msgid "This user has no active %{type}."
+msgstr ""
+
+msgid "This user has no identities"
+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 clear repository check states for ALL projects in the database. This cannot be undone. Are you sure?"
+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 "Those emails automatically become issues (with the comments becoming the email conversation) listed here."
+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|Application firewall not detected"
+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|Hide dismissed alerts"
+msgstr ""
+
+msgid "ThreatMonitoring|In review"
+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|Policies"
+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|The firewall is not installed or has been disabled. To view this data, ensure the web application firewall is installed and enabled for your cluster."
+msgstr ""
+
+msgid "ThreatMonitoring|The graph below is an overview of traffic coming to your application as tracked by the Web Application Firewall (WAF). View the docs for instructions on how to access the WAF logs to see what type of malicious traffic is trying to access your app. The docs link is also accessible by clicking the \"?\" icon next to the title below."
+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 "ThreatMonitoring|Web Application Firewall"
+msgstr ""
+
+msgid "ThreatMonitoring|While it's rare to have no traffic coming to your application, it can happen. In any event, we ask that you double check your settings to make sure you've set up the WAF correctly."
+msgstr ""
+
+msgid "Throughput"
+msgstr ""
+
+msgid "Thursday"
+msgstr ""
+
+msgid "Time"
+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 in seconds GitLab will wait for a response from the external service. When the service does not respond in time, access will be denied."
+msgstr ""
+
+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 until first merge request"
+msgstr ""
+
+msgid "TimeTrackingEstimated|Est"
+msgstr ""
+
+msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+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 "Timezone"
+msgstr ""
+
+msgid "Time|hr"
+msgid_plural "Time|hrs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "Time|min"
+msgid_plural "Time|mins"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "Time|s"
+msgstr ""
+
+msgid "Tip:"
+msgstr ""
+
+msgid "Tip: add a"
+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 access this domain create a new DNS record"
+msgstr ""
+
+msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
+msgstr ""
+
+msgid "To add the entry manually, provide the following details to the application on your phone."
+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 define internal users, first enable new users set to external"
+msgstr ""
+
+msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
+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, link this page to your Jaeger server, or find out how to %{link_start_tag}install Jaeger%{link_end_tag}"
+msgstr ""
+
+msgid "To get started, please enter your Gitea Host URL and a %{link_to_personal_token}."
+msgstr ""
+
+msgid "To help improve GitLab and its user experience, GitLab will periodically collect 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 link Sentry to GitLab, enter your Sentry URL and Auth Token."
+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 open Jaeger and easily view tracing from GitLab, link the %{link} page to your server"
+msgstr ""
+
+msgid "To personalize your GitLab experience, we'd like to know a bit more about you. We won't share this information with anyone."
+msgstr ""
+
+msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
+msgstr ""
+
+msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgstr ""
+
+msgid "To protect this issue's confidentiality, a private fork of this project was selected."
+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 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 set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
+msgstr ""
+
+msgid "To set up this service:"
+msgstr ""
+
+msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
+msgstr ""
+
+msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
+msgstr ""
+
+msgid "To unsubscribe from this issue, please paste the following link into your browser:"
+msgstr ""
+
+msgid "To update Snippets with multiple files, you must use the `files` parameter"
+msgstr ""
+
+msgid "To use Gitpod you must first enable the feature in the integrations section of your %{user_prefs}."
+msgstr ""
+
+msgid "To view all %{scannedResourcesCount} scanned URLs, %{linkStart}please download the CSV file%{linkEnd}"
+msgstr ""
+
+msgid "To view instance-level analytics, ask an admin to turn on %{docLinkStart}usage ping%{docLinkEnd}."
+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 widen your search, change or remove filters."
+msgstr ""
+
+msgid "To-Do List"
+msgstr ""
+
+msgid "To-do item successfully marked as done."
+msgstr ""
+
+msgid "Today"
+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 navigation"
+msgstr ""
+
+msgid "Toggle project select"
+msgstr ""
+
+msgid "Toggle sidebar"
+msgstr ""
+
+msgid "Toggle the Performance Bar"
+msgstr ""
+
+msgid "Toggle this dialog"
+msgstr ""
+
+msgid "Toggle thread"
+msgstr ""
+
+msgid "Toggled :%{name}: emoji award."
+msgstr ""
+
+msgid "Toggles :%{name}: emoji award."
+msgstr ""
+
+msgid "Token"
+msgstr ""
+
+msgid "Token valid until revoked"
+msgstr ""
+
+msgid "Tomorrow"
+msgstr ""
+
+msgid "Too many changes to show."
+msgstr ""
+
+msgid "Too many namespaces enabled. You will need to manage them via the console or the API."
+msgstr ""
+
+msgid "Too many projects enabled. You will need to manage them via the console or the API."
+msgstr ""
+
+msgid "Too much data"
+msgstr ""
+
+msgid "Topics (optional)"
+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 days to completion"
+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 time with quick actions"
+msgstr ""
+
+msgid "Track your GitLab projects with GitLab for Slack."
+msgstr ""
+
+msgid "Track your project with Audit Events."
+msgstr ""
+
+msgid "Transfer"
+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 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 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 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|Transfer failed, please contact an admin."
+msgstr ""
+
+msgid "Tree view"
+msgstr ""
+
+msgid "Trending"
+msgstr ""
+
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "Trials|Compare all plans"
+msgstr ""
+
+msgid "Trials|Create a new group to start your GitLab Ultimate trial."
+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 clicking on your avatar and choosing 'Start a free trial'"
+msgstr ""
+
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
+msgstr ""
+
+msgid "Trial|Company name"
+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|How many employees will use Gitlab?"
+msgstr ""
+
+msgid "Trial|Number of employees"
+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 "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 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 "Triggers|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 "Triggers|To pass variables to the triggered pipeline, add %{code_start}variables[VARIABLE]=VALUE%{code_end} to the API request."
+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 has to offer for 30 days."
+msgstr ""
+
+msgid "Try changing or removing filters."
+msgstr ""
+
+msgid "Try grouping with different labels"
+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 "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
+msgstr ""
+
+msgid "Turn on Service Desk"
+msgstr ""
+
+msgid "Turn on usage ping"
+msgstr ""
+
+msgid "Turn on usage ping to review instance-level analytics."
+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 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 "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 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 neccessary."
+msgstr ""
+
+msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
+msgstr ""
+
+msgid "URL of the external Spam Check endpoint"
+msgstr ""
+
+msgid "URL of the external storage that will serve the repository static objects (e.g. archives, blobs, ...)."
+msgstr ""
+
+msgid "URL or request ID"
+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 unscanned projects"
+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 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 "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 request rate limit"
+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 "Uninstall"
+msgstr ""
+
+msgid "Uninstalling"
+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 "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 "Unlock"
+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 cluster type"
+msgstr ""
+
+msgid "Unresolve"
+msgstr ""
+
+msgid "Unresolve thread"
+msgstr ""
+
+msgid "Unresolved"
+msgstr ""
+
+msgid "UnscannedProjects|15 or more days"
+msgstr ""
+
+msgid "UnscannedProjects|30 or more days"
+msgstr ""
+
+msgid "UnscannedProjects|5 or more days"
+msgstr ""
+
+msgid "UnscannedProjects|60 or more days"
+msgstr ""
+
+msgid "UnscannedProjects|Default branch scanning by project"
+msgstr ""
+
+msgid "UnscannedProjects|Out of date"
+msgstr ""
+
+msgid "UnscannedProjects|Project scanning"
+msgstr ""
+
+msgid "UnscannedProjects|Untested"
+msgstr ""
+
+msgid "UnscannedProjects|Your projects are up do date! Nice job!"
+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 todo type passed. Supported todo types are: %{todo_types}"
+msgstr ""
+
+msgid "Until"
+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 all"
+msgstr ""
+
+msgid "Update approval rule"
+msgstr ""
+
+msgid "Update approvers"
+msgstr ""
+
+msgid "Update failed"
+msgstr ""
+
+msgid "Update it"
+msgstr ""
+
+msgid "Update iteration"
+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|Error moving repository storage for %{container_full_path} - %{message}"
+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 to %{linkStart}chart v%{linkEnd}"
+msgstr ""
+
+msgid "Updates"
+msgstr ""
+
+msgid "Updating"
+msgstr ""
+
+msgid "Upgrade offers available!"
+msgstr ""
+
+msgid "Upgrade your plan"
+msgstr ""
+
+msgid "Upgrade your plan to activate Advanced Search."
+msgstr ""
+
+msgid "Upgrade your plan to activate Audit Events."
+msgstr ""
+
+msgid "Upgrade your plan to activate Group Webhooks."
+msgstr ""
+
+msgid "Upgrade your plan to enable this feature of the Jira Integration."
+msgstr ""
+
+msgid "Upgrade your plan to improve Merge Requests."
+msgstr ""
+
+msgid "Upload"
+msgstr ""
+
+msgid "Upload CSV file"
+msgstr ""
+
+msgid "Upload License"
+msgstr ""
+
+msgid "Upload New File"
+msgstr ""
+
+msgid "Upload New License"
+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 object map"
+msgstr ""
+
+msgid "UploadLink|click to upload"
+msgstr ""
+
+msgid "Uploaded on"
+msgstr ""
+
+msgid "Uploaded:"
+msgstr ""
+
+msgid "Uploading changes to terminal"
+msgstr ""
+
+msgid "Uploads"
+msgstr ""
+
+msgid "Upon performing this action, the contents of this group, its subgroup and projects will be permanently removed after %{deletion_adjourned_period} days on %{date}. Until that time:"
+msgstr ""
+
+msgid "Upstream"
+msgstr ""
+
+msgid "Uptime"
+msgstr ""
+
+msgid "Upvotes"
+msgstr ""
+
+msgid "Usage"
+msgstr ""
+
+msgid "Usage Trends"
+msgstr ""
+
+msgid "Usage ping is off"
+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|%{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|Buy additional minutes"
+msgstr ""
+
+msgid "UsageQuota|Current period usage"
+msgstr ""
+
+msgid "UsageQuota|Increase storage temporarily"
+msgstr ""
+
+msgid "UsageQuota|LFS Objects"
+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|Packages"
+msgstr ""
+
+msgid "UsageQuota|Pipelines"
+msgstr ""
+
+msgid "UsageQuota|Purchase more storage"
+msgstr ""
+
+msgid "UsageQuota|Purchased storage available"
+msgstr ""
+
+msgid "UsageQuota|Repositories"
+msgstr ""
+
+msgid "UsageQuota|Repository"
+msgstr ""
+
+msgid "UsageQuota|Snippets"
+msgstr ""
+
+msgid "UsageQuota|Storage"
+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|This project is at risk of being locked because purchased storage is running low."
+msgstr ""
+
+msgid "UsageQuota|This project is locked because it is using %{actualRepositorySizeLimit} of free storage and there is no purchased storage available."
+msgstr ""
+
+msgid "UsageQuota|This project is locked because it used %{actualRepositorySizeLimit} of free storage and all the purchased storage."
+msgstr ""
+
+msgid "UsageQuota|This project is near the free %{actualRepositorySizeLimit} limit and at risk of being locked."
+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 of group resources across the projects in the %{strong_start}%{group_name}%{strong_end} group"
+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|Wikis"
+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 Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
+msgstr ""
+
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgstr ""
+
+msgid "Use cURL"
+msgstr ""
+
+msgid "Use custom color #FF0000"
+msgstr ""
+
+msgid "Use hashed storage"
+msgstr ""
+
+msgid "Use hashed storage paths for newly created and renamed repositories. Enable immutable, hash-based paths and repository names to store repositories on disk. This prevents repositories from having to be moved or renamed when the Repository URL changes and may improve disk I/O performance. (Always enabled since 13.0)"
+msgstr ""
+
+msgid "Use one line per URI"
+msgstr ""
+
+msgid "Use template"
+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 by members to sign in to your group in GitLab"
+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 ID"
+msgstr ""
+
+msgid "User OAuth applications"
+msgstr ""
+
+msgid "User Settings"
+msgstr ""
+
+msgid "User and IP Rate Limits"
+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 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 subresources."
+msgstr ""
+
+msgid "User was successfully removed from project."
+msgstr ""
+
+msgid "User was successfully updated."
+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|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|Name"
+msgstr ""
+
+msgid "UserLists|New list"
+msgstr ""
+
+msgid "UserLists|Save"
+msgstr ""
+
+msgid "UserLists|There are no users"
+msgstr ""
+
+msgid "UserLists|User ID"
+msgstr ""
+
+msgid "UserLists|User IDs"
+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|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 (optional)"
+msgstr ""
+
+msgid "Username is already taken."
+msgstr ""
+
+msgid "Username is available."
+msgstr ""
+
+msgid "Username or email"
+msgstr ""
+
+msgid "Username: %{username}"
+msgstr ""
+
+msgid "Users"
+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 requesting access to %{strong_start}%{project_name}%{strong_end}"
+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 "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
+msgstr ""
+
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+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 "Validations failed."
+msgstr ""
+
+msgid "Value"
+msgstr ""
+
+msgid "Value Stream"
+msgstr ""
+
+msgid "Value Stream Analytics"
+msgstr ""
+
+msgid "Value Stream Analytics can help you determine your team’s velocity"
+msgstr ""
+
+msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
+msgstr ""
+
+msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
+msgstr ""
+
+msgid "ValueStreamAnalytics|%{days}d"
+msgstr ""
+
+msgid "ValueStreamAnalytics|Median time from first commit to issue closed."
+msgstr ""
+
+msgid "ValueStreamAnalytics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "ValueStream|The Default Value Stream cannot be deleted"
+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 localization settings."
+msgstr ""
+
+msgid "Various settings that affect GitLab performance."
+msgstr ""
+
+msgid "Verification concurrency limit"
+msgstr ""
+
+msgid "Verification information"
+msgstr ""
+
+msgid "Verification status"
+msgstr ""
+
+msgid "Verified"
+msgstr ""
+
+msgid "Verify SAML Configuration"
+msgstr ""
+
+msgid "Verify configuration"
+msgstr ""
+
+msgid "Version"
+msgstr ""
+
+msgid "Version %{versionNumber}"
+msgstr ""
+
+msgid "Version %{versionNumber} (latest)"
+msgstr ""
+
+msgid "View Documentation"
+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 prior to this change"
+msgstr ""
+
+msgid "View chart"
+msgid_plural "View charts"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "View dependency details for your project"
+msgstr ""
+
+msgid "View deployment"
+msgstr ""
+
+msgid "View details"
+msgstr ""
+
+msgid "View details: %{details_url}"
+msgstr ""
+
+msgid "View documentation"
+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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "View file @ "
+msgstr ""
+
+msgid "View file @ %{commitSha}"
+msgstr ""
+
+msgid "View full dashboard"
+msgstr ""
+
+msgid "View full log"
+msgstr ""
+
+msgid "View group labels"
+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 merge request"
+msgstr ""
+
+msgid "View open merge request"
+msgstr ""
+
+msgid "View page @ "
+msgstr ""
+
+msgid "View performance dashboard."
+msgstr ""
+
+msgid "View project"
+msgstr ""
+
+msgid "View project labels"
+msgstr ""
+
+msgid "View replaced file @ "
+msgstr ""
+
+msgid "View setting"
+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 users statistics"
+msgstr ""
+
+msgid "Viewed"
+msgstr ""
+
+msgid "Viewing commit"
+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"
+msgstr ""
+
+msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
+msgstr ""
+
+msgid "VisualReviewApp|%{stepStart}Step 2%{stepEnd}. Add it to the %{headTags} tags of every page of your application, ensuring the merge request ID is set or not set as required. "
+msgstr ""
+
+msgid "VisualReviewApp|%{stepStart}Step 3%{stepEnd}. If not previously %{linkStart}configured%{linkEnd} by a developer, enter the merge request ID for the review when prompted. The ID of this merge request is %{stepStart}%{mrId}%{stepStart}."
+msgstr ""
+
+msgid "VisualReviewApp|%{stepStart}Step 4%{stepEnd}. Leave feedback in the Review App."
+msgstr ""
+
+msgid "VisualReviewApp|Cancel"
+msgstr ""
+
+msgid "VisualReviewApp|Copy merge request ID"
+msgstr ""
+
+msgid "VisualReviewApp|Copy script"
+msgstr ""
+
+msgid "VisualReviewApp|Enable Visual Reviews"
+msgstr ""
+
+msgid "VisualReviewApp|Follow the steps below to enable Visual Reviews inside your application."
+msgstr ""
+
+msgid "VisualReviewApp|No review app found or available."
+msgstr ""
+
+msgid "VisualReviewApp|Open review app"
+msgstr ""
+
+msgid "VisualReviewApp|Review"
+msgstr ""
+
+msgid "VisualReviewApp|Steps 1 and 2 (and sometimes 3) are performed once by the developer before requesting feedback. Steps 3 (if necessary), 4 is performed by the reviewer each time they perform a review."
+msgstr ""
+
+msgid "Vulnerabilities"
+msgstr ""
+
+msgid "Vulnerabilities over time"
+msgstr ""
+
+msgid "Vulnerability Report"
+msgstr ""
+
+msgid "Vulnerability remediated. Review before resolving."
+msgstr ""
+
+msgid "Vulnerability resolved in %{branch}"
+msgstr ""
+
+msgid "Vulnerability resolved in the default branch"
+msgstr ""
+
+msgid "Vulnerability-Check"
+msgstr ""
+
+msgid "VulnerabilityChart|%{formattedStartDate} to today"
+msgstr ""
+
+msgid "VulnerabilityChart|Severity"
+msgstr ""
+
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+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|A true-positive and will fix"
+msgstr ""
+
+msgid "VulnerabilityManagement|Change status"
+msgstr ""
+
+msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
+msgstr ""
+
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
+msgid "VulnerabilityManagement|Detected"
+msgstr ""
+
+msgid "VulnerabilityManagement|Needs triage"
+msgstr ""
+
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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|Verified as fixed or mitigated"
+msgstr ""
+
+msgid "VulnerabilityManagement|Will not fix or a false-positive"
+msgstr ""
+
+msgid "VulnerabilityManagement|invalid issue link or ID"
+msgstr ""
+
+msgid "VulnerabilityStatusTypes|All"
+msgstr ""
+
+msgid "VulnerabilityStatusTypes|Confirmed"
+msgstr ""
+
+msgid "VulnerabilityStatusTypes|Detected"
+msgstr ""
+
+msgid "VulnerabilityStatusTypes|Dismissed"
+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|Additional Info"
+msgstr ""
+
+msgid "Vulnerability|Class"
+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|Detected"
+msgstr ""
+
+msgid "Vulnerability|Download"
+msgstr ""
+
+msgid "Vulnerability|Evidence"
+msgstr ""
+
+msgid "Vulnerability|File"
+msgstr ""
+
+msgid "Vulnerability|Identifier"
+msgstr ""
+
+msgid "Vulnerability|Identifiers"
+msgstr ""
+
+msgid "Vulnerability|Image"
+msgstr ""
+
+msgid "Vulnerability|Links"
+msgstr ""
+
+msgid "Vulnerability|Method"
+msgstr ""
+
+msgid "Vulnerability|Namespace"
+msgstr ""
+
+msgid "Vulnerability|Project"
+msgstr ""
+
+msgid "Vulnerability|Reproduction Assets"
+msgstr ""
+
+msgid "Vulnerability|Request"
+msgstr ""
+
+msgid "Vulnerability|Request/Response"
+msgstr ""
+
+msgid "Vulnerability|Scanner"
+msgstr ""
+
+msgid "Vulnerability|Scanner Provider"
+msgstr ""
+
+msgid "Vulnerability|Severity"
+msgstr ""
+
+msgid "Vulnerability|Status"
+msgstr ""
+
+msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
+msgstr ""
+
+msgid "Vulnerability|Unmodified Response"
+msgstr ""
+
+msgid "Wait for the file to load to copy its contents"
+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 "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 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 more Pipeline minutes to avoid any interruption of service."
+msgstr ""
+
+msgid "We recommend that you buy more 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've found no vulnerabilities"
+msgstr ""
+
+msgid "Web Application Firewall"
+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|Merge request"
+msgstr ""
+
+msgid "WebIDE|You need permission to edit files directly in this project."
+msgstr ""
+
+msgid "WebIDE|You need permission to edit files directly in this project. Fork this project to make your changes and submit a merge request."
+msgstr ""
+
+msgid "Webhook"
+msgstr ""
+
+msgid "Webhook Logs"
+msgstr ""
+
+msgid "Webhook Settings"
+msgstr ""
+
+msgid "Webhook:"
+msgstr ""
+
+msgid "Webhooks"
+msgstr ""
+
+msgid "Webhooks Help"
+msgstr ""
+
+msgid "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 "Webhooks have moved. They can now be found under the Settings menu."
+msgstr ""
+
+msgid "Webhooks|Comments"
+msgstr ""
+
+msgid "Webhooks|Confidential comments"
+msgstr ""
+
+msgid "Webhooks|Confidential issues events"
+msgstr ""
+
+msgid "Webhooks|Deployment events"
+msgstr ""
+
+msgid "Webhooks|Enable SSL verification"
+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|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|Trigger"
+msgstr ""
+
+msgid "Webhooks|URL"
+msgstr ""
+
+msgid "Webhooks|URL is triggered by a push to the repository"
+msgstr ""
+
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
+msgstr ""
+
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgstr ""
+
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
+msgstr ""
+
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
+msgstr ""
+
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
+msgstr ""
+
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
+msgstr ""
+
+msgid "Webhooks|URL is triggered when a release is created or updated"
+msgstr ""
+
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
+msgstr ""
+
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
+msgstr ""
+
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
+msgstr ""
+
+msgid "Webhooks|URL is triggered when someone adds a comment"
+msgstr ""
+
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
+msgstr ""
+
+msgid "Webhooks|URL is triggered when the job status changes"
+msgstr ""
+
+msgid "Webhooks|URL is triggered when the pipeline status changes"
+msgstr ""
+
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
+msgstr ""
+
+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 to the guided GitLab tour"
+msgstr ""
+
+msgid "What are you searching for?"
+msgstr ""
+
+msgid "What describes you best?"
+msgstr ""
+
+msgid "What does this command do?"
+msgstr ""
+
+msgid "What is squashing?"
+msgstr ""
+
+msgid "What is your job title? (optional)"
+msgstr ""
+
+msgid "What's new"
+msgstr ""
+
+msgid "What’s your experience level?"
+msgstr ""
+
+msgid "When Kroki is enabled, GitLab sends diagrams to an instance of Kroki to display them as images. You can use the free public cloud instance %{kroki_public_url} or you can %{install_link} on your own infrastructure. Once you've installed Kroki, make sure to update the server URL to point to your instance."
+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, 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 "When enabled, any user visiting %{host} will be able to create an account."
+msgstr ""
+
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
+msgstr ""
+
+msgid "When enabled, users cannot use GitLab until the terms have been accepted."
+msgstr ""
+
+msgid "When leaving the URL blank, classification labels can still be specified without disabling cross project features or performing external authorization checks."
+msgstr ""
+
+msgid "When merge requests and commits in the default branch close, any issues they reference also close."
+msgstr ""
+
+msgid "When this merge request is accepted"
+msgid_plural "When these merge requests are accepted"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+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 using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, provide the exact URL to the repository. HTTP redirects will not be followed."
+msgstr ""
+
+msgid "When:"
+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 "Wiki"
+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 "WikiEditPageTip|Tip: You can move this page by adding the path to the beginning of the title."
+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 "WikiMarkdownDocs|More examples are in the %{docs_link}"
+msgstr ""
+
+msgid "WikiMarkdownDocs|documentation"
+msgstr ""
+
+msgid "WikiMarkdownTip|To link to a (new) page, simply type %{link_example}"
+msgstr ""
+
+msgid "WikiNewPageTip|Tip: You can specify the full path for the new file. We will automatically create any missing directories."
+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 "WikiPageCreate|Create %{pageTitle}"
+msgstr ""
+
+msgid "WikiPageEdit|Update %{pageTitle}"
+msgstr ""
+
+msgid "WikiPage|Write your content or drag files here…"
+msgstr ""
+
+msgid "Wikis"
+msgstr ""
+
+msgid "Wiki|Create New Page"
+msgstr ""
+
+msgid "Wiki|Create 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 title"
+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 "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 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 %{domain} from your instance. This domain will no longer be available to any Knative application."
+msgstr ""
+
+msgid "You are about to permanently delete this project"
+msgstr ""
+
+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 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 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 %{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 approve a user"
+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 update this scanner profile"
+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 into 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 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 always edit this later"
+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 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 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 generate an access token scoped to this project for each application to use the GitLab API."
+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 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 merge once this merge request is approved."
+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 recover this project until %{date}"
+msgstr ""
+
+msgid "You can register runners as separate users, on separate servers, and on your local machine. Register as many runners as you want."
+msgstr ""
+
+msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
+msgstr ""
+
+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 access the raw file. Please wait a minute."
+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 make this a shared runner."
+msgstr ""
+
+msgid "You cannot play this scheduled pipeline at the moment. Please wait a minute."
+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 could not create a new trigger."
+msgstr ""
+
+msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgstr ""
+
+msgid "You didn't renew your subscription so it was downgraded to the GitLab Core Plan."
+msgstr ""
+
+msgid "You do not have an active license"
+msgstr ""
+
+msgid "You do not have any subscriptions yet"
+msgstr ""
+
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
+msgid "You do not have permission to leave this %{namespaceType}."
+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 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 a license that activates at a future date. Please see the License History table below."
+msgstr ""
+
+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 %{title} %{name}."
+msgstr ""
+
+msgid "You have been invited"
+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 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 rotation 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 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 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 no permissions"
+msgstr ""
+
+msgid "You have not added any approvers. Start by adding users or groups."
+msgstr ""
+
+msgid "You have reached your project limit"
+msgstr ""
+
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
+msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
+msgstr ""
+
+msgid "You haven't added any issues to your project yet"
+msgstr ""
+
+msgid "You haven't selected any issues yet"
+msgstr ""
+
+msgid "You left the \"%{membershipable_human_name}\" %{source_type}."
+msgstr ""
+
+msgid "You may close the milestone now."
+msgstr ""
+
+msgid "You must be logged in to search across all of GitLab"
+msgstr ""
+
+msgid "You must disassociate %{domain} from all clusters it is attached to before deletion."
+msgstr ""
+
+msgid "You must have developer or higher permissions in the associated project to view job logs when debug trace is enabled. To disable debug trace, set the 'CI_DEBUG_TRACE' variable to 'false' in your pipeline configuration or CI/CD settings. If you need to view this job log, a project maintainer must add you to the project with developer permissions or higher."
+msgstr ""
+
+msgid "You must have maintainer access to force delete a lock"
+msgstr ""
+
+msgid "You must have permission to create a project in a group before forking."
+msgstr ""
+
+msgid "You must have permission to create a project in a namespace before forking."
+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 select a stack for configuring your cloud provider. Learn more about"
+msgstr ""
+
+msgid "You must set up incoming email before it becomes active."
+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 be logged in."
+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 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 won't be able to pull or push repositories via %{protocol} until you %{set_password_link} on your account"
+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 %{group} membership will now expire in %{days}."
+msgstr ""
+
+msgid "Your %{host} account was signed in to from a new location"
+msgstr ""
+
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgstr ""
+
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgstr ""
+
+msgid "Your CI configuration file is invalid."
+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 Commit Email will be used for web based operations, such as edits and merges."
+msgstr ""
+
+msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
+msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
+msgstr ""
+
+msgid "Your GPG keys (%{count})"
+msgstr ""
+
+msgid "Your GitLab Ultimate trial will last 30 days after which point you can keep your free GitLab account forever. We just need some additional information to activate your trial."
+msgstr ""
+
+msgid "Your GitLab account request has been approved!"
+msgstr ""
+
+msgid "Your GitLab group"
+msgstr ""
+
+msgid "Your Groups"
+msgstr ""
+
+msgid "Your License"
+msgstr ""
+
+msgid "Your Personal Access Token was revoked"
+msgstr ""
+
+msgid "Your Primary Email will be used for avatar detection."
+msgstr ""
+
+msgid "Your Projects (default)"
+msgstr ""
+
+msgid "Your Projects' Activity"
+msgstr ""
+
+msgid "Your Public Email will be displayed on your public profile."
+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 Version"
+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 by your administrator. Please log back in to reactivate your account."
+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 applications (%{size})"
+msgstr ""
+
+msgid "Your authorized applications"
+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 custom stage '%{title}' was created"
+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 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 license will be included in your GitLab backup and will survive upgrades, so in normal usage you should never need to re-upload your %{code_open}.gitlab-license%{code_close} file."
+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 SCIM token"
+msgstr ""
+
+msgid "Your new personal access token has been created."
+msgstr ""
+
+msgid "Your new project 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 profile"
+msgstr ""
+
+msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
+msgstr ""
+
+msgid "Your projects"
+msgstr ""
+
+msgid "Your request for access could not be processed: %{error_meesage}"
+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. Once 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 sign-in page is %{url}."
+msgstr ""
+
+msgid "Your subscription expired!"
+msgstr ""
+
+msgid "Your subscription has been downgraded."
+msgstr ""
+
+msgid "Your subscription will expire in %{remaining_days}."
+msgstr ""
+
+msgid "Your username is %{username}."
+msgstr ""
+
+msgid "Zoom meeting added"
+msgstr ""
+
+msgid "Zoom meeting removed"
+msgstr ""
+
+msgid "[No reason]"
+msgstr ""
+
+msgid "[Unchanged]"
+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 "a design"
+msgstr ""
+
+msgid "about 1 hour"
+msgid_plural "about %d hours"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "access:"
+msgstr ""
+
+msgid "added %{created_at_timeago}"
+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 has a \"created\" issue link"
+msgstr ""
+
+msgid "already shared with this group"
+msgstr ""
+
+msgid "among other things"
+msgstr ""
+
+msgid "and"
+msgstr ""
+
+msgid "any-approver for the merge request already exists"
+msgstr ""
+
+msgid "any-approver for the project already exists"
+msgstr ""
+
+msgid "approved by: "
+msgstr ""
+
+msgid "archived"
+msgstr ""
+
+msgid "archived:"
+msgstr ""
+
+msgid "as %{role}."
+msgstr ""
+
+msgid "assign yourself"
+msgstr ""
+
+msgid "at"
+msgstr ""
+
+msgid "at risk"
+msgstr ""
+
+msgid "attach a new file"
+msgstr ""
+
+msgid "authored"
+msgstr ""
+
+msgid "blocks"
+msgstr ""
+
+msgid "branch name"
+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't be enabled because signed commits are required for this project"
+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 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 modified"
+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 "child-pipeline"
+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|%{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 scanners"
+msgstr ""
+
+msgid "ciReport|All severities"
+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 test metrics: "
+msgstr ""
+
+msgid "ciReport|Browser performance test metrics: No changes"
+msgstr ""
+
+msgid "ciReport|Checks"
+msgstr ""
+
+msgid "ciReport|Code quality"
+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|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|Fixed"
+msgstr ""
+
+msgid "ciReport|Fixed:"
+msgstr ""
+
+msgid "ciReport|Found %{issuesWithCount}"
+msgstr ""
+
+msgid "ciReport|Investigate this vulnerability by creating an issue"
+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|Manage licenses"
+msgstr ""
+
+msgid "ciReport|New"
+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 scanning"
+msgstr ""
+
+msgid "ciReport|Secret scanning detects secrets and credentials vulnerabilities in your source code."
+msgstr ""
+
+msgid "ciReport|Security scanning"
+msgstr ""
+
+msgid "ciReport|Security scanning failed loading any results"
+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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+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 "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 "could not read private key, is the passphrase correct?"
+msgstr ""
+
+msgid "created"
+msgstr ""
+
+msgid "created %{timeAgo}"
+msgstr ""
+
+msgid "data"
+msgstr ""
+
+msgid "date must not be after 9999-12-31"
+msgstr ""
+
+msgid "day"
+msgid_plural "days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "days"
+msgstr ""
+
+msgid "default branch"
+msgstr ""
+
+msgid "deleted"
+msgstr ""
+
+msgid "deploy"
+msgstr ""
+
+msgid "design"
+msgstr ""
+
+msgid "designs"
+msgstr ""
+
+msgid "detached"
+msgstr ""
+
+msgid "disabled"
+msgstr ""
+
+msgid "does not exist"
+msgstr ""
+
+msgid "does not have a supported extension. Only %{extension_list} are supported"
+msgstr ""
+
+msgid "download it"
+msgstr ""
+
+msgid "draft"
+msgid_plural "drafts"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "e.g. %{token}"
+msgstr ""
+
+msgid "element is not a hierarchy"
+msgstr ""
+
+msgid "email '%{email}' does not match the allowed domain of %{email_domains}"
+msgid_plural "email '%{email}' does not match the allowed domains: %{email_domains}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "email '%{email}' is not a verified email."
+msgstr ""
+
+msgid "enabled"
+msgstr ""
+
+msgid "encrypted: needs to be a :required, :optional or :migrating!"
+msgstr ""
+
+msgid "entries cannot be larger than 255 characters"
+msgstr ""
+
+msgid "entries cannot be nil"
+msgstr ""
+
+msgid "entries cannot contain HTML tags"
+msgstr ""
+
+msgid "epic"
+msgstr ""
+
+msgid "error"
+msgstr ""
+
+msgid "estimateCommand|%{slash_command} will update the estimated time with the latest command."
+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 revert associated finding(id=%{finding_id}) to detected"
+msgstr ""
+
+msgid "file"
+msgid_plural "files"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+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 "fork this project"
+msgstr ""
+
+msgid "from"
+msgstr ""
+
+msgid "from %d job"
+msgid_plural "from %d jobs"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "group"
+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 "help"
+msgstr ""
+
+msgid "http:"
+msgstr ""
+
+msgid "https://your-bitbucket-server"
+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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+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 since the group is not top-level group."
+msgstr ""
+
+msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgstr ""
+
+msgid "is not allowed. We do not currently support project-level iterations"
+msgstr ""
+
+msgid "is not an email you own"
+msgstr ""
+
+msgid "is not in the group enforcing Group Managed Account"
+msgstr ""
+
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
+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 "limit of %{project_limit} reached"
+msgstr ""
+
+msgid "load it anyway"
+msgstr ""
+
+msgid "loading"
+msgstr ""
+
+msgid "locked"
+msgstr ""
+
+msgid "locked by %{path_lock_user_name} %{created_at}"
+msgstr ""
+
+msgid "log in"
+msgstr ""
+
+msgid "manual"
+msgstr ""
+
+msgid "math|The math in this entry is taking too long to render and may not be displayed as expected. For performance reasons, math blocks are also limited to %{maxChars} characters. Consider splitting up large formulae, splitting math blocks among multiple entries, or using an image instead."
+msgstr ""
+
+msgid "math|There was an error rendering this math block"
+msgstr ""
+
+msgid "merge request"
+msgid_plural "merge requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "merged %{timeAgo}"
+msgstr ""
+
+msgid "metric_id must be unique across a project"
+msgstr ""
+
+msgid "missing"
+msgstr ""
+
+msgid "more information"
+msgstr ""
+
+msgid "most recent deployment"
+msgstr ""
+
+msgid "mrWidgetCommitsAdded|%{commitCount} and %{mergeCommitCount} will be added to %{targetBranch}."
+msgstr ""
+
+msgid "mrWidgetCommitsAdded|%{commitCount} will be added to %{targetBranch}."
+msgstr ""
+
+msgid "mrWidgetCommitsAdded|1 merge commit"
+msgstr ""
+
+msgid "mrWidgetNothingToMerge|Currently there are no changes in this merge request's source branch. Please push new commits or use a different branch."
+msgstr ""
+
+msgid "mrWidgetNothingToMerge|Interested parties can even contribute by pushing commits if they want to."
+msgstr ""
+
+msgid "mrWidgetNothingToMerge|Merge requests are a place to propose changes you have made to a project and discuss those changes with others."
+msgstr ""
+
+msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
+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|%{prefixToLinkStart}No pipeline%{prefixToLinkEnd} %{addPipelineLinkStart}Add the .gitlab-ci.yml file%{addPipelineLinkEnd} to create one."
+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"
+msgstr ""
+
+msgid "mrWidget|Added to the merge train. There are %{mergeTrainPosition} merge requests waiting to be merged"
+msgstr ""
+
+msgid "mrWidget|Allows commits from members who can merge to the target branch"
+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|Are you adding technical debt or code vulnerabilities?"
+msgstr ""
+
+msgid "mrWidget|Before this can be merged, one or more threads must be resolved."
+msgstr ""
+
+msgid "mrWidget|Cancel automatic 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"
+msgstr ""
+
+msgid "mrWidget|Delete source branch"
+msgstr ""
+
+msgid "mrWidget|Deployment statistics are not available currently"
+msgstr ""
+
+msgid "mrWidget|Did not close"
+msgstr ""
+
+msgid "mrWidget|Email patches"
+msgstr ""
+
+msgid "mrWidget|Failed to load deployment statistics"
+msgstr ""
+
+msgid "mrWidget|Fast-forward merge is not possible. To merge this request, first rebase locally."
+msgstr ""
+
+msgid "mrWidget|Fork merge requests do not create merge request pipelines which validate a post merge result"
+msgstr ""
+
+msgid "mrWidget|Fork project merge requests do not create merge request pipelines that validate a post merge result unless invoked by a project member."
+msgstr ""
+
+msgid "mrWidget|If the %{branch} branch exists in your local repository, you can merge this merge request manually using the"
+msgstr ""
+
+msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
+msgstr ""
+
+msgid "mrWidget|Jump to first unresolved thread"
+msgstr ""
+
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
+msgid "mrWidget|Loading deployment statistics"
+msgstr ""
+
+msgid "mrWidget|Mark as ready"
+msgstr ""
+
+msgid "mrWidget|Mentions"
+msgstr ""
+
+msgid "mrWidget|Merge"
+msgstr ""
+
+msgid "mrWidget|Merge failed."
+msgstr ""
+
+msgid "mrWidget|Merge locally"
+msgstr ""
+
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
+msgid "mrWidget|Merged by"
+msgstr ""
+
+msgid "mrWidget|More information"
+msgstr ""
+
+msgid "mrWidget|Open in Web IDE"
+msgstr ""
+
+msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
+msgstr ""
+
+msgid "mrWidget|Plain diff"
+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 all threads in new issue"
+msgstr ""
+
+msgid "mrWidget|Resolve conflicts"
+msgstr ""
+
+msgid "mrWidget|Resolve these conflicts or ask someone with write access to this repository to merge it 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|Set by"
+msgstr ""
+
+msgid "mrWidget|The changes were merged into"
+msgstr ""
+
+msgid "mrWidget|The changes were not merged into"
+msgstr ""
+
+msgid "mrWidget|The changes will be merged into"
+msgstr ""
+
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgstr ""
+
+msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
+msgstr ""
+
+msgid "mrWidget|The source branch has been deleted"
+msgstr ""
+
+msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgstr ""
+
+msgid "mrWidget|The source branch is being deleted"
+msgstr ""
+
+msgid "mrWidget|The source branch will be deleted"
+msgstr ""
+
+msgid "mrWidget|The source branch will not be deleted"
+msgstr ""
+
+msgid "mrWidget|There are merge conflicts"
+msgstr ""
+
+msgid "mrWidget|This action will add the merge request to the merge train when pipeline %{pipelineLink} succeeds."
+msgstr ""
+
+msgid "mrWidget|This action will start a merge train when pipeline %{pipelineLink} succeeds."
+msgstr ""
+
+msgid "mrWidget|This feature merges changes from the target branch to the source branch. You cannot use this feature since the source branch is protected."
+msgstr ""
+
+msgid "mrWidget|This merge request failed to be merged automatically"
+msgstr ""
+
+msgid "mrWidget|This merge request is in the process of being merged"
+msgstr ""
+
+msgid "mrWidget|This project is archived, write access has been disabled"
+msgstr ""
+
+msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
+msgstr ""
+
+msgid "mrWidget|Use %{linkStart}CI pipelines to test your code%{linkEnd} by simply adding a GitLab CI configuration file to your project. It only takes a minute to make your code more secure and robust."
+msgstr ""
+
+msgid "mrWidget|You are not allowed to edit this project directly. Please fork to make changes."
+msgstr ""
+
+msgid "mrWidget|You can delete the source branch now"
+msgstr ""
+
+msgid "mrWidget|You can merge after removing denied licenses"
+msgstr ""
+
+msgid "mrWidget|You can merge this merge request manually using the"
+msgstr ""
+
+msgid "mrWidget|Your password"
+msgstr ""
+
+msgid "mrWidget|branch does not exist."
+msgstr ""
+
+msgid "mrWidget|command line"
+msgstr ""
+
+msgid "mrWidget|into"
+msgstr ""
+
+msgid "mrWidget|to be added to the merge train when the pipeline succeeds"
+msgstr ""
+
+msgid "mrWidget|to be merged automatically when the pipeline succeeds"
+msgstr ""
+
+msgid "mrWidget|to start a merge train when the pipeline succeeds"
+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 after start"
+msgstr ""
+
+msgid "must be greater than start date"
+msgstr ""
+
+msgid "must be later than active period start"
+msgstr ""
+
+msgid "must contain only valid frameworks"
+msgstr ""
+
+msgid "my-awesome-group"
+msgstr ""
+
+msgid "n/a"
+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 contributions"
+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 "open issue"
+msgstr ""
+
+msgid "opened %{timeAgoString} by %{email} via %{user}"
+msgstr ""
+
+msgid "opened %{timeAgoString} by %{user}"
+msgstr ""
+
+msgid "opened %{timeAgoString} by %{user} in Jira"
+msgstr ""
+
+msgid "opened %{timeAgo}"
+msgstr ""
+
+msgid "or"
+msgstr ""
+
+msgid "originating vulnerability"
+msgstr ""
+
+msgid "out of %d total test"
+msgid_plural "out of %d total tests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "parent"
+msgid_plural "parents"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "password"
+msgstr ""
+
+msgid "paused"
+msgstr ""
+
+msgid "pending comment"
+msgstr ""
+
+msgid "pending removal"
+msgstr ""
+
+msgid "per day"
+msgstr ""
+
+msgid "personal access token"
+msgstr ""
+
+msgid "personal access tokens"
+msgstr ""
+
+msgid "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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "private"
+msgstr ""
+
+msgid "private key does not match certificate."
+msgstr ""
+
+msgid "processing"
+msgstr ""
+
+msgid "project"
+msgid_plural "projects"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "project access token"
+msgstr ""
+
+msgid "project access tokens"
+msgstr ""
+
+msgid "project avatar"
+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 "projects"
+msgstr ""
+
+msgid "quick actions"
+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 weight"
+msgstr ""
+
+msgid "removed a Zoom call from this issue"
+msgstr ""
+
+msgid "rendered diff"
+msgstr ""
+
+msgid "reply"
+msgid_plural "replies"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "repository:"
+msgstr ""
+
+msgid "reset it."
+msgstr ""
+
+msgid "revised"
+msgstr ""
+
+msgid "runners"
+msgstr ""
+
+msgid "satisfied"
+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 "sort:"
+msgstr ""
+
+msgid "source"
+msgstr ""
+
+msgid "source diff"
+msgstr ""
+
+msgid "specific"
+msgstr ""
+
+msgid "specified top is not part of the tree"
+msgstr ""
+
+msgid "spendCommand|%{slash_command} will update the sum of the time 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 "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 "the correct format."
+msgstr ""
+
+msgid "the following issue(s)"
+msgstr ""
+
+msgid "this document"
+msgstr ""
+
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
+msgid "time summary"
+msgstr ""
+
+msgid "to automatically add approvers based on file paths and file types."
+msgstr ""
+
+msgid "to help your contributors communicate effectively!"
+msgstr ""
+
+msgid "to join %{source_name}"
+msgstr ""
+
+msgid "to list"
+msgstr ""
+
+msgid "toggle collapse"
+msgstr ""
+
+msgid "train"
+msgstr ""
+
+msgid "triggered"
+msgstr ""
+
+msgid "two-factor authentication settings"
+msgstr ""
+
+msgid "type must be Debian"
+msgstr ""
+
+msgid "unicode domains should use IDNA encoding"
+msgstr ""
+
+msgid "updated"
+msgstr ""
+
+msgid "updated %{timeAgo}"
+msgstr ""
+
+msgid "updated %{time_ago}"
+msgstr ""
+
+msgid "uploaded"
+msgstr ""
+
+msgid "uploads"
+msgstr ""
+
+msgid "user avatar"
+msgstr ""
+
+msgid "user preferences"
+msgstr ""
+
+msgid "username"
+msgstr ""
+
+msgid "v%{version} published %{timeAgo}"
+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 "vulnerability"
+msgid_plural "vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+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 ""
+
diff --git a/locale/bs_BA/gitlab.po b/locale/bs_BA/gitlab.po
index 55390198313..0a956e92c87 100644
--- a/locale/bs_BA/gitlab.po
+++ b/locale/bs_BA/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: bs\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:09\n"
+"PO-Revision-Date: 2021-03-05 23:51\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -76,6 +76,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -190,6 +193,12 @@ msgstr[0] "%d dan"
msgstr[1] "%d dana"
msgstr[2] "%d dana"
+msgid "%d epic"
+msgid_plural "%d epics"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d error"
msgid_plural "%d errors"
msgstr[0] ""
@@ -400,6 +409,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -481,6 +496,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -556,6 +574,9 @@ 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 ""
@@ -607,6 +628,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -715,6 +739,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -745,6 +775,15 @@ msgstr[2] ""
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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -793,9 +832,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -841,6 +877,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1027,6 +1066,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -1051,6 +1093,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -1063,9 +1108,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1090,9 +1132,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1195,6 +1234,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "1 follower"
+msgid_plural "%{count} followers"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "1 group"
msgid_plural "%d groups"
msgstr[0] ""
@@ -1255,6 +1300,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1375,6 +1423,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1474,6 +1525,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1729,9 +1876,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1810,12 +1954,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1912,6 +2062,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1972,6 +2137,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -2032,6 +2200,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2152,6 +2323,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2176,6 +2353,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2185,6 +2365,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2260,6 +2443,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2353,6 +2539,15 @@ 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 ""
@@ -2362,6 +2557,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2446,6 +2644,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2455,6 +2659,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2488,6 +2704,21 @@ 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 ""
@@ -2512,6 +2743,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2578,9 +2812,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2593,24 +2824,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2671,9 +2890,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2683,6 +2899,9 @@ 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 ""
@@ -2692,9 +2911,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2719,49 +2935,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2773,9 +2956,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2785,76 +2965,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
-msgstr ""
-
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2866,13 +3025,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2884,9 +3043,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2899,7 +3055,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2986,9 +3142,6 @@ msgstr "Svi projekti"
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -3049,7 +3202,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -3091,6 +3244,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3157,12 +3313,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3241,12 +3391,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3271,6 +3427,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3364,6 +3523,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3391,12 +3553,18 @@ 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 ""
@@ -3439,7 +3607,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3478,6 +3649,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3490,10 +3664,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3856,9 +4030,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3886,6 +4057,9 @@ 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 erase this build?"
msgstr ""
@@ -4150,12 +4324,6 @@ msgstr[2] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4228,6 +4396,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4654,6 +4825,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4666,12 +4840,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4741,6 +4927,12 @@ 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 ""
@@ -4831,12 +5023,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr "Grane"
@@ -5005,16 +5191,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -5029,6 +5227,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -5062,6 +5263,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -5080,6 +5287,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5131,6 +5341,27 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5266,6 +5497,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5419,12 +5653,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5569,6 +5797,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5791,7 +6022,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5806,6 +6037,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6139,21 +6373,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6163,9 +6418,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7174,6 +7441,9 @@ msgstr ""
msgid "Code"
msgstr "Kod"
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7243,6 +7513,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7429,16 +7702,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7453,6 +7750,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7465,9 +7768,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7483,6 +7816,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7495,6 +7837,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7534,6 +7879,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7555,6 +7903,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7609,9 +7960,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7786,24 +8134,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8263,10 +8602,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8302,9 +8641,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8353,10 +8689,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8383,6 +8719,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8410,6 +8749,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8422,6 +8764,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8437,6 +8782,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8509,6 +8860,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8518,15 +8872,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8545,6 +8914,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8554,6 +8926,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8569,6 +8944,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8674,6 +9052,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8722,13 +9103,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8755,7 +9136,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8797,6 +9178,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8830,6 +9214,18 @@ 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 ""
@@ -8995,7 +9391,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9151,7 +9547,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9175,6 +9577,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9256,6 +9661,9 @@ 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 ""
@@ -9265,6 +9673,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9289,6 +9700,12 @@ 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] ""
+msgstr[2] ""
+
msgid "DastSiteValidation|Validate"
msgstr ""
@@ -9307,6 +9724,9 @@ 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 ""
@@ -9328,6 +9748,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr "Dan u mjesecu"
@@ -9352,6 +9775,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9370,9 +9796,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9427,6 +9850,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9457,6 +9883,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9514,6 +9943,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9538,6 +9970,15 @@ 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 ""
@@ -9718,13 +10159,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9733,6 +10171,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9742,15 +10183,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9775,6 +10213,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9793,9 +10234,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9805,19 +10243,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9832,10 +10270,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9850,7 +10285,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9871,10 +10306,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
+msgstr ""
+
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Use this token as a password. Save it. This password can %{i_start}not%{i_end} be recovered."
msgstr ""
msgid "DeployTokens|Username"
@@ -9883,7 +10324,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9913,6 +10354,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9922,15 +10366,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9940,6 +10375,12 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10162,18 +10603,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10189,16 +10618,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10219,10 +10648,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10231,18 +10657,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10255,9 +10675,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10267,6 +10684,12 @@ 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 ""
@@ -10294,6 +10717,9 @@ 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|Score"
msgstr ""
@@ -10405,7 +10831,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10609,6 +11035,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10801,10 +11230,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10873,12 +11302,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10999,6 +11422,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11164,19 +11590,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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."
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the issue description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the issue title"
-msgstr ""
-
-msgid "Enter the merge request description"
-msgstr ""
-
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11461,6 +11881,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11485,6 +11908,12 @@ 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 ""
@@ -11512,6 +11941,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11539,6 +11971,9 @@ 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 ""
@@ -11563,9 +11998,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11740,6 +12172,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11905,6 +12340,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11920,6 +12358,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11962,6 +12403,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11998,6 +12442,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -12031,6 +12478,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12154,10 +12604,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12184,6 +12634,12 @@ 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 ""
@@ -12220,9 +12676,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12238,9 +12691,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12274,10 +12724,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12322,7 +12772,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12340,9 +12790,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12385,6 +12832,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12880,6 +13330,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12943,6 +13402,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12973,7 +13468,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -13051,9 +13546,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -13066,6 +13558,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13213,6 +13708,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13252,6 +13750,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13261,6 +13762,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13285,6 +13789,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13312,6 +13822,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13357,6 +13870,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13408,6 +13924,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13432,9 +13951,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13447,6 +13963,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13483,6 +14002,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13744,9 +14266,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13897,6 +14416,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13945,6 +14467,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14278,6 +14803,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14554,6 +15088,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14635,15 +15175,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14749,6 +15289,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -15001,6 +15544,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15361,7 +15907,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15787,9 +16333,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15826,96 +16369,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15934,12 +16387,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15991,6 +16450,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -16024,6 +16489,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16192,6 +16660,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16201,9 +16672,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16213,9 +16681,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16255,19 +16756,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16276,18 +16798,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16297,6 +16834,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16519,6 +17062,9 @@ 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 ""
@@ -16594,10 +17140,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16645,6 +17188,9 @@ 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 ""
@@ -16660,7 +17206,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16720,6 +17266,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16744,6 +17293,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16945,6 +17497,9 @@ 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 ""
@@ -17014,9 +17569,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -17095,6 +17647,9 @@ 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 ""
@@ -17116,6 +17671,9 @@ msgstr[0] "Zadnjih %d dan"
msgstr[1] "Zadnjih %d dana"
msgstr[2] "Zadnjih %d dana"
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17161,6 +17719,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17209,6 +17770,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17242,6 +17806,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17293,9 +17860,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17305,6 +17869,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17500,9 +18154,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17614,6 +18265,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17653,7 +18307,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -18013,6 +18667,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -18025,9 +18682,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -18085,6 +18739,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18355,6 +19012,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18436,9 +19096,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18448,9 +19105,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18499,6 +19153,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19210,6 +19867,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19219,6 +19879,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19237,6 +19900,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19447,6 +20113,12 @@ 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 ""
@@ -19465,12 +20137,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19705,6 +20371,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19726,6 +20395,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19768,6 +20440,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19873,6 +20548,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19894,9 +20572,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19924,6 +20608,9 @@ 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 ""
@@ -19960,6 +20647,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20188,13 +20878,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20209,6 +20905,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 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 ""
@@ -20224,9 +20923,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20254,6 +20950,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20308,9 +21007,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20422,6 +21118,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20443,6 +21145,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20476,9 +21181,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20656,7 +21367,7 @@ 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."
+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."
@@ -20689,7 +21400,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20704,6 +21415,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20716,10 +21433,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20788,6 +21505,9 @@ 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 ""
@@ -20842,9 +21562,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20899,6 +21616,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20911,6 +21637,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -21034,9 +21763,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -21055,6 +21781,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -21073,6 +21802,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -21112,6 +21847,9 @@ 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|npm command"
msgstr ""
@@ -21133,15 +21871,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21214,6 +21952,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21271,10 +22018,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21370,6 +22117,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21421,9 +22171,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21445,10 +22192,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21523,15 +22270,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21559,10 +22297,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21577,9 +22315,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21604,6 +22339,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21640,9 +22378,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21676,6 +22411,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21688,12 +22426,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21733,6 +22480,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21745,6 +22495,12 @@ 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 ""
@@ -21802,6 +22558,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21871,6 +22630,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21994,12 +22756,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -22060,21 +22828,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -22096,6 +22882,12 @@ 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 ""
@@ -22204,6 +22996,9 @@ 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 ""
@@ -22288,24 +23083,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22342,6 +23119,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22699,6 +23479,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22927,10 +23710,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22942,7 +23722,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22957,6 +23737,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22984,16 +23770,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -23032,13 +23815,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -23074,13 +23857,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -23107,16 +23893,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23140,7 +23935,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23164,52 +23959,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23488,10 +24280,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23500,9 +24292,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23518,6 +24307,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23533,6 +24331,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23545,22 +24349,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23569,6 +24373,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23659,9 +24469,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23704,9 +24511,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23719,6 +24523,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23812,7 +24619,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23908,7 +24715,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -24001,6 +24850,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -24037,6 +24889,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24211,6 +25066,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24316,6 +25174,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24382,6 +25243,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24550,7 +25414,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24604,12 +25468,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24685,6 +25552,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24712,6 +25585,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24808,6 +25687,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24826,6 +25708,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24940,9 +25825,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -25033,6 +25915,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25411,7 +26296,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25483,6 +26368,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25570,6 +26458,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25753,7 +26644,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25798,12 +26689,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25816,9 +26713,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25843,6 +26737,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25879,6 +26776,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25888,10 +26791,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25912,6 +26815,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25927,9 +26833,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25957,6 +26860,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25999,19 +26908,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -26035,12 +26944,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -26083,7 +26986,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -26092,7 +26995,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26179,9 +27082,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26230,7 +27130,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26272,12 +27172,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26320,7 +27226,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26497,6 +27403,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26689,6 +27598,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26845,7 +27757,7 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -27136,9 +28048,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27265,6 +28174,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27448,9 +28360,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27640,12 +28549,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -28150,67 +29062,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28297,6 +29209,12 @@ 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 ""
@@ -28306,7 +29224,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28501,6 +29419,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28564,6 +29485,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28576,6 +29500,9 @@ 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 ""
@@ -28597,6 +29524,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28645,9 +29575,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -29140,6 +30067,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29224,6 +30154,9 @@ 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 ""
@@ -29242,12 +30175,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29278,10 +30217,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29323,7 +30262,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29338,7 +30277,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29380,6 +30319,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29410,6 +30352,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29437,9 +30382,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29452,6 +30394,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29515,6 +30460,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29557,18 +30505,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29740,6 +30676,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -30037,6 +30976,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -30070,6 +31012,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30400,6 +31345,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30550,10 +31498,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30616,12 +31564,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30646,9 +31588,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30775,22 +31714,28 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30799,13 +31744,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30892,6 +31834,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30904,6 +31849,9 @@ msgstr "Isprobajte sve što GitLab može ponuditi za 30 dana."
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30925,10 +31873,10 @@ msgstr "Utorak"
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30994,6 +31942,21 @@ msgstr "URL"
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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -31126,6 +32089,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31297,9 +32263,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31477,6 +32440,12 @@ 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|Packages"
msgstr ""
@@ -31579,6 +32548,96 @@ 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 ""
@@ -31588,7 +32647,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31609,7 +32668,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31780,6 +32839,12 @@ 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 ""
@@ -31822,6 +32887,9 @@ 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 ""
@@ -31837,6 +32905,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31846,9 +32917,15 @@ 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 ""
@@ -31921,6 +32998,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -32038,6 +33118,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -32083,9 +33166,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32203,6 +33283,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32269,6 +33352,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32290,15 +33376,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32497,6 +33595,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32518,6 +33622,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32575,10 +33682,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32587,7 +33694,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32614,64 +33721,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32710,6 +33826,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32737,7 +33856,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32905,10 +34024,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -33004,9 +34120,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -33016,6 +34129,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -33082,7 +34198,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -33097,6 +34213,9 @@ 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 ""
@@ -33145,6 +34264,9 @@ 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 ""
@@ -33292,6 +34414,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33409,6 +34534,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33640,9 +34768,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33814,6 +34939,9 @@ 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 profile"
msgstr ""
@@ -33871,6 +34999,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33895,6 +35026,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -34108,6 +35242,9 @@ 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 ""
@@ -34240,6 +35377,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34393,6 +35533,9 @@ msgstr[2] ""
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 ""
@@ -34534,6 +35677,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34630,9 +35776,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34675,9 +35818,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34795,6 +35935,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34879,7 +36022,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34960,6 +36103,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34969,9 +36115,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -35020,9 +36172,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35314,6 +36463,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35341,6 +36496,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35368,9 +36526,6 @@ msgstr ""
msgid "username"
msgstr "korisniÄko ime"
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/ca_ES/gitlab.po b/locale/ca_ES/gitlab.po
index 65679abdca1..243c5678339 100644
--- a/locale/ca_ES/gitlab.po
+++ b/locale/ca_ES/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: ca\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:56\n"
+"PO-Revision-Date: 2021-03-05 23:54\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr " o referències (per ex. el camí/al/projecte!merge_request_id)"
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr "\"%{path}\" no existeix a \"%{ref}\""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -170,6 +173,11 @@ 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] ""
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] "%d vulnerabilitat descartada"
msgstr[1] "%d vulnerabilitats descartades"
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ 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 ""
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -682,6 +710,15 @@ msgstr[1] "%{no_of_days} dies"
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr "%{number_commits_behind} comissions per darrera de %{default_branch}, %{number_commits_ahead} comissions per davant"
+msgid "%{oneMonthAgo} - %{today}"
+msgstr ""
+
+msgid "%{oneWeekAgo} - %{today}"
+msgstr ""
+
+msgid "%{oneYearAgo} - %{today}"
+msgstr ""
+
msgid "%{openOrClose} %{noteable}"
msgstr "%{openOrClose} %{noteable}"
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -976,6 +1016,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -988,9 +1031,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1015,9 +1055,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1111,6 +1148,11 @@ 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] "1 grup"
@@ -1162,6 +1204,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1282,6 +1327,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1635,9 +1779,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1716,12 +1857,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1818,6 +1965,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr "AddMember|No s’ha especificat cap usuari."
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1938,6 +2103,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2058,6 +2226,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2091,6 +2268,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2259,6 +2442,15 @@ 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 ""
@@ -2268,6 +2460,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2361,6 +2562,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2394,6 +2607,21 @@ 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 ""
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2483,9 +2714,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2576,9 +2792,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,9 +2813,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,49 +2837,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,76 +2867,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
-msgstr ""
-
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,13 +2927,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2954,7 +3104,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2996,6 +3146,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3146,12 +3293,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3269,6 +3425,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3296,12 +3455,18 @@ 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 ""
@@ -3344,7 +3509,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3395,10 +3566,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3757,9 +3928,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3787,6 +3955,9 @@ 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 erase this build?"
msgstr ""
@@ -4048,12 +4219,6 @@ msgstr[1] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr "Nom de la branca"
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr "Branques"
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5028,6 +5235,26 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr "Cancel·la"
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5688,7 +5915,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5703,6 +5930,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr "cancel·lat"
@@ -6036,21 +6266,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7325,16 +7594,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
-msgstr "Compara"
+msgid "CompareBranches|There isn't anything to compare."
+msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7349,6 +7642,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7391,6 +7729,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7430,6 +7771,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7451,6 +7795,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8245,10 +8577,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8302,6 +8637,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8314,6 +8652,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8329,6 +8670,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,14 +8991,14 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
-msgstr "Perfil"
+msgid "CurrentUser|One of your groups is running out"
+msgstr ""
-msgid "CurrentUser|Settings"
-msgstr "Configuració"
+msgid "CurrentUser|Preferences"
+msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
@@ -8647,7 +9024,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8689,6 +9066,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr "Personalitza els colors"
@@ -8722,6 +9102,18 @@ 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 ""
@@ -8886,7 +9278,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 ""
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr "Depura"
@@ -9261,9 +9682,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9318,6 +9736,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr ""
msgid "Delete"
msgstr "Suprimeix"
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9429,6 +9856,15 @@ 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 ""
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9660,6 +10093,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9678,9 +10114,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9690,19 +10123,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9717,10 +10150,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9735,7 +10165,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9756,10 +10186,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
+msgstr ""
+
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Use this token as a password. Save it. This password can %{i_start}not%{i_end} be recovered."
msgstr ""
msgid "DeployTokens|Username"
@@ -9768,7 +10204,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10047,18 +10482,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,7 +10710,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11048,21 +11468,15 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the issue title"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request description"
+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 merge request title"
-msgstr "Introduïu el títol de la petició de fusió"
-
msgid "Enter the name of your application, and we'll return a unique %{type}."
msgstr ""
@@ -11345,6 +11759,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11369,6 +11786,12 @@ 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 ""
@@ -11396,6 +11819,9 @@ msgstr "Com ho puc resoldre-ho?"
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11423,6 +11849,9 @@ 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 ""
@@ -11447,9 +11876,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11882,6 +12320,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11915,6 +12356,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12038,10 +12482,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12068,6 +12512,12 @@ 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 ""
@@ -12104,9 +12554,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,10 +12602,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr "Color del tipus de lletra"
@@ -12826,6 +13279,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12856,7 +13345,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12934,9 +13423,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13096,6 +13585,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13135,6 +13627,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr "Fallit"
@@ -13144,6 +13639,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 "Mai"
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr "Estat"
@@ -13291,6 +13801,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13330,6 +13840,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13828,6 +14344,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14630,6 +15164,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15703,96 +16240,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16078,9 +16543,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ 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 ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ 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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16972,6 +17518,9 @@ 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 ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] ""
msgstr[1] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17085,6 +17640,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17118,6 +17676,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17169,9 +17730,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17181,6 +17739,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr "Mou"
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19590,6 +20253,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19737,6 +20406,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19788,6 +20466,9 @@ 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 ""
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ 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."
+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."
@@ -20552,7 +21257,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20579,10 +21290,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20651,6 +21362,9 @@ 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 ""
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20762,6 +21473,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21077,6 +21809,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21284,9 +22028,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21308,10 +22049,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,10 +22154,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ 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 ""
@@ -21665,6 +22415,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21923,21 +22685,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21959,6 +22739,12 @@ 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 ""
@@ -22067,6 +22853,9 @@ 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 ""
@@ -22151,24 +22940,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22205,6 +22976,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22562,6 +23336,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22790,10 +23567,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22805,7 +23579,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,13 +23672,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22937,13 +23714,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22970,16 +23750,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,52 +23816,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23381,6 +24164,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23396,6 +24188,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23408,22 +24206,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23432,6 +24230,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23522,9 +24326,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23675,7 +24476,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23771,7 +24572,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24072,6 +24921,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24243,6 +25098,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,7 +25269,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25595,7 +26480,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25721,6 +26612,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,10 +26627,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,19 +26744,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26161,7 +27062,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26338,6 +27239,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] ""
msgstr[1] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27287,9 +28194,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27479,12 +28383,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27989,67 +28896,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28136,6 +29043,12 @@ 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 ""
@@ -28145,7 +29058,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ 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 ""
@@ -29076,12 +30004,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29112,10 +30046,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29157,7 +30091,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29574,6 +30505,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30382,10 +31325,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30735,6 +31675,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30756,10 +31699,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31308,6 +32266,12 @@ 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|Packages"
msgstr ""
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ 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 ""
@@ -31653,6 +32713,9 @@ 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 ""
@@ -31668,6 +32731,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ 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 ""
@@ -31752,6 +32824,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31912,9 +32990,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32032,6 +33107,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,10 +33847,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32832,9 +33943,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ 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 ""
@@ -33120,6 +34237,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33237,6 +34357,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33642,6 +34762,9 @@ 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 profile"
msgstr ""
@@ -33699,6 +34822,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 ""
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34215,6 +35350,9 @@ 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 ""
@@ -34354,6 +35492,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34698,7 +35836,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35128,6 +36272,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/cs_CZ/gitlab.po b/locale/cs_CZ/gitlab.po
index a0c4f497d9e..fdb49bfaf92 100644
--- a/locale/cs_CZ/gitlab.po
+++ b/locale/cs_CZ/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: cs\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:56\n"
+"PO-Revision-Date: 2021-03-05 23:54\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -78,6 +78,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -210,6 +213,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d epic"
+msgid_plural "%d epics"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d error"
msgid_plural "%d errors"
msgstr[0] ""
@@ -455,6 +465,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -540,6 +557,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -618,6 +638,9 @@ 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 ""
@@ -669,6 +692,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -777,6 +803,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -808,6 +840,15 @@ msgstr[3] ""
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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -857,9 +898,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -907,6 +945,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1101,6 +1142,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -1126,6 +1170,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -1138,9 +1185,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1165,9 +1209,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1279,6 +1320,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "1 follower"
+msgid_plural "%{count} followers"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "1 group"
msgid_plural "%d groups"
msgstr[0] ""
@@ -1348,6 +1396,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr "1. příspěvek!"
@@ -1468,6 +1519,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1567,6 +1621,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1823,9 +1973,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1904,12 +2051,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -2006,6 +2159,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2066,6 +2234,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -2126,6 +2297,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2246,6 +2420,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2270,6 +2450,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2279,6 +2462,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2354,6 +2540,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2447,6 +2636,15 @@ 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 ""
@@ -2456,6 +2654,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2540,6 +2741,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2549,6 +2756,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2582,6 +2801,21 @@ 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 ""
@@ -2606,6 +2840,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2673,9 +2910,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2688,24 +2922,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2766,9 +2988,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2778,6 +2997,9 @@ 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 ""
@@ -2787,9 +3009,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2814,49 +3033,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2868,9 +3054,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2880,76 +3063,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
-msgstr ""
-
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2961,13 +3123,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2979,9 +3141,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2994,7 +3153,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -3081,9 +3240,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -3144,7 +3300,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -3186,6 +3342,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3252,12 +3411,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3336,12 +3489,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3366,6 +3525,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3459,6 +3621,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3486,12 +3651,18 @@ 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 ""
@@ -3534,7 +3705,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3573,6 +3747,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3585,10 +3762,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3955,9 +4132,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3985,6 +4159,9 @@ 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 erase this build?"
msgstr ""
@@ -4252,12 +4429,6 @@ msgstr[3] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4330,6 +4501,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4756,6 +4930,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4768,12 +4945,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4844,6 +5033,12 @@ 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 ""
@@ -4934,12 +5129,6 @@ msgstr "Název větve"
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr "Větve"
@@ -5108,16 +5297,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -5132,6 +5333,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -5165,6 +5369,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -5183,6 +5393,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5234,6 +5447,28 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5369,6 +5604,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5522,12 +5760,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5672,6 +5904,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5894,7 +6129,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5909,6 +6144,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6242,21 +6480,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6266,9 +6525,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7277,6 +7548,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7346,6 +7620,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7533,16 +7810,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
-msgstr "Porovnat"
+msgid "CompareBranches|There isn't anything to compare."
+msgstr ""
+
+msgid "CompareRevisions|Branches"
+msgstr ""
-msgid "CompareBranches|Source"
-msgstr "Zdroj"
+msgid "CompareRevisions|Compare"
+msgstr ""
-msgid "CompareBranches|Target"
-msgstr "Cíl"
+msgid "CompareRevisions|Create merge request"
+msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7557,6 +7858,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7569,9 +7876,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7587,6 +7924,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7599,6 +7945,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7638,6 +7987,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7659,6 +8011,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7713,9 +8068,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7892,24 +8244,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8370,10 +8713,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8409,9 +8752,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8461,10 +8801,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8491,6 +8831,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8518,6 +8861,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8530,6 +8876,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8545,6 +8894,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8617,6 +8972,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8626,15 +8984,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8653,6 +9026,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8662,6 +9038,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8677,6 +9056,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8782,6 +9164,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8830,13 +9215,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8863,7 +9248,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8905,6 +9290,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8938,6 +9326,18 @@ 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 ""
@@ -9104,7 +9504,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9260,7 +9660,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9284,6 +9690,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9365,6 +9774,9 @@ 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 ""
@@ -9374,6 +9786,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9398,6 +9813,13 @@ 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] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "DastSiteValidation|Validate"
msgstr ""
@@ -9416,6 +9838,9 @@ 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 ""
@@ -9437,6 +9862,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9461,6 +9889,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9479,9 +9910,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9536,6 +9964,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9566,6 +9997,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9623,6 +10057,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9647,6 +10084,15 @@ 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 ""
@@ -9833,13 +10279,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
-msgstr ""
-
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9848,6 +10291,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9857,15 +10303,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9890,6 +10333,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9908,9 +10354,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9920,19 +10363,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9947,10 +10390,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9965,7 +10405,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9986,10 +10426,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
+msgstr ""
+
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9998,7 +10444,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -10028,6 +10474,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -10037,15 +10486,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -10055,6 +10495,13 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10277,18 +10724,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10304,16 +10739,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10334,10 +10769,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10346,18 +10778,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10370,9 +10796,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10382,6 +10805,12 @@ 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 ""
@@ -10409,6 +10838,9 @@ 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|Score"
msgstr ""
@@ -10520,7 +10952,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10725,6 +11157,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10917,10 +11352,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10989,12 +11424,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -11115,6 +11544,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11280,19 +11712,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
-msgstr ""
-
-msgid "Enter the issue title"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11577,6 +12003,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11601,6 +12030,12 @@ 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 ""
@@ -11628,6 +12063,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11655,6 +12093,9 @@ 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 ""
@@ -11679,9 +12120,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11856,6 +12294,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -12021,6 +12462,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -12036,6 +12480,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -12078,6 +12525,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -12114,6 +12564,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -12147,6 +12600,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12270,10 +12726,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12300,6 +12756,12 @@ 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 ""
@@ -12336,9 +12798,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12354,9 +12813,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12390,10 +12846,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12438,7 +12894,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12456,9 +12912,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12501,6 +12954,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12997,6 +13453,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -13060,6 +13525,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -13090,7 +13591,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -13168,9 +13669,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -13183,6 +13681,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13330,6 +13831,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13369,6 +13873,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13378,6 +13885,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13402,6 +13912,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13429,6 +13945,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13474,6 +13993,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13525,6 +14047,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13549,9 +14074,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13564,6 +14086,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13600,6 +14125,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13861,9 +14389,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -14014,6 +14539,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -14062,6 +14590,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14395,6 +14926,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14671,6 +15211,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14752,15 +15298,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14868,6 +15414,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -15122,6 +15671,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15483,7 +16035,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15909,9 +16461,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15949,96 +16498,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -16057,12 +16516,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -16114,6 +16579,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -16147,6 +16618,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16315,6 +16789,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16324,9 +16801,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16336,9 +16810,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16378,19 +16885,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16399,18 +16927,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16420,6 +16963,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16642,6 +17191,9 @@ 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 ""
@@ -16717,10 +17269,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16768,6 +17317,9 @@ 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 ""
@@ -16783,7 +17335,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16843,6 +17395,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16867,6 +17422,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -17068,6 +17626,9 @@ 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 ""
@@ -17137,9 +17698,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -17218,6 +17776,9 @@ 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 ""
@@ -17240,6 +17801,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17285,6 +17849,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17333,6 +17900,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17366,6 +17936,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17417,9 +17990,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17429,6 +17999,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17630,9 +18290,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17745,6 +18402,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17784,7 +18444,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -18144,6 +18804,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -18156,9 +18819,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -18216,6 +18876,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18486,6 +19149,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18567,9 +19233,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18579,9 +19242,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18630,6 +19290,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19343,6 +20006,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19352,6 +20018,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19370,6 +20039,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19582,6 +20254,12 @@ 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 ""
@@ -19600,12 +20278,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19841,6 +20513,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19862,6 +20537,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19904,6 +20582,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -20009,6 +20690,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -20030,9 +20714,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -20060,6 +20750,9 @@ 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 ""
@@ -20096,6 +20789,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20324,13 +21020,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20345,6 +21047,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 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 ""
@@ -20360,9 +21065,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20390,6 +21092,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20444,9 +21149,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20558,6 +21260,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20579,6 +21287,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20612,9 +21323,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20793,7 +21510,7 @@ 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."
+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."
@@ -20826,7 +21543,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20841,6 +21558,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20853,10 +21576,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20925,6 +21648,9 @@ 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 ""
@@ -20979,9 +21705,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -21036,6 +21759,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -21048,6 +21780,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -21171,9 +21906,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -21192,6 +21924,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -21210,6 +21945,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -21249,6 +21990,9 @@ 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|npm command"
msgstr ""
@@ -21270,15 +22014,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21351,6 +22095,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21408,10 +22161,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21507,6 +22260,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21558,9 +22314,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21582,10 +22335,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21660,15 +22413,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21696,10 +22440,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21714,9 +22458,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21741,6 +22482,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21777,9 +22521,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21813,6 +22554,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21825,12 +22569,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21870,6 +22623,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21882,6 +22638,12 @@ 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 ""
@@ -21939,6 +22701,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -22008,6 +22773,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -22131,12 +22899,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -22197,21 +22971,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -22233,6 +23025,12 @@ 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 ""
@@ -22341,6 +23139,9 @@ 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 ""
@@ -22425,24 +23226,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22479,6 +23262,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22836,6 +23622,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -23064,10 +23853,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -23079,7 +23865,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -23094,6 +23880,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -23121,16 +23913,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -23169,13 +23958,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -23211,13 +24000,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -23244,16 +24036,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23277,7 +24078,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23301,52 +24102,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23625,10 +24423,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23637,9 +24435,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23655,6 +24450,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23670,6 +24474,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23682,22 +24492,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23706,6 +24516,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23796,9 +24612,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23841,9 +24654,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23856,6 +24666,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23949,7 +24762,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -24045,7 +24858,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -24138,6 +24993,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -24174,6 +25032,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24350,6 +25211,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24455,6 +25319,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24521,6 +25388,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24689,7 +25559,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24745,12 +25615,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24828,6 +25701,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24855,6 +25734,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24951,6 +25836,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24969,6 +25857,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -25085,9 +25976,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -25178,6 +26066,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25558,7 +26449,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25630,6 +26521,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25717,6 +26611,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25911,7 +26808,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25956,12 +26853,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25974,9 +26877,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -26001,6 +26901,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -26037,6 +26940,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -26046,10 +26955,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -26070,6 +26979,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -26085,9 +26997,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -26115,6 +27024,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -26157,19 +27072,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -26193,13 +27108,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -26242,7 +27150,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -26251,7 +27159,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26338,9 +27246,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26389,7 +27294,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26431,12 +27336,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26479,7 +27390,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26656,6 +27567,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26848,6 +27762,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -27005,7 +27922,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -27297,9 +28214,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27426,6 +28340,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27609,9 +28526,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27801,12 +28715,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -28311,67 +29228,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28458,6 +29375,12 @@ 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 ""
@@ -28467,7 +29390,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28662,6 +29585,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28727,6 +29653,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28739,6 +29668,9 @@ 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 ""
@@ -28760,6 +29692,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28809,9 +29744,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -29306,6 +30238,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29390,6 +30325,9 @@ 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 ""
@@ -29408,12 +30346,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29444,10 +30388,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29489,7 +30433,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29504,7 +30448,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29546,6 +30490,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29576,6 +30523,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29603,9 +30553,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29618,6 +30565,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29681,6 +30631,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29723,18 +30676,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29906,6 +30847,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -30203,6 +31147,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -30236,6 +31183,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30568,6 +31518,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30718,10 +31671,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30784,12 +31737,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30814,9 +31761,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30943,23 +31887,29 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30968,13 +31918,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -31061,6 +32008,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -31073,6 +32023,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -31094,10 +32047,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -31163,6 +32116,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -31295,6 +32263,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31466,9 +32437,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31646,6 +32614,12 @@ 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|Packages"
msgstr ""
@@ -31748,6 +32722,96 @@ 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 "Pomocí %{code_start}::%{code_end} vytvořte sadu %{link_start} štítků s rozsahem %{link_end} (např. Priorita %{code_start}::1%{code_end})"
@@ -31757,7 +32821,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31778,7 +32842,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31949,6 +33013,12 @@ 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 ""
@@ -31991,6 +33061,9 @@ 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 ""
@@ -32006,6 +33079,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -32015,9 +33091,15 @@ 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 ""
@@ -32090,6 +33172,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -32207,6 +33292,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -32254,9 +33342,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32374,6 +33459,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32440,6 +33528,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32461,15 +33552,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32668,6 +33771,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32689,6 +33798,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32746,10 +33858,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32758,7 +33870,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32785,64 +33897,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32881,6 +34002,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32908,7 +34032,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -33077,10 +34201,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -33176,9 +34297,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -33188,6 +34306,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -33254,7 +34375,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -33269,6 +34390,9 @@ 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 ""
@@ -33317,6 +34441,9 @@ 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 ""
@@ -33464,6 +34591,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33581,6 +34711,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33812,9 +34945,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33986,6 +35116,9 @@ 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 profile"
msgstr ""
@@ -34043,6 +35176,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -34068,6 +35204,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -34281,6 +35420,9 @@ 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 ""
@@ -34414,6 +35556,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34571,6 +35716,9 @@ msgstr[3] ""
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 ""
@@ -34714,6 +35862,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34810,9 +35961,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34856,9 +36004,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34976,6 +36121,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -35060,7 +36208,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -35141,6 +36289,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -35150,9 +36301,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -35201,9 +36358,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35500,6 +36654,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35527,6 +36687,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35554,9 +36717,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/cy_GB/gitlab.po b/locale/cy_GB/gitlab.po
index bcd2259dcf1..b01e2965940 100644
--- a/locale/cy_GB/gitlab.po
+++ b/locale/cy_GB/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: cy\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:07\n"
+"PO-Revision-Date: 2021-03-05 23:48\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -82,6 +82,9 @@ msgstr " neu gyfeiriadau (ee path/to/project!merge_request_id)"
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr "Nid oedd \"%{path}\" yn bodoli ar \"%{ref}\""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -250,6 +253,15 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "%d epic"
+msgid_plural "%d epics"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "%d error"
msgid_plural "%d errors"
msgstr[0] ""
@@ -565,6 +577,15 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -658,6 +679,9 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -742,6 +766,9 @@ msgstr ""
msgid "%{edit_in_new_fork_notice} Try to upload a file again."
msgstr "%{edit_in_new_fork_notice} Ceisiwch lwytho ffeil eto."
+msgid "%{emailPrefix}@company.com"
+msgstr ""
+
msgid "%{extra} more downstream pipelines"
msgstr ""
@@ -793,6 +820,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -901,6 +931,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -934,6 +970,15 @@ msgstr[5] ""
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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -985,9 +1030,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -1039,6 +1081,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1249,6 +1294,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -1276,6 +1324,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -1288,9 +1339,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1315,9 +1363,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1447,6 +1492,15 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "1 follower"
+msgid_plural "%{count} followers"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "1 group"
msgid_plural "%d groups"
msgstr[0] ""
@@ -1534,6 +1588,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1654,6 +1711,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1753,6 +1813,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -2011,9 +2167,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -2092,12 +2245,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -2194,6 +2353,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2254,6 +2428,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -2314,6 +2491,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2434,6 +2614,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2458,6 +2644,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2467,6 +2656,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2542,6 +2734,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2635,6 +2830,15 @@ 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 ""
@@ -2644,6 +2848,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2728,6 +2935,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2737,6 +2950,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2770,6 +2995,21 @@ 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 ""
@@ -2794,6 +3034,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2863,9 +3106,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2878,24 +3118,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2956,9 +3184,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2968,6 +3193,9 @@ 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 ""
@@ -2977,9 +3205,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -3004,49 +3229,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -3058,9 +3250,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -3070,76 +3259,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
-msgstr ""
-
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -3151,13 +3319,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -3169,9 +3337,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -3184,7 +3349,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -3271,9 +3436,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -3334,7 +3496,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -3376,6 +3538,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3442,12 +3607,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3526,12 +3685,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3556,6 +3721,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3649,6 +3817,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3676,12 +3847,18 @@ 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 ""
@@ -3724,7 +3901,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3763,6 +3943,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3775,10 +3958,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -4153,9 +4336,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -4183,6 +4363,9 @@ 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 erase this build?"
msgstr ""
@@ -4456,12 +4639,6 @@ msgstr[5] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4534,6 +4711,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4960,6 +5140,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4972,12 +5155,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -5050,6 +5245,12 @@ 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 ""
@@ -5140,12 +5341,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -5314,16 +5509,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -5338,6 +5545,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -5371,6 +5581,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -5389,6 +5605,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5440,6 +5659,30 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5575,6 +5818,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5728,12 +5974,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5878,6 +6118,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -6100,7 +6343,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -6115,6 +6358,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6448,21 +6694,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6472,9 +6739,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7483,6 +7762,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7552,6 +7834,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7741,16 +8026,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7765,6 +8074,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7777,9 +8092,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7795,6 +8140,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7807,6 +8161,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7846,6 +8203,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7867,6 +8227,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7921,9 +8284,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -8104,24 +8464,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8584,10 +8935,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8623,9 +8974,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8677,10 +9025,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8707,6 +9055,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8734,6 +9085,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8746,6 +9100,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8761,6 +9118,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8833,6 +9196,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8842,15 +9208,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8869,6 +9250,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8878,6 +9262,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8893,6 +9280,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8998,6 +9388,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -9046,13 +9439,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -9079,7 +9472,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -9121,6 +9514,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -9154,6 +9550,18 @@ 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 ""
@@ -9322,7 +9730,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9478,7 +9886,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9502,6 +9916,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9583,6 +10000,9 @@ 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 ""
@@ -9592,6 +10012,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9616,6 +10039,15 @@ 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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "DastSiteValidation|Validate"
msgstr ""
@@ -9634,6 +10066,9 @@ 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 ""
@@ -9655,6 +10090,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9679,6 +10117,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9697,9 +10138,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9754,6 +10192,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9784,6 +10225,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9841,6 +10285,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9865,6 +10312,15 @@ 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 ""
@@ -10063,13 +10519,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
-msgstr ""
-
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -10078,6 +10531,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -10087,15 +10543,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -10120,6 +10573,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -10138,9 +10594,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -10150,19 +10603,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -10177,10 +10630,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -10195,7 +10645,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -10216,10 +10666,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
+msgstr ""
+
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -10228,7 +10684,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -10258,6 +10714,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -10267,15 +10726,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -10285,6 +10735,15 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10507,18 +10966,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10534,16 +10981,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10564,10 +11011,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10576,18 +11020,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10600,9 +11038,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10612,6 +11047,12 @@ 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 ""
@@ -10639,6 +11080,9 @@ 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|Score"
msgstr ""
@@ -10750,7 +11194,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10957,6 +11401,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -11149,10 +11596,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -11221,12 +11668,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -11347,6 +11788,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11512,19 +11956,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
-msgstr ""
-
-msgid "Enter the issue title"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11809,6 +12247,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11833,6 +12274,12 @@ 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 ""
@@ -11860,6 +12307,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11887,6 +12337,9 @@ 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 ""
@@ -11911,9 +12364,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -12088,6 +12538,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -12253,6 +12706,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -12268,6 +12724,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -12310,6 +12769,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -12346,6 +12808,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -12379,6 +12844,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12502,10 +12970,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12532,6 +13000,12 @@ 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 ""
@@ -12568,9 +13042,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12586,9 +13057,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12622,10 +13090,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12670,7 +13138,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12688,9 +13156,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12733,6 +13198,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -13231,6 +13699,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -13294,6 +13771,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -13324,7 +13837,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -13402,9 +13915,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -13417,6 +13927,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13564,6 +14077,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13603,6 +14119,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13612,6 +14131,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13636,6 +14158,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13663,6 +14191,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13708,6 +14239,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13759,6 +14293,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13783,9 +14320,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13798,6 +14332,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13834,6 +14371,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -14095,9 +14635,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -14248,6 +14785,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -14296,6 +14836,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14629,6 +15172,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14905,6 +15457,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14986,15 +15544,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -15106,6 +15664,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -15364,6 +15925,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15727,7 +16291,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -16153,9 +16717,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -16195,96 +16756,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -16303,12 +16774,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -16360,6 +16837,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -16393,6 +16876,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16561,6 +17047,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16570,9 +17059,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16582,9 +17068,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16624,19 +17143,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16645,18 +17185,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16666,6 +17221,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16888,6 +17449,9 @@ 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 ""
@@ -16963,10 +17527,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -17014,6 +17575,9 @@ 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 ""
@@ -17029,7 +17593,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -17089,6 +17653,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -17113,6 +17680,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -17314,6 +17884,9 @@ 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 ""
@@ -17383,9 +17956,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -17464,6 +18034,9 @@ 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 ""
@@ -17488,6 +18061,9 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17533,6 +18109,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17581,6 +18160,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17614,6 +18196,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17665,9 +18250,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17677,6 +18259,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17890,9 +18562,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -18007,6 +18676,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -18046,7 +18718,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -18406,6 +19078,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -18418,9 +19093,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -18478,6 +19150,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18748,6 +19423,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18829,9 +19507,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18841,9 +19516,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18892,6 +19564,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19609,6 +20284,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19618,6 +20296,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19636,6 +20317,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19852,6 +20536,12 @@ 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 ""
@@ -19870,12 +20560,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -20113,6 +20797,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -20134,6 +20821,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -20176,6 +20866,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -20281,6 +20974,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -20302,9 +20998,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -20332,6 +21034,9 @@ 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 ""
@@ -20368,6 +21073,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20596,13 +21304,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20617,6 +21331,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 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 ""
@@ -20632,9 +21349,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20662,6 +21376,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20716,9 +21433,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20830,6 +21544,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20851,6 +21571,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20884,9 +21607,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -21067,7 +21796,7 @@ 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."
+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."
@@ -21100,7 +21829,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -21115,6 +21844,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -21127,10 +21862,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -21199,6 +21934,9 @@ 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 ""
@@ -21253,9 +21991,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -21310,6 +22045,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -21322,6 +22066,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -21445,9 +22192,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -21466,6 +22210,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -21484,6 +22231,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -21523,6 +22276,9 @@ 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|npm command"
msgstr ""
@@ -21544,15 +22300,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21625,6 +22381,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21682,10 +22447,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21781,6 +22546,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21832,9 +22600,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21856,10 +22621,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21934,15 +22699,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21970,10 +22726,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21988,9 +22744,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -22015,6 +22768,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -22051,9 +22807,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -22087,6 +22840,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -22099,12 +22855,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -22144,6 +22909,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -22156,6 +22924,12 @@ 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 ""
@@ -22213,6 +22987,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -22282,6 +23059,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -22405,12 +23185,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -22471,21 +23257,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -22507,6 +23311,12 @@ 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 ""
@@ -22615,6 +23425,9 @@ 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 ""
@@ -22699,24 +23512,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22753,6 +23548,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -23110,6 +23908,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -23338,10 +24139,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -23353,7 +24151,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -23368,6 +24166,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -23395,16 +24199,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -23443,13 +24244,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -23485,13 +24286,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -23518,16 +24322,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23551,7 +24364,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23575,52 +24388,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23899,10 +24709,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23911,9 +24721,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23929,6 +24736,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23944,6 +24760,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23956,22 +24778,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23980,6 +24802,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -24070,9 +24898,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -24115,9 +24940,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -24130,6 +24952,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -24223,7 +25048,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -24319,7 +25144,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -24412,6 +25279,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -24448,6 +25318,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24628,6 +25501,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24733,6 +25609,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24799,6 +25678,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24967,7 +25849,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -25027,12 +25909,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -25114,6 +25999,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -25141,6 +26032,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -25237,6 +26134,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -25255,6 +26155,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -25375,9 +26278,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -25468,6 +26368,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25852,7 +26755,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25924,6 +26827,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -26011,6 +26917,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -26227,7 +27136,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -26272,12 +27181,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -26290,9 +27205,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -26317,6 +27229,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -26353,6 +27268,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -26362,10 +27283,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -26386,6 +27307,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -26401,9 +27325,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -26431,6 +27352,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -26473,19 +27400,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -26509,15 +27436,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-msgstr[5] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -26560,7 +27478,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -26569,7 +27487,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26656,9 +27574,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26707,7 +27622,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26749,12 +27664,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26797,7 +27718,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26974,6 +27895,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -27166,6 +28090,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -27325,7 +28252,7 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -27619,9 +28546,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27748,6 +28672,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27931,9 +28858,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -28123,12 +29047,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -28633,67 +29560,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28780,6 +29707,12 @@ 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 ""
@@ -28789,7 +29722,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28984,6 +29917,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -29053,6 +29989,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -29065,6 +30004,9 @@ 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 ""
@@ -29086,6 +30028,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -29137,9 +30082,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -29638,6 +30580,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29722,6 +30667,9 @@ 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 ""
@@ -29740,12 +30688,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29776,10 +30730,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29821,7 +30775,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29836,7 +30790,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29878,6 +30832,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29908,6 +30865,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29935,9 +30895,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29950,6 +30907,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -30013,6 +30973,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -30055,18 +31018,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -30238,6 +31189,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -30535,6 +31489,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -30568,6 +31525,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30904,6 +31864,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -31054,10 +32017,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -31120,12 +32083,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -31150,9 +32107,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -31279,8 +32233,8 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
@@ -31288,16 +32242,22 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -31306,13 +32266,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -31399,6 +32356,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -31411,6 +32371,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -31432,10 +32395,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -31501,6 +32464,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -31633,6 +32611,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31804,9 +32785,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31984,6 +32962,12 @@ 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|Packages"
msgstr ""
@@ -32086,6 +33070,96 @@ 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 ""
@@ -32095,7 +33169,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -32116,7 +33190,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -32287,6 +33361,12 @@ 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 ""
@@ -32329,6 +33409,9 @@ 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 ""
@@ -32344,6 +33427,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -32353,9 +33439,15 @@ 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 ""
@@ -32428,6 +33520,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -32545,6 +33640,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -32596,9 +33694,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32716,6 +33811,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32782,6 +33880,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32803,15 +33904,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -33010,6 +34123,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -33031,6 +34150,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -33088,10 +34210,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -33100,7 +34222,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -33127,64 +34249,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -33223,6 +34354,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -33250,7 +34384,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -33421,10 +34555,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -33520,9 +34651,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -33532,6 +34660,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -33598,7 +34729,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -33613,6 +34744,9 @@ 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 ""
@@ -33661,6 +34795,9 @@ 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 ""
@@ -33808,6 +34945,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33925,6 +35065,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -34156,9 +35299,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -34330,6 +35470,9 @@ 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 profile"
msgstr ""
@@ -34387,6 +35530,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -34414,6 +35560,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -34627,6 +35776,9 @@ 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 ""
@@ -34762,6 +35914,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34927,6 +36082,9 @@ msgstr[5] ""
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 ""
@@ -35074,6 +36232,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -35170,9 +36331,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -35218,9 +36376,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -35338,6 +36493,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -35422,7 +36580,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -35503,6 +36661,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -35512,9 +36673,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -35563,9 +36730,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35872,6 +37036,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35899,6 +37069,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35926,9 +37099,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/da_DK/gitlab.po b/locale/da_DK/gitlab.po
index 60a76fe0dee..2389f79e0b2 100644
--- a/locale/da_DK/gitlab.po
+++ b/locale/da_DK/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: da\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:56\n"
+"PO-Revision-Date: 2021-03-05 23:54\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -170,6 +173,11 @@ 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] ""
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ 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 ""
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -682,6 +710,15 @@ 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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -976,6 +1016,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -988,9 +1031,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1015,9 +1055,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1111,6 +1148,11 @@ 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] ""
@@ -1162,6 +1204,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1282,6 +1327,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1635,9 +1779,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1716,12 +1857,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1818,6 +1965,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1938,6 +2103,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2058,6 +2226,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2091,6 +2268,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2259,6 +2442,15 @@ 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 ""
@@ -2268,6 +2460,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2361,6 +2562,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2394,6 +2607,21 @@ 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 ""
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2483,9 +2714,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2576,9 +2792,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,9 +2813,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,49 +2837,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,76 +2867,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,13 +2927,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2954,7 +3104,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2996,6 +3146,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3146,12 +3293,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3269,6 +3425,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3296,12 +3455,18 @@ 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 ""
@@ -3344,7 +3509,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3395,10 +3566,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3757,9 +3928,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3787,6 +3955,9 @@ 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 erase this build?"
msgstr ""
@@ -4048,12 +4219,6 @@ msgstr[1] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5028,6 +5235,26 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5688,7 +5915,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5703,6 +5930,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6036,21 +6266,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7325,16 +7594,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7349,6 +7642,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7391,6 +7729,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7430,6 +7771,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7451,6 +7795,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8245,10 +8577,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8302,6 +8637,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8314,6 +8652,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8329,6 +8670,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,13 +8991,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8647,7 +9024,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8689,6 +9066,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8722,6 +9102,18 @@ 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 ""
@@ -8886,7 +9278,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 ""
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9261,9 +9682,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9318,6 +9736,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9429,6 +9856,15 @@ 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 ""
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9660,6 +10093,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9678,9 +10114,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9690,19 +10123,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9717,10 +10150,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9735,7 +10165,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9756,10 +10186,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9768,7 +10204,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10047,18 +10482,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,7 +10710,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11048,19 +11468,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
-msgstr ""
-
-msgid "Enter the issue title"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11345,6 +11759,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11369,6 +11786,12 @@ 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 ""
@@ -11396,6 +11819,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11423,6 +11849,9 @@ 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 ""
@@ -11447,9 +11876,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11882,6 +12320,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11915,6 +12356,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12038,10 +12482,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12068,6 +12512,12 @@ 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 ""
@@ -12104,9 +12554,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,10 +12602,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12826,6 +13279,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12856,7 +13345,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12934,9 +13423,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13096,6 +13585,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13135,6 +13627,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13144,6 +13639,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13291,6 +13801,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13330,6 +13840,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13828,6 +14344,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14630,6 +15164,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15703,96 +16240,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16078,9 +16543,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ 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 ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ 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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16972,6 +17518,9 @@ 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 ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] ""
msgstr[1] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17085,6 +17640,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17118,6 +17676,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17169,9 +17730,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17181,6 +17739,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19590,6 +20253,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19737,6 +20406,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19788,6 +20466,9 @@ 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 ""
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ 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."
+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."
@@ -20552,7 +21257,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20579,10 +21290,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20651,6 +21362,9 @@ 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 ""
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20762,6 +21473,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21077,6 +21809,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21284,9 +22028,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21308,10 +22049,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,10 +22154,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ 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 ""
@@ -21665,6 +22415,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21923,21 +22685,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21959,6 +22739,12 @@ 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 ""
@@ -22067,6 +22853,9 @@ 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 ""
@@ -22151,24 +22940,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22205,6 +22976,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22562,6 +23336,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22790,10 +23567,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22805,7 +23579,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,13 +23672,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22937,13 +23714,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22970,16 +23750,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,52 +23816,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23381,6 +24164,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23396,6 +24188,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23408,22 +24206,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23432,6 +24230,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23522,9 +24326,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23675,7 +24476,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23771,7 +24572,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24072,6 +24921,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24243,6 +25098,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,7 +25269,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25595,7 +26480,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25721,6 +26612,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,10 +26627,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,19 +26744,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26161,7 +27062,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26338,6 +27239,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] ""
msgstr[1] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27287,9 +28194,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27479,12 +28383,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27989,67 +28896,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28136,6 +29043,12 @@ 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 ""
@@ -28145,7 +29058,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ 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 ""
@@ -29076,12 +30004,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29112,10 +30046,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29157,7 +30091,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29574,6 +30505,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30382,10 +31325,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30735,6 +31675,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30756,10 +31699,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31308,6 +32266,12 @@ 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|Packages"
msgstr ""
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ 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 ""
@@ -31653,6 +32713,9 @@ 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 ""
@@ -31668,6 +32731,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ 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 ""
@@ -31752,6 +32824,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31912,9 +32990,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32032,6 +33107,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,10 +33847,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32832,9 +33943,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ 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 ""
@@ -33120,6 +34237,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33237,6 +34357,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33642,6 +34762,9 @@ 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 profile"
msgstr ""
@@ -33699,6 +34822,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 ""
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34215,6 +35350,9 @@ 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 ""
@@ -34354,6 +35492,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34698,7 +35836,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35128,6 +36272,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/de/gitlab.po b/locale/de/gitlab.po
index d68d95ba141..70db6168775 100644
--- a/locale/de/gitlab.po
+++ b/locale/de/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: de\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:57\n"
+"PO-Revision-Date: 2021-03-05 23:54\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -26,7 +26,7 @@ msgid " (from %{timeoutSource})"
msgstr " (von %{timeoutSource})"
msgid " Collected %{time}"
-msgstr ""
+msgstr " Gesammelt %{time}"
msgid " Please sign in."
msgstr " Bitte melde dich an."
@@ -60,13 +60,13 @@ msgid " or "
msgstr " oder "
msgid " or %{emphasisStart}!merge request id%{emphasisEnd}"
-msgstr ""
+msgstr " oder %{emphasisStart}!merge request id%{emphasisEnd}"
msgid " or %{emphasisStart}#issue id%{emphasisEnd}"
-msgstr ""
+msgstr " oder %{emphasisStart}#issue id%{emphasisEnd}"
msgid " or %{emphasisStart}&epic id%{emphasisEnd}"
-msgstr ""
+msgstr " oder %{emphasisStart}&epic id%{emphasisEnd}"
msgid " or references (e.g. path/to/project!merge_request_id)"
msgstr " oder Referenzen (z.B. Pfad/zum/Projekt!merge_request_id)"
@@ -74,13 +74,16 @@ msgstr " oder Referenzen (z.B. Pfad/zum/Projekt!merge_request_id)"
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr "\"%{path}\" existiert nicht auf \"%{ref}\""
-msgid "\"el\" parameter is required for createInstance()"
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
msgstr ""
+msgid "\"el\" parameter is required for createInstance()"
+msgstr "\"el\" Parameter wird für createInstance() benötigt"
+
msgid "%d Approval"
msgid_plural "%d Approvals"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Genehmigung"
+msgstr[1] "%d Genehmigungen"
msgid "%d Other"
msgid_plural "%d Others"
@@ -89,8 +92,8 @@ msgstr[1] ""
msgid "%d Package"
msgid_plural "%d Packages"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Paket"
+msgstr[1] "%d Pakete"
msgid "%d Scanned URL"
msgid_plural "%d Scanned URLs"
@@ -114,8 +117,8 @@ msgstr[1] ""
msgid "%d changed file"
msgid_plural "%d changed files"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d geänderte Datei"
+msgstr[1] "%d geänderte Dateien"
msgid "%d child epic"
msgid_plural "%d child epics"
@@ -170,15 +173,20 @@ msgid_plural "%d days"
msgstr[0] ""
msgstr[1] ""
-msgid "%d error"
-msgid_plural "%d errors"
+msgid "%d epic"
+msgid_plural "%d epics"
msgstr[0] ""
msgstr[1] ""
+msgid "%d error"
+msgid_plural "%d errors"
+msgstr[0] "%d Fehler"
+msgstr[1] "%d Fehler"
+
msgid "%d error found:"
msgid_plural "%d errors found:"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Fehler gefunden:"
+msgstr[1] "%d Fehler gefunden:"
msgid "%d exporter"
msgid_plural "%d exporters"
@@ -187,8 +195,8 @@ msgstr[1] "%d Exporter"
msgid "%d failed"
msgid_plural "%d failed"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d fehlgeschlagen"
+msgstr[1] "%d fehlgeschlagen"
msgid "%d failed security job"
msgid_plural "%d failed security jobs"
@@ -202,18 +210,18 @@ msgstr[1] "%d feste Testergebnisse"
msgid "%d group"
msgid_plural "%d groups"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Gruppe"
+msgstr[1] "%d Gruppen"
msgid "%d group selected"
msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Gruppe ausgewählt"
+msgstr[1] "%d Gruppen ausgewählt"
msgid "%d hour"
msgid_plural "%d hours"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Stunde"
+msgstr[1] "%d Stunden"
msgid "%d inaccessible merge request"
msgid_plural "%d inaccessible merge requests"
@@ -257,8 +265,8 @@ msgstr[1] "%d Metriken"
msgid "%d milestone"
msgid_plural "%d milestones"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Meilenstein"
+msgstr[1] "%d Meilensteine"
msgid "%d minute"
msgid_plural "%d minutes"
@@ -272,18 +280,18 @@ msgstr[1] "%d weiterere Kommentare"
msgid "%d open issue"
msgid_plural "%d open issues"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d offenes Ticket"
+msgstr[1] "%d offene Tickets"
msgid "%d pending comment"
msgid_plural "%d pending comments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d ausstehender Kommentar"
+msgstr[1] "%d ausstehende Kommentare"
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] ""
+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 previously merged commit"
msgid_plural "%d previously merged commits"
@@ -297,8 +305,8 @@ msgstr[1] "%d Projekte"
msgid "%d project selected"
msgid_plural "%d projects selected"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Projekt ausgewählt"
+msgstr[1] "%d Projekte ausgewählt"
msgid "%d request with warnings"
msgid_plural "%d requests with warnings"
@@ -327,8 +335,8 @@ msgstr[1] ""
msgid "%d unassigned issue"
msgid_plural "%d unassigned issues"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d nicht zugewiesenes Ticket"
+msgstr[1] "%d nicht zugewiesene Tickets"
msgid "%d unresolved thread"
msgid_plural "%d unresolved threads"
@@ -337,14 +345,19 @@ msgstr[1] "%d ungelöste Threads"
msgid "%d vulnerability"
msgid_plural "%d vulnerabilities"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Sicherheitslücke"
+msgstr[1] "%d Sicherheitslücken"
msgid "%d vulnerability dismissed"
msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ msgstr "%{edit_in_new_fork_notice} Versuche erneut, diesen Commit rückgängig z
msgid "%{edit_in_new_fork_notice} Try to upload a file again."
msgstr "%{edit_in_new_fork_notice} Versuche erneut, eine Datei hochzuladen."
+msgid "%{emailPrefix}@company.com"
+msgstr ""
+
msgid "%{extra} more downstream pipelines"
msgstr "%{extra} weitere Downstream-Pipelines"
@@ -522,7 +541,7 @@ msgid "%{group_name}&%{epic_iid} &middot; opened %{epic_created} by %{author}"
msgstr ""
msgid "%{hook_type} was deleted"
-msgstr ""
+msgstr "%{hook_type} wurde gelöscht"
msgid "%{hook_type} was scheduled for deletion"
msgstr ""
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr "%{name} enthielt %{resultsString}"
@@ -682,6 +710,15 @@ msgstr[1] ""
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr "%{number_commits_behind} Commits hinter %{default_branch}, %{number_commits_ahead} Commits voraus"
+msgid "%{oneMonthAgo} - %{today}"
+msgstr ""
+
+msgid "%{oneWeekAgo} - %{today}"
+msgstr ""
+
+msgid "%{oneYearAgo} - %{today}"
+msgstr ""
+
msgid "%{openOrClose} %{noteable}"
msgstr "%{openOrClose} %{noteable}"
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr "%{start} bis %{end}"
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -976,6 +1016,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr "(Keine Änderungen)"
@@ -988,9 +1031,6 @@ msgstr "(Fortschritt überprüfen)"
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1015,9 +1055,6 @@ msgstr "+ %{moreCount} weitere"
msgid "+ %{numberOfHiddenAssignees} more"
msgstr "+ %{numberOfHiddenAssignees} weitere"
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1111,6 +1148,11 @@ 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] "Eine Gruppe"
@@ -1162,6 +1204,9 @@ msgstr "1-9 Beiträge"
msgid "10-19 contributions"
msgstr "10-19 Beiträge"
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr "Erster Beitrag!"
@@ -1282,6 +1327,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr ""
msgid "API Token"
msgstr "API Token"
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr "AWS Zugangsschlüssel"
@@ -1635,9 +1779,6 @@ msgstr "GPG-Schlüssel hinzufügen"
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr "Füge eine Grafana-Schaltfläche in der Administrator-Menüleiste im Überwachungsbereich hinzu, um auf eine Vielzahl von Statistiken zum Zustand und zur Leistung von GitLab zuzugreifen."
-msgid "Add a To Do"
-msgstr "To-Do hinzufügen"
-
msgid "Add a bullet list"
msgstr "Aufzählungsliste hinzufügen"
@@ -1716,12 +1857,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr "E-Mail-Adresse hinzufügen"
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1818,6 +1965,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr "Keine Benutzer(innen) angegeben."
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr "Fügt ein Ticket zu einem Epic hinzu."
+msgid "Adds email participant(s)"
+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 ""
@@ -1938,6 +2103,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2058,6 +2226,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr "Lege eine instanzweite automatisch inkludierte %{link_start}Pipeline-Konfiguration%{link_end} fest. Diese Pipeline-Konfiguration wird nach der projekteigenen Konfiguration ausgeführt."
@@ -2091,6 +2268,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
msgstr "Gib eine Domain an, die standardmäßig für die Auto-Review-Anwendungen- und Auto-Bereitstsellungs-Phasen jedes Projekts verwendet werden soll."
+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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr "Die erforderliche Pipeline-Konfiguration kann aus dem Verzeichnis %{code_start}gitlab-ci%{code_end} im konfigurierten %{link_start}Instanz-Vorlagen-Repository%{link_end} oder aus den von GitLab bereitgestellten Konfigurationen ausgewählt werden."
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr "Aktiv"
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr "Admin"
@@ -2259,6 +2442,15 @@ 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 ""
@@ -2268,6 +2460,9 @@ msgstr "Das bist du!"
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr "Neue(r) Benutzer(in)"
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr "Diese(r) Benutzer(in) kann nicht auf Git-Repositories zugreifen"
@@ -2361,6 +2562,18 @@ msgstr "Benutzer(in) wird sich nicht anmelden können"
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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr "Wenn diese(r) Benutzer(in) sich wieder anmeldet, wird das Konto vollständig reaktiviert"
@@ -2394,6 +2607,21 @@ 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 ""
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr "Erweiterte Berechtigungen, Large File Storage und Einstellungen zur Zwei-Faktor-Authentifizierung."
@@ -2483,9 +2714,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2576,9 +2792,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,9 +2813,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,49 +2837,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,76 +2867,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
-msgstr ""
-
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,13 +2927,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr "Alarme"
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr "Alle Projekte"
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr "Alle Sicherheits-Scans sind aktiviert, weil %{linkStart}Auto DevOps%{linkEnd} in diesem Projekt aktiviert ist"
-
msgid "All threads resolved"
msgstr ""
@@ -2954,8 +3104,8 @@ msgstr "Anfragen an das lokale Netzwerk von Web-Hooks und Diensten erlauben"
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
-msgstr "Diesem Schlüssel auch erlauben, in das Repository zu pushen? (Normalerweise ist nur Pull-Zugriff erlaubt)"
+msgid "Allow this key to push to this repository"
+msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
@@ -2996,6 +3146,9 @@ msgstr "Ermöglicht dir das Hinzufügen und Verwalten von Kubernetes-Clustern."
msgid "Almost there"
msgstr "Fast geschafft"
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr "Es ist ein Fehler aufgetreten"
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr "Beim Hinzufügen eines Entwurfs zur Diskussion ist ein Fehler aufgetreten."
@@ -3146,12 +3293,18 @@ msgstr "Beim Ausblenden des Alarms ist ein Fehler aufgetreten. Aktualisiere die
msgid "An error occurred while dismissing the feature highlight. Refresh the page and try dismissing again."
msgstr "Beim Ausblenden des Feature-Highlights ist ein Fehler aufgetreten. Aktualisiere die Seite und versuche es erneut auszublenden."
+msgid "An error occurred while drawing job relationship links."
+msgstr ""
+
msgid "An error occurred while enabling Service Desk."
msgstr "Beim Aktivieren des Service-Desks ist ein Fehler aufgetreten."
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr "Beim Abrufen der Label-Farben ist ein Fehler aufgetreten."
msgid "An error occurred while fetching markdown preview"
msgstr "Beim Abrufen der Markdown-Vorschau ist ein Fehler aufgetreten"
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr "Beim Abrufen der ausstehenden Kommentare ist ein Fehler aufgetreten"
@@ -3269,6 +3425,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr "Beim Laden der Daten trat ein Fehler auf. Bitte versuche es erneut."
@@ -3296,12 +3455,18 @@ 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 "Beim Bearbeiten der Anfrage ist ein Fehler aufgetreten."
@@ -3344,8 +3509,11 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
-msgstr "Beim Speichern der Zuweisungen ist ein Fehler aufgetreten"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
+msgstr ""
msgid "An error occurred while subscribing to notifications."
msgstr "Beim Abonnieren von Benachrichtigungen ist ein Fehler aufgetreten."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3395,10 +3566,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr "Ein Fehler ist aufgetreten. Bitte versuche es erneut."
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3757,9 +3928,6 @@ msgstr "Möchtest du wirklich die Bearbeitung dieses Kommentars abbrechen?"
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3787,6 +3955,9 @@ 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 erase this build?"
msgstr "Bist du sicher, dass du diesen Build löschen möchtest?"
@@ -4048,12 +4219,6 @@ msgstr[1] "%d Dateien anhängen"
msgid "Attaching the file failed."
msgstr "Die Datei konnte nicht angehängt werden."
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr "Audit-Ereignisse"
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 "Bitbucket-Server-Import"
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr "Branch-Name"
msgid "Branch not loaded - %{branchId}"
msgstr "Branch nicht geladen - %{branchId}"
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr "Branches durchsuchen"
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr "Branch wechseln"
-
msgid "Branches"
msgstr "Branches"
@@ -4902,16 +5085,28 @@ msgstr "Parallelität von Massenanfragen"
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr "Business"
msgid "Business metrics (Custom)"
msgstr "Business-Metriken (benutzerdefiniert)"
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr "Standardmäßig versendet GitLab E-Mails in HTML- und Nur-Text-Formaten, sodass Mail-Clients das zu verwendende Format auswählen können. Deaktiviere diese Option, wenn E-Mails ausschließlich im Nur-Text-Format versendet werden sollen."
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr "Standardmäßig verwenden alle Projekte und Gruppen die globalen Einstellungen für Benachrichtigungen."
@@ -5028,6 +5235,26 @@ msgstr "CI/CD für externes Repo"
msgid "CI/CD settings"
msgstr "CI/CD-Einstellungen"
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr "Abbrechen"
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr "In dem Branch wählen"
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr "Im Branch wiederherstellen"
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr "Prüfe %{text} Verfügbarkeit…"
@@ -5688,7 +5915,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr "Wähle die übergeordnetste Gruppe für deine Repository-Importe."
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5703,6 +5930,9 @@ msgstr "Wähle welche Repositories du verbinden und die CI/CD-Pipelines ausführ
msgid "Choose your framework"
msgstr "Wähle dein Framework"
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr "abgebrochen"
@@ -6036,21 +6266,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr ""
msgid "Code"
msgstr "Code"
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr "Genehmigungsberechtigte ausblenden"
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7325,17 +7594,41 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr "%{source_branch} und %{target_branch} sind gleich."
-msgid "CompareBranches|Compare"
-msgstr "Vergleichen"
+msgid "CompareBranches|There isn't anything to compare."
+msgstr "Es gibt nichts zu vergleichen."
-msgid "CompareBranches|Source"
-msgstr "Quelle"
+msgid "CompareRevisions|Branches"
+msgstr ""
-msgid "CompareBranches|Target"
-msgstr "Ziel"
+msgid "CompareRevisions|Compare"
+msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
-msgstr "Es gibt nichts zu vergleichen."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
+msgstr ""
msgid "Complete"
msgstr "Abgeschlossen"
@@ -7349,6 +7642,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr "DSGVO"
@@ -7391,6 +7729,9 @@ msgstr "HIPAA"
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr "PCI-DSS"
@@ -7430,6 +7771,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr "Zeitüberschreitung für Gitaly konfigurieren."
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr "Let's Encrypt konfigurieren"
@@ -7451,6 +7795,9 @@ msgstr "Vorhandene Installation konfigurieren"
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr "Land"
@@ -8245,12 +8577,12 @@ msgstr ""
msgid "Create a merge request"
msgstr "Merge-Request erzeugen"
+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 "Erstelle einen neuen Branch"
-msgid "Create a new deploy key for this project"
-msgstr ""
-
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr "Branch erstellen"
@@ -8302,6 +8637,9 @@ msgstr "Datei erstellen"
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr "Gruppe erstellen"
@@ -8314,6 +8652,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr "Erstelle Listen anhand von Labels. Tickets mit diesem Label werden in dieser Liste angezeigt."
@@ -8329,6 +8670,12 @@ msgstr "Meilenstein erstellen"
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr ""
msgid "Credentials"
msgstr "Zugangsdaten"
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,14 +8991,14 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
-msgstr "Profil"
+msgid "CurrentUser|One of your groups is running out"
+msgstr ""
-msgid "CurrentUser|Settings"
-msgstr "Einstellungen"
+msgid "CurrentUser|Preferences"
+msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
@@ -8647,8 +9024,8 @@ msgstr ""
msgid "Custom notification events"
msgstr "Benutzerdefinierte Benachrichtigungsereignisse"
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
-msgstr "Benutzerdefinierte Benachrichtigungsstufen sind identisch mit den Beteiligungsstufen. Mit benutzerdefinierten Benachrichtigungsstufen erhältst du ebenfalls Mitteilungen für ausgewählte Ereignisse. Für weitere Informationen lies %{notification_link}."
+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 "Benutzerspezifische Projektvorlage"
@@ -8689,6 +9066,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr "Farben anpassen"
@@ -8722,6 +9102,18 @@ 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 ""
@@ -8886,7 +9278,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 "Daten werden noch berechnet..."
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr "Debug"
@@ -9261,9 +9682,6 @@ msgstr "Ablehnen und abmelden"
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr "Default-Branch"
-
msgid "Default CI configuration path"
msgstr ""
@@ -9318,6 +9736,9 @@ msgstr "Erstelle ein benutzerdefiniertes Muster mittels Cron-Syntax"
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr "verzögert"
msgid "Delete"
msgstr "Löschen"
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr "Diesen Anhang löschen"
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9429,6 +9856,15 @@ 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 "Gelöscht"
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
msgstr "Bereitstellen auf..."
+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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr "+%{count} andere"
@@ -9660,6 +10093,9 @@ msgstr "Fehler beim entfernen der Bereitstellungsschlüssel"
msgid "DeployKeys|Expand %{count} other projects"
msgstr "Erweitere %{count} andere Projekte"
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr "Lade Bereitstellungsschlüssel"
@@ -9678,9 +10114,6 @@ msgstr "Öffentlich zugängliche Bereitstellungsschlüssel"
msgid "DeployKeys|Read access only"
msgstr "Nur Lesezugriff"
-msgid "DeployKeys|Write access allowed"
-msgstr "Nur Schreibzugriff"
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr "Du bist dabei diesen Bereitstellungsschlüssel zu entfernen. Bist du sicher?"
@@ -9690,19 +10123,19 @@ msgstr "Aktive Bereitstellungstoken (%{active_tokens})"
msgid "DeployTokens|Add a deploy token"
msgstr "Bereitstellungstoken hinzufügen"
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
-msgstr "Ermöglicht schreibgeschützten Zugriff auf die Registry-Images"
+msgid "DeployTokens|Allows read-only access to registry images."
+msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
-msgstr "Ermöglicht schreibgeschützten Zugriff auf das Repository"
+msgid "DeployTokens|Allows read-only access to the repository."
+msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9717,12 +10150,9 @@ msgstr "Bereitstellungstoken erstellen"
msgid "DeployTokens|Created"
msgstr "Erstellt"
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
+msgid "DeployTokens|Deploy tokens"
msgstr ""
-msgid "DeployTokens|Deploy Tokens"
-msgstr "Bereitstellungstoken"
-
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
msgstr ""
@@ -9735,8 +10165,8 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr "Name"
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
-msgstr "Wähle einen Namen für die Anwendung und wir geben dir einen eindeutigen Bereitstellungstoken."
+msgid "DeployTokens|Pick a name for your unique deploy token."
+msgstr ""
msgid "DeployTokens|Revoke"
msgstr "Widerrufen"
@@ -9756,11 +10186,17 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr "Diese Aktion kann nicht rückgängig gemacht werden."
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
-msgstr "Verwende diesen Token als Kennwort. Stelle sicher, dass du ihn speicherst - du wirst später nicht mehr darauf zugreifen können."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
+msgstr ""
+
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+msgstr ""
-msgid "DeployTokens|Use this username as a login."
-msgstr "Verwende diesen Benutzernamen als Login."
+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 "Benutzername"
@@ -9768,8 +10204,8 @@ msgstr "Benutzername"
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
-msgstr "Dein neuer Bereitstellungstoken"
+msgid "DeployTokens|Your new Deploy Token username"
+msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
msgstr ""
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10047,18 +10482,6 @@ msgstr "Hostschlüssel erkennen"
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,7 +10710,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr "zurücksetzen"
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr "E-Mails"
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11048,20 +11468,14 @@ msgstr "Anzahl der Tickets eingeben"
msgid "Enter one or more user ID separated by commas"
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."
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the issue description"
-msgstr "Gib die Beschreibung des Tickets ein"
-
-msgid "Enter the issue title"
-msgstr "Gib den Titel des Tickets ein"
-
-msgid "Enter the merge request description"
-msgstr "Gib die Beschreibung des Merge-Requests ein"
+msgid "Enter the %{name} title"
+msgstr ""
-msgid "Enter the merge request title"
-msgstr "Gib den Titel des Merge-Requests ein"
+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 name of your application, and we'll return a unique %{type}."
msgstr ""
@@ -11345,6 +11759,9 @@ msgstr "geschützt"
msgid "Epic"
msgstr "Epic"
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr "Epic wurde nicht gefunden."
@@ -11369,6 +11786,12 @@ msgstr "Mit Epics kannst du deine Projekte effizienter und mit weniger Aufwand v
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 ""
@@ -11396,6 +11819,9 @@ msgstr "Wie kann ich dieses Problem lösen?"
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11423,6 +11849,9 @@ msgstr ""
msgid "Epics|Something went wrong while fetching child epics."
msgstr "Beim Abrufen untergeordneter Epics ist etwas schief gelaufen."
+msgid "Epics|Something went wrong while fetching epics list."
+msgstr ""
+
msgid "Epics|Something went wrong while fetching group epics."
msgstr ""
@@ -11447,9 +11876,6 @@ 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 "Um dein Epics %{epicDateType} basierend auf den Meilensteinen zu planen, weise einen Meilenstein mit einem %{epicDateType} einem beliebigen Ticket im Epic zu."
-msgid "Epics|Unable to perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr "Beweissammlung"
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr "Genehmigungsberechtigte anzeigen"
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11882,6 +12320,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11915,6 +12356,9 @@ msgstr "Erkunde öffentliche Gruppen"
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12038,10 +12482,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12068,6 +12512,12 @@ msgstr "Bereitstellung fehlgeschlagen für"
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 ""
@@ -12104,9 +12554,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,10 +12602,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr "Signieren mit Smartcard-Authentifizierung fehlgeschlagen"
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr "Tickets konnten nicht aktualisiert werden, bitte versuche es erneut."
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr "Feature Flags"
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr "FogBugz-Import"
msgid "Folder/%{name}"
msgstr "Ordner/%{name}"
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr "Schriftfarbe"
@@ -12826,6 +13279,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr "Fork von"
@@ -12856,8 +13345,8 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
-msgstr "Kostenlose Testversion von GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
+msgstr ""
msgid "Freeze end"
msgstr ""
@@ -12934,9 +13423,6 @@ msgstr "Geo"
msgid "Geo Nodes"
msgstr "Geo-Knoten"
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13096,6 +13585,9 @@ msgstr "%{name} ist für die erneute Synchronisierung vorgemerkt"
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13135,6 +13627,9 @@ msgstr "Tracking-Eintrag für ein vorhandenes Projekt konnte nicht entfernt werd
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr "Fehlgeschlagen"
@@ -13144,6 +13639,9 @@ msgstr "Nach Status filtern"
msgid "Geo|Geo Status"
msgstr "Geo-Status"
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr "Letzter Synchronisierungsversuch"
msgid "Geo|Last time verified"
msgstr "Zuletzt überprüft"
+msgid "Geo|Learn more about Geo"
+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 "Nie"
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr "Status"
@@ -13291,6 +13801,9 @@ msgstr "Überprüfung fehlgeschlagen - %{error}"
msgid "Geo|Waiting for scheduler"
msgstr "Warte auf den Scheduler"
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13330,6 +13840,9 @@ msgstr "Loslegen!"
msgid "Getting started with releases"
msgstr "Erste Schritte mit Releases"
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr "GitHub-Import"
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr "Diagramm"
@@ -13828,6 +14344,9 @@ msgstr "Gruppen-SAML muss zum Testen aktiviert sein"
msgid "Group URL"
msgstr "Gruppen-URL"
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr "Gruppenavatar"
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr "Nach Namen suchen"
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr "Archivierte Projekte ausblenden"
@@ -14630,6 +15164,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr ""
msgid "Import from Jira"
msgstr "Aus Jira importieren"
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15703,96 +16240,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16078,9 +16543,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ msgstr "Geschlossene Tickets"
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 ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ 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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16972,6 +17518,9 @@ msgstr "Labels können Tickets und Merge-Requests hinzugefügt werden, um diese
msgid "Labels can be applied to issues and merge requests."
msgstr "Labels können auf Tickets und Merge-Requests angewendet werden."
+msgid "Labels with no issues in this iteration:"
+msgstr ""
+
msgid "Labels|%{spanStart}Promote label%{spanEnd} %{labelTitle} %{spanStart}to Group Label?%{spanEnd}"
msgstr ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] "Letzten %d Tag"
msgstr[1] "Letzten %d Tage"
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17085,6 +17640,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17118,6 +17676,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17169,9 +17730,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr "Erfahre mehr in den"
@@ -17181,6 +17739,96 @@ msgstr "Pipelineplanungsdokumentation"
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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr "Verlassen"
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr "Erfahre mehr über Lizenzkonformität"
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr "Verfügbare Repositories auflisten"
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr "Maximale Zugriffsstufe"
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr "Maximalzahl an %{name}s (%{count}) überschritten"
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr "Merge-Request-Genehmigungen"
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr "Beim Hinzufügen des Kommentarentwurfs ist ein Fehler aufgetreten."
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr "Favoriten"
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr "Verschieben"
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr "Ticket verschieben"
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr "Neuer Branch"
@@ -19590,6 +20253,9 @@ msgstr ""
msgid "New directory"
msgstr "Neues Verzeichnis"
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr "Neues Label"
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr "Neuer Merge-Request"
@@ -19737,6 +20406,9 @@ msgstr "Keine Aktivitäten gefunden"
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr "Es konnte keine Verbindung zu einem Gitaly-Server hergestellt werden. Bitte überprüfe deine Protokolle!"
@@ -19788,6 +20466,9 @@ msgstr ""
msgid "No due date"
msgstr "Kein Fälligkeitsdatum"
+msgid "No email participants were added. Either none were provided, or they already exist."
+msgstr ""
+
msgid "No endpoint provided"
msgstr "Kein Endpunkt angegeben"
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr "Hinweis: Ãœberlege dir, deine(n) GitLab Administrator(in) zu bitten, ein
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr "Bist du sicher, dass du die Erstellung dieses Kommentars abbrechen möchtest?"
msgid "Notes|Collapse replies"
msgstr "Antworten reduzieren"
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr ""
msgid "Notification events"
msgstr "Benachrichtigungsereignisse"
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr "Merge-Request mergen"
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr "Teilnehmen"
msgid "NotificationLevel|Watch"
msgstr "Beobachten"
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr "Benachrichtigungen"
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ 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."
+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."
@@ -20552,7 +21257,7 @@ 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 Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr "Ups, bist du sicher?"
msgid "Open"
msgstr "Offen"
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20579,12 +21290,12 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
-msgstr "In Xcode öffnen"
-
msgid "Open in file view"
msgstr ""
+msgid "Open in your IDE"
+msgstr ""
+
msgid "Open issues"
msgstr ""
@@ -20651,6 +21362,9 @@ 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 "Optional"
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20762,6 +21473,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr "Pakete"
@@ -21077,6 +21809,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr "Ãœbergeordnet"
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21284,9 +22028,6 @@ msgstr "Zeitplan der Pipeline"
msgid "Pipeline Schedules"
msgstr "Zeitpläne der Pipeline"
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21308,10 +22049,10 @@ msgstr "Pipeline-Trigger"
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr "Pipelinediagramme"
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr "Pipelines des letzten Jahres"
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,12 +22154,12 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr "Runner-Caches löschen"
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
-msgstr "Kontinuierliche Integration (CI) kann dabei helfen, Fehler zu erkennen, indem es deine Tests automatisch ausführt. Kontinuierliche Bereitstellung (CD) wiederum kann dir helfen, Code für deine Produktumgebung bereitzustellen."
-
msgid "Pipelines|Copy trigger token"
msgstr ""
+msgid "Pipelines|Could not load merged YAML content"
+msgstr ""
+
msgid "Pipelines|Description"
msgstr ""
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-msgstr "Erste Schritte mit Pipelines"
-
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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr "Pipelines laden"
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr "Derzeit gibt es keine Pipelines."
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr "Beim Abrufen der Pipelines ist ein Fehler aufgetreten. Versuche es in einigen Augenblicken noch einmal oder wende dich an dein Support-Team."
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ msgstr ""
msgid "Pipeline|Pipeline"
msgstr "Pipeline"
+msgid "Pipeline|Pipeline %{idStart}#%{idEnd} %{statusStart}%{statusEnd} for %{commitStart}%{commitEnd}"
+msgstr ""
+
+msgid "Pipeline|Pipeline cannot be run."
+msgstr ""
+
msgid "Pipeline|Pipelines"
msgstr ""
@@ -21665,6 +22415,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr "Variabeln"
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr "Du bist dabei die Pipeline %{pipelineId} zu stoppen."
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ msgstr ""
msgid "Please select at least one filter to see results"
msgstr "Bitte wähle zumindest einen Filter um Ergebnisse zu sehen"
+msgid "Please select what should be included in each exported requirement."
+msgstr ""
+
msgid "Please set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr "Bitte löse das reCAPTCHA"
@@ -21923,21 +22685,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21959,6 +22739,12 @@ 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 ""
@@ -22067,6 +22853,9 @@ msgstr "Priorisiertes Label"
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 ""
@@ -22151,24 +22940,6 @@ msgstr "Profil"
msgid "Profile Settings"
msgstr "Profileinstellungen"
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22205,6 +22976,9 @@ msgstr "Schlüssel hinzufügen"
msgid "Profiles|Add status emoji"
msgstr "Füge Status-Emoji hinzu"
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr "Avatar zuschneiden"
@@ -22562,6 +23336,9 @@ msgstr "Projektdateien"
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr "Projekt-URL"
@@ -22790,10 +23567,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22805,7 +23579,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr "Badges"
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr "Kontaktiere eine(n) Administrator(in), um diese Einstellung zu ändern."
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,14 +23672,14 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
-msgstr "Verwaltet große Dateien wie Audio-, Video- und Grafikdateien"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
+msgstr ""
msgid "ProjectSettings|Merge checks"
msgstr ""
@@ -22937,13 +23714,16 @@ msgstr "Nur signierte Commits können zu diesem Repository gepusht werden."
msgid "ProjectSettings|Operations"
msgstr ""
+msgid "ProjectSettings|Override user notification preferences for all project members."
+msgstr ""
+
msgid "ProjectSettings|Packages"
msgstr ""
msgid "ProjectSettings|Pages"
msgstr ""
-msgid "ProjectSettings|Pages for project documentation"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22970,16 +23750,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,52 +23816,49 @@ msgstr "Diese Einstellung wird auf Serverebene angewendet, wurde aber für diese
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr "Diese Einstellung wird auf alle Projekte angewendet, sofern sie nicht von einem Admin überschrieben wird."
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr "Diese Einstellung überschreibt die Benachrichtigungseinstellungen für alle Projektmitglieder."
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer project"
msgstr ""
+msgid "ProjectSettings|Users can copy the repository to a new project."
+msgstr ""
+
msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr "Benutzer(innen) können nur Commits in dieses Repository pushen die mit einer ihrer eigenen verifizierten E-Mail-Adressen committet wurden."
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When conflicts arise 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 "Mit GitLab Pages kannst du deine statischen Webseiten auf GitLab hosten"
-
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr "Aktiv"
msgid "PrometheusService|Auto configuration"
msgstr "Automatische Konfiguration"
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
-msgstr "Konfiguriere und stelle Prometheus automatisch auf deinen Clustern bereit, um deine Projektumgebungen zu überwachen"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
+msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr "Allgemeine Metriken"
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr "Gemeinsame Metriken werden anhand einer Bibliothek von Metriken bekannter Exporter automatisch überwacht."
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr "Benutzerdefinierte Metriken"
@@ -23381,6 +24164,15 @@ msgstr "Metriken finden und konfigurieren..."
msgid "PrometheusService|Finding custom metrics..."
msgstr "Benutzerdefinierte Metriken werden gesucht..."
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr "Installiere Prometheus auf Clustern"
@@ -23396,6 +24188,12 @@ msgstr "Metriken"
msgid "PrometheusService|Missing environment variable"
msgstr "Fehlende Umgebungsvariable"
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr "Weitere Informationen"
@@ -23408,23 +24206,23 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
-msgstr "Prometheus-API-Basis-URL, wie http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgstr ""
+
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
-msgstr "Prometheus wird automatisch auf deinen Clustern verwaltet"
+msgid "PrometheusService|The Prometheus API base URL."
+msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+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 "Diese Metriken werden erst nach deiner ersten Bereitstellung in einer Umgebung überwacht"
-msgid "PrometheusService|Time-series monitoring service"
-msgstr "Zeitreihen-Monitoring-Service"
-
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
-msgstr "Deaktiviere unten die manuelle Konfiguration, um die Installation von Prometheus auf deinen Clustern zu ermöglichen"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
msgstr "Warte auf deine erste Bereitstellung in eine Umgebung, um allgemeine Metriken zu finden"
@@ -23432,6 +24230,12 @@ msgstr "Warte auf deine erste Bereitstellung in eine Umgebung, um allgemeine Met
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr "Hochstufen"
@@ -23522,9 +24326,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr "Upgrade-Plan"
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr "Geschützte Umgebungen"
-
msgid "Protected Paths"
msgstr ""
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23675,8 +24476,8 @@ msgstr "Deine Umgebung wurde geschützt."
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr "Der Schutz deiner Umgebung wurde aufgehoben"
-msgid "Protip:"
-msgstr "Protipp:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgstr ""
msgid "Protocol"
msgstr "Protokoll"
@@ -23771,8 +24572,50 @@ msgstr ""
msgid "Push to create a project"
msgstr "Pushe um ein Projekt zu erstellen"
-msgid "PushRule|Committer restriction"
-msgstr "Committer-Beschränkung"
+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 "Pushed"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24072,6 +24921,9 @@ msgstr "Versionshinweise:"
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24243,6 +25098,9 @@ msgstr "Stufe entfernen"
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,8 +25269,8 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr "Antworte direkt auf diese E-Mail oder %{view_it_on_gitlab}."
-msgid "Reply..."
-msgstr "Antworten..."
+msgid "Reply…"
+msgstr ""
msgid "Repo by URL"
msgstr "Repo via URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr "Aktionen"
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr "Klasse"
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr "Anfrage auf Zugriff"
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr "Merge-Requests durchsuchen"
@@ -25595,7 +26480,7 @@ msgstr "Secret"
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25721,6 +26612,12 @@ msgstr "Projekte hinzufügen"
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,10 +26627,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,19 +26744,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr "Branch/Tag auswählen"
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr "Wähle ein Projekt aus, um die Zone auszuwählen"
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26161,7 +27062,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26338,6 +27239,9 @@ msgstr "Lege ein Passwort für dein Konto fest, um mittels %{protocol} zu übert
msgid "Set a template repository for projects in this group"
msgstr "Lege ein Vorlagen-Repository für Projekte in dieser Gruppe fest"
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] "Zeige %d Ereignis"
msgstr[1] "Zeige %d Ereignisse"
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr "Etwas ist an unserem Ende schief gelaufen. Bitte versuche es erneut!"
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr "Etwas ist beim Ändern der Vertraulichkeit dieses Tickets fehlgeschlagen"
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr "Etwas ist beim Ändern des Sperrzustandes von %{issuableDisplayName} schief gelaufen"
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr "Etwas ist beim Auflösen der Diskussion fehlgeschlagen. Versuche es später nochmal."
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27287,9 +28194,6 @@ msgstr "Zuletzt angemeldet"
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr "Größe"
@@ -27479,12 +28383,15 @@ msgstr "Beginne einen %{new_merge_request} mit diesen Änderungen"
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 "Einen Review starten"
@@ -27989,67 +28896,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28136,6 +29043,12 @@ 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})"
@@ -28145,7 +29058,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr "Nutzungsbedingungen und Datenschutzerklärung"
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr "Die Staging-Phase stellt die Zeit zwischen dem Mergen des Merge-Requests
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ 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 ""
@@ -29076,12 +30004,18 @@ msgstr "Es gibt keine Tickets die angezeigt werden können"
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr "Es gibt noch keine Labels"
msgid "There are no matching files"
msgstr "Es gibt keine passenden Dateien"
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29112,10 +30046,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29157,7 +30091,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr "Beim Laden des Benutzeraktivitäts-Kalenders ist ein Fehler aufgetreten."
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr "Beim Speichern deiner Benachrichtigungseinstellungen ist ein Fehler aufgetreten."
-
msgid "There was an error subscribing to this label."
msgstr "Beim Abonnieren dieses Labels ist ein Fehler aufgetreten."
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29574,6 +30505,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr "Tipp:"
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr "Titel"
@@ -30382,12 +31325,12 @@ 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 widen your search, change or remove filters."
msgstr "Um deine Suche zu erweitern, verändere oder entferne Filter."
-msgid "To-Do"
-msgstr ""
-
msgid "To-Do List"
msgstr "To-Do-Liste"
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr "Toggle Status: OFF"
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr "Toggle Status: ON"
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr "Zu viele Namespaces aktiviert. Sie müssen sie über die Konsole oder di
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr "Zu viele Projekte aktviert. Sie müssen sie über die Konsole oder die API verwalten."
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr "Baumstrukturansicht"
msgid "Trending"
msgstr "Beliebt"
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr "Wiederholen"
@@ -30735,6 +31675,9 @@ msgstr "Teste für 30 Tage alles was GitLab zu bieten hat."
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30756,10 +31699,10 @@ msgstr "Dienstag"
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ msgstr ""
msgid "URL is required"
msgstr "URL erforderlich"
+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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr "Leider konnte deine E-Mail an GitLab nicht verarbeitet werden."
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31308,6 +32266,12 @@ 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|Packages"
msgstr ""
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr "Nutze den Service-Desk, um dich direkt in GitLab via E-Mail mit deinen Benutzer(inne)n zu verbinden (z. B. um Kunden-Support anzubieten)"
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr "Verwende eine Zeile pro URI"
msgid "Use template"
msgstr "Template verwenden"
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ msgstr "Profil bearbeiten"
msgid "UserProfile|Explore public groups to find projects to contribute to."
msgstr "Durchsuche öffentliche Gruppen, um Projekte zu finden, an denen Du mitwirken kannst."
+msgid "UserProfile|Followers"
+msgstr ""
+
+msgid "UserProfile|Following"
+msgstr ""
+
msgid "UserProfile|Groups"
msgstr "Gruppen"
@@ -31653,6 +32713,9 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr "Abonnieren"
+msgid "UserProfile|This user doesn't have any followers."
+msgstr ""
+
msgid "UserProfile|This user doesn't have any personal projects"
msgstr ""
@@ -31668,6 +32731,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr "Diese(r) Benutzer(in) ist blockiert"
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ msgstr "Alles anzeigen"
msgid "UserProfile|View user in admin area"
msgstr "Benutzer(in) im Adminbereich anzeigen"
+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 ""
@@ -31752,6 +32824,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr "Alle Tickets anzeigen"
@@ -31912,9 +32990,6 @@ msgstr "Zeige Datei @ "
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32032,6 +33107,9 @@ msgstr "Unbekannt"
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
+msgstr ""
+
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL must be percent-encoded if neccessary."
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,11 +33847,8 @@ msgstr "Seite löschen"
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr "Seite %{pageTitle} löschen?"
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr "Jemand hat die Seite zur selben Zeit wie du bearbeitet. Bitte überprüfe %{page_link} und stelle sicher, dass deine Änderungen nicht unbeabsichtigt deren Änderungen entfernen."
-
-msgid "WikiPageConflictMessage|the page"
-msgstr "die Seite"
+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 "WikiPageCreate|Create %{pageTitle}"
msgstr ""
@@ -32832,9 +33943,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ 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 ""
@@ -33120,6 +34237,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr "Du hast noch keine Abonnements"
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33237,6 +34357,9 @@ msgstr "Du hast keine Genehmigungsberechtigten hinzugefügt. Beginne, indem du B
msgid "You have reached your project limit"
msgstr "Du hast die Projektbegrenzung erreicht"
+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 a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33642,6 +34762,9 @@ 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 profile"
msgstr ""
@@ -33699,6 +34822,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 ""
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34215,6 +35350,9 @@ 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 ""
@@ -34354,6 +35492,9 @@ msgstr "ist keine Ihrer E-Mails"
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] "Merge-Request"
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr "Bitte stelle es wieder her, oder verwende einen anderen Branch %{missingBranchName}"
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr "%{link_start}Lerne mehr über das Lösen von Konflikten%{link_end}"
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr "Wenn der Branch %{missingBranchName} in deinem lokalen Repository vorhan
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr "Lade Bereitstellungsstatistiken"
@@ -34698,7 +35836,7 @@ msgstr "Die Änderungen wurden nicht gemerged nach"
msgid "mrWidget|The changes will be merged into"
msgstr "Die Änderungen werden gemerged nach"
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr "wird automatisch zusammengeführt, wenn die Pipeline erfolgreich ist"
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr "muss nach dem Anfangsdatum liegen"
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr "Keine"
msgid "not found"
msgstr "nicht gefunden"
-msgid "notification emails"
-msgstr "Benachrichtungs-E-mails"
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr "%{firstItem} und %{lastItem}"
@@ -35128,6 +36272,12 @@ msgstr "die folgenden Ticket(s)"
msgid "this document"
msgstr "dieses Dokument"
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr "ausgelöst"
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr "Unicode-Domains sollten IDNA-Kodierung verwenden"
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr "Benutzername"
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr "verwendet Kubernetes-Cluster, um deinen Code bereitzustellen!"
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/el_GR/gitlab.po b/locale/el_GR/gitlab.po
index a5e37cb573b..10bcaa73b05 100644
--- a/locale/el_GR/gitlab.po
+++ b/locale/el_GR/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: el\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:57\n"
+"PO-Revision-Date: 2021-03-05 23:55\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -170,6 +173,11 @@ 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] ""
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ 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 ""
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -682,6 +710,15 @@ 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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -976,6 +1016,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -988,9 +1031,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1015,9 +1055,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1111,6 +1148,11 @@ 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] ""
@@ -1162,6 +1204,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1282,6 +1327,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1635,9 +1779,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1716,12 +1857,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1818,6 +1965,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1938,6 +2103,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2058,6 +2226,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2091,6 +2268,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2259,6 +2442,15 @@ 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 ""
@@ -2268,6 +2460,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2361,6 +2562,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2394,6 +2607,21 @@ 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 ""
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2483,9 +2714,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2576,9 +2792,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,9 +2813,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,49 +2837,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,76 +2867,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,13 +2927,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2954,7 +3104,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2996,6 +3146,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3146,12 +3293,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3269,6 +3425,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3296,12 +3455,18 @@ 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 ""
@@ -3344,7 +3509,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3395,10 +3566,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3757,9 +3928,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3787,6 +3955,9 @@ 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 erase this build?"
msgstr ""
@@ -4048,12 +4219,6 @@ msgstr[1] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5028,6 +5235,26 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5688,7 +5915,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5703,6 +5930,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6036,21 +6266,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7325,16 +7594,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7349,6 +7642,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7391,6 +7729,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7430,6 +7771,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7451,6 +7795,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8245,10 +8577,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8302,6 +8637,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8314,6 +8652,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8329,6 +8670,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,13 +8991,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8647,7 +9024,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8689,6 +9066,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8722,6 +9102,18 @@ 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 ""
@@ -8886,7 +9278,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 ""
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9261,9 +9682,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9318,6 +9736,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9429,6 +9856,15 @@ 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 ""
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9660,6 +10093,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9678,9 +10114,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9690,19 +10123,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9717,10 +10150,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9735,7 +10165,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9756,10 +10186,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9768,7 +10204,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10047,18 +10482,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,7 +10710,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11048,19 +11468,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
-msgstr ""
-
-msgid "Enter the issue title"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11345,6 +11759,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11369,6 +11786,12 @@ 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 ""
@@ -11396,6 +11819,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11423,6 +11849,9 @@ 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 ""
@@ -11447,9 +11876,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11882,6 +12320,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11915,6 +12356,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12038,10 +12482,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12068,6 +12512,12 @@ 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 ""
@@ -12104,9 +12554,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,10 +12602,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12826,6 +13279,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12856,7 +13345,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12934,9 +13423,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13096,6 +13585,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13135,6 +13627,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13144,6 +13639,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13291,6 +13801,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13330,6 +13840,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13828,6 +14344,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14630,6 +15164,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15703,96 +16240,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16078,9 +16543,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ 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 ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ 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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16972,6 +17518,9 @@ 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 ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] ""
msgstr[1] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17085,6 +17640,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17118,6 +17676,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17169,9 +17730,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17181,6 +17739,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19590,6 +20253,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19737,6 +20406,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19788,6 +20466,9 @@ 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 ""
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ 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."
+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."
@@ -20552,7 +21257,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20579,10 +21290,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20651,6 +21362,9 @@ 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 ""
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20762,6 +21473,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21077,6 +21809,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21284,9 +22028,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21308,10 +22049,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,10 +22154,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ 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 ""
@@ -21665,6 +22415,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21923,21 +22685,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21959,6 +22739,12 @@ 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 ""
@@ -22067,6 +22853,9 @@ 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 ""
@@ -22151,24 +22940,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22205,6 +22976,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22562,6 +23336,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22790,10 +23567,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22805,7 +23579,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,13 +23672,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22937,13 +23714,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22970,16 +23750,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,52 +23816,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23381,6 +24164,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23396,6 +24188,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23408,22 +24206,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23432,6 +24230,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23522,9 +24326,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23675,7 +24476,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23771,7 +24572,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24072,6 +24921,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24243,6 +25098,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,7 +25269,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25595,7 +26480,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25721,6 +26612,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,10 +26627,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,19 +26744,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26161,7 +27062,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26338,6 +27239,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] ""
msgstr[1] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27287,9 +28194,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27479,12 +28383,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27989,67 +28896,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28136,6 +29043,12 @@ 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 ""
@@ -28145,7 +29058,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ 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 ""
@@ -29076,12 +30004,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29112,10 +30046,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29157,7 +30091,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29574,6 +30505,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30382,10 +31325,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30735,6 +31675,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30756,10 +31699,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31308,6 +32266,12 @@ 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|Packages"
msgstr ""
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ 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 ""
@@ -31653,6 +32713,9 @@ 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 ""
@@ -31668,6 +32731,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ 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 ""
@@ -31752,6 +32824,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31912,9 +32990,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32032,6 +33107,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,10 +33847,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32832,9 +33943,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ 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 ""
@@ -33120,6 +34237,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33237,6 +34357,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33642,6 +34762,9 @@ 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 profile"
msgstr ""
@@ -33699,6 +34822,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 ""
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34215,6 +35350,9 @@ 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 ""
@@ -34354,6 +35492,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34698,7 +35836,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35128,6 +36272,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/eo/gitlab.po b/locale/eo/gitlab.po
index 796f0b406d1..0a25375eb47 100644
--- a/locale/eo/gitlab.po
+++ b/locale/eo/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: eo\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:08\n"
+"PO-Revision-Date: 2021-03-05 23:50\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -170,6 +173,11 @@ 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] ""
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ 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 ""
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -682,6 +710,15 @@ 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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -976,6 +1016,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -988,9 +1031,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1015,9 +1055,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1111,6 +1148,11 @@ 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] ""
@@ -1162,6 +1204,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1282,6 +1327,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1635,9 +1779,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1716,12 +1857,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1818,6 +1965,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1938,6 +2103,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2058,6 +2226,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2091,6 +2268,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2259,6 +2442,15 @@ 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 ""
@@ -2268,6 +2460,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2361,6 +2562,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2394,6 +2607,21 @@ 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 ""
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2483,9 +2714,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2576,9 +2792,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,9 +2813,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,49 +2837,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,76 +2867,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
-msgstr ""
-
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,13 +2927,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2954,7 +3104,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2996,6 +3146,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3146,12 +3293,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3269,6 +3425,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3296,12 +3455,18 @@ 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 ""
@@ -3344,7 +3509,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3395,10 +3566,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3757,9 +3928,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3787,6 +3955,9 @@ 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 erase this build?"
msgstr ""
@@ -4048,12 +4219,6 @@ msgstr[1] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr "Serĉu branĉon"
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr "Iri al branĉo"
-
msgid "Branches"
msgstr "Branĉoj"
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5028,6 +5235,26 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr "Nuligi"
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr "Elekti en branĉon"
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr "Malfari en branĉo"
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5688,7 +5915,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5703,6 +5930,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr "nuligita"
@@ -6036,21 +6266,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7325,16 +7594,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7349,6 +7642,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7391,6 +7729,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7430,6 +7771,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7451,6 +7795,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8245,10 +8577,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8302,6 +8637,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8314,6 +8652,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8329,6 +8670,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,13 +8991,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8647,8 +9024,8 @@ msgstr ""
msgid "Custom notification events"
msgstr "Propraj sciigaj eventoj"
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
-msgstr "La propraj sciigaj niveloj estas la samaj kiel la niveloj de partoprenado. Uzante la proprajn sciigajn nivelojn, vi ricevos ankaÅ­ sciigojn por elektitaj de vi eventoj. Por lerni pli, bonvolu vidi %{notification_link}."
+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 ""
@@ -8689,6 +9066,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8722,6 +9102,18 @@ 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 ""
@@ -8886,7 +9278,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 ""
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9261,9 +9682,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9318,6 +9736,9 @@ msgstr "Difini propran Åablonon, uzante la sintakson de Cron"
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr ""
msgid "Delete"
msgstr "Forigi"
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9429,6 +9856,15 @@ 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 ""
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
-msgstr ""
-
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9660,6 +10093,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9678,9 +10114,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9690,19 +10123,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9717,10 +10150,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9735,7 +10165,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9756,10 +10186,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9768,7 +10204,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10047,18 +10482,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,7 +10710,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11048,19 +11468,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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."
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the issue description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the issue title"
-msgstr ""
-
-msgid "Enter the merge request description"
-msgstr ""
-
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11345,6 +11759,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11369,6 +11786,12 @@ 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 ""
@@ -11396,6 +11819,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11423,6 +11849,9 @@ 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 ""
@@ -11447,9 +11876,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11882,6 +12320,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11915,6 +12356,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12038,10 +12482,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12068,6 +12512,12 @@ 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 ""
@@ -12104,9 +12554,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,10 +12602,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12826,6 +13279,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr "Disbranĉigita el"
@@ -12856,7 +13345,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12934,9 +13423,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13096,6 +13585,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13135,6 +13627,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13144,6 +13639,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13291,6 +13801,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13330,6 +13840,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13828,6 +14344,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14630,6 +15164,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15703,96 +16240,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16078,9 +16543,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ 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 ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ 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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16972,6 +17518,9 @@ 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 ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] "La lasta %d tago"
msgstr[1] "La lastaj %d tagoj"
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17085,6 +17640,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17118,6 +17676,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17169,9 +17730,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr "Lernu pli en la"
@@ -17181,6 +17739,96 @@ msgstr "dokumentado pri ĉenstablaj planoj"
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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr "Nova branĉo"
@@ -19590,6 +20253,9 @@ msgstr ""
msgid "New directory"
msgstr "Nova dosierujo"
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr "Nova peto pri kunfando"
@@ -19737,6 +20406,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19788,6 +20466,9 @@ 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 ""
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr ""
msgid "Notification events"
msgstr "Sciigaj eventoj"
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr "Apliki peton pri kunfando"
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr "Partoprenado"
msgid "NotificationLevel|Watch"
msgstr "Rigardado"
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ 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."
+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."
@@ -20552,7 +21257,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20579,10 +21290,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20651,6 +21362,9 @@ 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 ""
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20762,6 +21473,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21077,6 +21809,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21284,9 +22028,6 @@ msgstr "Ĉenstabla plano"
msgid "Pipeline Schedules"
msgstr "Ĉenstablaj planoj"
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21308,10 +22049,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr "Ĉenstablaj diagramoj"
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,10 +22154,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ 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 ""
@@ -21665,6 +22415,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21923,21 +22685,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21959,6 +22739,12 @@ 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 ""
@@ -22067,6 +22853,9 @@ 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 ""
@@ -22151,24 +22940,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22205,6 +22976,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22562,6 +23336,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22790,10 +23567,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22805,7 +23579,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,13 +23672,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22937,13 +23714,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22970,16 +23750,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,52 +23816,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23381,6 +24164,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23396,6 +24188,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23408,22 +24206,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23432,6 +24230,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23522,9 +24326,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23675,7 +24476,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23771,7 +24572,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24072,6 +24921,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24243,6 +25098,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,7 +25269,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr "Peti atingeblon"
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25595,7 +26480,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25721,6 +26612,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,10 +26627,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,19 +26744,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26161,7 +27062,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26338,6 +27239,9 @@ msgstr "Kreu pasvorton por via konto por ebligi al vi eltiri kaj alpuÅi per %{p
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] "Estas montrata %d evento"
msgstr[1] "Estas montrataj %d eventoj"
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27287,9 +28194,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27479,12 +28383,15 @@ msgstr "Kreu %{new_merge_request} kun ĉi tiuj ÅanÄoj"
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27989,67 +28896,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28136,6 +29043,12 @@ 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 ""
@@ -28145,7 +29058,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr "La etapo de preparo por eldono montras la tempon inter la aplikado de la
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ 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 ""
@@ -29076,12 +30004,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29112,10 +30046,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29157,7 +30091,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29574,6 +30505,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30382,10 +31325,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30735,6 +31675,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30756,10 +31699,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31308,6 +32266,12 @@ 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|Packages"
msgstr ""
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ 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 ""
@@ -31653,6 +32713,9 @@ 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 ""
@@ -31668,6 +32731,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ 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 ""
@@ -31752,6 +32824,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31912,9 +32990,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32032,6 +33107,9 @@ msgstr "Nekonata"
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,10 +33847,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32832,9 +33943,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ 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 ""
@@ -33120,6 +34237,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33237,6 +34357,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr "Vi ne povas krei pliajn projektojn"
+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 a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33642,6 +34762,9 @@ 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 profile"
msgstr ""
@@ -33699,6 +34822,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 ""
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34215,6 +35350,9 @@ 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 ""
@@ -34354,6 +35492,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34698,7 +35836,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr "sciigoj per retpoÅto"
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35128,6 +36272,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/es/gitlab.po b/locale/es/gitlab.po
index f653d1e8a31..9e08d2ed33c 100644
--- a/locale/es/gitlab.po
+++ b/locale/es/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: es-ES\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:55\n"
+"PO-Revision-Date: 2021-03-05 23:53\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr " o referencias (e.j. path/to/project!merge_request_id)"
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr "\"%{path}\" no existía en \"%{ref}\""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -84,13 +87,13 @@ msgstr[1] ""
msgid "%d Other"
msgid_plural "%d Others"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Otro"
+msgstr[1] "%d Otros"
msgid "%d Package"
msgid_plural "%d Packages"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d paquete"
+msgstr[1] "%d paquetes"
msgid "%d Scanned URL"
msgid_plural "%d Scanned URLs"
@@ -157,8 +160,8 @@ msgstr "%d commits"
msgid "%d completed issue"
msgid_plural "%d completed issues"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d incidencia completada"
+msgstr[1] "%d incidencias completadas"
msgid "%d contribution"
msgid_plural "%d contributions"
@@ -170,6 +173,11 @@ msgid_plural "%d days"
msgstr[0] "%d día"
msgstr[1] "%d días"
+msgid "%d epic"
+msgid_plural "%d epics"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d error"
msgid_plural "%d errors"
msgstr[0] "%d error"
@@ -177,8 +185,8 @@ msgstr[1] "%d errores"
msgid "%d error found:"
msgid_plural "%d errors found:"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d error encontrado:"
+msgstr[1] "%d errores encontrados:"
msgid "%d exporter"
msgid_plural "%d exporters"
@@ -297,8 +305,8 @@ msgstr[1] "%d proyectos"
msgid "%d project selected"
msgid_plural "%d projects selected"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d proyecto seleccionado"
+msgstr[1] "%d proyectos seleccionados"
msgid "%d request with warnings"
msgid_plural "%d requests with warnings"
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] "%d vulnerabilidad descartada"
msgstr[1] "%d vulnerabilidades descartadas"
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] "%d advertencia encontrada:"
@@ -377,7 +390,7 @@ msgid "%{authorsName}'s thread"
msgstr "Hilo de %{authorsName}"
msgid "%{board_target} not found"
-msgstr ""
+msgstr "%{board_target} no encontrado"
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -401,7 +414,7 @@ msgid "%{cores} cores"
msgstr "%{cores} núcleos"
msgid "%{count} %{scope} for term '%{term}'"
-msgstr ""
+msgstr "%{count} %{scope} para el término '%{term}"
msgid "%{count} LOC/commit"
msgstr "%{count} LOC/commit"
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] "%{count} incidencias seleccionadas"
msgstr[1] "%{count} incidencias seleccionadas"
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -477,7 +493,7 @@ msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
msgid "%{due_date} (Past due)"
-msgstr ""
+msgstr "%{due_date} (vencido)"
msgid "%{duration}ms"
msgstr "%{duration}ms"
@@ -494,6 +510,9 @@ msgstr "%{edit_in_new_fork_notice} Intentar revertir este commit otra vez."
msgid "%{edit_in_new_fork_notice} Try to upload a file again."
msgstr "%{edit_in_new_fork_notice} Intente subir un archivo de nuevo."
+msgid "%{emailPrefix}@company.com"
+msgstr ""
+
msgid "%{extra} more downstream pipelines"
msgstr ""
@@ -513,7 +532,7 @@ msgid "%{group_docs_link_start}Groups%{group_docs_link_end} allow you to manage
msgstr "Los %{group_docs_link_start}Grupos%{group_docs_link_end} le permiten administrar y colaborar en múltiples proyectos. Los miembros de un grupo tienen acceso a todos sus proyectos."
msgid "%{group_name} group members"
-msgstr ""
+msgstr "miembros del grupo %{group_name}"
msgid "%{group_name} uses group managed accounts. You need to create a new GitLab account which will be managed by %{group_name}."
msgstr "%{group_name} utiliza cuentas administradas de grupo. Debe crear una nueva cuenta de GitLab que será administrada por %{group_name}."
@@ -522,10 +541,10 @@ msgid "%{group_name}&%{epic_iid} &middot; opened %{epic_created} by %{author}"
msgstr ""
msgid "%{hook_type} was deleted"
-msgstr ""
+msgstr "%{hook_type} eliminado"
msgid "%{hook_type} was scheduled for deletion"
-msgstr ""
+msgstr "Se ha programado %{hook_type} para su eliminación"
msgid "%{host} sign-in from new location"
msgstr "%{host} inicia sesión desde una nueva ubicación"
@@ -537,7 +556,7 @@ msgid "%{issuableType} will be removed! Are you sure?"
msgstr "¡Va a eliminar %{issuableType}! ¿Está seguro de que desea realizar esta acción?"
msgid "%{issueType} actions"
-msgstr ""
+msgstr "%{issueType} acciones"
msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
msgstr ""
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -636,13 +658,13 @@ msgid "%{message} showing first %{warnings_displayed}"
msgstr ""
msgid "%{milestone_name} (Past due)"
-msgstr ""
+msgstr "%{milestone_name} (vencido)"
msgid "%{milestone} (expired)"
-msgstr ""
+msgstr "%{milestone} (expirado)"
msgid "%{milliseconds}ms"
-msgstr ""
+msgstr "%{milliseconds} ms"
msgid "%{mrText}, this issue will be closed automatically."
msgstr "%{mrText}, esta incidencia se cerrará automáticamente."
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr "%{name} contenido en %{resultsString}"
@@ -682,6 +710,15 @@ msgstr[1] "%{no_of_days} días"
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr "%{number_commits_behind} commits detrás de %{default_branch}, %{number_commits_ahead} commits por delante"
+msgid "%{oneMonthAgo} - %{today}"
+msgstr ""
+
+msgid "%{oneWeekAgo} - %{today}"
+msgstr ""
+
+msgid "%{oneYearAgo} - %{today}"
+msgstr ""
+
msgid "%{openOrClose} %{noteable}"
msgstr "%{openOrClose} %{noteable}"
@@ -721,7 +758,7 @@ msgid "%{remaining_approvals} left"
msgstr "quedan %{remaining_approvals} "
msgid "%{reportType} %{status}"
-msgstr ""
+msgstr "%{reportType} %{status}"
msgid "%{reportType} detected %{totalStart}%{total}%{totalEnd} potential %{vulnMessage}"
msgstr ""
@@ -729,14 +766,11 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
msgid "%{seconds}s"
-msgstr ""
+msgstr "%{seconds} s"
msgid "%{securityScanner} is not enabled for this project. %{linkStart}More information%{linkEnd}"
msgid_plural "%{securityScanner} are not enabled for this project. %{linkStart}More information%{linkEnd}"
@@ -775,6 +809,9 @@ msgstr "%{spanStart}en la línea%{spanEnd} %{errorLine}%{errorColumn}"
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr "%{spanStart}en%{spanEnd} %{errorFn}"
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr "%{start} hasta %{end}"
@@ -861,7 +898,7 @@ msgid "%{timebox_type} does not support burnup charts"
msgstr ""
msgid "%{timebox_type} must have a start and due date"
-msgstr ""
+msgstr "%{timebox_type} requiere una fecha de inicio y de vencimiento"
msgid "%{title} %{operator} %{threshold}"
msgstr "%{title} %{operator} %{threshold}"
@@ -882,13 +919,13 @@ msgid "%{totalWeight} total weight"
msgstr "%{totalWeight} peso total"
msgid "%{total_warnings} warning(s) found:"
-msgstr ""
+msgstr "%{total_warnings} advertencias encontradas:"
msgid "%{total} open issue weight"
msgstr "%{total} incidencias abiertas"
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
-msgstr ""
+msgstr "%{total} advertencias encontradas: mostrando la primera %{warningsDisplayed}"
msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
msgstr "%{usage_ping_link_start}Más información%{usage_ping_link_end} acerca de lo que se comparte en GitLab Inc."
@@ -903,7 +940,7 @@ msgid "%{user_name} profile page"
msgstr "%{user_name} página de perfil"
msgid "%{username} has asked for a GitLab account on your instance %{host}:"
-msgstr ""
+msgstr "%{username} ha solicitado una cuenta de GitLab en su instancia %{host}:"
msgid "%{username}'s avatar"
msgstr "Avatar de %{username}"
@@ -924,25 +961,25 @@ msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_
msgstr ""
msgid "&lt; 1 hour"
-msgstr ""
+msgstr "&lt; 1 hora"
msgid "'%{data}' at %{location} does not match format: %{format}"
-msgstr ""
+msgstr "'%{data}' en %{location} no coincide con el formato: %{format}"
msgid "'%{data}' at %{location} does not match pattern: %{pattern}"
-msgstr ""
+msgstr "'%{data}' en %{location} no coincide con el formato: %{pattern}"
msgid "'%{data}' at %{location} is invalid: error_type=%{type}"
-msgstr ""
+msgstr "'%{data}' en %{location} no es válido: error_type=%{type}"
msgid "'%{data}' at %{location} is not of type: %{type}"
-msgstr ""
+msgstr "'%{data}' en %{location} no es de tipo: %{type}"
msgid "'%{data}' at %{location} is not one of: %{enum}"
-msgstr ""
+msgstr "'%{data}' en %{location} no es uno de: %{enum}"
msgid "'%{data}' at %{location} is not: %{const}"
-msgstr ""
+msgstr "'%{data}' en %{location} no es: %{const}"
msgid "'%{level}' is not a valid visibility level"
msgstr "'%{level}' no es un nivel de visibilidad válido"
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr "La etapa '%{name}' ya existe"
@@ -971,16 +1011,19 @@ msgid "(%{mrCount} merged)"
msgstr "(%{mrCount} fusionado)"
msgid "(%{value}) has already been taken"
-msgstr ""
+msgstr "(%{value}) ya está en uso"
msgid "(+%{count}&nbsp;rules)"
+msgstr "(+%{count}&nbsp;reglas)"
+
+msgid "(Group Managed Account)"
msgstr ""
msgid "(No changes)"
msgstr "(Sin cambios)"
msgid "(UTC %{offset}) %{timezone}"
-msgstr ""
+msgstr "(UTC %{offset}) %{timezone}"
msgid "(check progress)"
msgstr "(comprobar el progreso)"
@@ -988,9 +1031,6 @@ msgstr "(comprobar el progreso)"
msgid "(deleted)"
msgstr "(eliminado)"
-msgid "(line: %{startLine})"
-msgstr "(línea: %{startLine})"
-
msgid "(max size 15 MB)"
msgstr "(tamaño máximo 15 MB)"
@@ -1015,28 +1055,25 @@ msgstr "+ %{moreCount} más"
msgid "+ %{numberOfHiddenAssignees} more"
msgstr "+ %{numberOfHiddenAssignees} más"
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] "+%d más"
msgstr[1] "+%d más"
msgid "+%{approvers} more approvers"
-msgstr ""
+msgstr "+%{approvers} aprobadores más"
msgid "+%{more_assignees_count}"
-msgstr ""
+msgstr "+%{more_assignees_count}"
msgid "+%{more_assignees_count} more assignees"
-msgstr ""
+msgstr "+%{more_assignees_count} asignados más"
msgid "+%{more_reviewers_count}"
-msgstr ""
+msgstr "+%{more_reviewers_count}"
msgid "+%{more_reviewers_count} more reviewers"
-msgstr ""
+msgstr "+%{more_reviewers_count} revisores más"
msgid "+%{tags} more"
msgstr "+%{tags} más"
@@ -1045,7 +1082,7 @@ msgid ", or "
msgstr ", o "
msgid "- Available to run jobs."
-msgstr ""
+msgstr "- Disponible para ejecutar trabajos."
msgid "- Event"
msgid_plural "- Events"
@@ -1053,7 +1090,7 @@ msgstr[0] "- Evento"
msgstr[1] "- Eventos"
msgid "- Not available to run jobs."
-msgstr ""
+msgstr "- No disponible para ejecutar trabajos."
msgid "- User"
msgid_plural "- Users"
@@ -1061,13 +1098,13 @@ msgstr[0] "- Usuario"
msgstr[1] "- Usuarios"
msgid "- of - weight completed"
-msgstr ""
+msgstr "- de - peso completado"
msgid "- show less"
msgstr "- mostrar menos"
msgid "."
-msgstr ""
+msgstr "."
msgid "0 bytes"
msgstr "0 bytes"
@@ -1111,6 +1148,11 @@ msgid_plural "%d deploy keys"
msgstr[0] "1 clave de despliegue"
msgstr[1] "%d claves de despliegue"
+msgid "1 follower"
+msgid_plural "%{count} followers"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 group"
msgid_plural "%d groups"
msgstr[0] "1 grupo"
@@ -1162,6 +1204,9 @@ msgstr "1-9 contribuciones"
msgid "10-19 contributions"
msgstr "10-19 contribuciones"
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr "¡1ra contribución!"
@@ -1181,7 +1226,7 @@ msgid "3 hours"
msgstr "3 horas"
msgid "30 days"
-msgstr ""
+msgstr "30 días"
msgid "30 minutes"
msgstr "30 minutos"
@@ -1205,13 +1250,13 @@ msgid "404|Please contact your GitLab administrator if you think this is a mista
msgstr "Por favor, contacte con su administrador de GitLab si cree que se trata de un error."
msgid "7 days"
-msgstr ""
+msgstr "7 días"
msgid "8 hours"
msgstr "8 horas"
msgid ":%{startLine} to %{endLine}"
-msgstr ""
+msgstr ":%{startLine} a %{endLine}"
msgid "A %{incident_docs_start}modified issue%{incident_docs_end} to guide the resolution of incidents."
msgstr ""
@@ -1282,6 +1327,9 @@ msgstr "Un grupo representa a su organización en GitLab. Los grupos que le perm
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1358,10 +1406,10 @@ msgid "A string appended to the project path to form the Service Desk email addr
msgstr ""
msgid "A title is required"
-msgstr ""
+msgstr "Se requiere un título"
msgid "A user can only participate in a rotation once"
-msgstr ""
+msgstr "Un usuario sólo puede participar en una rotación una vez"
msgid "A user with write access to the source branch selected this option"
msgstr "Un usuario con acceso de escritura a la rama origen seleccionó esta opción"
@@ -1381,6 +1429,102 @@ msgstr "Ayuda de la API"
msgid "API Token"
msgstr "Token del API"
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr "AWS Access Key"
@@ -1394,7 +1538,7 @@ msgid "AWS Secret Access Key. Only required if not using role instance credentia
msgstr ""
msgid "AWS service error: %{error}"
-msgstr ""
+msgstr "Error de servicio de AWS: %{error}"
msgid "Abort"
msgstr "Cancelar"
@@ -1635,9 +1779,6 @@ msgstr "Añadir una clave GPG"
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr "Agrega un botón de Grafana en la sección de monitorización que se encuentra en el menú de administración, para poder acceder a una variedad de estadísticas sobre el estado y el rendimiento de GitLab."
-msgid "Add a To Do"
-msgstr "Añadir a tareas pendientes"
-
msgid "Add a bullet list"
msgstr "Añadir una lista de viñetas"
@@ -1716,12 +1857,18 @@ 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 domain"
msgstr "Añadir dominio"
msgid "Add email address"
msgstr "Añadir dirección de correo electrónico"
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr "Añadir entorno"
@@ -1741,7 +1888,7 @@ msgid "Add italic text"
msgstr "Añadir texto en cursiva"
msgid "Add key"
-msgstr ""
+msgstr "Añadir clave"
msgid "Add label(s)"
msgstr "Añadir etiqueta(s)"
@@ -1816,6 +1963,21 @@ msgid "AddContextCommits|Add previously merged commits"
msgstr ""
msgid "AddContextCommits|Add/remove"
+msgstr "Añadir/eliminar"
+
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
msgstr ""
msgid "AddMember|No users specified."
@@ -1878,6 +2040,9 @@ msgstr "Añade una tarea pendiente."
msgid "Adds an issue to an epic."
msgstr "Agregar una incidencia a una tarea épica."
+msgid "Adds email participant(s)"
+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 ""
@@ -1906,7 +2071,7 @@ msgid "Admin mode enabled"
msgstr "Modo administrador habilitado"
msgid "Admin navigation"
-msgstr ""
+msgstr "Navegación de administrador"
msgid "Admin notes"
msgstr "Notas del administrador"
@@ -1936,6 +2101,9 @@ msgid "AdminArea|Developer"
msgstr "Desarrollador"
msgid "AdminArea|Features"
+msgstr "Características"
+
+msgid "AdminArea|Groups"
msgstr ""
msgid "AdminArea|Guest"
@@ -2058,6 +2226,12 @@ msgstr "Ir a los ajustes generales"
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr "Las integraciones configuradas aquí se aplicarán automáticamente a todos los proyectos en esta instancia."
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr "Movido a integraciones"
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr "La plantilla de servicio le permite configurar los valores predeterminados para las integraciones"
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2091,6 +2268,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
msgstr "Especifique un dominio para utilizar por defecto durante las etapas despliegue automático de cada proyecto y las de los mismos."
+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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr "Activo"
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr "Admin"
@@ -2259,6 +2442,15 @@ 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 "Está utilizando un asiento"
@@ -2266,6 +2458,9 @@ msgid "AdminUsers|It's you!"
msgstr "¡Es usted!"
msgid "AdminUsers|Log in"
+msgstr "AdminUsers|Iniciar sesión"
+
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
msgstr ""
msgid "AdminUsers|New user"
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr "El usuario no podrá acceder a los repositorios git"
@@ -2361,6 +2562,18 @@ msgstr "El usuario no podrá iniciar sesión"
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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr "Cuando el usuario vuelve a iniciar sesión, su cuenta se activará como una cuenta totalmente activa"
@@ -2394,6 +2607,21 @@ 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 "‫Administración"
@@ -2410,14 +2638,17 @@ msgid "Advanced"
msgstr "Avanzado"
msgid "Advanced Search"
-msgstr ""
+msgstr "Búsqueda Avanzada"
msgid "Advanced Search with Elasticsearch"
-msgstr ""
+msgstr "Búsqueda avanzada con Elasticsearch"
msgid "Advanced Settings"
msgstr "Configuración avanzada"
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr "Permisos avanzados, almacenamiento de grandes archivos y configuraciones de autenticación de dos factores."
@@ -2428,7 +2659,7 @@ msgid "After a successful password update, you will be redirected to the login p
msgstr "Después de una actualización correcta de la contraseña, se le redirigirá a la página de inicio de sesión donde podrá iniciar sesión con su nueva contraseña."
msgid "After sign-out path"
-msgstr ""
+msgstr "Después de cerrar sesión"
msgid "After that, you will not be able to use merge approvals or code quality as well as many other features."
msgstr ""
@@ -2483,9 +2714,6 @@ msgstr "Autorizar un servicio externo"
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-msgstr "Crítico"
-
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 ""
@@ -2493,31 +2721,19 @@ msgid "AlertManagement|Edit"
msgstr "Editar"
msgid "AlertManagement|Environment"
-msgstr ""
+msgstr "AlertManagement|Entorno"
msgid "AlertManagement|Events"
msgstr "Eventos"
-msgid "AlertManagement|High"
-msgstr "Alta"
-
msgid "AlertManagement|Incident"
msgstr "Incidente"
-msgid "AlertManagement|Info"
-msgstr "Información"
-
msgid "AlertManagement|Key"
-msgstr ""
-
-msgid "AlertManagement|Low"
-msgstr "Bajo"
-
-msgid "AlertManagement|Medium"
-msgstr "Medio"
+msgstr "AlertManagement|Clave"
msgid "AlertManagement|Metrics"
-msgstr ""
+msgstr "AlertManagement|Métricas"
msgid "AlertManagement|Metrics weren't available in the alerts payload."
msgstr ""
@@ -2576,9 +2792,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,14 +2813,11 @@ msgstr "Herramienta"
msgid "AlertManagement|Triggered"
msgstr "Activado"
-msgid "AlertManagement|Unknown"
-msgstr "Desconocido"
-
msgid "AlertManagement|Value"
msgstr "Valor"
msgid "AlertManagement|View incident"
-msgstr ""
+msgstr "AlertManagement|Ver incidente"
msgid "AlertMappingBuilder|Define fallback"
msgstr ""
@@ -2624,50 +2837,17 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr "1. Seleccione el tipo de integración"
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr "URL del API"
-
-msgid "AlertSettings|Active"
-msgstr "Activo"
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr "Clave de autorización"
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
-msgstr "La clave de autorización se ha restablecido correctamente. Por favor, guarde los cambios ahora."
+msgid "AlertSettings|Configure details"
+msgstr ""
-msgid "AlertSettings|Copy"
-msgstr "Copiar"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
+msgstr ""
msgid "AlertSettings|Delete integration"
msgstr ""
@@ -2676,10 +2856,7 @@ msgid "AlertSettings|Edit payload"
msgstr ""
msgid "AlertSettings|Enter integration name"
-msgstr ""
-
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
+msgstr "Ajustes de Alertas|Introduce tu nombre de integración"
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,38 +2867,32 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
-msgstr ""
-
-msgid "AlertSettings|Reset key"
-msgstr ""
+msgstr "Restablecer clave"
msgid "AlertSettings|Reset the mapping"
msgstr ""
@@ -2729,37 +2900,22 @@ msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
-msgstr ""
+msgstr "Guardar integración"
msgid "AlertSettings|Select integration type"
-msgstr ""
-
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
-msgstr ""
+msgstr "Seleccionar tipo de integración"
-msgid "AlertSettings|There was an error updating the alert settings."
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,15 +2927,15 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
+msgid "AlertSettings|View credentials"
+msgstr ""
+
msgid "AlertSettings|Webhook URL"
msgstr "AlertSettings|URL del webhook"
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|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
msgid "AlertSettings|Your integration was successfully updated."
msgstr ""
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr "Alertas"
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr "Integraciones actuales"
msgid "AlertsIntegrations|Integration Name"
msgstr "Nombre de integración"
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr "Todos los proyectos"
msgid "All projects selected"
msgstr "Todos los proyectos seleccionados"
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr "Todas las exploraciones de seguridad están habilitadas porque %{linkStart}Auto DevOps%{linkEnd} está habilitado en este proyecto"
-
msgid "All threads resolved"
msgstr "Todos los hilos resueltos"
@@ -2954,8 +3104,8 @@ msgstr "Permitir solicitudes a la red local desde web hooks y servicios"
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr "Permitir que los subgrupos configuren sus propias reglas de autenticación de dos factores"
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
-msgstr "¿Permitir que esta clave también haga push al repositorio? (El valor predeterminado solo permite hacer pull)"
+msgid "Allow this key to push to this repository"
+msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
@@ -2996,6 +3146,9 @@ msgstr "Le permite agregar y administrar clusters de Kubernetes."
msgid "Almost there"
msgstr "¡Ya queda poco!"
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr "Ya está bloqueado"
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr "Se ha producido un error"
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr "Se ha producido un error al agregar un borrador a la discusión."
@@ -3146,12 +3293,18 @@ msgstr "Se ha producido un error al desactivar la alerta. Actualice la página y
msgid "An error occurred while dismissing the feature highlight. Refresh the page and try dismissing again."
msgstr "Se ha producido un error al desactivar la función resaltar. Actualice la página y vuelva a intentarlo."
+msgid "An error occurred while drawing job relationship links."
+msgstr ""
+
msgid "An error occurred while enabling Service Desk."
msgstr "Se ha producido un error al habilitar Service Desk."
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 commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr "Se ha producido un error al obtener los colores de las etiquetas."
msgid "An error occurred while fetching markdown preview"
msgstr "Se ha producido un error al obtener la previsualización del markdown."
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr "Se ha producido un error al recuperar los comentarios pendientes"
@@ -3269,6 +3425,9 @@ msgstr "Se ha producido un error al cargar los merge requests."
msgid "An error occurred while loading project creation UI"
msgstr "Se ha producido un error al cargar la interfaz de creación del proyecto"
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr "Se ha producido un error al cargar los datos. Por favor, inténtelo de nuevo."
@@ -3296,12 +3455,18 @@ msgstr "Se ha producido un error al cargar los datos de versión del merge reque
msgid "An error occurred while loading the merge request."
msgstr "Se ha producido un error al cargar el merge request."
+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 "Se ha producido un error al cargar los trabajos de lo pipelines."
+msgid "An error occurred while loading your content. Please try again."
+msgstr ""
+
msgid "An error occurred while making the request."
msgstr "Se ha producido un error al crear la petición."
@@ -3344,8 +3509,11 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr "Se ha producido un error al obtener los proyectos."
-msgid "An error occurred while saving assignees"
-msgstr "Se ha producido un error al guardar las asignaciones"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
+msgstr ""
msgid "An error occurred while subscribing to notifications."
msgstr "Se ha producido un error al suscribirse a las notificaciones."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr "Se ha producido un error al validar la ruta del grupo"
@@ -3395,12 +3566,12 @@ msgstr "Se ha producido un error. Por favor, inicie sesión de nuevo."
msgid "An error occurred. Please try again."
msgstr "Se ha producido un error. Por favor inténtelo de nuevo."
-msgid "An error ocurred while loading your content. Please try again."
-msgstr "Se ha producido un error al cargar su contenido. Por favor, inténtelo de nuevo."
-
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 ""
@@ -3477,7 +3648,7 @@ msgid "Any"
msgstr "Cualquiera"
msgid "Any %{header}"
-msgstr ""
+msgstr "Cualquier %{header}"
msgid "Any Author"
msgstr "Cualquier autor"
@@ -3757,9 +3928,6 @@ msgstr "¿Está seguro de que desea cancelar la edición de este comentario?"
msgid "Are you sure you want to close this blocked issue?"
msgstr "¿Está seguro de que desea cerrar esta incidencia bloqueada?"
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr "¿Estás seguro de que deseas eliminar %{name}?"
@@ -3787,6 +3955,9 @@ msgstr "¿Estás seguro de que deseas desplegar este entorno?"
msgid "Are you sure you want to discard this comment?"
msgstr "¿Está seguro de que desea descartar este comentario?"
+msgid "Are you sure you want to discard your changes?"
+msgstr ""
+
msgid "Are you sure you want to erase this build?"
msgstr "¿Estás seguro de que quieres borrar esta versión?"
@@ -3928,7 +4099,7 @@ msgid "Assign Iteration"
msgstr "Asignar iteración"
msgid "Assign To"
-msgstr ""
+msgstr "Asignar a"
msgid "Assign custom color like #FF0000"
msgstr "Asigne colores personalizados como #FF0000"
@@ -3940,10 +4111,10 @@ msgid "Assign milestone"
msgstr "Asignar milestone"
msgid "Assign reviewer"
-msgstr ""
+msgstr "Asignar revisor"
msgid "Assign reviewer(s)"
-msgstr ""
+msgstr "Asignar revisores"
msgid "Assign some issues to this milestone."
msgstr "Asignar algunas incidencias a este hito."
@@ -3973,7 +4144,7 @@ msgid "Assigned Merge Requests"
msgstr "Merge requests asignados"
msgid "Assigned projects"
-msgstr ""
+msgstr "Proyectos asignados"
msgid "Assigned to %{assigneeName}"
msgstr "Asignado a %{assigneeName}"
@@ -4048,12 +4219,6 @@ msgstr[1] "Adjuntar %d archivos"
msgid "Attaching the file failed."
msgstr "Se ha producido un error al adjuntar el archivo."
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr "Eventos de auditoría"
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr "Autenticando"
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr "Error de autenticación"
@@ -4463,7 +4631,7 @@ msgid "Below you will find all the groups that are public."
msgstr "A continuación encontrará todos los grupos públicos."
msgid "Beta"
-msgstr ""
+msgstr "Beta"
msgid "Bi-weekly code coverage"
msgstr "Cobertura de código quincenal"
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 "Importar desde un servidor de Bitbucket"
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr "Nombre de la rama"
msgid "Branch not loaded - %{branchId}"
msgstr "Branch no cargada - %{branchId}"
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr "Buscar ramas"
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr "Cambiar rama"
-
msgid "Branches"
msgstr "Ramas"
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr "Negocio"
msgid "Business metrics (Custom)"
msgstr "Métricas de negocio (personalizadas)"
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr "Comprar Licencia"
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr "De forma predeterminada, GitLab envía correos electrónicos en formatos HTML y de texto sin formato para que los clientes de correo puedan elegir qué formato utilizar. Desactive esta opción sí solo desea enviar correos electrónicos sin formato."
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr "Por defecto, todos los proyectos y grupos utilizarán la configuración de notificaciones global."
@@ -5028,6 +5235,26 @@ msgstr "CI/CD para repositorio externo"
msgid "CI/CD settings"
msgstr "Configuración de CI/CD"
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5104,7 +5331,7 @@ msgid "Can't apply this suggestion."
msgstr ""
msgid "Can't be empty"
-msgstr ""
+msgstr "No puede estar vacío"
msgid "Can't create snippet: %{err}"
msgstr "No se puede crear el fragmento de código: %{err}"
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr "Cancelar"
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr "Escoger en la rama"
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr "Revertir en la rama"
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5377,7 +5601,7 @@ msgid "Changes are still tracked. Useful for cluster/index migrations."
msgstr ""
msgid "Changes saved."
-msgstr ""
+msgstr "Cambios guardados."
msgid "Changes suppressed. Click to show."
msgstr "Cambios eliminados. Haga clic para mostrar."
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr "Compruebe sus imágenes de Docker para detectar vulnerabilidades conocidas."
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr "Comprobando disponibilidad de %{text}..."
@@ -5688,8 +5915,8 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr "Seleccione el grupo de nivel superior para las importaciones de su repositorio."
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
-msgstr "Escoja el nivel de visibilidad, habilite/deshabilite las características del proyecto (incidencias, repositorio, wiki, fragmentos de código) y configure los permisos necesarios según sus necesidades."
+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 ""
@@ -5703,6 +5930,9 @@ msgstr "Elija que repositorios quiere conectar y ejecutar los CI/CD pipelines."
msgid "Choose your framework"
msgstr "Seleccione su marco de trabajo"
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr "cancelado"
@@ -5977,7 +6207,7 @@ msgid "Close"
msgstr "Cerrar"
msgid "Close %{issueType}"
-msgstr ""
+msgstr "Cerrar %{issueType}"
msgid "Close %{tabname}"
msgstr "Cerrar %{tabname}"
@@ -5998,7 +6228,7 @@ msgid "Closed"
msgstr "Cerrado"
msgid "Closed %{epicTimeagoDate}"
-msgstr ""
+msgstr "Cerrado %{epicTimeagoDate}"
msgid "Closed epics"
msgstr ""
@@ -6010,7 +6240,7 @@ msgid "Closed this %{quick_action_target}."
msgstr "Cerrado este %{quick_action_target}."
msgid "Closed: %{closed}"
-msgstr ""
+msgstr "Cerrado: %{closed}"
msgid "Closes this %{quick_action_target}."
msgstr "Cierra este %{quick_action_target}."
@@ -6036,33 +6266,66 @@ msgstr "Nivel de clúster"
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Name"
+msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Name"
+msgstr "Nombre"
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr "Se ha producido un error al cargar los clústeres"
msgid "Code"
msgstr "Código"
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr "Cobertura del código: %{coveragePercentage}%{percentSymbol}"
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr "Contraer aprobadores"
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr "Contraer hitos"
@@ -7325,17 +7594,41 @@ msgstr "Comparar con la versión anterior"
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr "Los 'branches' %{source_branch} y %{target_branch} son iguales."
-msgid "CompareBranches|Compare"
-msgstr "Comparar"
+msgid "CompareBranches|There isn't anything to compare."
+msgstr "No hay nada que comparar."
-msgid "CompareBranches|Source"
-msgstr "Origen"
+msgid "CompareRevisions|Branches"
+msgstr ""
-msgid "CompareBranches|Target"
-msgstr "Destino"
+msgid "CompareRevisions|Compare"
+msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
-msgstr "No hay nada que comparar."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
+msgstr ""
msgid "Complete"
msgstr "Completado"
@@ -7349,6 +7642,12 @@ msgstr "Cumplimiento"
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr "GDPR"
@@ -7391,6 +7729,9 @@ msgstr "HIPAA"
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr "PCI-DSS"
@@ -7430,6 +7771,9 @@ msgstr "Configure los ejecutores de GitLab para comenzar a usar el terminal web.
msgid "Configure Gitaly timeouts."
msgstr "Configurar los tiempos de espera de Gitaly."
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr "Configurar Let's Encrypt"
@@ -7451,6 +7795,9 @@ msgstr "Configurar la instalación existente"
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr "¡Enhorabuena ha habilitado la autenticación de dos factores!"
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr "Error de conexión de Docker"
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-msgstr "Filtrar por nombre"
-
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 "Si no ha iniciado sesión, necesita autenticarse en el registro de contenedores utilizando su nombre de usuario y su contraseña de GitLab. Si tiene habilitada la %{twofaDocLinkStart}autenticación de dos factores%{twofaDocLinkEnd}, utilice un %{personalAccessTokensDocLinkStart}token de acceso personal%{personalAccessTokensDocLinkEnd} en lugar de una contraseña."
-msgid "ContainerRegistry|Image Repositories"
-msgstr "Repositorios de imágenes"
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -7968,7 +8303,7 @@ msgid "Contributions per group member"
msgstr "Contribuciones por cada miembro de un grupo"
msgid "Contributor"
-msgstr ""
+msgstr "Colaborador"
msgid "Contributors"
msgstr "Contribuidores"
@@ -8028,7 +8363,7 @@ msgid "Copy branch name"
msgstr "Copiar el nombre de rama"
msgid "Copy codes"
-msgstr ""
+msgstr "Copiar códigos"
msgid "Copy command"
msgstr "Copiar el comando"
@@ -8040,7 +8375,7 @@ msgid "Copy commit SHA"
msgstr "Copiar el SHA del commit"
msgid "Copy email address"
-msgstr ""
+msgstr "Copiar la dirección de correo electrónico"
msgid "Copy environment"
msgstr "Copiar entorno"
@@ -8082,7 +8417,7 @@ msgid "Copy the code below to implement tracking in your application:"
msgstr ""
msgid "Copy this value"
-msgstr ""
+msgstr "Copiar este valor"
msgid "Copy to clipboard"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr "No se pudo encontrar el diseño."
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr "País"
@@ -8245,12 +8577,12 @@ msgstr "Cree un proxy local para almacenar las imágenes usadas frecuentemente c
msgid "Create a merge request"
msgstr "Crear un merge request"
+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 "Crear un nuevo 'branch'"
-msgid "Create a new deploy key for this project"
-msgstr "Crear una nueva clave de despliegue para este proyecto"
-
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr "Cree un nuevo archivo ya todavía no hay archivos. Posteriormente, podrá confirmar los cambios con sus commits."
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr "Crear rama"
@@ -8302,6 +8637,9 @@ msgstr "Crear archivo"
msgid "Create from"
msgstr "Crear desde"
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr "Crear grupo"
@@ -8314,6 +8652,9 @@ msgstr "Crear incidencia"
msgid "Create iteration"
msgstr "Crear iteración"
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr "Crear listas desde las etiquetas. Las incidencias que contengan esa etiqueta aparecerán en esa lista."
@@ -8329,6 +8670,12 @@ msgstr "Crear hito"
msgid "Create new"
msgstr "Crear nuevo"
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr "Fecha de creación"
msgid "Credentials"
msgstr "Credenciales"
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr "No se encontraron credenciales"
@@ -8614,14 +8991,14 @@ msgstr "Contador de vulnerabilidades"
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
-msgstr "Perfil"
+msgid "CurrentUser|One of your groups is running out"
+msgstr ""
-msgid "CurrentUser|Settings"
-msgstr "Configuración"
+msgid "CurrentUser|Preferences"
+msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
@@ -8647,8 +9024,8 @@ msgstr ""
msgid "Custom notification events"
msgstr "Eventos de notificaciones personalizadas"
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
-msgstr "Los niveles de notificación personalizados son los mismos que los niveles participantes. Con los niveles de notificación personalizados, también recibirá notificaciones para eventos seleccionados. Para obtener más información, consulte %{notification_link}."
+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 "Plantillas de proyectos personalizadas"
@@ -8689,6 +9066,9 @@ msgstr "Portal de cliente"
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr "Personalizar colores"
@@ -8722,6 +9102,18 @@ msgstr ""
msgid "Cycle Time"
msgstr "Tiempo del ciclo"
+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 "Incidencia cerrada"
@@ -8886,7 +9278,7 @@ msgstr "Lista desplegable de las etapas"
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9130,13 +9531,13 @@ msgid "DastProfiles|URL"
msgstr ""
msgid "DastProfiles|Username"
-msgstr ""
+msgstr "Nombre de usuario"
msgid "DastProfiles|Username form field"
msgstr ""
msgid "DastProfiles|Validated"
-msgstr ""
+msgstr "Validado"
msgid "DastProfiles|Validation status"
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,11 +9610,14 @@ 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 "Los datos aún se están calculando..."
msgid "Database update failed"
-msgstr ""
+msgstr "Se ha producido un error al actualizar la base de datos"
msgid "Datasource name not found"
msgstr ""
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr "Día del mes"
@@ -9241,6 +9659,9 @@ msgid "Days to merge"
msgstr "Días para hacer merge"
msgid "Dear Administrator,"
+msgstr "Estimado Administrador,"
+
+msgid "Debian package already exists in Distribution"
msgstr ""
msgid "Debug"
@@ -9261,9 +9682,6 @@ msgstr "Rechazar y cerrar sesión"
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr "Branch por defecto"
-
msgid "Default CI configuration path"
msgstr "Ruta de configuración de CI por defecto"
@@ -9318,6 +9736,9 @@ msgstr "Definir un patrón personalizado con la sintaxis de cron"
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9325,7 +9746,7 @@ msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%
msgstr ""
msgid "Definition"
-msgstr ""
+msgstr "Definición"
msgid "Delayed Project Deletion (%{adjourned_deletion})"
msgstr ""
@@ -9348,9 +9769,12 @@ msgstr "retrasado"
msgid "Delete"
msgstr "Eliminar"
-msgid "Delete %{name}"
+msgid "Delete %{issuableType}"
msgstr ""
+msgid "Delete %{name}"
+msgstr "Eliminar %{name}"
+
msgid "Delete Comment"
msgstr "Eliminar el comentario"
@@ -9358,13 +9782,13 @@ msgid "Delete Value Stream"
msgstr ""
msgid "Delete account"
-msgstr ""
+msgstr "Eliminar cuenta"
msgid "Delete artifacts"
msgstr "Eliminar artefactos"
msgid "Delete badge"
-msgstr ""
+msgstr "Eliminar insignia"
msgid "Delete comment"
msgstr "Eliminar comentario"
@@ -9405,6 +9829,9 @@ msgstr "Eliminar suscripción"
msgid "Delete this attachment"
msgstr "Eliminar este adjunto"
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr "Eliminar la lista de usuarios"
@@ -9429,20 +9856,29 @@ msgstr "Se ha producido un error al restaurar el repositorio del proyecto. Por f
msgid "DeleteProject|Failed to restore wiki repository. Please contact the administrator."
msgstr "Se ha producido un error al restaurar el repositorio de la wiki. Por favor, póngase en contacto con el administrador."
+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 "Eliminado"
msgid "Deleted Projects"
-msgstr ""
+msgstr "Proyectos eliminados"
msgid "Deleted chat nickname: %{chat_name}!"
msgstr "¡Eliminado el nick del chat %{chat_name}!"
msgid "Deleted projects"
-msgstr ""
+msgstr "Proyectos eliminados"
msgid "Deleted projects cannot be restored!"
-msgstr ""
+msgstr "¡Los proyectos eliminados no se pueden recuperar!"
msgid "Deleting"
msgstr "Eliminando"
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr "La clave de despliegue se actualizó correctamente."
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
msgstr "Desplegar en..."
+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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr "+%{count} otros"
@@ -9660,6 +10093,9 @@ msgstr "Se ha producido un error al eliminar las claves de despliegue"
msgid "DeployKeys|Expand %{count} other projects"
msgstr "Ampliar %{count} a otros proyectos"
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr "Cargando claves de despliegue"
@@ -9678,9 +10114,6 @@ msgstr "Claves de despliegue accesibles de modo públco"
msgid "DeployKeys|Read access only"
msgstr "Acceso de sólo lectura"
-msgid "DeployKeys|Write access allowed"
-msgstr "Acceso de escritura permitido"
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr "Está a punto de eliminar esta clave de despliegue. ¿Está seguro?"
@@ -9690,20 +10123,20 @@ msgstr "Claves de despliegue activas (%{active_tokens})"
msgid "DeployTokens|Add a deploy token"
msgstr "Añadir un token de despliegue"
-msgid "DeployTokens|Allows read access to the package registry"
-msgstr "Permitir el acceso de lectura a los paquetes del registro"
+msgid "DeployTokens|Allows read access to the package registry."
+msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
-msgstr "Permite el acceso en modo de sólo lectura al registro de imágenes"
+msgid "DeployTokens|Allows read-only access to registry images."
+msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
-msgstr "Permite el acceso en modo de sólo lectura al repositorio"
+msgid "DeployTokens|Allows read-only access to the repository."
+msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
-msgstr "Permitir el acceso de escritura a los paquetes del registro"
+msgid "DeployTokens|Allows write access to registry images."
+msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
-msgstr "Permitir el acceso de escritura a las imágenes del registro"
+msgid "DeployTokens|Allows write access to the package registry."
+msgstr ""
msgid "DeployTokens|Copy deploy token"
msgstr "Copiar token de despliegue"
@@ -9717,11 +10150,8 @@ msgstr "Crear un token de despliegue"
msgid "DeployTokens|Created"
msgstr "Creado"
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr "El formato por defecto es \"GitLab+token-de-despliegue-{n}\". Por favor, introduzca un nombre de usuario personalizado si desea cambiarlo."
-
-msgid "DeployTokens|Deploy Tokens"
-msgstr "Tokens de despliegue"
+msgid "DeployTokens|Deploy tokens"
+msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
msgstr ""
@@ -9735,8 +10165,8 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr "Nombre"
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
-msgstr "Seleccione un nombre para la aplicación, y le proporcionaremos un token de despliegue único."
+msgid "DeployTokens|Pick a name for your unique deploy token."
+msgstr ""
msgid "DeployTokens|Revoke"
msgstr "Revocar"
@@ -9756,11 +10186,17 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr "Esta acción no se puede deshacer."
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
-msgstr "Utilice este token como contraseña. Asegúrese de guardarlo ya que no podrá acceder a él nuevamente."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
+msgstr ""
-msgid "DeployTokens|Use this username as a login."
-msgstr "Utilizar este nombre de usuario para el inicio de sesión."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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 "Nombre de usuario"
@@ -9768,8 +10204,8 @@ msgstr "Nombre de usuario"
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
-msgstr "Su nuevo token de despliegue"
+msgid "DeployTokens|Your new Deploy Token username"
+msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
msgstr "Se ha creado su nuevo token de despliegue de grupo."
@@ -9798,6 +10234,9 @@ msgstr "Desplegar en AWS es fácil con GitLab"
msgid "Deployment Frequency"
msgstr "Frecuencia de despliegue"
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr "API"
@@ -10045,19 +10480,7 @@ msgid "Detect host keys"
msgstr "Detectar las claves del host"
msgid "DevOps Report"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
+msgstr "Informe DevOps"
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
-msgstr ""
+msgstr "Aprobaciones"
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,20 +10536,14 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
-msgstr ""
+msgstr "Incidencias"
msgid "DevopsAdoption|MRs"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10213,7 +10633,7 @@ msgid "Diffs|Something went wrong while fetching diff lines."
msgstr "Se ha producido un error mientras se obtienen las líneas del diff."
msgid "Direct member"
-msgstr ""
+msgstr "Miembro directo"
msgid "Direction"
msgstr "Dirección"
@@ -10290,7 +10710,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10416,7 +10836,7 @@ msgid "Don't paste the private part of the GPG key. Paste the public part which
msgstr "No pegue la parte privada de la clave GPG. Pegue la parte pública que empieza por: '----- BEGIN PGP PUBLIC KEY BLOCK -----'."
msgid "Don't send usage data"
-msgstr ""
+msgstr "No enviar datos de uso"
msgid "Don't show again"
msgstr "No mostrar de nuevo"
@@ -10461,7 +10881,7 @@ msgid "Download license"
msgstr "Descargar licencia"
msgid "Download raw data (.csv)"
-msgstr ""
+msgstr "Descargar datos (.csv)"
msgid "Download source code"
msgstr "Descargar el código fuente"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10593,7 +11016,7 @@ msgid "Edit identity for %{user_name}"
msgstr "Editar la identidad para %{user_name}"
msgid "Edit in Web IDE"
-msgstr ""
+msgstr "Editar en IDE Web"
msgid "Edit in single-file editor"
msgstr ""
@@ -10617,7 +11040,7 @@ msgid "Edit stage"
msgstr "Editar etapa"
msgid "Edit this file only."
-msgstr ""
+msgstr "Editar solo este archivo."
msgid "Edit this release"
msgstr "Editar esta versión"
@@ -10680,15 +11103,15 @@ msgid "Email"
msgstr "Correo electrónico"
msgid "Email %{number}"
-msgstr ""
+msgstr "Correo electrónico %{number}"
msgid "Email Notification"
msgstr "Notificación por correo electrónico"
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10722,7 +11145,7 @@ msgid "Email updates (optional)"
msgstr ""
msgid "Email: %{email}"
-msgstr ""
+msgstr "Correo electrónico: %{email}"
msgid "EmailError|It appears that the email is blank. Make sure your reply is at the top of the email, we can't process inline replies."
msgstr "Parece que el correo electrónico está en blanco. Asegúrese de que su respuesta esté en la parte superior del correo electrónico, no podemos procesar las respuestas en línea."
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr "reiniciarlo"
-
-msgid "EmailToken|resetting..."
-msgstr "reiniciando..."
-
msgid "Emails"
msgstr "Correos electrónicos"
@@ -10827,7 +11244,7 @@ msgid "Enable Invisible Captcha during sign up"
msgstr ""
msgid "Enable Kroki"
-msgstr ""
+msgstr "Habilitar Kroki"
msgid "Enable PlantUML"
msgstr "Habilitar PlantUML"
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr "Habilitar el encabezado y pie de página en los correos electrónicos"
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr "Habilitar integración"
@@ -11048,20 +11468,14 @@ msgstr "Introduzca el número de incidencias"
msgid "Enter one or more user ID separated by commas"
msgstr "Introduzca uno o más ID de usuario separados por comas"
-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."
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the issue description"
-msgstr "Introduzca la descripción de la incidencia"
-
-msgid "Enter the issue title"
-msgstr "Introduzca el título de la incidencia"
-
-msgid "Enter the merge request description"
-msgstr "Introduzca la descripción del merge request"
+msgid "Enter the %{name} title"
+msgstr ""
-msgid "Enter the merge request title"
-msgstr "Introduzca el título del merge request"
+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 name of your application, and we'll return a unique %{type}."
msgstr ""
@@ -11345,6 +11759,9 @@ msgstr "protegido"
msgid "Epic"
msgstr "Épica"
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr "No es posible encontrar la tarea épica."
@@ -11369,6 +11786,12 @@ msgstr "Las tareas épicas le permiten administrar sus proyectos de manera más
msgid "Epics, Issues, and Merge Requests"
msgstr ""
+msgid "Epics|%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "Epics|%{startDate} – No due date"
+msgstr ""
+
msgid "Epics|Add a new epic"
msgstr "Añadir una nueva tarea épica"
@@ -11396,6 +11819,9 @@ msgstr "¿Cómo puedo resolver esto?"
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr "Eliminar tarea épica"
@@ -11423,6 +11849,9 @@ msgstr ""
msgid "Epics|Something went wrong while fetching child epics."
msgstr "Se ha producido un error al obtener las tareas épicas hijas."
+msgid "Epics|Something went wrong while fetching epics list."
+msgstr ""
+
msgid "Epics|Something went wrong while fetching group epics."
msgstr "Se ha producido un error al obtener los grupos de tareas épicas."
@@ -11447,9 +11876,6 @@ msgstr "Al hacer esto también eliminará cualquier descendiente de %{bStart}%{t
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 "Para programar la fecha %{epicDateType} de su épica basada en hitos, asigne un hito con una fecha %{epicDateType} a cualquier incidencia de la épica."
-msgid "Epics|Unable to perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr "Se ha producido un error al enviar el fichero"
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr "Se ha producido un error al subir el archivo: %{stripped}"
@@ -11640,7 +12069,7 @@ msgid "Error with Akismet. Please check the logs for more info."
msgstr "Error con Akismet. Por favor, compruebe los registros de error para obtener más información."
msgid "Error: %{error_message}"
-msgstr ""
+msgstr "Error: %{error_message}"
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -11789,11 +12218,14 @@ msgstr ""
msgid "Evidence collection"
msgstr "Recopilación de evidencias"
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr "Exactamente uno de los %{attributes} es necesario"
msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
+msgstr "Ejemplo: %{ip_address}. %{read_more_link}."
msgid "Example: @sub\\.company\\.com$"
msgstr "Ejemplo: @sub\\.empresa\\.com$"
@@ -11804,6 +12236,9 @@ msgstr "Ejemplo: Uso = consulta simple. (Solicitado)/(Capacidad) = Varias consul
msgid "Except policy:"
msgstr "Extracto de la política:"
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11814,7 +12249,7 @@ msgid "Excluding merge commits. Limited to 6,000 commits."
msgstr ""
msgid "Execution time"
-msgstr ""
+msgstr "Tiempo de ejecución"
msgid "Existing branch name, tag, or commit SHA"
msgstr ""
@@ -11835,15 +12270,18 @@ msgid "Expand all"
msgstr "Expandir todo"
msgid "Expand all files"
-msgstr ""
+msgstr "Expandir todos los archivos"
msgid "Expand all threads"
-msgstr ""
+msgstr "Expandir todos los hilos"
msgid "Expand approvers"
msgstr "Expandir aprobadores"
msgid "Expand file"
+msgstr "Expandir archivo"
+
+msgid "Expand issues"
msgstr ""
msgid "Expand milestones"
@@ -11882,6 +12320,9 @@ msgstr "Caduca"
msgid "Expires at"
msgstr "Caduca a las"
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr "Caduca en %{expires_at}"
@@ -11915,6 +12356,9 @@ msgstr "Explorar grupos públicos"
msgid "Export"
msgstr "Exportar"
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr "Exportar como CSV"
@@ -12038,12 +12482,12 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr "No es posible realizar el merge request. Por favor, inténtelo de nuevo."
-msgid "Failed to create To-Do for the design."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr "Se ha producido un erro al crear una rama para esta incidencia. Por favor, inténtalo de nuevo."
+msgid "Failed to create a to-do item for the design."
+msgstr ""
+
msgid "Failed to create framework"
msgstr ""
@@ -12068,6 +12512,12 @@ msgstr "Se ha producido un error al desplegar a"
msgid "Failed to enqueue the rebase operation, possibly due to a long-lived transaction. Try again later."
msgstr "Error al encolar la operación de rebase, posiblemente debido a una transacción de larga duración. Por favor, inténtelo de nuevo más tarde."
+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 ""
@@ -12104,9 +12554,6 @@ msgstr "Se ha producido un error al cargar los errores desde Sentry."
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr "Se ha producido un error al cargar grupos y usuarios."
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr "Se ha producido un error al cargar ramas relacionadas"
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,12 +12602,12 @@ msgstr "Se ha producido un error al proteger el entorno"
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
-msgstr ""
-
msgid "Failed to remove a Zoom meeting"
msgstr "Se ha producido un error al eliminar una reunión de Zoom"
+msgid "Failed to remove a to-do item for the design."
+msgstr ""
+
msgid "Failed to remove issue from board, please try again."
msgstr "Se ha producido un error al eliminar la incidencia del tablero, por favor, inténtelo de nuevo."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr "Se ha producido un error al inciar sesión utilizando la autenticación mediante una tarjeta inteligente"
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr "Se ha producido un error al actualizar el estado de la incidencia"
msgid "Failed to update issues, please try again."
msgstr "Se ha producido un error al actualizar las incidencias. Por favor, inténtalo de nuevo."
-msgid "Failed to update tag!"
-msgstr "¡Se ha producido un error al actualizar la etiqueta!"
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr "Feature Flags"
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr "No se ha eliminado la Feature Flag."
@@ -12602,7 +13046,7 @@ msgid "Filter"
msgstr "Filtro"
msgid "Filter by"
-msgstr ""
+msgstr "Filtrar por"
msgid "Filter by %{issuable_type} that are currently closed."
msgstr "Filtrar por %{issuable_type} que actualmente estén cerrados."
@@ -12617,7 +13061,7 @@ msgid "Filter by Git revision"
msgstr "Filtrar por revisión de Git"
msgid "Filter by issues that are currently closed."
-msgstr ""
+msgstr "Filtrar por icincidencias que están actualmente cerradas."
msgid "Filter by issues that are currently opened."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr "Importar desde FogBugz"
msgid "Folder/%{name}"
msgstr "Carpeta/%{name}"
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr "Color de la fuente"
@@ -12826,6 +13279,42 @@ msgstr "Realizar un fork del proyecto"
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr "Bifurcado de"
@@ -12856,8 +13345,8 @@ msgstr ""
msgid "Free Trial"
msgstr "Prueba gratuita"
-msgid "Free Trial of GitLab.com Gold"
-msgstr "Prueba gratuita de GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
+msgstr ""
msgid "Freeze end"
msgstr ""
@@ -12934,9 +13423,6 @@ msgstr "Geo"
msgid "Geo Nodes"
msgstr "Geo Nodos"
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr "Configuración de Geo"
msgid "Geo nodes are paused using a command run on the node"
msgstr "Los nodos de Geo se pausan utilizando un comando que se ejecuta en el nodo"
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr "%{timeAgoStr} (%{pendingEvents} eventos)"
@@ -13096,6 +13585,9 @@ msgstr "%{name} está programado para volver a sincronizar"
msgid "Geo|%{name} is scheduled for re-verify"
msgstr "Se ha programado %{name} para que se vuelva a comprobar"
+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 ""
@@ -13135,6 +13627,9 @@ msgstr "No se puede eliminar la entrada de seguimiento para un proyecto existent
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr "No se puede eliminar la entrada de seguimiento para un proyecto existente."
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr "Fallido"
@@ -13144,6 +13639,9 @@ msgstr "Filtrar por estado"
msgid "Geo|Geo Status"
msgstr "Estado de Geo"
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr "Último intento de sincronización"
msgid "Geo|Last time verified"
msgstr "Verficado por última vez"
+msgid "Geo|Learn more about Geo"
+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 "Nunca"
@@ -13195,6 +13699,9 @@ msgstr "Por favor, consulte la sección de solución de problemas de Geo."
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr "Proyecto"
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr "Estado"
@@ -13291,6 +13801,9 @@ msgstr "Se ha producido un error durante la verificación - %{error}"
msgid "Geo|Waiting for scheduler"
msgstr "Esperando por el programador"
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr "Empezar"
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr "Comenzar con el control de errores"
@@ -13330,6 +13840,9 @@ msgstr "¡Empecemos!"
msgid "Getting started with releases"
msgstr "Primeros pasos con las versiones"
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr "Git LFS no está habilitado en este servidor de GitLab, póngase en contacto con su administrador."
@@ -13366,20 +13879,23 @@ msgstr ""
msgid "GitHub import"
msgstr "Importar desde GitHub"
-msgid "GitLab"
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
msgstr ""
+msgid "GitLab"
+msgstr "GitLab"
+
msgid "GitLab / Unsubscribe"
msgstr "GitLab / Darse de baja"
msgid "GitLab API"
-msgstr ""
+msgstr "GitLab API"
msgid "GitLab Account Request"
-msgstr ""
+msgstr "Solicitud de cuenta de GitLab"
msgid "GitLab Billing Team."
-msgstr ""
+msgstr "Equipo de facturación de GitLab."
msgid "GitLab Import"
msgstr "Importar desde GitLab"
@@ -13451,7 +13967,7 @@ msgid "GitLab single sign-on URL"
msgstr ""
msgid "GitLab username"
-msgstr ""
+msgstr "Nombre de usuario de GitLab"
msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
msgstr "GitLab utiliza %{jaeger_link} para monitorizar sistemas distribuidos."
@@ -13460,7 +13976,7 @@ msgid "GitLab will run a background job that will produce pseudonymized CSVs of
msgstr "Gitlab ejecutará un trabajo como tarea de fondo que producirá un archivo CSV seudonimizado de la base de datos de Gitlab y que se cargará a su directorio de almacenamiento de objetos que tenga configurado."
msgid "GitLab.com"
-msgstr ""
+msgstr "GitLab.com"
msgid "GitLab.com import"
msgstr "Importar desde GitLab.com"
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr "Ir a pantalla completa"
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr "Conceder acceso"
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr "Gráfico"
@@ -13828,11 +14344,14 @@ msgstr "El grupo SAML debe estar habilitado para poder probar"
msgid "Group URL"
msgstr "URL del grupo"
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr "Avatar del grupo"
msgid "Group by"
-msgstr ""
+msgstr "Agrupar por"
msgid "Group description (optional)"
msgstr "Descripción del grupo (opcional)"
@@ -14161,6 +14680,15 @@ msgstr "debe ser \"persistente\""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr "Buscar por nombre"
msgid "Guideline"
msgstr "Guía"
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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}"
@@ -14489,13 +15023,13 @@ msgid "HealthCheck|Unhealthy"
msgstr "Poco saludable"
msgid "Hello %{name},"
-msgstr ""
+msgstr "Hola %{name},"
msgid "Hello there"
msgstr "¡Hola!"
msgid "Hello, %{username}!"
-msgstr ""
+msgstr "¡Hola, %{username}!"
msgid "Help"
msgstr "Ayuda"
@@ -14518,15 +15052,15 @@ msgstr "Ayuda a reducir el volumen de alertas (por ejemplo, si se crean demasiad
msgid "Helps reduce request volume for protected paths"
msgstr "Ayuda a reducir el volumen de solicitudes para rutas protegidas"
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr "Hola %{username}!"
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr "Ocultar proyectos archivados"
@@ -14536,7 +15070,7 @@ msgstr[0] "Ocultar gráfico"
msgstr[1] "Ocultar gráficos"
msgid "Hide comments on this file"
-msgstr ""
+msgstr "Ocultar los comentarios en este archivo"
msgid "Hide details"
msgstr "Ocultar detalles"
@@ -14630,6 +15164,9 @@ msgstr "Tareas de mantenimiento, exportación, ruta, transferencia, eliminación
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,11 +15417,14 @@ msgstr "Importar desde"
msgid "Import from Jira"
msgstr "Importado desde JIRA"
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
-msgstr ""
+msgstr "Importar grupos"
msgid "Import in progress"
msgstr "Importación en progreso"
@@ -14908,7 +15448,7 @@ msgid "Import project"
msgstr "Importar proyecto"
msgid "Import project from"
-msgstr ""
+msgstr "Importar proyecto desde"
msgid "Import project members"
msgstr "Importar miembros del proyecto"
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15558,7 +16098,7 @@ msgid "Include merge request description"
msgstr "Introduzca la descripción del merge request"
msgid "Include the username in the URL if required: %{code_open}https://username@gitlab.company.com/group/project.git%{code_close}."
-msgstr ""
+msgstr "En caso de que sea necesario incluya el nombre de usuario en la URL: %{code_open}https://nombredeusuario@gitlab.empresa.com/grupo/proyecto.git%{code_close}."
msgid "Includes LFS objects. It can be overridden per group, or per project. 0 for unlimited."
msgstr "Incluye objetos LFS. Se puede sobreescribir a nivel de grupo o de proyecto. Puede establecerse a 0 para hacer que este valor sea ilimitado."
@@ -15627,7 +16167,7 @@ msgid "Insert a quote"
msgstr "Insertar una cita"
msgid "Insert a video"
-msgstr ""
+msgstr "Insertar un vídeo"
msgid "Insert an image"
msgstr "Insertar una imagen"
@@ -15636,7 +16176,7 @@ msgid "Insert code"
msgstr "Insertar código"
msgid "Insert image"
-msgstr ""
+msgstr "Insertar imagen"
msgid "Insert inline code"
msgstr "Insertar código en línea"
@@ -15645,7 +16185,7 @@ msgid "Insert suggestion"
msgstr "Insertar sugerencia"
msgid "Insert video"
-msgstr ""
+msgstr "Insertar vídeo"
msgid "Insights"
msgstr "Insights"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr "Instale un autenticador de token por software como por ejemplo, %{free_otp_link} o Google Authenticator desde el repositorio de su aplicación y utilice esa aplicación para escanear este código QR. Hay más información disponible en la documentación %{help_link_start}%{help_link_end}."
-
msgid "Install on clusters"
msgstr "Instala en los clústeres"
@@ -15703,96 +16240,6 @@ msgstr "Ya existe el grupo de administrador de instancias"
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr "Integración"
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr "Todos los detalles"
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr "Detalles del comentario:"
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr "Estándar"
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -15926,7 +16388,7 @@ msgid "Integrations|You must have owner or maintainer permissions to link namesp
msgstr ""
msgid "Interactive mode"
-msgstr ""
+msgstr "Modo interactivo"
msgid "Interested parties can even contribute by pushing commits if they want to."
msgstr "Las partes interesadas incluso pueden contribuir haciendo push commit si lo desean."
@@ -16069,6 +16531,9 @@ msgstr "Invitar a \"%{trimmed}\" por correo electrónico"
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr "Invitar al grupo"
@@ -16078,9 +16543,6 @@ msgstr "Invitar al miembro"
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ msgstr "Incidencias cerradas"
msgid "Issues with comments, merge requests with diffs and comments, labels, milestones, snippets, and other project entities"
msgstr "Incidencias con comentarios, merge requests con diffs y comentarios, etiquetas, hitos, fragmentos de código y otras entidades de proyecto"
+msgid "Issues with label %{label}"
+msgstr ""
+
msgid "Issues with no epic assigned"
msgstr ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr "Iteraciones"
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ msgstr "Proyecto Jira: %{importProject}"
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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr "Utilice una contraseña para la versión servidor y un token API para la versión en la nube"
@@ -16700,13 +17246,13 @@ msgid "Jobs fail if they run longer than the timeout time. Input value is in sec
msgstr ""
msgid "Jobs|Are you sure you want to proceed?"
-msgstr ""
+msgstr "¿Está seguro de que desea proceder?"
msgid "Jobs|Are you sure you want to retry this job?"
msgstr ""
msgid "Jobs|Create CI/CD configuration file"
-msgstr ""
+msgstr "Crear archivo de configuración de CI/CD"
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 ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr "Despliegue de Kubernetes no encontrado"
msgid "Kubernetes error: %{error_code}"
msgstr "Error de Kubernetes: %{error_code}"
-msgid "Kubernetes popover"
-msgstr "Kubernetes popover"
-
msgid "LDAP"
msgstr "LDAP"
@@ -16972,6 +17518,9 @@ msgstr "Las etiquetas se pueden aplicar a incidencias y merge requests para cate
msgid "Labels can be applied to issues and merge requests."
msgstr "Las etiquetas se pueden aplicar a las incidencias y a los merge requests."
+msgid "Labels with no issues in this iteration:"
+msgstr ""
+
msgid "Labels|%{spanStart}Promote label%{spanEnd} %{labelTitle} %{spanStart}to Group Label?%{spanEnd}"
msgstr ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] "Último %d día"
msgstr[1] "Últimos %d días"
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr "Apellido(s)"
@@ -17085,6 +17640,9 @@ msgstr "Utilizado por última vez en:"
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr "Autor"
@@ -17118,6 +17676,9 @@ msgstr "Aprenda GitLab"
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr "Aprenda como contribuir %{link_start}a las plantillas integradas%{link_end}"
@@ -17169,9 +17730,6 @@ msgstr "Obtenga más información sobre las plantillas de proyectos a nivel de g
msgid "Learn more about signing commits"
msgstr "Más información sobre los commits firmados"
-msgid "Learn more about the dependency list"
-msgstr "Obtenga más información sobre la lista de dependencias"
-
msgid "Learn more in the"
msgstr "Más información en la"
@@ -17181,6 +17739,96 @@ msgstr "documentación sobre la programación de pipelines"
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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr "Abandonar"
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr "Se ha producido un error al obtener la lista de licencias. Por favor, compruebe su conexión de red e inténtelo de nuevo."
-msgid "Licenses|Learn more about license compliance"
-msgstr "Obtenga más información sobre el cumplimiento de licencias"
-
msgid "Licenses|License Compliance"
msgstr "License Compliance"
@@ -17483,6 +18128,9 @@ msgstr "Lista de repositorios disponibles"
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr "Se agotó el tiempo de espera al cargar las funciones. Por favor, vuelva
msgid "Loading issues"
msgstr "Cargando incidencias"
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr "Nivel de acceso máximo"
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr "El tiempo de espera máximo para los trabajos tiene un valor que no pued
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr "Número máximo de %{name} (%{count}) excedido"
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr "Aprobar los merge request"
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr "Añadir una respuesta"
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr "Se ha producido un error al guardar el borrador del comentario."
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr "Se ha producido un error al realizar el squash. Debe hacerse de forma manual."
-msgid "MergeRequests|Reply..."
-msgstr "Responder..."
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr "Resolver este hilo en una nueva incidencia"
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr "Más de %{number_commits_distance} commits diferente con %{default_branch}"
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr "Más estrellas"
@@ -19086,6 +19740,9 @@ msgstr "No es posible encontrar el punto de montaje %{mounted_as} en %{model_cla
msgid "Move"
msgstr "Mover"
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr "Mover incidencia"
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr "Mueve esta incodencia a otro proyecto."
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr "¡No se puede mover la incidencia debido a permisos insuficientes!"
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19361,7 +20021,7 @@ msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto
msgstr ""
msgid "NetworkPolicies|Invalid or empty policy"
-msgstr ""
+msgstr "Política no válida o vacía"
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr "Error de Kubernetes: %{error}"
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr "Nuevo usuario"
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr "Nueva rama"
@@ -19590,6 +20253,9 @@ msgstr "Nueva clave de despliegue"
msgid "New directory"
msgstr "Nuevo directorio"
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr "Nuevo entorno"
@@ -19632,6 +20298,9 @@ msgstr "Nueva iteración creada"
msgid "New label"
msgstr "Nueva etiqueta"
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr "Nueva solicitud de fusión"
@@ -19737,6 +20406,9 @@ msgstr "No se han encontrado actividades"
msgid "No application_settings found"
msgstr "No se han encontrado application_settings"
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr "No hay métodos de autenticación configurados."
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr "¡No ha sido posible realizar la conexión con un servidor de Gitaly, por favor compruebe sus logs!"
@@ -19788,6 +20466,9 @@ msgstr "No se han encontrado despliegues"
msgid "No due date"
msgstr "Sin fecha límite"
+msgid "No email participants were added. Either none were provided, or they already exist."
+msgstr ""
+
msgid "No endpoint provided"
msgstr ""
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr "Sin iteración"
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr "Nota: Considere pedirle a su administrador de GitLab que configure %{git
msgid "NoteForm|Note"
msgstr "Nota"
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr "¿Está seguro de que desea cancelar la creación de este comentario?"
msgid "Notes|Collapse replies"
msgstr "Contraer respuestas"
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr "Nada que sincronizar"
msgid "Notification events"
msgstr "Eventos de notificación"
-msgid "Notification setting"
-msgstr "Configuración de las notificaciones"
-
msgid "Notification setting - %{notification_title}"
msgstr "Configuración de las notificaciones - %{notification_title}"
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr "Integrar solicitud de fusión"
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr "Participación"
msgid "NotificationLevel|Watch"
msgstr "Vigilancia"
-msgid "NotificationSetting|Custom"
-msgstr "Personalizado"
-
msgid "Notifications"
msgstr "Notificaciones"
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,8 +21224,8 @@ msgstr "Uno o más de sus archivos de dependencias no son compatibles, y la list
msgid "One or more of your personal access tokens has expired."
msgstr ""
-msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less."
-msgstr "Uno o más de tus tokens de acceso personal caducarán en %{days_to_expire} días o menos."
+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 ""
@@ -20552,7 +21257,7 @@ 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 Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20565,7 +21270,13 @@ msgid "Oops, are you sure?"
msgstr "Oops, ¿está seguro?"
msgid "Open"
-msgstr "Abrir"
+msgstr "Abierta"
+
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
msgid "Open Selection"
msgstr "Abrir la selección"
@@ -20579,12 +21290,12 @@ msgstr ""
msgid "Open errors"
msgstr "Errores abiertos"
-msgid "Open in Xcode"
-msgstr "Abrir en Xcode"
-
msgid "Open in file view"
msgstr ""
+msgid "Open in your IDE"
+msgstr ""
+
msgid "Open issues"
msgstr "Incidencias abiertas"
@@ -20651,6 +21362,9 @@ msgstr "Panel de control de operaciones"
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr "El panel de control de operaciones proporciona un resumen del estado operativo de cada proyecto, incluidos los estados de canalización y alerta."
+msgid "Optimize your workflow with CI/CD Pipelines"
+msgstr ""
+
msgid "Optional"
msgstr "Opcional"
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr "Deshacer indentación"
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr "Reemplazado"
@@ -20762,6 +21473,15 @@ msgstr "El tipo de paquete debe ser NuGet"
msgid "Package type must be PyPi"
msgstr "El tipo de paquete debe ser PyPi"
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr "Añadir fuente de NuGet"
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr "Comando Maven"
msgid "PackageRegistry|Maven XML"
msgstr "Maven XML"
-msgid "PackageRegistry|NPM"
-msgstr "NPM"
-
msgid "PackageRegistry|NuGet"
msgstr "NuGet"
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr "Comando Pip"
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr "Eliminar paquete"
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr "Maven"
-msgid "PackageType|NPM"
-msgstr "NPM"
-
msgid "PackageType|NuGet"
msgstr "NuGet"
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr "Paquetes"
@@ -21077,6 +21809,15 @@ msgstr "Parámetro"
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr "Padre"
@@ -21134,11 +21875,11 @@ msgstr ""
msgid "Past due"
msgstr "Vencido"
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
-msgstr "Pegue aquí la clave pública de la máquina. Obtenga más información acerca de cómo generarla %{link_start}aquí%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
+msgstr ""
msgid "Paste confidential epic link"
msgstr ""
@@ -21233,6 +21974,9 @@ msgstr "Llamadas de Rugged"
msgid "PerformanceBar|SQL queries"
msgstr "consultas SQL"
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr "traza"
@@ -21284,9 +22028,6 @@ msgstr "Programación del Pipeline"
msgid "Pipeline Schedules"
msgstr "Programaciones de los Pipelines"
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr "Cuota de minutos del pipeline"
@@ -21308,10 +22049,10 @@ msgstr "Disparadores de los triggers"
msgid "Pipeline: %{status}"
msgstr "Pipeline: %{status}"
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr "Gráficos de los pipelines"
msgid "Pipelines emails"
msgstr "Correos electrónicos de pipelines"
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr "Pipelines del año pasado"
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,12 +22154,12 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr "Limpiar la caché de los runners"
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
-msgstr "La integración continua le puede ayudar a capturar errores en su producto mediante la ejecución de pruebas automáticas, mientras que el despliegue continuo le puede ayudar a llevar el código al entorno de su producto."
-
msgid "Pipelines|Copy trigger token"
msgstr ""
+msgid "Pipelines|Could not load merged YAML content"
+msgstr ""
+
msgid "Pipelines|Description"
msgstr ""
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-msgstr "Comenzar a utilizar los pipelines"
-
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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr "Cargar pipelines"
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr "Actualmente no hay pipelines."
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr "Se ha producido un error al obtener los pipelines. Por favor, inténtelo de nuevo en unos momentos o contacte con su equipo de soporte."
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
msgstr "padre"
+msgid "Pipeline|Actions"
+msgstr ""
+
msgid "Pipeline|Branch name"
msgstr ""
+msgid "Pipeline|Branches or tags could not be loaded."
+msgstr ""
+
msgid "Pipeline|Canceled"
msgstr "Cancelado"
+msgid "Pipeline|Checking pipeline status"
+msgstr ""
+
msgid "Pipeline|Checking pipeline status."
msgstr ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ msgstr ""
msgid "Pipeline|Pipeline"
msgstr "Pipeline"
+msgid "Pipeline|Pipeline %{idStart}#%{idEnd} %{statusStart}%{statusEnd} for %{commitStart}%{commitEnd}"
+msgstr ""
+
+msgid "Pipeline|Pipeline cannot be run."
+msgstr ""
+
msgid "Pipeline|Pipelines"
msgstr "Pipelines"
@@ -21665,6 +22415,9 @@ msgstr "Valor"
msgid "Pipeline|Variables"
msgstr "Variables"
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr "Está a punto de detener la ejecución del pipeline %{pipelineId}."
@@ -21734,6 +22487,9 @@ msgstr "Por favor, compruebe el archivo de configuración para asegurarse de que
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 "Por favor revise su correo electrónico (%{email}) para verificar que es el propietario de esta dirección y desbloquear la potencia de CI/CD. ¿No lo ha recibido? %{resend_link}. ¿Ha utilizado una dirección de correo electrónico incorrecta? %{update_link}."
+msgid "Please check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ msgstr "Por favor seleccione y añada un miembro"
msgid "Please select at least one filter to see results"
msgstr "Por favor seleccione por lo menos un filtro para ver los resultados"
+msgid "Please select what should be included in each exported requirement."
+msgstr ""
+
msgid "Please set a new password before proceeding."
msgstr "Por favor, establezca una nueva contraseña antes de continuar."
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr "Por favor resuelva el reCAPTCHA"
@@ -21923,21 +22685,39 @@ msgstr "Seleccione que contenido desea ver en la página de resumen de un proyec
msgid "Preferences|Choose what content you want to see on your homepage."
msgstr ""
+msgid "Preferences|Customize integrations with third party services."
+msgstr ""
+
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
msgstr "Personalice la apariencia del encabezado de la aplicación y la barra de navegación lateral."
msgid "Preferences|Display time in 24-hour format"
msgstr "Mostrar tiempo en formato 24 horas"
+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 mins ago."
msgstr "Por ejemplo: hace 30 minutos."
+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 "Ancho de diseño"
@@ -21959,6 +22739,12 @@ 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 "Tema del resaltado de la sintaxis"
@@ -22067,6 +22853,9 @@ msgstr "Etiquetas priorizada"
msgid "Private"
msgstr "Privado"
+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 "Privado - El acceso al proyecto debe concederse explícitamente a cada usuario. Si este proyecto es parte de un grupo, el acceso se concederá a los miembros del grupo."
@@ -22151,24 +22940,6 @@ msgstr "Perfil"
msgid "Profile Settings"
msgstr "Configuración del perfil"
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr "Encendido"
@@ -22205,6 +22976,9 @@ msgstr "Añadir clave"
msgid "Profiles|Add status emoji"
msgstr "Agregar emoji de estado"
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr "Redimensionador de avatar"
@@ -22562,6 +23336,9 @@ msgstr "Archivos del proyecto"
msgid "Project ID"
msgstr "ID de proyecto"
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr "URL del proyecto"
@@ -22790,12 +23567,9 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
-msgid "ProjectSettings|Allow users to request access"
-msgstr "Permitir a los usuarios solicitar acceso"
-
msgid "ProjectSettings|Analytics"
msgstr ""
@@ -22805,8 +23579,8 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr "Insignias"
-msgid "ProjectSettings|Build, test, and deploy your changes"
-msgstr "Construir, probar e implementar sus cambios"
+msgid "ProjectSettings|Build, test, and deploy your changes."
+msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
msgstr ""
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr "Póngase en contacto con el administrador para cambiar esta configuración."
@@ -22847,17 +23627,14 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-msgstr ""
-
msgid "ProjectSettings|Every merge creates a merge commit"
msgstr "Todo merge crea un merge commit"
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"
-msgstr "Cada proyecto puede tener su propio espacio para almacenar sus paquetes"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgstr ""
msgid "ProjectSettings|Everyone"
msgstr "Todos"
@@ -22895,13 +23672,13 @@ msgstr "Interno"
msgid "ProjectSettings|Issues"
msgstr "Incidencias"
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22937,14 +23714,17 @@ msgstr "Solo se pueden enviar commits firmados a este repositorio."
msgid "ProjectSettings|Operations"
msgstr ""
+msgid "ProjectSettings|Override user notification preferences for all project members."
+msgstr ""
+
msgid "ProjectSettings|Packages"
msgstr "Paquetes"
msgid "ProjectSettings|Pages"
msgstr "Páginas"
-msgid "ProjectSettings|Pages for project documentation"
-msgstr "Pages para la documentación del proyecto"
+msgid "ProjectSettings|Pages for project documentation."
+msgstr ""
msgid "ProjectSettings|Pipelines"
msgstr "Pipelines"
@@ -22970,16 +23750,25 @@ msgstr "Repositorio"
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,30 +23816,36 @@ msgstr "Esta configuración se aplica a nivel del servidor pero se ha sobreescri
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr "Esta configuración se aplicará a todos los proyectos a menos que sea sobreescrita por un administrador."
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr "Esta configuración anulará las preferencias de notificación de usuario para todos los miembros del proyecto."
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr "Esto determinará el historial de commits cuando se haga un merge request"
msgid "ProjectSettings|Transfer project"
msgstr ""
+msgid "ProjectSettings|Users can copy the repository to a new project."
+msgstr ""
+
msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr "Solamente pueden hacer push commit a este repositorio los usuarios cuyos commits se crearon mediante la utilización de correos electrónicos verificados."
-msgid "ProjectSettings|View and edit files in this project"
-msgstr "Ver y editar archivos en este proyecto"
+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 will only have read access"
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|View project analytics"
+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|What are badges?"
msgstr ""
@@ -23060,19 +23855,10 @@ msgstr ""
msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr "Cuando surgen conflictos, al usuario se le da la opción de realizar un rebase"
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
-msgstr ""
-
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
-msgstr ""
-
msgid "ProjectSettings|Wiki"
msgstr "Wiki"
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
-msgstr "Con GitLab Pages puede alojar sus sitios web estáticos en GitLab"
-
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr "Activo"
msgid "PrometheusService|Auto configuration"
msgstr "Configuración automática"
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
-msgstr "Implemente y configure Prometheus automáticamente en sus clústeres para supervisar los entornos de su proyecto"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
+msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr "Métricas comunes"
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr "Las métricas comunes más son monitorizadas automáticamente en base a una librería de métricas de los exportadores más populares."
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr "Métricas personalizadas"
@@ -23381,6 +24164,15 @@ msgstr "Encontrar y configurar métricas..."
msgid "PrometheusService|Finding custom metrics..."
msgstr "Buscar métricas personalizadas..."
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr "Instalar Prometheus en los clusters"
@@ -23396,6 +24188,12 @@ msgstr "Métricas"
msgid "PrometheusService|Missing environment variable"
msgstr "Falta la variable de entorno"
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr "Más información"
@@ -23408,23 +24206,23 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr "No se han creado métricas personalizadas. Cree una utilizando el botón situado más arriba"
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
-msgstr "URL Base de Prometheus, como http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
-msgstr "Prometheus se administra automáticamente en sus clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgstr ""
+
+msgid "PrometheusService|The Prometheus API base URL."
+msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+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 "Estas métricas serán monitorizadas una vez se realice el primer despliegue a un entorno"
-msgid "PrometheusService|Time-series monitoring service"
-msgstr "Servicio de monitorización de series de tiempo"
-
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
-msgstr "Para permitir la instalación de Prometheus en sus clústeres, por favor, desactive la configuración manual"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
msgstr "Esperando su primera despliegue en un entorno para buscar métricas comunes"
@@ -23432,6 +24230,12 @@ msgstr "Esperando su primera despliegue en un entorno para buscar métricas comu
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr "Promocionar"
@@ -23522,9 +24326,6 @@ msgstr "Pruébelo gratis"
msgid "Promotions|Upgrade plan"
msgstr "Plan de actualización"
-msgid "Promotions|Upgrade your plan"
-msgstr "Actualice su plan"
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23547,7 +24348,7 @@ msgid "Prompt users to upload SSH keys"
msgstr "Solicitar a los usuarios que carguen claves SSH"
msgid "Protect"
-msgstr ""
+msgstr "Proteger"
msgid "Protect a tag"
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr "Entorno protegido"
-msgid "Protected Environments"
-msgstr "Entornos protegidos"
-
msgid "Protected Paths"
msgstr "Rutas protegidas"
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr "Ramas protegidas"
+msgid "Protected environments"
+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 ""
@@ -23675,8 +24476,8 @@ msgstr "Se ha protegido su entorno."
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr "Se ha desprotegido su entorno"
-msgid "Protip:"
-msgstr "Sugerencia:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgstr ""
msgid "Protocol"
msgstr "Protocolo"
@@ -23771,8 +24572,50 @@ msgstr ""
msgid "Push to create a project"
msgstr "Push para crear un proyecto"
-msgid "PushRule|Committer restriction"
-msgstr "Restricción de autor"
+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 ""
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr "Se requiere autenticación"
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr "Recibe alertas desde los servidores de Prometheus configurados manualmen
msgid "Receive notifications about your own activity"
msgstr "Recibir notificaciones acerca de su propia actividad"
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr "Reciente"
@@ -24072,6 +24921,9 @@ msgstr "Notas de versión:"
msgid "Release title"
msgstr "Título de la versión"
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr "Eliminar la fecha de vencimiento"
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr "Eliminar la relación del fork"
@@ -24243,6 +25098,9 @@ msgstr "Eliminar la etapa"
msgid "Remove time estimate"
msgstr "Eliminar el tiempo estimado"
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,8 +25269,8 @@ msgstr "Responder a este comentario"
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr "Responda a este correo directamente o %{view_it_on_gitlab}."
-msgid "Reply..."
-msgstr "Responder..."
+msgid "Reply…"
+msgstr ""
msgid "Repo by URL"
msgstr "Repo por URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr "Acciones"
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr "Clase"
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr "Última actualización"
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr "Solicitar acceso"
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr "Solicitado %{time_ago}"
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr "Restablecer plantilla"
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr "Al restablecer la clave de autorización se invalidará la clave anterior. Las configuraciones de alerta existentes deberán actualizarse con la nueva clave."
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr "Guardar cambios"
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr "Alcances"
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr "Buscar este texto"
msgid "Search forks"
msgstr "Buscar forks"
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr "Buscar merge requests"
@@ -25595,7 +26480,7 @@ msgstr "Secreto"
msgid "Secret Detection"
msgstr "Detección de secretos"
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr "Habilitado"
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr "Control de seguridad"
@@ -25721,6 +26612,12 @@ msgstr "Añadir proyectos"
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr "Comentario añadido a '%{vulnerabilityName}'"
@@ -25730,12 +26627,12 @@ msgstr "Comentario eliminado en '%{vulnerabilityName}'"
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr "Comentario editado en '%{vulnerabilityName}'"
+msgid "SecurityReports|Create Jira issue"
+msgstr ""
+
msgid "SecurityReports|Create issue"
msgstr "Crear incidencia"
-msgid "SecurityReports|Dismiss Selected"
-msgstr "Descartar seleccionado"
-
msgid "SecurityReports|Dismiss vulnerability"
msgstr "Descartar vulnerabilidad"
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr "False positivo"
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr "Más información"
msgid "SecurityReports|More information"
msgstr "Más información"
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,21 +26744,21 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
-msgstr "Seleccione una razón"
+msgid "SecurityReports|Set status"
+msgstr ""
msgid "SecurityReports|Severity"
msgstr "Gravedad"
+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 "Estado"
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
-msgstr ""
-
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
msgstr ""
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr "Se ha producido un error al eliminar el comentario."
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr "Se ha producido un error al descartar las vulnerabilidades."
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr "Seleccione la rama"
-msgid "Select branch/tag"
-msgstr "Selecciona rama/etiqueta"
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr "Seleccione el proyecto para elegir la zona"
msgid "Select projects"
msgstr "Seleccione los proyectos"
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr "Seleccionar tipo"
msgid "Select user"
msgstr "Seleccione el usuario"
+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 "Los niveles seleccionados no pueden ser utilizados por usuarios que no tengan permisos de admnistración para grupos, proyectos o fragmentos de código. Si el nivel público está restringido, los perfiles de usuario solo son visibles para los usuarios registrados."
+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 ""
@@ -26161,8 +27062,8 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
-msgstr "Enviar una notificación separada por correo electrónico a los desarrolladores."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
+msgstr ""
msgid "Send confirmation email"
msgstr "Enviar un correo electrónico de confirmación"
@@ -26338,6 +27239,9 @@ msgstr "Establezca una contraseña en su cuenta para hacer pull o push vía %{pr
msgid "Set a template repository for projects in this group"
msgstr "Establecer un repositorio de plantillas para los proyectos de este grupo"
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26528,6 +27432,9 @@ msgid "Settings related to the use and experience of using GitLab's Package Regi
msgstr ""
msgid "Setup"
+msgstr "Configuración"
+
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
msgstr ""
msgid "Severity"
@@ -26627,7 +27534,7 @@ msgid "Show complete raw log"
msgstr "Mostrar el registro completo sin procesar"
msgid "Show details"
-msgstr ""
+msgstr "Mostrar detalles"
msgid "Show file browser"
msgstr "Mostrar el explorador de archivos"
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] "Mostrando %d evento"
msgstr[1] "Mostrando %d eventos"
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr "Algo salió mal en nuestro lado. ¡Por favor, inténtelo de nuevo!"
msgid "Something went wrong on our end. Please try again."
msgstr "Algo salió mal en por nuestra parte. ¡Por favor, inténtelo de nuevo!."
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr "Algo salió mal al intentar cambiar la confidencialidad de esta incidencia. ¡Por favor, inténtelo de nuevo!"
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr "Algo salió mal al intentar cambiar el estado de bloqueo de este %{issuableDisplayName}. ¡Por favor, inténtelo de nuevo!"
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr "Algo salió mal al resolver esta discusión. ¡Por favor, inténtelo de nuevo!"
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr "Se ha producido un error al detener este entorno. Por favor, inténtalo de nuevo."
@@ -27287,9 +28194,6 @@ msgstr "Registro más reciente"
msgid "SortOptions|Recently starred"
msgstr "Destacados más recientes"
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr "Tamaño"
@@ -27479,12 +28383,15 @@ msgstr "Iniciar una %{new_merge_request} con estos cambios"
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
-msgstr "Comenzar una nueva discusión..."
+msgid "Start a new discussion…"
+msgstr ""
msgid "Start a new merge request"
msgstr "Iniciar un nuevo merge request"
+msgid "Start a new merge request with these changes"
+msgstr ""
+
msgid "Start a review"
msgstr "Comenzar una revisión"
@@ -27762,7 +28669,7 @@ msgid "Subkeys"
msgstr "Subclaves"
msgid "Submit"
-msgstr ""
+msgstr "Enviar"
msgid "Submit %{humanized_resource_name}"
msgstr "Enviar %{humanized_resource_name}"
@@ -27777,7 +28684,7 @@ msgid "Submit changes"
msgstr ""
msgid "Submit changes..."
-msgstr ""
+msgstr "Enviar cambios..."
msgid "Submit feedback"
msgstr "Enviar comentarios"
@@ -27795,7 +28702,7 @@ msgid "Submit the current review."
msgstr "Enviar la revisión actual."
msgid "Submit your changes"
-msgstr ""
+msgstr "Envíe sus cambios"
msgid "Submitted the current review."
msgstr "Se ha enviado la revisión actual."
@@ -27942,7 +28849,7 @@ msgid "Successfully activated"
msgstr "Activado correctamente"
msgid "Successfully approved"
-msgstr ""
+msgstr "Aprobado con éxito"
msgid "Successfully blocked"
msgstr "Bloqueado con éxito"
@@ -27989,68 +28896,68 @@ msgstr "Cambio sugerido"
msgid "Suggested solutions help link"
msgstr "Enlace de ayuda de las soluciones sugeridas"
-msgid "SuggestedColors|Bright green"
-msgstr "Verde brillante"
+msgid "SuggestedColors|Aztec Gold"
+msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
-msgstr "Cian grisáceo oscuro"
+msgid "SuggestedColors|Blue"
+msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
-msgstr "Azul oscuro (moderado)"
+msgid "SuggestedColors|Blue-gray"
+msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
-msgstr "Naranja oscuro (moderado)"
+msgid "SuggestedColors|Carrot orange"
+msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
-msgstr "Rosa oscuro (moderado)"
+msgid "SuggestedColors|Champagne"
+msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
-msgstr "Violeta oscuro (moderado)"
+msgid "SuggestedColors|Charcoal grey"
+msgstr ""
-msgid "SuggestedColors|Feijoa"
-msgstr "Verde feijoa"
+msgid "SuggestedColors|Crimson"
+msgstr ""
-msgid "SuggestedColors|Lime green"
-msgstr "Verde lima"
+msgid "SuggestedColors|Dark coral"
+msgstr ""
-msgid "SuggestedColors|Moderate blue"
-msgstr "Azul (moderado)"
+msgid "SuggestedColors|Dark green"
+msgstr ""
-msgid "SuggestedColors|Pure red"
-msgstr "Rojo puro"
+msgid "SuggestedColors|Dark sea green"
+msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
-msgstr "Azul ligeramente desaturado"
+msgid "SuggestedColors|Dark violet"
+msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
-msgstr "Verde ligeramente desaturado"
+msgid "SuggestedColors|Deep violet"
+msgstr ""
-msgid "SuggestedColors|Soft orange"
-msgstr "Naranja suave"
+msgid "SuggestedColors|Gray"
+msgstr ""
-msgid "SuggestedColors|Soft red"
-msgstr "Rojo suave"
+msgid "SuggestedColors|Green screen"
+msgstr ""
-msgid "SuggestedColors|Strong pink"
-msgstr "Rosa fuerte"
+msgid "SuggestedColors|Green-cyan"
+msgstr ""
-msgid "SuggestedColors|Strong red"
-msgstr "Rojo fuerte"
+msgid "SuggestedColors|Lavendar"
+msgstr ""
-msgid "SuggestedColors|Strong yellow"
-msgstr "Amarillo fuerte"
+msgid "SuggestedColors|Magenta-pink"
+msgstr ""
-msgid "SuggestedColors|UA blue"
-msgstr "Azul UA"
+msgid "SuggestedColors|Medium sea green"
+msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
-msgstr "Azul muy oscuro desaturado"
+msgid "SuggestedColors|Red"
+msgstr ""
-msgid "SuggestedColors|Very dark lime green"
-msgstr "Verde lima muy oscuro"
+msgid "SuggestedColors|Rose red"
+msgstr ""
-msgid "SuggestedColors|Very pale orange"
-msgstr "Naranja muy pálido"
+msgid "SuggestedColors|Titanium yellow"
+msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
msgstr ""
@@ -28116,7 +29023,7 @@ msgid "Synchronization settings"
msgstr ""
msgid "Syncing…"
-msgstr ""
+msgstr "Sincronizando…"
msgid "Syntax is correct."
msgstr ""
@@ -28136,6 +29043,12 @@ 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})"
@@ -28145,7 +29058,7 @@ msgstr "Encabezado y pie de página del sistema"
msgid "System hook was successfully updated."
msgstr "El hook del sistema se actualizó correctamente."
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr "Términos del servicio y política de privacidad"
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr "La etapa de puesta en escena muestra el tiempo entre la fusión y el des
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ msgstr "No hay cambios"
msgid "There are no charts configured for this page"
msgstr "No hay gráficas configuradas para esta página"
+msgid "There are no closed epics"
+msgstr ""
+
msgid "There are no closed issues"
msgstr "No hay ninguna incidencia cerrada"
@@ -29076,12 +30004,18 @@ msgstr "Aún no hay incidencias que mostrar"
msgid "There are no issues to show."
msgstr "No hay incidencias que mostrar."
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr "Aún no hay etiquetas"
msgid "There are no matching files"
msgstr "No hay archivos coincidentes"
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr "No hay ninguna incidencia abierta"
@@ -29112,12 +30046,12 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
-msgstr ""
-
msgid "There is already a repository with that name on disk"
msgstr "Ya hay un repositorio con ese nombre en el disco"
+msgid "There is already a to-do item for this design."
+msgstr ""
+
msgid "There is no chart data available."
msgstr ""
@@ -29157,7 +30091,7 @@ msgstr "Se ha producido un error al recuperar las etiquetas del proyecto."
msgid "There was a problem fetching project users."
msgstr "Se ha producido un problema al recuperar los usuarios del proyecto."
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr "Se ha producido un error al guardar su etapa personalizada, por favor in
msgid "There was a problem sending the confirmation email"
msgstr "Se ha producido un error al enviar el correo electrónico de confirmación"
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr "Se ha producido un error al obtener el %{replicableType}"
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr "Se ha producido un error al cargar el calendario de actividades de los usuarios."
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr "Se ha producido un error al guardar sus cambios."
-msgid "There was an error saving your notification settings."
-msgstr "Se ha producido un error al actualizar la configuración de las notificaciones."
-
msgid "There was an error subscribing to this label."
msgstr "Se ha producido un error al subscribirse a esta etiqueta."
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr "Se ha producido un error al intentar validar su consulta"
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr "Esta acción puede provocar la pérdida de datos. Para prevenir acciones accidentales, le pedimos que confirme su intención."
@@ -29574,6 +30505,9 @@ msgstr "Esta es una lista de dispositivos desde los que ha iniciado sesión. Cie
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr "Este es un registro de seguridad de eventos importantes relacionados con su cuenta."
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr "Threat Monitoring"
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr "Entorno"
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr "Sugerencia:"
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr "Título"
@@ -30382,12 +31325,12 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr "Para ampliar la búsqueda, cambie o elimine filtros"
+msgid "To widen your search, change or remove filters above."
+msgstr ""
+
msgid "To widen your search, change or remove filters."
msgstr "Para ampliar la búsqueda, cambie o elimine filtros."
-msgid "To-Do"
-msgstr ""
-
msgid "To-Do List"
msgstr "Lista de tareas pendientes"
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr "Cambiar estado: OFF"
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr "Cambiar estado: ON"
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr "Demasiados espacios de nombres habilitados. Necesitará administrarlos a
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr "Demasiados proyectos habilitados. Necesitará administrarlos a través de la consola o mediante el API."
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,22 +31541,28 @@ msgstr "Vista de árbol"
msgid "Trending"
msgstr "Tendencia"
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr "Volver a GitLab"
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
-msgstr "Saltar periodo de prueba (Continuar con cuenta gratuita)"
+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 ""
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr "Solucione problemas y supervise su aplicación con el seguimiento"
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr "Inténtelo de nuevo"
@@ -30735,6 +31675,9 @@ msgstr "Pruebe todo lo que GitLab tiene para ofrecer durante 30 días."
msgid "Try changing or removing filters."
msgstr "Intente cambiar o quitar los filtros."
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr "Intentar realizar el fork de nuevo"
@@ -30756,11 +31699,11 @@ msgstr "Martes"
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
-msgstr "Desactivar"
+msgid "Turn off"
+msgstr ""
-msgid "Turn On"
-msgstr "Activar"
+msgid "Turn on"
+msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
msgstr ""
@@ -30825,6 +31768,21 @@ msgstr "URL"
msgid "URL is required"
msgstr "Se requiere la URL"
+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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr "Deshacer ignorar"
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr "Desafortunadamente, su mensaje de correo electrónico a GitLab no pudo ser procesado."
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr "Se ha producido un error en la actualización"
-msgid "Update failed. Please try again."
-msgstr "Se ha producido un error en la actualización. Por favor, inténtelo de nuevo."
-
msgid "Update it"
msgstr "Actualícelo"
@@ -31308,6 +32266,12 @@ msgstr "UsageQuota|LFS Objetos"
msgid "UsageQuota|LFS Storage"
msgstr "Almacenamiento LFS"
+msgid "UsageQuota|Learn more about excess storage usage"
+msgstr ""
+
+msgid "UsageQuota|Learn more about usage quotas"
+msgstr ""
+
msgid "UsageQuota|Packages"
msgstr "Paquetes"
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,8 +32473,8 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr "Utilice la herramienta Service Desk para conectarse con sus usuarios (por ejemplo, para ofrecer soporte al cliente) a través del correo electrónico directamente desde dentro de GitLab"
-msgid "Use an 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 único uso en su dispositivo móvil u ordenador para habilitar la autenticación de dos factores (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgstr ""
msgid "Use cURL"
msgstr ""
@@ -31440,7 +32494,7 @@ msgstr "Utilice una línea por URI"
msgid "Use template"
msgstr "Utilizar plantilla"
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31510,7 +32564,7 @@ msgid "User restrictions"
msgstr "Restricciones de usuario"
msgid "User settings"
-msgstr ""
+msgstr "Ajustes de usuario"
msgid "User was successfully created."
msgstr "Usuario creado correctamente."
@@ -31611,6 +32665,12 @@ msgstr "Editar perfil"
msgid "UserProfile|Explore public groups to find projects to contribute to."
msgstr "Explore los grupos públicos para encontrar proyectos en los que contribuir."
+msgid "UserProfile|Followers"
+msgstr ""
+
+msgid "UserProfile|Following"
+msgstr ""
+
msgid "UserProfile|Groups"
msgstr "Grupos"
@@ -31653,6 +32713,9 @@ msgstr "Proyectos destacados"
msgid "UserProfile|Subscribe"
msgstr "Suscribirse"
+msgid "UserProfile|This user doesn't have any followers."
+msgstr ""
+
msgid "UserProfile|This user doesn't have any personal projects"
msgstr "Este usuario no tiene ningún proyecto personal"
@@ -31668,6 +32731,9 @@ msgstr "Este usuario no ha marcado ningún proyecto como favorito"
msgid "UserProfile|This user is blocked"
msgstr "Este usuario está bloqueado"
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ msgstr "Ver todo"
msgid "UserProfile|View user in admin area"
msgstr "Ver usuario en el área de administración"
+msgid "UserProfile|You are not following other users."
+msgstr ""
+
msgid "UserProfile|You can create a group for several dependent projects."
msgstr "Puede crear un grupo que agrupe varios proyectos dependientes."
+msgid "UserProfile|You do not have any followers."
+msgstr ""
+
msgid "UserProfile|You haven't created any personal projects."
msgstr "No ha creado ningún proyecto personal."
@@ -31752,6 +32824,9 @@ msgstr "Sin asignar"
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr "Uso de %{code_start}::%{code_end} denota un %{link_start}con ámbito de etiqueta%{link_end}"
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr "Utilizar la estrategia de cifrado requerida cuando falta el campo cifrado"
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr "Ver todas las incidencias"
@@ -31912,9 +32990,6 @@ msgstr "Ver archivo @ "
msgid "View file @ %{commitSha}"
msgstr "Ver archivo @ %{commitSha}"
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr "Ver el panel de control completo"
@@ -32032,6 +33107,9 @@ msgstr "Desconocido"
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr "%{stepStart}Paso 1%{stepEnd}. Copie el siguiente script:"
@@ -32098,6 +33176,9 @@ msgstr "%{formattedStartDate} hasta hoy"
msgid "VulnerabilityChart|Severity"
msgstr "Gravedad"
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr "Cambiar estado"
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr "Hemos encontrado los siguientes errores:"
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr "No hemos encontrado vulnerabilidades"
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
+msgstr ""
+
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL must be percent-encoded if neccessary."
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr "¿Qué está buscando?"
msgid "What describes you best?"
msgstr "¿Qué le describe mejor?"
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,11 +33847,8 @@ msgstr "Eliminar página"
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr "¿Desea eliminar la página %{pageTitle}?"
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr "Alguien editó esta página al mismo tiempo que usted. Por favor revise %{page_link} y asegúrese de que los cambios realizados por usted no eliminen sin querer los cambios realizados por la otra persona."
-
-msgid "WikiPageConflictMessage|the page"
-msgstr "la página"
+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 "WikiPageCreate|Create %{pageTitle}"
msgstr "Crear %{pageTitle}"
@@ -32832,9 +33943,6 @@ msgstr "Escriba un comentario o arrastre sus archivos aquí…"
msgid "Write a comment…"
msgstr "Escriba un comentario…"
-msgid "Write access allowed"
-msgstr "Acceso de escritura permitido"
-
msgid "Write milestone description..."
msgstr "Escriba la descripción del hito..."
@@ -32844,6 +33952,9 @@ msgstr "Escribe sus notas de la versión o arrastrar sus archivos aquí…"
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr "UID externo incorrecto. Por favor, asegúrese de que Auth0 está configurado correctamente."
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ msgstr ""
msgid "You are not allowed to unlink your primary login account"
msgstr "No tiene permiso para desvincular su cuenta principal de inicio de sesión"
+msgid "You are not authorized to delete this site profile"
+msgstr ""
+
msgid "You are not authorized to perform this action"
msgstr "No tiene permiso para realizar esta acción"
@@ -32973,6 +34087,9 @@ msgstr "Siempre puede editar esto más tarde"
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 ""
@@ -33115,11 +34232,14 @@ msgid "You didn't renew your subscription so it was downgraded to the GitLab Cor
msgstr ""
msgid "You do not have an active license"
-msgstr ""
+msgstr "No tiene una licencia activa"
msgid "You do not have any subscriptions yet"
msgstr "Aún no tiene ninguna suscripción"
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr "No tiene permiso para dejar este %{namespaceType}."
@@ -33130,7 +34250,7 @@ msgid "You do not have permission to update the environment."
msgstr ""
msgid "You do not have permissions to run the import."
-msgstr ""
+msgstr "No tiene permisos para ejecutar la importación."
msgid "You don't have any U2F devices registered yet."
msgstr "No tiene ningún dispositivo U2F registrado."
@@ -33237,6 +34357,9 @@ msgstr "No ha añadido aprobadores. Empiece por añadir usuarios o grupos."
msgid "You have reached your project limit"
msgstr "Has alcanzado el límite de tu proyecto"
+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 a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33409,7 +34532,7 @@ msgid "YouTube"
msgstr "YouTube"
msgid "YouTube URL or ID"
-msgstr ""
+msgstr "URL o ID de YouTube"
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr "Su licencia"
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr "Sus tokens de acceso personal caducarán en %{days_to_expire} días o menos"
-
msgid "Your Primary Email will be used for avatar detection."
msgstr "Su dirección de correo electrónico principal se utilizará para la detección de avatar."
@@ -33642,6 +34762,9 @@ msgstr "Su token para restablecer la contraseña ha caducado."
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 profile"
msgstr "Su perfil"
@@ -33699,6 +34822,9 @@ msgstr "Se ha eliminado la reunión de Zoom"
msgid "[No reason]"
msgstr "[No hay razón]"
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr "acceso:"
msgid "added %{created_at_timeago}"
msgstr "añadido %{created_at_timeago}"
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr "añadió una llamada de Zoom a esta incidencia"
@@ -33935,6 +35064,9 @@ 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 "Cree un merge request para implementar esta solución, o descargue y aplique el parche manualmente."
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr "incidencia cerrada"
@@ -34215,6 +35350,9 @@ msgstr[1] "archivos"
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 "para %{link_to_merge_request} con %{link_to_merge_request_source_branch}"
@@ -34354,6 +35492,9 @@ msgstr "no es un correo electrónico de su propiedad"
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr "es de solo lectura"
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] "merge request"
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr "Restaure o use una rama diferente %{missingBranchName}"
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr "%{link_start}Obtenga más información sobre como resolver conflictos%{link_end}"
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr "Si el branch %{missingBranchName} existe en su repositorio local, puede
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr "Cargando las estadísticas de los despliegues"
@@ -34698,7 +35836,7 @@ msgstr "Los cambios no se fusionaron en"
msgid "mrWidget|The changes will be merged into"
msgstr "Los cambios se fusionarán en"
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr "se ejecutará el merge cuando la ejecución del pipeline se finalice con
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr "debe ser mayor que la fecha de inicio"
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr "debe contener sólo entornos de trabajo válidos"
@@ -34839,9 +35986,6 @@ msgstr "ninguno"
msgid "not found"
msgstr "no encontrado"
-msgid "notification emails"
-msgstr "correos electrónicos de notificación"
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr "%{firstItem}, y %{lastItem}"
@@ -35128,6 +36272,12 @@ msgstr "la siguiente incidencia(s)"
msgid "this document"
msgstr "este documento"
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr "disparado"
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr "los dominios unicode deben utilizar codificación IDNA"
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr "usuario"
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr "¡Utilizar los clústeres de Kubernetes para implementar tu código!"
-
msgid "v%{version} published %{timeAgo}"
msgstr "v%{version} publicada %{timeAgo}"
diff --git a/locale/et_EE/gitlab.po b/locale/et_EE/gitlab.po
index 509af342db7..b1478efd706 100644
--- a/locale/et_EE/gitlab.po
+++ b/locale/et_EE/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: et\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:06\n"
+"PO-Revision-Date: 2021-03-05 23:50\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -170,6 +173,11 @@ 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] ""
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ 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 ""
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -682,6 +710,15 @@ 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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -976,6 +1016,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -988,9 +1031,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1015,9 +1055,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1111,6 +1148,11 @@ 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] ""
@@ -1162,6 +1204,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1282,6 +1327,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1635,9 +1779,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1716,12 +1857,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1818,6 +1965,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1938,6 +2103,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2058,6 +2226,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2091,6 +2268,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2259,6 +2442,15 @@ 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 ""
@@ -2268,6 +2460,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2361,6 +2562,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2394,6 +2607,21 @@ 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 ""
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2483,9 +2714,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2576,9 +2792,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,9 +2813,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,49 +2837,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,76 +2867,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,13 +2927,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2954,7 +3104,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2996,6 +3146,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3146,12 +3293,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3269,6 +3425,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3296,12 +3455,18 @@ 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 ""
@@ -3344,7 +3509,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3395,10 +3566,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3757,9 +3928,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3787,6 +3955,9 @@ 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 erase this build?"
msgstr ""
@@ -4048,12 +4219,6 @@ msgstr[1] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5028,6 +5235,26 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5688,7 +5915,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5703,6 +5930,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6036,21 +6266,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7325,16 +7594,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7349,6 +7642,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7391,6 +7729,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7430,6 +7771,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7451,6 +7795,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8245,10 +8577,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8302,6 +8637,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8314,6 +8652,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8329,6 +8670,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,13 +8991,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8647,7 +9024,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8689,6 +9066,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8722,6 +9102,18 @@ 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 ""
@@ -8886,7 +9278,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 ""
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9261,9 +9682,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9318,6 +9736,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9429,6 +9856,15 @@ 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 ""
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9660,6 +10093,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9678,9 +10114,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9690,19 +10123,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9717,10 +10150,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9735,7 +10165,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9756,10 +10186,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9768,7 +10204,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10047,18 +10482,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,7 +10710,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11048,19 +11468,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
-msgstr ""
-
-msgid "Enter the issue title"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11345,6 +11759,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11369,6 +11786,12 @@ 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 ""
@@ -11396,6 +11819,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11423,6 +11849,9 @@ 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 ""
@@ -11447,9 +11876,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11882,6 +12320,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11915,6 +12356,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12038,10 +12482,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12068,6 +12512,12 @@ 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 ""
@@ -12104,9 +12554,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,10 +12602,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12826,6 +13279,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12856,7 +13345,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12934,9 +13423,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13096,6 +13585,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13135,6 +13627,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13144,6 +13639,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13291,6 +13801,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13330,6 +13840,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13828,6 +14344,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14630,6 +15164,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15703,96 +16240,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16078,9 +16543,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ 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 ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ 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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16972,6 +17518,9 @@ 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 ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] ""
msgstr[1] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17085,6 +17640,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17118,6 +17676,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17169,9 +17730,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17181,6 +17739,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19590,6 +20253,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19737,6 +20406,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19788,6 +20466,9 @@ 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 ""
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ 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."
+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."
@@ -20552,7 +21257,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20579,10 +21290,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20651,6 +21362,9 @@ 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 ""
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20762,6 +21473,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21077,6 +21809,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21284,9 +22028,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21308,10 +22049,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,10 +22154,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ 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 ""
@@ -21665,6 +22415,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21923,21 +22685,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21959,6 +22739,12 @@ 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 ""
@@ -22067,6 +22853,9 @@ 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 ""
@@ -22151,24 +22940,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22205,6 +22976,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22562,6 +23336,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22790,10 +23567,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22805,7 +23579,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,13 +23672,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22937,13 +23714,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22970,16 +23750,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,52 +23816,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23381,6 +24164,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23396,6 +24188,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23408,22 +24206,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23432,6 +24230,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23522,9 +24326,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23675,7 +24476,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23771,7 +24572,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24072,6 +24921,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24243,6 +25098,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,7 +25269,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25595,7 +26480,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25721,6 +26612,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,10 +26627,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,19 +26744,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26161,7 +27062,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26338,6 +27239,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] ""
msgstr[1] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27287,9 +28194,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27479,12 +28383,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27989,67 +28896,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28136,6 +29043,12 @@ 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 ""
@@ -28145,7 +29058,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ 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 ""
@@ -29076,12 +30004,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29112,10 +30046,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29157,7 +30091,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29574,6 +30505,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30382,10 +31325,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30735,6 +31675,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30756,10 +31699,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31308,6 +32266,12 @@ 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|Packages"
msgstr ""
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ 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 ""
@@ -31653,6 +32713,9 @@ 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 ""
@@ -31668,6 +32731,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ 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 ""
@@ -31752,6 +32824,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31912,9 +32990,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32032,6 +33107,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,10 +33847,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32832,9 +33943,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ 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 ""
@@ -33120,6 +34237,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33237,6 +34357,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33642,6 +34762,9 @@ 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 profile"
msgstr ""
@@ -33699,6 +34822,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 ""
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34215,6 +35350,9 @@ 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 ""
@@ -34354,6 +35492,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34698,7 +35836,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35128,6 +36272,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/fa_IR/gitlab.po b/locale/fa_IR/gitlab.po
index e20dceb120b..376ae6598a6 100644
--- a/locale/fa_IR/gitlab.po
+++ b/locale/fa_IR/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: fa\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:06\n"
+"PO-Revision-Date: 2021-03-05 23:49\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -170,6 +173,11 @@ 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] ""
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ 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 ""
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -682,6 +710,15 @@ 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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -976,6 +1016,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -988,9 +1031,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1015,9 +1055,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1111,6 +1148,11 @@ 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] ""
@@ -1162,6 +1204,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1282,6 +1327,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1635,9 +1779,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1716,12 +1857,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1818,6 +1965,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1938,6 +2103,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2058,6 +2226,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2091,6 +2268,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2259,6 +2442,15 @@ 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 ""
@@ -2268,6 +2460,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2361,6 +2562,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2394,6 +2607,21 @@ 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 ""
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2483,9 +2714,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2576,9 +2792,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,9 +2813,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,49 +2837,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,76 +2867,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,13 +2927,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2954,7 +3104,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2996,6 +3146,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3146,12 +3293,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3269,6 +3425,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3296,12 +3455,18 @@ 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 ""
@@ -3344,7 +3509,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3395,10 +3566,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3757,9 +3928,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3787,6 +3955,9 @@ 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 erase this build?"
msgstr ""
@@ -4048,12 +4219,6 @@ msgstr[1] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5028,6 +5235,26 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5688,7 +5915,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5703,6 +5930,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6036,21 +6266,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7325,16 +7594,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7349,6 +7642,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7391,6 +7729,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7430,6 +7771,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7451,6 +7795,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8245,10 +8577,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8302,6 +8637,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8314,6 +8652,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8329,6 +8670,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,13 +8991,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8647,7 +9024,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8689,6 +9066,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8722,6 +9102,18 @@ 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 ""
@@ -8886,7 +9278,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 ""
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9261,9 +9682,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9318,6 +9736,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9429,6 +9856,15 @@ 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 ""
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9660,6 +10093,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9678,9 +10114,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9690,19 +10123,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9717,10 +10150,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9735,7 +10165,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9756,10 +10186,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9768,7 +10204,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10047,18 +10482,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,7 +10710,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11048,19 +11468,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
-msgstr ""
-
-msgid "Enter the issue title"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11345,6 +11759,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11369,6 +11786,12 @@ 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 ""
@@ -11396,6 +11819,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11423,6 +11849,9 @@ 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 ""
@@ -11447,9 +11876,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11882,6 +12320,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11915,6 +12356,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12038,10 +12482,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12068,6 +12512,12 @@ 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 ""
@@ -12104,9 +12554,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,10 +12602,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12826,6 +13279,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12856,7 +13345,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12934,9 +13423,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13096,6 +13585,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13135,6 +13627,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13144,6 +13639,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13291,6 +13801,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13330,6 +13840,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13828,6 +14344,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14630,6 +15164,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15703,96 +16240,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16078,9 +16543,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ 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 ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ 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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16972,6 +17518,9 @@ 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 ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] ""
msgstr[1] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17085,6 +17640,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17118,6 +17676,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17169,9 +17730,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17181,6 +17739,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19590,6 +20253,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19737,6 +20406,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19788,6 +20466,9 @@ 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 ""
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ 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."
+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."
@@ -20552,7 +21257,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20579,10 +21290,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20651,6 +21362,9 @@ 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 ""
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20762,6 +21473,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21077,6 +21809,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21284,9 +22028,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21308,10 +22049,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,10 +22154,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ 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 ""
@@ -21665,6 +22415,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21923,21 +22685,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21959,6 +22739,12 @@ 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 ""
@@ -22067,6 +22853,9 @@ 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 ""
@@ -22151,24 +22940,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22205,6 +22976,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22562,6 +23336,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22790,10 +23567,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22805,7 +23579,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,13 +23672,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22937,13 +23714,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22970,16 +23750,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,52 +23816,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23381,6 +24164,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23396,6 +24188,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23408,22 +24206,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23432,6 +24230,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23522,9 +24326,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23675,7 +24476,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23771,7 +24572,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24072,6 +24921,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24243,6 +25098,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,7 +25269,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25595,7 +26480,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25721,6 +26612,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,10 +26627,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,19 +26744,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26161,7 +27062,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26338,6 +27239,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] ""
msgstr[1] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27287,9 +28194,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27479,12 +28383,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27989,67 +28896,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28136,6 +29043,12 @@ 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 ""
@@ -28145,7 +29058,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ 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 ""
@@ -29076,12 +30004,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29112,10 +30046,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29157,7 +30091,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29574,6 +30505,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30382,10 +31325,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30735,6 +31675,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30756,10 +31699,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31308,6 +32266,12 @@ 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|Packages"
msgstr ""
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ 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 ""
@@ -31653,6 +32713,9 @@ 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 ""
@@ -31668,6 +32731,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ 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 ""
@@ -31752,6 +32824,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31912,9 +32990,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32032,6 +33107,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,10 +33847,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32832,9 +33943,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ 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 ""
@@ -33120,6 +34237,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33237,6 +34357,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33642,6 +34762,9 @@ 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 profile"
msgstr ""
@@ -33699,6 +34822,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 ""
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34215,6 +35350,9 @@ 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 ""
@@ -34354,6 +35492,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34698,7 +35836,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35128,6 +36272,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/fi_FI/gitlab.po b/locale/fi_FI/gitlab.po
index 63fd9f90d65..9b6f1a881cc 100644
--- a/locale/fi_FI/gitlab.po
+++ b/locale/fi_FI/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: fi\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:57\n"
+"PO-Revision-Date: 2021-03-05 23:55\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -170,6 +173,11 @@ 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] ""
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ 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 ""
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -682,6 +710,15 @@ 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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -976,6 +1016,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -988,9 +1031,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1015,9 +1055,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1111,6 +1148,11 @@ 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] ""
@@ -1162,6 +1204,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1282,6 +1327,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1635,9 +1779,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1716,12 +1857,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1818,6 +1965,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1938,6 +2103,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2058,6 +2226,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2091,6 +2268,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2259,6 +2442,15 @@ 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 ""
@@ -2268,6 +2460,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2361,6 +2562,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2394,6 +2607,21 @@ 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 ""
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2483,9 +2714,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2576,9 +2792,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,9 +2813,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,49 +2837,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,76 +2867,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,13 +2927,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2954,7 +3104,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2996,6 +3146,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3146,12 +3293,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3269,6 +3425,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3296,12 +3455,18 @@ 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 ""
@@ -3344,7 +3509,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3395,10 +3566,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3757,9 +3928,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3787,6 +3955,9 @@ 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 erase this build?"
msgstr ""
@@ -4048,12 +4219,6 @@ msgstr[1] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5028,6 +5235,26 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5688,7 +5915,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5703,6 +5930,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6036,21 +6266,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7325,16 +7594,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7349,6 +7642,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7391,6 +7729,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7430,6 +7771,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7451,6 +7795,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8245,10 +8577,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8302,6 +8637,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8314,6 +8652,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8329,6 +8670,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,13 +8991,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8647,7 +9024,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8689,6 +9066,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8722,6 +9102,18 @@ 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 ""
@@ -8886,7 +9278,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 ""
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9261,9 +9682,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9318,6 +9736,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9429,6 +9856,15 @@ 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 ""
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9660,6 +10093,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9678,9 +10114,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9690,19 +10123,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9717,10 +10150,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9735,7 +10165,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9756,10 +10186,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9768,7 +10204,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10047,18 +10482,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,7 +10710,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11048,19 +11468,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
-msgstr ""
-
-msgid "Enter the issue title"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11345,6 +11759,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11369,6 +11786,12 @@ 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 ""
@@ -11396,6 +11819,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11423,6 +11849,9 @@ 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 ""
@@ -11447,9 +11876,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11882,6 +12320,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11915,6 +12356,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12038,10 +12482,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12068,6 +12512,12 @@ 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 ""
@@ -12104,9 +12554,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,10 +12602,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12826,6 +13279,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12856,7 +13345,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12934,9 +13423,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13096,6 +13585,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13135,6 +13627,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13144,6 +13639,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13291,6 +13801,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13330,6 +13840,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13828,6 +14344,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14630,6 +15164,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15703,96 +16240,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16078,9 +16543,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ 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 ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ 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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16972,6 +17518,9 @@ 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 ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] ""
msgstr[1] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17085,6 +17640,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17118,6 +17676,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17169,9 +17730,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17181,6 +17739,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19590,6 +20253,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19737,6 +20406,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19788,6 +20466,9 @@ 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 ""
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ 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."
+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."
@@ -20552,7 +21257,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20579,10 +21290,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20651,6 +21362,9 @@ 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 ""
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20762,6 +21473,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21077,6 +21809,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21284,9 +22028,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21308,10 +22049,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,10 +22154,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ 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 ""
@@ -21665,6 +22415,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21923,21 +22685,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21959,6 +22739,12 @@ 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 ""
@@ -22067,6 +22853,9 @@ 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 ""
@@ -22151,24 +22940,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22205,6 +22976,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22562,6 +23336,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22790,10 +23567,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22805,7 +23579,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,13 +23672,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22937,13 +23714,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22970,16 +23750,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,52 +23816,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23381,6 +24164,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23396,6 +24188,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23408,22 +24206,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23432,6 +24230,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23522,9 +24326,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23675,7 +24476,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23771,7 +24572,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24072,6 +24921,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24243,6 +25098,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,7 +25269,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25595,7 +26480,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25721,6 +26612,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,10 +26627,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,19 +26744,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26161,7 +27062,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26338,6 +27239,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] ""
msgstr[1] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27287,9 +28194,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27479,12 +28383,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27989,67 +28896,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28136,6 +29043,12 @@ 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 ""
@@ -28145,7 +29058,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ 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 ""
@@ -29076,12 +30004,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29112,10 +30046,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29157,7 +30091,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29574,6 +30505,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30382,10 +31325,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30735,6 +31675,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30756,10 +31699,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31308,6 +32266,12 @@ 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|Packages"
msgstr ""
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ 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 ""
@@ -31653,6 +32713,9 @@ 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 ""
@@ -31668,6 +32731,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ 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 ""
@@ -31752,6 +32824,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31912,9 +32990,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32032,6 +33107,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,10 +33847,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32832,9 +33943,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ 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 ""
@@ -33120,6 +34237,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33237,6 +34357,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33642,6 +34762,9 @@ 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 profile"
msgstr ""
@@ -33699,6 +34822,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 ""
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34215,6 +35350,9 @@ 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 ""
@@ -34354,6 +35492,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34698,7 +35836,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35128,6 +36272,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/fil_PH/gitlab.po b/locale/fil_PH/gitlab.po
index e9762d9d6eb..ec8d585fff0 100644
--- a/locale/fil_PH/gitlab.po
+++ b/locale/fil_PH/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: fil\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:08\n"
+"PO-Revision-Date: 2021-03-05 23:51\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -170,6 +173,11 @@ 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] ""
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ 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 ""
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -682,6 +710,15 @@ 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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -976,6 +1016,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -988,9 +1031,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1015,9 +1055,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1111,6 +1148,11 @@ 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] ""
@@ -1162,6 +1204,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1282,6 +1327,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1635,9 +1779,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1716,12 +1857,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1818,6 +1965,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1938,6 +2103,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2058,6 +2226,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2091,6 +2268,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2259,6 +2442,15 @@ 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 ""
@@ -2268,6 +2460,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2361,6 +2562,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2394,6 +2607,21 @@ 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 ""
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2483,9 +2714,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2576,9 +2792,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,9 +2813,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,49 +2837,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,76 +2867,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,13 +2927,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2954,7 +3104,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2996,6 +3146,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3146,12 +3293,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3269,6 +3425,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3296,12 +3455,18 @@ 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 ""
@@ -3344,7 +3509,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3395,10 +3566,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3757,9 +3928,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3787,6 +3955,9 @@ 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 erase this build?"
msgstr ""
@@ -4048,12 +4219,6 @@ msgstr[1] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5028,6 +5235,26 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5688,7 +5915,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5703,6 +5930,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6036,21 +6266,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7325,16 +7594,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7349,6 +7642,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7391,6 +7729,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7430,6 +7771,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7451,6 +7795,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8245,10 +8577,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8302,6 +8637,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8314,6 +8652,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8329,6 +8670,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,13 +8991,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8647,7 +9024,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8689,6 +9066,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8722,6 +9102,18 @@ 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 ""
@@ -8886,7 +9278,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 ""
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9261,9 +9682,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9318,6 +9736,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9429,6 +9856,15 @@ 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 ""
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9660,6 +10093,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9678,9 +10114,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9690,19 +10123,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9717,10 +10150,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9735,7 +10165,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9756,10 +10186,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9768,7 +10204,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10047,18 +10482,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,7 +10710,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11048,19 +11468,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
-msgstr ""
-
-msgid "Enter the issue title"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11345,6 +11759,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11369,6 +11786,12 @@ 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 ""
@@ -11396,6 +11819,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11423,6 +11849,9 @@ 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 ""
@@ -11447,9 +11876,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11882,6 +12320,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11915,6 +12356,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12038,10 +12482,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12068,6 +12512,12 @@ 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 ""
@@ -12104,9 +12554,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,10 +12602,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12826,6 +13279,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12856,7 +13345,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12934,9 +13423,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13096,6 +13585,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13135,6 +13627,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13144,6 +13639,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13291,6 +13801,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13330,6 +13840,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13828,6 +14344,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14630,6 +15164,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15703,96 +16240,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16078,9 +16543,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ 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 ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ 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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16972,6 +17518,9 @@ 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 ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] ""
msgstr[1] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17085,6 +17640,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17118,6 +17676,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17169,9 +17730,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17181,6 +17739,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19590,6 +20253,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19737,6 +20406,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19788,6 +20466,9 @@ 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 ""
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ 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."
+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."
@@ -20552,7 +21257,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20579,10 +21290,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20651,6 +21362,9 @@ 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 ""
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20762,6 +21473,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21077,6 +21809,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21284,9 +22028,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21308,10 +22049,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,10 +22154,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ 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 ""
@@ -21665,6 +22415,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21923,21 +22685,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21959,6 +22739,12 @@ 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 ""
@@ -22067,6 +22853,9 @@ 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 ""
@@ -22151,24 +22940,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22205,6 +22976,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22562,6 +23336,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22790,10 +23567,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22805,7 +23579,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,13 +23672,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22937,13 +23714,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22970,16 +23750,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,52 +23816,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23381,6 +24164,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23396,6 +24188,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23408,22 +24206,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23432,6 +24230,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23522,9 +24326,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23675,7 +24476,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23771,7 +24572,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24072,6 +24921,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24243,6 +25098,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,7 +25269,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25595,7 +26480,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25721,6 +26612,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,10 +26627,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,19 +26744,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26161,7 +27062,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26338,6 +27239,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] ""
msgstr[1] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27287,9 +28194,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27479,12 +28383,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27989,67 +28896,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28136,6 +29043,12 @@ 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 ""
@@ -28145,7 +29058,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ 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 ""
@@ -29076,12 +30004,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29112,10 +30046,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29157,7 +30091,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29574,6 +30505,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30382,10 +31325,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30735,6 +31675,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30756,10 +31699,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31308,6 +32266,12 @@ 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|Packages"
msgstr ""
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ 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 ""
@@ -31653,6 +32713,9 @@ 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 ""
@@ -31668,6 +32731,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ 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 ""
@@ -31752,6 +32824,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31912,9 +32990,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32032,6 +33107,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,10 +33847,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32832,9 +33943,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ 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 ""
@@ -33120,6 +34237,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33237,6 +34357,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33642,6 +34762,9 @@ 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 profile"
msgstr ""
@@ -33699,6 +34822,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 ""
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34215,6 +35350,9 @@ 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 ""
@@ -34354,6 +35492,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34698,7 +35836,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35128,6 +36272,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/fr/gitlab.po b/locale/fr/gitlab.po
index 9b221f09e48..ca49fad5606 100644
--- a/locale/fr/gitlab.po
+++ b/locale/fr/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: fr\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:55\n"
+"PO-Revision-Date: 2021-03-05 23:53\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr " ou des références (par exemple chemin/vers/projet!merge_request_id)"
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr "\"%{path}\" n'existait pas sur \"%{ref}\""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -170,6 +173,11 @@ 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] ""
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ 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 ""
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -682,6 +710,15 @@ msgstr[1] ""
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr "%{number_commits_behind} commits de retard sur %{default_branch}, %{number_commits_ahead} commits d’avance"
+msgid "%{oneMonthAgo} - %{today}"
+msgstr ""
+
+msgid "%{oneWeekAgo} - %{today}"
+msgstr ""
+
+msgid "%{oneYearAgo} - %{today}"
+msgstr ""
+
msgid "%{openOrClose} %{noteable}"
msgstr "%{openOrClose} %{noteable}"
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -976,6 +1016,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -988,9 +1031,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1015,9 +1055,6 @@ msgstr "+ %{moreCount} de plus"
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1111,6 +1148,11 @@ 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] "Un groupe"
@@ -1162,6 +1204,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr "1ʳᵉ contribution !"
@@ -1282,6 +1327,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1635,9 +1779,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr "Ajouter une liste à puces"
@@ -1716,12 +1857,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1818,6 +1965,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1938,6 +2103,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2058,6 +2226,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2091,6 +2268,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
msgstr "Spécifiez un domaine à utiliser par défaut pour les étapes Auto Review Apps et Auto Deploy de chaque projet."
+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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2259,6 +2442,15 @@ 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 ""
@@ -2268,6 +2460,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2361,6 +2562,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2394,6 +2607,21 @@ 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 ""
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr "Autorisations avancées, stockage de fichiers volumineux et paramètres d’authentification à double facteur."
@@ -2483,9 +2714,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2576,9 +2792,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,9 +2813,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,49 +2837,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,76 +2867,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
-msgstr ""
-
-msgid "AlertSettings|There was an error updating the alert settings."
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,13 +2927,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2954,7 +3104,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2996,6 +3146,9 @@ msgstr "Vous permet d’ajouter et de gérer des grappes de serveurs Kubernetes.
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr "Une erreur est survenue"
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3146,12 +3293,18 @@ msgstr "Une erreur s’est produite lors de la révocation de l’alerte. Actual
msgid "An error occurred while dismissing the feature highlight. Refresh the page and try dismissing again."
msgstr "Une erreur s’est produite lors du rejet de la mise en avant de la fonctionnalité. Actualisez la page et essayez de la rejeter à nouveau."
+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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr "Une erreur s’est produite lors de la prévisualisation markdown"
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr "Une erreur est survenue lors de la récupération des commentaires en attente"
@@ -3269,6 +3425,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3296,12 +3455,18 @@ 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 "Une erreur s’est produite lors de la requête."
@@ -3344,8 +3509,11 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
-msgstr "Une erreur s’est produite lors de l’enregistrement des destinataires"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
+msgstr ""
msgid "An error occurred while subscribing to notifications."
msgstr "Une erreur est survenue lors de l’abonnement aux notifications."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3395,10 +3566,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr "Une erreur est survenue. Merci de réessayer."
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3757,9 +3928,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3787,6 +3955,9 @@ 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 erase this build?"
msgstr "Êtesâ€vous sûr(e) de vouloir supprimer cette construction ?"
@@ -4048,12 +4219,6 @@ msgstr[1] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr "Événements d’audit"
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 "Importation d’un serveur Bitbucket"
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr "Nom de la branche"
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr "Rechercher les branches"
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr "Changer de branche"
-
msgid "Branches"
msgstr "Branches"
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr "Métriques commerciales (personnalisées)"
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5028,6 +5235,26 @@ msgstr "Intégration et livraison continues pour dépôt externe"
msgid "CI/CD settings"
msgstr "Paramètres de l’intégration et de la livraison continues"
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr "Annuler"
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr "Picorer dans la branche"
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr "Défaire dans la branche"
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr "Vérification de la disponibilité de %{text}…"
@@ -5688,7 +5915,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr "Choisissez le groupe de premier niveau pour vos importations dans le dépôt."
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5703,6 +5930,9 @@ msgstr "Choisissez quels dépôts vous voulez connecter pour exécuter des pipel
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr "annulé"
@@ -6036,21 +6266,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7325,17 +7594,41 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr "%{source_branch} et %{target_branch} sont identiques."
-msgid "CompareBranches|Compare"
-msgstr "Comparer"
+msgid "CompareBranches|There isn't anything to compare."
+msgstr "Il n’y a rien à comparer."
-msgid "CompareBranches|Source"
-msgstr "Source"
+msgid "CompareRevisions|Branches"
+msgstr ""
-msgid "CompareBranches|Target"
-msgstr "Cible"
+msgid "CompareRevisions|Compare"
+msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
-msgstr "Il n’y a rien à comparer."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
+msgstr ""
msgid "Complete"
msgstr ""
@@ -7349,6 +7642,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7391,6 +7729,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7430,6 +7771,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr "Configurer les délais d’expiration de Gitaly."
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7451,6 +7795,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8245,12 +8577,12 @@ 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 "Créer une nouvelle branche"
-msgid "Create a new deploy key for this project"
-msgstr ""
-
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr "Créer une branche"
@@ -8302,6 +8637,9 @@ msgstr "Créer un fichier"
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr "Créer un groupe"
@@ -8314,6 +8652,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr "Créer des listes à partir d’étiquettes. Les tickets avec l’étiquette sélectionnée apparaissent dans cette liste."
@@ -8329,6 +8670,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,14 +8991,14 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
-msgstr "Profil"
+msgid "CurrentUser|One of your groups is running out"
+msgstr ""
-msgid "CurrentUser|Settings"
-msgstr "Paramètres"
+msgid "CurrentUser|Preferences"
+msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
@@ -8647,8 +9024,8 @@ msgstr ""
msgid "Custom notification events"
msgstr "Événements de notification personnalisés"
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
-msgstr "Les niveaux de notification personnalisés sont similaires aux niveaux de participation. Cependant, ils permettent de recevoir également des notifications pour une sélection d’événements. Pour plus d’information, vous pouvez consulter %{notification_link}."
+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 "Modèles de projets personnalisés"
@@ -8689,6 +9066,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr "Personnaliser les couleurs"
@@ -8722,6 +9102,18 @@ 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 ""
@@ -8886,7 +9278,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 ""
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr "Déboguer"
@@ -9261,9 +9682,6 @@ msgstr "Refuser et se déconnecter"
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr "Branche par défaut"
-
msgid "Default CI configuration path"
msgstr ""
@@ -9318,6 +9736,9 @@ msgstr "Définir un schéma personnalisé avec une syntaxe Cron"
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr "différé"
msgid "Delete"
msgstr "Supprimer"
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9429,6 +9856,15 @@ 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 "Supprimé"
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr "+%{count} autres"
@@ -9660,6 +10093,9 @@ msgstr "Erreur lors de la suppression de la clef de déploiement"
msgid "DeployKeys|Expand %{count} other projects"
msgstr "Afficher %{count} autres projets"
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr "Chargement des clefs de déploiement"
@@ -9678,9 +10114,6 @@ msgstr "Clefs de déploiement à accès publique"
msgid "DeployKeys|Read access only"
msgstr "Accès en lecture seule"
-msgid "DeployKeys|Write access allowed"
-msgstr "Accès en écriture autorisé"
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr "Vous êtes sur le point de supprimer cette clef de déploiement. Êtesâ€vous sûr·e ?"
@@ -9690,19 +10123,19 @@ msgstr "Jetons de déploiement actifs : (%{active_tokens})"
msgid "DeployTokens|Add a deploy token"
msgstr "Ajouter un jeton de déploiement"
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
-msgstr "Autorise l’accès en lecture seule aux images du registre"
+msgid "DeployTokens|Allows read-only access to registry images."
+msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
-msgstr "Autorise l’accès en lecture seule au dépôt"
+msgid "DeployTokens|Allows read-only access to the repository."
+msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9717,12 +10150,9 @@ msgstr "Créer un jeton de déploiement"
msgid "DeployTokens|Created"
msgstr "Créé"
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
+msgid "DeployTokens|Deploy tokens"
msgstr ""
-msgid "DeployTokens|Deploy Tokens"
-msgstr "Jetons de déploiement"
-
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
msgstr ""
@@ -9735,8 +10165,8 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr "Nom"
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
-msgstr "Choisissez un nom pour l’application et nous vous donnerons un jeton de déploiement unique."
+msgid "DeployTokens|Pick a name for your unique deploy token."
+msgstr ""
msgid "DeployTokens|Revoke"
msgstr "Révoquer"
@@ -9756,11 +10186,17 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr "Cette action ne peut pas être annulée."
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
-msgstr "Utilisez ce jeton en tant que mot de passe. Assurezâ€vous de le sauvegarder, vous n’aurez pas la possibilité d’y accéder à nouveau."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
+msgstr ""
+
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
-msgid "DeployTokens|Use this username as a login."
-msgstr "Utiliser ce nom d’utilisateur comme identifiant."
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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 "Nom d’utilisateur"
@@ -9768,8 +10204,8 @@ msgstr "Nom d’utilisateur"
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
-msgstr "Votre nouveau jeton de déploiement"
+msgid "DeployTokens|Your new Deploy Token username"
+msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
msgstr ""
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10047,18 +10482,6 @@ msgstr "Détecter les clefs de l’hôte"
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,7 +10710,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr "Courriels"
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11048,20 +11468,14 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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."
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the issue description"
-msgstr "Entrez la description du problème"
-
-msgid "Enter the issue title"
-msgstr "Entrez l’intitulé du ticket"
-
-msgid "Enter the merge request description"
-msgstr "Entrez la description de la demande de fusion"
+msgid "Enter the %{name} title"
+msgstr ""
-msgid "Enter the merge request title"
-msgstr "Entrez l’intitulé de la demande de fusion"
+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 name of your application, and we'll return a unique %{type}."
msgstr ""
@@ -11345,6 +11759,9 @@ msgstr "protégé"
msgid "Epic"
msgstr "Épopée"
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11369,6 +11786,12 @@ msgstr "Les épopées vous permettent de gérer votre portefeuille de projets pl
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 ""
@@ -11396,6 +11819,9 @@ msgstr "Comment puisâ€je résoudre ceci ?"
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11423,6 +11849,9 @@ 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 ""
@@ -11447,9 +11876,6 @@ 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 "Afin de planifier la date de %{epicDateType} de votre épopée en fonction des jalons, attribuez un jalon avec une date de %{epicDateType} à tous les tickets concernant l’épopée."
-msgid "Epics|Unable to perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11882,6 +12320,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11915,6 +12356,9 @@ msgstr "Explorer les groupes publics"
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12038,10 +12482,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12068,6 +12512,12 @@ msgstr "Échec du déploiement sur"
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 ""
@@ -12104,9 +12554,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,10 +12602,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr "Échec de la signature via authentification par carte à puce"
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr "Échec de la mise à jour du ticket. Veuillez réessayer."
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr "Indicateurs de fonctionnalités"
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr "Importation de FogBugz"
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr "Couleur de la police"
@@ -12826,6 +13279,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr "Divergence issue de"
@@ -12856,8 +13345,8 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
-msgstr "Essai gratuit de GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
+msgstr ""
msgid "Freeze end"
msgstr ""
@@ -12934,9 +13423,6 @@ msgstr "Geo"
msgid "Geo Nodes"
msgstr "NÅ“uds Geo"
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13096,6 +13585,9 @@ msgstr "%{name} est programmé pour la reâ€synchronisation"
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13135,6 +13627,9 @@ msgstr "Impossible de supprimer l’entrée de suivi d’un projet existant."
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr "En échec"
@@ -13144,6 +13639,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr "État de Geo"
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr "Dernière tentative de synchro"
msgid "Geo|Last time verified"
msgstr "Dernière vérification"
+msgid "Geo|Learn more about Geo"
+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 "Jamais"
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr "Statut"
@@ -13291,6 +13801,9 @@ msgstr "Vérification en échec — %{error}"
msgid "Geo|Waiting for scheduler"
msgstr "En attente de planification"
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13330,6 +13840,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr "Importation de GitHub"
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr "Graphique"
@@ -13828,6 +14344,9 @@ msgstr "Le SAML de groupe doit être activé afin de pouvoir tester"
msgid "Group URL"
msgstr "URL du groupe"
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr "Avatar de groupe"
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr "Rechercher par nom"
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14630,6 +15164,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15703,96 +16240,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16078,9 +16543,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ msgstr "Tickets clos"
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 ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ 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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16972,6 +17518,9 @@ msgstr "Les étiquettes peuvent être appliquées aux tickets et aux demandes de
msgid "Labels can be applied to issues and merge requests."
msgstr "Les étiquettes peuvent être appliquées aux tickets et aux demandes de fusion."
+msgid "Labels with no issues in this iteration:"
+msgstr ""
+
msgid "Labels|%{spanStart}Promote label%{spanEnd} %{labelTitle} %{spanStart}to Group Label?%{spanEnd}"
msgstr ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] "Le dernier %d jour"
msgstr[1] "Les %d derniers jours"
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17085,6 +17640,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17118,6 +17676,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17169,9 +17730,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr "Apprenezâ€en plus dans la"
@@ -17181,6 +17739,96 @@ msgstr "documentation sur la programmation de pipelines"
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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr "Quitter"
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr "Lister les dépôts disponibles"
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr "Niveau d’accès maximum"
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr "Approbations de la demande de fusion"
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr "Une erreur est survenue lors de l’enregistrement du brouillon du comme
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr "Les plus étoilés"
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr "Déplacer"
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr "Déplacer le ticket"
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr "Nouvelle branche"
@@ -19590,6 +20253,9 @@ msgstr ""
msgid "New directory"
msgstr "Nouveau dossier"
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr "Nouvelle étiquette"
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr "Nouvelle demande de fusion"
@@ -19737,6 +20406,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr "Aucune connexion n’a pu être établie avec un serveur Gitaly, veuillez vérifier votre journal !"
@@ -19788,6 +20466,9 @@ msgstr ""
msgid "No due date"
msgstr "Aucune date d’échéance"
+msgid "No email participants were added. Either none were provided, or they already exist."
+msgstr ""
+
msgid "No endpoint provided"
msgstr ""
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr "Remarque : Envisagez de demander à votre administra·teur·trice GitLa
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr "Souhaitezâ€vous réellement annuler la création de ce commentaire ?"
msgid "Notes|Collapse replies"
msgstr "Réduire les réponses"
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr ""
msgid "Notification events"
msgstr "Événement de notifications"
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr "Fusionner la demande de fusion"
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr "Participer"
msgid "NotificationLevel|Watch"
msgstr "Surveiller"
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr "Notifications"
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ 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."
+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."
@@ -20552,7 +21257,7 @@ 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 Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr "Ouh là, êtesâ€vous sûr(e) ?"
msgid "Open"
msgstr "Ouvrir"
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20579,12 +21290,12 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
-msgstr "Ouvrir dans Xcode"
-
msgid "Open in file view"
msgstr ""
+msgid "Open in your IDE"
+msgstr ""
+
msgid "Open issues"
msgstr ""
@@ -20651,6 +21362,9 @@ msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr "Le tableau de bord des opérations fournit un résumé de l’état de santé opérationnel de chaque projet, comprenant les états des pipelines et des alertes."
+msgid "Optimize your workflow with CI/CD Pipelines"
+msgstr ""
+
msgid "Optional"
msgstr ""
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20762,6 +21473,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr "Paquets"
@@ -21077,6 +21809,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21284,9 +22028,6 @@ msgstr "Planification de pipeline"
msgid "Pipeline Schedules"
msgstr "Planifications de pipelines"
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21308,10 +22049,10 @@ msgstr "Déclencheurs de pipeline"
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr "Graphiques des pipelines"
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr "Pipelines de l’année dernière"
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,12 +22154,12 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr "Vider les caches des exécuteurs"
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
-msgstr "L’intégration continue peut aider à détecter les bogues en exécutant vos tests automatiquement, tandis que la livraison continue peut vous aider à déployer du code dans votre environnement de production."
-
msgid "Pipelines|Copy trigger token"
msgstr ""
+msgid "Pipelines|Could not load merged YAML content"
+msgstr ""
+
msgid "Pipelines|Description"
msgstr ""
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-msgstr "Premiers pas avec les pipelines"
-
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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr "Chargement des pipelines"
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr "Il n’y a actuellement aucun pipeline."
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr "Une erreur est survenue lors de la récupération des pipelines. Réessayez dans quelques instants ou contactez votre équipe d’assistance."
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ msgstr ""
msgid "Pipeline|Pipeline"
msgstr "Pipeline"
+msgid "Pipeline|Pipeline %{idStart}#%{idEnd} %{statusStart}%{statusEnd} for %{commitStart}%{commitEnd}"
+msgstr ""
+
+msgid "Pipeline|Pipeline cannot be run."
+msgstr ""
+
msgid "Pipeline|Pipelines"
msgstr ""
@@ -21665,6 +22415,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr "Variables"
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr "Vous êtes sur le point d’arrêter le pipeline %{pipelineId}."
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ msgstr ""
msgid "Please select at least one filter to see results"
msgstr "Veuillez sélectionner au moins un filtre pour voir les résultats"
+msgid "Please select what should be included in each exported requirement."
+msgstr ""
+
msgid "Please set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr "Veuillez résoudre le reCAPTCHA"
@@ -21923,21 +22685,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21959,6 +22739,12 @@ 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 ""
@@ -22067,6 +22853,9 @@ msgstr "Étiquette prioritaire"
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 ""
@@ -22151,24 +22940,6 @@ msgstr "Profil"
msgid "Profile Settings"
msgstr "Paramètres du profil"
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22205,6 +22976,9 @@ msgstr "Ajouter une clef"
msgid "Profiles|Add status emoji"
msgstr "Ajouter un émoji de statut"
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr "Rogneur d’avatar"
@@ -22562,6 +23336,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr "URL du projet"
@@ -22790,10 +23567,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22805,7 +23579,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr "Badges numériques"
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr "Contactez un administrateur pour modifier ce paramètre."
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,13 +23672,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22937,13 +23714,16 @@ msgstr "Seuls les commits signés peuvent être poussés sur ce dépôt Git."
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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22970,16 +23750,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,52 +23816,49 @@ msgstr "Ce paramètre s’applique au niveau du serveur, mais il a été outrepa
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr "Ce paramètre s’appliquera à tous les projets à moins qu’un administrateur ou une administratrice ne l’outrepasse sur certains projets."
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer project"
msgstr ""
+msgid "ProjectSettings|Users can copy the repository to a new project."
+msgstr ""
+
msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr "Les utilisateurs et utilisatrices ne peuvent uniquement pousser sur ce dépôt que des commits qui ont été effectués avec une de leurs adresses de courriel vérifiées."
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When conflicts arise 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 "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr "Actif"
msgid "PrometheusService|Auto configuration"
msgstr "Configuration automatique"
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
-msgstr "Déployer et configurer automatiquement Prometheus sur vos grappes de serveurs pour surveiller les environnements de vos projets"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
+msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr "Métriques communes"
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr "Les métriques courantes sont automatiquement supervisées grâce à une bibliothèque de métriques provenant d’exportateurs populaires."
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr "Métriques personnalisées"
@@ -23381,6 +24164,15 @@ msgstr "Recherche et configuration des métriques en cours…"
msgid "PrometheusService|Finding custom metrics..."
msgstr "Recherche des métriques personnalisées en cours…"
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr "Installer Prometheus sur les grappes de serveurs"
@@ -23396,6 +24188,12 @@ msgstr "Métriques"
msgid "PrometheusService|Missing environment variable"
msgstr "Variable d’environnement manquante"
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr "Plus d’informations"
@@ -23408,23 +24206,23 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
-msgstr "URL de base de l’API Prometheus, telle que http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgstr ""
+
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
-msgstr "Prometheus est géré automatiquement sur vos grappes de serveurs"
+msgid "PrometheusService|The Prometheus API base URL."
+msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+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 "Ces métriques ne seront supervisées qu’après votre premier déploiement dans un environnement"
-msgid "PrometheusService|Time-series monitoring service"
-msgstr "Service de supervision de séries temporelles"
-
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
-msgstr "Pour activer l’installation de Prometheus sur vos grappes de serveurs, désactivez la configuration manuelle ciâ€dessous"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
msgstr "En attente de votre premier déploiement dans un environnement pour trouver des métriques communes"
@@ -23432,6 +24230,12 @@ msgstr "En attente de votre premier déploiement dans un environnement pour trou
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr "Promouvoir"
@@ -23522,9 +24326,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr "Mise à niveau du forfait"
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr "Environnements protégés"
-
msgid "Protected Paths"
msgstr ""
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23675,8 +24476,8 @@ msgstr "Votre environnement a été protégé."
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr "Votre environnement a été déprotégé"
-msgid "Protip:"
-msgstr "Astuce :"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgstr ""
msgid "Protocol"
msgstr ""
@@ -23771,8 +24572,50 @@ msgstr ""
msgid "Push to create a project"
msgstr "Pousser pour créer un projet"
-msgid "PushRule|Committer restriction"
-msgstr "Restriction sur l’auteur des commits"
+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 "Poussé"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24072,6 +24921,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24243,6 +25098,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,7 +25269,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr "Répondez directement à ce courriel ou %{view_it_on_gitlab}."
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr "Actions"
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr "Classe"
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr "Demander l’accès"
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr "Rechercher des demandes de fusion"
@@ -25595,7 +26480,7 @@ msgstr "Secret"
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25721,6 +26612,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,10 +26627,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,19 +26744,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr "Sélectionner une branche ou une étiquette"
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr "Sélectionnez le projet afin de choisir la zone"
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26161,7 +27062,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26338,6 +27239,9 @@ msgstr "Définissez un mot de passe pour votre compte afin de pouvoir récupére
msgid "Set a template repository for projects in this group"
msgstr "Définir un modèle de dépôt pour les projets de ce groupe"
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] "Affichage de %d évènement"
msgstr[1] "Affichage de %d événements"
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr "Quelque chose s’est mal passé de notre côté. Veuillez réessayer."
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr "Une erreur est survenue lors de la tentative de modification de la confidentialité de ce ticket"
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr "Une erreur est survenue lors de la tentative de modification de l’état de verrouillage de ce·t·te %{issuableDisplayName}"
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr "Une erreur s’est produite lors de la « résolution » de la discussion. Veuillez réessayer."
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27287,9 +28194,6 @@ msgstr "Date d’inscription décroissante"
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27479,12 +28383,15 @@ msgstr "Créer une %{new_merge_request} avec ces changements"
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 "Démarrer une revue de code"
@@ -27989,67 +28896,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28136,6 +29043,12 @@ 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 ""
@@ -28145,7 +29058,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr "Conditions générales d’utilisation et politique de confidentialité"
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr "L’étape de pré-production indique le temps entre l’acceptation dâ€
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ 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 ""
@@ -29076,12 +30004,18 @@ msgstr "Il n’y a aucun ticket à afficher"
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr "Il n’y a pas encore d’étiquette"
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29112,10 +30046,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29157,7 +30091,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr "Une erreur s’est produite lors du chargement du calendrier d’activité des utilisateurs."
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr "Une erreur s’est produite lors de l’enregistrement de vos paramètres de notification."
-
msgid "There was an error subscribing to this label."
msgstr "Une erreur s’est produite lors de l’abonnement à cette étiquette."
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29574,6 +30505,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr "Astuce :"
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr "Titre"
@@ -30382,12 +31325,12 @@ 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 widen your search, change or remove filters."
msgstr "Afin d’élargir votre recherche, modifiez ou supprimez des filtres."
-msgid "To-Do"
-msgstr ""
-
msgid "To-Do List"
msgstr ""
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr "État du commutateur : Inactif"
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr "État du commutateur : Actif"
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr "Vue arborescente"
msgid "Trending"
msgstr "Tendance"
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr "Dépanner et surveiller votre application grâce au traçage"
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr "Veuillez réessayer"
@@ -30735,6 +31675,9 @@ msgstr "Essayez tout ce que GitLab peut vous offrir pendant 30 jours."
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30756,10 +31699,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31308,6 +32266,12 @@ 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|Packages"
msgstr ""
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr "Le service d’assistance (Service Desk) permet d’interagir avec vos utilisateurs (p. ex., pour offrir un support client) par courriel depuis GitLab"
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr "Utilisez une ligne par URI"
msgid "Use template"
msgstr "Utiliser ce modèle"
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ msgstr "Modifier le profil"
msgid "UserProfile|Explore public groups to find projects to contribute to."
msgstr ""
+msgid "UserProfile|Followers"
+msgstr ""
+
+msgid "UserProfile|Following"
+msgstr ""
+
msgid "UserProfile|Groups"
msgstr "Groupes"
@@ -31653,6 +32713,9 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr "S’abonner"
+msgid "UserProfile|This user doesn't have any followers."
+msgstr ""
+
msgid "UserProfile|This user doesn't have any personal projects"
msgstr ""
@@ -31668,6 +32731,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ msgstr "Tout afficher"
msgid "UserProfile|View user in admin area"
msgstr "Afficher l’utilisateur dans l’espace d’administration"
+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 ""
@@ -31752,6 +32824,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31912,9 +32990,6 @@ msgstr "Voir le fichier @ "
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32032,6 +33107,9 @@ msgstr "Inconnu"
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
+msgstr ""
+
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL must be percent-encoded if neccessary."
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,11 +33847,8 @@ msgstr "Supprimer la page"
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr "Supprimer la page %{pageTitle} ?"
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr "Quelqu’un a modifié la page en même temps que vous. Veuillez consulter %{page_link} et vérifiez que vos modifications ne suppriment pas involontairement les siennes."
-
-msgid "WikiPageConflictMessage|the page"
-msgstr "la page"
+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 "WikiPageCreate|Create %{pageTitle}"
msgstr ""
@@ -32832,9 +33943,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ 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 ""
@@ -33120,6 +34237,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr "Vous n’avez souscrit à aucun abonnement pour le moment"
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33237,6 +34357,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr "Vous avez atteint votre limite de projet"
+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 a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33642,6 +34762,9 @@ 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 profile"
msgstr ""
@@ -33699,6 +34822,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 ""
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34215,6 +35350,9 @@ 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 ""
@@ -34354,6 +35492,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] "demande de fusion"
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr "Veuillez la restaurer ou utiliser une autre branche %{missingBranchName}"
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr "Si la branche %{missingBranchName} existe dans votre dépôt local, vous
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr "Chargement des statistiques de déploiement"
@@ -34698,7 +35836,7 @@ msgstr "Les modifications n’ont pas été fusionnées dans"
msgid "mrWidget|The changes will be merged into"
msgstr "Les modifications seront fusionnées dans"
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr "pour être fusionnée automatiquement lorsque le pipeline réussit"
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr "courriels de notification"
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35128,6 +36272,12 @@ msgstr ""
msgid "this document"
msgstr "ce document"
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr "nom d’utilisateur"
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr "utilise les grappes de serveurs Kubernetes pour déployer votre code !"
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 839c249eb29..5b856762fc8 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -74,6 +74,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -117,6 +120,11 @@ 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] ""
@@ -170,6 +178,11 @@ 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] ""
@@ -345,6 +358,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +440,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +515,9 @@ 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 ""
@@ -545,6 +569,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -908,6 +935,9 @@ msgstr ""
msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
msgstr ""
+msgid "%{userLinkStart}%{user}%{linkEnd} created a %{mrLinkStart}merge request%{linkEnd}:"
+msgstr ""
+
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -968,6 +998,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -1006,9 +1039,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1141,6 +1171,16 @@ 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 request selected"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 merged merge request"
msgid_plural "%{merge_requests} merged merge requests"
msgstr[0] ""
@@ -1182,6 +1222,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1290,9 +1333,6 @@ msgstr ""
msgid "A file with '%{file_name}' already exists in %{branch} branch"
msgstr ""
-msgid "A fork is a copy of a project."
-msgstr ""
-
msgid "A group is a collection of several projects"
msgstr ""
@@ -1302,6 +1342,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1320,6 +1363,9 @@ msgstr ""
msgid "A merge request hasn't yet been merged"
msgstr ""
+msgid "A milestone list displays issues in the selected milestone."
+msgstr ""
+
msgid "A new Auto DevOps pipeline has been created, go to %{pipelines_link_start}Pipelines page%{pipelines_link_end} for details"
msgstr ""
@@ -1437,6 +1483,9 @@ msgstr ""
msgid "APIFuzzing|Ex: $TestUsername"
msgstr ""
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz"
+msgstr ""
+
msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
msgstr ""
@@ -1461,6 +1510,9 @@ msgstr ""
msgid "APIFuzzing|Password for basic authentication"
msgstr ""
+msgid "APIFuzzing|Postman collections are a group of saved requests you can organize into folders."
+msgstr ""
+
msgid "APIFuzzing|Scan mode"
msgstr ""
@@ -1838,6 +1890,9 @@ msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1898,6 +1953,9 @@ msgstr ""
msgid "Add to Slack"
msgstr ""
+msgid "Add to board"
+msgstr ""
+
msgid "Add to epic"
msgstr ""
@@ -1934,9 +1992,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1997,6 +2067,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -2057,6 +2130,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2297,6 +2373,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2390,6 +2469,15 @@ 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 ""
@@ -2399,6 +2487,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2498,6 +2589,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2531,6 +2634,21 @@ 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 ""
@@ -2746,43 +2864,16 @@ 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|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2794,9 +2885,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2806,76 +2894,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
-msgstr ""
-
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2887,13 +2954,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2917,7 +2984,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -3004,9 +3071,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -3109,6 +3173,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3163,6 +3230,9 @@ msgstr ""
msgid "An application called %{link_to_client} is requesting access to your GitLab account."
msgstr ""
+msgid "An assignee list displays issues assigned to the selected user"
+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 ""
@@ -3175,15 +3245,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while loading the notification settings. Please try again."
-msgstr ""
-
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3262,6 +3323,9 @@ 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 ""
@@ -3391,6 +3455,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3406,9 +3473,6 @@ msgstr ""
msgid "An error occurred while loading the file. Please try again later."
msgstr ""
-msgid "An error occurred while loading the members, please try again."
-msgstr ""
-
msgid "An error occurred while loading the merge request changes."
msgstr ""
@@ -3418,12 +3482,18 @@ 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 ""
@@ -3466,6 +3536,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
msgid "An error occurred while searching users."
msgstr ""
@@ -3505,6 +3578,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3517,9 +3593,6 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
-msgstr ""
-
msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
@@ -3762,6 +3835,9 @@ msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCoun
msgstr[0] ""
msgstr[1] ""
+msgid "ApprovalRule|Add approvers"
+msgstr ""
+
msgid "ApprovalRule|Approval rules"
msgstr ""
@@ -3771,6 +3847,9 @@ msgstr ""
msgid "ApprovalRule|Approvers"
msgstr ""
+msgid "ApprovalRule|Examples: QA, Security."
+msgstr ""
+
msgid "ApprovalRule|Name"
msgstr ""
@@ -3780,9 +3859,6 @@ msgstr ""
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|e.g. QA, Security, etc."
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -3882,9 +3958,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3912,6 +3985,9 @@ 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 erase this build?"
msgstr ""
@@ -3920,6 +3996,12 @@ 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 ""
@@ -3980,6 +4062,12 @@ 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 ""
@@ -4173,12 +4261,6 @@ msgstr[1] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4461,6 +4543,9 @@ msgstr ""
msgid "Average per day: %{average}"
msgstr ""
+msgid "AwardEmoji|No emojis found."
+msgstr ""
+
msgid "Back to page %{number}"
msgstr ""
@@ -4581,6 +4666,9 @@ msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
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 ""
@@ -4680,6 +4768,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4692,12 +4783,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4766,6 +4869,12 @@ 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 ""
@@ -4778,6 +4887,9 @@ 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 ""
@@ -5024,16 +5136,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -5048,7 +5172,7 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
-msgid "BulkImport|destination group cannot be part of the source group tree"
+msgid "BulkImport|You have no groups to import"
msgstr ""
msgid "BulkImport|expected an associated Group but has an associated Project"
@@ -5087,6 +5211,9 @@ msgstr ""
msgid "Busy"
msgstr ""
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -5105,6 +5232,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5117,15 +5247,6 @@ msgstr ""
msgid "CHANGELOG"
msgstr ""
-msgid "CI / CD"
-msgstr ""
-
-msgid "CI / CD Analytics"
-msgstr ""
-
-msgid "CI / CD Settings"
-msgstr ""
-
msgid "CI Lint"
msgstr ""
@@ -5144,6 +5265,12 @@ msgstr ""
msgid "CI/CD"
msgstr ""
+msgid "CI/CD Analytics"
+msgstr ""
+
+msgid "CI/CD Settings"
+msgstr ""
+
msgid "CI/CD configuration"
msgstr ""
@@ -5233,6 +5360,27 @@ msgstr ""
msgid "CPU"
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 "Callback URL"
msgstr ""
@@ -5311,6 +5459,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5608,6 +5759,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -6160,6 +6314,21 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
+msgid "Cloud License"
+msgstr ""
+
+msgid "CloudLicense|Activate"
+msgstr ""
+
+msgid "CloudLicense|Paste your activation code"
+msgstr ""
+
+msgid "CloudLicense|Paste your activation code below"
+msgstr ""
+
+msgid "CloudLicense|This instance is currently using the Core plan."
+msgstr ""
+
msgid "Cluster"
msgstr ""
@@ -6181,21 +6350,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6205,6 +6395,15 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
@@ -7291,6 +7490,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7476,15 +7678,6 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
-msgstr ""
-
-msgid "CompareBranches|Source"
-msgstr ""
-
-msgid "CompareBranches|Target"
-msgstr ""
-
msgid "CompareBranches|There isn't anything to compare."
msgstr ""
@@ -7500,12 +7693,21 @@ 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|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 updating the branch/tag list. Please try again."
msgstr ""
@@ -7545,15 +7747,33 @@ msgstr ""
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
msgstr ""
msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
msgstr ""
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
msgstr ""
@@ -7572,9 +7792,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
msgstr ""
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7587,6 +7813,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7626,6 +7855,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7789,9 +8021,6 @@ msgid_plural "ContainerRegistry|%{count} Tags"
msgstr[0] ""
msgstr[1] ""
-msgid "ContainerRegistry|%{imageName} tags"
-msgstr ""
-
msgid "ContainerRegistry|%{strongStart}Disabled%{strongEnd} - Tags will not be automatically deleted."
msgstr ""
@@ -7876,9 +8105,6 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
@@ -7897,6 +8123,9 @@ 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 ""
@@ -7962,6 +8191,9 @@ msgstr ""
msgid "ContainerRegistry|Remove these tags"
msgstr ""
+msgid "ContainerRegistry|Root image"
+msgstr ""
+
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -8346,10 +8578,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8385,6 +8617,9 @@ 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 "Country"
msgstr ""
@@ -8432,6 +8667,9 @@ 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 ""
@@ -8459,6 +8697,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8486,6 +8727,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8519,6 +8763,9 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8561,6 +8808,9 @@ msgstr ""
msgid "Create snippet"
msgstr ""
+msgid "Create tag %{tagName}"
+msgstr ""
+
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -8591,6 +8841,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8603,15 +8856,27 @@ msgstr ""
msgid "CreateValueStreamForm|Code stage start"
msgstr ""
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8660,6 +8925,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8765,6 +9033,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8849,9 +9120,6 @@ 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 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 %{notification_link}."
-msgstr ""
-
msgid "Custom project templates"
msgstr ""
@@ -8927,6 +9195,18 @@ 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 ""
@@ -9049,8 +9329,10 @@ msgstr ""
msgid "CycleAnalytics|Show"
msgstr ""
-msgid "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCount} labels"
-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 %{startDate} to %{endDate}"
msgstr ""
@@ -9145,6 +9427,9 @@ msgstr ""
msgid "DastProfiles|Authentication URL"
msgstr ""
+msgid "DastProfiles|Branch missing"
+msgstr ""
+
msgid "DastProfiles|Could not create the scanner profile. Please try again."
msgstr ""
@@ -9214,6 +9499,12 @@ 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 ""
@@ -9274,6 +9565,9 @@ 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 ""
@@ -9307,6 +9601,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Select branch"
+msgstr ""
+
msgid "DastProfiles|Show debug messages"
msgstr ""
@@ -9343,6 +9640,9 @@ msgstr ""
msgid "DastProfiles|URL"
msgstr ""
+msgid "DastProfiles|URLs to skip during the authenticated scan. Use regular expression syntax to match multiple URLs."
+msgstr ""
+
msgid "DastProfiles|Username"
msgstr ""
@@ -9582,6 +9882,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9639,6 +9942,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9663,6 +9969,15 @@ 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 ""
@@ -10053,6 +10368,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10272,6 +10592,9 @@ msgstr ""
msgid "Detect host keys"
msgstr ""
+msgid "DevOps Adoption"
+msgstr ""
+
msgid "DevOps Report"
msgstr ""
@@ -10290,10 +10613,10 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while removing the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
@@ -10389,6 +10712,9 @@ 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|Score"
msgstr ""
@@ -10500,7 +10826,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10703,6 +11029,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10901,9 +11230,6 @@ msgstr ""
msgid "Email address to use for Support Desk"
msgstr ""
-msgid "Email cannot be blank"
-msgstr ""
-
msgid "Email could not be sent"
msgstr ""
@@ -11090,6 +11416,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11663,9 +11992,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11840,6 +12166,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -12068,6 +12397,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -12140,6 +12472,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{name}"
+msgstr ""
+
msgid "Export %{requirementsCount} requirements?"
msgstr ""
@@ -12314,6 +12649,9 @@ msgstr ""
msgid "Failed to install."
msgstr ""
+msgid "Failed to load assignees."
+msgstr ""
+
msgid "Failed to load assignees. Please try again."
msgstr ""
@@ -12344,6 +12682,9 @@ 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 ""
@@ -12353,9 +12694,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12395,9 +12733,6 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
-msgid "Failed to remove issue from board, please try again."
-msgstr ""
-
msgid "Failed to remove mirror."
msgstr ""
@@ -12497,6 +12832,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12994,6 +13332,9 @@ msgstr ""
msgid "Follow"
msgstr ""
+msgid "Followed Users' Activity"
+msgstr ""
+
msgid "Followed users"
msgstr ""
@@ -13060,13 +13401,55 @@ msgstr ""
msgid "Fork project?"
msgstr ""
-msgid "ForkedFromProjectPath|Forked from"
+msgid "ForkProject|A fork is a copy of a project."
msgstr ""
-msgid "ForkedFromProjectPath|Forked from an inaccessible project"
+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|Private"
msgstr ""
-msgid "Forking a repository allows you to make changes without affecting the original project."
+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|Select a namespace to fork the project"
+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 "ForkedFromProjectPath|Forked from"
+msgstr ""
+
+msgid "ForkedFromProjectPath|Forked from an inaccessible project"
msgstr ""
msgid "Forking in progress"
@@ -13168,9 +13551,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -13183,6 +13563,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13330,6 +13713,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13369,6 +13755,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13378,9 +13767,15 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
+msgid "Geo|Health Status"
+msgstr ""
+
msgid "Geo|If you want to make changes, you must visit the primary site."
msgstr ""
@@ -13402,12 +13797,21 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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|Node Details"
+msgstr ""
+
msgid "Geo|Node name can't be blank"
msgstr ""
@@ -13429,6 +13833,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13474,6 +13881,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13525,6 +13935,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13561,6 +13974,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13597,6 +14013,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -14395,6 +14814,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14551,9 +14979,6 @@ msgstr ""
msgid "Groups to synchronize"
msgstr ""
-msgid "Groups with access to %{strong_open}%{project_name}%{strong_close}"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -14764,6 +15189,9 @@ msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -15120,6 +15548,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15192,9 +15623,6 @@ msgstr ""
msgid "Import/Export Rate Limits"
msgstr ""
-msgid "Import/Export illustration"
-msgstr ""
-
msgid "ImportButtons|Connect repositories from"
msgstr ""
@@ -15479,7 +15907,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15940,96 +16368,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -16048,12 +16386,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -16099,12 +16443,21 @@ msgstr ""
msgid "Integrations|Linked namespaces"
msgstr ""
+msgid "Integrations|Namespace successfully linked"
+msgstr ""
+
msgid "Integrations|Namespaces are your GitLab groups and subgroups that will be linked to this Jira instance."
msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -16165,6 +16518,9 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -16309,6 +16665,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16318,9 +16677,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16405,19 +16761,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+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 "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16426,18 +16803,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16447,6 +16839,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16669,6 +17067,9 @@ 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 ""
@@ -16744,10 +17145,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16795,6 +17193,9 @@ 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 ""
@@ -16810,7 +17211,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -17101,6 +17502,9 @@ 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 ""
@@ -17248,6 +17652,9 @@ 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 ""
@@ -17268,6 +17675,9 @@ msgid_plural "Last %d days"
msgstr[0] ""
msgstr[1] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17289,6 +17699,9 @@ msgstr ""
msgid "Last Seen"
msgstr ""
+msgid "Last Updated"
+msgstr ""
+
msgid "Last Used"
msgstr ""
@@ -17400,6 +17813,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17451,9 +17867,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17463,30 +17876,96 @@ msgstr ""
msgid "Learn more."
msgstr ""
+msgid "LearnGitLab|%{percentage}%{percentSymbol} completed"
+msgstr ""
+
msgid "LearnGitLab|Add code owners"
msgstr ""
-msgid "LearnGitLab|Create a repository"
+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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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|Run a Security scan using CI/CD"
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 trial of GitLab Gold"
+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 "Leave"
msgstr ""
@@ -17676,9 +18155,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17801,6 +18277,9 @@ msgstr ""
msgid "List the merge requests that must be merged before this one."
msgstr ""
+msgid "List type"
+msgstr ""
+
msgid "List view"
msgstr ""
@@ -17831,7 +18310,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -18206,9 +18685,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -18236,6 +18712,9 @@ msgstr ""
msgid "Maximum capacity"
msgstr ""
+msgid "Maximum character limit - %{limit}"
+msgstr ""
+
msgid "Maximum concurrency of Elasticsearch bulk requests per indexing operation."
msgstr ""
@@ -18266,6 +18745,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18335,9 +18817,6 @@ msgstr ""
msgid "Members can be added by project %{i_open}Maintainers%{i_close} or %{i_open}Owners%{i_close}"
msgstr ""
-msgid "Members invited to %{strong_start}%{project_name}%{strong_end}"
-msgstr ""
-
msgid "Members listed as CODEOWNERS of affected files."
msgstr ""
@@ -18347,9 +18826,6 @@ msgstr ""
msgid "Members of %{group} can also push to this branch: %{branch}"
msgstr ""
-msgid "Members of %{strong_open}%{project_name}%{strong_close}"
-msgstr ""
-
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
@@ -18620,9 +19096,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18632,9 +19105,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18683,6 +19153,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19302,6 +19775,9 @@ msgstr ""
msgid "Mirroring will only be available if the feature is included in the plan of the selected group or user."
msgstr ""
+msgid "Missing"
+msgstr ""
+
msgid "Missing OAuth configuration for GitHub."
msgstr ""
@@ -19404,6 +19880,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19422,6 +19901,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19911,6 +20393,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19953,6 +20438,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -20058,6 +20546,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -20085,6 +20576,9 @@ msgstr ""
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -20112,6 +20606,9 @@ 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 ""
@@ -20259,6 +20756,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No tag selected"
+msgstr ""
+
msgid "No template"
msgstr ""
@@ -20424,9 +20924,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20454,6 +20951,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20508,9 +21008,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20622,6 +21119,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20643,6 +21146,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20673,12 +21179,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule"
msgstr ""
-msgid "OnCallSchedules|On-call schedule for the %{timezone}"
+msgid "OnCallSchedules|Please note, rotations with shifts that are less than four hours are currently not supported in the weekly view."
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 ""
@@ -20855,7 +21364,7 @@ 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."
+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."
@@ -20888,7 +21397,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20993,6 +21502,9 @@ 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 ""
@@ -21116,6 +21628,9 @@ msgstr ""
msgid "PackageRegistry|Add Conan Remote"
msgstr ""
+msgid "PackageRegistry|Add Gradle Groovy DSL repository command"
+msgstr ""
+
msgid "PackageRegistry|Add NuGet Source"
msgstr ""
@@ -21152,6 +21667,9 @@ msgstr ""
msgid "PackageRegistry|Copy Conan Setup Command"
msgstr ""
+msgid "PackageRegistry|Copy Gradle Groovy DSL install command"
+msgstr ""
+
msgid "PackageRegistry|Copy Maven XML"
msgstr ""
@@ -21170,6 +21688,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
+msgstr ""
+
msgid "PackageRegistry|Copy and paste this inside your %{codeStart}pom.xml%{codeEnd} %{codeStart}dependencies%{codeEnd} block."
msgstr ""
@@ -21221,6 +21742,9 @@ msgstr ""
msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
msgstr ""
+msgid "PackageRegistry|Gradle Groovy DSL install command"
+msgstr ""
+
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -21245,12 +21769,6 @@ msgstr ""
msgid "PackageRegistry|Maven Command"
msgstr ""
-msgid "PackageRegistry|Maven XML"
-msgstr ""
-
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -21287,6 +21805,9 @@ msgstr ""
msgid "PackageRegistry|Recipe: %{recipe}"
msgstr ""
+msgid "PackageRegistry|Registry setup"
+msgstr ""
+
msgid "PackageRegistry|Remove package"
msgstr ""
@@ -21296,6 +21817,27 @@ msgstr ""
msgid "PackageRegistry|Settings saved successfully"
msgstr ""
+msgid "PackageRegistry|Show Composer commands"
+msgstr ""
+
+msgid "PackageRegistry|Show Conan commands"
+msgstr ""
+
+msgid "PackageRegistry|Show Gradle Groovy DSL commands"
+msgstr ""
+
+msgid "PackageRegistry|Show Maven commands"
+msgstr ""
+
+msgid "PackageRegistry|Show NPM commands"
+msgstr ""
+
+msgid "PackageRegistry|Show Nuget commands"
+msgstr ""
+
+msgid "PackageRegistry|Show PyPi commands"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -21335,6 +21877,9 @@ 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|npm command"
msgstr ""
@@ -21356,15 +21901,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21602,6 +22147,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21653,9 +22201,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21677,16 +22222,16 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+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"
+msgid "PipelineCharts|CI/CD Analytics"
msgstr ""
msgid "PipelineCharts|Failed:"
@@ -21863,9 +22408,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21914,12 +22456,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21959,6 +22510,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21971,6 +22525,12 @@ 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 ""
@@ -22028,6 +22588,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -22097,6 +22660,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -22271,6 +22837,12 @@ 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 "Policy project doesn't exists"
+msgstr ""
+
+msgid "Postman collection"
+msgstr ""
+
msgid "Pre-defined push rules."
msgstr ""
@@ -22349,6 +22921,9 @@ msgstr ""
msgid "Preferences|Sourcegraph"
msgstr ""
+msgid "Preferences|Surround text selection when typing quotes or brackets"
+msgstr ""
+
msgid "Preferences|Syntax highlighting theme"
msgstr ""
@@ -22580,6 +23155,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22937,6 +23515,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -23195,6 +23776,9 @@ msgstr ""
msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
msgstr ""
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -23222,9 +23806,6 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more."
-msgstr ""
-
msgid "ProjectSettings|Every merge creates a merge commit"
msgstr ""
@@ -23735,10 +24316,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23747,9 +24328,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23765,6 +24343,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23780,6 +24367,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23792,22 +24385,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23816,6 +24409,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23966,6 +24565,15 @@ 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 force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allow force push for all users with push access."
+msgstr ""
+
+msgid "ProtectedBranch|Allow force push:"
+msgstr ""
+
msgid "ProtectedBranch|Allowed to merge"
msgstr ""
@@ -23987,7 +24595,7 @@ msgstr ""
msgid "ProtectedBranch|Code owner approval"
msgstr ""
-msgid "ProtectedBranch|Does not apply to users allowed to push."
+msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
msgid "ProtectedBranch|Protect"
@@ -24008,6 +24616,9 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
+msgid "ProtectedBranch|Toggle allow force push"
+msgstr ""
+
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
@@ -24182,7 +24793,7 @@ msgstr ""
msgid "PushRules|Restrict push operations for this project."
msgstr ""
-msgid "PushRules|Save Push Rules"
+msgid "PushRules|Save push rules"
msgstr ""
msgid "PushRules|Select push rules"
@@ -24501,6 +25112,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24606,13 +25220,13 @@ msgstr ""
msgid "Remove due date"
msgstr ""
-msgid "Remove fork relationship"
+msgid "Remove file"
msgstr ""
-msgid "Remove from batch"
+msgid "Remove fork relationship"
msgstr ""
-msgid "Remove from board"
+msgid "Remove from batch"
msgstr ""
msgid "Remove from epic"
@@ -24672,6 +25286,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24840,7 +25457,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24895,10 +25512,13 @@ msgstr ""
msgid "Reports|Activity"
msgstr ""
-msgid "Reports|An error occured while loading report"
+msgid "Reports|An error occurred while loading %{name} results"
msgstr ""
-msgid "Reports|An error occurred while loading %{name} results"
+msgid "Reports|An error occurred while loading report"
+msgstr ""
+
+msgid "Reports|Base report parsing error:"
msgstr ""
msgid "Reports|Class"
@@ -24923,6 +25543,9 @@ msgstr[1] ""
msgid "Reports|Failure"
msgstr ""
+msgid "Reports|Head report parsing error:"
+msgstr ""
+
msgid "Reports|Identifier"
msgstr ""
@@ -25109,6 +25732,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -25332,6 +25958,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25708,6 +26337,9 @@ msgstr ""
msgid "Save Changes"
msgstr ""
+msgid "Save Value Stream"
+msgstr ""
+
msgid "Save application"
msgstr ""
@@ -25738,6 +26370,9 @@ msgstr ""
msgid "Saving project."
msgstr ""
+msgid "Scan Policies"
+msgstr ""
+
msgid "Scanner"
msgstr ""
@@ -25816,6 +26451,9 @@ msgstr ""
msgid "Search an environment spec"
msgstr ""
+msgid "Search assignees"
+msgstr ""
+
msgid "Search authors"
msgstr ""
@@ -25867,12 +26505,18 @@ msgstr ""
msgid "Search forks"
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 ""
@@ -26108,9 +26752,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -26156,6 +26797,15 @@ msgstr ""
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|A security policy project can be used enforce policies for a given project, group, or instance. It allows you to speficy security policies that are important to you and enforce them with every commit."
+msgstr ""
+
+msgid "SecurityOrchestration|Create a policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Security policy project"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -26177,6 +26827,9 @@ msgstr ""
msgid "SecurityReports|All"
msgstr ""
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -26192,9 +26845,6 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
-msgstr ""
-
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -26231,9 +26881,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -26309,7 +26956,7 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
@@ -26345,11 +26992,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -26395,18 +27037,12 @@ msgstr ""
msgid "SecurityReports|With issues"
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
-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|[No reason]"
-msgstr ""
-
msgid "See GitLab's %{password_policy_guidelines}"
msgstr ""
@@ -26443,6 +27079,9 @@ msgstr ""
msgid "Select Stack"
msgstr ""
+msgid "Select a branch"
+msgstr ""
+
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
@@ -26452,9 +27091,6 @@ msgstr ""
msgid "Select a label"
msgstr ""
-msgid "Select a namespace to fork the project"
-msgstr ""
-
msgid "Select a new namespace"
msgstr ""
@@ -26491,9 +27127,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26584,12 +27217,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26632,7 +27271,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26809,6 +27448,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -27001,6 +27643,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -27156,7 +27801,7 @@ msgid_plural "Showing %d events"
msgstr[0] ""
msgstr[1] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -27446,9 +28091,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27575,6 +28217,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27947,12 +28592,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -28406,6 +29054,9 @@ msgstr ""
msgid "Successful purchase image"
msgstr ""
+msgid "Successfull"
+msgstr ""
+
msgid "Successfully activated"
msgstr ""
@@ -29565,6 +30216,9 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
@@ -29706,6 +30360,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29766,9 +30423,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29943,7 +30597,7 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
-msgid "This comment has changed since you started editing, please review the %{startTag}updated comment%{endTag} to ensure information is not lost."
+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."
@@ -30048,6 +30702,9 @@ 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 Premium feature"
msgstr ""
@@ -30399,6 +31056,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30450,9 +31110,6 @@ msgstr ""
msgid "ThreatMonitoring|The firewall is not installed or has been disabled. To view this data, ensure the web application firewall is installed and enabled for your cluster."
msgstr ""
-msgid "ThreatMonitoring|The graph below is an overview of traffic coming to your application as tracked by the Web Application Firewall (WAF). View the docs for instructions on how to access the WAF logs to see what type of malicious traffic is trying to access your app. The docs link is also accessible by clicking the \"?\" icon next to the title below."
-msgstr ""
-
msgid "ThreatMonitoring|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
@@ -30727,6 +31384,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30877,6 +31537,9 @@ 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 widen your search, change or remove filters."
msgstr ""
@@ -30964,9 +31627,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -31093,21 +31753,27 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -31116,13 +31782,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -31224,6 +31887,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -31245,10 +31911,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -31722,6 +32388,9 @@ msgstr ""
msgid "Upload CSV file"
msgstr ""
+msgid "Upload File"
+msgstr ""
+
msgid "Upload License"
msgstr ""
@@ -31920,6 +32589,96 @@ 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 ""
@@ -31929,7 +32688,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -32253,9 +33012,6 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
-msgid "Users requesting access to %{strong_start}%{project_name}%{strong_end}"
-msgstr ""
-
msgid "Users were successfully added."
msgstr ""
@@ -32400,6 +33156,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -32443,9 +33202,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32878,6 +33634,9 @@ 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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32899,6 +33658,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -33100,6 +33862,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -33127,7 +33892,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -33294,10 +34059,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -33471,7 +34233,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -33486,6 +34248,9 @@ 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 ""
@@ -33852,6 +34617,9 @@ msgstr ""
msgid "You must set up incoming email before it becomes active."
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 ""
@@ -34038,9 +34806,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -34212,6 +34977,9 @@ 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 profile"
msgstr ""
@@ -34269,6 +35037,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -34292,6 +35063,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -34370,6 +35144,9 @@ msgstr ""
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't include: %{invalid_storages}"
+msgstr ""
+
msgid "cannot be a date in the past"
msgstr ""
@@ -34639,6 +35416,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34669,6 +35449,15 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{timeAgoString} by %{email} via %{user}"
+msgstr ""
+
+msgid "created %{timeAgoString} by %{user}"
+msgstr ""
+
+msgid "created %{timeAgoString} by %{user} in Jira"
+msgstr ""
+
msgid "created %{timeAgo}"
msgstr ""
@@ -34930,6 +35719,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -35026,9 +35818,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -35058,21 +35847,15 @@ msgstr ""
msgid "mrWidgetCommitsAdded|1 merge commit"
msgstr ""
-msgid "mrWidgetNothingToMerge|Currently there are no changes in this merge request's source branch. Please push new commits or use a different branch."
-msgstr ""
-
-msgid "mrWidgetNothingToMerge|Interested parties can even contribute by pushing commits if they want to."
+msgid "mrWidgetNothingToMerge|This merge request contains no changes."
msgstr ""
-msgid "mrWidgetNothingToMerge|Merge requests are a place to propose changes you have made to a project and discuss those changes with others."
+msgid "mrWidgetNothingToMerge|Use merge requests to propose changes to your project and discuss them with your team. To make changes, push a commit or edit this merge request to use a different branch. With %{linkStart}CI/CD%{linkEnd}, automatically test your changes before merging."
msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -35190,6 +35973,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -35367,9 +36153,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -35418,9 +36210,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35439,15 +36228,6 @@ msgstr ""
msgid "open issue"
msgstr ""
-msgid "opened %{timeAgoString} by %{email} via %{user}"
-msgstr ""
-
-msgid "opened %{timeAgoString} by %{user}"
-msgstr ""
-
-msgid "opened %{timeAgoString} by %{user} in Jira"
-msgstr ""
-
msgid "opened %{timeAgo}"
msgstr ""
@@ -35773,6 +36553,12 @@ 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 ""
diff --git a/locale/gl_ES/gitlab.po b/locale/gl_ES/gitlab.po
index 8e56251aa50..b6cce2179f0 100644
--- a/locale/gl_ES/gitlab.po
+++ b/locale/gl_ES/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: gl\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:05\n"
+"PO-Revision-Date: 2021-03-05 23:48\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr " ou referencias (ex.: ruta/do/proxecto!merge_request_id)"
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -170,6 +173,11 @@ 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] ""
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ 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 ""
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -682,6 +710,15 @@ 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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -976,6 +1016,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -988,9 +1031,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1015,9 +1055,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1111,6 +1148,11 @@ 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] ""
@@ -1162,6 +1204,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1282,6 +1327,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1635,9 +1779,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1716,12 +1857,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1818,6 +1965,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1938,6 +2103,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2058,6 +2226,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2091,6 +2268,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2259,6 +2442,15 @@ 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 ""
@@ -2268,6 +2460,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2361,6 +2562,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2394,6 +2607,21 @@ 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 ""
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2483,9 +2714,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2576,9 +2792,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,9 +2813,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,49 +2837,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,76 +2867,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,13 +2927,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2954,7 +3104,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2996,6 +3146,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3146,12 +3293,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3269,6 +3425,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3296,12 +3455,18 @@ 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 ""
@@ -3344,7 +3509,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3395,10 +3566,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3757,9 +3928,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3787,6 +3955,9 @@ 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 erase this build?"
msgstr ""
@@ -4048,12 +4219,6 @@ msgstr[1] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5028,6 +5235,26 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5688,7 +5915,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5703,6 +5930,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6036,21 +6266,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7325,16 +7594,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7349,6 +7642,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7391,6 +7729,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7430,6 +7771,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7451,6 +7795,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8245,10 +8577,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8302,6 +8637,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8314,6 +8652,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8329,6 +8670,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,13 +8991,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8647,7 +9024,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8689,6 +9066,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8722,6 +9102,18 @@ 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 ""
@@ -8886,7 +9278,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 ""
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9261,9 +9682,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9318,6 +9736,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9429,6 +9856,15 @@ 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 ""
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9660,6 +10093,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9678,9 +10114,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9690,19 +10123,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9717,10 +10150,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9735,7 +10165,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9756,10 +10186,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9768,7 +10204,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10047,18 +10482,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,7 +10710,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11048,19 +11468,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
-msgstr ""
-
-msgid "Enter the issue title"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11345,6 +11759,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11369,6 +11786,12 @@ 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 ""
@@ -11396,6 +11819,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11423,6 +11849,9 @@ 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 ""
@@ -11447,9 +11876,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11882,6 +12320,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11915,6 +12356,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12038,10 +12482,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12068,6 +12512,12 @@ 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 ""
@@ -12104,9 +12554,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,10 +12602,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12826,6 +13279,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12856,7 +13345,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12934,9 +13423,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13096,6 +13585,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13135,6 +13627,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13144,6 +13639,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13291,6 +13801,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13330,6 +13840,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13828,6 +14344,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14630,6 +15164,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15703,96 +16240,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16078,9 +16543,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ 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 ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ 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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16972,6 +17518,9 @@ 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 ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] ""
msgstr[1] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17085,6 +17640,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17118,6 +17676,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17169,9 +17730,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17181,6 +17739,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19590,6 +20253,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19737,6 +20406,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19788,6 +20466,9 @@ 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 ""
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ 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."
+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."
@@ -20552,7 +21257,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20579,10 +21290,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20651,6 +21362,9 @@ 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 ""
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20762,6 +21473,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21077,6 +21809,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21284,9 +22028,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21308,10 +22049,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,10 +22154,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ 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 ""
@@ -21665,6 +22415,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21923,21 +22685,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21959,6 +22739,12 @@ 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 ""
@@ -22067,6 +22853,9 @@ 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 ""
@@ -22151,24 +22940,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22205,6 +22976,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22562,6 +23336,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22790,10 +23567,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22805,7 +23579,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,13 +23672,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22937,13 +23714,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22970,16 +23750,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,52 +23816,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23381,6 +24164,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23396,6 +24188,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23408,22 +24206,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23432,6 +24230,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23522,9 +24326,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23675,7 +24476,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23771,7 +24572,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24072,6 +24921,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24243,6 +25098,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,7 +25269,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25595,7 +26480,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25721,6 +26612,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,10 +26627,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,19 +26744,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26161,7 +27062,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26338,6 +27239,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] ""
msgstr[1] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27287,9 +28194,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27479,12 +28383,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27989,67 +28896,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28136,6 +29043,12 @@ 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 ""
@@ -28145,7 +29058,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ 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 ""
@@ -29076,12 +30004,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29112,10 +30046,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29157,7 +30091,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29574,6 +30505,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30382,10 +31325,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30735,6 +31675,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30756,10 +31699,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31308,6 +32266,12 @@ 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|Packages"
msgstr ""
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ 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 ""
@@ -31653,6 +32713,9 @@ 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 ""
@@ -31668,6 +32731,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ 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 ""
@@ -31752,6 +32824,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31912,9 +32990,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32032,6 +33107,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,10 +33847,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32832,9 +33943,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ 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 ""
@@ -33120,6 +34237,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33237,6 +34357,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33642,6 +34762,9 @@ 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 profile"
msgstr ""
@@ -33699,6 +34822,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 ""
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34215,6 +35350,9 @@ 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 ""
@@ -34354,6 +35492,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34698,7 +35836,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35128,6 +36272,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/he_IL/gitlab.po b/locale/he_IL/gitlab.po
index 12eb4e397b4..6efb08ba569 100644
--- a/locale/he_IL/gitlab.po
+++ b/locale/he_IL/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: he\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:57\n"
+"PO-Revision-Date: 2021-03-05 23:55\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -78,6 +78,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -210,6 +213,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d epic"
+msgid_plural "%d epics"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d error"
msgid_plural "%d errors"
msgstr[0] ""
@@ -455,6 +465,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -540,6 +557,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -618,6 +638,9 @@ 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 ""
@@ -669,6 +692,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -777,6 +803,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -808,6 +840,15 @@ msgstr[3] ""
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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -857,9 +898,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -907,6 +945,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1101,6 +1142,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -1126,6 +1170,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -1138,9 +1185,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1165,9 +1209,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1279,6 +1320,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "1 follower"
+msgid_plural "%{count} followers"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "1 group"
msgid_plural "%d groups"
msgstr[0] ""
@@ -1348,6 +1396,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1468,6 +1519,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1567,6 +1621,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1823,9 +1973,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1904,12 +2051,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -2006,6 +2159,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2066,6 +2234,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -2126,6 +2297,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2246,6 +2420,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2270,6 +2450,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2279,6 +2462,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2354,6 +2540,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2447,6 +2636,15 @@ 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 ""
@@ -2456,6 +2654,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2540,6 +2741,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2549,6 +2756,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2582,6 +2801,21 @@ 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 ""
@@ -2606,6 +2840,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2673,9 +2910,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2688,24 +2922,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2766,9 +2988,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2778,6 +2997,9 @@ 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 ""
@@ -2787,9 +3009,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2814,49 +3033,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2868,9 +3054,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2880,76 +3063,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
-msgstr ""
-
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2961,13 +3123,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2979,9 +3141,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2994,7 +3153,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -3081,9 +3240,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -3144,7 +3300,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -3186,6 +3342,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3252,12 +3411,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3336,12 +3489,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3366,6 +3525,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3459,6 +3621,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3486,12 +3651,18 @@ 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 ""
@@ -3534,7 +3705,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3573,6 +3747,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3585,10 +3762,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3955,9 +4132,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3985,6 +4159,9 @@ 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 erase this build?"
msgstr ""
@@ -4252,12 +4429,6 @@ msgstr[3] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4330,6 +4501,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4756,6 +4930,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4768,12 +4945,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4844,6 +5033,12 @@ 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 ""
@@ -4934,12 +5129,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -5108,16 +5297,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -5132,6 +5333,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -5165,6 +5369,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -5183,6 +5393,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5234,6 +5447,28 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5369,6 +5604,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5522,12 +5760,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5672,6 +5904,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5894,7 +6129,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5909,6 +6144,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6242,21 +6480,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6266,9 +6525,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7277,6 +7548,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7346,6 +7620,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7533,16 +7810,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
+msgstr ""
+
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Create merge request"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7557,6 +7858,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7569,9 +7876,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7587,6 +7924,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7599,6 +7945,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7638,6 +7987,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7659,6 +8011,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7713,9 +8068,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7892,24 +8244,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8370,10 +8713,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8409,9 +8752,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8461,10 +8801,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8491,6 +8831,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8518,6 +8861,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8530,6 +8876,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8545,6 +8894,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8617,6 +8972,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8626,15 +8984,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8653,6 +9026,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8662,6 +9038,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8677,6 +9056,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8782,6 +9164,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8830,13 +9215,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8863,7 +9248,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8905,6 +9290,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8938,6 +9326,18 @@ 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 ""
@@ -9104,7 +9504,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9260,7 +9660,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9284,6 +9690,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9365,6 +9774,9 @@ 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 ""
@@ -9374,6 +9786,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9398,6 +9813,13 @@ 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] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "DastSiteValidation|Validate"
msgstr ""
@@ -9416,6 +9838,9 @@ 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 ""
@@ -9437,6 +9862,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9461,6 +9889,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9479,9 +9910,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9536,6 +9964,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9566,6 +9997,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9623,6 +10057,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9647,6 +10084,15 @@ 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 ""
@@ -9833,13 +10279,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
-msgstr ""
-
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9848,6 +10291,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9857,15 +10303,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9890,6 +10333,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9908,9 +10354,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9920,19 +10363,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9947,10 +10390,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9965,7 +10405,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9986,10 +10426,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
+msgstr ""
+
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9998,7 +10444,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -10028,6 +10474,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -10037,15 +10486,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -10055,6 +10495,13 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10277,18 +10724,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10304,16 +10739,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10334,10 +10769,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10346,18 +10778,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10370,9 +10796,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10382,6 +10805,12 @@ 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 ""
@@ -10409,6 +10838,9 @@ 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|Score"
msgstr ""
@@ -10520,7 +10952,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10725,6 +11157,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10917,10 +11352,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10989,12 +11424,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -11115,6 +11544,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11280,19 +11712,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
-msgstr ""
-
-msgid "Enter the issue title"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11577,6 +12003,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11601,6 +12030,12 @@ 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 ""
@@ -11628,6 +12063,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11655,6 +12093,9 @@ 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 ""
@@ -11679,9 +12120,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11856,6 +12294,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -12021,6 +12462,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -12036,6 +12480,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -12078,6 +12525,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -12114,6 +12564,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -12147,6 +12600,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12270,10 +12726,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12300,6 +12756,12 @@ 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 ""
@@ -12336,9 +12798,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12354,9 +12813,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12390,10 +12846,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12438,7 +12894,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12456,9 +12912,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12501,6 +12954,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12997,6 +13453,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -13060,6 +13525,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -13090,7 +13591,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -13168,9 +13669,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -13183,6 +13681,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13330,6 +13831,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13369,6 +13873,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13378,6 +13885,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13402,6 +13912,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13429,6 +13945,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13474,6 +13993,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13525,6 +14047,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13549,9 +14074,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13564,6 +14086,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13600,6 +14125,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13861,9 +14389,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -14014,6 +14539,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -14062,6 +14590,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14395,6 +14926,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14671,6 +15211,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14752,15 +15298,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14868,6 +15414,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -15122,6 +15671,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15483,7 +16035,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15909,9 +16461,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15949,96 +16498,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -16057,12 +16516,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -16114,6 +16579,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -16147,6 +16618,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16315,6 +16789,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16324,9 +16801,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16336,9 +16810,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16378,19 +16885,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16399,18 +16927,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16420,6 +16963,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16642,6 +17191,9 @@ 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 ""
@@ -16717,10 +17269,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16768,6 +17317,9 @@ 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 ""
@@ -16783,7 +17335,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16843,6 +17395,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16867,6 +17422,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -17068,6 +17626,9 @@ 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 ""
@@ -17137,9 +17698,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -17218,6 +17776,9 @@ 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 ""
@@ -17240,6 +17801,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17285,6 +17849,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17333,6 +17900,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17366,6 +17936,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17417,9 +17990,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17429,6 +17999,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17630,9 +18290,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17745,6 +18402,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17784,7 +18444,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -18144,6 +18804,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -18156,9 +18819,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -18216,6 +18876,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18486,6 +19149,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18567,9 +19233,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18579,9 +19242,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18630,6 +19290,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19343,6 +20006,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19352,6 +20018,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19370,6 +20039,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19582,6 +20254,12 @@ 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 ""
@@ -19600,12 +20278,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19841,6 +20513,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19862,6 +20537,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19904,6 +20582,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -20009,6 +20690,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -20030,9 +20714,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -20060,6 +20750,9 @@ 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 ""
@@ -20096,6 +20789,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20324,13 +21020,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20345,6 +21047,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 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 ""
@@ -20360,9 +21065,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20390,6 +21092,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20444,9 +21149,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20558,6 +21260,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20579,6 +21287,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20612,9 +21323,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20793,7 +21510,7 @@ 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."
+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."
@@ -20826,7 +21543,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20841,6 +21558,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20853,10 +21576,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20925,6 +21648,9 @@ 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 ""
@@ -20979,9 +21705,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -21036,6 +21759,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -21048,6 +21780,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -21171,9 +21906,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -21192,6 +21924,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -21210,6 +21945,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -21249,6 +21990,9 @@ 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|npm command"
msgstr ""
@@ -21270,15 +22014,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21351,6 +22095,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21408,10 +22161,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21507,6 +22260,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21558,9 +22314,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21582,10 +22335,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21660,15 +22413,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21696,10 +22440,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21714,9 +22458,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21741,6 +22482,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21777,9 +22521,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21813,6 +22554,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21825,12 +22569,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21870,6 +22623,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21882,6 +22638,12 @@ 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 ""
@@ -21939,6 +22701,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -22008,6 +22773,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -22131,12 +22899,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -22197,21 +22971,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -22233,6 +23025,12 @@ 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 ""
@@ -22341,6 +23139,9 @@ 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 ""
@@ -22425,24 +23226,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22479,6 +23262,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22836,6 +23622,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -23064,10 +23853,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -23079,7 +23865,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -23094,6 +23880,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -23121,16 +23913,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -23169,13 +23958,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -23211,13 +24000,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -23244,16 +24036,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23277,7 +24078,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23301,52 +24102,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23625,10 +24423,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23637,9 +24435,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23655,6 +24450,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23670,6 +24474,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23682,22 +24492,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23706,6 +24516,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23796,9 +24612,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23841,9 +24654,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23856,6 +24666,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23949,7 +24762,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -24045,7 +24858,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -24138,6 +24993,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -24174,6 +25032,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24350,6 +25211,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24455,6 +25319,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24521,6 +25388,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24689,7 +25559,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24745,12 +25615,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24828,6 +25701,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24855,6 +25734,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24951,6 +25836,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24969,6 +25857,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -25085,9 +25976,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -25178,6 +26066,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25558,7 +26449,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25630,6 +26521,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25717,6 +26611,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25911,7 +26808,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25956,12 +26853,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25974,9 +26877,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -26001,6 +26901,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -26037,6 +26940,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -26046,10 +26955,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -26070,6 +26979,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -26085,9 +26997,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -26115,6 +27024,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -26157,19 +27072,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -26193,13 +27108,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -26242,7 +27150,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -26251,7 +27159,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26338,9 +27246,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26389,7 +27294,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26431,12 +27336,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26479,7 +27390,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26656,6 +27567,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26848,6 +27762,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -27005,7 +27922,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -27297,9 +28214,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27426,6 +28340,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27609,9 +28526,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27801,12 +28715,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -28311,67 +29228,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28458,6 +29375,12 @@ 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 ""
@@ -28467,7 +29390,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28662,6 +29585,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28727,6 +29653,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28739,6 +29668,9 @@ 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 ""
@@ -28760,6 +29692,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28809,9 +29744,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -29306,6 +30238,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29390,6 +30325,9 @@ 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 ""
@@ -29408,12 +30346,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29444,10 +30388,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29489,7 +30433,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29504,7 +30448,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29546,6 +30490,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29576,6 +30523,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29603,9 +30553,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29618,6 +30565,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29681,6 +30631,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29723,18 +30676,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29906,6 +30847,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -30203,6 +31147,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -30236,6 +31183,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30568,6 +31518,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30718,10 +31671,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30784,12 +31737,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30814,9 +31761,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30943,23 +31887,29 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30968,13 +31918,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -31061,6 +32008,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -31073,6 +32023,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -31094,10 +32047,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -31163,6 +32116,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -31295,6 +32263,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31466,9 +32437,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31646,6 +32614,12 @@ 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|Packages"
msgstr ""
@@ -31748,6 +32722,96 @@ 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 ""
@@ -31757,7 +32821,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31778,7 +32842,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31949,6 +33013,12 @@ 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 ""
@@ -31991,6 +33061,9 @@ 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 ""
@@ -32006,6 +33079,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -32015,9 +33091,15 @@ 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 ""
@@ -32090,6 +33172,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -32207,6 +33292,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -32254,9 +33342,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32374,6 +33459,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32440,6 +33528,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32461,15 +33552,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32668,6 +33771,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32689,6 +33798,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32746,10 +33858,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32758,7 +33870,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32785,64 +33897,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32881,6 +34002,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32908,7 +34032,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -33077,10 +34201,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -33176,9 +34297,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -33188,6 +34306,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -33254,7 +34375,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -33269,6 +34390,9 @@ 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 ""
@@ -33317,6 +34441,9 @@ 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 ""
@@ -33464,6 +34591,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33581,6 +34711,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33812,9 +34945,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33986,6 +35116,9 @@ 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 profile"
msgstr ""
@@ -34043,6 +35176,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -34068,6 +35204,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -34281,6 +35420,9 @@ 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 ""
@@ -34414,6 +35556,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34571,6 +35716,9 @@ msgstr[3] ""
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 ""
@@ -34714,6 +35862,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34810,9 +35961,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34856,9 +36004,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34976,6 +36121,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -35060,7 +36208,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -35141,6 +36289,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -35150,9 +36301,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -35201,9 +36358,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35500,6 +36654,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35527,6 +36687,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35554,9 +36717,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/hi_IN/gitlab.po b/locale/hi_IN/gitlab.po
index 3b542585576..32c73edd07b 100644
--- a/locale/hi_IN/gitlab.po
+++ b/locale/hi_IN/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: hi\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:07\n"
+"PO-Revision-Date: 2021-03-05 23:50\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -170,6 +173,11 @@ 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] ""
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ 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 ""
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -682,6 +710,15 @@ 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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -976,6 +1016,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -988,9 +1031,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1015,9 +1055,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1111,6 +1148,11 @@ 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] ""
@@ -1162,6 +1204,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1282,6 +1327,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1635,9 +1779,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1716,12 +1857,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1818,6 +1965,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1938,6 +2103,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2058,6 +2226,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2091,6 +2268,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2259,6 +2442,15 @@ 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 ""
@@ -2268,6 +2460,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2361,6 +2562,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2394,6 +2607,21 @@ 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 ""
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2483,9 +2714,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2576,9 +2792,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,9 +2813,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,49 +2837,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,76 +2867,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,13 +2927,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2954,7 +3104,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2996,6 +3146,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3146,12 +3293,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3269,6 +3425,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3296,12 +3455,18 @@ 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 ""
@@ -3344,7 +3509,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3395,10 +3566,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3757,9 +3928,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3787,6 +3955,9 @@ 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 erase this build?"
msgstr ""
@@ -4048,12 +4219,6 @@ msgstr[1] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5028,6 +5235,26 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5688,7 +5915,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5703,6 +5930,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6036,21 +6266,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7325,16 +7594,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7349,6 +7642,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7391,6 +7729,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7430,6 +7771,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7451,6 +7795,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8245,10 +8577,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8302,6 +8637,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8314,6 +8652,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8329,6 +8670,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,13 +8991,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8647,7 +9024,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8689,6 +9066,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8722,6 +9102,18 @@ 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 ""
@@ -8886,7 +9278,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 ""
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9261,9 +9682,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9318,6 +9736,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9429,6 +9856,15 @@ 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 ""
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9660,6 +10093,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9678,9 +10114,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9690,19 +10123,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9717,10 +10150,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9735,7 +10165,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9756,10 +10186,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9768,7 +10204,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10047,18 +10482,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,7 +10710,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11048,19 +11468,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
-msgstr ""
-
-msgid "Enter the issue title"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11345,6 +11759,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11369,6 +11786,12 @@ 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 ""
@@ -11396,6 +11819,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11423,6 +11849,9 @@ 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 ""
@@ -11447,9 +11876,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11882,6 +12320,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11915,6 +12356,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12038,10 +12482,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12068,6 +12512,12 @@ 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 ""
@@ -12104,9 +12554,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,10 +12602,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12826,6 +13279,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12856,7 +13345,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12934,9 +13423,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13096,6 +13585,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13135,6 +13627,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13144,6 +13639,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13291,6 +13801,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13330,6 +13840,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13828,6 +14344,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14630,6 +15164,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15703,96 +16240,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16078,9 +16543,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ 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 ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ 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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16972,6 +17518,9 @@ 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 ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] ""
msgstr[1] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17085,6 +17640,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17118,6 +17676,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17169,9 +17730,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17181,6 +17739,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19590,6 +20253,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19737,6 +20406,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19788,6 +20466,9 @@ 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 ""
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ 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."
+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."
@@ -20552,7 +21257,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20579,10 +21290,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20651,6 +21362,9 @@ 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 ""
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20762,6 +21473,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21077,6 +21809,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21284,9 +22028,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21308,10 +22049,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,10 +22154,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ 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 ""
@@ -21665,6 +22415,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21923,21 +22685,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21959,6 +22739,12 @@ 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 ""
@@ -22067,6 +22853,9 @@ 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 ""
@@ -22151,24 +22940,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22205,6 +22976,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22562,6 +23336,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22790,10 +23567,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22805,7 +23579,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,13 +23672,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22937,13 +23714,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22970,16 +23750,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,52 +23816,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23381,6 +24164,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23396,6 +24188,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23408,22 +24206,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23432,6 +24230,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23522,9 +24326,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23675,7 +24476,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23771,7 +24572,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24072,6 +24921,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24243,6 +25098,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,7 +25269,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25595,7 +26480,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25721,6 +26612,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,10 +26627,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,19 +26744,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26161,7 +27062,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26338,6 +27239,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] ""
msgstr[1] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27287,9 +28194,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27479,12 +28383,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27989,67 +28896,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28136,6 +29043,12 @@ 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 ""
@@ -28145,7 +29058,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ 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 ""
@@ -29076,12 +30004,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29112,10 +30046,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29157,7 +30091,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29574,6 +30505,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30382,10 +31325,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30735,6 +31675,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30756,10 +31699,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31308,6 +32266,12 @@ 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|Packages"
msgstr ""
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ 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 ""
@@ -31653,6 +32713,9 @@ 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 ""
@@ -31668,6 +32731,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ 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 ""
@@ -31752,6 +32824,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31912,9 +32990,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32032,6 +33107,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,10 +33847,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32832,9 +33943,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ 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 ""
@@ -33120,6 +34237,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33237,6 +34357,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33642,6 +34762,9 @@ 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 profile"
msgstr ""
@@ -33699,6 +34822,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 ""
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34215,6 +35350,9 @@ 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 ""
@@ -34354,6 +35492,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34698,7 +35836,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35128,6 +36272,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/hr_HR/gitlab.po b/locale/hr_HR/gitlab.po
index 1ceafce33a2..73535f03f7f 100644
--- a/locale/hr_HR/gitlab.po
+++ b/locale/hr_HR/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: hr\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:06\n"
+"PO-Revision-Date: 2021-03-05 23:49\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -76,6 +76,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -190,6 +193,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%d epic"
+msgid_plural "%d epics"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d error"
msgid_plural "%d errors"
msgstr[0] ""
@@ -400,6 +409,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -481,6 +496,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -556,6 +574,9 @@ 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 ""
@@ -607,6 +628,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -715,6 +739,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -745,6 +775,15 @@ msgstr[2] ""
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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -793,9 +832,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -841,6 +877,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1027,6 +1066,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -1051,6 +1093,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -1063,9 +1108,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1090,9 +1132,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1195,6 +1234,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "1 follower"
+msgid_plural "%{count} followers"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "1 group"
msgid_plural "%d groups"
msgstr[0] ""
@@ -1255,6 +1300,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1375,6 +1423,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1474,6 +1525,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1729,9 +1876,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1810,12 +1954,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1912,6 +2062,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1972,6 +2137,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -2032,6 +2200,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2152,6 +2323,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2176,6 +2353,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2185,6 +2365,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2260,6 +2443,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2353,6 +2539,15 @@ 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 ""
@@ -2362,6 +2557,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2446,6 +2644,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2455,6 +2659,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2488,6 +2704,21 @@ 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 ""
@@ -2512,6 +2743,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2578,9 +2812,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2593,24 +2824,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2671,9 +2890,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2683,6 +2899,9 @@ 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 ""
@@ -2692,9 +2911,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2719,49 +2935,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2773,9 +2956,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2785,76 +2965,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
-msgstr ""
-
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2866,13 +3025,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2884,9 +3043,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2899,7 +3055,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2986,9 +3142,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -3049,7 +3202,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -3091,6 +3244,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3157,12 +3313,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3241,12 +3391,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3271,6 +3427,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3364,6 +3523,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3391,12 +3553,18 @@ 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 ""
@@ -3439,7 +3607,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3478,6 +3649,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3490,10 +3664,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3856,9 +4030,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3886,6 +4057,9 @@ 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 erase this build?"
msgstr ""
@@ -4150,12 +4324,6 @@ msgstr[2] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4228,6 +4396,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4654,6 +4825,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4666,12 +4840,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4741,6 +4927,12 @@ 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 ""
@@ -4831,12 +5023,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -5005,16 +5191,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -5029,6 +5227,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -5062,6 +5263,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -5080,6 +5287,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5131,6 +5341,27 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5266,6 +5497,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5419,12 +5653,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5569,6 +5797,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5791,7 +6022,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5806,6 +6037,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6139,21 +6373,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6163,9 +6418,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7174,6 +7441,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7243,6 +7513,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7429,16 +7702,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7453,6 +7750,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7465,9 +7768,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7483,6 +7816,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7495,6 +7837,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7534,6 +7879,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7555,6 +7903,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7609,9 +7960,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7786,24 +8134,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8263,10 +8602,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8302,9 +8641,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8353,10 +8689,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8383,6 +8719,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8410,6 +8749,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8422,6 +8764,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8437,6 +8782,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8509,6 +8860,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8518,15 +8872,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8545,6 +8914,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8554,6 +8926,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8569,6 +8944,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8674,6 +9052,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8722,13 +9103,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8755,7 +9136,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8797,6 +9178,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8830,6 +9214,18 @@ 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 ""
@@ -8995,7 +9391,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9151,7 +9547,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9175,6 +9577,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9256,6 +9661,9 @@ 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 ""
@@ -9265,6 +9673,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9289,6 +9700,12 @@ 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] ""
+msgstr[2] ""
+
msgid "DastSiteValidation|Validate"
msgstr ""
@@ -9307,6 +9724,9 @@ 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 ""
@@ -9328,6 +9748,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9352,6 +9775,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9370,9 +9796,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9427,6 +9850,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9457,6 +9883,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9514,6 +9943,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9538,6 +9970,15 @@ 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 ""
@@ -9718,13 +10159,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9733,6 +10171,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9742,15 +10183,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9775,6 +10213,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9793,9 +10234,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9805,19 +10243,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9832,10 +10270,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9850,7 +10285,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9871,10 +10306,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
+msgstr ""
+
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Use this token as a password. Save it. This password can %{i_start}not%{i_end} be recovered."
msgstr ""
msgid "DeployTokens|Username"
@@ -9883,7 +10324,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9913,6 +10354,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9922,15 +10366,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9940,6 +10375,12 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10162,18 +10603,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10189,16 +10618,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10219,10 +10648,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10231,18 +10657,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10255,9 +10675,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10267,6 +10684,12 @@ 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 ""
@@ -10294,6 +10717,9 @@ 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|Score"
msgstr ""
@@ -10405,7 +10831,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10609,6 +11035,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10801,10 +11230,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10873,12 +11302,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10999,6 +11422,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11164,19 +11590,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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."
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the issue description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the issue title"
-msgstr ""
-
-msgid "Enter the merge request description"
-msgstr ""
-
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11461,6 +11881,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11485,6 +11908,12 @@ 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 ""
@@ -11512,6 +11941,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11539,6 +11971,9 @@ 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 ""
@@ -11563,9 +11998,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11740,6 +12172,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11905,6 +12340,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11920,6 +12358,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11962,6 +12403,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11998,6 +12442,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -12031,6 +12478,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12154,10 +12604,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12184,6 +12634,12 @@ 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 ""
@@ -12220,9 +12676,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12238,9 +12691,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12274,10 +12724,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12322,7 +12772,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12340,9 +12790,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12385,6 +12832,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12880,6 +13330,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12943,6 +13402,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12973,7 +13468,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -13051,9 +13546,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -13066,6 +13558,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13213,6 +13708,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13252,6 +13750,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13261,6 +13762,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13285,6 +13789,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13312,6 +13822,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13357,6 +13870,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13408,6 +13924,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13432,9 +13951,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13447,6 +13963,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13483,6 +14002,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13744,9 +14266,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13897,6 +14416,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13945,6 +14467,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14278,6 +14803,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14554,6 +15088,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14635,15 +15175,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14749,6 +15289,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -15001,6 +15544,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15361,7 +15907,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15787,9 +16333,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15826,96 +16369,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15934,12 +16387,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15991,6 +16450,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -16024,6 +16489,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16192,6 +16660,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16201,9 +16672,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16213,9 +16681,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16255,19 +16756,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16276,18 +16798,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16297,6 +16834,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16519,6 +17062,9 @@ 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 ""
@@ -16594,10 +17140,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16645,6 +17188,9 @@ 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 ""
@@ -16660,7 +17206,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16720,6 +17266,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16744,6 +17293,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16945,6 +17497,9 @@ 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 ""
@@ -17014,9 +17569,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -17095,6 +17647,9 @@ 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 ""
@@ -17116,6 +17671,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17161,6 +17719,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17209,6 +17770,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17242,6 +17806,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17293,9 +17860,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17305,6 +17869,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17500,9 +18154,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17614,6 +18265,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17653,7 +18307,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -18013,6 +18667,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -18025,9 +18682,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -18085,6 +18739,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18355,6 +19012,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18436,9 +19096,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18448,9 +19105,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18499,6 +19153,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19210,6 +19867,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19219,6 +19879,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19237,6 +19900,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19447,6 +20113,12 @@ 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 ""
@@ -19465,12 +20137,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19705,6 +20371,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19726,6 +20395,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19768,6 +20440,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19873,6 +20548,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19894,9 +20572,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19924,6 +20608,9 @@ 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 ""
@@ -19960,6 +20647,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20188,13 +20878,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20209,6 +20905,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 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 ""
@@ -20224,9 +20923,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20254,6 +20950,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20308,9 +21007,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20422,6 +21118,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20443,6 +21145,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20476,9 +21181,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20656,7 +21367,7 @@ 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."
+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."
@@ -20689,7 +21400,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20704,6 +21415,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20716,10 +21433,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20788,6 +21505,9 @@ 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 ""
@@ -20842,9 +21562,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20899,6 +21616,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20911,6 +21637,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -21034,9 +21763,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -21055,6 +21781,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -21073,6 +21802,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -21112,6 +21847,9 @@ 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|npm command"
msgstr ""
@@ -21133,15 +21871,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21214,6 +21952,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21271,10 +22018,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21370,6 +22117,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21421,9 +22171,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21445,10 +22192,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21523,15 +22270,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21559,10 +22297,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21577,9 +22315,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21604,6 +22339,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21640,9 +22378,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21676,6 +22411,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21688,12 +22426,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21733,6 +22480,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21745,6 +22495,12 @@ 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 ""
@@ -21802,6 +22558,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21871,6 +22630,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21994,12 +22756,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -22060,21 +22828,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -22096,6 +22882,12 @@ 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 ""
@@ -22204,6 +22996,9 @@ 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 ""
@@ -22288,24 +23083,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22342,6 +23119,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22699,6 +23479,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22927,10 +23710,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22942,7 +23722,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22957,6 +23737,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22984,16 +23770,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -23032,13 +23815,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -23074,13 +23857,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -23107,16 +23893,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23140,7 +23935,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23164,52 +23959,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23488,10 +24280,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23500,9 +24292,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23518,6 +24307,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23533,6 +24331,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23545,22 +24349,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23569,6 +24373,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23659,9 +24469,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23704,9 +24511,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23719,6 +24523,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23812,7 +24619,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23908,7 +24715,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -24001,6 +24850,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -24037,6 +24889,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24211,6 +25066,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24316,6 +25174,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24382,6 +25243,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24550,7 +25414,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24604,12 +25468,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24685,6 +25552,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24712,6 +25585,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24808,6 +25687,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24826,6 +25708,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24940,9 +25825,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -25033,6 +25915,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25411,7 +26296,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25483,6 +26368,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25570,6 +26458,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25753,7 +26644,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25798,12 +26689,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25816,9 +26713,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25843,6 +26737,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25879,6 +26776,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25888,10 +26791,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25912,6 +26815,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25927,9 +26833,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25957,6 +26860,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25999,19 +26908,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -26035,12 +26944,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -26083,7 +26986,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -26092,7 +26995,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26179,9 +27082,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26230,7 +27130,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26272,12 +27172,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26320,7 +27226,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26497,6 +27403,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26689,6 +27598,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26845,7 +27757,7 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -27136,9 +28048,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27265,6 +28174,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27448,9 +28360,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27640,12 +28549,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -28150,67 +29062,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28297,6 +29209,12 @@ 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 ""
@@ -28306,7 +29224,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28501,6 +29419,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28564,6 +29485,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28576,6 +29500,9 @@ 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 ""
@@ -28597,6 +29524,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28645,9 +29575,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -29140,6 +30067,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29224,6 +30154,9 @@ 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 ""
@@ -29242,12 +30175,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29278,10 +30217,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29323,7 +30262,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29338,7 +30277,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29380,6 +30319,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29410,6 +30352,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29437,9 +30382,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29452,6 +30394,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29515,6 +30460,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29557,18 +30505,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29740,6 +30676,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -30037,6 +30976,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -30070,6 +31012,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30400,6 +31345,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30550,10 +31498,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30616,12 +31564,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30646,9 +31588,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30775,22 +31714,28 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30799,13 +31744,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30892,6 +31834,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30904,6 +31849,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30925,10 +31873,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30994,6 +31942,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -31126,6 +32089,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31297,9 +32263,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31477,6 +32440,12 @@ 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|Packages"
msgstr ""
@@ -31579,6 +32548,96 @@ 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 ""
@@ -31588,7 +32647,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31609,7 +32668,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31780,6 +32839,12 @@ 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 ""
@@ -31822,6 +32887,9 @@ 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 ""
@@ -31837,6 +32905,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31846,9 +32917,15 @@ 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 ""
@@ -31921,6 +32998,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -32038,6 +33118,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -32083,9 +33166,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32203,6 +33283,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32269,6 +33352,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32290,15 +33376,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32497,6 +33595,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32518,6 +33622,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32575,10 +33682,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32587,7 +33694,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32614,64 +33721,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32710,6 +33826,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32737,7 +33856,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32905,10 +34024,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -33004,9 +34120,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -33016,6 +34129,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -33082,7 +34198,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -33097,6 +34213,9 @@ 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 ""
@@ -33145,6 +34264,9 @@ 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 ""
@@ -33292,6 +34414,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33409,6 +34534,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33640,9 +34768,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33814,6 +34939,9 @@ 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 profile"
msgstr ""
@@ -33871,6 +34999,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33895,6 +35026,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -34108,6 +35242,9 @@ 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 ""
@@ -34240,6 +35377,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34393,6 +35533,9 @@ msgstr[2] ""
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 ""
@@ -34534,6 +35677,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34630,9 +35776,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34675,9 +35818,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34795,6 +35935,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34879,7 +36022,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34960,6 +36103,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34969,9 +36115,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -35020,9 +36172,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35314,6 +36463,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35341,6 +36496,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35368,9 +36526,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/hu_HU/gitlab.po b/locale/hu_HU/gitlab.po
index d37326a1551..70785d672cc 100644
--- a/locale/hu_HU/gitlab.po
+++ b/locale/hu_HU/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: hu\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:58\n"
+"PO-Revision-Date: 2021-03-05 23:55\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -170,6 +173,11 @@ 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] ""
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ 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 ""
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -682,6 +710,15 @@ 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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -976,6 +1016,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -988,9 +1031,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1015,9 +1055,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1111,6 +1148,11 @@ 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] ""
@@ -1162,6 +1204,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1282,6 +1327,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1635,9 +1779,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1716,12 +1857,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1818,6 +1965,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1938,6 +2103,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2058,6 +2226,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2091,6 +2268,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2259,6 +2442,15 @@ 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 ""
@@ -2268,6 +2460,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2361,6 +2562,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2394,6 +2607,21 @@ 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 ""
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2483,9 +2714,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2576,9 +2792,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,9 +2813,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,49 +2837,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,76 +2867,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,13 +2927,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2954,7 +3104,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2996,6 +3146,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3146,12 +3293,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3269,6 +3425,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3296,12 +3455,18 @@ 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 ""
@@ -3344,7 +3509,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3395,10 +3566,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3757,9 +3928,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3787,6 +3955,9 @@ 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 erase this build?"
msgstr ""
@@ -4048,12 +4219,6 @@ msgstr[1] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5028,6 +5235,26 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5688,7 +5915,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5703,6 +5930,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6036,21 +6266,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7325,16 +7594,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7349,6 +7642,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7391,6 +7729,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7430,6 +7771,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7451,6 +7795,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8245,10 +8577,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8302,6 +8637,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8314,6 +8652,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8329,6 +8670,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,13 +8991,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8647,7 +9024,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8689,6 +9066,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8722,6 +9102,18 @@ 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 ""
@@ -8886,7 +9278,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 ""
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9261,9 +9682,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9318,6 +9736,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9429,6 +9856,15 @@ 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 ""
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9660,6 +10093,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9678,9 +10114,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9690,19 +10123,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9717,10 +10150,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9735,7 +10165,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9756,10 +10186,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9768,7 +10204,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10047,18 +10482,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,7 +10710,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11048,19 +11468,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
-msgstr ""
-
-msgid "Enter the issue title"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11345,6 +11759,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11369,6 +11786,12 @@ 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 ""
@@ -11396,6 +11819,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11423,6 +11849,9 @@ 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 ""
@@ -11447,9 +11876,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11882,6 +12320,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11915,6 +12356,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12038,10 +12482,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12068,6 +12512,12 @@ 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 ""
@@ -12104,9 +12554,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,10 +12602,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12826,6 +13279,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12856,7 +13345,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12934,9 +13423,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13096,6 +13585,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13135,6 +13627,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13144,6 +13639,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13291,6 +13801,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13330,6 +13840,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13828,6 +14344,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14630,6 +15164,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15703,96 +16240,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16078,9 +16543,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ 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 ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ 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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16972,6 +17518,9 @@ 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 ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] ""
msgstr[1] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17085,6 +17640,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17118,6 +17676,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17169,9 +17730,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17181,6 +17739,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19590,6 +20253,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19737,6 +20406,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19788,6 +20466,9 @@ 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 ""
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ 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."
+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."
@@ -20552,7 +21257,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20579,10 +21290,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20651,6 +21362,9 @@ 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 ""
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20762,6 +21473,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21077,6 +21809,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21284,9 +22028,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21308,10 +22049,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,10 +22154,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ 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 ""
@@ -21665,6 +22415,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21923,21 +22685,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21959,6 +22739,12 @@ 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 ""
@@ -22067,6 +22853,9 @@ 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 ""
@@ -22151,24 +22940,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22205,6 +22976,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22562,6 +23336,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22790,10 +23567,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22805,7 +23579,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,13 +23672,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22937,13 +23714,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22970,16 +23750,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,52 +23816,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23381,6 +24164,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23396,6 +24188,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23408,22 +24206,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23432,6 +24230,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23522,9 +24326,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23675,7 +24476,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23771,7 +24572,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24072,6 +24921,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24243,6 +25098,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,7 +25269,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25595,7 +26480,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25721,6 +26612,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,10 +26627,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,19 +26744,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26161,7 +27062,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26338,6 +27239,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] ""
msgstr[1] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27287,9 +28194,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27479,12 +28383,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27989,67 +28896,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28136,6 +29043,12 @@ 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 ""
@@ -28145,7 +29058,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ 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 ""
@@ -29076,12 +30004,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29112,10 +30046,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29157,7 +30091,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29574,6 +30505,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30382,10 +31325,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30735,6 +31675,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30756,10 +31699,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31308,6 +32266,12 @@ 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|Packages"
msgstr ""
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ 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 ""
@@ -31653,6 +32713,9 @@ 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 ""
@@ -31668,6 +32731,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ 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 ""
@@ -31752,6 +32824,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31912,9 +32990,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32032,6 +33107,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,10 +33847,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32832,9 +33943,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ 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 ""
@@ -33120,6 +34237,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33237,6 +34357,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33642,6 +34762,9 @@ 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 profile"
msgstr ""
@@ -33699,6 +34822,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 ""
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34215,6 +35350,9 @@ 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 ""
@@ -34354,6 +35492,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34698,7 +35836,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35128,6 +36272,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/hy_AM/gitlab.po b/locale/hy_AM/gitlab.po
index 85f9db67250..148899cd451 100644
--- a/locale/hy_AM/gitlab.po
+++ b/locale/hy_AM/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: hy-AM\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:58\n"
+"PO-Revision-Date: 2021-03-05 23:55\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -170,6 +173,11 @@ 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] ""
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ 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 ""
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -682,6 +710,15 @@ 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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -976,6 +1016,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -988,9 +1031,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1015,9 +1055,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1111,6 +1148,11 @@ 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] ""
@@ -1162,6 +1204,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1282,6 +1327,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1635,9 +1779,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1716,12 +1857,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1818,6 +1965,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1938,6 +2103,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2058,6 +2226,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2091,6 +2268,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2259,6 +2442,15 @@ 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 ""
@@ -2268,6 +2460,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2361,6 +2562,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2394,6 +2607,21 @@ 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 ""
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2483,9 +2714,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2576,9 +2792,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,9 +2813,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,49 +2837,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,76 +2867,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,13 +2927,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2954,7 +3104,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2996,6 +3146,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3146,12 +3293,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3269,6 +3425,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3296,12 +3455,18 @@ 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 ""
@@ -3344,7 +3509,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3395,10 +3566,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3757,9 +3928,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3787,6 +3955,9 @@ 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 erase this build?"
msgstr ""
@@ -4048,12 +4219,6 @@ msgstr[1] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5028,6 +5235,26 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5688,7 +5915,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5703,6 +5930,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6036,21 +6266,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7325,16 +7594,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7349,6 +7642,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7391,6 +7729,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7430,6 +7771,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7451,6 +7795,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8245,10 +8577,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8302,6 +8637,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8314,6 +8652,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8329,6 +8670,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,13 +8991,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8647,7 +9024,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8689,6 +9066,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8722,6 +9102,18 @@ 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 ""
@@ -8886,7 +9278,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 ""
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9261,9 +9682,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9318,6 +9736,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9429,6 +9856,15 @@ 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 ""
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9660,6 +10093,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9678,9 +10114,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9690,19 +10123,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9717,10 +10150,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9735,7 +10165,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9756,10 +10186,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9768,7 +10204,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10047,18 +10482,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,7 +10710,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11048,19 +11468,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
-msgstr ""
-
-msgid "Enter the issue title"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11345,6 +11759,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11369,6 +11786,12 @@ 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 ""
@@ -11396,6 +11819,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11423,6 +11849,9 @@ 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 ""
@@ -11447,9 +11876,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11882,6 +12320,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11915,6 +12356,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12038,10 +12482,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12068,6 +12512,12 @@ 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 ""
@@ -12104,9 +12554,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,10 +12602,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12826,6 +13279,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12856,7 +13345,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12934,9 +13423,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13096,6 +13585,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13135,6 +13627,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13144,6 +13639,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13291,6 +13801,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13330,6 +13840,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13828,6 +14344,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14630,6 +15164,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15703,96 +16240,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16078,9 +16543,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ 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 ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ 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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16972,6 +17518,9 @@ 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 ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] ""
msgstr[1] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17085,6 +17640,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17118,6 +17676,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17169,9 +17730,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17181,6 +17739,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19590,6 +20253,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19737,6 +20406,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19788,6 +20466,9 @@ 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 ""
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ 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."
+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."
@@ -20552,7 +21257,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20579,10 +21290,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20651,6 +21362,9 @@ 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 ""
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20762,6 +21473,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21077,6 +21809,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21284,9 +22028,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21308,10 +22049,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,10 +22154,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ 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 ""
@@ -21665,6 +22415,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21923,21 +22685,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21959,6 +22739,12 @@ 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 ""
@@ -22067,6 +22853,9 @@ 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 ""
@@ -22151,24 +22940,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22205,6 +22976,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22562,6 +23336,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22790,10 +23567,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22805,7 +23579,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,13 +23672,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22937,13 +23714,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22970,16 +23750,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,52 +23816,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23381,6 +24164,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23396,6 +24188,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23408,22 +24206,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23432,6 +24230,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23522,9 +24326,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23675,7 +24476,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23771,7 +24572,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24072,6 +24921,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24243,6 +25098,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,7 +25269,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25595,7 +26480,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25721,6 +26612,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,10 +26627,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,19 +26744,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26161,7 +27062,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26338,6 +27239,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] ""
msgstr[1] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27287,9 +28194,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27479,12 +28383,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27989,67 +28896,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28136,6 +29043,12 @@ 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 ""
@@ -28145,7 +29058,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ 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 ""
@@ -29076,12 +30004,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29112,10 +30046,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29157,7 +30091,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29574,6 +30505,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30382,10 +31325,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30735,6 +31675,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30756,10 +31699,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31308,6 +32266,12 @@ 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|Packages"
msgstr ""
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ 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 ""
@@ -31653,6 +32713,9 @@ 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 ""
@@ -31668,6 +32731,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ 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 ""
@@ -31752,6 +32824,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31912,9 +32990,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32032,6 +33107,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,10 +33847,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32832,9 +33943,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ 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 ""
@@ -33120,6 +34237,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33237,6 +34357,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33642,6 +34762,9 @@ 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 profile"
msgstr ""
@@ -33699,6 +34822,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 ""
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34215,6 +35350,9 @@ 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 ""
@@ -34354,6 +35492,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34698,7 +35836,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35128,6 +36272,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/id_ID/gitlab.po b/locale/id_ID/gitlab.po
index 498e369549e..0f3d3769df2 100644
--- a/locale/id_ID/gitlab.po
+++ b/locale/id_ID/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: id\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:06\n"
+"PO-Revision-Date: 2021-03-05 23:49\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -72,6 +72,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -150,6 +153,10 @@ msgid "%d day"
msgid_plural "%d days"
msgstr[0] ""
+msgid "%d epic"
+msgid_plural "%d epics"
+msgstr[0] ""
+
msgid "%d error"
msgid_plural "%d errors"
msgstr[0] ""
@@ -290,6 +297,10 @@ msgid "%d vulnerability dismissed"
msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -363,6 +374,9 @@ msgid "%{count} issue selected"
msgid_plural "%{count} issues selected"
msgstr[0] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -432,6 +446,9 @@ 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 ""
@@ -483,6 +500,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -591,6 +611,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -619,6 +645,15 @@ msgstr[0] ""
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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -665,9 +700,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -709,6 +741,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -879,6 +914,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -901,6 +939,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -913,9 +954,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -940,9 +978,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1027,6 +1062,10 @@ msgid "1 deploy key"
msgid_plural "%d deploy keys"
msgstr[0] ""
+msgid "1 follower"
+msgid_plural "%{count} followers"
+msgstr[0] ""
+
msgid "1 group"
msgid_plural "%d groups"
msgstr[0] ""
@@ -1069,6 +1108,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1189,6 +1231,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1288,6 +1333,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1541,9 +1682,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1622,12 +1760,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1724,6 +1868,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1784,6 +1943,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1844,6 +2006,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -1964,6 +2129,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -1988,6 +2159,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -1997,6 +2171,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2072,6 +2249,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2165,6 +2345,15 @@ 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 ""
@@ -2174,6 +2363,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2258,6 +2450,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2267,6 +2465,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2300,6 +2510,21 @@ 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 ""
@@ -2324,6 +2549,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2388,9 +2616,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2403,24 +2628,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2481,9 +2694,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2493,6 +2703,9 @@ 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 ""
@@ -2502,9 +2715,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2529,49 +2739,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2583,9 +2760,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2595,76 +2769,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
-msgstr ""
-
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2676,13 +2829,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2694,9 +2847,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2709,7 +2859,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2796,9 +2946,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2859,7 +3006,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2901,6 +3048,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -2967,12 +3117,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3051,12 +3195,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3081,6 +3231,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3174,6 +3327,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3201,12 +3357,18 @@ 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 ""
@@ -3249,7 +3411,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3288,6 +3453,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3300,10 +3468,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3658,9 +3826,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3688,6 +3853,9 @@ 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 erase this build?"
msgstr ""
@@ -3946,12 +4114,6 @@ msgstr[0] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4024,6 +4186,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4450,6 +4615,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4462,12 +4630,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4535,6 +4715,12 @@ 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 ""
@@ -4625,12 +4811,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -4799,16 +4979,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4823,6 +5015,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4856,6 +5051,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4874,6 +5075,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -4925,6 +5129,25 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5060,6 +5283,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5213,12 +5439,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5363,6 +5583,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5585,7 +5808,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5600,6 +5823,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -5933,21 +6159,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -5957,9 +6204,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6968,6 +7227,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7037,6 +7299,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7221,16 +7486,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
+msgstr ""
+
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Create merge request"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7245,6 +7534,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7257,9 +7552,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7275,6 +7600,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7287,6 +7621,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7326,6 +7663,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7347,6 +7687,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7401,9 +7744,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7574,24 +7914,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8049,10 +8380,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8088,9 +8419,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8137,10 +8465,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8167,6 +8495,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8194,6 +8525,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8206,6 +8540,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8221,6 +8558,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8293,6 +8636,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8302,15 +8648,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8329,6 +8690,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8338,6 +8702,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8353,6 +8720,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8458,6 +8828,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8506,13 +8879,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8539,7 +8912,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8581,6 +8954,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8614,6 +8990,18 @@ 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 ""
@@ -8777,7 +9165,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -8933,7 +9321,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -8957,6 +9351,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9038,6 +9435,9 @@ 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 ""
@@ -9047,6 +9447,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9071,6 +9474,10 @@ 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] ""
+
msgid "DastSiteValidation|Validate"
msgstr ""
@@ -9089,6 +9496,9 @@ 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 ""
@@ -9110,6 +9520,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9134,6 +9547,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9152,9 +9568,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9209,6 +9622,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9239,6 +9655,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9296,6 +9715,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9320,6 +9742,15 @@ 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 ""
@@ -9488,13 +9919,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
-msgstr ""
-
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9503,6 +9931,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9512,15 +9943,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9545,6 +9973,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9563,9 +9994,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9575,19 +10003,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9602,10 +10030,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9620,7 +10045,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9641,10 +10066,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9653,7 +10084,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9683,6 +10114,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9692,15 +10126,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9710,6 +10135,10 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+
msgid "Deployment|API"
msgstr ""
@@ -9932,18 +10361,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -9959,16 +10376,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -9989,10 +10406,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10001,18 +10415,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10025,9 +10433,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10037,6 +10442,12 @@ 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 ""
@@ -10064,6 +10475,9 @@ 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|Score"
msgstr ""
@@ -10175,7 +10589,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10377,6 +10791,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10569,10 +10986,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10641,12 +11058,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10767,6 +11178,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -10932,19 +11346,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the issue title"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request description"
-msgstr ""
-
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11229,6 +11637,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11253,6 +11664,12 @@ 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 ""
@@ -11280,6 +11697,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11307,6 +11727,9 @@ 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 ""
@@ -11331,9 +11754,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11508,6 +11928,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11673,6 +12096,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11688,6 +12114,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11730,6 +12159,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11766,6 +12198,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11799,6 +12234,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -11922,10 +12360,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -11952,6 +12390,12 @@ 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 ""
@@ -11988,9 +12432,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12006,9 +12447,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12042,10 +12480,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12090,7 +12528,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12108,9 +12546,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12153,6 +12588,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12646,6 +13084,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12709,6 +13156,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12739,7 +13222,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12817,9 +13300,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12832,6 +13312,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -12979,6 +13462,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13018,6 +13504,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13027,6 +13516,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13051,6 +13543,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13078,6 +13576,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13123,6 +13624,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13174,6 +13678,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13198,9 +13705,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13213,6 +13717,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13249,6 +13756,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13510,9 +14020,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13663,6 +14170,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13711,6 +14221,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14044,6 +14557,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14320,6 +14842,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14401,15 +14929,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14511,6 +15039,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14759,6 +15290,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15117,7 +15651,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15543,9 +16077,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15580,96 +16111,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15688,12 +16129,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15745,6 +16192,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15778,6 +16231,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -15946,6 +16402,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -15955,9 +16414,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -15967,9 +16423,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16009,19 +16498,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16030,18 +16540,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16051,6 +16576,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16273,6 +16804,9 @@ 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 ""
@@ -16348,10 +16882,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16399,6 +16930,9 @@ 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 ""
@@ -16414,7 +16948,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16474,6 +17008,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16498,6 +17035,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16699,6 +17239,9 @@ 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 ""
@@ -16768,9 +17311,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16849,6 +17389,9 @@ 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 ""
@@ -16868,6 +17411,9 @@ msgid "Last %d day"
msgid_plural "Last %d days"
msgstr[0] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -16913,6 +17459,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -16961,6 +17510,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -16994,6 +17546,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17045,9 +17600,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17057,6 +17609,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17240,9 +17882,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17352,6 +17991,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17391,7 +18033,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17751,6 +18393,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17763,9 +18408,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17823,6 +18465,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18093,6 +18738,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18174,9 +18822,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18186,9 +18831,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18237,6 +18879,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -18944,6 +19589,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -18953,6 +19601,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -18971,6 +19622,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19177,6 +19831,12 @@ 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 ""
@@ -19195,12 +19855,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19433,6 +20087,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19454,6 +20111,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19496,6 +20156,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19601,6 +20264,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19622,9 +20288,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19652,6 +20324,9 @@ 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 ""
@@ -19688,6 +20363,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -19916,13 +20594,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -19937,6 +20621,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 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 ""
@@ -19952,9 +20639,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -19982,6 +20666,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20036,9 +20723,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20150,6 +20834,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20171,6 +20861,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20204,9 +20897,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20382,7 +21081,7 @@ 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."
+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."
@@ -20415,7 +21114,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20430,6 +21129,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20442,10 +21147,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20514,6 +21219,9 @@ 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 ""
@@ -20568,9 +21276,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20625,6 +21330,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20637,6 +21351,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20760,9 +21477,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20781,6 +21495,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20799,6 +21516,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20838,6 +21561,9 @@ 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|npm command"
msgstr ""
@@ -20859,15 +21585,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -20940,6 +21666,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -20997,10 +21732,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21096,6 +21831,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21147,9 +21885,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21171,10 +21906,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21249,15 +21984,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21285,10 +22011,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21303,9 +22029,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21330,6 +22053,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21366,9 +22092,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21402,6 +22125,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21414,12 +22140,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21459,6 +22194,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21471,6 +22209,12 @@ 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 ""
@@ -21528,6 +22272,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21597,6 +22344,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21720,12 +22470,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21786,21 +22542,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21822,6 +22596,12 @@ 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 ""
@@ -21930,6 +22710,9 @@ 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 ""
@@ -22014,24 +22797,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22068,6 +22833,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22425,6 +23193,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22653,10 +23424,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22668,7 +23436,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22683,6 +23451,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22710,16 +23484,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22758,13 +23529,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22800,13 +23571,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22833,16 +23607,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -22866,7 +23649,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -22890,52 +23673,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23214,10 +23994,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23226,9 +24006,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23244,6 +24021,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23259,6 +24045,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23271,22 +24063,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23295,6 +24087,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23385,9 +24183,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23430,9 +24225,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23445,6 +24237,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23538,7 +24333,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23634,7 +24429,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23727,6 +24564,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23763,6 +24603,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -23933,6 +24776,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24038,6 +24884,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24104,6 +24953,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24272,7 +25124,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24322,12 +25174,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24399,6 +25254,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24426,6 +25287,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24522,6 +25389,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24540,6 +25410,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24650,9 +25523,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24743,6 +25613,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25117,7 +25990,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25189,6 +26062,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25276,6 +26152,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25437,7 +26316,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25482,12 +26361,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25500,9 +26385,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25527,6 +26409,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25563,6 +26448,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25572,10 +26463,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25596,6 +26487,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25611,9 +26505,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25641,6 +26532,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25683,19 +26580,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25719,10 +26616,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25765,7 +26658,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25774,7 +26667,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -25861,9 +26754,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -25912,7 +26802,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -25954,12 +26844,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26002,7 +26898,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26179,6 +27075,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26371,6 +27270,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26525,7 +27427,7 @@ msgid "Showing %d event"
msgid_plural "Showing %d events"
msgstr[0] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26814,9 +27716,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -26943,6 +27842,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27126,9 +28028,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27318,12 +28217,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27828,67 +28730,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -27975,6 +28877,12 @@ 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 ""
@@ -27984,7 +28892,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28179,6 +29087,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28238,6 +29149,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28250,6 +29164,9 @@ 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 ""
@@ -28271,6 +29188,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28317,9 +29237,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28808,6 +29725,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -28892,6 +29812,9 @@ 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 ""
@@ -28910,12 +29833,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -28946,10 +29875,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -28991,7 +29920,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29006,7 +29935,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29048,6 +29977,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29078,6 +30010,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29105,9 +30040,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29120,6 +30052,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29183,6 +30118,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29225,18 +30163,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29408,6 +30334,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29705,6 +30634,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29738,6 +30670,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30064,6 +30999,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30214,10 +31152,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30280,12 +31218,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30310,9 +31242,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30439,20 +31368,26 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30461,13 +31396,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30554,6 +31486,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30566,6 +31501,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30587,10 +31525,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30656,6 +31594,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30788,6 +31741,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -30959,9 +31915,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31139,6 +32092,12 @@ 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|Packages"
msgstr ""
@@ -31241,6 +32200,96 @@ 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 ""
@@ -31250,7 +32299,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31271,7 +32320,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31442,6 +32491,12 @@ 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 ""
@@ -31484,6 +32539,9 @@ 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 ""
@@ -31499,6 +32557,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31508,9 +32569,15 @@ 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 ""
@@ -31583,6 +32650,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31700,6 +32770,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31741,9 +32814,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -31861,6 +32931,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -31927,6 +33000,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -31948,15 +33024,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32155,6 +33243,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32176,6 +33270,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32233,10 +33330,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32245,7 +33342,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32272,64 +33369,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32368,6 +33474,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32395,7 +33504,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32561,10 +33670,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32660,9 +33766,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32672,6 +33775,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32738,7 +33844,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32753,6 +33859,9 @@ 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 ""
@@ -32801,6 +33910,9 @@ 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 ""
@@ -32948,6 +34060,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33065,6 +34180,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33296,9 +34414,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33470,6 +34585,9 @@ 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 profile"
msgstr ""
@@ -33527,6 +34645,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33549,6 +34670,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33762,6 +34886,9 @@ 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 ""
@@ -33892,6 +35019,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34037,6 +35167,9 @@ msgstr[0] ""
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 ""
@@ -34174,6 +35307,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34270,9 +35406,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34313,9 +35446,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34433,6 +35563,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34517,7 +35650,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34598,6 +35731,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34607,9 +35743,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34658,9 +35800,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -34942,6 +36081,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -34969,6 +36114,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -34996,9 +36144,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/ig_NG/gitlab.po b/locale/ig_NG/gitlab.po
index 7757db13f90..3c3ff84a4c5 100644
--- a/locale/ig_NG/gitlab.po
+++ b/locale/ig_NG/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: ig\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:54\n"
+"PO-Revision-Date: 2021-03-05 23:53\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -72,6 +72,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -150,6 +153,10 @@ msgid "%d day"
msgid_plural "%d days"
msgstr[0] ""
+msgid "%d epic"
+msgid_plural "%d epics"
+msgstr[0] ""
+
msgid "%d error"
msgid_plural "%d errors"
msgstr[0] ""
@@ -290,6 +297,10 @@ msgid "%d vulnerability dismissed"
msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -363,6 +374,9 @@ msgid "%{count} issue selected"
msgid_plural "%{count} issues selected"
msgstr[0] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -432,6 +446,9 @@ 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 ""
@@ -483,6 +500,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -591,6 +611,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -619,6 +645,15 @@ msgstr[0] ""
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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -665,9 +700,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -709,6 +741,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -879,6 +914,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -901,6 +939,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -913,9 +954,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -940,9 +978,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1027,6 +1062,10 @@ msgid "1 deploy key"
msgid_plural "%d deploy keys"
msgstr[0] ""
+msgid "1 follower"
+msgid_plural "%{count} followers"
+msgstr[0] ""
+
msgid "1 group"
msgid_plural "%d groups"
msgstr[0] ""
@@ -1069,6 +1108,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1189,6 +1231,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1288,6 +1333,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1541,9 +1682,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1622,12 +1760,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1724,6 +1868,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1784,6 +1943,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1844,6 +2006,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -1964,6 +2129,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -1988,6 +2159,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -1997,6 +2171,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2072,6 +2249,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2165,6 +2345,15 @@ 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 ""
@@ -2174,6 +2363,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2258,6 +2450,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2267,6 +2465,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2300,6 +2510,21 @@ 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 ""
@@ -2324,6 +2549,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2388,9 +2616,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2403,24 +2628,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2481,9 +2694,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2493,6 +2703,9 @@ 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 ""
@@ -2502,9 +2715,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2529,49 +2739,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2583,9 +2760,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2595,76 +2769,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
-msgstr ""
-
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2676,13 +2829,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2694,9 +2847,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2709,7 +2859,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2796,9 +2946,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2859,7 +3006,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2901,6 +3048,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -2967,12 +3117,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3051,12 +3195,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3081,6 +3231,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3174,6 +3327,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3201,12 +3357,18 @@ 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 ""
@@ -3249,7 +3411,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3288,6 +3453,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3300,10 +3468,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3658,9 +3826,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3688,6 +3853,9 @@ 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 erase this build?"
msgstr ""
@@ -3946,12 +4114,6 @@ msgstr[0] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4024,6 +4186,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4450,6 +4615,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4462,12 +4630,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4535,6 +4715,12 @@ 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 ""
@@ -4625,12 +4811,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -4799,16 +4979,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4823,6 +5015,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4856,6 +5051,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4874,6 +5075,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -4925,6 +5129,25 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5060,6 +5283,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5213,12 +5439,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5363,6 +5583,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5585,7 +5808,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5600,6 +5823,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -5933,21 +6159,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -5957,9 +6204,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6968,6 +7227,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7037,6 +7299,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7221,16 +7486,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
+msgstr ""
+
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Create merge request"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7245,6 +7534,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7257,9 +7552,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7275,6 +7600,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7287,6 +7621,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7326,6 +7663,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7347,6 +7687,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7401,9 +7744,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7574,24 +7914,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8049,10 +8380,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8088,9 +8419,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8137,10 +8465,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8167,6 +8495,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8194,6 +8525,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8206,6 +8540,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8221,6 +8558,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8293,6 +8636,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8302,15 +8648,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8329,6 +8690,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8338,6 +8702,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8353,6 +8720,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8458,6 +8828,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8506,13 +8879,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8539,7 +8912,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8581,6 +8954,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8614,6 +8990,18 @@ 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 ""
@@ -8777,7 +9165,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -8933,7 +9321,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -8957,6 +9351,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9038,6 +9435,9 @@ 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 ""
@@ -9047,6 +9447,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9071,6 +9474,10 @@ 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] ""
+
msgid "DastSiteValidation|Validate"
msgstr ""
@@ -9089,6 +9496,9 @@ 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 ""
@@ -9110,6 +9520,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9134,6 +9547,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9152,9 +9568,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9209,6 +9622,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9239,6 +9655,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9296,6 +9715,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9320,6 +9742,15 @@ 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 ""
@@ -9488,13 +9919,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
-msgstr ""
-
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9503,6 +9931,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9512,15 +9943,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9545,6 +9973,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9563,9 +9994,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9575,19 +10003,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9602,10 +10030,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9620,7 +10045,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9641,10 +10066,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9653,7 +10084,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9683,6 +10114,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9692,15 +10126,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9710,6 +10135,10 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+
msgid "Deployment|API"
msgstr ""
@@ -9932,18 +10361,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -9959,16 +10376,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -9989,10 +10406,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10001,18 +10415,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10025,9 +10433,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10037,6 +10442,12 @@ 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 ""
@@ -10064,6 +10475,9 @@ 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|Score"
msgstr ""
@@ -10175,7 +10589,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10377,6 +10791,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10569,10 +10986,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10641,12 +11058,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10767,6 +11178,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -10932,19 +11346,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the issue title"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request description"
-msgstr ""
-
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11229,6 +11637,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11253,6 +11664,12 @@ 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 ""
@@ -11280,6 +11697,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11307,6 +11727,9 @@ 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 ""
@@ -11331,9 +11754,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11508,6 +11928,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11673,6 +12096,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11688,6 +12114,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11730,6 +12159,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11766,6 +12198,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11799,6 +12234,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -11922,10 +12360,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -11952,6 +12390,12 @@ 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 ""
@@ -11988,9 +12432,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12006,9 +12447,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12042,10 +12480,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12090,7 +12528,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12108,9 +12546,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12153,6 +12588,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12646,6 +13084,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12709,6 +13156,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12739,7 +13222,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12817,9 +13300,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12832,6 +13312,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -12979,6 +13462,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13018,6 +13504,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13027,6 +13516,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13051,6 +13543,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13078,6 +13576,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13123,6 +13624,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13174,6 +13678,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13198,9 +13705,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13213,6 +13717,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13249,6 +13756,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13510,9 +14020,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13663,6 +14170,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13711,6 +14221,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14044,6 +14557,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14320,6 +14842,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14401,15 +14929,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14511,6 +15039,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14759,6 +15290,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15117,7 +15651,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15543,9 +16077,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15580,96 +16111,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15688,12 +16129,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15745,6 +16192,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15778,6 +16231,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -15946,6 +16402,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -15955,9 +16414,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -15967,9 +16423,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16009,19 +16498,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16030,18 +16540,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16051,6 +16576,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16273,6 +16804,9 @@ 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 ""
@@ -16348,10 +16882,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16399,6 +16930,9 @@ 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 ""
@@ -16414,7 +16948,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16474,6 +17008,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16498,6 +17035,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16699,6 +17239,9 @@ 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 ""
@@ -16768,9 +17311,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16849,6 +17389,9 @@ 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 ""
@@ -16868,6 +17411,9 @@ msgid "Last %d day"
msgid_plural "Last %d days"
msgstr[0] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -16913,6 +17459,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -16961,6 +17510,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -16994,6 +17546,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17045,9 +17600,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17057,6 +17609,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17240,9 +17882,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17352,6 +17991,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17391,7 +18033,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17751,6 +18393,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17763,9 +18408,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17823,6 +18465,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18093,6 +18738,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18174,9 +18822,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18186,9 +18831,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18237,6 +18879,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -18944,6 +19589,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -18953,6 +19601,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -18971,6 +19622,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19177,6 +19831,12 @@ 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 ""
@@ -19195,12 +19855,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19433,6 +20087,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19454,6 +20111,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19496,6 +20156,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19601,6 +20264,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19622,9 +20288,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19652,6 +20324,9 @@ 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 ""
@@ -19688,6 +20363,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -19916,13 +20594,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -19937,6 +20621,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 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 ""
@@ -19952,9 +20639,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -19982,6 +20666,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20036,9 +20723,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20150,6 +20834,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20171,6 +20861,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20204,9 +20897,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20382,7 +21081,7 @@ 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."
+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."
@@ -20415,7 +21114,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20430,6 +21129,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20442,10 +21147,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20514,6 +21219,9 @@ 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 ""
@@ -20568,9 +21276,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20625,6 +21330,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20637,6 +21351,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20760,9 +21477,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20781,6 +21495,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20799,6 +21516,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20838,6 +21561,9 @@ 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|npm command"
msgstr ""
@@ -20859,15 +21585,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -20940,6 +21666,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -20997,10 +21732,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21096,6 +21831,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21147,9 +21885,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21171,10 +21906,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21249,15 +21984,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21285,10 +22011,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21303,9 +22029,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21330,6 +22053,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21366,9 +22092,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21402,6 +22125,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21414,12 +22140,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21459,6 +22194,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21471,6 +22209,12 @@ 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 ""
@@ -21528,6 +22272,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21597,6 +22344,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21720,12 +22470,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21786,21 +22542,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21822,6 +22596,12 @@ 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 ""
@@ -21930,6 +22710,9 @@ 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 ""
@@ -22014,24 +22797,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22068,6 +22833,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22425,6 +23193,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22653,10 +23424,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22668,7 +23436,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22683,6 +23451,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22710,16 +23484,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22758,13 +23529,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22800,13 +23571,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22833,16 +23607,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -22866,7 +23649,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -22890,52 +23673,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23214,10 +23994,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23226,9 +24006,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23244,6 +24021,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23259,6 +24045,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23271,22 +24063,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23295,6 +24087,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23385,9 +24183,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23430,9 +24225,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23445,6 +24237,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23538,7 +24333,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23634,7 +24429,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23727,6 +24564,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23763,6 +24603,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -23933,6 +24776,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24038,6 +24884,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24104,6 +24953,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24272,7 +25124,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24322,12 +25174,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24399,6 +25254,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24426,6 +25287,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24522,6 +25389,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24540,6 +25410,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24650,9 +25523,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24743,6 +25613,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25117,7 +25990,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25189,6 +26062,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25276,6 +26152,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25437,7 +26316,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25482,12 +26361,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25500,9 +26385,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25527,6 +26409,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25563,6 +26448,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25572,10 +26463,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25596,6 +26487,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25611,9 +26505,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25641,6 +26532,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25683,19 +26580,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25719,10 +26616,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25765,7 +26658,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25774,7 +26667,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -25861,9 +26754,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -25912,7 +26802,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -25954,12 +26844,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26002,7 +26898,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26179,6 +27075,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26371,6 +27270,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26525,7 +27427,7 @@ msgid "Showing %d event"
msgid_plural "Showing %d events"
msgstr[0] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26814,9 +27716,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -26943,6 +27842,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27126,9 +28028,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27318,12 +28217,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27828,67 +28730,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -27975,6 +28877,12 @@ 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 ""
@@ -27984,7 +28892,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28179,6 +29087,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28238,6 +29149,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28250,6 +29164,9 @@ 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 ""
@@ -28271,6 +29188,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28317,9 +29237,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28808,6 +29725,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -28892,6 +29812,9 @@ 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 ""
@@ -28910,12 +29833,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -28946,10 +29875,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -28991,7 +29920,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29006,7 +29935,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29048,6 +29977,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29078,6 +30010,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29105,9 +30040,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29120,6 +30052,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29183,6 +30118,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29225,18 +30163,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29408,6 +30334,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29705,6 +30634,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29738,6 +30670,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30064,6 +30999,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30214,10 +31152,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30280,12 +31218,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30310,9 +31242,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30439,20 +31368,26 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30461,13 +31396,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30554,6 +31486,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30566,6 +31501,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30587,10 +31525,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30656,6 +31594,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30788,6 +31741,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -30959,9 +31915,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31139,6 +32092,12 @@ 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|Packages"
msgstr ""
@@ -31241,6 +32200,96 @@ 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 ""
@@ -31250,7 +32299,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31271,7 +32320,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31442,6 +32491,12 @@ 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 ""
@@ -31484,6 +32539,9 @@ 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 ""
@@ -31499,6 +32557,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31508,9 +32569,15 @@ 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 ""
@@ -31583,6 +32650,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31700,6 +32770,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31741,9 +32814,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -31861,6 +32931,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -31927,6 +33000,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -31948,15 +33024,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32155,6 +33243,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32176,6 +33270,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32233,10 +33330,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32245,7 +33342,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32272,64 +33369,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32368,6 +33474,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32395,7 +33504,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32561,10 +33670,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32660,9 +33766,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32672,6 +33775,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32738,7 +33844,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32753,6 +33859,9 @@ 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 ""
@@ -32801,6 +33910,9 @@ 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 ""
@@ -32948,6 +34060,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33065,6 +34180,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33296,9 +34414,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33470,6 +34585,9 @@ 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 profile"
msgstr ""
@@ -33527,6 +34645,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33549,6 +34670,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33762,6 +34886,9 @@ 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 ""
@@ -33892,6 +35019,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34037,6 +35167,9 @@ msgstr[0] ""
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 ""
@@ -34174,6 +35307,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34270,9 +35406,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34313,9 +35446,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34433,6 +35563,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34517,7 +35650,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34598,6 +35731,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34607,9 +35743,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34658,9 +35800,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -34942,6 +36081,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -34969,6 +36114,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -34996,9 +36144,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/is_IS/gitlab.po b/locale/is_IS/gitlab.po
index 96e0ed945de..3e29b18b6a2 100644
--- a/locale/is_IS/gitlab.po
+++ b/locale/is_IS/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: is\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:05\n"
+"PO-Revision-Date: 2021-03-05 23:49\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -170,6 +173,11 @@ 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] ""
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ 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 ""
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -682,6 +710,15 @@ 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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -976,6 +1016,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -988,9 +1031,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1015,9 +1055,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1111,6 +1148,11 @@ 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] ""
@@ -1162,6 +1204,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1282,6 +1327,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1635,9 +1779,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1716,12 +1857,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1818,6 +1965,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1938,6 +2103,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2058,6 +2226,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2091,6 +2268,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2259,6 +2442,15 @@ 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 ""
@@ -2268,6 +2460,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2361,6 +2562,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2394,6 +2607,21 @@ 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 ""
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2483,9 +2714,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2576,9 +2792,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,9 +2813,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,49 +2837,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,76 +2867,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,13 +2927,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2954,7 +3104,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2996,6 +3146,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3146,12 +3293,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3269,6 +3425,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3296,12 +3455,18 @@ 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 ""
@@ -3344,7 +3509,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3395,10 +3566,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3757,9 +3928,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3787,6 +3955,9 @@ 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 erase this build?"
msgstr ""
@@ -4048,12 +4219,6 @@ msgstr[1] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5028,6 +5235,26 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5688,7 +5915,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5703,6 +5930,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6036,21 +6266,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7325,16 +7594,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7349,6 +7642,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7391,6 +7729,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7430,6 +7771,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7451,6 +7795,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8245,10 +8577,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8302,6 +8637,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8314,6 +8652,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8329,6 +8670,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,13 +8991,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8647,7 +9024,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8689,6 +9066,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8722,6 +9102,18 @@ 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 ""
@@ -8886,7 +9278,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 ""
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9261,9 +9682,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9318,6 +9736,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9429,6 +9856,15 @@ 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 ""
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9660,6 +10093,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9678,9 +10114,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9690,19 +10123,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9717,10 +10150,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9735,7 +10165,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9756,10 +10186,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9768,7 +10204,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10047,18 +10482,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,7 +10710,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11048,19 +11468,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
-msgstr ""
-
-msgid "Enter the issue title"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11345,6 +11759,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11369,6 +11786,12 @@ 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 ""
@@ -11396,6 +11819,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11423,6 +11849,9 @@ 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 ""
@@ -11447,9 +11876,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11882,6 +12320,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11915,6 +12356,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12038,10 +12482,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12068,6 +12512,12 @@ 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 ""
@@ -12104,9 +12554,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,10 +12602,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12826,6 +13279,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12856,7 +13345,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12934,9 +13423,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13096,6 +13585,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13135,6 +13627,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13144,6 +13639,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13291,6 +13801,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13330,6 +13840,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13828,6 +14344,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14630,6 +15164,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15703,96 +16240,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16078,9 +16543,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ 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 ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ 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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16972,6 +17518,9 @@ 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 ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] ""
msgstr[1] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17085,6 +17640,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17118,6 +17676,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17169,9 +17730,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17181,6 +17739,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19590,6 +20253,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19737,6 +20406,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19788,6 +20466,9 @@ 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 ""
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ 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."
+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."
@@ -20552,7 +21257,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20579,10 +21290,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20651,6 +21362,9 @@ 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 ""
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20762,6 +21473,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21077,6 +21809,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21284,9 +22028,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21308,10 +22049,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,10 +22154,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ 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 ""
@@ -21665,6 +22415,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21923,21 +22685,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21959,6 +22739,12 @@ 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 ""
@@ -22067,6 +22853,9 @@ 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 ""
@@ -22151,24 +22940,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22205,6 +22976,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22562,6 +23336,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22790,10 +23567,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22805,7 +23579,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,13 +23672,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22937,13 +23714,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22970,16 +23750,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,52 +23816,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23381,6 +24164,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23396,6 +24188,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23408,22 +24206,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23432,6 +24230,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23522,9 +24326,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23675,7 +24476,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23771,7 +24572,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24072,6 +24921,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24243,6 +25098,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,7 +25269,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25595,7 +26480,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25721,6 +26612,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,10 +26627,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,19 +26744,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26161,7 +27062,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26338,6 +27239,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] ""
msgstr[1] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27287,9 +28194,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27479,12 +28383,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27989,67 +28896,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28136,6 +29043,12 @@ 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 ""
@@ -28145,7 +29058,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ 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 ""
@@ -29076,12 +30004,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29112,10 +30046,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29157,7 +30091,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29574,6 +30505,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30382,10 +31325,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30735,6 +31675,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30756,10 +31699,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31308,6 +32266,12 @@ 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|Packages"
msgstr ""
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ 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 ""
@@ -31653,6 +32713,9 @@ 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 ""
@@ -31668,6 +32731,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ 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 ""
@@ -31752,6 +32824,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31912,9 +32990,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32032,6 +33107,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,10 +33847,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32832,9 +33943,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ 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 ""
@@ -33120,6 +34237,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33237,6 +34357,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33642,6 +34762,9 @@ 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 profile"
msgstr ""
@@ -33699,6 +34822,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 ""
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34215,6 +35350,9 @@ 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 ""
@@ -34354,6 +35492,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34698,7 +35836,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35128,6 +36272,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/it/gitlab.po b/locale/it/gitlab.po
index cc438b12dbf..1034447a246 100644
--- a/locale/it/gitlab.po
+++ b/locale/it/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: it\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:58\n"
+"PO-Revision-Date: 2021-03-05 23:55\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -170,6 +173,11 @@ 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] ""
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ 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 ""
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -682,6 +710,15 @@ msgstr[1] ""
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr "%{number_commits_behind} commits precedenti %{default_branch}, %{number_commits_ahead} commits avanti"
+msgid "%{oneMonthAgo} - %{today}"
+msgstr ""
+
+msgid "%{oneWeekAgo} - %{today}"
+msgstr ""
+
+msgid "%{oneYearAgo} - %{today}"
+msgstr ""
+
msgid "%{openOrClose} %{noteable}"
msgstr "%{openOrClose}%{noteable}"
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -976,6 +1016,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -988,9 +1031,6 @@ msgstr "(verifica progresso)"
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1015,9 +1055,6 @@ msgstr "+ %{moreCount} più"
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1111,6 +1148,11 @@ 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] "1 gruppo"
@@ -1162,6 +1204,9 @@ msgstr "1-9 contributi"
msgid "10-19 contributions"
msgstr "10-19 contributi"
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr "Primo contributo!"
@@ -1282,6 +1327,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1635,9 +1779,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1716,12 +1857,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1818,6 +1965,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1938,6 +2103,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2058,6 +2226,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2091,6 +2268,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2259,6 +2442,15 @@ 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 ""
@@ -2268,6 +2460,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2361,6 +2562,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2394,6 +2607,21 @@ 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 ""
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2483,9 +2714,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2576,9 +2792,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,9 +2813,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,49 +2837,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,76 +2867,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
-msgstr ""
-
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,13 +2927,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2954,7 +3104,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2996,6 +3146,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3146,12 +3293,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3269,6 +3425,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3296,12 +3455,18 @@ 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 ""
@@ -3344,7 +3509,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3395,10 +3566,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr "Si è verificato un errore. Riprova."
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3757,9 +3928,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3787,6 +3955,9 @@ 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 erase this build?"
msgstr ""
@@ -4048,12 +4219,6 @@ msgstr[1] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr "Nome Branch"
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr "Cerca branches"
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr "Cambia branch"
-
msgid "Branches"
msgstr "Branch"
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5028,6 +5235,26 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr "Cancella"
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr "Preleva nella branch"
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr "Ripristina nella branch"
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr "Controllo disponibilità per %{text}…"
@@ -5688,7 +5915,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5703,6 +5930,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr "cancellato"
@@ -6036,21 +6266,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7325,16 +7594,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7349,6 +7642,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7391,6 +7729,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7430,6 +7771,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7451,6 +7795,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8245,10 +8577,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8302,6 +8637,9 @@ msgstr "Crea file"
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8314,6 +8652,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8329,6 +8670,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,13 +8991,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8647,8 +9024,8 @@ msgstr ""
msgid "Custom notification events"
msgstr "Eventi-Notifica personalizzati"
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
-msgstr "I livelli di notifica personalizzati sono uguali a quelli di partecipazione. Con i livelli di notifica personalizzati riceverai anche notifiche per gli eventi da te scelti %{notification_link}."
+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 ""
@@ -8689,6 +9066,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8722,6 +9102,18 @@ 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 ""
@@ -8886,7 +9278,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 ""
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9261,9 +9682,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9318,6 +9736,9 @@ msgstr "Definisci un patter personalizzato mediante la sintassi cron"
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr ""
msgid "Delete"
msgstr "Elimina"
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9429,6 +9856,15 @@ 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 ""
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9660,6 +10093,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9678,9 +10114,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9690,19 +10123,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9717,10 +10150,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9735,7 +10165,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9756,10 +10186,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
+msgstr ""
+
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9768,7 +10204,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10047,18 +10482,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,7 +10710,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr "E-mail"
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11048,19 +11468,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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."
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the issue description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the issue title"
-msgstr ""
-
-msgid "Enter the merge request description"
-msgstr ""
-
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11345,6 +11759,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11369,6 +11786,12 @@ 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 ""
@@ -11396,6 +11819,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11423,6 +11849,9 @@ 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 ""
@@ -11447,9 +11876,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11882,6 +12320,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11915,6 +12356,9 @@ msgstr "Esplora gruppi pubblici"
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12038,10 +12482,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12068,6 +12512,12 @@ 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 ""
@@ -12104,9 +12554,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,10 +12602,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12826,6 +13279,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr "Fork da"
@@ -12856,7 +13345,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12934,9 +13423,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13096,6 +13585,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13135,6 +13627,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13144,6 +13639,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13291,6 +13801,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13330,6 +13840,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13828,6 +14344,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14630,6 +15164,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15703,96 +16240,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16078,9 +16543,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ 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 ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ 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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16972,6 +17518,9 @@ 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 ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] "L'ultimo %d giorno"
msgstr[1] "Gli ultimi %d giorni"
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17085,6 +17640,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17118,6 +17676,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17169,9 +17730,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr "Leggi di più su"
@@ -17181,6 +17739,96 @@ msgstr "documentazione sulla pianificazione delle pipelines"
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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr "Nuova Branch"
@@ -19590,6 +20253,9 @@ msgstr ""
msgid "New directory"
msgstr "Nuova directory"
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr "Nuova richiesta di merge"
@@ -19737,6 +20406,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19788,6 +20466,9 @@ 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 ""
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr ""
msgid "Notification events"
msgstr "Notifica eventi"
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr "Completa la richiesta di merge"
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr "Partecipa"
msgid "NotificationLevel|Watch"
msgstr "Osserva"
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr "Notifiche"
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ 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."
+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."
@@ -20552,7 +21257,7 @@ 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 Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20579,10 +21290,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20651,6 +21362,9 @@ 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 ""
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20762,6 +21473,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21077,6 +21809,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21284,9 +22028,6 @@ msgstr "Pianificazione Pipeline"
msgid "Pipeline Schedules"
msgstr "Pianificazione multipla Pipeline"
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21308,10 +22049,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr "Grafici pipeline"
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr "Pipeline per l'ultimo anno"
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,10 +22154,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ 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 ""
@@ -21665,6 +22415,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21923,21 +22685,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21959,6 +22739,12 @@ 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 ""
@@ -22067,6 +22853,9 @@ 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 ""
@@ -22151,24 +22940,6 @@ msgstr "Profilo"
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22205,6 +22976,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22562,6 +23336,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22790,10 +23567,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22805,7 +23579,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,13 +23672,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22937,13 +23714,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22970,16 +23750,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,52 +23816,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23381,6 +24164,15 @@ msgstr "Ricerco e configuro le metriche..."
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23396,6 +24188,12 @@ msgstr "Metriche"
msgid "PrometheusService|Missing environment variable"
msgstr "Variabile d'ambiente mancante"
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr "Ulteriori informazioni"
@@ -23408,22 +24206,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23432,6 +24230,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23522,9 +24326,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23675,7 +24476,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23771,7 +24572,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24072,6 +24921,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24243,6 +25098,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,7 +25269,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr "Richiedi accesso"
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25595,7 +26480,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25721,6 +26612,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,10 +26627,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,19 +26744,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26161,7 +27062,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26338,6 +27239,9 @@ msgstr "Establezca una contraseña en su cuenta para actualizar o enviar a travÃ
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] "Visualizza %d evento"
msgstr[1] "Visualizza %d eventi"
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27287,9 +28194,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27479,12 +28383,15 @@ msgstr "inizia una %{new_merge_request} con queste modifiche"
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27989,67 +28896,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28136,6 +29043,12 @@ 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 ""
@@ -28145,7 +29058,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr "Lo stadio di pre-rilascio mostra il tempo che trascorre da una MR (Richi
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ 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 ""
@@ -29076,12 +30004,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29112,10 +30046,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29157,7 +30091,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29574,6 +30505,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30382,10 +31325,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30735,6 +31675,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30756,10 +31699,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31308,6 +32266,12 @@ 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|Packages"
msgstr ""
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ 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 ""
@@ -31653,6 +32713,9 @@ 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 ""
@@ -31668,6 +32731,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ 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 ""
@@ -31752,6 +32824,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31912,9 +32990,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32032,6 +33107,9 @@ msgstr "Sconosciuto"
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,10 +33847,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32832,9 +33943,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ 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 ""
@@ -33120,6 +34237,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33237,6 +34357,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr "Hai raggiunto il tuo limite di progetto"
+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 a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33642,6 +34762,9 @@ 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 profile"
msgstr ""
@@ -33699,6 +34822,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 ""
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34215,6 +35350,9 @@ 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 ""
@@ -34354,6 +35492,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34698,7 +35836,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr "Notifiche via email"
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35128,6 +36272,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/ja/gitlab.po b/locale/ja/gitlab.po
index fb33c6418e0..f2419377edf 100644
--- a/locale/ja/gitlab.po
+++ b/locale/ja/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: ja\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:55\n"
+"PO-Revision-Date: 2021-03-05 23:55\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -72,6 +72,9 @@ msgstr " ã¾ãŸã¯ãƒªãƒ•ã‚¡ãƒ¬ãƒ³ã‚¹å½¢å¼ï¼ˆä¾‹: path/to/project!merge_request_
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr "「%{path}ã€ã¯ã€Œ%{ref}ã€ã«å­˜åœ¨ã—ã¾ã›ã‚“ã§ã—ãŸ"
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr "createInstance() ã«ã¯ \"el\" パラメータãŒå¿…è¦ã§ã™"
@@ -150,6 +153,10 @@ msgid "%d day"
msgid_plural "%d days"
msgstr[0] "%d æ—¥"
+msgid "%d epic"
+msgid_plural "%d epics"
+msgstr[0] ""
+
msgid "%d error"
msgid_plural "%d errors"
msgstr[0] "%d 件ã®ã‚¨ãƒ©ãƒ¼"
@@ -176,7 +183,7 @@ msgstr[0] "%d 件ã®ãƒ†ã‚¹ãƒˆã§ä¿®æ­£ã•ã‚Œã¾ã—ãŸ"
msgid "%d group"
msgid_plural "%d groups"
-msgstr[0] ""
+msgstr[0] "%d グループ"
msgid "%d group selected"
msgid_plural "%d groups selected"
@@ -290,6 +297,10 @@ msgid "%d vulnerability dismissed"
msgid_plural "%d vulnerabilities dismissed"
msgstr[0] "%d 件ã®è„†å¼±æ€§ãŒç„¡è¦–ã•ã‚Œã¾ã—ãŸ"
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] "%d 件ã®è­¦å‘ŠãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ:"
@@ -320,7 +331,7 @@ msgid "%{authorsName}'s thread"
msgstr "%{authorsName}ã®ã‚¹ãƒ¬ãƒƒãƒ‰"
msgid "%{board_target} not found"
-msgstr ""
+msgstr "%{board_target} ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -363,6 +374,9 @@ msgid "%{count} issue selected"
msgid_plural "%{count} issues selected"
msgstr[0] "%{count} 件ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’é¸æŠžæ¸ˆã¿"
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] "%{count} 件ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’é¸æŠžæ¸ˆã¿"
@@ -432,6 +446,9 @@ msgstr "%{edit_in_new_fork_notice} ã“ã®ã‚³ãƒŸãƒƒãƒˆã‚’ã‚‚ã†ä¸€åº¦revertã—ã¦
msgid "%{edit_in_new_fork_notice} Try to upload a file again."
msgstr "%{edit_in_new_fork_notice} ã‚‚ã†ä¸€åº¦ãƒ•ã‚¡ã‚¤ãƒ«ã‚’アップロードã—ã¦ãã ã•ã„。"
+msgid "%{emailPrefix}@company.com"
+msgstr ""
+
msgid "%{extra} more downstream pipelines"
msgstr "%{extra} 個ã®ãƒ€ã‚¦ãƒ³ã‚¹ãƒˆãƒªãƒ¼ãƒ ãƒ‘イプライン"
@@ -483,6 +500,9 @@ msgstr "最大 %{maxIssueCount} 件中ã€%{issuesCount} 件ã®ã‚¤ã‚·ãƒ¥ãƒ¼"
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr "最大 %{maxIssueCount} 件中〠%{issuesSize} 件"
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr "%{labelStart}実際ã®ãƒ¬ã‚¹ãƒãƒ³ã‚¹:%{labelEnd} %{headers}"
@@ -591,6 +611,12 @@ msgstr "%{name_with_link} 㯠%{percent}ã¾ãŸã¯ãれ以下ã®å…±æœ‰ãƒ©ãƒ³ãƒŠã
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr "%{name_with_link} ã¯å…±æœ‰ãƒ©ãƒ³ãƒŠãƒ¼ãƒ‘イプラインã®å®Ÿè¡Œæ™‚é–“(分)を使ã„切りã¾ã—ãŸã€‚ãã®ãŸã‚プロジェクトã®æ–°ã—ã„ジョブやパイプラインã¯å®Ÿè¡Œã•ã‚Œã¾ã›ã‚“。"
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr "%{name} ã«ã¯ %{resultsString} ãŒå«ã¾ã‚Œã¦ã„ã¾ã™"
@@ -619,6 +645,15 @@ msgstr[0] "%{no_of_days} æ—¥"
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr "%{default_branch} ã‹ã‚‰ %{number_commits_behind} コミットé…ã‚Œã¦ã„ã¦ã€ %{number_commits_ahead} コミット進んã§ã„ã¾ã™ã€‚"
+msgid "%{oneMonthAgo} - %{today}"
+msgstr ""
+
+msgid "%{oneWeekAgo} - %{today}"
+msgstr ""
+
+msgid "%{oneYearAgo} - %{today}"
+msgstr ""
+
msgid "%{openOrClose} %{noteable}"
msgstr "%{openOrClose} %{noteable}"
@@ -665,9 +700,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr "%{retryButtonStart}ã‚‚ã†ä¸€åº¦è©¦ã™%{retryButtonEnd} ã¾ãŸã¯ %{newFileButtonStart}æ–°ã—ã„ファイルを添付ã™ã‚‹%{newFileButtonEnd}。"
@@ -707,6 +739,9 @@ msgid "%{spanStart}at line%{spanEnd} %{errorLine}%{errorColumn}"
msgstr "%{spanStart}行%{spanEnd} %{errorLine}%{errorColumn}"
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
+msgstr "%{spanStart} 関数内%{spanEnd} %{errorFn}"
+
+msgid "%{startDate} - %{endDate}"
msgstr ""
msgid "%{start} to %{end}"
@@ -879,6 +914,9 @@ msgstr "'%{name}' ãƒãƒªãƒ¥ãƒ¼ã‚¹ãƒˆãƒªãƒ¼ãƒ ãŒä½œæˆã•ã‚Œã¾ã—ãŸ"
msgid "'%{name}' Value Stream deleted"
msgstr "'%{name}' ãƒãƒªãƒ¥ãƒ¼ã‚¹ãƒˆãƒªãƒ¼ãƒ ãŒå‰Šé™¤ã•ã‚Œã¾ã—ãŸ"
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr "'%{name}'ステージã¯ã™ã§ã«ã‚ã‚Šã¾ã™"
@@ -901,6 +939,9 @@ msgstr "(%{value})ã¯æ—¢ã«ä½¿ç”¨ã•ã‚Œã¦ã„ã¾ã™"
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr "(変更ãªã—)"
@@ -913,9 +954,6 @@ msgstr "(進行状æ³ã‚’確èªã™ã‚‹)"
msgid "(deleted)"
msgstr "(削除済ã¿)"
-msgid "(line: %{startLine})"
-msgstr "(行: %{startLine})"
-
msgid "(max size 15 MB)"
msgstr "(最大サイズ 15MB)"
@@ -940,9 +978,6 @@ msgstr "+ 他 %{moreCount} 件"
msgid "+ %{numberOfHiddenAssignees} more"
msgstr "+ %{numberOfHiddenAssignees} 以上"
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr "+ %{numberOfHiddenReviewers} 件以上"
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] "%d 以上"
@@ -1027,6 +1062,10 @@ msgid "1 deploy key"
msgid_plural "%d deploy keys"
msgstr[0] "%d 個ã®ãƒ‡ãƒ—ロイキー"
+msgid "1 follower"
+msgid_plural "%{count} followers"
+msgstr[0] ""
+
msgid "1 group"
msgid_plural "%d groups"
msgstr[0] "%dグループ"
@@ -1069,6 +1108,9 @@ msgstr "貢献 1-9 件"
msgid "10-19 contributions"
msgstr "貢献 10-19 件"
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr "最åˆã®è²¢çŒ®!"
@@ -1166,7 +1208,7 @@ msgid "A deleted user"
msgstr "削除ã•ã‚ŒãŸãƒ¦ãƒ¼ã‚¶ãƒ¼"
msgid "A description is required"
-msgstr ""
+msgstr "説明ã¯å¿…須項目ã§ã™ã€‚"
msgid "A file has been changed."
msgstr "ファイルãŒå¤‰æ›´ã•ã‚Œã¾ã—ãŸã€‚"
@@ -1189,6 +1231,9 @@ msgstr "グループã§ã‚ãªãŸã®çµ„織を表ç¾ã§ãã¾ã™ã€‚グループå˜
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1265,7 +1310,7 @@ msgid "A string appended to the project path to form the Service Desk email addr
msgstr ""
msgid "A title is required"
-msgstr ""
+msgstr "タイトルã¯å¿…須項目ã§ã™"
msgid "A user can only participate in a rotation once"
msgstr ""
@@ -1288,6 +1333,102 @@ msgstr "API ヘルプ"
msgid "API Token"
msgstr "API トークン"
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr "AWS アクセスキー"
@@ -1301,7 +1442,7 @@ msgid "AWS Secret Access Key. Only required if not using role instance credentia
msgstr ""
msgid "AWS service error: %{error}"
-msgstr ""
+msgstr "AWS サービスエラー: %{error}"
msgid "Abort"
msgstr "中止"
@@ -1541,9 +1682,6 @@ msgstr "GPGキーを追加"
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr "管ç†è€…ã®ã‚µã‚¤ãƒ‰ãƒãƒ¼ã®ãƒ¢ãƒ‹ã‚¿ãƒªãƒ³ã‚°éƒ¨ã« Grafana ボタンを追加ã—㦠GitLabã®å¥å…¨æ€§ã‚„性能ã«ã¤ã„ã¦ã®å¹…広ã„統計ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãるよã†ã«ã—ã¾ã™ã€‚"
-msgid "Add a To Do"
-msgstr "Todoを追加"
-
msgid "Add a bullet list"
msgstr "箇æ¡æ›¸ãリストを追加"
@@ -1596,7 +1734,7 @@ msgid "Add an existing issue"
msgstr "既存ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’追加"
msgid "Add an impersonation token"
-msgstr ""
+msgstr "ãªã‚Šã™ã¾ã—トークンを追加"
msgid "Add another link"
msgstr "ä»–ã®ãƒªãƒ³ã‚¯ã‚’追加"
@@ -1620,6 +1758,9 @@ msgid "Add comment to design"
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 domain"
@@ -1628,6 +1769,9 @@ msgstr "ドメインを追加"
msgid "Add email address"
msgstr "メールアドレス追加"
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr "環境ã®è¿½åŠ "
@@ -1722,6 +1866,21 @@ msgid "AddContextCommits|Add previously merged commits"
msgstr "以å‰ã«ãƒžãƒ¼ã‚¸ã—ãŸã‚³ãƒŸãƒƒãƒˆã‚’追加"
msgid "AddContextCommits|Add/remove"
+msgstr "追加/削除"
+
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
msgstr ""
msgid "AddMember|No users specified."
@@ -1749,7 +1908,7 @@ msgid "Added at"
msgstr "追加日時: "
msgid "Added for this merge request"
-msgstr ""
+msgstr "ã“ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã«è¿½åŠ ã•ã‚Œã¾ã—ãŸ"
msgid "Added in this version"
msgstr "ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®æ–°æ©Ÿèƒ½"
@@ -1784,9 +1943,12 @@ msgstr "Todoを追加ã—ã¾ã™ã€‚"
msgid "Adds an issue to an epic."
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."
+msgid "Adds email participant(s)"
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 "上記ã®ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼/検索æ¡ä»¶ã‚’調整ã—ã¦ãã ã•ã„。ã“ã‚ŒãŒã‚¨ãƒ©ãƒ¼ã¨è€ƒãˆã‚‰ã‚Œã‚‹å ´åˆã¯ã€ %{linkStart}Geo Troubleshooting%{linkEnd} ドキュメントをå‚ç…§ã—ã¦ãã ã•ã„。"
+
msgid "Admin Area"
msgstr "管ç†è€…エリア"
@@ -1844,6 +2006,9 @@ msgstr "開発者"
msgid "AdminArea|Features"
msgstr "機能"
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr "ゲスト"
@@ -1964,6 +2129,12 @@ msgstr "一般設定ã«ç§»å‹•"
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr "ã“ã“ã§è¨­å®šã—ãŸçµ±åˆã¯ã€ã“ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã®ã™ã¹ã¦ã®ãƒ—ロジェクトã«è‡ªå‹•çš„ã«é©ç”¨ã•ã‚Œã¾ã™ã€‚"
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr "インテグレーションã«ç§»å‹•"
@@ -1988,6 +2159,9 @@ msgstr "サービステンプレートã¯é–“ã‚‚ãªãéžæŽ¨å¥¨ã¨ãªã‚Šã¾ã™ã€‚
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr "Serviceテンプレートã¯ã€çµ±åˆã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆå€¤ã‚’設定ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã—ã¾ã™"
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr "インスタンス全体ã«è‡ªå‹•èª­ã¿è¾¼ã¿ã•ã‚Œã‚‹ %{link_start}パイプライン設定%{link_end} を設定ã—ã¾ã™ã€‚ã“ã®ãƒ‘イプライン設定ã¯ãƒ—ロジェクト独自ã®è¨­å®šã®å¾Œã«å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚"
@@ -1995,7 +2169,10 @@ msgid "AdminSettings|Some settings have moved"
msgstr "一部ã®è¨­å®šã¯ç§»å‹•ã—ã¾ã—ãŸ"
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
-msgstr "ã™ã¹ã¦ã®ãƒ—ロジェクトã®Auto Review AppsãŠã‚ˆã³Auto Deployステージã§ä½¿ç”¨ã™ã‚‹ã€ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®ãƒ‰ãƒ¡ã‚¤ãƒ³ã‚’指定ã—ã¾ã™ã€‚"
+msgstr "ã™ã¹ã¦ã®ãƒ—ロジェクトã®Auto Review AppãŠã‚ˆã³Auto Deployステージã§ä½¿ç”¨ã™ã‚‹ã€ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®ãƒ‰ãƒ¡ã‚¤ãƒ³ã‚’指定ã—ã¾ã™ã€‚"
+
+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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr "必須パイプライン設定ã¯ã€è¨­å®šæ¸ˆã¿ã®%{link_start}インスタンステンプレートリãƒã‚¸ãƒˆãƒª%{link_end}内㮠%{code_start}gitlab-ci%{code_end} ディレクトリã€ã¾ãŸã¯ GitLab æä¾›ã®è¨­å®šã‹ã‚‰é¸æŠžã§ãã¾ã™ã€‚"
@@ -2072,6 +2249,9 @@ msgstr "ユーザー %{username} をアクティブã«ã—ã¾ã™ã‹?"
msgid "AdminUsers|Active"
msgstr "アクティブ"
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr "管ç†è€…"
@@ -2133,7 +2313,7 @@ msgid "AdminUsers|Deactivate user"
msgstr "ユーザーを無効ã«ã™ã‚‹"
msgid "AdminUsers|Deactivate user %{username}?"
-msgstr ""
+msgstr "ユーザー %{username} を無効ã«ã—ã¾ã™ã‹?"
msgid "AdminUsers|Deactivated"
msgstr "éžæœ‰åŠ¹åŒ–済ã¿"
@@ -2160,18 +2340,30 @@ 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 ""
+msgstr "外部ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ã€æ˜Žç¤ºçš„ã«ã‚¢ã‚¯ã‚»ã‚¹ãŒè¨±å¯ã•ã‚Œã¦ã„ãªã„é™ã‚Šã€å†…部プロジェクトやプライベートã®ãƒ—ロジェクトã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“。ã¾ãŸã€å¤–部ユーザーã¯ãƒ—ロジェクトã€ã‚°ãƒ«ãƒ¼ãƒ—ã€ã¾ãŸã¯å€‹äººã®ã‚¹ãƒ‹ãƒšãƒƒãƒˆã‚’作æˆã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。"
msgid "AdminUsers|For more information, please refer to the %{link_start}user account deletion documentation.%{link_end}"
+msgstr "詳細ã«ã¤ã„ã¦ã¯ã€ %{link_start}ユーザーアカウント削除ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆ%{link_end}ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid "AdminUsers|Here are some helpful links to help you manage your instance:"
msgstr ""
-msgid "AdminUsers|Is using seat"
+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|It's you!"
msgstr "ã‚ãªãŸã§ã™ï¼"
msgid "AdminUsers|Log in"
+msgstr "ログイン"
+
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
msgstr ""
msgid "AdminUsers|New user"
@@ -2184,7 +2376,7 @@ msgid "AdminUsers|Owned groups will be left"
msgstr "所有グループã¯æ®‹ã‚Šã¾ã™"
msgid "AdminUsers|Pending approval"
-msgstr ""
+msgstr "承èªä¿ç•™ä¸­"
msgid "AdminUsers|Personal projects will be left"
msgstr "個人プロジェクトã¯æ®‹ã‚Šã¾ã™"
@@ -2202,13 +2394,13 @@ msgid "AdminUsers|Regular users have access to their groups and projects"
msgstr ""
msgid "AdminUsers|Reject"
-msgstr ""
+msgstr "æ‹’å¦"
msgid "AdminUsers|Reject request"
-msgstr ""
+msgstr "リクエストを拒å¦"
msgid "AdminUsers|Rejected users:"
-msgstr ""
+msgstr "æ‹’å¦ã•ã‚ŒãŸãƒ¦ãƒ¼ã‚¶ãƒ¼:"
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr "Web, Git, APIã‚’å«ã‚€ã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¸ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚¢ã‚¯ã‚»ã‚¹ã‚’復元ã—ã¾ã™ã€‚"
@@ -2241,7 +2433,7 @@ msgid "AdminUsers|The user will not receive any notifications"
msgstr "ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯é€šçŸ¥ã‚’å—ã‘å–ã‚Œãªããªã‚Šã¾ã™"
msgid "AdminUsers|This user has requested access"
-msgstr ""
+msgstr "ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ã‚¢ã‚¯ã‚»ã‚¹ã‚’リクエストã—ã¦ã„ã¾ã™"
msgid "AdminUsers|To confirm, type %{projectName}"
msgstr "確èªã®ãŸã‚ã€%{projectName} を入力ã—ã¦ãã ã•ã„"
@@ -2250,12 +2442,18 @@ msgid "AdminUsers|To confirm, type %{username}"
msgstr "確èªã®ãŸã‚ã€%{username} を入力ã—ã¦ãã ã•ã„"
msgid "AdminUsers|Unblock"
-msgstr ""
+msgstr "ブロック解除"
msgid "AdminUsers|Unblock user"
msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
+msgstr "ユーザー %{username} ã®ãƒ–ロックを解除ã—ã¾ã™ã‹?"
+
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
msgstr ""
msgid "AdminUsers|User will not be able to access git repositories"
@@ -2267,11 +2465,23 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+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 ""
+msgstr "削除予定"
msgid "AdminUsers|Without projects"
msgstr "プロジェクトãªã—"
@@ -2283,28 +2493,43 @@ msgid "AdminUsers|You are about to permanently delete the user %{username}. This
msgstr ""
msgid "AdminUsers|You can always block their account again if needed."
-msgstr ""
+msgstr "å¿…è¦ãªã¨ãã¯ã„ã¤ã§ã‚‚ã“れらã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’ブロックã§ãã¾ã™ã€‚"
msgid "AdminUsers|You can always deactivate their account again if needed."
-msgstr ""
+msgstr "å¿…è¦ãªã¨ãã¯ã„ã¤ã§ã‚‚ã“れらã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’無効ã«ã§ãã¾ã™ã€‚"
msgid "AdminUsers|You can always re-activate their account, their data will remain intact."
-msgstr ""
+msgstr "アカウントをã„ã¤ã§ã‚‚å†åº¦æœ‰åŠ¹ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã™ã€‚データã¯ãã®ã¾ã¾æ®‹ã‚Šã¾ã™ã€‚"
msgid "AdminUsers|You can always unblock their account, their data will remain intact."
-msgstr ""
+msgstr "アカウントã®ãƒ–ロックをã„ã¤ã§ã‚‚解除ã§ãã¾ã™ã€‚データã¯ãã®ã¾ã¾æ®‹ã‚Šã¾ã™ã€‚"
msgid "AdminUsers|You cannot remove your own admin rights."
-msgstr ""
+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 ""
+msgstr "追加ã•ã‚ŒãŸãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ã‚·ã‚¹ãƒ†ãƒ ç®¡ç†è€…ã«ã‚ˆã£ã¦ç¢ºèªã•ã‚Œã€æ‰¿èªã•ã‚Œãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 使用状æ³ã®ä¸Šé™è©³ç´°ã«ã¤ã„ã¦ã¯ã€%{help_link_start} ã“ã¡ã‚‰%{help_link_end} ã‚’ã”覧ãã ã•ã„。"
msgid "Admin|View pending user approvals"
msgstr ""
@@ -2324,6 +2549,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr "高度ãªè¨­å®š"
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr "高度ãªæ¨©é™ã€ãƒ©ãƒ¼ã‚¸ãƒ•ã‚¡ã‚¤ãƒ«ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã€2è¦ç´ èªè¨¼ã®è¨­å®š"
@@ -2350,7 +2578,7 @@ msgid_plural "Alerts"
msgstr[0] "アラート"
msgid "AlertManagement|Acknowledged"
-msgstr ""
+msgstr "確èªæ¸ˆã¿"
msgid "AlertManagement|Activity feed"
msgstr ""
@@ -2362,35 +2590,32 @@ msgid "AlertManagement|Alert assignee(s): %{assignees}"
msgstr "アラートã®æ‹…当者: %{assignees}"
msgid "AlertManagement|Alert detail"
-msgstr ""
+msgstr "アラートã®è©³ç´°"
msgid "AlertManagement|Alert details"
-msgstr ""
+msgstr "アラートã®è©³ç´°"
msgid "AlertManagement|Alert status: %{status}"
-msgstr ""
+msgstr "アラートã®çŠ¶æ…‹: %{status}"
msgid "AlertManagement|Alerts"
-msgstr ""
+msgstr "アラート"
msgid "AlertManagement|All alerts"
-msgstr ""
+msgstr "å…¨ã¦ã®ã‚¢ãƒ©ãƒ¼ãƒˆ"
msgid "AlertManagement|Assign status"
-msgstr ""
+msgstr "割り当ã¦çŠ¶æ…‹"
msgid "AlertManagement|Assignees"
msgstr "担当者"
msgid "AlertManagement|Authorize external service"
-msgstr ""
+msgstr "外部サービスã®æ‰¿èª"
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 "ã™ã¹ã¦ã®ç›£è¦–ツールã‹ã‚‰ã®ã‚¢ãƒ©ãƒ¼ãƒˆã‚’ GitLab 内ã§ç›´æŽ¥è¡¨ç¤ºã—ã¾ã™ã€‚アラートã®èª¿æŸ»ã¨ã‚¤ãƒ³ã‚·ãƒ‡ãƒ³ãƒˆã¸ã®ã‚¨ã‚¹ã‚«ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’åˆç†åŒ–ã—ã¾ã™ã€‚"
@@ -2403,24 +2628,12 @@ msgstr "環境"
msgid "AlertManagement|Events"
msgstr "イベント"
-msgid "AlertManagement|High"
-msgstr "高"
-
msgid "AlertManagement|Incident"
msgstr "インシデント"
-msgid "AlertManagement|Info"
-msgstr "情報"
-
msgid "AlertManagement|Key"
msgstr "キー"
-msgid "AlertManagement|Low"
-msgstr "低"
-
-msgid "AlertManagement|Medium"
-msgstr "中"
-
msgid "AlertManagement|Metrics"
msgstr "メトリクス"
@@ -2476,16 +2689,13 @@ msgid "AlertManagement|Surface alerts in GitLab"
msgstr ""
msgid "AlertManagement|There was an error displaying the alert. Please refresh the page to try again."
-msgstr ""
+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 To-Do of the alert."
-msgstr ""
+msgstr "アラートã®è¡¨ç¤ºä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚エンドãƒã‚¤ãƒ³ãƒˆã®è©³ç´°è¨­å®šã‚’確èªã—ã¦ã€ã‚¢ãƒ©ãƒ¼ãƒˆãŒè¡¨ç¤ºã•ã‚Œã‚‹ã‚ˆã†ã«ã—ã¦ãã ã•ã„。"
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
-msgstr ""
+msgstr "担当者リストã®æ›´æ–°ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
msgstr ""
@@ -2493,6 +2703,9 @@ 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 "ã“ã®æ‹…当者ã¯ã“ã®ã‚¢ãƒ©ãƒ¼ãƒˆã«å‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¾ã›ã‚“。"
@@ -2502,9 +2715,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2529,49 +2739,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2583,9 +2760,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2595,76 +2769,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
-msgstr ""
-
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2676,13 +2829,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2694,9 +2847,6 @@ msgstr ""
msgid "Alerts"
msgstr "アラート"
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2709,7 +2859,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2796,9 +2946,6 @@ msgstr "ã™ã¹ã¦ã®ãƒ—ロジェクト"
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr "ã“ã®ãƒ—ロジェクト㧠%{linkStart} Auto DevOps %{linkEnd} ãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã‚‹ãŸã‚ã€ã™ã¹ã¦ã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ã‚¹ã‚­ãƒ£ãƒ³ãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã™"
-
msgid "All threads resolved"
msgstr ""
@@ -2859,8 +3006,8 @@ msgstr "web フックãŠã‚ˆã³ã‚µãƒ¼ãƒ“スã‹ã‚‰ã®ãƒ­ãƒ¼ã‚«ãƒ«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
-msgstr "ã“ã®ã‚­ãƒ¼ã‚‚リãƒã‚¸ãƒˆãƒªã«ãƒ—ッシュã§ãるよã†ã«ã—ã¾ã™ã‹ï¼Ÿ (デフォルトã¯ãƒ—ルアクセスã®ã¿ã‚’許å¯ã—ã¾ã™)"
+msgid "Allow this key to push to this repository"
+msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr "ã“ã®ã‚»ã‚«ãƒ³ãƒ€ãƒªãƒŽãƒ¼ãƒ‰ãŒã‚ªãƒ–ジェクトストレージ上ã«ã‚³ãƒ³ãƒ†ãƒ³ãƒ„を複製ã™ã‚‹ã“ã¨ã‚’許å¯ã—ã¾ã™"
@@ -2901,6 +3048,9 @@ msgstr "Kubernetes クラスターを追加ãŠã‚ˆã³ç®¡ç†ã§ãã¾ã™ã€‚"
msgid "Almost there"
msgstr "ã‚‚ã†å°‘ã—ã§å®Œäº†ã§ã™ï¼"
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -2967,12 +3117,6 @@ msgstr ""
msgid "An error has occurred"
msgstr "エラーãŒç™ºç”Ÿã—ã¾ã—ãŸ"
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr "ã“ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã«ä¸‹æ›¸ãを追加ã™ã‚‹éš›ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
@@ -3016,7 +3160,7 @@ msgid "An error occurred while acknowledging the notification. Refresh the page
msgstr ""
msgid "An error occurred while adding approvers"
-msgstr ""
+msgstr "承èªè€…ã®è¿½åŠ ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
msgid "An error occurred while adding formatted title for epic"
msgstr "エピックã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆæ¸ˆã¿ã‚¿ã‚¤ãƒˆãƒ«ã‚’追加ã™ã‚‹éš›ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
@@ -3025,7 +3169,7 @@ msgid "An error occurred while authorizing your role"
msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
-msgstr ""
+msgstr "グループパスã®ç¢ºèªä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚æ›´æ–°ã—ã¦ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。"
msgid "An error occurred while decoding the file."
msgstr "ファイルã®ãƒ‡ã‚³ãƒ¼ãƒ‰ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
@@ -3051,10 +3195,16 @@ 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 branches. Retry the search."
+msgstr "ブランãƒã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚検索をå†è©¦è¡Œã—ã¦ãã ã•ã„。"
+
+msgid "An error occurred while fetching codequality mr diff reports."
msgstr ""
msgid "An error occurred while fetching commits. Retry the search."
@@ -3081,6 +3231,9 @@ msgstr "ラベルã®è‰²ã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "An error occurred while fetching markdown preview"
msgstr "Markdown プレビューã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr "ä¿ç•™ä¸­ã®ã‚³ãƒ¡ãƒ³ãƒˆã‚’å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
@@ -3174,6 +3327,9 @@ msgstr "マージリクエストã®ãƒ­ãƒ¼ãƒ‰ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr "データ読ã¿è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
@@ -3201,12 +3357,18 @@ 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 "リクエスト作æˆä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
@@ -3249,8 +3411,11 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
-msgstr "担当者ã®ç™»éŒ²ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
+msgstr ""
msgid "An error occurred while subscribing to notifications."
msgstr "通知ã®è³¼èª­ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
@@ -3288,6 +3453,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr "マイルストーンã®æ›´æ–°ä¸­ã®ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr "グループパスã®æ¤œè¨¼ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
@@ -3300,12 +3468,12 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr "エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚å†åº¦ãŠè©¦ã—ãã ã•ã„。"
-msgid "An error ocurred while loading your content. 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 ""
@@ -3322,7 +3490,7 @@ msgid "An issue title is required"
msgstr ""
msgid "An unauthenticated user"
-msgstr ""
+msgstr "未èªè¨¼ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼"
msgid "An unexpected error occurred while checking the project environment."
msgstr "プロジェクト環境ã®ç¢ºèªä¸­ã«äºˆæœŸã—ãªã„エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
@@ -3385,10 +3553,10 @@ msgid "Any %{header}"
msgstr ""
msgid "Any Author"
-msgstr ""
+msgstr "ä»»æ„ã®ä½œæˆè€…"
msgid "Any branch"
-msgstr ""
+msgstr "ä»»æ„ブランãƒ"
msgid "Any eligible user"
msgstr "資格ã®ã‚るユーザー"
@@ -3397,10 +3565,10 @@ msgid "Any encrypted tokens"
msgstr "æš—å·åŒ–済ã¿ãƒˆãƒ¼ã‚¯ãƒ³"
msgid "Any files larger than this limit will not be indexed, and thus will not be searchable."
-msgstr ""
+msgstr "ã“ã®åˆ¶é™ã‚’超ãˆã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹åŒ–ã•ã‚Œã¾ã›ã‚“。ãã®ãŸã‚検索å¯èƒ½ã«ã¯ãªã‚Šã¾ã›ã‚“。"
msgid "Any label"
-msgstr ""
+msgstr "ä»»æ„ã®ãƒ©ãƒ™ãƒ«"
msgid "Any member with at least Developer permissions on the project."
msgstr ""
@@ -3475,13 +3643,13 @@ msgid "Apply a template"
msgstr "テンプレートをé©ç”¨"
msgid "Apply changes"
-msgstr ""
+msgstr "変更をé©ç”¨"
msgid "Apply suggestion"
msgstr "æ案をé©ç”¨"
msgid "Apply suggestions"
-msgstr ""
+msgstr "æ案をé©ç”¨"
msgid "Apply template"
msgstr "テンプレートをé©ç”¨"
@@ -3490,7 +3658,7 @@ msgid "Apply this approval rule to any branch or a specific protected branch."
msgstr "承èªãƒ«ãƒ¼ãƒ«ã‚’ä»»æ„ã®ãƒ–ランãƒã¾ãŸã¯ç‰¹å®šã®ä¿è­·ãƒ–ランãƒã«é©ç”¨ã—ã¾ã™ã€‚"
msgid "Applying"
-msgstr ""
+msgstr "é©ç”¨"
msgid "Applying a template will replace the existing issue description. Any changes you have made will be lost."
msgstr "テンプレートをé©ç”¨ã™ã‚‹ã¨ã€æ—¢å­˜ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã®èª¬æ˜ŽãŒç½®ãæ›ãˆã‚‰ã‚Œã¾ã™ã€‚ è¡Œã£ãŸå¤‰æ›´ã¯ã™ã¹ã¦å¤±ã‚ã‚Œã¾ã™ã€‚"
@@ -3505,19 +3673,19 @@ msgid "Applying multiple commands"
msgstr "複数ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’é©ç”¨"
msgid "Applying suggestion..."
-msgstr ""
+msgstr "æ案をé©ç”¨..."
msgid "Applying suggestions..."
-msgstr ""
+msgstr "æ案をé©ç”¨..."
msgid "Approval Status"
-msgstr ""
+msgstr "承èªã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹"
msgid "Approval rules"
msgstr "承èªãƒ«ãƒ¼ãƒ«"
msgid "Approval rules reset to project defaults"
-msgstr ""
+msgstr "承èªãƒ«ãƒ¼ãƒ«ã¯ãƒ—ロジェクトã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã«ãƒªã‚»ãƒƒãƒˆã•ã‚Œã¾ã—ãŸ"
msgid "ApprovalRuleRemove|%d member"
msgid_plural "ApprovalRuleRemove|%d members"
@@ -3587,13 +3755,13 @@ msgid "Approved"
msgstr ""
msgid "Approved MRs"
-msgstr ""
+msgstr "承èªã•ã‚ŒãŸãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆ"
msgid "Approved the current merge request."
msgstr "ç¾åœ¨ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã¯æ‰¿èªæ¸ˆã§ã™ã€‚"
msgid "Approved-By"
-msgstr ""
+msgstr "承èªè€…"
msgid "Approver"
msgstr "承èªè€…"
@@ -3658,9 +3826,6 @@ msgstr "ã“ã®ã‚³ãƒ¡ãƒ³ãƒˆã®ç·¨é›†ã‚’キャンセルã—ã¦ã‚‚よã‚ã—ã„ã§ã™
msgid "Are you sure you want to close this blocked issue?"
msgstr "ã“ã®ãƒ–ロックã•ã‚Œã¦ã„るイシューをクローズã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ"
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr "\"%{name}\" ã¨ã„ã†ãƒãƒªãƒ¥ãƒ¼ã‚¹ãƒˆãƒªãƒ¼ãƒ ã‚’削除ã—ã¾ã™ã‹ï¼Ÿ"
-
msgid "Are you sure you want to delete %{name}?"
msgstr "%{name} を削除ã—ã¾ã™ã‹ï¼Ÿ"
@@ -3688,6 +3853,9 @@ 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 erase this build?"
msgstr "ã“ã®ãƒ“ルドを削除ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ"
@@ -3892,7 +4060,7 @@ msgstr ""
msgid "Assignee"
msgid_plural "%d Assignees"
-msgstr[0] "%d 人ã®æ‹…当者"
+msgstr[0] ""
msgid "Assignee has no permissions"
msgstr "担当者ã«æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“"
@@ -3946,12 +4114,6 @@ msgstr[0] "%d 個ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’添付"
msgid "Attaching the file failed."
msgstr "ファイルã®æ·»ä»˜ã«å¤±æ•—ã—ã¾ã—ãŸã€‚"
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr "監査イベント"
@@ -4024,6 +4186,9 @@ msgstr ""
msgid "Authenticating"
msgstr "èªè¨¼ä¸­"
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr "èªè¨¼å¤±æ•—"
@@ -4450,6 +4615,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4462,12 +4630,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 "Bitbucket サーãƒãƒ¼ インãƒãƒ¼ãƒˆ"
@@ -4535,6 +4715,12 @@ 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 ""
@@ -4625,12 +4811,6 @@ msgstr "ブランãƒå"
msgid "Branch not loaded - %{branchId}"
msgstr "%{branchId} ブランãƒã¯ãƒ­ãƒ¼ãƒ‰ã•ã‚Œã¦ã„ã¾ã›ã‚“。"
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr "ブランãƒã‚’検索"
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr "ブランãƒã‚’切替"
-
msgid "Branches"
msgstr "ブランãƒ"
@@ -4767,7 +4947,7 @@ msgid "Broadcast Message was successfully updated."
msgstr "ブロードキャストメッセージã¯æ­£å¸¸ã«æ›´æ–°ã•ã‚Œã¾ã—ãŸã€‚"
msgid "Broadcast Messages"
-msgstr ""
+msgstr "ブロードキャストメッセージ"
msgid "Browse Directory"
msgstr "ディレクトリを表示"
@@ -4799,16 +4979,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4823,6 +5015,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4856,6 +5051,12 @@ msgstr "ビジãƒã‚¹"
msgid "Business metrics (Custom)"
msgstr "ビジãƒã‚¹ãƒ¡ãƒˆãƒªã‚¯ã‚¹ï¼ˆã‚«ã‚¹ã‚¿ãƒ ï¼‰"
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4874,6 +5075,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr "デフォルトã§ã¯ã€GitLabã¯HTMLå½¢å¼ã¨ãƒ—レーンテキスト形å¼ã®ä¸¡ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã®ãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ã—ã¾ã™ã€‚ãã®ãŸã‚ã€ãƒ¡ãƒ¼ãƒ«ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã¯ã©ã¡ã‚‰ã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã‚’表示ã™ã‚‹ã‹ã‚’é¸ã¹ã¾ã™ã€‚ã‚‚ã—プレーンテキスト形å¼ã ã‘ã§ãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ã—ãŸã„å ´åˆã¯ã€ã“ã®ã‚ªãƒ—ションを無効ã«ã—ã¾ã™"
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr "デフォルトã§ã¯ã€ã™ã¹ã¦ã®ãƒ—ロジェクトã¨ã‚°ãƒ«ãƒ¼ãƒ—ã¯ã‚°ãƒ­ãƒ¼ãƒãƒ«é€šçŸ¥è¨­å®šã‚’使用ã—ã¾ã™ã€‚"
@@ -4925,6 +5129,25 @@ msgstr "外部リãƒã‚¸ãƒˆãƒªç”¨ CI/CD"
msgid "CI/CD settings"
msgstr "CI/CD 設定"
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5060,6 +5283,9 @@ msgstr ""
msgid "Cancel"
msgstr "キャンセル"
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5184,10 +5410,10 @@ msgid "Change reviewer(s)."
msgstr ""
msgid "Change status"
-msgstr ""
+msgstr "ステータスã®å¤‰æ›´"
msgid "Change subscription"
-msgstr ""
+msgstr "サブスクリプションを変更"
msgid "Change template"
msgstr "テンプレートを変更"
@@ -5213,12 +5439,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr "未割り当ã¦"
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr "ピック先ブランãƒ:"
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr "リãƒãƒ¼ãƒˆå…ˆãƒ–ランãƒ:"
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5289,7 +5509,7 @@ msgid "Changes won't take place until the index is %{link_start}recreated%{link_
msgstr "インデックス㌠%{link_start} å†ç”Ÿæˆã•ã‚Œã‚‹ %{link_end}ã¾ã§å¤‰æ›´ã¯è¡Œã‚ã‚Œã¾ã›ã‚“。"
msgid "Changing group URL can have unintended side effects."
-msgstr ""
+msgstr "グループ㮠URL を変更ã™ã‚‹ã¨ã€æ„図ã—ãªã„副作用ãŒç™ºç”Ÿã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚"
msgid "Channel handle (e.g. town-square)"
msgstr ""
@@ -5322,7 +5542,7 @@ msgid "ChatMessage|Pipeline #%{pipeline_id} %{humanized_status} in %{duration}"
msgstr "パイプライン#%{pipeline_id} %{duration} 㮠%{humanized_status}"
msgid "ChatMessage|Pipeline %{pipeline_link} of %{ref_type} %{ref_link} by %{user_combined_name} %{humanized_status}"
-msgstr ""
+msgstr "パイプライン %{pipeline_link} ã® %{ref_type} %{ref_link} ã«ã‚ˆã‚‹ %{user_combined_name} %{humanized_status}"
msgid "ChatMessage|Tag"
msgstr "ã‚¿ã‚°"
@@ -5363,6 +5583,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr "既知ã®è„†å¼±æ€§ã«å¯¾ã—ã¦ã€Dockerイメージをãƒã‚§ãƒƒã‚¯ã™ã‚‹."
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr "%{text} ãŒåˆ©ç”¨å¯èƒ½ã‹ç¢ºèªã—ã¦ã„ã¾ã™â€¦"
@@ -5538,7 +5761,7 @@ msgid "Child epic does not exist."
msgstr "å­ã‚¨ãƒ”ックã¯å­˜åœ¨ã—ã¾ã›ã‚“。"
msgid "Child epic doesn't exist."
-msgstr ""
+msgstr "å­ã‚¨ãƒ”ックãŒã‚ã‚Šã¾ã›ã‚“。"
msgid "Chinese language support using"
msgstr ""
@@ -5585,8 +5808,8 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr "インãƒãƒ¼ãƒˆãƒªãƒã‚¸ãƒˆãƒªã®ãƒˆãƒƒãƒ—レベルã®ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠžã—ã¦ãã ã•ã„。"
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
-msgstr "表示レベルã€ãƒ—ロジェクト機能(イシューã€ãƒªãƒã‚¸ãƒˆãƒªã€Wikiã€ã‚¹ãƒ‹ãƒšãƒƒãƒˆ) ã®æœ‰åŠ¹/無効や権é™ã®è¨­å®š"
+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 ""
@@ -5598,6 +5821,9 @@ msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr "CI/CD パイプラインを実行ã—ãŸã„リãƒã‚¸ãƒˆãƒªã‚’é¸æŠžã—ã¦ãã ã•ã„。"
msgid "Choose your framework"
+msgstr "フレームワークをé¸æŠž"
+
+msgid "CiCdAnalytics|Date range: %{range}"
msgstr ""
msgid "CiStatusLabel|canceled"
@@ -5676,7 +5902,7 @@ msgid "CiStatus|running"
msgstr "実行中"
msgid "CiVariables|Cannot use Masked Variable with current value"
-msgstr ""
+msgstr "ç¾åœ¨ã®å€¤ã§ã¯ãƒžã‚¹ã‚¯ã•ã‚ŒãŸå¤‰æ•°ã‚’使用ã§ãã¾ã›ã‚“"
msgid "CiVariables|Environments"
msgstr ""
@@ -5781,7 +6007,7 @@ msgid "Clear chart filters"
msgstr "ãƒãƒ£ãƒ¼ãƒˆãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã‚’解除"
msgid "Clear due date"
-msgstr ""
+msgstr "期日を消去"
msgid "Clear recent searches"
msgstr "最近検索をクリアー"
@@ -5793,7 +6019,7 @@ msgid "Clear search input"
msgstr "検索欄ã®æ¶ˆåŽ»"
msgid "Clear start date"
-msgstr ""
+msgstr "開始日を消去"
msgid "Clear templates search input"
msgstr "テンプレート検索入力をクリア"
@@ -5850,7 +6076,7 @@ msgid "Clone with %{http_label}"
msgstr "%{http_label} ã§ã‚¯ãƒ­ãƒ¼ãƒ³"
msgid "Clone with %{protocol}"
-msgstr ""
+msgstr "%{protocol} ã§ã‚¯ãƒ­ãƒ¼ãƒ³"
msgid "Clone with KRB5"
msgstr "KRB5 ã§ã‚¯ãƒ­ãƒ¼ãƒ³"
@@ -5913,7 +6139,7 @@ msgid "Closes this %{quick_action_target}."
msgstr "ã“ã® %{quick_action_target} ã‚’é–‰ã˜ã‚‹ã€‚"
msgid "Cluster"
-msgstr ""
+msgstr "クラスター"
msgid "Cluster Health"
msgstr "クラスターã®å¥åº·çŠ¶æ…‹"
@@ -5922,32 +6148,53 @@ msgid "Cluster cache cleared."
msgstr "クラスターã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’削除ã—ã¾ã—ãŸ"
msgid "Cluster does not exist"
-msgstr ""
+msgstr "クラスターãŒå­˜åœ¨ã—ã¾ã›ã‚“"
msgid "Cluster is required for Stages::ClusterEndpointInserter"
msgstr ""
msgid "Cluster level"
-msgstr ""
+msgstr "クラスターã®ãƒ¬ãƒ™ãƒ«"
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -5957,9 +6204,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -5988,7 +6247,7 @@ msgid "ClusterIntegration|%{title} updated successfully."
msgstr "%{title} ã¯æ­£å¸¸ã«æ›´æ–°ã•ã‚Œã¾ã—ãŸã€‚"
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
-msgstr ""
+msgstr "クラスター管ç†ãƒ—ロジェクトを使用ã—ã¦ã€Kubernetes %{code_open}cluster-admi %{code_close} 特権ã§ãƒ‡ãƒ—ロイジョブを実行ã§ãã¾ã™ã€‚"
msgid "ClusterIntegration|A service token scoped to %{code}kube-system%{end_code} with %{code}cluster-admin%{end_code} privileges."
msgstr "サービス・トークンã¯ã€ %{code}cluster-admin%{end_code} 特権をæŒã¤ %{code}kube-system%{end_code} スコープã§ã™ã€‚"
@@ -6006,7 +6265,7 @@ 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 を使用ã—ã€ã‚¢ãƒ—リケーションを導入ã—ã€åŒã˜ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¼ã‚’使用ã™ã‚‹ã™ã¹ã¦ã®ãƒ—ロジェクトã®ãƒ‘イプラインを簡å˜ã«å®Ÿè¡Œã—ã¾ã™ã€‚"
+msgstr "グループ㫠Kubernetes クラスターを追加ã™ã‚‹ã¨ã€ã™ã¹ã¦ã®ãƒ—ロジェクトã§ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¼ãŒè‡ªå‹•çš„ã«å…±æœ‰ã•ã‚Œã¾ã™ã€‚Review App を使用ã—ã€ã‚¢ãƒ—リケーションを導入ã—ã€åŒã˜ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¼ã‚’使用ã™ã‚‹ã™ã¹ã¦ã®ãƒ—ロジェクトã®ãƒ‘イプラインを簡å˜ã«å®Ÿè¡Œã—ã¾ã™ã€‚"
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 "Kubernetesクラスタを追加ã™ã‚‹ã¨ã€ã™ã¹ã¦ã®ãƒ—ロジェクトã§ã‚¯ãƒ©ã‚¹ã‚¿ãŒè‡ªå‹•çš„ã«å…±æœ‰ã•ã‚Œã¾ã™ã€‚レビューアプリを使用ã—ã€ã‚¢ãƒ—リケーションを導入ã—ã€åŒã˜ã‚¯ãƒ©ã‚¹ã‚¿ã‚’使用ã™ã‚‹ã™ã¹ã¦ã®ãƒ—ロジェクトã®ãƒ‘イプラインを簡å˜ã«å®Ÿè¡Œã—ã¾ã™ã€‚"
@@ -6018,7 +6277,7 @@ msgid "ClusterIntegration|Adding an integration will share the cluster across al
msgstr "インテグレーションを追加ã™ã‚‹ã¨ã€ã™ã¹ã¦ã®ãƒ—ロジェクトã§ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¼ãŒå…±æœ‰ã•ã‚Œã¾ã™ã€‚"
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
-msgstr ""
+msgstr "ã“ã®Kubernetesクラスタ統åˆã«é–¢ã™ã‚‹è©³ç´°ã‚ªãƒ—ション"
msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
msgstr "GitLab ã«ã‚³ãƒŸãƒƒãƒˆã—ã¦ã„ãªã„å…¨ã¦ã®ãƒ‡ãƒ¼ã‚¿ã‚’削除ã—ã¾ã™ã€‚ã“ã‚Œã¯å¾©å…ƒã§ãã¾ã›ã‚“。"
@@ -6078,7 +6337,7 @@ msgid "ClusterIntegration|Base domain"
msgstr "ベースドメイン"
msgid "ClusterIntegration|Blocking mode"
-msgstr ""
+msgstr "ブロックモード"
msgid "ClusterIntegration|CA Certificate"
msgstr "CA 証明書"
@@ -6090,7 +6349,7 @@ msgid "ClusterIntegration|Cert-Manager"
msgstr "Cert-Manager"
msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
+msgstr "Cert-Managerã¯ã€è¨¼æ˜Žæ›¸ã®ç™ºè¡Œã‚’支æ´ã™ã‚‹ãƒã‚¤ãƒ†ã‚£ãƒ–ã®Kubernetes証明書管ç†ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ©ã§ã™ã€‚クラスタã«Cert-Managerをインストールã™ã‚‹ã¨ã€%{linkStart}Let's Encrypt%{linkEnd} ã‹ã‚‰è¨¼æ˜Žæ›¸ãŒç™ºè¡Œã•ã‚Œã€è¨¼æ˜Žæ›¸ãŒæœ‰åŠ¹ã§æœ€æ–°ã®çŠ¶æ…‹ã‚’維æŒã—ã¾ã™ã€‚"
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr "èªè¨¼å±€ãƒãƒ³ãƒ‰ãƒ« (PEMå½¢å¼)"
@@ -6294,7 +6553,7 @@ msgid "ClusterIntegration|Fetching zones"
msgstr "ゾーンをå–得中"
msgid "ClusterIntegration|Fluentd"
-msgstr ""
+msgstr "Fluentd"
msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
msgstr ""
@@ -6423,7 +6682,7 @@ msgid "ClusterIntegration|Kubernetes cluster was successfully created."
msgstr "Kubernetes クラスターãŒæ­£å¸¸ã«ä½œæˆã•ã‚Œã¾ã—ãŸã€‚"
msgid "ClusterIntegration|Kubernetes clusters allow you to use review apps, deploy your applications, run your pipelines, and much more in an easy way."
-msgstr "Kubernetes クラスター㯠Review Apps ã®ä½¿ç”¨ã€ã‚¢ãƒ—リケーションã®ãƒ‡ãƒ—ロイã€ãƒ‘イプラインã®å®Ÿè¡Œã‚„より簡å˜ãªå‡¦ç†ã‚’è¡Œã†è¨±å¯ã‚’求ã‚ã¦ã„ã¾ã™ã€‚"
+msgstr "Kubernetes クラスター㯠Review App ã®ä½¿ç”¨ã€ã‚¢ãƒ—リケーションã®ãƒ‡ãƒ—ロイã€ãƒ‘イプラインã®å®Ÿè¡Œã‚„より簡å˜ãªå‡¦ç†ã‚’è¡Œã†è¨±å¯ã‚’求ã‚ã¦ã„ã¾ã™ã€‚"
msgid "ClusterIntegration|Kubernetes version"
msgstr "Kubernetesãƒãƒ¼ã‚¸ãƒ§ãƒ³"
@@ -6618,13 +6877,13 @@ msgid "ClusterIntegration|Request to begin uninstalling failed"
msgstr "アンインストールã®é–‹å§‹è¦æ±‚ã«å¤±æ•—ã—ã¾ã—ãŸ"
msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
+msgstr "SIEM ホストå"
msgid "ClusterIntegration|SIEM Port"
-msgstr ""
+msgstr "SIEM ãƒãƒ¼ãƒˆç•ªå·"
msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
+msgstr "SIEMプロトコル"
msgid "ClusterIntegration|Save changes"
msgstr "変更をä¿å­˜"
@@ -6762,7 +7021,7 @@ msgid "ClusterIntegration|Something went wrong while updating Knative domain nam
msgstr "Knativeドメインåã®æ›´æ–°ä¸­ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
-msgstr ""
+msgstr "ドメインを指定ã™ã‚‹ã¨ã€Auto Review App 㨠Auto Deployステージを %{linkStart}Auto DevOps%{linkEnd} ã«ä½¿ç”¨ã§ãã¾ã™ã€‚ドメインã«ã¯ãƒ‰ãƒ¡ã‚¤ãƒ³ã«ãƒžãƒƒãƒã™ã‚‹ãƒ¯ã‚¤ãƒ«ãƒ‰ã‚«ãƒ¼ãƒ‰DNSãŒè¨­å®šã•ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ "
msgid "ClusterIntegration|Subnets"
msgstr "サブãƒãƒƒãƒˆ"
@@ -6882,7 +7141,7 @@ msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you
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 Apps ã®ä½¿ç”¨ã€ã‚¢ãƒ—リケーションã®ãƒ‡ãƒ—ロイã€ãƒ‘イプラインã®å®Ÿè¡Œãªã©ã‚’ç°¡å˜ã«è¡Œã†ã“ã¨ãŒã§ãã¾ã™ã€‚"
+msgstr "ã“ã®ãƒ—ロジェクト㫠Kubernetes クラスターを関連付ã‘ã‚‹ã“ã¨ã§ã€Review App ã®ä½¿ç”¨ã€ã‚¢ãƒ—リケーションã®ãƒ‡ãƒ—ロイã€ãƒ‘イプラインã®å®Ÿè¡Œãªã©ã‚’ç°¡å˜ã«è¡Œã†ã“ã¨ãŒã§ãã¾ã™ã€‚"
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
msgstr "クラスター統åˆã¨ã€ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¼ã«é–¢é€£ä»˜ã‘られã¦ã„ã‚‹ GitLab ãŒä½œæˆã—ãŸã™ã¹ã¦ã®ãƒªã‚½ãƒ¼ã‚¹ã‚’削除ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚"
@@ -6968,6 +7227,9 @@ msgstr ""
msgid "Code"
msgstr "コード"
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7037,6 +7299,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr "承èªè€…ã‚’éžè¡¨ç¤ºã«ã™ã‚‹"
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr "マイルストーンを折りãŸãŸã‚€"
@@ -7221,17 +7486,41 @@ msgstr "以å‰ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¨æ¯”較"
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr "%{source_branch} 㨠%{target_branch} ã¯ä¸€è‡´ã—ã¾ã™ã€‚"
-msgid "CompareBranches|Compare"
-msgstr "比較"
+msgid "CompareBranches|There isn't anything to compare."
+msgstr "比較ã™ã‚‹ã‚‚ã®ã¯ã‚ã‚Šã¾ã›ã‚“。"
-msgid "CompareBranches|Source"
-msgstr "比較元"
+msgid "CompareRevisions|Branches"
+msgstr ""
-msgid "CompareBranches|Target"
-msgstr "比較先"
+msgid "CompareRevisions|Compare"
+msgstr ""
-msgid "CompareBranches|There isn't anything to 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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
+msgstr ""
msgid "Complete"
msgstr "完了"
@@ -7245,6 +7534,12 @@ msgstr "コンプライアンス"
msgid "Compliance Dashboard"
msgstr "コンプライアンスダッシュボード"
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr "コンプライアンスフレームワーク(オプション)"
@@ -7257,9 +7552,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7275,9 +7600,18 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
msgstr ""
-msgid "ComplianceFramework|GDPR"
+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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
+msgid "ComplianceFramework|GDPR"
+msgstr "GDPR"
+
msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
msgstr "GDPR - 一般データä¿è­·è¦å‰‡"
@@ -7287,6 +7621,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7326,6 +7663,9 @@ msgstr "GitLab Runner を設定ã—ã¦Web端末を使ã„始ã‚ã¾ã™ã€‚ 詳細ã¯
msgid "Configure Gitaly timeouts."
msgstr "Gitaly ã®ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã‚’設定ã—ã¾ã™ã€‚"
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr "Let's Encryptを設定"
@@ -7347,6 +7687,9 @@ msgstr "既存ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’設定ã™ã‚‹"
msgid "Configure limit for issues created per minute by web and API requests."
msgstr "Webã¨APIリクエストã«ã‚ˆã£ã¦1分ã‚ãŸã‚Šã«ä½œæˆã•ã‚Œã‚‹ã‚¤ã‚·ãƒ¥ãƒ¼ã®åˆ¶é™ã‚’設定ã—ã¾ã™ã€‚"
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7401,9 +7744,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr "ãŠã‚ã§ã¨ã†ã”ã–ã„ã¾ã™ã€‚2è¦ç´ èªè¨¼ãŒæœ‰åŠ¹ã«ãªã‚Šã¾ã—ãŸã€‚"
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7574,24 +7914,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr "Docker接続エラー"
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 "ã¾ã ãƒ­ã‚°ã‚¤ãƒ³ã—ã¦ã„ãªã„å ´åˆã€GitLab ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åã¨ãƒ‘スワードを使用ã—ã¦ã‚³ãƒ³ãƒ†ãƒŠãƒ¬ã‚¸ã‚¹ãƒˆãƒªã‚’èªè¨¼ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ %{twofaDocLinkStart} 2è¦ç´ èªè¨¼ã‚’ %{twofaDocLinkEnd} 有効ã«ã—ã¦ã„ã‚‹å ´åˆã¯ã€ãƒ‘スワードã®ä»£ã‚ã‚Šã« %{personalAccessTokensDocLinkStart} パーソナルアクセストークン%{personalAccessTokensDocLinkEnd} 使用ã—ã¾ã™ã€‚"
-msgid "ContainerRegistry|Image Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8049,10 +8380,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr "イテレーションãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8088,9 +8419,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr "デザインをアップロードã§ãã¾ã›ã‚“ã§ã—ãŸã€‚アップロードã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã«ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„ã‚‚ã®ãŒå«ã¾ã‚Œã¦ã„ã¾ã—ãŸã€‚"
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr "国"
@@ -8137,12 +8465,12 @@ 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 deploy key for this project"
-msgstr ""
-
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr "ã¾ã ãƒ•ã‚¡ã‚¤ãƒ«ãŒãªã„ãŸã‚ã€æ–°ã—ã„ファイルを作æˆã—ã¾ã™ã€‚ ãã®å¾Œã€ã‚ãªãŸã¯å¤‰æ›´ã‚’コミットã§ãã¾ã™ã€‚"
@@ -8167,6 +8495,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr "ブランãƒä½œæˆ"
@@ -8194,6 +8525,9 @@ msgstr "ファイルを作æˆ"
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr "グループを作æˆ"
@@ -8206,6 +8540,9 @@ msgstr "イシューã®ä½œæˆ"
msgid "Create iteration"
msgstr "イテレーションã®ä½œæˆ"
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr "ラベルã‹ã‚‰ãƒªã‚¹ãƒˆã‚’作æˆã€‚ãã®ãƒ©ãƒ™ãƒ«ã®ã‚¤ã‚·ãƒ¥ãƒ¼ãŒãƒªã‚¹ãƒˆã«è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚"
@@ -8221,6 +8558,12 @@ msgstr "マイルストーンを作æˆ"
msgid "Create new"
msgstr "æ–°è¦ä½œæˆ "
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr "æ–°è¦ãƒãƒªãƒ¥ãƒ¼ã‚¹ãƒˆãƒªãƒ¼ãƒ ã‚’作æˆ"
@@ -8293,6 +8636,9 @@ msgstr "%{name} (デフォルト)"
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8302,15 +8648,30 @@ msgstr "ステージを追加"
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr "ã™ã¹ã¦ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã‚¹ãƒ†ãƒ¼ã‚¸ã¯ç¾åœ¨è¡¨ç¤ºã•ã‚Œã¦ã„ã¾ã™"
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 "ステージを編集"
@@ -8329,6 +8690,9 @@ msgstr "ステージåを入力"
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr "最大長 %{maxLength} 文字"
@@ -8338,6 +8702,9 @@ msgstr "åå‰ã¯å¿…é ˆã§ã™"
msgid "CreateValueStreamForm|New stage"
msgstr "æ–°è¦ã‚¹ãƒ†ãƒ¼ã‚¸"
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr "最åˆã«é–‹å§‹ã‚¤ãƒ™ãƒ³ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„"
@@ -8353,6 +8720,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr "ステージを復元"
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr "終了イベントをé¸æŠž"
@@ -8458,6 +8828,9 @@ msgstr "作æˆæ—¥æ™‚"
msgid "Credentials"
msgstr "èªè¨¼æƒ…å ±"
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8506,14 +8879,14 @@ msgstr "ç¾åœ¨ã®è„†å¼±æ€§ã‚«ã‚¦ãƒ³ãƒˆ"
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
-msgstr "プロフィール"
+msgid "CurrentUser|One of your groups is running out"
+msgstr ""
-msgid "CurrentUser|Settings"
-msgstr "設定"
+msgid "CurrentUser|Preferences"
+msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
@@ -8539,8 +8912,8 @@ msgstr ""
msgid "Custom notification events"
msgstr "カスタム通知設定"
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
-msgstr "\"カスタム\" ã®é€šçŸ¥ãƒ¬ãƒ™ãƒ«ã®åŸºæœ¬ã¯ \"å‚加\" ã¨åŒã˜ã§ã™ã€‚ã¾ãŸã€ã‚«ã‚¹ã‚¿ãƒ é€šçŸ¥ã«è¨­å®šã™ã‚‹ã“ã¨ã§é¸æŠžã—ãŸã‚«ã‚¹ã‚¿ãƒ ã‚¤ãƒ™ãƒ³ãƒˆã®é€šçŸ¥ã‚’å—ã‘å–ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ã‚‚ã£ã¨è©³ã—ã知りãŸã„å ´åˆã¯ %{notification_link} を見ã¦ãã ã•ã„。"
+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 "カスタムプロジェクトテンプレート"
@@ -8581,6 +8954,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr "カスタムカラー"
@@ -8614,6 +8990,18 @@ 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 "完了ã—ãŸã‚¤ã‚·ãƒ¥ãƒ¼"
@@ -8777,7 +9165,7 @@ msgstr "ステージドロップダウン"
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr "DAGã®å¯è¦–化ã«ã¯ã€å°‘ãªãã¨ã‚‚3ã¤ã®ä¾å­˜æ€§ã®ã‚るジョブãŒå¿…è¦ã§ã™ã€‚"
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -8933,7 +9321,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -8957,6 +9351,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9038,6 +9435,9 @@ 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 ""
@@ -9047,6 +9447,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9071,6 +9474,10 @@ 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] ""
+
msgid "DastSiteValidation|Validate"
msgstr ""
@@ -9089,6 +9496,9 @@ 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 "データã¯ã¾ã è¨ˆç®—中ã§ã™..."
@@ -9110,6 +9520,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr "日付範囲㯠%{maxDateRange} 日を超ãˆã‚‰ã‚Œã¾ã›ã‚“。"
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9134,6 +9547,9 @@ msgstr "マージã¾ã§ã®æ—¥æ•°"
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr "デãƒãƒƒã‚°"
@@ -9152,9 +9568,6 @@ msgstr "辞退ã—ã¦ã‚µã‚¤ãƒ³ã‚¢ã‚¦ãƒˆ"
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr "デフォルトブランãƒ"
-
msgid "Default CI configuration path"
msgstr "デフォルトã®CI設定パス"
@@ -9209,6 +9622,9 @@ msgstr "Cron 構文ã§ã‚«ã‚¹ã‚¿ãƒ ãªãƒ‘ターンを指定ã™ã‚‹"
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9239,6 +9655,9 @@ msgstr "予約済ã¿"
msgid "Delete"
msgstr "削除"
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9296,6 +9715,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr "ã“ã®æ·»ä»˜ãƒ•ã‚¡ã‚¤ãƒ«ã‚’削除"
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9320,6 +9742,15 @@ msgstr "プロジェクトã®ãƒªãƒã‚¸ãƒˆãƒªã®ãƒ¬ã‚¹ãƒˆã‚¢ã«å¤±æ•—ã—ã¾ã—ãŸ
msgid "DeleteProject|Failed to restore wiki repository. Please contact the administrator."
msgstr "wikiリãƒã‚¸ãƒˆãƒªã®ãƒ¬ã‚¹ãƒˆã‚¢ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã™ã‹ã€ç®¡ç†è€…ã«é€£çµ¡ã—ã¦ãã ã•ã„。"
+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 "削除完了"
@@ -9488,13 +9919,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr "デプロイキーã¯æ­£å¸¸ã«æ›´æ–°ã•ã‚Œã¾ã—ãŸã€‚"
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
-msgstr ""
-
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9503,6 +9931,9 @@ msgstr "デプロイã®é€²è¡ŒçŠ¶æ³ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 ãƒãƒƒãƒ‰ã‚’表ç¤
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9512,15 +9943,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr "+ %{count} プロジェクト"
@@ -9545,6 +9973,9 @@ msgstr "デプロイキーã®å‰Šé™¤ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿ"
msgid "DeployKeys|Expand %{count} other projects"
msgstr "他㮠%{count} プロジェクトを展開"
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr "デプロイキーを読込中"
@@ -9563,9 +9994,6 @@ msgstr "パブリックアクセスãŒå¯èƒ½ãªãƒ‡ãƒ—ロイキー"
msgid "DeployKeys|Read access only"
msgstr "読ã¿å–り専用"
-msgid "DeployKeys|Write access allowed"
-msgstr "書ãè¾¼ã¿ã‚¢ã‚¯ã‚»ã‚¹è¨±å¯"
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr "ã“ã®ãƒ‡ãƒ—ロイキーを削除ã—ã¾ã™ã€‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ"
@@ -9575,20 +10003,20 @@ msgstr "アクティブãªãƒ‡ãƒ—ロイトークン (%{active_tokens})"
msgid "DeployTokens|Add a deploy token"
msgstr "デプロイトークンを追加"
-msgid "DeployTokens|Allows read access to the package registry"
-msgstr "パッケージレジストリã¸ã®èª­ã¿å–りアクセスを許å¯ã™ã‚‹"
+msgid "DeployTokens|Allows read access to the package registry."
+msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
-msgstr "レジストリイメージã¸ã®èª­ã¿å–り専用アクセスを許å¯ã™ã‚‹"
+msgid "DeployTokens|Allows read-only access to registry images."
+msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
-msgstr "リãƒã‚¸ãƒˆãƒªã¸ã®èª­ã¿å–り専用アクセスを許å¯ã™ã‚‹"
+msgid "DeployTokens|Allows read-only access to the repository."
+msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
-msgstr "パッケージレジストリã¸ã®æ›¸ãè¾¼ã¿ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã™ã‚‹"
+msgid "DeployTokens|Allows write access to registry images."
+msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
-msgstr "レジストリイメージã¸ã®æ›¸ãè¾¼ã¿ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã™ã‚‹"
+msgid "DeployTokens|Allows write access to the package registry."
+msgstr ""
msgid "DeployTokens|Copy deploy token"
msgstr "デプロイトークンをコピー"
@@ -9602,11 +10030,8 @@ msgstr "デプロイトークンを作æˆ"
msgid "DeployTokens|Created"
msgstr "作æˆæ—¥"
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr "デフォルトã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã¯ \"gitlab+deploy-token-{n}\" ã§ã™ã€‚変更ã—ãŸã„å ´åˆã€ã‚«ã‚¹ã‚¿ãƒ ãƒ¦ãƒ¼ã‚¶ãƒ¼åを入力ã—ã¾ã™ã€‚"
-
-msgid "DeployTokens|Deploy Tokens"
-msgstr "デプロイトークン"
+msgid "DeployTokens|Deploy tokens"
+msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
msgstr "デプロイトークンã¯ã€ãƒ‘ッケージã€ãƒªãƒã‚¸ãƒˆãƒªãŠã‚ˆã³ãƒ¬ã‚¸ã‚¹ãƒˆãƒªã‚¤ãƒ¡ãƒ¼ã‚¸ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’å¯èƒ½ã«ã—ã¾ã™ã€‚"
@@ -9620,8 +10045,8 @@ msgstr "グループデプロイトークンã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—内ã®ãƒ‘ッケー
msgid "DeployTokens|Name"
msgstr "åå‰"
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
-msgstr "アプリケーションã®åå‰ã‚’é¸æŠžã™ã‚‹ã¨ã€å›ºæœ‰ã®ãƒ‡ãƒ—ロイトークンãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚"
+msgid "DeployTokens|Pick a name for your unique deploy token."
+msgstr ""
msgid "DeployTokens|Revoke"
msgstr "失効"
@@ -9641,11 +10066,17 @@ msgstr "ã“ã® %{entity_type} ã«ã¯ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªãƒ‡ãƒ—ロイトークンã
msgid "DeployTokens|This action cannot be undone."
msgstr "ã“ã®æ“作ã¯å…ƒã«æˆ»ã›ã¾ã›ã‚“。"
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
-msgstr "ã“ã®ãƒˆãƒ¼ã‚¯ãƒ³ã‚’パスワードã¨ã—ã¦ä½¿ç”¨ã—ã¾ã™ã€‚å†åº¦ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã“ã¨ã¯ã§ããªã„ã®ã§ã€å¿˜ã‚Œãšã«ä¿å­˜ã—ã¦ãã ã•ã„。"
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
+msgstr ""
-msgid "DeployTokens|Use this username as a login."
-msgstr "ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åをログインã«ä½¿ç”¨ã—ã¾ã™ã€‚"
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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 "ユーザーå"
@@ -9653,8 +10084,8 @@ msgstr "ユーザーå"
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr " %{b_start}%{name}%{b_end}を失効ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚"
-msgid "DeployTokens|Your New Deploy Token"
-msgstr "æ–°è¦ãƒ‡ãƒ—ロイトークン"
+msgid "DeployTokens|Your new Deploy Token username"
+msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
msgstr "æ–°ã—ã„グループデプロイトークンãŒä½œæˆã•ã‚Œã¾ã—ãŸã€‚"
@@ -9681,6 +10112,9 @@ msgid "Deploying to AWS is easy with GitLab"
msgstr ""
msgid "Deployment Frequency"
+msgstr "デプロイ頻度"
+
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
msgstr ""
msgid "DeploymentFrequencyCharts|Date"
@@ -9692,15 +10126,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9710,6 +10135,10 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+
msgid "Deployment|API"
msgstr "API"
@@ -9804,7 +10233,7 @@ 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 ""
+msgstr "本当ã«ã“ã®ã‚³ãƒ¡ãƒ³ãƒˆã¸ã®å¤‰æ›´ã‚’å–り消ã—ã¦ã‚ˆã‚ã—ã„ã§ã—ょã†ã‹ï¼Ÿ"
msgid "DesignManagement|Are you sure you want to cancel creating this comment?"
msgstr "本当ã«ã“ã®ã‚³ãƒ¡ãƒ³ãƒˆã®ä½œæˆã‚’キャンセルã—ã¾ã™ã‹ï¼Ÿ"
@@ -9932,18 +10361,6 @@ msgstr "ホストキーã®æ¤œå‡º"
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -9959,16 +10376,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -9989,10 +10406,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10001,18 +10415,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10025,9 +10433,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10037,6 +10442,12 @@ 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 ""
@@ -10064,6 +10475,9 @@ 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|Score"
msgstr ""
@@ -10161,7 +10575,7 @@ 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 ""
+msgstr "アプリケーションをãƒã‚§ãƒƒã‚¯ã—ã¦ã€ä¸æ­£ã‚¢ã‚¯ã‚»ã‚¹ã€ãƒ‡ãƒ¼ã‚¿æ¼æ´©ã€ã‚µãƒ¼ãƒ“ス拒å¦(DoS) ã®å¯èƒ½æ€§ã®ã‚るセキュリティ上ã®è„†å¼±æ€§ã‚’確èªã—ã¾ã™ã€‚"
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 ""
@@ -10175,7 +10589,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10369,7 +10783,7 @@ msgid "Downvotes"
msgstr "イマイãƒ"
msgid "Draft"
-msgstr ""
+msgstr "ドラフト"
msgid "Draft merge requests can't be merged."
msgstr ""
@@ -10377,6 +10791,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10569,11 +10986,11 @@ msgstr "%{number} 件ã®ãƒ¡ãƒ¼ãƒ«"
msgid "Email Notification"
msgstr "メール通知"
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
-msgstr "メールを空白ã«ã§ãã¾ã›ã‚“"
+msgid "Email address to use for Support Desk"
+msgstr ""
msgid "Email could not be sent"
msgstr "メールをé€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ"
@@ -10641,12 +11058,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr "リセットã™ã‚‹"
-
-msgid "EmailToken|resetting..."
-msgstr "リセット中..."
-
msgid "Emails"
msgstr "メール"
@@ -10767,6 +11178,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr "メールã®ãƒ˜ãƒƒãƒ€ãƒ¼ã¨ãƒ•ãƒƒã‚¿ãƒ¼ã‚’有効ã«ã™ã‚‹"
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -10932,20 +11346,14 @@ msgstr "イシュー数を入力ã—ã¦ãã ã•ã„"
msgid "Enter one or more user ID separated by commas"
msgstr "ユーザーID入力ã—ã¦ãã ã•ã„。二ã¤ä»¥ä¸Šå…¥åŠ›ã™ã‚‹ã¨ãã¯ã‚«ãƒ³ãƒžåŒºåˆ‡ã‚Šã§ã™ã€‚"
-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 "モãƒã‚¤ãƒ«ç«¯æœ«ã®2è¦ç´ èªè¨¼ã‚¢ãƒ—リã‹ã‚‰ã‚³ãƒ¼ãƒ‰ã‚’入力ã—ã¾ã™ã€‚デãƒã‚¤ã‚¹ã‚’紛失ã—ãŸå ´åˆã¯ã€ãƒªã‚«ãƒãƒªãƒ¼ã‚³ãƒ¼ãƒ‰ã®ã„ãšã‚Œã‹ã‚’入力ã—ã¦ãã ã•ã„。"
-
-msgid "Enter the issue description"
-msgstr "イシューã®èª¬æ˜Žã‚’入力ã—ã¦ãã ã•ã„"
-
-msgid "Enter the issue title"
-msgstr "イシューã®ã‚¿ã‚¤ãƒˆãƒ«ã‚’入力ã—ã¦ãã ã•ã„"
+msgid "Enter the %{name} description"
+msgstr ""
-msgid "Enter the merge request description"
-msgstr "マージリクエストã®èª¬æ˜Žã‚’入力ã—ã¦ãã ã•ã„"
+msgid "Enter the %{name} title"
+msgstr ""
-msgid "Enter the merge request 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 "モãƒã‚¤ãƒ«ç«¯æœ«ã®2è¦ç´ èªè¨¼ã‚¢ãƒ—リã‹ã‚‰ã‚³ãƒ¼ãƒ‰ã‚’入力ã—ã¾ã™ã€‚デãƒã‚¤ã‚¹ã‚’紛失ã—ãŸå ´åˆã¯ã€ãƒªã‚«ãƒãƒªãƒ¼ã‚³ãƒ¼ãƒ‰ã®ã„ãšã‚Œã‹ã‚’入力ã—ã¦ãã ã•ã„。"
msgid "Enter the name of your application, and we'll return a unique %{type}."
msgstr ""
@@ -11074,16 +11482,16 @@ msgid "Environments|Currently showing all results."
msgstr "ç¾åœ¨ã™ã¹ã¦ã®çµæžœã‚’表示ã—ã¦ã„ã¾ã™ã€‚"
msgid "Environments|Delete"
-msgstr ""
+msgstr "削除"
msgid "Environments|Delete '%{environmentName}'?"
msgstr ""
msgid "Environments|Delete environment"
-msgstr ""
+msgstr "環境を削除"
msgid "Environments|Deleting the '%{environmentName}' environment cannot be undone. Do you want to delete it anyway?"
-msgstr ""
+msgstr "環境 %{environmentName} を削除ã™ã‚‹ã¨ã€å…ƒã«æˆ»ã›ã¾ã›ã‚“。本当ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ"
msgid "Environments|Deploy to..."
msgstr "デプロイã—ã¾ã™"
@@ -11095,7 +11503,7 @@ msgid "Environments|Deployment %{status}"
msgstr ""
msgid "Environments|Enable review app"
-msgstr ""
+msgstr "Review Appを有効ã«ã™ã‚‹"
msgid "Environments|Environment"
msgstr "環境"
@@ -11229,6 +11637,9 @@ msgstr "ä¿è­·"
msgid "Epic"
msgstr "エピック"
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr "エピックãŒã‚ã‚Šã¾ã›ã‚“。"
@@ -11253,6 +11664,12 @@ 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 ""
@@ -11280,6 +11697,9 @@ msgstr "ã©ã†ã™ã‚Œã°è§£æ±ºã§ãã¾ã™ã‹ï¼Ÿ"
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr "空ã®ã¾ã¾ã«ã—ãŸå ´åˆã€ãƒžã‚¤ãƒ«ã‚¹ãƒˆãƒ¼ãƒ³ã®æ—¥ä»˜ã‚’継承ã—ã¾ã™"
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr "エピックを削除"
@@ -11307,6 +11727,9 @@ 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 "グループエピックã®å–得中ã«ä½•ã‹å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
@@ -11331,9 +11754,6 @@ msgstr "%{bStart}%{parentEpicTitle}%{bEnd} ã‹ã‚‰ %{bStart}%{targetEpicTitle}%{b
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 "マイルストーンã«åŸºã¥ã„ãŸã‚¨ãƒ”ック㮠%{epicDateType} をスケジューリングã™ã‚‹ã«ã¯ã€ã‚¨ãƒ”ックã®ã‚¤ã‚·ãƒ¥ãƒ¼ã« %{epicDateType} ã®ãƒžã‚¤ãƒ«ã‚¹ãƒˆãƒ¼ãƒ³ã‚’割り当ã¦ã¾ã™ã€‚"
-msgid "Epics|Unable to perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11508,6 +11928,9 @@ msgstr ""
msgid "Error uploading file"
msgstr "ファイルアップロードエラー"
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr "ファイルã®ã‚¢ãƒƒãƒ—ロードã«å¤±æ•—ã—ã¾ã—ãŸ: %{stripped} "
@@ -11673,6 +12096,9 @@ msgstr ""
msgid "Evidence collection"
msgstr "証拠集ã‚"
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11688,6 +12114,9 @@ msgstr "例: Usage = å˜ä¸€ã‚¯ã‚¨ãƒªã€‚ (Requested) / (Capacity) = å¼ã‚’構æˆã
msgid "Except policy:"
msgstr "除外ãƒãƒªã‚·ãƒ¼:"
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11730,6 +12159,9 @@ msgstr "承èªè€…を展開"
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr "マイルストーンを展開"
@@ -11766,6 +12198,9 @@ msgstr "有効期é™"
msgid "Expires at"
msgstr "有効期é™æ—¥"
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr "%{expires_at} ã§æœŸé™åˆ‡ã‚Œ"
@@ -11799,6 +12234,9 @@ msgstr "公開グループを検索"
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr "CSV å½¢å¼ã§ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ"
@@ -11922,12 +12360,12 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr "マージリクエストã®ä½œæˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。"
-msgid "Failed to create To-Do for the design."
-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 ""
@@ -11952,6 +12390,12 @@ msgstr "デプロイã«å¤±æ•—ã—ã¾ã—ãŸ"
msgid "Failed to enqueue the rebase operation, possibly due to a long-lived transaction. Try again later."
msgstr "ãŠãらã長期間ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ãŒåŽŸå› ã§ã€rebaseæ“作をキューã«ç™»éŒ²ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ã‚ã¨ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ã¿ã¦ãã ã•ã„。"
+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 ""
@@ -11988,9 +12432,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr "グループã¨ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®èª­ã¿è¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸ"
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12006,9 +12447,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr "関連ã™ã‚‹ãƒ–ランãƒã®èª­ã¿è¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸ"
-msgid "Failed to load sidebar confidential toggle"
-msgstr "サイドãƒãƒ¼ã®éžå…¬é–‹ãƒˆã‚°ãƒ«ã®èª­ã¿è¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸ"
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12042,12 +12480,12 @@ msgstr "ã“ã®ç’°å¢ƒã‚’ä¿è­·ã§ãã¾ã›ã‚“ã§ã—ãŸ"
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
-msgstr ""
-
msgid "Failed to remove a Zoom meeting"
msgstr "Zoom ミーティングã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸ"
+msgid "Failed to remove a to-do item for the design."
+msgstr ""
+
msgid "Failed to remove issue from board, please try again."
msgstr "ボードã®ã‚¤ã‚·ãƒ¥ãƒ¼ã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
@@ -12090,7 +12528,7 @@ msgstr "ã“ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã®ã‚¤ãƒ†ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã®è¨­å®šã«å¤±æ•—ã—ã¾ã—ãŸ
msgid "Failed to signing using smartcard authentication"
msgstr "スマートカードèªè¨¼ã‚’使用ã—ã¦ã®ç½²åã«å¤±æ•—ã—ã¾ã—ãŸã€‚"
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12108,9 +12546,6 @@ msgstr "イシューã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã®æ›´æ–°ã«å¤±æ•—ã—ã¾ã—ãŸ"
msgid "Failed to update issues, please try again."
msgstr "イシューã®æ›´æ–°ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
-msgid "Failed to update tag!"
-msgstr "ã‚¿ã‚°ã®æ›´æ–°ã«å¤±æ•—ã—ã¾ã—ãŸ"
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12153,6 +12588,9 @@ msgstr "機能フラグ"
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr "機能フラグを削除ã—ã¾ã›ã‚“ã§ã—ãŸã€‚"
@@ -12646,6 +13084,15 @@ msgstr "FogBugz ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
msgid "Folder/%{name}"
msgstr "フォルダ/%{name}"
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr "フォントã®è‰²"
@@ -12709,6 +13156,42 @@ msgstr "プロジェクトをフォーク"
msgid "Fork project?"
msgstr "プロジェクトをフォーク?"
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr "フォーク元"
@@ -12739,8 +13222,8 @@ msgstr ""
msgid "Free Trial"
msgstr "無料トライアル"
-msgid "Free Trial of GitLab.com Gold"
-msgstr "GitLab.com Gold プランã®ç„¡å„Ÿè©¦ç”¨"
+msgid "Free Trial of GitLab.com Ultimate"
+msgstr ""
msgid "Freeze end"
msgstr ""
@@ -12817,9 +13300,6 @@ msgstr "Geo"
msgid "Geo Nodes"
msgstr "Geo ノード"
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12832,6 +13312,9 @@ msgstr "Geo設定"
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr "%{timeAgoStr}(%{pendingEvents} イベント)"
@@ -12979,6 +13462,9 @@ msgstr "%{name} ã¯å†åŒæœŸãŒäºˆå®šã•ã‚Œã¦ã„ã¾ã™"
msgid "Geo|%{name} is scheduled for re-verify"
msgstr "%{name} ã¯å†æ¤œè¨¼ãŒäºˆå®šã•ã‚Œã¦ã„ã¾ã™"
+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 ""
@@ -13018,6 +13504,9 @@ msgstr "既存ã®ãƒ—ロジェクトã®ãƒˆãƒ©ãƒƒã‚­ãƒ³ã‚°ã‚¨ãƒ³ãƒˆãƒªã‚’削除ã§
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr "既存ã®ã‚¢ãƒƒãƒ—ロードã®ãƒˆãƒ©ãƒƒã‚­ãƒ³ã‚°ã‚¨ãƒ³ãƒˆãƒªã‚’削除ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr "失敗"
@@ -13027,6 +13516,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr "ジオステータス"
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13051,6 +13543,12 @@ msgstr "最後ã®åŒæœŸè©¦è¡Œ"
msgid "Geo|Last time verified"
msgstr "å‰å›žã®ç¢ºèªæ—¥æ™‚"
+msgid "Geo|Learn more about Geo"
+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 "未確èª"
@@ -13078,6 +13576,9 @@ msgstr "Geo ã®ãƒˆãƒ©ãƒ–ルシューティングをå‚ç…§ã—ã¦ãã ã•ã„。"
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr "プロジェクト"
@@ -13123,6 +13624,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr "状態"
@@ -13174,6 +13678,9 @@ msgstr "åŒæœŸã«å¤±æ•—ã—ã¾ã—㟠- %{error}"
msgid "Geo|Waiting for scheduler"
msgstr "スケジューラ待ã¡"
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13198,9 +13705,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr "エラー追跡を開始"
@@ -13213,6 +13717,9 @@ msgstr "始ã‚ã¾ã—ょã†"
msgid "Getting started with releases"
msgstr "リリースã®é–‹å§‹"
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr "ã“ã®GitLabサーãƒãƒ¼ã¯Git LFSãŒç„¡åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚管ç†è€…ã«é€£çµ¡ã—ã¦ãã ã•ã„。"
@@ -13249,6 +13756,9 @@ msgstr "GitHub APIã®åˆ¶é™ã‚’超ãˆã¾ã—ãŸã€‚ %{reset_time} 後ã«å†è©¦è¡Œã
msgid "GitHub import"
msgstr "GitHub インãƒãƒ¼ãƒˆ"
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13510,9 +14020,6 @@ msgstr ""
msgid "Go full screen"
msgstr "全画é¢è¡¨ç¤º"
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13663,6 +14170,9 @@ msgstr ""
msgid "Grant access"
msgstr "アクセス許å¯"
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr "グラフ"
@@ -13711,6 +14221,9 @@ msgstr "グループ SAML を有効ã«ã—ã¦ãƒ†ã‚¹ãƒˆã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™
msgid "Group URL"
msgstr "グループ URL"
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr "グループアãƒã‚¿ãƒ¼"
@@ -14044,6 +14557,15 @@ msgstr "\"永続的\"ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™"
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr "ランダムãªæ°¸ç¶šçš„IDã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã€ãƒ¡ãƒ¼ãƒ«ã¯æŽ¨å¥¨ã•ã‚Œã¾ã›ã‚“"
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14320,6 +14842,12 @@ msgstr "åå‰ã§æ¤œç´¢"
msgid "Guideline"
msgstr "ガイドライン"
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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} ã§ç”Ÿæˆã§ãã¾ã™"
@@ -14401,15 +14929,15 @@ msgstr "アラートã®é‡ã‚’減らã™ã®ã«å½¹ç«‹ã¡ã¾ã™(例:作æˆã™ã‚‹ã‚
msgid "Helps reduce request volume for protected paths"
msgstr "ä¿è­·ã•ã‚ŒãŸãƒ‘スã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆé‡ã‚’減らã™ã®ã«å½¹ç«‹ã¡ã¾ã™"
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr "よã†ã“ã%{username}!"
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr "アーカイブã—ãŸãƒ—ロジェクトをéžè¡¨ç¤ºã«"
@@ -14511,6 +15039,9 @@ msgstr "ãƒã‚¦ã‚¹ã‚­ãƒ¼ãƒ”ングã€ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã€ãƒ‘スã€è»¢é€ã€å‰Šé™¤
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14759,6 +15290,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15117,7 +15651,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15543,9 +16077,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr "アプリケーションリãƒã‚¸ãƒˆãƒªã‹ã‚‰ %{free_otp_link} ã‚„Google èªè¨¼ãªã©ã®ã‚½ãƒ•ãƒˆèªè¨¼ãƒˆãƒ¼ã‚¯ãƒ³ã‚’インストールã—ã€ãれを使ã£ã¦ã“ã®QRコードをスキャンã—ã¾ã™ã€‚より詳ã—ã„情報㯠%{help_link_start} 文書 %{help_link_end} ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
-
msgid "Install on clusters"
msgstr "クラスタ上ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹"
@@ -15580,96 +16111,6 @@ msgstr "インスタンス管ç†è€…グループã¯æ—¢ã«å­˜åœ¨ã—ã¾ã™"
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15688,12 +16129,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15745,6 +16192,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15778,6 +16231,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -15946,6 +16402,9 @@ msgstr "メール㧠\"%{trimmed}\" を招待"
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr "グループã«æ‹›å¾…ã™ã‚‹"
@@ -15955,9 +16414,6 @@ msgstr "メンãƒãƒ¼ã‚’招待ã™ã‚‹"
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -15967,9 +16423,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16009,19 +16498,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16030,18 +16540,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16051,6 +16576,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16273,6 +16804,9 @@ 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 ""
@@ -16286,10 +16820,10 @@ msgid "IssuesAnalytics|Avg/Month:"
msgstr "月平å‡:"
msgid "IssuesAnalytics|Issues opened"
-msgstr "未解決ã®ã‚¤ã‚·ãƒ¥ãƒ¼"
+msgstr "オープンã—ãŸã‚¤ã‚·ãƒ¥ãƒ¼"
msgid "IssuesAnalytics|Issues opened per month"
-msgstr "未解決ã®ã‚¤ã‚·ãƒ¥ãƒ¼æ•°/月"
+msgstr "オープンã—ãŸã‚¤ã‚·ãƒ¥ãƒ¼æ•°/月"
msgid "IssuesAnalytics|Last 12 months"
msgstr "éŽåŽ»12ヶ月間"
@@ -16348,11 +16882,8 @@ msgstr "イテレーションを更新ã—ã¾ã—ãŸ"
msgid "Iterations"
msgstr "イテレーション"
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr "日付ã¯ä»–ã®æ—¢å­˜ã®ã‚¤ãƒ†ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã¨é‡è¤‡ã§ãã¾ã›ã‚“"
-
-msgid "Iteration|cannot be in the past"
-msgstr "éŽåŽ»ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
+msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr "500年以上先ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“"
@@ -16399,6 +16930,9 @@ 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 ""
@@ -16414,7 +16948,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16474,6 +17008,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16498,6 +17035,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr "サーãƒãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«ã¯ãƒ‘スワードを使用ã—ã¦ãã ã•ã„。クラウドãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«ã¯APIトークンを使用ã—ã¦ãã ã•ã„。"
@@ -16699,6 +17239,9 @@ 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 ""
@@ -16768,9 +17311,6 @@ msgstr "リソース deployment ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚"
msgid "Kubernetes error: %{error_code}"
msgstr "Kubernetesエラー: %{error_code}"
-msgid "Kubernetes popover"
-msgstr "Kubernetes ãƒãƒƒãƒ—オーãƒãƒ¼"
-
msgid "LDAP"
msgstr "LDAP"
@@ -16849,6 +17389,9 @@ 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 ""
@@ -16868,6 +17411,9 @@ msgid "Last %d day"
msgid_plural "Last %d days"
msgstr[0] "éŽåŽ»%d日間"
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -16913,6 +17459,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr "姓"
@@ -16961,6 +17510,9 @@ msgstr "最終使用日: "
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -16994,6 +17546,9 @@ msgstr "GitLab ã‚’å­¦ã¶"
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr "%{link_start} ビルトインã®ãƒ†ãƒ³ãƒ—レートã«è²¢çŒ® %{link_end}ã™ã‚‹æ–¹æ³•ã‚’å­¦ã¶"
@@ -17045,9 +17600,6 @@ msgstr "グループレベルプロジェクトテンプレートã®è©³ç´°"
msgid "Learn more about signing commits"
msgstr "コミットã¸ã®ç½²åã®è©³ç´°"
-msgid "Learn more about the dependency list"
-msgstr "ä¾å­˜é–¢ä¿‚リストã®è©³ç´°ã«ã¤ã„ã¦"
-
msgid "Learn more in the"
msgstr "詳ã—ã見る:"
@@ -17057,6 +17609,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr "離れる"
@@ -17240,9 +17882,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr "ライセンスリストãŒå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æŽ¥ç¶šçŠ¶æ³ã‚’確èªã—ã¦å†è©¦è¡Œã—ã¦ãã ã•ã„。"
-msgid "Licenses|Learn more about license compliance"
-msgstr "ライセンスコンプライアンスã®è©³ç´°ã«ã¤ã„ã¦"
-
msgid "Licenses|License Compliance"
msgstr "ライセンスコンプライアンス"
@@ -17352,6 +17991,9 @@ msgstr "利用å¯èƒ½ãªãƒªãƒã‚¸ãƒˆãƒªã®ä¸€è¦§"
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17391,7 +18033,7 @@ msgstr "Fcuntionã®èª­ã¿è¾¼ã¿ãŒã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã
msgid "Loading issues"
msgstr "イシューã®ãƒ­ãƒ¼ãƒ‰"
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17751,6 +18393,9 @@ msgstr "最大アクセスレベル"
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17763,9 +18408,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17823,6 +18465,9 @@ 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 npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr "%{name} ã®ä¸Šé™(%{count})を超ãˆã¾ã—ãŸ"
@@ -18088,11 +18733,14 @@ msgid "Merge request %{iid} authored by %{authorName}"
msgstr "マージリクエスト %{iid} ㌠%{authorName}ã«ã‚ˆã£ã¦ä½œæˆã•ã‚Œã¾ã—ãŸ"
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
-msgstr ""
+msgstr "マージリクエスト %{mr_link} 㯠%{mr_author}ã«ã‚ˆã£ã¦ãƒ¬ãƒ“ューã•ã‚Œã¾ã—ãŸ"
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr "マージリクエスト承èª"
@@ -18174,9 +18822,6 @@ msgstr "%{selectStart} ã‹ã‚‰ %{selectEnd} ã¾ã§ %{end} ã®è¡Œã¸ã®ã‚³ãƒ¡ãƒ³ãƒ
msgid "MergeRequestDiffs|Select comment starting line"
msgstr "コメントã®é–‹å§‹è¡Œã‚’é¸æŠž"
-msgid "MergeRequests|Add a reply"
-msgstr "返信を追加"
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr "別ã®ã‚¹ã‚«ãƒƒã‚·ãƒ¥ãŒé€²è¡Œä¸­ã‹ã©ã†ã‹ã‚’確èªä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
@@ -18186,9 +18831,6 @@ msgstr "下書ãコメントã®ä¿å­˜ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr "スカッシュã«å¤±æ•—ã—ã¾ã—ãŸã€‚手動ã§è¡Œã†å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
-msgid "MergeRequests|Reply..."
-msgstr "返信..."
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr "æ–°ã—ã„イシューã§ã“ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã‚’解決ã™ã‚‹"
@@ -18237,6 +18879,9 @@ msgstr "コミット %{linkStart}%{commitDisplay}%{linkEnd} ã®å¤ã„変更ã§ã‚
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr "コミット %{linkStart}%{commitDisplay}%{linkEnd} ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã‚’開始ã—ã¾ã—ãŸ"
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -18256,7 +18901,7 @@ msgid "Merged"
msgstr "マージ済ã¿"
msgid "Merged MRs"
-msgstr ""
+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 "マージã—ãŸãƒ–ランãƒã¯å‰Šé™¤ä¸­ã§ã™ã€‚ã“ã‚Œã¯ãƒ–ランãƒã®æ•°ã«ã‚ˆã£ã¦ã¯æ™‚é–“ãŒã‹ã‹ã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚進æ—を確èªã™ã‚‹ã«ã¯ã€ãƒšãƒ¼ã‚¸ã‚’æ›´æ–°ã—ã¦ãã ã•ã„。"
@@ -18944,6 +19589,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr "%{default_branch} ã‹ã‚‰%{number_commits_distance} コミット以上異ãªã£ã¦ã„ã¾ã™ã€‚"
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr "スター数ã®å¤šã„é †"
@@ -18953,6 +19601,9 @@ msgstr "%{mounted_as} ã®ãƒžã‚¦ãƒ³ãƒˆãƒã‚¤ãƒ³ãƒˆãŒ%{model_class} 内ã«è¦‹ã¤ã
msgid "Move"
msgstr "移動"
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr "イシューを移動"
@@ -18971,6 +19622,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr "イシューを別ã®ãƒ—ロジェクトã«ç§»å‹•ã™ã‚‹"
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr "権é™ãŒä¸å分ãªãŸã‚ã€ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’移動ã§ãã¾ã›ã‚“。"
@@ -19177,6 +19831,12 @@ 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 ""
@@ -19195,12 +19855,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19433,6 +20087,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr "æ–°è¦ãƒ–ランãƒ"
@@ -19454,6 +20111,9 @@ msgstr "æ–°ã—ã„デプロイキー"
msgid "New directory"
msgstr "æ–°è¦ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª"
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr "æ–°ã—ã„環境"
@@ -19496,6 +20156,9 @@ msgstr "æ–°è¦ã‚¤ãƒ†ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãŒä½œæˆã•ã‚Œã¾ã—ãŸ"
msgid "New label"
msgstr "æ–°ã—ã„ラベル"
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr "æ–°è¦ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆ"
@@ -19601,6 +20264,9 @@ msgstr "アクティビティã¯ã‚ã‚Šã¾ã›ã‚“"
msgid "No application_settings found"
msgstr "application_settings ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr "èªè¨¼æ–¹æ³•ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。"
@@ -19622,9 +20288,15 @@ msgstr "é©ç”¨ã•ã‚ŒãŸãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã¨ä¸€è‡´ã™ã‚‹å­ã‚¨ãƒ”ックã¯ã‚ã‚Šã¾
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr "Gitaly サーãƒãƒ¼ã«æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ログを確èªã—ã¦ãã ã•ã„ï¼"
@@ -19652,6 +20324,9 @@ 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 "エンドãƒã‚¤ãƒ³ãƒˆãŒã‚ã‚Šã¾ã›ã‚“"
@@ -19688,6 +20363,9 @@ msgstr ""
msgid "No iteration"
msgstr "イテレーションãŒã‚ã‚Šã¾ã›ã‚“"
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr "表示ã™ã‚‹ã‚¤ãƒ†ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãŒã‚ã‚Šã¾ã›ã‚“"
@@ -19916,13 +20594,19 @@ msgstr "注: GitLab ã®ç®¡ç†è€…ã«%{github_integration_link} を設定ã—ã¦ã€
msgid "NoteForm|Note"
msgstr "メモ"
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr "本当ã«ã“ã®ã‚³ãƒ¡ãƒ³ãƒˆã®ä½œæˆã‚’キャンセルã—ã¾ã™ã‹ï¼Ÿ"
msgid "Notes|Collapse replies"
msgstr "返信を折りãŸãŸã‚€"
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -19937,6 +20621,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 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 ""
@@ -19952,9 +20639,6 @@ msgstr "åŒæœŸã™ã‚‹ã‚‚ã®ã¯ã‚ã‚Šã¾ã›ã‚“"
msgid "Notification events"
msgstr "イベント通知"
-msgid "Notification setting"
-msgstr "通知設定"
-
msgid "Notification setting - %{notification_title}"
msgstr "通知設定 - %{notification_title}"
@@ -19982,6 +20666,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr "マージリクエストをマージ"
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20036,9 +20723,6 @@ msgstr "å‚加"
msgid "NotificationLevel|Watch"
msgstr "ã™ã¹ã¦é€šçŸ¥"
-msgid "NotificationSetting|Custom"
-msgstr "カスタム"
-
msgid "Notifications"
msgstr "通知"
@@ -20150,6 +20834,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20171,6 +20861,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20204,9 +20897,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20382,8 +21081,8 @@ 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 "一ã¤ä»¥ä¸Šã®ãƒ‘ーソナルアクセストークン㌠%{days_to_expire} 日以内ã«å¤±åŠ¹ã—ã¾ã™"
+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 ""
@@ -20415,7 +21114,7 @@ msgstr "プロジェクトメンãƒãƒ¼ã®ã¿ã‚³ãƒ¡ãƒ³ãƒˆã§ãã¾ã™"
msgid "Only project members will be imported. Group members will be skipped."
msgstr "プロジェクトメンãƒãƒ¼ã®ã¿ãŒã‚¤ãƒ³ãƒãƒ¼ãƒˆã•ã‚Œã¾ã™ã€‚グループメンãƒãƒ¼ã¯ã‚¹ã‚­ãƒƒãƒ—ã•ã‚Œã¾ã™ã€‚"
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20430,6 +21129,12 @@ msgstr "ãã‚Œã¯ã€æœ¬å½“ã§ã™ã‹ï¼Ÿ"
msgid "Open"
msgstr "オープン"
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr "é¸æŠžæ¸ˆã¿ã®ã‚‚ã®ã‚’é–‹ã"
@@ -20442,12 +21147,12 @@ msgstr ""
msgid "Open errors"
msgstr "エラーを開ã"
-msgid "Open in Xcode"
-msgstr "Xcode ã§é–‹ã"
-
msgid "Open in file view"
msgstr ""
+msgid "Open in your IDE"
+msgstr ""
+
msgid "Open issues"
msgstr "イシューを開ã"
@@ -20514,6 +21219,9 @@ 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 "オプション"
@@ -20568,9 +21276,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20625,6 +21330,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20637,6 +21351,9 @@ msgstr "NuGet ソースを追加"
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20760,9 +21477,6 @@ msgstr "Maven コマンド"
msgid "PackageRegistry|Maven XML"
msgstr "Maven XML"
-msgid "PackageRegistry|NPM"
-msgstr "NPM"
-
msgid "PackageRegistry|NuGet"
msgstr "NuGet"
@@ -20781,6 +21495,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr "pip コマンド"
@@ -20799,6 +21516,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr "パッケージを削除"
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20838,6 +21561,9 @@ msgstr ""
msgid "PackageRegistry|You may also need to setup authentication using an auth token. %{linkStart}See the documentation%{linkEnd} to find out more."
msgstr "èªè¨¼ãƒˆãƒ¼ã‚¯ãƒ³ã‚’使用ã—ã¦èªè¨¼ã‚’設定ã™ã‚‹å¿…è¦ãŒã‚ã‚‹å ´åˆã‚‚ã‚ã‚Šã¾ã™ã€‚ %{linkStart}詳細ã«ã¤ã„ã¦ã¯ã€æ–‡æ›¸ %{linkEnd} ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+msgid "PackageRegistry|npm"
+msgstr ""
+
msgid "PackageRegistry|npm command"
msgstr ""
@@ -20859,15 +21585,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr "Maven"
-msgid "PackageType|NPM"
-msgstr "NPM"
-
msgid "PackageType|NuGet"
msgstr "NuGet"
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr "パッケージ"
@@ -20940,6 +21666,15 @@ msgstr "パラメーター"
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr "パラメーター \"job_id\"㯠%{job_id_max_size} 長を超ãˆã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“"
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr "親"
@@ -20997,11 +21732,11 @@ msgstr ""
msgid "Past due"
msgstr "期é™åˆ‡ã‚Œ"
-msgid "Paste a machine public key here. Read more about how to generate it"
-msgstr "マシンã®å…¬é–‹éµã‚’ã“ã“ã«è²¼ã‚Šä»˜ã‘ã¾ã™ã€‚生æˆæ–¹æ³•ã«ã¤ã„ã¦ã¯ã“ã¡ã‚‰ã‚’確èªã—ã¦ä¸‹ã•ã„。"
+msgid "Paste a public key here."
+msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
-msgstr "マシンã®å…¬é–‹éµã‚’ã“ã“ã«è²¼ã‚Šä»˜ã‘ã¾ã™ã€‚生æˆæ–¹æ³•ã«ã¤ã„ã¦ã¯%{link_start}ã“ã¡ã‚‰%{link_end}を確èªã—ã¦ä¸‹ã•ã„。"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
+msgstr ""
msgid "Paste confidential epic link"
msgstr "éžå…¬é–‹ã‚¨ãƒ”ックリンクを貼り付ã‘"
@@ -21096,6 +21831,9 @@ msgstr "Rugged呼ã³å‡ºã—"
msgid "PerformanceBar|SQL queries"
msgstr "SQLクエリ"
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr "トレース"
@@ -21147,9 +21885,6 @@ msgstr "パイプラインスケジュール"
msgid "Pipeline Schedules"
msgstr "パイプラインスケジュール"
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr "パイプラインクォータ(分)"
@@ -21171,10 +21906,10 @@ msgstr "パイプラインã®ãƒˆãƒªã‚¬ãƒ¼"
msgid "Pipeline: %{status}"
msgstr "パイプライン: %{status}"
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21249,15 +21984,6 @@ msgstr "パイプラインãƒãƒ£ãƒ¼ãƒˆ"
msgid "Pipelines emails"
msgstr "パイプラインメール"
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr "昨年ã®ãƒ‘イプライン"
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr "マージリクエストã®ãƒ‘イプラインãŒæ§‹æˆã•ã‚Œã¾ã—ãŸã€‚デタッãƒã•ã‚ŒãŸãƒ‘イプラインã¯ã€ãƒžãƒ¼ã‚¸çµæžœã«å¯¾ã—ã¦ã§ã¯ãªãã€ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã§å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚詳細ã«ã¤ã„ã¦ã¯ã€ãƒžãƒ¼ã‚¸çµæžœã®ãƒ‘イプラインã®æ–‡æ›¸ã‚’ã”覧ãã ã•ã„。"
@@ -21285,12 +22011,12 @@ msgstr "å­ãƒ‘イプライン"
msgid "Pipelines|Clear Runner Caches"
msgstr "Runner ã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’削除"
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
-msgstr "継続的インテグレーションã¯ã€ãƒ†ã‚¹ãƒˆã‚’自動的ã«å®Ÿè¡Œã™ã‚‹ã“ã¨ã§ãƒã‚°ã‚’検出ã—ã€ç¶™ç¶šçš„デプロイã¯æœ¬ç•ªç’°å¢ƒã«ã‚³ãƒ¼ãƒ‰ã‚’é…ç½®ã™ã‚‹ã®ã«å½¹ç«‹ã¡ã¾ã™ã€‚"
-
msgid "Pipelines|Copy trigger token"
msgstr ""
+msgid "Pipelines|Could not load merged YAML content"
+msgstr ""
+
msgid "Pipelines|Description"
msgstr "説明"
@@ -21303,9 +22029,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21330,6 +22053,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr "パイプラインを読ã¿è¾¼ã¿ä¸­"
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21366,9 +22092,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr "パイプラインã¯ç¾åœ¨ã‚ã‚Šã¾ã›ã‚“。"
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr "パイプラインをフェッãƒã™ã‚‹éš›ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ã„ãŸã ãã‹ã€ã‚µãƒãƒ¼ãƒˆãƒãƒ¼ãƒ ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。"
@@ -21402,6 +22125,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21414,12 +22140,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21459,6 +22194,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr "マージトレインパイプライン"
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr "マージçµæžœãƒ‘イプライン"
@@ -21471,6 +22209,12 @@ 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 ""
@@ -21528,6 +22272,9 @@ msgstr "値"
msgid "Pipeline|Variables"
msgstr "変数"
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr "%{pipelineId} パイプラインをåœæ­¢ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚"
@@ -21597,6 +22344,9 @@ 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 "é›»å­ãƒ¡ãƒ¼ãƒ«ï¼ˆ%{email})をãƒã‚§ãƒƒã‚¯ã—ã¦ã€ã“ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’所有ã—ã¦ã„ã‚‹ã“ã¨ã‚’確èªã—ã€CI/CDã®ãƒ­ãƒƒã‚¯ã‚’解除ã—ã¦ãã ã•ã„。電å­ãƒ¡ãƒ¼ãƒ«ã‚’å—ã‘å–ã£ã¦ã„ãªã„? %{resend_link} メールアドレスを間é•ã£ã¦ã„ã¾ã›ã‚“ã‹ï¼Ÿ %{update_link}"
+msgid "Please check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21720,12 +22470,18 @@ msgstr "メンãƒãƒ¼ã‚’é¸æŠžã—ã¦è¿½åŠ ã—ã¦ãã ã•ã„"
msgid "Please select at least one filter to see results"
msgstr "çµæžœã‚’表示ã™ã‚‹ã«ã¯ã€å°‘ãªãã¨ã‚‚1ã¤ã®ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã‚’é¸æŠžã—ã¦ãã ã•ã„"
+msgid "Please select what should be included in each exported requirement."
+msgstr ""
+
msgid "Please set a new password before proceeding."
msgstr "続ã‘ã‚‹å‰ã«æ–°ã—ã„パスワードを設定ã—ã¦ãã ã•ã„。"
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr "reCAPTCHA を解決ã—ã¦ãã ã•ã„"
@@ -21786,21 +22542,39 @@ msgstr "プロジェクトã®æ¦‚è¦ãƒšãƒ¼ã‚¸ã«è¡¨ç¤ºã—ãŸã„コンテンツを
msgid "Preferences|Choose what content you want to see on your homepage."
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 "時間を24時間形å¼ã§è¡¨ç¤ºã™ã‚‹"
+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 mins ago."
msgstr "例: 30分å‰"
+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 "レイアウトã®å¹…"
@@ -21822,6 +22596,12 @@ 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 "シンタックスãƒã‚¤ãƒ©ã‚¤ãƒˆã®ãƒ†ãƒ¼ãƒž"
@@ -21930,6 +22710,9 @@ 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 ""
@@ -22014,24 +22797,6 @@ msgstr "プロフィール"
msgid "Profile Settings"
msgstr "プロファイルã®è¨­å®š"
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr "オン"
@@ -22068,6 +22833,9 @@ msgstr "キーを追加"
msgid "Profiles|Add status emoji"
msgstr "ステータス絵文字を追加"
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr "ã‚¢ãƒã‚¿ãƒ¼ã‚¯ãƒ­ãƒƒãƒ‘ー"
@@ -22425,6 +23193,9 @@ msgstr "プロジェクトファイル"
msgid "Project ID"
msgstr "プロジェクトID"
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr "プロジェクト㮠URL"
@@ -22653,11 +23424,8 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr "ユーザーã«ã“ã®ãƒªãƒã‚¸ãƒˆãƒªã‚’コピーã—ã¦æ–°ã—ã„プロジェクトを作æˆã•ã›ã‚‹ã“ã¨ã‚’許å¯ã™ã‚‹"
-
-msgid "ProjectSettings|Allow users to request access"
-msgstr "ユーザーãŒã‚¢ã‚¯ã‚»ã‚¹ã‚’リクエストã§ãるよã†ã«ã™ã‚‹"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
+msgstr ""
msgid "ProjectSettings|Analytics"
msgstr ""
@@ -22668,8 +23436,8 @@ msgstr "期é™åˆ‡ã‚Œã«ãªã£ãŸã¨ãã«ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã®å·®åˆ†ãƒ‡ã‚£
msgid "ProjectSettings|Badges"
msgstr "ãƒãƒƒã‚¸"
-msgid "ProjectSettings|Build, test, and deploy your changes"
-msgstr "変更をビルドã€ãƒ†ã‚¹ãƒˆã€ãƒ‡ãƒ—ロイã™ã‚‹"
+msgid "ProjectSettings|Build, test, and deploy your changes."
+msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
msgstr ""
@@ -22683,6 +23451,12 @@ msgstr "マージã®æ–¹æ³•ã€ãƒžãƒ¼ã‚¸ã‚ªãƒ—ションã€ãƒžãƒ¼ã‚¸ãƒã‚§ãƒƒã‚¯ãŠ
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr "マージ方法ã€ãƒžãƒ¼ã‚¸ã‚ªãƒ—ションã€ãƒžãƒ¼ã‚¸ãƒã‚§ãƒƒã‚¯ãŠã‚ˆã³ãƒžãƒ¼ã‚¸æ案をé¸æŠžã—ã€ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®èª¬æ˜Žãƒ†ãƒ³ãƒ—レートを設定ã—ã¾ã™ã€‚"
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr "ã“ã®è¨­å®šã‚’変更ã™ã‚‹ã«ã¯ç®¡ç†è€…ã«é€£çµ¡ã—ã¦ãã ã•ã„。"
@@ -22710,17 +23484,14 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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 "ãã‚Œãžã‚Œã®ãƒ—ロジェクトã¯ã€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."
+msgstr ""
msgid "ProjectSettings|Everyone"
msgstr "全員"
@@ -22758,14 +23529,14 @@ msgstr "内部"
msgid "ProjectSettings|Issues"
msgstr "イシュー"
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
-msgstr "ã“ã®ãƒ—ロジェクトã®è»½é‡ã®ã‚¤ã‚·ãƒ¥ãƒ¼ãƒˆãƒ©ãƒƒã‚­ãƒ³ã‚°ã‚·ã‚¹ãƒ†ãƒ "
+msgid "ProjectSettings|Lightweight issue tracking system."
+msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
-msgstr "オーディオã€ãƒ“デオã€ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ãªã©ã®å¤§ããªãƒ•ã‚¡ã‚¤ãƒ«ã‚’管ç†ã—ã¾ã™"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
+msgstr ""
msgid "ProjectSettings|Merge checks"
msgstr "マージãƒã‚§ãƒƒã‚¯"
@@ -22800,14 +23571,17 @@ 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|Pages for project documentation."
+msgstr ""
msgid "ProjectSettings|Pipelines"
msgstr "パイプライン"
@@ -22833,17 +23607,26 @@ msgstr "リãƒã‚¸ãƒˆãƒª"
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
-msgstr "Gitリãƒã‚¸ãƒˆãƒªã‹ã‚‰ä»–ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¨ã‚³ãƒ¼ãƒ‰ãƒšãƒ¼ã‚¹ãƒˆã‚’共有ã™ã‚‹"
+msgid "ProjectSettings|Share code with others outside the project."
+msgstr ""
msgid "ProjectSettings|Show default award emojis"
msgstr "デフォルトã®çµµæ–‡å­—リアクションを表示"
@@ -22866,8 +23649,8 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
-msgstr "upstreamã«ãƒžãƒ¼ã‚¸ã™ã‚‹å¤‰æ›´ã‚’é€ä¿¡"
+msgid "ProjectSettings|Submit changes to be merged upstream."
+msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
msgstr "マージリクエストæ案ã«é©ç”¨ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã™ã‚‹ã‚³ãƒŸãƒƒãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸"
@@ -22890,30 +23673,36 @@ msgstr "ã“ã®è¨­å®šã¯ã‚µãƒ¼ãƒãƒ¼ãƒ¬ãƒ™ãƒ«ã§é©ç”¨ã•ã‚Œã¦ã„ã¾ã™ãŒã€ã“
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr "ã“ã®è¨­å®šã¯ã€ç®¡ç†è€…ãŒä¸Šæ›¸ãã—ãªã„å ´åˆã€ã™ã¹ã¦ã®ãƒ—ロジェクトã«é©ç”¨ã•ã‚Œã¾ã™ã€‚"
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr "ã“ã®è¨­å®šã¯ã€ã™ã¹ã¦ã®ãƒ—ロジェクトメンãƒãƒ¼ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼é€šçŸ¥è¨­å®šã‚’上書ãã—ã¾ã™ã€‚"
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr "マージリクエストをマージã™ã‚‹ã¨ãã«ã‚³ãƒŸãƒƒãƒˆå±¥æ­´ã‚’記録ã—ã¾ã™"
msgid "ProjectSettings|Transfer project"
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|View and edit files in this project"
-msgstr "ã“ã®ãƒ—ロジェクトã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示ãŠã‚ˆã³ç·¨é›†ã™ã‚‹"
+msgid "ProjectSettings|Users can request access"
+msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have 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|What are badges?"
msgstr ""
@@ -22923,19 +23712,10 @@ msgstr ""
msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr "競åˆãŒç™ºç”Ÿã—ãŸã¨ãã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ã¯ãƒªãƒ™ãƒ¼ã‚¹ã™ã‚‹ã‚ªãƒ—ションãŒä¸Žãˆã‚‰ã‚Œã¾ã™"
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
-msgstr ""
-
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
-msgstr "ã“ã®æ©Ÿèƒ½ã‚’有効ã«ã™ã‚‹ã¨ã€ã‚¤ã‚·ãƒ¥ãƒ¼ã€ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã€ãŠã‚ˆã³ã‚¹ãƒ‹ãƒšãƒƒãƒˆã«ã¯ã€è³›æˆã¨å対ã®çµµæ–‡å­—リアクションボタンãŒå¸¸ã«è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚"
-
msgid "ProjectSettings|Wiki"
msgstr "Wiki"
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
-msgstr "GitLab Pagesを使用ã™ã‚‹ã¨ã€GitLab 上ã«é™çš„ãªWebサイトをホストã§ãã¾ã™"
-
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23214,10 +23994,10 @@ msgstr "アクティブ"
msgid "PrometheusService|Auto configuration"
msgstr "自動設定"
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
-msgstr "プロジェクト環境を監視ã™ã‚‹ãŸã‚ã€ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¼ã« Prometheus を自動的ã«ãƒ‡ãƒ—ロイã—設定ã™ã‚‹"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
+msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23226,9 +24006,6 @@ msgstr "共通メトリクス"
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr "共通メトリクスã¯ã€ä¸€èˆ¬çš„ãªã‚¨ã‚¯ã‚¹ãƒãƒ¼ã‚¿ã‹ã‚‰ã®ãƒ¡ãƒˆãƒªã‚¯ã‚¹ã®ãƒ©ã‚¤ãƒ–ラリã«åŸºã¥ã„ã¦ã€è‡ªå‹•çš„ã«ç›£è¦–ã•ã‚Œã¾ã™ã€‚"
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr "カスタムメトリクス"
@@ -23244,6 +24021,15 @@ msgstr "メトリクスã®æ¤œç´¢ã¨è¨­å®š..."
msgid "PrometheusService|Finding custom metrics..."
msgstr "カスタムメトリクスを検索..."
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr "クラスター㫠Prometheus をインストール"
@@ -23259,6 +24045,12 @@ msgstr "メトリクス一覧"
msgid "PrometheusService|Missing environment variable"
msgstr "未設定ã®ç’°å¢ƒå¤‰æ•°"
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr "詳細情報"
@@ -23271,23 +24063,23 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr "カスタムメトリックã¯ä½œæˆã•ã‚Œã¦ã„ã¾ã›ã‚“。 上ã®ãƒœã‚¿ãƒ³ã‚’使用ã—ã¦ä½œæˆã—ã¦ãã ã•ã„"
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
-msgstr "Prometheus API ã®ãƒ™ãƒ¼ã‚¹ URLã€ä¾‹:http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
-msgstr "Prometheus ã¯ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¼ä¸Šã§è‡ªå‹•çš„ã«ç®¡ç†ã•ã‚Œã¦ã„ã¾ã™"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgstr ""
+
+msgid "PrometheusService|The Prometheus API base URL."
+msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+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|Time-series monitoring service"
-msgstr "時系列監視サービス"
-
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
-msgstr "クラスター㫠Prometheus をインストールã™ã‚‹ã«ã¯ã€ä»¥ä¸‹ã®æ‰‹å‹•è¨­å®šã‚’無効ã«ã—ã¦ãã ã•ã„"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
msgstr "共通メトリックãŒæ§‹ç¯‰ç’°å¢ƒã¸å±•é–‹ã•ã‚Œã‚‹ã®ã‚’å¾…ã£ã¦ã„ã¾ã™"
@@ -23295,6 +24087,12 @@ msgstr "共通メトリックãŒæ§‹ç¯‰ç’°å¢ƒã¸å±•é–‹ã•ã‚Œã‚‹ã®ã‚’å¾…ã£ã¦ã„
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr "%{operations_link_start}オペレーション%{operations_link_end} ページ㧠Prometheus ã®è¨­å®šã‚’管ç†ã§ãるよã†ã«ãªã‚Šã¾ã—ãŸã€‚ã“ã®ãƒšãƒ¼ã‚¸ã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã¯å»ƒæ­¢ã•ã‚Œã¾ã—ãŸã€‚"
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr "昇格"
@@ -23385,9 +24183,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr "プランをアップグレード"
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr "プランをアップグレードã—ã¦è²¢çŒ®åº¦åˆ†æžã‚’有効化ã™ã‚‹ã€‚"
@@ -23430,9 +24225,6 @@ msgstr "ä¿è­·ãƒ–ランãƒ"
msgid "Protected Environment"
msgstr "ä¿è­·ç’°å¢ƒ"
-msgid "Protected Environments"
-msgstr "ä¿è­·ç’°å¢ƒ"
-
msgid "Protected Paths"
msgstr "ä¿è­·æ¸ˆã¿ã®ãƒ‘ス"
@@ -23445,6 +24237,9 @@ msgstr "ä¿è­·ã‚¿ã‚°"
msgid "Protected branches"
msgstr "ä¿è­·ãƒ–ランãƒ"
+msgid "Protected environments"
+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 ""
@@ -23538,8 +24333,8 @@ msgstr "ã‚ãªãŸã®ç’°å¢ƒã¯ä¿è­·ã•ã‚Œã¦ã„ã¾ã™ã€‚"
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr "ã‚ãªãŸã®ç’°å¢ƒã¯ä¿è­·ã•ã‚Œã¦ã„ã¾ã›ã‚“。ã¾ãŸã¯ä¿è­·ãŒè§£é™¤ã•ã‚Œã¦ã„ã¾ã™ã€‚"
-msgid "Protip:"
-msgstr "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgstr ""
msgid "Protocol"
msgstr "プロトコル"
@@ -23634,8 +24429,50 @@ msgstr ""
msgid "Push to create a project"
msgstr "プッシュã—ã¦ãƒ—ロジェクトを作æˆã™ã‚‹"
-msgid "PushRule|Committer restriction"
-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 "プッシュ済ã¿"
@@ -23727,6 +24564,9 @@ msgstr "å†èªè¨¼æœŸé–“ãŒæº€äº†ã—ãŸã‹ã€ãƒªã‚¯ã‚¨ã‚¹ãƒˆã•ã‚Œã¾ã›ã‚“ã§ã—
msgid "Re-authentication required"
msgstr "å†èªè¨¼ãŒå¿…è¦ã§ã™"
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23763,6 +24603,9 @@ msgstr "手動ã§è¨­å®šã—ãŸPrometheusサーãƒãƒ¼ã‹ã‚‰ã‚¢ãƒ©ãƒ¼ãƒˆã‚’å—ã‘å
msgid "Receive notifications about your own activity"
msgstr "自身ã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ“ティーã«é–¢ã™ã‚‹é€šçŸ¥ã‚’å—ä¿¡ã™ã‚‹"
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr "最近"
@@ -23933,6 +24776,9 @@ msgstr "リリースノート:"
msgid "Release title"
msgstr "リリース タイトル"
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24038,6 +24884,9 @@ msgstr "説明履歴を削除"
msgid "Remove due date"
msgstr "期日を削除"
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr "フォークã®é–¢ä¿‚を削除"
@@ -24104,6 +24953,9 @@ msgstr "ステージã®å‰Šé™¤"
msgid "Remove time estimate"
msgstr "見ç©æ™‚間を削除"
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24272,8 +25124,8 @@ msgstr "コメントã«è¿”ä¿¡"
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr "ã“ã®ãƒ¡ãƒ¼ãƒ«ã«ç›´æŽ¥è¿”ä¿¡ã™ã‚‹ã‹ã€ %{view_it_on_gitlab} ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
-msgid "Reply..."
-msgstr "返答..."
+msgid "Reply…"
+msgstr ""
msgid "Repo by URL"
msgstr "リãƒã‚¸ãƒˆãƒª URL"
@@ -24322,12 +25174,15 @@ msgstr "アクセシビリティスキャンã®çµæžœã‚’パースã—ã¦ã„ã¾ã™
msgid "Reports|Actions"
msgstr "アクション"
-msgid "Reports|An error occured while loading report"
-msgstr "レãƒãƒ¼ãƒˆã®èª­ã¿è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+msgid "Reports|Activity"
+msgstr ""
msgid "Reports|An error occurred while loading %{name} results"
msgstr "%{name} ã®çµæžœã‚’読ã¿è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+msgid "Reports|An error occurred while loading report"
+msgstr ""
+
msgid "Reports|Class"
msgstr "クラス"
@@ -24399,6 +25254,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24426,6 +25287,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24522,6 +25389,9 @@ msgstr "アクセス権é™ã‚’リクエストã™ã‚‹"
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr "必須パラメーター %{param} ãŒã‚ã‚Šã¾ã›ã‚“。"
@@ -24540,6 +25410,9 @@ msgstr "%{time_ago} ã«ãƒªã‚¯ã‚¨ã‚¹ãƒˆ"
msgid "Requested design version does not exist."
msgstr "è¦æ±‚ã•ã‚ŒãŸãƒ‡ã‚¶ã‚¤ãƒ³ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã‚ã‚Šã¾ã›ã‚“。"
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr "リクエストã•ã‚ŒãŸçŠ¶æ…‹ã¯ç„¡åŠ¹ã§ã™"
@@ -24650,9 +25523,6 @@ msgstr "テンプレートã®ãƒªã‚»ãƒƒãƒˆ"
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr "ã“ã®ãƒ—ロジェクトã®èªè¨¼ã‚­ãƒ¼ã‚’リセットã™ã‚‹ã«ã¯ã€æœ‰åŠ¹ã«ãªã£ã¦ã„ã‚‹ã™ã¹ã¦ã®ã‚¢ãƒ©ãƒ¼ãƒˆã‚½ãƒ¼ã‚¹ã§èªè¨¼ã‚­ãƒ¼ã‚’æ›´æ–°ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr "èªè¨¼ã‚­ãƒ¼ã‚’リセットã™ã‚‹ã¨ã€ä»Šã¾ã§ã®ã‚­ãƒ¼ã¯ç„¡åŠ¹ã«ãªã‚Šã¾ã™ã€‚既存ã®ã‚¢ãƒ©ãƒ¼ãƒˆè¨­å®šã¯æ–°ã—ã„キーã§æ›´æ–°ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
@@ -24743,6 +25613,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -24823,11 +25696,11 @@ msgid "Review time is defined as the time it takes from first comment until merg
msgstr "レビュー時間ã¯æœ€åˆã®ã‚³ãƒ¡ãƒ³ãƒˆã‹ã‚‰ãƒžãƒ¼ã‚¸ã•ã‚Œã‚‹ã¾ã§ã®æ™‚間を表ã—ã¾ã™ã€‚"
msgid "ReviewApp|Enable Review App"
-msgstr ""
+msgstr "Review Appを有効ã«ã™ã‚‹"
msgid "Reviewer"
msgid_plural "%d Reviewers"
-msgstr[0] "%d 人ã®ãƒ¬ãƒ“ュー"
+msgstr[0] ""
msgid "Reviewer(s)"
msgstr ""
@@ -25117,7 +25990,7 @@ msgstr ""
msgid "Save Changes"
msgstr "変更をä¿å­˜"
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25189,6 +26062,9 @@ msgstr "ç¾åœ¨ã®ã‚¤ãƒ†ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã§çµžã‚Šè¾¼ã‚“ã ãƒœãƒ¼ãƒ‰"
msgid "Scopes"
msgstr "スコープ"
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25276,6 +26152,9 @@ msgstr "ã“ã®ãƒ†ã‚­ã‚¹ãƒˆã‚’検索"
msgid "Search forks"
msgstr "フォークを検索ã™ã‚‹"
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr "マージリクエストを検索"
@@ -25437,7 +26316,7 @@ msgstr "秘密"
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25482,12 +26361,18 @@ msgstr "マージリクエストã®ä½œæˆä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr "オンデマンドDASTã§åˆ©ç”¨å¯èƒ½"
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr "設定"
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr "設定データをå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ページを更新ã™ã‚‹ã‹ã€ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。"
@@ -25500,9 +26385,6 @@ msgstr "ã‚ãªãŸã®è¦ä»¶ã«åˆã‚ã›ã¦ä¸€èˆ¬çš„㪠SAST 設定をカスタマ
msgid "SecurityConfiguration|Enable"
msgstr "有効ã«ã™ã‚‹"
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr "マージリクエストã§æœ‰åŠ¹ã«ã™ã‚‹"
-
msgid "SecurityConfiguration|Enabled"
msgstr "有効"
@@ -25527,6 +26409,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr "SAST 設定"
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25563,6 +26448,12 @@ msgstr "プロジェクトを追加"
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr "'%{vulnerabilityName}' ã«è¿½åŠ ã•ã‚ŒãŸã‚³ãƒ¡ãƒ³ãƒˆ"
@@ -25572,12 +26463,12 @@ msgstr "'%{vulnerabilityName}' ã‹ã‚‰å‰Šé™¤ã•ã‚ŒãŸã‚³ãƒ¡ãƒ³ãƒˆ"
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr "'%{vulnerabilityName}' ã®ç·¨é›†ã•ã‚ŒãŸã‚³ãƒ¡ãƒ³ãƒˆ"
+msgid "SecurityReports|Create Jira issue"
+msgstr ""
+
msgid "SecurityReports|Create issue"
msgstr "イシューを作æˆã™ã‚‹"
-msgid "SecurityReports|Dismiss Selected"
-msgstr ""
-
msgid "SecurityReports|Dismiss vulnerability"
msgstr "脆弱性をéžè¡¨ç¤ºã«ã™ã‚‹"
@@ -25596,6 +26487,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25611,9 +26505,6 @@ msgstr "脆弱性一覧ã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ãƒãƒƒãƒˆ
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25641,6 +26532,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25683,19 +26580,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25719,10 +26616,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] "%d 件ã®è„†å¼±æ€§ã‚’éžè¡¨ç¤ºã«ã™ã‚‹éš›ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25765,7 +26658,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25774,8 +26667,8 @@ msgstr "ã“ã®ãƒ¬ãƒãƒ¼ãƒˆã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“"
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr "ã“ã®ãƒ¬ãƒãƒ¼ãƒˆã‚’表示ã™ã‚‹ã«ã¯ã€æ‰¿èªã•ã‚ŒãŸãƒ¦ãƒ¼ã‚¶ãƒ¼ã¨ã—ã¦ã‚µã‚¤ãƒ³ã‚¤ãƒ³ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。"
-msgid "SecurityReports|[No reason]"
-msgstr "[ç†ç”±ãªã—]"
+msgid "Security|Policies"
+msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
msgstr "GitLabã®%{password_policy_guidelines} ã‚’å‚ç…§"
@@ -25861,9 +26754,6 @@ msgstr "担当者をé¸æŠž"
msgid "Select branch"
msgstr "ブランãƒã®é¸æŠž"
-msgid "Select branch/tag"
-msgstr "ブランãƒãƒ»ã‚¿ã‚°é¸æŠž"
-
msgid "Select due date"
msgstr ""
@@ -25912,7 +26802,7 @@ msgstr "プロジェクトをé¸æŠžã—ã¦ã‚¾ãƒ¼ãƒ³ã‚’é¸æŠž"
msgid "Select projects"
msgstr "プロジェクトã®é¸æŠž"
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -25954,12 +26844,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26002,8 +26898,8 @@ msgstr "自己監視プロジェクトãŒæ­£å¸¸ã«ä½œæˆã•ã‚Œã¾ã—ãŸ."
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr "自己監視プロジェクトãŒæ­£å¸¸ã«å‰Šé™¤ã•ã‚Œã¾ã—ãŸ."
-msgid "Send a separate email notification to Developers."
-msgstr "開発者毎ã«ãƒ¡ãƒ¼ãƒ«é€šçŸ¥ã‚’é€ä¿¡ã™ã‚‹"
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
+msgstr ""
msgid "Send confirmation email"
msgstr "確èªãƒ¡ãƒ¼ãƒ«ã®é€ä¿¡"
@@ -26179,6 +27075,9 @@ msgstr "%{protocol} プロコトル経由ã§ãƒ—ルã€ãƒ—ッシュã™ã‚‹ãŸã‚ã«
msgid "Set a template repository for projects in this group"
msgstr "ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒ—ロジェクトã®ã€ãƒ†ãƒ³ãƒ—レートリãƒã‚¸ãƒˆãƒªã‚’設定ã™ã‚‹"
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26371,6 +27270,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26525,7 +27427,7 @@ msgid "Showing %d event"
msgid_plural "Showing %d events"
msgstr[0] "%d ã®ã‚¤ãƒ™ãƒ³ãƒˆã‚’表示中"
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26814,9 +27716,6 @@ msgstr "エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã—ã°ã‚‰ã経ã£ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦
msgid "Something went wrong on our end. Please try again."
msgstr "エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã—ã°ã‚‰ã経ã£ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ã¿ã¦ãã ã•ã„。"
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr "イシューã®å…¬é–‹ç¯„囲ã®å¤‰æ›´ä¸­ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸ"
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr "%{issuableDisplayName} をロック状態ã«ã™ã‚‹ã®ã«å¤±æ•—ã—ã¾ã—ãŸ"
@@ -26943,6 +27842,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr "ã“ã®æ¤œè¨Žã‚’解決ã—ã¦ã„ã‚‹ã¨ãã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr "ã“ã®ç’°å¢ƒã®åœæ­¢ä¸­ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
@@ -27126,9 +28028,6 @@ msgstr "最近ã®ã‚µã‚¤ãƒ³ã‚¤ãƒ³é †"
msgid "SortOptions|Recently starred"
msgstr "ãŠæ°—ã«ã„ã‚Šã§æ–°ã—ã„é †"
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr "サイズ"
@@ -27318,12 +28217,15 @@ msgstr "ã“ã®å¤‰æ›´ã§ %{new_merge_request} を作æˆã™ã‚‹"
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
-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 "レビューã®é–‹å§‹"
@@ -27478,19 +28380,19 @@ msgid "Status: %{title}"
msgstr ""
msgid "StatusPage|AWS Secret access key"
-msgstr ""
+msgstr "AWSシークレットアクセスキー"
msgid "StatusPage|AWS access key ID"
-msgstr ""
+msgstr "AWSアクセスキーID"
msgid "StatusPage|AWS documentation"
-msgstr ""
+msgstr "AWSドキュメント"
msgid "StatusPage|AWS region"
-msgstr ""
+msgstr "AWSリージョン"
msgid "StatusPage|Active"
-msgstr ""
+msgstr "アクティブ"
msgid "StatusPage|Bucket %{docsLink}"
msgstr ""
@@ -27508,7 +28410,7 @@ msgid "StatusPage|Status page"
msgstr ""
msgid "StatusPage|Status page URL"
-msgstr ""
+msgstr "ステータスページã®URL"
msgid "StatusPage|Status page frontend documentation"
msgstr ""
@@ -27828,68 +28730,68 @@ msgstr "変更ã®æ案"
msgid "Suggested solutions help link"
msgstr "推奨ソリューションã®ãƒ˜ãƒ«ãƒ—リンク"
-msgid "SuggestedColors|Bright green"
-msgstr "ブライトグリーン"
+msgid "SuggestedColors|Aztec Gold"
+msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
-msgstr "ç°é’ç·‘"
+msgid "SuggestedColors|Blue"
+msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
-msgstr "æš—è—色"
+msgid "SuggestedColors|Blue-gray"
+msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
-msgstr "薄茶色"
+msgid "SuggestedColors|Carrot orange"
+msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
-msgstr "暗赤紫"
+msgid "SuggestedColors|Champagne"
+msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
-msgstr "藤色"
+msgid "SuggestedColors|Charcoal grey"
+msgstr ""
-msgid "SuggestedColors|Feijoa"
-msgstr "明黄緑"
+msgid "SuggestedColors|Crimson"
+msgstr ""
-msgid "SuggestedColors|Lime green"
-msgstr "ライムグリーン"
+msgid "SuggestedColors|Dark coral"
+msgstr ""
-msgid "SuggestedColors|Moderate blue"
-msgstr "è—色"
+msgid "SuggestedColors|Dark green"
+msgstr ""
-msgid "SuggestedColors|Pure red"
-msgstr "紅色"
+msgid "SuggestedColors|Dark sea green"
+msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
-msgstr "ç°è—色"
+msgid "SuggestedColors|Dark violet"
+msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
-msgstr "ç°ç·‘色"
+msgid "SuggestedColors|Deep violet"
+msgstr ""
-msgid "SuggestedColors|Soft orange"
-msgstr "薄橙色"
+msgid "SuggestedColors|Gray"
+msgstr ""
-msgid "SuggestedColors|Soft red"
-msgstr "薄紅色"
+msgid "SuggestedColors|Green screen"
+msgstr ""
-msgid "SuggestedColors|Strong pink"
-msgstr "赤紫色"
+msgid "SuggestedColors|Green-cyan"
+msgstr ""
-msgid "SuggestedColors|Strong red"
-msgstr "赤"
+msgid "SuggestedColors|Lavendar"
+msgstr ""
-msgid "SuggestedColors|Strong yellow"
-msgstr "黄色"
+msgid "SuggestedColors|Magenta-pink"
+msgstr ""
-msgid "SuggestedColors|UA blue"
-msgstr "明é’色"
+msgid "SuggestedColors|Medium sea green"
+msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
-msgstr "æš—è—色"
+msgid "SuggestedColors|Red"
+msgstr ""
-msgid "SuggestedColors|Very dark lime green"
-msgstr "暗黄緑色"
+msgid "SuggestedColors|Rose red"
+msgstr ""
-msgid "SuggestedColors|Very pale orange"
-msgstr "æ·¡æ©™"
+msgid "SuggestedColors|Titanium yellow"
+msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
msgstr ""
@@ -27975,6 +28877,12 @@ 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})"
@@ -27984,7 +28892,7 @@ msgstr "システムヘッダーã¨ãƒ•ãƒƒã‚¿ãƒ¼"
msgid "System hook was successfully updated."
msgstr "システムフックã¯æ­£å¸¸ã«æ›´æ–°ã•ã‚Œã¾ã—ãŸã€‚"
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28179,6 +29087,9 @@ msgstr "利用è¦ç´„ã¨ãƒ—ライãƒã‚·ãƒ¼ãƒãƒªã‚·ãƒ¼"
msgid "Terraform"
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] ""
@@ -28238,6 +29149,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28250,6 +29164,9 @@ 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 ""
@@ -28271,6 +29188,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28317,9 +29237,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28808,6 +29725,9 @@ msgstr "ステージングステージã§ã¯ã€ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒãƒžãƒ¼
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -28892,6 +29812,9 @@ 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 "クローズã•ã‚ŒãŸã‚¤ã‚·ãƒ¥ãƒ¼ã¯ã‚ã‚Šã¾ã›ã‚“"
@@ -28910,12 +29833,18 @@ msgstr "表示ã™ã‚‹ã‚¤ã‚·ãƒ¥ãƒ¼ãŒã‚ã‚Šã¾ã›ã‚“"
msgid "There are no issues to show."
msgstr "表示ã™ã‚‹ã‚¤ã‚·ãƒ¥ãƒ¼ãŒã‚ã‚Šã¾ã›ã‚“."
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr "ã¾ã ãƒ©ãƒ™ãƒ«ãŒã‚ã‚Šã¾ã›ã‚“"
msgid "There are no matching files"
msgstr "一致ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ãŒã‚ã‚Šã¾ã›ã‚“。"
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr "オープン中ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã¯ã‚ã‚Šã¾ã›ã‚“"
@@ -28946,12 +29875,12 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
-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 ""
@@ -28991,7 +29920,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29006,7 +29935,7 @@ msgstr "ã‚ãªãŸã®ã‚«ã‚¹ã‚¿ãƒ ã‚¹ãƒ†ãƒ¼ã‚¸ã‚’ä¿å­˜ã™ã‚‹éš›ã«ã‚¨ãƒ©ãƒ¼ãŒç™º
msgid "There was a problem sending the confirmation email"
msgstr "確èªãƒ¡ãƒ¼ãƒ«ã®é€ä¿¡ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29048,6 +29977,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29078,6 +30010,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr "ユーザーã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ“ティカレンダーã®èª­ã¿è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
@@ -29105,9 +30040,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr "ã‚ãªãŸã®å¤‰æ›´ã®ä¿å­˜ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
-msgid "There was an error saving your notification settings."
-msgstr "通知設定をä¿å­˜ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
-
msgid "There was an error subscribing to this label."
msgstr "ラベルã®è³¼èª­ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
@@ -29120,6 +30052,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr "クエリを検証ã™ã‚‹é–“ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29183,6 +30118,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29225,18 +30163,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr "ã“ã® URL ã¯åˆ¥ã®ãƒªãƒ³ã‚¯ã§æ—¢ã«ä½¿ç”¨ã—ã¦ã„ã¾ã™ã€‚é‡è¤‡ã—㟠URL ã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“"
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr "ã“ã®å‹•ä½œã«ã‚ˆã£ã¦ãƒ‡ãƒ¼ã‚¿ãŒå¤±ã‚れるå¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚çªç™ºçš„ãªäº‹æ…‹ã‚’防ããŸã‚ã«ã€ä¸€åº¦æ“作ã®æ„図を確èªã—ã¦ãã ã•ã„。ãŠé¡˜ã„ã—ã¾ã™ã€‚"
@@ -29408,6 +30334,9 @@ msgstr "ã“ã‚Œã¯ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«ãƒ­ã‚°ã‚¤ãƒ³ã—ãŸãƒ‡ãƒã‚¤ã‚¹ã®
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr "ã“ã‚Œã¯ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«é–¢ã‚ã‚‹é‡è¦ãªã‚¤ãƒ™ãƒ³ãƒˆã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒ­ã‚°ã§ã™ã€‚"
@@ -29705,6 +30634,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr "è„…å¨ç›£è¦–"
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29738,6 +30670,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr "環境"
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30064,6 +30999,9 @@ msgstr "ヒント:"
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr "タイトル"
@@ -30214,12 +31152,12 @@ 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 widen your search, change or remove filters."
msgstr "検索範囲を広ã’ã‚‹ã«ã¯ã€ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã‚’変更ã¾ãŸã¯å‰Šé™¤ã—ã¾ã™ã€‚"
-msgid "To-Do"
-msgstr "To Do"
-
msgid "To-Do List"
msgstr "To-Do リスト"
@@ -30280,12 +31218,6 @@ msgstr "ダイアログを切り替ãˆ"
msgid "Toggle thread"
msgstr "スレッドã®åˆ‡ã‚Šæ›¿ãˆ"
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr "切り替ãˆçŠ¶æ…‹:オフ"
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr "切り替ãˆçŠ¶æ…‹:オン"
-
msgid "Toggled :%{name}: emoji award."
msgstr ":%{name}: 絵文字リアクションをトグル。"
@@ -30310,9 +31242,6 @@ msgstr "有効ã«ãªã£ã¦ã„ã‚‹åå‰ç©ºé–“ãŒå¤šã™ãŽã¾ã™ã€‚コンソール
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr "有効ã«ãªã£ã¦ã„るプロジェクトãŒå¤šã™ãŽã¾ã™ã€‚コンソールã¾ãŸã¯APIを使用ã—ã¦ç®¡ç†ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30439,20 +31368,26 @@ msgstr "ツリービュー"
msgid "Trending"
msgstr "トレンド分æž"
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30461,13 +31396,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30554,6 +31486,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr "トレーシングã§ã‚¢ãƒ—リケーションをトラブルシューティングãŠã‚ˆã³ç›£è¦–ã™ã‚‹"
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr "å†è©¦è¡Œ"
@@ -30566,6 +31501,9 @@ msgstr "30日間ã§GitLabãŒæä¾›ã™ã‚‹ã™ã¹ã¦ã®æ©Ÿèƒ½ã‚’試ã—ã¦ã¿ã¦ãã
msgid "Try changing or removing filters."
msgstr "フィルターを変更ã—ã¦ã¿ã¦ãã ã•ã„。ã¾ãŸã¯å‰Šé™¤ã—ã¦ã¿ã¦ãã ã•ã„。"
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr "ã‚‚ã†ä¸€åº¦ãƒ•ã‚©ãƒ¼ã‚¯ã™ã‚‹"
@@ -30587,11 +31525,11 @@ msgstr "ç«æ›œæ—¥"
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
-msgstr "無効"
+msgid "Turn off"
+msgstr ""
-msgid "Turn On"
-msgstr "有効"
+msgid "Turn on"
+msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
msgstr ""
@@ -30656,6 +31594,21 @@ msgstr "URL"
msgid "URL is required"
msgstr "URLãŒå¿…è¦ã§ã™ã€‚"
+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 neccessary."
+msgstr ""
+
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} ã®ã„ãšã‚Œã‹ã§é–‹å§‹ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™"
@@ -30788,6 +31741,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr "残念ãªãŒã‚‰ã€GitLab ã¸ã®ãƒ¡ãƒ¼ãƒ«å‡¦ç†ã¯ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"
@@ -30959,9 +31915,6 @@ msgstr ""
msgid "Update failed"
msgstr "更新失敗"
-msgid "Update failed. Please try again."
-msgstr "æ›´æ–°ã«å¤±æ•—ã—ã¾ã—ãŸã€‚後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„"
-
msgid "Update it"
msgstr "æ›´æ–°!"
@@ -31139,6 +32092,12 @@ msgstr "LFSオブジェクト"
msgid "UsageQuota|LFS Storage"
msgstr "LFSストレージ"
+msgid "UsageQuota|Learn more about excess storage usage"
+msgstr ""
+
+msgid "UsageQuota|Learn more about usage quotas"
+msgstr ""
+
msgid "UsageQuota|Packages"
msgstr "パッケージ"
@@ -31241,6 +32200,96 @@ 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 "%{link_start} スコープã®ãƒ©ãƒ™ãƒ«ã‚»ãƒƒãƒˆ%{link_end} を作æˆã™ã‚‹ã«ã¯ã€ %{code_start}::%{code_end} を使用ã—ã¾ã™ï¼ˆä¾‹ï¼š %{code_start}priority::1%{code_end})。"
@@ -31250,8 +32299,8 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr "サービスデスクを使用ã—ã¦ã€GitLab 内ã®ãƒ¡ãƒ¼ãƒ«ã§ãƒ¦ãƒ¼ã‚¶ã¨æŽ¥ç¶šï¼ˆä¾‹ï¼šé¡§å®¢ã‚µãƒãƒ¼ãƒˆï¼‰"
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
-msgstr "モãƒã‚¤ãƒ«ãƒ‡ãƒã‚¤ã‚¹ã¾ãŸã¯ã‚³ãƒ³ãƒ”ュータã§ãƒ¯ãƒ³ã‚¿ã‚¤ãƒ ãƒ‘スワードèªè¨¼ã‚’使用ã—ã¦ã€2è¦ç´ èªè¨¼ã‚’有効ã«ã—ã¾ã™ã€‚"
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgstr ""
msgid "Use cURL"
msgstr ""
@@ -31271,7 +32320,7 @@ msgstr "URI ã”ã¨ã«1行使用"
msgid "Use template"
msgstr "テンプレートを使用"
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31442,6 +32491,12 @@ 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 "グループ"
@@ -31484,6 +32539,9 @@ 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 "ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯å€‹äººãƒ—ロジェクトをæŒã£ã¦ã„ã¾ã›ã‚“。"
@@ -31499,6 +32557,9 @@ msgstr "ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ã©ã®ãƒ—ロジェクトもãŠæ°—ã«ã„ã‚Šã«ã—ã¦
msgid "UserProfile|This user is blocked"
msgstr "ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ãƒ–ロックã•ã‚Œã¦ã„ã¾ã™"
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31508,9 +32569,15 @@ 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 "個人的ãªãƒ—ロジェクトを作æˆã—ã¦ã„ã¾ã›ã‚“。"
@@ -31583,6 +32650,9 @@ msgstr "未割り当ã¦"
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr "%{code_start}::%{code_end} を使ã£ã¦ã€ %{link_start} ラベルセットã®ç¯„囲%{link_end} を示ã™"
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr "æš—å·åŒ–フィールドãŒãªã„å ´åˆã€å¿…è¦ãªæš—å·åŒ–戦略を使用ã™ã‚‹!"
@@ -31700,6 +32770,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr "ã™ã¹ã¦ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’表示"
@@ -31741,9 +32814,6 @@ msgstr "ファイルを表示 @ "
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr "ダッシュボードã®ãƒ•ãƒ«è¡¨ç¤º"
@@ -31861,6 +32931,9 @@ msgstr "ä¸æ˜Ž"
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr "%{stepStart}ステップ1%{stepEnd} 次ã®ã‚¹ã‚¯ãƒªãƒ—トをコピーã—ã¾ã™:"
@@ -31871,10 +32944,10 @@ msgid "VisualReviewApp|%{stepStart}Step 3%{stepEnd}. If not previously %{linkSta
msgstr "%{stepStart}ステップ3%{stepEnd}。以å‰ã«é–‹ç™ºè€…ã«ã‚ˆã£ã¦ %{linkStart} æ§‹æˆ %{linkEnd} ã•ã‚Œã¦ã„ãªã‹ã£ãŸå ´åˆã€ã“ã®ãƒ¬ãƒ“ューã®ãŸã‚ã«ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆIDを入力ã—ã¾ã™ã€‚ã“ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆID㯠%{stepStart}%{mrId}%{stepStart}ã§ã™ã€‚"
msgid "VisualReviewApp|%{stepStart}Step 4%{stepEnd}. Leave feedback in the Review App."
-msgstr "%{stepStart} ステップ4%{stepEnd} 。レビューアプリã§ãƒ•ã‚£ãƒ¼ãƒ‰ãƒãƒƒã‚¯ã‚’残ã—ã¾ã™ã€‚"
+msgstr "%{stepStart} ステップ4%{stepEnd} 。Review Appã§ãƒ•ã‚£ãƒ¼ãƒ‰ãƒãƒƒã‚¯ã‚’残ã—ã¾ã™ã€‚"
msgid "VisualReviewApp|Cancel"
-msgstr ""
+msgstr "キャンセル"
msgid "VisualReviewApp|Copy merge request ID"
msgstr "マージリクエストIDã®ã‚³ãƒ”ー"
@@ -31889,16 +32962,16 @@ msgid "VisualReviewApp|Follow the steps below to enable Visual Reviews inside yo
msgstr "以下ã®æ‰‹é †ã«å¾“ã£ã¦ã€ã‚¢ãƒ—リケーション内ã§ãƒ“ジュアルレビューを有効ã«ã—ã¾ã™ã€‚"
msgid "VisualReviewApp|No review app found or available."
-msgstr ""
+msgstr "Review AppãŒè¦‹ã¤ã‹ã‚‰ãªã„ã‹ã€åˆ©ç”¨ã§ãã¾ã›ã‚“。"
msgid "VisualReviewApp|Open review app"
-msgstr "レビューアプリを開ã"
+msgstr "Review Appã‚’é–‹ã"
msgid "VisualReviewApp|Review"
msgstr "レビュー"
msgid "VisualReviewApp|Steps 1 and 2 (and sometimes 3) are performed once by the developer before requesting feedback. Steps 3 (if necessary), 4 is performed by the reviewer each time they perform a review."
-msgstr ""
+msgstr "ステップ1 ã¨ã‚¹ãƒ†ãƒƒãƒ—2(ステップ3ã‚‚å«ã‚ã‚‹ã“ã¨ãŒã‚ã‚‹) ã¯ã€ãƒ•ã‚£ãƒ¼ãƒ‰ãƒãƒƒã‚¯ã‚’è¦æ±‚ã™ã‚‹å‰ã«é–‹ç™ºè€…ã«ã‚ˆã£ã¦1回実行ã•ã‚Œã¾ã™ã€‚レビューアãŒãƒ¬ãƒ“ューを実行ã™ã‚‹ãŸã³ã«ã€ã‚¹ãƒ†ãƒƒãƒ—3 (å¿…è¦ãªå ´åˆ) ã¨ã‚¹ãƒ†ãƒƒãƒ—4ã€ãã‚Œã«ã‚¹ãƒ†ãƒƒãƒ—をレビューアãŒå®Ÿè¡Œã—ã¾ã™ã€‚"
msgid "Vulnerabilities"
msgstr "脆弱性"
@@ -31927,6 +33000,9 @@ msgstr "%{formattedStartDate} ã‹ã‚‰ä»Šæ—¥ã¾ã§"
msgid "VulnerabilityChart|Severity"
msgstr "é‡è¦åº¦"
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -31948,15 +33024,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32155,6 +33243,12 @@ msgstr "次ã®ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚Šã¾ã—ãŸã€‚:"
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32176,6 +33270,9 @@ 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've found no vulnerabilities"
msgstr "脆弱性ã¯ç™ºè¦‹ã•ã‚Œã¾ã›ã‚“ã§ã—ãŸ"
@@ -32233,11 +33330,11 @@ msgstr "Webhook ã¯è¨­å®šãƒ¡ãƒ‹ãƒ¥ãƒ¼ã«ç§»å‹•ã—ã¾ã—ãŸã€‚"
msgid "Webhooks|Comments"
msgstr "コメント"
-msgid "Webhooks|Confidential Comments"
-msgstr "機密コメント"
+msgid "Webhooks|Confidential comments"
+msgstr ""
-msgid "Webhooks|Confidential Issues events"
-msgstr "éžå…¬é–‹ã‚¤ã‚·ãƒ¥ãƒ¼ã‚¤ãƒ™ãƒ³ãƒˆ"
+msgid "Webhooks|Confidential issues events"
+msgstr ""
msgid "Webhooks|Deployment events"
msgstr "デプロイイベント"
@@ -32245,7 +33342,7 @@ msgstr "デプロイイベント"
msgid "Webhooks|Enable SSL verification"
msgstr "SSL証明書検証ã®æœ‰åŠ¹åŒ–"
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32272,64 +33369,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr "SSL検証"
-msgid "Webhooks|Secret Token"
-msgstr "秘密トークン"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
+msgstr ""
msgid "Webhooks|Tag push events"
msgstr "タグプッシュイベント"
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
+msgstr "トリガー"
+
+msgid "Webhooks|URL"
+msgstr "URL"
+
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
-msgstr "ã“ã® URL ã¯ã€éžå…¬é–‹ã®ã‚¤ã‚·ãƒ¥ãƒ¼ãŒä½œæˆã€æ›´æ–°ã¾ãŸã¯ã‚¯ãƒ­ãƒ¼ã‚ºã•ã‚ŒãŸã¨ãã«ãƒˆãƒªã‚¬ãƒ¼ã•ã‚Œã¾ã™"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
+msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
-msgstr "ã“ã® URL ã¯ã€éžå…¬é–‹ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã¸èª°ã‹ãŒã‚³ãƒ¡ãƒ³ãƒˆã‚’追加ã—ãŸã¨ãã«ãƒˆãƒªã‚¬ãƒ¼ã•ã‚Œã¾ã™"
+msgid "Webhooks|URL is triggered when someone adds a comment"
+msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Trigger"
-msgstr "トリガー"
+msgid "Webhooks|URL is triggered when the pipeline status changes"
+msgstr ""
-msgid "Webhooks|URL"
-msgstr "URL"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32368,6 +33474,9 @@ msgstr "何を探ã—ã¾ã™ã‹?"
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32395,7 +33504,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr "有効ã«ã™ã‚‹ã¨ã€ %{host} ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã‚‹ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’作æˆã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚"
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32561,11 +33670,8 @@ msgstr "ページã®å‰Šé™¤"
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr "%{pageTitle} ページを削除ã—ã¾ã™ã‹ï¼Ÿ"
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr "誰ã‹ãŒåŒã˜ã‚¿ã‚¤ãƒŸãƒ³ã‚°ã§ãƒšãƒ¼ã‚¸ã‚’編集ã—ã¾ã—ãŸã€‚%{page_link} を確èªã—ã¦ã€å¤‰æ›´ç‚¹ãŒæ„図ã›ãšå‰Šé™¤ã•ã‚Œãªã„よã†ã«æ°—ã‚’ã¤ã‘ã¦ãã ã•ã„。"
-
-msgid "WikiPageConflictMessage|the page"
-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 "WikiPageCreate|Create %{pageTitle}"
msgstr "%{pageTitle} を作æˆ"
@@ -32660,9 +33766,6 @@ msgstr "コメントを書ãã‹ã€ã“ã“ã«ãƒ•ã‚¡ã‚¤ãƒ«ã‚’ドラッグ…"
msgid "Write a comment…"
msgstr "コメントを書ã..."
-msgid "Write access allowed"
-msgstr "書ãè¾¼ã¿ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯"
-
msgid "Write milestone description..."
msgstr "マイルストーンã®èª¬æ˜Žã‚’書ã..."
@@ -32672,6 +33775,9 @@ msgstr "リリースノートを書ãã‹ã€ã“ã“ã«ãƒ•ã‚¡ã‚¤ãƒ«ã‚’ドラッグ
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr "é–“é•ã£ãŸå¤–部UIDãŒæŒ‡å®šã•ã‚Œã¾ã—ãŸã€‚ Auth0ãŒæ­£ã—ã設定ã•ã‚Œã¦ã„ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。"
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32738,8 +33844,8 @@ 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 "ã‚ãªãŸã¯å…¬é–‹è¨­å®šã«å¤‰æ›´ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ã“ã‚Œã¯%{strongStart}ã™ã¹ã¦ã®äºº%{strongEnd} ãŒé–²è¦§å¯èƒ½ã«ãªã‚Šã€%{issuableType}ã«å¯¾ã—ã¦ã‚³ãƒ¡ãƒ³ãƒˆã‚’残ã™ã“ã¨ãŒã§ãるよã†ã«ãªã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚"
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
-msgstr "ã‚ãªãŸã¯æ©Ÿå¯†ã‚’有効ã«ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ã“ã‚Œã¯%{strongStart}å°‘ãªãã¨ã‚‚レãƒãƒ¼ã‚¿ãƒ¼æ¨©é™%{strongEnd}ã‚’æŒã£ã¦ã„ã‚‹ãƒãƒ¼ãƒ ãƒ¡ãƒ³ãƒãƒ¼ã®ã¿ãŒ%{issuableType}を閲覧ã§ãコメントを残ã™ã“ã¨ãŒã§ãるよã†ã«ãªã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚"
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
+msgstr ""
msgid "You are not allowed to approve a user"
msgstr ""
@@ -32753,6 +33859,9 @@ 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 "ã“ã®æ“作を実行ã™ã‚‹æ¨©é™ã‚’ã‚‚ã£ã¦ã„ã¾ã›ã‚“。"
@@ -32801,6 +33910,9 @@ 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 ""
@@ -32948,6 +34060,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr "ã‚ãªãŸã«ã¯ã‚µãƒ–スクリプションãŒã‚ã‚Šã¾ã›ã‚“"
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr "ã‚ãªãŸã¯ã“ã® %{namespaceType} を離れる許å¯ã‚’å¾—ã¦ã„ã¾ã›ã‚“。"
@@ -33065,6 +34180,9 @@ msgstr "ã‚ãªãŸã¯æ‰¿èªè€…を追加ã—ã¦ã„ã¾ã›ã‚“。ユーザーã¾ãŸã¯
msgid "You have reached your project limit"
msgstr "プロジェクト数ã®ä¸Šé™ã«é”ã—ã¦ã„ã¾ã™"
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33296,9 +34414,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr "パーソナルアクセストークン㯠%{days_to_expire} æ—¥ã§æœŸé™ãŒåˆ‡ã‚Œã¾ã™"
-
msgid "Your Primary Email will be used for avatar detection."
msgstr "メインã®ãƒ¡ãƒ¼ãƒ«ã¯ã‚¢ãƒã‚¿ãƒ¼ã®æ¤œå‡ºã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚"
@@ -33470,6 +34585,9 @@ 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 profile"
msgstr "ã‚ãªãŸã®ãƒ—ロフィール"
@@ -33527,6 +34645,9 @@ msgstr "Zoom ミーティングを削除ã—ã¾ã—ãŸ"
msgid "[No reason]"
msgstr "[ç†ç”±ã¯ã‚ã‚Šã¾ã›ã‚“]"
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33549,6 +34670,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr "%{created_at_timeago} を追加ã—ã¾ã—ãŸ"
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr "ã“ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã«Zoomコールを追加ã—ã¾ã—ãŸ"
@@ -33762,6 +34886,9 @@ 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 "マージリクエストを作æˆã—ã¦ã“ã®ã‚½ãƒªãƒ¥ãƒ¼ã‚·ãƒ§ãƒ³ã‚’実装ã™ã‚‹ã€ã¾ãŸã¯æ‰‹å‹•ã§ãƒ‘ッãƒã‚’ダウンロードã—ã¦é©ç”¨ã—ã¾ã™ã€‚"
@@ -33892,6 +35019,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr "クローズã—ãŸã‚¤ã‚·ãƒ¥ãƒ¼"
@@ -34037,6 +35167,9 @@ msgstr[0] "ファイル"
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 "%{link_to_merge_request} ã¨%{link_to_merge_request_source_branch} ã®å ´åˆ"
@@ -34174,6 +35307,9 @@ msgstr "ã‚ãªãŸãŒæ‰€æœ‰ã™ã‚‹ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34270,9 +35406,6 @@ msgstr "ã“ã®ã‚¨ãƒ³ãƒˆãƒªã®æ•°å¼ã¯ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã«æ™‚é–“ãŒã‹ã‹ã‚Šã™
msgid "math|There was an error rendering this math block"
msgstr "ã“ã® math ブロックã®ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] "マージリクエスト"
@@ -34313,9 +35446,6 @@ msgstr "マージリクエストã¯ã€ãƒ—ロジェクトã«åŠ ãˆãŸã‚ãªãŸã®
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr "ブランãƒã‚’復元ã™ã‚‹ã‹ã€åˆ¥ã® %{missingBranchName} ブランãƒã‚’使用ã—ã¦ãã ã•ã„"
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr "%{link_start}競åˆã®è§£æ±ºã®è©³ç´°%{link_end}"
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34433,6 +35563,9 @@ msgstr "%{missingBranchName} ブランãƒãŒãƒ­ãƒ¼ã‚«ãƒ«ãƒªãƒã‚¸ãƒˆãƒªã«å­˜åœ¨
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr "デプロイ統計を読ã¿è¾¼ã¿ä¸­"
@@ -34517,7 +35650,7 @@ msgstr "ã“ã®å¤‰æ›´ã¯æ¬¡ã®ãƒ–ランãƒã«ãƒžãƒ¼ã‚¸ã•ã‚Œã¾ã›ã‚“ã§ã—ãŸ"
msgid "mrWidget|The changes will be merged into"
msgstr "ã“ã®å¤‰æ›´ã¯æ¬¡ã®ãƒ–ランãƒã«ãƒžãƒ¼ã‚¸ã•ã‚Œã¾ã™"
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34598,6 +35731,9 @@ msgstr "パイプラインãŒæˆåŠŸã—ãŸã¨ãã¯è‡ªå‹•çš„ã«ãƒžãƒ¼ã‚¸ã•ã‚Œã¾
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr "パイプラインãŒæˆåŠŸã—ãŸã¨ãã«ãƒžãƒ¼ã‚¸ãƒˆãƒ¬ã‚¤ãƒ³ã‚’開始ã™ã‚‹"
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34607,9 +35743,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr "開始日より後ã«ã—ã¦ãã ã•ã„。"
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34658,9 +35800,6 @@ msgstr "ãªã—"
msgid "not found"
msgstr "見ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
-msgid "notification emails"
-msgstr "メール通知"
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr "%{firstItem} 㨠%{lastItem}"
@@ -34942,6 +36081,12 @@ msgstr "次ã®ã‚¤ã‚·ãƒ¥ãƒ¼"
msgid "this document"
msgstr "ã“ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆ"
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -34969,6 +36114,9 @@ msgstr "トリガーã•ã‚ŒãŸ"
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr "Unicodeドメインã«ã¯IDNAエンコーディングを使用ã—ã¦ãã ã•ã„"
@@ -34996,9 +36144,6 @@ msgstr ""
msgid "username"
msgstr "ユーザーå"
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr "コードをデプロイã™ã‚‹ãŸã‚ã« Kubernetes クラスターを使用ã™ã‚‹ã€‚"
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/ka_GE/gitlab.po b/locale/ka_GE/gitlab.po
index 51b3004ac82..dae1a11b14c 100644
--- a/locale/ka_GE/gitlab.po
+++ b/locale/ka_GE/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: ka\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:58\n"
+"PO-Revision-Date: 2021-03-05 23:53\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -170,6 +173,11 @@ 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] ""
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ 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 ""
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -682,6 +710,15 @@ 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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -976,6 +1016,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -988,9 +1031,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1015,9 +1055,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1111,6 +1148,11 @@ 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] ""
@@ -1162,6 +1204,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1282,6 +1327,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1635,9 +1779,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1716,12 +1857,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1818,6 +1965,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1938,6 +2103,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2058,6 +2226,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2091,6 +2268,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2259,6 +2442,15 @@ 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 ""
@@ -2268,6 +2460,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2361,6 +2562,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2394,6 +2607,21 @@ 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 ""
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2483,9 +2714,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2576,9 +2792,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,9 +2813,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,49 +2837,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,76 +2867,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,13 +2927,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2954,7 +3104,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2996,6 +3146,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3146,12 +3293,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3269,6 +3425,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3296,12 +3455,18 @@ 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 ""
@@ -3344,7 +3509,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3395,10 +3566,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3757,9 +3928,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3787,6 +3955,9 @@ 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 erase this build?"
msgstr ""
@@ -4048,12 +4219,6 @@ msgstr[1] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5028,6 +5235,26 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5688,7 +5915,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5703,6 +5930,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6036,21 +6266,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7325,16 +7594,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7349,6 +7642,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7391,6 +7729,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7430,6 +7771,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7451,6 +7795,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8245,10 +8577,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8302,6 +8637,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8314,6 +8652,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8329,6 +8670,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,13 +8991,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8647,7 +9024,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8689,6 +9066,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8722,6 +9102,18 @@ 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 ""
@@ -8886,7 +9278,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 ""
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9261,9 +9682,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9318,6 +9736,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9429,6 +9856,15 @@ 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 ""
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9660,6 +10093,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9678,9 +10114,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9690,19 +10123,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9717,10 +10150,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9735,7 +10165,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9756,10 +10186,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9768,7 +10204,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10047,18 +10482,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,7 +10710,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11048,19 +11468,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
-msgstr ""
-
-msgid "Enter the issue title"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11345,6 +11759,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11369,6 +11786,12 @@ 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 ""
@@ -11396,6 +11819,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11423,6 +11849,9 @@ 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 ""
@@ -11447,9 +11876,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11882,6 +12320,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11915,6 +12356,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12038,10 +12482,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12068,6 +12512,12 @@ 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 ""
@@ -12104,9 +12554,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,10 +12602,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12826,6 +13279,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12856,7 +13345,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12934,9 +13423,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13096,6 +13585,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13135,6 +13627,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13144,6 +13639,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13291,6 +13801,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13330,6 +13840,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13828,6 +14344,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14630,6 +15164,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15703,96 +16240,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16078,9 +16543,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ 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 ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ 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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16972,6 +17518,9 @@ 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 ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] ""
msgstr[1] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17085,6 +17640,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17118,6 +17676,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17169,9 +17730,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17181,6 +17739,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19590,6 +20253,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19737,6 +20406,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19788,6 +20466,9 @@ 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 ""
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ 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."
+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."
@@ -20552,7 +21257,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20579,10 +21290,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20651,6 +21362,9 @@ 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 ""
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20762,6 +21473,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21077,6 +21809,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21284,9 +22028,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21308,10 +22049,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,10 +22154,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ 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 ""
@@ -21665,6 +22415,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21923,21 +22685,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21959,6 +22739,12 @@ 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 ""
@@ -22067,6 +22853,9 @@ 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 ""
@@ -22151,24 +22940,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22205,6 +22976,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22562,6 +23336,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22790,10 +23567,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22805,7 +23579,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,13 +23672,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22937,13 +23714,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22970,16 +23750,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,52 +23816,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23381,6 +24164,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23396,6 +24188,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23408,22 +24206,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23432,6 +24230,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23522,9 +24326,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23675,7 +24476,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23771,7 +24572,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24072,6 +24921,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24243,6 +25098,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,7 +25269,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25595,7 +26480,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25721,6 +26612,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,10 +26627,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,19 +26744,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26161,7 +27062,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26338,6 +27239,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] ""
msgstr[1] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27287,9 +28194,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27479,12 +28383,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27989,67 +28896,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28136,6 +29043,12 @@ 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 ""
@@ -28145,7 +29058,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ 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 ""
@@ -29076,12 +30004,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29112,10 +30046,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29157,7 +30091,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29574,6 +30505,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30382,10 +31325,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30735,6 +31675,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30756,10 +31699,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31308,6 +32266,12 @@ 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|Packages"
msgstr ""
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ 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 ""
@@ -31653,6 +32713,9 @@ 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 ""
@@ -31668,6 +32731,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ 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 ""
@@ -31752,6 +32824,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31912,9 +32990,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32032,6 +33107,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,10 +33847,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32832,9 +33943,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ 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 ""
@@ -33120,6 +34237,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33237,6 +34357,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33642,6 +34762,9 @@ 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 profile"
msgstr ""
@@ -33699,6 +34822,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 ""
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34215,6 +35350,9 @@ 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 ""
@@ -34354,6 +35492,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34698,7 +35836,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35128,6 +36272,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/kab/gitlab.po b/locale/kab/gitlab.po
index a2e8d36a964..c1ce1e045a6 100644
--- a/locale/kab/gitlab.po
+++ b/locale/kab/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: kab\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 18:03\n"
+"PO-Revision-Date: 2021-03-05 23:58\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -170,6 +173,11 @@ 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] ""
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ 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 ""
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -682,6 +710,15 @@ 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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -976,6 +1016,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -988,9 +1031,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1015,9 +1055,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1111,6 +1148,11 @@ 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] ""
@@ -1162,6 +1204,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1282,6 +1327,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1635,9 +1779,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1716,12 +1857,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1818,6 +1965,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1938,6 +2103,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2058,6 +2226,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2091,6 +2268,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2259,6 +2442,15 @@ 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 ""
@@ -2268,6 +2460,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2361,6 +2562,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2394,6 +2607,21 @@ 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 ""
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2483,9 +2714,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2576,9 +2792,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,9 +2813,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,49 +2837,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,76 +2867,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,13 +2927,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2954,7 +3104,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2996,6 +3146,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3146,12 +3293,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3269,6 +3425,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3296,12 +3455,18 @@ 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 ""
@@ -3344,7 +3509,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3395,10 +3566,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3757,9 +3928,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3787,6 +3955,9 @@ 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 erase this build?"
msgstr ""
@@ -4048,12 +4219,6 @@ msgstr[1] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5028,6 +5235,26 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5688,7 +5915,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5703,6 +5930,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6036,21 +6266,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7325,16 +7594,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7349,6 +7642,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7391,6 +7729,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7430,6 +7771,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7451,6 +7795,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8245,10 +8577,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8302,6 +8637,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8314,6 +8652,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8329,6 +8670,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,13 +8991,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8647,7 +9024,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8689,6 +9066,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8722,6 +9102,18 @@ 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 ""
@@ -8886,7 +9278,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 ""
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9261,9 +9682,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9318,6 +9736,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9429,6 +9856,15 @@ 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 ""
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9660,6 +10093,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9678,9 +10114,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9690,19 +10123,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9717,10 +10150,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9735,7 +10165,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9756,10 +10186,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9768,7 +10204,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10047,18 +10482,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,7 +10710,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11048,19 +11468,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
-msgstr ""
-
-msgid "Enter the issue title"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11345,6 +11759,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11369,6 +11786,12 @@ 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 ""
@@ -11396,6 +11819,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11423,6 +11849,9 @@ 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 ""
@@ -11447,9 +11876,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11882,6 +12320,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11915,6 +12356,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12038,10 +12482,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12068,6 +12512,12 @@ 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 ""
@@ -12104,9 +12554,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,10 +12602,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12826,6 +13279,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12856,7 +13345,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12934,9 +13423,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13096,6 +13585,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13135,6 +13627,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13144,6 +13639,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13291,6 +13801,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13330,6 +13840,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13828,6 +14344,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14630,6 +15164,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15703,96 +16240,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16078,9 +16543,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ 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 ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ 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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16972,6 +17518,9 @@ 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 ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] ""
msgstr[1] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17085,6 +17640,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17118,6 +17676,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17169,9 +17730,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17181,6 +17739,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19590,6 +20253,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19737,6 +20406,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19788,6 +20466,9 @@ 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 ""
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ 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."
+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."
@@ -20552,7 +21257,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20579,10 +21290,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20651,6 +21362,9 @@ 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 ""
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20762,6 +21473,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21077,6 +21809,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21284,9 +22028,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21308,10 +22049,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,10 +22154,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ 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 ""
@@ -21665,6 +22415,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21923,21 +22685,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21959,6 +22739,12 @@ 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 ""
@@ -22067,6 +22853,9 @@ 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 ""
@@ -22151,24 +22940,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22205,6 +22976,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22562,6 +23336,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22790,10 +23567,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22805,7 +23579,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,13 +23672,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22937,13 +23714,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22970,16 +23750,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,52 +23816,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23381,6 +24164,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23396,6 +24188,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23408,22 +24206,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23432,6 +24230,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23522,9 +24326,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23675,7 +24476,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23771,7 +24572,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24072,6 +24921,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24243,6 +25098,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,7 +25269,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25595,7 +26480,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25721,6 +26612,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,10 +26627,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,19 +26744,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26161,7 +27062,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26338,6 +27239,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] ""
msgstr[1] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27287,9 +28194,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27479,12 +28383,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27989,67 +28896,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28136,6 +29043,12 @@ 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 ""
@@ -28145,7 +29058,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ 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 ""
@@ -29076,12 +30004,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29112,10 +30046,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29157,7 +30091,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29574,6 +30505,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30382,10 +31325,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30735,6 +31675,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30756,10 +31699,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31308,6 +32266,12 @@ 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|Packages"
msgstr ""
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ 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 ""
@@ -31653,6 +32713,9 @@ 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 ""
@@ -31668,6 +32731,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ 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 ""
@@ -31752,6 +32824,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31912,9 +32990,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32032,6 +33107,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,10 +33847,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32832,9 +33943,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ 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 ""
@@ -33120,6 +34237,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33237,6 +34357,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33642,6 +34762,9 @@ 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 profile"
msgstr ""
@@ -33699,6 +34822,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 ""
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34215,6 +35350,9 @@ 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 ""
@@ -34354,6 +35492,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34698,7 +35836,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35128,6 +36272,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/ko/gitlab.po b/locale/ko/gitlab.po
index 203a0aab9bf..3571e020a4d 100644
--- a/locale/ko/gitlab.po
+++ b/locale/ko/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: ko\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:59\n"
+"PO-Revision-Date: 2021-03-05 23:56\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -72,6 +72,9 @@ msgstr " ë˜ëŠ” 참조 (예: path/to/project!merge_request_id)"
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr "\"%{path}\"는 \"%{ref}\"ì— ì¡´ìž¬í•˜ì§€ 않습니다"
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -150,6 +153,10 @@ msgid "%d day"
msgid_plural "%d days"
msgstr[0] "%dì¼"
+msgid "%d epic"
+msgid_plural "%d epics"
+msgstr[0] ""
+
msgid "%d error"
msgid_plural "%d errors"
msgstr[0] "%dê°œì˜ ì˜¤ë¥˜"
@@ -290,6 +297,10 @@ msgid "%d vulnerability dismissed"
msgid_plural "%d vulnerabilities dismissed"
msgstr[0] "%dê°œì˜ ì·¨ì•½ì  ë¬´ì‹œë¨"
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -363,6 +374,9 @@ msgid "%{count} issue selected"
msgid_plural "%{count} issues selected"
msgstr[0] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -432,6 +446,9 @@ msgstr "%{edit_in_new_fork_notice} ì´ ì»¤ë°‹ì— ëŒ€í•´ ë˜ëŒë¦¬ê¸°ë¥¼ 다시 ì
msgid "%{edit_in_new_fork_notice} Try to upload a file again."
msgstr "%{edit_in_new_fork_notice} 파ì¼ì„ 다시 업로드하십시오."
+msgid "%{emailPrefix}@company.com"
+msgstr ""
+
msgid "%{extra} more downstream pipelines"
msgstr ""
@@ -483,6 +500,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -591,6 +611,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr "%{name} í¬í•¨ë¨ %{resultsString}"
@@ -619,6 +645,15 @@ msgstr[0] "%{no_of_days}ì¼"
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr "%{default_branch} 로부터 %{number_commits_behind} commits behind, %{number_commits_ahead} commits ahead"
+msgid "%{oneMonthAgo} - %{today}"
+msgstr ""
+
+msgid "%{oneWeekAgo} - %{today}"
+msgstr ""
+
+msgid "%{oneYearAgo} - %{today}"
+msgstr ""
+
msgid "%{openOrClose} %{noteable}"
msgstr "%{openOrClose} %{noteable}"
@@ -665,9 +700,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -709,6 +741,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr "%{start}부터 %{end}까지"
@@ -879,6 +914,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -901,6 +939,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr "(변경사항 ì—†ìŒ)"
@@ -913,9 +954,6 @@ msgstr "(진행 ìƒí™© 확ì¸)"
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -940,9 +978,6 @@ msgstr "+ %{moreCount} ë”"
msgid "+ %{numberOfHiddenAssignees} more"
msgstr "+ %{numberOfHiddenAssignees}명 ë” ìžˆìŒ"
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] "+%d개"
@@ -1027,6 +1062,10 @@ msgid "1 deploy key"
msgid_plural "%d deploy keys"
msgstr[0] ""
+msgid "1 follower"
+msgid_plural "%{count} followers"
+msgstr[0] ""
+
msgid "1 group"
msgid_plural "%d groups"
msgstr[0] "%d 그룹"
@@ -1069,6 +1108,9 @@ msgstr "1 ê°œ ì´ìƒ 참여"
msgid "10-19 contributions"
msgstr "10 ê°œ ì´ìƒ 참여"
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr "첫번째 기여!"
@@ -1189,6 +1231,9 @@ msgstr "ê·¸ë£¹ì€ GitLabì˜ ì¡°ì§ì„ 나타냅니다. ê·¸ë£¹ì„ ì‚¬ìš©í•˜ë©´ ì‚
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1288,6 +1333,102 @@ msgstr ""
msgid "API Token"
msgstr "API 토í°"
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr "AWS 엑세스 키"
@@ -1541,9 +1682,6 @@ msgstr "GPG 키 추가"
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr "ê´€ë¦¬ìž ì‚¬ì´ë“œ ë°”ì˜ ëª¨ë‹ˆí„°ë§ ì„¹ì…˜ì— Grafana ë²„íŠ¼ì„ ì¶”ê°€í•˜ì—¬ GitLabì˜ ìƒíƒœ ë° ì„±ëŠ¥ì— ëŒ€í•œ 다양한 ëª¨ë‹ˆí„°ë§ ìžë£Œì— 액세스 하십시오."
-msgid "Add a To Do"
-msgstr "í• ì¼ ì¶”ê°€"
-
msgid "Add a bullet list"
msgstr ""
@@ -1622,12 +1760,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr "ì´ë©”ì¼ ì£¼ì†Œ 추가"
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1724,6 +1868,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr "사용ìžë¥¼ 지정하지 않았습니다."
@@ -1784,6 +1943,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1844,6 +2006,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -1964,6 +2129,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -1988,6 +2159,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -1997,6 +2171,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2072,6 +2249,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr "활성"
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr "관리ìž"
@@ -2165,6 +2345,15 @@ 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 ""
@@ -2174,6 +2363,9 @@ msgstr "ì´ê²ƒì€ 나!"
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr "새로운 유저"
@@ -2258,6 +2450,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2267,6 +2465,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2300,6 +2510,21 @@ 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 ""
@@ -2324,6 +2549,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr "고급 설정"
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr "고급 사용 권한, 대용량 íŒŒì¼ ì €ìž¥ì†Œì™€ ì´ì¤‘-ì¸ì¦ 설정"
@@ -2388,9 +2616,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2403,24 +2628,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2481,9 +2694,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2493,6 +2703,9 @@ 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 ""
@@ -2502,9 +2715,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2529,49 +2739,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2583,9 +2760,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2595,76 +2769,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
-msgstr ""
-
-msgid "AlertSettings|There was an error updating the alert settings."
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2676,13 +2829,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2694,9 +2847,6 @@ msgstr ""
msgid "Alerts"
msgstr "알림"
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2709,7 +2859,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2796,9 +2946,6 @@ msgstr "모든 프로ì íŠ¸"
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2859,7 +3006,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2901,6 +3048,9 @@ msgstr "Kubernetes í´ëŸ¬ìŠ¤í„°ë¥¼ 추가하고 관리 í•  수 ​​있습니ë‹
msgid "Almost there"
msgstr "ê±°ì˜ ë‹¤ ë났습니다"
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -2967,12 +3117,6 @@ msgstr ""
msgid "An error has occurred"
msgstr "ì—러가 ë°œìƒí–ˆìŠµë‹ˆë‹¤."
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3051,12 +3195,18 @@ msgstr "Alertì„ í•´ì œí•˜ëŠ” 중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. 페ì´ì§€ë¥¼ 새
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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3081,6 +3231,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr "마í¬ë‹¤ìš´ 미리보기를 가져 오는 ì¤‘ì— ì˜¤ë¥˜ê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤."
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr "ëŒ“ê¸€ì„ ì—…ë°ì´íŠ¸í•˜ëŠ” 중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤."
@@ -3174,6 +3327,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3201,12 +3357,18 @@ 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 "ìš”ì²­ì„ ìƒì„±í•˜ëŠ” 중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤."
@@ -3249,8 +3411,11 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
-msgstr "담당ìžë¥¼ 저장하는 중 오류가 ë°œìƒí•˜ì˜€ìŠµë‹ˆë‹¤."
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
+msgstr ""
msgid "An error occurred while subscribing to notifications."
msgstr "ì•Œë¦¼ì„ êµ¬ë…하는 ì¤‘ì— ì˜¤ë¥˜ê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤."
@@ -3288,6 +3453,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3300,10 +3468,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr "오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. 다시 ì‹œë„í•´ 주세요."
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3658,9 +3826,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3688,6 +3853,9 @@ 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 erase this build?"
msgstr "ì •ë§ë¡œ ì´ ë¹Œë“œë¥¼ 지우시겠습니까?"
@@ -3946,12 +4114,6 @@ msgstr[0] ""
msgid "Attaching the file failed."
msgstr "íŒŒì¼ ì²¨ë¶€ê°€ 실패했습니다."
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr "ê°ì‚¬ ì´ë²¤íŠ¸"
@@ -4024,6 +4186,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4450,6 +4615,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4462,12 +4630,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 "Bitbucket 서버ì—ì„œ 가져 오기"
@@ -4535,6 +4715,12 @@ 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 ""
@@ -4625,12 +4811,6 @@ msgstr "브랜치 ì´ë¦„"
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr "브랜치 검색"
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr "브랜치 변경"
-
msgid "Branches"
msgstr "브랜치"
@@ -4799,16 +4979,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4823,6 +5015,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4856,6 +5051,12 @@ msgstr "비즈니스"
msgid "Business metrics (Custom)"
msgstr "비즈니스 지표 (ì‚¬ìš©ìž ì •ì˜)"
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4874,6 +5075,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -4925,6 +5129,25 @@ msgstr "외부 저장소용 CI/CD"
msgid "CI/CD settings"
msgstr "CI/CD 설정"
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5060,6 +5283,9 @@ msgstr ""
msgid "Cancel"
msgstr "취소"
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5213,12 +5439,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr "브랜치ì—ì„œ Pick"
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr "브랜치ì—ì„œ Revert"
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5363,6 +5583,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr "%{text}ì´(ê°€) 사용 가능한지 í™•ì¸ ì¤‘â€¦"
@@ -5585,8 +5808,8 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr "저장소 ê°€ì ¸ì˜¤ê¸°ì— ëŒ€í•œ 최ìƒìœ„ ê·¸ë£¹ì„ ì„ íƒí•˜ì„¸ìš”."
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
-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 ""
@@ -5600,6 +5823,9 @@ msgstr "Ci/CD 파ì´í”„ë¼ì¸ì´ ì—°ê²°ë˜ê³  실행할 저장소를 ì„ íƒí•´ ì
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr "취소ë¨"
@@ -5933,21 +6159,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -5957,9 +6204,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6968,6 +7227,9 @@ msgstr ""
msgid "Code"
msgstr "코드"
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7037,6 +7299,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7221,17 +7486,41 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr "%{source_branch} 와 %{target_branch}ê°€ ë™ì¼í•©ë‹ˆë‹¤."
-msgid "CompareBranches|Compare"
-msgstr "비êµ"
+msgid "CompareBranches|There isn't anything to compare."
+msgstr "비êµí•  ê²ƒì´ ì—†ìŠµë‹ˆë‹¤."
-msgid "CompareBranches|Source"
-msgstr "소스"
+msgid "CompareRevisions|Branches"
+msgstr ""
-msgid "CompareBranches|Target"
-msgstr "대ìƒ"
+msgid "CompareRevisions|Compare"
+msgstr ""
-msgid "CompareBranches|There isn't anything to 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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
+msgstr ""
msgid "Complete"
msgstr "완료"
@@ -7245,6 +7534,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7257,9 +7552,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7275,6 +7600,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7287,6 +7621,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7326,6 +7663,9 @@ msgstr "웹 í„°ë¯¸ë„ ì‚¬ìš©ì„ ì‹œìž‘í•˜ë„ë¡ GitLab 러너를 구성하십시
msgid "Configure Gitaly timeouts."
msgstr "Gitaly 시간 제한 설정."
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr "Let's Encrypt 설정"
@@ -7347,6 +7687,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7401,9 +7744,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr "축하합니다! ì´ì¤‘ ì¸ì¦ì„ 활성화했습니다!"
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7574,24 +7914,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8049,10 +8380,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8088,9 +8419,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr "êµ­ê°€"
@@ -8137,12 +8465,12 @@ 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 deploy key for this project"
-msgstr ""
-
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
@@ -8167,6 +8495,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr "브랜치 ìƒì„±"
@@ -8194,6 +8525,9 @@ msgstr "íŒŒì¼ ë§Œë“¤ê¸°"
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr "그룹 만들기"
@@ -8206,6 +8540,9 @@ msgstr "ì´ìŠˆ ìƒì„±"
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr "ë¼ë²¨ë¡œë¶€í„° 목ë¡ì„ ìƒì„±í•©ë‹ˆë‹¤. ì´ìŠˆì™€ 함께 ë¼ë²¨ì´ 목ë¡ì— 표시ë©ë‹ˆë‹¤."
@@ -8221,6 +8558,12 @@ msgstr "마ì¼ìŠ¤í†¤ 만들기"
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8293,6 +8636,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8302,15 +8648,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8329,6 +8690,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8338,6 +8702,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8353,6 +8720,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8458,6 +8828,9 @@ msgstr "ìƒì„± 날짜"
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8506,14 +8879,14 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
-msgstr "프로파ì¼"
+msgid "CurrentUser|One of your groups is running out"
+msgstr ""
-msgid "CurrentUser|Settings"
-msgstr "설정"
+msgid "CurrentUser|Preferences"
+msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
@@ -8539,8 +8912,8 @@ msgstr ""
msgid "Custom notification events"
msgstr "ì‚¬ìš©ìž ì •ì˜ ì•Œë¦¼ ì´ë²¤íŠ¸"
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
-msgstr "ì‚¬ìš©ìž ì •ì˜ ì•Œë¦¼ ìˆ˜ì¤€ì€ ì°¸ì—¬ 수준과 ë™ì¼í•©ë‹ˆë‹¤. 맞춤 알림 ìˆ˜ì¤€ì„ ì‚¬ìš©í•˜ë©´ ì¼ë¶€ ì´ë²¤íŠ¸ì— 대한 ì•Œë¦¼ë„ ë°›ê²Œë©ë‹ˆë‹¤. ìžì„¸í•œ ë‚´ìš©ì€ %{notification_link}ì„ í™•ì¸í•˜ì‹­ì‹œì˜¤."
+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 "ì‚¬ìš©ìž ì§€ì • 프로ì íŠ¸ 템플릿"
@@ -8581,6 +8954,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr "ìƒ‰ìƒ ë§žì¶¤í™”"
@@ -8614,6 +8990,18 @@ 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 ""
@@ -8777,7 +9165,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -8933,7 +9321,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -8957,6 +9351,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9038,6 +9435,9 @@ 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 ""
@@ -9047,6 +9447,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9071,6 +9474,10 @@ 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] ""
+
msgid "DastSiteValidation|Validate"
msgstr ""
@@ -9089,6 +9496,9 @@ 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 "ë°ì´í„°ê°€ ì•„ì§ ê³„ì‚°ì¤‘ìž…ë‹ˆë‹¤..."
@@ -9110,6 +9520,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9134,6 +9547,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr "디버그"
@@ -9152,9 +9568,6 @@ msgstr "취소 ë° ë¡œê·¸ì•„ì›ƒ"
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr "기본 브랜치"
-
msgid "Default CI configuration path"
msgstr ""
@@ -9209,6 +9622,9 @@ msgstr "cron êµ¬ë¬¸ì„ ì‚¬ìš©í•˜ì—¬ ì‚¬ìš©ìž ì •ì˜ íŒ¨í„´ ì •ì˜"
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9239,6 +9655,9 @@ msgstr "지연ë¨"
msgid "Delete"
msgstr "삭제 "
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9296,6 +9715,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9320,6 +9742,15 @@ 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 "ì‚­ì œë¨"
@@ -9488,13 +9919,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9503,6 +9931,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9512,15 +9943,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr "+%{count} 기타"
@@ -9545,6 +9973,9 @@ msgstr "ë°°í¬í‚¤ 제거 오류"
msgid "DeployKeys|Expand %{count} other projects"
msgstr "DeployKeys|확장 %{count} 기타 프로ì íŠ¸"
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr "ë°°í¬í‚¤ 로드"
@@ -9563,9 +9994,6 @@ msgstr "공개ì ìœ¼ë¡œ 엑세스 가능한 ë°°í¬í‚¤"
msgid "DeployKeys|Read access only"
msgstr "ì½ê¸° 엑세스 ì „ìš©"
-msgid "DeployKeys|Write access allowed"
-msgstr "쓰기 액세스 허용"
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr "ì´ ë°°í¬í‚¤ë¥¼ 제거하려고 합니다. 확실합니까?"
@@ -9575,19 +10003,19 @@ msgstr "활성 ë°°í¬ í† í° (%{active_tokens})"
msgid "DeployTokens|Add a deploy token"
msgstr "ë°°í¬ í† í° ì¶”ê°€"
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
-msgstr "레지스트리 ì´ë¯¸ì§€ì— 대한 ì½ê¸° ì „ìš© 액세스 허용"
+msgid "DeployTokens|Allows read-only access to registry images."
+msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
-msgstr "ì €ìž¥ì†Œì— ëŒ€í•œ ì½ê¸° ì „ìš© 액세스 허용"
+msgid "DeployTokens|Allows read-only access to the repository."
+msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9602,12 +10030,9 @@ msgstr "ë°°í¬ í† í° ë§Œë“¤ê¸°"
msgid "DeployTokens|Created"
msgstr "만들어ì§"
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
+msgid "DeployTokens|Deploy tokens"
msgstr ""
-msgid "DeployTokens|Deploy Tokens"
-msgstr "ë°°í¬ í† í°"
-
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
msgstr ""
@@ -9620,8 +10045,8 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr "ì´ë¦„"
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
-msgstr "ì‘ìš© í”„ë¡œê·¸ëž¨ì˜ ì´ë¦„ì„ ì„ íƒí•˜ë©´ 고유한 ë°°í¬ í† í°ì´ 제공ë©ë‹ˆë‹¤."
+msgid "DeployTokens|Pick a name for your unique deploy token."
+msgstr ""
msgid "DeployTokens|Revoke"
msgstr "취소"
@@ -9641,11 +10066,17 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr "ì´ ìž‘ì—…ì€ ë˜ëŒë¦´ 수 없습니다."
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
-msgstr "ì´ í† í°ì„ 암호로 사용합니다. 다시는 확ì¸í•  수 없으므로 토í°ì„ 저장해 ë‘십시오."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
+msgstr ""
-msgid "DeployTokens|Use this username as a login."
-msgstr "ì´ ì‚¬ìš©ìž ì´ë¦„ì„ ë¡œê·¸ì¸ìœ¼ë¡œ 사용합니다."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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 "ì‚¬ìš©ìž ì´ë¦„"
@@ -9653,8 +10084,8 @@ msgstr "ì‚¬ìš©ìž ì´ë¦„"
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
-msgstr "새 ë°°í¬ í† í°"
+msgid "DeployTokens|Your new Deploy Token username"
+msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
msgstr ""
@@ -9683,6 +10114,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9692,15 +10126,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9710,6 +10135,10 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+
msgid "Deployment|API"
msgstr ""
@@ -9932,18 +10361,6 @@ msgstr "호스트 키 발견"
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -9959,16 +10376,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -9989,10 +10406,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10001,18 +10415,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10025,9 +10433,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10037,6 +10442,12 @@ 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 ""
@@ -10064,6 +10475,9 @@ 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|Score"
msgstr ""
@@ -10175,7 +10589,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10377,6 +10791,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10569,10 +10986,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10641,12 +11058,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr "ì´ë©”ì¼"
@@ -10767,6 +11178,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr "ë©”ì¼ ë¨¸ë¦¬ë§ ë° ê¼¬ë¦¬ë§ ì‚¬ìš©"
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -10932,20 +11346,14 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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."
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the issue description"
-msgstr "ì´ìŠˆ 설명 ìž…ë ¥"
-
-msgid "Enter the issue title"
-msgstr "ì´ìŠˆ 제목 ìž…ë ¥"
-
-msgid "Enter the merge request description"
-msgstr "머지 리퀘스트(MR) ì„¤ëª…ì„ ìž…ë ¥ 해주세요"
+msgid "Enter the %{name} title"
+msgstr ""
-msgid "Enter the merge request title"
-msgstr "머지 리퀘스트(MR) ì œëª©ì„ ìž…ë ¥ 해주세요"
+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 name of your application, and we'll return a unique %{type}."
msgstr ""
@@ -11229,6 +11637,9 @@ msgstr "보호ë¨"
msgid "Epic"
msgstr "ì—픽"
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11253,6 +11664,12 @@ 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 ""
@@ -11280,6 +11697,9 @@ msgstr "ì´ê²ƒì„ 어떻게 í•´ê²°í•  수 있습니까?"
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11307,6 +11727,9 @@ 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 ""
@@ -11331,9 +11754,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11508,6 +11928,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11673,6 +12096,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11688,6 +12114,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11730,6 +12159,9 @@ msgstr "승ì¸ìž 확장"
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11766,6 +12198,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11799,6 +12234,9 @@ msgstr "공개 그룹 íƒìƒ‰"
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr "CSV로 내보내기"
@@ -11922,10 +12360,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -11952,6 +12390,12 @@ 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 ""
@@ -11988,9 +12432,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12006,9 +12447,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12042,10 +12480,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12090,7 +12528,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12108,9 +12546,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr "ì´ìŠˆë¥¼ ê°±ì‹ í•˜ëŠ”ë° ì‹¤íŒ¨í•˜ì˜€ìŠµë‹ˆë‹¤, 다시 ì‹œë„í•´ 주십시오."
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12153,6 +12588,9 @@ msgstr "기능 플래그"
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12646,6 +13084,15 @@ msgstr "FogBugz 가져오기"
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr "글꼴 색"
@@ -12709,6 +13156,42 @@ msgstr "프로ì íŠ¸ í¬í¬"
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr "다른 프로ì íŠ¸ì—ì„œ í¬í¬ë¨: "
@@ -12739,8 +13222,8 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
-msgstr "GitLab.com Gold 무료 ì²´í—˜íŒ"
+msgid "Free Trial of GitLab.com Ultimate"
+msgstr ""
msgid "Freeze end"
msgstr ""
@@ -12817,9 +13300,6 @@ msgstr "Geo"
msgid "Geo Nodes"
msgstr "Geo 노드"
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12832,6 +13312,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -12979,6 +13462,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13018,6 +13504,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr "실패"
@@ -13027,6 +13516,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13051,6 +13543,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13078,6 +13576,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13123,6 +13624,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr "ìƒíƒœ"
@@ -13174,6 +13678,9 @@ msgstr "í™•ì¸ ì‹¤íŒ¨- %{error}"
msgid "Geo|Waiting for scheduler"
msgstr "스케줄러 대기 중"
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13198,9 +13705,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13213,6 +13717,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13249,6 +13756,9 @@ msgstr ""
msgid "GitHub import"
msgstr "GitHub 가져오기"
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13510,9 +14020,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13663,6 +14170,9 @@ msgstr ""
msgid "Grant access"
msgstr "액세스 권한 부여"
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr "그래프"
@@ -13711,6 +14221,9 @@ msgstr ""
msgid "Group URL"
msgstr "그룹 URL"
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr "그룹 아바타"
@@ -14044,6 +14557,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14320,6 +14842,12 @@ msgstr "ì´ë¦„으로 검색"
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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}ì—ì„œ ìƒì„±í•  수 있습니다."
@@ -14401,15 +14929,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14511,6 +15039,9 @@ msgstr "정리, 내보내기, 경로, 전송, 삭제, 보관"
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14759,6 +15290,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15117,7 +15651,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15543,9 +16077,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15580,96 +16111,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15688,12 +16129,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15745,6 +16192,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15778,6 +16231,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -15946,6 +16402,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr "그룹 초대"
@@ -15955,9 +16414,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -15967,9 +16423,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16009,19 +16498,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16030,18 +16540,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16051,6 +16576,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16273,6 +16804,9 @@ 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 ""
@@ -16348,10 +16882,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16399,6 +16930,9 @@ 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 ""
@@ -16414,7 +16948,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16474,6 +17008,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16498,6 +17035,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16699,6 +17239,9 @@ 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 ""
@@ -16768,9 +17311,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16849,6 +17389,9 @@ msgstr "ë¼ë²¨ì€ ì´ìŠˆì™€ 머지 리퀘스트(MR)ì— ì¹´í…Œê³ ë¼ì´ì¦ˆë¥¼ 위
msgid "Labels can be applied to issues and merge requests."
msgstr "ë¼ë²¨ì€ ì´ìŠˆì™€ 머지 리퀘스트(MR)ì— ì‚¬ìš©í•  수 있습니다."
+msgid "Labels with no issues in this iteration:"
+msgstr ""
+
msgid "Labels|%{spanStart}Promote label%{spanEnd} %{labelTitle} %{spanStart}to Group Label?%{spanEnd}"
msgstr ""
@@ -16868,6 +17411,9 @@ msgid "Last %d day"
msgid_plural "Last %d days"
msgstr[0] "최근 %d ì¼"
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -16913,6 +17459,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -16961,6 +17510,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -16994,6 +17546,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17045,9 +17600,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr "ë” ìžì„¸ížˆ 알아보기"
@@ -17057,6 +17609,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr "나가기"
@@ -17240,9 +17882,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17352,6 +17991,9 @@ msgstr "사용 가능한 저장소 목ë¡"
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17391,7 +18033,7 @@ msgstr ""
msgid "Loading issues"
msgstr "ì´ìŠˆ 불러오는 중"
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17751,6 +18393,9 @@ msgstr "최대 액세스 수준"
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17763,9 +18408,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17823,6 +18465,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18093,6 +18738,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr "머지 리퀘스트(MR) 승ì¸"
@@ -18174,9 +18822,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr "MergeRequests | 답장 추가"
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18186,9 +18831,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr "MergeRequests | 답장 ..."
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18237,6 +18879,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -18944,6 +19589,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr "ë§Žì€ ë³„"
@@ -18953,6 +19601,9 @@ msgstr ""
msgid "Move"
msgstr "ì´ë™"
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr "ì´ìŠˆ ì´ë™"
@@ -18971,6 +19622,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19177,6 +19831,12 @@ 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 ""
@@ -19195,12 +19855,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19433,6 +20087,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr "새 브랜치"
@@ -19454,6 +20111,9 @@ msgstr ""
msgid "New directory"
msgstr "새 디렉토리"
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19496,6 +20156,9 @@ msgstr ""
msgid "New label"
msgstr "새 ë¼ë²¨"
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr "새 머지 리퀘스트(MR)"
@@ -19601,6 +20264,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19622,9 +20288,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr "Gitaly Serverì— ì—°ê²°í•  수 없습니다. 로그를 확ì¸í•˜ì‹­ì‹œì˜¤!"
@@ -19652,6 +20324,9 @@ 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 ""
@@ -19688,6 +20363,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -19916,13 +20594,19 @@ msgstr "참고: 관리ìžì—게 %{github_integration_link} (ì„) 를 설정하ì—
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -19937,6 +20621,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 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 ""
@@ -19952,9 +20639,6 @@ msgstr ""
msgid "Notification events"
msgstr "알림 ì´ë²¤íŠ¸"
-msgid "Notification setting"
-msgstr "알림 설정"
-
msgid "Notification setting - %{notification_title}"
msgstr "알림 설정 - %{notification_title}"
@@ -19982,6 +20666,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr "머지 리퀘스트(MR) 머지하기"
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20036,9 +20723,6 @@ msgstr "참여"
msgid "NotificationLevel|Watch"
msgstr "Watch"
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr "알림"
@@ -20150,6 +20834,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20171,6 +20861,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20204,9 +20897,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20382,7 +21081,7 @@ 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."
+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."
@@ -20415,7 +21114,7 @@ msgstr "프로ì íŠ¸ 구성ì›ë§Œ ëŒ“ê¸€ì„ ë‹¬ 수 있습니다."
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20430,6 +21129,12 @@ msgstr "ì´ëŸ°, 확실합니까?"
msgid "Open"
msgstr "열기"
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20442,12 +21147,12 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
-msgstr "Xcodeì—ì„œ 열기"
-
msgid "Open in file view"
msgstr ""
+msgid "Open in your IDE"
+msgstr ""
+
msgid "Open issues"
msgstr ""
@@ -20514,6 +21219,9 @@ 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 ""
@@ -20568,9 +21276,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20625,6 +21330,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20637,6 +21351,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20760,9 +21477,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20781,6 +21495,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20799,6 +21516,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20838,6 +21561,9 @@ 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|npm command"
msgstr ""
@@ -20859,15 +21585,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr "패키지"
@@ -20940,6 +21666,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -20997,10 +21732,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21096,6 +21831,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21147,9 +21885,6 @@ msgstr "파ì´í”„ë¼ì¸ 스케쥴"
msgid "Pipeline Schedules"
msgstr "파ì´í”„ë¼ì¸ 스케쥴"
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21171,10 +21906,10 @@ msgstr "파ì´í”„ë¼ì¸ 트리거"
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21249,15 +21984,6 @@ msgstr "파ì´í”„ë¼ì¸ 차트"
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr "ì§€ë‚œí•´ì˜ íŒŒì´í”„ë¼ì¸"
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21285,10 +22011,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr "Runner ìºì‹œ 정리"
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21303,9 +22029,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21330,6 +22053,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr "파ì´í”„ë¼ì¸ 로딩중"
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21366,9 +22092,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr "현재 ì‹¤í–‰ì¤‘ì¸ íŒŒì´í”„ë¼ì¸ì´ 없습니다."
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21402,6 +22125,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21414,12 +22140,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21459,6 +22194,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21471,6 +22209,12 @@ 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 ""
@@ -21528,6 +22272,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr "변수"
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr "%{pipelineId} 파ì´í”„ë¼ì¸ì„ 중지하고 있습니다."
@@ -21597,6 +22344,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21720,12 +22470,18 @@ 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 set a new password before proceeding."
msgstr "계ì†í•˜ê¸° ì „ì— ìƒˆ 비밀번호를 설정해주세요."
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr "ReCAPTCHA를 풀어 주십시오."
@@ -21786,21 +22542,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 "ë ˆì´ì•„웃 너비"
@@ -21822,6 +22596,12 @@ 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 "문법 하ì´ë¼ì´íŒ… 테마"
@@ -21930,6 +22710,9 @@ 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 ""
@@ -22014,24 +22797,6 @@ msgstr "프로필"
msgid "Profile Settings"
msgstr "프로필 설정"
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr "ì œ 3ìž ì„œë¹„ìŠ¤ì™€ì˜ í†µí•©ì„ ì„¤ì •í•©ë‹ˆë‹¤."
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr "Gitpod 통합 활성화"
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr "코드를 ë³¼ ë•Œ 코드 ì¸í…”리전스 활성화"
-
-msgid "ProfilePreferences|Gitpod"
-msgstr "Gitpod"
-
-msgid "ProfilePreferences|Integrations"
-msgstr "통합"
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr "Sourcegraph"
-
msgid "ProfileSession|on"
msgstr ""
@@ -22068,6 +22833,9 @@ msgstr "키 추가"
msgid "Profiles|Add status emoji"
msgstr "ìƒíƒœ ì´ëª¨í‹°ì½˜ 추가"
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr "아바타 ìžë¥´ê¸°"
@@ -22425,6 +23193,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr "프로ì íŠ¸ URL"
@@ -22653,10 +23424,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22668,7 +23436,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr "뱃지"
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22683,6 +23451,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr "ì´ ì„¤ì •ì„ ë³€ê²½í•˜ë ¤ë©´ 관리ìžì—게 문ì˜í•˜ì„¸ìš”."
@@ -22710,16 +23484,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22758,13 +23529,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22800,13 +23571,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22833,16 +23607,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr "요구 사항"
-msgid "ProjectSettings|Requirements management system for this project"
-msgstr "ì´ í”„ë¡œì íŠ¸ì˜ 요구 사항 관리 시스템"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
+msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -22866,7 +23649,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -22890,52 +23673,49 @@ msgstr "ì´ ì„¤ì •ì€ ì„œë²„ 레벨ì—ì„œ ì ìš©ë˜ì—ˆìœ¼ë©°, 프로ì íŠ¸ì— ì
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr "관리ìžì— 변경ë˜ì§€ 않는 í•œ, ì´ ì„¤ì •ì€ ëª¨ë“  프로ì íŠ¸ì— ì ìš©ë©ë‹ˆë‹¤."
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer project"
msgstr ""
+msgid "ProjectSettings|Users can copy the repository to a new project."
+msgstr ""
+
msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr "사용ìžëŠ” ì´ ì €ìž¥ì†Œì— ì¸ì¦ëœ ì´ë©”ì¼ë¡œ ì»¤ë°‹ëœ ì»¤ë°‹ë§Œì„ push í•  수 있습니다."
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When conflicts arise 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 "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23214,10 +23994,10 @@ msgstr "활성"
msgid "PrometheusService|Auto configuration"
msgstr "ìžë™ 설정"
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
-msgstr "프로ì íŠ¸ í™˜ê²½ì„ ëª¨ë‹ˆí„°ë§í•˜ê¸° 위해 ë‹¹ì‹ ì˜ í´ëŸ¬ìŠ¤í„°ì— Prometheus를 ìžë™ìœ¼ë¡œ ë°°í¬í•˜ê³  설정하십시오."
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
+msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23226,9 +24006,6 @@ msgstr "공통 메트릭스"
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23244,6 +24021,15 @@ msgstr "메트릭스 항목 찾기 ë° ì„¤ì •..."
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr "í´ëŸ¬ìŠ¤í„°ì— Prometheus 설치"
@@ -23259,6 +24045,12 @@ msgstr "매트릭스"
msgid "PrometheusService|Missing environment variable"
msgstr "누ë½ëœ 환경 변수"
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr "추가 정보"
@@ -23271,23 +24063,23 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
-msgstr "Prometheus API 기반 URL, 예를 들면 http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
-msgstr "ë‹¹ì‹ ì˜ í´ëŸ¬ìŠ¤í„°ì—ì„œ Prometheusê°€ ìžë™ìœ¼ë¡œ 관리ë˜ê³  있습니다."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
-msgstr "시간 계열 ëª¨ë‹ˆí„°ë§ ì„œë¹„ìŠ¤"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
-msgstr "í´ëŸ¬ìŠ¤í„°ì— Prometheus를 설치하려면, 아래 ìˆ˜ë™ ì„¤ì •ì„ ë¹„í™œì„±í™” 하십시오."
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
msgstr "공통 매트릭스를 찾기 위하여 첫 환경 ë°°í¬ë¥¼ 기다리는 중입니다"
@@ -23295,6 +24087,12 @@ msgstr "공통 매트릭스를 찾기 위하여 첫 환경 ë°°í¬ë¥¼ 기다리ëŠ
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr "승격"
@@ -23385,9 +24183,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr "업그레ì´ë“œ 플랜"
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23430,9 +24225,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr "ë³´í˜¸ëœ í™˜ê²½"
-
msgid "Protected Paths"
msgstr ""
@@ -23445,6 +24237,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23538,8 +24333,8 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
-msgstr "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgstr ""
msgid "Protocol"
msgstr ""
@@ -23634,8 +24429,50 @@ msgstr ""
msgid "Push to create a project"
msgstr "푸쉬해서 프로ì íŠ¸ ìƒì„±"
-msgid "PushRule|Committer restriction"
-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 "푸시ë¨"
@@ -23727,6 +24564,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23763,6 +24603,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -23933,6 +24776,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24038,6 +24884,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24104,6 +24953,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24272,7 +25124,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24322,12 +25174,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr "ìž‘ì—…"
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr "í´ëž˜ìŠ¤"
@@ -24399,6 +25254,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24426,6 +25287,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24522,6 +25389,9 @@ msgstr "액세스 요청"
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24540,6 +25410,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24650,9 +25523,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24743,6 +25613,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25117,7 +25990,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25189,6 +26062,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25276,6 +26152,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr "머지 리퀘스트(MR) 검색"
@@ -25437,7 +26316,7 @@ msgstr "비밀"
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25482,12 +26361,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25500,9 +26385,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25527,6 +26409,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25563,6 +26448,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25572,10 +26463,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25596,6 +26487,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25611,9 +26505,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25641,6 +26532,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25683,19 +26580,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25719,10 +26616,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25765,7 +26658,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25774,7 +26667,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -25861,9 +26754,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr "브랜치/태그 ì„ íƒ"
-
msgid "Select due date"
msgstr ""
@@ -25912,7 +26802,7 @@ msgstr ""
msgid "Select projects"
msgstr "프로ì íŠ¸ ì„ íƒ"
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -25954,12 +26844,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26002,7 +26898,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26179,6 +27075,9 @@ msgstr "%{protocol} í”„ë¡œí† ì½œì„ í†µí•´ Pull 하거나 Push하려면 계정ì—
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26371,6 +27270,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26525,7 +27427,7 @@ msgid "Showing %d event"
msgid_plural "Showing %d events"
msgstr[0] "%d ê°œì˜ ì´ë²¤íŠ¸ 표시 중"
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26814,9 +27716,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -26943,6 +27842,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27126,9 +28028,6 @@ msgstr "최근 로그ì¸"
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27318,12 +28217,15 @@ msgstr "ì´ ë³€ê²½ 사항으로 %{new_merge_request} ì„ ì‹œìž‘í•˜ì‹­ì‹œì˜¤."
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27828,67 +28730,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -27975,6 +28877,12 @@ 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 ""
@@ -27984,7 +28892,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28179,6 +29087,9 @@ msgstr "서비스 약관 ë° ê°œì¸ ì •ë³´ 보호 ì •ì±…"
msgid "Terraform"
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] ""
@@ -28238,6 +29149,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28250,6 +29164,9 @@ 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 ""
@@ -28271,6 +29188,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28317,9 +29237,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28808,6 +29725,9 @@ msgstr "Staging 단계ì—서는 MR 머지과 프로ë•ì…˜ í™˜ê²½ì— ì½”ë“œ ë°°í
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -28892,6 +29812,9 @@ 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 ""
@@ -28910,12 +29833,18 @@ msgstr "표시할 ì´ìŠˆê°€ 없습니다"
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr "ì•„ì§ ë¼ë²¨ì´ 없습니다."
msgid "There are no matching files"
msgstr "ì¼ì¹˜í•˜ëŠ” 파ì¼ì´ 없습니다"
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -28946,10 +29875,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -28991,7 +29920,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29006,7 +29935,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29048,6 +29977,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29078,6 +30010,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr "ì‚¬ìš©ìž í™œë™ ìº˜ë¦°ë”를 로딩하는 ì¤‘ì— ì˜¤ë¥˜ê°€ ë°œìƒí•˜ì˜€ìŠµë‹ˆë‹¤."
@@ -29105,9 +30040,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr "알림 ì„¤ì •ì„ ì €ìž¥í•˜ë˜ ì¤‘ 오류가 ë°œìƒí•˜ì˜€ìŠµë‹ˆë‹¤."
-
msgid "There was an error subscribing to this label."
msgstr "ì´ ë¼ë²¨ì„ 구ë…í•˜ë˜ ì¤‘ 오류가 ë°œìƒí•˜ì˜€ìŠµë‹ˆë‹¤."
@@ -29120,6 +30052,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29183,6 +30118,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29225,18 +30163,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29408,6 +30334,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29705,6 +30634,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29738,6 +30670,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30064,6 +30999,9 @@ msgstr "íŒ:"
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr "제목"
@@ -30214,11 +31152,11 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
-msgstr "í•  ì¼"
+msgid "To widen your search, change or remove filters."
+msgstr ""
msgid "To-Do List"
msgstr "í•  ì¼ ëª©ë¡"
@@ -30280,12 +31218,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr "토글 ìƒíƒœ: OFF"
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr "토글 ìƒíƒœ: ON"
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30310,9 +31242,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30439,20 +31368,26 @@ msgstr ""
msgid "Trending"
msgstr "ì¸ê¸°"
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30461,13 +31396,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30554,6 +31486,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr "다시 ì‹œë„하십시오"
@@ -30566,6 +31501,9 @@ msgstr "GitLabì´ ì œê³µí•˜ëŠ” 모든 ê¸°ëŠ¥ì„ 30ë™ì•ˆ 사용해 보세요."
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30587,11 +31525,11 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
-msgstr "ë„기"
+msgid "Turn off"
+msgstr ""
-msgid "Turn On"
-msgstr "켜기"
+msgid "Turn on"
+msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
msgstr ""
@@ -30656,6 +31594,21 @@ msgstr "URL"
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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30788,6 +31741,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -30959,9 +31915,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31139,6 +32092,12 @@ msgstr "LFS ê°ì²´"
msgid "UsageQuota|LFS Storage"
msgstr "LFS 저장소"
+msgid "UsageQuota|Learn more about excess storage usage"
+msgstr ""
+
+msgid "UsageQuota|Learn more about usage quotas"
+msgstr ""
+
msgid "UsageQuota|Packages"
msgstr "패키지"
@@ -31241,6 +32200,96 @@ 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 ""
@@ -31250,8 +32299,8 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
-msgstr "휴대 기기 ë˜ëŠ” 컴퓨터ì—ì„œ ì¼íšŒìš© 비밀번호 ì¸ì¦ê¸°ë¥¼ 사용하여 ì´ì¤‘ ì¸ì¦(2FA)를 활성화하세요."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgstr ""
msgid "Use cURL"
msgstr ""
@@ -31271,7 +32320,7 @@ msgstr ""
msgid "Use template"
msgstr "템플릿 사용"
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31442,6 +32491,12 @@ 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 "그룹"
@@ -31484,6 +32539,9 @@ 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 ""
@@ -31499,6 +32557,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31508,9 +32569,15 @@ 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 ""
@@ -31583,6 +32650,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31700,6 +32770,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31741,9 +32814,6 @@ msgstr "파ì¼ë³´ê¸° @ "
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -31861,6 +32931,9 @@ msgstr "ì•Œ 수 ì—†ìŒ"
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -31927,6 +33000,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -31948,15 +33024,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32155,6 +33243,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32176,6 +33270,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32233,10 +33330,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32245,7 +33342,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32272,64 +33369,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32368,6 +33474,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32395,7 +33504,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32561,11 +33670,8 @@ msgstr "페ì´ì§€ ì‚­ì œ"
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr "ë™ì‹œì— 누군가가 ì´ íŽ˜ì´ì§€ë¥¼ 수정했습니다. %{page_link} 페ì´ì§€ë¥¼ ì²´í¬ì•„웃하여 ë‹¹ì‹ ì˜ ìˆ˜ì •ì‚¬í•­ë“¤ì´ ì˜ë„치 않게 다른 ì´ì˜ ìˆ˜ì •ì‚¬í•­ë“¤ì„ ì œê±°í•˜ì§€ ì•Šë„ë¡ í•´ì£¼ì„¸ìš”."
-
-msgid "WikiPageConflictMessage|the page"
-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 "WikiPageCreate|Create %{pageTitle}"
msgstr ""
@@ -32660,9 +33766,6 @@ msgstr "코멘트를 작성하거나 파ì¼ì„ 여기로 드래그하십시오â€
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32672,6 +33775,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32738,7 +33844,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32753,6 +33859,9 @@ 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 ""
@@ -32801,6 +33910,9 @@ 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 ""
@@ -32948,6 +34060,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33065,6 +34180,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr "프로ì íŠ¸ ìˆ«ìž í•œë„ì— ë„달했습니다."
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33296,9 +34414,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33470,6 +34585,9 @@ 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 profile"
msgstr ""
@@ -33527,6 +34645,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33549,6 +34670,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33762,6 +34886,9 @@ 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 ""
@@ -33892,6 +35019,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34037,6 +35167,9 @@ msgstr[0] ""
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 ""
@@ -34174,6 +35307,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34270,9 +35406,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] "머지 리퀘스트(MR)"
@@ -34313,9 +35446,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr "브랜치를 ë³µì›í•˜ê±°ë‚˜ 다른 %{missingBranchName} 브랜치를 사용해주세요."
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34433,6 +35563,9 @@ msgstr "만약 %{missingBranchName} 브랜치가 ë‹¹ì‹ ì˜ ë¡œì»¬ ì €ìž¥ì†Œì— ì
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr "ë°°í¬ í†µê³„ 로딩중"
@@ -34517,7 +35650,7 @@ msgstr "변경 ì‚¬í•­ì´ ë¨¸ì§€ë˜ì§€ 않았습니다."
msgid "mrWidget|The changes will be merged into"
msgstr "변경 ì‚¬í•­ì´ ë¨¸ì§€ë  ê²ƒ 입니다."
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34598,6 +35731,9 @@ msgstr "파ì´í”„ë¼ì¸ì´ 성공하면 ìžë™ìœ¼ë¡œ 머지ë©ë‹ˆë‹¤."
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34607,9 +35743,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34658,9 +35800,6 @@ msgstr "ì—†ìŒ"
msgid "not found"
msgstr "ì°¾ì„ ìˆ˜ ì—†ìŒ"
-msgid "notification emails"
-msgstr "알림 ì´ë©”ì¼"
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -34942,6 +36081,12 @@ msgstr ""
msgid "this document"
msgstr "ì´ ë¬¸ì„œ"
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -34969,6 +36114,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -34996,9 +36144,6 @@ msgstr "ì‚¬ìš©ìž ì„¤ì •"
msgid "username"
msgstr "사용ìžëª…"
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr "kubernetes í´ëŸ¬ìŠ¤í„°ë¥¼ 사용하여 코드를 ë°°í¬í•©ë‹ˆë‹¤!"
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/ku_TR/gitlab.po b/locale/ku_TR/gitlab.po
index f5bffb862bd..3a8a1b8dec4 100644
--- a/locale/ku_TR/gitlab.po
+++ b/locale/ku_TR/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: ku\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:59\n"
+"PO-Revision-Date: 2021-03-05 23:56\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -170,6 +173,11 @@ 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] ""
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ 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 ""
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -682,6 +710,15 @@ 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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -976,6 +1016,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -988,9 +1031,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1015,9 +1055,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1111,6 +1148,11 @@ 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] ""
@@ -1162,6 +1204,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1282,6 +1327,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1635,9 +1779,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1716,12 +1857,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1818,6 +1965,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1938,6 +2103,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2058,6 +2226,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2091,6 +2268,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2259,6 +2442,15 @@ 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 ""
@@ -2268,6 +2460,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2361,6 +2562,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2394,6 +2607,21 @@ 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 ""
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2483,9 +2714,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2576,9 +2792,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,9 +2813,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,49 +2837,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,76 +2867,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,13 +2927,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2954,7 +3104,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2996,6 +3146,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3146,12 +3293,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3269,6 +3425,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3296,12 +3455,18 @@ 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 ""
@@ -3344,7 +3509,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3395,10 +3566,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3757,9 +3928,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3787,6 +3955,9 @@ 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 erase this build?"
msgstr ""
@@ -4048,12 +4219,6 @@ msgstr[1] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5028,6 +5235,26 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5688,7 +5915,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5703,6 +5930,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6036,21 +6266,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7325,16 +7594,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7349,6 +7642,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7391,6 +7729,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7430,6 +7771,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7451,6 +7795,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8245,10 +8577,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8302,6 +8637,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8314,6 +8652,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8329,6 +8670,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,13 +8991,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8647,7 +9024,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8689,6 +9066,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8722,6 +9102,18 @@ 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 ""
@@ -8886,7 +9278,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 ""
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9261,9 +9682,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9318,6 +9736,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9429,6 +9856,15 @@ 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 ""
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9660,6 +10093,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9678,9 +10114,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9690,19 +10123,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9717,10 +10150,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9735,7 +10165,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9756,10 +10186,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9768,7 +10204,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10047,18 +10482,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,7 +10710,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11048,19 +11468,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
-msgstr ""
-
-msgid "Enter the issue title"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11345,6 +11759,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11369,6 +11786,12 @@ 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 ""
@@ -11396,6 +11819,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11423,6 +11849,9 @@ 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 ""
@@ -11447,9 +11876,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11882,6 +12320,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11915,6 +12356,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12038,10 +12482,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12068,6 +12512,12 @@ 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 ""
@@ -12104,9 +12554,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,10 +12602,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12826,6 +13279,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12856,7 +13345,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12934,9 +13423,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13096,6 +13585,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13135,6 +13627,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13144,6 +13639,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13291,6 +13801,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13330,6 +13840,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13828,6 +14344,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14630,6 +15164,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15703,96 +16240,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16078,9 +16543,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ 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 ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ 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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16972,6 +17518,9 @@ 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 ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] ""
msgstr[1] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17085,6 +17640,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17118,6 +17676,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17169,9 +17730,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17181,6 +17739,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19590,6 +20253,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19737,6 +20406,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19788,6 +20466,9 @@ 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 ""
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ 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."
+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."
@@ -20552,7 +21257,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20579,10 +21290,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20651,6 +21362,9 @@ 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 ""
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20762,6 +21473,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21077,6 +21809,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21284,9 +22028,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21308,10 +22049,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,10 +22154,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ 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 ""
@@ -21665,6 +22415,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21923,21 +22685,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21959,6 +22739,12 @@ 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 ""
@@ -22067,6 +22853,9 @@ 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 ""
@@ -22151,24 +22940,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22205,6 +22976,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22562,6 +23336,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22790,10 +23567,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22805,7 +23579,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,13 +23672,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22937,13 +23714,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22970,16 +23750,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,52 +23816,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23381,6 +24164,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23396,6 +24188,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23408,22 +24206,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23432,6 +24230,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23522,9 +24326,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23675,7 +24476,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23771,7 +24572,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24072,6 +24921,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24243,6 +25098,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,7 +25269,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25595,7 +26480,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25721,6 +26612,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,10 +26627,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,19 +26744,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26161,7 +27062,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26338,6 +27239,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] ""
msgstr[1] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27287,9 +28194,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27479,12 +28383,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27989,67 +28896,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28136,6 +29043,12 @@ 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 ""
@@ -28145,7 +29058,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ 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 ""
@@ -29076,12 +30004,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29112,10 +30046,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29157,7 +30091,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29574,6 +30505,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30382,10 +31325,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30735,6 +31675,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30756,10 +31699,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31308,6 +32266,12 @@ 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|Packages"
msgstr ""
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ 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 ""
@@ -31653,6 +32713,9 @@ 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 ""
@@ -31668,6 +32731,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ 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 ""
@@ -31752,6 +32824,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31912,9 +32990,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32032,6 +33107,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,10 +33847,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32832,9 +33943,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ 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 ""
@@ -33120,6 +34237,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33237,6 +34357,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33642,6 +34762,9 @@ 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 profile"
msgstr ""
@@ -33699,6 +34822,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 ""
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34215,6 +35350,9 @@ 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 ""
@@ -34354,6 +35492,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34698,7 +35836,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35128,6 +36272,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/ky_KG/gitlab.po b/locale/ky_KG/gitlab.po
index 3020745be9f..c46ca0fcb5a 100644
--- a/locale/ky_KG/gitlab.po
+++ b/locale/ky_KG/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: ky\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:04\n"
+"PO-Revision-Date: 2021-03-05 23:50\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -170,6 +173,11 @@ 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] ""
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ 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 ""
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -682,6 +710,15 @@ 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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -976,6 +1016,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -988,9 +1031,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1015,9 +1055,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1111,6 +1148,11 @@ 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] ""
@@ -1162,6 +1204,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1282,6 +1327,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1635,9 +1779,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1716,12 +1857,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1818,6 +1965,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1938,6 +2103,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2058,6 +2226,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2091,6 +2268,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2259,6 +2442,15 @@ 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 ""
@@ -2268,6 +2460,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2361,6 +2562,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2394,6 +2607,21 @@ 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 ""
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2483,9 +2714,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2576,9 +2792,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,9 +2813,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,49 +2837,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,76 +2867,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,13 +2927,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2954,7 +3104,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2996,6 +3146,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3146,12 +3293,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3269,6 +3425,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3296,12 +3455,18 @@ 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 ""
@@ -3344,7 +3509,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3395,10 +3566,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3757,9 +3928,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3787,6 +3955,9 @@ 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 erase this build?"
msgstr ""
@@ -4048,12 +4219,6 @@ msgstr[1] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5028,6 +5235,26 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5688,7 +5915,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5703,6 +5930,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6036,21 +6266,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7325,16 +7594,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7349,6 +7642,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7391,6 +7729,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7430,6 +7771,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7451,6 +7795,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8245,10 +8577,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8302,6 +8637,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8314,6 +8652,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8329,6 +8670,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,13 +8991,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8647,7 +9024,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8689,6 +9066,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8722,6 +9102,18 @@ 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 ""
@@ -8886,7 +9278,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 ""
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9261,9 +9682,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9318,6 +9736,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9429,6 +9856,15 @@ 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 ""
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9660,6 +10093,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9678,9 +10114,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9690,19 +10123,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9717,10 +10150,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9735,7 +10165,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9756,10 +10186,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9768,7 +10204,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10047,18 +10482,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,7 +10710,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11048,19 +11468,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
-msgstr ""
-
-msgid "Enter the issue title"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11345,6 +11759,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11369,6 +11786,12 @@ 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 ""
@@ -11396,6 +11819,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11423,6 +11849,9 @@ 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 ""
@@ -11447,9 +11876,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11882,6 +12320,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11915,6 +12356,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12038,10 +12482,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12068,6 +12512,12 @@ 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 ""
@@ -12104,9 +12554,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,10 +12602,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12826,6 +13279,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12856,7 +13345,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12934,9 +13423,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13096,6 +13585,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13135,6 +13627,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13144,6 +13639,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13291,6 +13801,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13330,6 +13840,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13828,6 +14344,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14630,6 +15164,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15703,96 +16240,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16078,9 +16543,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ 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 ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ 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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16972,6 +17518,9 @@ 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 ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] ""
msgstr[1] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17085,6 +17640,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17118,6 +17676,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17169,9 +17730,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17181,6 +17739,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19590,6 +20253,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19737,6 +20406,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19788,6 +20466,9 @@ 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 ""
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ 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."
+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."
@@ -20552,7 +21257,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20579,10 +21290,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20651,6 +21362,9 @@ 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 ""
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20762,6 +21473,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21077,6 +21809,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21284,9 +22028,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21308,10 +22049,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,10 +22154,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ 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 ""
@@ -21665,6 +22415,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21923,21 +22685,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21959,6 +22739,12 @@ 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 ""
@@ -22067,6 +22853,9 @@ 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 ""
@@ -22151,24 +22940,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22205,6 +22976,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22562,6 +23336,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22790,10 +23567,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22805,7 +23579,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,13 +23672,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22937,13 +23714,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22970,16 +23750,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,52 +23816,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23381,6 +24164,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23396,6 +24188,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23408,22 +24206,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23432,6 +24230,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23522,9 +24326,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23675,7 +24476,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23771,7 +24572,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24072,6 +24921,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24243,6 +25098,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,7 +25269,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25595,7 +26480,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25721,6 +26612,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,10 +26627,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,19 +26744,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26161,7 +27062,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26338,6 +27239,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] ""
msgstr[1] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27287,9 +28194,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27479,12 +28383,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27989,67 +28896,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28136,6 +29043,12 @@ 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 ""
@@ -28145,7 +29058,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ 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 ""
@@ -29076,12 +30004,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29112,10 +30046,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29157,7 +30091,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29574,6 +30505,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30382,10 +31325,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30735,6 +31675,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30756,10 +31699,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31308,6 +32266,12 @@ 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|Packages"
msgstr ""
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ 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 ""
@@ -31653,6 +32713,9 @@ 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 ""
@@ -31668,6 +32731,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ 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 ""
@@ -31752,6 +32824,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31912,9 +32990,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32032,6 +33107,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,10 +33847,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32832,9 +33943,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ 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 ""
@@ -33120,6 +34237,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33237,6 +34357,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33642,6 +34762,9 @@ 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 profile"
msgstr ""
@@ -33699,6 +34822,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 ""
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34215,6 +35350,9 @@ 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 ""
@@ -34354,6 +35492,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34698,7 +35836,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35128,6 +36272,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/lt_LT/gitlab.po b/locale/lt_LT/gitlab.po
index d4fd206a7a9..b345deb3527 100644
--- a/locale/lt_LT/gitlab.po
+++ b/locale/lt_LT/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: lt\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:59\n"
+"PO-Revision-Date: 2021-03-05 23:56\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -78,6 +78,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -210,6 +213,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d epic"
+msgid_plural "%d epics"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d error"
msgid_plural "%d errors"
msgstr[0] ""
@@ -455,6 +465,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -540,6 +557,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -618,6 +638,9 @@ 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 ""
@@ -669,6 +692,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -777,6 +803,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -808,6 +840,15 @@ msgstr[3] ""
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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -857,9 +898,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -907,6 +945,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1101,6 +1142,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -1126,6 +1170,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -1138,9 +1185,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1165,9 +1209,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1279,6 +1320,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "1 follower"
+msgid_plural "%{count} followers"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "1 group"
msgid_plural "%d groups"
msgstr[0] ""
@@ -1348,6 +1396,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1468,6 +1519,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1567,6 +1621,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1823,9 +1973,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1904,12 +2051,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -2006,6 +2159,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2066,6 +2234,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -2126,6 +2297,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2246,6 +2420,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2270,6 +2450,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2279,6 +2462,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2354,6 +2540,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2447,6 +2636,15 @@ 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 ""
@@ -2456,6 +2654,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2540,6 +2741,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2549,6 +2756,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2582,6 +2801,21 @@ 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 ""
@@ -2606,6 +2840,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2673,9 +2910,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2688,24 +2922,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2766,9 +2988,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2778,6 +2997,9 @@ 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 ""
@@ -2787,9 +3009,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2814,49 +3033,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2868,9 +3054,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2880,76 +3063,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
-msgstr ""
-
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2961,13 +3123,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2979,9 +3141,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2994,7 +3153,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -3081,9 +3240,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -3144,7 +3300,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -3186,6 +3342,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3252,12 +3411,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3336,12 +3489,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3366,6 +3525,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3459,6 +3621,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3486,12 +3651,18 @@ 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 ""
@@ -3534,7 +3705,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3573,6 +3747,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3585,10 +3762,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3955,9 +4132,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3985,6 +4159,9 @@ 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 erase this build?"
msgstr ""
@@ -4252,12 +4429,6 @@ msgstr[3] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4330,6 +4501,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4756,6 +4930,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4768,12 +4945,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4844,6 +5033,12 @@ 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 ""
@@ -4934,12 +5129,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -5108,16 +5297,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -5132,6 +5333,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -5165,6 +5369,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -5183,6 +5393,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5234,6 +5447,28 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5369,6 +5604,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5522,12 +5760,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5672,6 +5904,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5894,7 +6129,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5909,6 +6144,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6242,21 +6480,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6266,9 +6525,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7277,6 +7548,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7346,6 +7620,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7533,16 +7810,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
+msgstr ""
+
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Create merge request"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7557,6 +7858,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7569,9 +7876,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7587,6 +7924,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7599,6 +7945,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7638,6 +7987,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7659,6 +8011,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7713,9 +8068,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7892,24 +8244,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8370,10 +8713,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8409,9 +8752,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8461,10 +8801,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8491,6 +8831,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8518,6 +8861,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8530,6 +8876,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8545,6 +8894,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8617,6 +8972,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8626,15 +8984,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8653,6 +9026,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8662,6 +9038,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8677,6 +9056,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8782,6 +9164,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8830,13 +9215,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8863,7 +9248,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8905,6 +9290,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8938,6 +9326,18 @@ 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 ""
@@ -9104,7 +9504,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9260,7 +9660,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9284,6 +9690,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9365,6 +9774,9 @@ 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 ""
@@ -9374,6 +9786,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9398,6 +9813,13 @@ 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] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "DastSiteValidation|Validate"
msgstr ""
@@ -9416,6 +9838,9 @@ 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 ""
@@ -9437,6 +9862,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9461,6 +9889,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9479,9 +9910,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9536,6 +9964,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9566,6 +9997,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9623,6 +10057,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9647,6 +10084,15 @@ 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 ""
@@ -9833,13 +10279,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
-msgstr ""
-
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9848,6 +10291,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9857,15 +10303,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9890,6 +10333,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9908,9 +10354,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9920,19 +10363,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9947,10 +10390,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9965,7 +10405,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9986,10 +10426,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
+msgstr ""
+
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9998,7 +10444,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -10028,6 +10474,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -10037,15 +10486,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -10055,6 +10495,13 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10277,18 +10724,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10304,16 +10739,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10334,10 +10769,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10346,18 +10778,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10370,9 +10796,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10382,6 +10805,12 @@ 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 ""
@@ -10409,6 +10838,9 @@ 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|Score"
msgstr ""
@@ -10520,7 +10952,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10725,6 +11157,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10917,10 +11352,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10989,12 +11424,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -11115,6 +11544,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11280,19 +11712,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
-msgstr ""
-
-msgid "Enter the issue title"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11577,6 +12003,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11601,6 +12030,12 @@ 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 ""
@@ -11628,6 +12063,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11655,6 +12093,9 @@ 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 ""
@@ -11679,9 +12120,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11856,6 +12294,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -12021,6 +12462,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -12036,6 +12480,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -12078,6 +12525,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -12114,6 +12564,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -12147,6 +12600,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12270,10 +12726,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12300,6 +12756,12 @@ 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 ""
@@ -12336,9 +12798,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12354,9 +12813,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12390,10 +12846,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12438,7 +12894,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12456,9 +12912,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12501,6 +12954,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12997,6 +13453,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -13060,6 +13525,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -13090,7 +13591,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -13168,9 +13669,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -13183,6 +13681,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13330,6 +13831,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13369,6 +13873,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13378,6 +13885,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13402,6 +13912,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13429,6 +13945,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13474,6 +13993,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13525,6 +14047,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13549,9 +14074,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13564,6 +14086,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13600,6 +14125,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13861,9 +14389,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -14014,6 +14539,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -14062,6 +14590,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14395,6 +14926,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14671,6 +15211,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14752,15 +15298,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14868,6 +15414,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -15122,6 +15671,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15483,7 +16035,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15909,9 +16461,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15949,96 +16498,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -16057,12 +16516,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -16114,6 +16579,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -16147,6 +16618,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16315,6 +16789,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16324,9 +16801,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16336,9 +16810,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16378,19 +16885,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16399,18 +16927,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16420,6 +16963,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16642,6 +17191,9 @@ 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 ""
@@ -16717,10 +17269,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16768,6 +17317,9 @@ 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 ""
@@ -16783,7 +17335,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16843,6 +17395,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16867,6 +17422,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -17068,6 +17626,9 @@ 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 ""
@@ -17137,9 +17698,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -17218,6 +17776,9 @@ 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 ""
@@ -17240,6 +17801,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17285,6 +17849,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17333,6 +17900,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17366,6 +17936,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17417,9 +17990,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17429,6 +17999,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17630,9 +18290,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17745,6 +18402,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17784,7 +18444,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -18144,6 +18804,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -18156,9 +18819,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -18216,6 +18876,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18486,6 +19149,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18567,9 +19233,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18579,9 +19242,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18630,6 +19290,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19343,6 +20006,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19352,6 +20018,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19370,6 +20039,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19582,6 +20254,12 @@ 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 ""
@@ -19600,12 +20278,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19841,6 +20513,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19862,6 +20537,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19904,6 +20582,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -20009,6 +20690,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -20030,9 +20714,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -20060,6 +20750,9 @@ 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 ""
@@ -20096,6 +20789,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20324,13 +21020,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20345,6 +21047,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 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 ""
@@ -20360,9 +21065,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20390,6 +21092,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20444,9 +21149,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20558,6 +21260,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20579,6 +21287,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20612,9 +21323,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20793,7 +21510,7 @@ 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."
+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."
@@ -20826,7 +21543,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20841,6 +21558,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20853,10 +21576,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20925,6 +21648,9 @@ 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 ""
@@ -20979,9 +21705,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -21036,6 +21759,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -21048,6 +21780,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -21171,9 +21906,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -21192,6 +21924,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -21210,6 +21945,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -21249,6 +21990,9 @@ 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|npm command"
msgstr ""
@@ -21270,15 +22014,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21351,6 +22095,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21408,10 +22161,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21507,6 +22260,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21558,9 +22314,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21582,10 +22335,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21660,15 +22413,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21696,10 +22440,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21714,9 +22458,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21741,6 +22482,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21777,9 +22521,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21813,6 +22554,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21825,12 +22569,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21870,6 +22623,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21882,6 +22638,12 @@ 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 ""
@@ -21939,6 +22701,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -22008,6 +22773,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -22131,12 +22899,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -22197,21 +22971,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -22233,6 +23025,12 @@ 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 ""
@@ -22341,6 +23139,9 @@ 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 ""
@@ -22425,24 +23226,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22479,6 +23262,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22836,6 +23622,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -23064,10 +23853,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -23079,7 +23865,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -23094,6 +23880,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -23121,16 +23913,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -23169,13 +23958,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -23211,13 +24000,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -23244,16 +24036,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23277,7 +24078,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23301,52 +24102,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23625,10 +24423,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23637,9 +24435,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23655,6 +24450,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23670,6 +24474,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23682,22 +24492,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23706,6 +24516,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23796,9 +24612,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23841,9 +24654,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23856,6 +24666,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23949,7 +24762,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -24045,7 +24858,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -24138,6 +24993,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -24174,6 +25032,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24350,6 +25211,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24455,6 +25319,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24521,6 +25388,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24689,7 +25559,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24745,12 +25615,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24828,6 +25701,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24855,6 +25734,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24951,6 +25836,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24969,6 +25857,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -25085,9 +25976,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -25178,6 +26066,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25558,7 +26449,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25630,6 +26521,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25717,6 +26611,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25911,7 +26808,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25956,12 +26853,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25974,9 +26877,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -26001,6 +26901,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -26037,6 +26940,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -26046,10 +26955,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -26070,6 +26979,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -26085,9 +26997,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -26115,6 +27024,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -26157,19 +27072,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -26193,13 +27108,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -26242,7 +27150,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -26251,7 +27159,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26338,9 +27246,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26389,7 +27294,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26431,12 +27336,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26479,7 +27390,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26656,6 +27567,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26848,6 +27762,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -27005,7 +27922,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -27297,9 +28214,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27426,6 +28340,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27609,9 +28526,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27801,12 +28715,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -28311,67 +29228,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28458,6 +29375,12 @@ 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 ""
@@ -28467,7 +29390,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28662,6 +29585,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28727,6 +29653,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28739,6 +29668,9 @@ 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 ""
@@ -28760,6 +29692,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28809,9 +29744,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -29306,6 +30238,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29390,6 +30325,9 @@ 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 ""
@@ -29408,12 +30346,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29444,10 +30388,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29489,7 +30433,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29504,7 +30448,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29546,6 +30490,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29576,6 +30523,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29603,9 +30553,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29618,6 +30565,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29681,6 +30631,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29723,18 +30676,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29906,6 +30847,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -30203,6 +31147,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -30236,6 +31183,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30568,6 +31518,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30718,10 +31671,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30784,12 +31737,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30814,9 +31761,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30943,23 +31887,29 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30968,13 +31918,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -31061,6 +32008,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -31073,6 +32023,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -31094,10 +32047,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -31163,6 +32116,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -31295,6 +32263,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31466,9 +32437,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31646,6 +32614,12 @@ 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|Packages"
msgstr ""
@@ -31748,6 +32722,96 @@ 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 ""
@@ -31757,7 +32821,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31778,7 +32842,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31949,6 +33013,12 @@ 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 ""
@@ -31991,6 +33061,9 @@ 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 ""
@@ -32006,6 +33079,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -32015,9 +33091,15 @@ 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 ""
@@ -32090,6 +33172,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -32207,6 +33292,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -32254,9 +33342,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32374,6 +33459,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32440,6 +33528,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32461,15 +33552,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32668,6 +33771,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32689,6 +33798,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32746,10 +33858,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32758,7 +33870,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32785,64 +33897,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32881,6 +34002,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32908,7 +34032,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -33077,10 +34201,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -33176,9 +34297,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -33188,6 +34306,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -33254,7 +34375,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -33269,6 +34390,9 @@ 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 ""
@@ -33317,6 +34441,9 @@ 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 ""
@@ -33464,6 +34591,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33581,6 +34711,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33812,9 +34945,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33986,6 +35116,9 @@ 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 profile"
msgstr ""
@@ -34043,6 +35176,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -34068,6 +35204,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -34281,6 +35420,9 @@ 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 ""
@@ -34414,6 +35556,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34571,6 +35716,9 @@ msgstr[3] ""
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 ""
@@ -34714,6 +35862,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34810,9 +35961,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34856,9 +36004,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34976,6 +36121,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -35060,7 +36208,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -35141,6 +36289,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -35150,9 +36301,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -35201,9 +36358,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35500,6 +36654,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35527,6 +36687,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35554,9 +36717,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/mk_MK/gitlab.po b/locale/mk_MK/gitlab.po
index 75a0602686c..50d6990e12a 100644
--- a/locale/mk_MK/gitlab.po
+++ b/locale/mk_MK/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: mk\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:59\n"
+"PO-Revision-Date: 2021-03-05 23:56\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -170,6 +173,11 @@ 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] ""
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ 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 ""
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -682,6 +710,15 @@ 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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -976,6 +1016,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -988,9 +1031,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1015,9 +1055,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1111,6 +1148,11 @@ 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] ""
@@ -1162,6 +1204,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1282,6 +1327,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1635,9 +1779,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1716,12 +1857,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1818,6 +1965,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1938,6 +2103,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2058,6 +2226,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2091,6 +2268,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2259,6 +2442,15 @@ 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 ""
@@ -2268,6 +2460,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2361,6 +2562,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2394,6 +2607,21 @@ 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 ""
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2483,9 +2714,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2576,9 +2792,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,9 +2813,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,49 +2837,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,76 +2867,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,13 +2927,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2954,7 +3104,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2996,6 +3146,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3146,12 +3293,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3269,6 +3425,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3296,12 +3455,18 @@ 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 ""
@@ -3344,7 +3509,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3395,10 +3566,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3757,9 +3928,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3787,6 +3955,9 @@ 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 erase this build?"
msgstr ""
@@ -4048,12 +4219,6 @@ msgstr[1] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5028,6 +5235,26 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5688,7 +5915,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5703,6 +5930,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6036,21 +6266,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7325,16 +7594,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7349,6 +7642,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7391,6 +7729,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7430,6 +7771,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7451,6 +7795,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8245,10 +8577,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8302,6 +8637,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8314,6 +8652,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8329,6 +8670,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,13 +8991,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8647,7 +9024,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8689,6 +9066,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8722,6 +9102,18 @@ 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 ""
@@ -8886,7 +9278,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 ""
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9261,9 +9682,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9318,6 +9736,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9429,6 +9856,15 @@ 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 ""
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9660,6 +10093,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9678,9 +10114,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9690,19 +10123,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9717,10 +10150,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9735,7 +10165,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9756,10 +10186,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9768,7 +10204,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10047,18 +10482,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,7 +10710,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11048,19 +11468,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
-msgstr ""
-
-msgid "Enter the issue title"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11345,6 +11759,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11369,6 +11786,12 @@ 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 ""
@@ -11396,6 +11819,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11423,6 +11849,9 @@ 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 ""
@@ -11447,9 +11876,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11882,6 +12320,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11915,6 +12356,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12038,10 +12482,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12068,6 +12512,12 @@ 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 ""
@@ -12104,9 +12554,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,10 +12602,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12826,6 +13279,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12856,7 +13345,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12934,9 +13423,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13096,6 +13585,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13135,6 +13627,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13144,6 +13639,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13291,6 +13801,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13330,6 +13840,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13828,6 +14344,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14630,6 +15164,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15703,96 +16240,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16078,9 +16543,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ 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 ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ 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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16972,6 +17518,9 @@ 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 ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] ""
msgstr[1] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17085,6 +17640,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17118,6 +17676,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17169,9 +17730,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17181,6 +17739,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19590,6 +20253,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19737,6 +20406,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19788,6 +20466,9 @@ 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 ""
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ 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."
+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."
@@ -20552,7 +21257,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20579,10 +21290,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20651,6 +21362,9 @@ 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 ""
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20762,6 +21473,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21077,6 +21809,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21284,9 +22028,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21308,10 +22049,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,10 +22154,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ 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 ""
@@ -21665,6 +22415,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21923,21 +22685,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21959,6 +22739,12 @@ 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 ""
@@ -22067,6 +22853,9 @@ 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 ""
@@ -22151,24 +22940,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22205,6 +22976,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22562,6 +23336,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22790,10 +23567,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22805,7 +23579,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,13 +23672,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22937,13 +23714,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22970,16 +23750,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,52 +23816,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23381,6 +24164,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23396,6 +24188,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23408,22 +24206,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23432,6 +24230,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23522,9 +24326,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23675,7 +24476,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23771,7 +24572,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24072,6 +24921,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24243,6 +25098,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,7 +25269,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25595,7 +26480,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25721,6 +26612,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,10 +26627,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,19 +26744,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26161,7 +27062,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26338,6 +27239,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] ""
msgstr[1] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27287,9 +28194,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27479,12 +28383,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27989,67 +28896,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28136,6 +29043,12 @@ 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 ""
@@ -28145,7 +29058,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ 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 ""
@@ -29076,12 +30004,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29112,10 +30046,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29157,7 +30091,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29574,6 +30505,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30382,10 +31325,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30735,6 +31675,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30756,10 +31699,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31308,6 +32266,12 @@ 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|Packages"
msgstr ""
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ 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 ""
@@ -31653,6 +32713,9 @@ 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 ""
@@ -31668,6 +32731,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ 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 ""
@@ -31752,6 +32824,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31912,9 +32990,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32032,6 +33107,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,10 +33847,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32832,9 +33943,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ 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 ""
@@ -33120,6 +34237,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33237,6 +34357,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33642,6 +34762,9 @@ 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 profile"
msgstr ""
@@ -33699,6 +34822,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 ""
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34215,6 +35350,9 @@ 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 ""
@@ -34354,6 +35492,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34698,7 +35836,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35128,6 +36272,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/mn_MN/gitlab.po b/locale/mn_MN/gitlab.po
index e27d59bb59c..4020e05022f 100644
--- a/locale/mn_MN/gitlab.po
+++ b/locale/mn_MN/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: mn\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 18:00\n"
+"PO-Revision-Date: 2021-03-05 23:57\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -170,6 +173,11 @@ 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] ""
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ 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 ""
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -682,6 +710,15 @@ 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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -976,6 +1016,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -988,9 +1031,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1015,9 +1055,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1111,6 +1148,11 @@ 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] ""
@@ -1162,6 +1204,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1282,6 +1327,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1635,9 +1779,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1716,12 +1857,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1818,6 +1965,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1938,6 +2103,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2058,6 +2226,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2091,6 +2268,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2259,6 +2442,15 @@ 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 ""
@@ -2268,6 +2460,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2361,6 +2562,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2394,6 +2607,21 @@ 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 ""
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2483,9 +2714,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2576,9 +2792,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,9 +2813,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,49 +2837,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,76 +2867,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,13 +2927,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2954,7 +3104,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2996,6 +3146,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3146,12 +3293,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3269,6 +3425,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3296,12 +3455,18 @@ 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 ""
@@ -3344,7 +3509,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3395,10 +3566,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3757,9 +3928,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3787,6 +3955,9 @@ 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 erase this build?"
msgstr ""
@@ -4048,12 +4219,6 @@ msgstr[1] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5028,6 +5235,26 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5688,7 +5915,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5703,6 +5930,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6036,21 +6266,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7325,16 +7594,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7349,6 +7642,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7391,6 +7729,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7430,6 +7771,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7451,6 +7795,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8245,10 +8577,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8302,6 +8637,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8314,6 +8652,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8329,6 +8670,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,13 +8991,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8647,7 +9024,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8689,6 +9066,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8722,6 +9102,18 @@ 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 ""
@@ -8886,7 +9278,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 ""
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9261,9 +9682,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9318,6 +9736,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9429,6 +9856,15 @@ 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 ""
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9660,6 +10093,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9678,9 +10114,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9690,19 +10123,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9717,10 +10150,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9735,7 +10165,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9756,10 +10186,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9768,7 +10204,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10047,18 +10482,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,7 +10710,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11048,19 +11468,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
-msgstr ""
-
-msgid "Enter the issue title"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11345,6 +11759,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11369,6 +11786,12 @@ 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 ""
@@ -11396,6 +11819,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11423,6 +11849,9 @@ 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 ""
@@ -11447,9 +11876,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11882,6 +12320,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11915,6 +12356,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12038,10 +12482,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12068,6 +12512,12 @@ 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 ""
@@ -12104,9 +12554,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,10 +12602,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12826,6 +13279,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12856,7 +13345,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12934,9 +13423,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13096,6 +13585,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13135,6 +13627,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13144,6 +13639,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13291,6 +13801,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13330,6 +13840,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13828,6 +14344,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14630,6 +15164,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15703,96 +16240,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16078,9 +16543,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ 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 ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ 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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16972,6 +17518,9 @@ 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 ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] ""
msgstr[1] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17085,6 +17640,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17118,6 +17676,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17169,9 +17730,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17181,6 +17739,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19590,6 +20253,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19737,6 +20406,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19788,6 +20466,9 @@ 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 ""
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ 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."
+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."
@@ -20552,7 +21257,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20579,10 +21290,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20651,6 +21362,9 @@ 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 ""
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20762,6 +21473,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21077,6 +21809,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21284,9 +22028,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21308,10 +22049,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,10 +22154,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ 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 ""
@@ -21665,6 +22415,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21923,21 +22685,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21959,6 +22739,12 @@ 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 ""
@@ -22067,6 +22853,9 @@ 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 ""
@@ -22151,24 +22940,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22205,6 +22976,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22562,6 +23336,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22790,10 +23567,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22805,7 +23579,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,13 +23672,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22937,13 +23714,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22970,16 +23750,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,52 +23816,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23381,6 +24164,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23396,6 +24188,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23408,22 +24206,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23432,6 +24230,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23522,9 +24326,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23675,7 +24476,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23771,7 +24572,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24072,6 +24921,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24243,6 +25098,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,7 +25269,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25595,7 +26480,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25721,6 +26612,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,10 +26627,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,19 +26744,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26161,7 +27062,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26338,6 +27239,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] ""
msgstr[1] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27287,9 +28194,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27479,12 +28383,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27989,67 +28896,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28136,6 +29043,12 @@ 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 ""
@@ -28145,7 +29058,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ 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 ""
@@ -29076,12 +30004,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29112,10 +30046,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29157,7 +30091,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29574,6 +30505,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30382,10 +31325,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30735,6 +31675,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30756,10 +31699,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31308,6 +32266,12 @@ 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|Packages"
msgstr ""
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ 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 ""
@@ -31653,6 +32713,9 @@ 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 ""
@@ -31668,6 +32731,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ 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 ""
@@ -31752,6 +32824,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31912,9 +32990,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32032,6 +33107,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,10 +33847,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32832,9 +33943,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ 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 ""
@@ -33120,6 +34237,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33237,6 +34357,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33642,6 +34762,9 @@ 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 profile"
msgstr ""
@@ -33699,6 +34822,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 ""
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34215,6 +35350,9 @@ 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 ""
@@ -34354,6 +35492,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34698,7 +35836,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35128,6 +36272,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/nb_NO/gitlab.po b/locale/nb_NO/gitlab.po
index 38a7d3755bf..5e4999b3273 100644
--- a/locale/nb_NO/gitlab.po
+++ b/locale/nb_NO/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: nb\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:10\n"
+"PO-Revision-Date: 2021-03-05 23:52\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr " eller referanser (f.eks. filbane/til/prosjekt!merge_request_id)"
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr "\"%{path}\" finness ikke på \"%{ref}\""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr "\"el\"-parameteret er påkrevd for createInstance()"
@@ -170,6 +173,11 @@ msgid_plural "%d days"
msgstr[0] "%d dag"
msgstr[1] "%d dager"
+msgid "%d epic"
+msgid_plural "%d epics"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d error"
msgid_plural "%d errors"
msgstr[0] "%d feil"
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] "%d sårbarhet avvist"
msgstr[1] "%d sårbarheter avvist"
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ msgstr "%{edit_in_new_fork_notice} Prøv å tilbakestille denne commiten igjen."
msgid "%{edit_in_new_fork_notice} Try to upload a file again."
msgstr "%{edit_in_new_fork_notice} Prøv å laste opp en fil igjen."
+msgid "%{emailPrefix}@company.com"
+msgstr ""
+
msgid "%{extra} more downstream pipelines"
msgstr "%{extra} flere nedstrømsrørledninger"
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr "%{issuesSize} med en grense på %{maxIssueCount}"
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr "%{name} inneholdt %{resultsString}"
@@ -682,6 +710,15 @@ msgstr[1] "%{no_of_days} dager"
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr "%{number_commits_behind} commiter bak %{default_branch}, %{number_commits_ahead} commiter foran"
+msgid "%{oneMonthAgo} - %{today}"
+msgstr ""
+
+msgid "%{oneWeekAgo} - %{today}"
+msgstr ""
+
+msgid "%{oneYearAgo} - %{today}"
+msgstr ""
+
msgid "%{openOrClose} %{noteable}"
msgstr "%{openOrClose} %{noteable}"
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr "%{spanStart}i linje%{spanEnd} %{errorLine}%{errorColumn}"
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr "%{spanStart}i%{spanEnd} %{errorFn}"
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr "%{start} til %{end}"
@@ -953,6 +990,9 @@ msgstr "'%{name}'-verdistrøm opprettet"
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr "'%{name}'-trinnet finnes allerede"
@@ -976,6 +1016,9 @@ msgstr "(%{value}) har allerede blitt tatt"
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr "(Ingen endringer)"
@@ -988,9 +1031,6 @@ msgstr "(sjekk fremgang)"
msgid "(deleted)"
msgstr "(slettet)"
-msgid "(line: %{startLine})"
-msgstr "(linje: %{startLine})"
-
msgid "(max size 15 MB)"
msgstr "(maks størrelse 15 MB)"
@@ -1015,9 +1055,6 @@ msgstr "+ %{moreCount} til"
msgid "+ %{numberOfHiddenAssignees} more"
msgstr "+ %{numberOfHiddenAssignees} til"
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] "+%d til"
@@ -1111,6 +1148,11 @@ 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] "1 gruppe"
@@ -1162,6 +1204,9 @@ msgstr "1-9 bidrag"
msgid "10-19 contributions"
msgstr "10-19 bidrag"
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr "Første bidrag!"
@@ -1282,6 +1327,9 @@ msgstr "En gruppe representerer organisasjonen din i GitLab. Grupper lar deg adm
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr "API-hjelp"
msgid "API Token"
msgstr "API-token"
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr "AWS tilgangsnøkkel"
@@ -1635,9 +1779,6 @@ msgstr "Legg til en GPG-nøkkel"
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr "Legg til et gjøremål"
-
msgid "Add a bullet list"
msgstr "Legg til en punktliste"
@@ -1716,12 +1857,18 @@ msgstr "Legg til kommentar til design"
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 domain"
msgstr "Legg til domene"
msgid "Add email address"
msgstr "Legg til E-postadresse"
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr "Legg til miljø"
@@ -1818,6 +1965,21 @@ msgstr "Legg til tidligere innflettede commiter"
msgid "AddContextCommits|Add/remove"
msgstr "Legg til/Fjern"
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr "Ingen brukere spesifisert."
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr "Legger til en sak i en epos."
+msgid "Adds email participant(s)"
+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 "Juster dine filtre/søkekriterier ovenfor. Hvis du mener at dette kan være en feil, kan du se dokumentasjonen for %{linkStart}Geo-feilsøking%{linkEnd} for mer informasjon."
@@ -1938,6 +2103,9 @@ msgstr "Utvikler"
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr "Gjest"
@@ -2058,6 +2226,12 @@ msgstr "GÃ¥ til Generelle innstillinger"
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr "Integrasjoner som konfigureres her vil automatisk gjelde for alle prosjekter i denne instansen."
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr "Flyttet til integrasjoner"
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr "Tjenestemaler lar deg bestemme standardverdier for integrasjoner"
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2091,6 +2268,9 @@ msgstr "Noen innstillinger har blitt flyttet"
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
msgstr "Spesifiser et domene som skal brukes som standard for hvert enkelt prosjekts autogjennomgangsapper og autodistribusjonstrinn."
+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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr "Den nødvendige rørledningskonfigurasjonen kan velges fra %{code_start}gitlab-ci%{code_end}-mappen inni det konfigurerte %{link_start}instansmal-lageret%{link_end} eller fra de GitLab-leverte konfigurasjonene."
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr "Aktiv"
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr "Admin"
@@ -2259,6 +2442,15 @@ msgstr "Eksterne brukere kan ikke se interne eller private prosjekter med mindre
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 "Benytter setet"
@@ -2268,6 +2460,9 @@ msgstr "Det er deg!"
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr "Ny bruker"
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr "Brukeren vil ikke kunne gå inn på git-kodelagre"
@@ -2361,6 +2562,18 @@ msgstr "Brukeren vil ikke kunne logge på"
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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr "Når brukeren logger på igjen, blir kontoen deres reaktivert som en fullt aktiv konto"
@@ -2394,6 +2607,21 @@ msgstr "Du kan ikke fjerne dine egne adminrettigheter."
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 "Administrasjon"
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr "Avanserte innstillinger"
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr "Avanserte tillatelser, stor fillagring, og 2-trinnsautentiseringsinnstillinger."
@@ -2483,9 +2714,6 @@ msgstr "Autoriser ekstern tjeneste"
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-msgstr "Kritisk"
-
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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr "Hendelser"
-msgid "AlertManagement|High"
-msgstr "Høy"
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr "Info"
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr "Lav"
-
-msgid "AlertManagement|Medium"
-msgstr "Medium"
-
msgid "AlertManagement|Metrics"
msgstr "MÃ¥ltall"
@@ -2576,9 +2792,6 @@ msgstr "En feil oppstod under visning av varselet. Oppdater siden for å prøve
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr "En feil oppstod under visning av alarmene. Bekreft ditt endepunkts konfigurasjonsdetaljer for å sikre at alarmer vises."
-msgid "AlertManagement|There was an error while updating the To-Do of the alert."
-msgstr "Det oppstod en feil under oppdatering av alarmens gjøremål."
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr "En feil oppstod under oppdatering av listen over tilordnede. Vennligst prøv igjen."
@@ -2588,6 +2801,9 @@ msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
msgstr "Det oppstod en feil under oppdatering av alarmens status."
+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 "Denne tilordnede kan ikke tilordnes dette varselet."
@@ -2597,9 +2813,6 @@ msgstr "Verktøy"
msgid "AlertManagement|Triggered"
msgstr "Trigget"
-msgid "AlertManagement|Unknown"
-msgstr "Ukjent"
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,50 +2837,17 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr "Gå gjennom dokumentasjonen til din eksterne tjeneste for å lære hvor du kan gi denne informasjonen til din eksterne tjeneste, og %{linkStart}GitLab-dokumentasjonen%{linkEnd} for å lære mer om å sette opp ditt endepunkt."
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr "Du må oppgi denne URL-en og autorisasjonsnøkkelen for å autorisere en ekstern tjeneste til å sende varsler til GitLab. Du kan oppgi denne URL-en og nøkkelen til flere tjenester. Etter at du har konfigurert en ekstern tjeneste, vises varsler fra tjenesten din på GitLab sin %{linkStart}Alarmer%{linkEnd}-side."
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr "API-URL"
-
-msgid "AlertSettings|Active"
-msgstr "Aktiv"
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr "Legg til URL og autoriseringsnøkkel i din Prometheus-oppsettsfil"
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr "Autorisasjonsnøkkel"
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
-msgstr "Kopier"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
+msgstr ""
msgid "AlertSettings|Delete integration"
msgstr ""
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr "Ekstern Prometheus"
@@ -2690,52 +2867,43 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr "Gå gjennom dokumentasjonen til din eksterne tjeneste for å lære hvor du kan gi denne informasjonen til din eksterne tjeneste, og %{linkStart}GitLab-dokumentasjonen%{linkEnd} for å lære mer om å sette opp ditt endepunkt."
-
-msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
-msgid "AlertSettings|Save and test payload"
+msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
msgid "AlertSettings|Save integration"
@@ -2744,24 +2912,12 @@ msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|Test alert payload"
+msgid "AlertSettings|Send test alert"
msgstr ""
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
-msgstr ""
-
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
-msgstr "Det oppstod en feil under tilbakestilling av nøkkelen. Oppdater siden for å prøve igjen."
-
msgid "AlertSettings|URL cannot be blank and must start with http or https"
msgstr ""
@@ -2771,15 +2927,15 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
+msgid "AlertSettings|View credentials"
+msgstr ""
+
msgid "AlertSettings|Webhook URL"
msgstr "Webhook-URL"
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 "Du kan nå sette opp varslings-endepunkter for manuelt konfigurerte Prometheus-instans i Varsler-seksjonen på operasjonsinnstillingsside. Feltet for varslings-endepunkter på denne siden har blitt utfaset."
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr "Du må oppgi denne URL-en og autorisasjonsnøkkelen for å autorisere en ekstern tjeneste til å sende varsler til GitLab. Du kan oppgi denne URL-en og nøkkelen til flere tjenester. Etter at du har konfigurert en ekstern tjeneste, vises varsler fra tjenesten din på GitLab sin %{linkStart}Alarmer%{linkEnd}-side."
-
msgid "AlertSettings|Your integration was successfully updated."
msgstr ""
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr "Varsler"
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr "Alle prosjekter"
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr "Alle sikkerhetsskanninger er aktivert fordi %{linkStart}Auto DevOps%{linkEnd} er aktivert på dette prosjektet"
-
msgid "All threads resolved"
msgstr "Alle tråder er oppklart"
@@ -2954,7 +3104,7 @@ msgstr "Tillat forespørsler til det lokale nettverket fra Webhooks og tjenester
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2996,6 +3146,9 @@ msgstr "Lar deg legge til og behandle Kubernetes-klynger."
msgid "Almost there"
msgstr "Nesten der"
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr "En feil har oppstått"
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr "En feil oppstod under tillegging av et utkast til tråden."
@@ -3146,12 +3293,18 @@ msgstr "En feil oppstod under avvisning av meldingen. Oppdater siden og prøv ig
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 "En feil oppstod under påskruing av tjenestedesken."
msgid "An error occurred while fetching branches. Retry the search."
msgstr "Det oppstod en feil under innhenting av grener. Prøv søket på nytt."
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr "Det oppstod en feil under innhenting av commiter. Prøv søket på nytt."
@@ -3176,6 +3329,9 @@ msgstr "En feil oppstod under innhenting av stempelfarger."
msgid "An error occurred while fetching markdown preview"
msgstr "En feil oppstod under forhåndsvisning av markdown"
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr "En feil oppstod under innhenting av ventende kommentarer"
@@ -3269,6 +3425,9 @@ msgstr "Det oppstod en feil under innlasting av fletteforespørsler."
msgid "An error occurred while loading project creation UI"
msgstr "En feil oppstod under innlasting av prosjektopprettings-grensesnittet"
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr "En feil oppstod under innlasting av dataene. Vennligst prøv igjen."
@@ -3296,12 +3455,18 @@ msgstr "En feil oppstod under innlasting av fletteforepørsels-versjonsdataene."
msgid "An error occurred while loading the merge request."
msgstr "En feil oppstod under innlasting av fletteforespørselsen."
+msgid "An error occurred while loading the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while loading the pipeline."
msgstr ""
msgid "An error occurred while loading the pipelines jobs."
msgstr "En feil oppstod under innhenting av rørledningsjobbene."
+msgid "An error occurred while loading your content. Please try again."
+msgstr ""
+
msgid "An error occurred while making the request."
msgstr "Det oppsto en feil under forespørselsforsøket."
@@ -3344,8 +3509,11 @@ msgstr "En feil oppstod under innhenting av diff-filer"
msgid "An error occurred while retrieving projects."
msgstr "Det oppstod en feil under innhenting av prosjekter."
-msgid "An error occurred while saving assignees"
-msgstr "En feil oppstod under lagring av tilordnede"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
+msgstr ""
msgid "An error occurred while subscribing to notifications."
msgstr "En feil oppstod under abonnering på varsler."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr "En feil oppstod under validering av gruppebanen"
@@ -3395,12 +3566,12 @@ msgstr "En feil oppstod. Vennligst logg inn på nytt."
msgid "An error occurred. Please try again."
msgstr "En feil oppstod. Vennligst prøv igjen."
-msgid "An error ocurred while loading your content. Please try again."
-msgstr "En feil oppstod under innlasting av innholdet ditt. Vennligst prøv igjen."
-
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 ""
@@ -3757,9 +3928,6 @@ msgstr "Er du sikker på at du vil avbryte redigeringen av denne kommentaren?"
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr "Er du sikker på at du vil slette %{name}?"
@@ -3787,6 +3955,9 @@ msgstr "Er du sikker på at du vil distribuere dette miljøet?"
msgid "Are you sure you want to discard this comment?"
msgstr "Er du sikker på at du vil forkaste denne kommentaren?"
+msgid "Are you sure you want to discard your changes?"
+msgstr ""
+
msgid "Are you sure you want to erase this build?"
msgstr "Er du sikker på at du vil slette denne byggversjonen?"
@@ -4048,12 +4219,6 @@ msgstr[1] "Legger ved %d filer"
msgid "Attaching the file failed."
msgstr "Vedlegging av filen mislyktes."
-msgid "Attachment"
-msgstr "Vedlegg"
-
-msgid "Attachments"
-msgstr "Vedlegg"
-
msgid "Audit Events"
msgstr ""
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr "Autentiserer"
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr "Autentiseringsfeil"
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 "Bitbucket-tjenerimportering"
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr "Grennavn"
msgid "Branch not loaded - %{branchId}"
msgstr "Grenen ble ikke lastet inn - %{branchId}"
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr "Søk i grener"
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr "Bytt gren"
-
msgid "Branches"
msgstr "Grener"
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr "Arbeid"
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr "Kjøp lisens"
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr "Som standard sender GitLab e-post i HTML- og rentekst-formater slik at e-postklienter kan velge hvilket format de skal bruke. Deaktiver dette alternativet hvis du bare vil sende e-post i rentekstformat."
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5028,6 +5235,26 @@ msgstr "CI/CD for eksternt kodelager"
msgid "CI/CD settings"
msgstr "CI/CD-innstillinger"
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr "Avbryt"
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr "Avbryt indekssletting"
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr "Tilbakestill i grenen"
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr "Kontrollerer %{text} tilgjengelighet …"
@@ -5688,8 +5915,8 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
-msgstr "Velg synlighetsnivå, (de)aktiver prosjektets funksjoner (saker,kodelager, wiki, snippets) og bestem tillatelser."
+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 "Velg hvilket innhold du vil se på en gruppes oversiktsside."
@@ -5703,6 +5930,9 @@ msgstr ""
msgid "Choose your framework"
msgstr "Velg ditt rammeverk"
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr "avbrutt"
@@ -6036,21 +6266,42 @@ msgstr "Klynge-nivå"
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr "Denne funksjonen er bare tilgjengelig for Premium-planer"
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr "Brukeren har ikke tilstrekkelige tillatelser til å opprette en sjetong for dette prosjektet"
@@ -7071,6 +7334,9 @@ msgstr "En feil oppstod under innlasting av klynger"
msgid "Code"
msgstr "Kode"
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr "Kodedekning: %{coveragePercentage}%{percentSymbol}"
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr "Slå sammen godkjennere"
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr "Klapp sammen milepæler"
@@ -7325,17 +7594,41 @@ msgstr "Sammenlign med forrige versjon"
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr "%{source_branch} og %{target_branch} er de samme."
-msgid "CompareBranches|Compare"
-msgstr "Sammenlign"
+msgid "CompareBranches|There isn't anything to compare."
+msgstr "Det er ikke noe å sammenligne."
-msgid "CompareBranches|Source"
-msgstr "Kilde"
+msgid "CompareRevisions|Branches"
+msgstr ""
-msgid "CompareBranches|Target"
-msgstr "MÃ¥l"
+msgid "CompareRevisions|Compare"
+msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
-msgstr "Det er ikke noe å sammenligne."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
+msgstr ""
msgid "Complete"
msgstr "Fullført"
@@ -7349,6 +7642,12 @@ msgstr "Overholdelse"
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr "GDPR"
@@ -7391,6 +7729,9 @@ msgstr "HIPAA"
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr "HIPAA - Health Insurance Portability and Accountability Act"
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr "PCI-DSS"
@@ -7430,6 +7771,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr "Konfigurer Gitaly-tidsavbrudd."
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr "Sett opp Let's Encrypt"
@@ -7451,6 +7795,9 @@ msgstr "Sett opp eksisterende installasjon"
msgid "Configure limit for issues created per minute by web and API requests."
msgstr "Konfigurer grensen for saker opprettet per minutt av nett- og API-forespørsler."
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr "Sammendrag: %{imageId}"
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr "Utløpsretningslinjer hjelper deg med å administrere lagringsplassen som brukes av container-registeret, men utløpsretningslinjene for dette registeret er deaktivert. Kontakt administratoren din for å aktivere. %{docLinkStart}Mer informasjon%{docLinkEnd}"
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-msgstr "Filtrer etter navn"
-
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 "Hvis du ikke allerede er logget inn, må du autentisere deg til container-registeret ved å bruke ditt GitLab-brukernavn og -passord. Hvis du har %{twofaDocLinkStart}2-trinnsautentisering%{twofaDocLinkEnd} aktivert, kan du bruke en %{personalAccessTokensDocLinkStart}personlig tilgangssjetong%{personalAccessTokensDocLinkEnd} i stedet for et passord."
-msgid "ContainerRegistry|Image Repositories"
-msgstr "Bildekodelagre"
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr "Klarte ikke å finne designet."
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr "Land"
@@ -8245,12 +8577,12 @@ msgstr ""
msgid "Create a merge request"
msgstr "Opprett en fletteforespørsel"
+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 "Opprette en ny gren"
-msgid "Create a new deploy key for this project"
-msgstr ""
-
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr "Opprett en ny fil siden det ikke er noen filer ennå. Etterpå vil du kunne utføre endringene dine."
@@ -8275,6 +8607,9 @@ 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 "Koble til og lever din %{link_start}personlige GitHub-tilgangssjetong%{link_end}. Du vil måtte velge %{code_open}kodelager%{code_close}-omfanget, så vi kan vise en liste over dine offentlige og private kodelagre som er tilgjengelige for å importere."
+msgid "Create blank project"
+msgstr ""
+
msgid "Create branch"
msgstr "Opprett gren"
@@ -8302,6 +8637,9 @@ msgstr "Lag en fil"
msgid "Create from"
msgstr "Opprett fra"
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr "Opprett gruppe"
@@ -8314,6 +8652,9 @@ msgstr "Lag en rapport"
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8329,6 +8670,12 @@ msgstr "Opprett milepæl"
msgid "Create new"
msgstr "Opprett ny"
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr "Opprettelsesdato"
msgid "Credentials"
msgstr "Legitimasjon"
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,14 +8991,14 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
-msgstr "Profil"
+msgid "CurrentUser|One of your groups is running out"
+msgstr ""
-msgid "CurrentUser|Settings"
-msgstr "Innstillinger"
+msgid "CurrentUser|Preferences"
+msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
@@ -8647,8 +9024,8 @@ msgstr "Tilpassede målinger"
msgid "Custom notification events"
msgstr "Tilpassede varslingshendelser"
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
-msgstr "Tilpassede varslingsnivåer er de samme som deltakelsesnivåer. Med tilpassede varslingsnivåer vil du også motta varsler om utvalgte hendelser. For å finne ut mer, sjekk ut %{notification_link}."
+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 "Tilpassede prosjektmaler"
@@ -8689,6 +9066,9 @@ msgstr "Kundeportal"
msgid "Customizable by an administrator."
msgstr "Justerbar av en administrator"
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr "Tilpass farger"
@@ -8722,6 +9102,18 @@ msgstr "Denne siden viser en liste over prosjektene dine som standard, men den k
msgid "Cycle Time"
msgstr "Syklustid"
+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 "Sak lukket"
@@ -8886,8 +9278,8 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
-msgstr "DAST-profiler"
+msgid "DAST Scans"
+msgstr ""
msgid "DNS"
msgstr "DNS"
@@ -9042,8 +9434,14 @@ msgstr "Ny skannerprofil"
msgid "DastProfiles|New site profile"
msgstr "Ny nettstedsprofil"
-msgid "DastProfiles|No profiles created yet"
-msgstr "Ingen profiler er opprettet enda"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
+msgstr ""
msgid "DastProfiles|Not Validated"
msgstr ""
@@ -9066,6 +9464,9 @@ msgstr "Profilnavn"
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 ""
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr "Dag i måneden"
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr "Feilsøk"
@@ -9261,9 +9682,6 @@ msgstr "Avvis og logg ut"
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr "Standardgren"
-
msgid "Default CI configuration path"
msgstr ""
@@ -9318,6 +9736,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr "forsinket"
msgid "Delete"
msgstr "Slett"
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr "Slett dette vedlegget"
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr "Slett brukerliste"
@@ -9429,6 +9856,15 @@ 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 "Slettet"
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
-msgstr ""
-
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
-msgstr "Angi tidspunkter når distribusjoner ikke er tillatt for et miljø. %{filename}-filen må oppdateres for å gjøre distribusjonsjobber oppmerksomme på %{freeze_period_link_start}fryseperioden%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
+msgstr ""
msgid "DeployFreeze|Time zone"
msgstr "Tidssone"
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr "+%{count} andre"
@@ -9660,6 +10093,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr "Utvid %{count} andre prosjekter"
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9678,9 +10114,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr "Kun lesetilgang"
-msgid "DeployKeys|Write access allowed"
-msgstr "Skrivetilgang er tillatt"
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9690,20 +10123,20 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
-msgstr "Tillater lesetilgang til pakkeregisteret"
+msgid "DeployTokens|Allows read access to the package registry."
+msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
-msgstr "Tillater skrivetilgang til pakkeregisteret"
+msgid "DeployTokens|Allows write access to registry images."
+msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
-msgstr "Tillater skrivetilgang til registerbildene"
+msgid "DeployTokens|Allows write access to the package registry."
+msgstr ""
msgid "DeployTokens|Copy deploy token"
msgstr ""
@@ -9717,10 +10150,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr "Opprettet"
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9735,7 +10165,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr "Navn"
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9756,11 +10186,17 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr "Denne handlingen kan ikke angres på."
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
-msgstr "Bruk dette brukernavnet som en innlogging."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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 "Brukernavn"
@@ -9768,7 +10204,7 @@ msgstr "Brukernavn"
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr "API"
@@ -10047,18 +10482,6 @@ msgstr ""
msgid "DevOps Report"
msgstr "DevOps-rapport"
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,7 +10710,7 @@ msgstr "Gi tilbakemelding på denne siden"
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr "E-post %{number}"
msgid "Email Notification"
msgstr "E-postvarsling"
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr "tilbakestill den"
-
-msgid "EmailToken|resetting..."
-msgstr "tilbakestiller …"
-
msgid "Emails"
msgstr "E-poster"
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr "Skru på integrering"
@@ -11048,20 +11468,14 @@ msgstr "Skriv inn antall saker"
msgid "Enter one or more user ID separated by commas"
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."
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the issue description"
-msgstr "Skriv inn sakens beskrivelse"
-
-msgid "Enter the issue title"
-msgstr "Skriv inn sakstittelen"
-
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
-msgstr "Skriv inn fletteforespørselens tittel"
+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 name of your application, and we'll return a unique %{type}."
msgstr ""
@@ -11345,6 +11759,9 @@ msgstr "beskyttet"
msgid "Epic"
msgstr "Epos"
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr "Eposen ble ikke funnet."
@@ -11369,6 +11786,12 @@ 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 "Legg til et nytt epos"
@@ -11396,6 +11819,9 @@ msgstr "Hvordan kan jeg løse dette?"
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr "Fjern epos"
@@ -11423,6 +11849,9 @@ msgstr "Noe gikk galt under opprettelse av en sak."
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 ""
@@ -11447,9 +11876,6 @@ 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 "For å planlegge en epos sin %{epicDateType} dato basert på milepæler, tilordne en milepæl med %{epicDateType}-dato til enhver sak i eposen."
-msgid "Epics|Unable to perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr "Klarte ikke å lagre eposet. Vennligst prøv igjen"
@@ -11624,6 +12050,9 @@ msgstr "Feil under oppdatering av utdrag"
msgid "Error uploading file"
msgstr "Feil ved opplasting av fil"
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr "Feil under opplasting av fil: %{stripped}"
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr "Utvid godkjennere"
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr "Utvid milepæler"
@@ -11882,6 +12320,9 @@ msgstr "Utløper"
msgid "Expires at"
msgstr "Utløper på"
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr "Utløper om %{expires_at}"
@@ -11915,6 +12356,9 @@ msgstr "Utforsk offentlige grupper"
msgid "Export"
msgstr "Eksporter"
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr "Eksporter som CSV"
@@ -12038,10 +12482,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr "Klarte ikke å opprette fletteforespørsel. Vennligst prøv igjen."
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12068,6 +12512,12 @@ 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 ""
@@ -12104,9 +12554,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr "Mislyktes i å laste inn grupper og brukere."
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr "Klarte ikke å laste inn relaterte grener"
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,12 +12602,12 @@ msgstr "Mislyktes i å beskytte miljøet"
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
-msgstr ""
-
msgid "Failed to remove a Zoom meeting"
msgstr "Mislyktes i å fjerne et Zoom-møte"
+msgid "Failed to remove a to-do item for the design."
+msgstr ""
+
msgid "Failed to remove issue from board, please try again."
msgstr ""
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr "Mislyktes i å oppdatere-sakerstatus"
msgid "Failed to update issues, please try again."
msgstr "Mislyktes i å oppdatere saker, please try igjen."
-msgid "Failed to update tag!"
-msgstr "Mislyktes i å oppdatere etikett!"
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr "FogBugz-importering"
msgid "Folder/%{name}"
msgstr "Mappe/%{name}"
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr "Skriftfarge"
@@ -12826,6 +13279,42 @@ msgstr "Utgrein prosjektet"
msgid "Fork project?"
msgstr "Vil du utgreine prosjektet?"
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr "Utgreinet fra"
@@ -12856,8 +13345,8 @@ msgstr ""
msgid "Free Trial"
msgstr "Gratis prøveperiode"
-msgid "Free Trial of GitLab.com Gold"
-msgstr "Gratis prøveperiode for GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
+msgstr ""
msgid "Freeze end"
msgstr ""
@@ -12934,9 +13423,6 @@ msgstr "Geo"
msgid "Geo Nodes"
msgstr "Geo-noder"
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr "Geo-innstillinger"
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13096,6 +13585,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 "Juster dine filtre/søkekriterier ovenfor. Hvis du mener at dette kan være en feil, kan du se dokumentasjonen for %{linkStart}Geo-feilsøking%{linkEnd} for mer informasjon."
@@ -13135,6 +13627,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr "Mislykket"
@@ -13144,6 +13639,9 @@ msgstr "Filtrer etter status"
msgid "Geo|Geo Status"
msgstr "Geo Status"
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr "GÃ¥ til hovednettstedet"
@@ -13168,6 +13666,12 @@ msgstr "Forrige synkroniseringsforsøk"
msgid "Geo|Last time verified"
msgstr "Sist bekreftet"
+msgid "Geo|Learn more about Geo"
+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 "Aldri"
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr "Prosjekt"
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr "Status"
@@ -13291,6 +13801,9 @@ msgstr "Verifisering mislyktes - %{error}"
msgid "Geo|Waiting for scheduler"
msgstr "Venter på planlegger"
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr "Kom i gang"
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13330,6 +13840,9 @@ msgstr "Kom i gang!"
msgid "Getting started with releases"
msgstr "Ã… sette i gang med utgivelser"
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr "GitHub-import"
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr "GitLab"
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr "GÃ¥ til fullskjerm"
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr "GÃ¥ til Integrasjoner"
@@ -13780,6 +14293,9 @@ msgstr "Grafana-autentisering"
msgid "Grant access"
msgstr "Gi tilgang"
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr "Diagram"
@@ -13828,6 +14344,9 @@ msgstr ""
msgid "Group URL"
msgstr "Gruppe-URL"
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr "Gruppeavatar"
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr "Søk etter navn"
msgid "Guideline"
msgstr "Retningslinje"
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr "Her er alle prosjektene dine i gruppen din, inkludert den du nettopp opprettet. For å begynne, la oss ta en titt på ditt personlige læringsprosjekt som vil hjelpe deg å lære om GitLab i ditt eget tempo."
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr "Hei, %{username}!"
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr "Skjul arkiverte prosjekter"
@@ -14630,6 +15164,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr "Importer fra"
msgid "Import from Jira"
msgstr "Importer fra Jira"
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr "Installer en myksjetongautentikator som %{free_otp_link} eller Google Autentisering fra applikasjonskodelageret ditt og bruk den appen til å skanne QR-koden. Mer informasjon er tilgjengelig i dokumentasjonen %{help_link_start}%{help_link_end}."
-
msgid "Install on clusters"
msgstr "Installer i klynger"
@@ -15703,96 +16240,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr "Integrasjon"
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr "Alle detaljer"
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr "Kommentardetalj:"
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr "Standard "
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr "Inviter «%{trimmed}» via e-post"
msgid "Invite Members"
msgstr "Inviter medlemmer"
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr "Inviter gruppe"
@@ -16078,9 +16543,6 @@ msgstr "Inviter medlem"
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgstr ""
+
+msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
+msgstr ""
+
msgid "InviteEmail|Join now"
msgstr "Bli med nå"
+msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ msgstr "Saker lukket"
msgid "Issues with comments, merge requests with diffs and comments, labels, milestones, snippets, and other project entities"
msgstr "Saker med kommentarer, fletteforespørsler med differ og kommentarer, stempler, milepæler, utdrag og andre prosjektenheter"
+msgid "Issues with label %{label}"
+msgstr ""
+
msgid "Issues with no epic assigned"
msgstr "Saker uten noen tilordnede eposer"
@@ -16471,12 +17011,9 @@ msgstr ""
msgid "Iterations"
msgstr "Ringer"
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
-msgid "Iteration|cannot be in the past"
-msgstr "kan ikke være i fortiden"
-
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
@@ -16522,6 +17059,9 @@ msgstr "Jira-prosjekt: %{importProject}"
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 "Jira-brukere har blitt importert fra den konfigurerte Jira-instansen. De kan kartlegges ved å velge en GitLab-bruker fra nedfallsmenyen i kolonnen «GitLab-brukernavn». Når skjemaet vises, vil nedfallsmenyen som standard vise brukeren som utfører importeringen."
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr "Jira-prosjektnøkkel"
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr "Ã…pne Jira"
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr "Denne funksjonen krever en Premium-plan."
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ msgstr ""
msgid "Keep editing"
msgstr "Fortsett å redigere"
+msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
+msgstr ""
+
msgid "Kerberos access denied"
msgstr "Kerberos-tilgang ble nektet"
@@ -16891,9 +17440,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr "Kubernetes-feil: %{error_code}"
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr "LDAP"
@@ -16972,6 +17518,9 @@ 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 ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] "Siste %d dag"
msgstr[1] "Siste %d dager"
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr "Etternavn"
@@ -17085,6 +17640,9 @@ msgstr "Senest brukt:"
msgid "Last week"
msgstr "Forrige uke"
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr "forfattet"
@@ -17118,6 +17676,9 @@ msgstr "Lær GitLab"
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17169,9 +17730,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr "Lær mer om å signere commiter"
-msgid "Learn more about the dependency list"
-msgstr "Lær mer om avhengighetslisten"
-
msgid "Learn more in the"
msgstr "Lær mer i"
@@ -17181,6 +17739,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr "Forlat"
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr "List opp tilgjengelige kodelagre"
msgid "List of all merge commits"
msgstr "Liste over alle innflettings-commits"
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr "Laster inn saker"
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr "Maks tilgangsnivå"
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr "Maks antall %{name} (%{count}) har blitt overskredet"
@@ -18224,6 +18875,9 @@ msgstr "Fletteforespørselen %{mr_link} ble gjennomgått av %{mr_author}"
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr "Godkjenninger av fletteforespørsel"
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr "Legg til et svar"
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr "Svar …"
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr "Oppklar denne tråden i en ny sak"
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr "Sammenlign %{target} og %{source}"
@@ -19077,6 +19728,9 @@ msgstr "Mere informasjon."
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr "Mer enn %{number_commits_distance} commiter er annerledes fra %{default_branch}"
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr "Flest stjerner"
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr "Flytt"
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr "Flytt problemet"
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr "Flytt denne saken til et annet prosjekt."
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ msgstr "Alle valgt"
msgid "NetworkPolicies|Allow"
msgstr "Tillat"
+msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
+msgstr ""
+
+msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
+msgstr ""
+
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr "Avvis all trafikk"
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr "Ny bruker"
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr "Ny gren"
@@ -19590,6 +20253,9 @@ msgstr ""
msgid "New directory"
msgstr "Ny katalog"
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr "Nytt miljø"
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr "Nytt merke"
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr "Ny fletteforespørsel"
@@ -19737,6 +20406,9 @@ msgstr "Ingen aktiviteter ble funnet"
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr "Ingen commiter er til stede her"
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19788,6 +20466,9 @@ msgstr ""
msgid "No due date"
msgstr "Ingen forfallsdato"
+msgid "No email participants were added. Either none were provided, or they already exist."
+msgstr ""
+
msgid "No endpoint provided"
msgstr "Ingen endepunkt ble oppgitt"
@@ -19824,6 +20505,9 @@ msgstr "Ingen saker funnet"
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr "Bemerk: Vurder å spørre din GitLab-administrator om å konfigurere %{g
msgid "NoteForm|Note"
msgstr "Notis"
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr "Er du sikker på at du vil avbryte opprettelsen av denne kommentaren?"
msgid "Notes|Collapse replies"
msgstr "Klapp sammen svar"
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr "Ingenting å synkronisere"
msgid "Notification events"
msgstr "Varslingshendelser"
-msgid "Notification setting"
-msgstr "Varslingsinnstilling"
-
msgid "Notification setting - %{notification_title}"
msgstr "Varslingsinnstilling - %{notification_title}"
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr "Innflett fletteforespørsel"
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr "Delta"
msgid "NotificationLevel|Watch"
msgstr "Hold øye med"
-msgid "NotificationSetting|Custom"
-msgstr "Tilpasset"
-
msgid "Notifications"
msgstr "Varsler"
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ msgstr "En eller flere av avhengighetsfilene dine er ikke støttet, og avhengigh
msgid "One or more of your personal access tokens has expired."
msgstr ""
-msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less."
+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."
@@ -20552,7 +21257,7 @@ msgstr "Kun prosjektmedlemmer kan kommentere."
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr "Oi sann, er du sikker?"
msgid "Open"
msgstr "Ã…pne"
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20579,12 +21290,12 @@ msgstr "Ã…pne eposer"
msgid "Open errors"
msgstr "Ã…pne feil"
-msgid "Open in Xcode"
-msgstr "Ã…pne i Xcode"
-
msgid "Open in file view"
msgstr "Ã…pne i filvisning"
+msgid "Open in your IDE"
+msgstr ""
+
msgid "Open issues"
msgstr "Ã…pne saker"
@@ -20651,6 +21362,9 @@ 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 "Valgfritt"
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr "Reduser innrykk"
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr "Overstyrt"
@@ -20762,6 +21473,15 @@ msgstr "Pakketypen må være NuGet"
msgid "Package type must be PyPi"
msgstr "Pakketypen må være PyPi"
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr "Legg til NuGet-kilde"
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr "Appgruppe: %{group}"
@@ -20897,9 +21620,6 @@ msgstr "Maven-kommando"
msgid "PackageRegistry|Maven XML"
msgstr "Maven-XML"
-msgid "PackageRegistry|NPM"
-msgstr "NPM"
-
msgid "PackageRegistry|NuGet"
msgstr "NuGet"
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr "Pip-kommando"
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr "Fjern pakke"
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr "npm-kommando"
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr "Maven"
-msgid "PackageType|NPM"
-msgstr "NPM"
-
msgid "PackageType|NuGet"
msgstr "NuGet"
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr "Pakker"
@@ -21077,6 +21809,15 @@ msgstr "Parameter"
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr "Parent"
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr "Forbi måldatoen"
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr "SQL-forespørsler"
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21284,9 +22028,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21308,10 +22049,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr "Rørledning: %{status}"
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr "Rørledningsdiagrammer"
msgid "Pipelines emails"
msgstr "Rørlednings-E-poster"
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr "Rørledninger den siste måneden (%{oneMonthAgo} - %{today})"
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr "Rørledninger den siste uken (%{oneWeekAgo} - %{today})"
-
-msgid "Pipelines for last year"
-msgstr "Rørledninger det siste året"
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr "Rørledninger for fletteforespørsler er konfigurert. En frakoblet rørledning kjører i sammenheng med fletteforespørselen, og ikke mot det innflettede resultatet. Lær mer i dokumentasjonen for rørledninger for innflettede resultater."
@@ -21422,10 +22154,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr "Mer informasjon"
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr "Det er ingen rørledninger for øyeblikket."
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
+msgid "Pipeline|Actions"
+msgstr ""
+
msgid "Pipeline|Branch name"
msgstr "Grennavn"
+msgid "Pipeline|Branches or tags could not be loaded."
+msgstr ""
+
msgid "Pipeline|Canceled"
msgstr "Avbrutt"
+msgid "Pipeline|Checking pipeline status"
+msgstr ""
+
msgid "Pipeline|Checking pipeline status."
msgstr "Sjekker rørledningsstatusen."
@@ -21596,6 +22337,9 @@ msgstr "Manuelt"
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ msgstr "Avventer"
msgid "Pipeline|Pipeline"
msgstr "Rørledning"
+msgid "Pipeline|Pipeline %{idStart}#%{idEnd} %{statusStart}%{statusEnd} for %{commitStart}%{commitEnd}"
+msgstr ""
+
+msgid "Pipeline|Pipeline cannot be run."
+msgstr ""
+
msgid "Pipeline|Pipelines"
msgstr "Rørledninger"
@@ -21665,6 +22415,9 @@ msgstr "Verdi"
msgid "Pipeline|Variables"
msgstr "Variabler"
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr "Vennligst velg en fil"
@@ -21857,12 +22613,18 @@ msgstr "Vennligst velg og legg til et medlem"
msgid "Please select at least one filter to see results"
msgstr "Vennligst velg minst ett filter for å se resultatene"
+msgid "Please select what should be included in each exported requirement."
+msgstr ""
+
msgid "Please set a new password before proceeding."
msgstr "Vennligst bestem et nytt passord før du fortsetter."
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr "Vennligst løs reCAPTCHA"
@@ -21923,21 +22685,39 @@ msgstr "Velg hvilket innhold du vil se på et prosjekts oversiktsside."
msgid "Preferences|Choose what content you want to see on your homepage."
msgstr "Velg hva slags innhold du vil se på hjemmesiden din."
+msgid "Preferences|Customize integrations with third party services."
+msgstr ""
+
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
msgstr "Tilpass utseende til applikasjons-toppområdet og navigasjonssidelinjen."
msgid "Preferences|Display time in 24-hour format"
msgstr "Vis tid i 24-timersformat"
+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 mins ago."
msgstr "For eksempel: 30min siden."
+msgid "Preferences|Gitpod"
+msgstr ""
+
msgid "Preferences|Homepage content"
msgstr "Hjemmesideinnhold"
msgid "Preferences|Instead of all the files changed, show only one file at a time. To switch between files, use the file browser."
msgstr ""
+msgid "Preferences|Integrations"
+msgstr ""
+
msgid "Preferences|Layout width"
msgstr "Utformingsbredde"
@@ -21959,6 +22739,12 @@ 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 "Syntaksfremhevingstema"
@@ -22067,6 +22853,9 @@ msgstr "Prioritert etikett"
msgid "Private"
msgstr "Privat"
+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 ""
@@ -22151,24 +22940,6 @@ msgstr "Profil"
msgid "Profile Settings"
msgstr "Profilinnstillinger"
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr "den"
@@ -22205,6 +22976,9 @@ msgstr "Legg til nøkkel"
msgid "Profiles|Add status emoji"
msgstr "Legg til status emoji"
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr "Avatarbeskjærer"
@@ -22562,6 +23336,9 @@ msgstr "Prosjektfiler"
msgid "Project ID"
msgstr "Prosjekt-ID"
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr "Prosjekt URL"
@@ -22790,12 +23567,9 @@ msgstr "Tillat"
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
-msgid "ProjectSettings|Allow users to request access"
-msgstr "Tillat brukere å be om tilgang"
-
msgid "ProjectSettings|Analytics"
msgstr ""
@@ -22805,7 +23579,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr "Merker"
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr "Kontakt en administrator for å endre på denne innstillingen."
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr "Oppmuntre til"
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-msgstr ""
-
msgid "ProjectSettings|Every merge creates a merge commit"
msgstr "Alle innflettinger skaper en innflettings-commit"
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."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,13 +23672,13 @@ msgstr "Internt"
msgid "ProjectSettings|Issues"
msgstr "Saker"
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
-msgstr "LFS-objekter fra dette kodelageret er fortsatt tilgjengelig for utgreininger. %{linkStart}Hvordan fjerner jeg dem?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22937,13 +23714,16 @@ msgstr ""
msgid "ProjectSettings|Operations"
msgstr ""
+msgid "ProjectSettings|Override user notification preferences for all project members."
+msgstr ""
+
msgid "ProjectSettings|Packages"
msgstr "Pakker"
msgid "ProjectSettings|Pages"
msgstr "Sider"
-msgid "ProjectSettings|Pages for project documentation"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22970,16 +23750,25 @@ msgstr "Kodelager"
msgid "ProjectSettings|Require"
msgstr "Krev"
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,30 +23816,36 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer project"
msgstr "Overfør prosjekt"
+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|View and edit files in this project"
-msgstr "Vis og rediger filer i dette prosjektet"
+msgid "ProjectSettings|Users can request access"
+msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have 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|What are badges?"
msgstr ""
@@ -23060,19 +23855,10 @@ msgstr ""
msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
-msgstr ""
-
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
-msgstr "Når dette er aktivert, viser saker, fletteforespørsler og utdrag alltid tommel-opp- og tommel-ned-emojiknapper."
-
msgid "ProjectSettings|Wiki"
msgstr "Wiki"
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
-msgstr ""
-
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr "Aktiv"
msgid "PrometheusService|Auto configuration"
msgstr "Auto-oppsett"
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr "Vanlige måltall"
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr "Tilpassede målinger"
@@ -23381,6 +24164,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23396,6 +24188,12 @@ msgstr "MÃ¥ltall"
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr "Mere informasjon"
@@ -23408,22 +24206,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23432,6 +24230,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr "Forfrem"
@@ -23522,9 +24326,6 @@ msgstr "Prøv det gratis"
msgid "Promotions|Upgrade plan"
msgstr "Oppgrader planen"
-msgid "Promotions|Upgrade your plan"
-msgstr "Oppgrader planen din"
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr "Beskyttede grener"
msgid "Protected Environment"
msgstr "Beskyttet miljø"
-msgid "Protected Environments"
-msgstr "Beskyttede miljøer"
-
msgid "Protected Paths"
msgstr "Beskyttede stier"
@@ -23582,6 +24380,9 @@ msgstr "Beskyttede etiketter"
msgid "Protected branches"
msgstr "Beskyttede grener"
+msgid "Protected environments"
+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 ""
@@ -23675,8 +24476,8 @@ msgstr "Miljøet ditt er beskyttet."
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr "Miljøet ditt er blitt ubeskyttet"
-msgid "Protip:"
-msgstr "Topptips:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgstr ""
msgid "Protocol"
msgstr "Protokoll"
@@ -23771,7 +24572,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr "Nylig"
@@ -24072,6 +24921,9 @@ msgstr "Versjonsnotater:"
msgid "Release title"
msgstr "Utgivelsestittel"
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr "Bilde"
@@ -24177,6 +25029,9 @@ msgstr "Fjern beskrivelseshistorikken"
msgid "Remove due date"
msgstr "Fjern måldato"
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24243,6 +25098,9 @@ msgstr "Fjern trinn"
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,8 +25269,8 @@ msgstr "Svar på kommentar"
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
-msgstr "Svar ..."
+msgid "Reply…"
+msgstr ""
msgid "Repo by URL"
msgstr "Kodelager utifra URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr "Handlinger"
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr "Klasse"
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr "Be om tilgang"
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr "Forespurt %{time_ago}"
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr "De forespurte tilstandene er ugyldige"
@@ -24795,9 +25674,6 @@ msgstr "Tilbakestill mal"
msgid "Reset to project defaults"
msgstr "Tilbakestill til prosjektets standarder"
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr "Lagre endringene"
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr "Omfang"
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr "Omfang kan ikke være tomme"
@@ -25423,6 +26305,9 @@ msgstr "Søk etter denne teksten"
msgid "Search forks"
msgstr "Velg utgreininger"
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr "Søke i flettede forespørsler"
@@ -25595,7 +26480,7 @@ msgstr "Hemmelig"
msgid "Secret Detection"
msgstr "Hemmelig oppdagelse"
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr "Sett opp"
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr "Tilpass vanlige SAST-innstillinger etter dine behov. Oppsettsendringer s
msgid "SecurityConfiguration|Enable"
msgstr "Skru på"
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr "Skrudd på"
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr "SAST-oppsett"
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr "Sikkerhetskontroll"
@@ -25721,6 +26612,12 @@ msgstr "Legg til prosjekter"
msgid "SecurityReports|Add projects to your group"
msgstr "Legg til prosjekter til din gruppe"
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,12 +26627,12 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
+msgid "SecurityReports|Create Jira issue"
+msgstr ""
+
msgid "SecurityReports|Create issue"
msgstr "Opprett saker"
-msgid "SecurityReports|Dismiss Selected"
-msgstr "Avvis de valgte"
-
msgid "SecurityReports|Dismiss vulnerability"
msgstr "Avfei sårbarhet"
@@ -25754,6 +26651,9 @@ msgstr "Last ned rapport"
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 "Enten har du ikke tillatelse til å se dette kontrollpanelet, eller så har kontrollpanelet ikke blitt konfigurert. Kontroller tillatelsesinnstillingene dine med administratoren din, eller sjekk kontrollpanelkonfigurasjonene sine for å fortsette."
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr "Mere info"
msgid "SecurityReports|More information"
msgstr "Mere informasjon"
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr "Ingen sårbarheter funnet"
@@ -25841,21 +26744,21 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
-msgstr "Velg en årsak"
+msgid "SecurityReports|Set status"
+msgstr ""
msgid "SecurityReports|Severity"
msgstr "Alvorlighet"
+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 "Status"
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
-msgstr ""
-
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
msgstr ""
@@ -25877,11 +26780,6 @@ msgstr "En feil oppstod under oppretting av fletteforespørselen."
msgid "SecurityReports|There was an error deleting the comment."
msgstr "Det oppstod en feil under sletting av kommentaren."
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr "Det oppstod en feil under avfeiing av sårbarhetene."
@@ -25924,7 +26822,7 @@ msgstr "Selv om det er sjeldent at du ikke har sårbarheter i rørledningen din,
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,8 +26831,8 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
-msgstr "[Ingen grunn]"
+msgid "Security|Policies"
+msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
msgstr "Se GitLab sine %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr "Velg tilordnet"
msgid "Select branch"
msgstr "Velg gren"
-msgid "Select branch/tag"
-msgstr "Velg gren/etikett"
-
msgid "Select due date"
msgstr "Velg måldato"
@@ -26071,7 +26966,7 @@ msgstr "Velg prosjekt for å velge sone"
msgid "Select projects"
msgstr "Velg prosjekter"
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr "Velg type"
msgid "Select user"
msgstr "Velg user"
+msgid "Selected"
+msgstr ""
+
msgid "Selected commits"
msgstr "Valgte commiter"
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 "De valgte nivåene kan ikke brukes av ikke-administratorbrukere for grupper, prosjekter eller utdrag. Hvis det offentlige nivået er begrenset, er brukerprofilene bare synlige for påloggede brukere."
+msgid "Selected projects"
+msgstr ""
+
msgid "Selecting a GitLab user will add a link to the GitLab user in the descriptions of issues and comments (e.g. \"By %{link_open}@johnsmith%{link_close}\"). It will also associate and/or assign these issues and comments with the selected user."
msgstr "Å velge en GitLab-bruker vil legge til en lenke til GitLab-brukeren i beskrivelsene av saker og kommentarer (f.eks. \"Av %{link_open}@johnsmith%{link_close}\"). Det vil også knytte og/eller tildele disse sakene og kommentarene til den valgte brukeren."
@@ -26161,7 +27062,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26338,6 +27239,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr "Oppsett"
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr "Alvorlighetsgrad"
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] "Viser %d hendelse"
msgstr[1] "Viser %d hendelser"
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr "Noe gikk galt i vår ende. Vennligst prøv på nytt!"
msgid "Something went wrong on our end. Please try again."
msgstr "Noe gikk galt i vår ende. Vennligst prøv igjen."
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr "Noe gikk galt under endring av konfidensialiteten på dette problemet"
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr "Noe gikk galt under endring av låsestatus på denne %{issuableDisplayName}"
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr "Noe gikk galt ved løsing av denne diskusjonen. Vennligst prøv igjen."
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr "Noe gikk galt under stopping av dette miljøet. Vennligst prøv igjen."
@@ -27287,9 +28194,6 @@ msgstr "Nyligst logget inn"
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr "Størrelse"
@@ -27479,12 +28383,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
-msgstr "Start en ny diskusjon …"
+msgid "Start a new discussion…"
+msgstr ""
msgid "Start a new merge request"
msgstr "Begynn en ny fletteforespørsel"
+msgid "Start a new merge request with these changes"
+msgstr ""
+
msgid "Start a review"
msgstr "Start en anmeldelse"
@@ -27989,68 +28896,68 @@ msgstr "Foreslått endring"
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
-msgstr "Feijoa"
+msgid "SuggestedColors|Crimson"
+msgstr ""
-msgid "SuggestedColors|Lime green"
-msgstr "Limegrønn"
+msgid "SuggestedColors|Dark coral"
+msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
-msgstr "Myk oransje"
+msgid "SuggestedColors|Gray"
+msgstr ""
-msgid "SuggestedColors|Soft red"
-msgstr "Myk rød"
+msgid "SuggestedColors|Green screen"
+msgstr ""
-msgid "SuggestedColors|Strong pink"
-msgstr "SuggestedColors|Sterk rosa"
+msgid "SuggestedColors|Green-cyan"
+msgstr ""
-msgid "SuggestedColors|Strong red"
-msgstr "SuggestedColors|Sterk rød"
+msgid "SuggestedColors|Lavendar"
+msgstr ""
-msgid "SuggestedColors|Strong yellow"
-msgstr "SuggestedColors|Sterk gul"
+msgid "SuggestedColors|Magenta-pink"
+msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
-msgstr "SuggestedColors|Veldig blek oransje"
+msgid "SuggestedColors|Titanium yellow"
+msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
msgstr ""
@@ -28136,6 +29043,12 @@ 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 ""
@@ -28145,7 +29058,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr "Bruksvilkår og personvern"
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
msgstr "Statusen i tabellen nedenfor gjelder bare for standardgrenen og er basert på den %{linkStart}nyeste rørledningen%{linkEnd}. Når du har aktivert en skanning for standardgrenen, vil enhver påfølgende funksjon gren du oppretter inkludere skanningen."
+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 ""
@@ -29058,6 +29983,9 @@ msgstr "Det er ingen endringer"
msgid "There are no charts configured for this page"
msgstr ""
+msgid "There are no closed epics"
+msgstr ""
+
msgid "There are no closed issues"
msgstr "Det er ingen lukkede saker"
@@ -29076,12 +30004,18 @@ msgstr "Det er ingen saker å vise"
msgid "There are no issues to show."
msgstr "Det er ingen saker å vise."
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr "Det er ingen stempler ennå"
msgid "There are no matching files"
msgstr "Det er ingen samsvarende filer"
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr "Det er ingen åpne saker"
@@ -29112,10 +30046,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29157,7 +30091,7 @@ msgstr "En feil oppstod under innhenting av prosjektetiketter."
msgid "There was a problem fetching project users."
msgstr "En feil oppstod under innhenting av prosjektbrukere."
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr "En feil oppstod under innhenting av %{replicableType}"
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr "Det oppstod en feil under innhenting av Geo-innstillingene"
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr "Det oppstod en feil under importering av Jira-prosjektet."
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29271,9 +30211,6 @@ msgstr "En feil oppstod under lagring av denne geo-noden."
msgid "There was an error saving your changes."
msgstr "En feil oppstod under lagring av endringene dine."
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr "Det oppstod en feil under oppdatering av Geo-innstillingene"
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29574,6 +30505,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr "Trusselovervåking"
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr "Droppede pakker"
msgid "ThreatMonitoring|Environment"
msgstr "Miljø"
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr "Tips:"
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr "Tittel"
@@ -30382,11 +31325,11 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
-msgstr "Gjøremål"
+msgid "To widen your search, change or remove filters."
+msgstr ""
msgid "To-Do List"
msgstr "Gjøremålsliste"
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr "Veksle tråd"
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr "Tre-visning"
msgid "Trending"
msgstr "Populære"
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr "GÃ¥ tilbake til GitLab"
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
-msgstr ""
-
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr "Prøv igjen"
@@ -30735,6 +31675,9 @@ msgstr "Prøv ut alt som GitLab har å tilby i 30 dager."
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr "Prøv å utgreine på nytt"
@@ -30756,11 +31699,11 @@ msgstr "Tirsdag"
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
-msgstr "Slå av"
+msgid "Turn off"
+msgstr ""
-msgid "Turn On"
-msgstr "Slå på"
+msgid "Turn on"
+msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
msgstr "Skru på %{strongStart}bruks-ping%{strongEnd} for å aktivere analyse av brukeraktivitet, kjent som %{docLinkStart}Kohorter%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ msgstr "URL"
msgid "URL is required"
msgstr "Nettadresse er påkrevd"
+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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr "Angre ignorering"
msgid "Unexpected error"
msgstr "Uventet feil"
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31128,9 +32089,6 @@ msgstr "Oppdater godkjennere"
msgid "Update failed"
msgstr "Oppdatering mislyktes"
-msgid "Update failed. Please try again."
-msgstr "Oppdatering mislyktes. Vennligst prøv igjen."
-
msgid "Update it"
msgstr "Oppdater den"
@@ -31308,6 +32266,12 @@ msgstr "LFS-objekter"
msgid "UsageQuota|LFS Storage"
msgstr "LFS-lagring"
+msgid "UsageQuota|Learn more about excess storage usage"
+msgstr ""
+
+msgid "UsageQuota|Learn more about usage quotas"
+msgstr ""
+
msgid "UsageQuota|Packages"
msgstr "Pakker"
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr "Bruk en linje per URI"
msgid "Use template"
msgstr "Bruk mal"
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ msgstr "Rediger profil"
msgid "UserProfile|Explore public groups to find projects to contribute to."
msgstr "Utforsk offentlige grupper for å finne prosjekter å bidra til."
+msgid "UserProfile|Followers"
+msgstr ""
+
+msgid "UserProfile|Following"
+msgstr ""
+
msgid "UserProfile|Groups"
msgstr "Grupper"
@@ -31653,6 +32713,9 @@ msgstr "Stjernemerkede prosjekter"
msgid "UserProfile|Subscribe"
msgstr "Abonner"
+msgid "UserProfile|This user doesn't have any followers."
+msgstr ""
+
msgid "UserProfile|This user doesn't have any personal projects"
msgstr "Denne brukeren har ingen personlige prosjekter"
@@ -31668,6 +32731,9 @@ msgstr "Denne brukeren har ikke stjernemerket noen prosjekter"
msgid "UserProfile|This user is blocked"
msgstr "Denne brukeren er blokkert"
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ msgstr "Vis alle"
msgid "UserProfile|View user in admin area"
msgstr "Vis brukeren i admin-området"
+msgid "UserProfile|You are not following other users."
+msgstr ""
+
msgid "UserProfile|You can create a group for several dependent projects."
msgstr "Du kan opprette en gruppe for flere avhengige prosjekter."
+msgid "UserProfile|You do not have any followers."
+msgstr ""
+
msgid "UserProfile|You haven't created any personal projects."
msgstr "Du har ikke opprettet noen personlige prosjekter."
@@ -31752,6 +32824,9 @@ msgstr "Utildelt"
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr "Vis alle saker"
@@ -31912,9 +32990,6 @@ msgstr "Vis fil @ "
msgid "View file @ %{commitSha}"
msgstr "Vis fil @ %{commitSha}"
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr "Vis full kontrollpanel"
@@ -32032,6 +33107,9 @@ msgstr "Ukjent"
msgid "Visit settings page"
msgstr "GÃ¥ til innstillingssiden"
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr "Alvorlighetsgrad"
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr "Endre status"
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr "Kunne ikke behandle %{issueReference}: %{errorMessage}."
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|Something went wrong while trying to delete the comment. Please try again later."
msgstr "Noe gikk galt under sletting av kommentaren. Prøv igjen senere."
+msgid "VulnerabilityManagement|Something went wrong while trying to fetch related Jira issues. Please check the %{linkStart}Jira integration settings%{linkEnd} and try again."
+msgstr ""
+
msgid "VulnerabilityManagement|Something went wrong while trying to refresh the vulnerability. Please try again later."
msgstr "Noe gikk galt under oppfrisking av sårbarheten. Prøv igjen senere."
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr "Vi fant ingen sårbarheter"
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr "Kommentarer"
-msgid "Webhooks|Confidential Comments"
-msgstr "Konfidensielle kommentarer"
+msgid "Webhooks|Confidential comments"
+msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr "Skru på SSL-verifisering"
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr "SSL-verifisering"
-msgid "Webhooks|Secret Token"
-msgstr "Hemmelig sjetong"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
+msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
+msgstr "Trigger"
+
+msgid "Webhooks|URL"
+msgstr "URL"
+
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Trigger"
-msgstr "Trigger"
+msgid "Webhooks|URL is triggered when the pipeline status changes"
+msgstr ""
-msgid "Webhooks|URL"
-msgstr "URL"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr "Hva leter du etter?"
msgid "What describes you best?"
msgstr "Hva beskriver deg best?"
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,12 +33847,9 @@ msgstr "Slett side"
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr "Vil du slette siden %{pageTitle}?"
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
+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 "WikiPageConflictMessage|the page"
-msgstr "siden"
-
msgid "WikiPageCreate|Create %{pageTitle}"
msgstr "Opprett %{pageTitle}"
@@ -32832,9 +33943,6 @@ msgstr "Skriv en kommentar eller dra filene dine hit …"
msgid "Write a comment…"
msgstr "Skriv en kommentar …"
-msgid "Write access allowed"
-msgstr "Skrivetilgang er tillatt"
-
msgid "Write milestone description..."
msgstr "Skriv en milepælbeskrivelse …"
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,8 +34021,8 @@ 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 the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
-msgstr "Du kommer til å slå på konfidensialitet. Dette betyr at bare gruppemedlemmer med %{strongStart}minst «Rapportør»-tilgang%{strongEnd} kan se og legge ut kommentarer på %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
+msgstr ""
msgid "You are not allowed to approve a user"
msgstr ""
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ msgstr "Du kan alltid redigere dette senere"
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 ""
@@ -33120,6 +34237,9 @@ msgstr "Du har ikke en aktiv lisens"
msgid "You do not have any subscriptions yet"
msgstr "Du har ikke noen abonnementer enda"
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr "Du har ikke tillatelse til å forlate denne %{namespaceType}."
@@ -33237,6 +34357,9 @@ msgstr "Du har ikke lagt til noen godkjennere. Begynn med å legge til brukere e
msgid "You have reached your project limit"
msgstr "Du har nådd prosjektgrensen"
+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 a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr "Du har vellykket kjøpt et abonnement på %{plan}-plan for %{seats}. Du mottar en kvittering via e-post."
@@ -33468,9 +34591,6 @@ msgstr "Din lisens"
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33642,6 +34762,9 @@ 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 profile"
msgstr "Din profil"
@@ -33699,6 +34822,9 @@ msgstr "Zoom-møte fjernet"
msgid "[No reason]"
msgstr "[Ingen grunn]"
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr "tilgang:"
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 ""
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr "lukket saksrapport"
@@ -34215,6 +35350,9 @@ msgstr[1] "filer"
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 "for %{link_to_merge_request} med %{link_to_merge_request_source_branch}"
@@ -34354,6 +35492,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr "har kun lesetilgang"
@@ -34450,9 +35591,6 @@ msgstr "Matematikken i denne oppføringen tar for lang tid å gjengi og vises ka
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] "fletteforespørsel"
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr "Vennligst gjenopprett den eller bruk en annen %{missingBranchName}-fane"
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34698,7 +35836,7 @@ msgstr "Endringene ble ikke flettet inn i"
msgid "mrWidget|The changes will be merged into"
msgstr "Endringene vil bli flettet inn i"
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr "må være høyere enn startdatoen"
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr "ingen"
msgid "not found"
msgstr "ikke funnet"
-msgid "notification emails"
-msgstr "E-postvarslinger"
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr "%{firstItem} og %{lastItem}"
@@ -35128,6 +36272,12 @@ msgstr "de(n) følgende sak(en)"
msgid "this document"
msgstr "dette dokumentet"
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr "utløst"
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr "brukernavn"
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr "bruker Kubernetes-klynger for å distribuere koden din!"
-
msgid "v%{version} published %{timeAgo}"
msgstr "v%{version} publisert %{timeAgo}"
diff --git a/locale/nl_NL/gitlab.po b/locale/nl_NL/gitlab.po
index 8813ebf4c9a..e99873e8e35 100644
--- a/locale/nl_NL/gitlab.po
+++ b/locale/nl_NL/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: nl\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 18:00\n"
+"PO-Revision-Date: 2021-03-05 23:57\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -170,6 +173,11 @@ 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] ""
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ 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 ""
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -682,6 +710,15 @@ msgstr[1] ""
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr "%{number_commits_behind} commits achter %{default_branch}, %{number_commits_ahead} commits voor"
+msgid "%{oneMonthAgo} - %{today}"
+msgstr ""
+
+msgid "%{oneWeekAgo} - %{today}"
+msgstr ""
+
+msgid "%{oneYearAgo} - %{today}"
+msgstr ""
+
msgid "%{openOrClose} %{noteable}"
msgstr "%{openOrClose} %{noteable}"
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -976,6 +1016,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -988,9 +1031,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1015,9 +1055,6 @@ msgstr "+ %{moreCount} meer"
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1111,6 +1148,11 @@ 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] "1 groep"
@@ -1162,6 +1204,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr "1e bijdrage!"
@@ -1282,6 +1327,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1635,9 +1779,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1716,12 +1857,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1818,6 +1965,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1938,6 +2103,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2058,6 +2226,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2091,6 +2268,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2259,6 +2442,15 @@ 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 ""
@@ -2268,6 +2460,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2361,6 +2562,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2394,6 +2607,21 @@ 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 ""
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2483,9 +2714,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2576,9 +2792,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,9 +2813,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,49 +2837,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,76 +2867,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,13 +2927,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2954,7 +3104,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2996,6 +3146,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3146,12 +3293,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3269,6 +3425,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3296,12 +3455,18 @@ 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 ""
@@ -3344,7 +3509,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3395,10 +3566,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3757,9 +3928,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3787,6 +3955,9 @@ 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 erase this build?"
msgstr ""
@@ -4048,12 +4219,6 @@ msgstr[1] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr "BranchSwitcherPlaceholder|Zoek branches"
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr "BranchSwitcherTitle|Ga naar branch"
-
msgid "Branches"
msgstr "Branches"
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5028,6 +5235,26 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr "Annuleren"
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5688,7 +5915,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5703,6 +5930,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr "geannuleerd"
@@ -6036,21 +6266,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7325,16 +7594,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
+msgstr ""
+
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Create merge request"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7349,6 +7642,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7391,6 +7729,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7430,6 +7771,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7451,6 +7795,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8245,10 +8577,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8302,6 +8637,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8314,6 +8652,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8329,6 +8670,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,13 +8991,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8647,7 +9024,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8689,6 +9066,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8722,6 +9102,18 @@ 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 ""
@@ -8886,7 +9278,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 ""
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9261,9 +9682,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9318,6 +9736,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9429,6 +9856,15 @@ 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 ""
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
-msgstr ""
-
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9660,6 +10093,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9678,9 +10114,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9690,19 +10123,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9717,10 +10150,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9735,7 +10165,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9756,10 +10186,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9768,7 +10204,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10047,18 +10482,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,7 +10710,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11048,19 +11468,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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."
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the issue description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the issue title"
-msgstr ""
-
-msgid "Enter the merge request description"
-msgstr ""
-
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11345,6 +11759,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11369,6 +11786,12 @@ 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 ""
@@ -11396,6 +11819,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11423,6 +11849,9 @@ 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 ""
@@ -11447,9 +11876,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11882,6 +12320,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11915,6 +12356,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12038,10 +12482,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12068,6 +12512,12 @@ 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 ""
@@ -12104,9 +12554,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,10 +12602,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12826,6 +13279,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12856,7 +13345,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12934,9 +13423,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13096,6 +13585,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13135,6 +13627,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13144,6 +13639,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13291,6 +13801,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13330,6 +13840,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13828,6 +14344,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14630,6 +15164,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15703,96 +16240,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16078,9 +16543,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ 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 ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ 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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16972,6 +17518,9 @@ 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 ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] ""
msgstr[1] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17085,6 +17640,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17118,6 +17676,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17169,9 +17730,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17181,6 +17739,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19590,6 +20253,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19737,6 +20406,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19788,6 +20466,9 @@ 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 ""
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ 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."
+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."
@@ -20552,7 +21257,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20579,10 +21290,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20651,6 +21362,9 @@ 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 ""
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20762,6 +21473,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21077,6 +21809,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21284,9 +22028,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21308,10 +22049,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,10 +22154,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ 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 ""
@@ -21665,6 +22415,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21923,21 +22685,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21959,6 +22739,12 @@ 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 ""
@@ -22067,6 +22853,9 @@ 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 ""
@@ -22151,24 +22940,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22205,6 +22976,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22562,6 +23336,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22790,10 +23567,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22805,7 +23579,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,13 +23672,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22937,13 +23714,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22970,16 +23750,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,52 +23816,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23381,6 +24164,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23396,6 +24188,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23408,22 +24206,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23432,6 +24230,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23522,9 +24326,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23675,7 +24476,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23771,7 +24572,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24072,6 +24921,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24243,6 +25098,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,7 +25269,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25595,7 +26480,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25721,6 +26612,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,10 +26627,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,19 +26744,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26161,7 +27062,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26338,6 +27239,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] ""
msgstr[1] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27287,9 +28194,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27479,12 +28383,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27989,67 +28896,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28136,6 +29043,12 @@ 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 ""
@@ -28145,7 +29058,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ 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 ""
@@ -29076,12 +30004,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29112,10 +30046,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29157,7 +30091,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29574,6 +30505,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30382,10 +31325,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30735,6 +31675,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30756,10 +31699,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31308,6 +32266,12 @@ 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|Packages"
msgstr ""
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ 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 ""
@@ -31653,6 +32713,9 @@ 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 ""
@@ -31668,6 +32731,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ 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 ""
@@ -31752,6 +32824,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31912,9 +32990,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32032,6 +33107,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,10 +33847,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32832,9 +33943,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ 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 ""
@@ -33120,6 +34237,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33237,6 +34357,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33642,6 +34762,9 @@ 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 profile"
msgstr ""
@@ -33699,6 +34822,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 ""
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34215,6 +35350,9 @@ 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 ""
@@ -34354,6 +35492,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34698,7 +35836,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35128,6 +36272,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/pa_IN/gitlab.po b/locale/pa_IN/gitlab.po
index 98c3378861e..f258d2cfce5 100644
--- a/locale/pa_IN/gitlab.po
+++ b/locale/pa_IN/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: pa-IN\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 18:00\n"
+"PO-Revision-Date: 2021-03-05 23:57\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -170,6 +173,11 @@ 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] ""
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ 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 ""
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -682,6 +710,15 @@ 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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -976,6 +1016,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -988,9 +1031,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1015,9 +1055,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1111,6 +1148,11 @@ 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] ""
@@ -1162,6 +1204,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1282,6 +1327,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1635,9 +1779,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1716,12 +1857,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1818,6 +1965,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1938,6 +2103,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2058,6 +2226,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2091,6 +2268,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2259,6 +2442,15 @@ 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 ""
@@ -2268,6 +2460,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2361,6 +2562,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2394,6 +2607,21 @@ 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 ""
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2483,9 +2714,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2576,9 +2792,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,9 +2813,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,49 +2837,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,76 +2867,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,13 +2927,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2954,7 +3104,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2996,6 +3146,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3146,12 +3293,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3269,6 +3425,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3296,12 +3455,18 @@ 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 ""
@@ -3344,7 +3509,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3395,10 +3566,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3757,9 +3928,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3787,6 +3955,9 @@ 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 erase this build?"
msgstr ""
@@ -4048,12 +4219,6 @@ msgstr[1] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5028,6 +5235,26 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5688,7 +5915,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5703,6 +5930,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6036,21 +6266,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7325,16 +7594,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7349,6 +7642,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7391,6 +7729,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7430,6 +7771,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7451,6 +7795,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8245,10 +8577,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8302,6 +8637,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8314,6 +8652,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8329,6 +8670,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,13 +8991,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8647,7 +9024,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8689,6 +9066,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8722,6 +9102,18 @@ 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 ""
@@ -8886,7 +9278,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 ""
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9261,9 +9682,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9318,6 +9736,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9429,6 +9856,15 @@ 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 ""
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9660,6 +10093,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9678,9 +10114,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9690,19 +10123,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9717,10 +10150,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9735,7 +10165,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9756,10 +10186,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9768,7 +10204,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10047,18 +10482,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,7 +10710,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11048,19 +11468,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
-msgstr ""
-
-msgid "Enter the issue title"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11345,6 +11759,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11369,6 +11786,12 @@ 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 ""
@@ -11396,6 +11819,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11423,6 +11849,9 @@ 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 ""
@@ -11447,9 +11876,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11882,6 +12320,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11915,6 +12356,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12038,10 +12482,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12068,6 +12512,12 @@ 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 ""
@@ -12104,9 +12554,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,10 +12602,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12826,6 +13279,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12856,7 +13345,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12934,9 +13423,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13096,6 +13585,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13135,6 +13627,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13144,6 +13639,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13291,6 +13801,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13330,6 +13840,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13828,6 +14344,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14630,6 +15164,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15703,96 +16240,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16078,9 +16543,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ 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 ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ 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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16972,6 +17518,9 @@ 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 ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] ""
msgstr[1] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17085,6 +17640,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17118,6 +17676,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17169,9 +17730,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17181,6 +17739,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19590,6 +20253,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19737,6 +20406,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19788,6 +20466,9 @@ 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 ""
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ 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."
+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."
@@ -20552,7 +21257,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20579,10 +21290,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20651,6 +21362,9 @@ 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 ""
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20762,6 +21473,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21077,6 +21809,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21284,9 +22028,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21308,10 +22049,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,10 +22154,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ 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 ""
@@ -21665,6 +22415,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21923,21 +22685,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21959,6 +22739,12 @@ 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 ""
@@ -22067,6 +22853,9 @@ 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 ""
@@ -22151,24 +22940,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22205,6 +22976,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22562,6 +23336,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22790,10 +23567,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22805,7 +23579,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,13 +23672,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22937,13 +23714,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22970,16 +23750,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,52 +23816,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23381,6 +24164,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23396,6 +24188,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23408,22 +24206,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23432,6 +24230,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23522,9 +24326,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23675,7 +24476,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23771,7 +24572,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24072,6 +24921,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24243,6 +25098,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,7 +25269,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25595,7 +26480,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25721,6 +26612,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,10 +26627,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,19 +26744,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26161,7 +27062,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26338,6 +27239,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] ""
msgstr[1] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27287,9 +28194,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27479,12 +28383,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27989,67 +28896,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28136,6 +29043,12 @@ 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 ""
@@ -28145,7 +29058,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ 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 ""
@@ -29076,12 +30004,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29112,10 +30046,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29157,7 +30091,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29574,6 +30505,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30382,10 +31325,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30735,6 +31675,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30756,10 +31699,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31308,6 +32266,12 @@ 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|Packages"
msgstr ""
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ 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 ""
@@ -31653,6 +32713,9 @@ 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 ""
@@ -31668,6 +32731,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ 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 ""
@@ -31752,6 +32824,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31912,9 +32990,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32032,6 +33107,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,10 +33847,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32832,9 +33943,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ 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 ""
@@ -33120,6 +34237,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33237,6 +34357,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33642,6 +34762,9 @@ 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 profile"
msgstr ""
@@ -33699,6 +34822,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 ""
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34215,6 +35350,9 @@ 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 ""
@@ -34354,6 +35492,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34698,7 +35836,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35128,6 +36272,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/pl_PL/gitlab.po b/locale/pl_PL/gitlab.po
index 42d15b150f4..5b0922e38f5 100644
--- a/locale/pl_PL/gitlab.po
+++ b/locale/pl_PL/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: pl\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 18:00\n"
+"PO-Revision-Date: 2021-03-05 23:57\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -78,6 +78,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -210,6 +213,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d epic"
+msgid_plural "%d epics"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d error"
msgid_plural "%d errors"
msgstr[0] ""
@@ -455,6 +465,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -540,6 +557,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -618,6 +638,9 @@ 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 ""
@@ -669,6 +692,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -777,6 +803,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -808,6 +840,15 @@ msgstr[3] ""
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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -857,9 +898,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -907,6 +945,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1101,6 +1142,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -1126,6 +1170,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -1138,9 +1185,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1165,9 +1209,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1279,6 +1320,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "1 follower"
+msgid_plural "%{count} followers"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "1 group"
msgid_plural "%d groups"
msgstr[0] ""
@@ -1348,6 +1396,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1468,6 +1519,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1567,6 +1621,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1823,9 +1973,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1904,12 +2051,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -2006,6 +2159,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2066,6 +2234,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -2126,6 +2297,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2246,6 +2420,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2270,6 +2450,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2279,6 +2462,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2354,6 +2540,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2447,6 +2636,15 @@ 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 ""
@@ -2456,6 +2654,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2540,6 +2741,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2549,6 +2756,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2582,6 +2801,21 @@ 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 ""
@@ -2606,6 +2840,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr "Zaawansowane pozwolenia, Magazyn Dużych Plików i Dwuczynnikowe ustawienia autoryzacji."
@@ -2673,9 +2910,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2688,24 +2922,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2766,9 +2988,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2778,6 +2997,9 @@ 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 ""
@@ -2787,9 +3009,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2814,49 +3033,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2868,9 +3054,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2880,76 +3063,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
-msgstr ""
-
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2961,13 +3123,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2979,9 +3141,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2994,7 +3153,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -3081,9 +3240,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -3144,7 +3300,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -3186,6 +3342,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3252,12 +3411,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3336,12 +3489,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3366,6 +3525,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr "Wystąpił błąd podczas pobierania oczekującego komentarza"
@@ -3459,6 +3621,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3486,12 +3651,18 @@ 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 ""
@@ -3534,7 +3705,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3573,6 +3747,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3585,10 +3762,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3955,9 +4132,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3985,6 +4159,9 @@ 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 erase this build?"
msgstr "Czy na pewno chcesz usunąć tę kompilację?"
@@ -4252,12 +4429,6 @@ msgstr[3] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4330,6 +4501,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4756,6 +4930,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4768,12 +4945,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4844,6 +5033,12 @@ 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 ""
@@ -4934,12 +5129,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -5108,16 +5297,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -5132,6 +5333,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -5165,6 +5369,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -5183,6 +5393,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5234,6 +5447,28 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5369,6 +5604,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5522,12 +5760,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5672,6 +5904,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5894,7 +6129,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5909,6 +6144,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6242,21 +6480,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6266,9 +6525,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7277,6 +7548,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7346,6 +7620,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7533,16 +7810,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7557,6 +7858,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7569,9 +7876,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7587,6 +7924,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7599,6 +7945,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7638,6 +7987,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7659,6 +8011,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7713,9 +8068,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7892,24 +8244,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8370,10 +8713,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8409,9 +8752,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8461,10 +8801,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8491,6 +8831,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8518,6 +8861,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8530,6 +8876,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8545,6 +8894,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8617,6 +8972,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8626,15 +8984,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8653,6 +9026,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8662,6 +9038,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8677,6 +9056,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8782,6 +9164,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8830,13 +9215,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8863,7 +9248,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8905,6 +9290,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8938,6 +9326,18 @@ 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 ""
@@ -9104,7 +9504,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9260,7 +9660,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9284,6 +9690,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9365,6 +9774,9 @@ 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 ""
@@ -9374,6 +9786,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9398,6 +9813,13 @@ 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] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "DastSiteValidation|Validate"
msgstr ""
@@ -9416,6 +9838,9 @@ 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 ""
@@ -9437,6 +9862,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9461,6 +9889,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9479,9 +9910,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9536,6 +9964,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9566,6 +9997,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9623,6 +10057,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9647,6 +10084,15 @@ 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 ""
@@ -9833,13 +10279,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9848,6 +10291,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9857,15 +10303,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9890,6 +10333,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9908,9 +10354,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9920,19 +10363,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9947,10 +10390,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9965,7 +10405,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9986,10 +10426,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9998,7 +10444,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -10028,6 +10474,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -10037,15 +10486,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -10055,6 +10495,13 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10277,18 +10724,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10304,16 +10739,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10334,10 +10769,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10346,18 +10778,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10370,9 +10796,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10382,6 +10805,12 @@ 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 ""
@@ -10409,6 +10838,9 @@ 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|Score"
msgstr ""
@@ -10520,7 +10952,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10725,6 +11157,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10917,10 +11352,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10989,12 +11424,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -11115,6 +11544,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11280,19 +11712,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
-msgstr ""
-
-msgid "Enter the issue title"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11577,6 +12003,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11601,6 +12030,12 @@ 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 ""
@@ -11628,6 +12063,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11655,6 +12093,9 @@ 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 ""
@@ -11679,9 +12120,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11856,6 +12294,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -12021,6 +12462,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -12036,6 +12480,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -12078,6 +12525,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -12114,6 +12564,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -12147,6 +12600,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12270,10 +12726,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12300,6 +12756,12 @@ 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 ""
@@ -12336,9 +12798,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12354,9 +12813,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12390,10 +12846,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12438,7 +12894,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12456,9 +12912,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12501,6 +12954,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12997,6 +13453,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -13060,6 +13525,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -13090,7 +13591,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -13168,9 +13669,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -13183,6 +13681,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13330,6 +13831,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13369,6 +13873,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13378,6 +13885,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13402,6 +13912,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13429,6 +13945,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13474,6 +13993,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13525,6 +14047,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13549,9 +14074,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13564,6 +14086,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13600,6 +14125,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13861,9 +14389,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -14014,6 +14539,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -14062,6 +14590,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14395,6 +14926,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14671,6 +15211,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14752,15 +15298,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14868,6 +15414,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -15122,6 +15671,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15483,7 +16035,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15909,9 +16461,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15949,96 +16498,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -16057,12 +16516,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -16114,6 +16579,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -16147,6 +16618,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16315,6 +16789,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16324,9 +16801,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16336,9 +16810,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16378,19 +16885,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16399,18 +16927,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16420,6 +16963,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16642,6 +17191,9 @@ 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 ""
@@ -16717,10 +17269,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16768,6 +17317,9 @@ 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 ""
@@ -16783,7 +17335,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16843,6 +17395,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16867,6 +17422,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -17068,6 +17626,9 @@ 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 ""
@@ -17137,9 +17698,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -17218,6 +17776,9 @@ 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 ""
@@ -17240,6 +17801,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17285,6 +17849,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17333,6 +17900,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17366,6 +17936,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17417,9 +17990,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17429,6 +17999,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17630,9 +18290,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17745,6 +18402,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17784,7 +18444,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -18144,6 +18804,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -18156,9 +18819,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -18216,6 +18876,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18486,6 +19149,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18567,9 +19233,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18579,9 +19242,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18630,6 +19290,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19343,6 +20006,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19352,6 +20018,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19370,6 +20039,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19582,6 +20254,12 @@ 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 ""
@@ -19600,12 +20278,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19841,6 +20513,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19862,6 +20537,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19904,6 +20582,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -20009,6 +20690,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -20030,9 +20714,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -20060,6 +20750,9 @@ 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 ""
@@ -20096,6 +20789,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20324,13 +21020,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20345,6 +21047,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 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 ""
@@ -20360,9 +21065,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20390,6 +21092,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20444,9 +21149,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20558,6 +21260,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20579,6 +21287,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20612,9 +21323,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20793,7 +21510,7 @@ 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."
+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."
@@ -20826,7 +21543,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20841,6 +21558,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20853,10 +21576,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20925,6 +21648,9 @@ 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 ""
@@ -20979,9 +21705,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -21036,6 +21759,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -21048,6 +21780,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -21171,9 +21906,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -21192,6 +21924,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -21210,6 +21945,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -21249,6 +21990,9 @@ 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|npm command"
msgstr ""
@@ -21270,15 +22014,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21351,6 +22095,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21408,10 +22161,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21507,6 +22260,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21558,9 +22314,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21582,10 +22335,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21660,15 +22413,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21696,10 +22440,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21714,9 +22458,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21741,6 +22482,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21777,9 +22521,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21813,6 +22554,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21825,12 +22569,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21870,6 +22623,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21882,6 +22638,12 @@ 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 ""
@@ -21939,6 +22701,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -22008,6 +22773,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -22131,12 +22899,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -22197,21 +22971,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -22233,6 +23025,12 @@ 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 ""
@@ -22341,6 +23139,9 @@ 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 ""
@@ -22425,24 +23226,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22479,6 +23262,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22836,6 +23622,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -23064,10 +23853,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -23079,7 +23865,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -23094,6 +23880,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -23121,16 +23913,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -23169,13 +23958,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -23211,13 +24000,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -23244,16 +24036,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23277,7 +24078,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23301,52 +24102,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23625,10 +24423,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23637,9 +24435,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23655,6 +24450,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23670,6 +24474,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23682,22 +24492,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23706,6 +24516,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23796,9 +24612,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23841,9 +24654,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23856,6 +24666,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23949,7 +24762,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -24045,7 +24858,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -24138,6 +24993,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -24174,6 +25032,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24350,6 +25211,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24455,6 +25319,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24521,6 +25388,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24689,7 +25559,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24745,12 +25615,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24828,6 +25701,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24855,6 +25734,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24951,6 +25836,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24969,6 +25857,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -25085,9 +25976,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -25178,6 +26066,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25558,7 +26449,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25630,6 +26521,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25717,6 +26611,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25911,7 +26808,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25956,12 +26853,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25974,9 +26877,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -26001,6 +26901,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -26037,6 +26940,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -26046,10 +26955,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -26070,6 +26979,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -26085,9 +26997,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -26115,6 +27024,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -26157,19 +27072,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -26193,13 +27108,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -26242,7 +27150,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -26251,7 +27159,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26338,9 +27246,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26389,7 +27294,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26431,12 +27336,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26479,7 +27390,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26656,6 +27567,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26848,6 +27762,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -27005,7 +27922,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -27297,9 +28214,6 @@ msgstr "Coś poszło nie tak po naszej stronie. Spróbuj ponownie!"
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr "Coś poszło nie tak przy próbie zmiany poziomu prywatności tego zgłoszenia"
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27426,6 +28340,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr "Coś poszło nie tak podczas rozwiązywania tej dyskusji. Spróbuj ponownie."
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27609,9 +28526,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27801,12 +28715,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 "Rozpocznij recenzjÄ™"
@@ -28311,67 +29228,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28458,6 +29375,12 @@ 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 ""
@@ -28467,7 +29390,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28662,6 +29585,9 @@ msgstr "Warunki Użytkowania oraz Polityka Prywatności"
msgid "Terraform"
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] ""
@@ -28727,6 +29653,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28739,6 +29668,9 @@ 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 ""
@@ -28760,6 +29692,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28809,9 +29744,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -29306,6 +30238,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29390,6 +30325,9 @@ 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 ""
@@ -29408,12 +30346,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29444,10 +30388,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29489,7 +30433,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29504,7 +30448,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29546,6 +30490,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29576,6 +30523,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29603,9 +30553,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29618,6 +30565,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29681,6 +30631,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29723,18 +30676,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29906,6 +30847,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -30203,6 +31147,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -30236,6 +31183,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30568,6 +31518,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30718,10 +31671,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30784,12 +31737,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30814,9 +31761,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30943,23 +31887,29 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30968,13 +31918,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -31061,6 +32008,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -31073,6 +32023,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -31094,10 +32047,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -31163,6 +32116,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -31295,6 +32263,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31466,9 +32437,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31646,6 +32614,12 @@ 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|Packages"
msgstr ""
@@ -31748,6 +32722,96 @@ 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 ""
@@ -31757,7 +32821,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31778,7 +32842,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31949,6 +33013,12 @@ 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 ""
@@ -31991,6 +33061,9 @@ 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 ""
@@ -32006,6 +33079,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -32015,9 +33091,15 @@ 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 ""
@@ -32090,6 +33172,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -32207,6 +33292,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -32254,9 +33342,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32374,6 +33459,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32440,6 +33528,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32461,15 +33552,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32668,6 +33771,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32689,6 +33798,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32746,10 +33858,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32758,7 +33870,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32785,64 +33897,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32881,6 +34002,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32908,7 +34032,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -33077,10 +34201,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -33176,9 +34297,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -33188,6 +34306,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -33254,7 +34375,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -33269,6 +34390,9 @@ 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 ""
@@ -33317,6 +34441,9 @@ 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 ""
@@ -33464,6 +34591,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33581,6 +34711,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33812,9 +34945,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33986,6 +35116,9 @@ 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 profile"
msgstr ""
@@ -34043,6 +35176,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -34068,6 +35204,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -34281,6 +35420,9 @@ 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 ""
@@ -34414,6 +35556,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34571,6 +35716,9 @@ msgstr[3] ""
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 ""
@@ -34714,6 +35862,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34810,9 +35961,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34856,9 +36004,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34976,6 +36121,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -35060,7 +36208,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -35141,6 +36289,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -35150,9 +36301,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -35201,9 +36358,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35500,6 +36654,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35527,6 +36687,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35554,9 +36717,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/pt_BR/gitlab.po b/locale/pt_BR/gitlab.po
index cd935bc6e6f..999e9ace8b0 100644
--- a/locale/pt_BR/gitlab.po
+++ b/locale/pt_BR/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: pt-BR\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:05\n"
+"PO-Revision-Date: 2021-03-05 23:49\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr " ou referências (ex. caminho/para/projeto!merge_request_id)"
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -170,6 +173,11 @@ msgid_plural "%d days"
msgstr[0] "%d dia"
msgstr[1] "%d dias"
+msgid "%d epic"
+msgid_plural "%d epics"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d error"
msgid_plural "%d errors"
msgstr[0] "%d: erro"
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ msgstr "%{edit_in_new_fork_notice} Tente reverter este commit novamente."
msgid "%{edit_in_new_fork_notice} Try to upload a file again."
msgstr "%{edit_in_new_fork_notice} Tente carregar um arquivo novamente."
+msgid "%{emailPrefix}@company.com"
+msgstr ""
+
msgid "%{extra} more downstream pipelines"
msgstr ""
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr "%{name} continha %{resultsString}"
@@ -682,6 +710,15 @@ msgstr[1] ""
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr "%{number_commits_behind} commits atrás de %{default_branch}, %{number_commits_ahead} commits à frente"
+msgid "%{oneMonthAgo} - %{today}"
+msgstr ""
+
+msgid "%{oneWeekAgo} - %{today}"
+msgstr ""
+
+msgid "%{oneYearAgo} - %{today}"
+msgstr ""
+
msgid "%{openOrClose} %{noteable}"
msgstr "%{openOrClose} %{noteable}"
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -976,6 +1016,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr "(Nenhuma mudança)"
@@ -988,9 +1031,6 @@ msgstr "(verificar progresso)"
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1015,9 +1055,6 @@ msgstr "%{moreCount} mais"
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1111,6 +1148,11 @@ 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] "1 grupo"
@@ -1162,6 +1204,9 @@ msgstr "1-9 contribuições"
msgid "10-19 contributions"
msgstr "10-19 contribuições"
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr "1ª contribuição!"
@@ -1282,6 +1327,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr ""
msgid "API Token"
msgstr "Token da API"
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr "Chave de acesso AWS"
@@ -1635,9 +1779,6 @@ msgstr "Adicionar chave GPG"
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr "Adicione um botão Grafana na barra lateral do administrador, monitorando a seção, para acessar uma variedade de estatísticas sobre a saúde e desempenho do GitLab."
-msgid "Add a To Do"
-msgstr "Adicionar um afazer"
-
msgid "Add a bullet list"
msgstr "Adicionar uma lista de marcadores"
@@ -1716,12 +1857,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr "Adicionar endereço de e-mail"
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1818,6 +1965,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr "Não há usuários especificados."
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1938,6 +2103,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2058,6 +2226,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr "Defina uma %{link_start}configuração de pipeline%{link_end} incluída automaticamente em toda a instância. Esta configuração de pipeline será executada após a configuração do próprio projeto."
@@ -2091,6 +2268,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
msgstr "Especifique um domínio a ser usado por padrão para os estágios de Auto Review Application e Auto Deploy de cada projeto."
+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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr "A configuração de pipeline necessária pode ser selecionada a partir do diretório %{code_start}gitlab-ci%{code_end} dentro do %{link_start}repositório modelo de instância%{link_end} configurado ou das configurações fornecidas pelo GitLab."
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr "Ativo"
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr "Administrador"
@@ -2259,6 +2442,15 @@ 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 ""
@@ -2268,6 +2460,9 @@ msgstr "É você!"
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr "Novo usuário"
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2361,6 +2562,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2394,6 +2607,21 @@ 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 ""
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr "Permissões avançadas, armazenamento de arquivos grandes e configurações de autenticação de dois fatores."
@@ -2483,9 +2714,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2576,9 +2792,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,9 +2813,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,49 +2837,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,76 +2867,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
-msgstr ""
-
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,13 +2927,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr "Alertas"
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr "Todos os projetos"
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2954,8 +3104,8 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
-msgstr "Permitir que esta chave também possa fazer push para o repositório? (Padrão permite apenas acesso para pull.)"
+msgid "Allow this key to push to this repository"
+msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
@@ -2996,6 +3146,9 @@ msgstr "Permite adicionar e gerenciar clusters do Kubernetes."
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr "Ocorreu um erro"
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3146,12 +3293,18 @@ msgstr "Erro ao ignorar alerta. Atualize a página e tente novamente."
msgid "An error occurred while dismissing the feature highlight. Refresh the page and try dismissing again."
msgstr "Erro ao remover alerta. Atualize a página e tente novamente."
+msgid "An error occurred while drawing job relationship links."
+msgstr ""
+
msgid "An error occurred while enabling Service Desk."
msgstr "Um erro ocorreu ao habilitar a Central de Serviços."
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr "Ocorreu um erro ao buscar cores de rótulo."
msgid "An error occurred while fetching markdown preview"
msgstr "Erro ao gerar pré-visualização do markdown"
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr "Ocorreu um erro ao recuperar os comentários pendentes"
@@ -3269,6 +3425,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3296,12 +3455,18 @@ 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 "Erro ao fazer a requisição."
@@ -3344,8 +3509,11 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
-msgstr "Erro ao salvar assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
+msgstr ""
msgid "An error occurred while subscribing to notifications."
msgstr "Ocorreu um erro ao inscrever às notificações."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3395,10 +3566,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr "Ocorreu um erro. Tente novamente."
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3757,9 +3928,6 @@ msgstr "Tem certeza de que deseja cancelar a edição deste comentário?"
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3787,6 +3955,9 @@ 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 erase this build?"
msgstr "Tem certeza de que deseja limpar este build?"
@@ -4048,12 +4219,6 @@ msgstr[1] "Anexando %d arquivos"
msgid "Attaching the file failed."
msgstr "Falha ao anexar o arquivo."
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr "Eventos de Auditoria"
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr "Autenticando"
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 "Importação de Servidores Bitbucket"
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr "Nome da branch"
msgid "Branch not loaded - %{branchId}"
msgstr "Branch não carregado - %{branchId}"
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr "Procurar por branches"
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr "Mudar de branch"
-
msgid "Branches"
msgstr "Branches"
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr "Negócios"
msgid "Business metrics (Custom)"
msgstr "Métricas de negócios (personalizadas)"
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr "Por padrão, o GitLab envia e-mails em formatos HTML e texto plano para que os clientes possam escolher o formato a ser utilizado. Desative esta opção se você quiser apenas enviar e-mails em formato de texto plano."
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr "Por padrão, todos os projetos e grupos usarão as configurações de notificações globais."
@@ -5028,6 +5235,26 @@ msgstr "CI/CD para um repositório externo"
msgid "CI/CD settings"
msgstr "Configurações de CI/CD"
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr "Cancelar"
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr "Pick para um branch"
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr "Reverter no branch"
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr "Verificando disponibilidade de %{text}…"
@@ -5688,8 +5915,8 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr "Escolha o grupo principal para importar seus repositórios."
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
-msgstr "Escolha o nível de visibilidade, ative/desative os recursos do projeto (issues, repositório, wiki, snippets) e defina as permissões."
+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 ""
@@ -5703,6 +5930,9 @@ msgstr "Escolha quais repositórios você deseja se conectar e executar pipeline
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr "cancelado"
@@ -6036,21 +6266,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr ""
msgid "Code"
msgstr "Código"
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr "Recolher aprovadores"
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7325,17 +7594,41 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr "%{source_branch} e %{target_branch} são o mesmo."
-msgid "CompareBranches|Compare"
-msgstr "Comparar"
+msgid "CompareBranches|There isn't anything to compare."
+msgstr "Não há nada para comparar."
-msgid "CompareBranches|Source"
-msgstr "Origem"
+msgid "CompareRevisions|Branches"
+msgstr ""
-msgid "CompareBranches|Target"
-msgstr "Alvo"
+msgid "CompareRevisions|Compare"
+msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
-msgstr "Não há nada para comparar."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
+msgstr ""
msgid "Complete"
msgstr ""
@@ -7349,6 +7642,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7391,6 +7729,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7430,6 +7771,9 @@ msgstr "Configure os runners do GitLab para começar a usar o Terminal da Web. %
msgid "Configure Gitaly timeouts."
msgstr "Configurar timeouts do Gitaly."
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr "Configurar Let's Encrypt"
@@ -7451,6 +7795,9 @@ msgstr "Configurar instalação existente"
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr "Parabéns! Você ativou a autenticação de dois fatores!"
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8245,12 +8577,12 @@ 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 "Criar uma nova branch"
-msgid "Create a new deploy key for this project"
-msgstr ""
-
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr "Criar a branch"
@@ -8302,6 +8637,9 @@ msgstr "Criar arquivo"
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr "Criar grupo"
@@ -8314,6 +8652,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr "Criar lista a partir de etiquetas. Issues com etiquetas aparecem nestas listas."
@@ -8329,6 +8670,12 @@ msgstr "Criar marco"
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,14 +8991,14 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
-msgstr "Perfil"
+msgid "CurrentUser|One of your groups is running out"
+msgstr ""
-msgid "CurrentUser|Settings"
-msgstr "Configurações"
+msgid "CurrentUser|Preferences"
+msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
@@ -8647,8 +9024,8 @@ msgstr ""
msgid "Custom notification events"
msgstr "Eventos de notificação personalizados"
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
-msgstr "Níveis de notificação personalizados são equivalentes a níveis de participação. Com níveis de notificação personalizados você também será notificado sobre eventos selecionados. Para mais informações, visite %{notification_link}."
+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 "Modelos de projetos personalizados"
@@ -8689,6 +9066,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr "Personalizar cores"
@@ -8722,6 +9102,18 @@ 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 ""
@@ -8886,7 +9278,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 "Os dados ainda estão a ser calculados..."
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr "Depurar"
@@ -9261,9 +9682,6 @@ msgstr "Recusar e sair"
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr "Branch padrão"
-
msgid "Default CI configuration path"
msgstr ""
@@ -9318,6 +9736,9 @@ msgstr "Defina um padrão personalizado utilizando a sintaxe do cron"
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr "atrasado"
msgid "Delete"
msgstr "Excluir"
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr "Excluir este anexo"
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9429,6 +9856,15 @@ 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 "Excluído"
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr "A chave de deploy foi atualizada com sucesso."
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
-msgstr ""
-
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr "+%{count} outros"
@@ -9660,6 +10093,9 @@ msgstr "Erro ao remover chave de deploy"
msgid "DeployKeys|Expand %{count} other projects"
msgstr "Expandir %{count} outros projetos"
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr "Carregando chaves de deploy"
@@ -9678,9 +10114,6 @@ msgstr "Chaves de deploy acessíveis publicamente"
msgid "DeployKeys|Read access only"
msgstr "Apenas acesso de leitura"
-msgid "DeployKeys|Write access allowed"
-msgstr "Acesso de edição permitido"
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr "Você removerá essa chave de deploy. Tem certeza?"
@@ -9690,19 +10123,19 @@ msgstr "Tokens de deploy ativos (%{active_tokens})"
msgid "DeployTokens|Add a deploy token"
msgstr "Adicionar um token de deploy"
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
-msgstr "Permite acesso somente-leitura às imagens do registry"
+msgid "DeployTokens|Allows read-only access to registry images."
+msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
-msgstr "Permite acesso somente-leitura ao repositório"
+msgid "DeployTokens|Allows read-only access to the repository."
+msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9717,12 +10150,9 @@ msgstr "Criar token de deploy"
msgid "DeployTokens|Created"
msgstr "Criado"
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
+msgid "DeployTokens|Deploy tokens"
msgstr ""
-msgid "DeployTokens|Deploy Tokens"
-msgstr "Tokens de deploy"
-
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
msgstr ""
@@ -9735,8 +10165,8 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr "Nome"
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
-msgstr "Escolha um nome para a aplicação e lhe forneceremos um token de deploy exclusivo."
+msgid "DeployTokens|Pick a name for your unique deploy token."
+msgstr ""
msgid "DeployTokens|Revoke"
msgstr "Revogar"
@@ -9756,11 +10186,17 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr "Esta ação não pode ser desfeita."
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
-msgstr "Use este token como uma senha. Certifique-se de salvá-lo, pois, não será possível acessá-lo novamente."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
+msgstr ""
-msgid "DeployTokens|Use this username as a login."
-msgstr "Use este nome de usuário como um login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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 "Nome de Usuário"
@@ -9768,8 +10204,8 @@ msgstr "Nome de Usuário"
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
-msgstr "Seu novo token de deploy"
+msgid "DeployTokens|Your new Deploy Token username"
+msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
msgstr ""
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10047,18 +10482,6 @@ msgstr "Detectar chaves de host"
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,7 +10710,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr "E-mails"
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr "Ativar cabeçalho e rodapé em e-mails"
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11048,20 +11468,14 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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."
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the issue description"
-msgstr "Digite a descrição da issue"
-
-msgid "Enter the issue title"
-msgstr "Digite o título da issue"
-
-msgid "Enter the merge request description"
-msgstr "Digite a descrição do merge request"
+msgid "Enter the %{name} title"
+msgstr ""
-msgid "Enter the merge request title"
-msgstr "Digite o título do merge request"
+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 name of your application, and we'll return a unique %{type}."
msgstr ""
@@ -11345,6 +11759,9 @@ msgstr "protegido"
msgid "Epic"
msgstr "Epic"
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11369,6 +11786,12 @@ msgstr "Epics permitem gerenciar seu portfólio de projetos de forma mais eficie
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 ""
@@ -11396,6 +11819,9 @@ msgstr "Como posso resolver isso?"
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr "Remover épico"
@@ -11423,6 +11849,9 @@ msgstr ""
msgid "Epics|Something went wrong while fetching child epics."
msgstr "Algo deu errado ao buscar épicos filhos."
+msgid "Epics|Something went wrong while fetching epics list."
+msgstr ""
+
msgid "Epics|Something went wrong while fetching group epics."
msgstr ""
@@ -11447,9 +11876,6 @@ 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 "Para agendar o seu épico %{epicDateType} baseado em marcos temporais, atribua um marco com uma data %{epicDateType} a qualquer issue no épico."
-msgid "Epics|Unable to perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr "Erro ao enviar o arquivo"
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr "Exemplo: Uso = consulta única. (Solicitada) / (Capacidade) = múltiplas
msgid "Except policy:"
msgstr "Exceto da política:"
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr "Expandir aprovadores"
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11882,6 +12320,9 @@ msgstr "Expira"
msgid "Expires at"
msgstr "Expira em"
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr "Expira em %{expires_at}"
@@ -11915,6 +12356,9 @@ msgstr "Explorar grupos públicos"
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr "Exportar como CSV"
@@ -12038,10 +12482,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12068,6 +12512,12 @@ msgstr "Falha ao fazer deploy para"
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 ""
@@ -12104,9 +12554,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr "Falha ao carregar branches relacionados"
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,10 +12602,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr "Falha ao entrar usando a autenticação de cartão inteligente"
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr "Falha ao atualizar Issues. Por favor, tente novamente."
-msgid "Failed to update tag!"
-msgstr "Falha ao atualizar a tag!"
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr "Feature flag"
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr "O Feature flag não foi removido."
@@ -12763,6 +13207,15 @@ msgstr "Importação do FogBugz"
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr "Cor da Fonte"
@@ -12826,6 +13279,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr "Fork criado a partir de"
@@ -12856,8 +13345,8 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
-msgstr "Avaliação gratuita do GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
+msgstr ""
msgid "Freeze end"
msgstr ""
@@ -12934,9 +13423,6 @@ msgstr "Geo"
msgid "Geo Nodes"
msgstr "Nós do Geo"
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13096,6 +13585,9 @@ msgstr "%{name} está agendado para re-sincronização"
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13135,6 +13627,9 @@ msgstr "Não foi possível remover o registro de rastreamento de um projeto exis
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr "Não foi possível remover a entrada de rastreamento para um envio existente."
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr "Falha"
@@ -13144,6 +13639,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr "Geo Status"
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr "Última tentativa de sincronização"
msgid "Geo|Last time verified"
msgstr "Última vez verificada"
+msgid "Geo|Learn more about Geo"
+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 "Nunca"
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr "Projeto"
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr "Status"
@@ -13291,6 +13801,9 @@ msgstr "Falha na verificação - %{error}"
msgid "Geo|Waiting for scheduler"
msgstr "Aguardando o agendador"
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr "Comece com o rastreamento de erros"
@@ -13330,6 +13840,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr "Introdução às versões"
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr "Git LFS não está habilitado neste servidor GitLab, contate seu administrador."
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr "Importação do GitHub"
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr "Tela cheia"
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr "Conceder acesso"
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr "Gráfico"
@@ -13828,6 +14344,9 @@ msgstr "O grupo SAML deve ser habilitado para testar"
msgid "Group URL"
msgstr "URL do grupo"
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr "Avatar do grupo"
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr "Procura por nome"
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr "Ocultar projetos arquivados"
@@ -14630,6 +15164,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr "Instalar em clusters"
@@ -15703,96 +16240,6 @@ msgstr "O grupo de administradores da instância já existe"
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr "Convidar \"%{trimmed}\" por e-mail"
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr "Convidar grupo"
@@ -16078,9 +16543,6 @@ msgstr "Convidar membro"
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ msgstr "Issues fechadas"
msgid "Issues with comments, merge requests with diffs and comments, labels, milestones, snippets, and other project entities"
msgstr "Issues com comentários, merge requests com diffs e comentários, etiquetas, marcos, snippets e outras entidades do projeto"
+msgid "Issues with label %{label}"
+msgstr ""
+
msgid "Issues with no epic assigned"
msgstr ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ 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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16972,6 +17518,9 @@ msgstr "Etiquetas podem ser aplicadas a issues e merge requests para categorizá
msgid "Labels can be applied to issues and merge requests."
msgstr "Etiquetas podem ser aplicadas a issues e merge requests."
+msgid "Labels with no issues in this iteration:"
+msgstr ""
+
msgid "Labels|%{spanStart}Promote label%{spanEnd} %{labelTitle} %{spanStart}to Group Label?%{spanEnd}"
msgstr ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] "Último %d dia"
msgstr[1] "Últimos %d dias"
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17085,6 +17640,9 @@ msgstr "Última utilização em:"
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17118,6 +17676,9 @@ msgstr "Aprenda GitLab"
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr "Aprenda como %{link_start}contribuir para os modelos embutidos%{link_end}"
@@ -17169,9 +17730,6 @@ msgstr "Saiba mais sobre os modelos de projeto de nível de grupo"
msgid "Learn more about signing commits"
msgstr "Saiba mais sobre assinar commits"
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr "Saiba mais em"
@@ -17181,6 +17739,96 @@ msgstr "documentação de agendamento de pipeline"
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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr "Sair"
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr "Listar repositórios disponíveis"
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr "Nível máximo de acesso"
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr "Aprovações de merge request"
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr "Adicionar uma resposta"
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr "Ocorreu um erro ao salvar o rascunho do comentário."
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr "Responder..."
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr "Mais estrelas"
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr "Mover"
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr "Mover issue"
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr "Novo branch"
@@ -19590,6 +20253,9 @@ msgstr ""
msgid "New directory"
msgstr "Novo diretório"
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr "Nova etiqueta"
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr "Novo merge request"
@@ -19737,6 +20406,9 @@ msgstr "Nenhuma atividade encontrada"
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr "Nenhuma conexão pode ser feita para um servidor Gitaly, por favor check os logs!"
@@ -19788,6 +20466,9 @@ msgstr ""
msgid "No due date"
msgstr "Sem validade"
+msgid "No email participants were added. Either none were provided, or they already exist."
+msgstr ""
+
msgid "No endpoint provided"
msgstr ""
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr "Nota: Considere pedir ao seu administrador do GitLab para configurar %{g
msgid "NoteForm|Note"
msgstr "Nota"
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr "Você tem certeza que quer cancelar a criação deste comentário?"
msgid "Notes|Collapse replies"
msgstr "Recolher respostas"
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,9 @@ 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"
+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 ""
@@ -20088,9 +20781,6 @@ msgstr ""
msgid "Notification events"
msgstr "Eventos de notificação"
-msgid "Notification setting"
-msgstr "Configuração de notificação"
-
msgid "Notification setting - %{notification_title}"
msgstr "Configuração de notificação - %{notification_title}"
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr "Aceitar merge request"
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr "Participar"
msgid "NotificationLevel|Watch"
msgstr "Observar"
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr "Notificações"
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ 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."
+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."
@@ -20552,7 +21257,7 @@ 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 Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr "Oops, você tem certeza?"
msgid "Open"
msgstr "Abrir"
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20579,12 +21290,12 @@ msgstr ""
msgid "Open errors"
msgstr "Abrir erros"
-msgid "Open in Xcode"
-msgstr "Abrir no Xcode"
-
msgid "Open in file view"
msgstr ""
+msgid "Open in your IDE"
+msgstr ""
+
msgid "Open issues"
msgstr ""
@@ -20651,6 +21362,9 @@ msgstr "Painel de Operações"
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
msgstr "O painel de operações fornece um resumo da integridade operacional de cada projeto, incluindo status de pipeline e alerta."
+msgid "Optimize your workflow with CI/CD Pipelines"
+msgstr ""
+
msgid "Optional"
msgstr "Opcional"
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20762,6 +21473,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr "Pacotes"
@@ -21077,6 +21809,15 @@ msgstr "Parâmetro"
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr "Atrasado"
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr "rastro"
@@ -21284,9 +22028,6 @@ msgstr "Agendamento da Pipeline"
msgid "Pipeline Schedules"
msgstr "Agendamentos da Pipeline"
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21308,10 +22049,10 @@ msgstr "Gatilho de pipeline"
msgid "Pipeline: %{status}"
msgstr "Pipeline: %{status}"
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr "Gráficos de pipelines"
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr "Pipelines para o último ano"
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,12 +22154,12 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr "Limpar cache dos Runners"
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
-msgstr "A integração contínua pode ajudar a capturar bugs, executando seus testes automaticamente enquanto a entrega contínua pode ajudá-lo a fornecer o código para o seu ambiente de produto."
-
msgid "Pipelines|Copy trigger token"
msgstr ""
+msgid "Pipelines|Could not load merged YAML content"
+msgstr ""
+
msgid "Pipelines|Description"
msgstr ""
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-msgstr "Saiba como funcionam as pipelines"
-
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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr "Carregando Pipelines"
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr "Atualmente não há pipelines."
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr "Ocorreu um erro ao buscar os pipelines. Tente novamente daqui a pouco ou entre em contato com sua equipe de suporte."
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ msgstr ""
msgid "Pipeline|Pipeline"
msgstr "Pipeline"
+msgid "Pipeline|Pipeline %{idStart}#%{idEnd} %{statusStart}%{statusEnd} for %{commitStart}%{commitEnd}"
+msgstr ""
+
+msgid "Pipeline|Pipeline cannot be run."
+msgstr ""
+
msgid "Pipeline|Pipelines"
msgstr ""
@@ -21665,6 +22415,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr "Variáveis"
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr "Você está prestes a interromper o pipeline %{pipelineId}."
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ msgstr "Por favor, selecione e adicione um membro"
msgid "Please select at least one filter to see results"
msgstr "Por favor selecione pelo menos um filtro para ver os resultados"
+msgid "Please select what should be included in each exported requirement."
+msgstr ""
+
msgid "Please set a new password before proceeding."
msgstr "Defina uma nova senha antes de continuar."
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr "Por favor, resolva o reCAPTCHA"
@@ -21923,21 +22685,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 "Exibir a hora no formato de 24 horas"
+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 mins ago."
msgstr "Por exemplo: 30 mins atrás."
+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 ""
@@ -21959,6 +22739,12 @@ 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 ""
@@ -22067,6 +22853,9 @@ msgstr "Etiqueta priorizada"
msgid "Private"
msgstr "Privado"
+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 ""
@@ -22151,24 +22940,6 @@ msgstr "Perfil"
msgid "Profile Settings"
msgstr "Configurações do perfil"
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22205,6 +22976,9 @@ msgstr "Adicionar chave"
msgid "Profiles|Add status emoji"
msgstr "Adicionar emoji de status"
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr "Recortar Avatar"
@@ -22562,6 +23336,9 @@ msgstr ""
msgid "Project ID"
msgstr "ID do projeto"
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr "URL do projeto"
@@ -22790,10 +23567,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22805,7 +23579,7 @@ msgstr "Resolver automaticamente discussões de diff do merge request quando ela
msgid "ProjectSettings|Badges"
msgstr "Selos"
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr "Contate um administrador para alterar essa configuração."
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-msgstr ""
-
msgid "ProjectSettings|Every merge creates a merge commit"
msgstr "Cada merge cria um commit de merge"
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."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,13 +23672,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22937,13 +23714,16 @@ msgstr "Apenas para commits assinados pode-se fazer push para este repositório.
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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22970,16 +23750,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,30 +23816,36 @@ msgstr "Essa configuração está aplicada no nível do servidor, mas foi sobres
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr "Essa configuração será aplicada a todos os projetos a menos que seja sobrescrita por um administrador."
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr "Isso determinará o histórico de commit quando você faz merge de uma merge request"
msgid "ProjectSettings|Transfer project"
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 "Usuários só podem fazer push para este repositório com commits que contenham um de seus e-mails verificados."
-msgid "ProjectSettings|View and edit files in this project"
+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 will only have read access"
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|View project analytics"
+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|What are badges?"
msgstr ""
@@ -23060,19 +23855,10 @@ msgstr ""
msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr "Quando conflitos surgem, o usuários tem a opção de fazer rebase"
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
-msgstr ""
-
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
-msgstr ""
-
msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
-msgstr ""
-
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr "Ativo"
msgid "PrometheusService|Auto configuration"
msgstr "Configuração automática"
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
-msgstr "Fazer deploy automático e configurar o Prometheus nos seus clusters para monitorar o ambiente do seu projeto"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
+msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr "Métricas comuns"
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr "Métricas comuns são monitoradas automaticamente com base em uma biblioteca de métricas de exportadores populares."
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr "Métricas personalizadas"
@@ -23381,6 +24164,15 @@ msgstr "Encontrando e configurando métricas..."
msgid "PrometheusService|Finding custom metrics..."
msgstr "Encontrando métricas personalizadas..."
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr "Instale o Prometheus nos clusters"
@@ -23396,6 +24188,12 @@ msgstr "Métricas"
msgid "PrometheusService|Missing environment variable"
msgstr "Variável de ambiente ausente"
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr "Mais informações"
@@ -23408,23 +24206,23 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
-msgstr "URL da API base do Prometheus. como http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgstr ""
+
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
-msgstr "Prometheus está sendo automaticamente gerenciado nos seus clusters"
+msgid "PrometheusService|The Prometheus API base URL."
+msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+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 "Essas métricas serão monitoradas após sua primeira implantação para um ambiente"
-msgid "PrometheusService|Time-series monitoring service"
-msgstr "Serviço de monitoramento de tempo-de-série"
-
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
-msgstr "Para ativar a instalação do Prometheus nos seus clusters, desative a configuração manual abaixo"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
msgstr "Aguardando sua primeira implantação em um ambiente para encontrar métricas comuns"
@@ -23432,6 +24230,12 @@ msgstr "Aguardando sua primeira implantação em um ambiente para encontrar mét
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr "Promover"
@@ -23522,9 +24326,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr "Aprimorar plano"
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr "Ambientes Protegidos"
-
msgid "Protected Paths"
msgstr ""
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23675,8 +24476,8 @@ msgstr "Seu ambiente foi protegido."
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr "Seu ambiente foi desprotegido"
-msgid "Protip:"
-msgstr "Dicas:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgstr ""
msgid "Protocol"
msgstr ""
@@ -23771,8 +24572,50 @@ msgstr ""
msgid "Push to create a project"
msgstr "Push para criar um projeto"
-msgid "PushRule|Committer restriction"
-msgstr "Restrição de committer"
+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 "Push realizado"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr "Recente"
@@ -24072,6 +24921,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr "Remover relacionamento de fork"
@@ -24243,6 +25098,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,7 +25269,7 @@ msgstr "Responder ao comentário"
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr "Responda a este e-mail diretamente ou %{view_it_on_gitlab}."
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr "Ações"
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr "Classe"
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr "Solicitar acesso"
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr "Solicitado %{time_ago}"
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr "Redefinir modelo"
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr "Redefinir a chave de autorização invalidará a chave anterior. As configurações de alerta existentes terão de ser atualizadas com a nova chave."
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr "Salvar alterações"
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr ""
msgid "Search forks"
msgstr "Pesquisar forks"
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr "Pesquisar merge requests"
@@ -25595,7 +26480,7 @@ msgstr "Secreto"
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25721,6 +26612,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,10 +26627,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,19 +26744,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr "Selecionar o branch/tag"
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr "Selecione o projeto para escolher a zona"
msgid "Select projects"
msgstr "Selecionar projetos"
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr ""
msgid "Select user"
msgstr "Selecionar usuário"
+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 "Os níveis selecionados não podem ser usados por usuários não administradores para grupos, projetos ou snippets. Se o nível público for restrito, os perfis de usuário só serão visíveis para usuários conectados."
+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 ""
@@ -26161,8 +27062,8 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
-msgstr "Enviar uma notificação de e-mail separada para os desenvolvedores."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
+msgstr ""
msgid "Send confirmation email"
msgstr "Enviar e-mail de confirmação"
@@ -26338,6 +27239,9 @@ msgstr "Defina uma senha para sua conta para aceitar ou entregar código via %{p
msgid "Set a template repository for projects in this group"
msgstr "Definir um repositório de modelos para projetos neste grupo"
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] "Mostrando %d evento"
msgstr[1] "Mostrando %d eventos"
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr "Algo deu errado no nosso lado. Por favor, tente novamente!"
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr "Ocorreu um erro ao tentar alterar a confidencialidade desta issue"
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr "Algo deu errado ao tentar mudar o estado de bloqueio desse %{issuableDisplayName}"
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr "Algo deu errado ao resolver essa discussão. Por favor, tente novamente."
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27287,9 +28194,6 @@ msgstr "Assinados mais novos"
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27479,12 +28383,15 @@ msgstr "Iniciar um %{new_merge_request} a partir dessas alterações"
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
-msgstr "Iniciar uma nova discussão..."
+msgid "Start a new discussion…"
+msgstr ""
msgid "Start a new merge request"
msgstr "Iniciar um novo merge request"
+msgid "Start a new merge request with these changes"
+msgstr ""
+
msgid "Start a review"
msgstr "Iniciar uma revisão"
@@ -27989,68 +28896,68 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
-msgstr "Verde claro"
+msgid "SuggestedColors|Aztec Gold"
+msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
-msgstr "Ciano cinzento escuro"
+msgid "SuggestedColors|Blue"
+msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
-msgstr "Azul escuro moderado"
+msgid "SuggestedColors|Blue-gray"
+msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
-msgstr "Laranja escuro moderado"
+msgid "SuggestedColors|Carrot orange"
+msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
-msgstr "Rosa escuro moderado"
+msgid "SuggestedColors|Champagne"
+msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
-msgstr "Violeta escuro moderado"
+msgid "SuggestedColors|Charcoal grey"
+msgstr ""
-msgid "SuggestedColors|Feijoa"
-msgstr "Feijoa"
+msgid "SuggestedColors|Crimson"
+msgstr ""
-msgid "SuggestedColors|Lime green"
-msgstr "Verde limão"
+msgid "SuggestedColors|Dark coral"
+msgstr ""
-msgid "SuggestedColors|Moderate blue"
-msgstr "Azul moderado"
+msgid "SuggestedColors|Dark green"
+msgstr ""
-msgid "SuggestedColors|Pure red"
-msgstr "Vermelho puro"
+msgid "SuggestedColors|Dark sea green"
+msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
-msgstr "Laranja suave"
+msgid "SuggestedColors|Gray"
+msgstr ""
-msgid "SuggestedColors|Soft red"
-msgstr "Vermelho suave"
+msgid "SuggestedColors|Green screen"
+msgstr ""
-msgid "SuggestedColors|Strong pink"
-msgstr "Rosa forte"
+msgid "SuggestedColors|Green-cyan"
+msgstr ""
-msgid "SuggestedColors|Strong red"
-msgstr "Vermelho forte"
+msgid "SuggestedColors|Lavendar"
+msgstr ""
-msgid "SuggestedColors|Strong yellow"
-msgstr "Amarelo forte"
+msgid "SuggestedColors|Magenta-pink"
+msgstr ""
-msgid "SuggestedColors|UA blue"
-msgstr "Azul UA"
+msgid "SuggestedColors|Medium sea green"
+msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
-msgstr "Verde limão muito escuro"
+msgid "SuggestedColors|Rose red"
+msgstr ""
-msgid "SuggestedColors|Very pale orange"
-msgstr "Laranja muito pálido"
+msgid "SuggestedColors|Titanium yellow"
+msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
msgstr ""
@@ -28136,6 +29043,12 @@ 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})"
@@ -28145,7 +29058,7 @@ msgstr "Cabeçalho e rodapé do sistema"
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr "Termos de Serviço e Política de Privacidade"
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr "A etapa de homologação mostra o tempo entre o aceite da solicitação
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ 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 "Não há issues fechadas"
@@ -29076,12 +30004,18 @@ msgstr "Não há issues para mostrar"
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr "Ainda não há etiquetas"
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29112,12 +30046,12 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
-msgstr ""
-
msgid "There is already a repository with that name on disk"
msgstr "Já existe um repositório com esse nome no disco"
+msgid "There is already a to-do item for this design."
+msgstr ""
+
msgid "There is no chart data available."
msgstr ""
@@ -29157,7 +30091,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr "Erro ao carregar calendário de atividades."
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr "Ocorreu um erro ao salvar suas alterações."
-msgid "There was an error saving your notification settings."
-msgstr "Erro ao salvar suas configurações de notificação."
-
msgid "There was an error subscribing to this label."
msgstr "Erro ao se inscrever nessa etiqueta."
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29574,6 +30505,9 @@ msgstr "Esta é uma lista de dispositivos com os quais você logou em sua conta.
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr "Este é um registro de segurança de eventos importantes envolvendo a sua conta."
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr "Dica:"
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr "Título"
@@ -30382,12 +31325,12 @@ 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 widen your search, change or remove filters."
msgstr "Para ampliar sua pesquisa, alterar ou remover filtros."
-msgid "To-Do"
-msgstr ""
-
msgid "To-Do List"
msgstr ""
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr "Mudar Status: Desligado"
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr "Mudar Status: Ligado"
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr "Visão em árvore"
msgid "Trending"
msgstr "Mais populares"
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr "Solucionar problemas e monitorar sua aplicação com rastreamento"
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr "Tente novamente"
@@ -30735,6 +31675,9 @@ msgstr "Use tudo que o GitLab tem para oferecer por 30 dias."
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr "Tente realizar o fork novamente"
@@ -30756,10 +31699,10 @@ msgstr "Terça-feira"
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ msgstr "URL"
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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr "Atualizar"
@@ -31308,6 +32266,12 @@ 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|Packages"
msgstr ""
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr "Use o Balcão de Atendimento para se conectar com seus usuários (por exemplo, para oferecer suporte ao cliente) por email dentro do GitLab"
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr "Use uma linha por URI"
msgid "Use template"
msgstr "Utilizar modelo"
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ msgstr "Editar perfil"
msgid "UserProfile|Explore public groups to find projects to contribute to."
msgstr "Explore grupos públicos para encontrar projetos para contribuir."
+msgid "UserProfile|Followers"
+msgstr ""
+
+msgid "UserProfile|Following"
+msgstr ""
+
msgid "UserProfile|Groups"
msgstr "Grupos"
@@ -31653,6 +32713,9 @@ msgstr ""
msgid "UserProfile|Subscribe"
msgstr "Inscrever-se"
+msgid "UserProfile|This user doesn't have any followers."
+msgstr ""
+
msgid "UserProfile|This user doesn't have any personal projects"
msgstr "Este usuário não tem nenhum projeto pessoal"
@@ -31668,6 +32731,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ msgstr "Ver tudo"
msgid "UserProfile|View user in admin area"
msgstr "Exibir usuário na área administrativa"
+msgid "UserProfile|You are not following other users."
+msgstr ""
+
msgid "UserProfile|You can create a group for several dependent projects."
msgstr "Você pode criar um grupo para vários projetos dependentes."
+msgid "UserProfile|You do not have any followers."
+msgstr ""
+
msgid "UserProfile|You haven't created any personal projects."
msgstr "Você não criou nenhum projeto pessoal."
@@ -31752,6 +32824,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31912,9 +32990,6 @@ msgstr "Ver arquivo @ "
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32032,6 +33107,9 @@ msgstr "Desconhecido"
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr "%{stepStart}Etapa 1%{stepEnd}. Copie o seguinte script:"
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
+msgstr ""
+
+msgid "Webhooks|URL is triggered when the pipeline status changes"
+msgstr ""
+
+msgid "Webhooks|URL must be percent-encoded if neccessary."
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,11 +33847,8 @@ msgstr "Excluir página"
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr "Excluir página %{pageTitle}?"
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr "Alguém editou essa página ao mesmo tempo que você. Por favor olhe %{page_link} e tenha certeza de que suas mudanças não removerão as mudanças deles."
-
-msgid "WikiPageConflictMessage|the page"
-msgstr "a página"
+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 "WikiPageCreate|Create %{pageTitle}"
msgstr "Criar %{pageTitle}"
@@ -32832,9 +33943,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr "Escreva a descrição do marco..."
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ 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 ""
@@ -33120,6 +34237,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr "Você ainda não tem nenhuma inscrição"
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr "Você não tem permissão para deixar este %{namespaceType}."
@@ -33237,6 +34357,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr "Você atingiu o limite de seu projeto"
+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 a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33642,6 +34762,9 @@ msgstr "Seu token de redefinição de senha expirou."
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 profile"
msgstr ""
@@ -33699,6 +34822,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr "adicionado %{created_at_timeago}"
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 ""
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34215,6 +35350,9 @@ 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 ""
@@ -34354,6 +35492,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] "merge request"
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr "Por favor, restaurar ou usar um branch %{missingBranchName} diferente"
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr "Se o branch %{missingBranchName} existir em seu repositório local, vocÃ
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr "Carregando estatísticas de implantação"
@@ -34698,7 +35836,7 @@ msgstr "Não houve merge para as mudanças em"
msgid "mrWidget|The changes will be merged into"
msgstr "Será feito merge das alterações em"
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr "para ser realizado merge automaticamente quando o pipeline for bem suced
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr "nenhum"
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr "e-mails de notificação"
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35128,6 +36272,12 @@ msgstr ""
msgid "this document"
msgstr "este documento"
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr "nome do usuário"
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr "use clusters Kubernetes para deploy do seu código!"
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/pt_PT/gitlab.po b/locale/pt_PT/gitlab.po
index a102819d795..ef1f66d20d3 100644
--- a/locale/pt_PT/gitlab.po
+++ b/locale/pt_PT/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: pt-PT\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 18:01\n"
+"PO-Revision-Date: 2021-03-05 23:57\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -170,6 +173,11 @@ 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] ""
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ msgstr "%{edit_in_new_fork_notice} Tenta reverter este envio novamente."
msgid "%{edit_in_new_fork_notice} Try to upload a file again."
msgstr ""
+msgid "%{emailPrefix}@company.com"
+msgstr ""
+
msgid "%{extra} more downstream pipelines"
msgstr ""
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr "%{name} continha %{resultsString}"
@@ -682,6 +710,15 @@ msgstr[1] ""
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr "%{number_commits_behind} envios atrás %{default_branch}, %{number_commits_ahead} envios à frente"
+msgid "%{oneMonthAgo} - %{today}"
+msgstr ""
+
+msgid "%{oneWeekAgo} - %{today}"
+msgstr ""
+
+msgid "%{oneYearAgo} - %{today}"
+msgstr ""
+
msgid "%{openOrClose} %{noteable}"
msgstr "%{openOrClose} %{noteable}"
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -976,6 +1016,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr "(Sem alterações)"
@@ -988,9 +1031,6 @@ msgstr "(verificar progresso)"
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1015,9 +1055,6 @@ msgstr "+ mais %{moreCount}"
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1111,6 +1148,11 @@ 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] "1 grupo"
@@ -1162,6 +1204,9 @@ msgstr "1-9 contribuições"
msgid "10-19 contributions"
msgstr "10-19 contribuições"
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr "1ª contribuição!"
@@ -1282,6 +1327,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr ""
msgid "API Token"
msgstr "Token API"
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1635,9 +1779,6 @@ msgstr "Adicionar uma chave GPG"
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr "Adicionar uma lista de marcadores"
@@ -1716,12 +1857,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr "Adicionar endereço de email"
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1818,6 +1965,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr "Nenhum utilizador especificado."
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1938,6 +2103,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2058,6 +2226,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr "Define uma %{link_start}configuração de pipeline%{link_end} automática incluída em toda a instância. Esta configuração de pipeline será executada após a Configurações do próprio projeto."
@@ -2091,6 +2268,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
msgstr "Especifica um domínio para utilizar por padrão para cada projeto, Revisão Automática de Aplicações e Implementação Automática de fases."
+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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr "A configuração de pipeline necessária pode ser selecionada no diretório %{code_start}gitlab-ci%{code_end} dentro do %{link_start}repositório modelo de instância%{link_end} configurado ou das configurações fornecidas pelo GitLab."
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr "Ativo"
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr "Administrador"
@@ -2259,6 +2442,15 @@ 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 ""
@@ -2268,6 +2460,9 @@ msgstr "És tu!"
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr "Novo utilizador"
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2361,6 +2562,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2394,6 +2607,21 @@ 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 ""
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr "Permissões avançadas, Armazenamento de Ficheiro Grandes e definições de autenticação de Dois Fatores."
@@ -2483,9 +2714,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2576,9 +2792,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,9 +2813,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,49 +2837,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,76 +2867,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
-msgstr ""
-
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,13 +2927,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr "Alertas"
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr "Todos os projetos"
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2954,8 +3104,8 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
-msgstr "Permitir que esta chave seja também, enviada ao repositório? (O padrão só permite o acesso pull)"
+msgid "Allow this key to push to this repository"
+msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
@@ -2996,6 +3146,9 @@ msgstr "Permite -te adicionar e gerir clusters do Kubernetes."
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr "Ocorreu um erro"
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3146,12 +3293,18 @@ msgstr "Ocorreu um erro ao dispensar o alerta. Atualiza a página e tenta novame
msgid "An error occurred while dismissing the feature highlight. Refresh the page and try dismissing again."
msgstr "Ocorreu um erro ao dispensar o recurso de destaque. Atualiza a página e tenta dispensar novamente."
+msgid "An error occurred while drawing job relationship links."
+msgstr ""
+
msgid "An error occurred while enabling Service Desk."
msgstr "Ocorreu um erro ao ativar a Central de Serviços."
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr "Ocorreu um erro ao buscar as cores das etiquetas."
msgid "An error occurred while fetching markdown preview"
msgstr "Ocorreu um erro ao buscar a pré-visualização do markdown"
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr "Ocorreu um erro ao buscar os comentários pendentes"
@@ -3269,6 +3425,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3296,12 +3455,18 @@ 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 "Ocorreu um erro ao fazer o pedido."
@@ -3344,8 +3509,11 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
-msgstr "Ocorreu um erro ao guardar destinatários"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
+msgstr ""
msgid "An error occurred while subscribing to notifications."
msgstr "Ocorreu um erro ao assinar as notificações."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3395,10 +3566,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr "Ocorreu um erro. Por favor, tenta novamente."
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3757,9 +3928,6 @@ msgstr "Tens a certeza de que desejas cancelar a edição deste comentário?"
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3787,6 +3955,9 @@ 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 erase this build?"
msgstr "Tens a certeza de que desejas apagar esta compilação?"
@@ -4048,12 +4219,6 @@ msgstr[1] "Anexar %d ficheiros"
msgid "Attaching the file failed."
msgstr "Falha ao anexar o ficheiro."
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr "Eventos de Auditoria"
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 "Importação de Servidores Bitbucket"
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr "Nome do ramo"
msgid "Branch not loaded - %{branchId}"
msgstr "Ramo não carregado - %{branchId}"
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr "Procurar por ramos"
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr "Alterar de ramo"
-
msgid "Branches"
msgstr "Ramos"
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr "Negócios"
msgid "Business metrics (Custom)"
msgstr "Métricas de negócio (Personalizado)"
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr "Por padrão, o GitLab envia emails em formatos HTML e texto simples para que os clientes de email possam escolher o formato a ser usado. Desativa esta opção se quiseres apenas enviar emails em formato de texto simples."
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr "Por padrão, todos os projetos e grupos usarão as definições globais de notificações."
@@ -5028,6 +5235,26 @@ msgstr "CI/CD para um repositório externo"
msgid "CI/CD settings"
msgstr "Definições de CI/CD"
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr "Cancelar"
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr "Escolher no ramo"
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr "Reverter no ramo"
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr "A verificar a disponibilidade de %{text}…"
@@ -5688,8 +5915,8 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr "Escolhe o grupo de nível superior para as tuas importações de repositório."
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
-msgstr "Escolhe o nível de visibilidade, ativa/desativa os recursos do projeto (problemas, repositório, wiki, snippets) e define as permissões."
+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 ""
@@ -5703,6 +5930,9 @@ msgstr "Escolhe quais repositórios desejas conectar e executar pipelines de CI/
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr "cancelado"
@@ -6036,21 +6266,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7325,16 +7594,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7349,6 +7642,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7391,6 +7729,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7430,6 +7771,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7451,6 +7795,9 @@ msgstr "Configurar instalação existente"
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8245,10 +8577,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8302,6 +8637,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8314,6 +8652,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8329,6 +8670,12 @@ msgstr "Criar objetivo"
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,13 +8991,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8647,7 +9024,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8689,6 +9066,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8722,6 +9102,18 @@ 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 ""
@@ -8886,7 +9278,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 ""
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9261,9 +9682,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9318,6 +9736,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9429,6 +9856,15 @@ 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 ""
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9660,6 +10093,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9678,9 +10114,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9690,19 +10123,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9717,10 +10150,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9735,7 +10165,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9756,10 +10186,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9768,7 +10204,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10047,18 +10482,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,7 +10710,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11048,19 +11468,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
-msgstr ""
-
-msgid "Enter the issue title"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11345,6 +11759,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11369,6 +11786,12 @@ 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 ""
@@ -11396,6 +11819,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11423,6 +11849,9 @@ 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 ""
@@ -11447,9 +11876,6 @@ 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 "Para agendar o teu épico da data de %{epicDateType}, com base em objetivos, atribui um objetivo com uma data de %{epicDateType} para qualquer problema no épico."
-msgid "Epics|Unable to perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11882,6 +12320,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11915,6 +12356,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12038,10 +12482,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12068,6 +12512,12 @@ 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 ""
@@ -12104,9 +12554,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,10 +12602,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12826,6 +13279,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12856,7 +13345,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12934,9 +13423,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13096,6 +13585,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13135,6 +13627,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13144,6 +13639,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr "Estado Geo"
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13291,6 +13801,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13330,6 +13840,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13828,6 +14344,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14630,6 +15164,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15703,96 +16240,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16078,9 +16543,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ 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 ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ 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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16972,6 +17518,9 @@ 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 ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] ""
msgstr[1] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17085,6 +17640,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17118,6 +17676,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17169,9 +17730,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17181,6 +17739,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr "Responder..."
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19590,6 +20253,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19737,6 +20406,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19788,6 +20466,9 @@ 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 ""
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr "Personalizado"
-
msgid "Notifications"
msgstr ""
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ 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."
+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."
@@ -20552,7 +21257,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20579,10 +21290,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20651,6 +21362,9 @@ 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 ""
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20762,6 +21473,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21077,6 +21809,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21284,9 +22028,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21308,10 +22049,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,10 +22154,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ 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 ""
@@ -21665,6 +22415,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21923,21 +22685,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21959,6 +22739,12 @@ 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 ""
@@ -22067,6 +22853,9 @@ 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 ""
@@ -22151,24 +22940,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22205,6 +22976,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22562,6 +23336,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22790,10 +23567,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22805,7 +23579,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,13 +23672,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22937,13 +23714,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22970,16 +23750,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,52 +23816,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23381,6 +24164,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23396,6 +24188,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23408,22 +24206,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23432,6 +24230,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23522,9 +24326,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23675,7 +24476,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23771,7 +24572,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr "Receber notificações sobre a tua própria atividade"
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24072,6 +24921,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24243,6 +25098,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,7 +25269,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr "Redefinir modelo"
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25595,7 +26480,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25721,6 +26612,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,10 +26627,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,19 +26744,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26161,8 +27062,8 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
-msgstr "Enviar uma notificação por email, separada aos Desenvolvedores."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
+msgstr ""
msgid "Send confirmation email"
msgstr ""
@@ -26338,6 +27239,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] ""
msgstr[1] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27287,9 +28194,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27479,12 +28383,15 @@ msgstr "Iniciar um %{new_merge_request} a partir destas alterações"
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27989,67 +28896,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28136,6 +29043,12 @@ 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 ""
@@ -28145,7 +29058,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr "A fase de preparação mostra o tempo entre a mesclagem do PM e a implem
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ 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 ""
@@ -29076,12 +30004,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr "Ainda não há etiquetas"
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29112,10 +30046,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29157,7 +30091,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29574,6 +30505,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr "Este é um registo de segurança de eventos importantes que envolvem a tua conta."
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30382,10 +31325,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr "Alternar Estado: DESLIGADO"
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr "Alternar Estado: LIGADO"
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30735,6 +31675,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30756,10 +31699,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31308,6 +32266,12 @@ 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|Packages"
msgstr ""
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ 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 ""
@@ -31653,6 +32713,9 @@ 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 ""
@@ -31668,6 +32731,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ 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 ""
@@ -31752,6 +32824,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31912,9 +32990,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32032,6 +33107,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,10 +33847,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32832,9 +33943,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr "Escreve a descrição do objetivo..."
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ 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 ""
@@ -33120,6 +34237,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33237,6 +34357,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33642,6 +34762,9 @@ 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 profile"
msgstr ""
@@ -33699,6 +34822,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr "adicionado %{created_at_timeago}"
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 ""
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34215,6 +35350,9 @@ 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 ""
@@ -34354,6 +35492,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34698,7 +35836,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35128,6 +36272,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/ro_RO/gitlab.po b/locale/ro_RO/gitlab.po
index f117e1678ab..7dadd24874a 100644
--- a/locale/ro_RO/gitlab.po
+++ b/locale/ro_RO/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: ro\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:04\n"
+"PO-Revision-Date: 2021-03-05 23:48\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -76,6 +76,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -190,6 +193,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%d epic"
+msgid_plural "%d epics"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d error"
msgid_plural "%d errors"
msgstr[0] ""
@@ -400,6 +409,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -481,6 +496,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -556,6 +574,9 @@ 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 ""
@@ -607,6 +628,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -715,6 +739,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -745,6 +775,15 @@ msgstr[2] ""
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 "%{openOrClose} %{noteable}"
msgstr "%{openOrClose} %{noteable}"
@@ -793,9 +832,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -841,6 +877,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1027,6 +1066,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -1051,6 +1093,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -1063,9 +1108,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1090,9 +1132,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1195,6 +1234,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "1 follower"
+msgid_plural "%{count} followers"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "1 group"
msgid_plural "%d groups"
msgstr[0] ""
@@ -1255,6 +1300,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1375,6 +1423,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1474,6 +1525,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1729,9 +1876,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1810,12 +1954,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1912,6 +2062,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1972,6 +2137,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -2032,6 +2200,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2152,6 +2323,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2176,6 +2353,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2185,6 +2365,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2260,6 +2443,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2353,6 +2539,15 @@ 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 ""
@@ -2362,6 +2557,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2446,6 +2644,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2455,6 +2659,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2488,6 +2704,21 @@ 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 ""
@@ -2512,6 +2743,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2578,9 +2812,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2593,24 +2824,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2671,9 +2890,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2683,6 +2899,9 @@ 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 ""
@@ -2692,9 +2911,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2719,49 +2935,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2773,9 +2956,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2785,76 +2965,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
-msgstr ""
-
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2866,13 +3025,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2884,9 +3043,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2899,7 +3055,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2986,9 +3142,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -3049,7 +3202,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -3091,6 +3244,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3157,12 +3313,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3241,12 +3391,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3271,6 +3427,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3364,6 +3523,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3391,12 +3553,18 @@ 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 ""
@@ -3439,7 +3607,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3478,6 +3649,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3490,10 +3664,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3856,9 +4030,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3886,6 +4057,9 @@ 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 erase this build?"
msgstr ""
@@ -4150,12 +4324,6 @@ msgstr[2] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4228,6 +4396,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4654,6 +4825,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4666,12 +4840,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4741,6 +4927,12 @@ 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 ""
@@ -4831,12 +5023,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -5005,16 +5191,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -5029,6 +5227,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -5062,6 +5263,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -5080,6 +5287,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5131,6 +5341,27 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5266,6 +5497,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5419,12 +5653,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5569,6 +5797,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5791,7 +6022,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5806,6 +6037,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6139,21 +6373,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6163,9 +6418,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7174,6 +7441,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7243,6 +7513,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7429,16 +7702,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7453,6 +7750,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7465,9 +7768,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7483,6 +7816,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7495,6 +7837,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7534,6 +7879,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7555,6 +7903,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7609,9 +7960,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7786,24 +8134,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8263,10 +8602,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8302,9 +8641,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8353,10 +8689,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8383,6 +8719,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8410,6 +8749,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8422,6 +8764,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8437,6 +8782,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8509,6 +8860,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8518,15 +8872,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8545,6 +8914,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8554,6 +8926,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8569,6 +8944,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8674,6 +9052,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8722,13 +9103,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8755,7 +9136,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8797,6 +9178,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8830,6 +9214,18 @@ 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 ""
@@ -8995,7 +9391,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9151,7 +9547,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9175,6 +9577,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9256,6 +9661,9 @@ 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 ""
@@ -9265,6 +9673,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9289,6 +9700,12 @@ 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] ""
+msgstr[2] ""
+
msgid "DastSiteValidation|Validate"
msgstr ""
@@ -9307,6 +9724,9 @@ 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 ""
@@ -9328,6 +9748,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9352,6 +9775,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9370,9 +9796,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9427,6 +9850,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9457,6 +9883,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9514,6 +9943,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9538,6 +9970,15 @@ 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 ""
@@ -9718,13 +10159,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9733,6 +10171,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9742,15 +10183,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9775,6 +10213,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9793,9 +10234,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9805,19 +10243,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9832,10 +10270,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9850,7 +10285,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9871,10 +10306,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
+msgstr ""
+
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Use this token as a password. Save it. This password can %{i_start}not%{i_end} be recovered."
msgstr ""
msgid "DeployTokens|Username"
@@ -9883,7 +10324,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9913,6 +10354,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9922,15 +10366,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9940,6 +10375,12 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10162,18 +10603,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10189,16 +10618,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10219,10 +10648,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10231,18 +10657,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10255,9 +10675,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10267,6 +10684,12 @@ 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 ""
@@ -10294,6 +10717,9 @@ 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|Score"
msgstr ""
@@ -10405,7 +10831,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10609,6 +11035,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10801,10 +11230,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10873,12 +11302,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10999,6 +11422,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11164,19 +11590,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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."
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the issue description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the issue title"
-msgstr ""
-
-msgid "Enter the merge request description"
-msgstr ""
-
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11461,6 +11881,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11485,6 +11908,12 @@ 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 ""
@@ -11512,6 +11941,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11539,6 +11971,9 @@ 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 ""
@@ -11563,9 +11998,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11740,6 +12172,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11905,6 +12340,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11920,6 +12358,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11962,6 +12403,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11998,6 +12442,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -12031,6 +12478,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12154,10 +12604,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12184,6 +12634,12 @@ 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 ""
@@ -12220,9 +12676,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12238,9 +12691,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12274,10 +12724,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12322,7 +12772,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12340,9 +12790,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12385,6 +12832,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12880,6 +13330,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12943,6 +13402,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12973,7 +13468,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -13051,9 +13546,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -13066,6 +13558,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13213,6 +13708,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13252,6 +13750,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13261,6 +13762,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13285,6 +13789,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13312,6 +13822,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13357,6 +13870,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13408,6 +13924,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13432,9 +13951,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13447,6 +13963,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13483,6 +14002,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13744,9 +14266,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13897,6 +14416,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13945,6 +14467,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14278,6 +14803,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14554,6 +15088,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14635,15 +15175,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14749,6 +15289,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -15001,6 +15544,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15361,7 +15907,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15787,9 +16333,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15826,96 +16369,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15934,12 +16387,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15991,6 +16450,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -16024,6 +16489,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16192,6 +16660,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16201,9 +16672,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16213,9 +16681,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16255,19 +16756,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16276,18 +16798,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16297,6 +16834,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16519,6 +17062,9 @@ 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 ""
@@ -16594,10 +17140,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16645,6 +17188,9 @@ 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 ""
@@ -16660,7 +17206,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16720,6 +17266,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16744,6 +17293,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16945,6 +17497,9 @@ 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 ""
@@ -17014,9 +17569,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -17095,6 +17647,9 @@ 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 ""
@@ -17116,6 +17671,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17161,6 +17719,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17209,6 +17770,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17242,6 +17806,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17293,9 +17860,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17305,6 +17869,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17500,9 +18154,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17614,6 +18265,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17653,7 +18307,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -18013,6 +18667,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -18025,9 +18682,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -18085,6 +18739,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18355,6 +19012,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18436,9 +19096,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18448,9 +19105,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18499,6 +19153,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19210,6 +19867,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19219,6 +19879,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19237,6 +19900,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19447,6 +20113,12 @@ 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 ""
@@ -19465,12 +20137,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19705,6 +20371,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19726,6 +20395,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19768,6 +20440,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19873,6 +20548,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19894,9 +20572,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19924,6 +20608,9 @@ 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 ""
@@ -19960,6 +20647,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20188,13 +20878,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20209,6 +20905,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 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 ""
@@ -20224,9 +20923,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20254,6 +20950,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20308,9 +21007,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20422,6 +21118,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20443,6 +21145,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20476,9 +21181,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20656,7 +21367,7 @@ 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."
+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."
@@ -20689,7 +21400,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20704,6 +21415,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20716,10 +21433,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20788,6 +21505,9 @@ 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 ""
@@ -20842,9 +21562,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20899,6 +21616,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20911,6 +21637,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -21034,9 +21763,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -21055,6 +21781,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -21073,6 +21802,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -21112,6 +21847,9 @@ 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|npm command"
msgstr ""
@@ -21133,15 +21871,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21214,6 +21952,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21271,10 +22018,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21370,6 +22117,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21421,9 +22171,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21445,10 +22192,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21523,15 +22270,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21559,10 +22297,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21577,9 +22315,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21604,6 +22339,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21640,9 +22378,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21676,6 +22411,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21688,12 +22426,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21733,6 +22480,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21745,6 +22495,12 @@ 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 ""
@@ -21802,6 +22558,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21871,6 +22630,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21994,12 +22756,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -22060,21 +22828,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -22096,6 +22882,12 @@ 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 ""
@@ -22204,6 +22996,9 @@ 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 ""
@@ -22288,24 +23083,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22342,6 +23119,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22699,6 +23479,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22927,10 +23710,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22942,7 +23722,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22957,6 +23737,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22984,16 +23770,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -23032,13 +23815,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -23074,13 +23857,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -23107,16 +23893,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23140,7 +23935,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23164,52 +23959,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23488,10 +24280,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23500,9 +24292,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23518,6 +24307,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23533,6 +24331,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23545,22 +24349,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23569,6 +24373,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23659,9 +24469,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23704,9 +24511,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23719,6 +24523,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23812,7 +24619,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23908,7 +24715,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -24001,6 +24850,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -24037,6 +24889,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24211,6 +25066,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24316,6 +25174,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24382,6 +25243,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24550,7 +25414,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24604,12 +25468,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24685,6 +25552,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24712,6 +25585,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24808,6 +25687,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24826,6 +25708,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24940,9 +25825,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -25033,6 +25915,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25411,7 +26296,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25483,6 +26368,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25570,6 +26458,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25753,7 +26644,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25798,12 +26689,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25816,9 +26713,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25843,6 +26737,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25879,6 +26776,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25888,10 +26791,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25912,6 +26815,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25927,9 +26833,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25957,6 +26860,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25999,19 +26908,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -26035,12 +26944,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -26083,7 +26986,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -26092,7 +26995,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26179,9 +27082,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26230,7 +27130,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26272,12 +27172,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26320,7 +27226,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26497,6 +27403,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26689,6 +27598,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26845,7 +27757,7 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -27136,9 +28048,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27265,6 +28174,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27448,9 +28360,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27640,12 +28549,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -28150,67 +29062,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28297,6 +29209,12 @@ 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 ""
@@ -28306,7 +29224,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28501,6 +29419,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28564,6 +29485,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28576,6 +29500,9 @@ 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 ""
@@ -28597,6 +29524,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28645,9 +29575,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -29140,6 +30067,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29224,6 +30154,9 @@ 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 ""
@@ -29242,12 +30175,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29278,10 +30217,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29323,7 +30262,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29338,7 +30277,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29380,6 +30319,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29410,6 +30352,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29437,9 +30382,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29452,6 +30394,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29515,6 +30460,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29557,18 +30505,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29740,6 +30676,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -30037,6 +30976,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -30070,6 +31012,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30400,6 +31345,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30550,10 +31498,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30616,12 +31564,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30646,9 +31588,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30775,22 +31714,28 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30799,13 +31744,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30892,6 +31834,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30904,6 +31849,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30925,10 +31873,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30994,6 +31942,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -31126,6 +32089,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31297,9 +32263,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31477,6 +32440,12 @@ 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|Packages"
msgstr ""
@@ -31579,6 +32548,96 @@ 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 ""
@@ -31588,7 +32647,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31609,7 +32668,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31780,6 +32839,12 @@ 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 ""
@@ -31822,6 +32887,9 @@ 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 ""
@@ -31837,6 +32905,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31846,9 +32917,15 @@ 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 ""
@@ -31921,6 +32998,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -32038,6 +33118,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -32083,9 +33166,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32203,6 +33283,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32269,6 +33352,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32290,15 +33376,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32497,6 +33595,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32518,6 +33622,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32575,10 +33682,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32587,7 +33694,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32614,64 +33721,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32710,6 +33826,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32737,7 +33856,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32905,10 +34024,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -33004,9 +34120,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -33016,6 +34129,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -33082,7 +34198,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -33097,6 +34213,9 @@ 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 ""
@@ -33145,6 +34264,9 @@ 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 ""
@@ -33292,6 +34414,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33409,6 +34534,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33640,9 +34768,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33814,6 +34939,9 @@ 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 profile"
msgstr ""
@@ -33871,6 +34999,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33895,6 +35026,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -34108,6 +35242,9 @@ 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 ""
@@ -34240,6 +35377,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34393,6 +35533,9 @@ msgstr[2] ""
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 ""
@@ -34534,6 +35677,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34630,9 +35776,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34675,9 +35818,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34795,6 +35935,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34879,7 +36022,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34960,6 +36103,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34969,9 +36115,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -35020,9 +36172,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35314,6 +36463,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35341,6 +36496,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35368,9 +36526,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/ru/gitlab.po b/locale/ru/gitlab.po
index dd1b7078b34..175eab5d53f 100644
--- a/locale/ru/gitlab.po
+++ b/locale/ru/gitlab.po
@@ -14,10 +14,10 @@ msgstr ""
"X-Crowdin-Language: ru\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 18:01\n"
+"PO-Revision-Date: 2021-03-05 23:57\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
-msgstr " %{project_name}#%{issuable_iid} &middot; %{author} открыл %{issuable_created}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
+msgstr ""
msgid " %{start} to %{end}"
msgstr " %{start} по %{end}"
@@ -78,6 +78,9 @@ msgstr " или ÑÑылки (например: path/to/project!merge_request_id
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr "\"%{path}\" не ÑущеÑтвует на \"%{ref}\""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr "Параметр \"el\" необходим Ð´Ð»Ñ createInstance()"
@@ -210,6 +213,13 @@ msgstr[1] "%d днÑ"
msgstr[2] "%d дней"
msgstr[3] "%d дней"
+msgid "%d epic"
+msgid_plural "%d epics"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d error"
msgid_plural "%d errors"
msgstr[0] "%d ошибка"
@@ -455,6 +465,13 @@ msgstr[1] "%d уÑзвимоÑти отклонено"
msgstr[2] "%d уÑзвимоÑтей отклонено"
msgstr[3] "%d уÑзвимоÑтей отклонено"
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] "найдено %d предупреждение:"
@@ -540,6 +557,9 @@ msgstr[1] "выбраны %{count} обÑуждениÑ"
msgstr[2] "выбрано %{count} обÑуждений"
msgstr[3] "выбрано %{count} обÑуждений"
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] "выбран %{count} Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние"
@@ -618,6 +638,9 @@ msgstr "%{edit_in_new_fork_notice} Попробуйте откатить ÑтоÑ
msgid "%{edit_in_new_fork_notice} Try to upload a file again."
msgstr "%{edit_in_new_fork_notice} Попробуйте загрузить файл еще раз."
+msgid "%{emailPrefix}@company.com"
+msgstr ""
+
msgid "%{extra} more downstream pipelines"
msgstr "%{extra} больше загруженных Ñборочных линий"
@@ -669,6 +692,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -777,6 +803,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr "%{name} Ñодержал %{resultsString}"
@@ -808,6 +840,15 @@ msgstr[3] "%{no_of_days} дней"
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr "на %{number_commits_behind} коммитов позади %{default_branch}, на %{number_commits_ahead} коммитов впереди"
+msgid "%{oneMonthAgo} - %{today}"
+msgstr ""
+
+msgid "%{oneWeekAgo} - %{today}"
+msgstr ""
+
+msgid "%{oneYearAgo} - %{today}"
+msgstr ""
+
msgid "%{openOrClose} %{noteable}"
msgstr "%{openOrClose} %{noteable}"
@@ -857,9 +898,6 @@ msgstr "%{reportType} обнаружено %{totalStart}%{total}%{totalEnd} по
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr "%{reportType} не обнаружено %{totalStart} ни одной %{totalEnd} уÑзвимоÑти."
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -907,6 +945,9 @@ msgstr "%{spanStart}в Ñтроке%{spanEnd} %{errorLine}%{errorColumn}"
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr "%{spanStart}в%{spanEnd} %{errorFn}"
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr "%{start} по %{end}"
@@ -1101,6 +1142,9 @@ msgstr "Поток ценноÑти '%{name}' Ñоздан"
msgid "'%{name}' Value Stream deleted"
msgstr "Поток ценноÑти '%{name}' удалён"
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr "Этап '%{name}' уже ÑущеÑтвует"
@@ -1126,6 +1170,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr "(Без изменений)"
@@ -1138,9 +1185,6 @@ msgstr "(прогреÑÑ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸)"
msgid "(deleted)"
msgstr "(удалено)"
-msgid "(line: %{startLine})"
-msgstr "(Ñтрока: %{startLine})"
-
msgid "(max size 15 MB)"
msgstr "(макÑ. размер 15 Мбайт)"
@@ -1165,9 +1209,6 @@ msgstr "+ ещё %{moreCount}"
msgid "+ %{numberOfHiddenAssignees} more"
msgstr "+ещё %{numberOfHiddenAssignees}"
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] "+ещё %d"
@@ -1279,6 +1320,13 @@ msgstr[1] "%d ключа развёртываниÑ"
msgstr[2] "%d ключей развёртываниÑ"
msgstr[3] "%d ключей развёртываниÑ"
+msgid "1 follower"
+msgid_plural "%{count} followers"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "1 group"
msgid_plural "%d groups"
msgstr[0] "1 группа"
@@ -1348,6 +1396,9 @@ msgstr "1-9 ÑодейÑтвий"
msgid "10-19 contributions"
msgstr "10-19 ÑодейÑтвий"
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr "Первый вклад!"
@@ -1468,6 +1519,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1567,6 +1621,102 @@ msgstr "Справка по API"
msgid "API Token"
msgstr "API токен"
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr "Ключ доÑтупа AWS"
@@ -1823,9 +1973,6 @@ msgstr "Добавить ключ GPG"
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr "Добавьте кнопку Grafana на боковой панели админиÑтратора в разделе мониторинга, чтобы получить доÑтуп к различным ÑтатиÑтичеÑким данным о работоÑпоÑобноÑти и производительноÑти GitLab."
-msgid "Add a To Do"
-msgstr "Добавить в ÑпиÑок задач"
-
msgid "Add a bullet list"
msgstr "Добавить маркированный ÑпиÑок"
@@ -1904,12 +2051,18 @@ 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 domain"
msgstr "Добавить домен"
msgid "Add email address"
msgstr "Добавить Ð°Ð´Ñ€ÐµÑ Ñлектронной почты"
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr "Добавить окружение"
@@ -2006,6 +2159,21 @@ msgstr "Добавить ранее Ñлитые коммиты"
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr "Пользователь не задан."
@@ -2066,6 +2234,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr "К цели добавлÑетÑÑ Ð·Ð°Ð´Ð°Ñ‡Ð°."
+msgid "Adds email participant(s)"
+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 ""
@@ -2126,6 +2297,9 @@ msgstr "Developer"
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr "Guest"
@@ -2246,6 +2420,12 @@ msgstr "Перейти к общим наÑтройкам"
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr "Интеграции, наÑтроенные здеÑÑŒ, будут автоматичеÑки применÑÑ‚ÑŒÑÑ ÐºÐ¾ вÑем проектам на Ñтом ÑкземплÑре."
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2270,6 +2450,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr "УÑтановить автоматичеÑкую включенную %{link_start}конфигурацию Ñборочной линии%{link_end} Ð´Ð»Ñ Ð²Ñего ÑкземплÑра. Эта ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñборочной линии будет запуÑкатьÑÑ Ð¿Ð¾Ñле ÑобÑтвенной конфигурации проекта."
@@ -2279,6 +2462,9 @@ msgstr "Ðекоторые наÑтройки были перемещены"
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
msgstr "Укажите домен, который будет иÑпользоватьÑÑ Ð¿Ð¾ умолчанию в приложениÑÑ… Auto Review, а также на Ñтапе автоматичеÑкого Ñ€Ð°Ð·Ð²ÐµÑ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ из проектов."
+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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr "Ð¢Ñ€ÐµÐ±ÑƒÐµÐ¼Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñборки может быть выбрана из каталога %{code_start}gitlab-ci%{code_end} внутри %{link_start}Ñконфигурированного хранилища ÑкземплÑров шаблонов%{link_end} или из предоÑтавленных GitLab конфигурации."
@@ -2354,6 +2540,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr "Ðктивные"
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr "ÐдминиÑтратор"
@@ -2447,6 +2636,15 @@ 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 "ИÑпользует меÑто"
@@ -2456,6 +2654,9 @@ msgstr "Это вы!"
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr "Ðовый пользователь"
@@ -2540,6 +2741,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr "Пользователь не Ñможет получить доÑтуп к репозиториÑм git"
@@ -2549,6 +2756,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr "Когда пользователь в Ñледующий раз войдёт в ÑиÑтему, его ÑƒÑ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ Ñнова Ñтанет полноÑтью активной"
@@ -2582,6 +2801,21 @@ 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 "ÐдминиÑтрирование"
@@ -2606,6 +2840,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr "Дополнительные наÑтройки"
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr "Дополнительные разрешениÑ, хранилище больших файлов и наÑтройки двухфакторной аутентификации."
@@ -2673,9 +2910,6 @@ msgstr "Ðвторизовать внешнюю Ñлужбу"
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 "Выводите ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾Ñ‚ вÑех Ñвоих инÑтрументов мониторинга непоÑредÑтвенно в Gitlab. УпроÑтите раÑÑмотрение оповещений и их превращение в инциденты."
@@ -2688,24 +2922,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr "СобытиÑ"
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2766,9 +2988,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2778,6 +2997,9 @@ 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 ""
@@ -2787,9 +3009,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr "Получено"
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2814,49 +3033,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2868,9 +3054,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2880,76 +3063,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2961,13 +3123,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2979,9 +3141,6 @@ msgstr ""
msgid "Alerts"
msgstr "ОповещениÑ"
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2994,7 +3153,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -3081,9 +3240,6 @@ msgstr "Ð’Ñе проекты"
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr "Ð’Ñе темы решены"
@@ -3144,8 +3300,8 @@ msgstr "Разрешать запроÑÑ‹ в локальной Ñети Ñ Ð¿Ð¾
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
-msgstr "Разрешить Ñтому ключу также отправлÑÑ‚ÑŒ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ (push) в репозиторий? (По умолчанию допуÑкаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ получение.)"
+msgid "Allow this key to push to this repository"
+msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
@@ -3186,6 +3342,9 @@ msgstr "ПозволÑет добавлÑÑ‚ÑŒ и управлÑÑ‚ÑŒ клаÑте
msgid "Almost there"
msgstr "Почти готово"
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3252,12 +3411,6 @@ msgstr ""
msgid "An error has occurred"
msgstr "Произошла ошибка"
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr "Произошла ошибка при добавлении черновика в тему."
@@ -3336,12 +3489,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3366,6 +3525,9 @@ msgstr "Произошла ошибка при получении цветов Ð
msgid "An error occurred while fetching markdown preview"
msgstr "Произошла ошибка при предварительном проÑмотре markdown"
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr "Во Ð²Ñ€ÐµÐ¼Ñ Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ Ð¾Ð¶Ð¸Ð´Ð°ÑŽÑ‰Ð¸Ñ… комментариев произошла ошибка"
@@ -3459,6 +3621,9 @@ msgstr "Произошла ошибка при загрузке запроÑов
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr "Произошла ошибка при загрузке данных. ПожалуйÑта, повторите попытку."
@@ -3486,12 +3651,18 @@ 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 "Произошла ошибка при выполнении запроÑа."
@@ -3534,8 +3705,11 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
-msgstr "Произошла ошибка при Ñохранении ответÑтвенных"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
+msgstr ""
msgid "An error occurred while subscribing to notifications."
msgstr "При подпиÑке на ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð¾ÑˆÐ»Ð° ошибка."
@@ -3573,6 +3747,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr "Произошла ошибка при валидации пути группы"
@@ -3585,10 +3762,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr "Произошла ошибка. ПожалуйÑта, попробуйте Ñнова."
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3955,9 +4132,6 @@ msgstr "Вы уверены, что хотите отменить редакти
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr "Уверены, что хотите удалить Поток ценноÑти \"%{name}\"?"
-
msgid "Are you sure you want to delete %{name}?"
msgstr "Вы точно хотите удалить %{name}?"
@@ -3985,6 +4159,9 @@ 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 erase this build?"
msgstr "Ð’Ñ‹ уверены, что вы хотите удалить Ñту Ñборку?"
@@ -4252,12 +4429,6 @@ msgstr[3] "Прикрепить %d файлов"
msgid "Attaching the file failed."
msgstr "Ðе удалоÑÑŒ прикрепить файл."
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr "Ðудит Ñобытий"
@@ -4330,6 +4501,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4756,6 +4930,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4768,12 +4945,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 "Импорт из Bitbucket Server"
@@ -4844,6 +5033,12 @@ 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 ""
@@ -4934,12 +5129,6 @@ msgstr "Ð˜Ð¼Ñ Ð²ÐµÑ‚Ð²Ð¸"
msgid "Branch not loaded - %{branchId}"
msgstr "Ветка не загружена - %{branchId}"
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr "ПоиÑк веток"
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr "Переключить ветку"
-
msgid "Branches"
msgstr "Ветки"
@@ -5108,16 +5297,28 @@ msgstr "РаÑпараллеливание маÑÑовых запроÑов"
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -5132,6 +5333,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -5165,6 +5369,12 @@ msgstr "БизнеÑ"
msgid "Business metrics (Custom)"
msgstr "БизнеÑ-метрики (наÑтраиваемые)"
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr "Купить лицензию"
@@ -5183,6 +5393,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr "По умолчанию GitLab отправлÑет пиÑьма в формате HTML и обычного текÑта, так чтобы почтовые клиенты могли выбрать, какой формат иÑпользовать. Отключите Ñту опцию, еÑли вы хотите отправлÑÑ‚ÑŒ пиÑьма только в текÑтовом формате."
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr "По умолчанию вÑе проекты и группы будут иÑпользовать глобальные наÑтройки уведомлений."
@@ -5234,6 +5447,28 @@ msgstr "CI/CD Ð´Ð»Ñ Ð²Ð½ÐµÑˆÐ½ÐµÐ³Ð¾ репозиториÑ"
msgid "CI/CD settings"
msgstr "ÐаÑтройки CI/CD"
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5369,6 +5604,9 @@ msgstr ""
msgid "Cancel"
msgstr "Отмена"
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5522,12 +5760,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr "Выбрать в ветке"
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr "Отменить в ветке"
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5672,6 +5904,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr "Проверьте ваши образы Docker на наличие извеÑтных уÑзвимоÑтей."
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr "Проверка доÑтупноÑти %{text} ..."
@@ -5894,8 +6129,8 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
-msgstr "Выберите уровень доÑтупа, включите / отключите функции проекта (обÑуждениÑ, репозиторий, Wiki, Ñниппеты) и наÑтройте Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° проекте."
+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 "Выберите Ñодержимое, которое вы хотите видеть на Ñтранице обзора группы."
@@ -5909,6 +6144,9 @@ msgstr ""
msgid "Choose your framework"
msgstr "Выберите фреймворк"
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr "отменено"
@@ -6242,21 +6480,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6266,9 +6525,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7277,6 +7548,9 @@ msgstr ""
msgid "Code"
msgstr "Код"
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr "Покрытие кода: %{coveragePercentage}%{percentSymbol}"
@@ -7346,6 +7620,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr "Свернуть утверждающих"
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7533,17 +7810,41 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr "%{source_branch} и %{target_branch} одинаковы."
-msgid "CompareBranches|Compare"
-msgstr "Сравнить"
+msgid "CompareBranches|There isn't anything to compare."
+msgstr "Ðечего Ñравнивать."
-msgid "CompareBranches|Source"
-msgstr "ИÑточник"
+msgid "CompareRevisions|Branches"
+msgstr ""
-msgid "CompareBranches|Target"
-msgstr "Цель"
+msgid "CompareRevisions|Compare"
+msgstr ""
-msgid "CompareBranches|There isn't anything to 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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
+msgstr ""
msgid "Complete"
msgstr "Завершено"
@@ -7557,6 +7858,12 @@ msgstr "КомплаенÑ"
msgid "Compliance Dashboard"
msgstr "Панель ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñлужбы комплаенÑа"
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr "Фреймворк комплаенÑа (необÑзательно)"
@@ -7569,9 +7876,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7587,6 +7924,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr "GDPR"
@@ -7599,6 +7945,9 @@ msgstr "HIPAA"
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr "HIPAA - акт о мобильноÑти и подотчётноÑти медицинÑкого ÑтрахованиÑ"
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7638,6 +7987,9 @@ msgstr "ÐаÑтройте обработчиков заданий Ð´Ð»Ñ Ð½Ð°Ñ‡
msgid "Configure Gitaly timeouts."
msgstr "ÐаÑтройка таймаутов Gitaly."
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7659,6 +8011,9 @@ msgstr "ÐаÑтроить ÑущеÑтвующую уÑтановку"
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7713,9 +8068,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr "ПоздравлÑем! Ð’Ñ‹ включили двухфакторную аутентификацию!"
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7892,24 +8244,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr "Ошибка Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Docker"
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr "Правила иÑÑ‚ÐµÑ‡ÐµÐ½Ð¸Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ñ‹"
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8370,10 +8713,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr "Ðе удалоÑÑŒ найти итерацию"
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8409,9 +8752,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr "Страна"
@@ -8461,12 +8801,12 @@ 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 deploy key for this project"
-msgstr "Создать новый ключ Ñ€Ð°Ð·Ð²Ñ‘Ñ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ñтого проекта."
-
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr "Создайте новый файл, поÑкольку еще нет файлов. ПоÑле Ñтого вы Ñможете зафикÑировать Ñвои изменениÑ."
@@ -8491,6 +8831,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr "Создать ветку"
@@ -8518,6 +8861,9 @@ msgstr "Создать файл"
msgid "Create from"
msgstr "Создать из"
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr "Создать группу"
@@ -8530,6 +8876,9 @@ msgstr "Создать обÑуждение"
msgid "Create iteration"
msgstr "Создать итерацию"
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr "Создать ÑпиÑок из меток. ОбÑÑƒÐ¶Ð´ÐµÐ½Ð¸Ñ Ñ Ñтой меткой поÑвлÑÑŽÑ‚ÑÑ Ð² Ñтом ÑпиÑке."
@@ -8545,6 +8894,12 @@ msgstr "Создать Ñтап"
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr "Создать новый Поток ценноÑти"
@@ -8617,6 +8972,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8626,15 +8984,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8653,6 +9026,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8662,6 +9038,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8677,6 +9056,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8782,6 +9164,9 @@ msgstr "Дата ÑозданиÑ"
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8830,14 +9215,14 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
-msgstr "Профиль"
+msgid "CurrentUser|One of your groups is running out"
+msgstr ""
-msgid "CurrentUser|Settings"
-msgstr "ÐаÑтройки"
+msgid "CurrentUser|Preferences"
+msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
@@ -8863,8 +9248,8 @@ msgstr ""
msgid "Custom notification events"
msgstr "Ð¡Ð¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð½Ð°Ñтраиваемых уведомлений"
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
-msgstr "ÐаÑтраиваемые уровни уведомлений аналогичны уровню уведомлений в ÑоответÑтвии Ñ ÑƒÑ‡Ð°Ñтием. С наÑтраиваемыми уровнÑми уведомлений вы также будете получать ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾ выбранных ÑобытиÑÑ…. Чтобы узнать больше, поÑмотрите %{notification_link}."
+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 ""
@@ -8905,6 +9290,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr "ÐаÑтроить цвета"
@@ -8938,6 +9326,18 @@ 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 ""
@@ -9104,7 +9504,7 @@ msgstr "Выпадающий ÑпиÑок Ñтапов"
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9260,7 +9660,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9284,6 +9690,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9365,6 +9774,9 @@ 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 ""
@@ -9374,6 +9786,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9398,6 +9813,13 @@ 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] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "DastSiteValidation|Validate"
msgstr ""
@@ -9416,6 +9838,9 @@ 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 "Данные вÑе еще вычиÑлÑÑŽÑ‚ÑÑ..."
@@ -9437,6 +9862,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr "День меÑÑца"
@@ -9461,6 +9889,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr "Отладка"
@@ -9479,9 +9910,6 @@ msgstr "Отклонить и выйти"
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr "Ветка по умолчанию"
-
msgid "Default CI configuration path"
msgstr ""
@@ -9536,6 +9964,9 @@ msgstr "Определить наÑтраиваемый шаблон Ñ Ñинт
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9566,6 +9997,9 @@ msgstr ""
msgid "Delete"
msgstr "Удалить"
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9623,6 +10057,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr "Удалить вложение"
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9647,6 +10084,15 @@ msgstr "Ошибка при воÑÑтановлении репозиториÑ
msgid "DeleteProject|Failed to restore wiki repository. Please contact the administrator."
msgstr "Ошибка при воÑÑтановлении wiki Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚Ð°. ПожалуйÑта, попробуйте Ñнова, или ÑвÑжитеÑÑŒ Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñтратором."
+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 "Удалено"
@@ -9833,13 +10279,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr "Ключ Ñ€Ð°Ð·Ð²ÐµÑ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ ÑƒÑпешно обновлен."
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
-msgstr "Ключи Ñ€Ð°Ð·Ð²Ñ‘Ñ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÑŽÑ‚ получить доÑтуп к вашему репозиторию как в режиме только Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ, так и чтениÑ-запиÑи (еÑли разрешено). Они могут быть иÑпользованы Ð´Ð»Ñ Ð½ÐµÐ¿Ñ€ÐµÑ€Ñ‹Ð²Ð½Ð¾Ð¹ интеграции, Ñтейдж- и продакшн-Ñерверов. Можете Ñоздать новый ключ Ñ€Ð°Ð·Ð²Ñ‘Ñ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ добавить ÑущеÑтвующий."
-
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9848,6 +10291,9 @@ msgstr "ПрогреÑÑ Ñ€Ð°Ð·Ð²ÐµÑ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ найден. ЧтобÑ
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9857,15 +10303,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr "+%{count} других"
@@ -9890,6 +10333,9 @@ msgstr "Ошибка ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ ÐºÐ»ÑŽÑ‡Ð° развертываниÑ"
msgid "DeployKeys|Expand %{count} other projects"
msgstr "Развернуть в %{count} других проектах"
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr "Загрузка ключей развертываниÑ"
@@ -9908,9 +10354,6 @@ msgstr "Публичные ключи развертываниÑ"
msgid "DeployKeys|Read access only"
msgstr "ДоÑтуп только на чтение"
-msgid "DeployKeys|Write access allowed"
-msgstr "Разрешен доÑтуп Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи"
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr "Ð’Ñ‹ ÑобираетеÑÑŒ удалить Ñтот ключ развертываниÑ. Ð’Ñ‹ уверены?"
@@ -9920,19 +10363,19 @@ msgstr "Ðктивные токены Ñ€Ð°Ð·Ð²ÐµÑ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ (%{active_token
msgid "DeployTokens|Add a deploy token"
msgstr "Создать токен развертываниÑ"
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
-msgstr "Разрешает доÑтуп только Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ðº региÑтру образов"
+msgid "DeployTokens|Allows read-only access to registry images."
+msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
-msgstr "Разрешает доÑтуп только Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ðº репозиторию"
+msgid "DeployTokens|Allows read-only access to the repository."
+msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9947,11 +10390,8 @@ msgstr "Создать токен развертываниÑ"
msgid "DeployTokens|Created"
msgstr "Создан"
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr "Формат по умолчанию \"gitlab+deploy-token-{n}\". Введите Ñвое Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÐµÑли вы хотите изменить его."
-
-msgid "DeployTokens|Deploy Tokens"
-msgstr "Токены развертываниÑ"
+msgid "DeployTokens|Deploy tokens"
+msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
msgstr ""
@@ -9965,8 +10405,8 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr "Ðаименование"
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
-msgstr "Выберите Ð¸Ð¼Ñ Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ, и мы предоÑтавим вам уникальный токен развертываниÑ."
+msgid "DeployTokens|Pick a name for your unique deploy token."
+msgstr ""
msgid "DeployTokens|Revoke"
msgstr "Отозвать"
@@ -9986,11 +10426,17 @@ msgstr "%{entity_type} не имеет токенов развертываниÑ
msgid "DeployTokens|This action cannot be undone."
msgstr "Это дейÑтвие Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ."
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
-msgstr "ИÑпользуйте Ñтот токен в качеÑтве паролÑ. УбедитеÑÑŒ, что вы Ñохраните его - вы не Ñможете получить доÑтуп к нему Ñнова."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
+msgstr ""
+
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+msgstr ""
-msgid "DeployTokens|Use this username as a login."
-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 "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"
@@ -9998,8 +10444,8 @@ msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr "Ð’Ñ‹ ÑобираетеÑÑŒ отозвать %{b_start}%{name}%{b_end}."
-msgid "DeployTokens|Your New Deploy Token"
-msgstr "Ваш Ðовый Токен РазвертываниÑ"
+msgid "DeployTokens|Your new Deploy Token username"
+msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
msgstr "Создан новый токен Ñ€Ð°Ð·Ð²ÐµÑ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹."
@@ -10028,6 +10474,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -10037,15 +10486,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -10055,6 +10495,13 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Deployment|API"
msgstr "API"
@@ -10277,18 +10724,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10304,16 +10739,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10334,10 +10769,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10346,18 +10778,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10370,9 +10796,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10382,6 +10805,12 @@ 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 ""
@@ -10409,6 +10838,9 @@ 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|Score"
msgstr ""
@@ -10520,8 +10952,8 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr "СредÑтва безопаÑноÑти, интегрированные в жизненный цикл вашей разработки"
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
-msgstr "Узнайте о других возможноÑÑ‚ÑÑ… %{linkStart}тарифного плана Gold%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
+msgstr ""
msgid "Discover|Start a free trial"
msgstr "Ðачать беÑплатный пробный период"
@@ -10725,6 +11157,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10917,10 +11352,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10989,12 +11424,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr "ÑброÑить Ñто"
-
-msgid "EmailToken|resetting..."
-msgstr "ÑброÑ..."
-
msgid "Emails"
msgstr "ÐдреÑа Ñл. почты"
@@ -11115,6 +11544,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11280,20 +11712,14 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
-msgstr "Введите опиÑание обÑуждениÑ"
-
-msgid "Enter the issue title"
-msgstr "Введите заголовок обÑуждениÑ"
+msgid "Enter the %{name} description"
+msgstr ""
-msgid "Enter the merge request description"
-msgstr "Введите опиÑание запроÑа на ÑлиÑние"
+msgid "Enter the %{name} title"
+msgstr ""
-msgid "Enter the merge request 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 name of your application, and we'll return a unique %{type}."
msgstr ""
@@ -11577,6 +12003,9 @@ msgstr "защищённое"
msgid "Epic"
msgstr "Цель"
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr "Цель не может быть найдена."
@@ -11601,6 +12030,12 @@ 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 ""
@@ -11628,6 +12063,9 @@ msgstr "Как Ñ Ð¼Ð¾Ð³Ñƒ Ñто иÑправить?"
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr "Удалить цель"
@@ -11655,6 +12093,9 @@ 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 "Что-то пошло не так при получении целей группы."
@@ -11679,9 +12120,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11856,6 +12294,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr "Ошибка при загрузке файла: %{stripped}"
@@ -12021,6 +12462,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -12036,6 +12480,9 @@ msgstr ""
msgid "Except policy:"
msgstr "За иÑключением политики:"
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -12078,6 +12525,9 @@ msgstr "Развернуть утверждающих"
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -12114,6 +12564,9 @@ msgstr "ИÑтекает"
msgid "Expires at"
msgstr "ИÑтекает"
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr "ИÑтекает в %{expires_at}"
@@ -12147,6 +12600,9 @@ msgstr "Обзор публичных групп"
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr "ЭкÑпортировать в CSV"
@@ -12270,12 +12726,12 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
-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 ""
@@ -12300,6 +12756,12 @@ 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 ""
@@ -12336,9 +12798,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr "Ðе удалоÑÑŒ загрузить метрики активноÑти группы. ПожалуйÑта, попробуйте ещё раз."
-msgid "Failed to load groups & users."
-msgstr "Ðе удалоÑÑŒ загрузить группы и пользователей."
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12354,9 +12813,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12390,10 +12846,10 @@ msgstr "Ðе удалоÑÑŒ защитить окружение"
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12438,7 +12894,7 @@ msgstr "Ðе удалоÑÑŒ задать итерацию Ñтому обÑужÐ
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12456,9 +12912,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr "Ошибка Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ð±Ñуждений, пожалуйÑта, попробуйте Ñнова."
-msgid "Failed to update tag!"
-msgstr "Ðе удалоÑÑŒ обновить метку!"
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12501,6 +12954,9 @@ msgstr "Функциональные опции"
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12997,6 +13453,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr "Цвет Шрифта"
@@ -13060,6 +13525,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr "Ответвлено от"
@@ -13090,7 +13591,7 @@ msgstr ""
msgid "Free Trial"
msgstr "БеÑплатный пробный период"
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -13168,9 +13669,6 @@ msgstr "Geo"
msgid "Geo Nodes"
msgstr "Узлы Geo"
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr "ÐÐµÐ»ÑŒÐ·Ñ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ оÑновной узел, еÑли еÑÑ‚ÑŒ вторичные"
@@ -13183,6 +13681,9 @@ msgstr "ÐаÑтройки Geo"
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr "%{timeAgoStr}(%{pendingEvents} ÑобытиÑ)"
@@ -13330,6 +13831,9 @@ msgstr "%{name} запланирован Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾Ð¹ ÑинхроÐ
msgid "Geo|%{name} is scheduled for re-verify"
msgstr "%{name} запланирован Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾Ð³Ð¾ подтверждениÑ"
+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 ""
@@ -13369,6 +13873,9 @@ msgstr "Ðе удалоÑÑŒ удалить запиÑÑŒ отÑлеживаниÑ
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr "Ðе удалоÑÑŒ удалить запиÑÑŒ отÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ ÑущеÑтвующей загрузки."
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr "Ðе удалоÑÑŒ"
@@ -13378,6 +13885,9 @@ msgstr "Фильтр по ÑоÑтоÑнию"
msgid "Geo|Geo Status"
msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Geo"
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13402,6 +13912,12 @@ msgstr "ПоÑледнÑÑ Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ° Ñинхронизации"
msgid "Geo|Last time verified"
msgstr "ПоÑледний раз проверено"
+msgid "Geo|Learn more about Geo"
+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 "Ðикогда"
@@ -13429,6 +13945,9 @@ msgstr "ПожалуйÑта обратитеÑÑŒ к решению пробле
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr "Проект"
@@ -13474,6 +13993,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr "СтатуÑ"
@@ -13525,6 +14047,9 @@ msgstr "Ошибка Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ - %{error}"
msgid "Geo|Waiting for scheduler"
msgstr "Ожидание планировщика"
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13549,9 +14074,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr "Ðачать Ñ Ð¾Ñ‚ÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº"
@@ -13564,6 +14086,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr "Ðачните работу Ñ Ñ€ÐµÐ»Ð¸Ð·Ð°Ð¼Ð¸"
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr "Git LFS не включен на Ñтом GitLab Ñервере, ÑвÑжитеÑÑŒ Ñ Ð²Ð°ÑˆÐ¸Ð¼ админиÑтратором."
@@ -13600,6 +14125,9 @@ msgstr ""
msgid "GitHub import"
msgstr "Импорт из GitHub"
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13861,9 +14389,6 @@ msgstr ""
msgid "Go full screen"
msgstr "Ðа веÑÑŒ Ñкран"
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr "Перейти к ИнтеграциÑм"
@@ -14014,6 +14539,9 @@ msgstr ""
msgid "Grant access"
msgstr "ПредоÑтавить доÑтуп"
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr "Диаграмма"
@@ -14062,6 +14590,9 @@ msgstr ""
msgid "Group URL"
msgstr "URL группы"
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr "Ðватар группы"
@@ -14395,6 +14926,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr "Применить наÑтройки интеграции ко вÑем проектам"
@@ -14671,6 +15211,12 @@ msgstr "ПоиÑк по имени"
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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}"
@@ -14752,15 +15298,15 @@ msgstr "Помогает уменьшить объем оповещений (нÐ
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr "Вот вÑе ваши проекты в вашей группе, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ñ‚Ð¾Ñ‚, который вы только что Ñоздали. Ð”Ð»Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° давайте взглÑнем на ваш индивидуальный учебный проект, который поможет вам узнать о GitLab в удобном темпе."
-
msgid "Here you will find recent merge request activity"
msgstr "ЗдеÑÑŒ вы найдёте поÑледние дейÑтвиÑ, ÑвÑзанные Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñами на ÑлиÑние"
msgid "Hi %{username}!"
msgstr "Привет, %{username}!"
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr "Скрывать архивные проекты"
@@ -14868,6 +15414,9 @@ msgstr "ОчиÑтка, ÑкÑпорт, путь, перемещение, уда
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -15122,6 +15671,9 @@ msgstr "Импортировать из"
msgid "Import from Jira"
msgstr "Импортировать из Jira"
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15483,7 +16035,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15909,9 +16461,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr "УÑтановить на клаÑтеры"
@@ -15949,96 +16498,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr "ИнтеграциÑ"
@@ -16057,12 +16516,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -16114,6 +16579,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -16147,6 +16618,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16315,6 +16789,9 @@ msgstr "ПриглаÑить \"%{trimmed}\" по Ñлектронной почт
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr "ПриглаÑить группу"
@@ -16324,9 +16801,6 @@ msgstr "ПриглаÑить учаÑтников"
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16336,9 +16810,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16378,19 +16885,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16399,18 +16927,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16420,6 +16963,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16642,6 +17191,9 @@ 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 ""
@@ -16717,11 +17269,8 @@ msgstr "Ð˜Ñ‚ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð°"
msgid "Iterations"
msgstr "Итерации"
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr "Даты итерации не могут переÑекатьÑÑ Ñ Ð´Ð°Ñ‚Ð°Ð¼Ð¸ уже ÑущеÑтвующих итераций"
-
-msgid "Iteration|cannot be in the past"
-msgstr "не может быть в прошлом"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
+msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr "не может быть более 500 лет в будущем"
@@ -16768,6 +17317,9 @@ msgstr "Проект Jira: %{importProject}"
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 ""
@@ -16783,7 +17335,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16843,6 +17395,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16867,6 +17422,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr "ИÑпользуйте пароль Ð´Ð»Ñ Ñерверной верÑии и API-токен Ð´Ð»Ñ Ð¾Ð±Ð»Ð°Ñ‡Ð½Ð¾Ð¹ верÑии"
@@ -17068,6 +17626,9 @@ 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 ""
@@ -17137,9 +17698,6 @@ msgstr "Развёртывание Kubernetes не найдено"
msgid "Kubernetes error: %{error_code}"
msgstr "Ошибка Kubernetes: %{error_code}"
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr "LDAP"
@@ -17218,6 +17776,9 @@ 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 ""
@@ -17240,6 +17801,9 @@ msgstr[1] "ПоÑледние %d днÑ"
msgstr[2] "ПоÑледние %d дней"
msgstr[3] "ПоÑледние %d дни"
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17285,6 +17849,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr "ФамилиÑ"
@@ -17333,6 +17900,9 @@ msgstr "ПоÑледнее иÑпользование:"
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr "Ñоздал"
@@ -17366,6 +17936,9 @@ msgstr "Узнайте о GitLab"
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr "Узнайте, как %{link_start}внеÑти Ñвой вклад во вÑтроенные шаблоны%{link_end}"
@@ -17417,9 +17990,6 @@ msgstr "Узнать больше о шаблонах проекта группÐ
msgid "Learn more about signing commits"
msgstr "Узнайте больше о подпиÑывании коммитов"
-msgid "Learn more about the dependency list"
-msgstr "Узнайте больше о ÑпиÑке завиÑимоÑтей"
-
msgid "Learn more in the"
msgstr "Узнайте больше в"
@@ -17429,6 +17999,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr "Покинуть"
@@ -17630,9 +18290,6 @@ msgstr "Показывает лицензии, обнаруженные в прÐ
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr "Узнайте больше о комплаенÑе лицензий"
-
msgid "Licenses|License Compliance"
msgstr "Служба комплаенÑа лицензий"
@@ -17745,6 +18402,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17784,7 +18444,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -18144,6 +18804,9 @@ msgstr "МакÑимальный уровень доÑтупа"
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -18156,9 +18819,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -18216,6 +18876,9 @@ msgstr "МакÑимальный тайм-аут Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð¸Ð¼ÐµÐµÑ‚ знÐ
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18486,6 +19149,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr "Подтверждение запроÑов на ÑлиÑние"
@@ -18567,9 +19233,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr "Ответить"
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18579,9 +19242,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr "Ðе удалоÑÑŒ объединить коммиты. Это должно быть выполнено вручную."
-msgid "MergeRequests|Reply..."
-msgstr "Ответить..."
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr "Решить Ñту тему в новом обÑуждении"
@@ -18630,6 +19290,9 @@ msgstr "начал тему про уÑтаревшие Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² к
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr "начал тему про коммит %{linkStart}%{commitDisplay}%{linkEnd}"
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19343,6 +20006,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr "Более %{number_commits_distance} коммитов отличаетÑÑ Ð¾Ñ‚ %{default_branch}"
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr "По рейтингу"
@@ -19352,6 +20018,9 @@ msgstr "Точка Ð¼Ð¾Ð½Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ %{mounted_as} не найдена в
msgid "Move"
msgstr "ПеремеÑтить"
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr "ПеремеÑтить обÑуждение"
@@ -19370,6 +20039,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr "Ðевозможно перемеÑтить обÑуждение из-за нехватки прав!"
@@ -19582,6 +20254,12 @@ 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 ""
@@ -19600,12 +20278,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19841,6 +20513,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr "ÐÐ¾Ð²Ð°Ñ Ð²ÐµÑ‚ÐºÐ°"
@@ -19862,6 +20537,9 @@ msgstr "Ðовый ключ развёртываниÑ"
msgid "New directory"
msgstr "Ðовый каталог"
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr "Ðовое окружение"
@@ -19904,6 +20582,9 @@ msgstr "ÐÐ¾Ð²Ð°Ñ Ð¸Ñ‚ÐµÑ€Ð°Ñ†Ð¸Ñ Ñоздана"
msgid "New label"
msgstr "ÐÐ¾Ð²Ð°Ñ Ð¼ÐµÑ‚ÐºÐ°"
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr "Ðовый Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние"
@@ -20009,6 +20690,9 @@ msgstr "ДейÑтвий не найдено"
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr "Методы аутентификации не наÑтроены."
@@ -20030,9 +20714,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -20060,6 +20750,9 @@ 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 "Точка Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð½Ðµ предоÑтавлена"
@@ -20096,6 +20789,9 @@ msgstr ""
msgid "No iteration"
msgstr "Ðет итераций"
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr "Ðет итераций Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ"
@@ -20324,13 +21020,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr "Примечание"
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr "Ð’Ñ‹ уверены, что вы хотите отменить Ñоздание Ñтого комментариÑ?"
msgid "Notes|Collapse replies"
msgstr "Свернуть ответы"
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20345,6 +21047,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 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 ""
@@ -20360,9 +21065,6 @@ msgstr ""
msgid "Notification events"
msgstr "Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾ ÑобытиÑÑ…"
-msgid "Notification setting"
-msgstr "Режим уведомлений"
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20390,6 +21092,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr "Влит Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние"
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20444,9 +21149,6 @@ msgstr "УчаÑтие"
msgid "NotificationLevel|Watch"
msgstr "ОтÑлеживать"
-msgid "NotificationSetting|Custom"
-msgstr "ПользовательÑкий"
-
msgid "Notifications"
msgstr "УведомлениÑ"
@@ -20558,6 +21260,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20579,6 +21287,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20612,9 +21323,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20793,8 +21510,8 @@ 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 "Срок дейÑÑ‚Ð²Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ или неÑкольких ваших токенов личного доÑтупа иÑтечёт через %{days_to_expire} дней или раньше."
+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 ""
@@ -20826,7 +21543,7 @@ msgstr "Только учаÑтники проекта могут оÑтавлÑ
msgid "Only project members will be imported. Group members will be skipped."
msgstr "Будут импортированы только учаÑтники проекта. УчаÑтники группы будут пропущены."
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20841,6 +21558,12 @@ msgstr ""
msgid "Open"
msgstr "Открыто"
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr "Открыть выбранное"
@@ -20853,12 +21576,12 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
-msgstr "Открыть в Xcode"
-
msgid "Open in file view"
msgstr ""
+msgid "Open in your IDE"
+msgstr ""
+
msgid "Open issues"
msgstr ""
@@ -20925,6 +21648,9 @@ 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 ""
@@ -20979,9 +21705,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -21036,6 +21759,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -21048,6 +21780,9 @@ msgstr "Добавить иÑточник NuGet"
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -21171,9 +21906,6 @@ msgstr "Команда Maven"
msgid "PackageRegistry|Maven XML"
msgstr "XML Maven"
-msgid "PackageRegistry|NPM"
-msgstr "NPM"
-
msgid "PackageRegistry|NuGet"
msgstr "NuGet"
@@ -21192,6 +21924,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr "Команда pip"
@@ -21210,6 +21945,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr "Удалить пакет"
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr "Извините, ваш фильтр иÑключил вÑе результаты"
@@ -21249,6 +21990,9 @@ msgstr ""
msgid "PackageRegistry|You may also need to setup authentication using an auth token. %{linkStart}See the documentation%{linkEnd} to find out more."
msgstr "Вам также может понадобитьÑÑ Ð½Ð°Ñтроить аутентификацию Ñ Ð¸Ñпользованием токена. %{linkStart}Смотрите документацию%{linkEnd}, чтобы узнать больше."
+msgid "PackageRegistry|npm"
+msgstr ""
+
msgid "PackageRegistry|npm command"
msgstr ""
@@ -21270,15 +22014,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr "NPM"
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr "Пакеты"
@@ -21351,6 +22095,15 @@ msgstr "Параметр"
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21408,11 +22161,11 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
-msgstr "Ð’Ñтавьте открытый ключ машины здеÑÑŒ. Узнайте больше о том, как его Ñгенерировать %{link_start}здеÑÑŒ%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
+msgstr ""
msgid "Paste confidential epic link"
msgstr ""
@@ -21507,6 +22260,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr "траÑÑировка"
@@ -21558,9 +22314,6 @@ msgstr "РаÑпиÑание Сборочной Линии"
msgid "Pipeline Schedules"
msgstr "РаÑпиÑÐ°Ð½Ð¸Ñ Ð¡Ð±Ð¾Ñ€Ð¾Ñ‡Ð½Ñ‹Ñ… Линий"
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr "Квота иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ CI в минутах"
@@ -21582,10 +22335,10 @@ msgstr "Триггеры Ñборки"
msgid "Pipeline: %{status}"
msgstr "Ð¡Ð±Ð¾Ñ€Ð¾Ñ‡Ð½Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ:%{status}"
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21660,15 +22413,6 @@ msgstr "Диаграммы Ñборочных линий"
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr "Сборочные линии за поÑледний меÑÑц (%{oneMonthAgo} - %{today})"
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr "Сборочные линии за поÑледнюю неделю (%{oneWeekAgo} - %{today})"
-
-msgid "Pipelines for last year"
-msgstr "Сборочные линии за поÑледний год"
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21696,12 +22440,12 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr "ОчиÑтить Runner кÑши "
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
-msgstr "ÐÐµÐ¿Ñ€ÐµÑ€Ñ‹Ð²Ð½Ð°Ñ Ð¸Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ помочь выÑвить ошибки, автоматичеÑки выполнÑÑ Ñ‚ÐµÑÑ‚Ñ‹, а непрерывное развёртывание может помочь доÑтавить код в окружение вашего продукта."
-
msgid "Pipelines|Copy trigger token"
msgstr ""
+msgid "Pipelines|Could not load merged YAML content"
+msgstr ""
+
msgid "Pipelines|Description"
msgstr ""
@@ -21714,9 +22458,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21741,6 +22482,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr "ЗагружаютÑÑ Ñборочные линии"
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21777,9 +22521,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð½ÐµÑ‚ Ñборочных линий."
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21813,6 +22554,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21825,12 +22569,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21870,6 +22623,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr "Ð¡Ð±Ð¾Ñ€Ð¾Ñ‡Ð½Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ Ñ†ÐµÐ¿Ð¾Ñ‡ÐºÐ¸ ÑлиÑний"
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21882,6 +22638,12 @@ 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 "Сборочные линии"
@@ -21939,6 +22701,9 @@ msgstr "Значение"
msgid "Pipeline|Variables"
msgstr "Переменные"
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr "Ð’Ñ‹ ÑобираетеÑÑŒ оÑтановить Ñборочную линию %{pipelineId}."
@@ -22008,6 +22773,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -22131,12 +22899,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr "ПожалуйÑта, решите reCAPTCHA"
@@ -22197,21 +22971,39 @@ msgstr "Выберите, какое Ñодержимое вы хотите ви
msgid "Preferences|Choose what content you want to see on your homepage."
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 "Отображать Ð²Ñ€ÐµÐ¼Ñ Ð² 24-чаÑовом формате"
+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 mins ago."
msgstr "Ðапример, 30 минут назад."
+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 "Ширина макета"
@@ -22233,6 +23025,12 @@ 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 "Тема подÑветки ÑинтакÑиÑа"
@@ -22341,6 +23139,9 @@ 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 "Приватный - ДоÑтуп должен быть предоÑтавлен Ñвно каждому пользователю. ЕÑли проект ÑвлÑетÑÑ Ñ‡Ð°Ñтью группы, он наÑледует учаÑтников и их привилегии."
@@ -22425,24 +23226,6 @@ msgstr "Профиль"
msgid "Profile Settings"
msgstr "ÐаÑтройки профилÑ"
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr "на"
@@ -22479,6 +23262,9 @@ msgstr "Добавить ключ"
msgid "Profiles|Add status emoji"
msgstr "Добавить Ñмайл к ÑтатуÑу"
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr "Обрезать аватар"
@@ -22836,6 +23622,9 @@ msgstr "Файлы проекта"
msgid "Project ID"
msgstr "ID проекта"
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr "ÐÐ´Ñ€ÐµÑ ÐŸÑ€Ð¾ÐµÐºÑ‚Ð°"
@@ -23064,11 +23853,8 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr "Разрешить пользователÑм Ñоздавать копии вашего Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ Ð² новый проект"
-
-msgid "ProjectSettings|Allow users to request access"
-msgstr "Разрешить пользователÑм запрашивать доÑтуп"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
+msgstr ""
msgid "ProjectSettings|Analytics"
msgstr ""
@@ -23079,8 +23865,8 @@ msgstr "ÐвтоматичеÑки разрешать обÑÑƒÐ¶Ð´ÐµÐ½Ð¸Ñ Ð¸Ð·Ð
msgid "ProjectSettings|Badges"
msgstr "Значки"
-msgid "ProjectSettings|Build, test, and deploy your changes"
-msgstr "Сборка, теÑтирование и развертывание ваших изменений"
+msgid "ProjectSettings|Build, test, and deploy your changes."
+msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
msgstr ""
@@ -23094,6 +23880,12 @@ msgstr "Выберите ваш метод, наÑтройки, проверки
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr "Выберите метод ÑлиÑниÑ, параметры ÑлиÑниÑ, проверки ÑлиÑниÑ, Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑлиÑнию и наÑтройте шаблон опиÑÐ°Ð½Ð¸Ñ Ð¿Ð¾ умолчанию Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñов на ÑлиÑние."
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -23121,17 +23913,14 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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 "Каждый проект может иметь Ñвоё ÑобÑтвенное проÑтранÑтво Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¾Ð±Ñ€Ð°Ð·Ð¾Ð² 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."
+msgstr ""
msgid "ProjectSettings|Everyone"
msgstr "Каждый"
@@ -23169,14 +23958,14 @@ msgstr "ВнутреннÑÑ"
msgid "ProjectSettings|Issues"
msgstr "ОбÑуждениÑ"
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
-msgstr "ПроÑÑ‚Ð°Ñ ÑиÑтема обÑуждений Ð´Ð»Ñ Ñтого проекта"
+msgid "ProjectSettings|Lightweight issue tracking system."
+msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
-msgstr "УправлÑет большими графичеÑкими, аудио- и видефайлами"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
+msgstr ""
msgid "ProjectSettings|Merge checks"
msgstr "Проверки ÑлиÑниÑ"
@@ -23211,14 +24000,17 @@ msgstr ""
msgid "ProjectSettings|Operations"
msgstr ""
+msgid "ProjectSettings|Override user notification preferences for all project members."
+msgstr ""
+
msgid "ProjectSettings|Packages"
msgstr "Пакеты"
msgid "ProjectSettings|Pages"
msgstr "Pages"
-msgid "ProjectSettings|Pages for project documentation"
-msgstr "Страницы Ð´Ð»Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ð¸ проекта"
+msgid "ProjectSettings|Pages for project documentation."
+msgstr ""
msgid "ProjectSettings|Pipelines"
msgstr "Сборочные линии"
@@ -23244,17 +24036,26 @@ msgstr "Репозиторий"
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
-msgstr "ДелитеÑÑŒ фрагментами кода Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ за пределами Git-репозиториÑ"
+msgid "ProjectSettings|Share code with others outside the project."
+msgstr ""
msgid "ProjectSettings|Show default award emojis"
msgstr ""
@@ -23277,8 +24078,8 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
-msgstr "ОтправлÑйте изменениÑ, который могут быть Ñлиты в родительÑкий репозиторий"
+msgid "ProjectSettings|Submit changes to be merged upstream."
+msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
msgstr "Сообщение коммита иÑпользуетÑÑ, чтобы применÑÑ‚ÑŒ Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа на ÑлиÑние"
@@ -23301,30 +24102,36 @@ msgstr "Эта наÑтройка применÑетÑÑ Ð½Ð° уровне ÑеÑ
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr "Эта наÑтройка будет применена Ð´Ð»Ñ Ð²Ñех проектов, еÑли иное поведение не переопределено админиÑтратором."
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr "Эта наÑтройка переопределит пользовательÑкие Ð¿Ñ€ÐµÐ´Ð¿Ð¾Ñ‡Ñ‚ÐµÐ½Ð¸Ñ ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ð¹ Ð´Ð»Ñ Ð²Ñех членов проекта."
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr "Это будет показывать иÑторию коммитов, когда вы Ñливаете Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние"
msgid "ProjectSettings|Transfer project"
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|View and edit files in this project"
-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 will only have read access"
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|View project analytics"
+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|What are badges?"
msgstr ""
@@ -23334,20 +24141,11 @@ msgstr ""
msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr "Когда возникают конфликты, пользователю предоÑтавлÑетÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑ‚ÑŒ объединить изменениÑ, Ñделанные в одной ветке, Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ веткой"
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
-msgstr ""
-
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
-msgstr ""
-
msgid "ProjectSettings|Wiki"
msgstr "Wiki"
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
-msgstr "С GitLab Pages вы можете размещать Ñвои ÑтатичеÑкие веб-Ñайты на GitLab"
-
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
-msgstr "C панелью ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¼ÐµÑ‚Ñ€Ð¸ÐºÐ°Ð¼Ð¸ вы можете отображать метрики производительноÑти проекта."
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
+msgstr ""
msgid "ProjectTemplates|.NET Core"
msgstr ".NET Core"
@@ -23625,10 +24423,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23637,9 +24435,6 @@ msgstr "Общие метрики"
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr "Общие метрики ÑобираютÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки на оÑнове популÑрных библиотек метрик."
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr "ÐаÑтраиваемые метрики"
@@ -23655,6 +24450,15 @@ msgstr "Определение и наÑтройка метрик..."
msgid "PrometheusService|Finding custom metrics..."
msgstr "ПоиÑк наÑтраиваемых метрик..."
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr "УÑтановить Prometheus на клаÑтеры"
@@ -23670,6 +24474,12 @@ msgstr "Метрики"
msgid "PrometheusService|Missing environment variable"
msgstr "Пропущена Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ"
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr "Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ"
@@ -23682,23 +24492,23 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr "Ðе Ñоздано ни одной наÑтраиваемой метрики. Создайте её, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐºÐ½Ð¾Ð¿ÐºÑƒ выше"
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
-msgstr "Базовый Ð°Ð´Ñ€ÐµÑ Prometheus API, например http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgstr ""
+
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+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|Time-series monitoring service"
-msgstr "Служба мониторинга временных Ñ€Ñдов"
-
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
-msgstr "Чтобы включить уÑтановку Prometheus на ваших клаÑтерах, отключите ручную конфигурацию ниже"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
msgstr "Ожидание вашего первого Ñ€Ð°Ð·Ð²Ñ‘Ñ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð² Ñреде Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка общих показателей"
@@ -23706,6 +24516,12 @@ msgstr "Ожидание вашего первого развёртываниÑ
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr "ПовыÑить"
@@ -23796,9 +24612,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23841,9 +24654,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr "Защищённые окружениÑ"
-
msgid "Protected Paths"
msgstr ""
@@ -23856,6 +24666,9 @@ msgstr ""
msgid "Protected branches"
msgstr "Защищённые ветви"
+msgid "Protected environments"
+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 ""
@@ -23949,8 +24762,8 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
-msgstr "ПодÑказка:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgstr ""
msgid "Protocol"
msgstr "Протокол"
@@ -24045,8 +24858,50 @@ msgstr ""
msgid "Push to create a project"
msgstr "ИÑпользуйте push, чтобы Ñоздать проект"
-msgid "PushRule|Committer restriction"
-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 ""
@@ -24138,6 +24993,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -24174,6 +25032,9 @@ msgstr "Получать Ð¾Ð¿Ð¾Ð²ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¾Ñ‚ наÑтроенных вру
msgid "Receive notifications about your own activity"
msgstr "Получать ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾ Ñвоей деÑтельноÑти"
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr "ПоÑледние"
@@ -24350,6 +25211,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24455,6 +25319,9 @@ msgstr "Удалить иÑторию опиÑаний"
msgid "Remove due date"
msgstr "Убрать Ñрок выполнениÑ"
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24521,6 +25388,9 @@ msgstr "Удалить Ñтап"
msgid "Remove time estimate"
msgstr "Удалить оценку времени"
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24689,7 +25559,7 @@ msgstr "Ответить на комментарий"
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24745,12 +25615,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr "ДейÑтвиÑ"
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr "КлаÑÑ"
@@ -24828,6 +25701,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr "Покрытие"
@@ -24855,6 +25734,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr "ПоÑледние результаты Ð¿Ð¾ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ñ‚ÐµÑтами"
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr "ПожалуйÑта, выберите один или неÑколько проектов Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñледних данных Ð¿Ð¾ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ñ‚ÐµÑтами."
@@ -24951,6 +25836,9 @@ msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð¾Ñтупа"
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24969,6 +25857,9 @@ msgstr "Запрошено %{time_ago}"
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -25085,9 +25976,6 @@ msgstr "Ð¡Ð±Ñ€Ð¾Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð°"
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr "Ð¡Ð±Ñ€Ð¾Ñ ÐºÐ»ÑŽÑ‡Ð° авторизации Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ проекта потребует Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñтого ключа в каждом иÑточнике оповещений, в котором он задейÑтвован."
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr "Ð¡Ð±Ñ€Ð¾Ñ ÐºÐ»ÑŽÑ‡Ð° авторизации Ñделает недейÑтвительным предыдущий ключ. СущеÑтвующие наÑтройки уведомлений необходимо будет обновить Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ нового ключа."
@@ -25178,6 +26066,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25558,7 +26449,7 @@ msgstr ""
msgid "Save Changes"
msgstr "Сохранить изменениÑ"
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25630,6 +26521,9 @@ msgstr ""
msgid "Scopes"
msgstr "ДоÑтуп"
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25717,6 +26611,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25911,7 +26808,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25956,12 +26853,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25974,9 +26877,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -26001,6 +26901,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -26037,6 +26940,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -26046,10 +26955,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -26070,6 +26979,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -26085,9 +26997,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -26115,6 +27024,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -26157,19 +27072,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -26193,13 +27108,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -26242,7 +27150,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -26251,7 +27159,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26338,9 +27246,6 @@ msgstr "Выбрать ответÑтвенного"
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr "Выбрать ветку/тег"
-
msgid "Select due date"
msgstr ""
@@ -26389,8 +27294,8 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
-msgstr "Выберите необходимый регулÑторный Ñтандарт"
+msgid "Select required regulatory standard."
+msgstr ""
msgid "Select reviewer(s)"
msgstr ""
@@ -26431,12 +27336,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26479,8 +27390,8 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
-msgstr "Отправить отдельное уведомление по Ñлектронной почте Ð´Ð»Ñ ÑƒÑ‡Ð°Ñтников Ñ Ñ€Ð¾Ð»ÑŒÑŽ Developer."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
+msgstr ""
msgid "Send confirmation email"
msgstr "Отправить пиÑьмо Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸ÐµÐ¼"
@@ -26656,6 +27567,9 @@ msgstr "УÑтановите пароль в Ñвоем аккаунте, что
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26848,6 +27762,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -27005,7 +27922,7 @@ msgstr[1] "Показано %d ÑобытиÑ"
msgstr[2] "Показано %d Ñобытий"
msgstr[3] "Показано %d Ñобытий"
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -27297,9 +28214,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr "Что-то пошло не так на нашей Ñтороне. ПожалуйÑта, попробуйте ещё раз."
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27426,6 +28340,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27609,9 +28526,6 @@ msgstr "Ðедавно заходившие"
msgid "SortOptions|Recently starred"
msgstr "Сначала недавно избранные"
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr "Размер"
@@ -27801,12 +28715,15 @@ msgstr "Ðачать %{new_merge_request} Ñ Ñтих изменений"
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
-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 "Ðачать рецензию"
@@ -28311,67 +29228,67 @@ msgstr "Предложенные изменениÑ"
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
-msgstr "Ярко-зеленый"
+msgid "SuggestedColors|Aztec Gold"
+msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
-msgstr "Темно-Ñеровато-голубой"
+msgid "SuggestedColors|Blue"
+msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
-msgstr "Темно-Ñиний"
+msgid "SuggestedColors|Blue-gray"
+msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
-msgstr "Фейхоа"
+msgid "SuggestedColors|Crimson"
+msgstr ""
-msgid "SuggestedColors|Lime green"
-msgstr "Светло-зеленый"
+msgid "SuggestedColors|Dark coral"
+msgstr ""
-msgid "SuggestedColors|Moderate blue"
-msgstr "Умеренный Ñиний"
+msgid "SuggestedColors|Dark green"
+msgstr ""
-msgid "SuggestedColors|Pure red"
-msgstr "ЧиÑтый краÑный"
+msgid "SuggestedColors|Dark sea green"
+msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
-msgstr "Очень темный ненаÑыщенный Ñиний"
+msgid "SuggestedColors|Red"
+msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28458,6 +29375,12 @@ 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})"
@@ -28467,7 +29390,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28662,6 +29585,9 @@ msgstr "УÑÐ»Ð¾Ð²Ð¸Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ Политика конфи
msgid "Terraform"
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] ""
@@ -28727,6 +29653,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28739,6 +29668,9 @@ 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 ""
@@ -28760,6 +29692,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28809,9 +29744,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -29306,6 +30238,9 @@ msgstr "Этап поÑтановки показывает Ð²Ñ€ÐµÐ¼Ñ Ð¼ÐµÐ¶Ð´Ñƒ
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29390,6 +30325,9 @@ 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 ""
@@ -29408,12 +30346,18 @@ msgstr "Ðет обÑуждений, которые можно показать"
msgid "There are no issues to show."
msgstr "Ðет обÑуждений, которые можно показать."
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr "Пока нет ни одной метки"
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29444,12 +30388,12 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
-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 ""
@@ -29489,7 +30433,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29504,7 +30448,7 @@ msgstr "Произошла ошибка при Ñохранении пользо
msgid "There was a problem sending the confirmation email"
msgstr "Произошла ошибка при отправке пиÑьма Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸ÐµÐ¼"
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29546,6 +30490,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29576,6 +30523,9 @@ msgstr "Произошла ошибка при получении учаÑтни
msgid "There was an error importing the Jira project."
msgstr "При импорте проекта Jira произошла ошибка."
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29603,9 +30553,6 @@ msgstr "Ошибка при Ñохранении Ñтого узла Geo."
msgid "There was an error saving your changes."
msgstr "Произошла ошибка при Ñохранении ваших изменений."
-msgid "There was an error saving your notification settings."
-msgstr "Произошла ошибка при Ñохранении наÑтроек уведомлений."
-
msgid "There was an error subscribing to this label."
msgstr "Произошла ошибка подпиÑки на Ñту метку."
@@ -29618,6 +30565,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29681,6 +30631,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29723,18 +30676,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr "Это дейÑтвие может привеÑти к потере данных. Чтобы предотвратить Ñлучайные дейÑтвиÑ, мы проÑим Ð’Ð°Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¸Ñ‚ÑŒ Ваше намерение."
@@ -29906,6 +30847,9 @@ msgstr "Это ÑпиÑок уÑтройÑтв, c которых вошли в Ð
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr "Это журнал безопаÑноÑти важных Ñобытий, ÑвÑзанных Ñ Ð²Ð°ÑˆÐµÐ¹ учетной запиÑью."
@@ -30203,6 +31147,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -30236,6 +31183,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30568,6 +31518,9 @@ msgstr "Совет:"
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr "Заголовок"
@@ -30718,10 +31671,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30784,12 +31737,6 @@ msgstr "Скрыть/показать Ñто окно"
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr "Переключатель: Выкл."
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr "Переключатель: Вкл."
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30814,9 +31761,6 @@ msgstr "Слишком много проÑтранÑтв имен включен
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr "Слишком много проектов включено. Ð”Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð¼Ð¸ вам потребуетÑÑ ÐºÐ¾Ð½Ñоль или API."
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30943,23 +31887,29 @@ msgstr ""
msgid "Trending"
msgstr "ПопулÑрные"
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30968,15 +31918,12 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
-msgstr ""
-
msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr "Ð’Ñ‹ не получите беÑплатный пробный период прÑмо ÑейчаÑ, но вы вÑегда можете продолжить Ñтот процеÑÑ, нажав на Ñвой аватар и выбрав \"Ðачать беÑплатный пробный период\""
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
+msgstr ""
+
msgid "Trial|Company name"
msgstr ""
@@ -31061,6 +32008,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr "УÑтранÑйте неполадки и Ñледите за ÑоÑтоÑнием Ñвоего Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ помощи траÑÑировки"
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr "Попробовать Ñнова"
@@ -31073,6 +32023,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -31094,10 +32047,10 @@ msgstr "Вторник"
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -31163,6 +32116,21 @@ msgstr "URL"
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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -31295,6 +32263,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr "К Ñожалению, ваше пиÑьмо в GitLab не может быть обработано."
@@ -31466,9 +32437,6 @@ msgstr ""
msgid "Update failed"
msgstr "Обновление не удалоÑÑŒ"
-msgid "Update failed. Please try again."
-msgstr "Обновление не удалоÑÑŒ. Попробуйте ещё раз."
-
msgid "Update it"
msgstr "Обновить Ñто"
@@ -31646,6 +32614,12 @@ msgstr ""
msgid "UsageQuota|LFS Storage"
msgstr "Хранилище LFS"
+msgid "UsageQuota|Learn more about excess storage usage"
+msgstr ""
+
+msgid "UsageQuota|Learn more about usage quotas"
+msgstr ""
+
msgid "UsageQuota|Packages"
msgstr "Пакеты"
@@ -31748,6 +32722,96 @@ 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 "ИÑпользуйте %{code_start}::%{code_end}, чтобы Ñоздать %{link_start}набор Ñелективных меток%{link_end} (например, %{code_start}priority::1%{code_end})"
@@ -31757,8 +32821,8 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr "ИÑпользуйте Службу поддержки Ð´Ð»Ñ ÑвÑзи Ñ Ð²Ð°ÑˆÐ¸Ð¼Ð¸ пользователÑми (например, Ð´Ð»Ñ Ð¾ÑущеÑÑ‚Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸ клиентов) через Ñлектронную почту непоÑредÑтвенно в GitLab"
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
-msgstr "ИÑпользуйте одноразовый аутентификатор Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð½Ð° вашем мобильном уÑтройÑтве или компьютере, чтобы включить двухфакторную аутентификацию (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgstr ""
msgid "Use cURL"
msgstr ""
@@ -31778,7 +32842,7 @@ msgstr ""
msgid "Use template"
msgstr "ИÑпользовать шаблон"
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31949,6 +33013,12 @@ 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 "Группы"
@@ -31991,6 +33061,9 @@ 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 "У Ñтого Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½ÐµÑ‚ личных проектов"
@@ -32006,6 +33079,9 @@ msgstr "Это пользователь не добавил в избранноÐ
msgid "UserProfile|This user is blocked"
msgstr "Этот пользователь заблокирован"
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -32015,9 +33091,15 @@ 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 "Ð’Ñ‹ не Ñоздали ни одного личного проекта."
@@ -32090,6 +33172,9 @@ msgstr "Ðе назначено"
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -32207,6 +33292,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -32254,9 +33342,6 @@ msgstr "ПроÑмотр файла @ "
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr "Показать вÑÑŽ панель"
@@ -32374,6 +33459,9 @@ msgstr "Ðе определен"
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr "%{stepStart}Шаг 1%{stepEnd}. Скопируйте Ñледующий Ñкрипт:"
@@ -32440,6 +33528,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr "СерьёзноÑÑ‚ÑŒ"
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32461,15 +33552,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32668,6 +33771,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32689,6 +33798,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32746,10 +33858,10 @@ msgstr "Веб-обработчики были перемещены. ТеперÑ
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32758,7 +33870,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32785,64 +33897,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
+msgstr ""
+
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL must be percent-encoded if neccessary."
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32881,6 +34002,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32908,7 +34032,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -33077,11 +34201,8 @@ msgstr "Удалить Ñтраницу"
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr "Удалить Ñтраницу %{pageTitle}?"
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr "Кто-то редактирует Ñтраницу одновременно Ñ Ð²Ð°Ð¼Ð¸. ПожалуйÑта проверьте %{page_link} и убедитеÑÑŒ, что внеÑенные Вами Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ðµ затрут чужие."
-
-msgid "WikiPageConflictMessage|the page"
-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 "WikiPageCreate|Create %{pageTitle}"
msgstr ""
@@ -33176,9 +34297,6 @@ msgstr "Ðапишите комментарий или перетащите ÑÑŽ
msgid "Write a comment…"
msgstr "Ðапишите комментарий…"
-msgid "Write access allowed"
-msgstr "ДоÑтуп к запиÑи разрешен"
-
msgid "Write milestone description..."
msgstr "Ðапишите опиÑание Ñтапа..."
@@ -33188,6 +34306,9 @@ msgstr "Ðапишите Ñвои заметки к релизу или пере
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -33254,7 +34375,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -33269,6 +34390,9 @@ 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 ""
@@ -33317,6 +34441,9 @@ 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 ""
@@ -33464,6 +34591,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33581,6 +34711,9 @@ msgstr "Ð’Ñ‹ не указали утверждающих. Ðачните, доÐ
msgid "You have reached your project limit"
msgstr "Ð’Ñ‹ доÑтигли Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð² вашем проекте"
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr "Ð’Ñ‹ уÑпешно приобрели подпиÑку на план %{plan} на %{seats} меÑÑ‚. Ð’Ñ‹ получите чек по Ñлектронной почте."
@@ -33812,9 +34945,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr "Ваша оÑÐ½Ð¾Ð²Ð½Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð° будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð¾Ð±Ð½Ð°Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð°Ð²Ð°Ñ‚Ð°Ñ€Ð°."
@@ -33986,6 +35116,9 @@ 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 profile"
msgstr ""
@@ -34043,6 +35176,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -34068,6 +35204,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr "добавлено %{created_at_timeago}"
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -34281,6 +35420,9 @@ 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 ""
@@ -34414,6 +35556,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr "закрытое обÑуждение"
@@ -34571,6 +35716,9 @@ msgstr[3] "файлов"
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 "Ð´Ð»Ñ %{link_to_merge_request} из %{link_to_merge_request_source_branch}"
@@ -34714,6 +35862,9 @@ msgstr "не Ñ Ñлектронной почты, которой вы владÐ
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34810,9 +35961,6 @@ msgstr "МатематичеÑÐºÐ°Ñ ÑоÑтавлÑÑŽÑ‰Ð°Ñ Ñтой запиÑ
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] "Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние"
@@ -34856,9 +36004,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr " ПожалуйÑта, воÑÑтановите её или иÑпользуйте другую ветку %{missingBranchName}"
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr "%{link_start}подробнее о разрешении конфликтов%{link_end}"
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34976,6 +36121,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr "Загрузка ÑтатиÑтики развертываниÑ"
@@ -35060,7 +36208,7 @@ msgstr "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ðµ были Ñлиты в"
msgid "mrWidget|The changes will be merged into"
msgstr "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ Ñлиты в"
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -35141,6 +36289,9 @@ msgstr "будет Ñлито автоматичеÑки, еÑли ÑборочÐ
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -35150,9 +36301,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -35201,9 +36358,6 @@ msgstr ""
msgid "not found"
msgstr "не найдено"
-msgid "notification emails"
-msgstr "email Ð´Ð»Ñ ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ð¹"
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35500,6 +36654,12 @@ msgstr "Ñледующее(ие) обÑуждение(Ñ)"
msgid "this document"
msgstr "Ñтот документ"
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr "Ñводка по времени"
@@ -35527,6 +36687,9 @@ msgstr "запущено"
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr "домены, запиÑанные юникодом, должны иÑпользовать IDNA-кодировку"
@@ -35554,9 +36717,6 @@ msgstr ""
msgid "username"
msgstr "Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr "иÑпользует клаÑтеры Kubernetes Ð´Ð»Ñ Ñ€Ð°Ð·Ð²ÐµÑ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ кода!"
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/si_LK/gitlab.po b/locale/si_LK/gitlab.po
index cb3ba37a0f9..559f28328aa 100644
--- a/locale/si_LK/gitlab.po
+++ b/locale/si_LK/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: si-LK\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:09\n"
+"PO-Revision-Date: 2021-03-05 23:51\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -170,6 +173,11 @@ 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] ""
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ 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 ""
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -682,6 +710,15 @@ 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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -976,6 +1016,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -988,9 +1031,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1015,9 +1055,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1111,6 +1148,11 @@ 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] ""
@@ -1162,6 +1204,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1282,6 +1327,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1635,9 +1779,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1716,12 +1857,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1818,6 +1965,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1938,6 +2103,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2058,6 +2226,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2091,6 +2268,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2259,6 +2442,15 @@ 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 ""
@@ -2268,6 +2460,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2361,6 +2562,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2394,6 +2607,21 @@ 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 ""
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2483,9 +2714,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2576,9 +2792,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,9 +2813,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,49 +2837,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,76 +2867,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,13 +2927,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2954,7 +3104,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2996,6 +3146,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3146,12 +3293,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3269,6 +3425,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3296,12 +3455,18 @@ 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 ""
@@ -3344,7 +3509,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3395,10 +3566,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3757,9 +3928,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3787,6 +3955,9 @@ 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 erase this build?"
msgstr ""
@@ -4048,12 +4219,6 @@ msgstr[1] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5028,6 +5235,26 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5688,7 +5915,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5703,6 +5930,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6036,21 +6266,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7325,16 +7594,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7349,6 +7642,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7391,6 +7729,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7430,6 +7771,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7451,6 +7795,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8245,10 +8577,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8302,6 +8637,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8314,6 +8652,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8329,6 +8670,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,13 +8991,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8647,7 +9024,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8689,6 +9066,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8722,6 +9102,18 @@ 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 ""
@@ -8886,7 +9278,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 ""
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9261,9 +9682,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9318,6 +9736,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9429,6 +9856,15 @@ 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 ""
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9660,6 +10093,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9678,9 +10114,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9690,19 +10123,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9717,10 +10150,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9735,7 +10165,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9756,10 +10186,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9768,7 +10204,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10047,18 +10482,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,7 +10710,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11048,19 +11468,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
-msgstr ""
-
-msgid "Enter the issue title"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11345,6 +11759,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11369,6 +11786,12 @@ 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 ""
@@ -11396,6 +11819,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11423,6 +11849,9 @@ 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 ""
@@ -11447,9 +11876,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11882,6 +12320,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11915,6 +12356,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12038,10 +12482,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12068,6 +12512,12 @@ 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 ""
@@ -12104,9 +12554,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,10 +12602,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12826,6 +13279,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12856,7 +13345,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12934,9 +13423,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13096,6 +13585,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13135,6 +13627,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13144,6 +13639,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13291,6 +13801,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13330,6 +13840,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13828,6 +14344,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14630,6 +15164,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15703,96 +16240,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16078,9 +16543,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ 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 ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ 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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16972,6 +17518,9 @@ 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 ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] ""
msgstr[1] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17085,6 +17640,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17118,6 +17676,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17169,9 +17730,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17181,6 +17739,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19590,6 +20253,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19737,6 +20406,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19788,6 +20466,9 @@ 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 ""
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ 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."
+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."
@@ -20552,7 +21257,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20579,10 +21290,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20651,6 +21362,9 @@ 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 ""
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20762,6 +21473,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21077,6 +21809,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21284,9 +22028,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21308,10 +22049,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,10 +22154,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ 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 ""
@@ -21665,6 +22415,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21923,21 +22685,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21959,6 +22739,12 @@ 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 ""
@@ -22067,6 +22853,9 @@ 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 ""
@@ -22151,24 +22940,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22205,6 +22976,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22562,6 +23336,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22790,10 +23567,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22805,7 +23579,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,13 +23672,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22937,13 +23714,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22970,16 +23750,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,52 +23816,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23381,6 +24164,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23396,6 +24188,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23408,22 +24206,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23432,6 +24230,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23522,9 +24326,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23675,7 +24476,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23771,7 +24572,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24072,6 +24921,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24243,6 +25098,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,7 +25269,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25595,7 +26480,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25721,6 +26612,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,10 +26627,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,19 +26744,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26161,7 +27062,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26338,6 +27239,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] ""
msgstr[1] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27287,9 +28194,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27479,12 +28383,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27989,67 +28896,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28136,6 +29043,12 @@ 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 ""
@@ -28145,7 +29058,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ 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 ""
@@ -29076,12 +30004,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29112,10 +30046,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29157,7 +30091,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29574,6 +30505,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30382,10 +31325,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30735,6 +31675,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30756,10 +31699,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31308,6 +32266,12 @@ 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|Packages"
msgstr ""
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ 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 ""
@@ -31653,6 +32713,9 @@ 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 ""
@@ -31668,6 +32731,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ 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 ""
@@ -31752,6 +32824,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31912,9 +32990,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32032,6 +33107,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,10 +33847,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32832,9 +33943,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ 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 ""
@@ -33120,6 +34237,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33237,6 +34357,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33642,6 +34762,9 @@ 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 profile"
msgstr ""
@@ -33699,6 +34822,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 ""
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34215,6 +35350,9 @@ 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 ""
@@ -34354,6 +35492,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34698,7 +35836,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35128,6 +36272,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/sk_SK/gitlab.po b/locale/sk_SK/gitlab.po
index 9ab8ca1ecc0..98d71c1e878 100644
--- a/locale/sk_SK/gitlab.po
+++ b/locale/sk_SK/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: sk\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 18:02\n"
+"PO-Revision-Date: 2021-03-05 23:57\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -78,6 +78,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -210,6 +213,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d epic"
+msgid_plural "%d epics"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d error"
msgid_plural "%d errors"
msgstr[0] ""
@@ -455,6 +465,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -540,6 +557,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -618,6 +638,9 @@ 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 ""
@@ -669,6 +692,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -777,6 +803,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -808,6 +840,15 @@ msgstr[3] ""
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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -857,9 +898,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -907,6 +945,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1101,6 +1142,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -1126,6 +1170,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -1138,9 +1185,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1165,9 +1209,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1279,6 +1320,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "1 follower"
+msgid_plural "%{count} followers"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "1 group"
msgid_plural "%d groups"
msgstr[0] ""
@@ -1348,6 +1396,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1468,6 +1519,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1567,6 +1621,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1823,9 +1973,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1904,12 +2051,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -2006,6 +2159,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2066,6 +2234,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -2126,6 +2297,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2246,6 +2420,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2270,6 +2450,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2279,6 +2462,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2354,6 +2540,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2447,6 +2636,15 @@ 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 ""
@@ -2456,6 +2654,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2540,6 +2741,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2549,6 +2756,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2582,6 +2801,21 @@ 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 ""
@@ -2606,6 +2840,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2673,9 +2910,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2688,24 +2922,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2766,9 +2988,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2778,6 +2997,9 @@ 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 ""
@@ -2787,9 +3009,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2814,49 +3033,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2868,9 +3054,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2880,76 +3063,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
-msgstr ""
-
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2961,13 +3123,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2979,9 +3141,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2994,7 +3153,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -3081,9 +3240,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -3144,7 +3300,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -3186,6 +3342,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3252,12 +3411,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3336,12 +3489,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3366,6 +3525,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3459,6 +3621,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3486,12 +3651,18 @@ 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 ""
@@ -3534,7 +3705,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3573,6 +3747,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3585,10 +3762,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3955,9 +4132,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3985,6 +4159,9 @@ 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 erase this build?"
msgstr ""
@@ -4252,12 +4429,6 @@ msgstr[3] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4330,6 +4501,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4756,6 +4930,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4768,12 +4945,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4844,6 +5033,12 @@ 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 ""
@@ -4934,12 +5129,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -5108,16 +5297,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -5132,6 +5333,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -5165,6 +5369,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -5183,6 +5393,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5234,6 +5447,28 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5369,6 +5604,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5522,12 +5760,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5672,6 +5904,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5894,7 +6129,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5909,6 +6144,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6242,21 +6480,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6266,9 +6525,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7277,6 +7548,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7346,6 +7620,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7533,16 +7810,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
+msgstr ""
+
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Create merge request"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7557,6 +7858,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7569,9 +7876,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7587,6 +7924,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7599,6 +7945,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7638,6 +7987,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7659,6 +8011,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7713,9 +8068,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7892,24 +8244,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8370,10 +8713,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8409,9 +8752,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8461,10 +8801,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8491,6 +8831,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8518,6 +8861,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8530,6 +8876,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8545,6 +8894,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8617,6 +8972,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8626,15 +8984,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8653,6 +9026,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8662,6 +9038,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8677,6 +9056,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8782,6 +9164,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8830,13 +9215,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8863,7 +9248,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8905,6 +9290,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8938,6 +9326,18 @@ 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 ""
@@ -9104,7 +9504,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9260,7 +9660,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9284,6 +9690,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9365,6 +9774,9 @@ 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 ""
@@ -9374,6 +9786,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9398,6 +9813,13 @@ 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] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "DastSiteValidation|Validate"
msgstr ""
@@ -9416,6 +9838,9 @@ 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 ""
@@ -9437,6 +9862,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9461,6 +9889,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9479,9 +9910,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9536,6 +9964,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9566,6 +9997,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9623,6 +10057,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9647,6 +10084,15 @@ 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 ""
@@ -9833,13 +10279,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
-msgstr ""
-
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9848,6 +10291,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9857,15 +10303,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9890,6 +10333,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9908,9 +10354,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9920,19 +10363,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9947,10 +10390,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9965,7 +10405,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9986,10 +10426,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
+msgstr ""
+
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9998,7 +10444,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -10028,6 +10474,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -10037,15 +10486,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -10055,6 +10495,13 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10277,18 +10724,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10304,16 +10739,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10334,10 +10769,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10346,18 +10778,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10370,9 +10796,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10382,6 +10805,12 @@ 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 ""
@@ -10409,6 +10838,9 @@ 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|Score"
msgstr ""
@@ -10520,7 +10952,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10725,6 +11157,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10917,10 +11352,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10989,12 +11424,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -11115,6 +11544,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11280,19 +11712,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
-msgstr ""
-
-msgid "Enter the issue title"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11577,6 +12003,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11601,6 +12030,12 @@ 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 ""
@@ -11628,6 +12063,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11655,6 +12093,9 @@ 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 ""
@@ -11679,9 +12120,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11856,6 +12294,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -12021,6 +12462,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -12036,6 +12480,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -12078,6 +12525,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -12114,6 +12564,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -12147,6 +12600,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12270,10 +12726,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12300,6 +12756,12 @@ 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 ""
@@ -12336,9 +12798,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12354,9 +12813,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12390,10 +12846,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12438,7 +12894,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12456,9 +12912,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12501,6 +12954,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12997,6 +13453,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -13060,6 +13525,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -13090,7 +13591,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -13168,9 +13669,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -13183,6 +13681,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13330,6 +13831,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13369,6 +13873,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13378,6 +13885,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13402,6 +13912,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13429,6 +13945,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13474,6 +13993,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13525,6 +14047,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13549,9 +14074,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13564,6 +14086,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13600,6 +14125,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13861,9 +14389,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -14014,6 +14539,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -14062,6 +14590,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14395,6 +14926,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14671,6 +15211,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14752,15 +15298,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14868,6 +15414,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -15122,6 +15671,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15483,7 +16035,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15909,9 +16461,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15949,96 +16498,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -16057,12 +16516,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -16114,6 +16579,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -16147,6 +16618,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16315,6 +16789,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16324,9 +16801,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16336,9 +16810,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16378,19 +16885,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16399,18 +16927,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16420,6 +16963,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16642,6 +17191,9 @@ 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 ""
@@ -16717,10 +17269,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16768,6 +17317,9 @@ 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 ""
@@ -16783,7 +17335,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16843,6 +17395,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16867,6 +17422,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -17068,6 +17626,9 @@ 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 ""
@@ -17137,9 +17698,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -17218,6 +17776,9 @@ 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 ""
@@ -17240,6 +17801,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17285,6 +17849,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17333,6 +17900,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17366,6 +17936,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17417,9 +17990,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17429,6 +17999,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17630,9 +18290,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17745,6 +18402,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17784,7 +18444,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -18144,6 +18804,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -18156,9 +18819,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -18216,6 +18876,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18486,6 +19149,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18567,9 +19233,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18579,9 +19242,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18630,6 +19290,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19343,6 +20006,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19352,6 +20018,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19370,6 +20039,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19582,6 +20254,12 @@ 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 ""
@@ -19600,12 +20278,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19841,6 +20513,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19862,6 +20537,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19904,6 +20582,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -20009,6 +20690,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -20030,9 +20714,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -20060,6 +20750,9 @@ 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 ""
@@ -20096,6 +20789,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20324,13 +21020,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20345,6 +21047,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 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 ""
@@ -20360,9 +21065,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20390,6 +21092,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20444,9 +21149,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20558,6 +21260,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20579,6 +21287,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20612,9 +21323,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20793,7 +21510,7 @@ 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."
+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."
@@ -20826,7 +21543,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20841,6 +21558,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20853,10 +21576,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20925,6 +21648,9 @@ 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 ""
@@ -20979,9 +21705,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -21036,6 +21759,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -21048,6 +21780,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -21171,9 +21906,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -21192,6 +21924,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -21210,6 +21945,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -21249,6 +21990,9 @@ 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|npm command"
msgstr ""
@@ -21270,15 +22014,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21351,6 +22095,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21408,10 +22161,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21507,6 +22260,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21558,9 +22314,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21582,10 +22335,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21660,15 +22413,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21696,10 +22440,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21714,9 +22458,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21741,6 +22482,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21777,9 +22521,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21813,6 +22554,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21825,12 +22569,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21870,6 +22623,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21882,6 +22638,12 @@ 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 ""
@@ -21939,6 +22701,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -22008,6 +22773,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -22131,12 +22899,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -22197,21 +22971,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -22233,6 +23025,12 @@ 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 ""
@@ -22341,6 +23139,9 @@ 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 ""
@@ -22425,24 +23226,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22479,6 +23262,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22836,6 +23622,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -23064,10 +23853,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -23079,7 +23865,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -23094,6 +23880,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -23121,16 +23913,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -23169,13 +23958,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -23211,13 +24000,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -23244,16 +24036,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23277,7 +24078,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23301,52 +24102,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23625,10 +24423,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23637,9 +24435,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23655,6 +24450,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23670,6 +24474,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23682,22 +24492,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23706,6 +24516,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23796,9 +24612,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23841,9 +24654,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23856,6 +24666,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23949,7 +24762,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -24045,7 +24858,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -24138,6 +24993,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -24174,6 +25032,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24350,6 +25211,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24455,6 +25319,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24521,6 +25388,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24689,7 +25559,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24745,12 +25615,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24828,6 +25701,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24855,6 +25734,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24951,6 +25836,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24969,6 +25857,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -25085,9 +25976,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -25178,6 +26066,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25558,7 +26449,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25630,6 +26521,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25717,6 +26611,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25911,7 +26808,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25956,12 +26853,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25974,9 +26877,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -26001,6 +26901,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -26037,6 +26940,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -26046,10 +26955,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -26070,6 +26979,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -26085,9 +26997,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -26115,6 +27024,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -26157,19 +27072,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -26193,13 +27108,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -26242,7 +27150,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -26251,7 +27159,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26338,9 +27246,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26389,7 +27294,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26431,12 +27336,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26479,7 +27390,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26656,6 +27567,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26848,6 +27762,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -27005,7 +27922,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -27297,9 +28214,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27426,6 +28340,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27609,9 +28526,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27801,12 +28715,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -28311,67 +29228,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28458,6 +29375,12 @@ 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 ""
@@ -28467,7 +29390,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28662,6 +29585,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28727,6 +29653,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28739,6 +29668,9 @@ 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 ""
@@ -28760,6 +29692,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28809,9 +29744,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -29306,6 +30238,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29390,6 +30325,9 @@ 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 ""
@@ -29408,12 +30346,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29444,10 +30388,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29489,7 +30433,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29504,7 +30448,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29546,6 +30490,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29576,6 +30523,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29603,9 +30553,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29618,6 +30565,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29681,6 +30631,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29723,18 +30676,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29906,6 +30847,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -30203,6 +31147,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -30236,6 +31183,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30568,6 +31518,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30718,10 +31671,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30784,12 +31737,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30814,9 +31761,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30943,23 +31887,29 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30968,13 +31918,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -31061,6 +32008,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -31073,6 +32023,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -31094,10 +32047,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -31163,6 +32116,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -31295,6 +32263,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31466,9 +32437,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31646,6 +32614,12 @@ 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|Packages"
msgstr ""
@@ -31748,6 +32722,96 @@ 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 ""
@@ -31757,7 +32821,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31778,7 +32842,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31949,6 +33013,12 @@ 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 ""
@@ -31991,6 +33061,9 @@ 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 ""
@@ -32006,6 +33079,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -32015,9 +33091,15 @@ 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 ""
@@ -32090,6 +33172,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -32207,6 +33292,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -32254,9 +33342,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32374,6 +33459,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32440,6 +33528,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32461,15 +33552,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32668,6 +33771,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32689,6 +33798,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32746,10 +33858,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32758,7 +33870,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32785,64 +33897,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32881,6 +34002,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32908,7 +34032,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -33077,10 +34201,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -33176,9 +34297,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -33188,6 +34306,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -33254,7 +34375,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -33269,6 +34390,9 @@ 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 ""
@@ -33317,6 +34441,9 @@ 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 ""
@@ -33464,6 +34591,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33581,6 +34711,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33812,9 +34945,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33986,6 +35116,9 @@ 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 profile"
msgstr ""
@@ -34043,6 +35176,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -34068,6 +35204,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -34281,6 +35420,9 @@ 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 ""
@@ -34414,6 +35556,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34571,6 +35716,9 @@ msgstr[3] ""
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 ""
@@ -34714,6 +35862,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34810,9 +35961,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34856,9 +36004,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34976,6 +36121,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -35060,7 +36208,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -35141,6 +36289,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -35150,9 +36301,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -35201,9 +36358,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35500,6 +36654,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35527,6 +36687,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35554,9 +36717,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/sl_SI/gitlab.po b/locale/sl_SI/gitlab.po
index a341cb6492d..26b427b455a 100644
--- a/locale/sl_SI/gitlab.po
+++ b/locale/sl_SI/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: sl\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 18:02\n"
+"PO-Revision-Date: 2021-03-05 23:58\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -78,6 +78,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -210,6 +213,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d epic"
+msgid_plural "%d epics"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d error"
msgid_plural "%d errors"
msgstr[0] ""
@@ -455,6 +465,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -540,6 +557,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -618,6 +638,9 @@ 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 ""
@@ -669,6 +692,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -777,6 +803,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -808,6 +840,15 @@ msgstr[3] ""
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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -857,9 +898,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -907,6 +945,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1101,6 +1142,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -1126,6 +1170,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -1138,9 +1185,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1165,9 +1209,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1279,6 +1320,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "1 follower"
+msgid_plural "%{count} followers"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "1 group"
msgid_plural "%d groups"
msgstr[0] ""
@@ -1348,6 +1396,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1468,6 +1519,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1567,6 +1621,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1823,9 +1973,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1904,12 +2051,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -2006,6 +2159,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2066,6 +2234,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -2126,6 +2297,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2246,6 +2420,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2270,6 +2450,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2279,6 +2462,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2354,6 +2540,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2447,6 +2636,15 @@ 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 ""
@@ -2456,6 +2654,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2540,6 +2741,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2549,6 +2756,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2582,6 +2801,21 @@ 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 ""
@@ -2606,6 +2840,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2673,9 +2910,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2688,24 +2922,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2766,9 +2988,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2778,6 +2997,9 @@ 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 ""
@@ -2787,9 +3009,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2814,49 +3033,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2868,9 +3054,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2880,76 +3063,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
-msgstr ""
-
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2961,13 +3123,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2979,9 +3141,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2994,7 +3153,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -3081,9 +3240,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -3144,7 +3300,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -3186,6 +3342,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3252,12 +3411,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3336,12 +3489,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3366,6 +3525,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3459,6 +3621,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3486,12 +3651,18 @@ 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 ""
@@ -3534,7 +3705,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3573,6 +3747,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3585,10 +3762,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3955,9 +4132,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3985,6 +4159,9 @@ 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 erase this build?"
msgstr ""
@@ -4252,12 +4429,6 @@ msgstr[3] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4330,6 +4501,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4756,6 +4930,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4768,12 +4945,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4844,6 +5033,12 @@ 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 ""
@@ -4934,12 +5129,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -5108,16 +5297,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -5132,6 +5333,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -5165,6 +5369,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -5183,6 +5393,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5234,6 +5447,28 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5369,6 +5604,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5522,12 +5760,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5672,6 +5904,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5894,7 +6129,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5909,6 +6144,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6242,21 +6480,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6266,9 +6525,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7277,6 +7548,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7346,6 +7620,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7533,16 +7810,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
+msgstr ""
+
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Create merge request"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7557,6 +7858,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7569,9 +7876,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7587,6 +7924,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7599,6 +7945,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7638,6 +7987,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7659,6 +8011,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7713,9 +8068,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7892,24 +8244,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8370,10 +8713,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8409,9 +8752,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8461,10 +8801,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8491,6 +8831,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8518,6 +8861,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8530,6 +8876,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8545,6 +8894,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8617,6 +8972,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8626,15 +8984,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8653,6 +9026,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8662,6 +9038,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8677,6 +9056,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8782,6 +9164,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8830,13 +9215,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8863,7 +9248,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8905,6 +9290,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8938,6 +9326,18 @@ 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 ""
@@ -9104,7 +9504,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9260,7 +9660,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9284,6 +9690,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9365,6 +9774,9 @@ 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 ""
@@ -9374,6 +9786,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9398,6 +9813,13 @@ 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] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "DastSiteValidation|Validate"
msgstr ""
@@ -9416,6 +9838,9 @@ 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 ""
@@ -9437,6 +9862,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9461,6 +9889,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9479,9 +9910,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9536,6 +9964,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9566,6 +9997,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9623,6 +10057,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9647,6 +10084,15 @@ 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 ""
@@ -9833,13 +10279,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
-msgstr ""
-
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9848,6 +10291,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9857,15 +10303,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9890,6 +10333,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9908,9 +10354,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9920,19 +10363,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9947,10 +10390,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9965,7 +10405,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9986,10 +10426,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
+msgstr ""
+
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9998,7 +10444,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -10028,6 +10474,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -10037,15 +10486,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -10055,6 +10495,13 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10277,18 +10724,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10304,16 +10739,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10334,10 +10769,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10346,18 +10778,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10370,9 +10796,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10382,6 +10805,12 @@ 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 ""
@@ -10409,6 +10838,9 @@ 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|Score"
msgstr ""
@@ -10520,7 +10952,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10725,6 +11157,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10917,10 +11352,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10989,12 +11424,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -11115,6 +11544,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11280,19 +11712,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
-msgstr ""
-
-msgid "Enter the issue title"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11577,6 +12003,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11601,6 +12030,12 @@ 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 ""
@@ -11628,6 +12063,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11655,6 +12093,9 @@ 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 ""
@@ -11679,9 +12120,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11856,6 +12294,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -12021,6 +12462,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -12036,6 +12480,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -12078,6 +12525,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -12114,6 +12564,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -12147,6 +12600,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12270,10 +12726,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12300,6 +12756,12 @@ 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 ""
@@ -12336,9 +12798,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12354,9 +12813,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12390,10 +12846,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12438,7 +12894,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12456,9 +12912,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12501,6 +12954,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12997,6 +13453,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -13060,6 +13525,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -13090,7 +13591,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -13168,9 +13669,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -13183,6 +13681,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13330,6 +13831,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13369,6 +13873,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13378,6 +13885,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13402,6 +13912,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13429,6 +13945,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13474,6 +13993,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13525,6 +14047,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13549,9 +14074,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13564,6 +14086,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13600,6 +14125,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13861,9 +14389,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -14014,6 +14539,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -14062,6 +14590,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14395,6 +14926,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14671,6 +15211,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14752,15 +15298,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14868,6 +15414,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -15122,6 +15671,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15483,7 +16035,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15909,9 +16461,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15949,96 +16498,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -16057,12 +16516,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -16114,6 +16579,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -16147,6 +16618,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16315,6 +16789,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16324,9 +16801,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16336,9 +16810,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16378,19 +16885,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16399,18 +16927,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16420,6 +16963,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16642,6 +17191,9 @@ 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 ""
@@ -16717,10 +17269,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16768,6 +17317,9 @@ 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 ""
@@ -16783,7 +17335,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16843,6 +17395,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16867,6 +17422,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -17068,6 +17626,9 @@ 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 ""
@@ -17137,9 +17698,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -17218,6 +17776,9 @@ 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 ""
@@ -17240,6 +17801,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17285,6 +17849,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17333,6 +17900,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17366,6 +17936,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17417,9 +17990,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17429,6 +17999,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17630,9 +18290,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17745,6 +18402,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17784,7 +18444,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -18144,6 +18804,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -18156,9 +18819,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -18216,6 +18876,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18486,6 +19149,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18567,9 +19233,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18579,9 +19242,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18630,6 +19290,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19343,6 +20006,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19352,6 +20018,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19370,6 +20039,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19582,6 +20254,12 @@ 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 ""
@@ -19600,12 +20278,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19841,6 +20513,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19862,6 +20537,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19904,6 +20582,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -20009,6 +20690,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -20030,9 +20714,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -20060,6 +20750,9 @@ 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 ""
@@ -20096,6 +20789,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20324,13 +21020,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20345,6 +21047,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 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 ""
@@ -20360,9 +21065,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20390,6 +21092,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20444,9 +21149,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20558,6 +21260,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20579,6 +21287,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20612,9 +21323,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20793,7 +21510,7 @@ 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."
+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."
@@ -20826,7 +21543,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20841,6 +21558,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20853,10 +21576,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20925,6 +21648,9 @@ 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 ""
@@ -20979,9 +21705,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -21036,6 +21759,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -21048,6 +21780,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -21171,9 +21906,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -21192,6 +21924,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -21210,6 +21945,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -21249,6 +21990,9 @@ 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|npm command"
msgstr ""
@@ -21270,15 +22014,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21351,6 +22095,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21408,10 +22161,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21507,6 +22260,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21558,9 +22314,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21582,10 +22335,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21660,15 +22413,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21696,10 +22440,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21714,9 +22458,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21741,6 +22482,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21777,9 +22521,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21813,6 +22554,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21825,12 +22569,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21870,6 +22623,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21882,6 +22638,12 @@ 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 ""
@@ -21939,6 +22701,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -22008,6 +22773,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -22131,12 +22899,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -22197,21 +22971,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -22233,6 +23025,12 @@ 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 ""
@@ -22341,6 +23139,9 @@ 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 ""
@@ -22425,24 +23226,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22479,6 +23262,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22836,6 +23622,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -23064,10 +23853,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -23079,7 +23865,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -23094,6 +23880,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -23121,16 +23913,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -23169,13 +23958,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -23211,13 +24000,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -23244,16 +24036,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23277,7 +24078,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23301,52 +24102,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23625,10 +24423,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23637,9 +24435,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23655,6 +24450,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23670,6 +24474,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23682,22 +24492,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23706,6 +24516,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23796,9 +24612,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23841,9 +24654,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23856,6 +24666,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23949,7 +24762,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -24045,7 +24858,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -24138,6 +24993,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -24174,6 +25032,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24350,6 +25211,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24455,6 +25319,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24521,6 +25388,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24689,7 +25559,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24745,12 +25615,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24828,6 +25701,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24855,6 +25734,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24951,6 +25836,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24969,6 +25857,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -25085,9 +25976,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -25178,6 +26066,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25558,7 +26449,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25630,6 +26521,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25717,6 +26611,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25911,7 +26808,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25956,12 +26853,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25974,9 +26877,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -26001,6 +26901,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -26037,6 +26940,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -26046,10 +26955,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -26070,6 +26979,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -26085,9 +26997,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -26115,6 +27024,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -26157,19 +27072,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -26193,13 +27108,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -26242,7 +27150,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -26251,7 +27159,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26338,9 +27246,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26389,7 +27294,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26431,12 +27336,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26479,7 +27390,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26656,6 +27567,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26848,6 +27762,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -27005,7 +27922,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -27297,9 +28214,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27426,6 +28340,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27609,9 +28526,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27801,12 +28715,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -28311,67 +29228,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28458,6 +29375,12 @@ 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 ""
@@ -28467,7 +29390,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28662,6 +29585,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28727,6 +29653,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28739,6 +29668,9 @@ 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 ""
@@ -28760,6 +29692,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28809,9 +29744,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -29306,6 +30238,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29390,6 +30325,9 @@ 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 ""
@@ -29408,12 +30346,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29444,10 +30388,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29489,7 +30433,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29504,7 +30448,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29546,6 +30490,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29576,6 +30523,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29603,9 +30553,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29618,6 +30565,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29681,6 +30631,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29723,18 +30676,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29906,6 +30847,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -30203,6 +31147,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -30236,6 +31183,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30568,6 +31518,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30718,10 +31671,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30784,12 +31737,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30814,9 +31761,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30943,23 +31887,29 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30968,13 +31918,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -31061,6 +32008,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -31073,6 +32023,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -31094,10 +32047,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -31163,6 +32116,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -31295,6 +32263,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31466,9 +32437,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31646,6 +32614,12 @@ 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|Packages"
msgstr ""
@@ -31748,6 +32722,96 @@ 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 ""
@@ -31757,7 +32821,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31778,7 +32842,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31949,6 +33013,12 @@ 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 ""
@@ -31991,6 +33061,9 @@ 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 ""
@@ -32006,6 +33079,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -32015,9 +33091,15 @@ 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 ""
@@ -32090,6 +33172,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -32207,6 +33292,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -32254,9 +33342,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32374,6 +33459,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32440,6 +33528,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32461,15 +33552,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32668,6 +33771,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32689,6 +33798,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32746,10 +33858,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32758,7 +33870,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32785,64 +33897,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32881,6 +34002,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32908,7 +34032,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -33077,10 +34201,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -33176,9 +34297,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -33188,6 +34306,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -33254,7 +34375,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -33269,6 +34390,9 @@ 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 ""
@@ -33317,6 +34441,9 @@ 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 ""
@@ -33464,6 +34591,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33581,6 +34711,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33812,9 +34945,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33986,6 +35116,9 @@ 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 profile"
msgstr ""
@@ -34043,6 +35176,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -34068,6 +35204,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -34281,6 +35420,9 @@ 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 ""
@@ -34414,6 +35556,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34571,6 +35716,9 @@ msgstr[3] ""
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 ""
@@ -34714,6 +35862,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34810,9 +35961,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34856,9 +36004,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34976,6 +36121,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -35060,7 +36208,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -35141,6 +36289,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -35150,9 +36301,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -35201,9 +36358,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35500,6 +36654,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35527,6 +36687,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35554,9 +36717,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/sq_AL/gitlab.po b/locale/sq_AL/gitlab.po
index 55fa7897b28..1ecb50c2319 100644
--- a/locale/sq_AL/gitlab.po
+++ b/locale/sq_AL/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: sq\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 18:03\n"
+"PO-Revision-Date: 2021-03-05 23:58\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -170,6 +173,11 @@ 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] ""
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ 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 ""
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -682,6 +710,15 @@ 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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -976,6 +1016,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -988,9 +1031,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1015,9 +1055,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1111,6 +1148,11 @@ 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] ""
@@ -1162,6 +1204,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1282,6 +1327,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1635,9 +1779,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1716,12 +1857,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1818,6 +1965,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1938,6 +2103,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2058,6 +2226,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2091,6 +2268,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2259,6 +2442,15 @@ 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 ""
@@ -2268,6 +2460,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2361,6 +2562,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2394,6 +2607,21 @@ 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 ""
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2483,9 +2714,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2576,9 +2792,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,9 +2813,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,49 +2837,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,76 +2867,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,13 +2927,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2954,7 +3104,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2996,6 +3146,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3146,12 +3293,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3269,6 +3425,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3296,12 +3455,18 @@ 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 ""
@@ -3344,7 +3509,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3395,10 +3566,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3757,9 +3928,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3787,6 +3955,9 @@ 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 erase this build?"
msgstr ""
@@ -4048,12 +4219,6 @@ msgstr[1] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5028,6 +5235,26 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5688,7 +5915,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5703,6 +5930,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6036,21 +6266,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7325,16 +7594,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7349,6 +7642,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7391,6 +7729,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7430,6 +7771,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7451,6 +7795,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8245,10 +8577,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8302,6 +8637,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8314,6 +8652,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8329,6 +8670,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,13 +8991,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8647,7 +9024,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8689,6 +9066,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8722,6 +9102,18 @@ 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 ""
@@ -8886,7 +9278,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 ""
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9261,9 +9682,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9318,6 +9736,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9429,6 +9856,15 @@ 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 ""
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9660,6 +10093,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9678,9 +10114,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9690,19 +10123,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9717,10 +10150,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9735,7 +10165,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9756,10 +10186,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9768,7 +10204,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10047,18 +10482,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,7 +10710,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11048,19 +11468,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
-msgstr ""
-
-msgid "Enter the issue title"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11345,6 +11759,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11369,6 +11786,12 @@ 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 ""
@@ -11396,6 +11819,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11423,6 +11849,9 @@ 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 ""
@@ -11447,9 +11876,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11882,6 +12320,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11915,6 +12356,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12038,10 +12482,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12068,6 +12512,12 @@ 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 ""
@@ -12104,9 +12554,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,10 +12602,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12826,6 +13279,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12856,7 +13345,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12934,9 +13423,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13096,6 +13585,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13135,6 +13627,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13144,6 +13639,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13291,6 +13801,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13330,6 +13840,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13828,6 +14344,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14630,6 +15164,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15703,96 +16240,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16078,9 +16543,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ 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 ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ 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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16972,6 +17518,9 @@ 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 ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] ""
msgstr[1] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17085,6 +17640,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17118,6 +17676,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17169,9 +17730,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17181,6 +17739,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19590,6 +20253,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19737,6 +20406,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19788,6 +20466,9 @@ 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 ""
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ 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."
+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."
@@ -20552,7 +21257,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20579,10 +21290,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20651,6 +21362,9 @@ 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 ""
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20762,6 +21473,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21077,6 +21809,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21284,9 +22028,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21308,10 +22049,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,10 +22154,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ 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 ""
@@ -21665,6 +22415,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21923,21 +22685,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21959,6 +22739,12 @@ 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 ""
@@ -22067,6 +22853,9 @@ 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 ""
@@ -22151,24 +22940,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22205,6 +22976,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22562,6 +23336,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22790,10 +23567,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22805,7 +23579,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,13 +23672,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22937,13 +23714,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22970,16 +23750,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,52 +23816,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23381,6 +24164,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23396,6 +24188,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23408,22 +24206,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23432,6 +24230,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23522,9 +24326,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23675,7 +24476,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23771,7 +24572,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24072,6 +24921,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24243,6 +25098,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,7 +25269,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25595,7 +26480,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25721,6 +26612,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,10 +26627,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,19 +26744,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26161,7 +27062,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26338,6 +27239,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] ""
msgstr[1] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27287,9 +28194,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27479,12 +28383,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27989,67 +28896,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28136,6 +29043,12 @@ 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 ""
@@ -28145,7 +29058,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ 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 ""
@@ -29076,12 +30004,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29112,10 +30046,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29157,7 +30091,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29574,6 +30505,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30382,10 +31325,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30735,6 +31675,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30756,10 +31699,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31308,6 +32266,12 @@ 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|Packages"
msgstr ""
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ 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 ""
@@ -31653,6 +32713,9 @@ 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 ""
@@ -31668,6 +32731,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ 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 ""
@@ -31752,6 +32824,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31912,9 +32990,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32032,6 +33107,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,10 +33847,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32832,9 +33943,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ 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 ""
@@ -33120,6 +34237,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33237,6 +34357,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33642,6 +34762,9 @@ 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 profile"
msgstr ""
@@ -33699,6 +34822,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 ""
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34215,6 +35350,9 @@ 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 ""
@@ -34354,6 +35492,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34698,7 +35836,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35128,6 +36272,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/sr_CS/gitlab.po b/locale/sr_CS/gitlab.po
index c7218db5e15..df2e852e8a0 100644
--- a/locale/sr_CS/gitlab.po
+++ b/locale/sr_CS/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: sr-CS\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:10\n"
+"PO-Revision-Date: 2021-03-05 23:52\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -76,6 +76,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -190,6 +193,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%d epic"
+msgid_plural "%d epics"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d error"
msgid_plural "%d errors"
msgstr[0] "%d greška"
@@ -400,6 +409,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -481,6 +496,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -556,6 +574,9 @@ 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 ""
@@ -607,6 +628,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -715,6 +739,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -745,6 +775,15 @@ msgstr[2] ""
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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -793,9 +832,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -841,6 +877,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1027,6 +1066,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -1051,6 +1093,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -1063,9 +1108,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1090,9 +1132,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1195,6 +1234,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "1 follower"
+msgid_plural "%{count} followers"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "1 group"
msgid_plural "%d groups"
msgstr[0] ""
@@ -1255,6 +1300,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1375,6 +1423,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1474,6 +1525,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1729,9 +1876,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1810,12 +1954,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1912,6 +2062,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1972,6 +2137,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -2032,6 +2200,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2152,6 +2323,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2176,6 +2353,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2185,6 +2365,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2260,6 +2443,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2353,6 +2539,15 @@ 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 ""
@@ -2362,6 +2557,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2446,6 +2644,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2455,6 +2659,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2488,6 +2704,21 @@ 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 ""
@@ -2512,6 +2743,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2578,9 +2812,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2593,24 +2824,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2671,9 +2890,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2683,6 +2899,9 @@ 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 ""
@@ -2692,9 +2911,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2719,49 +2935,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2773,9 +2956,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2785,76 +2965,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
-msgstr ""
-
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2866,13 +3025,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2884,9 +3043,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2899,7 +3055,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2986,9 +3142,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -3049,7 +3202,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -3091,6 +3244,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3157,12 +3313,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3241,12 +3391,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3271,6 +3427,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3364,6 +3523,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3391,12 +3553,18 @@ 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 ""
@@ -3439,7 +3607,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3478,6 +3649,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3490,10 +3664,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3856,9 +4030,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3886,6 +4057,9 @@ 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 erase this build?"
msgstr ""
@@ -4150,12 +4324,6 @@ msgstr[2] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4228,6 +4396,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4654,6 +4825,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4666,12 +4840,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4741,6 +4927,12 @@ 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 ""
@@ -4831,12 +5023,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -5005,16 +5191,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -5029,6 +5227,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -5062,6 +5263,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -5080,6 +5287,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5131,6 +5341,27 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5266,6 +5497,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5419,12 +5653,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5569,6 +5797,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5791,7 +6022,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5806,6 +6037,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6139,21 +6373,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6163,9 +6418,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7174,6 +7441,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7243,6 +7513,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7429,16 +7702,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7453,6 +7750,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7465,9 +7768,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7483,6 +7816,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7495,6 +7837,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7534,6 +7879,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7555,6 +7903,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7609,9 +7960,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7786,24 +8134,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8263,10 +8602,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8302,9 +8641,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8353,10 +8689,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8383,6 +8719,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8410,6 +8749,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8422,6 +8764,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8437,6 +8782,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8509,6 +8860,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8518,15 +8872,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8545,6 +8914,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8554,6 +8926,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8569,6 +8944,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8674,6 +9052,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8722,13 +9103,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8755,7 +9136,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8797,6 +9178,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8830,6 +9214,18 @@ 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 ""
@@ -8995,7 +9391,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9151,7 +9547,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9175,6 +9577,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9256,6 +9661,9 @@ 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 ""
@@ -9265,6 +9673,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9289,6 +9700,12 @@ 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] ""
+msgstr[2] ""
+
msgid "DastSiteValidation|Validate"
msgstr ""
@@ -9307,6 +9724,9 @@ 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 ""
@@ -9328,6 +9748,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9352,6 +9775,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9370,9 +9796,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9427,6 +9850,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9457,6 +9883,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9514,6 +9943,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9538,6 +9970,15 @@ 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 ""
@@ -9718,13 +10159,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9733,6 +10171,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9742,15 +10183,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9775,6 +10213,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9793,9 +10234,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9805,19 +10243,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9832,10 +10270,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9850,7 +10285,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9871,10 +10306,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
+msgstr ""
+
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Use this token as a password. Save it. This password can %{i_start}not%{i_end} be recovered."
msgstr ""
msgid "DeployTokens|Username"
@@ -9883,7 +10324,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9913,6 +10354,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9922,15 +10366,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9940,6 +10375,12 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10162,18 +10603,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10189,16 +10618,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10219,10 +10648,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10231,18 +10657,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10255,9 +10675,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10267,6 +10684,12 @@ 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 ""
@@ -10294,6 +10717,9 @@ 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|Score"
msgstr ""
@@ -10405,7 +10831,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10609,6 +11035,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10801,10 +11230,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10873,12 +11302,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10999,6 +11422,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11164,19 +11590,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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."
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the issue description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the issue title"
-msgstr ""
-
-msgid "Enter the merge request description"
-msgstr ""
-
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11461,6 +11881,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11485,6 +11908,12 @@ 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 ""
@@ -11512,6 +11941,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11539,6 +11971,9 @@ 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 ""
@@ -11563,9 +11998,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11740,6 +12172,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11905,6 +12340,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11920,6 +12358,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11962,6 +12403,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11998,6 +12442,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -12031,6 +12478,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12154,10 +12604,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12184,6 +12634,12 @@ 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 ""
@@ -12220,9 +12676,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12238,9 +12691,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12274,10 +12724,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12322,7 +12772,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12340,9 +12790,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12385,6 +12832,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12880,6 +13330,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12943,6 +13402,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12973,7 +13468,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -13051,9 +13546,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -13066,6 +13558,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13213,6 +13708,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13252,6 +13750,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13261,6 +13762,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13285,6 +13789,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13312,6 +13822,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13357,6 +13870,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13408,6 +13924,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13432,9 +13951,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13447,6 +13963,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13483,6 +14002,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13744,9 +14266,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13897,6 +14416,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13945,6 +14467,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14278,6 +14803,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14554,6 +15088,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14635,15 +15175,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14749,6 +15289,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -15001,6 +15544,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15361,7 +15907,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15787,9 +16333,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15826,96 +16369,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15934,12 +16387,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15991,6 +16450,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -16024,6 +16489,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16192,6 +16660,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16201,9 +16672,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16213,9 +16681,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16255,19 +16756,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16276,18 +16798,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16297,6 +16834,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16519,6 +17062,9 @@ 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 ""
@@ -16594,10 +17140,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16645,6 +17188,9 @@ 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 ""
@@ -16660,7 +17206,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16720,6 +17266,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16744,6 +17293,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16945,6 +17497,9 @@ 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 ""
@@ -17014,9 +17569,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -17095,6 +17647,9 @@ 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 ""
@@ -17116,6 +17671,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17161,6 +17719,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17209,6 +17770,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17242,6 +17806,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17293,9 +17860,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17305,6 +17869,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17500,9 +18154,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17614,6 +18265,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17653,7 +18307,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -18013,6 +18667,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -18025,9 +18682,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -18085,6 +18739,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18355,6 +19012,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18436,9 +19096,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18448,9 +19105,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18499,6 +19153,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19210,6 +19867,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19219,6 +19879,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19237,6 +19900,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19447,6 +20113,12 @@ 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 ""
@@ -19465,12 +20137,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19705,6 +20371,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19726,6 +20395,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19768,6 +20440,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19873,6 +20548,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19894,9 +20572,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19924,6 +20608,9 @@ 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 ""
@@ -19960,6 +20647,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20188,13 +20878,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20209,6 +20905,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 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 ""
@@ -20224,9 +20923,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20254,6 +20950,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20308,9 +21007,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20422,6 +21118,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20443,6 +21145,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20476,9 +21181,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20656,7 +21367,7 @@ 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."
+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."
@@ -20689,7 +21400,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20704,6 +21415,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20716,10 +21433,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20788,6 +21505,9 @@ 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 ""
@@ -20842,9 +21562,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20899,6 +21616,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20911,6 +21637,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -21034,9 +21763,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -21055,6 +21781,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -21073,6 +21802,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -21112,6 +21847,9 @@ 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|npm command"
msgstr ""
@@ -21133,15 +21871,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21214,6 +21952,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21271,10 +22018,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21370,6 +22117,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21421,9 +22171,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21445,10 +22192,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21523,15 +22270,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21559,10 +22297,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21577,9 +22315,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21604,6 +22339,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21640,9 +22378,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21676,6 +22411,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21688,12 +22426,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21733,6 +22480,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21745,6 +22495,12 @@ 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 ""
@@ -21802,6 +22558,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21871,6 +22630,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21994,12 +22756,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -22060,21 +22828,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -22096,6 +22882,12 @@ 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 ""
@@ -22204,6 +22996,9 @@ 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 ""
@@ -22288,24 +23083,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22342,6 +23119,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22699,6 +23479,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22927,10 +23710,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22942,7 +23722,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22957,6 +23737,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22984,16 +23770,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -23032,13 +23815,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -23074,13 +23857,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -23107,16 +23893,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23140,7 +23935,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23164,52 +23959,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23488,10 +24280,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23500,9 +24292,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23518,6 +24307,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23533,6 +24331,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23545,22 +24349,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23569,6 +24373,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23659,9 +24469,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23704,9 +24511,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23719,6 +24523,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23812,7 +24619,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23908,7 +24715,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -24001,6 +24850,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -24037,6 +24889,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24211,6 +25066,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24316,6 +25174,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24382,6 +25243,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24550,7 +25414,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24604,12 +25468,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24685,6 +25552,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24712,6 +25585,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24808,6 +25687,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24826,6 +25708,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24940,9 +25825,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -25033,6 +25915,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25411,7 +26296,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25483,6 +26368,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25570,6 +26458,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25753,7 +26644,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25798,12 +26689,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25816,9 +26713,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25843,6 +26737,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25879,6 +26776,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25888,10 +26791,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25912,6 +26815,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25927,9 +26833,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25957,6 +26860,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25999,19 +26908,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -26035,12 +26944,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -26083,7 +26986,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -26092,7 +26995,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26179,9 +27082,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26230,7 +27130,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26272,12 +27172,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26320,7 +27226,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26497,6 +27403,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26689,6 +27598,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26845,7 +27757,7 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -27136,9 +28048,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27265,6 +28174,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27448,9 +28360,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27640,12 +28549,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -28150,67 +29062,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28297,6 +29209,12 @@ 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 ""
@@ -28306,7 +29224,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28501,6 +29419,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28564,6 +29485,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28576,6 +29500,9 @@ 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 ""
@@ -28597,6 +29524,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28645,9 +29575,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -29140,6 +30067,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29224,6 +30154,9 @@ 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 ""
@@ -29242,12 +30175,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29278,10 +30217,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29323,7 +30262,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29338,7 +30277,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29380,6 +30319,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29410,6 +30352,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29437,9 +30382,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29452,6 +30394,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29515,6 +30460,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29557,18 +30505,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29740,6 +30676,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -30037,6 +30976,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -30070,6 +31012,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30400,6 +31345,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30550,10 +31498,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30616,12 +31564,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30646,9 +31588,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30775,22 +31714,28 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30799,13 +31744,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30892,6 +31834,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30904,6 +31849,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30925,10 +31873,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30994,6 +31942,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -31126,6 +32089,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31297,9 +32263,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31477,6 +32440,12 @@ 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|Packages"
msgstr ""
@@ -31579,6 +32548,96 @@ 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 ""
@@ -31588,7 +32647,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31609,7 +32668,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31780,6 +32839,12 @@ 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 ""
@@ -31822,6 +32887,9 @@ 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 ""
@@ -31837,6 +32905,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31846,9 +32917,15 @@ 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 ""
@@ -31921,6 +32998,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -32038,6 +33118,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -32083,9 +33166,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32203,6 +33283,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32269,6 +33352,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32290,15 +33376,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32497,6 +33595,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32518,6 +33622,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32575,10 +33682,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32587,7 +33694,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32614,64 +33721,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32710,6 +33826,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32737,7 +33856,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32905,10 +34024,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -33004,9 +34120,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -33016,6 +34129,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -33082,7 +34198,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -33097,6 +34213,9 @@ 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 ""
@@ -33145,6 +34264,9 @@ 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 ""
@@ -33292,6 +34414,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33409,6 +34534,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33640,9 +34768,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33814,6 +34939,9 @@ 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 profile"
msgstr ""
@@ -33871,6 +34999,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33895,6 +35026,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -34108,6 +35242,9 @@ 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 ""
@@ -34240,6 +35377,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34393,6 +35533,9 @@ msgstr[2] ""
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 ""
@@ -34534,6 +35677,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34630,9 +35776,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34675,9 +35818,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34795,6 +35935,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34879,7 +36022,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34960,6 +36103,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34969,9 +36115,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -35020,9 +36172,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35314,6 +36463,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35341,6 +36496,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35368,9 +36526,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/sr_SP/gitlab.po b/locale/sr_SP/gitlab.po
index 929546a5217..ef639de6773 100644
--- a/locale/sr_SP/gitlab.po
+++ b/locale/sr_SP/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: sr\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 18:03\n"
+"PO-Revision-Date: 2021-03-05 23:58\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -76,6 +76,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -190,6 +193,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%d epic"
+msgid_plural "%d epics"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d error"
msgid_plural "%d errors"
msgstr[0] ""
@@ -400,6 +409,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -481,6 +496,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -556,6 +574,9 @@ 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 ""
@@ -607,6 +628,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -715,6 +739,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -745,6 +775,15 @@ msgstr[2] ""
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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -793,9 +832,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -841,6 +877,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1027,6 +1066,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -1051,6 +1093,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -1063,9 +1108,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1090,9 +1132,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1195,6 +1234,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "1 follower"
+msgid_plural "%{count} followers"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "1 group"
msgid_plural "%d groups"
msgstr[0] ""
@@ -1255,6 +1300,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1375,6 +1423,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1474,6 +1525,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1729,9 +1876,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1810,12 +1954,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1912,6 +2062,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1972,6 +2137,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -2032,6 +2200,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2152,6 +2323,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2176,6 +2353,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2185,6 +2365,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2260,6 +2443,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2353,6 +2539,15 @@ 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 ""
@@ -2362,6 +2557,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2446,6 +2644,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2455,6 +2659,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2488,6 +2704,21 @@ 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 ""
@@ -2512,6 +2743,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2578,9 +2812,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2593,24 +2824,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2671,9 +2890,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2683,6 +2899,9 @@ 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 ""
@@ -2692,9 +2911,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2719,49 +2935,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2773,9 +2956,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2785,76 +2965,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
-msgstr ""
-
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2866,13 +3025,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2884,9 +3043,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2899,7 +3055,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2986,9 +3142,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -3049,7 +3202,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -3091,6 +3244,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3157,12 +3313,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3241,12 +3391,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3271,6 +3427,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3364,6 +3523,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3391,12 +3553,18 @@ 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 ""
@@ -3439,7 +3607,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3478,6 +3649,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3490,10 +3664,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3856,9 +4030,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3886,6 +4057,9 @@ 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 erase this build?"
msgstr ""
@@ -4150,12 +4324,6 @@ msgstr[2] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4228,6 +4396,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4654,6 +4825,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4666,12 +4840,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4741,6 +4927,12 @@ 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 ""
@@ -4831,12 +5023,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -5005,16 +5191,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -5029,6 +5227,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -5062,6 +5263,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -5080,6 +5287,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5131,6 +5341,27 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5266,6 +5497,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5419,12 +5653,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5569,6 +5797,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5791,7 +6022,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5806,6 +6037,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6139,21 +6373,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6163,9 +6418,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7174,6 +7441,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7243,6 +7513,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7429,16 +7702,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7453,6 +7750,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7465,9 +7768,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7483,6 +7816,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7495,6 +7837,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7534,6 +7879,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7555,6 +7903,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7609,9 +7960,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7786,24 +8134,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8263,10 +8602,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8302,9 +8641,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8353,10 +8689,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8383,6 +8719,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8410,6 +8749,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8422,6 +8764,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8437,6 +8782,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8509,6 +8860,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8518,15 +8872,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8545,6 +8914,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8554,6 +8926,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8569,6 +8944,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8674,6 +9052,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8722,13 +9103,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8755,7 +9136,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8797,6 +9178,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8830,6 +9214,18 @@ 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 ""
@@ -8995,7 +9391,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9151,7 +9547,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9175,6 +9577,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9256,6 +9661,9 @@ 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 ""
@@ -9265,6 +9673,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9289,6 +9700,12 @@ 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] ""
+msgstr[2] ""
+
msgid "DastSiteValidation|Validate"
msgstr ""
@@ -9307,6 +9724,9 @@ 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 ""
@@ -9328,6 +9748,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9352,6 +9775,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9370,9 +9796,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9427,6 +9850,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9457,6 +9883,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9514,6 +9943,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9538,6 +9970,15 @@ 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 ""
@@ -9718,13 +10159,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9733,6 +10171,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9742,15 +10183,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9775,6 +10213,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9793,9 +10234,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9805,19 +10243,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9832,10 +10270,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9850,7 +10285,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9871,10 +10306,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
+msgstr ""
+
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Use this token as a password. Save it. This password can %{i_start}not%{i_end} be recovered."
msgstr ""
msgid "DeployTokens|Username"
@@ -9883,7 +10324,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9913,6 +10354,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9922,15 +10366,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9940,6 +10375,12 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10162,18 +10603,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10189,16 +10618,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10219,10 +10648,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10231,18 +10657,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10255,9 +10675,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10267,6 +10684,12 @@ 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 ""
@@ -10294,6 +10717,9 @@ 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|Score"
msgstr ""
@@ -10405,7 +10831,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10609,6 +11035,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10801,10 +11230,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10873,12 +11302,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10999,6 +11422,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11164,19 +11590,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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."
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the issue description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the issue title"
-msgstr ""
-
-msgid "Enter the merge request description"
-msgstr ""
-
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11461,6 +11881,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11485,6 +11908,12 @@ 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 ""
@@ -11512,6 +11941,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11539,6 +11971,9 @@ 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 ""
@@ -11563,9 +11998,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11740,6 +12172,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11905,6 +12340,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11920,6 +12358,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11962,6 +12403,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11998,6 +12442,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -12031,6 +12478,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12154,10 +12604,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12184,6 +12634,12 @@ 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 ""
@@ -12220,9 +12676,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12238,9 +12691,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12274,10 +12724,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12322,7 +12772,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12340,9 +12790,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12385,6 +12832,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12880,6 +13330,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12943,6 +13402,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12973,7 +13468,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -13051,9 +13546,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -13066,6 +13558,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13213,6 +13708,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13252,6 +13750,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13261,6 +13762,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13285,6 +13789,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13312,6 +13822,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13357,6 +13870,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13408,6 +13924,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13432,9 +13951,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13447,6 +13963,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13483,6 +14002,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13744,9 +14266,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13897,6 +14416,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13945,6 +14467,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14278,6 +14803,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14554,6 +15088,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14635,15 +15175,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14749,6 +15289,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -15001,6 +15544,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15361,7 +15907,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15787,9 +16333,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15826,96 +16369,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15934,12 +16387,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15991,6 +16450,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -16024,6 +16489,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16192,6 +16660,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16201,9 +16672,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16213,9 +16681,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16255,19 +16756,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16276,18 +16798,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16297,6 +16834,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16519,6 +17062,9 @@ 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 ""
@@ -16594,10 +17140,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16645,6 +17188,9 @@ 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 ""
@@ -16660,7 +17206,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16720,6 +17266,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16744,6 +17293,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16945,6 +17497,9 @@ 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 ""
@@ -17014,9 +17569,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -17095,6 +17647,9 @@ 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 ""
@@ -17116,6 +17671,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17161,6 +17719,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17209,6 +17770,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17242,6 +17806,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17293,9 +17860,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17305,6 +17869,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17500,9 +18154,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17614,6 +18265,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17653,7 +18307,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -18013,6 +18667,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -18025,9 +18682,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -18085,6 +18739,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18355,6 +19012,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18436,9 +19096,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18448,9 +19105,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18499,6 +19153,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19210,6 +19867,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19219,6 +19879,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19237,6 +19900,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19447,6 +20113,12 @@ 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 ""
@@ -19465,12 +20137,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19705,6 +20371,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19726,6 +20395,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19768,6 +20440,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19873,6 +20548,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19894,9 +20572,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19924,6 +20608,9 @@ 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 ""
@@ -19960,6 +20647,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20188,13 +20878,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20209,6 +20905,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 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 ""
@@ -20224,9 +20923,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20254,6 +20950,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20308,9 +21007,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20422,6 +21118,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20443,6 +21145,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20476,9 +21181,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20656,7 +21367,7 @@ 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."
+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."
@@ -20689,7 +21400,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20704,6 +21415,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20716,10 +21433,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20788,6 +21505,9 @@ 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 ""
@@ -20842,9 +21562,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20899,6 +21616,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20911,6 +21637,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -21034,9 +21763,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -21055,6 +21781,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -21073,6 +21802,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -21112,6 +21847,9 @@ 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|npm command"
msgstr ""
@@ -21133,15 +21871,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21214,6 +21952,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21271,10 +22018,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21370,6 +22117,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21421,9 +22171,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21445,10 +22192,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21523,15 +22270,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21559,10 +22297,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21577,9 +22315,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21604,6 +22339,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21640,9 +22378,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21676,6 +22411,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21688,12 +22426,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21733,6 +22480,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21745,6 +22495,12 @@ 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 ""
@@ -21802,6 +22558,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21871,6 +22630,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21994,12 +22756,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -22060,21 +22828,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -22096,6 +22882,12 @@ 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 ""
@@ -22204,6 +22996,9 @@ 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 ""
@@ -22288,24 +23083,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22342,6 +23119,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22699,6 +23479,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22927,10 +23710,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22942,7 +23722,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22957,6 +23737,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22984,16 +23770,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -23032,13 +23815,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -23074,13 +23857,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -23107,16 +23893,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23140,7 +23935,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23164,52 +23959,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23488,10 +24280,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23500,9 +24292,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23518,6 +24307,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23533,6 +24331,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23545,22 +24349,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23569,6 +24373,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23659,9 +24469,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23704,9 +24511,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23719,6 +24523,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23812,7 +24619,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23908,7 +24715,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -24001,6 +24850,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -24037,6 +24889,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24211,6 +25066,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24316,6 +25174,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24382,6 +25243,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24550,7 +25414,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24604,12 +25468,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24685,6 +25552,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24712,6 +25585,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24808,6 +25687,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24826,6 +25708,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24940,9 +25825,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -25033,6 +25915,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25411,7 +26296,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25483,6 +26368,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25570,6 +26458,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25753,7 +26644,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25798,12 +26689,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25816,9 +26713,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25843,6 +26737,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25879,6 +26776,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25888,10 +26791,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25912,6 +26815,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25927,9 +26833,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25957,6 +26860,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25999,19 +26908,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -26035,12 +26944,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -26083,7 +26986,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -26092,7 +26995,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26179,9 +27082,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26230,7 +27130,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26272,12 +27172,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26320,7 +27226,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26497,6 +27403,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26689,6 +27598,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26845,7 +27757,7 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -27136,9 +28048,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27265,6 +28174,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27448,9 +28360,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27640,12 +28549,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -28150,67 +29062,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28297,6 +29209,12 @@ 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 ""
@@ -28306,7 +29224,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28501,6 +29419,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28564,6 +29485,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28576,6 +29500,9 @@ 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 ""
@@ -28597,6 +29524,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28645,9 +29575,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -29140,6 +30067,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29224,6 +30154,9 @@ 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 ""
@@ -29242,12 +30175,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29278,10 +30217,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29323,7 +30262,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29338,7 +30277,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29380,6 +30319,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29410,6 +30352,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29437,9 +30382,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29452,6 +30394,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29515,6 +30460,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29557,18 +30505,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29740,6 +30676,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -30037,6 +30976,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -30070,6 +31012,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30400,6 +31345,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30550,10 +31498,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30616,12 +31564,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30646,9 +31588,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30775,22 +31714,28 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30799,13 +31744,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30892,6 +31834,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30904,6 +31849,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30925,10 +31873,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30994,6 +31942,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -31126,6 +32089,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31297,9 +32263,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31477,6 +32440,12 @@ 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|Packages"
msgstr ""
@@ -31579,6 +32548,96 @@ 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 ""
@@ -31588,7 +32647,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31609,7 +32668,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31780,6 +32839,12 @@ 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 ""
@@ -31822,6 +32887,9 @@ 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 ""
@@ -31837,6 +32905,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31846,9 +32917,15 @@ 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 ""
@@ -31921,6 +32998,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -32038,6 +33118,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -32083,9 +33166,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32203,6 +33283,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32269,6 +33352,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32290,15 +33376,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32497,6 +33595,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32518,6 +33622,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32575,10 +33682,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32587,7 +33694,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32614,64 +33721,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32710,6 +33826,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32737,7 +33856,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32905,10 +34024,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -33004,9 +34120,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -33016,6 +34129,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -33082,7 +34198,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -33097,6 +34213,9 @@ 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 ""
@@ -33145,6 +34264,9 @@ 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 ""
@@ -33292,6 +34414,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33409,6 +34534,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33640,9 +34768,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33814,6 +34939,9 @@ 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 profile"
msgstr ""
@@ -33871,6 +34999,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33895,6 +35026,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -34108,6 +35242,9 @@ 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 ""
@@ -34240,6 +35377,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34393,6 +35533,9 @@ msgstr[2] ""
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 ""
@@ -34534,6 +35677,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34630,9 +35776,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34675,9 +35818,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34795,6 +35935,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34879,7 +36022,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34960,6 +36103,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34969,9 +36115,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -35020,9 +36172,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35314,6 +36463,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35341,6 +36496,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35368,9 +36526,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/sv_SE/gitlab.po b/locale/sv_SE/gitlab.po
index d6135a96850..9419498256d 100644
--- a/locale/sv_SE/gitlab.po
+++ b/locale/sv_SE/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: sv-SE\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:59\n"
+"PO-Revision-Date: 2021-03-05 23:58\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -170,6 +173,11 @@ 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] ""
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ 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 ""
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -682,6 +710,15 @@ 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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -976,6 +1016,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -988,9 +1031,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1015,9 +1055,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1111,6 +1148,11 @@ 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] ""
@@ -1162,6 +1204,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1282,6 +1327,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1635,9 +1779,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1716,12 +1857,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1818,6 +1965,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1938,6 +2103,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2058,6 +2226,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2091,6 +2268,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2259,6 +2442,15 @@ 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 ""
@@ -2268,6 +2460,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2361,6 +2562,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2394,6 +2607,21 @@ 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 ""
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2483,9 +2714,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2576,9 +2792,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,9 +2813,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,49 +2837,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,76 +2867,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,13 +2927,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2954,7 +3104,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2996,6 +3146,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3146,12 +3293,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3269,6 +3425,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3296,12 +3455,18 @@ 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 ""
@@ -3344,7 +3509,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3395,10 +3566,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3757,9 +3928,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3787,6 +3955,9 @@ 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 erase this build?"
msgstr ""
@@ -4048,12 +4219,6 @@ msgstr[1] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5028,6 +5235,26 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5688,7 +5915,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5703,6 +5930,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6036,21 +6266,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7325,16 +7594,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7349,6 +7642,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7391,6 +7729,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7430,6 +7771,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7451,6 +7795,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8245,10 +8577,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8302,6 +8637,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8314,6 +8652,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8329,6 +8670,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,13 +8991,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8647,7 +9024,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8689,6 +9066,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8722,6 +9102,18 @@ 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 ""
@@ -8886,7 +9278,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 ""
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9261,9 +9682,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9318,6 +9736,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9429,6 +9856,15 @@ 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 ""
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9660,6 +10093,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9678,9 +10114,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9690,19 +10123,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9717,10 +10150,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9735,7 +10165,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9756,10 +10186,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9768,7 +10204,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10047,18 +10482,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,7 +10710,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11048,19 +11468,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
-msgstr ""
-
-msgid "Enter the issue title"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11345,6 +11759,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11369,6 +11786,12 @@ 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 ""
@@ -11396,6 +11819,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11423,6 +11849,9 @@ 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 ""
@@ -11447,9 +11876,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11882,6 +12320,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11915,6 +12356,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12038,10 +12482,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12068,6 +12512,12 @@ 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 ""
@@ -12104,9 +12554,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,10 +12602,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12826,6 +13279,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12856,7 +13345,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12934,9 +13423,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13096,6 +13585,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13135,6 +13627,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13144,6 +13639,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13291,6 +13801,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13330,6 +13840,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13828,6 +14344,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14630,6 +15164,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15703,96 +16240,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16078,9 +16543,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ 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 ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ 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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16972,6 +17518,9 @@ 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 ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] ""
msgstr[1] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17085,6 +17640,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17118,6 +17676,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17169,9 +17730,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17181,6 +17739,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19590,6 +20253,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19737,6 +20406,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19788,6 +20466,9 @@ 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 ""
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ 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."
+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."
@@ -20552,7 +21257,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20579,10 +21290,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20651,6 +21362,9 @@ 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 ""
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20762,6 +21473,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21077,6 +21809,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21284,9 +22028,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21308,10 +22049,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,10 +22154,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ 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 ""
@@ -21665,6 +22415,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21923,21 +22685,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21959,6 +22739,12 @@ 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 ""
@@ -22067,6 +22853,9 @@ 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 ""
@@ -22151,24 +22940,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22205,6 +22976,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22562,6 +23336,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22790,10 +23567,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22805,7 +23579,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,13 +23672,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22937,13 +23714,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22970,16 +23750,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,52 +23816,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23381,6 +24164,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23396,6 +24188,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23408,22 +24206,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23432,6 +24230,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23522,9 +24326,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23675,7 +24476,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23771,7 +24572,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24072,6 +24921,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24243,6 +25098,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,7 +25269,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25595,7 +26480,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25721,6 +26612,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,10 +26627,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,19 +26744,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26161,7 +27062,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26338,6 +27239,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] ""
msgstr[1] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27287,9 +28194,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27479,12 +28383,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27989,67 +28896,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28136,6 +29043,12 @@ 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 ""
@@ -28145,7 +29058,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ 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 ""
@@ -29076,12 +30004,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29112,10 +30046,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29157,7 +30091,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29574,6 +30505,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30382,10 +31325,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30735,6 +31675,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30756,10 +31699,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31308,6 +32266,12 @@ 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|Packages"
msgstr ""
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ 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 ""
@@ -31653,6 +32713,9 @@ 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 ""
@@ -31668,6 +32731,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ 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 ""
@@ -31752,6 +32824,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31912,9 +32990,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32032,6 +33107,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,10 +33847,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32832,9 +33943,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ 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 ""
@@ -33120,6 +34237,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33237,6 +34357,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33642,6 +34762,9 @@ 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 profile"
msgstr ""
@@ -33699,6 +34822,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 ""
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34215,6 +35350,9 @@ 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 ""
@@ -34354,6 +35492,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34698,7 +35836,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35128,6 +36272,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/sw_KE/gitlab.po b/locale/sw_KE/gitlab.po
index fcb8cf563c5..46b1e4f3aa3 100644
--- a/locale/sw_KE/gitlab.po
+++ b/locale/sw_KE/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: sw\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:09\n"
+"PO-Revision-Date: 2021-03-05 23:52\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -170,6 +173,11 @@ 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] ""
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ 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 ""
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -682,6 +710,15 @@ 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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -976,6 +1016,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -988,9 +1031,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1015,9 +1055,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1111,6 +1148,11 @@ 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] ""
@@ -1162,6 +1204,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1282,6 +1327,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1635,9 +1779,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1716,12 +1857,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1818,6 +1965,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1938,6 +2103,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2058,6 +2226,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2091,6 +2268,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2259,6 +2442,15 @@ 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 ""
@@ -2268,6 +2460,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2361,6 +2562,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2394,6 +2607,21 @@ 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 ""
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2483,9 +2714,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2576,9 +2792,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,9 +2813,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,49 +2837,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,76 +2867,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,13 +2927,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2954,7 +3104,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2996,6 +3146,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3146,12 +3293,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3269,6 +3425,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3296,12 +3455,18 @@ 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 ""
@@ -3344,7 +3509,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3395,10 +3566,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3757,9 +3928,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3787,6 +3955,9 @@ 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 erase this build?"
msgstr ""
@@ -4048,12 +4219,6 @@ msgstr[1] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5028,6 +5235,26 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5688,7 +5915,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5703,6 +5930,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6036,21 +6266,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7325,16 +7594,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7349,6 +7642,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7391,6 +7729,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7430,6 +7771,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7451,6 +7795,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8245,10 +8577,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8302,6 +8637,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8314,6 +8652,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8329,6 +8670,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,13 +8991,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8647,7 +9024,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8689,6 +9066,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8722,6 +9102,18 @@ 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 ""
@@ -8886,7 +9278,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 ""
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9261,9 +9682,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9318,6 +9736,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9429,6 +9856,15 @@ 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 ""
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9660,6 +10093,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9678,9 +10114,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9690,19 +10123,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9717,10 +10150,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9735,7 +10165,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9756,10 +10186,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9768,7 +10204,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10047,18 +10482,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,7 +10710,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11048,19 +11468,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
-msgstr ""
-
-msgid "Enter the issue title"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11345,6 +11759,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11369,6 +11786,12 @@ 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 ""
@@ -11396,6 +11819,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11423,6 +11849,9 @@ 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 ""
@@ -11447,9 +11876,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11882,6 +12320,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11915,6 +12356,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12038,10 +12482,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12068,6 +12512,12 @@ 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 ""
@@ -12104,9 +12554,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,10 +12602,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12826,6 +13279,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12856,7 +13345,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12934,9 +13423,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13096,6 +13585,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13135,6 +13627,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13144,6 +13639,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13291,6 +13801,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13330,6 +13840,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13828,6 +14344,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14630,6 +15164,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15703,96 +16240,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16078,9 +16543,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ 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 ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ 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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16972,6 +17518,9 @@ 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 ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] ""
msgstr[1] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17085,6 +17640,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17118,6 +17676,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17169,9 +17730,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17181,6 +17739,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19590,6 +20253,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19737,6 +20406,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19788,6 +20466,9 @@ 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 ""
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ 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."
+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."
@@ -20552,7 +21257,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20579,10 +21290,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20651,6 +21362,9 @@ 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 ""
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20762,6 +21473,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21077,6 +21809,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21284,9 +22028,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21308,10 +22049,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,10 +22154,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ 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 ""
@@ -21665,6 +22415,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21923,21 +22685,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21959,6 +22739,12 @@ 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 ""
@@ -22067,6 +22853,9 @@ 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 ""
@@ -22151,24 +22940,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22205,6 +22976,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22562,6 +23336,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22790,10 +23567,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22805,7 +23579,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,13 +23672,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22937,13 +23714,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22970,16 +23750,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,52 +23816,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23381,6 +24164,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23396,6 +24188,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23408,22 +24206,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23432,6 +24230,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23522,9 +24326,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23675,7 +24476,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23771,7 +24572,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24072,6 +24921,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24243,6 +25098,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,7 +25269,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25595,7 +26480,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25721,6 +26612,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,10 +26627,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,19 +26744,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26161,7 +27062,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26338,6 +27239,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] ""
msgstr[1] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27287,9 +28194,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27479,12 +28383,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27989,67 +28896,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28136,6 +29043,12 @@ 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 ""
@@ -28145,7 +29058,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ 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 ""
@@ -29076,12 +30004,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29112,10 +30046,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29157,7 +30091,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29574,6 +30505,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30382,10 +31325,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30735,6 +31675,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30756,10 +31699,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31308,6 +32266,12 @@ 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|Packages"
msgstr ""
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ 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 ""
@@ -31653,6 +32713,9 @@ 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 ""
@@ -31668,6 +32731,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ 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 ""
@@ -31752,6 +32824,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31912,9 +32990,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32032,6 +33107,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,10 +33847,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32832,9 +33943,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ 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 ""
@@ -33120,6 +34237,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33237,6 +34357,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33642,6 +34762,9 @@ 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 profile"
msgstr ""
@@ -33699,6 +34822,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 ""
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34215,6 +35350,9 @@ 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 ""
@@ -34354,6 +35492,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34698,7 +35836,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35128,6 +36272,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/tr_TR/gitlab.po b/locale/tr_TR/gitlab.po
index 95af67a0561..7774dbbf3a3 100644
--- a/locale/tr_TR/gitlab.po
+++ b/locale/tr_TR/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: tr\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:55\n"
+"PO-Revision-Date: 2021-03-05 23:56\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr " ya da referanslar (ör. path/to/project!merge_request_id)"
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -170,6 +173,11 @@ msgid_plural "%d days"
msgstr[0] "%d gün"
msgstr[1] "%d gün"
+msgid "%d epic"
+msgid_plural "%d epics"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d error"
msgid_plural "%d errors"
msgstr[0] "%d hata"
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ msgstr "%{edit_in_new_fork_notice} Bu işlemi tekrar geri almaya çalışın."
msgid "%{edit_in_new_fork_notice} Try to upload a file again."
msgstr "%{edit_in_new_fork_notice} Tekrar bir dosya yüklemeyi deneyin."
+msgid "%{emailPrefix}@company.com"
+msgstr ""
+
msgid "%{extra} more downstream pipelines"
msgstr ""
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr "%{name} %{resultsString} ifadesini içeriyor"
@@ -682,6 +710,15 @@ msgstr[1] "%{no_of_days} gün"
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 "%{openOrClose} %{noteable}"
msgstr "%{openOrClose} %{noteable}"
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr "%{start} - %{end}"
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr "'%{name}' aşaması zaten var"
@@ -976,6 +1016,9 @@ msgstr "(%{value}) zaten alınmış"
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr "(DeÄŸiÅŸiklik yok)"
@@ -988,9 +1031,6 @@ msgstr "(ilerlemeyi kontrol et)"
msgid "(deleted)"
msgstr "(silindi)"
-msgid "(line: %{startLine})"
-msgstr "(satır: %{startLine})"
-
msgid "(max size 15 MB)"
msgstr "(en yüksek boyut 15 MB)"
@@ -1015,9 +1055,6 @@ msgstr "+ %{moreCount} daha fazla"
msgid "+ %{numberOfHiddenAssignees} more"
msgstr "+ %{numberOfHiddenAssignees} daha"
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1111,6 +1148,11 @@ msgid_plural "%d deploy keys"
msgstr[0] "1 dağıtım anahtarı"
msgstr[1] "%d dağıtım anahtarı"
+msgid "1 follower"
+msgid_plural "%{count} followers"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 group"
msgid_plural "%d groups"
msgstr[0] "1 grup"
@@ -1162,6 +1204,9 @@ msgstr "1-9 katkı"
msgid "10-19 contributions"
msgstr "10-19 katkı"
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr "İlk katkı!"
@@ -1282,6 +1327,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr "API Yardımı"
msgid "API Token"
msgstr "API Erişim Anahtarı"
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr "AWS Erişim Anahtarı"
@@ -1635,9 +1779,6 @@ msgstr "Bir GPG anahtarı ekle"
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr "Yapılacaklar listesi ekle"
-
msgid "Add a bullet list"
msgstr "Madde iÅŸareti listesi ekle"
@@ -1716,12 +1857,18 @@ msgstr "Tasarıma yorum ekle"
msgid "Add deploy freeze"
msgstr "Dağıtım durdurma ekle"
+msgid "Add deploy keys to grant read/write access to this repository. %{link_start}What are deploy keys?%{link_end}"
+msgstr ""
+
msgid "Add domain"
msgstr "Etki alanı ekle"
msgid "Add email address"
msgstr "E-posta adresi ekle"
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr "Ortam ekle"
@@ -1818,6 +1965,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr "Ekle/kaldır"
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr "Kullanıcı belirtilmedi."
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr "EpiÄŸe bir sorun ekler."
+msgid "Adds email participant(s)"
+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 ""
@@ -1938,6 +2103,9 @@ msgstr "GeliÅŸtirici"
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr "Misafir"
@@ -2058,6 +2226,12 @@ msgstr "Genel Ayarlar'a Git"
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr "Entegrasyonlara taşındı"
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2091,6 +2268,9 @@ msgstr "Bazı ayarlar taşındı"
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
msgstr "Her projenin Otomatik İnceleme Uygulamaları ve Otomatik Dağıtma aşamaları için varsayılan olarak kullanılacak bir etki alanı belirleyin."
+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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr "Etkin"
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr "Yönetici"
@@ -2259,6 +2442,15 @@ 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 "Koltuğu kullanıyor"
@@ -2268,6 +2460,9 @@ msgstr "Bu sensin!"
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr "Yeni kullanıcı"
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr "Kullanıcı git depolarına erişemeyecek"
@@ -2361,6 +2562,18 @@ msgstr "Kullanıcı oturum açamayacak"
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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2394,6 +2607,21 @@ 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 "Yönetim"
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr "GeliÅŸmiÅŸ Ayarlar"
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr "Gelişmiş izinler, Büyük Dosya Depolama ve İki Adımlı Kimlik Doğrulama ayarları."
@@ -2483,9 +2714,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-msgstr "Kritik"
-
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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr "Olaylar"
-msgid "AlertManagement|High"
-msgstr "Yüksek"
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr "Bilgi"
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr "Düşük"
-
-msgid "AlertManagement|Medium"
-msgstr "Orta"
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2576,9 +2792,6 @@ msgstr "Uyarı görüntülenirken bir hata oluştu. Lütfen tekrar denemek için
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,9 +2813,6 @@ msgstr "Araç"
msgid "AlertManagement|Triggered"
msgstr "Tetiklenenler"
-msgid "AlertManagement|Unknown"
-msgstr "Bilinmeyen"
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,50 +2837,17 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr "API URL"
-
-msgid "AlertSettings|Active"
-msgstr "Etkin"
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr "Yetkilendirme anahtarı"
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
-msgstr "Kopyala"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
+msgstr ""
msgid "AlertSettings|Delete integration"
msgstr ""
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,76 +2867,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr "Sıfırlama anahtarı"
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
-msgstr ""
-
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,13 +2927,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr "Uyarılar"
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr "Tüm projeler"
msgid "All projects selected"
msgstr "Tüm projeler seçildi"
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr "Tüm konular çözüldü"
@@ -2954,8 +3104,8 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
-msgstr "Bu anahtarın depoya yollanmasına izin verilsin mi? (Varsayılan yalnızca alma erişimine izin verir.)"
+msgid "Allow this key to push to this repository"
+msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
@@ -2996,6 +3146,9 @@ msgstr "Kubernetes kümelerini eklemeye ve yönetmenize olanak tanır."
msgid "Almost there"
msgstr "Neredeyse tamamlandı"
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr "Zaten engellendi"
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr "Bir hata oluÅŸtu"
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr "Konuya taslak eklenirken bir hata oluÅŸtu."
@@ -3146,12 +3293,18 @@ msgstr "Uyarıyı kaldırırken bir sorun oluştu. Sayfayı yenileyin ve yeniden
msgid "An error occurred while dismissing the feature highlight. Refresh the page and try dismissing again."
msgstr "Özellik vurgusunu gönderirken bir hata oluştu. Sayfayı yenileyin ve tekrar gönderin."
+msgid "An error occurred while drawing job relationship links."
+msgstr ""
+
msgid "An error occurred while enabling Service Desk."
msgstr "Servis Masası etkinleştirilirken bir hata oluştu."
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 commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr "Etiket renkleri alınırken bir hata oluştu."
msgid "An error occurred while fetching markdown preview"
msgstr "Markdown ön izlemesi yüklenirken hata oluştu"
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr "Bekleyen yorumlar alınırken bir hata oluştu"
@@ -3269,6 +3425,9 @@ msgstr "Birleştirme istekleri yüklenirken bir hata oluştu."
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr "Veriler yüklenirken bir hata oluştu. Lütfen tekrar deneyin."
@@ -3296,12 +3455,18 @@ msgstr "Birleştirme isteği sürüm verileri yüklenirken bir hata oluştu."
msgid "An error occurred while loading the merge request."
msgstr "Birleştirme isteği yüklenirken bir hata oluştu."
+msgid "An error occurred while loading the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while loading the pipeline."
msgstr ""
msgid "An error occurred while loading the pipelines jobs."
msgstr "İş hattı işleri yüklenirken bir hata oluştu."
+msgid "An error occurred while loading your content. Please try again."
+msgstr ""
+
msgid "An error occurred while making the request."
msgstr "Talep edilirken bir hata oluÅŸtu."
@@ -3344,8 +3509,11 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
-msgstr "Vekiller kaydedilirken bir hata oluÅŸtu"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
+msgstr ""
msgid "An error occurred while subscribing to notifications."
msgstr "Bildirimlere abone olunurken bir hata oluÅŸtu."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr "Grup yolu doğrulanırken bir hata oluştu"
@@ -3395,10 +3566,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr "Bir hata oluştu. Lütfen tekrar deneyin."
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3757,9 +3928,6 @@ msgstr "Bu yorumu oluşturmayı iptal etmek istediğinizden emin misiniz?"
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr "%{name} ismini silmek istediÄŸinizden emin misiniz?"
@@ -3787,6 +3955,9 @@ msgstr "Bu ortamı dağıtmak istediğinizden emin misiniz?"
msgid "Are you sure you want to discard this comment?"
msgstr "Bu yorumu silmek istediÄŸinizden emin misiniz?"
+msgid "Are you sure you want to discard your changes?"
+msgstr ""
+
msgid "Are you sure you want to erase this build?"
msgstr "Bu yapıyı silmek istediğinizden emin misiniz?"
@@ -4048,12 +4219,6 @@ msgstr[1] "%d dosya ekleniyor"
msgid "Attaching the file failed."
msgstr "Dosya ekleme başarısız oldu."
-msgid "Attachment"
-msgstr "Ek"
-
-msgid "Attachments"
-msgstr "Ekler"
-
msgid "Audit Events"
msgstr "Denetim Etkinlikleri"
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr "Kimlik doğrulanıyor"
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr "Kimlik Doğrulaması Başarısız"
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr "Dal adı"
msgid "Branch not loaded - %{branchId}"
msgstr "Dal yüklü değil - %{branchId}"
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr "Dallarda ara"
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr "Dalı değiştir"
-
msgid "Branches"
msgstr "Dallar"
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr "Ä°ÅŸ"
msgid "Business metrics (Custom)"
msgstr "İş metrikleri (Özel)"
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr "Lisans satın al"
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr "Öntanımlı olarak GitLab, e-postaları HTML ve düz metin biçimlerinde gönderir, böylece posta istemcileri hangi biçimi kullanacaklarını seçebilir. Yalnızca düz metin biçiminde e-postalar göndermek istiyorsanız bu seçeneği devre dışı bırakın."
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr "Varsayılan olarak, tüm projeler ve gruplar genel bildirimler ayarını kullanacaktır."
@@ -5028,6 +5235,26 @@ msgstr "CI/CD için harici depo"
msgid "CI/CD settings"
msgstr "CI / CD ayarları"
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr "Ä°ptal"
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr "Dalı seç"
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr "Dalı geri al"
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr "%{text} varlığı kontrol ediliyor…"
@@ -5688,8 +5915,8 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
-msgstr "Görünürlük seviyesini seçin, proje özelliklerini etkinleştirin/devre dışı bırakın (sorunlar, depo, wiki, parçacıklar) ve izinleri ayarlayın."
+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 ""
@@ -5703,6 +5930,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr "iptal edildi"
@@ -6036,21 +6266,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr ""
msgid "Code"
msgstr "Kod"
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr "Onaylananları daralt"
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7325,17 +7594,41 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr "%{source_branch} ve %{target_branch} aynıdır."
-msgid "CompareBranches|Compare"
-msgstr "Karşılaştır"
+msgid "CompareBranches|There isn't anything to compare."
+msgstr "Karşılaştırılacak bir şey bulunamadı."
-msgid "CompareBranches|Source"
-msgstr "Kaynak"
+msgid "CompareRevisions|Branches"
+msgstr ""
-msgid "CompareBranches|Target"
-msgstr "Hedef"
+msgid "CompareRevisions|Compare"
+msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
-msgstr "Karşılaştırılacak bir şey bulunamadı."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
+msgstr ""
msgid "Complete"
msgstr ""
@@ -7349,6 +7642,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7391,6 +7729,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7430,6 +7771,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7451,6 +7795,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr "Sona erme ilkesi devre dışı"
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr "Sona erme ilkesi %{time} süresi içinde çalışacak"
-msgid "ContainerRegistry|Filter by name"
-msgstr "İsme göre filtrele"
-
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 Repositories"
-msgstr "Resim Depoları"
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr "Ãœlke"
@@ -8245,12 +8577,12 @@ msgstr ""
msgid "Create a merge request"
msgstr "BirleÅŸtirme isteÄŸi oluÅŸtur"
+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 "Yeni bir dal oluÅŸtur"
-msgid "Create a new deploy key for this project"
-msgstr "Bu proje için yeni bir dağıtım anahtarı oluşturun"
-
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr "Dal oluÅŸtur"
@@ -8302,6 +8637,9 @@ msgstr "Dosya oluÅŸtur"
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr "Grup oluÅŸtur"
@@ -8314,6 +8652,9 @@ msgstr "Sorun kaydı oluştur"
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8329,6 +8670,12 @@ msgstr "Dönüm noktası oluştur"
msgid "Create new"
msgstr "Yeni oluÅŸtur"
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr ""
msgid "Credentials"
msgstr "Kimlik Bilgileri"
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,14 +8991,14 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
-msgstr "Profil"
+msgid "CurrentUser|One of your groups is running out"
+msgstr ""
-msgid "CurrentUser|Settings"
-msgstr "Ayarlar"
+msgid "CurrentUser|Preferences"
+msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
@@ -8647,8 +9024,8 @@ msgstr ""
msgid "Custom notification events"
msgstr "Özel bildirim etkinlikleri"
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
-msgstr "Özel bildirim seviyeleri, katılımcı seviyeleriyle aynıdır. Özel bildirim seviyeleri ile belirli etkinlikler için de bildirim alacaksınız. Daha fazla bilgi için %{notification_link} adresini inceleyin."
+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 ""
@@ -8689,6 +9066,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr "Özel renkler"
@@ -8722,6 +9102,18 @@ msgstr ""
msgid "Cycle Time"
msgstr "Döngü Süresi"
+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 "Sorun kapatıldı"
@@ -8886,7 +9278,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 "Veri hala hesaplanıyor..."
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr "Tarih aralığı %{maxDateRange} günü aşamaz."
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr "Ayın günü"
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9261,9 +9682,6 @@ msgstr "Reddet ve çıkış yap"
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr "Öntanımlı Dal"
-
msgid "Default CI configuration path"
msgstr "Varsayılan CI yapılandırma yolu"
@@ -9318,6 +9736,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr ""
msgid "Delete"
msgstr "Sil"
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr "Bu eki sil"
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr "Kullanıcı listesini sil"
@@ -9429,6 +9856,15 @@ 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 "Silindi"
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr "Dağıtım anahtarı başarıyla güncellendi."
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
msgstr "Şuna dağıt..."
+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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr "+%{count} diÄŸer"
@@ -9660,6 +10093,9 @@ msgstr "Dağıtım anahtarı kaldırılırken hata oluştu"
msgid "DeployKeys|Expand %{count} other projects"
msgstr "%{count} diÄŸer projeyi geniÅŸlet"
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr "Dağıtım anahtarları yükleniyor"
@@ -9678,9 +10114,6 @@ msgstr "Genel olarak erişilebilen dağıtım anahtarları"
msgid "DeployKeys|Read access only"
msgstr "Sadece okuma eriÅŸimi"
-msgid "DeployKeys|Write access allowed"
-msgstr "Yazma eriÅŸimine izin verildi"
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9690,20 +10123,20 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr "Dağıtım belirteci ekle"
-msgid "DeployTokens|Allows read access to the package registry"
-msgstr "Paket kayıt defterine okuma erişimi sağlar"
+msgid "DeployTokens|Allows read access to the package registry."
+msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
-msgstr "Kayıt defteri resimlerine salt okunur erişim sağlar"
+msgid "DeployTokens|Allows read-only access to registry images."
+msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
-msgstr "Kayıt defteri görüntülerine salt okunur erişimi sağlar"
+msgid "DeployTokens|Allows read-only access to the repository."
+msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
-msgstr "Paket kayıt defterine yazma erişimi sağlar"
+msgid "DeployTokens|Allows write access to registry images."
+msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
-msgstr "Kayıt defteri resimlerine yazma erişimi sağlar"
+msgid "DeployTokens|Allows write access to the package registry."
+msgstr ""
msgid "DeployTokens|Copy deploy token"
msgstr "Dağıtıcı belirtecini kopyala"
@@ -9717,12 +10150,9 @@ msgstr "Dağıtım belirteci oluştur"
msgid "DeployTokens|Created"
msgstr "OluÅŸturuldu"
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
+msgid "DeployTokens|Deploy tokens"
msgstr ""
-msgid "DeployTokens|Deploy Tokens"
-msgstr "Dağıtım Belirteçleri"
-
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
msgstr ""
@@ -9735,7 +10165,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr "Ä°sim"
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9756,10 +10186,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr "Bu işlem geri alınamaz."
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
+msgstr ""
+
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Use this token as a password. Save it. This password can %{i_start}not%{i_end} be recovered."
msgstr ""
msgid "DeployTokens|Username"
@@ -9768,8 +10204,8 @@ msgstr "Kullanıcı adı"
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
-msgstr "Yeni Dağıtım Belirteciniz"
+msgid "DeployTokens|Your new Deploy Token username"
+msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
msgstr ""
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr "Dağıtım Sıklığı"
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr "API"
@@ -10047,18 +10482,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,8 +10710,8 @@ msgstr "Bu sayfa için geri bildirim bırakın"
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr "Geliştirme sürecinize entegre güvenlik özellikleri"
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
-msgstr "%{linkStart}Altın planının%{linkEnd} diğer özelliklerini görün"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
+msgstr ""
msgid "Discover|Start a free trial"
msgstr "Ücretsiz deneme sürümü başlatın"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr "E-postalar"
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr "E-postalarda üstbilgi ve altbilgiyi etkinleştir"
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr "Entegrasyonu etkinleÅŸtir"
@@ -11048,20 +11468,14 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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."
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the issue description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the issue title"
-msgstr "Sorun başlığını girin"
-
-msgid "Enter the merge request description"
-msgstr "Birleştirme isteği açıklamasını girin"
-
-msgid "Enter the merge request title"
-msgstr "Birleştirme isteğinin başlığını girin"
+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 name of your application, and we'll return a unique %{type}."
msgstr ""
@@ -11345,6 +11759,9 @@ msgstr ""
msgid "Epic"
msgstr "Epik"
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr "Epik bulunamıyor."
@@ -11369,6 +11786,12 @@ msgstr "Epikler, proje portföyünüzü daha verimli ve daha az çaba ile yönet
msgid "Epics, Issues, and Merge Requests"
msgstr "Epikler, Sorunlar ve BirleÅŸtirme Ä°stekleri"
+msgid "Epics|%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "Epics|%{startDate} – No due date"
+msgstr ""
+
msgid "Epics|Add a new epic"
msgstr "Yeni epik ekle"
@@ -11396,6 +11819,9 @@ msgstr "Bunu nasıl çözebilirim?"
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr "EpiÄŸi sil"
@@ -11423,6 +11849,9 @@ msgstr "Sorun oluştururken birşeyler yanlış gitti."
msgid "Epics|Something went wrong while fetching child epics."
msgstr "Alt epikler alınırken bir şeyler ters gitti."
+msgid "Epics|Something went wrong while fetching epics list."
+msgstr ""
+
msgid "Epics|Something went wrong while fetching group epics."
msgstr "Grup epikleri alınırken bir şeyler ters gitti."
@@ -11447,9 +11876,6 @@ msgstr "Bu aynı zamanda %{bStart}%{targetEpicTitle}%{bEnd} epiğinin alt öğel
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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr "Onaylayanları genişlet"
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr "Dönüm noktalarını genişlet"
@@ -11882,6 +12320,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11915,6 +12356,9 @@ msgstr "Genel grupları keşfedin"
msgid "Export"
msgstr "Dışa aktar"
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr "CSV olarak dışa aktar"
@@ -12038,12 +12482,12 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
-msgstr "Tasarım için Yapılacaklar Listesi oluşturulamadı."
-
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 ""
@@ -12068,6 +12512,12 @@ 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 ""
@@ -12104,9 +12554,6 @@ msgstr "Sentry'den hatalar yüklenemedi."
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr "İlgili dalların yüklenmesi başarısız oldu"
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,10 +12602,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr "Özellik Bayrakları"
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr "Klasör/%{name}"
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr "Yazı Tipi Rengi"
@@ -12826,6 +13279,42 @@ msgstr "Çatal proje"
msgid "Fork project?"
msgstr "Proje çatallansın mı?"
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr "Buradan çatallandı:"
@@ -12856,8 +13345,8 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
-msgstr "GitLab.com Gold Ãœcretsiz Deneme"
+msgid "Free Trial of GitLab.com Ultimate"
+msgstr ""
msgid "Freeze end"
msgstr ""
@@ -12934,9 +13423,6 @@ msgstr "CoÄŸrafi"
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr "CoÄŸrafi Ayarlar"
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr "%{timeAgoStr} (%{pendingEvents} olay)"
@@ -13096,6 +13585,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13135,6 +13627,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13144,6 +13639,9 @@ msgstr "Duruma göre filtrele"
msgid "Geo|Geo Status"
msgstr "Geo Durumu"
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 "Asla"
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr "Proje"
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr "Durum"
@@ -13291,6 +13801,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr "Başlayın"
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13330,6 +13840,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr "GitHub içe aktarma"
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr "Tam ekrana git"
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr "Çizelge"
@@ -13828,6 +14344,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr "Grup profil resmi"
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr "İsme göre arayın"
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr "Merhaba %{username}!"
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr "ArÅŸivlenmiÅŸ projeleri gizle"
@@ -14630,6 +15164,9 @@ msgstr "Temizlik hizmeti, dışa aktarma, yol, transfer, kaldırma, arşivleme."
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15703,96 +16240,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr "Tüm ayrıntılar"
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr "Yorum ayrıntıları:"
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr "Standart"
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr "Grup davet et"
@@ -16078,9 +16543,6 @@ msgstr "Ãœye davet et"
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ msgstr "Sorunlar kapalı"
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 ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr "Yinelemeler"
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ 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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr "Kubernetes dağıtımı bulunamadı"
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16972,6 +17518,9 @@ msgstr "Etiketler sorunları ve birleştirme taleplerini kategorize etmek için
msgid "Labels can be applied to issues and merge requests."
msgstr "Etiketler sorunlara ve birleÅŸtirme taleplerine uygulanabilir."
+msgid "Labels with no issues in this iteration:"
+msgstr ""
+
msgid "Labels|%{spanStart}Promote label%{spanEnd} %{labelTitle} %{spanStart}to Group Label?%{spanEnd}"
msgstr ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] "Son %d gün"
msgstr[1] "Son %d gün"
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr "Soyadı"
@@ -17085,6 +17640,9 @@ msgstr "Son kullanım:"
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr "oluÅŸturdu:"
@@ -17118,6 +17676,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17169,9 +17730,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr "Daha sonra iş hattı zamanlamaları belgelerinden"
@@ -17181,6 +17739,96 @@ msgstr "daha fazla bilgi edinin"
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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr "Ayrıl"
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr "Sorunlar yükleniyor"
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr "Birleştirme isteği onayları"
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr "Bir yanıt ekle"
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr "Taslak yorum kaydedilirken bir hata oluÅŸtu."
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr "Yanıt..."
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr "Popüler Olanlar"
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr "Taşı"
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr "Konuyu taşı"
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr "Yeni dal"
@@ -19590,6 +20253,9 @@ msgstr "Yeni dağıtım anahtarı"
msgid "New directory"
msgstr "Yeni dizin"
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr "Yeni ortam"
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr "Yeni etiket"
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr "Yeni birleÅŸtirme isteÄŸi"
@@ -19737,6 +20406,9 @@ msgstr "Etkinlik bulunamadı"
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19788,6 +20466,9 @@ msgstr "Dağıtım bulunamadı"
msgid "No due date"
msgstr "BitiÅŸ tarihi yok"
+msgid "No email participants were added. Either none were provided, or they already exist."
+msgstr ""
+
msgid "No endpoint provided"
msgstr ""
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr "Gösterilecek yineleme yok"
@@ -20052,13 +20736,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr "Bu yorumu oluşturmayı iptal etmek istediğinizden emin misiniz?"
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr ""
msgid "Notification events"
msgstr "Bildirim etkinlikleri"
-msgid "Notification setting"
-msgstr "Bildirim ayarı"
-
msgid "Notification setting - %{notification_title}"
msgstr "Bildirim ayarı - %{notification_title}"
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr "BirleÅŸtirme isteÄŸi birleÅŸtir"
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr "Katıl"
msgid "NotificationLevel|Watch"
msgstr "Ä°zle"
-msgid "NotificationSetting|Custom"
-msgstr "Özel"
-
msgid "Notifications"
msgstr "Bildirimler"
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ 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."
+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."
@@ -20552,7 +21257,7 @@ 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 Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr "Oops, emin misin?"
msgid "Open"
msgstr "Açık"
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr "Seçimi Aç"
@@ -20579,10 +21290,10 @@ msgstr ""
msgid "Open errors"
msgstr "Açık hatalar"
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20651,6 +21362,9 @@ 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 ""
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20762,6 +21473,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr "Üzgünüz, filtreniz sonuç vermedi"
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr "Paketler"
@@ -21077,6 +21809,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21284,9 +22028,6 @@ msgstr "İş Hattı Zamanlaması"
msgid "Pipeline Schedules"
msgstr "İş Hattı Zamanlamaları"
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr "İş hattı dakika kotası"
@@ -21308,10 +22049,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr "İş hattı: %{status}"
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr "İş hatları çizelgeleri"
msgid "Pipelines emails"
msgstr "İş hattı e-postaları"
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr "Geçen ayın iş hatları (%{oneMonthAgo} - %{today})"
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr "Geçen haftaki iş hatları (%{oneWeekAgo} - %{today})"
-
-msgid "Pipelines for last year"
-msgstr "Geçen sene için iş hatları"
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,10 +22154,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr "İş Hatları Yükleniyor"
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ 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 ""
@@ -21665,6 +22415,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ 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 set a new password before proceeding."
msgstr "Lütfen devam etmeden önce yeni bir şifre belirleyin."
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr "Lütfen reCAPTCHA'yı çözün"
@@ -21923,21 +22685,39 @@ msgstr "Bir projenin genel bakış sayfasında hangi içeriği görmek istediği
msgid "Preferences|Choose what content you want to see on your homepage."
msgstr ""
+msgid "Preferences|Customize integrations with third party services."
+msgstr ""
+
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
msgstr "Uygulama başlığının ve gezinme kenar çubuğunun görünümünü özelleştirin."
msgid "Preferences|Display time in 24-hour format"
msgstr "Saati 24 saatlik biçimde görüntüle"
+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 mins ago."
msgstr "Örneğin: 30 dakika önce."
+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 "Düzen genişliği"
@@ -21959,6 +22739,12 @@ 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 "Sözdizimi vurgulama teması"
@@ -22067,6 +22853,9 @@ msgstr "Öncelikli etiket"
msgid "Private"
msgstr "Özel"
+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 ""
@@ -22151,24 +22940,6 @@ msgstr "Profil"
msgid "Profile Settings"
msgstr "Profil Ayarları"
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr "-"
@@ -22205,6 +22976,9 @@ msgstr "Anahtar ekle"
msgid "Profiles|Add status emoji"
msgstr "Durum ifadesi ekle"
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr "Profil resmi kırpıcı"
@@ -22562,6 +23336,9 @@ msgstr "Proje Dosyaları"
msgid "Project ID"
msgstr "Proje KimliÄŸi"
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr "Proje URL'si"
@@ -22790,12 +23567,9 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
-msgid "ProjectSettings|Allow users to request access"
-msgstr "Kullanıcıların erişim istemesine izin ver"
-
msgid "ProjectSettings|Analytics"
msgstr ""
@@ -22805,8 +23579,8 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr "Rozetler"
-msgid "ProjectSettings|Build, test, and deploy your changes"
-msgstr "Değişikliklerinizi oluşturun, test edin ve dağıtın"
+msgid "ProjectSettings|Build, test, and deploy your changes."
+msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
msgstr ""
@@ -22820,6 +23594,12 @@ msgstr "Birleştirme yönteminizi, birleştirme seçeneklerini, birleştirme den
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr "Birleştirme yönteminizi, birleştirme seçeneklerinizi, birleştirme denetimlerinizi, birleştirme önerilerinizi seçin ve birleştirme istekleri için varsayılan bir açıklama şablonu oluşturun."
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr "Bu ayarı değiştirmek için bir yöneticiye başvurun."
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,14 +23672,14 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr "Sorunlar"
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
-msgstr "Bu proje için hafif sorun izleme sistemi"
+msgid "ProjectSettings|Lightweight issue tracking system."
+msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
-msgstr "Ses, video ve grafik dosyaları gibi büyük dosyaları yönetir"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
+msgstr ""
msgid "ProjectSettings|Merge checks"
msgstr ""
@@ -22937,14 +23714,17 @@ msgstr "Bu depoya yalnızca imzalanmış işlemler yollanabilir."
msgid "ProjectSettings|Operations"
msgstr ""
+msgid "ProjectSettings|Override user notification preferences for all project members."
+msgstr ""
+
msgid "ProjectSettings|Packages"
msgstr "Paketler"
msgid "ProjectSettings|Pages"
msgstr "Sayfalar"
-msgid "ProjectSettings|Pages for project documentation"
-msgstr "Proje belgeleme sayfaları"
+msgid "ProjectSettings|Pages for project documentation."
+msgstr ""
msgid "ProjectSettings|Pipelines"
msgstr "İş hatları"
@@ -22970,16 +23750,25 @@ msgstr "Depo"
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,8 +23792,8 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
-msgstr "Akışla birleştirilecek değişiklikleri gönderin"
+msgid "ProjectSettings|Submit changes to be merged upstream."
+msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
msgstr ""
@@ -23027,52 +23816,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer project"
msgstr ""
+msgid "ProjectSettings|Users can copy the repository to a new project."
+msgstr ""
+
msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr "Kullanıcılar, yalnızca kendi doğrulanmış e-postalarından biriyle taahhüt edilen bu depoya taahhütte bulunabilir."
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
msgid "ProjectSettings|Wiki"
msgstr "Viki"
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
-msgstr "GitLab Pages ile statik web sitelerinizi GitLab üzerinde barındırabilirsiniz"
-
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23381,6 +24164,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23396,6 +24188,12 @@ msgstr "Metrikler"
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr "Daha fazla bilgi"
@@ -23408,22 +24206,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23432,6 +24230,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23522,9 +24326,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr "Korunan Yollar"
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr "Korunan dallar"
+msgid "Protected environments"
+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 ""
@@ -23675,7 +24476,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23771,7 +24572,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr "Kendi etkinliğiniz ile ilgili bildirim alın"
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24072,6 +24921,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr "Bitiş tarihini kaldır"
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr "Çatal ilişkisini kaldır"
@@ -24243,6 +25098,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,7 +25269,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr "Sınıf"
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr "EriÅŸim Talebi"
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr "%{time_ago} istendi"
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr "DeÄŸiÅŸiklikleri Kaydet"
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr ""
msgid "Search forks"
msgstr "Çatalları ara"
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr "Birleştirme isteklerini arayın"
@@ -25595,7 +26480,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25721,6 +26612,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,12 +26627,12 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
+msgid "SecurityReports|Create Jira issue"
+msgstr ""
+
msgid "SecurityReports|Create issue"
msgstr "Sorun oluÅŸtur"
-msgid "SecurityReports|Dismiss Selected"
-msgstr ""
-
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,19 +26744,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr "Dal/etiket seç"
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr "Bölge seçmek için proje seçin"
msgid "Select projects"
msgstr "Projeleri seç"
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26161,8 +27062,8 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
-msgstr "Geliştiricilere ayrı bir e-posta bildirimi gönderin."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
+msgstr ""
msgid "Send confirmation email"
msgstr ""
@@ -26338,6 +27239,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr "Bu gruptaki projeler için bir şablon deposu ayarlayın"
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr "Önem"
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] "%d etkinliği gösteriliyor"
msgstr[1] "%d etkinlikleri gösteriliyor"
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27287,9 +28194,6 @@ msgstr "Son giriÅŸ"
msgid "SortOptions|Recently starred"
msgstr "Yakınlarda yıldızlanan"
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr "Boyut"
@@ -27479,12 +28383,15 @@ msgstr "Bu değişiklikler ile bir %{new_merge_request} başlatın"
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 "Ä°nceleme baÅŸlat"
@@ -27989,67 +28896,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
-msgstr "Parlak yeÅŸil"
+msgid "SuggestedColors|Aztec Gold"
+msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
-msgstr "Koyu grimsi mavi"
+msgid "SuggestedColors|Blue"
+msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
-msgstr "Koyu orta mavi"
+msgid "SuggestedColors|Blue-gray"
+msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
-msgstr "Koyu orta turuncu"
+msgid "SuggestedColors|Carrot orange"
+msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
-msgstr "Koyu orta pembe"
+msgid "SuggestedColors|Champagne"
+msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
-msgstr "Koyu orta mor"
+msgid "SuggestedColors|Charcoal grey"
+msgstr ""
-msgid "SuggestedColors|Feijoa"
-msgstr "Feyhoa"
+msgid "SuggestedColors|Crimson"
+msgstr ""
-msgid "SuggestedColors|Lime green"
-msgstr "Limon yeÅŸili"
+msgid "SuggestedColors|Dark coral"
+msgstr ""
-msgid "SuggestedColors|Moderate blue"
-msgstr "Orta mavi"
+msgid "SuggestedColors|Dark green"
+msgstr ""
-msgid "SuggestedColors|Pure red"
-msgstr "Saf kırmızı"
+msgid "SuggestedColors|Dark sea green"
+msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
-msgstr "YumuÅŸak turuncu"
+msgid "SuggestedColors|Gray"
+msgstr ""
-msgid "SuggestedColors|Soft red"
-msgstr "Yumuşak kırmızı"
+msgid "SuggestedColors|Green screen"
+msgstr ""
-msgid "SuggestedColors|Strong pink"
-msgstr "Koyu pembe"
+msgid "SuggestedColors|Green-cyan"
+msgstr ""
-msgid "SuggestedColors|Strong red"
-msgstr "Koyu kırmızı"
+msgid "SuggestedColors|Lavendar"
+msgstr ""
-msgid "SuggestedColors|Strong yellow"
-msgstr "Koyu sarı"
+msgid "SuggestedColors|Magenta-pink"
+msgstr ""
-msgid "SuggestedColors|UA blue"
-msgstr "UA mavi"
+msgid "SuggestedColors|Medium sea green"
+msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28136,6 +29043,12 @@ 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 ""
@@ -28145,7 +29058,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr "Sistem kancası başarıyla güncellendi."
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr "Hizmet Koşulları ve Gizlilik Politikası"
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr "%{user} tarafından %{timeAgo} kilitlendi"
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ 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 "Kapatılan sorun yok"
@@ -29076,12 +30004,18 @@ msgstr "Gösterilecek bir sorun yok"
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr "Henüz etiket yok"
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29112,10 +30046,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29157,7 +30091,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr "Kullanıcı etkinlik takvimi yüklenirken bir hata oluştu."
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr "Bildirim ayarlarınız kaydedilirken bir hata oluştu."
-
msgid "There was an error subscribing to this label."
msgstr "Bu etikete abone olurken bir hata oluÅŸtu."
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr "Bu işlem veri kaybına yol açabilir. Yanlışlıkla yapılacak işlemleri önlemek için niyetinizi onaylamanızı istiyoruz."
@@ -29574,6 +30505,9 @@ msgstr "Bu, hesabınıza giriÅŸ yaptığınız cihazların listesidir. TanımadÄ
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr "Bu, hesabınızla ilgili önemli olayların bir güvenlik günlüğüdür."
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr "Ä°pucu:"
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr "Başlık"
@@ -30382,12 +31325,12 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr "Aramanızı genişletmek için yukarıdaki filtreleri değiştirin veya kaldırın"
+msgid "To widen your search, change or remove filters above."
+msgstr ""
+
msgid "To widen your search, change or remove filters."
msgstr "Aramanızı genişletmek için süzgeçlerinizi değiştirin veya kaldırın."
-msgid "To-Do"
-msgstr ""
-
msgid "To-Do List"
msgstr "Yapılacaklar Listesi"
@@ -30448,12 +31391,6 @@ msgstr "Bu iletişim kutusunu aç/kapat"
msgid "Toggle thread"
msgstr "Konuyu aç/kapat"
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr "DeÄŸiÅŸtirme Durumu: KAPALI"
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr "Değiştirme Durumu: AÇIK"
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr ""
msgid "Trending"
msgstr "Öne Çıkanlar"
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr "Tekrar dene"
@@ -30735,6 +31675,9 @@ msgstr "GitLab’ın sunduğu her şeyi 30 gün boyunca deneyin."
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr "Tekrar çatallamayı dene"
@@ -30756,10 +31699,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
-msgstr "Kapat"
+msgid "Turn off"
+msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31308,6 +32266,12 @@ msgstr ""
msgid "UsageQuota|LFS Storage"
msgstr "LFS Depolama"
+msgid "UsageQuota|Learn more about excess storage usage"
+msgstr ""
+
+msgid "UsageQuota|Learn more about usage quotas"
+msgstr ""
+
msgid "UsageQuota|Packages"
msgstr "Paketler"
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr ""
msgid "Use template"
msgstr "Åžablonu kullan"
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ msgstr "Profili düzenle"
msgid "UserProfile|Explore public groups to find projects to contribute to."
msgstr "Katkıda bulunacak projeler bulmak için ortak grupları keşfedin."
+msgid "UserProfile|Followers"
+msgstr ""
+
+msgid "UserProfile|Following"
+msgstr ""
+
msgid "UserProfile|Groups"
msgstr "Gruplar"
@@ -31653,6 +32713,9 @@ msgstr "Yıldızlı projeler"
msgid "UserProfile|Subscribe"
msgstr "Abone ol"
+msgid "UserProfile|This user doesn't have any followers."
+msgstr ""
+
msgid "UserProfile|This user doesn't have any personal projects"
msgstr "Bu kullanıcının herhangi bir kişisel projesi yok"
@@ -31668,6 +32731,9 @@ msgstr "Bu kullanıcı herhangi bir projeye yıldız eklemedi"
msgid "UserProfile|This user is blocked"
msgstr "Bu kullanıcı engellendi"
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ msgstr "Tümünü görüntüle"
msgid "UserProfile|View user in admin area"
msgstr "Kullanıcıyı yönetici alanında görüntüle"
+msgid "UserProfile|You are not following other users."
+msgstr ""
+
msgid "UserProfile|You can create a group for several dependent projects."
msgstr "Birkaç bağımlı proje için bir grup oluşturabilirsiniz."
+msgid "UserProfile|You do not have any followers."
+msgstr ""
+
msgid "UserProfile|You haven't created any personal projects."
msgstr "Herhangi bir kişisel proje oluşturmadınız."
@@ -31752,6 +32824,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31912,9 +32990,6 @@ msgstr "Dosyayı görüntüle @ "
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32032,6 +33107,9 @@ msgstr "Bilinmeyen"
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr "%{user} tarafından %{timeago} %{statusStart}onaylandı%{statusEnd}"
@@ -32119,15 +33200,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,12 +33847,9 @@ msgstr "Sayfayı sil"
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr "%{pageTitle} sayfası silinsin mi?"
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
+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 "WikiPageConflictMessage|the page"
-msgstr "sayfa"
-
msgid "WikiPageCreate|Create %{pageTitle}"
msgstr "%{pageTitle} oluÅŸtur"
@@ -32832,9 +33943,6 @@ msgstr "Bir yorum yazın veya dosyalarınızı buraya sürükleyin…"
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr "Yazma eriÅŸimine izin verildi"
-
msgid "Write milestone description..."
msgstr "Dönüm noktası açıklaması yazın..."
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ 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 ""
@@ -33120,6 +34237,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33237,6 +34357,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr "Proje sınırınıza ulaştınız"
+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 a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr "Birincil e-postanız profil resmi tespiti için kullanılacaktır."
@@ -33642,6 +34762,9 @@ 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 profile"
msgstr "Profiliniz"
@@ -33699,6 +34822,9 @@ msgstr ""
msgid "[No reason]"
msgstr "[Sebep yok]"
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr "%{created_at_timeago} eklendi"
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 "Bu çözümü uygulamak için bir birleştirme talebi oluşturun veya yamayı elle indirin ve uygulayın."
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34215,6 +35350,9 @@ msgstr[1] "dosya"
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 ""
@@ -34354,6 +35492,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] "birleÅŸtirme isteÄŸi"
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr "Dağıtım istatistikleri yükleniyor"
@@ -34698,7 +35836,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr "yok"
msgid "not found"
msgstr "bulunamadı"
-msgid "notification emails"
-msgstr "bildirim e-postaları"
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35128,6 +36272,12 @@ msgstr ""
msgid "this document"
msgstr "bu belge"
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr "tetiklendi"
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr "kullanıcı adı"
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr "v%{version} sürümü %{timeAgo} yayınlandı"
diff --git a/locale/uk/gitlab.po b/locale/uk/gitlab.po
index 4c17da74a60..250038ef0ad 100644
--- a/locale/uk/gitlab.po
+++ b/locale/uk/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: uk\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:08\n"
+"PO-Revision-Date: 2021-03-05 23:53\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -78,6 +78,9 @@ msgstr " або поÑÐ¸Ð»Ð°Ð½Ð½Ñ (напр. шлÑÑ…/до/проєкту!id_з
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr "\"%{path}\" не Ñ–Ñнував у \"%{ref}\""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr "Параметр \"el\" необхідний Ð´Ð»Ñ createInstance()"
@@ -210,6 +213,13 @@ msgstr[1] "%d дні"
msgstr[2] "%d днів"
msgstr[3] "%d днів"
+msgid "%d epic"
+msgid_plural "%d epics"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d error"
msgid_plural "%d errors"
msgstr[0] "%d помилка"
@@ -455,6 +465,13 @@ msgstr[1] "%d вразливоÑÑ‚Ñ– відхилено"
msgstr[2] "%d вразливоÑтей відхилено"
msgstr[3] "%d вразливоÑтей відхилено"
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] "%d Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð¶ÐµÐ½Ð½Ñ Ð·Ð½Ð°Ð¹Ð´ÐµÐ½Ð¾:"
@@ -540,6 +557,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -618,6 +638,9 @@ msgstr "%{edit_in_new_fork_notice} Спробуйте анулювати цей
msgid "%{edit_in_new_fork_notice} Try to upload a file again."
msgstr "%{edit_in_new_fork_notice} Спробуйте завантажити файл ще раз."
+msgid "%{emailPrefix}@company.com"
+msgstr ""
+
msgid "%{extra} more downstream pipelines"
msgstr "Ще %{extra} наÑтупних конвеєрів"
@@ -669,6 +692,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr "%{issuesSize} з обмеженнÑм %{maxIssueCount}"
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -777,6 +803,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr "%{name} міÑтить %{resultsString}"
@@ -808,6 +840,15 @@ msgstr[3] "%{no_of_days} днів"
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr "на %{number_commits_behind} комітів позаду %{default_branch}, на %{number_commits_ahead} комітів попереду"
+msgid "%{oneMonthAgo} - %{today}"
+msgstr ""
+
+msgid "%{oneWeekAgo} - %{today}"
+msgstr ""
+
+msgid "%{oneYearAgo} - %{today}"
+msgstr ""
+
msgid "%{openOrClose} %{noteable}"
msgstr "%{openOrClose} %{noteable}"
@@ -857,9 +898,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -907,6 +945,9 @@ msgstr "%{spanStart}в Ñ€Ñдку%{spanEnd} %{errorLine}%{errorColumn}"
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr "%{spanStart}в%{spanEnd} %{errorFn}"
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr "%{start} до %{end}"
@@ -1101,6 +1142,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr "'%{name}' ÑÑ‚Ð°Ð´Ñ–Ñ Ð²Ð¶Ðµ Ñ–Ñнує"
@@ -1126,6 +1170,9 @@ msgstr "(%{value}) вже зайнÑто"
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr "(Ðемає змін)"
@@ -1138,9 +1185,6 @@ msgstr "(перевірити прогреÑ)"
msgid "(deleted)"
msgstr "(видалено)"
-msgid "(line: %{startLine})"
-msgstr "(Ñ€Ñдок: %{startLine})"
-
msgid "(max size 15 MB)"
msgstr "(макÑимальний розмір 15 Мб)"
@@ -1165,9 +1209,6 @@ msgstr "+ ще %{moreCount}"
msgid "+ %{numberOfHiddenAssignees} more"
msgstr "+ %{numberOfHiddenAssignees} більше"
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1279,6 +1320,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "1 follower"
+msgid_plural "%{count} followers"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "1 group"
msgid_plural "%d groups"
msgstr[0] "1 група"
@@ -1348,6 +1396,9 @@ msgstr "1-9 внеÑків"
msgid "10-19 contributions"
msgstr "10-19 внеÑків"
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr "Перший внеÑок!"
@@ -1468,6 +1519,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1567,6 +1621,102 @@ msgstr "Довідка API"
msgid "API Token"
msgstr "API-токен"
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr "Ключ доÑтупу AWS"
@@ -1823,9 +1973,6 @@ msgstr "Додати GPG ключ"
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr "Додати кнопку Ð´Ð»Ñ Grafana в Ñекції моніторингу на бічній панелі адмініÑÑ‚Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð´Ð¾Ñтупу до різноманітної ÑтатиÑтики Ñтану та продуктивноÑÑ‚Ñ– GitLab."
-msgid "Add a To Do"
-msgstr "Додати нагадуваннÑ"
-
msgid "Add a bullet list"
msgstr "Додати ненумерований ÑпиÑок"
@@ -1904,12 +2051,18 @@ 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 domain"
msgstr "Додати домен"
msgid "Add email address"
msgstr "Додати адреÑу електронної пошти"
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr "Додати Ñередовище"
@@ -2006,6 +2159,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr "Жодного кориÑтувача не вказано."
@@ -2066,6 +2234,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr "Додає задачу до епіку."
+msgid "Adds email participant(s)"
+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 ""
@@ -2126,6 +2297,9 @@ msgstr "Розробник"
msgid "AdminArea|Features"
msgstr "Функції"
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr "ГіÑÑ‚ÑŒ"
@@ -2246,6 +2420,12 @@ msgstr "Перейти до загальних налаштувань"
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr "Інтеграції, налаштовані тут, будуть автоматично заÑтоÑовуватиÑÑ Ð´Ð¾ вÑÑ–Ñ… проєктів у цьому інÑтанÑÑ–."
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2270,6 +2450,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr "Шаблон Ñлужби дозволÑÑ” вÑтановити Ð´Ð»Ñ Ñ–Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ð¹ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð° замовчуваннÑм"
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr "Задати автоматичну %{link_start}конфігурацію контейнера%{link_end} Ð´Ð»Ñ Ñ–Ð½ÑтанÑу. Ð¦Ñ ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ¹Ð½ÐµÑ€Ñƒ буде запуÑкатиÑÑ Ð¿Ñ–ÑÐ»Ñ Ð²Ð»Ð°Ñної конфігурації проєкту."
@@ -2279,6 +2462,9 @@ msgstr "ДеÑкі Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ¼Ñ–Ñ‰ÐµÐ½Ð¾"
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
msgstr "Вкажіть домен, Ñкий буде викориÑтовуватиÑÑ Ð² проєкті за замовчуваннÑм Ð´Ð»Ñ Ñтадій Auto Review Apps Ñ– Auto Deploy."
+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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr "Ðеобхідна ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ¹Ð½ÐµÑ€Ñ–Ð² може бути вибрана із директорії %{code_start}gitlab-ci%{code_end} в Ñконфігурованому %{link_start}репозиторії шаблонів інÑтанÑу%{link_end} або із конфігурацій, що надані GitLab."
@@ -2354,6 +2540,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr "Ðктивні"
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr "ÐдмініÑтратор"
@@ -2447,6 +2636,15 @@ 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 "ВикориÑтовує міÑце"
@@ -2456,6 +2654,9 @@ msgstr "Це ви!"
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr "Ðовий кориÑтувач"
@@ -2540,6 +2741,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr "КориÑтувач не зможе отримувати доÑтуп до репозиторіїв Git"
@@ -2549,6 +2756,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr "Коли кориÑтувач повторно увійде у ÑиÑтему, його обліковий Ð·Ð°Ð¿Ð¸Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾ активуєтьÑÑ Ð² повній мірі"
@@ -2582,6 +2801,21 @@ 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 "ÐдмініÑтруваннÑ"
@@ -2606,6 +2840,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr "Додаткові налаштуваннÑ"
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr "Додаткові дозволи, Ñховище великих файлів (LFS) Ñ– Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð²Ð¾Ñ„Ð°ÐºÑ‚Ð¾Ñ€Ð½Ð¾Ñ— автентифікації."
@@ -2673,9 +2910,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2688,24 +2922,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr "Події"
-msgid "AlertManagement|High"
-msgstr "ВиÑоке"
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr "Інформаційне"
-
msgid "AlertManagement|Key"
msgstr "Ключ"
-msgid "AlertManagement|Low"
-msgstr "Ðизьке"
-
-msgid "AlertManagement|Medium"
-msgstr "Середнє"
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2766,9 +2988,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2778,6 +2997,9 @@ 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 ""
@@ -2787,9 +3009,6 @@ msgstr "ІнÑтрумент"
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr "Ðевідоме"
-
msgid "AlertManagement|Value"
msgstr "ЗначеннÑ"
@@ -2814,49 +3033,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2868,9 +3054,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2880,76 +3063,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
-msgstr ""
-
-msgid "AlertSettings|There was an error updating the alert settings."
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2961,13 +3123,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2979,9 +3141,6 @@ msgstr ""
msgid "Alerts"
msgstr "ПопередженнÑ"
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2994,7 +3153,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -3081,9 +3240,6 @@ msgstr "Ð’ÑÑ– проєкти"
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr "Ð’ÑÑ– ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÐµÐ·Ð¿ÐµÐºÐ¸ увімкнені, тому що %{linkStart}Auto DevOps%{linkEnd} увімкнено в цьому проєкті"
-
msgid "All threads resolved"
msgstr "УÑÑ– Ð¾Ð±Ð³Ð¾Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð²Ð¸Ñ€Ñ–ÑˆÐµÐ½Ð¾"
@@ -3144,8 +3300,8 @@ msgstr "Дозволити запити до локальної мережі Ñ–Ð
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
-msgstr "Дозволити цьому ключеві також відправлÑти зміни в репозиторій? (За замовчуваннÑм дозволÑєтьÑÑ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ отримувати.)"
+msgid "Allow this key to push to this repository"
+msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
@@ -3186,6 +3342,9 @@ msgstr "ДозволÑÑ” додавати та керувати клаÑтера
msgid "Almost there"
msgstr "Майже готово"
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3252,12 +3411,6 @@ msgstr ""
msgid "An error has occurred"
msgstr "ТрапилаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°"
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr "Помилка при додаванні чернетки до обговореннÑ."
@@ -3336,12 +3489,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3366,6 +3525,9 @@ msgstr "Помилка при отриманні кольорів міток."
msgid "An error occurred while fetching markdown preview"
msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при попередньому переглÑді markdown"
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr "Помилка при отриманні коментарів в очікуванні"
@@ -3459,6 +3621,9 @@ msgstr "Помилка при завантаженні результатів з
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr "Під Ñ‡Ð°Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°. Будь лаÑка, Ñпробуйте ще раз."
@@ -3486,12 +3651,18 @@ 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 "Помилка при Ñтворенні запиту."
@@ -3534,8 +3705,11 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
-msgstr "Помилка при збереженні виконавців"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
+msgstr ""
msgid "An error occurred while subscribing to notifications."
msgstr "Помилка при підпиÑці на ÑповіщеннÑ."
@@ -3573,6 +3747,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr "Помилка при перевірці шлÑху групи"
@@ -3585,12 +3762,12 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr "СталаÑÑŒ помилка. Спробуйте ще раз."
-msgid "An error ocurred while loading your content. 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 ""
@@ -3955,9 +4132,6 @@ msgstr "Ви впевнені, що хочете ÑкаÑувати редагу
msgid "Are you sure you want to close this blocked issue?"
msgstr "Ви впевнені, що хочете закрити цю заблоковану задачу?"
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr "Ви впевнені, що хочете видалити %{name}?"
@@ -3985,6 +4159,9 @@ 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 erase this build?"
msgstr "Ви впевнені, що хочете видалити цей білд?"
@@ -4252,12 +4429,6 @@ msgstr[3] "Ð”Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ %d файлів"
msgid "Attaching the file failed."
msgstr "Ðе вдалоÑÑ Ð¿Ñ€Ð¸ÐºÑ€Ñ–Ð¿Ð¸Ñ‚Ð¸ файл."
-msgid "Attachment"
-msgstr "ВкладеннÑ"
-
-msgid "Attachments"
-msgstr "ВкладеннÑ"
-
msgid "Audit Events"
msgstr "Події аудиту"
@@ -4330,6 +4501,9 @@ msgstr ""
msgid "Authenticating"
msgstr "ÐвтентифікаціÑ"
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr "Помилка автентифікації"
@@ -4756,6 +4930,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4768,12 +4945,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 "Імпорт з Bitbucket Server"
@@ -4844,6 +5033,12 @@ 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 ""
@@ -4934,12 +5129,6 @@ msgstr "Ðазва гілки"
msgid "Branch not loaded - %{branchId}"
msgstr "Гілку не завантажено: %{branchId}"
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr "Пошук гілок"
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr "Перейти в гілку"
-
msgid "Branches"
msgstr "Гілки"
@@ -5108,16 +5297,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -5132,6 +5333,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -5165,6 +5369,12 @@ msgstr "БізнеÑ"
msgid "Business metrics (Custom)"
msgstr "Ð‘Ñ–Ð·Ð½ÐµÑ Ð¼ÐµÑ‚Ñ€Ð¸ÐºÐ¸ (ВлаÑні)"
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr "Придбати ліцензію"
@@ -5183,6 +5393,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr "За замовчуваннÑм GitLab відправлÑÑ” електронні лиÑти в форматі HTML та у звичайному текÑтовому форматі, щоб поштові клієнти могли вибирати Ñкий з форматів викориÑтовувати. Вимкніть це налаштуваннÑ, Ñкщо ви хочете відправлÑти лиÑти лише у звичайному текÑтовому форматі."
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr "За замовчуваннÑм уÑÑ– проєкти та групи будуть викориÑтовувати глобальні Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñповіщень."
@@ -5234,6 +5447,28 @@ msgstr "CI/CD Ð´Ð»Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½ÑŒÐ¾Ð³Ð¾ репозиторіÑ"
msgid "CI/CD settings"
msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ CI/CD"
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5369,6 +5604,9 @@ msgstr ""
msgid "Cancel"
msgstr "СкаÑувати"
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5522,12 +5760,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr "Вибрати в гілці"
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr "Ðнулювати у гілці"
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5672,6 +5904,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr "Перевірте Ñвої образи Docker на наÑвніÑÑ‚ÑŒ відомих вразливоÑтей."
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr "Перевірка доÑтупноÑÑ‚Ñ– %{text}…"
@@ -5894,8 +6129,8 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr "Оберіть групу найвищого Ñ€Ñ–Ð²Ð½Ñ Ð´Ð»Ñ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚Ñƒ репозиторіїв."
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
-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 ""
@@ -5909,6 +6144,9 @@ msgstr "Виберіть, Ñкі репозиторії ви хочете під
msgid "Choose your framework"
msgstr "Виберіть ваш фреймворк"
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr "ÑкаÑовано"
@@ -6242,21 +6480,42 @@ msgstr "Рівень клаÑтера"
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr "Ім'Ñ"
@@ -6266,9 +6525,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7277,6 +7548,9 @@ msgstr ""
msgid "Code"
msgstr "Код"
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7346,6 +7620,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr "Згорнути ÑпиÑок затверджуючих оÑіб"
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr "Згорнути етапи"
@@ -7533,17 +7810,41 @@ msgstr "ПорівнÑти із попередньою верÑією"
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr "%{source_branch} і %{target_branch} однакові."
-msgid "CompareBranches|Compare"
-msgstr "ПорівнÑти"
+msgid "CompareBranches|There isn't anything to compare."
+msgstr "Ðема чого порівнювати."
-msgid "CompareBranches|Source"
-msgstr "Джерело"
+msgid "CompareRevisions|Branches"
+msgstr ""
-msgid "CompareBranches|Target"
-msgstr "Ціль"
+msgid "CompareRevisions|Compare"
+msgstr ""
-msgid "CompareBranches|There isn't anything to 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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
+msgstr ""
msgid "Complete"
msgstr "Завершено"
@@ -7557,6 +7858,12 @@ msgstr "ВідповідніÑÑ‚ÑŒ"
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7569,9 +7876,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7587,6 +7924,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr "GDPR"
@@ -7599,6 +7945,9 @@ msgstr "HIPAA"
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr "PCI-DSS"
@@ -7638,6 +7987,9 @@ msgstr "Ðалаштувати runner'ів GitLab Ð´Ð»Ñ Ð¿Ð¾Ñ‡Ð°Ñ‚ÐºÑƒ вико
msgid "Configure Gitaly timeouts."
msgstr "Ðалаштувати таймаути Gitaly."
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr "Ðалаштувати Let's Encrypt"
@@ -7659,6 +8011,9 @@ msgstr "Ðалаштувати Ñ–Ñнуючу інÑталÑцію"
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7713,9 +8068,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr "Ваш GitLab Wiki може бути доÑтупний тут: %{wiki_link}. Щоб повторно увімкнути ваші GitLab Wiki, вимкніть цю інтеграцію"
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr "Вітаємо! Ви увімкнули двофакторну автентифікацію!"
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7892,24 +8244,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr "Помилка Ð·â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Docker"
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 "Якщо ви ще не виконали вхід вам необхідно автентифікуватиÑÑ Ð² РеєÑтрі Контейнерів за допомогою імені кориÑтувача та Ð¿Ð°Ñ€Ð¾Ð»Ñ GitLab. Якщо у Ð²Ð°Ñ Ð²Ð²Ñ–Ð¼ÐºÐ½ÐµÐ½Ð° %{twofaDocLinkStart}Двофакторна автентифікаціÑ%{twofaDocLinkEnd}, викориÑтовуйте %{personalAccessTokensDocLinkStart}ПерÑональний Токен ДоÑтупу%{personalAccessTokensDocLinkEnd} заміÑÑ‚ÑŒ паролю."
-msgid "ContainerRegistry|Image Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8370,10 +8713,10 @@ msgstr "Ðе вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ дизайн."
msgid "Could not find iteration"
msgstr "Ðе вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ ітерацію"
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8409,9 +8752,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ ваші дизайни, оÑкільки один або кілька файлів, що завантажуютьÑÑ, не підтримуютьÑÑ."
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr "Країна"
@@ -8461,12 +8801,12 @@ 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 deploy key for this project"
-msgstr "Створити новий ключ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проєкту"
-
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr "Створіть новий файл, тому що наразі немає жодного файлу. Пізніше ви зможете закомітити ваші зміни."
@@ -8491,6 +8831,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr "Створити гілку"
@@ -8518,6 +8861,9 @@ msgstr "Створити файл"
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr "Створити групу"
@@ -8530,6 +8876,9 @@ msgstr "Створити задачу"
msgid "Create iteration"
msgstr "Створити ітерацію"
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr "Створити ÑпиÑок на оÑнові міток. Ð’ ньому будуть задачі з такими мітками."
@@ -8545,6 +8894,12 @@ msgstr "Створити етап"
msgid "Create new"
msgstr "Створити новий"
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8617,6 +8972,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8626,15 +8984,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8653,6 +9026,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8662,6 +9038,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8677,6 +9056,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8782,6 +9164,9 @@ msgstr "Дата ÑтвореннÑ"
msgid "Credentials"
msgstr "Облікові дані"
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr "Облікові дані не знайдено"
@@ -8830,14 +9215,14 @@ msgstr "Поточна кількіÑÑ‚ÑŒ вразливоÑтей"
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
-msgstr "Профіль"
+msgid "CurrentUser|One of your groups is running out"
+msgstr ""
-msgid "CurrentUser|Settings"
-msgstr "ÐалаштуваннÑ"
+msgid "CurrentUser|Preferences"
+msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
@@ -8863,8 +9248,8 @@ msgstr ""
msgid "Custom notification events"
msgstr "КориÑтувацькі Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½ÑŒ про події"
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
-msgstr "Спеціальні рівні Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñпівпадають з рівнем учаÑÑ‚Ñ–. За допомогою Ñпеціальних рівнів Ñповіщень ви також отримуватимете ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ вибрані події. Щоб дізнатиÑÑŒ більше, переглÑньте %{notification_link}."
+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 "ВлаÑні шаблони проєктів"
@@ -8905,6 +9290,9 @@ msgstr "Портал клієнтів"
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð»ÑŒÐ¾Ñ€Ñ–Ð²"
@@ -8938,6 +9326,18 @@ 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 "Задачу закрито"
@@ -9104,7 +9504,7 @@ msgstr "Випадаючий ÑпиÑок Ñтадій"
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9260,7 +9660,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9284,6 +9690,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9365,6 +9774,9 @@ 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 ""
@@ -9374,6 +9786,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9398,6 +9813,13 @@ 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] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "DastSiteValidation|Validate"
msgstr ""
@@ -9416,6 +9838,9 @@ 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 "Дані вÑе ще обчиÑлюютьÑÑ..."
@@ -9437,6 +9862,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr "Діапазон дат не може перевищувати %{maxDateRange} днів."
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr "День міÑÑцÑ"
@@ -9461,6 +9889,9 @@ msgstr "Днів до злиттÑ"
msgid "Dear Administrator,"
msgstr "Шановний ÐдмініÑтратор,"
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr "Відладка"
@@ -9479,9 +9910,6 @@ msgstr "Відхити та вийти"
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr "Гілка за замовчуваннÑм"
-
msgid "Default CI configuration path"
msgstr "ШлÑÑ… до конфігурації CI за замовчуваннÑм"
@@ -9536,6 +9964,9 @@ msgstr "Визначте влаÑний шаблон за допомогою ÑÐ
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9566,6 +9997,9 @@ msgstr "відкладено"
msgid "Delete"
msgstr "Видалити"
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9623,6 +10057,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr "Видалити це вкладеннÑ"
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr "Видалити ÑпиÑок кориÑтувачів"
@@ -9647,6 +10084,15 @@ 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 "Видалено"
@@ -9833,13 +10279,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr "Ключ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ ÑƒÑпішно оновлено."
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
-msgstr ""
-
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9848,6 +10291,9 @@ msgstr "Хід Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð½Ðµ знайдено. Щоб побачи
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9857,15 +10303,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr "+%{count} інших"
@@ -9890,6 +10333,9 @@ msgstr "Помилка при видаленні ключа розгортанн
msgid "DeployKeys|Expand %{count} other projects"
msgstr "Розгорнути %{count} інших проєктів"
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ ÐºÐ¾Ð»ÑŽÑ‡Ñ–Ð² розгортаннÑ"
@@ -9908,9 +10354,6 @@ msgstr "Публічні ключі розгортаннÑ"
msgid "DeployKeys|Read access only"
msgstr "ДоÑтуп тільки Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ"
-msgid "DeployKeys|Write access allowed"
-msgstr "Дозволено доÑтуп Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñу"
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr "Ви видалÑєте ключ розгортаннÑ. Ви впевнені?"
@@ -9920,19 +10363,19 @@ msgstr "Ðктивні токени Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ (%{active_tokens})"
msgid "DeployTokens|Add a deploy token"
msgstr "Додати токен розгортаннÑ"
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
-msgstr "ДозволÑÑ” доÑтуп лише Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð´Ð¾ реєÑтру образів"
+msgid "DeployTokens|Allows read-only access to registry images."
+msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
-msgstr "ДозволÑÑ” доÑтуп лише Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð´Ð¾ репозиторіÑ"
+msgid "DeployTokens|Allows read-only access to the repository."
+msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9947,11 +10390,8 @@ msgstr "Створити токен розгортаннÑ"
msgid "DeployTokens|Created"
msgstr "Створено"
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr "Стандартним форматом Ñ” \"gitlab+deploy-token-{n}\". Задайте ÑамоÑтійно Ñ–Ð¼â€™Ñ ÐºÐ¾Ñ€Ð¸Ñтувача Ñкщо ви хочете його змінити."
-
-msgid "DeployTokens|Deploy Tokens"
-msgstr "Токени РозгортаннÑ"
+msgid "DeployTokens|Deploy tokens"
+msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
msgstr ""
@@ -9965,8 +10405,8 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr "Ðазва"
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
-msgstr "Виберіть назву заÑтоÑунку Ñ– ми надамо вам унікальний токен розгортаннÑ."
+msgid "DeployTokens|Pick a name for your unique deploy token."
+msgstr ""
msgid "DeployTokens|Revoke"
msgstr "Відкликати"
@@ -9986,11 +10426,17 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr "Ð¦Ñ Ð´Ñ–Ñ Ð½Ðµ може бути ÑкаÑована."
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
-msgstr "ВикориÑтовуйте цей токен Ñк пароль. ПереконайтеÑÑ, що ви його зберегли: ви більше не зможете отримати доÑтуп до нього."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
+msgstr ""
+
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+msgstr ""
-msgid "DeployTokens|Use this username as a login."
-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 "Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача"
@@ -9998,8 +10444,8 @@ msgstr "Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача"
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
-msgstr "Ваш новий токер розгортаннÑ"
+msgid "DeployTokens|Your new Deploy Token username"
+msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
msgstr ""
@@ -10028,6 +10474,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr "ЧаÑтота РозгортаннÑ"
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -10037,15 +10486,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -10055,6 +10495,13 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Deployment|API"
msgstr "API"
@@ -10277,18 +10724,6 @@ msgstr "ВиÑÐ²Ð»ÐµÐ½Ð½Ñ ÐºÐ»ÑŽÑ‡Ñ–Ð² хоÑта"
msgid "DevOps Report"
msgstr "Звіт DevOps"
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10304,16 +10739,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10334,10 +10769,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10346,18 +10778,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10370,9 +10796,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10382,6 +10805,12 @@ 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 ""
@@ -10409,6 +10838,9 @@ 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|Score"
msgstr ""
@@ -10520,7 +10952,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10725,6 +11157,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10917,10 +11352,10 @@ msgstr ""
msgid "Email Notification"
msgstr "Ð¡Ð¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾ÑŽ поштою"
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10989,12 +11424,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr "Ñкинути його"
-
-msgid "EmailToken|resetting..."
-msgstr "ÑкиданнÑ..."
-
msgid "Emails"
msgstr "ÐдреÑи електронної пошти"
@@ -11115,6 +11544,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr "Увімкнути заголовок та футер в електронних лиÑтах"
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr "Увімкнути інтеграцію"
@@ -11280,20 +11712,14 @@ msgstr "Введіть кількіÑÑ‚ÑŒ задач"
msgid "Enter one or more user ID separated by commas"
msgstr "Введіть одного або декілька ID кориÑтувачів, відокремених комами."
-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."
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the issue description"
-msgstr "Введіть Ð¾Ð¿Ð¸Ñ Ð·Ð°Ð´Ð°Ñ‡Ñ–"
-
-msgid "Enter the issue title"
-msgstr "Введіть назву задачі"
-
-msgid "Enter the merge request description"
-msgstr "Введіть Ð¾Ð¿Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ на злиттÑ"
+msgid "Enter the %{name} title"
+msgstr ""
-msgid "Enter the merge request 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 name of your application, and we'll return a unique %{type}."
msgstr ""
@@ -11577,6 +12003,9 @@ msgstr "захищені"
msgid "Epic"
msgstr "Епік"
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr "Ðе вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ епік."
@@ -11601,6 +12030,12 @@ 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 "Додати новий епік"
@@ -11628,6 +12063,9 @@ msgstr "Як Ñ Ð¼Ð¾Ð¶Ñƒ це вирішити?"
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr "Видалити епік"
@@ -11655,6 +12093,9 @@ 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 "Помилка при отриманні епіків групи."
@@ -11679,9 +12120,6 @@ 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 "Щоб запланувати %{epicDateType} дату вашого епіку на оÑнові етапів, призначте етап з %{epicDateType} датою Ð´Ð»Ñ Ð±ÑƒÐ´ÑŒ-Ñкої задачі в цьому епіку."
-msgid "Epics|Unable to perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11856,6 +12294,9 @@ msgstr ""
msgid "Error uploading file"
msgstr "Помилка Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ"
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr "Помилка Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ: %{stripped}"
@@ -12021,6 +12462,9 @@ msgstr ""
msgid "Evidence collection"
msgstr "Збір даних"
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr "Потрібен лише один з %{attributes}"
@@ -12036,6 +12480,9 @@ msgstr "Ðаприклад: Usage = одиночний запит. (Requested) /
msgid "Except policy:"
msgstr "Політика виключеннÑ:"
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -12078,6 +12525,9 @@ msgstr "Розгорнути ÑпиÑок затверджуючих оÑіб"
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -12114,6 +12564,9 @@ msgstr "ЗакінчуєтьÑÑ"
msgid "Expires at"
msgstr "ДійÑний до"
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr "ЗакінчуєтьÑÑ %{expires_at}"
@@ -12147,6 +12600,9 @@ msgstr "ПереглÑнути публічні групи"
msgid "Export"
msgstr "ЕкÑпорт"
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr "ЕкÑпортувати Ñк CSV"
@@ -12270,12 +12726,12 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr "Ðе вдалоÑÑ Ñтворити запит на злиттÑ. Будь лаÑка, Ñпробуйте знову."
-msgid "Failed to create To-Do for the design."
-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 ""
@@ -12300,6 +12756,12 @@ msgstr "Ðе вдалоÑÑ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ð½ÑƒÑ‚Ð¸ до"
msgid "Failed to enqueue the rebase operation, possibly due to a long-lived transaction. Try again later."
msgstr "Ðе вдалоÑÑ Ð²ÐºÐ»ÑŽÑ‡Ð¸Ñ‚Ð¸ rebase в чергу, можливо через довгоживучу транзакцію. Спробуйте знову через деÑкий чаÑ."
+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 "Ðе вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ мітку Ð´Ð»Ñ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚Ñƒ ÑиÑтеми Jira."
@@ -12336,9 +12798,6 @@ msgstr "Помилка при завантаженні помилок із Sentr
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ групи та кориÑтувачів."
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12354,9 +12813,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ пов’Ñзані гілки"
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12390,12 +12846,12 @@ msgstr "Ðе вдалоÑÑ Ð·Ñ€Ð¾Ð±Ð¸Ñ‚Ð¸ Ñередовище захищени
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
-msgstr ""
-
msgid "Failed to remove a Zoom meeting"
msgstr "Ðе вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ Zoom-зуÑтріч"
+msgid "Failed to remove a to-do item for the design."
+msgstr ""
+
msgid "Failed to remove issue from board, please try again."
msgstr "Ðе вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ задачу з дошки, будь лаÑка, Ñпробуйте ще раз."
@@ -12438,7 +12894,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr "Ðе вдалоÑÑ Ð¿Ñ–Ð´Ð¿Ð¸Ñати з викориÑтаннÑм перевірки автентичноÑÑ‚Ñ– Ñмарт-карти"
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12456,9 +12912,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr "Ðе вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ задачі. Будь лаÑка, Ñпробуйте ще раз."
-msgid "Failed to update tag!"
-msgstr "Ðе вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ тег!"
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12501,6 +12954,9 @@ msgstr "Перемикачі функцій"
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr "Перемикач функцій не був видалений."
@@ -12997,6 +13453,15 @@ msgstr "Імпорт з FogBugz"
msgid "Folder/%{name}"
msgstr "Папка/%{name}"
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr "Колір шрифту"
@@ -13060,6 +13525,42 @@ msgstr "Форк проєкту"
msgid "Fork project?"
msgstr "Створити форк проєкту?"
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr "Форк від"
@@ -13090,8 +13591,8 @@ msgstr ""
msgid "Free Trial"
msgstr "Безкоштовний випробувальний період"
-msgid "Free Trial of GitLab.com Gold"
-msgstr "Безкоштовна пробна верÑÑ–Ñ GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
+msgstr ""
msgid "Freeze end"
msgstr ""
@@ -13168,9 +13669,6 @@ msgstr "Geo"
msgid "Geo Nodes"
msgstr "Гео-Вузли"
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr "Ðеможливо видалити оÑновний вузол, Ñкщо Ñ” вторинний"
@@ -13183,6 +13681,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr "%{timeAgoStr} (%{pendingEvents} подій)"
@@ -13330,6 +13831,9 @@ msgstr "%{name} заплановано Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾Ñ— ÑинхронÑ
msgid "Geo|%{name} is scheduled for re-verify"
msgstr "%{name} заплановано Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾Ñ— перевірки"
+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 ""
@@ -13369,6 +13873,9 @@ msgstr "Ðе вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ Ð·Ð°Ð¿Ð¸Ñ Ð²Ñ–Ð´ÑÑ‚ÐµÐ¶ÐµÐ½Ð½Ñ Ð
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr "Ðе вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ Ð·Ð°Ð¿Ð¸Ñ Ð²Ñ–Ð´ÑÑ‚ÐµÐ¶ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñ–Ñнуючого завантаженнÑ."
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr "Ðевдало"
@@ -13378,6 +13885,9 @@ msgstr "Фільтр за ÑтатуÑом"
msgid "Geo|Geo Status"
msgstr "Geo ÑтатуÑ"
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13402,6 +13912,12 @@ msgstr "ОÑÑ‚Ð°Ð½Ð½Ñ Ñпроба Ñинхронізації"
msgid "Geo|Last time verified"
msgstr "ОÑтанній Ñ‡Ð°Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸"
+msgid "Geo|Learn more about Geo"
+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 "Ðіколи"
@@ -13429,6 +13945,9 @@ msgstr "Будь лаÑка, переглÑньте документацію з
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr "Проект"
@@ -13474,6 +13993,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr "СтатуÑ"
@@ -13525,6 +14047,9 @@ msgstr "Перевірка невдала: %{error}"
msgid "Geo|Waiting for scheduler"
msgstr "ÐžÑ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð»Ð°Ð½ÑƒÐ²Ð°Ð»ÑŒÐ½Ð¸ÐºÐ°"
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13549,9 +14074,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr "Розпочати роботу з відÑтеженнÑм помилок"
@@ -13564,6 +14086,9 @@ msgstr "Розпочати!"
msgid "Getting started with releases"
msgstr "Розпочати роботу з релізами"
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr "Git LFS не увімкнено на цьому Ñервері GitLab, звернітьÑÑ Ð´Ð¾ адмініÑтратора."
@@ -13600,6 +14125,9 @@ msgstr ""
msgid "GitHub import"
msgstr "GitHub-імпорт"
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr "GitLab"
@@ -13861,9 +14389,6 @@ msgstr ""
msgid "Go full screen"
msgstr "Ðа повний екран"
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -14014,6 +14539,9 @@ msgstr ""
msgid "Grant access"
msgstr "Ðадати доÑтуп"
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr "Граф"
@@ -14062,6 +14590,9 @@ msgstr "SAML Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¸ повинна бути включена Ð´Ð»Ñ Ñ
msgid "Group URL"
msgstr "URL-адреÑа групи"
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr "Ðватар групи"
@@ -14395,6 +14926,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14671,6 +15211,12 @@ msgstr "Пошук за іменем"
msgid "Guideline"
msgstr "Керівництво"
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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}"
@@ -14752,15 +15298,15 @@ msgstr "Допомагає зменшити об’єм попереджень (
msgid "Helps reduce request volume for protected paths"
msgstr "Допомагає зменшити об’єм запитів Ð´Ð»Ñ Ð·Ð°Ñ…Ð¸Ñ‰ÐµÐ½Ð¸Ñ… шлÑхів"
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr "Тут ви знайдете нещодавню активніÑÑ‚ÑŒ в запитах на злиттÑ"
msgid "Hi %{username}!"
msgstr "Привіт %{username}!"
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr "Сховати архівовані проєкти"
@@ -14868,6 +15414,9 @@ msgstr "ОчищеннÑ, екÑпорт, шлÑÑ…, перенеÑеннÑ, ви
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -15122,6 +15671,9 @@ msgstr "Імпортувати з"
msgid "Import from Jira"
msgstr "Імпортувати з Jira"
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15483,7 +16035,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15909,9 +16461,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr "Ð’Ñтановіть програмний автентифікатор, наприклад %{free_otp_link} або Google Authenticator зі Ñвого репозиторію заÑтоÑунків Ñ– викориÑтовуйте його Ð´Ð»Ñ ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ QR-коду. Більш детальна Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð´Ð¾Ñтупна в %{help_link_start}документації%{help_link_end}."
-
msgid "Install on clusters"
msgstr "Ð’Ñтановити на клаÑтери"
@@ -15949,96 +16498,6 @@ msgstr "Група Ð´Ð»Ñ Ð°Ð´Ð¼Ñ–Ð½Ñ–Ñтраторів інÑтанÑу вже
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr "Конвеєри"
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr "Проєкти"
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr "ІнтеграціÑ"
@@ -16057,12 +16516,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr "Ð’ÑÑ– деталі"
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -16114,6 +16579,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -16147,6 +16618,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16315,6 +16789,9 @@ msgstr "ЗапроÑити \"%{trimmed}\" за електронною пошто
msgid "Invite Members"
msgstr "ЗапроÑити учаÑників"
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr "ЗапроÑити групу"
@@ -16324,9 +16801,6 @@ msgstr "ЗапроÑити учаÑника"
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16336,9 +16810,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16378,19 +16885,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16399,18 +16927,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16420,6 +16963,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16642,6 +17191,9 @@ msgstr "Задачі закриті"
msgid "Issues with comments, merge requests with diffs and comments, labels, milestones, snippets, and other project entities"
msgstr "Задачі з коментарÑми, запити на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð· порівнÑннÑми (diff) та коментарÑми, мітки, етапи, Ñніпети та інші об'єкти в проєкті"
+msgid "Issues with label %{label}"
+msgstr ""
+
msgid "Issues with no epic assigned"
msgstr ""
@@ -16717,10 +17269,7 @@ msgstr "Ітерацію оновлено"
msgid "Iterations"
msgstr "Ітерації"
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16768,6 +17317,9 @@ msgstr "Проєкт Jira: %{importProject}"
msgid "Jira service not configured."
msgstr "Ð¡ÐµÑ€Ð²Ñ–Ñ Jira не налаштовано."
+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 ""
@@ -16783,7 +17335,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr "%{user_link} вказав цю задачу в %{entity_link} з %{project_link}%{branch}:{quote}%{entity_message}{quote}"
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16843,6 +17395,9 @@ msgstr "Ключ проєкту Jira"
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr "Відкрити Jira"
@@ -16867,6 +17422,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr "ВикориÑтовуйте пароль Ð´Ð»Ñ Ñерверної верÑÑ–Ñ— та API токен Ð´Ð»Ñ Ñ…Ð¼Ð°Ñ€Ð½Ð¾Ñ— верÑÑ–Ñ—"
@@ -17068,6 +17626,9 @@ 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 ""
@@ -17137,9 +17698,6 @@ msgstr "Ð Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Kubernetes не знайдено"
msgid "Kubernetes error: %{error_code}"
msgstr "Помилка Kubernetes: %{error_code}"
-msgid "Kubernetes popover"
-msgstr "Підказка Kubernetes"
-
msgid "LDAP"
msgstr "LDAP"
@@ -17218,6 +17776,9 @@ 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 ""
@@ -17240,6 +17801,9 @@ msgstr[1] "ОÑтанніх %d дні"
msgstr[2] "ОÑтанніх %d днів"
msgstr[3] "ОÑтанніх %d днів"
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr "ОÑтанні 2 тижні"
@@ -17285,6 +17849,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr "Прізвище"
@@ -17333,6 +17900,9 @@ msgstr "ОÑтаннє викориÑтаннÑ:"
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr "автор"
@@ -17366,6 +17936,9 @@ msgstr "ДізнатиÑÑ Ð¿Ñ€Ð¾ GitLab"
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr "ДізнайтеÑÑ Ñк %{link_start}зробити внеÑок до вбудованих шаблонів%{link_end}"
@@ -17417,9 +17990,6 @@ msgstr "Докладніше про шаблони проєктів на рівÐ
msgid "Learn more about signing commits"
msgstr "Докладніше про підпиÑÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ñ–Ñ‚Ñ–Ð²"
-msgid "Learn more about the dependency list"
-msgstr "Докладніше про ÑпиÑок залежноÑтей"
-
msgid "Learn more in the"
msgstr "ДізнайтеÑÑŒ більше"
@@ -17429,6 +17999,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr "Вийти"
@@ -17630,9 +18290,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr "Помилка під Ñ‡Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ ÑпиÑку ліцензій. Будь лаÑка, перевірте Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ мережі та Ñпробуйте ще раз."
-msgid "Licenses|Learn more about license compliance"
-msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про відповідніÑÑ‚ÑŒ ліцензій"
-
msgid "Licenses|License Compliance"
msgstr "ВідповідніÑÑ‚ÑŒ Ліцензії"
@@ -17745,6 +18402,9 @@ msgstr "СпиÑок доÑтупних репозиторіїв"
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17784,7 +18444,7 @@ msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ð¹ перевищило ліміт
msgid "Loading issues"
msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð°Ð´Ð°Ñ‡"
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -18144,6 +18804,9 @@ msgstr "МакÑимальний рівень доÑтупу"
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -18156,9 +18819,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -18216,6 +18876,9 @@ msgstr "МакÑимальний Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ має
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18486,6 +19149,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr "Ð—Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñ–Ð² на злиттÑ"
@@ -18567,9 +19233,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr "Додати відповідь"
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18579,9 +19242,6 @@ msgstr "Виникла помилка під Ñ‡Ð°Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ñ‡ÐµÑ€Ð
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr "ÐевдалоÑÑ Ð¾Ð±â€™Ñ”Ð´Ð½Ð°Ñ‚Ð¸ коміти. Це повинно бути виконано вручну."
-msgid "MergeRequests|Reply..."
-msgstr "ВідповіÑти..."
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr "Вирішити це Ð¾Ð±Ð³Ð¾Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð² новій задачі"
@@ -18630,6 +19290,9 @@ msgstr "розпочато Ð¾Ð±Ð³Ð¾Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð·Ð°Ñтарілої змінÐ
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr "розпочато Ð¾Ð±Ð³Ð¾Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ¾Ð¼Ñ–Ñ‚Ñƒ %{linkStart}%{commitDisplay}%{linkEnd}"
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19343,6 +20006,9 @@ msgstr "Докладніше."
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr "Ð Ñ–Ð·Ð½Ð¸Ñ†Ñ Ñ–Ð· %{default_branch} Ñкладає більше %{number_commits_distance} комітів"
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr "Ðайбільше в обраних"
@@ -19352,6 +20018,9 @@ msgstr "Точку Ð¼Ð¾Ð½Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ %{mounted_as} не знайдено в %
msgid "Move"
msgstr "ПереміÑтити"
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr "ПереміÑтити задачу"
@@ -19370,6 +20039,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr "ПереміÑтити цю задачу до іншого проєкту."
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr "Ðеможливо переміÑтити задачу через недоÑтатній набір дозволів!"
@@ -19582,6 +20254,12 @@ 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 ""
@@ -19600,12 +20278,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19841,6 +20513,9 @@ msgstr ""
msgid "New User"
msgstr "Ðовий КориÑтувач"
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr "Ðова гілка"
@@ -19862,6 +20537,9 @@ msgstr "Ðовий ключ Ð´Ð»Ñ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ"
msgid "New directory"
msgstr "Ðовий каталог"
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr "Ðове Ñередовище"
@@ -19904,6 +20582,9 @@ msgstr "Створено нову ітерацію"
msgid "New label"
msgstr "Ðова мітка"
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr "Ðовий запит на злиттÑ"
@@ -20009,6 +20690,9 @@ msgstr "Ðе знайднено активноÑтей"
msgid "No application_settings found"
msgstr "Ðе знайдено application_settings"
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr "Методи автентифікації не налаштовано."
@@ -20030,9 +20714,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr "Ðеможливо з'єднатиÑÑŒ із Ñервером Gitaly, будь лаÑка, перевірте логи!"
@@ -20060,6 +20750,9 @@ 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 "ВідÑÑƒÑ‚Ð½Ñ Ñ‚Ð¾Ñ‡ÐºÐ° підключеннÑ"
@@ -20096,6 +20789,9 @@ msgstr "Проблем не знайдено"
msgid "No iteration"
msgstr "Ðемає ітерації"
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr "Ðемає ітерацій Ð´Ð»Ñ Ð¿Ð¾ÐºÐ°Ð·Ñƒ"
@@ -20324,13 +21020,19 @@ msgstr "Примітка: звернітьÑÑ Ð´Ð¾ вашого адмініÑÑ
msgid "NoteForm|Note"
msgstr "Примітка"
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr "Ви впевнені, що хочете ÑкаÑувати цей коментар?"
msgid "Notes|Collapse replies"
msgstr "Згорнути відповіді"
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20345,6 +21047,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 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 ""
@@ -20360,9 +21065,6 @@ msgstr "Ðічого Ñинхронізувати"
msgid "Notification events"
msgstr "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ події"
-msgid "Notification setting"
-msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñповіщень"
-
msgid "Notification setting - %{notification_title}"
msgstr "Параметр ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ - %{notification_title}"
@@ -20390,6 +21092,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr "Запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð¾"
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20444,9 +21149,6 @@ msgstr "Берете учаÑÑ‚ÑŒ"
msgid "NotificationLevel|Watch"
msgstr "ВідÑтежувати"
-msgid "NotificationSetting|Custom"
-msgstr "ВлаÑний"
-
msgid "Notifications"
msgstr "СповіщеннÑ"
@@ -20558,6 +21260,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20579,6 +21287,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20612,9 +21323,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20793,8 +21510,8 @@ 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 "Термін дії одного або декількох ваших токенів оÑобиÑтого доÑтупу закінчитьÑÑ Ñ‡ÐµÑ€ÐµÐ· %{days_to_expire} днів або раніше."
+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 ""
@@ -20826,7 +21543,7 @@ msgstr "Тільки учаÑники проєкту можуть залишат
msgid "Only project members will be imported. Group members will be skipped."
msgstr "Лише учаÑника проєкту будуть імпортовані. УчаÑники групи будуть пропущені."
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20841,6 +21558,12 @@ msgstr "Ой, а ви впевнені?"
msgid "Open"
msgstr "Відкриті"
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr "Відкрити виділеннÑ"
@@ -20853,12 +21576,12 @@ msgstr ""
msgid "Open errors"
msgstr "Відкрити помилки"
-msgid "Open in Xcode"
-msgstr "Відкрити в Xcode"
-
msgid "Open in file view"
msgstr "Відкрити файл Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду"
+msgid "Open in your IDE"
+msgstr ""
+
msgid "Open issues"
msgstr "Відкриті задачі"
@@ -20925,6 +21648,9 @@ 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 "Ðеобов'Ñзково"
@@ -20979,9 +21705,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -21036,6 +21759,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -21048,6 +21780,9 @@ msgstr "Додати джерело NuGet"
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -21171,9 +21906,6 @@ msgstr "Команда Maven"
msgid "PackageRegistry|Maven XML"
msgstr "Maven XML"
-msgid "PackageRegistry|NPM"
-msgstr "NPM"
-
msgid "PackageRegistry|NuGet"
msgstr "NuGet"
@@ -21192,6 +21924,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr "Команда pip"
@@ -21210,6 +21945,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr "Видалити пакет"
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -21249,6 +21990,9 @@ 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|npm command"
msgstr ""
@@ -21270,15 +22014,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr "Maven"
-msgid "PackageType|NPM"
-msgstr "NPM"
-
msgid "PackageType|NuGet"
msgstr "NuGet"
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr "Пакети"
@@ -21351,6 +22095,15 @@ msgstr "Параметр"
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr "Параметр \"job_id\" не може перевищувати довжину %{job_id_max_size}"
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr "Джерело"
@@ -21408,11 +22161,11 @@ msgstr ""
msgid "Past due"
msgstr "ПроÑтрочені"
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
-msgstr "Ð’Ñтавте Ñюди відкритий ключ машини. ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про те, Ñк його згенерувати %{link_start}тут%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
+msgstr ""
msgid "Paste confidential epic link"
msgstr ""
@@ -21507,6 +22260,9 @@ msgstr "Виклики Rugged"
msgid "PerformanceBar|SQL queries"
msgstr "Запити SQL"
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr "лог"
@@ -21558,9 +22314,6 @@ msgstr "Розклад Конвеєра"
msgid "Pipeline Schedules"
msgstr "Розклади Конвеєрів"
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr "Квота хвилин Ð´Ð»Ñ ÐºÐ¾Ð½Ð²ÐµÑ”Ñ€Ñ–Ð²"
@@ -21582,10 +22335,10 @@ msgstr "Тригери конвеєру"
msgid "Pipeline: %{status}"
msgstr "Конвеєр: %{status}"
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21660,15 +22413,6 @@ msgstr "СтатиÑтика конвеєрів"
msgid "Pipelines emails"
msgstr "Електронні лиÑти конвеєрів"
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr "Конвеєри за оÑтанній міÑÑць (%{oneMonthAgo} - %{today})"
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr "Конвеєри за оÑтанній тиждень (%{oneWeekAgo} - %{today})"
-
-msgid "Pipelines for last year"
-msgstr "Конвеєри за оÑтанній рік"
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr "Конвеєри Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñ–Ð² на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð½Ð°Ð»Ð°ÑˆÑ‚Ð¾Ð²Ð°Ð½Ð¾. Відділений конвеєр виконуєтьÑÑ Ð² контекÑÑ‚Ñ– запиту на злиттÑ, але не в контекÑÑ‚Ñ– результату злиттÑ. ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ в документації про конвеєери Ð´Ð»Ñ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ñ–Ð² злиттÑ."
@@ -21696,12 +22440,12 @@ msgstr "Дочірній конвеєр"
msgid "Pipelines|Clear Runner Caches"
msgstr "ОчиÑтити кеш Runner'ів"
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
-msgstr "Безперервна Ñ–Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ Ð´Ð¾Ð¿Ð¾Ð¼Ð°Ð³Ð°Ñ” знаходити помилки шлÑхом автоматичного запуÑку теÑтів, а безперервне Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ â€” вÑтановлювати код на цільове Ñередовище."
-
msgid "Pipelines|Copy trigger token"
msgstr "Скопіювати токен тригера"
+msgid "Pipelines|Could not load merged YAML content"
+msgstr ""
+
msgid "Pipelines|Description"
msgstr "ОпиÑ"
@@ -21714,9 +22458,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21741,6 +22482,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ð²ÐµÑ”Ñ€Ñ–Ð²"
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr "Більше інформації"
@@ -21777,9 +22521,6 @@ msgstr "Ð’ даний Ñ‡Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” завершених конвеєрів.
msgid "Pipelines|There are currently no pipelines."
msgstr "Ð’ даний Ñ‡Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” конвеєрів."
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr "Помилка при отриманні конвеєрів. Спробуйте знову через декілька хвилин, або звернітьÑÑ Ð´Ð¾ Ñлужби підтримки."
@@ -21813,6 +22554,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21825,12 +22569,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21870,6 +22623,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr "Конвеєр ланцюжка змін"
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr "Конвеєр результату злиттÑ"
@@ -21882,6 +22638,12 @@ 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 "Конвеєр"
@@ -21939,6 +22701,9 @@ msgstr "ЗначеннÑ"
msgid "Pipeline|Variables"
msgstr "Змінні"
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr "Зараз ви зупинете конвеєр %{pipelineId}."
@@ -22008,6 +22773,9 @@ 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 "Будь лаÑка, перевірте Ñвою поштову Ñкриньку (%{email}) Ð´Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ñ‚Ð¾Ð³Ð¾, що ви нею володієте, щоб розкрити потенціал CI/CD. Ðе отримали? %{resend_link}. Ðеправильна адреÑа? %{update_link}."
+msgid "Please check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -22131,12 +22899,18 @@ 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 set a new password before proceeding."
msgstr "Будь лаÑка, вÑтановіть пароль перед продовженнÑм."
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr "Будь лаÑка, пройдіть reCAPTCHA"
@@ -22197,21 +22971,39 @@ msgstr "Вибрати вміÑÑ‚ оглÑдової Ñторінки проєк
msgid "Preferences|Choose what content you want to see on your homepage."
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 "Ð’Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ñ‡Ð°Ñу у 24-годинному форматі"
+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 mins ago."
msgstr "Ðаприклад: 30 хвилин тому."
+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 "Ширина макета"
@@ -22233,6 +23025,12 @@ 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 "Тема Ð´Ð»Ñ Ð¿Ñ–Ð´Ñвітки ÑинтакÑиÑу"
@@ -22341,6 +23139,9 @@ 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 ""
@@ -22425,24 +23226,6 @@ msgstr "Профіль"
msgid "Profile Settings"
msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ñ„Ñ–Ð»ÑŽ"
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr "о"
@@ -22479,6 +23262,9 @@ msgstr "Додати ключ"
msgid "Profiles|Add status emoji"
msgstr "Додати Ñмайлик-ÑтатуÑ"
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr "Обрізка аватарів"
@@ -22836,6 +23622,9 @@ msgstr "Файли проєкту"
msgid "Project ID"
msgstr "Ідентифікатор проєкту"
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr "URL-адреÑа проєкту"
@@ -23064,12 +23853,9 @@ msgstr "Дозволити"
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
-msgid "ProjectSettings|Allow users to request access"
-msgstr "Дозволити кориÑтувачам відправлÑти запити на доÑтуп"
-
msgid "ProjectSettings|Analytics"
msgstr ""
@@ -23079,8 +23865,8 @@ msgstr "Ðвтоматично завершувати Ð¾Ð±Ð³Ð¾Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð²
msgid "ProjectSettings|Badges"
msgstr "Значки"
-msgid "ProjectSettings|Build, test, and deploy your changes"
-msgstr "Збирайте, теÑтуйте та розгортайте Ñвої зміни"
+msgid "ProjectSettings|Build, test, and deploy your changes."
+msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
msgstr ""
@@ -23094,6 +23880,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr "ЗвернітьÑÑ Ð´Ð¾ адмініÑтратора, щоб змінити це налаштуваннÑ."
@@ -23121,17 +23913,14 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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 "Кожен проєкт може мати влаÑний проÑÑ‚Ñ–Ñ€ Ð´Ð»Ñ Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ñвоїх образів 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."
+msgstr ""
msgid "ProjectSettings|Everyone"
msgstr "Ð’ÑÑ–"
@@ -23169,14 +23958,14 @@ msgstr "Внутрішні"
msgid "ProjectSettings|Issues"
msgstr "Задачі"
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
-msgstr "Легка ÑиÑтема відÑÑ‚ÐµÐ¶ÐµÐ½Ð½Ñ Ð·Ð°Ð´Ð°Ñ‡ Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проєкту"
+msgid "ProjectSettings|Lightweight issue tracking system."
+msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
-msgstr "Оперує великими файлами такими Ñк аудіо, відео та графіка"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
+msgstr ""
msgid "ProjectSettings|Merge checks"
msgstr "Перевірки злиттÑ"
@@ -23211,14 +24000,17 @@ msgstr "Тільки підпиÑані коміти можуть бути наÐ
msgid "ProjectSettings|Operations"
msgstr ""
+msgid "ProjectSettings|Override user notification preferences for all project members."
+msgstr ""
+
msgid "ProjectSettings|Packages"
msgstr "Пакети"
msgid "ProjectSettings|Pages"
msgstr "Pages"
-msgid "ProjectSettings|Pages for project documentation"
-msgstr "Pages Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ð½Ð¾Ñ— документації"
+msgid "ProjectSettings|Pages for project documentation."
+msgstr ""
msgid "ProjectSettings|Pipelines"
msgstr "Конвеєри"
@@ -23244,17 +24036,26 @@ msgstr "Репозиторій"
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
-msgstr "ДілітьÑÑ Ñ„Ñ€Ð°Ð³Ð¼ÐµÐ½Ñ‚Ð°Ð¼Ð¸ коду з іншими за межами репозиторію Git"
+msgid "ProjectSettings|Share code with others outside the project."
+msgstr ""
msgid "ProjectSettings|Show default award emojis"
msgstr ""
@@ -23277,8 +24078,8 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
-msgstr "Відправити зміни Ð´Ð»Ñ Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð² батьківÑькі репозиторії"
+msgid "ProjectSettings|Submit changes to be merged upstream."
+msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
msgstr ""
@@ -23301,30 +24102,36 @@ msgstr "Цей параметр заÑтоÑовуєтьÑÑ Ð½Ð° рівні ÑÐ
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr "Цей параметр буде заÑтоÑовано до вÑÑ–Ñ… проєктів, Ñкщо адмініÑтратор не змінить його."
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr "Це Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚ÑŒ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñповіщень Ð´Ð»Ñ Ð²ÑÑ–Ñ… учаÑників проєкту."
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr "Це буде регулювати Ñ–Ñторію комітів при зливанні запитів на злиттÑ"
msgid "ProjectSettings|Transfer project"
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|View and edit files in this project"
-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 will only have read access"
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|View project analytics"
+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|What are badges?"
msgstr ""
@@ -23334,19 +24141,10 @@ msgstr ""
msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr "Коли з’ÑвлÑÑŽÑ‚ÑŒÑÑ ÐºÐ¾Ð½Ñ„Ð»Ñ–ÐºÑ‚Ð¸, кориÑтувачу даєтьÑÑ Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ñ–ÑÑ‚ÑŒ виконати rebase"
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
-msgstr ""
-
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
-msgstr ""
-
msgid "ProjectSettings|Wiki"
msgstr "Вікі"
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
-msgstr "За допомогою GitLab Pages ви можете розміщувати Ñвої Ñтатичні веб-Ñайти в GitLab"
-
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23625,10 +24423,10 @@ msgstr "Ðктивний"
msgid "PrometheusService|Auto configuration"
msgstr "Ðвтоматична конфігураціÑ"
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
-msgstr "Ðвтоматично розгортайте та налаштовуйте Prometheus на ваші клаÑтери Ð´Ð»Ñ Ð¼Ð¾Ð½Ñ–Ñ‚Ð¾Ñ€Ð¸Ð½Ð³Ñƒ Ñередовищ проєкту"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
+msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23637,9 +24435,6 @@ msgstr "Загальні метрики"
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr "Загальні метрики автоматично збираютьÑÑ Ð½Ð° оÑнові набору метрик від популÑрних екÑпортерів."
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr "ВлаÑні метрики"
@@ -23655,6 +24450,15 @@ msgstr "Пошук та Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼ÐµÑ‚Ñ€Ð¸Ðº..."
msgid "PrometheusService|Finding custom metrics..."
msgstr "Пошук влаÑних метрик..."
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr "Ð’Ñтановити Prometheus на клаÑтери"
@@ -23670,6 +24474,12 @@ msgstr "Метрики"
msgid "PrometheusService|Missing environment variable"
msgstr "Пропущена змінна Ñередовища"
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr "Додаткова інформаціÑ"
@@ -23682,23 +24492,23 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr "Жодної влаÑної метрики не було Ñтворено. Створюйте Ñ—Ñ… за допомогою наÑтупної кнопки"
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
-msgstr "Базова адреÑа Prometheus API, наприклад http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgstr ""
+
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
-msgstr "Prometheus автоматично налаштований на ваших клаÑтерах"
+msgid "PrometheusService|The Prometheus API base URL."
+msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+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|Time-series monitoring service"
-msgstr "Ð¡ÐµÑ€Ð²Ñ–Ñ Ð¼Ð¾Ð½Ñ–Ñ‚Ð¾Ñ€Ð¸Ð½Ð³Ñƒ чаÑових Ñ€Ñдів"
-
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
-msgstr "Ð”Ð»Ñ Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾ÑÑ‚Ñ– вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Prometheus на ваші клаÑтери, деактивуйте ручні Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð¸Ð¶Ñ‡Ðµ"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
msgstr "ÐžÑ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÑˆÐ¾Ð³Ð¾ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ñƒ Ñеридовищі Ð´Ð»Ñ Ð·Ð±Ð¾Ñ€Ñƒ загальних метрик"
@@ -23706,6 +24516,12 @@ msgstr "ÐžÑ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÑˆÐ¾Ð³Ð¾ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ñƒ Ñерид
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr "ПеренеÑти"
@@ -23796,9 +24612,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr "Перейти на вищий тарифний план"
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23841,9 +24654,6 @@ msgstr "Захищені гілки"
msgid "Protected Environment"
msgstr "Захищене Ñередовище"
-msgid "Protected Environments"
-msgstr "Захищені Ñередовища"
-
msgid "Protected Paths"
msgstr "Захищені шлÑхи"
@@ -23856,6 +24666,9 @@ msgstr "Захищені теги"
msgid "Protected branches"
msgstr "Захищені гілки"
+msgid "Protected environments"
+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 ""
@@ -23949,8 +24762,8 @@ msgstr "Ваше Ñередовище було захищено."
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr "ЗахиÑÑ‚ із вашого Ñередовища було знÑто"
-msgid "Protip:"
-msgstr "Підказка:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgstr ""
msgid "Protocol"
msgstr "Протокол"
@@ -24045,8 +24858,50 @@ msgstr ""
msgid "Push to create a project"
msgstr "ÐатиÑніть, щоб Ñтворити проєкт"
-msgid "PushRule|Committer restriction"
-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 "Відправлено"
@@ -24138,6 +24993,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr "Ðеобхідна повторна автентифікаціÑ"
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr "Інтервал повторної перевірки"
@@ -24174,6 +25032,9 @@ msgstr "Отримувати Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð¶ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ налаштоваÐ
msgid "Receive notifications about your own activity"
msgstr "Отримувати ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ влаÑну активніÑÑ‚ÑŒ"
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr "ОÑтанні"
@@ -24350,6 +25211,9 @@ msgstr "ÐžÐ¿Ð¸Ñ Ñ€ÐµÐ»Ñ–Ð·Ñƒ:"
msgid "Release title"
msgstr "Ðазва релізу"
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr "Образ"
@@ -24455,6 +25319,9 @@ msgstr ""
msgid "Remove due date"
msgstr "Видалити заплановану дату завершеннÑ"
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr "Видалити зв’Ñзок форку"
@@ -24521,6 +25388,9 @@ msgstr "Видалити Ñтадію"
msgid "Remove time estimate"
msgstr "Видалити запланований чаÑ"
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24689,8 +25559,8 @@ msgstr "ВідповіÑти на коментар"
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr "ВідповіÑти на це електронне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð±ÐµÐ·Ð¿Ð¾Ñередньо або %{view_it_on_gitlab}."
-msgid "Reply..."
-msgstr "ВідповіÑти..."
+msgid "Reply…"
+msgstr ""
msgid "Repo by URL"
msgstr "Репозиторії по URL"
@@ -24745,12 +25615,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr "Дії"
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr "КлаÑ"
@@ -24828,6 +25701,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24855,6 +25734,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24951,6 +25836,9 @@ msgstr "Запит доÑтупу"
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr "Параметр запиту %{param} відÑутній."
@@ -24969,6 +25857,9 @@ msgstr "Відправлено запит %{time_ago}"
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -25085,9 +25976,6 @@ msgstr "Скинути шаблон"
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr "Ð¡ÐºÐ¸Ð´Ð°Ð½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð° авторизації Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проєкту вимагатиме Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð° авторизації в кожному із джерел попереджень, в Ñкому він увімкнений."
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr "Ð¡ÐºÐ¸Ð´Ð°Ð½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð° авторизації призведе до ÑкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð½ÑŒÐ¾Ð³Ð¾ ключа. ІÑнуючі конфігурації попереджень потрібно буде оновити новим ключем."
@@ -25178,6 +26066,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25558,7 +26449,7 @@ msgstr ""
msgid "Save Changes"
msgstr "Зберегти зміни"
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25630,6 +26521,9 @@ msgstr ""
msgid "Scopes"
msgstr "ОблаÑÑ‚ÑŒ дії"
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25717,6 +26611,9 @@ msgstr "Шукати цей текÑÑ‚"
msgid "Search forks"
msgstr "Пошук форків"
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr "Пошук у запитах на злиттÑ"
@@ -25911,7 +26808,7 @@ msgstr "Секрет"
msgid "Secret Detection"
msgstr "ВиÑÐ²Ð»ÐµÐ½Ð½Ñ Ñекретів"
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25956,12 +26853,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25974,9 +26877,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -26001,6 +26901,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -26037,6 +26940,12 @@ msgstr "Додати проєкти"
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr "Коментар додано до \"%{vulnerabilityName}\""
@@ -26046,12 +26955,12 @@ msgstr "Коментар видалино в \"%{vulnerabilityName}\""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr "Коментар відредаговано в \"%{vulnerabilityName}\""
+msgid "SecurityReports|Create Jira issue"
+msgstr ""
+
msgid "SecurityReports|Create issue"
msgstr "Створити задачу"
-msgid "SecurityReports|Dismiss Selected"
-msgstr "Ð’Ñ–Ð´Ñ…Ð¸Ð»ÐµÐ½Ð½Ñ Ð²Ð¸Ð´Ñ–Ð»ÐµÐ½Ð¾"
-
msgid "SecurityReports|Dismiss vulnerability"
msgstr "Відхилити вразливіÑÑ‚ÑŒ"
@@ -26070,6 +26979,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -26085,9 +26997,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -26115,6 +27024,12 @@ msgstr "Детальніше"
msgid "SecurityReports|More information"
msgstr "Детальніше"
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -26157,21 +27072,21 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
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|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
-msgstr ""
-
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
msgstr ""
@@ -26193,13 +27108,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr "Помилка при відхиленні вразливоÑтей."
@@ -26242,7 +27150,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -26251,7 +27159,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26338,9 +27246,6 @@ msgstr "Виберіть виконавцÑ"
msgid "Select branch"
msgstr "Виберіть гілку"
-msgid "Select branch/tag"
-msgstr "Виберіть гілку або тег"
-
msgid "Select due date"
msgstr ""
@@ -26389,7 +27294,7 @@ msgstr "Вибрати проєкт Ð´Ð»Ñ Ð²Ð¸Ð±Ð¾Ñ€Ñƒ зони"
msgid "Select projects"
msgstr "Вибрати проєкти"
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26431,12 +27336,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26479,8 +27390,8 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
-msgstr "ВідіÑлати окреме ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ð¾ електронній пошті Розробникам."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
+msgstr ""
msgid "Send confirmation email"
msgstr "ВідіÑлати Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾ÑŽ поштою"
@@ -26656,6 +27567,9 @@ msgstr "Ð’Ñтановіть пароль Ð´Ð»Ñ Ñвого облікового
msgid "Set a template repository for projects in this group"
msgstr "Вибрати шаблон репозиторію Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñ–Ð² у цій групі"
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26848,6 +27762,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -27005,7 +27922,7 @@ msgstr[1] "Показано %d події"
msgstr[2] "Показано %d подій"
msgstr[3] "Показано %d подій"
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -27297,9 +28214,6 @@ msgstr "ЩоÑÑŒ пішло не так на нашій Ñтороні. Будь
msgid "Something went wrong on our end. Please try again."
msgstr "ЩоÑÑŒ пішло не так на нашій Ñтороні. Будь-лаÑка, Ñпробуйте ще раз."
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr "Помилка при зміні конфіденційноÑÑ‚Ñ– цієї задачі"
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr "ЩоÑÑŒ пішло не так, при Ñпробі зміни Ñтану Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ %{issuableDisplayName}"
@@ -27426,6 +28340,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr "Помилка при завершенні обговореннÑ. Будь лаÑка, Ñпробуйте пізніше."
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr "Проблема при зупинці Ñередовища. Будь лаÑка, Ñпробуйте знову."
@@ -27609,9 +28526,6 @@ msgstr "Ðещодавно зареєÑтровані"
msgid "SortOptions|Recently starred"
msgstr "Ðещодавно в обраних"
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr "Розмір"
@@ -27801,12 +28715,15 @@ msgstr "Почати %{new_merge_request} з цими змінами"
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
-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 "Розпочати перевірку"
@@ -28311,68 +29228,68 @@ msgstr "Пропонована зміна"
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
-msgstr "ЯÑкраво-зелений"
+msgid "SuggestedColors|Aztec Gold"
+msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
-msgstr "Темно-Ñірувато-блакитний"
+msgid "SuggestedColors|Blue"
+msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
-msgstr "Темно-ÑинÑ"
+msgid "SuggestedColors|Blue-gray"
+msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
-msgstr "Темний помірно-оранжевий"
+msgid "SuggestedColors|Carrot orange"
+msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
-msgstr "Темний помірно-рожевий"
+msgid "SuggestedColors|Champagne"
+msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
-msgstr "Темний помірно-фіолетовий"
+msgid "SuggestedColors|Charcoal grey"
+msgstr ""
-msgid "SuggestedColors|Feijoa"
-msgstr "Фейхоа"
+msgid "SuggestedColors|Crimson"
+msgstr ""
-msgid "SuggestedColors|Lime green"
-msgstr "Зелений лайм"
+msgid "SuggestedColors|Dark coral"
+msgstr ""
-msgid "SuggestedColors|Moderate blue"
-msgstr "Помірно-Ñиній"
+msgid "SuggestedColors|Dark green"
+msgstr ""
-msgid "SuggestedColors|Pure red"
-msgstr "ЧиÑтий червоний"
+msgid "SuggestedColors|Dark sea green"
+msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
-msgstr "Злегка ненаÑичений Ñиній"
+msgid "SuggestedColors|Dark violet"
+msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
-msgstr "Злегка ненаÑичений зелений"
+msgid "SuggestedColors|Deep violet"
+msgstr ""
-msgid "SuggestedColors|Soft orange"
-msgstr "Ðœ'Ñкий помаранчевий"
+msgid "SuggestedColors|Gray"
+msgstr ""
-msgid "SuggestedColors|Soft red"
-msgstr "Ðœ'Ñкий червоний"
+msgid "SuggestedColors|Green screen"
+msgstr ""
-msgid "SuggestedColors|Strong pink"
-msgstr "ÐаÑичений рожевий"
+msgid "SuggestedColors|Green-cyan"
+msgstr ""
-msgid "SuggestedColors|Strong red"
-msgstr "ÐаÑичений червоний"
+msgid "SuggestedColors|Lavendar"
+msgstr ""
-msgid "SuggestedColors|Strong yellow"
-msgstr "ÐаÑичений жовтий"
+msgid "SuggestedColors|Magenta-pink"
+msgstr ""
-msgid "SuggestedColors|UA blue"
-msgstr "Синій UA"
+msgid "SuggestedColors|Medium sea green"
+msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
-msgstr "Дуже темний ненаÑичений Ñиній"
+msgid "SuggestedColors|Red"
+msgstr ""
-msgid "SuggestedColors|Very dark lime green"
-msgstr "Дуже темний лаймово-Ñиній"
+msgid "SuggestedColors|Rose red"
+msgstr ""
-msgid "SuggestedColors|Very pale orange"
-msgstr "Дуже блідий оранжевий"
+msgid "SuggestedColors|Titanium yellow"
+msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
msgstr ""
@@ -28458,6 +29375,12 @@ 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})"
@@ -28467,7 +29390,7 @@ msgstr "Заголовок Ñ– футер ÑиÑтеми"
msgid "System hook was successfully updated."
msgstr "СиÑтемний хук уÑпішно оновлено."
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28662,6 +29585,9 @@ msgstr "Правилами кориÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÑервіÑом Ñ– полі
msgid "Terraform"
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] ""
@@ -28727,6 +29653,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28739,6 +29668,9 @@ 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 ""
@@ -28760,6 +29692,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28809,9 +29744,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -29306,6 +30238,9 @@ msgstr "Ð¡Ñ‚Ð°Ð´Ñ–Ñ Staging показує Ñ‡Ð°Ñ Ð¼Ñ–Ð¶ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð·Ð
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29390,6 +30325,9 @@ 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 "Закритих задач немає"
@@ -29408,12 +30346,18 @@ msgstr "Ðемає задач Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ"
msgid "There are no issues to show."
msgstr "Ðемає задач Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ."
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr "Тут ще немає міток"
msgid "There are no matching files"
msgstr "Ðемає відповідних файлів"
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr "Відкритих задач немає"
@@ -29444,12 +30388,12 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
-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 ""
@@ -29489,7 +30433,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29504,7 +30448,7 @@ msgstr "Проблема зі збереженнÑм вашої кориÑтув
msgid "There was a problem sending the confirmation email"
msgstr "Помилка при відÑиланні Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð¿Ð¾ електронній пошті"
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29546,6 +30490,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при отриманні %{replicableType}"
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29576,6 +30523,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr "Помилка при завантаженні ÐºÐ°Ð»ÐµÐ½Ð´Ð°Ñ€Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾ÑÑ‚Ñ– кориÑтувачів."
@@ -29603,9 +30553,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr "Помилка при збереженні ваших змін."
-msgid "There was an error saving your notification settings."
-msgstr "Помилка при збереженні ваших налаштувань Ñповіщень."
-
msgid "There was an error subscribing to this label."
msgstr "Помилка при підпиÑці на цю мітку."
@@ -29618,6 +30565,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr "Помилка при перевірці вашого запиту"
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29681,6 +30631,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29723,18 +30676,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr "Ð¦Ñ Ð´Ñ–Ñ Ð¼Ð¾Ð¶Ðµ призвеÑти до втрати даних. Щоб уникнути випадкових дій, проÑимо Ð²Ð°Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¸Ñ‚Ð¸ Ñвій намір."
@@ -29906,6 +30847,9 @@ msgstr "Це ÑпиÑок приÑтроїв, з котрих заходили Ð
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr "Це журнал безпеки, Ñкий міÑтить уÑÑ– важливі події пов’Ñзані із вашим обліковим запиÑом."
@@ -30203,6 +31147,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr "Моніторинг Загроз"
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -30236,6 +31183,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr "Середовище"
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30568,6 +31518,9 @@ msgstr "Порада:"
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr "Заголовок"
@@ -30718,12 +31671,12 @@ 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 widen your search, change or remove filters."
msgstr "Щоб розширити пошук, змініть або видаліть фільтри."
-msgid "To-Do"
-msgstr "ÐагадуваннÑ"
-
msgid "To-Do List"
msgstr "СпиÑок нагадувань"
@@ -30784,12 +31737,6 @@ msgstr "Увімкнути/вимкнути це діалогове вікно"
msgid "Toggle thread"
msgstr "Закрити/відкрити обговореннÑ"
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¿ÐµÑ€ÐµÐ¼Ð¸ÐºÐ°Ñ‡Ð°: ВИМКÐЕÐО"
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¿ÐµÑ€ÐµÐ¼Ð¸ÐºÐ°Ñ‡Ð°: УВІМКÐЕÐО"
-
msgid "Toggled :%{name}: emoji award."
msgstr "Увімкнено/вимкнено :%{name}: Ñмайлик-винагороду."
@@ -30814,9 +31761,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30943,23 +31887,29 @@ msgstr "У виглÑді дерева"
msgid "Trending"
msgstr "ПопулÑрні"
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr "ПовернутиÑÑ Ð´Ð¾ GitLab"
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30968,13 +31918,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -31061,6 +32008,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr "УÑÑƒÐ½ÐµÐ½Ð½Ñ Ð½ÐµÐ¿Ð¾Ð»Ð°Ð´Ð¾Ðº Ñ– моніторинг вашого заÑтоÑунку за допомогою відÑтеженнÑ"
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr "Спробуйте ще раз"
@@ -31073,6 +32023,9 @@ msgstr "Спробуйте вÑÑ– функції GitLab протÑгом 30 дн
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr "Спробувати зробити форк знову"
@@ -31094,11 +32047,11 @@ msgstr "Вівторок"
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
-msgstr "Вимкнути"
+msgid "Turn off"
+msgstr ""
-msgid "Turn On"
-msgstr "Увімкнути"
+msgid "Turn on"
+msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
msgstr ""
@@ -31163,6 +32116,21 @@ msgstr "URL"
msgid "URL is required"
msgstr "URL-адреÑа обов'Ñзкова"
+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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -31295,6 +32263,9 @@ msgstr "СкаÑувати ігноруваннÑ"
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr "Ðа жаль, ваше Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾Ñ— пошти до GitLab не може бути оброблено."
@@ -31466,9 +32437,6 @@ msgstr ""
msgid "Update failed"
msgstr "ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ðµ вдалоÑÑ"
-msgid "Update failed. Please try again."
-msgstr "ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½ÐµÑƒÑпішне. Будь лаÑка, Ñпробуйте знову."
-
msgid "Update it"
msgstr "Оновити це"
@@ -31646,6 +32614,12 @@ msgstr ""
msgid "UsageQuota|LFS Storage"
msgstr "Сховище LFS"
+msgid "UsageQuota|Learn more about excess storage usage"
+msgstr ""
+
+msgid "UsageQuota|Learn more about usage quotas"
+msgstr ""
+
msgid "UsageQuota|Packages"
msgstr "Пакети"
@@ -31748,6 +32722,96 @@ 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 "ВикориÑтовуйте %{code_start}::%{code_end} Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ %{link_start}набору Ñелективних міток%{link_end} (напр. %{code_start}priority::1%{code_end})"
@@ -31757,8 +32821,8 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr "ВикориÑтовуйте Service Desk Ð´Ð»Ñ Ð·Ð²â€™Ñзку з вашими кориÑтувачами (наприклад, щоб запропонувати клієнтÑьку підтримку) через електронну пошту безпоÑередньо із GitLab"
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
-msgstr "ВикориÑтовуйте одноразовий пароль на вашому мобільному приÑтрої або комп’ютері Ð´Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ— двофакторної автентифікації (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgstr ""
msgid "Use cURL"
msgstr ""
@@ -31778,7 +32842,7 @@ msgstr "ВикориÑтовуйте один Ñ€Ñдок Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ U
msgid "Use template"
msgstr "ВикориÑтовувати шаблон"
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31949,6 +33013,12 @@ 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 "Групи"
@@ -31991,6 +33061,9 @@ 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 "Цей кориÑтувач не має оÑобиÑтих проєктів"
@@ -32006,6 +33079,9 @@ msgstr "Цей кориÑтувач не має жодного обраного
msgid "UserProfile|This user is blocked"
msgstr "Цей кориÑтувач заблокований"
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -32015,9 +33091,15 @@ 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 "Ви ще не Ñтворили жодного оÑобиÑтого проєкту."
@@ -32090,6 +33172,9 @@ msgstr "Ðепризначено"
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr "ВикориÑÑ‚Ð°Ð½Ð½Ñ %{code_start}::%{code_end} вказує на %{link_start}набір Ñелективних міток%{link_end}"
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr "ВикориÑтовуєтьÑÑ Ð¾Ð±Ð¾Ð²â€™Ñзкова ÑÑ‚Ñ€Ð°Ñ‚ÐµÐ³Ñ–Ñ ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸ відÑутньому полі Ð´Ð»Ñ Ð·Ð°ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¾Ð³Ð¾ значеннÑ!"
@@ -32207,6 +33292,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr "ПроглÑнути вÑÑ– задачі"
@@ -32254,9 +33342,6 @@ msgstr "ПереглÑд файла @ "
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr "ПереглÑнути повну панель керуваннÑ"
@@ -32374,6 +33459,9 @@ msgstr "Ðевідомий"
msgid "Visit settings page"
msgstr "Відвідати Ñторінку налаштувань"
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr "%{stepStart}Крок 1%{stepEnd}. Скопіюйте наÑтупний Ñкрипт:"
@@ -32440,6 +33528,9 @@ msgstr "%{formattedStartDate} до Ñьогодні"
msgid "VulnerabilityChart|Severity"
msgstr "Рівень"
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32461,15 +33552,27 @@ msgstr "Змінити ÑтатуÑ"
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32668,6 +33771,12 @@ msgstr "Ми виÑвили наÑтупні помилки:"
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32689,6 +33798,9 @@ 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've found no vulnerabilities"
msgstr "Ми не виÑвили вразливоÑтей"
@@ -32746,10 +33858,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32758,7 +33870,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32785,64 +33897,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
+msgstr "URL-адреÑа"
+
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|URL"
-msgstr "URL-адреÑа"
+msgid "Webhooks|URL is triggered when the pipeline status changes"
+msgstr ""
+
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32881,6 +34002,9 @@ msgstr "Що ви шукаєте?"
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32908,7 +34032,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -33077,11 +34201,8 @@ msgstr "Видалити Ñторінку"
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr "Видалити Ñторінку %{pageTitle}?"
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr "ХтоÑÑŒ редагував Ñторінку в той же чаÑ, що Ñ– ви. Будь лаÑка, ознайомтеÑÑ Ð· %{page_link} Ñ– переконайтеÑÑ, ваші зміни не затруть зміни інших."
-
-msgid "WikiPageConflictMessage|the page"
-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 "WikiPageCreate|Create %{pageTitle}"
msgstr "Створити %{pageTitle}"
@@ -33176,9 +34297,6 @@ msgstr "Ðапишіть коментар або перетÑгніть файл
msgid "Write a comment…"
msgstr "ÐапиÑати коментар…"
-msgid "Write access allowed"
-msgstr "ДоÑтуп на Ð·Ð°Ð¿Ð¸Ñ Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð¾"
-
msgid "Write milestone description..."
msgstr "Створити Ð¾Ð¿Ð¸Ñ ÐµÑ‚Ð°Ð¿Ñƒ..."
@@ -33188,6 +34306,9 @@ msgstr "Створіть Ð¾Ð¿Ð¸Ñ Ñ€ÐµÐ»Ñ–Ð·Ñƒ або перетÑгніть Ñ„Ð
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr "Ðадано неправильний зовнішній UID. Будь лаÑка, налаштуйте Auth0 правильно."
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -33254,7 +34375,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -33269,6 +34390,9 @@ 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 "У Ð²Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” повноважень на Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¾Ñ— дії"
@@ -33317,6 +34441,9 @@ 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 ""
@@ -33464,6 +34591,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr "У Ð²Ð°Ñ Ñ‰Ðµ немає підпиÑок"
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr "У Ð²Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” дозволу залишити це %{namespaceType}."
@@ -33581,6 +34711,9 @@ msgstr "Ви не додали жодної затверджуючої оÑобÐ
msgid "You have reached your project limit"
msgstr "Ви доÑÑгли Ñвого ліміту по кількоÑÑ‚Ñ– проєктів"
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr "Ви уÑпішно придбали підпиÑку на план %{plan} на %{seats}. Ви отримаєте чек електронною поштою."
@@ -33812,9 +34945,6 @@ msgstr "Ваша ліцензіÑ"
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr "Термін дії вашого перÑонального токену доÑтупу закінчитьÑÑ Ñ‡ÐµÑ€ÐµÐ· %{days_to_expire} днів або менше"
-
msgid "Your Primary Email will be used for avatar detection."
msgstr "Ваша оÑновна адреÑа електронної пошти буде викориÑтовуватиÑÑ Ð´Ð»Ñ Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð°Ð²Ð°Ñ‚Ð°Ñ€Ñƒ."
@@ -33986,6 +35116,9 @@ 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 profile"
msgstr "Ваш профіль"
@@ -34043,6 +35176,9 @@ msgstr "Zoom-зуÑтріч видалено"
msgid "[No reason]"
msgstr "[Без причини]"
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -34068,6 +35204,9 @@ msgstr "доÑтуп:"
msgid "added %{created_at_timeago}"
msgstr "додано %{created_at_timeago}"
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr "додано дзвінок Zoom до цієї задачі"
@@ -34281,6 +35420,9 @@ 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 "Створити запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð´Ð»Ñ Ñ€ÐµÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ— цього Ñ€Ñ–ÑˆÐµÐ½Ð½Ñ Ð°Ð±Ð¾ завантажити Ñ– заÑтоÑувати патч вручну."
@@ -34414,6 +35556,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr "закрита задача"
@@ -34571,6 +35716,9 @@ msgstr[3] "файлів"
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 "Ð´Ð»Ñ %{link_to_merge_request} з %{link_to_merge_request_source_branch}"
@@ -34714,6 +35862,9 @@ msgstr "не Ñ” адреÑою електронної пошти, Ñкою ви
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr "лише Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ"
@@ -34810,9 +35961,6 @@ msgstr "Ð’Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¼Ð°Ñ‚ÐµÐ¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¸Ñ… Ñимволів в ц
msgid "math|There was an error rendering this math block"
msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¼Ð°Ñ‚ÐµÐ¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ блоку"
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] "запит на злиттÑ"
@@ -34856,9 +36004,6 @@ msgstr "Запити на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð´Ð¾Ð·Ð²Ð¾Ð»ÑÑŽÑ‚ÑŒ запропонув
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr "Будь лаÑка відновіть Ñ—Ñ— або викориÑтовуйте іншу %{missingBranchName} гілку"
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr "%{link_start}Докладніше про Ð²Ð¸Ñ€Ñ–ÑˆÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ñ„Ð»Ñ–ÐºÑ‚Ñ–Ð²%{link_end}"
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34976,6 +36121,9 @@ msgstr "Якщо гілка %{missingBranchName} Ñ–Ñнує у вашому ло
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ ÑтатиÑтики розгортаннÑ"
@@ -35060,7 +36208,7 @@ msgstr "Зміни не були злиті в"
msgid "mrWidget|The changes will be merged into"
msgstr "Зміни будуть злиті в"
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -35141,6 +36289,9 @@ msgstr "буде злито автоматично, коли конвеєр за
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr "Ñтворити ланцюжок змін піÑÐ»Ñ ÑƒÑпішного Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ð²ÐµÑ”Ñ€Ð°"
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -35150,9 +36301,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr "повинна бути пізніша за дату початку"
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -35201,9 +36358,6 @@ msgstr "немає"
msgid "not found"
msgstr "не знайдено"
-msgid "notification emails"
-msgstr "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾ÑŽ поштою"
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr "%{firstItem} Ñ– %{lastItem}"
@@ -35500,6 +36654,12 @@ msgstr ""
msgid "this document"
msgstr "цей документ"
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35527,6 +36687,9 @@ msgstr "запущено"
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr "домени в unicode повинні викориÑтовувати ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ IDNA"
@@ -35554,9 +36717,6 @@ msgstr ""
msgid "username"
msgstr "ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача"
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr "викориÑтовує клаÑтери Kubernetes Ð´Ð»Ñ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ð´Ñƒ!"
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/unfound_translations.rb b/locale/unfound_translations.rb
index 76ad81cacc1..3923c62466a 100644
--- a/locale/unfound_translations.rb
+++ b/locale/unfound_translations.rb
@@ -21,3 +21,4 @@ N_('NotificationEvent|Merge merge request')
N_('NotificationEvent|Failed pipeline')
N_('NotificationEvent|Fixed pipeline')
N_('NotificationEvent|Moved project')
+N_('NotificationEvent|Merge when pipeline succeeds')
diff --git a/locale/ur_PK/gitlab.po b/locale/ur_PK/gitlab.po
index f838eede643..c906c5752ad 100644
--- a/locale/ur_PK/gitlab.po
+++ b/locale/ur_PK/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: ur-PK\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:04\n"
+"PO-Revision-Date: 2021-03-05 23:48\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -170,6 +173,11 @@ 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] ""
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ 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 ""
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -682,6 +710,15 @@ 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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -976,6 +1016,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -988,9 +1031,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1015,9 +1055,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1111,6 +1148,11 @@ 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] ""
@@ -1162,6 +1204,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1282,6 +1327,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1635,9 +1779,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1716,12 +1857,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1818,6 +1965,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1938,6 +2103,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2058,6 +2226,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2091,6 +2268,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2259,6 +2442,15 @@ 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 ""
@@ -2268,6 +2460,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2361,6 +2562,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2394,6 +2607,21 @@ 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 ""
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2483,9 +2714,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2576,9 +2792,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,9 +2813,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,49 +2837,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,76 +2867,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,13 +2927,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2954,7 +3104,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2996,6 +3146,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3146,12 +3293,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3269,6 +3425,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3296,12 +3455,18 @@ 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 ""
@@ -3344,7 +3509,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3395,10 +3566,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3757,9 +3928,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3787,6 +3955,9 @@ 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 erase this build?"
msgstr ""
@@ -4048,12 +4219,6 @@ msgstr[1] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5028,6 +5235,26 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5688,7 +5915,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5703,6 +5930,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6036,21 +6266,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7325,16 +7594,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7349,6 +7642,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7391,6 +7729,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7430,6 +7771,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7451,6 +7795,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8245,10 +8577,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8302,6 +8637,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8314,6 +8652,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8329,6 +8670,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,13 +8991,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8647,7 +9024,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8689,6 +9066,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8722,6 +9102,18 @@ 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 ""
@@ -8886,7 +9278,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 ""
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9261,9 +9682,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9318,6 +9736,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9429,6 +9856,15 @@ 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 ""
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9660,6 +10093,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9678,9 +10114,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9690,19 +10123,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9717,10 +10150,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9735,7 +10165,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9756,10 +10186,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9768,7 +10204,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10047,18 +10482,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,7 +10710,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11048,19 +11468,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
-msgstr ""
-
-msgid "Enter the issue title"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11345,6 +11759,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11369,6 +11786,12 @@ 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 ""
@@ -11396,6 +11819,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11423,6 +11849,9 @@ 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 ""
@@ -11447,9 +11876,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11882,6 +12320,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11915,6 +12356,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12038,10 +12482,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12068,6 +12512,12 @@ 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 ""
@@ -12104,9 +12554,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,10 +12602,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12826,6 +13279,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12856,7 +13345,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12934,9 +13423,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13096,6 +13585,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13135,6 +13627,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13144,6 +13639,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13291,6 +13801,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13330,6 +13840,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13828,6 +14344,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14630,6 +15164,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15703,96 +16240,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16078,9 +16543,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ 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 ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ 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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16972,6 +17518,9 @@ 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 ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] ""
msgstr[1] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17085,6 +17640,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17118,6 +17676,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17169,9 +17730,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17181,6 +17739,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19590,6 +20253,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19737,6 +20406,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19788,6 +20466,9 @@ 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 ""
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ 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."
+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."
@@ -20552,7 +21257,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20579,10 +21290,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20651,6 +21362,9 @@ 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 ""
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20762,6 +21473,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21077,6 +21809,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21284,9 +22028,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21308,10 +22049,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,10 +22154,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ 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 ""
@@ -21665,6 +22415,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21923,21 +22685,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21959,6 +22739,12 @@ 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 ""
@@ -22067,6 +22853,9 @@ 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 ""
@@ -22151,24 +22940,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22205,6 +22976,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22562,6 +23336,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22790,10 +23567,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22805,7 +23579,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,13 +23672,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22937,13 +23714,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22970,16 +23750,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,52 +23816,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23381,6 +24164,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23396,6 +24188,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23408,22 +24206,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23432,6 +24230,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23522,9 +24326,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23675,7 +24476,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23771,7 +24572,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24072,6 +24921,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24243,6 +25098,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,7 +25269,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25595,7 +26480,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25721,6 +26612,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,10 +26627,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,19 +26744,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26161,7 +27062,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26338,6 +27239,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] ""
msgstr[1] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27287,9 +28194,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27479,12 +28383,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27989,67 +28896,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28136,6 +29043,12 @@ 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 ""
@@ -28145,7 +29058,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ 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 ""
@@ -29076,12 +30004,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29112,10 +30046,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29157,7 +30091,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29574,6 +30505,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30382,10 +31325,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30735,6 +31675,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30756,10 +31699,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31308,6 +32266,12 @@ 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|Packages"
msgstr ""
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ 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 ""
@@ -31653,6 +32713,9 @@ 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 ""
@@ -31668,6 +32731,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ 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 ""
@@ -31752,6 +32824,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31912,9 +32990,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32032,6 +33107,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,10 +33847,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32832,9 +33943,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ 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 ""
@@ -33120,6 +34237,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33237,6 +34357,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33642,6 +34762,9 @@ 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 profile"
msgstr ""
@@ -33699,6 +34822,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 ""
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34215,6 +35350,9 @@ 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 ""
@@ -34354,6 +35492,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34698,7 +35836,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35128,6 +36272,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/uz_UZ/gitlab.po b/locale/uz_UZ/gitlab.po
index ab4c80e508c..a1d559378f6 100644
--- a/locale/uz_UZ/gitlab.po
+++ b/locale/uz_UZ/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: uz\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:09\n"
+"PO-Revision-Date: 2021-03-05 23:51\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -74,6 +74,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -170,6 +173,11 @@ 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] ""
@@ -345,6 +353,11 @@ msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -422,6 +435,9 @@ msgid_plural "%{count} issues selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -494,6 +510,9 @@ 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 ""
@@ -545,6 +564,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -653,6 +675,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -682,6 +710,15 @@ 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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -729,9 +766,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -775,6 +809,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -953,6 +990,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -976,6 +1016,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -988,9 +1031,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -1015,9 +1055,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1111,6 +1148,11 @@ 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] ""
@@ -1162,6 +1204,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1282,6 +1327,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1381,6 +1429,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1635,9 +1779,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1716,12 +1857,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1818,6 +1965,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1878,6 +2040,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1938,6 +2103,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -2058,6 +2226,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -2082,6 +2256,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -2091,6 +2268,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2166,6 +2346,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2259,6 +2442,15 @@ 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 ""
@@ -2268,6 +2460,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2352,6 +2547,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2361,6 +2562,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2394,6 +2607,21 @@ 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 ""
@@ -2418,6 +2646,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2483,9 +2714,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2498,24 +2726,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2576,9 +2792,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2588,6 +2801,9 @@ 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 ""
@@ -2597,9 +2813,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2624,49 +2837,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2678,9 +2858,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2690,76 +2867,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2771,13 +2927,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2789,9 +2945,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2804,7 +2957,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2891,9 +3044,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2954,7 +3104,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2996,6 +3146,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3062,12 +3215,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3146,12 +3293,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3176,6 +3329,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3269,6 +3425,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3296,12 +3455,18 @@ 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 ""
@@ -3344,7 +3509,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3383,6 +3551,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3395,10 +3566,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3757,9 +3928,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3787,6 +3955,9 @@ 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 erase this build?"
msgstr ""
@@ -4048,12 +4219,6 @@ msgstr[1] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4126,6 +4291,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4552,6 +4720,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4564,12 +4735,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4638,6 +4821,12 @@ 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 ""
@@ -4728,12 +4917,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -4902,16 +5085,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4926,6 +5121,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4959,6 +5157,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4977,6 +5181,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -5028,6 +5235,26 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5163,6 +5390,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5316,12 +5546,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5466,6 +5690,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5688,7 +5915,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5703,6 +5930,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -6036,21 +6266,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -6060,9 +6311,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7071,6 +7334,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7140,6 +7406,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7325,16 +7594,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7349,6 +7642,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7361,9 +7660,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7379,6 +7708,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7391,6 +7729,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7430,6 +7771,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7451,6 +7795,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7505,9 +7852,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7680,24 +8024,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8156,10 +8491,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8195,9 +8530,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8245,10 +8577,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8275,6 +8607,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8302,6 +8637,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8314,6 +8652,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8329,6 +8670,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8401,6 +8748,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8410,15 +8760,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8437,6 +8802,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8446,6 +8814,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8461,6 +8832,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8566,6 +8940,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8614,13 +8991,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8647,7 +9024,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8689,6 +9066,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8722,6 +9102,18 @@ 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 ""
@@ -8886,7 +9278,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -9042,7 +9434,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -9066,6 +9464,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9147,6 +9548,9 @@ 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 ""
@@ -9156,6 +9560,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9180,6 +9587,11 @@ 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|Validate"
msgstr ""
@@ -9198,6 +9610,9 @@ 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 ""
@@ -9219,6 +9634,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9243,6 +9661,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9261,9 +9682,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9318,6 +9736,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9348,6 +9769,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9405,6 +9829,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9429,6 +9856,15 @@ 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 ""
@@ -9603,13 +10039,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9618,6 +10051,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9627,15 +10063,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9660,6 +10093,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9678,9 +10114,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9690,19 +10123,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9717,10 +10150,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9735,7 +10165,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9756,10 +10186,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9768,7 +10204,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9798,6 +10234,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9807,15 +10246,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9825,6 +10255,11 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Deployment|API"
msgstr ""
@@ -10047,18 +10482,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -10074,16 +10497,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -10104,10 +10527,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10116,18 +10536,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10140,9 +10554,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10152,6 +10563,12 @@ 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 ""
@@ -10179,6 +10596,9 @@ 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|Score"
msgstr ""
@@ -10290,7 +10710,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10493,6 +10913,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10685,10 +11108,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10757,12 +11180,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10883,6 +11300,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -11048,19 +11468,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
-msgstr ""
-
-msgid "Enter the issue title"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11345,6 +11759,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11369,6 +11786,12 @@ 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 ""
@@ -11396,6 +11819,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11423,6 +11849,9 @@ 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 ""
@@ -11447,9 +11876,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11624,6 +12050,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11789,6 +12218,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11804,6 +12236,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11846,6 +12281,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11882,6 +12320,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11915,6 +12356,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -12038,10 +12482,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -12068,6 +12512,12 @@ 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 ""
@@ -12104,9 +12554,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12122,9 +12569,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12158,10 +12602,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12206,7 +12650,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12224,9 +12668,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12269,6 +12710,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12763,6 +13207,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12826,6 +13279,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12856,7 +13345,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12934,9 +13423,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12949,6 +13435,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13096,6 +13585,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13135,6 +13627,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13144,6 +13639,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13168,6 +13666,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13195,6 +13699,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13240,6 +13747,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13291,6 +13801,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13315,9 +13828,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13330,6 +13840,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13366,6 +13879,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13627,9 +14143,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13780,6 +14293,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13828,6 +14344,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14161,6 +14680,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14437,6 +14965,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14518,15 +15052,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14630,6 +15164,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14880,6 +15417,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15239,7 +15779,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15665,9 +16205,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15703,96 +16240,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15811,12 +16258,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15868,6 +16321,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15901,6 +16360,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -16069,6 +16531,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16078,9 +16543,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -16090,9 +16552,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16132,19 +16627,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16153,18 +16669,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16174,6 +16705,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16396,6 +16933,9 @@ 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 ""
@@ -16471,10 +17011,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16522,6 +17059,9 @@ 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 ""
@@ -16537,7 +17077,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16597,6 +17137,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16621,6 +17164,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16822,6 +17368,9 @@ 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 ""
@@ -16891,9 +17440,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16972,6 +17518,9 @@ 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 ""
@@ -16992,6 +17541,9 @@ msgid_plural "Last %d days"
msgstr[0] ""
msgstr[1] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -17037,6 +17589,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -17085,6 +17640,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -17118,6 +17676,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17169,9 +17730,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17181,6 +17739,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17370,9 +18018,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17483,6 +18128,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17522,7 +18170,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17882,6 +18530,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17894,9 +18545,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17954,6 +18602,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18224,6 +18875,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18305,9 +18959,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18317,9 +18968,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18368,6 +19016,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -19077,6 +19728,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -19086,6 +19740,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -19104,6 +19761,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19312,6 +19972,12 @@ 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 ""
@@ -19330,12 +19996,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19569,6 +20229,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19590,6 +20253,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19632,6 +20298,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19737,6 +20406,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19758,9 +20430,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19788,6 +20466,9 @@ 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 ""
@@ -19824,6 +20505,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -20052,13 +20736,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -20073,6 +20763,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 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 ""
@@ -20088,9 +20781,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -20118,6 +20808,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20172,9 +20865,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20286,6 +20976,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20307,6 +21003,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20340,9 +21039,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20519,7 +21224,7 @@ 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."
+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."
@@ -20552,7 +21257,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20567,6 +21272,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20579,10 +21290,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20651,6 +21362,9 @@ 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 ""
@@ -20705,9 +21419,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20762,6 +21473,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20774,6 +21494,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20897,9 +21620,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20918,6 +21638,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20936,6 +21659,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20975,6 +21704,9 @@ 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|npm command"
msgstr ""
@@ -20996,15 +21728,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21077,6 +21809,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -21134,10 +21875,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21233,6 +21974,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21284,9 +22028,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21308,10 +22049,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21386,15 +22127,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21422,10 +22154,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21440,9 +22172,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21467,6 +22196,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21503,9 +22235,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21539,6 +22268,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21551,12 +22283,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21596,6 +22337,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21608,6 +22352,12 @@ 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 ""
@@ -21665,6 +22415,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21734,6 +22487,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21857,12 +22613,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21923,21 +22685,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21959,6 +22739,12 @@ 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 ""
@@ -22067,6 +22853,9 @@ 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 ""
@@ -22151,24 +22940,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22205,6 +22976,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22562,6 +23336,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22790,10 +23567,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22805,7 +23579,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22820,6 +23594,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22847,16 +23627,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22895,13 +23672,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22937,13 +23714,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22970,16 +23750,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -23003,7 +23792,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -23027,52 +23816,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23351,10 +24137,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23363,9 +24149,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23381,6 +24164,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23396,6 +24188,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23408,22 +24206,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23432,6 +24230,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23522,9 +24326,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23567,9 +24368,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23582,6 +24380,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23675,7 +24476,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23771,7 +24572,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23864,6 +24707,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23900,6 +24746,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -24072,6 +24921,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24177,6 +25029,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24243,6 +25098,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24411,7 +25269,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24463,12 +25321,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24542,6 +25403,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24569,6 +25436,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24665,6 +25538,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24683,6 +25559,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24795,9 +25674,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24888,6 +25764,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25264,7 +26143,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25336,6 +26215,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25423,6 +26305,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25595,7 +26480,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25640,12 +26525,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25658,9 +26549,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25685,6 +26573,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25721,6 +26612,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25730,10 +26627,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25754,6 +26651,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25769,9 +26669,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25799,6 +26696,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25841,19 +26744,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25877,11 +26780,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25924,7 +26822,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25933,7 +26831,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -26020,9 +26918,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -26071,7 +26966,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -26113,12 +27008,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26161,7 +27062,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26338,6 +27239,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26530,6 +27434,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26685,7 +27592,7 @@ msgid_plural "Showing %d events"
msgstr[0] ""
msgstr[1] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26975,9 +27882,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -27104,6 +28008,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27287,9 +28194,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27479,12 +28383,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27989,67 +28896,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -28136,6 +29043,12 @@ 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 ""
@@ -28145,7 +29058,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28340,6 +29253,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28401,6 +29317,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28413,6 +29332,9 @@ 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 ""
@@ -28434,6 +29356,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28481,9 +29406,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28974,6 +29896,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -29058,6 +29983,9 @@ 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 ""
@@ -29076,12 +30004,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -29112,10 +30046,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -29157,7 +30091,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29172,7 +30106,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29214,6 +30148,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29244,6 +30181,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29271,9 +30211,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29286,6 +30223,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29349,6 +30289,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29391,18 +30334,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29574,6 +30505,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29871,6 +30805,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29904,6 +30841,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30232,6 +31172,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30382,10 +31325,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30448,12 +31391,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30478,9 +31415,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30607,21 +31541,27 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
msgstr[1] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30630,13 +31570,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30723,6 +31660,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30735,6 +31675,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30756,10 +31699,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30825,6 +31768,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30957,6 +31915,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -31128,9 +32089,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31308,6 +32266,12 @@ 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|Packages"
msgstr ""
@@ -31410,6 +32374,96 @@ 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 ""
@@ -31419,7 +32473,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31440,7 +32494,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31611,6 +32665,12 @@ 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 ""
@@ -31653,6 +32713,9 @@ 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 ""
@@ -31668,6 +32731,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31677,9 +32743,15 @@ 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 ""
@@ -31752,6 +32824,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31869,6 +32944,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31912,9 +32990,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -32032,6 +33107,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -32098,6 +33176,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -32119,15 +33200,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32326,6 +33419,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32347,6 +33446,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32404,10 +33506,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32416,7 +33518,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32443,64 +33545,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32539,6 +33650,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32566,7 +33680,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32733,10 +33847,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32832,9 +33943,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32844,6 +33952,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32910,7 +34021,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32925,6 +34036,9 @@ 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 ""
@@ -32973,6 +34087,9 @@ 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 ""
@@ -33120,6 +34237,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33237,6 +34357,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33468,9 +34591,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33642,6 +34762,9 @@ 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 profile"
msgstr ""
@@ -33699,6 +34822,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33722,6 +34848,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33935,6 +35064,9 @@ 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 ""
@@ -34066,6 +35198,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34215,6 +35350,9 @@ 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 ""
@@ -34354,6 +35492,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34450,9 +35591,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34494,9 +35632,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34614,6 +35749,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34698,7 +35836,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34779,6 +35917,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34788,9 +35929,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34839,9 +35986,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -35128,6 +36272,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -35155,6 +36305,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -35182,9 +36335,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/vi_VN/gitlab.po b/locale/vi_VN/gitlab.po
index 401f669c8a2..471d26cb346 100644
--- a/locale/vi_VN/gitlab.po
+++ b/locale/vi_VN/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: vi\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:05\n"
+"PO-Revision-Date: 2021-03-05 23:48\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -72,6 +72,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -150,6 +153,10 @@ msgid "%d day"
msgid_plural "%d days"
msgstr[0] ""
+msgid "%d epic"
+msgid_plural "%d epics"
+msgstr[0] ""
+
msgid "%d error"
msgid_plural "%d errors"
msgstr[0] ""
@@ -290,6 +297,10 @@ msgid "%d vulnerability dismissed"
msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -363,6 +374,9 @@ msgid "%{count} issue selected"
msgid_plural "%{count} issues selected"
msgstr[0] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -432,6 +446,9 @@ 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 ""
@@ -483,6 +500,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -591,6 +611,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -619,6 +645,15 @@ msgstr[0] ""
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 "%{openOrClose} %{noteable}"
msgstr ""
@@ -665,9 +700,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -709,6 +741,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -879,6 +914,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -901,6 +939,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -913,9 +954,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -940,9 +978,6 @@ msgstr ""
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1027,6 +1062,10 @@ msgid "1 deploy key"
msgid_plural "%d deploy keys"
msgstr[0] ""
+msgid "1 follower"
+msgid_plural "%{count} followers"
+msgstr[0] ""
+
msgid "1 group"
msgid_plural "%d groups"
msgstr[0] ""
@@ -1069,6 +1108,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1189,6 +1231,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1288,6 +1333,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1541,9 +1682,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1622,12 +1760,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1724,6 +1868,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1784,6 +1943,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1844,6 +2006,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -1964,6 +2129,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -1988,6 +2159,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -1997,6 +2171,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2072,6 +2249,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2165,6 +2345,15 @@ 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 ""
@@ -2174,6 +2363,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2258,6 +2450,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2267,6 +2465,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2300,6 +2510,21 @@ 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 ""
@@ -2324,6 +2549,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -2388,9 +2616,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2403,24 +2628,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2481,9 +2694,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2493,6 +2703,9 @@ 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 ""
@@ -2502,9 +2715,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2529,49 +2739,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2583,9 +2760,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2595,76 +2769,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
-msgstr ""
-
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2676,13 +2829,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2694,9 +2847,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2709,7 +2859,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2796,9 +2946,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2859,7 +3006,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2901,6 +3048,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -2967,12 +3117,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3051,12 +3195,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3081,6 +3231,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr ""
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3174,6 +3327,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3201,12 +3357,18 @@ 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 ""
@@ -3249,7 +3411,10 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
msgstr ""
msgid "An error occurred while subscribing to notifications."
@@ -3288,6 +3453,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3300,10 +3468,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3658,9 +3826,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3688,6 +3853,9 @@ 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 erase this build?"
msgstr ""
@@ -3946,12 +4114,6 @@ msgstr[0] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4024,6 +4186,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4450,6 +4615,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4462,12 +4630,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4535,6 +4715,12 @@ 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 ""
@@ -4625,12 +4811,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -4799,16 +4979,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4823,6 +5015,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4856,6 +5051,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4874,6 +5075,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -4925,6 +5129,25 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5060,6 +5283,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5213,12 +5439,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5363,6 +5583,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5585,7 +5808,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5600,6 +5823,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -5933,21 +6159,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -5957,9 +6204,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6968,6 +7227,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7037,6 +7299,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7221,16 +7486,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
+msgstr ""
+
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Create merge request"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7245,6 +7534,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7257,9 +7552,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7275,6 +7600,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7287,6 +7621,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7326,6 +7663,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7347,6 +7687,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7401,9 +7744,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7574,24 +7914,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8049,10 +8380,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8088,9 +8419,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8137,10 +8465,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8167,6 +8495,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8194,6 +8525,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8206,6 +8540,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8221,6 +8558,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8293,6 +8636,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8302,15 +8648,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8329,6 +8690,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8338,6 +8702,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8353,6 +8720,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8458,6 +8828,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8506,13 +8879,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8539,7 +8912,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8581,6 +8954,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8614,6 +8990,18 @@ 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 ""
@@ -8777,7 +9165,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -8933,7 +9321,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -8957,6 +9351,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9038,6 +9435,9 @@ 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 ""
@@ -9047,6 +9447,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9071,6 +9474,10 @@ 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] ""
+
msgid "DastSiteValidation|Validate"
msgstr ""
@@ -9089,6 +9496,9 @@ 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 ""
@@ -9110,6 +9520,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9134,6 +9547,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9152,9 +9568,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9209,6 +9622,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9239,6 +9655,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9296,6 +9715,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9320,6 +9742,15 @@ 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 ""
@@ -9488,13 +9919,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
-msgstr ""
-
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9503,6 +9931,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9512,15 +9943,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9545,6 +9973,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9563,9 +9994,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9575,19 +10003,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9602,10 +10030,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9620,7 +10045,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9641,10 +10066,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9653,7 +10084,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9683,6 +10114,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9692,15 +10126,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9710,6 +10135,10 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+
msgid "Deployment|API"
msgstr ""
@@ -9932,18 +10361,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -9959,16 +10376,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -9989,10 +10406,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10001,18 +10415,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10025,9 +10433,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10037,6 +10442,12 @@ 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 ""
@@ -10064,6 +10475,9 @@ 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|Score"
msgstr ""
@@ -10175,7 +10589,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10377,6 +10791,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10569,10 +10986,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10641,12 +11058,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10767,6 +11178,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -10932,19 +11346,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the issue title"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request description"
-msgstr ""
-
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11229,6 +11637,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11253,6 +11664,12 @@ 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 ""
@@ -11280,6 +11697,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11307,6 +11727,9 @@ 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 ""
@@ -11331,9 +11754,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11508,6 +11928,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11673,6 +12096,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11688,6 +12114,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11730,6 +12159,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11766,6 +12198,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11799,6 +12234,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -11922,10 +12360,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -11952,6 +12390,12 @@ 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 ""
@@ -11988,9 +12432,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12006,9 +12447,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12042,10 +12480,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12090,7 +12528,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12108,9 +12546,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12153,6 +12588,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12646,6 +13084,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12709,6 +13156,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12739,7 +13222,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12817,9 +13300,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12832,6 +13312,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -12979,6 +13462,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13018,6 +13504,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13027,6 +13516,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13051,6 +13543,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13078,6 +13576,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13123,6 +13624,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13174,6 +13678,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13198,9 +13705,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13213,6 +13717,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13249,6 +13756,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13510,9 +14020,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13663,6 +14170,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13711,6 +14221,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14044,6 +14557,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14320,6 +14842,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14401,15 +14929,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14511,6 +15039,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14759,6 +15290,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15117,7 +15651,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15543,9 +16077,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15580,96 +16111,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15688,12 +16129,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15745,6 +16192,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15778,6 +16231,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -15946,6 +16402,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -15955,9 +16414,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -15967,9 +16423,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16009,19 +16498,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16030,18 +16540,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16051,6 +16576,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16273,6 +16804,9 @@ 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 ""
@@ -16348,10 +16882,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16399,6 +16930,9 @@ 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 ""
@@ -16414,7 +16948,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16474,6 +17008,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16498,6 +17035,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16699,6 +17239,9 @@ 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 ""
@@ -16768,9 +17311,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16849,6 +17389,9 @@ 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 ""
@@ -16868,6 +17411,9 @@ msgid "Last %d day"
msgid_plural "Last %d days"
msgstr[0] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -16913,6 +17459,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -16961,6 +17510,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -16994,6 +17546,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17045,9 +17600,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17057,6 +17609,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17240,9 +17882,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17352,6 +17991,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17391,7 +18033,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17751,6 +18393,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17763,9 +18408,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17823,6 +18465,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18093,6 +18738,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18174,9 +18822,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18186,9 +18831,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18237,6 +18879,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -18944,6 +19589,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -18953,6 +19601,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -18971,6 +19622,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19177,6 +19831,12 @@ 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 ""
@@ -19195,12 +19855,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19433,6 +20087,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19454,6 +20111,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19496,6 +20156,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19601,6 +20264,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19622,9 +20288,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19652,6 +20324,9 @@ 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 ""
@@ -19688,6 +20363,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -19916,13 +20594,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -19937,6 +20621,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 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 ""
@@ -19952,9 +20639,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -19982,6 +20666,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20036,9 +20723,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20150,6 +20834,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20171,6 +20861,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20204,9 +20897,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20382,7 +21081,7 @@ 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."
+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."
@@ -20415,7 +21114,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20430,6 +21129,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20442,10 +21147,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20514,6 +21219,9 @@ 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 ""
@@ -20568,9 +21276,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20625,6 +21330,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20637,6 +21351,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20760,9 +21477,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20781,6 +21495,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20799,6 +21516,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20838,6 +21561,9 @@ 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|npm command"
msgstr ""
@@ -20859,15 +21585,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -20940,6 +21666,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -20997,10 +21732,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21096,6 +21831,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21147,9 +21885,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21171,10 +21906,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21249,15 +21984,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21285,10 +22011,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21303,9 +22029,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21330,6 +22053,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21366,9 +22092,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21402,6 +22125,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21414,12 +22140,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21459,6 +22194,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21471,6 +22209,12 @@ 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 ""
@@ -21528,6 +22272,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21597,6 +22344,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21720,12 +22470,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21786,21 +22542,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21822,6 +22596,12 @@ 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 ""
@@ -21930,6 +22710,9 @@ 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 ""
@@ -22014,24 +22797,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22068,6 +22833,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22425,6 +23193,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22653,10 +23424,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22668,7 +23436,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22683,6 +23451,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22710,16 +23484,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22758,13 +23529,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22800,13 +23571,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22833,16 +23607,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -22866,7 +23649,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -22890,52 +23673,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23214,10 +23994,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23226,9 +24006,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23244,6 +24021,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23259,6 +24045,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23271,22 +24063,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23295,6 +24087,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23385,9 +24183,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23430,9 +24225,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23445,6 +24237,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23538,7 +24333,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23634,7 +24429,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23727,6 +24564,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23763,6 +24603,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -23933,6 +24776,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24038,6 +24884,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24104,6 +24953,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24272,7 +25124,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24322,12 +25174,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24399,6 +25254,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24426,6 +25287,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24522,6 +25389,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24540,6 +25410,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24650,9 +25523,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24743,6 +25613,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25117,7 +25990,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25189,6 +26062,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25276,6 +26152,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25437,7 +26316,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25482,12 +26361,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25500,9 +26385,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25527,6 +26409,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25563,6 +26448,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25572,10 +26463,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25596,6 +26487,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25611,9 +26505,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25641,6 +26532,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25683,19 +26580,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25719,10 +26616,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25765,7 +26658,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25774,7 +26667,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -25861,9 +26754,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -25912,7 +26802,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -25954,12 +26844,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26002,7 +26898,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26179,6 +27075,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26371,6 +27270,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26525,7 +27427,7 @@ msgid "Showing %d event"
msgid_plural "Showing %d events"
msgstr[0] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26814,9 +27716,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -26943,6 +27842,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27126,9 +28028,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27318,12 +28217,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27828,67 +28730,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -27975,6 +28877,12 @@ 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 ""
@@ -27984,7 +28892,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28179,6 +29087,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28238,6 +29149,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28250,6 +29164,9 @@ 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 ""
@@ -28271,6 +29188,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28317,9 +29237,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28808,6 +29725,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -28892,6 +29812,9 @@ 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 ""
@@ -28910,12 +29833,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -28946,10 +29875,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -28991,7 +29920,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29006,7 +29935,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29048,6 +29977,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29078,6 +30010,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29105,9 +30040,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29120,6 +30052,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29183,6 +30118,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29225,18 +30163,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29408,6 +30334,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29705,6 +30634,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29738,6 +30670,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30064,6 +30999,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30214,10 +31152,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30280,12 +31218,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30310,9 +31242,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30439,20 +31368,26 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30461,13 +31396,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30554,6 +31486,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30566,6 +31501,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30587,10 +31525,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30656,6 +31594,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30788,6 +31741,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -30959,9 +31915,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31139,6 +32092,12 @@ 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|Packages"
msgstr ""
@@ -31241,6 +32200,96 @@ 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 ""
@@ -31250,7 +32299,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31271,7 +32320,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31442,6 +32491,12 @@ 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 ""
@@ -31484,6 +32539,9 @@ 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 ""
@@ -31499,6 +32557,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31508,9 +32569,15 @@ 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 ""
@@ -31583,6 +32650,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31700,6 +32770,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31741,9 +32814,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -31861,6 +32931,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -31927,6 +33000,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -31948,15 +33024,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32155,6 +33243,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32176,6 +33270,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32233,10 +33330,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32245,7 +33342,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32272,64 +33369,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32368,6 +33474,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32395,7 +33504,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32561,10 +33670,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32660,9 +33766,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32672,6 +33775,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32738,7 +33844,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32753,6 +33859,9 @@ 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 ""
@@ -32801,6 +33910,9 @@ 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 ""
@@ -32948,6 +34060,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33065,6 +34180,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33296,9 +34414,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33470,6 +34585,9 @@ 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 profile"
msgstr ""
@@ -33527,6 +34645,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33549,6 +34670,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33762,6 +34886,9 @@ 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 ""
@@ -33892,6 +35019,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34037,6 +35167,9 @@ msgstr[0] ""
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 ""
@@ -34174,6 +35307,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34270,9 +35406,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34313,9 +35446,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34433,6 +35563,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34517,7 +35650,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34598,6 +35731,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34607,9 +35743,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34658,9 +35800,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -34942,6 +36081,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -34969,6 +36114,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -34996,9 +36144,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/zh_CN/gitlab.po b/locale/zh_CN/gitlab.po
index 556437eb3f0..203b0b0df68 100644
--- a/locale/zh_CN/gitlab.po
+++ b/locale/zh_CN/gitlab.po
@@ -14,10 +14,10 @@ msgstr ""
"X-Crowdin-Language: zh-CN\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:55\n"
+"PO-Revision-Date: 2021-03-05 23:50\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
-msgstr " %{project_name}#%{issuable_iid} &middot;由%{author}于%{issuable_created}创建"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
+msgstr ""
msgid " %{start} to %{end}"
msgstr "从%{start}到%{end}"
@@ -72,6 +72,9 @@ msgstr "或引用 (例如: path/to/project!merge_request_id)"
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr "“%{ref}â€ä¸Šä¸å­˜åœ¨â€œ%{path}â€"
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr "createInstance()必需“elâ€å‚æ•°"
@@ -150,6 +153,10 @@ msgid "%d day"
msgid_plural "%d days"
msgstr[0] "%d天"
+msgid "%d epic"
+msgid_plural "%d epics"
+msgstr[0] ""
+
msgid "%d error"
msgid_plural "%d errors"
msgstr[0] "%d个错误"
@@ -290,6 +297,10 @@ msgid "%d vulnerability dismissed"
msgid_plural "%d vulnerabilities dismissed"
msgstr[0] "%d个æ¼æ´žå·²å¿½ç•¥"
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] "找到%d个警告:"
@@ -363,6 +374,9 @@ msgid "%{count} issue selected"
msgid_plural "%{count} issues selected"
msgstr[0] "已选择%{count}个议题"
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] "已选择%{count}个åˆå¹¶è¯·æ±‚"
@@ -432,6 +446,9 @@ msgstr "%{edit_in_new_fork_notice} Try to revert this commit again."
msgid "%{edit_in_new_fork_notice} Try to upload a file again."
msgstr "%{edit_in_new_fork_notice} å†æ¬¡å°è¯•ä¸Šä¼ æ–‡ä»¶ã€‚"
+msgid "%{emailPrefix}@company.com"
+msgstr ""
+
msgid "%{extra} more downstream pipelines"
msgstr "å¦å¤– %{extra} 个下游æµæ°´çº¿"
@@ -483,6 +500,9 @@ msgstr "%{issuesCount}个议题,上é™ä¸º%{maxIssueCount}"
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr "%{issuesSize}个,上é™ä¸º%{maxIssueCount}"
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr "%{labelStart}实际å“应:%{labelEnd} %{headers}"
@@ -591,6 +611,12 @@ msgstr "%{name_with_link}当å‰å‰©ä½™%{percent}或更少的共享Runneræµæ°´çº¿
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr "%{name_with_link}的共享Runneræµæ°´çº¿åˆ†é’Ÿæ•°å·²ç”¨å®Œï¼Œå…¶ä¸‹é¡¹ç›®å°†æ— æ³•è¿è¡Œæ–°çš„作业或æµæ°´çº¿ã€‚"
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr "%{name} åŒ…å« %{resultsString}"
@@ -619,6 +645,15 @@ msgstr[0] "%{no_of_days}天"
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr "%{number_commits_behind}个è½åŽäºŽ%{default_branch}分支的æ交, åŒæ—¶%{number_commits_ahead}个超å‰çš„æ交"
+msgid "%{oneMonthAgo} - %{today}"
+msgstr ""
+
+msgid "%{oneWeekAgo} - %{today}"
+msgstr ""
+
+msgid "%{oneYearAgo} - %{today}"
+msgstr ""
+
msgid "%{openOrClose} %{noteable}"
msgstr "%{openOrClose} %{noteable}"
@@ -665,9 +700,6 @@ msgstr "%{reportType}检测到%{totalStart}%{total}%{totalEnd}个潜在的%{vuln
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr "%{reportType}检测到%{totalStart}æ— %{totalEnd}安全æ¼æ´žã€‚"
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr "%{retryButtonStart}é‡è¯•%{retryButtonEnd}或%{newFileButtonStart}添加新文件%{newFileButtonEnd}。"
@@ -709,6 +741,9 @@ msgstr "%{spanStart}于行%{spanEnd} %{errorLine}%{errorColumn}"
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr "%{spanStart}在%{spanEnd} %{errorFn}"
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr "从%{start}到%{end}"
@@ -879,6 +914,9 @@ msgstr "'%{name}'价值æµå·²åˆ›å»º"
msgid "'%{name}' Value Stream deleted"
msgstr "“%{name}â€ä»·å€¼æµå·²åˆ é™¤"
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr "“%{name}â€é˜¶æ®µå·²ç»å­˜åœ¨"
@@ -901,6 +939,9 @@ msgstr "(%{value})已被使用"
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr "(æ— å˜æ›´å†…容)"
@@ -913,9 +954,6 @@ msgstr "(检查进度)"
msgid "(deleted)"
msgstr "(已删除)"
-msgid "(line: %{startLine})"
-msgstr "(行: %{startLine})"
-
msgid "(max size 15 MB)"
msgstr "(最大 15 MB)"
@@ -940,9 +978,6 @@ msgstr "+ 其余%{moreCount}项"
msgid "+ %{numberOfHiddenAssignees} more"
msgstr "+ 其余 %{numberOfHiddenAssignees} æ¡"
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr "+ 还有%{numberOfHiddenReviewers}æ¡"
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] "+其余%d项"
@@ -1027,6 +1062,10 @@ msgid "1 deploy key"
msgid_plural "%d deploy keys"
msgstr[0] "%d个部署密钥"
+msgid "1 follower"
+msgid_plural "%{count} followers"
+msgstr[0] ""
+
msgid "1 group"
msgid_plural "%d groups"
msgstr[0] "%d 个群组"
@@ -1069,6 +1108,9 @@ msgstr "1-9项贡献"
msgid "10-19 contributions"
msgstr "10-19项贡献"
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr "最高贡献"
@@ -1189,6 +1231,9 @@ msgstr "群组在GitLab中代表您的组织。群组å¯ä»¥ç”¨æ¥ç®¡ç†ç”¨æˆ·å¹¶
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1288,6 +1333,102 @@ msgstr "API帮助"
msgid "API Token"
msgstr "API令牌"
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr "AWS访问密钥"
@@ -1541,9 +1682,6 @@ msgstr "添加GPG密钥"
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr "在监测部分的管ç†ä¾§æ æ·»åŠ ä¸€ä¸ª Grafana 按钮,以便访问关于GitLab è¿è¡ŒçŠ¶å†µå’Œæ€§èƒ½çš„å„ç§ç»Ÿè®¡æ•°æ®ã€‚"
-msgid "Add a To Do"
-msgstr "添加一个待办事项"
-
msgid "Add a bullet list"
msgstr "添加一个符å·åˆ—表"
@@ -1622,12 +1760,18 @@ 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 domain"
msgstr "添加域å"
msgid "Add email address"
msgstr "添加电å­é‚®ä»¶åœ°å€"
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr "添加环境"
@@ -1724,6 +1868,21 @@ msgstr "添加先å‰åˆå¹¶çš„æ交"
msgid "AddContextCommits|Add/remove"
msgstr "添加/删除"
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr "未指定用户。"
@@ -1784,6 +1943,9 @@ msgstr "添加一个待办事项."
msgid "Adds an issue to an epic."
msgstr "将议题添加到å²è¯—。"
+msgid "Adds email participant(s)"
+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 "请您调整上é¢çš„筛选器/æœç´¢æ¡ä»¶ã€‚如果您认为此处有误,请å‚阅 %{linkStart}Geo故障排除%{linkEnd}文档以获å–更多信æ¯ã€‚"
@@ -1844,6 +2006,9 @@ msgstr "å¼€å‘人员"
msgid "AdminArea|Features"
msgstr "功能"
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr "访客"
@@ -1964,6 +2129,12 @@ msgstr "转到常规设置"
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr "此处é…置的集æˆå°†è‡ªåŠ¨åº”用于此实例上的所有项目。"
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr "移动到集æˆ"
@@ -1988,6 +2159,9 @@ msgstr "æœåŠ¡æ¨¡æ¿å°†å¾ˆå¿«è¢«å¼ƒç”¨ã€‚"
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr "Service模æ¿å…许您设置集æˆçš„默认值"
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr "设置一个实例范围自动包å«çš„%{link_start}æµæ°´çº¿é…ç½®%{link_end}。 该æµæ°´çº¿é…置将在项目本身的é…ç½®åŽè¿è¡Œã€‚"
@@ -1997,6 +2171,9 @@ msgstr "æŸäº›è®¾ç½®å·²ç§»åŠ¨"
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
msgstr "为æ¯ä¸ªé¡¹ç›®çš„自动审阅应用 (Auto Review Apps) 和自动部署 (Auto Deploy) 阶段指定一个默认使用的域。"
+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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr "强制æµæ°´çº¿é…ç½®å¯ä»Ž%{link_start}实例模æ¿åº“%{link_end}中%{code_start}gitlab-ci%{code_end}目录选择或使用GitLabæ供的é…置。"
@@ -2072,6 +2249,9 @@ msgstr "激活用户%{username}å—?"
msgid "AdminUsers|Active"
msgstr "活跃"
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr "管ç†å‘˜"
@@ -2165,6 +2345,15 @@ msgstr "除éžæ˜Žç¡®æŽˆäºˆè®¿é—®æƒé™ï¼Œå¦åˆ™å¤–部用户无法查看内部或
msgid "AdminUsers|For more information, please refer to the %{link_start}user account deletion documentation.%{link_end}"
msgstr "欲了解更多信æ¯ï¼Œè¯·å‚阅 %{link_start}用户å¸æˆ·åˆ é™¤æ–‡æ¡£ã€‚%{link_end}"
+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 "正在使用许å¯å¸­ä½"
@@ -2174,6 +2363,9 @@ msgstr "自己ï¼"
msgid "AdminUsers|Log in"
msgstr "登录"
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr "新用户"
@@ -2258,6 +2450,12 @@ msgstr "å–消ç¦ç”¨ç”¨æˆ·"
msgid "AdminUsers|Unblock user %{username}?"
msgstr "å–消ç¦ç”¨ç”¨æˆ·%{username}å—?"
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr "用户将无法访问git仓库"
@@ -2267,6 +2465,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr "用户é‡æ–°ç™»å½•åŽï¼Œå…¶å¸æˆ·å°†æ¢å¤ä¸ºå®Œå…¨æœ‰æ•ˆçš„å¸æˆ·"
@@ -2300,6 +2510,21 @@ 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 "管ç†"
@@ -2324,6 +2549,9 @@ msgstr "使用Elasticsearch进行高级æœç´¢"
msgid "Advanced Settings"
msgstr "高级设置"
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr "高级æƒé™ï¼Œå¤§æ–‡ä»¶å­˜å‚¨(LFS)å’ŒåŒé‡è®¤è¯è®¾ç½®ã€‚"
@@ -2388,9 +2616,6 @@ msgstr "授æƒå¤–部æœåŠ¡"
msgid "AlertManagement|Create incident"
msgstr "创建事件"
-msgid "AlertManagement|Critical"
-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 "在 GitLab中直接显示æ¥è‡ªæ‚¨æ‰€æœ‰ç›‘测工具的警报。简化对您警报的调查和事件警报的å‡çº§ã€‚"
@@ -2403,24 +2628,12 @@ msgstr "环境"
msgid "AlertManagement|Events"
msgstr "事件"
-msgid "AlertManagement|High"
-msgstr "高"
-
msgid "AlertManagement|Incident"
msgstr "事件"
-msgid "AlertManagement|Info"
-msgstr "ä¿¡æ¯"
-
msgid "AlertManagement|Key"
msgstr "é”®"
-msgid "AlertManagement|Low"
-msgstr "低"
-
-msgid "AlertManagement|Medium"
-msgstr "中"
-
msgid "AlertManagement|Metrics"
msgstr "指标"
@@ -2481,9 +2694,6 @@ 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 To-Do of the alert."
-msgstr "更新警报待办事项时出错。请å†è¯•ä¸€æ¬¡ã€‚"
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr "更新指派åå•æ—¶å‡ºçŽ°äº†é”™è¯¯ï¼Œè¯·é‡è¯•ã€‚"
@@ -2493,6 +2703,9 @@ 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 "此警报无法被分é…给该用户。"
@@ -2502,9 +2715,6 @@ msgstr "工具"
msgid "AlertManagement|Triggered"
msgstr "触å‘"
-msgid "AlertManagement|Unknown"
-msgstr "未知"
-
msgid "AlertManagement|Value"
msgstr "值"
@@ -2529,50 +2739,17 @@ 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 "标题为在 GitLab中警报的必填字段。如果您指定的负载字段ä¸å¯ç”¨ï¼Œè¯·æŒ‡æ˜Žåº”该使用哪个字段。"
-msgid "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr "查看外部æœåŠ¡çš„文档以了解将此信æ¯æ供给外部æœåŠ¡çš„ä½ç½®ï¼Œä»¥åŠ%{linkStart}GitLab文档%{linkEnd}æ¥äº†è§£æœ‰å…³é…置端点的更多信æ¯ã€‚"
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr "您必须æ供此URL和授æƒå¯†é’¥æ‰èƒ½æŽˆæƒå¤–部æœåŠ¡å°†è­¦æŠ¥å‘é€åˆ°GitLab。您å¯ä»¥æ供此URL和多个æœåŠ¡çš„密钥。é…置外部æœåŠ¡åŽï¼Œæ¥è‡ªæ‚¨æœåŠ¡çš„警报将显示在GitLab%{linkStart}警报%{linkEnd}页é¢ä¸Šã€‚"
-
-msgid "AlertSettings|1. Select integration type"
-msgstr "1. 选择集æˆç±»åž‹"
-
-msgid "AlertSettings|2. Name integration"
-msgstr "2. 集æˆå称"
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr "3. 设置webhook"
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr "4. 示例警报负载(å¯é€‰)"
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr "5. 映射字段 (å¯é€‰)"
-
-msgid "AlertSettings|API URL"
-msgstr "API网å€"
-
-msgid "AlertSettings|Active"
-msgstr "å¯ç”¨"
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr "å°†URLå’Œauth密钥添加到Prometheusé…置文件中"
-
-msgid "AlertSettings|Add new integrations"
-msgstr "添加新的集æˆ"
-
-msgid "AlertSettings|Alert test payload"
-msgstr "警报测试数æ®"
+msgid "AlertSettings|Add new integration"
+msgstr ""
msgid "AlertSettings|Authorization key"
msgstr "授æƒå¯†é’¥"
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
-msgstr "授æƒå¯†é’¥å·²æˆåŠŸé‡ç½®ã€‚请立å³ä¿å­˜æ‚¨çš„更改。"
+msgid "AlertSettings|Configure details"
+msgstr ""
-msgid "AlertSettings|Copy"
-msgstr "å¤åˆ¶"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
+msgstr ""
msgid "AlertSettings|Delete integration"
msgstr "删除集æˆ"
@@ -2583,9 +2760,6 @@ msgstr "编辑负载"
msgid "AlertSettings|Enter integration name"
msgstr "输入集æˆå称"
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr "输入测试警告JSON ..."
-
msgid "AlertSettings|External Prometheus"
msgstr "外部Prometheus"
@@ -2595,77 +2769,56 @@ msgstr "HTTP 端点"
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr "如果您编辑负载,将会é‡ç½®å·²ä¿å­˜çš„映射,您需è¦é‡æ–°æ˜ å°„字段。"
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
-msgstr "如果您æ供了示例警报负载,就å¯ä»¥ä¸ºç«¯ç‚¹åˆ›å»ºè‡ªå®šä¹‰æ˜ å°„。 下é¢åˆ—出默认的GitLab警报键。请定义哪个负载键应该映射到指定的GitLab键。"
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
+msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr "在 GitLabçš„å…费版本中,æ¯ç§ç±»åž‹åªèƒ½æ·»åŠ ä¸€ä¸ªé›†æˆã€‚ %{linkStart}å‡çº§æ‚¨çš„订阅%{linkEnd}以添加更多集æˆã€‚"
-msgid "AlertSettings|Integration"
-msgstr "集æˆ"
+msgid "AlertSettings|Name integration"
+msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
-msgstr "了解更多我们å³å°†æŽ¨å‡ºçš„%{linkStart}集æˆ%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
+msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr "继续编辑"
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr "Prometheus API基础URL"
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
-msgstr "请æ供一个æ¥è‡ªæ¬²é›†æˆç›‘控工具的示例负载。 该负载å¯ç”¨äºŽåˆ›å»ºè‡ªå®šä¹‰æ˜ å°„(å¯é€‰),或测试集æˆ(也å¯é€‰)。"
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
+msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
-msgstr "请æ供一个æ¥è‡ªæ¬²é›†æˆç›‘控工具的示例负载。 该负载å¯ç”¨äºŽæµ‹è¯•é›†æˆ(å¯é€‰)。"
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
+msgstr ""
msgid "AlertSettings|Reset Key"
msgstr "é‡ç½®é”®"
-msgid "AlertSettings|Reset key"
-msgstr "é‡ç½®å¯†é’¥"
-
msgid "AlertSettings|Reset the mapping"
msgstr "é‡ç½®æ˜ å°„"
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr "é‡ç½®æ­¤é¡¹ç›®çš„授æƒå¯†é’¥å°†éœ€è¦æ›´æ–°æ¯ä¸ªè­¦æŠ¥æºä¸­å¯ç”¨çš„授æƒå¯†é’¥ã€‚"
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr "查看外部æœåŠ¡çš„文档以了解将此信æ¯æ供给外部æœåŠ¡çš„ä½ç½®ï¼Œä»¥åŠ%{linkStart}GitLab文档%{linkEnd}æ¥äº†è§£æœ‰å…³é…置端点的更多信æ¯ã€‚"
+msgid "AlertSettings|Sample alert payload (optional)"
+msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr "已解æžç¤ºä¾‹è´Ÿè½½ã€‚您现在å¯ä»¥æ˜ å°„字段。"
-msgid "AlertSettings|Save and test payload"
-msgstr "ä¿å­˜å¹¶æµ‹è¯•è´Ÿè½½"
-
msgid "AlertSettings|Save integration"
msgstr "ä¿å­˜é›†æˆ"
msgid "AlertSettings|Select integration type"
msgstr "选择集æˆç±»åž‹"
-msgid "AlertSettings|Submit payload"
-msgstr "æ交负载"
-
-msgid "AlertSettings|Test alert payload"
-msgstr "测试警报数æ®"
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr "å·²æˆåŠŸå‘é€æµ‹è¯•è­¦æŠ¥ã€‚如果您已ç»åšäº†å…¶ä»–更改,请立å³ä¿å­˜ã€‚"
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
-msgstr "测试失败。您ä»ç„¶æƒ³è¦ä¿å­˜æ›´æ”¹å—?"
-
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr "更新警报设置时出错。"
+msgid "AlertSettings|Send"
+msgstr ""
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
-msgstr "å°è¯•é‡ç½®å¯†é’¥æ—¶å‡ºé”™ã€‚请刷新页é¢å†è¯•ä¸€æ¬¡ã€‚"
+msgid "AlertSettings|Send test alert"
+msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
msgstr "URLä¸èƒ½ä¸ºç©ºï¼Œå¿…须以http或https开头。"
@@ -2676,15 +2829,15 @@ msgstr "使用下é¢çš„URL和授æƒå¯†é’¥æŽˆæƒPrometheuså‘GitLabå‘é€è­¦æŠ¥ã€
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr "使用下é¢çš„URL和授æƒå¯†é’¥æŽˆæƒå¤–部æœåŠ¡å‘GitLabå‘é€è­¦æŠ¥ã€‚查看外部æœåŠ¡æ–‡æ¡£ä»¥äº†è§£åœ¨ä½•å¤„添加这些详细信æ¯ï¼Œä»¥åŠæŸ¥é˜…%{linkStart}GitLab文档%{linkEnd}以了解有关é…置端点的更多信æ¯ã€‚"
+msgid "AlertSettings|View credentials"
+msgstr ""
+
msgid "AlertSettings|Webhook URL"
msgstr "Webhook网å€"
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 "您现在å¯ä»¥åœ¨è¿ç»´è®¾ç½®é¡µé¢ä¸Šçš„警报部分中为手动é…置的Prometheus实例设置警报端点。此页é¢ä¸Šçš„警报端点字段已被弃用。"
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr "您必须æ供此URL和授æƒå¯†é’¥æ‰èƒ½æŽˆæƒå¤–部æœåŠ¡å°†è­¦æŠ¥å‘é€åˆ°GitLab。您å¯ä»¥æ供此URL和多个æœåŠ¡çš„密钥。é…置外部æœåŠ¡åŽï¼Œæ¥è‡ªæ‚¨æœåŠ¡çš„警报将显示在GitLab%{linkStart}警报%{linkEnd}页é¢ä¸Šã€‚"
-
msgid "AlertSettings|Your integration was successfully updated."
msgstr "您的集æˆå·²æˆåŠŸæ›´æ–°ã€‚"
@@ -2694,9 +2847,6 @@ msgstr "{ \"events\": [{ \"application\": \"应用å称\" }] }"
msgid "Alerts"
msgstr "警报"
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr "警报将通过此集æˆåˆ›å»º"
@@ -2709,8 +2859,8 @@ msgstr "当å‰é›†æˆ"
msgid "AlertsIntegrations|Integration Name"
msgstr "集æˆå称"
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
-msgstr "集æˆè´Ÿè½½æ— æ•ˆã€‚您ä»ç„¶å¯ä»¥ä¿å­˜æ‚¨çš„更改。"
+msgid "AlertsIntegrations|Integration payload is invalid."
+msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
msgstr "尚未添加任何集æˆ"
@@ -2796,9 +2946,6 @@ msgstr "所有项目"
msgid "All projects selected"
msgstr "已选择所有项目"
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr "所有安全扫æ都已å¯ç”¨ï¼Œå› ä¸ºæ­¤é¡¹ç›®å·²å¼€å¯äº†%{linkStart}Auto DevOps%{linkEnd}"
-
msgid "All threads resolved"
msgstr "所有主题已解决"
@@ -2859,8 +3006,8 @@ msgstr "å…许Webhookå’ŒæœåŠ¡å¯¹æœ¬åœ°ç½‘络的请求"
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr "å…许副组设置自己的åŒé‡èº«ä»½éªŒè¯è§„则"
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
-msgstr "åŒæ—¶å…许此秘钥推é€æ–‡ä»¶åˆ°ä»“库å—?(默认åªæ‹¥æœ‰æ‹‰å–æƒé™)"
+msgid "Allow this key to push to this repository"
+msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr "å…许此次è¦èŠ‚点在对象存储上å¤åˆ¶å†…容"
@@ -2901,6 +3048,9 @@ msgstr "这里å¯ä»¥æ·»åŠ å’Œç®¡ç† Kubernetes 集群。"
msgid "Almost there"
msgstr "å³å°†å®Œæˆ"
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr "已被阻止"
@@ -2967,12 +3117,6 @@ msgstr "如果ä¸å­˜åœ¨ç´¢å¼•ï¼Œå°†åˆ›å»ºä¸€ä¸ªç©ºç´¢å¼•ã€‚"
msgid "An error has occurred"
msgstr "å‘生错误"
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr "å‘主题添加è‰ç¨¿æ—¶å‡ºé”™ã€‚"
@@ -3051,12 +3195,18 @@ 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 branches. Retry the search."
msgstr "获å–分支时å‘生错误,请é‡è¯•æœç´¢ã€‚"
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr "获å–æ交时å‘生错误,请é‡è¯•æœç´¢ã€‚"
@@ -3081,6 +3231,9 @@ msgstr "获å–标记颜色时出错。"
msgid "An error occurred while fetching markdown preview"
msgstr "èŽ·å– markdown 预览时出错"
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr "获å–待处ç†è¯„论时å‘生错误"
@@ -3174,6 +3327,9 @@ msgstr "加载åˆå¹¶è¯·æ±‚æ—¶å‘生错误。"
msgid "An error occurred while loading project creation UI"
msgstr "加载项目创建界é¢æ—¶å‘生错误"
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr "加载数æ®æ—¶å‡ºé”™ã€‚请é‡è¯•ã€‚"
@@ -3201,12 +3357,18 @@ 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 "å‘é€è¯·æ±‚æ—¶å‘生错误。"
@@ -3249,8 +3411,11 @@ msgstr "获å–差异文件时å‘生错误"
msgid "An error occurred while retrieving projects."
msgstr "获å–项目时å‘生错误。"
-msgid "An error occurred while saving assignees"
-msgstr "ä¿å­˜è¢«æŒ‡æ´¾äººæ—¶å‡ºçŽ°é”™è¯¯ã€‚"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
+msgstr ""
msgid "An error occurred while subscribing to notifications."
msgstr "订阅通知时å‘生错误。"
@@ -3288,6 +3453,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr "更新里程碑时出错。"
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr "验è¯ç¾¤ç»„路径时å‘生错误"
@@ -3300,12 +3468,12 @@ msgstr "出现错误。请é‡æ–°ç™»å½•ã€‚"
msgid "An error occurred. Please try again."
msgstr "å‘生了错误,请å†è¯•ä¸€æ¬¡ã€‚"
-msgid "An error ocurred while loading your content. 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 "显示如何在GitLab动æ€å­æµæ°´çº¿ä¸­ä½¿ç”¨Jsonnet的示例"
@@ -3658,9 +3826,6 @@ msgstr "确定è¦å–消编辑此评论å—?"
msgid "Are you sure you want to close this blocked issue?"
msgstr "您确定è¦å…³é—­æ­¤è¢«å—阻的议题å—?"
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr "您确定è¦åˆ é™¤â€œ%{name}â€ä»·å€¼æµå—?"
-
msgid "Are you sure you want to delete %{name}?"
msgstr "您确定è¦åˆ é™¤%{name}å—?"
@@ -3688,6 +3853,9 @@ 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 erase this build?"
msgstr "您确定è¦åˆ é™¤è¿™ä¸ªæž„建å—?"
@@ -3946,12 +4114,6 @@ msgstr[0] "添加%d个附件"
msgid "Attaching the file failed."
msgstr "添加附件失败。"
-msgid "Attachment"
-msgstr "附件"
-
-msgid "Attachments"
-msgstr "附件"
-
msgid "Audit Events"
msgstr "审计事件"
@@ -4024,6 +4186,9 @@ msgstr "ç»è¿‡èº«ä»½éªŒè¯çš„web请求速率é™åˆ¶"
msgid "Authenticating"
msgstr "认è¯"
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr "认è¯å¤±è´¥"
@@ -4450,6 +4615,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr "加载收费æˆå‘˜åˆ—表时å‘生错误"
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4462,12 +4630,24 @@ msgstr "无用户å¯æ˜¾ç¤ºã€‚"
msgid "Billing|Private"
msgstr "ç§æœ‰"
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 "BitbucketæœåŠ¡å™¨å¯¼å…¥"
@@ -4535,6 +4715,12 @@ 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 "读å–看æ¿è®®é¢˜æ—¶å‡ºé”™ã€‚请é‡è¯•ã€‚"
@@ -4625,12 +4811,6 @@ msgstr "分支å称"
msgid "Branch not loaded - %{branchId}"
msgstr "分支未载入 - %{branchId}"
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr "æœç´¢åˆ†æ”¯"
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr "切æ¢åˆ†æ”¯"
-
msgid "Branches"
msgstr "分支"
@@ -4799,16 +4979,28 @@ msgstr "并å‘批é‡è¯·æ±‚"
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4823,6 +5015,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr "需与群组关è”但是当å‰ä¸Žé¡¹ç›®å…³è”"
@@ -4856,6 +5051,12 @@ msgstr "商业"
msgid "Business metrics (Custom)"
msgstr "业务指标(自定义)"
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr "购买许å¯è¯"
@@ -4874,6 +5075,9 @@ msgstr "å•å‡»æ³¨å†Œå³ä»£è¡¨æˆ‘åŒæ„我已ç»é˜…读并接å—%{company_name}%{l
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr "默认情况下,GitLab 以 HTML 和纯文本格å¼å‘é€ç”µå­é‚®ä»¶ï¼Œå› æ­¤é‚®ä»¶å®¢æˆ·ç«¯å¯ä»¥é€‰æ‹©ä½¿ç”¨å“ªç§æ ¼å¼ã€‚如果您åªæƒ³ä»¥çº¯æ–‡æœ¬æ ¼å¼å‘é€ç”µå­é‚®ä»¶ï¼Œè¯·ç¦ç”¨æ­¤é€‰é¡¹ã€‚"
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr "默认情况下,所有项目和群组将使用全局通知设置。"
@@ -4925,6 +5129,25 @@ msgstr "为外部仓库设置的CI/CD"
msgid "CI/CD settings"
msgstr "CI/CD 设置"
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5060,6 +5283,9 @@ msgstr ""
msgid "Cancel"
msgstr "å–消"
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr "å–消删除索引æ“作"
@@ -5213,12 +5439,6 @@ msgstr "审核者已更改为 %{new}"
msgid "ChangeReviewer|Unassigned"
msgstr "未分é…"
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr "选择分支"
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr "还原分支"
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5363,6 +5583,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr "检查您的Dockeré•œåƒæ˜¯å¦å­˜åœ¨å·²çŸ¥æ¼æ´ž."
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr "正在检查%{text}çš„å¯ç”¨æ€§..."
@@ -5585,8 +5808,8 @@ msgstr "选择指定群组或存储片"
msgid "Choose the top-level group for your repository imports."
msgstr "选择仓库导入的顶级群组。"
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
-msgstr "选择å¯è§æ€§çº§åˆ«ï¼Œå¯ç”¨/ç¦ç”¨é¡¹ç›®åŠŸèƒ½ï¼ˆè®®é¢˜ï¼Œä»“库,wiki,代ç ç‰‡æ®µï¼‰å¹¶è®¾ç½®æƒé™ã€‚"
+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 "选择您想è¦åœ¨ç¾¤ç»„概览页é¢æŸ¥çœ‹çš„内容。"
@@ -5600,6 +5823,9 @@ msgstr "请选择è¦è¿žæŽ¥å¹¶è¿è¡Œ CI/CD æµæ°´çº¿çš„代ç ä»“库。"
msgid "Choose your framework"
msgstr "选择你的框架"
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr "å·²å–消"
@@ -5933,21 +6159,42 @@ msgstr "集群级别"
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr "Stages::ClusterEndpointInserter需è¦é›†ç¾¤ç±»åž‹"
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr "加载您的GitLab Agentæ—¶å‘生错误"
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr "é…ç½®"
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr "将您的集群连接到GitLab Agent"
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr "å°†Kubernetes与GitLab Agent集æˆ"
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr "与GitLab Agent集æˆ"
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr "å称"
@@ -5957,9 +6204,21 @@ msgstr "GitLab Agent也需è¦%{linkStart}å¯ç”¨ä»£ç†æœåŠ¡å™¨%{linkEnd}"
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr "GitLab Kubernetes Agent通过基础设施å³ä»£ç ï¼ŒGitOps方法æ¥å®žçŽ°Kubernetes集群与GitLab的集æˆã€‚ %{linkStart}了解更多信æ¯ã€‚%{linkEnd}"
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr "此功能仅适用于高级计划"
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr "用户æƒé™ä¸è¶³ï¼Œæ— æ³•ä¸ºæ­¤é¡¹ç›®åˆ›å»ºä»¤ç‰Œ"
@@ -6968,6 +7227,9 @@ msgstr "加载集群时å‘生了错误"
msgid "Code"
msgstr "代ç "
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr "代ç è¦†ç›–率: %{coveragePercentage}%{percentSymbol}"
@@ -7037,6 +7299,9 @@ msgstr "折å æ‰€æœ‰ä¸»é¢˜"
msgid "Collapse approvers"
msgstr "折å æ ¸å‡†äºº"
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr "折å é‡Œç¨‹ç¢‘"
@@ -7221,17 +7486,41 @@ msgstr "与以å‰çš„版本比较"
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr "%{source_branch} å’Œ %{target_branch} 是相åŒçš„"
-msgid "CompareBranches|Compare"
-msgstr "比较"
+msgid "CompareBranches|There isn't anything to compare."
+msgstr "无需比较。"
-msgid "CompareBranches|Source"
-msgstr "æºåˆ†æ”¯"
+msgid "CompareRevisions|Branches"
+msgstr ""
-msgid "CompareBranches|Target"
-msgstr "目标分支"
+msgid "CompareRevisions|Compare"
+msgstr ""
-msgid "CompareBranches|There isn't anything to 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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
+msgstr ""
msgid "Complete"
msgstr "完æˆ"
@@ -7245,6 +7534,12 @@ msgstr "åˆè§„"
msgid "Compliance Dashboard"
msgstr "åˆè§„仪表æ¿"
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr "åˆè§„框架(å¯é€‰)"
@@ -7257,9 +7552,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7275,6 +7600,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr "GDPR"
@@ -7287,6 +7621,9 @@ msgstr "HIPAA"
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr "HIPAA - å¥åº·ä¿é™©æµé€šä¸Žè´£ä»»æ³•æ¡ˆ"
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr "PCI-DSS"
@@ -7326,6 +7663,9 @@ msgstr "é…ç½® GitLab Runner 以开始使用Web终端。 %{helpStart}了解更å¤
msgid "Configure Gitaly timeouts."
msgstr "é…ç½®Gitaly超时时间。"
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr "é…ç½®Let's Encrypt"
@@ -7347,6 +7687,9 @@ msgstr "é…置现有安装"
msgid "Configure limit for issues created per minute by web and API requests."
msgstr "é…ç½®æ¯åˆ†é’Ÿç”±ç½‘页和API请求创建议题数的é™åˆ¶ã€‚"
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr "é…置项目/群组的导入/导出é™åˆ¶ã€‚"
@@ -7401,9 +7744,6 @@ msgstr "Confluence工作区的URL"
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr "您的GitLab Wikiå¯ä»¥åœ¨æ­¤è®¿é—®ï¼š %{wiki_link}。è¦é‡æ–°å¯ç”¨æ‚¨çš„GitLab Wiki,请ç¦ç”¨æ­¤é›†æˆ"
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr "æ­å–œï¼æ‚¨å·²å¯ç”¨äº†åŒé‡è®¤è¯ï¼"
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7574,24 +7914,15 @@ msgstr "摘è¦: %{imageId}"
msgid "ContainerRegistry|Docker connection error"
msgstr "Docker连接错误"
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr "过期政策有助于优化容器镜åƒåº“使用的存储空间的管ç†ï¼Œä½†è¯¥é•œåƒåº“的过期政策已被ç¦ç”¨ã€‚ 请è”系您的管ç†å‘˜ä»¥å¯ç”¨ã€‚ %{docLinkStart}更多信æ¯%{docLinkEnd}"
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr "过期策略已ç¦ç”¨"
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr "到期策略将在%{time}åŽè¿è¡Œ"
-msgid "ContainerRegistry|Filter by name"
-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 "如果您尚未登录,您需è¦ä½¿ç”¨æ‚¨çš„GitLab用户å和密ç æ¥è¿›è¡Œèº«ä»½è®¤è¯ã€‚如果您å¯ç”¨ %{twofaDocLinkStart}åŒé‡èº«ä»½éªŒè¯%{twofaDocLinkEnd} ,请使用%{personalAccessTokensDocLinkStart}个人访问令牌%{personalAccessTokensDocLinkEnd}而ä¸æ˜¯å¯†ç ã€‚"
-msgid "ContainerRegistry|Image Repositories"
-msgstr "é•œåƒä»“库"
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8049,12 +8380,12 @@ msgstr "未找到设计."
msgid "Could not find iteration"
msgstr "未找到迭代"
-msgid "Could not load instance counts. Please refresh the page to try again."
-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 the trigger."
msgstr "无法删除触å‘器。"
@@ -8088,9 +8419,6 @@ msgstr "无法更新 wiki 页é¢"
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr "无法上传您的设计,因为ä¸æ”¯æŒå·²ä¸Šä¼ ä¸€ä¸ªæˆ–多个的文件。"
-msgid "Couldn't calculate number of %{issuables}."
-msgstr "无法计算%{issuables}的数目。"
-
msgid "Country"
msgstr "国家/地区"
@@ -8137,12 +8465,12 @@ msgstr "创建本地代ç†ï¼Œç”¨äºŽå­˜å‚¨å¸¸ç”¨çš„上游镜åƒã€‚%{link_start}äº
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 deploy key for this project"
-msgstr "为此项目创建一个新的部署密钥"
-
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr "当å‰æ— æ–‡ä»¶ã€‚请先创建一个新文件。然åŽæ‚¨å°†èƒ½å¤Ÿæ交您的更改。"
@@ -8167,6 +8495,9 @@ 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 "请创建并æ供您的GitHub%{link_start}个人访问令牌%{link_end}。您需è¦é€‰æ‹©%{code_open}repo%{code_close}范围,这样我们æ‰å¯ä»¥å‘您显示å¯å¯¼å…¥çš„公共和ç§æœ‰ä»“库的列表。"
+msgid "Create blank project"
+msgstr ""
+
msgid "Create branch"
msgstr "创建分支"
@@ -8194,6 +8525,9 @@ msgstr "创建文件"
msgid "Create from"
msgstr "创建自"
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr "创建群组"
@@ -8206,6 +8540,9 @@ msgstr "创建议题"
msgid "Create iteration"
msgstr "创建迭代"
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr "从标记创建列表,å«æœ‰è¯¥æ ‡è®°çš„议题将出现在相应的列中。"
@@ -8221,6 +8558,12 @@ msgstr "创建里程碑"
msgid "Create new"
msgstr "创建新的"
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr "创建新价值æµ"
@@ -8293,6 +8636,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8302,15 +8648,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8329,6 +8690,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8338,6 +8702,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8353,6 +8720,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8458,6 +8828,9 @@ msgstr "创建日期"
msgid "Credentials"
msgstr "凭æ®"
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr "找ä¸åˆ°å‡­è¯"
@@ -8506,14 +8879,14 @@ msgstr "当å‰æ¼æ´žæ•°é‡"
msgid "CurrentUser|Buy Pipeline minutes"
msgstr "è´­ä¹°æµæ°´çº¿åˆ†é’Ÿ"
+msgid "CurrentUser|Edit profile"
+msgstr ""
+
msgid "CurrentUser|One of your groups is running out"
msgstr "您的群组之一正在用完"
-msgid "CurrentUser|Profile"
-msgstr "用户资料"
-
-msgid "CurrentUser|Settings"
-msgstr "设置"
+msgid "CurrentUser|Preferences"
+msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
@@ -8539,8 +8912,8 @@ msgstr "自定义指标"
msgid "Custom notification events"
msgstr "自定义通知事件"
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
-msgstr "自定义通知级别继承自å‚与级别。使用自定义通知级别,您会收到å‚与级别åŠé€‰å®šäº‹ä»¶çš„通知。想了解更多信æ¯ï¼Œè¯·æŸ¥çœ‹ %{notification_link}."
+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 "自定义项目模æ¿"
@@ -8581,6 +8954,9 @@ msgstr "客户中心"
msgid "Customizable by an administrator."
msgstr "å¯ç”±ç®¡ç†å‘˜è‡ªå®šä¹‰ã€‚"
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr "自定义颜色"
@@ -8614,6 +8990,18 @@ 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 "议题关闭"
@@ -8777,8 +9165,8 @@ msgstr "阶段下拉列表"
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr "DAGå¯è§†åŒ–至少需è¦3个ä¾èµ–作业。"
-msgid "DAST Profiles"
-msgstr "DASTé…ç½®"
+msgid "DAST Scans"
+msgstr ""
msgid "DNS"
msgstr "DNS"
@@ -8933,8 +9321,14 @@ msgstr "新建扫æ工具é…ç½®"
msgid "DastProfiles|New site profile"
msgstr "新建站点é…ç½®"
-msgid "DastProfiles|No profiles created yet"
-msgstr "尚未创建é…ç½®"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
+msgstr ""
msgid "DastProfiles|Not Validated"
msgstr "未验è¯"
@@ -8957,6 +9351,9 @@ msgstr "é…ç½®å称"
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr "除了传统的爬虫之外,å¯ä»¥è¿è¡ŒAJAX爬虫æ¥é历目标站点。"
@@ -9038,6 +9435,9 @@ msgstr "å¤åˆ¶HTTP报头到剪贴æ¿"
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 "下载验è¯æ–‡æœ¬æ–‡ä»¶"
@@ -9047,6 +9447,9 @@ msgstr "报头验è¯"
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr "步骤 1 - 选择站点验è¯æ–¹æ³•"
@@ -9071,6 +9474,10 @@ 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] ""
+
msgid "DastSiteValidation|Validate"
msgstr "验è¯"
@@ -9089,6 +9496,9 @@ 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 "æ•°æ®ä»åœ¨è®¡ç®—中……"
@@ -9110,6 +9520,9 @@ msgstr "日期范围"
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr "日期范围ä¸èƒ½è¶…过%{maxDateRange}天。"
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr "一个月中的æ¯å¤©"
@@ -9134,6 +9547,9 @@ msgstr "åˆå¹¶æ‰€éœ€å¤©æ•°"
msgid "Dear Administrator,"
msgstr "亲爱的管ç†å‘˜ï¼Œ"
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr "调试"
@@ -9152,9 +9568,6 @@ msgstr "æ‹’ç»å¹¶é€€å‡º"
msgid "Decompressed archive size validation failed."
msgstr "解压归档大å°éªŒè¯å¤±è´¥ã€‚"
-msgid "Default Branch"
-msgstr "默认分支"
-
msgid "Default CI configuration path"
msgstr "默认CIé…置路径"
@@ -9209,6 +9622,9 @@ msgstr "使用 Cron 语法定义自定义模å¼"
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr "定义独立于Akismet的垃圾邮件自定义规则"
@@ -9239,6 +9655,9 @@ msgstr "已延时"
msgid "Delete"
msgstr "删除"
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr "删除%{name}"
@@ -9296,6 +9715,9 @@ msgstr "删除订阅"
msgid "Delete this attachment"
msgstr "删除此附件"
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr "删除用户列表"
@@ -9320,6 +9742,15 @@ msgstr "æ¢å¤é¡¹ç›®ä»“库失败。请è”系管ç†å‘˜ã€‚"
msgid "DeleteProject|Failed to restore wiki repository. Please contact the administrator."
msgstr "æ¢å¤wiki仓库失败。请è”系管ç†å‘˜ã€‚"
+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 "已删除"
@@ -9488,14 +9919,11 @@ msgstr "部署冻结"
msgid "Deploy key was successfully updated."
msgstr "部署密钥已æˆåŠŸæ›´æ–°ã€‚"
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr "部署密钥å…许以åªè¯»æˆ–读写(如果å¯ç”¨)模å¼è®¿é—®æ‚¨çš„仓库"
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
-msgstr "部署密钥å…许åªè¯»æˆ–读写(如果å¯ç”¨)访问您的仓库。 部署密钥å¯ä»¥ç”¨äºŽCI, 预å‘布或生产æœåŠ¡å™¨ã€‚您å¯ä»¥åˆ›å»ºä¸€ä¸ªéƒ¨ç½²å¯†é’¥æˆ–添加一个现有密钥。"
+msgid "Deploy keys"
+msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
-msgstr "部署密钥å¯ä»¥ç”¨äºŽ CI,预å‘布或生产æœåŠ¡å™¨ã€‚您å¯ä»¥åˆ›å»ºä¸€ä¸ªéƒ¨ç½²å¯†é’¥æˆ–添加一个现有密钥。"
+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 "未找到部署进度。è¦æŸ¥çœ‹pod,请确ä¿æ‚¨çš„环境符åˆ%{linkStart}部署看æ¿æ¡ä»¶%{linkEnd}。"
@@ -9503,6 +9931,9 @@ msgstr "未找到部署进度。è¦æŸ¥çœ‹pod,请确ä¿æ‚¨çš„环境符åˆ%{link
msgid "Deploy to..."
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|Freeze end"
msgstr "冻结结æŸ"
@@ -9512,15 +9943,12 @@ msgstr "冻结开始"
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr "此项目ä¸å­˜åœ¨éƒ¨ç½²å†»ç»“。如需添加,请点击%{strongStart}添加部署冻结%{strongEnd}"
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
-msgstr "指定环境ä¸å…许部署的时间。必须更新%{filename}文件,以使部署作业获得%{freeze_period_link_start}冻结期%{freeze_period_link_end}的相关信æ¯ã€‚"
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
+msgstr ""
msgid "DeployFreeze|Time zone"
msgstr "时区"
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr "您å¯ä»¥ä»…使用%{cron_syntax_link_start}cron语法%{cron_syntax_link_end}指定部署冻结。"
-
msgid "DeployKeys|+%{count} others"
msgstr "+%{count} 其他"
@@ -9545,6 +9973,9 @@ msgstr "移除部署密钥出错"
msgid "DeployKeys|Expand %{count} other projects"
msgstr "展开 %{count} 个其他项目"
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr "加载部署密钥"
@@ -9563,9 +9994,6 @@ msgstr "公开访问的部署密钥"
msgid "DeployKeys|Read access only"
msgstr "åªè¯»æƒé™"
-msgid "DeployKeys|Write access allowed"
-msgstr "写入æƒé™"
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr "å³å°†å°†åˆ é™¤è¯¥éƒ¨ç½²å¯†é’¥ã€‚确定继续å—?"
@@ -9575,20 +10003,20 @@ msgstr "å¯ç”¨éƒ¨ç½²ä»¤ç‰Œï¼ˆ%{active_tokens})"
msgid "DeployTokens|Add a deploy token"
msgstr "添加一个部署令牌"
-msgid "DeployTokens|Allows read access to the package registry"
-msgstr "å…许读å–软件包注册表"
+msgid "DeployTokens|Allows read access to the package registry."
+msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
-msgstr "å…许对容器镜åƒåº“é•œåƒè¿›è¡Œåªè¯»è®¿é—®"
+msgid "DeployTokens|Allows read-only access to registry images."
+msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
-msgstr "å…许对仓库进行åªè¯»è®¿é—®"
+msgid "DeployTokens|Allows read-only access to the repository."
+msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
-msgstr "å…许写入软件包注册表"
+msgid "DeployTokens|Allows write access to registry images."
+msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
-msgstr "å…许对容器镜åƒåº“é•œåƒè¿›è¡Œå†™å…¥è®¿é—®"
+msgid "DeployTokens|Allows write access to the package registry."
+msgstr ""
msgid "DeployTokens|Copy deploy token"
msgstr "å¤åˆ¶éƒ¨ç½²ä»¤ç‰Œ"
@@ -9602,11 +10030,8 @@ msgstr "创建部署令牌"
msgid "DeployTokens|Created"
msgstr "创建时间"
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr "默认格å¼ä¸ºâ€œgitlab+deploy-token-{n}â€ã€‚如果è¦æ›´æ”¹è¯·è¾“入自定义用户å。"
-
-msgid "DeployTokens|Deploy Tokens"
-msgstr "部署令牌"
+msgid "DeployTokens|Deploy tokens"
+msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
msgstr "部署令牌å…许访问软件包,您的代ç ä»“库和镜åƒåº“中的镜åƒã€‚"
@@ -9620,8 +10045,8 @@ msgstr "群组部署令牌å…许访问群组内的软件包,代ç ä»“库和容
msgid "DeployTokens|Name"
msgstr "å称"
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
-msgstr "请为应用程åºé€‰æ‹©ä¸€ä¸ªå称,以便生æˆå”¯ä¸€çš„部署令牌。"
+msgid "DeployTokens|Pick a name for your unique deploy token."
+msgstr ""
msgid "DeployTokens|Revoke"
msgstr "撤销"
@@ -9641,11 +10066,17 @@ msgstr "该%{entity_type}æ— å¯ç”¨çš„部署令牌。"
msgid "DeployTokens|This action cannot be undone."
msgstr "æ­¤æ“作无法撤消。"
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
-msgstr "此令牌和密ç ä½œç”¨ä¸€æ ·ã€‚当å‰çª—å£å…³é—­åŽå°†æ— æ³•å†æ¬¡æŸ¥çœ‹ä»¤ç‰Œå†…容,请立å³å¦¥å–„ä¿å­˜ã€‚"
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
+msgstr ""
+
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+msgstr ""
-msgid "DeployTokens|Use this username as a login."
-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 "用户å"
@@ -9653,8 +10084,8 @@ msgstr "用户å"
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr "您将è¦æ’¤é”€%{b_start}%{name}%{b_end}。"
-msgid "DeployTokens|Your New Deploy Token"
-msgstr "新部署令牌"
+msgid "DeployTokens|Your new Deploy Token username"
+msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
msgstr "您的新群租部署令牌已创建。"
@@ -9683,6 +10114,9 @@ msgstr "使用GitLabè½»æ¾éƒ¨ç½²åˆ° AWS"
msgid "Deployment Frequency"
msgstr "部署频率"
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9692,15 +10126,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9710,6 +10135,10 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+
msgid "Deployment|API"
msgstr "API"
@@ -9932,18 +10361,6 @@ msgstr "检测主机密钥"
msgid "DevOps Report"
msgstr "DevOps报告"
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr "已达到最大选择数"
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr "ä¸èƒ½åŒæ—¶ä¸ºé¡¹ç›®å’Œç¾¤ç»„é…置选择"
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr "已达到最大阶段数"
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr "已达到最大选择数"
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -9959,16 +10376,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr "核准"
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -9989,10 +10406,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10001,18 +10415,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr "议题"
@@ -10025,9 +10433,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr "å称"
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10037,6 +10442,12 @@ 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 ""
@@ -10064,6 +10475,9 @@ msgstr "DevOps"
msgid "DevopsReport|DevOps Score"
msgstr "DevOps分数"
+msgid "DevopsReport|DevOps score metrics are based on usage over the last 30 days. Last updated: %{timestamp}."
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr "分数"
@@ -10175,8 +10589,8 @@ msgstr "æ供此页é¢çš„å馈"
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr "安全能力,整åˆåˆ°æ‚¨çš„å¼€å‘生命周期中"
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
-msgstr "查看%{linkStart}金牌计划%{linkEnd}的其他功能"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
+msgstr ""
msgid "Discover|Start a free trial"
msgstr "开始å…费试用"
@@ -10377,6 +10791,9 @@ msgstr "è‰ç¨¿åˆå¹¶è¯·æ±‚ä¸èƒ½åˆå¹¶ã€‚"
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr "拖放或%{linkStart}上传%{linkEnd}设计以附加"
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr "拖放或%{linkStart}上传%{linkEnd}文件以附加"
@@ -10569,11 +10986,11 @@ msgstr "电å­é‚®ä»¶%{number}"
msgid "Email Notification"
msgstr "电å­é‚®ä»¶é€šçŸ¥"
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
-msgstr "电å­é‚®ä»¶ä¸èƒ½ä¸ºç©º"
+msgid "Email address to use for Support Desk"
+msgstr ""
msgid "Email could not be sent"
msgstr "邮件无法å‘é€"
@@ -10641,12 +11058,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr "é‡ç½®ä»¤ç‰Œ"
-
-msgid "EmailToken|resetting..."
-msgstr "正在é‡ç½®..."
-
msgid "Emails"
msgstr "电å­é‚®ä»¶"
@@ -10767,6 +11178,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr "在电å­é‚®ä»¶ä¸­å¯ç”¨é¡µçœ‰å’Œé¡µè„š"
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr "å¯ç”¨é›†æˆ"
@@ -10932,20 +11346,14 @@ msgstr "输入议题数é‡"
msgid "Enter one or more user ID separated by commas"
msgstr "输入一个或多个用逗å·åˆ†éš”的用户ID"
-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 issue description"
-msgstr "输入议题æè¿°"
-
-msgid "Enter the issue title"
-msgstr "输入议题标题"
+msgid "Enter the %{name} description"
+msgstr ""
-msgid "Enter the merge request description"
-msgstr "输入åˆå¹¶è¯·æ±‚说明"
+msgid "Enter the %{name} title"
+msgstr ""
-msgid "Enter the merge request 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 name of your application, and we'll return a unique %{type}."
msgstr "输入您的应用程åºçš„å称,我们会返回唯一的%{type}。"
@@ -11229,6 +11637,9 @@ msgstr "å—ä¿æŠ¤çš„"
msgid "Epic"
msgstr "å²è¯—"
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr "找ä¸åˆ°å²è¯—。"
@@ -11253,6 +11664,12 @@ 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 "添加一个新的å²è¯—。"
@@ -11280,6 +11697,9 @@ msgstr "我该如何解决该问题?"
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr "留空以继承里程碑日期"
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr "删除å²è¯—"
@@ -11307,6 +11727,9 @@ 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 "获å–群组å²è¯—时出错。"
@@ -11331,9 +11754,6 @@ msgstr "该æ“作也会从%{bStart}%{parentEpicTitle}%{bEnd}中移除%{bStart}%{
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 "如需根æ®é‡Œç¨‹ç¢‘æ¥å®‰æŽ’å²è¯—çš„ %{epicDateType} 日期,请为å²è¯—中的任一议题指定带有 %{epicDateType} 日期的里程碑。"
-msgid "Epics|Unable to perform this action"
-msgstr "无法执行此æ“作"
-
msgid "Epics|Unable to save epic. Please try again"
msgstr "无法ä¿å­˜å²è¯—。请å†è¯•ä¸€æ¬¡"
@@ -11508,6 +11928,9 @@ msgstr "更新代ç ç‰‡æ®µå‡ºé”™"
msgid "Error uploading file"
msgstr "上传文件时出错"
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr "上传文件时出错: %{stripped}"
@@ -11673,6 +12096,9 @@ msgstr ""
msgid "Evidence collection"
msgstr "凭è¯é›†"
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr "其中的一个%{attributes}是必需的"
@@ -11688,6 +12114,9 @@ msgstr "示例:使用é‡=å•ä¸€æŸ¥è¯¢ã€‚(请求)/(容é‡)=å½¢æˆå…¬å¼çš„多é‡
msgid "Except policy:"
msgstr "除外(Except)æ¡ä»¶ï¼š"
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr "超é¢å­˜å‚¨"
@@ -11730,6 +12159,9 @@ msgstr "展开核准人"
msgid "Expand file"
msgstr "展开文件"
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr "展开里程碑"
@@ -11766,6 +12198,9 @@ msgstr "到期"
msgid "Expires at"
msgstr "到期时间"
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr "在 %{expires_at} 过期"
@@ -11799,6 +12234,9 @@ msgstr "æµè§ˆå…¬å¼€ç¾¤ç»„"
msgid "Export"
msgstr "导出"
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr "导出为 CSV"
@@ -11922,12 +12360,12 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr "创建åˆå¹¶è¯·æ±‚失败。请é‡è¯•ã€‚"
-msgid "Failed to create To-Do for the design."
-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 "创建框架失败"
@@ -11952,6 +12390,12 @@ msgstr "无法部署到"
msgid "Failed to enqueue the rebase operation, possibly due to a long-lived transaction. Try again later."
msgstr "无法将rebaseæ“作加入队列,å¯èƒ½æ˜¯ç”±äºŽäº‹åŠ¡æ—¶é—´è¿‡é•¿ã€‚ç¨åŽå†è¯•ã€‚"
+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 "找ä¸åˆ°ç”¨äºŽJira导入的导入标记。"
@@ -11988,9 +12432,6 @@ msgstr "无法从Sentry加载错误."
msgid "Failed to load group activity metrics. Please try again."
msgstr "加载群组活动度é‡æŒ‡æ ‡å¤±è´¥ã€‚请é‡è¯•ã€‚"
-msgid "Failed to load groups & users."
-msgstr "加载群组和用户失败。"
-
msgid "Failed to load groups, users and deploy keys."
msgstr "无法加载群组,用户和部署密钥。"
@@ -12006,9 +12447,6 @@ msgstr "加载项目失败"
msgid "Failed to load related branches"
msgstr "加载相关分支失败"
-msgid "Failed to load sidebar confidential toggle"
-msgstr "加载侧边æ æœºå¯†å¼€å…³å¤±è´¥"
-
msgid "Failed to load sidebar lock status"
msgstr "加载侧边æ é”状æ€å¤±è´¥"
@@ -12042,12 +12480,12 @@ msgstr "ä¿æŠ¤çŽ¯å¢ƒå¤±è´¥"
msgid "Failed to publish issue on status page."
msgstr "在状æ€é¡µä¸Šå‘布议题失败。"
-msgid "Failed to remove To-Do for the design."
-msgstr "无法删除设计的待办事项。"
-
msgid "Failed to remove a Zoom meeting"
msgstr "无法删除Zoom会议"
+msgid "Failed to remove a to-do item for the design."
+msgstr ""
+
msgid "Failed to remove issue from board, please try again."
msgstr "无法从看æ¿ç§»é™¤è®®é¢˜ï¼Œè¯·é‡è¯•ã€‚"
@@ -12090,8 +12528,8 @@ msgstr "无法对此议题设置迭代。请å†è¯•ä¸€é。"
msgid "Failed to signing using smartcard authentication"
msgstr "无法使用智能å¡èº«ä»½éªŒè¯è¿›è¡Œç™»å½•"
-msgid "Failed to toggle To-Do for the design."
-msgstr "无法为开关设计的待办事项。"
+msgid "Failed to toggle the to-do status for the design."
+msgstr ""
msgid "Failed to update branch!"
msgstr "更新分支失败ï¼"
@@ -12108,9 +12546,6 @@ msgstr "更新议题状æ€å¤±è´¥"
msgid "Failed to update issues, please try again."
msgstr "更新议题失败, 请é‡è¯•"
-msgid "Failed to update tag!"
-msgstr "更新标签失败ï¼"
-
msgid "Failed to update the Canary Ingress."
msgstr "无法更新Canary Ingress。"
@@ -12153,6 +12588,9 @@ msgstr "功能标志"
msgid "Feature flag is not enabled on the environment's project."
msgstr "此环境所属项目上没有å¯ç”¨åŠŸèƒ½æ ‡è®°ã€‚"
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr "功能标志未被删除。"
@@ -12646,6 +13084,15 @@ msgstr "FogBugz导入"
msgid "Folder/%{name}"
msgstr "文件夹/%{name}"
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr "字体颜色"
@@ -12709,6 +13156,42 @@ msgstr "派生项目"
msgid "Fork project?"
msgstr "派生项目?"
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr "派生自"
@@ -12739,8 +13222,8 @@ msgstr "框架删除æˆåŠŸ"
msgid "Free Trial"
msgstr "å…费试用"
-msgid "Free Trial of GitLab.com Gold"
-msgstr "å…费试用gitlab.comçš„Gold计划"
+msgid "Free Trial of GitLab.com Ultimate"
+msgstr ""
msgid "Freeze end"
msgstr "冻结结æŸ"
@@ -12817,9 +13300,6 @@ msgstr "Geo"
msgid "Geo Nodes"
msgstr "Geo 节点"
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr "如果次è¦èŠ‚点存在,则ä¸èƒ½åˆ é™¤ä¸»è¦èŠ‚点。"
@@ -12832,6 +13312,9 @@ msgstr "Geo设置"
msgid "Geo nodes are paused using a command run on the node"
msgstr "使用在节点上è¿è¡Œçš„命令æ¥æš‚åœGeo节点"
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr "%{timeAgoStr} (%{pendingEvents}事件)"
@@ -12979,6 +13462,9 @@ msgstr "%{name} 已计划é‡æ–°åŒæ­¥"
msgid "Geo|%{name} is scheduled for re-verify"
msgstr "%{name}已计划é‡æ–°éªŒè¯"
+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 "请您调整上é¢çš„筛选器/æœç´¢æ¡ä»¶ã€‚如果您认为此处有误,请å‚阅 %{linkStart}Geo Troubleshow%{linkEnd} 文档以获å–更多信æ¯ã€‚"
@@ -13018,6 +13504,9 @@ msgstr "无法删除现有项目的跟踪æ¡ç›®ã€‚"
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr "无法删除现有上传的跟踪æ¡ç›®ã€‚"
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr "失败"
@@ -13027,6 +13516,9 @@ msgstr "按状æ€ç­›é€‰"
msgid "Geo|Geo Status"
msgstr "Geo状æ€"
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr "转到主站点"
@@ -13051,6 +13543,12 @@ msgstr "最近一次å°è¯•åŒæ­¥"
msgid "Geo|Last time verified"
msgstr "最近一次验è¯"
+msgid "Geo|Learn more about Geo"
+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 "从ä¸"
@@ -13078,6 +13576,9 @@ msgstr "请å‚阅 Geo 疑难解答。"
msgid "Geo|Primary node"
msgstr "主节点"
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr "项目"
@@ -13123,6 +13624,9 @@ msgstr "查看å¤åˆ¶çŠ¶æ€å¹¶ä¸Žä¸»è¦èŠ‚点é‡æ–°åŒæ­¥å’Œé‡æ–°éªŒè¯é¡¹ç›®ã€‚
msgid "Geo|Secondary node"
msgstr "次节点"
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr "状æ€"
@@ -13174,6 +13678,9 @@ msgstr "验è¯å¤±è´¥ - %{error}"
msgid "Geo|Waiting for scheduler"
msgstr "等待调度"
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr "当å‰å¤„于一个次è¦ï¼Œ%{b_open}åªè¯»çš„%{b_close}Geo节点。"
@@ -13198,9 +13705,6 @@ msgstr "马上开始"
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr "开始使用错误跟踪"
@@ -13213,6 +13717,9 @@ msgstr "开始å§ï¼"
msgid "Getting started with releases"
msgstr "开始使用å‘布"
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr "æ­¤ GitLab æœåŠ¡å™¨ä¸Šæœªå¯ç”¨ Git LFS,请è”系管ç†å‘˜ã€‚"
@@ -13249,6 +13756,9 @@ msgstr "GitHub API速率超过é™åˆ¶ã€‚请在%{reset_time}åŽé‡è¯•"
msgid "GitHub import"
msgstr "GitHub导入"
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr "GitLab"
@@ -13510,9 +14020,6 @@ msgstr "返回%{tagStart}å¼€å¯çš„议题%{tagEnd}并选择è¦æ·»åŠ åˆ°çœ‹æ¿çš„è
msgid "Go full screen"
msgstr "å…¨å±æ¨¡å¼"
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr "转至%{strongStart}议题%{strongEnd} &gt; %{strongStart}看æ¿%{strongEnd}æ¥è®¿é—®æ‚¨çš„个性化学习议题看æ¿ã€‚"
-
msgid "Go to Integrations"
msgstr "转到集æˆ"
@@ -13663,6 +14170,9 @@ msgstr "Grafana身份验è¯"
msgid "Grant access"
msgstr "å…许访问"
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr "分支图"
@@ -13711,6 +14221,9 @@ msgstr "å¿…é¡»å¯ç”¨ç¾¤ç»„SAMLæ‰èƒ½è¿›è¡Œæµ‹è¯•"
msgid "Group URL"
msgstr "群组URL"
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr "群组头åƒ"
@@ -14044,6 +14557,15 @@ msgstr "应为“永久â€"
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr "应为éšæœºçš„永久性ID,ä¸å»ºè®®ä½¿ç”¨ç”µå­é‚®ç®±"
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr "应用集æˆè®¾ç½®åˆ°æ‰€æœ‰é¡¹ç›®"
@@ -14320,6 +14842,12 @@ msgstr "按å称æœç´¢"
msgid "Guideline"
msgstr "å‚考"
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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'æƒé™çš„个人访问令牌。\\n您å¯ä»¥åœ¨ %{profile_personal_access_tokens_url}中生æˆä¸€ä¸ª"
@@ -14401,15 +14929,15 @@ msgstr "有助于å‡å°‘警报数é‡ï¼ˆä¾‹å¦‚,如果创建太多议题)"
msgid "Helps reduce request volume for protected paths"
msgstr "有助于帮助å‡å°‘å—ä¿æŠ¤è·¯å¾„的请求é‡"
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr "这是您群组中的所有项目,包括刚刚创建的项目。首先,让我们看一下您的个性化学习项目,该项目将帮助您以自己的节å¥å­¦ä¹ GitLab。"
-
msgid "Here you will find recent merge request activity"
msgstr "您将在这里找到最近的åˆå¹¶è¯·æ±‚活动"
msgid "Hi %{username}!"
msgstr "%{username},您好!"
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr "éšè—已归档的项目"
@@ -14511,6 +15039,9 @@ msgstr "管家,导出,路径,转移,删除,存档。"
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14759,6 +15290,9 @@ msgstr "导入自"
msgid "Import from Jira"
msgstr "从Jira导入"
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15117,7 +15651,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15543,9 +16077,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr "从您的应用程åºåº“安装软令牌验è¯å™¨å¦‚ %{free_otp_link} 或者谷歌验è¯å™¨ï¼Œç„¶åŽä½¿ç”¨è¯¥éªŒè¯å™¨æ‰«æ此二维ç ã€‚更多信æ¯è¯·æŸ¥çœ‹%{help_link_start}文档%{help_link_end}。"
-
msgid "Install on clusters"
msgstr "在群集上安装"
@@ -15580,96 +16111,6 @@ msgstr "实例管ç†å‘˜ç»„已存在"
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr "无法加载议题与åˆå¹¶è¯·æ±‚图表。请刷新页é¢å†è¯•ä¸€æ¬¡ã€‚"
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr "无法加载æµæ°´çº¿ç»Ÿè®¡å›¾è¡¨ã€‚请刷新页é¢å†è¯•ä¸€æ¬¡ã€‚"
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr "无法加载项目和群组图表。请刷新页é¢å†è¯•ä¸€æ¬¡ã€‚"
-
-msgid "InstanceStatistics|Groups"
-msgstr "群组"
-
-msgid "InstanceStatistics|Issues"
-msgstr "议题"
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr "议题与åˆå¹¶è¯·æ±‚"
-
-msgid "InstanceStatistics|Items"
-msgstr "项目"
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr "åˆå¹¶è¯·æ±‚"
-
-msgid "InstanceStatistics|Month"
-msgstr "月"
-
-msgid "InstanceStatistics|No data available."
-msgstr "æ— å¯ç”¨æ•°æ®ã€‚"
-
-msgid "InstanceStatistics|Pipelines"
-msgstr "æµæ°´çº¿"
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr "å–消的æµæ°´çº¿"
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr "失败的æµæ°´çº¿"
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr "跳过的æµæ°´çº¿"
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr "æˆåŠŸçš„æµæ°´çº¿"
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr "æµæ°´çº¿æ€»æ•°"
-
-msgid "InstanceStatistics|Projects"
-msgstr "项目"
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr "获å–å–消的æµæ°´çº¿æ—¶å‡ºé”™"
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr "获å–失败的æµæ°´çº¿æ—¶å‡ºé”™"
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr "获å–议题时出错"
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr "获å–åˆå¹¶è¯·æ±‚时出错"
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr "获å–跳过的æµæ°´çº¿æ—¶å‡ºé”™"
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr "获å–æˆåŠŸçš„æµæ°´çº¿æ—¶å‡ºé”™"
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr "获å–æµæ°´çº¿æ€»æ•°æ—¶å‡ºé”™"
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr "加载群组时出错"
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr "加载项目时出错"
-
-msgid "InstanceStatistics|Total groups"
-msgstr "群组总数"
-
-msgid "InstanceStatistics|Total projects"
-msgstr "项目总数"
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr "项目和群组总数"
-
-msgid "InstanceStatistics|Users"
-msgstr "用户"
-
msgid "Integration"
msgstr "集æˆ"
@@ -15688,12 +16129,18 @@ msgstr "%{integration}设置已ä¿å­˜ä½†æœªå¯ç”¨ã€‚"
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr "所有详细信æ¯"
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr "继承这些设置的所有项目也将被é‡ç½®ã€‚"
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr "评论细节:"
@@ -15745,6 +16192,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr "使用自定义设置的项目ä¸ä¼šå—到影å“。"
@@ -15778,6 +16231,9 @@ msgstr "标准"
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr "此集æˆå’Œç»§æ‰¿é¡¹ç›®å·²è¢«é‡ç½®ã€‚"
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr "为了ä¿æŒè¿™ä¸ªé¡¹ç›®çš„推进,请创建一个新的议题."
@@ -15946,6 +16402,9 @@ msgstr "通过电å­é‚®ä»¶é‚€è¯·â€œ%{trimmed}â€"
msgid "Invite Members"
msgstr "邀请æˆå‘˜"
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr "邀请群组"
@@ -15955,9 +16414,6 @@ msgstr "邀请æˆå‘˜"
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr "邀请团队æˆå‘˜"
-
msgid "Invite your team"
msgstr "邀请您的团队"
@@ -15967,9 +16423,42 @@ msgstr "%{inviter}邀请您作为%{role}加入%{project_or_group_name}%{project_
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 "%{inviter}邀请您作为%{role}加入%{strong_start}%{project_or_group_name}%{strong_end}%{project_or_group}%{br_tag}"
+msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 "您被邀请以%{role}身份加入%{strong_start}%{project_or_group_name}%{strong_end}%{project_or_group}%{br_tag}"
@@ -16009,20 +16498,41 @@ msgstr "GitLab用户或电å­é‚®ä»¶åœ°å€"
msgid "InviteMembersModal|Invite"
msgstr "邀请"
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr "邀请团队æˆå‘˜"
msgid "InviteMembersModal|Members were successfully added"
msgstr "æˆå‘˜å·²æˆåŠŸæ·»åŠ "
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr "æœç´¢æ¬²é‚€è¯·çš„æˆå‘˜"
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr "部分æˆå‘˜æ— æ³•æ·»åŠ "
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
-msgstr "您邀请æˆå‘˜åŠ å…¥%{name}%{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
+msgstr ""
msgid "InviteMembers|Invite team members"
msgstr "邀请团队æˆå‘˜"
@@ -16030,18 +16540,33 @@ msgstr "邀请团队æˆå‘˜"
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16051,6 +16576,12 @@ msgstr "哦,此功能尚未就绪"
msgid "InviteMember|See who can invite members for you"
msgstr "查看è°å¯ä»¥ä¸ºæ‚¨é‚€è¯·æˆå‘˜"
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr "在此之å‰ï¼Œè¯·é¡¹ç›®æ‰€æœ‰è€…为您邀请新的项目æˆå‘˜"
@@ -16273,6 +16804,9 @@ 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 "未分é…å²è¯—的议题"
@@ -16348,11 +16882,8 @@ msgstr "迭代已更新"
msgid "Iterations"
msgstr "迭代"
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr "日期ä¸èƒ½ä¸Žå…¶å·²æœ‰çš„迭代é‡å ã€‚"
-
-msgid "Iteration|cannot be in the past"
-msgstr "ä¸èƒ½è®¾ç½®ä¸ºè¿‡åŽ»æ—¶é—´"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
+msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr "ä¸èƒ½è¶…过未æ¥çš„500å¹´"
@@ -16399,6 +16930,9 @@ msgstr "Jira项目: %{importProject}"
msgid "Jira service not configured."
msgstr "未é…ç½®JiraæœåŠ¡ã€‚"
+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 "已从é…置的Jira实例中导入了Jira用户。å¯ä»¥é€šè¿‡ä»Žâ€œ GitLab用户åâ€åˆ—的下拉列表中选择一个GitLab用户æ¥æ˜ å°„它们。当表å•å‡ºçŽ°æ—¶ï¼Œä¸‹æ‹‰èœå•é»˜è®¤ä¸ºæ‰§è¡Œå¯¼å…¥çš„用户。"
@@ -16414,7 +16948,7 @@ msgstr "%{jira_docs_link_start}å¯ç”¨Jira集æˆ%{jira_docs_link_end}以在GitLab
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr "%{user_link}在%{project_link}%{branch}中的%{entity_link}中æåŠæ­¤è®®é¢˜: {quote}%{entity_message}{quote}"
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16474,6 +17008,9 @@ msgstr "Jira project key"
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr "打开Jira"
@@ -16498,6 +17035,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr "此功能需è¦é«˜çº§è®¡åˆ’。"
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr "æœåŠ¡å™¨ç‰ˆæœ¬è¯·ä½¿ç”¨å¯†ç , 云版本请使用API令牌"
@@ -16699,6 +17239,9 @@ msgstr "ä¿ç•™åˆ†å‰çš„refs"
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 "Kerberos访问被拒ç»"
@@ -16768,9 +17311,6 @@ msgstr "找ä¸åˆ°Kubernetes部署"
msgid "Kubernetes error: %{error_code}"
msgstr "Kubinentes 错误: %{error_code}"
-msgid "Kubernetes popover"
-msgstr "Kubernetes弹出信æ¯"
-
msgid "LDAP"
msgstr "LDAP"
@@ -16849,6 +17389,9 @@ 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 "%{spanStart}将标记%{spanEnd}%{labelTitle}%{spanStart}å‡çº§ä¸ºç¾¤ç»„标记?%{spanEnd}"
@@ -16868,6 +17411,9 @@ msgid "Last %d day"
msgid_plural "Last %d days"
msgstr[0] "最近 %d 天"
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr "最近 2 周"
@@ -16913,6 +17459,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr "此页é¢åœ¨æ‚¨çš„æµè§ˆå™¨ä¸­è½½å…¥å‰çš„最åŽä¸€ä¸ªé¡¹ç›®ï¼š"
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr "姓"
@@ -16961,6 +17510,9 @@ msgstr "上次使用于:"
msgid "Last week"
msgstr "上周"
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr "编辑于"
@@ -16994,6 +17546,9 @@ msgstr "学习GitLab"
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr "了解如何 %{link_start}贡献到内置的模æ¿%{link_end}"
@@ -17045,9 +17600,6 @@ msgstr "了解更多关于群组级项目模æ¿"
msgid "Learn more about signing commits"
msgstr "了解更多有关签åæ交的详细信æ¯"
-msgid "Learn more about the dependency list"
-msgstr "了解更多关于ä¾èµ–列表的信æ¯"
-
msgid "Learn more in the"
msgstr "了解更多"
@@ -17057,6 +17609,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr "退出"
@@ -17240,9 +17882,6 @@ msgstr "显示项目中检测到的许å¯è¯ï¼ŒåŸºäºŽ%{linkStart}最新的æˆåŠŸ
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr "获å–许å¯è¯åˆ—表时出错。请检查您的网络连接并é‡è¯•ã€‚"
-msgid "Licenses|Learn more about license compliance"
-msgstr "了解更多关于许å¯è¯åˆè§„情况的信æ¯"
-
msgid "Licenses|License Compliance"
msgstr "许å¯è¯åˆè§„性"
@@ -17352,6 +17991,9 @@ msgstr "列出å¯ç”¨ä»“库"
msgid "List of all merge commits"
msgstr "所有åˆå¹¶æ交列表"
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr "列表选项"
@@ -17391,7 +18033,7 @@ msgstr "加载功能超时。请刷新页é¢é‡è¯•ã€‚"
msgid "Loading issues"
msgstr "加载议题"
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17751,6 +18393,9 @@ msgstr "最高访问级别"
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr "最大角色"
@@ -17763,9 +18408,6 @@ msgstr "最大Conan文件包大å°ï¼ˆå­—节)"
msgid "Maximum Maven package file size in bytes"
msgstr "最大Maven文件包大å°ï¼ˆå­—节)"
-msgid "Maximum NPM package file size in bytes"
-msgstr "最大NPM文件包大å°ï¼ˆå­—节)"
-
msgid "Maximum NuGet package file size in bytes"
msgstr "最大NuGet文件包大å°ï¼ˆå­—节)"
@@ -17823,6 +18465,9 @@ 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 npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr "超过%{name}的最大数é‡(%{count})"
@@ -18093,6 +18738,9 @@ msgstr "åˆå¹¶è¯·æ±‚%{mr_link}已被%{mr_author}审核"
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr "åˆå¹¶è¯·æ±‚批准"
@@ -18174,9 +18822,6 @@ msgstr "对%{selectStart}开始于%{selectEnd}到%{end}è¡Œå‘表评论"
msgid "MergeRequestDiffs|Select comment starting line"
msgstr "选择评论起始行"
-msgid "MergeRequests|Add a reply"
-msgstr "添加回å¤"
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr "检查是å¦æ­£åœ¨æ‰§è¡Œå¦ä¸€ä¸ªåŽ‹ç¼©æ—¶å‡ºé”™ã€‚"
@@ -18186,9 +18831,6 @@ msgstr "ä¿å­˜è¯„论è‰ç¨¿æ—¶å‘生错误。"
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr "无法压缩(Squash)。应该手动完æˆã€‚"
-msgid "MergeRequests|Reply..."
-msgstr "回å¤..."
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr "创建新议题以解决此主题"
@@ -18237,6 +18879,9 @@ msgstr "å¼€å¯æœ‰å…³%{linkStart}%{commitDisplay}%{linkEnd}中较旧的å˜æ›´çš„ä
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr "å¼€å¯æœ‰å…³æ交%{linkStart}%{commitDisplay}%{linkEnd}的主题"
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr "比较%{target}和%{source}"
@@ -18944,6 +19589,9 @@ msgstr "更多信æ¯ã€‚"
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr "è¶…å‰ %{number_commits_distance} 个æ交与 %{default_branch} ä¸åŒ"
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr "最多星标"
@@ -18953,6 +19601,9 @@ msgstr "%{model_class} 中未找到挂载点 %{mounted_as}。"
msgid "Move"
msgstr "移动"
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr "移动议题"
@@ -18971,6 +19622,9 @@ msgstr "移动测试用例"
msgid "Move this issue to another project."
msgstr "将此议题移至å¦ä¸€ä¸ªé¡¹ç›®ã€‚"
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr "由于æƒé™ä¸è¶³è€Œæ— æ³•ç§»åŠ¨è®®é¢˜!"
@@ -19177,6 +19831,12 @@ 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 "您确定è¦åˆ é™¤æ­¤ç­–ç•¥å—?此æ“作ä¸èƒ½æ’¤æ¶ˆã€‚"
@@ -19195,12 +19855,6 @@ msgstr "删除策略"
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr "删除策略: %{policy}"
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr "æ‹’ç»æ‰€æœ‰æµé‡"
@@ -19433,6 +20087,9 @@ msgstr "新测试用例"
msgid "New User"
msgstr "新建用户"
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr "新建分支"
@@ -19454,6 +20111,9 @@ msgstr "新建部署密钥"
msgid "New directory"
msgstr "新建目录"
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr "新环境"
@@ -19496,6 +20156,9 @@ msgstr "新的迭代已创建"
msgid "New label"
msgstr "新建标记"
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr "新建åˆå¹¶è¯·æ±‚"
@@ -19601,6 +20264,9 @@ msgstr "没有å‘现任何活动"
msgid "No application_settings found"
msgstr "未找到应用程åºè®¾ç½®"
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr "未é…置身份验è¯æ–¹æ³•ã€‚"
@@ -19622,9 +20288,15 @@ msgstr "没有匹é…当å‰ç­›é€‰å™¨çš„å­å²è¯—"
msgid "No commits present here"
msgstr "此处无æ交"
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr "无法连接到GitalyæœåŠ¡å™¨ï¼Œè¯·æ£€æŸ¥ç›¸å…³æ—¥å¿—ï¼"
@@ -19652,6 +20324,9 @@ 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 "未æ供端点"
@@ -19688,6 +20363,9 @@ msgstr "未å‘现议题"
msgid "No iteration"
msgstr "无迭代"
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr "没有å¯æ˜¾ç¤ºè¿­ä»£"
@@ -19916,14 +20594,20 @@ msgstr "æ示:如GitLab管ç†å‘˜é…ç½® %{github_integration_link},将å…许
msgid "NoteForm|Note"
msgstr "注æ„"
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr "确定è¦å–消此评论å—?"
msgid "Notes|Collapse replies"
msgstr "收起回å¤"
-msgid "Notes|Private comments are accessible by internal staff only"
-msgstr "åªæœ‰å†…部工作人员å¯ä»¥è®¿é—®ç§æœ‰è¯„论"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
+msgstr ""
msgid "Notes|Show all activity"
msgstr "显示所有活动"
@@ -19937,6 +20621,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 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 "您åªèƒ½åœ¨ä¿¡æ¯æµä¸­çœ‹åˆ°%{boldStart}其他活动%{boldEnd} 。è¦æ·»åŠ è¯„论,请切æ¢åˆ°ä»¥ä¸‹é€‰é¡¹ä¹‹ä¸€ã€‚"
@@ -19952,9 +20639,6 @@ msgstr "没有è¦åŒæ­¥çš„内容"
msgid "Notification events"
msgstr "通知事件"
-msgid "Notification setting"
-msgstr "无法预览此类型文件"
-
msgid "Notification setting - %{notification_title}"
msgstr "通知设置 - %{notification_title}"
@@ -19982,6 +20666,9 @@ msgstr "到期议题"
msgid "NotificationEvent|Merge merge request"
msgstr "åˆå¹¶è¯·æ±‚被åˆå¹¶"
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr "移动项目"
@@ -20036,9 +20723,6 @@ msgstr "å‚与"
msgid "NotificationLevel|Watch"
msgstr "关注"
-msgid "NotificationSetting|Custom"
-msgstr "自定义"
-
msgid "Notifications"
msgstr "通知"
@@ -20150,6 +20834,12 @@ msgstr "待命计划"
msgid "On-call schedules"
msgstr "待命计划"
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20171,6 +20861,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr "在GitLab中创建待命计划"
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20204,9 +20897,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20382,8 +21081,8 @@ 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 "您的一个或多个个人访问令牌将在%{days_to_expire}天内过期。"
+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 ""
@@ -20415,8 +21114,8 @@ msgstr "åªæœ‰é¡¹ç›®æˆå‘˜å¯ä»¥å‘表评论。"
msgid "Only project members will be imported. Group members will be skipped."
msgstr "仅导入项目æˆå‘˜ã€‚群组æˆå‘˜å°†è¢«è·³è¿‡ã€‚"
-msgid "Only projects created under a Gold license are available in Security Dashboards."
-msgstr "åªæœ‰åœ¨é‡‘牌许å¯ä¸‹åˆ›å»ºçš„项目å¯ä»¥åœ¨å®‰å…¨ä»ªè¡¨æ¿ä¸­æ˜¾ç¤ºã€‚"
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
+msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr "åªæœ‰å…·æœ‰è¿™äº›åŸŸå电å­é‚®ä»¶åœ°å€çš„已验è¯ç”¨æˆ·æ‰èƒ½æ·»åŠ åˆ°ç¾¤ç»„。"
@@ -20430,6 +21129,12 @@ msgstr "å•Š~~, 确定å—?"
msgid "Open"
msgstr "开放中"
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr "打开所选项"
@@ -20442,12 +21147,12 @@ msgstr "打开å²è¯—"
msgid "Open errors"
msgstr "打开错误"
-msgid "Open in Xcode"
-msgstr "用Xcode打开"
-
msgid "Open in file view"
msgstr "在文件视图中打开"
+msgid "Open in your IDE"
+msgstr ""
+
msgid "Open issues"
msgstr "å¼€å¯çš„议题"
@@ -20514,6 +21219,9 @@ 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 "å¯é€‰"
@@ -20568,9 +21276,6 @@ msgstr "请安装一个%{browser_link_start}支æŒçš„网页æµè§ˆå™¨%{browser_li
msgid "Outdent"
msgstr "å‡å°‘缩进"
-msgid "Overall Activity"
-msgstr "活动总计"
-
msgid "Overridden"
msgstr "覆盖"
@@ -20625,6 +21330,15 @@ msgstr "包类型必须是Nuget"
msgid "Package type must be PyPi"
msgstr "包类型必须是PyPi"
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20637,6 +21351,9 @@ msgstr "添加Nugetæº"
msgid "PackageRegistry|Add composer registry"
msgstr "添加composer注册表"
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr "应用分组: %{group}"
@@ -20760,9 +21477,6 @@ msgstr "Maven命令"
msgid "PackageRegistry|Maven XML"
msgstr "Maven XML"
-msgid "PackageRegistry|NPM"
-msgstr "NPM"
-
msgid "PackageRegistry|NuGet"
msgstr "NuGet"
@@ -20781,6 +21495,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr "Pip命令"
@@ -20799,6 +21516,12 @@ msgstr "æž„æˆ: %{recipe}"
msgid "PackageRegistry|Remove package"
msgstr "删除软件包"
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr "对ä¸èµ·ï¼Œæ²¡æœ‰ç¬¦åˆç­›é€‰å™¨çš„任何结果"
@@ -20838,6 +21561,9 @@ msgstr "å³å°†åˆ é™¤%{name}çš„%{version}版本。确定继续å—?"
msgid "PackageRegistry|You may also need to setup authentication using an auth token. %{linkStart}See the documentation%{linkEnd} to find out more."
msgstr "您å¯èƒ½è¿˜éœ€è¦ä½¿ç”¨ä»¤ç‰Œè®¾ç½®èº«ä»½éªŒè¯ã€‚%{linkStart}请å‚阅文档%{linkEnd}以了解更多信æ¯ã€‚"
+msgid "PackageRegistry|npm"
+msgstr ""
+
msgid "PackageRegistry|npm command"
msgstr "npm命令"
@@ -20859,15 +21585,15 @@ msgstr "通用"
msgid "PackageType|Maven"
msgstr "Maven"
-msgid "PackageType|NPM"
-msgstr "NPM"
-
msgid "PackageType|NuGet"
msgstr "NuGet"
msgid "PackageType|PyPI"
msgstr "PyPI"
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr "软件包"
@@ -20940,6 +21666,15 @@ msgstr "å‚æ•°"
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr "å‚æ•°\"job_id\"ä¸èƒ½è¶…过%{job_id_max_size}的长度"
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr "父级"
@@ -20997,11 +21732,11 @@ msgstr "密ç åº”唯一并未用于任何其他网站或æœåŠ¡ã€‚"
msgid "Past due"
msgstr "逾期"
-msgid "Paste a machine public key here. Read more about how to generate it"
-msgstr "在此处粘贴主机公钥。了解更多关于如何生æˆå…¬é’¥"
+msgid "Paste a public key here."
+msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
-msgstr "在此处粘贴计算机公钥。在%{link_start}这里%{link_end}了解更多关于如何产生公钥"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
+msgstr ""
msgid "Paste confidential epic link"
msgstr "粘贴ç§å¯†å²è¯—链接"
@@ -21096,6 +21831,9 @@ msgstr "Rugged调用"
msgid "PerformanceBar|SQL queries"
msgstr "SQL查询"
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr "跟踪"
@@ -21147,9 +21885,6 @@ msgstr "æµæ°´çº¿è®¡åˆ’"
msgid "Pipeline Schedules"
msgstr "æµæ°´çº¿è®¡åˆ’"
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr "æµæ°´çº¿åˆ†é’Ÿæ•°é…é¢"
@@ -21171,10 +21906,10 @@ msgstr "æµæ°´çº¿è§¦å‘器"
msgid "Pipeline: %{status}"
msgstr "æµæ°´çº¿: %{status}"
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21249,15 +21984,6 @@ msgstr "æµæ°´çº¿ç»Ÿè®¡å›¾"
msgid "Pipelines emails"
msgstr "æµæ°´çº¿ç”µå­é‚®ä»¶"
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr "上月的æµæ°´çº¿(%{oneMonthAgo} - %{today})"
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr "上周的æµæ°´çº¿(%{oneWeekAgo} - %{today})"
-
-msgid "Pipelines for last year"
-msgstr "去年的æµæ°´çº¿"
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr "åˆå¹¶è¯·æ±‚çš„æµæ°´çº¿å·²é…置。游离的æµæ°´çº¿è¿è¡ŒäºŽåˆå¹¶è¯·æ±‚环境,而éžåˆå¹¶ç»“果。更多内容请å‚阅关于åˆå¹¶ç»“果的æµæ°´çº¿æ–‡æ¡£ã€‚"
@@ -21285,12 +22011,12 @@ msgstr "å­æµæ°´çº¿"
msgid "Pipelines|Clear Runner Caches"
msgstr "清除Runner缓存"
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
-msgstr "æŒç»­é›†æˆå¯ä»¥é€šè¿‡è‡ªåŠ¨è¿è¡Œæµ‹è¯•æ¥å¸®åŠ©æ£€æµ‹ä»£ç ç¼ºé™·ï¼Œè€ŒæŒç»­éƒ¨ç½²å¯ä»¥å¸®åŠ©æ‚¨å‘生产环境交付代ç ã€‚"
-
msgid "Pipelines|Copy trigger token"
msgstr "å¤åˆ¶è§¦å‘令牌"
+msgid "Pipelines|Could not load merged YAML content"
+msgstr ""
+
msgid "Pipelines|Description"
msgstr "æè¿°"
@@ -21303,9 +22029,6 @@ msgstr "编辑器"
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21330,6 +22053,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr "载入æµæ°´çº¿"
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr "更多信æ¯"
@@ -21366,9 +22092,6 @@ msgstr "ç›®å‰æ²¡æœ‰å·²å®Œæˆçš„æµæ°´çº¿ã€‚"
msgid "Pipelines|There are currently no pipelines."
msgstr "当å‰æ— æµæ°´çº¿ã€‚"
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr "获å–æµæ°´çº¿æ—¶å‡ºé”™ã€‚请ç¨åŽé‡è¯•æˆ–è”系支æŒå›¢é˜Ÿã€‚"
@@ -21402,6 +22125,9 @@ msgstr "触å‘用户没有足够的项目æƒé™"
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr "å¯è§†åŒ–"
@@ -21414,12 +22140,21 @@ msgstr "无效"
msgid "Pipelines|parent"
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 "检查æµæ°´çº¿çŠ¶æ€ã€‚"
@@ -21459,6 +22194,9 @@ msgstr "手动"
msgid "Pipeline|Merge train pipeline"
msgstr "åˆå¹¶é˜Ÿåˆ—æµæ°´çº¿"
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr "åˆå¹¶ç»“æžœæµæ°´çº¿"
@@ -21471,6 +22209,12 @@ 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 "æµæ°´çº¿"
@@ -21528,6 +22272,9 @@ msgstr "值"
msgid "Pipeline|Variables"
msgstr "å˜é‡"
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr "å³å°†åœæ­¢æµæ°´çº¿ %{pipelineId}。"
@@ -21597,6 +22344,9 @@ msgstr "请检查é…置文件以确ä¿å®ƒå¯ç”¨ä¸”YAML有效"
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 "请检查您的电å­é‚®ä»¶(%{email})以确认您拥有此电å­é‚®ç®±å¹¶è§£é”CI/CD的强大功能。还没收到邮件? %{resend_link}。或是电å­é‚®ä»¶åœ°å€é”™è¯¯ï¼Ÿ%{update_link}。"
+msgid "Please check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr "请选择一个文件"
@@ -21720,12 +22470,18 @@ 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 set a new password before proceeding."
msgstr "请设置新密ç ä»¥ç»§ç»­ä¸‹ä¸€æ­¥ã€‚"
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr "请在%{linkStart}此议题中%{linkEnd}分享您对%{featureName}çš„å馈,以帮助我们改善体验。"
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr "请填写验è¯ç ã€‚"
@@ -21786,21 +22542,39 @@ msgstr "选择项目概览页é¢ä¸­æ‚¨æƒ³çœ‹åˆ°çš„内容。"
msgid "Preferences|Choose what content you want to see on your homepage."
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 "以24å°æ—¶æ ¼å¼æ˜¾ç¤ºæ—¶é—´"
+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 mins ago."
msgstr "例如:30分钟å‰"
+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 "布局宽度"
@@ -21822,6 +22596,12 @@ 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 "语法高亮主题"
@@ -21930,6 +22710,9 @@ 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 "ç§æœ‰ - 项目访问必须明确授予æ¯ä¸ªç”¨æˆ·ã€‚ 如果此项目是在一个群组中,群组æˆå‘˜å°†ä¼šèŽ·å¾—访问æƒé™ã€‚"
@@ -22014,24 +22797,6 @@ msgstr "用户资料"
msgid "Profile Settings"
msgstr "个人资料设置"
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr "自定义与第三方æœåŠ¡çš„集æˆã€‚"
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr "å¯ç”¨Gitpod集æˆ"
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr "å¯ç”¨ä»£ç è§†å›¾çš„集æˆä»£ç æ™ºèƒ½åŠŸèƒ½"
-
-msgid "ProfilePreferences|Gitpod"
-msgstr "Gitpod"
-
-msgid "ProfilePreferences|Integrations"
-msgstr "集æˆé…ç½®"
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr "Sourcegraph"
-
msgid "ProfileSession|on"
msgstr "于"
@@ -22068,6 +22833,9 @@ msgstr "添加密钥"
msgid "Profiles|Add status emoji"
msgstr "在状æ€ä¸­æ·»åŠ è¡¨æƒ…符å·"
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr "头åƒè£å‰ª"
@@ -22425,6 +23193,9 @@ msgstr "项目文件"
msgid "Project ID"
msgstr "项目ID"
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr "项目 URL"
@@ -22653,11 +23424,8 @@ msgstr "å…许"
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr "å…许用户将你的仓库å¤åˆ¶åˆ°ä¸€ä¸ªæ–°é¡¹ç›®"
-
-msgid "ProjectSettings|Allow users to request access"
-msgstr "å…许用户请求访问æƒé™"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
+msgstr ""
msgid "ProjectSettings|Analytics"
msgstr ""
@@ -22668,8 +23436,8 @@ msgstr "自动解决过期的åˆå¹¶è¯·æ±‚差异相关讨论"
msgid "ProjectSettings|Badges"
msgstr "徽章"
-msgid "ProjectSettings|Build, test, and deploy your changes"
-msgstr "构建ã€æµ‹è¯•å’Œéƒ¨ç½²æ‚¨çš„å˜æ›´"
+msgid "ProjectSettings|Build, test, and deploy your changes."
+msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
msgstr "默认情况下,å¤é€‰æ¡†æ˜¯å¯è§å’Œé€‰ä¸­çš„。"
@@ -22683,6 +23451,12 @@ msgstr "选择åˆå¹¶æ–¹æ³•ã€åˆå¹¶é€‰é¡¹ï¼Œåˆå¹¶æ£€æŸ¥ä»¥åŠåˆå¹¶å»ºè®®"
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr "选择åˆå¹¶æ–¹æ³•ã€åˆå¹¶é€‰é¡¹ã€åˆå¹¶æ£€æŸ¥ã€åˆå¹¶å»ºè®®ä»¥åŠè®¾ç½®é»˜è®¤åˆå¹¶è¯·æ±‚æ述模æ¿"
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr "è”系管ç†å‘˜æ›´æ”¹æ­¤è®¾ç½®ã€‚"
@@ -22710,17 +23484,14 @@ msgstr "å¯ç”¨åˆå¹¶ç»“æžœæµæ°´çº¿ã€‚"
msgid "ProjectSettings|Encourage"
msgstr "建议"
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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 "æ¯ä¸ªé¡¹ç›®éƒ½å¯ä»¥æœ‰è‡ªå·±çš„空间æ¥å­˜å‚¨å…¶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."
+msgstr ""
msgid "ProjectSettings|Everyone"
msgstr "所有人"
@@ -22758,14 +23529,14 @@ msgstr "内部"
msgid "ProjectSettings|Issues"
msgstr "议题"
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
-msgstr "LFS对象ä»å¯ç”¨äºŽæ´¾ç”Ÿã€‚%{linkStart}如何删除它们?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
-msgstr "此项目的轻é‡çº§è®®é¢˜è·Ÿè¸ªç³»ç»Ÿ"
+msgid "ProjectSettings|Lightweight issue tracking system."
+msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
-msgstr "管ç†å¤§åž‹æ–‡ä»¶ï¼Œå¦‚音频ã€è§†é¢‘和图形文件"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
+msgstr ""
msgid "ProjectSettings|Merge checks"
msgstr "åˆå¹¶æ£€æŸ¥"
@@ -22800,14 +23571,17 @@ msgstr "åªæœ‰å·²ç­¾ç½²æ交æ‰å¯ä»¥æŽ¨é€åˆ°æ­¤ä»“库。"
msgid "ProjectSettings|Operations"
msgstr ""
+msgid "ProjectSettings|Override user notification preferences for all project members."
+msgstr ""
+
msgid "ProjectSettings|Packages"
msgstr "软件包"
msgid "ProjectSettings|Pages"
msgstr "Pages"
-msgid "ProjectSettings|Pages for project documentation"
-msgstr "用于项目文档的Pages"
+msgid "ProjectSettings|Pages for project documentation."
+msgstr ""
msgid "ProjectSettings|Pipelines"
msgstr "æµæ°´çº¿"
@@ -22833,17 +23607,26 @@ msgstr "仓库"
msgid "ProjectSettings|Require"
msgstr "å¿…é¡»"
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr "需求"
-msgid "ProjectSettings|Requirements management system for this project"
-msgstr "此项目的需求管ç†ç³»ç»Ÿ"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
+msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr "在åˆå¹¶è¯·æ±‚中设置此选项的默认行为和å¯ç”¨æ€§ï¼Œæ‰€åšçš„更改也适用于现有的åˆå¹¶è¯·æ±‚。"
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
-msgstr "在Git仓库中与其他人分享代ç "
+msgid "ProjectSettings|Share code with others outside the project."
+msgstr ""
msgid "ProjectSettings|Show default award emojis"
msgstr "显示默认的奖励表情符å·"
@@ -22866,8 +23649,8 @@ msgstr "始终执行压缩。å¤é€‰æ¡†æ˜¯å¯è§çš„并处于选中状æ€ï¼Œç”¨æˆ·
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr "永远ä¸ä¼šæ‰§è¡ŒåŽ‹ç¼©ï¼Œå¹¶ä¸”该å¤é€‰æ¡†æ˜¯éšè—的。"
-msgid "ProjectSettings|Submit changes to be merged upstream"
-msgstr "æ交将åˆå¹¶å…¥ä¸Šæ¸¸çš„å˜æ›´"
+msgid "ProjectSettings|Submit changes to be merged upstream."
+msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
msgstr "用于应用åˆå¹¶è¯·æ±‚建议的æ交消æ¯"
@@ -22890,30 +23673,36 @@ msgstr "此设置应用于æœåŠ¡å™¨çº§åˆ«ï¼Œä½†å·²è¢«è¯¥é¡¹ç›®è¦†ç›–。"
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr "此设置将应用于所有项目,除éžè¢«ç®¡ç†å‘˜è¦†ç›–。"
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr "此设置将覆盖所有项目æˆå‘˜çš„用户通知å好。"
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr "这将对åˆå¹¶è¯·æ±‚完æˆæ—¶çš„æ交历å²è®°å½•äº§ç”Ÿå½±å“"
msgid "ProjectSettings|Transfer project"
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|View and edit files in this project"
-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 will only have read access"
-msgstr "查看和编辑此项目中的文件。éžé¡¹ç›®æˆå‘˜åªæœ‰è¯»å–æƒé™"
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
+msgstr ""
-msgid "ProjectSettings|View project analytics"
+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|What are badges?"
msgstr ""
@@ -22923,20 +23712,11 @@ msgstr "当批准åˆå¹¶æ—¶ï¼Œåˆå¹¶è¯·æ±‚将会加入队列,æµæ°´çº¿åœ¨å®žé™…
msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr "当出现冲çªæ—¶ï¼Œç”¨æˆ·å¯ä»¥é€‰æ‹©rebase"
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
-msgstr ""
-
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
-msgstr "å¯ç”¨åŽï¼Œè®®é¢˜ã€åˆå¹¶è¯·æ±‚和代ç ç‰‡æ®µå°†å§‹ç»ˆæ˜¾ç¤ºç¼©ç•¥å›¾å’Œç¼©ç•¥å›¾å¥–励表情符å·æŒ‰é’®ã€‚"
-
msgid "ProjectSettings|Wiki"
msgstr "Wiki"
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
-msgstr "使用GitLab Pages,您å¯ä»¥åœ¨GitLab上托管é™æ€ç½‘ç«™"
-
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
-msgstr "使用指标仪表盘,您å¯ä»¥å¯è§†åŒ–此项目性能指标"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
+msgstr ""
msgid "ProjectTemplates|.NET Core"
msgstr ".NET Core"
@@ -23214,11 +23994,11 @@ msgstr "å¯ç”¨"
msgid "PrometheusService|Auto configuration"
msgstr "自动é…ç½®"
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
-msgstr "自动部署和é…ç½®Prometheus到集群æ¥ç›‘测项目的环境"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
+msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
-msgstr "IAP安全资æºçš„客户端ID(类似于IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
+msgstr ""
msgid "PrometheusService|Common metrics"
msgstr "常用指标"
@@ -23226,9 +24006,6 @@ msgstr "常用指标"
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr "常用指标会根æ®åº”用广泛的导出器指标库自动监控。"
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr "您的æœåŠ¡å¸æˆ·çš„certificate.json文件的内容,例如:{ \"type\": \"service_account\", \"project_id\": ... }"
-
msgid "PrometheusService|Custom metrics"
msgstr "自定义指标"
@@ -23244,6 +24021,15 @@ msgstr "查找和é…置指标..."
msgid "PrometheusService|Finding custom metrics..."
msgstr "查找自定义指标..."
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr "在群集上安装Prometheus"
@@ -23259,6 +24045,12 @@ msgstr "指标"
msgid "PrometheusService|Missing environment variable"
msgstr "无环境å˜é‡"
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr "更多的信æ¯"
@@ -23271,23 +24063,23 @@ msgstr "未找到%{docsUrlStart}通用指标%{docsUrlEnd}"
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr "尚未创建自定义指标。使用上é¢çš„按钮创建一个"
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
-msgstr "Prometheus API 地å€ï¼Œä¾‹å¦‚ http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgstr ""
+
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
-msgstr "Prometheus正在被群集自动管ç†"
+msgid "PrometheusService|The Prometheus API base URL."
+msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
-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|Time-series monitoring service"
-msgstr "以时间为åºçš„监控æœåŠ¡"
-
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
-msgstr "如需在群集上å¯ç”¨Prometheus的安装,请å–消以下的手动é…ç½®"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
msgstr "等待首次部署到环境以查找常用指标"
@@ -23295,6 +24087,12 @@ msgstr "等待首次部署到环境以查找常用指标"
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr "您现在å¯ä»¥åœ¨%{operations_link_start}è¿ç»´%{operations_link_end}页é¢ç®¡ç†æ‚¨çš„Prometheus设置。"
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr "å‡çº§"
@@ -23385,9 +24183,6 @@ msgstr "å…费试用"
msgid "Promotions|Upgrade plan"
msgstr "å‡çº§è®¢é˜…计划"
-msgid "Promotions|Upgrade your plan"
-msgstr "å‡çº§æ‚¨çš„计划"
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr "å‡çº§æ‚¨çš„订阅计划以å¯ç”¨è´¡çŒ®åº¦åˆ†æžã€‚"
@@ -23430,9 +24225,6 @@ msgstr "ä¿æŠ¤åˆ†æ”¯"
msgid "Protected Environment"
msgstr "å—ä¿æŠ¤çš„环境"
-msgid "Protected Environments"
-msgstr "å—ä¿æŠ¤çš„环境"
-
msgid "Protected Paths"
msgstr "å—ä¿æŠ¤çš„路径"
@@ -23445,6 +24237,9 @@ msgstr "å—ä¿æŠ¤çš„标签"
msgid "Protected branches"
msgstr "å—ä¿æŠ¤çš„分支"
+msgid "Protected environments"
+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 ""
@@ -23538,8 +24333,8 @@ msgstr "您的环境已å—到ä¿æŠ¤ã€‚"
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr "环境已ç»ä¸è¢«ä¿æŠ¤"
-msgid "Protip:"
-msgstr "æ示:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgstr ""
msgid "Protocol"
msgstr "åè®®"
@@ -23634,8 +24429,50 @@ msgstr "å°†åˆå¹¶ç»“果推é€åˆ°GitLab"
msgid "Push to create a project"
msgstr "通过推é€åˆ›å»ºé¡¹ç›®"
-msgid "PushRule|Committer restriction"
-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 "已推é€"
@@ -23727,6 +24564,9 @@ msgstr "é‡æ–°è®¤è¯æœŸå·²è¿‡æœŸæˆ–从未请求过。请å†è¯•ä¸€é"
msgid "Re-authentication required"
msgstr "需è¦é‡æ–°è®¤è¯"
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr "é‡æ–°éªŒè¯é—´éš”"
@@ -23763,6 +24603,9 @@ msgstr "从手动é…置的 Prometheus æœåŠ¡å™¨æŽ¥æ”¶è­¦æŠ¥ã€‚"
msgid "Receive notifications about your own activity"
msgstr "接收关于您自己活动的通知"
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr "最近"
@@ -23933,6 +24776,9 @@ msgstr "å‘布说明:"
msgid "Release title"
msgstr "å‘布标题"
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr "é•œåƒ"
@@ -24038,6 +24884,9 @@ msgstr "删除æ述历å²"
msgid "Remove due date"
msgstr "删除截止日期"
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr "删除派生关系"
@@ -24104,6 +24953,9 @@ msgstr "移除阶段"
msgid "Remove time estimate"
msgstr "删除时间估计"
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr "删除用户和报告"
@@ -24272,8 +25124,8 @@ msgstr "回å¤è¯„论"
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr "直接回å¤æ­¤é‚®ä»¶æˆ– %{view_it_on_gitlab}。"
-msgid "Reply..."
-msgstr "回å¤..."
+msgid "Reply…"
+msgstr ""
msgid "Repo by URL"
msgstr "从 URL 导入仓库"
@@ -24322,12 +25174,15 @@ msgstr "正在解æžæ— éšœç¢æ€§æ‰«æ结果"
msgid "Reports|Actions"
msgstr "æ“作"
-msgid "Reports|An error occured while loading report"
-msgstr "加载报告时出错"
+msgid "Reports|Activity"
+msgstr ""
msgid "Reports|An error occurred while loading %{name} results"
msgstr "加载%{name}结果时出错"
+msgid "Reports|An error occurred while loading report"
+msgstr ""
+
msgid "Reports|Class"
msgstr "ç±»"
@@ -24399,6 +25254,12 @@ msgstr "仓库分æž"
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr "作业的平å‡è¦†ç›–率"
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr "覆盖率"
@@ -24426,6 +25287,12 @@ msgstr "最新更新"
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr "最新测试覆盖率结果"
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr "请选择一个项目或多个项目æ¥æ˜¾ç¤ºæœ€è¿‘的测试覆盖率数æ®ã€‚"
@@ -24522,6 +25389,9 @@ msgstr "申请æƒé™"
msgid "Request details"
msgstr "请求详情"
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr "请求å‚æ•°%{param}缺失。"
@@ -24540,6 +25410,9 @@ msgstr "请求的 %{time_ago}"
msgid "Requested design version does not exist."
msgstr "请求的设计版本ä¸å­˜åœ¨."
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr "请求的状æ€æ— æ•ˆ"
@@ -24650,9 +25523,6 @@ msgstr "é‡ç½®æ¨¡æ¿"
msgid "Reset to project defaults"
msgstr "é‡ç½®ä¸ºé¡¹ç›®é»˜è®¤å€¼"
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr "é‡ç½®æ­¤é¡¹ç›®çš„授æƒå¯†é’¥å°†éœ€è¦æ›´æ–°æ¯ä¸ªè­¦æŠ¥æºä¸­å¯ç”¨çš„授æƒå¯†é’¥ã€‚"
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr "é‡ç½®æŽˆæƒå¯†é’¥å°†ä¼šä½¿å…ˆå‰çš„密钥无效。现有警报é…置需è¦é€šè¿‡æ–°çš„密钥更新。"
@@ -24743,6 +25613,9 @@ msgstr "通过电å­é‚®ä»¶åŸŸé™åˆ¶æˆå‘˜èµ„æ ¼"
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr "é™åˆ¶æ³¨å†Œçš„电å­é‚®ä»¶åœ°å€éœ€ä¸Žç»™å®šæ­£åˆ™è¡¨è¾¾å¼åŒ¹é…的。请å‚阅%{supported_syntax_link_start}支æŒçš„语法%{supported_syntax_link_end}获å–更多信æ¯ã€‚"
@@ -25117,8 +25990,8 @@ msgstr "ä¿å­˜%{name}大å°é™åˆ¶"
msgid "Save Changes"
msgstr "ä¿å­˜ä¿®æ”¹"
-msgid "Save Push Rules"
-msgstr "ä¿å­˜æŽ¨é€è§„则"
+msgid "Save Value Stream"
+msgstr ""
msgid "Save application"
msgstr "ä¿å­˜åº”用"
@@ -25189,6 +26062,9 @@ msgstr ""
msgid "Scopes"
msgstr "范围"
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr "范围ä¸èƒ½ä¸ºç©º"
@@ -25276,6 +26152,9 @@ msgstr "æœç´¢æ­¤æ–‡æœ¬"
msgid "Search forks"
msgstr "æœç´¢æ´¾ç”Ÿ"
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr "æœç´¢åˆå¹¶è¯·æ±‚"
@@ -25437,7 +26316,7 @@ msgstr "密ç "
msgid "Secret Detection"
msgstr "密ç æ£€æµ‹"
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25482,12 +26361,18 @@ msgstr "创建åˆå¹¶è¯·æ±‚时出错。"
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr "å¯ç”¨äºŽæŒ‰éœ€DAST"
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr "é…ç½®"
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr "无法获å–é…置数æ®ã€‚请刷新页é¢æˆ–ç¨åŽå†è¯•ã€‚"
@@ -25500,9 +26385,6 @@ msgstr "自定义常è§çš„SAST设置以满足您的需求。此处所åšçš„é…ç½
msgid "SecurityConfiguration|Enable"
msgstr "å¯ç”¨"
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr "通过åˆå¹¶è¯·æ±‚å¯ç”¨"
-
msgid "SecurityConfiguration|Enabled"
msgstr "å¯ç”¨"
@@ -25527,6 +26409,9 @@ msgstr "SAST分æžå·¥å…·"
msgid "SecurityConfiguration|SAST Configuration"
msgstr "SASTé…ç½®"
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr "安全控制"
@@ -25563,6 +26448,12 @@ msgstr "添加项目"
msgid "SecurityReports|Add projects to your group"
msgstr "添加项目到您的群组"
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr "评论已添加到'%{vulnerabilityName}'"
@@ -25572,12 +26463,12 @@ msgstr "评论已从'%{vulnerabilityName}' 删除"
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr "在'%{vulnerabilityName}' 上的评论已编辑"
+msgid "SecurityReports|Create Jira issue"
+msgstr ""
+
msgid "SecurityReports|Create issue"
msgstr "创建议题"
-msgid "SecurityReports|Dismiss Selected"
-msgstr "å–消选定的"
-
msgid "SecurityReports|Dismiss vulnerability"
msgstr "忽略æ¼æ´ž"
@@ -25596,6 +26487,9 @@ msgstr "下载报告"
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 "您无æƒæŸ¥çœ‹æ­¤ä»ªè¡¨æ¿æˆ–尚未设置仪表æ¿ã€‚请å‘管ç†å‘˜æŸ¥è¯¢æ‚¨çš„æƒé™è®¾ç½®ï¼Œæˆ–检查仪表æ¿é…置以继续。"
@@ -25611,9 +26505,6 @@ msgstr "获å–æ¼æ´žåˆ—表时出错。请检查您的网络连接,然åŽé‡è¯•
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr "无法获å–安全报告信æ¯ã€‚请é‡æ–°åŠ è½½é¡µé¢æˆ–ç¨åŽå†è¯•ã€‚"
-msgid "SecurityReports|False positive"
-msgstr "误报"
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr "Fuzzing产物"
@@ -25641,6 +26532,12 @@ msgstr "更多信æ¯"
msgid "SecurityReports|More information"
msgstr "更多信æ¯"
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr "未å‘现æ¼æ´ž"
@@ -25683,21 +26580,21 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr "请使用上é¢çš„项目æœç´¢å­—段æ¥é€‰æ‹©è¦æ·»åŠ çš„项目。"
-msgid "SecurityReports|Select a reason"
-msgstr "选择原因"
+msgid "SecurityReports|Set status"
+msgstr ""
msgid "SecurityReports|Severity"
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|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
-msgstr "级别“未知â€è¡¨ç¤ºåŸºç¡€æ‰«æ工具ä¸åŒ…å«å½’类或归类为严é‡çº§åˆ«ã€‚"
-
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
msgstr "安全仪表æ¿æ˜¾ç¤ºæ‚¨è¦ç›‘测项目的最新安全扫æ结果。将项目添加到群组中åŽå¯äºŽæ­¤å¤„æ¥æŸ¥çœ‹å…¶ä¸­çš„安全æ¼æ´žã€‚"
@@ -25719,10 +26616,6 @@ msgstr "创建åˆå¹¶è¯·æ±‚时出错。"
msgid "SecurityReports|There was an error deleting the comment."
msgstr "删除评论时出错。"
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] "忽略%d个æ¼æ´žæ—¶å‘生错误。请å†è¯•ä¸€æ¬¡ã€‚"
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr "忽略æ¼æ´žæ—¶å‡ºé”™ã€‚"
@@ -25765,8 +26658,8 @@ msgstr "虽然您的æµæ°´çº¿ä¸­æ²¡æœ‰æ¼æ´žï¼Œè¿™ç§çŽ°è±¡å¾ˆç½•è§ï¼Œä½†ä¹Ÿæ˜¯
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr "虽然没有å‘现æ¼æ´žï¼Œè¿™ç§çŽ°è±¡å¾ˆç½•è§ï¼Œä½†ä¹Ÿæ˜¯æœ‰å¯èƒ½çš„。无论如何,建议您仔细检查设置以确ä¿ä»ªè¡¨æ¿çš„é…置正确。"
-msgid "SecurityReports|Won't fix / Accept risk"
-msgstr "ä¸ä¿®å¤/接å—风险"
+msgid "SecurityReports|With issues"
+msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
msgstr "您没有足够的æƒé™è®¿é—®æ­¤æŠ¥å‘Š"
@@ -25774,8 +26667,8 @@ msgstr "您没有足够的æƒé™è®¿é—®æ­¤æŠ¥å‘Š"
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr "您必须以授æƒç”¨æˆ·èº«ä»½ç™»å½•æ‰èƒ½æŸ¥çœ‹æ­¤æŠ¥å‘Š"
-msgid "SecurityReports|[No reason]"
-msgstr "[æ— ç†ç”±]"
+msgid "Security|Policies"
+msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
msgstr "å‚è§GitLabçš„%{password_policy_guidelines}"
@@ -25861,9 +26754,6 @@ msgstr "选择指派人"
msgid "Select branch"
msgstr "选择分支"
-msgid "Select branch/tag"
-msgstr "选择分支/标签"
-
msgid "Select due date"
msgstr "设置截止日期"
@@ -25912,8 +26802,8 @@ msgstr "按项目选择地域"
msgid "Select projects"
msgstr "选择项目"
-msgid "Select required regulatory standard"
-msgstr "选择所需的法规标准"
+msgid "Select required regulatory standard."
+msgstr ""
msgid "Select reviewer(s)"
msgstr "选择审核者"
@@ -25954,12 +26844,18 @@ msgstr "选择类型"
msgid "Select user"
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 "选择GitLab用户将在议题和评论的æ述中加入指å‘该GitLab用户的链接(例如“由%{link_open}@johnsmith%{link_close}â€)。它还将与所选用户关è”å’Œ/或分é…这些议题和评论。"
@@ -26002,8 +26898,8 @@ msgstr "自我监控项目已æˆåŠŸåˆ›å»ºã€‚"
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr "自我监控项目已æˆåŠŸåˆ é™¤."
-msgid "Send a separate email notification to Developers."
-msgstr "å‘å¼€å‘人员å‘é€å•ç‹¬çš„电å­é‚®ä»¶é€šçŸ¥ã€‚"
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
+msgstr ""
msgid "Send confirmation email"
msgstr "å‘é€ç¡®è®¤é‚®ä»¶"
@@ -26179,6 +27075,9 @@ msgstr "为账å·åˆ›å»ºä¸€ä¸ªç”¨äºŽæŽ¨é€æˆ–拉å–çš„ %{protocol} 密ç ã€‚"
msgid "Set a template repository for projects in this group"
msgstr "为该群组中的项目设置文件模æ¿ä»“库"
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr "设置实例级别的域,å¯ç”¨äºŽæ‰€æœ‰é›†ç¾¤å®‰è£…Knative。"
@@ -26371,6 +27270,9 @@ msgstr "与GitLab的软件包注册表的使用和体验有关的设置。"
msgid "Setup"
msgstr "设置"
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr "严é‡ç¨‹åº¦"
@@ -26525,8 +27427,8 @@ msgid "Showing %d event"
msgid_plural "Showing %d events"
msgstr[0] "显示 %d 个事件"
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
-msgstr "显示%{ref_start}%{source_branch}%{strong_end}和%{ref_start}%{target_branch}%{strong_end}之间的%{conflict_start}%{conflicts_text}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
+msgstr ""
msgid "Showing %{count} of %{total} projects"
msgstr "显示%{count}个项目,共计%{total} 个"
@@ -26814,9 +27716,6 @@ msgstr "æœåŠ¡å™¨ç«¯å‡ºçŽ°é—®é¢˜ï¼Œè¯·é‡è¯•ã€‚"
msgid "Something went wrong on our end. Please try again."
msgstr "æœåŠ¡å™¨é”™è¯¯ã€‚ 请ç¨åŽå†è¯•ã€‚"
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr "试图改å˜è¿™ä¸ªè®®é¢˜çš„ç§å¯†æ€§æ—¶å‡ºçŽ°é”™è¯¯"
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr "è¯•å›¾æ”¹å˜ %{issuableDisplayName} çš„é”定状æ€æ—¶å‡ºé”™äº†"
@@ -26943,6 +27842,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr "解决当å‰è®¨è®ºæ—¶å‡ºé”™ï¼Œè¯·é‡è¯•ã€‚"
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr "åœæ­¢çŽ¯å¢ƒæ—¶å‡ºé”™ã€‚请é‡è¯•ã€‚"
@@ -27126,9 +28028,6 @@ msgstr "最近登录"
msgid "SortOptions|Recently starred"
msgstr "最近星标"
-msgid "SortOptions|Relevant"
-msgstr "相关性"
-
msgid "SortOptions|Size"
msgstr "大å°"
@@ -27318,12 +28217,15 @@ msgstr "由此更改 %{new_merge_request}"
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
-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 "å¯åŠ¨è¯„审"
@@ -27828,68 +28730,68 @@ msgstr "å˜æ›´å»ºè®®"
msgid "Suggested solutions help link"
msgstr "推è解决方案帮助链接"
-msgid "SuggestedColors|Bright green"
-msgstr "亮绿色"
+msgid "SuggestedColors|Aztec Gold"
+msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
-msgstr "æ·±ç°é’色"
+msgid "SuggestedColors|Blue"
+msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
-msgstr "暗中è“色"
+msgid "SuggestedColors|Blue-gray"
+msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
-msgstr "暗中橙色"
+msgid "SuggestedColors|Carrot orange"
+msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
-msgstr "暗中粉红色"
+msgid "SuggestedColors|Champagne"
+msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
-msgstr "暗中紫色"
+msgid "SuggestedColors|Charcoal grey"
+msgstr ""
-msgid "SuggestedColors|Feijoa"
-msgstr "æ–济果绿"
+msgid "SuggestedColors|Crimson"
+msgstr ""
-msgid "SuggestedColors|Lime green"
-msgstr "ç°ç»¿è‰²"
+msgid "SuggestedColors|Dark coral"
+msgstr ""
-msgid "SuggestedColors|Moderate blue"
-msgstr "中è“色"
+msgid "SuggestedColors|Dark green"
+msgstr ""
-msgid "SuggestedColors|Pure red"
-msgstr "纯红色"
+msgid "SuggestedColors|Dark sea green"
+msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
-msgstr "略微ä¸é¥±å’Œè“色"
+msgid "SuggestedColors|Dark violet"
+msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
-msgstr "略微ä¸é¥±å’Œç»¿è‰²"
+msgid "SuggestedColors|Deep violet"
+msgstr ""
-msgid "SuggestedColors|Soft orange"
-msgstr "浅橙色"
+msgid "SuggestedColors|Gray"
+msgstr ""
-msgid "SuggestedColors|Soft red"
-msgstr "浅红色"
+msgid "SuggestedColors|Green screen"
+msgstr ""
-msgid "SuggestedColors|Strong pink"
-msgstr "深粉色"
+msgid "SuggestedColors|Green-cyan"
+msgstr ""
-msgid "SuggestedColors|Strong red"
-msgstr "深红色"
+msgid "SuggestedColors|Lavendar"
+msgstr ""
-msgid "SuggestedColors|Strong yellow"
-msgstr "深黄色"
+msgid "SuggestedColors|Magenta-pink"
+msgstr ""
-msgid "SuggestedColors|UA blue"
-msgstr "æš—è“色"
+msgid "SuggestedColors|Medium sea green"
+msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
-msgstr "æžæš—ä¸é¥±å’Œè“色"
+msgid "SuggestedColors|Red"
+msgstr ""
-msgid "SuggestedColors|Very dark lime green"
-msgstr "æžæš—ç°ç»¿è‰²"
+msgid "SuggestedColors|Rose red"
+msgstr ""
-msgid "SuggestedColors|Very pale orange"
-msgstr "æžæ·¡æ©™è‰²"
+msgid "SuggestedColors|Titanium yellow"
+msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
msgstr "建议ä¸é€‚用,因为无法找到建议。"
@@ -27975,6 +28877,12 @@ 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})"
@@ -27984,7 +28892,7 @@ msgstr "系统页头和页脚"
msgid "System hook was successfully updated."
msgstr "系统钩å­å·²æˆåŠŸæ›´æ–°ã€‚"
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28179,6 +29087,9 @@ msgstr "æœåŠ¡æ¡æ¬¾å’Œéšç§æ”¿ç­–"
msgid "Terraform"
msgstr "Terraform"
+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] "%{number}个Terraform报告生æˆå¤±è´¥"
@@ -28238,6 +29149,9 @@ msgstr "é”定"
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr "ç”±%{user}于%{timeAgo}é”定"
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28250,6 +29164,9 @@ 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 "报告资æºæ›´æ”¹: 添加%{addNum}项, 更改%{changeNum}项, 删除%{deleteNum}项"
@@ -28271,6 +29188,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28317,9 +29237,6 @@ msgstr "添加测试用例到待办事项时出了错。"
msgid "TestCases|Something went wrong while creating a test case."
msgstr "创建新测试用例时出现错误."
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr "获å–测试用例数目时出了错。"
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr "获å–测试用例时出错。"
@@ -28808,6 +29725,9 @@ msgstr "预å‘布阶段概述了从åˆå¹¶è¯·æ±‚被åˆå¹¶åˆ°éƒ¨ç½²è‡³ç”Ÿäº§çŽ¯å¢ƒ
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
msgstr "下表的状æ€ä»…适用于默认分支,并且基于%{linkStart}最新的æµæ°´çº¿%{linkEnd}。为默认分支é…置了扫æåŽï¼Œæ‚¨åˆ›å»ºçš„所有åŽç»­åŠŸèƒ½åˆ†æ”¯éƒ½å°†åŒ…å«è¯¥æ‰«æ。"
+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 "对于现有å‘布,ä¸èƒ½æ›´æ”¹æ ‡ç­¾å称。"
@@ -28892,6 +29812,9 @@ 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 "没有已关闭的议题"
@@ -28910,12 +29833,18 @@ msgstr "当å‰æ— è®®é¢˜"
msgid "There are no issues to show."
msgstr "没有è¦æ˜¾ç¤ºçš„议题。"
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr "ç›®å‰æ— æ ‡è®°"
msgid "There are no matching files"
msgstr "没有匹é…的文件"
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr "没有未关闭的议题"
@@ -28946,12 +29875,12 @@ msgstr "环境上有正在è¿è¡Œçš„部署。请ç¨åŽé‡è¯•ã€‚"
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
-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 "没有å¯ç”¨çš„图表数æ®ã€‚"
@@ -28991,7 +29920,7 @@ msgstr "获å–项目标签时出错。"
msgid "There was a problem fetching project users."
msgstr "获å–项目用户时出错。"
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29006,7 +29935,7 @@ msgstr "ä¿å­˜æ‚¨çš„自定义阶段时出错,请é‡è¯•"
msgid "There was a problem sending the confirmation email"
msgstr "å‘é€ç¡®è®¤é‚®ä»¶æ—¶å‡ºçŽ°é—®é¢˜"
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29048,6 +29977,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr "获å–%{replicableType}时出错"
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr "获å–Geo设置时出错"
@@ -29078,6 +30010,9 @@ msgstr "获å–å²è¯—å‚与者时出错。"
msgid "There was an error importing the Jira project."
msgstr "导入Jira项目时出错。"
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr "加载用户活动日历时出错。"
@@ -29105,9 +30040,6 @@ msgstr "ä¿å­˜æ­¤Geo节点时出错。"
msgid "There was an error saving your changes."
msgstr "ä¿å­˜å˜æ›´æ—¶å‡ºé”™ã€‚"
-msgid "There was an error saving your notification settings."
-msgstr "ä¿å­˜é€šçŸ¥è®¾ç½®æ—¶å‘生错误。"
-
msgid "There was an error subscribing to this label."
msgstr "订阅此标记时出错。"
@@ -29120,6 +30052,9 @@ msgstr "åŒæ­¥%{replicableType}时出错"
msgid "There was an error trying to validate your query"
msgstr "å°è¯•éªŒè¯æ‚¨çš„查询时出错"
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr "更新Geo设置时出错"
@@ -29183,6 +30118,9 @@ 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 "Third Party Advisory Link"
msgstr "第三方建议链接"
@@ -29225,18 +30163,6 @@ msgstr "此项目目å‰å·²å­˜æ¡£å¹¶åªè¯»ã€‚如果您想è¦æ¢å¤æ‹‰å–é•œåƒï¼Œ
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr "æ­¤URLå·²ç»ç”¨äºŽå¦ä¸€ä¸ªé“¾æŽ¥ï¼›ä¸å…许é‡å¤ URL"
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr "æ­¤æ“作å¯èƒ½å¯¼è‡´æ•°æ®ä¸¢å¤±ã€‚为防止æ„外,我们会è¦æ±‚您确认您的æ“作。"
@@ -29408,6 +30334,9 @@ msgstr "这是已登录到您å¸æˆ·çš„设备列表。您å¯ä»¥åˆ é™¤ä»»ä½•æ‚¨æ— 
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr "这是一个涉åŠæ‚¨çš„å¸æˆ·é‡è¦äº‹ä»¶çš„安全日志。"
@@ -29705,6 +30634,9 @@ msgstr "找ä¸åˆ°è¦å›žå¤çš„主题"
msgid "Threat Monitoring"
msgstr "å¨èƒç›‘测"
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr "警报"
@@ -29738,6 +30670,9 @@ msgstr "丢弃数æ®åŒ…"
msgid "ThreatMonitoring|Environment"
msgstr "环境"
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30064,6 +30999,9 @@ msgstr "æ示:"
msgid "Tip: add a"
msgstr "æ示:添加一个"
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr "标题"
@@ -30214,12 +31152,12 @@ msgstr "è¦æŸ¥çœ‹å®žä¾‹çº§åˆ†æžï¼Œè¯·ç®¡ç†å‘˜æ‰“å¼€%{docLinkStart}使用情况
msgid "To widen your search, change or remove filters above"
msgstr "è¦æ‰©å¤§æœç´¢èŒƒå›´ï¼Œè¯·æ›´æ”¹æˆ–删除上é¢çš„筛选器"
+msgid "To widen your search, change or remove filters above."
+msgstr ""
+
msgid "To widen your search, change or remove filters."
msgstr "需è¦æ‰©å¤§æœç´¢èŒƒå›´ï¼Œè¯·æ›´æ”¹æˆ–移除筛选æ¡ä»¶ã€‚"
-msgid "To-Do"
-msgstr "待办事项"
-
msgid "To-Do List"
msgstr "待办事项列表"
@@ -30280,12 +31218,6 @@ msgstr "切æ¢æ­¤å¯¹è¯æ¡†"
msgid "Toggle thread"
msgstr "切æ¢ä¸»é¢˜"
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr "开关状æ€ï¼šå…³é—­"
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr "开关状æ€ï¼šå¼€å¯"
-
msgid "Toggled :%{name}: emoji award."
msgstr "åˆ‡æ¢ :%{name}: 表情符å·èµžèµã€‚"
@@ -30310,9 +31242,6 @@ msgstr "å¯ç”¨äº†å¤ªå¤šçš„命å空间。您需è¦é€šè¿‡æŽ§åˆ¶å°æˆ–APIæ¥ç®¡ç†
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr "å¯ç”¨äº†å¤ªå¤šçš„项目。您需è¦é€šè¿‡æŽ§åˆ¶å°æˆ–APIæ¥ç®¡ç†å®ƒä»¬ã€‚"
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr "指定的用户太多(é™åˆ¶ä¸º%{user_limit})"
-
msgid "Too much data"
msgstr "æ•°æ®è¿‡å¤š"
@@ -30439,21 +31368,27 @@ msgstr "树形视图"
msgid "Trending"
msgstr "热门"
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr "返回GitLab"
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
-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 ""
@@ -30461,15 +31396,12 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr "您å¯ä»¥å°†æ‚¨åœ¨ä¸€ä¸ªæ–°ç¾¤ç»„或一个现有群组上é¢è¿›è¡Œè¯•ç”¨ã€‚"
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr "您å¯ä»¥åœ¨ä¸ªäººå¸æˆ·æˆ–者群组上进行试用。"
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
-msgstr "您å¯ä»¥é€‰æ‹©åœ¨æ–°ç¾¤ç»„,现有群组或个人å¸æˆ·ä¸Šè¿›è¡Œè¯•ç”¨ã€‚"
-
msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr "您现在ä¸ä¼šèŽ·å¾—å…费试用,但以åŽå¯ä»¥éšæ—¶ç‚¹å‡»å¤´åƒå¹¶é€‰æ‹©â€œå¼€å§‹å…费试用â€æ¥ç»§ç»­æ­¤æµç¨‹ã€‚"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
+msgstr ""
+
msgid "Trial|Company name"
msgstr ""
@@ -30554,6 +31486,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr "使用跟踪对应用程åºè¿›è¡Œæ•…障排除与监控"
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr "请é‡è¯•"
@@ -30566,6 +31501,9 @@ msgstr "30天内体验GitLab的所有功能。"
msgid "Try changing or removing filters."
msgstr "请å°è¯•æ›´æ”¹æˆ–删除筛选器。"
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr "å°è¯•å†æ¬¡æ´¾ç”Ÿ"
@@ -30587,11 +31525,11 @@ msgstr "星期二"
msgid "Tuning settings"
msgstr "调整设定"
-msgid "Turn Off"
-msgstr "关闭"
+msgid "Turn off"
+msgstr ""
-msgid "Turn On"
-msgstr "å¼€å¯"
+msgid "Turn on"
+msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
msgstr "å¯ç”¨%{strongStart}使用情况检测(usage ping)%{strongEnd}以激活用户活动分æžï¼Œå³%{docLinkStart}世代表%{docLinkEnd}。"
@@ -30656,6 +31594,21 @@ msgstr "URL"
msgid "URL is required"
msgstr "URL是必需的"
+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 neccessary."
+msgstr ""
+
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}开始"
@@ -30788,6 +31741,9 @@ msgstr "撤销忽略"
msgid "Unexpected error"
msgstr "æ„外错误"
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr "很é—憾,您å‘é€ç»™GitLab的电å­é‚®ä»¶æ— æ³•å¤„ç†ã€‚"
@@ -30959,9 +31915,6 @@ msgstr "更新核准人"
msgid "Update failed"
msgstr "更新失败"
-msgid "Update failed. Please try again."
-msgstr "更新失败。请é‡è¯•ã€‚"
-
msgid "Update it"
msgstr "æ›´æ–°"
@@ -31139,6 +32092,12 @@ msgstr "LFS对象"
msgid "UsageQuota|LFS Storage"
msgstr "LFS存储"
+msgid "UsageQuota|Learn more about excess storage usage"
+msgstr ""
+
+msgid "UsageQuota|Learn more about usage quotas"
+msgstr ""
+
msgid "UsageQuota|Packages"
msgstr "软件包"
@@ -31241,6 +32200,96 @@ msgstr "您购买的存储空间已在低ä½ã€‚为了é¿å…项目被é”定,请
msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
msgstr ",您命å空间存储上é™æ€»è®¡%{formattedLimit}"
+msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
+msgstr ""
+
+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 "使用 %{code_start}::%{code_end} 创建 %{link_start}有范围标签集%{link_end} (例如 %{code_start}priority::1%{code_end})"
@@ -31250,8 +32299,8 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr "在GitLab内部使用æœåŠ¡å°é€šè¿‡ç”µå­é‚®ä»¶ä¸Žç”¨æˆ·è”系(例如æ供客户支æŒï¼‰"
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
-msgstr "在您的手机或计算机上使用一次密ç éªŒè¯å™¨å¯ç”¨åŒé‡è®¤è¯ (2FA)。"
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgstr ""
msgid "Use cURL"
msgstr ""
@@ -31271,7 +32320,7 @@ msgstr "æ¯ä¸ªURIå ä¸€è¡Œ"
msgid "Use template"
msgstr "使用模æ¿"
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31442,6 +32491,12 @@ 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 "群组"
@@ -31484,6 +32539,9 @@ 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 "用户没有任何个人项目"
@@ -31499,6 +32557,9 @@ msgstr "此用户没有星标任何项目"
msgid "UserProfile|This user is blocked"
msgstr "该用户已被ç¦ç”¨"
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr "未确认的用户"
@@ -31508,9 +32569,15 @@ 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 "您还没有创建任何个人项目"
@@ -31583,6 +32650,9 @@ msgstr "未分é…"
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr "使用 %{code_start}::%{code_end} 表示 %{link_start}范围标签集%{link_end}"
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr "当缺少加密字段时,使用必è¦çš„加密策略ï¼"
@@ -31700,6 +32770,9 @@ msgstr "查看警报详细信æ¯äºŽ"
msgid "View alert details."
msgstr "查看警报详细信æ¯ã€‚"
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr "查看所有议题"
@@ -31741,9 +32814,6 @@ msgstr "æµè§ˆæ–‡ä»¶ @ "
msgid "View file @ %{commitSha}"
msgstr "查看文件@%{commitSha}"
-msgid "View file @%{commit_sha}"
-msgstr "查看文件@%{commit_sha}"
-
msgid "View full dashboard"
msgstr "查看完整仪表æ¿"
@@ -31861,6 +32931,9 @@ msgstr "未知"
msgid "Visit settings page"
msgstr "访问设置页é¢"
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr "%{stepStart}步骤 1%{stepEnd}. å¤åˆ¶ä»¥ä¸‹è„šæœ¬ï¼š"
@@ -31927,6 +33000,9 @@ msgstr "%{formattedStartDate}到今天"
msgid "VulnerabilityChart|Severity"
msgstr "严é‡çº§åˆ«"
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr "由%{user}%{statusStart}确认%{statusEnd}于%{timeago}"
@@ -31948,15 +33024,27 @@ msgstr "更改状æ€"
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr "无法处ç†%{issueReference}: %{errorMessage}。"
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr "检测到"
msgid "VulnerabilityManagement|Needs triage"
msgstr "需è¦åˆ†ç±»"
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 "试图刷新æ¼æ´žæ—¶å‡ºé”™ã€‚请ç¨åŽå†è¯•ã€‚"
@@ -32155,6 +33243,12 @@ msgstr "我们å‘现以下错误:"
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr "我们建议您购买更多的æµæ°´çº¿åˆ†é’Ÿæ•°ï¼Œä»¥é¿å…任何æœåŠ¡ä¸­æ–­ã€‚"
@@ -32176,6 +33270,9 @@ msgstr "我们会通知%{inviter} ,您拒ç»äº†æ³¨å†ŒGitLab的邀请。您将ä
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 "我们在此通知您,您的GitLab ä¼ä¸šç‰ˆè®¢é˜…%{plan_name}已接近其用户上é™ã€‚您当å‰æœ‰%{active_user_count}个活跃用户,å³å°†è¾¾åˆ°%{maximum_user_count}的用户é™åˆ¶ã€‚"
+msgid "We'll continuously validate your pipeline configuration. The validation results will appear here."
+msgstr ""
+
msgid "We've found no vulnerabilities"
msgstr "未å‘现安全æ¼æ´ž"
@@ -32233,11 +33330,11 @@ msgstr "Webhook设置已移动。现在å¯ä»¥åœ¨è®¾ç½®èœå•ä¸­æ‰¾åˆ°ã€‚"
msgid "Webhooks|Comments"
msgstr "评论"
-msgid "Webhooks|Confidential Comments"
-msgstr "ç§å¯†è¯„论"
+msgid "Webhooks|Confidential comments"
+msgstr ""
-msgid "Webhooks|Confidential Issues events"
-msgstr "ç§å¯†è®®é¢˜äº‹ä»¶"
+msgid "Webhooks|Confidential issues events"
+msgstr ""
msgid "Webhooks|Deployment events"
msgstr "部署事件"
@@ -32245,8 +33342,8 @@ msgstr "部署事件"
msgid "Webhooks|Enable SSL verification"
msgstr "å¯ç”¨SSL验è¯"
-msgid "Webhooks|Feature Flag events"
-msgstr "功能标志事件"
+msgid "Webhooks|Feature flag events"
+msgstr ""
msgid "Webhooks|Issues events"
msgstr "议题事件"
@@ -32272,65 +33369,74 @@ msgstr "å‘布事件"
msgid "Webhooks|SSL verification"
msgstr "SSL验è¯"
-msgid "Webhooks|Secret Token"
-msgstr "密钥"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
+msgstr ""
msgid "Webhooks|Tag push events"
msgstr "标签推é€äº‹ä»¶"
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
-msgstr "当部署开始ã€å®Œæˆã€å¤±è´¥æˆ–å–消时触å‘æ­¤URL"
+msgid "Webhooks|Trigger"
+msgstr "触å‘æ¥æº"
+
+msgid "Webhooks|URL"
+msgstr "网å€"
+
+msgid "Webhooks|URL is triggered by a push to the repository"
+msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
-msgstr "当功能标志开å¯æˆ–关闭时触å‘æ­¤URL"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
+msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
-msgstr "当创建/æ›´æ–°å‘布时触å‘æ­¤URL"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
-msgstr "推é€åˆ°ä»“库时将触å‘此网å€"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
+msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
-msgstr "ç§å¯†è®®é¢˜åˆ›å»º/æ›´æ–°/关闭时将触å‘此网å€"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
+msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
-msgstr "åˆå¹¶è¯·æ±‚创建/æ›´æ–°/åˆå¹¶æ—¶å°†è§¦å‘此网å€"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
+msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
-msgstr "当一个新标签被推é€åˆ°ä»“库时将触å‘此网å€"
+msgid "Webhooks|URL is triggered when a release is created or updated"
+msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
-msgstr "wiki页é¢åˆ›å»º/更新时事件将触å‘此网å€"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
+msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
-msgstr "议题创建/æ›´æ–°/关闭时事件将触å‘此网å€"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
+msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
-msgstr "当有人添加评论时事件将触å‘此网å€"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
+msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
-msgstr "当有人å‘ç§å¯†è®®é¢˜æ·»åŠ è¯„论时网å€å°†è§¦å‘此网å€"
+msgid "Webhooks|URL is triggered when someone adds a comment"
+msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
-msgstr "当作业状æ€å˜åŒ–时将触å‘此网å€ã€‚"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
+msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
-msgstr "当æµæ°´çº¿çŠ¶æ€å˜åŒ–时将触å‘此网å€ã€‚"
+msgid "Webhooks|URL is triggered when the job status changes"
+msgstr ""
-msgid "Webhooks|Trigger"
-msgstr "触å‘æ¥æº"
+msgid "Webhooks|URL is triggered when the pipeline status changes"
+msgstr ""
-msgid "Webhooks|URL"
-msgstr "网å€"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
-msgstr "使用此令牌验è¯æ”¶åˆ°çš„有效数æ®ã€‚它将在X-Gitlab-Token HTTP报头中与请求一起å‘é€ã€‚"
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
-msgid "Webhooks|Wiki Page events"
-msgstr "Wiki页é¢äº‹ä»¶"
+msgid "Webhooks|Wiki page events"
+msgstr ""
msgid "Wednesday"
msgstr "星期三"
@@ -32368,6 +33474,9 @@ msgstr "您è¦æœç´¢ä»€ä¹ˆï¼Ÿ"
msgid "What describes you best?"
msgstr "如何形容您最åˆé€‚?"
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr "什么是压缩?"
@@ -32395,8 +33504,8 @@ msgstr "å¯ç”¨åŽï¼Œä»»ä½•è®¿é—® %{host} 并创建å¸æˆ·çš„用户都必须ç»è¿‡
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr "å¯ç”¨åŽï¼Œä»»ä½•è®¿é—®%{host}用户都å¯ä»¥åˆ›å»ºä¸€ä¸ªå¸æˆ·ã€‚"
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
-msgstr "å¯ç”¨åŽï¼Œå¦‚果在GitLab注册表中找ä¸åˆ°NPM软件包,我们将å°è¯•ä»Žå…¨å±€NPM注册表中æå–。"
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
+msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
msgstr "该项å¯ç”¨åŽï¼Œç”¨æˆ·åœ¨æŽ¥å—æ¡æ¬¾è¢«å‰å°†ä¸èƒ½ä½¿ç”¨GitLab。"
@@ -32561,11 +33670,8 @@ msgstr "删除页é¢"
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr "删除页é¢%{pageTitle}?"
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr "有人在åŒä¸€æ—¶é—´ç¼–辑了页é¢ã€‚请检查 %{page_link} 并确ä¿æ‚¨çš„更改ä¸ä¼šæ— æ„中删除。"
-
-msgid "WikiPageConflictMessage|the page"
-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 "WikiPageCreate|Create %{pageTitle}"
msgstr "创建%{pageTitle}"
@@ -32660,9 +33766,6 @@ msgstr "在此写评论或拖动您的文件到这里…"
msgid "Write a comment…"
msgstr "å‘表评论..."
-msgid "Write access allowed"
-msgstr "å·²å…许写入æƒé™"
-
msgid "Write milestone description..."
msgstr "写入里程碑æè¿°..."
@@ -32672,6 +33775,9 @@ msgstr "编写å‘行说明(Release Notes) 或将文件拖动到此处..."
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr "æ供了错误的外部UID。请正确é…ç½®Auth0。"
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr "YYYY-MM-DD"
@@ -32738,8 +33844,8 @@ msgstr "您将è¦å°† %{project_full_name} 转移到å¦ä¸€ä¸ªå称空间。您å®
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 "å³å°†å…³é—­ç§å¯†æ€§ã€‚这将使得%{strongStart}所有用户%{strongEnd}都å¯ä»¥æŸ¥çœ‹å¹¶ä¸”评论当å‰%{issuableType}。"
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
-msgstr "å³å°†å¼€å¯ç§å¯†æ€§ã€‚这将使得%{strongStart}至少有Reporter以上æƒé™%{strongEnd}的团队æˆå‘˜æ‰èƒ½æŸ¥çœ‹å¹¶ä¸”评论当å‰%{issuableType}。"
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
+msgstr ""
msgid "You are not allowed to approve a user"
msgstr "您无æƒæ‰¹å‡†ç”¨æˆ·"
@@ -32753,6 +33859,9 @@ 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 "您无æƒæ‰§è¡Œæ­¤æ“作"
@@ -32801,6 +33910,9 @@ msgstr "您也å¯ä»¥ç¨åŽç¼–辑此选项。"
msgid "You can create a new %{link}."
msgstr "您å¯ä»¥åˆ›å»ºä¸€ä¸ªæ–°çš„%{link}。"
+msgid "You can create a new %{name} inside this project by sending an email to the following email address:"
+msgstr ""
+
msgid "You can create a new Personal Access Token by visiting %{link}"
msgstr "您å¯ä»¥é€šè¿‡è®¿é—®%{link}创建一个新的个人访问令牌"
@@ -32948,6 +34060,9 @@ msgstr "您没有有效的许å¯è¯"
msgid "You do not have any subscriptions yet"
msgstr "您当å‰å°šæœªè®¢é˜…任何计划"
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr "您没有æƒé™é€€å‡º%{namespaceType}。"
@@ -33065,6 +34180,9 @@ msgstr "你还没有添加任何核准人。 请添加用户或群组。"
msgid "You have reached your project limit"
msgstr "您已达到项目数é‡é™åˆ¶"
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr "您已æˆåŠŸè´­ä¹°äº†%{seats}用户的%{plan}计划订阅。收æ®å°†é€šè¿‡ç”µå­é‚®ä»¶å‘é€ç»™æ‚¨ã€‚"
@@ -33296,9 +34414,6 @@ msgstr "您的许å¯è¯"
msgid "Your Personal Access Token was revoked"
msgstr "您的个人访问令牌已被åŠé”€ã€‚"
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr "您的个人访问令牌将在%{days_to_expire}天内过期。"
-
msgid "Your Primary Email will be used for avatar detection."
msgstr "您的主电å­é‚®ä»¶å°†ç”¨äºŽå¤´åƒæ£€æµ‹ã€‚"
@@ -33470,6 +34585,9 @@ 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 profile"
msgstr "个人资料"
@@ -33527,6 +34645,9 @@ msgstr "已删除Zoom会议"
msgid "[No reason]"
msgstr "[无原因]"
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33549,6 +34670,9 @@ msgstr "访问:"
msgid "added %{created_at_timeago}"
msgstr "创建于 %{created_at_timeago}"
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr "添加Zoom通è¯åˆ°æ­¤è®®é¢˜"
@@ -33762,6 +34886,9 @@ msgstr "Coverage Fuzzing"
msgid "ciReport|Coverage fuzzing"
msgstr "Coverage Fuzzing"
+msgid "ciReport|Create Jira issue"
+msgstr ""
+
msgid "ciReport|Create a merge request to implement this solution, or download and apply the patch manually."
msgstr "创建一个åˆå¹¶è¯·æ±‚æ¥æ‰§è¡Œè¿™ä¸ªè§£å†³æ–¹æ¡ˆï¼Œæˆ–者下载并手动应用补ä¸ã€‚"
@@ -33892,6 +35019,9 @@ msgstr "正在加载"
msgid "ciReport|is loading, errors when loading results"
msgstr "正在加载,加载结果时出错"
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr "已关闭议题"
@@ -34037,6 +35167,9 @@ msgstr[0] "文件"
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 "使用%{link_to_merge_request}于%{link_to_merge_request_source_branch}"
@@ -34174,6 +35307,9 @@ msgstr "ä¸æ˜¯æ‚¨è‡ªå·±çš„电å­é‚®ä»¶"
msgid "is not in the group enforcing Group Managed Account"
msgstr "ä¸åœ¨å¼ºåˆ¶æ‰§è¡Œç¾¤ç»„托管账户的群组"
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr "为åªè¯»"
@@ -34270,9 +35406,6 @@ msgstr "æ­¤æ¡ç›®ä¸­çš„渲染时间过长,å¯èƒ½æ— æ³•æŒ‰é¢„期显示。出于
msgid "math|There was an error rendering this math block"
msgstr "渲染此数学表达å¼æ—¶å‡ºé”™"
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] "åˆå¹¶è¯·æ±‚"
@@ -34313,9 +35446,6 @@ msgstr "åˆå¹¶è¯·æ±‚用于æ出对项目的更改并与他人进行讨论."
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr "请æ¢å¤æ­¤åˆ†æ”¯æˆ–使用其他的 %{missingBranchName} 分支"
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr "%{link_start}了解更多关于解决冲çª%{link_end}"
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34433,6 +35563,9 @@ msgstr "如果 %{missingBranchName} 分支存在于本地仓库中,则å¯ä»¥é€
msgid "mrWidget|Jump to first unresolved thread"
msgstr "跳转到第一个未解决的主题"
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr "加载部署统计信æ¯ä¸­"
@@ -34517,7 +35650,7 @@ msgstr "更改未åˆå¹¶åˆ°"
msgid "mrWidget|The changes will be merged into"
msgstr "更改将被åˆå¹¶åˆ°"
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34598,6 +35731,9 @@ msgstr "æµæ°´çº¿æˆåŠŸæ—¶è‡ªåŠ¨åˆå¹¶"
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr "æµæ°´çº¿æˆåŠŸæ—¶å¯åŠ¨åˆå¹¶é˜Ÿåˆ—"
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34607,9 +35743,15 @@ msgstr "必须是根命å空间"
msgid "must be a valid IPv4 or IPv6 address"
msgstr "必须是有效的IPv4或IPv6地å€"
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr "必须大于开始日期"
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr "å¿…é¡»åªåŒ…å«æœ‰æ•ˆçš„框架"
@@ -34658,9 +35800,6 @@ msgstr "æ— "
msgid "not found"
msgstr "未找到"
-msgid "notification emails"
-msgstr "通知邮件"
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr "%{firstItem} 和 %{lastItem}"
@@ -34942,6 +36081,12 @@ msgstr "下列议题"
msgid "this document"
msgstr "此文档"
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr "时间总计"
@@ -34969,6 +36114,9 @@ msgstr "已触å‘"
msgid "two-factor authentication settings"
msgstr "åŒé‡è®¤è¯è®¾ç½®"
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr "unicode域å应使用IDNAç¼–ç "
@@ -34996,9 +36144,6 @@ msgstr "用户首选项"
msgid "username"
msgstr "用户å"
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr "使用 Kubernetes 集群æ¥éƒ¨ç½²ä»£ç ï¼"
-
msgid "v%{version} published %{timeAgo}"
msgstr "v%{version}å‘布于%{timeAgo}"
diff --git a/locale/zh_HK/gitlab.po b/locale/zh_HK/gitlab.po
index c09f526216f..9af511caf70 100644
--- a/locale/zh_HK/gitlab.po
+++ b/locale/zh_HK/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: zh-HK\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:08\n"
+"PO-Revision-Date: 2021-03-05 23:51\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -72,6 +72,9 @@ msgstr ""
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -150,6 +153,10 @@ msgid "%d day"
msgid_plural "%d days"
msgstr[0] ""
+msgid "%d epic"
+msgid_plural "%d epics"
+msgstr[0] ""
+
msgid "%d error"
msgid_plural "%d errors"
msgstr[0] ""
@@ -290,6 +297,10 @@ msgid "%d vulnerability dismissed"
msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -363,6 +374,9 @@ msgid "%{count} issue selected"
msgid_plural "%{count} issues selected"
msgstr[0] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -432,6 +446,9 @@ 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 ""
@@ -483,6 +500,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -591,6 +611,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr ""
@@ -619,6 +645,15 @@ msgstr[0] ""
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr "%{number_commits_behind} 個è½å¾Œæ–¼ %{default_branch} 分支的æ交,%{number_commits_ahead} 個超å‰çš„æ交"
+msgid "%{oneMonthAgo} - %{today}"
+msgstr ""
+
+msgid "%{oneWeekAgo} - %{today}"
+msgstr ""
+
+msgid "%{oneYearAgo} - %{today}"
+msgstr ""
+
msgid "%{openOrClose} %{noteable}"
msgstr "%{openOrClose} %{noteable}"
@@ -665,9 +700,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -709,6 +741,9 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -879,6 +914,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -901,6 +939,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr ""
@@ -913,9 +954,6 @@ msgstr ""
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -940,9 +978,6 @@ msgstr "+ %{moreCount} 更多"
msgid "+ %{numberOfHiddenAssignees} more"
msgstr ""
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1027,6 +1062,10 @@ msgid "1 deploy key"
msgid_plural "%d deploy keys"
msgstr[0] ""
+msgid "1 follower"
+msgid_plural "%{count} followers"
+msgstr[0] ""
+
msgid "1 group"
msgid_plural "%d groups"
msgstr[0] "%d 個群組"
@@ -1069,6 +1108,9 @@ msgstr ""
msgid "10-19 contributions"
msgstr ""
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr "第一個貢ç»!"
@@ -1189,6 +1231,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1288,6 +1333,102 @@ msgstr ""
msgid "API Token"
msgstr ""
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr ""
@@ -1541,9 +1682,6 @@ msgstr ""
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
-msgid "Add a To Do"
-msgstr ""
-
msgid "Add a bullet list"
msgstr ""
@@ -1622,12 +1760,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr ""
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1724,6 +1868,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -1784,6 +1943,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr ""
+msgid "Adds email participant(s)"
+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 ""
@@ -1844,6 +2006,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -1964,6 +2129,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -1988,6 +2159,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr ""
@@ -1997,6 +2171,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr ""
@@ -2072,6 +2249,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr "æ´»èº"
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr "管ç†å“¡"
@@ -2165,6 +2345,15 @@ 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 ""
@@ -2174,6 +2363,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2258,6 +2450,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr ""
@@ -2267,6 +2465,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2300,6 +2510,21 @@ 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 ""
@@ -2324,6 +2549,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr "é€²éšŽæ¬Šé™ ï¼Œå¤§æª”æ¡ˆå„²å­˜èˆ‡é›™é‡é‘‘證設定"
@@ -2388,9 +2616,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2403,24 +2628,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2481,9 +2694,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2493,6 +2703,9 @@ 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 ""
@@ -2502,9 +2715,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2529,49 +2739,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2583,9 +2760,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2595,76 +2769,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
-msgstr ""
-
-msgid "AlertSettings|There was an error updating the alert settings."
-msgstr ""
-
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2676,13 +2829,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2694,9 +2847,6 @@ msgstr ""
msgid "Alerts"
msgstr ""
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2709,7 +2859,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2796,9 +2946,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -2859,7 +3006,7 @@ msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
+msgid "Allow this key to push to this repository"
msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
@@ -2901,6 +3048,9 @@ msgstr "å…許您增加和管ç†Kuberneteså¢é›†ã€‚"
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -2967,12 +3117,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3051,12 +3195,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3081,6 +3231,9 @@ msgstr ""
msgid "An error occurred while fetching markdown preview"
msgstr "è®€å– markdown é è¦½æ™‚發生錯誤"
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr ""
@@ -3174,6 +3327,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr ""
@@ -3201,12 +3357,18 @@ 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 ""
@@ -3249,8 +3411,11 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
-msgstr "儲存指派人時發生錯誤"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
+msgstr ""
msgid "An error occurred while subscribing to notifications."
msgstr "訂閱通知時出錯"
@@ -3288,6 +3453,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3300,10 +3468,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3658,9 +3826,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3688,6 +3853,9 @@ 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 erase this build?"
msgstr ""
@@ -3946,12 +4114,6 @@ msgstr[0] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4024,6 +4186,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4450,6 +4615,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4462,12 +4630,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4535,6 +4715,12 @@ 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 ""
@@ -4625,12 +4811,6 @@ msgstr "分支å稱"
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr "æœç´¢åˆ†æ”¯"
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr "切æ›åˆ†æ”¯"
-
msgid "Branches"
msgstr "分支"
@@ -4799,16 +4979,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4823,6 +5015,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4856,6 +5051,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4874,6 +5075,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -4925,6 +5129,25 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5060,6 +5283,9 @@ msgstr ""
msgid "Cancel"
msgstr "å–消"
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5213,12 +5439,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr "挑é¸åˆ°åˆ†æ”¯"
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr "還原分支"
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5363,6 +5583,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5585,7 +5808,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5600,6 +5823,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr "å·²å–消"
@@ -5933,21 +6159,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -5957,9 +6204,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6968,6 +7227,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7037,6 +7299,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7221,16 +7486,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7245,6 +7534,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7257,9 +7552,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7275,6 +7600,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7287,6 +7621,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7326,6 +7663,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7347,6 +7687,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7401,9 +7744,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7574,24 +7914,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8049,10 +8380,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8088,9 +8419,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8137,10 +8465,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8167,6 +8495,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr "建立分支"
@@ -8194,6 +8525,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8206,6 +8540,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr "建立標籤列表。å«æœ‰æ­¤æ¨™ç±¤çš„議題將會在清單中顯示。"
@@ -8221,6 +8558,12 @@ msgstr "建立里程碑"
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8293,6 +8636,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8302,15 +8648,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8329,6 +8690,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8338,6 +8702,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8353,6 +8720,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8458,6 +8828,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8506,13 +8879,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8539,8 +8912,8 @@ msgstr ""
msgid "Custom notification events"
msgstr "自定義通知事件"
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
-msgstr "自定義通知級別繼承自åƒèˆ‡ç´šåˆ¥ã€‚使用自定義通知級別,您會收到åƒèˆ‡ç´šåˆ¥åŠé¸å®šäº‹ä»¶çš„通知。想了解更多信æ¯ï¼Œè«‹æŸ¥çœ‹ %{notification_link}."
+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 ""
@@ -8581,6 +8954,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8614,6 +8990,18 @@ 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 ""
@@ -8777,7 +9165,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -8933,7 +9321,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -8957,6 +9351,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9038,6 +9435,9 @@ 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 ""
@@ -9047,6 +9447,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9071,6 +9474,10 @@ 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] ""
+
msgid "DastSiteValidation|Validate"
msgstr ""
@@ -9089,6 +9496,9 @@ 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 ""
@@ -9110,6 +9520,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9134,6 +9547,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9152,9 +9568,6 @@ msgstr "拒絕並登出"
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9209,6 +9622,9 @@ msgstr "使用 Cron 語法定義自定義模å¼"
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9239,6 +9655,9 @@ msgstr ""
msgid "Delete"
msgstr "刪除"
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9296,6 +9715,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9320,6 +9742,15 @@ 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 ""
@@ -9488,13 +9919,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
-msgstr ""
-
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9503,6 +9931,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9512,15 +9943,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9545,6 +9973,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9563,9 +9994,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9575,19 +10003,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9602,10 +10030,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9620,7 +10045,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9641,10 +10066,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
+msgstr ""
+
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Use this token as a password. Save it. This password can %{i_start}not%{i_end} be recovered."
msgstr ""
msgid "DeployTokens|Username"
@@ -9653,7 +10084,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9683,6 +10114,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9692,15 +10126,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9710,6 +10135,10 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+
msgid "Deployment|API"
msgstr ""
@@ -9932,18 +10361,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -9959,16 +10376,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -9989,10 +10406,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10001,18 +10415,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10025,9 +10433,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10037,6 +10442,12 @@ 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 ""
@@ -10064,6 +10475,9 @@ 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|Score"
msgstr ""
@@ -10175,7 +10589,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10377,6 +10791,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10569,10 +10986,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10641,12 +11058,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10767,6 +11178,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -10932,19 +11346,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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."
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the issue description"
-msgstr "輸入議題說明"
-
-msgid "Enter the issue title"
-msgstr "輸入議題標題"
-
-msgid "Enter the merge request description"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11229,6 +11637,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11253,6 +11664,12 @@ 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 ""
@@ -11280,6 +11697,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11307,6 +11727,9 @@ 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 ""
@@ -11331,9 +11754,6 @@ 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 "è‹¥è¦æŽ’程基於里程碑的 Epic %{epicDateType} 日期,請å°ä»»ä½• Epic 中的議題指定 %{epicDateType} 日期的里程碑。"
-msgid "Epics|Unable to perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11508,6 +11928,9 @@ msgstr ""
msgid "Error uploading file"
msgstr "上傳檔案時出錯"
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11673,6 +12096,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11688,6 +12114,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11730,6 +12159,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11766,6 +12198,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11799,6 +12234,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -11922,10 +12360,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -11952,6 +12390,12 @@ 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 ""
@@ -11988,9 +12432,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12006,9 +12447,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12042,10 +12480,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12090,7 +12528,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12108,9 +12546,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr "更新議題時發生錯誤,請ç¨å¾Œé‡è©¦ã€‚"
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12153,6 +12588,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12646,6 +13084,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12709,6 +13156,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr "派生自"
@@ -12739,7 +13222,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12817,9 +13300,6 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12832,6 +13312,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -12979,6 +13462,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13018,6 +13504,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13027,6 +13516,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13051,6 +13543,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13078,6 +13576,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13123,6 +13624,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13174,6 +13678,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13198,9 +13705,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13213,6 +13717,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13249,6 +13756,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13510,9 +14020,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13663,6 +14170,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13711,6 +14221,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14044,6 +14557,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14320,6 +14842,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14401,15 +14929,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14511,6 +15039,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14759,6 +15290,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15117,7 +15651,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15543,9 +16077,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15580,96 +16111,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15688,12 +16129,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15745,6 +16192,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15778,6 +16231,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -15946,6 +16402,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -15955,9 +16414,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -15967,9 +16423,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16009,19 +16498,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16030,18 +16540,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16051,6 +16576,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16273,6 +16804,9 @@ 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 ""
@@ -16348,10 +16882,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16399,6 +16930,9 @@ 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 ""
@@ -16414,7 +16948,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16474,6 +17008,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16498,6 +17035,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16699,6 +17239,9 @@ 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 ""
@@ -16768,9 +17311,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16849,6 +17389,9 @@ 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 ""
@@ -16868,6 +17411,9 @@ msgid "Last %d day"
msgid_plural "Last %d days"
msgstr[0] "最近 %d 天"
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -16913,6 +17459,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -16961,6 +17510,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -16994,6 +17546,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17045,9 +17600,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr "了解更多"
@@ -17057,6 +17609,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17240,9 +17882,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17352,6 +17991,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17391,7 +18033,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17751,6 +18393,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17763,9 +18408,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17823,6 +18465,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18093,6 +18738,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18174,9 +18822,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18186,9 +18831,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18237,6 +18879,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -18944,6 +19589,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -18953,6 +19601,9 @@ msgstr ""
msgid "Move"
msgstr ""
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr "移動議題"
@@ -18971,6 +19622,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19177,6 +19831,12 @@ 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 ""
@@ -19195,12 +19855,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19433,6 +20087,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr "新增分支"
@@ -19454,6 +20111,9 @@ msgstr ""
msgid "New directory"
msgstr "新增目錄"
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19496,6 +20156,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr "æ–°åˆä½µè«‹æ±‚"
@@ -19601,6 +20264,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19622,9 +20288,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19652,6 +20324,9 @@ 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 ""
@@ -19688,6 +20363,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -19916,13 +20594,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -19937,6 +20621,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 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 ""
@@ -19952,9 +20639,6 @@ msgstr ""
msgid "Notification events"
msgstr "通知事件"
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -19982,6 +20666,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr "åˆä½µè«‹æ±‚被åˆä½µ"
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20036,9 +20723,6 @@ msgstr "åƒèˆ‡"
msgid "NotificationLevel|Watch"
msgstr "關注"
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr "通知"
@@ -20150,6 +20834,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20171,6 +20861,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20204,9 +20897,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20382,7 +21081,7 @@ 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."
+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."
@@ -20415,7 +21114,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20430,6 +21129,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20442,10 +21147,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20514,6 +21219,9 @@ 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 ""
@@ -20568,9 +21276,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20625,6 +21330,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20637,6 +21351,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20760,9 +21477,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20781,6 +21495,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20799,6 +21516,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20838,6 +21561,9 @@ 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|npm command"
msgstr ""
@@ -20859,15 +21585,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -20940,6 +21666,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -20997,10 +21732,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21096,6 +21831,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21147,9 +21885,6 @@ msgstr "æµæ°´ç·šè¨ˆåŠƒ"
msgid "Pipeline Schedules"
msgstr "æµæ°´ç·šè¨ˆåŠƒ"
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21171,10 +21906,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21249,15 +21984,6 @@ msgstr "æµæ°´ç·šåœ–表"
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr "去年的æµæ°´ç·š"
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21285,10 +22011,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21303,9 +22029,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21330,6 +22053,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21366,9 +22092,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21402,6 +22125,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21414,12 +22140,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21459,6 +22194,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21471,6 +22209,12 @@ 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 ""
@@ -21528,6 +22272,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21597,6 +22344,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21720,12 +22470,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21786,21 +22542,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21822,6 +22596,12 @@ 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 ""
@@ -21930,6 +22710,9 @@ 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 ""
@@ -22014,24 +22797,6 @@ msgstr "個人資料"
msgid "Profile Settings"
msgstr "個人資料設定"
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22068,6 +22833,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22425,6 +23193,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22653,10 +23424,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22668,7 +23436,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22683,6 +23451,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22710,16 +23484,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22758,13 +23529,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22800,13 +23571,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22833,16 +23607,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -22866,7 +23649,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -22890,52 +23673,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23214,10 +23994,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23226,9 +24006,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23244,6 +24021,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23259,6 +24045,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23271,22 +24063,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23295,6 +24087,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23385,9 +24183,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23430,9 +24225,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23445,6 +24237,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23538,7 +24333,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23634,7 +24429,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23727,6 +24564,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23763,6 +24603,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -23933,6 +24776,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24038,6 +24884,9 @@ msgstr ""
msgid "Remove due date"
msgstr "刪除截止日期"
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24104,6 +24953,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24272,7 +25124,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24322,12 +25174,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24399,6 +25254,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24426,6 +25287,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24522,6 +25389,9 @@ msgstr "申請權é™"
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24540,6 +25410,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24650,9 +25523,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24743,6 +25613,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25117,7 +25990,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25189,6 +26062,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25276,6 +26152,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25437,7 +26316,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25482,12 +26361,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25500,9 +26385,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25527,6 +26409,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25563,6 +26448,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25572,10 +26463,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25596,6 +26487,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25611,9 +26505,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25641,6 +26532,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25683,19 +26580,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25719,10 +26616,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25765,7 +26658,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25774,7 +26667,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -25861,9 +26754,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr "é¸æ“‡åˆ†æ”¯/標籤"
-
msgid "Select due date"
msgstr ""
@@ -25912,7 +26802,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -25954,12 +26844,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26002,7 +26898,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26179,6 +27075,9 @@ msgstr "為賬號添加壹個用於推é€æˆ–拉å–çš„ %{protocol} 密碼。"
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26371,6 +27270,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26525,7 +27427,7 @@ msgid "Showing %d event"
msgid_plural "Showing %d events"
msgstr[0] "顯示 %d 個事件"
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26814,9 +27716,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -26943,6 +27842,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27126,9 +28028,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27318,12 +28217,15 @@ msgstr "由此更改 %{new_merge_request}"
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27828,67 +28730,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -27975,6 +28877,12 @@ 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 ""
@@ -27984,7 +28892,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28179,6 +29087,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28238,6 +29149,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28250,6 +29164,9 @@ 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 ""
@@ -28271,6 +29188,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28317,9 +29237,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28808,6 +29725,9 @@ msgstr "é ç™¼å¸ƒéšŽæ®µæ¦‚述了åˆä½µè«‹æ±‚çš„åˆä½µåˆ°éƒ¨ç½²ä»£ç¢¼åˆ°ç”Ÿç”¢ç’°
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -28892,6 +29812,9 @@ 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 "沒有已關閉的議題"
@@ -28910,12 +29833,18 @@ msgstr "沒有å¯ä»¥é¡¯ç¤ºçš„è­°é¡Œ"
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -28946,10 +29875,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -28991,7 +29920,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29006,7 +29935,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29048,6 +29977,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29078,6 +30010,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29105,9 +30040,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29120,6 +30052,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29183,6 +30118,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29225,18 +30163,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29408,6 +30334,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29705,6 +30634,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29738,6 +30670,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30064,6 +30999,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30214,10 +31152,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30280,12 +31218,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30310,9 +31242,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30439,20 +31368,26 @@ msgstr "樹狀顯示"
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30461,13 +31396,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30554,6 +31486,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30566,6 +31501,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30587,10 +31525,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30656,6 +31594,21 @@ 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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30788,6 +31741,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -30959,9 +31915,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31139,6 +32092,12 @@ 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|Packages"
msgstr ""
@@ -31241,6 +32200,96 @@ 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 ""
@@ -31250,7 +32299,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31271,7 +32320,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31442,6 +32491,12 @@ 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 "群組"
@@ -31484,6 +32539,9 @@ 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 ""
@@ -31499,6 +32557,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31508,9 +32569,15 @@ 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 ""
@@ -31583,6 +32650,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31700,6 +32770,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31741,9 +32814,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -31861,6 +32931,9 @@ msgstr "未知"
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -31927,6 +33000,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -31948,15 +33024,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32155,6 +33243,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32176,6 +33270,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32233,10 +33330,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32245,7 +33342,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32272,64 +33369,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32368,6 +33474,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32395,7 +33504,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32561,10 +33670,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32660,9 +33766,6 @@ msgstr "寫評論或拖動你的文件到這裡"
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32672,6 +33775,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32738,7 +33844,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32753,6 +33859,9 @@ 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 ""
@@ -32801,6 +33910,9 @@ 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 ""
@@ -32948,6 +34060,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33065,6 +34180,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr "您已é”到項目數é‡é™åˆ¶"
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33296,9 +34414,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33470,6 +34585,9 @@ 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 profile"
msgstr ""
@@ -33527,6 +34645,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33549,6 +34670,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33762,6 +34886,9 @@ 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 ""
@@ -33892,6 +35019,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34037,6 +35167,9 @@ msgstr[0] ""
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 ""
@@ -34174,6 +35307,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34270,9 +35406,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34313,9 +35446,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34433,6 +35563,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34517,7 +35650,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34598,6 +35731,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34607,9 +35743,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34658,9 +35800,6 @@ msgstr "ç„¡"
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr "通知郵件"
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -34942,6 +36081,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -34969,6 +36114,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -34996,9 +36144,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/locale/zh_TW/gitlab.po b/locale/zh_TW/gitlab.po
index f6a8b567823..6c12df7fde6 100644
--- a/locale/zh_TW/gitlab.po
+++ b/locale/zh_TW/gitlab.po
@@ -14,9 +14,9 @@ msgstr ""
"X-Crowdin-Language: zh-TW\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-02-01 17:04\n"
+"PO-Revision-Date: 2021-03-05 23:53\n"
-msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author}"
+msgid " %{project_name}#%{issuable_iid} &middot; opened %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
msgstr ""
msgid " %{start} to %{end}"
@@ -72,6 +72,9 @@ msgstr " 或引用 (例如:專案/路徑!åˆä½µè«‹æ±‚_ID)"
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr "「%{ref}ã€ä¸Šæ²’有「%{path}ã€"
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
@@ -150,6 +153,10 @@ msgid "%d day"
msgid_plural "%d days"
msgstr[0] ""
+msgid "%d epic"
+msgid_plural "%d epics"
+msgstr[0] ""
+
msgid "%d error"
msgid_plural "%d errors"
msgstr[0] ""
@@ -290,6 +297,10 @@ msgid "%d vulnerability dismissed"
msgid_plural "%d vulnerabilities dismissed"
msgstr[0] ""
+msgid "%d vulnerability updated"
+msgid_plural "%d vulnerabilities updated"
+msgstr[0] ""
+
msgid "%d warning found:"
msgid_plural "%d warnings found:"
msgstr[0] ""
@@ -363,6 +374,9 @@ msgid "%{count} issue selected"
msgid_plural "%{count} issues selected"
msgstr[0] ""
+msgid "%{count} items per page"
+msgstr ""
+
msgid "%{count} merge request selected"
msgid_plural "%{count} merge requests selected"
msgstr[0] ""
@@ -432,6 +446,9 @@ msgstr "%{edit_in_new_fork_notice} è«‹å†æ¬¡å˜—試還原此æ交。"
msgid "%{edit_in_new_fork_notice} Try to upload a file again."
msgstr "%{edit_in_new_fork_notice} è«‹å†æ¬¡å˜—試上傳檔案。"
+msgid "%{emailPrefix}@company.com"
+msgstr ""
+
msgid "%{extra} more downstream pipelines"
msgstr "還有 %{extra} 個下游æµæ°´ç·š"
@@ -483,6 +500,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr ""
@@ -591,6 +611,12 @@ msgstr ""
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
+msgid "%{name} %{status}"
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
msgid "%{name} contained %{resultsString}"
msgstr "%{name} åŒ…å« %{resultsString}"
@@ -619,6 +645,15 @@ msgstr[0] ""
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr "%{number_commits_behind} 個è½å¾Œæ–¼ %{default_branch} 分支的æ交,%{number_commits_ahead} 個領先æ交"
+msgid "%{oneMonthAgo} - %{today}"
+msgstr ""
+
+msgid "%{oneWeekAgo} - %{today}"
+msgstr ""
+
+msgid "%{oneYearAgo} - %{today}"
+msgstr ""
+
msgid "%{openOrClose} %{noteable}"
msgstr "%{openOrClose} %{noteable}"
@@ -665,9 +700,6 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
-msgid "%{requirementCount} requirements have been selected for export. These will be sent to %{email} as an attachment once finished."
-msgstr ""
-
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
msgstr ""
@@ -709,6 +741,9 @@ msgstr "%{spanStart}在行號%{spanEnd} %{errorLine}%{errorColumn}"
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr "%{spanStart}æ–¼%{spanEnd} %{errorFn}"
+msgid "%{startDate} - %{endDate}"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr "%{start} 到 %{end}"
@@ -879,6 +914,9 @@ msgstr ""
msgid "'%{name}' Value Stream deleted"
msgstr ""
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
msgid "'%{name}' stage already exists"
msgstr ""
@@ -901,6 +939,9 @@ msgstr ""
msgid "(+%{count}&nbsp;rules)"
msgstr ""
+msgid "(Group Managed Account)"
+msgstr ""
+
msgid "(No changes)"
msgstr "(無變更)"
@@ -913,9 +954,6 @@ msgstr "(檢查進度)"
msgid "(deleted)"
msgstr ""
-msgid "(line: %{startLine})"
-msgstr ""
-
msgid "(max size 15 MB)"
msgstr ""
@@ -940,9 +978,6 @@ msgstr "+ 其餘 %{moreCount} 項"
msgid "+ %{numberOfHiddenAssignees} more"
msgstr "+ 其餘 %{numberOfHiddenAssignees} 項"
-msgid "+ %{numberOfHiddenReviewers} more"
-msgstr ""
-
msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
@@ -1027,6 +1062,10 @@ msgid "1 deploy key"
msgid_plural "%d deploy keys"
msgstr[0] ""
+msgid "1 follower"
+msgid_plural "%{count} followers"
+msgstr[0] ""
+
msgid "1 group"
msgid_plural "%d groups"
msgstr[0] "%d 個群組"
@@ -1069,6 +1108,9 @@ msgstr "1-9 é …è²¢ç»"
msgid "10-19 contributions"
msgstr "10-19 é …è²¢ç»"
+msgid "1000+"
+msgstr ""
+
msgid "1st contribution!"
msgstr "您的第一次貢ç»ï¼"
@@ -1189,6 +1231,9 @@ msgstr ""
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
msgstr ""
+msgid "A label list displays issues with the selected label."
+msgstr ""
+
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr ""
@@ -1288,6 +1333,102 @@ msgstr ""
msgid "API Token"
msgstr "API 權æ–"
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Authentication is handled by providing HTTP basic authentication token as a header or cookie. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API fuzzing target."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
+msgstr ""
+
+msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "APIFuzzing|Copy code only"
+msgstr ""
+
+msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestPassword"
+msgstr ""
+
+msgid "APIFuzzing|Ex: $TestUsername"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|Ex: Project_Test/File/example_fuzz.json"
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|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|Instead of entering the password directly, enter the key of the CI variable set to the password."
+msgstr ""
+
+msgid "APIFuzzing|Instead of entering the username directly, enter the key of the CI variable set to the username."
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+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|The configuration could not be saved, please try again later."
+msgstr ""
+
+msgid "APIFuzzing|There are two ways to perform scans."
+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|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|We recommend that you review the JSON specifications file before adding it to a repository."
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
msgid "AWS Access Key"
msgstr "AWS å­˜å–金鑰"
@@ -1541,9 +1682,6 @@ msgstr "加入 GPG 金鑰"
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr "在管ç†å´é‚Šæ¬„的監控部分加入 Grafana 按鈕,以便存å–關於GitLab 執行狀æ³å’Œæ•ˆèƒ½çš„å„種統計資料。"
-msgid "Add a To Do"
-msgstr "加入待辦事項"
-
msgid "Add a bullet list"
msgstr "加入項目清單"
@@ -1622,12 +1760,18 @@ 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 domain"
msgstr ""
msgid "Add email address"
msgstr "加入電å­éƒµä»¶åœ°å€"
+msgid "Add email participant(s)"
+msgstr ""
+
msgid "Add environment"
msgstr ""
@@ -1724,6 +1868,21 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
+msgid "AddMember|Already a member of %{source_name}"
+msgstr ""
+
+msgid "AddMember|Email cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|Member already invited to %{source_name}"
+msgstr ""
+
+msgid "AddMember|Member cannot be invited because they already requested to join %{source_name}"
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr "未指定使用者。"
@@ -1784,6 +1943,9 @@ msgstr ""
msgid "Adds an issue to an epic."
msgstr "å‘å²è©©åŠ å…¥è­°é¡Œã€‚"
+msgid "Adds email participant(s)"
+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 ""
@@ -1844,6 +2006,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Groups"
+msgstr ""
+
msgid "AdminArea|Guest"
msgstr ""
@@ -1964,6 +2129,12 @@ msgstr ""
msgid "AdminSettings|Integrations configured here will automatically apply to all projects on this instance."
msgstr ""
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
msgid "AdminSettings|Moved to integrations"
msgstr ""
@@ -1988,6 +2159,9 @@ msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
msgstr "設定實體範åœè‡ªå‹•åŒ…å«çš„ %{link_start}æµæ°´ç·šè¨­å®š%{link_end}。此æµæ°´ç·šè¨­å®šå°‡åœ¨å°ˆæ¡ˆæœ¬èº«çš„設定後執行。"
@@ -1997,6 +2171,9 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
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 required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
msgstr "強制æµæ°´ç·šè¨­å®šå¯å¾žè¨­å®šçš„ %{link_start}實體範本庫%{link_end} 中的 %{code_start}gitlab-ci%{code_end} 目錄é¸æ“‡ï¼Œæˆ–使用 GitLab æ供的設定檔。"
@@ -2072,6 +2249,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr "æ´»èº"
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr "管ç†å“¡"
@@ -2165,6 +2345,15 @@ 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 ""
@@ -2174,6 +2363,9 @@ msgstr "這就是你ï¼"
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr "新增使用者"
@@ -2258,6 +2450,12 @@ msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
+msgid "AdminUsers|Unlock"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
msgid "AdminUsers|User will not be able to access git repositories"
msgstr "ä½¿ç”¨è€…å°‡ç„¡æ³•å­˜å– git 版本庫"
@@ -2267,6 +2465,18 @@ 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|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2300,6 +2510,21 @@ 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 ""
@@ -2324,6 +2549,9 @@ msgstr ""
msgid "Advanced Settings"
msgstr ""
+msgid "Advanced export options"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr "進階權é™ï¼Œå¤§åž‹æª”案儲存 (LFS) 和兩步驟èªè­‰è¨­å®šã€‚"
@@ -2388,9 +2616,6 @@ msgstr ""
msgid "AlertManagement|Create incident"
msgstr ""
-msgid "AlertManagement|Critical"
-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 ""
@@ -2403,24 +2628,12 @@ msgstr ""
msgid "AlertManagement|Events"
msgstr ""
-msgid "AlertManagement|High"
-msgstr ""
-
msgid "AlertManagement|Incident"
msgstr ""
-msgid "AlertManagement|Info"
-msgstr ""
-
msgid "AlertManagement|Key"
msgstr ""
-msgid "AlertManagement|Low"
-msgstr ""
-
-msgid "AlertManagement|Medium"
-msgstr ""
-
msgid "AlertManagement|Metrics"
msgstr ""
@@ -2481,9 +2694,6 @@ 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 To-Do of the alert."
-msgstr ""
-
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
msgstr ""
@@ -2493,6 +2703,9 @@ 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 ""
@@ -2502,9 +2715,6 @@ msgstr ""
msgid "AlertManagement|Triggered"
msgstr ""
-msgid "AlertManagement|Unknown"
-msgstr ""
-
msgid "AlertManagement|Value"
msgstr ""
@@ -2529,49 +2739,16 @@ 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 "AlertService|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
-msgstr ""
-
-msgid "AlertService|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
-msgstr ""
-
-msgid "AlertSettings|1. Select integration type"
-msgstr ""
-
-msgid "AlertSettings|2. Name integration"
-msgstr ""
-
-msgid "AlertSettings|3. Set up webhook"
-msgstr ""
-
-msgid "AlertSettings|4. Sample alert payload (optional)"
-msgstr ""
-
-msgid "AlertSettings|5. Map fields (optional)"
-msgstr ""
-
-msgid "AlertSettings|API URL"
-msgstr ""
-
-msgid "AlertSettings|Active"
-msgstr ""
-
-msgid "AlertSettings|Add URL and auth key to your Prometheus config file"
-msgstr ""
-
-msgid "AlertSettings|Add new integrations"
-msgstr ""
-
-msgid "AlertSettings|Alert test payload"
+msgid "AlertSettings|Add new integration"
msgstr ""
msgid "AlertSettings|Authorization key"
msgstr ""
-msgid "AlertSettings|Authorization key has been successfully reset. Please save your changes now."
+msgid "AlertSettings|Configure details"
msgstr ""
-msgid "AlertSettings|Copy"
+msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
msgid "AlertSettings|Delete integration"
@@ -2583,9 +2760,6 @@ msgstr ""
msgid "AlertSettings|Enter integration name"
msgstr ""
-msgid "AlertSettings|Enter test alert JSON...."
-msgstr ""
-
msgid "AlertSettings|External Prometheus"
msgstr ""
@@ -2595,76 +2769,55 @@ msgstr ""
msgid "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields."
msgstr ""
-msgid "AlertSettings|If you've provided a sample alert payload, you can create a custom mapping for your endpoint. The default GitLab alert keys are listed below. Please define which payload key should map to the specified GitLab key."
+msgid "AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click \"parse payload fields\" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration."
msgstr ""
msgid "AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations."
msgstr ""
-msgid "AlertSettings|Integration"
+msgid "AlertSettings|Name integration"
msgstr ""
-msgid "AlertSettings|Learn more about our our upcoming %{linkStart}integrations%{linkEnd}"
+msgid "AlertSettings|Parse payload for custom mapping"
msgstr ""
msgid "AlertSettings|Proceed with editing"
msgstr ""
-msgid "AlertSettings|Prometheus"
-msgstr ""
-
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional), or to test the integration (also optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional)."
msgstr ""
-msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional)."
+msgid "AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point."
msgstr ""
msgid "AlertSettings|Reset Key"
msgstr ""
-msgid "AlertSettings|Reset key"
-msgstr ""
-
msgid "AlertSettings|Reset the mapping"
msgstr ""
msgid "AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
msgstr ""
-msgid "AlertSettings|Review your external service's documentation to learn where to provide this information to your external service, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
+msgid "AlertSettings|Sample alert payload (optional)"
msgstr ""
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
msgstr ""
-msgid "AlertSettings|Save and test payload"
-msgstr ""
-
msgid "AlertSettings|Save integration"
msgstr ""
msgid "AlertSettings|Select integration type"
msgstr ""
-msgid "AlertSettings|Submit payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert payload"
-msgstr ""
-
-msgid "AlertSettings|Test alert sent successfully. If you have made other changes, please save them now."
-msgstr ""
-
-msgid "AlertSettings|Test failed. Do you still want to save your changes anyway?"
-msgstr ""
-
-msgid "AlertSettings|There was an error updating the alert settings."
+msgid "AlertSettings|Send"
msgstr ""
-msgid "AlertSettings|There was an error while trying to reset the key. Please refresh the page to try again."
+msgid "AlertSettings|Send test alert"
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http or https"
@@ -2676,13 +2829,13 @@ msgstr ""
msgid "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint."
msgstr ""
-msgid "AlertSettings|Webhook URL"
+msgid "AlertSettings|View credentials"
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."
+msgid "AlertSettings|Webhook URL"
msgstr ""
-msgid "AlertSettings|You must provide this URL and authorization key to authorize an external service to send alerts to GitLab. You can provide this URL and key to multiple services. After configuring an external service, alerts from your service will display on the GitLab %{linkStart}Alerts%{linkEnd} page."
+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|Your integration was successfully updated."
@@ -2694,9 +2847,6 @@ msgstr ""
msgid "Alerts"
msgstr "警示"
-msgid "Alerts endpoint is deprecated and should not be created or modified. Use HTTP Integrations instead."
-msgstr ""
-
msgid "AlertsIntegrations|Alerts will be created through this integration"
msgstr ""
@@ -2709,7 +2859,7 @@ msgstr ""
msgid "AlertsIntegrations|Integration Name"
msgstr ""
-msgid "AlertsIntegrations|Integration payload is invalid. You can still save your changes."
+msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet"
@@ -2796,9 +2946,6 @@ msgstr "所有專案"
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr "因為這個專案已開啟 %{linkStart}Auto DevOps%{linkEnd},已啟用所有安全掃æ"
-
msgid "All threads resolved"
msgstr ""
@@ -2859,8 +3006,8 @@ msgstr "å…許 Webhook åŠæœå‹™å‘本機網路請求"
msgid "Allow subgroups to set up their own two-factor authentication rules"
msgstr ""
-msgid "Allow this key to push to repository as well? (Default only allows pull access.)"
-msgstr "åŒæ™‚å…許此金鑰推é€åˆ°ç‰ˆæœ¬åº«å—Žï¼Ÿï¼ˆé è¨­åªæœ‰æ‹‰å–權é™ï¼‰"
+msgid "Allow this key to push to this repository"
+msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
@@ -2901,6 +3048,9 @@ msgstr "讓你能加入åŠç®¡ç† Kubernetes å¢é›†ã€‚"
msgid "Almost there"
msgstr "å³å°‡å®Œæˆ"
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -2967,12 +3117,6 @@ msgstr ""
msgid "An error has occurred"
msgstr "發生錯誤"
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr "å‘話題加入è‰ç¨¿æ™‚發生錯誤。"
@@ -3051,12 +3195,18 @@ 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 branches. Retry the search."
msgstr ""
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3081,6 +3231,9 @@ msgstr "抓å–標籤é¡è‰²æ™‚發生錯誤。"
msgid "An error occurred while fetching markdown preview"
msgstr "æŠ“å– Markdown é è¦½æ™‚發生錯誤"
+msgid "An error occurred while fetching participants."
+msgstr ""
+
msgid "An error occurred while fetching pending comments"
msgstr "抓å–待處ç†ç•™è¨€æ™‚發生錯誤"
@@ -3174,6 +3327,9 @@ msgstr ""
msgid "An error occurred while loading project creation UI"
msgstr ""
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
msgid "An error occurred while loading the data. Please try again."
msgstr "載入資料時發生錯誤。請é‡è©¦ã€‚"
@@ -3201,12 +3357,18 @@ 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 "建立請求時發生錯誤。"
@@ -3249,8 +3411,11 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
-msgid "An error occurred while saving assignees"
-msgstr "儲存å—託人時發生錯誤。"
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
+msgid "An error occurred while searching users."
+msgstr ""
msgid "An error occurred while subscribing to notifications."
msgstr "訂閱通知時發生錯誤。"
@@ -3288,6 +3453,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr "驗證群組路徑時發生錯誤"
@@ -3300,10 +3468,10 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr "發生了錯誤,請å†è©¦ä¸€æ¬¡ã€‚"
-msgid "An error ocurred while loading your content. Please try again."
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
-msgid "An example project for managing Kubernetes clusters integrated with 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 ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
@@ -3658,9 +3826,6 @@ msgstr "確定è¦å–消編輯此留言嗎?"
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -3688,6 +3853,9 @@ 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 erase this build?"
msgstr "你確定è¦åˆªé™¤é€™å€‹çµ„建嗎?"
@@ -3946,12 +4114,6 @@ msgstr[0] ""
msgid "Attaching the file failed."
msgstr ""
-msgid "Attachment"
-msgstr ""
-
-msgid "Attachments"
-msgstr ""
-
msgid "Audit Events"
msgstr ""
@@ -4024,6 +4186,9 @@ msgstr ""
msgid "Authenticating"
msgstr ""
+msgid "Authentication"
+msgstr ""
+
msgid "Authentication Failure"
msgstr ""
@@ -4450,6 +4615,9 @@ msgstr ""
msgid "Billing|An error occurred while loading billable members list"
msgstr ""
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
msgid "Billing|Enter at least three characters to search."
msgstr ""
@@ -4462,12 +4630,24 @@ msgstr ""
msgid "Billing|Private"
msgstr ""
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
msgid "Billing|Type to search"
msgstr ""
+msgid "Billing|User was successfully removed"
+msgstr ""
+
msgid "Billing|Users occupying seats in"
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 ""
@@ -4535,6 +4715,12 @@ 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 ""
@@ -4625,12 +4811,6 @@ msgstr ""
msgid "Branch not loaded - %{branchId}"
msgstr ""
-msgid "BranchSwitcherPlaceholder|Search branches"
-msgstr ""
-
-msgid "BranchSwitcherTitle|Switch branch"
-msgstr ""
-
msgid "Branches"
msgstr ""
@@ -4799,16 +4979,28 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
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|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -4823,6 +5015,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -4856,6 +5051,12 @@ msgstr ""
msgid "Business metrics (Custom)"
msgstr ""
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
msgid "Buy License"
msgstr ""
@@ -4874,6 +5075,9 @@ msgstr ""
msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
msgstr ""
+msgid "By default, GitLab sends emails to help guide users through the onboarding process."
+msgstr ""
+
msgid "By default, all projects and groups will use the global notifications setting."
msgstr ""
@@ -4925,6 +5129,25 @@ msgstr ""
msgid "CI/CD settings"
msgstr ""
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+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 ""
@@ -5060,6 +5283,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Cancel and close"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -5213,12 +5439,6 @@ msgstr ""
msgid "ChangeReviewer|Unassigned"
msgstr ""
-msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr ""
-
-msgid "ChangeTypeActionLabel|Revert in branch"
-msgstr ""
-
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
msgstr ""
@@ -5363,6 +5583,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -5585,7 +5808,7 @@ msgstr ""
msgid "Choose the top-level group for your repository imports."
msgstr ""
-msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions."
+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."
@@ -5600,6 +5823,9 @@ msgstr ""
msgid "Choose your framework"
msgstr ""
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -5933,21 +6159,42 @@ msgstr ""
msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
msgid "ClusterAgents|Connect your cluster with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
+msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
@@ -5957,9 +6204,21 @@ msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
+msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
+msgstr ""
+
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6968,6 +7227,9 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Coverage: %{coveragePercentage}"
+msgstr ""
+
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr ""
@@ -7037,6 +7299,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7221,16 +7486,40 @@ msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|Compare"
+msgid "CompareBranches|There isn't anything to compare."
+msgstr ""
+
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareBranches|Source"
+msgid "CompareRevisions|Compare"
msgstr ""
-msgid "CompareBranches|Target"
+msgid "CompareRevisions|Create merge request"
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+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|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 updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
msgstr ""
msgid "Complete"
@@ -7245,6 +7534,12 @@ msgstr ""
msgid "Compliance Dashboard"
msgstr ""
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance framework (optional)"
+msgstr ""
+
msgid "Compliance framework (optional)"
msgstr ""
@@ -7257,9 +7552,39 @@ msgstr ""
msgid "ComplianceFrameworks|All"
msgstr ""
+msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+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|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgstr ""
+
msgid "ComplianceFrameworks|Once you have created a compliance framework it will appear here."
msgstr ""
@@ -7275,6 +7600,15 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
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 "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgstr ""
+
+msgid "ComplianceFramework|Edit Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|GDPR"
msgstr ""
@@ -7287,6 +7621,9 @@ msgstr ""
msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
msgstr ""
+msgid "ComplianceFramework|New Compliance Framework"
+msgstr ""
+
msgid "ComplianceFramework|PCI-DSS"
msgstr ""
@@ -7326,6 +7663,9 @@ msgstr ""
msgid "Configure Gitaly timeouts."
msgstr ""
+msgid "Configure Integrations"
+msgstr ""
+
msgid "Configure Let's Encrypt"
msgstr ""
@@ -7347,6 +7687,9 @@ msgstr ""
msgid "Configure limit for issues created per minute by web and API requests."
msgstr ""
+msgid "Configure limit for notes created per minute by web and API requests."
+msgstr ""
+
msgid "Configure limits for Project/Group Import/Export."
msgstr ""
@@ -7401,9 +7744,6 @@ msgstr ""
msgid "ConfluenceService|Your GitLab Wiki can be accessed here: %{wiki_link}. To re-enable your GitLab Wiki, disable this integration"
msgstr ""
-msgid "Congratulations! You have enabled Two-factor Authentication!"
-msgstr ""
-
msgid "Congratulations, your free trial is activated."
msgstr ""
@@ -7574,24 +7914,15 @@ msgstr ""
msgid "ContainerRegistry|Docker connection error"
msgstr ""
-msgid "ContainerRegistry|Expiration policies help manage the storage space used by the Container Registry, but the expiration policies for this registry are disabled. Contact your administrator to enable. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Expiration policy is disabled"
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
-msgid "ContainerRegistry|Filter by name"
-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 Repositories"
-msgstr ""
-
msgid "ContainerRegistry|Image repository deletion failed"
msgstr ""
@@ -8049,10 +8380,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8088,9 +8419,6 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't calculate number of %{issuables}."
-msgstr ""
-
msgid "Country"
msgstr ""
@@ -8137,10 +8465,10 @@ msgstr ""
msgid "Create a merge request"
msgstr ""
-msgid "Create a new branch"
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
msgstr ""
-msgid "Create a new deploy key for this project"
+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."
@@ -8167,6 +8495,9 @@ 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 blank project"
+msgstr ""
+
msgid "Create branch"
msgstr ""
@@ -8194,6 +8525,9 @@ msgstr ""
msgid "Create from"
msgstr ""
+msgid "Create from template"
+msgstr ""
+
msgid "Create group"
msgstr ""
@@ -8206,6 +8540,9 @@ msgstr ""
msgid "Create iteration"
msgstr ""
+msgid "Create list"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -8221,6 +8558,12 @@ msgstr ""
msgid "Create new"
msgstr ""
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new CI/CD pipeline"
+msgstr ""
+
msgid "Create new Value Stream"
msgstr ""
@@ -8293,6 +8636,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8302,15 +8648,30 @@ msgstr ""
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new 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 ""
@@ -8329,6 +8690,9 @@ msgstr ""
msgid "CreateValueStreamForm|Enter value stream name"
msgstr ""
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
@@ -8338,6 +8702,9 @@ msgstr ""
msgid "CreateValueStreamForm|New stage"
msgstr ""
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
msgid "CreateValueStreamForm|Please select a start event first"
msgstr ""
@@ -8353,6 +8720,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -8458,6 +8828,9 @@ msgstr ""
msgid "Credentials"
msgstr ""
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
msgid "CredentialsInventory|No credentials found"
msgstr ""
@@ -8506,13 +8879,13 @@ msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
-msgid "CurrentUser|One of your groups is running out"
+msgid "CurrentUser|Edit profile"
msgstr ""
-msgid "CurrentUser|Profile"
+msgid "CurrentUser|One of your groups is running out"
msgstr ""
-msgid "CurrentUser|Settings"
+msgid "CurrentUser|Preferences"
msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
@@ -8539,7 +8912,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
+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"
@@ -8581,6 +8954,9 @@ msgstr ""
msgid "Customizable by an administrator."
msgstr ""
+msgid "Customizable by owners."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -8614,6 +8990,18 @@ 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 ""
@@ -8777,7 +9165,7 @@ msgstr ""
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
-msgid "DAST Profiles"
+msgid "DAST Scans"
msgstr ""
msgid "DNS"
@@ -8933,7 +9321,13 @@ msgstr ""
msgid "DastProfiles|New site profile"
msgstr ""
-msgid "DastProfiles|No profiles created yet"
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No scans saved yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
@@ -8957,6 +9351,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Run scan"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -9038,6 +9435,9 @@ 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 ""
@@ -9047,6 +9447,9 @@ msgstr ""
msgid "DastSiteValidation|Retry validation"
msgstr ""
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
msgid "DastSiteValidation|Step 1 - Choose site validation method"
msgstr ""
@@ -9071,6 +9474,10 @@ 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] ""
+
msgid "DastSiteValidation|Validate"
msgstr ""
@@ -9089,6 +9496,9 @@ 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 ""
@@ -9110,6 +9520,9 @@ msgstr ""
msgid "Date range cannot exceed %{maxDateRange} days."
msgstr ""
+msgid "Date range is greater than %{quarter_days} days"
+msgstr ""
+
msgid "Day of month"
msgstr ""
@@ -9134,6 +9547,9 @@ msgstr ""
msgid "Dear Administrator,"
msgstr ""
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
msgid "Debug"
msgstr ""
@@ -9152,9 +9568,6 @@ msgstr ""
msgid "Decompressed archive size validation failed."
msgstr ""
-msgid "Default Branch"
-msgstr ""
-
msgid "Default CI configuration path"
msgstr ""
@@ -9209,6 +9622,9 @@ msgstr ""
msgid "Define approval settings."
msgstr ""
+msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -9239,6 +9655,9 @@ msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete %{issuableType}"
+msgstr ""
+
msgid "Delete %{name}"
msgstr ""
@@ -9296,6 +9715,9 @@ msgstr ""
msgid "Delete this attachment"
msgstr ""
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
msgid "Delete user list"
msgstr ""
@@ -9320,6 +9742,15 @@ 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 ""
@@ -9488,13 +9919,10 @@ msgstr ""
msgid "Deploy key was successfully updated."
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository"
+msgid "Deploy keys"
msgstr ""
-msgid "Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
-msgstr ""
-
-msgid "Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one."
+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}."
@@ -9503,6 +9931,9 @@ msgstr ""
msgid "Deploy to..."
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|Freeze end"
msgstr ""
@@ -9512,15 +9943,12 @@ msgstr ""
msgid "DeployFreeze|No deploy freezes exist for this project. To add one, click %{strongStart}Add deploy freeze%{strongEnd}"
msgstr ""
-msgid "DeployFreeze|Specify times when deployments are not allowed for an environment. The %{filename} file must be updated to make deployment jobs aware of the %{freeze_period_link_start}freeze period%{freeze_period_link_end}."
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
msgstr ""
msgid "DeployFreeze|Time zone"
msgstr ""
-msgid "DeployFreeze|You can specify deploy freezes using only %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
-msgstr ""
-
msgid "DeployKeys|+%{count} others"
msgstr ""
@@ -9545,6 +9973,9 @@ msgstr ""
msgid "DeployKeys|Expand %{count} other projects"
msgstr ""
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
msgid "DeployKeys|Loading deploy keys"
msgstr ""
@@ -9563,9 +9994,6 @@ msgstr ""
msgid "DeployKeys|Read access only"
msgstr ""
-msgid "DeployKeys|Write access allowed"
-msgstr ""
-
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
msgstr ""
@@ -9575,19 +10003,19 @@ msgstr ""
msgid "DeployTokens|Add a deploy token"
msgstr ""
-msgid "DeployTokens|Allows read access to the package registry"
+msgid "DeployTokens|Allows read access to the package registry."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the registry images"
+msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
-msgid "DeployTokens|Allows read-only access to the repository"
+msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
-msgid "DeployTokens|Allows write access to the package registry"
+msgid "DeployTokens|Allows write access to registry images."
msgstr ""
-msgid "DeployTokens|Allows write access to the registry images"
+msgid "DeployTokens|Allows write access to the package registry."
msgstr ""
msgid "DeployTokens|Copy deploy token"
@@ -9602,10 +10030,7 @@ msgstr ""
msgid "DeployTokens|Created"
msgstr ""
-msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it."
-msgstr ""
-
-msgid "DeployTokens|Deploy Tokens"
+msgid "DeployTokens|Deploy tokens"
msgstr ""
msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
@@ -9620,7 +10045,7 @@ msgstr ""
msgid "DeployTokens|Name"
msgstr ""
-msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
+msgid "DeployTokens|Pick a name for your unique deploy token."
msgstr ""
msgid "DeployTokens|Revoke"
@@ -9641,10 +10066,16 @@ msgstr ""
msgid "DeployTokens|This action cannot be undone."
msgstr ""
-msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
-msgid "DeployTokens|Use this username as a login."
+msgid "DeployTokens|Unless you enter a date, the token does not expire."
+msgstr ""
+
+msgid "DeployTokens|Unless you specify a username, it is set to \"gitlab+deploy-token-{n}\"."
+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"
@@ -9653,7 +10084,7 @@ msgstr ""
msgid "DeployTokens|You are about to revoke %{b_start}%{name}%{b_end}."
msgstr ""
-msgid "DeployTokens|Your New Deploy Token"
+msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
@@ -9683,6 +10114,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "DeploymentFrequencyCharts|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "DeploymentFrequencyCharts|Date"
msgstr ""
@@ -9692,15 +10126,6 @@ msgstr ""
msgid "DeploymentFrequencyCharts|Deployments charts"
msgstr ""
-msgid "DeploymentFrequencyCharts|Deployments to production for last month (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for last week (%{startDate} - %{endDate})"
-msgstr ""
-
-msgid "DeploymentFrequencyCharts|Deployments to production for the last 90 days (%{startDate} - %{endDate})"
-msgstr ""
-
msgid "DeploymentFrequencyCharts|Something went wrong while getting deployment frequency data"
msgstr ""
@@ -9710,6 +10135,10 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+
msgid "Deployment|API"
msgstr ""
@@ -9932,18 +10361,6 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoptionSegmentSelection|The maximum number of selections has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of segments has been reached"
-msgstr ""
-
-msgid "DevopsAdoptionSegment|The maximum number of selections has been reached"
-msgstr ""
-
msgid "DevopsAdoption|%{selectedCount} group selected"
msgstr ""
@@ -9959,16 +10376,16 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while deleting the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
msgstr ""
-msgid "DevopsAdoption|Are you sure that you would like to delete %{name}?"
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
msgid "DevopsAdoption|At least 1 MR opened"
@@ -9989,10 +10406,7 @@ msgstr ""
msgid "DevopsAdoption|At least 1 security scan of any type run in pipeline"
msgstr ""
-msgid "DevopsAdoption|Confirm delete Group"
-msgstr ""
-
-msgid "DevopsAdoption|Delete Group"
+msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|Deploys"
@@ -10001,18 +10415,12 @@ 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 Group"
-msgstr ""
-
msgid "DevopsAdoption|Feature adoption is based on usage in the last calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
msgstr ""
-msgid "DevopsAdoption|Group data pending until the start of next month"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -10025,9 +10433,6 @@ msgstr ""
msgid "DevopsAdoption|My group"
msgstr ""
-msgid "DevopsAdoption|Name"
-msgstr ""
-
msgid "DevopsAdoption|No filter results."
msgstr ""
@@ -10037,6 +10442,12 @@ 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 ""
@@ -10064,6 +10475,9 @@ 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|Score"
msgstr ""
@@ -10175,7 +10589,7 @@ msgstr ""
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
-msgid "Discover|See the other features of the %{linkStart}gold plan%{linkEnd}"
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
msgstr ""
msgid "Discover|Start a free trial"
@@ -10377,6 +10791,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -10569,10 +10986,10 @@ msgstr ""
msgid "Email Notification"
msgstr ""
-msgid "Email address to use for Support Desk"
+msgid "Email a new %{name} to this project"
msgstr ""
-msgid "Email cannot be blank"
+msgid "Email address to use for Support Desk"
msgstr ""
msgid "Email could not be sent"
@@ -10641,12 +11058,6 @@ msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
-msgid "EmailToken|reset it"
-msgstr ""
-
-msgid "EmailToken|resetting..."
-msgstr ""
-
msgid "Emails"
msgstr ""
@@ -10767,6 +11178,9 @@ msgstr ""
msgid "Enable header and footer in emails"
msgstr ""
+msgid "Enable in-product marketing emails"
+msgstr ""
+
msgid "Enable integration"
msgstr ""
@@ -10932,19 +11346,13 @@ msgstr ""
msgid "Enter one or more user ID separated by commas"
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 issue description"
+msgid "Enter the %{name} description"
msgstr ""
-msgid "Enter the issue title"
+msgid "Enter the %{name} title"
msgstr ""
-msgid "Enter the merge request description"
-msgstr ""
-
-msgid "Enter the merge request title"
+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 name of your application, and we'll return a unique %{type}."
@@ -11229,6 +11637,9 @@ msgstr ""
msgid "Epic"
msgstr ""
+msgid "Epic Boards"
+msgstr ""
+
msgid "Epic cannot be found."
msgstr ""
@@ -11253,6 +11664,12 @@ 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 ""
@@ -11280,6 +11697,9 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
msgid "Epics|Remove epic"
msgstr ""
@@ -11307,6 +11727,9 @@ 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 ""
@@ -11331,9 +11754,6 @@ 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 perform this action"
-msgstr ""
-
msgid "Epics|Unable to save epic. Please try again"
msgstr ""
@@ -11508,6 +11928,9 @@ msgstr ""
msgid "Error uploading file"
msgstr ""
+msgid "Error uploading file. Please try again."
+msgstr ""
+
msgid "Error uploading file: %{stripped}"
msgstr ""
@@ -11673,6 +12096,9 @@ msgstr ""
msgid "Evidence collection"
msgstr ""
+msgid "Ex: Example.com"
+msgstr ""
+
msgid "Exactly one of %{attributes} is required"
msgstr ""
@@ -11688,6 +12114,9 @@ msgstr ""
msgid "Except policy:"
msgstr ""
+msgid "Exceptions"
+msgstr ""
+
msgid "Excess storage"
msgstr ""
@@ -11730,6 +12159,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -11766,6 +12198,9 @@ msgstr ""
msgid "Expires at"
msgstr ""
+msgid "Expires at (optional)"
+msgstr ""
+
msgid "Expires in %{expires_at}"
msgstr ""
@@ -11799,6 +12234,9 @@ msgstr ""
msgid "Export"
msgstr ""
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
msgid "Export as CSV"
msgstr ""
@@ -11922,10 +12360,10 @@ msgstr ""
msgid "Failed to create Merge Request. Please try again."
msgstr ""
-msgid "Failed to create To-Do for the design."
+msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
-msgid "Failed to create a branch for this issue. Please try again."
+msgid "Failed to create a to-do item for the design."
msgstr ""
msgid "Failed to create framework"
@@ -11952,6 +12390,12 @@ 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 ""
@@ -11988,9 +12432,6 @@ msgstr ""
msgid "Failed to load group activity metrics. Please try again."
msgstr ""
-msgid "Failed to load groups & users."
-msgstr ""
-
msgid "Failed to load groups, users and deploy keys."
msgstr ""
@@ -12006,9 +12447,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar confidential toggle"
-msgstr ""
-
msgid "Failed to load sidebar lock status"
msgstr ""
@@ -12042,10 +12480,10 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
-msgid "Failed to remove To-Do for the design."
+msgid "Failed to remove a Zoom meeting"
msgstr ""
-msgid "Failed to remove a Zoom meeting"
+msgid "Failed to remove a to-do item for the design."
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -12090,7 +12528,7 @@ msgstr ""
msgid "Failed to signing using smartcard authentication"
msgstr ""
-msgid "Failed to toggle To-Do for the design."
+msgid "Failed to toggle the to-do status for the design."
msgstr ""
msgid "Failed to update branch!"
@@ -12108,9 +12546,6 @@ msgstr ""
msgid "Failed to update issues, please try again."
msgstr ""
-msgid "Failed to update tag!"
-msgstr ""
-
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -12153,6 +12588,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -12646,6 +13084,15 @@ msgstr ""
msgid "Folder/%{name}"
msgstr ""
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
msgid "Font Color"
msgstr ""
@@ -12709,6 +13156,42 @@ msgstr ""
msgid "Fork project?"
msgstr ""
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Internal"
+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 "ForkedFromProjectPath|Forked from"
msgstr ""
@@ -12739,7 +13222,7 @@ msgstr ""
msgid "Free Trial"
msgstr ""
-msgid "Free Trial of GitLab.com Gold"
+msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
msgid "Freeze end"
@@ -12817,9 +13300,6 @@ msgstr "Geo"
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes Beta"
-msgstr ""
-
msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
msgstr ""
@@ -12832,6 +13312,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -12979,6 +13462,9 @@ msgstr ""
msgid "Geo|%{name} is scheduled for re-verify"
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 ""
@@ -13018,6 +13504,9 @@ msgstr ""
msgid "Geo|Could not remove tracking entry for an existing upload."
msgstr ""
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -13027,6 +13516,9 @@ msgstr ""
msgid "Geo|Geo Status"
msgstr ""
+msgid "Geo|Geo sites"
+msgstr ""
+
msgid "Geo|Go to the primary site"
msgstr ""
@@ -13051,6 +13543,12 @@ msgstr ""
msgid "Geo|Last time verified"
msgstr ""
+msgid "Geo|Learn more about Geo"
+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 ""
@@ -13078,6 +13576,9 @@ msgstr ""
msgid "Geo|Primary node"
msgstr ""
+msgid "Geo|Primary site"
+msgstr ""
+
msgid "Geo|Project"
msgstr ""
@@ -13123,6 +13624,9 @@ msgstr ""
msgid "Geo|Secondary node"
msgstr ""
+msgid "Geo|Secondary site"
+msgstr ""
+
msgid "Geo|Status"
msgstr ""
@@ -13174,6 +13678,9 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere."
+msgstr ""
+
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo node."
msgstr ""
@@ -13198,9 +13705,6 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with a project that follows best practices for setting up GitLab for your own organization, including sample Issues, Merge Requests, and Milestones"
-msgstr ""
-
msgid "Get started with error tracking"
msgstr ""
@@ -13213,6 +13717,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13249,6 +13756,9 @@ msgstr ""
msgid "GitHub import"
msgstr ""
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
msgid "GitLab"
msgstr ""
@@ -13510,9 +14020,6 @@ msgstr ""
msgid "Go full screen"
msgstr ""
-msgid "Go to %{strongStart}Issues%{strongEnd} &gt; %{strongStart}Boards%{strongEnd} to access your personalized learning issue board."
-msgstr ""
-
msgid "Go to Integrations"
msgstr ""
@@ -13663,6 +14170,9 @@ msgstr ""
msgid "Grant access"
msgstr ""
+msgid "Grant write permissions to this key"
+msgstr ""
+
msgid "Graph"
msgstr ""
@@ -13711,6 +14221,9 @@ msgstr ""
msgid "Group URL"
msgstr ""
+msgid "Group Wikis"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -14044,6 +14557,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -14320,6 +14842,12 @@ msgstr ""
msgid "Guideline"
msgstr ""
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path"
+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 ""
@@ -14401,15 +14929,15 @@ msgstr ""
msgid "Helps reduce request volume for protected paths"
msgstr ""
-msgid "Here are all your projects in your group, including the one you just created. To start, let’s take a look at your personalized learning project which will help you learn about GitLab at your own pace."
-msgstr ""
-
msgid "Here you will find recent merge request activity"
msgstr ""
msgid "Hi %{username}!"
msgstr ""
+msgid "Hide"
+msgstr ""
+
msgid "Hide archived projects"
msgstr ""
@@ -14511,6 +15039,9 @@ msgstr ""
msgid "How do I configure runners?"
msgstr ""
+msgid "How do I generate it?"
+msgstr ""
+
msgid "How do I mirror repositories?"
msgstr ""
@@ -14759,6 +15290,9 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
@@ -15117,7 +15651,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Gold trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Gold – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -15543,9 +16077,6 @@ msgstr ""
msgid "Install GitLab Runner on Kubernetes"
msgstr ""
-msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and use that app to scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
-msgstr ""
-
msgid "Install on clusters"
msgstr ""
@@ -15580,96 +16111,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -15688,12 +16129,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -15745,6 +16192,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -15778,6 +16231,9 @@ msgstr ""
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
+msgid "Integrations|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
msgid "Integrations|To keep this project going, create a new issue."
msgstr ""
@@ -15946,6 +16402,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -15955,9 +16414,6 @@ msgstr ""
msgid "Invite members"
msgstr ""
-msgid "Invite team members"
-msgstr ""
-
msgid "Invite your team"
msgstr ""
@@ -15967,9 +16423,42 @@ 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|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
+msgstr ""
+
+msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
+msgstr ""
+
+msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
+msgstr ""
+
+msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to master and deploy to production."
+msgstr ""
+
+msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
+msgstr ""
+
+msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
+msgstr ""
+
+msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+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|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgstr ""
+
+msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+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 ""
@@ -16009,19 +16498,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16030,18 +16540,33 @@ msgstr ""
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
+msgid "InviteMember|Don't worry, you can always invite teammates later"
+msgstr ""
+
msgid "InviteMember|Invite Members (optional)"
msgstr ""
msgid "InviteMember|Invite another member"
msgstr ""
+msgid "InviteMember|Invite another teammate"
+msgstr ""
+
msgid "InviteMember|Invite members"
msgstr ""
+msgid "InviteMember|Invite teammates to your GitLab group"
+msgstr ""
+
+msgid "InviteMember|Invite users to your group %{group_name} so you can collaborate on your projects"
+msgstr ""
+
msgid "InviteMember|Invite your team"
msgstr ""
+msgid "InviteMember|Invite your teammates"
+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 ""
@@ -16051,6 +16576,12 @@ msgstr ""
msgid "InviteMember|See who can invite members for you"
msgstr ""
+msgid "InviteMember|Send invitations"
+msgstr ""
+
+msgid "InviteMember|Skip this for now"
+msgstr ""
+
msgid "InviteMember|Until then, ask an owner to invite new project members for you"
msgstr ""
@@ -16273,6 +16804,9 @@ 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 ""
@@ -16348,10 +16882,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iteration|Dates cannot overlap with other existing Iterations"
-msgstr ""
-
-msgid "Iteration|cannot be in the past"
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
@@ -16399,6 +16930,9 @@ 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 ""
@@ -16414,7 +16948,7 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16474,6 +17008,9 @@ msgstr ""
msgid "JiraService|Jira workflow transition IDs"
msgstr ""
+msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
+msgstr ""
+
msgid "JiraService|Open Jira"
msgstr ""
@@ -16498,6 +17035,9 @@ msgstr ""
msgid "JiraService|This feature requires a Premium plan."
msgstr ""
+msgid "JiraService|This issue is synchronized with Jira"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
@@ -16699,6 +17239,9 @@ 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 ""
@@ -16768,9 +17311,6 @@ msgstr ""
msgid "Kubernetes error: %{error_code}"
msgstr ""
-msgid "Kubernetes popover"
-msgstr ""
-
msgid "LDAP"
msgstr ""
@@ -16849,6 +17389,9 @@ 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 ""
@@ -16868,6 +17411,9 @@ msgid "Last %d day"
msgid_plural "Last %d days"
msgstr[0] ""
+msgid "Last %{days} days"
+msgstr ""
+
msgid "Last 2 weeks"
msgstr ""
@@ -16913,6 +17459,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last month"
+msgstr ""
+
msgid "Last name"
msgstr ""
@@ -16961,6 +17510,9 @@ msgstr ""
msgid "Last week"
msgstr ""
+msgid "Last year"
+msgstr ""
+
msgid "LastCommit|authored"
msgstr ""
@@ -16994,6 +17546,9 @@ msgstr ""
msgid "Learn GitLab - Ultimate trial"
msgstr ""
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -17045,9 +17600,6 @@ msgstr ""
msgid "Learn more about signing commits"
msgstr ""
-msgid "Learn more about the dependency list"
-msgstr ""
-
msgid "Learn more in the"
msgstr ""
@@ -17057,6 +17609,96 @@ 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 or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+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"
+msgstr ""
+
+msgid "LearnGitLab|Run a security scan"
+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 "Leave"
msgstr ""
@@ -17240,9 +17882,6 @@ msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr ""
-msgid "Licenses|Learn more about license compliance"
-msgstr ""
-
msgid "Licenses|License Compliance"
msgstr ""
@@ -17352,6 +17991,9 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
+msgid "List of users to be excluded from the limit"
+msgstr ""
+
msgid "List options"
msgstr ""
@@ -17391,7 +18033,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -17751,6 +18393,9 @@ msgstr ""
msgid "Max file size is 200 KB."
msgstr ""
+msgid "Max requests per minute per user"
+msgstr ""
+
msgid "Max role"
msgstr ""
@@ -17763,9 +18408,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -17823,6 +18465,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18093,6 +18738,9 @@ msgstr ""
msgid "Merge request (MR) approvals"
msgstr ""
+msgid "Merge request approval settings have been updated."
+msgstr ""
+
msgid "Merge request approvals"
msgstr ""
@@ -18174,9 +18822,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18186,9 +18831,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -18237,6 +18879,9 @@ msgstr ""
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
msgstr ""
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -18944,6 +19589,9 @@ msgstr ""
msgid "More than %{number_commits_distance} commits different with %{default_branch}"
msgstr ""
+msgid "Most relevant"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -18953,6 +19601,9 @@ msgstr ""
msgid "Move"
msgstr "移動"
+msgid "Move down"
+msgstr ""
+
msgid "Move issue"
msgstr ""
@@ -18971,6 +19622,9 @@ msgstr ""
msgid "Move this issue to another project."
msgstr ""
+msgid "Move up"
+msgstr ""
+
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -19177,6 +19831,12 @@ 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 ""
@@ -19195,12 +19855,6 @@ msgstr ""
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
-msgid "NetworkPolicies|Deny all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
@@ -19433,6 +20087,9 @@ msgstr ""
msgid "New User"
msgstr ""
+msgid "New application"
+msgstr ""
+
msgid "New branch"
msgstr ""
@@ -19454,6 +20111,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -19496,6 +20156,9 @@ msgstr ""
msgid "New label"
msgstr ""
+msgid "New list"
+msgstr ""
+
msgid "New merge request"
msgstr ""
@@ -19601,6 +20264,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -19622,9 +20288,15 @@ msgstr ""
msgid "No commits present here"
msgstr ""
+msgid "No compliance frameworks are in use."
+msgstr ""
+
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -19652,6 +20324,9 @@ 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 ""
@@ -19688,6 +20363,9 @@ msgstr ""
msgid "No iteration"
msgstr ""
+msgid "No iterations found"
+msgstr ""
+
msgid "No iterations to show"
msgstr ""
@@ -19916,13 +20594,19 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes Rate Limits"
+msgstr ""
+
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr ""
msgid "Notes|Collapse replies"
msgstr ""
-msgid "Notes|Private comments are accessible by internal staff only"
+msgid "Notes|Confidential comments are only visible to project members"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
msgstr ""
msgid "Notes|Show all activity"
@@ -19937,6 +20621,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 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 ""
@@ -19952,9 +20639,6 @@ msgstr ""
msgid "Notification events"
msgstr ""
-msgid "Notification setting"
-msgstr ""
-
msgid "Notification setting - %{notification_title}"
msgstr ""
@@ -19982,6 +20666,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20036,9 +20723,6 @@ msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
-msgid "NotificationSetting|Custom"
-msgstr ""
-
msgid "Notifications"
msgstr ""
@@ -20150,6 +20834,12 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
msgid "OnCallSchedules|Add a rotation"
msgstr ""
@@ -20171,6 +20861,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -20204,9 +20897,15 @@ msgstr ""
msgid "OnCallSchedules|On-call schedule for the %{timezone}"
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|Restrict to time intervals"
msgstr ""
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -20382,7 +21081,7 @@ 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."
+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."
@@ -20415,7 +21114,7 @@ msgstr ""
msgid "Only project members will be imported. Group members will be skipped."
msgstr ""
-msgid "Only projects created under a Gold license are available in Security Dashboards."
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
msgid "Only verified users with an email address in any of these domains can be added to the group."
@@ -20430,6 +21129,12 @@ msgstr ""
msgid "Open"
msgstr ""
+msgid "Open API"
+msgstr ""
+
+msgid "Open API specification file path"
+msgstr ""
+
msgid "Open Selection"
msgstr ""
@@ -20442,10 +21147,10 @@ msgstr ""
msgid "Open errors"
msgstr ""
-msgid "Open in Xcode"
+msgid "Open in file view"
msgstr ""
-msgid "Open in file view"
+msgid "Open in your IDE"
msgstr ""
msgid "Open issues"
@@ -20514,6 +21219,9 @@ 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 ""
@@ -20568,9 +21276,6 @@ msgstr ""
msgid "Outdent"
msgstr ""
-msgid "Overall Activity"
-msgstr ""
-
msgid "Overridden"
msgstr ""
@@ -20625,6 +21330,15 @@ msgstr ""
msgid "Package type must be PyPi"
msgstr ""
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgstr ""
+
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
msgstr ""
@@ -20637,6 +21351,9 @@ msgstr ""
msgid "PackageRegistry|Add composer registry"
msgstr ""
+msgid "PackageRegistry|An error occurred while saving the settings"
+msgstr ""
+
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -20760,9 +21477,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -20781,6 +21495,9 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
+msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
+msgstr ""
+
msgid "PackageRegistry|Pip Command"
msgstr ""
@@ -20799,6 +21516,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings saved successfully"
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -20838,6 +21561,9 @@ 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|npm command"
msgstr ""
@@ -20859,15 +21585,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -20940,6 +21666,15 @@ msgstr ""
msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
+msgid "Parameter `from` must be specified"
+msgstr ""
+
+msgid "Parameter `interval` must be one of (\"%{valid_intervals}\")"
+msgstr ""
+
+msgid "Parameter `to` is before the `from` date"
+msgstr ""
+
msgid "Parent"
msgstr ""
@@ -20997,10 +21732,10 @@ msgstr ""
msgid "Past due"
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it"
+msgid "Paste a public key here."
msgstr ""
-msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}"
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
msgid "Paste confidential epic link"
@@ -21096,6 +21831,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21147,9 +21885,6 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
-msgid "Pipeline cannot be run."
-msgstr ""
-
msgid "Pipeline minutes quota"
msgstr ""
@@ -21171,10 +21906,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21249,15 +21984,6 @@ msgstr ""
msgid "Pipelines emails"
msgstr ""
-msgid "Pipelines for last month (%{oneMonthAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last week (%{oneWeekAgo} - %{today})"
-msgstr ""
-
-msgid "Pipelines for last year"
-msgstr ""
-
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -21285,10 +22011,10 @@ msgstr ""
msgid "Pipelines|Clear Runner Caches"
msgstr ""
-msgid "Pipelines|Continuous Integration can help catch bugs by running your tests automatically, while Continuous Deployment can help you deliver code to your product environment."
+msgid "Pipelines|Copy trigger token"
msgstr ""
-msgid "Pipelines|Copy trigger token"
+msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
@@ -21303,9 +22029,6 @@ msgstr ""
msgid "Pipelines|Get started with CI/CD"
msgstr ""
-msgid "Pipelines|Get started with Pipelines"
-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 ""
@@ -21330,6 +22053,9 @@ msgstr ""
msgid "Pipelines|Loading Pipelines"
msgstr ""
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
msgid "Pipelines|More Information"
msgstr ""
@@ -21366,9 +22092,6 @@ msgstr ""
msgid "Pipelines|There are currently no pipelines."
msgstr ""
-msgid "Pipelines|There is no %{filePath} file in this repository, please add one and visit the Pipeline Editor again."
-msgstr ""
-
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
msgstr ""
@@ -21402,6 +22125,9 @@ msgstr ""
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
msgid "Pipelines|Visualize"
msgstr ""
@@ -21414,12 +22140,21 @@ msgstr ""
msgid "Pipelines|parent"
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 ""
@@ -21459,6 +22194,9 @@ msgstr ""
msgid "Pipeline|Merge train pipeline"
msgstr ""
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
msgid "Pipeline|Merged result pipeline"
msgstr ""
@@ -21471,6 +22209,12 @@ 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 ""
@@ -21528,6 +22272,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -21597,6 +22344,9 @@ 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 check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -21720,12 +22470,18 @@ 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 set a new password before proceeding."
msgstr ""
msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
msgstr ""
+msgid "Please solve the captcha"
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -21786,21 +22542,39 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
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 mins 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 ""
@@ -21822,6 +22596,12 @@ 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 ""
@@ -21930,6 +22710,9 @@ 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 ""
@@ -22014,24 +22797,6 @@ msgstr ""
msgid "Profile Settings"
msgstr ""
-msgid "ProfilePreferences|Customize integrations with third party services."
-msgstr ""
-
-msgid "ProfilePreferences|Enable Gitpod integration"
-msgstr ""
-
-msgid "ProfilePreferences|Enable integrated code intelligence on code views"
-msgstr ""
-
-msgid "ProfilePreferences|Gitpod"
-msgstr ""
-
-msgid "ProfilePreferences|Integrations"
-msgstr ""
-
-msgid "ProfilePreferences|Sourcegraph"
-msgstr ""
-
msgid "ProfileSession|on"
msgstr ""
@@ -22068,6 +22833,9 @@ msgstr ""
msgid "Profiles|Add status emoji"
msgstr ""
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -22425,6 +23193,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -22653,10 +23424,7 @@ msgstr ""
msgid "ProjectSettings|Allow editing commit messages"
msgstr ""
-msgid "ProjectSettings|Allow users to make copies of your repository to a new project"
-msgstr ""
-
-msgid "ProjectSettings|Allow users to request access"
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
msgid "ProjectSettings|Analytics"
@@ -22668,7 +23436,7 @@ msgstr ""
msgid "ProjectSettings|Badges"
msgstr ""
-msgid "ProjectSettings|Build, test, and deploy your changes"
+msgid "ProjectSettings|Build, test, and deploy your changes."
msgstr ""
msgid "ProjectSettings|Checkbox is visible and selected by default."
@@ -22683,6 +23451,12 @@ msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
msgstr ""
+msgid "ProjectSettings|Commit authors can edit commit messages on unprotected branches."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
@@ -22710,16 +23484,13 @@ msgstr ""
msgid "ProjectSettings|Encourage"
msgstr ""
-msgid "ProjectSettings|Environments, logs, cluster management, and more"
-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"
+msgid "ProjectSettings|Every project can have its own space to store its packages."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -22758,13 +23529,13 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|LFS objects from this repository are still available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system for this project"
+msgid "ProjectSettings|Lightweight issue tracking system."
msgstr ""
-msgid "ProjectSettings|Manages large files such as audio, video, and graphics files"
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
msgid "ProjectSettings|Merge checks"
@@ -22800,13 +23571,16 @@ 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"
+msgid "ProjectSettings|Pages for project documentation."
msgstr ""
msgid "ProjectSettings|Pipelines"
@@ -22833,16 +23607,25 @@ msgstr ""
msgid "ProjectSettings|Require"
msgstr ""
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
msgid "ProjectSettings|Requirements"
msgstr ""
-msgid "ProjectSettings|Requirements management system for this project"
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
msgid "ProjectSettings|Set the default behavior and availability of this option in merge requests. Changes made are also applied to existing merge requests."
msgstr ""
-msgid "ProjectSettings|Share code pastes with others out of Git repository"
+msgid "ProjectSettings|Share code with others outside the project."
msgstr ""
msgid "ProjectSettings|Show default award emojis"
@@ -22866,7 +23649,7 @@ msgstr ""
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
-msgid "ProjectSettings|Submit changes to be merged upstream"
+msgid "ProjectSettings|Submit changes to be merged upstream."
msgstr ""
msgid "ProjectSettings|The commit message used to apply merge request suggestions"
@@ -22890,52 +23673,49 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
-msgid "ProjectSettings|This setting will override user notification preferences for all project members."
-msgstr ""
-
msgid "ProjectSettings|This will dictate the commit history when you merge a merge request"
msgstr ""
msgid "ProjectSettings|Transfer 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 copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
-msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access"
+msgid "ProjectSettings|Users can request access"
msgstr ""
-msgid "ProjectSettings|View project analytics"
+msgid "ProjectSettings|View and edit files in this project."
msgstr ""
-msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
-msgid "ProjectSettings|What are badges?"
+msgid "ProjectSettings|View project analytics."
msgstr ""
-msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
-msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
+msgid "ProjectSettings|Visualize the project's performance metrics."
msgstr ""
-msgid "ProjectSettings|When enabled, commit authors will be able to edit commit messages on unprotected branches."
+msgid "ProjectSettings|What are badges?"
msgstr ""
-msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
+msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge."
msgstr ""
-msgid "ProjectSettings|Wiki"
+msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr ""
-msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab"
+msgid "ProjectSettings|Wiki"
msgstr ""
-msgid "ProjectSettings|With Metrics Dashboard you can visualize this project performance metrics"
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
msgstr ""
msgid "ProjectTemplates|.NET Core"
@@ -23214,10 +23994,10 @@ msgstr ""
msgid "PrometheusService|Auto configuration"
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments"
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)"
+msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
msgstr ""
msgid "PrometheusService|Common metrics"
@@ -23226,9 +24006,6 @@ msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
-msgid "PrometheusService|Contents of the credentials.json file of your service account, like: { \"type\": \"service_account\", \"project_id\": ... }"
-msgstr ""
-
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -23244,6 +24021,15 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
+msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|GitLab manages Prometheus on your clusters."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -23259,6 +24045,12 @@ msgstr ""
msgid "PrometheusService|Missing environment variable"
msgstr ""
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
+msgstr ""
+
msgid "PrometheusService|More information"
msgstr ""
@@ -23271,22 +24063,22 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
-msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
+msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
-msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used."
+msgid "PrometheusService|The Prometheus API base URL."
msgstr ""
-msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
-msgid "PrometheusService|Time-series monitoring service"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below"
+msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -23295,6 +24087,12 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
msgid "Promote"
msgstr ""
@@ -23385,9 +24183,6 @@ msgstr ""
msgid "Promotions|Upgrade plan"
msgstr ""
-msgid "Promotions|Upgrade your plan"
-msgstr ""
-
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
@@ -23430,9 +24225,6 @@ msgstr ""
msgid "Protected Environment"
msgstr ""
-msgid "Protected Environments"
-msgstr ""
-
msgid "Protected Paths"
msgstr ""
@@ -23445,6 +24237,9 @@ msgstr ""
msgid "Protected branches"
msgstr ""
+msgid "Protected environments"
+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 ""
@@ -23538,7 +24333,7 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip:"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Protocol"
@@ -23634,7 +24429,49 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "PushRule|Committer restriction"
+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"
@@ -23727,6 +24564,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-request review"
+msgstr ""
+
msgid "Re-verification interval"
msgstr ""
@@ -23763,6 +24603,9 @@ msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
+msgid "Receive product marketing emails"
+msgstr ""
+
msgid "Recent"
msgstr ""
@@ -23933,6 +24776,9 @@ msgstr ""
msgid "Release title"
msgstr ""
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
msgid "ReleaseAssetLinkType|Image"
msgstr ""
@@ -24038,6 +24884,9 @@ msgstr ""
msgid "Remove due date"
msgstr ""
+msgid "Remove file"
+msgstr ""
+
msgid "Remove fork relationship"
msgstr ""
@@ -24104,6 +24953,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove user"
+msgstr ""
+
msgid "Remove user & report"
msgstr ""
@@ -24272,7 +25124,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24322,12 +25174,15 @@ msgstr ""
msgid "Reports|Actions"
msgstr ""
-msgid "Reports|An error occured while loading report"
+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|Class"
msgstr ""
@@ -24399,6 +25254,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
msgid "RepositoriesAnalytics|Coverage"
msgstr ""
@@ -24426,6 +25287,12 @@ msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Overall activity"
+msgstr ""
+
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -24522,6 +25389,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -24540,6 +25410,9 @@ msgstr ""
msgid "Requested design version does not exist."
msgstr ""
+msgid "Requested review"
+msgstr ""
+
msgid "Requested states are invalid"
msgstr ""
@@ -24650,9 +25523,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in."
-msgstr ""
-
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
msgstr ""
@@ -24743,6 +25613,9 @@ msgstr ""
msgid "Restrict projects for this runner"
msgstr ""
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
msgid "Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information."
msgstr ""
@@ -25117,7 +25990,7 @@ msgstr ""
msgid "Save Changes"
msgstr ""
-msgid "Save Push Rules"
+msgid "Save Value Stream"
msgstr ""
msgid "Save application"
@@ -25189,6 +26062,9 @@ msgstr ""
msgid "Scopes"
msgstr ""
+msgid "Scopes [Select 1 or more]"
+msgstr ""
+
msgid "Scopes can't be blank"
msgstr ""
@@ -25276,6 +26152,9 @@ msgstr ""
msgid "Search forks"
msgstr ""
+msgid "Search labels"
+msgstr ""
+
msgid "Search merge requests"
msgstr ""
@@ -25437,7 +26316,7 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
-msgid "Secret Token"
+msgid "Secret token"
msgstr ""
msgid "Security"
@@ -25482,12 +26361,18 @@ msgstr ""
msgid "SecurityConfiguration|Available for on-demand DAST"
msgstr ""
+msgid "SecurityConfiguration|Available with %{linkStart}upgrade or free trial%{linkEnd}"
+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|Configure"
msgstr ""
+msgid "SecurityConfiguration|Configure via Merge Request"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -25500,9 +26385,6 @@ msgstr ""
msgid "SecurityConfiguration|Enable"
msgstr ""
-msgid "SecurityConfiguration|Enable via Merge Request"
-msgstr ""
-
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -25527,6 +26409,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|SAST merge request creation mutation failed"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -25563,6 +26448,12 @@ msgstr ""
msgid "SecurityReports|Add projects to your group"
msgstr ""
+msgid "SecurityReports|All"
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -25572,10 +26463,10 @@ msgstr ""
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr ""
-msgid "SecurityReports|Create issue"
+msgid "SecurityReports|Create Jira issue"
msgstr ""
-msgid "SecurityReports|Dismiss Selected"
+msgid "SecurityReports|Create issue"
msgstr ""
msgid "SecurityReports|Dismiss vulnerability"
@@ -25596,6 +26487,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned resources"
+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 ""
@@ -25611,9 +26505,6 @@ msgstr ""
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
-msgid "SecurityReports|False positive"
-msgstr ""
-
msgid "SecurityReports|Fuzzing artifacts"
msgstr ""
@@ -25641,6 +26532,12 @@ msgstr ""
msgid "SecurityReports|More information"
msgstr ""
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
msgid "SecurityReports|No vulnerabilities found"
msgstr ""
@@ -25683,19 +26580,19 @@ msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
msgstr ""
-msgid "SecurityReports|Select a reason"
+msgid "SecurityReports|Set status"
msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Sorry, your filter produced no results"
+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|Status"
+msgid "SecurityReports|Sorry, your filter produced no results"
msgstr ""
-msgid "SecurityReports|The rating \"unknown\" indicates that the underlying scanner doesn’t contain or provide a severity rating."
+msgid "SecurityReports|Status"
msgstr ""
msgid "SecurityReports|The security dashboard displays the latest security findings for projects you wish to monitor. Add projects to your group to view their vulnerabilities here."
@@ -25719,10 +26616,6 @@ msgstr ""
msgid "SecurityReports|There was an error deleting the comment."
msgstr ""
-msgid "SecurityReports|There was an error dismissing %d vulnerability. Please try again later."
-msgid_plural "SecurityReports|There was an error dismissing %d vulnerabilities. Please try again later."
-msgstr[0] ""
-
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
msgstr ""
@@ -25765,7 +26658,7 @@ msgstr ""
msgid "SecurityReports|While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
-msgid "SecurityReports|Won't fix / Accept risk"
+msgid "SecurityReports|With issues"
msgstr ""
msgid "SecurityReports|You do not have sufficient permissions to access this report"
@@ -25774,7 +26667,7 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|[No reason]"
+msgid "Security|Policies"
msgstr ""
msgid "See GitLab's %{password_policy_guidelines}"
@@ -25861,9 +26754,6 @@ msgstr ""
msgid "Select branch"
msgstr ""
-msgid "Select branch/tag"
-msgstr ""
-
msgid "Select due date"
msgstr ""
@@ -25912,7 +26802,7 @@ msgstr ""
msgid "Select projects"
msgstr ""
-msgid "Select required regulatory standard"
+msgid "Select required regulatory standard."
msgstr ""
msgid "Select reviewer(s)"
@@ -25954,12 +26844,18 @@ msgstr ""
msgid "Select user"
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 ""
@@ -26002,7 +26898,7 @@ msgstr ""
msgid "SelfMonitoring|Self monitoring project has been successfully deleted."
msgstr ""
-msgid "Send a separate email notification to Developers."
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
msgid "Send confirmation email"
@@ -26179,6 +27075,9 @@ msgstr ""
msgid "Set a template repository for projects in this group"
msgstr ""
+msgid "Set access permissions for this token."
+msgstr ""
+
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
@@ -26371,6 +27270,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -26525,7 +27427,7 @@ msgid "Showing %d event"
msgid_plural "Showing %d events"
msgstr[0] ""
-msgid "Showing %{conflict_start}%{conflicts_text}%{strong_end} between %{ref_start}%{source_branch}%{strong_end} and %{ref_start}%{target_branch}%{strong_end}"
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
msgid "Showing %{count} of %{total} projects"
@@ -26814,9 +27716,6 @@ msgstr ""
msgid "Something went wrong on our end. Please try again."
msgstr ""
-msgid "Something went wrong trying to change the confidentiality of this issue"
-msgstr ""
-
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
msgstr ""
@@ -26943,6 +27842,9 @@ msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -27126,9 +28028,6 @@ msgstr ""
msgid "SortOptions|Recently starred"
msgstr ""
-msgid "SortOptions|Relevant"
-msgstr ""
-
msgid "SortOptions|Size"
msgstr ""
@@ -27318,12 +28217,15 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+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 ""
@@ -27828,67 +28730,67 @@ msgstr ""
msgid "Suggested solutions help link"
msgstr ""
-msgid "SuggestedColors|Bright green"
+msgid "SuggestedColors|Aztec Gold"
msgstr ""
-msgid "SuggestedColors|Dark grayish cyan"
+msgid "SuggestedColors|Blue"
msgstr ""
-msgid "SuggestedColors|Dark moderate blue"
+msgid "SuggestedColors|Blue-gray"
msgstr ""
-msgid "SuggestedColors|Dark moderate orange"
+msgid "SuggestedColors|Carrot orange"
msgstr ""
-msgid "SuggestedColors|Dark moderate pink"
+msgid "SuggestedColors|Champagne"
msgstr ""
-msgid "SuggestedColors|Dark moderate violet"
+msgid "SuggestedColors|Charcoal grey"
msgstr ""
-msgid "SuggestedColors|Feijoa"
+msgid "SuggestedColors|Crimson"
msgstr ""
-msgid "SuggestedColors|Lime green"
+msgid "SuggestedColors|Dark coral"
msgstr ""
-msgid "SuggestedColors|Moderate blue"
+msgid "SuggestedColors|Dark green"
msgstr ""
-msgid "SuggestedColors|Pure red"
+msgid "SuggestedColors|Dark sea green"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated blue"
+msgid "SuggestedColors|Dark violet"
msgstr ""
-msgid "SuggestedColors|Slightly desaturated green"
+msgid "SuggestedColors|Deep violet"
msgstr ""
-msgid "SuggestedColors|Soft orange"
+msgid "SuggestedColors|Gray"
msgstr ""
-msgid "SuggestedColors|Soft red"
+msgid "SuggestedColors|Green screen"
msgstr ""
-msgid "SuggestedColors|Strong pink"
+msgid "SuggestedColors|Green-cyan"
msgstr ""
-msgid "SuggestedColors|Strong red"
+msgid "SuggestedColors|Lavendar"
msgstr ""
-msgid "SuggestedColors|Strong yellow"
+msgid "SuggestedColors|Magenta-pink"
msgstr ""
-msgid "SuggestedColors|UA blue"
+msgid "SuggestedColors|Medium sea green"
msgstr ""
-msgid "SuggestedColors|Very dark desaturated blue"
+msgid "SuggestedColors|Red"
msgstr ""
-msgid "SuggestedColors|Very dark lime green"
+msgid "SuggestedColors|Rose red"
msgstr ""
-msgid "SuggestedColors|Very pale orange"
+msgid "SuggestedColors|Titanium yellow"
msgstr ""
msgid "Suggestion is not applicable as the suggestion was not found."
@@ -27975,6 +28877,12 @@ 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 ""
@@ -27984,7 +28892,7 @@ msgstr ""
msgid "System hook was successfully updated."
msgstr ""
-msgid "System hook will be triggered on set of events like creating project or adding ssh key. But you can also enable extra triggers like Push events."
+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)"
@@ -28179,6 +29087,9 @@ msgstr ""
msgid "Terraform"
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] ""
@@ -28238,6 +29149,9 @@ msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
msgstr ""
+msgid "Terraform|Locking state"
+msgstr ""
+
msgid "Terraform|Name"
msgstr ""
@@ -28250,6 +29164,9 @@ 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 ""
@@ -28271,6 +29188,9 @@ 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\twill remain intact, only the state file with all its versions are to be removed. This action is non-revertible."
msgstr ""
@@ -28317,9 +29237,6 @@ msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr ""
-msgid "TestCases|Something went wrong while fetching count of test cases."
-msgstr ""
-
msgid "TestCases|Something went wrong while fetching test case."
msgstr ""
@@ -28808,6 +29725,9 @@ msgstr ""
msgid "The status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
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 ""
@@ -28892,6 +29812,9 @@ 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 ""
@@ -28910,12 +29833,18 @@ msgstr ""
msgid "There are no issues to show."
msgstr ""
+msgid "There are no issues with the selected labels"
+msgstr ""
+
msgid "There are no labels yet"
msgstr ""
msgid "There are no matching files"
msgstr ""
+msgid "There are no open epics"
+msgstr ""
+
msgid "There are no open issues"
msgstr ""
@@ -28946,10 +29875,10 @@ msgstr ""
msgid "There is a halted Elasticsearch migration"
msgstr ""
-msgid "There is already a To-Do for this design."
+msgid "There is already a repository with that name on disk"
msgstr ""
-msgid "There is already a repository with that name on disk"
+msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
@@ -28991,7 +29920,7 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
-msgid "There was a problem fetching the keep latest artifact setting."
+msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
msgid "There was a problem fetching users."
@@ -29006,7 +29935,7 @@ msgstr ""
msgid "There was a problem sending the confirmation email"
msgstr ""
-msgid "There was a problem updating the keep latest artifact setting."
+msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
msgid "There was an error %{message} todo."
@@ -29048,6 +29977,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -29078,6 +30010,9 @@ msgstr ""
msgid "There was an error importing the Jira project."
msgstr ""
+msgid "There was an error loading merge request approval settings."
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -29105,9 +30040,6 @@ msgstr ""
msgid "There was an error saving your changes."
msgstr ""
-msgid "There was an error saving your notification settings."
-msgstr ""
-
msgid "There was an error subscribing to this label."
msgstr ""
@@ -29120,6 +30052,9 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
+msgid "There was an error updating merge request approval settings."
+msgstr ""
+
msgid "There was an error updating the Geo Settings"
msgstr ""
@@ -29183,6 +30118,9 @@ 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 "Third Party Advisory Link"
msgstr ""
@@ -29225,18 +30163,6 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This URL will be triggered for each branch updated to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when a merge request is created/updated/merged"
-msgstr ""
-
-msgid "This URL will be triggered when a new tag is pushed to the repository"
-msgstr ""
-
-msgid "This URL will be triggered when repository is updated"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -29408,6 +30334,9 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgstr ""
+
msgid "This is a security log of important events involving your account."
msgstr ""
@@ -29705,6 +30634,9 @@ msgstr ""
msgid "Threat Monitoring"
msgstr ""
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
msgid "ThreatMonitoring|Alerts"
msgstr ""
@@ -29738,6 +30670,9 @@ msgstr ""
msgid "ThreatMonitoring|Environment"
msgstr ""
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -30064,6 +30999,9 @@ msgstr ""
msgid "Tip: add a"
msgstr ""
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
msgid "Title"
msgstr ""
@@ -30214,10 +31152,10 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
-msgid "To widen your search, change or remove filters."
+msgid "To widen your search, change or remove filters above."
msgstr ""
-msgid "To-Do"
+msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
@@ -30280,12 +31218,6 @@ msgstr ""
msgid "Toggle thread"
msgstr ""
-msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
-
-msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -30310,9 +31242,6 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
-msgid "Too many users specified (limit is %{user_limit})"
-msgstr ""
-
msgid "Too much data"
msgstr ""
@@ -30439,20 +31368,26 @@ msgstr ""
msgid "Trending"
msgstr ""
-msgid "Trials|%{plan} Trial %{en_dash} %{num} day left"
-msgid_plural "Trials|%{plan} Trial %{en_dash} %{num} days left"
+msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
+msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
msgstr[0] ""
+msgid "Trials|Compare all plans"
+msgstr ""
+
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Go back to GitLab"
msgstr ""
+msgid "Trials|Hey there"
+msgstr ""
+
msgid "Trials|Skip Trial"
msgstr ""
-msgid "Trials|Skip Trial (Continue with Free Account)"
+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'"
@@ -30461,13 +31396,10 @@ msgstr ""
msgid "Trials|You can apply your trial to a new group or an existing group."
msgstr ""
-msgid "Trials|You can apply your trial to a new group or your personal account."
-msgstr ""
-
-msgid "Trials|You can apply your trial to a new group, an existing group, or your personal account."
+msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
msgstr ""
-msgid "Trials|You won't get a free trial right now but you can always resume this process by clicking on your avatar and choosing 'Start a free trial'"
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you are enjoying GitLab %{planName}. To continue using GitLab %{planName} after your trial ends, you will need to buy a subscription. You can also choose GitLab Premium if its features are sufficient for your needs."
msgstr ""
msgid "Trial|Company name"
@@ -30554,6 +31486,9 @@ msgstr ""
msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
+msgid "Trusted"
+msgstr ""
+
msgid "Try again"
msgstr ""
@@ -30566,6 +31501,9 @@ msgstr ""
msgid "Try changing or removing filters."
msgstr ""
+msgid "Try grouping with different labels"
+msgstr ""
+
msgid "Try to fork again"
msgstr ""
@@ -30587,10 +31525,10 @@ msgstr ""
msgid "Tuning settings"
msgstr ""
-msgid "Turn Off"
+msgid "Turn off"
msgstr ""
-msgid "Turn On"
+msgid "Turn on"
msgstr ""
msgid "Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}."
@@ -30656,6 +31594,21 @@ msgstr "URL"
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 neccessary."
+msgstr ""
+
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr ""
@@ -30788,6 +31741,9 @@ msgstr ""
msgid "Unexpected error"
msgstr ""
+msgid "Unfollow"
+msgstr ""
+
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
@@ -30959,9 +31915,6 @@ msgstr ""
msgid "Update failed"
msgstr ""
-msgid "Update failed. Please try again."
-msgstr ""
-
msgid "Update it"
msgstr ""
@@ -31139,6 +32092,12 @@ 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|Packages"
msgstr ""
@@ -31241,6 +32200,96 @@ 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 ""
@@ -31250,7 +32299,7 @@ msgstr ""
msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
msgstr ""
-msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use cURL"
@@ -31271,7 +32320,7 @@ msgstr ""
msgid "Use template"
msgstr ""
-msgid "Use this token to validate received payloads"
+msgid "Use this token to validate received payloads."
msgstr ""
msgid "Use webhook"
@@ -31442,6 +32491,12 @@ 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 ""
@@ -31484,6 +32539,9 @@ 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 ""
@@ -31499,6 +32557,9 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
msgid "UserProfile|Unconfirmed user"
msgstr ""
@@ -31508,9 +32569,15 @@ 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 ""
@@ -31583,6 +32650,9 @@ msgstr ""
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
+msgid "Using additional formats requires starting the companion containers. Make sure that all %{kroki_images} are running."
+msgstr ""
+
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -31700,6 +32770,9 @@ msgstr ""
msgid "View alert details."
msgstr ""
+msgid "View all environments."
+msgstr ""
+
msgid "View all issues"
msgstr ""
@@ -31741,9 +32814,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View file @%{commit_sha}"
-msgstr ""
-
msgid "View full dashboard"
msgstr ""
@@ -31861,6 +32931,9 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
+msgid "Visual Studio Code"
+msgstr ""
+
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr ""
@@ -31927,6 +33000,9 @@ msgstr ""
msgid "VulnerabilityChart|Severity"
msgstr ""
+msgid "VulnerabilityManagement, Fetching linked Jira issues"
+msgstr ""
+
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""
@@ -31948,15 +33024,27 @@ msgstr ""
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr ""
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
msgid "VulnerabilityManagement|Detected"
msgstr ""
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+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 ""
@@ -32155,6 +33243,12 @@ msgstr ""
msgid "We heard back from your device. You have been authenticated."
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 more Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -32176,6 +33270,9 @@ 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've found no vulnerabilities"
msgstr ""
@@ -32233,10 +33330,10 @@ msgstr ""
msgid "Webhooks|Comments"
msgstr ""
-msgid "Webhooks|Confidential Comments"
+msgid "Webhooks|Confidential comments"
msgstr ""
-msgid "Webhooks|Confidential Issues events"
+msgid "Webhooks|Confidential issues events"
msgstr ""
msgid "Webhooks|Deployment events"
@@ -32245,7 +33342,7 @@ msgstr ""
msgid "Webhooks|Enable SSL verification"
msgstr ""
-msgid "Webhooks|Feature Flag events"
+msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
@@ -32272,64 +33369,73 @@ msgstr ""
msgid "Webhooks|SSL verification"
msgstr ""
-msgid "Webhooks|Secret Token"
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
msgstr ""
msgid "Webhooks|Tag push events"
msgstr ""
-msgid "Webhooks|This URL is triggered when a deployment starts, finishes, fails, or is canceled"
+msgid "Webhooks|Trigger"
msgstr ""
-msgid "Webhooks|This URL is triggered when a feature flag is turned on or off"
+msgid "Webhooks|URL"
msgstr ""
-msgid "Webhooks|This URL is triggered when a release is created/updated"
+msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered by a push to the repository"
+msgid "Webhooks|URL is triggered when a confidential issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a confidential issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a group member is created/updated/removed"
+msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a merge request is created/updated/merged"
+msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a new tag is pushed to the repository"
+msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when a wiki page is created/updated"
+msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
-msgid "Webhooks|This URL will be triggered when an issue is created/updated/merged"
+msgid "Webhooks|URL is triggered when a release is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment"
+msgid "Webhooks|URL is triggered when a subgroup is created or removed"
msgstr ""
-msgid "Webhooks|This URL will be triggered when someone adds a comment on a confidential issue"
+msgid "Webhooks|URL is triggered when a wiki page is created or updated"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the job status changes"
+msgid "Webhooks|URL is triggered when an issue is created, updated, or merged"
msgstr ""
-msgid "Webhooks|This URL will be triggered when the pipeline status changes"
+msgid "Webhooks|URL is triggered when someone adds a comment"
msgstr ""
-msgid "Webhooks|Trigger"
+msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
msgstr ""
-msgid "Webhooks|URL"
+msgid "Webhooks|URL is triggered when the job status changes"
msgstr ""
-msgid "Webhooks|Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header."
+msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
-msgid "Webhooks|Wiki Page events"
+msgid "Webhooks|URL must be percent-encoded if neccessary."
+msgstr ""
+
+msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
msgstr ""
msgid "Wednesday"
@@ -32368,6 +33474,9 @@ msgstr ""
msgid "What describes you best?"
msgstr ""
+msgid "What does this command do?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -32395,7 +33504,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -32561,10 +33670,7 @@ msgstr ""
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
-msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
-
-msgid "WikiPageConflictMessage|the page"
+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 "WikiPageCreate|Create %{pageTitle}"
@@ -32660,9 +33766,6 @@ msgstr ""
msgid "Write a comment…"
msgstr ""
-msgid "Write access allowed"
-msgstr ""
-
msgid "Write milestone description..."
msgstr ""
@@ -32672,6 +33775,9 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
+msgid "Xcode"
+msgstr ""
+
msgid "YYYY-MM-DD"
msgstr ""
@@ -32738,7 +33844,7 @@ msgstr ""
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
-msgid "You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
msgstr ""
msgid "You are not allowed to approve a user"
@@ -32753,6 +33859,9 @@ 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 ""
@@ -32801,6 +33910,9 @@ 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 ""
@@ -32948,6 +34060,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access deployment frequencies"
+msgstr ""
+
msgid "You do not have permission to leave this %{namespaceType}."
msgstr ""
@@ -33065,6 +34180,9 @@ msgstr ""
msgid "You have reached your project limit"
msgstr ""
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -33296,9 +34414,6 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Personal Access Tokens will expire in %{days_to_expire} days or less"
-msgstr ""
-
msgid "Your Primary Email will be used for avatar detection."
msgstr ""
@@ -33470,6 +34585,9 @@ 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 profile"
msgstr ""
@@ -33527,6 +34645,9 @@ msgstr ""
msgid "[No reason]"
msgstr ""
+msgid "[Unchanged]"
+msgstr ""
+
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -33549,6 +34670,9 @@ msgstr ""
msgid "added %{created_at_timeago}"
msgstr ""
+msgid "added %{emails}"
+msgstr ""
+
msgid "added a Zoom call to this issue"
msgstr ""
@@ -33762,6 +34886,9 @@ 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 ""
@@ -33892,6 +35019,9 @@ msgstr ""
msgid "ciReport|is loading, errors when loading results"
msgstr ""
+msgid "closed"
+msgstr ""
+
msgid "closed issue"
msgstr ""
@@ -34037,6 +35167,9 @@ msgstr[0] ""
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 ""
@@ -34174,6 +35307,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
@@ -34270,9 +35406,6 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
-msgid "member%{number}@company.com"
-msgstr ""
-
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -34313,9 +35446,6 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{link_start}Learn more about resolving conflicts%{link_end}"
-msgstr ""
-
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -34433,6 +35563,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more about resolving conflicts"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -34517,7 +35650,7 @@ msgstr ""
msgid "mrWidget|The changes will be merged into"
msgstr ""
-msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
msgid "mrWidget|The source branch HEAD has recently changed. Please reload the page and review the changes before merging"
@@ -34598,6 +35731,9 @@ msgstr ""
msgid "mrWidget|to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "must be a Debian package"
+msgstr ""
+
msgid "must be a boolean value"
msgstr ""
@@ -34607,9 +35743,15 @@ msgstr ""
msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
+msgid "must be after start"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
+msgid "must be later than active period start"
+msgstr ""
+
msgid "must contain only valid frameworks"
msgstr ""
@@ -34658,9 +35800,6 @@ msgstr ""
msgid "not found"
msgstr ""
-msgid "notification emails"
-msgstr ""
-
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -34942,6 +36081,12 @@ msgstr ""
msgid "this document"
msgstr ""
+msgid "this issue cannot be assigned to a confidential epic since it is public"
+msgstr ""
+
+msgid "this issue cannot be made public since it belongs to a confidential epic"
+msgstr ""
+
msgid "time summary"
msgstr ""
@@ -34969,6 +36114,9 @@ msgstr ""
msgid "two-factor authentication settings"
msgstr ""
+msgid "type must be Debian"
+msgstr ""
+
msgid "unicode domains should use IDNA encoding"
msgstr ""
@@ -34996,9 +36144,6 @@ msgstr ""
msgid "username"
msgstr ""
-msgid "uses Kubernetes clusters to deploy your code!"
-msgstr ""
-
msgid "v%{version} published %{timeAgo}"
msgstr ""
diff --git a/package.json b/package.json
index 66fc0668431..21fb234ddd7 100644
--- a/package.json
+++ b/package.json
@@ -5,13 +5,13 @@
"block-dependencies": "node scripts/frontend/block_dependencies.js",
"clean": "rm -rf public/assets tmp/cache/*-loader",
"dev-server": "NODE_OPTIONS=\"--max-old-space-size=3584\" node scripts/frontend/webpack_dev_server.js",
- "eslint": "eslint --cache --max-warnings 0 --report-unused-disable-directives --ext .js,.vue .",
- "eslint-fix": "eslint --cache --max-warnings 0 --report-unused-disable-directives --ext .js,.vue --fix .",
- "eslint-staged": "git diff --diff-filter=d --cached --name-only | grep -E \"(.*)\\.(js|vue)$\" | xargs eslint --cache --max-warnings 0 --report-unused-disable-directives",
- "eslint-staged-fix": "git diff --diff-filter=d --cached --name-only | grep -E \"(.*)\\.(js|vue)$\" | xargs eslint --cache --max-warnings 0 --report-unused-disable-directives --fix",
- "eslint-report": "eslint --max-warnings 0 --ext .js,.vue --format html --output-file ./eslint-report.html --no-inline-config .",
+ "eslint-fix": "echo 'Please use `yarn lint:eslint:all:fix` instead' && exit 1",
+ "eslint-staged": "echo 'Please use `yarn lint:eslint:staged` instead' && exit 1",
+ "eslint-staged-fix": "echo 'Please use `yarn lint:eslint:staged:fix` instead' && exit 1",
+ "eslint-report": "echo 'Please use `yarn lint:eslint:report` instead' && exit 1",
"file-coverage": "scripts/frontend/file_test_coverage.js",
"lint-docs": "scripts/lint-doc.sh",
+ "internal:eslint": "eslint --cache --max-warnings 0 --report-unused-disable-directives --ext .js,.vue",
"prejest": "yarn check-dependencies",
"jest": "jest --config jest.config.js",
"jest-debug": "node --inspect-brk node_modules/.bin/jest --runInBand",
@@ -21,14 +21,27 @@
"karma": "BABEL_ENV=${BABEL_ENV:=karma} karma start --single-run true config/karma.config.js",
"karma-coverage": "BABEL_ENV=coverage karma start --single-run true config/karma.config.js",
"karma-start": "BABEL_ENV=karma karma start config/karma.config.js",
+ "lint:eslint": "yarn run internal:eslint",
+ "lint:eslint:fix": "yarn run internal:eslint --fix",
+ "lint:eslint:all": "yarn run internal:eslint .",
+ "lint:eslint:all:fix": "yarn run lint:eslint:all --fix",
+ "lint:eslint:report": "yarn run internal:eslint --format html --output-file ./eslint-report.html --no-inline-config .",
+ "lint:eslint:staged": "scripts/frontend/execute-on-staged-files.sh internal:eslint '(js|vue)'",
+ "lint:eslint:staged:fix": "yarn run lint:eslint:staged --fix",
+ "lint:prettier": "yarn run prettier --check '**/*.{graphql,js,vue}'",
+ "lint:prettier:fix": "yarn run prettier --write '**/*.{graphql,js,vue}'",
+ "lint:prettier:staged": "scripts/frontend/execute-on-staged-files.sh prettier '(graphql|js|vue)' --check",
+ "lint:prettier:staged:fix": "scripts/frontend/execute-on-staged-files.sh prettier '(graphql|js|vue)' --write",
+ "lint:stylelint": "stylelint --cache -q '{ee/,}app/assets/stylesheets/**/*.{css,scss}'",
+ "lint:stylelint:fix": "yarn run lint:stylelint --fix",
+ "lint:stylelint:staged": "scripts/frontend/execute-on-staged-files.sh stylelint '(css|scss)' -q",
+ "lint:stylelint:staged:fix": "yarn run lint:stylelint:staged --fix",
"markdownlint": "markdownlint --config .markdownlint.json",
"postinstall": "node ./scripts/frontend/postinstall.js",
- "prettier-staged": "node ./scripts/frontend/prettier.js check",
- "prettier-staged-save": "node ./scripts/frontend/prettier.js save",
- "prettier-all": "node ./scripts/frontend/prettier.js check-all",
- "prettier-all-save": "node ./scripts/frontend/prettier.js save-all",
- "stylelint": "yarn stylelint-file 'app/assets/stylesheets/**/*.*' 'ee/app/assets/stylesheets/**/*.*' '!app/assets/stylesheets/startup/startup-*.scss' '!**/vendors/**'",
- "stylelint-file": "BROWSERSLIST_IGNORE_OLD_DATA=true node node_modules/stylelint/bin/stylelint.js",
+ "prettier-all": "echo 'Please use `yarn lint:prettier` instead' && exit 1",
+ "prettier-all-save": "echo 'Please use `yarn lint:prettier:fix` instead' && exit 1",
+ "prettier-staged": "echo 'Please use `yarn lint:prettier:staged` instead' && exit 1",
+ "prettier-staged-save": "echo 'Please use `yarn lint:prettier:staged:fix` instead' && exit 1",
"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",
@@ -43,12 +56,13 @@
"@babel/preset-env": "^7.10.1",
"@gitlab/at.js": "1.5.7",
"@gitlab/favicon-overlay": "2.0.0",
- "@gitlab/svgs": "1.182.0",
+ "@gitlab/svgs": "1.184.0",
"@gitlab/tributejs": "1.0.0",
- "@gitlab/ui": "27.4.6",
+ "@gitlab/ui": "28.6.0",
"@gitlab/visual-review-tools": "1.6.1",
"@rails/actioncable": "^6.0.3-4",
"@rails/ujs": "^6.0.3-4",
+ "@sentry/browser": "^5.22.3",
"@sourcegraph/code-host-integration": "0.0.52",
"@toast-ui/editor": "^2.5.1",
"@toast-ui/vue-editor": "^2.5.1",
@@ -56,6 +70,7 @@
"apollo-client": "^2.6.10",
"apollo-link": "^1.2.14",
"apollo-link-batch-http": "^1.2.14",
+ "apollo-link-http": "^1.5.17",
"apollo-upload-client": "^13.0.0",
"autosize": "^4.0.2",
"aws-sdk": "^2.637.0",
@@ -69,7 +84,7 @@
"codesandbox-api": "0.0.23",
"compression-webpack-plugin": "^5.0.2",
"copy-webpack-plugin": "^5.1.2",
- "core-js": "^3.8.3",
+ "core-js": "^3.9.1",
"cron-validator": "^1.1.1",
"cropper": "^2.3.0",
"css-loader": "^2.1.1",
@@ -116,8 +131,8 @@
"pikaday": "^1.8.0",
"popper.js": "^1.16.1",
"prismjs": "^1.21.0",
- "prosemirror-markdown": "^1.3.0",
- "prosemirror-model": "^1.6.4",
+ "prosemirror-markdown": "^1.5.1",
+ "prosemirror-model": "^1.13.3",
"raphael": "^2.2.7",
"raw-loader": "^4.0.2",
"select2": "3.5.2-browserify",
@@ -126,14 +141,14 @@
"sql.js": "^0.4.0",
"string-hash": "1.1.3",
"style-loader": "^1.3.0",
- "swagger-ui-dist": "^3.43.0",
+ "swagger-ui-dist": "^3.44.1",
"three": "^0.84.0",
"three-orbit-controls": "^82.1.0",
"three-stl-loader": "^1.0.4",
"timeago.js": "^4.0.2",
- "tiptap": "^1.8.0",
- "tiptap-commands": "^1.4.0",
- "tiptap-extensions": "^1.8.0",
+ "tiptap": "^1.32.1",
+ "tiptap-commands": "^1.17.1",
+ "tiptap-extensions": "^1.35.1",
"url-loader": "^3.0.0",
"uuid": "8.1.0",
"visibilityjs": "^1.2.4",
@@ -155,7 +170,8 @@
},
"devDependencies": {
"@babel/plugin-transform-modules-commonjs": "^7.10.1",
- "@gitlab/eslint-plugin": "8.0.0",
+ "@gitlab/eslint-plugin": "8.1.0",
+ "@gitlab/stylelint-config": "2.3.0",
"@testing-library/dom": "^7.16.2",
"@vue/test-utils": "1.1.2",
"acorn": "^6.3.0",
@@ -167,17 +183,17 @@
"commander": "^2.18.0",
"custom-jquery-matchers": "^2.1.0",
"docdash": "^1.0.2",
- "eslint": "7.19.0",
+ "eslint": "7.21.0",
"eslint-import-resolver-jest": "3.0.0",
"eslint-import-resolver-webpack": "0.13.0",
"eslint-plugin-jasmine": "4.1.2",
"eslint-plugin-no-jquery": "2.5.0",
"gettext-extractor": "^3.5.3",
"gettext-extractor-vue": "^5.0.0",
+ "glob": "^7.1.6",
"istanbul-lib-coverage": "^3.0.0",
"istanbul-lib-report": "^3.0.0",
"istanbul-reports": "^3.0.0",
- "glob": "^7.1.6",
"jasmine-core": "^2.9.0",
"jasmine-diff": "^0.1.3",
"jasmine-jquery": "^2.1.1",
@@ -207,9 +223,6 @@
"postcss": "^7.0.14",
"prettier": "2.2.1",
"readdir-enhanced": "^2.2.4",
- "stylelint": "^10.1.0",
- "stylelint-config-recommended": "^2.2.0",
- "stylelint-scss": "^3.9.2",
"timezone-mock": "^1.0.8",
"vue-jest": "4.0.0-rc.0",
"webpack-dev-server": "^3.11.2",
diff --git a/qa/Dockerfile b/qa/Dockerfile
index 76c81d03071..dda882dc5e6 100644
--- a/qa/Dockerfile
+++ b/qa/Dockerfile
@@ -38,6 +38,14 @@ RUN unzip chromedriver_linux64.zip -d /usr/local/bin
RUN rm -f chromedriver_linux64.zip
##
+# Install root certificate
+#
+RUN mkdir -p /usr/share/ca-certificates/gitlab
+ADD ./qa/tls_certificates/authority/ca.crt /usr/share/ca-certificates/gitlab/
+RUN echo 'gitlab/ca.crt' >> /etc/ca-certificates.conf
+RUN chmod -R 644 /usr/share/ca-certificates/gitlab && update-ca-certificates
+
+##
# Install gcloud and kubectl CLI used in Auto DevOps test to create K8s
# clusters
#
diff --git a/qa/Gemfile b/qa/Gemfile
index f55d27c159b..21ca945a500 100644
--- a/qa/Gemfile
+++ b/qa/Gemfile
@@ -21,6 +21,7 @@ gem 'rotp', '~> 3.1.0'
gem 'timecop', '~> 0.9.1'
gem 'parallel', '~> 1.19'
gem 'rspec-parameterized', '~> 0.4.2'
+gem 'github_api', '~> 0.18.2'
group :development do
gem 'pry-byebug', '~> 3.5.1', platform: :mri
diff --git a/qa/Gemfile.lock b/qa/Gemfile.lock
index 3b532d90526..4eeaca1f1a6 100644
--- a/qa/Gemfile.lock
+++ b/qa/Gemfile.lock
@@ -39,19 +39,31 @@ GEM
adamantium (~> 0.2.0)
equalizer (~> 0.0.9)
concurrent-ruby (1.1.7)
+ descendants_tracker (0.0.4)
+ thread_safe (~> 0.3, >= 0.3.1)
diff-lcs (1.3)
domain_name (0.5.20190701)
unf (>= 0.0.5, < 1.0.0)
equalizer (0.0.11)
faker (1.9.3)
i18n (>= 0.7)
+ faraday (0.17.3)
+ multipart-post (>= 1.2, < 3)
+ github_api (0.18.2)
+ addressable (~> 2.4)
+ descendants_tracker (~> 0.0.4)
+ faraday (~> 0.8)
+ hashie (~> 3.5, >= 3.5.2)
+ oauth2 (~> 1.0)
gitlab-qa (4.0.0)
+ hashie (3.6.0)
http-accept (1.7.0)
http-cookie (1.0.3)
domain_name (~> 0.5)
i18n (1.8.5)
concurrent-ruby (~> 1.0)
ice_nine (0.11.2)
+ jwt (2.2.2)
knapsack (1.17.1)
rake
launchy (2.4.3)
@@ -65,10 +77,19 @@ GEM
mini_mime (1.0.2)
mini_portile2 (2.5.0)
minitest (5.14.2)
+ multi_json (1.15.0)
+ multi_xml (0.6.0)
+ multipart-post (2.1.1)
netrc (0.11.0)
nokogiri (1.11.1)
mini_portile2 (~> 2.5.0)
racc (~> 1.4)
+ oauth2 (1.4.4)
+ faraday (>= 0.8, < 2.0)
+ jwt (>= 1.0, < 3.0)
+ multi_json (~> 1.3)
+ multi_xml (~> 0.5)
+ rack (>= 1.2, < 3)
parallel (1.19.2)
parallel_tests (2.29.0)
parallel
@@ -155,6 +176,7 @@ DEPENDENCIES
capybara (~> 3.29.0)
capybara-screenshot (~> 1.0.23)
faker (~> 1.6, >= 1.6.6)
+ github_api (~> 0.18.2)
gitlab-qa
knapsack (~> 1.17)
nokogiri (~> 1.11.1)
diff --git a/qa/qa.rb b/qa/qa.rb
index 1cf6d7b79f7..fadb0b964d5 100644
--- a/qa/qa.rb
+++ b/qa/qa.rb
@@ -95,6 +95,7 @@ module QA
autoload :Visibility, 'qa/resource/visibility'
autoload :ProjectSnippet, 'qa/resource/project_snippet'
autoload :Design, 'qa/resource/design'
+ autoload :RegistryRepository, 'qa/resource/registry_repository'
module KubernetesCluster
autoload :Base, 'qa/resource/kubernetes_cluster/base'
@@ -231,6 +232,7 @@ module QA
module Settings
autoload :General, 'qa/page/group/settings/general'
+ autoload :PackageRegistries, 'qa/page/group/settings/package_registries'
end
end
@@ -293,6 +295,10 @@ module QA
autoload :Show, 'qa/page/project/packages/show'
end
+ module Registry
+ autoload :Show, 'qa/page/project/registry/show'
+ end
+
module Settings
autoload :Advanced, 'qa/page/project/settings/advanced'
autoload :Main, 'qa/page/project/settings/main'
@@ -489,6 +495,7 @@ module QA
autoload :ProjectSelector, 'qa/page/component/project_selector'
autoload :Snippet, 'qa/page/component/snippet'
autoload :NewSnippet, 'qa/page/component/new_snippet'
+ autoload :InviteMembersModal, 'qa/page/component/invite_members_modal'
module Issuable
autoload :Common, 'qa/page/component/issuable/common'
diff --git a/qa/qa/page/component/invite_members_modal.rb b/qa/qa/page/component/invite_members_modal.rb
new file mode 100644
index 00000000000..fbddb37f15e
--- /dev/null
+++ b/qa/qa/page/component/invite_members_modal.rb
@@ -0,0 +1,80 @@
+# frozen_string_literal: true
+
+module QA
+ module Page
+ module Component
+ module InviteMembersModal
+ extend QA::Page::PageConcern
+
+ def self.included(base)
+ super
+
+ base.view 'app/assets/javascripts/invite_members/components/invite_members_modal.vue' do
+ element :invite_button
+ element :access_level_dropdown
+ element :invite_members_modal_content
+ end
+
+ base.view 'app/assets/javascripts/invite_members/components/group_select.vue' do
+ element :group_select_dropdown_search_field
+ end
+
+ base.view 'app/assets/javascripts/invite_members/components/invite_group_trigger.vue' do
+ element :invite_a_group_button
+ end
+
+ base.view 'app/assets/javascripts/invite_members/components/invite_members_trigger.vue' do
+ element :invite_members_button
+ end
+ end
+
+ def open_invite_members_modal
+ click_element :invite_members_button
+ end
+
+ def open_invite_group_modal
+ click_element :invite_a_group_button
+ end
+
+ def add_member(username, access_level = Resource::Members::AccessLevel::DEVELOPER)
+ open_invite_members_modal
+
+ within_element(:invite_members_modal_content) do
+ fill_element :access_level_dropdown, with: access_level
+
+ fill_in 'Search for members to invite', with: username
+
+ Support::WaitForRequests.wait_for_requests
+
+ click_button username
+
+ click_element :invite_button
+ end
+
+ Support::WaitForRequests.wait_for_requests
+
+ page.refresh
+ end
+
+ def invite_group(group_name, group_access = Resource::Members::AccessLevel::GUEST)
+ open_invite_group_modal
+
+ fill_element :access_level_dropdown, with: group_access
+
+ click_button 'Select a group'
+ fill_element :group_select_dropdown_search_field, group_name
+
+ Support::WaitForRequests.wait_for_requests
+
+ click_button group_name
+
+ click_element :invite_button
+
+ Support::WaitForRequests.wait_for_requests
+
+ page.refresh
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/page/component/issue_board/show.rb b/qa/qa/page/component/issue_board/show.rb
index 4c1f03fbe86..d7dfb0757bc 100644
--- a/qa/qa/page/component/issue_board/show.rb
+++ b/qa/qa/page/component/issue_board/show.rb
@@ -43,6 +43,10 @@ module QA
element :focus_mode_button
end
+ view 'app/assets/javascripts/boards/components/config_toggle.vue' do
+ element :boards_config_button
+ end
+
# The `focused_board` method does not use `find_element` with an element defined
# with the attribute `data-qa-selector` since such element is not unique when the
# `is-focused` class is not set, and it was not possible to find a better solution.
@@ -82,6 +86,10 @@ module QA
end
end
+ def click_boards_config_button
+ click_element(:boards_config_button)
+ end
+
def click_boards_dropdown_button
# The dropdown button comes from the `GlDropdown` component of `@gitlab/ui`,
# so it wasn't possible to add a `data-qa-selector` to it.
diff --git a/qa/qa/page/component/new_snippet.rb b/qa/qa/page/component/new_snippet.rb
index 741a3feb73b..673bc7ba44c 100644
--- a/qa/qa/page/component/new_snippet.rb
+++ b/qa/qa/page/component/new_snippet.rb
@@ -32,6 +32,10 @@ module QA
# This 'element' is here only to ensure the changes in the view source aren't mistakenly changed
element :_, "qa_selector = local_assigns.fetch(:qa_selector, '')" # rubocop:disable QA/ElementWithPattern
end
+
+ base.view 'app/assets/javascripts/snippets/components/snippet_visibility_edit.vue' do
+ element :visibility_content
+ end
end
def fill_title(title)
@@ -44,7 +48,7 @@ module QA
end
def set_visibility(visibility)
- choose visibility
+ click_element(:visibility_content, visibility: visibility)
end
def fill_file_name(name, file_number = nil)
diff --git a/qa/qa/page/component/note.rb b/qa/qa/page/component/note.rb
index 50567796bdb..67583f71bf3 100644
--- a/qa/qa/page/component/note.rb
+++ b/qa/qa/page/component/note.rb
@@ -17,7 +17,6 @@ module QA
element :comment_button
element :comment_field
element :discussion_menu_item
- element :note_dropdown
end
base.view 'app/assets/javascripts/notes/components/discussion_actions.vue' do
@@ -146,7 +145,7 @@ module QA
def start_discussion(text)
fill_element :comment_field, text
- click_element :note_dropdown
+ within_element(:comment_button) { click_button(class: 'dropdown-toggle-split') }
click_element :discussion_menu_item
click_element :comment_button
diff --git a/qa/qa/page/dashboard/snippet/edit.rb b/qa/qa/page/dashboard/snippet/edit.rb
index 40add146e97..cd8ac77ae04 100644
--- a/qa/qa/page/dashboard/snippet/edit.rb
+++ b/qa/qa/page/dashboard/snippet/edit.rb
@@ -18,13 +18,17 @@ module QA
element :delete_file_button
end
+ view 'app/assets/javascripts/snippets/components/snippet_visibility_edit.vue' do
+ element :visibility_content
+ end
+
def add_to_file_content(content)
text_area.set content
text_area.has_text?(content) # wait for changes to take effect
end
def change_visibility_to(visibility_type)
- choose(visibility_type)
+ click_element(:visibility_content, visibility: visibility_type)
end
def click_add_file
diff --git a/qa/qa/page/group/members.rb b/qa/qa/page/group/members.rb
index 87423ae9d75..68a169d5a7f 100644
--- a/qa/qa/page/group/members.rb
+++ b/qa/qa/page/group/members.rb
@@ -4,18 +4,13 @@ module QA
module Page
module Group
class Members < Page::Base
- include QA::Page::Component::Select2
+ include Page::Component::InviteMembersModal
include Page::Component::UsersSelect
view 'app/assets/javascripts/vue_shared/components/remove_member_modal.vue' do
element :remove_member_modal_content
end
- view 'app/views/shared/members/_invite_member.html.haml' do
- element :member_select_field
- element :invite_member_button
- end
-
view 'app/assets/javascripts/pages/groups/group_members/index.js' do
element :member_row
element :groups_list
@@ -32,31 +27,9 @@ module QA
end
view 'app/views/groups/group_members/index.html.haml' do
- element :invite_group_tab
element :groups_list_tab
end
- view 'app/views/shared/members/_invite_group.html.haml' do
- element :group_select_field
- element :invite_group_button
- end
-
- def select_group(group_name)
- click_element :group_select_field
- search_and_select(group_name)
- end
-
- def invite_group(group_name)
- click_element :invite_group_tab
- select_group(group_name)
- click_element :invite_group_button
- end
-
- def add_member(username)
- select_user :member_select_field, username
- click_element :invite_member_button
- end
-
def update_access_level(username, access_level)
within_element(:member_row, text: username) do
click_element :access_level_dropdown
diff --git a/qa/qa/page/group/menu.rb b/qa/qa/page/group/menu.rb
index 7689dd7e5c8..10c0ee1f0a9 100644
--- a/qa/qa/page/group/menu.rb
+++ b/qa/qa/page/group/menu.rb
@@ -14,6 +14,10 @@ module QA
element :group_settings_item
end
+ view 'app/views/groups/sidebar/_packages_settings.html.haml' do
+ element :group_package_settings_link
+ end
+
view 'app/views/layouts/nav/sidebar/_analytics_links.html.haml' do
element :analytics_link
element :analytics_sidebar_submenu
@@ -55,6 +59,15 @@ module QA
end
end
+ def go_to_package_settings
+ scroll_to_element(:group_settings_item)
+ hover_element(:group_settings_item) do
+ within_submenu(:group_sidebar_submenu) do
+ click_element(:group_package_settings_link)
+ end
+ end
+ end
+
private
def hover_issues
diff --git a/qa/qa/page/group/settings/package_registries.rb b/qa/qa/page/group/settings/package_registries.rb
new file mode 100644
index 00000000000..ee5ca849a47
--- /dev/null
+++ b/qa/qa/page/group/settings/package_registries.rb
@@ -0,0 +1,42 @@
+# frozen_string_literal: true
+
+module QA
+ module Page
+ module Group
+ module Settings
+ class PackageRegistries < QA::Page::Base
+ include ::QA::Page::Settings::Common
+
+ view 'app/assets/javascripts/packages_and_registries/settings/group/components/group_settings_app.vue' do
+ element :package_registry_settings_content
+ end
+
+ view 'app/assets/javascripts/packages_and_registries/settings/group/components/maven_settings.vue' do
+ element :allow_duplicates_toggle
+ element :allow_duplicates_label
+ end
+
+ def set_allow_duplicates_disabled
+ expand_content :package_registry_settings_content do
+ click_element(:allow_duplicates_toggle) if duplicates_enabled?
+ end
+ end
+
+ def set_allow_duplicates_enabled
+ expand_content :package_registry_settings_content do
+ click_element(:allow_duplicates_toggle) if duplicates_disabled?
+ end
+ end
+
+ def duplicates_enabled?
+ has_element?(:allow_duplicates_label, text: 'Allow duplicates')
+ end
+
+ def duplicates_disabled?
+ has_element?(:allow_duplicates_label, text: 'Do not allow duplicates')
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/page/main/login.rb b/qa/qa/page/main/login.rb
index 265e2b7573c..048119d65cb 100644
--- a/qa/qa/page/main/login.rb
+++ b/qa/qa/page/main/login.rb
@@ -52,7 +52,7 @@ module QA
using_wait_time 0 do
set_initial_password_if_present
- raise NotImplementedError if Runtime::User.ldap_user? && user&.credentials_given?
+ raise 'If an LDAP user is provided, it must be used for sign-in', QA::Resource::User::InvalidUserError if Runtime::User.ldap_user? && user && user.username != Runtime::User.ldap_username
if Runtime::User.ldap_user?
sign_in_using_ldap_credentials(user: user || Runtime::User)
diff --git a/qa/qa/page/merge_request/show.rb b/qa/qa/page/merge_request/show.rb
index 18676807fd6..056942d0eaf 100644
--- a/qa/qa/page/merge_request/show.rb
+++ b/qa/qa/page/merge_request/show.rb
@@ -26,6 +26,10 @@ module QA
element :merge_immediately_option
end
+ view 'app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_auto_merge_enabled.vue' do
+ element :merge_request_status_content
+ end
+
view 'app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_merged.vue' do
element :merged_status_content
end
@@ -179,7 +183,11 @@ module QA
end
def fast_forward_possible?
- has_no_text?('Fast-forward merge is not possible')
+ has_text?('Fast-forward merge without a merge commit')
+ end
+
+ def fast_forward_not_possible?
+ has_text?('Fast-forward merge is not possible')
end
def has_file?(file_name)
@@ -224,8 +232,7 @@ module QA
end
def merge!
- wait_until_ready_to_merge
- click_element(:merge_button)
+ try_to_merge!
finished_loading?
raise "Merge did not appear to be successful" unless merged?
@@ -236,8 +243,18 @@ module QA
click_element(:merge_immediately_option)
end
+ def merge_when_pipeline_succeeds!
+ wait_until_ready_to_merge
+
+ click_element(:merge_button, text: 'Merge when pipeline succeeds')
+ end
+
def merged?
- has_element?(:merged_status_content, text: 'The changes were merged into', wait: 60)
+ # Revisit after merge page re-architect is done https://gitlab.com/gitlab-org/gitlab/-/issues/300042
+ # To remove page refresh logic if possible
+ retry_until(max_attempts: 3, reload: true) do
+ has_element?(:merged_status_content, text: 'The changes were merged into', wait: 20)
+ end
end
# Check if the MR is able to be merged
@@ -249,6 +266,10 @@ module QA
has_element?(:merge_button, disabled: false)
end
+ def merge_request_status
+ find_element(:merge_request_status_content).text
+ end
+
# Waits up 60 seconds and raises an error if unable to merge
def wait_until_ready_to_merge
has_element?(:merge_button)
@@ -280,7 +301,10 @@ module QA
end
def try_to_merge!
+ # Revisit after merge page re-architect is done https://gitlab.com/gitlab-org/gitlab/-/issues/300042
+ # To remove page refresh logic if possible
wait_until_ready_to_merge
+ wait_until { !find_element(:merge_button).has_text?("when pipeline succeeds") }
click_element(:merge_button)
end
diff --git a/qa/qa/page/project/import/github.rb b/qa/qa/page/project/import/github.rb
index 6890c7de9f8..081d5303cbb 100644
--- a/qa/qa/page/project/import/github.rb
+++ b/qa/qa/page/project/import/github.rb
@@ -30,6 +30,7 @@ module QA
set_path(full_path, name)
import_project(full_path)
wait_for_success
+ go_to_project(name)
end
private
@@ -73,6 +74,13 @@ module QA
page.has_content?('Done', wait: 1.0)
end
end
+
+ def go_to_project(name)
+ Page::Main::Menu.perform(&:go_to_projects)
+ Page::Dashboard::Projects.perform do |dashboard|
+ dashboard.go_to_project(name)
+ end
+ end
end
end
end
diff --git a/qa/qa/page/project/issue/index.rb b/qa/qa/page/project/issue/index.rb
index e85d10e4eb8..032f02268bc 100644
--- a/qa/qa/page/project/issue/index.rb
+++ b/qa/qa/page/project/issue/index.rb
@@ -15,18 +15,21 @@ module QA
element :avatar_counter_content
end
- view 'app/views/shared/issuable/csv_export/_button.html.haml' do
- element :export_as_csv_button
+ view 'app/assets/javascripts/issuable/components/csv_export_modal.vue' do
+ element :export_issuable_modal
end
- view 'app/views/shared/issuable/csv_export/_modal.html.haml' do
- element :export_issues_button
- element :export_issuable_modal
+ view 'app/assets/javascripts/issuable/components/csv_import_export_buttons.vue' do
+ element :export_as_csv_button
+ element :import_from_jira_link
end
view 'app/views/projects/issues/import_csv/_button.html.haml' do
element :import_issues_button
- element :import_from_jira_link
+ end
+
+ view 'app/views/shared/issuable/csv_export/_modal.html.haml' do
+ element :export_issues_button
end
view 'app/views/shared/issuable/_nav.html.haml' do
diff --git a/qa/qa/page/project/members.rb b/qa/qa/page/project/members.rb
index 7e722e02ad0..09264d95aed 100644
--- a/qa/qa/page/project/members.rb
+++ b/qa/qa/page/project/members.rb
@@ -4,21 +4,18 @@ module QA
module Page
module Project
class Members < Page::Base
- include QA::Page::Component::Select2
-
- view 'app/views/shared/members/_invite_member.html.haml' do
- element :member_select_field
- element :invite_member_button
- end
+ include QA::Page::Component::InviteMembersModal
view 'app/views/projects/project_members/index.html.haml' do
- element :invite_group_tab
element :groups_list_tab
end
- view 'app/views/shared/members/_invite_group.html.haml' do
- element :group_select_field
- element :invite_group_button
+ view 'app/assets/javascripts/invite_members/components/invite_group_trigger.vue' do
+ element :invite_a_group_button
+ end
+
+ view 'app/assets/javascripts/invite_members/components/invite_members_trigger.vue' do
+ element :invite_members_button
end
view 'app/assets/javascripts/pages/projects/project_members/index.js' do
@@ -33,25 +30,7 @@ module QA
element :remove_group_link_modal_content
end
- def select_group(group_name)
- click_element :group_select_field
- search_and_select(group_name)
- end
-
- def invite_group(group_name)
- click_element :invite_group_tab
- select_group(group_name)
- click_element :invite_group_button
- end
-
- def add_member(username)
- click_element :member_select_field
- search_and_select username
- click_element :invite_member_button
- end
-
def remove_group(group_name)
- click_element :invite_group_tab
click_element :groups_list_tab
within_element(:group_row, text: group_name) do
diff --git a/qa/qa/page/project/operations/kubernetes/index.rb b/qa/qa/page/project/operations/kubernetes/index.rb
index 114e3ddd46a..ca41dddaca2 100644
--- a/qa/qa/page/project/operations/kubernetes/index.rb
+++ b/qa/qa/page/project/operations/kubernetes/index.rb
@@ -7,11 +7,11 @@ module QA
module Kubernetes
class Index < Page::Base
view 'app/views/clusters/clusters/_empty_state.html.haml' do
- element :add_kubernetes_cluster_button, "link_to s_('ClusterIntegration|Integrate with a cluster certificate')" # rubocop:disable QA/ElementWithPattern
+ element :add_kubernetes_cluster_link
end
def add_kubernetes_cluster
- click_on 'Connect cluster with certificate'
+ click_element :add_kubernetes_cluster_link
end
def has_cluster?(cluster)
diff --git a/qa/qa/page/project/registry/show.rb b/qa/qa/page/project/registry/show.rb
new file mode 100644
index 00000000000..dffdb9eebba
--- /dev/null
+++ b/qa/qa/page/project/registry/show.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+module QA
+ module Page
+ module Project
+ module Registry
+ class Show < QA::Page::Base
+ view 'app/assets/javascripts/registry/explorer/components/list_page/image_list_row.vue' do
+ element :registry_image_content
+ end
+
+ view 'app/assets/javascripts/registry/explorer/components/details_page/tags_list_row.vue' do
+ element :tag_delete_button
+ end
+
+ def has_registry_repository?(name)
+ find_element(:registry_image_content, text: name)
+ end
+
+ def click_on_image(name)
+ click_element(:registry_image_content, text: name)
+ end
+
+ def has_tag?(tag_name)
+ has_button?(tag_name)
+ end
+
+ def has_no_tag?(tag_name)
+ has_no_button?(tag_name)
+ end
+
+ def click_delete
+ click_element(:tag_delete_button)
+ find_button('Confirm').click
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/page/project/settings/main.rb b/qa/qa/page/project/settings/main.rb
index 4db66543a25..48af635bb79 100644
--- a/qa/qa/page/project/settings/main.rb
+++ b/qa/qa/page/project/settings/main.rb
@@ -11,8 +11,9 @@ module QA
include Component::Breadcrumbs
view 'app/views/projects/edit.html.haml' do
- element :advanced_settings
- element :merge_request_settings
+ element :advanced_settings_content
+ element :merge_request_settings_content
+ element :visibility_features_permissions_content
end
view 'app/views/projects/settings/_general.html.haml' do
@@ -20,10 +21,6 @@ module QA
element :save_naming_topics_avatar_button
end
- view 'app/views/projects/edit.html.haml' do
- element :visibility_features_permissions_content
- end
-
def rename_project_to(name)
fill_project_name(name)
click_save_changes
@@ -38,13 +35,13 @@ module QA
end
def expand_advanced_settings(&block)
- expand_content(:advanced_settings) do
+ expand_content(:advanced_settings_content) do
Advanced.perform(&block)
end
end
def expand_merge_requests_settings(&block)
- expand_content(:merge_request_settings) do
+ expand_content(:merge_request_settings_content) do
MergeRequest.perform(&block)
end
end
diff --git a/qa/qa/page/project/settings/merge_request.rb b/qa/qa/page/project/settings/merge_request.rb
index ec8d73df1b3..34754124931 100644
--- a/qa/qa/page/project/settings/merge_request.rb
+++ b/qa/qa/page/project/settings/merge_request.rb
@@ -8,11 +8,11 @@ module QA
include QA::Page::Settings::Common
view 'app/views/projects/edit.html.haml' do
- element :save_merge_request_changes
+ element :save_merge_request_changes_button
end
view 'app/views/projects/_merge_request_merge_method_settings.html.haml' do
- element :radio_button_merge_ff
+ element :merge_ff_radio_button
end
view 'app/views/projects/_merge_request_merge_checks_settings.html.haml' do
@@ -20,11 +20,11 @@ module QA
end
def click_save_changes
- click_element :save_merge_request_changes
+ click_element :save_merge_request_changes_button
end
def enable_ff_only
- click_element :radio_button_merge_ff
+ click_element :merge_ff_radio_button
click_save_changes
end
diff --git a/qa/qa/page/project/sub_menus/packages.rb b/qa/qa/page/project/sub_menus/packages.rb
index 9ea045a99f5..46eae01e10d 100644
--- a/qa/qa/page/project/sub_menus/packages.rb
+++ b/qa/qa/page/project/sub_menus/packages.rb
@@ -22,6 +22,25 @@ module QA
click_element :packages_link
end
end
+
+ def go_to_container_registry
+ hover_registry do
+ within_submenu do
+ click_link('Container Registry')
+ end
+ end
+ end
+
+ private
+
+ def hover_registry
+ within_sidebar do
+ scroll_to_element(:packages_link)
+ find_element(:packages_link).hover
+
+ yield
+ end
+ end
end
end
end
diff --git a/qa/qa/page/project/sub_menus/settings.rb b/qa/qa/page/project/sub_menus/settings.rb
index 47274c8db54..b5058bacccd 100644
--- a/qa/qa/page/project/sub_menus/settings.rb
+++ b/qa/qa/page/project/sub_menus/settings.rb
@@ -25,7 +25,7 @@ module QA
def go_to_ci_cd_settings
hover_settings do
within_submenu do
- click_link('CI / CD')
+ click_link('CI/CD')
end
end
end
diff --git a/qa/qa/resource/clusters/agent_token.rb b/qa/qa/resource/clusters/agent_token.rb
index 6a5e861b650..3286f46cdb2 100644
--- a/qa/qa/resource/clusters/agent_token.rb
+++ b/qa/qa/resource/clusters/agent_token.rb
@@ -32,7 +32,7 @@ module QA
def api_post_body
<<~GQL
mutation createToken {
- clusterAgentTokenCreate(input: { clusterAgentId: "gid://gitlab/Clusters::Agent/#{agent.id}" }) {
+ clusterAgentTokenCreate(input: { clusterAgentId: "gid://gitlab/Clusters::Agent/#{agent.id}" name: "token-#{agent.id}" }) {
secret # This is the value you need to use on the next step
token {
createdAt
diff --git a/qa/qa/resource/members.rb b/qa/qa/resource/members.rb
index a88980f26d8..c8f9feeca15 100644
--- a/qa/qa/resource/members.rb
+++ b/qa/qa/resource/members.rb
@@ -26,10 +26,23 @@ module QA
JSON.parse(get(Runtime::API::Request.new(api_client, api_members_path).url).body)
end
+ def invite_group(group, access_level = AccessLevel::GUEST)
+ Support::Retrier.retry_until do
+ QA::Runtime::Logger.debug(%Q[Sharing #{self.class.name} with #{group.name}])
+
+ response = post Runtime::API::Request.new(api_client, api_share_path).url, { group_id: group.id, group_access: access_level }
+ response.code == QA::Support::Api::HTTP_STATUS_CREATED
+ end
+ end
+
def api_members_path
"#{api_get_path}/members"
end
+ def api_share_path
+ "#{api_get_path}/share"
+ end
+
class AccessLevel
NO_ACCESS = 0
MINIMAL_ACCESS = 5
diff --git a/qa/qa/resource/merge_request.rb b/qa/qa/resource/merge_request.rb
index fd5f454f134..fb450a61c9a 100644
--- a/qa/qa/resource/merge_request.rb
+++ b/qa/qa/resource/merge_request.rb
@@ -75,7 +75,7 @@ module QA
Page::MergeRequest::New.perform do |new_page|
new_page.fill_title(@title)
new_page.choose_template(@template) if @template
- new_page.fill_description(@description) unless @template
+ new_page.fill_description(@description) if @description && !@template
new_page.choose_milestone(@milestone) if @milestone
new_page.assign_to_me if @assignee == 'me'
labels.each do |label|
@@ -140,6 +140,14 @@ module QA
end
end
+ def reload!
+ # Refabricate so that we can return a new object with updated attributes
+ self.class.fabricate_via_api! do |resource|
+ resource.project = project
+ resource.id = api_resource[:iid]
+ end
+ end
+
private
def transform_api_resource(api_resource)
diff --git a/qa/qa/resource/personal_access_token.rb b/qa/qa/resource/personal_access_token.rb
index 6b2301ba916..59ae8f4de7a 100644
--- a/qa/qa/resource/personal_access_token.rb
+++ b/qa/qa/resource/personal_access_token.rb
@@ -4,17 +4,59 @@ require 'date'
module QA
module Resource
- ##
- # Create a personal access token that can be used by the api
- #
class PersonalAccessToken < Base
attr_accessor :name
- attribute :access_token do
+ # The user for which the personal access token is to be created
+ # This *could* be different than the api_client.user or the api_user provided by the QA::Resource::ApiFabricator module
+ attr_writer :user
+
+ attribute :token do
Page::Profile::PersonalAccessTokens.perform(&:created_access_token)
end
+ # Only Admins can create PAT via the API.
+ # If Runtime::Env.admin_personal_access_token is provided, fabricate via the API,
+ # else, fabricate via the browser.
+ def fabricate_via_api!
+ if Runtime::Env.admin_personal_access_token && !@user.nil?
+ self.api_client = Runtime::API::Client.as_admin
+
+ super
+ else
+ fabricate!
+ end
+ end
+
+ # When a user is not provided, use default user
+ def user
+ @user || Resource::User.default
+ end
+
+ def api_post_path
+ "/users/#{user.api_resource[:id]}/personal_access_tokens"
+ end
+
+ def api_get_path
+ '/personal_access_tokens'
+ end
+
+ def api_post_body
+ {
+ name: name || 'api-test-token',
+ scopes: ["api"]
+ }
+ end
+
+ def resource_web_url(resource)
+ super
+ rescue ResourceURLMissingError
+ # this particular resource does not expose a web_url property
+ end
+
def fabricate!
+ Flow::Login.sign_in_unless_signed_in(as: user)
+
Page::Main::Menu.perform(&:click_edit_profile_link)
Page::Profile::Menu.perform(&:click_access_tokens)
@@ -22,7 +64,7 @@ module QA
token_page.fill_token_name(name || 'api-test-token')
token_page.check_api
# Expire in 2 days just in case the token is created just before midnight
- token_page.fill_expiry_date(Date.today + 2)
+ token_page.fill_expiry_date(Time.now.utc.to_date + 2)
token_page.click_create_token_button
end
end
diff --git a/qa/qa/resource/project.rb b/qa/qa/resource/project.rb
index efb6c2c0591..23e2ec07491 100644
--- a/qa/qa/resource/project.rb
+++ b/qa/qa/resource/project.rb
@@ -151,6 +151,10 @@ module QA
"#{api_get_path}/runners"
end
+ def api_registry_repositories_path
+ "#{api_get_path}/registry/repositories"
+ end
+
def api_commits_path
"#{api_get_path}/repository/commits"
end
@@ -256,6 +260,12 @@ module QA
parse_body(response)
end
+ def registry_repositories
+ response = get Runtime::API::Request.new(api_client, "#{api_registry_repositories_path}").url
+
+ parse_body(response)
+ end
+
def repository_branches
parse_body(get(Runtime::API::Request.new(api_client, api_repository_branches_path).url))
end
@@ -272,10 +282,6 @@ module QA
parse_body(get(Runtime::API::Request.new(api_client, api_pipelines_path).url))
end
- def share_with_group(invitee, access_level = Resource::Members::AccessLevel::DEVELOPER)
- post Runtime::API::Request.new(api_client, "/projects/#{id}/share").url, { group_id: invitee.id, group_access: access_level }
- end
-
private
def transform_api_resource(api_resource)
diff --git a/qa/qa/resource/project_imported_from_github.rb b/qa/qa/resource/project_imported_from_github.rb
index 0b817b345fd..b06a7fe4e3d 100644
--- a/qa/qa/resource/project_imported_from_github.rb
+++ b/qa/qa/resource/project_imported_from_github.rb
@@ -12,7 +12,7 @@ module QA
group.visit!
Page::Group::Show.perform(&:go_to_new_project)
- go_to_import_tab
+ go_to_import_page
Page::Project::New.perform(&:click_github_link)
Page::Project::Import::Github.perform do |import_page|
@@ -21,7 +21,7 @@ module QA
end
end
- def go_to_import_tab
+ def go_to_import_page
Page::Project::New.perform(&:click_import_project)
end
end
diff --git a/qa/qa/resource/project_snippet.rb b/qa/qa/resource/project_snippet.rb
index c262499664e..9ab4612d117 100644
--- a/qa/qa/resource/project_snippet.rb
+++ b/qa/qa/resource/project_snippet.rb
@@ -33,12 +33,16 @@ module QA
end
def api_get_path
- "/projects/#{project.id}/snippets/#{snippet_id}"
+ "/projects/#{project.id}/snippets/#{id}"
end
def api_post_path
"/projects/#{project.id}/snippets"
end
+
+ def api_delete_path
+ "/projects/#{project.id}/snippets/#{id}"
+ end
end
end
end
diff --git a/qa/qa/resource/registry_repository.rb b/qa/qa/resource/registry_repository.rb
new file mode 100644
index 00000000000..1e43d93a784
--- /dev/null
+++ b/qa/qa/resource/registry_repository.rb
@@ -0,0 +1,53 @@
+# frozen_string_literal: true
+
+require 'securerandom'
+
+module QA
+ module Resource
+ class RegistryRepository < Base
+ attr_accessor :name,
+ :repository_id
+
+ attribute :project do
+ Project.fabricate_via_api! do |resource|
+ resource.name = 'project-with-registry'
+ resource.description = 'Project with Registry'
+ end
+ end
+
+ def initialize
+ @name = project.path_with_namespace
+ @repository_id = nil
+ end
+
+ def fabricate!
+ end
+
+ def fabricate_via_api!
+ resource_web_url(api_get)
+ rescue ResourceNotFoundError
+ super
+ end
+
+ def remove_via_api!
+ registry_repositories = project.registry_repositories
+ if registry_repositories && !registry_repositories.empty?
+ this_registry_repository = registry_repositories.find { |registry_repository| registry_repository[:path] == name }
+
+ @repository_id = this_registry_repository[:id]
+
+ QA::Runtime::Logger.debug("Deleting registry '#{name}'")
+ super
+ end
+ end
+
+ def api_delete_path
+ "/projects/#{project.id}/registry/repositories/#{@repository_id}"
+ end
+
+ def api_get_path
+ "/projects/#{project.id}/registry/repositories"
+ end
+ end
+ end
+end
diff --git a/qa/qa/resource/snippet.rb b/qa/qa/resource/snippet.rb
index 6fdcb1cd29b..6423dc7a41c 100644
--- a/qa/qa/resource/snippet.rb
+++ b/qa/qa/resource/snippet.rb
@@ -3,7 +3,10 @@
module QA
module Resource
class Snippet < Base
- attr_accessor :title, :description, :file_content, :visibility, :file_name, :snippet_id
+ attr_accessor :title, :description, :file_content, :visibility, :file_name
+
+ attribute :id
+ attribute :http_url_to_repo
def initialize
@title = 'New snippet title'
@@ -44,13 +47,17 @@ module QA
end
def api_get_path
- "/snippets/#{snippet_id}"
+ "/snippets/#{id}"
end
def api_post_path
'/snippets'
end
+ def api_put_path
+ "/snippets/#{id}"
+ end
+
def api_post_body
{
title: title,
@@ -60,12 +67,38 @@ module QA
}
end
+ def api_delete_path
+ "/snippets/#{id}"
+ end
+
def all_file_contents
@files.insert(0, { name: @file_name, content: @file_content })
@files.each do |file|
file[:file_path] = file.delete(:name)
end
end
+
+ def has_file?(file_path)
+ response = get Runtime::API::Request.new(api_client, api_get_path).url
+
+ raise ResourceNotFoundError, "Request returned (#{response.code}): `#{response}`." if response.code == HTTP_STATUS_NOT_FOUND
+
+ file_output = parse_body(response)[:files]
+ file_output.any? { |file| file[:path] == file_path }
+ end
+
+ def change_repository_storage(new_storage)
+ post_body = { destination_storage_name: new_storage }
+ response = post Runtime::API::Request.new(api_client, "/snippets/#{id}/repository_storage_moves").url, post_body
+
+ unless response.code.between?(200, 300)
+ raise ResourceUpdateFailedError, "Could not change repository storage to #{new_storage}. Request returned (#{response.code}): `#{response}`."
+ end
+
+ wait_until(sleep_interval: 1) { Runtime::API::RepositoryStorageMoves.has_status?(self, 'finished', new_storage) }
+ rescue Support::Repeater::RepeaterConditionExceededError
+ raise Runtime::API::RepositoryStorageMoves::RepositoryStorageMovesError, 'Timed out while waiting for the snippet repository storage move to finish'
+ end
end
end
end
diff --git a/qa/qa/resource/user.rb b/qa/qa/resource/user.rb
index f95a68918dc..d1a310c7c43 100644
--- a/qa/qa/resource/user.rb
+++ b/qa/qa/resource/user.rb
@@ -5,6 +5,8 @@ require 'securerandom'
module QA
module Resource
class User < Base
+ InvalidUserError = Class.new(RuntimeError)
+
attr_reader :unique_id
attr_writer :username, :password
attr_accessor :admin, :provider, :extern_uid, :expect_fabrication_success
@@ -21,6 +23,13 @@ module QA
@expect_fabrication_success = true
end
+ def self.default
+ Resource::User.new.tap do |user|
+ user.username = Runtime::User.ldap_user? ? Runtime::User.ldap_username : Runtime::User.username
+ user.password = Runtime::User.ldap_user? ? Runtime::User.ldap_password : Runtime::User.password
+ end
+ end
+
def admin?
api_resource&.dig(:is_admin) || false
end
@@ -28,10 +37,12 @@ module QA
def username
@username || "qa-user-#{unique_id}"
end
+ alias_method :ldap_username, :username
def password
@password || 'password'
end
+ alias_method :ldap_password, :password
def name
@name ||= api_resource&.dig(:name) || "QA User #{unique_id}"
@@ -138,8 +149,8 @@ module QA
return {} unless extern_uid && provider
{
- extern_uid: extern_uid,
- provider: provider
+ extern_uid: extern_uid,
+ provider: provider
}
end
diff --git a/qa/qa/runtime/api/client.rb b/qa/qa/runtime/api/client.rb
index e4de033c309..4126ff9ff5a 100644
--- a/qa/qa/runtime/api/client.rb
+++ b/qa/qa/runtime/api/client.rb
@@ -23,22 +23,30 @@ module QA
# unless a specific user has been passed
@user.nil? ? Runtime::Env.personal_access_token ||= create_personal_access_token : create_personal_access_token
end
+
+ if @user&.admin?
+ Runtime::Env.admin_personal_access_token = @personal_access_token
+ end
+
+ @personal_access_token
end
def self.as_admin
- if Runtime::Env.admin_personal_access_token
- Runtime::API::Client.new(:gitlab, personal_access_token: Runtime::Env.admin_personal_access_token)
- else
- user = Resource::User.fabricate_via_api! do |user|
- user.username = Runtime::User.admin_username
- user.password = Runtime::User.admin_password
+ @admin_client ||= begin
+ if Runtime::Env.admin_personal_access_token
+ Runtime::API::Client.new(:gitlab, personal_access_token: Runtime::Env.admin_personal_access_token)
+ else
+ user = Resource::User.fabricate_via_api! do |user|
+ user.username = Runtime::User.admin_username
+ user.password = Runtime::User.admin_password
+ end
+
+ unless user.admin?
+ raise AuthorizationError, "User '#{user.username}' is not an administrator."
+ end
+
+ Runtime::API::Client.new(:gitlab, user: user)
end
-
- unless user.admin?
- raise AuthorizationError, "User '#{user.username}' is not an administrator."
- end
-
- Runtime::API::Client.new(:gitlab, user: user)
end
end
@@ -67,9 +75,9 @@ module QA
Page::Main::Menu.perform(&:sign_out) if @is_new_session && signed_in_initially
- Flow::Login.sign_in_unless_signed_in(as: @user)
-
- token = Resource::PersonalAccessToken.fabricate!.access_token
+ token = Resource::PersonalAccessToken.fabricate! do |pat|
+ pat.user = user
+ end.token
# If this is a new session, that tests that follow could fail if they
# try to sign in without starting a new session.
diff --git a/qa/qa/runtime/api/repository_storage_moves.rb b/qa/qa/runtime/api/repository_storage_moves.rb
index d0211d3f66d..5630a9c02c5 100644
--- a/qa/qa/runtime/api/repository_storage_moves.rb
+++ b/qa/qa/runtime/api/repository_storage_moves.rb
@@ -9,9 +9,9 @@ module QA
RepositoryStorageMovesError = Class.new(RuntimeError)
- def has_status?(project, status, destination_storage = Env.additional_repository_storage)
- find_any do |move|
- next unless move[:project][:path_with_namespace] == project.path_with_namespace
+ def has_status?(resource, status, destination_storage = Env.additional_repository_storage)
+ find_any(resource) do |move|
+ next unless resource_equals?(resource, move)
QA::Runtime::Logger.debug("Move data: #{move}")
@@ -20,16 +20,28 @@ module QA
end
end
- def find_any
+ def find_any(resource)
Logger.debug('Getting repository storage moves')
Support::Waiter.wait_until do
- with_paginated_response_body(Request.new(api_client, '/project_repository_storage_moves', per_page: '100').url) do |page|
+ with_paginated_response_body(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
end
+ def resource_equals?(resource, move)
+ if resource.class.name.include?('Snippet')
+ move[:snippet][:id] == resource.id
+ else
+ move[:project][:path_with_namespace] == resource.path_with_namespace
+ end
+ end
+
+ def resource_name(resource)
+ resource.class.name.split('::').last.downcase
+ end
+
private
def api_client
diff --git a/qa/qa/runtime/env.rb b/qa/qa/runtime/env.rb
index 6c4139da83f..7aa45204513 100644
--- a/qa/qa/runtime/env.rb
+++ b/qa/qa/runtime/env.rb
@@ -8,7 +8,7 @@ module QA
module Env
extend self
- attr_writer :personal_access_token
+ attr_writer :personal_access_token, :admin_personal_access_token
ENV_VARIABLES = Gitlab::QA::Runtime::Env::ENV_VARIABLES
@@ -78,18 +78,6 @@ module QA
ENV['QA_PRAEFECT_REPOSITORY_STORAGE']
end
- def admin_password
- ENV['GITLAB_ADMIN_PASSWORD']
- end
-
- def admin_username
- ENV['GITLAB_ADMIN_USERNAME']
- end
-
- def admin_personal_access_token
- ENV['GITLAB_QA_ADMIN_ACCESS_TOKEN']
- end
-
def ci_job_url
ENV['CI_JOB_URL']
end
@@ -140,6 +128,18 @@ module QA
enabled?(ENV['SIGNUP_DISABLED'], default: false)
end
+ def admin_password
+ ENV['GITLAB_ADMIN_PASSWORD']
+ end
+
+ def admin_username
+ ENV['GITLAB_ADMIN_USERNAME']
+ end
+
+ def admin_personal_access_token
+ @admin_personal_access_token ||= ENV['GITLAB_QA_ADMIN_ACCESS_TOKEN']
+ end
+
# specifies token that can be used for the api
def personal_access_token
@personal_access_token ||= ENV['GITLAB_QA_ACCESS_TOKEN']
diff --git a/qa/qa/service/praefect_manager.rb b/qa/qa/service/praefect_manager.rb
index ab4f28c292f..119013175c0 100644
--- a/qa/qa/service/praefect_manager.rb
+++ b/qa/qa/service/praefect_manager.rb
@@ -353,15 +353,47 @@ module QA
Support::Waiter.wait_until(sleep_interval: 1) { replication_queue_incomplete_count == 0 && replicated?(project_id) }
end
+ def replication_pending?
+ result = []
+ shell sql_to_docker_exec_cmd(
+ <<~SQL
+ select job from replication_queue
+ where state = 'ready'
+ and job ->> 'change' = 'update'
+ and job ->> 'source_node_storage' = '#{current_primary_node}'
+ and job ->> 'target_node_storage' = '#{@primary_node}';
+ SQL
+ ) do |line|
+ result << line
+ end
+
+ # The result looks like:
+ #
+ # job
+ # -----------
+ # {"change": "update", "params": null, "relative_path": "@hashed/4b/22/4b227777d4dd1fc61c6f884f48641d02b4d121d3fd328cb08b5531fcacdabf8a.git", "virtual_storage": "default", "source_node_storage": "gitaly3", "target_node_storage": "gitaly1"}
+ # (1 row)
+ # <blank row>
+ #
+ # Therefore when replication is pending there is at least 1 row of data plus 4 rows of metadata/layout
+
+ result.size >= 5
+ end
+
private
def current_primary_node
- shell dataloss_command do |line|
- QA::Runtime::Logger.debug(line.chomp)
-
- match = line.match(/Primary: (.*)/)
- break match[1] if match
+ result = []
+ shell sql_to_docker_exec_cmd("select node_name from shard_primaries where shard_name = '#{@virtual_storage}';") do |line|
+ result << line
end
+ # The result looks like:
+ # node_name
+ # -----------
+ # gitaly1
+ # (1 row)
+
+ result[2].strip
end
def dataloss_command
diff --git a/qa/qa/specs/features/api/3_create/gitaly/backend_node_recovery_spec.rb b/qa/qa/specs/features/api/3_create/gitaly/backend_node_recovery_spec.rb
index 89bf92cd3af..c90f8546f91 100644
--- a/qa/qa/specs/features/api/3_create/gitaly/backend_node_recovery_spec.rb
+++ b/qa/qa/specs/features/api/3_create/gitaly/backend_node_recovery_spec.rb
@@ -3,7 +3,7 @@
module QA
RSpec.describe 'Create' do
context 'Gitaly' do
- describe 'Backend node recovery', :orchestrated, :gitaly_cluster, :skip_live_env, quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/238186', type: :investigating } do
+ describe 'Backend node recovery', :orchestrated, :gitaly_cluster, :skip_live_env, quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/322647', type: :flaky } do
let(:praefect_manager) { Service::PraefectManager.new }
let(:project) do
Resource::Project.fabricate! do |project|
@@ -50,18 +50,17 @@ module QA
push.file_content = 'new file'
end
+ # Confirm that the commit is waiting to be replicated
+ expect(praefect_manager).to be_replication_pending
+
# Start the old primary node again
praefect_manager.start_primary_node
- praefect_manager.wait_for_health_check_current_primary_node
-
- # Confirm dataloss (i.e., inconsistent nodes)
- expect(praefect_manager.replicated?(project.id)).to be false
+ praefect_manager.wait_for_health_check_all_nodes
- # Reconcile nodes to recover from dataloss
- praefect_manager.reconcile_nodes
+ # Wait for automatic replication
praefect_manager.wait_for_replication(project.id)
- # Confirm that both commits are available after reconciliation
+ # Confirm that both commits are available
expect(project.commits.map { |commit| commit[:message].chomp })
.to include("Initial commit").and include("pushed after failover")
end
diff --git a/qa/qa/specs/features/api/3_create/merge_request/push_options_remove_source_branch_spec.rb b/qa/qa/specs/features/api/3_create/merge_request/push_options_remove_source_branch_spec.rb
index d6bd668fa8a..bf2ecfdb513 100644
--- a/qa/qa/specs/features/api/3_create/merge_request/push_options_remove_source_branch_spec.rb
+++ b/qa/qa/specs/features/api/3_create/merge_request/push_options_remove_source_branch_spec.rb
@@ -38,7 +38,11 @@ module QA
end.merge_via_api!
expect(merge_request[:state]).to eq('merged')
- expect(project).not_to have_branch(branch)
+
+ # Retry in case the branch deletion takes more time to finish
+ QA::Support::Retrier.retry_on_exception(max_attempts: 5, sleep_interval: 5) do
+ expect(project).not_to have_branch(branch)
+ end
end
end
end
diff --git a/qa/qa/specs/features/api/3_create/snippet/snippet_repository_storage_move_spec.rb b/qa/qa/specs/features/api/3_create/snippet/snippet_repository_storage_move_spec.rb
new file mode 100644
index 00000000000..4872acd1004
--- /dev/null
+++ b/qa/qa/specs/features/api/3_create/snippet/snippet_repository_storage_move_spec.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+module QA
+ RSpec.describe 'Create' do
+ describe 'Snippet repository storage', :requires_admin, :orchestrated, :repository_storage do
+ let(:source_storage) { { type: :gitaly, name: 'default' } }
+ let(:destination_storage) { { type: :gitaly, name: QA::Runtime::Env.additional_repository_storage } }
+
+ let(:snippet) do
+ Resource::Snippet.fabricate_via_api! do |snippet|
+ snippet.title = 'Snippet to move storage of'
+ snippet.file_name = 'original_file'
+ snippet.file_content = 'Original file content'
+ snippet.api_client = Runtime::API::Client.as_admin
+ end
+ end
+
+ praefect_manager = Service::PraefectManager.new
+
+ before do
+ praefect_manager.gitlab = 'gitlab'
+ end
+
+ it 'moves snippet repository from one Gitaly storage to another', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1700' do
+ expect(snippet).to have_file('original_file')
+ expect { snippet.change_repository_storage(destination_storage[:name]) }.not_to raise_error
+ expect { praefect_manager.verify_storage_move(source_storage, destination_storage) }.not_to raise_error
+
+ # verifies you can push commits to the moved snippet
+ Resource::Repository::Push.fabricate! do |push|
+ push.repository_http_uri = snippet.http_url_to_repo
+ push.file_name = 'new_file'
+ push.file_content = 'new file content'
+ push.commit_message = 'Adding a new snippet file'
+ push.new_branch = false
+ end
+
+ aggregate_failures do
+ expect(snippet).to have_file('original_file')
+ expect(snippet).to have_file('new_file')
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/specs/features/api/4_verify/.gitkeep b/qa/qa/specs/features/api/4_verify/.gitkeep
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/qa/qa/specs/features/api/4_verify/.gitkeep
diff --git a/qa/qa/specs/features/api/4_verify/pipeline_deletion_spec.rb b/qa/qa/specs/features/api/4_verify/pipeline_deletion_spec.rb
deleted file mode 100644
index 1d1b765bb9f..00000000000
--- a/qa/qa/specs/features/api/4_verify/pipeline_deletion_spec.rb
+++ /dev/null
@@ -1,82 +0,0 @@
-# frozen_string_literal: true
-
-module QA
- RSpec.describe 'Verify' do
- include Support::Api
-
- let(:api_client) { Runtime::API::Client.new(:gitlab) }
-
- describe 'Pipeline', :runner do
- let(:project) do
- Resource::Project.fabricate_via_api! do |project|
- project.name = 'project-with-pipeline'
- end
- end
-
- let!(:runner) do
- Resource::Runner.fabricate! do |runner|
- runner.project = project
- runner.name = project.name
- runner.tags = [project.name]
- end
- end
-
- let!(:ci_file) 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
- job1:
- tags:
- - #{project.name}
- script: echo 'OK'
- YAML
- }
- ]
- )
- end
- end
-
- let!(:pipeline_id) do
- pipeline_create_request = Runtime::API::Request.new(api_client, "/projects/#{project.id}/pipeline?ref=#{project.default_branch}")
- JSON.parse(post(pipeline_create_request.url, nil))['id']
- end
-
- let(:pipeline_data_request) { Runtime::API::Request.new(api_client, "/projects/#{project.id}/pipelines/#{pipeline_id}") }
-
- before do
- Support::Waiter.wait_until(sleep_interval: 3) { !pipeline.empty? && pipeline['status'] != 'pending' }
- end
-
- after do
- runner.remove_via_api!
- end
-
- context 'when deleted via API' do
- it 'is not found', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/931' do
- delete(pipeline_data_request.url)
-
- deleted_pipeline = nil
- Support::Waiter.wait_until(sleep_interval: 3) do
- deleted_pipeline = pipeline
- !pipeline.empty?
- end
-
- raise "Pipeline response does not have a 'message' key: #{deleted_pipeline}" unless deleted_pipeline&.key?('message')
-
- expect(deleted_pipeline['message'].downcase).to have_content('404 not found')
- end
- end
-
- private
-
- def pipeline
- JSON.parse(get(pipeline_data_request.url))
- end
- end
- end
-end
diff --git a/qa/qa/specs/features/browser_ui/1_manage/group/transfer_project_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/group/transfer_project_spec.rb
index 5f38907f89f..7ab5ffdf014 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/group/transfer_project_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/group/transfer_project_spec.rb
@@ -44,8 +44,7 @@ module QA
end
it 'user transfers a project between groups',
- testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/406',
- quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/283925', type: :investigating, only: :production } do
+ testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1703' do
# Retry is needed here as the target group is not avaliable for transfer right away.
QA::Support::Retrier.retry_on_exception(reload_page: page) do
Page::File::Show.perform(&:go_to_general_settings)
diff --git a/qa/qa/specs/features/browser_ui/1_manage/login/2fa_recovery_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/login/2fa_recovery_spec.rb
index e38a9f47bd6..8e03444b113 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/login/2fa_recovery_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/login/2fa_recovery_spec.rb
@@ -29,6 +29,7 @@ module QA
end
before do
+ Runtime::Feature.enable(:invite_members_group_modal, group: group)
group.add_member(developer_user, Resource::Members::AccessLevel::DEVELOPER)
end
diff --git a/qa/qa/specs/features/browser_ui/1_manage/login/log_in_with_2fa_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/login/log_in_with_2fa_spec.rb
index 2fc3ff2f18f..a8650d633c8 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/login/log_in_with_2fa_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/login/log_in_with_2fa_spec.rb
@@ -31,6 +31,7 @@ module QA
let(:two_fa_expected_text) { /The group settings for.*require you to enable Two-Factor Authentication for your account.*You need to do this before/ }
before do
+ Runtime::Feature.enable(:invite_members_group_modal, group: group)
group.add_member(developer_user, Resource::Members::AccessLevel::DEVELOPER)
end
diff --git a/qa/qa/specs/features/browser_ui/1_manage/login/register_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/login/register_spec.rb
index ffc2290b644..4141060b6cb 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/login/register_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/login/register_spec.rb
@@ -23,6 +23,7 @@ module QA
@personal_access_token = Runtime::Env.personal_access_token
Runtime::Env.personal_access_token = nil
+
ldap_username = Runtime::Env.ldap_username
Runtime::Env.ldap_username = nil
diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/add_project_member_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/add_project_member_spec.rb
index 85cfefd6c5c..bf59dcfcc4c 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/project/add_project_member_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/project/add_project_member_spec.rb
@@ -4,11 +4,7 @@ module QA
RSpec.describe 'Manage', :requires_admin do
describe 'Add project member' do
before do
- Runtime::Feature.enable('vue_project_members_list')
- end
-
- after do
- Runtime::Feature.disable('vue_project_members_list')
+ Runtime::Feature.enable(:invite_members_group_modal)
end
it 'user adds project member', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/482' do
@@ -16,9 +12,11 @@ module QA
user = Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_1, Runtime::Env.gitlab_qa_password_1)
- Resource::Project.fabricate_via_api! do |project|
+ project = Resource::Project.fabricate_via_api! do |project|
project.name = 'add-member-project'
- end.visit!
+ end
+
+ project.visit!
Page::Project::Menu.perform(&:click_members)
Page::Project::Members.perform do |members|
diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/dashboard_images_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/dashboard_images_spec.rb
index f2822e3d368..95092fe6ba6 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/project/dashboard_images_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/project/dashboard_images_spec.rb
@@ -47,7 +47,7 @@ module QA
end
end
- context 'when logged in as a new admin', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/463' do
+ context 'when logged in as a new admin', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1727' do
it_behaves_like 'loads all images' do
let(:new_user) { @new_admin }
end
diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/import_github_repo_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/import_github_repo_spec.rb
index d54ce0ac0fc..c8c483fc2aa 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
@@ -21,6 +21,7 @@ module QA
end
before do
+ Runtime::Feature.enable(:invite_members_group_modal, group: group)
group.add_member(user, Resource::Members::AccessLevel::MAINTAINER)
end
diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/protected_tags_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/protected_tags_spec.rb
index e40dde64675..714c4a2da67 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/project/protected_tags_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/project/protected_tags_spec.rb
@@ -2,7 +2,8 @@
module QA
RSpec.describe 'Manage' do
- describe 'Repository tags' do
+ # TODO: Remove :requires_admin meta when the `Runtime::Feature.enable` method call is removed
+ describe 'Repository tags', :requires_admin do
let(:project) do
Resource::Project.fabricate_via_api! do |project|
project.name = 'project-for-tags'
@@ -10,6 +11,10 @@ module QA
end
end
+ before do
+ Runtime::Feature.enable(:invite_members_group_modal, project: project)
+ end
+
let(:developer_user) { Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_1, Runtime::Env.gitlab_qa_password_1) }
let(:maintainer_user) { Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_2, Runtime::Env.gitlab_qa_password_2) }
let(:tag_name) { 'v0.0.1' }
diff --git a/qa/qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb b/qa/qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb
index f623efe5a3a..d352996f419 100644
--- a/qa/qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb
+++ b/qa/qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb
@@ -16,14 +16,10 @@ module QA
end
before do
- Runtime::Feature.enable('vue_project_members_list', project: project)
+ Runtime::Feature.enable(:invite_members_group_modal)
Flow::Login.sign_in
end
- after do
- Runtime::Feature.disable('vue_project_members_list', project: project)
- end
-
it 'is received by a user for project invitation', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/676' do
project.visit!
diff --git a/qa/qa/specs/features/browser_ui/2_plan/issue/check_mentions_for_xss_spec.rb b/qa/qa/specs/features/browser_ui/2_plan/issue/check_mentions_for_xss_spec.rb
index a7f862e8911..9129584d110 100644
--- a/qa/qa/specs/features/browser_ui/2_plan/issue/check_mentions_for_xss_spec.rb
+++ b/qa/qa/specs/features/browser_ui/2_plan/issue/check_mentions_for_xss_spec.rb
@@ -18,6 +18,8 @@ module QA
describe 'check xss occurence in @mentions in issues', :requires_admin do
before do
+ Runtime::Feature.enable(:invite_members_group_modal)
+
Flow::Login.sign_in
project.add_member(user)
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 cc815fd0e67..45222d2ec7e 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,8 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Plan', :smoke, :reliable do
+ # TODO: Remove :requires_admin meta when the `Runtime::Feature.enable` method call is removed
+ RSpec.describe 'Plan', :smoke, :reliable, :requires_admin 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
@@ -13,6 +14,7 @@ module QA
before do
Flow::Login.sign_in
+ Runtime::Feature.enable(:invite_members_group_modal, project: project)
project.add_member(user)
diff --git a/qa/qa/specs/features/browser_ui/2_plan/issue/real_time_assignee_spec.rb b/qa/qa/specs/features/browser_ui/2_plan/issue/real_time_assignee_spec.rb
index 11f93d6a97e..2654531bc2c 100644
--- a/qa/qa/specs/features/browser_ui/2_plan/issue/real_time_assignee_spec.rb
+++ b/qa/qa/specs/features/browser_ui/2_plan/issue/real_time_assignee_spec.rb
@@ -14,6 +14,7 @@ module QA
before do
Runtime::Feature.enable('real_time_issue_sidebar', project: project)
Runtime::Feature.enable('broadcast_issue_updates', project: project)
+ Runtime::Feature.enable(:invite_members_group_modal, project: project)
Flow::Login.sign_in
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 0fec7bc9e9d..734ff160937 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
@@ -107,7 +107,7 @@ module QA
def fabricate_personal_access_token
login_to_gitlab
- token = Resource::PersonalAccessToken.fabricate!.access_token
+ token = Resource::PersonalAccessToken.fabricate!.token
Page::Main::Menu.perform(&:sign_out)
token
end
diff --git a/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_merge_request_from_fork_spec.rb b/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_merge_request_from_fork_spec.rb
index d2ba97400e6..8d12042bd85 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
@@ -9,7 +9,7 @@ module QA
end
end
- it 'can merge feature branch fork to mainline', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/928' do
+ it 'can merge feature branch fork to mainline', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1701' do
Flow::Login.while_signed_in do
merge_request.visit!
diff --git a/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_when_pipeline_succeeds_spec.rb b/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_when_pipeline_succeeds_spec.rb
new file mode 100644
index 00000000000..2ddc59acd5c
--- /dev/null
+++ b/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_when_pipeline_succeeds_spec.rb
@@ -0,0 +1,84 @@
+# frozen_string_literal: true
+
+module QA
+ RSpec.describe 'Create', :runner do
+ describe 'Merge requests' do
+ let(:project) do
+ Resource::Project.fabricate_via_api! do |project|
+ project.name = 'merge-when-pipeline-succeeds'
+ project.initialize_with_readme = true
+ end
+ end
+
+ let!(:runner) do
+ Resource::Runner.fabricate! do |runner|
+ runner.project = project
+ runner.name = "runner-for-#{project.name}"
+ runner.tags = ["runner-for-#{project.name}"]
+ end
+ end
+
+ before 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: <<~EOF
+ test:
+ tags: ["runner-for-#{project.name}"]
+ script: sleep 5
+ only:
+ - merge_requests
+ EOF
+ }
+ ]
+ )
+ end
+
+ Flow::Login.sign_in
+ end
+
+ after do
+ runner&.remove_via_api!
+ project&.remove_via_api!
+ end
+
+ it 'merges when pipeline succeeds', :smoke, testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1684' do
+ branch_name = "merge-request-test-#{SecureRandom.hex(8)}"
+
+ # Create a branch that will be merged into the default branch
+ Resource::Repository::ProjectPush.fabricate! do |project_push|
+ project_push.project = project
+ project_push.new_branch = true
+ project_push.branch_name = branch_name
+ project_push.file_name = "file-#{SecureRandom.hex(8)}.txt"
+ end
+
+ # Create a merge request to merge the branch we just created
+ merge_request = Resource::MergeRequest.fabricate_via_api! do |merge_request|
+ merge_request.project = project
+ merge_request.source_branch = branch_name
+ merge_request.no_preparation = true
+ end
+
+ merge_request.visit!
+
+ Page::MergeRequest::Show.perform do |mr|
+ mr.merge_when_pipeline_succeeds!
+
+ expect(mr.merge_request_status).to match(/to be merged automatically when the pipeline succeeds/)
+
+ Support::Waiter.wait_until(sleep_interval: 5) do
+ merge_request = merge_request.reload!
+ merge_request.state == 'merged'
+ end
+
+ expect(mr.merged?).to be_truthy, "Expected content 'The changes were merged' but it did not appear."
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/specs/features/browser_ui/3_create/merge_request/rebase_merge_request_spec.rb b/qa/qa/specs/features/browser_ui/3_create/merge_request/rebase_merge_request_spec.rb
index 3414584bae3..34669eb3815 100644
--- a/qa/qa/specs/features/browser_ui/3_create/merge_request/rebase_merge_request_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/merge_request/rebase_merge_request_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Create', quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/30226', type: :bug } do
+ RSpec.describe 'Create', quarantine: { only: { subdomain: :staging }, issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/323990', type: :flaky } do
describe 'Merge request rebasing' do
it 'user rebases source branch of merge request', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1274' do
Flow::Login.sign_in
@@ -34,7 +34,7 @@ module QA
Page::MergeRequest::Show.perform do |merge_request|
expect(merge_request).to have_content('Needs rebasing')
- expect(merge_request).not_to be_fast_forward_possible
+ expect(merge_request).to be_fast_forward_not_possible
expect(merge_request).not_to have_merge_button
merge_request.rebase!
diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/clone_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/clone_spec.rb
index 9edde7ac12f..fb9e42a6960 100644
--- a/qa/qa/specs/features/browser_ui/3_create/repository/clone_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/repository/clone_spec.rb
@@ -2,7 +2,7 @@
module QA
RSpec.describe 'Create' do
- describe 'Git clone over HTTP', :ldap_no_tls do
+ describe 'Git clone over HTTP' do
let(:project) do
Resource::Project.fabricate_via_api! do |scenario|
scenario.name = 'project-with-code'
diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/move_project_create_fork_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/move_project_create_fork_spec.rb
index 7a727ffb291..0f6edca654b 100644
--- a/qa/qa/specs/features/browser_ui/3_create/repository/move_project_create_fork_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/repository/move_project_create_fork_spec.rb
@@ -19,6 +19,7 @@ module QA
end
before do
+ Runtime::Feature.enable(:invite_members_group_modal, project: parent_project)
parent_project.add_member(user)
end
diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/push_http_private_token_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/push_http_private_token_spec.rb
index 35ec2135491..2c0fb5ea290 100644
--- a/qa/qa/specs/features/browser_ui/3_create/repository/push_http_private_token_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/repository/push_http_private_token_spec.rb
@@ -2,11 +2,11 @@
module QA
RSpec.describe 'Create' do
- describe 'Git push over HTTP', :ldap_no_tls, :smoke do
+ describe 'Git push over HTTP', :smoke do
it 'user using a personal access token pushes code to the repository', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1278' do
Flow::Login.sign_in
- access_token = Resource::PersonalAccessToken.fabricate!.access_token
+ access_token = Resource::PersonalAccessToken.fabricate!.token
user = Resource::User.new.tap do |user|
user.username = Runtime::User.username
diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/push_over_http_file_size_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/push_over_http_file_size_spec.rb
index 222eb3771ad..1423e3c45ce 100644
--- a/qa/qa/specs/features/browser_ui/3_create/repository/push_over_http_file_size_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/repository/push_over_http_file_size_spec.rb
@@ -17,7 +17,7 @@ module QA
p.initialize_with_readme = true
end
- @api_client = Runtime::API::Client.new(:gitlab, personal_access_token: Runtime::Env.admin_personal_access_token)
+ @api_client = Runtime::API::Client.as_admin
end
after(:context) do
diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/push_over_http_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/push_over_http_spec.rb
index cf14017b7f1..861efa8b45a 100644
--- a/qa/qa/specs/features/browser_ui/3_create/repository/push_over_http_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/repository/push_over_http_spec.rb
@@ -2,8 +2,8 @@
module QA
RSpec.describe 'Create' do
- describe 'Git push over HTTP', :ldap_no_tls do
- it 'user pushes code to the repository', :smoke, testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/426' do
+ describe 'Git push over HTTP' do
+ it 'user pushes code to the repository', :smoke, testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1702' do
Flow::Login.sign_in
Resource::Repository::ProjectPush.fabricate! do |push|
diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/push_over_ssh_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/push_over_ssh_spec.rb
index c56e6d1267c..9eeb762e548 100644
--- a/qa/qa/specs/features/browser_ui/3_create/repository/push_over_ssh_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/repository/push_over_ssh_spec.rb
@@ -41,8 +41,7 @@ module QA
end
end
- it 'pushes multiple branches and tags together', :smoke, testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1679
- ' do
+ it 'pushes multiple branches and tags together', :smoke, testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1679' do
branches = []
tags = []
Git::Repository.perform do |repository|
diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/push_protected_branch_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/push_protected_branch_spec.rb
index 2b249f779d9..ce7fdf379a4 100644
--- a/qa/qa/specs/features/browser_ui/3_create/repository/push_protected_branch_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/repository/push_protected_branch_spec.rb
@@ -2,7 +2,7 @@
module QA
RSpec.describe 'Create' do
- describe 'Protected branch support', :ldap_no_tls do
+ describe 'Protected branch support' do
let(:branch_name) { 'protected-branch' }
let(:commit_message) { 'Protected push commit message' }
let(:project) do
diff --git a/qa/qa/specs/features/browser_ui/3_create/snippet/add_comment_to_snippet_spec.rb b/qa/qa/specs/features/browser_ui/3_create/snippet/add_comment_to_snippet_spec.rb
index a867d9cb973..6ab50ba56f2 100644
--- a/qa/qa/specs/features/browser_ui/3_create/snippet/add_comment_to_snippet_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/snippet/add_comment_to_snippet_spec.rb
@@ -23,6 +23,11 @@ module QA
Flow::Login.sign_in
end
+ after do
+ personal_snippet&.remove_via_api!
+ project_snippet&.remove_via_api!
+ end
+
shared_examples 'comments on snippets' do |snippet_type|
it "adds, edits, and deletes a comment on a #{snippet_type}" do
send(snippet_type)
diff --git a/qa/qa/specs/features/browser_ui/3_create/snippet/add_file_to_snippet_spec.rb b/qa/qa/specs/features/browser_ui/3_create/snippet/add_file_to_snippet_spec.rb
index 604c98ca21e..72d83eadde9 100644
--- a/qa/qa/specs/features/browser_ui/3_create/snippet/add_file_to_snippet_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/snippet/add_file_to_snippet_spec.rb
@@ -2,7 +2,7 @@
module QA
RSpec.describe 'Create' do
- describe 'Multiple file snippet', quarantine: { only: { pipeline: :master }, issue: 'https://gitlab.com/gitlab-org/gitaly/-/issues/3143', type: :bug } do
+ describe 'Multiple file snippet' do
let(:personal_snippet) do
Resource::Snippet.fabricate_via_api! do |snippet|
snippet.title = 'Personal snippet to add file to'
@@ -23,6 +23,11 @@ module QA
Flow::Login.sign_in
end
+ after do
+ personal_snippet&.remove_via_api!
+ project_snippet&.remove_via_api!
+ end
+
shared_examples 'adding file to snippet' do |snippet_type|
it "adds second file to an existing #{snippet_type} to make it multi-file" do
send(snippet_type).visit!
diff --git a/qa/qa/specs/features/browser_ui/3_create/snippet/clone_push_pull_personal_snippet_spec.rb b/qa/qa/specs/features/browser_ui/3_create/snippet/clone_push_pull_personal_snippet_spec.rb
index 2940b2067a1..d44f5bc9e2e 100644
--- a/qa/qa/specs/features/browser_ui/3_create/snippet/clone_push_pull_personal_snippet_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/snippet/clone_push_pull_personal_snippet_spec.rb
@@ -2,7 +2,7 @@
module QA
RSpec.describe 'Create' do
- describe 'Version control for personal snippets', quarantine: { only: { pipeline: :master }, issue: 'https://gitlab.com/gitlab-org/gitaly/-/issues/3143', type: :bug } do
+ describe 'Version control for personal snippets' do
let(:new_file) { 'new_snippet_file' }
let(:changed_content) { 'changes' }
let(:commit_message) { 'Changes to snippets' }
@@ -66,6 +66,8 @@ module QA
expect(repository.commits.first).to include('Update snippet')
expect(repository.file_content(new_file)).to include("#{added_content}#{changed_content}")
end
+
+ snippet.remove_via_api!
end
it 'clones, pushes, and pulls a snippet over SSH, deletes via UI', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/825' do
diff --git a/qa/qa/specs/features/browser_ui/3_create/snippet/clone_push_pull_project_snippet_spec.rb b/qa/qa/specs/features/browser_ui/3_create/snippet/clone_push_pull_project_snippet_spec.rb
index b91424d5b65..b67e0e54aa0 100644
--- a/qa/qa/specs/features/browser_ui/3_create/snippet/clone_push_pull_project_snippet_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/snippet/clone_push_pull_project_snippet_spec.rb
@@ -2,7 +2,7 @@
module QA
RSpec.describe 'Create' do
- describe 'Version control for project snippets', quarantine: { only: { pipeline: :master }, issue: 'https://gitlab.com/gitlab-org/gitaly/-/issues/3143', type: :bug } do
+ describe 'Version control for project snippets' do
let(:new_file) { 'new_snippet_file' }
let(:changed_content) { 'changes' }
let(:commit_message) { 'Changes to snippets' }
@@ -40,7 +40,7 @@ module QA
ssh_key.remove_via_api!
end
- it 'clones, pushes, and pulls a project snippet over HTTP, edits via UI', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/833' do
+ it 'clones, pushes, and pulls a project snippet over HTTP, edits via UI', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1725' do
Resource::Repository::Push.fabricate! do |push|
push.repository_http_uri = repository_uri_http
push.file_name = new_file
@@ -67,6 +67,8 @@ module QA
expect(repository.commits.first).to include 'Update snippet'
expect(repository.file_content(new_file)).to include "#{added_content}#{changed_content}"
end
+
+ snippet.remove_via_api!
end
it 'clones, pushes, and pulls a project snippet over SSH, deletes via UI', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/832' do
diff --git a/qa/qa/specs/features/browser_ui/3_create/snippet/copy_snippet_file_contents_spec.rb b/qa/qa/specs/features/browser_ui/3_create/snippet/copy_snippet_file_contents_spec.rb
index 1670ba56064..29ddbb22a01 100644
--- a/qa/qa/specs/features/browser_ui/3_create/snippet/copy_snippet_file_contents_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/snippet/copy_snippet_file_contents_spec.rb
@@ -54,6 +54,11 @@ module QA
Flow::Login.sign_in
end
+ after do
+ personal_snippet&.remove_via_api!
+ project_snippet&.remove_via_api!
+ end
+
shared_examples 'copying snippet file contents' do |snippet_type|
it "copies file contents of a multi-file #{snippet_type} to a comment and verifies them" do
send(snippet_type).visit!
diff --git a/qa/qa/specs/features/browser_ui/3_create/snippet/create_personal_snippet_spec.rb b/qa/qa/specs/features/browser_ui/3_create/snippet/create_personal_snippet_spec.rb
index b74f27389a0..ddbc98c4a1a 100644
--- a/qa/qa/specs/features/browser_ui/3_create/snippet/create_personal_snippet_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/snippet/create_personal_snippet_spec.rb
@@ -3,7 +3,7 @@
module QA
RSpec.describe 'Create', :smoke do
describe 'Personal snippet creation' do
- it 'user creates a personal snippet', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/840' do
+ it 'user creates a personal snippet', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1704' do
Flow::Login.sign_in
Page::Main::Menu.perform do |menu|
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 5c0983dabb6..014c0ca4d48 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', quarantine: { only: { pipeline: :master }, issue: 'https://gitlab.com/gitlab-org/gitaly/-/issues/3143', type: :bug } do
+ describe 'Multiple file snippet' do
let(:personal_snippet) do
Resource::Snippet.fabricate_via_api! do |snippet|
snippet.title = 'Personal snippet to delete file from'
@@ -31,6 +31,11 @@ module QA
Flow::Login.sign_in
end
+ after do
+ personal_snippet&.remove_via_api!
+ project_snippet&.remove_via_api!
+ end
+
shared_examples 'deleting file from snippet' do |snippet_type|
it "deletes second file from an existing #{snippet_type} to make it single-file" do
send(snippet_type).visit!
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 751424222ba..3973e0aacad 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
@@ -16,6 +16,10 @@ module QA
Flow::Login.sign_in
end
+ after do
+ snippet&.remove_via_api!
+ end
+
context 'when the snippet is public' do
it 'can be shared with not signed-in users', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1016' do
snippet.visit!
diff --git a/qa/qa/specs/features/browser_ui/5_package/container_registry_spec.rb b/qa/qa/specs/features/browser_ui/5_package/container_registry_spec.rb
new file mode 100644
index 00000000000..5e663d87ae3
--- /dev/null
+++ b/qa/qa/specs/features/browser_ui/5_package/container_registry_spec.rb
@@ -0,0 +1,77 @@
+# frozen_string_literal: true
+
+module QA
+ RSpec.describe 'Package', :orchestrated do
+ describe 'Container Registry', only: { subdomain: :staging } do
+ let(:project) do
+ Resource::Project.fabricate_via_api! do |project|
+ project.name = 'project-with-registry'
+ project.template_name = 'express'
+ end
+ end
+
+ let(:registry_repository) do
+ Resource::RegistryRepository.fabricate! do |repository|
+ repository.name = "#{project.path_with_namespace}"
+ repository.project = project
+ end
+ end
+
+ let!(:gitlab_ci_yaml) do
+ <<~YAML
+ build:
+ image: docker:19.03.12
+ stage: build
+ services:
+ - docker:19.03.12-dind
+ variables:
+ IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
+ script:
+ - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
+ - docker build -t $IMAGE_TAG .
+ - docker push $IMAGE_TAG
+ YAML
+ end
+
+ after do
+ registry_repository&.remove_via_api!
+ end
+
+ it 'pushes project image to the container registry and deletes tag', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1699' do
+ Flow::Login.sign_in
+ project.visit!
+
+ 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: gitlab_ci_yaml
+ }])
+ end
+
+ Flow::Pipeline.visit_latest_pipeline
+
+ Page::Project::Pipeline::Show.perform do |pipeline|
+ pipeline.click_job('build')
+ end
+
+ Page::Project::Job::Show.perform do |job|
+ expect(job).to be_successful(timeout: 800)
+ end
+
+ Page::Project::Menu.perform(&:go_to_container_registry)
+
+ Page::Project::Registry::Show.perform do |registry|
+ expect(registry).to have_registry_repository(registry_repository.name)
+
+ registry.click_on_image(registry_repository.name)
+ expect(registry).to have_tag('master')
+
+ registry.click_delete
+ expect(registry).not_to have_tag('master')
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/specs/features/browser_ui/5_package/maven_gradle_repository_spec.rb b/qa/qa/specs/features/browser_ui/5_package/maven_gradle_repository_spec.rb
index 6ab4a957c57..b5b050a5dfe 100644
--- a/qa/qa/specs/features/browser_ui/5_package/maven_gradle_repository_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/maven_gradle_repository_spec.rb
@@ -13,7 +13,7 @@ module QA
Flow::Login.sign_in
end
- Resource::PersonalAccessToken.fabricate!.access_token
+ Resource::PersonalAccessToken.fabricate!.token
end
let(:project) do
diff --git a/qa/qa/specs/features/browser_ui/5_package/maven_repository_spec.rb b/qa/qa/specs/features/browser_ui/5_package/maven_repository_spec.rb
index 605248e33f7..2f508d00790 100644
--- a/qa/qa/specs/features/browser_ui/5_package/maven_repository_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/maven_repository_spec.rb
@@ -1,19 +1,21 @@
# frozen_string_literal: true
+require 'securerandom'
+
module QA
RSpec.describe 'Package', :orchestrated, :packages do
describe 'Maven Repository' do
include Runtime::Fixtures
let(:group_id) { 'com.gitlab.qa' }
- let(:artifact_id) { 'maven' }
+ let(:artifact_id) { "maven-#{SecureRandom.hex(8)}" }
let(:package_name) { "#{group_id}/#{artifact_id}".tr('.', '/') }
let(:auth_token) do
unless Page::Main::Menu.perform(&:signed_in?)
Flow::Login.sign_in
end
- Resource::PersonalAccessToken.fabricate!.access_token
+ Resource::PersonalAccessToken.fabricate!.token
end
let(:project) do
@@ -22,12 +24,19 @@ module QA
end
end
+ let(:another_project) do
+ Resource::Project.fabricate_via_api! do |another_project|
+ another_project.name = 'another-maven-package-project'
+ another_project.group = project.group
+ end
+ end
+
let!(:runner) do
Resource::Runner.fabricate! do |runner|
runner.name = "qa-runner-#{Time.now.to_i}"
- runner.tags = ["runner-for-#{project.name}"]
+ runner.tags = ["runner-for-#{project.group.name}"]
runner.executor = :docker
- runner.project = project
+ runner.token = project.group.sandbox.runners_token
end
end
@@ -90,6 +99,28 @@ module QA
}
end
+ let(:gitlab_ci_yaml) do
+ {
+ file_path: '.gitlab-ci.yml',
+ content:
+ <<~YAML
+ deploy:
+ image: maven:3.6-jdk-11
+ script:
+ - 'mvn deploy -s settings.xml'
+ - "mvn dependency:get -Dartifact=#{group_id}:#{artifact_id}:1.0"
+ only:
+ - "#{project.default_branch}"
+ tags:
+ - "runner-for-#{project.group.name}"
+ YAML
+ }
+ end
+
+ after do
+ runner.remove_via_api!
+ end
+
it 'publishes a maven package and deletes it', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/943' do
# Use a maven docker container to deploy the package
with_fixtures([pom_xml, settings_xml]) do |dir|
@@ -122,23 +153,9 @@ module QA
commit.project = project
commit.commit_message = 'Add .gitlab-ci.yml'
commit.add_files([
- {
- file_path: '.gitlab-ci.yml',
- content:
- <<~YAML
- deploy:
- image: maven:3.6-jdk-11
- script:
- - 'mvn deploy -s settings.xml'
- - "mvn dependency:get -Dartifact=#{group_id}:#{artifact_id}:1.0"
- only:
- - "#{project.default_branch}"
- tags:
- - "runner-for-#{project.name}"
- YAML
- },
- settings_xml,
- pom_xml
+ gitlab_ci_yaml,
+ settings_xml,
+ pom_xml
])
end
@@ -153,6 +170,96 @@ module QA
expect(job).to be_successful(timeout: 800)
end
end
+
+ context 'when "allow duplicate" setting is disabled' do
+ before do
+ Flow::Login.sign_in
+
+ project.group.visit!
+
+ Page::Group::Menu.perform(&:go_to_package_settings)
+ Page::Group::Settings::PackageRegistries.perform(&:set_allow_duplicates_disabled)
+ end
+
+ it 'prevents users from publishing duplicate Maven packages at the group level', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1717' do
+ with_fixtures([pom_xml, settings_xml]) do |dir|
+ Service::DockerRun::Maven.new(dir).publish!
+ end
+
+ project.visit!
+ Page::Project::Menu.perform(&:click_packages_link)
+
+ Page::Project::Packages::Index.perform do |index|
+ expect(index).to have_package(package_name)
+ end
+
+ Resource::Repository::Commit.fabricate_via_api! do |commit|
+ commit.project = another_project
+ commit.commit_message = 'Add .gitlab-ci.yml'
+ commit.add_files([
+ gitlab_ci_yaml,
+ settings_xml,
+ pom_xml
+ ])
+ end
+
+ another_project.visit!
+ Flow::Pipeline.visit_latest_pipeline
+
+ Page::Project::Pipeline::Show.perform do |pipeline|
+ pipeline.click_job('deploy')
+ end
+
+ Page::Project::Job::Show.perform do |job|
+ expect(job).not_to be_successful(timeout: 800)
+ end
+ end
+ end
+
+ context 'when "allow duplicate" setting is enabled' do
+ before do
+ Flow::Login.sign_in
+
+ project.group.visit!
+
+ Page::Group::Menu.perform(&:go_to_package_settings)
+ Page::Group::Settings::PackageRegistries.perform(&:set_allow_duplicates_enabled)
+ end
+
+ it 'allows users to publish duplicate Maven packages at the group level', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1722' do
+ with_fixtures([pom_xml, settings_xml]) do |dir|
+ Service::DockerRun::Maven.new(dir).publish!
+ end
+
+ project.visit!
+ Page::Project::Menu.perform(&:click_packages_link)
+
+ Page::Project::Packages::Index.perform do |index|
+ expect(index).to have_package(package_name)
+ end
+
+ Resource::Repository::Commit.fabricate_via_api! do |commit|
+ commit.project = another_project
+ commit.commit_message = 'Add .gitlab-ci.yml'
+ commit.add_files([
+ gitlab_ci_yaml,
+ settings_xml,
+ pom_xml
+ ])
+ end
+
+ another_project.visit!
+ Flow::Pipeline.visit_latest_pipeline
+
+ Page::Project::Pipeline::Show.perform do |pipeline|
+ pipeline.click_job('deploy')
+ end
+
+ Page::Project::Job::Show.perform do |job|
+ expect(job).to be_successful(timeout: 800)
+ end
+ end
+ end
end
end
end
diff --git a/qa/qa/specs/features/browser_ui/5_package/npm_registry_spec.rb b/qa/qa/specs/features/browser_ui/5_package/npm_registry_spec.rb
index fa88ace1556..97df8fedf87 100644
--- a/qa/qa/specs/features/browser_ui/5_package/npm_registry_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/npm_registry_spec.rb
@@ -2,7 +2,7 @@
module QA
RSpec.describe 'Package', :orchestrated, :packages do
- describe 'NPM registry' do
+ describe 'npm registry' do
include Runtime::Fixtures
let(:registry_scope) { project.group.sandbox.path }
@@ -12,7 +12,7 @@ module QA
Flow::Login.sign_in
end
- Resource::PersonalAccessToken.fabricate!.access_token
+ Resource::PersonalAccessToken.fabricate!.token
end
let(:project) do
@@ -31,7 +31,7 @@ module QA
{
"name": "#{package_name}",
"version": "1.0.0",
- "description": "Example package for GitLab NPM registry",
+ "description": "Example package for GitLab npm registry",
"publishConfig": {
"@#{registry_scope}:registry": "#{gitlab_address_with_port}/api/v4/projects/#{project.id}/packages/npm/"
}
diff --git a/qa/qa/specs/features/browser_ui/5_package/nuget_repository_spec.rb b/qa/qa/specs/features/browser_ui/5_package/nuget_repository_spec.rb
index 8c3f0930207..f143bc52095 100644
--- a/qa/qa/specs/features/browser_ui/5_package/nuget_repository_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/nuget_repository_spec.rb
@@ -1,11 +1,13 @@
# frozen_string_literal: true
+require 'securerandom'
+
module QA
RSpec.describe 'Package', :orchestrated, :packages do
describe 'NuGet Repository' do
include Runtime::Fixtures
- let(:package_name) { 'dotnetcore' }
+ let(:package_name) { "dotnetcore-#{SecureRandom.hex(8)}" }
let(:project) do
Resource::Project.fabricate_via_api! do |project|
project.name = 'nuget-package-project'
@@ -54,7 +56,7 @@ module QA
{
file_path: '.gitlab-ci.yml',
content: <<~YAML
- image: mcr.microsoft.com/dotnet/core/sdk:3.1
+ image: mcr.microsoft.com/dotnet/sdk:5.0
stages:
- deploy
@@ -64,7 +66,7 @@ module QA
script:
- dotnet restore -p:Configuration=Release
- dotnet build -c Release
- - dotnet pack -c Release
+ - dotnet pack -c Release -p:PackageID=#{package_name}
- dotnet nuget add source "$CI_SERVER_URL/api/v4/projects/$CI_PROJECT_ID/packages/nuget/index.json" --name gitlab --username gitlab-ci-token --password $CI_JOB_TOKEN --store-password-in-clear-text
- dotnet nuget push "bin/Release/*.nupkg" --source gitlab
only:
@@ -102,7 +104,7 @@ module QA
<PropertyGroup>
<OutputType>Exe</OutputType>
- <TargetFramework>netcoreapp3.1</TargetFramework>
+ <TargetFramework>net5.0</TargetFramework>
</PropertyGroup>
</Project>
@@ -115,7 +117,7 @@ module QA
{
file_path: '.gitlab-ci.yml',
content: <<~YAML
- image: mcr.microsoft.com/dotnet/core/sdk:3.1
+ image: mcr.microsoft.com/dotnet/sdk:5.0
stages:
- install
diff --git a/qa/qa/specs/features/browser_ui/7_configure/auto_devops/create_project_with_auto_devops_spec.rb b/qa/qa/specs/features/browser_ui/7_configure/auto_devops/create_project_with_auto_devops_spec.rb
index 171a4776eaf..e2cf5c5b195 100644
--- a/qa/qa/specs/features/browser_ui/7_configure/auto_devops/create_project_with_auto_devops_spec.rb
+++ b/qa/qa/specs/features/browser_ui/7_configure/auto_devops/create_project_with_auto_devops_spec.rb
@@ -23,9 +23,7 @@ module QA
cluster&.remove!
end
- it 'runs auto devops', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/702' do
- skip('Test requires tunnel: see https://gitlab.com/gitlab-org/gitlab/-/issues/251090')
-
+ it 'runs auto devops', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1715' do
Flow::Login.sign_in
# Set an application secret CI variable (prefixed with K8S_SECRET_)
diff --git a/qa/qa/specs/features/browser_ui/non_devops/performance_bar_spec.rb b/qa/qa/specs/features/browser_ui/non_devops/performance_bar_spec.rb
index 8dca0d6698e..302fec55c53 100644
--- a/qa/qa/specs/features/browser_ui/non_devops/performance_bar_spec.rb
+++ b/qa/qa/specs/features/browser_ui/non_devops/performance_bar_spec.rb
@@ -20,7 +20,7 @@ module QA
end
end
- it 'shows results for the original request and AJAX requests', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/478', quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/247467', type: :investigating } do
+ it 'shows results for the original request and AJAX requests', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/478', quarantine: { only: { pipeline: :master }, issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/323051', type: :bug } do
# Issue pages always make AJAX requests
Resource::Issue.fabricate_via_browser_ui! do |issue|
issue.title = 'Performance bar test'
diff --git a/qa/qa/support/api.rb b/qa/qa/support/api.rb
index 5fc36b68e5c..de9da3171b0 100644
--- a/qa/qa/support/api.rb
+++ b/qa/qa/support/api.rb
@@ -9,6 +9,7 @@ module QA
HTTP_STATUS_CREATED = 201
HTTP_STATUS_NO_CONTENT = 204
HTTP_STATUS_ACCEPTED = 202
+ HTTP_STATUS_NOT_FOUND = 404
HTTP_STATUS_SERVER_ERROR = 500
def post(url, payload, args = {})
diff --git a/qa/qa/tools/initialize_gitlab_auth.rb b/qa/qa/tools/initialize_gitlab_auth.rb
index b06ddcab040..3ead8fc9bd4 100644
--- a/qa/qa/tools/initialize_gitlab_auth.rb
+++ b/qa/qa/tools/initialize_gitlab_auth.rb
@@ -23,7 +23,7 @@ module QA
Flow::Login.sign_in
puts "Creating an API scoped access token for the root user..."
- puts "Token: #{Resource::PersonalAccessToken.fabricate!.access_token}"
+ puts "Token: #{Resource::PersonalAccessToken.fabricate!.token}"
end
end
end
diff --git a/qa/spec/runtime/api/client_spec.rb b/qa/spec/runtime/api/client_spec.rb
index dd139fda980..36ee563de39 100644
--- a/qa/spec/runtime/api/client_spec.rb
+++ b/qa/spec/runtime/api/client_spec.rb
@@ -60,7 +60,7 @@ RSpec.describe QA::Runtime::API::Client do
end
it 'returns a created token' do
- client = described_class.new(user: { username: 'foo' })
+ client = described_class.new(user: Struct.new(:username, :admin?).new('foo', false))
expect(client).to receive(:create_personal_access_token).and_return('created_token')
diff --git a/qa/spec/runtime/env_spec.rb b/qa/spec/runtime/env_spec.rb
index 3396ae6f0b8..5a98721466f 100644
--- a/qa/spec/runtime/env_spec.rb
+++ b/qa/spec/runtime/env_spec.rb
@@ -232,6 +232,7 @@ RSpec.describe QA::Runtime::Env do
describe '.require_admin_access_token!' do
it 'raises ArgumentError if GITLAB_QA_ADMIN_ACCESS_TOKEN is not specified' do
+ described_class.instance_variable_set(:@admin_personal_access_token, nil)
stub_env('GITLAB_QA_ADMIN_ACCESS_TOKEN', nil)
expect { described_class.require_admin_access_token! }.to raise_error(ArgumentError)
diff --git a/qa/spec/specs/helpers/quarantine_spec.rb b/qa/spec/specs/helpers/quarantine_spec.rb
index 80fd65faeed..694c320ce3d 100644
--- a/qa/spec/specs/helpers/quarantine_spec.rb
+++ b/qa/spec/specs/helpers/quarantine_spec.rb
@@ -15,7 +15,7 @@ end
# expanding into the global state
# See: https://github.com/rspec/rspec-core/issues/2603
def describe_successfully(*args, &describe_body)
- example_group = RSpec.describe(*args, &describe_body)
+ example_group = RSpec.describe(*args, &describe_body)
ran_successfully = example_group.run RaiseOnFailuresReporter
expect(ran_successfully).to eq true
example_group
@@ -156,28 +156,51 @@ RSpec.describe QA::Specs::Helpers::Quarantine do
described_class.configure_rspec
end
- it 'is skipped when set on contexts or descriptions' do
- group = describe_successfully 'Quarantined in staging', quarantine: { only: { subdomain: :staging } } do
- it('runs in staging') {}
+ context 'no pipeline specified' do
+ it 'is skipped when set on contexts or descriptions' do
+ group = describe_successfully 'Quarantined in staging', quarantine: { only: { subdomain: :staging } } do
+ it('runs in staging') {}
+ end
+
+ expect(group.examples.first.execution_result.status).to eq(:pending)
+ expect(group.examples.first.execution_result.pending_message)
+ .to eq('In quarantine')
end
- expect(group.examples.first.execution_result.status).to eq(:pending)
- expect(group.examples.first.execution_result.pending_message)
- .to eq('In quarantine')
+ it 'is skipped only in staging' do
+ group = describe_successfully do
+ it('skipped in staging', quarantine: { only: { subdomain: :staging } }) {}
+ it('runs in staging', quarantine: { only: :production }) {}
+ it('skipped in staging also', quarantine: { only: { subdomain: %i[release staging] } }) {}
+ it('runs in any env') {}
+ end
+
+ expect(group.examples[0].execution_result.status).to eq(:pending)
+ expect(group.examples[1].execution_result.status).to eq(:passed)
+ expect(group.examples[2].execution_result.status).to eq(:pending)
+ expect(group.examples[3].execution_result.status).to eq(:passed)
+ end
end
- it 'is skipped only in staging' do
- group = describe_successfully do
- it('skipped in staging', quarantine: { only: { subdomain: :staging } }) {}
- it('runs in staging', quarantine: { only: :production }) {}
- it('skipped in staging also', quarantine: { only: { subdomain: %i[release staging] } }) {}
- it('runs in any env') {}
+ context 'multiple pipelines specified' do
+ shared_examples 'skipped in project' do |project|
+ before do
+ stub_env('CI_PROJECT_NAME', project)
+ described_class.configure_rspec
+ end
+
+ it "is skipped in #{project}" do
+ group = describe_successfully do
+ it('does not run in specified projects', quarantine: { only: { pipeline: [:staging, :canary, :production] } }) {}
+ end
+
+ expect(group.examples[0].execution_result.status).to eq(:pending)
+ end
end
- expect(group.examples[0].execution_result.status).to eq(:pending)
- expect(group.examples[1].execution_result.status).to eq(:passed)
- expect(group.examples[2].execution_result.status).to eq(:pending)
- expect(group.examples[3].execution_result.status).to eq(:passed)
+ it_behaves_like 'skipped in project', 'STAGING'
+ it_behaves_like 'skipped in project', 'CANARY'
+ it_behaves_like 'skipped in project', 'PRODUCTION'
end
end
@@ -368,8 +391,8 @@ RSpec.describe QA::Specs::Helpers::Quarantine do
it 'runs on a custom environment' do
group = describe_successfully do
- it('runs on release gitlab net', only: { tld: '.net', subdomain: :release, domain: 'gitlab' } ) {}
- it('does not run on release', only: :production ) {}
+ it('runs on release gitlab net', only: { tld: '.net', subdomain: :release, domain: 'gitlab' }) {}
+ it('does not run on release', only: :production) {}
end
expect(group.examples.first.execution_result.status).to eq(:passed)
@@ -384,7 +407,7 @@ RSpec.describe QA::Specs::Helpers::Quarantine do
it 'runs on production' do
group = describe_successfully do
- it('runs on prod', only: :production ) {}
+ it('runs on prod', only: :production) {}
it('does not run in prod', only: { subdomain: :staging }) {}
it('runs in prod and staging', only: { subdomain: /(staging.)?/, domain: 'gitlab' }) {}
end
@@ -412,7 +435,7 @@ RSpec.describe QA::Specs::Helpers::Quarantine do
it 'runs on any pipeline' do
group = describe_successfully do
- it('runs given a single named pipeline', only: { pipeline: :nightly } ) {}
+ it('runs given a single named pipeline', only: { pipeline: :nightly }) {}
it('runs given an array of pipelines', only: { pipeline: [:canary, :not_nightly] }) {}
end
@@ -431,9 +454,9 @@ RSpec.describe QA::Specs::Helpers::Quarantine do
it 'runs on default branch pipelines' do
group = describe_successfully do
- it('runs on master pipeline given a single pipeline', only: { pipeline: :master } ) {}
+ it('runs on master pipeline given a single pipeline', only: { pipeline: :master }) {}
it('runs in master given an array of pipelines', only: { pipeline: [:canary, :master] }) {}
- it('does not run in non-default pipelines', only: { pipeline: [:nightly, :not_nightly, :not_master] } ) {}
+ it('does not run in non-default pipelines', only: { pipeline: [:nightly, :not_nightly, :not_master] }) {}
end
aggregate_failures do
@@ -452,8 +475,8 @@ RSpec.describe QA::Specs::Helpers::Quarantine do
it 'runs on designated pipeline' do
group = describe_successfully do
- it('runs on nightly', only: { pipeline: :nightly } ) {}
- it('does not run in not_nightly', only: { pipeline: :not_nightly } ) {}
+ it('runs on nightly', only: { pipeline: :nightly }) {}
+ it('does not run in not_nightly', only: { pipeline: :not_nightly }) {}
it('runs on nightly given an array', only: { pipeline: [:canary, :nightly] }) {}
it('does not run in not_nightly given an array', only: { pipeline: [:not_nightly, :canary] }) {}
end
diff --git a/qa/spec/support/matchers/have_matcher.rb b/qa/spec/support/matchers/have_matcher.rb
index 43ae27f8796..81288b97e6f 100644
--- a/qa/spec/support/matchers/have_matcher.rb
+++ b/qa/spec/support/matchers/have_matcher.rb
@@ -15,6 +15,7 @@ module Matchers
pipeline
related_issue_item
snippet_description
+ tag
].each do |predicate|
RSpec::Matchers.define "have_#{predicate}" do |*args, **kwargs|
match do |page_object|
diff --git a/qa/tls_certificates/authority/ca.crt b/qa/tls_certificates/authority/ca.crt
new file mode 100644
index 00000000000..8812d718ede
--- /dev/null
+++ b/qa/tls_certificates/authority/ca.crt
@@ -0,0 +1,32 @@
+-----BEGIN CERTIFICATE-----
+MIIFizCCA3OgAwIBAgIUJBX+SiNuqUYjf33EuMObynTcKx0wDQYJKoZIhvcNAQEL
+BQAwVTELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcM
+DVNhbiBGcmFuY2lzY28xGTAXBgNVBAoMEEdpdExhYiBBdXRob3JpdHkwHhcNMjEw
+MjExMDYyMTUzWhcNMzEwMjA5MDYyMTUzWjBVMQswCQYDVQQGEwJVUzETMBEGA1UE
+CAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzEZMBcGA1UECgwQ
+R2l0TGFiIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
+ALxpL/dfJwhIWGYK93ovIVj+gqvJI58Sga7eWlp2LpuFQZETjJBA79R0gcwr42ph
+ch1BuxoxkYizM8sqIyFa5aW8SCWmO+IQzedKWZv+UWZg6pG+Fzyp6GO1wmXZdeXw
+xRiXp2qV+rqA8DaL2g1c2u6TB/mcfNTrfsSP3045yQW+4mdNx/g4wBf0dMpHe5DJ
+5jIvowa2O0kesq1UQ1eM9IMNSwW8fMQenV+F41LWE1NO726ksglih9TQjAIrlX6I
+XVmw0lgYegt2G+YQJ68nf2UmvK+C0KqzTZgqmzNMQnuSiJXMnlZvlgdLXTyTWCuq
+tyxp3+Z2Wshk/Cghic2MCm2XwWBIqYGu+20qoPM61c3Rk5++2VOcajD1yCYxVtM2
+akVP/e9arlCdi/CtJh3qvOlj9Uhs6a1UR/ZngpPLOa3r4JazZc04pK7q3ZynmoUL
+oDPF9AKOikvhYKxTYsgZ65VhI3myTBjQFk9qX++z2HF9UImGblqUtckn3eIoI8n2
+wd4pO/OFeFSXpR7jMywCwXTpC8yTTbuVzHEz8H83/qtsbjtw961g4kb8Vzh1zy73
+PFiJNI7hZlP1I5dqNTOAv+GnwiSnF28i7xbdkIfmjYqwcwGhAO7rjifq8ygBH3sF
+0I/6dnw4BvNlSgSJlJ1+2eH1uiaikpuOGtQAttz536dNAgMBAAGjUzBRMB0GA1Ud
+DgQWBBQSNZ46Xu4rfGVIPIQJpduWHJ+AQjAfBgNVHSMEGDAWgBQSNZ46Xu4rfGVI
+PIQJpduWHJ+AQjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4ICAQC1
+4REbDKF1tdYeCxpmQHXLHu7OkrgKIea6eKxf8mI+ZsJA4iNr3aiZYU5Wm+uAq3mK
+x6mrQRaqoo6JNbie5Tw8fU2c71EO4t3vwB7YOsBtcV0YrMtg316UE0lk+6kL0TRD
+tV7dAGCB3wXZVLPolC26/kecc258p6h4rCJ8Gi6FsIKGBisTFk3QOdLG3DQNulPF
+2bZaJjs/6HqLL+QMdChUfJP3i71LdNxzwXNPbjJ3fm5f9RNeOcWo6oI2fkQArl2i
+vcP/QtuqeOoJusbeL9zaF/EFlOggjkEtzFWCB05d6J7dMKYp5Lg4eMZQHPw6ycdk
+Ek/XTupvBk+8UiXeHLvX6II9zww9+gm3uycPiO/CSPNw4yQBPPGW+30WznbedsuY
+m79rxuq50KYvseJSPv7lw8v77ajQbRQzFi4frAFR+A1g8FArLxdpIptI9E+ekmaB
+UMhCmi17mEuBtj8Hc3VrokTFtAJV6YNIk1X+Q/zLh4TaR5mm6C/82j/ZvkSm5OX7
+TfaayRWDr7AfDKeG5Amt52BmYncsPUXnOofSz5UkqpeOWr0rKn+A7f2BeUP9R2nY
+6DncxYA+yOgU7RpnMBscsW6SkVIMJKFrfeZ1SbvZGRJd4L1PwfeaU+3yEG6oAfMa
+CFquw23nWhjvUlnCe9BaUiEtOJ2ruGjdu2sdvXPcnw==
+-----END CERTIFICATE-----
diff --git a/qa/tls_certificates/authority/ca.key b/qa/tls_certificates/authority/ca.key
new file mode 100644
index 00000000000..b465551e841
--- /dev/null
+++ b/qa/tls_certificates/authority/ca.key
@@ -0,0 +1,51 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIJKAIBAAKCAgEAvGkv918nCEhYZgr3ei8hWP6Cq8kjnxKBrt5aWnYum4VBkROM
+kEDv1HSBzCvjamFyHUG7GjGRiLMzyyojIVrlpbxIJaY74hDN50pZm/5RZmDqkb4X
+PKnoY7XCZdl15fDFGJenapX6uoDwNovaDVza7pMH+Zx81Ot+xI/fTjnJBb7iZ03H
++DjAF/R0ykd7kMnmMi+jBrY7SR6yrVRDV4z0gw1LBbx8xB6dX4XjUtYTU07vbqSy
+CWKH1NCMAiuVfohdWbDSWBh6C3Yb5hAnryd/ZSa8r4LQqrNNmCqbM0xCe5KIlcye
+Vm+WB0tdPJNYK6q3LGnf5nZayGT8KCGJzYwKbZfBYEipga77bSqg8zrVzdGTn77Z
+U5xqMPXIJjFW0zZqRU/971quUJ2L8K0mHeq86WP1SGzprVRH9meCk8s5revglrNl
+zTikrurdnKeahQugM8X0Ao6KS+FgrFNiyBnrlWEjebJMGNAWT2pf77PYcX1QiYZu
+WpS1ySfd4igjyfbB3ik784V4VJelHuMzLALBdOkLzJNNu5XMcTPwfzf+q2xuO3D3
+rWDiRvxXOHXPLvc8WIk0juFmU/Ujl2o1M4C/4afCJKcXbyLvFt2Qh+aNirBzAaEA
+7uuOJ+rzKAEfewXQj/p2fDgG82VKBImUnX7Z4fW6JqKSm44a1AC23Pnfp00CAwEA
+AQKCAgAUj6YcaNXpoXuEJ046l0ocXCoGdTzd7zcXzkwt8xfDARfWrTt5wpxpow1H
+KsL2qQu7BaFVinNHZ8cPNNoAmdrV62Y0NZ/zW8Icq5B75ZUchxcSMJx4klI6D2vX
+kZO8NDpOJL6wcw2ZrNiKG1kAfFGoF4OXSeyVj92Vtd24u7WkWuB6RZK9E/RiqNrV
++FcTxfTJJUm1Qc3WfPMi1z9CHq/QXXMCfT9gZ7bk5ceZEqOpQ8P9XxvOymHoZ5nf
+4sG9vUPytck+s+0dsxX4VWr/QmA0ubV9sdjzx/1/zaaCQqA+vA8Lyfi9lg/ZW/Ag
+3DOTEF5NCoDUtbXSiLK77m0LcWzxuN0S/lX633YxELTWYp0iCYQHHJG3SkQ/1aoV
+0MnZ4VqpQDlX6xVvPvhSnSqE/QnudZtLf+DvJbAWXAiYj5PQvxL07UXQyMPs5zql
+HFXuSrMmIhq+mDmtbZkoD+ohYh04CmXHU00UKYaDriwQFeB0z4N540kncf5hVv0Q
+2ueNoYE/MimVDH4MLU1AEPRoDhod5+JWxGEDkkeivFd/+6GPm7yOJ+iS9vD9JJoq
+LNmiMBHvRutJcthBXGxj0p/yOs4M727WoRhxSm47RvKbIM+byUWsftaSWzMNQxSI
+vpLbEe+KgLQv5kjC+LCfxKSeSTNHatUQlW4fKkAPnl4jdFFCQQKCAQEA3ynBMpWC
+weoyTaxlfeNeqZdpmVHm3jP7LiS6vBk8ntfVgg2+I5L5J091GNi4FkE/jebsAJ8I
+qi7j2k0LsP+tdYsdsQErA/HLnOGXfTUPfASQ2epnZ3P0D3+NZxJIerdu5GvBlNOi
+vi9PjNZKbKpj0xUP6/h+GLGedqzhqeAzAsraZMvghjOvvs8atjIrWYWSqhaj7q41
+t27b4nChZYP6QC0ayy9PBTrjHbugXxTlg7Q47AvDfvZcbidAPm4hnkvzTVstfY47
+8p4ChfB0H/Eo1vdroCmkTc6DuW8LNTJC2Xi7EzOeawwUzs0KWYX7K+gin+GyW1sx
+s7E5qeU+2162AwKCAQEA2CJdY6UiPTVKpujYfvf+qusCAkckucot+tOwXcWCuA3D
+B7BUkIs482Nev1ujaWzvJnVon2Pgj8fjun2HPLf8WZDkGOq3cmHu7qUZiH9sYAWO
+sHHQTuFznz7XlS88LUj6Hbnyx2gohKJf6ZLfDVEtvNXE9WlzR7EBQ9yIgx4O5a/5
+VinyIqpGhE+GPpkFJybWJb/x/tUSovnAs6OBgRmAlupLcNpOVu5Cc9KeIzDfJzbS
+jeQOdUaU2q5xjQC9T9RxBThb9gaJkIxvyj4R73Yh9hDbI6qT2/rmaG5/w35XgCa0
+0rDN9npAeAGK5OAj1Xcqf8dv5MHYFgBxu7INtYeUbwKCAQEA1NlSeBi6OpJRoFwK
+AWRX6ZGNGrtPZChYLs7BfJ7lfuuFrSHGdM+97IyQtz4ddryNDZ9vAbit3wQSNyi9
+OfjjTPV/QFBI4t5AwkU45CczuanxLqewMLAb3JxgFisODl3e2uccIAMrehJN4ZqS
+Kcrqo223Xe4I9yySY8bJBendPZCVdQYwBFBQE8IdTCHVzvDjzm8BtKlcerS17OhY
+SCb1DTj4EUvyJp7f+H/4mjeoIVJH6Hvf3rzDtByj3efVENKIIQQSA2siKmojJfUO
+DVlLBp2+fWi6WavbX4ZWPkrOD/ZjGBFny9oeDpDqijCMPHiQbcYrA4+bfDRRN4Z7
+yWgwWQKCAQBXobdTy4SSZKUb/5SoBk0PZ7Gs0sOlQMBbzrDXlFln3syQtYHUCV7R
+8BxeYf1jpXNhmIEO/yPxqA5Bctv+VmrOtdyF7cTrb6G8yNwNZ/y9AgPUrpDTKr4C
+dyxZpIk1oz0mCFrTVvv2qw9QWOhvMdbllZcCGftPugjVRvlikDFiF3N06BTw0TE+
+PDAl+U0JjsmNDMJFnIat5a2oKEc93OUyS1TDMQBKZtgytdbAVfRkpenA9hKWokOA
+VvJbRU18rJoWj79ZhVUJcqdwzLHg8XjbmAIB+AtzSctZ1FOhI/y+TPNL6bvYj8DL
+53Q1UFu3FVX58RcBHUdLxGpYu9yrGYmpAoIBAHozyl3z2kx/dDdZcgfgWED4gTFE
+hmGNHa0u/ddldxy4IWQURYfIduvCy/eOHBBsrU7Sy7ptbabCb+Qp+2fR5pSL+jp3
+0vWlgIrWC3Lk3Wc/MZoZgrggYkKOrq59/LGrEgYY8lYSWvxQmO89N1XlgVXiKyMZ
+wevGUC3msxO6SZGKHZjEja1c6iOt0bep6HfLjQ+Q1UlciSNhDhI8G+IV6iRLVhZe
+0R1pelBd8/TTOuhpGfmIjZTRbbXRU83leRNK/I2nCmJeW7EONqDLk7oJUezWf7g1
+oGDrJsknnPBhmKDZWUYaf3NFHpeRT6ii9EjiSfJ+urmtizpdjCYvdJzuDGI=
+-----END RSA PRIVATE KEY-----
diff --git a/qa/tls_certificates/authority/ca.pem b/qa/tls_certificates/authority/ca.pem
new file mode 100644
index 00000000000..51c2c7a20e7
--- /dev/null
+++ b/qa/tls_certificates/authority/ca.pem
@@ -0,0 +1,83 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIJKAIBAAKCAgEAvGkv918nCEhYZgr3ei8hWP6Cq8kjnxKBrt5aWnYum4VBkROM
+kEDv1HSBzCvjamFyHUG7GjGRiLMzyyojIVrlpbxIJaY74hDN50pZm/5RZmDqkb4X
+PKnoY7XCZdl15fDFGJenapX6uoDwNovaDVza7pMH+Zx81Ot+xI/fTjnJBb7iZ03H
++DjAF/R0ykd7kMnmMi+jBrY7SR6yrVRDV4z0gw1LBbx8xB6dX4XjUtYTU07vbqSy
+CWKH1NCMAiuVfohdWbDSWBh6C3Yb5hAnryd/ZSa8r4LQqrNNmCqbM0xCe5KIlcye
+Vm+WB0tdPJNYK6q3LGnf5nZayGT8KCGJzYwKbZfBYEipga77bSqg8zrVzdGTn77Z
+U5xqMPXIJjFW0zZqRU/971quUJ2L8K0mHeq86WP1SGzprVRH9meCk8s5revglrNl
+zTikrurdnKeahQugM8X0Ao6KS+FgrFNiyBnrlWEjebJMGNAWT2pf77PYcX1QiYZu
+WpS1ySfd4igjyfbB3ik784V4VJelHuMzLALBdOkLzJNNu5XMcTPwfzf+q2xuO3D3
+rWDiRvxXOHXPLvc8WIk0juFmU/Ujl2o1M4C/4afCJKcXbyLvFt2Qh+aNirBzAaEA
+7uuOJ+rzKAEfewXQj/p2fDgG82VKBImUnX7Z4fW6JqKSm44a1AC23Pnfp00CAwEA
+AQKCAgAUj6YcaNXpoXuEJ046l0ocXCoGdTzd7zcXzkwt8xfDARfWrTt5wpxpow1H
+KsL2qQu7BaFVinNHZ8cPNNoAmdrV62Y0NZ/zW8Icq5B75ZUchxcSMJx4klI6D2vX
+kZO8NDpOJL6wcw2ZrNiKG1kAfFGoF4OXSeyVj92Vtd24u7WkWuB6RZK9E/RiqNrV
++FcTxfTJJUm1Qc3WfPMi1z9CHq/QXXMCfT9gZ7bk5ceZEqOpQ8P9XxvOymHoZ5nf
+4sG9vUPytck+s+0dsxX4VWr/QmA0ubV9sdjzx/1/zaaCQqA+vA8Lyfi9lg/ZW/Ag
+3DOTEF5NCoDUtbXSiLK77m0LcWzxuN0S/lX633YxELTWYp0iCYQHHJG3SkQ/1aoV
+0MnZ4VqpQDlX6xVvPvhSnSqE/QnudZtLf+DvJbAWXAiYj5PQvxL07UXQyMPs5zql
+HFXuSrMmIhq+mDmtbZkoD+ohYh04CmXHU00UKYaDriwQFeB0z4N540kncf5hVv0Q
+2ueNoYE/MimVDH4MLU1AEPRoDhod5+JWxGEDkkeivFd/+6GPm7yOJ+iS9vD9JJoq
+LNmiMBHvRutJcthBXGxj0p/yOs4M727WoRhxSm47RvKbIM+byUWsftaSWzMNQxSI
+vpLbEe+KgLQv5kjC+LCfxKSeSTNHatUQlW4fKkAPnl4jdFFCQQKCAQEA3ynBMpWC
+weoyTaxlfeNeqZdpmVHm3jP7LiS6vBk8ntfVgg2+I5L5J091GNi4FkE/jebsAJ8I
+qi7j2k0LsP+tdYsdsQErA/HLnOGXfTUPfASQ2epnZ3P0D3+NZxJIerdu5GvBlNOi
+vi9PjNZKbKpj0xUP6/h+GLGedqzhqeAzAsraZMvghjOvvs8atjIrWYWSqhaj7q41
+t27b4nChZYP6QC0ayy9PBTrjHbugXxTlg7Q47AvDfvZcbidAPm4hnkvzTVstfY47
+8p4ChfB0H/Eo1vdroCmkTc6DuW8LNTJC2Xi7EzOeawwUzs0KWYX7K+gin+GyW1sx
+s7E5qeU+2162AwKCAQEA2CJdY6UiPTVKpujYfvf+qusCAkckucot+tOwXcWCuA3D
+B7BUkIs482Nev1ujaWzvJnVon2Pgj8fjun2HPLf8WZDkGOq3cmHu7qUZiH9sYAWO
+sHHQTuFznz7XlS88LUj6Hbnyx2gohKJf6ZLfDVEtvNXE9WlzR7EBQ9yIgx4O5a/5
+VinyIqpGhE+GPpkFJybWJb/x/tUSovnAs6OBgRmAlupLcNpOVu5Cc9KeIzDfJzbS
+jeQOdUaU2q5xjQC9T9RxBThb9gaJkIxvyj4R73Yh9hDbI6qT2/rmaG5/w35XgCa0
+0rDN9npAeAGK5OAj1Xcqf8dv5MHYFgBxu7INtYeUbwKCAQEA1NlSeBi6OpJRoFwK
+AWRX6ZGNGrtPZChYLs7BfJ7lfuuFrSHGdM+97IyQtz4ddryNDZ9vAbit3wQSNyi9
+OfjjTPV/QFBI4t5AwkU45CczuanxLqewMLAb3JxgFisODl3e2uccIAMrehJN4ZqS
+Kcrqo223Xe4I9yySY8bJBendPZCVdQYwBFBQE8IdTCHVzvDjzm8BtKlcerS17OhY
+SCb1DTj4EUvyJp7f+H/4mjeoIVJH6Hvf3rzDtByj3efVENKIIQQSA2siKmojJfUO
+DVlLBp2+fWi6WavbX4ZWPkrOD/ZjGBFny9oeDpDqijCMPHiQbcYrA4+bfDRRN4Z7
+yWgwWQKCAQBXobdTy4SSZKUb/5SoBk0PZ7Gs0sOlQMBbzrDXlFln3syQtYHUCV7R
+8BxeYf1jpXNhmIEO/yPxqA5Bctv+VmrOtdyF7cTrb6G8yNwNZ/y9AgPUrpDTKr4C
+dyxZpIk1oz0mCFrTVvv2qw9QWOhvMdbllZcCGftPugjVRvlikDFiF3N06BTw0TE+
+PDAl+U0JjsmNDMJFnIat5a2oKEc93OUyS1TDMQBKZtgytdbAVfRkpenA9hKWokOA
+VvJbRU18rJoWj79ZhVUJcqdwzLHg8XjbmAIB+AtzSctZ1FOhI/y+TPNL6bvYj8DL
+53Q1UFu3FVX58RcBHUdLxGpYu9yrGYmpAoIBAHozyl3z2kx/dDdZcgfgWED4gTFE
+hmGNHa0u/ddldxy4IWQURYfIduvCy/eOHBBsrU7Sy7ptbabCb+Qp+2fR5pSL+jp3
+0vWlgIrWC3Lk3Wc/MZoZgrggYkKOrq59/LGrEgYY8lYSWvxQmO89N1XlgVXiKyMZ
+wevGUC3msxO6SZGKHZjEja1c6iOt0bep6HfLjQ+Q1UlciSNhDhI8G+IV6iRLVhZe
+0R1pelBd8/TTOuhpGfmIjZTRbbXRU83leRNK/I2nCmJeW7EONqDLk7oJUezWf7g1
+oGDrJsknnPBhmKDZWUYaf3NFHpeRT6ii9EjiSfJ+urmtizpdjCYvdJzuDGI=
+-----END RSA PRIVATE KEY-----
+-----BEGIN CERTIFICATE-----
+MIIFizCCA3OgAwIBAgIUJBX+SiNuqUYjf33EuMObynTcKx0wDQYJKoZIhvcNAQEL
+BQAwVTELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcM
+DVNhbiBGcmFuY2lzY28xGTAXBgNVBAoMEEdpdExhYiBBdXRob3JpdHkwHhcNMjEw
+MjExMDYyMTUzWhcNMzEwMjA5MDYyMTUzWjBVMQswCQYDVQQGEwJVUzETMBEGA1UE
+CAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzEZMBcGA1UECgwQ
+R2l0TGFiIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
+ALxpL/dfJwhIWGYK93ovIVj+gqvJI58Sga7eWlp2LpuFQZETjJBA79R0gcwr42ph
+ch1BuxoxkYizM8sqIyFa5aW8SCWmO+IQzedKWZv+UWZg6pG+Fzyp6GO1wmXZdeXw
+xRiXp2qV+rqA8DaL2g1c2u6TB/mcfNTrfsSP3045yQW+4mdNx/g4wBf0dMpHe5DJ
+5jIvowa2O0kesq1UQ1eM9IMNSwW8fMQenV+F41LWE1NO726ksglih9TQjAIrlX6I
+XVmw0lgYegt2G+YQJ68nf2UmvK+C0KqzTZgqmzNMQnuSiJXMnlZvlgdLXTyTWCuq
+tyxp3+Z2Wshk/Cghic2MCm2XwWBIqYGu+20qoPM61c3Rk5++2VOcajD1yCYxVtM2
+akVP/e9arlCdi/CtJh3qvOlj9Uhs6a1UR/ZngpPLOa3r4JazZc04pK7q3ZynmoUL
+oDPF9AKOikvhYKxTYsgZ65VhI3myTBjQFk9qX++z2HF9UImGblqUtckn3eIoI8n2
+wd4pO/OFeFSXpR7jMywCwXTpC8yTTbuVzHEz8H83/qtsbjtw961g4kb8Vzh1zy73
+PFiJNI7hZlP1I5dqNTOAv+GnwiSnF28i7xbdkIfmjYqwcwGhAO7rjifq8ygBH3sF
+0I/6dnw4BvNlSgSJlJ1+2eH1uiaikpuOGtQAttz536dNAgMBAAGjUzBRMB0GA1Ud
+DgQWBBQSNZ46Xu4rfGVIPIQJpduWHJ+AQjAfBgNVHSMEGDAWgBQSNZ46Xu4rfGVI
+PIQJpduWHJ+AQjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4ICAQC1
+4REbDKF1tdYeCxpmQHXLHu7OkrgKIea6eKxf8mI+ZsJA4iNr3aiZYU5Wm+uAq3mK
+x6mrQRaqoo6JNbie5Tw8fU2c71EO4t3vwB7YOsBtcV0YrMtg316UE0lk+6kL0TRD
+tV7dAGCB3wXZVLPolC26/kecc258p6h4rCJ8Gi6FsIKGBisTFk3QOdLG3DQNulPF
+2bZaJjs/6HqLL+QMdChUfJP3i71LdNxzwXNPbjJ3fm5f9RNeOcWo6oI2fkQArl2i
+vcP/QtuqeOoJusbeL9zaF/EFlOggjkEtzFWCB05d6J7dMKYp5Lg4eMZQHPw6ycdk
+Ek/XTupvBk+8UiXeHLvX6II9zww9+gm3uycPiO/CSPNw4yQBPPGW+30WznbedsuY
+m79rxuq50KYvseJSPv7lw8v77ajQbRQzFi4frAFR+A1g8FArLxdpIptI9E+ekmaB
+UMhCmi17mEuBtj8Hc3VrokTFtAJV6YNIk1X+Q/zLh4TaR5mm6C/82j/ZvkSm5OX7
+TfaayRWDr7AfDKeG5Amt52BmYncsPUXnOofSz5UkqpeOWr0rKn+A7f2BeUP9R2nY
+6DncxYA+yOgU7RpnMBscsW6SkVIMJKFrfeZ1SbvZGRJd4L1PwfeaU+3yEG6oAfMa
+CFquw23nWhjvUlnCe9BaUiEtOJ2ruGjdu2sdvXPcnw==
+-----END CERTIFICATE-----
diff --git a/rubocop/cop/graphql/authorize_types.rb b/rubocop/cop/graphql/authorize_types.rb
index 1dba719cdff..9bfd93aa3db 100644
--- a/rubocop/cop/graphql/authorize_types.rb
+++ b/rubocop/cop/graphql/authorize_types.rb
@@ -9,7 +9,7 @@ module RuboCop
# We want to exclude our own basetypes and scalars
ALLOWED_TYPES = %w[BaseEnum BaseScalar BasePermissionType MutationType
- QueryType GraphQL::Schema BaseUnion].freeze
+ QueryType GraphQL::Schema BaseUnion BaseInputObject].freeze
def_node_search :authorize?, <<~PATTERN
(send nil? :authorize ...)
@@ -29,8 +29,9 @@ module RuboCop
return false unless class_const
return true if class_const.end_with?('Enum')
+ return true if class_const.end_with?('InputType')
- ALLOWED_TYPES.any? { |allowed| class_node.const_name.include?(allowed) }
+ ALLOWED_TYPES.any? { |allowed| class_const.include?(allowed) }
end
def class_constant(node)
diff --git a/rubocop/cop/graphql/descriptions.rb b/rubocop/cop/graphql/descriptions.rb
index 1585e5c9788..ec233c65874 100644
--- a/rubocop/cop/graphql/descriptions.rb
+++ b/rubocop/cop/graphql/descriptions.rb
@@ -1,26 +1,31 @@
# frozen_string_literal: true
-# This cop checks for missing GraphQL field descriptions.
+# This cop checks for missing GraphQL descriptions and enforces the description style guide:
+# https://docs.gitlab.com/ee/development/api_graphql_styleguide.html#description-style-guide
#
-# @example
+# @examples
#
# # bad
-# class AwfulClass
+# class AwfulType
# field :some_field, GraphQL::STRING_TYPE
# end
#
-# class TerribleClass
+# class TerribleType
# argument :some_argument, GraphQL::STRING_TYPE
# end
#
-# class UngoodClass
+# class UngoodType
# field :some_argument,
# GraphQL::STRING_TYPE,
# description: "A description that does not end in a period"
# end
#
+# class BadEnum
+# value "some_value"
+# end
+#
# # good
-# class GreatClass
+# class GreatType
# argument :some_field,
# GraphQL::STRING_TYPE,
# description: "Well described - a superb description."
@@ -29,6 +34,10 @@
# GraphQL::STRING_TYPE,
# description: "A thorough and compelling description."
# end
+#
+# class GoodEnum
+# value "some_value", "Good description."
+# end
module RuboCop
module Cop
@@ -37,19 +46,26 @@ module RuboCop
MSG_NO_DESCRIPTION = 'Please add a `description` property.'
MSG_NO_PERIOD = '`description` strings must end with a `.`.'
- # ability_field and permission_field set a default description.
- def_node_matcher :field_or_argument?, <<~PATTERN
- (send nil? {:field :argument} ...)
+ def_node_matcher :graphql_describable?, <<~PATTERN
+ (send nil? {:field :argument :value} ...)
+ PATTERN
+
+ def_node_matcher :enum?, <<~PATTERN
+ (send nil? :value ...)
PATTERN
- def_node_matcher :description, <<~PATTERN
+ def_node_matcher :description_kwarg, <<~PATTERN
(... (hash <(pair (sym :description) $_) ...>))
PATTERN
+ def_node_matcher :enum_style_description, <<~PATTERN
+ (send nil? :value _ $str ...)
+ PATTERN
+
def on_send(node)
- return unless field_or_argument?(node)
+ return unless graphql_describable?(node)
- description = description(node)
+ description = locate_description(node)
return add_offense(node, location: :expression, message: MSG_NO_DESCRIPTION) unless description
@@ -59,7 +75,7 @@ module RuboCop
# Autocorrect missing periods at end of description.
def autocorrect(node)
lambda do |corrector|
- description = description(node)
+ description = locate_description(node)
next unless description
corrector.insert_after(before_end_quote(description), '.')
@@ -68,6 +84,16 @@ module RuboCop
private
+ # Fields and arguments define descriptions using a `description` keyword argument.
+ # Enums may define descriptions this way, or as a second `String` param.
+ def locate_description(node)
+ description = description_kwarg(node)
+
+ return description unless description.nil? && enum?(node)
+
+ enum_style_description(node)
+ end
+
def no_period?(description)
# Test that the description node is a `:str` (as opposed to
# a `#copy_field_description` call) before checking.
diff --git a/rubocop/cop/migration/add_columns_to_wide_tables.rb b/rubocop/cop/migration/add_columns_to_wide_tables.rb
index 2880783dc3e..41056379515 100644
--- a/rubocop/cop/migration/add_columns_to_wide_tables.rb
+++ b/rubocop/cop/migration/add_columns_to_wide_tables.rb
@@ -9,8 +9,8 @@ module RuboCop
class AddColumnsToWideTables < RuboCop::Cop::Cop
include MigrationHelpers
- MSG = '`%s` is a wide table with several columns, addig more should be avoided unless absolutely necessary.' \
- ' Consider storing the column in a different table or creating a new one.'.freeze
+ MSG = '`%s` is a wide table with several columns, adding more should be avoided unless absolutely necessary.' \
+ ' Consider storing the column in a different table or creating a new one.'
BLACKLISTED_METHODS = %i[
add_column
diff --git a/rubocop/cop/migration/with_lock_retries_disallowed_method.rb b/rubocop/cop/migration/with_lock_retries_disallowed_method.rb
index aef19517a9d..f423bde8343 100644
--- a/rubocop/cop/migration/with_lock_retries_disallowed_method.rb
+++ b/rubocop/cop/migration/with_lock_retries_disallowed_method.rb
@@ -21,6 +21,7 @@ module RuboCop
change_column_null
remove_foreign_key_if_exists
remove_foreign_key_without_error
+ rename_index
table_exists?
index_exists_by_name?
foreign_key_exists?
diff --git a/rubocop/rubocop-migrations.yml b/rubocop/rubocop-migrations.yml
index 45f8270b34d..c1ad3cc8abb 100644
--- a/rubocop/rubocop-migrations.yml
+++ b/rubocop/rubocop-migrations.yml
@@ -27,6 +27,7 @@ Migration/UpdateLargeTable:
- :project_ci_cd_settings
- :project_settings
- :project_features
+ - :protected_branches
- :push_event_payloads
- :resource_label_events
- :routes
diff --git a/rubocop/rubocop-usage-data.yml b/rubocop/rubocop-usage-data.yml
index bbc4d590ddc..d0dd6a2e4da 100644
--- a/rubocop/rubocop-usage-data.yml
+++ b/rubocop/rubocop-usage-data.yml
@@ -30,6 +30,7 @@ UsageData/LargeTable:
- :Settings
- :CE_MEMOIZED_VALUES
- :EE_MEMOIZED_VALUES
+ - :Ohai::System
CountMethods:
- :count
- :distinct_count
diff --git a/scripts/flaky_examples/prune-old-flaky-examples b/scripts/flaky_examples/prune-old-flaky-examples
index 8c09c4cc860..a5b50a7e8ea 100755
--- a/scripts/flaky_examples/prune-old-flaky-examples
+++ b/scripts/flaky_examples/prune-old-flaky-examples
@@ -1,16 +1,11 @@
#!/usr/bin/env ruby
# frozen_string_literal: true
-# lib/rspec_flaky/flaky_examples_collection.rb is requiring
+# tooling/rspec_flaky/flaky_examples_collection.rb is requiring
# `active_support/hash_with_indifferent_access`, and we install the `activesupport`
# gem manually on the CI
require 'rubygems'
-
-# In newer Ruby, alias_method is not private then we don't need __send__
-singleton_class.__send__(:alias_method, :require_dependency, :require) # rubocop:disable GitlabSecurity/PublicSend
-$:.unshift(File.expand_path('../../lib', __dir__))
-
-require 'rspec_flaky/report'
+require_relative '../../tooling/rspec_flaky/report'
report_file = ARGV.shift
unless report_file
diff --git a/scripts/frontend/block_dependencies.js b/scripts/frontend/block_dependencies.js
index a1ff8d5ee36..f229f317cbb 100644
--- a/scripts/frontend/block_dependencies.js
+++ b/scripts/frontend/block_dependencies.js
@@ -1,8 +1,8 @@
-const path = require('path');
-const packageJson = require(path.join(process.cwd(), 'package.json'));
+const packageJson = require('../../package.json');
+
const blockedDependencies = packageJson.blockedDependencies || {};
-const dependencies = packageJson.dependencies;
-const devDependencies = packageJson.devDependencies;
+const { dependencies } = packageJson;
+const { devDependencies } = packageJson;
const blockedDependenciesNames = Object.keys(blockedDependencies);
const blockedDependenciesFound = blockedDependenciesNames.filter(
(blockedDependency) => dependencies[blockedDependency] || devDependencies[blockedDependency],
diff --git a/scripts/frontend/check_page_bundle_mixins_css_for_sideeffects.js b/scripts/frontend/check_page_bundle_mixins_css_for_sideeffects.js
index 34e939e3ceb..22a4aac762b 100755
--- a/scripts/frontend/check_page_bundle_mixins_css_for_sideeffects.js
+++ b/scripts/frontend/check_page_bundle_mixins_css_for_sideeffects.js
@@ -7,9 +7,9 @@ if (process.env.RAILS_ENV !== 'production') {
process.exit(0);
}
-const path = require('path');
const fs = require('fs');
const glob = require('glob');
+const path = require('path');
const pjs = require('postcss');
const paths = glob.sync('public/assets/page_bundles/_mixins_and_variables_and_functions*.css', {
diff --git a/scripts/frontend/execute-on-staged-files.sh b/scripts/frontend/execute-on-staged-files.sh
new file mode 100755
index 00000000000..f218926f098
--- /dev/null
+++ b/scripts/frontend/execute-on-staged-files.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+set -euo pipefail
+IFS=$'\n\t'
+
+# The yarn run command we'd like to run
+command="$1"
+# The file types we'd like to target, use something like '(js|vue)'
+file_types="$2"
+
+# Removing first two arguments
+shift
+shift
+
+# Read all staged non-deleted files into an array
+staged_files=()
+while IFS= read -r line; do
+ staged_files+=( "$line" )
+done < <( git diff --diff-filter=d --cached --name-only | { grep -E ".$file_types$" || true; })
+
+if [ "${#staged_files[@]}" == "0" ]; then
+ echo "No staged '$file_types' files"
+else
+ echo "Running $command on ${#staged_files[@]} staged '$file_types' files"
+ yarn run "$command" "$@" "${staged_files[@]}"
+fi
diff --git a/scripts/frontend/extract_gettext_all.js b/scripts/frontend/extract_gettext_all.js
index 67163a601bc..896790a73bb 100644
--- a/scripts/frontend/extract_gettext_all.js
+++ b/scripts/frontend/extract_gettext_all.js
@@ -5,6 +5,7 @@ const {
decorateJSParserWithVueSupport,
decorateExtractorWithHelpers,
} = require('gettext-extractor-vue');
+const vue2TemplateCompiler = require('vue-template-compiler');
const ensureSingleLine = require('../../app/assets/javascripts/locale/ensure_single_line.js');
const args = argumentsParser
@@ -37,12 +38,12 @@ const jsParser = extractor.createJsParser([
]);
const vueParser = decorateJSParserWithVueSupport(jsParser, {
- vue2TemplateCompiler: require('vue-template-compiler'),
+ vue2TemplateCompiler,
});
function printJson() {
- const messages = extractor.getMessages().reduce((result, message) => {
- let text = message.text;
+ const messages = extractor.getMessages().reduce((acc, message) => {
+ let { text } = message;
if (message.textPlural) {
text += `\u0000${message.textPlural}`;
}
@@ -50,25 +51,35 @@ function printJson() {
message.references.forEach((reference) => {
const filename = reference.replace(/:\d+$/, '');
- if (!Array.isArray(result[filename])) {
- result[filename] = [];
+ if (!Array.isArray(acc[filename])) {
+ acc[filename] = [];
}
- result[filename].push([text, reference]);
+ acc[filename].push([text, reference]);
});
- return result;
+ return acc;
}, {});
console.log(JSON.stringify(messages));
}
-if (args.file) {
- vueParser.parseFile(args.file).then(() => printJson());
-} else if (args.all) {
- vueParser.parseFilesGlob('{ee/app,app}/assets/javascripts/**/*.{js,vue}').then(() => printJson());
-} else {
- console.warn('ERROR: Please use the script correctly:');
+async function main() {
+ if (args.file) {
+ return vueParser.parseFile(args.file).then(() => printJson());
+ }
+
+ if (args.all) {
+ return vueParser
+ .parseFilesGlob('{ee/app,app}/assets/javascripts/**/*.{js,vue}')
+ .then(() => printJson());
+ }
+
+ throw new Error('ERROR: Please use the script correctly:');
+}
+
+main().catch((error) => {
+ console.warn(error.message);
args.outputHelp();
process.exit(1);
-}
+});
diff --git a/scripts/frontend/file_test_coverage.js b/scripts/frontend/file_test_coverage.js
index ec6ec4a1e9d..04a9035fce2 100755
--- a/scripts/frontend/file_test_coverage.js
+++ b/scripts/frontend/file_test_coverage.js
@@ -31,28 +31,6 @@ let numTestFiles = 0;
const isVerbose = process.argv.some((arg) => arg === '-v');
-const countSourceFiles = (path) =>
- forEachFileIn(path, (fileName) => {
- if (fileName.endsWith('.vue') || fileName.endsWith('.js')) {
- if (isVerbose) {
- console.log(`source file: ${fileName}`);
- }
-
- numSourceFiles += 1;
- }
- });
-
-const countTestFiles = (path) =>
- forEachFileIn(path, (fileName) => {
- if (fileName.endsWith('_spec.js')) {
- if (isVerbose) {
- console.log(`test file: ${fileName}`);
- }
-
- numTestFiles += 1;
- }
- });
-
function forEachFileIn(dirPath, callback) {
fs.readdir(dirPath, (err, files) => {
if (err) {
@@ -75,6 +53,28 @@ function forEachFileIn(dirPath, callback) {
});
}
+const countSourceFiles = (currentPath) =>
+ forEachFileIn(currentPath, (fileName) => {
+ if (fileName.endsWith('.vue') || fileName.endsWith('.js')) {
+ if (isVerbose) {
+ console.log(`source file: ${fileName}`);
+ }
+
+ numSourceFiles += 1;
+ }
+ });
+
+const countTestFiles = (currentPath) =>
+ forEachFileIn(currentPath, (fileName) => {
+ if (fileName.endsWith('_spec.js')) {
+ if (isVerbose) {
+ console.log(`test file: ${fileName}`);
+ }
+
+ numTestFiles += 1;
+ }
+ });
+
console.log(`Source directories: ${sourceDirectories.join(', ')}`);
console.log(`Test directories: ${testDirectories.join(', ')}`);
diff --git a/scripts/frontend/frontend_script_utils.js b/scripts/frontend/frontend_script_utils.js
deleted file mode 100644
index 43016dce6a4..00000000000
--- a/scripts/frontend/frontend_script_utils.js
+++ /dev/null
@@ -1,20 +0,0 @@
-const execFileSync = require('child_process').execFileSync;
-
-const exec = (command, args) => {
- const options = {
- cwd: process.cwd(),
- env: process.env,
- encoding: 'utf-8',
- };
- return execFileSync(command, args, options);
-};
-
-const execGitCmd = (args) => exec('git', args).trim().toString().split('\n').filter(Boolean);
-
-module.exports = {
- getStagedFiles: (fileExtensionFilter) => {
- const gitOptions = ['diff', '--name-only', '--cached', '--diff-filter=ACMRTUB'];
- if (fileExtensionFilter) gitOptions.push(...fileExtensionFilter);
- return execGitCmd(gitOptions);
- },
-};
diff --git a/scripts/frontend/merge_coverage_frontend.js b/scripts/frontend/merge_coverage_frontend.js
index 0c45a38b9b5..6b3826ddac7 100644
--- a/scripts/frontend/merge_coverage_frontend.js
+++ b/scripts/frontend/merge_coverage_frontend.js
@@ -1,8 +1,8 @@
-const { create } = require('istanbul-reports');
+const { sync } = require('glob');
const { createCoverageMap } = require('istanbul-lib-coverage');
const { createContext } = require('istanbul-lib-report');
+const { create } = require('istanbul-reports');
const { resolve } = require('path');
-const { sync } = require('glob');
const coverageMap = createCoverageMap();
@@ -12,7 +12,7 @@ const reportFiles = sync(`${coverageDir}/*/coverage-final.json`);
// Normalize coverage report generated by jest that has additional "data" key
// https://github.com/facebook/jest/issues/2418#issuecomment-423806659
const normalizeReport = (report) => {
- const normalizedReport = Object.assign({}, report);
+ const normalizedReport = { ...report };
Object.entries(normalizedReport).forEach(([k, v]) => {
if (v.data) normalizedReport[k] = v.data;
});
@@ -20,11 +20,14 @@ const normalizeReport = (report) => {
};
reportFiles
- .map((reportFile) => require(reportFile))
+ .map((reportFile) => {
+ // eslint-disable-next-line global-require, import/no-dynamic-require
+ return require(reportFile);
+ })
.map(normalizeReport)
.forEach((report) => coverageMap.merge(report));
-const context = createContext({ coverageMap: coverageMap, dir: 'coverage-frontend' });
+const context = createContext({ coverageMap, dir: 'coverage-frontend' });
['json', 'lcov', 'text-summary', 'clover', 'cobertura'].forEach((reporter) => {
create(reporter, {}).execute(context);
diff --git a/scripts/frontend/parallel_ci_sequencer.js b/scripts/frontend/parallel_ci_sequencer.js
index d7a674535a6..262e9e2256e 100644
--- a/scripts/frontend/parallel_ci_sequencer.js
+++ b/scripts/frontend/parallel_ci_sequencer.js
@@ -1,5 +1,15 @@
const Sequencer = require('@jest/test-sequencer').default;
+const sortByPath = (test1, test2) => {
+ if (test1.path < test2.path) {
+ return -1;
+ }
+ if (test1.path > test2.path) {
+ return 1;
+ }
+ return 0;
+};
+
class ParallelCISequencer extends Sequencer {
constructor() {
super();
@@ -8,7 +18,7 @@ class ParallelCISequencer extends Sequencer {
}
sort(tests) {
- const sortedTests = this.sortByPath(tests);
+ const sortedTests = [...tests].sort(sortByPath);
const testsForThisRunner = this.distributeAcrossCINodes(sortedTests);
console.log(`CI_NODE_INDEX: ${this.ciNodeIndex}`);
@@ -19,18 +29,6 @@ class ParallelCISequencer extends Sequencer {
return testsForThisRunner;
}
- sortByPath(tests) {
- return tests.sort((test1, test2) => {
- if (test1.path < test2.path) {
- return -1;
- }
- if (test1.path > test2.path) {
- return 1;
- }
- return 0;
- });
- }
-
distributeAcrossCINodes(tests) {
return tests.filter((test, index) => {
return index % this.ciNodeTotal === this.ciNodeIndex - 1;
diff --git a/scripts/frontend/prettier.js b/scripts/frontend/prettier.js
deleted file mode 100644
index f721e46f36b..00000000000
--- a/scripts/frontend/prettier.js
+++ /dev/null
@@ -1,121 +0,0 @@
-const glob = require('glob');
-const prettier = require('prettier');
-const fs = require('fs');
-const { getStagedFiles } = require('./frontend_script_utils');
-
-const matchExtensions = ['js', 'vue', 'graphql'];
-
-// This will improve glob performance by excluding certain directories.
-// The .prettierignore file will also be respected, but after the glob has executed.
-const globIgnore = ['**/node_modules/**', 'vendor/**', 'public/**', 'fixtures/**'];
-
-const readFileAsync = (file, options) =>
- new Promise((resolve, reject) => {
- fs.readFile(file, options, function (err, data) {
- if (err) reject(err);
- else resolve(data);
- });
- });
-
-const writeFileAsync = (file, data, options) =>
- new Promise((resolve, reject) => {
- fs.writeFile(file, data, options, function (err) {
- if (err) reject(err);
- else resolve();
- });
- });
-
-const mode = process.argv[2] || 'check';
-const shouldSave = mode === 'save' || mode === 'save-all';
-const allFiles = mode === 'check-all' || mode === 'save-all';
-let globDir = process.argv[3] || '';
-if (globDir && globDir.charAt(globDir.length - 1) !== '/') globDir += '/';
-
-console.log(
- `Loading all ${allFiles ? '' : 'staged '}files ${globDir ? `within ${globDir} ` : ''}...`,
-);
-
-const globPatterns = matchExtensions.map((ext) => `${globDir}**/*.${ext}`);
-const matchedFiles = allFiles
- ? glob.sync(`{${globPatterns.join(',')}}`, { ignore: globIgnore })
- : getStagedFiles(globPatterns);
-const matchedCount = matchedFiles.length;
-
-if (!matchedCount) {
- console.log('No files found to process with prettier');
- process.exit(0);
-}
-
-let didWarn = false;
-let passedCount = 0;
-let failedCount = 0;
-let ignoredCount = 0;
-
-console.log(`${shouldSave ? 'Updating' : 'Checking'} ${matchedCount} file(s)`);
-
-const fixCommand = `yarn prettier-${allFiles ? 'all' : 'staged'}-save`;
-const warningMessage = `
-===============================
-GitLab uses Prettier to format all JavaScript code.
-Please format each file listed below or run "${fixCommand}"
-===============================
-`;
-
-const checkFileWithOptions = (filePath, options) =>
- readFileAsync(filePath, 'utf8').then((input) => {
- if (shouldSave) {
- const output = prettier.format(input, options);
- if (input === output) {
- passedCount += 1;
- } else {
- return writeFileAsync(filePath, output, 'utf8').then(() => {
- console.log(`Prettified : ${filePath}`);
- failedCount += 1;
- });
- }
- } else {
- if (prettier.check(input, options)) {
- passedCount += 1;
- } else {
- if (!didWarn) {
- // \x1b[31m make text red
- // \x1b[1m make text bold
- // %s warningMessage
- // \x1b[0m reset text color (so logs after aren't red)
- const redBoldText = '\x1b[1m\x1b[31;1m%s\x1b[0m';
- console.log(redBoldText, warningMessage);
- didWarn = true;
- }
- console.log(`yarn prettier --write ${filePath}`);
- failedCount += 1;
- }
- }
- });
-
-const checkFileWithPrettierConfig = (filePath) =>
- prettier
- .getFileInfo(filePath, { ignorePath: '.prettierignore' })
- .then(({ ignored, inferredParser }) => {
- if (ignored || !inferredParser) {
- ignoredCount += 1;
- return;
- }
- return prettier.resolveConfig(filePath).then((fileOptions) => {
- const options = { ...fileOptions, parser: inferredParser };
- return checkFileWithOptions(filePath, options);
- });
- });
-
-Promise.all(matchedFiles.map(checkFileWithPrettierConfig))
- .then(() => {
- const failAction = shouldSave ? 'fixed' : 'failed';
- console.log(
- `\nSummary:\n ${matchedCount} files processed (${passedCount} passed, ${failedCount} ${failAction}, ${ignoredCount} ignored)\n`,
- );
-
- if (didWarn) process.exit(1);
- })
- .catch((e) => {
- console.log(`\nAn error occurred while processing files with prettier: ${e.message}\n`);
- process.exit(1);
- });
diff --git a/scripts/frontend/stylelint/stylelint-duplicate-selectors.js b/scripts/frontend/stylelint/stylelint-duplicate-selectors.js
index 89242158157..982ddf524a3 100644
--- a/scripts/frontend/stylelint/stylelint-duplicate-selectors.js
+++ b/scripts/frontend/stylelint/stylelint-duplicate-selectors.js
@@ -1,5 +1,6 @@
const stylelint = require('stylelint');
const utils = require('./stylelint-utils');
+
const ruleName = 'stylelint-gitlab/duplicate-selectors';
const messages = stylelint.utils.ruleMessages(ruleName, {
@@ -8,12 +9,13 @@ const messages = stylelint.utils.ruleMessages(ruleName, {
},
});
-module.exports = stylelint.createPlugin(ruleName, function (enabled) {
+module.exports = stylelint.createPlugin(ruleName, (enabled) => {
if (!enabled) {
return;
}
- return function (root, result) {
+ // eslint-disable-next-line consistent-return
+ return (root, result) => {
const selectorGroups = {};
utils.createPropertiesHashmap(root, result, ruleName, messages, selectorGroups, true);
};
diff --git a/scripts/frontend/stylelint/stylelint-utility-classes.js b/scripts/frontend/stylelint/stylelint-utility-classes.js
index 1b266fc31c9..420fe82d826 100644
--- a/scripts/frontend/stylelint/stylelint-utility-classes.js
+++ b/scripts/frontend/stylelint/stylelint-utility-classes.js
@@ -10,12 +10,13 @@ const messages = stylelint.utils.ruleMessages(ruleName, {
},
});
-module.exports = stylelint.createPlugin(ruleName, function (enabled) {
+module.exports = stylelint.createPlugin(ruleName, (enabled) => {
if (!enabled) {
return;
}
- return function (root, result) {
+ // eslint-disable-next-line consistent-return
+ return (root, result) => {
utils.createPropertiesHashmap(root, result, ruleName, messages, utilityClasses, false);
};
});
diff --git a/scripts/frontend/stylelint/stylelint-utility-map.js b/scripts/frontend/stylelint/stylelint-utility-map.js
index bf8ee362740..545aade9ccc 100644
--- a/scripts/frontend/stylelint/stylelint-utility-map.js
+++ b/scripts/frontend/stylelint/stylelint-utility-map.js
@@ -1,10 +1,11 @@
-const sass = require('node-sass');
-const postcss = require('postcss');
const fs = require('fs');
+const sass = require('node-sass');
const path = require('path');
+const postcss = require('postcss');
const prettier = require('prettier');
const utils = require('./stylelint-utils');
+
const ROOT_PATH = path.resolve(__dirname, '../../..');
const hashMapPath = path.resolve(__dirname, './utility-classes-map.js');
@@ -22,19 +23,28 @@ sass.render(
includePaths: [path.resolve(ROOT_PATH, 'node_modules/bootstrap/scss')],
},
(err, result) => {
- if (err) console.error('Error ', err);
+ if (err) {
+ return console.error('Error ', err);
+ }
const cssResult = result.css.toString();
// We just use postcss to create a CSS tree
- postcss([])
+ return postcss([])
.process(cssResult, {
// This suppresses a postcss warning
from: undefined,
})
- .then((result) => {
+ .then((processedResult) => {
const selectorGroups = {};
- utils.createPropertiesHashmap(result.root, result, null, null, selectorGroups, true);
+ utils.createPropertiesHashmap(
+ processedResult.root,
+ processedResult,
+ null,
+ null,
+ selectorGroups,
+ true,
+ );
const prettierOptions = prettier.resolveConfig.sync(hashMapPath);
const prettyHashmap = prettier.format(
@@ -42,12 +52,12 @@ sass.render(
prettierOptions,
);
- fs.writeFile(hashMapPath, prettyHashmap, function (err) {
- if (err) {
- return console.log(err);
+ fs.writeFile(hashMapPath, prettyHashmap, (e) => {
+ if (e) {
+ return console.log(e);
}
- console.log('The file was saved!');
+ return console.log('The file was saved!');
});
});
},
diff --git a/scripts/frontend/stylelint/stylelint-utils.js b/scripts/frontend/stylelint/stylelint-utils.js
index e7452b0cdb2..c9d9c7d9aad 100644
--- a/scripts/frontend/stylelint/stylelint-utils.js
+++ b/scripts/frontend/stylelint/stylelint-utils.js
@@ -1,5 +1,5 @@
-const stylelint = require('stylelint');
const md5 = require('md5');
+const stylelint = require('stylelint');
module.exports.createPropertiesHashmap = (
ruleRoot,
@@ -15,7 +15,7 @@ module.exports.createPropertiesHashmap = (
if (
rule &&
rule.parent &&
- rule.parent.type != 'atrule' &&
+ rule.parent.type !== 'atrule' &&
!(
selector.includes('-webkit-') ||
selector.includes('-moz-') ||
@@ -25,7 +25,7 @@ module.exports.createPropertiesHashmap = (
)
) {
let cssArray = [];
- rule.nodes.forEach(function (property) {
+ rule.nodes.forEach((property) => {
const { prop, value } = property;
if (property && value) {
const propval = `${prop}${value}${property.important ? '!important' : ''}`;
@@ -41,11 +41,11 @@ module.exports.createPropertiesHashmap = (
const selObj = selectorGroups[hashValue];
const selectorLine = `${selector} (${
- rule.source.input.file ? rule.source.input.file + ' -' : ''
+ rule.source.input.file ? `${rule.source.input.file} -` : ''
}${rule.source.start.line}:${rule.source.start.column})`;
if (selObj) {
- if (selectorGroups[hashValue].selectors.indexOf(selector) == -1) {
+ if (selectorGroups[hashValue].selectors.indexOf(selector) === -1) {
let lastSelector =
selectorGroups[hashValue].selectors[selectorGroups[hashValue].selectors.length - 1];
@@ -67,6 +67,7 @@ module.exports.createPropertiesHashmap = (
}
}
} else if (addSelectors) {
+ // eslint-disable-next-line no-param-reassign
selectorGroups[hashValue] = {
selectors: [selectorLine],
};
diff --git a/scripts/frontend/webpack_dev_server.js b/scripts/frontend/webpack_dev_server.js
index fbb80c9617d..a76e6dc024a 100755
--- a/scripts/frontend/webpack_dev_server.js
+++ b/scripts/frontend/webpack_dev_server.js
@@ -2,8 +2,8 @@ const nodemon = require('nodemon');
const DEV_SERVER_HOST = process.env.DEV_SERVER_HOST || 'localhost';
const DEV_SERVER_PORT = process.env.DEV_SERVER_PORT || '3808';
-const STATIC_MODE = process.env.DEV_SERVER_STATIC && process.env.DEV_SERVER_STATIC != 'false';
-const DLL_MODE = process.env.WEBPACK_VENDOR_DLL && process.env.WEBPACK_VENDOR_DLL != 'false';
+const STATIC_MODE = process.env.DEV_SERVER_STATIC && process.env.DEV_SERVER_STATIC !== 'false';
+const DLL_MODE = process.env.WEBPACK_VENDOR_DLL && process.env.WEBPACK_VENDOR_DLL !== 'false';
const baseConfig = {
ignoreRoot: ['.git', 'node_modules/*/'],
@@ -30,7 +30,7 @@ if (STATIC_MODE) {
// run webpack through webpack-dev-server, optionally compiling a DLL to reduce memory
else {
- let watch = ['config/webpack.config.js'];
+ const watch = ['config/webpack.config.js'];
// if utilizing the vendor DLL, we need to restart the process when dependency changes occur
if (DLL_MODE) {
@@ -51,7 +51,7 @@ else {
// print useful messages for nodemon events
nodemon
- .on('start', function () {
+ .on('start', () => {
console.log(`Starting webpack webserver on http://${DEV_SERVER_HOST}:${DEV_SERVER_PORT}`);
if (STATIC_MODE) {
console.log('You are starting webpack in compile-once mode');
@@ -59,10 +59,10 @@ nodemon
console.log('If you change them often, you might want to unset DEV_SERVER_STATIC');
}
})
- .on('quit', function () {
+ .on('quit', () => {
console.log('Shutting down webpack process');
process.exit();
})
- .on('restart', function (files) {
+ .on('restart', (files) => {
console.log('Restarting webpack process due to: ', files);
});
diff --git a/scripts/lint-doc.sh b/scripts/lint-doc.sh
index 17c8cdaabec..c94faa8f6f4 100755
--- a/scripts/lint-doc.sh
+++ b/scripts/lint-doc.sh
@@ -78,7 +78,7 @@ then
echo
echo ' ✖ ERROR: The number of README.md file(s) has changed. Use index.md instead of README.md.' >&2
echo ' ✖ If removing a README.md file, update NUMBER_READMES in lint-doc.sh.' >&2
- echo ' https://docs.gitlab.com/ee/development/documentation/styleguide.html#work-with-directories-and-files'
+ echo ' https://docs.gitlab.com/ee/development/documentation/styleguide/index.html#work-with-directories-and-files'
echo
((ERRORCODE++))
fi
diff --git a/scripts/review_apps/base-config.yaml b/scripts/review_apps/base-config.yaml
index bfc35a6abde..cf55fca7452 100644
--- a/scripts/review_apps/base-config.yaml
+++ b/scripts/review_apps/base-config.yaml
@@ -16,11 +16,11 @@ gitlab:
gitaly:
resources:
requests:
- cpu: 1200m
- memory: 245M
+ cpu: 2400m
+ memory: 1000M
limits:
- cpu: 1800m
- memory: 367M
+ cpu: 3600m
+ memory: 1500M
persistence:
size: 10G
gitlab-exporter:
@@ -38,10 +38,10 @@ gitlab:
resources:
requests:
cpu: 500m
- memory: 25M
+ memory: 100M
limits:
cpu: 750m
- memory: 37.5M
+ memory: 150M
maxReplicas: 3
hpa:
targetAverageValue: 500m
@@ -52,10 +52,10 @@ gitlab:
resources:
requests:
cpu: 855m
- memory: 1285M
+ memory: 1927M
limits:
cpu: 1282m
- memory: 1927M
+ memory: 2890M
hpa:
targetAverageValue: 650m
task-runner:
@@ -138,10 +138,10 @@ postgresql:
resources:
requests:
cpu: 550m
- memory: 250M
+ memory: 1000M
limits:
cpu: 825m
- memory: 375M
+ memory: 1500M
prometheus:
install: false
redis:
diff --git a/scripts/review_apps/review-apps.sh b/scripts/review_apps/review-apps.sh
index 59e7d183ae7..88be78c7615 100755
--- a/scripts/review_apps/review-apps.sh
+++ b/scripts/review_apps/review-apps.sh
@@ -314,7 +314,7 @@ function deploy() {
if [[ "$(base_config_changed)" == "true" ]]; then base_config_file_ref="${CI_COMMIT_SHA}"; fi
local base_config_file="https://gitlab.com/gitlab-org/gitlab/raw/${base_config_file_ref}/scripts/review_apps/base-config.yaml"
- echoinfo "Deploying ${release}..." true
+ echoinfo "Deploying ${release} to ${CI_ENVIRONMENT_URL} ..." true
IMAGE_REPOSITORY="registry.gitlab.com/gitlab-org/build/cng-mirror"
gitlab_migrations_image_repository="${IMAGE_REPOSITORY}/gitlab-rails-ee"
diff --git a/scripts/static-analysis b/scripts/static-analysis
index febfdbd1da4..2442455e630 100755
--- a/scripts/static-analysis
+++ b/scripts/static-analysis
@@ -25,16 +25,15 @@ class StaticAnalysis
# Most of the time, RuboCop finishes in 30 seconds, but sometimes it can take around 1200 seconds so we set a
# duration of 300 to lower the likelihood that it will run in the same job as another long task...
%w[bundle exec rubocop --parallel] => 300,
- %w[yarn run eslint] => 197,
- %w[yarn run prettier-all] => 124,
+ %w[yarn run lint:eslint:all] => 197,
+ %w[yarn run lint:prettier] => 124,
%w[bin/rake gettext:lint] => 96,
%w[bundle exec license_finder] => 49,
- %w[bin/rake scss_lint] => 38,
%w[bin/rake lint:static_verification] => 22,
%w[bin/rake gitlab:sidekiq:all_queues_yml:check] => 13,
(Gitlab.ee? ? %w[bin/rake gitlab:sidekiq:sidekiq_queues_yml:check] : nil) => 13,
%w[bin/rake config_lint] => 11,
- %w[yarn run stylelint] => 9,
+ %w[yarn run lint:stylelint] => 9,
%w[scripts/lint-conflicts.sh] => 0.59,
%w[yarn run block-dependencies] => 0.35,
%w[scripts/lint-rugged] => 0.23,
diff --git a/scripts/update-workhorse b/scripts/update-workhorse
deleted file mode 100755
index 2c43b249fe4..00000000000
--- a/scripts/update-workhorse
+++ /dev/null
@@ -1,59 +0,0 @@
-#!/bin/sh
-set -e
-WORKHORSE_DIR=workhorse/
-WORKHORSE_REF="$(cat GITLAB_WORKHORSE_VERSION)"
-WORKHORSE_URL=${GITLAB_WORKHORSE_URL:-https://gitlab.com/gitlab-org/gitlab-workhorse.git}
-
-if [ $# -gt 1 ] || ([ $# = 1 ] && [ x$1 != xcheck ]); then
- echo "Usage: update-workhorse [check]"
- exit 1
-fi
-
-if echo "$WORKHORSE_REF" | grep -q '^[0-9]\+\.[0-9]\+\.[0-9]\+' ; then
- # Assume this is a tagged release
- WORKHORSE_REF="v${WORKHORSE_REF}"
-fi
-
-clean="$(git status --porcelain)"
-if [ -n "$clean" ] ; then
- echo 'error: working directory is not clean:'
- echo "$clean"
- exit 1
-fi
-
-git fetch "$WORKHORSE_URL" "$WORKHORSE_REF"
-git rm -rf --quiet -- "$WORKHORSE_DIR"
-git read-tree --prefix="$WORKHORSE_DIR" -u FETCH_HEAD
-
-status="$(git status --porcelain)"
-
-if [ x$1 = xcheck ]; then
- if [ -n "$status" ]; then
- cat <<MSG
-error: $WORKHORSE_DIR does not match $WORKHORSE_REF
-
-During the transition period of https://gitlab.com/groups/gitlab-org/-/epics/4826,
-the workhorse/ directory in this repository is read-only. To make changes:
-
-1. Submit a MR to https://gitlab.com/gitlab-org/gitlab-workhorse
-2. Once your MR is merged, have a new gitlab-workhorse tag made
- by a maintainer
-3. Update the GITLAB_WORKHORSE_VERSION file in this repository
-4. Run scripts/update-workhorse to update the workhorse/ directory
-
-MSG
- exit 1
- fi
- exit 0
-fi
-
-if [ -z "$status" ]; then
- echo "warn: $WORKHORSE_DIR is already up to date, exiting without commit"
- exit 0
-fi
-
-tree=$(git write-tree)
-msg="Update vendored workhorse to $WORKHORSE_REF"
-commit=$(git commit-tree -p HEAD -p FETCH_HEAD^{commit} -m "$msg" "$tree")
-git update-ref HEAD "$commit"
-git log -1
diff --git a/scripts/validate_migration_schema b/scripts/validate_migration_schema
index 95a9ae9f93f..0b909f7ac77 100755
--- a/scripts/validate_migration_schema
+++ b/scripts/validate_migration_schema
@@ -27,7 +27,7 @@ class MigrationSchemaValidator
private
def validate_schema_on_rollback!
- committed_migrations.each do |filename|
+ committed_migrations.reverse_each do |filename|
version = find_migration_version(filename)
run("bin/rails db:migrate:down VERSION=#{version}")
diff --git a/scripts/verify-tff-mapping b/scripts/verify-tff-mapping
index 9931e14008a..5bc4b23f99f 100755
--- a/scripts/verify-tff-mapping
+++ b/scripts/verify-tff-mapping
@@ -110,6 +110,12 @@ tests = [
explanation: 'Migration should map to its timestamped spec',
source: 'db/post_migrate/20190924152703_migrate_issue_trackers_data.rb',
expected: ['spec/migrations/20190924152703_migrate_issue_trackers_data_spec.rb']
+ },
+
+ {
+ explanation: 'Whats New should map to its respective spec',
+ source: 'data/whats_new/202101140001_13_08.yml',
+ expected: ['spec/lib/release_highlights/validator_spec.rb']
}
]
diff --git a/spec/bin/feature_flag_spec.rb b/spec/bin/feature_flag_spec.rb
index 710b1606923..de0db8ba256 100644
--- a/spec/bin/feature_flag_spec.rb
+++ b/spec/bin/feature_flag_spec.rb
@@ -265,16 +265,9 @@ RSpec.describe 'bin/feature-flag' do
end
describe '.read_ee_only' do
- where(:type, :is_ee_only) do
- :development | false
- :licensed | true
- end
-
- with_them do
- let(:options) { OpenStruct.new(name: 'foo', type: type) }
+ let(:options) { OpenStruct.new(name: 'foo', type: :development) }
- it { expect(described_class.read_ee_only(options)).to eq(is_ee_only) }
- end
+ it { expect(described_class.read_ee_only(options)).to eq(false) }
end
end
end
diff --git a/spec/controllers/admin/application_settings_controller_spec.rb b/spec/controllers/admin/application_settings_controller_spec.rb
index 71abf3191b8..2b562e2dd64 100644
--- a/spec/controllers/admin/application_settings_controller_spec.rb
+++ b/spec/controllers/admin/application_settings_controller_spec.rb
@@ -144,10 +144,10 @@ RSpec.describe Admin::ApplicationSettingsController do
end
it 'updates repository_storages_weighted setting' do
- put :update, params: { application_setting: { repository_storages_weighted_default: 75 } }
+ put :update, params: { application_setting: { repository_storages_weighted: { default: 75 } } }
expect(response).to redirect_to(general_admin_application_settings_path)
- expect(ApplicationSetting.current.repository_storages_weighted_default).to eq(75)
+ expect(ApplicationSetting.current.repository_storages_weighted).to eq('default' => 75)
end
it 'updates kroki_formats setting' do
diff --git a/spec/controllers/admin/instance_statistics_controller_spec.rb b/spec/controllers/admin/instance_statistics_controller_spec.rb
deleted file mode 100644
index c589e46857f..00000000000
--- a/spec/controllers/admin/instance_statistics_controller_spec.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Admin::InstanceStatisticsController do
- let(:admin) { create(:user, :admin) }
-
- before do
- sign_in(admin)
- end
-
- describe 'GET #show' do
- it_behaves_like 'tracking unique visits', :index do
- let(:target_id) { 'i_analytics_instance_statistics' }
- end
- end
-end
diff --git a/spec/controllers/admin/usage_trends_controller_spec.rb b/spec/controllers/admin/usage_trends_controller_spec.rb
new file mode 100644
index 00000000000..35fb005aacb
--- /dev/null
+++ b/spec/controllers/admin/usage_trends_controller_spec.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Admin::UsageTrendsController do
+ let(:admin) { create(:user, :admin) }
+
+ before do
+ sign_in(admin)
+ end
+
+ describe 'GET #show' do
+ it_behaves_like 'tracking unique visits', :index do
+ let(:target_id) { 'i_analytics_instance_statistics' }
+ end
+ end
+end
diff --git a/spec/controllers/concerns/spammable_actions_spec.rb b/spec/controllers/concerns/spammable_actions_spec.rb
index 25d5398c9da..7bd5a76e60c 100644
--- a/spec/controllers/concerns/spammable_actions_spec.rb
+++ b/spec/controllers/concerns/spammable_actions_spec.rb
@@ -69,8 +69,11 @@ RSpec.describe SpammableActions do
end
context 'when spammable.render_recaptcha? is true' do
+ let(:spam_log) { instance_double(SpamLog, id: 123) }
+ let(:captcha_site_key) { 'abc123' }
+
before do
- expect(spammable).to receive(:render_recaptcha?) { true }
+ expect(spammable).to receive(:render_recaptcha?).at_least(:once) { true }
end
context 'when format is :html' do
@@ -83,24 +86,24 @@ RSpec.describe SpammableActions do
context 'when format is :json' do
let(:format) { :json }
- let(:recaptcha_html) { '<recaptcha-html/>' }
- it 'renders json with recaptcha_html' do
- expect(controller).to receive(:render_to_string).with(
- {
- partial: 'shared/recaptcha_form',
- formats: :html,
- locals: {
- spammable: spammable,
- script: false,
- has_submit: false
- }
- }
- ) { recaptcha_html }
+ before do
+ expect(spammable).to receive(:spam?) { false }
+ expect(spammable).to receive(:spam_log) { spam_log }
+ expect(Gitlab::CurrentSettings).to receive(:recaptcha_site_key) { captcha_site_key }
+ end
+ it 'renders json with spam_action_response_fields' do
subject
- expect(json_response).to eq({ 'recaptcha_html' => recaptcha_html })
+ expected_json_response = HashWithIndifferentAccess.new(
+ {
+ spam: false,
+ needs_captcha_response: true,
+ spam_log_id: spam_log.id,
+ captcha_site_key: captcha_site_key
+ })
+ expect(json_response).to eq(expected_json_response)
end
end
end
diff --git a/spec/controllers/explore/projects_controller_spec.rb b/spec/controllers/explore/projects_controller_spec.rb
index cfbd129388d..a2b62aa49d2 100644
--- a/spec/controllers/explore/projects_controller_spec.rb
+++ b/spec/controllers/explore/projects_controller_spec.rb
@@ -4,6 +4,8 @@ require 'spec_helper'
RSpec.describe Explore::ProjectsController do
shared_examples 'explore projects' do
+ let(:expected_default_sort) { 'latest_activity_desc' }
+
describe 'GET #index.json' do
render_views
@@ -12,6 +14,11 @@ RSpec.describe Explore::ProjectsController do
end
it { is_expected.to respond_with(:success) }
+
+ it 'sets a default sort parameter' do
+ expect(controller.params[:sort]).to eq(expected_default_sort)
+ expect(assigns[:sort]).to eq(expected_default_sort)
+ end
end
describe 'GET #trending.json' do
@@ -22,6 +29,11 @@ RSpec.describe Explore::ProjectsController do
end
it { is_expected.to respond_with(:success) }
+
+ it 'sets a default sort parameter' do
+ expect(controller.params[:sort]).to eq(expected_default_sort)
+ expect(assigns[:sort]).to eq(expected_default_sort)
+ end
end
describe 'GET #starred.json' do
@@ -32,6 +44,11 @@ RSpec.describe Explore::ProjectsController do
end
it { is_expected.to respond_with(:success) }
+
+ it 'sets a default sort parameter' do
+ expect(controller.params[:sort]).to eq(expected_default_sort)
+ expect(assigns[:sort]).to eq(expected_default_sort)
+ end
end
describe 'GET #trending' do
diff --git a/spec/controllers/groups/boards_controller_spec.rb b/spec/controllers/groups/boards_controller_spec.rb
index a7480130e0a..6201cddecb0 100644
--- a/spec/controllers/groups/boards_controller_spec.rb
+++ b/spec/controllers/groups/boards_controller_spec.rb
@@ -29,7 +29,7 @@ RSpec.describe Groups::BoardsController do
expect(Ability).to receive(:allowed?).with(user, :log_in, :global).and_call_original
allow(Ability).to receive(:allowed?).with(user, :read_cross_project, :global).and_return(true)
allow(Ability).to receive(:allowed?).with(user, :read_group, group).and_return(true)
- allow(Ability).to receive(:allowed?).with(user, :read_board, group).and_return(false)
+ allow(Ability).to receive(:allowed?).with(user, :read_issue_board, group).and_return(false)
end
it 'returns a not found 404 response' do
@@ -74,7 +74,7 @@ RSpec.describe Groups::BoardsController do
expect(Ability).to receive(:allowed?).with(user, :log_in, :global).and_call_original
allow(Ability).to receive(:allowed?).with(user, :read_cross_project, :global).and_return(true)
allow(Ability).to receive(:allowed?).with(user, :read_group, group).and_return(true)
- allow(Ability).to receive(:allowed?).with(user, :read_board, group).and_return(false)
+ allow(Ability).to receive(:allowed?).with(user, :read_issue_board, group).and_return(false)
end
it 'returns a not found 404 response' do
@@ -111,7 +111,7 @@ RSpec.describe Groups::BoardsController do
expect(Ability).to receive(:allowed?).with(user, :log_in, :global).and_call_original
allow(Ability).to receive(:allowed?).with(user, :read_cross_project, :global).and_return(true)
allow(Ability).to receive(:allowed?).with(user, :read_group, group).and_return(true)
- allow(Ability).to receive(:allowed?).with(user, :read_board, group).and_return(false)
+ allow(Ability).to receive(:allowed?).with(user, :read_issue_board, group).and_return(false)
end
it 'returns a not found 404 response' do
diff --git a/spec/controllers/groups/clusters/applications_controller_spec.rb b/spec/controllers/groups/clusters/applications_controller_spec.rb
index c3947c27399..5629e86c928 100644
--- a/spec/controllers/groups/clusters/applications_controller_spec.rb
+++ b/spec/controllers/groups/clusters/applications_controller_spec.rb
@@ -10,7 +10,8 @@ RSpec.describe Groups::Clusters::ApplicationsController do
end
shared_examples 'a secure endpoint' do
- it { expect { subject }.to be_allowed_for(:admin) }
+ it('is allowed for admin when admin mode is enabled', :enable_admin_mode) { expect { subject }.to be_allowed_for(:admin) }
+ it('is denied for admin when admin mode is disabled') { expect { subject }.to be_denied_for(:admin) }
it { expect { subject }.to be_allowed_for(:owner).of(group) }
it { expect { subject }.to be_allowed_for(:maintainer).of(group) }
it { expect { subject }.to be_denied_for(:developer).of(group) }
diff --git a/spec/controllers/groups/clusters_controller_spec.rb b/spec/controllers/groups/clusters_controller_spec.rb
index b287aca1e46..1334372a1f5 100644
--- a/spec/controllers/groups/clusters_controller_spec.rb
+++ b/spec/controllers/groups/clusters_controller_spec.rb
@@ -99,7 +99,8 @@ RSpec.describe Groups::ClustersController do
describe 'security' do
let(:cluster) { create(:cluster, :provided_by_gcp, cluster_type: :group_type, groups: [group]) }
- it { expect { go }.to be_allowed_for(:admin) }
+ it('is allowed for admin when admin mode is enabled', :enable_admin_mode) { expect { go }.to be_allowed_for(:admin) }
+ it('is denied for admin when admin mode is disabled') { expect { go }.to be_denied_for(:admin) }
it { expect { go }.to be_allowed_for(:owner).of(group) }
it { expect { go }.to be_allowed_for(:maintainer).of(group) }
it { expect { go }.to be_denied_for(:developer).of(group) }
@@ -183,7 +184,8 @@ RSpec.describe Groups::ClustersController do
include_examples 'GET new cluster shared examples'
describe 'security' do
- it { expect { go }.to be_allowed_for(:admin) }
+ it('is allowed for admin when admin mode is enabled', :enable_admin_mode) { expect { go }.to be_allowed_for(:admin) }
+ it('is denied for admin when admin mode is disabled') { expect { go }.to be_denied_for(:admin) }
it { expect { go }.to be_allowed_for(:owner).of(group) }
it { expect { go }.to be_allowed_for(:maintainer).of(group) }
it { expect { go }.to be_denied_for(:developer).of(group) }
@@ -316,7 +318,8 @@ RSpec.describe Groups::ClustersController do
allow(WaitForClusterCreationWorker).to receive(:perform_in).and_return(nil)
end
- it { expect { go }.to be_allowed_for(:admin) }
+ it('is allowed for admin when admin mode is enabled', :enable_admin_mode) { expect { go }.to be_allowed_for(:admin) }
+ it('is denied for admin when admin mode is disabled') { expect { go }.to be_denied_for(:admin) }
it { expect { go }.to be_allowed_for(:owner).of(group) }
it { expect { go }.to be_allowed_for(:maintainer).of(group) }
it { expect { go }.to be_denied_for(:developer).of(group) }
@@ -418,7 +421,8 @@ RSpec.describe Groups::ClustersController do
end
describe 'security' do
- it { expect { go }.to be_allowed_for(:admin) }
+ it('is allowed for admin when admin mode is enabled', :enable_admin_mode) { expect { go }.to be_allowed_for(:admin) }
+ it('is denied for admin when admin mode is disabled') { expect { go }.to be_denied_for(:admin) }
it { expect { go }.to be_allowed_for(:owner).of(group) }
it { expect { go }.to be_allowed_for(:maintainer).of(group) }
it { expect { go }.to be_denied_for(:developer).of(group) }
@@ -486,7 +490,8 @@ RSpec.describe Groups::ClustersController do
allow(WaitForClusterCreationWorker).to receive(:perform_in)
end
- it { expect { post_create_aws }.to be_allowed_for(:admin) }
+ it('is allowed for admin when admin mode is enabled', :enable_admin_mode) { expect { post_create_aws }.to be_allowed_for(:admin) }
+ it('is denied for admin when admin mode is disabled') { expect { post_create_aws }.to be_denied_for(:admin) }
it { expect { post_create_aws }.to be_allowed_for(:owner).of(group) }
it { expect { post_create_aws }.to be_allowed_for(:maintainer).of(group) }
it { expect { post_create_aws }.to be_denied_for(:developer).of(group) }
@@ -544,7 +549,8 @@ RSpec.describe Groups::ClustersController do
end
end
- it { expect { go }.to be_allowed_for(:admin) }
+ it('is allowed for admin when admin mode is enabled', :enable_admin_mode) { expect { go }.to be_allowed_for(:admin) }
+ it('is denied for admin when admin mode is disabled') { expect { go }.to be_denied_for(:admin) }
it { expect { go }.to be_allowed_for(:owner).of(group) }
it { expect { go }.to be_allowed_for(:maintainer).of(group) }
it { expect { go }.to be_denied_for(:developer).of(group) }
@@ -580,7 +586,8 @@ RSpec.describe Groups::ClustersController do
end
describe 'security' do
- it { expect { go }.to be_allowed_for(:admin) }
+ it('is allowed for admin when admin mode is enabled', :enable_admin_mode) { expect { go }.to be_allowed_for(:admin) }
+ it('is denied for admin when admin mode is disabled') { expect { go }.to be_denied_for(:admin) }
it { expect { go }.to be_allowed_for(:owner).of(group) }
it { expect { go }.to be_allowed_for(:maintainer).of(group) }
it { expect { go }.to be_denied_for(:developer).of(group) }
@@ -619,7 +626,8 @@ RSpec.describe Groups::ClustersController do
end
describe 'security' do
- it { expect { go }.to be_allowed_for(:admin) }
+ it('is allowed for admin when admin mode is enabled', :enable_admin_mode) { expect { go }.to be_allowed_for(:admin) }
+ it('is denied for admin when admin mode is disabled') { expect { go }.to be_denied_for(:admin) }
it { expect { go }.to be_allowed_for(:owner).of(group) }
it { expect { go }.to be_allowed_for(:maintainer).of(group) }
it { expect { go }.to be_denied_for(:developer).of(group) }
@@ -651,7 +659,8 @@ RSpec.describe Groups::ClustersController do
end
describe 'security' do
- it { expect { go }.to be_allowed_for(:admin) }
+ it('is allowed for admin when admin mode is enabled', :enable_admin_mode) { expect { go }.to be_allowed_for(:admin) }
+ it('is denied for admin when admin mode is disabled') { expect { go }.to be_denied_for(:admin) }
it { expect { go }.to be_allowed_for(:owner).of(group) }
it { expect { go }.to be_allowed_for(:maintainer).of(group) }
it { expect { go }.to be_denied_for(:developer).of(group) }
@@ -759,7 +768,8 @@ RSpec.describe Groups::ClustersController do
describe 'security' do
let_it_be(:cluster) { create(:cluster, :provided_by_gcp, cluster_type: :group_type, groups: [group]) }
- it { expect { go }.to be_allowed_for(:admin) }
+ it('is allowed for admin when admin mode is enabled', :enable_admin_mode) { expect { go }.to be_allowed_for(:admin) }
+ it('is denied for admin when admin mode is disabled') { expect { go }.to be_denied_for(:admin) }
it { expect { go }.to be_allowed_for(:owner).of(group) }
it { expect { go }.to be_allowed_for(:maintainer).of(group) }
it { expect { go }.to be_denied_for(:developer).of(group) }
@@ -827,7 +837,8 @@ RSpec.describe Groups::ClustersController do
describe 'security' do
let_it_be(:cluster) { create(:cluster, :provided_by_gcp, :production_environment, cluster_type: :group_type, groups: [group]) }
- it { expect { go }.to be_allowed_for(:admin) }
+ it('is allowed for admin when admin mode is enabled', :enable_admin_mode) { expect { go }.to be_allowed_for(:admin) }
+ it('is denied for admin when admin mode is disabled') { expect { go }.to be_denied_for(:admin) }
it { expect { go }.to be_allowed_for(:owner).of(group) }
it { expect { go }.to be_allowed_for(:maintainer).of(group) }
it { expect { go }.to be_denied_for(:developer).of(group) }
diff --git a/spec/controllers/groups/dependency_proxy_for_containers_controller_spec.rb b/spec/controllers/groups/dependency_proxy_for_containers_controller_spec.rb
index 39cbdfb9123..83775dcdbdf 100644
--- a/spec/controllers/groups/dependency_proxy_for_containers_controller_spec.rb
+++ b/spec/controllers/groups/dependency_proxy_for_containers_controller_spec.rb
@@ -130,7 +130,7 @@ RSpec.describe Groups::DependencyProxyForContainersController do
}
end
- it 'proxies status from the remote token request' do
+ it 'proxies status from the remote token request', :aggregate_failures do
subject
expect(response).to have_gitlab_http_status(:service_unavailable)
@@ -147,7 +147,7 @@ RSpec.describe Groups::DependencyProxyForContainersController do
}
end
- it 'proxies status from the remote manifest request' do
+ it 'proxies status from the remote manifest request', :aggregate_failures do
subject
expect(response).to have_gitlab_http_status(:bad_request)
@@ -156,7 +156,7 @@ RSpec.describe Groups::DependencyProxyForContainersController do
end
it 'sends a file' do
- expect(controller).to receive(:send_file).with(manifest.file.path, {})
+ expect(controller).to receive(:send_file).with(manifest.file.path, type: manifest.content_type)
subject
end
@@ -165,6 +165,10 @@ RSpec.describe Groups::DependencyProxyForContainersController do
subject
expect(response).to have_gitlab_http_status(:ok)
+ expect(response.headers['Docker-Content-Digest']).to eq(manifest.digest)
+ expect(response.headers['Content-Length']).to eq(manifest.size)
+ expect(response.headers['Docker-Distribution-Api-Version']).to eq(DependencyProxy::DISTRIBUTION_API_VERSION)
+ expect(response.headers['Etag']).to eq("\"#{manifest.digest}\"")
expect(response.headers['Content-Disposition']).to match(/^attachment/)
end
end
@@ -207,7 +211,7 @@ RSpec.describe Groups::DependencyProxyForContainersController do
}
end
- it 'proxies status from the remote blob request' do
+ it 'proxies status from the remote blob request', :aggregate_failures do
subject
expect(response).to have_gitlab_http_status(:bad_request)
@@ -221,7 +225,7 @@ RSpec.describe Groups::DependencyProxyForContainersController do
subject
end
- it 'returns Content-Disposition: attachment' do
+ it 'returns Content-Disposition: attachment', :aggregate_failures do
subject
expect(response).to have_gitlab_http_status(:ok)
diff --git a/spec/controllers/groups_controller_spec.rb b/spec/controllers/groups_controller_spec.rb
index 9e5f68820d9..cce61c4534b 100644
--- a/spec/controllers/groups_controller_spec.rb
+++ b/spec/controllers/groups_controller_spec.rb
@@ -4,17 +4,23 @@ require 'spec_helper'
RSpec.describe GroupsController, factory_default: :keep do
include ExternalAuthorizationServiceHelpers
+ include AdminModeHelper
let_it_be_with_refind(:group) { create_default(:group, :public) }
let_it_be_with_refind(:project) { create(:project, namespace: group) }
let_it_be(:user) { create(:user) }
- let_it_be(:admin) { create(:admin) }
+ let_it_be(:admin_with_admin_mode) { create(:admin) }
+ let_it_be(:admin_without_admin_mode) { create(:admin) }
let_it_be(:group_member) { create(:group_member, group: group, user: user) }
let_it_be(:owner) { group.add_owner(create(:user)).user }
let_it_be(:maintainer) { group.add_maintainer(create(:user)).user }
let_it_be(:developer) { group.add_developer(create(:user)).user }
let_it_be(:guest) { group.add_guest(create(:user)).user }
+ before do
+ enable_admin_mode!(admin_with_admin_mode)
+ end
+
shared_examples 'member with ability to create subgroups' do
it 'renders the new page' do
sign_in(member)
@@ -105,10 +111,10 @@ RSpec.describe GroupsController, factory_default: :keep do
[true, false].each do |can_create_group_status|
context "and can_create_group is #{can_create_group_status}" do
before do
- User.where(id: [admin, owner, maintainer, developer, guest]).update_all(can_create_group: can_create_group_status)
+ User.where(id: [admin_with_admin_mode, admin_without_admin_mode, owner, maintainer, developer, guest]).update_all(can_create_group: can_create_group_status)
end
- [:admin, :owner, :maintainer].each do |member_type|
+ [:admin_with_admin_mode, :owner, :maintainer].each do |member_type|
context "and logged in as #{member_type.capitalize}" do
it_behaves_like 'member with ability to create subgroups' do
let(:member) { send(member_type) }
@@ -116,7 +122,7 @@ RSpec.describe GroupsController, factory_default: :keep do
end
end
- [:guest, :developer].each do |member_type|
+ [:guest, :developer, :admin_without_admin_mode].each do |member_type|
context "and logged in as #{member_type.capitalize}" do
it_behaves_like 'member without ability to create subgroups' do
let(:member) { send(member_type) }
@@ -856,6 +862,12 @@ RSpec.describe GroupsController, factory_default: :keep do
end
describe 'POST #export' do
+ let(:admin) { create(:admin) }
+
+ before do
+ enable_admin_mode!(admin)
+ end
+
context 'when the group export feature flag is not enabled' do
before do
sign_in(admin)
@@ -918,6 +930,12 @@ RSpec.describe GroupsController, factory_default: :keep do
end
describe 'GET #download_export' do
+ let(:admin) { create(:admin) }
+
+ before do
+ enable_admin_mode!(admin)
+ end
+
context 'when there is a file available to download' do
let(:export_file) { fixture_file_upload('spec/fixtures/group_export.tar.gz') }
@@ -934,8 +952,6 @@ RSpec.describe GroupsController, factory_default: :keep do
end
context 'when there is no file available to download' do
- let(:admin) { create(:admin) }
-
before do
sign_in(admin)
end
diff --git a/spec/controllers/help_controller_spec.rb b/spec/controllers/help_controller_spec.rb
index 629d9b50d73..71d9cab7280 100644
--- a/spec/controllers/help_controller_spec.rb
+++ b/spec/controllers/help_controller_spec.rb
@@ -132,6 +132,18 @@ RSpec.describe HelpController do
expect(response).to redirect_to(new_user_session_path)
end
end
+
+ context 'when two factor is required' do
+ before do
+ stub_two_factor_required
+ end
+
+ it 'does not redirect to two factor auth' do
+ get :index
+
+ expect(response).not_to redirect_to(profile_two_factor_auth_path)
+ end
+ end
end
describe 'GET #show' do
@@ -152,6 +164,16 @@ RSpec.describe HelpController do
end
it_behaves_like 'documentation pages local render'
+
+ context 'when two factor is required' do
+ before do
+ stub_two_factor_required
+ end
+
+ it 'does not redirect to two factor auth' do
+ expect(response).not_to redirect_to(profile_two_factor_auth_path)
+ end
+ end
end
context 'when a custom help_page_documentation_url is set in database' do
@@ -254,4 +276,9 @@ RSpec.describe HelpController do
def stub_readme(content)
expect_file_read(Rails.root.join('doc', 'README.md'), content: content)
end
+
+ def stub_two_factor_required
+ allow(controller).to receive(:two_factor_authentication_required?).and_return(true)
+ allow(controller).to receive(:current_user_requires_two_factor?).and_return(true)
+ end
end
diff --git a/spec/controllers/import/bulk_imports_controller_spec.rb b/spec/controllers/import/bulk_imports_controller_spec.rb
index 08a54f112bb..b450318f6f7 100644
--- a/spec/controllers/import/bulk_imports_controller_spec.rb
+++ b/spec/controllers/import/bulk_imports_controller_spec.rb
@@ -123,7 +123,7 @@ RSpec.describe Import::BulkImportsController do
it 'denies network request' do
get :status
- expect(controller).to redirect_to(new_group_path)
+ expect(controller).to redirect_to(new_group_path(anchor: 'import-group-pane'))
expect(flash[:alert]).to eq('Specified URL cannot be used: "Only allowed schemes are http, https"')
end
end
@@ -184,9 +184,15 @@ RSpec.describe Import::BulkImportsController do
end
describe 'POST create' do
- let(:instance_url) { "http://fake-intance" }
+ let(:instance_url) { "http://fake-instance" }
let(:bulk_import) { create(:bulk_import) }
let(:pat) { "fake-pat" }
+ let(:bulk_import_params) do
+ [{ "source_type" => "group_entity",
+ "source_full_path" => "full_path",
+ "destination_name" => "destination_name",
+ "destination_namespace" => "root" }]
+ end
before do
session[:bulk_import_gitlab_access_token] = pat
@@ -194,15 +200,9 @@ RSpec.describe Import::BulkImportsController do
end
it 'executes BulkImportService' do
- bulk_import_params = [{ "source_type" => "group_entity",
- "source_full_path" => "full_path",
- "destination_name" =>
- "destination_name",
- "destination_namespace" => "root" }]
-
expect_next_instance_of(
BulkImportService, user, bulk_import_params, { url: instance_url, access_token: pat }) do |service|
- allow(service).to receive(:execute).and_return(bulk_import)
+ allow(service).to receive(:execute).and_return(ServiceResponse.success(payload: bulk_import))
end
post :create, params: { bulk_import: bulk_import_params }
@@ -210,6 +210,19 @@ RSpec.describe Import::BulkImportsController do
expect(response).to have_gitlab_http_status(:ok)
expect(response.body).to eq({ id: bulk_import.id }.to_json)
end
+
+ it 'returns error when validation fails' do
+ error_response = ServiceResponse.error(message: 'Record invalid', http_status: :unprocessable_entity)
+ expect_next_instance_of(
+ BulkImportService, user, bulk_import_params, { url: instance_url, access_token: pat }) do |service|
+ allow(service).to receive(:execute).and_return(error_response)
+ end
+
+ post :create, params: { bulk_import: bulk_import_params }
+
+ expect(response).to have_gitlab_http_status(:unprocessable_entity)
+ expect(response.body).to eq({ error: 'Record invalid' }.to_json)
+ end
end
end
diff --git a/spec/controllers/notification_settings_controller_spec.rb b/spec/controllers/notification_settings_controller_spec.rb
deleted file mode 100644
index c4d67df15f7..00000000000
--- a/spec/controllers/notification_settings_controller_spec.rb
+++ /dev/null
@@ -1,202 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe NotificationSettingsController do
- let(:project) { create(:project) }
- let(:group) { create(:group, :internal) }
- let(:user) { create(:user) }
-
- before do
- project.add_developer(user)
- end
-
- describe '#create' do
- context 'when not authorized' do
- it 'redirects to sign in page' do
- post :create,
- params: {
- project_id: project.id,
- notification_setting: { level: :participating }
- }
-
- expect(response).to redirect_to(new_user_session_path)
- end
- end
-
- context 'when authorized' do
- let(:notification_setting) { user.notification_settings_for(source) }
- let(:custom_events) do
- events = {}
-
- NotificationSetting.email_events(source).each do |event|
- events[event.to_s] = true
- end
-
- events
- end
-
- before do
- sign_in(user)
- end
-
- context 'for projects' do
- let(:source) { project }
-
- it 'creates notification setting' do
- post :create,
- params: {
- project_id: project.id,
- notification_setting: { level: :participating }
- }
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(notification_setting.level).to eq("participating")
- expect(notification_setting.user_id).to eq(user.id)
- expect(notification_setting.source_id).to eq(project.id)
- expect(notification_setting.source_type).to eq("Project")
- end
-
- context 'with custom settings' do
- it 'creates notification setting' do
- post :create,
- params: {
- project_id: project.id,
- notification_setting: { level: :custom }.merge(custom_events)
- }
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(notification_setting.level).to eq("custom")
-
- custom_events.each do |event, value|
- expect(notification_setting.event_enabled?(event)).to eq(value)
- end
- end
- end
- end
-
- context 'for groups' do
- let(:source) { group }
-
- it 'creates notification setting' do
- post :create,
- params: {
- namespace_id: group.id,
- notification_setting: { level: :watch }
- }
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(notification_setting.level).to eq("watch")
- expect(notification_setting.user_id).to eq(user.id)
- expect(notification_setting.source_id).to eq(group.id)
- expect(notification_setting.source_type).to eq("Namespace")
- end
-
- context 'with custom settings' do
- it 'creates notification setting' do
- post :create,
- params: {
- namespace_id: group.id,
- notification_setting: { level: :custom }.merge(custom_events)
- }
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(notification_setting.level).to eq("custom")
-
- custom_events.each do |event, value|
- expect(notification_setting.event_enabled?(event)).to eq(value)
- end
- end
- end
- end
- end
-
- context 'not authorized' do
- let(:private_project) { create(:project, :private) }
-
- before do
- sign_in(user)
- end
-
- it 'returns 404' do
- post :create,
- params: {
- project_id: private_project.id,
- notification_setting: { level: :participating }
- }
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
- end
-
- describe '#update' do
- let(:notification_setting) { user.global_notification_setting }
-
- context 'when not authorized' do
- it 'redirects to sign in page' do
- put :update,
- params: {
- id: notification_setting,
- notification_setting: { level: :participating }
- }
-
- expect(response).to redirect_to(new_user_session_path)
- end
- end
-
- context 'when authorized' do
- before do
- sign_in(user)
- end
-
- it 'returns success' do
- put :update,
- params: {
- id: notification_setting,
- notification_setting: { level: :participating }
- }
-
- expect(response).to have_gitlab_http_status(:ok)
- end
-
- context 'and setting custom notification setting' do
- let(:custom_events) do
- events = {}
-
- notification_setting.email_events.each do |event|
- events[event] = "true"
- end
- end
-
- it 'returns success' do
- put :update,
- params: {
- id: notification_setting,
- notification_setting: { level: :participating, events: custom_events }
- }
-
- expect(response).to have_gitlab_http_status(:ok)
- end
- end
- end
-
- context 'not authorized' do
- let(:other_user) { create(:user) }
-
- before do
- sign_in(other_user)
- end
-
- it 'returns 404' do
- put :update,
- params: {
- id: notification_setting,
- notification_setting: { level: :participating }
- }
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
- end
-end
diff --git a/spec/controllers/projects/blob_controller_spec.rb b/spec/controllers/projects/blob_controller_spec.rb
index 68551ce4858..c9a76049e19 100644
--- a/spec/controllers/projects/blob_controller_spec.rb
+++ b/spec/controllers/projects/blob_controller_spec.rb
@@ -20,8 +20,8 @@ RSpec.describe Projects::BlobController do
project.add_maintainer(user)
sign_in(user)
- stub_experiment(ci_syntax_templates: experiment_active)
- stub_experiment_for_subject(ci_syntax_templates: in_experiment_group)
+ stub_experiment(ci_syntax_templates_b: experiment_active)
+ stub_experiment_for_subject(ci_syntax_templates_b: in_experiment_group)
end
context 'when the experiment is not active' do
@@ -35,48 +35,62 @@ RSpec.describe Projects::BlobController do
end
end
- context 'when the experiment is active and the user is in the control group' do
+ context 'when the experiment is active' do
let(:experiment_active) { true }
- let(:in_experiment_group) { false }
-
- it 'records the experiment user in the control group' do
- expect(Experiment).to receive(:add_user)
- .with(:ci_syntax_templates, :control, user, namespace_id: project.namespace_id)
- request
- end
- end
+ context 'when the user is in the control group' do
+ let(:in_experiment_group) { false }
- context 'when the experiment is active and the user is in the experimental group' do
- let(:experiment_active) { true }
- let(:in_experiment_group) { true }
-
- it 'records the experiment user in the experimental group' do
- expect(Experiment).to receive(:add_user)
- .with(:ci_syntax_templates, :experimental, user, namespace_id: project.namespace_id)
+ it 'records the experiment user in the control group' do
+ expect(Experiment).to receive(:add_user)
+ .with(:ci_syntax_templates_b, :control, user, namespace_id: project.namespace_id)
- request
+ request
+ end
end
- context 'when requesting a non default config file type' do
- let(:file_name) { '.non_default_ci_config' }
- let(:project) { create(:project, :public, :repository, ci_config_path: file_name) }
+ context 'when the user is in the experimental group' do
+ let(:in_experiment_group) { true }
it 'records the experiment user in the experimental group' do
expect(Experiment).to receive(:add_user)
- .with(:ci_syntax_templates, :experimental, user, namespace_id: project.namespace_id)
+ .with(:ci_syntax_templates_b, :experimental, user, namespace_id: project.namespace_id)
request
end
- end
- context 'when requesting a different file type' do
- let(:file_name) { '.gitignore' }
+ context 'when requesting a non default config file type' do
+ let(:file_name) { '.non_default_ci_config' }
+ let(:project) { create(:project, :public, :repository, ci_config_path: file_name) }
- it 'does not record the experiment user' do
- expect(Experiment).not_to receive(:add_user)
+ it 'records the experiment user in the experimental group' do
+ expect(Experiment).to receive(:add_user)
+ .with(:ci_syntax_templates_b, :experimental, user, namespace_id: project.namespace_id)
- request
+ request
+ end
+ end
+
+ context 'when requesting a different file type' do
+ let(:file_name) { '.gitignore' }
+
+ it 'does not record the experiment user' do
+ expect(Experiment).not_to receive(:add_user)
+
+ request
+ end
+ end
+
+ context 'when the group is created longer than 90 days ago' do
+ before do
+ project.namespace.update_attribute(:created_at, 91.days.ago)
+ end
+
+ it 'does not record the experiment user' do
+ expect(Experiment).not_to receive(:add_user)
+
+ request
+ end
end
end
end
diff --git a/spec/controllers/projects/boards_controller_spec.rb b/spec/controllers/projects/boards_controller_spec.rb
index 1ed61e0990f..cde3a8d4761 100644
--- a/spec/controllers/projects/boards_controller_spec.rb
+++ b/spec/controllers/projects/boards_controller_spec.rb
@@ -34,7 +34,7 @@ RSpec.describe Projects::BoardsController do
before do
expect(Ability).to receive(:allowed?).with(user, :log_in, :global).and_call_original
allow(Ability).to receive(:allowed?).with(user, :read_project, project).and_return(true)
- allow(Ability).to receive(:allowed?).with(user, :read_board, project).and_return(false)
+ allow(Ability).to receive(:allowed?).with(user, :read_issue_board, project).and_return(false)
end
it 'returns a not found 404 response' do
@@ -78,7 +78,7 @@ RSpec.describe Projects::BoardsController do
before do
expect(Ability).to receive(:allowed?).with(user, :log_in, :global).and_call_original
allow(Ability).to receive(:allowed?).with(user, :read_project, project).and_return(true)
- allow(Ability).to receive(:allowed?).with(user, :read_board, project).and_return(false)
+ allow(Ability).to receive(:allowed?).with(user, :read_issue_board, project).and_return(false)
end
it 'returns a not found 404 response' do
@@ -134,7 +134,7 @@ RSpec.describe Projects::BoardsController do
before do
expect(Ability).to receive(:allowed?).with(user, :log_in, :global).and_call_original
allow(Ability).to receive(:allowed?).with(user, :read_project, project).and_return(true)
- allow(Ability).to receive(:allowed?).with(user, :read_board, project).and_return(false)
+ allow(Ability).to receive(:allowed?).with(user, :read_issue_board, project).and_return(false)
end
it 'returns a not found 404 response' do
@@ -172,7 +172,7 @@ RSpec.describe Projects::BoardsController do
before do
expect(Ability).to receive(:allowed?).with(user, :log_in, :global).and_call_original
allow(Ability).to receive(:allowed?).with(user, :read_project, project).and_return(true)
- allow(Ability).to receive(:allowed?).with(user, :read_board, project).and_return(false)
+ allow(Ability).to receive(:allowed?).with(user, :read_issue_board, project).and_return(false)
end
it 'returns a not found 404 response' do
diff --git a/spec/controllers/projects/branches_controller_spec.rb b/spec/controllers/projects/branches_controller_spec.rb
index 14a5e7da7d2..a99db2664a7 100644
--- a/spec/controllers/projects/branches_controller_spec.rb
+++ b/spec/controllers/projects/branches_controller_spec.rb
@@ -648,7 +648,9 @@ RSpec.describe Projects::BranchesController do
end
it 'sets active and stale branches' do
- expect(assigns[:active_branches]).to eq([])
+ expect(assigns[:active_branches].map(&:name)).not_to include(
+ "feature", "improve/awesome", "merge-test", "markdown", "feature_conflict", "'test'"
+ )
expect(assigns[:stale_branches].map(&:name)).to eq(
["feature", "improve/awesome", "merge-test", "markdown", "feature_conflict", "'test'"]
)
@@ -660,7 +662,9 @@ RSpec.describe Projects::BranchesController do
end
it 'sets active and stale branches' do
- expect(assigns[:active_branches]).to eq([])
+ expect(assigns[:active_branches].map(&:name)).not_to include(
+ "feature", "improve/awesome", "merge-test", "markdown", "feature_conflict", "'test'"
+ )
expect(assigns[:stale_branches].map(&:name)).to eq(
["feature", "improve/awesome", "merge-test", "markdown", "feature_conflict", "'test'"]
)
diff --git a/spec/controllers/projects/ci/daily_build_group_report_results_controller_spec.rb b/spec/controllers/projects/ci/daily_build_group_report_results_controller_spec.rb
index 81318b49cd9..3c4376909f8 100644
--- a/spec/controllers/projects/ci/daily_build_group_report_results_controller_spec.rb
+++ b/spec/controllers/projects/ci/daily_build_group_report_results_controller_spec.rb
@@ -4,29 +4,25 @@ require 'spec_helper'
RSpec.describe Projects::Ci::DailyBuildGroupReportResultsController do
describe 'GET index' do
- let(:project) { create(:project, :public, :repository) }
- let(:ref_path) { 'refs/heads/master' }
- let(:param_type) { 'coverage' }
- let(:start_date) { '2019-12-10' }
- let(:end_date) { '2020-03-09' }
- let(:allowed_to_read) { true }
- let(:user) { create(:user) }
- let(:feature_enabled?) { true }
+ let_it_be(:project) { create(:project, :public, :repository) }
+ let_it_be(:ref_path) { 'refs/heads/master' }
+ let_it_be(:param_type) { 'coverage' }
+ let_it_be(:start_date) { '2019-12-10' }
+ let_it_be(:end_date) { '2020-03-09' }
+ let_it_be(:allowed_to_read) { true }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:rspec_coverage_1) { create_daily_coverage('rspec', 79.0, '2020-03-09') }
+ let_it_be(:rspec_coverage_2) { create_daily_coverage('rspec', 77.0, '2020-03-08') }
+ let_it_be(:karma_coverage) { create_daily_coverage('karma', 81.0, '2019-12-10') }
+ let_it_be(:minitest_coverage) { create_daily_coverage('minitest', 67.0, '2019-12-09') }
+ let_it_be(:mocha_coverage) { create_daily_coverage('mocha', 71.0, '2019-12-09') }
before do
- create_daily_coverage('rspec', 79.0, '2020-03-09')
- create_daily_coverage('rspec', 77.0, '2020-03-08')
- create_daily_coverage('karma', 81.0, '2019-12-10')
- create_daily_coverage('minitest', 67.0, '2019-12-09')
- create_daily_coverage('mocha', 71.0, '2019-12-09')
-
sign_in(user)
allow(Ability).to receive(:allowed?).and_call_original
allow(Ability).to receive(:allowed?).with(user, :read_build_report_results, project).and_return(allowed_to_read)
- stub_feature_flags(coverage_data_new_finder: feature_enabled?)
-
get :index, params: {
namespace_id: project.namespace,
project_id: project,
@@ -140,33 +136,13 @@ RSpec.describe Projects::Ci::DailyBuildGroupReportResultsController do
context 'when format is JSON' do
let(:format) { :json }
- context 'when coverage_data_new_finder flag is enabled' do
- let(:feature_enabled?) { true }
-
- it_behaves_like 'JSON results'
- end
-
- context 'when coverage_data_new_finder flag is disabled' do
- let(:feature_enabled?) { false }
-
- it_behaves_like 'JSON results'
- end
+ it_behaves_like 'JSON results'
end
context 'when format is CSV' do
let(:format) { :csv }
- context 'when coverage_data_new_finder flag is enabled' do
- let(:feature_enabled?) { true }
-
- it_behaves_like 'CSV results'
- end
-
- context 'when coverage_data_new_finder flag is disabled' do
- let(:feature_enabled?) { false }
-
- it_behaves_like 'CSV results'
- end
+ it_behaves_like 'CSV results'
end
end
diff --git a/spec/controllers/projects/ci/pipeline_editor_controller_spec.rb b/spec/controllers/projects/ci/pipeline_editor_controller_spec.rb
index 1bf6ff95c44..942402a6d00 100644
--- a/spec/controllers/projects/ci/pipeline_editor_controller_spec.rb
+++ b/spec/controllers/projects/ci/pipeline_editor_controller_spec.rb
@@ -36,18 +36,5 @@ RSpec.describe Projects::Ci::PipelineEditorController do
expect(response).to have_gitlab_http_status(:not_found)
end
end
-
- context 'when ci_pipeline_editor_page feature flag is disabled' do
- before do
- stub_feature_flags(ci_pipeline_editor_page: false)
- project.add_developer(user)
-
- get :show, params: { namespace_id: project.namespace, project_id: project }
- end
-
- it 'responds with 404' do
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
end
end
diff --git a/spec/controllers/projects/compare_controller_spec.rb b/spec/controllers/projects/compare_controller_spec.rb
index 6aa4bfe235b..80a6d3960cd 100644
--- a/spec/controllers/projects/compare_controller_spec.rb
+++ b/spec/controllers/projects/compare_controller_spec.rb
@@ -3,8 +3,21 @@
require 'spec_helper'
RSpec.describe Projects::CompareController do
- let(:project) { create(:project, :repository) }
- let(:user) { create(:user) }
+ include ProjectForksHelper
+
+ using RSpec::Parameterized::TableSyntax
+
+ let_it_be(:project) { create(:project, :repository, :public) }
+ let_it_be(:user) { create(:user) }
+
+ let(:private_fork) { fork_project(project, nil, repository: true).tap { |fork| fork.update!(visibility: 'private') } }
+ let(:public_fork) do
+ fork_project(project, nil, repository: true).tap do |fork|
+ fork.update!(visibility: 'public')
+ # Create a reference that only exists in this project
+ fork.repository.create_ref('refs/heads/improve/awesome', 'refs/heads/improve/more-awesome')
+ end
+ end
before do
sign_in(user)
@@ -32,18 +45,20 @@ RSpec.describe Projects::CompareController do
{
namespace_id: project.namespace,
project_id: project,
- from: source_ref,
- to: target_ref,
+ from_project_id: from_project_id,
+ from: from_ref,
+ to: to_ref,
w: whitespace
}
end
let(:whitespace) { nil }
- context 'when the refs exist' do
+ context 'when the refs exist in the same project' do
context 'when we set the white space param' do
- let(:source_ref) { "08f22f25" }
- let(:target_ref) { "66eceea0" }
+ let(:from_project_id) { nil }
+ let(:from_ref) { '08f22f25' }
+ let(:to_ref) { '66eceea0' }
let(:whitespace) { 1 }
it 'shows some diffs with ignore whitespace change option' do
@@ -60,8 +75,9 @@ RSpec.describe Projects::CompareController do
end
context 'when we do not set the white space param' do
- let(:source_ref) { "improve%2Fawesome" }
- let(:target_ref) { "feature" }
+ let(:from_project_id) { nil }
+ let(:from_ref) { 'improve%2Fawesome' }
+ let(:to_ref) { 'feature' }
let(:whitespace) { nil }
it 'sets the diffs and commits ivars' do
@@ -74,9 +90,40 @@ RSpec.describe Projects::CompareController do
end
end
+ context 'when the refs exist in different projects that the user can see' do
+ let(:from_project_id) { public_fork.id }
+ let(:from_ref) { 'improve%2Fmore-awesome' }
+ let(:to_ref) { 'feature' }
+ let(:whitespace) { nil }
+
+ it 'shows the diff' do
+ show_request
+
+ expect(response).to be_successful
+ expect(assigns(:diffs).diff_files.first).not_to be_nil
+ expect(assigns(:commits).length).to be >= 1
+ end
+ end
+
+ context 'when the refs exist in different projects but the user cannot see' do
+ let(:from_project_id) { private_fork.id }
+ let(:from_ref) { 'improve%2Fmore-awesome' }
+ let(:to_ref) { 'feature' }
+ let(:whitespace) { nil }
+
+ it 'does not show the diff' do
+ show_request
+
+ expect(response).to be_successful
+ expect(assigns(:diffs)).to be_empty
+ expect(assigns(:commits)).to be_empty
+ end
+ end
+
context 'when the source ref does not exist' do
- let(:source_ref) { 'non-existent-source-ref' }
- let(:target_ref) { "feature" }
+ let(:from_project_id) { nil }
+ let(:from_ref) { 'non-existent-source-ref' }
+ let(:to_ref) { 'feature' }
it 'sets empty diff and commit ivars' do
show_request
@@ -88,8 +135,9 @@ RSpec.describe Projects::CompareController do
end
context 'when the target ref does not exist' do
- let(:target_ref) { 'non-existent-target-ref' }
- let(:source_ref) { "improve%2Fawesome" }
+ let(:from_project_id) { nil }
+ let(:from_ref) { 'improve%2Fawesome' }
+ let(:to_ref) { 'non-existent-target-ref' }
it 'sets empty diff and commit ivars' do
show_request
@@ -101,8 +149,9 @@ RSpec.describe Projects::CompareController do
end
context 'when the target ref is invalid' do
- let(:target_ref) { "master%' AND 2554=4423 AND '%'='" }
- let(:source_ref) { "improve%2Fawesome" }
+ let(:from_project_id) { nil }
+ let(:from_ref) { 'improve%2Fawesome' }
+ let(:to_ref) { "master%' AND 2554=4423 AND '%'='" }
it 'shows a flash message and redirects' do
show_request
@@ -113,8 +162,9 @@ RSpec.describe Projects::CompareController do
end
context 'when the source ref is invalid' do
- let(:source_ref) { "master%' AND 2554=4423 AND '%'='" }
- let(:target_ref) { "improve%2Fawesome" }
+ let(:from_project_id) { nil }
+ let(:from_ref) { "master%' AND 2554=4423 AND '%'='" }
+ let(:to_ref) { 'improve%2Fawesome' }
it 'shows a flash message and redirects' do
show_request
@@ -126,24 +176,33 @@ RSpec.describe Projects::CompareController do
end
describe 'GET diff_for_path' do
- def diff_for_path(extra_params = {})
- params = {
+ subject(:diff_for_path_request) { get :diff_for_path, params: request_params }
+
+ let(:request_params) do
+ {
+ from_project_id: from_project_id,
+ from: from_ref,
+ to: to_ref,
namespace_id: project.namespace,
- project_id: project
+ project_id: project,
+ old_path: old_path,
+ new_path: new_path
}
-
- get :diff_for_path, params: params.merge(extra_params)
end
let(:existing_path) { 'files/ruby/feature.rb' }
- let(:source_ref) { "improve%2Fawesome" }
- let(:target_ref) { "feature" }
- context 'when the source and target refs exist' do
+ let(:from_project_id) { nil }
+ let(:from_ref) { 'improve%2Fawesome' }
+ let(:to_ref) { 'feature' }
+ let(:old_path) { existing_path }
+ let(:new_path) { existing_path }
+
+ context 'when the source and target refs exist in the same project' do
context 'when the user has access target the project' do
context 'when the path exists in the diff' do
it 'disables diff notes' do
- diff_for_path(from: source_ref, to: target_ref, old_path: existing_path, new_path: existing_path)
+ diff_for_path_request
expect(assigns(:diff_notes_disabled)).to be_truthy
end
@@ -154,16 +213,17 @@ RSpec.describe Projects::CompareController do
meth.call(diffs)
end
- diff_for_path(from: source_ref, to: target_ref, old_path: existing_path, new_path: existing_path)
+ diff_for_path_request
end
end
context 'when the path does not exist in the diff' do
- before do
- diff_for_path(from: source_ref, to: target_ref, old_path: existing_path.succ, new_path: existing_path.succ)
- end
+ let(:old_path) { existing_path.succ }
+ let(:new_path) { existing_path.succ }
it 'returns a 404' do
+ diff_for_path_request
+
expect(response).to have_gitlab_http_status(:not_found)
end
end
@@ -172,31 +232,56 @@ RSpec.describe Projects::CompareController do
context 'when the user does not have access target the project' do
before do
project.team.truncate
- diff_for_path(from: source_ref, to: target_ref, old_path: existing_path, new_path: existing_path)
end
it 'returns a 404' do
+ diff_for_path_request
+
expect(response).to have_gitlab_http_status(:not_found)
end
end
end
- context 'when the source ref does not exist' do
- before do
- diff_for_path(from: source_ref.succ, to: target_ref, old_path: existing_path, new_path: existing_path)
+ context 'when the source and target refs exist in different projects and the user can see' do
+ let(:from_project_id) { public_fork.id }
+ let(:from_ref) { 'improve%2Fmore-awesome' }
+
+ it 'shows the diff for that path' do
+ expect(controller).to receive(:render_diff_for_path).and_wrap_original do |meth, diffs|
+ expect(diffs.diff_files.map(&:new_path)).to contain_exactly(existing_path)
+ meth.call(diffs)
+ end
+
+ diff_for_path_request
+ end
+ end
+
+ context 'when the source and target refs exist in different projects and the user cannot see' do
+ let(:from_project_id) { private_fork.id }
+
+ it 'does not show the diff for that path' do
+ diff_for_path_request
+
+ expect(response).to have_gitlab_http_status(:not_found)
end
+ end
+
+ context 'when the source ref does not exist' do
+ let(:from_ref) { 'this-ref-does-not-exist' }
it 'returns a 404' do
+ diff_for_path_request
+
expect(response).to have_gitlab_http_status(:not_found)
end
end
context 'when the target ref does not exist' do
- before do
- diff_for_path(from: source_ref, to: target_ref.succ, old_path: existing_path, new_path: existing_path)
- end
+ let(:to_ref) { 'this-ref-does-not-exist' }
it 'returns a 404' do
+ diff_for_path_request
+
expect(response).to have_gitlab_http_status(:not_found)
end
end
@@ -209,53 +294,54 @@ RSpec.describe Projects::CompareController do
{
namespace_id: project.namespace,
project_id: project,
- from: source_ref,
- to: target_ref
+ from_project_id: from_project_id,
+ from: from_ref,
+ to: to_ref
}
end
context 'when sending valid params' do
- let(:source_ref) { "improve%2Fawesome" }
- let(:target_ref) { "feature" }
+ let(:from_ref) { 'awesome%2Ffeature' }
+ let(:to_ref) { 'feature' }
- it 'redirects back to show' do
- create_request
-
- expect(response).to redirect_to(project_compare_path(project, to: target_ref, from: source_ref))
- end
- end
+ context 'without a from_project_id' do
+ let(:from_project_id) { nil }
- context 'when sending invalid params' do
- context 'when the source ref is empty and target ref is set' do
- let(:source_ref) { '' }
- let(:target_ref) { 'master' }
-
- it 'redirects back to index and preserves the target ref' do
+ it 'redirects to the show page' do
create_request
- expect(response).to redirect_to(project_compare_index_path(project, to: target_ref))
+ expect(response).to redirect_to(project_compare_path(project, from: from_ref, to: to_ref))
end
end
- context 'when the target ref is empty and source ref is set' do
- let(:source_ref) { 'master' }
- let(:target_ref) { '' }
+ context 'with a from_project_id' do
+ let(:from_project_id) { 'something or another' }
- it 'redirects back to index and preserves source ref' do
+ it 'redirects to the show page without interpreting from_project_id' do
create_request
- expect(response).to redirect_to(project_compare_index_path(project, from: source_ref))
+ expect(response).to redirect_to(project_compare_path(project, from: from_ref, to: to_ref, from_project_id: from_project_id))
end
end
+ end
+
+ context 'when sending invalid params' do
+ where(:from_ref, :to_ref, :from_project_id, :expected_redirect_params) do
+ '' | '' | '' | {}
+ 'main' | '' | '' | { from: 'main' }
+ '' | 'main' | '' | { to: 'main' }
+ '' | '' | '1' | { from_project_id: 1 }
+ 'main' | '' | '1' | { from: 'main', from_project_id: 1 }
+ '' | 'main' | '1' | { to: 'main', from_project_id: 1 }
+ end
- context 'when the target and source ref are empty' do
- let(:source_ref) { '' }
- let(:target_ref) { '' }
+ with_them do
+ let(:expected_redirect) { project_compare_index_path(project, expected_redirect_params) }
- it 'redirects back to index' do
+ it 'redirects back to the index' do
create_request
- expect(response).to redirect_to(namespace_project_compare_index_path)
+ expect(response).to redirect_to(expected_redirect)
end
end
end
@@ -268,15 +354,15 @@ RSpec.describe Projects::CompareController do
{
namespace_id: project.namespace,
project_id: project,
- from: source_ref,
- to: target_ref,
+ from: from_ref,
+ to: to_ref,
format: :json
}
end
context 'when the source and target refs exist' do
- let(:source_ref) { "improve%2Fawesome" }
- let(:target_ref) { "feature" }
+ let(:from_ref) { 'improve%2Fawesome' }
+ let(:to_ref) { 'feature' }
context 'when the user has access to the project' do
render_views
@@ -285,14 +371,14 @@ RSpec.describe Projects::CompareController do
let(:non_signature_commit) { build(:commit, project: project, safe_message: "message", sha: 'non_signature_commit') }
before do
- escaped_source_ref = Addressable::URI.unescape(source_ref)
- escaped_target_ref = Addressable::URI.unescape(target_ref)
+ escaped_from_ref = Addressable::URI.unescape(from_ref)
+ escaped_to_ref = Addressable::URI.unescape(to_ref)
- compare_service = CompareService.new(project, escaped_target_ref)
- compare = compare_service.execute(project, escaped_source_ref)
+ compare_service = CompareService.new(project, escaped_to_ref)
+ compare = compare_service.execute(project, escaped_from_ref)
- expect(CompareService).to receive(:new).with(project, escaped_target_ref).and_return(compare_service)
- expect(compare_service).to receive(:execute).with(project, escaped_source_ref).and_return(compare)
+ expect(CompareService).to receive(:new).with(project, escaped_to_ref).and_return(compare_service)
+ expect(compare_service).to receive(:execute).with(project, escaped_from_ref).and_return(compare)
expect(compare).to receive(:commits).and_return([signature_commit, non_signature_commit])
expect(non_signature_commit).to receive(:has_signature?).and_return(false)
@@ -313,6 +399,7 @@ RSpec.describe Projects::CompareController do
context 'when the user does not have access to the project' do
before do
project.team.truncate
+ project.update!(visibility: 'private')
end
it 'returns a 404' do
@@ -324,8 +411,8 @@ RSpec.describe Projects::CompareController do
end
context 'when the source ref does not exist' do
- let(:source_ref) { 'non-existent-ref-source' }
- let(:target_ref) { "feature" }
+ let(:from_ref) { 'non-existent-ref-source' }
+ let(:to_ref) { 'feature' }
it 'returns no signatures' do
signatures_request
@@ -336,8 +423,8 @@ RSpec.describe Projects::CompareController do
end
context 'when the target ref does not exist' do
- let(:target_ref) { 'non-existent-ref-target' }
- let(:source_ref) { "improve%2Fawesome" }
+ let(:from_ref) { 'improve%2Fawesome' }
+ let(:to_ref) { 'non-existent-ref-target' }
it 'returns no signatures' do
signatures_request
diff --git a/spec/controllers/projects/design_management/designs/raw_images_controller_spec.rb b/spec/controllers/projects/design_management/designs/raw_images_controller_spec.rb
index f664604ac15..e0f86876f67 100644
--- a/spec/controllers/projects/design_management/designs/raw_images_controller_spec.rb
+++ b/spec/controllers/projects/design_management/designs/raw_images_controller_spec.rb
@@ -37,13 +37,24 @@ RSpec.describe Projects::DesignManagement::Designs::RawImagesController do
# For security, .svg images should only ever be served with Content-Disposition: attachment.
# If this specs ever fails we must assess whether we should be serving svg images.
# See https://gitlab.com/gitlab-org/gitlab/issues/12771
- it 'serves files with `Content-Disposition: attachment`' do
+ it 'serves files with `Content-Disposition` header set to attachment plus the filename' do
subject
- expect(response.header['Content-Disposition']).to eq('attachment')
+ expect(response.header['Content-Disposition']).to match "attachment; filename=\"#{design.filename}\""
expect(response).to have_gitlab_http_status(:ok)
end
+ context 'when the feature flag attachment_with_filename is disabled' do
+ it 'serves files with just `attachment` in the disposition header' do
+ stub_feature_flags(attachment_with_filename: false)
+
+ subject
+
+ expect(response.header['Content-Disposition']).to eq('attachment')
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+
it 'serves files with Workhorse' do
subject
diff --git a/spec/controllers/projects/issues_controller_spec.rb b/spec/controllers/projects/issues_controller_spec.rb
index 81ffd2c4512..74062038248 100644
--- a/spec/controllers/projects/issues_controller_spec.rb
+++ b/spec/controllers/projects/issues_controller_spec.rb
@@ -9,6 +9,7 @@ RSpec.describe Projects::IssuesController do
let_it_be(:project, reload: true) { create(:project) }
let_it_be(:user, reload: true) { create(:user) }
let(:issue) { create(:issue, project: project) }
+ let(:spam_action_response_fields) { { 'stub_spam_action_response_fields' => true } }
describe "GET #index" do
context 'external issue tracker' do
@@ -613,12 +614,15 @@ RSpec.describe Projects::IssuesController do
context 'when allow_possible_spam feature flag is false' do
before do
stub_feature_flags(allow_possible_spam: false)
+ expect(controller).to(receive(:spam_action_response_fields).with(issue)) do
+ spam_action_response_fields
+ end
end
- it 'renders json with recaptcha_html' do
+ it 'renders json with spam_action_response_fields' do
subject
- expect(json_response).to have_key('recaptcha_html')
+ expect(json_response).to eq(spam_action_response_fields)
end
end
@@ -948,12 +952,17 @@ RSpec.describe Projects::IssuesController do
context 'renders properly' do
render_views
- it 'renders recaptcha_html json response' do
+ before do
+ expect(controller).to(receive(:spam_action_response_fields).with(issue)) do
+ spam_action_response_fields
+ end
+ end
+
+ it 'renders spam_action_response_fields json response' do
update_issue
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response).to have_key('recaptcha_html')
- expect(json_response['recaptcha_html']).not_to be_empty
+ expect(response).to have_gitlab_http_status(:conflict)
+ expect(json_response).to eq(spam_action_response_fields)
end
end
end
diff --git a/spec/controllers/projects/notes_controller_spec.rb b/spec/controllers/projects/notes_controller_spec.rb
index edebaf294c4..add249e2c74 100644
--- a/spec/controllers/projects/notes_controller_spec.rb
+++ b/spec/controllers/projects/notes_controller_spec.rb
@@ -150,7 +150,7 @@ RSpec.describe Projects::NotesController do
end
it 'returns an empty page of notes' do
- expect(Gitlab::EtagCaching::Middleware).to receive(:skip!)
+ expect(Gitlab::EtagCaching::Middleware).not_to receive(:skip!)
request.headers['X-Last-Fetched-At'] = microseconds(Time.zone.now)
@@ -169,8 +169,6 @@ RSpec.describe Projects::NotesController do
end
it 'returns all notes' do
- expect(Gitlab::EtagCaching::Middleware).to receive(:skip!)
-
get :index, params: request_params
expect(json_response['notes'].count).to eq((page_1 + page_2 + page_3).size + 1)
@@ -764,49 +762,9 @@ RSpec.describe Projects::NotesController do
end
end
- context 'when the endpoint receives requests above the limit' do
- before do
- stub_application_setting(notes_create_limit: 3)
- end
-
- it 'prevents from creating more notes', :request_store do
- 3.times { create! }
-
- expect { create! }
- .to change { Gitlab::GitalyClient.get_request_count }.by(0)
-
- create!
- expect(response.body).to eq(_('This endpoint has been requested too many times. Try again later.'))
- expect(response).to have_gitlab_http_status(:too_many_requests)
- end
-
- it 'logs the event in auth.log' do
- attributes = {
- message: 'Application_Rate_Limiter_Request',
- env: :notes_create_request_limit,
- remote_ip: '0.0.0.0',
- request_method: 'POST',
- path: "/#{project.full_path}/notes",
- user_id: user.id,
- username: user.username
- }
-
- expect(Gitlab::AuthLogger).to receive(:error).with(attributes).once
-
- project.add_developer(user)
- sign_in(user)
-
- 4.times { create! }
- end
-
- it 'allows user in allow-list to create notes, even if the case is different' do
- user.update_attribute(:username, user.username.titleize)
- stub_application_setting(notes_create_limit_allowlist: ["#{user.username.downcase}"])
- 3.times { create! }
-
- create!
- expect(response).to have_gitlab_http_status(:found)
- end
+ it_behaves_like 'request exceeding rate limit', :clean_gitlab_redis_cache do
+ let(:params) { request_params.except(:format) }
+ let(:request_full_path) { project_notes_path(project) }
end
end
diff --git a/spec/controllers/projects/snippets_controller_spec.rb b/spec/controllers/projects/snippets_controller_spec.rb
index f9221c5a4ef..793ffbbfad9 100644
--- a/spec/controllers/projects/snippets_controller_spec.rb
+++ b/spec/controllers/projects/snippets_controller_spec.rb
@@ -207,14 +207,14 @@ RSpec.describe Projects::SnippetsController do
subject
expect(assigns(:snippet)).to eq(project_snippet)
- expect(assigns(:blobs)).to eq(project_snippet.blobs)
+ expect(assigns(:blobs).map(&:name)).to eq(project_snippet.blobs.map(&:name))
expect(response).to have_gitlab_http_status(:ok)
end
it 'does not show the blobs expanded by default' do
subject
- expect(project_snippet.blobs.map(&:expanded?)).to be_all(false)
+ expect(assigns(:blobs).map(&:expanded?)).to be_all(false)
end
context 'when param expanded is set' do
@@ -223,7 +223,7 @@ RSpec.describe Projects::SnippetsController do
it 'shows all blobs expanded' do
subject
- expect(project_snippet.blobs.map(&:expanded?)).to be_all(true)
+ expect(assigns(:blobs).map(&:expanded?)).to be_all(true)
end
end
end
diff --git a/spec/controllers/projects/templates_controller_spec.rb b/spec/controllers/projects/templates_controller_spec.rb
index fe282baf769..bd299efb5b5 100644
--- a/spec/controllers/projects/templates_controller_spec.rb
+++ b/spec/controllers/projects/templates_controller_spec.rb
@@ -160,13 +160,28 @@ RSpec.describe Projects::TemplatesController do
end
shared_examples 'template names request' do
- it 'returns the template names' do
- get(:names, params: { namespace_id: project.namespace, template_type: template_type, project_id: project }, format: :json)
+ context 'when feature flag enabled' do
+ it 'returns the template names', :aggregate_failures do
+ get(:names, params: { namespace_id: project.namespace, template_type: template_type, project_id: project }, format: :json)
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response.size).to eq(2)
- expect(json_response.size).to eq(2)
- expect(json_response.map { |x| x.slice('name') }).to match(expected_template_names)
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['Project Templates'].size).to eq(2)
+ expect(json_response['Project Templates'].map { |x| x.slice('name') }).to match(expected_template_names)
+ end
+ end
+
+ context 'when feature flag disabled' do
+ before do
+ stub_feature_flags(inherited_issuable_templates: false)
+ end
+
+ it 'returns the template names', :aggregate_failures do
+ get(:names, params: { namespace_id: project.namespace, template_type: template_type, project_id: project }, format: :json)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response.size).to eq(2)
+ expect(json_response.map { |x| x.slice('name') }).to match(expected_template_names)
+ end
end
it 'fails for user with no access' do
diff --git a/spec/controllers/projects/web_ide_schemas_controller_spec.rb b/spec/controllers/projects/web_ide_schemas_controller_spec.rb
index fbec941aecc..136edd2f7ad 100644
--- a/spec/controllers/projects/web_ide_schemas_controller_spec.rb
+++ b/spec/controllers/projects/web_ide_schemas_controller_spec.rb
@@ -53,13 +53,13 @@ RSpec.describe Projects::WebIdeSchemasController do
end
context 'when an error occurs parsing the schema' do
- let(:result) { { status: :error, message: 'Some error occured' } }
+ let(:result) { { status: :error, message: 'Some error occurred' } }
it 'returns 422 with the error' do
subject
expect(response).to have_gitlab_http_status(:unprocessable_entity)
- expect(response.body).to eq('{"status":"error","message":"Some error occured"}')
+ expect(response.body).to eq('{"status":"error","message":"Some error occurred"}')
end
end
end
diff --git a/spec/controllers/projects_controller_spec.rb b/spec/controllers/projects_controller_spec.rb
index 1e4ec48b119..554487db8f2 100644
--- a/spec/controllers/projects_controller_spec.rb
+++ b/spec/controllers/projects_controller_spec.rb
@@ -221,6 +221,20 @@ RSpec.describe ProjectsController do
allow(controller).to receive(:record_experiment_user)
end
+ context 'when user can push to default branch' do
+ let(:user) { empty_project.owner }
+
+ it 'creates an "view_project_show" experiment tracking event', :snowplow do
+ allow_next_instance_of(ApplicationExperiment) do |e|
+ allow(e).to receive(:should_track?).and_return(true)
+ end
+
+ get :show, params: { namespace_id: empty_project.namespace, id: empty_project }
+
+ expect_snowplow_event(category: 'empty_repo_upload', action: 'view_project_show', context: [{ schema: 'iglu:com.gitlab/gitlab_experiment/jsonschema/0-3-0', data: anything }], property: 'empty')
+ end
+ end
+
User.project_views.keys.each do |project_view|
context "with #{project_view} view set" do
before do
@@ -416,7 +430,8 @@ RSpec.describe ProjectsController do
path: 'foo',
description: 'bar',
namespace_id: user.namespace.id,
- visibility_level: Gitlab::VisibilityLevel::PUBLIC
+ visibility_level: Gitlab::VisibilityLevel::PUBLIC,
+ initialize_with_readme: 1
}
end
@@ -425,9 +440,11 @@ RSpec.describe ProjectsController do
end
it 'tracks a created event for the new_project_readme experiment', :experiment do
- expect(experiment(:new_project_readme)).to track(:created, property: 'blank').on_any_instance.with_context(
- actor: user
- )
+ expect(experiment(:new_project_readme)).to track(
+ :created,
+ property: 'blank',
+ value: 1
+ ).on_any_instance.with_context(actor: user)
post :create, params: { project: project_params }
end
@@ -1345,6 +1362,14 @@ 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
+
+ it 'applies correct scope when throttling' do
+ expect(Gitlab::ApplicationRateLimiter)
+ .to receive(:throttled?)
+ .with(:project_download_export, scope: [user, project])
+
+ post action, params: { namespace_id: project.namespace, id: project }
+ end
end
end
end
diff --git a/spec/controllers/repositories/git_http_controller_spec.rb b/spec/controllers/repositories/git_http_controller_spec.rb
index d21f602f90c..4eede594bb9 100644
--- a/spec/controllers/repositories/git_http_controller_spec.rb
+++ b/spec/controllers/repositories/git_http_controller_spec.rb
@@ -54,14 +54,17 @@ RSpec.describe Repositories::GitHttpController do
}.from(0).to(1)
end
- it_behaves_like 'records an onboarding progress action', :git_read do
- let(:namespace) { project.namespace }
-
- subject { send_request }
+ describe 'recording the onboarding progress', :sidekiq_inline do
+ let_it_be(:namespace) { project.namespace }
before do
- stub_feature_flags(disable_git_http_fetch_writes: false)
+ OnboardingProgress.onboard(namespace)
+ send_request
end
+
+ subject { OnboardingProgress.completed?(namespace, :git_pull) }
+
+ it { is_expected.to be(true) }
end
context 'when disable_git_http_fetch_writes is enabled' do
@@ -75,12 +78,6 @@ RSpec.describe Repositories::GitHttpController do
send_request
end
-
- it 'does not record onboarding progress' do
- expect(OnboardingProgressService).not_to receive(:new)
-
- send_request
- end
end
end
end
diff --git a/spec/controllers/root_controller_spec.rb b/spec/controllers/root_controller_spec.rb
index 85f9ea66c5f..49841aa61d7 100644
--- a/spec/controllers/root_controller_spec.rb
+++ b/spec/controllers/root_controller_spec.rb
@@ -68,6 +68,18 @@ RSpec.describe RootController do
end
end
+ context 'who has customized their dashboard setting for followed user activities' do
+ before do
+ user.dashboard = 'followed_user_activity'
+ end
+
+ it 'redirects to the activity list' do
+ get :index
+
+ expect(response).to redirect_to activity_dashboard_path(filter: 'followed')
+ end
+ end
+
context 'who has customized their dashboard setting for groups' do
before do
user.dashboard = 'groups'
@@ -123,11 +135,7 @@ RSpec.describe RootController do
expect(response).to render_template 'dashboard/projects/index'
end
- context 'when experiment is enabled' do
- before do
- stub_experiment_for_subject(customize_homepage: true)
- end
-
+ context 'when customize_homepage is enabled' do
it 'renders the default dashboard' do
get :index
@@ -135,9 +143,9 @@ RSpec.describe RootController do
end
end
- context 'when experiment not enabled' do
+ context 'when customize_homepage is not enabled' do
before do
- stub_experiment(customize_homepage: false)
+ stub_feature_flags(customize_homepage: false)
end
it 'renders the default dashboard' do
diff --git a/spec/controllers/search_controller_spec.rb b/spec/controllers/search_controller_spec.rb
index 95cea10f0d0..32ac83847aa 100644
--- a/spec/controllers/search_controller_spec.rb
+++ b/spec/controllers/search_controller_spec.rb
@@ -252,6 +252,14 @@ RSpec.describe SearchController do
get :count, params: { search: 'hello' }
end.to raise_error(ActionController::ParameterMissing)
end
+
+ it 'sets private cache control headers' do
+ get :count, params: { search: 'hello', scope: 'projects' }
+
+ expect(response).to have_gitlab_http_status(:ok)
+
+ expect(response.headers['Cache-Control']).to include('max-age=60, private')
+ end
end
describe 'GET #autocomplete' do
@@ -261,23 +269,29 @@ RSpec.describe SearchController do
describe '#append_info_to_payload' do
it 'appends search metadata for logging' do
- last_payload = nil
- original_append_info_to_payload = controller.method(:append_info_to_payload)
-
- expect(controller).to receive(:append_info_to_payload) do |payload|
- original_append_info_to_payload.call(payload)
- last_payload = payload
+ expect(controller).to receive(:append_info_to_payload).and_wrap_original do |method, payload|
+ method.call(payload)
+
+ expect(payload[:metadata]['meta.search.group_id']).to eq('123')
+ expect(payload[:metadata]['meta.search.project_id']).to eq('456')
+ expect(payload[:metadata]).not_to have_key('meta.search.search')
+ expect(payload[:metadata]['meta.search.scope']).to eq('issues')
+ expect(payload[:metadata]['meta.search.force_search_results']).to eq('true')
+ expect(payload[:metadata]['meta.search.filters.confidential']).to eq('true')
+ expect(payload[:metadata]['meta.search.filters.state']).to eq('true')
end
get :show, params: { scope: 'issues', search: 'hello world', group_id: '123', project_id: '456', confidential: true, state: true, force_search_results: true }
+ end
+
+ it 'appends the default scope in meta.search.scope' do
+ expect(controller).to receive(:append_info_to_payload).and_wrap_original do |method, payload|
+ method.call(payload)
+
+ expect(payload[:metadata]['meta.search.scope']).to eq('projects')
+ end
- expect(last_payload[:metadata]['meta.search.group_id']).to eq('123')
- expect(last_payload[:metadata]['meta.search.project_id']).to eq('456')
- expect(last_payload[:metadata]).not_to have_key('meta.search.search')
- expect(last_payload[:metadata]['meta.search.scope']).to eq('issues')
- expect(last_payload[:metadata]['meta.search.force_search_results']).to eq('true')
- expect(last_payload[:metadata]['meta.search.filters.confidential']).to eq('true')
- expect(last_payload[:metadata]['meta.search.filters.state']).to eq('true')
+ get :show, params: { search: 'hello world', group_id: '123', project_id: '456' }
end
end
end
diff --git a/spec/controllers/snippets/notes_controller_spec.rb b/spec/controllers/snippets/notes_controller_spec.rb
index 487635169fc..558e68fbb8f 100644
--- a/spec/controllers/snippets/notes_controller_spec.rb
+++ b/spec/controllers/snippets/notes_controller_spec.rb
@@ -141,6 +141,11 @@ RSpec.describe Snippets::NotesController do
it 'creates the note' do
expect { post :create, params: request_params }.to change { Note.count }.by(1)
end
+
+ it_behaves_like 'request exceeding rate limit', :clean_gitlab_redis_cache do
+ let(:params) { request_params }
+ let(:request_full_path) { snippet_notes_path(public_snippet) }
+ end
end
context 'when a snippet is internal' do
@@ -164,6 +169,11 @@ RSpec.describe Snippets::NotesController do
it 'creates the note' do
expect { post :create, params: request_params }.to change { Note.count }.by(1)
end
+
+ it_behaves_like 'request exceeding rate limit', :clean_gitlab_redis_cache do
+ let(:params) { request_params }
+ let(:request_full_path) { snippet_notes_path(internal_snippet) }
+ end
end
context 'when a snippet is private' do
@@ -228,6 +238,12 @@ RSpec.describe Snippets::NotesController do
it 'creates the note' do
expect { post :create, params: request_params }.to change { Note.count }.by(1)
end
+
+ it_behaves_like 'request exceeding rate limit', :clean_gitlab_redis_cache do
+ let(:params) { request_params }
+ let(:request_full_path) { snippet_notes_path(private_snippet) }
+ let(:user) { private_snippet.author }
+ end
end
end
end
diff --git a/spec/db/schema_spec.rb b/spec/db/schema_spec.rb
index b2c77a06f19..d292ba60a12 100644
--- a/spec/db/schema_spec.rb
+++ b/spec/db/schema_spec.rb
@@ -87,7 +87,8 @@ RSpec.describe 'Database schema' do
users_star_projects: %w[user_id],
vulnerability_identifiers: %w[external_id],
vulnerability_scanners: %w[external_id],
- web_hooks: %w[group_id]
+ web_hooks: %w[group_id],
+ web_hook_logs_part_0c5294f417: %w[web_hook_id]
}.with_indifferent_access.freeze
context 'for table' do
@@ -102,7 +103,12 @@ RSpec.describe 'Database schema' do
context 'all foreign keys' do
# for index to be effective, the FK constraint has to be at first place
it 'are indexed' do
- first_indexed_column = indexes.map(&:columns).map(&:first)
+ first_indexed_column = indexes.map(&:columns).map do |columns|
+ # In cases of complex composite indexes, a string is returned eg:
+ # "lower((extern_uid)::text), group_id"
+ columns = columns.split(',') if columns.is_a?(String)
+ columns.first.chomp
+ end
foreign_keys_columns = foreign_keys.map(&:column)
# Add the primary key column to the list of indexed columns because
diff --git a/spec/deprecation_toolkit_env.rb b/spec/deprecation_toolkit_env.rb
index 10eaaf13aaa..f4ead6d5f01 100644
--- a/spec/deprecation_toolkit_env.rb
+++ b/spec/deprecation_toolkit_env.rb
@@ -61,6 +61,7 @@ module DeprecationToolkitEnv
batch-loader-1.4.0/lib/batch_loader/graphql.rb
carrierwave-1.3.1/lib/carrierwave/sanitized_file.rb
activerecord-6.0.3.4/lib/active_record/relation.rb
+ selenium-webdriver-3.142.7/lib/selenium/webdriver/firefox/driver.rb
asciidoctor-2.0.12/lib/asciidoctor/extensions.rb
]
end
diff --git a/spec/experiments/application_experiment/cache_spec.rb b/spec/experiments/application_experiment/cache_spec.rb
deleted file mode 100644
index 4caa91e6ac4..00000000000
--- a/spec/experiments/application_experiment/cache_spec.rb
+++ /dev/null
@@ -1,54 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe ApplicationExperiment::Cache do
- let(:key_name) { 'experiment_name' }
- let(:field_name) { 'abc123' }
- let(:key_field) { [key_name, field_name].join(':') }
- let(:shared_state) { Gitlab::Redis::SharedState }
-
- around do |example|
- shared_state.with { |r| r.del(key_name) }
- example.run
- shared_state.with { |r| r.del(key_name) }
- end
-
- it "allows reading, writing and deleting", :aggregate_failures do
- # we test them all together because they are largely interdependent
-
- expect(subject.read(key_field)).to be_nil
- expect(shared_state.with { |r| r.hget(key_name, field_name) }).to be_nil
-
- subject.write(key_field, 'value')
-
- expect(subject.read(key_field)).to eq('value')
- expect(shared_state.with { |r| r.hget(key_name, field_name) }).to eq('value')
-
- subject.delete(key_field)
-
- expect(subject.read(key_field)).to be_nil
- expect(shared_state.with { |r| r.hget(key_name, field_name) }).to be_nil
- end
-
- it "handles the fetch with a block behavior (which is read/write)" do
- expect(subject.fetch(key_field) { 'value1' }).to eq('value1') # rubocop:disable Style/RedundantFetchBlock
- expect(subject.fetch(key_field) { 'value2' }).to eq('value1') # rubocop:disable Style/RedundantFetchBlock
- end
-
- it "can clear a whole experiment cache key" do
- subject.write(key_field, 'value')
- subject.clear(key: key_field)
-
- expect(shared_state.with { |r| r.get(key_name) }).to be_nil
- end
-
- it "doesn't allow clearing a key from the cache that's not a hash (definitely not an experiment)" do
- shared_state.with { |r| r.set(key_name, 'value') }
-
- expect { subject.clear(key: key_name) }.to raise_error(
- ArgumentError,
- 'invalid call to clear a non-hash cache key'
- )
- end
-end
diff --git a/spec/experiments/application_experiment_spec.rb b/spec/experiments/application_experiment_spec.rb
index 501d344e920..1a0f35846fe 100644
--- a/spec/experiments/application_experiment_spec.rb
+++ b/spec/experiments/application_experiment_spec.rb
@@ -61,27 +61,26 @@ RSpec.describe ApplicationExperiment, :experiment do
it "tracks the assignment" do
expect(subject).to receive(:track).with(:assignment)
- subject.publish(nil)
- end
-
- it "pushes the experiment knowledge into the client using Gon.global" do
- expect(Gon.global).to receive(:push).with(
- {
- experiment: {
- 'namespaced/stub' => { # string key because it can be namespaced
- experiment: 'namespaced/stub',
- key: '86208ac54ca798e11f127e8b23ec396a',
- variant: 'control'
- }
- }
- },
- true
- )
+ subject.publish
+ end
+
+ it "pushes the experiment knowledge into the client using Gon" do
+ expect(Gon).to receive(:push).with({ experiment: { 'namespaced/stub' => subject.signature } }, true)
+
+ subject.publish
+ end
+
+ it "handles when Gon raises exceptions (like when it can't be pushed into)" do
+ expect(Gon).to receive(:push).and_raise(NoMethodError)
- subject.publish(nil)
+ expect { subject.publish }.not_to raise_error
end
end
+ it "can exclude from within the block" do
+ expect(described_class.new('namespaced/stub') { |e| e.exclude! }).to be_excluded
+ end
+
describe "tracking events", :snowplow do
it "doesn't track if we shouldn't track" do
allow(subject).to receive(:should_track?).and_return(false)
@@ -191,15 +190,15 @@ RSpec.describe ApplicationExperiment, :experiment do
end
context "when caching" do
- let(:cache) { ApplicationExperiment::Cache.new }
+ let(:cache) { Gitlab::Experiment::Configuration.cache }
before do
+ allow(Gitlab::Experiment::Configuration).to receive(:cache).and_call_original
+
cache.clear(key: subject.name)
subject.use { } # setup the control
subject.try { } # setup the candidate
-
- allow(Gitlab::Experiment::Configuration).to receive(:cache).and_return(cache)
end
it "caches the variant determined by the variant resolver" do
@@ -207,7 +206,7 @@ RSpec.describe ApplicationExperiment, :experiment do
subject.run
- expect(cache.read(subject.cache_key)).to eq('candidate')
+ expect(subject.cache.read).to eq('candidate')
end
it "doesn't cache a variant if we don't explicitly provide one" do
@@ -222,7 +221,7 @@ RSpec.describe ApplicationExperiment, :experiment do
subject.run
- expect(cache.read(subject.cache_key)).to be_nil
+ expect(subject.cache.read).to be_nil
end
it "caches a control variant if we assign it specifically" do
@@ -232,7 +231,26 @@ RSpec.describe ApplicationExperiment, :experiment do
# write code that would specify a different variant.
subject.run(:control)
- expect(cache.read(subject.cache_key)).to eq('control')
+ expect(subject.cache.read).to eq('control')
+ end
+
+ context "arbitrary attributes" do
+ before do
+ subject.cache.store.clear(key: subject.name + '_attrs')
+ end
+
+ it "sets and gets attributes about an experiment" do
+ subject.cache.attr_set(:foo, :bar)
+
+ expect(subject.cache.attr_get(:foo)).to eq('bar')
+ end
+
+ it "increments a value for an experiment" do
+ expect(subject.cache.attr_get(:foo)).to be_nil
+
+ expect(subject.cache.attr_inc(:foo)).to eq(1)
+ expect(subject.cache.attr_inc(:foo)).to eq(2)
+ end
end
end
end
diff --git a/spec/factories/alert_management/alerts.rb b/spec/factories/alert_management/alerts.rb
index e36e4c38013..ee1225b9542 100644
--- a/spec/factories/alert_management/alerts.rb
+++ b/spec/factories/alert_management/alerts.rb
@@ -47,10 +47,6 @@ FactoryBot.define do
hosts { [FFaker::Internet.ip_v4_address] }
end
- trait :with_ended_at do
- ended_at { Time.current }
- end
-
trait :without_ended_at do
ended_at { nil }
end
@@ -67,7 +63,7 @@ FactoryBot.define do
trait :resolved do
status { AlertManagement::Alert.status_value(:resolved) }
- with_ended_at
+ ended_at { Time.current }
end
trait :ignored do
diff --git a/spec/factories/analytics/instance_statistics/measurement.rb b/spec/factories/analytics/instance_statistics/measurement.rb
deleted file mode 100644
index f9398cd3061..00000000000
--- a/spec/factories/analytics/instance_statistics/measurement.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# frozen_string_literal: true
-
-FactoryBot.define do
- factory :instance_statistics_measurement, class: 'Analytics::InstanceStatistics::Measurement' do
- recorded_at { Time.now }
- identifier { :projects }
- count { 1_000 }
-
- trait :project_count do
- identifier { :projects }
- end
-
- trait :group_count do
- identifier { :groups }
- end
-
- trait :pipelines_succeeded_count do
- identifier { :pipelines_succeeded }
- end
-
- trait :pipelines_skipped_count do
- identifier { :pipelines_skipped }
- end
- end
-end
diff --git a/spec/factories/analytics/usage_trends/measurement.rb b/spec/factories/analytics/usage_trends/measurement.rb
new file mode 100644
index 00000000000..ec80174e967
--- /dev/null
+++ b/spec/factories/analytics/usage_trends/measurement.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :usage_trends_measurement, class: 'Analytics::UsageTrends::Measurement' do
+ recorded_at { Time.now }
+ identifier { :projects }
+ count { 1_000 }
+
+ trait :project_count do
+ identifier { :projects }
+ end
+
+ trait :group_count do
+ identifier { :groups }
+ end
+
+ trait :pipelines_succeeded_count do
+ identifier { :pipelines_succeeded }
+ end
+
+ trait :pipelines_skipped_count do
+ identifier { :pipelines_skipped }
+ end
+ end
+end
diff --git a/spec/factories/ci/build_trace_chunks.rb b/spec/factories/ci/build_trace_chunks.rb
index d996b41b648..115eb32111c 100644
--- a/spec/factories/ci/build_trace_chunks.rb
+++ b/spec/factories/ci/build_trace_chunks.rb
@@ -3,7 +3,7 @@
FactoryBot.define do
factory :ci_build_trace_chunk, class: 'Ci::BuildTraceChunk' do
build factory: :ci_build
- chunk_index { 0 }
+ chunk_index { generate(:iid) }
data_store { :redis }
trait :redis_with_data do
diff --git a/spec/factories/ci/builds.rb b/spec/factories/ci/builds.rb
index c4f9a4ce82b..886be520668 100644
--- a/spec/factories/ci/builds.rb
+++ b/spec/factories/ci/builds.rb
@@ -475,7 +475,7 @@ FactoryBot.define do
trait :license_scanning do
options do
{
- artifacts: { reports: { license_management: 'gl-license-scanning-report.json' } }
+ artifacts: { reports: { license_scanning: 'gl-license-scanning-report.json' } }
}
end
end
diff --git a/spec/factories/ci/pipelines.rb b/spec/factories/ci/pipelines.rb
index e0d7ad3c133..87b9a6c0e23 100644
--- a/spec/factories/ci/pipelines.rb
+++ b/spec/factories/ci/pipelines.rb
@@ -40,6 +40,10 @@ FactoryBot.define do
end
end
+ trait :created do
+ status { :created }
+ end
+
factory :ci_pipeline do
transient { ci_ref_presence { true } }
@@ -53,10 +57,6 @@ FactoryBot.define do
failure_reason { :config_error }
end
- trait :created do
- status { :created }
- end
-
trait :preparing do
status { :preparing }
end
diff --git a/spec/factories/clusters/agent_tokens.rb b/spec/factories/clusters/agent_tokens.rb
index 6f92f2217b3..c49d197c3cd 100644
--- a/spec/factories/clusters/agent_tokens.rb
+++ b/spec/factories/clusters/agent_tokens.rb
@@ -5,5 +5,7 @@ FactoryBot.define do
association :agent, factory: :cluster_agent
token_encrypted { Gitlab::CryptoHelper.aes256_gcm_encrypt(SecureRandom.hex(50)) }
+
+ sequence(:name) { |n| "agent-token-#{n}" }
end
end
diff --git a/spec/factories/custom_emoji.rb b/spec/factories/custom_emoji.rb
index ba1ae11c18d..88e50eafa7c 100644
--- a/spec/factories/custom_emoji.rb
+++ b/spec/factories/custom_emoji.rb
@@ -6,5 +6,6 @@ FactoryBot.define do
namespace
group
file { 'https://gitlab.com/images/partyparrot.png' }
+ creator { namespace.owner }
end
end
diff --git a/spec/factories/dependency_proxy.rb b/spec/factories/dependency_proxy.rb
index de95df19876..94a7986a8fa 100644
--- a/spec/factories/dependency_proxy.rb
+++ b/spec/factories/dependency_proxy.rb
@@ -10,7 +10,8 @@ FactoryBot.define do
factory :dependency_proxy_manifest, class: 'DependencyProxy::Manifest' do
group
file { fixture_file_upload('spec/fixtures/dependency_proxy/manifest') }
- digest { 'sha256:5ab5a6872b264fe4fd35d63991b9b7d8425f4bc79e7cf4d563c10956581170c9' }
+ digest { 'sha256:d0710affa17fad5f466a70159cc458227bd25d4afb39514ef662ead3e6c99515' }
file_name { 'alpine:latest.json' }
+ content_type { 'application/vnd.docker.distribution.manifest.v2+json' }
end
end
diff --git a/spec/factories/design_management/versions.rb b/spec/factories/design_management/versions.rb
index 0233a3b567d..247a385bd0e 100644
--- a/spec/factories/design_management/versions.rb
+++ b/spec/factories/design_management/versions.rb
@@ -13,11 +13,6 @@ FactoryBot.define do
deleted_designs { [] }
end
- # Warning: this will intentionally result in an invalid version!
- trait :empty do
- designs_count { 0 }
- end
-
trait :importing do
issue { nil }
diff --git a/spec/factories/environments.rb b/spec/factories/environments.rb
index 050cb8f8e6c..12710b6dcf3 100644
--- a/spec/factories/environments.rb
+++ b/spec/factories/environments.rb
@@ -15,6 +15,22 @@ FactoryBot.define do
state { :stopped }
end
+ trait :production do
+ tier { :production }
+ end
+
+ trait :staging do
+ tier { :staging }
+ end
+
+ trait :testing do
+ tier { :testing }
+ end
+
+ trait :development do
+ tier { :development }
+ end
+
trait :with_review_app do |environment|
transient do
ref { 'master' }
diff --git a/spec/factories/gitlab/database/background_migration/batched_jobs.rb b/spec/factories/gitlab/database/background_migration/batched_jobs.rb
new file mode 100644
index 00000000000..52bc04447da
--- /dev/null
+++ b/spec/factories/gitlab/database/background_migration/batched_jobs.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :batched_background_migration_job, class: '::Gitlab::Database::BackgroundMigration::BatchedJob' do
+ batched_migration factory: :batched_background_migration
+
+ min_value { 1 }
+ max_value { 10 }
+ batch_size { 5 }
+ sub_batch_size { 1 }
+ end
+end
diff --git a/spec/factories/gitlab/database/background_migration/batched_migrations.rb b/spec/factories/gitlab/database/background_migration/batched_migrations.rb
new file mode 100644
index 00000000000..b45f6ff037b
--- /dev/null
+++ b/spec/factories/gitlab/database/background_migration/batched_migrations.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :batched_background_migration, class: '::Gitlab::Database::BackgroundMigration::BatchedMigration' do
+ max_value { 10 }
+ batch_size { 5 }
+ sub_batch_size { 1 }
+ interval { 2.minutes }
+ job_class_name { 'CopyColumnUsingBackgroundMigrationJob' }
+ table_name { :events }
+ column_name { :id }
+ end
+end
diff --git a/spec/factories/go_module_commits.rb b/spec/factories/go_module_commits.rb
index e42ef6696d1..514a5559344 100644
--- a/spec/factories/go_module_commits.rb
+++ b/spec/factories/go_module_commits.rb
@@ -7,7 +7,12 @@ FactoryBot.define do
transient do
files { { 'foo.txt' => 'content' } }
message { 'Message' }
+ # rubocop: disable FactoryBot/InlineAssociation
+ # We need a persisted project so we can create commits and tags
+ # in `commit` otherwise linting this factory with `build` strategy
+ # will fail.
project { create(:project, :repository) }
+ # rubocop: enable FactoryBot/InlineAssociation
service do
Files::MultiService.new(
@@ -44,14 +49,13 @@ FactoryBot.define do
trait :files do
transient do
- files { raise ArgumentError.new("files is required") }
message { 'Add files' }
end
end
trait :package do
transient do
- path { raise ArgumentError.new("path is required") }
+ path { 'pkg' }
message { 'Add package' }
files { { "#{path}/b.go" => "package b\nfunc Bye() { println(\"Goodbye world!\") }\n" } }
end
@@ -64,7 +68,7 @@ FactoryBot.define do
host_prefix { "#{::Gitlab.config.gitlab.host}/#{project.path_with_namespace}" }
url { name ? "#{host_prefix}/#{name}" : host_prefix }
- path { name.to_s + '/' }
+ path { "#{name}/" }
files do
{
diff --git a/spec/factories/go_module_versions.rb b/spec/factories/go_module_versions.rb
index b0a96197350..145e6c95921 100644
--- a/spec/factories/go_module_versions.rb
+++ b/spec/factories/go_module_versions.rb
@@ -8,12 +8,12 @@ FactoryBot.define do
p = attributes[:params]
s = Packages::SemVer.parse(p.semver, prefixed: true)
- raise ArgumentError.new("invalid sematic version: '#{p.semver}''") if !s && p.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)
end
- mod { create :go_module }
+ mod { association(:go_module) }
type { :commit }
commit { mod.project.repository.head_commit }
name { nil }
@@ -33,45 +33,11 @@ FactoryBot.define do
mod.project.repository.tags
.filter { |t| Packages::SemVer.match?(t.name, prefixed: true) }
.map { |t| Packages::SemVer.parse(t.name, prefixed: true) }
- .max { |a, b| "#{a}" <=> "#{b}" }
+ .max_by(&:to_s)
.to_s
end
params { OpenStruct.new(mod: mod, type: :ref, commit: commit, semver: name, ref: ref) }
end
-
- trait :pseudo do
- transient do
- prefix do
- # This provides a sane default value, but in reality the caller should
- # specify `prefix:`
-
- # This does not take into account that `commit` may be before the
- # latest tag.
-
- # Find 'latest' semver tag (does not actually use semver precedence rules)
- v = mod.project.repository.tags
- .filter { |t| Packages::SemVer.match?(t.name, prefixed: true) }
- .map { |t| Packages::SemVer.parse(t.name, prefixed: true) }
- .max { |a, b| "#{a}" <=> "#{b}" }
-
- # Default if no semver tags exist
- next 'v0.0.0' unless v
-
- # Valid pseudo-versions are:
- # vX.0.0-yyyymmddhhmmss-sha1337beef0, when no earlier tagged commit exists for X
- # vX.Y.Z-pre.0.yyyymmddhhmmss-sha1337beef0, when most recent prior tag is vX.Y.Z-pre
- # vX.Y.(Z+1)-0.yyyymmddhhmmss-sha1337beef0, when most recent prior tag is vX.Y.Z
-
- v = v.with(patch: v.patch + 1) unless v.prerelease
- "#{v}.0"
- end
- end
-
- type { :pseudo }
- name { "#{prefix}#{commit.committed_date.strftime('%Y%m%d%H%M%S')}-#{commit.sha[0..11]}" }
-
- params { OpenStruct.new(mod: mod, type: :pseudo, commit: commit, name: name, semver: name) }
- end
end
end
diff --git a/spec/factories/go_modules.rb b/spec/factories/go_modules.rb
index fdbacf48d3b..ca7184a9194 100644
--- a/spec/factories/go_modules.rb
+++ b/spec/factories/go_modules.rb
@@ -5,7 +5,7 @@ FactoryBot.define do
initialize_with { new(attributes[:project], attributes[:name], attributes[:path]) }
skip_create
- project { create :project, :repository }
+ project { association(:project, :repository) }
path { '' }
name { "#{Settings.build_gitlab_go_url}/#{project.full_path}#{path.empty? ? '' : '/'}#{path}" }
diff --git a/spec/factories/groups.rb b/spec/factories/groups.rb
index 17db69e4699..5d232a9d09a 100644
--- a/spec/factories/groups.rb
+++ b/spec/factories/groups.rb
@@ -15,7 +15,7 @@ FactoryBot.define do
raise "Don't set owner for groups, use `group.add_owner(user)` instead"
end
- create(:namespace_settings, namespace: group)
+ create(:namespace_settings, namespace: group) unless group.namespace_settings
end
trait :public do
@@ -61,5 +61,35 @@ FactoryBot.define do
trait :allow_descendants_override_disabled_shared_runners do
allow_descendants_override_disabled_shared_runners { true }
end
+
+ # Construct a hierarchy underneath the group.
+ # Each group will have `children` amount of children,
+ # and `depth` levels of descendants.
+ trait :with_hierarchy do
+ transient do
+ children { 4 }
+ depth { 4 }
+ end
+
+ after(:create) do |group, evaluator|
+ def create_graph(parent: nil, children: 4, depth: 4)
+ return unless depth > 1
+
+ children.times do
+ factory_name = parent.model_name.singular
+ child = FactoryBot.create(factory_name, parent: parent)
+ create_graph(parent: child, children: children, depth: depth - 1)
+ end
+
+ parent
+ end
+
+ create_graph(
+ parent: group,
+ children: evaluator.children,
+ depth: evaluator.depth
+ )
+ end
+ end
end
end
diff --git a/spec/factories/iterations.rb b/spec/factories/iterations.rb
deleted file mode 100644
index bd61cd469af..00000000000
--- a/spec/factories/iterations.rb
+++ /dev/null
@@ -1,66 +0,0 @@
-# frozen_string_literal: true
-
-FactoryBot.define do
- sequence(:sequential_date) do |n|
- n.days.from_now
- end
-
- factory :iteration do
- title
- start_date { generate(:sequential_date) }
- due_date { generate(:sequential_date) }
-
- transient do
- project { nil }
- group { nil }
- project_id { nil }
- group_id { nil }
- resource_parent { nil }
- end
-
- trait :upcoming do
- state_enum { Iteration::STATE_ENUM_MAP[:upcoming] }
- end
-
- trait :started do
- state_enum { Iteration::STATE_ENUM_MAP[:started] }
- end
-
- trait :closed do
- state_enum { Iteration::STATE_ENUM_MAP[:closed] }
- end
-
- trait(:skip_future_date_validation) do
- after(:stub, :build) do |iteration|
- iteration.skip_future_date_validation = true
- end
- end
-
- trait(:skip_project_validation) do
- after(:stub, :build) do |iteration|
- iteration.skip_project_validation = true
- end
- end
-
- after(:build, :stub) do |iteration, evaluator|
- if evaluator.group
- iteration.group = evaluator.group
- elsif evaluator.group_id
- iteration.group_id = evaluator.group_id
- elsif evaluator.project
- iteration.project = evaluator.project
- elsif evaluator.project_id
- iteration.project_id = evaluator.project_id
- elsif evaluator.resource_parent
- id = evaluator.resource_parent.id
- evaluator.resource_parent.is_a?(Group) ? evaluator.group_id = id : evaluator.project_id = id
- else
- iteration.group = create(:group)
- end
- end
-
- factory :upcoming_iteration, traits: [:upcoming]
- factory :started_iteration, traits: [:started]
- factory :closed_iteration, traits: [:closed]
- end
-end
diff --git a/spec/factories/namespaces.rb b/spec/factories/namespaces.rb
index 0ec977b8234..f4b57369678 100644
--- a/spec/factories/namespaces.rb
+++ b/spec/factories/namespaces.rb
@@ -23,44 +23,20 @@ FactoryBot.define do
end
trait :with_aggregation_schedule do
- association :aggregation_schedule, factory: :namespace_aggregation_schedules
+ after(:create) do |namespace|
+ create(:namespace_aggregation_schedules, namespace: namespace)
+ end
end
trait :with_root_storage_statistics do
- association :root_storage_statistics, factory: :namespace_root_storage_statistics
+ after(:create) do |namespace|
+ create(:namespace_root_storage_statistics, namespace: namespace)
+ end
end
trait :with_namespace_settings do
- association :namespace_settings, factory: :namespace_settings
- end
-
- # Construct a hierarchy underneath the namespace.
- # Each namespace will have `children` amount of children,
- # and `depth` levels of descendants.
- trait :with_hierarchy do
- transient do
- children { 4 }
- depth { 4 }
- end
-
- after(:create) do |namespace, evaluator|
- def create_graph(parent: nil, children: 4, depth: 4)
- return unless depth > 1
-
- children.times do
- factory_name = parent.model_name.singular
- child = FactoryBot.create(factory_name, parent: parent)
- create_graph(parent: child, children: children, depth: depth - 1)
- end
-
- parent
- end
-
- create_graph(
- parent: namespace,
- children: evaluator.children,
- depth: evaluator.depth
- )
+ after(:create) do |namespace|
+ create(:namespace_settings, namespace: namespace)
end
end
diff --git a/spec/factories/packages.rb b/spec/factories/packages.rb
index 2c64abefb01..882bac1daa9 100644
--- a/spec/factories/packages.rb
+++ b/spec/factories/packages.rb
@@ -277,6 +277,10 @@ FactoryBot.define do
factory :packages_dependency, class: 'Packages::Dependency' do
sequence(:name) { |n| "@test/package-#{n}"}
sequence(:version_pattern) { |n| "~6.2.#{n}" }
+
+ trait(:rubygems) do
+ sequence(:name) { |n| "gem-dependency-#{n}"}
+ end
end
factory :packages_dependency_link, class: 'Packages::DependencyLink' do
@@ -289,6 +293,11 @@ FactoryBot.define do
link.nuget_metadatum = build(:nuget_dependency_link_metadatum)
end
end
+
+ trait(:rubygems) do
+ package { association(:rubygems_package) }
+ dependency { association(:packages_dependency, :rubygems) }
+ end
end
factory :nuget_dependency_link_metadatum, class: 'Packages::Nuget::DependencyLinkMetadatum' do
diff --git a/spec/factories/project_repository_storage_moves.rb b/spec/factories/project_repository_storage_moves.rb
index 5df2b7c32d6..018b6cde32b 100644
--- a/spec/factories/project_repository_storage_moves.rb
+++ b/spec/factories/project_repository_storage_moves.rb
@@ -1,29 +1,29 @@
# frozen_string_literal: true
FactoryBot.define do
- factory :project_repository_storage_move, class: 'ProjectRepositoryStorageMove' do
+ factory :project_repository_storage_move, class: 'Projects::RepositoryStorageMove' do
container { association(:project) }
source_storage_name { 'default' }
trait :scheduled do
- state { ProjectRepositoryStorageMove.state_machines[:state].states[:scheduled].value }
+ state { Projects::RepositoryStorageMove.state_machines[:state].states[:scheduled].value }
end
trait :started do
- state { ProjectRepositoryStorageMove.state_machines[:state].states[:started].value }
+ state { Projects::RepositoryStorageMove.state_machines[:state].states[:started].value }
end
trait :replicated do
- state { ProjectRepositoryStorageMove.state_machines[:state].states[:replicated].value }
+ state { Projects::RepositoryStorageMove.state_machines[:state].states[:replicated].value }
end
trait :finished do
- state { ProjectRepositoryStorageMove.state_machines[:state].states[:finished].value }
+ state { Projects::RepositoryStorageMove.state_machines[:state].states[:finished].value }
end
trait :failed do
- state { ProjectRepositoryStorageMove.state_machines[:state].states[:failed].value }
+ state { Projects::RepositoryStorageMove.state_machines[:state].states[:failed].value }
end
end
end
diff --git a/spec/factories/projects.rb b/spec/factories/projects.rb
index e8e0362fc62..80392a2fece 100644
--- a/spec/factories/projects.rb
+++ b/spec/factories/projects.rb
@@ -194,7 +194,7 @@ FactoryBot.define do
filename,
content,
message: "Automatically created file #{filename}",
- branch_name: 'master'
+ branch_name: project.default_branch_or_master
)
end
end
diff --git a/spec/factories/prometheus_alert_event.rb b/spec/factories/prometheus_alert_event.rb
index 281fbacabe2..7771a8d5cb7 100644
--- a/spec/factories/prometheus_alert_event.rb
+++ b/spec/factories/prometheus_alert_event.rb
@@ -13,10 +13,5 @@ FactoryBot.define do
ended_at { Time.now }
payload_key { nil }
end
-
- trait :none do
- status { nil }
- started_at { nil }
- end
end
end
diff --git a/spec/factories/self_managed_prometheus_alert_event.rb b/spec/factories/self_managed_prometheus_alert_event.rb
index 238942e2c46..3a48aba5f54 100644
--- a/spec/factories/self_managed_prometheus_alert_event.rb
+++ b/spec/factories/self_managed_prometheus_alert_event.rb
@@ -8,16 +8,5 @@ FactoryBot.define do
title { 'alert' }
query_expression { 'vector(2)' }
started_at { Time.now }
-
- trait :resolved do
- status { SelfManagedPrometheusAlertEvent.status_value_for(:resolved) }
- ended_at { Time.now }
- payload_key { nil }
- end
-
- trait :none do
- status { nil }
- started_at { nil }
- end
end
end
diff --git a/spec/factories/snippet_repository_storage_moves.rb b/spec/factories/snippet_repository_storage_moves.rb
index ed65dc5374f..dd82ec5cfcb 100644
--- a/spec/factories/snippet_repository_storage_moves.rb
+++ b/spec/factories/snippet_repository_storage_moves.rb
@@ -1,29 +1,29 @@
# frozen_string_literal: true
FactoryBot.define do
- factory :snippet_repository_storage_move, class: 'SnippetRepositoryStorageMove' do
+ factory :snippet_repository_storage_move, class: 'Snippets::RepositoryStorageMove' do
container { association(:snippet) }
source_storage_name { 'default' }
trait :scheduled do
- state { SnippetRepositoryStorageMove.state_machines[:state].states[:scheduled].value }
+ state { Snippets::RepositoryStorageMove.state_machines[:state].states[:scheduled].value }
end
trait :started do
- state { SnippetRepositoryStorageMove.state_machines[:state].states[:started].value }
+ state { Snippets::RepositoryStorageMove.state_machines[:state].states[:started].value }
end
trait :replicated do
- state { SnippetRepositoryStorageMove.state_machines[:state].states[:replicated].value }
+ state { Snippets::RepositoryStorageMove.state_machines[:state].states[:replicated].value }
end
trait :finished do
- state { SnippetRepositoryStorageMove.state_machines[:state].states[:finished].value }
+ state { Snippets::RepositoryStorageMove.state_machines[:state].states[:finished].value }
end
trait :failed do
- state { SnippetRepositoryStorageMove.state_machines[:state].states[:failed].value }
+ state { Snippets::RepositoryStorageMove.state_machines[:state].states[:failed].value }
end
end
end
diff --git a/spec/factories_spec.rb b/spec/factories_spec.rb
index 38ade20de28..56d643d0cc9 100644
--- a/spec/factories_spec.rb
+++ b/spec/factories_spec.rb
@@ -5,6 +5,37 @@ require 'spec_helper'
RSpec.describe 'factories' do
include Database::DatabaseHelpers
+ # https://gitlab.com/groups/gitlab-org/-/epics/5464 tracks the remaining
+ # skipped traits.
+ #
+ # Consider adding a code comment if a trait cannot produce a valid object.
+ def skipped_traits
+ [
+ [:audit_event, :unauthenticated],
+ [:ci_build_trace_chunk, :fog_with_data],
+ [:ci_job_artifact, :remote_store],
+ [:ci_job_artifact, :raw],
+ [:ci_job_artifact, :gzip],
+ [:ci_job_artifact, :correct_checksum],
+ [:environment, :non_playable],
+ [:composer_cache_file, :object_storage],
+ [:debian_project_component_file, :object_storage],
+ [:debian_project_distribution, :object_storage],
+ [:debian_file_metadatum, :unknown],
+ [:package_file, :object_storage],
+ [:pages_domain, :without_certificate],
+ [:pages_domain, :without_key],
+ [:pages_domain, :with_missing_chain],
+ [:pages_domain, :with_trusted_chain],
+ [:pages_domain, :with_trusted_expired_chain],
+ [:pages_domain, :explicit_ecdsa],
+ [:project_member, :blocked],
+ [:project, :remote_mirror],
+ [:remote_mirror, :ssh],
+ [:user_preference, :only_comments]
+ ]
+ end
+
shared_examples 'factory' do |factory|
describe "#{factory.name} factory" do
it 'does not raise error when built' do
@@ -16,8 +47,10 @@ RSpec.describe 'factories' do
end
factory.definition.defined_traits.map(&:name).each do |trait_name|
- describe "linting #{trait_name} trait" do
- skip 'does not raise error when created' do
+ describe "linting :#{trait_name} trait" do
+ it 'does not raise error when created' do
+ pending("Trait skipped linting due to legacy error") if skipped_traits.include?([factory.name, trait_name.to_sym])
+
expect { create(factory.name, trait_name) }.not_to raise_error
end
end
@@ -29,9 +62,21 @@ RSpec.describe 'factories' do
# and reuse them in other factories.
#
# However, for some factories we cannot use FactoryDefault because the
- # associations must be unique and cannot be reused.
+ # associations must be unique and cannot be reused, or the factory default
+ # is being mutated.
skip_factory_defaults = %i[
fork_network_member
+ group_member
+ import_state
+ namespace
+ project_broken_repo
+ prometheus_alert
+ prometheus_alert_event
+ prometheus_metric
+ self_managed_prometheus_alert_event
+ users_star_project
+ wiki_page
+ wiki_page_meta
].to_set.freeze
# Some factories and their corresponding models are based on
@@ -46,9 +91,9 @@ RSpec.describe 'factories' do
.partition { |factory| skip_factory_defaults.include?(factory.name) }
context 'with factory defaults', factory_default: :keep do
- let_it_be(:namespace) { create_default(:namespace) }
- let_it_be(:project) { create_default(:project, :repository) }
- let_it_be(:user) { create_default(:user) }
+ let_it_be(:namespace) { create_default(:namespace).freeze }
+ let_it_be(:project) { create_default(:project, :repository).freeze }
+ let_it_be(:user) { create_default(:user).freeze }
before do
factories_based_on_view.each do |factory|
diff --git a/spec/features/admin/admin_projects_spec.rb b/spec/features/admin/admin_projects_spec.rb
index aab2e6d7cef..bf280595ec7 100644
--- a/spec/features/admin/admin_projects_spec.rb
+++ b/spec/features/admin/admin_projects_spec.rb
@@ -92,97 +92,46 @@ RSpec.describe "Admin::Projects" do
end
end
- context 'when `vue_project_members_list` feature flag is enabled', :js do
- describe 'admin adds themselves to the project' do
- before do
- project.add_maintainer(user)
- stub_feature_flags(invite_members_group_modal: false)
- end
-
- it 'adds admin to the project as developer', :js do
- visit project_project_members_path(project)
-
- page.within '.invite-users-form' do
- select2(current_user.id, from: '#user_ids', multiple: true)
- select 'Developer', from: 'access_level'
- end
-
- click_button 'Invite'
-
- expect(find_member_row(current_user)).to have_content('Developer')
- end
+ describe 'admin adds themselves to the project', :js do
+ before do
+ project.add_maintainer(user)
+ stub_feature_flags(invite_members_group_modal: false)
end
- describe 'admin removes themselves from the project' do
- before do
- project.add_maintainer(user)
- project.add_developer(current_user)
- end
-
- it 'removes admin from the project' do
- visit project_project_members_path(project)
-
- expect(find_member_row(current_user)).to have_content('Developer')
+ it 'adds admin to the project as developer' do
+ visit project_project_members_path(project)
- page.within find_member_row(current_user) do
- click_button 'Leave'
- end
+ page.within '.invite-users-form' do
+ select2(current_user.id, from: '#user_ids', multiple: true)
+ select 'Developer', from: 'access_level'
+ end
- page.within('[role="dialog"]') do
- click_button('Leave')
- end
+ click_button 'Invite'
- expect(current_path).to match dashboard_projects_path
- end
+ expect(find_member_row(current_user)).to have_content('Developer')
end
end
- context 'when `vue_project_members_list` feature flag is disabled' do
+ describe 'admin removes themselves from the project', :js do
before do
- stub_feature_flags(vue_project_members_list: false)
+ project.add_maintainer(user)
+ project.add_developer(current_user)
end
- describe 'admin adds themselves to the project' do
- before do
- project.add_maintainer(user)
- stub_feature_flags(invite_members_group_modal: false)
- end
-
- it 'adds admin to the project as developer', :js do
- visit project_project_members_path(project)
-
- page.within '.invite-users-form' do
- select2(current_user.id, from: '#user_ids', multiple: true)
- select 'Developer', from: 'access_level'
- end
+ it 'removes admin from the project' do
+ visit project_project_members_path(project)
- click_button 'Invite'
+ expect(find_member_row(current_user)).to have_content('Developer')
- page.within '.content-list' do
- expect(page).to have_content(current_user.name)
- expect(page).to have_content('Developer')
- end
+ page.within find_member_row(current_user) do
+ click_button 'Leave'
end
- end
- describe 'admin removes themselves from the project' do
- before do
- project.add_maintainer(user)
- project.add_developer(current_user)
+ page.within('[role="dialog"]') do
+ click_button('Leave')
end
- it 'removes admin from the project' do
- visit project_project_members_path(project)
-
- page.within '.content-list' do
- expect(page).to have_content(current_user.name)
- expect(page).to have_content('Developer')
- end
-
- find(:css, '.content-list li', text: current_user.name).find(:css, 'a.btn-danger').click
-
- expect(page).not_to have_selector(:css, '.content-list')
- end
+ expect(current_path).to match dashboard_projects_path
end
end
end
diff --git a/spec/features/admin/admin_settings_spec.rb b/spec/features/admin/admin_settings_spec.rb
index 52f39f65bd0..249621f5835 100644
--- a/spec/features/admin/admin_settings_spec.rb
+++ b/spec/features/admin/admin_settings_spec.rb
@@ -384,7 +384,20 @@ RSpec.describe 'Admin updates settings' do
click_button 'Save changes'
end
- expect(current_settings.repository_storages_weighted_default).to be 50
+ expect(current_settings.repository_storages_weighted).to eq('default' => 50)
+ end
+
+ it 'still saves when settings are outdated' do
+ current_settings.update_attribute :repository_storages_weighted, { 'default' => 100, 'outdated' => 100 }
+
+ visit repository_admin_application_settings_path
+
+ page.within('.as-repository-storage') do
+ fill_in 'application_setting_repository_storages_weighted_default', with: 50
+ click_button 'Save changes'
+ end
+
+ expect(current_settings.repository_storages_weighted).to eq('default' => 50)
end
end
diff --git a/spec/features/alerts_settings/user_views_alerts_settings_spec.rb b/spec/features/alerts_settings/user_views_alerts_settings_spec.rb
index 07c87f98eb6..60f2f776595 100644
--- a/spec/features/alerts_settings/user_views_alerts_settings_spec.rb
+++ b/spec/features/alerts_settings/user_views_alerts_settings_spec.rb
@@ -19,7 +19,6 @@ RSpec.describe 'Alert integrations settings form', :js do
describe 'when viewing alert integrations as a maintainer' do
context 'with the default page permissions' do
before do
- stub_feature_flags(multiple_http_integrations_custom_mapping: false)
visit project_settings_operations_path(project, anchor: 'js-alert-management-settings')
wait_for_requests
end
@@ -30,8 +29,8 @@ RSpec.describe 'Alert integrations settings form', :js do
end
end
- it 'shows the new alerts setting form' do
- expect(page).to have_content('1. Select integration type')
+ it 'shows the integrations list title' do
+ expect(page).to have_content('Current integrations')
end
end
end
@@ -44,7 +43,7 @@ RSpec.describe 'Alert integrations settings form', :js do
wait_for_requests
end
- it 'shows the old alerts setting form' do
+ it 'does not have rights to access the setting form' do
expect(page).not_to have_selector('.incident-management-list')
expect(page).not_to have_selector('#js-alert-management-settings')
end
diff --git a/spec/features/boards/boards_spec.rb b/spec/features/boards/boards_spec.rb
index 2d6b669f28b..35fda25d70f 100644
--- a/spec/features/boards/boards_spec.rb
+++ b/spec/features/boards/boards_spec.rb
@@ -13,8 +13,6 @@ RSpec.describe 'Issue Boards', :js do
let_it_be(:user2) { create(:user) }
before do
- stub_feature_flags(board_new_list: false)
-
project.add_maintainer(user)
project.add_maintainer(user2)
@@ -68,6 +66,8 @@ RSpec.describe 'Issue Boards', :js do
let_it_be(:issue10) { create(:labeled_issue, project: project, title: 'issue +', description: 'A+ great issue', labels: [a_plus]) }
before do
+ stub_feature_flags(board_new_list: false)
+
visit project_board_path(project, board)
wait_for_requests
@@ -168,19 +168,6 @@ RSpec.describe 'Issue Boards', :js do
expect(page).to have_selector('.board', count: 3)
end
- it 'removes checkmark in new list dropdown after deleting' do
- click_button 'Add list'
- wait_for_requests
-
- find('.js-new-board-list').click
-
- remove_list
-
- wait_for_requests
-
- expect(page).to have_selector('.board', count: 3)
- end
-
it 'infinite scrolls list' do
create_list(:labeled_issue, 50, project: project, labels: [planning])
@@ -321,6 +308,7 @@ RSpec.describe 'Issue Boards', :js do
context 'new list' do
it 'shows all labels in new list dropdown' do
click_button 'Add list'
+
wait_for_requests
page.within('.dropdown-menu-issues-board-new') do
diff --git a/spec/features/boards/sidebar_spec.rb b/spec/features/boards/sidebar_spec.rb
index 08bc70d7116..c79bf2abff1 100644
--- a/spec/features/boards/sidebar_spec.rb
+++ b/spec/features/boards/sidebar_spec.rb
@@ -72,36 +72,6 @@ RSpec.describe 'Issue Boards', :js do
end
end
- it 'removes card from board when clicking' do
- click_card(card)
-
- page.within('.issue-boards-sidebar') do
- click_button 'Remove from board'
- end
-
- wait_for_requests
-
- page.within(find('.board:nth-child(2)')) do
- expect(page).to have_selector('.board-card', count: 1)
- end
- end
-
- it 'does not show remove button for backlog or closed issues' do
- create(:issue, project: project)
- create(:issue, :closed, project: project)
-
- visit project_board_path(project, board)
- wait_for_requests
-
- click_card(find('.board:nth-child(1)').first('.board-card'))
-
- expect(find('.issue-boards-sidebar')).not_to have_button 'Remove from board'
-
- click_card(find('.board:nth-child(3)').first('.board-card'))
-
- expect(find('.issue-boards-sidebar')).not_to have_button 'Remove from board'
- end
-
context 'assignee' do
it 'updates the issues assignee' do
click_card(card)
diff --git a/spec/features/boards/user_adds_lists_to_board_spec.rb b/spec/features/boards/user_adds_lists_to_board_spec.rb
new file mode 100644
index 00000000000..b9945207bb2
--- /dev/null
+++ b/spec/features/boards/user_adds_lists_to_board_spec.rb
@@ -0,0 +1,92 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'User adds lists', :js do
+ using RSpec::Parameterized::TableSyntax
+
+ let_it_be(:group) { create(:group, :nested) }
+ let_it_be(:project) { create(:project, :public, namespace: group) }
+ let_it_be(:group_board) { create(:board, group: group) }
+ let_it_be(:project_board) { create(:board, project: project) }
+ let_it_be(:user) { create(:user) }
+
+ let_it_be(:milestone) { create(:milestone, project: project) }
+
+ let_it_be(:group_label) { create(:group_label, group: group) }
+ let_it_be(:project_label) { create(:label, project: project) }
+ let_it_be(:group_backlog_list) { create(:backlog_list, board: group_board) }
+ let_it_be(:project_backlog_list) { create(:backlog_list, board: project_board) }
+
+ let_it_be(:issue) { create(:labeled_issue, project: project, labels: [group_label, project_label]) }
+
+ before_all do
+ project.add_maintainer(user)
+ group.add_owner(user)
+ end
+
+ where(:board_type, :graphql_board_lists_enabled, :board_new_list_enabled) do
+ :project | true | true
+ :project | false | true
+ :project | true | false
+ :project | false | false
+ :group | true | true
+ :group | false | true
+ :group | true | false
+ :group | false | false
+ end
+
+ with_them do
+ before do
+ sign_in(user)
+
+ set_cookie('sidebar_collapsed', 'true')
+
+ stub_feature_flags(
+ graphql_board_lists: graphql_board_lists_enabled,
+ board_new_list: board_new_list_enabled
+ )
+
+ if board_type == :project
+ visit project_board_path(project, project_board)
+ elsif board_type == :group
+ visit group_board_path(group, group_board)
+ end
+
+ wait_for_all_requests
+ end
+
+ it 'creates new column for label containing labeled issue' do
+ click_button button_text(board_new_list_enabled)
+ wait_for_all_requests
+
+ select_label(board_new_list_enabled, group_label)
+
+ wait_for_all_requests
+
+ expect(page).to have_selector('.board', text: group_label.title)
+ expect(find('.board:nth-child(2) .board-card')).to have_content(issue.title)
+ end
+ end
+
+ def select_label(board_new_list_enabled, label)
+ if board_new_list_enabled
+ page.within('.board-add-new-list') do
+ find('label', text: label.title).click
+ click_button 'Add'
+ end
+ else
+ page.within('.dropdown-menu-issues-board-new') do
+ click_link label.title
+ end
+ end
+ end
+
+ def button_text(board_new_list_enabled)
+ if board_new_list_enabled
+ 'Create list'
+ else
+ 'Add list'
+ end
+ end
+end
diff --git a/spec/features/commit_spec.rb b/spec/features/commit_spec.rb
index 02754cc803e..80a30ab01b2 100644
--- a/spec/features/commit_spec.rb
+++ b/spec/features/commit_spec.rb
@@ -35,9 +35,8 @@ RSpec.describe 'Commit' do
end
end
- context "pagination enabled" do
+ describe "pagination" do
before do
- stub_feature_flags(paginate_commit_view: true)
stub_const("Projects::CommitController::COMMIT_DIFFS_PER_PAGE", 1)
visit project_commit_path(project, commit)
@@ -61,18 +60,5 @@ RSpec.describe 'Commit' do
expect(page).to have_selector(".files ##{files[1].file_hash}")
end
end
-
- context "pagination disabled" do
- before do
- stub_feature_flags(paginate_commit_view: false)
-
- visit project_commit_path(project, commit)
- end
-
- it "shows both diffs on the page" do
- expect(page).to have_selector(".files ##{files[0].file_hash}")
- expect(page).to have_selector(".files ##{files[1].file_hash}")
- end
- end
end
end
diff --git a/spec/features/dashboard/group_spec.rb b/spec/features/dashboard/group_spec.rb
index 0b99fed2a2d..bc6f449edc5 100644
--- a/spec/features/dashboard/group_spec.rb
+++ b/spec/features/dashboard/group_spec.rb
@@ -15,7 +15,7 @@ RSpec.describe 'Dashboard Group' do
it 'creates new group', :js do
visit dashboard_groups_path
- find('.btn-success').click
+ find('[data-testid="new-group-button"]').click
new_name = 'Samurai'
fill_in 'group_name', with: new_name
diff --git a/spec/features/dashboard/projects_spec.rb b/spec/features/dashboard/projects_spec.rb
index 8705c22c41a..d7330b5267b 100644
--- a/spec/features/dashboard/projects_spec.rb
+++ b/spec/features/dashboard/projects_spec.rb
@@ -198,14 +198,6 @@ RSpec.describe 'Dashboard Projects' do
it_behaves_like 'hidden pipeline status'
end
- context 'when dashboard_pipeline_status is disabled' do
- before do
- stub_feature_flags(dashboard_pipeline_status: false)
- end
-
- it_behaves_like 'hidden pipeline status'
- end
-
context "when last_pipeline is missing" do
before do
project.last_pipeline.delete
diff --git a/spec/features/discussion_comments/commit_spec.rb b/spec/features/discussion_comments/commit_spec.rb
index 32c0ba2a9a7..261e9fb9f3b 100644
--- a/spec/features/discussion_comments/commit_spec.rb
+++ b/spec/features/discussion_comments/commit_spec.rb
@@ -18,7 +18,7 @@ RSpec.describe 'Thread Comments Commit', :js do
visit project_commit_path(project, sample_commit.id)
end
- it_behaves_like 'thread comments', 'commit'
+ it_behaves_like 'thread comments for commit and snippet', 'commit'
it 'has class .js-note-emoji' do
expect(page).to have_css('.js-note-emoji')
diff --git a/spec/features/discussion_comments/issue_spec.rb b/spec/features/discussion_comments/issue_spec.rb
index 86743e31fbd..ebb57b37918 100644
--- a/spec/features/discussion_comments/issue_spec.rb
+++ b/spec/features/discussion_comments/issue_spec.rb
@@ -8,13 +8,11 @@ RSpec.describe 'Thread Comments Issue', :js do
let(:issue) { create(:issue, project: project) }
before do
- stub_feature_flags(remove_comment_close_reopen: false)
-
project.add_maintainer(user)
sign_in(user)
visit project_issue_path(project, issue)
end
- it_behaves_like 'thread comments', 'issue'
+ it_behaves_like 'thread comments for issue, epic and merge request', 'issue'
end
diff --git a/spec/features/discussion_comments/merge_request_spec.rb b/spec/features/discussion_comments/merge_request_spec.rb
index 82dcdf9f918..f60d7da6a30 100644
--- a/spec/features/discussion_comments/merge_request_spec.rb
+++ b/spec/features/discussion_comments/merge_request_spec.rb
@@ -9,7 +9,6 @@ RSpec.describe 'Thread Comments Merge Request', :js do
before do
stub_feature_flags(remove_resolve_note: false)
- stub_feature_flags(remove_comment_close_reopen: false)
project.add_maintainer(user)
sign_in(user)
@@ -20,5 +19,5 @@ RSpec.describe 'Thread Comments Merge Request', :js do
wait_for_requests
end
- it_behaves_like 'thread comments', 'merge request'
+ it_behaves_like 'thread comments for issue, epic and merge request', 'merge request'
end
diff --git a/spec/features/discussion_comments/snippets_spec.rb b/spec/features/discussion_comments/snippets_spec.rb
index 42053e571e9..ca0a6d6e1c5 100644
--- a/spec/features/discussion_comments/snippets_spec.rb
+++ b/spec/features/discussion_comments/snippets_spec.rb
@@ -22,7 +22,7 @@ RSpec.describe 'Thread Comments Snippet', :js do
visit project_snippet_path(project, snippet)
end
- it_behaves_like 'thread comments', 'snippet'
+ it_behaves_like 'thread comments for commit and snippet', 'snippet'
end
context 'with personal snippets' do
@@ -32,6 +32,6 @@ RSpec.describe 'Thread Comments Snippet', :js do
visit snippet_path(snippet)
end
- it_behaves_like 'thread comments', 'snippet'
+ it_behaves_like 'thread comments for commit and snippet', 'snippet'
end
end
diff --git a/spec/features/expand_collapse_diffs_spec.rb b/spec/features/expand_collapse_diffs_spec.rb
index 55bdf4c244e..cbd1ae628d1 100644
--- a/spec/features/expand_collapse_diffs_spec.rb
+++ b/spec/features/expand_collapse_diffs_spec.rb
@@ -17,7 +17,6 @@ RSpec.describe 'Expand and collapse diffs', :js do
# Ensure that undiffable.md is in .gitattributes
project.repository.copy_gitattributes(branch)
visit project_commit_path(project, project.commit(branch))
- execute_script('window.ajaxUris = []; $(document).ajaxSend(function(event, xhr, settings) { ajaxUris.push(settings.url) });')
end
def file_container(filename)
@@ -191,10 +190,6 @@ RSpec.describe 'Expand and collapse diffs', :js do
expect(small_diff).to have_selector('.code')
expect(small_diff).not_to have_selector('.nothing-here-block')
end
-
- it 'does not make a new HTTP request' do
- expect(evaluate_script('ajaxUris')).not_to include(a_string_matching('small_diff.md'))
- end
end
end
@@ -264,7 +259,6 @@ RSpec.describe 'Expand and collapse diffs', :js do
find('.note-textarea')
wait_for_requests
- execute_script('window.ajaxUris = []; $(document).ajaxSend(function(event, xhr, settings) { ajaxUris.push(settings.url) });')
end
it 'reloads the page with all diffs expanded' do
@@ -300,10 +294,6 @@ RSpec.describe 'Expand and collapse diffs', :js do
expect(small_diff).to have_selector('.code')
expect(small_diff).not_to have_selector('.nothing-here-block')
end
-
- it 'does not make a new HTTP request' do
- expect(evaluate_script('ajaxUris')).not_to include(a_string_matching('small_diff.md'))
- end
end
end
end
diff --git a/spec/features/groups/container_registry_spec.rb b/spec/features/groups/container_registry_spec.rb
index cacabdda22d..65374263f45 100644
--- a/spec/features/groups/container_registry_spec.rb
+++ b/spec/features/groups/container_registry_spec.rb
@@ -67,7 +67,13 @@ RSpec.describe 'Container Registry', :js do
end
it 'shows the image title' do
- expect(page).to have_content 'my/image tags'
+ expect(page).to have_content 'my/image'
+ end
+
+ it 'shows the image tags' do
+ expect(page).to have_content 'Image tags'
+ first_tag = first('[data-testid="name"]')
+ expect(first_tag).to have_content 'latest'
end
it 'user removes a specific tag from container repository' do
diff --git a/spec/features/groups/members/list_members_spec.rb b/spec/features/groups/members/list_members_spec.rb
index b0a896ec8cb..b81949da85d 100644
--- a/spec/features/groups/members/list_members_spec.rb
+++ b/spec/features/groups/members/list_members_spec.rb
@@ -47,4 +47,46 @@ RSpec.describe 'Groups > Members > List members', :js do
expect(first_row).to have_selector('gl-emoji[data-name="smirk"]')
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
+ group.add_guest(user_with_2fa)
+ end
+
+ it 'shows 2FA badge to user with "Owner" access level' do
+ group.add_owner(user1)
+
+ visit group_group_members_path(group)
+
+ 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 group_group_members_path(group)
+
+ expect(find_member_row(user_with_2fa)).to have_content('2FA')
+ end
+
+ it 'does not show 2FA badge to users with access level below "Owner"' do
+ group.add_maintainer(user1)
+
+ visit group_group_members_path(group)
+
+ 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 group_group_members_path(group)
+
+ expect(find_member_row(user_with_2fa)).to have_content('2FA')
+ end
+ end
end
diff --git a/spec/features/groups/members/manage_members_spec.rb b/spec/features/groups/members/manage_members_spec.rb
index c27d0afba6f..3b637a10abe 100644
--- a/spec/features/groups/members/manage_members_spec.rb
+++ b/spec/features/groups/members/manage_members_spec.rb
@@ -15,7 +15,7 @@ RSpec.describe 'Groups > Members > Manage members' do
sign_in(user1)
end
- shared_examples 'includes the correct Invite Members link' do |should_include, should_not_include|
+ shared_examples 'includes the correct Invite link' do |should_include, should_not_include|
it 'includes either the form or the modal trigger' do
group.add_owner(user1)
@@ -31,15 +31,13 @@ RSpec.describe 'Groups > Members > Manage members' do
stub_feature_flags(invite_members_group_modal: true)
end
- it_behaves_like 'includes the correct Invite Members link', '.js-invite-members-trigger', '.invite-users-form'
+ it_behaves_like 'includes the correct Invite link', '.js-invite-members-trigger', '.invite-users-form'
+ it_behaves_like 'includes the correct Invite link', '.js-invite-group-trigger', '.invite-group-form'
end
context 'when Invite Members modal is disabled' do
- before do
- stub_feature_flags(invite_members_group_modal: false)
- end
-
- it_behaves_like 'includes the correct Invite Members link', '.invite-users-form', '.js-invite-members-trigger'
+ it_behaves_like 'includes the correct Invite link', '.invite-users-form', '.js-invite-members-trigger'
+ it_behaves_like 'includes the correct Invite link', '.invite-group-form', '.js-invite-group-trigger'
end
it 'update user to owner level', :js do
diff --git a/spec/features/groups/settings/user_searches_in_settings_spec.rb b/spec/features/groups/settings/user_searches_in_settings_spec.rb
new file mode 100644
index 00000000000..819d0c4faba
--- /dev/null
+++ b/spec/features/groups/settings/user_searches_in_settings_spec.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'User searches group settings', :js do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project, :repository, namespace: group) }
+
+ before do
+ group.add_owner(user)
+ sign_in(user)
+ end
+
+ context 'in general settings page' do
+ let(:visit_path) { edit_group_path(group) }
+
+ it_behaves_like 'can search settings with feature flag check', 'Naming', 'Permissions'
+ end
+
+ context 'in Repository page' do
+ before do
+ visit group_settings_repository_path(group)
+ end
+
+ it_behaves_like 'can search settings', 'Deploy tokens', 'Default initial branch name'
+ end
+
+ context 'in CI/CD page' do
+ before do
+ visit group_settings_ci_cd_path(group)
+ end
+
+ it_behaves_like 'can search settings', 'Variables', 'Runners'
+ end
+end
diff --git a/spec/features/groups/show_spec.rb b/spec/features/groups/show_spec.rb
index 5067f11be67..4bcba4c21ed 100644
--- a/spec/features/groups/show_spec.rb
+++ b/spec/features/groups/show_spec.rb
@@ -163,7 +163,6 @@ RSpec.describe 'Group show page' do
let!(:project) { create(:project, namespace: group) }
before do
- stub_feature_flags(vue_notification_dropdown: false)
group.add_maintainer(maintainer)
sign_in(maintainer)
end
@@ -171,14 +170,14 @@ RSpec.describe 'Group show page' do
it 'is enabled by default' do
visit path
- expect(page).to have_selector('.notifications-btn:not(.disabled)', visible: true)
+ expect(page).to have_selector('[data-testid="notification-dropdown"] button:not(.disabled)')
end
it 'is disabled if emails are disabled' do
group.update_attribute(:emails_disabled, true)
visit path
- expect(page).to have_selector('.notifications-btn.disabled', visible: true)
+ expect(page).to have_selector('[data-testid="notification-dropdown"] .disabled')
end
end
diff --git a/spec/features/groups_spec.rb b/spec/features/groups_spec.rb
index c9a0844932a..28b22860f0a 100644
--- a/spec/features/groups_spec.rb
+++ b/spec/features/groups_spec.rb
@@ -143,7 +143,7 @@ RSpec.describe 'Group' do
end
end
- describe 'create a nested group', :js do
+ describe 'create a nested group' do
let_it_be(:group) { create(:group, path: 'foo') }
context 'as admin' do
@@ -153,13 +153,21 @@ RSpec.describe 'Group' do
visit new_group_path(group, parent_id: group.id)
end
- it 'creates a nested group' do
- fill_in 'Group name', with: 'bar'
- fill_in 'Group URL', with: 'bar'
- click_button 'Create group'
+ context 'when admin mode is enabled', :enable_admin_mode do
+ it 'creates a nested group' do
+ fill_in 'Group name', with: 'bar'
+ fill_in 'Group URL', with: 'bar'
+ click_button 'Create group'
- expect(current_path).to eq(group_path('foo/bar'))
- expect(page).to have_content("Group 'bar' was successfully created.")
+ expect(current_path).to eq(group_path('foo/bar'))
+ expect(page).to have_content("Group 'bar' was successfully created.")
+ end
+ end
+
+ context 'when admin mode is disabled' do
+ it 'is not allowed' do
+ expect(page).to have_gitlab_http_status(:not_found)
+ end
end
end
diff --git a/spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb b/spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb
index d773126e00c..a4e9df604a9 100644
--- a/spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb
+++ b/spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb
@@ -89,6 +89,8 @@ RSpec.describe 'Resolving all open threads in a merge request from an issue', :j
before do
page.within '.mr-widget-body' do
page.click_link 'Resolve all threads in new issue', href: new_project_issue_path(project, merge_request_to_resolve_discussions_of: merge_request.iid)
+
+ wait_for_all_requests
end
end
diff --git a/spec/features/issues/csv_spec.rb b/spec/features/issues/csv_spec.rb
index c93693ec40a..d41a41c4383 100644
--- a/spec/features/issues/csv_spec.rb
+++ b/spec/features/issues/csv_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Issues csv' do
+RSpec.describe 'Issues csv', :js do
let(:user) { create(:user) }
let(:project) { create(:project, :public) }
let(:milestone) { create(:milestone, title: 'v1.0', project: project) }
@@ -17,7 +17,7 @@ RSpec.describe 'Issues csv' do
def request_csv(params = {})
visit project_issues_path(project, params)
page.within('.nav-controls') do
- click_on 'Export as CSV'
+ find('[data-testid="export-csv-button"]').click
end
click_on 'Export issues'
end
diff --git a/spec/features/issues/gfm_autocomplete_spec.rb b/spec/features/issues/gfm_autocomplete_spec.rb
index e2087868035..e6ebc37ba59 100644
--- a/spec/features/issues/gfm_autocomplete_spec.rb
+++ b/spec/features/issues/gfm_autocomplete_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe 'GFM autocomplete', :js do
let_it_be(:user_xss_title) { 'eve <img src=x onerror=alert(2)&lt;img src=x onerror=alert(1)&gt;' }
let_it_be(:user_xss) { create(:user, name: user_xss_title, username: 'xss.user') }
let_it_be(:user) { create(:user, name: '💃speciąl someone💃', username: 'someone.special') }
+ let_it_be(:user2) { create(:user, name: 'Marge Simpson', username: 'msimpson') }
let_it_be(:group) { create(:group, name: 'Ancestor') }
let_it_be(:child_group) { create(:group, parent: group, name: 'My group') }
let_it_be(:project) { create(:project, group: child_group) }
@@ -16,6 +17,7 @@ RSpec.describe 'GFM autocomplete', :js do
before_all do
project.add_maintainer(user)
project.add_maintainer(user_xss)
+ project.add_maintainer(user2)
end
describe 'when tribute_autocomplete feature flag is off' do
@@ -29,289 +31,218 @@ RSpec.describe 'GFM autocomplete', :js do
end
it 'updates issue description with GFM reference' do
- find('.js-issuable-edit').click
+ click_button 'Edit title and description'
wait_for_requests
- simulate_input('#issue-description', "@#{user.name[0...3]}")
+ fill_in 'Description', with: "@#{user.name[0...3]}"
wait_for_requests
- find('.atwho-view .cur').click
+ find_highlighted_autocomplete_item.click
click_button 'Save changes'
wait_for_requests
- expect(find('.description')).to have_content(user.to_reference)
+ expect(find('.description')).to have_text(user.to_reference)
end
it 'opens quick action autocomplete when updating description' do
- find('.js-issuable-edit').click
+ click_button 'Edit title and description'
- find('#issue-description').native.send_keys('/')
+ fill_in 'Description', with: '/'
- expect(page).to have_selector('.atwho-container')
+ expect(find_autocomplete_menu).to be_visible
end
it 'opens autocomplete menu when field starts with text' do
- page.within '.timeline-content-form' do
- find('#note-body').native.send_keys('@')
- end
+ fill_in 'Comment', with: '@'
- expect(page).to have_selector('.atwho-container')
+ expect(find_autocomplete_menu).to be_visible
end
it 'opens autocomplete menu for Issues when field starts with text with item escaping HTML characters' do
issue_xss_title = 'This will execute alert<img src=x onerror=alert(2)&lt;img src=x onerror=alert(1)&gt;'
create(:issue, project: project, title: issue_xss_title)
- page.within '.timeline-content-form' do
- find('#note-body').native.send_keys('#')
- end
+ fill_in 'Comment', with: '#'
wait_for_requests
- expect(page).to have_selector('.atwho-container')
-
- page.within '.atwho-container #at-view-issues' do
- expect(page.all('li').first.text).to include(issue_xss_title)
- end
+ expect(find_autocomplete_menu).to have_text(issue_xss_title)
end
it 'opens autocomplete menu for Username when field starts with text with item escaping HTML characters' do
- page.within '.timeline-content-form' do
- find('#note-body').native.send_keys('@ev')
- end
+ fill_in 'Comment', with: '@ev'
wait_for_requests
- expect(page).to have_selector('.atwho-container')
-
- page.within '.atwho-container #at-view-users' do
- expect(find('li').text).to have_content(user_xss.username)
- end
+ expect(find_highlighted_autocomplete_item).to have_text(user_xss.username)
end
it 'opens autocomplete menu for Milestone when field starts with text with item escaping HTML characters' do
milestone_xss_title = 'alert milestone &lt;img src=x onerror="alert(\'Hello xss\');" a'
create(:milestone, project: project, title: milestone_xss_title)
- page.within '.timeline-content-form' do
- find('#note-body').native.send_keys('%')
- end
+ fill_in 'Comment', with: '%'
wait_for_requests
- expect(page).to have_selector('.atwho-container')
-
- page.within '.atwho-container #at-view-milestones' do
- expect(find('li').text).to have_content('alert milestone')
- end
+ expect(find_autocomplete_menu).to have_text('alert milestone')
end
it 'doesnt open autocomplete menu character is prefixed with text' do
- page.within '.timeline-content-form' do
- find('#note-body').native.send_keys('testing')
- find('#note-body').native.send_keys('@')
- end
+ fill_in 'Comment', with: 'testing@'
- expect(page).not_to have_selector('.atwho-view')
+ expect(page).not_to have_css('.atwho-view')
end
it 'doesnt select the first item for non-assignee dropdowns' do
- page.within '.timeline-content-form' do
- find('#note-body').native.send_keys(':')
- end
-
- expect(page).to have_selector('.atwho-container')
+ fill_in 'Comment', with: ':'
wait_for_requests
- expect(find('#at-view-58')).not_to have_selector('.cur:first-of-type')
+ expect(find_autocomplete_menu).not_to have_css('.cur')
end
it 'does not open autocomplete menu when ":" is prefixed by a number and letters' do
- note = find('#note-body')
-
# Number.
- page.within '.timeline-content-form' do
- note.native.send_keys('7:')
- end
-
- expect(page).not_to have_selector('.atwho-view')
+ fill_in 'Comment', with: '7:'
+ expect(page).not_to have_css('.atwho-view')
# ASCII letter.
- page.within '.timeline-content-form' do
- note.set('')
- note.native.send_keys('w:')
- end
-
- expect(page).not_to have_selector('.atwho-view')
+ fill_in 'Comment', with: 'w:'
+ expect(page).not_to have_css('.atwho-view')
# Non-ASCII letter.
- page.within '.timeline-content-form' do
- note.set('')
- note.native.send_keys('Ð:')
- end
-
- expect(page).not_to have_selector('.atwho-view')
+ fill_in 'Comment', with: 'Ð:'
+ expect(page).not_to have_css('.atwho-view')
end
it 'selects the first item for assignee dropdowns' do
- page.within '.timeline-content-form' do
- find('#note-body').native.send_keys('@')
- end
-
- expect(page).to have_selector('.atwho-container')
+ fill_in 'Comment', with: '@'
wait_for_requests
- expect(find('#at-view-users')).to have_selector('.cur:first-of-type')
+ expect(find_autocomplete_menu).to have_css('.cur:first-of-type')
end
it 'includes items for assignee dropdowns with non-ASCII characters in name' do
- page.within '.timeline-content-form' do
- find('#note-body').native.send_keys('')
- simulate_input('#note-body', "@#{user.name[0...8]}")
- end
-
- expect(page).to have_selector('.atwho-container')
+ fill_in 'Comment', with: "@#{user.name[0...8]}"
wait_for_requests
- expect(find('#at-view-users')).to have_content(user.name)
+ expect(find_autocomplete_menu).to have_text(user.name)
end
it 'searches across full name for assignees' do
- page.within '.timeline-content-form' do
- find('#note-body').native.send_keys('@speciÄ…lsome')
- end
+ fill_in 'Comment', with: '@speciÄ…lsome'
wait_for_requests
- expect(find('.atwho-view li', visible: true)).to have_content(user.name)
+ expect(find_highlighted_autocomplete_item).to have_text(user.name)
end
- it 'selects the first item for non-assignee dropdowns if a query is entered' do
- page.within '.timeline-content-form' do
- find('#note-body').native.send_keys(':1')
- end
+ it 'shows names that start with the query as the top result' do
+ fill_in 'Comment', with: '@mar'
+
+ wait_for_requests
+
+ expect(find_highlighted_autocomplete_item).to have_text(user2.name)
+ end
+
+ it 'shows usernames that start with the query as the top result' do
+ fill_in 'Comment', with: '@msi'
+
+ wait_for_requests
+
+ expect(find_highlighted_autocomplete_item).to have_text(user2.name)
+ end
+
+ # Regression test for https://gitlab.com/gitlab-org/gitlab/-/issues/321925
+ it 'shows username when pasting then pressing Enter' do
+ fill_in 'Comment', with: "@#{user.username}\n"
+
+ expect(find_field('Comment').value).to have_text "@#{user.username}"
+ end
- expect(page).to have_selector('.atwho-container')
+ it 'does not show `@undefined` when pressing `@` then Enter' do
+ fill_in 'Comment', with: "@\n"
+
+ expect(find_field('Comment').value).to have_text '@'
+ expect(find_field('Comment').value).not_to have_text '@undefined'
+ end
+
+ it 'selects the first item for non-assignee dropdowns if a query is entered' do
+ fill_in 'Comment', with: ':1'
wait_for_requests
- expect(find('#at-view-58')).to have_selector('.cur:first-of-type')
+ expect(find_autocomplete_menu).to have_css('.cur:first-of-type')
end
context 'if a selected value has special characters' do
it 'wraps the result in double quotes' do
- note = find('#note-body')
- page.within '.timeline-content-form' do
- find('#note-body').native.send_keys('')
- simulate_input('#note-body', "~#{label.title[0]}")
- end
+ fill_in 'Comment', with: "~#{label.title[0]}"
- label_item = find('.atwho-view li', text: label.title)
+ find_highlighted_autocomplete_item.click
- expect_to_wrap(true, label_item, note, label.title)
+ expect(find_field('Comment').value).to have_text("~\"#{label.title}\"")
end
it "shows dropdown after a new line" do
- note = find('#note-body')
- page.within '.timeline-content-form' do
- note.native.send_keys('test')
- note.native.send_keys(:enter)
- note.native.send_keys(:enter)
- note.native.send_keys('@')
- end
+ fill_in 'Comment', with: "test\n\n@"
- expect(page).to have_selector('.atwho-container')
+ expect(find_autocomplete_menu).to be_visible
end
it "does not show dropdown when preceded with a special character" do
- note = find('#note-body')
- page.within '.timeline-content-form' do
- note.native.send_keys("@")
- end
-
- expect(page).to have_selector('.atwho-container')
-
- page.within '.timeline-content-form' do
- note.native.send_keys("@")
- end
+ fill_in 'Comment', with: '@@'
- expect(page).to have_selector('.atwho-container', visible: false)
- end
-
- it "does not throw an error if no labels exist" do
- note = find('#note-body')
- page.within '.timeline-content-form' do
- note.native.send_keys('~')
- end
-
- expect(page).to have_selector('.atwho-container', visible: false)
+ expect(page).not_to have_css('.atwho-view')
end
it 'doesn\'t wrap for assignee values' do
- note = find('#note-body')
- page.within '.timeline-content-form' do
- note.native.send_keys("@#{user.username[0]}")
- end
+ fill_in 'Comment', with: "@#{user.username[0]}"
- user_item = find('.atwho-view li', text: user.username)
+ find_highlighted_autocomplete_item.click
- expect_to_wrap(false, user_item, note, user.username)
+ expect(find_field('Comment').value).to have_text("@#{user.username}")
end
it 'doesn\'t wrap for emoji values' do
- note = find('#note-body')
- page.within '.timeline-content-form' do
- note.native.send_keys(":cartwheel_")
- end
+ fill_in 'Comment', with: ':cartwheel_'
- emoji_item = find('.atwho-view li', text: 'cartwheel_tone1')
+ find_highlighted_autocomplete_item.click
- expect_to_wrap(false, emoji_item, note, 'cartwheel_tone1')
+ expect(find_field('Comment').value).to have_text('cartwheel_tone1')
end
it 'doesn\'t open autocomplete after non-word character' do
- page.within '.timeline-content-form' do
- find('#note-body').native.send_keys("@#{user.username[0..2]}!")
- end
+ fill_in 'Comment', with: "@#{user.username[0..2]}!"
- expect(page).not_to have_selector('.atwho-view')
+ expect(page).not_to have_css('.atwho-view')
end
it 'doesn\'t open autocomplete if there is no space before' do
- page.within '.timeline-content-form' do
- find('#note-body').native.send_keys("hello:#{user.username[0..2]}")
- end
+ fill_in 'Comment', with: "hello:#{user.username[0..2]}"
- expect(page).not_to have_selector('.atwho-view')
+ expect(page).not_to have_css('.atwho-view')
end
it 'triggers autocomplete after selecting a quick action' do
- note = find('#note-body')
- page.within '.timeline-content-form' do
- note.native.send_keys('/as')
- end
+ fill_in 'Comment', with: '/as'
- find('.atwho-view li', text: '/assign')
- note.native.send_keys(:tab)
+ find_highlighted_autocomplete_item.click
- user_item = find('.atwho-view li', text: user.username)
- expect(user_item).to have_content(user.username)
+ expect(find_autocomplete_menu).to have_text(user.username)
end
it 'does not limit quick actions autocomplete list to 5' do
- note = find('#note-body')
- page.within '.timeline-content-form' do
- note.native.send_keys('/')
- end
+ fill_in 'Comment', with: '/'
- expect(page).to have_selector('.atwho-view li', minimum: 6, visible: true)
+ expect(find_autocomplete_menu).to have_css('li', minimum: 6)
end
end
@@ -328,30 +259,23 @@ RSpec.describe 'GFM autocomplete', :js do
it 'lists users who are currently not assigned to the issue when using /assign' do
visit project_issue_path(project, issue_assignee)
- note = find('#note-body')
- page.within '.timeline-content-form' do
- note.native.send_keys('/as')
- end
-
- find('.atwho-view li', text: '/assign')
- note.native.send_keys(:tab)
+ fill_in 'Comment', with: '/as'
- wait_for_requests
+ find_highlighted_autocomplete_item.click
- expect(find('#at-view-users .atwho-view-ul')).not_to have_content(user.username)
- expect(find('#at-view-users .atwho-view-ul')).to have_content(unassigned_user.username)
+ expect(find_autocomplete_menu).not_to have_text(user.username)
+ expect(find_autocomplete_menu).to have_text(unassigned_user.username)
end
it 'shows dropdown on new issue form' do
visit new_project_issue_path(project)
- textarea = find('#issue_description')
- textarea.native.send_keys('/ass')
- find('.atwho-view li', text: '/assign')
- textarea.native.send_keys(:tab)
+ fill_in 'Description', with: '/ass'
- expect(find('#at-view-users .atwho-view-ul')).to have_content(unassigned_user.username)
- expect(find('#at-view-users .atwho-view-ul')).to have_content(user.username)
+ find_highlighted_autocomplete_item.click
+
+ expect(find_autocomplete_menu).to have_text(unassigned_user.username)
+ expect(find_autocomplete_menu).to have_text(user.username)
end
end
@@ -360,80 +284,62 @@ RSpec.describe 'GFM autocomplete', :js do
label_xss_title = 'alert label &lt;img src=x onerror="alert(\'Hello xss\');" a'
create(:label, project: project, title: label_xss_title)
- note = find('#note-body')
-
- # It should show all the labels on "~".
- type(note, '~')
+ fill_in 'Comment', with: '~'
wait_for_requests
- page.within '.atwho-container #at-view-labels' do
- expect(find('.atwho-view-ul').text).to have_content('alert label')
- end
+ expect(find_autocomplete_menu).to have_text('alert label')
end
it 'allows colons when autocompleting scoped labels' do
create(:label, project: project, title: 'scoped:label')
- note = find('#note-body')
- type(note, '~scoped:')
+ fill_in 'Comment', with: '~scoped:'
wait_for_requests
- page.within '.atwho-container #at-view-labels' do
- expect(find('.atwho-view-ul').text).to have_content('scoped:label')
- end
+ expect(find_autocomplete_menu).to have_text('scoped:label')
end
it 'allows colons when autocompleting scoped labels with double colons' do
create(:label, project: project, title: 'scoped::label')
- note = find('#note-body')
- type(note, '~scoped::')
+ fill_in 'Comment', with: '~scoped::'
wait_for_requests
- page.within '.atwho-container #at-view-labels' do
- expect(find('.atwho-view-ul').text).to have_content('scoped::label')
- end
+ expect(find_autocomplete_menu).to have_text('scoped::label')
end
it 'allows spaces when autocompleting multi-word labels' do
create(:label, project: project, title: 'Accepting merge requests')
- note = find('#note-body')
- type(note, '~Accepting merge')
+ fill_in 'Comment', with: '~Accepting merge'
wait_for_requests
- page.within '.atwho-container #at-view-labels' do
- expect(find('.atwho-view-ul').text).to have_content('Accepting merge requests')
- end
+ expect(find_autocomplete_menu).to have_text('Accepting merge requests')
end
it 'only autocompletes the latest label' do
create(:label, project: project, title: 'Accepting merge requests')
create(:label, project: project, title: 'Accepting job applicants')
- note = find('#note-body')
- type(note, '~Accepting merge requests foo bar ~Accepting job')
+ fill_in 'Comment', with: '~Accepting merge requests foo bar ~Accepting job'
wait_for_requests
- page.within '.atwho-container #at-view-labels' do
- expect(find('.atwho-view-ul').text).to have_content('Accepting job applicants')
- end
+ expect(find_autocomplete_menu).to have_text('Accepting job applicants')
end
it 'does not autocomplete labels if no tilde is typed' do
create(:label, project: project, title: 'Accepting merge requests')
- note = find('#note-body')
- type(note, 'Accepting merge')
+ fill_in 'Comment', with: 'Accepting merge'
wait_for_requests
- expect(page).not_to have_css('.atwho-container #at-view-labels')
+ expect(page).not_to have_css('.atwho-view')
end
end
@@ -443,7 +349,7 @@ RSpec.describe 'GFM autocomplete', :js do
# This is meant to protect against this issue https://gitlab.com/gitlab-org/gitlab/-/issues/228729
it 'keeps autocomplete key listeners' do
visit project_issue_path(project, issue)
- note = find('#note-body')
+ note = find_field('Comment')
start_comment_with_emoji(note, '.atwho-view li')
@@ -459,17 +365,11 @@ RSpec.describe 'GFM autocomplete', :js do
shared_examples 'autocomplete suggestions' do
it 'suggests objects correctly' do
- page.within '.timeline-content-form' do
- find('#note-body').native.send_keys(object.class.reference_prefix)
- end
-
- page.within '.atwho-container' do
- expect(page).to have_content(object.title)
+ fill_in 'Comment', with: object.class.reference_prefix
- find('ul li').click
- end
+ find_autocomplete_menu.find('li').click
- expect(find('.new-note #note-body').value).to include(expected_body)
+ expect(find_field('Comment').value).to have_text(expected_body)
end
end
@@ -502,10 +402,40 @@ RSpec.describe 'GFM autocomplete', :js do
end
context 'milestone' do
- let!(:object) { create(:milestone, project: project) }
- let(:expected_body) { object.to_reference }
+ let_it_be(:milestone_expired) { create(:milestone, project: project, due_date: 5.days.ago) }
+ let_it_be(:milestone_no_duedate) { create(:milestone, project: project, title: 'Foo - No due date') }
+ let_it_be(:milestone1) { create(:milestone, project: project, title: 'Milestone-1', due_date: 20.days.from_now) }
+ let_it_be(:milestone2) { create(:milestone, project: project, title: 'Milestone-2', due_date: 15.days.from_now) }
+ let_it_be(:milestone3) { create(:milestone, project: project, title: 'Milestone-3', due_date: 10.days.from_now) }
- it_behaves_like 'autocomplete suggestions'
+ before do
+ fill_in 'Comment', with: '/milestone %'
+
+ wait_for_requests
+ end
+
+ it 'shows milestons list in the autocomplete menu' do
+ page.within(find_autocomplete_menu) do
+ expect(page).to have_selector('li', count: 5)
+ end
+ end
+
+ it 'shows expired milestone at the bottom of the list' do
+ page.within(find_autocomplete_menu) do
+ expect(page.find('li:last-child')).to have_content milestone_expired.title
+ end
+ end
+
+ it 'shows milestone due earliest at the top of the list' do
+ page.within(find_autocomplete_menu) do
+ aggregate_failures do
+ expect(page.all('li')[0]).to have_content milestone3.title
+ expect(page.all('li')[1]).to have_content milestone2.title
+ expect(page.all('li')[2]).to have_content milestone1.title
+ expect(page.all('li')[3]).to have_content milestone_no_duedate.title
+ end
+ end
+ end
end
end
@@ -520,237 +450,160 @@ RSpec.describe 'GFM autocomplete', :js do
end
it 'updates issue description with GFM reference' do
- find('.js-issuable-edit').click
+ click_button 'Edit title and description'
wait_for_requests
- simulate_input('#issue-description', "@#{user.name[0...3]}")
+ fill_in 'Description', with: "@#{user.name[0...3]}"
wait_for_requests
- find('.tribute-container .highlight', visible: true).click
+ find_highlighted_tribute_autocomplete_menu.click
click_button 'Save changes'
wait_for_requests
- expect(find('.description')).to have_content(user.to_reference)
+ expect(find('.description')).to have_text(user.to_reference)
end
it 'opens autocomplete menu when field starts with text' do
- page.within '.timeline-content-form' do
- find('#note-body').native.send_keys('@')
- end
+ fill_in 'Comment', with: '@'
- expect(page).to have_selector('.tribute-container', visible: true)
+ expect(find_tribute_autocomplete_menu).to be_visible
end
it 'opens autocomplete menu for Issues when field starts with text with item escaping HTML characters' do
issue_xss_title = 'This will execute alert<img src=x onerror=alert(2)&lt;img src=x onerror=alert(1)&gt;'
create(:issue, project: project, title: issue_xss_title)
- page.within '.timeline-content-form' do
- find('#note-body').native.send_keys('#')
- end
+ fill_in 'Comment', with: '#'
wait_for_requests
- expect(page).to have_selector('.tribute-container', visible: true)
-
- page.within '.tribute-container ul' do
- expect(page.all('li').first.text).to include(issue_xss_title)
- end
+ expect(find_tribute_autocomplete_menu).to have_text(issue_xss_title)
end
it 'opens autocomplete menu for Username when field starts with text with item escaping HTML characters' do
- page.within '.timeline-content-form' do
- find('#note-body').native.send_keys('@ev')
- end
+ fill_in 'Comment', with: '@ev'
wait_for_requests
- expect(page).to have_selector('.tribute-container', visible: true)
-
- expect(find('.tribute-container ul', visible: true)).to have_text(user_xss.username)
+ expect(find_tribute_autocomplete_menu).to have_text(user_xss.username)
end
it 'opens autocomplete menu for Milestone when field starts with text with item escaping HTML characters' do
milestone_xss_title = 'alert milestone &lt;img src=x onerror="alert(\'Hello xss\');" a'
create(:milestone, project: project, title: milestone_xss_title)
- page.within '.timeline-content-form' do
- find('#note-body').native.send_keys('%')
- end
+ fill_in 'Comment', with: '%'
wait_for_requests
- expect(page).to have_selector('.tribute-container', visible: true)
-
- expect(find('.tribute-container ul', visible: true)).to have_text('alert milestone')
+ expect(find_tribute_autocomplete_menu).to have_text('alert milestone')
end
it 'does not open autocomplete menu when trigger character is prefixed with text' do
- page.within '.timeline-content-form' do
- find('#note-body').native.send_keys('testing')
- find('#note-body').native.send_keys('@')
- end
+ fill_in 'Comment', with: 'testing@'
- expect(page).not_to have_selector('.tribute-container', visible: true)
+ expect(page).not_to have_css('.tribute-container')
end
it 'does not open autocomplete menu when ":" is prefixed by a number and letters' do
- note = find('#note-body')
-
# Number.
- page.within '.timeline-content-form' do
- note.native.send_keys('7:')
- end
-
- expect(page).not_to have_selector('.tribute-container', visible: true)
+ fill_in 'Comment', with: '7:'
+ expect(page).not_to have_css('.tribute-container')
# ASCII letter.
- page.within '.timeline-content-form' do
- note.set('')
- note.native.send_keys('w:')
- end
-
- expect(page).not_to have_selector('.tribute-container', visible: true)
+ fill_in 'Comment', with: 'w:'
+ expect(page).not_to have_css('.tribute-container')
# Non-ASCII letter.
- page.within '.timeline-content-form' do
- note.set('')
- note.native.send_keys('Ð:')
- end
-
- expect(page).not_to have_selector('.tribute-container', visible: true)
+ fill_in 'Comment', with: 'Ð:'
+ expect(page).not_to have_css('.tribute-container')
end
it 'selects the first item for assignee dropdowns' do
- page.within '.timeline-content-form' do
- find('#note-body').native.send_keys('@')
- end
-
- expect(page).to have_selector('.tribute-container', visible: true)
+ fill_in 'Comment', with: '@'
wait_for_requests
- expect(find('.tribute-container ul', visible: true)).to have_selector('.highlight:first-of-type')
+ expect(find_tribute_autocomplete_menu).to have_css('.highlight:first-of-type')
end
it 'includes items for assignee dropdowns with non-ASCII characters in name' do
- page.within '.timeline-content-form' do
- find('#note-body').native.send_keys('')
- simulate_input('#note-body', "@#{user.name[0...8]}")
- end
-
- expect(page).to have_selector('.tribute-container', visible: true)
+ fill_in 'Comment', with: "@#{user.name[0...8]}"
wait_for_requests
- expect(find('.tribute-container ul', visible: true)).to have_content(user.name)
+ expect(find_tribute_autocomplete_menu).to have_text(user.name)
end
it 'selects the first item for non-assignee dropdowns if a query is entered' do
- page.within '.timeline-content-form' do
- find('#note-body').native.send_keys(':1')
- end
+ fill_in 'Comment', with: ':1'
wait_for_requests
- expect(find('.tribute-container ul', visible: true)).to have_selector('.highlight:first-of-type')
+ expect(find_tribute_autocomplete_menu).to have_css('.highlight:first-of-type')
end
context 'when autocompleting for groups' do
it 'shows the group when searching for the name of the group' do
- page.within '.timeline-content-form' do
- find('#note-body').native.send_keys('@mygroup')
- end
+ fill_in 'Comment', with: '@mygroup'
- expect(find('.tribute-container ul', visible: true)).to have_text('My group')
+ expect(find_tribute_autocomplete_menu).to have_text('My group')
end
it 'does not show the group when searching for the name of the parent of the group' do
- page.within '.timeline-content-form' do
- find('#note-body').native.send_keys('@ancestor')
- end
+ fill_in 'Comment', with: '@ancestor'
- expect(find('.tribute-container ul', visible: true)).not_to have_text('My group')
+ expect(find_tribute_autocomplete_menu).not_to have_text('My group')
end
end
context 'if a selected value has special characters' do
it 'wraps the result in double quotes' do
- note = find('#note-body')
- page.within '.timeline-content-form' do
- find('#note-body').native.send_keys('')
- simulate_input('#note-body', "~#{label.title[0]}")
- end
+ fill_in 'Comment', with: "~#{label.title[0]}"
- label_item = find('.tribute-container ul', text: label.title, visible: true)
+ find_highlighted_tribute_autocomplete_menu.click
- expect_to_wrap(true, label_item, note, label.title)
+ expect(find_field('Comment').value).to have_text("~\"#{label.title}\"")
end
it "shows dropdown after a new line" do
- note = find('#note-body')
- page.within '.timeline-content-form' do
- note.native.send_keys('test')
- note.native.send_keys(:enter)
- note.native.send_keys(:enter)
- note.native.send_keys('@')
- end
-
- expect(page).to have_selector('.tribute-container', visible: true)
- end
-
- it "does not throw an error if no labels exist" do
- note = find('#note-body')
- page.within '.timeline-content-form' do
- note.native.send_keys('~')
- end
+ fill_in 'Comment', with: "test\n\n@"
- expect(page).to have_selector('.tribute-container', visible: false)
+ expect(find_tribute_autocomplete_menu).to be_visible
end
it 'doesn\'t wrap for assignee values' do
- note = find('#note-body')
- page.within '.timeline-content-form' do
- note.native.send_keys("@#{user.username[0]}")
- end
+ fill_in 'Comment', with: "@#{user.username[0..2]}"
- user_item = find('.tribute-container ul', text: user.username, visible: true)
+ find_highlighted_tribute_autocomplete_menu.click
- expect_to_wrap(false, user_item, note, user.username)
+ expect(find_field('Comment').value).to have_text("@#{user.username}")
end
it 'does not wrap for emoji values' do
- note = find('#note-body')
- page.within '.timeline-content-form' do
- note.native.send_keys(":cartwheel_")
- end
+ fill_in 'Comment', with: ':cartwheel_'
- emoji_item = first('.tribute-container li', text: 'cartwheel_tone1', visible: true)
+ find_highlighted_tribute_autocomplete_menu.click
- expect_to_wrap(false, emoji_item, note, 'cartwheel_tone1')
+ expect(find_field('Comment').value).to have_text('cartwheel_tone1')
end
it 'does not open autocomplete if there is no space before' do
- page.within '.timeline-content-form' do
- find('#note-body').native.send_keys("hello:#{user.username[0..2]}")
- end
+ fill_in 'Comment', with: "hello:#{user.username[0..2]}"
- expect(page).not_to have_selector('.tribute-container')
+ expect(page).not_to have_css('.tribute-container')
end
it 'autocompletes for quick actions' do
- note = find('#note-body')
- page.within '.timeline-content-form' do
- note.native.send_keys('/as')
- wait_for_requests
- note.native.send_keys(:tab)
- end
+ fill_in 'Comment', with: '/as'
+
+ find_highlighted_tribute_autocomplete_menu.click
- expect(note.value).to have_text('/assign')
+ expect(find_field('Comment').value).to have_text('/assign')
end
end
@@ -767,37 +620,33 @@ RSpec.describe 'GFM autocomplete', :js do
it 'lists users who are currently not assigned to the issue when using /assign' do
visit project_issue_path(project, issue_assignee)
- note = find('#note-body')
- page.within '.timeline-content-form' do
- note.native.send_keys('/assign ')
- # The `/assign` ajax response might replace the one by `@` below causing a failed test
- # so we need to wait for the `/assign` ajax request to finish first
- wait_for_requests
- note.native.send_keys('@')
- wait_for_requests
- end
+ note = find_field('Comment')
+ note.native.send_keys('/assign ')
+ # The `/assign` ajax response might replace the one by `@` below causing a failed test
+ # so we need to wait for the `/assign` ajax request to finish first
+ wait_for_requests
+ note.native.send_keys('@')
+ wait_for_requests
- expect(find('.tribute-container ul', visible: true)).not_to have_content(user.username)
- expect(find('.tribute-container ul', visible: true)).to have_content(unassigned_user.username)
+ expect(find_tribute_autocomplete_menu).not_to have_text(user.username)
+ expect(find_tribute_autocomplete_menu).to have_text(unassigned_user.username)
end
it 'lists users who are currently not assigned to the issue when using /assign on the second line' do
visit project_issue_path(project, issue_assignee)
- note = find('#note-body')
- page.within '.timeline-content-form' do
- note.native.send_keys('/assign @user2')
- note.native.send_keys(:enter)
- note.native.send_keys('/assign ')
- # The `/assign` ajax response might replace the one by `@` below causing a failed test
- # so we need to wait for the `/assign` ajax request to finish first
- wait_for_requests
- note.native.send_keys('@')
- wait_for_requests
- end
+ note = find_field('Comment')
+ note.native.send_keys('/assign @user2')
+ note.native.send_keys(:enter)
+ note.native.send_keys('/assign ')
+ # The `/assign` ajax response might replace the one by `@` below causing a failed test
+ # so we need to wait for the `/assign` ajax request to finish first
+ wait_for_requests
+ note.native.send_keys('@')
+ wait_for_requests
- expect(find('.tribute-container ul', visible: true)).not_to have_content(user.username)
- expect(find('.tribute-container ul', visible: true)).to have_content(unassigned_user.username)
+ expect(find_tribute_autocomplete_menu).not_to have_text(user.username)
+ expect(find_tribute_autocomplete_menu).to have_text(unassigned_user.username)
end
end
@@ -806,72 +655,65 @@ RSpec.describe 'GFM autocomplete', :js do
label_xss_title = 'alert label &lt;img src=x onerror="alert(\'Hello xss\');" a'
create(:label, project: project, title: label_xss_title)
- note = find('#note-body')
-
- # It should show all the labels on "~".
- type(note, '~')
+ fill_in 'Comment', with: '~'
wait_for_requests
- expect(find('.tribute-container ul', visible: true).text).to have_content('alert label')
+ expect(find_tribute_autocomplete_menu).to have_text('alert label')
end
it 'allows colons when autocompleting scoped labels' do
create(:label, project: project, title: 'scoped:label')
- note = find('#note-body')
- type(note, '~scoped:')
+ fill_in 'Comment', with: '~scoped:'
wait_for_requests
- expect(find('.tribute-container ul', visible: true).text).to have_content('scoped:label')
+ expect(find_tribute_autocomplete_menu).to have_text('scoped:label')
end
it 'allows colons when autocompleting scoped labels with double colons' do
create(:label, project: project, title: 'scoped::label')
- note = find('#note-body')
- type(note, '~scoped::')
+ fill_in 'Comment', with: '~scoped::'
wait_for_requests
- expect(find('.tribute-container ul', visible: true).text).to have_content('scoped::label')
+ expect(find_tribute_autocomplete_menu).to have_text('scoped::label')
end
it 'autocompletes multi-word labels' do
create(:label, project: project, title: 'Accepting merge requests')
- note = find('#note-body')
- type(note, '~Acceptingmerge')
+ fill_in 'Comment', with: '~Acceptingmerge'
wait_for_requests
- expect(find('.tribute-container ul', visible: true).text).to have_content('Accepting merge requests')
+ expect(find_tribute_autocomplete_menu).to have_text('Accepting merge requests')
end
it 'only autocompletes the latest label' do
create(:label, project: project, title: 'documentation')
create(:label, project: project, title: 'feature')
- note = find('#note-body')
- type(note, '~documentation foo bar ~feat')
- note.native.send_keys(:right)
+ fill_in 'Comment', with: '~documentation foo bar ~feat'
+ # Invoke autocompletion
+ find_field('Comment').native.send_keys(:right)
wait_for_requests
- expect(find('.tribute-container ul', visible: true).text).to have_content('feature')
- expect(find('.tribute-container ul', visible: true).text).not_to have_content('documentation')
+ expect(find_tribute_autocomplete_menu).to have_text('feature')
+ expect(find_tribute_autocomplete_menu).not_to have_text('documentation')
end
it 'does not autocomplete labels if no tilde is typed' do
create(:label, project: project, title: 'documentation')
- note = find('#note-body')
- type(note, 'document')
+ fill_in 'Comment', with: 'document'
wait_for_requests
- expect(page).not_to have_selector('.tribute-container')
+ expect(page).not_to have_css('.tribute-container')
end
end
@@ -881,7 +723,7 @@ RSpec.describe 'GFM autocomplete', :js do
# This is meant to protect against this issue https://gitlab.com/gitlab-org/gitlab/-/issues/228729
it 'keeps autocomplete key listeners' do
visit project_issue_path(project, issue)
- note = find('#note-body')
+ note = find_field('Comment')
start_comment_with_emoji(note, '.tribute-container li')
@@ -897,17 +739,11 @@ RSpec.describe 'GFM autocomplete', :js do
shared_examples 'autocomplete suggestions' do
it 'suggests objects correctly' do
- page.within '.timeline-content-form' do
- find('#note-body').native.send_keys(object.class.reference_prefix)
- end
-
- page.within '.tribute-container' do
- expect(page).to have_content(object.title)
+ fill_in 'Comment', with: object.class.reference_prefix
- find('ul li').click
- end
+ find_tribute_autocomplete_menu.find('li').click
- expect(find('.new-note #note-body').value).to include(expected_body)
+ expect(find_field('Comment').value).to have_text(expected_body)
end
end
@@ -949,42 +785,6 @@ RSpec.describe 'GFM autocomplete', :js do
private
- def expect_to_wrap(should_wrap, item, note, value)
- expect(item).to have_content(value)
- expect(item).not_to have_content("\"#{value}\"")
-
- item.click
-
- if should_wrap
- expect(note.value).to include("\"#{value}\"")
- else
- expect(note.value).not_to include("\"#{value}\"")
- end
- end
-
- def expect_labels(shown: nil, not_shown: nil)
- page.within('.atwho-container') do
- if shown
- expect(page).to have_selector('.atwho-view li', count: shown.size)
- shown.each { |label| expect(page).to have_content(label.title) }
- end
-
- if not_shown
- expect(page).not_to have_selector('.atwho-view li') unless shown
- not_shown.each { |label| expect(page).not_to have_content(label.title) }
- end
- end
- end
-
- # `note` is a textarea where the given text should be typed.
- # We don't want to find it each time this function gets called.
- def type(note, text)
- page.within('.timeline-content-form') do
- note.set('')
- note.native.send_keys(text)
- end
- end
-
def start_comment_with_emoji(note, selector)
note.native.send_keys('Hello :10')
@@ -994,9 +794,7 @@ RSpec.describe 'GFM autocomplete', :js do
end
def start_and_cancel_discussion
- click_button('Reply...')
-
- fill_in('note_note', with: 'Whoops!')
+ fill_in('Reply to comment', with: 'Whoops!')
page.accept_alert 'Are you sure you want to cancel creating this comment?' do
click_button('Cancel')
@@ -1004,4 +802,20 @@ RSpec.describe 'GFM autocomplete', :js do
wait_for_requests
end
+
+ def find_autocomplete_menu
+ find('.atwho-view ul', visible: true)
+ end
+
+ def find_highlighted_autocomplete_item
+ find('.atwho-view li.cur', visible: true)
+ end
+
+ def find_tribute_autocomplete_menu
+ find('.tribute-container ul', visible: true)
+ end
+
+ def find_highlighted_tribute_autocomplete_menu
+ find('.tribute-container li.highlight', visible: true)
+ end
end
diff --git a/spec/features/issues/issue_state_spec.rb b/spec/features/issues/issue_state_spec.rb
index 409f498798b..d5a115433aa 100644
--- a/spec/features/issues/issue_state_spec.rb
+++ b/spec/features/issues/issue_state_spec.rb
@@ -42,15 +42,9 @@ RSpec.describe 'issue state', :js do
end
describe 'when open', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/297348' do
- let(:open_issue) { create(:issue, project: project) }
-
- it_behaves_like 'page with comment and close button', 'Close issue' do
- def setup
- visit project_issue_path(project, open_issue)
- end
- end
-
context 'when clicking the top `Close issue` button', :aggregate_failures do
+ let(:open_issue) { create(:issue, project: project) }
+
before do
visit project_issue_path(project, open_issue)
end
@@ -59,8 +53,9 @@ RSpec.describe 'issue state', :js do
end
context 'when clicking the bottom `Close issue` button', :aggregate_failures do
+ let(:open_issue) { create(:issue, project: project) }
+
before do
- stub_feature_flags(remove_comment_close_reopen: false)
visit project_issue_path(project, open_issue)
end
@@ -69,15 +64,9 @@ RSpec.describe 'issue state', :js do
end
describe 'when closed', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/297201' do
- let(:closed_issue) { create(:issue, project: project, state: 'closed') }
-
- it_behaves_like 'page with comment and close button', 'Reopen issue' do
- def setup
- visit project_issue_path(project, closed_issue)
- end
- end
-
context 'when clicking the top `Reopen issue` button', :aggregate_failures do
+ let(:closed_issue) { create(:issue, project: project, state: 'closed') }
+
before do
visit project_issue_path(project, closed_issue)
end
@@ -86,8 +75,9 @@ RSpec.describe 'issue state', :js do
end
context 'when clicking the bottom `Reopen issue` button', :aggregate_failures do
+ let(:closed_issue) { create(:issue, project: project, state: 'closed') }
+
before do
- stub_feature_flags(remove_comment_close_reopen: false)
visit project_issue_path(project, closed_issue)
end
diff --git a/spec/features/issues/user_interacts_with_awards_spec.rb b/spec/features/issues/user_interacts_with_awards_spec.rb
index fec603e466a..1c7bc5f239f 100644
--- a/spec/features/issues/user_interacts_with_awards_spec.rb
+++ b/spec/features/issues/user_interacts_with_awards_spec.rb
@@ -135,11 +135,9 @@ RSpec.describe 'User interacts with awards' do
it 'allows adding a new emoji' do
page.within('.note-actions') do
- find('a.js-add-award').click
- end
- page.within('.emoji-menu-content') do
- find('gl-emoji[data-name="8ball"]').click
+ find('.note-emoji-button').click
end
+ find('gl-emoji[data-name="8ball"]').click
wait_for_requests
page.within('.note-awards') do
@@ -157,7 +155,7 @@ RSpec.describe 'User interacts with awards' do
end
page.within('.note-actions') do
- expect(page).not_to have_css('a.js-add-award')
+ expect(page).not_to have_css('.btn.js-add-award')
end
end
diff --git a/spec/features/labels_hierarchy_spec.rb b/spec/features/labels_hierarchy_spec.rb
index aeb42cc2edb..0a2f81986be 100644
--- a/spec/features/labels_hierarchy_spec.rb
+++ b/spec/features/labels_hierarchy_spec.rb
@@ -160,7 +160,7 @@ RSpec.describe 'Labels Hierarchy', :js do
find('a.label-item', text: parent_group_label.title).click
find('a.label-item', text: project_label_1.title).click
- find('.btn-success').click
+ find('.btn-confirm').click
expect(page.find('.issue-details h2.title')).to have_content('new created issue')
expect(page).to have_selector('span.gl-label-text', text: grandparent_group_label.title)
diff --git a/spec/features/merge_request/batch_comments_spec.rb b/spec/features/merge_request/batch_comments_spec.rb
index c8fc23bebf9..25f2707146d 100644
--- a/spec/features/merge_request/batch_comments_spec.rb
+++ b/spec/features/merge_request/batch_comments_spec.rb
@@ -223,7 +223,7 @@ end
def write_reply_to_discussion(button_text: 'Start a review', text: 'Line is wrong', resolve: false, unresolve: false)
page.within(first('.diff-files-holder .discussion-reply-holder')) do
- click_button('Reply...')
+ find_field('Reply…', match: :first).click
fill_in('note_note', with: text)
diff --git a/spec/features/merge_request/user_closes_reopens_merge_request_state_spec.rb b/spec/features/merge_request/user_closes_reopens_merge_request_state_spec.rb
index ab3ef7c1ac0..70951982c22 100644
--- a/spec/features/merge_request/user_closes_reopens_merge_request_state_spec.rb
+++ b/spec/features/merge_request/user_closes_reopens_merge_request_state_spec.rb
@@ -12,15 +12,9 @@ RSpec.describe 'User closes/reopens a merge request', :js, quarantine: 'https://
end
describe 'when open' do
- let(:open_merge_request) { create(:merge_request, source_project: project, target_project: project) }
-
- it_behaves_like 'page with comment and close button', 'Close merge request' do
- def setup
- visit merge_request_path(open_merge_request)
- end
- end
-
context 'when clicking the top `Close merge request` link', :aggregate_failures do
+ let(:open_merge_request) { create(:merge_request, source_project: project, target_project: project) }
+
before do
visit merge_request_path(open_merge_request)
end
@@ -40,8 +34,9 @@ RSpec.describe 'User closes/reopens a merge request', :js, quarantine: 'https://
end
context 'when clicking the bottom `Close merge request` button', :aggregate_failures do
+ let(:open_merge_request) { create(:merge_request, source_project: project, target_project: project) }
+
before do
- stub_feature_flags(remove_comment_close_reopen: false)
visit merge_request_path(open_merge_request)
end
@@ -61,22 +56,9 @@ RSpec.describe 'User closes/reopens a merge request', :js, quarantine: 'https://
end
describe 'when closed' do
- let(:closed_merge_request) { create(:merge_request, source_project: project, target_project: project, state: 'closed') }
-
- it_behaves_like 'page with comment and close button', 'Close merge request' do
- def setup
- visit merge_request_path(closed_merge_request)
-
- within '.detail-page-header' do
- click_button 'Toggle dropdown'
- click_link 'Reopen merge request'
- end
-
- wait_for_requests
- end
- end
-
context 'when clicking the top `Reopen merge request` link', :aggregate_failures do
+ let(:closed_merge_request) { create(:merge_request, source_project: project, target_project: project, state: 'closed') }
+
before do
visit merge_request_path(closed_merge_request)
end
@@ -96,8 +78,9 @@ RSpec.describe 'User closes/reopens a merge request', :js, quarantine: 'https://
end
context 'when clicking the bottom `Reopen merge request` button', :aggregate_failures do
+ let(:closed_merge_request) { create(:merge_request, source_project: project, target_project: project, state: 'closed') }
+
before do
- stub_feature_flags(remove_comment_close_reopen: false)
visit merge_request_path(closed_merge_request)
end
diff --git a/spec/features/merge_request/user_posts_diff_notes_spec.rb b/spec/features/merge_request/user_posts_diff_notes_spec.rb
index 794dfd7c8da..163ce10132e 100644
--- a/spec/features/merge_request/user_posts_diff_notes_spec.rb
+++ b/spec/features/merge_request/user_posts_diff_notes_spec.rb
@@ -192,7 +192,7 @@ RSpec.describe 'Merge request > User posts diff notes', :js do
it 'adds as discussion' do
should_allow_commenting(find('[id="6eb14e00385d2fb284765eb1cd8d420d33d63fc9_22_22"]'), asset_form_reset: false)
expect(page).to have_css('.notes_holder .note.note-discussion', count: 1)
- expect(page).to have_button('Reply...')
+ expect(page).to have_field('Reply…')
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 e629bc0dc53..3099a893dc2 100644
--- a/spec/features/merge_request/user_posts_notes_spec.rb
+++ b/spec/features/merge_request/user_posts_notes_spec.rb
@@ -44,7 +44,10 @@ RSpec.describe 'Merge request > User posts notes', :js do
it 'has enable submit button, preview button and saves content to local storage' do
page.within('.js-main-target-form') do
- expect(page).not_to have_css('.js-comment-button[disabled]')
+ page.within('[data-testid="comment-button"]') do
+ expect(page).to have_css('.split-content-button')
+ expect(page).not_to have_css('.split-content-button[disabled]')
+ end
expect(page).to have_css('.js-md-preview-button', visible: true)
end
diff --git a/spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb b/spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb
index b86586d53e2..caa04059469 100644
--- a/spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb
+++ b/spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb
@@ -149,7 +149,7 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js do
it 'allows user to comment' do
page.within '.diff-content' do
- click_button 'Reply...'
+ find_field('Reply…').click
find(".js-unresolve-checkbox").set false
find('.js-note-text').set 'testing'
@@ -179,7 +179,7 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js do
it 'allows user to comment & unresolve thread' do
page.within '.diff-content' do
- click_button 'Reply...'
+ find_field('Reply…').click
find('.js-note-text').set 'testing'
@@ -208,7 +208,7 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js do
it 'allows user to comment & resolve thread' do
page.within '.diff-content' do
- click_button 'Reply...'
+ find_field('Reply…').click
find('.js-note-text').set 'testing'
@@ -442,7 +442,7 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js do
it 'allows user to comment & resolve thread' do
page.within '.diff-content' do
- click_button 'Reply...'
+ find_field('Reply…').click
find('.js-note-text').set 'testing'
@@ -461,7 +461,7 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js do
page.within '.diff-content' do
click_button 'Resolve thread'
- click_button 'Reply...'
+ find_field('Reply…').click
find('.js-note-text').set 'testing'
diff --git a/spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb b/spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb
index d15d5b3bc73..90cdc28d1bd 100644
--- a/spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb
+++ b/spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb
@@ -37,7 +37,7 @@ RSpec.describe 'Merge request > User sees avatars on diff notes', :js do
end
it 'does not render avatars after commenting on discussion tab' do
- click_button 'Reply...'
+ find_field('Reply…').click
page.within('.js-discussion-note-form') do
find('.note-textarea').native.send_keys('Test comment')
@@ -132,7 +132,7 @@ RSpec.describe 'Merge request > User sees avatars on diff notes', :js do
end
it 'adds avatar when commenting' do
- click_button 'Reply...'
+ find_field('Reply…', match: :first).click
page.within '.js-discussion-note-form' do
find('.js-note-text').native.send_keys('Test')
@@ -151,7 +151,7 @@ RSpec.describe 'Merge request > User sees avatars on diff notes', :js do
it 'adds multiple comments' do
3.times do
- click_button 'Reply...'
+ find_field('Reply…', match: :first).click
page.within '.js-discussion-note-form' do
find('.js-note-text').native.send_keys('Test')
diff --git a/spec/features/merge_request/user_sees_discussions_spec.rb b/spec/features/merge_request/user_sees_discussions_spec.rb
index 289c861739f..d79763ba5e0 100644
--- a/spec/features/merge_request/user_sees_discussions_spec.rb
+++ b/spec/features/merge_request/user_sees_discussions_spec.rb
@@ -60,7 +60,7 @@ RSpec.describe 'Merge request > User sees threads', :js do
it 'can be replied to' do
within(".discussion[data-discussion-id='#{discussion_id}']") do
- click_button 'Reply...'
+ find_field('Reply…').click
fill_in 'note[note]', with: 'Test!'
click_button 'Comment'
diff --git a/spec/features/merge_request/user_sees_merge_request_pipelines_spec.rb b/spec/features/merge_request/user_sees_merge_request_pipelines_spec.rb
index 708ce53b4fe..ad0e9b48903 100644
--- a/spec/features/merge_request/user_sees_merge_request_pipelines_spec.rb
+++ b/spec/features/merge_request/user_sees_merge_request_pipelines_spec.rb
@@ -26,6 +26,7 @@ RSpec.describe 'Merge request > User sees pipelines triggered by merge request',
end
before do
+ stub_feature_flags(new_pipelines_table: false)
stub_application_setting(auto_devops_enabled: false)
stub_ci_pipeline_yaml_file(YAML.dump(config))
project.add_maintainer(user)
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 0854a8b9fb7..05fa5459e06 100644
--- a/spec/features/merge_request/user_sees_merge_widget_spec.rb
+++ b/spec/features/merge_request/user_sees_merge_widget_spec.rb
@@ -651,7 +651,6 @@ RSpec.describe 'Merge request > User sees merge widget', :js do
within(".js-report-section-container") do
expect(page).to have_content('rspec found 1 failed out of 1 total test')
expect(page).to have_content('junit found no changed test results out of 1 total test')
- expect(page).not_to have_content('New')
expect(page).to have_content('Test#sum when a is 1 and b is 3 returns summary')
end
end
@@ -792,7 +791,6 @@ RSpec.describe 'Merge request > User sees merge widget', :js do
within(".js-report-section-container") do
expect(page).to have_content('rspec found 1 error out of 1 total test')
expect(page).to have_content('junit found no changed test results out of 1 total test')
- expect(page).not_to have_content('New')
expect(page).to have_content('Test#sum when a is 4 and b is 4 returns summary')
end
end
diff --git a/spec/features/merge_request/user_sees_mini_pipeline_graph_spec.rb b/spec/features/merge_request/user_sees_mini_pipeline_graph_spec.rb
index 1ef6d2a1068..c0dc2ec3baf 100644
--- a/spec/features/merge_request/user_sees_mini_pipeline_graph_spec.rb
+++ b/spec/features/merge_request/user_sees_mini_pipeline_graph_spec.rb
@@ -9,166 +9,149 @@ RSpec.describe 'Merge request < User sees mini pipeline graph', :js do
let(:pipeline) { create(:ci_empty_pipeline, project: project, ref: 'master', status: 'running', sha: project.commit.id) }
let(:build) { create(:ci_build, pipeline: pipeline, stage: 'test') }
- shared_examples 'mini pipeline renders' do |ci_mini_pipeline_gl_dropdown_enabled|
- before do
- build.run
- build.trace.set('hello')
- sign_in(user)
- stub_feature_flags(ci_mini_pipeline_gl_dropdown: ci_mini_pipeline_gl_dropdown_enabled)
- visit_merge_request
- end
+ dropdown_selector = '[data-testid="mini-pipeline-graph-dropdown"]'
- let_it_be(:dropdown_toggle_selector) do
- if ci_mini_pipeline_gl_dropdown_enabled
- '[data-testid="mini-pipeline-graph-dropdown"] .dropdown-toggle'
- else
- '[data-testid="mini-pipeline-graph-dropdown-toggle"]'
- end
- end
+ before do
+ build.run
+ build.trace.set('hello')
+ sign_in(user)
+ visit_merge_request
+ end
- def visit_merge_request(format: :html, serializer: nil)
- visit project_merge_request_path(project, merge_request, format: format, serializer: serializer)
- end
+ def visit_merge_request(format: :html, serializer: nil)
+ visit project_merge_request_path(project, merge_request, format: format, serializer: serializer)
+ end
- it 'displays a mini pipeline graph' do
- expect(page).to have_selector('.mr-widget-pipeline-graph')
- end
+ it 'displays a mini pipeline graph' do
+ expect(page).to have_selector('.mr-widget-pipeline-graph')
+ end
- context 'as json' do
- let(:artifacts_file1) { fixture_file_upload(File.join('spec/fixtures/banana_sample.gif'), 'image/gif') }
- let(:artifacts_file2) { fixture_file_upload(File.join('spec/fixtures/dk.png'), 'image/png') }
+ context 'as json' do
+ let(:artifacts_file1) { fixture_file_upload(File.join('spec/fixtures/banana_sample.gif'), 'image/gif') }
+ let(:artifacts_file2) { fixture_file_upload(File.join('spec/fixtures/dk.png'), 'image/png') }
- before do
- job = create(:ci_build, :success, :trace_artifact, pipeline: pipeline)
- create(:ci_job_artifact, :archive, file: artifacts_file1, job: job)
- create(:ci_build, :manual, pipeline: pipeline, when: 'manual')
- end
+ before do
+ job = create(:ci_build, :success, :trace_artifact, pipeline: pipeline)
+ create(:ci_job_artifact, :archive, file: artifacts_file1, job: job)
+ create(:ci_build, :manual, pipeline: pipeline, when: 'manual')
+ end
- # TODO: https://gitlab.com/gitlab-org/gitlab-foss/issues/48034
- xit 'avoids repeated database queries' do
- before = ActiveRecord::QueryRecorder.new { visit_merge_request(format: :json, serializer: 'widget') }
+ # TODO: https://gitlab.com/gitlab-org/gitlab-foss/issues/48034
+ xit 'avoids repeated database queries' do
+ before = ActiveRecord::QueryRecorder.new { visit_merge_request(format: :json, serializer: 'widget') }
- job = create(:ci_build, :success, :trace_artifact, pipeline: pipeline)
- create(:ci_job_artifact, :archive, file: artifacts_file2, job: job)
- create(:ci_build, :manual, pipeline: pipeline, when: 'manual')
+ job = create(:ci_build, :success, :trace_artifact, pipeline: pipeline)
+ create(:ci_job_artifact, :archive, file: artifacts_file2, job: job)
+ create(:ci_build, :manual, pipeline: pipeline, when: 'manual')
- after = ActiveRecord::QueryRecorder.new { visit_merge_request(format: :json, serializer: 'widget') }
+ after = ActiveRecord::QueryRecorder.new { visit_merge_request(format: :json, serializer: 'widget') }
- expect(before.count).to eq(after.count)
- expect(before.cached_count).to eq(after.cached_count)
- end
+ expect(before.count).to eq(after.count)
+ expect(before.cached_count).to eq(after.cached_count)
end
+ end
- describe 'build list toggle' do
- let(:toggle) do
- find(dropdown_toggle_selector)
- first(dropdown_toggle_selector)
- end
+ describe 'build list toggle' do
+ let(:toggle) do
+ find(dropdown_selector)
+ first(dropdown_selector)
+ end
- # Status icon button styles should update as described in
- # https://gitlab.com/gitlab-org/gitlab-foss/issues/42769
- it 'has unique styles for default, :hover, :active, and :focus states' do
- default_background_color, default_foreground_color, default_box_shadow = get_toggle_colors(dropdown_toggle_selector)
+ # Status icon button styles should update as described in
+ # https://gitlab.com/gitlab-org/gitlab-foss/issues/42769
+ it 'has unique styles for default, :hover, :active, and :focus states' do
+ default_background_color, default_foreground_color, default_box_shadow = get_toggle_colors(dropdown_selector)
- toggle.hover
- hover_background_color, hover_foreground_color, hover_box_shadow = get_toggle_colors(dropdown_toggle_selector)
+ toggle.hover
+ hover_background_color, hover_foreground_color, hover_box_shadow = get_toggle_colors(dropdown_selector)
- page.driver.browser.action.click_and_hold(toggle.native).perform
- active_background_color, active_foreground_color, active_box_shadow = get_toggle_colors(dropdown_toggle_selector)
- page.driver.browser.action.release(toggle.native).perform
+ page.driver.browser.action.click_and_hold(toggle.native).perform
+ active_background_color, active_foreground_color, active_box_shadow = get_toggle_colors(dropdown_selector)
+ page.driver.browser.action.release(toggle.native).perform
- page.driver.browser.action.click(toggle.native).move_by(100, 100).perform
- focus_background_color, focus_foreground_color, focus_box_shadow = get_toggle_colors(dropdown_toggle_selector)
+ page.driver.browser.action.click(toggle.native).move_by(100, 100).perform
+ focus_background_color, focus_foreground_color, focus_box_shadow = get_toggle_colors(dropdown_selector)
- expect(default_background_color).not_to eq(hover_background_color)
- expect(hover_background_color).not_to eq(active_background_color)
- expect(default_background_color).not_to eq(active_background_color)
+ expect(default_background_color).not_to eq(hover_background_color)
+ expect(hover_background_color).not_to eq(active_background_color)
+ expect(default_background_color).not_to eq(active_background_color)
- expect(default_foreground_color).not_to eq(hover_foreground_color)
- expect(hover_foreground_color).not_to eq(active_foreground_color)
- expect(default_foreground_color).not_to eq(active_foreground_color)
+ expect(default_foreground_color).not_to eq(hover_foreground_color)
+ expect(hover_foreground_color).not_to eq(active_foreground_color)
+ expect(default_foreground_color).not_to eq(active_foreground_color)
- expect(focus_background_color).to eq(hover_background_color)
- expect(focus_foreground_color).to eq(hover_foreground_color)
+ expect(focus_background_color).to eq(hover_background_color)
+ expect(focus_foreground_color).to eq(hover_foreground_color)
- expect(default_box_shadow).to eq('none')
- expect(hover_box_shadow).to eq('none')
- expect(active_box_shadow).not_to eq('none')
- expect(focus_box_shadow).not_to eq('none')
- end
+ expect(default_box_shadow).to eq('none')
+ expect(hover_box_shadow).to eq('none')
+ expect(active_box_shadow).not_to eq('none')
+ expect(focus_box_shadow).not_to eq('none')
+ end
- it 'shows tooltip when hovered' do
- toggle.hover
+ it 'shows tooltip when hovered' do
+ toggle.hover
- expect(page).to have_selector('.tooltip')
- end
+ expect(page).to have_selector('.tooltip')
end
+ end
- describe 'builds list menu' do
- let(:toggle) do
- find(dropdown_toggle_selector)
- first(dropdown_toggle_selector)
- end
+ describe 'builds list menu' do
+ let(:toggle) do
+ find(dropdown_selector)
+ first(dropdown_selector)
+ end
- before do
- toggle.click
- wait_for_requests
- end
+ before do
+ toggle.click
+ wait_for_requests
+ end
- it 'pens when toggle is clicked' do
- expect(toggle.find(:xpath, '..')).to have_selector('.mini-pipeline-graph-dropdown-menu')
- end
+ it 'pens when toggle is clicked' do
+ expect(toggle.find(:xpath, '..')).to have_selector('.mini-pipeline-graph-dropdown-menu')
+ end
- it 'closes when toggle is clicked again' do
- toggle.click
+ it 'closes when toggle is clicked again' do
+ toggle.click
- expect(toggle.find(:xpath, '..')).not_to have_selector('.mini-pipeline-graph-dropdown-menu')
- end
+ expect(toggle.find(:xpath, '..')).not_to have_selector('.mini-pipeline-graph-dropdown-menu')
+ end
- it 'closes when clicking somewhere else' do
- find('body').click
+ it 'closes when clicking somewhere else' do
+ find('body').click
- expect(toggle.find(:xpath, '..')).not_to have_selector('.mini-pipeline-graph-dropdown-menu')
- end
+ expect(toggle.find(:xpath, '..')).not_to have_selector('.mini-pipeline-graph-dropdown-menu')
+ end
- describe 'build list build item' do
- let(:build_item) do
- find('.mini-pipeline-graph-dropdown-item')
- first('.mini-pipeline-graph-dropdown-item')
- end
+ describe 'build list build item' do
+ let(:build_item) do
+ find('.mini-pipeline-graph-dropdown-item')
+ first('.mini-pipeline-graph-dropdown-item')
+ end
- it 'visits the build page when clicked' do
- build_item.click
- find('.build-page')
+ it 'visits the build page when clicked' do
+ build_item.click
+ find('.build-page')
- expect(current_path).to eql(project_job_path(project, build))
- end
+ expect(current_path).to eql(project_job_path(project, build))
+ end
- it 'shows tooltip when hovered' do
- build_item.hover
+ it 'shows tooltip when hovered' do
+ build_item.hover
- expect(page).to have_selector('.tooltip')
- end
+ expect(page).to have_selector('.tooltip')
end
end
end
- context 'with ci_mini_pipeline_gl_dropdown disabled' do
- it_behaves_like "mini pipeline renders", false
- end
-
- context 'with ci_mini_pipeline_gl_dropdown enabled' do
- it_behaves_like "mini pipeline renders", true
- end
-
private
def get_toggle_colors(selector)
find(selector)
[
- evaluate_script("$('#{selector}:visible').css('background-color');"),
- evaluate_script("$('#{selector}:visible svg').css('fill');"),
- evaluate_script("$('#{selector}:visible').css('box-shadow');")
+ evaluate_script("$('#{selector} button:visible').css('background-color');"),
+ evaluate_script("$('#{selector} button:visible svg').css('fill');"),
+ evaluate_script("$('#{selector} button:visible').css('box-shadow');")
]
end
end
diff --git a/spec/features/merge_request/user_sees_notes_from_forked_project_spec.rb b/spec/features/merge_request/user_sees_notes_from_forked_project_spec.rb
index 20c45a1d652..ea46ae06329 100644
--- a/spec/features/merge_request/user_sees_notes_from_forked_project_spec.rb
+++ b/spec/features/merge_request/user_sees_notes_from_forked_project_spec.rb
@@ -27,7 +27,7 @@ RSpec.describe 'Merge request > User sees notes from forked project', :js do
expect(page).to have_content('A commit comment')
page.within('.discussion-notes') do
- find('.btn-text-field').click
+ find_field('Reply…').click
scroll_to(page.find('#note_note', visible: false))
find('#note_note').send_keys('A reply comment')
find('.js-comment-button').click
diff --git a/spec/features/merge_request/user_selects_branches_for_new_mr_spec.rb b/spec/features/merge_request/user_selects_branches_for_new_mr_spec.rb
index bf445de44ba..9850ca3f173 100644
--- a/spec/features/merge_request/user_selects_branches_for_new_mr_spec.rb
+++ b/spec/features/merge_request/user_selects_branches_for_new_mr_spec.rb
@@ -121,14 +121,14 @@ RSpec.describe 'Merge request > User selects branches for new MR', :js do
click_link 'Changes'
- expect(page).to have_css('a.btn.active', text: 'Inline')
- expect(page).not_to have_css('a.btn.active', text: 'Side-by-side')
+ expect(page).to have_css('a.btn.selected', text: 'Inline')
+ expect(page).not_to have_css('a.btn.selected', text: 'Side-by-side')
click_link 'Side-by-side'
within '.merge-request' do
- expect(page).not_to have_css('a.btn.active', text: 'Inline')
- expect(page).to have_css('a.btn.active', text: 'Side-by-side')
+ expect(page).not_to have_css('a.btn.selected', text: 'Inline')
+ expect(page).to have_css('a.btn.selected', text: 'Side-by-side')
end
end
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 bbeb91bbd19..dbc88d0cce2 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
@@ -83,7 +83,7 @@ RSpec.describe 'User comments on a diff', :js do
wait_for_requests
- click_button 'Reply...'
+ find_field('Reply…', match: :first).click
find('.js-suggestion-btn').click
diff --git a/spec/features/merge_request/user_toggles_whitespace_changes_spec.rb b/spec/features/merge_request/user_toggles_whitespace_changes_spec.rb
index 05f4c16ef60..b72ac071ecb 100644
--- a/spec/features/merge_request/user_toggles_whitespace_changes_spec.rb
+++ b/spec/features/merge_request/user_toggles_whitespace_changes_spec.rb
@@ -21,13 +21,13 @@ RSpec.describe 'Merge request > User toggles whitespace changes', :js do
describe 'clicking "Hide whitespace changes" button' do
it 'toggles the "Hide whitespace changes" button' do
- find('#show-whitespace').click
+ find('[data-testid="show-whitespace"]').click
visit diffs_project_merge_request_path(project, merge_request)
find('.js-show-diff-settings').click
- expect(find('#show-whitespace')).not_to be_checked
+ expect(find('[data-testid="show-whitespace"]')).not_to be_checked
end
end
end
diff --git a/spec/features/merge_requests/user_exports_as_csv_spec.rb b/spec/features/merge_requests/user_exports_as_csv_spec.rb
index a86ff9d7335..725b8366d04 100644
--- a/spec/features/merge_requests/user_exports_as_csv_spec.rb
+++ b/spec/features/merge_requests/user_exports_as_csv_spec.rb
@@ -14,11 +14,13 @@ RSpec.describe 'Merge Requests > Exports as CSV', :js do
subject { page.find('.nav-controls') }
- it { is_expected.to have_button('Export as CSV') }
+ it { is_expected.to have_selector '[data-testid="export-csv-button"]' }
context 'button is clicked' do
before do
- click_button('Export as CSV')
+ page.within('.nav-controls') do
+ find('[data-testid="export-csv-button"]').click
+ end
end
it 'shows a success message' do
diff --git a/spec/features/participants_autocomplete_spec.rb b/spec/features/participants_autocomplete_spec.rb
index d6f23b21d65..b22778012a8 100644
--- a/spec/features/participants_autocomplete_spec.rb
+++ b/spec/features/participants_autocomplete_spec.rb
@@ -85,6 +85,7 @@ RSpec.describe 'Member autocomplete', :js do
let(:note) { create(:note_on_commit, project: project, commit_id: project.commit.id) }
before do
+ allow(User).to receive(:find_by_any_email).and_call_original
allow(User).to receive(:find_by_any_email)
.with(noteable.author_email.downcase, confirmed: true).and_return(author)
diff --git a/spec/features/profiles/personal_access_tokens_spec.rb b/spec/features/profiles/personal_access_tokens_spec.rb
index 88bfc71cfbe..9e56ef087ae 100644
--- a/spec/features/profiles/personal_access_tokens_spec.rb
+++ b/spec/features/profiles/personal_access_tokens_spec.rb
@@ -138,4 +138,10 @@ RSpec.describe 'Profile > Personal Access Tokens', :js do
end
end
end
+
+ it 'pushes `personal_access_tokens_scoped_to_projects` feature flag to the frontend' do
+ visit profile_personal_access_tokens_path
+
+ expect(page).to have_pushed_frontend_feature_flags(personalAccessTokensScopedToProjects: true)
+ end
end
diff --git a/spec/features/profiles/user_visits_notifications_tab_spec.rb b/spec/features/profiles/user_visits_notifications_tab_spec.rb
index 289fbff0404..939e791c75d 100644
--- a/spec/features/profiles/user_visits_notifications_tab_spec.rb
+++ b/spec/features/profiles/user_visits_notifications_tab_spec.rb
@@ -7,7 +7,6 @@ RSpec.describe 'User visits the notifications tab', :js do
let(:user) { create(:user) }
before do
- stub_feature_flags(vue_notification_dropdown: false)
project.add_maintainer(user)
sign_in(user)
visit(profile_notifications_path)
@@ -16,17 +15,17 @@ RSpec.describe 'User visits the notifications tab', :js do
it 'changes the project notifications setting' do
expect(page).to have_content('Notifications')
- first('#notifications-button').click
- click_link('On mention')
+ first('[data-testid="notification-dropdown"]').click
+ click_button('On mention')
- expect(page).to have_selector('#notifications-button', text: 'On mention')
+ expect(page).to have_selector('[data-testid="notification-dropdown"]', text: 'On mention')
end
context 'when project emails are disabled' do
let(:project) { create(:project, emails_disabled: true) }
it 'notification button is disabled' do
- expect(page).to have_selector('.notifications-btn.disabled', visible: true)
+ expect(page).to have_selector('[data-testid="notification-dropdown"] .disabled')
end
end
end
diff --git a/spec/features/project_group_variables_spec.rb b/spec/features/project_group_variables_spec.rb
index d8eba20ac18..fc482261fb1 100644
--- a/spec/features/project_group_variables_spec.rb
+++ b/spec/features/project_group_variables_spec.rb
@@ -57,7 +57,7 @@ RSpec.describe 'Project group variables', :js do
wait_for_requests
- page.within('.ci-variable-table') do
+ page.within('[data-testid="ci-variable-table"]') do
expect(find('.js-ci-variable-row:nth-child(1) [data-label="Key"]').text).to eq(key1)
end
end
diff --git a/spec/features/project_variables_spec.rb b/spec/features/project_variables_spec.rb
index a7f94f38d85..327d8133411 100644
--- a/spec/features/project_variables_spec.rb
+++ b/spec/features/project_variables_spec.rb
@@ -24,7 +24,6 @@ RSpec.describe 'Project variables', :js do
find('[data-qa-selector="ci_variable_key_field"] input').set('akey')
find('#ci-variable-value').set('akey_value')
find('[data-testid="environment-scope"]').click
- find_button('clear').click
find('[data-testid="ci-environment-search"]').set('review/*')
find('[data-testid="create-wildcard-button"]').click
@@ -33,7 +32,7 @@ RSpec.describe 'Project variables', :js do
wait_for_requests
- page.within('.ci-variable-table') do
+ page.within('[data-testid="ci-variable-table"]') do
expect(find('.js-ci-variable-row:first-child [data-label="Environments"]').text).to eq('review/*')
end
end
diff --git a/spec/features/projects/active_tabs_spec.rb b/spec/features/projects/active_tabs_spec.rb
index 8001ce0f454..86fe59f003f 100644
--- a/spec/features/projects/active_tabs_spec.rb
+++ b/spec/features/projects/active_tabs_spec.rb
@@ -132,13 +132,13 @@ RSpec.describe 'Project active tab' do
it_behaves_like 'page has active sub tab', _('Value Stream')
end
- context 'on project Analytics/"CI / CD"' do
+ context 'on project Analytics/"CI/CD"' do
before do
- click_tab(_('CI / CD'))
+ click_tab(_('CI/CD'))
end
it_behaves_like 'page has active tab', _('Analytics')
- it_behaves_like 'page has active sub tab', _('CI / CD')
+ it_behaves_like 'page has active sub tab', _('CI/CD')
end
end
end
diff --git a/spec/features/projects/ci/lint_spec.rb b/spec/features/projects/ci/lint_spec.rb
index ccffe25f45e..353c8558185 100644
--- a/spec/features/projects/ci/lint_spec.rb
+++ b/spec/features/projects/ci/lint_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'CI Lint', :js do
+RSpec.describe 'CI Lint', :js, quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/297782' do
include Spec::Support::Helpers::Features::EditorLiteSpecHelpers
let(:project) { create(:project, :repository) }
diff --git a/spec/features/projects/container_registry_spec.rb b/spec/features/projects/container_registry_spec.rb
index d0ad6668c07..40d0260eafd 100644
--- a/spec/features/projects/container_registry_spec.rb
+++ b/spec/features/projects/container_registry_spec.rb
@@ -82,7 +82,13 @@ RSpec.describe 'Container Registry', :js do
end
it 'shows the image title' do
- expect(page).to have_content 'my/image tags'
+ expect(page).to have_content 'my/image'
+ end
+
+ it 'shows the image tags' do
+ expect(page).to have_content 'Image tags'
+ first_tag = first('[data-testid="name"]')
+ expect(first_tag).to have_content '1'
end
it 'user removes a specific tag from container repository' do
diff --git a/spec/features/projects/environments/environments_spec.rb b/spec/features/projects/environments/environments_spec.rb
index 27167f95104..de7ff1c473d 100644
--- a/spec/features/projects/environments/environments_spec.rb
+++ b/spec/features/projects/environments/environments_spec.rb
@@ -429,37 +429,67 @@ RSpec.describe 'Environments page', :js do
end
describe 'environments folders' do
- before do
- create(:environment, :will_auto_stop,
- project: project,
- name: 'staging/review-1',
- state: :available)
- create(:environment, :will_auto_stop,
- project: project,
- name: 'staging/review-2',
- state: :available)
- end
+ describe 'available environments' do
+ before do
+ create(:environment, :will_auto_stop,
+ project: project,
+ name: 'staging/review-1',
+ state: :available)
+ create(:environment, :will_auto_stop,
+ project: project,
+ name: 'staging/review-2',
+ state: :available)
+ end
- it 'users unfurls an environment folder' do
- visit_environments(project)
+ it 'users unfurls an environment folder' do
+ visit_environments(project)
- expect(page).not_to have_content 'review-1'
- expect(page).not_to have_content 'review-2'
- expect(page).to have_content 'staging 2'
+ expect(page).not_to have_content 'review-1'
+ expect(page).not_to have_content 'review-2'
+ expect(page).to have_content 'staging 2'
- within('.folder-row') do
- find('.folder-name', text: 'staging').click
- end
+ within('.folder-row') do
+ find('.folder-name', text: 'staging').click
+ end
- expect(page).to have_content 'review-1'
- expect(page).to have_content 'review-2'
- within('.ci-table') do
- within('[data-qa-selector="environment_item"]', text: 'review-1') do
- expect(find('.js-auto-stop').text).not_to be_empty
+ expect(page).to have_content 'review-1'
+ expect(page).to have_content 'review-2'
+ within('.ci-table') do
+ within('[data-qa-selector="environment_item"]', text: 'review-1') do
+ expect(find('.js-auto-stop').text).not_to be_empty
+ end
+ within('[data-qa-selector="environment_item"]', text: 'review-2') do
+ expect(find('.js-auto-stop').text).not_to be_empty
+ end
end
- within('[data-qa-selector="environment_item"]', text: 'review-2') do
- expect(find('.js-auto-stop').text).not_to be_empty
+ end
+ end
+
+ describe 'stopped environments' do
+ before do
+ create(:environment, :will_auto_stop,
+ project: project,
+ name: 'staging/review-1',
+ state: :stopped)
+ create(:environment, :will_auto_stop,
+ project: project,
+ name: 'staging/review-2',
+ state: :stopped)
+ end
+
+ it 'users unfurls an environment folder' do
+ visit_environments(project, scope: 'stopped')
+
+ expect(page).not_to have_content 'review-1'
+ expect(page).not_to have_content 'review-2'
+ expect(page).to have_content 'staging 2'
+
+ within('.folder-row') do
+ find('.folder-name', text: 'staging').click
end
+
+ expect(page).to have_content 'review-1'
+ expect(page).to have_content 'review-2'
end
end
end
diff --git a/spec/features/projects/feature_flags/user_sees_feature_flag_list_spec.rb b/spec/features/projects/feature_flags/user_sees_feature_flag_list_spec.rb
index f5941d0ff15..50fc7bb0753 100644
--- a/spec/features/projects/feature_flags/user_sees_feature_flag_list_spec.rb
+++ b/spec/features/projects/feature_flags/user_sees_feature_flag_list_spec.rb
@@ -104,7 +104,7 @@ RSpec.describe 'User sees feature flag list', :js do
it 'shows empty page' do
expect(page).to have_text 'Get started with feature flags'
- expect(page).to have_selector('.btn-success', text: 'New feature flag')
+ expect(page).to have_selector('.btn-confirm', text: 'New feature flag')
expect(page).to have_selector('[data-qa-selector="configure_feature_flags_button"]', text: 'Configure')
end
end
diff --git a/spec/features/projects/files/gitlab_ci_syntax_yml_dropdown_spec.rb b/spec/features/projects/files/gitlab_ci_syntax_yml_dropdown_spec.rb
index ca6f03472dd..cd796d45aba 100644
--- a/spec/features/projects/files/gitlab_ci_syntax_yml_dropdown_spec.rb
+++ b/spec/features/projects/files/gitlab_ci_syntax_yml_dropdown_spec.rb
@@ -5,11 +5,13 @@ require 'spec_helper'
RSpec.describe 'Projects > Files > User wants to add a .gitlab-ci.yml file' do
include Spec::Support::Helpers::Features::EditorLiteSpecHelpers
+ let_it_be(:namespace) { create(:namespace) }
+ let(:project) { create(:project, :repository, namespace: namespace) }
+
before do
- project = create(:project, :repository)
sign_in project.owner
- stub_experiment(ci_syntax_templates: experiment_active)
- stub_experiment_for_subject(ci_syntax_templates: in_experiment_group)
+ stub_experiment(ci_syntax_templates_b: experiment_active)
+ stub_experiment_for_subject(ci_syntax_templates_b: in_experiment_group)
visit project_new_blob_path(project, 'master', file_name: '.gitlab-ci.yml')
end
@@ -23,35 +25,45 @@ RSpec.describe 'Projects > Files > User wants to add a .gitlab-ci.yml file' do
end
end
- context 'when experiment is active and the user is in the control group' do
+ context 'when experiment is active' do
let(:experiment_active) { true }
- let(:in_experiment_group) { false }
- it 'does not show the "Learn CI/CD syntax" template dropdown' do
- expect(page).not_to have_css('.gitlab-ci-syntax-yml-selector')
+ context 'when the user is in the control group' do
+ let(:in_experiment_group) { false }
+
+ it 'does not show the "Learn CI/CD syntax" template dropdown' do
+ expect(page).not_to have_css('.gitlab-ci-syntax-yml-selector')
+ end
end
- end
- context 'when experiment is active and the user is in the experimental group' do
- let(:experiment_active) { true }
- let(:in_experiment_group) { true }
+ context 'when the user is in the experimental group' do
+ let(:in_experiment_group) { true }
+
+ it 'allows the user to pick a "Learn CI/CD syntax" template from the dropdown', :js do
+ expect(page).to have_css('.gitlab-ci-syntax-yml-selector')
- it 'allows the user to pick a "Learn CI/CD syntax" template from the dropdown', :js do
- expect(page).to have_css('.gitlab-ci-syntax-yml-selector')
+ find('.js-gitlab-ci-syntax-yml-selector').click
- find('.js-gitlab-ci-syntax-yml-selector').click
+ wait_for_requests
- wait_for_requests
+ within '.gitlab-ci-syntax-yml-selector' do
+ find('.dropdown-input-field').set('Artifacts example')
+ find('.dropdown-content .is-focused', text: 'Artifacts example').click
+ end
- within '.gitlab-ci-syntax-yml-selector' do
- find('.dropdown-input-field').set('Artifacts example')
- find('.dropdown-content .is-focused', text: 'Artifacts example').click
+ wait_for_requests
+
+ expect(page).to have_css('.gitlab-ci-syntax-yml-selector .dropdown-toggle-text', text: 'Learn CI/CD syntax')
+ expect(editor_get_value).to have_content('You can use artifacts to pass data to jobs in later stages.')
end
- wait_for_requests
+ context 'when the group is created longer than 90 days ago' do
+ let(:namespace) { create(:namespace, created_at: 91.days.ago) }
- expect(page).to have_css('.gitlab-ci-syntax-yml-selector .dropdown-toggle-text', text: 'Learn CI/CD syntax')
- expect(editor_get_value).to have_content('You can use artifacts to pass data to jobs in later stages.')
+ it 'does not show the "Learn CI/CD syntax" template dropdown' do
+ expect(page).not_to have_css('.gitlab-ci-syntax-yml-selector')
+ end
+ end
end
end
end
diff --git a/spec/features/projects/fork_spec.rb b/spec/features/projects/fork_spec.rb
index 8d0500f5e13..7abbd207b24 100644
--- a/spec/features/projects/fork_spec.rb
+++ b/spec/features/projects/fork_spec.rb
@@ -12,45 +12,27 @@ RSpec.describe 'Project fork' do
sign_in(user)
end
- it 'allows user to fork project from the project page' do
- visit project_path(project)
-
- expect(page).not_to have_css('a.disabled', text: 'Fork')
- end
-
- context 'user has exceeded personal project limit' do
- before do
- user.update!(projects_limit: 0)
- end
-
- it 'disables fork button on project page' do
+ shared_examples 'fork button on project page' do
+ it 'allows user to fork project from the project page' do
visit project_path(project)
- expect(page).to have_css('a.disabled', text: 'Fork')
+ expect(page).not_to have_css('a.disabled', text: 'Fork')
end
- context 'with a group to fork to' do
- let!(:group) { create(:group).tap { |group| group.add_owner(user) } }
-
- it 'enables fork button on project page' do
- visit project_path(project)
-
- expect(page).not_to have_css('a.disabled', text: 'Fork')
+ context 'user has exceeded personal project limit' do
+ before do
+ user.update!(projects_limit: 0)
end
- it 'allows user to fork only to the group on fork page', :js do
- visit new_project_fork_path(project)
-
- to_personal_namespace = find('[data-qa-selector=fork_namespace_button].disabled')
- to_group = find(".fork-groups button[data-qa-name=#{group.name}]")
+ it 'disables fork button on project page' do
+ visit project_path(project)
- expect(to_personal_namespace).not_to be_nil
- expect(to_group).not_to be_disabled
+ expect(page).to have_css('a.disabled', text: 'Fork')
end
end
end
- context 'forking enabled / disabled in project settings' do
+ shared_examples 'create fork page' do |fork_page_text|
before do
project.project_feature.update_attribute(
:forking_access_level, forking_access_level)
@@ -70,7 +52,7 @@ RSpec.describe 'Project fork' do
visit new_project_fork_path(project)
expect(page.status_code).to eq(200)
- expect(page).to have_text(' Select a namespace to fork the project ')
+ expect(page).to have_text(fork_page_text)
end
end
@@ -127,92 +109,88 @@ RSpec.describe 'Project fork' do
visit new_project_fork_path(project)
expect(page.status_code).to eq(200)
- expect(page).to have_text(' Select a namespace to fork the project ')
+ expect(page).to have_text(fork_page_text)
end
end
end
end
- it 'forks the project', :sidekiq_might_not_need_inline do
- visit project_path(project)
-
- click_link 'Fork'
+ it_behaves_like 'fork button on project page'
+ it_behaves_like 'create fork page', 'Fork project'
- page.within '.fork-thumbnail-container' do
- click_link 'Select'
+ context 'with fork_project_form feature flag disabled' do
+ before do
+ stub_feature_flags(fork_project_form: false)
+ sign_in(user)
end
- expect(page).to have_content 'Forked from'
+ it_behaves_like 'fork button on project page'
- visit project_path(project)
+ context 'user has exceeded personal project limit' do
+ before do
+ user.update!(projects_limit: 0)
+ end
- expect(page).to have_content(/new merge request/i)
+ context 'with a group to fork to' do
+ let!(:group) { create(:group).tap { |group| group.add_owner(user) } }
- page.within '.nav-sidebar' do
- first(:link, 'Merge Requests').click
- end
+ it 'allows user to fork only to the group on fork page', :js do
+ visit new_project_fork_path(project)
- expect(page).to have_content(/new merge request/i)
+ to_personal_namespace = find('[data-qa-selector=fork_namespace_button].disabled')
+ to_group = find(".fork-groups button[data-qa-name=#{group.name}]")
- page.within '#content-body' do
- click_link('New merge request')
+ expect(to_personal_namespace).not_to be_nil
+ expect(to_group).not_to be_disabled
+ end
+ end
end
- expect(current_path).to have_content(/#{user.namespace.path}/i)
- end
+ it_behaves_like 'create fork page', ' Select a namespace to fork the project '
- it 'shows avatars when Gravatar is disabled' do
- stub_application_setting(gravatar_enabled: false)
+ it 'forks the project', :sidekiq_might_not_need_inline do
+ visit project_path(project)
- visit project_path(project)
+ click_link 'Fork'
- click_link 'Fork'
+ page.within '.fork-thumbnail-container' do
+ click_link 'Select'
+ end
- page.within('.fork-thumbnail-container') do
- expect(page).to have_css('div.identicon')
- end
- end
+ expect(page).to have_content 'Forked from'
- it 'shows the forked project on the list' do
- visit project_path(project)
+ visit project_path(project)
- click_link 'Fork'
+ expect(page).to have_content(/new merge request/i)
- page.within '.fork-thumbnail-container' do
- click_link 'Select'
- end
+ page.within '.nav-sidebar' do
+ first(:link, 'Merge Requests').click
+ end
- visit project_forks_path(project)
+ expect(page).to have_content(/new merge request/i)
- forked_project = user.fork_of(project.reload)
+ page.within '#content-body' do
+ click_link('New merge request')
+ end
- page.within('.js-projects-list-holder') do
- expect(page).to have_content("#{forked_project.namespace.human_name} / #{forked_project.name}")
+ expect(current_path).to have_content(/#{user.namespace.path}/i)
end
- forked_project.update!(path: 'test-crappy-path')
-
- visit project_forks_path(project)
+ it 'shows avatars when Gravatar is disabled' do
+ stub_application_setting(gravatar_enabled: false)
- page.within('.js-projects-list-holder') do
- expect(page).to have_content("#{forked_project.namespace.human_name} / #{forked_project.name}")
- end
- end
+ visit project_path(project)
- context 'when the project is private' do
- let(:project) { create(:project, :repository) }
- let(:another_user) { create(:user, name: 'Mike') }
+ click_link 'Fork'
- before do
- project.add_reporter(user)
- project.add_reporter(another_user)
+ page.within('.fork-thumbnail-container') do
+ expect(page).to have_css('div.identicon')
+ end
end
- it 'renders private forks of the project' do
+ it 'shows the forked project on the list' do
visit project_path(project)
- another_project_fork = Projects::ForkService.new(project, another_user).execute
-
click_link 'Fork'
page.within '.fork-thumbnail-container' do
@@ -221,79 +199,117 @@ RSpec.describe 'Project fork' do
visit project_forks_path(project)
+ forked_project = user.fork_of(project.reload)
+
page.within('.js-projects-list-holder') do
- user_project_fork = user.fork_of(project.reload)
- expect(page).to have_content("#{user_project_fork.namespace.human_name} / #{user_project_fork.name}")
+ expect(page).to have_content("#{forked_project.namespace.human_name} / #{forked_project.name}")
end
- expect(page).not_to have_content("#{another_project_fork.namespace.human_name} / #{another_project_fork.name}")
- end
- end
+ forked_project.update!(path: 'test-crappy-path')
- context 'when the user already forked the project' do
- before do
- create(:project, :repository, name: project.name, namespace: user.namespace)
- end
+ visit project_forks_path(project)
- it 'renders error' do
- visit project_path(project)
+ page.within('.js-projects-list-holder') do
+ expect(page).to have_content("#{forked_project.namespace.human_name} / #{forked_project.name}")
+ end
+ end
- click_link 'Fork'
+ context 'when the project is private' do
+ let(:project) { create(:project, :repository) }
+ let(:another_user) { create(:user, name: 'Mike') }
- page.within '.fork-thumbnail-container' do
- click_link 'Select'
+ before do
+ project.add_reporter(user)
+ project.add_reporter(another_user)
end
- expect(page).to have_content "Name has already been taken"
- end
- end
+ it 'renders private forks of the project' do
+ visit project_path(project)
- context 'maintainer in group' do
- let(:group) { create(:group) }
+ another_project_fork = Projects::ForkService.new(project, another_user).execute
- before do
- group.add_maintainer(user)
- end
+ click_link 'Fork'
- it 'allows user to fork project to group or to user namespace', :js do
- visit project_path(project)
- wait_for_requests
+ page.within '.fork-thumbnail-container' do
+ click_link 'Select'
+ end
- expect(page).not_to have_css('a.disabled', text: 'Fork')
+ visit project_forks_path(project)
- click_link 'Fork'
+ page.within('.js-projects-list-holder') do
+ user_project_fork = user.fork_of(project.reload)
+ expect(page).to have_content("#{user_project_fork.namespace.human_name} / #{user_project_fork.name}")
+ end
- expect(page).to have_css('.fork-thumbnail')
- expect(page).to have_css('.group-row')
- expect(page).not_to have_css('.fork-thumbnail.disabled')
+ expect(page).not_to have_content("#{another_project_fork.namespace.human_name} / #{another_project_fork.name}")
+ end
end
- it 'allows user to fork project to group and not user when exceeded project limit', :js do
- user.projects_limit = 0
- user.save!
+ context 'when the user already forked the project' do
+ before do
+ create(:project, :repository, name: project.name, namespace: user.namespace)
+ end
- visit project_path(project)
- wait_for_requests
+ it 'renders error' do
+ visit project_path(project)
- expect(page).not_to have_css('a.disabled', text: 'Fork')
+ click_link 'Fork'
- click_link 'Fork'
+ page.within '.fork-thumbnail-container' do
+ click_link 'Select'
+ end
- expect(page).to have_css('.fork-thumbnail.disabled')
- expect(page).to have_css('.group-row')
+ expect(page).to have_content "Name has already been taken"
+ end
end
- it 'links to the fork if the project was already forked within that namespace', :sidekiq_might_not_need_inline, :js do
- forked_project = fork_project(project, user, namespace: group, repository: true)
+ context 'maintainer in group' do
+ let(:group) { create(:group) }
+
+ before do
+ group.add_maintainer(user)
+ end
+
+ it 'allows user to fork project to group or to user namespace', :js do
+ visit project_path(project)
+ wait_for_requests
+
+ expect(page).not_to have_css('a.disabled', text: 'Fork')
+
+ click_link 'Fork'
+
+ expect(page).to have_css('.fork-thumbnail')
+ expect(page).to have_css('.group-row')
+ expect(page).not_to have_css('.fork-thumbnail.disabled')
+ end
+
+ it 'allows user to fork project to group and not user when exceeded project limit', :js do
+ user.projects_limit = 0
+ user.save!
+
+ visit project_path(project)
+ wait_for_requests
+
+ expect(page).not_to have_css('a.disabled', text: 'Fork')
- visit new_project_fork_path(project)
- wait_for_requests
+ click_link 'Fork'
- expect(page).to have_css('.group-row a.btn', text: 'Go to fork')
+ expect(page).to have_css('.fork-thumbnail.disabled')
+ expect(page).to have_css('.group-row')
+ end
+
+ it 'links to the fork if the project was already forked within that namespace', :sidekiq_might_not_need_inline, :js do
+ forked_project = fork_project(project, user, namespace: group, repository: true)
+
+ visit new_project_fork_path(project)
+ wait_for_requests
+
+ expect(page).to have_css('.group-row a.btn', text: 'Go to fork')
- click_link 'Go to fork'
+ click_link 'Go to fork'
- expect(current_path).to eq(project_path(forked_project))
+ expect(current_path).to eq(project_path(forked_project))
+ end
end
end
end
diff --git a/spec/features/projects/members/anonymous_user_sees_members_spec.rb b/spec/features/projects/members/anonymous_user_sees_members_spec.rb
index d710ecf6c88..6b92581d704 100644
--- a/spec/features/projects/members/anonymous_user_sees_members_spec.rb
+++ b/spec/features/projects/members/anonymous_user_sees_members_spec.rb
@@ -14,25 +14,9 @@ RSpec.describe 'Projects > Members > Anonymous user sees members' do
create(:project_group_link, project: project, group: group)
end
- context 'when `vue_project_members_list` feature flag is enabled', :js do
- it "anonymous user visits the project's members page and sees the list of members" do
- visit project_project_members_path(project)
+ it "anonymous user visits the project's members page and sees the list of members", :js do
+ visit project_project_members_path(project)
- expect(find_member_row(user)).to have_content(user.name)
- end
- end
-
- context 'when `vue_project_members_list` feature flag is disabled' do
- before do
- stub_feature_flags(vue_project_members_list: false)
- end
-
- it "anonymous user visits the project's members page and sees the list of members" do
- visit project_project_members_path(project)
-
- expect(current_path).to eq(
- project_project_members_path(project))
- expect(page).to have_content(user.name)
- end
+ expect(find_member_row(user)).to have_content(user.name)
end
end
diff --git a/spec/features/projects/members/group_members_spec.rb b/spec/features/projects/members/group_members_spec.rb
index 1abd00421ec..94ce18fef93 100644
--- a/spec/features/projects/members/group_members_spec.rb
+++ b/spec/features/projects/members/group_members_spec.rb
@@ -20,218 +20,96 @@ RSpec.describe 'Projects members', :js do
sign_in(user)
end
- context 'when `vue_project_members_list` feature flag is enabled' do
- context 'with a group invitee' do
- before do
- group_invitee
- visit project_project_members_path(project)
- end
-
- it 'does not appear in the project members page' do
- expect(members_table).not_to have_content('test2@abc.com')
- end
+ context 'with a group invitee' do
+ before do
+ group_invitee
+ visit project_project_members_path(project)
end
- context 'with a group' do
- it 'shows group and project members by default' do
- visit project_project_members_path(project)
-
- expect(members_table).to have_content(developer.name)
- expect(members_table).to have_content(user.name)
- expect(members_table).to have_content(group.name)
- end
-
- it 'shows project members only if requested' do
- visit project_project_members_path(project, with_inherited_permissions: 'exclude')
-
- expect(members_table).to have_content(developer.name)
- expect(members_table).not_to have_content(user.name)
- expect(members_table).not_to have_content(group.name)
- end
+ it 'does not appear in the project members page' do
+ expect(members_table).not_to have_content('test2@abc.com')
+ end
+ end
- it 'shows group members only if requested' do
- visit project_project_members_path(project, with_inherited_permissions: 'only')
+ context 'with a group' do
+ it 'shows group and project members by default' do
+ visit project_project_members_path(project)
- expect(members_table).not_to have_content(developer.name)
- expect(members_table).to have_content(user.name)
- expect(members_table).to have_content(group.name)
- end
+ expect(members_table).to have_content(developer.name)
+ expect(members_table).to have_content(user.name)
+ expect(members_table).to have_content(group.name)
end
- context 'with a group, a project invitee, and a project requester' do
- before do
- group.request_access(group_requester)
- project.request_access(project_requester)
- group_invitee
- project_invitee
- visit project_project_members_path(project)
- end
-
- it 'shows the group owner' do
- expect(members_table).to have_content(user.name)
- expect(members_table).to have_content(group.name)
- end
-
- it 'shows the project developer' do
- expect(members_table).to have_content(developer.name)
- end
-
- it 'shows the project invitee' do
- click_link 'Invited'
-
- expect(members_table).to have_content('test1@abc.com')
- expect(members_table).not_to have_content('test2@abc.com')
- end
-
- it 'shows the project requester' do
- click_link 'Access requests'
-
- expect(members_table).to have_content(project_requester.name)
- expect(members_table).not_to have_content(group_requester.name)
- end
- end
+ it 'shows project members only if requested' do
+ visit project_project_members_path(project, with_inherited_permissions: 'exclude')
- context 'with a group requester' do
- before do
- stub_feature_flags(invite_members_group_modal: false)
- group.request_access(group_requester)
- visit project_project_members_path(project)
- end
-
- it 'does not appear in the project members page' do
- expect(page).not_to have_link('Access requests')
- expect(members_table).not_to have_content(group_requester.name)
- end
+ expect(members_table).to have_content(developer.name)
+ expect(members_table).not_to have_content(user.name)
+ expect(members_table).not_to have_content(group.name)
end
- context 'showing status of members' do
- it 'shows the status' do
- create(:user_status, user: user, emoji: 'smirk', message: 'Authoring this object')
+ it 'shows group members only if requested' do
+ visit project_project_members_path(project, with_inherited_permissions: 'only')
- visit project_project_members_path(project)
-
- expect(first_row).to have_selector('gl-emoji[data-name="smirk"]')
- end
+ expect(members_table).not_to have_content(developer.name)
+ expect(members_table).to have_content(user.name)
+ expect(members_table).to have_content(group.name)
end
end
- context 'when `vue_project_members_list` feature flag is disabled' do
+ context 'with a group, a project invitee, and a project requester' do
before do
- stub_feature_flags(vue_project_members_list: false)
+ group.request_access(group_requester)
+ project.request_access(project_requester)
+ group_invitee
+ project_invitee
+ visit project_project_members_path(project)
end
- context 'with a group invitee' do
- before do
- group_invitee
- visit project_project_members_path(project)
- end
-
- it 'does not appear in the project members page' do
- page.within first('.content-list') do
- expect(page).not_to have_content('test2@abc.com')
- end
- end
+ it 'shows the group owner' do
+ expect(members_table).to have_content(user.name)
+ expect(members_table).to have_content(group.name)
end
- context 'with a group' do
- it 'shows group and project members by default' do
- visit project_project_members_path(project)
-
- page.within first('.content-list') do
- expect(page).to have_content(developer.name)
-
- expect(page).to have_content(user.name)
- expect(page).to have_content(group.name)
- end
- end
-
- it 'shows project members only if requested' do
- visit project_project_members_path(project, with_inherited_permissions: 'exclude')
-
- page.within first('.content-list') do
- expect(page).to have_content(developer.name)
+ it 'shows the project developer' do
+ expect(members_table).to have_content(developer.name)
+ end
- expect(page).not_to have_content(user.name)
- expect(page).not_to have_content(group.name)
- end
- end
+ it 'shows the project invitee' do
+ click_link 'Invited'
- it 'shows group members only if requested' do
- visit project_project_members_path(project, with_inherited_permissions: 'only')
+ expect(members_table).to have_content('test1@abc.com')
+ expect(members_table).not_to have_content('test2@abc.com')
+ end
- page.within first('.content-list') do
- expect(page).not_to have_content(developer.name)
+ it 'shows the project requester' do
+ click_link 'Access requests'
- expect(page).to have_content(user.name)
- expect(page).to have_content(group.name)
- end
- end
+ expect(members_table).to have_content(project_requester.name)
+ expect(members_table).not_to have_content(group_requester.name)
end
+ end
- context 'with a group, a project invitee, and a project requester' do
- before do
- group.request_access(group_requester)
- project.request_access(project_requester)
- group_invitee
- project_invitee
- visit project_project_members_path(project)
- end
-
- it 'shows the group owner' do
- page.within first('.content-list') do
- # Group owner
- expect(page).to have_content(user.name)
- expect(page).to have_content(group.name)
- end
- end
-
- it 'shows the project developer' do
- page.within first('.content-list') do
- # Project developer
- expect(page).to have_content(developer.name)
- end
- end
-
- it 'shows the project invitee' do
- click_link 'Invited'
-
- page.within first('.content-list') do
- expect(page).to have_content('test1@abc.com')
- expect(page).not_to have_content('test2@abc.com')
- end
- end
-
- it 'shows the project requester' do
- click_link 'Access requests'
-
- page.within first('.content-list') do
- expect(page).to have_content(project_requester.name)
- expect(page).not_to have_content(group_requester.name)
- end
- end
+ context 'with a group requester' do
+ before do
+ stub_feature_flags(invite_members_group_modal: false)
+ group.request_access(group_requester)
+ visit project_project_members_path(project)
end
- context 'with a group requester' do
- before do
- stub_feature_flags(invite_members_group_modal: false)
- group.request_access(group_requester)
- visit project_project_members_path(project)
- end
-
- it 'does not appear in the project members page' do
- expect(page).not_to have_link('Access requests')
- page.within first('.content-list') do
- expect(page).not_to have_content(group_requester.name)
- end
- end
+ it 'does not appear in the project members page' do
+ expect(page).not_to have_link('Access requests')
+ expect(members_table).not_to have_content(group_requester.name)
end
+ end
+
+ context 'showing status of members' do
+ it 'shows the status' do
+ create(:user_status, user: user, emoji: 'smirk', message: 'Authoring this object')
- context 'showing status of members' do
- it_behaves_like 'showing user status' do
- let(:user_with_status) { developer }
+ visit project_project_members_path(project)
- subject { visit project_project_members_path(project) }
- end
+ expect(first_row).to have_selector('gl-emoji[data-name="smirk"]')
end
end
end
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 9d087dfd5f6..6a1d26983b5 100644
--- a/spec/features/projects/members/groups_with_access_list_spec.rb
+++ b/spec/features/projects/members/groups_with_access_list_spec.rb
@@ -17,172 +17,80 @@ RSpec.describe 'Projects > Members > Groups with access list', :js do
project.add_maintainer(user)
sign_in(user)
- end
-
- context 'when `vue_project_members_list` feature flag is enabled' do
- before do
- visit project_project_members_path(project)
- click_groups_tab
- end
-
- it 'updates group access level' do
- click_button group_link.human_access
- click_button 'Guest'
-
- wait_for_requests
-
- visit project_project_members_path(project)
- click_groups_tab
-
- expect(find_group_row(group)).to have_content('Guest')
- end
+ visit project_project_members_path(project)
+ click_groups_tab
+ end
- it 'updates expiry date' do
- page.within find_group_row(group) do
- fill_in 'Expiration date', with: 5.days.from_now.to_date
- find_field('Expiration date').native.send_keys :enter
+ it 'updates group access level' do
+ click_button group_link.human_access
+ click_button 'Guest'
- wait_for_requests
+ wait_for_requests
- expect(page).to have_content(/in \d days/)
- end
- end
+ visit project_project_members_path(project)
- context 'when link has expiry date set' do
- let(:additional_link_attrs) { { expires_at: 5.days.from_now.to_date } }
+ click_groups_tab
- it 'clears expiry date' do
- page.within find_group_row(group) do
- expect(page).to have_content(/in \d days/)
+ expect(find_group_row(group)).to have_content('Guest')
+ end
- find('[data-testid="clear-button"]').click
+ it 'updates expiry date' do
+ page.within find_group_row(group) do
+ fill_in 'Expiration date', with: 5.days.from_now.to_date
+ find_field('Expiration date').native.send_keys :enter
- wait_for_requests
+ wait_for_requests
- expect(page).to have_content('No expiration set')
- end
- end
+ expect(page).to have_content(/in \d days/)
end
+ end
- it 'deletes group link' do
- expect(page).to have_content(group.full_name)
+ context 'when link has expiry date set' do
+ let(:additional_link_attrs) { { expires_at: 5.days.from_now.to_date } }
+ it 'clears expiry date' do
page.within find_group_row(group) do
- click_button 'Remove group'
- end
-
- page.within('[role="dialog"]') do
- click_button('Remove group')
- end
-
- expect(page).not_to have_content(group.full_name)
- end
-
- context 'search in existing members' do
- it 'finds no results' do
- fill_in_filtered_search 'Search groups', with: 'testing 123'
-
- click_groups_tab
-
- expect(page).not_to have_content(group.full_name)
- end
+ expect(page).to have_content(/in \d days/)
- it 'finds results' do
- fill_in_filtered_search 'Search groups', with: group.full_name
+ find('[data-testid="clear-button"]').click
- click_groups_tab
+ wait_for_requests
- expect(members_table).to have_content(group.full_name)
+ expect(page).to have_content('No expiration set')
end
end
end
- context 'when `vue_project_members_list` feature flag is disabled' do
- before do
- stub_feature_flags(vue_project_members_list: false)
-
- visit project_project_members_path(project)
- click_groups_tab
- end
-
- it 'updates group access level' do
- click_button group_link.human_access
-
- page.within '.dropdown-menu' do
- click_link 'Guest'
- end
-
- wait_for_requests
-
- visit project_project_members_path(project)
-
- click_groups_tab
+ it 'deletes group link' do
+ expect(page).to have_content(group.full_name)
- expect(first('.group_member')).to have_content('Guest')
+ page.within find_group_row(group) do
+ click_button 'Remove group'
end
- it 'updates expiry date' do
- expires_at_field = "member_expires_at_#{group.id}"
- fill_in expires_at_field, with: 3.days.from_now.to_date
-
- find_field(expires_at_field).native.send_keys :enter
- wait_for_requests
-
- page.within(find('li.group_member')) do
- expect(page).to have_content('Expires in 3 days')
- end
+ page.within('[role="dialog"]') do
+ click_button('Remove group')
end
- context 'when link has expiry date set' do
- let(:additional_link_attrs) { { expires_at: 3.days.from_now.to_date } }
-
- it 'clears expiry date' do
- page.within(find('li.group_member')) do
- expect(page).to have_content('Expires in 3 days')
-
- page.within(find('.js-edit-member-form')) do
- find('.js-clear-input').click
- end
-
- wait_for_requests
+ expect(page).not_to have_content(group.full_name)
+ end
- expect(page).not_to have_content('Expires in')
- end
- end
- end
+ context 'search in existing members' do
+ it 'finds no results' do
+ fill_in_filtered_search 'Search groups', with: 'testing 123'
- it 'deletes group link' do
- page.within(first('.group_member')) do
- accept_confirm { find('.btn-danger').click }
- end
- wait_for_requests
+ click_groups_tab
- expect(page).not_to have_selector('.group_member')
+ expect(page).not_to have_content(group.full_name)
end
- context 'search in existing members' do
- it 'finds no results' do
- page.within '.user-search-form' do
- fill_in 'search_groups', with: 'testing 123'
- find('.user-search-btn').click
- end
-
- click_groups_tab
-
- expect(page).not_to have_selector('.group_member')
- end
-
- it 'finds results' do
- page.within '.user-search-form' do
- fill_in 'search_groups', with: group.name
- find('.user-search-btn').click
- end
+ it 'finds results' do
+ fill_in_filtered_search 'Search groups', with: group.full_name
- click_groups_tab
+ click_groups_tab
- expect(page).to have_selector('.group_member', count: 1)
- end
+ expect(members_table).to have_content(group.full_name)
end
end
diff --git a/spec/features/projects/members/invite_group_spec.rb b/spec/features/projects/members/invite_group_spec.rb
index f0d115fef1d..83ba2533a73 100644
--- a/spec/features/projects/members/invite_group_spec.rb
+++ b/spec/features/projects/members/invite_group_spec.rb
@@ -41,46 +41,20 @@ RSpec.describe 'Project > Members > Invite group', :js do
context 'when the group has "Share with group lock" disabled' do
it_behaves_like 'the project can be shared with groups'
- context 'when `vue_project_members_list` feature flag is enabled' do
- it 'the project can be shared with another group' do
- visit project_project_members_path(project)
+ it 'the project can be shared with another group' do
+ visit project_project_members_path(project)
- expect(page).not_to have_link 'Groups'
+ expect(page).not_to have_link 'Groups'
- click_on 'invite-group-tab'
+ click_on 'invite-group-tab'
- select2 group_to_share_with.id, from: '#link_group_id'
- page.find('body').click
- find('.btn-success').click
+ select2 group_to_share_with.id, from: '#link_group_id'
+ page.find('body').click
+ find('.btn-confirm').click
- click_link 'Groups'
+ click_link 'Groups'
- expect(members_table).to have_content(group_to_share_with.name)
- end
- end
-
- context 'when `vue_project_members_list` feature flag is disabled' do
- before do
- stub_feature_flags(vue_project_members_list: false)
- end
-
- it 'the project can be shared with another group' do
- visit project_project_members_path(project)
-
- expect(page).not_to have_link 'Groups'
-
- click_on 'invite-group-tab'
-
- select2 group_to_share_with.id, from: '#link_group_id'
- page.find('body').click
- find('.btn-success').click
-
- click_link 'Groups'
-
- page.within('[data-testid="project-member-groups"]') do
- expect(page).to have_content(group_to_share_with.name)
- end
- end
+ expect(members_table).to have_content(group_to_share_with.name)
end
end
@@ -159,36 +133,15 @@ RSpec.describe 'Project > Members > Invite group', :js do
fill_in 'expires_at_groups', with: 5.days.from_now.strftime('%Y-%m-%d')
click_on 'invite-group-tab'
- find('.btn-success').click
- end
-
- context 'when `vue_project_members_list` feature flag is enabled' do
- it 'the group link shows the expiration time with a warning class' do
- setup
- click_link 'Groups'
-
- expect(find_group_row(group)).to have_content(/in \d days/)
- expect(find_group_row(group)).to have_selector('.gl-text-orange-500')
- end
+ find('.btn-confirm').click
end
- context 'when `vue_project_members_list` feature flag is disabled' do
- before do
- stub_feature_flags(vue_project_members_list: false)
- end
-
- it 'the group link shows the expiration time with a warning class' do
- setup
- click_link 'Groups'
+ it 'the group link shows the expiration time with a warning class' do
+ setup
+ click_link 'Groups'
- page.within('[data-testid="project-member-groups"]') do
- # Using distance_of_time_in_words_to_now because it is not the same as
- # subtraction, and this way avoids time zone issues as well
- expires_in_text = distance_of_time_in_words_to_now(project.project_group_links.first.expires_at)
- expect(page).to have_content(expires_in_text)
- expect(page).to have_selector('.text-warning')
- end
- end
+ expect(find_group_row(group)).to have_content(/in \d days/)
+ expect(find_group_row(group)).to have_selector('.gl-text-orange-500')
end
end
diff --git a/spec/features/projects/members/list_spec.rb b/spec/features/projects/members/list_spec.rb
index b0fe5b9c48a..0830585da9b 100644
--- a/spec/features/projects/members/list_spec.rb
+++ b/spec/features/projects/members/list_spec.rb
@@ -2,232 +2,192 @@
require 'spec_helper'
-RSpec.describe 'Project members list' do
+RSpec.describe 'Project members list', :js do
include Select2Helper
+ include Spec::Support::Helpers::Features::MembersHelpers
let(:user1) { create(:user, name: 'John Doe') }
let(:user2) { create(:user, name: 'Mary Jane') }
let(:group) { create(:group) }
- let(:project) { create(:project, namespace: group) }
+ let(:project) { create(:project, :internal, namespace: group) }
before do
- stub_feature_flags(invite_members_group_modal: false)
+ stub_feature_flags(invite_members_group_modal: true)
sign_in(user1)
group.add_owner(user1)
end
- context 'when `vue_project_members_list` feature flag is enabled', :js do
- include Spec::Support::Helpers::Features::MembersHelpers
+ it 'show members from project and group' do
+ project.add_developer(user2)
- it 'pushes `vue_project_members_list` feature flag to the frontend' do
- visit_members_page
-
- expect(page).to have_pushed_frontend_feature_flags(vueProjectMembersList: true)
- end
+ visit_members_page
- it 'show members from project and group' 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
+ 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' do
- project.add_developer(user1)
+ it 'show user once if member of both group and project' do
+ project.add_developer(user1)
- visit_members_page
+ visit_members_page
- expect(first_row).to have_content(user1.name)
- expect(second_row).to be_blank
- end
+ expect(first_row).to have_content(user1.name)
+ expect(second_row).to be_blank
+ end
- it 'update user access level', :js do
- project.add_developer(user2)
+ it 'update user access level' do
+ project.add_developer(user2)
- visit_members_page
+ visit_members_page
- page.within find_member_row(user2) do
- click_button('Developer')
- click_button('Reporter')
+ page.within find_member_row(user2) do
+ click_button('Developer')
+ click_button('Reporter')
- expect(page).to have_button('Reporter')
- end
+ expect(page).to have_button('Reporter')
end
+ end
- it 'add user to project', :js do
- visit_members_page
+ it 'add user to project' do
+ visit_members_page
- add_user(user2.id, 'Reporter')
+ add_user(user2.name, 'Reporter')
- page.within find_member_row(user2) do
- expect(page).to have_button('Reporter')
- end
+ page.within find_member_row(user2) do
+ expect(page).to have_button('Reporter')
end
+ end
- it 'remove user from project', :js 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
+ it 'uses ProjectMember access_level_roles for the invite members modal access option' do
+ visit_members_page
- page.within('[role="dialog"]') do
- expect(page).to have_unchecked_field 'Also unassign this user from related issues and merge requests'
- click_button('Remove member')
- end
+ click_on 'Invite members'
- wait_for_requests
+ click_on 'Guest'
+ wait_for_requests
- expect(members_table).not_to have_content(other_user.name)
+ 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 'invite user to project', :js do
- visit_members_page
+ it 'remove user from project' do
+ other_user = create(:user)
+ project.add_developer(other_user)
- add_user('test@example.com', 'Reporter')
+ visit_members_page
- click_link 'Invited'
+ # Open modal
+ page.within find_member_row(other_user) do
+ click_button 'Remove member'
+ end
- page.within find_invited_member_row('test@example.com') do
- expect(page).to have_button('Reporter')
- end
+ page.within('[role="dialog"]') do
+ expect(page).to have_unchecked_field 'Also unassign this user from related issues and merge requests'
+ click_button('Remove member')
end
- context 'project bots' do
- let(:project_bot) { create(:user, :project_bot, name: 'project_bot') }
+ wait_for_requests
- before do
- project.add_maintainer(project_bot)
- end
+ expect(members_table).not_to have_content(other_user.name)
+ end
- it 'does not show form used to change roles and "Expiration date" or the remove user button' do
- visit_members_page
+ it 'invite user to project' do
+ visit_members_page
- page.within find_member_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
+ add_user('test@example.com', 'Reporter')
+
+ click_link 'Invited'
+
+ page.within find_invited_member_row('test@example.com') do
+ expect(page).to have_button('Reporter')
end
end
- context 'when `vue_project_members_list` feature flag is disabled' do
- include Spec::Support::Helpers::Features::ListRowsHelpers
+ context 'project bots' do
+ let(:project_bot) { create(:user, :project_bot, name: 'project_bot') }
before do
- stub_feature_flags(vue_project_members_list: false)
+ project.add_maintainer(project_bot)
end
- it 'show members from project and group' do
- project.add_developer(user2)
-
+ it 'does not show form used to change roles and "Expiration date" or the remove user button' do
visit_members_page
- expect(first_row.text).to include(user1.name)
- expect(second_row.text).to include(user2.name)
+ page.within find_member_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
- it 'show user once if member of both group and project' do
- project.add_developer(user1)
-
- visit_members_page
+ 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) }
- expect(first_row.text).to include(user1.name)
- expect(second_row).to be_blank
+ before do
+ project.add_guest(user_with_2fa)
end
- it 'update user access level', :js do
- project.add_developer(user2)
+ it 'shows 2FA badge to user with "Maintainer" access level' do
+ project.add_maintainer(user1)
visit_members_page
- page.within(second_row) do
- click_button('Developer')
- click_link('Reporter')
-
- expect(page).to have_button('Reporter')
- end
+ expect(find_member_row(user_with_2fa)).to have_content('2FA')
end
- it 'add user to project', :js do
- visit_members_page
+ it 'shows 2FA badge to admins' do
+ sign_in(admin)
+ gitlab_enable_admin_mode_sign_in(admin)
- add_user(user2.id, 'Reporter')
+ visit_members_page
- page.within(second_row) do
- expect(page).to have_content(user2.name)
- expect(page).to have_button('Reporter')
- end
+ expect(find_member_row(user_with_2fa)).to have_content('2FA')
end
- it 'remove user from project', :js do
- other_user = create(:user)
- project.add_developer(other_user)
+ it 'does not show 2FA badge to users with access level below "Maintainer"' do
+ group.add_developer(user1)
visit_members_page
- # Open modal
- find(:css, 'li.project_member', text: other_user.name).find(:css, 'button.btn-danger').click
-
- expect(page).to have_unchecked_field 'Also unassign this user from related issues and merge requests'
-
- click_on('Remove member')
-
- wait_for_requests
-
- expect(page).not_to have_content(other_user.name)
- expect(project.users).not_to include(other_user)
+ expect(find_member_row(user_with_2fa)).not_to have_content('2FA')
end
- it 'invite user to project', :js do
- visit_members_page
-
- add_user('test@example.com', 'Reporter')
+ it 'shows 2FA badge to themselves' do
+ sign_in(user_with_2fa)
- click_link 'Invited'
+ visit_members_page
- page.within(first_row) do
- expect(page).to have_content('test@example.com')
- expect(page).to have_content('Invited')
- expect(page).to have_button('Reporter')
- end
+ expect(find_member_row(user_with_2fa)).to have_content('2FA')
end
+ end
- context 'project bots' do
- let(:project_bot) { create(:user, :project_bot, name: 'project_bot') }
-
- before do
- project.add_maintainer(project_bot)
- end
+ private
- it 'does not show form used to change roles and "Expiration date" or the remove user button' do
- project_member = project.project_members.find_by(user_id: project_bot.id)
+ def add_user(id, role)
+ click_on 'Invite members'
- visit_members_page
+ page.within '#invite-members-modal' do
+ fill_in 'Search for members to invite', with: id
- expect(page).not_to have_selector("#edit_project_member_#{project_member.id}")
- expect(page).to have_no_selector("#project_member_#{project_member.id} .btn-danger")
- end
- end
- end
+ wait_for_requests
+ click_button id
- private
+ click_button 'Guest'
+ wait_for_requests
+ click_button role
- def add_user(id, role)
- page.within ".invite-users-form" do
- select2(id, from: "#user_ids", multiple: true)
- select(role, from: "access_level")
+ click_button 'Invite'
end
- click_button "Invite"
+ page.refresh
end
def visit_members_page
diff --git a/spec/features/projects/members/master_adds_member_with_expiration_date_spec.rb b/spec/features/projects/members/master_adds_member_with_expiration_date_spec.rb
index 1127c64e0c7..d22097a2f6f 100644
--- a/spec/features/projects/members/master_adds_member_with_expiration_date_spec.rb
+++ b/spec/features/projects/members/master_adds_member_with_expiration_date_spec.rb
@@ -18,107 +18,51 @@ RSpec.describe 'Projects > Members > Maintainer adds member with expiration date
sign_in(maintainer)
end
- context 'when `vue_project_members_list` feature flag is enabled' do
- it 'expiration date is displayed in the members list' do
- stub_feature_flags(invite_members_group_modal: false)
+ it 'expiration date is displayed in the members list' do
+ stub_feature_flags(invite_members_group_modal: false)
- visit project_project_members_path(project)
+ visit project_project_members_path(project)
- page.within '.invite-users-form' do
- select2(new_member.id, from: '#user_ids', multiple: true)
+ page.within '.invite-users-form' do
+ select2(new_member.id, from: '#user_ids', multiple: true)
- fill_in 'expires_at', with: 5.days.from_now.to_date
- find_field('expires_at').native.send_keys :enter
+ fill_in 'expires_at', with: 5.days.from_now.to_date
+ find_field('expires_at').native.send_keys :enter
- click_on 'Invite'
- end
-
- page.within find_member_row(new_member) do
- expect(page).to have_content(/in \d days/)
- end
- end
-
- it 'changes expiration date' do
- project.team.add_users([new_member.id], :developer, expires_at: 3.days.from_now.to_date)
- visit project_project_members_path(project)
-
- page.within find_member_row(new_member) do
- fill_in 'Expiration date', with: 5.days.from_now.to_date
- find_field('Expiration date').native.send_keys :enter
-
- wait_for_requests
-
- expect(page).to have_content(/in \d days/)
- end
+ click_on 'Invite'
end
- it 'clears expiration date' do
- project.team.add_users([new_member.id], :developer, expires_at: 5.days.from_now.to_date)
- visit project_project_members_path(project)
-
- page.within find_member_row(new_member) do
- expect(page).to have_content(/in \d days/)
-
- find('[data-testid="clear-button"]').click
-
- wait_for_requests
-
- expect(page).to have_content('No expiration set')
- end
+ page.within find_member_row(new_member) do
+ expect(page).to have_content(/in \d days/)
end
end
- context 'when `vue_project_members_list` feature flag is disabled' do
- before do
- stub_feature_flags(vue_project_members_list: false)
- end
-
- it 'expiration date is displayed in the members list' do
- stub_feature_flags(invite_members_group_modal: false)
-
- visit project_project_members_path(project)
-
- page.within '.invite-users-form' do
- select2(new_member.id, from: '#user_ids', multiple: true)
-
- fill_in 'expires_at', with: 3.days.from_now.to_date
- find_field('expires_at').native.send_keys :enter
+ it 'changes expiration date' do
+ project.team.add_users([new_member.id], :developer, expires_at: 3.days.from_now.to_date)
+ visit project_project_members_path(project)
- click_on 'Invite'
- end
+ page.within find_member_row(new_member) do
+ fill_in 'Expiration date', with: 5.days.from_now.to_date
+ find_field('Expiration date').native.send_keys :enter
- page.within "#project_member_#{project_member_id}" do
- expect(page).to have_content('Expires in 3 days')
- end
- end
-
- it 'changes expiration date' do
- project.team.add_users([new_member.id], :developer, expires_at: 1.day.from_now.to_date)
- visit project_project_members_path(project)
-
- page.within "#project_member_#{project_member_id}" do
- fill_in 'Expiration date', with: 3.days.from_now.to_date
- find_field('Expiration date').native.send_keys :enter
+ wait_for_requests
- wait_for_requests
-
- expect(page).to have_content('Expires in 3 days')
- end
+ expect(page).to have_content(/in \d days/)
end
+ end
- it 'clears expiration date' do
- project.team.add_users([new_member.id], :developer, expires_at: 3.days.from_now.to_date)
- visit project_project_members_path(project)
+ it 'clears expiration date' do
+ project.team.add_users([new_member.id], :developer, expires_at: 5.days.from_now.to_date)
+ visit project_project_members_path(project)
- page.within "#project_member_#{project_member_id}" do
- expect(page).to have_content('Expires in 3 days')
+ page.within find_member_row(new_member) do
+ expect(page).to have_content(/in \d days/)
- find('.js-clear-input').click
+ find('[data-testid="clear-button"]').click
- wait_for_requests
+ wait_for_requests
- expect(page).not_to have_content('Expires in')
- end
+ expect(page).to have_content('No expiration set')
end
end
diff --git a/spec/features/projects/members/sorting_spec.rb b/spec/features/projects/members/sorting_spec.rb
index 3c132747bc4..653564d1566 100644
--- a/spec/features/projects/members/sorting_spec.rb
+++ b/spec/features/projects/members/sorting_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Projects > Members > Sorting' do
+RSpec.describe 'Projects > Members > Sorting', :js do
include Spec::Support::Helpers::Features::MembersHelpers
let(:maintainer) { create(:user, name: 'John Doe') }
@@ -15,165 +15,85 @@ RSpec.describe 'Projects > Members > Sorting' do
sign_in(maintainer)
end
- context 'when `vue_project_members_list` feature flag is enabled', :js do
- it 'sorts by account by default' do
- visit_members_list(sort: nil)
+ it 'sorts by account by default' do
+ visit_members_list(sort: nil)
- expect(first_row).to have_content(maintainer.name)
- expect(second_row).to have_content(developer.name)
+ expect(first_row).to have_content(maintainer.name)
+ expect(second_row).to have_content(developer.name)
- expect_sort_by('Account', :asc)
- end
-
- it 'sorts by max role ascending' do
- visit_members_list(sort: :access_level_asc)
-
- expect(first_row).to have_content(developer.name)
- expect(second_row).to have_content(maintainer.name)
-
- expect_sort_by('Max role', :asc)
- end
-
- it 'sorts by max role descending' do
- visit_members_list(sort: :access_level_desc)
-
- expect(first_row).to have_content(maintainer.name)
- expect(second_row).to have_content(developer.name)
-
- expect_sort_by('Max role', :desc)
- end
-
- it 'sorts by access granted ascending' do
- visit_members_list(sort: :last_joined)
-
- expect(first_row).to have_content(maintainer.name)
- expect(second_row).to have_content(developer.name)
-
- expect_sort_by('Access granted', :asc)
- end
-
- it 'sorts by access granted descending' do
- visit_members_list(sort: :oldest_joined)
-
- expect(first_row).to have_content(developer.name)
- expect(second_row).to have_content(maintainer.name)
-
- expect_sort_by('Access granted', :desc)
- end
-
- it 'sorts by account ascending' do
- visit_members_list(sort: :name_asc)
-
- expect(first_row).to have_content(maintainer.name)
- expect(second_row).to have_content(developer.name)
-
- expect_sort_by('Account', :asc)
- end
-
- it 'sorts by account descending' do
- visit_members_list(sort: :name_desc)
-
- expect(first_row).to have_content(developer.name)
- expect(second_row).to have_content(maintainer.name)
-
- expect_sort_by('Account', :desc)
- end
+ expect_sort_by('Account', :asc)
+ end
- it 'sorts by last sign-in ascending', :clean_gitlab_redis_shared_state do
- visit_members_list(sort: :recent_sign_in)
+ it 'sorts by max role ascending' do
+ visit_members_list(sort: :access_level_asc)
- expect(first_row).to have_content(maintainer.name)
- expect(second_row).to have_content(developer.name)
+ expect(first_row).to have_content(developer.name)
+ expect(second_row).to have_content(maintainer.name)
- expect_sort_by('Last sign-in', :asc)
- end
+ expect_sort_by('Max role', :asc)
+ end
- it 'sorts by last sign-in descending', :clean_gitlab_redis_shared_state do
- visit_members_list(sort: :oldest_sign_in)
+ it 'sorts by max role descending' do
+ visit_members_list(sort: :access_level_desc)
- expect(first_row).to have_content(developer.name)
- expect(second_row).to have_content(maintainer.name)
+ expect(first_row).to have_content(maintainer.name)
+ expect(second_row).to have_content(developer.name)
- expect_sort_by('Last sign-in', :desc)
- end
+ expect_sort_by('Max role', :desc)
end
- context 'when `vue_project_members_list` feature flag is disabled' do
- before do
- stub_feature_flags(vue_project_members_list: false)
- end
-
- it 'sorts alphabetically by default' do
- visit_members_list(sort: nil)
+ it 'sorts by access granted ascending' do
+ visit_members_list(sort: :last_joined)
- expect(first_member).to include(maintainer.name)
- expect(second_member).to include(developer.name)
- expect(page).to have_css('.qa-user-sort-dropdown .dropdown-toggle-text', text: 'Name, ascending')
- end
+ expect(first_row).to have_content(maintainer.name)
+ expect(second_row).to have_content(developer.name)
- it 'sorts by access level ascending' do
- visit_members_list(sort: :access_level_asc)
+ expect_sort_by('Access granted', :asc)
+ end
- expect(first_member).to include(developer.name)
- expect(second_member).to include(maintainer.name)
- expect(page).to have_css('.qa-user-sort-dropdown .dropdown-toggle-text', text: 'Access level, ascending')
- end
+ it 'sorts by access granted descending' do
+ visit_members_list(sort: :oldest_joined)
- it 'sorts by access level descending' do
- visit_members_list(sort: :access_level_desc)
+ expect(first_row).to have_content(developer.name)
+ expect(second_row).to have_content(maintainer.name)
- expect(first_member).to include(maintainer.name)
- expect(second_member).to include(developer.name)
- expect(page).to have_css('.qa-user-sort-dropdown .dropdown-toggle-text', text: 'Access level, descending')
- end
+ expect_sort_by('Access granted', :desc)
+ end
- it 'sorts by last joined' do
- visit_members_list(sort: :last_joined)
+ it 'sorts by account ascending' do
+ visit_members_list(sort: :name_asc)
- expect(first_member).to include(maintainer.name)
- expect(second_member).to include(developer.name)
- expect(page).to have_css('.qa-user-sort-dropdown .dropdown-toggle-text', text: 'Last joined')
- end
+ expect(first_row).to have_content(maintainer.name)
+ expect(second_row).to have_content(developer.name)
- it 'sorts by oldest joined' do
- visit_members_list(sort: :oldest_joined)
+ expect_sort_by('Account', :asc)
+ end
- expect(first_member).to include(developer.name)
- expect(second_member).to include(maintainer.name)
- expect(page).to have_css('.qa-user-sort-dropdown .dropdown-toggle-text', text: 'Oldest joined')
- end
+ it 'sorts by account descending' do
+ visit_members_list(sort: :name_desc)
- it 'sorts by name ascending' do
- visit_members_list(sort: :name_asc)
+ expect(first_row).to have_content(developer.name)
+ expect(second_row).to have_content(maintainer.name)
- expect(first_member).to include(maintainer.name)
- expect(second_member).to include(developer.name)
- expect(page).to have_css('.qa-user-sort-dropdown .dropdown-toggle-text', text: 'Name, ascending')
- end
+ expect_sort_by('Account', :desc)
+ end
- it 'sorts by name descending' do
- visit_members_list(sort: :name_desc)
+ it 'sorts by last sign-in ascending', :clean_gitlab_redis_shared_state do
+ visit_members_list(sort: :recent_sign_in)
- expect(first_member).to include(developer.name)
- expect(second_member).to include(maintainer.name)
- expect(page).to have_css('.qa-user-sort-dropdown .dropdown-toggle-text', text: 'Name, descending')
- end
+ expect(first_row).to have_content(maintainer.name)
+ expect(second_row).to have_content(developer.name)
- it 'sorts by recent sign in', :clean_gitlab_redis_shared_state do
- visit_members_list(sort: :recent_sign_in)
+ expect_sort_by('Last sign-in', :asc)
+ end
- expect(first_member).to include(maintainer.name)
- expect(second_member).to include(developer.name)
- expect(page).to have_css('.qa-user-sort-dropdown .dropdown-toggle-text', text: 'Recent sign in')
- end
+ it 'sorts by last sign-in descending', :clean_gitlab_redis_shared_state do
+ visit_members_list(sort: :oldest_sign_in)
- it 'sorts by oldest sign in', :clean_gitlab_redis_shared_state do
- visit_members_list(sort: :oldest_sign_in)
+ expect(first_row).to have_content(developer.name)
+ expect(second_row).to have_content(maintainer.name)
- expect(first_member).to include(developer.name)
- expect(second_member).to include(maintainer.name)
- expect(page).to have_css('.qa-user-sort-dropdown .dropdown-toggle-text', text: 'Oldest sign in')
- end
+ expect_sort_by('Last sign-in', :desc)
end
private
diff --git a/spec/features/projects/members/tabs_spec.rb b/spec/features/projects/members/tabs_spec.rb
index eef3395de91..471be26e126 100644
--- a/spec/features/projects/members/tabs_spec.rb
+++ b/spec/features/projects/members/tabs_spec.rb
@@ -14,6 +14,11 @@ RSpec.describe 'Projects > Members > Tabs' do
let_it_be(:invites) { create_list(:project_member, 2, :invited, project: project) }
let_it_be(:project_group_links) { create_list(:project_group_link, 2, project: project) }
+ before do
+ sign_in(user)
+ visit project_project_members_path(project)
+ end
+
shared_examples 'active "Members" tab' do
it 'displays "Members" tab' do
expect(page).to have_selector('.nav-link.active', text: 'Members')
@@ -21,11 +26,6 @@ RSpec.describe 'Projects > Members > Tabs' do
end
context 'tabs' do
- before do
- sign_in(user)
- visit project_project_members_path(project)
- end
-
where(:tab, :count) do
'Members' | 3
'Invited' | 2
@@ -44,69 +44,25 @@ RSpec.describe 'Projects > Members > Tabs' do
end
end
- context 'when `vue_project_members_list` feature flag is enabled' do
+ context 'when searching "Groups"', :js do
before do
- sign_in(user)
- visit project_project_members_path(project)
- end
-
- context 'when searching "Groups"', :js do
- before do
- click_link 'Groups'
-
- fill_in_filtered_search 'Search groups', with: 'group'
- end
-
- it 'displays "Groups" tab' do
- expect(page).to have_selector('.nav-link.active', text: 'Groups')
- end
+ click_link 'Groups'
- context 'and then searching "Members"' do
- before do
- click_link 'Members 3'
-
- fill_in_filtered_search 'Filter members', with: 'user'
- end
-
- it_behaves_like 'active "Members" tab'
- end
+ fill_in_filtered_search 'Search groups', with: 'group'
end
- end
-
- context 'when `vue_project_members_list` feature flag is disabled' do
- before do
- stub_feature_flags(vue_project_members_list: false)
- sign_in(user)
- visit project_project_members_path(project)
+ it 'displays "Groups" tab' do
+ expect(page).to have_selector('.nav-link.active', text: 'Groups')
end
- context 'when searching "Groups"', :js do
+ context 'and then searching "Members"' do
before do
- click_link 'Groups'
+ click_link 'Members 3'
- page.within '[data-testid="group-link-search-form"]' do
- fill_in 'search_groups', with: 'group'
- find('button[type="submit"]').click
- end
+ fill_in_filtered_search 'Filter members', with: 'user'
end
- it 'displays "Groups" tab' do
- expect(page).to have_selector('.nav-link.active', text: 'Groups')
- end
-
- context 'and then searching "Members"' do
- before do
- click_link 'Members 3'
-
- page.within '[data-testid="user-search-form"]' do
- fill_in 'search', with: 'user'
- find('button[type="submit"]').click
- end
- end
-
- it_behaves_like 'active "Members" tab'
- end
+ it_behaves_like 'active "Members" tab'
end
end
end
diff --git a/spec/features/projects/merge_request_button_spec.rb b/spec/features/projects/merge_request_button_spec.rb
index e3d8534ace9..9547ba8a390 100644
--- a/spec/features/projects/merge_request_button_spec.rb
+++ b/spec/features/projects/merge_request_button_spec.rb
@@ -3,11 +3,13 @@
require 'spec_helper'
RSpec.describe 'Merge Request button' do
- shared_examples 'Merge request button only shown when allowed' do
- let(:user) { create(:user) }
- let(:project) { create(:project, :public, :repository) }
- let(:forked_project) { create(:project, :public, :repository, forked_from_project: project) }
+ include ProjectForksHelper
+
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project, :public, :repository) }
+ let(:forked_project) { fork_project(project, user, repository: true) }
+ shared_examples 'Merge request button only shown when allowed' do
context 'not logged in' do
it 'does not show Create merge request button' do
visit url
@@ -22,10 +24,16 @@ RSpec.describe 'Merge Request button' do
project.add_developer(user)
end
- it 'shows Create merge request button' do
- href = project_new_merge_request_path(project,
- merge_request: { source_branch: 'feature',
- target_branch: 'master' })
+ it 'shows Create merge request button', :js do
+ href = project_new_merge_request_path(
+ project,
+ merge_request: {
+ source_project_id: project.id,
+ source_branch: 'feature',
+ target_project_id: project.id,
+ target_branch: 'master'
+ }
+ )
visit url
@@ -75,12 +83,16 @@ RSpec.describe 'Merge Request button' do
end
context 'on own fork of project' do
- let(:user) { forked_project.owner }
-
- it 'shows Create merge request button' do
- href = project_new_merge_request_path(forked_project,
- merge_request: { source_branch: 'feature',
- target_branch: 'master' })
+ it 'shows Create merge request button', :js do
+ href = project_new_merge_request_path(
+ forked_project,
+ merge_request: {
+ source_project_id: forked_project.id,
+ source_branch: 'feature',
+ target_project_id: forked_project.id,
+ target_branch: 'master'
+ }
+ )
visit fork_url
@@ -101,11 +113,33 @@ RSpec.describe 'Merge Request button' do
end
context 'on compare page' do
+ let(:label) { 'Create merge request' }
+
it_behaves_like 'Merge request button only shown when allowed' do
- let(:label) { 'Create merge request' }
let(:url) { project_compare_path(project, from: 'master', to: 'feature') }
let(:fork_url) { project_compare_path(forked_project, from: 'master', to: 'feature') }
end
+
+ it 'shows the correct merge request button when viewing across forks', :js do
+ sign_in(user)
+ project.add_developer(user)
+
+ href = project_new_merge_request_path(
+ project,
+ merge_request: {
+ source_project_id: forked_project.id,
+ source_branch: 'feature',
+ target_project_id: project.id,
+ target_branch: 'master'
+ }
+ )
+
+ visit project_compare_path(forked_project, from: 'master', to: 'feature', from_project_id: project.id)
+
+ within("#content-body") do
+ expect(page).to have_link(label, href: href)
+ end
+ end
end
context 'on commits page' do
diff --git a/spec/features/projects/new_project_spec.rb b/spec/features/projects/new_project_spec.rb
index 4aabf040655..ec34640bd00 100644
--- a/spec/features/projects/new_project_spec.rb
+++ b/spec/features/projects/new_project_spec.rb
@@ -86,7 +86,7 @@ RSpec.describe 'New project', :js do
visit new_project_path
find('[data-qa-selector="blank_project_link"]').click
- choose(s_(key))
+ choose(key)
click_button('Create project')
page.within('#blank-project-pane') do
expect(find_field("project_visibility_level_#{level}")).to be_checked
@@ -95,33 +95,55 @@ RSpec.describe 'New project', :js do
end
context 'when group visibility is private but default is internal' do
+ let_it_be(:group) { create(:group, visibility_level: Gitlab::VisibilityLevel::PRIVATE) }
+
before do
stub_application_setting(default_project_visibility: Gitlab::VisibilityLevel::INTERNAL)
end
- it 'has private selected' do
- group = create(:group, visibility_level: Gitlab::VisibilityLevel::PRIVATE)
- visit new_project_path(namespace_id: group.id)
- find('[data-qa-selector="blank_project_link"]').click
+ context 'when admin mode is enabled', :enable_admin_mode do
+ it 'has private selected' do
+ visit new_project_path(namespace_id: group.id)
+ find('[data-qa-selector="blank_project_link"]').click
- page.within('#blank-project-pane') do
- expect(find_field("project_visibility_level_#{Gitlab::VisibilityLevel::PRIVATE}")).to be_checked
+ page.within('#blank-project-pane') do
+ expect(find_field("project_visibility_level_#{Gitlab::VisibilityLevel::PRIVATE}")).to be_checked
+ end
+ end
+ end
+
+ context 'when admin mode is disabled' do
+ it 'is not allowed' do
+ visit new_project_path(namespace_id: group.id)
+
+ expect(page).to have_content('Not Found')
end
end
end
context 'when group visibility is public but user requests private' do
+ let_it_be(:group) { create(:group, visibility_level: Gitlab::VisibilityLevel::PUBLIC) }
+
before do
stub_application_setting(default_project_visibility: Gitlab::VisibilityLevel::INTERNAL)
end
- it 'has private selected' do
- group = create(:group, visibility_level: Gitlab::VisibilityLevel::PUBLIC)
- visit new_project_path(namespace_id: group.id, project: { visibility_level: Gitlab::VisibilityLevel::PRIVATE })
- find('[data-qa-selector="blank_project_link"]').click
+ context 'when admin mode is enabled', :enable_admin_mode do
+ it 'has private selected' do
+ visit new_project_path(namespace_id: group.id, project: { visibility_level: Gitlab::VisibilityLevel::PRIVATE })
+ find('[data-qa-selector="blank_project_link"]').click
- page.within('#blank-project-pane') do
- expect(find_field("project_visibility_level_#{Gitlab::VisibilityLevel::PRIVATE}")).to be_checked
+ page.within('#blank-project-pane') do
+ expect(find_field("project_visibility_level_#{Gitlab::VisibilityLevel::PRIVATE}")).to be_checked
+ end
+ end
+ end
+
+ context 'when admin mode is disabled' do
+ it 'is not allowed' do
+ visit new_project_path(namespace_id: group.id, project: { visibility_level: Gitlab::VisibilityLevel::PRIVATE })
+
+ expect(page).to have_content('Not Found')
end
end
end
diff --git a/spec/features/projects/pages/user_edits_settings_spec.rb b/spec/features/projects/pages/user_edits_settings_spec.rb
index 3649fae17ce..6156b5243de 100644
--- a/spec/features/projects/pages/user_edits_settings_spec.rb
+++ b/spec/features/projects/pages/user_edits_settings_spec.rb
@@ -140,7 +140,7 @@ RSpec.describe 'Pages edits pages settings', :js do
before do
allow(Projects::UpdateService).to receive(:new).and_return(service)
- allow(service).to receive(:execute).and_return(status: :error, message: 'Some error has occured')
+ allow(service).to receive(:execute).and_return(status: :error, message: 'Some error has occurred')
end
it 'tries to change the setting' do
@@ -150,7 +150,7 @@ RSpec.describe 'Pages edits pages settings', :js do
click_button 'Save'
- expect(page).to have_text('Some error has occured')
+ expect(page).to have_text('Some error has occurred')
end
end
diff --git a/spec/features/projects/pipelines/pipelines_spec.rb b/spec/features/projects/pipelines/pipelines_spec.rb
index 6421d3db2cd..9037aa5c9a8 100644
--- a/spec/features/projects/pipelines/pipelines_spec.rb
+++ b/spec/features/projects/pipelines/pipelines_spec.rb
@@ -14,6 +14,7 @@ RSpec.describe 'Pipelines', :js do
sign_in(user)
stub_feature_flags(graphql_pipeline_details: false)
stub_feature_flags(graphql_pipeline_details_users: false)
+ stub_feature_flags(new_pipelines_table: false)
project.add_developer(user)
project.update!(auto_devops_attributes: { enabled: false })
@@ -519,75 +520,58 @@ RSpec.describe 'Pipelines', :js do
end
end
- shared_examples 'mini pipeline renders' do |ci_mini_pipeline_gl_dropdown_enabled|
- context 'mini pipeline graph' do
- let!(:build) do
- create(:ci_build, :pending, pipeline: pipeline,
- stage: 'build',
- name: 'build')
- end
+ context 'mini pipeline graph' do
+ let!(:build) do
+ create(:ci_build, :pending, pipeline: pipeline,
+ stage: 'build',
+ name: 'build')
+ end
- before do
- stub_feature_flags(ci_mini_pipeline_gl_dropdown: ci_mini_pipeline_gl_dropdown_enabled)
- visit_project_pipelines
- end
+ dropdown_selector = '[data-testid="mini-pipeline-graph-dropdown"]'
- let_it_be(:dropdown_toggle_selector) do
- if ci_mini_pipeline_gl_dropdown_enabled
- '[data-testid="mini-pipeline-graph-dropdown"] .dropdown-toggle'
- else
- '[data-testid="mini-pipeline-graph-dropdown-toggle"]'
- end
- end
+ before do
+ visit_project_pipelines
+ end
- it 'renders a mini pipeline graph' do
- expect(page).to have_selector('[data-testid="widget-mini-pipeline-graph"]')
- expect(page).to have_selector(dropdown_toggle_selector)
- end
+ it 'renders a mini pipeline graph' do
+ expect(page).to have_selector('[data-testid="widget-mini-pipeline-graph"]')
+ expect(page).to have_selector(dropdown_selector)
+ end
- context 'when clicking a stage badge' do
- it 'opens a dropdown' do
- find(dropdown_toggle_selector).click
+ context 'when clicking a stage badge' do
+ it 'opens a dropdown' do
+ find(dropdown_selector).click
- expect(page).to have_link build.name
- end
+ expect(page).to have_link build.name
+ end
- it 'is possible to cancel pending build' do
- find(dropdown_toggle_selector).click
- find('.js-ci-action').click
- wait_for_requests
+ it 'is possible to cancel pending build' do
+ find(dropdown_selector).click
+ find('.js-ci-action').click
+ wait_for_requests
- expect(build.reload).to be_canceled
- end
+ expect(build.reload).to be_canceled
end
+ end
- context 'for a failed pipeline' do
- let!(:build) do
- create(:ci_build, :failed, pipeline: pipeline,
- stage: 'build',
- name: 'build')
- end
+ context 'for a failed pipeline' do
+ let!(:build) do
+ create(:ci_build, :failed, pipeline: pipeline,
+ stage: 'build',
+ name: 'build')
+ end
- it 'displays the failure reason' do
- find(dropdown_toggle_selector).click
+ it 'displays the failure reason' do
+ find(dropdown_selector).click
- within('.js-builds-dropdown-list') do
- build_element = page.find('.mini-pipeline-graph-dropdown-item')
- expect(build_element['title']).to eq('build - failed - (unknown failure)')
- end
+ within('.js-builds-dropdown-list') do
+ build_element = page.find('.mini-pipeline-graph-dropdown-item')
+ expect(build_element['title']).to eq('build - failed - (unknown failure)')
end
end
end
end
- context 'with ci_mini_pipeline_gl_dropdown disabled' do
- it_behaves_like "mini pipeline renders", false
- end
-
- context 'with ci_mini_pipeline_gl_dropdown enabled' do
- it_behaves_like "mini pipeline renders", true
- end
-
context 'with pagination' do
before do
allow(Ci::Pipeline).to receive(:default_per_page).and_return(1)
diff --git a/spec/features/projects/releases/user_creates_release_spec.rb b/spec/features/projects/releases/user_creates_release_spec.rb
index 2acdf983cf2..9e428a0623d 100644
--- a/spec/features/projects/releases/user_creates_release_spec.rb
+++ b/spec/features/projects/releases/user_creates_release_spec.rb
@@ -33,11 +33,11 @@ RSpec.describe 'User creates release', :js do
end
it 'defaults the "Create from" dropdown to the project\'s default branch' do
- expect(page.find('.ref-selector button')).to have_content(project.default_branch)
+ expect(page.find('[data-testid="create-from-field"] .ref-selector button')).to have_content(project.default_branch)
end
- context 'when the "Save release" button is clicked', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/297507' do
- let(:tag_name) { 'v1.0' }
+ context 'when the "Save release" button is clicked' do
+ let(:tag_name) { 'v2.0.31' }
let(:release_title) { 'A most magnificent release' }
let(:release_notes) { 'Best. Release. **Ever.** :rocket:' }
let(:link_1) { { url: 'https://gitlab.example.com/runbook', title: 'An example runbook', type: 'runbook' } }
@@ -47,7 +47,7 @@ RSpec.describe 'User creates release', :js do
fill_out_form_and_submit
end
- it 'creates a new release when "Create release" is clicked', :aggregate_failures do
+ it 'creates a new release when "Create release" is clicked and redirects to the release\'s dedicated page', :aggregate_failures do
release = project.releases.last
expect(release.tag).to eq(tag_name)
@@ -65,10 +65,6 @@ RSpec.describe 'User creates release', :js do
link = release.links.find { |l| l.link_type == link_2[:type] }
expect(link.url).to eq(link_2[:url])
expect(link.name).to eq(link_2[:title])
- end
-
- it 'redirects to the dedicated page for the newly created release' do
- release = project.releases.last
expect(page).to have_current_path(project_release_path(project, release))
end
@@ -116,30 +112,27 @@ RSpec.describe 'User creates release', :js do
end
def fill_out_form_and_submit
- fill_tag_name(tag_name)
+ select_new_tag_name(tag_name)
select_create_from(branch.name)
fill_release_title(release_title)
- select_milestone(milestone_1.title, and_tab: false)
+ select_milestone(milestone_1.title)
select_milestone(milestone_2.title)
- # Focus the "Release notes" field by clicking instead of tabbing
- # because tabbing to the field requires too many tabs
- # (see https://gitlab.com/gitlab-org/gitlab/-/issues/238619)
- find_field('Release notes').click
fill_release_notes(release_notes)
- # Tab past the "assets" documentation link
- focused_element.send_keys(:tab)
-
fill_asset_link(link_1)
add_another_asset_link
fill_asset_link(link_2)
- # Submit using the Control+Enter shortcut
- focused_element.send_keys([:control, :enter])
+ # Click on the body in order to trigger a `blur` event on the current field.
+ # This triggers the form's validation to run so that the
+ # "Create release" button is enabled and clickable.
+ page.find('body').click
+
+ click_button('Create release')
wait_for_all_requests
end
diff --git a/spec/features/projects/settings/operations_settings_spec.rb b/spec/features/projects/settings/operations_settings_spec.rb
index 1d9f256a819..e3b36348f25 100644
--- a/spec/features/projects/settings/operations_settings_spec.rb
+++ b/spec/features/projects/settings/operations_settings_spec.rb
@@ -24,7 +24,7 @@ RSpec.describe 'Projects > Settings > For a forked project', :js do
describe 'Settings > Operations' do
describe 'Incidents' do
let(:create_issue) { 'Create an incident. Incidents are created for each alert triggered.' }
- let(:send_email) { 'Send a separate email notification to Developers.' }
+ let(:send_email) { 'Send a single email notification to Owners and Maintainers for new alerts.' }
before do
create(:project_incident_management_setting, send_email: true, project: project)
diff --git a/spec/features/projects/settings/service_desk_setting_spec.rb b/spec/features/projects/settings/service_desk_setting_spec.rb
index d31913d2dcf..50451075db5 100644
--- a/spec/features/projects/settings/service_desk_setting_spec.rb
+++ b/spec/features/projects/settings/service_desk_setting_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Service Desk Setting', :js do
+RSpec.describe 'Service Desk Setting', :js, :clean_gitlab_redis_cache do
let(:project) { create(:project_empty_repo, :private, service_desk_enabled: false) }
let(:presenter) { project.present(current_user: user) }
let(:user) { create(:user) }
@@ -66,5 +66,48 @@ RSpec.describe 'Service Desk Setting', :js do
expect(find('[data-testid="incoming-email"]').value).to eq('address-suffix@example.com')
end
+
+ context 'issue description templates' do
+ let_it_be(:issuable_project_template_files) do
+ {
+ '.gitlab/issue_templates/project-issue-bar.md' => 'Project Issue Template Bar',
+ '.gitlab/issue_templates/project-issue-foo.md' => 'Project Issue Template Foo'
+ }
+ end
+
+ let_it_be(:issuable_group_template_files) do
+ {
+ '.gitlab/issue_templates/group-issue-bar.md' => 'Group Issue Template Bar',
+ '.gitlab/issue_templates/group-issue-foo.md' => 'Group Issue Template Foo'
+ }
+ end
+
+ let_it_be_with_reload(:group) { create(:group)}
+ let_it_be_with_reload(:project) { create(:project, :custom_repo, group: group, files: issuable_project_template_files) }
+ let_it_be(:group_template_repo) { create(:project, :custom_repo, group: group, files: issuable_group_template_files) }
+
+ before do
+ stub_licensed_features(custom_file_templates_for_namespace: false, custom_file_templates: false)
+ group.update_columns(file_template_project_id: group_template_repo.id)
+ end
+
+ context 'when inherited_issuable_templates enabled' do
+ before do
+ stub_feature_flags(inherited_issuable_templates: true)
+ visit edit_project_path(project)
+ end
+
+ it_behaves_like 'issue description templates from current project only'
+ end
+
+ context 'when inherited_issuable_templates disabled' do
+ before do
+ stub_feature_flags(inherited_issuable_templates: false)
+ visit edit_project_path(project)
+ end
+
+ it_behaves_like 'issue description templates from current project only'
+ end
+ end
end
end
diff --git a/spec/features/projects/settings/user_manages_merge_requests_settings_spec.rb b/spec/features/projects/settings/user_manages_merge_requests_settings_spec.rb
index e8e32d93f7b..397c334a2b8 100644
--- a/spec/features/projects/settings/user_manages_merge_requests_settings_spec.rb
+++ b/spec/features/projects/settings/user_manages_merge_requests_settings_spec.rb
@@ -133,7 +133,7 @@ RSpec.describe 'Projects > Settings > User manages merge request settings' do
it 'when unchecked sets :remove_source_branch_after_merge to false' do
uncheck('project_remove_source_branch_after_merge')
within('.merge-request-settings-form') do
- find('.qa-save-merge-request-changes')
+ find('.rspec-save-merge-request-changes')
click_on('Save changes')
end
@@ -157,7 +157,7 @@ RSpec.describe 'Projects > Settings > User manages merge request settings' do
choose('project_project_setting_attributes_squash_option_default_on')
within('.merge-request-settings-form') do
- find('.qa-save-merge-request-changes')
+ find('.rspec-save-merge-request-changes')
click_on('Save changes')
end
@@ -172,7 +172,7 @@ RSpec.describe 'Projects > Settings > User manages merge request settings' do
choose('project_project_setting_attributes_squash_option_always')
within('.merge-request-settings-form') do
- find('.qa-save-merge-request-changes')
+ find('.rspec-save-merge-request-changes')
click_on('Save changes')
end
@@ -187,7 +187,7 @@ RSpec.describe 'Projects > Settings > User manages merge request settings' do
choose('project_project_setting_attributes_squash_option_never')
within('.merge-request-settings-form') do
- find('.qa-save-merge-request-changes')
+ find('.rspec-save-merge-request-changes')
click_on('Save changes')
end
diff --git a/spec/features/projects/settings/user_manages_project_members_spec.rb b/spec/features/projects/settings/user_manages_project_members_spec.rb
index 0d22da34b91..b237e7e8ce7 100644
--- a/spec/features/projects/settings/user_manages_project_members_spec.rb
+++ b/spec/features/projects/settings/user_manages_project_members_spec.rb
@@ -19,123 +19,54 @@ RSpec.describe 'Projects > Settings > User manages project members' do
sign_in(user)
end
- context 'when `vue_project_members_list` feature flag is enabled' do
- it 'cancels a team member', :js do
- visit(project_project_members_path(project))
+ it 'cancels a team member', :js do
+ visit(project_project_members_path(project))
- page.within find_member_row(user_dmitriy) do
- click_button 'Remove member'
- end
-
- page.within('[role="dialog"]') do
- expect(page).to have_unchecked_field 'Also unassign this user from related issues and merge requests'
- click_button('Remove member')
- end
-
- visit(project_project_members_path(project))
-
- expect(members_table).not_to have_content(user_dmitriy.name)
- expect(members_table).not_to have_content(user_dmitriy.username)
+ page.within find_member_row(user_dmitriy) do
+ click_button 'Remove member'
end
- it 'imports a team from another project', :js do
- stub_feature_flags(invite_members_group_modal: false)
-
- project2.add_maintainer(user)
- project2.add_reporter(user_mike)
-
- visit(project_project_members_path(project))
-
- page.within('.invite-users-form') do
- click_link('Import')
- end
-
- select2(project2.id, from: '#source_project_id')
- click_button('Import project members')
-
- expect(find_member_row(user_mike)).to have_content('Reporter')
+ page.within('[role="dialog"]') do
+ expect(page).to have_unchecked_field 'Also unassign this user from related issues and merge requests'
+ click_button('Remove member')
end
- it 'shows all members of project shared group', :js do
- group.add_owner(user)
- group.add_developer(user_dmitriy)
-
- share_link = project.project_group_links.new(group_access: Gitlab::Access::MAINTAINER)
- share_link.group_id = group.id
- share_link.save!
-
- visit(project_project_members_path(project))
+ visit(project_project_members_path(project))
- click_link 'Groups'
-
- expect(find_group_row(group)).to have_content('Maintainer')
- end
+ expect(members_table).not_to have_content(user_dmitriy.name)
+ expect(members_table).not_to have_content(user_dmitriy.username)
end
- context 'when `vue_project_members_list` feature flag is disabled' do
- before do
- stub_feature_flags(vue_project_members_list: false)
- end
+ it 'imports a team from another project', :js do
+ stub_feature_flags(invite_members_group_modal: false)
- it 'cancels a team member', :js do
- visit(project_project_members_path(project))
+ project2.add_maintainer(user)
+ project2.add_reporter(user_mike)
- project_member = project.project_members.find_by(user_id: user_dmitriy.id)
+ visit(project_project_members_path(project))
- page.within("#project_member_#{project_member.id}") do
- # Open modal
- click_on('Remove user from project')
- end
-
- expect(page).to have_unchecked_field 'Also unassign this user from related issues and merge requests'
-
- click_on('Remove member')
-
- visit(project_project_members_path(project))
-
- expect(page).not_to have_content(user_dmitriy.name)
- expect(page).not_to have_content(user_dmitriy.username)
+ page.within('.invite-users-form') do
+ click_link('Import')
end
- it 'imports a team from another project' do
- stub_feature_flags(invite_members_group_modal: false)
-
- project2.add_maintainer(user)
- project2.add_reporter(user_mike)
-
- visit(project_project_members_path(project))
+ select2(project2.id, from: '#source_project_id')
+ click_button('Import project members')
- page.within('.invite-users-form') do
- click_link('Import')
- end
-
- select(project2.full_name, from: 'source_project_id')
- click_button('Import')
-
- project_member = project.project_members.find_by(user_id: user_mike.id)
-
- page.within("#project_member_#{project_member.id}") do
- expect(page).to have_content('Mike')
- expect(page).to have_content('Reporter')
- end
- end
+ expect(find_member_row(user_mike)).to have_content('Reporter')
+ end
- it 'shows all members of project shared group', :js do
- group.add_owner(user)
- group.add_developer(user_dmitriy)
+ it 'shows all members of project shared group', :js do
+ group.add_owner(user)
+ group.add_developer(user_dmitriy)
- share_link = project.project_group_links.new(group_access: Gitlab::Access::MAINTAINER)
- share_link.group_id = group.id
- share_link.save!
+ share_link = project.project_group_links.new(group_access: Gitlab::Access::MAINTAINER)
+ share_link.group_id = group.id
+ share_link.save!
- visit(project_project_members_path(project))
+ visit(project_project_members_path(project))
- click_link 'Groups'
+ click_link 'Groups'
- page.within('[data-testid="project-member-groups"]') do
- expect(page).to have_content('OpenSource')
- expect(first('.group_member')).to have_content('Maintainer')
- end
- end
+ expect(find_group_row(group)).to have_content('Maintainer')
end
end
diff --git a/spec/features/projects/settings/user_searches_in_settings_spec.rb b/spec/features/projects/settings/user_searches_in_settings_spec.rb
new file mode 100644
index 00000000000..4c5b39d5282
--- /dev/null
+++ b/spec/features/projects/settings/user_searches_in_settings_spec.rb
@@ -0,0 +1,42 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'User searches project settings', :js do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project, :repository, namespace: user.namespace) }
+
+ before do
+ sign_in(user)
+ end
+
+ context 'in general settings page' do
+ let(:visit_path) { edit_project_path(project) }
+
+ it_behaves_like 'can search settings with feature flag check', 'Naming', 'Visibility'
+ end
+
+ context 'in Repository page' do
+ before do
+ visit project_settings_repository_path(project)
+ end
+
+ it_behaves_like 'can search settings', 'Deploy keys', 'Mirroring repositories'
+ end
+
+ context 'in CI/CD page' do
+ before do
+ visit project_settings_ci_cd_path(project)
+ end
+
+ it_behaves_like 'can search settings', 'General pipelines', 'Auto DevOps'
+ end
+
+ context 'in Operations page' do
+ before do
+ visit project_settings_operations_path(project)
+ end
+
+ it_behaves_like 'can search settings', 'Alerts', 'Error tracking'
+ end
+end
diff --git a/spec/features/projects/show/user_manages_notifications_spec.rb b/spec/features/projects/show/user_manages_notifications_spec.rb
index 5f7d9b0963b..80dae4ec386 100644
--- a/spec/features/projects/show/user_manages_notifications_spec.rb
+++ b/spec/features/projects/show/user_manages_notifications_spec.rb
@@ -6,38 +6,36 @@ RSpec.describe 'Projects > Show > User manages notifications', :js do
let(:project) { create(:project, :public, :repository) }
before do
- stub_feature_flags(vue_notification_dropdown: false)
sign_in(project.owner)
end
def click_notifications_button
- first('.notifications-btn').click
+ first('[data-testid="notification-dropdown"]').click
end
it 'changes the notification setting' do
visit project_path(project)
click_notifications_button
- click_link 'On mention'
+ click_button 'On mention'
- page.within('.notification-dropdown') do
- expect(page).not_to have_css('.gl-spinner')
- end
+ wait_for_requests
click_notifications_button
- expect(find('.update-notification.is-active')).to have_content('On mention')
- expect(page).to have_css('.notifications-icon[data-testid="notifications-icon"]')
+
+ page.within first('[data-testid="notification-dropdown"]') do
+ expect(page.find('.gl-new-dropdown-item.is-active')).to have_content('On mention')
+ expect(page).to have_css('[data-testid="notifications-icon"]')
+ end
end
it 'changes the notification setting to disabled' do
visit project_path(project)
click_notifications_button
- click_link 'Disabled'
+ click_button 'Disabled'
- page.within('.notification-dropdown') do
- expect(page).not_to have_css('.gl-spinner')
+ page.within first('[data-testid="notification-dropdown"]') do
+ expect(page).to have_css('[data-testid="notifications-off-icon"]')
end
-
- expect(page).to have_css('.notifications-icon[data-testid="notifications-off-icon"]')
end
context 'custom notification settings' do
@@ -65,11 +63,13 @@ RSpec.describe 'Projects > Show > User manages notifications', :js do
it 'shows notification settings checkbox' do
visit project_path(project)
click_notifications_button
- page.find('a[data-notification-level="custom"]').click
+ click_button 'Custom'
+
+ wait_for_requests
- page.within('.custom-notifications-form') do
+ page.within('#custom-notifications-modal') do
email_events.each do |event_name|
- expect(page).to have_selector("input[name='notification_setting[#{event_name}]']")
+ expect(page).to have_selector("[data-testid='notification-setting-#{event_name}']")
end
end
end
@@ -80,7 +80,7 @@ RSpec.describe 'Projects > Show > User manages notifications', :js do
it 'is disabled' do
visit project_path(project)
- expect(page).to have_selector('.notifications-btn.disabled', visible: true)
+ expect(page).to have_selector('[data-testid="notification-dropdown"] .disabled', visible: true)
end
end
end
diff --git a/spec/features/projects/show/user_uploads_files_spec.rb b/spec/features/projects/show/user_uploads_files_spec.rb
index 053598a528e..2030c4d998a 100644
--- a/spec/features/projects/show/user_uploads_files_spec.rb
+++ b/spec/features/projects/show/user_uploads_files_spec.rb
@@ -33,4 +33,24 @@ RSpec.describe 'Projects > Show > User uploads files' do
include_examples 'it uploads and commit a new file to a forked project'
end
+
+ context 'when in the empty_repo_upload experiment' do
+ before do
+ stub_experiments(empty_repo_upload: :candidate)
+
+ visit(project_path(project))
+ end
+
+ context 'with an empty repo' do
+ let(:project) { create(:project, :empty_repo, creator: user) }
+
+ include_examples 'uploads and commits a new text file via "upload file" button'
+ end
+
+ context 'with a nonempty repo' do
+ let(:project) { create(:project, :repository, creator: user) }
+
+ include_examples 'uploads and commits a new text file via "upload file" button'
+ end
+ end
end
diff --git a/spec/features/projects/user_sees_sidebar_spec.rb b/spec/features/projects/user_sees_sidebar_spec.rb
index 616c5065c07..e5ba6b503cc 100644
--- a/spec/features/projects/user_sees_sidebar_spec.rb
+++ b/spec/features/projects/user_sees_sidebar_spec.rb
@@ -201,7 +201,7 @@ RSpec.describe 'Projects > User sees sidebar' do
expect(page).to have_content 'Operations'
expect(page).not_to have_content 'Repository'
- expect(page).not_to have_content 'CI / CD'
+ expect(page).not_to have_content 'CI/CD'
expect(page).not_to have_content 'Merge Requests'
end
end
@@ -213,7 +213,7 @@ RSpec.describe 'Projects > User sees sidebar' do
visit project_path(project)
within('.nav-sidebar') do
- expect(page).to have_content 'CI / CD'
+ expect(page).to have_content 'CI/CD'
end
end
diff --git a/spec/features/projects/user_uses_shortcuts_spec.rb b/spec/features/projects/user_uses_shortcuts_spec.rb
index 13ae035e8ef..f97c8d820e3 100644
--- a/spec/features/projects/user_uses_shortcuts_spec.rb
+++ b/spec/features/projects/user_uses_shortcuts_spec.rb
@@ -155,12 +155,12 @@ RSpec.describe 'User uses shortcuts', :js do
end
end
- context 'when navigating to the CI / CD pages' do
+ context 'when navigating to the CI/CD pages' do
it 'redirects to the Jobs page' do
find('body').native.send_key('g')
find('body').native.send_key('j')
- expect(page).to have_active_navigation('CI / CD')
+ expect(page).to have_active_navigation('CI/CD')
expect(page).to have_active_sub_navigation('Jobs')
end
end
diff --git a/spec/features/projects_spec.rb b/spec/features/projects_spec.rb
index 618a256d4fb..4730679feb8 100644
--- a/spec/features/projects_spec.rb
+++ b/spec/features/projects_spec.rb
@@ -49,7 +49,7 @@ RSpec.describe 'Project' do
it 'shows the command in a popover', :js do
click_link 'Show command'
- expect(page).to have_css('.popover .push-to-create-popover #push_to_create_tip')
+ expect(page).to have_css('.popover #push-to-create-tip')
expect(page).to have_content 'Private projects can be created in your personal namespace with:'
end
end
diff --git a/spec/features/security/group/internal_access_spec.rb b/spec/features/security/group/internal_access_spec.rb
index c146ac1e8ee..755f170a93e 100644
--- a/spec/features/security/group/internal_access_spec.rb
+++ b/spec/features/security/group/internal_access_spec.rb
@@ -24,7 +24,12 @@ RSpec.describe 'Internal Group access' do
describe 'GET /groups/:path' do
subject { group_path(group) }
- it { is_expected.to be_allowed_for(:admin) }
+ context 'when admin mode is enabled', :enable_admin_mode do
+ it { is_expected.to be_allowed_for(:admin) }
+ end
+ context 'when admin mode is disabled' do
+ it { is_expected.to be_allowed_for(:admin) }
+ end
it { is_expected.to be_allowed_for(:owner).of(group) }
it { is_expected.to be_allowed_for(:maintainer).of(group) }
it { is_expected.to be_allowed_for(:developer).of(group) }
@@ -39,7 +44,12 @@ RSpec.describe 'Internal Group access' do
describe 'GET /groups/:path/-/issues' do
subject { issues_group_path(group) }
- it { is_expected.to be_allowed_for(:admin) }
+ context 'when admin mode is enabled', :enable_admin_mode do
+ it { is_expected.to be_allowed_for(:admin) }
+ end
+ context 'when admin mode is disabled' do
+ it { is_expected.to be_allowed_for(:admin) }
+ end
it { is_expected.to be_allowed_for(:owner).of(group) }
it { is_expected.to be_allowed_for(:maintainer).of(group) }
it { is_expected.to be_allowed_for(:developer).of(group) }
@@ -56,7 +66,12 @@ RSpec.describe 'Internal Group access' do
subject { merge_requests_group_path(group) }
- it { is_expected.to be_allowed_for(:admin) }
+ context 'when admin mode is enabled', :enable_admin_mode do
+ it { is_expected.to be_allowed_for(:admin) }
+ end
+ context 'when admin mode is disabled' do
+ it { is_expected.to be_allowed_for(:admin) }
+ end
it { is_expected.to be_allowed_for(:owner).of(group) }
it { is_expected.to be_allowed_for(:maintainer).of(group) }
it { is_expected.to be_allowed_for(:developer).of(group) }
@@ -71,7 +86,12 @@ RSpec.describe 'Internal Group access' do
describe 'GET /groups/:path/-/group_members' do
subject { group_group_members_path(group) }
- it { is_expected.to be_allowed_for(:admin) }
+ context 'when admin mode is enabled', :enable_admin_mode do
+ it { is_expected.to be_allowed_for(:admin) }
+ end
+ context 'when admin mode is disabled' do
+ it { is_expected.to be_allowed_for(:admin) }
+ end
it { is_expected.to be_allowed_for(:owner).of(group) }
it { is_expected.to be_allowed_for(:maintainer).of(group) }
it { is_expected.to be_allowed_for(:developer).of(group) }
@@ -86,7 +106,12 @@ RSpec.describe 'Internal Group access' do
describe 'GET /groups/:path/-/edit' do
subject { edit_group_path(group) }
- it { is_expected.to be_allowed_for(:admin) }
+ context 'when admin mode is enabled', :enable_admin_mode do
+ it { is_expected.to be_allowed_for(:admin) }
+ end
+ context 'when admin mode is disabled' do
+ it { is_expected.to be_denied_for(:admin) }
+ end
it { is_expected.to be_allowed_for(:owner).of(group) }
it { is_expected.to be_denied_for(:maintainer).of(group) }
it { is_expected.to be_denied_for(:developer).of(group) }
diff --git a/spec/features/security/group/private_access_spec.rb b/spec/features/security/group/private_access_spec.rb
index de05b4d3d16..fc1fb3e3848 100644
--- a/spec/features/security/group/private_access_spec.rb
+++ b/spec/features/security/group/private_access_spec.rb
@@ -24,7 +24,12 @@ RSpec.describe 'Private Group access' do
describe 'GET /groups/:path' do
subject { group_path(group) }
- it { is_expected.to be_allowed_for(:admin) }
+ context 'when admin mode is enabled', :enable_admin_mode do
+ it { is_expected.to be_allowed_for(:admin) }
+ end
+ context 'when admin mode is disabled' do
+ it { is_expected.to be_denied_for(:admin) }
+ end
it { is_expected.to be_allowed_for(:owner).of(group) }
it { is_expected.to be_allowed_for(:maintainer).of(group) }
it { is_expected.to be_allowed_for(:developer).of(group) }
@@ -39,7 +44,12 @@ RSpec.describe 'Private Group access' do
describe 'GET /groups/:path/-/issues' do
subject { issues_group_path(group) }
- it { is_expected.to be_allowed_for(:admin) }
+ context 'when admin mode is enabled', :enable_admin_mode do
+ it { is_expected.to be_allowed_for(:admin) }
+ end
+ context 'when admin mode is disabled' do
+ it { is_expected.to be_denied_for(:admin) }
+ end
it { is_expected.to be_allowed_for(:owner).of(group) }
it { is_expected.to be_allowed_for(:maintainer).of(group) }
it { is_expected.to be_allowed_for(:developer).of(group) }
@@ -56,7 +66,12 @@ RSpec.describe 'Private Group access' do
subject { merge_requests_group_path(group) }
- it { is_expected.to be_allowed_for(:admin) }
+ context 'when admin mode is enabled', :enable_admin_mode do
+ it { is_expected.to be_allowed_for(:admin) }
+ end
+ context 'when admin mode is disabled' do
+ it { is_expected.to be_denied_for(:admin) }
+ end
it { is_expected.to be_allowed_for(:owner).of(group) }
it { is_expected.to be_allowed_for(:maintainer).of(group) }
it { is_expected.to be_allowed_for(:developer).of(group) }
@@ -71,7 +86,12 @@ RSpec.describe 'Private Group access' do
describe 'GET /groups/:path/-/group_members' do
subject { group_group_members_path(group) }
- it { is_expected.to be_allowed_for(:admin) }
+ context 'when admin mode is enabled', :enable_admin_mode do
+ it { is_expected.to be_allowed_for(:admin) }
+ end
+ context 'when admin mode is disabled' do
+ it { is_expected.to be_denied_for(:admin) }
+ end
it { is_expected.to be_allowed_for(:owner).of(group) }
it { is_expected.to be_allowed_for(:maintainer).of(group) }
it { is_expected.to be_allowed_for(:developer).of(group) }
@@ -86,7 +106,12 @@ RSpec.describe 'Private Group access' do
describe 'GET /groups/:path/-/edit' do
subject { edit_group_path(group) }
- it { is_expected.to be_allowed_for(:admin) }
+ context 'when admin mode is enabled', :enable_admin_mode do
+ it { is_expected.to be_allowed_for(:admin) }
+ end
+ context 'when admin mode is disabled' do
+ it { is_expected.to be_denied_for(:admin) }
+ end
it { is_expected.to be_allowed_for(:owner).of(group) }
it { is_expected.to be_denied_for(:maintainer).of(group) }
it { is_expected.to be_denied_for(:developer).of(group) }
@@ -107,7 +132,12 @@ RSpec.describe 'Private Group access' do
subject { group_path(group) }
- it { is_expected.to be_allowed_for(:admin) }
+ context 'when admin mode is enabled', :enable_admin_mode do
+ it { is_expected.to be_allowed_for(:admin) }
+ end
+ context 'when admin mode is disabled' do
+ it { is_expected.to be_denied_for(:admin) }
+ end
it { is_expected.to be_allowed_for(:owner).of(group) }
it { is_expected.to be_allowed_for(:maintainer).of(group) }
it { is_expected.to be_allowed_for(:developer).of(group) }
diff --git a/spec/features/security/group/public_access_spec.rb b/spec/features/security/group/public_access_spec.rb
index ee72b84616a..90de2b58044 100644
--- a/spec/features/security/group/public_access_spec.rb
+++ b/spec/features/security/group/public_access_spec.rb
@@ -24,7 +24,12 @@ RSpec.describe 'Public Group access' do
describe 'GET /groups/:path' do
subject { group_path(group) }
- it { is_expected.to be_allowed_for(:admin) }
+ context 'when admin mode is enabled', :enable_admin_mode do
+ it { is_expected.to be_allowed_for(:admin) }
+ end
+ context 'when admin mode is disabled' do
+ it { is_expected.to be_allowed_for(:admin) }
+ end
it { is_expected.to be_allowed_for(:owner).of(group) }
it { is_expected.to be_allowed_for(:maintainer).of(group) }
it { is_expected.to be_allowed_for(:developer).of(group) }
@@ -39,7 +44,12 @@ RSpec.describe 'Public Group access' do
describe 'GET /groups/:path/-/issues' do
subject { issues_group_path(group) }
- it { is_expected.to be_allowed_for(:admin) }
+ context 'when admin mode is enabled', :enable_admin_mode do
+ it { is_expected.to be_allowed_for(:admin) }
+ end
+ context 'when admin mode is disabled' do
+ it { is_expected.to be_allowed_for(:admin) }
+ end
it { is_expected.to be_allowed_for(:owner).of(group) }
it { is_expected.to be_allowed_for(:maintainer).of(group) }
it { is_expected.to be_allowed_for(:developer).of(group) }
@@ -56,7 +66,12 @@ RSpec.describe 'Public Group access' do
subject { merge_requests_group_path(group) }
- it { is_expected.to be_allowed_for(:admin) }
+ context 'when admin mode is enabled', :enable_admin_mode do
+ it { is_expected.to be_allowed_for(:admin) }
+ end
+ context 'when admin mode is disabled' do
+ it { is_expected.to be_allowed_for(:admin) }
+ end
it { is_expected.to be_allowed_for(:owner).of(group) }
it { is_expected.to be_allowed_for(:maintainer).of(group) }
it { is_expected.to be_allowed_for(:developer).of(group) }
@@ -71,7 +86,12 @@ RSpec.describe 'Public Group access' do
describe 'GET /groups/:path/-/group_members' do
subject { group_group_members_path(group) }
- it { is_expected.to be_allowed_for(:admin) }
+ context 'when admin mode is enabled', :enable_admin_mode do
+ it { is_expected.to be_allowed_for(:admin) }
+ end
+ context 'when admin mode is disabled' do
+ it { is_expected.to be_allowed_for(:admin) }
+ end
it { is_expected.to be_allowed_for(:owner).of(group) }
it { is_expected.to be_allowed_for(:maintainer).of(group) }
it { is_expected.to be_allowed_for(:developer).of(group) }
@@ -86,7 +106,12 @@ RSpec.describe 'Public Group access' do
describe 'GET /groups/:path/-/edit' do
subject { edit_group_path(group) }
- it { is_expected.to be_allowed_for(:admin) }
+ context 'when admin mode is enabled', :enable_admin_mode do
+ it { is_expected.to be_allowed_for(:admin) }
+ end
+ context 'when admin mode is disabled' do
+ it { is_expected.to be_denied_for(:admin) }
+ end
it { is_expected.to be_allowed_for(:owner).of(group) }
it { is_expected.to be_denied_for(:maintainer).of(group) }
it { is_expected.to be_denied_for(:developer).of(group) }
diff --git a/spec/features/sentry_js_spec.rb b/spec/features/sentry_js_spec.rb
index aa0ad17340a..1d277ba7b3c 100644
--- a/spec/features/sentry_js_spec.rb
+++ b/spec/features/sentry_js_spec.rb
@@ -12,7 +12,7 @@ RSpec.describe 'Sentry' do
expect(has_requested_sentry).to eq(false)
end
- xit 'loads sentry if sentry is enabled' do
+ it 'loads sentry if sentry is enabled' do
stub_sentry_settings
visit new_user_session_path
diff --git a/spec/features/task_lists_spec.rb b/spec/features/task_lists_spec.rb
index e17521e1d02..0f8daaf8e15 100644
--- a/spec/features/task_lists_spec.rb
+++ b/spec/features/task_lists_spec.rb
@@ -69,13 +69,7 @@ RSpec.describe 'Task Lists', :js do
wait_for_requests
expect(page).to have_selector(".md .task-list .task-list-item .task-list-item-checkbox")
- end
-
- it_behaves_like 'page with comment and close button', 'Close issue' do
- def setup
- visit_issue(project, issue)
- wait_for_requests
- end
+ expect(page).to have_selector('.btn-close')
end
it 'is only editable by author' do
diff --git a/spec/features/uploads/user_uploads_avatar_to_profile_spec.rb b/spec/features/uploads/user_uploads_avatar_to_profile_spec.rb
index 31e29810c65..900cd72c17f 100644
--- a/spec/features/uploads/user_uploads_avatar_to_profile_spec.rb
+++ b/spec/features/uploads/user_uploads_avatar_to_profile_spec.rb
@@ -23,7 +23,7 @@ RSpec.describe 'User uploads avatar to profile' do
expect(user.reload.avatar.file).to exist
end
- it 'their new avatar is immediately visible in the header', :js do
+ it 'their new avatar is immediately visible in the header and setting sidebar', :js do
find('.js-user-avatar-input', visible: false).set(avatar_file_path)
click_button 'Set new profile picture'
@@ -33,5 +33,6 @@ RSpec.describe 'User uploads avatar to profile' do
data_uri = find('.avatar-image .avatar')['src']
expect(page.find('.header-user-avatar')['src']).to eq data_uri
+ expect(page.find('[data-testid="sidebar-user-avatar"]')['src']).to eq data_uri
end
end
diff --git a/spec/features/user_can_display_performance_bar_spec.rb b/spec/features/user_can_display_performance_bar_spec.rb
index 9c67523f88f..b8f41925156 100644
--- a/spec/features/user_can_display_performance_bar_spec.rb
+++ b/spec/features/user_can_display_performance_bar_spec.rb
@@ -49,6 +49,10 @@ RSpec.describe 'User can display performance bar', :js do
let(:group) { create(:group) }
+ before do
+ allow(GitlabPerformanceBarStatsWorker).to receive(:perform_in)
+ end
+
context 'when user is logged-out' do
before do
visit root_path
@@ -97,6 +101,26 @@ RSpec.describe 'User can display performance bar', :js do
it_behaves_like 'performance bar is enabled by default in development'
it_behaves_like 'performance bar can be displayed'
+
+ it 'does not show Stats link by default' do
+ find('body').native.send_keys('pb')
+
+ expect(page).not_to have_link('Stats', visible: :all)
+ end
+
+ context 'when GITLAB_PERFORMANCE_BAR_STATS_URL environment variable is set' do
+ let(:stats_url) { 'https://log.gprd.gitlab.net/app/dashboards#/view/' }
+
+ before do
+ stub_env('GITLAB_PERFORMANCE_BAR_STATS_URL', stats_url)
+ end
+
+ it 'shows Stats link' do
+ find('body').native.send_keys('pb')
+
+ expect(page).to have_link('Stats', href: stats_url, visible: :all)
+ end
+ end
end
end
end
diff --git a/spec/finders/admin/plans_finder_spec.rb b/spec/finders/admin/plans_finder_spec.rb
new file mode 100644
index 00000000000..9ea5944147c
--- /dev/null
+++ b/spec/finders/admin/plans_finder_spec.rb
@@ -0,0 +1,54 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Admin::PlansFinder do
+ let_it_be(:plan1) { create(:plan, name: 'plan1') }
+ let_it_be(:plan2) { create(:plan, name: 'plan2') }
+
+ describe '#execute' do
+ context 'with no params' do
+ it 'returns all plans' do
+ found = described_class.new.execute
+
+ expect(found).to match_array([plan1, plan2])
+ end
+ end
+
+ context 'with missing name in params' do
+ before do
+ @params = { title: 'plan2' }
+ end
+
+ it 'returns all plans' do
+ found = described_class.new(@params).execute
+
+ expect(found).to match_array([plan1, plan2])
+ end
+ end
+
+ context 'with existing name in params' do
+ before do
+ @params = { name: 'plan2' }
+ end
+
+ it 'returns the plan' do
+ found = described_class.new(@params).execute
+
+ expect(found).to match(plan2)
+ end
+ end
+
+ context 'with non-existing name in params' do
+ before do
+ @params = { name: 'non-existing-plan' }
+ end
+
+ it 'returns nil' do
+ found = described_class.new(@params).execute
+
+ expect(found).to be_nil
+ end
+ end
+ end
+end
diff --git a/spec/finders/boards/boards_finder_spec.rb b/spec/finders/boards/boards_finder_spec.rb
new file mode 100644
index 00000000000..2249c69df1b
--- /dev/null
+++ b/spec/finders/boards/boards_finder_spec.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Boards::BoardsFinder do
+ describe '#execute' do
+ context 'when board parent is a project' do
+ let(:parent) { create(:project) }
+
+ subject(:service) { described_class.new(parent, double) }
+
+ it_behaves_like 'boards list service'
+ it_behaves_like 'multiple boards list service'
+ end
+
+ context 'when board parent is a group' do
+ let(:parent) { create(:group) }
+
+ subject(:service) { described_class.new(parent, double) }
+
+ it_behaves_like 'boards list service'
+ end
+ end
+end
diff --git a/spec/finders/ci/daily_build_group_report_results_finder_spec.rb b/spec/finders/ci/daily_build_group_report_results_finder_spec.rb
index 2a6e44673e3..cf15a00323b 100644
--- a/spec/finders/ci/daily_build_group_report_results_finder_spec.rb
+++ b/spec/finders/ci/daily_build_group_report_results_finder_spec.rb
@@ -5,10 +5,14 @@ require 'spec_helper'
RSpec.describe Ci::DailyBuildGroupReportResultsFinder do
describe '#execute' do
let_it_be(:project) { create(:project, :private) }
- let_it_be(:current_user) { project.owner }
+ let(:user_without_permission) { create(:user) }
+ let_it_be(:user_with_permission) { project.owner }
let_it_be(:ref_path) { 'refs/heads/master' }
let(:limit) { nil }
let_it_be(:default_branch) { false }
+ let(:start_date) { '2020-03-09' }
+ let(:end_date) { '2020-03-10' }
+ let(:sort) { true }
let_it_be(:rspec_coverage_1) { create_daily_coverage('rspec', 79.0, '2020-03-09') }
let_it_be(:karma_coverage_1) { create_daily_coverage('karma', 89.0, '2020-03-09') }
@@ -17,24 +21,35 @@ RSpec.describe Ci::DailyBuildGroupReportResultsFinder do
let_it_be(:rspec_coverage_3) { create_daily_coverage('rspec', 97.0, '2020-03-11') }
let_it_be(:karma_coverage_3) { create_daily_coverage('karma', 99.0, '2020-03-11') }
- let(:attributes) do
+ let(:finder) { described_class.new(params: params, current_user: current_user) }
+
+ let(:params) do
{
- current_user: current_user,
project: project,
+ coverage: true,
ref_path: ref_path,
- start_date: '2020-03-09',
- end_date: '2020-03-10',
- limit: limit
+ start_date: start_date,
+ end_date: end_date,
+ limit: limit,
+ sort: sort
}
end
- subject(:coverages) do
- described_class.new(**attributes).execute
- end
+ subject(:coverages) { finder.execute }
+
+ context 'when params are provided' do
+ context 'when current user is not allowed to read data' do
+ let(:current_user) { user_without_permission }
+
+ it 'returns an empty collection' do
+ expect(coverages).to be_empty
+ end
+ end
+
+ context 'when current user is allowed to read data' do
+ let(:current_user) { user_with_permission }
- context 'when ref_path is present' do
- context 'when current user is allowed to read build report results' do
- it 'returns all matching results within the given date range' do
+ it 'returns matching coverages within the given date range' do
expect(coverages).to match_array([
karma_coverage_2,
rspec_coverage_2,
@@ -43,37 +58,45 @@ RSpec.describe Ci::DailyBuildGroupReportResultsFinder do
])
end
- context 'and limit is specified' do
+ context 'when ref_path is nil' do
+ let(:default_branch) { true }
+ let(:ref_path) { nil }
+
+ it 'returns coverages for the default branch' do
+ rspec_coverage_4 = create_daily_coverage('rspec', 66.0, '2020-03-10')
+
+ expect(coverages).to contain_exactly(rspec_coverage_4)
+ end
+ end
+
+ context 'when limit is specified' do
let(:limit) { 2 }
- it 'returns limited number of matching results within the given date range' do
+ it 'returns limited number of matching coverages within the given date range' do
expect(coverages).to match_array([
karma_coverage_2,
rspec_coverage_2
])
end
end
- end
-
- context 'when current user is not allowed to read build report results' do
- let(:current_user) { create(:user) }
-
- it 'returns an empty result' do
- expect(coverages).to be_empty
- end
- end
- end
-
- context 'when ref_path query parameter is not present' do
- let(:ref_path) { nil }
- context 'when records with cover data from the default branch exist' do
- let(:default_branch) { true }
-
- it 'returns records with default_branch:true, irrespective of ref_path' do
- rspec_coverage_4 = create_daily_coverage('rspec', 66.0, '2020-03-10')
-
- expect(coverages).to contain_exactly(rspec_coverage_4)
+ context 'when provided dates are nil' do
+ let(:start_date) { nil }
+ let(:end_date) { nil }
+ let(:rspec_coverage_4) { create_daily_coverage('rspec', 98.0, 91.days.ago.to_date.to_s) }
+
+ it 'returns all coverages from the last 90 days' do
+ expect(coverages).to match_array(
+ [
+ karma_coverage_3,
+ rspec_coverage_3,
+ karma_coverage_2,
+ rspec_coverage_2,
+ karma_coverage_1,
+ rspec_coverage_1
+ ]
+ )
+ end
end
end
end
diff --git a/spec/finders/ci/testing/daily_build_group_report_results_finder_spec.rb b/spec/finders/ci/testing/daily_build_group_report_results_finder_spec.rb
deleted file mode 100644
index a703f3b800c..00000000000
--- a/spec/finders/ci/testing/daily_build_group_report_results_finder_spec.rb
+++ /dev/null
@@ -1,99 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Ci::Testing::DailyBuildGroupReportResultsFinder do
- describe '#execute' do
- let_it_be(:project) { create(:project, :private) }
- let(:user_without_permission) { create(:user) }
- let_it_be(:user_with_permission) { project.owner }
- let_it_be(:ref_path) { 'refs/heads/master' }
- let(:limit) { nil }
- let_it_be(:default_branch) { false }
- let(:start_date) { '2020-03-09' }
- let(:end_date) { '2020-03-10' }
- let(:sort) { true }
-
- let_it_be(:rspec_coverage_1) { create_daily_coverage('rspec', 79.0, '2020-03-09') }
- let_it_be(:karma_coverage_1) { create_daily_coverage('karma', 89.0, '2020-03-09') }
- let_it_be(:rspec_coverage_2) { create_daily_coverage('rspec', 95.0, '2020-03-10') }
- let_it_be(:karma_coverage_2) { create_daily_coverage('karma', 92.0, '2020-03-10') }
- let_it_be(:rspec_coverage_3) { create_daily_coverage('rspec', 97.0, '2020-03-11') }
- let_it_be(:karma_coverage_3) { create_daily_coverage('karma', 99.0, '2020-03-11') }
-
- let(:finder) { described_class.new(params: params, current_user: current_user) }
-
- let(:params) do
- {
- project: project,
- coverage: true,
- ref_path: ref_path,
- start_date: start_date,
- end_date: end_date,
- limit: limit,
- sort: sort
- }
- end
-
- subject(:coverages) { finder.execute }
-
- context 'when params are provided' do
- context 'when current user is not allowed to read data' do
- let(:current_user) { user_without_permission }
-
- it 'returns an empty collection' do
- expect(coverages).to be_empty
- end
- end
-
- context 'when current user is allowed to read data' do
- let(:current_user) { user_with_permission }
-
- it 'returns matching coverages within the given date range' do
- expect(coverages).to match_array([
- karma_coverage_2,
- rspec_coverage_2,
- karma_coverage_1,
- rspec_coverage_1
- ])
- end
-
- context 'when ref_path is nil' do
- let(:default_branch) { true }
- let(:ref_path) { nil }
-
- it 'returns coverages for the default branch' do
- rspec_coverage_4 = create_daily_coverage('rspec', 66.0, '2020-03-10')
-
- expect(coverages).to contain_exactly(rspec_coverage_4)
- end
- end
-
- context 'when limit is specified' do
- let(:limit) { 2 }
-
- it 'returns limited number of matching coverages within the given date range' do
- expect(coverages).to match_array([
- karma_coverage_2,
- rspec_coverage_2
- ])
- end
- end
- end
- end
- end
-
- private
-
- def create_daily_coverage(group_name, coverage, date)
- create(
- :ci_daily_build_group_report_result,
- project: project,
- ref_path: ref_path || 'feature-branch',
- group_name: group_name,
- data: { 'coverage' => coverage },
- date: date,
- default_branch: default_branch
- )
- end
-end
diff --git a/spec/finders/issues_finder_spec.rb b/spec/finders/issues_finder_spec.rb
index 33b8a5954ae..b794ab626bf 100644
--- a/spec/finders/issues_finder_spec.rb
+++ b/spec/finders/issues_finder_spec.rb
@@ -179,33 +179,54 @@ RSpec.describe IssuesFinder do
end
end
- context 'filtering by author ID' do
- let(:params) { { author_id: user2.id } }
+ context 'filtering by author' do
+ context 'by author ID' do
+ let(:params) { { author_id: user2.id } }
- it 'returns issues created by that user' do
- expect(issues).to contain_exactly(issue3)
+ it 'returns issues created by that user' do
+ expect(issues).to contain_exactly(issue3)
+ end
end
- end
- context 'filtering by not author ID' do
- let(:params) { { not: { author_id: user2.id } } }
+ context 'using OR' do
+ let(:issue6) { create(:issue, project: project2) }
+ let(:params) { { or: { author_username: [issue3.author.username, issue6.author.username] } } }
+
+ it 'returns issues created by any of the given users' do
+ expect(issues).to contain_exactly(issue3, issue6)
+ end
+
+ context 'when feature flag is disabled' do
+ before do
+ stub_feature_flags(or_issuable_queries: false)
+ end
- it 'returns issues not created by that user' do
- expect(issues).to contain_exactly(issue1, issue2, issue4, issue5)
+ it 'does not add any filter' do
+ expect(issues).to contain_exactly(issue1, issue2, issue3, issue4, issue5, issue6)
+ end
+ end
end
- end
- context 'filtering by nonexistent author ID and issue term using CTE for search' do
- let(:params) do
- {
- author_id: 'does-not-exist',
- search: 'git',
- attempt_group_search_optimizations: true
- }
+ context 'filtering by NOT author ID' do
+ let(:params) { { not: { author_id: user2.id } } }
+
+ it 'returns issues not created by that user' do
+ expect(issues).to contain_exactly(issue1, issue2, issue4, issue5)
+ end
end
- it 'returns no results' do
- expect(issues).to be_empty
+ context 'filtering by nonexistent author ID and issue term using CTE for search' do
+ let(:params) do
+ {
+ author_id: 'does-not-exist',
+ search: 'git',
+ attempt_group_search_optimizations: true
+ }
+ end
+
+ it 'returns no results' do
+ expect(issues).to be_empty
+ end
end
end
diff --git a/spec/finders/merge_request_target_project_finder_spec.rb b/spec/finders/merge_request_target_project_finder_spec.rb
index dfb4d86fbb6..08fbfd7229a 100644
--- a/spec/finders/merge_request_target_project_finder_spec.rb
+++ b/spec/finders/merge_request_target_project_finder_spec.rb
@@ -16,13 +16,22 @@ RSpec.describe MergeRequestTargetProjectFinder do
expect(finder.execute).to contain_exactly(base_project, other_fork, forked_project)
end
- it 'does not include projects that have merge requests turned off' do
+ it 'does not include projects that have merge requests turned off by default' do
other_fork.project_feature.update!(merge_requests_access_level: ProjectFeature::DISABLED)
base_project.project_feature.update!(merge_requests_access_level: ProjectFeature::DISABLED)
expect(finder.execute).to contain_exactly(forked_project)
end
+ it 'includes projects that have merge requests turned off by default with a more-permissive project feature' do
+ finder = described_class.new(current_user: user, source_project: forked_project, project_feature: :repository)
+
+ other_fork.project_feature.update!(merge_requests_access_level: ProjectFeature::DISABLED)
+ base_project.project_feature.update!(merge_requests_access_level: ProjectFeature::DISABLED)
+
+ expect(finder.execute).to contain_exactly(base_project, other_fork, forked_project)
+ end
+
it 'does not contain archived projects' do
base_project.update!(archived: true)
diff --git a/spec/finders/merge_requests/oldest_per_commit_finder_spec.rb b/spec/finders/merge_requests/oldest_per_commit_finder_spec.rb
index 4e9d021fa5d..4724a8eb5c7 100644
--- a/spec/finders/merge_requests/oldest_per_commit_finder_spec.rb
+++ b/spec/finders/merge_requests/oldest_per_commit_finder_spec.rb
@@ -6,12 +6,20 @@ RSpec.describe MergeRequests::OldestPerCommitFinder do
describe '#execute' do
it 'returns a Hash mapping commit SHAs to their oldest merge requests' do
project = create(:project)
+ sha1 = Digest::SHA1.hexdigest('foo')
+ sha2 = Digest::SHA1.hexdigest('bar')
+ sha3 = Digest::SHA1.hexdigest('baz')
mr1 = create(:merge_request, :merged, target_project: project)
mr2 = create(:merge_request, :merged, target_project: project)
+ mr3 = create(
+ :merge_request,
+ :merged,
+ target_project: project,
+ merge_commit_sha: sha3
+ )
+
mr1_diff = create(:merge_request_diff, merge_request: mr1)
mr2_diff = create(:merge_request_diff, merge_request: mr2)
- sha1 = Digest::SHA1.hexdigest('foo')
- sha2 = Digest::SHA1.hexdigest('bar')
create(:merge_request_diff_commit, merge_request_diff: mr1_diff, sha: sha1)
create(:merge_request_diff_commit, merge_request_diff: mr2_diff, sha: sha1)
@@ -22,11 +30,16 @@ RSpec.describe MergeRequests::OldestPerCommitFinder do
relative_order: 1
)
- commits = [double(:commit, id: sha1), double(:commit, id: sha2)]
+ commits = [
+ double(:commit, id: sha1),
+ double(:commit, id: sha2),
+ double(:commit, id: sha3)
+ ]
expect(described_class.new(project).execute(commits)).to eq(
sha1 => mr1,
- sha2 => mr2
+ sha2 => mr2,
+ sha3 => mr3
)
end
@@ -42,5 +55,45 @@ RSpec.describe MergeRequests::OldestPerCommitFinder do
expect(described_class.new(mr.target_project).execute(commits))
.to be_empty
end
+
+ it 'includes the merge request for a merge commit' do
+ project = create(:project)
+ sha = Digest::SHA1.hexdigest('foo')
+ mr = create(
+ :merge_request,
+ :merged,
+ target_project: project,
+ merge_commit_sha: sha
+ )
+
+ commits = [double(:commit, id: sha)]
+
+ # This expectation is set so we're certain that the merge commit SHAs (if
+ # a matching merge request is found) aren't also used for finding MRs
+ # according to diffs.
+ expect(MergeRequestDiffCommit)
+ .not_to receive(:oldest_merge_request_id_per_commit)
+
+ expect(described_class.new(project).execute(commits)).to eq(sha => mr)
+ end
+
+ it 'includes the oldest merge request when a merge commit is present in a newer merge request' do
+ project = create(:project)
+ sha = Digest::SHA1.hexdigest('foo')
+ mr1 = create(
+ :merge_request,
+ :merged,
+ target_project: project, merge_commit_sha: sha
+ )
+
+ mr2 = create(:merge_request, :merged, target_project: project)
+ mr_diff = create(:merge_request_diff, merge_request: mr2)
+
+ create(:merge_request_diff_commit, merge_request_diff: mr_diff, sha: sha)
+
+ commits = [double(:commit, id: sha)]
+
+ expect(described_class.new(project).execute(commits)).to eq(sha => mr1)
+ end
end
end
diff --git a/spec/finders/merge_requests_finder_spec.rb b/spec/finders/merge_requests_finder_spec.rb
index 6fdfe780463..b3000498bb6 100644
--- a/spec/finders/merge_requests_finder_spec.rb
+++ b/spec/finders/merge_requests_finder_spec.rb
@@ -41,30 +41,51 @@ RSpec.describe MergeRequestsFinder do
expect(merge_requests).to contain_exactly(merge_request1)
end
- it 'filters by nonexistent author ID and MR term using CTE for search' do
- params = {
- author_id: 'does-not-exist',
- search: 'git',
- attempt_group_search_optimizations: true
- }
+ context 'filtering by author' do
+ subject(:merge_requests) { described_class.new(user, params).execute }
- merge_requests = described_class.new(user, params).execute
+ context 'using OR' do
+ let(:params) { { or: { author_username: [merge_request1.author.username, merge_request2.author.username] } } }
- expect(merge_requests).to be_empty
- end
+ before do
+ merge_request1.update!(author: create(:user))
+ merge_request2.update!(author: create(:user))
+ end
+
+ it 'returns merge requests created by any of the given users' do
+ expect(merge_requests).to contain_exactly(merge_request1, merge_request2)
+ end
- context 'filtering by not author ID' do
- let(:params) { { not: { author_id: user2.id } } }
+ context 'when feature flag is disabled' do
+ before do
+ stub_feature_flags(or_issuable_queries: false)
+ end
- before do
- merge_request2.update!(author: user2)
- merge_request3.update!(author: user2)
+ it 'does not add any filter' do
+ expect(merge_requests).to contain_exactly(merge_request1, merge_request2, merge_request3, merge_request4, merge_request5)
+ end
+ end
end
- it 'returns merge requests not created by that user' do
- merge_requests = described_class.new(user, params).execute
+ context 'with nonexistent author ID and MR term using CTE for search' do
+ let(:params) { { author_id: 'does-not-exist', search: 'git', attempt_group_search_optimizations: true } }
+
+ it 'returns no results' do
+ expect(merge_requests).to be_empty
+ end
+ end
- expect(merge_requests).to contain_exactly(merge_request1, merge_request4, merge_request5)
+ context 'filtering by not author ID' do
+ let(:params) { { not: { author_id: user2.id } } }
+
+ before do
+ merge_request2.update!(author: user2)
+ merge_request3.update!(author: user2)
+ end
+
+ it 'returns merge requests not created by that user' do
+ expect(merge_requests).to contain_exactly(merge_request1, merge_request4, merge_request5)
+ end
end
end
diff --git a/spec/finders/namespaces/projects_finder_spec.rb b/spec/finders/namespaces/projects_finder_spec.rb
new file mode 100644
index 00000000000..0f48aa6a9f4
--- /dev/null
+++ b/spec/finders/namespaces/projects_finder_spec.rb
@@ -0,0 +1,83 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Namespaces::ProjectsFinder do
+ let_it_be(:current_user) { create(:user) }
+ let_it_be(:namespace) { create(:group, :public) }
+ let_it_be(:subgroup) { create(:group, parent: namespace) }
+ let_it_be(:project_1) { create(:project, :public, group: namespace, path: 'project', name: 'Project') }
+ let_it_be(:project_2) { create(:project, :public, group: namespace, path: 'test-project', name: 'Test Project') }
+ let_it_be(:project_3) { create(:project, :public, path: 'sub-test-project', group: subgroup, name: 'Sub Test Project') }
+ let_it_be(:project_4) { create(:project, :public, path: 'test-project-2', group: namespace, name: 'Test Project 2') }
+
+ let(:params) { {} }
+
+ let(:finder) { described_class.new(namespace: namespace, params: params, current_user: current_user) }
+
+ subject(:projects) { finder.execute }
+
+ describe '#execute' do
+ context 'without a namespace' do
+ let(:namespace) { nil }
+
+ it 'returns an empty array' do
+ expect(projects).to be_empty
+ end
+ end
+
+ context 'with a namespace' do
+ it 'returns the project for the namespace' do
+ expect(projects).to contain_exactly(project_1, project_2, project_4)
+ end
+
+ context 'when include_subgroups is provided' do
+ let(:params) { { include_subgroups: true } }
+
+ it 'returns all projects for the namespace' do
+ expect(projects).to contain_exactly(project_1, project_2, project_3, project_4)
+ end
+
+ context 'when ids are provided' do
+ let(:params) { { include_subgroups: true, ids: [project_3.id] } }
+
+ it 'returns all projects for the ids' do
+ expect(projects).to contain_exactly(project_3)
+ end
+ end
+ end
+
+ context 'when ids are provided' do
+ let(:params) { { ids: [project_1.id] } }
+
+ it 'returns all projects for the ids' do
+ expect(projects).to contain_exactly(project_1)
+ end
+ end
+
+ context 'when sort is similarity' do
+ let(:params) { { sort: :similarity, search: 'test' } }
+
+ it 'returns projects by similarity' do
+ expect(projects).to contain_exactly(project_2, project_4)
+ end
+ end
+
+ context 'when search parameter is missing' do
+ let(:params) { { sort: :similarity } }
+
+ it 'returns all projects' do
+ expect(projects).to contain_exactly(project_1, project_2, project_4)
+ end
+ end
+
+ context 'when sort parameter is missing' do
+ let(:params) { { search: 'test' } }
+
+ it 'returns matching projects' do
+ expect(projects).to contain_exactly(project_2, project_4)
+ end
+ end
+ end
+ end
+end
diff --git a/spec/finders/packages/group_packages_finder_spec.rb b/spec/finders/packages/group_packages_finder_spec.rb
index 445482a5a96..d6daf73aba2 100644
--- a/spec/finders/packages/group_packages_finder_spec.rb
+++ b/spec/finders/packages/group_packages_finder_spec.rb
@@ -122,7 +122,7 @@ RSpec.describe Packages::GroupPackagesFinder do
end
context 'when there are processing packages' do
- let_it_be(:package4) { create(:nuget_package, project: project, name: Packages::Nuget::CreatePackageService::TEMPORARY_PACKAGE_NAME) }
+ let_it_be(:package4) { create(:nuget_package, project: project, name: Packages::Nuget::TEMPORARY_PACKAGE_NAME) }
it { is_expected.to match_array([package1, package2]) }
end
diff --git a/spec/finders/packages/npm/package_finder_spec.rb b/spec/finders/packages/npm/package_finder_spec.rb
index 78c23971f92..f021d800f31 100644
--- a/spec/finders/packages/npm/package_finder_spec.rb
+++ b/spec/finders/packages/npm/package_finder_spec.rb
@@ -2,39 +2,139 @@
require 'spec_helper'
RSpec.describe ::Packages::Npm::PackageFinder do
- let(:package) { create(:npm_package) }
+ let_it_be_with_reload(:project) { create(:project)}
+ let_it_be(:package) { create(:npm_package, project: project) }
+
let(:project) { package.project }
let(:package_name) { package.name }
- describe '#execute!' do
- subject { described_class.new(project, package_name).execute }
+ shared_examples 'accepting a namespace for' do |example_name|
+ before do
+ project.update!(namespace: namespace)
+ end
+
+ context 'that is a group' do
+ let_it_be(:namespace) { create(:group) }
+
+ it_behaves_like example_name
+
+ context 'within another group' do
+ let_it_be(:subgroup) { create(:group, parent: namespace) }
+
+ before do
+ project.update!(namespace: subgroup)
+ end
+
+ it_behaves_like example_name
+ end
+ end
+
+ context 'that is a user namespace' do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:namespace) { user.namespace }
+
+ it_behaves_like example_name
+ end
+ end
+
+ describe '#execute' do
+ shared_examples 'finding packages by name' do
+ it { is_expected.to eq([package]) }
+
+ context 'with unknown package name' do
+ let(:package_name) { 'baz' }
+
+ it { is_expected.to be_empty }
+ end
+ end
+
+ subject { finder.execute }
+
+ context 'with a project' do
+ let(:finder) { described_class.new(package_name, project: project) }
- it { is_expected.to eq([package]) }
+ it_behaves_like 'finding packages by name'
- context 'with unknown package name' do
- let(:package_name) { 'baz' }
+ context 'set to nil' do
+ let(:project) { nil }
- it { is_expected.to be_empty }
+ it { is_expected.to be_empty }
+ end
end
- context 'with nil project' do
- let(:project) { nil }
+ context 'with a namespace' do
+ let(:finder) { described_class.new(package_name, namespace: namespace) }
+
+ it_behaves_like 'accepting a namespace for', 'finding packages by name'
+
+ context 'set to nil' do
+ let_it_be(:namespace) { nil }
- it { is_expected.to be_empty }
+ it { is_expected.to be_empty }
+ end
end
end
describe '#find_by_version' do
let(:version) { package.version }
- subject { described_class.new(project, package.name).find_by_version(version) }
+ subject { finder.find_by_version(version) }
+
+ shared_examples 'finding packages by version' do
+ it { is_expected.to eq(package) }
+
+ context 'with unknown version' do
+ let(:version) { 'foobar' }
+
+ it { is_expected.to be_nil }
+ end
+ end
+
+ context 'with a project' do
+ let(:finder) { described_class.new(package_name, project: project) }
+
+ it_behaves_like 'finding packages by version'
+ end
+
+ context 'with a namespace' do
+ let(:finder) { described_class.new(package_name, namespace: namespace) }
+
+ it_behaves_like 'accepting a namespace for', 'finding packages by version'
+ end
+ end
+
+ describe '#last' do
+ subject { finder.last }
+
+ shared_examples 'finding package by last' do
+ it { is_expected.to eq(package) }
+ end
+
+ context 'with a project' do
+ let(:finder) { described_class.new(package_name, project: project) }
+
+ it_behaves_like 'finding package by last'
+ end
+
+ context 'with a namespace' do
+ let(:finder) { described_class.new(package_name, namespace: namespace) }
+
+ it_behaves_like 'accepting a namespace for', 'finding package by last'
- it { is_expected.to eq(package) }
+ context 'with duplicate packages' do
+ let_it_be(:namespace) { create(:group) }
+ let_it_be(:subgroup1) { create(:group, parent: namespace) }
+ let_it_be(:subgroup2) { create(:group, parent: namespace) }
+ let_it_be(:project2) { create(:project, namespace: subgroup2) }
+ let_it_be(:package2) { create(:npm_package, name: package.name, project: project2) }
- context 'with unknown version' do
- let(:version) { 'foobar' }
+ before do
+ project.update!(namespace: subgroup1)
+ end
- it { is_expected.to be_nil }
+ # the most recent one is returned
+ it { is_expected.to eq(package2) }
+ end
end
end
end
diff --git a/spec/finders/packages/package_finder_spec.rb b/spec/finders/packages/package_finder_spec.rb
index ef07e7575d1..e8c7404a612 100644
--- a/spec/finders/packages/package_finder_spec.rb
+++ b/spec/finders/packages/package_finder_spec.rb
@@ -14,7 +14,7 @@ RSpec.describe ::Packages::PackageFinder do
it { is_expected.to eq(maven_package) }
context 'processing packages' do
- let_it_be(:nuget_package) { create(:nuget_package, project: project, name: Packages::Nuget::CreatePackageService::TEMPORARY_PACKAGE_NAME) }
+ let_it_be(:nuget_package) { create(:nuget_package, project: project, name: Packages::Nuget::TEMPORARY_PACKAGE_NAME) }
let(:package_id) { nuget_package.id }
it 'are not returned' do
diff --git a/spec/finders/packages/packages_finder_spec.rb b/spec/finders/packages/packages_finder_spec.rb
index 6e92616bafa..0add77a8478 100644
--- a/spec/finders/packages/packages_finder_spec.rb
+++ b/spec/finders/packages/packages_finder_spec.rb
@@ -76,7 +76,7 @@ RSpec.describe ::Packages::PackagesFinder do
end
context 'with processing packages' do
- let_it_be(:nuget_package) { create(:nuget_package, project: project, name: Packages::Nuget::CreatePackageService::TEMPORARY_PACKAGE_NAME) }
+ let_it_be(:nuget_package) { create(:nuget_package, project: project, name: Packages::Nuget::TEMPORARY_PACKAGE_NAME) }
it { is_expected.to match_array([conan_package, maven_package]) }
end
diff --git a/spec/finders/projects/groups_finder_spec.rb b/spec/finders/projects/groups_finder_spec.rb
new file mode 100644
index 00000000000..89d4edaec7c
--- /dev/null
+++ b/spec/finders/projects/groups_finder_spec.rb
@@ -0,0 +1,103 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::GroupsFinder do
+ describe '#execute' do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:root_group) { create(:group, :public) }
+ let_it_be(:project_group) { create(:group, :public, parent: root_group) }
+ let_it_be(:shared_group_with_dev_access) { create(:group, :private, parent: root_group) }
+ let_it_be(:shared_group_with_reporter_access) { create(:group, :private) }
+
+ let_it_be(:public_project) { create(:project, :public, group: project_group) }
+ let_it_be(:private_project) { create(:project, :private, group: project_group) }
+
+ before_all do
+ [public_project, private_project].each do |project|
+ create(:project_group_link, :developer, group: shared_group_with_dev_access, project: project)
+ create(:project_group_link, :reporter, group: shared_group_with_reporter_access, project: project)
+ end
+ end
+
+ let(:params) { {} }
+ let(:current_user) { user }
+ let(:finder) { described_class.new(project: project, current_user: current_user, params: params) }
+
+ subject { finder.execute }
+
+ shared_examples 'finding related groups' do
+ it 'returns ancestor groups for this project' do
+ is_expected.to match_array([project_group, root_group])
+ end
+
+ context 'when the project does not belong to any group' do
+ before do
+ allow(project).to receive(:group) { nil }
+ end
+
+ it { is_expected.to eq([]) }
+ end
+
+ context 'when shared groups option is on' do
+ let(:params) { { with_shared: true } }
+
+ it 'returns ancestor and all shared groups' do
+ is_expected.to match_array([project_group, root_group, shared_group_with_dev_access, shared_group_with_reporter_access])
+ end
+
+ context 'when shared_min_access_level is developer' do
+ let(:params) { super().merge(shared_min_access_level: Gitlab::Access::DEVELOPER) }
+
+ it 'returns ancestor and shared groups with at least developer access' do
+ is_expected.to match_array([project_group, root_group, shared_group_with_dev_access])
+ end
+ end
+ end
+
+ context 'when skip group option is on' do
+ let(:params) { { skip_groups: [project_group.id] } }
+
+ it 'excludes provided groups' do
+ is_expected.to match_array([root_group])
+ end
+ end
+ end
+
+ context 'Public project' do
+ it_behaves_like 'finding related groups' do
+ let(:project) { public_project }
+
+ context 'when user is not authorized' do
+ let(:current_user) { nil }
+
+ it 'returns ancestor groups for this project' do
+ is_expected.to match_array([project_group, root_group])
+ end
+ end
+ end
+ end
+
+ context 'Private project' do
+ it_behaves_like 'finding related groups' do
+ let(:project) { private_project }
+
+ before do
+ project.add_developer(user)
+ end
+
+ context 'when user is not authorized' do
+ let(:current_user) { nil }
+
+ it { is_expected.to eq([]) }
+ end
+ end
+ end
+
+ context 'Missing project' do
+ let(:project) { nil }
+
+ it { is_expected.to eq([]) }
+ end
+ end
+end
diff --git a/spec/finders/repositories/changelog_commits_finder_spec.rb b/spec/finders/repositories/changelog_commits_finder_spec.rb
new file mode 100644
index 00000000000..8665d36144a
--- /dev/null
+++ b/spec/finders/repositories/changelog_commits_finder_spec.rb
@@ -0,0 +1,93 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Repositories::ChangelogCommitsFinder do
+ let_it_be(:project) { create(:project, :repository) }
+
+ describe '#each_page' do
+ it 'only yields commits with the given trailer' do
+ finder = described_class.new(
+ project: project,
+ from: '570e7b2abdd848b95f2f578043fc23bd6f6fd24d',
+ to: 'c7fbe50c7c7419d9701eebe64b1fdacc3df5b9dd'
+ )
+
+ commits = finder.each_page('Signed-off-by').to_a.flatten
+
+ expect(commits.length).to eq(1)
+ expect(commits.first.id).to eq('5937ac0a7beb003549fc5fd26fc247adbce4a52e')
+ expect(commits.first.trailers).to eq(
+ 'Signed-off-by' => 'Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>'
+ )
+ end
+
+ it 'ignores commits that are reverted' do
+ # This range of commits is found on the branch
+ # https://gitlab.com/gitlab-org/gitlab-test/-/commits/trailers.
+ finder = described_class.new(
+ project: project,
+ from: 'ddd0f15ae83993f5cb66a927a28673882e99100b',
+ to: '694e6c2f08cad00d183682d9dede99615998a630'
+ )
+
+ commits = finder.each_page('Changelog').to_a.flatten
+
+ expect(commits).to be_empty
+ end
+
+ it 'includes revert commits if they have a trailer' do
+ finder = described_class.new(
+ project: project,
+ from: 'ddd0f15ae83993f5cb66a927a28673882e99100b',
+ to: 'f0a5ed60d24c98ec6d00ac010c1f3f01ee0a8373'
+ )
+
+ initial_commit = project.commit('ed2e92bf50b3da2c7cbbab053f4977a4ecbd109a')
+ revert_commit = project.commit('f0a5ed60d24c98ec6d00ac010c1f3f01ee0a8373')
+
+ commits = finder.each_page('Changelog').to_a.flatten
+
+ expect(commits).to eq([revert_commit, initial_commit])
+ end
+
+ it 'supports paginating of commits' do
+ finder = described_class.new(
+ project: project,
+ from: 'c1acaa58bbcbc3eafe538cb8274ba387047b69f8',
+ to: '5937ac0a7beb003549fc5fd26fc247adbce4a52e',
+ per_page: 1
+ )
+
+ commits = finder.each_page('Signed-off-by')
+
+ expect(commits.count).to eq(4)
+ end
+ end
+
+ describe '#revert_commit_sha' do
+ let(:finder) { described_class.new(project: project, from: 'a', to: 'b') }
+
+ it 'returns the SHA of a reverted commit' do
+ commit = double(
+ :commit,
+ description: 'This reverts commit 152c03af1b09f50fa4b567501032b106a3a81ff3.'
+ )
+
+ expect(finder.send(:revert_commit_sha, commit))
+ .to eq('152c03af1b09f50fa4b567501032b106a3a81ff3')
+ end
+
+ it 'returns nil when the commit is not a revert commit' do
+ commit = double(:commit, description: 'foo')
+
+ expect(finder.send(:revert_commit_sha, commit)).to be_nil
+ end
+
+ it 'returns nil when the commit has no description' do
+ commit = double(:commit, description: nil)
+
+ expect(finder.send(:revert_commit_sha, commit)).to be_nil
+ end
+ end
+end
diff --git a/spec/finders/repositories/commits_with_trailer_finder_spec.rb b/spec/finders/repositories/commits_with_trailer_finder_spec.rb
deleted file mode 100644
index 0c457aae340..00000000000
--- a/spec/finders/repositories/commits_with_trailer_finder_spec.rb
+++ /dev/null
@@ -1,38 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Repositories::CommitsWithTrailerFinder do
- let(:project) { create(:project, :repository) }
-
- describe '#each_page' do
- it 'only yields commits with the given trailer' do
- finder = described_class.new(
- project: project,
- from: '570e7b2abdd848b95f2f578043fc23bd6f6fd24d',
- to: 'c7fbe50c7c7419d9701eebe64b1fdacc3df5b9dd'
- )
-
- commits = finder.each_page('Signed-off-by').to_a.flatten
-
- expect(commits.length).to eq(1)
- expect(commits.first.id).to eq('5937ac0a7beb003549fc5fd26fc247adbce4a52e')
- expect(commits.first.trailers).to eq(
- 'Signed-off-by' => 'Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>'
- )
- end
-
- it 'supports paginating of commits' do
- finder = described_class.new(
- project: project,
- from: 'c1acaa58bbcbc3eafe538cb8274ba387047b69f8',
- to: '5937ac0a7beb003549fc5fd26fc247adbce4a52e',
- per_page: 1
- )
-
- commits = finder.each_page('Signed-off-by')
-
- expect(commits.count).to eq(4)
- end
- end
-end
diff --git a/spec/finders/repositories/previous_tag_finder_spec.rb b/spec/finders/repositories/previous_tag_finder_spec.rb
index 7cc33d11baf..b332dd158d1 100644
--- a/spec/finders/repositories/previous_tag_finder_spec.rb
+++ b/spec/finders/repositories/previous_tag_finder_spec.rb
@@ -12,16 +12,20 @@ RSpec.describe Repositories::PreviousTagFinder do
tag1 = double(:tag1, name: 'v1.0.0')
tag2 = double(:tag2, name: 'v1.1.0')
tag3 = double(:tag3, name: 'v2.0.0')
- tag4 = double(:tag4, name: '1.0.0')
+ tag4 = double(:tag4, name: '0.9.0')
+ tag5 = double(:tag5, name: 'v0.8.0-pre1')
+ tag6 = double(:tag6, name: 'v0.7.0')
allow(project.repository)
.to receive(:tags)
- .and_return([tag1, tag3, tag2, tag4])
+ .and_return([tag1, tag3, tag2, tag4, tag5, tag6])
expect(finder.execute('2.1.0')).to eq(tag3)
expect(finder.execute('2.0.0')).to eq(tag2)
expect(finder.execute('1.5.0')).to eq(tag2)
expect(finder.execute('1.0.1')).to eq(tag1)
+ expect(finder.execute('1.0.0')).to eq(tag4)
+ expect(finder.execute('0.9.0')).to eq(tag6)
end
end
diff --git a/spec/finders/security/license_compliance_jobs_finder_spec.rb b/spec/finders/security/license_compliance_jobs_finder_spec.rb
index 3066912df12..de4a7eb2c12 100644
--- a/spec/finders/security/license_compliance_jobs_finder_spec.rb
+++ b/spec/finders/security/license_compliance_jobs_finder_spec.rb
@@ -15,10 +15,9 @@ RSpec.describe Security::LicenseComplianceJobsFinder do
let!(:container_scanning_build) { create(:ci_build, :container_scanning, pipeline: pipeline) }
let!(:dast_build) { create(:ci_build, :dast, pipeline: pipeline) }
let!(:license_scanning_build) { create(:ci_build, :license_scanning, pipeline: pipeline) }
- let!(:license_management_build) { create(:ci_build, :license_management, pipeline: pipeline) }
- it 'returns only the license_scanning jobs' do
- is_expected.to contain_exactly(license_scanning_build, license_management_build)
+ it 'returns only the license_scanning job' do
+ is_expected.to contain_exactly(license_scanning_build)
end
end
end
diff --git a/spec/finders/users_finder_spec.rb b/spec/finders/users_finder_spec.rb
index d9cc71106d5..b0f8b803141 100644
--- a/spec/finders/users_finder_spec.rb
+++ b/spec/finders/users_finder_spec.rb
@@ -12,7 +12,7 @@ RSpec.describe UsersFinder do
it 'returns all users' do
users = described_class.new(user).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, blocked_user, external_user, omniauth_user, internal_user, admin_user)
end
it 'filters by username' do
@@ -48,12 +48,18 @@ RSpec.describe UsersFinder do
it 'filters by active users' do
users = described_class.new(user, active: true).execute
- expect(users).to contain_exactly(user, normal_user, omniauth_user, admin_user)
+ expect(users).to contain_exactly(user, normal_user, external_user, omniauth_user, admin_user)
end
- it 'returns no external users' do
+ it 'filters by external users' do
users = described_class.new(user, external: true).execute
+ expect(users).to contain_exactly(external_user)
+ end
+
+ 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)
end
@@ -71,7 +77,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, blocked_user, omniauth_user, admin_user)
+ expect(users).to contain_exactly(user, normal_user, external_user, blocked_user, omniauth_user, admin_user)
end
it 'does not filter by custom attributes' do
@@ -80,18 +86,18 @@ RSpec.describe UsersFinder do
custom_attributes: { foo: 'bar' }
).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, blocked_user, external_user, omniauth_user, internal_user, admin_user)
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, omniauth_user, internal_user, user])
+ expect(users).to eq([normal_user, admin_user, blocked_user, external_user, omniauth_user, internal_user, 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, admin_user, blocked_user, omniauth_user, internal_user)
+ expect(users).to contain_exactly(user, normal_user, external_user, admin_user, blocked_user, omniauth_user, internal_user)
end
end
diff --git a/spec/fixtures/api/schemas/entities/test_suite_comparer.json b/spec/fixtures/api/schemas/entities/test_suite_comparer.json
index ecb331ae013..ac001ef8843 100644
--- a/spec/fixtures/api/schemas/entities/test_suite_comparer.json
+++ b/spec/fixtures/api/schemas/entities/test_suite_comparer.json
@@ -26,7 +26,14 @@
"existing_failures": { "type": "array", "items": { "$ref": "test_case.json" } },
"new_errors": { "type": "array", "items": { "$ref": "test_case.json" } },
"resolved_errors": { "type": "array", "items": { "$ref": "test_case.json" } },
- "existing_errors": { "type": "array", "items": { "$ref": "test_case.json" } }
+ "existing_errors": { "type": "array", "items": { "$ref": "test_case.json" } },
+ "suite_errors": {
+ "type": ["object", "null"],
+ "properties": {
+ "head": { "type": ["string", "null"] },
+ "base": { "type": ["string", "null"] }
+ }
+ }
},
"additionalProperties": false
}
diff --git a/spec/fixtures/api/schemas/public_api/v4/packages/composer/index.json b/spec/fixtures/api/schemas/public_api/v4/packages/composer/index.json
index 2245b39cabe..81a222b922d 100644
--- a/spec/fixtures/api/schemas/public_api/v4/packages/composer/index.json
+++ b/spec/fixtures/api/schemas/public_api/v4/packages/composer/index.json
@@ -1,6 +1,6 @@
{
"type": "object",
- "required": ["packages", "provider-includes", "providers-url"],
+ "required": ["packages", "provider-includes", "providers-url", "metadata-url"],
"properties": {
"packages": {
"type": "array",
@@ -9,6 +9,9 @@
"providers-url": {
"type": "string"
},
+ "metadata-url": {
+ "type": "string"
+ },
"provider-includes": {
"type": "object",
"required": ["p/%hash%.json"],
diff --git a/spec/fixtures/dependency_proxy/manifest b/spec/fixtures/dependency_proxy/manifest
index a899d05d697..ed543883d60 100644
--- a/spec/fixtures/dependency_proxy/manifest
+++ b/spec/fixtures/dependency_proxy/manifest
@@ -1,38 +1,16 @@
{
- "schemaVersion": 1,
- "name": "library/alpine",
- "tag": "latest",
- "architecture": "amd64",
- "fsLayers": [
+ "schemaVersion": 2,
+ "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
+ "config": {
+ "mediaType": "application/vnd.docker.container.image.v1+json",
+ "size": 1472,
+ "digest": "sha256:7731472c3f2a25edbb9c085c78f42ec71259f2b83485aa60648276d408865839"
+ },
+ "layers": [
{
- "blobSum": "sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4"
- },
- {
- "blobSum": "sha256:188c0c94c7c576fff0792aca7ec73d67a2f7f4cb3a6e53a84559337260b36964"
- }
- ],
- "history": [
- {
- "v1Compatibility": "{\"architecture\":\"amd64\",\"config\":{\"Hostname\":\"\",\"Domainname\":\"\",\"User\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":[\"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\"],\"Cmd\":[\"/bin/sh\"],\"ArgsEscaped\":true,\"Image\":\"sha256:3543079adc6fb5170279692361be8b24e89ef1809a374c1b4429e1d560d1459c\",\"Volumes\":null,\"WorkingDir\":\"\",\"Entrypoint\":null,\"OnBuild\":null,\"Labels\":null},\"container\":\"8c59eb170e19b8c3768b8d06c91053b0debf4a6fa6a452df394145fe9b885ea5\",\"container_config\":{\"Hostname\":\"8c59eb170e19\",\"Domainname\":\"\",\"User\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":[\"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\"],\"Cmd\":[\"/bin/sh\",\"-c\",\"#(nop) \",\"CMD [\\\"/bin/sh\\\"]\"],\"ArgsEscaped\":true,\"Image\":\"sha256:3543079adc6fb5170279692361be8b24e89ef1809a374c1b4429e1d560d1459c\",\"Volumes\":null,\"WorkingDir\":\"\",\"Entrypoint\":null,\"OnBuild\":null,\"Labels\":{}},\"created\":\"2020-10-22T02:19:24.499382102Z\",\"docker_version\":\"18.09.7\",\"id\":\"c5f1aab5bb88eaf1aa62bea08ea6654547d43fd4d15b1a476c77e705dd5385ba\",\"os\":\"linux\",\"parent\":\"dc0b50cc52bc340d7848a62cfe8a756f4420592f4984f7a680ef8f9d258176ed\",\"throwaway\":true}"
- },
- {
- "v1Compatibility": "{\"id\":\"dc0b50cc52bc340d7848a62cfe8a756f4420592f4984f7a680ef8f9d258176ed\",\"created\":\"2020-10-22T02:19:24.33416307Z\",\"container_config\":{\"Cmd\":[\"/bin/sh -c #(nop) ADD file:f17f65714f703db9012f00e5ec98d0b2541ff6147c2633f7ab9ba659d0c507f4 in / \"]}}"
- }
- ],
- "signatures": [
- {
- "header": {
- "jwk": {
- "crv": "P-256",
- "kid": "XOTE:DZ4C:YBPJ:3O3L:YI4B:NYXU:T4VR:USH6:CXXN:SELU:CSCC:FVPE",
- "kty": "EC",
- "x": "cR1zye_3354mdbD7Dn-mtXNXvtPtmLlUVDa5vH6Lp74",
- "y": "rldUXSllLit6_2BW6AV8aqkwWJXHoYPG9OwkIBouwxQ"
- },
- "alg": "ES256"
- },
- "signature": "DYB2iB-XKIisqp5Q0OXFOBIOlBOuRV7pnZuKy0cxVB2Qj1VFRhWX4Tq336y0VMWbF6ma1he5A1E_Vk4jazrJ9g",
- "protected": "eyJmb3JtYXRMZW5ndGgiOjIxMzcsImZvcm1hdFRhaWwiOiJDbjAiLCJ0aW1lIjoiMjAyMC0xMS0yNFQyMjowMTo1MVoifQ"
+ "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
+ "size": 2810825,
+ "digest": "sha256:596ba82af5aaa3e2fd9d6f955b8b94f0744a2b60710e3c243ba3e4a467f051d1"
}
]
} \ No newline at end of file
diff --git a/spec/fixtures/lib/gitlab/import_export/complex/project.json b/spec/fixtures/lib/gitlab/import_export/complex/project.json
index 637e01bf123..9b8bc9d304e 100644
--- a/spec/fixtures/lib/gitlab/import_export/complex/project.json
+++ b/spec/fixtures/lib/gitlab/import_export/complex/project.json
@@ -7032,7 +7032,8 @@
"created_at": "2016-08-30T07:32:52.490Z",
"updated_at": "2016-08-30T07:32:52.490Z"
}
- ]
+ ],
+ "allow_force_push":false
}
],
"protected_environments": [
diff --git a/spec/fixtures/security_reports/master/gl-sast-report.json b/spec/fixtures/security_reports/master/gl-sast-report.json
index 98bb15e349f..ab610945508 100644
--- a/spec/fixtures/security_reports/master/gl-sast-report.json
+++ b/spec/fixtures/security_reports/master/gl-sast-report.json
@@ -28,7 +28,21 @@
"file": "python/hardcoded/hardcoded-tmp.py",
"line": 1,
"url": "https://docs.openstack.org/bandit/latest/plugins/b108_hardcoded_tmp_directory.html",
- "tool": "bandit"
+ "tool": "bandit",
+ "tracking": {
+ "type": "source",
+ "items": [
+ {
+ "file": "python/hardcoded/hardcoded-tmp.py",
+ "start_line": 1,
+ "end_line": 1,
+ "fingerprints": [
+ { "algorithm": "hash", "value": "HASHVALUE" },
+ { "algorithm": "scope_offset", "value": "python/hardcoded/hardcoded-tmp.py:ClassA:method_b:2" }
+ ]
+ }
+ ]
+ }
},
{
"category": "sast",
diff --git a/spec/frontend/.eslintrc.yml b/spec/frontend/.eslintrc.yml
index d0e585e844a..145e6c8961a 100644
--- a/spec/frontend/.eslintrc.yml
+++ b/spec/frontend/.eslintrc.yml
@@ -14,7 +14,6 @@ settings:
globals:
getJSONFixture: false
loadFixtures: false
- preloadFixtures: false
setFixtures: false
rules:
jest/expect-expect:
diff --git a/spec/frontend/__helpers__/fake_date/fixtures.js b/spec/frontend/__helpers__/fake_date/fixtures.js
new file mode 100644
index 00000000000..fcf9d4a9c64
--- /dev/null
+++ b/spec/frontend/__helpers__/fake_date/fixtures.js
@@ -0,0 +1,4 @@
+import { useFakeDate } from './jest';
+
+// Also see spec/support/helpers/javascript_fixtures_helpers.rb
+export const useFixturesFakeDate = () => useFakeDate(2015, 6, 3, 10);
diff --git a/spec/frontend/__helpers__/fake_date/index.js b/spec/frontend/__helpers__/fake_date/index.js
index 3d1b124ce79..9d00349bd26 100644
--- a/spec/frontend/__helpers__/fake_date/index.js
+++ b/spec/frontend/__helpers__/fake_date/index.js
@@ -1,2 +1,3 @@
export * from './fake_date';
export * from './jest';
+export * from './fixtures';
diff --git a/spec/frontend/__helpers__/vue_test_utils_helper.js b/spec/frontend/__helpers__/vue_test_utils_helper.js
index ffccfb249c2..d6132ef84ac 100644
--- a/spec/frontend/__helpers__/vue_test_utils_helper.js
+++ b/spec/frontend/__helpers__/vue_test_utils_helper.js
@@ -45,9 +45,16 @@ export const extendedWrapper = (wrapper) => {
return wrapper;
}
- return Object.defineProperty(wrapper, 'findByTestId', {
- value(id) {
- return this.find(`[data-testid="${id}"]`);
+ return Object.defineProperties(wrapper, {
+ findByTestId: {
+ value(id) {
+ return this.find(`[data-testid="${id}"]`);
+ },
+ },
+ findAllByTestId: {
+ value(id) {
+ return this.findAll(`[data-testid="${id}"]`);
+ },
},
});
};
diff --git a/spec/frontend/__helpers__/vue_test_utils_helper_spec.js b/spec/frontend/__helpers__/vue_test_utils_helper_spec.js
index 31c4ccd5dbb..d4f8e36c169 100644
--- a/spec/frontend/__helpers__/vue_test_utils_helper_spec.js
+++ b/spec/frontend/__helpers__/vue_test_utils_helper_spec.js
@@ -88,5 +88,22 @@ describe('Vue test utils helpers', () => {
expect(mockComponent.findByTestId(testId).exists()).toBe(true);
});
});
+
+ describe('findAllByTestId', () => {
+ const testId = 'a-component';
+ let mockComponent;
+
+ beforeEach(() => {
+ mockComponent = extendedWrapper(
+ shallowMount({
+ template: `<div><div data-testid="${testId}"></div><div data-testid="${testId}"></div></div>`,
+ }),
+ );
+ });
+
+ it('should find all components by test id', () => {
+ expect(mockComponent.findAllByTestId(testId)).toHaveLength(2);
+ });
+ });
});
});
diff --git a/spec/frontend/__mocks__/@gitlab/ui.js b/spec/frontend/__mocks__/@gitlab/ui.js
index ecd67247362..4c491a87fcb 100644
--- a/spec/frontend/__mocks__/@gitlab/ui.js
+++ b/spec/frontend/__mocks__/@gitlab/ui.js
@@ -39,7 +39,10 @@ jest.mock('@gitlab/ui/dist/components/base/popover/popover.js', () => ({
default: () => [],
},
...Object.fromEntries(
- ['target', 'triggers', 'placement', 'boundary', 'container'].map((prop) => [prop, {}]),
+ ['title', 'target', 'triggers', 'placement', 'boundary', 'container'].map((prop) => [
+ prop,
+ {},
+ ]),
),
},
render(h) {
diff --git a/spec/frontend/access_tokens/components/projects_field_spec.js b/spec/frontend/access_tokens/components/projects_field_spec.js
new file mode 100644
index 00000000000..a9e0799d114
--- /dev/null
+++ b/spec/frontend/access_tokens/components/projects_field_spec.js
@@ -0,0 +1,131 @@
+import { within, fireEvent } from '@testing-library/dom';
+import { mount } from '@vue/test-utils';
+import ProjectsField from '~/access_tokens/components/projects_field.vue';
+import ProjectsTokenSelector from '~/access_tokens/components/projects_token_selector.vue';
+
+describe('ProjectsField', () => {
+ let wrapper;
+
+ const createComponent = ({ inputAttrsValue = '' } = {}) => {
+ wrapper = mount(ProjectsField, {
+ propsData: {
+ inputAttrs: {
+ id: 'projects',
+ name: 'projects',
+ value: inputAttrsValue,
+ },
+ },
+ });
+ };
+
+ const queryByLabelText = (text) => within(wrapper.element).queryByLabelText(text);
+ const queryByText = (text) => within(wrapper.element).queryByText(text);
+ const findAllProjectsRadio = () => queryByLabelText('All projects');
+ const findSelectedProjectsRadio = () => queryByLabelText('Selected projects');
+ const findProjectsTokenSelector = () => wrapper.findComponent(ProjectsTokenSelector);
+ const findHiddenInput = () => wrapper.find('input[type="hidden"]');
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ });
+
+ it('renders label and sub-label', () => {
+ createComponent();
+
+ expect(queryByText('Projects')).not.toBe(null);
+ expect(queryByText('Set access permissions for this token.')).not.toBe(null);
+ });
+
+ describe('when `inputAttrs.value` is empty', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('renders "All projects" radio as checked', () => {
+ expect(findAllProjectsRadio().checked).toBe(true);
+ });
+
+ it('renders "Selected projects" radio as unchecked', () => {
+ expect(findSelectedProjectsRadio().checked).toBe(false);
+ });
+
+ it('sets `projects-token-selector` `initialProjectIds` prop to an empty array', () => {
+ expect(findProjectsTokenSelector().props('initialProjectIds')).toEqual([]);
+ });
+ });
+
+ describe('when `inputAttrs.value` is a comma separated list of project IDs', () => {
+ beforeEach(() => {
+ createComponent({ inputAttrsValue: '1,2' });
+ });
+
+ it('renders "All projects" radio as unchecked', () => {
+ expect(findAllProjectsRadio().checked).toBe(false);
+ });
+
+ it('renders "Selected projects" radio as checked', () => {
+ expect(findSelectedProjectsRadio().checked).toBe(true);
+ });
+
+ it('sets `projects-token-selector` `initialProjectIds` prop to an array of project IDs', () => {
+ expect(findProjectsTokenSelector().props('initialProjectIds')).toEqual(['1', '2']);
+ });
+ });
+
+ it('renders `projects-token-selector` component', () => {
+ createComponent();
+
+ expect(findProjectsTokenSelector().exists()).toBe(true);
+ });
+
+ it('renders hidden input with correct `name` and `id` attributes', () => {
+ createComponent();
+
+ expect(findHiddenInput().attributes()).toEqual(
+ expect.objectContaining({
+ id: 'projects',
+ name: 'projects',
+ }),
+ );
+ });
+
+ describe('when `projects-token-selector` is focused', () => {
+ beforeEach(() => {
+ createComponent();
+
+ findProjectsTokenSelector().vm.$emit('focus');
+ });
+
+ it('auto selects the "Selected projects" radio', () => {
+ expect(findSelectedProjectsRadio().checked).toBe(true);
+ });
+
+ describe('when `projects-token-selector` is changed', () => {
+ beforeEach(() => {
+ findProjectsTokenSelector().vm.$emit('input', [
+ {
+ id: 1,
+ },
+ {
+ id: 2,
+ },
+ ]);
+ });
+
+ it('updates the hidden input value to a comma separated list of project IDs', () => {
+ expect(findHiddenInput().attributes('value')).toBe('1,2');
+ });
+
+ describe('when radio is changed back to "All projects"', () => {
+ beforeEach(() => {
+ fireEvent.click(findAllProjectsRadio());
+ });
+
+ it('removes the hidden input value', () => {
+ expect(findHiddenInput().attributes('value')).toBe('');
+ });
+ });
+ });
+ });
+});
diff --git a/spec/frontend/access_tokens/components/projects_token_selector_spec.js b/spec/frontend/access_tokens/components/projects_token_selector_spec.js
new file mode 100644
index 00000000000..09f52fe9a5f
--- /dev/null
+++ b/spec/frontend/access_tokens/components/projects_token_selector_spec.js
@@ -0,0 +1,269 @@
+import {
+ GlAvatar,
+ GlAvatarLabeled,
+ GlIntersectionObserver,
+ GlToken,
+ GlTokenSelector,
+ GlLoadingIcon,
+} from '@gitlab/ui';
+import { mount } from '@vue/test-utils';
+import produce from 'immer';
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+
+import { getJSONFixture } from 'helpers/fixtures';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import { extendedWrapper } from 'helpers/vue_test_utils_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import ProjectsTokenSelector from '~/access_tokens/components/projects_token_selector.vue';
+import getProjectsQuery from '~/access_tokens/graphql/queries/get_projects.query.graphql';
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
+
+describe('ProjectsTokenSelector', () => {
+ const getProjectsQueryResponse = getJSONFixture(
+ 'graphql/projects/access_tokens/get_projects.query.graphql.json',
+ );
+ const getProjectsQueryResponsePage2 = produce(
+ getProjectsQueryResponse,
+ (getProjectsQueryResponseDraft) => {
+ /* eslint-disable no-param-reassign */
+ getProjectsQueryResponseDraft.data.projects.pageInfo.hasNextPage = false;
+ getProjectsQueryResponseDraft.data.projects.pageInfo.endCursor = null;
+ getProjectsQueryResponseDraft.data.projects.nodes.splice(1, 1);
+ getProjectsQueryResponseDraft.data.projects.nodes[0].id = 'gid://gitlab/Project/100';
+ /* eslint-enable no-param-reassign */
+ },
+ );
+
+ const runDebounce = () => jest.runAllTimers();
+
+ const { pageInfo, nodes: projects } = getProjectsQueryResponse.data.projects;
+ const project1 = projects[0];
+ const project2 = projects[1];
+
+ let wrapper;
+
+ let resolveGetProjectsQuery;
+ let resolveGetInitialProjectsQuery;
+ const getProjectsQueryRequestHandler = jest.fn(
+ ({ ids }) =>
+ new Promise((resolve) => {
+ if (ids) {
+ resolveGetInitialProjectsQuery = resolve;
+ } else {
+ resolveGetProjectsQuery = resolve;
+ }
+ }),
+ );
+
+ const createComponent = ({
+ propsData = {},
+ apolloProvider = createMockApollo([[getProjectsQuery, getProjectsQueryRequestHandler]]),
+ resolveQueries = true,
+ } = {}) => {
+ Vue.use(VueApollo);
+
+ wrapper = extendedWrapper(
+ mount(ProjectsTokenSelector, {
+ apolloProvider,
+ propsData: {
+ selectedProjects: [],
+ initialProjectIds: [],
+ ...propsData,
+ },
+ stubs: ['gl-intersection-observer'],
+ }),
+ );
+
+ runDebounce();
+
+ if (resolveQueries) {
+ resolveGetProjectsQuery(getProjectsQueryResponse);
+
+ return waitForPromises();
+ }
+
+ return Promise.resolve();
+ };
+
+ const findTokenSelector = () => wrapper.findComponent(GlTokenSelector);
+ const findTokenSelectorInput = () => findTokenSelector().find('input[type="text"]');
+ const findIntersectionObserver = () => wrapper.findComponent(GlIntersectionObserver);
+
+ it('renders dropdown items with project avatars', async () => {
+ await createComponent();
+
+ wrapper.findAllComponents(GlAvatarLabeled).wrappers.forEach((avatarLabeledWrapper, index) => {
+ const project = projects[index];
+
+ expect(avatarLabeledWrapper.attributes()).toEqual(
+ expect.objectContaining({
+ 'entity-id': `${getIdFromGraphQLId(project.id)}`,
+ 'entity-name': project.name,
+ ...(project.avatarUrl && { src: project.avatarUrl }),
+ }),
+ );
+
+ expect(avatarLabeledWrapper.props()).toEqual(
+ expect.objectContaining({
+ label: project.name,
+ subLabel: project.nameWithNamespace,
+ }),
+ );
+ });
+ });
+
+ it('renders tokens with project avatars', () => {
+ createComponent({
+ propsData: {
+ selectedProjects: [{ ...project2, id: getIdFromGraphQLId(project2.id) }],
+ },
+ });
+
+ const token = wrapper.findComponent(GlToken);
+ const avatar = token.findComponent(GlAvatar);
+
+ expect(token.text()).toContain(project2.nameWithNamespace);
+ expect(avatar.attributes('src')).toBe(project2.avatarUrl);
+ expect(avatar.props()).toEqual(
+ expect.objectContaining({
+ entityId: getIdFromGraphQLId(project2.id),
+ entityName: project2.name,
+ }),
+ );
+ });
+
+ describe('when `enter` key is pressed', () => {
+ it('calls `preventDefault` so form is not submitted when user selects a project from the dropdown', () => {
+ createComponent();
+
+ const event = {
+ preventDefault: jest.fn(),
+ };
+
+ findTokenSelectorInput().trigger('keydown.enter', event);
+
+ expect(event.preventDefault).toHaveBeenCalled();
+ });
+ });
+
+ describe('when text input is typed in', () => {
+ const searchTerm = 'foo bar';
+
+ beforeEach(async () => {
+ await createComponent();
+
+ await findTokenSelectorInput().setValue(searchTerm);
+ runDebounce();
+ });
+
+ it('makes GraphQL request with `search` variable set', async () => {
+ expect(getProjectsQueryRequestHandler).toHaveBeenLastCalledWith({
+ search: searchTerm,
+ after: null,
+ first: 20,
+ ids: null,
+ });
+ });
+
+ it('sets loading state while waiting for GraphQL request to resolve', async () => {
+ expect(findTokenSelector().props('loading')).toBe(true);
+
+ resolveGetProjectsQuery(getProjectsQueryResponse);
+ await waitForPromises();
+
+ expect(findTokenSelector().props('loading')).toBe(false);
+ });
+ });
+
+ describe('when there is a next page of projects and user scrolls to the bottom of the dropdown', () => {
+ beforeEach(async () => {
+ await createComponent();
+
+ findIntersectionObserver().vm.$emit('appear');
+ });
+
+ it('makes GraphQL request with `after` variable set', async () => {
+ expect(getProjectsQueryRequestHandler).toHaveBeenLastCalledWith({
+ after: pageInfo.endCursor,
+ first: 20,
+ search: '',
+ ids: null,
+ });
+ });
+
+ it('displays loading icon while waiting for GraphQL request to resolve', async () => {
+ expect(wrapper.findComponent(GlLoadingIcon).exists()).toBe(true);
+
+ resolveGetProjectsQuery(getProjectsQueryResponsePage2);
+ await waitForPromises();
+
+ expect(wrapper.findComponent(GlLoadingIcon).exists()).toBe(false);
+ });
+ });
+
+ describe('when there is not a next page of projects', () => {
+ it('does not render `GlIntersectionObserver`', async () => {
+ createComponent({ resolveQueries: false });
+
+ resolveGetProjectsQuery(getProjectsQueryResponsePage2);
+ await waitForPromises();
+
+ expect(findIntersectionObserver().exists()).toBe(false);
+ });
+ });
+
+ describe('when `GlTokenSelector` emits `input` event', () => {
+ it('emits `input` event used by `v-model`', () => {
+ findTokenSelector().vm.$emit('input', project1);
+
+ expect(wrapper.emitted('input')[0]).toEqual([project1]);
+ });
+ });
+
+ describe('when `GlTokenSelector` emits `focus` event', () => {
+ it('emits `focus` event', () => {
+ const event = { fakeEvent: 'foo' };
+ findTokenSelector().vm.$emit('focus', event);
+
+ expect(wrapper.emitted('focus')[0]).toEqual([event]);
+ });
+ });
+
+ describe('when `initialProjectIds` is an empty array', () => {
+ it('does not request initial projects', async () => {
+ await createComponent();
+
+ expect(getProjectsQueryRequestHandler).toHaveBeenCalledTimes(1);
+ expect(getProjectsQueryRequestHandler).toHaveBeenCalledWith(
+ expect.objectContaining({
+ ids: null,
+ }),
+ );
+ });
+ });
+
+ describe('when `initialProjectIds` is an array of project IDs', () => {
+ it('requests those projects and emits `input` event with result', async () => {
+ await createComponent({
+ propsData: {
+ initialProjectIds: [getIdFromGraphQLId(project1.id), getIdFromGraphQLId(project2.id)],
+ },
+ });
+
+ resolveGetInitialProjectsQuery(getProjectsQueryResponse);
+ await waitForPromises();
+
+ expect(getProjectsQueryRequestHandler).toHaveBeenCalledWith({
+ after: '',
+ first: null,
+ search: '',
+ ids: [project1.id, project2.id],
+ });
+ expect(wrapper.emitted('input')[0][0]).toEqual([
+ { ...project1, id: getIdFromGraphQLId(project1.id) },
+ { ...project2, id: getIdFromGraphQLId(project2.id) },
+ ]);
+ });
+ });
+});
diff --git a/spec/frontend/access_tokens/index_spec.js b/spec/frontend/access_tokens/index_spec.js
new file mode 100644
index 00000000000..e3f17e21739
--- /dev/null
+++ b/spec/frontend/access_tokens/index_spec.js
@@ -0,0 +1,74 @@
+import { createWrapper } from '@vue/test-utils';
+import Vue from 'vue';
+
+import { initExpiresAtField, initProjectsField } from '~/access_tokens';
+import * as ExpiresAtField from '~/access_tokens/components/expires_at_field.vue';
+import * as ProjectsField from '~/access_tokens/components/projects_field.vue';
+
+describe('access tokens', () => {
+ const FakeComponent = Vue.component('FakeComponent', {
+ props: {
+ inputAttrs: {
+ type: Object,
+ required: true,
+ },
+ },
+ render: () => null,
+ });
+
+ beforeEach(() => {
+ window.gon = { features: { personalAccessTokensScopedToProjects: true } };
+ });
+
+ afterEach(() => {
+ document.body.innerHTML = '';
+ });
+
+ describe.each`
+ initFunction | mountSelector | expectedComponent
+ ${initExpiresAtField} | ${'js-access-tokens-expires-at'} | ${ExpiresAtField}
+ ${initProjectsField} | ${'js-access-tokens-projects'} | ${ProjectsField}
+ `('$initFunction', ({ initFunction, mountSelector, expectedComponent }) => {
+ describe('when mount element exists', () => {
+ beforeEach(() => {
+ const mountEl = document.createElement('div');
+ mountEl.classList.add(mountSelector);
+
+ const input = document.createElement('input');
+ input.setAttribute('name', 'foo-bar');
+ input.setAttribute('id', 'foo-bar');
+ input.setAttribute('placeholder', 'Foo bar');
+ input.setAttribute('value', '1,2');
+
+ mountEl.appendChild(input);
+
+ document.body.appendChild(mountEl);
+
+ // Mock component so we don't have to deal with mocking Apollo
+ // eslint-disable-next-line no-param-reassign
+ expectedComponent.default = FakeComponent;
+ });
+
+ it('mounts component and sets `inputAttrs` prop', async () => {
+ const vueInstance = await initFunction();
+
+ const wrapper = createWrapper(vueInstance);
+ const component = wrapper.findComponent(FakeComponent);
+
+ expect(component.exists()).toBe(true);
+ expect(component.props('inputAttrs')).toEqual({
+ name: 'foo-bar',
+ id: 'foo-bar',
+ value: '1,2',
+ placeholder: 'Foo bar',
+ });
+ });
+ });
+
+ describe('when mount element does not exist', () => {
+ it('returns `null`', () => {
+ expect(initFunction()).toBe(null);
+ });
+ });
+ });
+});
diff --git a/spec/frontend/admin/users/tabs_spec.js b/spec/frontend/admin/users/tabs_spec.js
new file mode 100644
index 00000000000..39ba8618486
--- /dev/null
+++ b/spec/frontend/admin/users/tabs_spec.js
@@ -0,0 +1,37 @@
+import initTabs from '~/admin/users/tabs';
+import Api from '~/api';
+
+jest.mock('~/api.js');
+jest.mock('~/lib/utils/common_utils');
+
+describe('tabs', () => {
+ beforeEach(() => {
+ setFixtures(`
+ <div>
+ <div class="js-users-tab-item">
+ <a href="#users" data-testid='users-tab'>Users</a>
+ </div>
+ <div class="js-users-tab-item">
+ <a href="#cohorts" data-testid='cohorts-tab'>Cohorts</a>
+ </div>
+ </div`);
+
+ initTabs();
+ });
+
+ afterEach(() => {});
+
+ describe('tracking', () => {
+ it('tracks event when cohorts tab is clicked', () => {
+ document.querySelector('[data-testid="cohorts-tab"]').click();
+
+ expect(Api.trackRedisHllUserEvent).toHaveBeenCalledWith('i_analytics_cohorts');
+ });
+
+ it('does not track an event when users tab is clicked', () => {
+ document.querySelector('[data-testid="users-tab"]').click();
+
+ expect(Api.trackRedisHllUserEvent).not.toHaveBeenCalled();
+ });
+ });
+});
diff --git a/spec/frontend/alert_management/components/alert_management_table_spec.js b/spec/frontend/alert_management/components/alert_management_table_spec.js
index cea665aa50d..dece3dfbe5f 100644
--- a/spec/frontend/alert_management/components/alert_management_table_spec.js
+++ b/spec/frontend/alert_management/components/alert_management_table_spec.js
@@ -2,6 +2,8 @@ import { GlTable, GlAlert, GlLoadingIcon, GlDropdown, GlIcon, GlAvatar } from '@
import { mount } from '@vue/test-utils';
import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';
+import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
+import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import mockAlerts from 'jest/vue_shared/alert_details/mocks/alerts.json';
import AlertManagementTable from '~/alert_management/components/alert_management_table.vue';
import { visitUrl } from '~/lib/utils/url_utility';
@@ -18,19 +20,18 @@ describe('AlertManagementTable', () => {
let wrapper;
let mock;
- const findAlertsTable = () => wrapper.find(GlTable);
+ const findAlertsTable = () => wrapper.findComponent(GlTable);
const findAlerts = () => wrapper.findAll('table tbody tr');
- const findAlert = () => wrapper.find(GlAlert);
- const findLoader = () => wrapper.find(GlLoadingIcon);
- const findStatusDropdown = () => wrapper.find(GlDropdown);
- const findDateFields = () => wrapper.findAll(TimeAgo);
- const findSearch = () => wrapper.find(FilteredSearchBar);
- const findSeverityColumnHeader = () =>
- wrapper.find('[data-testid="alert-management-severity-sort"]');
- const findFirstIDField = () => wrapper.findAll('[data-testid="idField"]').at(0);
- const findAssignees = () => wrapper.findAll('[data-testid="assigneesField"]');
- const findSeverityFields = () => wrapper.findAll('[data-testid="severityField"]');
- const findIssueFields = () => wrapper.findAll('[data-testid="issueField"]');
+ const findAlert = () => wrapper.findComponent(GlAlert);
+ const findLoader = () => wrapper.findComponent(GlLoadingIcon);
+ const findStatusDropdown = () => wrapper.findComponent(GlDropdown);
+ const findDateFields = () => wrapper.findAllComponents(TimeAgo);
+ const findSearch = () => wrapper.findComponent(FilteredSearchBar);
+ const findSeverityColumnHeader = () => wrapper.findByTestId('alert-management-severity-sort');
+ const findFirstIDField = () => wrapper.findAllByTestId('idField').at(0);
+ const findAssignees = () => wrapper.findAllByTestId('assigneesField');
+ const findSeverityFields = () => wrapper.findAllByTestId('severityField');
+ const findIssueFields = () => wrapper.findAllByTestId('issueField');
const alertsCount = {
open: 24,
triggered: 20,
@@ -40,29 +41,34 @@ describe('AlertManagementTable', () => {
};
function mountComponent({ provide = {}, data = {}, loading = false, stubs = {} } = {}) {
- wrapper = mount(AlertManagementTable, {
- provide: {
- ...defaultProvideValues,
- alertManagementEnabled: true,
- userCanEnableAlertManagement: true,
- ...provide,
- },
- data() {
- return data;
- },
- mocks: {
- $apollo: {
- mutate: jest.fn(),
- query: jest.fn(),
- queries: {
- alerts: {
- loading,
+ wrapper = extendedWrapper(
+ mount(AlertManagementTable, {
+ provide: {
+ ...defaultProvideValues,
+ alertManagementEnabled: true,
+ userCanEnableAlertManagement: true,
+ ...provide,
+ },
+ data() {
+ return data;
+ },
+ mocks: {
+ $apollo: {
+ mutate: jest.fn(),
+ query: jest.fn(),
+ queries: {
+ alerts: {
+ loading,
+ },
},
},
},
- },
- stubs,
- });
+ stubs,
+ directives: {
+ GlTooltip: createMockDirective(),
+ },
+ }),
+ );
}
beforeEach(() => {
@@ -72,7 +78,6 @@ describe('AlertManagementTable', () => {
afterEach(() => {
if (wrapper) {
wrapper.destroy();
- wrapper = null;
}
mock.restore();
});
@@ -241,9 +246,14 @@ describe('AlertManagementTable', () => {
expect(findIssueFields().at(0).text()).toBe('None');
});
- it('renders a link when one exists', () => {
- expect(findIssueFields().at(1).text()).toBe('#1');
- expect(findIssueFields().at(1).attributes('href')).toBe('/gitlab-org/gitlab/-/issues/1');
+ it('renders a link when one exists with the issue state and title tooltip', () => {
+ const issueField = findIssueFields().at(1);
+ const tooltip = getBinding(issueField.element, 'gl-tooltip');
+
+ expect(issueField.text()).toBe(`#1 (closed)`);
+ expect(issueField.attributes('href')).toBe('/gitlab-org/gitlab/-/issues/incident/1');
+ expect(issueField.attributes('title')).toBe('My test issue');
+ expect(tooltip).not.toBe(undefined);
});
});
diff --git a/spec/frontend/alerts_settings/components/__snapshots__/alerts_settings_form_spec.js.snap b/spec/frontend/alerts_settings/components/__snapshots__/alerts_settings_form_spec.js.snap
index eb2b82a0211..1f8429af7dd 100644
--- a/spec/frontend/alerts_settings/components/__snapshots__/alerts_settings_form_spec.js.snap
+++ b/spec/frontend/alerts_settings/components/__snapshots__/alerts_settings_form_spec.js.snap
@@ -4,125 +4,151 @@ exports[`AlertsSettingsForm with default values renders the initial template 1`]
<form
class="gl-mt-6"
>
- <h5
- class="gl-font-lg gl-my-5"
- >
- Add new integrations
- </h5>
-
<div
- class="form-group gl-form-group"
- id="integration-type"
- role="group"
+ class="tabs gl-tabs"
+ id="__BVID__6"
>
- <label
- class="d-block col-form-label"
- for="integration-type"
- id="integration-type__BV_label_"
- >
- 1. Select integration type
- </label>
+ <!---->
<div
- class="bv-no-focus-ring"
+ class=""
>
- <select
- class="gl-form-select mw-100 custom-select"
- id="__BVID__8"
+ <ul
+ class="nav gl-tabs-nav"
+ id="__BVID__6__BV_tab_controls_"
+ role="tablist"
>
- <option
- value=""
+ <!---->
+ <li
+ class="nav-item"
+ role="presentation"
>
- Select integration type
- </option>
- <option
- value="HTTP"
+ <a
+ aria-controls="__BVID__8"
+ aria-posinset="1"
+ aria-selected="true"
+ aria-setsize="3"
+ class="nav-link active gl-tab-nav-item gl-tab-nav-item-active gl-tab-nav-item-active-indigo"
+ href="#"
+ id="__BVID__8___BV_tab_button__"
+ role="tab"
+ target="_self"
+ >
+ Configure details
+ </a>
+ </li>
+ <li
+ class="nav-item"
+ role="presentation"
>
- HTTP Endpoint
- </option>
- <option
- value="PROMETHEUS"
+ <a
+ aria-controls="__BVID__19"
+ aria-disabled="true"
+ aria-posinset="2"
+ aria-selected="false"
+ aria-setsize="3"
+ class="nav-link disabled disabled gl-tab-nav-item"
+ href="#"
+ id="__BVID__19___BV_tab_button__"
+ role="tab"
+ tabindex="-1"
+ target="_self"
+ >
+ View credentials
+ </a>
+ </li>
+ <li
+ class="nav-item"
+ role="presentation"
>
- External Prometheus
- </option>
- </select>
-
- <!---->
- <!---->
- <!---->
- <!---->
+ <a
+ aria-controls="__BVID__41"
+ aria-disabled="true"
+ aria-posinset="3"
+ aria-selected="false"
+ aria-setsize="3"
+ class="nav-link disabled disabled gl-tab-nav-item"
+ href="#"
+ id="__BVID__41___BV_tab_button__"
+ role="tab"
+ tabindex="-1"
+ target="_self"
+ >
+ Send test alert
+ </a>
+ </li>
+ <!---->
+ </ul>
</div>
- </div>
-
- <transition-stub
- class="gl-mt-3"
- css="true"
- enteractiveclass="collapsing"
- enterclass=""
- entertoclass="collapse show"
- leaveactiveclass="collapsing"
- leaveclass="collapse show"
- leavetoclass="collapse"
- >
<div
- class="collapse"
- id="__BVID__10"
- style="display: none;"
+ class="tab-content gl-tab-content"
+ id="__BVID__6__BV_tab_container_"
>
- <div>
+ <transition-stub
+ css="true"
+ enteractiveclass=""
+ enterclass=""
+ entertoclass="show"
+ leaveactiveclass=""
+ leaveclass="show"
+ leavetoclass=""
+ mode="out-in"
+ name=""
+ >
<div
- class="form-group gl-form-group"
- id="name-integration"
- role="group"
+ aria-hidden="false"
+ aria-labelledby="__BVID__8___BV_tab_button__"
+ class="tab-pane active"
+ id="__BVID__8"
+ role="tabpanel"
+ style=""
>
- <label
- class="d-block col-form-label"
- for="name-integration"
- id="name-integration__BV_label_"
- >
- 2. Name integration
- </label>
<div
- class="bv-no-focus-ring"
+ class="form-group gl-form-group"
+ id="integration-type"
+ role="group"
>
- <input
- class="gl-form-input form-control"
- id="__BVID__15"
- placeholder="Enter integration name"
- type="text"
- />
- <!---->
- <!---->
- <!---->
+ <label
+ class="d-block col-form-label"
+ for="integration-type"
+ id="integration-type__BV_label_"
+ >
+ 1.Select integration type
+ </label>
+ <div
+ class="bv-no-focus-ring"
+ >
+ <select
+ class="gl-form-select gl-max-w-full custom-select"
+ id="__BVID__13"
+ >
+ <option
+ value=""
+ >
+ Select integration type
+ </option>
+ <option
+ value="HTTP"
+ >
+ HTTP Endpoint
+ </option>
+ <option
+ value="PROMETHEUS"
+ >
+ External Prometheus
+ </option>
+ </select>
+
+ <!---->
+ <!---->
+ <!---->
+ <!---->
+ </div>
</div>
- </div>
-
- <div
- class="form-group gl-form-group"
- id="integration-webhook"
- role="group"
- >
- <label
- class="d-block col-form-label"
- for="integration-webhook"
- id="integration-webhook__BV_label_"
- >
- 3. Set up webhook
- </label>
+
<div
- class="bv-no-focus-ring"
+ class="gl-mt-3"
>
- <span>
- Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the
- <a
- class="gl-link gl-display-inline-block"
- href="https://docs.gitlab.com/ee/operations/incident_management/alert_integrations.html"
- rel="noopener noreferrer"
- target="_blank"
- >
- GitLab documentation
- </a>
- to learn more about configuring your endpoint.
- </span>
+ <!---->
<label
class="gl-display-flex gl-flex-direction-column gl-mb-0 gl-w-max-content gl-my-4 gl-font-weight-normal"
@@ -166,241 +192,333 @@ exports[`AlertsSettingsForm with default values renders the initial template 1`]
<!---->
- <div
- class="gl-my-4"
+ <!---->
+ </div>
+
+ <div
+ class="gl-display-flex gl-justify-content-start gl-py-3"
+ >
+ <button
+ class="btn js-no-auto-disable btn-confirm btn-md gl-button"
+ data-testid="integration-form-submit"
+ type="submit"
>
+ <!---->
+
+ <!---->
+
<span
- class="gl-font-weight-bold"
+ class="gl-button-text"
>
- Webhook URL
-
+ Save integration
+
</span>
+ </button>
+
+ <button
+ class="btn gl-ml-3 js-no-auto-disable btn-default btn-md gl-button"
+ type="reset"
+ >
+ <!---->
+ <!---->
+
+ <span
+ class="gl-button-text"
+ >
+ Cancel and close
+ </span>
+ </button>
+ </div>
+ </div>
+ </transition-stub>
+
+ <transition-stub
+ css="true"
+ enteractiveclass=""
+ enterclass=""
+ entertoclass="show"
+ leaveactiveclass=""
+ leaveclass="show"
+ leavetoclass=""
+ mode="out-in"
+ name=""
+ >
+ <div
+ aria-hidden="true"
+ aria-labelledby="__BVID__19___BV_tab_button__"
+ class="tab-pane disabled"
+ id="__BVID__19"
+ role="tabpanel"
+ style="display: none;"
+ >
+ <span>
+ Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the
+ <a
+ class="gl-link gl-display-inline-block"
+ href="https://docs.gitlab.com/ee/operations/incident_management/alert_integrations.html"
+ rel="noopener noreferrer"
+ target="_blank"
+ >
+ GitLab documentation
+ </a>
+ to learn more about configuring your endpoint.
+ </span>
+
+ <fieldset
+ class="form-group gl-form-group"
+ id="integration-webhook"
+ >
+ <!---->
+ <div
+ class="bv-no-focus-ring"
+ role="group"
+ tabindex="-1"
+ >
<div
- id="url"
- readonly="readonly"
+ class="gl-my-4"
>
+ <span
+ class="gl-font-weight-bold"
+ >
+
+ Webhook URL
+
+ </span>
+
<div
- class="input-group"
- role="group"
+ id="url"
+ readonly="readonly"
>
- <!---->
- <!---->
-
- <input
- class="gl-form-input form-control"
- id="url"
- readonly="readonly"
- type="text"
- />
-
<div
- class="input-group-append"
+ class="input-group"
+ role="group"
>
- <button
- aria-label="Copy this value"
- class="btn gl-m-0! btn-default btn-md gl-button btn-default-secondary btn-icon"
- data-clipboard-text=""
- title="Copy"
- type="button"
+ <!---->
+ <!---->
+
+ <input
+ class="gl-form-input form-control"
+ id="url"
+ readonly="readonly"
+ type="text"
+ />
+
+ <div
+ class="input-group-append"
>
- <!---->
-
- <svg
- aria-hidden="true"
- class="gl-button-icon gl-icon s16"
- data-testid="copy-to-clipboard-icon"
+ <button
+ aria-label="Copy this value"
+ class="btn gl-m-0! btn-default btn-md gl-button btn-default-secondary btn-icon"
+ data-clipboard-text=""
+ title="Copy"
+ type="button"
>
- <use
- href="#copy-to-clipboard"
- />
- </svg>
-
- <!---->
- </button>
+ <!---->
+
+ <svg
+ aria-hidden="true"
+ class="gl-button-icon gl-icon s16"
+ data-testid="copy-to-clipboard-icon"
+ >
+ <use
+ href="#copy-to-clipboard"
+ />
+ </svg>
+
+ <!---->
+ </button>
+ </div>
+ <!---->
</div>
- <!---->
</div>
</div>
- </div>
-
- <div
- class="gl-my-4"
- >
- <span
- class="gl-font-weight-bold"
- >
-
- Authorization key
-
- </span>
<div
- class="gl-mb-3"
- id="authorization-key"
- readonly="readonly"
+ class="gl-my-4"
>
+ <span
+ class="gl-font-weight-bold"
+ >
+
+ Authorization key
+
+ </span>
+
<div
- class="input-group"
- role="group"
+ class="gl-mb-3"
+ id="authorization-key"
+ readonly="readonly"
>
- <!---->
- <!---->
-
- <input
- class="gl-form-input form-control"
- id="authorization-key"
- readonly="readonly"
- type="text"
- />
-
<div
- class="input-group-append"
+ class="input-group"
+ role="group"
>
- <button
- aria-label="Copy this value"
- class="btn gl-m-0! btn-default btn-md gl-button btn-default-secondary btn-icon"
- data-clipboard-text=""
- title="Copy"
- type="button"
+ <!---->
+ <!---->
+
+ <input
+ class="gl-form-input form-control"
+ id="authorization-key"
+ readonly="readonly"
+ type="text"
+ />
+
+ <div
+ class="input-group-append"
>
- <!---->
-
- <svg
- aria-hidden="true"
- class="gl-button-icon gl-icon s16"
- data-testid="copy-to-clipboard-icon"
+ <button
+ aria-label="Copy this value"
+ class="btn gl-m-0! btn-default btn-md gl-button btn-default-secondary btn-icon"
+ data-clipboard-text=""
+ title="Copy"
+ type="button"
>
- <use
- href="#copy-to-clipboard"
- />
- </svg>
-
- <!---->
- </button>
+ <!---->
+
+ <svg
+ aria-hidden="true"
+ class="gl-button-icon gl-icon s16"
+ data-testid="copy-to-clipboard-icon"
+ >
+ <use
+ href="#copy-to-clipboard"
+ />
+ </svg>
+
+ <!---->
+ </button>
+ </div>
+ <!---->
</div>
- <!---->
</div>
</div>
-
- <button
- class="btn btn-default btn-md disabled gl-button"
- disabled="disabled"
- type="button"
- >
- <!---->
-
- <!---->
-
- <span
- class="gl-button-text"
- >
-
- Reset Key
-
- </span>
- </button>
-
+ <!---->
+ <!---->
<!---->
</div>
- <!---->
- <!---->
- <!---->
- </div>
- </div>
-
- <div
- class="form-group gl-form-group"
- id="test-integration"
- role="group"
- >
- <label
- class="d-block col-form-label"
- for="test-integration"
- id="test-integration__BV_label_"
- >
- 4. Sample alert payload (optional)
- </label>
- <div
- class="bv-no-focus-ring"
+ </fieldset>
+
+ <button
+ class="btn btn-danger btn-md disabled gl-button"
+ disabled="disabled"
+ type="button"
>
- <span>
- Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to test the integration (optional).
- </span>
+ <!---->
- <textarea
- class="gl-form-input gl-form-textarea gl-my-3 form-control is-valid"
- disabled="disabled"
- id="test-payload"
- placeholder="{ \\"events\\": [{ \\"application\\": \\"Name of application\\" }] }"
- style="resize: none; overflow-y: scroll;"
- wrap="soft"
- />
<!---->
+
+ <span
+ class="gl-button-text"
+ >
+
+ Reset Key
+
+ </span>
+ </button>
+
+ <button
+ class="btn gl-ml-3 js-no-auto-disable btn-default btn-md gl-button"
+ type="reset"
+ >
<!---->
+
<!---->
- </div>
+
+ <span
+ class="gl-button-text"
+ >
+ Cancel and close
+ </span>
+ </button>
+
+ <!---->
</div>
-
- <!---->
-
- <!---->
- </div>
+ </transition-stub>
- <div
- class="gl-display-flex gl-justify-content-start gl-py-3"
+ <transition-stub
+ css="true"
+ enteractiveclass=""
+ enterclass=""
+ entertoclass="show"
+ leaveactiveclass=""
+ leaveclass="show"
+ leavetoclass=""
+ mode="out-in"
+ name=""
>
- <button
- class="btn js-no-auto-disable btn-success btn-md gl-button"
- data-testid="integration-form-submit"
- type="submit"
+ <div
+ aria-hidden="true"
+ aria-labelledby="__BVID__41___BV_tab_button__"
+ class="tab-pane disabled"
+ id="__BVID__41"
+ role="tabpanel"
+ style="display: none;"
>
- <!---->
-
- <!---->
-
- <span
- class="gl-button-text"
+ <fieldset
+ class="form-group gl-form-group"
+ id="test-integration"
>
- Save integration
-
- </span>
- </button>
-
- <button
- class="btn gl-mx-3 js-no-auto-disable btn-success btn-md disabled gl-button btn-success-secondary"
- data-testid="integration-test-and-submit"
- disabled="disabled"
- type="button"
- >
- <!---->
+ <!---->
+ <div
+ class="bv-no-focus-ring"
+ role="group"
+ tabindex="-1"
+ >
+ <span>
+ Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point.
+ </span>
+
+ <textarea
+ class="gl-form-input gl-form-textarea gl-my-3 form-control is-valid"
+ id="test-payload"
+ placeholder="{ \\"events\\": [{ \\"application\\": \\"Name of application\\" }] }"
+ style="resize: none; overflow-y: scroll;"
+ wrap="soft"
+ />
+ <!---->
+ <!---->
+ <!---->
+ </div>
+ </fieldset>
- <!---->
-
- <span
- class="gl-button-text"
+ <button
+ class="btn js-no-auto-disable btn-confirm btn-md gl-button"
+ data-testid="send-test-alert"
+ type="button"
>
- Save and test payload
- </span>
- </button>
-
- <button
- class="btn js-no-auto-disable btn-default btn-md gl-button"
- type="reset"
- >
- <!---->
+ <!---->
+
+ <!---->
+
+ <span
+ class="gl-button-text"
+ >
+
+ Send
+
+ </span>
+ </button>
- <!---->
-
- <span
- class="gl-button-text"
+ <button
+ class="btn gl-ml-3 js-no-auto-disable btn-default btn-md gl-button"
+ type="reset"
>
- Cancel
- </span>
- </button>
- </div>
+ <!---->
+
+ <!---->
+
+ <span
+ class="gl-button-text"
+ >
+ Cancel and close
+ </span>
+ </button>
+ </div>
+ </transition-stub>
+ <!---->
</div>
- </transition-stub>
+ </div>
</form>
`;
diff --git a/spec/frontend/alerts_settings/components/alert_mapping_builder_spec.js b/spec/frontend/alerts_settings/components/alert_mapping_builder_spec.js
index 7e1d1acb62c..dba9c8be669 100644
--- a/spec/frontend/alerts_settings/components/alert_mapping_builder_spec.js
+++ b/spec/frontend/alerts_settings/components/alert_mapping_builder_spec.js
@@ -1,10 +1,10 @@
import { GlIcon, GlFormInput, GlDropdown, GlSearchBoxByType, GlDropdownItem } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import AlertMappingBuilder, { i18n } from '~/alerts_settings/components/alert_mapping_builder.vue';
-import parsedMapping from '~/alerts_settings/components/mocks/parsedMapping.json';
import * as transformationUtils from '~/alerts_settings/utils/mapping_transformations';
import { capitalizeFirstCharacter } from '~/lib/utils/text_utility';
-import alertFields from '../mocks/alertFields.json';
+import alertFields from '../mocks/alert_fields.json';
+import parsedMapping from '../mocks/parsed_mapping.json';
describe('AlertMappingBuilder', () => {
let wrapper;
@@ -12,8 +12,8 @@ describe('AlertMappingBuilder', () => {
function mountComponent() {
wrapper = shallowMount(AlertMappingBuilder, {
propsData: {
- parsedPayload: parsedMapping.samplePayload.payloadAlerFields.nodes,
- savedMapping: parsedMapping.storedMapping.nodes,
+ parsedPayload: parsedMapping.payloadAlerFields,
+ savedMapping: parsedMapping.payloadAttributeMappings,
alertFields,
},
});
@@ -33,6 +33,15 @@ describe('AlertMappingBuilder', () => {
const findColumnInRow = (row, column) =>
wrapper.findAll('.gl-display-table-row').at(row).findAll('.gl-display-table-cell ').at(column);
+ const getDropdownContent = (dropdown, types) => {
+ const searchBox = dropdown.findComponent(GlSearchBoxByType);
+ const dropdownItems = dropdown.findAllComponents(GlDropdownItem);
+ const mappingOptions = parsedMapping.payloadAlerFields.filter(({ type }) =>
+ types.includes(type),
+ );
+ return { searchBox, dropdownItems, mappingOptions };
+ };
+
it('renders column captions', () => {
expect(findColumnInRow(0, 0).text()).toContain(i18n.columns.gitlabKeyTitle);
expect(findColumnInRow(0, 2).text()).toContain(i18n.columns.payloadKeyTitle);
@@ -63,10 +72,7 @@ describe('AlertMappingBuilder', () => {
it('renders mapping dropdown for each field', () => {
alertFields.forEach(({ types }, index) => {
const dropdown = findColumnInRow(index + 1, 2).find(GlDropdown);
- const searchBox = dropdown.findComponent(GlSearchBoxByType);
- const dropdownItems = dropdown.findAllComponents(GlDropdownItem);
- const { nodes } = parsedMapping.samplePayload.payloadAlerFields;
- const mappingOptions = nodes.filter(({ type }) => types.includes(type));
+ const { searchBox, dropdownItems, mappingOptions } = getDropdownContent(dropdown, types);
expect(dropdown.exists()).toBe(true);
expect(searchBox.exists()).toBe(true);
@@ -80,11 +86,7 @@ describe('AlertMappingBuilder', () => {
expect(dropdown.exists()).toBe(Boolean(numberOfFallbacks));
if (numberOfFallbacks) {
- const searchBox = dropdown.findComponent(GlSearchBoxByType);
- const dropdownItems = dropdown.findAllComponents(GlDropdownItem);
- const { nodes } = parsedMapping.samplePayload.payloadAlerFields;
- const mappingOptions = nodes.filter(({ type }) => types.includes(type));
-
+ const { searchBox, dropdownItems, mappingOptions } = getDropdownContent(dropdown, types);
expect(searchBox.exists()).toBe(Boolean(numberOfFallbacks));
expect(dropdownItems).toHaveLength(mappingOptions.length);
}
diff --git a/spec/frontend/alerts_settings/components/alerts_settings_form_spec.js b/spec/frontend/alerts_settings/components/alerts_settings_form_spec.js
index 02229b3d3da..d2dcff14432 100644
--- a/spec/frontend/alerts_settings/components/alerts_settings_form_spec.js
+++ b/spec/frontend/alerts_settings/components/alerts_settings_form_spec.js
@@ -1,29 +1,18 @@
-import {
- GlForm,
- GlFormSelect,
- GlCollapse,
- GlFormInput,
- GlToggle,
- GlFormTextarea,
-} from '@gitlab/ui';
+import { GlForm, GlFormSelect, GlFormInput, GlToggle, GlFormTextarea, GlTab } from '@gitlab/ui';
import { mount } from '@vue/test-utils';
import waitForPromises from 'helpers/wait_for_promises';
import MappingBuilder from '~/alerts_settings/components/alert_mapping_builder.vue';
import AlertsSettingsForm from '~/alerts_settings/components/alerts_settings_form.vue';
import { typeSet } from '~/alerts_settings/constants';
-import alertFields from '../mocks/alertFields.json';
+import alertFields from '../mocks/alert_fields.json';
+import parsedMapping from '../mocks/parsed_mapping.json';
import { defaultAlertSettingsConfig } from './util';
describe('AlertsSettingsForm', () => {
let wrapper;
const mockToastShow = jest.fn();
- const createComponent = ({
- data = {},
- props = {},
- multipleHttpIntegrationsCustomMapping = false,
- multiIntegrations = true,
- } = {}) => {
+ const createComponent = ({ data = {}, props = {}, multiIntegrations = true } = {}) => {
wrapper = mount(AlertsSettingsForm, {
data() {
return { ...data };
@@ -35,10 +24,12 @@ describe('AlertsSettingsForm', () => {
},
provide: {
...defaultAlertSettingsConfig,
- glFeatures: { multipleHttpIntegrationsCustomMapping },
multiIntegrations,
},
mocks: {
+ $apollo: {
+ query: jest.fn(),
+ },
$toast: {
show: mockToastShow,
},
@@ -46,20 +37,20 @@ describe('AlertsSettingsForm', () => {
});
};
- const findForm = () => wrapper.find(GlForm);
- const findSelect = () => wrapper.find(GlFormSelect);
- const findFormSteps = () => wrapper.find(GlCollapse);
- const findFormFields = () => wrapper.findAll(GlFormInput);
- const findFormToggle = () => wrapper.find(GlToggle);
- const findTestPayloadSection = () => wrapper.find(`[id = "test-integration"]`);
+ const findForm = () => wrapper.findComponent(GlForm);
+ const findSelect = () => wrapper.findComponent(GlFormSelect);
+ const findFormFields = () => wrapper.findAllComponents(GlFormInput);
+ const findFormToggle = () => wrapper.findComponent(GlToggle);
+ const findSamplePayloadSection = () => wrapper.find('[data-testid="sample-payload-section"]');
const findMappingBuilderSection = () => wrapper.find(`[id = "mapping-builder"]`);
const findMappingBuilder = () => wrapper.findComponent(MappingBuilder);
const findSubmitButton = () => wrapper.find(`[type = "submit"]`);
const findMultiSupportText = () =>
wrapper.find(`[data-testid="multi-integrations-not-supported"]`);
- const findJsonTestSubmit = () => wrapper.find(`[data-testid="integration-test-and-submit"]`);
+ const findJsonTestSubmit = () => wrapper.find(`[data-testid="send-test-alert"]`);
const findJsonTextArea = () => wrapper.find(`[id = "test-payload"]`);
const findActionBtn = () => wrapper.find(`[data-testid="payload-action-btn"]`);
+ const findTabs = () => wrapper.findAllComponents(GlTab);
afterEach(() => {
if (wrapper) {
@@ -91,7 +82,7 @@ describe('AlertsSettingsForm', () => {
expect(findForm().exists()).toBe(true);
expect(findSelect().exists()).toBe(true);
expect(findMultiSupportText().exists()).toBe(false);
- expect(findFormSteps().attributes('visible')).toBeUndefined();
+ expect(findFormFields()).toHaveLength(0);
});
it('shows the rest of the form when the dropdown is used', async () => {
@@ -106,37 +97,47 @@ describe('AlertsSettingsForm', () => {
expect(findMultiSupportText().exists()).toBe(true);
});
- it('disabled the name input when the selected value is prometheus', async () => {
+ it('hides the name input when the selected value is prometheus', async () => {
createComponent();
await selectOptionAtIndex(2);
-
- expect(findFormFields().at(0).attributes('disabled')).toBe('disabled');
+ expect(findFormFields().at(0).attributes('id')).not.toBe('name-integration');
});
- });
-
- describe('submitting integration form', () => {
- describe('HTTP', () => {
- it('create', async () => {
- createComponent();
- const integrationName = 'Test integration';
- await selectOptionAtIndex(1);
- enableIntegration(0, integrationName);
-
- const submitBtn = findSubmitButton();
- expect(submitBtn.exists()).toBe(true);
- expect(submitBtn.text()).toBe('Save integration');
+ describe('form tabs', () => {
+ it('renders 3 tabs', () => {
+ expect(findTabs()).toHaveLength(3);
+ });
- findForm().trigger('submit');
+ it('only first tab is enabled on integration create', () => {
+ createComponent({
+ data: {
+ currentIntegration: null,
+ },
+ });
+ const tabs = findTabs();
+ expect(tabs.at(0).find('[role="tabpanel"]').classes('disabled')).toBe(false);
+ expect(tabs.at(1).find('[role="tabpanel"]').classes('disabled')).toBe(true);
+ expect(tabs.at(2).find('[role="tabpanel"]').classes('disabled')).toBe(true);
+ });
- expect(wrapper.emitted('create-new-integration')[0]).toEqual([
- { type: typeSet.http, variables: { name: integrationName, active: true } },
- ]);
+ it('all tabs are enabled on integration edit', () => {
+ createComponent({
+ data: {
+ currentIntegration: { id: 1 },
+ },
+ });
+ const tabs = findTabs();
+ expect(tabs.at(0).find('[role="tabpanel"]').classes('disabled')).toBe(false);
+ expect(tabs.at(1).find('[role="tabpanel"]').classes('disabled')).toBe(false);
+ expect(tabs.at(2).find('[role="tabpanel"]').classes('disabled')).toBe(false);
});
+ });
+ });
+ describe('submitting integration form', () => {
+ describe('HTTP', () => {
it('create with custom mapping', async () => {
createComponent({
- multipleHttpIntegrationsCustomMapping: true,
multiIntegrations: true,
props: { alertFields },
});
@@ -146,7 +147,7 @@ describe('AlertsSettingsForm', () => {
enableIntegration(0, integrationName);
- const sampleMapping = { field: 'test' };
+ const sampleMapping = parsedMapping.payloadAttributeMappings;
findMappingBuilder().vm.$emit('onMappingUpdate', sampleMapping);
findForm().trigger('submit');
@@ -157,7 +158,7 @@ describe('AlertsSettingsForm', () => {
name: integrationName,
active: true,
payloadAttributeMappings: sampleMapping,
- payloadExample: null,
+ payloadExample: '{}',
},
},
]);
@@ -182,23 +183,28 @@ describe('AlertsSettingsForm', () => {
findForm().trigger('submit');
- expect(wrapper.emitted('update-integration')[0]).toEqual([
- { type: typeSet.http, variables: { name: updatedIntegrationName, active: true } },
- ]);
+ expect(wrapper.emitted('update-integration')[0]).toEqual(
+ expect.arrayContaining([
+ {
+ type: typeSet.http,
+ variables: {
+ name: updatedIntegrationName,
+ active: true,
+ payloadAttributeMappings: [],
+ payloadExample: '{}',
+ },
+ },
+ ]),
+ );
});
});
describe('PROMETHEUS', () => {
it('create', async () => {
createComponent();
-
await selectOptionAtIndex(2);
-
const apiUrl = 'https://test.com';
- enableIntegration(1, apiUrl);
-
- findFormToggle().trigger('click');
-
+ enableIntegration(0, apiUrl);
const submitBtn = findSubmitButton();
expect(submitBtn.exists()).toBe(true);
expect(submitBtn.text()).toBe('Save integration');
@@ -222,7 +228,7 @@ describe('AlertsSettingsForm', () => {
});
const apiUrl = 'https://test-post.com';
- enableIntegration(1, apiUrl);
+ enableIntegration(0, apiUrl);
const submitBtn = findSubmitButton();
expect(submitBtn.exists()).toBe(true);
@@ -260,7 +266,7 @@ describe('AlertsSettingsForm', () => {
const jsonTestSubmit = findJsonTestSubmit();
expect(jsonTestSubmit.exists()).toBe(true);
- expect(jsonTestSubmit.text()).toBe('Save and test payload');
+ expect(jsonTestSubmit.text()).toBe('Send');
expect(jsonTestSubmit.props('disabled')).toBe(true);
});
@@ -275,56 +281,73 @@ describe('AlertsSettingsForm', () => {
});
describe('Test payload section for HTTP integration', () => {
+ const validSamplePayload = JSON.stringify(alertFields);
+ const emptySamplePayload = '{}';
+
beforeEach(() => {
createComponent({
- multipleHttpIntegrationsCustomMapping: true,
- props: {
+ data: {
currentIntegration: {
type: typeSet.http,
+ payloadExample: validSamplePayload,
+ payloadAttributeMappings: [],
},
- alertFields,
+ active: false,
+ resetPayloadAndMappingConfirmed: false,
},
+ props: { alertFields },
});
});
describe.each`
- active | resetSamplePayloadConfirmed | disabled
- ${true} | ${true} | ${undefined}
- ${false} | ${true} | ${'disabled'}
- ${true} | ${false} | ${'disabled'}
- ${false} | ${false} | ${'disabled'}
- `('', ({ active, resetSamplePayloadConfirmed, disabled }) => {
- const payloadResetMsg = resetSamplePayloadConfirmed ? 'was confirmed' : 'was not confirmed';
+ active | resetPayloadAndMappingConfirmed | disabled
+ ${true} | ${true} | ${undefined}
+ ${false} | ${true} | ${'disabled'}
+ ${true} | ${false} | ${'disabled'}
+ ${false} | ${false} | ${'disabled'}
+ `('', ({ active, resetPayloadAndMappingConfirmed, disabled }) => {
+ const payloadResetMsg = resetPayloadAndMappingConfirmed
+ ? 'was confirmed'
+ : 'was not confirmed';
const enabledState = disabled === 'disabled' ? 'disabled' : 'enabled';
const activeState = active ? 'active' : 'not active';
it(`textarea should be ${enabledState} when payload reset ${payloadResetMsg} and current integration is ${activeState}`, async () => {
wrapper.setData({
- customMapping: { samplePayload: true },
+ selectedIntegration: typeSet.http,
active,
- resetSamplePayloadConfirmed,
+ resetPayloadAndMappingConfirmed,
});
await wrapper.vm.$nextTick();
- expect(findTestPayloadSection().find(GlFormTextarea).attributes('disabled')).toBe(disabled);
+ expect(findSamplePayloadSection().find(GlFormTextarea).attributes('disabled')).toBe(
+ disabled,
+ );
});
});
describe('action buttons for sample payload', () => {
describe.each`
- resetSamplePayloadConfirmed | samplePayload | caption
- ${false} | ${true} | ${'Edit payload'}
- ${true} | ${false} | ${'Submit payload'}
- ${true} | ${true} | ${'Submit payload'}
- ${false} | ${false} | ${'Submit payload'}
- `('', ({ resetSamplePayloadConfirmed, samplePayload, caption }) => {
- const samplePayloadMsg = samplePayload ? 'was provided' : 'was not provided';
- const payloadResetMsg = resetSamplePayloadConfirmed ? 'was confirmed' : 'was not confirmed';
+ resetPayloadAndMappingConfirmed | payloadExample | caption
+ ${false} | ${validSamplePayload} | ${'Edit payload'}
+ ${true} | ${emptySamplePayload} | ${'Parse payload for custom mapping'}
+ ${true} | ${validSamplePayload} | ${'Parse payload for custom mapping'}
+ ${false} | ${emptySamplePayload} | ${'Parse payload for custom mapping'}
+ `('', ({ resetPayloadAndMappingConfirmed, payloadExample, caption }) => {
+ const samplePayloadMsg = payloadExample ? 'was provided' : 'was not provided';
+ const payloadResetMsg = resetPayloadAndMappingConfirmed
+ ? 'was confirmed'
+ : 'was not confirmed';
it(`shows ${caption} button when sample payload ${samplePayloadMsg} and payload reset ${payloadResetMsg}`, async () => {
wrapper.setData({
selectedIntegration: typeSet.http,
- customMapping: { samplePayload },
- resetSamplePayloadConfirmed,
+ currentIntegration: {
+ payloadExample,
+ type: typeSet.http,
+ active: true,
+ payloadAttributeMappings: [],
+ },
+ resetPayloadAndMappingConfirmed,
});
await wrapper.vm.$nextTick();
expect(findActionBtn().text()).toBe(caption);
@@ -333,16 +356,20 @@ describe('AlertsSettingsForm', () => {
});
describe('Parsing payload', () => {
- it('displays a toast message on successful parse', async () => {
- jest.useFakeTimers();
+ beforeEach(() => {
wrapper.setData({
selectedIntegration: typeSet.http,
- customMapping: { samplePayload: false },
+ resetPayloadAndMappingConfirmed: true,
});
- await wrapper.vm.$nextTick();
+ });
+ it('displays a toast message on successful parse', async () => {
+ jest.spyOn(wrapper.vm.$apollo, 'query').mockResolvedValue({
+ data: {
+ project: { alertManagementPayloadFields: [] },
+ },
+ });
findActionBtn().vm.$emit('click');
- jest.advanceTimersByTime(1000);
await waitForPromises();
@@ -350,27 +377,33 @@ describe('AlertsSettingsForm', () => {
'Sample payload has been parsed. You can now map the fields.',
);
});
+
+ it('displays an error message under payload field on unsuccessful parse', async () => {
+ const errorMessage = 'Error parsing paylod';
+ jest.spyOn(wrapper.vm.$apollo, 'query').mockRejectedValue({ message: errorMessage });
+ findActionBtn().vm.$emit('click');
+
+ await waitForPromises();
+
+ expect(findSamplePayloadSection().find('.invalid-feedback').text()).toBe(errorMessage);
+ });
});
});
describe('Mapping builder section', () => {
describe.each`
- alertFieldsProvided | multiIntegrations | featureFlag | integrationOption | visible
- ${true} | ${true} | ${true} | ${1} | ${true}
- ${true} | ${true} | ${true} | ${2} | ${false}
- ${true} | ${true} | ${false} | ${1} | ${false}
- ${true} | ${true} | ${false} | ${2} | ${false}
- ${true} | ${false} | ${true} | ${1} | ${false}
- ${false} | ${true} | ${true} | ${1} | ${false}
- `('', ({ alertFieldsProvided, multiIntegrations, featureFlag, integrationOption, visible }) => {
+ alertFieldsProvided | multiIntegrations | integrationOption | visible
+ ${true} | ${true} | ${1} | ${true}
+ ${true} | ${true} | ${2} | ${false}
+ ${true} | ${false} | ${1} | ${false}
+ ${false} | ${true} | ${1} | ${false}
+ `('', ({ alertFieldsProvided, multiIntegrations, integrationOption, visible }) => {
const visibleMsg = visible ? 'is rendered' : 'is not rendered';
- const featureFlagMsg = featureFlag ? 'is enabled' : 'is disabled';
const alertFieldsMsg = alertFieldsProvided ? 'are provided' : 'are not provided';
const integrationType = integrationOption === 1 ? typeSet.http : typeSet.prometheus;
- it(`${visibleMsg} when multipleHttpIntegrationsCustomMapping feature flag ${featureFlagMsg} and integration type is ${integrationType} and alert fields ${alertFieldsMsg}`, async () => {
+ it(`${visibleMsg} when integration type is ${integrationType} and alert fields ${alertFieldsMsg}`, async () => {
createComponent({
- multipleHttpIntegrationsCustomMapping: featureFlag,
multiIntegrations,
props: {
alertFields: alertFieldsProvided ? alertFields : [],
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 80293597ab6..77fac6dd022 100644
--- a/spec/frontend/alerts_settings/components/alerts_settings_wrapper_spec.js
+++ b/spec/frontend/alerts_settings/components/alerts_settings_wrapper_spec.js
@@ -2,21 +2,26 @@ import { GlLoadingIcon } from '@gitlab/ui';
import { mount, createLocalVue } from '@vue/test-utils';
import AxiosMockAdapter from 'axios-mock-adapter';
import VueApollo from 'vue-apollo';
+import createHttpIntegrationMutation from 'ee_else_ce/alerts_settings/graphql/mutations/create_http_integration.mutation.graphql';
+import updateHttpIntegrationMutation from 'ee_else_ce/alerts_settings/graphql/mutations/update_http_integration.mutation.graphql';
import createMockApollo from 'helpers/mock_apollo_helper';
import { useMockIntersectionObserver } from 'helpers/mock_dom_observer';
import waitForPromises from 'helpers/wait_for_promises';
import IntegrationsList from '~/alerts_settings/components/alerts_integrations_list.vue';
import AlertsSettingsForm from '~/alerts_settings/components/alerts_settings_form.vue';
-import AlertsSettingsWrapper from '~/alerts_settings/components/alerts_settings_wrapper.vue';
+import AlertsSettingsWrapper, {
+ i18n,
+} from '~/alerts_settings/components/alerts_settings_wrapper.vue';
import { typeSet } from '~/alerts_settings/constants';
-import createHttpIntegrationMutation from '~/alerts_settings/graphql/mutations/create_http_integration.mutation.graphql';
import createPrometheusIntegrationMutation from '~/alerts_settings/graphql/mutations/create_prometheus_integration.mutation.graphql';
import destroyHttpIntegrationMutation from '~/alerts_settings/graphql/mutations/destroy_http_integration.mutation.graphql';
import resetHttpTokenMutation from '~/alerts_settings/graphql/mutations/reset_http_token.mutation.graphql';
import resetPrometheusTokenMutation from '~/alerts_settings/graphql/mutations/reset_prometheus_token.mutation.graphql';
-import updateHttpIntegrationMutation from '~/alerts_settings/graphql/mutations/update_http_integration.mutation.graphql';
+import updateCurrentHttpIntegrationMutation from '~/alerts_settings/graphql/mutations/update_current_http_integration.mutation.graphql';
+import updateCurrentPrometheusIntegrationMutation from '~/alerts_settings/graphql/mutations/update_current_prometheus_integration.mutation.graphql';
import updatePrometheusIntegrationMutation from '~/alerts_settings/graphql/mutations/update_prometheus_integration.mutation.graphql';
import getIntegrationsQuery from '~/alerts_settings/graphql/queries/get_integrations.query.graphql';
+import alertsUpdateService from '~/alerts_settings/services';
import {
ADD_INTEGRATION_ERROR,
RESET_INTEGRATION_TOKEN_ERROR,
@@ -24,14 +29,15 @@ import {
INTEGRATION_PAYLOAD_TEST_ERROR,
DELETE_INTEGRATION_ERROR,
} from '~/alerts_settings/utils/error_messages';
-import createFlash from '~/flash';
+import createFlash, { FLASH_TYPES } from '~/flash';
import axios from '~/lib/utils/axios_utils';
import {
createHttpVariables,
updateHttpVariables,
createPrometheusVariables,
updatePrometheusVariables,
- ID,
+ HTTP_ID,
+ PROMETHEUS_ID,
errorMsg,
getIntegrationsQueryResponse,
destroyIntegrationResponse,
@@ -50,9 +56,33 @@ describe('AlertsSettingsWrapper', () => {
let fakeApollo;
let destroyIntegrationHandler;
useMockIntersectionObserver();
+ const httpMappingData = {
+ payloadExample: '{"test: : "field"}',
+ payloadAttributeMappings: [],
+ payloadAlertFields: [],
+ };
+ const httpIntegrations = {
+ list: [
+ {
+ id: mockIntegrations[0].id,
+ ...httpMappingData,
+ },
+ {
+ id: mockIntegrations[1].id,
+ ...httpMappingData,
+ },
+ {
+ id: mockIntegrations[2].id,
+ httpMappingData,
+ },
+ ],
+ };
- const findLoader = () => wrapper.find(IntegrationsList).find(GlLoadingIcon);
+ const findLoader = () => wrapper.findComponent(IntegrationsList).findComponent(GlLoadingIcon);
+ const findIntegrationsList = () => wrapper.findComponent(IntegrationsList);
const findIntegrations = () => wrapper.find(IntegrationsList).findAll('table tbody tr');
+ const findAddIntegrationBtn = () => wrapper.find('[data-testid="add-integration-btn"]');
+ const findAlertsSettingsForm = () => wrapper.findComponent(AlertsSettingsForm);
async function destroyHttpIntegration(localWrapper) {
await jest.runOnlyPendingTimers();
@@ -119,14 +149,37 @@ describe('AlertsSettingsWrapper', () => {
wrapper = null;
});
- describe('rendered via default permissions', () => {
- it('renders the GraphQL alerts integrations list and new form', () => {
- createComponent();
- expect(wrapper.find(IntegrationsList).exists()).toBe(true);
- expect(wrapper.find(AlertsSettingsForm).exists()).toBe(true);
+ describe('template', () => {
+ beforeEach(() => {
+ createComponent({
+ data: {
+ integrations: { list: mockIntegrations },
+ httpIntegrations: { list: [] },
+ currentIntegration: mockIntegrations[0],
+ },
+ loading: false,
+ });
});
- it('uses a loading state inside the IntegrationsList table', () => {
+ it('renders alerts integrations list and add new integration button by default', () => {
+ expect(findLoader().exists()).toBe(false);
+ expect(findIntegrations()).toHaveLength(mockIntegrations.length);
+ expect(findAddIntegrationBtn().exists()).toBe(true);
+ });
+
+ it('does NOT render settings form by default', () => {
+ expect(findAlertsSettingsForm().exists()).toBe(false);
+ });
+
+ it('hides `add new integration` button and displays setting form on btn click', async () => {
+ const addNewIntegrationBtn = findAddIntegrationBtn();
+ expect(addNewIntegrationBtn.exists()).toBe(true);
+ await addNewIntegrationBtn.trigger('click');
+ expect(findAlertsSettingsForm().exists()).toBe(true);
+ expect(addNewIntegrationBtn.exists()).toBe(false);
+ });
+
+ it('shows loading indicator inside the IntegrationsList table', () => {
createComponent({
data: { integrations: {} },
loading: true,
@@ -134,26 +187,24 @@ describe('AlertsSettingsWrapper', () => {
expect(wrapper.find(IntegrationsList).exists()).toBe(true);
expect(findLoader().exists()).toBe(true);
});
+ });
- it('renders the IntegrationsList table using the API data', () => {
+ describe('Integration updates', () => {
+ beforeEach(() => {
createComponent({
- data: { integrations: { list: mockIntegrations }, currentIntegration: mockIntegrations[0] },
+ data: {
+ integrations: { list: mockIntegrations },
+ currentIntegration: mockIntegrations[0],
+ formVisible: true,
+ },
loading: false,
});
- expect(findLoader().exists()).toBe(false);
- expect(findIntegrations()).toHaveLength(mockIntegrations.length);
});
-
it('calls `$apollo.mutate` with `createHttpIntegrationMutation`', () => {
- createComponent({
- data: { integrations: { list: mockIntegrations }, currentIntegration: mockIntegrations[0] },
- loading: false,
- });
-
jest.spyOn(wrapper.vm.$apollo, 'mutate').mockResolvedValue({
data: { createHttpIntegrationMutation: { integration: { id: '1' } } },
});
- wrapper.find(AlertsSettingsForm).vm.$emit('create-new-integration', {
+ findAlertsSettingsForm().vm.$emit('create-new-integration', {
type: typeSet.http,
variables: createHttpVariables,
});
@@ -167,15 +218,10 @@ describe('AlertsSettingsWrapper', () => {
});
it('calls `$apollo.mutate` with `updateHttpIntegrationMutation`', () => {
- createComponent({
- data: { integrations: { list: mockIntegrations }, currentIntegration: mockIntegrations[0] },
- loading: false,
- });
-
jest.spyOn(wrapper.vm.$apollo, 'mutate').mockResolvedValue({
data: { updateHttpIntegrationMutation: { integration: { id: '1' } } },
});
- wrapper.find(AlertsSettingsForm).vm.$emit('update-integration', {
+ findAlertsSettingsForm().vm.$emit('update-integration', {
type: typeSet.http,
variables: updateHttpVariables,
});
@@ -187,37 +233,27 @@ describe('AlertsSettingsWrapper', () => {
});
it('calls `$apollo.mutate` with `resetHttpTokenMutation`', () => {
- createComponent({
- data: { integrations: { list: mockIntegrations }, currentIntegration: mockIntegrations[0] },
- loading: false,
- });
-
jest.spyOn(wrapper.vm.$apollo, 'mutate').mockResolvedValue({
data: { resetHttpTokenMutation: { integration: { id: '1' } } },
});
- wrapper.find(AlertsSettingsForm).vm.$emit('reset-token', {
+ findAlertsSettingsForm().vm.$emit('reset-token', {
type: typeSet.http,
- variables: { id: ID },
+ variables: { id: HTTP_ID },
});
expect(wrapper.vm.$apollo.mutate).toHaveBeenCalledWith({
mutation: resetHttpTokenMutation,
variables: {
- id: ID,
+ id: HTTP_ID,
},
});
});
it('calls `$apollo.mutate` with `createPrometheusIntegrationMutation`', () => {
- createComponent({
- data: { integrations: { list: mockIntegrations }, currentIntegration: mockIntegrations[0] },
- loading: false,
- });
-
jest.spyOn(wrapper.vm.$apollo, 'mutate').mockResolvedValue({
data: { createPrometheusIntegrationMutation: { integration: { id: '2' } } },
});
- wrapper.find(AlertsSettingsForm).vm.$emit('create-new-integration', {
+ findAlertsSettingsForm().vm.$emit('create-new-integration', {
type: typeSet.prometheus,
variables: createPrometheusVariables,
});
@@ -232,14 +268,18 @@ describe('AlertsSettingsWrapper', () => {
it('calls `$apollo.mutate` with `updatePrometheusIntegrationMutation`', () => {
createComponent({
- data: { integrations: { list: mockIntegrations }, currentIntegration: mockIntegrations[0] },
+ data: {
+ integrations: { list: mockIntegrations },
+ currentIntegration: mockIntegrations[3],
+ formVisible: true,
+ },
loading: false,
});
jest.spyOn(wrapper.vm.$apollo, 'mutate').mockResolvedValue({
data: { updatePrometheusIntegrationMutation: { integration: { id: '2' } } },
});
- wrapper.find(AlertsSettingsForm).vm.$emit('update-integration', {
+ findAlertsSettingsForm().vm.$emit('update-integration', {
type: typeSet.prometheus,
variables: updatePrometheusVariables,
});
@@ -251,35 +291,25 @@ describe('AlertsSettingsWrapper', () => {
});
it('calls `$apollo.mutate` with `resetPrometheusTokenMutation`', () => {
- createComponent({
- data: { integrations: { list: mockIntegrations }, currentIntegration: mockIntegrations[0] },
- loading: false,
- });
-
jest.spyOn(wrapper.vm.$apollo, 'mutate').mockResolvedValue({
data: { resetPrometheusTokenMutation: { integration: { id: '1' } } },
});
- wrapper.find(AlertsSettingsForm).vm.$emit('reset-token', {
+ findAlertsSettingsForm().vm.$emit('reset-token', {
type: typeSet.prometheus,
- variables: { id: ID },
+ variables: { id: PROMETHEUS_ID },
});
expect(wrapper.vm.$apollo.mutate).toHaveBeenCalledWith({
mutation: resetPrometheusTokenMutation,
variables: {
- id: ID,
+ id: PROMETHEUS_ID,
},
});
});
it('shows an error alert when integration creation fails ', async () => {
- createComponent({
- data: { integrations: { list: mockIntegrations }, currentIntegration: mockIntegrations[0] },
- loading: false,
- });
-
jest.spyOn(wrapper.vm.$apollo, 'mutate').mockRejectedValue(ADD_INTEGRATION_ERROR);
- wrapper.find(AlertsSettingsForm).vm.$emit('create-new-integration', {});
+ findAlertsSettingsForm().vm.$emit('create-new-integration', {});
await waitForPromises();
@@ -287,28 +317,18 @@ describe('AlertsSettingsWrapper', () => {
});
it('shows an error alert when integration token reset fails ', async () => {
- createComponent({
- data: { integrations: { list: mockIntegrations }, currentIntegration: mockIntegrations[0] },
- loading: false,
- });
-
jest.spyOn(wrapper.vm.$apollo, 'mutate').mockRejectedValue(RESET_INTEGRATION_TOKEN_ERROR);
- wrapper.find(AlertsSettingsForm).vm.$emit('reset-token', {});
+ findAlertsSettingsForm().vm.$emit('reset-token', {});
await waitForPromises();
expect(createFlash).toHaveBeenCalledWith({ message: RESET_INTEGRATION_TOKEN_ERROR });
});
it('shows an error alert when integration update fails ', async () => {
- createComponent({
- data: { integrations: { list: mockIntegrations }, currentIntegration: mockIntegrations[0] },
- loading: false,
- });
-
jest.spyOn(wrapper.vm.$apollo, 'mutate').mockRejectedValue(errorMsg);
- wrapper.find(AlertsSettingsForm).vm.$emit('update-integration', {});
+ findAlertsSettingsForm().vm.$emit('update-integration', {});
await waitForPromises();
expect(createFlash).toHaveBeenCalledWith({ message: UPDATE_INTEGRATION_ERROR });
@@ -317,15 +337,74 @@ describe('AlertsSettingsWrapper', () => {
it('shows an error alert when integration test payload fails ', async () => {
const mock = new AxiosMockAdapter(axios);
mock.onPost(/(.*)/).replyOnce(403);
+ return wrapper.vm.testAlertPayload({ endpoint: '', data: '', token: '' }).then(() => {
+ expect(createFlash).toHaveBeenCalledWith({ message: INTEGRATION_PAYLOAD_TEST_ERROR });
+ expect(createFlash).toHaveBeenCalledTimes(1);
+ mock.restore();
+ });
+ });
+
+ it('calls `$apollo.mutate` with `updateCurrentHttpIntegrationMutation` on HTTP integration edit', () => {
createComponent({
- data: { integrations: { list: mockIntegrations }, currentIntegration: mockIntegrations[0] },
+ data: {
+ integrations: { list: mockIntegrations },
+ currentIntegration: mockIntegrations[0],
+ httpIntegrations,
+ },
loading: false,
});
- return wrapper.vm.validateAlertPayload({ endpoint: '', data: '', token: '' }).then(() => {
- expect(createFlash).toHaveBeenCalledWith({ message: INTEGRATION_PAYLOAD_TEST_ERROR });
- expect(createFlash).toHaveBeenCalledTimes(1);
- mock.restore();
+ jest.spyOn(wrapper.vm.$apollo, 'mutate');
+ findIntegrationsList().vm.$emit('edit-integration', updateHttpVariables);
+ expect(wrapper.vm.$apollo.mutate).toHaveBeenCalledWith({
+ mutation: updateCurrentHttpIntegrationMutation,
+ variables: { ...mockIntegrations[0], ...httpMappingData },
+ });
+ });
+
+ it('calls `$apollo.mutate` with `updateCurrentPrometheusIntegrationMutation` on PROMETHEUS integration edit', () => {
+ createComponent({
+ data: {
+ integrations: { list: mockIntegrations },
+ currentIntegration: mockIntegrations[3],
+ httpIntegrations,
+ },
+ loading: false,
+ });
+
+ jest.spyOn(wrapper.vm.$apollo, 'mutate');
+ findIntegrationsList().vm.$emit('edit-integration', updatePrometheusVariables);
+ expect(wrapper.vm.$apollo.mutate).toHaveBeenCalledWith({
+ mutation: updateCurrentPrometheusIntegrationMutation,
+ variables: mockIntegrations[3],
+ });
+ });
+
+ describe('Test alert', () => {
+ it('makes `updateTestAlert` service call', async () => {
+ jest.spyOn(alertsUpdateService, 'updateTestAlert').mockResolvedValueOnce();
+ const testPayload = '{"title":"test"}';
+ findAlertsSettingsForm().vm.$emit('test-alert-payload', testPayload);
+ expect(alertsUpdateService.updateTestAlert).toHaveBeenCalledWith(testPayload);
+ });
+
+ it('shows success message on successful test', async () => {
+ jest.spyOn(alertsUpdateService, 'updateTestAlert').mockResolvedValueOnce({});
+ findAlertsSettingsForm().vm.$emit('test-alert-payload', '');
+ await waitForPromises();
+ expect(createFlash).toHaveBeenCalledWith({
+ message: i18n.alertSent,
+ type: FLASH_TYPES.SUCCESS,
+ });
+ });
+
+ it('shows error message when test alert fails', async () => {
+ jest.spyOn(alertsUpdateService, 'updateTestAlert').mockRejectedValueOnce({});
+ findAlertsSettingsForm().vm.$emit('test-alert-payload', '');
+ await waitForPromises();
+ expect(createFlash).toHaveBeenCalledWith({
+ message: INTEGRATION_PAYLOAD_TEST_ERROR,
+ });
});
});
});
diff --git a/spec/frontend/alerts_settings/components/mocks/apollo_mock.js b/spec/frontend/alerts_settings/components/mocks/apollo_mock.js
index e0eba1e8421..828580a436b 100644
--- a/spec/frontend/alerts_settings/components/mocks/apollo_mock.js
+++ b/spec/frontend/alerts_settings/components/mocks/apollo_mock.js
@@ -1,29 +1,34 @@
const projectPath = '';
-export const ID = 'gid://gitlab/AlertManagement::HttpIntegration/7';
+export const HTTP_ID = 'gid://gitlab/AlertManagement::HttpIntegration/7';
+export const PROMETHEUS_ID = 'gid://gitlab/PrometheusService/12';
export const errorMsg = 'Something went wrong';
export const createHttpVariables = {
name: 'Test Pre',
active: true,
projectPath,
+ type: 'HTTP',
};
export const updateHttpVariables = {
name: 'Test Pre',
active: true,
- id: ID,
+ id: HTTP_ID,
+ type: 'HTTP',
};
export const createPrometheusVariables = {
apiUrl: 'https://test-pre.com',
active: true,
projectPath,
+ type: 'PROMETHEUS',
};
export const updatePrometheusVariables = {
apiUrl: 'https://test-pre.com',
active: true,
- id: ID,
+ id: PROMETHEUS_ID,
+ type: 'PROMETHEUS',
};
export const getIntegrationsQueryResponse = {
@@ -99,6 +104,9 @@ export const destroyIntegrationResponse = {
'http://127.0.0.1:3000/h5bp/html5-boilerplate/alerts/notify/test-5/d4875758e67334f3.json',
token: '89eb01df471d990ff5162a1c640408cf',
apiUrl: null,
+ payloadExample: '{"field": "value"}',
+ payloadAttributeMappings: [],
+ payloadAlertFields: [],
},
},
},
@@ -117,6 +125,9 @@ export const destroyIntegrationResponseWithErrors = {
'http://127.0.0.1:3000/h5bp/html5-boilerplate/alerts/notify/test-5/d4875758e67334f3.json',
token: '89eb01df471d990ff5162a1c640408cf',
apiUrl: null,
+ payloadExample: '{"field": "value"}',
+ payloadAttributeMappings: [],
+ payloadAlertFields: [],
},
},
},
diff --git a/spec/frontend/alerts_settings/mocks/alertFields.json b/spec/frontend/alerts_settings/mocks/alert_fields.json
index ffe59dd0c05..ffe59dd0c05 100644
--- a/spec/frontend/alerts_settings/mocks/alertFields.json
+++ b/spec/frontend/alerts_settings/mocks/alert_fields.json
diff --git a/spec/frontend/alerts_settings/mocks/parsed_mapping.json b/spec/frontend/alerts_settings/mocks/parsed_mapping.json
new file mode 100644
index 00000000000..e985671a923
--- /dev/null
+++ b/spec/frontend/alerts_settings/mocks/parsed_mapping.json
@@ -0,0 +1,122 @@
+{
+ "payloadAlerFields": [
+ {
+ "path": [
+ "dashboardId"
+ ],
+ "label": "Dashboard Id",
+ "type": "string"
+ },
+ {
+ "path": [
+ "evalMatches"
+ ],
+ "label": "Eval Matches",
+ "type": "array"
+ },
+ {
+ "path": [
+ "createdAt"
+ ],
+ "label": "Created At",
+ "type": "datetime"
+ },
+ {
+ "path": [
+ "imageUrl"
+ ],
+ "label": "Image Url",
+ "type": "string"
+ },
+ {
+ "path": [
+ "message"
+ ],
+ "label": "Message",
+ "type": "string"
+ },
+ {
+ "path": [
+ "orgId"
+ ],
+ "label": "Org Id",
+ "type": "string"
+ },
+ {
+ "path": [
+ "panelId"
+ ],
+ "label": "Panel Id",
+ "type": "string"
+ },
+ {
+ "path": [
+ "ruleId"
+ ],
+ "label": "Rule Id",
+ "type": "string"
+ },
+ {
+ "path": [
+ "ruleName"
+ ],
+ "label": "Rule Name",
+ "type": "string"
+ },
+ {
+ "path": [
+ "ruleUrl"
+ ],
+ "label": "Rule Url",
+ "type": "string"
+ },
+ {
+ "path": [
+ "state"
+ ],
+ "label": "State",
+ "type": "string"
+ },
+ {
+ "path": [
+ "title"
+ ],
+ "label": "Title",
+ "type": "string"
+ },
+ {
+ "path": [
+ "tags",
+ "tag"
+ ],
+ "label": "Tags",
+ "type": "string"
+ }
+ ],
+ "payloadAttributeMappings": [
+ {
+ "fieldName": "title",
+ "label": "Title",
+ "type": "STRING",
+ "path": ["title"]
+ },
+ {
+ "fieldName": "description",
+ "label": "description",
+ "type": "STRING",
+ "path": ["description"]
+ },
+ {
+ "fieldName": "hosts",
+ "label": "Host",
+ "type": "ARRAY",
+ "path": ["hosts", "host"]
+ },
+ {
+ "fieldName": "startTime",
+ "label": "Created Atd",
+ "type": "STRING",
+ "path": ["time", "createdAt"]
+ }
+ ]
+}
diff --git a/spec/frontend/alerts_settings/utils/mapping_transformations_spec.js b/spec/frontend/alerts_settings/utils/mapping_transformations_spec.js
index 8c1977ffebe..62b95c6078b 100644
--- a/spec/frontend/alerts_settings/utils/mapping_transformations_spec.js
+++ b/spec/frontend/alerts_settings/utils/mapping_transformations_spec.js
@@ -1,29 +1,25 @@
-import parsedMapping from '~/alerts_settings/components/mocks/parsedMapping.json';
-import {
- getMappingData,
- getPayloadFields,
- transformForSave,
-} from '~/alerts_settings/utils/mapping_transformations';
-import alertFields from '../mocks/alertFields.json';
+import { getMappingData, transformForSave } from '~/alerts_settings/utils/mapping_transformations';
+import alertFields from '../mocks/alert_fields.json';
+import parsedMapping from '../mocks/parsed_mapping.json';
describe('Mapping Transformation Utilities', () => {
const nameField = {
label: 'Name',
path: ['alert', 'name'],
- type: 'string',
+ type: 'STRING',
};
const dashboardField = {
label: 'Dashboard Id',
path: ['alert', 'dashboardId'],
- type: 'string',
+ type: 'STRING',
};
describe('getMappingData', () => {
it('should return mapping data', () => {
const result = getMappingData(
alertFields,
- getPayloadFields(parsedMapping.samplePayload.payloadAlerFields.nodes.slice(0, 3)),
- parsedMapping.storedMapping.nodes.slice(0, 3),
+ parsedMapping.payloadAlerFields.slice(0, 3),
+ parsedMapping.payloadAttributeMappings.slice(0, 3),
);
result.forEach((data, index) => {
@@ -44,8 +40,8 @@ describe('Mapping Transformation Utilities', () => {
const mockMappingData = [
{
name: fieldName,
- mapping: 'alert_name',
- mappingFields: getPayloadFields([dashboardField, nameField]),
+ mapping: ['alert', 'name'],
+ mappingFields: [dashboardField, nameField],
},
];
const result = transformForSave(mockMappingData);
@@ -61,21 +57,11 @@ describe('Mapping Transformation Utilities', () => {
{
name: fieldName,
mapping: null,
- mappingFields: getPayloadFields([nameField, dashboardField]),
+ mappingFields: [nameField, dashboardField],
},
];
const result = transformForSave(mockMappingData);
expect(result).toEqual([]);
});
});
-
- describe('getPayloadFields', () => {
- it('should add name field to each payload field', () => {
- const result = getPayloadFields([nameField, dashboardField]);
- expect(result).toEqual([
- { ...nameField, name: 'alert_name' },
- { ...dashboardField, name: 'alert_dashboardId' },
- ]);
- });
- });
});
diff --git a/spec/frontend/analytics/instance_statistics/components/__snapshots__/instance_statistics_count_chart_spec.js.snap b/spec/frontend/analytics/instance_statistics/components/__snapshots__/instance_statistics_count_chart_spec.js.snap
deleted file mode 100644
index 29bcd5f223b..00000000000
--- a/spec/frontend/analytics/instance_statistics/components/__snapshots__/instance_statistics_count_chart_spec.js.snap
+++ /dev/null
@@ -1,41 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`InstanceStatisticsCountChart when fetching more data when the fetchMore query returns data passes the data to the line chart 1`] = `
-Array [
- Object {
- "data": Array [
- Array [
- "2020-07-01",
- 41,
- ],
- Array [
- "2020-06-01",
- 22,
- ],
- Array [
- "2020-08-01",
- 5,
- ],
- ],
- "name": "Mock Query",
- },
-]
-`;
-
-exports[`InstanceStatisticsCountChart with data passes the data to the line chart 1`] = `
-Array [
- Object {
- "data": Array [
- Array [
- "2020-07-01",
- 41,
- ],
- Array [
- "2020-06-01",
- 22,
- ],
- ],
- "name": "Mock Query",
- },
-]
-`;
diff --git a/spec/frontend/analytics/instance_statistics/components/app_spec.js b/spec/frontend/analytics/instance_statistics/components/app_spec.js
deleted file mode 100644
index b945cc20bd6..00000000000
--- a/spec/frontend/analytics/instance_statistics/components/app_spec.js
+++ /dev/null
@@ -1,45 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import InstanceCounts from '~/analytics/instance_statistics/components//instance_counts.vue';
-import InstanceStatisticsApp from '~/analytics/instance_statistics/components/app.vue';
-import InstanceStatisticsCountChart from '~/analytics/instance_statistics/components/instance_statistics_count_chart.vue';
-import ProjectsAndGroupsChart from '~/analytics/instance_statistics/components/projects_and_groups_chart.vue';
-import UsersChart from '~/analytics/instance_statistics/components/users_chart.vue';
-
-describe('InstanceStatisticsApp', () => {
- let wrapper;
-
- const createComponent = () => {
- wrapper = shallowMount(InstanceStatisticsApp);
- };
-
- beforeEach(() => {
- createComponent();
- });
-
- afterEach(() => {
- wrapper.destroy();
- wrapper = null;
- });
-
- it('displays the instance counts component', () => {
- expect(wrapper.find(InstanceCounts).exists()).toBe(true);
- });
-
- ['Pipelines', 'Issues & Merge Requests'].forEach((instance) => {
- it(`displays the ${instance} chart`, () => {
- const chartTitles = wrapper
- .findAll(InstanceStatisticsCountChart)
- .wrappers.map((chartComponent) => chartComponent.props('chartTitle'));
-
- expect(chartTitles).toContain(instance);
- });
- });
-
- it('displays the users chart component', () => {
- expect(wrapper.find(UsersChart).exists()).toBe(true);
- });
-
- it('displays the projects and groups chart component', () => {
- expect(wrapper.find(ProjectsAndGroupsChart).exists()).toBe(true);
- });
-});
diff --git a/spec/frontend/analytics/instance_statistics/components/instance_counts_spec.js b/spec/frontend/analytics/instance_statistics/components/instance_counts_spec.js
deleted file mode 100644
index 12b5e14b9c4..00000000000
--- a/spec/frontend/analytics/instance_statistics/components/instance_counts_spec.js
+++ /dev/null
@@ -1,54 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import InstanceCounts from '~/analytics/instance_statistics/components/instance_counts.vue';
-import MetricCard from '~/analytics/shared/components/metric_card.vue';
-import { mockInstanceCounts } from '../mock_data';
-
-describe('InstanceCounts', () => {
- let wrapper;
-
- const createComponent = ({ loading = false, data = {} } = {}) => {
- const $apollo = {
- queries: {
- counts: {
- loading,
- },
- },
- };
-
- wrapper = shallowMount(InstanceCounts, {
- mocks: { $apollo },
- data() {
- return {
- ...data,
- };
- },
- });
- };
-
- afterEach(() => {
- wrapper.destroy();
- wrapper = null;
- });
-
- const findMetricCard = () => wrapper.find(MetricCard);
-
- describe('while loading', () => {
- beforeEach(() => {
- createComponent({ loading: true });
- });
-
- it('displays the metric card with isLoading=true', () => {
- expect(findMetricCard().props('isLoading')).toBe(true);
- });
- });
-
- describe('with data', () => {
- beforeEach(() => {
- createComponent({ data: { counts: mockInstanceCounts } });
- });
-
- it('passes the counts data to the metric card', () => {
- expect(findMetricCard().props('metrics')).toEqual(mockInstanceCounts);
- });
- });
-});
diff --git a/spec/frontend/analytics/instance_statistics/components/instance_statistics_count_chart_spec.js b/spec/frontend/analytics/instance_statistics/components/instance_statistics_count_chart_spec.js
deleted file mode 100644
index e80dcdff426..00000000000
--- a/spec/frontend/analytics/instance_statistics/components/instance_statistics_count_chart_spec.js
+++ /dev/null
@@ -1,177 +0,0 @@
-import { GlAlert } from '@gitlab/ui';
-import { GlLineChart } from '@gitlab/ui/dist/charts';
-import { createLocalVue, shallowMount } from '@vue/test-utils';
-import VueApollo from 'vue-apollo';
-import createMockApollo from 'helpers/mock_apollo_helper';
-import InstanceStatisticsCountChart from '~/analytics/instance_statistics/components/instance_statistics_count_chart.vue';
-import statsQuery from '~/analytics/instance_statistics/graphql/queries/instance_count.query.graphql';
-import ChartSkeletonLoader from '~/vue_shared/components/resizable_chart/skeleton_loader.vue';
-import { mockQueryResponse, mockApolloResponse } from '../apollo_mock_data';
-import { mockCountsData1 } from '../mock_data';
-
-const localVue = createLocalVue();
-localVue.use(VueApollo);
-
-const loadChartErrorMessage = 'My load error message';
-const noDataMessage = 'My no data message';
-
-const queryResponseDataKey = 'instanceStatisticsMeasurements';
-const identifier = 'MOCK_QUERY';
-const mockQueryConfig = {
- identifier,
- title: 'Mock Query',
- query: statsQuery,
- loadError: 'Failed to load mock query data',
-};
-
-const mockChartConfig = {
- loadChartErrorMessage,
- noDataMessage,
- chartTitle: 'Foo',
- yAxisTitle: 'Bar',
- xAxisTitle: 'Baz',
- queries: [mockQueryConfig],
-};
-
-describe('InstanceStatisticsCountChart', () => {
- let wrapper;
- let queryHandler;
-
- const createComponent = ({ responseHandler }) => {
- return shallowMount(InstanceStatisticsCountChart, {
- localVue,
- apolloProvider: createMockApollo([[statsQuery, responseHandler]]),
- propsData: { ...mockChartConfig },
- });
- };
-
- afterEach(() => {
- wrapper.destroy();
- wrapper = null;
- });
-
- const findLoader = () => wrapper.find(ChartSkeletonLoader);
- const findChart = () => wrapper.find(GlLineChart);
- const findAlert = () => wrapper.find(GlAlert);
-
- describe('while loading', () => {
- beforeEach(() => {
- queryHandler = mockQueryResponse({ key: queryResponseDataKey, loading: true });
- wrapper = createComponent({ responseHandler: queryHandler });
- });
-
- it('requests data', () => {
- expect(queryHandler).toBeCalledTimes(1);
- });
-
- it('displays the skeleton loader', () => {
- expect(findLoader().exists()).toBe(true);
- });
-
- it('hides the chart', () => {
- expect(findChart().exists()).toBe(false);
- });
-
- it('does not show an error', () => {
- expect(findAlert().exists()).toBe(false);
- });
- });
-
- describe('without data', () => {
- beforeEach(() => {
- queryHandler = mockQueryResponse({ key: queryResponseDataKey, data: [] });
- wrapper = createComponent({ responseHandler: queryHandler });
- });
-
- it('renders an no data message', () => {
- expect(findAlert().text()).toBe(noDataMessage);
- });
-
- it('hides the skeleton loader', () => {
- expect(findLoader().exists()).toBe(false);
- });
-
- it('renders the chart', () => {
- expect(findChart().exists()).toBe(false);
- });
- });
-
- describe('with data', () => {
- beforeEach(() => {
- queryHandler = mockQueryResponse({ key: queryResponseDataKey, data: mockCountsData1 });
- wrapper = createComponent({ responseHandler: queryHandler });
- });
-
- it('requests data', () => {
- expect(queryHandler).toBeCalledTimes(1);
- });
-
- it('hides the skeleton loader', () => {
- expect(findLoader().exists()).toBe(false);
- });
-
- it('renders the chart', () => {
- expect(findChart().exists()).toBe(true);
- });
-
- it('passes the data to the line chart', () => {
- expect(findChart().props('data')).toMatchSnapshot();
- });
-
- it('does not show an error', () => {
- expect(findAlert().exists()).toBe(false);
- });
- });
-
- describe('when fetching more data', () => {
- const recordedAt = '2020-08-01';
- describe('when the fetchMore query returns data', () => {
- beforeEach(async () => {
- const newData = [{ recordedAt, count: 5 }];
- queryHandler = mockQueryResponse({
- key: queryResponseDataKey,
- data: mockCountsData1,
- additionalData: newData,
- });
-
- wrapper = createComponent({ responseHandler: queryHandler });
- await wrapper.vm.$nextTick();
- });
-
- it('requests data twice', () => {
- expect(queryHandler).toBeCalledTimes(2);
- });
-
- it('passes the data to the line chart', () => {
- expect(findChart().props('data')).toMatchSnapshot();
- });
- });
-
- describe('when the fetchMore query throws an error', () => {
- beforeEach(async () => {
- queryHandler = jest.fn().mockResolvedValueOnce(
- mockApolloResponse({
- key: queryResponseDataKey,
- data: mockCountsData1,
- hasNextPage: true,
- }),
- );
-
- wrapper = createComponent({ responseHandler: queryHandler });
- jest
- .spyOn(wrapper.vm.$apollo.queries[identifier], 'fetchMore')
- .mockImplementation(jest.fn().mockRejectedValue());
-
- await wrapper.vm.$nextTick();
- });
-
- it('calls fetchMore', () => {
- expect(wrapper.vm.$apollo.queries[identifier].fetchMore).toHaveBeenCalledTimes(1);
- });
-
- it('show an error message', () => {
- expect(findAlert().text()).toBe(loadChartErrorMessage);
- });
- });
- });
-});
diff --git a/spec/frontend/analytics/instance_statistics/components/projects_and_groups_chart_spec.js b/spec/frontend/analytics/instance_statistics/components/projects_and_groups_chart_spec.js
deleted file mode 100644
index bbfc65f19b1..00000000000
--- a/spec/frontend/analytics/instance_statistics/components/projects_and_groups_chart_spec.js
+++ /dev/null
@@ -1,215 +0,0 @@
-import { GlAlert } from '@gitlab/ui';
-import { GlLineChart } from '@gitlab/ui/dist/charts';
-import { createLocalVue, shallowMount } from '@vue/test-utils';
-import VueApollo from 'vue-apollo';
-import createMockApollo from 'helpers/mock_apollo_helper';
-import ProjectsAndGroupChart from '~/analytics/instance_statistics/components/projects_and_groups_chart.vue';
-import groupsQuery from '~/analytics/instance_statistics/graphql/queries/groups.query.graphql';
-import projectsQuery from '~/analytics/instance_statistics/graphql/queries/projects.query.graphql';
-import ChartSkeletonLoader from '~/vue_shared/components/resizable_chart/skeleton_loader.vue';
-import { mockQueryResponse } from '../apollo_mock_data';
-import { mockCountsData2, roundedSortedCountsMonthlyChartData2 } from '../mock_data';
-
-const localVue = createLocalVue();
-localVue.use(VueApollo);
-
-describe('ProjectsAndGroupChart', () => {
- let wrapper;
- let queryResponses = { projects: null, groups: null };
- const mockAdditionalData = [{ recordedAt: '2020-07-21', count: 5 }];
-
- const createComponent = ({
- loadingError = false,
- projects = [],
- groups = [],
- projectsLoading = false,
- groupsLoading = false,
- projectsAdditionalData = [],
- groupsAdditionalData = [],
- } = {}) => {
- queryResponses = {
- projects: mockQueryResponse({
- key: 'projects',
- data: projects,
- loading: projectsLoading,
- additionalData: projectsAdditionalData,
- }),
- groups: mockQueryResponse({
- key: 'groups',
- data: groups,
- loading: groupsLoading,
- additionalData: groupsAdditionalData,
- }),
- };
-
- return shallowMount(ProjectsAndGroupChart, {
- props: {
- startDate: new Date(2020, 9, 26),
- endDate: new Date(2020, 10, 1),
- totalDataPoints: mockCountsData2.length,
- },
- localVue,
- apolloProvider: createMockApollo([
- [projectsQuery, queryResponses.projects],
- [groupsQuery, queryResponses.groups],
- ]),
- data() {
- return { loadingError };
- },
- });
- };
-
- afterEach(() => {
- wrapper.destroy();
- wrapper = null;
- queryResponses = {
- projects: null,
- groups: null,
- };
- });
-
- const findLoader = () => wrapper.find(ChartSkeletonLoader);
- const findAlert = () => wrapper.find(GlAlert);
- const findChart = () => wrapper.find(GlLineChart);
-
- describe('while loading', () => {
- beforeEach(() => {
- wrapper = createComponent({ projectsLoading: true, groupsLoading: true });
- });
-
- it('displays the skeleton loader', () => {
- expect(findLoader().exists()).toBe(true);
- });
-
- it('hides the chart', () => {
- expect(findChart().exists()).toBe(false);
- });
- });
-
- describe('while loading 1 data set', () => {
- beforeEach(async () => {
- wrapper = createComponent({
- projects: mockCountsData2,
- groupsLoading: true,
- });
-
- await wrapper.vm.$nextTick();
- });
-
- it('hides the skeleton loader', () => {
- expect(findLoader().exists()).toBe(false);
- });
-
- it('renders the chart', () => {
- expect(findChart().exists()).toBe(true);
- });
- });
-
- describe('without data', () => {
- beforeEach(async () => {
- wrapper = createComponent({ projects: [] });
- await wrapper.vm.$nextTick();
- });
-
- it('renders a no data message', () => {
- expect(findAlert().text()).toBe('No data available.');
- });
-
- it('hides the skeleton loader', () => {
- expect(findLoader().exists()).toBe(false);
- });
-
- it('does not render the chart', () => {
- expect(findChart().exists()).toBe(false);
- });
- });
-
- describe('with data', () => {
- beforeEach(async () => {
- wrapper = createComponent({ projects: mockCountsData2 });
- await wrapper.vm.$nextTick();
- });
-
- it('hides the skeleton loader', () => {
- expect(findLoader().exists()).toBe(false);
- });
-
- it('renders the chart', () => {
- expect(findChart().exists()).toBe(true);
- });
-
- it('passes the data to the line chart', () => {
- expect(findChart().props('data')).toEqual([
- { data: roundedSortedCountsMonthlyChartData2, name: 'Total projects' },
- { data: [], name: 'Total groups' },
- ]);
- });
- });
-
- describe('with errors', () => {
- beforeEach(async () => {
- wrapper = createComponent({ loadingError: true });
- await wrapper.vm.$nextTick();
- });
-
- it('renders an error message', () => {
- expect(findAlert().text()).toBe('No data available.');
- });
-
- it('hides the skeleton loader', () => {
- expect(findLoader().exists()).toBe(false);
- });
-
- it('hides the chart', () => {
- expect(findChart().exists()).toBe(false);
- });
- });
-
- describe.each`
- metric | loadingState | newData
- ${'projects'} | ${{ projectsAdditionalData: mockAdditionalData }} | ${{ projects: mockCountsData2 }}
- ${'groups'} | ${{ groupsAdditionalData: mockAdditionalData }} | ${{ groups: mockCountsData2 }}
- `('$metric - fetchMore', ({ metric, loadingState, newData }) => {
- describe('when the fetchMore query returns data', () => {
- beforeEach(async () => {
- wrapper = createComponent({
- ...loadingState,
- ...newData,
- });
-
- jest.spyOn(wrapper.vm.$apollo.queries[metric], 'fetchMore');
- await wrapper.vm.$nextTick();
- });
-
- it('requests data twice', () => {
- expect(queryResponses[metric]).toBeCalledTimes(2);
- });
-
- it('calls fetchMore', () => {
- expect(wrapper.vm.$apollo.queries[metric].fetchMore).toHaveBeenCalledTimes(1);
- });
- });
-
- describe('when the fetchMore query throws an error', () => {
- beforeEach(() => {
- wrapper = createComponent({
- ...loadingState,
- ...newData,
- });
-
- jest
- .spyOn(wrapper.vm.$apollo.queries[metric], 'fetchMore')
- .mockImplementation(jest.fn().mockRejectedValue());
- return wrapper.vm.$nextTick();
- });
-
- it('calls fetchMore', () => {
- expect(wrapper.vm.$apollo.queries[metric].fetchMore).toHaveBeenCalledTimes(1);
- });
-
- it('renders an error message', () => {
- expect(findAlert().text()).toBe('No data available.');
- });
- });
- });
-});
diff --git a/spec/frontend/analytics/instance_statistics/components/users_chart_spec.js b/spec/frontend/analytics/instance_statistics/components/users_chart_spec.js
deleted file mode 100644
index d857b7fae61..00000000000
--- a/spec/frontend/analytics/instance_statistics/components/users_chart_spec.js
+++ /dev/null
@@ -1,174 +0,0 @@
-import { GlAlert } from '@gitlab/ui';
-import { GlAreaChart } from '@gitlab/ui/dist/charts';
-import { createLocalVue, shallowMount } from '@vue/test-utils';
-import VueApollo from 'vue-apollo';
-import createMockApollo from 'helpers/mock_apollo_helper';
-import UsersChart from '~/analytics/instance_statistics/components/users_chart.vue';
-import usersQuery from '~/analytics/instance_statistics/graphql/queries/users.query.graphql';
-import ChartSkeletonLoader from '~/vue_shared/components/resizable_chart/skeleton_loader.vue';
-import { mockQueryResponse } from '../apollo_mock_data';
-import {
- mockCountsData1,
- mockCountsData2,
- roundedSortedCountsMonthlyChartData2,
-} from '../mock_data';
-
-const localVue = createLocalVue();
-localVue.use(VueApollo);
-
-describe('UsersChart', () => {
- let wrapper;
- let queryHandler;
-
- const createComponent = ({
- loadingError = false,
- loading = false,
- users = [],
- additionalData = [],
- } = {}) => {
- queryHandler = mockQueryResponse({ key: 'users', data: users, loading, additionalData });
-
- return shallowMount(UsersChart, {
- props: {
- startDate: new Date(2020, 9, 26),
- endDate: new Date(2020, 10, 1),
- totalDataPoints: mockCountsData2.length,
- },
- localVue,
- apolloProvider: createMockApollo([[usersQuery, queryHandler]]),
- data() {
- return { loadingError };
- },
- });
- };
-
- afterEach(() => {
- wrapper.destroy();
- wrapper = null;
- });
-
- const findLoader = () => wrapper.find(ChartSkeletonLoader);
- const findAlert = () => wrapper.find(GlAlert);
- const findChart = () => wrapper.find(GlAreaChart);
-
- describe('while loading', () => {
- beforeEach(() => {
- wrapper = createComponent({ loading: true });
- });
-
- it('displays the skeleton loader', () => {
- expect(findLoader().exists()).toBe(true);
- });
-
- it('hides the chart', () => {
- expect(findChart().exists()).toBe(false);
- });
- });
-
- describe('without data', () => {
- beforeEach(async () => {
- wrapper = createComponent({ users: [] });
- await wrapper.vm.$nextTick();
- });
-
- it('renders an no data message', () => {
- expect(findAlert().text()).toBe('There is no data available.');
- });
-
- it('hides the skeleton loader', () => {
- expect(findLoader().exists()).toBe(false);
- });
-
- it('renders the chart', () => {
- expect(findChart().exists()).toBe(false);
- });
- });
-
- describe('with data', () => {
- beforeEach(async () => {
- wrapper = createComponent({ users: mockCountsData2 });
- await wrapper.vm.$nextTick();
- });
-
- it('hides the skeleton loader', () => {
- expect(findLoader().exists()).toBe(false);
- });
-
- it('renders the chart', () => {
- expect(findChart().exists()).toBe(true);
- });
-
- it('passes the data to the line chart', () => {
- expect(findChart().props('data')).toEqual([
- { data: roundedSortedCountsMonthlyChartData2, name: 'Total users' },
- ]);
- });
- });
-
- describe('with errors', () => {
- beforeEach(async () => {
- wrapper = createComponent({ loadingError: true });
- await wrapper.vm.$nextTick();
- });
-
- it('renders an error message', () => {
- expect(findAlert().text()).toBe(
- 'Could not load the user chart. Please refresh the page to try again.',
- );
- });
-
- it('hides the skeleton loader', () => {
- expect(findLoader().exists()).toBe(false);
- });
-
- it('renders the chart', () => {
- expect(findChart().exists()).toBe(false);
- });
- });
-
- describe('when fetching more data', () => {
- describe('when the fetchMore query returns data', () => {
- beforeEach(async () => {
- wrapper = createComponent({
- users: mockCountsData2,
- additionalData: mockCountsData1,
- });
-
- jest.spyOn(wrapper.vm.$apollo.queries.users, 'fetchMore');
- await wrapper.vm.$nextTick();
- });
-
- it('requests data twice', () => {
- expect(queryHandler).toBeCalledTimes(2);
- });
-
- it('calls fetchMore', () => {
- expect(wrapper.vm.$apollo.queries.users.fetchMore).toHaveBeenCalledTimes(1);
- });
- });
-
- describe('when the fetchMore query throws an error', () => {
- beforeEach(() => {
- wrapper = createComponent({
- users: mockCountsData2,
- additionalData: mockCountsData1,
- });
-
- jest
- .spyOn(wrapper.vm.$apollo.queries.users, 'fetchMore')
- .mockImplementation(jest.fn().mockRejectedValue());
- return wrapper.vm.$nextTick();
- });
-
- it('calls fetchMore', () => {
- expect(wrapper.vm.$apollo.queries.users.fetchMore).toHaveBeenCalledTimes(1);
- });
-
- it('renders an error message', () => {
- expect(findAlert().text()).toBe(
- 'Could not load the user chart. Please refresh the page to try again.',
- );
- });
- });
- });
-});
diff --git a/spec/frontend/analytics/instance_statistics/mock_data.js b/spec/frontend/analytics/instance_statistics/mock_data.js
deleted file mode 100644
index e86e552a952..00000000000
--- a/spec/frontend/analytics/instance_statistics/mock_data.js
+++ /dev/null
@@ -1,35 +0,0 @@
-export const mockInstanceCounts = [
- { key: 'projects', value: 10, label: 'Projects' },
- { key: 'groups', value: 20, label: 'Group' },
-];
-
-export const mockCountsData1 = [
- { recordedAt: '2020-07-23', count: 52 },
- { recordedAt: '2020-07-22', count: 40 },
- { recordedAt: '2020-07-21', count: 31 },
- { recordedAt: '2020-06-14', count: 23 },
- { recordedAt: '2020-06-12', count: 20 },
-];
-
-export const countsMonthlyChartData1 = [
- ['2020-07-01', 41], // average of 2020-07-x items
- ['2020-06-01', 21.5], // average of 2020-06-x items
-];
-
-export const mockCountsData2 = [
- { recordedAt: '2020-07-28', count: 10 },
- { recordedAt: '2020-07-27', count: 9 },
- { recordedAt: '2020-06-26', count: 14 },
- { recordedAt: '2020-06-25', count: 23 },
- { recordedAt: '2020-06-24', count: 25 },
-];
-
-export const countsMonthlyChartData2 = [
- ['2020-07-01', 9.5], // average of 2020-07-x items
- ['2020-06-01', 20.666666666666668], // average of 2020-06-x items
-];
-
-export const roundedSortedCountsMonthlyChartData2 = [
- ['2020-06-01', 21], // average of 2020-06-x items
- ['2020-07-01', 10], // average of 2020-07-x items
-];
diff --git a/spec/frontend/analytics/instance_statistics/utils_spec.js b/spec/frontend/analytics/instance_statistics/utils_spec.js
deleted file mode 100644
index 3fd89c7f740..00000000000
--- a/spec/frontend/analytics/instance_statistics/utils_spec.js
+++ /dev/null
@@ -1,81 +0,0 @@
-import {
- getAverageByMonth,
- getEarliestDate,
- generateDataKeys,
-} from '~/analytics/instance_statistics/utils';
-import {
- mockCountsData1,
- mockCountsData2,
- countsMonthlyChartData1,
- countsMonthlyChartData2,
-} from './mock_data';
-
-describe('getAverageByMonth', () => {
- it('collects data into average by months', () => {
- expect(getAverageByMonth(mockCountsData1)).toStrictEqual(countsMonthlyChartData1);
- expect(getAverageByMonth(mockCountsData2)).toStrictEqual(countsMonthlyChartData2);
- });
-
- it('it transforms a data point to the first of the month', () => {
- const item = mockCountsData1[0];
- const firstOfTheMonth = item.recordedAt.replace(/-[0-9]{2}$/, '-01');
- expect(getAverageByMonth([item])).toStrictEqual([[firstOfTheMonth, item.count]]);
- });
-
- it('it uses sane defaults', () => {
- expect(getAverageByMonth()).toStrictEqual([]);
- });
-
- it('it errors when passing null', () => {
- expect(() => {
- getAverageByMonth(null);
- }).toThrow();
- });
-
- describe('when shouldRound = true', () => {
- const options = { shouldRound: true };
-
- it('rounds the averages', () => {
- const roundedData1 = countsMonthlyChartData1.map(([date, avg]) => [date, Math.round(avg)]);
- const roundedData2 = countsMonthlyChartData2.map(([date, avg]) => [date, Math.round(avg)]);
- expect(getAverageByMonth(mockCountsData1, options)).toStrictEqual(roundedData1);
- expect(getAverageByMonth(mockCountsData2, options)).toStrictEqual(roundedData2);
- });
- });
-});
-
-describe('getEarliestDate', () => {
- it('returns the date of the final item in the array', () => {
- expect(getEarliestDate(mockCountsData1)).toBe('2020-06-12');
- });
-
- it('returns null for an empty array', () => {
- expect(getEarliestDate([])).toBeNull();
- });
-
- it("returns null if the array has data but `recordedAt` isn't defined", () => {
- expect(
- getEarliestDate(mockCountsData1.map(({ recordedAt: date, ...rest }) => ({ date, ...rest }))),
- ).toBeNull();
- });
-});
-
-describe('generateDataKeys', () => {
- const fakeQueries = [
- { identifier: 'from' },
- { identifier: 'first' },
- { identifier: 'to' },
- { identifier: 'last' },
- ];
-
- const defaultValue = 'default value';
- const res = generateDataKeys(fakeQueries, defaultValue);
-
- it('extracts each query identifier and sets them as object keys', () => {
- expect(Object.keys(res)).toEqual(['from', 'first', 'to', 'last']);
- });
-
- it('sets every value to the `defaultValue` provided', () => {
- expect(Object.values(res)).toEqual(Array(fakeQueries.length).fill(defaultValue));
- });
-});
diff --git a/spec/frontend/analytics/instance_statistics/apollo_mock_data.js b/spec/frontend/analytics/usage_trends/apollo_mock_data.js
index 98eabd577ee..98eabd577ee 100644
--- a/spec/frontend/analytics/instance_statistics/apollo_mock_data.js
+++ b/spec/frontend/analytics/usage_trends/apollo_mock_data.js
diff --git a/spec/frontend/analytics/usage_trends/components/__snapshots__/usage_trends_count_chart_spec.js.snap b/spec/frontend/analytics/usage_trends/components/__snapshots__/usage_trends_count_chart_spec.js.snap
new file mode 100644
index 00000000000..65de69c2692
--- /dev/null
+++ b/spec/frontend/analytics/usage_trends/components/__snapshots__/usage_trends_count_chart_spec.js.snap
@@ -0,0 +1,41 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`UsageTrendsCountChart when fetching more data when the fetchMore query returns data passes the data to the line chart 1`] = `
+Array [
+ Object {
+ "data": Array [
+ Array [
+ "2020-07-01",
+ 41,
+ ],
+ Array [
+ "2020-06-01",
+ 22,
+ ],
+ Array [
+ "2020-08-01",
+ 5,
+ ],
+ ],
+ "name": "Mock Query",
+ },
+]
+`;
+
+exports[`UsageTrendsCountChart with data passes the data to the line chart 1`] = `
+Array [
+ Object {
+ "data": Array [
+ Array [
+ "2020-07-01",
+ 41,
+ ],
+ Array [
+ "2020-06-01",
+ 22,
+ ],
+ ],
+ "name": "Mock Query",
+ },
+]
+`;
diff --git a/spec/frontend/analytics/usage_trends/components/app_spec.js b/spec/frontend/analytics/usage_trends/components/app_spec.js
new file mode 100644
index 00000000000..f0306ea72e3
--- /dev/null
+++ b/spec/frontend/analytics/usage_trends/components/app_spec.js
@@ -0,0 +1,40 @@
+import { shallowMount } from '@vue/test-utils';
+import UsageTrendsApp from '~/analytics/usage_trends/components/app.vue';
+import UsageCounts from '~/analytics/usage_trends/components/usage_counts.vue';
+import UsageTrendsCountChart from '~/analytics/usage_trends/components/usage_trends_count_chart.vue';
+import UsersChart from '~/analytics/usage_trends/components/users_chart.vue';
+
+describe('UsageTrendsApp', () => {
+ let wrapper;
+
+ const createComponent = () => {
+ wrapper = shallowMount(UsageTrendsApp);
+ };
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ });
+
+ it('displays the usage counts component', () => {
+ expect(wrapper.find(UsageCounts).exists()).toBe(true);
+ });
+
+ ['Total projects & groups', 'Pipelines', 'Issues & Merge Requests'].forEach((usage) => {
+ it(`displays the ${usage} chart`, () => {
+ const chartTitles = wrapper
+ .findAll(UsageTrendsCountChart)
+ .wrappers.map((chartComponent) => chartComponent.props('chartTitle'));
+
+ expect(chartTitles).toContain(usage);
+ });
+ });
+
+ it('displays the users chart component', () => {
+ expect(wrapper.find(UsersChart).exists()).toBe(true);
+ });
+});
diff --git a/spec/frontend/analytics/usage_trends/components/instance_counts_spec.js b/spec/frontend/analytics/usage_trends/components/instance_counts_spec.js
new file mode 100644
index 00000000000..707d2cc310f
--- /dev/null
+++ b/spec/frontend/analytics/usage_trends/components/instance_counts_spec.js
@@ -0,0 +1,54 @@
+import { shallowMount } from '@vue/test-utils';
+import MetricCard from '~/analytics/shared/components/metric_card.vue';
+import UsageCounts from '~/analytics/usage_trends/components/usage_counts.vue';
+import { mockUsageCounts } from '../mock_data';
+
+describe('UsageCounts', () => {
+ let wrapper;
+
+ const createComponent = ({ loading = false, data = {} } = {}) => {
+ const $apollo = {
+ queries: {
+ counts: {
+ loading,
+ },
+ },
+ };
+
+ wrapper = shallowMount(UsageCounts, {
+ mocks: { $apollo },
+ data() {
+ return {
+ ...data,
+ };
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ });
+
+ const findMetricCard = () => wrapper.find(MetricCard);
+
+ describe('while loading', () => {
+ beforeEach(() => {
+ createComponent({ loading: true });
+ });
+
+ it('displays the metric card with isLoading=true', () => {
+ expect(findMetricCard().props('isLoading')).toBe(true);
+ });
+ });
+
+ describe('with data', () => {
+ beforeEach(() => {
+ createComponent({ data: { counts: mockUsageCounts } });
+ });
+
+ it('passes the counts data to the metric card', () => {
+ expect(findMetricCard().props('metrics')).toEqual(mockUsageCounts);
+ });
+ });
+});
diff --git a/spec/frontend/analytics/usage_trends/components/usage_trends_count_chart_spec.js b/spec/frontend/analytics/usage_trends/components/usage_trends_count_chart_spec.js
new file mode 100644
index 00000000000..7c2df3fe8c4
--- /dev/null
+++ b/spec/frontend/analytics/usage_trends/components/usage_trends_count_chart_spec.js
@@ -0,0 +1,177 @@
+import { GlAlert } from '@gitlab/ui';
+import { GlLineChart } from '@gitlab/ui/dist/charts';
+import { createLocalVue, shallowMount } from '@vue/test-utils';
+import VueApollo from 'vue-apollo';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import UsageTrendsCountChart from '~/analytics/usage_trends/components/usage_trends_count_chart.vue';
+import statsQuery from '~/analytics/usage_trends/graphql/queries/usage_count.query.graphql';
+import ChartSkeletonLoader from '~/vue_shared/components/resizable_chart/skeleton_loader.vue';
+import { mockQueryResponse, mockApolloResponse } from '../apollo_mock_data';
+import { mockCountsData1 } from '../mock_data';
+
+const localVue = createLocalVue();
+localVue.use(VueApollo);
+
+const loadChartErrorMessage = 'My load error message';
+const noDataMessage = 'My no data message';
+
+const queryResponseDataKey = 'usageTrendsMeasurements';
+const identifier = 'MOCK_QUERY';
+const mockQueryConfig = {
+ identifier,
+ title: 'Mock Query',
+ query: statsQuery,
+ loadError: 'Failed to load mock query data',
+};
+
+const mockChartConfig = {
+ loadChartErrorMessage,
+ noDataMessage,
+ chartTitle: 'Foo',
+ yAxisTitle: 'Bar',
+ xAxisTitle: 'Baz',
+ queries: [mockQueryConfig],
+};
+
+describe('UsageTrendsCountChart', () => {
+ let wrapper;
+ let queryHandler;
+
+ const createComponent = ({ responseHandler }) => {
+ return shallowMount(UsageTrendsCountChart, {
+ localVue,
+ apolloProvider: createMockApollo([[statsQuery, responseHandler]]),
+ propsData: { ...mockChartConfig },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ });
+
+ const findLoader = () => wrapper.find(ChartSkeletonLoader);
+ const findChart = () => wrapper.find(GlLineChart);
+ const findAlert = () => wrapper.find(GlAlert);
+
+ describe('while loading', () => {
+ beforeEach(() => {
+ queryHandler = mockQueryResponse({ key: queryResponseDataKey, loading: true });
+ wrapper = createComponent({ responseHandler: queryHandler });
+ });
+
+ it('requests data', () => {
+ expect(queryHandler).toBeCalledTimes(1);
+ });
+
+ it('displays the skeleton loader', () => {
+ expect(findLoader().exists()).toBe(true);
+ });
+
+ it('hides the chart', () => {
+ expect(findChart().exists()).toBe(false);
+ });
+
+ it('does not show an error', () => {
+ expect(findAlert().exists()).toBe(false);
+ });
+ });
+
+ describe('without data', () => {
+ beforeEach(() => {
+ queryHandler = mockQueryResponse({ key: queryResponseDataKey, data: [] });
+ wrapper = createComponent({ responseHandler: queryHandler });
+ });
+
+ it('renders an no data message', () => {
+ expect(findAlert().text()).toBe(noDataMessage);
+ });
+
+ it('hides the skeleton loader', () => {
+ expect(findLoader().exists()).toBe(false);
+ });
+
+ it('renders the chart', () => {
+ expect(findChart().exists()).toBe(false);
+ });
+ });
+
+ describe('with data', () => {
+ beforeEach(() => {
+ queryHandler = mockQueryResponse({ key: queryResponseDataKey, data: mockCountsData1 });
+ wrapper = createComponent({ responseHandler: queryHandler });
+ });
+
+ it('requests data', () => {
+ expect(queryHandler).toBeCalledTimes(1);
+ });
+
+ it('hides the skeleton loader', () => {
+ expect(findLoader().exists()).toBe(false);
+ });
+
+ it('renders the chart', () => {
+ expect(findChart().exists()).toBe(true);
+ });
+
+ it('passes the data to the line chart', () => {
+ expect(findChart().props('data')).toMatchSnapshot();
+ });
+
+ it('does not show an error', () => {
+ expect(findAlert().exists()).toBe(false);
+ });
+ });
+
+ describe('when fetching more data', () => {
+ const recordedAt = '2020-08-01';
+ describe('when the fetchMore query returns data', () => {
+ beforeEach(async () => {
+ const newData = [{ recordedAt, count: 5 }];
+ queryHandler = mockQueryResponse({
+ key: queryResponseDataKey,
+ data: mockCountsData1,
+ additionalData: newData,
+ });
+
+ wrapper = createComponent({ responseHandler: queryHandler });
+ await wrapper.vm.$nextTick();
+ });
+
+ it('requests data twice', () => {
+ expect(queryHandler).toBeCalledTimes(2);
+ });
+
+ it('passes the data to the line chart', () => {
+ expect(findChart().props('data')).toMatchSnapshot();
+ });
+ });
+
+ describe('when the fetchMore query throws an error', () => {
+ beforeEach(async () => {
+ queryHandler = jest.fn().mockResolvedValueOnce(
+ mockApolloResponse({
+ key: queryResponseDataKey,
+ data: mockCountsData1,
+ hasNextPage: true,
+ }),
+ );
+
+ wrapper = createComponent({ responseHandler: queryHandler });
+ jest
+ .spyOn(wrapper.vm.$apollo.queries[identifier], 'fetchMore')
+ .mockImplementation(jest.fn().mockRejectedValue());
+
+ await wrapper.vm.$nextTick();
+ });
+
+ it('calls fetchMore', () => {
+ expect(wrapper.vm.$apollo.queries[identifier].fetchMore).toHaveBeenCalledTimes(1);
+ });
+
+ it('show an error message', () => {
+ expect(findAlert().text()).toBe(loadChartErrorMessage);
+ });
+ });
+ });
+});
diff --git a/spec/frontend/analytics/usage_trends/components/users_chart_spec.js b/spec/frontend/analytics/usage_trends/components/users_chart_spec.js
new file mode 100644
index 00000000000..6adfcca11ac
--- /dev/null
+++ b/spec/frontend/analytics/usage_trends/components/users_chart_spec.js
@@ -0,0 +1,174 @@
+import { GlAlert } from '@gitlab/ui';
+import { GlAreaChart } from '@gitlab/ui/dist/charts';
+import { createLocalVue, shallowMount } from '@vue/test-utils';
+import VueApollo from 'vue-apollo';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import UsersChart from '~/analytics/usage_trends/components/users_chart.vue';
+import usersQuery from '~/analytics/usage_trends/graphql/queries/users.query.graphql';
+import ChartSkeletonLoader from '~/vue_shared/components/resizable_chart/skeleton_loader.vue';
+import { mockQueryResponse } from '../apollo_mock_data';
+import {
+ mockCountsData1,
+ mockCountsData2,
+ roundedSortedCountsMonthlyChartData2,
+} from '../mock_data';
+
+const localVue = createLocalVue();
+localVue.use(VueApollo);
+
+describe('UsersChart', () => {
+ let wrapper;
+ let queryHandler;
+
+ const createComponent = ({
+ loadingError = false,
+ loading = false,
+ users = [],
+ additionalData = [],
+ } = {}) => {
+ queryHandler = mockQueryResponse({ key: 'users', data: users, loading, additionalData });
+
+ return shallowMount(UsersChart, {
+ props: {
+ startDate: new Date(2020, 9, 26),
+ endDate: new Date(2020, 10, 1),
+ totalDataPoints: mockCountsData2.length,
+ },
+ localVue,
+ apolloProvider: createMockApollo([[usersQuery, queryHandler]]),
+ data() {
+ return { loadingError };
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ });
+
+ const findLoader = () => wrapper.find(ChartSkeletonLoader);
+ const findAlert = () => wrapper.find(GlAlert);
+ const findChart = () => wrapper.find(GlAreaChart);
+
+ describe('while loading', () => {
+ beforeEach(() => {
+ wrapper = createComponent({ loading: true });
+ });
+
+ it('displays the skeleton loader', () => {
+ expect(findLoader().exists()).toBe(true);
+ });
+
+ it('hides the chart', () => {
+ expect(findChart().exists()).toBe(false);
+ });
+ });
+
+ describe('without data', () => {
+ beforeEach(async () => {
+ wrapper = createComponent({ users: [] });
+ await wrapper.vm.$nextTick();
+ });
+
+ it('renders an no data message', () => {
+ expect(findAlert().text()).toBe('There is no data available.');
+ });
+
+ it('hides the skeleton loader', () => {
+ expect(findLoader().exists()).toBe(false);
+ });
+
+ it('renders the chart', () => {
+ expect(findChart().exists()).toBe(false);
+ });
+ });
+
+ describe('with data', () => {
+ beforeEach(async () => {
+ wrapper = createComponent({ users: mockCountsData2 });
+ await wrapper.vm.$nextTick();
+ });
+
+ it('hides the skeleton loader', () => {
+ expect(findLoader().exists()).toBe(false);
+ });
+
+ it('renders the chart', () => {
+ expect(findChart().exists()).toBe(true);
+ });
+
+ it('passes the data to the line chart', () => {
+ expect(findChart().props('data')).toEqual([
+ { data: roundedSortedCountsMonthlyChartData2, name: 'Total users' },
+ ]);
+ });
+ });
+
+ describe('with errors', () => {
+ beforeEach(async () => {
+ wrapper = createComponent({ loadingError: true });
+ await wrapper.vm.$nextTick();
+ });
+
+ it('renders an error message', () => {
+ expect(findAlert().text()).toBe(
+ 'Could not load the user chart. Please refresh the page to try again.',
+ );
+ });
+
+ it('hides the skeleton loader', () => {
+ expect(findLoader().exists()).toBe(false);
+ });
+
+ it('renders the chart', () => {
+ expect(findChart().exists()).toBe(false);
+ });
+ });
+
+ describe('when fetching more data', () => {
+ describe('when the fetchMore query returns data', () => {
+ beforeEach(async () => {
+ wrapper = createComponent({
+ users: mockCountsData2,
+ additionalData: mockCountsData1,
+ });
+
+ jest.spyOn(wrapper.vm.$apollo.queries.users, 'fetchMore');
+ await wrapper.vm.$nextTick();
+ });
+
+ it('requests data twice', () => {
+ expect(queryHandler).toBeCalledTimes(2);
+ });
+
+ it('calls fetchMore', () => {
+ expect(wrapper.vm.$apollo.queries.users.fetchMore).toHaveBeenCalledTimes(1);
+ });
+ });
+
+ describe('when the fetchMore query throws an error', () => {
+ beforeEach(() => {
+ wrapper = createComponent({
+ users: mockCountsData2,
+ additionalData: mockCountsData1,
+ });
+
+ jest
+ .spyOn(wrapper.vm.$apollo.queries.users, 'fetchMore')
+ .mockImplementation(jest.fn().mockRejectedValue());
+ return wrapper.vm.$nextTick();
+ });
+
+ it('calls fetchMore', () => {
+ expect(wrapper.vm.$apollo.queries.users.fetchMore).toHaveBeenCalledTimes(1);
+ });
+
+ it('renders an error message', () => {
+ expect(findAlert().text()).toBe(
+ 'Could not load the user chart. Please refresh the page to try again.',
+ );
+ });
+ });
+ });
+});
diff --git a/spec/frontend/analytics/usage_trends/mock_data.js b/spec/frontend/analytics/usage_trends/mock_data.js
new file mode 100644
index 00000000000..d96dfa26209
--- /dev/null
+++ b/spec/frontend/analytics/usage_trends/mock_data.js
@@ -0,0 +1,35 @@
+export const mockUsageCounts = [
+ { key: 'projects', value: 10, label: 'Projects' },
+ { key: 'groups', value: 20, label: 'Group' },
+];
+
+export const mockCountsData1 = [
+ { recordedAt: '2020-07-23', count: 52 },
+ { recordedAt: '2020-07-22', count: 40 },
+ { recordedAt: '2020-07-21', count: 31 },
+ { recordedAt: '2020-06-14', count: 23 },
+ { recordedAt: '2020-06-12', count: 20 },
+];
+
+export const countsMonthlyChartData1 = [
+ ['2020-07-01', 41], // average of 2020-07-x items
+ ['2020-06-01', 21.5], // average of 2020-06-x items
+];
+
+export const mockCountsData2 = [
+ { recordedAt: '2020-07-28', count: 10 },
+ { recordedAt: '2020-07-27', count: 9 },
+ { recordedAt: '2020-06-26', count: 14 },
+ { recordedAt: '2020-06-25', count: 23 },
+ { recordedAt: '2020-06-24', count: 25 },
+];
+
+export const countsMonthlyChartData2 = [
+ ['2020-07-01', 9.5], // average of 2020-07-x items
+ ['2020-06-01', 20.666666666666668], // average of 2020-06-x items
+];
+
+export const roundedSortedCountsMonthlyChartData2 = [
+ ['2020-06-01', 21], // average of 2020-06-x items
+ ['2020-07-01', 10], // average of 2020-07-x items
+];
diff --git a/spec/frontend/analytics/usage_trends/utils_spec.js b/spec/frontend/analytics/usage_trends/utils_spec.js
new file mode 100644
index 00000000000..656f310dda7
--- /dev/null
+++ b/spec/frontend/analytics/usage_trends/utils_spec.js
@@ -0,0 +1,81 @@
+import {
+ getAverageByMonth,
+ getEarliestDate,
+ generateDataKeys,
+} from '~/analytics/usage_trends/utils';
+import {
+ mockCountsData1,
+ mockCountsData2,
+ countsMonthlyChartData1,
+ countsMonthlyChartData2,
+} from './mock_data';
+
+describe('getAverageByMonth', () => {
+ it('collects data into average by months', () => {
+ expect(getAverageByMonth(mockCountsData1)).toStrictEqual(countsMonthlyChartData1);
+ expect(getAverageByMonth(mockCountsData2)).toStrictEqual(countsMonthlyChartData2);
+ });
+
+ it('it transforms a data point to the first of the month', () => {
+ const item = mockCountsData1[0];
+ const firstOfTheMonth = item.recordedAt.replace(/-[0-9]{2}$/, '-01');
+ expect(getAverageByMonth([item])).toStrictEqual([[firstOfTheMonth, item.count]]);
+ });
+
+ it('it uses sane defaults', () => {
+ expect(getAverageByMonth()).toStrictEqual([]);
+ });
+
+ it('it errors when passing null', () => {
+ expect(() => {
+ getAverageByMonth(null);
+ }).toThrow();
+ });
+
+ describe('when shouldRound = true', () => {
+ const options = { shouldRound: true };
+
+ it('rounds the averages', () => {
+ const roundedData1 = countsMonthlyChartData1.map(([date, avg]) => [date, Math.round(avg)]);
+ const roundedData2 = countsMonthlyChartData2.map(([date, avg]) => [date, Math.round(avg)]);
+ expect(getAverageByMonth(mockCountsData1, options)).toStrictEqual(roundedData1);
+ expect(getAverageByMonth(mockCountsData2, options)).toStrictEqual(roundedData2);
+ });
+ });
+});
+
+describe('getEarliestDate', () => {
+ it('returns the date of the final item in the array', () => {
+ expect(getEarliestDate(mockCountsData1)).toBe('2020-06-12');
+ });
+
+ it('returns null for an empty array', () => {
+ expect(getEarliestDate([])).toBeNull();
+ });
+
+ it("returns null if the array has data but `recordedAt` isn't defined", () => {
+ expect(
+ getEarliestDate(mockCountsData1.map(({ recordedAt: date, ...rest }) => ({ date, ...rest }))),
+ ).toBeNull();
+ });
+});
+
+describe('generateDataKeys', () => {
+ const fakeQueries = [
+ { identifier: 'from' },
+ { identifier: 'first' },
+ { identifier: 'to' },
+ { identifier: 'last' },
+ ];
+
+ const defaultValue = 'default value';
+ const res = generateDataKeys(fakeQueries, defaultValue);
+
+ it('extracts each query identifier and sets them as object keys', () => {
+ expect(Object.keys(res)).toEqual(['from', 'first', 'to', 'last']);
+ });
+
+ it('sets every value to the `defaultValue` provided', () => {
+ expect(Object.values(res)).toEqual(Array(fakeQueries.length).fill(defaultValue));
+ });
+});
diff --git a/spec/frontend/api_spec.js b/spec/frontend/api_spec.js
index d2522a0124a..a03aabf9e4f 100644
--- a/spec/frontend/api_spec.js
+++ b/spec/frontend/api_spec.js
@@ -352,6 +352,20 @@ describe('Api', () => {
});
});
+ describe('projectGroups', () => {
+ it('fetches a project group', async () => {
+ const options = { unused: 'option' };
+ const projectId = 1;
+ const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/${projectId}/groups.json`;
+ mock.onGet(expectedUrl, { params: options }).reply(httpStatus.OK, {
+ name: 'test',
+ });
+
+ const { name } = await Api.projectGroups(projectId, options);
+ expect(name).toBe('test');
+ });
+ });
+
describe('projectUsers', () => {
it('fetches all users of a particular project', (done) => {
const query = 'dummy query';
@@ -482,6 +496,30 @@ describe('Api', () => {
});
});
+ describe('projectShareWithGroup', () => {
+ it('invites a group to share access with the authenticated project', () => {
+ const projectId = 1;
+ const sharedGroupId = 99;
+ const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/${projectId}/share`;
+ const options = {
+ group_id: sharedGroupId,
+ group_access: 10,
+ expires_at: undefined,
+ };
+
+ jest.spyOn(axios, 'post');
+
+ mock.onPost(expectedUrl).reply(200, {
+ status: 'success',
+ });
+
+ return Api.projectShareWithGroup(projectId, options).then(({ data }) => {
+ expect(data.status).toBe('success');
+ expect(axios.post).toHaveBeenCalledWith(expectedUrl, options);
+ });
+ });
+ });
+
describe('projectMilestones', () => {
it('fetches project milestones', (done) => {
const projectId = 1;
@@ -638,6 +676,30 @@ describe('Api', () => {
});
});
+ describe('groupShareWithGroup', () => {
+ it('invites a group to share access with the authenticated group', () => {
+ const groupId = 1;
+ const sharedGroupId = 99;
+ const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/groups/${groupId}/share`;
+ const options = {
+ group_id: sharedGroupId,
+ group_access: 10,
+ expires_at: undefined,
+ };
+
+ jest.spyOn(axios, 'post');
+
+ mock.onPost(expectedUrl).reply(200, {
+ status: 'success',
+ });
+
+ return Api.groupShareWithGroup(groupId, options).then(({ data }) => {
+ expect(data.status).toBe('success');
+ expect(axios.post).toHaveBeenCalledWith(expectedUrl, options);
+ });
+ });
+ });
+
describe('commit', () => {
const projectId = 'user/project';
const sha = 'abcd0123';
diff --git a/spec/frontend/artifacts_settings/components/__snapshots__/keep_latest_artifact_checkbox_spec.js.snap b/spec/frontend/artifacts_settings/components/__snapshots__/keep_latest_artifact_checkbox_spec.js.snap
index bf33aa731ef..2691e11e616 100644
--- a/spec/frontend/artifacts_settings/components/__snapshots__/keep_latest_artifact_checkbox_spec.js.snap
+++ b/spec/frontend/artifacts_settings/components/__snapshots__/keep_latest_artifact_checkbox_spec.js.snap
@@ -7,7 +7,6 @@ exports[`Keep latest artifact checkbox when application keep latest artifact set
<b-form-checkbox-stub
checked="true"
class="gl-form-checkbox"
- plain="true"
value="true"
>
<strong
diff --git a/spec/frontend/authentication/u2f/authenticate_spec.js b/spec/frontend/authentication/u2f/authenticate_spec.js
index bf50ee88035..153d4be56af 100644
--- a/spec/frontend/authentication/u2f/authenticate_spec.js
+++ b/spec/frontend/authentication/u2f/authenticate_spec.js
@@ -8,8 +8,6 @@ describe('U2FAuthenticate', () => {
let container;
let component;
- preloadFixtures('u2f/authenticate.html');
-
beforeEach(() => {
loadFixtures('u2f/authenticate.html');
u2fDevice = new MockU2FDevice();
diff --git a/spec/frontend/authentication/u2f/register_spec.js b/spec/frontend/authentication/u2f/register_spec.js
index 9cbadbc2fef..a814144ac7a 100644
--- a/spec/frontend/authentication/u2f/register_spec.js
+++ b/spec/frontend/authentication/u2f/register_spec.js
@@ -8,8 +8,6 @@ describe('U2FRegister', () => {
let container;
let component;
- preloadFixtures('u2f/register.html');
-
beforeEach((done) => {
loadFixtures('u2f/register.html');
u2fDevice = new MockU2FDevice();
diff --git a/spec/frontend/authentication/webauthn/authenticate_spec.js b/spec/frontend/authentication/webauthn/authenticate_spec.js
index 0a82adfd0ee..8b27560bbbe 100644
--- a/spec/frontend/authentication/webauthn/authenticate_spec.js
+++ b/spec/frontend/authentication/webauthn/authenticate_spec.js
@@ -13,7 +13,6 @@ const mockResponse = {
};
describe('WebAuthnAuthenticate', () => {
- preloadFixtures('webauthn/authenticate.html');
useMockNavigatorCredentials();
let fallbackElement;
diff --git a/spec/frontend/authentication/webauthn/register_spec.js b/spec/frontend/authentication/webauthn/register_spec.js
index 1de952d176d..43cd3d7ca34 100644
--- a/spec/frontend/authentication/webauthn/register_spec.js
+++ b/spec/frontend/authentication/webauthn/register_spec.js
@@ -5,7 +5,6 @@ import MockWebAuthnDevice from './mock_webauthn_device';
import { useMockNavigatorCredentials } from './util';
describe('WebAuthnRegister', () => {
- preloadFixtures('webauthn/register.html');
useMockNavigatorCredentials();
const mockResponse = {
diff --git a/spec/frontend/awards_handler_spec.js b/spec/frontend/awards_handler_spec.js
index edd17cfd810..09270174674 100644
--- a/spec/frontend/awards_handler_spec.js
+++ b/spec/frontend/awards_handler_spec.js
@@ -60,7 +60,6 @@ describe('AwardsHandler', () => {
u: '6.0',
},
};
- preloadFixtures('snippets/show.html');
const openAndWaitForEmojiMenu = (sel = '.js-add-award') => {
$(sel).eq(0).click();
@@ -189,8 +188,6 @@ describe('AwardsHandler', () => {
expect($thumbsUpEmoji.hasClass('active')).toBe(true);
expect($thumbsDownEmoji.hasClass('active')).toBe(false);
- $thumbsUpEmoji.tooltip();
- $thumbsDownEmoji.tooltip();
awardsHandler.addAward($votesBlock, awardUrl, 'thumbsdown', true);
expect($thumbsUpEmoji.hasClass('active')).toBe(false);
@@ -218,9 +215,8 @@ describe('AwardsHandler', () => {
const $thumbsUpEmoji = $votesBlock.find('[data-name=thumbsup]').parent();
$thumbsUpEmoji.attr('data-title', 'sam, jerry, max, and andy');
awardsHandler.addAward($votesBlock, awardUrl, 'thumbsup', false);
- $thumbsUpEmoji.tooltip();
- expect($thumbsUpEmoji.data('originalTitle')).toBe('You, sam, jerry, max, and andy');
+ expect($thumbsUpEmoji.attr('title')).toBe('You, sam, jerry, max, and andy');
});
it('handles the special case where "You" is not cleanly comma separated', () => {
@@ -229,9 +225,8 @@ describe('AwardsHandler', () => {
const $thumbsUpEmoji = $votesBlock.find('[data-name=thumbsup]').parent();
$thumbsUpEmoji.attr('data-title', 'sam');
awardsHandler.addAward($votesBlock, awardUrl, 'thumbsup', false);
- $thumbsUpEmoji.tooltip();
- expect($thumbsUpEmoji.data('originalTitle')).toBe('You and sam');
+ expect($thumbsUpEmoji.attr('title')).toBe('You and sam');
});
});
@@ -243,9 +238,8 @@ describe('AwardsHandler', () => {
$thumbsUpEmoji.attr('data-title', 'You, sam, jerry, max, and andy');
$thumbsUpEmoji.addClass('active');
awardsHandler.addAward($votesBlock, awardUrl, 'thumbsup', false);
- $thumbsUpEmoji.tooltip();
- expect($thumbsUpEmoji.data('originalTitle')).toBe('sam, jerry, max, and andy');
+ expect($thumbsUpEmoji.attr('title')).toBe('sam, jerry, max, and andy');
});
it('handles the special case where "You" is not cleanly comma separated', () => {
@@ -255,9 +249,8 @@ describe('AwardsHandler', () => {
$thumbsUpEmoji.attr('data-title', 'You and sam');
$thumbsUpEmoji.addClass('active');
awardsHandler.addAward($votesBlock, awardUrl, 'thumbsup', false);
- $thumbsUpEmoji.tooltip();
- expect($thumbsUpEmoji.data('originalTitle')).toBe('sam');
+ expect($thumbsUpEmoji.attr('title')).toBe('sam');
});
});
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 885e02ef60f..da19265ce82 100644
--- a/spec/frontend/batch_comments/stores/modules/batch_comments/actions_spec.js
+++ b/spec/frontend/batch_comments/stores/modules/batch_comments/actions_spec.js
@@ -1,6 +1,7 @@
import MockAdapter from 'axios-mock-adapter';
import { TEST_HOST } from 'helpers/test_constants';
import testAction from 'helpers/vuex_action_helper';
+import service from '~/batch_comments/services/drafts_service';
import * as actions from '~/batch_comments/stores/modules/batch_comments/actions';
import axios from '~/lib/utils/axios_utils';
@@ -201,6 +202,12 @@ describe('Batch comments store actions', () => {
describe('updateDraft', () => {
let getters;
+ service.update = jest.fn();
+ service.update.mockResolvedValue({ data: { id: 1 } });
+
+ const commit = jest.fn();
+ let context;
+ let params;
beforeEach(() => {
getters = {
@@ -208,43 +215,43 @@ describe('Batch comments store actions', () => {
draftsPath: TEST_HOST,
},
};
- });
- it('commits RECEIVE_DRAFT_UPDATE_SUCCESS with returned data', (done) => {
- const commit = jest.fn();
- const context = {
+ context = {
getters,
commit,
};
res = { id: 1 };
mock.onAny().reply(200, res);
+ params = { note: { id: 1 }, noteText: 'test' };
+ });
- actions
- .updateDraft(context, { note: { id: 1 }, noteText: 'test', callback() {} })
- .then(() => {
- expect(commit).toHaveBeenCalledWith('RECEIVE_DRAFT_UPDATE_SUCCESS', { id: 1 });
- })
- .then(done)
- .catch(done.fail);
+ afterEach(() => jest.clearAllMocks());
+
+ it('commits RECEIVE_DRAFT_UPDATE_SUCCESS with returned data', () => {
+ return actions.updateDraft(context, { ...params, callback() {} }).then(() => {
+ expect(commit).toHaveBeenCalledWith('RECEIVE_DRAFT_UPDATE_SUCCESS', { id: 1 });
+ });
});
- it('calls passed callback', (done) => {
- const commit = jest.fn();
- const context = {
- getters,
- commit,
- };
+ it('calls passed callback', () => {
const callback = jest.fn();
- res = { id: 1 };
- mock.onAny().reply(200, res);
+ return actions.updateDraft(context, { ...params, callback }).then(() => {
+ expect(callback).toHaveBeenCalled();
+ });
+ });
- actions
- .updateDraft(context, { note: { id: 1 }, noteText: 'test', callback })
- .then(() => {
- expect(callback).toHaveBeenCalled();
- })
- .then(done)
- .catch(done.fail);
+ it('does not stringify empty position', () => {
+ return actions.updateDraft(context, { ...params, position: {}, callback() {} }).then(() => {
+ expect(service.update.mock.calls[0][1].position).toBeUndefined();
+ });
+ });
+
+ it('stringifies a non-empty position', () => {
+ const position = { test: true };
+ const expectation = JSON.stringify(position);
+ return actions.updateDraft(context, { ...params, position, callback() {} }).then(() => {
+ expect(service.update.mock.calls[0][1].position).toBe(expectation);
+ });
});
});
diff --git a/spec/frontend/behaviors/quick_submit_spec.js b/spec/frontend/behaviors/quick_submit_spec.js
index d3d65892aff..86a85831c6b 100644
--- a/spec/frontend/behaviors/quick_submit_spec.js
+++ b/spec/frontend/behaviors/quick_submit_spec.js
@@ -6,8 +6,6 @@ describe('Quick Submit behavior', () => {
const keydownEvent = (options = { keyCode: 13, metaKey: true }) => $.Event('keydown', options);
- preloadFixtures('snippets/show.html');
-
beforeEach(() => {
loadFixtures('snippets/show.html');
diff --git a/spec/frontend/behaviors/requires_input_spec.js b/spec/frontend/behaviors/requires_input_spec.js
index 0f27f89d6dc..bb22133ae44 100644
--- a/spec/frontend/behaviors/requires_input_spec.js
+++ b/spec/frontend/behaviors/requires_input_spec.js
@@ -3,7 +3,6 @@ import '~/behaviors/requires_input';
describe('requiresInput', () => {
let submitButton;
- preloadFixtures('branches/new_branch.html');
beforeEach(() => {
loadFixtures('branches/new_branch.html');
diff --git a/spec/frontend/behaviors/shortcuts/shortcuts_issuable_spec.js b/spec/frontend/behaviors/shortcuts/shortcuts_issuable_spec.js
index 94ba1615c89..26d38b115b6 100644
--- a/spec/frontend/behaviors/shortcuts/shortcuts_issuable_spec.js
+++ b/spec/frontend/behaviors/shortcuts/shortcuts_issuable_spec.js
@@ -13,8 +13,6 @@ describe('ShortcutsIssuable', () => {
const snippetShowFixtureName = 'snippets/show.html';
const mrShowFixtureName = 'merge_requests/merge_request_of_current_user.html';
- preloadFixtures(snippetShowFixtureName, mrShowFixtureName);
-
beforeAll((done) => {
initCopyAsGFM();
diff --git a/spec/frontend/blob/blob_file_dropzone_spec.js b/spec/frontend/blob/blob_file_dropzone_spec.js
index cbd36abd4ff..e387ab7c18a 100644
--- a/spec/frontend/blob/blob_file_dropzone_spec.js
+++ b/spec/frontend/blob/blob_file_dropzone_spec.js
@@ -1,8 +1,12 @@
import $ from 'jquery';
import BlobFileDropzone from '~/blob/blob_file_dropzone';
+import { trackUploadFileFormSubmitted } from '~/projects/upload_file_experiment';
+
+jest.mock('~/projects/upload_file_experiment', () => ({
+ trackUploadFileFormSubmitted: jest.fn(),
+}));
describe('BlobFileDropzone', () => {
- preloadFixtures('blob/show.html');
let dropzone;
let replaceFileButton;
@@ -41,5 +45,13 @@ describe('BlobFileDropzone', () => {
expect(replaceFileButton.is(':disabled')).toEqual(true);
expect(dropzone.processQueue).toHaveBeenCalled();
});
+
+ it('calls the tracking event', () => {
+ jest.spyOn(window, 'alert').mockImplementation(() => {});
+
+ replaceFileButton.click();
+
+ expect(trackUploadFileFormSubmitted).toHaveBeenCalled();
+ });
});
});
diff --git a/spec/frontend/blob/sketch/index_spec.js b/spec/frontend/blob/sketch/index_spec.js
index a24e7de9037..7424897b22c 100644
--- a/spec/frontend/blob/sketch/index_spec.js
+++ b/spec/frontend/blob/sketch/index_spec.js
@@ -4,8 +4,6 @@ import SketchLoader from '~/blob/sketch';
jest.mock('jszip');
describe('Sketch viewer', () => {
- preloadFixtures('static/sketch_viewer.html');
-
beforeEach(() => {
loadFixtures('static/sketch_viewer.html');
});
diff --git a/spec/frontend/blob/viewer/index_spec.js b/spec/frontend/blob/viewer/index_spec.js
index 7449de48ec0..e4f145ae81b 100644
--- a/spec/frontend/blob/viewer/index_spec.js
+++ b/spec/frontend/blob/viewer/index_spec.js
@@ -16,8 +16,6 @@ describe('Blob viewer', () => {
setTestTimeout(2000);
- preloadFixtures('blob/show_readme.html');
-
beforeEach(() => {
$.fn.extend(jQueryMock);
mock = new MockAdapter(axios);
@@ -85,9 +83,11 @@ describe('Blob viewer', () => {
describe('copy blob button', () => {
let copyButton;
+ let copyButtonTooltip;
beforeEach(() => {
copyButton = document.querySelector('.js-copy-blob-source-btn');
+ copyButtonTooltip = document.querySelector('.js-copy-blob-source-btn-tooltip');
});
it('disabled on load', () => {
@@ -95,7 +95,7 @@ describe('Blob viewer', () => {
});
it('has tooltip when disabled', () => {
- expect(copyButton.getAttribute('title')).toBe(
+ expect(copyButtonTooltip.getAttribute('title')).toBe(
'Switch to the source to copy the file contents',
);
});
@@ -131,7 +131,7 @@ describe('Blob viewer', () => {
document.querySelector('.js-blob-viewer-switch-btn[data-viewer="simple"]').click();
setImmediate(() => {
- expect(copyButton.getAttribute('title')).toBe('Copy file contents');
+ expect(copyButtonTooltip.getAttribute('title')).toBe('Copy file contents');
done();
});
diff --git a/spec/frontend/boards/board_card_inner_spec.js b/spec/frontend/boards/board_card_inner_spec.js
new file mode 100644
index 00000000000..4487fc15de6
--- /dev/null
+++ b/spec/frontend/boards/board_card_inner_spec.js
@@ -0,0 +1,371 @@
+import { GlLabel } from '@gitlab/ui';
+import { mount } from '@vue/test-utils';
+import { range } from 'lodash';
+import BoardCardInner from '~/boards/components/board_card_inner.vue';
+import eventHub from '~/boards/eventhub';
+import defaultStore from '~/boards/stores';
+import { updateHistory } from '~/lib/utils/url_utility';
+import { mockLabelList } from './mock_data';
+
+jest.mock('~/lib/utils/url_utility');
+jest.mock('~/boards/eventhub');
+
+describe('Board card component', () => {
+ const user = {
+ id: 1,
+ name: 'testing 123',
+ username: 'test',
+ avatarUrl: 'test_image',
+ };
+
+ const label1 = {
+ id: 3,
+ title: 'testing 123',
+ color: '#000CFF',
+ textColor: 'white',
+ description: 'test',
+ };
+
+ let wrapper;
+ let issue;
+ let list;
+
+ const createWrapper = (props = {}, store = defaultStore) => {
+ wrapper = mount(BoardCardInner, {
+ store,
+ propsData: {
+ list,
+ item: issue,
+ ...props,
+ },
+ stubs: {
+ GlLabel: true,
+ },
+ provide: {
+ rootPath: '/',
+ scopedLabelsAvailable: false,
+ },
+ });
+ };
+
+ beforeEach(() => {
+ list = mockLabelList;
+ issue = {
+ title: 'Testing',
+ id: 1,
+ iid: 1,
+ confidential: false,
+ labels: [list.label],
+ assignees: [],
+ referencePath: '#1',
+ webUrl: '/test/1',
+ weight: 1,
+ };
+
+ createWrapper({ item: issue, list });
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ jest.clearAllMocks();
+ });
+
+ it('renders issue title', () => {
+ expect(wrapper.find('.board-card-title').text()).toContain(issue.title);
+ });
+
+ it('includes issue base in link', () => {
+ expect(wrapper.find('.board-card-title a').attributes('href')).toContain('/test');
+ });
+
+ it('includes issue title on link', () => {
+ expect(wrapper.find('.board-card-title a').attributes('title')).toBe(issue.title);
+ });
+
+ it('does not render confidential icon', () => {
+ expect(wrapper.find('.confidential-icon').exists()).toBe(false);
+ });
+
+ it('does not render blocked icon', () => {
+ expect(wrapper.find('.issue-blocked-icon').exists()).toBe(false);
+ });
+
+ it('renders issue ID with #', () => {
+ expect(wrapper.find('.board-card-number').text()).toContain(`#${issue.id}`);
+ });
+
+ it('does not render assignee', () => {
+ expect(wrapper.find('.board-card-assignee .avatar').exists()).toBe(false);
+ });
+
+ describe('confidential issue', () => {
+ beforeEach(() => {
+ wrapper.setProps({
+ item: {
+ ...wrapper.props('item'),
+ confidential: true,
+ },
+ });
+ });
+
+ it('renders confidential icon', () => {
+ expect(wrapper.find('.confidential-icon').exists()).toBe(true);
+ });
+ });
+
+ describe('with assignee', () => {
+ describe('with avatar', () => {
+ beforeEach(() => {
+ wrapper.setProps({
+ item: {
+ ...wrapper.props('item'),
+ assignees: [user],
+ updateData(newData) {
+ Object.assign(this, newData);
+ },
+ },
+ });
+ });
+
+ it('renders assignee', () => {
+ expect(wrapper.find('.board-card-assignee .avatar').exists()).toBe(true);
+ });
+
+ it('sets title', () => {
+ expect(wrapper.find('.js-assignee-tooltip').text()).toContain(`${user.name}`);
+ });
+
+ it('sets users path', () => {
+ expect(wrapper.find('.board-card-assignee a').attributes('href')).toBe('/test');
+ });
+
+ it('renders avatar', () => {
+ expect(wrapper.find('.board-card-assignee img').exists()).toBe(true);
+ });
+
+ it('renders the avatar using avatarUrl property', async () => {
+ wrapper.props('item').updateData({
+ ...wrapper.props('item'),
+ assignees: [
+ {
+ id: '1',
+ name: 'test',
+ state: 'active',
+ username: 'test_name',
+ avatarUrl: 'test_image_from_avatar_url',
+ },
+ ],
+ });
+
+ await wrapper.vm.$nextTick();
+
+ expect(wrapper.find('.board-card-assignee img').attributes('src')).toBe(
+ 'test_image_from_avatar_url?width=24',
+ );
+ });
+ });
+
+ describe('with default avatar', () => {
+ beforeEach(() => {
+ global.gon.default_avatar_url = 'default_avatar';
+
+ wrapper.setProps({
+ item: {
+ ...wrapper.props('item'),
+ assignees: [
+ {
+ id: 1,
+ name: 'testing 123',
+ username: 'test',
+ },
+ ],
+ },
+ });
+ });
+
+ afterEach(() => {
+ global.gon.default_avatar_url = null;
+ });
+
+ it('displays defaults avatar if users avatar is null', () => {
+ expect(wrapper.find('.board-card-assignee img').exists()).toBe(true);
+ expect(wrapper.find('.board-card-assignee img').attributes('src')).toBe(
+ 'default_avatar?width=24',
+ );
+ });
+ });
+ });
+
+ describe('multiple assignees', () => {
+ beforeEach(() => {
+ wrapper.setProps({
+ item: {
+ ...wrapper.props('item'),
+ assignees: [
+ {
+ id: 2,
+ name: 'user2',
+ username: 'user2',
+ avatarUrl: 'test_image',
+ },
+ {
+ id: 3,
+ name: 'user3',
+ username: 'user3',
+ avatarUrl: 'test_image',
+ },
+ {
+ id: 4,
+ name: 'user4',
+ username: 'user4',
+ avatarUrl: 'test_image',
+ },
+ ],
+ },
+ });
+ });
+
+ it('renders all three assignees', () => {
+ expect(wrapper.findAll('.board-card-assignee .avatar').length).toEqual(3);
+ });
+
+ describe('more than three assignees', () => {
+ beforeEach(() => {
+ const { assignees } = wrapper.props('item');
+ assignees.push({
+ id: 5,
+ name: 'user5',
+ username: 'user5',
+ avatarUrl: 'test_image',
+ });
+
+ wrapper.setProps({
+ item: {
+ ...wrapper.props('item'),
+ assignees,
+ },
+ });
+ });
+
+ it('renders more avatar counter', () => {
+ expect(wrapper.find('.board-card-assignee .avatar-counter').text().trim()).toEqual('+2');
+ });
+
+ it('renders two assignees', () => {
+ expect(wrapper.findAll('.board-card-assignee .avatar').length).toEqual(2);
+ });
+
+ it('renders 99+ avatar counter', async () => {
+ const assignees = [
+ ...wrapper.props('item').assignees,
+ ...range(5, 103).map((i) => ({
+ id: i,
+ name: 'name',
+ username: 'username',
+ avatarUrl: 'test_image',
+ })),
+ ];
+ wrapper.setProps({
+ item: {
+ ...wrapper.props('item'),
+ assignees,
+ },
+ });
+
+ await wrapper.vm.$nextTick();
+
+ expect(wrapper.find('.board-card-assignee .avatar-counter').text().trim()).toEqual('99+');
+ });
+ });
+ });
+
+ describe('labels', () => {
+ beforeEach(() => {
+ wrapper.setProps({ item: { ...issue, labels: [list.label, label1] } });
+ });
+
+ it('does not render list label but renders all other labels', () => {
+ expect(wrapper.findAll(GlLabel).length).toBe(1);
+ const label = wrapper.find(GlLabel);
+ expect(label.props('title')).toEqual(label1.title);
+ expect(label.props('description')).toEqual(label1.description);
+ expect(label.props('backgroundColor')).toEqual(label1.color);
+ });
+
+ it('does not render label if label does not have an ID', async () => {
+ wrapper.setProps({ item: { ...issue, labels: [label1, { title: 'closed' }] } });
+
+ await wrapper.vm.$nextTick();
+
+ expect(wrapper.findAll(GlLabel).length).toBe(1);
+ expect(wrapper.text()).not.toContain('closed');
+ });
+ });
+
+ describe('blocked', () => {
+ beforeEach(() => {
+ wrapper.setProps({
+ item: {
+ ...wrapper.props('item'),
+ blocked: true,
+ },
+ });
+ });
+
+ it('renders blocked icon if issue is blocked', () => {
+ expect(wrapper.find('.issue-blocked-icon').exists()).toBe(true);
+ });
+ });
+
+ describe('filterByLabel method', () => {
+ beforeEach(() => {
+ delete window.location;
+
+ wrapper.setProps({
+ updateFilters: true,
+ });
+ });
+
+ describe('when selected label is not in the filter', () => {
+ beforeEach(() => {
+ jest.spyOn(wrapper.vm, 'performSearch').mockImplementation(() => {});
+ window.location = { search: '' };
+ wrapper.vm.filterByLabel(label1);
+ });
+
+ it('calls updateHistory', () => {
+ expect(updateHistory).toHaveBeenCalledTimes(1);
+ });
+
+ it('dispatches performSearch vuex action', () => {
+ expect(wrapper.vm.performSearch).toHaveBeenCalledTimes(1);
+ });
+
+ it('emits updateTokens event', () => {
+ expect(eventHub.$emit).toHaveBeenCalledTimes(1);
+ expect(eventHub.$emit).toHaveBeenCalledWith('updateTokens');
+ });
+ });
+
+ describe('when selected label is already in the filter', () => {
+ beforeEach(() => {
+ jest.spyOn(wrapper.vm, 'performSearch').mockImplementation(() => {});
+ window.location = { search: '?label_name[]=testing%20123' };
+ wrapper.vm.filterByLabel(label1);
+ });
+
+ it('does not call updateHistory', () => {
+ expect(updateHistory).not.toHaveBeenCalled();
+ });
+
+ it('does not dispatch performSearch vuex action', () => {
+ expect(wrapper.vm.performSearch).not.toHaveBeenCalled();
+ });
+
+ it('does not emit updateTokens event', () => {
+ expect(eventHub.$emit).not.toHaveBeenCalled();
+ });
+ });
+ });
+});
diff --git a/spec/frontend/boards/board_list_spec.js b/spec/frontend/boards/board_list_spec.js
index 7ed20f20882..bf39c3f3e42 100644
--- a/spec/frontend/boards/board_list_spec.js
+++ b/spec/frontend/boards/board_list_spec.js
@@ -1,8 +1,9 @@
-import { createLocalVue, mount } from '@vue/test-utils';
+import { createLocalVue, shallowMount } from '@vue/test-utils';
import Vuex from 'vuex';
import { useFakeRequestAnimationFrame } from 'helpers/fake_request_animation_frame';
import BoardCard from '~/boards/components/board_card.vue';
import BoardList from '~/boards/components/board_list.vue';
+import BoardNewIssue from '~/boards/components/board_new_issue.vue';
import eventHub from '~/boards/eventhub';
import defaultState from '~/boards/stores/state';
import { mockList, mockIssuesByListId, issues, mockIssues } from './mock_data';
@@ -11,13 +12,18 @@ const localVue = createLocalVue();
localVue.use(Vuex);
const actions = {
- fetchIssuesForList: jest.fn(),
+ fetchItemsForList: jest.fn(),
};
const createStore = (state = defaultState) => {
return new Vuex.Store({
state,
actions,
+ getters: {
+ isGroupBoard: () => false,
+ isProjectBoard: () => true,
+ isEpicBoard: () => false,
+ },
});
};
@@ -28,8 +34,8 @@ const createComponent = ({
state = {},
} = {}) => {
const store = createStore({
- issuesByListId: mockIssuesByListId,
- issues,
+ boardItemsByListId: mockIssuesByListId,
+ boardItems: issues,
pageInfoByListId: {
'gid://gitlab/List/1': { hasNextPage: true },
'gid://gitlab/List/2': {},
@@ -38,6 +44,7 @@ const createComponent = ({
'gid://gitlab/List/1': {},
'gid://gitlab/List/2': {},
},
+ selectedBoardItems: [],
...state,
});
@@ -58,12 +65,12 @@ const createComponent = ({
list.issuesCount = 1;
}
- const component = mount(BoardList, {
+ const component = shallowMount(BoardList, {
localVue,
propsData: {
disabled: false,
list,
- issues: [issue],
+ boardItems: [issue],
canAdminList: true,
...componentProps,
},
@@ -74,6 +81,10 @@ const createComponent = ({
weightFeatureAvailable: false,
boardWeight: null,
},
+ stubs: {
+ BoardCard,
+ BoardNewIssue,
+ },
});
return component;
@@ -81,7 +92,10 @@ const createComponent = ({
describe('Board list component', () => {
let wrapper;
+
const findByTestId = (testId) => wrapper.find(`[data-testid="${testId}"]`);
+ const findIssueCountLoadingIcon = () => wrapper.find('[data-testid="count-loading-icon"]');
+
useFakeRequestAnimationFrame();
afterEach(() => {
@@ -111,7 +125,7 @@ describe('Board list component', () => {
});
it('sets data attribute with issue id', () => {
- expect(wrapper.find('.board-card').attributes('data-issue-id')).toBe('1');
+ expect(wrapper.find('.board-card').attributes('data-item-id')).toBe('1');
});
it('shows new issue form', async () => {
@@ -170,7 +184,7 @@ describe('Board list component', () => {
it('loads more issues after scrolling', () => {
wrapper.vm.listRef.dispatchEvent(new Event('scroll'));
- expect(actions.fetchIssuesForList).toHaveBeenCalled();
+ expect(actions.fetchItemsForList).toHaveBeenCalled();
});
it('does not load issues if already loading', () => {
@@ -179,7 +193,7 @@ describe('Board list component', () => {
});
wrapper.vm.listRef.dispatchEvent(new Event('scroll'));
- expect(actions.fetchIssuesForList).not.toHaveBeenCalled();
+ expect(actions.fetchItemsForList).not.toHaveBeenCalled();
});
it('shows loading more spinner', async () => {
@@ -189,7 +203,8 @@ describe('Board list component', () => {
wrapper.vm.showCount = true;
await wrapper.vm.$nextTick();
- expect(wrapper.find('.board-list-count .gl-spinner').exists()).toBe(true);
+
+ expect(findIssueCountLoadingIcon().exists()).toBe(true);
});
});
@@ -243,7 +258,7 @@ describe('Board list component', () => {
describe('handleDragOnEnd', () => {
it('removes class `is-dragging` from document body', () => {
- jest.spyOn(wrapper.vm, 'moveIssue').mockImplementation(() => {});
+ jest.spyOn(wrapper.vm, 'moveItem').mockImplementation(() => {});
document.body.classList.add('is-dragging');
findByTestId('tree-root-wrapper').vm.$emit('end', {
@@ -251,9 +266,9 @@ describe('Board list component', () => {
newIndex: 0,
item: {
dataset: {
- issueId: mockIssues[0].id,
- issueIid: mockIssues[0].iid,
- issuePath: mockIssues[0].referencePath,
+ itemId: mockIssues[0].id,
+ itemIid: mockIssues[0].iid,
+ itemPath: mockIssues[0].referencePath,
},
},
to: { children: [], dataset: { listId: 'gid://gitlab/List/1' } },
diff --git a/spec/frontend/boards/board_new_issue_deprecated_spec.js b/spec/frontend/boards/board_new_issue_deprecated_spec.js
index 1a29f680166..3903ad201b2 100644
--- a/spec/frontend/boards/board_new_issue_deprecated_spec.js
+++ b/spec/frontend/boards/board_new_issue_deprecated_spec.js
@@ -3,6 +3,7 @@
import { mount } from '@vue/test-utils';
import MockAdapter from 'axios-mock-adapter';
import Vue from 'vue';
+import Vuex from 'vuex';
import boardNewIssue from '~/boards/components/board_new_issue_deprecated.vue';
import boardsStore from '~/boards/stores/boards_store';
import axios from '~/lib/utils/axios_utils';
@@ -10,6 +11,8 @@ import axios from '~/lib/utils/axios_utils';
import '~/boards/models/list';
import { listObj, boardsMockInterceptor } from './mock_data';
+Vue.use(Vuex);
+
describe('Issue boards new issue form', () => {
let wrapper;
let vm;
@@ -43,11 +46,16 @@ describe('Issue boards new issue form', () => {
newIssueMock = Promise.resolve(promiseReturn);
jest.spyOn(list, 'newIssue').mockImplementation(() => newIssueMock);
+ const store = new Vuex.Store({
+ getters: { isGroupBoard: () => false },
+ });
+
wrapper = mount(BoardNewIssueComp, {
propsData: {
disabled: false,
list,
},
+ store,
provide: {
groupId: null,
},
diff --git a/spec/frontend/boards/components/board_add_new_column_form_spec.js b/spec/frontend/boards/components/board_add_new_column_form_spec.js
new file mode 100644
index 00000000000..3702f55f17b
--- /dev/null
+++ b/spec/frontend/boards/components/board_add_new_column_form_spec.js
@@ -0,0 +1,166 @@
+import { GlFormGroup, GlSearchBoxByType, GlSkeletonLoader } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import Vue, { nextTick } from 'vue';
+import Vuex from 'vuex';
+import { extendedWrapper } from 'helpers/vue_test_utils_helper';
+import BoardAddNewColumnForm from '~/boards/components/board_add_new_column_form.vue';
+import defaultState from '~/boards/stores/state';
+import { mockLabelList } from '../mock_data';
+
+Vue.use(Vuex);
+
+describe('Board card layout', () => {
+ let wrapper;
+
+ const createStore = ({ actions = {}, getters = {}, state = {} } = {}) => {
+ return new Vuex.Store({
+ state: {
+ ...defaultState,
+ ...state,
+ },
+ actions,
+ getters,
+ });
+ };
+
+ const mountComponent = ({
+ loading = false,
+ formDescription = '',
+ searchLabel = '',
+ searchPlaceholder = '',
+ selectedId,
+ actions,
+ slots,
+ } = {}) => {
+ wrapper = extendedWrapper(
+ shallowMount(BoardAddNewColumnForm, {
+ stubs: {
+ GlFormGroup: true,
+ },
+ propsData: {
+ loading,
+ formDescription,
+ searchLabel,
+ searchPlaceholder,
+ selectedId,
+ },
+ slots,
+ store: createStore({
+ actions: {
+ setAddColumnFormVisibility: jest.fn(),
+ ...actions,
+ },
+ }),
+ }),
+ );
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ });
+
+ const formTitle = () => wrapper.findByTestId('board-add-column-form-title').text();
+ const findSearchInput = () => wrapper.find(GlSearchBoxByType);
+ const findSearchLabel = () => wrapper.find(GlFormGroup);
+ const cancelButton = () => wrapper.findByTestId('cancelAddNewColumn');
+ const submitButton = () => wrapper.findByTestId('addNewColumnButton');
+
+ it('shows form title & search input', () => {
+ mountComponent();
+
+ expect(formTitle()).toEqual(BoardAddNewColumnForm.i18n.newList);
+ expect(findSearchInput().exists()).toBe(true);
+ });
+
+ it('clicking cancel hides the form', () => {
+ const setAddColumnFormVisibility = jest.fn();
+ mountComponent({
+ actions: {
+ setAddColumnFormVisibility,
+ },
+ });
+
+ cancelButton().vm.$emit('click');
+
+ expect(setAddColumnFormVisibility).toHaveBeenCalledWith(expect.anything(), false);
+ });
+
+ it('sets placeholder and description from props', () => {
+ const props = {
+ formDescription: 'Some description of a list',
+ };
+
+ mountComponent(props);
+
+ expect(wrapper.html()).toHaveText(props.formDescription);
+ });
+
+ describe('items', () => {
+ const mountWithItems = (loading) =>
+ mountComponent({
+ loading,
+ slots: {
+ items: '<div class="item-slot">Some kind of list</div>',
+ },
+ });
+
+ it('hides items slot and shows skeleton while loading', () => {
+ mountWithItems(true);
+
+ expect(wrapper.findComponent(GlSkeletonLoader).exists()).toBe(true);
+ expect(wrapper.find('.item-slot').exists()).toBe(false);
+ });
+
+ it('shows items slot and hides skeleton while not loading', () => {
+ mountWithItems(false);
+
+ expect(wrapper.findComponent(GlSkeletonLoader).exists()).toBe(false);
+ expect(wrapper.find('.item-slot').exists()).toBe(true);
+ });
+ });
+
+ describe('search box', () => {
+ it('sets label and placeholder text from props', () => {
+ const props = {
+ searchLabel: 'Some items',
+ searchPlaceholder: 'Search for an item',
+ };
+
+ mountComponent(props);
+
+ expect(findSearchLabel().attributes('label')).toEqual(props.searchLabel);
+ expect(findSearchInput().attributes('placeholder')).toEqual(props.searchPlaceholder);
+ });
+
+ it('emits filter event on input', () => {
+ mountComponent();
+
+ const searchText = 'some text';
+
+ findSearchInput().vm.$emit('input', searchText);
+
+ expect(wrapper.emitted('filter-items')).toEqual([[searchText]]);
+ });
+ });
+
+ describe('Add list button', () => {
+ it('is disabled if no item is selected', () => {
+ mountComponent();
+
+ expect(submitButton().props('disabled')).toBe(true);
+ });
+
+ it('emits add-list event on click', async () => {
+ mountComponent({
+ selectedId: mockLabelList.label.id,
+ });
+
+ await nextTick();
+
+ submitButton().vm.$emit('click');
+
+ expect(wrapper.emitted('add-list')).toEqual([[]]);
+ });
+ });
+});
diff --git a/spec/frontend/boards/components/board_add_new_column_spec.js b/spec/frontend/boards/components/board_add_new_column_spec.js
new file mode 100644
index 00000000000..60584eaf6cf
--- /dev/null
+++ b/spec/frontend/boards/components/board_add_new_column_spec.js
@@ -0,0 +1,115 @@
+import { shallowMount } from '@vue/test-utils';
+import Vue, { nextTick } from 'vue';
+import Vuex from 'vuex';
+import { extendedWrapper } from 'helpers/vue_test_utils_helper';
+import BoardAddNewColumn from '~/boards/components/board_add_new_column.vue';
+import BoardAddNewColumnForm from '~/boards/components/board_add_new_column_form.vue';
+import defaultState from '~/boards/stores/state';
+import { mockLabelList } from '../mock_data';
+
+Vue.use(Vuex);
+
+describe('Board card layout', () => {
+ let wrapper;
+
+ const createStore = ({ actions = {}, getters = {}, state = {} } = {}) => {
+ return new Vuex.Store({
+ state: {
+ ...defaultState,
+ ...state,
+ },
+ actions,
+ getters,
+ });
+ };
+
+ const mountComponent = ({
+ selectedId,
+ labels = [],
+ getListByLabelId = jest.fn(),
+ actions = {},
+ } = {}) => {
+ wrapper = extendedWrapper(
+ shallowMount(BoardAddNewColumn, {
+ data() {
+ return {
+ selectedId,
+ };
+ },
+ store: createStore({
+ actions: {
+ fetchLabels: jest.fn(),
+ setAddColumnFormVisibility: jest.fn(),
+ ...actions,
+ },
+ getters: {
+ shouldUseGraphQL: () => true,
+ getListByLabelId: () => getListByLabelId,
+ },
+ state: {
+ labels,
+ labelsLoading: false,
+ isEpicBoard: false,
+ },
+ }),
+ provide: {
+ scopedLabelsAvailable: true,
+ },
+ }),
+ );
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('Add list button', () => {
+ it('calls addList', async () => {
+ const getListByLabelId = jest.fn().mockReturnValue(null);
+ const highlightList = jest.fn();
+ const createList = jest.fn();
+
+ mountComponent({
+ labels: [mockLabelList.label],
+ selectedId: mockLabelList.label.id,
+ getListByLabelId,
+ actions: {
+ createList,
+ highlightList,
+ },
+ });
+
+ wrapper.findComponent(BoardAddNewColumnForm).vm.$emit('add-list');
+
+ await nextTick();
+
+ expect(highlightList).not.toHaveBeenCalled();
+ expect(createList).toHaveBeenCalledWith(expect.anything(), {
+ labelId: mockLabelList.label.id,
+ });
+ });
+
+ it('highlights existing list if trying to re-add', async () => {
+ const getListByLabelId = jest.fn().mockReturnValue(mockLabelList);
+ const highlightList = jest.fn();
+ const createList = jest.fn();
+
+ mountComponent({
+ labels: [mockLabelList.label],
+ selectedId: mockLabelList.label.id,
+ getListByLabelId,
+ actions: {
+ createList,
+ highlightList,
+ },
+ });
+
+ wrapper.findComponent(BoardAddNewColumnForm).vm.$emit('add-list');
+
+ await nextTick();
+
+ expect(highlightList).toHaveBeenCalledWith(expect.anything(), mockLabelList.id);
+ expect(createList).not.toHaveBeenCalled();
+ });
+ });
+});
diff --git a/spec/frontend/boards/components/board_card_deprecated_spec.js b/spec/frontend/boards/components/board_card_deprecated_spec.js
new file mode 100644
index 00000000000..266cbc7106d
--- /dev/null
+++ b/spec/frontend/boards/components/board_card_deprecated_spec.js
@@ -0,0 +1,219 @@
+/* global List */
+/* global ListAssignee */
+/* global ListLabel */
+
+import { mount } from '@vue/test-utils';
+
+import MockAdapter from 'axios-mock-adapter';
+import waitForPromises from 'helpers/wait_for_promises';
+import BoardCardDeprecated from '~/boards/components/board_card_deprecated.vue';
+import issueCardInner from '~/boards/components/issue_card_inner_deprecated.vue';
+import eventHub from '~/boards/eventhub';
+import store from '~/boards/stores';
+import boardsStore from '~/boards/stores/boards_store';
+import axios from '~/lib/utils/axios_utils';
+
+import sidebarEventHub from '~/sidebar/event_hub';
+import '~/boards/models/label';
+import '~/boards/models/assignee';
+import '~/boards/models/list';
+import userAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
+import { listObj, boardsMockInterceptor, setMockEndpoints } from '../mock_data';
+
+describe('BoardCard', () => {
+ let wrapper;
+ let mock;
+ let list;
+
+ const findIssueCardInner = () => wrapper.find(issueCardInner);
+ const findUserAvatarLink = () => wrapper.find(userAvatarLink);
+
+ // this particular mount component needs to be used after the root beforeEach because it depends on list being initialized
+ const mountComponent = (propsData) => {
+ wrapper = mount(BoardCardDeprecated, {
+ stubs: {
+ issueCardInner,
+ },
+ store,
+ propsData: {
+ list,
+ issue: list.issues[0],
+ disabled: false,
+ index: 0,
+ ...propsData,
+ },
+ provide: {
+ groupId: null,
+ rootPath: '/',
+ scopedLabelsAvailable: false,
+ },
+ });
+ };
+
+ const setupData = async () => {
+ list = new List(listObj);
+ boardsStore.create();
+ boardsStore.detail.issue = {};
+ const label1 = new ListLabel({
+ id: 3,
+ title: 'testing 123',
+ color: '#000cff',
+ text_color: 'white',
+ description: 'test',
+ });
+ await waitForPromises();
+
+ list.issues[0].labels.push(label1);
+ };
+
+ beforeEach(() => {
+ mock = new MockAdapter(axios);
+ mock.onAny().reply(boardsMockInterceptor);
+ setMockEndpoints();
+ return setupData();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ list = null;
+ mock.restore();
+ });
+
+ it('when details issue is empty does not show the element', () => {
+ mountComponent();
+ expect(wrapper.find('[data-testid="board_card"').classes()).not.toContain('is-active');
+ });
+
+ it('when detailIssue is equal to card issue shows the element', () => {
+ [boardsStore.detail.issue] = list.issues;
+ mountComponent();
+
+ expect(wrapper.classes()).toContain('is-active');
+ });
+
+ it('when multiSelect does not contain issue removes multi select class', () => {
+ mountComponent();
+ expect(wrapper.classes()).not.toContain('multi-select');
+ });
+
+ it('when multiSelect contain issue add multi select class', () => {
+ boardsStore.multiSelect.list = [list.issues[0]];
+ mountComponent();
+
+ expect(wrapper.classes()).toContain('multi-select');
+ });
+
+ it('adds user-can-drag class if not disabled', () => {
+ mountComponent();
+ expect(wrapper.classes()).toContain('user-can-drag');
+ });
+
+ it('does not add user-can-drag class disabled', () => {
+ mountComponent({ disabled: true });
+
+ expect(wrapper.classes()).not.toContain('user-can-drag');
+ });
+
+ it('does not add disabled class', () => {
+ mountComponent();
+ expect(wrapper.classes()).not.toContain('is-disabled');
+ });
+
+ it('adds disabled class is disabled is true', () => {
+ mountComponent({ disabled: true });
+
+ expect(wrapper.classes()).toContain('is-disabled');
+ });
+
+ describe('mouse events', () => {
+ it('does not set detail issue if showDetail is false', () => {
+ mountComponent();
+ expect(boardsStore.detail.issue).toEqual({});
+ });
+
+ it('does not set detail issue if link is clicked', () => {
+ mountComponent();
+ findIssueCardInner().find('a').trigger('mouseup');
+
+ expect(boardsStore.detail.issue).toEqual({});
+ });
+
+ it('does not set detail issue if img is clicked', () => {
+ mountComponent({
+ issue: {
+ ...list.issues[0],
+ assignees: [
+ new ListAssignee({
+ id: 1,
+ name: 'testing 123',
+ username: 'test',
+ avatar: 'test_image',
+ }),
+ ],
+ },
+ });
+
+ findUserAvatarLink().trigger('mouseup');
+
+ expect(boardsStore.detail.issue).toEqual({});
+ });
+
+ it('does not set detail issue if showDetail is false after mouseup', () => {
+ mountComponent();
+ wrapper.trigger('mouseup');
+
+ expect(boardsStore.detail.issue).toEqual({});
+ });
+
+ it('sets detail issue to card issue on mouse up', () => {
+ jest.spyOn(eventHub, '$emit').mockImplementation(() => {});
+
+ mountComponent();
+
+ wrapper.trigger('mousedown');
+ wrapper.trigger('mouseup');
+
+ expect(eventHub.$emit).toHaveBeenCalledWith('newDetailIssue', wrapper.vm.issue, false);
+ expect(boardsStore.detail.list).toEqual(wrapper.vm.list);
+ });
+
+ it('resets detail issue to empty if already set', () => {
+ jest.spyOn(eventHub, '$emit').mockImplementation(() => {});
+ const [issue] = list.issues;
+ boardsStore.detail.issue = issue;
+ mountComponent();
+
+ wrapper.trigger('mousedown');
+ wrapper.trigger('mouseup');
+
+ expect(eventHub.$emit).toHaveBeenCalledWith('clearDetailIssue', false);
+ });
+ });
+
+ describe('sidebarHub events', () => {
+ it('closes all sidebars before showing an issue if no issues are opened', () => {
+ jest.spyOn(sidebarEventHub, '$emit').mockImplementation(() => {});
+ boardsStore.detail.issue = {};
+ mountComponent();
+
+ // sets conditional so that event is emitted.
+ wrapper.trigger('mousedown');
+
+ wrapper.trigger('mouseup');
+
+ expect(sidebarEventHub.$emit).toHaveBeenCalledWith('sidebar.closeAll');
+ });
+
+ it('it does not closes all sidebars before showing an issue if an issue is opened', () => {
+ jest.spyOn(sidebarEventHub, '$emit').mockImplementation(() => {});
+ const [issue] = list.issues;
+ boardsStore.detail.issue = issue;
+ mountComponent();
+
+ wrapper.trigger('mousedown');
+
+ expect(sidebarEventHub.$emit).not.toHaveBeenCalledWith('sidebar.closeAll');
+ });
+ });
+});
diff --git a/spec/frontend/boards/components/board_card_layout_deprecated_spec.js b/spec/frontend/boards/components/board_card_layout_deprecated_spec.js
index 426c5289ba6..9853c9f434f 100644
--- a/spec/frontend/boards/components/board_card_layout_deprecated_spec.js
+++ b/spec/frontend/boards/components/board_card_layout_deprecated_spec.js
@@ -11,7 +11,7 @@ import '~/boards/models/label';
import '~/boards/models/assignee';
import '~/boards/models/list';
import BoardCardLayout from '~/boards/components/board_card_layout_deprecated.vue';
-import issueCardInner from '~/boards/components/issue_card_inner.vue';
+import issueCardInner from '~/boards/components/issue_card_inner_deprecated.vue';
import { ISSUABLE } from '~/boards/constants';
import boardsVuexStore from '~/boards/stores';
import boardsStore from '~/boards/stores/boards_store';
diff --git a/spec/frontend/boards/components/board_card_layout_spec.js b/spec/frontend/boards/components/board_card_layout_spec.js
deleted file mode 100644
index 3fa8714807c..00000000000
--- a/spec/frontend/boards/components/board_card_layout_spec.js
+++ /dev/null
@@ -1,116 +0,0 @@
-import { createLocalVue, shallowMount } from '@vue/test-utils';
-import Vuex from 'vuex';
-
-import BoardCardLayout from '~/boards/components/board_card_layout.vue';
-import IssueCardInner from '~/boards/components/issue_card_inner.vue';
-import { ISSUABLE } from '~/boards/constants';
-import defaultState from '~/boards/stores/state';
-import { mockLabelList, mockIssue } from '../mock_data';
-
-describe('Board card layout', () => {
- let wrapper;
- let store;
-
- const localVue = createLocalVue();
- localVue.use(Vuex);
-
- const createStore = ({ getters = {}, actions = {} } = {}) => {
- store = new Vuex.Store({
- state: defaultState,
- actions,
- getters,
- });
- };
-
- // this particular mount component needs to be used after the root beforeEach because it depends on list being initialized
- const mountComponent = ({ propsData = {}, provide = {} } = {}) => {
- wrapper = shallowMount(BoardCardLayout, {
- localVue,
- stubs: {
- IssueCardInner,
- },
- store,
- propsData: {
- list: mockLabelList,
- issue: mockIssue,
- disabled: false,
- index: 0,
- ...propsData,
- },
- provide: {
- groupId: null,
- rootPath: '/',
- scopedLabelsAvailable: false,
- ...provide,
- },
- });
- };
-
- afterEach(() => {
- wrapper.destroy();
- wrapper = null;
- });
-
- describe('mouse events', () => {
- it('sets showDetail to true on mousedown', async () => {
- createStore();
- mountComponent();
-
- wrapper.trigger('mousedown');
- await wrapper.vm.$nextTick();
-
- expect(wrapper.vm.showDetail).toBe(true);
- });
-
- it('sets showDetail to false on mousemove', async () => {
- createStore();
- mountComponent();
- wrapper.trigger('mousedown');
- await wrapper.vm.$nextTick();
- expect(wrapper.vm.showDetail).toBe(true);
- wrapper.trigger('mousemove');
- await wrapper.vm.$nextTick();
- expect(wrapper.vm.showDetail).toBe(false);
- });
-
- it("calls 'setActiveId'", async () => {
- const setActiveId = jest.fn();
- createStore({
- actions: {
- setActiveId,
- },
- });
- mountComponent();
-
- wrapper.trigger('mouseup');
- await wrapper.vm.$nextTick();
-
- expect(setActiveId).toHaveBeenCalledTimes(1);
- expect(setActiveId).toHaveBeenCalledWith(expect.any(Object), {
- id: mockIssue.id,
- sidebarType: ISSUABLE,
- });
- });
-
- it("calls 'setActiveId' when epic swimlanes is active", async () => {
- const setActiveId = jest.fn();
- const isSwimlanesOn = () => true;
- createStore({
- getters: { isSwimlanesOn },
- actions: {
- setActiveId,
- },
- });
- mountComponent();
-
- wrapper.trigger('mouseup');
- await wrapper.vm.$nextTick();
-
- expect(setActiveId).toHaveBeenCalledTimes(1);
- expect(setActiveId).toHaveBeenCalledWith(expect.any(Object), {
- id: mockIssue.id,
- sidebarType: ISSUABLE,
- });
- });
- });
-});
diff --git a/spec/frontend/boards/components/board_card_spec.js b/spec/frontend/boards/components/board_card_spec.js
index 5f26ae1bb3b..022f8c05e1e 100644
--- a/spec/frontend/boards/components/board_card_spec.js
+++ b/spec/frontend/boards/components/board_card_spec.js
@@ -1,43 +1,50 @@
-/* global List */
-/* global ListAssignee */
-/* global ListLabel */
+import { createLocalVue, shallowMount } from '@vue/test-utils';
+import Vuex from 'vuex';
-import { mount } from '@vue/test-utils';
-
-import MockAdapter from 'axios-mock-adapter';
-import waitForPromises from 'helpers/wait_for_promises';
import BoardCard from '~/boards/components/board_card.vue';
-import issueCardInner from '~/boards/components/issue_card_inner.vue';
-import eventHub from '~/boards/eventhub';
-import store from '~/boards/stores';
-import boardsStore from '~/boards/stores/boards_store';
-import axios from '~/lib/utils/axios_utils';
-
-import sidebarEventHub from '~/sidebar/event_hub';
-import '~/boards/models/label';
-import '~/boards/models/assignee';
-import '~/boards/models/list';
-import userAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
-import { listObj, boardsMockInterceptor, setMockEndpoints } from '../mock_data';
-
-describe('BoardCard', () => {
- let wrapper;
- let mock;
- let list;
+import BoardCardInner from '~/boards/components/board_card_inner.vue';
+import { inactiveId } from '~/boards/constants';
+import { mockLabelList, mockIssue } from '../mock_data';
- const findIssueCardInner = () => wrapper.find(issueCardInner);
- const findUserAvatarLink = () => wrapper.find(userAvatarLink);
+describe('Board card', () => {
+ let wrapper;
+ let store;
+ let mockActions;
+
+ const localVue = createLocalVue();
+ localVue.use(Vuex);
+
+ const createStore = ({ initialState = {}, isSwimlanesOn = false } = {}) => {
+ mockActions = {
+ toggleBoardItem: jest.fn(),
+ toggleBoardItemMultiSelection: jest.fn(),
+ };
+
+ store = new Vuex.Store({
+ state: {
+ activeId: inactiveId,
+ selectedBoardItems: [],
+ ...initialState,
+ },
+ actions: mockActions,
+ getters: {
+ isSwimlanesOn: () => isSwimlanesOn,
+ isEpicBoard: () => false,
+ },
+ });
+ };
// this particular mount component needs to be used after the root beforeEach because it depends on list being initialized
- const mountComponent = (propsData) => {
- wrapper = mount(BoardCard, {
+ const mountComponent = ({ propsData = {}, provide = {} } = {}) => {
+ wrapper = shallowMount(BoardCard, {
+ localVue,
stubs: {
- issueCardInner,
+ BoardCardInner,
},
store,
propsData: {
- list,
- issue: list.issues[0],
+ list: mockLabelList,
+ item: mockIssue,
disabled: false,
index: 0,
...propsData,
@@ -46,174 +53,94 @@ describe('BoardCard', () => {
groupId: null,
rootPath: '/',
scopedLabelsAvailable: false,
+ ...provide,
},
});
};
- const setupData = async () => {
- list = new List(listObj);
- boardsStore.create();
- boardsStore.detail.issue = {};
- const label1 = new ListLabel({
- id: 3,
- title: 'testing 123',
- color: '#000cff',
- text_color: 'white',
- description: 'test',
- });
- await waitForPromises();
-
- list.issues[0].labels.push(label1);
+ const selectCard = async () => {
+ wrapper.trigger('mouseup');
+ await wrapper.vm.$nextTick();
};
- beforeEach(() => {
- mock = new MockAdapter(axios);
- mock.onAny().reply(boardsMockInterceptor);
- setMockEndpoints();
- return setupData();
- });
+ const multiSelectCard = async () => {
+ wrapper.trigger('mouseup', { ctrlKey: true });
+ await wrapper.vm.$nextTick();
+ };
afterEach(() => {
wrapper.destroy();
wrapper = null;
- list = null;
- mock.restore();
- });
-
- it('when details issue is empty does not show the element', () => {
- mountComponent();
- expect(wrapper.find('[data-testid="board_card"').classes()).not.toContain('is-active');
- });
-
- it('when detailIssue is equal to card issue shows the element', () => {
- [boardsStore.detail.issue] = list.issues;
- mountComponent();
-
- expect(wrapper.classes()).toContain('is-active');
- });
-
- it('when multiSelect does not contain issue removes multi select class', () => {
- mountComponent();
- expect(wrapper.classes()).not.toContain('multi-select');
- });
-
- it('when multiSelect contain issue add multi select class', () => {
- boardsStore.multiSelect.list = [list.issues[0]];
- mountComponent();
-
- expect(wrapper.classes()).toContain('multi-select');
- });
-
- it('adds user-can-drag class if not disabled', () => {
- mountComponent();
- expect(wrapper.classes()).toContain('user-can-drag');
- });
-
- it('does not add user-can-drag class disabled', () => {
- mountComponent({ disabled: true });
-
- expect(wrapper.classes()).not.toContain('user-can-drag');
- });
-
- it('does not add disabled class', () => {
- mountComponent();
- expect(wrapper.classes()).not.toContain('is-disabled');
+ store = null;
});
- it('adds disabled class is disabled is true', () => {
- mountComponent({ disabled: true });
-
- expect(wrapper.classes()).toContain('is-disabled');
- });
-
- describe('mouse events', () => {
- it('does not set detail issue if showDetail is false', () => {
+ describe.each`
+ isSwimlanesOn
+ ${true} | ${false}
+ `('when isSwimlanesOn is $isSwimlanesOn', ({ isSwimlanesOn }) => {
+ it('should not highlight the card by default', async () => {
+ createStore({ isSwimlanesOn });
mountComponent();
- expect(boardsStore.detail.issue).toEqual({});
- });
- it('does not set detail issue if link is clicked', () => {
- mountComponent();
- findIssueCardInner().find('a').trigger('mouseup');
-
- expect(boardsStore.detail.issue).toEqual({});
+ expect(wrapper.classes()).not.toContain('is-active');
+ expect(wrapper.classes()).not.toContain('multi-select');
});
- it('does not set detail issue if img is clicked', () => {
- mountComponent({
- issue: {
- ...list.issues[0],
- assignees: [
- new ListAssignee({
- id: 1,
- name: 'testing 123',
- username: 'test',
- avatar: 'test_image',
- }),
- ],
+ it('should highlight the card with a correct style when selected', async () => {
+ createStore({
+ initialState: {
+ activeId: mockIssue.id,
},
+ isSwimlanesOn,
});
-
- findUserAvatarLink().trigger('mouseup');
-
- expect(boardsStore.detail.issue).toEqual({});
- });
-
- it('does not set detail issue if showDetail is false after mouseup', () => {
- mountComponent();
- wrapper.trigger('mouseup');
-
- expect(boardsStore.detail.issue).toEqual({});
- });
-
- it('sets detail issue to card issue on mouse up', () => {
- jest.spyOn(eventHub, '$emit').mockImplementation(() => {});
-
mountComponent();
- wrapper.trigger('mousedown');
- wrapper.trigger('mouseup');
-
- expect(eventHub.$emit).toHaveBeenCalledWith('newDetailIssue', wrapper.vm.issue, false);
- expect(boardsStore.detail.list).toEqual(wrapper.vm.list);
+ expect(wrapper.classes()).toContain('is-active');
+ expect(wrapper.classes()).not.toContain('multi-select');
});
- it('resets detail issue to empty if already set', () => {
- jest.spyOn(eventHub, '$emit').mockImplementation(() => {});
- const [issue] = list.issues;
- boardsStore.detail.issue = issue;
+ it('should highlight the card with a correct style when multi-selected', async () => {
+ createStore({
+ initialState: {
+ activeId: inactiveId,
+ selectedBoardItems: [mockIssue],
+ },
+ isSwimlanesOn,
+ });
mountComponent();
- wrapper.trigger('mousedown');
- wrapper.trigger('mouseup');
-
- expect(eventHub.$emit).toHaveBeenCalledWith('clearDetailIssue', false);
+ expect(wrapper.classes()).toContain('multi-select');
+ expect(wrapper.classes()).not.toContain('is-active');
});
- });
-
- describe('sidebarHub events', () => {
- it('closes all sidebars before showing an issue if no issues are opened', () => {
- jest.spyOn(sidebarEventHub, '$emit').mockImplementation(() => {});
- boardsStore.detail.issue = {};
- mountComponent();
-
- // sets conditional so that event is emitted.
- wrapper.trigger('mousedown');
- wrapper.trigger('mouseup');
+ describe('when mouseup event is called on the card', () => {
+ beforeEach(() => {
+ createStore({ isSwimlanesOn });
+ mountComponent();
+ });
- expect(sidebarEventHub.$emit).toHaveBeenCalledWith('sidebar.closeAll');
- });
+ describe('when not using multi-select', () => {
+ it('should call vuex action "toggleBoardItem" with correct parameters', async () => {
+ await selectCard();
- it('it does not closes all sidebars before showing an issue if an issue is opened', () => {
- jest.spyOn(sidebarEventHub, '$emit').mockImplementation(() => {});
- const [issue] = list.issues;
- boardsStore.detail.issue = issue;
- mountComponent();
+ expect(mockActions.toggleBoardItem).toHaveBeenCalledTimes(1);
+ expect(mockActions.toggleBoardItem).toHaveBeenCalledWith(expect.any(Object), {
+ boardItem: mockIssue,
+ });
+ });
+ });
- wrapper.trigger('mousedown');
+ describe('when using multi-select', () => {
+ it('should call vuex action "multiSelectBoardItem" with correct parameters', async () => {
+ await multiSelectCard();
- expect(sidebarEventHub.$emit).not.toHaveBeenCalledWith('sidebar.closeAll');
+ expect(mockActions.toggleBoardItemMultiSelection).toHaveBeenCalledTimes(1);
+ expect(mockActions.toggleBoardItemMultiSelection).toHaveBeenCalledWith(
+ expect.any(Object),
+ mockIssue,
+ );
+ });
+ });
});
});
});
diff --git a/spec/frontend/boards/components/board_form_spec.js b/spec/frontend/boards/components/board_form_spec.js
index 858efea99ad..32499bd5480 100644
--- a/spec/frontend/boards/components/board_form_spec.js
+++ b/spec/frontend/boards/components/board_form_spec.js
@@ -8,6 +8,7 @@ import { formType } from '~/boards/constants';
import createBoardMutation from '~/boards/graphql/board_create.mutation.graphql';
import destroyBoardMutation from '~/boards/graphql/board_destroy.mutation.graphql';
import updateBoardMutation from '~/boards/graphql/board_update.mutation.graphql';
+import { createStore } from '~/boards/stores';
import { deprecatedCreateFlash as createFlash } from '~/flash';
import { visitUrl } from '~/lib/utils/url_utility';
@@ -48,6 +49,13 @@ describe('BoardForm', () => {
const findDeleteConfirmation = () => wrapper.find('[data-testid="delete-confirmation-message"]');
const findInput = () => wrapper.find('#board-new-name');
+ const store = createStore({
+ getters: {
+ isGroupBoard: () => true,
+ isProjectBoard: () => false,
+ },
+ });
+
const createComponent = (props, data) => {
wrapper = shallowMount(BoardForm, {
propsData: { ...defaultProps, ...props },
@@ -64,6 +72,7 @@ describe('BoardForm', () => {
mutate,
},
},
+ store,
attachTo: document.body,
});
};
diff --git a/spec/frontend/boards/components/board_list_header_spec.js b/spec/frontend/boards/components/board_list_header_spec.js
index f30e3792435..d2dfb4148b3 100644
--- a/spec/frontend/boards/components/board_list_header_spec.js
+++ b/spec/frontend/boards/components/board_list_header_spec.js
@@ -1,5 +1,6 @@
import { shallowMount, createLocalVue } from '@vue/test-utils';
import Vuex from 'vuex';
+import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import { mockLabelList } from 'jest/boards/mock_data';
import BoardListHeader from '~/boards/components/board_list_header.vue';
@@ -14,6 +15,7 @@ describe('Board List Header Component', () => {
let store;
const updateListSpy = jest.fn();
+ const toggleListCollapsedSpy = jest.fn();
afterEach(() => {
wrapper.destroy();
@@ -43,38 +45,39 @@ describe('Board List Header Component', () => {
if (withLocalStorage) {
localStorage.setItem(
- `boards.${boardId}.${listMock.listType}.${listMock.id}.expanded`,
- (!collapsed).toString(),
+ `boards.${boardId}.${listMock.listType}.${listMock.id}.collapsed`,
+ collapsed.toString(),
);
}
store = new Vuex.Store({
state: {},
- actions: { updateList: updateListSpy },
- getters: {},
+ actions: { updateList: updateListSpy, toggleListCollapsed: toggleListCollapsedSpy },
+ getters: { isEpicBoard: () => false },
});
- wrapper = shallowMount(BoardListHeader, {
- store,
- localVue,
- propsData: {
- disabled: false,
- list: listMock,
- },
- provide: {
- boardId,
- weightFeatureAvailable: false,
- currentUserId,
- },
- });
+ wrapper = extendedWrapper(
+ shallowMount(BoardListHeader, {
+ store,
+ localVue,
+ propsData: {
+ disabled: false,
+ list: listMock,
+ },
+ provide: {
+ boardId,
+ weightFeatureAvailable: false,
+ currentUserId,
+ },
+ }),
+ );
};
const isCollapsed = () => wrapper.vm.list.collapsed;
- const isExpanded = () => !isCollapsed;
const findAddIssueButton = () => wrapper.find({ ref: 'newIssueBtn' });
const findTitle = () => wrapper.find('.board-title');
- const findCaret = () => wrapper.find('.board-title-caret');
+ const findCaret = () => wrapper.findByTestId('board-title-caret');
describe('Add issue button', () => {
const hasNoAddButton = [ListType.closed];
@@ -114,40 +117,29 @@ describe('Board List Header Component', () => {
});
describe('expanding / collapsing the column', () => {
- it('does not collapse when clicking the header', async () => {
+ it('should display collapse icon when column is expanded', async () => {
createComponent();
- expect(isCollapsed()).toBe(false);
-
- wrapper.find('[data-testid="board-list-header"]').trigger('click');
+ const icon = findCaret();
- await wrapper.vm.$nextTick();
-
- expect(isCollapsed()).toBe(false);
+ expect(icon.props('icon')).toBe('chevron-right');
});
- it('collapses expanded Column when clicking the collapse icon', async () => {
- createComponent();
-
- expect(isCollapsed()).toBe(false);
-
- findCaret().vm.$emit('click');
+ it('should display expand icon when column is collapsed', async () => {
+ createComponent({ collapsed: true });
- await wrapper.vm.$nextTick();
+ const icon = findCaret();
- expect(isCollapsed()).toBe(true);
+ expect(icon.props('icon')).toBe('chevron-down');
});
- it('expands collapsed Column when clicking the expand icon', async () => {
- createComponent({ collapsed: true });
-
- expect(isCollapsed()).toBe(true);
+ it('should dispatch toggleListCollapse when clicking the collapse icon', async () => {
+ createComponent();
findCaret().vm.$emit('click');
await wrapper.vm.$nextTick();
-
- expect(isCollapsed()).toBe(false);
+ expect(toggleListCollapsedSpy).toHaveBeenCalledTimes(1);
});
it("when logged in it calls list update and doesn't set localStorage", async () => {
@@ -157,7 +149,7 @@ describe('Board List Header Component', () => {
await wrapper.vm.$nextTick();
expect(updateListSpy).toHaveBeenCalledTimes(1);
- expect(localStorage.getItem(`${wrapper.vm.uniqueKey}.expanded`)).toBe(null);
+ expect(localStorage.getItem(`${wrapper.vm.uniqueKey}.collapsed`)).toBe(null);
});
it("when logged out it doesn't call list update and sets localStorage", async () => {
@@ -167,7 +159,7 @@ describe('Board List Header Component', () => {
await wrapper.vm.$nextTick();
expect(updateListSpy).not.toHaveBeenCalled();
- expect(localStorage.getItem(`${wrapper.vm.uniqueKey}.expanded`)).toBe(String(isExpanded()));
+ expect(localStorage.getItem(`${wrapper.vm.uniqueKey}.collapsed`)).toBe(String(isCollapsed()));
});
});
diff --git a/spec/frontend/boards/components/board_new_issue_spec.js b/spec/frontend/boards/components/board_new_issue_spec.js
index ce8c95527e9..737a18294bc 100644
--- a/spec/frontend/boards/components/board_new_issue_spec.js
+++ b/spec/frontend/boards/components/board_new_issue_spec.js
@@ -2,7 +2,6 @@ import { shallowMount, createLocalVue } from '@vue/test-utils';
import Vuex from 'vuex';
import BoardNewIssue from '~/boards/components/board_new_issue.vue';
-import '~/boards/models/list';
import { mockList, mockGroupProjects } from '../mock_data';
const localVue = createLocalVue();
@@ -31,7 +30,7 @@ describe('Issue boards new issue form', () => {
const store = new Vuex.Store({
state: { selectedProject: mockGroupProjects[0] },
actions: { addListNewIssue: addListNewIssuesSpy },
- getters: {},
+ getters: { isGroupBoard: () => false, isProjectBoard: () => true },
});
wrapper = shallowMount(BoardNewIssue, {
diff --git a/spec/frontend/boards/components/filtered_search_spec.js b/spec/frontend/boards/components/filtered_search_spec.js
new file mode 100644
index 00000000000..7f238aa671f
--- /dev/null
+++ b/spec/frontend/boards/components/filtered_search_spec.js
@@ -0,0 +1,65 @@
+import { createLocalVue, shallowMount } from '@vue/test-utils';
+import Vuex from 'vuex';
+import FilteredSearch from '~/boards/components/filtered_search.vue';
+import { createStore } from '~/boards/stores';
+import * as commonUtils from '~/lib/utils/common_utils';
+import FilteredSearchBarRoot from '~/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue';
+
+const localVue = createLocalVue();
+localVue.use(Vuex);
+
+describe('FilteredSearch', () => {
+ let wrapper;
+ let store;
+
+ const createComponent = () => {
+ wrapper = shallowMount(FilteredSearch, {
+ localVue,
+ propsData: { search: '' },
+ store,
+ attachTo: document.body,
+ });
+ };
+
+ beforeEach(() => {
+ // this needed for actions call for performSearch
+ window.gon = { features: {} };
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('default', () => {
+ beforeEach(() => {
+ store = createStore();
+
+ jest.spyOn(store, 'dispatch');
+
+ createComponent();
+ });
+
+ it('finds FilteredSearch', () => {
+ expect(wrapper.find(FilteredSearchBarRoot).exists()).toBe(true);
+ });
+
+ describe('when onFilter is emitted', () => {
+ it('calls performSearch', () => {
+ wrapper.find(FilteredSearchBarRoot).vm.$emit('onFilter', [{ value: { data: '' } }]);
+
+ expect(store.dispatch).toHaveBeenCalledWith('performSearch');
+ });
+
+ it('calls historyPushState', () => {
+ commonUtils.historyPushState = jest.fn();
+ wrapper
+ .find(FilteredSearchBarRoot)
+ .vm.$emit('onFilter', [{ value: { data: 'searchQuery' } }]);
+
+ expect(commonUtils.historyPushState).toHaveBeenCalledWith(
+ 'http://test.host/?search=searchQuery',
+ );
+ });
+ });
+ });
+});
diff --git a/spec/frontend/boards/components/sidebar/board_sidebar_due_date_spec.js b/spec/frontend/boards/components/sidebar/board_sidebar_due_date_spec.js
index 7838b5a0b2f..8fd178a0856 100644
--- a/spec/frontend/boards/components/sidebar/board_sidebar_due_date_spec.js
+++ b/spec/frontend/boards/components/sidebar/board_sidebar_due_date_spec.js
@@ -24,7 +24,7 @@ describe('~/boards/components/sidebar/board_sidebar_due_date.vue', () => {
const createWrapper = ({ dueDate = null } = {}) => {
store = createStore();
- store.state.issues = { [TEST_ISSUE.id]: { ...TEST_ISSUE, dueDate } };
+ store.state.boardItems = { [TEST_ISSUE.id]: { ...TEST_ISSUE, dueDate } };
store.state.activeId = TEST_ISSUE.id;
wrapper = shallowMount(BoardSidebarDueDate, {
@@ -61,7 +61,7 @@ describe('~/boards/components/sidebar/board_sidebar_due_date.vue', () => {
createWrapper();
jest.spyOn(wrapper.vm, 'setActiveIssueDueDate').mockImplementation(() => {
- store.state.issues[TEST_ISSUE.id].dueDate = TEST_DUE_DATE;
+ store.state.boardItems[TEST_ISSUE.id].dueDate = TEST_DUE_DATE;
});
findDatePicker().vm.$emit('input', TEST_PARSED_DATE);
await wrapper.vm.$nextTick();
@@ -86,7 +86,7 @@ describe('~/boards/components/sidebar/board_sidebar_due_date.vue', () => {
createWrapper();
jest.spyOn(wrapper.vm, 'setActiveIssueDueDate').mockImplementation(() => {
- store.state.issues[TEST_ISSUE.id].dueDate = null;
+ store.state.boardItems[TEST_ISSUE.id].dueDate = null;
});
findDatePicker().vm.$emit('clear');
await wrapper.vm.$nextTick();
@@ -104,7 +104,7 @@ describe('~/boards/components/sidebar/board_sidebar_due_date.vue', () => {
createWrapper({ dueDate: TEST_DUE_DATE });
jest.spyOn(wrapper.vm, 'setActiveIssueDueDate').mockImplementation(() => {
- store.state.issues[TEST_ISSUE.id].dueDate = null;
+ store.state.boardItems[TEST_ISSUE.id].dueDate = null;
});
findResetButton().vm.$emit('click');
await wrapper.vm.$nextTick();
diff --git a/spec/frontend/boards/components/sidebar/board_sidebar_issue_title_spec.js b/spec/frontend/boards/components/sidebar/board_sidebar_issue_title_spec.js
index bc7df1c76c6..723d0345f76 100644
--- a/spec/frontend/boards/components/sidebar/board_sidebar_issue_title_spec.js
+++ b/spec/frontend/boards/components/sidebar/board_sidebar_issue_title_spec.js
@@ -34,7 +34,7 @@ describe('~/boards/components/sidebar/board_sidebar_issue_title.vue', () => {
const createWrapper = (issue = TEST_ISSUE_A) => {
store = createStore();
- store.state.issues = { [issue.id]: { ...issue } };
+ store.state.boardItems = { [issue.id]: { ...issue } };
store.dispatch('setActiveId', { id: issue.id });
wrapper = shallowMount(BoardSidebarIssueTitle, {
@@ -74,7 +74,7 @@ describe('~/boards/components/sidebar/board_sidebar_issue_title.vue', () => {
createWrapper();
jest.spyOn(wrapper.vm, 'setActiveIssueTitle').mockImplementation(() => {
- store.state.issues[TEST_ISSUE_A.id].title = TEST_TITLE;
+ store.state.boardItems[TEST_ISSUE_A.id].title = TEST_TITLE;
});
findFormInput().vm.$emit('input', TEST_TITLE);
findForm().vm.$emit('submit', { preventDefault: () => {} });
@@ -147,7 +147,7 @@ describe('~/boards/components/sidebar/board_sidebar_issue_title.vue', () => {
createWrapper(TEST_ISSUE_B);
jest.spyOn(wrapper.vm, 'setActiveIssueTitle').mockImplementation(() => {
- store.state.issues[TEST_ISSUE_B.id].title = TEST_TITLE;
+ store.state.boardItems[TEST_ISSUE_B.id].title = TEST_TITLE;
});
findFormInput().vm.$emit('input', TEST_TITLE);
findCancelButton().vm.$emit('click');
diff --git a/spec/frontend/boards/components/sidebar/board_sidebar_labels_select_spec.js b/spec/frontend/boards/components/sidebar/board_sidebar_labels_select_spec.js
index 12b873ba7d8..98ac211238c 100644
--- a/spec/frontend/boards/components/sidebar/board_sidebar_labels_select_spec.js
+++ b/spec/frontend/boards/components/sidebar/board_sidebar_labels_select_spec.js
@@ -25,7 +25,7 @@ describe('~/boards/components/sidebar/board_sidebar_labels_select.vue', () => {
const createWrapper = ({ labels = [] } = {}) => {
store = createStore();
- store.state.issues = { [TEST_ISSUE.id]: { ...TEST_ISSUE, labels } };
+ store.state.boardItems = { [TEST_ISSUE.id]: { ...TEST_ISSUE, labels } };
store.state.activeId = TEST_ISSUE.id;
wrapper = shallowMount(BoardSidebarLabelsSelect, {
@@ -66,7 +66,7 @@ describe('~/boards/components/sidebar/board_sidebar_labels_select.vue', () => {
jest.spyOn(wrapper.vm, 'setActiveIssueLabels').mockImplementation(() => TEST_LABELS);
findLabelsSelect().vm.$emit('updateSelectedLabels', TEST_LABELS_PAYLOAD);
- store.state.issues[TEST_ISSUE.id].labels = TEST_LABELS;
+ store.state.boardItems[TEST_ISSUE.id].labels = TEST_LABELS;
await wrapper.vm.$nextTick();
});
diff --git a/spec/frontend/boards/components/sidebar/board_sidebar_milestone_select_spec.js b/spec/frontend/boards/components/sidebar/board_sidebar_milestone_select_spec.js
index 8820ec7ae63..8706424a296 100644
--- a/spec/frontend/boards/components/sidebar/board_sidebar_milestone_select_spec.js
+++ b/spec/frontend/boards/components/sidebar/board_sidebar_milestone_select_spec.js
@@ -22,7 +22,7 @@ describe('~/boards/components/sidebar/board_sidebar_milestone_select.vue', () =>
const createWrapper = ({ milestone = null, loading = false } = {}) => {
store = createStore();
- store.state.issues = { [TEST_ISSUE.id]: { ...TEST_ISSUE, milestone } };
+ store.state.boardItems = { [TEST_ISSUE.id]: { ...TEST_ISSUE, milestone } };
store.state.activeId = TEST_ISSUE.id;
wrapper = shallowMount(BoardSidebarMilestoneSelect, {
@@ -113,7 +113,7 @@ describe('~/boards/components/sidebar/board_sidebar_milestone_select.vue', () =>
createWrapper();
jest.spyOn(wrapper.vm, 'setActiveIssueMilestone').mockImplementation(() => {
- store.state.issues[TEST_ISSUE.id].milestone = TEST_MILESTONE;
+ store.state.boardItems[TEST_ISSUE.id].milestone = TEST_MILESTONE;
});
findDropdownItem().vm.$emit('click');
await wrapper.vm.$nextTick();
@@ -137,7 +137,7 @@ describe('~/boards/components/sidebar/board_sidebar_milestone_select.vue', () =>
createWrapper({ milestone: TEST_MILESTONE });
jest.spyOn(wrapper.vm, 'setActiveIssueMilestone').mockImplementation(() => {
- store.state.issues[TEST_ISSUE.id].milestone = null;
+ store.state.boardItems[TEST_ISSUE.id].milestone = null;
});
findUnsetMilestoneItem().vm.$emit('click');
await wrapper.vm.$nextTick();
diff --git a/spec/frontend/boards/components/sidebar/board_sidebar_subscription_spec.js b/spec/frontend/boards/components/sidebar/board_sidebar_subscription_spec.js
index 3e6b0be0267..d2d10563ae5 100644
--- a/spec/frontend/boards/components/sidebar/board_sidebar_subscription_spec.js
+++ b/spec/frontend/boards/components/sidebar/board_sidebar_subscription_spec.js
@@ -22,7 +22,7 @@ describe('~/boards/components/sidebar/board_sidebar_subscription_spec.vue', () =
const createComponent = (activeIssue = { ...mockActiveIssue }) => {
store = createStore();
- store.state.issues = { [activeIssue.id]: activeIssue };
+ store.state.boardItems = { [activeIssue.id]: activeIssue };
store.state.activeId = activeIssue.id;
wrapper = mount(BoardSidebarSubscription, {
diff --git a/spec/frontend/boards/components/sidebar/remove_issue_spec.js b/spec/frontend/boards/components/sidebar/remove_issue_spec.js
deleted file mode 100644
index 1f740c10106..00000000000
--- a/spec/frontend/boards/components/sidebar/remove_issue_spec.js
+++ /dev/null
@@ -1,28 +0,0 @@
-import { GlButton } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-
-import RemoveIssue from '~/boards/components/sidebar/remove_issue.vue';
-
-describe('boards sidebar remove issue', () => {
- let wrapper;
-
- const findButton = () => wrapper.find(GlButton);
-
- const createComponent = (propsData) => {
- wrapper = shallowMount(RemoveIssue, {
- propsData: {
- issue: {},
- list: {},
- ...propsData,
- },
- });
- };
-
- beforeEach(() => {
- createComponent();
- });
-
- it('renders remove button', () => {
- expect(findButton().exists()).toBe(true);
- });
-});
diff --git a/spec/frontend/boards/issue_card_inner_spec.js b/spec/frontend/boards/issue_card_inner_spec.js
deleted file mode 100644
index b9f84fed6b3..00000000000
--- a/spec/frontend/boards/issue_card_inner_spec.js
+++ /dev/null
@@ -1,372 +0,0 @@
-import { GlLabel } from '@gitlab/ui';
-import { mount } from '@vue/test-utils';
-import { range } from 'lodash';
-import IssueCardInner from '~/boards/components/issue_card_inner.vue';
-import eventHub from '~/boards/eventhub';
-import defaultStore from '~/boards/stores';
-import { updateHistory } from '~/lib/utils/url_utility';
-import { mockLabelList } from './mock_data';
-
-jest.mock('~/lib/utils/url_utility');
-jest.mock('~/boards/eventhub');
-
-describe('Issue card component', () => {
- const user = {
- id: 1,
- name: 'testing 123',
- username: 'test',
- avatarUrl: 'test_image',
- };
-
- const label1 = {
- id: 3,
- title: 'testing 123',
- color: '#000CFF',
- textColor: 'white',
- description: 'test',
- };
-
- let wrapper;
- let issue;
- let list;
-
- const createWrapper = (props = {}, store = defaultStore) => {
- wrapper = mount(IssueCardInner, {
- store,
- propsData: {
- list,
- issue,
- ...props,
- },
- stubs: {
- GlLabel: true,
- },
- provide: {
- groupId: null,
- rootPath: '/',
- scopedLabelsAvailable: false,
- },
- });
- };
-
- beforeEach(() => {
- list = mockLabelList;
- issue = {
- title: 'Testing',
- id: 1,
- iid: 1,
- confidential: false,
- labels: [list.label],
- assignees: [],
- referencePath: '#1',
- webUrl: '/test/1',
- weight: 1,
- };
-
- createWrapper({ issue, list });
- });
-
- afterEach(() => {
- wrapper.destroy();
- wrapper = null;
- jest.clearAllMocks();
- });
-
- it('renders issue title', () => {
- expect(wrapper.find('.board-card-title').text()).toContain(issue.title);
- });
-
- it('includes issue base in link', () => {
- expect(wrapper.find('.board-card-title a').attributes('href')).toContain('/test');
- });
-
- it('includes issue title on link', () => {
- expect(wrapper.find('.board-card-title a').attributes('title')).toBe(issue.title);
- });
-
- it('does not render confidential icon', () => {
- expect(wrapper.find('.confidential-icon').exists()).toBe(false);
- });
-
- it('does not render blocked icon', () => {
- expect(wrapper.find('.issue-blocked-icon').exists()).toBe(false);
- });
-
- it('renders issue ID with #', () => {
- expect(wrapper.find('.board-card-number').text()).toContain(`#${issue.id}`);
- });
-
- it('does not render assignee', () => {
- expect(wrapper.find('.board-card-assignee .avatar').exists()).toBe(false);
- });
-
- describe('confidential issue', () => {
- beforeEach(() => {
- wrapper.setProps({
- issue: {
- ...wrapper.props('issue'),
- confidential: true,
- },
- });
- });
-
- it('renders confidential icon', () => {
- expect(wrapper.find('.confidential-icon').exists()).toBe(true);
- });
- });
-
- describe('with assignee', () => {
- describe('with avatar', () => {
- beforeEach(() => {
- wrapper.setProps({
- issue: {
- ...wrapper.props('issue'),
- assignees: [user],
- updateData(newData) {
- Object.assign(this, newData);
- },
- },
- });
- });
-
- it('renders assignee', () => {
- expect(wrapper.find('.board-card-assignee .avatar').exists()).toBe(true);
- });
-
- it('sets title', () => {
- expect(wrapper.find('.js-assignee-tooltip').text()).toContain(`${user.name}`);
- });
-
- it('sets users path', () => {
- expect(wrapper.find('.board-card-assignee a').attributes('href')).toBe('/test');
- });
-
- it('renders avatar', () => {
- expect(wrapper.find('.board-card-assignee img').exists()).toBe(true);
- });
-
- it('renders the avatar using avatarUrl property', async () => {
- wrapper.props('issue').updateData({
- ...wrapper.props('issue'),
- assignees: [
- {
- id: '1',
- name: 'test',
- state: 'active',
- username: 'test_name',
- avatarUrl: 'test_image_from_avatar_url',
- },
- ],
- });
-
- await wrapper.vm.$nextTick();
-
- expect(wrapper.find('.board-card-assignee img').attributes('src')).toBe(
- 'test_image_from_avatar_url?width=24',
- );
- });
- });
-
- describe('with default avatar', () => {
- beforeEach(() => {
- global.gon.default_avatar_url = 'default_avatar';
-
- wrapper.setProps({
- issue: {
- ...wrapper.props('issue'),
- assignees: [
- {
- id: 1,
- name: 'testing 123',
- username: 'test',
- },
- ],
- },
- });
- });
-
- afterEach(() => {
- global.gon.default_avatar_url = null;
- });
-
- it('displays defaults avatar if users avatar is null', () => {
- expect(wrapper.find('.board-card-assignee img').exists()).toBe(true);
- expect(wrapper.find('.board-card-assignee img').attributes('src')).toBe(
- 'default_avatar?width=24',
- );
- });
- });
- });
-
- describe('multiple assignees', () => {
- beforeEach(() => {
- wrapper.setProps({
- issue: {
- ...wrapper.props('issue'),
- assignees: [
- {
- id: 2,
- name: 'user2',
- username: 'user2',
- avatarUrl: 'test_image',
- },
- {
- id: 3,
- name: 'user3',
- username: 'user3',
- avatarUrl: 'test_image',
- },
- {
- id: 4,
- name: 'user4',
- username: 'user4',
- avatarUrl: 'test_image',
- },
- ],
- },
- });
- });
-
- it('renders all three assignees', () => {
- expect(wrapper.findAll('.board-card-assignee .avatar').length).toEqual(3);
- });
-
- describe('more than three assignees', () => {
- beforeEach(() => {
- const { assignees } = wrapper.props('issue');
- assignees.push({
- id: 5,
- name: 'user5',
- username: 'user5',
- avatarUrl: 'test_image',
- });
-
- wrapper.setProps({
- issue: {
- ...wrapper.props('issue'),
- assignees,
- },
- });
- });
-
- it('renders more avatar counter', () => {
- expect(wrapper.find('.board-card-assignee .avatar-counter').text().trim()).toEqual('+2');
- });
-
- it('renders two assignees', () => {
- expect(wrapper.findAll('.board-card-assignee .avatar').length).toEqual(2);
- });
-
- it('renders 99+ avatar counter', async () => {
- const assignees = [
- ...wrapper.props('issue').assignees,
- ...range(5, 103).map((i) => ({
- id: i,
- name: 'name',
- username: 'username',
- avatarUrl: 'test_image',
- })),
- ];
- wrapper.setProps({
- issue: {
- ...wrapper.props('issue'),
- assignees,
- },
- });
-
- await wrapper.vm.$nextTick();
-
- expect(wrapper.find('.board-card-assignee .avatar-counter').text().trim()).toEqual('99+');
- });
- });
- });
-
- describe('labels', () => {
- beforeEach(() => {
- wrapper.setProps({ issue: { ...issue, labels: [list.label, label1] } });
- });
-
- it('does not render list label but renders all other labels', () => {
- expect(wrapper.findAll(GlLabel).length).toBe(1);
- const label = wrapper.find(GlLabel);
- expect(label.props('title')).toEqual(label1.title);
- expect(label.props('description')).toEqual(label1.description);
- expect(label.props('backgroundColor')).toEqual(label1.color);
- });
-
- it('does not render label if label does not have an ID', async () => {
- wrapper.setProps({ issue: { ...issue, labels: [label1, { title: 'closed' }] } });
-
- await wrapper.vm.$nextTick();
-
- expect(wrapper.findAll(GlLabel).length).toBe(1);
- expect(wrapper.text()).not.toContain('closed');
- });
- });
-
- describe('blocked', () => {
- beforeEach(() => {
- wrapper.setProps({
- issue: {
- ...wrapper.props('issue'),
- blocked: true,
- },
- });
- });
-
- it('renders blocked icon if issue is blocked', () => {
- expect(wrapper.find('.issue-blocked-icon').exists()).toBe(true);
- });
- });
-
- describe('filterByLabel method', () => {
- beforeEach(() => {
- delete window.location;
-
- wrapper.setProps({
- updateFilters: true,
- });
- });
-
- describe('when selected label is not in the filter', () => {
- beforeEach(() => {
- jest.spyOn(wrapper.vm, 'performSearch').mockImplementation(() => {});
- window.location = { search: '' };
- wrapper.vm.filterByLabel(label1);
- });
-
- it('calls updateHistory', () => {
- expect(updateHistory).toHaveBeenCalledTimes(1);
- });
-
- it('dispatches performSearch vuex action', () => {
- expect(wrapper.vm.performSearch).toHaveBeenCalledTimes(1);
- });
-
- it('emits updateTokens event', () => {
- expect(eventHub.$emit).toHaveBeenCalledTimes(1);
- expect(eventHub.$emit).toHaveBeenCalledWith('updateTokens');
- });
- });
-
- describe('when selected label is already in the filter', () => {
- beforeEach(() => {
- jest.spyOn(wrapper.vm, 'performSearch').mockImplementation(() => {});
- window.location = { search: '?label_name[]=testing%20123' };
- wrapper.vm.filterByLabel(label1);
- });
-
- it('does not call updateHistory', () => {
- expect(updateHistory).not.toHaveBeenCalled();
- });
-
- it('does not dispatch performSearch vuex action', () => {
- expect(wrapper.vm.performSearch).not.toHaveBeenCalled();
- });
-
- it('does not emit updateTokens event', () => {
- expect(eventHub.$emit).not.toHaveBeenCalled();
- });
- });
- });
-});
diff --git a/spec/frontend/boards/stores/actions_spec.js b/spec/frontend/boards/stores/actions_spec.js
index 32d0e7ae886..69d2c8977fb 100644
--- a/spec/frontend/boards/stores/actions_spec.js
+++ b/spec/frontend/boards/stores/actions_spec.js
@@ -5,7 +5,7 @@ import {
formatBoardLists,
formatIssueInput,
} from '~/boards/boards_util';
-import { inactiveId } from '~/boards/constants';
+import { inactiveId, ISSUABLE } from '~/boards/constants';
import destroyBoardListMutation from '~/boards/graphql/board_list_destroy.mutation.graphql';
import issueCreateMutation from '~/boards/graphql/issue_create.mutation.graphql';
import issueMoveListMutation from '~/boards/graphql/issue_move_list.mutation.graphql';
@@ -112,6 +112,15 @@ describe('setActiveId', () => {
});
describe('fetchLists', () => {
+ it('should dispatch fetchIssueLists action', () => {
+ testAction({
+ action: actions.fetchLists,
+ expectedActions: [{ type: 'fetchIssueLists' }],
+ });
+ });
+});
+
+describe('fetchIssueLists', () => {
const state = {
fullPath: 'gitlab-org',
boardId: '1',
@@ -138,7 +147,7 @@ describe('fetchLists', () => {
jest.spyOn(gqlClient, 'query').mockResolvedValue(queryResponse);
testAction(
- actions.fetchLists,
+ actions.fetchIssueLists,
{},
state,
[
@@ -152,6 +161,23 @@ describe('fetchLists', () => {
);
});
+ it('should commit mutations RECEIVE_BOARD_LISTS_FAILURE on failure', (done) => {
+ jest.spyOn(gqlClient, 'query').mockResolvedValue(Promise.reject());
+
+ testAction(
+ actions.fetchIssueLists,
+ {},
+ state,
+ [
+ {
+ type: types.RECEIVE_BOARD_LISTS_FAILURE,
+ },
+ ],
+ [],
+ done,
+ );
+ });
+
it('dispatch createList action when backlog list does not exist and is not hidden', (done) => {
queryResponse = {
data: {
@@ -168,7 +194,7 @@ describe('fetchLists', () => {
jest.spyOn(gqlClient, 'query').mockResolvedValue(queryResponse);
testAction(
- actions.fetchLists,
+ actions.fetchIssueLists,
{},
state,
[
@@ -184,6 +210,16 @@ describe('fetchLists', () => {
});
describe('createList', () => {
+ it('should dispatch createIssueList action', () => {
+ testAction({
+ action: actions.createList,
+ payload: { backlog: true },
+ expectedActions: [{ type: 'createIssueList', payload: { backlog: true } }],
+ });
+ });
+});
+
+describe('createIssueList', () => {
let commit;
let dispatch;
let getters;
@@ -223,7 +259,7 @@ describe('createList', () => {
}),
);
- await actions.createList({ getters, state, commit, dispatch }, { backlog: true });
+ await actions.createIssueList({ getters, state, commit, dispatch }, { backlog: true });
expect(dispatch).toHaveBeenCalledWith('addList', backlogList);
});
@@ -245,7 +281,7 @@ describe('createList', () => {
},
});
- await actions.createList({ getters, state, commit, dispatch }, { labelId: '4' });
+ await actions.createIssueList({ getters, state, commit, dispatch }, { labelId: '4' });
expect(dispatch).toHaveBeenCalledWith('addList', list);
expect(dispatch).toHaveBeenCalledWith('highlightList', list.id);
@@ -257,15 +293,15 @@ describe('createList', () => {
data: {
boardListCreate: {
list: {},
- errors: [{ foo: 'bar' }],
+ errors: ['foo'],
},
},
}),
);
- await actions.createList({ getters, state, commit, dispatch }, { backlog: true });
+ await actions.createIssueList({ getters, state, commit, dispatch }, { backlog: true });
- expect(commit).toHaveBeenCalledWith(types.CREATE_LIST_FAILURE);
+ expect(commit).toHaveBeenCalledWith(types.CREATE_LIST_FAILURE, 'foo');
});
it('highlights list and does not re-query if it already exists', async () => {
@@ -280,7 +316,7 @@ describe('createList', () => {
getListByLabelId: jest.fn().mockReturnValue(existingList),
};
- await actions.createList({ getters, state, commit, dispatch }, { backlog: true });
+ await actions.createIssueList({ getters, state, commit, dispatch }, { backlog: true });
expect(dispatch).toHaveBeenCalledWith('highlightList', existingList.id);
expect(dispatch).toHaveBeenCalledTimes(1);
@@ -301,11 +337,15 @@ describe('fetchLabels', () => {
};
jest.spyOn(gqlClient, 'query').mockResolvedValue(queryResponse);
- await testAction({
- action: actions.fetchLabels,
- state: { boardType: 'group' },
- expectedMutations: [{ type: types.RECEIVE_LABELS_SUCCESS, payload: labels }],
- });
+ const commit = jest.fn();
+ const getters = {
+ shouldUseGraphQL: () => true,
+ };
+ const state = { boardType: 'group' };
+
+ await actions.fetchLabels({ getters, state, commit });
+
+ expect(commit).toHaveBeenCalledWith(types.RECEIVE_LABELS_SUCCESS, labels);
});
});
@@ -412,6 +452,22 @@ describe('updateList', () => {
});
});
+describe('toggleListCollapsed', () => {
+ it('should commit TOGGLE_LIST_COLLAPSED mutation', async () => {
+ const payload = { listId: 'gid://gitlab/List/1', collapsed: true };
+ await testAction({
+ action: actions.toggleListCollapsed,
+ payload,
+ expectedMutations: [
+ {
+ type: types.TOGGLE_LIST_COLLAPSED,
+ payload,
+ },
+ ],
+ });
+ });
+});
+
describe('removeList', () => {
let state;
const list = mockLists[0];
@@ -490,7 +546,7 @@ describe('removeList', () => {
});
});
-describe('fetchIssuesForList', () => {
+describe('fetchItemsForList', () => {
const listId = mockLists[0].id;
const state = {
@@ -533,21 +589,21 @@ describe('fetchIssuesForList', () => {
[listId]: pageInfo,
};
- it('should commit mutations REQUEST_ISSUES_FOR_LIST and RECEIVE_ISSUES_FOR_LIST_SUCCESS on success', (done) => {
+ it('should commit mutations REQUEST_ITEMS_FOR_LIST and RECEIVE_ITEMS_FOR_LIST_SUCCESS on success', (done) => {
jest.spyOn(gqlClient, 'query').mockResolvedValue(queryResponse);
testAction(
- actions.fetchIssuesForList,
+ actions.fetchItemsForList,
{ listId },
state,
[
{
- type: types.REQUEST_ISSUES_FOR_LIST,
+ type: types.REQUEST_ITEMS_FOR_LIST,
payload: { listId, fetchNext: false },
},
{
- type: types.RECEIVE_ISSUES_FOR_LIST_SUCCESS,
- payload: { listIssues: formattedIssues, listPageInfo, listId },
+ type: types.RECEIVE_ITEMS_FOR_LIST_SUCCESS,
+ payload: { listItems: formattedIssues, listPageInfo, listId },
},
],
[],
@@ -555,19 +611,19 @@ describe('fetchIssuesForList', () => {
);
});
- it('should commit mutations REQUEST_ISSUES_FOR_LIST and RECEIVE_ISSUES_FOR_LIST_FAILURE on failure', (done) => {
+ it('should commit mutations REQUEST_ITEMS_FOR_LIST and RECEIVE_ITEMS_FOR_LIST_FAILURE on failure', (done) => {
jest.spyOn(gqlClient, 'query').mockResolvedValue(Promise.reject());
testAction(
- actions.fetchIssuesForList,
+ actions.fetchItemsForList,
{ listId },
state,
[
{
- type: types.REQUEST_ISSUES_FOR_LIST,
+ type: types.REQUEST_ITEMS_FOR_LIST,
payload: { listId, fetchNext: false },
},
- { type: types.RECEIVE_ISSUES_FOR_LIST_FAILURE, payload: listId },
+ { type: types.RECEIVE_ITEMS_FOR_LIST_FAILURE, payload: listId },
],
[],
done,
@@ -581,6 +637,15 @@ describe('resetIssues', () => {
});
});
+describe('moveItem', () => {
+ it('should dispatch moveIssue action', () => {
+ testAction({
+ action: actions.moveItem,
+ expectedActions: [{ type: 'moveIssue' }],
+ });
+ });
+});
+
describe('moveIssue', () => {
const listIssues = {
'gid://gitlab/List/1': [436, 437],
@@ -598,8 +663,8 @@ describe('moveIssue', () => {
boardType: 'group',
disabled: false,
boardLists: mockLists,
- issuesByListId: listIssues,
- issues,
+ boardItemsByListId: listIssues,
+ boardItems: issues,
};
it('should commit MOVE_ISSUE mutation and MOVE_ISSUE_SUCCESS mutation when successful', (done) => {
@@ -615,9 +680,9 @@ describe('moveIssue', () => {
testAction(
actions.moveIssue,
{
- issueId: '436',
- issueIid: mockIssue.iid,
- issuePath: mockIssue.referencePath,
+ itemId: '436',
+ itemIid: mockIssue.iid,
+ itemPath: mockIssue.referencePath,
fromListId: 'gid://gitlab/List/1',
toListId: 'gid://gitlab/List/2',
},
@@ -666,9 +731,9 @@ describe('moveIssue', () => {
actions.moveIssue(
{ state, commit: () => {} },
{
- issueId: mockIssue.id,
- issueIid: mockIssue.iid,
- issuePath: mockIssue.referencePath,
+ itemId: mockIssue.id,
+ itemIid: mockIssue.iid,
+ itemPath: mockIssue.referencePath,
fromListId: 'gid://gitlab/List/1',
toListId: 'gid://gitlab/List/2',
},
@@ -690,9 +755,9 @@ describe('moveIssue', () => {
testAction(
actions.moveIssue,
{
- issueId: '436',
- issueIid: mockIssue.iid,
- issuePath: mockIssue.referencePath,
+ itemId: '436',
+ itemIid: mockIssue.iid,
+ itemPath: mockIssue.referencePath,
fromListId: 'gid://gitlab/List/1',
toListId: 'gid://gitlab/List/2',
},
@@ -879,7 +944,7 @@ describe('addListIssue', () => {
});
describe('setActiveIssueLabels', () => {
- const state = { issues: { [mockIssue.id]: mockIssue } };
+ const state = { boardItems: { [mockIssue.id]: mockIssue } };
const getters = { activeIssue: mockIssue };
const testLabelIds = labels.map((label) => label.id);
const input = {
@@ -924,7 +989,7 @@ describe('setActiveIssueLabels', () => {
});
describe('setActiveIssueDueDate', () => {
- const state = { issues: { [mockIssue.id]: mockIssue } };
+ const state = { boardItems: { [mockIssue.id]: mockIssue } };
const getters = { activeIssue: mockIssue };
const testDueDate = '2020-02-20';
const input = {
@@ -975,7 +1040,7 @@ describe('setActiveIssueDueDate', () => {
});
describe('setActiveIssueSubscribed', () => {
- const state = { issues: { [mockActiveIssue.id]: mockActiveIssue } };
+ const state = { boardItems: { [mockActiveIssue.id]: mockActiveIssue } };
const getters = { activeIssue: mockActiveIssue };
const subscribedState = true;
const input = {
@@ -1026,7 +1091,7 @@ describe('setActiveIssueSubscribed', () => {
});
describe('setActiveIssueMilestone', () => {
- const state = { issues: { [mockIssue.id]: mockIssue } };
+ const state = { boardItems: { [mockIssue.id]: mockIssue } };
const getters = { activeIssue: mockIssue };
const testMilestone = {
...mockMilestone,
@@ -1080,7 +1145,7 @@ describe('setActiveIssueMilestone', () => {
});
describe('setActiveIssueTitle', () => {
- const state = { issues: { [mockIssue.id]: mockIssue } };
+ const state = { boardItems: { [mockIssue.id]: mockIssue } };
const getters = { activeIssue: mockIssue };
const testTitle = 'Test Title';
const input = {
@@ -1220,6 +1285,7 @@ describe('setSelectedProject', () => {
describe('toggleBoardItemMultiSelection', () => {
const boardItem = mockIssue;
+ const boardItem2 = mockIssue2;
it('should commit mutation ADD_BOARD_ITEM_TO_SELECTION if item is not on selection state', () => {
testAction(
@@ -1250,6 +1316,66 @@ describe('toggleBoardItemMultiSelection', () => {
[],
);
});
+
+ it('should additionally commit mutation ADD_BOARD_ITEM_TO_SELECTION for active issue and dispatch unsetActiveId', () => {
+ testAction(
+ actions.toggleBoardItemMultiSelection,
+ boardItem2,
+ { activeId: mockActiveIssue.id, activeIssue: mockActiveIssue, selectedBoardItems: [] },
+ [
+ {
+ type: types.ADD_BOARD_ITEM_TO_SELECTION,
+ payload: mockActiveIssue,
+ },
+ {
+ type: types.ADD_BOARD_ITEM_TO_SELECTION,
+ payload: boardItem2,
+ },
+ ],
+ [{ type: 'unsetActiveId' }],
+ );
+ });
+});
+
+describe('resetBoardItemMultiSelection', () => {
+ it('should commit mutation RESET_BOARD_ITEM_SELECTION', () => {
+ testAction({
+ action: actions.resetBoardItemMultiSelection,
+ state: { selectedBoardItems: [mockIssue] },
+ expectedMutations: [
+ {
+ type: types.RESET_BOARD_ITEM_SELECTION,
+ },
+ ],
+ });
+ });
+});
+
+describe('toggleBoardItem', () => {
+ it('should dispatch resetBoardItemMultiSelection and unsetActiveId when boardItem is the active item', () => {
+ testAction({
+ action: actions.toggleBoardItem,
+ payload: { boardItem: mockIssue },
+ state: {
+ activeId: mockIssue.id,
+ },
+ expectedActions: [{ type: 'resetBoardItemMultiSelection' }, { type: 'unsetActiveId' }],
+ });
+ });
+
+ it('should dispatch resetBoardItemMultiSelection and setActiveId when boardItem is not the active item', () => {
+ testAction({
+ action: actions.toggleBoardItem,
+ payload: { boardItem: mockIssue },
+ state: {
+ activeId: inactiveId,
+ },
+ expectedActions: [
+ { type: 'resetBoardItemMultiSelection' },
+ { type: 'setActiveId', payload: { id: mockIssue.id, sidebarType: ISSUABLE } },
+ ],
+ });
+ });
});
describe('fetchBacklog', () => {
diff --git a/spec/frontend/boards/stores/getters_spec.js b/spec/frontend/boards/stores/getters_spec.js
index d5a19bf613f..c0c19e9d797 100644
--- a/spec/frontend/boards/stores/getters_spec.js
+++ b/spec/frontend/boards/stores/getters_spec.js
@@ -10,6 +10,42 @@ import {
} from '../mock_data';
describe('Boards - Getters', () => {
+ describe('isGroupBoard', () => {
+ it('returns true when boardType on state is group', () => {
+ const state = {
+ boardType: 'group',
+ };
+
+ expect(getters.isGroupBoard(state)).toBe(true);
+ });
+
+ it('returns false when boardType on state is not group', () => {
+ const state = {
+ boardType: 'project',
+ };
+
+ expect(getters.isGroupBoard(state)).toBe(false);
+ });
+ });
+
+ describe('isProjectBoard', () => {
+ it('returns true when boardType on state is project', () => {
+ const state = {
+ boardType: 'project',
+ };
+
+ expect(getters.isProjectBoard(state)).toBe(true);
+ });
+
+ it('returns false when boardType on state is not project', () => {
+ const state = {
+ boardType: 'group',
+ };
+
+ expect(getters.isProjectBoard(state)).toBe(false);
+ });
+ });
+
describe('isSidebarOpen', () => {
it('returns true when activeId is not equal to 0', () => {
const state = {
@@ -38,15 +74,15 @@ describe('Boards - Getters', () => {
});
});
- describe('getIssueById', () => {
- const state = { issues: { 1: 'issue' } };
+ describe('getBoardItemById', () => {
+ const state = { boardItems: { 1: 'issue' } };
it.each`
id | expected
${'1'} | ${'issue'}
${''} | ${{}}
`('returns $expected when $id is passed to state', ({ id, expected }) => {
- expect(getters.getIssueById(state)(id)).toEqual(expected);
+ expect(getters.getBoardItemById(state)(id)).toEqual(expected);
});
});
@@ -56,7 +92,7 @@ describe('Boards - Getters', () => {
${'1'} | ${'issue'}
${''} | ${{}}
`('returns $expected when $id is passed to state', ({ id, expected }) => {
- const state = { issues: { 1: 'issue' }, activeId: id };
+ const state = { boardItems: { 1: 'issue' }, activeId: id };
expect(getters.activeIssue(state)).toEqual(expected);
});
@@ -94,17 +130,18 @@ describe('Boards - Getters', () => {
});
});
- describe('getIssuesByList', () => {
+ describe('getBoardItemsByList', () => {
const boardsState = {
- issuesByListId: mockIssuesByListId,
- issues,
+ boardItemsByListId: mockIssuesByListId,
+ boardItems: issues,
};
it('returns issues for a given listId', () => {
- const getIssueById = (issueId) => [mockIssue, mockIssue2].find(({ id }) => id === issueId);
+ const getBoardItemById = (issueId) =>
+ [mockIssue, mockIssue2].find(({ id }) => id === issueId);
- expect(getters.getIssuesByList(boardsState, { getIssueById })('gid://gitlab/List/2')).toEqual(
- mockIssues,
- );
+ expect(
+ getters.getBoardItemsByList(boardsState, { getBoardItemById })('gid://gitlab/List/2'),
+ ).toEqual(mockIssues);
});
});
diff --git a/spec/frontend/boards/stores/mutations_spec.js b/spec/frontend/boards/stores/mutations_spec.js
index 9423f2ed583..33897cc0250 100644
--- a/spec/frontend/boards/stores/mutations_spec.js
+++ b/spec/frontend/boards/stores/mutations_spec.js
@@ -1,3 +1,4 @@
+import { issuableTypes } from '~/boards/constants';
import * as types from '~/boards/stores/mutation_types';
import mutations from '~/boards/stores/mutations';
import defaultState from '~/boards/stores/state';
@@ -37,6 +38,7 @@ describe('Board Store Mutations', () => {
const boardConfig = {
milestoneTitle: 'Milestone 1',
};
+ const issuableType = issuableTypes.issue;
mutations[types.SET_INITIAL_BOARD_DATA](state, {
boardId,
@@ -44,6 +46,7 @@ describe('Board Store Mutations', () => {
boardType,
disabled,
boardConfig,
+ issuableType,
});
expect(state.boardId).toEqual(boardId);
@@ -51,6 +54,7 @@ describe('Board Store Mutations', () => {
expect(state.boardType).toEqual(boardType);
expect(state.disabled).toEqual(disabled);
expect(state.boardConfig).toEqual(boardConfig);
+ expect(state.issuableType).toEqual(issuableType);
});
});
@@ -106,11 +110,31 @@ describe('Board Store Mutations', () => {
});
});
+ describe('RECEIVE_LABELS_REQUEST', () => {
+ it('sets labelsLoading on state', () => {
+ mutations.RECEIVE_LABELS_REQUEST(state);
+
+ expect(state.labelsLoading).toEqual(true);
+ });
+ });
+
describe('RECEIVE_LABELS_SUCCESS', () => {
it('sets labels on state', () => {
mutations.RECEIVE_LABELS_SUCCESS(state, labels);
expect(state.labels).toEqual(labels);
+ expect(state.labelsLoading).toEqual(false);
+ });
+ });
+
+ describe('RECEIVE_LABELS_FAILURE', () => {
+ it('sets error message', () => {
+ mutations.RECEIVE_LABELS_FAILURE(state);
+
+ expect(state.error).toEqual(
+ 'An error occurred while fetching labels. Please reload the page.',
+ );
+ expect(state.labelsLoading).toEqual(false);
});
});
@@ -179,6 +203,24 @@ describe('Board Store Mutations', () => {
});
});
+ describe('TOGGLE_LIST_COLLAPSED', () => {
+ it('updates collapsed attribute of list in boardLists state', () => {
+ const listId = 'gid://gitlab/List/1';
+ state = {
+ ...state,
+ boardLists: {
+ [listId]: mockLists[0],
+ },
+ };
+
+ expect(state.boardLists[listId].collapsed).toEqual(false);
+
+ mutations.TOGGLE_LIST_COLLAPSED(state, { listId, collapsed: true });
+
+ expect(state.boardLists[listId].collapsed).toEqual(true);
+ });
+ });
+
describe('REMOVE_LIST', () => {
it('removes list from boardLists', () => {
const [list, secondList] = mockLists;
@@ -219,24 +261,24 @@ describe('Board Store Mutations', () => {
});
describe('RESET_ISSUES', () => {
- it('should remove issues from issuesByListId state', () => {
- const issuesByListId = {
+ it('should remove issues from boardItemsByListId state', () => {
+ const boardItemsByListId = {
'gid://gitlab/List/1': [mockIssue.id],
};
state = {
...state,
- issuesByListId,
+ boardItemsByListId,
};
mutations[types.RESET_ISSUES](state);
- expect(state.issuesByListId).toEqual({ 'gid://gitlab/List/1': [] });
+ expect(state.boardItemsByListId).toEqual({ 'gid://gitlab/List/1': [] });
});
});
- describe('RECEIVE_ISSUES_FOR_LIST_SUCCESS', () => {
- it('updates issuesByListId and issues on state', () => {
+ describe('RECEIVE_ITEMS_FOR_LIST_SUCCESS', () => {
+ it('updates boardItemsByListId and issues on state', () => {
const listIssues = {
'gid://gitlab/List/1': [mockIssue.id],
};
@@ -246,10 +288,10 @@ describe('Board Store Mutations', () => {
state = {
...state,
- issuesByListId: {
+ boardItemsByListId: {
'gid://gitlab/List/1': [],
},
- issues: {},
+ boardItems: {},
boardLists: initialBoardListsState,
};
@@ -260,18 +302,18 @@ describe('Board Store Mutations', () => {
},
};
- mutations.RECEIVE_ISSUES_FOR_LIST_SUCCESS(state, {
- listIssues: { listData: listIssues, issues },
+ mutations.RECEIVE_ITEMS_FOR_LIST_SUCCESS(state, {
+ listItems: { listData: listIssues, boardItems: issues },
listPageInfo,
listId: 'gid://gitlab/List/1',
});
- expect(state.issuesByListId).toEqual(listIssues);
- expect(state.issues).toEqual(issues);
+ expect(state.boardItemsByListId).toEqual(listIssues);
+ expect(state.boardItems).toEqual(issues);
});
});
- describe('RECEIVE_ISSUES_FOR_LIST_FAILURE', () => {
+ describe('RECEIVE_ITEMS_FOR_LIST_FAILURE', () => {
it('sets error message', () => {
state = {
...state,
@@ -281,7 +323,7 @@ describe('Board Store Mutations', () => {
const listId = 'gid://gitlab/List/1';
- mutations.RECEIVE_ISSUES_FOR_LIST_FAILURE(state, listId);
+ mutations.RECEIVE_ITEMS_FOR_LIST_FAILURE(state, listId);
expect(state.error).toEqual(
'An error occurred while fetching the board issues. Please reload the page.',
@@ -303,7 +345,7 @@ describe('Board Store Mutations', () => {
state = {
...state,
error: undefined,
- issues: {
+ boardItems: {
...issue,
},
};
@@ -317,7 +359,7 @@ describe('Board Store Mutations', () => {
value,
});
- expect(state.issues[issueId]).toEqual({ ...issue[issueId], id: '2' });
+ expect(state.boardItems[issueId]).toEqual({ ...issue[issueId], id: '2' });
});
});
@@ -343,7 +385,7 @@ describe('Board Store Mutations', () => {
});
describe('MOVE_ISSUE', () => {
- it('updates issuesByListId, moving issue between lists', () => {
+ it('updates boardItemsByListId, moving issue between lists', () => {
const listIssues = {
'gid://gitlab/List/1': [mockIssue.id, mockIssue2.id],
'gid://gitlab/List/2': [],
@@ -356,9 +398,9 @@ describe('Board Store Mutations', () => {
state = {
...state,
- issuesByListId: listIssues,
+ boardItemsByListId: listIssues,
boardLists: initialBoardListsState,
- issues,
+ boardItems: issues,
};
mutations.MOVE_ISSUE(state, {
@@ -372,7 +414,7 @@ describe('Board Store Mutations', () => {
'gid://gitlab/List/2': [mockIssue2.id],
};
- expect(state.issuesByListId).toEqual(updatedListIssues);
+ expect(state.boardItemsByListId).toEqual(updatedListIssues);
});
});
@@ -384,19 +426,19 @@ describe('Board Store Mutations', () => {
state = {
...state,
- issues,
+ boardItems: issues,
};
mutations.MOVE_ISSUE_SUCCESS(state, {
issue: rawIssue,
});
- expect(state.issues).toEqual({ 436: { ...mockIssue, id: 436 } });
+ expect(state.boardItems).toEqual({ 436: { ...mockIssue, id: 436 } });
});
});
describe('MOVE_ISSUE_FAILURE', () => {
- it('updates issuesByListId, reverting moving issue between lists, and sets error message', () => {
+ it('updates boardItemsByListId, reverting moving issue between lists, and sets error message', () => {
const listIssues = {
'gid://gitlab/List/1': [mockIssue.id],
'gid://gitlab/List/2': [mockIssue2.id],
@@ -404,7 +446,7 @@ describe('Board Store Mutations', () => {
state = {
...state,
- issuesByListId: listIssues,
+ boardItemsByListId: listIssues,
boardLists: initialBoardListsState,
};
@@ -420,7 +462,7 @@ describe('Board Store Mutations', () => {
'gid://gitlab/List/2': [],
};
- expect(state.issuesByListId).toEqual(updatedListIssues);
+ expect(state.boardItemsByListId).toEqual(updatedListIssues);
expect(state.error).toEqual('An error occurred while moving the issue. Please try again.');
});
});
@@ -446,7 +488,7 @@ describe('Board Store Mutations', () => {
});
describe('ADD_ISSUE_TO_LIST', () => {
- it('adds issue to issues state and issue id in list in issuesByListId', () => {
+ it('adds issue to issues state and issue id in list in boardItemsByListId', () => {
const listIssues = {
'gid://gitlab/List/1': [mockIssue.id],
};
@@ -456,8 +498,8 @@ describe('Board Store Mutations', () => {
state = {
...state,
- issuesByListId: listIssues,
- issues,
+ boardItemsByListId: listIssues,
+ boardItems: issues,
boardLists: initialBoardListsState,
};
@@ -465,14 +507,14 @@ describe('Board Store Mutations', () => {
mutations.ADD_ISSUE_TO_LIST(state, { list: mockLists[0], issue: mockIssue2 });
- expect(state.issuesByListId['gid://gitlab/List/1']).toContain(mockIssue2.id);
- expect(state.issues[mockIssue2.id]).toEqual(mockIssue2);
+ expect(state.boardItemsByListId['gid://gitlab/List/1']).toContain(mockIssue2.id);
+ expect(state.boardItems[mockIssue2.id]).toEqual(mockIssue2);
expect(state.boardLists['gid://gitlab/List/1'].issuesCount).toBe(2);
});
});
describe('ADD_ISSUE_TO_LIST_FAILURE', () => {
- it('removes issue id from list in issuesByListId and sets error message', () => {
+ it('removes issue id from list in boardItemsByListId and sets error message', () => {
const listIssues = {
'gid://gitlab/List/1': [mockIssue.id, mockIssue2.id],
};
@@ -483,20 +525,20 @@ describe('Board Store Mutations', () => {
state = {
...state,
- issuesByListId: listIssues,
- issues,
+ boardItemsByListId: listIssues,
+ boardItems: issues,
boardLists: initialBoardListsState,
};
mutations.ADD_ISSUE_TO_LIST_FAILURE(state, { list: mockLists[0], issueId: mockIssue2.id });
- expect(state.issuesByListId['gid://gitlab/List/1']).not.toContain(mockIssue2.id);
+ expect(state.boardItemsByListId['gid://gitlab/List/1']).not.toContain(mockIssue2.id);
expect(state.error).toBe('An error occurred while creating the issue. Please try again.');
});
});
describe('REMOVE_ISSUE_FROM_LIST', () => {
- it('removes issue id from list in issuesByListId and deletes issue from state', () => {
+ it('removes issue id from list in boardItemsByListId and deletes issue from state', () => {
const listIssues = {
'gid://gitlab/List/1': [mockIssue.id, mockIssue2.id],
};
@@ -507,15 +549,15 @@ describe('Board Store Mutations', () => {
state = {
...state,
- issuesByListId: listIssues,
- issues,
+ boardItemsByListId: listIssues,
+ boardItems: issues,
boardLists: initialBoardListsState,
};
mutations.ADD_ISSUE_TO_LIST_FAILURE(state, { list: mockLists[0], issueId: mockIssue2.id });
- expect(state.issuesByListId['gid://gitlab/List/1']).not.toContain(mockIssue2.id);
- expect(state.issues).not.toContain(mockIssue2);
+ expect(state.boardItemsByListId['gid://gitlab/List/1']).not.toContain(mockIssue2.id);
+ expect(state.boardItems).not.toContain(mockIssue2);
});
});
@@ -607,14 +649,21 @@ describe('Board Store Mutations', () => {
describe('REMOVE_BOARD_ITEM_FROM_SELECTION', () => {
it('Should remove boardItem to selectedBoardItems state', () => {
- state = {
- ...state,
- selectedBoardItems: [mockIssue],
- };
+ state.selectedBoardItems = [mockIssue];
mutations[types.REMOVE_BOARD_ITEM_FROM_SELECTION](state, mockIssue);
expect(state.selectedBoardItems).toEqual([]);
});
});
+
+ describe('RESET_BOARD_ITEM_SELECTION', () => {
+ it('Should reset selectedBoardItems state', () => {
+ state.selectedBoardItems = [mockIssue];
+
+ mutations[types.RESET_BOARD_ITEM_SELECTION](state, mockIssue);
+
+ expect(state.selectedBoardItems).toEqual([]);
+ });
+ });
});
diff --git a/spec/frontend/bootstrap_linked_tabs_spec.js b/spec/frontend/bootstrap_linked_tabs_spec.js
index 2d8939e6480..30fb140bc69 100644
--- a/spec/frontend/bootstrap_linked_tabs_spec.js
+++ b/spec/frontend/bootstrap_linked_tabs_spec.js
@@ -1,8 +1,6 @@
import LinkedTabs from '~/lib/utils/bootstrap_linked_tabs';
describe('Linked Tabs', () => {
- preloadFixtures('static/linked_tabs.html');
-
beforeEach(() => {
loadFixtures('static/linked_tabs.html');
});
diff --git a/spec/frontend/captcha/captcha_modal_axios_interceptor_spec.js b/spec/frontend/captcha/captcha_modal_axios_interceptor_spec.js
new file mode 100644
index 00000000000..df81b78d010
--- /dev/null
+++ b/spec/frontend/captcha/captcha_modal_axios_interceptor_spec.js
@@ -0,0 +1,119 @@
+import MockAdapter from 'axios-mock-adapter';
+
+import { registerCaptchaModalInterceptor } from '~/captcha/captcha_modal_axios_interceptor';
+import { waitForCaptchaToBeSolved } from '~/captcha/wait_for_captcha_to_be_solved';
+import axios from '~/lib/utils/axios_utils';
+import httpStatusCodes from '~/lib/utils/http_status';
+
+jest.mock('~/captcha/wait_for_captcha_to_be_solved');
+
+describe('registerCaptchaModalInterceptor', () => {
+ const SPAM_LOG_ID = 'SPAM_LOG_ID';
+ const CAPTCHA_SITE_KEY = 'CAPTCHA_SITE_KEY';
+ const CAPTCHA_SUCCESS = 'CAPTCHA_SUCCESS';
+ const CAPTCHA_RESPONSE = 'CAPTCHA_RESPONSE';
+ const AXIOS_RESPONSE = { text: 'AXIOS_RESPONSE' };
+ const NEEDS_CAPTCHA_RESPONSE = {
+ needs_captcha_response: true,
+ captcha_site_key: CAPTCHA_SITE_KEY,
+ spam_log_id: SPAM_LOG_ID,
+ };
+
+ const unsupportedMethods = ['delete', 'get', 'head', 'options'];
+ const supportedMethods = ['patch', 'post', 'put'];
+
+ let mock;
+
+ beforeEach(() => {
+ mock = new MockAdapter(axios);
+ mock.onAny('/no-captcha').reply(200, AXIOS_RESPONSE);
+ mock.onAny('/error').reply(404, AXIOS_RESPONSE);
+ mock.onAny('/captcha').reply((config) => {
+ if (!supportedMethods.includes(config.method)) {
+ return [httpStatusCodes.METHOD_NOT_ALLOWED, { method: config.method }];
+ }
+
+ try {
+ const { captcha_response, spam_log_id, ...rest } = JSON.parse(config.data);
+ // eslint-disable-next-line babel/camelcase
+ if (captcha_response === CAPTCHA_RESPONSE && spam_log_id === SPAM_LOG_ID) {
+ return [httpStatusCodes.OK, { ...rest, method: config.method, CAPTCHA_SUCCESS }];
+ }
+ } catch (e) {
+ return [httpStatusCodes.BAD_REQUEST, { method: config.method }];
+ }
+
+ return [httpStatusCodes.CONFLICT, NEEDS_CAPTCHA_RESPONSE];
+ });
+
+ axios.interceptors.response.handlers = [];
+ registerCaptchaModalInterceptor(axios);
+ });
+
+ afterEach(() => {
+ mock.restore();
+ });
+
+ describe.each([...supportedMethods, ...unsupportedMethods])('For HTTP method %s', (method) => {
+ it('successful requests are passed through', async () => {
+ const { data, status } = await axios[method]('/no-captcha');
+
+ expect(status).toEqual(httpStatusCodes.OK);
+ expect(data).toEqual(AXIOS_RESPONSE);
+ expect(mock.history[method]).toHaveLength(1);
+ });
+
+ it('error requests without needs_captcha_response_errors are passed through', async () => {
+ await expect(() => axios[method]('/error')).rejects.toThrow(
+ expect.objectContaining({
+ response: expect.objectContaining({
+ status: httpStatusCodes.NOT_FOUND,
+ data: AXIOS_RESPONSE,
+ }),
+ }),
+ );
+ expect(mock.history[method]).toHaveLength(1);
+ });
+ });
+
+ describe.each(supportedMethods)('For HTTP method %s', (method) => {
+ describe('error requests with needs_captcha_response_errors', () => {
+ const submittedData = { ID: 12345 };
+
+ it('re-submits request if captcha was solved correctly', async () => {
+ waitForCaptchaToBeSolved.mockResolvedValue(CAPTCHA_RESPONSE);
+ const { data: returnedData } = await axios[method]('/captcha', submittedData);
+
+ expect(waitForCaptchaToBeSolved).toHaveBeenCalledWith(CAPTCHA_SITE_KEY);
+
+ expect(returnedData).toEqual({ ...submittedData, CAPTCHA_SUCCESS, method });
+ expect(mock.history[method]).toHaveLength(2);
+ });
+
+ it('does not re-submit request if captcha was not solved', async () => {
+ const error = new Error('Captcha not solved');
+ waitForCaptchaToBeSolved.mockRejectedValue(error);
+ await expect(() => axios[method]('/captcha', submittedData)).rejects.toThrow(error);
+
+ expect(waitForCaptchaToBeSolved).toHaveBeenCalledWith(CAPTCHA_SITE_KEY);
+ expect(mock.history[method]).toHaveLength(1);
+ });
+ });
+ });
+
+ describe.each(unsupportedMethods)('For HTTP method %s', (method) => {
+ it('ignores captcha response', async () => {
+ await expect(() => axios[method]('/captcha')).rejects.toThrow(
+ expect.objectContaining({
+ response: expect.objectContaining({
+ status: httpStatusCodes.METHOD_NOT_ALLOWED,
+ data: { method },
+ }),
+ }),
+ );
+
+ expect(waitForCaptchaToBeSolved).not.toHaveBeenCalled();
+ expect(mock.history[method]).toHaveLength(1);
+ });
+ });
+});
diff --git a/spec/frontend/captcha/wait_for_captcha_to_be_solved_spec.js b/spec/frontend/captcha/wait_for_captcha_to_be_solved_spec.js
new file mode 100644
index 00000000000..08d031a4fa7
--- /dev/null
+++ b/spec/frontend/captcha/wait_for_captcha_to_be_solved_spec.js
@@ -0,0 +1,56 @@
+import CaptchaModal from '~/captcha/captcha_modal.vue';
+import { waitForCaptchaToBeSolved } from '~/captcha/wait_for_captcha_to_be_solved';
+
+jest.mock('~/captcha/captcha_modal.vue', () => ({
+ mounted: jest.fn(),
+ render(h) {
+ return h('div', { attrs: { id: 'mock-modal' } });
+ },
+}));
+
+describe('waitForCaptchaToBeSolved', () => {
+ const response = 'CAPTCHA_RESPONSE';
+
+ const findModal = () => document.querySelector('#mock-modal');
+
+ it('opens a modal, resolves with captcha response on success', async () => {
+ CaptchaModal.mounted.mockImplementationOnce(function mounted() {
+ requestAnimationFrame(() => {
+ this.$emit('receivedCaptchaResponse', response);
+ this.$emit('hidden');
+ });
+ });
+
+ expect(findModal()).toBeNull();
+
+ const promise = waitForCaptchaToBeSolved('FOO');
+
+ expect(findModal()).not.toBeNull();
+
+ const result = await promise;
+ expect(result).toEqual(response);
+
+ expect(findModal()).toBeNull();
+ expect(document.body.innerHTML).toEqual('');
+ });
+
+ it("opens a modal, rejects with error in case the captcha isn't solved", async () => {
+ CaptchaModal.mounted.mockImplementationOnce(function mounted() {
+ requestAnimationFrame(() => {
+ this.$emit('receivedCaptchaResponse', null);
+ this.$emit('hidden');
+ });
+ });
+
+ expect(findModal()).toBeNull();
+
+ const promise = waitForCaptchaToBeSolved('FOO');
+
+ expect(findModal()).not.toBeNull();
+
+ await expect(promise).rejects.toThrow(/You must solve the CAPTCHA in order to submit/);
+
+ expect(findModal()).toBeNull();
+ expect(document.body.innerHTML).toEqual('');
+ });
+});
diff --git a/spec/frontend/ci_variable_list/ci_variable_list/ci_variable_list_spec.js b/spec/frontend/ci_variable_list/ci_variable_list/ci_variable_list_spec.js
index ad1bdec1735..1bca21b1d57 100644
--- a/spec/frontend/ci_variable_list/ci_variable_list/ci_variable_list_spec.js
+++ b/spec/frontend/ci_variable_list/ci_variable_list/ci_variable_list_spec.js
@@ -4,9 +4,6 @@ import VariableList from '~/ci_variable_list/ci_variable_list';
const HIDE_CLASS = 'hide';
describe('VariableList', () => {
- preloadFixtures('pipeline_schedules/edit.html');
- preloadFixtures('pipeline_schedules/edit_with_variables.html');
-
let $wrapper;
let variableList;
diff --git a/spec/frontend/ci_variable_list/ci_variable_list/native_form_variable_list_spec.js b/spec/frontend/ci_variable_list/ci_variable_list/native_form_variable_list_spec.js
index 4982b68fa81..eee1362440d 100644
--- a/spec/frontend/ci_variable_list/ci_variable_list/native_form_variable_list_spec.js
+++ b/spec/frontend/ci_variable_list/ci_variable_list/native_form_variable_list_spec.js
@@ -2,8 +2,6 @@ import $ from 'jquery';
import setupNativeFormVariableList from '~/ci_variable_list/native_form_variable_list';
describe('NativeFormVariableList', () => {
- preloadFixtures('pipeline_schedules/edit.html');
-
let $wrapper;
beforeEach(() => {
diff --git a/spec/frontend/ci_variable_list/components/ci_environments_dropdown_spec.js b/spec/frontend/ci_variable_list/components/ci_environments_dropdown_spec.js
index 75c6e8e4540..5c5ea102f12 100644
--- a/spec/frontend/ci_variable_list/components/ci_environments_dropdown_spec.js
+++ b/spec/frontend/ci_variable_list/components/ci_environments_dropdown_spec.js
@@ -1,4 +1,4 @@
-import { GlDropdownItem, GlIcon } from '@gitlab/ui';
+import { GlDropdown, GlDropdownItem, GlIcon } from '@gitlab/ui';
import { mount, createLocalVue } from '@vue/test-utils';
import Vuex from 'vuex';
import CiEnvironmentsDropdown from '~/ci_variable_list/components/ci_environments_dropdown.vue';
@@ -10,6 +10,9 @@ describe('Ci environments dropdown', () => {
let wrapper;
let store;
+ const enterSearchTerm = (value) =>
+ wrapper.find('[data-testid="ci-environment-search"]').setValue(value);
+
const createComponent = (term) => {
store = new Vuex.Store({
getters: {
@@ -24,11 +27,12 @@ describe('Ci environments dropdown', () => {
value: term,
},
});
+ enterSearchTerm(term);
};
- const findAllDropdownItems = () => wrapper.findAll(GlDropdownItem);
- const findDropdownItemByIndex = (index) => wrapper.findAll(GlDropdownItem).at(index);
- const findActiveIconByIndex = (index) => findDropdownItemByIndex(index).find(GlIcon);
+ const findAllDropdownItems = () => wrapper.findAllComponents(GlDropdownItem);
+ const findDropdownItemByIndex = (index) => wrapper.findAllComponents(GlDropdownItem).at(index);
+ const findActiveIconByIndex = (index) => findDropdownItemByIndex(index).findComponent(GlIcon);
afterEach(() => {
wrapper.destroy();
@@ -68,8 +72,9 @@ describe('Ci environments dropdown', () => {
});
describe('Environments found', () => {
- beforeEach(() => {
+ beforeEach(async () => {
createComponent('prod');
+ await wrapper.vm.$nextTick();
});
it('renders only the environment searched for', () => {
@@ -84,21 +89,29 @@ describe('Ci environments dropdown', () => {
});
it('should not display empty results message', () => {
- expect(wrapper.find({ ref: 'noMatchingResults' }).exists()).toBe(false);
+ expect(wrapper.findComponent({ ref: 'noMatchingResults' }).exists()).toBe(false);
});
it('should display active checkmark if active', () => {
expect(findActiveIconByIndex(0).classes('gl-visibility-hidden')).toBe(false);
});
+ it('should clear the search term when showing the dropdown', () => {
+ wrapper.findComponent(GlDropdown).trigger('click');
+
+ expect(wrapper.find('[data-testid="ci-environment-search"]').text()).toBe('');
+ });
+
describe('Custom events', () => {
it('should emit selectEnvironment if an environment is clicked', () => {
findDropdownItemByIndex(0).vm.$emit('click');
expect(wrapper.emitted('selectEnvironment')).toEqual([['prod']]);
});
- it('should emit createClicked if an environment is clicked', () => {
+ it('should emit createClicked if an environment is clicked', async () => {
createComponent('newscope');
+
+ await wrapper.vm.$nextTick();
findDropdownItemByIndex(1).vm.$emit('click');
expect(wrapper.emitted('createClicked')).toEqual([['newscope']]);
});
diff --git a/spec/frontend/clusters_list/components/clusters_spec.js b/spec/frontend/clusters_list/components/clusters_spec.js
index f398d7a0965..941a3adb625 100644
--- a/spec/frontend/clusters_list/components/clusters_spec.js
+++ b/spec/frontend/clusters_list/components/clusters_spec.js
@@ -4,12 +4,12 @@ import {
GlDeprecatedSkeletonLoading as GlSkeletonLoading,
GlTable,
} from '@gitlab/ui';
+import * as Sentry from '@sentry/browser';
import { mount } from '@vue/test-utils';
import MockAdapter from 'axios-mock-adapter';
import Clusters from '~/clusters_list/components/clusters.vue';
import ClusterStore from '~/clusters_list/store';
import axios from '~/lib/utils/axios_utils';
-import * as Sentry from '~/sentry/wrapper';
import { apiData } from '../mock_data';
describe('Clusters', () => {
diff --git a/spec/frontend/clusters_list/store/actions_spec.js b/spec/frontend/clusters_list/store/actions_spec.js
index 00b998166aa..b2ef3c2138a 100644
--- a/spec/frontend/clusters_list/store/actions_spec.js
+++ b/spec/frontend/clusters_list/store/actions_spec.js
@@ -1,3 +1,4 @@
+import * as Sentry from '@sentry/browser';
import MockAdapter from 'axios-mock-adapter';
import testAction from 'helpers/vuex_action_helper';
import waitForPromises from 'helpers/wait_for_promises';
@@ -7,7 +8,6 @@ import * as types from '~/clusters_list/store/mutation_types';
import { deprecatedCreateFlash as flashError } from '~/flash';
import axios from '~/lib/utils/axios_utils';
import Poll from '~/lib/utils/poll';
-import * as Sentry from '~/sentry/wrapper';
import { apiData } from '../mock_data';
jest.mock('~/flash.js');
diff --git a/spec/frontend/collapsed_sidebar_todo_spec.js b/spec/frontend/collapsed_sidebar_todo_spec.js
index ef53cc9e103..7c659822672 100644
--- a/spec/frontend/collapsed_sidebar_todo_spec.js
+++ b/spec/frontend/collapsed_sidebar_todo_spec.js
@@ -14,9 +14,6 @@ describe('Issuable right sidebar collapsed todo toggle', () => {
const jsonFixtureName = 'todos/todos.json';
let mock;
- preloadFixtures(fixtureName);
- preloadFixtures(jsonFixtureName);
-
beforeEach(() => {
const todoData = getJSONFixture(jsonFixtureName);
new Sidebar();
diff --git a/spec/frontend/commit/pipelines/pipelines_spec.js b/spec/frontend/commit/pipelines/pipelines_spec.js
index f8bdd00f5da..c8c8f6408b7 100644
--- a/spec/frontend/commit/pipelines/pipelines_spec.js
+++ b/spec/frontend/commit/pipelines/pipelines_spec.js
@@ -13,14 +13,10 @@ describe('Pipelines table in Commits and Merge requests', () => {
let vm;
const props = {
endpoint: 'endpoint.json',
- helpPagePath: 'foo',
emptyStateSvgPath: 'foo',
errorStateSvgPath: 'foo',
- autoDevopsHelpPath: 'foo',
};
- preloadFixtures(jsonFixtureName);
-
const findRunPipelineBtn = () => vm.$el.querySelector('[data-testid="run_pipeline_button"]');
const findRunPipelineBtnMobile = () =>
vm.$el.querySelector('[data-testid="run_pipeline_button_mobile"]');
diff --git a/spec/frontend/create_item_dropdown_spec.js b/spec/frontend/create_item_dropdown_spec.js
index 7314eb5eee8..56c09cd731e 100644
--- a/spec/frontend/create_item_dropdown_spec.js
+++ b/spec/frontend/create_item_dropdown_spec.js
@@ -20,8 +20,6 @@ const DROPDOWN_ITEM_DATA = [
];
describe('CreateItemDropdown', () => {
- preloadFixtures('static/create_item_dropdown.html');
-
let $wrapperEl;
let createItemDropdown;
diff --git a/spec/frontend/deprecated_jquery_dropdown_spec.js b/spec/frontend/deprecated_jquery_dropdown_spec.js
index 6070532a1bf..7858f88f8c3 100644
--- a/spec/frontend/deprecated_jquery_dropdown_spec.js
+++ b/spec/frontend/deprecated_jquery_dropdown_spec.js
@@ -10,8 +10,6 @@ jest.mock('~/lib/utils/url_utility', () => ({
}));
describe('deprecatedJQueryDropdown', () => {
- preloadFixtures('static/deprecated_jquery_dropdown.html');
-
const NON_SELECTABLE_CLASSES =
'.divider, .separator, .dropdown-header, .dropdown-menu-empty-item';
const SEARCH_INPUT_SELECTOR = '.dropdown-input-field';
diff --git a/spec/frontend/design_management/components/delete_button_spec.js b/spec/frontend/design_management/components/delete_button_spec.js
index 8f7d8e0b214..f5a841d35b8 100644
--- a/spec/frontend/design_management/components/delete_button_spec.js
+++ b/spec/frontend/design_management/components/delete_button_spec.js
@@ -36,7 +36,7 @@ describe('Batch delete button component', () => {
expect(findButton().attributes('disabled')).toBeTruthy();
});
- it('emits `deleteSelectedDesigns` event on modal ok click', () => {
+ it('emits `delete-selected-designs` event on modal ok click', () => {
createComponent();
findButton().vm.$emit('click');
return wrapper.vm
@@ -46,7 +46,7 @@ describe('Batch delete button component', () => {
return wrapper.vm.$nextTick();
})
.then(() => {
- expect(wrapper.emitted().deleteSelectedDesigns).toBeTruthy();
+ expect(wrapper.emitted('delete-selected-designs')).toBeTruthy();
});
});
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 92e188f4bcc..efadb9b717d 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
@@ -93,7 +93,7 @@ describe('Design discussions component', () => {
});
it('does not render a checkbox in reply form', () => {
- findReplyPlaceholder().vm.$emit('onClick');
+ findReplyPlaceholder().vm.$emit('focus');
return wrapper.vm.$nextTick().then(() => {
expect(findResolveCheckbox().exists()).toBe(false);
@@ -124,7 +124,7 @@ describe('Design discussions component', () => {
});
it('renders a checkbox with Resolve thread text in reply form', () => {
- findReplyPlaceholder().vm.$emit('onClick');
+ findReplyPlaceholder().vm.$emit('focus');
wrapper.setProps({ discussionWithOpenForm: defaultMockDiscussion.id });
return wrapper.vm.$nextTick().then(() => {
@@ -193,7 +193,7 @@ describe('Design discussions component', () => {
});
it('renders a checkbox with Unresolve thread text in reply form', () => {
- findReplyPlaceholder().vm.$emit('onClick');
+ findReplyPlaceholder().vm.$emit('focus');
wrapper.setProps({ discussionWithOpenForm: defaultMockDiscussion.id });
return wrapper.vm.$nextTick().then(() => {
@@ -205,7 +205,7 @@ describe('Design discussions component', () => {
it('hides reply placeholder and opens form on placeholder click', () => {
createComponent();
- findReplyPlaceholder().vm.$emit('onClick');
+ findReplyPlaceholder().vm.$emit('focus');
wrapper.setProps({ discussionWithOpenForm: defaultMockDiscussion.id });
return wrapper.vm.$nextTick().then(() => {
@@ -307,7 +307,7 @@ describe('Design discussions component', () => {
it('emits openForm event on opening the form', () => {
createComponent();
- findReplyPlaceholder().vm.$emit('onClick');
+ findReplyPlaceholder().vm.$emit('focus');
expect(wrapper.emitted('open-form')).toBeTruthy();
});
diff --git a/spec/frontend/design_management/components/list/item_spec.js b/spec/frontend/design_management/components/list/item_spec.js
index caf0f8bb5bc..58636ece91e 100644
--- a/spec/frontend/design_management/components/list/item_spec.js
+++ b/spec/frontend/design_management/components/list/item_spec.js
@@ -8,7 +8,7 @@ const localVue = createLocalVue();
localVue.use(VueRouter);
const router = new VueRouter();
-// Referenced from: doc/api/graphql/reference/gitlab_schema.graphql:DesignVersionEvent
+// Referenced from: gitlab_schema.graphql:DesignVersionEvent
const DESIGN_VERSION_EVENT = {
CREATION: 'CREATION',
DELETION: 'DELETION',
diff --git a/spec/frontend/design_management/components/toolbar/index_spec.js b/spec/frontend/design_management/components/toolbar/index_spec.js
index 44c865d976d..009ffe57744 100644
--- a/spec/frontend/design_management/components/toolbar/index_spec.js
+++ b/spec/frontend/design_management/components/toolbar/index_spec.js
@@ -106,11 +106,11 @@ describe('Design management toolbar component', () => {
});
});
- it('emits `delete` event on deleteButton `deleteSelectedDesigns` event', () => {
+ it('emits `delete` event on deleteButton `delete-selected-designs` event', () => {
createComponent();
return wrapper.vm.$nextTick().then(() => {
- wrapper.find(DeleteButton).vm.$emit('deleteSelectedDesigns');
+ wrapper.find(DeleteButton).vm.$emit('delete-selected-designs');
expect(wrapper.emitted().delete).toBeTruthy();
});
});
diff --git a/spec/frontend/design_management/components/upload/__snapshots__/button_spec.js.snap b/spec/frontend/design_management/components/upload/__snapshots__/button_spec.js.snap
index 2f857247303..904bb2022ca 100644
--- a/spec/frontend/design_management/components/upload/__snapshots__/button_spec.js.snap
+++ b/spec/frontend/design_management/components/upload/__snapshots__/button_spec.js.snap
@@ -19,7 +19,7 @@ exports[`Design management upload button component renders inverted upload desig
<input
accept="image/*"
- class="hide"
+ class="gl-display-none"
multiple="multiple"
name="design_file"
type="file"
@@ -44,7 +44,7 @@ exports[`Design management upload button component renders upload design button
<input
accept="image/*"
- class="hide"
+ class="gl-display-none"
multiple="multiple"
name="design_file"
type="file"
diff --git a/spec/frontend/design_management/pages/index_spec.js b/spec/frontend/design_management/pages/index_spec.js
index 4f162ca8e7f..95cb1ac943c 100644
--- a/spec/frontend/design_management/pages/index_spec.js
+++ b/spec/frontend/design_management/pages/index_spec.js
@@ -97,7 +97,7 @@ describe('Design management index page', () => {
let moveDesignHandler;
const findDesignCheckboxes = () => wrapper.findAll('.design-checkbox');
- const findSelectAllButton = () => wrapper.find('.js-select-all');
+ const findSelectAllButton = () => wrapper.find('[data-testid="select-all-designs-button"');
const findToolbar = () => wrapper.find('.qa-selector-toolbar');
const findDesignCollectionIsCopying = () =>
wrapper.find('[data-testid="design-collection-is-copying"');
@@ -542,7 +542,9 @@ describe('Design management index page', () => {
await nextTick();
expect(findDeleteButton().exists()).toBe(true);
expect(findSelectAllButton().text()).toBe('Deselect all');
- findDeleteButton().vm.$emit('deleteSelectedDesigns');
+
+ findDeleteButton().vm.$emit('delete-selected-designs');
+
const [{ variables }] = mutate.mock.calls[0];
expect(variables.filenames).toStrictEqual([mockDesigns[0].filename, mockDesigns[1].filename]);
});
diff --git a/spec/frontend/diffs/components/app_spec.js b/spec/frontend/diffs/components/app_spec.js
index d2b5338a0cc..34547238c23 100644
--- a/spec/frontend/diffs/components/app_spec.js
+++ b/spec/frontend/diffs/components/app_spec.js
@@ -14,9 +14,6 @@ import HiddenFilesWarning from '~/diffs/components/hidden_files_warning.vue';
import NoChanges from '~/diffs/components/no_changes.vue';
import TreeList from '~/diffs/components/tree_list.vue';
-import { EVT_VIEW_FILE_BY_FILE } from '~/diffs/constants';
-
-import eventHub from '~/diffs/event_hub';
import axios from '~/lib/utils/axios_utils';
import * as urlUtils from '~/lib/utils/url_utility';
import createDiffsStore from '../create_diffs_store';
@@ -699,24 +696,5 @@ describe('diffs/components/app', () => {
},
);
});
-
- describe('control via event stream', () => {
- it.each`
- setting
- ${true}
- ${false}
- `(
- 'triggers the action with the new fileByFile setting - $setting - when the event with that setting is received',
- async ({ setting }) => {
- createComponent();
- await nextTick();
-
- eventHub.$emit(EVT_VIEW_FILE_BY_FILE, { setting });
- await nextTick();
-
- expect(store.state.diffs.viewDiffsFileByFile).toBe(setting);
- },
- );
- });
});
});
diff --git a/spec/frontend/diffs/components/settings_dropdown_spec.js b/spec/frontend/diffs/components/settings_dropdown_spec.js
index 99fa83b64f1..feac88cb802 100644
--- a/spec/frontend/diffs/components/settings_dropdown_spec.js
+++ b/spec/frontend/diffs/components/settings_dropdown_spec.js
@@ -1,82 +1,66 @@
-import { mount, createLocalVue } from '@vue/test-utils';
-import Vuex from 'vuex';
+import { mount } from '@vue/test-utils';
+
+import { extendedWrapper } from 'helpers/vue_test_utils_helper';
+
import SettingsDropdown from '~/diffs/components/settings_dropdown.vue';
-import {
- EVT_VIEW_FILE_BY_FILE,
- PARALLEL_DIFF_VIEW_TYPE,
- INLINE_DIFF_VIEW_TYPE,
-} from '~/diffs/constants';
+import { PARALLEL_DIFF_VIEW_TYPE, INLINE_DIFF_VIEW_TYPE } from '~/diffs/constants';
import eventHub from '~/diffs/event_hub';
-import diffModule from '~/diffs/store/modules';
-const localVue = createLocalVue();
-localVue.use(Vuex);
+import createDiffsStore from '../create_diffs_store';
describe('Diff settings dropdown component', () => {
let wrapper;
let vm;
- let actions;
+ let store;
function createComponent(extendStore = () => {}) {
- const store = new Vuex.Store({
- modules: {
- diffs: {
- namespaced: true,
- actions,
- state: diffModule().state,
- getters: diffModule().getters,
- },
- },
- });
+ store = createDiffsStore();
extendStore(store);
- wrapper = mount(SettingsDropdown, {
- localVue,
- store,
- });
+ wrapper = extendedWrapper(
+ mount(SettingsDropdown, {
+ store,
+ }),
+ );
vm = wrapper.vm;
}
function getFileByFileCheckbox(vueWrapper) {
- return vueWrapper.find('[data-testid="file-by-file"]');
+ return vueWrapper.findByTestId('file-by-file');
+ }
+
+ function setup({ storeUpdater } = {}) {
+ createComponent(storeUpdater);
+ jest.spyOn(store, 'dispatch').mockImplementation(() => {});
}
beforeEach(() => {
- actions = {
- setInlineDiffViewType: jest.fn(),
- setParallelDiffViewType: jest.fn(),
- setRenderTreeList: jest.fn(),
- setShowWhitespace: jest.fn(),
- };
+ setup();
});
afterEach(() => {
+ store.dispatch.mockRestore();
wrapper.destroy();
});
describe('tree view buttons', () => {
it('list view button dispatches setRenderTreeList with false', () => {
- createComponent();
-
wrapper.find('.js-list-view').trigger('click');
- expect(actions.setRenderTreeList).toHaveBeenCalledWith(expect.anything(), false);
+ expect(store.dispatch).toHaveBeenCalledWith('diffs/setRenderTreeList', false);
});
it('tree view button dispatches setRenderTreeList with true', () => {
- createComponent();
-
wrapper.find('.js-tree-view').trigger('click');
- expect(actions.setRenderTreeList).toHaveBeenCalledWith(expect.anything(), true);
+ expect(store.dispatch).toHaveBeenCalledWith('diffs/setRenderTreeList', true);
});
it('sets list button as selected when renderTreeList is false', () => {
- createComponent((store) => {
- Object.assign(store.state.diffs, {
- renderTreeList: false,
- });
+ setup({
+ storeUpdater: (origStore) =>
+ Object.assign(origStore.state.diffs, { renderTreeList: false }),
});
expect(wrapper.find('.js-list-view').classes('selected')).toBe(true);
@@ -84,10 +68,8 @@ describe('Diff settings dropdown component', () => {
});
it('sets tree button as selected when renderTreeList is true', () => {
- createComponent((store) => {
- Object.assign(store.state.diffs, {
- renderTreeList: true,
- });
+ setup({
+ storeUpdater: (origStore) => Object.assign(origStore.state.diffs, { renderTreeList: true }),
});
expect(wrapper.find('.js-list-view').classes('selected')).toBe(false);
@@ -97,10 +79,9 @@ describe('Diff settings dropdown component', () => {
describe('compare changes', () => {
it('sets inline button as selected', () => {
- createComponent((store) => {
- Object.assign(store.state.diffs, {
- diffViewType: INLINE_DIFF_VIEW_TYPE,
- });
+ setup({
+ storeUpdater: (origStore) =>
+ Object.assign(origStore.state.diffs, { diffViewType: INLINE_DIFF_VIEW_TYPE }),
});
expect(wrapper.find('.js-inline-diff-button').classes('selected')).toBe(true);
@@ -108,10 +89,9 @@ describe('Diff settings dropdown component', () => {
});
it('sets parallel button as selected', () => {
- createComponent((store) => {
- Object.assign(store.state.diffs, {
- diffViewType: PARALLEL_DIFF_VIEW_TYPE,
- });
+ setup({
+ storeUpdater: (origStore) =>
+ Object.assign(origStore.state.diffs, { diffViewType: PARALLEL_DIFF_VIEW_TYPE }),
});
expect(wrapper.find('.js-inline-diff-button').classes('selected')).toBe(false);
@@ -119,53 +99,49 @@ describe('Diff settings dropdown component', () => {
});
it('calls setInlineDiffViewType when clicking inline button', () => {
- createComponent();
-
wrapper.find('.js-inline-diff-button').trigger('click');
- expect(actions.setInlineDiffViewType).toHaveBeenCalled();
+ expect(store.dispatch).toHaveBeenCalledWith('diffs/setInlineDiffViewType', expect.anything());
});
it('calls setParallelDiffViewType when clicking parallel button', () => {
- createComponent();
-
wrapper.find('.js-parallel-diff-button').trigger('click');
- expect(actions.setParallelDiffViewType).toHaveBeenCalled();
+ expect(store.dispatch).toHaveBeenCalledWith(
+ 'diffs/setParallelDiffViewType',
+ expect.anything(),
+ );
});
});
describe('whitespace toggle', () => {
it('does not set as checked when showWhitespace is false', () => {
- createComponent((store) => {
- Object.assign(store.state.diffs, {
- showWhitespace: false,
- });
+ setup({
+ storeUpdater: (origStore) =>
+ Object.assign(origStore.state.diffs, { showWhitespace: false }),
});
- expect(wrapper.find('#show-whitespace').element.checked).toBe(false);
+ expect(wrapper.findByTestId('show-whitespace').element.checked).toBe(false);
});
it('sets as checked when showWhitespace is true', () => {
- createComponent((store) => {
- Object.assign(store.state.diffs, {
- showWhitespace: true,
- });
+ setup({
+ storeUpdater: (origStore) => Object.assign(origStore.state.diffs, { showWhitespace: true }),
});
- expect(wrapper.find('#show-whitespace').element.checked).toBe(true);
+ expect(wrapper.findByTestId('show-whitespace').element.checked).toBe(true);
});
- it('calls setShowWhitespace on change', () => {
- createComponent();
+ it('calls setShowWhitespace on change', async () => {
+ const checkbox = wrapper.findByTestId('show-whitespace');
+ const { checked } = checkbox.element;
- const checkbox = wrapper.find('#show-whitespace');
+ checkbox.trigger('click');
- checkbox.element.checked = true;
- checkbox.trigger('change');
+ await vm.$nextTick();
- expect(actions.setShowWhitespace).toHaveBeenCalledWith(expect.anything(), {
- showWhitespace: true,
+ expect(store.dispatch).toHaveBeenCalledWith('diffs/setShowWhitespace', {
+ showWhitespace: !checked,
pushState: true,
});
});
@@ -182,39 +158,35 @@ describe('Diff settings dropdown component', () => {
${false} | ${false}
`(
'sets the checkbox to { checked: $checked } if the fileByFile setting is $fileByFile',
- async ({ fileByFile, checked }) => {
- createComponent((store) => {
- Object.assign(store.state.diffs, {
- viewDiffsFileByFile: fileByFile,
- });
+ ({ fileByFile, checked }) => {
+ setup({
+ storeUpdater: (origStore) =>
+ Object.assign(origStore.state.diffs, { viewDiffsFileByFile: fileByFile }),
});
- await vm.$nextTick();
-
expect(getFileByFileCheckbox(wrapper).element.checked).toBe(checked);
},
);
it.each`
- start | emit
+ start | setting
${true} | ${false}
${false} | ${true}
`(
- 'when the file by file setting starts as $start, toggling the checkbox should emit an event set to $emit',
- async ({ start, emit }) => {
- createComponent((store) => {
- Object.assign(store.state.diffs, {
- viewDiffsFileByFile: start,
- });
+ 'when the file by file setting starts as $start, toggling the checkbox should call setFileByFile with $setting',
+ async ({ start, setting }) => {
+ setup({
+ storeUpdater: (origStore) =>
+ Object.assign(origStore.state.diffs, { viewDiffsFileByFile: start }),
});
- await vm.$nextTick();
-
getFileByFileCheckbox(wrapper).trigger('click');
await vm.$nextTick();
- expect(eventHub.$emit).toHaveBeenCalledWith(EVT_VIEW_FILE_BY_FILE, { setting: emit });
+ expect(store.dispatch).toHaveBeenCalledWith('diffs/setFileByFile', {
+ fileByFile: setting,
+ });
},
);
});
diff --git a/spec/frontend/diffs/mock_data/diff_with_commit.js b/spec/frontend/diffs/mock_data/diff_with_commit.js
index d646294ee84..f3b39bd3577 100644
--- a/spec/frontend/diffs/mock_data/diff_with_commit.js
+++ b/spec/frontend/diffs/mock_data/diff_with_commit.js
@@ -1,7 +1,5 @@
const FIXTURE = 'merge_request_diffs/with_commit.json';
-preloadFixtures(FIXTURE);
-
export default function getDiffWithCommit() {
return getJSONFixture(FIXTURE);
}
diff --git a/spec/frontend/diffs/store/utils_spec.js b/spec/frontend/diffs/store/utils_spec.js
index dcb58f7a380..6af38590610 100644
--- a/spec/frontend/diffs/store/utils_spec.js
+++ b/spec/frontend/diffs/store/utils_spec.js
@@ -275,24 +275,28 @@ describe('DiffsStoreUtils', () => {
describe('trimFirstCharOfLineContent', () => {
it('trims the line when it starts with a space', () => {
+ // eslint-disable-next-line import/no-deprecated
expect(utils.trimFirstCharOfLineContent({ rich_text: ' diff' })).toEqual({
rich_text: 'diff',
});
});
it('trims the line when it starts with a +', () => {
+ // eslint-disable-next-line import/no-deprecated
expect(utils.trimFirstCharOfLineContent({ rich_text: '+diff' })).toEqual({
rich_text: 'diff',
});
});
it('trims the line when it starts with a -', () => {
+ // eslint-disable-next-line import/no-deprecated
expect(utils.trimFirstCharOfLineContent({ rich_text: '-diff' })).toEqual({
rich_text: 'diff',
});
});
it('does not trims the line when it starts with a letter', () => {
+ // eslint-disable-next-line import/no-deprecated
expect(utils.trimFirstCharOfLineContent({ rich_text: 'diff' })).toEqual({
rich_text: 'diff',
});
@@ -303,12 +307,14 @@ describe('DiffsStoreUtils', () => {
rich_text: ' diff',
};
+ // eslint-disable-next-line import/no-deprecated
utils.trimFirstCharOfLineContent(lineObj);
expect(lineObj).toEqual({ rich_text: ' diff' });
});
it('handles a undefined or null parameter', () => {
+ // eslint-disable-next-line import/no-deprecated
expect(utils.trimFirstCharOfLineContent()).toEqual({});
});
});
diff --git a/spec/frontend/diffs/utils/file_reviews_spec.js b/spec/frontend/diffs/utils/file_reviews_spec.js
index a58c19a7245..230ec12409c 100644
--- a/spec/frontend/diffs/utils/file_reviews_spec.js
+++ b/spec/frontend/diffs/utils/file_reviews_spec.js
@@ -49,11 +49,11 @@ describe('File Review(s) utilities', () => {
it.each`
mrReviews | files | fileReviews
- ${{}} | ${[file1, file2]} | ${[false, false]}
- ${{ abc: ['123'] }} | ${[file1, file2]} | ${[true, false]}
- ${{ abc: ['098'] }} | ${[file1, file2]} | ${[false, true]}
- ${{ def: ['123'] }} | ${[file1, file2]} | ${[false, false]}
- ${{ abc: ['123'], def: ['098'] }} | ${[]} | ${[]}
+ ${{}} | ${[file1, file2]} | ${{ 123: false, '098': false }}
+ ${{ abc: ['123'] }} | ${[file1, file2]} | ${{ 123: true, '098': false }}
+ ${{ abc: ['098'] }} | ${[file1, file2]} | ${{ 123: false, '098': true }}
+ ${{ def: ['123'] }} | ${[file1, file2]} | ${{ 123: false, '098': false }}
+ ${{ abc: ['123'], def: ['098'] }} | ${[]} | ${{}}
`(
'returns $fileReviews based on the diff files in state and the existing reviews $reviews',
({ mrReviews, files, fileReviews }) => {
diff --git a/spec/frontend/diffs/utils/preferences_spec.js b/spec/frontend/diffs/utils/preferences_spec.js
index b09db2c1003..2dcc71dc188 100644
--- a/spec/frontend/diffs/utils/preferences_spec.js
+++ b/spec/frontend/diffs/utils/preferences_spec.js
@@ -5,32 +5,25 @@ import {
DIFF_VIEW_ALL_FILES,
} from '~/diffs/constants';
import { fileByFile } from '~/diffs/utils/preferences';
-import { getParameterValues } from '~/lib/utils/url_utility';
-
-jest.mock('~/lib/utils/url_utility');
describe('diffs preferences', () => {
describe('fileByFile', () => {
+ afterEach(() => {
+ Cookies.remove(DIFF_FILE_BY_FILE_COOKIE_NAME);
+ });
+
it.each`
- result | preference | cookie | searchParam
- ${false} | ${false} | ${undefined} | ${undefined}
- ${true} | ${true} | ${undefined} | ${undefined}
- ${true} | ${false} | ${DIFF_VIEW_FILE_BY_FILE} | ${undefined}
- ${false} | ${true} | ${DIFF_VIEW_ALL_FILES} | ${undefined}
- ${true} | ${false} | ${undefined} | ${[DIFF_VIEW_FILE_BY_FILE]}
- ${false} | ${true} | ${undefined} | ${[DIFF_VIEW_ALL_FILES]}
- ${true} | ${false} | ${DIFF_VIEW_FILE_BY_FILE} | ${[DIFF_VIEW_FILE_BY_FILE]}
- ${true} | ${true} | ${DIFF_VIEW_ALL_FILES} | ${[DIFF_VIEW_FILE_BY_FILE]}
- ${false} | ${false} | ${DIFF_VIEW_ALL_FILES} | ${[DIFF_VIEW_ALL_FILES]}
- ${false} | ${true} | ${DIFF_VIEW_FILE_BY_FILE} | ${[DIFF_VIEW_ALL_FILES]}
+ result | preference | cookie
+ ${true} | ${false} | ${DIFF_VIEW_FILE_BY_FILE}
+ ${false} | ${true} | ${DIFF_VIEW_ALL_FILES}
+ ${true} | ${false} | ${DIFF_VIEW_FILE_BY_FILE}
+ ${false} | ${true} | ${DIFF_VIEW_ALL_FILES}
+ ${false} | ${false} | ${DIFF_VIEW_ALL_FILES}
+ ${true} | ${true} | ${DIFF_VIEW_FILE_BY_FILE}
`(
- 'should return $result when { preference: $preference, cookie: $cookie, search: $searchParam }',
- ({ result, preference, cookie, searchParam }) => {
- if (cookie) {
- Cookies.set(DIFF_FILE_BY_FILE_COOKIE_NAME, cookie);
- }
-
- getParameterValues.mockReturnValue(searchParam);
+ 'should return $result when { preference: $preference, cookie: $cookie }',
+ ({ result, preference, cookie }) => {
+ Cookies.set(DIFF_FILE_BY_FILE_COOKIE_NAME, cookie);
expect(fileByFile(preference)).toBe(result);
},
diff --git a/spec/frontend/emoji/components/category_spec.js b/spec/frontend/emoji/components/category_spec.js
new file mode 100644
index 00000000000..afd36a1eb88
--- /dev/null
+++ b/spec/frontend/emoji/components/category_spec.js
@@ -0,0 +1,49 @@
+import { GlIntersectionObserver } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import { nextTick } from 'vue';
+import Category from '~/emoji/components/category.vue';
+import EmojiGroup from '~/emoji/components/emoji_group.vue';
+
+let wrapper;
+function factory(propsData = {}) {
+ wrapper = shallowMount(Category, { propsData });
+}
+
+describe('Emoji category component', () => {
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ beforeEach(() => {
+ factory({
+ category: 'Activity',
+ emojis: [['thumbsup'], ['thumbsdown']],
+ });
+ });
+
+ it('renders emoji groups', () => {
+ expect(wrapper.findAll(EmojiGroup).length).toBe(2);
+ });
+
+ it('renders group', async () => {
+ await wrapper.setData({ renderGroup: true });
+
+ expect(wrapper.find(EmojiGroup).attributes('rendergroup')).toBe('true');
+ });
+
+ it('renders group on appear', async () => {
+ wrapper.find(GlIntersectionObserver).vm.$emit('appear');
+
+ await nextTick();
+
+ expect(wrapper.find(EmojiGroup).attributes('rendergroup')).toBe('true');
+ });
+
+ it('emits appear event on appear', async () => {
+ wrapper.find(GlIntersectionObserver).vm.$emit('appear');
+
+ await nextTick();
+
+ expect(wrapper.emitted().appear[0]).toEqual(['Activity']);
+ });
+});
diff --git a/spec/frontend/emoji/components/emoji_group_spec.js b/spec/frontend/emoji/components/emoji_group_spec.js
new file mode 100644
index 00000000000..1aca2fbb8fc
--- /dev/null
+++ b/spec/frontend/emoji/components/emoji_group_spec.js
@@ -0,0 +1,56 @@
+import { shallowMount } from '@vue/test-utils';
+import Vue from 'vue';
+import { extendedWrapper } from 'helpers/vue_test_utils_helper';
+import EmojiGroup from '~/emoji/components/emoji_group.vue';
+
+Vue.config.ignoredElements = ['gl-emoji'];
+
+let wrapper;
+function factory(propsData = {}) {
+ wrapper = extendedWrapper(
+ shallowMount(EmojiGroup, {
+ propsData,
+ }),
+ );
+}
+
+describe('Emoji group component', () => {
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('does not render any buttons', () => {
+ factory({
+ emojis: [],
+ renderGroup: false,
+ clickEmoji: jest.fn(),
+ });
+
+ expect(wrapper.findByTestId('emoji-button').exists()).toBe(false);
+ });
+
+ it('renders emojis', () => {
+ factory({
+ emojis: ['thumbsup', 'thumbsdown'],
+ renderGroup: true,
+ clickEmoji: jest.fn(),
+ });
+
+ expect(wrapper.findAllByTestId('emoji-button').exists()).toBe(true);
+ expect(wrapper.findAllByTestId('emoji-button').length).toBe(2);
+ });
+
+ it('calls clickEmoji', () => {
+ const clickEmoji = jest.fn();
+
+ factory({
+ emojis: ['thumbsup', 'thumbsdown'],
+ renderGroup: true,
+ clickEmoji,
+ });
+
+ wrapper.findByTestId('emoji-button').trigger('click');
+
+ expect(clickEmoji).toHaveBeenCalledWith('thumbsup');
+ });
+});
diff --git a/spec/frontend/emoji/components/emoji_list_spec.js b/spec/frontend/emoji/components/emoji_list_spec.js
new file mode 100644
index 00000000000..9dc73ef191e
--- /dev/null
+++ b/spec/frontend/emoji/components/emoji_list_spec.js
@@ -0,0 +1,73 @@
+import { shallowMount } from '@vue/test-utils';
+import { nextTick } from 'vue';
+import { extendedWrapper } from 'helpers/vue_test_utils_helper';
+import EmojiList from '~/emoji/components/emoji_list.vue';
+
+jest.mock('~/emoji', () => ({
+ initEmojiMap: jest.fn(() => Promise.resolve()),
+ searchEmoji: jest.fn((search) => [{ emoji: { name: search } }]),
+ getEmojiCategoryMap: jest.fn(() =>
+ Promise.resolve({
+ activity: ['thumbsup', 'thumbsdown'],
+ }),
+ ),
+}));
+
+let wrapper;
+async function factory(render, propsData = { searchValue: '' }) {
+ wrapper = extendedWrapper(
+ shallowMount(EmojiList, {
+ propsData,
+ scopedSlots: {
+ default: '<div data-testid="default-slot">{{props.filteredCategories}}</div>',
+ },
+ }),
+ );
+
+ // Wait for categories to be set
+ await nextTick();
+
+ if (render) {
+ wrapper.setData({ render: true });
+
+ // Wait for component to render
+ await nextTick();
+ }
+}
+
+const findDefaultSlot = () => wrapper.findByTestId('default-slot');
+
+describe('Emoji list component', () => {
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('does not render until render is set', async () => {
+ await factory(false);
+
+ expect(findDefaultSlot().exists()).toBe(false);
+ });
+
+ it('renders with none filtered list', async () => {
+ await factory(true);
+
+ expect(JSON.parse(findDefaultSlot().text())).toEqual({
+ activity: {
+ emojis: [['thumbsup', 'thumbsdown']],
+ height: expect.any(Number),
+ top: expect.any(Number),
+ },
+ });
+ });
+
+ it('renders filtered list of emojis', async () => {
+ await factory(true, { searchValue: 'smile' });
+
+ expect(JSON.parse(findDefaultSlot().text())).toEqual({
+ search: {
+ emojis: [['smile']],
+ height: expect.any(Number),
+ },
+ });
+ });
+});
diff --git a/spec/frontend/environments/environments_app_spec.js b/spec/frontend/environments/environments_app_spec.js
index 50d84b19ce8..542cf58b079 100644
--- a/spec/frontend/environments/environments_app_spec.js
+++ b/spec/frontend/environments/environments_app_spec.js
@@ -97,13 +97,21 @@ describe('Environment', () => {
jest.spyOn(wrapper.vm, 'updateContent').mockImplementation(() => {});
wrapper.find('.gl-pagination li:nth-child(3) .page-link').trigger('click');
- expect(wrapper.vm.updateContent).toHaveBeenCalledWith({ scope: 'available', page: '2' });
+ expect(wrapper.vm.updateContent).toHaveBeenCalledWith({
+ scope: 'available',
+ page: '2',
+ nested: true,
+ });
});
it('should make an API request when using tabs', () => {
jest.spyOn(wrapper.vm, 'updateContent').mockImplementation(() => {});
findEnvironmentsTabStopped().trigger('click');
- expect(wrapper.vm.updateContent).toHaveBeenCalledWith({ scope: 'stopped', page: '1' });
+ expect(wrapper.vm.updateContent).toHaveBeenCalledWith({
+ scope: 'stopped',
+ page: '1',
+ nested: true,
+ });
});
it('should not make the same API request when clicking on the current scope tab', () => {
diff --git a/spec/frontend/environments/folder/environments_folder_view_spec.js b/spec/frontend/environments/folder/environments_folder_view_spec.js
index 3943e89c6cf..d02ed8688c6 100644
--- a/spec/frontend/environments/folder/environments_folder_view_spec.js
+++ b/spec/frontend/environments/folder/environments_folder_view_spec.js
@@ -103,13 +103,18 @@ describe('Environments Folder View', () => {
expect(wrapper.vm.updateContent).toHaveBeenCalledWith({
scope: wrapper.vm.scope,
page: '10',
+ nested: true,
});
});
it('should make an API request when using tabs', () => {
jest.spyOn(wrapper.vm, 'updateContent').mockImplementation(() => {});
findEnvironmentsTabStopped().trigger('click');
- expect(wrapper.vm.updateContent).toHaveBeenCalledWith({ scope: 'stopped', page: '1' });
+ expect(wrapper.vm.updateContent).toHaveBeenCalledWith({
+ scope: 'stopped',
+ page: '1',
+ nested: true,
+ });
});
});
});
@@ -161,7 +166,11 @@ describe('Environments Folder View', () => {
it('should set page to 1', () => {
jest.spyOn(wrapper.vm, 'updateContent').mockImplementation(() => {});
wrapper.vm.onChangeTab('stopped');
- expect(wrapper.vm.updateContent).toHaveBeenCalledWith({ scope: 'stopped', page: '1' });
+ expect(wrapper.vm.updateContent).toHaveBeenCalledWith({
+ scope: 'stopped',
+ page: '1',
+ nested: true,
+ });
});
});
@@ -172,6 +181,7 @@ describe('Environments Folder View', () => {
expect(wrapper.vm.updateContent).toHaveBeenCalledWith({
scope: wrapper.vm.scope,
page: '4',
+ nested: true,
});
});
});
diff --git a/spec/frontend/experimentation/experiment_tracking_spec.js b/spec/frontend/experimentation/experiment_tracking_spec.js
new file mode 100644
index 00000000000..20f45a7015a
--- /dev/null
+++ b/spec/frontend/experimentation/experiment_tracking_spec.js
@@ -0,0 +1,80 @@
+import { TRACKING_CONTEXT_SCHEMA } from '~/experimentation/constants';
+import ExperimentTracking from '~/experimentation/experiment_tracking';
+import { getExperimentData } from '~/experimentation/utils';
+import Tracking from '~/tracking';
+
+let experimentTracking;
+let label;
+let property;
+
+jest.mock('~/tracking');
+jest.mock('~/experimentation/utils', () => ({ getExperimentData: jest.fn() }));
+
+const setup = () => {
+ experimentTracking = new ExperimentTracking('sidebar_experiment', { label, property });
+};
+
+beforeEach(() => {
+ document.body.dataset.page = 'issues-page';
+});
+
+afterEach(() => {
+ label = undefined;
+ property = undefined;
+});
+
+describe('event', () => {
+ beforeEach(() => {
+ getExperimentData.mockReturnValue(undefined);
+ });
+
+ describe('when experiment data exists for experimentName', () => {
+ beforeEach(() => {
+ getExperimentData.mockReturnValue('experiment-data');
+ setup();
+ });
+
+ describe('when providing options', () => {
+ label = 'sidebar-drawer';
+ property = 'dark-mode';
+
+ it('passes them to the tracking call', () => {
+ experimentTracking.event('click_sidebar_close');
+
+ expect(Tracking.event).toHaveBeenCalledTimes(1);
+ expect(Tracking.event).toHaveBeenCalledWith('issues-page', 'click_sidebar_close', {
+ label: 'sidebar-drawer',
+ property: 'dark-mode',
+ context: {
+ schema: TRACKING_CONTEXT_SCHEMA,
+ data: 'experiment-data',
+ },
+ });
+ });
+ });
+
+ it('tracks with the correct context', () => {
+ experimentTracking.event('click_sidebar_trigger');
+
+ expect(Tracking.event).toHaveBeenCalledTimes(1);
+ expect(Tracking.event).toHaveBeenCalledWith('issues-page', 'click_sidebar_trigger', {
+ context: {
+ schema: TRACKING_CONTEXT_SCHEMA,
+ data: 'experiment-data',
+ },
+ });
+ });
+ });
+
+ describe('when experiment data does NOT exists for the experimentName', () => {
+ beforeEach(() => {
+ setup();
+ });
+
+ it('does not track', () => {
+ experimentTracking.event('click_sidebar_close');
+
+ expect(Tracking.event).not.toHaveBeenCalled();
+ });
+ });
+});
diff --git a/spec/frontend/experimentation/utils_spec.js b/spec/frontend/experimentation/utils_spec.js
new file mode 100644
index 00000000000..87dd2d595ba
--- /dev/null
+++ b/spec/frontend/experimentation/utils_spec.js
@@ -0,0 +1,38 @@
+import * as experimentUtils from '~/experimentation/utils';
+
+const TEST_KEY = 'abc';
+
+describe('experiment Utilities', () => {
+ const oldGon = window.gon;
+
+ afterEach(() => {
+ window.gon = oldGon;
+ });
+
+ describe('getExperimentData', () => {
+ it.each`
+ gon | input | output
+ ${{ experiment: { [TEST_KEY]: '_data_' } }} | ${[TEST_KEY]} | ${'_data_'}
+ ${{}} | ${[TEST_KEY]} | ${undefined}
+ `('with input=$input and gon=$gon, returns $output', ({ gon, input, output }) => {
+ window.gon = gon;
+
+ expect(experimentUtils.getExperimentData(...input)).toEqual(output);
+ });
+ });
+
+ describe('isExperimentVariant', () => {
+ it.each`
+ gon | input | output
+ ${{ experiment: { [TEST_KEY]: { variant: 'control' } } }} | ${[TEST_KEY, 'control']} | ${true}
+ ${{ experiment: { [TEST_KEY]: { variant: '_variant_name' } } }} | ${[TEST_KEY, '_variant_name']} | ${true}
+ ${{ experiment: { [TEST_KEY]: { variant: '_variant_name' } } }} | ${[TEST_KEY, '_bogus_name']} | ${false}
+ ${{ experiment: { [TEST_KEY]: { variant: '_variant_name' } } }} | ${['boguskey', '_variant_name']} | ${false}
+ ${{}} | ${[TEST_KEY, '_variant_name']} | ${false}
+ `('with input=$input and gon=$gon, returns $output', ({ gon, input, output }) => {
+ window.gon = gon;
+
+ expect(experimentUtils.isExperimentVariant(...input)).toEqual(output);
+ });
+ });
+});
diff --git a/spec/frontend/feature_flags/components/configure_feature_flags_modal_spec.js b/spec/frontend/feature_flags/components/configure_feature_flags_modal_spec.js
index 84e71ffd204..27ec6a7280f 100644
--- a/spec/frontend/feature_flags/components/configure_feature_flags_modal_spec.js
+++ b/spec/frontend/feature_flags/components/configure_feature_flags_modal_spec.js
@@ -32,8 +32,9 @@ describe('Configure Feature Flags Modal', () => {
});
};
- const findGlModal = () => wrapper.find(GlModal);
+ const findGlModal = () => wrapper.findComponent(GlModal);
const findPrimaryAction = () => findGlModal().props('actionPrimary');
+ const findSecondaryAction = () => findGlModal().props('actionSecondary');
const findProjectNameInput = () => wrapper.find('#project_name_verification');
const findDangerGlAlert = () =>
wrapper.findAll(GlAlert).filter((c) => c.props('variant') === 'danger');
@@ -42,18 +43,18 @@ describe('Configure Feature Flags Modal', () => {
afterEach(() => wrapper.destroy());
beforeEach(factory);
- it('should have Primary and Cancel actions', () => {
- expect(findGlModal().props('actionCancel').text).toBe('Close');
- expect(findPrimaryAction().text).toBe('Regenerate instance ID');
+ it('should have Primary and Secondary actions', () => {
+ expect(findPrimaryAction().text).toBe('Close');
+ expect(findSecondaryAction().text).toBe('Regenerate instance ID');
});
- it('should default disable the primary action', async () => {
- const [{ disabled }] = findPrimaryAction().attributes;
+ it('should default disable the primary action', () => {
+ const [{ disabled }] = findSecondaryAction().attributes;
expect(disabled).toBe(true);
});
it('should emit a `token` event when clicking on the Primary action', async () => {
- findGlModal().vm.$emit('primary', mockEvent);
+ findGlModal().vm.$emit('secondary', mockEvent);
await wrapper.vm.$nextTick();
expect(wrapper.emitted('token')).toEqual([[]]);
expect(mockEvent.preventDefault).toHaveBeenCalled();
@@ -112,10 +113,10 @@ describe('Configure Feature Flags Modal', () => {
afterEach(() => wrapper.destroy());
beforeEach(factory);
- it('should enable the primary action', async () => {
+ it('should enable the secondary action', async () => {
findProjectNameInput().vm.$emit('input', provide.projectName);
await wrapper.vm.$nextTick();
- const [{ disabled }] = findPrimaryAction().attributes;
+ const [{ disabled }] = findSecondaryAction().attributes;
expect(disabled).toBe(false);
});
});
@@ -124,8 +125,8 @@ describe('Configure Feature Flags Modal', () => {
afterEach(() => wrapper.destroy());
beforeEach(factory.bind(null, { canUserRotateToken: false }));
- it('should not display the primary action', async () => {
- expect(findPrimaryAction()).toBe(null);
+ it('should not display the primary action', () => {
+ expect(findSecondaryAction()).toBe(null);
});
it('should not display regenerating instance ID', async () => {
diff --git a/spec/frontend/feature_flags/components/edit_feature_flag_spec.js b/spec/frontend/feature_flags/components/edit_feature_flag_spec.js
index e2717b98ea9..2fd8e524e7a 100644
--- a/spec/frontend/feature_flags/components/edit_feature_flag_spec.js
+++ b/spec/frontend/feature_flags/components/edit_feature_flag_spec.js
@@ -150,5 +150,12 @@ describe('Edit feature flag form', () => {
label: 'feature_flag_toggle',
});
});
+
+ it('should render the toggle with a visually hidden label', () => {
+ expect(wrapper.find(GlToggle).props()).toMatchObject({
+ label: 'Feature flag status',
+ labelPosition: 'hidden',
+ });
+ });
});
});
diff --git a/spec/frontend/filtered_search/dropdown_user_spec.js b/spec/frontend/filtered_search/dropdown_user_spec.js
index 0e2d2ee6c09..961587f7146 100644
--- a/spec/frontend/filtered_search/dropdown_user_spec.js
+++ b/spec/frontend/filtered_search/dropdown_user_spec.js
@@ -78,7 +78,6 @@ describe('Dropdown User', () => {
describe('hideCurrentUser', () => {
const fixtureTemplate = 'issues/issue_list.html';
- preloadFixtures(fixtureTemplate);
let dropdown;
let authorFilterDropdownElement;
diff --git a/spec/frontend/filtered_search/dropdown_utils_spec.js b/spec/frontend/filtered_search/dropdown_utils_spec.js
index 32d1f909d0b..49e14f58630 100644
--- a/spec/frontend/filtered_search/dropdown_utils_spec.js
+++ b/spec/frontend/filtered_search/dropdown_utils_spec.js
@@ -5,7 +5,6 @@ import IssuableFilteredSearchTokenKeys from '~/filtered_search/issuable_filtered
describe('Dropdown Utils', () => {
const issueListFixture = 'issues/issue_list.html';
- preloadFixtures(issueListFixture);
describe('getEscapedText', () => {
it('should return same word when it has no space', () => {
diff --git a/spec/frontend/filtered_search/visual_token_value_spec.js b/spec/frontend/filtered_search/visual_token_value_spec.js
index a2082271efe..772fa7d07ed 100644
--- a/spec/frontend/filtered_search/visual_token_value_spec.js
+++ b/spec/frontend/filtered_search/visual_token_value_spec.js
@@ -133,8 +133,6 @@ describe('Filtered Search Visual Tokens', () => {
const jsonFixtureName = 'labels/project_labels.json';
const dummyEndpoint = '/dummy/endpoint';
- preloadFixtures(jsonFixtureName);
-
let labelData;
beforeAll(() => {
diff --git a/spec/frontend/fixtures/issues.rb b/spec/frontend/fixtures/issues.rb
index a027247bd0d..d6f6ed97626 100644
--- a/spec/frontend/fixtures/issues.rb
+++ b/spec/frontend/fixtures/issues.rb
@@ -16,6 +16,8 @@ RSpec.describe Projects::IssuesController, '(JavaScript fixtures)', type: :contr
end
before do
+ stub_feature_flags(boards_filtered_search: false)
+
project.add_maintainer(user)
sign_in(user)
end
diff --git a/spec/frontend/fixtures/pipelines.rb b/spec/frontend/fixtures/pipelines.rb
index b4b7f0e332f..2a538352abe 100644
--- a/spec/frontend/fixtures/pipelines.rb
+++ b/spec/frontend/fixtures/pipelines.rb
@@ -5,16 +5,22 @@ require 'spec_helper'
RSpec.describe Projects::PipelinesController, '(JavaScript fixtures)', type: :controller do
include JavaScriptFixturesHelpers
- let(:namespace) { create(:namespace, name: 'frontend-fixtures' )}
- let(:project) { create(:project, :repository, namespace: namespace, path: 'pipelines-project') }
- let(:commit) { create(:commit, project: project) }
- let(:commit_without_author) { RepoHelpers.another_sample_commit }
- let!(:user) { create(:user, developer_projects: [project], email: commit.author_email) }
- let!(:pipeline) { create(:ci_pipeline, project: project, sha: commit.id, user: user) }
+ let_it_be(:namespace) { create(:namespace, name: 'frontend-fixtures' )}
+ let_it_be(:project) { create(:project, :repository, namespace: namespace, path: 'pipelines-project') }
+
+ let_it_be(:commit_without_author) { RepoHelpers.another_sample_commit }
let!(:pipeline_without_author) { create(:ci_pipeline, project: project, sha: commit_without_author.id) }
- let!(:pipeline_without_commit) { create(:ci_pipeline, status: :success, project: project, sha: '0000') }
+ let!(:build_pipeline_without_author) { create(:ci_build, pipeline: pipeline_without_author, stage: 'test') }
- render_views
+ let_it_be(:pipeline_without_commit) { create(:ci_pipeline, status: :success, project: project, sha: '0000') }
+ let!(:build_pipeline_without_commit) { create(:ci_build, pipeline: pipeline_without_commit, stage: 'test') }
+
+ let(:commit) { create(:commit, project: project) }
+ let(:user) { create(:user, developer_projects: [project], email: commit.author_email) }
+ let!(:pipeline) { create(:ci_pipeline, :with_test_reports, project: project, sha: commit.id, user: user) }
+ let!(:build_success) { create(:ci_build, pipeline: pipeline, stage: 'build') }
+ let!(:build_test) { create(:ci_build, pipeline: pipeline, stage: 'test') }
+ let!(:build_deploy_failed) { create(:ci_build, status: :failed, pipeline: pipeline, stage: 'deploy') }
before(:all) do
clean_frontend_fixtures('pipelines/')
@@ -32,4 +38,14 @@ RSpec.describe Projects::PipelinesController, '(JavaScript fixtures)', type: :co
expect(response).to be_successful
end
+
+ it "pipelines/test_report.json" do
+ get :test_report, params: {
+ namespace_id: namespace,
+ project_id: project,
+ id: pipeline.id
+ }, format: :json
+
+ expect(response).to be_successful
+ end
end
diff --git a/spec/frontend/fixtures/projects.rb b/spec/frontend/fixtures/projects.rb
index aa2f7dbed36..778ae218160 100644
--- a/spec/frontend/fixtures/projects.rb
+++ b/spec/frontend/fixtures/projects.rb
@@ -3,13 +3,14 @@
require 'spec_helper'
RSpec.describe 'Projects (JavaScript fixtures)', type: :controller do
+ include ApiHelpers
include JavaScriptFixturesHelpers
runners_token = 'runnerstoken:intabulasreferre'
let(:namespace) { create(:namespace, name: 'frontend-fixtures' )}
- let(:project) { create(:project, namespace: namespace, path: 'builds-project', runners_token: runners_token) }
- let(:project_with_repo) { create(:project, :repository, description: 'Code and stuff') }
+ let(:project) { create(:project, namespace: namespace, path: 'builds-project', runners_token: runners_token, avatar: fixture_file_upload('spec/fixtures/dk.png', 'image/png')) }
+ let(:project_with_repo) { create(:project, :repository, description: 'Code and stuff', avatar: fixture_file_upload('spec/fixtures/dk.png', 'image/png')) }
let(:project_variable_populated) { create(:project, namespace: namespace, path: 'builds-project2', runners_token: runners_token) }
let(:user) { project.owner }
@@ -22,7 +23,6 @@ RSpec.describe 'Projects (JavaScript fixtures)', type: :controller do
before do
project_with_repo.add_maintainer(user)
sign_in(user)
- allow(SecureRandom).to receive(:hex).and_return('securerandomhex:thereisnospoon')
end
after do
@@ -48,4 +48,31 @@ RSpec.describe 'Projects (JavaScript fixtures)', type: :controller do
expect(response).to be_successful
end
end
+
+ describe GraphQL::Query, type: :request do
+ include GraphqlHelpers
+
+ context 'access token projects query' do
+ before do
+ project_variable_populated.add_maintainer(user)
+ end
+
+ before(:all) do
+ clean_frontend_fixtures('graphql/projects/access_tokens')
+ end
+
+ fragment_paths = ['graphql_shared/fragments/pageInfo.fragment.graphql']
+ base_input_path = 'access_tokens/graphql/queries/'
+ base_output_path = 'graphql/projects/access_tokens/'
+ query_name = 'get_projects.query.graphql'
+
+ it "#{base_output_path}#{query_name}.json" do
+ query = get_graphql_query_as_string("#{base_input_path}#{query_name}", fragment_paths)
+
+ post_graphql(query, current_user: user, variables: { search: '', first: 2 })
+
+ expect_graphql_errors_to_be_empty
+ end
+ end
+ end
end
diff --git a/spec/frontend/fixtures/test_report.rb b/spec/frontend/fixtures/test_report.rb
deleted file mode 100644
index 3d09078ba68..00000000000
--- a/spec/frontend/fixtures/test_report.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-# frozen_string_literal: true
-
-require "spec_helper"
-
-RSpec.describe Projects::PipelinesController, "(JavaScript fixtures)", type: :controller do
- include JavaScriptFixturesHelpers
-
- let(:namespace) { create(:namespace, name: "frontend-fixtures") }
- let(:project) { create(:project, :repository, namespace: namespace, path: "pipelines-project") }
- let(:commit) { create(:commit, project: project) }
- let(:user) { create(:user, developer_projects: [project], email: commit.author_email) }
- let(:pipeline) { create(:ci_pipeline, :with_test_reports, project: project, user: user) }
-
- render_views
-
- before do
- sign_in(user)
- end
-
- it "pipelines/test_report.json" do
- get :test_report, params: {
- namespace_id: project.namespace,
- project_id: project,
- id: pipeline.id
- }, format: :json
-
- expect(response).to be_successful
- end
-end
diff --git a/spec/frontend/gfm_auto_complete_spec.js b/spec/frontend/gfm_auto_complete_spec.js
index 08368e1f2ca..13dbda9cf55 100644
--- a/spec/frontend/gfm_auto_complete_spec.js
+++ b/spec/frontend/gfm_auto_complete_spec.js
@@ -576,55 +576,95 @@ describe('GfmAutoComplete', () => {
});
});
- describe('Members.templateFunction', () => {
- it('should return html with avatarTag and username', () => {
- expect(
- GfmAutoComplete.Members.templateFunction({
- avatarTag: 'IMG',
- username: 'my-group',
- title: '',
- icon: '',
- availabilityStatus: '',
- }),
- ).toBe('<li>IMG my-group <small></small> </li>');
- });
+ describe('GfmAutoComplete.Members', () => {
+ const member = {
+ name: 'Marge Simpson',
+ username: 'msimpson',
+ search: 'MargeSimpson msimpson',
+ };
- it('should add icon if icon is set', () => {
- expect(
- GfmAutoComplete.Members.templateFunction({
- avatarTag: 'IMG',
- username: 'my-group',
- title: '',
- icon: '<i class="icon"/>',
- availabilityStatus: '',
- }),
- ).toBe('<li>IMG my-group <small></small> <i class="icon"/></li>');
- });
+ describe('templateFunction', () => {
+ it('should return html with avatarTag and username', () => {
+ expect(
+ GfmAutoComplete.Members.templateFunction({
+ avatarTag: 'IMG',
+ username: 'my-group',
+ title: '',
+ icon: '',
+ availabilityStatus: '',
+ }),
+ ).toBe('<li>IMG my-group <small></small> </li>');
+ });
- it('should add escaped title if title is set', () => {
- expect(
- GfmAutoComplete.Members.templateFunction({
- avatarTag: 'IMG',
- username: 'my-group',
- title: 'MyGroup+',
- icon: '<i class="icon"/>',
- availabilityStatus: '',
- }),
- ).toBe('<li>IMG my-group <small>MyGroup+</small> <i class="icon"/></li>');
- });
+ it('should add icon if icon is set', () => {
+ expect(
+ GfmAutoComplete.Members.templateFunction({
+ avatarTag: 'IMG',
+ username: 'my-group',
+ title: '',
+ icon: '<i class="icon"/>',
+ availabilityStatus: '',
+ }),
+ ).toBe('<li>IMG my-group <small></small> <i class="icon"/></li>');
+ });
- it('should add user availability status if availabilityStatus is set', () => {
- expect(
- GfmAutoComplete.Members.templateFunction({
- avatarTag: 'IMG',
- username: 'my-group',
- title: '',
- icon: '<i class="icon"/>',
- availabilityStatus: '<span class="gl-text-gray-500"> (Busy)</span>',
- }),
- ).toBe(
- '<li>IMG my-group <small><span class="gl-text-gray-500"> (Busy)</span></small> <i class="icon"/></li>',
- );
+ it('should add escaped title if title is set', () => {
+ expect(
+ GfmAutoComplete.Members.templateFunction({
+ avatarTag: 'IMG',
+ username: 'my-group',
+ title: 'MyGroup+',
+ icon: '<i class="icon"/>',
+ availabilityStatus: '',
+ }),
+ ).toBe('<li>IMG my-group <small>MyGroup+</small> <i class="icon"/></li>');
+ });
+
+ it('should add user availability status if availabilityStatus is set', () => {
+ expect(
+ GfmAutoComplete.Members.templateFunction({
+ avatarTag: 'IMG',
+ username: 'my-group',
+ title: '',
+ icon: '<i class="icon"/>',
+ availabilityStatus: '<span class="gl-text-gray-500"> (Busy)</span>',
+ }),
+ ).toBe(
+ '<li>IMG my-group <small><span class="gl-text-gray-500"> (Busy)</span></small> <i class="icon"/></li>',
+ );
+ });
+
+ describe('nameOrUsernameStartsWith', () => {
+ it.each`
+ query | result
+ ${'mar'} | ${true}
+ ${'msi'} | ${true}
+ ${'margesimpson'} | ${true}
+ ${'msimpson'} | ${true}
+ ${'arge'} | ${false}
+ ${'rgesimp'} | ${false}
+ ${'maria'} | ${false}
+ ${'homer'} | ${false}
+ `('returns $result for $query', ({ query, result }) => {
+ expect(GfmAutoComplete.Members.nameOrUsernameStartsWith(member, query)).toBe(result);
+ });
+ });
+
+ describe('nameOrUsernameIncludes', () => {
+ it.each`
+ query | result
+ ${'mar'} | ${true}
+ ${'msi'} | ${true}
+ ${'margesimpson'} | ${true}
+ ${'msimpson'} | ${true}
+ ${'arge'} | ${true}
+ ${'rgesimp'} | ${true}
+ ${'maria'} | ${false}
+ ${'homer'} | ${false}
+ `('returns $result for $query', ({ query, result }) => {
+ expect(GfmAutoComplete.Members.nameOrUsernameIncludes(member, query)).toBe(result);
+ });
+ });
});
});
diff --git a/spec/frontend/gl_field_errors_spec.js b/spec/frontend/gl_field_errors_spec.js
index a1737211252..ada3b34e6b1 100644
--- a/spec/frontend/gl_field_errors_spec.js
+++ b/spec/frontend/gl_field_errors_spec.js
@@ -8,8 +8,6 @@ describe('GL Style Field Errors', () => {
testContext = {};
});
- preloadFixtures('static/gl_field_errors.html');
-
beforeEach(() => {
loadFixtures('static/gl_field_errors.html');
const $form = $('form.gl-show-field-errors');
diff --git a/spec/frontend/graphql_shared/utils_spec.js b/spec/frontend/graphql_shared/utils_spec.js
index d392b0f0575..56bfb02ea4a 100644
--- a/spec/frontend/graphql_shared/utils_spec.js
+++ b/spec/frontend/graphql_shared/utils_spec.js
@@ -2,6 +2,8 @@ import {
getIdFromGraphQLId,
convertToGraphQLId,
convertToGraphQLIds,
+ convertFromGraphQLIds,
+ convertNodeIdsFromGraphQLIds,
} from '~/graphql_shared/utils';
const mockType = 'Group';
@@ -81,3 +83,35 @@ describe('convertToGraphQLIds', () => {
expect(() => convertToGraphQLIds(type, ids)).toThrow(new TypeError(message));
});
});
+
+describe('convertFromGraphQLIds', () => {
+ it.each`
+ ids | expected
+ ${[mockGid]} | ${[mockId]}
+ ${[mockGid, 'invalid id']} | ${[mockId, null]}
+ `('converts $ids from GraphQL Ids', ({ ids, expected }) => {
+ expect(convertFromGraphQLIds(ids)).toEqual(expected);
+ });
+
+ it("throws TypeError if `ids` parameter isn't an array", () => {
+ expect(() => convertFromGraphQLIds('invalid')).toThrow(
+ new TypeError('ids must be an array; got string'),
+ );
+ });
+});
+
+describe('convertNodeIdsFromGraphQLIds', () => {
+ it.each`
+ nodes | expected
+ ${[{ id: mockGid, name: 'foo bar' }, { id: mockGid, name: 'baz' }]} | ${[{ id: mockId, name: 'foo bar' }, { id: mockId, name: 'baz' }]}
+ ${[{ name: 'foo bar' }]} | ${[{ name: 'foo bar' }]}
+ `('converts `id` properties in $nodes from GraphQL Id', ({ nodes, expected }) => {
+ expect(convertNodeIdsFromGraphQLIds(nodes)).toEqual(expected);
+ });
+
+ it("throws TypeError if `nodes` parameter isn't an array", () => {
+ expect(() => convertNodeIdsFromGraphQLIds('invalid')).toThrow(
+ new TypeError('nodes must be an array; got string'),
+ );
+ });
+});
diff --git a/spec/frontend/groups/components/group_item_spec.js b/spec/frontend/groups/components/group_item_spec.js
index 4fcc9bafa46..5a9f640392f 100644
--- a/spec/frontend/groups/components/group_item_spec.js
+++ b/spec/frontend/groups/components/group_item_spec.js
@@ -188,7 +188,7 @@ describe('GroupItemComponent', () => {
});
it('should render component template correctly', () => {
- const visibilityIconEl = vm.$el.querySelector('.item-visibility');
+ const visibilityIconEl = vm.$el.querySelector('[data-testid="group-visibility-icon"]');
expect(vm.$el.getAttribute('id')).toBe('group-55');
expect(vm.$el.classList.contains('group-row')).toBeTruthy();
@@ -209,8 +209,7 @@ describe('GroupItemComponent', () => {
expect(vm.$el.querySelector('.title a.no-expand')).toBeDefined();
expect(visibilityIconEl).not.toBe(null);
- expect(visibilityIconEl.title).toBe(vm.visibilityTooltip);
- expect(visibilityIconEl.querySelectorAll('svg').length).toBeGreaterThan(0);
+ expect(visibilityIconEl.getAttribute('title')).toBe(vm.visibilityTooltip);
expect(vm.$el.querySelector('.access-type')).toBeDefined();
expect(vm.$el.querySelector('.description')).toBeDefined();
diff --git a/spec/frontend/header_spec.js b/spec/frontend/header_spec.js
index 27305abfafa..4ca6d7259bd 100644
--- a/spec/frontend/header_spec.js
+++ b/spec/frontend/header_spec.js
@@ -15,7 +15,6 @@ describe('Header', () => {
$(document).trigger('todo:toggle', newCount);
}
- preloadFixtures(fixtureTemplate);
beforeEach(() => {
initTodoToggle();
loadFixtures(fixtureTemplate);
diff --git a/spec/frontend/ide/components/pipelines/__snapshots__/list_spec.js.snap b/spec/frontend/ide/components/pipelines/__snapshots__/list_spec.js.snap
index efa58a4a47b..194a619c4aa 100644
--- a/spec/frontend/ide/components/pipelines/__snapshots__/list_spec.js.snap
+++ b/spec/frontend/ide/components/pipelines/__snapshots__/list_spec.js.snap
@@ -10,7 +10,6 @@ exports[`IDE pipelines list when loaded renders empty state when no latestPipeli
cansetci="true"
class="mb-auto mt-auto"
emptystatesvgpath="http://test.host"
- helppagepath="http://test.host"
/>
</div>
`;
diff --git a/spec/frontend/ide/components/pipelines/list_spec.js b/spec/frontend/ide/components/pipelines/list_spec.js
index 58d8c0629fb..a917f4c0230 100644
--- a/spec/frontend/ide/components/pipelines/list_spec.js
+++ b/spec/frontend/ide/components/pipelines/list_spec.js
@@ -19,7 +19,6 @@ describe('IDE pipelines list', () => {
let wrapper;
const defaultState = {
- links: { ciHelpPagePath: TEST_HOST },
pipelinesEmptyStateSvgPath: TEST_HOST,
};
const defaultPipelinesState = {
diff --git a/spec/frontend/ide/components/repo_editor_spec.js b/spec/frontend/ide/components/repo_editor_spec.js
index 1985feb1615..a3b327343e5 100644
--- a/spec/frontend/ide/components/repo_editor_spec.js
+++ b/spec/frontend/ide/components/repo_editor_spec.js
@@ -1,11 +1,15 @@
+import { shallowMount } from '@vue/test-utils';
import MockAdapter from 'axios-mock-adapter';
-import { Range } from 'monaco-editor';
+import { editor as monacoEditor, Range } from 'monaco-editor';
import Vue from 'vue';
import Vuex from 'vuex';
import '~/behaviors/markdown/render_gfm';
-import { createComponentWithStore } from 'helpers/vue_mount_component_helper';
import waitForPromises from 'helpers/wait_for_promises';
import waitUsingRealTimer from 'helpers/wait_using_real_timer';
+import { exampleConfigs, exampleFiles } from 'jest/ide/lib/editorconfig/mock_data';
+import { EDITOR_CODE_INSTANCE_FN, EDITOR_DIFF_INSTANCE_FN } from '~/editor/constants';
+import EditorLite from '~/editor/editor_lite';
+import { EditorWebIdeExtension } from '~/editor/extensions/editor_lite_webide_ext';
import RepoEditor from '~/ide/components/repo_editor.vue';
import {
leftSidebarViews,
@@ -13,733 +17,723 @@ import {
FILE_VIEW_MODE_PREVIEW,
viewerTypes,
} from '~/ide/constants';
-import Editor from '~/ide/lib/editor';
+import ModelManager from '~/ide/lib/common/model_manager';
import service from '~/ide/services';
import { createStoreOptions } from '~/ide/stores';
import axios from '~/lib/utils/axios_utils';
+import ContentViewer from '~/vue_shared/components/content_viewer/content_viewer.vue';
import { file } from '../helpers';
-import { exampleConfigs, exampleFiles } from '../lib/editorconfig/mock_data';
+
+const defaultFileProps = {
+ ...file('file.txt'),
+ content: 'hello world',
+ active: true,
+ tempFile: true,
+};
+const createActiveFile = (props) => {
+ return {
+ ...defaultFileProps,
+ ...props,
+ };
+};
+
+const dummyFile = {
+ markdown: (() =>
+ createActiveFile({
+ projectId: 'namespace/project',
+ path: 'sample.md',
+ name: 'sample.md',
+ }))(),
+ binary: (() =>
+ createActiveFile({
+ name: 'file.dat',
+ content: 'ðŸ±', // non-ascii binary content,
+ }))(),
+ empty: (() =>
+ createActiveFile({
+ tempFile: false,
+ content: '',
+ raw: '',
+ }))(),
+};
+
+const prepareStore = (state, activeFile) => {
+ const localState = {
+ openFiles: [activeFile],
+ projects: {
+ 'gitlab-org/gitlab': {
+ branches: {
+ master: {
+ name: 'master',
+ commit: {
+ id: 'abcdefgh',
+ },
+ },
+ },
+ },
+ },
+ currentProjectId: 'gitlab-org/gitlab',
+ currentBranchId: 'master',
+ entries: {
+ [activeFile.path]: activeFile,
+ },
+ };
+ const storeOptions = createStoreOptions();
+ return new Vuex.Store({
+ ...createStoreOptions(),
+ state: {
+ ...storeOptions.state,
+ ...localState,
+ ...state,
+ },
+ });
+};
describe('RepoEditor', () => {
+ let wrapper;
let vm;
- let store;
+ let createInstanceSpy;
+ let createDiffInstanceSpy;
+ let createModelSpy;
const waitForEditorSetup = () =>
new Promise((resolve) => {
vm.$once('editorSetup', resolve);
});
- const createComponent = () => {
- if (vm) {
- throw new Error('vm already exists');
- }
- vm = createComponentWithStore(Vue.extend(RepoEditor), store, {
- file: store.state.openFiles[0],
+ const createComponent = async ({ state = {}, activeFile = defaultFileProps } = {}) => {
+ const store = prepareStore(state, activeFile);
+ wrapper = shallowMount(RepoEditor, {
+ store,
+ propsData: {
+ file: store.state.openFiles[0],
+ },
+ mocks: {
+ ContentViewer,
+ },
});
-
+ await waitForPromises();
+ vm = wrapper.vm;
jest.spyOn(vm, 'getFileData').mockResolvedValue();
jest.spyOn(vm, 'getRawFileData').mockResolvedValue();
-
- vm.$mount();
};
- const createOpenFile = (path) => {
- const origFile = store.state.openFiles[0];
- const newFile = { ...origFile, path, key: path, name: 'myfile.txt', content: 'hello world' };
-
- store.state.entries[path] = newFile;
-
- store.state.openFiles = [newFile];
- };
+ const findEditor = () => wrapper.find('[data-testid="editor-container"]');
+ const findTabs = () => wrapper.findAll('.ide-mode-tabs .nav-links li');
+ const findPreviewTab = () => wrapper.find('[data-testid="preview-tab"]');
beforeEach(() => {
- const f = {
- ...file('file.txt'),
- content: 'hello world',
- };
-
- const storeOptions = createStoreOptions();
- store = new Vuex.Store(storeOptions);
-
- f.active = true;
- f.tempFile = true;
-
- store.state.openFiles.push(f);
- store.state.projects = {
- 'gitlab-org/gitlab': {
- branches: {
- master: {
- name: 'master',
- commit: {
- id: 'abcdefgh',
- },
- },
- },
- },
- };
- store.state.currentProjectId = 'gitlab-org/gitlab';
- store.state.currentBranchId = 'master';
-
- Vue.set(store.state.entries, f.path, f);
+ createInstanceSpy = jest.spyOn(EditorLite.prototype, EDITOR_CODE_INSTANCE_FN);
+ createDiffInstanceSpy = jest.spyOn(EditorLite.prototype, EDITOR_DIFF_INSTANCE_FN);
+ createModelSpy = jest.spyOn(monacoEditor, 'createModel');
+ jest.spyOn(service, 'getFileData').mockResolvedValue();
+ jest.spyOn(service, 'getRawFileData').mockResolvedValue();
});
afterEach(() => {
- vm.$destroy();
- vm = null;
-
- Editor.editorInstance.dispose();
+ jest.clearAllMocks();
+ // create a new model each time, otherwise tests conflict with each other
+ // because of same model being used in multiple tests
+ // eslint-disable-next-line no-undef
+ monaco.editor.getModels().forEach((model) => model.dispose());
+ wrapper.destroy();
+ wrapper = null;
});
- const findEditor = () => vm.$el.querySelector('.multi-file-editor-holder');
- const changeViewMode = (viewMode) =>
- store.dispatch('editor/updateFileEditor', { path: vm.file.path, data: { viewMode } });
-
describe('default', () => {
- beforeEach(() => {
- createComponent();
-
- return waitForEditorSetup();
+ it.each`
+ boolVal | textVal
+ ${true} | ${'all'}
+ ${false} | ${'none'}
+ `('sets renderWhitespace to "$textVal"', async ({ boolVal, textVal } = {}) => {
+ await createComponent({
+ state: {
+ renderWhitespaceInCode: boolVal,
+ },
+ });
+ expect(vm.editorOptions.renderWhitespace).toEqual(textVal);
});
- it('sets renderWhitespace to `all`', () => {
- vm.$store.state.renderWhitespaceInCode = true;
-
- expect(vm.editorOptions.renderWhitespace).toEqual('all');
+ it('renders an ide container', async () => {
+ await createComponent();
+ expect(findEditor().isVisible()).toBe(true);
});
- it('sets renderWhitespace to `none`', () => {
- vm.$store.state.renderWhitespaceInCode = false;
+ it('renders only an edit tab', async () => {
+ await createComponent();
+ const tabs = findTabs();
- expect(vm.editorOptions.renderWhitespace).toEqual('none');
+ expect(tabs).toHaveLength(1);
+ expect(tabs.at(0).text()).toBe('Edit');
});
+ });
- it('renders an ide container', () => {
- expect(vm.shouldHideEditor).toBeFalsy();
- expect(vm.showEditor).toBe(true);
- expect(findEditor()).not.toHaveCss({ display: 'none' });
- });
+ describe('when file is markdown', () => {
+ let mock;
+ let activeFile;
- it('renders only an edit tab', (done) => {
- Vue.nextTick(() => {
- const tabs = vm.$el.querySelectorAll('.ide-mode-tabs .nav-links li');
+ beforeEach(() => {
+ activeFile = dummyFile.markdown;
- expect(tabs.length).toBe(1);
- expect(tabs[0].textContent.trim()).toBe('Edit');
+ mock = new MockAdapter(axios);
- done();
+ mock.onPost(/(.*)\/preview_markdown/).reply(200, {
+ body: `<p>${defaultFileProps.content}</p>`,
});
});
- describe('when file is markdown', () => {
- let mock;
-
- beforeEach(() => {
- mock = new MockAdapter(axios);
-
- mock.onPost(/(.*)\/preview_markdown/).reply(200, {
- body: '<p>testing 123</p>',
- });
-
- Vue.set(vm, 'file', {
- ...vm.file,
- projectId: 'namespace/project',
- path: 'sample.md',
- name: 'sample.md',
- content: 'testing 123',
- });
-
- vm.$store.state.entries[vm.file.path] = vm.file;
+ afterEach(() => {
+ mock.restore();
+ });
- return vm.$nextTick();
- });
+ it('renders an Edit and a Preview Tab', async () => {
+ await createComponent({ activeFile });
+ const tabs = findTabs();
- afterEach(() => {
- mock.restore();
- });
+ expect(tabs).toHaveLength(2);
+ expect(tabs.at(0).text()).toBe('Edit');
+ expect(tabs.at(1).text()).toBe('Preview Markdown');
+ });
- it('renders an Edit and a Preview Tab', (done) => {
- Vue.nextTick(() => {
- const tabs = vm.$el.querySelectorAll('.ide-mode-tabs .nav-links li');
+ it('renders markdown for tempFile', async () => {
+ // by default files created in the spec are temp: no need for explicitly sending the param
+ await createComponent({ activeFile });
- expect(tabs.length).toBe(2);
- expect(tabs[0].textContent.trim()).toBe('Edit');
- expect(tabs[1].textContent.trim()).toBe('Preview Markdown');
+ findPreviewTab().trigger('click');
+ await waitForPromises();
+ expect(wrapper.find(ContentViewer).html()).toContain(defaultFileProps.content);
+ });
- done();
- });
+ it('shows no tabs when not in Edit mode', async () => {
+ await createComponent({
+ state: {
+ currentActivityView: leftSidebarViews.review.name,
+ },
+ activeFile,
});
+ expect(findTabs()).toHaveLength(0);
+ });
+ });
- it('renders markdown for tempFile', (done) => {
- vm.file.tempFile = true;
-
- vm.$nextTick()
- .then(() => {
- vm.$el.querySelectorAll('.ide-mode-tabs .nav-links a')[1].click();
- })
- .then(waitForPromises)
- .then(() => {
- expect(vm.$el.querySelector('.preview-container').innerHTML).toContain(
- '<p>testing 123</p>',
- );
- })
- .then(done)
- .catch(done.fail);
- });
+ describe('when file is binary and not raw', () => {
+ beforeEach(async () => {
+ const activeFile = dummyFile.binary;
+ await createComponent({ activeFile });
+ });
- describe('when not in edit mode', () => {
- beforeEach(async () => {
- await vm.$nextTick();
+ it('does not render the IDE', () => {
+ expect(findEditor().isVisible()).toBe(false);
+ });
- vm.$store.state.currentActivityView = leftSidebarViews.review.name;
+ it('does not create an instance', () => {
+ expect(createInstanceSpy).not.toHaveBeenCalled();
+ expect(createDiffInstanceSpy).not.toHaveBeenCalled();
+ });
+ });
- return vm.$nextTick();
+ describe('createEditorInstance', () => {
+ it.each`
+ viewer | diffInstance
+ ${viewerTypes.edit} | ${undefined}
+ ${viewerTypes.diff} | ${true}
+ ${viewerTypes.mr} | ${true}
+ `(
+ 'creates instance of correct type when viewer is $viewer',
+ async ({ viewer, diffInstance }) => {
+ await createComponent({
+ state: { viewer },
});
+ const isDiff = () => {
+ return diffInstance ? { isDiff: true } : {};
+ };
+ expect(createInstanceSpy).toHaveBeenCalledWith(expect.objectContaining(isDiff()));
+ expect(createDiffInstanceSpy).toHaveBeenCalledTimes((diffInstance && 1) || 0);
+ },
+ );
- it('shows no tabs', () => {
- expect(vm.$el.querySelectorAll('.ide-mode-tabs .nav-links a')).toHaveLength(0);
+ it('installs the WebIDE extension', async () => {
+ const extensionSpy = jest.spyOn(EditorLite, 'instanceApplyExtension');
+ await createComponent();
+ expect(extensionSpy).toHaveBeenCalled();
+ Reflect.ownKeys(EditorWebIdeExtension.prototype)
+ .filter((fn) => fn !== 'constructor')
+ .forEach((fn) => {
+ expect(vm.editor[fn]).toBe(EditorWebIdeExtension.prototype[fn]);
});
- });
});
+ });
- describe('when open file is binary and not raw', () => {
- beforeEach((done) => {
- vm.file.name = 'file.dat';
- vm.file.content = 'ðŸ±'; // non-ascii binary content
- jest.spyOn(vm.editor, 'createInstance').mockImplementation();
- jest.spyOn(vm.editor, 'createDiffInstance').mockImplementation();
-
- vm.$nextTick(done);
- });
-
- it('does not render the IDE', () => {
- expect(vm.shouldHideEditor).toBeTruthy();
- });
-
- it('does not call createInstance', async () => {
- // Mirror the act's in the `createEditorInstance`
- vm.createEditorInstance();
-
- await vm.$nextTick();
+ describe('setupEditor', () => {
+ beforeEach(async () => {
+ await createComponent();
+ });
- expect(vm.editor.createInstance).not.toHaveBeenCalled();
- expect(vm.editor.createDiffInstance).not.toHaveBeenCalled();
- });
+ it('creates new model on load', () => {
+ // We always create two models per file to be able to build a diff of changes
+ expect(createModelSpy).toHaveBeenCalledTimes(2);
+ // The model with the most recent changes is the last one
+ const [content] = createModelSpy.mock.calls[1];
+ expect(content).toBe(defaultFileProps.content);
});
- describe('createEditorInstance', () => {
- it('calls createInstance when viewer is editor', (done) => {
- jest.spyOn(vm.editor, 'createInstance').mockImplementation();
+ it('does not create a new model on subsequent calls to setupEditor and re-uses the already-existing model', () => {
+ const existingModel = vm.model;
+ createModelSpy.mockClear();
- vm.createEditorInstance();
+ vm.setupEditor();
- vm.$nextTick(() => {
- expect(vm.editor.createInstance).toHaveBeenCalled();
+ expect(createModelSpy).not.toHaveBeenCalled();
+ expect(vm.model).toBe(existingModel);
+ });
- done();
- });
- });
+ it('adds callback methods', () => {
+ jest.spyOn(vm.editor, 'onPositionChange');
+ jest.spyOn(vm.model, 'onChange');
+ jest.spyOn(vm.model, 'updateOptions');
- it('calls createDiffInstance when viewer is diff', (done) => {
- vm.$store.state.viewer = 'diff';
+ vm.setupEditor();
- jest.spyOn(vm.editor, 'createDiffInstance').mockImplementation();
+ expect(vm.editor.onPositionChange).toHaveBeenCalledTimes(1);
+ expect(vm.model.onChange).toHaveBeenCalledTimes(1);
+ expect(vm.model.updateOptions).toHaveBeenCalledWith(vm.rules);
+ });
- vm.createEditorInstance();
+ it('updates state with the value of the model', () => {
+ const newContent = 'As Gregor Samsa\n awoke one morning\n';
+ vm.model.setValue(newContent);
- vm.$nextTick(() => {
- expect(vm.editor.createDiffInstance).toHaveBeenCalled();
+ vm.setupEditor();
- done();
- });
- });
+ expect(vm.file.content).toBe(newContent);
+ });
- it('calls createDiffInstance when viewer is a merge request diff', (done) => {
- vm.$store.state.viewer = 'mrdiff';
+ it('sets head model as staged file', () => {
+ vm.modelManager.dispose();
+ const addModelSpy = jest.spyOn(ModelManager.prototype, 'addModel');
- jest.spyOn(vm.editor, 'createDiffInstance').mockImplementation();
+ vm.$store.state.stagedFiles.push({ ...vm.file, key: 'staged' });
+ vm.file.staged = true;
+ vm.file.key = `unstaged-${vm.file.key}`;
- vm.createEditorInstance();
+ vm.setupEditor();
- vm.$nextTick(() => {
- expect(vm.editor.createDiffInstance).toHaveBeenCalled();
+ expect(addModelSpy).toHaveBeenCalledWith(vm.file, vm.$store.state.stagedFiles[0]);
+ });
+ });
- done();
- });
- });
+ describe('editor updateDimensions', () => {
+ let updateDimensionsSpy;
+ let updateDiffViewSpy;
+ beforeEach(async () => {
+ await createComponent();
+ updateDimensionsSpy = jest.spyOn(vm.editor, 'updateDimensions');
+ updateDiffViewSpy = jest.spyOn(vm.editor, 'updateDiffView').mockImplementation();
});
- describe('setupEditor', () => {
- it('creates new model', () => {
- jest.spyOn(vm.editor, 'createModel');
+ it('calls updateDimensions only when panelResizing is false', async () => {
+ expect(updateDimensionsSpy).not.toHaveBeenCalled();
+ expect(updateDiffViewSpy).not.toHaveBeenCalled();
+ expect(vm.$store.state.panelResizing).toBe(false); // default value
- Editor.editorInstance.modelManager.dispose();
+ vm.$store.state.panelResizing = true;
+ await vm.$nextTick();
- vm.setupEditor();
+ expect(updateDimensionsSpy).not.toHaveBeenCalled();
+ expect(updateDiffViewSpy).not.toHaveBeenCalled();
- expect(vm.editor.createModel).toHaveBeenCalledWith(vm.file, null);
- expect(vm.model).not.toBeNull();
- });
+ vm.$store.state.panelResizing = false;
+ await vm.$nextTick();
- it('attaches model to editor', () => {
- jest.spyOn(vm.editor, 'attachModel');
+ expect(updateDimensionsSpy).toHaveBeenCalledTimes(1);
+ expect(updateDiffViewSpy).toHaveBeenCalledTimes(1);
- Editor.editorInstance.modelManager.dispose();
+ vm.$store.state.panelResizing = true;
+ await vm.$nextTick();
- vm.setupEditor();
+ expect(updateDimensionsSpy).toHaveBeenCalledTimes(1);
+ expect(updateDiffViewSpy).toHaveBeenCalledTimes(1);
+ });
- expect(vm.editor.attachModel).toHaveBeenCalledWith(vm.model);
- });
+ it('calls updateDimensions when rightPane is toggled', async () => {
+ expect(updateDimensionsSpy).not.toHaveBeenCalled();
+ expect(updateDiffViewSpy).not.toHaveBeenCalled();
+ expect(vm.$store.state.rightPane.isOpen).toBe(false); // default value
- it('attaches model to merge request editor', () => {
- vm.$store.state.viewer = 'mrdiff';
- vm.file.mrChange = true;
- jest.spyOn(vm.editor, 'attachMergeRequestModel').mockImplementation();
+ vm.$store.state.rightPane.isOpen = true;
+ await vm.$nextTick();
- Editor.editorInstance.modelManager.dispose();
+ expect(updateDimensionsSpy).toHaveBeenCalledTimes(1);
+ expect(updateDiffViewSpy).toHaveBeenCalledTimes(1);
- vm.setupEditor();
+ vm.$store.state.rightPane.isOpen = false;
+ await vm.$nextTick();
- expect(vm.editor.attachMergeRequestModel).toHaveBeenCalledWith(vm.model);
- });
+ expect(updateDimensionsSpy).toHaveBeenCalledTimes(2);
+ expect(updateDiffViewSpy).toHaveBeenCalledTimes(2);
+ });
+ });
- it('does not attach model to merge request editor when not a MR change', () => {
- vm.$store.state.viewer = 'mrdiff';
- vm.file.mrChange = false;
- jest.spyOn(vm.editor, 'attachMergeRequestModel').mockImplementation();
+ describe('editor tabs', () => {
+ beforeEach(async () => {
+ await createComponent();
+ });
- Editor.editorInstance.modelManager.dispose();
+ it.each`
+ mode | isVisible
+ ${'edit'} | ${true}
+ ${'review'} | ${false}
+ ${'commit'} | ${false}
+ `('tabs in $mode are $isVisible', async ({ mode, isVisible } = {}) => {
+ vm.$store.state.currentActivityView = leftSidebarViews[mode].name;
- vm.setupEditor();
+ await vm.$nextTick();
+ expect(wrapper.find('.nav-links').exists()).toBe(isVisible);
+ });
+ });
- expect(vm.editor.attachMergeRequestModel).not.toHaveBeenCalledWith(vm.model);
+ describe('files in preview mode', () => {
+ let updateDimensionsSpy;
+ const changeViewMode = (viewMode) =>
+ vm.$store.dispatch('editor/updateFileEditor', {
+ path: vm.file.path,
+ data: { viewMode },
});
- it('adds callback methods', () => {
- jest.spyOn(vm.editor, 'onPositionChange');
-
- Editor.editorInstance.modelManager.dispose();
-
- vm.setupEditor();
-
- expect(vm.editor.onPositionChange).toHaveBeenCalled();
- expect(vm.model.events.size).toBe(2);
+ beforeEach(async () => {
+ await createComponent({
+ activeFile: dummyFile.markdown,
});
- it('updates state with the value of the model', () => {
- vm.model.setValue('testing 1234\n');
-
- vm.setupEditor();
-
- expect(vm.file.content).toBe('testing 1234\n');
- });
+ updateDimensionsSpy = jest.spyOn(vm.editor, 'updateDimensions');
- it('sets head model as staged file', () => {
- jest.spyOn(vm.editor, 'createModel');
+ changeViewMode(FILE_VIEW_MODE_PREVIEW);
+ await vm.$nextTick();
+ });
- Editor.editorInstance.modelManager.dispose();
+ it('do not show the editor', () => {
+ expect(vm.showEditor).toBe(false);
+ expect(findEditor().isVisible()).toBe(false);
+ });
- vm.$store.state.stagedFiles.push({ ...vm.file, key: 'staged' });
- vm.file.staged = true;
- vm.file.key = `unstaged-${vm.file.key}`;
+ it('updates dimensions when switching view back to edit', async () => {
+ expect(updateDimensionsSpy).not.toHaveBeenCalled();
- vm.setupEditor();
+ changeViewMode(FILE_VIEW_MODE_EDITOR);
+ await vm.$nextTick();
- expect(vm.editor.createModel).toHaveBeenCalledWith(vm.file, vm.$store.state.stagedFiles[0]);
- });
+ expect(updateDimensionsSpy).toHaveBeenCalled();
});
+ });
- describe('editor updateDimensions', () => {
- beforeEach(() => {
- jest.spyOn(vm.editor, 'updateDimensions');
- jest.spyOn(vm.editor, 'updateDiffView').mockImplementation();
- });
-
- it('calls updateDimensions when panelResizing is false', (done) => {
- vm.$store.state.panelResizing = true;
-
- vm.$nextTick()
- .then(() => {
- vm.$store.state.panelResizing = false;
- })
- .then(vm.$nextTick)
- .then(() => {
- expect(vm.editor.updateDimensions).toHaveBeenCalled();
- expect(vm.editor.updateDiffView).toHaveBeenCalled();
- })
- .then(done)
- .catch(done.fail);
- });
-
- it('does not call updateDimensions when panelResizing is true', (done) => {
- vm.$store.state.panelResizing = true;
+ describe('initEditor', () => {
+ const hideEditorAndRunFn = async () => {
+ jest.clearAllMocks();
+ jest.spyOn(vm, 'shouldHideEditor', 'get').mockReturnValue(true);
- vm.$nextTick(() => {
- expect(vm.editor.updateDimensions).not.toHaveBeenCalled();
- expect(vm.editor.updateDiffView).not.toHaveBeenCalled();
+ vm.initEditor();
+ await vm.$nextTick();
+ };
- done();
- });
+ it('does not fetch file information for temp entries', async () => {
+ await createComponent({
+ activeFile: createActiveFile(),
});
- it('calls updateDimensions when rightPane is opened', (done) => {
- vm.$store.state.rightPane.isOpen = true;
-
- vm.$nextTick(() => {
- expect(vm.editor.updateDimensions).toHaveBeenCalled();
- expect(vm.editor.updateDiffView).toHaveBeenCalled();
-
- done();
- });
- });
+ expect(vm.getFileData).not.toHaveBeenCalled();
});
- describe('show tabs', () => {
- it('shows tabs in edit mode', () => {
- expect(vm.$el.querySelector('.nav-links')).not.toBe(null);
+ it('is being initialised for files without content even if shouldHideEditor is `true`', async () => {
+ await createComponent({
+ activeFile: dummyFile.empty,
});
- it('hides tabs in review mode', (done) => {
- vm.$store.state.currentActivityView = leftSidebarViews.review.name;
+ await hideEditorAndRunFn();
- vm.$nextTick(() => {
- expect(vm.$el.querySelector('.nav-links')).toBe(null);
+ expect(vm.getFileData).toHaveBeenCalled();
+ expect(vm.getRawFileData).toHaveBeenCalled();
+ });
- done();
- });
+ it('does not initialize editor for files already with content when shouldHideEditor is `true`', async () => {
+ await createComponent({
+ activeFile: createActiveFile(),
});
- it('hides tabs in commit mode', (done) => {
- vm.$store.state.currentActivityView = leftSidebarViews.commit.name;
+ await hideEditorAndRunFn();
- vm.$nextTick(() => {
- expect(vm.$el.querySelector('.nav-links')).toBe(null);
+ expect(vm.getFileData).not.toHaveBeenCalled();
+ expect(vm.getRawFileData).not.toHaveBeenCalled();
+ expect(createInstanceSpy).not.toHaveBeenCalled();
+ });
+ });
- done();
- });
+ describe('updates on file changes', () => {
+ beforeEach(async () => {
+ await createComponent({
+ activeFile: createActiveFile({
+ content: 'foo', // need to prevent full cycle of initEditor
+ }),
});
+ jest.spyOn(vm, 'initEditor').mockImplementation();
});
- describe('when files view mode is preview', () => {
- beforeEach((done) => {
- jest.spyOn(vm.editor, 'updateDimensions').mockImplementation();
- changeViewMode(FILE_VIEW_MODE_PREVIEW);
- vm.file.name = 'myfile.md';
- vm.file.content = 'hello world';
+ it('calls removePendingTab when old file is pending', async () => {
+ jest.spyOn(vm, 'shouldHideEditor', 'get').mockReturnValue(true);
+ jest.spyOn(vm, 'removePendingTab').mockImplementation();
- vm.$nextTick(done);
- });
+ const origFile = vm.file;
+ vm.file.pending = true;
+ await vm.$nextTick();
- it('should hide editor', () => {
- expect(vm.showEditor).toBe(false);
- expect(findEditor()).toHaveCss({ display: 'none' });
+ wrapper.setProps({
+ file: file('testing'),
});
+ vm.file.content = 'foo'; // need to prevent full cycle of initEditor
+ await vm.$nextTick();
- describe('when file view mode changes to editor', () => {
- it('should update dimensions', () => {
- changeViewMode(FILE_VIEW_MODE_EDITOR);
-
- return vm.$nextTick().then(() => {
- expect(vm.editor.updateDimensions).toHaveBeenCalled();
- });
- });
- });
+ expect(vm.removePendingTab).toHaveBeenCalledWith(origFile);
});
- describe('initEditor', () => {
- beforeEach(() => {
- vm.file.tempFile = false;
- jest.spyOn(vm.editor, 'createInstance').mockImplementation();
- jest.spyOn(vm, 'shouldHideEditor', 'get').mockReturnValue(true);
- });
+ it('does not call initEditor if the file did not change', async () => {
+ Vue.set(vm, 'file', vm.file);
+ await vm.$nextTick();
- it('does not fetch file information for temp entries', (done) => {
- vm.file.tempFile = true;
-
- vm.initEditor();
- vm.$nextTick()
- .then(() => {
- expect(vm.getFileData).not.toHaveBeenCalled();
- })
- .then(done)
- .catch(done.fail);
- });
-
- it('is being initialised for files without content even if shouldHideEditor is `true`', (done) => {
- vm.file.content = '';
- vm.file.raw = '';
+ expect(vm.initEditor).not.toHaveBeenCalled();
+ });
- vm.initEditor();
+ it('calls initEditor when file key is changed', async () => {
+ expect(vm.initEditor).not.toHaveBeenCalled();
- vm.$nextTick()
- .then(() => {
- expect(vm.getFileData).toHaveBeenCalled();
- expect(vm.getRawFileData).toHaveBeenCalled();
- })
- .then(done)
- .catch(done.fail);
+ wrapper.setProps({
+ file: {
+ ...vm.file,
+ key: 'new',
+ },
});
+ await vm.$nextTick();
- it('does not initialize editor for files already with content', (done) => {
- vm.file.content = 'foo';
-
- vm.initEditor();
- vm.$nextTick()
- .then(() => {
- expect(vm.getFileData).not.toHaveBeenCalled();
- expect(vm.getRawFileData).not.toHaveBeenCalled();
- expect(vm.editor.createInstance).not.toHaveBeenCalled();
- })
- .then(done)
- .catch(done.fail);
- });
+ expect(vm.initEditor).toHaveBeenCalled();
+ });
+ });
+
+ describe('populates editor with the fetched content', () => {
+ const createRemoteFile = (name) => ({
+ ...file(name),
+ tmpFile: false,
});
- describe('updates on file changes', () => {
- beforeEach(() => {
- jest.spyOn(vm, 'initEditor').mockImplementation();
- });
+ beforeEach(async () => {
+ await createComponent();
+ vm.getRawFileData.mockRestore();
+ });
- it('calls removePendingTab when old file is pending', (done) => {
- jest.spyOn(vm, 'shouldHideEditor', 'get').mockReturnValue(true);
- jest.spyOn(vm, 'removePendingTab').mockImplementation();
+ it('after switching viewer from edit to diff', async () => {
+ const f = createRemoteFile('newFile');
+ Vue.set(vm.$store.state.entries, f.path, f);
- vm.file.pending = true;
+ jest.spyOn(service, 'getRawFileData').mockImplementation(async () => {
+ expect(vm.file.loading).toBe(true);
- vm.$nextTick()
- .then(() => {
- vm.file = file('testing');
- vm.file.content = 'foo'; // need to prevent full cycle of initEditor
+ // switching from edit to diff mode usually triggers editor initialization
+ vm.$store.state.viewer = viewerTypes.diff;
- return vm.$nextTick();
- })
- .then(() => {
- expect(vm.removePendingTab).toHaveBeenCalled();
- })
- .then(done)
- .catch(done.fail);
+ // we delay returning the file to make sure editor doesn't initialize before we fetch file content
+ await waitUsingRealTimer(30);
+ return 'rawFileData123\n';
});
- it('does not call initEditor if the file did not change', (done) => {
- Vue.set(vm, 'file', vm.file);
-
- vm.$nextTick()
- .then(() => {
- expect(vm.initEditor).not.toHaveBeenCalled();
- })
- .then(done)
- .catch(done.fail);
+ wrapper.setProps({
+ file: f,
});
- it('calls initEditor when file key is changed', (done) => {
- expect(vm.initEditor).not.toHaveBeenCalled();
+ await waitForEditorSetup();
+ expect(vm.model.getModel().getValue()).toBe('rawFileData123\n');
+ });
- Vue.set(vm, 'file', {
- ...vm.file,
- key: 'new',
+ it('after opening multiple files at the same time', async () => {
+ const fileA = createRemoteFile('fileA');
+ const aContent = 'fileA-rawContent\n';
+ const bContent = 'fileB-rawContent\n';
+ const fileB = createRemoteFile('fileB');
+ Vue.set(vm.$store.state.entries, fileA.path, fileA);
+ Vue.set(vm.$store.state.entries, fileB.path, fileB);
+
+ jest
+ .spyOn(service, 'getRawFileData')
+ .mockImplementation(async () => {
+ // opening fileB while the content of fileA is still being fetched
+ wrapper.setProps({
+ file: fileB,
+ });
+ return aContent;
+ })
+ .mockImplementationOnce(async () => {
+ // we delay returning fileB content to make sure the editor doesn't initialize prematurely
+ await waitUsingRealTimer(30);
+ return bContent;
});
- vm.$nextTick()
- .then(() => {
- expect(vm.initEditor).toHaveBeenCalled();
- })
- .then(done)
- .catch(done.fail);
+ wrapper.setProps({
+ file: fileA,
});
- });
- describe('populates editor with the fetched content', () => {
- beforeEach(() => {
- vm.getRawFileData.mockRestore();
- });
+ await waitForEditorSetup();
+ expect(vm.model.getModel().getValue()).toBe(bContent);
+ });
+ });
- const createRemoteFile = (name) => ({
- ...file(name),
- tmpFile: false,
+ describe('onPaste', () => {
+ const setFileName = (name) =>
+ createActiveFile({
+ content: 'hello world\n',
+ name,
+ path: `foo/${name}`,
+ key: 'new',
});
- it('after switching viewer from edit to diff', async () => {
- jest.spyOn(service, 'getRawFileData').mockImplementation(async () => {
- expect(vm.file.loading).toBe(true);
-
- // switching from edit to diff mode usually triggers editor initialization
- store.state.viewer = viewerTypes.diff;
+ const pasteImage = () => {
+ window.dispatchEvent(
+ Object.assign(new Event('paste'), {
+ clipboardData: {
+ files: [new File(['foo'], 'foo.png', { type: 'image/png' })],
+ },
+ }),
+ );
+ };
- // we delay returning the file to make sure editor doesn't initialize before we fetch file content
- await waitUsingRealTimer(30);
- return 'rawFileData123\n';
+ const watchState = (watched) =>
+ new Promise((resolve) => {
+ const unwatch = vm.$store.watch(watched, () => {
+ unwatch();
+ resolve();
});
-
- const f = createRemoteFile('newFile');
- Vue.set(store.state.entries, f.path, f);
-
- vm.file = f;
-
- await waitForEditorSetup();
- expect(vm.model.getModel().getValue()).toBe('rawFileData123\n');
});
- it('after opening multiple files at the same time', async () => {
- const fileA = createRemoteFile('fileA');
- const fileB = createRemoteFile('fileB');
- Vue.set(store.state.entries, fileA.path, fileA);
- Vue.set(store.state.entries, fileB.path, fileB);
-
- jest
- .spyOn(service, 'getRawFileData')
- .mockImplementationOnce(async () => {
- // opening fileB while the content of fileA is still being fetched
- vm.file = fileB;
- return 'fileA-rawContent\n';
- })
- .mockImplementationOnce(async () => {
- // we delay returning fileB content to make sure the editor doesn't initialize prematurely
- await waitUsingRealTimer(30);
- return 'fileB-rawContent\n';
- });
+ // Pasting an image does a lot of things like using the FileReader API,
+ // so, waitForPromises isn't very reliable (and causes a flaky spec)
+ // Read more about state.watch: https://vuex.vuejs.org/api/#watch
+ const waitForFileContentChange = () => watchState((s) => s.entries['foo/bar.md'].content);
- vm.file = fileA;
-
- await waitForEditorSetup();
- expect(vm.model.getModel().getValue()).toBe('fileB-rawContent\n');
+ beforeEach(async () => {
+ await createComponent({
+ state: {
+ trees: {
+ 'gitlab-org/gitlab': { tree: [] },
+ },
+ currentProjectId: 'gitlab-org',
+ currentBranchId: 'gitlab',
+ },
+ activeFile: setFileName('bar.md'),
});
- });
-
- describe('onPaste', () => {
- const setFileName = (name) => {
- Vue.set(vm, 'file', {
- ...vm.file,
- content: 'hello world\n',
- name,
- path: `foo/${name}`,
- key: 'new',
- });
- vm.$store.state.entries[vm.file.path] = vm.file;
- };
+ vm.setupEditor();
- const pasteImage = () => {
- window.dispatchEvent(
- Object.assign(new Event('paste'), {
- clipboardData: {
- files: [new File(['foo'], 'foo.png', { type: 'image/png' })],
- },
- }),
- );
- };
-
- const watchState = (watched) =>
- new Promise((resolve) => {
- const unwatch = vm.$store.watch(watched, () => {
- unwatch();
- resolve();
- });
- });
+ await waitForPromises();
+ // set cursor to line 2, column 1
+ vm.editor.setSelection(new Range(2, 1, 2, 1));
+ vm.editor.focus();
- // Pasting an image does a lot of things like using the FileReader API,
- // so, waitForPromises isn't very reliable (and causes a flaky spec)
- // Read more about state.watch: https://vuex.vuejs.org/api/#watch
- const waitForFileContentChange = () => watchState((s) => s.entries['foo/bar.md'].content);
-
- beforeEach(() => {
- setFileName('bar.md');
-
- vm.$store.state.trees['gitlab-org/gitlab'] = { tree: [] };
- vm.$store.state.currentProjectId = 'gitlab-org';
- vm.$store.state.currentBranchId = 'gitlab';
-
- // create a new model each time, otherwise tests conflict with each other
- // because of same model being used in multiple tests
- Editor.editorInstance.modelManager.dispose();
- vm.setupEditor();
+ jest.spyOn(vm.editor, 'hasTextFocus').mockReturnValue(true);
+ });
- return waitForPromises().then(() => {
- // set cursor to line 2, column 1
- vm.editor.instance.setSelection(new Range(2, 1, 2, 1));
- vm.editor.instance.focus();
+ it('adds an image entry to the same folder for a pasted image in a markdown file', async () => {
+ pasteImage();
- jest.spyOn(vm.editor.instance, 'hasTextFocus').mockReturnValue(true);
- });
+ await waitForFileContentChange();
+ expect(vm.$store.state.entries['foo/foo.png']).toMatchObject({
+ path: 'foo/foo.png',
+ type: 'blob',
+ content: 'Zm9v',
+ rawPath: 'data:image/png;base64,Zm9v',
});
+ });
- it('adds an image entry to the same folder for a pasted image in a markdown file', () => {
- pasteImage();
-
- return waitForFileContentChange().then(() => {
- expect(vm.$store.state.entries['foo/foo.png']).toMatchObject({
- path: 'foo/foo.png',
- type: 'blob',
- content: 'Zm9v',
- rawPath: 'data:image/png;base64,Zm9v',
- });
- });
- });
+ it("adds a markdown image tag to the file's contents", async () => {
+ pasteImage();
- it("adds a markdown image tag to the file's contents", () => {
- pasteImage();
+ await waitForFileContentChange();
+ expect(vm.file.content).toBe('hello world\n![foo.png](./foo.png)');
+ });
- return waitForFileContentChange().then(() => {
- expect(vm.file.content).toBe('hello world\n![foo.png](./foo.png)');
- });
+ it("does not add file to state or set markdown image syntax if the file isn't markdown", async () => {
+ wrapper.setProps({
+ file: setFileName('myfile.txt'),
});
+ pasteImage();
- it("does not add file to state or set markdown image syntax if the file isn't markdown", () => {
- setFileName('myfile.txt');
- pasteImage();
-
- return waitForPromises().then(() => {
- expect(vm.$store.state.entries['foo/foo.png']).toBeUndefined();
- expect(vm.file.content).toBe('hello world\n');
- });
- });
+ await waitForPromises();
+ expect(vm.$store.state.entries['foo/foo.png']).toBeUndefined();
+ expect(vm.file.content).toBe('hello world\n');
});
});
describe('fetchEditorconfigRules', () => {
- beforeEach(() => {
- exampleConfigs.forEach(({ path, content }) => {
- store.state.entries[path] = { ...file(), path, content };
- });
- });
-
it.each(exampleFiles)(
'does not fetch content from remote for .editorconfig files present locally (case %#)',
- ({ path, monacoRules }) => {
- createOpenFile(path);
- createComponent();
-
- return waitForEditorSetup().then(() => {
- expect(vm.rules).toEqual(monacoRules);
- expect(vm.model.options).toMatchObject(monacoRules);
- expect(vm.getFileData).not.toHaveBeenCalled();
- expect(vm.getRawFileData).not.toHaveBeenCalled();
+ async ({ path, monacoRules }) => {
+ await createComponent({
+ state: {
+ entries: (() => {
+ const res = {};
+ exampleConfigs.forEach(({ path: configPath, content }) => {
+ res[configPath] = { ...file(), path: configPath, content };
+ });
+ return res;
+ })(),
+ },
+ activeFile: createActiveFile({
+ path,
+ key: path,
+ name: 'myfile.txt',
+ content: 'hello world',
+ }),
});
+
+ expect(vm.rules).toEqual(monacoRules);
+ expect(vm.model.options).toMatchObject(monacoRules);
+ expect(vm.getFileData).not.toHaveBeenCalled();
+ expect(vm.getRawFileData).not.toHaveBeenCalled();
},
);
- it('fetches content from remote for .editorconfig files not available locally', () => {
- exampleConfigs.forEach(({ path }) => {
- delete store.state.entries[path].content;
- delete store.state.entries[path].raw;
+ it('fetches content from remote for .editorconfig files not available locally', async () => {
+ const activeFile = createActiveFile({
+ path: 'foo/bar/baz/test/my_spec.js',
+ key: 'foo/bar/baz/test/my_spec.js',
+ name: 'myfile.txt',
+ content: 'hello world',
+ });
+
+ const expectations = [
+ 'foo/bar/baz/.editorconfig',
+ 'foo/bar/.editorconfig',
+ 'foo/.editorconfig',
+ '.editorconfig',
+ ];
+
+ await createComponent({
+ state: {
+ entries: (() => {
+ const res = {
+ [activeFile.path]: activeFile,
+ };
+ exampleConfigs.forEach(({ path: configPath }) => {
+ const f = { ...file(), path: configPath };
+ delete f.content;
+ delete f.raw;
+ res[configPath] = f;
+ });
+ return res;
+ })(),
+ },
+ activeFile,
});
- // Include a "test" directory which does not exist in store. This one should be skipped.
- createOpenFile('foo/bar/baz/test/my_spec.js');
- createComponent();
-
- return waitForEditorSetup().then(() => {
- expect(vm.getFileData.mock.calls.map(([args]) => args)).toEqual([
- { makeFileActive: false, path: 'foo/bar/baz/.editorconfig' },
- { makeFileActive: false, path: 'foo/bar/.editorconfig' },
- { makeFileActive: false, path: 'foo/.editorconfig' },
- { makeFileActive: false, path: '.editorconfig' },
- ]);
- expect(vm.getRawFileData.mock.calls.map(([args]) => args)).toEqual([
- { path: 'foo/bar/baz/.editorconfig' },
- { path: 'foo/bar/.editorconfig' },
- { path: 'foo/.editorconfig' },
- { path: '.editorconfig' },
- ]);
- });
+ expect(service.getFileData.mock.calls.map(([args]) => args)).toEqual(
+ expectations.map((expectation) => expect.stringContaining(expectation)),
+ );
+ expect(service.getRawFileData.mock.calls.map(([args]) => args)).toEqual(
+ expectations.map((expectation) => expect.objectContaining({ path: expectation })),
+ );
});
});
});
diff --git a/spec/frontend/ide/components/repo_tab_spec.js b/spec/frontend/ide/components/repo_tab_spec.js
index b39a488b034..95d52e8f7a9 100644
--- a/spec/frontend/ide/components/repo_tab_spec.js
+++ b/spec/frontend/ide/components/repo_tab_spec.js
@@ -1,5 +1,7 @@
+import { GlTab } from '@gitlab/ui';
import { mount, createLocalVue } from '@vue/test-utils';
import Vuex from 'vuex';
+import { stubComponent } from 'helpers/stub_component';
import RepoTab from '~/ide/components/repo_tab.vue';
import { createRouter } from '~/ide/ide_router';
import { createStore } from '~/ide/stores';
@@ -8,16 +10,25 @@ import { file } from '../helpers';
const localVue = createLocalVue();
localVue.use(Vuex);
+const GlTabStub = stubComponent(GlTab, {
+ template: '<li><slot name="title" /></li>',
+});
+
describe('RepoTab', () => {
let wrapper;
let store;
let router;
+ const findTab = () => wrapper.find(GlTabStub);
+
function createComponent(propsData) {
wrapper = mount(RepoTab, {
localVue,
store,
propsData,
+ stubs: {
+ GlTab: GlTabStub,
+ },
});
}
@@ -55,7 +66,7 @@ describe('RepoTab', () => {
jest.spyOn(wrapper.vm, 'openPendingTab').mockImplementation(() => {});
- await wrapper.trigger('click');
+ await findTab().vm.$emit('click');
expect(wrapper.vm.openPendingTab).not.toHaveBeenCalled();
});
@@ -67,7 +78,7 @@ describe('RepoTab', () => {
jest.spyOn(wrapper.vm, 'clickFile').mockImplementation(() => {});
- wrapper.trigger('click');
+ findTab().vm.$emit('click');
expect(wrapper.vm.clickFile).toHaveBeenCalledWith(wrapper.vm.tab);
});
@@ -91,11 +102,11 @@ describe('RepoTab', () => {
tab,
});
- await wrapper.trigger('mouseover');
+ await findTab().vm.$emit('mouseover');
expect(wrapper.find('.file-modified').exists()).toBe(false);
- await wrapper.trigger('mouseout');
+ await findTab().vm.$emit('mouseout');
expect(wrapper.find('.file-modified').exists()).toBe(true);
});
diff --git a/spec/frontend/import_entities/import_groups/components/import_table_row_spec.js b/spec/frontend/import_entities/import_groups/components/import_table_row_spec.js
index cdef4b1ee62..7a83136e785 100644
--- a/spec/frontend/import_entities/import_groups/components/import_table_row_spec.js
+++ b/spec/frontend/import_entities/import_groups/components/import_table_row_spec.js
@@ -1,10 +1,15 @@
-import { GlButton, GlLink, GlFormInput } from '@gitlab/ui';
+import { GlButton, GlDropdown, GlDropdownItem, GlLink, GlFormInput } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
+import Vue, { nextTick } from 'vue';
+import VueApollo from 'vue-apollo';
+import createMockApollo from 'helpers/mock_apollo_helper';
import { STATUSES } from '~/import_entities/constants';
import ImportTableRow from '~/import_entities/import_groups/components/import_table_row.vue';
-import Select2Select from '~/vue_shared/components/select2_select.vue';
+import groupQuery from '~/import_entities/import_groups/graphql/queries/group.query.graphql';
import { availableNamespacesFixture } from '../graphql/fixtures';
+Vue.use(VueApollo);
+
const getFakeGroup = (status) => ({
web_url: 'https://fake.host/',
full_path: 'fake_group_1',
@@ -17,8 +22,12 @@ const getFakeGroup = (status) => ({
status,
});
+const EXISTING_GROUP_TARGET_NAMESPACE = 'existing-group';
+const EXISTING_GROUP_PATH = 'existing-path';
+
describe('import table row', () => {
let wrapper;
+ let apolloProvider;
let group;
const findByText = (cmp, text) => {
@@ -26,12 +35,27 @@ describe('import table row', () => {
};
const findImportButton = () => findByText(GlButton, 'Import');
const findNameInput = () => wrapper.find(GlFormInput);
- const findNamespaceDropdown = () => wrapper.find(Select2Select);
+ const findNamespaceDropdown = () => wrapper.find(GlDropdown);
const createComponent = (props) => {
+ apolloProvider = createMockApollo([
+ [
+ groupQuery,
+ ({ fullPath }) => {
+ const existingGroup =
+ fullPath === `${EXISTING_GROUP_TARGET_NAMESPACE}/${EXISTING_GROUP_PATH}`
+ ? { id: 1 }
+ : null;
+ return Promise.resolve({ data: { existingGroup } });
+ },
+ ],
+ ]);
+
wrapper = shallowMount(ImportTableRow, {
+ apolloProvider,
propsData: {
availableNamespaces: availableNamespacesFixture,
+ groupPathRegex: /.*/,
...props,
},
});
@@ -49,15 +73,24 @@ describe('import table row', () => {
});
it.each`
- selector | sourceEvent | payload | event
- ${findNamespaceDropdown} | ${'input'} | ${'demo'} | ${'update-target-namespace'}
- ${findNameInput} | ${'input'} | ${'demo'} | ${'update-new-name'}
- ${findImportButton} | ${'click'} | ${undefined} | ${'import-group'}
+ selector | sourceEvent | payload | event
+ ${findNameInput} | ${'input'} | ${'demo'} | ${'update-new-name'}
+ ${findImportButton} | ${'click'} | ${undefined} | ${'import-group'}
`('invokes $event', ({ selector, sourceEvent, payload, event }) => {
selector().vm.$emit(sourceEvent, payload);
expect(wrapper.emitted(event)).toBeDefined();
expect(wrapper.emitted(event)[0][0]).toBe(payload);
});
+
+ it('emits update-target-namespace when dropdown option is clicked', () => {
+ const dropdownItem = findNamespaceDropdown().findAllComponents(GlDropdownItem).at(2);
+ const dropdownItemText = dropdownItem.text();
+
+ dropdownItem.vm.$emit('click');
+
+ expect(wrapper.emitted('update-target-namespace')).toBeDefined();
+ expect(wrapper.emitted('update-target-namespace')[0][0]).toBe(dropdownItemText);
+ });
});
describe('when entity status is NONE', () => {
@@ -75,6 +108,34 @@ describe('import table row', () => {
});
});
+ it('renders only no parent option if available namespaces list is empty', () => {
+ createComponent({
+ group: getFakeGroup(STATUSES.NONE),
+ availableNamespaces: [],
+ });
+
+ const items = findNamespaceDropdown()
+ .findAllComponents(GlDropdownItem)
+ .wrappers.map((w) => w.text());
+
+ expect(items[0]).toBe('No parent');
+ expect(items).toHaveLength(1);
+ });
+
+ it('renders both no parent option and available namespaces list when available namespaces list is not empty', () => {
+ createComponent({
+ group: getFakeGroup(STATUSES.NONE),
+ availableNamespaces: availableNamespacesFixture,
+ });
+
+ const [firstItem, ...rest] = findNamespaceDropdown()
+ .findAllComponents(GlDropdownItem)
+ .wrappers.map((w) => w.text());
+
+ expect(firstItem).toBe('No parent');
+ expect(rest).toHaveLength(availableNamespacesFixture.length);
+ });
+
describe('when entity status is SCHEDULING', () => {
beforeEach(() => {
group = getFakeGroup(STATUSES.SCHEDULING);
@@ -109,4 +170,38 @@ describe('import table row', () => {
expect(findByText(GlLink, TARGET_LINK).exists()).toBe(true);
});
});
+
+ describe('validations', () => {
+ it('Reports invalid group name when name is not matching regex', () => {
+ createComponent({
+ group: {
+ ...getFakeGroup(STATUSES.NONE),
+ import_target: {
+ target_namespace: 'root',
+ new_name: 'very`bad`name',
+ },
+ },
+ groupPathRegex: /^[a-zA-Z]+$/,
+ });
+
+ expect(wrapper.text()).toContain('Please choose a group URL with no special characters.');
+ });
+
+ it('Reports invalid group name if group already exists', async () => {
+ createComponent({
+ group: {
+ ...getFakeGroup(STATUSES.NONE),
+ import_target: {
+ target_namespace: EXISTING_GROUP_TARGET_NAMESPACE,
+ new_name: EXISTING_GROUP_PATH,
+ },
+ },
+ });
+
+ jest.runOnlyPendingTimers();
+ await nextTick();
+
+ expect(wrapper.text()).toContain('Name already exists.');
+ });
+ });
});
diff --git a/spec/frontend/import_entities/import_groups/components/import_table_spec.js b/spec/frontend/import_entities/import_groups/components/import_table_spec.js
index dd734782169..496c5cda7c7 100644
--- a/spec/frontend/import_entities/import_groups/components/import_table_spec.js
+++ b/spec/frontend/import_entities/import_groups/components/import_table_spec.js
@@ -1,7 +1,15 @@
-import { GlEmptyState, GlLoadingIcon, GlSearchBoxByClick, GlSprintf } from '@gitlab/ui';
+import {
+ GlEmptyState,
+ GlLoadingIcon,
+ GlSearchBoxByClick,
+ GlSprintf,
+ GlDropdown,
+ GlDropdownItem,
+} from '@gitlab/ui';
import { shallowMount, createLocalVue } from '@vue/test-utils';
import VueApollo from 'vue-apollo';
import createMockApollo from 'helpers/mock_apollo_helper';
+import { stubComponent } from 'helpers/stub_component';
import waitForPromises from 'helpers/wait_for_promises';
import { STATUSES } from '~/import_entities/constants';
import ImportTable from '~/import_entities/import_groups/components/import_table.vue';
@@ -16,13 +24,25 @@ import { availableNamespacesFixture, generateFakeEntry } from '../graphql/fixtur
const localVue = createLocalVue();
localVue.use(VueApollo);
+const GlDropdownStub = stubComponent(GlDropdown, {
+ template: '<div><h1 ref="text"><slot name="button-content"></slot></h1><slot></slot></div>',
+});
+
describe('import table', () => {
let wrapper;
let apolloProvider;
+ const SOURCE_URL = 'https://demo.host';
const FAKE_GROUP = generateFakeEntry({ id: 1, status: STATUSES.NONE });
+ const FAKE_GROUPS = [
+ generateFakeEntry({ id: 1, status: STATUSES.NONE }),
+ generateFakeEntry({ id: 2, status: STATUSES.FINISHED }),
+ ];
const FAKE_PAGE_INFO = { page: 1, perPage: 20, total: 40, totalPages: 2 };
+ const findPaginationDropdown = () => wrapper.findComponent(GlDropdown);
+ const findPaginationDropdownText = () => findPaginationDropdown().find({ ref: 'text' }).text();
+
const createComponent = ({ bulkImportSourceGroups }) => {
apolloProvider = createMockApollo([], {
Query: {
@@ -38,10 +58,12 @@ describe('import table', () => {
wrapper = shallowMount(ImportTable, {
propsData: {
- sourceUrl: 'https://demo.host',
+ groupPathRegex: /.*/,
+ sourceUrl: SOURCE_URL,
},
stubs: {
GlSprintf,
+ GlDropdown: GlDropdownStub,
},
localVue,
apolloProvider,
@@ -80,14 +102,10 @@ describe('import table', () => {
});
await waitForPromises();
- expect(wrapper.find(GlEmptyState).props().title).toBe('No groups available for import');
+ expect(wrapper.find(GlEmptyState).props().title).toBe('You have no groups to import');
});
it('renders import row for each group in response', async () => {
- const FAKE_GROUPS = [
- generateFakeEntry({ id: 1, status: STATUSES.NONE }),
- generateFakeEntry({ id: 2, status: STATUSES.FINISHED }),
- ];
createComponent({
bulkImportSourceGroups: () => ({
nodes: FAKE_GROUPS,
@@ -151,6 +169,20 @@ describe('import table', () => {
expect(wrapper.find(PaginationLinks).props().pageInfo).toStrictEqual(FAKE_PAGE_INFO);
});
+ it('renders pagination dropdown', () => {
+ expect(findPaginationDropdown().exists()).toBe(true);
+ });
+
+ it('updates page size when selected in Dropdown', async () => {
+ const otherOption = wrapper.findAllComponents(GlDropdownItem).at(1);
+ expect(otherOption.text()).toMatchInterpolatedText('50 items per page');
+
+ otherOption.vm.$emit('click');
+ await waitForPromises();
+
+ expect(findPaginationDropdownText()).toMatchInterpolatedText('50 items per page');
+ });
+
it('updates page when page change is requested', async () => {
const REQUESTED_PAGE = 2;
wrapper.find(PaginationLinks).props().change(REQUESTED_PAGE);
@@ -178,7 +210,7 @@ describe('import table', () => {
wrapper.find(PaginationLinks).props().change(REQUESTED_PAGE);
await waitForPromises();
- expect(wrapper.text()).toContain('Showing 21-21 of 38');
+ expect(wrapper.text()).toContain('Showing 21-21 of 38 groups from');
});
});
@@ -224,7 +256,7 @@ describe('import table', () => {
findFilterInput().vm.$emit('submit', FILTER_VALUE);
await waitForPromises();
- expect(wrapper.text()).toContain('Showing 1-1 of 40 groups matching filter "foo"');
+ expect(wrapper.text()).toContain('Showing 1-1 of 40 groups matching filter "foo" from');
});
it('properly resets filter in graphql query when search box is cleared', async () => {
diff --git a/spec/frontend/import_entities/import_groups/graphql/client_factory_spec.js b/spec/frontend/import_entities/import_groups/graphql/client_factory_spec.js
index 4d3d2c41bbe..1feff861c1e 100644
--- a/spec/frontend/import_entities/import_groups/graphql/client_factory_spec.js
+++ b/spec/frontend/import_entities/import_groups/graphql/client_factory_spec.js
@@ -2,6 +2,7 @@ import { InMemoryCache } from 'apollo-cache-inmemory';
import MockAdapter from 'axios-mock-adapter';
import { createMockClient } from 'mock-apollo-client';
import waitForPromises from 'helpers/wait_for_promises';
+import createFlash from '~/flash';
import { STATUSES } from '~/import_entities/constants';
import {
clientTypenames,
@@ -18,6 +19,7 @@ import axios from '~/lib/utils/axios_utils';
import httpStatus from '~/lib/utils/http_status';
import { statusEndpointFixture, availableNamespacesFixture } from './fixtures';
+jest.mock('~/flash');
jest.mock('~/import_entities/import_groups/graphql/services/status_poller', () => ({
StatusPoller: jest.fn().mockImplementation(function mock() {
this.startPolling = jest.fn();
@@ -35,15 +37,19 @@ describe('Bulk import resolvers', () => {
let axiosMockAdapter;
let client;
- beforeEach(() => {
- axiosMockAdapter = new MockAdapter(axios);
- client = createMockClient({
+ const createClient = (extraResolverArgs) => {
+ return createMockClient({
cache: new InMemoryCache({
fragmentMatcher: { match: () => true },
addTypename: false,
}),
- resolvers: createResolvers({ endpoints: FAKE_ENDPOINTS }),
+ resolvers: createResolvers({ endpoints: FAKE_ENDPOINTS, ...extraResolverArgs }),
});
+ };
+
+ beforeEach(() => {
+ axiosMockAdapter = new MockAdapter(axios);
+ client = createClient();
});
afterEach(() => {
@@ -82,6 +88,44 @@ describe('Bulk import resolvers', () => {
.reply(httpStatus.OK, availableNamespacesFixture);
});
+ it('respects cached import state when provided by group manager', async () => {
+ const FAKE_STATUS = 'DEMO_STATUS';
+ const FAKE_IMPORT_TARGET = {};
+ const TARGET_INDEX = 0;
+
+ const clientWithMockedManager = createClient({
+ GroupsManager: jest.fn().mockImplementation(() => ({
+ getImportStateFromStorageByGroupId(groupId) {
+ if (groupId === statusEndpointFixture.importable_data[TARGET_INDEX].id) {
+ return {
+ status: FAKE_STATUS,
+ importTarget: FAKE_IMPORT_TARGET,
+ };
+ }
+
+ return null;
+ },
+ })),
+ });
+
+ const clientResponse = await clientWithMockedManager.query({
+ query: bulkImportSourceGroupsQuery,
+ });
+ const clientResults = clientResponse.data.bulkImportSourceGroups.nodes;
+
+ expect(clientResults[TARGET_INDEX].import_target).toBe(FAKE_IMPORT_TARGET);
+ expect(clientResults[TARGET_INDEX].status).toBe(FAKE_STATUS);
+ });
+
+ it('populates each result instance with empty import_target when there are no available namespaces', async () => {
+ axiosMockAdapter.onGet(FAKE_ENDPOINTS.availableNamespaces).reply(httpStatus.OK, []);
+
+ const response = await client.query({ query: bulkImportSourceGroupsQuery });
+ results = response.data.bulkImportSourceGroups.nodes;
+
+ expect(results.every((r) => r.import_target.target_namespace === '')).toBe(true);
+ });
+
describe('when called', () => {
beforeEach(async () => {
const response = await client.query({ query: bulkImportSourceGroupsQuery });
@@ -220,14 +264,14 @@ describe('Bulk import resolvers', () => {
expect(intermediateResults[0].status).toBe(STATUSES.SCHEDULING);
});
- it('sets group status to STARTED when request completes', async () => {
+ it('sets import status to CREATED when request completes', async () => {
axiosMockAdapter.onPost(FAKE_ENDPOINTS.createBulkImport).reply(httpStatus.OK, { id: 1 });
await client.mutate({
mutation: importGroupMutation,
variables: { sourceGroupId: GROUP_ID },
});
- expect(results[0].status).toBe(STATUSES.STARTED);
+ expect(results[0].status).toBe(STATUSES.CREATED);
});
it('resets status to NONE if request fails', async () => {
@@ -245,6 +289,40 @@ describe('Bulk import resolvers', () => {
expect(results[0].status).toBe(STATUSES.NONE);
});
+
+ it('shows default error message when server error is not provided', async () => {
+ axiosMockAdapter
+ .onPost(FAKE_ENDPOINTS.createBulkImport)
+ .reply(httpStatus.INTERNAL_SERVER_ERROR);
+
+ client
+ .mutate({
+ mutation: importGroupMutation,
+ variables: { sourceGroupId: GROUP_ID },
+ })
+ .catch(() => {});
+ await waitForPromises();
+
+ expect(createFlash).toHaveBeenCalledWith({ message: 'Importing the group failed' });
+ });
+
+ it('shows provided error message when error is included in backend response', async () => {
+ const CUSTOM_MESSAGE = 'custom message';
+
+ axiosMockAdapter
+ .onPost(FAKE_ENDPOINTS.createBulkImport)
+ .reply(httpStatus.INTERNAL_SERVER_ERROR, { error: CUSTOM_MESSAGE });
+
+ client
+ .mutate({
+ mutation: importGroupMutation,
+ variables: { sourceGroupId: GROUP_ID },
+ })
+ .catch(() => {});
+ await waitForPromises();
+
+ expect(createFlash).toHaveBeenCalledWith({ message: CUSTOM_MESSAGE });
+ });
});
});
});
diff --git a/spec/frontend/import_entities/import_groups/graphql/services/source_groups_manager_spec.js b/spec/frontend/import_entities/import_groups/graphql/services/source_groups_manager_spec.js
index ca987ab3ab4..5baa201906a 100644
--- a/spec/frontend/import_entities/import_groups/graphql/services/source_groups_manager_spec.js
+++ b/spec/frontend/import_entities/import_groups/graphql/services/source_groups_manager_spec.js
@@ -1,11 +1,17 @@
import { defaultDataIdFromObject } from 'apollo-cache-inmemory';
import { clientTypenames } from '~/import_entities/import_groups/graphql/client_factory';
import ImportSourceGroupFragment from '~/import_entities/import_groups/graphql/fragments/bulk_import_source_group_item.fragment.graphql';
-import { SourceGroupsManager } from '~/import_entities/import_groups/graphql/services/source_groups_manager';
+import {
+ KEY,
+ SourceGroupsManager,
+} from '~/import_entities/import_groups/graphql/services/source_groups_manager';
+
+const FAKE_SOURCE_URL = 'http://demo.host';
describe('SourceGroupsManager', () => {
let manager;
let client;
+ let storage;
const getFakeGroup = () => ({
__typename: clientTypenames.BulkImportSourceGroup,
@@ -17,8 +23,53 @@ describe('SourceGroupsManager', () => {
readFragment: jest.fn(),
writeFragment: jest.fn(),
};
+ storage = {
+ getItem: jest.fn(),
+ setItem: jest.fn(),
+ };
+
+ manager = new SourceGroupsManager({ client, storage, sourceUrl: FAKE_SOURCE_URL });
+ });
+
+ describe('storage management', () => {
+ const IMPORT_ID = 1;
+ const IMPORT_TARGET = { destination_name: 'demo', destination_namespace: 'foo' };
+ const STATUS = 'FAKE_STATUS';
+ const FAKE_GROUP = { id: 1, import_target: IMPORT_TARGET, status: STATUS };
+
+ it('loads state from storage on creation', () => {
+ expect(storage.getItem).toHaveBeenCalledWith(KEY);
+ });
+
+ it('saves to storage when import is starting', () => {
+ manager.startImport({
+ importId: IMPORT_ID,
+ group: FAKE_GROUP,
+ });
+ const storedObject = JSON.parse(storage.setItem.mock.calls[0][1]);
+ expect(Object.values(storedObject)[0]).toStrictEqual({
+ id: FAKE_GROUP.id,
+ importTarget: IMPORT_TARGET,
+ status: STATUS,
+ });
+ });
- manager = new SourceGroupsManager({ client });
+ it('saves to storage when import status is updated', () => {
+ const CHANGED_STATUS = 'changed';
+
+ manager.startImport({
+ importId: IMPORT_ID,
+ group: FAKE_GROUP,
+ });
+
+ manager.setImportStatusByImportId(IMPORT_ID, CHANGED_STATUS);
+ const storedObject = JSON.parse(storage.setItem.mock.calls[1][1]);
+ expect(Object.values(storedObject)[0]).toStrictEqual({
+ id: FAKE_GROUP.id,
+ importTarget: IMPORT_TARGET,
+ status: CHANGED_STATUS,
+ });
+ });
});
it('finds item by group id', () => {
diff --git a/spec/frontend/import_entities/import_groups/graphql/services/status_poller_spec.js b/spec/frontend/import_entities/import_groups/graphql/services/status_poller_spec.js
index a5fc4e18a02..0d4809971ae 100644
--- a/spec/frontend/import_entities/import_groups/graphql/services/status_poller_spec.js
+++ b/spec/frontend/import_entities/import_groups/graphql/services/status_poller_spec.js
@@ -2,7 +2,6 @@ import MockAdapter from 'axios-mock-adapter';
import Visibility from 'visibilityjs';
import createFlash from '~/flash';
import { STATUSES } from '~/import_entities/constants';
-import { SourceGroupsManager } from '~/import_entities/import_groups/graphql/services/source_groups_manager';
import { StatusPoller } from '~/import_entities/import_groups/graphql/services/status_poller';
import axios from '~/lib/utils/axios_utils';
import Poll from '~/lib/utils/poll';
@@ -18,24 +17,21 @@ jest.mock('~/import_entities/import_groups/graphql/services/source_groups_manage
}));
const FAKE_POLL_PATH = '/fake/poll/path';
-const CLIENT_MOCK = {};
describe('Bulk import status poller', () => {
let poller;
let mockAdapter;
+ let groupManager;
const getPollHistory = () => mockAdapter.history.get.filter((x) => x.url === FAKE_POLL_PATH);
beforeEach(() => {
mockAdapter = new MockAdapter(axios);
mockAdapter.onGet(FAKE_POLL_PATH).reply(200, {});
- poller = new StatusPoller({ client: CLIENT_MOCK, pollPath: FAKE_POLL_PATH });
- });
-
- it('creates source group manager with proper client', () => {
- expect(SourceGroupsManager.mock.calls).toHaveLength(1);
- const [[{ client }]] = SourceGroupsManager.mock.calls;
- expect(client).toBe(CLIENT_MOCK);
+ groupManager = {
+ setImportStatusByImportId: jest.fn(),
+ };
+ poller = new StatusPoller({ groupManager, pollPath: FAKE_POLL_PATH });
});
it('creates poller with proper config', () => {
@@ -100,14 +96,9 @@ describe('Bulk import status poller', () => {
it('when success response arrives updates relevant group status', () => {
const FAKE_ID = 5;
const [[pollConfig]] = Poll.mock.calls;
- const [managerInstance] = SourceGroupsManager.mock.instances;
- managerInstance.findByImportId.mockReturnValue({ id: FAKE_ID });
pollConfig.successCallback({ data: [{ id: FAKE_ID, status_name: STATUSES.FINISHED }] });
- expect(managerInstance.setImportStatus).toHaveBeenCalledWith(
- expect.objectContaining({ id: FAKE_ID }),
- STATUSES.FINISHED,
- );
+ expect(groupManager.setImportStatusByImportId).toHaveBeenCalledWith(FAKE_ID, STATUSES.FINISHED);
});
});
diff --git a/spec/frontend/incidents/mocks/incidents.json b/spec/frontend/incidents/mocks/incidents.json
index 07c87a5d43d..78783a0dce5 100644
--- a/spec/frontend/incidents/mocks/incidents.json
+++ b/spec/frontend/incidents/mocks/incidents.json
@@ -1,7 +1,7 @@
[
{
"iid": "15",
- "title": "New: Incident",
+ "title": "New: Alert",
"createdAt": "2020-06-03T15:46:08Z",
"assignees": {},
"state": "opened",
diff --git a/spec/frontend/incidents_settings/components/__snapshots__/alerts_form_spec.js.snap b/spec/frontend/incidents_settings/components/__snapshots__/alerts_form_spec.js.snap
index 82d7f691efd..5796b3fa44e 100644
--- a/spec/frontend/incidents_settings/components/__snapshots__/alerts_form_spec.js.snap
+++ b/spec/frontend/incidents_settings/components/__snapshots__/alerts_form_spec.js.snap
@@ -35,7 +35,7 @@ exports[`Alert integration settings form default state should match the default
Incident template (optional)
<gl-link-stub
- href="/help/user/project/description_templates#creating-issue-templates"
+ href="/help/user/project/description_templates#create-an-issue-template"
target="_blank"
>
<gl-icon-stub
@@ -78,7 +78,7 @@ exports[`Alert integration settings form default state should match the default
>
<gl-form-checkbox-stub>
<span>
- Send a separate email notification to Developers.
+ Send a single email notification to Owners and Maintainers for new alerts.
</span>
</gl-form-checkbox-stub>
</gl-form-group-stub>
diff --git a/spec/frontend/integrations/edit/components/integration_form_spec.js b/spec/frontend/integrations/edit/components/integration_form_spec.js
index df855674804..c015fd0b9e0 100644
--- a/spec/frontend/integrations/edit/components/integration_form_spec.js
+++ b/spec/frontend/integrations/edit/components/integration_form_spec.js
@@ -207,27 +207,6 @@ describe('IntegrationForm', () => {
expect(findJiraTriggerFields().exists()).toBe(true);
});
-
- describe('featureFlag jiraIssuesIntegration is false', () => {
- it('does not render JiraIssuesFields', () => {
- createComponent({
- customStateProps: { type: 'jira' },
- featureFlags: { jiraIssuesIntegration: false },
- });
-
- expect(findJiraIssuesFields().exists()).toBe(false);
- });
- });
-
- describe('featureFlag jiraIssuesIntegration is true', () => {
- it('renders JiraIssuesFields', () => {
- createComponent({
- customStateProps: { type: 'jira' },
- featureFlags: { jiraIssuesIntegration: true },
- });
- expect(findJiraIssuesFields().exists()).toBe(true);
- });
- });
});
describe('triggerEvents is present', () => {
diff --git a/spec/frontend/integrations/integration_settings_form_spec.js b/spec/frontend/integrations/integration_settings_form_spec.js
index 348b942703f..cbb2ef380ba 100644
--- a/spec/frontend/integrations/integration_settings_form_spec.js
+++ b/spec/frontend/integrations/integration_settings_form_spec.js
@@ -7,7 +7,6 @@ jest.mock('~/vue_shared/plugins/global_toast');
describe('IntegrationSettingsForm', () => {
const FIXTURE = 'services/edit_service.html';
- preloadFixtures(FIXTURE);
beforeEach(() => {
loadFixtures(FIXTURE);
diff --git a/spec/frontend/invite_members/components/group_select_spec.js b/spec/frontend/invite_members/components/group_select_spec.js
new file mode 100644
index 00000000000..2a6985de136
--- /dev/null
+++ b/spec/frontend/invite_members/components/group_select_spec.js
@@ -0,0 +1,90 @@
+import { GlDropdown, GlDropdownItem, GlSearchBoxByType } from '@gitlab/ui';
+import { mount } from '@vue/test-utils';
+import waitForPromises from 'helpers/wait_for_promises';
+import Api from '~/api';
+import GroupSelect from '~/invite_members/components/group_select.vue';
+
+const createComponent = () => {
+ return mount(GroupSelect, {});
+};
+
+const group1 = { id: 1, full_name: 'Group One' };
+const group2 = { id: 2, full_name: 'Group Two' };
+const allGroups = [group1, group2];
+
+describe('GroupSelect', () => {
+ let wrapper;
+
+ beforeEach(() => {
+ jest.spyOn(Api, 'groups').mockResolvedValue(allGroups);
+
+ wrapper = createComponent();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ });
+
+ const findSearchBoxByType = () => wrapper.findComponent(GlSearchBoxByType);
+ const findDropdown = () => wrapper.findComponent(GlDropdown);
+ const findDropdownToggle = () => findDropdown().find('button[aria-haspopup="true"]');
+ const findDropdownItemByText = (text) =>
+ wrapper
+ .findAllComponents(GlDropdownItem)
+ .wrappers.find((dropdownItemWrapper) => dropdownItemWrapper.text() === text);
+
+ it('renders GlSearchBoxByType with default attributes', () => {
+ expect(findSearchBoxByType().exists()).toBe(true);
+ expect(findSearchBoxByType().vm.$attrs).toMatchObject({
+ placeholder: 'Search groups',
+ });
+ });
+
+ describe('when user types in the search input', () => {
+ let resolveApiRequest;
+
+ beforeEach(() => {
+ jest.spyOn(Api, 'groups').mockImplementation(
+ () =>
+ new Promise((resolve) => {
+ resolveApiRequest = resolve;
+ }),
+ );
+
+ findSearchBoxByType().vm.$emit('input', group1.name);
+ });
+
+ it('calls the API', () => {
+ resolveApiRequest({ data: allGroups });
+
+ expect(Api.groups).toHaveBeenCalledWith(group1.name, {
+ active: true,
+ exclude_internal: true,
+ });
+ });
+
+ it('displays loading icon while waiting for API call to resolve', async () => {
+ expect(findSearchBoxByType().props('isLoading')).toBe(true);
+
+ resolveApiRequest({ data: allGroups });
+ await waitForPromises();
+
+ expect(findSearchBoxByType().props('isLoading')).toBe(false);
+ });
+ });
+
+ describe('when group is selected from the dropdown', () => {
+ beforeEach(() => {
+ findDropdownItemByText(group1.full_name).vm.$emit('click');
+ });
+
+ it('emits `input` event used by `v-model`', () => {
+ expect(wrapper.emitted('input')[0][0].id).toEqual(group1.id);
+ });
+
+ it('sets dropdown toggle text to selected item', () => {
+ expect(findDropdownToggle().text()).toBe(group1.full_name);
+ });
+ });
+});
diff --git a/spec/frontend/invite_members/components/invite_group_trigger_spec.js b/spec/frontend/invite_members/components/invite_group_trigger_spec.js
new file mode 100644
index 00000000000..cb9967ebe8c
--- /dev/null
+++ b/spec/frontend/invite_members/components/invite_group_trigger_spec.js
@@ -0,0 +1,50 @@
+import { GlButton } from '@gitlab/ui';
+import { mount } from '@vue/test-utils';
+import InviteGroupTrigger from '~/invite_members/components/invite_group_trigger.vue';
+import eventHub from '~/invite_members/event_hub';
+
+const displayText = 'Invite a group';
+
+const createComponent = (props = {}) => {
+ return mount(InviteGroupTrigger, {
+ propsData: {
+ displayText,
+ ...props,
+ },
+ });
+};
+
+describe('InviteGroupTrigger', () => {
+ let wrapper;
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ });
+
+ const findButton = () => wrapper.findComponent(GlButton);
+
+ describe('displayText', () => {
+ beforeEach(() => {
+ wrapper = createComponent();
+ });
+
+ it('includes the correct displayText for the link', () => {
+ expect(findButton().text()).toBe(displayText);
+ });
+ });
+
+ describe('when button is clicked', () => {
+ beforeEach(() => {
+ eventHub.$emit = jest.fn();
+
+ wrapper = createComponent();
+
+ findButton().trigger('click');
+ });
+
+ it('emits event that triggers opening the modal', () => {
+ expect(eventHub.$emit).toHaveBeenLastCalledWith('openModal', { inviteeType: 'group' });
+ });
+ });
+});
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 e310a00133c..5ca5d855038 100644
--- a/spec/frontend/invite_members/components/invite_members_modal_spec.js
+++ b/spec/frontend/invite_members/components/invite_members_modal_spec.js
@@ -6,10 +6,11 @@ import Api from '~/api';
import InviteMembersModal from '~/invite_members/components/invite_members_modal.vue';
const id = '1';
-const name = 'testgroup';
+const name = 'test name';
const isProject = false;
+const inviteeType = 'members';
const accessLevels = { Guest: 10, Reporter: 20, Developer: 30, Maintainer: 40, Owner: 50 };
-const defaultAccessLevel = '10';
+const defaultAccessLevel = 10;
const helpLink = 'https://example.com';
const user1 = { id: 1, name: 'Name One', username: 'one_1', avatar_url: '' };
@@ -20,16 +21,19 @@ const user3 = {
username: 'one_2',
avatar_url: '',
};
+const sharedGroup = { id: '981' };
-const createComponent = (data = {}) => {
+const createComponent = (data = {}, props = {}) => {
return shallowMount(InviteMembersModal, {
propsData: {
id,
name,
isProject,
+ inviteeType,
accessLevels,
defaultAccessLevel,
helpLink,
+ ...props,
},
data() {
return data;
@@ -46,6 +50,22 @@ const createComponent = (data = {}) => {
});
};
+const createInviteMembersToProjectWrapper = () => {
+ return createComponent({ inviteeType: 'members' }, { isProject: true });
+};
+
+const createInviteMembersToGroupWrapper = () => {
+ return createComponent({ inviteeType: 'members' }, { isProject: false });
+};
+
+const createInviteGroupToProjectWrapper = () => {
+ return createComponent({ inviteeType: 'group' }, { isProject: true });
+};
+
+const createInviteGroupToGroupWrapper = () => {
+ return createComponent({ inviteeType: 'group' }, { isProject: false });
+};
+
describe('InviteMembersModal', () => {
let wrapper;
@@ -54,12 +74,13 @@ describe('InviteMembersModal', () => {
wrapper = null;
});
- const findDropdown = () => wrapper.find(GlDropdown);
- const findDropdownItems = () => findDropdown().findAll(GlDropdownItem);
- const findDatepicker = () => wrapper.find(GlDatepicker);
- const findLink = () => wrapper.find(GlLink);
- const findCancelButton = () => wrapper.find({ ref: 'cancelButton' });
- const findInviteButton = () => wrapper.find({ ref: 'inviteButton' });
+ const findDropdown = () => wrapper.findComponent(GlDropdown);
+ const findDropdownItems = () => findDropdown().findAllComponents(GlDropdownItem);
+ const findDatepicker = () => wrapper.findComponent(GlDatepicker);
+ const findLink = () => wrapper.findComponent(GlLink);
+ const findIntroText = () => wrapper.find({ ref: 'introText' }).text();
+ const findCancelButton = () => wrapper.findComponent({ ref: 'cancelButton' });
+ const findInviteButton = () => wrapper.findComponent({ ref: 'inviteButton' });
const clickInviteButton = () => findInviteButton().vm.$emit('click');
describe('rendering the modal', () => {
@@ -68,7 +89,7 @@ describe('InviteMembersModal', () => {
});
it('renders the modal with the correct title', () => {
- expect(wrapper.find(GlModal).props('title')).toBe('Invite team members');
+ expect(wrapper.findComponent(GlModal).props('title')).toBe('Invite team members');
});
it('renders the Cancel button text correctly', () => {
@@ -102,21 +123,60 @@ describe('InviteMembersModal', () => {
});
});
+ describe('displaying the correct introText', () => {
+ describe('when inviting to a project', () => {
+ describe('when inviting members', () => {
+ it('includes the correct invitee, type, and formatted name', () => {
+ wrapper = createInviteMembersToProjectWrapper();
+
+ expect(findIntroText()).toBe("You're inviting members to the test name project.");
+ });
+ });
+
+ describe('when sharing with a group', () => {
+ it('includes the correct invitee, type, and formatted name', () => {
+ wrapper = createInviteGroupToProjectWrapper();
+
+ expect(findIntroText()).toBe("You're inviting a group to the test name project.");
+ });
+ });
+ });
+
+ describe('when inviting to a group', () => {
+ describe('when inviting members', () => {
+ it('includes the correct invitee, type, and formatted name', () => {
+ wrapper = createInviteMembersToGroupWrapper();
+
+ expect(findIntroText()).toBe("You're inviting members to the test name group.");
+ });
+ });
+
+ describe('when sharing with a group', () => {
+ it('includes the correct invitee, type, and formatted name', () => {
+ wrapper = createInviteGroupToGroupWrapper();
+
+ expect(findIntroText()).toBe("You're inviting a group to the test name group.");
+ });
+ });
+ });
+ });
+
describe('submitting the invite form', () => {
const apiErrorMessage = 'Member already exists';
describe('when inviting an existing user to group by user ID', () => {
const postData = {
user_id: '1',
- access_level: '10',
+ access_level: defaultAccessLevel,
expires_at: undefined,
format: 'json',
};
describe('when invites are sent successfully', () => {
beforeEach(() => {
- wrapper = createComponent({ newUsersToInvite: [user1] });
+ wrapper = createInviteMembersToGroupWrapper();
+ wrapper.setData({ newUsersToInvite: [user1] });
wrapper.vm.$toast = { show: jest.fn() };
jest.spyOn(Api, 'addGroupMembersByUserId').mockResolvedValue({ data: postData });
jest.spyOn(wrapper.vm, 'showToastMessageSuccess');
@@ -178,7 +238,7 @@ describe('InviteMembersModal', () => {
describe('when inviting a new user by email address', () => {
const postData = {
- access_level: '10',
+ access_level: defaultAccessLevel,
expires_at: undefined,
email: 'email@example.com',
format: 'json',
@@ -227,7 +287,7 @@ describe('InviteMembersModal', () => {
describe('when inviting members and non-members in same click', () => {
const postData = {
- access_level: '10',
+ access_level: defaultAccessLevel,
expires_at: undefined,
format: 'json',
};
@@ -283,5 +343,58 @@ describe('InviteMembersModal', () => {
});
});
});
+
+ describe('when inviting a group to share', () => {
+ describe('when sharing the group is successful', () => {
+ const groupPostData = {
+ group_id: sharedGroup.id,
+ group_access: defaultAccessLevel,
+ expires_at: undefined,
+ format: 'json',
+ };
+
+ beforeEach(() => {
+ wrapper = createComponent({ groupToBeSharedWith: sharedGroup });
+
+ wrapper.setData({ inviteeType: 'group' });
+ wrapper.vm.$toast = { show: jest.fn() };
+ jest.spyOn(Api, 'groupShareWithGroup').mockResolvedValue({ data: groupPostData });
+ jest.spyOn(wrapper.vm, 'showToastMessageSuccess');
+
+ clickInviteButton();
+ });
+
+ it('calls Api groupShareWithGroup with the correct params', () => {
+ expect(Api.groupShareWithGroup).toHaveBeenCalledWith(id, groupPostData);
+ });
+
+ it('displays the successful toastMessage', () => {
+ expect(wrapper.vm.showToastMessageSuccess).toHaveBeenCalled();
+ });
+ });
+
+ describe('when sharing the group fails', () => {
+ beforeEach(() => {
+ wrapper = createComponent({ groupToBeSharedWith: sharedGroup });
+
+ wrapper.setData({ inviteeType: 'group' });
+ wrapper.vm.$toast = { show: jest.fn() };
+
+ jest
+ .spyOn(Api, 'groupShareWithGroup')
+ .mockRejectedValue({ response: { data: { success: false } } });
+
+ jest.spyOn(wrapper.vm, 'showToastMessageError');
+
+ clickInviteButton();
+ });
+
+ it('displays the generic error toastMessage', async () => {
+ await waitForPromises();
+
+ expect(wrapper.vm.showToastMessageError).toHaveBeenCalled();
+ });
+ });
+ });
});
});
diff --git a/spec/frontend/invite_members/components/invite_members_trigger_spec.js b/spec/frontend/invite_members/components/invite_members_trigger_spec.js
index 18d6662d2d4..f362aace1df 100644
--- a/spec/frontend/invite_members/components/invite_members_trigger_spec.js
+++ b/spec/frontend/invite_members/components/invite_members_trigger_spec.js
@@ -1,9 +1,8 @@
-import { GlIcon, GlLink } from '@gitlab/ui';
+import { GlButton } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import InviteMembersTrigger from '~/invite_members/components/invite_members_trigger.vue';
const displayText = 'Invite team members';
-const icon = 'plus';
const createComponent = (props = {}) => {
return shallowMount(InviteMembersTrigger, {
@@ -23,36 +22,14 @@ describe('InviteMembersTrigger', () => {
});
describe('displayText', () => {
- const findLink = () => wrapper.find(GlLink);
+ const findButton = () => wrapper.findComponent(GlButton);
beforeEach(() => {
wrapper = createComponent();
});
- it('includes the correct displayText for the link', () => {
- expect(findLink().text()).toBe(displayText);
- });
- });
-
- describe('icon', () => {
- const findIcon = () => wrapper.find(GlIcon);
-
- it('includes the correct icon when an icon is sent', () => {
- wrapper = createComponent({ icon });
-
- expect(findIcon().attributes('name')).toBe(icon);
- });
-
- it('does not include an icon when icon is not sent', () => {
- wrapper = createComponent();
-
- expect(findIcon().exists()).toBe(false);
- });
-
- it('does not include an icon when empty string is sent', () => {
- wrapper = createComponent({ icon: '' });
-
- expect(findIcon().exists()).toBe(false);
+ it('includes the correct displayText for the button', () => {
+ expect(findButton().text()).toBe(displayText);
});
});
});
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 a945b99bd54..f6e79d3607f 100644
--- a/spec/frontend/invite_members/components/members_token_select_spec.js
+++ b/spec/frontend/invite_members/components/members_token_select_spec.js
@@ -37,7 +37,7 @@ describe('MembersTokenSelect', () => {
wrapper = null;
});
- const findTokenSelector = () => wrapper.find(GlTokenSelector);
+ const findTokenSelector = () => wrapper.findComponent(GlTokenSelector);
describe('rendering the token-selector component', () => {
it('renders with the correct props', () => {
diff --git a/spec/frontend/issuable/components/csv_export_modal_spec.js b/spec/frontend/issuable/components/csv_export_modal_spec.js
new file mode 100644
index 00000000000..f46b6f72f05
--- /dev/null
+++ b/spec/frontend/issuable/components/csv_export_modal_spec.js
@@ -0,0 +1,91 @@
+import { GlModal, GlIcon, GlButton } from '@gitlab/ui';
+import { mount } from '@vue/test-utils';
+import { stubComponent } from 'helpers/stub_component';
+import { extendedWrapper } from 'helpers/vue_test_utils_helper';
+import CsvExportModal from '~/issuable/components/csv_export_modal.vue';
+
+describe('CsvExportModal', () => {
+ let wrapper;
+
+ function createComponent(options = {}) {
+ const { injectedProperties = {}, props = {} } = options;
+ return extendedWrapper(
+ mount(CsvExportModal, {
+ propsData: {
+ modalId: 'csv-export-modal',
+ ...props,
+ },
+ provide: {
+ issuableType: 'issues',
+ ...injectedProperties,
+ },
+ stubs: {
+ GlModal: stubComponent(GlModal, {
+ template:
+ '<div><slot name="modal-title"></slot><slot></slot><slot name="modal-footer"></slot></div>',
+ }),
+ },
+ }),
+ );
+ }
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ const findModal = () => wrapper.findComponent(GlModal);
+ const findIcon = () => wrapper.findComponent(GlIcon);
+ const findButton = () => wrapper.findComponent(GlButton);
+
+ describe('template', () => {
+ describe.each`
+ issuableType | modalTitle
+ ${'issues'} | ${'Export issues'}
+ ${'merge-requests'} | ${'Export merge requests'}
+ `('with the issuableType "$issuableType"', ({ issuableType, modalTitle }) => {
+ beforeEach(() => {
+ wrapper = createComponent({ injectedProperties: { issuableType } });
+ });
+
+ it('displays the modal title "$modalTitle"', () => {
+ expect(findModal().text()).toContain(modalTitle);
+ });
+
+ it('displays the button with title "$modalTitle"', () => {
+ expect(findButton().text()).toBe(modalTitle);
+ });
+ });
+
+ describe('issuable count info text', () => {
+ it('displays the info text when issuableCount is > -1', () => {
+ wrapper = createComponent({ injectedProperties: { issuableCount: 10 } });
+ expect(wrapper.findByTestId('issuable-count-note').exists()).toBe(true);
+ expect(wrapper.findByTestId('issuable-count-note').text()).toContain('10 issues selected');
+ expect(findIcon().exists()).toBe(true);
+ });
+
+ it("doesn't display the info text when issuableCount is -1", () => {
+ wrapper = createComponent({ injectedProperties: { issuableCount: -1 } });
+ expect(wrapper.findByTestId('issuable-count-note').exists()).toBe(false);
+ });
+ });
+
+ describe('email info text', () => {
+ it('displays the proper email', () => {
+ const email = 'admin@example.com';
+ wrapper = createComponent({ injectedProperties: { email } });
+ expect(findModal().text()).toContain(
+ `The CSV export will be created in the background. Once finished, it will be sent to ${email} in an attachment.`,
+ );
+ });
+ });
+
+ describe('primary button', () => {
+ it('passes the exportCsvPath to the button', () => {
+ const exportCsvPath = '/gitlab-org/gitlab-test/-/issues/export_csv';
+ wrapper = createComponent({ injectedProperties: { exportCsvPath } });
+ expect(findButton().attributes('href')).toBe(exportCsvPath);
+ });
+ });
+ });
+});
diff --git a/spec/frontend/issuable/components/csv_import_export_buttons_spec.js b/spec/frontend/issuable/components/csv_import_export_buttons_spec.js
new file mode 100644
index 00000000000..e96409b61b9
--- /dev/null
+++ b/spec/frontend/issuable/components/csv_import_export_buttons_spec.js
@@ -0,0 +1,161 @@
+import { shallowMount } from '@vue/test-utils';
+import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
+import { extendedWrapper } from 'helpers/vue_test_utils_helper';
+import CsvExportModal from '~/issuable/components/csv_export_modal.vue';
+import CsvImportExportButtons from '~/issuable/components/csv_import_export_buttons.vue';
+import CsvImportModal from '~/issuable/components/csv_import_modal.vue';
+
+describe('CsvImportExportButtons', () => {
+ let wrapper;
+ let glModalDirective;
+
+ function createComponent(injectedProperties = {}) {
+ glModalDirective = jest.fn();
+ return extendedWrapper(
+ shallowMount(CsvImportExportButtons, {
+ directives: {
+ GlTooltip: createMockDirective(),
+ glModal: {
+ bind(_, { value }) {
+ glModalDirective(value);
+ },
+ },
+ },
+ provide: {
+ ...injectedProperties,
+ },
+ }),
+ );
+ }
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ const findExportCsvButton = () => wrapper.findByTestId('export-csv-button');
+ const findImportDropdown = () => wrapper.findByTestId('import-csv-dropdown');
+ const findImportCsvButton = () => wrapper.findByTestId('import-csv-dropdown');
+ const findImportFromJiraLink = () => wrapper.findByTestId('import-from-jira-link');
+ const findExportCsvModal = () => wrapper.findComponent(CsvExportModal);
+ const findImportCsvModal = () => wrapper.findComponent(CsvImportModal);
+
+ describe('template', () => {
+ describe('when the showExportButton=true', () => {
+ beforeEach(() => {
+ wrapper = createComponent({ showExportButton: true });
+ });
+
+ it('displays the export button', () => {
+ expect(findExportCsvButton().exists()).toBe(true);
+ });
+
+ it('export button has a tooltip', () => {
+ const tooltip = getBinding(findExportCsvButton().element, 'gl-tooltip');
+
+ expect(tooltip).toBeDefined();
+ expect(tooltip.value).toBe('Export as CSV');
+ });
+
+ it('renders the export modal', () => {
+ expect(findExportCsvModal().exists()).toBe(true);
+ });
+
+ it('opens the export modal', () => {
+ findExportCsvButton().trigger('click');
+
+ expect(glModalDirective).toHaveBeenCalledWith(wrapper.vm.exportModalId);
+ });
+ });
+
+ describe('when the showExportButton=false', () => {
+ beforeEach(() => {
+ wrapper = createComponent({ showExportButton: false });
+ });
+
+ it('does not display the export button', () => {
+ expect(findExportCsvButton().exists()).toBe(false);
+ });
+
+ it('does not render the export modal', () => {
+ expect(findExportCsvModal().exists()).toBe(false);
+ });
+ });
+
+ describe('when the showImportButton=true', () => {
+ beforeEach(() => {
+ wrapper = createComponent({ showImportButton: true });
+ });
+
+ it('displays the import dropdown', () => {
+ expect(findImportDropdown().exists()).toBe(true);
+ });
+
+ it('renders the import button', () => {
+ expect(findImportCsvButton().exists()).toBe(true);
+ });
+
+ it('import button has a tooltip', () => {
+ const tooltip = getBinding(findImportDropdown().element, 'gl-tooltip');
+
+ expect(tooltip).toBeDefined();
+ expect(tooltip.value).toBe('Import issues');
+ });
+
+ it('renders the import modal', () => {
+ expect(findImportCsvModal().exists()).toBe(true);
+ });
+
+ it('opens the import modal', () => {
+ findImportCsvButton().trigger('click');
+
+ expect(glModalDirective).toHaveBeenCalledWith(wrapper.vm.importModalId);
+ });
+
+ describe('import from jira link', () => {
+ const projectImportJiraPath = 'gitlab-org/gitlab-test/-/import/jira';
+
+ beforeEach(() => {
+ wrapper = createComponent({
+ showImportButton: true,
+ canEdit: true,
+ projectImportJiraPath,
+ });
+ });
+
+ describe('when canEdit=true', () => {
+ it('renders the import dropdown item', () => {
+ expect(findImportFromJiraLink().exists()).toBe(true);
+ });
+
+ it('passes the proper path to the link', () => {
+ expect(findImportFromJiraLink().attributes('href')).toBe(projectImportJiraPath);
+ });
+ });
+
+ describe('when canEdit=false', () => {
+ beforeEach(() => {
+ wrapper = createComponent({ showImportButton: true, canEdit: false });
+ });
+
+ it('does not render the import dropdown item', () => {
+ expect(findImportFromJiraLink().exists()).toBe(false);
+ });
+ });
+ });
+ });
+
+ describe('when the showImportButton=false', () => {
+ beforeEach(() => {
+ wrapper = createComponent({ showImportButton: false });
+ });
+
+ it('does not display the import dropdown', () => {
+ expect(findImportDropdown().exists()).toBe(false);
+ });
+
+ it('does not render the import modal', () => {
+ expect(findImportCsvModal().exists()).toBe(false);
+ });
+ });
+ });
+});
diff --git a/spec/frontend/issuable/components/csv_import_modal_spec.js b/spec/frontend/issuable/components/csv_import_modal_spec.js
new file mode 100644
index 00000000000..ce9d738f77b
--- /dev/null
+++ b/spec/frontend/issuable/components/csv_import_modal_spec.js
@@ -0,0 +1,86 @@
+import { GlModal } from '@gitlab/ui';
+import { getByRole, getByLabelText } from '@testing-library/dom';
+import { mount } from '@vue/test-utils';
+import { stubComponent } from 'helpers/stub_component';
+import { extendedWrapper } from 'helpers/vue_test_utils_helper';
+import CsvImportModal from '~/issuable/components/csv_import_modal.vue';
+
+jest.mock('~/lib/utils/csrf', () => ({ token: 'mock-csrf-token' }));
+
+describe('CsvImportModal', () => {
+ let wrapper;
+ let formSubmitSpy;
+
+ function createComponent(options = {}) {
+ const { injectedProperties = {}, props = {} } = options;
+ return extendedWrapper(
+ mount(CsvImportModal, {
+ propsData: {
+ modalId: 'csv-import-modal',
+ ...props,
+ },
+ provide: {
+ issuableType: 'issues',
+ ...injectedProperties,
+ },
+ stubs: {
+ GlModal: stubComponent(GlModal, {
+ template: '<div><slot></slot><slot name="modal-footer"></slot></div>',
+ }),
+ },
+ }),
+ );
+ }
+
+ beforeEach(() => {
+ formSubmitSpy = jest.spyOn(HTMLFormElement.prototype, 'submit').mockImplementation();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ const findModal = () => wrapper.findComponent(GlModal);
+ const findPrimaryButton = () => getByRole(wrapper.element, 'button', { name: 'Import issues' });
+ const findForm = () => wrapper.findByTestId('import-csv-form');
+ const findFileInput = () => getByLabelText(wrapper.element, 'Upload CSV file');
+ const findAuthenticityToken = () => new FormData(findForm().element).get('authenticity_token');
+
+ describe('template', () => {
+ it('displays modal title', () => {
+ wrapper = createComponent();
+ expect(findModal().text()).toContain('Import issues');
+ });
+
+ it('displays a note about the maximum allowed file size', () => {
+ const maxAttachmentSize = 500;
+ wrapper = createComponent({ injectedProperties: { maxAttachmentSize } });
+ expect(findModal().text()).toContain(`The maximum file size allowed is ${maxAttachmentSize}`);
+ });
+
+ describe('form', () => {
+ const importCsvIssuesPath = 'gitlab-org/gitlab-test/-/issues/import_csv';
+
+ beforeEach(() => {
+ wrapper = createComponent({ injectedProperties: { importCsvIssuesPath } });
+ });
+
+ it('displays the form with the correct action and inputs', () => {
+ expect(findForm().exists()).toBe(true);
+ expect(findForm().attributes('action')).toBe(importCsvIssuesPath);
+ expect(findAuthenticityToken()).toBe('mock-csrf-token');
+ expect(findFileInput()).toExist();
+ });
+
+ it('displays the correct primary button action text', () => {
+ expect(findPrimaryButton()).toExist();
+ });
+
+ it('submits the form when the primary action is clicked', async () => {
+ findPrimaryButton().click();
+
+ expect(formSubmitSpy).toHaveBeenCalled();
+ });
+ });
+ });
+});
diff --git a/spec/frontend/issuable_list/components/issuable_item_spec.js b/spec/frontend/issuable_list/components/issuable_item_spec.js
index 987acf559e3..dde65ace9db 100644
--- a/spec/frontend/issuable_list/components/issuable_item_spec.js
+++ b/spec/frontend/issuable_list/components/issuable_item_spec.js
@@ -202,7 +202,7 @@ describe('IssuableItem', () => {
describe('labelTarget', () => {
it('returns target string for a provided label param when `enableLabelPermalinks` is true', () => {
expect(wrapper.vm.labelTarget(mockRegularLabel)).toBe(
- '?label_name%5B%5D=Documentation%20Update',
+ '?label_name[]=Documentation%20Update',
);
});
diff --git a/spec/frontend/issue_show/components/app_spec.js b/spec/frontend/issue_show/components/app_spec.js
index 9e1bc8242fe..b8860e93a22 100644
--- a/spec/frontend/issue_show/components/app_spec.js
+++ b/spec/frontend/issue_show/components/app_spec.js
@@ -166,40 +166,6 @@ describe('Issuable output', () => {
});
});
- it('opens reCAPTCHA modal if update rejected as spam', () => {
- let modal;
-
- jest.spyOn(wrapper.vm.service, 'updateIssuable').mockResolvedValue({
- data: {
- recaptcha_html: '<div class="g-recaptcha">recaptcha_html</div>',
- },
- });
-
- wrapper.vm.canUpdate = true;
- wrapper.vm.showForm = true;
-
- return wrapper.vm
- .$nextTick()
- .then(() => {
- wrapper.vm.$refs.recaptchaModal.scriptSrc = '//scriptsrc';
- return wrapper.vm.updateIssuable();
- })
- .then(() => {
- modal = wrapper.find('.js-recaptcha-modal');
- expect(modal.isVisible()).toBe(true);
- expect(modal.find('.g-recaptcha').text()).toEqual('recaptcha_html');
- expect(document.body.querySelector('.js-recaptcha-script').src).toMatch('//scriptsrc');
- })
- .then(() => {
- modal.find('.close').trigger('click');
- return wrapper.vm.$nextTick();
- })
- .then(() => {
- expect(modal.isVisible()).toBe(false);
- expect(document.body.querySelector('.js-recaptcha-script')).toBeNull();
- });
- });
-
describe('Pinned links propagated', () => {
it.each`
prop | value
@@ -422,7 +388,18 @@ describe('Issuable output', () => {
formSpy = jest.spyOn(wrapper.vm, 'updateAndShowForm');
});
- it('shows the form if template names request is successful', () => {
+ it('shows the form if template names as hash request is successful', () => {
+ const mockData = {
+ test: [{ name: 'test', id: 'test', project_path: '/', namespace_path: '/' }],
+ };
+ mock.onGet('/issuable-templates-path').reply(() => Promise.resolve([200, mockData]));
+
+ return wrapper.vm.requestTemplatesAndShowForm().then(() => {
+ expect(formSpy).toHaveBeenCalledWith(mockData);
+ });
+ });
+
+ it('shows the form if template names as array request is successful', () => {
const mockData = [{ name: 'test', id: 'test', project_path: '/', namespace_path: '/' }];
mock.onGet('/issuable-templates-path').reply(() => Promise.resolve([200, mockData]));
diff --git a/spec/frontend/issue_show/components/description_spec.js b/spec/frontend/issue_show/components/description_spec.js
index d59a257a2be..70c04280675 100644
--- a/spec/frontend/issue_show/components/description_spec.js
+++ b/spec/frontend/issue_show/components/description_spec.js
@@ -70,36 +70,6 @@ describe('Description component', () => {
});
});
- it('opens reCAPTCHA dialog if update rejected as spam', () => {
- let modal;
- const recaptchaChild = vm.$children.find(
- // eslint-disable-next-line no-underscore-dangle
- (child) => child.$options._componentTag === 'recaptcha-modal',
- );
-
- recaptchaChild.scriptSrc = '//scriptsrc';
-
- vm.taskListUpdateSuccess({
- recaptcha_html: '<div class="g-recaptcha">recaptcha_html</div>',
- });
-
- return vm
- .$nextTick()
- .then(() => {
- modal = vm.$el.querySelector('.js-recaptcha-modal');
-
- expect(modal.style.display).not.toEqual('none');
- expect(modal.querySelector('.g-recaptcha').textContent).toEqual('recaptcha_html');
- expect(document.body.querySelector('.js-recaptcha-script').src).toMatch('//scriptsrc');
- })
- .then(() => modal.querySelector('.close').click())
- .then(() => vm.$nextTick())
- .then(() => {
- expect(modal.style.display).toEqual('none');
- expect(document.body.querySelector('.js-recaptcha-script')).toBeNull();
- });
- });
-
it('applies syntax highlighting and math when description changed', () => {
const vmSpy = jest.spyOn(vm, 'renderGFM');
const prototypeSpy = jest.spyOn($.prototype, 'renderGFM');
@@ -144,7 +114,6 @@ describe('Description component', () => {
dataType: 'issuableType',
fieldName: 'description',
selector: '.detail-page-description',
- onSuccess: expect.any(Function),
onError: expect.any(Function),
lockVersion: 0,
});
diff --git a/spec/frontend/issue_show/components/fields/description_template_spec.js b/spec/frontend/issue_show/components/fields/description_template_spec.js
index 1193d4f8add..dc126c53f5e 100644
--- a/spec/frontend/issue_show/components/fields/description_template_spec.js
+++ b/spec/frontend/issue_show/components/fields/description_template_spec.js
@@ -1,7 +1,7 @@
import Vue from 'vue';
import descriptionTemplate from '~/issue_show/components/fields/description_template.vue';
-describe('Issue description template component', () => {
+describe('Issue description template component with templates as hash', () => {
let vm;
let formState;
@@ -14,7 +14,9 @@ describe('Issue description template component', () => {
vm = new Component({
propsData: {
formState,
- issuableTemplates: [{ name: 'test', id: 'test', project_path: '/', namespace_path: '/' }],
+ issuableTemplates: {
+ test: [{ name: 'test', id: 'test', project_path: '/', namespace_path: '/' }],
+ },
projectId: 1,
projectPath: '/',
namespacePath: '/',
@@ -23,9 +25,9 @@ describe('Issue description template component', () => {
}).$mount();
});
- it('renders templates as JSON array in data attribute', () => {
+ it('renders templates as JSON hash in data attribute', () => {
expect(vm.$el.querySelector('.js-issuable-selector').getAttribute('data-data')).toBe(
- '[{"name":"test","id":"test","project_path":"/","namespace_path":"/"}]',
+ '{"test":[{"name":"test","id":"test","project_path":"/","namespace_path":"/"}]}',
);
});
@@ -41,3 +43,32 @@ describe('Issue description template component', () => {
expect(vm.issuableTemplate.editor.getValue()).toBe('testing new template');
});
});
+
+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":"/"}]',
+ );
+ });
+});
diff --git a/spec/frontend/issue_show/components/form_spec.js b/spec/frontend/issue_show/components/form_spec.js
index 4a8ec3cf66a..fc2e224ad92 100644
--- a/spec/frontend/issue_show/components/form_spec.js
+++ b/spec/frontend/issue_show/components/form_spec.js
@@ -42,7 +42,7 @@ describe('Inline edit form component', () => {
expect(vm.$el.querySelector('.js-issuable-selector-wrap')).toBeNull();
});
- it('renders template selector when templates exists', () => {
+ it('renders template selector when templates as array exists', () => {
createComponent({
issuableTemplates: [
{ name: 'test', id: 'test', project_path: 'test', namespace_path: 'test' },
@@ -52,6 +52,16 @@ describe('Inline edit form component', () => {
expect(vm.$el.querySelector('.js-issuable-selector-wrap')).not.toBeNull();
});
+ it('renders template selector when templates as hash exists', () => {
+ createComponent({
+ issuableTemplates: {
+ test: [{ name: 'test', id: 'test', project_path: 'test', namespace_path: 'test' }],
+ },
+ });
+
+ expect(vm.$el.querySelector('.js-issuable-selector-wrap')).not.toBeNull();
+ });
+
it('hides locked warning by default', () => {
createComponent();
diff --git a/spec/frontend/issue_spec.js b/spec/frontend/issue_spec.js
index fb6caef41e2..952ef54d286 100644
--- a/spec/frontend/issue_spec.js
+++ b/spec/frontend/issue_spec.js
@@ -1,91 +1,90 @@
+import { getByText } from '@testing-library/dom';
import MockAdapter from 'axios-mock-adapter';
-import $ from 'jquery';
+import { EVENT_ISSUABLE_VUE_APP_CHANGE } from '~/issuable/constants';
import Issue from '~/issue';
import axios from '~/lib/utils/axios_utils';
-import '~/lib/utils/text_utility';
describe('Issue', () => {
- let $boxClosed;
- let $boxOpen;
let testContext;
+ let mock;
beforeEach(() => {
+ mock = new MockAdapter(axios);
+ mock.onGet(/(.*)\/related_branches$/).reply(200, {});
+
testContext = {};
+ testContext.issue = new Issue();
});
- preloadFixtures('issues/closed-issue.html');
- preloadFixtures('issues/open-issue.html');
-
- function expectVisibility($element, shouldBeVisible) {
- if (shouldBeVisible) {
- expect($element).not.toHaveClass('hidden');
- } else {
- expect($element).toHaveClass('hidden');
- }
- }
-
- function expectIssueState(isIssueOpen) {
- expectVisibility($boxClosed, !isIssueOpen);
- expectVisibility($boxOpen, isIssueOpen);
- }
-
- function findElements() {
- $boxClosed = $('div.status-box-issue-closed');
-
- expect($boxClosed).toExist();
- expect($boxClosed).toHaveText('Closed');
+ afterEach(() => {
+ mock.restore();
+ testContext.issue.dispose();
+ });
- $boxOpen = $('div.status-box-open');
+ const getIssueCounter = () => document.querySelector('.issue_counter');
+ const getOpenStatusBox = () =>
+ getByText(document, (_, el) => el.textContent.match(/Open/), {
+ selector: '.status-box-open',
+ });
+ const getClosedStatusBox = () =>
+ getByText(document, (_, el) => el.textContent.match(/Closed/), {
+ selector: '.status-box-issue-closed',
+ });
- expect($boxOpen).toExist();
- expect($boxOpen).toHaveText('Open');
- }
+ describe.each`
+ desc | isIssueInitiallyOpen | expectedCounterText
+ ${'with an initially open issue'} | ${true} | ${'1,000'}
+ ${'with an initially closed issue'} | ${false} | ${'1,002'}
+ `('$desc', ({ isIssueInitiallyOpen, expectedCounterText }) => {
+ beforeEach(() => {
+ if (isIssueInitiallyOpen) {
+ loadFixtures('issues/open-issue.html');
+ } else {
+ loadFixtures('issues/closed-issue.html');
+ }
- [true, false].forEach((isIssueInitiallyOpen) => {
- describe(`with ${isIssueInitiallyOpen ? 'open' : 'closed'} issue`, () => {
- const action = isIssueInitiallyOpen ? 'close' : 'reopen';
- let mock;
+ testContext.issueCounter = getIssueCounter();
+ testContext.statusBoxClosed = getClosedStatusBox();
+ testContext.statusBoxOpen = getOpenStatusBox();
- function setup() {
- testContext.issue = new Issue();
- expectIssueState(isIssueInitiallyOpen);
+ testContext.issueCounter.textContent = '1,001';
+ });
- testContext.$projectIssuesCounter = $('.issue_counter').first();
- testContext.$projectIssuesCounter.text('1,001');
+ it(`has the proper visible status box when ${isIssueInitiallyOpen ? 'open' : 'closed'}`, () => {
+ if (isIssueInitiallyOpen) {
+ expect(testContext.statusBoxClosed).toHaveClass('hidden');
+ expect(testContext.statusBoxOpen).not.toHaveClass('hidden');
+ } else {
+ expect(testContext.statusBoxClosed).not.toHaveClass('hidden');
+ expect(testContext.statusBoxOpen).toHaveClass('hidden');
}
+ });
+ describe('when vue app triggers change', () => {
beforeEach(() => {
- if (isIssueInitiallyOpen) {
- loadFixtures('issues/open-issue.html');
- } else {
- loadFixtures('issues/closed-issue.html');
- }
-
- mock = new MockAdapter(axios);
- mock.onGet(/(.*)\/related_branches$/).reply(200, {});
- jest.spyOn(axios, 'get');
-
- findElements(isIssueInitiallyOpen);
- });
-
- afterEach(() => {
- mock.restore();
- $('div.flash-alert').remove();
- });
-
- it(`${action}s the issue on dispatch of issuable_vue_app:change event`, () => {
- setup();
-
document.dispatchEvent(
- new CustomEvent('issuable_vue_app:change', {
+ new CustomEvent(EVENT_ISSUABLE_VUE_APP_CHANGE, {
detail: {
data: { id: 1 },
isClosed: isIssueInitiallyOpen,
},
}),
);
+ });
+
+ it('displays correct status box', () => {
+ if (isIssueInitiallyOpen) {
+ expect(testContext.statusBoxClosed).not.toHaveClass('hidden');
+ expect(testContext.statusBoxOpen).toHaveClass('hidden');
+ } else {
+ expect(testContext.statusBoxClosed).toHaveClass('hidden');
+ expect(testContext.statusBoxOpen).not.toHaveClass('hidden');
+ }
+ });
- expectIssueState(!isIssueInitiallyOpen);
+ it('updates issueCounter text', () => {
+ expect(testContext.issueCounter).toBeVisible();
+ expect(testContext.issueCounter).toHaveText(expectedCounterText);
});
});
});
diff --git a/spec/frontend/issues_list/components/issuable_spec.js b/spec/frontend/issues_list/components/issuable_spec.js
index a8bf124373b..97d841c861d 100644
--- a/spec/frontend/issues_list/components/issuable_spec.js
+++ b/spec/frontend/issues_list/components/issuable_spec.js
@@ -1,4 +1,4 @@
-import { GlSprintf, GlLabel, GlIcon } from '@gitlab/ui';
+import { GlSprintf, GlLabel, GlIcon, GlLink } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import { TEST_HOST } from 'helpers/test_constants';
import { trimText } from 'helpers/text_helper';
@@ -31,6 +31,7 @@ const TEST_MILESTONE = {
};
const TEXT_CLOSED = 'CLOSED';
const TEST_META_COUNT = 100;
+const MOCK_GITLAB_URL = 'http://0.0.0.0:3000';
describe('Issuable component', () => {
let issuable;
@@ -54,6 +55,7 @@ describe('Issuable component', () => {
beforeEach(() => {
issuable = { ...simpleIssue };
+ gon.gitlab_url = MOCK_GITLAB_URL;
});
afterEach(() => {
@@ -190,15 +192,42 @@ describe('Issuable component', () => {
expect(wrapper.classes('closed')).toBe(false);
});
- it('renders fuzzy opened date and author', () => {
+ it('renders fuzzy created date and author', () => {
expect(trimText(findOpenedAgoContainer().text())).toContain(
- `opened 1 month ago by ${TEST_USER_NAME}`,
+ `created 1 month ago by ${TEST_USER_NAME}`,
);
});
it('renders no comments', () => {
expect(findNotes().classes('no-comments')).toBe(true);
});
+
+ it.each`
+ gitlabWebUrl | webUrl | expectedHref | expectedTarget | isExternal
+ ${undefined} | ${`${MOCK_GITLAB_URL}/issue`} | ${`${MOCK_GITLAB_URL}/issue`} | ${undefined} | ${false}
+ ${undefined} | ${'https://jira.com/issue'} | ${'https://jira.com/issue'} | ${'_blank'} | ${true}
+ ${'/gitlab-org/issue'} | ${'https://jira.com/issue'} | ${'/gitlab-org/issue'} | ${undefined} | ${false}
+ `(
+ 'renders issuable title correctly when `gitlabWebUrl` is `$gitlabWebUrl` and webUrl is `$webUrl`',
+ async ({ webUrl, gitlabWebUrl, expectedHref, expectedTarget, isExternal }) => {
+ factory({
+ issuable: {
+ ...issuable,
+ web_url: webUrl,
+ gitlab_web_url: gitlabWebUrl,
+ },
+ });
+
+ const titleEl = findIssuableTitle();
+
+ expect(titleEl.exists()).toBe(true);
+ expect(titleEl.find(GlLink).attributes('href')).toBe(expectedHref);
+ expect(titleEl.find(GlLink).attributes('target')).toBe(expectedTarget);
+ expect(titleEl.find(GlLink).text()).toBe(issuable.title);
+
+ expect(titleEl.find(GlIcon).exists()).toBe(isExternal);
+ },
+ );
});
describe('with confidential issuable', () => {
diff --git a/spec/frontend/issues_list/components/jira_issues_import_status_app_spec.js b/spec/frontend/issues_list/components/jira_issues_import_status_app_spec.js
new file mode 100644
index 00000000000..0c96b95a61f
--- /dev/null
+++ b/spec/frontend/issues_list/components/jira_issues_import_status_app_spec.js
@@ -0,0 +1,115 @@
+import { GlAlert, GlLabel } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import Vue from 'vue';
+import JiraIssuesImportStatus from '~/issues_list/components/jira_issues_import_status_app.vue';
+
+describe('JiraIssuesImportStatus', () => {
+ const issuesPath = 'gitlab-org/gitlab-test/-/issues';
+ const label = {
+ color: '#333',
+ title: 'jira-import::MTG-3',
+ };
+ let wrapper;
+
+ const findAlert = () => wrapper.find(GlAlert);
+
+ const findAlertLabel = () => wrapper.find(GlAlert).find(GlLabel);
+
+ const mountComponent = ({
+ shouldShowFinishedAlert = false,
+ shouldShowInProgressAlert = false,
+ } = {}) =>
+ shallowMount(JiraIssuesImportStatus, {
+ propsData: {
+ canEdit: true,
+ isJiraConfigured: true,
+ issuesPath,
+ projectPath: 'gitlab-org/gitlab-test',
+ },
+ data() {
+ return {
+ jiraImport: {
+ importedIssuesCount: 1,
+ label,
+ shouldShowFinishedAlert,
+ shouldShowInProgressAlert,
+ },
+ };
+ },
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ });
+
+ describe('when Jira import is not in progress', () => {
+ it('does not show an alert', () => {
+ wrapper = mountComponent();
+
+ expect(wrapper.find(GlAlert).exists()).toBe(false);
+ });
+ });
+
+ describe('when Jira import is in progress', () => {
+ it('shows an alert that tells the user a Jira import is in progress', () => {
+ wrapper = mountComponent({
+ shouldShowInProgressAlert: true,
+ });
+
+ expect(findAlert().text()).toBe(
+ 'Import in progress. Refresh page to see newly added issues.',
+ );
+ });
+ });
+
+ describe('when Jira import has finished', () => {
+ beforeEach(() => {
+ wrapper = mountComponent({
+ shouldShowFinishedAlert: true,
+ });
+ });
+
+ describe('shows an alert', () => {
+ it('tells the user the Jira import has finished', () => {
+ expect(findAlert().text()).toBe('1 issue successfully imported with the label');
+ });
+
+ it('contains the label title associated with the Jira import', () => {
+ const alertLabelTitle = findAlertLabel().props('title');
+
+ expect(alertLabelTitle).toBe(label.title);
+ });
+
+ it('contains the correct label color', () => {
+ const alertLabelTitle = findAlertLabel().props('backgroundColor');
+
+ expect(alertLabelTitle).toBe(label.color);
+ });
+
+ it('contains a link within the label', () => {
+ const alertLabelTarget = findAlertLabel().props('target');
+
+ expect(alertLabelTarget).toBe(
+ `${issuesPath}?label_name[]=${encodeURIComponent(label.title)}`,
+ );
+ });
+ });
+ });
+
+ describe('alert message', () => {
+ it('is hidden when dismissed', () => {
+ wrapper = mountComponent({
+ shouldShowInProgressAlert: true,
+ });
+
+ expect(wrapper.find(GlAlert).exists()).toBe(true);
+
+ findAlert().vm.$emit('dismiss');
+
+ return Vue.nextTick(() => {
+ expect(wrapper.find(GlAlert).exists()).toBe(false);
+ });
+ });
+ });
+});
diff --git a/spec/frontend/issues_list/components/jira_issues_list_root_spec.js b/spec/frontend/issues_list/components/jira_issues_list_root_spec.js
deleted file mode 100644
index eecb092a330..00000000000
--- a/spec/frontend/issues_list/components/jira_issues_list_root_spec.js
+++ /dev/null
@@ -1,115 +0,0 @@
-import { GlAlert, GlLabel } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import Vue from 'vue';
-import JiraIssuesListRoot from '~/issues_list/components/jira_issues_list_root.vue';
-
-describe('JiraIssuesListRoot', () => {
- const issuesPath = 'gitlab-org/gitlab-test/-/issues';
- const label = {
- color: '#333',
- title: 'jira-import::MTG-3',
- };
- let wrapper;
-
- const findAlert = () => wrapper.find(GlAlert);
-
- const findAlertLabel = () => wrapper.find(GlAlert).find(GlLabel);
-
- const mountComponent = ({
- shouldShowFinishedAlert = false,
- shouldShowInProgressAlert = false,
- } = {}) =>
- shallowMount(JiraIssuesListRoot, {
- propsData: {
- canEdit: true,
- isJiraConfigured: true,
- issuesPath,
- projectPath: 'gitlab-org/gitlab-test',
- },
- data() {
- return {
- jiraImport: {
- importedIssuesCount: 1,
- label,
- shouldShowFinishedAlert,
- shouldShowInProgressAlert,
- },
- };
- },
- });
-
- afterEach(() => {
- wrapper.destroy();
- wrapper = null;
- });
-
- describe('when Jira import is not in progress', () => {
- it('does not show an alert', () => {
- wrapper = mountComponent();
-
- expect(wrapper.find(GlAlert).exists()).toBe(false);
- });
- });
-
- describe('when Jira import is in progress', () => {
- it('shows an alert that tells the user a Jira import is in progress', () => {
- wrapper = mountComponent({
- shouldShowInProgressAlert: true,
- });
-
- expect(findAlert().text()).toBe(
- 'Import in progress. Refresh page to see newly added issues.',
- );
- });
- });
-
- describe('when Jira import has finished', () => {
- beforeEach(() => {
- wrapper = mountComponent({
- shouldShowFinishedAlert: true,
- });
- });
-
- describe('shows an alert', () => {
- it('tells the user the Jira import has finished', () => {
- expect(findAlert().text()).toBe('1 issue successfully imported with the label');
- });
-
- it('contains the label title associated with the Jira import', () => {
- const alertLabelTitle = findAlertLabel().props('title');
-
- expect(alertLabelTitle).toBe(label.title);
- });
-
- it('contains the correct label color', () => {
- const alertLabelTitle = findAlertLabel().props('backgroundColor');
-
- expect(alertLabelTitle).toBe(label.color);
- });
-
- it('contains a link within the label', () => {
- const alertLabelTarget = findAlertLabel().props('target');
-
- expect(alertLabelTarget).toBe(
- `${issuesPath}?label_name[]=${encodeURIComponent(label.title)}`,
- );
- });
- });
- });
-
- describe('alert message', () => {
- it('is hidden when dismissed', () => {
- wrapper = mountComponent({
- shouldShowInProgressAlert: true,
- });
-
- expect(wrapper.find(GlAlert).exists()).toBe(true);
-
- findAlert().vm.$emit('dismiss');
-
- return Vue.nextTick(() => {
- expect(wrapper.find(GlAlert).exists()).toBe(false);
- });
- });
- });
-});
diff --git a/spec/frontend/jira_connect/components/app_spec.js b/spec/frontend/jira_connect/components/app_spec.js
index d11b66b2089..e2a5cd1be9d 100644
--- a/spec/frontend/jira_connect/components/app_spec.js
+++ b/spec/frontend/jira_connect/components/app_spec.js
@@ -1,10 +1,12 @@
-import { GlAlert, GlButton, GlModal } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
+import { GlAlert, GlButton, GlModal, GlLink } from '@gitlab/ui';
+import { mount, shallowMount } from '@vue/test-utils';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import JiraConnectApp from '~/jira_connect/components/app.vue';
import createStore from '~/jira_connect/store';
-import { SET_ERROR_MESSAGE } from '~/jira_connect/store/mutation_types';
+import { SET_ALERT } from '~/jira_connect/store/mutation_types';
+import { persistAlert } from '~/jira_connect/utils';
+import { __ } from '~/locale';
jest.mock('~/jira_connect/api');
@@ -13,21 +15,19 @@ describe('JiraConnectApp', () => {
let store;
const findAlert = () => wrapper.findComponent(GlAlert);
+ const findAlertLink = () => findAlert().find(GlLink);
const findGlButton = () => wrapper.findComponent(GlButton);
const findGlModal = () => wrapper.findComponent(GlModal);
const findHeader = () => wrapper.findByTestId('new-jira-connect-ui-heading');
const findHeaderText = () => findHeader().text();
- const createComponent = (options = {}) => {
+ const createComponent = ({ provide, mountFn = shallowMount } = {}) => {
store = createStore();
wrapper = extendedWrapper(
- shallowMount(JiraConnectApp, {
+ mountFn(JiraConnectApp, {
store,
- provide: {
- glFeatures: { newJiraConnectUi: true },
- },
- ...options,
+ provide,
}),
);
};
@@ -49,7 +49,6 @@ describe('JiraConnectApp', () => {
beforeEach(() => {
createComponent({
provide: {
- glFeatures: { newJiraConnectUi: true },
usersPath: '/users',
},
});
@@ -72,37 +71,72 @@ describe('JiraConnectApp', () => {
});
});
- describe('newJiraConnectUi is false', () => {
- it('does not render new UI', () => {
- createComponent({
- provide: {
- glFeatures: { newJiraConnectUi: false },
- },
- });
+ describe('alert', () => {
+ it.each`
+ message | variant | alertShouldRender
+ ${'Test error'} | ${'danger'} | ${true}
+ ${'Test notice'} | ${'info'} | ${true}
+ ${''} | ${undefined} | ${false}
+ ${undefined} | ${undefined} | ${false}
+ `(
+ 'renders correct alert when message is `$message` and variant is `$variant`',
+ async ({ message, alertShouldRender, variant }) => {
+ createComponent();
+
+ store.commit(SET_ALERT, { message, variant });
+ await wrapper.vm.$nextTick();
+
+ const alert = findAlert();
+
+ expect(alert.exists()).toBe(alertShouldRender);
+ if (alertShouldRender) {
+ expect(alert.isVisible()).toBe(alertShouldRender);
+ expect(alert.html()).toContain(message);
+ expect(alert.props('variant')).toBe(variant);
+ expect(findAlertLink().exists()).toBe(false);
+ }
+ },
+ );
+
+ it('hides alert on @dismiss event', async () => {
+ createComponent();
+
+ store.commit(SET_ALERT, { message: 'test message' });
+ await wrapper.vm.$nextTick();
+
+ findAlert().vm.$emit('dismiss');
+ await wrapper.vm.$nextTick();
- expect(findHeader().exists()).toBe(false);
+ expect(findAlert().exists()).toBe(false);
});
- });
- it.each`
- errorMessage | errorShouldRender
- ${'Test error'} | ${true}
- ${''} | ${false}
- ${undefined} | ${false}
- `(
- 'renders correct alert when errorMessage is `$errorMessage`',
- async ({ errorMessage, errorShouldRender }) => {
- createComponent();
+ it('renders link when `linkUrl` is set', async () => {
+ createComponent({ mountFn: mount });
- store.commit(SET_ERROR_MESSAGE, errorMessage);
+ store.commit(SET_ALERT, {
+ message: __('test message %{linkStart}test link%{linkEnd}'),
+ linkUrl: 'https://gitlab.com',
+ });
await wrapper.vm.$nextTick();
- expect(findAlert().exists()).toBe(errorShouldRender);
- if (errorShouldRender) {
- expect(findAlert().isVisible()).toBe(errorShouldRender);
- expect(findAlert().html()).toContain(errorMessage);
- }
- },
- );
+ const alertLink = findAlertLink();
+
+ expect(alertLink.exists()).toBe(true);
+ expect(alertLink.text()).toContain('test link');
+ expect(alertLink.attributes('href')).toBe('https://gitlab.com');
+ });
+
+ describe('when alert is set in localStoage', () => {
+ it('renders alert on mount', () => {
+ persistAlert({ message: 'error message' });
+ createComponent();
+
+ const alert = findAlert();
+
+ expect(alert.exists()).toBe(true);
+ expect(alert.html()).toContain('error message');
+ });
+ });
+ });
});
});
diff --git a/spec/frontend/jira_connect/components/groups_list_item_spec.js b/spec/frontend/jira_connect/components/groups_list_item_spec.js
index bb247534aca..da16223255c 100644
--- a/spec/frontend/jira_connect/components/groups_list_item_spec.js
+++ b/spec/frontend/jira_connect/components/groups_list_item_spec.js
@@ -5,8 +5,11 @@ import waitForPromises from 'helpers/wait_for_promises';
import * as JiraConnectApi from '~/jira_connect/api';
import GroupsListItem from '~/jira_connect/components/groups_list_item.vue';
+import { persistAlert } from '~/jira_connect/utils';
import { mockGroup1 } from '../mock_data';
+jest.mock('~/jira_connect/utils');
+
describe('GroupsListItem', () => {
let wrapper;
const mockSubscriptionPath = 'subscriptionPath';
@@ -85,7 +88,16 @@ describe('GroupsListItem', () => {
expect(findLinkButton().props('loading')).toBe(true);
+ await waitForPromises();
+
expect(addSubscriptionSpy).toHaveBeenCalledWith(mockSubscriptionPath, mockGroup1.full_path);
+ expect(persistAlert).toHaveBeenCalledWith({
+ linkUrl: '/help/integration/jira_development_panel.html#usage',
+ message:
+ 'You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}',
+ title: 'Namespace successfully linked',
+ variant: 'success',
+ });
});
describe('when request is successful', () => {
diff --git a/spec/frontend/jira_connect/store/mutations_spec.js b/spec/frontend/jira_connect/store/mutations_spec.js
index d1f9d22b3de..584b17b36f7 100644
--- a/spec/frontend/jira_connect/store/mutations_spec.js
+++ b/spec/frontend/jira_connect/store/mutations_spec.js
@@ -8,11 +8,21 @@ describe('JiraConnect store mutations', () => {
localState = state();
});
- describe('SET_ERROR_MESSAGE', () => {
- it('sets error message', () => {
- mutations.SET_ERROR_MESSAGE(localState, 'test error');
+ describe('SET_ALERT', () => {
+ it('sets alert state', () => {
+ mutations.SET_ALERT(localState, {
+ message: 'test error',
+ variant: 'danger',
+ title: 'test title',
+ linkUrl: 'linkUrl',
+ });
- expect(localState.errorMessage).toBe('test error');
+ expect(localState.alert).toMatchObject({
+ message: 'test error',
+ variant: 'danger',
+ title: 'test title',
+ linkUrl: 'linkUrl',
+ });
});
});
});
diff --git a/spec/frontend/jira_connect/utils_spec.js b/spec/frontend/jira_connect/utils_spec.js
new file mode 100644
index 00000000000..5310bce384b
--- /dev/null
+++ b/spec/frontend/jira_connect/utils_spec.js
@@ -0,0 +1,32 @@
+import { useLocalStorageSpy } from 'helpers/local_storage_helper';
+import { ALERT_LOCALSTORAGE_KEY } from '~/jira_connect/constants';
+import { persistAlert, retrieveAlert } from '~/jira_connect/utils';
+
+useLocalStorageSpy();
+
+describe('JiraConnect utils', () => {
+ describe('alert utils', () => {
+ it.each`
+ arg | expectedRetrievedValue
+ ${{ title: 'error' }} | ${{ title: 'error' }}
+ ${{ title: 'error', randomKey: 'test' }} | ${{ title: 'error' }}
+ ${{ title: 'error', message: 'error message', linkUrl: 'link', variant: 'danger' }} | ${{ title: 'error', message: 'error message', linkUrl: 'link', variant: 'danger' }}
+ ${undefined} | ${{}}
+ `(
+ 'persists and retrieves alert data from localStorage when arg is $arg',
+ ({ arg, expectedRetrievedValue }) => {
+ persistAlert(arg);
+
+ expect(localStorage.setItem).toHaveBeenCalledWith(
+ ALERT_LOCALSTORAGE_KEY,
+ JSON.stringify(expectedRetrievedValue),
+ );
+
+ const retrievedValue = retrieveAlert();
+
+ expect(localStorage.getItem).toHaveBeenCalledWith(ALERT_LOCALSTORAGE_KEY);
+ expect(retrievedValue).toEqual(expectedRetrievedValue);
+ },
+ );
+ });
+});
diff --git a/spec/frontend/jobs/components/job_sidebar_retry_button_spec.js b/spec/frontend/jobs/components/job_sidebar_retry_button_spec.js
index 8fc5b071e54..6914b8d4fa1 100644
--- a/spec/frontend/jobs/components/job_sidebar_retry_button_spec.js
+++ b/spec/frontend/jobs/components/job_sidebar_retry_button_spec.js
@@ -54,7 +54,7 @@ describe('Job Sidebar Retry Button', () => {
expect(findRetryButton().attributes()).toMatchObject({
category: 'primary',
- variant: 'info',
+ variant: 'confirm',
});
});
});
diff --git a/spec/frontend/jobs/components/jobs_container_spec.js b/spec/frontend/jobs/components/jobs_container_spec.js
index 9a336489101..1cde72682a2 100644
--- a/spec/frontend/jobs/components/jobs_container_spec.js
+++ b/spec/frontend/jobs/components/jobs_container_spec.js
@@ -1,10 +1,10 @@
-import Vue from 'vue';
-import mountComponent from 'helpers/vue_mount_component_helper';
-import component from '~/jobs/components/jobs_container.vue';
+import { GlLink } from '@gitlab/ui';
+import { mount } from '@vue/test-utils';
+import { extendedWrapper } from 'helpers/vue_test_utils_helper';
+import JobsContainer from '~/jobs/components/jobs_container.vue';
describe('Jobs List block', () => {
- const Component = Vue.extend(component);
- let vm;
+ let wrapper;
const retried = {
status: {
@@ -52,80 +52,96 @@ describe('Jobs List block', () => {
tooltip: 'build - passed',
};
+ const findAllJobs = () => wrapper.findAllComponents(GlLink);
+ const findJob = () => findAllJobs().at(0);
+
+ const findArrowIcon = () => wrapper.findByTestId('arrow-right-icon');
+ const findRetryIcon = () => wrapper.findByTestId('retry-icon');
+
+ const createComponent = (props) => {
+ wrapper = extendedWrapper(
+ mount(JobsContainer, {
+ propsData: {
+ ...props,
+ },
+ }),
+ );
+ };
+
afterEach(() => {
- vm.$destroy();
+ wrapper.destroy();
});
- it('renders list of jobs', () => {
- vm = mountComponent(Component, {
+ it('renders a list of jobs', () => {
+ createComponent({
jobs: [job, retried, active],
jobId: 12313,
});
- expect(vm.$el.querySelectorAll('a').length).toEqual(3);
+ expect(findAllJobs()).toHaveLength(3);
});
- it('renders arrow right when job id matches `jobId`', () => {
- vm = mountComponent(Component, {
+ it('renders the arrow right icon when job id matches `jobId`', () => {
+ createComponent({
jobs: [active],
jobId: active.id,
});
- expect(vm.$el.querySelector('a .js-arrow-right')).not.toBeNull();
+ expect(findArrowIcon().exists()).toBe(true);
});
- it('does not render arrow right when job is not active', () => {
- vm = mountComponent(Component, {
+ it('does not render the arrow right icon when the job is not active', () => {
+ createComponent({
jobs: [job],
jobId: active.id,
});
- expect(vm.$el.querySelector('a .js-arrow-right')).toBeNull();
+ expect(findArrowIcon().exists()).toBe(false);
});
- it('renders job name when present', () => {
- vm = mountComponent(Component, {
+ it('renders the job name when present', () => {
+ createComponent({
jobs: [job],
jobId: active.id,
});
- expect(vm.$el.querySelector('a').textContent.trim()).toContain(job.name);
- expect(vm.$el.querySelector('a').textContent.trim()).not.toContain(job.id);
+ expect(findJob().text()).toBe(job.name);
+ expect(findJob().text()).not.toContain(job.id);
});
it('renders job id when job name is not available', () => {
- vm = mountComponent(Component, {
+ createComponent({
jobs: [retried],
jobId: active.id,
});
- expect(vm.$el.querySelector('a').textContent.trim()).toContain(retried.id);
+ expect(findJob().text()).toBe(retried.id.toString());
});
it('links to the job page', () => {
- vm = mountComponent(Component, {
+ createComponent({
jobs: [job],
jobId: active.id,
});
- expect(vm.$el.querySelector('a').getAttribute('href')).toEqual(job.status.details_path);
+ expect(findJob().attributes('href')).toBe(job.status.details_path);
});
it('renders retry icon when job was retried', () => {
- vm = mountComponent(Component, {
+ createComponent({
jobs: [retried],
jobId: active.id,
});
- expect(vm.$el.querySelector('.js-retry-icon')).not.toBeNull();
+ expect(findRetryIcon().exists()).toBe(true);
});
it('does not render retry icon when job was not retried', () => {
- vm = mountComponent(Component, {
+ createComponent({
jobs: [job],
jobId: active.id,
});
- expect(vm.$el.querySelector('.js-retry-icon')).toBeNull();
+ expect(findRetryIcon().exists()).toBe(false);
});
});
diff --git a/spec/frontend/lib/utils/experimentation_spec.js b/spec/frontend/lib/utils/experimentation_spec.js
deleted file mode 100644
index 2c5d2f89297..00000000000
--- a/spec/frontend/lib/utils/experimentation_spec.js
+++ /dev/null
@@ -1,20 +0,0 @@
-import * as experimentUtils from '~/lib/utils/experimentation';
-
-const TEST_KEY = 'abc';
-
-describe('experiment Utilities', () => {
- describe('isExperimentEnabled', () => {
- it.each`
- experiments | value
- ${{ [TEST_KEY]: true }} | ${true}
- ${{ [TEST_KEY]: false }} | ${false}
- ${{ def: true }} | ${false}
- ${{}} | ${false}
- ${null} | ${false}
- `('returns correct value of $value for experiments=$experiments', ({ experiments, value }) => {
- window.gon = { experiments };
-
- expect(experimentUtils.isExperimentEnabled(TEST_KEY)).toEqual(value);
- });
- });
-});
diff --git a/spec/frontend/lib/utils/number_utility_spec.js b/spec/frontend/lib/utils/number_utility_spec.js
index 2f8f1092612..4dcd9211697 100644
--- a/spec/frontend/lib/utils/number_utility_spec.js
+++ b/spec/frontend/lib/utils/number_utility_spec.js
@@ -9,6 +9,7 @@ import {
median,
changeInPercent,
formattedChangeInPercent,
+ isNumeric,
} from '~/lib/utils/number_utils';
describe('Number Utils', () => {
@@ -162,4 +163,25 @@ describe('Number Utils', () => {
expect(formattedChangeInPercent(0, 1, { nonFiniteResult: '*' })).toBe('*');
});
});
+
+ describe('isNumeric', () => {
+ it.each`
+ value | outcome
+ ${0} | ${true}
+ ${12345} | ${true}
+ ${'0'} | ${true}
+ ${'12345'} | ${true}
+ ${1.0} | ${true}
+ ${'1.0'} | ${true}
+ ${'abcd'} | ${false}
+ ${'abcd100'} | ${false}
+ ${''} | ${false}
+ ${false} | ${false}
+ ${true} | ${false}
+ ${undefined} | ${false}
+ ${null} | ${false}
+ `('when called with $value it returns $outcome', ({ value, outcome }) => {
+ expect(isNumeric(value)).toBe(outcome);
+ });
+ });
});
diff --git a/spec/frontend/lib/utils/select2_utils_spec.js b/spec/frontend/lib/utils/select2_utils_spec.js
new file mode 100644
index 00000000000..6d601dd5ad1
--- /dev/null
+++ b/spec/frontend/lib/utils/select2_utils_spec.js
@@ -0,0 +1,100 @@
+import MockAdapter from 'axios-mock-adapter';
+import $ from 'jquery';
+import { setHTMLFixture } from 'helpers/fixtures';
+import waitForPromises from 'helpers/wait_for_promises';
+import axios from '~/lib/utils/axios_utils';
+import { select2AxiosTransport } from '~/lib/utils/select2_utils';
+
+import 'select2/select2';
+
+const TEST_URL = '/test/api/url';
+const TEST_SEARCH_DATA = { extraSearch: 'test' };
+const TEST_DATA = [{ id: 1 }];
+const TEST_SEARCH = 'FOO';
+
+describe('lib/utils/select2_utils', () => {
+ let mock;
+ let resultsSpy;
+
+ beforeEach(() => {
+ setHTMLFixture('<div><input id="root" /></div>');
+
+ mock = new MockAdapter(axios);
+
+ resultsSpy = jest.fn().mockReturnValue({ results: [] });
+ });
+
+ afterEach(() => {
+ mock.restore();
+ });
+
+ const setupSelect2 = (input) => {
+ input.select2({
+ ajax: {
+ url: TEST_URL,
+ quietMillis: 250,
+ transport: select2AxiosTransport,
+ data(search, page) {
+ return {
+ search,
+ page,
+ ...TEST_SEARCH_DATA,
+ };
+ },
+ results: resultsSpy,
+ },
+ });
+ };
+
+ const setupSelect2AndSearch = async () => {
+ const $input = $('#root');
+
+ setupSelect2($input);
+
+ $input.select2('search', TEST_SEARCH);
+
+ jest.runOnlyPendingTimers();
+ await waitForPromises();
+ };
+
+ describe('select2AxiosTransport', () => {
+ it('uses axios to make request', async () => {
+ // setup mock response
+ const replySpy = jest.fn();
+ mock.onGet(TEST_URL).reply((...args) => replySpy(...args));
+
+ await setupSelect2AndSearch();
+
+ expect(replySpy).toHaveBeenCalledWith(
+ expect.objectContaining({
+ url: TEST_URL,
+ method: 'get',
+ params: {
+ page: 1,
+ search: TEST_SEARCH,
+ ...TEST_SEARCH_DATA,
+ },
+ }),
+ );
+ });
+
+ it.each`
+ headers | pagination
+ ${{}} | ${{ more: false }}
+ ${{ 'X-PAGE': '1', 'x-next-page': 2 }} | ${{ more: true }}
+ `(
+ 'passes results and pagination to results callback, with headers=$headers',
+ async ({ headers, pagination }) => {
+ mock.onGet(TEST_URL).reply(200, TEST_DATA, headers);
+
+ await setupSelect2AndSearch();
+
+ expect(resultsSpy).toHaveBeenCalledWith(
+ { results: TEST_DATA, pagination },
+ 1,
+ expect.anything(),
+ );
+ },
+ );
+ });
+});
diff --git a/spec/frontend/lib/utils/text_markdown_spec.js b/spec/frontend/lib/utils/text_markdown_spec.js
index 43de195c702..b538257fac0 100644
--- a/spec/frontend/lib/utils/text_markdown_spec.js
+++ b/spec/frontend/lib/utils/text_markdown_spec.js
@@ -171,27 +171,40 @@ describe('init markdown', () => {
expect(textArea.value).toEqual(text.replace(selected, `[${selected}](url)`));
});
- it.each`
- key | expected
- ${'['} | ${`[${selected}]`}
- ${'*'} | ${`**${selected}**`}
- ${"'"} | ${`'${selected}'`}
- ${'_'} | ${`_${selected}_`}
- ${'`'} | ${`\`${selected}\``}
- ${'"'} | ${`"${selected}"`}
- ${'{'} | ${`{${selected}}`}
- ${'('} | ${`(${selected})`}
- ${'<'} | ${`<${selected}>`}
- `('generates $expected when $key is pressed', ({ key, expected }) => {
- const event = new KeyboardEvent('keydown', { key });
-
- textArea.addEventListener('keydown', keypressNoteText);
- textArea.dispatchEvent(event);
-
- expect(textArea.value).toEqual(text.replace(selected, expected));
+ describe('surrounds selected text with matching character', () => {
+ it.each`
+ key | expected
+ ${'['} | ${`[${selected}]`}
+ ${'*'} | ${`**${selected}**`}
+ ${"'"} | ${`'${selected}'`}
+ ${'_'} | ${`_${selected}_`}
+ ${'`'} | ${`\`${selected}\``}
+ ${'"'} | ${`"${selected}"`}
+ ${'{'} | ${`{${selected}}`}
+ ${'('} | ${`(${selected})`}
+ ${'<'} | ${`<${selected}>`}
+ `('generates $expected when $key is pressed', ({ key, expected }) => {
+ const event = new KeyboardEvent('keydown', { key });
+ gon.markdown_surround_selection = true;
+
+ textArea.addEventListener('keydown', keypressNoteText);
+ textArea.dispatchEvent(event);
+
+ expect(textArea.value).toEqual(text.replace(selected, expected));
+
+ // cursor placement should be after selection + 2 tag lengths
+ expect(textArea.selectionStart).toBe(selectedIndex + expected.length);
+ });
- // cursor placement should be after selection + 2 tag lengths
- expect(textArea.selectionStart).toBe(selectedIndex + expected.length);
+ it('does nothing if user preference disabled', () => {
+ const event = new KeyboardEvent('keydown', { key: '[' });
+ gon.markdown_surround_selection = false;
+
+ textArea.addEventListener('keydown', keypressNoteText);
+ textArea.dispatchEvent(event);
+
+ expect(textArea.value).toEqual(text);
+ });
});
describe('and text to be selected', () => {
diff --git a/spec/frontend/lib/utils/unit_format/index_spec.js b/spec/frontend/lib/utils/unit_format/index_spec.js
index 5b2fdf1f02b..7fd273f1b58 100644
--- a/spec/frontend/lib/utils/unit_format/index_spec.js
+++ b/spec/frontend/lib/utils/unit_format/index_spec.js
@@ -1,157 +1,213 @@
-import { getFormatter, SUPPORTED_FORMATS } from '~/lib/utils/unit_format';
+import {
+ number,
+ percent,
+ percentHundred,
+ seconds,
+ milliseconds,
+ decimalBytes,
+ kilobytes,
+ megabytes,
+ gigabytes,
+ terabytes,
+ petabytes,
+ bytes,
+ kibibytes,
+ mebibytes,
+ gibibytes,
+ tebibytes,
+ pebibytes,
+ engineering,
+ getFormatter,
+ SUPPORTED_FORMATS,
+} from '~/lib/utils/unit_format';
describe('unit_format', () => {
- describe('when a supported format is provided, the returned function formats', () => {
- it('numbers, by default', () => {
- expect(getFormatter()(1)).toBe('1');
- });
-
- it('numbers', () => {
- const formatNumber = getFormatter(SUPPORTED_FORMATS.number);
-
- expect(formatNumber(1)).toBe('1');
- expect(formatNumber(100)).toBe('100');
- expect(formatNumber(1000)).toBe('1,000');
- expect(formatNumber(10000)).toBe('10,000');
- expect(formatNumber(1000000)).toBe('1,000,000');
- });
-
- it('percent', () => {
- const formatPercent = getFormatter(SUPPORTED_FORMATS.percent);
+ it('engineering', () => {
+ expect(engineering(1)).toBe('1');
+ expect(engineering(100)).toBe('100');
+ expect(engineering(1000)).toBe('1k');
+ expect(engineering(10_000)).toBe('10k');
+ expect(engineering(1_000_000)).toBe('1M');
+
+ expect(engineering(10 ** 9)).toBe('1G');
+ });
- expect(formatPercent(1)).toBe('100%');
- expect(formatPercent(1, 2)).toBe('100.00%');
+ it('number', () => {
+ expect(number(1)).toBe('1');
+ expect(number(100)).toBe('100');
+ expect(number(1000)).toBe('1,000');
+ expect(number(10_000)).toBe('10,000');
+ expect(number(1_000_000)).toBe('1,000,000');
- expect(formatPercent(0.1)).toBe('10%');
- expect(formatPercent(0.5)).toBe('50%');
+ expect(number(10 ** 9)).toBe('1,000,000,000');
+ });
- expect(formatPercent(0.888888)).toBe('89%');
- expect(formatPercent(0.888888, 2)).toBe('88.89%');
- expect(formatPercent(0.888888, 5)).toBe('88.88880%');
+ it('percent', () => {
+ expect(percent(1)).toBe('100%');
+ expect(percent(1, 2)).toBe('100.00%');
- expect(formatPercent(2)).toBe('200%');
- expect(formatPercent(10)).toBe('1,000%');
- });
+ expect(percent(0.1)).toBe('10%');
+ expect(percent(0.5)).toBe('50%');
- it('percentunit', () => {
- const formatPercentHundred = getFormatter(SUPPORTED_FORMATS.percentHundred);
+ expect(percent(0.888888)).toBe('89%');
+ expect(percent(0.888888, 2)).toBe('88.89%');
+ expect(percent(0.888888, 5)).toBe('88.88880%');
- expect(formatPercentHundred(1)).toBe('1%');
- expect(formatPercentHundred(1, 2)).toBe('1.00%');
-
- expect(formatPercentHundred(88.8888)).toBe('89%');
- expect(formatPercentHundred(88.8888, 2)).toBe('88.89%');
- expect(formatPercentHundred(88.8888, 5)).toBe('88.88880%');
+ expect(percent(2)).toBe('200%');
+ expect(percent(10)).toBe('1,000%');
+ });
- expect(formatPercentHundred(100)).toBe('100%');
- expect(formatPercentHundred(100, 2)).toBe('100.00%');
+ it('percentHundred', () => {
+ expect(percentHundred(1)).toBe('1%');
+ expect(percentHundred(1, 2)).toBe('1.00%');
- expect(formatPercentHundred(200)).toBe('200%');
- expect(formatPercentHundred(1000)).toBe('1,000%');
- });
+ expect(percentHundred(88.8888)).toBe('89%');
+ expect(percentHundred(88.8888, 2)).toBe('88.89%');
+ expect(percentHundred(88.8888, 5)).toBe('88.88880%');
- it('seconds', () => {
- expect(getFormatter(SUPPORTED_FORMATS.seconds)(1)).toBe('1s');
- });
+ expect(percentHundred(100)).toBe('100%');
+ expect(percentHundred(100, 2)).toBe('100.00%');
- it('milliseconds', () => {
- const formatMilliseconds = getFormatter(SUPPORTED_FORMATS.milliseconds);
+ expect(percentHundred(200)).toBe('200%');
+ expect(percentHundred(1000)).toBe('1,000%');
+ });
- expect(formatMilliseconds(1)).toBe('1ms');
- expect(formatMilliseconds(100)).toBe('100ms');
- expect(formatMilliseconds(1000)).toBe('1,000ms');
- expect(formatMilliseconds(10000)).toBe('10,000ms');
- expect(formatMilliseconds(1000000)).toBe('1,000,000ms');
- });
+ it('seconds', () => {
+ expect(seconds(1)).toBe('1s');
+ });
- it('decimalBytes', () => {
- const formatDecimalBytes = getFormatter(SUPPORTED_FORMATS.decimalBytes);
-
- expect(formatDecimalBytes(1)).toBe('1B');
- expect(formatDecimalBytes(1, 1)).toBe('1.0B');
-
- expect(formatDecimalBytes(10)).toBe('10B');
- expect(formatDecimalBytes(10 ** 2)).toBe('100B');
- expect(formatDecimalBytes(10 ** 3)).toBe('1kB');
- expect(formatDecimalBytes(10 ** 4)).toBe('10kB');
- expect(formatDecimalBytes(10 ** 5)).toBe('100kB');
- expect(formatDecimalBytes(10 ** 6)).toBe('1MB');
- expect(formatDecimalBytes(10 ** 7)).toBe('10MB');
- expect(formatDecimalBytes(10 ** 8)).toBe('100MB');
- expect(formatDecimalBytes(10 ** 9)).toBe('1GB');
- expect(formatDecimalBytes(10 ** 10)).toBe('10GB');
- expect(formatDecimalBytes(10 ** 11)).toBe('100GB');
- });
+ it('milliseconds', () => {
+ expect(milliseconds(1)).toBe('1ms');
+ expect(milliseconds(100)).toBe('100ms');
+ expect(milliseconds(1000)).toBe('1,000ms');
+ expect(milliseconds(10_000)).toBe('10,000ms');
+ expect(milliseconds(1_000_000)).toBe('1,000,000ms');
+ });
- it('kilobytes', () => {
- expect(getFormatter(SUPPORTED_FORMATS.kilobytes)(1)).toBe('1kB');
- expect(getFormatter(SUPPORTED_FORMATS.kilobytes)(1, 1)).toBe('1.0kB');
- });
+ it('decimalBytes', () => {
+ expect(decimalBytes(1)).toBe('1B');
+ expect(decimalBytes(1, 1)).toBe('1.0B');
+
+ expect(decimalBytes(10)).toBe('10B');
+ expect(decimalBytes(10 ** 2)).toBe('100B');
+ expect(decimalBytes(10 ** 3)).toBe('1kB');
+ expect(decimalBytes(10 ** 4)).toBe('10kB');
+ expect(decimalBytes(10 ** 5)).toBe('100kB');
+ expect(decimalBytes(10 ** 6)).toBe('1MB');
+ expect(decimalBytes(10 ** 7)).toBe('10MB');
+ expect(decimalBytes(10 ** 8)).toBe('100MB');
+ expect(decimalBytes(10 ** 9)).toBe('1GB');
+ expect(decimalBytes(10 ** 10)).toBe('10GB');
+ expect(decimalBytes(10 ** 11)).toBe('100GB');
+ });
- it('megabytes', () => {
- expect(getFormatter(SUPPORTED_FORMATS.megabytes)(1)).toBe('1MB');
- expect(getFormatter(SUPPORTED_FORMATS.megabytes)(1, 1)).toBe('1.0MB');
- });
+ it('kilobytes', () => {
+ expect(kilobytes(1)).toBe('1kB');
+ expect(kilobytes(1, 1)).toBe('1.0kB');
+ });
- it('gigabytes', () => {
- expect(getFormatter(SUPPORTED_FORMATS.gigabytes)(1)).toBe('1GB');
- expect(getFormatter(SUPPORTED_FORMATS.gigabytes)(1, 1)).toBe('1.0GB');
- });
+ it('megabytes', () => {
+ expect(megabytes(1)).toBe('1MB');
+ expect(megabytes(1, 1)).toBe('1.0MB');
+ });
- it('terabytes', () => {
- expect(getFormatter(SUPPORTED_FORMATS.terabytes)(1)).toBe('1TB');
- expect(getFormatter(SUPPORTED_FORMATS.terabytes)(1, 1)).toBe('1.0TB');
- });
+ it('gigabytes', () => {
+ expect(gigabytes(1)).toBe('1GB');
+ expect(gigabytes(1, 1)).toBe('1.0GB');
+ });
- it('petabytes', () => {
- expect(getFormatter(SUPPORTED_FORMATS.petabytes)(1)).toBe('1PB');
- expect(getFormatter(SUPPORTED_FORMATS.petabytes)(1, 1)).toBe('1.0PB');
- });
+ it('terabytes', () => {
+ expect(terabytes(1)).toBe('1TB');
+ expect(terabytes(1, 1)).toBe('1.0TB');
+ });
- it('bytes', () => {
- const formatBytes = getFormatter(SUPPORTED_FORMATS.bytes);
+ it('petabytes', () => {
+ expect(petabytes(1)).toBe('1PB');
+ expect(petabytes(1, 1)).toBe('1.0PB');
+ });
- expect(formatBytes(1)).toBe('1B');
- expect(formatBytes(1, 1)).toBe('1.0B');
+ it('bytes', () => {
+ expect(bytes(1)).toBe('1B');
+ expect(bytes(1, 1)).toBe('1.0B');
- expect(formatBytes(10)).toBe('10B');
- expect(formatBytes(100)).toBe('100B');
- expect(formatBytes(1000)).toBe('1,000B');
+ expect(bytes(10)).toBe('10B');
+ expect(bytes(100)).toBe('100B');
+ expect(bytes(1000)).toBe('1,000B');
- expect(formatBytes(1 * 1024)).toBe('1KiB');
- expect(formatBytes(1 * 1024 ** 2)).toBe('1MiB');
- expect(formatBytes(1 * 1024 ** 3)).toBe('1GiB');
- });
+ expect(bytes(1 * 1024)).toBe('1KiB');
+ expect(bytes(1 * 1024 ** 2)).toBe('1MiB');
+ expect(bytes(1 * 1024 ** 3)).toBe('1GiB');
+ });
- it('kibibytes', () => {
- expect(getFormatter(SUPPORTED_FORMATS.kibibytes)(1)).toBe('1KiB');
- expect(getFormatter(SUPPORTED_FORMATS.kibibytes)(1, 1)).toBe('1.0KiB');
- });
+ it('kibibytes', () => {
+ expect(kibibytes(1)).toBe('1KiB');
+ expect(kibibytes(1, 1)).toBe('1.0KiB');
+ });
- it('mebibytes', () => {
- expect(getFormatter(SUPPORTED_FORMATS.mebibytes)(1)).toBe('1MiB');
- expect(getFormatter(SUPPORTED_FORMATS.mebibytes)(1, 1)).toBe('1.0MiB');
- });
+ it('mebibytes', () => {
+ expect(mebibytes(1)).toBe('1MiB');
+ expect(mebibytes(1, 1)).toBe('1.0MiB');
+ });
- it('gibibytes', () => {
- expect(getFormatter(SUPPORTED_FORMATS.gibibytes)(1)).toBe('1GiB');
- expect(getFormatter(SUPPORTED_FORMATS.gibibytes)(1, 1)).toBe('1.0GiB');
- });
+ it('gibibytes', () => {
+ expect(gibibytes(1)).toBe('1GiB');
+ expect(gibibytes(1, 1)).toBe('1.0GiB');
+ });
- it('tebibytes', () => {
- expect(getFormatter(SUPPORTED_FORMATS.tebibytes)(1)).toBe('1TiB');
- expect(getFormatter(SUPPORTED_FORMATS.tebibytes)(1, 1)).toBe('1.0TiB');
- });
+ it('tebibytes', () => {
+ expect(tebibytes(1)).toBe('1TiB');
+ expect(tebibytes(1, 1)).toBe('1.0TiB');
+ });
- it('pebibytes', () => {
- expect(getFormatter(SUPPORTED_FORMATS.pebibytes)(1)).toBe('1PiB');
- expect(getFormatter(SUPPORTED_FORMATS.pebibytes)(1, 1)).toBe('1.0PiB');
- });
+ it('pebibytes', () => {
+ expect(pebibytes(1)).toBe('1PiB');
+ expect(pebibytes(1, 1)).toBe('1.0PiB');
});
- describe('when get formatter format is incorrect', () => {
- it('formatter fails', () => {
- expect(() => getFormatter('not-supported')(1)).toThrow();
+ describe('getFormatter', () => {
+ it.each([
+ [1],
+ [10],
+ [200],
+ [100],
+ [1000],
+ [10_000],
+ [100_000],
+ [1_000_000],
+ [10 ** 6],
+ [10 ** 9],
+ [0.1],
+ [0.5],
+ [0.888888],
+ ])('formatting functions yield the same result as getFormatter for %d', (value) => {
+ expect(number(value)).toBe(getFormatter(SUPPORTED_FORMATS.number)(value));
+ expect(percent(value)).toBe(getFormatter(SUPPORTED_FORMATS.percent)(value));
+ expect(percentHundred(value)).toBe(getFormatter(SUPPORTED_FORMATS.percentHundred)(value));
+
+ expect(seconds(value)).toBe(getFormatter(SUPPORTED_FORMATS.seconds)(value));
+ expect(milliseconds(value)).toBe(getFormatter(SUPPORTED_FORMATS.milliseconds)(value));
+
+ expect(decimalBytes(value)).toBe(getFormatter(SUPPORTED_FORMATS.decimalBytes)(value));
+ expect(kilobytes(value)).toBe(getFormatter(SUPPORTED_FORMATS.kilobytes)(value));
+ expect(megabytes(value)).toBe(getFormatter(SUPPORTED_FORMATS.megabytes)(value));
+ expect(gigabytes(value)).toBe(getFormatter(SUPPORTED_FORMATS.gigabytes)(value));
+ expect(terabytes(value)).toBe(getFormatter(SUPPORTED_FORMATS.terabytes)(value));
+ expect(petabytes(value)).toBe(getFormatter(SUPPORTED_FORMATS.petabytes)(value));
+
+ expect(bytes(value)).toBe(getFormatter(SUPPORTED_FORMATS.bytes)(value));
+ expect(kibibytes(value)).toBe(getFormatter(SUPPORTED_FORMATS.kibibytes)(value));
+ expect(mebibytes(value)).toBe(getFormatter(SUPPORTED_FORMATS.mebibytes)(value));
+ expect(gibibytes(value)).toBe(getFormatter(SUPPORTED_FORMATS.gibibytes)(value));
+ expect(tebibytes(value)).toBe(getFormatter(SUPPORTED_FORMATS.tebibytes)(value));
+ expect(pebibytes(value)).toBe(getFormatter(SUPPORTED_FORMATS.pebibytes)(value));
+
+ expect(engineering(value)).toBe(getFormatter(SUPPORTED_FORMATS.engineering)(value));
+ });
+
+ describe('when get formatter format is incorrect', () => {
+ it('formatter fails', () => {
+ expect(() => getFormatter('not-supported')(1)).toThrow();
+ });
});
});
});
diff --git a/spec/frontend/lib/utils/url_utility_spec.js b/spec/frontend/lib/utils/url_utility_spec.js
index b60ddea81ee..e12cd8b0e37 100644
--- a/spec/frontend/lib/utils/url_utility_spec.js
+++ b/spec/frontend/lib/utils/url_utility_spec.js
@@ -814,6 +814,14 @@ describe('URL utility', () => {
);
});
+ it('decodes URI when decodeURI=true', () => {
+ const url = 'https://gitlab.com/test';
+
+ expect(urlUtils.setUrlParams({ labels: ['foo', 'bar'] }, url, false, true, true)).toEqual(
+ 'https://gitlab.com/test?labels[]=foo&labels[]=bar',
+ );
+ });
+
it('removes all existing URL params and sets a new param when cleanParams=true', () => {
const url = 'https://gitlab.com/test?group_id=gitlab-org&project_id=my-project';
diff --git a/spec/frontend/line_highlighter_spec.js b/spec/frontend/line_highlighter_spec.js
index 8318f63ab3e..b5a0adc9d49 100644
--- a/spec/frontend/line_highlighter_spec.js
+++ b/spec/frontend/line_highlighter_spec.js
@@ -7,7 +7,6 @@ import LineHighlighter from '~/line_highlighter';
describe('LineHighlighter', () => {
const testContext = {};
- preloadFixtures('static/line_highlighter.html');
const clickLine = (number, eventData = {}) => {
if ($.isEmptyObject(eventData)) {
return $(`#L${number}`).click();
diff --git a/spec/frontend/locale/index_spec.js b/spec/frontend/locale/index_spec.js
index d65d7c195b2..a08be502735 100644
--- a/spec/frontend/locale/index_spec.js
+++ b/spec/frontend/locale/index_spec.js
@@ -1,5 +1,5 @@
import { setLanguage } from 'helpers/locale_helper';
-import { createDateTimeFormat, languageCode } from '~/locale';
+import { createDateTimeFormat, formatNumber, languageCode } from '~/locale';
describe('locale', () => {
afterEach(() => setLanguage(null));
@@ -27,4 +27,68 @@ describe('locale', () => {
expect(dateFormat.format(new Date(2015, 6, 3))).toBe('July 3, 2015');
});
});
+
+ describe('formatNumber', () => {
+ it('formats numbers', () => {
+ expect(formatNumber(1)).toBe('1');
+ expect(formatNumber(12345)).toBe('12,345');
+ });
+
+ it('formats bigint numbers', () => {
+ expect(formatNumber(123456789123456789n)).toBe('123,456,789,123,456,789');
+ });
+
+ it('formats numbers with options', () => {
+ expect(formatNumber(1, { style: 'percent' })).toBe('100%');
+ expect(formatNumber(1, { style: 'currency', currency: 'USD' })).toBe('$1.00');
+ });
+
+ it('formats localized numbers', () => {
+ expect(formatNumber(12345, {}, 'es')).toBe('12.345');
+ });
+
+ it('formats NaN', () => {
+ expect(formatNumber(NaN)).toBe('NaN');
+ });
+
+ it('formats infinity', () => {
+ expect(formatNumber(Number.POSITIVE_INFINITY)).toBe('∞');
+ });
+
+ it('formats negative infinity', () => {
+ expect(formatNumber(Number.NEGATIVE_INFINITY)).toBe('-∞');
+ });
+
+ it('formats EPSILON', () => {
+ expect(formatNumber(Number.EPSILON)).toBe('0');
+ });
+
+ describe('non-number values should pass through', () => {
+ it('undefined', () => {
+ expect(formatNumber(undefined)).toBe(undefined);
+ });
+
+ it('null', () => {
+ expect(formatNumber(null)).toBe(null);
+ });
+
+ it('arrays', () => {
+ expect(formatNumber([])).toEqual([]);
+ });
+
+ it('objects', () => {
+ expect(formatNumber({ a: 'b' })).toEqual({ a: 'b' });
+ });
+ });
+
+ describe('when in a different locale', () => {
+ beforeEach(() => {
+ setLanguage('es');
+ });
+
+ it('formats localized numbers', () => {
+ expect(formatNumber(12345)).toBe('12.345');
+ });
+ });
+ });
});
diff --git a/spec/frontend/members/components/avatars/user_avatar_spec.js b/spec/frontend/members/components/avatars/user_avatar_spec.js
index 303c82582a3..3f4d9155c5d 100644
--- a/spec/frontend/members/components/avatars/user_avatar_spec.js
+++ b/spec/frontend/members/components/avatars/user_avatar_spec.js
@@ -1,21 +1,31 @@
import { GlAvatarLink, GlBadge } from '@gitlab/ui';
import { within } from '@testing-library/dom';
import { mount, createWrapper } from '@vue/test-utils';
+import Vue from 'vue';
+import Vuex from 'vuex';
import UserAvatar from '~/members/components/avatars/user_avatar.vue';
-import { member as memberMock, orphanedMember } from '../../mock_data';
+import { member as memberMock, member2faEnabled, orphanedMember } from '../../mock_data';
+
+Vue.use(Vuex);
describe('UserAvatar', () => {
let wrapper;
const { user } = memberMock;
- const createComponent = (propsData = {}) => {
+ const createComponent = (propsData = {}, state = {}) => {
wrapper = mount(UserAvatar, {
propsData: {
member: memberMock,
isCurrentUser: false,
...propsData,
},
+ store: new Vuex.Store({
+ state: {
+ canManageMembers: true,
+ ...state,
+ },
+ }),
});
};
@@ -69,9 +79,9 @@ describe('UserAvatar', () => {
describe('badges', () => {
it.each`
- member | badgeText
- ${{ ...memberMock, user: { ...memberMock.user, blocked: true } }} | ${'Blocked'}
- ${{ ...memberMock, user: { ...memberMock.user, twoFactorEnabled: true } }} | ${'2FA'}
+ member | badgeText
+ ${{ ...memberMock, user: { ...memberMock.user, blocked: true } }} | ${'Blocked'}
+ ${member2faEnabled} | ${'2FA'}
`('renders the "$badgeText" badge', ({ member, badgeText }) => {
createComponent({ member });
@@ -83,6 +93,12 @@ describe('UserAvatar', () => {
expect(getByText("It's you").exists()).toBe(true);
});
+
+ it('does not render 2FA badge when `canManageMembers` is `false`', () => {
+ createComponent({ member: member2faEnabled }, { canManageMembers: false });
+
+ expect(within(wrapper.element).queryByText('2FA')).toBe(null);
+ });
});
describe('user status', () => {
diff --git a/spec/frontend/members/mock_data.js b/spec/frontend/members/mock_data.js
index fa324ce1cf9..6a73b2fcf8c 100644
--- a/spec/frontend/members/mock_data.js
+++ b/spec/frontend/members/mock_data.js
@@ -75,3 +75,5 @@ export const membersJsonString = JSON.stringify(members);
export const directMember = { ...member, isDirectMember: true };
export const inheritedMember = { ...member, isDirectMember: false };
+
+export const member2faEnabled = { ...member, user: { ...member.user, twoFactorEnabled: true } };
diff --git a/spec/frontend/members/utils_spec.js b/spec/frontend/members/utils_spec.js
index f447a4c4ee9..bfb5a4bc7d3 100644
--- a/spec/frontend/members/utils_spec.js
+++ b/spec/frontend/members/utils_spec.js
@@ -17,6 +17,7 @@ import {
member as memberMock,
directMember,
inheritedMember,
+ member2faEnabled,
group,
invite,
membersJsonString,
@@ -30,7 +31,11 @@ const URL_HOST = 'https://localhost/';
describe('Members Utils', () => {
describe('generateBadges', () => {
it('has correct properties for each badge', () => {
- const badges = generateBadges(memberMock, true);
+ const badges = generateBadges({
+ member: memberMock,
+ isCurrentUser: true,
+ canManageMembers: true,
+ });
badges.forEach((badge) => {
expect(badge).toEqual(
@@ -44,12 +49,32 @@ describe('Members Utils', () => {
});
it.each`
- member | expected
- ${memberMock} | ${{ show: true, text: "It's you", variant: 'success' }}
- ${{ ...memberMock, user: { ...memberMock.user, blocked: true } }} | ${{ show: true, text: 'Blocked', variant: 'danger' }}
- ${{ ...memberMock, user: { ...memberMock.user, twoFactorEnabled: true } }} | ${{ show: true, text: '2FA', variant: 'info' }}
+ member | expected
+ ${memberMock} | ${{ show: true, text: "It's you", variant: 'success' }}
+ ${{ ...memberMock, user: { ...memberMock.user, blocked: true } }} | ${{ show: true, text: 'Blocked', variant: 'danger' }}
+ ${member2faEnabled} | ${{ show: true, text: '2FA', variant: 'info' }}
`('returns expected output for "$expected.text" badge', ({ member, expected }) => {
- expect(generateBadges(member, true)).toContainEqual(expect.objectContaining(expected));
+ expect(
+ generateBadges({ member, isCurrentUser: true, canManageMembers: true }),
+ ).toContainEqual(expect.objectContaining(expected));
+ });
+
+ describe('when `canManageMembers` argument is `false`', () => {
+ describe.each`
+ description | memberIsCurrentUser | expectedBadgeToBeShown
+ ${'is not the current user'} | ${false} | ${false}
+ ${'is the current user'} | ${true} | ${true}
+ `('when member is $description', ({ memberIsCurrentUser, expectedBadgeToBeShown }) => {
+ it(`sets 'show' to '${expectedBadgeToBeShown}' for 2FA badge`, () => {
+ const badges = generateBadges({
+ member: member2faEnabled,
+ isCurrentUser: memberIsCurrentUser,
+ canManageMembers: false,
+ });
+
+ expect(badges.find((badge) => badge.text === '2FA').show).toBe(expectedBadgeToBeShown);
+ });
+ });
});
});
diff --git a/spec/frontend/merge_conflicts/store/actions_spec.js b/spec/frontend/merge_conflicts/store/actions_spec.js
new file mode 100644
index 00000000000..352f1783b87
--- /dev/null
+++ b/spec/frontend/merge_conflicts/store/actions_spec.js
@@ -0,0 +1,257 @@
+import axios from 'axios';
+import MockAdapter from 'axios-mock-adapter';
+import { useMockLocationHelper } from 'helpers/mock_window_location_helper';
+import testAction from 'helpers/vuex_action_helper';
+import createFlash from '~/flash';
+import { INTERACTIVE_RESOLVE_MODE, EDIT_RESOLVE_MODE } from '~/merge_conflicts/constants';
+import * as actions from '~/merge_conflicts/store/actions';
+import * as types from '~/merge_conflicts/store/mutation_types';
+import { restoreFileLinesState, markLine, decorateFiles } from '~/merge_conflicts/utils';
+
+jest.mock('~/flash.js');
+jest.mock('~/merge_conflicts/utils');
+
+describe('merge conflicts actions', () => {
+ let mock;
+
+ const files = [
+ {
+ blobPath: 'a',
+ },
+ { blobPath: 'b' },
+ ];
+
+ beforeEach(() => {
+ mock = new MockAdapter(axios);
+ });
+
+ afterEach(() => {
+ mock.restore();
+ });
+
+ describe('fetchConflictsData', () => {
+ const conflictsPath = 'conflicts/path/mock';
+
+ it('on success dispatches setConflictsData', (done) => {
+ mock.onGet(conflictsPath).reply(200, {});
+ testAction(
+ actions.fetchConflictsData,
+ conflictsPath,
+ {},
+ [
+ { type: types.SET_LOADING_STATE, payload: true },
+ { type: types.SET_LOADING_STATE, payload: false },
+ ],
+ [{ type: 'setConflictsData', payload: {} }],
+ done,
+ );
+ });
+
+ it('when data has type equal to error ', (done) => {
+ mock.onGet(conflictsPath).reply(200, { type: 'error', message: 'error message' });
+ testAction(
+ actions.fetchConflictsData,
+ conflictsPath,
+ {},
+ [
+ { type: types.SET_LOADING_STATE, payload: true },
+ { type: types.SET_FAILED_REQUEST, payload: 'error message' },
+ { type: types.SET_LOADING_STATE, payload: false },
+ ],
+ [],
+ done,
+ );
+ });
+
+ it('when request fails ', (done) => {
+ mock.onGet(conflictsPath).reply(400);
+ testAction(
+ actions.fetchConflictsData,
+ conflictsPath,
+ {},
+ [
+ { type: types.SET_LOADING_STATE, payload: true },
+ { type: types.SET_FAILED_REQUEST },
+ { type: types.SET_LOADING_STATE, payload: false },
+ ],
+ [],
+ done,
+ );
+ });
+ });
+
+ describe('submitResolvedConflicts', () => {
+ useMockLocationHelper();
+ const resolveConflictsPath = 'resolve/conflicts/path/mock';
+
+ it('on success reloads the page', (done) => {
+ mock.onPost(resolveConflictsPath).reply(200, { redirect_to: 'hrefPath' });
+ testAction(
+ actions.submitResolvedConflicts,
+ resolveConflictsPath,
+ {},
+ [{ type: types.SET_SUBMIT_STATE, payload: true }],
+ [],
+ () => {
+ expect(window.location.assign).toHaveBeenCalledWith('hrefPath');
+ done();
+ },
+ );
+ });
+
+ it('on errors shows flash', (done) => {
+ mock.onPost(resolveConflictsPath).reply(400);
+ testAction(
+ actions.submitResolvedConflicts,
+ resolveConflictsPath,
+ {},
+ [
+ { type: types.SET_SUBMIT_STATE, payload: true },
+ { type: types.SET_SUBMIT_STATE, payload: false },
+ ],
+ [],
+ () => {
+ expect(createFlash).toHaveBeenCalledWith({
+ message: 'Failed to save merge conflicts resolutions. Please try again!',
+ });
+ done();
+ },
+ );
+ });
+ });
+
+ describe('setConflictsData', () => {
+ it('INTERACTIVE_RESOLVE_MODE updates the correct file ', (done) => {
+ decorateFiles.mockReturnValue([{ bar: 'baz' }]);
+ testAction(
+ actions.setConflictsData,
+ { files, foo: 'bar' },
+ {},
+ [
+ {
+ type: types.SET_CONFLICTS_DATA,
+ payload: { foo: 'bar', files: [{ bar: 'baz' }] },
+ },
+ ],
+ [],
+ done,
+ );
+ });
+ });
+
+ describe('setFileResolveMode', () => {
+ it('INTERACTIVE_RESOLVE_MODE updates the correct file ', (done) => {
+ testAction(
+ actions.setFileResolveMode,
+ { file: files[0], mode: INTERACTIVE_RESOLVE_MODE },
+ { conflictsData: { files }, getFileIndex: () => 0 },
+ [
+ {
+ type: types.UPDATE_FILE,
+ payload: {
+ file: { ...files[0], showEditor: false, resolveMode: INTERACTIVE_RESOLVE_MODE },
+ index: 0,
+ },
+ },
+ ],
+ [],
+ done,
+ );
+ });
+
+ it('EDIT_RESOLVE_MODE updates the correct file ', (done) => {
+ restoreFileLinesState.mockReturnValue([]);
+ const file = {
+ ...files[0],
+ showEditor: true,
+ loadEditor: true,
+ resolutionData: {},
+ resolveMode: EDIT_RESOLVE_MODE,
+ };
+ testAction(
+ actions.setFileResolveMode,
+ { file: files[0], mode: EDIT_RESOLVE_MODE },
+ { conflictsData: { files }, getFileIndex: () => 0 },
+ [
+ {
+ type: types.UPDATE_FILE,
+ payload: {
+ file,
+ index: 0,
+ },
+ },
+ ],
+ [],
+ () => {
+ expect(restoreFileLinesState).toHaveBeenCalledWith(file);
+ done();
+ },
+ );
+ });
+ });
+
+ describe('setPromptConfirmationState', () => {
+ it('updates the correct file ', (done) => {
+ testAction(
+ actions.setPromptConfirmationState,
+ { file: files[0], promptDiscardConfirmation: true },
+ { conflictsData: { files }, getFileIndex: () => 0 },
+ [
+ {
+ type: types.UPDATE_FILE,
+ payload: {
+ file: { ...files[0], promptDiscardConfirmation: true },
+ index: 0,
+ },
+ },
+ ],
+ [],
+ done,
+ );
+ });
+ });
+
+ describe('handleSelected', () => {
+ const file = {
+ ...files[0],
+ inlineLines: [{ id: 1, hasConflict: true }, { id: 2 }],
+ parallelLines: [
+ [{ id: 1, hasConflict: true }, { id: 1 }],
+ [{ id: 2 }, { id: 3 }],
+ ],
+ };
+
+ it('updates the correct file ', (done) => {
+ const marLikeMockReturn = { foo: 'bar' };
+ markLine.mockReturnValue(marLikeMockReturn);
+
+ testAction(
+ actions.handleSelected,
+ { file, line: { id: 1, section: 'baz' } },
+ { conflictsData: { files }, getFileIndex: () => 0 },
+ [
+ {
+ type: types.UPDATE_FILE,
+ payload: {
+ file: {
+ ...file,
+ resolutionData: { 1: 'baz' },
+ inlineLines: [marLikeMockReturn, { id: 2 }],
+ parallelLines: [
+ [marLikeMockReturn, marLikeMockReturn],
+ [{ id: 2 }, { id: 3 }],
+ ],
+ },
+ index: 0,
+ },
+ },
+ ],
+ [],
+ () => {
+ expect(markLine).toHaveBeenCalledTimes(3);
+ done();
+ },
+ );
+ });
+ });
+});
diff --git a/spec/frontend/merge_request_spec.js b/spec/frontend/merge_request_spec.js
index 84647a108b2..0b7ed349507 100644
--- a/spec/frontend/merge_request_spec.js
+++ b/spec/frontend/merge_request_spec.js
@@ -9,7 +9,6 @@ describe('MergeRequest', () => {
describe('task lists', () => {
let mock;
- preloadFixtures('merge_requests/merge_request_with_task_list.html');
beforeEach(() => {
loadFixtures('merge_requests/merge_request_with_task_list.html');
diff --git a/spec/frontend/merge_request_tabs_spec.js b/spec/frontend/merge_request_tabs_spec.js
index fd2c240aff3..23e9bf8b447 100644
--- a/spec/frontend/merge_request_tabs_spec.js
+++ b/spec/frontend/merge_request_tabs_spec.js
@@ -21,11 +21,6 @@ describe('MergeRequestTabs', () => {
$.extend(stubLocation, defaults, stubs || {});
};
- preloadFixtures(
- 'merge_requests/merge_request_with_task_list.html',
- 'merge_requests/diff_comment.html',
- );
-
beforeEach(() => {
initMrPage();
diff --git a/spec/frontend/mini_pipeline_graph_dropdown_spec.js b/spec/frontend/mini_pipeline_graph_dropdown_spec.js
index 3ff34c967e4..ccd5a4ea142 100644
--- a/spec/frontend/mini_pipeline_graph_dropdown_spec.js
+++ b/spec/frontend/mini_pipeline_graph_dropdown_spec.js
@@ -5,8 +5,6 @@ import axios from '~/lib/utils/axios_utils';
import MiniPipelineGraph from '~/mini_pipeline_graph_dropdown';
describe('Mini Pipeline Graph Dropdown', () => {
- preloadFixtures('static/mini_dropdown_graph.html');
-
beforeEach(() => {
loadFixtures('static/mini_dropdown_graph.html');
});
diff --git a/spec/frontend/monitoring/components/dashboard_panel_builder_spec.js b/spec/frontend/monitoring/components/dashboard_panel_builder_spec.js
index b794d0c571e..400ac2e8f85 100644
--- a/spec/frontend/monitoring/components/dashboard_panel_builder_spec.js
+++ b/spec/frontend/monitoring/components/dashboard_panel_builder_spec.js
@@ -188,7 +188,7 @@ describe('dashboard invalid url parameters', () => {
});
describe('when there is an error', () => {
- const mockError = 'an error ocurred!';
+ const mockError = 'an error occurred!';
beforeEach(() => {
store.commit(`monitoringDashboard/${types.RECEIVE_PANEL_PREVIEW_FAILURE}`, mockError);
diff --git a/spec/frontend/monitoring/components/duplicate_dashboard_form_spec.js b/spec/frontend/monitoring/components/duplicate_dashboard_form_spec.js
index 9672f6a315a..51b4106d4b1 100644
--- a/spec/frontend/monitoring/components/duplicate_dashboard_form_spec.js
+++ b/spec/frontend/monitoring/components/duplicate_dashboard_form_spec.js
@@ -23,7 +23,7 @@ describe('DuplicateDashboardForm', () => {
findByRef(ref).setValue(val);
};
const setChecked = (value) => {
- const input = wrapper.find(`.form-check-input[value="${value}"]`);
+ const input = wrapper.find(`.custom-control-input[value="${value}"]`);
input.element.checked = true;
input.trigger('click');
input.trigger('change');
diff --git a/spec/frontend/monitoring/requests/index_spec.js b/spec/frontend/monitoring/requests/index_spec.js
index b30b1e60575..03bf5d70153 100644
--- a/spec/frontend/monitoring/requests/index_spec.js
+++ b/spec/frontend/monitoring/requests/index_spec.js
@@ -94,7 +94,7 @@ describe('monitoring metrics_requests', () => {
it('rejects after getting an HTTP 500 error', () => {
mock.onGet(prometheusEndpoint).reply(500, {
status: 'error',
- error: 'An error ocurred',
+ error: 'An error occurred',
});
return getPrometheusQueryData(prometheusEndpoint, params).catch((error) => {
@@ -106,7 +106,7 @@ describe('monitoring metrics_requests', () => {
// Mock multiple attempts while the cache is filling up and fails
mock.onGet(prometheusEndpoint).reply(statusCodes.UNAUTHORIZED, {
status: 'error',
- error: 'An error ocurred',
+ error: 'An error occurred',
});
return getPrometheusQueryData(prometheusEndpoint, params).catch((error) => {
@@ -120,7 +120,7 @@ describe('monitoring metrics_requests', () => {
mock.onGet(prometheusEndpoint).replyOnce(statusCodes.NO_CONTENT);
mock.onGet(prometheusEndpoint).reply(500, {
status: 'error',
- error: 'An error ocurred',
+ error: 'An error occurred',
}); // 3rd attempt
return getPrometheusQueryData(prometheusEndpoint, params).catch((error) => {
diff --git a/spec/frontend/new_branch_spec.js b/spec/frontend/new_branch_spec.js
index 7e6b8a78d4f..66b28a8c0dc 100644
--- a/spec/frontend/new_branch_spec.js
+++ b/spec/frontend/new_branch_spec.js
@@ -9,8 +9,6 @@ describe('Branch', () => {
});
describe('create a new branch', () => {
- preloadFixtures('branches/new_branch.html');
-
function fillNameWith(value) {
$('.js-branch-name').val(value).trigger('blur');
}
diff --git a/spec/frontend/notes/components/comment_form_spec.js b/spec/frontend/notes/components/comment_form_spec.js
index 2f58f75ab70..bab90723578 100644
--- a/spec/frontend/notes/components/comment_form_spec.js
+++ b/spec/frontend/notes/components/comment_form_spec.js
@@ -1,7 +1,9 @@
+import { GlDropdown, GlAlert } from '@gitlab/ui';
import { mount, shallowMount } from '@vue/test-utils';
import Autosize from 'autosize';
import MockAdapter from 'axios-mock-adapter';
-import { nextTick } from 'vue';
+import Vue, { nextTick } from 'vue';
+import Vuex from 'vuex';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import { refreshUserMergeRequestCounts } from '~/commons/nav/user_merge_requests';
import { deprecatedCreateFlash as flash } from '~/flash';
@@ -9,7 +11,8 @@ import axios from '~/lib/utils/axios_utils';
import CommentForm from '~/notes/components/comment_form.vue';
import * as constants from '~/notes/constants';
import eventHub from '~/notes/event_hub';
-import createStore from '~/notes/stores';
+import { COMMENT_FORM } from '~/notes/i18n';
+import notesModule from '~/notes/stores/modules';
import { loggedOutnoteableData, notesDataMock, userDataMock, noteableDataMock } from '../mock_data';
jest.mock('autosize');
@@ -17,15 +20,45 @@ jest.mock('~/commons/nav/user_merge_requests');
jest.mock('~/flash');
jest.mock('~/gl_form');
+Vue.use(Vuex);
+
describe('issue_comment_form component', () => {
let store;
let wrapper;
let axiosMock;
const findCloseReopenButton = () => wrapper.findByTestId('close-reopen-button');
- const findCommentButton = () => wrapper.findByTestId('comment-button');
const findTextArea = () => wrapper.findByTestId('comment-field');
const findConfidentialNoteCheckbox = () => wrapper.findByTestId('confidential-note-checkbox');
+ const findCommentGlDropdown = () => wrapper.find(GlDropdown);
+ const findCommentButton = () => findCommentGlDropdown().find('button');
+ const findErrorAlerts = () => wrapper.findAllComponents(GlAlert).wrappers;
+
+ async function clickCommentButton({ waitForComponent = true, waitForNetwork = true } = {}) {
+ findCommentButton().trigger('click');
+
+ if (waitForComponent || waitForNetwork) {
+ // Wait for the click to bubble out and trigger the handler
+ await nextTick();
+
+ if (waitForNetwork) {
+ // Wait for the network request promise to resolve
+ await nextTick();
+ }
+ }
+ }
+
+ function createStore({ actions = {} } = {}) {
+ const baseModule = notesModule();
+
+ return new Vuex.Store({
+ ...baseModule,
+ actions: {
+ ...baseModule.actions,
+ ...actions,
+ },
+ });
+ }
const createNotableDataMock = (data = {}) => {
return {
@@ -101,6 +134,83 @@ describe('issue_comment_form component', () => {
expect(wrapper.vm.resizeTextarea).toHaveBeenCalled();
});
+ it('does not report errors in the UI when the save succeeds', async () => {
+ mountComponent({ mountFunction: mount, initialData: { note: '/label ~sdfghj' } });
+
+ jest.spyOn(wrapper.vm, 'saveNote').mockResolvedValue();
+
+ await clickCommentButton();
+
+ // findErrorAlerts().exists returns false if *any* wrapper is empty,
+ // not necessarily that there aren't any at all.
+ // We want to check here that there are none found, so we use the
+ // raw wrapper array length instead.
+ expect(findErrorAlerts().length).toBe(0);
+ });
+
+ it.each`
+ httpStatus | errors
+ ${400} | ${[COMMENT_FORM.GENERIC_UNSUBMITTABLE_NETWORK]}
+ ${422} | ${['error 1']}
+ ${422} | ${['error 1', 'error 2']}
+ ${422} | ${['error 1', 'error 2', 'error 3']}
+ `(
+ 'displays the correct errors ($errors) for a $httpStatus network response',
+ async ({ errors, httpStatus }) => {
+ store = createStore({
+ actions: {
+ saveNote: jest.fn().mockRejectedValue({
+ response: { status: httpStatus, data: { errors: { commands_only: errors } } },
+ }),
+ },
+ });
+
+ mountComponent({ mountFunction: mount, initialData: { note: '/label ~sdfghj' } });
+
+ await clickCommentButton();
+
+ const errorAlerts = findErrorAlerts();
+
+ expect(errorAlerts.length).toBe(errors.length);
+ errors.forEach((msg, index) => {
+ const alert = errorAlerts[index];
+
+ expect(alert.text()).toBe(msg);
+ });
+ },
+ );
+
+ it('should remove the correct error from the list when it is dismissed', async () => {
+ const commandErrors = ['1', '2', '3'];
+ store = createStore({
+ actions: {
+ saveNote: jest.fn().mockRejectedValue({
+ response: { status: 422, data: { errors: { commands_only: [...commandErrors] } } },
+ }),
+ },
+ });
+
+ mountComponent({ mountFunction: mount, initialData: { note: '/label ~sdfghj' } });
+
+ await clickCommentButton();
+
+ let errorAlerts = findErrorAlerts();
+
+ expect(errorAlerts.length).toBe(commandErrors.length);
+
+ // dismiss the second error
+ extendedWrapper(errorAlerts[1]).findByTestId('close-icon').trigger('click');
+ // Wait for the dismissal to bubble out of the Alert component and be handled in this component
+ await nextTick();
+ // Refresh the list of alerts
+ errorAlerts = findErrorAlerts();
+
+ expect(errorAlerts.length).toBe(commandErrors.length - 1);
+ // We want to know that the *correct* error was dismissed, not just that any one is gone
+ expect(errorAlerts[0].text()).toBe(commandErrors[0]);
+ expect(errorAlerts[1].text()).toBe(commandErrors[2]);
+ });
+
it('should toggle issue state when no note', () => {
mountComponent({ mountFunction: mount });
@@ -243,7 +353,7 @@ describe('issue_comment_form component', () => {
it('should render comment button as disabled', () => {
mountComponent();
- expect(findCommentButton().props('disabled')).toBe(true);
+ expect(findCommentGlDropdown().props('disabled')).toBe(true);
});
it('should enable comment button if it has note', async () => {
@@ -251,7 +361,7 @@ describe('issue_comment_form component', () => {
await wrapper.setData({ note: 'Foo' });
- expect(findCommentButton().props('disabled')).toBe(false);
+ expect(findCommentGlDropdown().props('disabled')).toBe(false);
});
it('should update buttons texts when it has note', () => {
@@ -437,7 +547,7 @@ describe('issue_comment_form component', () => {
await wrapper.vm.$nextTick();
// submit comment
- wrapper.findByTestId('comment-button').trigger('click');
+ findCommentButton().trigger('click');
const [providedData] = wrapper.vm.saveNote.mock.calls[0];
expect(providedData.data.note.confidential).toBe(shouldCheckboxBeChecked);
@@ -472,16 +582,4 @@ describe('issue_comment_form component', () => {
expect(findTextArea().exists()).toBe(false);
});
});
-
- describe('close/reopen button variants', () => {
- it.each([
- [constants.OPENED, 'warning'],
- [constants.REOPENED, 'warning'],
- [constants.CLOSED, 'default'],
- ])('when %s, the variant of the btn is %s', (state, expected) => {
- mountComponent({ noteableData: { ...noteableDataMock, state } });
-
- expect(findCloseReopenButton().props('variant')).toBe(expected);
- });
- });
});
diff --git a/spec/frontend/notes/components/diff_discussion_header_spec.js b/spec/frontend/notes/components/diff_discussion_header_spec.js
index fdc89522901..fa34a5e8d39 100644
--- a/spec/frontend/notes/components/diff_discussion_header_spec.js
+++ b/spec/frontend/notes/components/diff_discussion_header_spec.js
@@ -6,14 +6,10 @@ import createStore from '~/notes/stores';
import mockDiffFile from '../../diffs/mock_data/diff_discussions';
import { discussionMock } from '../mock_data';
-const discussionWithTwoUnresolvedNotes = 'merge_requests/resolved_diff_discussion.json';
-
describe('diff_discussion_header component', () => {
let store;
let wrapper;
- preloadFixtures(discussionWithTwoUnresolvedNotes);
-
beforeEach(() => {
window.mrTabs = {};
store = createStore();
diff --git a/spec/frontend/notes/components/discussion_actions_spec.js b/spec/frontend/notes/components/discussion_actions_spec.js
index 03e5842bb0f..c6a7d7ead98 100644
--- a/spec/frontend/notes/components/discussion_actions_spec.js
+++ b/spec/frontend/notes/components/discussion_actions_spec.js
@@ -96,7 +96,7 @@ describe('DiscussionActions', () => {
it('emits showReplyForm event when clicking on reply placeholder', () => {
jest.spyOn(wrapper.vm, '$emit');
- wrapper.find(ReplyPlaceholder).find('button').trigger('click');
+ wrapper.find(ReplyPlaceholder).find('textarea').trigger('focus');
expect(wrapper.vm.$emit).toHaveBeenCalledWith('showReplyForm');
});
diff --git a/spec/frontend/notes/components/discussion_reply_placeholder_spec.js b/spec/frontend/notes/components/discussion_reply_placeholder_spec.js
index b7b7ec08867..2a4cd0df0c7 100644
--- a/spec/frontend/notes/components/discussion_reply_placeholder_spec.js
+++ b/spec/frontend/notes/components/discussion_reply_placeholder_spec.js
@@ -1,17 +1,17 @@
import { shallowMount } from '@vue/test-utils';
import ReplyPlaceholder from '~/notes/components/discussion_reply_placeholder.vue';
-const buttonText = 'Test Button Text';
+const placeholderText = 'Test Button Text';
describe('ReplyPlaceholder', () => {
let wrapper;
- const findButton = () => wrapper.find({ ref: 'button' });
+ const findTextarea = () => wrapper.find({ ref: 'textarea' });
beforeEach(() => {
wrapper = shallowMount(ReplyPlaceholder, {
propsData: {
- buttonText,
+ placeholderText,
},
});
});
@@ -20,17 +20,17 @@ describe('ReplyPlaceholder', () => {
wrapper.destroy();
});
- it('emits onClick event on button click', () => {
- findButton().trigger('click');
+ it('emits focus event on button click', () => {
+ findTextarea().trigger('focus');
return wrapper.vm.$nextTick().then(() => {
expect(wrapper.emitted()).toEqual({
- onClick: [[]],
+ focus: [[]],
});
});
});
it('should render reply button', () => {
- expect(findButton().text()).toEqual(buttonText);
+ expect(findTextarea().attributes('placeholder')).toEqual(placeholderText);
});
});
diff --git a/spec/frontend/notes/components/note_actions_spec.js b/spec/frontend/notes/components/note_actions_spec.js
index 17717ebd09a..cc41088e21e 100644
--- a/spec/frontend/notes/components/note_actions_spec.js
+++ b/spec/frontend/notes/components/note_actions_spec.js
@@ -6,6 +6,7 @@ import axios from '~/lib/utils/axios_utils';
import { BV_HIDE_TOOLTIP } from '~/lib/utils/constants';
import noteActions from '~/notes/components/note_actions.vue';
import createStore from '~/notes/stores';
+import UserAccessRoleBadge from '~/vue_shared/components/user_access_role_badge.vue';
import { userDataMock } from '../mock_data';
describe('noteActions', () => {
@@ -15,6 +16,9 @@ describe('noteActions', () => {
let actions;
let axiosMock;
+ const findUserAccessRoleBadge = (idx) => wrapper.findAll(UserAccessRoleBadge).at(idx);
+ const findUserAccessRoleBadgeText = (idx) => findUserAccessRoleBadge(idx).text().trim();
+
const mountNoteActions = (propsData, computed) => {
const localVue = createLocalVue();
return mount(localVue.extend(noteActions), {
@@ -44,6 +48,7 @@ describe('noteActions', () => {
projectName: 'project',
reportAbusePath: `${TEST_HOST}/abuse_reports/new?ref_url=http%3A%2F%2Flocalhost%3A3000%2Fgitlab-org%2Fgitlab-ce%2Fissues%2F7%23note_539&user_id=26`,
showReply: false,
+ awardPath: `${TEST_HOST}/award_emoji`,
};
actions = {
@@ -66,11 +71,11 @@ describe('noteActions', () => {
});
it('should render noteable author badge', () => {
- expect(wrapper.findAll('.note-role').at(0).text().trim()).toEqual('Author');
+ expect(findUserAccessRoleBadgeText(0)).toBe('Author');
});
it('should render access level badge', () => {
- expect(wrapper.findAll('.note-role').at(1).text().trim()).toEqual(props.accessLevel);
+ expect(findUserAccessRoleBadgeText(1)).toBe(props.accessLevel);
});
it('should render contributor badge', () => {
@@ -80,7 +85,7 @@ describe('noteActions', () => {
});
return wrapper.vm.$nextTick().then(() => {
- expect(wrapper.findAll('.note-role').at(1).text().trim()).toBe('Contributor');
+ expect(findUserAccessRoleBadgeText(1)).toBe('Contributor');
});
});
diff --git a/spec/frontend/notes/components/note_form_spec.js b/spec/frontend/notes/components/note_form_spec.js
index 7615f3b70f1..92137d3190f 100644
--- a/spec/frontend/notes/components/note_form_spec.js
+++ b/spec/frontend/notes/components/note_form_spec.js
@@ -83,7 +83,7 @@ describe('issue_note_form component', () => {
});
const message =
- 'This comment has changed since you started editing, please review the updated comment to ensure information is not lost.';
+ 'This comment changed after you started editing it. Review the updated comment to ensure information is not lost.';
await nextTick();
diff --git a/spec/frontend/notes/components/noteable_discussion_spec.js b/spec/frontend/notes/components/noteable_discussion_spec.js
index 87538279c3d..dd65351ef88 100644
--- a/spec/frontend/notes/components/noteable_discussion_spec.js
+++ b/spec/frontend/notes/components/noteable_discussion_spec.js
@@ -24,8 +24,6 @@ describe('noteable_discussion component', () => {
let wrapper;
let originalGon;
- preloadFixtures(discussionWithTwoUnresolvedNotes);
-
beforeEach(() => {
window.mrTabs = {};
store = createStore();
@@ -65,7 +63,7 @@ describe('noteable_discussion component', () => {
expect(wrapper.vm.isReplying).toEqual(false);
const replyPlaceholder = wrapper.find(ReplyPlaceholder);
- replyPlaceholder.vm.$emit('onClick');
+ replyPlaceholder.vm.$emit('focus');
await nextTick();
expect(wrapper.vm.isReplying).toEqual(true);
diff --git a/spec/frontend/notes/components/noteable_note_spec.js b/spec/frontend/notes/components/noteable_note_spec.js
index fe78e086403..112983f3ac2 100644
--- a/spec/frontend/notes/components/noteable_note_spec.js
+++ b/spec/frontend/notes/components/noteable_note_spec.js
@@ -1,5 +1,6 @@
import { mount, createLocalVue } from '@vue/test-utils';
import { escape } from 'lodash';
+import waitForPromises from 'helpers/wait_for_promises';
import NoteActions from '~/notes/components/note_actions.vue';
import NoteBody from '~/notes/components/note_body.vue';
import NoteHeader from '~/notes/components/note_header.vue';
@@ -13,7 +14,7 @@ describe('issue_note', () => {
let wrapper;
const findMultilineComment = () => wrapper.find('[data-testid="multiline-comment"]');
- beforeEach(() => {
+ const createWrapper = (props = {}) => {
store = createStore();
store.dispatch('setNoteableData', noteableDataMock);
store.dispatch('setNotesData', notesDataMock);
@@ -23,6 +24,7 @@ describe('issue_note', () => {
store,
propsData: {
note,
+ ...props,
},
localVue,
stubs: [
@@ -33,14 +35,18 @@ describe('issue_note', () => {
'multiline-comment-form',
],
});
- });
+ };
afterEach(() => {
wrapper.destroy();
});
describe('mutiline comments', () => {
- it('should render if has multiline comment', () => {
+ beforeEach(() => {
+ createWrapper();
+ });
+
+ it('should render if has multiline comment', async () => {
const position = {
line_range: {
start: {
@@ -69,9 +75,8 @@ describe('issue_note', () => {
line,
});
- return wrapper.vm.$nextTick().then(() => {
- expect(findMultilineComment().text()).toEqual('Comment on lines 1 to 2');
- });
+ await wrapper.vm.$nextTick();
+ expect(findMultilineComment().text()).toBe('Comment on lines 1 to 2');
});
it('should only render if it has everything it needs', () => {
@@ -147,108 +152,151 @@ describe('issue_note', () => {
});
});
- it('should render user information', () => {
- const { author } = note;
- const avatar = wrapper.find(UserAvatarLink);
- const avatarProps = avatar.props();
+ describe('rendering', () => {
+ beforeEach(() => {
+ createWrapper();
+ });
- expect(avatarProps.linkHref).toBe(author.path);
- expect(avatarProps.imgSrc).toBe(author.avatar_url);
- expect(avatarProps.imgAlt).toBe(author.name);
- expect(avatarProps.imgSize).toBe(40);
- });
+ it('should render user information', () => {
+ const { author } = note;
+ const avatar = wrapper.findComponent(UserAvatarLink);
+ const avatarProps = avatar.props();
- it('should render note header content', () => {
- const noteHeader = wrapper.find(NoteHeader);
- const noteHeaderProps = noteHeader.props();
+ expect(avatarProps.linkHref).toBe(author.path);
+ expect(avatarProps.imgSrc).toBe(author.avatar_url);
+ expect(avatarProps.imgAlt).toBe(author.name);
+ expect(avatarProps.imgSize).toBe(40);
+ });
- expect(noteHeaderProps.author).toEqual(note.author);
- expect(noteHeaderProps.createdAt).toEqual(note.created_at);
- expect(noteHeaderProps.noteId).toEqual(note.id);
- });
+ it('should render note header content', () => {
+ const noteHeader = wrapper.findComponent(NoteHeader);
+ const noteHeaderProps = noteHeader.props();
- it('should render note actions', () => {
- const { author } = note;
- const noteActions = wrapper.find(NoteActions);
- const noteActionsProps = noteActions.props();
-
- expect(noteActionsProps.authorId).toBe(author.id);
- expect(noteActionsProps.noteId).toBe(note.id);
- expect(noteActionsProps.noteUrl).toBe(note.noteable_note_url);
- expect(noteActionsProps.accessLevel).toBe(note.human_access);
- expect(noteActionsProps.canEdit).toBe(note.current_user.can_edit);
- expect(noteActionsProps.canAwardEmoji).toBe(note.current_user.can_award_emoji);
- expect(noteActionsProps.canDelete).toBe(note.current_user.can_edit);
- expect(noteActionsProps.canReportAsAbuse).toBe(true);
- expect(noteActionsProps.canResolve).toBe(false);
- expect(noteActionsProps.reportAbusePath).toBe(note.report_abuse_path);
- expect(noteActionsProps.resolvable).toBe(false);
- expect(noteActionsProps.isResolved).toBe(false);
- expect(noteActionsProps.isResolving).toBe(false);
- expect(noteActionsProps.resolvedBy).toEqual({});
- });
+ expect(noteHeaderProps.author).toBe(note.author);
+ expect(noteHeaderProps.createdAt).toBe(note.created_at);
+ expect(noteHeaderProps.noteId).toBe(note.id);
+ });
- it('should render issue body', () => {
- const noteBody = wrapper.find(NoteBody);
- const noteBodyProps = noteBody.props();
+ it('should render note actions', () => {
+ const { author } = note;
+ const noteActions = wrapper.findComponent(NoteActions);
+ const noteActionsProps = noteActions.props();
- expect(noteBodyProps.note).toEqual(note);
- expect(noteBodyProps.line).toBe(null);
- expect(noteBodyProps.canEdit).toBe(note.current_user.can_edit);
- expect(noteBodyProps.isEditing).toBe(false);
- expect(noteBodyProps.helpPagePath).toBe('');
- });
+ expect(noteActionsProps.authorId).toBe(author.id);
+ expect(noteActionsProps.noteId).toBe(note.id);
+ expect(noteActionsProps.noteUrl).toBe(note.noteable_note_url);
+ expect(noteActionsProps.accessLevel).toBe(note.human_access);
+ expect(noteActionsProps.canEdit).toBe(note.current_user.can_edit);
+ expect(noteActionsProps.canAwardEmoji).toBe(note.current_user.can_award_emoji);
+ expect(noteActionsProps.canDelete).toBe(note.current_user.can_edit);
+ expect(noteActionsProps.canReportAsAbuse).toBe(true);
+ expect(noteActionsProps.canResolve).toBe(false);
+ expect(noteActionsProps.reportAbusePath).toBe(note.report_abuse_path);
+ expect(noteActionsProps.resolvable).toBe(false);
+ expect(noteActionsProps.isResolved).toBe(false);
+ expect(noteActionsProps.isResolving).toBe(false);
+ expect(noteActionsProps.resolvedBy).toEqual({});
+ });
- it('prevents note preview xss', (done) => {
- const imgSrc = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';
- const noteBody = `<img src="${imgSrc}" onload="alert(1)" />`;
- const alertSpy = jest.spyOn(window, 'alert');
- store.hotUpdate({
- actions: {
- updateNote() {},
- setSelectedCommentPositionHover() {},
- },
+ it('should render issue body', () => {
+ const noteBody = wrapper.findComponent(NoteBody);
+ const noteBodyProps = noteBody.props();
+
+ expect(noteBodyProps.note).toBe(note);
+ expect(noteBodyProps.line).toBe(null);
+ expect(noteBodyProps.canEdit).toBe(note.current_user.can_edit);
+ expect(noteBodyProps.isEditing).toBe(false);
+ expect(noteBodyProps.helpPagePath).toBe('');
});
- const noteBodyComponent = wrapper.find(NoteBody);
- noteBodyComponent.vm.$emit('handleFormUpdate', noteBody, null, () => {});
+ it('prevents note preview xss', async () => {
+ const noteBody =
+ '<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" onload="alert(1)" />';
+ const alertSpy = jest.spyOn(window, 'alert').mockImplementation(() => {});
+ const noteBodyComponent = wrapper.findComponent(NoteBody);
+
+ store.hotUpdate({
+ actions: {
+ updateNote() {},
+ setSelectedCommentPositionHover() {},
+ },
+ });
+
+ noteBodyComponent.vm.$emit('handleFormUpdate', noteBody, null, () => {});
- setImmediate(() => {
+ await waitForPromises();
expect(alertSpy).not.toHaveBeenCalled();
- expect(wrapper.vm.note.note_html).toEqual(escape(noteBody));
- done();
+ expect(wrapper.vm.note.note_html).toBe(escape(noteBody));
});
});
describe('cancel edit', () => {
- it('restores content of updated note', (done) => {
+ beforeEach(() => {
+ createWrapper();
+ });
+
+ it('restores content of updated note', async () => {
const updatedText = 'updated note text';
store.hotUpdate({
actions: {
updateNote() {},
},
});
- const noteBody = wrapper.find(NoteBody);
+ const noteBody = wrapper.findComponent(NoteBody);
noteBody.vm.resetAutoSave = () => {};
noteBody.vm.$emit('handleFormUpdate', updatedText, null, () => {});
- wrapper.vm
- .$nextTick()
- .then(() => {
- const noteBodyProps = noteBody.props();
-
- expect(noteBodyProps.note.note_html).toBe(updatedText);
- noteBody.vm.$emit('cancelForm');
- })
- .then(() => wrapper.vm.$nextTick())
- .then(() => {
- const noteBodyProps = noteBody.props();
-
- expect(noteBodyProps.note.note_html).toBe(note.note_html);
- })
- .then(done)
- .catch(done.fail);
+ await wrapper.vm.$nextTick();
+ let noteBodyProps = noteBody.props();
+
+ expect(noteBodyProps.note.note_html).toBe(updatedText);
+
+ noteBody.vm.$emit('cancelForm');
+ await wrapper.vm.$nextTick();
+
+ noteBodyProps = noteBody.props();
+
+ expect(noteBodyProps.note.note_html).toBe(note.note_html);
+ });
+ });
+
+ describe('formUpdateHandler', () => {
+ const updateNote = jest.fn();
+ const params = ['', null, jest.fn(), ''];
+
+ const updateActions = () => {
+ store.hotUpdate({
+ actions: {
+ updateNote,
+ setSelectedCommentPositionHover() {},
+ },
+ });
+ };
+
+ afterEach(() => updateNote.mockReset());
+
+ it('responds to handleFormUpdate', () => {
+ createWrapper();
+ updateActions();
+ wrapper.findComponent(NoteBody).vm.$emit('handleFormUpdate', ...params);
+ expect(wrapper.emitted('handleUpdateNote')).toBeTruthy();
+ });
+
+ it('does not stringify empty position', () => {
+ createWrapper();
+ updateActions();
+ wrapper.findComponent(NoteBody).vm.$emit('handleFormUpdate', ...params);
+ expect(updateNote.mock.calls[0][1].note.note.position).toBeUndefined();
+ });
+
+ it('stringifies populated position', () => {
+ const position = { test: true };
+ const expectation = JSON.stringify(position);
+ createWrapper({ note: { ...note, position } });
+ updateActions();
+ wrapper.findComponent(NoteBody).vm.$emit('handleFormUpdate', ...params);
+ expect(updateNote.mock.calls[0][1].note.note.position).toBe(expectation);
});
});
});
diff --git a/spec/frontend/notes/components/notes_app_spec.js b/spec/frontend/notes/components/notes_app_spec.js
index efee72dea96..163501d5ce8 100644
--- a/spec/frontend/notes/components/notes_app_spec.js
+++ b/spec/frontend/notes/components/notes_app_spec.js
@@ -33,6 +33,8 @@ describe('note_app', () => {
let wrapper;
let store;
+ const findCommentButton = () => wrapper.find('[data-testid="comment-button"]');
+
const getComponentOrder = () => {
return wrapper
.findAll('#notes-list,.js-comment-form')
@@ -144,7 +146,7 @@ describe('note_app', () => {
});
it('should render form comment button as disabled', () => {
- expect(wrapper.find('.js-note-new-discussion').attributes('disabled')).toEqual('disabled');
+ expect(findCommentButton().props('disabled')).toEqual(true);
});
it('updates discussions badge', () => {
diff --git a/spec/frontend/notes/stores/actions_spec.js b/spec/frontend/notes/stores/actions_spec.js
index 1852108b39f..f972ff0d2e4 100644
--- a/spec/frontend/notes/stores/actions_spec.js
+++ b/spec/frontend/notes/stores/actions_spec.js
@@ -3,6 +3,7 @@ import testAction from 'helpers/vuex_action_helper';
import { TEST_HOST } from 'spec/test_constants';
import Api from '~/api';
import { deprecatedCreateFlash as Flash } from '~/flash';
+import { EVENT_ISSUABLE_VUE_APP_CHANGE } from '~/issuable/constants';
import axios from '~/lib/utils/axios_utils';
import * as notesConstants from '~/notes/constants';
import createStore from '~/notes/stores';
@@ -10,7 +11,6 @@ import * as actions from '~/notes/stores/actions';
import * as mutationTypes from '~/notes/stores/mutation_types';
import mutations from '~/notes/stores/mutations';
import * as utils from '~/notes/stores/utils';
-import updateIssueConfidentialMutation from '~/sidebar/components/confidential/mutations/update_issue_confidential.mutation.graphql';
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 mrWidgetEventHub from '~/vue_merge_request_widget/event_hub';
@@ -203,7 +203,7 @@ describe('Actions Notes Store', () => {
describe('emitStateChangedEvent', () => {
it('emits an event on the document', () => {
- document.addEventListener('issuable_vue_app:change', (event) => {
+ document.addEventListener(EVENT_ISSUABLE_VUE_APP_CHANGE, (event) => {
expect(event.detail.data).toEqual({ id: '1', state: 'closed' });
expect(event.detail.isClosed).toEqual(false);
});
@@ -1276,68 +1276,6 @@ describe('Actions Notes Store', () => {
});
});
- describe('updateConfidentialityOnIssuable', () => {
- state = { noteableData: { confidential: false } };
- const iid = '1';
- const projectPath = 'full/path';
- const getters = { getNoteableData: { iid } };
- const actionArgs = { fullPath: projectPath, confidential: true };
- const confidential = true;
-
- beforeEach(() => {
- jest
- .spyOn(utils.gqClient, 'mutate')
- .mockResolvedValue({ data: { issueSetConfidential: { issue: { confidential } } } });
- });
-
- it('calls gqClient mutation one time', () => {
- actions.updateConfidentialityOnIssuable({ commit: () => {}, state, getters }, actionArgs);
-
- expect(utils.gqClient.mutate).toHaveBeenCalledTimes(1);
- });
-
- it('calls gqClient mutation with the correct values', () => {
- actions.updateConfidentialityOnIssuable({ commit: () => {}, state, getters }, actionArgs);
-
- expect(utils.gqClient.mutate).toHaveBeenCalledWith({
- mutation: updateIssueConfidentialMutation,
- variables: { input: { iid, projectPath, confidential } },
- });
- });
-
- describe('on success of mutation', () => {
- it('calls commit with the correct values', () => {
- const commitSpy = jest.fn();
-
- return actions
- .updateConfidentialityOnIssuable({ commit: commitSpy, state, getters }, actionArgs)
- .then(() => {
- expect(Flash).not.toHaveBeenCalled();
- expect(commitSpy).toHaveBeenCalledWith(
- mutationTypes.SET_ISSUE_CONFIDENTIAL,
- confidential,
- );
- });
- });
- });
-
- describe('on user recoverable error', () => {
- it('sends the error to Flash', () => {
- const error = 'error';
-
- jest
- .spyOn(utils.gqClient, 'mutate')
- .mockResolvedValue({ data: { issueSetConfidential: { errors: [error] } } });
-
- return actions
- .updateConfidentialityOnIssuable({ commit: () => {}, state, getters }, actionArgs)
- .then(() => {
- expect(Flash).toHaveBeenCalledWith(error, 'alert');
- });
- });
- });
- });
-
describe.each`
issuableType
${'issue'} | ${'merge_request'}
diff --git a/spec/frontend/notes/stores/getters_spec.js b/spec/frontend/notes/stores/getters_spec.js
index 4ebfc679310..4d2f86a1ecf 100644
--- a/spec/frontend/notes/stores/getters_spec.js
+++ b/spec/frontend/notes/stores/getters_spec.js
@@ -26,8 +26,6 @@ const createDiscussionNeighborParams = (discussionId, diffOrder, step) => ({
describe('Getters Notes Store', () => {
let state;
- preloadFixtures(discussionWithTwoUnresolvedNotes);
-
beforeEach(() => {
state = {
discussions: [individualNote],
diff --git a/spec/frontend/notifications/components/custom_notifications_modal_spec.js b/spec/frontend/notifications/components/custom_notifications_modal_spec.js
index 3e87f3107bd..5e4114d91f5 100644
--- a/spec/frontend/notifications/components/custom_notifications_modal_spec.js
+++ b/spec/frontend/notifications/components/custom_notifications_modal_spec.js
@@ -180,7 +180,7 @@ describe('CustomNotificationsModal', () => {
expect(
mockToastShow,
).toHaveBeenCalledWith(
- 'An error occured while loading the notification settings. Please try again.',
+ 'An error occurred while loading the notification settings. Please try again.',
{ type: 'error' },
);
});
@@ -258,7 +258,7 @@ describe('CustomNotificationsModal', () => {
expect(
mockToastShow,
).toHaveBeenCalledWith(
- 'An error occured while updating the notification settings. Please try again.',
+ 'An error occurred while updating the notification settings. Please try again.',
{ type: 'error' },
);
});
diff --git a/spec/frontend/notifications/components/notifications_dropdown_spec.js b/spec/frontend/notifications/components/notifications_dropdown_spec.js
index 0673fb51a91..e90bd68d067 100644
--- a/spec/frontend/notifications/components/notifications_dropdown_spec.js
+++ b/spec/frontend/notifications/components/notifications_dropdown_spec.js
@@ -1,4 +1,4 @@
-import { GlButtonGroup, GlButton, GlDropdown, GlDropdownItem } from '@gitlab/ui';
+import { GlDropdown, GlDropdownItem } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';
@@ -15,14 +15,10 @@ const mockToastShow = jest.fn();
describe('NotificationsDropdown', () => {
let wrapper;
let mockAxios;
- let glModalDirective;
function createComponent(injectedProperties = {}) {
- glModalDirective = jest.fn();
-
return shallowMount(NotificationsDropdown, {
stubs: {
- GlButtonGroup,
GlDropdown,
GlDropdownItem,
NotificationsDropdownItem,
@@ -30,11 +26,6 @@ describe('NotificationsDropdown', () => {
},
directives: {
GlTooltip: createMockDirective(),
- glModal: {
- bind(_, { value }) {
- glModalDirective(value);
- },
- },
},
provide: {
dropdownItems: mockDropdownItems,
@@ -49,13 +40,12 @@ describe('NotificationsDropdown', () => {
});
}
- const findButtonGroup = () => wrapper.find(GlButtonGroup);
- const findButton = () => wrapper.find(GlButton);
const findDropdown = () => wrapper.find(GlDropdown);
const findByTestId = (testId) => wrapper.find(`[data-testid="${testId}"]`);
const findAllNotificationsDropdownItems = () => wrapper.findAll(NotificationsDropdownItem);
const findDropdownItemAt = (index) =>
findAllNotificationsDropdownItems().at(index).find(GlDropdownItem);
+ const findNotificationsModal = () => wrapper.find(CustomNotificationsModal);
const clickDropdownItemAt = async (index) => {
const dropdownItem = findDropdownItemAt(index);
@@ -83,8 +73,8 @@ describe('NotificationsDropdown', () => {
});
});
- it('renders a button group', () => {
- expect(findButtonGroup().exists()).toBe(true);
+ it('renders split dropdown', () => {
+ expect(findDropdown().props().split).toBe(true);
});
it('shows the button text when showLabel is true', () => {
@@ -93,7 +83,7 @@ describe('NotificationsDropdown', () => {
showLabel: true,
});
- expect(findButton().text()).toBe('Custom');
+ expect(findDropdown().props().text).toBe('Custom');
});
it("doesn't show the button text when showLabel is false", () => {
@@ -102,7 +92,7 @@ describe('NotificationsDropdown', () => {
showLabel: false,
});
- expect(findButton().text()).toBe('');
+ expect(findDropdown().props().text).toBe(null);
});
it('opens the modal when the user clicks the button', async () => {
@@ -113,9 +103,9 @@ describe('NotificationsDropdown', () => {
initialNotificationLevel: 'custom',
});
- findButton().vm.$emit('click');
+ await findDropdown().vm.$emit('click');
- expect(glModalDirective).toHaveBeenCalled();
+ expect(findNotificationsModal().props().visible).toBe(true);
});
});
@@ -126,8 +116,8 @@ describe('NotificationsDropdown', () => {
});
});
- it('does not render a button group', () => {
- expect(findButtonGroup().exists()).toBe(false);
+ it('renders unified dropdown', () => {
+ expect(findDropdown().props().split).toBe(false);
});
it('shows the button text when showLabel is true', () => {
@@ -162,7 +152,7 @@ describe('NotificationsDropdown', () => {
initialNotificationLevel: level,
});
- const tooltipElement = findByTestId('notificationButton');
+ const tooltipElement = findByTestId('notification-dropdown');
const tooltip = getBinding(tooltipElement.element, 'gl-tooltip');
expect(tooltip.value.title).toBe(`${tooltipTitlePrefix} - ${title}`);
@@ -255,7 +245,7 @@ describe('NotificationsDropdown', () => {
expect(
mockToastShow,
).toHaveBeenCalledWith(
- 'An error occured while updating the notification settings. Please try again.',
+ 'An error occurred while updating the notification settings. Please try again.',
{ type: 'error' },
);
});
@@ -264,11 +254,9 @@ describe('NotificationsDropdown', () => {
mockAxios.onPut('/api/v4/notification_settings').reply(httpStatus.OK, {});
wrapper = createComponent();
- const mockModalShow = jest.spyOn(wrapper.vm.$refs.customNotificationsModal, 'open');
-
await clickDropdownItemAt(5);
- expect(mockModalShow).toHaveBeenCalled();
+ expect(findNotificationsModal().props().visible).toBe(true);
});
});
});
diff --git a/spec/frontend/oauth_remember_me_spec.js b/spec/frontend/oauth_remember_me_spec.js
index 910676a97ed..70bda1d9f9e 100644
--- a/spec/frontend/oauth_remember_me_spec.js
+++ b/spec/frontend/oauth_remember_me_spec.js
@@ -6,8 +6,6 @@ describe('OAuthRememberMe', () => {
return $(`#oauth-container .oauth-login${selector}`).parent('form').attr('action');
};
- preloadFixtures('static/oauth_remember_me.html');
-
beforeEach(() => {
loadFixtures('static/oauth_remember_me.html');
diff --git a/spec/frontend/packages/details/components/__snapshots__/conan_installation_spec.js.snap b/spec/frontend/packages/details/components/__snapshots__/conan_installation_spec.js.snap
index a1d08f032bc..a3423e3f4d7 100644
--- a/spec/frontend/packages/details/components/__snapshots__/conan_installation_spec.js.snap
+++ b/spec/frontend/packages/details/components/__snapshots__/conan_installation_spec.js.snap
@@ -2,11 +2,10 @@
exports[`ConanInstallation renders all the messages 1`] = `
<div>
- <h3
- class="gl-font-lg"
- >
- Installation
- </h3>
+ <installation-title-stub
+ options="[object Object]"
+ packagetype="conan"
+ />
<code-instruction-stub
copytext="Copy Conan Command"
diff --git a/spec/frontend/packages/details/components/__snapshots__/maven_installation_spec.js.snap b/spec/frontend/packages/details/components/__snapshots__/maven_installation_spec.js.snap
index 6d22b372d41..a6bb9e868ee 100644
--- a/spec/frontend/packages/details/components/__snapshots__/maven_installation_spec.js.snap
+++ b/spec/frontend/packages/details/components/__snapshots__/maven_installation_spec.js.snap
@@ -1,12 +1,38 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
-exports[`MavenInstallation renders all the messages 1`] = `
+exports[`MavenInstallation gradle renders all the messages 1`] = `
<div>
- <h3
- class="gl-font-lg"
- >
- Installation
- </h3>
+ <installation-title-stub
+ options="[object Object],[object Object]"
+ packagetype="maven"
+ />
+
+ <code-instruction-stub
+ class="gl-mb-5"
+ copytext="Copy Gradle Groovy DSL install command"
+ instruction="foo/gradle/install"
+ label="Gradle Groovy DSL install command"
+ trackingaction="copy_gradle_install_command"
+ trackinglabel="code_instruction"
+ />
+
+ <code-instruction-stub
+ copytext="Copy add Gradle Groovy DSL repository command"
+ instruction="foo/gradle/add/source"
+ label="Add Gradle Groovy DSL repository command"
+ multiline="true"
+ trackingaction="copy_gradle_add_to_source_command"
+ trackinglabel="code_instruction"
+ />
+</div>
+`;
+
+exports[`MavenInstallation maven renders all the messages 1`] = `
+<div>
+ <installation-title-stub
+ options="[object Object],[object Object]"
+ packagetype="maven"
+ />
<p>
<gl-sprintf-stub
@@ -17,7 +43,7 @@ exports[`MavenInstallation renders all the messages 1`] = `
<code-instruction-stub
copytext="Copy Maven XML"
instruction="foo/xml"
- label="Maven XML"
+ label=""
multiline="true"
trackingaction="copy_maven_xml"
trackinglabel="code_instruction"
diff --git a/spec/frontend/packages/details/components/__snapshots__/npm_installation_spec.js.snap b/spec/frontend/packages/details/components/__snapshots__/npm_installation_spec.js.snap
index b616751f75f..6903d342d6a 100644
--- a/spec/frontend/packages/details/components/__snapshots__/npm_installation_spec.js.snap
+++ b/spec/frontend/packages/details/components/__snapshots__/npm_installation_spec.js.snap
@@ -2,11 +2,10 @@
exports[`NpmInstallation renders all the messages 1`] = `
<div>
- <h3
- class="gl-font-lg"
- >
- Installation
- </h3>
+ <installation-title-stub
+ options="[object Object]"
+ packagetype="npm"
+ />
<code-instruction-stub
copytext="Copy npm command"
diff --git a/spec/frontend/packages/details/components/__snapshots__/nuget_installation_spec.js.snap b/spec/frontend/packages/details/components/__snapshots__/nuget_installation_spec.js.snap
index 84cf5e4db49..04532743952 100644
--- a/spec/frontend/packages/details/components/__snapshots__/nuget_installation_spec.js.snap
+++ b/spec/frontend/packages/details/components/__snapshots__/nuget_installation_spec.js.snap
@@ -2,11 +2,10 @@
exports[`NugetInstallation renders all the messages 1`] = `
<div>
- <h3
- class="gl-font-lg"
- >
- Installation
- </h3>
+ <installation-title-stub
+ options="[object Object]"
+ packagetype="nuget"
+ />
<code-instruction-stub
copytext="Copy NuGet Command"
diff --git a/spec/frontend/packages/details/components/__snapshots__/pypi_installation_spec.js.snap b/spec/frontend/packages/details/components/__snapshots__/pypi_installation_spec.js.snap
index 2a588f99c1d..d5bb825d8d1 100644
--- a/spec/frontend/packages/details/components/__snapshots__/pypi_installation_spec.js.snap
+++ b/spec/frontend/packages/details/components/__snapshots__/pypi_installation_spec.js.snap
@@ -2,11 +2,10 @@
exports[`PypiInstallation renders all the messages 1`] = `
<div>
- <h3
- class="gl-font-lg"
- >
- Installation
- </h3>
+ <installation-title-stub
+ options="[object Object]"
+ packagetype="pypi"
+ />
<code-instruction-stub
copytext="Copy Pip command"
diff --git a/spec/frontend/packages/details/components/composer_installation_spec.js b/spec/frontend/packages/details/components/composer_installation_spec.js
index a1d30d0ed22..18d11c7dd57 100644
--- a/spec/frontend/packages/details/components/composer_installation_spec.js
+++ b/spec/frontend/packages/details/components/composer_installation_spec.js
@@ -4,6 +4,7 @@ import Vuex from 'vuex';
import { registryUrl as composerHelpPath } from 'jest/packages/details/mock_data';
import { composerPackage as packageEntity } from 'jest/packages/mock_data';
import ComposerInstallation from '~/packages/details/components/composer_installation.vue';
+import InstallationTitle from '~/packages/details/components/installation_title.vue';
import { TrackingActions } from '~/packages/details/constants';
@@ -33,6 +34,7 @@ describe('ComposerInstallation', () => {
const findPackageInclude = () => wrapper.find('[data-testid="package-include"]');
const findHelpText = () => wrapper.find('[data-testid="help-text"]');
const findHelpLink = () => wrapper.find(GlLink);
+ const findInstallationTitle = () => wrapper.findComponent(InstallationTitle);
function createComponent() {
wrapper = shallowMount(ComposerInstallation, {
@@ -48,6 +50,19 @@ describe('ComposerInstallation', () => {
wrapper.destroy();
});
+ describe('install command switch', () => {
+ it('has the installation title component', () => {
+ createStore();
+ createComponent();
+
+ expect(findInstallationTitle().exists()).toBe(true);
+ expect(findInstallationTitle().props()).toMatchObject({
+ packageType: 'composer',
+ options: [{ value: 'composer', label: 'Show Composer commands' }],
+ });
+ });
+ });
+
describe('registry include command', () => {
beforeEach(() => {
createStore();
diff --git a/spec/frontend/packages/details/components/conan_installation_spec.js b/spec/frontend/packages/details/components/conan_installation_spec.js
index bf8a92a6350..78a7d265a21 100644
--- a/spec/frontend/packages/details/components/conan_installation_spec.js
+++ b/spec/frontend/packages/details/components/conan_installation_spec.js
@@ -1,6 +1,7 @@
import { shallowMount, createLocalVue } from '@vue/test-utils';
import Vuex from 'vuex';
import ConanInstallation from '~/packages/details/components/conan_installation.vue';
+import InstallationTitle from '~/packages/details/components/installation_title.vue';
import CodeInstructions from '~/vue_shared/components/registry/code_instruction.vue';
import { conanPackage as packageEntity } from '../../mock_data';
import { registryUrl as conanPath } from '../mock_data';
@@ -26,6 +27,7 @@ describe('ConanInstallation', () => {
});
const findCodeInstructions = () => wrapper.findAll(CodeInstructions);
+ const findInstallationTitle = () => wrapper.findComponent(InstallationTitle);
function createComponent() {
wrapper = shallowMount(ConanInstallation, {
@@ -39,13 +41,23 @@ describe('ConanInstallation', () => {
});
afterEach(() => {
- if (wrapper) wrapper.destroy();
+ wrapper.destroy();
});
it('renders all the messages', () => {
expect(wrapper.element).toMatchSnapshot();
});
+ describe('install command switch', () => {
+ it('has the installation title component', () => {
+ expect(findInstallationTitle().exists()).toBe(true);
+ expect(findInstallationTitle().props()).toMatchObject({
+ packageType: 'conan',
+ options: [{ value: 'conan', label: 'Show Conan commands' }],
+ });
+ });
+ });
+
describe('installation commands', () => {
it('renders the correct command', () => {
expect(findCodeInstructions().at(0).props('instruction')).toBe(conanInstallationCommandStr);
diff --git a/spec/frontend/packages/details/components/installation_title_spec.js b/spec/frontend/packages/details/components/installation_title_spec.js
new file mode 100644
index 00000000000..14e990d3011
--- /dev/null
+++ b/spec/frontend/packages/details/components/installation_title_spec.js
@@ -0,0 +1,58 @@
+import { shallowMount } from '@vue/test-utils';
+
+import InstallationTitle from '~/packages/details/components/installation_title.vue';
+import PersistedDropdownSelection from '~/vue_shared/components/registry/persisted_dropdown_selection.vue';
+
+describe('InstallationTitle', () => {
+ let wrapper;
+
+ const defaultProps = { packageType: 'foo', options: [{ value: 'foo', label: 'bar' }] };
+
+ const findPersistedDropdownSelection = () => wrapper.findComponent(PersistedDropdownSelection);
+ const findTitle = () => wrapper.find('h3');
+
+ function createComponent({ props = {} } = {}) {
+ wrapper = shallowMount(InstallationTitle, {
+ propsData: {
+ ...defaultProps,
+ ...props,
+ },
+ });
+ }
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('has a title', () => {
+ createComponent();
+
+ expect(findTitle().exists()).toBe(true);
+ expect(findTitle().text()).toBe('Installation');
+ });
+
+ describe('persisted dropdown selection', () => {
+ it('exists', () => {
+ createComponent();
+
+ expect(findPersistedDropdownSelection().exists()).toBe(true);
+ });
+
+ it('has the correct props', () => {
+ createComponent();
+
+ expect(findPersistedDropdownSelection().props()).toMatchObject({
+ storageKey: 'package_foo_installation_instructions',
+ options: defaultProps.options,
+ });
+ });
+
+ it('on change event emits a change event', () => {
+ createComponent();
+
+ findPersistedDropdownSelection().vm.$emit('change', 'baz');
+
+ expect(wrapper.emitted('change')).toEqual([['baz']]);
+ });
+ });
+});
diff --git a/spec/frontend/packages/details/components/maven_installation_spec.js b/spec/frontend/packages/details/components/maven_installation_spec.js
index dfeb6002186..d49a7c0b561 100644
--- a/spec/frontend/packages/details/components/maven_installation_spec.js
+++ b/spec/frontend/packages/details/components/maven_installation_spec.js
@@ -1,7 +1,9 @@
import { shallowMount, createLocalVue } from '@vue/test-utils';
+import { nextTick } from 'vue';
import Vuex from 'vuex';
import { registryUrl as mavenPath } from 'jest/packages/details/mock_data';
import { mavenPackage as packageEntity } from 'jest/packages/mock_data';
+import InstallationTitle from '~/packages/details/components/installation_title.vue';
import MavenInstallation from '~/packages/details/components/maven_installation.vue';
import { TrackingActions } from '~/packages/details/constants';
import CodeInstructions from '~/vue_shared/components/registry/code_instruction.vue';
@@ -15,6 +17,8 @@ describe('MavenInstallation', () => {
const xmlCodeBlock = 'foo/xml';
const mavenCommandStr = 'foo/command';
const mavenSetupXml = 'foo/setup';
+ const gradleGroovyInstallCommandText = 'foo/gradle/install';
+ const gradleGroovyAddSourceCommandText = 'foo/gradle/add/source';
const store = new Vuex.Store({
state: {
@@ -25,54 +29,120 @@ describe('MavenInstallation', () => {
mavenInstallationXml: () => xmlCodeBlock,
mavenInstallationCommand: () => mavenCommandStr,
mavenSetupXml: () => mavenSetupXml,
+ gradleGroovyInstalCommand: () => gradleGroovyInstallCommandText,
+ gradleGroovyAddSourceCommand: () => gradleGroovyAddSourceCommandText,
},
});
const findCodeInstructions = () => wrapper.findAll(CodeInstructions);
+ const findInstallationTitle = () => wrapper.findComponent(InstallationTitle);
- function createComponent() {
+ function createComponent({ data = {} } = {}) {
wrapper = shallowMount(MavenInstallation, {
localVue,
store,
+ data() {
+ return data;
+ },
});
}
- beforeEach(() => {
- createComponent();
- });
-
afterEach(() => {
- if (wrapper) wrapper.destroy();
+ wrapper.destroy();
});
- it('renders all the messages', () => {
- expect(wrapper.element).toMatchSnapshot();
+ describe('install command switch', () => {
+ it('has the installation title component', () => {
+ createComponent();
+
+ expect(findInstallationTitle().exists()).toBe(true);
+ expect(findInstallationTitle().props()).toMatchObject({
+ packageType: 'maven',
+ options: [
+ { value: 'maven', label: 'Show Maven commands' },
+ { value: 'groovy', label: 'Show Gradle Groovy DSL commands' },
+ ],
+ });
+ });
+
+ it('on change event updates the instructions to show', async () => {
+ createComponent();
+
+ expect(findCodeInstructions().at(0).props('instruction')).toBe(xmlCodeBlock);
+ findInstallationTitle().vm.$emit('change', 'groovy');
+
+ await nextTick();
+
+ expect(findCodeInstructions().at(0).props('instruction')).toBe(
+ gradleGroovyInstallCommandText,
+ );
+ });
});
- describe('installation commands', () => {
- it('renders the correct xml block', () => {
- expect(findCodeInstructions().at(0).props()).toMatchObject({
- instruction: xmlCodeBlock,
- multiline: true,
- trackingAction: TrackingActions.COPY_MAVEN_XML,
+ describe('maven', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('renders all the messages', () => {
+ expect(wrapper.element).toMatchSnapshot();
+ });
+
+ describe('installation commands', () => {
+ it('renders the correct xml block', () => {
+ expect(findCodeInstructions().at(0).props()).toMatchObject({
+ instruction: xmlCodeBlock,
+ multiline: true,
+ trackingAction: TrackingActions.COPY_MAVEN_XML,
+ });
+ });
+
+ it('renders the correct maven command', () => {
+ expect(findCodeInstructions().at(1).props()).toMatchObject({
+ instruction: mavenCommandStr,
+ multiline: false,
+ trackingAction: TrackingActions.COPY_MAVEN_COMMAND,
+ });
});
});
- it('renders the correct maven command', () => {
- expect(findCodeInstructions().at(1).props()).toMatchObject({
- instruction: mavenCommandStr,
- multiline: false,
- trackingAction: TrackingActions.COPY_MAVEN_COMMAND,
+ describe('setup commands', () => {
+ it('renders the correct xml block', () => {
+ expect(findCodeInstructions().at(2).props()).toMatchObject({
+ instruction: mavenSetupXml,
+ multiline: true,
+ trackingAction: TrackingActions.COPY_MAVEN_SETUP,
+ });
});
});
});
- describe('setup commands', () => {
- it('renders the correct xml block', () => {
- expect(findCodeInstructions().at(2).props()).toMatchObject({
- instruction: mavenSetupXml,
- multiline: true,
- trackingAction: TrackingActions.COPY_MAVEN_SETUP,
+ describe('gradle', () => {
+ beforeEach(() => {
+ createComponent({ data: { instructionType: 'gradle' } });
+ });
+
+ it('renders all the messages', () => {
+ expect(wrapper.element).toMatchSnapshot();
+ });
+
+ describe('installation commands', () => {
+ it('renders the gradle install command', () => {
+ expect(findCodeInstructions().at(0).props()).toMatchObject({
+ instruction: gradleGroovyInstallCommandText,
+ multiline: false,
+ trackingAction: TrackingActions.COPY_GRADLE_INSTALL_COMMAND,
+ });
+ });
+ });
+
+ describe('setup commands', () => {
+ it('renders the correct gradle command', () => {
+ expect(findCodeInstructions().at(1).props()).toMatchObject({
+ instruction: gradleGroovyAddSourceCommandText,
+ multiline: true,
+ trackingAction: TrackingActions.COPY_GRADLE_ADD_TO_SOURCE_COMMAND,
+ });
});
});
});
diff --git a/spec/frontend/packages/details/components/npm_installation_spec.js b/spec/frontend/packages/details/components/npm_installation_spec.js
index df820e7e948..09afcd4fd0a 100644
--- a/spec/frontend/packages/details/components/npm_installation_spec.js
+++ b/spec/frontend/packages/details/components/npm_installation_spec.js
@@ -2,6 +2,7 @@ import { shallowMount, createLocalVue } from '@vue/test-utils';
import Vuex from 'vuex';
import { registryUrl as nugetPath } from 'jest/packages/details/mock_data';
import { npmPackage as packageEntity } from 'jest/packages/mock_data';
+import InstallationTitle from '~/packages/details/components/installation_title.vue';
import NpmInstallation from '~/packages/details/components/npm_installation.vue';
import { TrackingActions } from '~/packages/details/constants';
import { npmInstallationCommand, npmSetupCommand } from '~/packages/details/store/getters';
@@ -14,6 +15,7 @@ describe('NpmInstallation', () => {
let wrapper;
const findCodeInstructions = () => wrapper.findAll(CodeInstructions);
+ const findInstallationTitle = () => wrapper.findComponent(InstallationTitle);
function createComponent() {
const store = new Vuex.Store({
@@ -38,13 +40,23 @@ describe('NpmInstallation', () => {
});
afterEach(() => {
- if (wrapper) wrapper.destroy();
+ wrapper.destroy();
});
it('renders all the messages', () => {
expect(wrapper.element).toMatchSnapshot();
});
+ describe('install command switch', () => {
+ it('has the installation title component', () => {
+ expect(findInstallationTitle().exists()).toBe(true);
+ expect(findInstallationTitle().props()).toMatchObject({
+ packageType: 'npm',
+ options: [{ value: 'npm', label: 'Show NPM commands' }],
+ });
+ });
+ });
+
describe('installation commands', () => {
it('renders the correct npm command', () => {
expect(findCodeInstructions().at(0).props()).toMatchObject({
diff --git a/spec/frontend/packages/details/components/nuget_installation_spec.js b/spec/frontend/packages/details/components/nuget_installation_spec.js
index 100e369751c..8839a8f1108 100644
--- a/spec/frontend/packages/details/components/nuget_installation_spec.js
+++ b/spec/frontend/packages/details/components/nuget_installation_spec.js
@@ -2,6 +2,7 @@ import { shallowMount, createLocalVue } from '@vue/test-utils';
import Vuex from 'vuex';
import { registryUrl as nugetPath } from 'jest/packages/details/mock_data';
import { nugetPackage as packageEntity } from 'jest/packages/mock_data';
+import InstallationTitle from '~/packages/details/components/installation_title.vue';
import NugetInstallation from '~/packages/details/components/nuget_installation.vue';
import { TrackingActions } from '~/packages/details/constants';
import CodeInstructions from '~/vue_shared/components/registry/code_instruction.vue';
@@ -27,6 +28,7 @@ describe('NugetInstallation', () => {
});
const findCodeInstructions = () => wrapper.findAll(CodeInstructions);
+ const findInstallationTitle = () => wrapper.findComponent(InstallationTitle);
function createComponent() {
wrapper = shallowMount(NugetInstallation, {
@@ -40,13 +42,23 @@ describe('NugetInstallation', () => {
});
afterEach(() => {
- if (wrapper) wrapper.destroy();
+ wrapper.destroy();
});
it('renders all the messages', () => {
expect(wrapper.element).toMatchSnapshot();
});
+ describe('install command switch', () => {
+ it('has the installation title component', () => {
+ expect(findInstallationTitle().exists()).toBe(true);
+ expect(findInstallationTitle().props()).toMatchObject({
+ packageType: 'nuget',
+ options: [{ value: 'nuget', label: 'Show Nuget commands' }],
+ });
+ });
+ });
+
describe('installation commands', () => {
it('renders the correct command', () => {
expect(findCodeInstructions().at(0).props()).toMatchObject({
diff --git a/spec/frontend/packages/details/components/pypi_installation_spec.js b/spec/frontend/packages/details/components/pypi_installation_spec.js
index a6ccba71554..2cec84282d9 100644
--- a/spec/frontend/packages/details/components/pypi_installation_spec.js
+++ b/spec/frontend/packages/details/components/pypi_installation_spec.js
@@ -1,6 +1,7 @@
import { shallowMount, createLocalVue } from '@vue/test-utils';
import Vuex from 'vuex';
import { pypiPackage as packageEntity } from 'jest/packages/mock_data';
+import InstallationTitle from '~/packages/details/components/installation_title.vue';
import PypiInstallation from '~/packages/details/components/pypi_installation.vue';
const localVue = createLocalVue();
@@ -26,6 +27,8 @@ describe('PypiInstallation', () => {
const pipCommand = () => wrapper.find('[data-testid="pip-command"]');
const setupInstruction = () => wrapper.find('[data-testid="pypi-setup-content"]');
+ const findInstallationTitle = () => wrapper.findComponent(InstallationTitle);
+
function createComponent() {
wrapper = shallowMount(PypiInstallation, {
localVue,
@@ -39,7 +42,16 @@ describe('PypiInstallation', () => {
afterEach(() => {
wrapper.destroy();
- wrapper = null;
+ });
+
+ describe('install command switch', () => {
+ it('has the installation title component', () => {
+ expect(findInstallationTitle().exists()).toBe(true);
+ expect(findInstallationTitle().props()).toMatchObject({
+ packageType: 'pypi',
+ options: [{ value: 'pypi', label: 'Show PyPi commands' }],
+ });
+ });
});
it('renders all the messages', () => {
diff --git a/spec/frontend/packages/details/store/getters_spec.js b/spec/frontend/packages/details/store/getters_spec.js
index 07c120f57f7..fa7123c813d 100644
--- a/spec/frontend/packages/details/store/getters_spec.js
+++ b/spec/frontend/packages/details/store/getters_spec.js
@@ -17,6 +17,8 @@ import {
composerRegistryInclude,
composerPackageInclude,
groupExists,
+ gradleGroovyInstalCommand,
+ gradleGroovyAddSourceCommand,
} from '~/packages/details/store/getters';
import {
conanPackage,
@@ -99,7 +101,7 @@ describe('Getters PackageDetails Store', () => {
packageEntity | expectedResult
${conanPackage} | ${'Conan'}
${packageWithoutBuildInfo} | ${'Maven'}
- ${npmPackage} | ${'NPM'}
+ ${npmPackage} | ${'npm'}
${nugetPackage} | ${'NuGet'}
${pypiPackage} | ${'PyPI'}
`(`package type`, ({ packageEntity, expectedResult }) => {
@@ -168,13 +170,13 @@ describe('Getters PackageDetails Store', () => {
});
describe('npm string getters', () => {
- it('gets the correct npmInstallationCommand for NPM', () => {
+ it('gets the correct npmInstallationCommand for npm', () => {
setupState({ packageEntity: npmPackage });
expect(npmInstallationCommand(state)(NpmManager.NPM)).toBe(npmInstallStr);
});
- it('gets the correct npmSetupCommand for NPM', () => {
+ it('gets the correct npmSetupCommand for npm', () => {
setupState({ packageEntity: npmPackage });
expect(npmSetupCommand(state)(NpmManager.NPM)).toBe(npmSetupStr);
@@ -235,6 +237,26 @@ describe('Getters PackageDetails Store', () => {
});
});
+ describe('gradle groovy string getters', () => {
+ it('gets the correct gradleGroovyInstalCommand', () => {
+ setupState();
+
+ expect(gradleGroovyInstalCommand(state)).toMatchInlineSnapshot(
+ `"implementation 'com.test.app:test-app:1.0-SNAPSHOT'"`,
+ );
+ });
+
+ it('gets the correct gradleGroovyAddSourceCommand', () => {
+ setupState();
+
+ expect(gradleGroovyAddSourceCommand(state)).toMatchInlineSnapshot(`
+ "gitlab {
+ url \\"foo/registry\\"
+ }"
+ `);
+ });
+ });
+
describe('check if group', () => {
it('is set', () => {
setupState({ groupListUrl: '/groups/composer/-/packages' });
diff --git a/spec/frontend/packages/shared/components/__snapshots__/package_list_row_spec.js.snap b/spec/frontend/packages/shared/components/__snapshots__/package_list_row_spec.js.snap
index 4a75deebcf9..77095f7c611 100644
--- a/spec/frontend/packages/shared/components/__snapshots__/package_list_row_spec.js.snap
+++ b/spec/frontend/packages/shared/components/__snapshots__/package_list_row_spec.js.snap
@@ -6,7 +6,7 @@ exports[`packages_list_row renders 1`] = `
data-qa-selector="package_row"
>
<div
- class="gl-display-flex gl-align-items-center gl-py-3"
+ class="gl-display-flex gl-align-items-center gl-py-3 gl-px-5"
>
<!---->
@@ -102,7 +102,7 @@ exports[`packages_list_row renders 1`] = `
<gl-button-stub
aria-label="Remove package"
buttontextclasses=""
- category="primary"
+ category="secondary"
data-testid="action-delete"
icon="remove"
size="medium"
diff --git a/spec/frontend/packages/shared/components/package_list_row_spec.js b/spec/frontend/packages/shared/components/package_list_row_spec.js
index bd122167273..1c0ef7e3539 100644
--- a/spec/frontend/packages/shared/components/package_list_row_spec.js
+++ b/spec/frontend/packages/shared/components/package_list_row_spec.js
@@ -60,11 +60,9 @@ describe('packages_list_row', () => {
});
describe('when is is group', () => {
- beforeEach(() => {
+ it('has a package path component', () => {
mountComponent({ isGroup: true });
- });
- it('has a package path component', () => {
expect(findPackagePath().exists()).toBe(true);
expect(findPackagePath().props()).toMatchObject({ path: 'foo/bar/baz' });
});
@@ -92,10 +90,22 @@ describe('packages_list_row', () => {
});
});
- describe('delete event', () => {
- beforeEach(() => mountComponent({ packageEntity: packageWithoutTags }));
+ describe('delete button', () => {
+ it('exists and has the correct props', () => {
+ mountComponent({ packageEntity: packageWithoutTags });
+
+ expect(findDeleteButton().exists()).toBe(true);
+ expect(findDeleteButton().attributes()).toMatchObject({
+ icon: 'remove',
+ category: 'secondary',
+ variant: 'danger',
+ title: 'Remove package',
+ });
+ });
it('emits the packageToDelete event when the delete button is clicked', async () => {
+ mountComponent({ packageEntity: packageWithoutTags });
+
findDeleteButton().vm.$emit('click');
await wrapper.vm.$nextTick();
diff --git a/spec/frontend/packages/shared/utils_spec.js b/spec/frontend/packages/shared/utils_spec.js
index 506f37f8895..4a95def1bef 100644
--- a/spec/frontend/packages/shared/utils_spec.js
+++ b/spec/frontend/packages/shared/utils_spec.js
@@ -35,7 +35,7 @@ describe('Packages shared utils', () => {
packageType | expectedResult
${'conan'} | ${'Conan'}
${'maven'} | ${'Maven'}
- ${'npm'} | ${'NPM'}
+ ${'npm'} | ${'npm'}
${'nuget'} | ${'NuGet'}
${'pypi'} | ${'PyPI'}
${'composer'} | ${'Composer'}
diff --git a/spec/frontend/pages/admin/abuse_reports/abuse_reports_spec.js b/spec/frontend/pages/admin/abuse_reports/abuse_reports_spec.js
index 2c76adf761f..71c9da238b4 100644
--- a/spec/frontend/pages/admin/abuse_reports/abuse_reports_spec.js
+++ b/spec/frontend/pages/admin/abuse_reports/abuse_reports_spec.js
@@ -14,8 +14,6 @@ describe('Abuse Reports', () => {
const findMessage = (searchText) =>
$messages.filter((index, element) => element.innerText.indexOf(searchText) > -1).first();
- preloadFixtures(FIXTURE);
-
beforeEach(() => {
loadFixtures(FIXTURE);
new AbuseReports(); // eslint-disable-line no-new
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 8816609d1d2..9f326dc33c0 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
@@ -8,7 +8,6 @@ describe('AccountAndLimits', () => {
const FIXTURE = 'application_settings/accounts_and_limit.html';
let $userDefaultExternal;
let $userInternalRegex;
- preloadFixtures(FIXTURE);
beforeEach(() => {
loadFixtures(FIXTURE);
diff --git a/spec/frontend/pages/admin/users/new/index_spec.js b/spec/frontend/pages/admin/users/new/index_spec.js
index 60482860e84..ec9fe487030 100644
--- a/spec/frontend/pages/admin/users/new/index_spec.js
+++ b/spec/frontend/pages/admin/users/new/index_spec.js
@@ -7,8 +7,6 @@ describe('UserInternalRegexHandler', () => {
let $userEmail;
let $warningMessage;
- preloadFixtures(FIXTURE);
-
beforeEach(() => {
loadFixtures(FIXTURE);
// eslint-disable-next-line no-new
diff --git a/spec/frontend/pages/dashboard/todos/index/todos_spec.js b/spec/frontend/pages/dashboard/todos/index/todos_spec.js
index fb612f17669..de8b29d54fc 100644
--- a/spec/frontend/pages/dashboard/todos/index/todos_spec.js
+++ b/spec/frontend/pages/dashboard/todos/index/todos_spec.js
@@ -14,7 +14,6 @@ const TEST_COUNT_BIG = 2000;
const TEST_DONE_COUNT_BIG = 7300;
describe('Todos', () => {
- preloadFixtures('todos/todos.html');
let todoItem;
let mock;
diff --git a/spec/frontend/pages/projects/forks/new/components/app_spec.js b/spec/frontend/pages/projects/forks/new/components/app_spec.js
new file mode 100644
index 00000000000..e1820606704
--- /dev/null
+++ b/spec/frontend/pages/projects/forks/new/components/app_spec.js
@@ -0,0 +1,42 @@
+import { shallowMount } from '@vue/test-utils';
+import App from '~/pages/projects/forks/new/components/app.vue';
+
+describe('App component', () => {
+ let wrapper;
+
+ const DEFAULT_PROPS = {
+ forkIllustration: 'illustrations/project-create-new-sm.svg',
+ endpoint: '/some/project-full-path/-/forks/new.json',
+ projectFullPath: '/some/project-full-path',
+ projectId: '10',
+ projectName: 'Project Name',
+ projectPath: 'project-name',
+ projectDescription: 'some project description',
+ projectVisibility: 'private',
+ };
+
+ const createComponent = (props = {}) => {
+ wrapper = shallowMount(App, {
+ propsData: {
+ ...DEFAULT_PROPS,
+ ...props,
+ },
+ });
+ };
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('displays the correct svg illustration', () => {
+ expect(wrapper.find('img').attributes('src')).toBe('illustrations/project-create-new-sm.svg');
+ });
+
+ it('renders ForkForm component with prop', () => {
+ expect(wrapper.props()).toEqual(expect.objectContaining(DEFAULT_PROPS));
+ });
+});
diff --git a/spec/frontend/pages/projects/forks/new/components/fork_form_spec.js b/spec/frontend/pages/projects/forks/new/components/fork_form_spec.js
new file mode 100644
index 00000000000..694a0c2b9c1
--- /dev/null
+++ b/spec/frontend/pages/projects/forks/new/components/fork_form_spec.js
@@ -0,0 +1,275 @@
+import { GlForm, GlFormInputGroup } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import axios from 'axios';
+import AxiosMockAdapter from 'axios-mock-adapter';
+import createFlash from '~/flash';
+import httpStatus from '~/lib/utils/http_status';
+import * as urlUtility from '~/lib/utils/url_utility';
+import ForkForm from '~/pages/projects/forks/new/components/fork_form.vue';
+
+jest.mock('~/flash');
+jest.mock('~/lib/utils/csrf', () => ({ token: 'mock-csrf-token' }));
+
+describe('ForkForm component', () => {
+ let wrapper;
+ let axiosMock;
+
+ const GON_GITLAB_URL = 'https://gitlab.com';
+ const GON_API_VERSION = 'v7';
+
+ const MOCK_NAMESPACES_RESPONSE = [
+ {
+ name: 'one',
+ id: 1,
+ },
+ {
+ name: 'two',
+ id: 2,
+ },
+ ];
+
+ const DEFAULT_PROPS = {
+ endpoint: '/some/project-full-path/-/forks/new.json',
+ projectFullPath: '/some/project-full-path',
+ projectId: '10',
+ projectName: 'Project Name',
+ projectPath: 'project-name',
+ projectDescription: 'some project description',
+ projectVisibility: 'private',
+ };
+
+ const mockGetRequest = (data = {}, statusCode = httpStatus.OK) => {
+ axiosMock.onGet(DEFAULT_PROPS.endpoint).replyOnce(statusCode, data);
+ };
+
+ const createComponent = (props = {}, data = {}) => {
+ wrapper = shallowMount(ForkForm, {
+ provide: {
+ newGroupPath: 'some/groups/path',
+ visibilityHelpPath: 'some/visibility/help/path',
+ },
+ propsData: {
+ ...DEFAULT_PROPS,
+ ...props,
+ },
+ data() {
+ return {
+ ...data,
+ };
+ },
+ stubs: {
+ GlFormInputGroup,
+ },
+ });
+ };
+
+ beforeEach(() => {
+ axiosMock = new AxiosMockAdapter(axios);
+ window.gon = {
+ gitlab_url: GON_GITLAB_URL,
+ api_version: GON_API_VERSION,
+ };
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ axiosMock.restore();
+ });
+
+ const findPrivateRadio = () => wrapper.find('[data-testid="radio-private"]');
+ const findInternalRadio = () => wrapper.find('[data-testid="radio-internal"]');
+ const findPublicRadio = () => wrapper.find('[data-testid="radio-public"]');
+ const findForkNameInput = () => wrapper.find('[data-testid="fork-name-input"]');
+ const findForkUrlInput = () => wrapper.find('[data-testid="fork-url-input"]');
+ const findForkSlugInput = () => wrapper.find('[data-testid="fork-slug-input"]');
+ const findForkDescriptionTextarea = () =>
+ wrapper.find('[data-testid="fork-description-textarea"]');
+ const findVisibilityRadioGroup = () =>
+ wrapper.find('[data-testid="fork-visibility-radio-group"]');
+
+ it('will go to projectFullPath when click cancel button', () => {
+ mockGetRequest();
+ createComponent();
+
+ const { projectFullPath } = DEFAULT_PROPS;
+ const cancelButton = wrapper.find('[data-testid="cancel-button"]');
+
+ expect(cancelButton.attributes('href')).toBe(projectFullPath);
+ });
+
+ it('make POST request with project param', async () => {
+ jest.spyOn(axios, 'post');
+
+ const namespaceId = 20;
+
+ mockGetRequest();
+ createComponent(
+ {},
+ {
+ selectedNamespace: {
+ id: namespaceId,
+ },
+ },
+ );
+
+ wrapper.find(GlForm).vm.$emit('submit', { preventDefault: () => {} });
+
+ const {
+ projectId,
+ projectDescription,
+ projectName,
+ projectPath,
+ projectVisibility,
+ } = DEFAULT_PROPS;
+
+ const url = `/api/${GON_API_VERSION}/projects/${projectId}/fork`;
+ const project = {
+ description: projectDescription,
+ id: projectId,
+ name: projectName,
+ namespace_id: namespaceId,
+ path: projectPath,
+ visibility: projectVisibility,
+ };
+
+ expect(axios.post).toHaveBeenCalledWith(url, project);
+ });
+
+ it('has input with csrf token', () => {
+ mockGetRequest();
+ createComponent();
+
+ expect(wrapper.find('input[name="authenticity_token"]').attributes('value')).toBe(
+ 'mock-csrf-token',
+ );
+ });
+
+ it('pre-populate form from project props', () => {
+ mockGetRequest();
+ createComponent();
+
+ expect(findForkNameInput().attributes('value')).toBe(DEFAULT_PROPS.projectName);
+ expect(findForkSlugInput().attributes('value')).toBe(DEFAULT_PROPS.projectPath);
+ expect(findForkDescriptionTextarea().attributes('value')).toBe(
+ DEFAULT_PROPS.projectDescription,
+ );
+ });
+
+ it('sets project URL prepend text with gon.gitlab_url', () => {
+ mockGetRequest();
+ createComponent();
+
+ expect(wrapper.find(GlFormInputGroup).text()).toContain(`${GON_GITLAB_URL}/`);
+ });
+
+ it('will have required attribute for required fields', () => {
+ mockGetRequest();
+ createComponent();
+
+ expect(findForkNameInput().attributes('required')).not.toBeUndefined();
+ expect(findForkUrlInput().attributes('required')).not.toBeUndefined();
+ expect(findForkSlugInput().attributes('required')).not.toBeUndefined();
+ expect(findVisibilityRadioGroup().attributes('required')).not.toBeUndefined();
+ expect(findForkDescriptionTextarea().attributes('required')).toBeUndefined();
+ });
+
+ describe('forks namespaces', () => {
+ beforeEach(() => {
+ mockGetRequest({ namespaces: MOCK_NAMESPACES_RESPONSE });
+ createComponent();
+ });
+
+ it('make GET request from endpoint', async () => {
+ await axios.waitForAll();
+
+ expect(axiosMock.history.get[0].url).toBe(DEFAULT_PROPS.endpoint);
+ });
+
+ it('generate default option', async () => {
+ await axios.waitForAll();
+
+ const optionsArray = findForkUrlInput().findAll('option');
+
+ expect(optionsArray.at(0).text()).toBe('Select a namespace');
+ });
+
+ it('populate project url namespace options', async () => {
+ await axios.waitForAll();
+
+ const optionsArray = findForkUrlInput().findAll('option');
+
+ expect(optionsArray).toHaveLength(MOCK_NAMESPACES_RESPONSE.length + 1);
+ expect(optionsArray.at(1).text()).toBe(MOCK_NAMESPACES_RESPONSE[0].name);
+ expect(optionsArray.at(2).text()).toBe(MOCK_NAMESPACES_RESPONSE[1].name);
+ });
+ });
+
+ describe('visibility level', () => {
+ it.each`
+ project | namespace | privateIsDisabled | internalIsDisabled | publicIsDisabled
+ ${'private'} | ${'private'} | ${undefined} | ${'true'} | ${'true'}
+ ${'private'} | ${'internal'} | ${undefined} | ${'true'} | ${'true'}
+ ${'private'} | ${'public'} | ${undefined} | ${'true'} | ${'true'}
+ ${'internal'} | ${'private'} | ${undefined} | ${'true'} | ${'true'}
+ ${'internal'} | ${'internal'} | ${undefined} | ${undefined} | ${'true'}
+ ${'internal'} | ${'public'} | ${undefined} | ${undefined} | ${'true'}
+ ${'public'} | ${'private'} | ${undefined} | ${'true'} | ${'true'}
+ ${'public'} | ${'internal'} | ${undefined} | ${undefined} | ${'true'}
+ ${'public'} | ${'public'} | ${undefined} | ${undefined} | ${undefined}
+ `(
+ 'sets appropriate radio button disabled state',
+ async ({ project, namespace, privateIsDisabled, internalIsDisabled, publicIsDisabled }) => {
+ mockGetRequest();
+ createComponent(
+ {
+ projectVisibility: project,
+ },
+ {
+ selectedNamespace: {
+ visibility: namespace,
+ },
+ },
+ );
+
+ expect(findPrivateRadio().attributes('disabled')).toBe(privateIsDisabled);
+ expect(findInternalRadio().attributes('disabled')).toBe(internalIsDisabled);
+ expect(findPublicRadio().attributes('disabled')).toBe(publicIsDisabled);
+ },
+ );
+ });
+
+ describe('onSubmit', () => {
+ beforeEach(() => {
+ jest.spyOn(urlUtility, 'redirectTo').mockImplementation();
+ });
+
+ it('redirect to POST web_url response', async () => {
+ const webUrl = `new/fork-project`;
+
+ jest.spyOn(axios, 'post').mockResolvedValue({ data: { web_url: webUrl } });
+
+ mockGetRequest();
+ createComponent();
+
+ await wrapper.vm.onSubmit();
+
+ expect(urlUtility.redirectTo).toHaveBeenCalledWith(webUrl);
+ });
+
+ it('display flash when POST is unsuccessful', async () => {
+ const dummyError = 'Fork project failed';
+
+ jest.spyOn(axios, 'post').mockRejectedValue(dummyError);
+
+ mockGetRequest();
+ createComponent();
+
+ await wrapper.vm.onSubmit();
+
+ expect(urlUtility.redirectTo).not.toHaveBeenCalled();
+ expect(createFlash).toHaveBeenCalledWith({
+ message: dummyError,
+ });
+ });
+ });
+});
diff --git a/spec/frontend/pages/projects/learn_gitlab/components/__snapshots__/learn_gitlab_a_spec.js.snap b/spec/frontend/pages/projects/learn_gitlab/components/__snapshots__/learn_gitlab_a_spec.js.snap
index c9141d13a46..1c1327e7a4e 100644
--- a/spec/frontend/pages/projects/learn_gitlab/components/__snapshots__/learn_gitlab_a_spec.js.snap
+++ b/spec/frontend/pages/projects/learn_gitlab/components/__snapshots__/learn_gitlab_a_spec.js.snap
@@ -4,7 +4,7 @@ exports[`Learn GitLab Design A should render the loading state 1`] = `
<ul>
<li>
<span>
- Create a repository
+ Create or import a repository
</span>
</li>
<li>
@@ -14,7 +14,11 @@ exports[`Learn GitLab Design A should render the loading state 1`] = `
</li>
<li>
<span>
- Set-up CI/CD
+ <gl-link-stub
+ href="http://example.com/"
+ >
+ Set up CI/CD
+ </gl-link-stub>
</span>
</li>
<li>
@@ -22,7 +26,7 @@ exports[`Learn GitLab Design A should render the loading state 1`] = `
<gl-link-stub
href="http://example.com/"
>
- Start a free trial of GitLab Gold
+ Start a free Ultimate trial
</gl-link-stub>
</span>
</li>
@@ -40,7 +44,7 @@ exports[`Learn GitLab Design A should render the loading state 1`] = `
<gl-link-stub
href="http://example.com/"
>
- Enable require merge approvals
+ Add merge request approval
</gl-link-stub>
</span>
</li>
@@ -49,7 +53,7 @@ exports[`Learn GitLab Design A should render the loading state 1`] = `
<gl-link-stub
href="http://example.com/"
>
- Submit a merge request (MR)
+ Submit a merge request
</gl-link-stub>
</span>
</li>
@@ -58,7 +62,7 @@ exports[`Learn GitLab Design A should render the loading state 1`] = `
<gl-link-stub
href="http://example.com/"
>
- Run a Security scan using CI/CD
+ Run a security scan
</gl-link-stub>
</span>
</li>
diff --git a/spec/frontend/pages/projects/learn_gitlab/components/__snapshots__/learn_gitlab_b_spec.js.snap b/spec/frontend/pages/projects/learn_gitlab/components/__snapshots__/learn_gitlab_b_spec.js.snap
index 85e3b675e5b..dd899b93302 100644
--- a/spec/frontend/pages/projects/learn_gitlab/components/__snapshots__/learn_gitlab_b_spec.js.snap
+++ b/spec/frontend/pages/projects/learn_gitlab/components/__snapshots__/learn_gitlab_b_spec.js.snap
@@ -1,66 +1,519 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
-exports[`Learn GitLab Design B should render the loading state 1`] = `
-<ul>
- <li>
- <span>
- Create a repository
- </span>
- </li>
- <li>
- <span>
- Invite your colleagues
- </span>
- </li>
- <li>
- <span>
- Set-up CI/CD
- </span>
- </li>
- <li>
- <span>
- <gl-link-stub
- href="http://example.com/"
+exports[`Learn GitLab Design B renders correctly 1`] = `
+<div>
+ <div
+ class="row"
+ >
+ <div
+ class="gl-mb-7 col-md-8 col-lg-7"
+ >
+ <h1
+ class="gl-font-size-h1"
>
- Start a free trial of GitLab Gold
- </gl-link-stub>
- </span>
- </li>
- <li>
- <span>
- <gl-link-stub
- href="http://example.com/"
+ Learn GitLab
+ </h1>
+
+ <p
+ class="gl-text-gray-700 gl-mb-0"
>
- Add code owners
- </gl-link-stub>
- </span>
- </li>
- <li>
- <span>
- <gl-link-stub
- href="http://example.com/"
+ Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project.
+ </p>
+ </div>
+ </div>
+
+ <div
+ class="gl-mb-3"
+ >
+ <p
+ class="gl-text-gray-500 gl-mb-2"
+ data-testid="completion-percentage"
+ >
+ 25% completed
+ </p>
+
+ <div
+ class="progress"
+ max="8"
+ value="2"
+ >
+ <div
+ aria-valuemax="8"
+ aria-valuemin="0"
+ aria-valuenow="2"
+ class="progress-bar"
+ role="progressbar"
+ style="width: 25%;"
>
- Enable require merge approvals
- </gl-link-stub>
- </span>
- </li>
- <li>
- <span>
- <gl-link-stub
- href="http://example.com/"
+ <!---->
+ </div>
+ </div>
+ </div>
+
+ <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
+ class="row row-cols-2 row-cols-md-3 row-cols-lg-4"
+ >
+ <div
+ class="col gl-mb-6"
+ >
+ <div
+ class="gl-card gl-pt-0"
>
- Submit a merge request (MR)
- </gl-link-stub>
- </span>
- </li>
- <li>
- <span>
- <gl-link-stub
- href="http://example.com/"
+ <!---->
+
+ <div
+ class="gl-card-body"
+ >
+ <div
+ class="gl-text-right gl-h-5"
+ >
+ <svg
+ aria-hidden="true"
+ class="gl-text-green-500 gl-icon s16"
+ data-testid="completed-icon"
+ >
+ <use
+ href="#check-circle-filled"
+ />
+ </svg>
+ </div>
+
+ <div
+ class="gl-text-center gl-display-flex gl-justify-content-center gl-align-items-center gl-flex-direction-column learn-gitlab-info-card-content"
+ >
+ <img
+ src="http://example.com/images/illustration.svg"
+ />
+
+ <h6>
+ Invite your colleagues
+ </h6>
+
+ <p
+ class="gl-font-sm gl-text-gray-700"
+ >
+ GitLab works best as a team. Invite your colleague to enjoy all features.
+ </p>
+
+ <a
+ class="gl-link"
+ href="http://example.com/"
+ rel="noopener noreferrer"
+ target="_blank"
+ >
+ Invite your colleagues
+ </a>
+ </div>
+ </div>
+
+ <!---->
+ </div>
+ </div>
+
+ <div
+ class="col gl-mb-6"
+ >
+ <div
+ class="gl-card gl-pt-0"
>
- Run a Security scan using CI/CD
- </gl-link-stub>
- </span>
- </li>
-</ul>
+ <!---->
+
+ <div
+ class="gl-card-body"
+ >
+ <div
+ class="gl-text-right gl-h-5"
+ >
+ <svg
+ aria-hidden="true"
+ class="gl-text-green-500 gl-icon s16"
+ data-testid="completed-icon"
+ >
+ <use
+ href="#check-circle-filled"
+ />
+ </svg>
+ </div>
+
+ <div
+ class="gl-text-center gl-display-flex gl-justify-content-center gl-align-items-center gl-flex-direction-column learn-gitlab-info-card-content"
+ >
+ <img
+ src="http://example.com/images/illustration.svg"
+ />
+
+ <h6>
+ Create or import a repository
+ </h6>
+
+ <p
+ class="gl-font-sm gl-text-gray-700"
+ >
+ Create or import your first repository into your new project.
+ </p>
+
+ <a
+ class="gl-link"
+ href="http://example.com/"
+ rel="noopener noreferrer"
+ target="_blank"
+ >
+ Create or import a repository
+ </a>
+ </div>
+ </div>
+
+ <!---->
+ </div>
+ </div>
+
+ <div
+ class="col gl-mb-6"
+ >
+ <div
+ class="gl-card gl-pt-0"
+ >
+ <!---->
+
+ <div
+ class="gl-card-body"
+ >
+ <div
+ class="gl-text-right gl-h-5"
+ >
+ <!---->
+ </div>
+
+ <div
+ class="gl-text-center gl-display-flex gl-justify-content-center gl-align-items-center gl-flex-direction-column learn-gitlab-info-card-content"
+ >
+ <img
+ src="http://example.com/images/illustration.svg"
+ />
+
+ <h6>
+ Set up CI/CD
+ </h6>
+
+ <p
+ class="gl-font-sm gl-text-gray-700"
+ >
+ Save time by automating your integration and deployment tasks.
+ </p>
+
+ <a
+ class="gl-link"
+ href="http://example.com/"
+ rel="noopener noreferrer"
+ target="_blank"
+ >
+ Set-up CI/CD
+ </a>
+ </div>
+ </div>
+
+ <!---->
+ </div>
+ </div>
+
+ <div
+ class="col gl-mb-6"
+ >
+ <div
+ class="gl-card gl-pt-0"
+ >
+ <!---->
+
+ <div
+ class="gl-card-body"
+ >
+ <div
+ class="gl-text-right gl-h-5"
+ >
+ <!---->
+ </div>
+
+ <div
+ class="gl-text-center gl-display-flex gl-justify-content-center gl-align-items-center gl-flex-direction-column learn-gitlab-info-card-content"
+ >
+ <img
+ src="http://example.com/images/illustration.svg"
+ />
+
+ <h6>
+ Start a free Ultimate trial
+ </h6>
+
+ <p
+ class="gl-font-sm gl-text-gray-700"
+ >
+ Try all GitLab features for 30 days, no credit card required.
+ </p>
+
+ <a
+ class="gl-link"
+ href="http://example.com/"
+ rel="noopener noreferrer"
+ target="_blank"
+ >
+ Try GitLab Ultimate for free
+ </a>
+ </div>
+ </div>
+
+ <!---->
+ </div>
+ </div>
+
+ <div
+ class="col gl-mb-6"
+ >
+ <div
+ class="gl-card gl-pt-0"
+ >
+ <!---->
+
+ <div
+ class="gl-card-body"
+ >
+ <div
+ class="gl-text-right gl-h-5"
+ >
+ <span
+ class="gl-text-gray-500 gl-font-sm gl-font-style-italic"
+ data-testid="trial-only"
+ >
+ Trial only
+ </span>
+ </div>
+
+ <div
+ class="gl-text-center gl-display-flex gl-justify-content-center gl-align-items-center gl-flex-direction-column learn-gitlab-info-card-content"
+ >
+ <img
+ src="http://example.com/images/illustration.svg"
+ />
+
+ <h6>
+ Add code owners
+ </h6>
+
+ <p
+ class="gl-font-sm gl-text-gray-700"
+ >
+ Prevent unexpected changes to important assets by assigning ownership of files and paths.
+ </p>
+
+ <a
+ class="gl-link"
+ href="http://example.com/"
+ rel="noopener noreferrer"
+ target="_blank"
+ >
+ Add code owners
+ </a>
+ </div>
+ </div>
+
+ <!---->
+ </div>
+ </div>
+
+ <div
+ class="col gl-mb-6"
+ >
+ <div
+ class="gl-card gl-pt-0"
+ >
+ <!---->
+
+ <div
+ class="gl-card-body"
+ >
+ <div
+ class="gl-text-right gl-h-5"
+ >
+ <span
+ class="gl-text-gray-500 gl-font-sm gl-font-style-italic"
+ data-testid="trial-only"
+ >
+ Trial only
+ </span>
+ </div>
+
+ <div
+ class="gl-text-center gl-display-flex gl-justify-content-center gl-align-items-center gl-flex-direction-column learn-gitlab-info-card-content"
+ >
+ <img
+ src="http://example.com/images/illustration.svg"
+ />
+
+ <h6>
+ Add merge request approval
+ </h6>
+
+ <p
+ class="gl-font-sm gl-text-gray-700"
+ >
+ Route code reviews to the right reviewers, every time.
+ </p>
+
+ <a
+ class="gl-link"
+ href="http://example.com/"
+ rel="noopener noreferrer"
+ target="_blank"
+ >
+ Enable require merge approvals
+ </a>
+ </div>
+ </div>
+
+ <!---->
+ </div>
+ </div>
+ </div>
+
+ <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
+ class="row row-cols-2 row-cols-md-3 row-cols-lg-4"
+ >
+ <div
+ class="col gl-mb-6"
+ >
+ <div
+ class="gl-card gl-pt-0"
+ >
+ <!---->
+
+ <div
+ class="gl-card-body"
+ >
+ <div
+ class="gl-text-right gl-h-5"
+ >
+ <!---->
+ </div>
+
+ <div
+ class="gl-text-center gl-display-flex gl-justify-content-center gl-align-items-center gl-flex-direction-column learn-gitlab-info-card-content"
+ >
+ <img
+ src="http://example.com/images/illustration.svg"
+ />
+
+ <h6>
+ Submit a merge request
+ </h6>
+
+ <p
+ class="gl-font-sm gl-text-gray-700"
+ >
+ Review and edit proposed changes to source code.
+ </p>
+
+ <a
+ class="gl-link"
+ href="http://example.com/"
+ rel="noopener noreferrer"
+ target="_blank"
+ >
+ Submit a merge request (MR)
+ </a>
+ </div>
+ </div>
+
+ <!---->
+ </div>
+ </div>
+ </div>
+
+ <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
+ class="row row-cols-2 row-cols-lg-4 g-2 g-lg-3"
+ >
+ <div
+ class="col gl-mb-6"
+ >
+ <div
+ class="gl-card gl-pt-0"
+ >
+ <!---->
+
+ <div
+ class="gl-card-body"
+ >
+ <div
+ class="gl-text-right gl-h-5"
+ >
+ <!---->
+ </div>
+
+ <div
+ class="gl-text-center gl-display-flex gl-justify-content-center gl-align-items-center gl-flex-direction-column learn-gitlab-info-card-content"
+ >
+ <img
+ src="http://example.com/images/illustration.svg"
+ />
+
+ <h6>
+ Run a security scan
+ </h6>
+
+ <p
+ class="gl-font-sm gl-text-gray-700"
+ >
+ Scan your code to uncover vulnerabilities before deploying.
+ </p>
+
+ <a
+ class="gl-link"
+ href="http://example.com/"
+ rel="noopener noreferrer"
+ target="_blank"
+ >
+ Run a Security scan
+ </a>
+ </div>
+ </div>
+
+ <!---->
+ </div>
+ </div>
+ </div>
+</div>
`;
diff --git a/spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_a_spec.js b/spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_a_spec.js
index ddc5339e7e0..2154358de51 100644
--- a/spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_a_spec.js
+++ b/spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_a_spec.js
@@ -1,41 +1,6 @@
import { shallowMount } from '@vue/test-utils';
-import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import LearnGitlabA from '~/pages/projects/learn_gitlab/components/learn_gitlab_a.vue';
-
-const TEST_ACTIONS = {
- gitWrite: {
- url: 'http://example.com/',
- completed: true,
- },
- userAdded: {
- url: 'http://example.com/',
- completed: true,
- },
- pipelineCreated: {
- url: 'http://example.com/',
- completed: true,
- },
- trialStarted: {
- url: 'http://example.com/',
- completed: false,
- },
- codeOwnersEnabled: {
- url: 'http://example.com/',
- completed: false,
- },
- requiredMrApprovalsEnabled: {
- url: 'http://example.com/',
- completed: false,
- },
- mergeRequestCreated: {
- url: 'http://example.com/',
- completed: false,
- },
- securityScanEnabled: {
- url: 'http://example.com/',
- completed: false,
- },
-};
+import { testActions } from './mock_data';
describe('Learn GitLab Design A', () => {
let wrapper;
@@ -46,13 +11,7 @@ describe('Learn GitLab Design A', () => {
});
const createWrapper = () => {
- wrapper = extendedWrapper(
- shallowMount(LearnGitlabA, {
- propsData: {
- actions: TEST_ACTIONS,
- },
- }),
- );
+ wrapper = shallowMount(LearnGitlabA, { propsData: { actions: testActions } });
};
it('should render the loading state', () => {
diff --git a/spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_b_spec.js b/spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_b_spec.js
index be4f5768402..fbb989fae32 100644
--- a/spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_b_spec.js
+++ b/spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_b_spec.js
@@ -1,63 +1,38 @@
-import { shallowMount } from '@vue/test-utils';
-import { extendedWrapper } from 'helpers/vue_test_utils_helper';
-import LearnGitlabA from '~/pages/projects/learn_gitlab/components/learn_gitlab_a.vue';
-
-const TEST_ACTIONS = {
- gitWrite: {
- url: 'http://example.com/',
- completed: true,
- },
- userAdded: {
- url: 'http://example.com/',
- completed: true,
- },
- pipelineCreated: {
- url: 'http://example.com/',
- completed: true,
- },
- trialStarted: {
- url: 'http://example.com/',
- completed: false,
- },
- codeOwnersEnabled: {
- url: 'http://example.com/',
- completed: false,
- },
- requiredMrApprovalsEnabled: {
- url: 'http://example.com/',
- completed: false,
- },
- mergeRequestCreated: {
- url: 'http://example.com/',
- completed: false,
- },
- securityScanEnabled: {
- url: 'http://example.com/',
- completed: false,
- },
-};
+import { GlProgressBar } from '@gitlab/ui';
+import { mount } from '@vue/test-utils';
+import LearnGitlabB from '~/pages/projects/learn_gitlab/components/learn_gitlab_b.vue';
+import { testActions } from './mock_data';
describe('Learn GitLab Design B', () => {
let wrapper;
+ const createWrapper = () => {
+ wrapper = mount(LearnGitlabB, { propsData: { actions: testActions } });
+ };
+
+ beforeEach(() => {
+ createWrapper();
+ });
+
afterEach(() => {
wrapper.destroy();
wrapper = null;
});
- const createWrapper = () => {
- wrapper = extendedWrapper(
- shallowMount(LearnGitlabA, {
- propsData: {
- actions: TEST_ACTIONS,
- },
- }),
- );
- };
+ it('renders correctly', () => {
+ expect(wrapper.element).toMatchSnapshot();
+ });
- it('should render the loading state', () => {
- createWrapper();
+ it('renders the progress percentage', () => {
+ const text = wrapper.find('[data-testid="completion-percentage"]').text();
- expect(wrapper.element).toMatchSnapshot();
+ expect(text).toEqual('25% completed');
+ });
+
+ it('renders the progress bar with correct values', () => {
+ const progressBar = wrapper.find(GlProgressBar);
+
+ expect(progressBar.attributes('value')).toBe('2');
+ expect(progressBar.attributes('max')).toBe('8');
});
});
diff --git a/spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_info_card_spec.js b/spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_info_card_spec.js
new file mode 100644
index 00000000000..ad4bc826a9d
--- /dev/null
+++ b/spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_info_card_spec.js
@@ -0,0 +1,57 @@
+import { shallowMount } from '@vue/test-utils';
+import LearnGitlabInfoCard from '~/pages/projects/learn_gitlab/components/learn_gitlab_info_card.vue';
+
+const defaultProps = {
+ title: 'Create Repository',
+ description: 'Some description',
+ actionLabel: 'Create Repository now',
+ url: 'https://example.com',
+ completed: false,
+ svg: 'https://example.com/illustration.svg',
+};
+
+describe('Learn GitLab Info Card', () => {
+ let wrapper;
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ });
+
+ const createWrapper = (props = {}) => {
+ wrapper = shallowMount(LearnGitlabInfoCard, {
+ propsData: { ...defaultProps, ...props },
+ });
+ };
+
+ it('renders no icon when not completed', () => {
+ createWrapper({ completed: false });
+
+ expect(wrapper.find('[data-testid="completed-icon"]').exists()).toBe(false);
+ });
+
+ it('renders the completion icon when completed', () => {
+ createWrapper({ completed: true });
+
+ expect(wrapper.find('[data-testid="completed-icon"]').exists()).toBe(true);
+ });
+
+ it('renders no trial only when it is not required', () => {
+ createWrapper();
+
+ expect(wrapper.find('[data-testid="trial-only"]').exists()).toBe(false);
+ });
+
+ it('renders trial only when trial is required', () => {
+ createWrapper({ trialRequired: true });
+
+ expect(wrapper.find('[data-testid="trial-only"]').exists()).toBe(true);
+ });
+
+ it('renders completion icon when completed a trial-only feature', () => {
+ createWrapper({ trialRequired: true, completed: true });
+
+ expect(wrapper.find('[data-testid="trial-only"]').exists()).toBe(false);
+ expect(wrapper.find('[data-testid="completed-icon"]').exists()).toBe(true);
+ });
+});
diff --git a/spec/frontend/pages/projects/learn_gitlab/components/mock_data.js b/spec/frontend/pages/projects/learn_gitlab/components/mock_data.js
new file mode 100644
index 00000000000..caac667e2b1
--- /dev/null
+++ b/spec/frontend/pages/projects/learn_gitlab/components/mock_data.js
@@ -0,0 +1,42 @@
+export const testActions = {
+ gitWrite: {
+ url: 'http://example.com/',
+ completed: true,
+ svg: 'http://example.com/images/illustration.svg',
+ },
+ userAdded: {
+ url: 'http://example.com/',
+ completed: true,
+ svg: 'http://example.com/images/illustration.svg',
+ },
+ pipelineCreated: {
+ url: 'http://example.com/',
+ completed: false,
+ svg: 'http://example.com/images/illustration.svg',
+ },
+ trialStarted: {
+ url: 'http://example.com/',
+ completed: false,
+ svg: 'http://example.com/images/illustration.svg',
+ },
+ codeOwnersEnabled: {
+ url: 'http://example.com/',
+ completed: false,
+ svg: 'http://example.com/images/illustration.svg',
+ },
+ requiredMrApprovalsEnabled: {
+ url: 'http://example.com/',
+ completed: false,
+ svg: 'http://example.com/images/illustration.svg',
+ },
+ mergeRequestCreated: {
+ url: 'http://example.com/',
+ completed: false,
+ svg: 'http://example.com/images/illustration.svg',
+ },
+ securityScanEnabled: {
+ url: 'http://example.com/',
+ completed: false,
+ svg: 'http://example.com/images/illustration.svg',
+ },
+};
diff --git a/spec/frontend/pages/projects/pipeline_schedules/shared/components/timezone_dropdown_spec.js b/spec/frontend/pages/projects/pipeline_schedules/shared/components/timezone_dropdown_spec.js
index de63409b181..2a3b07f95f2 100644
--- a/spec/frontend/pages/projects/pipeline_schedules/shared/components/timezone_dropdown_spec.js
+++ b/spec/frontend/pages/projects/pipeline_schedules/shared/components/timezone_dropdown_spec.js
@@ -6,8 +6,6 @@ import TimezoneDropdown, {
} from '~/pages/projects/pipeline_schedules/shared/components/timezone_dropdown';
describe('Timezone Dropdown', () => {
- preloadFixtures('pipeline_schedules/edit.html');
-
let $inputEl = null;
let $dropdownEl = null;
let $wrapper = null;
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 d7c754fd3cc..bee628c3a56 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
@@ -29,6 +29,7 @@ const defaultProps = {
showDefaultAwardEmojis: true,
allowEditingCommitMessages: false,
},
+ isGitlabCom: true,
canDisableEmails: true,
canChangeVisibilityLevel: true,
allowedVisibilityOptions: [0, 10, 20],
diff --git a/spec/frontend/pages/sessions/new/preserve_url_fragment_spec.js b/spec/frontend/pages/sessions/new/preserve_url_fragment_spec.js
index 8632c852720..e39a3904613 100644
--- a/spec/frontend/pages/sessions/new/preserve_url_fragment_spec.js
+++ b/spec/frontend/pages/sessions/new/preserve_url_fragment_spec.js
@@ -6,8 +6,6 @@ describe('preserve_url_fragment', () => {
return $(`.omniauth-container ${selector}`).parent('form').attr('action');
};
- preloadFixtures('sessions/new.html');
-
beforeEach(() => {
loadFixtures('sessions/new.html');
});
diff --git a/spec/frontend/pages/sessions/new/signin_tabs_memoizer_spec.js b/spec/frontend/pages/sessions/new/signin_tabs_memoizer_spec.js
index f04c16d2ddb..6aa725fbd7d 100644
--- a/spec/frontend/pages/sessions/new/signin_tabs_memoizer_spec.js
+++ b/spec/frontend/pages/sessions/new/signin_tabs_memoizer_spec.js
@@ -18,8 +18,6 @@ describe('SigninTabsMemoizer', () => {
return memo;
}
- preloadFixtures(fixtureTemplate);
-
beforeEach(() => {
loadFixtures(fixtureTemplate);
diff --git a/spec/frontend/pages/shared/wikis/wiki_alert_spec.js b/spec/frontend/pages/shared/wikis/wiki_alert_spec.js
new file mode 100644
index 00000000000..6a18473b1a7
--- /dev/null
+++ b/spec/frontend/pages/shared/wikis/wiki_alert_spec.js
@@ -0,0 +1,40 @@
+import { GlAlert, GlLink, GlSprintf } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import WikiAlert from '~/pages/shared/wikis/components/wiki_alert.vue';
+
+describe('WikiAlert', () => {
+ let wrapper;
+ const ERROR = 'There is already a page with the same title in that path.';
+ const ERROR_WITH_LINK = 'Before text %{wikiLinkStart}the page%{wikiLinkEnd} after text.';
+ const PATH = '/test';
+
+ function createWrapper(propsData = {}, stubs = {}) {
+ wrapper = shallowMount(WikiAlert, {
+ propsData: { wikiPagePath: PATH, ...propsData },
+ stubs,
+ });
+ }
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ });
+
+ const findGlAlert = () => wrapper.findComponent(GlAlert);
+ const findGlLink = () => wrapper.findComponent(GlLink);
+ const findGlSprintf = () => wrapper.findComponent(GlSprintf);
+
+ describe('Wiki Alert', () => {
+ it('shows an alert when there is an error', () => {
+ createWrapper({ error: ERROR });
+ expect(findGlAlert().exists()).toBe(true);
+ expect(findGlSprintf().exists()).toBe(true);
+ expect(findGlSprintf().attributes('message')).toBe(ERROR);
+ });
+
+ it('shows a the link to the help path', () => {
+ createWrapper({ error: ERROR_WITH_LINK }, { GlAlert, GlSprintf });
+ expect(findGlLink().attributes('href')).toBe(PATH);
+ });
+ });
+});
diff --git a/spec/frontend/performance_bar/components/performance_bar_app_spec.js b/spec/frontend/performance_bar/components/performance_bar_app_spec.js
index 417a655093c..67a4259a8e3 100644
--- a/spec/frontend/performance_bar/components/performance_bar_app_spec.js
+++ b/spec/frontend/performance_bar/components/performance_bar_app_spec.js
@@ -9,6 +9,7 @@ describe('performance bar app', () => {
store,
env: 'development',
requestId: '123',
+ statsUrl: 'https://log.gprd.gitlab.net/app/dashboards#/view/',
peekUrl: '/-/peek/results',
profileUrl: '?lineprofiler=true',
},
diff --git a/spec/frontend/performance_bar/index_spec.js b/spec/frontend/performance_bar/index_spec.js
index 8d9c32b7f12..819b2bcbacf 100644
--- a/spec/frontend/performance_bar/index_spec.js
+++ b/spec/frontend/performance_bar/index_spec.js
@@ -19,6 +19,7 @@ describe('performance bar wrapper', () => {
peekWrapper.setAttribute('data-env', 'development');
peekWrapper.setAttribute('data-request-id', '123');
peekWrapper.setAttribute('data-peek-url', '/-/peek/results');
+ peekWrapper.setAttribute('data-stats-url', 'https://log.gprd.gitlab.net/app/dashboards#/view/');
peekWrapper.setAttribute('data-profile-url', '?lineprofiler=true');
mock = new MockAdapter(axios);
diff --git a/spec/frontend/pipeline_editor/components/commit/commit_form_spec.js b/spec/frontend/pipeline_editor/components/commit/commit_form_spec.js
index 5dae77a4626..8040c9d701c 100644
--- a/spec/frontend/pipeline_editor/components/commit/commit_form_spec.js
+++ b/spec/frontend/pipeline_editor/components/commit/commit_form_spec.js
@@ -12,7 +12,7 @@ describe('Pipeline Editor | Commit Form', () => {
wrapper = mountFn(CommitForm, {
propsData: {
defaultMessage: mockCommitMessage,
- defaultBranch: mockDefaultBranch,
+ currentBranch: mockDefaultBranch,
...props,
},
@@ -41,7 +41,7 @@ describe('Pipeline Editor | Commit Form', () => {
expect(findCommitTextarea().attributes('value')).toBe(mockCommitMessage);
});
- it('shows a default branch', () => {
+ it('shows current branch', () => {
expect(findBranchInput().attributes('value')).toBe(mockDefaultBranch);
});
@@ -66,7 +66,7 @@ describe('Pipeline Editor | Commit Form', () => {
expect(wrapper.emitted('submit')[0]).toEqual([
{
message: mockCommitMessage,
- branch: mockDefaultBranch,
+ targetBranch: mockDefaultBranch,
openMergeRequest: false,
},
]);
@@ -101,7 +101,7 @@ describe('Pipeline Editor | Commit Form', () => {
expect(wrapper.emitted('submit')[0]).toEqual([
{
message: anotherMessage,
- branch: anotherBranch,
+ targetBranch: anotherBranch,
openMergeRequest: true,
},
]);
diff --git a/spec/frontend/pipeline_editor/components/commit/commit_section_spec.js b/spec/frontend/pipeline_editor/components/commit/commit_section_spec.js
index b87ff6ec0de..aa62144736c 100644
--- a/spec/frontend/pipeline_editor/components/commit/commit_section_spec.js
+++ b/spec/frontend/pipeline_editor/components/commit/commit_section_spec.js
@@ -35,7 +35,6 @@ const mockVariables = {
const mockProvide = {
ciConfigPath: mockCiConfigPath,
- defaultBranch: mockDefaultBranch,
projectFullPath: mockProjectFullPath,
newMergeRequestPath: mockNewMergeRequestPath,
};
@@ -64,6 +63,7 @@ describe('Pipeline Editor | Commit section', () => {
data() {
return {
commitSha: mockCommitSha,
+ currentBranch: mockDefaultBranch,
};
},
mocks: {
@@ -116,7 +116,7 @@ describe('Pipeline Editor | Commit section', () => {
await submitCommit();
});
- it('calls the mutation with the default branch', () => {
+ it('calls the mutation with the current branch', () => {
expect(mockMutate).toHaveBeenCalledTimes(1);
expect(mockMutate).toHaveBeenCalledWith({
mutation: commitCreate,
diff --git a/spec/frontend/pipeline_editor/components/header/pipeline_editor_header_spec.js b/spec/frontend/pipeline_editor/components/header/pipeline_editor_header_spec.js
index df15a6c8e7f..ef8ca574e59 100644
--- a/spec/frontend/pipeline_editor/components/header/pipeline_editor_header_spec.js
+++ b/spec/frontend/pipeline_editor/components/header/pipeline_editor_header_spec.js
@@ -1,21 +1,33 @@
import { shallowMount } from '@vue/test-utils';
import PipelineEditorHeader from '~/pipeline_editor/components/header/pipeline_editor_header.vue';
+import PipelineStatus from '~/pipeline_editor/components/header/pipeline_status.vue';
import ValidationSegment from '~/pipeline_editor/components/header/validation_segment.vue';
-import { mockLintResponse } from '../../mock_data';
+import { mockCiYml, mockLintResponse } from '../../mock_data';
describe('Pipeline editor header', () => {
let wrapper;
+ const mockProvide = {
+ glFeatures: {
+ pipelineStatusForPipelineEditor: true,
+ },
+ };
- const createComponent = () => {
+ const createComponent = ({ provide = {} } = {}) => {
wrapper = shallowMount(PipelineEditorHeader, {
- props: {
+ provide: {
+ ...mockProvide,
+ ...provide,
+ },
+ propsData: {
ciConfigData: mockLintResponse,
+ ciFileContent: mockCiYml,
isCiConfigDataLoading: false,
},
});
};
+ const findPipelineStatus = () => wrapper.findComponent(PipelineStatus);
const findValidationSegment = () => wrapper.findComponent(ValidationSegment);
afterEach(() => {
@@ -27,8 +39,27 @@ describe('Pipeline editor header', () => {
beforeEach(() => {
createComponent();
});
+
+ it('renders the pipeline status', () => {
+ expect(findPipelineStatus().exists()).toBe(true);
+ });
+
it('renders the validation segment', () => {
expect(findValidationSegment().exists()).toBe(true);
});
});
+
+ describe('with pipeline status feature flag off', () => {
+ beforeEach(() => {
+ createComponent({
+ provide: {
+ glFeatures: { pipelineStatusForPipelineEditor: false },
+ },
+ });
+ });
+
+ it('does not render the pipeline status', () => {
+ expect(findPipelineStatus().exists()).toBe(false);
+ });
+ });
});
diff --git a/spec/frontend/pipeline_editor/components/header/pipeline_status_spec.js b/spec/frontend/pipeline_editor/components/header/pipeline_status_spec.js
new file mode 100644
index 00000000000..de6e112866b
--- /dev/null
+++ b/spec/frontend/pipeline_editor/components/header/pipeline_status_spec.js
@@ -0,0 +1,150 @@
+import { GlIcon, GlLink, GlLoadingIcon, GlSprintf } from '@gitlab/ui';
+import { shallowMount, createLocalVue } from '@vue/test-utils';
+import VueApollo from 'vue-apollo';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import PipelineStatus, { i18n } from '~/pipeline_editor/components/header/pipeline_status.vue';
+import CiIcon from '~/vue_shared/components/ci_icon.vue';
+import { mockCommitSha, mockProjectPipeline, mockProjectFullPath } from '../../mock_data';
+
+const localVue = createLocalVue();
+localVue.use(VueApollo);
+
+const mockProvide = {
+ projectFullPath: mockProjectFullPath,
+};
+
+describe('Pipeline Status', () => {
+ let wrapper;
+ let mockApollo;
+ let mockPipelineQuery;
+
+ const createComponent = ({ hasPipeline = true, isQueryLoading = false }) => {
+ const pipeline = hasPipeline
+ ? { loading: isQueryLoading, ...mockProjectPipeline.pipeline }
+ : { loading: isQueryLoading };
+
+ wrapper = shallowMount(PipelineStatus, {
+ provide: mockProvide,
+ stubs: { GlLink, GlSprintf },
+ data: () => (hasPipeline ? { pipeline } : {}),
+ mocks: {
+ $apollo: {
+ queries: {
+ pipeline,
+ },
+ },
+ },
+ });
+ };
+
+ const createComponentWithApollo = () => {
+ const resolvers = {
+ Query: {
+ project: mockPipelineQuery,
+ },
+ };
+ mockApollo = createMockApollo([], resolvers);
+
+ wrapper = shallowMount(PipelineStatus, {
+ localVue,
+ apolloProvider: mockApollo,
+ provide: mockProvide,
+ stubs: { GlLink, GlSprintf },
+ data() {
+ return {
+ commitSha: mockCommitSha,
+ };
+ },
+ });
+ };
+
+ const findIcon = () => wrapper.findComponent(GlIcon);
+ const findCiIcon = () => wrapper.findComponent(CiIcon);
+ const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
+ const findPipelineId = () => wrapper.find('[data-testid="pipeline-id"]');
+ const findPipelineCommit = () => wrapper.find('[data-testid="pipeline-commit"]');
+ const findPipelineErrorMsg = () => wrapper.find('[data-testid="pipeline-error-msg"]');
+ const findPipelineLoadingMsg = () => wrapper.find('[data-testid="pipeline-loading-msg"]');
+
+ beforeEach(() => {
+ mockPipelineQuery = jest.fn();
+ });
+
+ afterEach(() => {
+ mockPipelineQuery.mockReset();
+
+ wrapper.destroy();
+ wrapper = null;
+ });
+
+ describe('while querying', () => {
+ it('renders loading icon', () => {
+ createComponent({ isQueryLoading: true, hasPipeline: false });
+
+ expect(findLoadingIcon().exists()).toBe(true);
+ expect(findPipelineLoadingMsg().text()).toBe(i18n.fetchLoading);
+ });
+
+ it('does not render loading icon if pipeline data is already set', () => {
+ createComponent({ isQueryLoading: true });
+
+ expect(findLoadingIcon().exists()).toBe(false);
+ });
+ });
+
+ describe('when querying data', () => {
+ describe('when data is set', () => {
+ beforeEach(async () => {
+ mockPipelineQuery.mockResolvedValue(mockProjectPipeline);
+
+ createComponentWithApollo();
+ await waitForPromises();
+ });
+
+ it('query is called with correct variables', async () => {
+ expect(mockPipelineQuery).toHaveBeenCalledTimes(1);
+ expect(mockPipelineQuery).toHaveBeenCalledWith(
+ expect.anything(),
+ {
+ fullPath: mockProjectFullPath,
+ },
+ expect.anything(),
+ expect.anything(),
+ );
+ });
+
+ it('does not render error', () => {
+ expect(findIcon().exists()).toBe(false);
+ });
+
+ it('renders pipeline data', () => {
+ const { id } = mockProjectPipeline.pipeline;
+
+ expect(findCiIcon().exists()).toBe(true);
+ expect(findPipelineId().text()).toBe(`#${id.match(/\d+/g)[0]}`);
+ expect(findPipelineCommit().text()).toBe(mockCommitSha);
+ });
+ });
+
+ describe('when data cannot be fetched', () => {
+ beforeEach(async () => {
+ mockPipelineQuery.mockRejectedValue(new Error());
+
+ createComponentWithApollo();
+ await waitForPromises();
+ });
+
+ it('renders error', () => {
+ expect(findIcon().attributes('name')).toBe('warning-solid');
+ expect(findPipelineErrorMsg().text()).toBe(i18n.fetchError);
+ });
+
+ it('does not render pipeline data', () => {
+ expect(findCiIcon().exists()).toBe(false);
+ expect(findPipelineId().exists()).toBe(false);
+ expect(findPipelineCommit().exists()).toBe(false);
+ });
+ });
+ });
+});
diff --git a/spec/frontend/pipeline_editor/components/header/validation_segment_spec.js b/spec/frontend/pipeline_editor/components/header/validation_segment_spec.js
index cf1d89e1d7c..274c2d1b8da 100644
--- a/spec/frontend/pipeline_editor/components/header/validation_segment_spec.js
+++ b/spec/frontend/pipeline_editor/components/header/validation_segment_spec.js
@@ -7,9 +7,9 @@ import ValidationSegment, {
i18n,
} from '~/pipeline_editor/components/header/validation_segment.vue';
import { CI_CONFIG_STATUS_INVALID } from '~/pipeline_editor/constants';
-import { mockYmlHelpPagePath, mergeUnwrappedCiConfig } from '../../mock_data';
+import { mockYmlHelpPagePath, mergeUnwrappedCiConfig, mockCiYml } from '../../mock_data';
-describe('~/pipeline_editor/components/info/validation_segment.vue', () => {
+describe('Validation segment component', () => {
let wrapper;
const createComponent = (props = {}) => {
@@ -20,6 +20,7 @@ describe('~/pipeline_editor/components/info/validation_segment.vue', () => {
},
propsData: {
ciConfig: mergeUnwrappedCiConfig(),
+ ciFileContent: mockCiYml,
loading: false,
...props,
},
@@ -42,6 +43,20 @@ describe('~/pipeline_editor/components/info/validation_segment.vue', () => {
expect(wrapper.text()).toBe(i18n.loading);
});
+ describe('when config is empty', () => {
+ beforeEach(() => {
+ createComponent({ ciFileContent: '' });
+ });
+
+ it('has check icon', () => {
+ expect(findIcon().props('name')).toBe('check');
+ });
+
+ it('shows a message for empty state', () => {
+ expect(findValidationMsg().text()).toBe(i18n.empty);
+ });
+ });
+
describe('when config is valid', () => {
beforeEach(() => {
createComponent({});
@@ -61,7 +76,7 @@ describe('~/pipeline_editor/components/info/validation_segment.vue', () => {
});
});
- describe('when config is not valid', () => {
+ describe('when config is invalid', () => {
beforeEach(() => {
createComponent({
ciConfig: mergeUnwrappedCiConfig({
diff --git a/spec/frontend/pipeline_editor/components/ui/pipeline_editor_empty_state_spec.js b/spec/frontend/pipeline_editor/components/ui/pipeline_editor_empty_state_spec.js
new file mode 100644
index 00000000000..b444d9dcfea
--- /dev/null
+++ b/spec/frontend/pipeline_editor/components/ui/pipeline_editor_empty_state_spec.js
@@ -0,0 +1,79 @@
+import { GlButton, GlSprintf } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import PipelineEditorEmptyState from '~/pipeline_editor/components/ui/pipeline_editor_empty_state.vue';
+
+describe('Pipeline editor empty state', () => {
+ let wrapper;
+ const defaultProvide = {
+ glFeatures: {
+ pipelineEditorEmptyStateAction: false,
+ },
+ emptyStateIllustrationPath: 'my/svg/path',
+ };
+
+ const createComponent = ({ provide } = {}) => {
+ wrapper = shallowMount(PipelineEditorEmptyState, {
+ provide: { ...defaultProvide, ...provide },
+ });
+ };
+
+ const findSvgImage = () => wrapper.find('img');
+ const findTitle = () => wrapper.find('h1');
+ const findConfirmButton = () => wrapper.findComponent(GlButton);
+ const findDescription = () => wrapper.findComponent(GlSprintf);
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('template', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('renders an svg image', () => {
+ expect(findSvgImage().exists()).toBe(true);
+ });
+
+ it('renders a title', () => {
+ expect(findTitle().exists()).toBe(true);
+ expect(findTitle().text()).toBe(wrapper.vm.$options.i18n.title);
+ });
+
+ it('renders a description', () => {
+ expect(findDescription().exists()).toBe(true);
+ expect(findDescription().html()).toContain(wrapper.vm.$options.i18n.body);
+ });
+
+ describe('with feature flag off', () => {
+ it('does not renders a CTA button', () => {
+ expect(findConfirmButton().exists()).toBe(false);
+ });
+ });
+ });
+
+ describe('with feature flag on', () => {
+ beforeEach(() => {
+ createComponent({
+ provide: {
+ glFeatures: {
+ pipelineEditorEmptyStateAction: true,
+ },
+ },
+ });
+ });
+
+ it('renders a CTA button', () => {
+ expect(findConfirmButton().exists()).toBe(true);
+ expect(findConfirmButton().text()).toBe(wrapper.vm.$options.i18n.btnText);
+ });
+
+ it('emits an event when clicking on the CTA', async () => {
+ const expectedEvent = 'createEmptyConfigFile';
+ expect(wrapper.emitted(expectedEvent)).toBeUndefined();
+
+ await findConfirmButton().vm.$emit('click');
+ expect(wrapper.emitted(expectedEvent)).toHaveLength(1);
+ });
+ });
+});
diff --git a/spec/frontend/pipeline_editor/graphql/resolvers_spec.js b/spec/frontend/pipeline_editor/graphql/resolvers_spec.js
index d39c0d80296..196a4133eea 100644
--- a/spec/frontend/pipeline_editor/graphql/resolvers_spec.js
+++ b/spec/frontend/pipeline_editor/graphql/resolvers_spec.js
@@ -46,6 +46,24 @@ describe('~/pipeline_editor/graphql/resolvers', () => {
await expect(result.rawData).resolves.toBe(mockCiYml);
});
});
+
+ describe('pipeline', () => {
+ it('resolves pipeline data with type names', async () => {
+ const result = await resolvers.Query.project(null);
+
+ // eslint-disable-next-line no-underscore-dangle
+ expect(result.__typename).toBe('Project');
+ });
+
+ it('resolves pipeline data with necessary data', async () => {
+ const result = await resolvers.Query.project(null);
+ const pipelineKeys = Object.keys(result.pipeline);
+ const statusKeys = Object.keys(result.pipeline.detailedStatus);
+
+ expect(pipelineKeys).toContain('id', 'commitPath', 'detailedStatus', 'shortSha');
+ expect(statusKeys).toContain('detailsPath', 'text');
+ });
+ });
});
describe('Mutation', () => {
diff --git a/spec/frontend/pipeline_editor/mock_data.js b/spec/frontend/pipeline_editor/mock_data.js
index 8e248c11b87..16d5ba0e714 100644
--- a/spec/frontend/pipeline_editor/mock_data.js
+++ b/spec/frontend/pipeline_editor/mock_data.js
@@ -138,6 +138,22 @@ export const mergeUnwrappedCiConfig = (mergedConfig) => {
};
};
+export const mockProjectPipeline = {
+ pipeline: {
+ commitPath: '/-/commit/aabbccdd',
+ id: 'gid://gitlab/Ci::Pipeline/118',
+ iid: '28',
+ shortSha: mockCommitSha,
+ status: 'SUCCESS',
+ detailedStatus: {
+ detailsPath: '/root/sample-ci-project/-/pipelines/118"',
+ group: 'success',
+ icon: 'status_success',
+ text: 'passed',
+ },
+ },
+};
+
export const mockLintResponse = {
valid: true,
mergedYaml: mockCiYml,
diff --git a/spec/frontend/pipeline_editor/pipeline_editor_app_spec.js b/spec/frontend/pipeline_editor/pipeline_editor_app_spec.js
index 46d0452f437..887d296222f 100644
--- a/spec/frontend/pipeline_editor/pipeline_editor_app_spec.js
+++ b/spec/frontend/pipeline_editor/pipeline_editor_app_spec.js
@@ -7,6 +7,8 @@ import httpStatusCodes from '~/lib/utils/http_status';
import CommitForm from '~/pipeline_editor/components/commit/commit_form.vue';
import TextEditor from '~/pipeline_editor/components/editor/text_editor.vue';
+import PipelineEditorTabs from '~/pipeline_editor/components/pipeline_editor_tabs.vue';
+import PipelineEditorEmptyState from '~/pipeline_editor/components/ui/pipeline_editor_empty_state.vue';
import { COMMIT_SUCCESS, COMMIT_FAILURE, LOAD_FAILURE_UNKNOWN } from '~/pipeline_editor/constants';
import getCiConfigData from '~/pipeline_editor/graphql/queries/ci_config.graphql';
import PipelineEditorApp from '~/pipeline_editor/pipeline_editor_app.vue';
@@ -29,6 +31,9 @@ const MockEditorLite = {
const mockProvide = {
ciConfigPath: mockCiConfigPath,
defaultBranch: mockDefaultBranch,
+ glFeatures: {
+ pipelineEditorEmptyStateAction: false,
+ },
projectFullPath: mockProjectFullPath,
};
@@ -39,14 +44,17 @@ describe('Pipeline editor app component', () => {
let mockBlobContentData;
let mockCiConfigData;
- const createComponent = ({ blobLoading = false, options = {} } = {}) => {
+ const createComponent = ({ blobLoading = false, options = {}, provide = {} } = {}) => {
wrapper = shallowMount(PipelineEditorApp, {
- provide: mockProvide,
+ provide: { ...mockProvide, ...provide },
stubs: {
GlTabs,
GlButton,
CommitForm,
+ PipelineEditorHome,
+ PipelineEditorTabs,
EditorLite: MockEditorLite,
+ PipelineEditorEmptyState,
},
mocks: {
$apollo: {
@@ -64,7 +72,7 @@ describe('Pipeline editor app component', () => {
});
};
- const createComponentWithApollo = ({ props = {} } = {}) => {
+ const createComponentWithApollo = ({ props = {}, provide = {} } = {}) => {
const handlers = [[getCiConfigData, mockCiConfigData]];
const resolvers = {
Query: {
@@ -85,13 +93,16 @@ describe('Pipeline editor app component', () => {
apolloProvider: mockApollo,
};
- createComponent({ props, options });
+ createComponent({ props, provide, options });
};
const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
const findAlert = () => wrapper.findComponent(GlAlert);
const findEditorHome = () => wrapper.findComponent(PipelineEditorHome);
const findTextEditor = () => wrapper.findComponent(TextEditor);
+ const findEmptyState = () => wrapper.findComponent(PipelineEditorEmptyState);
+ const findEmptyStateButton = () =>
+ wrapper.findComponent(PipelineEditorEmptyState).findComponent(GlButton);
beforeEach(() => {
mockBlobContentData = jest.fn();
@@ -103,7 +114,6 @@ describe('Pipeline editor app component', () => {
mockCiConfigData.mockReset();
wrapper.destroy();
- wrapper = null;
});
it('displays a loading icon if the blob query is loading', () => {
@@ -146,45 +156,79 @@ describe('Pipeline editor app component', () => {
});
});
- describe('when no file exists', () => {
- const noFileAlertMsg =
- 'There is no .gitlab-ci.yml file in this repository, please add one and visit the Pipeline Editor again.';
+ describe('when no CI config file exists', () => {
+ describe('in a project without a repository', () => {
+ it('shows an empty state and does not show editor home component', async () => {
+ mockBlobContentData.mockRejectedValueOnce({
+ response: {
+ status: httpStatusCodes.BAD_REQUEST,
+ },
+ });
+ createComponentWithApollo();
- it('shows a 404 error message and does not show editor home component', async () => {
- mockBlobContentData.mockRejectedValueOnce({
- response: {
- status: httpStatusCodes.NOT_FOUND,
- },
+ await waitForPromises();
+
+ expect(findEmptyState().exists()).toBe(true);
+ expect(findAlert().exists()).toBe(false);
+ expect(findEditorHome().exists()).toBe(false);
});
- createComponentWithApollo();
+ });
- await waitForPromises();
+ describe('in a project with a repository', () => {
+ it('shows an empty state and does not show editor home component', async () => {
+ mockBlobContentData.mockRejectedValueOnce({
+ response: {
+ status: httpStatusCodes.NOT_FOUND,
+ },
+ });
+ createComponentWithApollo();
- expect(findAlert().text()).toBe(noFileAlertMsg);
- expect(findEditorHome().exists()).toBe(false);
+ await waitForPromises();
+
+ expect(findEmptyState().exists()).toBe(true);
+ expect(findAlert().exists()).toBe(false);
+ expect(findEditorHome().exists()).toBe(false);
+ });
+ });
+
+ describe('because of a fetching error', () => {
+ it('shows a unkown error message', async () => {
+ mockBlobContentData.mockRejectedValueOnce(new Error('My error!'));
+ createComponentWithApollo();
+ await waitForPromises();
+
+ expect(findEmptyState().exists()).toBe(false);
+ expect(findAlert().text()).toBe(wrapper.vm.$options.errorTexts[LOAD_FAILURE_UNKNOWN]);
+ expect(findEditorHome().exists()).toBe(true);
+ });
});
+ });
- it('shows a 400 error message and does not show editor home component', async () => {
+ describe('when landing on the empty state with feature flag on', () => {
+ it('user can click on CTA button and see an empty editor', async () => {
mockBlobContentData.mockRejectedValueOnce({
response: {
- status: httpStatusCodes.BAD_REQUEST,
+ status: httpStatusCodes.NOT_FOUND,
+ },
+ });
+
+ createComponentWithApollo({
+ provide: {
+ glFeatures: {
+ pipelineEditorEmptyStateAction: true,
+ },
},
});
- createComponentWithApollo();
await waitForPromises();
- expect(findAlert().text()).toBe(noFileAlertMsg);
- expect(findEditorHome().exists()).toBe(false);
- });
+ expect(findEmptyState().exists()).toBe(true);
+ expect(findTextEditor().exists()).toBe(false);
- it('shows a unkown error message', async () => {
- mockBlobContentData.mockRejectedValueOnce(new Error('My error!'));
- createComponentWithApollo();
- await waitForPromises();
+ await findEmptyStateButton().vm.$emit('click');
- expect(findAlert().text()).toBe(wrapper.vm.$options.errorTexts[LOAD_FAILURE_UNKNOWN]);
- expect(findEditorHome().exists()).toBe(true);
+ expect(findEmptyState().exists()).toBe(false);
+ expect(findTextEditor().exists()).toBe(true);
});
});
@@ -193,6 +237,7 @@ describe('Pipeline editor app component', () => {
describe('and the commit mutation succeeds', () => {
beforeEach(() => {
+ window.scrollTo = jest.fn();
createComponent();
findEditorHome().vm.$emit('commit', { type: COMMIT_SUCCESS });
@@ -201,11 +246,16 @@ describe('Pipeline editor app component', () => {
it('shows a confirmation message', () => {
expect(findAlert().text()).toBe(wrapper.vm.$options.successTexts[COMMIT_SUCCESS]);
});
+
+ it('scrolls to the top of the page to bring attention to the confirmation message', () => {
+ expect(window.scrollTo).toHaveBeenCalledWith({ top: 0, behavior: 'smooth' });
+ });
});
describe('and the commit mutation fails', () => {
const commitFailedReasons = ['Commit failed'];
beforeEach(() => {
+ window.scrollTo = jest.fn();
createComponent();
findEditorHome().vm.$emit('showError', {
@@ -219,11 +269,17 @@ describe('Pipeline editor app component', () => {
`${updateFailureMessage} ${commitFailedReasons[0]}`,
);
});
+
+ it('scrolls to the top of the page to bring attention to the error message', () => {
+ expect(window.scrollTo).toHaveBeenCalledWith({ top: 0, behavior: 'smooth' });
+ });
});
+
describe('when an unknown error occurs', () => {
const unknownReasons = ['Commit failed'];
beforeEach(() => {
+ window.scrollTo = jest.fn();
createComponent();
findEditorHome().vm.$emit('showError', {
@@ -237,6 +293,10 @@ describe('Pipeline editor app component', () => {
`${updateFailureMessage} ${unknownReasons[0]}`,
);
});
+
+ it('scrolls to the top of the page to bring attention to the error message', () => {
+ expect(window.scrollTo).toHaveBeenCalledWith({ top: 0, behavior: 'smooth' });
+ });
});
});
});
diff --git a/spec/frontend/pipeline_new/components/pipeline_new_form_spec.js b/spec/frontend/pipeline_new/components/pipeline_new_form_spec.js
index 51bb0ecee9c..7ec5818010a 100644
--- a/spec/frontend/pipeline_new/components/pipeline_new_form_spec.js
+++ b/spec/frontend/pipeline_new/components/pipeline_new_form_spec.js
@@ -1,4 +1,4 @@
-import { GlDropdown, GlDropdownItem, GlForm, GlSprintf, GlLoadingIcon } from '@gitlab/ui';
+import { GlForm, GlSprintf, GlLoadingIcon } from '@gitlab/ui';
import { mount, shallowMount } from '@vue/test-utils';
import MockAdapter from 'axios-mock-adapter';
import waitForPromises from 'helpers/wait_for_promises';
@@ -6,34 +6,26 @@ import axios from '~/lib/utils/axios_utils';
import httpStatusCodes from '~/lib/utils/http_status';
import { redirectTo } from '~/lib/utils/url_utility';
import PipelineNewForm from '~/pipeline_new/components/pipeline_new_form.vue';
-import {
- mockBranches,
- mockTags,
- mockParams,
- mockPostParams,
- mockProjectId,
- mockError,
-} from '../mock_data';
+import RefsDropdown from '~/pipeline_new/components/refs_dropdown.vue';
+import { mockQueryParams, mockPostParams, mockProjectId, mockError, mockRefs } from '../mock_data';
jest.mock('~/lib/utils/url_utility', () => ({
redirectTo: jest.fn(),
}));
+const projectRefsEndpoint = '/root/project/refs';
const pipelinesPath = '/root/project/-/pipelines';
const configVariablesPath = '/root/project/-/pipelines/config_variables';
-const postResponse = { id: 1 };
+const newPipelinePostResponse = { id: 1 };
+const defaultBranch = 'master';
describe('Pipeline New Form', () => {
let wrapper;
let mock;
-
- const dummySubmitEvent = {
- preventDefault() {},
- };
+ let dummySubmitEvent;
const findForm = () => wrapper.find(GlForm);
- const findDropdown = () => wrapper.find(GlDropdown);
- const findDropdownItems = () => wrapper.findAll(GlDropdownItem);
+ const findRefsDropdown = () => wrapper.findComponent(RefsDropdown);
const findSubmitButton = () => wrapper.find('[data-testid="run_pipeline_button"]');
const findVariableRows = () => wrapper.findAll('[data-testid="ci-variable-row"]');
const findRemoveIcons = () => wrapper.findAll('[data-testid="remove-ci-variable-row"]');
@@ -44,33 +36,42 @@ describe('Pipeline New Form', () => {
const findWarningAlertSummary = () => findWarningAlert().find(GlSprintf);
const findWarnings = () => wrapper.findAll('[data-testid="run-pipeline-warning"]');
const findLoadingIcon = () => wrapper.find(GlLoadingIcon);
- const getExpectedPostParams = () => JSON.parse(mock.history.post[0].data);
- const changeRef = (i) => findDropdownItems().at(i).vm.$emit('click');
+ const getFormPostParams = () => JSON.parse(mock.history.post[0].data);
+
+ const selectBranch = (branch) => {
+ // Select a branch in the dropdown
+ findRefsDropdown().vm.$emit('input', {
+ shortName: branch,
+ fullName: `refs/heads/${branch}`,
+ });
+ };
- const createComponent = (term = '', props = {}, method = shallowMount) => {
+ const createComponent = (props = {}, method = shallowMount) => {
wrapper = method(PipelineNewForm, {
+ provide: {
+ projectRefsEndpoint,
+ },
propsData: {
projectId: mockProjectId,
pipelinesPath,
configVariablesPath,
- branches: mockBranches,
- tags: mockTags,
- defaultBranch: 'master',
+ defaultBranch,
+ refParam: defaultBranch,
settingsLink: '',
maxWarnings: 25,
...props,
},
- data() {
- return {
- searchTerm: term,
- };
- },
});
};
beforeEach(() => {
mock = new MockAdapter(axios);
mock.onGet(configVariablesPath).reply(httpStatusCodes.OK, {});
+ mock.onGet(projectRefsEndpoint).reply(httpStatusCodes.OK, mockRefs);
+
+ dummySubmitEvent = {
+ preventDefault: jest.fn(),
+ };
});
afterEach(() => {
@@ -80,38 +81,17 @@ describe('Pipeline New Form', () => {
mock.restore();
});
- describe('Dropdown with branches and tags', () => {
- beforeEach(() => {
- mock.onPost(pipelinesPath).reply(httpStatusCodes.OK, postResponse);
- });
-
- it('displays dropdown with all branches and tags', () => {
- const refLength = mockBranches.length + mockTags.length;
-
- createComponent();
-
- expect(findDropdownItems()).toHaveLength(refLength);
- });
-
- it('when user enters search term the list is filtered', () => {
- createComponent('master');
-
- expect(findDropdownItems()).toHaveLength(1);
- expect(findDropdownItems().at(0).text()).toBe('master');
- });
- });
-
describe('Form', () => {
beforeEach(async () => {
- createComponent('', mockParams, mount);
+ createComponent(mockQueryParams, mount);
- mock.onPost(pipelinesPath).reply(httpStatusCodes.OK, postResponse);
+ mock.onPost(pipelinesPath).reply(httpStatusCodes.OK, newPipelinePostResponse);
await waitForPromises();
});
it('displays the correct values for the provided query params', async () => {
- expect(findDropdown().props('text')).toBe('tag-1');
+ expect(findRefsDropdown().props('value')).toEqual({ shortName: 'tag-1' });
expect(findVariableRows()).toHaveLength(3);
});
@@ -152,11 +132,19 @@ describe('Pipeline New Form', () => {
describe('Pipeline creation', () => {
beforeEach(async () => {
- mock.onPost(pipelinesPath).reply(httpStatusCodes.OK, postResponse);
+ mock.onPost(pipelinesPath).reply(httpStatusCodes.OK, newPipelinePostResponse);
await waitForPromises();
});
+ it('does not submit the native HTML form', async () => {
+ createComponent();
+
+ findForm().vm.$emit('submit', dummySubmitEvent);
+
+ expect(dummySubmitEvent.preventDefault).toHaveBeenCalled();
+ });
+
it('disables the submit button immediately after submitting', async () => {
createComponent();
@@ -171,19 +159,15 @@ describe('Pipeline New Form', () => {
it('creates pipeline with full ref and variables', async () => {
createComponent();
- changeRef(0);
-
findForm().vm.$emit('submit', dummySubmitEvent);
-
await waitForPromises();
- expect(getExpectedPostParams().ref).toEqual(wrapper.vm.$data.refValue.fullName);
- expect(redirectTo).toHaveBeenCalledWith(`${pipelinesPath}/${postResponse.id}`);
+ expect(getFormPostParams().ref).toEqual(`refs/heads/${defaultBranch}`);
+ expect(redirectTo).toHaveBeenCalledWith(`${pipelinesPath}/${newPipelinePostResponse.id}`);
});
- it('creates a pipeline with short ref and variables', async () => {
- // query params are used
- createComponent('', mockParams);
+ it('creates a pipeline with short ref and variables from the query params', async () => {
+ createComponent(mockQueryParams);
await waitForPromises();
@@ -191,19 +175,19 @@ describe('Pipeline New Form', () => {
await waitForPromises();
- expect(getExpectedPostParams()).toEqual(mockPostParams);
- expect(redirectTo).toHaveBeenCalledWith(`${pipelinesPath}/${postResponse.id}`);
+ expect(getFormPostParams()).toEqual(mockPostParams);
+ expect(redirectTo).toHaveBeenCalledWith(`${pipelinesPath}/${newPipelinePostResponse.id}`);
});
});
describe('When the ref has been changed', () => {
beforeEach(async () => {
- createComponent('', {}, mount);
+ createComponent({}, mount);
await waitForPromises();
});
it('variables persist between ref changes', async () => {
- changeRef(0); // change to master
+ selectBranch('master');
await waitForPromises();
@@ -213,7 +197,7 @@ describe('Pipeline New Form', () => {
await wrapper.vm.$nextTick();
- changeRef(1); // change to branch-1
+ selectBranch('branch-1');
await waitForPromises();
@@ -223,14 +207,14 @@ describe('Pipeline New Form', () => {
await wrapper.vm.$nextTick();
- changeRef(0); // change back to master
+ selectBranch('master');
await waitForPromises();
expect(findKeyInputs().at(0).element.value).toBe('build_var');
expect(findVariableRows().length).toBe(2);
- changeRef(1); // change back to branch-1
+ selectBranch('branch-1');
await waitForPromises();
@@ -248,7 +232,7 @@ describe('Pipeline New Form', () => {
const mockYmlDesc = 'A var from yml.';
it('loading icon is shown when content is requested and hidden when received', async () => {
- createComponent('', mockParams, mount);
+ createComponent(mockQueryParams, mount);
mock.onGet(configVariablesPath).reply(httpStatusCodes.OK, {
[mockYmlKey]: {
@@ -265,7 +249,7 @@ describe('Pipeline New Form', () => {
});
it('multi-line strings are added to the value field without removing line breaks', async () => {
- createComponent('', mockParams, mount);
+ createComponent(mockQueryParams, mount);
mock.onGet(configVariablesPath).reply(httpStatusCodes.OK, {
[mockYmlKey]: {
@@ -281,7 +265,7 @@ describe('Pipeline New Form', () => {
describe('with description', () => {
beforeEach(async () => {
- createComponent('', mockParams, mount);
+ createComponent(mockQueryParams, mount);
mock.onGet(configVariablesPath).reply(httpStatusCodes.OK, {
[mockYmlKey]: {
@@ -323,7 +307,7 @@ describe('Pipeline New Form', () => {
describe('without description', () => {
beforeEach(async () => {
- createComponent('', mockParams, mount);
+ createComponent(mockQueryParams, mount);
mock.onGet(configVariablesPath).reply(httpStatusCodes.OK, {
[mockYmlKey]: {
@@ -346,6 +330,21 @@ describe('Pipeline New Form', () => {
createComponent();
});
+ describe('when the refs cannot be loaded', () => {
+ beforeEach(() => {
+ mock
+ .onGet(projectRefsEndpoint, { params: { search: '' } })
+ .reply(httpStatusCodes.INTERNAL_SERVER_ERROR);
+
+ findRefsDropdown().vm.$emit('loadingError');
+ });
+
+ it('shows both an error alert', () => {
+ expect(findErrorAlert().exists()).toBe(true);
+ expect(findWarningAlert().exists()).toBe(false);
+ });
+ });
+
describe('when the error response can be handled', () => {
beforeEach(async () => {
mock.onPost(pipelinesPath).reply(httpStatusCodes.BAD_REQUEST, mockError);
diff --git a/spec/frontend/pipeline_new/components/refs_dropdown_spec.js b/spec/frontend/pipeline_new/components/refs_dropdown_spec.js
new file mode 100644
index 00000000000..8dafbf230f9
--- /dev/null
+++ b/spec/frontend/pipeline_new/components/refs_dropdown_spec.js
@@ -0,0 +1,182 @@
+import { GlDropdown, GlDropdownItem, GlSearchBoxByType } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import MockAdapter from 'axios-mock-adapter';
+import waitForPromises from 'helpers/wait_for_promises';
+import axios from '~/lib/utils/axios_utils';
+import httpStatusCodes from '~/lib/utils/http_status';
+
+import RefsDropdown from '~/pipeline_new/components/refs_dropdown.vue';
+
+import { mockRefs, mockFilteredRefs } from '../mock_data';
+
+const projectRefsEndpoint = '/root/project/refs';
+const refShortName = 'master';
+const refFullName = 'refs/heads/master';
+
+jest.mock('~/flash');
+
+describe('Pipeline New Form', () => {
+ let wrapper;
+ let mock;
+
+ const findDropdown = () => wrapper.find(GlDropdown);
+ const findRefsDropdownItems = () => wrapper.findAll(GlDropdownItem);
+ const findSearchBox = () => wrapper.findComponent(GlSearchBoxByType);
+
+ const createComponent = (props = {}, mountFn = shallowMount) => {
+ wrapper = mountFn(RefsDropdown, {
+ provide: {
+ projectRefsEndpoint,
+ },
+ propsData: {
+ value: {
+ shortName: refShortName,
+ fullName: refFullName,
+ },
+ ...props,
+ },
+ });
+ };
+
+ beforeEach(() => {
+ mock = new MockAdapter(axios);
+ mock.onGet(projectRefsEndpoint, { params: { search: '' } }).reply(httpStatusCodes.OK, mockRefs);
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+
+ mock.restore();
+ });
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('displays empty dropdown initially', async () => {
+ await findDropdown().vm.$emit('show');
+
+ expect(findRefsDropdownItems()).toHaveLength(0);
+ });
+
+ it('does not make requests immediately', async () => {
+ expect(mock.history.get).toHaveLength(0);
+ });
+
+ describe('when user opens dropdown', () => {
+ beforeEach(async () => {
+ await findDropdown().vm.$emit('show');
+ await waitForPromises();
+ });
+
+ it('requests unfiltered tags and branches', async () => {
+ expect(mock.history.get).toHaveLength(1);
+ expect(mock.history.get[0].url).toBe(projectRefsEndpoint);
+ expect(mock.history.get[0].params).toEqual({ search: '' });
+ });
+
+ it('displays dropdown with branches and tags', async () => {
+ const refLength = mockRefs.Tags.length + mockRefs.Branches.length;
+
+ expect(findRefsDropdownItems()).toHaveLength(refLength);
+ });
+
+ it('displays the names of refs', () => {
+ // Branches
+ expect(findRefsDropdownItems().at(0).text()).toBe(mockRefs.Branches[0]);
+
+ // Tags (appear after branches)
+ const firstTag = mockRefs.Branches.length;
+ expect(findRefsDropdownItems().at(firstTag).text()).toBe(mockRefs.Tags[0]);
+ });
+
+ it('when user shows dropdown a second time, only one request is done', () => {
+ expect(mock.history.get).toHaveLength(1);
+ });
+
+ describe('when user selects a value', () => {
+ const selectedIndex = 1;
+
+ beforeEach(async () => {
+ await findRefsDropdownItems().at(selectedIndex).vm.$emit('click');
+ });
+
+ it('component emits @input', () => {
+ const inputs = wrapper.emitted('input');
+
+ expect(inputs).toHaveLength(1);
+ expect(inputs[0]).toEqual([{ shortName: 'branch-1', fullName: 'refs/heads/branch-1' }]);
+ });
+ });
+
+ describe('when user types searches for a tag', () => {
+ const mockSearchTerm = 'my-search';
+
+ beforeEach(async () => {
+ mock
+ .onGet(projectRefsEndpoint, { params: { search: mockSearchTerm } })
+ .reply(httpStatusCodes.OK, mockFilteredRefs);
+
+ await findSearchBox().vm.$emit('input', mockSearchTerm);
+ await waitForPromises();
+ });
+
+ it('requests filtered tags and branches', async () => {
+ expect(mock.history.get).toHaveLength(2);
+ expect(mock.history.get[1].params).toEqual({
+ search: mockSearchTerm,
+ });
+ });
+
+ it('displays dropdown with branches and tags', async () => {
+ const filteredRefLength = mockFilteredRefs.Tags.length + mockFilteredRefs.Branches.length;
+
+ expect(findRefsDropdownItems()).toHaveLength(filteredRefLength);
+ });
+ });
+ });
+
+ describe('when user has selected a value', () => {
+ const selectedIndex = 1;
+ const mockShortName = mockRefs.Branches[selectedIndex];
+ const mockFullName = `refs/heads/${mockShortName}`;
+
+ beforeEach(async () => {
+ mock
+ .onGet(projectRefsEndpoint, {
+ params: { ref: mockFullName },
+ })
+ .reply(httpStatusCodes.OK, mockRefs);
+
+ createComponent({
+ value: {
+ shortName: mockShortName,
+ fullName: mockFullName,
+ },
+ });
+ await findDropdown().vm.$emit('show');
+ await waitForPromises();
+ });
+
+ it('branch is checked', () => {
+ expect(findRefsDropdownItems().at(selectedIndex).props('isChecked')).toBe(true);
+ });
+ });
+
+ describe('when server returns an error', () => {
+ beforeEach(async () => {
+ mock
+ .onGet(projectRefsEndpoint, { params: { search: '' } })
+ .reply(httpStatusCodes.INTERNAL_SERVER_ERROR);
+
+ await findDropdown().vm.$emit('show');
+ await waitForPromises();
+ });
+
+ it('loading error event is emitted', () => {
+ expect(wrapper.emitted('loadingError')).toHaveLength(1);
+ expect(wrapper.emitted('loadingError')[0]).toEqual([expect.any(Error)]);
+ });
+ });
+});
diff --git a/spec/frontend/pipeline_new/mock_data.js b/spec/frontend/pipeline_new/mock_data.js
index feb24ec602d..4fb58cb8e62 100644
--- a/spec/frontend/pipeline_new/mock_data.js
+++ b/spec/frontend/pipeline_new/mock_data.js
@@ -1,16 +1,14 @@
-export const mockBranches = [
- { shortName: 'master', fullName: 'refs/heads/master' },
- { shortName: 'branch-1', fullName: 'refs/heads/branch-1' },
- { shortName: 'branch-2', fullName: 'refs/heads/branch-2' },
-];
+export const mockRefs = {
+ Branches: ['master', 'branch-1', 'branch-2'],
+ Tags: ['1.0.0', '1.1.0', '1.2.0'],
+};
-export const mockTags = [
- { shortName: '1.0.0', fullName: 'refs/tags/1.0.0' },
- { shortName: '1.1.0', fullName: 'refs/tags/1.1.0' },
- { shortName: '1.2.0', fullName: 'refs/tags/1.2.0' },
-];
+export const mockFilteredRefs = {
+ Branches: ['branch-1'],
+ Tags: ['1.0.0', '1.1.0'],
+};
-export const mockParams = {
+export const mockQueryParams = {
refParam: 'tag-1',
variableParams: {
test_var: 'test_var_val',
diff --git a/spec/frontend/pipelines/components/pipelines_list/pipeline_mini_graph_spec.js b/spec/frontend/pipelines/components/pipelines_list/pipeline_mini_graph_spec.js
new file mode 100644
index 00000000000..154828aff4b
--- /dev/null
+++ b/spec/frontend/pipelines/components/pipelines_list/pipeline_mini_graph_spec.js
@@ -0,0 +1,83 @@
+import { shallowMount } from '@vue/test-utils';
+import PipelineMiniGraph from '~/pipelines/components/pipelines_list/pipeline_mini_graph.vue';
+import PipelineStage from '~/pipelines/components/pipelines_list/pipeline_stage.vue';
+
+const { pipelines } = getJSONFixture('pipelines/pipelines.json');
+const mockStages = pipelines[0].details.stages;
+
+describe('Pipeline Mini Graph', () => {
+ let wrapper;
+
+ const findPipelineStages = () => wrapper.findAll(PipelineStage);
+ const findPipelineStagesAt = (i) => findPipelineStages().at(i);
+
+ const createComponent = (props = {}) => {
+ wrapper = shallowMount(PipelineMiniGraph, {
+ propsData: {
+ stages: mockStages,
+ ...props,
+ },
+ });
+ };
+
+ it('renders stages', () => {
+ createComponent();
+
+ expect(findPipelineStages()).toHaveLength(mockStages.length);
+ });
+
+ it('renders stages with a custom class', () => {
+ createComponent({ stagesClass: 'my-class' });
+
+ expect(wrapper.findAll('.my-class')).toHaveLength(mockStages.length);
+ });
+
+ it('does not fail when stages are empty', () => {
+ createComponent({ stages: [] });
+
+ expect(wrapper.exists()).toBe(true);
+ expect(findPipelineStages()).toHaveLength(0);
+ });
+
+ it('triggers events in "action request complete" in stages', () => {
+ createComponent();
+
+ findPipelineStagesAt(0).vm.$emit('pipelineActionRequestComplete');
+ findPipelineStagesAt(1).vm.$emit('pipelineActionRequestComplete');
+
+ expect(wrapper.emitted('pipelineActionRequestComplete')).toHaveLength(2);
+ });
+
+ it('update dropdown is false by default', () => {
+ createComponent();
+
+ expect(findPipelineStagesAt(0).props('updateDropdown')).toBe(false);
+ expect(findPipelineStagesAt(1).props('updateDropdown')).toBe(false);
+ });
+
+ it('update dropdown is set to true', () => {
+ createComponent({ updateDropdown: true });
+
+ expect(findPipelineStagesAt(0).props('updateDropdown')).toBe(true);
+ expect(findPipelineStagesAt(1).props('updateDropdown')).toBe(true);
+ });
+
+ it('is merge train is false by default', () => {
+ createComponent();
+
+ expect(findPipelineStagesAt(0).props('isMergeTrain')).toBe(false);
+ expect(findPipelineStagesAt(1).props('isMergeTrain')).toBe(false);
+ });
+
+ it('is merge train is set to true', () => {
+ createComponent({ isMergeTrain: true });
+
+ expect(findPipelineStagesAt(0).props('isMergeTrain')).toBe(true);
+ expect(findPipelineStagesAt(1).props('isMergeTrain')).toBe(true);
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ });
+});
diff --git a/spec/frontend/pipelines/components/pipelines_list/pipeline_stage_spec.js b/spec/frontend/pipelines/components/pipelines_list/pipeline_stage_spec.js
new file mode 100644
index 00000000000..60026f69b84
--- /dev/null
+++ b/spec/frontend/pipelines/components/pipelines_list/pipeline_stage_spec.js
@@ -0,0 +1,210 @@
+import { GlDropdown } from '@gitlab/ui';
+import { mount } from '@vue/test-utils';
+import MockAdapter from 'axios-mock-adapter';
+import axios from '~/lib/utils/axios_utils';
+import PipelineStage from '~/pipelines/components/pipelines_list/pipeline_stage.vue';
+import eventHub from '~/pipelines/event_hub';
+import { stageReply } from '../../mock_data';
+
+const dropdownPath = 'path.json';
+
+describe('Pipelines stage component', () => {
+ let wrapper;
+ let mock;
+
+ const createComponent = (props = {}) => {
+ wrapper = mount(PipelineStage, {
+ attachTo: document.body,
+ propsData: {
+ stage: {
+ status: {
+ group: 'success',
+ icon: 'status_success',
+ title: 'success',
+ },
+ dropdown_path: dropdownPath,
+ },
+ updateDropdown: false,
+ ...props,
+ },
+ });
+ };
+
+ beforeEach(() => {
+ mock = new MockAdapter(axios);
+ jest.spyOn(eventHub, '$emit');
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+
+ eventHub.$emit.mockRestore();
+ mock.restore();
+ });
+
+ const findDropdown = () => wrapper.findComponent(GlDropdown);
+ const findDropdownToggle = () => wrapper.find('button.dropdown-toggle');
+ const findDropdownMenu = () =>
+ wrapper.find('[data-testid="mini-pipeline-graph-dropdown-menu-list"]');
+ const findCiActionBtn = () => wrapper.find('.js-ci-action');
+ const findMergeTrainWarning = () => wrapper.find('[data-testid="warning-message-merge-trains"]');
+
+ const openStageDropdown = () => {
+ findDropdownToggle().trigger('click');
+ return new Promise((resolve) => {
+ wrapper.vm.$root.$on('bv::dropdown::show', resolve);
+ });
+ };
+
+ describe('default appearance', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('should render a dropdown with the status icon', () => {
+ expect(findDropdown().exists()).toBe(true);
+ expect(findDropdownToggle().exists()).toBe(true);
+ expect(wrapper.find('[data-testid="status_success_borderless-icon"]').exists()).toBe(true);
+ });
+ });
+
+ describe('when update dropdown is changed', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+ });
+
+ describe('when user opens dropdown and stage request is successful', () => {
+ beforeEach(async () => {
+ mock.onGet(dropdownPath).reply(200, stageReply);
+ createComponent();
+
+ await openStageDropdown();
+ await axios.waitForAll();
+ });
+
+ it('should render the received data and emit `clickedDropdown` event', async () => {
+ expect(findDropdownMenu().text()).toContain(stageReply.latest_statuses[0].name);
+ expect(eventHub.$emit).toHaveBeenCalledWith('clickedDropdown');
+ });
+
+ it('should refresh when updateDropdown is set to true', async () => {
+ expect(mock.history.get).toHaveLength(1);
+
+ wrapper.setProps({ updateDropdown: true });
+ await axios.waitForAll();
+
+ expect(mock.history.get).toHaveLength(2);
+ });
+ });
+
+ describe('when user opens dropdown and stage request fails', () => {
+ beforeEach(async () => {
+ mock.onGet(dropdownPath).reply(500);
+ createComponent();
+
+ await openStageDropdown();
+ await axios.waitForAll();
+ });
+
+ it('should close the dropdown', () => {
+ expect(findDropdown().classes('show')).toBe(false);
+ });
+ });
+
+ describe('update endpoint correctly', () => {
+ beforeEach(async () => {
+ const copyStage = { ...stageReply };
+ copyStage.latest_statuses[0].name = 'this is the updated content';
+ mock.onGet('bar.json').reply(200, copyStage);
+ createComponent({
+ stage: {
+ status: {
+ group: 'running',
+ icon: 'status_running',
+ title: 'running',
+ },
+ dropdown_path: 'bar.json',
+ },
+ });
+ await axios.waitForAll();
+ });
+
+ it('should update the stage to request the new endpoint provided', async () => {
+ await openStageDropdown();
+ await axios.waitForAll();
+
+ expect(findDropdownMenu().text()).toContain('this is the updated content');
+ });
+ });
+
+ describe('pipelineActionRequestComplete', () => {
+ beforeEach(() => {
+ mock.onGet(dropdownPath).reply(200, stageReply);
+ mock.onPost(`${stageReply.latest_statuses[0].status.action.path}.json`).reply(200);
+
+ createComponent();
+ });
+
+ const clickCiAction = async () => {
+ await openStageDropdown();
+ await axios.waitForAll();
+
+ findCiActionBtn().trigger('click');
+ await axios.waitForAll();
+ };
+
+ it('closes dropdown when job item action is clicked', async () => {
+ const hidden = jest.fn();
+
+ wrapper.vm.$root.$on('bv::dropdown::hide', hidden);
+
+ expect(hidden).toHaveBeenCalledTimes(0);
+
+ await clickCiAction();
+
+ expect(hidden).toHaveBeenCalledTimes(1);
+ });
+
+ it('emits `pipelineActionRequestComplete` when job item action is clicked', async () => {
+ await clickCiAction();
+
+ expect(wrapper.emitted('pipelineActionRequestComplete')).toHaveLength(1);
+ });
+ });
+
+ describe('With merge trains enabled', () => {
+ beforeEach(async () => {
+ mock.onGet(dropdownPath).reply(200, stageReply);
+ createComponent({
+ isMergeTrain: true,
+ });
+
+ await openStageDropdown();
+ await axios.waitForAll();
+ });
+
+ it('shows a warning on the dropdown', () => {
+ const warning = findMergeTrainWarning();
+
+ expect(warning.text()).toBe('Merge train pipeline jobs can not be retried');
+ });
+ });
+
+ describe('With merge trains disabled', () => {
+ beforeEach(async () => {
+ mock.onGet(dropdownPath).reply(200, stageReply);
+ createComponent();
+
+ await openStageDropdown();
+ await axios.waitForAll();
+ });
+
+ it('does not show a warning on the dropdown', () => {
+ const warning = findMergeTrainWarning();
+
+ expect(warning.exists()).toBe(false);
+ });
+ });
+});
diff --git a/spec/frontend/pipelines/empty_state_spec.js b/spec/frontend/pipelines/empty_state_spec.js
index 3ebedc9ac87..fdbb98dfd55 100644
--- a/spec/frontend/pipelines/empty_state_spec.js
+++ b/spec/frontend/pipelines/empty_state_spec.js
@@ -9,7 +9,6 @@ describe('Pipelines Empty State', () => {
const createWrapper = () => {
wrapper = shallowMount(EmptyState, {
propsData: {
- helpPagePath: 'foo',
emptyStateSvgPath: 'foo',
canSetCi: true,
},
@@ -35,7 +34,7 @@ describe('Pipelines Empty State', () => {
});
it('should render a link with provided help path', () => {
- expect(findGetStartedButton().attributes('href')).toBe('foo');
+ expect(findGetStartedButton().attributes('href')).toBe('/help/ci/quick_start/index.md');
});
it('should render empty state information', () => {
diff --git a/spec/frontend/pipelines/graph/graph_component_spec.js b/spec/frontend/pipelines/graph/graph_component_spec.js
index 3e8d4ba314c..6c3f848333c 100644
--- a/spec/frontend/pipelines/graph/graph_component_spec.js
+++ b/spec/frontend/pipelines/graph/graph_component_spec.js
@@ -20,6 +20,10 @@ describe('graph component', () => {
const defaultProps = {
pipeline: generateResponse(mockPipelineResponse, 'root/fungi-xoxo'),
+ configPaths: {
+ metricsPath: '',
+ graphqlResourceEtag: 'this/is/a/path',
+ },
};
const defaultData = {
diff --git a/spec/frontend/pipelines/graph/graph_component_wrapper_spec.js b/spec/frontend/pipelines/graph/graph_component_wrapper_spec.js
index 202365ecd35..44d8e467f51 100644
--- a/spec/frontend/pipelines/graph/graph_component_wrapper_spec.js
+++ b/spec/frontend/pipelines/graph/graph_component_wrapper_spec.js
@@ -9,6 +9,8 @@ import PipelineGraphWrapper from '~/pipelines/components/graph/graph_component_w
import { mockPipelineResponse } from './mock_data';
const defaultProvide = {
+ graphqlResourceEtag: 'frog/amphibirama/etag/',
+ metricsPath: '',
pipelineProjectPath: 'frog/amphibirama',
pipelineIid: '22',
};
@@ -87,6 +89,13 @@ describe('Pipeline graph wrapper', () => {
it('displays the graph', () => {
expect(getGraph().exists()).toBe(true);
});
+
+ it('passes the etag resource and metrics path to the graph', () => {
+ expect(getGraph().props('configPaths')).toMatchObject({
+ graphqlResourceEtag: defaultProvide.graphqlResourceEtag,
+ metricsPath: defaultProvide.metricsPath,
+ });
+ });
});
describe('when there is an error', () => {
@@ -121,4 +130,48 @@ describe('Pipeline graph wrapper', () => {
expect(wrapper.vm.$apollo.queries.pipeline.refetch).toHaveBeenCalled();
});
});
+
+ describe('when query times out', () => {
+ const advanceApolloTimers = async () => {
+ jest.runOnlyPendingTimers();
+ await wrapper.vm.$nextTick();
+ await wrapper.vm.$nextTick();
+ };
+
+ beforeEach(async () => {
+ const errorData = {
+ data: {
+ project: {
+ pipelines: null,
+ },
+ },
+ errors: [{ message: 'timeout' }],
+ };
+
+ const failSucceedFail = jest
+ .fn()
+ .mockResolvedValueOnce(errorData)
+ .mockResolvedValueOnce(mockPipelineResponse)
+ .mockResolvedValueOnce(errorData);
+
+ createComponentWithApollo(failSucceedFail);
+ await wrapper.vm.$nextTick();
+ });
+
+ it('shows correct errors and does not overwrite populated data when data is empty', async () => {
+ /* fails at first, shows error, no data yet */
+ expect(getAlert().exists()).toBe(true);
+ expect(getGraph().exists()).toBe(false);
+
+ /* succeeds, clears error, shows graph */
+ await advanceApolloTimers();
+ expect(getAlert().exists()).toBe(false);
+ expect(getGraph().exists()).toBe(true);
+
+ /* fails again, alert returns but data persists */
+ await advanceApolloTimers();
+ expect(getAlert().exists()).toBe(true);
+ expect(getGraph().exists()).toBe(true);
+ });
+ });
});
diff --git a/spec/frontend/pipelines/graph/linked_pipelines_column_spec.js b/spec/frontend/pipelines/graph/linked_pipelines_column_spec.js
index 8f01accccc1..edeab883e91 100644
--- a/spec/frontend/pipelines/graph/linked_pipelines_column_spec.js
+++ b/spec/frontend/pipelines/graph/linked_pipelines_column_spec.js
@@ -20,6 +20,10 @@ describe('Linked Pipelines Column', () => {
columnTitle: 'Downstream',
linkedPipelines: processedPipeline.downstream,
type: DOWNSTREAM,
+ configPaths: {
+ metricsPath: '',
+ graphqlResourceEtag: 'this/is/a/path',
+ },
};
let wrapper;
diff --git a/spec/frontend/pipelines/graph_shared/links_inner_spec.js b/spec/frontend/pipelines/graph_shared/links_inner_spec.js
index 6cabe2bc8a7..15a5fbfeffe 100644
--- a/spec/frontend/pipelines/graph_shared/links_inner_spec.js
+++ b/spec/frontend/pipelines/graph_shared/links_inner_spec.js
@@ -1,5 +1,15 @@
import { shallowMount } from '@vue/test-utils';
+import MockAdapter from 'axios-mock-adapter';
import { setHTMLFixture } from 'helpers/fixtures';
+import axios from '~/lib/utils/axios_utils';
+import {
+ PIPELINES_DETAIL_LINK_DURATION,
+ PIPELINES_DETAIL_LINKS_TOTAL,
+ PIPELINES_DETAIL_LINKS_JOB_RATIO,
+} from '~/performance/constants';
+import * as perfUtils from '~/performance/utils';
+import * as sentryUtils from '~/pipelines/components/graph/utils';
+import * as Api from '~/pipelines/components/graph_shared/api';
import LinksInner from '~/pipelines/components/graph_shared/links_inner.vue';
import { createJobsHash } from '~/pipelines/utils';
import {
@@ -18,7 +28,9 @@ describe('Links Inner component', () => {
containerMeasurements: { width: 1019, height: 445 },
pipelineId: 1,
pipelineData: [],
+ totalGroups: 10,
};
+
let wrapper;
const createComponent = (props) => {
@@ -194,4 +206,141 @@ describe('Links Inner component', () => {
expect(firstLink.classes(hoverColorClass)).toBe(true);
});
});
+
+ describe('performance metrics', () => {
+ let markAndMeasure;
+ let reportToSentry;
+ let reportPerformance;
+ let mock;
+
+ beforeEach(() => {
+ mock = new MockAdapter(axios);
+ jest.spyOn(window, 'requestAnimationFrame').mockImplementation((cb) => cb());
+ markAndMeasure = jest.spyOn(perfUtils, 'performanceMarkAndMeasure');
+ reportToSentry = jest.spyOn(sentryUtils, 'reportToSentry');
+ reportPerformance = jest.spyOn(Api, 'reportPerformance');
+ });
+
+ afterEach(() => {
+ mock.restore();
+ });
+
+ describe('with no metrics config object', () => {
+ beforeEach(() => {
+ setFixtures(pipelineData);
+ createComponent({
+ pipelineData: pipelineData.stages,
+ });
+ });
+
+ it('is not called', () => {
+ expect(markAndMeasure).not.toHaveBeenCalled();
+ expect(reportToSentry).not.toHaveBeenCalled();
+ expect(reportPerformance).not.toHaveBeenCalled();
+ });
+ });
+
+ describe('with metrics config set to false', () => {
+ beforeEach(() => {
+ setFixtures(pipelineData);
+ createComponent({
+ pipelineData: pipelineData.stages,
+ metricsConfig: {
+ collectMetrics: false,
+ metricsPath: '/path/to/metrics',
+ },
+ });
+ });
+
+ it('is not called', () => {
+ expect(markAndMeasure).not.toHaveBeenCalled();
+ expect(reportToSentry).not.toHaveBeenCalled();
+ expect(reportPerformance).not.toHaveBeenCalled();
+ });
+ });
+
+ describe('with no metrics path', () => {
+ beforeEach(() => {
+ setFixtures(pipelineData);
+ createComponent({
+ pipelineData: pipelineData.stages,
+ metricsConfig: {
+ collectMetrics: true,
+ metricsPath: '',
+ },
+ });
+ });
+
+ it('is not called', () => {
+ expect(markAndMeasure).not.toHaveBeenCalled();
+ expect(reportToSentry).not.toHaveBeenCalled();
+ expect(reportPerformance).not.toHaveBeenCalled();
+ });
+ });
+
+ describe('with metrics path and collect set to true', () => {
+ const metricsPath = '/root/project/-/ci/prometheus_metrics/histograms.json';
+ const duration = 0.0478;
+ const numLinks = 1;
+ const metricsData = {
+ histograms: [
+ { name: PIPELINES_DETAIL_LINK_DURATION, value: duration },
+ { name: PIPELINES_DETAIL_LINKS_TOTAL, value: numLinks },
+ {
+ name: PIPELINES_DETAIL_LINKS_JOB_RATIO,
+ value: numLinks / defaultProps.totalGroups,
+ },
+ ],
+ };
+
+ describe('when no duration is obtained', () => {
+ beforeEach(() => {
+ jest.spyOn(window.performance, 'getEntriesByName').mockImplementation(() => {
+ return [];
+ });
+
+ setFixtures(pipelineData);
+
+ createComponent({
+ pipelineData: pipelineData.stages,
+ metricsConfig: {
+ collectMetrics: true,
+ path: metricsPath,
+ },
+ });
+ });
+
+ it('attempts to collect metrics', () => {
+ expect(markAndMeasure).toHaveBeenCalled();
+ expect(reportPerformance).not.toHaveBeenCalled();
+ expect(reportToSentry).not.toHaveBeenCalled();
+ });
+ });
+
+ describe('with duration and no error', () => {
+ beforeEach(() => {
+ jest.spyOn(window.performance, 'getEntriesByName').mockImplementation(() => {
+ return [{ duration }];
+ });
+
+ setFixtures(pipelineData);
+
+ createComponent({
+ pipelineData: pipelineData.stages,
+ metricsConfig: {
+ collectMetrics: true,
+ path: metricsPath,
+ },
+ });
+ });
+
+ it('it calls reportPerformance with expected arguments', () => {
+ expect(markAndMeasure).toHaveBeenCalled();
+ expect(reportPerformance).toHaveBeenCalled();
+ expect(reportPerformance).toHaveBeenCalledWith(metricsPath, metricsData);
+ expect(reportToSentry).not.toHaveBeenCalled();
+ });
+ });
+ });
+ });
});
diff --git a/spec/frontend/pipelines/graph_shared/links_layer_spec.js b/spec/frontend/pipelines/graph_shared/links_layer_spec.js
index 0ff8583fbff..43d8fe28893 100644
--- a/spec/frontend/pipelines/graph_shared/links_layer_spec.js
+++ b/spec/frontend/pipelines/graph_shared/links_layer_spec.js
@@ -79,6 +79,24 @@ describe('links layer component', () => {
});
});
+ describe('with width or height measurement at 0', () => {
+ beforeEach(() => {
+ createComponent({ props: { containerMeasurements: { width: 0, height: 100 } } });
+ });
+
+ it('renders the default slot', () => {
+ expect(wrapper.html()).toContain(slotContent);
+ });
+
+ it('does not render the alert component', () => {
+ expect(findAlert().exists()).toBe(false);
+ });
+
+ it('does not render the inner links component', () => {
+ expect(findLinksInner().exists()).toBe(false);
+ });
+ });
+
describe('interactions', () => {
beforeEach(() => {
createComponent({ mountFn: mount, props: { pipelineData: tooManyStages } });
diff --git a/spec/frontend/pipelines/mock_data.js b/spec/frontend/pipelines/mock_data.js
index 2afdbb05107..337838c41b3 100644
--- a/spec/frontend/pipelines/mock_data.js
+++ b/spec/frontend/pipelines/mock_data.js
@@ -2,328 +2,6 @@ const PIPELINE_RUNNING = 'RUNNING';
const PIPELINE_CANCELED = 'CANCELED';
const PIPELINE_FAILED = 'FAILED';
-export const pipelineWithStages = {
- id: 20333396,
- user: {
- id: 128633,
- name: 'Rémy Coutable',
- username: 'rymai',
- state: 'active',
- avatar_url:
- 'https://secure.gravatar.com/avatar/263da227929cc0035cb0eba512bcf81a?s=80\u0026d=identicon',
- web_url: 'https://gitlab.com/rymai',
- path: '/rymai',
- },
- active: true,
- coverage: '58.24',
- source: 'push',
- created_at: '2018-04-11T14:04:53.881Z',
- updated_at: '2018-04-11T14:05:00.792Z',
- path: '/gitlab-org/gitlab/pipelines/20333396',
- flags: {
- latest: true,
- stuck: false,
- auto_devops: false,
- yaml_errors: false,
- retryable: false,
- cancelable: true,
- failure_reason: false,
- },
- details: {
- status: {
- icon: 'status_running',
- text: 'running',
- label: 'running',
- group: 'running',
- has_details: true,
- details_path: '/gitlab-org/gitlab/pipelines/20333396',
- favicon:
- 'https://assets.gitlab-static.net/assets/ci_favicons/favicon_status_running-2eb56be2871937954b2ba6d6f4ee9fdf7e5e1c146ac45f7be98119ccaca1aca9.ico',
- },
- duration: null,
- finished_at: null,
- stages: [
- {
- name: 'build',
- title: 'build: skipped',
- status: {
- icon: 'status_skipped',
- text: 'skipped',
- label: 'skipped',
- group: 'skipped',
- has_details: true,
- details_path: '/gitlab-org/gitlab/pipelines/20333396#build',
- favicon:
- 'https://assets.gitlab-static.net/assets/ci_favicons/favicon_status_skipped-a2eee568a5bffdb494050c7b62dde241de9189280836288ac8923d369f16222d.ico',
- },
- path: '/gitlab-org/gitlab/pipelines/20333396#build',
- dropdown_path: '/gitlab-org/gitlab/pipelines/20333396/stage.json?stage=build',
- },
- {
- name: 'prepare',
- title: 'prepare: passed',
- status: {
- icon: 'status_success',
- text: 'passed',
- label: 'passed',
- group: 'success',
- has_details: true,
- details_path: '/gitlab-org/gitlab/pipelines/20333396#prepare',
- favicon:
- 'https://assets.gitlab-static.net/assets/ci_favicons/favicon_status_success-26f59841becbef8c6fe414e9e74471d8bfd6a91b5855c19fe7f5923a40a7da47.ico',
- },
- path: '/gitlab-org/gitlab/pipelines/20333396#prepare',
- dropdown_path: '/gitlab-org/gitlab/pipelines/20333396/stage.json?stage=prepare',
- },
- {
- name: 'test',
- title: 'test: running',
- status: {
- icon: 'status_running',
- text: 'running',
- label: 'running',
- group: 'running',
- has_details: true,
- details_path: '/gitlab-org/gitlab/pipelines/20333396#test',
- favicon:
- 'https://assets.gitlab-static.net/assets/ci_favicons/favicon_status_running-2eb56be2871937954b2ba6d6f4ee9fdf7e5e1c146ac45f7be98119ccaca1aca9.ico',
- },
- path: '/gitlab-org/gitlab/pipelines/20333396#test',
- dropdown_path: '/gitlab-org/gitlab/pipelines/20333396/stage.json?stage=test',
- },
- {
- name: 'post-test',
- title: 'post-test: created',
- status: {
- icon: 'status_created',
- text: 'created',
- label: 'created',
- group: 'created',
- has_details: true,
- details_path: '/gitlab-org/gitlab/pipelines/20333396#post-test',
- favicon:
- 'https://assets.gitlab-static.net/assets/ci_favicons/favicon_status_created-e997aa0b7db73165df8a9d6803932b18d7b7cc37d604d2d96e378fea2dba9c5f.ico',
- },
- path: '/gitlab-org/gitlab/pipelines/20333396#post-test',
- dropdown_path: '/gitlab-org/gitlab/pipelines/20333396/stage.json?stage=post-test',
- },
- {
- name: 'pages',
- title: 'pages: created',
- status: {
- icon: 'status_created',
- text: 'created',
- label: 'created',
- group: 'created',
- has_details: true,
- details_path: '/gitlab-org/gitlab/pipelines/20333396#pages',
- favicon:
- 'https://assets.gitlab-static.net/assets/ci_favicons/favicon_status_created-e997aa0b7db73165df8a9d6803932b18d7b7cc37d604d2d96e378fea2dba9c5f.ico',
- },
- path: '/gitlab-org/gitlab/pipelines/20333396#pages',
- dropdown_path: '/gitlab-org/gitlab/pipelines/20333396/stage.json?stage=pages',
- },
- {
- name: 'post-cleanup',
- title: 'post-cleanup: created',
- status: {
- icon: 'status_created',
- text: 'created',
- label: 'created',
- group: 'created',
- has_details: true,
- details_path: '/gitlab-org/gitlab/pipelines/20333396#post-cleanup',
- favicon:
- 'https://assets.gitlab-static.net/assets/ci_favicons/favicon_status_created-e997aa0b7db73165df8a9d6803932b18d7b7cc37d604d2d96e378fea2dba9c5f.ico',
- },
- path: '/gitlab-org/gitlab/pipelines/20333396#post-cleanup',
- dropdown_path: '/gitlab-org/gitlab/pipelines/20333396/stage.json?stage=post-cleanup',
- },
- ],
- artifacts: [
- {
- name: 'gitlab:assets:compile',
- expired: false,
- expire_at: '2018-05-12T14:22:54.730Z',
- path: '/gitlab-org/gitlab/-/jobs/62411438/artifacts/download',
- keep_path: '/gitlab-org/gitlab/-/jobs/62411438/artifacts/keep',
- browse_path: '/gitlab-org/gitlab/-/jobs/62411438/artifacts/browse',
- },
- {
- name: 'rspec-mysql 12 28',
- expired: false,
- expire_at: '2018-05-12T14:22:45.136Z',
- path: '/gitlab-org/gitlab/-/jobs/62411397/artifacts/download',
- keep_path: '/gitlab-org/gitlab/-/jobs/62411397/artifacts/keep',
- browse_path: '/gitlab-org/gitlab/-/jobs/62411397/artifacts/browse',
- },
- {
- name: 'rspec-mysql 6 28',
- expired: false,
- expire_at: '2018-05-12T14:22:41.523Z',
- path: '/gitlab-org/gitlab/-/jobs/62411391/artifacts/download',
- keep_path: '/gitlab-org/gitlab/-/jobs/62411391/artifacts/keep',
- browse_path: '/gitlab-org/gitlab/-/jobs/62411391/artifacts/browse',
- },
- {
- name: 'rspec-pg geo 0 1',
- expired: false,
- expire_at: '2018-05-12T14:22:13.287Z',
- path: '/gitlab-org/gitlab/-/jobs/62411353/artifacts/download',
- keep_path: '/gitlab-org/gitlab/-/jobs/62411353/artifacts/keep',
- browse_path: '/gitlab-org/gitlab/-/jobs/62411353/artifacts/browse',
- },
- {
- name: 'rspec-mysql 0 28',
- expired: false,
- expire_at: '2018-05-12T14:22:06.834Z',
- path: '/gitlab-org/gitlab/-/jobs/62411385/artifacts/download',
- keep_path: '/gitlab-org/gitlab/-/jobs/62411385/artifacts/keep',
- browse_path: '/gitlab-org/gitlab/-/jobs/62411385/artifacts/browse',
- },
- {
- name: 'spinach-mysql 0 2',
- expired: false,
- expire_at: '2018-05-12T14:21:51.409Z',
- path: '/gitlab-org/gitlab/-/jobs/62411423/artifacts/download',
- keep_path: '/gitlab-org/gitlab/-/jobs/62411423/artifacts/keep',
- browse_path: '/gitlab-org/gitlab/-/jobs/62411423/artifacts/browse',
- },
- {
- name: 'karma',
- expired: false,
- expire_at: '2018-05-12T14:21:20.934Z',
- path: '/gitlab-org/gitlab/-/jobs/62411440/artifacts/download',
- keep_path: '/gitlab-org/gitlab/-/jobs/62411440/artifacts/keep',
- browse_path: '/gitlab-org/gitlab/-/jobs/62411440/artifacts/browse',
- },
- {
- name: 'spinach-pg 0 2',
- expired: false,
- expire_at: '2018-05-12T14:20:01.028Z',
- path: '/gitlab-org/gitlab/-/jobs/62411419/artifacts/download',
- keep_path: '/gitlab-org/gitlab/-/jobs/62411419/artifacts/keep',
- browse_path: '/gitlab-org/gitlab/-/jobs/62411419/artifacts/browse',
- },
- {
- name: 'spinach-pg 1 2',
- expired: false,
- expire_at: '2018-05-12T14:19:04.336Z',
- path: '/gitlab-org/gitlab/-/jobs/62411421/artifacts/download',
- keep_path: '/gitlab-org/gitlab/-/jobs/62411421/artifacts/keep',
- browse_path: '/gitlab-org/gitlab/-/jobs/62411421/artifacts/browse',
- },
- {
- name: 'sast',
- expired: null,
- expire_at: null,
- path: '/gitlab-org/gitlab/-/jobs/62411442/artifacts/download',
- browse_path: '/gitlab-org/gitlab/-/jobs/62411442/artifacts/browse',
- },
- {
- name: 'code_quality',
- expired: false,
- expire_at: '2018-04-18T14:16:24.484Z',
- path: '/gitlab-org/gitlab/-/jobs/62411441/artifacts/download',
- keep_path: '/gitlab-org/gitlab/-/jobs/62411441/artifacts/keep',
- browse_path: '/gitlab-org/gitlab/-/jobs/62411441/artifacts/browse',
- },
- {
- name: 'cache gems',
- expired: null,
- expire_at: null,
- path: '/gitlab-org/gitlab/-/jobs/62411447/artifacts/download',
- browse_path: '/gitlab-org/gitlab/-/jobs/62411447/artifacts/browse',
- },
- {
- name: 'dependency_scanning',
- expired: null,
- expire_at: null,
- path: '/gitlab-org/gitlab/-/jobs/62411443/artifacts/download',
- browse_path: '/gitlab-org/gitlab/-/jobs/62411443/artifacts/browse',
- },
- {
- name: 'compile-assets',
- expired: false,
- expire_at: '2018-04-18T14:12:07.638Z',
- path: '/gitlab-org/gitlab/-/jobs/62411334/artifacts/download',
- keep_path: '/gitlab-org/gitlab/-/jobs/62411334/artifacts/keep',
- browse_path: '/gitlab-org/gitlab/-/jobs/62411334/artifacts/browse',
- },
- {
- name: 'setup-test-env',
- expired: false,
- expire_at: '2018-04-18T14:10:27.024Z',
- path: '/gitlab-org/gitlab/-/jobs/62411336/artifacts/download',
- keep_path: '/gitlab-org/gitlab/-/jobs/62411336/artifacts/keep',
- browse_path: '/gitlab-org/gitlab/-/jobs/62411336/artifacts/browse',
- },
- {
- name: 'retrieve-tests-metadata',
- expired: false,
- expire_at: '2018-05-12T14:06:35.926Z',
- path: '/gitlab-org/gitlab/-/jobs/62411333/artifacts/download',
- keep_path: '/gitlab-org/gitlab/-/jobs/62411333/artifacts/keep',
- browse_path: '/gitlab-org/gitlab/-/jobs/62411333/artifacts/browse',
- },
- ],
- manual_actions: [
- {
- name: 'package-and-qa',
- path: '/gitlab-org/gitlab/-/jobs/62411330/play',
- playable: true,
- },
- {
- name: 'review-docs-deploy',
- path: '/gitlab-org/gitlab/-/jobs/62411332/play',
- playable: true,
- },
- ],
- },
- ref: {
- name: 'master',
- path: '/gitlab-org/gitlab/commits/master',
- tag: false,
- branch: true,
- },
- commit: {
- id: 'e6a2885c503825792cb8a84a8731295e361bd059',
- short_id: 'e6a2885c',
- title: "Merge branch 'ce-to-ee-2018-04-11' into 'master'",
- created_at: '2018-04-11T14:04:39.000Z',
- parent_ids: [
- '5d9b5118f6055f72cff1a82b88133609912f2c1d',
- '6fdc6ee76a8062fe41b1a33f7c503334a6ebdc02',
- ],
- message:
- "Merge branch 'ce-to-ee-2018-04-11' into 'master'\n\nCE upstream - 2018-04-11 12:26 UTC\n\nSee merge request gitlab-org/gitlab-ee!5326",
- author_name: 'Rémy Coutable',
- author_email: 'remy@rymai.me',
- authored_date: '2018-04-11T14:04:39.000Z',
- committer_name: 'Rémy Coutable',
- committer_email: 'remy@rymai.me',
- committed_date: '2018-04-11T14:04:39.000Z',
- author: {
- id: 128633,
- name: 'Rémy Coutable',
- username: 'rymai',
- state: 'active',
- avatar_url:
- 'https://secure.gravatar.com/avatar/263da227929cc0035cb0eba512bcf81a?s=80\u0026d=identicon',
- web_url: 'https://gitlab.com/rymai',
- path: '/rymai',
- },
- author_gravatar_url:
- 'https://secure.gravatar.com/avatar/263da227929cc0035cb0eba512bcf81a?s=80\u0026d=identicon',
- commit_url:
- 'https://gitlab.com/gitlab-org/gitlab/commit/e6a2885c503825792cb8a84a8731295e361bd059',
- commit_path: '/gitlab-org/gitlab/commit/e6a2885c503825792cb8a84a8731295e361bd059',
- },
- cancel_path: '/gitlab-org/gitlab/pipelines/20333396/cancel',
- triggered_by: null,
- triggered: [],
-};
-
const threeWeeksAgo = new Date();
threeWeeksAgo.setDate(threeWeeksAgo.getDate() - 21);
diff --git a/spec/frontend/pipelines/pipeline_triggerer_spec.js b/spec/frontend/pipelines/pipeline_triggerer_spec.js
index 467a97d95c7..ffb2721f159 100644
--- a/spec/frontend/pipelines/pipeline_triggerer_spec.js
+++ b/spec/frontend/pipelines/pipeline_triggerer_spec.js
@@ -35,8 +35,8 @@ describe('Pipelines Triggerer', () => {
wrapper.destroy();
});
- it('should render a table cell', () => {
- expect(wrapper.find('.table-section').exists()).toBe(true);
+ it('should render pipeline triggerer table cell', () => {
+ expect(wrapper.find('[data-testid="pipeline-triggerer"]').exists()).toBe(true);
});
it('should pass triggerer information when triggerer is provided', () => {
diff --git a/spec/frontend/pipelines/pipeline_url_spec.js b/spec/frontend/pipelines/pipeline_url_spec.js
index 44c9def99cc..367c7f2b2f6 100644
--- a/spec/frontend/pipelines/pipeline_url_spec.js
+++ b/spec/frontend/pipelines/pipeline_url_spec.js
@@ -1,19 +1,20 @@
import { shallowMount } from '@vue/test-utils';
-import $ from 'jquery';
import { trimText } from 'helpers/text_helper';
import PipelineUrlComponent from '~/pipelines/components/pipelines_list/pipeline_url.vue';
-$.fn.popover = () => {};
+const projectPath = 'test/test';
describe('Pipeline Url Component', () => {
let wrapper;
+ const findTableCell = () => wrapper.find('[data-testid="pipeline-url-table-cell"]');
const findPipelineUrlLink = () => wrapper.find('[data-testid="pipeline-url-link"]');
const findScheduledTag = () => wrapper.find('[data-testid="pipeline-url-scheduled"]');
const findLatestTag = () => wrapper.find('[data-testid="pipeline-url-latest"]');
const findYamlTag = () => wrapper.find('[data-testid="pipeline-url-yaml"]');
const findFailureTag = () => wrapper.find('[data-testid="pipeline-url-failure"]');
const findAutoDevopsTag = () => wrapper.find('[data-testid="pipeline-url-autodevops"]');
+ const findAutoDevopsTagLink = () => wrapper.find('[data-testid="pipeline-url-autodevops-link"]');
const findStuckTag = () => wrapper.find('[data-testid="pipeline-url-stuck"]');
const findDetachedTag = () => wrapper.find('[data-testid="pipeline-url-detached"]');
const findForkTag = () => wrapper.find('[data-testid="pipeline-url-fork"]');
@@ -23,9 +24,9 @@ describe('Pipeline Url Component', () => {
pipeline: {
id: 1,
path: 'foo',
+ project: { full_path: `/${projectPath}` },
flags: {},
},
- autoDevopsHelpPath: 'foo',
pipelineScheduleUrl: 'foo',
};
@@ -33,7 +34,7 @@ describe('Pipeline Url Component', () => {
wrapper = shallowMount(PipelineUrlComponent, {
propsData: { ...defaultProps, ...props },
provide: {
- targetProjectFullPath: 'test/test',
+ targetProjectFullPath: projectPath,
},
});
};
@@ -43,10 +44,10 @@ describe('Pipeline Url Component', () => {
wrapper = null;
});
- it('should render a table cell', () => {
+ it('should render pipeline url table cell', () => {
createComponent();
- expect(wrapper.attributes('class')).toContain('table-section');
+ expect(findTableCell().exists()).toBe(true);
});
it('should render a link the provided path and id', () => {
@@ -57,6 +58,19 @@ describe('Pipeline Url Component', () => {
expect(findPipelineUrlLink().text()).toBe('#1');
});
+ it('should not render tags when flags are not set', () => {
+ createComponent();
+
+ expect(findStuckTag().exists()).toBe(false);
+ expect(findLatestTag().exists()).toBe(false);
+ expect(findYamlTag().exists()).toBe(false);
+ expect(findAutoDevopsTag().exists()).toBe(false);
+ expect(findFailureTag().exists()).toBe(false);
+ expect(findScheduledTag().exists()).toBe(false);
+ expect(findForkTag().exists()).toBe(false);
+ expect(findTrainTag().exists()).toBe(false);
+ });
+
it('should render the stuck tag when flag is provided', () => {
createComponent({
pipeline: {
@@ -96,6 +110,7 @@ describe('Pipeline Url Component', () => {
it('should render an autodevops badge when flag is provided', () => {
createComponent({
pipeline: {
+ ...defaultProps.pipeline,
flags: {
auto_devops: true,
},
@@ -103,6 +118,11 @@ describe('Pipeline Url Component', () => {
});
expect(trimText(findAutoDevopsTag().text())).toBe('Auto DevOps');
+
+ expect(findAutoDevopsTagLink().attributes()).toMatchObject({
+ href: '/help/topics/autodevops/index.md',
+ target: '_blank',
+ });
});
it('should render a detached badge when flag is provided', () => {
@@ -147,7 +167,7 @@ describe('Pipeline Url Component', () => {
createComponent({
pipeline: {
flags: {},
- project: { fullPath: 'test/forked' },
+ project: { fullPath: '/test/forked' },
},
});
diff --git a/spec/frontend/pipelines/pipelines_actions_spec.js b/spec/frontend/pipelines/pipelines_actions_spec.js
index 1e6c9e50a7e..c4bfec8ae14 100644
--- a/spec/frontend/pipelines/pipelines_actions_spec.js
+++ b/spec/frontend/pipelines/pipelines_actions_spec.js
@@ -1,11 +1,11 @@
import { GlDropdown, GlDropdownItem } from '@gitlab/ui';
-import { shallowMount, mount } from '@vue/test-utils';
+import { shallowMount } from '@vue/test-utils';
import MockAdapter from 'axios-mock-adapter';
import waitForPromises from 'helpers/wait_for_promises';
import { TEST_HOST } from 'spec/test_constants';
import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
-import PipelinesActions from '~/pipelines/components/pipelines_list/pipelines_actions.vue';
+import PipelinesManualActions from '~/pipelines/components/pipelines_list/pipelines_manual_actions.vue';
import GlCountdown from '~/vue_shared/components/gl_countdown.vue';
jest.mock('~/flash');
@@ -15,7 +15,7 @@ describe('Pipelines Actions dropdown', () => {
let mock;
const createComponent = (props, mountFn = shallowMount) => {
- wrapper = mountFn(PipelinesActions, {
+ wrapper = mountFn(PipelinesManualActions, {
propsData: {
...props,
},
@@ -63,10 +63,6 @@ describe('Pipelines Actions dropdown', () => {
});
describe('on click', () => {
- beforeEach(() => {
- createComponent({ actions: mockActions }, mount);
- });
-
it('makes a request and toggles the loading state', async () => {
mock.onPost(mockActions.path).reply(200);
diff --git a/spec/frontend/pipelines/pipelines_artifacts_spec.js b/spec/frontend/pipelines/pipelines_artifacts_spec.js
index f077833ae16..d4a2db08d97 100644
--- a/spec/frontend/pipelines/pipelines_artifacts_spec.js
+++ b/spec/frontend/pipelines/pipelines_artifacts_spec.js
@@ -1,24 +1,27 @@
-import { GlDropdown, GlDropdownItem } from '@gitlab/ui';
-import { mount } from '@vue/test-utils';
+import { GlDropdown, GlDropdownItem, GlSprintf } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
import PipelineArtifacts from '~/pipelines/components/pipelines_list/pipelines_artifacts.vue';
describe('Pipelines Artifacts dropdown', () => {
let wrapper;
const createComponent = () => {
- wrapper = mount(PipelineArtifacts, {
+ wrapper = shallowMount(PipelineArtifacts, {
propsData: {
artifacts: [
{
- name: 'artifact',
+ name: 'job my-artifact',
path: '/download/path',
},
{
- name: 'artifact two',
+ name: 'job-2 my-artifact-2',
path: '/download/path-two',
},
],
},
+ stubs: {
+ GlSprintf,
+ },
});
};
@@ -39,8 +42,8 @@ describe('Pipelines Artifacts dropdown', () => {
});
it('should render a link with the provided path', () => {
- expect(findFirstGlDropdownItem().find('a').attributes('href')).toEqual('/download/path');
+ expect(findFirstGlDropdownItem().attributes('href')).toBe('/download/path');
- expect(findFirstGlDropdownItem().text()).toContain('artifact');
+ expect(findFirstGlDropdownItem().text()).toBe('Download job my-artifact artifact');
});
});
diff --git a/spec/frontend/pipelines/pipelines_spec.js b/spec/frontend/pipelines/pipelines_spec.js
index 811303a5624..2116d022603 100644
--- a/spec/frontend/pipelines/pipelines_spec.js
+++ b/spec/frontend/pipelines/pipelines_spec.js
@@ -1,4 +1,4 @@
-import { GlFilteredSearch, GlButton, GlLoadingIcon, GlPagination } from '@gitlab/ui';
+import { GlButton, GlFilteredSearch, GlLoadingIcon, GlPagination } from '@gitlab/ui';
import { mount } from '@vue/test-utils';
import MockAdapter from 'axios-mock-adapter';
import { chunk } from 'lodash';
@@ -18,7 +18,7 @@ import Store from '~/pipelines/stores/pipelines_store';
import NavigationTabs from '~/vue_shared/components/navigation_tabs.vue';
import TablePagination from '~/vue_shared/components/pagination/table_pagination.vue';
-import { pipelineWithStages, stageReply, users, mockSearch, branches } from './mock_data';
+import { stageReply, users, mockSearch, branches } from './mock_data';
jest.mock('~/flash');
@@ -27,6 +27,9 @@ const mockProjectId = '21';
const mockPipelinesEndpoint = `/${mockProjectPath}/pipelines.json`;
const mockPipelinesResponse = getJSONFixture('pipelines/pipelines.json');
const mockPipelinesIds = mockPipelinesResponse.pipelines.map(({ id }) => id);
+const mockPipelineWithStages = mockPipelinesResponse.pipelines.find(
+ (p) => p.details.stages && p.details.stages.length,
+);
describe('Pipelines', () => {
let wrapper;
@@ -34,8 +37,6 @@ describe('Pipelines', () => {
let origWindowLocation;
const paths = {
- autoDevopsHelpPath: '/help/topics/autodevops/index.md',
- helpPagePath: '/help/ci/quick_start/README',
emptyStateSvgPath: '/assets/illustrations/pipelines_empty.svg',
errorStateSvgPath: '/assets/illustrations/pipelines_failed.svg',
noPipelinesSvgPath: '/assets/illustrations/pipelines_pending.svg',
@@ -45,8 +46,6 @@ describe('Pipelines', () => {
};
const noPermissions = {
- autoDevopsHelpPath: '/help/topics/autodevops/index.md',
- helpPagePath: '/help/ci/quick_start/README',
emptyStateSvgPath: '/assets/illustrations/pipelines_empty.svg',
errorStateSvgPath: '/assets/illustrations/pipelines_failed.svg',
noPipelinesSvgPath: '/assets/illustrations/pipelines_pending.svg',
@@ -70,7 +69,8 @@ describe('Pipelines', () => {
const findRunPipelineButton = () => wrapper.findByTestId('run-pipeline-button');
const findCiLintButton = () => wrapper.findByTestId('ci-lint-button');
const findCleanCacheButton = () => wrapper.findByTestId('clear-cache-button');
- const findStagesDropdown = () => wrapper.findByTestId('mini-pipeline-graph-dropdown-toggle');
+ const findStagesDropdownToggle = () =>
+ wrapper.find('[data-testid="mini-pipeline-graph-dropdown"] .dropdown-toggle');
const findPipelineUrlLinks = () => wrapper.findAll('[data-testid="pipeline-url-link"]');
const createComponent = (props = defaultProps) => {
@@ -546,7 +546,9 @@ describe('Pipelines', () => {
'GitLab CI/CD can automatically build, test, and deploy your code.',
);
expect(findEmptyState().find(GlButton).text()).toBe('Get started with CI/CD');
- expect(findEmptyState().find(GlButton).attributes('href')).toBe(paths.helpPagePath);
+ expect(findEmptyState().find(GlButton).attributes('href')).toBe(
+ '/help/ci/quick_start/index.md',
+ );
});
it('does not render tabs nor buttons', () => {
@@ -613,14 +615,15 @@ describe('Pipelines', () => {
mock.onGet(mockPipelinesEndpoint, { scope: 'all', page: '1' }).reply(
200,
{
- pipelines: [pipelineWithStages],
+ pipelines: [mockPipelineWithStages],
count: { all: '1' },
},
{
'POLL-INTERVAL': 100,
},
);
- mock.onGet(pipelineWithStages.details.stages[0].dropdown_path).reply(200, stageReply);
+
+ mock.onGet(mockPipelineWithStages.details.stages[0].dropdown_path).reply(200, stageReply);
createComponent();
@@ -640,7 +643,7 @@ describe('Pipelines', () => {
// Mock init a polling cycle
wrapper.vm.poll.options.notificationCallback(true);
- findStagesDropdown().trigger('click');
+ findStagesDropdownToggle().trigger('click');
await waitForPromises();
@@ -650,7 +653,9 @@ describe('Pipelines', () => {
});
it('stops polling & restarts polling', async () => {
- findStagesDropdown().trigger('click');
+ findStagesDropdownToggle().trigger('click');
+
+ await waitForPromises();
expect(cancelMock).not.toHaveBeenCalled();
expect(stopMock).toHaveBeenCalled();
diff --git a/spec/frontend/pipelines/pipelines_table_row_spec.js b/spec/frontend/pipelines/pipelines_table_row_spec.js
index 660651547fc..68d46575081 100644
--- a/spec/frontend/pipelines/pipelines_table_row_spec.js
+++ b/spec/frontend/pipelines/pipelines_table_row_spec.js
@@ -1,4 +1,5 @@
import { mount } from '@vue/test-utils';
+import waitForPromises from 'helpers/wait_for_promises';
import PipelinesTableRowComponent from '~/pipelines/components/pipelines_list/pipelines_table_row.vue';
import eventHub from '~/pipelines/event_hub';
@@ -9,7 +10,6 @@ describe('Pipelines Table Row', () => {
mount(PipelinesTableRowComponent, {
propsData: {
pipeline,
- autoDevopsHelpPath: 'foo',
viewType: 'root',
},
});
@@ -19,8 +19,6 @@ describe('Pipelines Table Row', () => {
let pipelineWithoutAuthor;
let pipelineWithoutCommit;
- preloadFixtures(jsonFixtureName);
-
beforeEach(() => {
const { pipelines } = getJSONFixture(jsonFixtureName);
@@ -149,16 +147,22 @@ describe('Pipelines Table Row', () => {
});
describe('stages column', () => {
- beforeEach(() => {
+ const findAllMiniPipelineStages = () =>
+ wrapper.findAll('.table-section:nth-child(5) [data-testid="mini-pipeline-graph-dropdown"]');
+
+ it('should render an icon for each stage', () => {
wrapper = createWrapper(pipeline);
+
+ expect(findAllMiniPipelineStages()).toHaveLength(pipeline.details.stages.length);
});
- it('should render an icon for each stage', () => {
- expect(
- wrapper.findAll(
- '.table-section:nth-child(4) [data-testid="mini-pipeline-graph-dropdown-toggle"]',
- ).length,
- ).toEqual(pipeline.details.stages.length);
+ it('should not render stages when stages are empty', () => {
+ const withoutStages = { ...pipeline };
+ withoutStages.details = { ...withoutStages.details, stages: null };
+
+ wrapper = createWrapper(withoutStages);
+
+ expect(findAllMiniPipelineStages()).toHaveLength(0);
});
});
@@ -183,9 +187,16 @@ describe('Pipelines Table Row', () => {
expect(wrapper.find('.js-pipelines-retry-button').attributes('title')).toMatch('Retry');
expect(wrapper.find('.js-pipelines-cancel-button').exists()).toBe(true);
expect(wrapper.find('.js-pipelines-cancel-button').attributes('title')).toMatch('Cancel');
- const dropdownMenu = wrapper.find('.dropdown-menu');
+ });
+
+ it('should render the manual actions', async () => {
+ const manualActions = wrapper.find('[data-testid="pipelines-manual-actions-dropdown"]');
+
+ // Click on the dropdown and wait for `lazy` dropdown items
+ manualActions.find('.dropdown-toggle').trigger('click');
+ await waitForPromises();
- expect(dropdownMenu.text()).toContain(scheduledJobAction.name);
+ expect(manualActions.text()).toContain(scheduledJobAction.name);
});
it('emits `retryPipeline` event when retry button is clicked and toggles loading', () => {
diff --git a/spec/frontend/pipelines/pipelines_table_spec.js b/spec/frontend/pipelines/pipelines_table_spec.js
index fd73d507919..952bea81052 100644
--- a/spec/frontend/pipelines/pipelines_table_spec.js
+++ b/spec/frontend/pipelines/pipelines_table_spec.js
@@ -1,5 +1,18 @@
+import { GlTable } from '@gitlab/ui';
import { mount } from '@vue/test-utils';
+import { extendedWrapper } from 'helpers/vue_test_utils_helper';
+import PipelineMiniGraph from '~/pipelines/components/pipelines_list/pipeline_mini_graph.vue';
+import PipelineOperations from '~/pipelines/components/pipelines_list/pipeline_operations.vue';
+import PipelineTriggerer from '~/pipelines/components/pipelines_list/pipeline_triggerer.vue';
+import PipelineUrl from '~/pipelines/components/pipelines_list/pipeline_url.vue';
+import PipelinesStatusBadge from '~/pipelines/components/pipelines_list/pipelines_status_badge.vue';
import PipelinesTable from '~/pipelines/components/pipelines_list/pipelines_table.vue';
+import PipelinesTimeago from '~/pipelines/components/pipelines_list/time_ago.vue';
+
+import eventHub from '~/pipelines/event_hub';
+import CommitComponent from '~/vue_shared/components/commit.vue';
+
+jest.mock('~/pipelines/event_hub');
describe('Pipelines Table', () => {
let pipeline;
@@ -9,24 +22,52 @@ describe('Pipelines Table', () => {
const defaultProps = {
pipelines: [],
- autoDevopsHelpPath: 'foo',
viewType: 'root',
};
- const createComponent = (props = defaultProps) => {
- wrapper = mount(PipelinesTable, {
- propsData: props,
- });
+ const createMockPipeline = () => {
+ const { pipelines } = getJSONFixture(jsonFixtureName);
+ return pipelines.find((p) => p.user !== null && p.commit !== null);
};
- const findRows = () => wrapper.findAll('.commit.gl-responsive-table-row');
- preloadFixtures(jsonFixtureName);
+ const createComponent = (props = {}, flagState = false) => {
+ wrapper = extendedWrapper(
+ mount(PipelinesTable, {
+ propsData: {
+ ...defaultProps,
+ ...props,
+ },
+ provide: {
+ glFeatures: {
+ newPipelinesTable: flagState,
+ },
+ },
+ }),
+ );
+ };
- beforeEach(() => {
- const { pipelines } = getJSONFixture(jsonFixtureName);
- pipeline = pipelines.find((p) => p.user !== null && p.commit !== null);
+ const findRows = () => wrapper.findAll('.commit.gl-responsive-table-row');
+ const findGlTable = () => wrapper.findComponent(GlTable);
+ const findStatusBadge = () => wrapper.findComponent(PipelinesStatusBadge);
+ const findPipelineInfo = () => wrapper.findComponent(PipelineUrl);
+ const findTriggerer = () => wrapper.findComponent(PipelineTriggerer);
+ const findCommit = () => wrapper.findComponent(CommitComponent);
+ const findPipelineMiniGraph = () => wrapper.findComponent(PipelineMiniGraph);
+ const findTimeAgo = () => wrapper.findComponent(PipelinesTimeago);
+ const findActions = () => wrapper.findComponent(PipelineOperations);
+
+ const findLegacyTable = () => wrapper.findByTestId('legacy-ci-table');
+ const findTableRows = () => wrapper.findAll('[data-testid="pipeline-table-row"]');
+ const findStatusTh = () => wrapper.findByTestId('status-th');
+ const findPipelineTh = () => wrapper.findByTestId('pipeline-th');
+ const findTriggererTh = () => wrapper.findByTestId('triggerer-th');
+ const findCommitTh = () => wrapper.findByTestId('commit-th');
+ const findStagesTh = () => wrapper.findByTestId('stages-th');
+ const findTimeAgoTh = () => wrapper.findByTestId('timeago-th');
+ const findActionsTh = () => wrapper.findByTestId('actions-th');
- createComponent();
+ beforeEach(() => {
+ pipeline = createMockPipeline();
});
afterEach(() => {
@@ -34,33 +75,161 @@ describe('Pipelines Table', () => {
wrapper = null;
});
- describe('table', () => {
- it('should render a table', () => {
- expect(wrapper.classes()).toContain('ci-table');
+ describe('table with feature flag off', () => {
+ describe('renders the table correctly', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('should render a table', () => {
+ expect(wrapper.classes()).toContain('ci-table');
+ });
+
+ it('should render table head with correct columns', () => {
+ expect(wrapper.find('.table-section.js-pipeline-status').text()).toEqual('Status');
+
+ expect(wrapper.find('.table-section.js-pipeline-info').text()).toEqual('Pipeline');
+
+ expect(wrapper.find('.table-section.js-pipeline-commit').text()).toEqual('Commit');
+
+ expect(wrapper.find('.table-section.js-pipeline-stages').text()).toEqual('Stages');
+ });
});
- it('should render table head with correct columns', () => {
- expect(wrapper.find('.table-section.js-pipeline-status').text()).toEqual('Status');
+ describe('without data', () => {
+ it('should render an empty table', () => {
+ createComponent();
- expect(wrapper.find('.table-section.js-pipeline-info').text()).toEqual('Pipeline');
+ expect(findRows()).toHaveLength(0);
+ });
+ });
- expect(wrapper.find('.table-section.js-pipeline-commit').text()).toEqual('Commit');
+ describe('with data', () => {
+ it('should render rows', () => {
+ createComponent({ pipelines: [pipeline], viewType: 'root' });
- expect(wrapper.find('.table-section.js-pipeline-stages').text()).toEqual('Stages');
+ expect(findRows()).toHaveLength(1);
+ });
});
});
- describe('without data', () => {
- it('should render an empty table', () => {
- expect(findRows()).toHaveLength(0);
+ describe('table with feature flag on', () => {
+ beforeEach(() => {
+ createComponent({ pipelines: [pipeline], viewType: 'root' }, true);
+ });
+
+ it('displays new table', () => {
+ expect(findGlTable().exists()).toBe(true);
+ expect(findLegacyTable().exists()).toBe(false);
+ });
+
+ it('should render table head with correct columns', () => {
+ expect(findStatusTh().text()).toBe('Status');
+ expect(findPipelineTh().text()).toBe('Pipeline');
+ expect(findTriggererTh().text()).toBe('Triggerer');
+ expect(findCommitTh().text()).toBe('Commit');
+ expect(findStagesTh().text()).toBe('Stages');
+ expect(findTimeAgoTh().text()).toBe('Duration');
+ expect(findActionsTh().text()).toBe('Actions');
+ });
+
+ it('should display a table row', () => {
+ expect(findTableRows()).toHaveLength(1);
});
- });
- describe('with data', () => {
- it('should render rows', () => {
- createComponent({ pipelines: [pipeline], autoDevopsHelpPath: 'foo', viewType: 'root' });
+ describe('status cell', () => {
+ it('should render a status badge', () => {
+ expect(findStatusBadge().exists()).toBe(true);
+ });
+
+ it('should render status badge with correct path', () => {
+ expect(findStatusBadge().attributes('href')).toBe(pipeline.path);
+ });
+ });
+
+ describe('pipeline cell', () => {
+ it('should render pipeline information', () => {
+ expect(findPipelineInfo().exists()).toBe(true);
+ });
+
+ it('should display the pipeline id', () => {
+ expect(findPipelineInfo().text()).toContain(`#${pipeline.id}`);
+ });
+ });
+
+ describe('triggerer cell', () => {
+ it('should render the pipeline triggerer', () => {
+ expect(findTriggerer().exists()).toBe(true);
+ });
+ });
+
+ describe('commit cell', () => {
+ it('should render commit information', () => {
+ expect(findCommit().exists()).toBe(true);
+ });
+
+ it('should display and link to commit', () => {
+ expect(findCommit().text()).toContain(pipeline.commit.short_id);
+ expect(findCommit().props('commitUrl')).toBe(pipeline.commit.commit_path);
+ });
+
+ it('should display the commit author', () => {
+ expect(findCommit().props('author')).toEqual(pipeline.commit.author);
+ });
+ });
+
+ describe('stages cell', () => {
+ it('should render a pipeline mini graph', () => {
+ expect(findPipelineMiniGraph().exists()).toBe(true);
+ });
+
+ it('should render the right number of stages', () => {
+ const stagesLength = pipeline.details.stages.length;
+ expect(
+ findPipelineMiniGraph().findAll('[data-testid="mini-pipeline-graph-dropdown"]'),
+ ).toHaveLength(stagesLength);
+ });
+
+ describe('when pipeline does not have stages', () => {
+ beforeEach(() => {
+ pipeline = createMockPipeline();
+ pipeline.details.stages = null;
+
+ createComponent({ pipelines: [pipeline] }, true);
+ });
+
+ it('stages are not rendered', () => {
+ expect(findPipelineMiniGraph().exists()).toBe(false);
+ });
+ });
+
+ it('should not update dropdown', () => {
+ expect(findPipelineMiniGraph().props('updateDropdown')).toBe(false);
+ });
+
+ it('when update graph dropdown is set, should update graph dropdown', () => {
+ createComponent({ pipelines: [pipeline], updateGraphDropdown: true }, true);
+
+ expect(findPipelineMiniGraph().props('updateDropdown')).toBe(true);
+ });
+
+ it('when action request is complete, should refresh table', () => {
+ findPipelineMiniGraph().vm.$emit('pipelineActionRequestComplete');
+
+ expect(eventHub.$emit).toHaveBeenCalledWith('refreshPipelinesTable');
+ });
+ });
+
+ describe('duration cell', () => {
+ it('should render duration information', () => {
+ expect(findTimeAgo().exists()).toBe(true);
+ });
+ });
- expect(findRows()).toHaveLength(1);
+ describe('operations cell', () => {
+ it('should render pipeline operations', () => {
+ expect(findActions().exists()).toBe(true);
+ });
});
});
});
diff --git a/spec/frontend/pipelines/stage_spec.js b/spec/frontend/pipelines/stage_spec.js
deleted file mode 100644
index 87b43558252..00000000000
--- a/spec/frontend/pipelines/stage_spec.js
+++ /dev/null
@@ -1,297 +0,0 @@
-import 'bootstrap/js/dist/dropdown';
-import { GlDropdown } from '@gitlab/ui';
-import { mount } from '@vue/test-utils';
-import MockAdapter from 'axios-mock-adapter';
-import $ from 'jquery';
-import axios from '~/lib/utils/axios_utils';
-import StageComponent from '~/pipelines/components/pipelines_list/stage.vue';
-import eventHub from '~/pipelines/event_hub';
-import { stageReply } from './mock_data';
-
-describe('Pipelines stage component', () => {
- let wrapper;
- let mock;
- let glFeatures;
-
- const defaultProps = {
- stage: {
- status: {
- group: 'success',
- icon: 'status_success',
- title: 'success',
- },
- dropdown_path: 'path.json',
- },
- updateDropdown: false,
- };
-
- const createComponent = (props = {}) => {
- wrapper = mount(StageComponent, {
- attachTo: document.body,
- propsData: {
- ...defaultProps,
- ...props,
- },
- provide: {
- glFeatures,
- },
- });
- };
-
- beforeEach(() => {
- mock = new MockAdapter(axios);
- jest.spyOn(eventHub, '$emit');
- glFeatures = {};
- });
-
- afterEach(() => {
- wrapper.destroy();
- wrapper = null;
-
- eventHub.$emit.mockRestore();
- mock.restore();
- });
-
- describe('when ci_mini_pipeline_gl_dropdown feature flag is disabled', () => {
- const isDropdownOpen = () => wrapper.classes('show');
-
- describe('default', () => {
- beforeEach(() => {
- createComponent();
- });
-
- it('should render a dropdown with the status icon', () => {
- expect(wrapper.attributes('class')).toEqual('dropdown');
- expect(wrapper.find('svg').exists()).toBe(true);
- expect(wrapper.find('button').attributes('data-toggle')).toEqual('dropdown');
- });
- });
-
- describe('with successful request', () => {
- beforeEach(() => {
- mock.onGet('path.json').reply(200, stageReply);
- createComponent();
- });
-
- it('should render the received data and emit `clickedDropdown` event', async () => {
- wrapper.find('button').trigger('click');
-
- await axios.waitForAll();
- expect(wrapper.find('.js-builds-dropdown-container ul').text()).toContain(
- stageReply.latest_statuses[0].name,
- );
-
- expect(eventHub.$emit).toHaveBeenCalledWith('clickedDropdown');
- });
- });
-
- it('when request fails should close the dropdown', async () => {
- mock.onGet('path.json').reply(500);
- createComponent();
- wrapper.find({ ref: 'dropdown' }).trigger('click');
-
- expect(isDropdownOpen()).toBe(true);
-
- wrapper.find('button').trigger('click');
- await axios.waitForAll();
-
- expect(isDropdownOpen()).toBe(false);
- });
-
- describe('update endpoint correctly', () => {
- beforeEach(() => {
- const copyStage = { ...stageReply };
- copyStage.latest_statuses[0].name = 'this is the updated content';
- mock.onGet('bar.json').reply(200, copyStage);
- createComponent({
- stage: {
- status: {
- group: 'running',
- icon: 'status_running',
- title: 'running',
- },
- dropdown_path: 'bar.json',
- },
- });
- return axios.waitForAll();
- });
-
- it('should update the stage to request the new endpoint provided', async () => {
- wrapper.find('button').trigger('click');
- await axios.waitForAll();
-
- expect(wrapper.find('.js-builds-dropdown-container ul').text()).toContain(
- 'this is the updated content',
- );
- });
- });
-
- describe('pipelineActionRequestComplete', () => {
- beforeEach(() => {
- mock.onGet('path.json').reply(200, stageReply);
- mock.onPost(`${stageReply.latest_statuses[0].status.action.path}.json`).reply(200);
- });
-
- const clickCiAction = async () => {
- wrapper.find('button').trigger('click');
- await axios.waitForAll();
-
- wrapper.find('.js-ci-action').trigger('click');
- await axios.waitForAll();
- };
-
- describe('within pipeline table', () => {
- it('emits `refreshPipelinesTable` event when `pipelineActionRequestComplete` is triggered', async () => {
- createComponent({ type: 'PIPELINES_TABLE' });
-
- await clickCiAction();
-
- expect(eventHub.$emit).toHaveBeenCalledWith('refreshPipelinesTable');
- });
- });
-
- describe('in MR widget', () => {
- beforeEach(() => {
- jest.spyOn($.fn, 'dropdown');
- });
-
- it('closes the dropdown when `pipelineActionRequestComplete` is triggered', async () => {
- createComponent();
-
- await clickCiAction();
-
- expect($.fn.dropdown).toHaveBeenCalledWith('toggle');
- });
- });
- });
- });
-
- describe('when ci_mini_pipeline_gl_dropdown feature flag is enabled', () => {
- const findDropdown = () => wrapper.find(GlDropdown);
- const findDropdownToggle = () => wrapper.find('button.gl-dropdown-toggle');
- const findDropdownMenu = () =>
- wrapper.find('[data-testid="mini-pipeline-graph-dropdown-menu-list"]');
- const findCiActionBtn = () => wrapper.find('.js-ci-action');
-
- const openGlDropdown = () => {
- findDropdownToggle().trigger('click');
- return new Promise((resolve) => {
- wrapper.vm.$root.$on('bv::dropdown::show', resolve);
- });
- };
-
- beforeEach(() => {
- glFeatures = { ciMiniPipelineGlDropdown: true };
- });
-
- describe('default', () => {
- beforeEach(() => {
- createComponent();
- });
-
- it('should render a dropdown with the status icon', () => {
- expect(findDropdown().exists()).toBe(true);
- expect(findDropdownToggle().classes('gl-dropdown-toggle')).toEqual(true);
- expect(wrapper.find('[data-testid="status_success_borderless-icon"]').exists()).toBe(true);
- });
- });
-
- describe('with successful request', () => {
- beforeEach(() => {
- mock.onGet('path.json').reply(200, stageReply);
- createComponent();
- });
-
- it('should render the received data and emit `clickedDropdown` event', async () => {
- await openGlDropdown();
- await axios.waitForAll();
-
- expect(findDropdownMenu().text()).toContain(stageReply.latest_statuses[0].name);
- expect(eventHub.$emit).toHaveBeenCalledWith('clickedDropdown');
- });
- });
-
- it('when request fails should close the dropdown', async () => {
- mock.onGet('path.json').reply(500);
-
- createComponent();
-
- await openGlDropdown();
- await axios.waitForAll();
-
- expect(findDropdown().classes('show')).toBe(false);
- });
-
- describe('update endpoint correctly', () => {
- beforeEach(async () => {
- const copyStage = { ...stageReply };
- copyStage.latest_statuses[0].name = 'this is the updated content';
- mock.onGet('bar.json').reply(200, copyStage);
- createComponent({
- stage: {
- status: {
- group: 'running',
- icon: 'status_running',
- title: 'running',
- },
- dropdown_path: 'bar.json',
- },
- });
- await axios.waitForAll();
- });
-
- it('should update the stage to request the new endpoint provided', async () => {
- await openGlDropdown();
- await axios.waitForAll();
-
- expect(findDropdownMenu().text()).toContain('this is the updated content');
- });
- });
-
- describe('pipelineActionRequestComplete', () => {
- beforeEach(() => {
- mock.onGet('path.json').reply(200, stageReply);
- mock.onPost(`${stageReply.latest_statuses[0].status.action.path}.json`).reply(200);
- });
-
- const clickCiAction = async () => {
- await openGlDropdown();
- await axios.waitForAll();
-
- findCiActionBtn().trigger('click');
- await axios.waitForAll();
- };
-
- describe('within pipeline table', () => {
- beforeEach(() => {
- createComponent({ type: 'PIPELINES_TABLE' });
- });
-
- it('emits `refreshPipelinesTable` event when `pipelineActionRequestComplete` is triggered', async () => {
- await clickCiAction();
-
- expect(eventHub.$emit).toHaveBeenCalledWith('refreshPipelinesTable');
- });
- });
-
- describe('in MR widget', () => {
- beforeEach(() => {
- jest.spyOn($.fn, 'dropdown');
- createComponent();
- });
-
- it('closes the dropdown when `pipelineActionRequestComplete` is triggered', async () => {
- const hidden = jest.fn();
-
- wrapper.vm.$root.$on('bv::dropdown::hide', hidden);
-
- expect(hidden).toHaveBeenCalledTimes(0);
-
- await clickCiAction();
-
- expect(hidden).toHaveBeenCalledTimes(1);
- });
- });
- });
- });
-});
diff --git a/spec/frontend/pipelines/time_ago_spec.js b/spec/frontend/pipelines/time_ago_spec.js
index 55a19ef5165..4919efbb4c6 100644
--- a/spec/frontend/pipelines/time_ago_spec.js
+++ b/spec/frontend/pipelines/time_ago_spec.js
@@ -8,7 +8,11 @@ describe('Timeago component', () => {
const createComponent = (props = {}) => {
wrapper = shallowMount(TimeAgo, {
propsData: {
- ...props,
+ pipeline: {
+ details: {
+ ...props,
+ },
+ },
},
data() {
return {
@@ -28,7 +32,7 @@ describe('Timeago component', () => {
describe('with duration', () => {
beforeEach(() => {
- createComponent({ duration: 10, finishedTime: '' });
+ createComponent({ duration: 10, finished_at: '' });
});
it('should render duration and timer svg', () => {
@@ -41,7 +45,7 @@ describe('Timeago component', () => {
describe('without duration', () => {
beforeEach(() => {
- createComponent({ duration: 0, finishedTime: '' });
+ createComponent({ duration: 0, finished_at: '' });
});
it('should not render duration and timer svg', () => {
@@ -51,7 +55,7 @@ describe('Timeago component', () => {
describe('with finishedTime', () => {
beforeEach(() => {
- createComponent({ duration: 0, finishedTime: '2017-04-26T12:40:23.277Z' });
+ createComponent({ duration: 0, finished_at: '2017-04-26T12:40:23.277Z' });
});
it('should render time and calendar icon', () => {
@@ -66,7 +70,7 @@ describe('Timeago component', () => {
describe('without finishedTime', () => {
beforeEach(() => {
- createComponent({ duration: 0, finishedTime: '' });
+ createComponent({ duration: 0, finished_at: '' });
});
it('should not render time and calendar icon', () => {
diff --git a/spec/frontend/pipelines_spec.js b/spec/frontend/pipelines_spec.js
index 6d4d634c575..add91fbcc23 100644
--- a/spec/frontend/pipelines_spec.js
+++ b/spec/frontend/pipelines_spec.js
@@ -1,8 +1,6 @@
import Pipelines from '~/pipelines';
describe('Pipelines', () => {
- preloadFixtures('static/pipeline_graph.html');
-
beforeEach(() => {
loadFixtures('static/pipeline_graph.html');
});
diff --git a/spec/frontend/profile/account/components/update_username_spec.js b/spec/frontend/profile/account/components/update_username_spec.js
index 8295d1d43cf..a3d7b63373c 100644
--- a/spec/frontend/profile/account/components/update_username_spec.js
+++ b/spec/frontend/profile/account/components/update_username_spec.js
@@ -2,10 +2,13 @@ import { GlModal } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import MockAdapter from 'axios-mock-adapter';
import { TEST_HOST } from 'helpers/test_constants';
+import { deprecatedCreateFlash as createFlash } from '~/flash';
import axios from '~/lib/utils/axios_utils';
import UpdateUsername from '~/profile/account/components/update_username.vue';
+jest.mock('~/flash');
+
describe('UpdateUsername component', () => {
const rootUrl = TEST_HOST;
const actionUrl = `${TEST_HOST}/update/username`;
@@ -105,7 +108,8 @@ describe('UpdateUsername component', () => {
axiosMock.onPut(actionUrl).replyOnce(() => {
expect(input.attributes('disabled')).toBe('disabled');
- expect(openModalBtn.props('disabled')).toBe(true);
+ expect(openModalBtn.props('disabled')).toBe(false);
+ expect(openModalBtn.props('loading')).toBe(true);
return [200, { message: 'Username changed' }];
});
@@ -115,6 +119,7 @@ describe('UpdateUsername component', () => {
expect(input.attributes('disabled')).toBe(undefined);
expect(openModalBtn.props('disabled')).toBe(true);
+ expect(openModalBtn.props('loading')).toBe(false);
});
it('does not set the username after a erroneous update', async () => {
@@ -122,7 +127,8 @@ describe('UpdateUsername component', () => {
axiosMock.onPut(actionUrl).replyOnce(() => {
expect(input.attributes('disabled')).toBe('disabled');
- expect(openModalBtn.props('disabled')).toBe(true);
+ expect(openModalBtn.props('disabled')).toBe(false);
+ expect(openModalBtn.props('loading')).toBe(true);
return [400, { message: 'Invalid username' }];
});
@@ -130,6 +136,29 @@ describe('UpdateUsername component', () => {
await expect(wrapper.vm.onConfirm()).rejects.toThrow();
expect(input.attributes('disabled')).toBe(undefined);
expect(openModalBtn.props('disabled')).toBe(false);
+ expect(openModalBtn.props('loading')).toBe(false);
+ });
+
+ it('shows an error message if the error response has a `message` property', async () => {
+ axiosMock.onPut(actionUrl).replyOnce(() => {
+ return [400, { message: 'Invalid username' }];
+ });
+
+ await expect(wrapper.vm.onConfirm()).rejects.toThrow();
+
+ expect(createFlash).toBeCalledWith('Invalid username');
+ });
+
+ it("shows a fallback error message if the error response doesn't have a `message` property", async () => {
+ axiosMock.onPut(actionUrl).replyOnce(() => {
+ return [400];
+ });
+
+ await expect(wrapper.vm.onConfirm()).rejects.toThrow();
+
+ expect(createFlash).toBeCalledWith(
+ 'An error occurred while updating your username, please try again.',
+ );
});
});
});
diff --git a/spec/frontend/profile/preferences/components/profile_preferences_spec.js b/spec/frontend/profile/preferences/components/profile_preferences_spec.js
index 82c41178410..9e6f5594d26 100644
--- a/spec/frontend/profile/preferences/components/profile_preferences_spec.js
+++ b/spec/frontend/profile/preferences/components/profile_preferences_spec.js
@@ -1,10 +1,19 @@
import { GlButton } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
+import { nextTick } from 'vue';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import IntegrationView from '~/profile/preferences/components/integration_view.vue';
import ProfilePreferences from '~/profile/preferences/components/profile_preferences.vue';
import { i18n } from '~/profile/preferences/constants';
-import { integrationViews, userFields, bodyClasses } from '../mock_data';
+import {
+ integrationViews,
+ userFields,
+ bodyClasses,
+ themes,
+ lightModeThemeId1,
+ darkModeThemeId,
+ lightModeThemeId2,
+} from '../mock_data';
const expectedUrl = '/foo';
@@ -14,7 +23,7 @@ describe('ProfilePreferences component', () => {
integrationViews: [],
userFields,
bodyClasses,
- themes: [{ id: 1, css_class: 'foo' }],
+ themes,
profilePreferencesPath: '/update-profile',
formEl: document.createElement('form'),
};
@@ -49,6 +58,30 @@ describe('ProfilePreferences component', () => {
return document.querySelector('.flash-container .flash-text');
}
+ function createThemeInput(themeId = lightModeThemeId1) {
+ const input = document.createElement('input');
+ input.setAttribute('name', 'user[theme_id]');
+ input.setAttribute('type', 'radio');
+ input.setAttribute('value', themeId.toString());
+ input.setAttribute('checked', 'checked');
+ return input;
+ }
+
+ function createForm(themeInput = createThemeInput()) {
+ const form = document.createElement('form');
+ form.setAttribute('url', expectedUrl);
+ form.setAttribute('method', 'put');
+ form.appendChild(themeInput);
+ return form;
+ }
+
+ function setupBody() {
+ const div = document.createElement('div');
+ div.classList.add('container-fluid');
+ document.body.appendChild(div);
+ document.body.classList.add('content-wrapper');
+ }
+
beforeEach(() => {
setFixtures('<div class="flash-container"></div>');
});
@@ -84,30 +117,15 @@ describe('ProfilePreferences component', () => {
let form;
beforeEach(() => {
- const div = document.createElement('div');
- div.classList.add('container-fluid');
- document.body.appendChild(div);
- document.body.classList.add('content-wrapper');
-
- form = document.createElement('form');
- form.setAttribute('url', expectedUrl);
- form.setAttribute('method', 'put');
-
- const input = document.createElement('input');
- input.setAttribute('name', 'user[theme_id]');
- input.setAttribute('type', 'radio');
- input.setAttribute('value', '1');
- input.setAttribute('checked', 'checked');
- form.appendChild(input);
-
+ setupBody();
+ form = createForm();
wrapper = createComponent({ provide: { formEl: form }, attachTo: document.body });
-
const beforeSendEvent = new CustomEvent('ajax:beforeSend');
form.dispatchEvent(beforeSendEvent);
});
it('disables the submit button', async () => {
- await wrapper.vm.$nextTick();
+ await nextTick();
const button = findSubmitButton();
expect(button.props('disabled')).toBe(true);
});
@@ -116,7 +134,7 @@ describe('ProfilePreferences component', () => {
const successEvent = new CustomEvent('ajax:success');
form.dispatchEvent(successEvent);
- await wrapper.vm.$nextTick();
+ await nextTick();
const button = findSubmitButton();
expect(button.props('disabled')).toBe(false);
});
@@ -125,7 +143,7 @@ describe('ProfilePreferences component', () => {
const errorEvent = new CustomEvent('ajax:error');
form.dispatchEvent(errorEvent);
- await wrapper.vm.$nextTick();
+ await nextTick();
const button = findSubmitButton();
expect(button.props('disabled')).toBe(false);
});
@@ -160,4 +178,89 @@ describe('ProfilePreferences component', () => {
expect(findFlashError().innerText.trim()).toEqual(message);
});
});
+
+ describe('theme changes', () => {
+ const { location } = window;
+
+ let themeInput;
+ let form;
+
+ function setupWrapper() {
+ wrapper = createComponent({ provide: { formEl: form }, attachTo: document.body });
+ }
+
+ function selectThemeId(themeId) {
+ themeInput.setAttribute('value', themeId.toString());
+ }
+
+ function dispatchBeforeSendEvent() {
+ const beforeSendEvent = new CustomEvent('ajax:beforeSend');
+ form.dispatchEvent(beforeSendEvent);
+ }
+
+ function dispatchSuccessEvent() {
+ const successEvent = new CustomEvent('ajax:success');
+ form.dispatchEvent(successEvent);
+ }
+
+ beforeAll(() => {
+ delete window.location;
+ window.location = {
+ ...location,
+ reload: jest.fn(),
+ };
+ });
+
+ afterAll(() => {
+ window.location = location;
+ });
+
+ beforeEach(() => {
+ setupBody();
+ themeInput = createThemeInput();
+ form = createForm(themeInput);
+ });
+
+ it('reloads the page when switching from light to dark mode', async () => {
+ selectThemeId(lightModeThemeId1);
+ setupWrapper();
+
+ selectThemeId(darkModeThemeId);
+ dispatchBeforeSendEvent();
+ await nextTick();
+
+ dispatchSuccessEvent();
+ await nextTick();
+
+ expect(window.location.reload).toHaveBeenCalledTimes(1);
+ });
+
+ it('reloads the page when switching from dark to light mode', async () => {
+ selectThemeId(darkModeThemeId);
+ setupWrapper();
+
+ selectThemeId(lightModeThemeId1);
+ dispatchBeforeSendEvent();
+ await nextTick();
+
+ dispatchSuccessEvent();
+ await nextTick();
+
+ expect(window.location.reload).toHaveBeenCalledTimes(1);
+ });
+
+ it('does not reload the page when switching between light mode themes', async () => {
+ selectThemeId(lightModeThemeId1);
+ setupWrapper();
+
+ selectThemeId(lightModeThemeId2);
+ dispatchBeforeSendEvent();
+ await nextTick();
+
+ dispatchSuccessEvent();
+ await nextTick();
+
+ expect(window.location.reload).not.toHaveBeenCalled();
+ });
+ });
});
diff --git a/spec/frontend/profile/preferences/mock_data.js b/spec/frontend/profile/preferences/mock_data.js
index ce33fc79a39..91cfdfadc78 100644
--- a/spec/frontend/profile/preferences/mock_data.js
+++ b/spec/frontend/profile/preferences/mock_data.js
@@ -18,3 +18,15 @@ export const userFields = {
};
export const bodyClasses = 'ui-light-indigo ui-light gl-dark';
+
+export const themes = [
+ { id: 1, css_class: 'foo' },
+ { id: 2, css_class: 'bar' },
+ { id: 3, css_class: 'gl-dark' },
+];
+
+export const lightModeThemeId1 = 1;
+
+export const lightModeThemeId2 = 2;
+
+export const darkModeThemeId = 3;
diff --git a/spec/frontend/project_select_combo_button_spec.js b/spec/frontend/project_select_combo_button_spec.js
index c47db71b4ac..5cdc3d174a1 100644
--- a/spec/frontend/project_select_combo_button_spec.js
+++ b/spec/frontend/project_select_combo_button_spec.js
@@ -10,8 +10,6 @@ describe('Project Select Combo Button', () => {
testContext = {};
});
- preloadFixtures(fixturePath);
-
beforeEach(() => {
testContext.defaults = {
label: 'Select project to create issue',
diff --git a/spec/frontend/projects/compare/components/app_legacy_spec.js b/spec/frontend/projects/compare/components/app_legacy_spec.js
new file mode 100644
index 00000000000..4c7f0d5cccc
--- /dev/null
+++ b/spec/frontend/projects/compare/components/app_legacy_spec.js
@@ -0,0 +1,116 @@
+import { GlButton } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import CompareApp from '~/projects/compare/components/app_legacy.vue';
+import RevisionDropdown from '~/projects/compare/components/revision_dropdown_legacy.vue';
+
+jest.mock('~/lib/utils/csrf', () => ({ token: 'mock-csrf-token' }));
+
+const projectCompareIndexPath = 'some/path';
+const refsProjectPath = 'some/refs/path';
+const paramsFrom = 'master';
+const paramsTo = 'master';
+
+describe('CompareApp component', () => {
+ let wrapper;
+
+ const createComponent = (props = {}) => {
+ wrapper = shallowMount(CompareApp, {
+ propsData: {
+ projectCompareIndexPath,
+ refsProjectPath,
+ paramsFrom,
+ paramsTo,
+ projectMergeRequestPath: '',
+ createMrPath: '',
+ ...props,
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ });
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('renders component with prop', () => {
+ expect(wrapper.props()).toEqual(
+ expect.objectContaining({
+ projectCompareIndexPath,
+ refsProjectPath,
+ paramsFrom,
+ paramsTo,
+ }),
+ );
+ });
+
+ it('contains the correct form attributes', () => {
+ expect(wrapper.attributes('action')).toBe(projectCompareIndexPath);
+ expect(wrapper.attributes('method')).toBe('POST');
+ });
+
+ it('has input with csrf token', () => {
+ expect(wrapper.find('input[name="authenticity_token"]').attributes('value')).toBe(
+ 'mock-csrf-token',
+ );
+ });
+
+ it('has ellipsis', () => {
+ expect(wrapper.find('[data-testid="ellipsis"]').exists()).toBe(true);
+ });
+
+ it('render Source and Target BranchDropdown components', () => {
+ const branchDropdowns = wrapper.findAll(RevisionDropdown);
+
+ expect(branchDropdowns.length).toBe(2);
+ expect(branchDropdowns.at(0).props('revisionText')).toBe('Source');
+ expect(branchDropdowns.at(1).props('revisionText')).toBe('Target');
+ });
+
+ describe('compare button', () => {
+ const findCompareButton = () => wrapper.find(GlButton);
+
+ it('renders button', () => {
+ expect(findCompareButton().exists()).toBe(true);
+ });
+
+ it('submits form', () => {
+ findCompareButton().vm.$emit('click');
+ expect(wrapper.find('form').element.submit).toHaveBeenCalled();
+ });
+
+ it('has compare text', () => {
+ expect(findCompareButton().text()).toBe('Compare');
+ });
+ });
+
+ describe('merge request buttons', () => {
+ const findProjectMrButton = () => wrapper.find('[data-testid="projectMrButton"]');
+ const findCreateMrButton = () => wrapper.find('[data-testid="createMrButton"]');
+
+ it('does not have merge request buttons', () => {
+ createComponent();
+ expect(findProjectMrButton().exists()).toBe(false);
+ expect(findCreateMrButton().exists()).toBe(false);
+ });
+
+ it('has "View open merge request" button', () => {
+ createComponent({
+ projectMergeRequestPath: 'some/project/merge/request/path',
+ });
+ expect(findProjectMrButton().exists()).toBe(true);
+ expect(findCreateMrButton().exists()).toBe(false);
+ });
+
+ it('has "Create merge request" button', () => {
+ createComponent({
+ createMrPath: 'some/create/create/mr/path',
+ });
+ expect(findProjectMrButton().exists()).toBe(false);
+ expect(findCreateMrButton().exists()).toBe(true);
+ });
+ });
+});
diff --git a/spec/frontend/projects/compare/components/app_spec.js b/spec/frontend/projects/compare/components/app_spec.js
index d28a30e93b1..6de06e4373c 100644
--- a/spec/frontend/projects/compare/components/app_spec.js
+++ b/spec/frontend/projects/compare/components/app_spec.js
@@ -1,7 +1,7 @@
import { GlButton } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import CompareApp from '~/projects/compare/components/app.vue';
-import RevisionDropdown from '~/projects/compare/components/revision_dropdown.vue';
+import RevisionCard from '~/projects/compare/components/revision_card.vue';
jest.mock('~/lib/utils/csrf', () => ({ token: 'mock-csrf-token' }));
@@ -63,11 +63,11 @@ describe('CompareApp component', () => {
});
it('render Source and Target BranchDropdown components', () => {
- const branchDropdowns = wrapper.findAll(RevisionDropdown);
+ const revisionCards = wrapper.findAll(RevisionCard);
- expect(branchDropdowns.length).toBe(2);
- expect(branchDropdowns.at(0).props('revisionText')).toBe('Source');
- expect(branchDropdowns.at(1).props('revisionText')).toBe('Target');
+ expect(revisionCards.length).toBe(2);
+ expect(revisionCards.at(0).props('revisionText')).toBe('Source');
+ expect(revisionCards.at(1).props('revisionText')).toBe('Target');
});
describe('compare button', () => {
diff --git a/spec/frontend/projects/compare/components/repo_dropdown_spec.js b/spec/frontend/projects/compare/components/repo_dropdown_spec.js
new file mode 100644
index 00000000000..af76632515c
--- /dev/null
+++ b/spec/frontend/projects/compare/components/repo_dropdown_spec.js
@@ -0,0 +1,98 @@
+import { GlDropdown } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import RepoDropdown from '~/projects/compare/components/repo_dropdown.vue';
+
+const defaultProps = {
+ paramsName: 'to',
+};
+
+const projectToId = '1';
+const projectToName = 'some-to-name';
+const projectFromId = '2';
+const projectFromName = 'some-from-name';
+
+const defaultProvide = {
+ projectTo: { id: projectToId, name: projectToName },
+ projectsFrom: [
+ { id: projectFromId, name: projectFromName },
+ { id: 3, name: 'some-from-another-name' },
+ ],
+};
+
+describe('RepoDropdown component', () => {
+ let wrapper;
+
+ const createComponent = (props = {}, provide = {}) => {
+ wrapper = shallowMount(RepoDropdown, {
+ propsData: {
+ ...defaultProps,
+ ...props,
+ },
+ provide: {
+ ...defaultProvide,
+ ...provide,
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ });
+
+ const findGlDropdown = () => wrapper.find(GlDropdown);
+ const findHiddenInput = () => wrapper.find('input[type="hidden"]');
+
+ describe('Source Revision', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('set hidden input', () => {
+ expect(findHiddenInput().attributes('value')).toBe(projectToId);
+ });
+
+ it('displays the project name in the disabled dropdown', () => {
+ expect(findGlDropdown().props('text')).toBe(projectToName);
+ expect(findGlDropdown().props('disabled')).toBe(true);
+ });
+
+ it('does not emit `changeTargetProject` event', async () => {
+ wrapper.vm.emitTargetProject('foo');
+ await wrapper.vm.$nextTick();
+ expect(wrapper.emitted('changeTargetProject')).toBeUndefined();
+ });
+ });
+
+ describe('Target Revision', () => {
+ beforeEach(() => {
+ createComponent({ paramsName: 'from' });
+ });
+
+ it('set hidden input of the first project', () => {
+ expect(findHiddenInput().attributes('value')).toBe(projectFromId);
+ });
+
+ it('displays the first project name initially in the dropdown', () => {
+ expect(findGlDropdown().props('text')).toBe(projectFromName);
+ });
+
+ it('updates the hiddin input value when onClick method is triggered', async () => {
+ const repoId = '100';
+ wrapper.vm.onClick({ id: repoId });
+ await wrapper.vm.$nextTick();
+ expect(findHiddenInput().attributes('value')).toBe(repoId);
+ });
+
+ it('emits initial `changeTargetProject` event with target project', () => {
+ expect(wrapper.emitted('changeTargetProject')).toEqual([[projectFromName]]);
+ });
+
+ it('emits `changeTargetProject` event when another target project is selected', async () => {
+ const newTargetProject = 'new-from-name';
+ wrapper.vm.$emit('changeTargetProject', newTargetProject);
+ await wrapper.vm.$nextTick();
+ expect(wrapper.emitted('changeTargetProject')[1]).toEqual([newTargetProject]);
+ });
+ });
+});
diff --git a/spec/frontend/projects/compare/components/revision_card_spec.js b/spec/frontend/projects/compare/components/revision_card_spec.js
new file mode 100644
index 00000000000..83f858f4454
--- /dev/null
+++ b/spec/frontend/projects/compare/components/revision_card_spec.js
@@ -0,0 +1,49 @@
+import { GlCard } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import RepoDropdown from '~/projects/compare/components/repo_dropdown.vue';
+import RevisionCard from '~/projects/compare/components/revision_card.vue';
+import RevisionDropdown from '~/projects/compare/components/revision_dropdown.vue';
+
+const defaultProps = {
+ refsProjectPath: 'some/refs/path',
+ revisionText: 'Source',
+ paramsName: 'to',
+ paramsBranch: 'master',
+};
+
+describe('RepoDropdown component', () => {
+ let wrapper;
+
+ const createComponent = (props = {}) => {
+ wrapper = shallowMount(RevisionCard, {
+ propsData: {
+ ...defaultProps,
+ ...props,
+ },
+ stubs: {
+ GlCard,
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ });
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('displays revision text', () => {
+ expect(wrapper.find(GlCard).text()).toContain(defaultProps.revisionText);
+ });
+
+ it('renders RepoDropdown component', () => {
+ expect(wrapper.findAll(RepoDropdown).exists()).toBe(true);
+ });
+
+ it('renders RevisionDropdown component', () => {
+ expect(wrapper.findAll(RevisionDropdown).exists()).toBe(true);
+ });
+});
diff --git a/spec/frontend/projects/compare/components/revision_dropdown_legacy_spec.js b/spec/frontend/projects/compare/components/revision_dropdown_legacy_spec.js
new file mode 100644
index 00000000000..270c89e674c
--- /dev/null
+++ b/spec/frontend/projects/compare/components/revision_dropdown_legacy_spec.js
@@ -0,0 +1,106 @@
+import { GlDropdown } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import AxiosMockAdapter from 'axios-mock-adapter';
+import createFlash from '~/flash';
+import axios from '~/lib/utils/axios_utils';
+import RevisionDropdown from '~/projects/compare/components/revision_dropdown_legacy.vue';
+
+const defaultProps = {
+ refsProjectPath: 'some/refs/path',
+ revisionText: 'Target',
+ paramsName: 'from',
+ paramsBranch: 'master',
+};
+
+jest.mock('~/flash');
+
+describe('RevisionDropdown component', () => {
+ let wrapper;
+ let axiosMock;
+
+ const createComponent = (props = {}) => {
+ wrapper = shallowMount(RevisionDropdown, {
+ propsData: {
+ ...defaultProps,
+ ...props,
+ },
+ });
+ };
+
+ beforeEach(() => {
+ axiosMock = new AxiosMockAdapter(axios);
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ axiosMock.restore();
+ });
+
+ const findGlDropdown = () => wrapper.find(GlDropdown);
+
+ it('sets hidden input', () => {
+ createComponent();
+ expect(wrapper.find('input[type="hidden"]').attributes('value')).toBe(
+ defaultProps.paramsBranch,
+ );
+ });
+
+ it('update the branches on success', async () => {
+ const Branches = ['branch-1', 'branch-2'];
+ const Tags = ['tag-1', 'tag-2', 'tag-3'];
+
+ axiosMock.onGet(defaultProps.refsProjectPath).replyOnce(200, {
+ Branches,
+ Tags,
+ });
+
+ createComponent();
+
+ await axios.waitForAll();
+
+ expect(wrapper.vm.branches).toEqual(Branches);
+ expect(wrapper.vm.tags).toEqual(Tags);
+ });
+
+ it('sets branches and tags to be an empty array when no tags or branches are given', async () => {
+ axiosMock.onGet(defaultProps.refsProjectPath).replyOnce(200, {
+ Branches: undefined,
+ Tags: undefined,
+ });
+
+ createComponent();
+
+ await axios.waitForAll();
+
+ expect(wrapper.vm.branches).toEqual([]);
+ expect(wrapper.vm.tags).toEqual([]);
+ });
+
+ it('shows flash message on error', async () => {
+ axiosMock.onGet('some/invalid/path').replyOnce(404);
+
+ createComponent();
+
+ await wrapper.vm.fetchBranchesAndTags();
+ expect(createFlash).toHaveBeenCalled();
+ });
+
+ describe('GlDropdown component', () => {
+ it('renders props', () => {
+ createComponent();
+ expect(wrapper.props()).toEqual(expect.objectContaining(defaultProps));
+ });
+
+ it('display default text', () => {
+ createComponent({
+ paramsBranch: null,
+ });
+ expect(findGlDropdown().props('text')).toBe('Select branch/tag');
+ });
+
+ it('display params branch text', () => {
+ createComponent();
+ expect(findGlDropdown().props('text')).toBe(defaultProps.paramsBranch);
+ });
+ });
+});
diff --git a/spec/frontend/projects/compare/components/revision_dropdown_spec.js b/spec/frontend/projects/compare/components/revision_dropdown_spec.js
index f3ff5e26d2b..69d3167c99c 100644
--- a/spec/frontend/projects/compare/components/revision_dropdown_spec.js
+++ b/spec/frontend/projects/compare/components/revision_dropdown_spec.js
@@ -7,7 +7,6 @@ import RevisionDropdown from '~/projects/compare/components/revision_dropdown.vu
const defaultProps = {
refsProjectPath: 'some/refs/path',
- revisionText: 'Target',
paramsName: 'from',
paramsBranch: 'master',
};
@@ -57,7 +56,6 @@ describe('RevisionDropdown component', () => {
createComponent();
await axios.waitForAll();
-
expect(wrapper.vm.branches).toEqual(Branches);
expect(wrapper.vm.tags).toEqual(Tags);
});
@@ -71,6 +69,22 @@ describe('RevisionDropdown component', () => {
expect(createFlash).toHaveBeenCalled();
});
+ it('makes a new request when refsProjectPath is changed', async () => {
+ jest.spyOn(axios, 'get');
+
+ const newRefsProjectPath = 'new-selected-project-path';
+
+ createComponent();
+
+ wrapper.setProps({
+ ...defaultProps,
+ refsProjectPath: newRefsProjectPath,
+ });
+
+ await axios.waitForAll();
+ expect(axios.get).toHaveBeenLastCalledWith(newRefsProjectPath);
+ });
+
describe('GlDropdown component', () => {
it('renders props', () => {
createComponent();
diff --git a/spec/frontend/projects/details/upload_button_spec.js b/spec/frontend/projects/details/upload_button_spec.js
new file mode 100644
index 00000000000..d7308963088
--- /dev/null
+++ b/spec/frontend/projects/details/upload_button_spec.js
@@ -0,0 +1,54 @@
+import { GlButton } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import UploadButton from '~/projects/details/upload_button.vue';
+import UploadBlobModal from '~/repository/components/upload_blob_modal.vue';
+
+const MODAL_ID = 'details-modal-upload-blob';
+
+describe('UploadButton', () => {
+ let wrapper;
+ let glModalDirective;
+
+ const createComponent = () => {
+ glModalDirective = jest.fn();
+
+ return shallowMount(UploadButton, {
+ directives: {
+ glModal: {
+ bind(_, { value }) {
+ glModalDirective(value);
+ },
+ },
+ },
+ });
+ };
+
+ beforeEach(() => {
+ wrapper = createComponent();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('displays an upload button', () => {
+ expect(wrapper.find(GlButton).exists()).toBe(true);
+ });
+
+ it('contains a modal', () => {
+ const modal = wrapper.find(UploadBlobModal);
+
+ expect(modal.exists()).toBe(true);
+ expect(modal.props('modalId')).toBe(MODAL_ID);
+ });
+
+ describe('when clickinig the upload file button', () => {
+ beforeEach(() => {
+ wrapper.find(GlButton).vm.$emit('click');
+ });
+
+ it('opens the modal', () => {
+ expect(glModalDirective).toHaveBeenCalledWith(MODAL_ID);
+ });
+ });
+});
diff --git a/spec/frontend/projects/experiment_new_project_creation/components/new_project_push_tip_popover_spec.js b/spec/frontend/projects/experiment_new_project_creation/components/new_project_push_tip_popover_spec.js
new file mode 100644
index 00000000000..1ce16640d4a
--- /dev/null
+++ b/spec/frontend/projects/experiment_new_project_creation/components/new_project_push_tip_popover_spec.js
@@ -0,0 +1,75 @@
+import { GlPopover, GlFormInputGroup } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import NewProjectPushTipPopover from '~/projects/experiment_new_project_creation/components/new_project_push_tip_popover.vue';
+import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
+
+describe('New project push tip popover', () => {
+ let wrapper;
+ const targetId = 'target';
+ const pushToCreateProjectCommand = 'command';
+ const workingWithProjectsHelpPath = 'path';
+
+ const findPopover = () => wrapper.findComponent(GlPopover);
+ const findClipboardButton = () => wrapper.findComponent(ClipboardButton);
+ const findFormInput = () => wrapper.findComponent(GlFormInputGroup);
+ const findHelpLink = () => wrapper.find('a');
+ const findTarget = () => document.getElementById(targetId);
+
+ const buildWrapper = () => {
+ wrapper = shallowMount(NewProjectPushTipPopover, {
+ propsData: {
+ target: findTarget(),
+ },
+ stubs: {
+ GlFormInputGroup,
+ },
+ provide: {
+ pushToCreateProjectCommand,
+ workingWithProjectsHelpPath,
+ },
+ });
+ };
+
+ beforeEach(() => {
+ setFixtures(`<a id="${targetId}"></a>`);
+ buildWrapper();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('renders popover that targets the specified target', () => {
+ expect(findPopover().props()).toMatchObject({
+ target: findTarget(),
+ triggers: 'click blur',
+ placement: 'top',
+ title: 'Push to create a project',
+ });
+ });
+
+ it('renders a readonly form input with the push to create command', () => {
+ expect(findFormInput().props()).toMatchObject({
+ value: pushToCreateProjectCommand,
+ selectOnClick: true,
+ });
+ expect(findFormInput().attributes()).toMatchObject({
+ 'aria-label': 'Push project from command line',
+ readonly: 'readonly',
+ });
+ });
+
+ it('allows copying the push command using the clipboard button', () => {
+ expect(findClipboardButton().props()).toMatchObject({
+ text: pushToCreateProjectCommand,
+ tooltipPlacement: 'right',
+ title: 'Copy command',
+ });
+ });
+
+ it('displays a link to open the push command help page reference', () => {
+ expect(findHelpLink().attributes().href).toBe(
+ `${workingWithProjectsHelpPath}#push-to-create-a-new-project`,
+ );
+ });
+});
diff --git a/spec/frontend/projects/experiment_new_project_creation/components/welcome_spec.js b/spec/frontend/projects/experiment_new_project_creation/components/welcome_spec.js
index d6764f75262..f26d1a6d2a3 100644
--- a/spec/frontend/projects/experiment_new_project_creation/components/welcome_spec.js
+++ b/spec/frontend/projects/experiment_new_project_creation/components/welcome_spec.js
@@ -1,5 +1,6 @@
import { shallowMount } from '@vue/test-utils';
import { mockTracking } from 'helpers/tracking_helper';
+import NewProjectPushTipPopover from '~/projects/experiment_new_project_creation/components/new_project_push_tip_popover.vue';
import WelcomePage from '~/projects/experiment_new_project_creation/components/welcome.vue';
describe('Welcome page', () => {
@@ -28,4 +29,13 @@ describe('Welcome page', () => {
expect(trackingSpy).toHaveBeenCalledWith(undefined, 'click_tab', { label: 'test' });
});
});
+
+ it('renders new project push tip popover', () => {
+ createComponent({ panels: [{ name: 'test', href: '#' }] });
+
+ const popover = wrapper.findComponent(NewProjectPushTipPopover);
+
+ expect(popover.exists()).toBe(true);
+ expect(popover.props().target()).toBe(wrapper.find({ ref: 'clipTip' }).element);
+ });
});
diff --git a/spec/frontend/projects/settings_service_desk/components/service_desk_root_spec.js b/spec/frontend/projects/settings_service_desk/components/service_desk_root_spec.js
index f9fbb1b3016..8acf2376860 100644
--- a/spec/frontend/projects/settings_service_desk/components/service_desk_root_spec.js
+++ b/spec/frontend/projects/settings_service_desk/components/service_desk_root_spec.js
@@ -154,7 +154,7 @@ describe('ServiceDeskRoot', () => {
});
it('shows an error message', () => {
- expect(getAlertText()).toContain('An error occured while saving changes:');
+ expect(getAlertText()).toContain('An error occurred while saving changes:');
});
});
});
diff --git a/spec/frontend/projects/upload_file_experiment_spec.js b/spec/frontend/projects/upload_file_experiment_spec.js
new file mode 100644
index 00000000000..aa1b1c44a31
--- /dev/null
+++ b/spec/frontend/projects/upload_file_experiment_spec.js
@@ -0,0 +1,52 @@
+import ExperimentTracking from '~/experimentation/experiment_tracking';
+import * as UploadFileExperiment from '~/projects/upload_file_experiment';
+
+jest.mock('~/experimentation/experiment_tracking');
+
+const fixture = `<a class='js-upload-file-experiment-trigger' data-toggle='modal' data-target='#modal-upload-blob'></a><div id='modal-upload-blob'></div><div class='project-home-panel empty-project'></div>`;
+const findModal = () => document.querySelector('[aria-modal="true"]');
+const findTrigger = () => document.querySelector('.js-upload-file-experiment-trigger');
+
+beforeEach(() => {
+ document.body.innerHTML = fixture;
+});
+
+afterEach(() => {
+ document.body.innerHTML = '';
+});
+
+describe('trackUploadFileFormSubmitted', () => {
+ it('initializes ExperimentTracking with the correct arguments and calls the tracking event with correct arguments', () => {
+ UploadFileExperiment.trackUploadFileFormSubmitted();
+
+ expect(ExperimentTracking).toHaveBeenCalledWith('empty_repo_upload', {
+ label: 'blob-upload-modal',
+ property: 'empty',
+ });
+ expect(ExperimentTracking.prototype.event).toHaveBeenCalledWith(
+ 'click_upload_modal_form_submit',
+ );
+ });
+
+ it('initializes ExperimentTracking with the correct arguments when the project is not empty', () => {
+ document.querySelector('.empty-project').remove();
+
+ UploadFileExperiment.trackUploadFileFormSubmitted();
+
+ expect(ExperimentTracking).toHaveBeenCalledWith('empty_repo_upload', {
+ label: 'blob-upload-modal',
+ property: 'nonempty',
+ });
+ });
+});
+
+describe('initUploadFileTrigger', () => {
+ it('calls modal and tracks event', () => {
+ UploadFileExperiment.initUploadFileTrigger();
+
+ expect(findModal()).not.toExist();
+ findTrigger().click();
+ expect(findModal()).toExist();
+ expect(ExperimentTracking.prototype.event).toHaveBeenCalledWith('click_upload_modal_trigger');
+ });
+});
diff --git a/spec/frontend/prometheus_metrics/custom_metrics_spec.js b/spec/frontend/prometheus_metrics/custom_metrics_spec.js
index 3e3d4ee361a..20593351ee5 100644
--- a/spec/frontend/prometheus_metrics/custom_metrics_spec.js
+++ b/spec/frontend/prometheus_metrics/custom_metrics_spec.js
@@ -9,7 +9,6 @@ describe('PrometheusMetrics', () => {
const customMetricsEndpoint =
'http://test.host/frontend-fixtures/services-project/prometheus/metrics';
let mock;
- preloadFixtures(FIXTURE);
beforeEach(() => {
mock = new MockAdapter(axios);
diff --git a/spec/frontend/prometheus_metrics/prometheus_metrics_spec.js b/spec/frontend/prometheus_metrics/prometheus_metrics_spec.js
index 722a5274ad4..a703dc0a66f 100644
--- a/spec/frontend/prometheus_metrics/prometheus_metrics_spec.js
+++ b/spec/frontend/prometheus_metrics/prometheus_metrics_spec.js
@@ -6,7 +6,6 @@ import { metrics2 as metrics, missingVarMetrics } from './mock_data';
describe('PrometheusMetrics', () => {
const FIXTURE = 'services/prometheus/prometheus_service.html';
- preloadFixtures(FIXTURE);
beforeEach(() => {
loadFixtures(FIXTURE);
diff --git a/spec/frontend/protected_branches/protected_branch_edit_spec.js b/spec/frontend/protected_branches/protected_branch_edit_spec.js
new file mode 100644
index 00000000000..40e31e24a14
--- /dev/null
+++ b/spec/frontend/protected_branches/protected_branch_edit_spec.js
@@ -0,0 +1,88 @@
+import MockAdapter from 'axios-mock-adapter';
+import $ from 'jquery';
+import { TEST_HOST } from 'helpers/test_constants';
+import { deprecatedCreateFlash as flash } from '~/flash';
+import axios from '~/lib/utils/axios_utils';
+import ProtectedBranchEdit from '~/protected_branches/protected_branch_edit';
+
+jest.mock('~/flash');
+
+const TEST_URL = `${TEST_HOST}/url`;
+const IS_CHECKED_CLASS = 'is-checked';
+
+describe('ProtectedBranchEdit', () => {
+ let mock;
+
+ beforeEach(() => {
+ setFixtures(`<div id="wrap" data-url="${TEST_URL}">
+ <button class="js-force-push-toggle">Toggle</button>
+ </div>`);
+
+ jest.spyOn(ProtectedBranchEdit.prototype, 'buildDropdowns').mockImplementation();
+
+ mock = new MockAdapter(axios);
+ });
+
+ const findForcePushesToggle = () => document.querySelector('.js-force-push-toggle');
+
+ const create = ({ isChecked = false }) => {
+ if (isChecked) {
+ findForcePushesToggle().classList.add(IS_CHECKED_CLASS);
+ }
+
+ return new ProtectedBranchEdit({ $wrap: $('#wrap'), hasLicense: false });
+ };
+
+ afterEach(() => {
+ mock.restore();
+ });
+
+ describe('when unchecked toggle button', () => {
+ let toggle;
+
+ beforeEach(() => {
+ create({ isChecked: false });
+
+ toggle = findForcePushesToggle();
+ });
+
+ it('is not changed', () => {
+ expect(toggle).not.toHaveClass(IS_CHECKED_CLASS);
+ expect(toggle).not.toBeDisabled();
+ });
+
+ describe('when clicked', () => {
+ beforeEach(() => {
+ mock.onPatch(TEST_URL, { protected_branch: { allow_force_push: true } }).replyOnce(200, {});
+
+ toggle.click();
+ });
+
+ it('checks and disables button', () => {
+ expect(toggle).toHaveClass(IS_CHECKED_CLASS);
+ expect(toggle).toBeDisabled();
+ });
+
+ it('sends update to BE', () =>
+ axios.waitForAll().then(() => {
+ // Args are asserted in the `.onPatch` call
+ expect(mock.history.patch).toHaveLength(1);
+
+ expect(toggle).not.toBeDisabled();
+ expect(flash).not.toHaveBeenCalled();
+ }));
+ });
+
+ describe('when clicked and BE error', () => {
+ beforeEach(() => {
+ mock.onPatch(TEST_URL).replyOnce(500);
+ toggle.click();
+ });
+
+ it('flashes error', () =>
+ axios.waitForAll().then(() => {
+ expect(flash).toHaveBeenCalled();
+ }));
+ });
+ });
+});
diff --git a/spec/frontend/read_more_spec.js b/spec/frontend/read_more_spec.js
index d1d01272403..16f0d7fb075 100644
--- a/spec/frontend/read_more_spec.js
+++ b/spec/frontend/read_more_spec.js
@@ -3,8 +3,6 @@ import initReadMore from '~/read_more';
describe('Read more click-to-expand functionality', () => {
const fixtureName = 'projects/overview.html';
- preloadFixtures(fixtureName);
-
beforeEach(() => {
loadFixtures(fixtureName);
});
diff --git a/spec/frontend/ref/components/__snapshots__/ref_selector_spec.js.snap b/spec/frontend/ref/components/__snapshots__/ref_selector_spec.js.snap
new file mode 100644
index 00000000000..5f05b7fc68b
--- /dev/null
+++ b/spec/frontend/ref/components/__snapshots__/ref_selector_spec.js.snap
@@ -0,0 +1,70 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`Ref selector component footer slot passes the expected slot props 1`] = `
+Object {
+ "isLoading": false,
+ "matches": Object {
+ "branches": Object {
+ "error": null,
+ "list": Array [
+ Object {
+ "default": false,
+ "name": "add_images_and_changes",
+ },
+ Object {
+ "default": false,
+ "name": "conflict-contains-conflict-markers",
+ },
+ Object {
+ "default": false,
+ "name": "deleted-image-test",
+ },
+ Object {
+ "default": false,
+ "name": "diff-files-image-to-symlink",
+ },
+ Object {
+ "default": false,
+ "name": "diff-files-symlink-to-image",
+ },
+ Object {
+ "default": false,
+ "name": "markdown",
+ },
+ Object {
+ "default": true,
+ "name": "master",
+ },
+ ],
+ "totalCount": 123,
+ },
+ "commits": Object {
+ "error": null,
+ "list": Array [
+ Object {
+ "name": "b83d6e39",
+ "subtitle": "Merge branch 'branch-merged' into 'master'",
+ "value": "b83d6e391c22777fca1ed3012fce84f633d7fed0",
+ },
+ ],
+ "totalCount": 1,
+ },
+ "tags": Object {
+ "error": null,
+ "list": Array [
+ Object {
+ "name": "v1.1.1",
+ },
+ Object {
+ "name": "v1.1.0",
+ },
+ Object {
+ "name": "v1.0.0",
+ },
+ ],
+ "totalCount": 456,
+ },
+ },
+ "query": "abcd1234",
+}
+`;
diff --git a/spec/frontend/ref/components/ref_selector_spec.js b/spec/frontend/ref/components/ref_selector_spec.js
index 27ada131ed6..a642a8cf8c2 100644
--- a/spec/frontend/ref/components/ref_selector_spec.js
+++ b/spec/frontend/ref/components/ref_selector_spec.js
@@ -1,13 +1,20 @@
-import { GlLoadingIcon, GlSearchBoxByType, GlDropdownItem, GlIcon } from '@gitlab/ui';
+import { GlLoadingIcon, GlSearchBoxByType, GlDropdownItem, GlDropdown, GlIcon } from '@gitlab/ui';
import { mount, createLocalVue } from '@vue/test-utils';
import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';
+import { merge, last } from 'lodash';
import Vuex from 'vuex';
import { trimText } from 'helpers/text_helper';
import { ENTER_KEY } from '~/lib/utils/keys';
import { sprintf } from '~/locale';
import RefSelector from '~/ref/components/ref_selector.vue';
-import { X_TOTAL_HEADER, DEFAULT_I18N } from '~/ref/constants';
+import {
+ X_TOTAL_HEADER,
+ DEFAULT_I18N,
+ REF_TYPE_BRANCHES,
+ REF_TYPE_TAGS,
+ REF_TYPE_COMMITS,
+} from '~/ref/constants';
import createStore from '~/ref/stores/';
const localVue = createLocalVue();
@@ -26,27 +33,32 @@ describe('Ref selector component', () => {
let branchesApiCallSpy;
let tagsApiCallSpy;
let commitApiCallSpy;
-
- const createComponent = (props = {}, attrs = {}) => {
- wrapper = mount(RefSelector, {
- propsData: {
- projectId,
- value: '',
- ...props,
- },
- attrs,
- listeners: {
- // simulate a parent component v-model binding
- input: (selectedRef) => {
- wrapper.setProps({ value: selectedRef });
+ let requestSpies;
+
+ const createComponent = (mountOverrides = {}) => {
+ wrapper = mount(
+ RefSelector,
+ merge(
+ {
+ propsData: {
+ projectId,
+ value: '',
+ },
+ listeners: {
+ // simulate a parent component v-model binding
+ input: (selectedRef) => {
+ wrapper.setProps({ value: selectedRef });
+ },
+ },
+ stubs: {
+ GlSearchBoxByType: true,
+ },
+ localVue,
+ store: createStore(),
},
- },
- stubs: {
- GlSearchBoxByType: true,
- },
- localVue,
- store: createStore(),
- });
+ mountOverrides,
+ ),
+ );
};
beforeEach(() => {
@@ -58,6 +70,7 @@ describe('Ref selector component', () => {
.mockReturnValue([200, fixtures.branches, { [X_TOTAL_HEADER]: '123' }]);
tagsApiCallSpy = jest.fn().mockReturnValue([200, fixtures.tags, { [X_TOTAL_HEADER]: '456' }]);
commitApiCallSpy = jest.fn().mockReturnValue([200, fixtures.commit]);
+ requestSpies = { branchesApiCallSpy, tagsApiCallSpy, commitApiCallSpy };
mock
.onGet(`/api/v4/projects/${projectId}/repository/branches`)
@@ -78,7 +91,7 @@ describe('Ref selector component', () => {
//
// Finders
//
- const findButtonContent = () => wrapper.find('[data-testid="button-content"]');
+ const findButtonContent = () => wrapper.find('button');
const findNoResults = () => wrapper.find('[data-testid="no-results"]');
@@ -175,7 +188,7 @@ describe('Ref selector component', () => {
const id = 'git-ref';
beforeEach(() => {
- createComponent({}, { id });
+ createComponent({ attrs: { id } });
return waitForRequests();
});
@@ -189,7 +202,7 @@ describe('Ref selector component', () => {
const preselectedRef = fixtures.branches[0].name;
beforeEach(() => {
- createComponent({ value: preselectedRef });
+ createComponent({ propsData: { value: preselectedRef } });
return waitForRequests();
});
@@ -592,4 +605,152 @@ describe('Ref selector component', () => {
});
});
});
+
+ describe('with non-default ref types', () => {
+ it.each`
+ enabledRefTypes | reqsCalled | reqsNotCalled
+ ${[REF_TYPE_BRANCHES]} | ${['branchesApiCallSpy']} | ${['tagsApiCallSpy', 'commitApiCallSpy']}
+ ${[REF_TYPE_TAGS]} | ${['tagsApiCallSpy']} | ${['branchesApiCallSpy', 'commitApiCallSpy']}
+ ${[REF_TYPE_COMMITS]} | ${[]} | ${['branchesApiCallSpy', 'tagsApiCallSpy', 'commitApiCallSpy']}
+ ${[REF_TYPE_TAGS, REF_TYPE_COMMITS]} | ${['tagsApiCallSpy']} | ${['branchesApiCallSpy', 'commitApiCallSpy']}
+ `(
+ 'only calls $reqsCalled requests when $enabledRefTypes are enabled',
+ async ({ enabledRefTypes, reqsCalled, reqsNotCalled }) => {
+ createComponent({ propsData: { enabledRefTypes } });
+
+ await waitForRequests();
+
+ reqsCalled.forEach((req) => expect(requestSpies[req]).toHaveBeenCalledTimes(1));
+ reqsNotCalled.forEach((req) => expect(requestSpies[req]).not.toHaveBeenCalled());
+ },
+ );
+
+ it('only calls commitApiCallSpy when REF_TYPE_COMMITS is enabled', async () => {
+ createComponent({ propsData: { enabledRefTypes: [REF_TYPE_COMMITS] } });
+ updateQuery('abcd1234');
+
+ await waitForRequests();
+
+ expect(commitApiCallSpy).toHaveBeenCalledTimes(1);
+ expect(branchesApiCallSpy).not.toHaveBeenCalled();
+ expect(tagsApiCallSpy).not.toHaveBeenCalled();
+ });
+
+ it('triggers another search if enabled ref types change', async () => {
+ createComponent({ propsData: { enabledRefTypes: [REF_TYPE_BRANCHES] } });
+ await waitForRequests();
+
+ expect(branchesApiCallSpy).toHaveBeenCalledTimes(1);
+ expect(tagsApiCallSpy).not.toHaveBeenCalled();
+
+ wrapper.setProps({
+ enabledRefTypes: [REF_TYPE_BRANCHES, REF_TYPE_TAGS],
+ });
+ await waitForRequests();
+
+ expect(branchesApiCallSpy).toHaveBeenCalledTimes(2);
+ expect(tagsApiCallSpy).toHaveBeenCalledTimes(1);
+ });
+
+ it('if a ref type becomes disabled, its section is hidden, even if it had some results in store', async () => {
+ createComponent({ propsData: { enabledRefTypes: [REF_TYPE_BRANCHES, REF_TYPE_COMMITS] } });
+ updateQuery('abcd1234');
+ await waitForRequests();
+
+ expect(findBranchesSection().exists()).toBe(true);
+ expect(findCommitsSection().exists()).toBe(true);
+
+ wrapper.setProps({ enabledRefTypes: [REF_TYPE_COMMITS] });
+ await waitForRequests();
+
+ expect(findBranchesSection().exists()).toBe(false);
+ expect(findCommitsSection().exists()).toBe(true);
+ });
+
+ it.each`
+ enabledRefType | findVisibleSection | findHiddenSections
+ ${REF_TYPE_BRANCHES} | ${findBranchesSection} | ${[findTagsSection, findCommitsSection]}
+ ${REF_TYPE_TAGS} | ${findTagsSection} | ${[findBranchesSection, findCommitsSection]}
+ ${REF_TYPE_COMMITS} | ${findCommitsSection} | ${[findBranchesSection, findTagsSection]}
+ `(
+ 'hides section headers if a single ref type is enabled',
+ async ({ enabledRefType, findVisibleSection, findHiddenSections }) => {
+ createComponent({ propsData: { enabledRefTypes: [enabledRefType] } });
+ updateQuery('abcd1234');
+ await waitForRequests();
+
+ expect(findVisibleSection().exists()).toBe(true);
+ expect(findVisibleSection().find('[data-testid="section-header"]').exists()).toBe(false);
+ findHiddenSections.forEach((findHiddenSection) =>
+ expect(findHiddenSection().exists()).toBe(false),
+ );
+ },
+ );
+ });
+
+ describe('validation state', () => {
+ const invalidClass = 'gl-inset-border-1-red-500!';
+ const isInvalidClassApplied = () => wrapper.find(GlDropdown).props('toggleClass')[invalidClass];
+
+ describe('valid state', () => {
+ describe('when the state prop is not provided', () => {
+ it('does not render a red border', () => {
+ createComponent();
+
+ expect(isInvalidClassApplied()).toBe(false);
+ });
+ });
+
+ describe('when the state prop is true', () => {
+ it('does not render a red border', () => {
+ createComponent({ propsData: { state: true } });
+
+ expect(isInvalidClassApplied()).toBe(false);
+ });
+ });
+ });
+
+ describe('invalid state', () => {
+ it('renders the dropdown with a red border if the state prop is false', () => {
+ createComponent({ propsData: { state: false } });
+
+ expect(isInvalidClassApplied()).toBe(true);
+ });
+ });
+ });
+
+ describe('footer slot', () => {
+ const footerContent = 'This is the footer content';
+ const createFooter = jest.fn().mockImplementation(function createMockFooter() {
+ return this.$createElement('div', { attrs: { 'data-testid': 'footer-content' } }, [
+ footerContent,
+ ]);
+ });
+
+ beforeEach(() => {
+ createComponent({
+ scopedSlots: { footer: createFooter },
+ });
+
+ updateQuery('abcd1234');
+
+ return waitForRequests();
+ });
+
+ afterEach(() => {
+ createFooter.mockClear();
+ });
+
+ it('allows custom content to be shown at the bottom of the dropdown using the footer slot', () => {
+ expect(wrapper.find(`[data-testid="footer-content"]`).text()).toBe(footerContent);
+ });
+
+ it('passes the expected slot props', () => {
+ // The createFooter function gets called every time one of the scoped properties
+ // is updated. For the sake of this test, we'll just test the last call, which
+ // represents the final state of the slot props.
+ const lastCallProps = last(createFooter.mock.calls)[0];
+ expect(lastCallProps).toMatchSnapshot();
+ });
+ });
});
diff --git a/spec/frontend/ref/stores/actions_spec.js b/spec/frontend/ref/stores/actions_spec.js
index 11acec27165..099ce062a3a 100644
--- a/spec/frontend/ref/stores/actions_spec.js
+++ b/spec/frontend/ref/stores/actions_spec.js
@@ -1,4 +1,5 @@
import testAction from 'helpers/vuex_action_helper';
+import { ALL_REF_TYPES, REF_TYPE_BRANCHES, REF_TYPE_TAGS, REF_TYPE_COMMITS } from '~/ref/constants';
import * as actions from '~/ref/stores/actions';
import * as types from '~/ref/stores/mutation_types';
import createState from '~/ref/stores/state';
@@ -25,6 +26,14 @@ describe('Ref selector Vuex store actions', () => {
state = createState();
});
+ describe('setEnabledRefTypes', () => {
+ it(`commits ${types.SET_ENABLED_REF_TYPES} with the enabled ref types`, () => {
+ testAction(actions.setProjectId, ALL_REF_TYPES, state, [
+ { type: types.SET_PROJECT_ID, payload: ALL_REF_TYPES },
+ ]);
+ });
+ });
+
describe('setProjectId', () => {
it(`commits ${types.SET_PROJECT_ID} with the new project ID`, () => {
const projectId = '4';
@@ -46,12 +55,23 @@ describe('Ref selector Vuex store actions', () => {
describe('search', () => {
it(`commits ${types.SET_QUERY} with the new search query`, () => {
const query = 'hello';
+ testAction(actions.search, query, state, [{ type: types.SET_QUERY, payload: query }]);
+ });
+
+ it.each`
+ enabledRefTypes | expectedActions
+ ${[REF_TYPE_BRANCHES]} | ${['searchBranches']}
+ ${[REF_TYPE_COMMITS]} | ${['searchCommits']}
+ ${[REF_TYPE_BRANCHES, REF_TYPE_TAGS, REF_TYPE_COMMITS]} | ${['searchBranches', 'searchTags', 'searchCommits']}
+ `(`dispatches fetch actions for enabled ref types`, ({ enabledRefTypes, expectedActions }) => {
+ const query = 'hello';
+ state.enabledRefTypes = enabledRefTypes;
testAction(
actions.search,
query,
state,
[{ type: types.SET_QUERY, payload: query }],
- [{ type: 'searchBranches' }, { type: 'searchTags' }, { type: 'searchCommits' }],
+ expectedActions.map((type) => ({ type })),
);
});
});
diff --git a/spec/frontend/ref/stores/mutations_spec.js b/spec/frontend/ref/stores/mutations_spec.js
index cda13089766..11d4fe0e206 100644
--- a/spec/frontend/ref/stores/mutations_spec.js
+++ b/spec/frontend/ref/stores/mutations_spec.js
@@ -1,4 +1,4 @@
-import { X_TOTAL_HEADER } from '~/ref/constants';
+import { X_TOTAL_HEADER, ALL_REF_TYPES } from '~/ref/constants';
import * as types from '~/ref/stores/mutation_types';
import mutations from '~/ref/stores/mutations';
import createState from '~/ref/stores/state';
@@ -13,6 +13,7 @@ describe('Ref selector Vuex store mutations', () => {
describe('initial state', () => {
it('is created with the correct structure and initial values', () => {
expect(state).toEqual({
+ enabledRefTypes: [],
projectId: null,
query: '',
@@ -39,6 +40,14 @@ describe('Ref selector Vuex store mutations', () => {
});
});
+ describe(`${types.SET_ENABLED_REF_TYPES}`, () => {
+ it('sets the enabled ref types', () => {
+ mutations[types.SET_ENABLED_REF_TYPES](state, ALL_REF_TYPES);
+
+ expect(state.enabledRefTypes).toBe(ALL_REF_TYPES);
+ });
+ });
+
describe(`${types.SET_PROJECT_ID}`, () => {
it('updates the project ID', () => {
const newProjectId = '4';
diff --git a/spec/frontend/registry/explorer/components/delete_button_spec.js b/spec/frontend/registry/explorer/components/delete_button_spec.js
index a557d9afacc..4597c42add9 100644
--- a/spec/frontend/registry/explorer/components/delete_button_spec.js
+++ b/spec/frontend/registry/explorer/components/delete_button_spec.js
@@ -58,6 +58,7 @@ describe('delete_button', () => {
title: 'Foo title',
variant: 'danger',
disabled: 'true',
+ category: 'secondary',
});
});
diff --git a/spec/frontend/registry/explorer/components/details_page/details_header_spec.js b/spec/frontend/registry/explorer/components/details_page/details_header_spec.js
index 3fa3a2ae1de..b50ed87a563 100644
--- a/spec/frontend/registry/explorer/components/details_page/details_header_spec.js
+++ b/spec/frontend/registry/explorer/components/details_page/details_header_spec.js
@@ -1,9 +1,9 @@
-import { GlSprintf, GlButton } from '@gitlab/ui';
+import { GlButton, GlIcon } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import { useFakeDate } from 'helpers/fake_date';
+import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
import component from '~/registry/explorer/components/details_page/details_header.vue';
import {
- DETAILS_PAGE_TITLE,
UNSCHEDULED_STATUS,
SCHEDULED_STATUS,
ONGOING_STATUS,
@@ -13,6 +13,8 @@ import {
CLEANUP_SCHEDULED_TOOLTIP,
CLEANUP_ONGOING_TOOLTIP,
CLEANUP_UNFINISHED_TOOLTIP,
+ ROOT_IMAGE_TEXT,
+ ROOT_IMAGE_TOOLTIP,
} from '~/registry/explorer/constants';
import TitleArea from '~/vue_shared/components/registry/title_area.vue';
@@ -41,6 +43,7 @@ describe('Details Header', () => {
const findTagsCount = () => findByTestId('tags-count');
const findCleanup = () => findByTestId('cleanup');
const findDeleteButton = () => wrapper.find(GlButton);
+ const findInfoIcon = () => wrapper.find(GlIcon);
const waitForMetadataItems = async () => {
// Metadata items are printed by a loop in the title-area and it takes two ticks for them to be available
@@ -51,8 +54,10 @@ describe('Details Header', () => {
const mountComponent = (propsData = { image: defaultImage }) => {
wrapper = shallowMount(component, {
propsData,
+ directives: {
+ GlTooltip: createMockDirective(),
+ },
stubs: {
- GlSprintf,
TitleArea,
},
});
@@ -62,15 +67,41 @@ describe('Details Header', () => {
wrapper.destroy();
wrapper = null;
});
+ describe('image name', () => {
+ describe('missing image name', () => {
+ it('root image ', () => {
+ mountComponent({ image: { ...defaultImage, name: '' } });
- it('has the correct title ', () => {
- mountComponent({ image: { ...defaultImage, name: '' } });
- expect(findTitle().text()).toMatchInterpolatedText(DETAILS_PAGE_TITLE);
- });
+ expect(findTitle().text()).toBe(ROOT_IMAGE_TEXT);
+ });
- it('shows imageName in the title', () => {
- mountComponent();
- expect(findTitle().text()).toContain('foo');
+ it('has an icon', () => {
+ mountComponent({ image: { ...defaultImage, name: '' } });
+
+ expect(findInfoIcon().exists()).toBe(true);
+ expect(findInfoIcon().props('name')).toBe('information-o');
+ });
+
+ it('has a tooltip', () => {
+ mountComponent({ image: { ...defaultImage, name: '' } });
+
+ const tooltip = getBinding(findInfoIcon().element, 'gl-tooltip');
+ expect(tooltip.value).toBe(ROOT_IMAGE_TOOLTIP);
+ });
+ });
+
+ describe('with image name present', () => {
+ it('shows image.name ', () => {
+ mountComponent();
+ expect(findTitle().text()).toContain('foo');
+ });
+
+ it('has no icon', () => {
+ mountComponent();
+
+ expect(findInfoIcon().exists()).toBe(false);
+ });
+ });
});
describe('delete button', () => {
diff --git a/spec/frontend/registry/explorer/components/list_page/image_list_row_spec.js b/spec/frontend/registry/explorer/components/list_page/image_list_row_spec.js
index d6ee871341b..6c897b983f7 100644
--- a/spec/frontend/registry/explorer/components/list_page/image_list_row_spec.js
+++ b/spec/frontend/registry/explorer/components/list_page/image_list_row_spec.js
@@ -12,6 +12,7 @@ import {
CLEANUP_TIMED_OUT_ERROR_MESSAGE,
IMAGE_DELETE_SCHEDULED_STATUS,
IMAGE_FAILED_DELETED_STATUS,
+ ROOT_IMAGE_TEXT,
} from '~/registry/explorer/constants';
import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
import ListItem from '~/vue_shared/components/registry/list_item.vue';
@@ -73,8 +74,8 @@ describe('Image List Row', () => {
mountComponent();
const link = findDetailsLink();
- expect(link.html()).toContain(item.path);
- expect(link.props('to')).toMatchObject({
+ expect(link.text()).toBe(item.path);
+ expect(findDetailsLink().props('to')).toMatchObject({
name: 'details',
params: {
id: getIdFromGraphQLId(item.id),
@@ -82,6 +83,12 @@ describe('Image List Row', () => {
});
});
+ it(`when the image has no name appends ${ROOT_IMAGE_TEXT} to the path`, () => {
+ mountComponent({ item: { ...item, name: '' } });
+
+ expect(findDetailsLink().text()).toBe(`${item.path}/ ${ROOT_IMAGE_TEXT}`);
+ });
+
it('contains a clipboard button', () => {
mountComponent();
const button = findClipboardButton();
diff --git a/spec/frontend/registry/explorer/components/list_page/registry_header_spec.js b/spec/frontend/registry/explorer/components/list_page/registry_header_spec.js
index 07256d2bbf5..11a3acd9eb9 100644
--- a/spec/frontend/registry/explorer/components/list_page/registry_header_spec.js
+++ b/spec/frontend/registry/explorer/components/list_page/registry_header_spec.js
@@ -4,7 +4,6 @@ import Component from '~/registry/explorer/components/list_page/registry_header.
import {
CONTAINER_REGISTRY_TITLE,
LIST_INTRO_TEXT,
- EXPIRATION_POLICY_DISABLED_MESSAGE,
EXPIRATION_POLICY_DISABLED_TEXT,
} from '~/registry/explorer/constants';
import TitleArea from '~/vue_shared/components/registry/title_area.vue';
@@ -132,41 +131,5 @@ describe('registry_header', () => {
]);
});
});
-
- describe('expiration policy info message', () => {
- describe('when there are images', () => {
- describe('when expiration policy is disabled', () => {
- beforeEach(() => {
- return mountComponent({
- expirationPolicy: { enabled: false },
- expirationPolicyHelpPagePath: 'foo',
- imagesCount: 1,
- });
- });
-
- it('the prop is correctly bound', () => {
- expect(findTitleArea().props('infoMessages')).toEqual([
- { text: LIST_INTRO_TEXT, link: '' },
- { text: EXPIRATION_POLICY_DISABLED_MESSAGE, link: 'foo' },
- ]);
- });
- });
-
- describe.each`
- desc | props
- ${'when there are no images'} | ${{ expirationPolicy: { enabled: false }, imagesCount: 0 }}
- ${'when expiration policy is enabled'} | ${{ expirationPolicy: { enabled: true }, imagesCount: 1 }}
- ${'when the expiration policy is completely disabled'} | ${{ expirationPolicy: { enabled: false }, imagesCount: 1, hideExpirationPolicyData: true }}
- `('$desc', ({ props }) => {
- it('message does not exist', () => {
- mountComponent(props);
-
- expect(findTitleArea().props('infoMessages')).toEqual([
- { text: LIST_INTRO_TEXT, link: '' },
- ]);
- });
- });
- });
- });
});
});
diff --git a/spec/frontend/registry/explorer/pages/details_spec.js b/spec/frontend/registry/explorer/pages/details_spec.js
index 65c58bf9874..76baf4f72c9 100644
--- a/spec/frontend/registry/explorer/pages/details_spec.js
+++ b/spec/frontend/registry/explorer/pages/details_spec.js
@@ -17,6 +17,8 @@ import {
UNFINISHED_STATUS,
DELETE_SCHEDULED,
ALERT_DANGER_IMAGE,
+ MISSING_OR_DELETED_IMAGE_BREADCRUMB,
+ ROOT_IMAGE_TEXT,
} from '~/registry/explorer/constants';
import deleteContainerRepositoryTagsMutation from '~/registry/explorer/graphql/mutations/delete_container_repository_tags.mutation.graphql';
import getContainerRepositoryDetailsQuery from '~/registry/explorer/graphql/queries/get_container_repository_details.query.graphql';
@@ -515,6 +517,26 @@ describe('Details Page', () => {
expect(breadCrumbState.updateName).toHaveBeenCalledWith(containerRepositoryMock.name);
});
+
+ it(`when the image is missing set the breadcrumb to ${MISSING_OR_DELETED_IMAGE_BREADCRUMB}`, async () => {
+ mountComponent({ resolver: jest.fn().mockResolvedValue(graphQLEmptyImageDetailsMock) });
+
+ await waitForApolloRequestRender();
+
+ expect(breadCrumbState.updateName).toHaveBeenCalledWith(MISSING_OR_DELETED_IMAGE_BREADCRUMB);
+ });
+
+ it(`when the image has no name set the breadcrumb to ${ROOT_IMAGE_TEXT}`, async () => {
+ mountComponent({
+ resolver: jest
+ .fn()
+ .mockResolvedValue(graphQLImageDetailsMock({ ...containerRepositoryMock, name: null })),
+ });
+
+ await waitForApolloRequestRender();
+
+ expect(breadCrumbState.updateName).toHaveBeenCalledWith(ROOT_IMAGE_TEXT);
+ });
});
describe('when the image has a status different from null', () => {
diff --git a/spec/frontend/related_issues/components/related_issuable_input_spec.js b/spec/frontend/related_issues/components/related_issuable_input_spec.js
new file mode 100644
index 00000000000..79b228454f4
--- /dev/null
+++ b/spec/frontend/related_issues/components/related_issuable_input_spec.js
@@ -0,0 +1,117 @@
+import { shallowMount } from '@vue/test-utils';
+import { TEST_HOST } from 'helpers/test_constants';
+import RelatedIssuableInput from '~/related_issues/components/related_issuable_input.vue';
+import { issuableTypesMap, PathIdSeparator } from '~/related_issues/constants';
+
+jest.mock('ee_else_ce/gfm_auto_complete', () => {
+ return function gfmAutoComplete() {
+ return {
+ constructor() {},
+ setup() {},
+ };
+ };
+});
+
+describe('RelatedIssuableInput', () => {
+ let propsData;
+
+ beforeEach(() => {
+ propsData = {
+ inputValue: '',
+ references: [],
+ pathIdSeparator: PathIdSeparator.Issue,
+ issuableType: issuableTypesMap.issue,
+ autoCompleteSources: {
+ issues: `${TEST_HOST}/h5bp/html5-boilerplate/-/autocomplete_sources/issues`,
+ },
+ };
+ });
+
+ describe('autocomplete', () => {
+ describe('with autoCompleteSources', () => {
+ it('shows placeholder text', () => {
+ const wrapper = shallowMount(RelatedIssuableInput, { propsData });
+
+ expect(wrapper.find({ ref: 'input' }).element.placeholder).toBe(
+ 'Paste issue link or <#issue id>',
+ );
+ });
+
+ it('has GfmAutoComplete', () => {
+ const wrapper = shallowMount(RelatedIssuableInput, { propsData });
+
+ expect(wrapper.vm.gfmAutoComplete).toBeDefined();
+ });
+ });
+
+ describe('with no autoCompleteSources', () => {
+ it('shows placeholder text', () => {
+ const wrapper = shallowMount(RelatedIssuableInput, {
+ propsData: {
+ ...propsData,
+ references: ['!1', '!2'],
+ },
+ });
+
+ expect(wrapper.find({ ref: 'input' }).element.value).toBe('');
+ });
+
+ it('does not have GfmAutoComplete', () => {
+ const wrapper = shallowMount(RelatedIssuableInput, {
+ propsData: {
+ ...propsData,
+ autoCompleteSources: {},
+ },
+ });
+
+ expect(wrapper.vm.gfmAutoComplete).not.toBeDefined();
+ });
+ });
+ });
+
+ describe('focus', () => {
+ it('when clicking anywhere on the input wrapper it should focus the input', async () => {
+ const wrapper = shallowMount(RelatedIssuableInput, {
+ propsData: {
+ ...propsData,
+ references: ['foo', 'bar'],
+ },
+ // We need to attach to document, so that `document.activeElement` is properly set in jsdom
+ attachTo: document.body,
+ });
+
+ wrapper.find('li').trigger('click');
+
+ await wrapper.vm.$nextTick();
+
+ expect(document.activeElement).toBe(wrapper.find({ ref: 'input' }).element);
+ });
+ });
+
+ describe('when filling in the input', () => {
+ it('emits addIssuableFormInput with data', () => {
+ const wrapper = shallowMount(RelatedIssuableInput, {
+ propsData,
+ });
+
+ wrapper.vm.$emit = jest.fn();
+
+ const newInputValue = 'filling in things';
+ const untouchedRawReferences = newInputValue.trim().split(/\s/);
+ const touchedReference = untouchedRawReferences.pop();
+ const input = wrapper.find({ ref: 'input' });
+
+ input.element.value = newInputValue;
+ input.element.selectionStart = newInputValue.length;
+ input.element.selectionEnd = newInputValue.length;
+ input.trigger('input');
+
+ expect(wrapper.vm.$emit).toHaveBeenCalledWith('addIssuableFormInput', {
+ newValue: newInputValue,
+ caretPos: newInputValue.length,
+ untouchedRawReferences,
+ touchedReference,
+ });
+ });
+ });
+});
diff --git a/spec/frontend/releases/components/tag_field_new_spec.js b/spec/frontend/releases/components/tag_field_new_spec.js
index d87718138b8..387217c2a8e 100644
--- a/spec/frontend/releases/components/tag_field_new_spec.js
+++ b/spec/frontend/releases/components/tag_field_new_spec.js
@@ -1,6 +1,6 @@
-import { GlFormInput } from '@gitlab/ui';
+import { GlDropdownItem } from '@gitlab/ui';
import { mount, shallowMount } from '@vue/test-utils';
-import RefSelector from '~/ref/components/ref_selector.vue';
+import Vue from 'vue';
import TagFieldNew from '~/releases/components/tag_field_new.vue';
import createStore from '~/releases/stores';
import createDetailModule from '~/releases/stores/modules/detail';
@@ -8,6 +8,25 @@ import createDetailModule from '~/releases/stores/modules/detail';
const TEST_TAG_NAME = 'test-tag-name';
const TEST_PROJECT_ID = '1234';
const TEST_CREATE_FROM = 'test-create-from';
+const NONEXISTENT_TAG_NAME = 'nonexistent-tag';
+
+// A mock version of the RefSelector component that simulates
+// a scenario where the users has searched for "nonexistent-tag"
+// and the component has found no tags that match.
+const RefSelectorStub = Vue.component('RefSelectorStub', {
+ data() {
+ return {
+ footerSlotProps: {
+ isLoading: false,
+ matches: {
+ tags: { totalCount: 0 },
+ },
+ query: NONEXISTENT_TAG_NAME,
+ },
+ };
+ },
+ template: '<div><slot name="footer" v-bind="footerSlotProps"></slot></div>',
+});
describe('releases/components/tag_field_new', () => {
let store;
@@ -17,7 +36,7 @@ describe('releases/components/tag_field_new', () => {
wrapper = mountFn(TagFieldNew, {
store,
stubs: {
- RefSelector: true,
+ RefSelector: RefSelectorStub,
},
});
};
@@ -47,11 +66,12 @@ describe('releases/components/tag_field_new', () => {
});
const findTagNameFormGroup = () => wrapper.find('[data-testid="tag-name-field"]');
- const findTagNameGlInput = () => findTagNameFormGroup().find(GlFormInput);
- const findTagNameInput = () => findTagNameFormGroup().find('input');
+ const findTagNameDropdown = () => findTagNameFormGroup().find(RefSelectorStub);
const findCreateFromFormGroup = () => wrapper.find('[data-testid="create-from-field"]');
- const findCreateFromDropdown = () => findCreateFromFormGroup().find(RefSelector);
+ const findCreateFromDropdown = () => findCreateFromFormGroup().find(RefSelectorStub);
+
+ const findCreateNewTagOption = () => wrapper.find(GlDropdownItem);
describe('"Tag name" field', () => {
describe('rendering and behavior', () => {
@@ -61,14 +81,37 @@ describe('releases/components/tag_field_new', () => {
expect(findTagNameFormGroup().attributes().label).toBe('Tag name');
});
- describe('when the user updates the field', () => {
+ describe('when the user selects a new tag name', () => {
+ beforeEach(async () => {
+ findCreateNewTagOption().vm.$emit('click');
+
+ await wrapper.vm.$nextTick();
+ });
+
+ it("updates the store's release.tagName property", () => {
+ expect(store.state.detail.release.tagName).toBe(NONEXISTENT_TAG_NAME);
+ });
+
+ it('hides the "Create from" field', () => {
+ expect(findCreateFromFormGroup().exists()).toBe(true);
+ });
+ });
+
+ describe('when the user selects an existing tag name', () => {
+ const updatedTagName = 'updated-tag-name';
+
+ beforeEach(async () => {
+ findTagNameDropdown().vm.$emit('input', updatedTagName);
+
+ await wrapper.vm.$nextTick();
+ });
+
it("updates the store's release.tagName property", () => {
- const updatedTagName = 'updated-tag-name';
- findTagNameGlInput().vm.$emit('input', updatedTagName);
+ expect(store.state.detail.release.tagName).toBe(updatedTagName);
+ });
- return wrapper.vm.$nextTick().then(() => {
- expect(store.state.detail.release.tagName).toBe(updatedTagName);
- });
+ it('shows the "Create from" field', () => {
+ expect(findCreateFromFormGroup().exists()).toBe(false);
});
});
});
@@ -83,41 +126,39 @@ describe('releases/components/tag_field_new', () => {
* @param {'shown' | 'hidden'} state The expected state of the validation message.
* Should be passed either 'shown' or 'hidden'
*/
- const expectValidationMessageToBe = (state) => {
- return wrapper.vm.$nextTick().then(() => {
- expect(findTagNameFormGroup().element).toHaveClass(
- state === 'shown' ? 'is-invalid' : 'is-valid',
- );
- expect(findTagNameFormGroup().element).not.toHaveClass(
- state === 'shown' ? 'is-valid' : 'is-invalid',
- );
- });
+ const expectValidationMessageToBe = async (state) => {
+ await wrapper.vm.$nextTick();
+
+ expect(findTagNameFormGroup().element).toHaveClass(
+ state === 'shown' ? 'is-invalid' : 'is-valid',
+ );
+ expect(findTagNameFormGroup().element).not.toHaveClass(
+ state === 'shown' ? 'is-valid' : 'is-invalid',
+ );
};
describe('when the user has not yet interacted with the component', () => {
- it('does not display a validation error', () => {
- findTagNameInput().setValue('');
+ it('does not display a validation error', async () => {
+ findTagNameDropdown().vm.$emit('input', '');
- return expectValidationMessageToBe('hidden');
+ await expectValidationMessageToBe('hidden');
});
});
describe('when the user has interacted with the component and the value is not empty', () => {
- it('does not display validation error', () => {
- findTagNameInput().trigger('blur');
+ it('does not display validation error', async () => {
+ findTagNameDropdown().vm.$emit('hide');
- return expectValidationMessageToBe('hidden');
+ await expectValidationMessageToBe('hidden');
});
});
describe('when the user has interacted with the component and the value is empty', () => {
- it('displays a validation error', () => {
- const tagNameInput = findTagNameInput();
-
- tagNameInput.setValue('');
- tagNameInput.trigger('blur');
+ it('displays a validation error', async () => {
+ findTagNameDropdown().vm.$emit('input', '');
+ findTagNameDropdown().vm.$emit('hide');
- return expectValidationMessageToBe('shown');
+ await expectValidationMessageToBe('shown');
});
});
});
@@ -131,13 +172,13 @@ describe('releases/components/tag_field_new', () => {
});
describe('when the user selects a git ref', () => {
- it("updates the store's createFrom property", () => {
+ it("updates the store's createFrom property", async () => {
const updatedCreateFrom = 'update-create-from';
findCreateFromDropdown().vm.$emit('input', updatedCreateFrom);
- return wrapper.vm.$nextTick().then(() => {
- expect(store.state.detail.createFrom).toBe(updatedCreateFrom);
- });
+ await wrapper.vm.$nextTick();
+
+ expect(store.state.detail.createFrom).toBe(updatedCreateFrom);
});
});
});
diff --git a/spec/frontend/reports/components/grouped_test_reports_app_spec.js b/spec/frontend/reports/components/grouped_test_reports_app_spec.js
index ed261ed12c0..cffdcc04416 100644
--- a/spec/frontend/reports/components/grouped_test_reports_app_spec.js
+++ b/spec/frontend/reports/components/grouped_test_reports_app_spec.js
@@ -42,8 +42,12 @@ describe('Grouped test reports app', () => {
const findHeader = () => wrapper.find('[data-testid="report-section-code-text"]');
const findExpandButton = () => wrapper.find('[data-testid="report-section-expand-button"]');
const findFullTestReportLink = () => wrapper.find('[data-testid="group-test-reports-full-link"]');
- const findSummaryDescription = () => wrapper.find('[data-testid="test-summary-row-description"]');
+ const findSummaryDescription = () => wrapper.find('[data-testid="summary-row-description"]');
+ const findIssueListUnresolvedHeading = () => wrapper.find('[data-testid="unresolvedHeading"]');
+ const findIssueListResolvedHeading = () => wrapper.find('[data-testid="resolvedHeading"]');
const findIssueDescription = () => wrapper.find('[data-testid="test-issue-body-description"]');
+ const findIssueRecentFailures = () =>
+ wrapper.find('[data-testid="test-issue-body-recent-failures"]');
const findAllIssueDescriptions = () =>
wrapper.findAll('[data-testid="test-issue-body-description"]');
@@ -133,6 +137,10 @@ describe('Grouped test reports app', () => {
mountComponent();
});
+ it('renders New heading', () => {
+ expect(findIssueListUnresolvedHeading().text()).toBe('New');
+ });
+
it('renders failed summary text', () => {
expect(findHeader().text()).toBe('Test summary contained 2 failed out of 11 total tests');
});
@@ -144,7 +152,6 @@ describe('Grouped test reports app', () => {
});
it('renders failed issue in list', () => {
- expect(findIssueDescription().text()).toContain('New');
expect(findIssueDescription().text()).toContain(
'Test#sum when a is 1 and b is 2 returns summary',
);
@@ -157,6 +164,10 @@ describe('Grouped test reports app', () => {
mountComponent();
});
+ it('renders New heading', () => {
+ expect(findIssueListUnresolvedHeading().text()).toBe('New');
+ });
+
it('renders error summary text', () => {
expect(findHeader().text()).toBe('Test summary contained 2 errors out of 11 total tests');
});
@@ -168,7 +179,6 @@ describe('Grouped test reports app', () => {
});
it('renders error issue in list', () => {
- expect(findIssueDescription().text()).toContain('New');
expect(findIssueDescription().text()).toContain(
'Test#sum when a is 1 and b is 2 returns summary',
);
@@ -181,6 +191,11 @@ describe('Grouped test reports app', () => {
mountComponent();
});
+ it('renders New and Fixed headings', () => {
+ expect(findIssueListUnresolvedHeading().text()).toBe('New');
+ expect(findIssueListResolvedHeading().text()).toBe('Fixed');
+ });
+
it('renders summary text', () => {
expect(findHeader().text()).toBe(
'Test summary contained 2 failed and 2 fixed test results out of 11 total tests',
@@ -194,7 +209,6 @@ describe('Grouped test reports app', () => {
});
it('renders failed issue in list', () => {
- expect(findIssueDescription().text()).toContain('New');
expect(findIssueDescription().text()).toContain(
'Test#subtract when a is 2 and b is 1 returns correct result',
);
@@ -207,6 +221,10 @@ describe('Grouped test reports app', () => {
mountComponent();
});
+ it('renders Fixed heading', () => {
+ expect(findIssueListResolvedHeading().text()).toBe('Fixed');
+ });
+
it('renders summary text', () => {
expect(findHeader().text()).toBe(
'Test summary contained 4 fixed test results out of 11 total tests',
@@ -252,7 +270,7 @@ describe('Grouped test reports app', () => {
});
it('renders the recent failures count on the test case', () => {
- expect(findIssueDescription().text()).toContain(
+ expect(findIssueRecentFailures().text()).toBe(
'Failed 8 times in master in the last 14 days',
);
});
@@ -295,6 +313,27 @@ describe('Grouped test reports app', () => {
});
});
+ describe('with a report parsing errors', () => {
+ beforeEach(() => {
+ const reports = failedReport;
+ reports.suites[0].suite_errors = {
+ head: 'JUnit XML parsing failed: 2:24: FATAL: attributes construct error',
+ base: 'JUnit data parsing failed: string not matched',
+ };
+ setReports(reports);
+ mountComponent();
+ });
+
+ it('renders the error messages', () => {
+ expect(findSummaryDescription().text()).toContain(
+ 'JUnit XML parsing failed: 2:24: FATAL: attributes construct error',
+ );
+ expect(findSummaryDescription().text()).toContain(
+ 'JUnit data parsing failed: string not matched',
+ );
+ });
+ });
+
describe('with error', () => {
beforeEach(() => {
mockStore.state.isLoading = false;
diff --git a/spec/frontend/reports/components/summary_row_spec.js b/spec/frontend/reports/components/summary_row_spec.js
index bdd6de1e0be..04d9d10dcd2 100644
--- a/spec/frontend/reports/components/summary_row_spec.js
+++ b/spec/frontend/reports/components/summary_row_spec.js
@@ -1,4 +1,5 @@
import { mount } from '@vue/test-utils';
+import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import SummaryRow from '~/reports/components/summary_row.vue';
describe('Summary row', () => {
@@ -14,16 +15,19 @@ describe('Summary row', () => {
};
const createComponent = ({ propsData = {}, slots = {} } = {}) => {
- wrapper = mount(SummaryRow, {
- propsData: {
- ...props,
- ...propsData,
- },
- slots,
- });
+ wrapper = extendedWrapper(
+ mount(SummaryRow, {
+ propsData: {
+ ...props,
+ ...propsData,
+ },
+ slots,
+ }),
+ );
};
- const findSummary = () => wrapper.find('.report-block-list-issue-description-text');
+ const findSummary = () => wrapper.findByTestId('summary-row-description');
+ const findStatusIcon = () => wrapper.findByTestId('summary-row-icon');
afterEach(() => {
wrapper.destroy();
@@ -37,9 +41,7 @@ describe('Summary row', () => {
it('renders provided icon', () => {
createComponent();
- expect(wrapper.find('.report-block-list-icon span').classes()).toContain(
- 'js-ci-status-icon-warning',
- );
+ expect(findStatusIcon().classes()).toContain('js-ci-status-icon-warning');
});
describe('summary slot', () => {
diff --git a/spec/frontend/reports/components/test_issue_body_spec.js b/spec/frontend/reports/components/test_issue_body_spec.js
index 2843620a18d..6f890d8f92c 100644
--- a/spec/frontend/reports/components/test_issue_body_spec.js
+++ b/spec/frontend/reports/components/test_issue_body_spec.js
@@ -1,72 +1,97 @@
-import Vue from 'vue';
-import { trimText } from 'helpers/text_helper';
-import { mountComponentWithStore } from 'helpers/vue_mount_component_helper';
-import component from '~/reports/components/test_issue_body.vue';
-import createStore from '~/reports/store';
-import { issue } from '../mock_data/mock_data';
-
-describe('Test Issue body', () => {
- let vm;
- const Component = Vue.extend(component);
- const store = createStore();
-
- const commonProps = {
- issue,
- status: 'failed',
- };
+import { GlBadge, GlButton } from '@gitlab/ui';
+import { shallowMount, createLocalVue } from '@vue/test-utils';
+import Vuex from 'vuex';
+import { extendedWrapper } from 'helpers/vue_test_utils_helper';
+import IssueStatusIcon from '~/reports/components/issue_status_icon.vue';
+import TestIssueBody from '~/reports/components/test_issue_body.vue';
+import { failedIssue, successIssue } from '../mock_data/mock_data';
- afterEach(() => {
- vm.$destroy();
- });
+const localVue = createLocalVue();
+localVue.use(Vuex);
- describe('on click', () => {
- it('calls openModal action', () => {
- vm = mountComponentWithStore(Component, {
- store,
- props: commonProps,
- });
+describe('Test issue body', () => {
+ let wrapper;
+ let store;
- jest.spyOn(vm, 'openModal').mockImplementation(() => {});
+ const findDescription = () => wrapper.findByTestId('test-issue-body-description');
+ const findStatusIcon = () => wrapper.findComponent(IssueStatusIcon);
+ const findBadge = () => wrapper.findComponent(GlBadge);
- vm.$el.querySelector('button').click();
+ const actionSpies = {
+ openModal: jest.fn(),
+ };
- expect(vm.openModal).toHaveBeenCalledWith({
- issue: commonProps.issue,
- });
+ const createComponent = ({ issue = failedIssue } = {}) => {
+ store = new Vuex.Store({
+ actions: actionSpies,
});
+
+ wrapper = extendedWrapper(
+ shallowMount(TestIssueBody, {
+ store,
+ localVue,
+ propsData: {
+ issue,
+ },
+ stubs: {
+ GlBadge,
+ GlButton,
+ IssueStatusIcon,
+ },
+ }),
+ );
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
});
- describe('is new', () => {
+ describe('when issue has failed status', () => {
beforeEach(() => {
- vm = mountComponentWithStore(Component, {
- store,
- props: { ...commonProps, isNew: true },
- });
+ createComponent();
});
it('renders issue name', () => {
- expect(vm.$el.textContent).toContain(commonProps.issue.name);
+ expect(findDescription().text()).toBe(failedIssue.name);
+ });
+
+ it('renders failed status icon', () => {
+ expect(findStatusIcon().props('status')).toBe('failed');
});
- it('renders new badge', () => {
- expect(trimText(vm.$el.querySelector('.badge').textContent)).toEqual('New');
+ describe('when issue has recent failures', () => {
+ it('renders recent failures badge', () => {
+ expect(findBadge().exists()).toBe(true);
+ });
});
});
- describe('not new', () => {
+ describe('when issue has success status', () => {
beforeEach(() => {
- vm = mountComponentWithStore(Component, {
- store,
- props: commonProps,
- });
+ createComponent({ issue: successIssue });
+ });
+
+ it('does not render recent failures', () => {
+ expect(findBadge().exists()).toBe(false);
});
it('renders issue name', () => {
- expect(vm.$el.textContent).toContain(commonProps.issue.name);
+ expect(findDescription().text()).toBe(successIssue.name);
+ });
+
+ it('renders success status icon', () => {
+ expect(findStatusIcon().props('status')).toBe('success');
});
+ });
- it('does not renders new badge', () => {
- expect(vm.$el.querySelector('.badge')).toEqual(null);
+ describe('when clicking on an issue', () => {
+ it('calls openModal action', () => {
+ createComponent();
+ wrapper.findComponent(GlButton).trigger('click');
+
+ expect(actionSpies.openModal).toHaveBeenCalledWith(expect.any(Object), {
+ issue: failedIssue,
+ });
});
});
});
diff --git a/spec/frontend/reports/mock_data/mock_data.js b/spec/frontend/reports/mock_data/mock_data.js
index 3caaab2fd79..68c7439df47 100644
--- a/spec/frontend/reports/mock_data/mock_data.js
+++ b/spec/frontend/reports/mock_data/mock_data.js
@@ -1,9 +1,23 @@
-export const issue = {
+export const failedIssue = {
result: 'failure',
name: 'Test#sum when a is 1 and b is 2 returns summary',
execution_time: 0.009411,
+ status: 'failed',
system_output:
"Failure/Error: is_expected.to eq(3)\n\n expected: 3\n got: -1\n\n (compared using ==)\n./spec/test_spec.rb:12:in `block (4 levels) in \u003ctop (required)\u003e'",
+ recent_failures: {
+ count: 3,
+ base_branch: 'master',
+ },
+};
+
+export const successIssue = {
+ result: 'success',
+ name: 'Test#sum when a is 1 and b is 2 returns summary',
+ execution_time: 0.009411,
+ status: 'success',
+ system_output: null,
+ recent_failures: null,
};
export const failedReport = {
diff --git a/spec/frontend/reports/store/mutations_spec.js b/spec/frontend/reports/store/mutations_spec.js
index 652b3b0ec45..07dd4a0f75c 100644
--- a/spec/frontend/reports/store/mutations_spec.js
+++ b/spec/frontend/reports/store/mutations_spec.js
@@ -1,7 +1,7 @@
import * as types from '~/reports/store/mutation_types';
import mutations from '~/reports/store/mutations';
import state from '~/reports/store/state';
-import { issue } from '../mock_data/mock_data';
+import { failedIssue } from '../mock_data/mock_data';
describe('Reports Store Mutations', () => {
let stateCopy;
@@ -115,17 +115,17 @@ describe('Reports Store Mutations', () => {
describe('SET_ISSUE_MODAL_DATA', () => {
beforeEach(() => {
mutations[types.SET_ISSUE_MODAL_DATA](stateCopy, {
- issue,
+ issue: failedIssue,
});
});
it('should set modal title', () => {
- expect(stateCopy.modal.title).toEqual(issue.name);
+ expect(stateCopy.modal.title).toEqual(failedIssue.name);
});
it('should set modal data', () => {
- expect(stateCopy.modal.data.execution_time.value).toEqual(issue.execution_time);
- expect(stateCopy.modal.data.system_output.value).toEqual(issue.system_output);
+ expect(stateCopy.modal.data.execution_time.value).toEqual(failedIssue.execution_time);
+ expect(stateCopy.modal.data.system_output.value).toEqual(failedIssue.system_output);
});
it('should open modal', () => {
@@ -136,7 +136,7 @@ describe('Reports Store Mutations', () => {
describe('RESET_ISSUE_MODAL_DATA', () => {
beforeEach(() => {
mutations[types.SET_ISSUE_MODAL_DATA](stateCopy, {
- issue,
+ issue: failedIssue,
});
mutations[types.RESET_ISSUE_MODAL_DATA](stateCopy);
diff --git a/spec/frontend/repository/components/upload_blob_modal_spec.js b/spec/frontend/repository/components/upload_blob_modal_spec.js
new file mode 100644
index 00000000000..6e3cbad558d
--- /dev/null
+++ b/spec/frontend/repository/components/upload_blob_modal_spec.js
@@ -0,0 +1,193 @@
+import { GlModal, GlFormInput, GlFormTextarea, GlToggle, GlAlert } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import axios from 'axios';
+import MockAdapter from 'axios-mock-adapter';
+import waitForPromises from 'helpers/wait_for_promises';
+import createFlash from '~/flash';
+import httpStatusCodes from '~/lib/utils/http_status';
+import { visitUrl } from '~/lib/utils/url_utility';
+import UploadBlobModal from '~/repository/components/upload_blob_modal.vue';
+import UploadDropzone from '~/vue_shared/components/upload_dropzone/upload_dropzone.vue';
+
+jest.mock('~/flash');
+jest.mock('~/lib/utils/url_utility', () => ({
+ visitUrl: jest.fn(),
+ joinPaths: () => '/new_upload',
+}));
+
+const initialProps = {
+ modalId: 'upload-blob',
+ commitMessage: 'Upload New File',
+ targetBranch: 'master',
+ origionalBranch: 'master',
+ canPushCode: true,
+ path: 'new_upload',
+};
+
+describe('UploadBlobModal', () => {
+ let wrapper;
+ let mock;
+
+ const mockEvent = { preventDefault: jest.fn() };
+
+ const createComponent = (props) => {
+ wrapper = shallowMount(UploadBlobModal, {
+ propsData: {
+ ...initialProps,
+ ...props,
+ },
+ mocks: {
+ $route: {
+ params: {
+ path: '',
+ },
+ },
+ },
+ });
+ };
+
+ const findModal = () => wrapper.find(GlModal);
+ const findAlert = () => wrapper.find(GlAlert);
+ const findCommitMessage = () => wrapper.find(GlFormTextarea);
+ const findBranchName = () => wrapper.find(GlFormInput);
+ const findMrToggle = () => wrapper.find(GlToggle);
+ const findUploadDropzone = () => wrapper.find(UploadDropzone);
+ const actionButtonDisabledState = () => findModal().props('actionPrimary').attributes[0].disabled;
+ const cancelButtonDisabledState = () => findModal().props('actionCancel').attributes[0].disabled;
+ const actionButtonLoadingState = () => findModal().props('actionPrimary').attributes[0].loading;
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ });
+
+ describe.each`
+ canPushCode | displayBranchName | displayForkedBranchMessage
+ ${true} | ${true} | ${false}
+ ${false} | ${false} | ${true}
+ `(
+ 'canPushCode = $canPushCode',
+ ({ canPushCode, displayBranchName, displayForkedBranchMessage }) => {
+ beforeEach(() => {
+ createComponent({ canPushCode });
+ });
+
+ it('displays the modal', () => {
+ expect(findModal().exists()).toBe(true);
+ });
+
+ it('includes the upload dropzone', () => {
+ expect(findUploadDropzone().exists()).toBe(true);
+ });
+
+ it('includes the commit message', () => {
+ expect(findCommitMessage().exists()).toBe(true);
+ });
+
+ it('displays the disabled upload button', () => {
+ expect(actionButtonDisabledState()).toBe(true);
+ });
+
+ it('displays the enabled cancel button', () => {
+ expect(cancelButtonDisabledState()).toBe(false);
+ });
+
+ it('does not display the MR toggle', () => {
+ expect(findMrToggle().exists()).toBe(false);
+ });
+
+ it(`${
+ displayForkedBranchMessage ? 'displays' : 'does not display'
+ } the forked branch message`, () => {
+ expect(findAlert().exists()).toBe(displayForkedBranchMessage);
+ });
+
+ it(`${displayBranchName ? 'displays' : 'does not display'} the branch name`, () => {
+ expect(findBranchName().exists()).toBe(displayBranchName);
+ });
+
+ if (canPushCode) {
+ describe('when changing the branch name', () => {
+ it('displays the MR toggle', async () => {
+ wrapper.setData({ target: 'Not master' });
+
+ await wrapper.vm.$nextTick();
+
+ expect(findMrToggle().exists()).toBe(true);
+ });
+ });
+ }
+
+ describe('completed form', () => {
+ beforeEach(() => {
+ wrapper.setData({
+ file: { type: 'jpg' },
+ filePreviewURL: 'http://file.com?format=jpg',
+ });
+ });
+
+ it('enables the upload button when the form is completed', () => {
+ expect(actionButtonDisabledState()).toBe(false);
+ });
+
+ describe('form submission', () => {
+ beforeEach(() => {
+ mock = new MockAdapter(axios);
+
+ findModal().vm.$emit('primary', mockEvent);
+ });
+
+ afterEach(() => {
+ mock.restore();
+ });
+
+ it('disables the upload button', () => {
+ expect(actionButtonDisabledState()).toBe(true);
+ });
+
+ it('sets the upload button to loading', () => {
+ expect(actionButtonLoadingState()).toBe(true);
+ });
+ });
+
+ describe('successful response', () => {
+ beforeEach(async () => {
+ mock = new MockAdapter(axios);
+ mock.onPost(initialProps.path).reply(httpStatusCodes.OK, { filePath: 'blah' });
+
+ findModal().vm.$emit('primary', mockEvent);
+
+ await waitForPromises();
+ });
+
+ it('redirects to the uploaded file', () => {
+ expect(visitUrl).toHaveBeenCalled();
+ });
+
+ afterEach(() => {
+ mock.restore();
+ });
+ });
+
+ describe('error response', () => {
+ beforeEach(async () => {
+ mock = new MockAdapter(axios);
+ mock.onPost(initialProps.path).timeout();
+
+ findModal().vm.$emit('primary', mockEvent);
+
+ await waitForPromises();
+ });
+
+ it('creates a flash error', () => {
+ expect(createFlash).toHaveBeenCalledWith('Error uploading file. Please try again.');
+ });
+
+ afterEach(() => {
+ mock.restore();
+ });
+ });
+ });
+ },
+ );
+});
diff --git a/spec/frontend/right_sidebar_spec.js b/spec/frontend/right_sidebar_spec.js
index f3719b28baa..8699e1cf420 100644
--- a/spec/frontend/right_sidebar_spec.js
+++ b/spec/frontend/right_sidebar_spec.js
@@ -27,7 +27,6 @@ const assertSidebarState = (state) => {
describe('RightSidebar', () => {
describe('fixture tests', () => {
const fixtureName = 'issues/open-issue.html';
- preloadFixtures(fixtureName);
let mock;
beforeEach(() => {
diff --git a/spec/frontend/search/highlight_blob_search_result_spec.js b/spec/frontend/search/highlight_blob_search_result_spec.js
index c1b0c7d794b..6908bcbd283 100644
--- a/spec/frontend/search/highlight_blob_search_result_spec.js
+++ b/spec/frontend/search/highlight_blob_search_result_spec.js
@@ -4,8 +4,6 @@ const fixture = 'search/blob_search_result.html';
const searchKeyword = 'Send'; // spec/frontend/fixtures/search.rb#79
describe('search/highlight_blob_search_result', () => {
- preloadFixtures(fixture);
-
beforeEach(() => loadFixtures(fixture));
it('highlights lines with search term occurrence', () => {
diff --git a/spec/frontend/search_autocomplete_spec.js b/spec/frontend/search_autocomplete_spec.js
index a9fbe0fe552..5aca07d59e4 100644
--- a/spec/frontend/search_autocomplete_spec.js
+++ b/spec/frontend/search_autocomplete_spec.js
@@ -105,7 +105,6 @@ describe('Search autocomplete dropdown', () => {
expect(list.find(mrsIHaveCreatedLink).text()).toBe("Merge requests I've created");
};
- preloadFixtures('static/search_autocomplete.html');
beforeEach(() => {
loadFixtures('static/search_autocomplete.html');
diff --git a/spec/frontend/security_configuration/configuration_table_spec.js b/spec/frontend/security_configuration/configuration_table_spec.js
index 49f9a7a3ea8..b8a574dc4e0 100644
--- a/spec/frontend/security_configuration/configuration_table_spec.js
+++ b/spec/frontend/security_configuration/configuration_table_spec.js
@@ -1,15 +1,11 @@
import { mount } from '@vue/test-utils';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import ConfigurationTable from '~/security_configuration/components/configuration_table.vue';
-import { features, UPGRADE_CTA } from '~/security_configuration/components/features_constants';
+import { scanners, UPGRADE_CTA } from '~/security_configuration/components/scanners_constants';
import {
REPORT_TYPE_SAST,
- REPORT_TYPE_DAST,
- REPORT_TYPE_DEPENDENCY_SCANNING,
- REPORT_TYPE_CONTAINER_SCANNING,
- REPORT_TYPE_COVERAGE_FUZZING,
- REPORT_TYPE_LICENSE_COMPLIANCE,
+ REPORT_TYPE_SECRET_DETECTION,
} from '~/vue_shared/security_reports/constants';
describe('Configuration Table Component', () => {
@@ -19,6 +15,8 @@ describe('Configuration Table Component', () => {
wrapper = extendedWrapper(mount(ConfigurationTable, {}));
};
+ const findHelpLinks = () => wrapper.findAll('[data-testid="help-link"]');
+
afterEach(() => {
wrapper.destroy();
});
@@ -27,22 +25,20 @@ describe('Configuration Table Component', () => {
createComponent();
});
- it.each(features)('should match strings', (feature) => {
- expect(wrapper.text()).toContain(feature.name);
- expect(wrapper.text()).toContain(feature.description);
-
- if (feature.type === REPORT_TYPE_SAST) {
- expect(wrapper.findByTestId(feature.type).text()).toBe('Configure via Merge Request');
- } else if (
- [
- REPORT_TYPE_DAST,
- REPORT_TYPE_DEPENDENCY_SCANNING,
- REPORT_TYPE_CONTAINER_SCANNING,
- REPORT_TYPE_COVERAGE_FUZZING,
- REPORT_TYPE_LICENSE_COMPLIANCE,
- ].includes(feature.type)
- ) {
- expect(wrapper.findByTestId(feature.type).text()).toMatchInterpolatedText(UPGRADE_CTA);
- }
+ describe.each(scanners.map((scanner, i) => [scanner, i]))('given scanner %s', (scanner, i) => {
+ it('should match strings', () => {
+ expect(wrapper.text()).toContain(scanner.name);
+ expect(wrapper.text()).toContain(scanner.description);
+ if (scanner.type === REPORT_TYPE_SAST) {
+ expect(wrapper.findByTestId(scanner.type).text()).toBe('Configure via Merge Request');
+ } else if (scanner.type !== REPORT_TYPE_SECRET_DETECTION) {
+ expect(wrapper.findByTestId(scanner.type).text()).toMatchInterpolatedText(UPGRADE_CTA);
+ }
+ });
+
+ it('should show expected help link', () => {
+ const helpLink = findHelpLinks().at(i);
+ expect(helpLink.attributes('href')).toBe(scanner.helpPath);
+ });
});
});
diff --git a/spec/frontend/security_configuration/upgrade_spec.js b/spec/frontend/security_configuration/upgrade_spec.js
index 0ab1108b265..1f0cc795fc5 100644
--- a/spec/frontend/security_configuration/upgrade_spec.js
+++ b/spec/frontend/security_configuration/upgrade_spec.js
@@ -1,28 +1,29 @@
import { mount } from '@vue/test-utils';
-import { UPGRADE_CTA } from '~/security_configuration/components/features_constants';
+import { UPGRADE_CTA } from '~/security_configuration/components/scanners_constants';
import Upgrade from '~/security_configuration/components/upgrade.vue';
+const TEST_URL = 'http://www.example.test';
let wrapper;
-const createComponent = () => {
- wrapper = mount(Upgrade, {});
+const createComponent = (componentData = {}) => {
+ wrapper = mount(Upgrade, componentData);
};
-beforeEach(() => {
- createComponent();
-});
-
afterEach(() => {
wrapper.destroy();
});
describe('Upgrade component', () => {
+ beforeEach(() => {
+ createComponent({ provide: { upgradePath: TEST_URL } });
+ });
+
it('renders correct text in link', () => {
expect(wrapper.text()).toMatchInterpolatedText(UPGRADE_CTA);
});
- it('renders link with correct attributes', () => {
+ it('renders link with correct default attributes', () => {
expect(wrapper.find('a').attributes()).toMatchObject({
- href: 'https://about.gitlab.com/pricing/',
+ href: TEST_URL,
target: '_blank',
});
});
diff --git a/spec/frontend/sentry/sentry_config_spec.js b/spec/frontend/sentry/sentry_config_spec.js
index f7102f9b2f9..1f5097ef2a8 100644
--- a/spec/frontend/sentry/sentry_config_spec.js
+++ b/spec/frontend/sentry/sentry_config_spec.js
@@ -1,5 +1,5 @@
+import * as Sentry from '@sentry/browser';
import SentryConfig from '~/sentry/sentry_config';
-import * as Sentry from '~/sentry/wrapper';
describe('SentryConfig', () => {
describe('IGNORE_ERRORS', () => {
diff --git a/spec/frontend/settings_panels_spec.js b/spec/frontend/settings_panels_spec.js
index 8666106d3c6..6b739617b97 100644
--- a/spec/frontend/settings_panels_spec.js
+++ b/spec/frontend/settings_panels_spec.js
@@ -2,8 +2,6 @@ import $ from 'jquery';
import initSettingsPanels, { isExpanded } from '~/settings_panels';
describe('Settings Panels', () => {
- preloadFixtures('groups/edit.html');
-
beforeEach(() => {
loadFixtures('groups/edit.html');
});
diff --git a/spec/frontend/shared/popover_spec.js b/spec/frontend/shared/popover_spec.js
deleted file mode 100644
index 59b0b3b006c..00000000000
--- a/spec/frontend/shared/popover_spec.js
+++ /dev/null
@@ -1,166 +0,0 @@
-import $ from 'jquery';
-import { togglePopover, mouseleave, mouseenter } from '~/shared/popover';
-
-describe('popover', () => {
- describe('togglePopover', () => {
- describe('togglePopover(true)', () => {
- it('returns true when popover is shown', () => {
- const context = {
- hasClass: () => false,
- popover: () => {},
- toggleClass: () => {},
- };
-
- expect(togglePopover.call(context, true)).toEqual(true);
- });
-
- it('returns false when popover is already shown', () => {
- const context = {
- hasClass: () => true,
- };
-
- expect(togglePopover.call(context, true)).toEqual(false);
- });
-
- it('shows popover', (done) => {
- const context = {
- hasClass: () => false,
- popover: () => {},
- toggleClass: () => {},
- };
-
- jest.spyOn(context, 'popover').mockImplementation((method) => {
- expect(method).toEqual('show');
- done();
- });
-
- togglePopover.call(context, true);
- });
-
- it('adds disable-animation and js-popover-show class', (done) => {
- const context = {
- hasClass: () => false,
- popover: () => {},
- toggleClass: () => {},
- };
-
- jest.spyOn(context, 'toggleClass').mockImplementation((classNames, show) => {
- expect(classNames).toEqual('disable-animation js-popover-show');
- expect(show).toEqual(true);
- done();
- });
-
- togglePopover.call(context, true);
- });
- });
-
- describe('togglePopover(false)', () => {
- it('returns true when popover is hidden', () => {
- const context = {
- hasClass: () => true,
- popover: () => {},
- toggleClass: () => {},
- };
-
- expect(togglePopover.call(context, false)).toEqual(true);
- });
-
- it('returns false when popover is already hidden', () => {
- const context = {
- hasClass: () => false,
- };
-
- expect(togglePopover.call(context, false)).toEqual(false);
- });
-
- it('hides popover', (done) => {
- const context = {
- hasClass: () => true,
- popover: () => {},
- toggleClass: () => {},
- };
-
- jest.spyOn(context, 'popover').mockImplementation((method) => {
- expect(method).toEqual('hide');
- done();
- });
-
- togglePopover.call(context, false);
- });
-
- it('removes disable-animation and js-popover-show class', (done) => {
- const context = {
- hasClass: () => true,
- popover: () => {},
- toggleClass: () => {},
- };
-
- jest.spyOn(context, 'toggleClass').mockImplementation((classNames, show) => {
- expect(classNames).toEqual('disable-animation js-popover-show');
- expect(show).toEqual(false);
- done();
- });
-
- togglePopover.call(context, false);
- });
- });
- });
-
- describe('mouseleave', () => {
- it('calls hide popover if .popover:hover is false', () => {
- const fakeJquery = {
- length: 0,
- };
-
- jest
- .spyOn($.fn, 'init')
- .mockImplementation((selector) => (selector === '.popover:hover' ? fakeJquery : $.fn));
- jest.spyOn(togglePopover, 'call').mockImplementation(() => {});
- mouseleave();
-
- expect(togglePopover.call).toHaveBeenCalledWith(expect.any(Object), false);
- });
-
- it('does not call hide popover if .popover:hover is true', () => {
- const fakeJquery = {
- length: 1,
- };
-
- jest
- .spyOn($.fn, 'init')
- .mockImplementation((selector) => (selector === '.popover:hover' ? fakeJquery : $.fn));
- jest.spyOn(togglePopover, 'call').mockImplementation(() => {});
- mouseleave();
-
- expect(togglePopover.call).not.toHaveBeenCalledWith(false);
- });
- });
-
- describe('mouseenter', () => {
- const context = {};
-
- it('shows popover', () => {
- jest.spyOn(togglePopover, 'call').mockReturnValue(false);
- mouseenter.call(context);
-
- expect(togglePopover.call).toHaveBeenCalledWith(expect.any(Object), true);
- });
-
- it('registers mouseleave event if popover is showed', (done) => {
- jest.spyOn(togglePopover, 'call').mockReturnValue(true);
- jest.spyOn($.fn, 'on').mockImplementation((eventName) => {
- expect(eventName).toEqual('mouseleave');
- done();
- });
- mouseenter.call(context);
- });
-
- it('does not register mouseleave event if popover is not showed', () => {
- jest.spyOn(togglePopover, 'call').mockReturnValue(false);
- const spy = jest.spyOn($.fn, 'on').mockImplementation(() => {});
- mouseenter.call(context);
-
- expect(spy).not.toHaveBeenCalled();
- });
- });
-});
diff --git a/spec/frontend/shortcuts_spec.js b/spec/frontend/shortcuts_spec.js
index 1650dd2c1ca..fc5eeee9687 100644
--- a/spec/frontend/shortcuts_spec.js
+++ b/spec/frontend/shortcuts_spec.js
@@ -20,8 +20,6 @@ describe('Shortcuts', () => {
target,
});
- preloadFixtures(fixtureName);
-
beforeEach(() => {
loadFixtures(fixtureName);
diff --git a/spec/frontend/sidebar/__snapshots__/confidential_issue_sidebar_spec.js.snap b/spec/frontend/sidebar/__snapshots__/confidential_issue_sidebar_spec.js.snap
deleted file mode 100644
index 2367667544d..00000000000
--- a/spec/frontend/sidebar/__snapshots__/confidential_issue_sidebar_spec.js.snap
+++ /dev/null
@@ -1,199 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Confidential Issue Sidebar Block renders for confidential = false and isEditable = false 1`] = `
-<div
- class="block issuable-sidebar-item confidentiality"
- iid=""
->
- <div
- class="sidebar-collapsed-icon"
- title="Not confidential"
- >
- <gl-icon-stub
- name="eye"
- size="16"
- />
- </div>
-
- <div
- class="title hide-collapsed"
- >
-
- Confidentiality
-
- <!---->
- </div>
-
- <div
- class="value sidebar-item-value hide-collapsed"
- >
- <!---->
-
- <div
- class="no-value sidebar-item-value"
- data-testid="not-confidential"
- >
- <gl-icon-stub
- class="sidebar-item-icon inline"
- name="eye"
- size="16"
- />
-
- Not confidential
-
- </div>
- </div>
-</div>
-`;
-
-exports[`Confidential Issue Sidebar Block renders for confidential = false and isEditable = true 1`] = `
-<div
- class="block issuable-sidebar-item confidentiality"
- iid=""
->
- <div
- class="sidebar-collapsed-icon"
- title="Not confidential"
- >
- <gl-icon-stub
- name="eye"
- size="16"
- />
- </div>
-
- <div
- class="title hide-collapsed"
- >
-
- Confidentiality
-
- <a
- class="float-right confidential-edit"
- data-track-event="click_edit_button"
- data-track-label="right_sidebar"
- data-track-property="confidentiality"
- href="#"
- >
- Edit
- </a>
- </div>
-
- <div
- class="value sidebar-item-value hide-collapsed"
- >
- <!---->
-
- <div
- class="no-value sidebar-item-value"
- data-testid="not-confidential"
- >
- <gl-icon-stub
- class="sidebar-item-icon inline"
- name="eye"
- size="16"
- />
-
- Not confidential
-
- </div>
- </div>
-</div>
-`;
-
-exports[`Confidential Issue Sidebar Block renders for confidential = true and isEditable = false 1`] = `
-<div
- class="block issuable-sidebar-item confidentiality"
- iid=""
->
- <div
- class="sidebar-collapsed-icon"
- title="Confidential"
- >
- <gl-icon-stub
- name="eye-slash"
- size="16"
- />
- </div>
-
- <div
- class="title hide-collapsed"
- >
-
- Confidentiality
-
- <!---->
- </div>
-
- <div
- class="value sidebar-item-value hide-collapsed"
- >
- <!---->
-
- <div
- class="value sidebar-item-value hide-collapsed"
- >
- <gl-icon-stub
- class="sidebar-item-icon inline is-active"
- name="eye-slash"
- size="16"
- />
-
- This issue is confidential
-
- </div>
- </div>
-</div>
-`;
-
-exports[`Confidential Issue Sidebar Block renders for confidential = true and isEditable = true 1`] = `
-<div
- class="block issuable-sidebar-item confidentiality"
- iid=""
->
- <div
- class="sidebar-collapsed-icon"
- title="Confidential"
- >
- <gl-icon-stub
- name="eye-slash"
- size="16"
- />
- </div>
-
- <div
- class="title hide-collapsed"
- >
-
- Confidentiality
-
- <a
- class="float-right confidential-edit"
- data-track-event="click_edit_button"
- data-track-label="right_sidebar"
- data-track-property="confidentiality"
- href="#"
- >
- Edit
- </a>
- </div>
-
- <div
- class="value sidebar-item-value hide-collapsed"
- >
- <!---->
-
- <div
- class="value sidebar-item-value hide-collapsed"
- >
- <gl-icon-stub
- class="sidebar-item-icon inline is-active"
- name="eye-slash"
- size="16"
- />
-
- This issue is confidential
-
- </div>
- </div>
-</div>
-`;
diff --git a/spec/frontend/sidebar/components/confidential/sidebar_confidentiality_content_spec.js b/spec/frontend/sidebar/components/confidential/sidebar_confidentiality_content_spec.js
new file mode 100644
index 00000000000..8844e1626cd
--- /dev/null
+++ b/spec/frontend/sidebar/components/confidential/sidebar_confidentiality_content_spec.js
@@ -0,0 +1,71 @@
+import { GlIcon } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import SidebarConfidentialityContent from '~/sidebar/components/confidential/sidebar_confidentiality_content.vue';
+
+describe('Sidebar Confidentiality Content', () => {
+ let wrapper;
+
+ const findIcon = () => wrapper.findComponent(GlIcon);
+ const findText = () => wrapper.find('[data-testid="confidential-text"]');
+ const findCollapsedIcon = () => wrapper.find('[data-testid="sidebar-collapsed-icon"]');
+
+ const createComponent = ({ confidential = false, issuableType = 'issue' } = {}) => {
+ wrapper = shallowMount(SidebarConfidentialityContent, {
+ propsData: {
+ confidential,
+ issuableType,
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('emits `expandSidebar` event on collapsed icon click', () => {
+ createComponent();
+ findCollapsedIcon().trigger('click');
+
+ expect(wrapper.emitted('expandSidebar')).toHaveLength(1);
+ });
+
+ describe('when issue is non-confidential', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('renders a non-confidential icon', () => {
+ expect(findIcon().props('name')).toBe('eye');
+ });
+
+ it('does not add `is-active` class to the icon', () => {
+ expect(findIcon().classes()).not.toContain('is-active');
+ });
+
+ it('displays a non-confidential text', () => {
+ expect(findText().text()).toBe('Not confidential');
+ });
+ });
+
+ describe('when issue is confidential', () => {
+ it('renders a confidential icon', () => {
+ createComponent({ confidential: true });
+ expect(findIcon().props('name')).toBe('eye-slash');
+ });
+
+ it('adds `is-active` class to the icon', () => {
+ createComponent({ confidential: true });
+ expect(findIcon().classes()).toContain('is-active');
+ });
+
+ it('displays a correct confidential text for issue', () => {
+ createComponent({ confidential: true });
+ expect(findText().text()).toBe('This issue is confidential');
+ });
+
+ it('displays a correct confidential text for epic', () => {
+ createComponent({ confidential: true, issuableType: 'epic' });
+ expect(findText().text()).toBe('This epic is confidential');
+ });
+ });
+});
diff --git a/spec/frontend/sidebar/components/confidential/sidebar_confidentiality_form_spec.js b/spec/frontend/sidebar/components/confidential/sidebar_confidentiality_form_spec.js
new file mode 100644
index 00000000000..d5e6310ed38
--- /dev/null
+++ b/spec/frontend/sidebar/components/confidential/sidebar_confidentiality_form_spec.js
@@ -0,0 +1,173 @@
+import { GlSprintf } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import { nextTick } from 'vue';
+import waitForPromises from 'helpers/wait_for_promises';
+import createFlash from '~/flash';
+import SidebarConfidentialityForm from '~/sidebar/components/confidential/sidebar_confidentiality_form.vue';
+import { confidentialityQueries } from '~/sidebar/constants';
+
+jest.mock('~/flash');
+
+describe('Sidebar Confidentiality Form', () => {
+ let wrapper;
+
+ const findWarningMessage = () => wrapper.find(`[data-testid="warning-message"]`);
+ const findConfidentialToggle = () => wrapper.find(`[data-testid="confidential-toggle"]`);
+ const findCancelButton = () => wrapper.find(`[data-testid="confidential-cancel"]`);
+
+ const createComponent = ({
+ props = {},
+ mutate = jest.fn().mockResolvedValue('Success'),
+ } = {}) => {
+ wrapper = shallowMount(SidebarConfidentialityForm, {
+ provide: {
+ fullPath: 'group/project',
+ iid: '1',
+ },
+ propsData: {
+ confidential: false,
+ issuableType: 'issue',
+ ...props,
+ },
+ mocks: {
+ $apollo: {
+ mutate,
+ },
+ },
+ stubs: {
+ GlSprintf,
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('emits a `closeForm` event when Cancel button is clicked', () => {
+ createComponent();
+ findCancelButton().vm.$emit('click');
+
+ expect(wrapper.emitted().closeForm).toHaveLength(1);
+ });
+
+ it('renders a loading state after clicking on turn on/off button', async () => {
+ createComponent();
+ findConfidentialToggle().vm.$emit('click', new MouseEvent('click'));
+
+ expect(wrapper.vm.$apollo.mutate).toHaveBeenCalled();
+ await nextTick();
+ expect(findConfidentialToggle().props('loading')).toBe(true);
+ });
+
+ it('creates a flash if mutation is rejected', async () => {
+ createComponent({ mutate: jest.fn().mockRejectedValue('Error!') });
+ findConfidentialToggle().vm.$emit('click', new MouseEvent('click'));
+ await waitForPromises();
+
+ expect(createFlash).toHaveBeenCalledWith({
+ message: 'Something went wrong while setting issue confidentiality.',
+ });
+ });
+
+ it('creates a flash if mutation contains errors', async () => {
+ createComponent({
+ mutate: jest.fn().mockResolvedValue({
+ data: { issuableSetConfidential: { errors: ['Houston, we have a problem!'] } },
+ }),
+ });
+ findConfidentialToggle().vm.$emit('click', new MouseEvent('click'));
+ await waitForPromises();
+
+ expect(createFlash).toHaveBeenCalledWith({
+ message: 'Houston, we have a problem!',
+ });
+ });
+
+ describe('when issue is not confidential', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('renders a message about making an issue confidential', () => {
+ expect(findWarningMessage().text()).toBe(
+ 'You are going to turn on confidentiality. Only team members with at least Reporter access will be able to see and leave comments on the issue.',
+ );
+ });
+
+ it('has a `Turn on` button text', () => {
+ expect(findConfidentialToggle().text()).toBe('Turn on');
+ });
+
+ it('calls a mutation to set confidential to true on button click', () => {
+ findConfidentialToggle().vm.$emit('click', new MouseEvent('click'));
+ expect(wrapper.vm.$apollo.mutate).toHaveBeenCalledWith({
+ mutation: confidentialityQueries[wrapper.vm.issuableType].mutation,
+ variables: {
+ input: {
+ confidential: true,
+ iid: '1',
+ projectPath: 'group/project',
+ },
+ },
+ });
+ });
+ });
+
+ describe('when issue is confidential', () => {
+ beforeEach(() => {
+ createComponent({ props: { confidential: true } });
+ });
+
+ it('renders a message about making an issue non-confidential', () => {
+ expect(findWarningMessage().text()).toBe(
+ 'You are going to turn off the confidentiality. This means everyone will be able to see and leave a comment on this issue.',
+ );
+ });
+
+ it('has a `Turn off` button text', () => {
+ expect(findConfidentialToggle().text()).toBe('Turn off');
+ });
+
+ it('calls a mutation to set confidential to false on button click', () => {
+ findConfidentialToggle().vm.$emit('click', new MouseEvent('click'));
+ expect(wrapper.vm.$apollo.mutate).toHaveBeenCalledWith({
+ mutation: confidentialityQueries[wrapper.vm.issuableType].mutation,
+ variables: {
+ input: {
+ confidential: false,
+ iid: '1',
+ projectPath: 'group/project',
+ },
+ },
+ });
+ });
+ });
+
+ describe('when issuable type is `epic`', () => {
+ beforeEach(() => {
+ createComponent({ props: { confidential: true, issuableType: 'epic' } });
+ });
+
+ it('renders a message about making an epic non-confidential', () => {
+ expect(findWarningMessage().text()).toBe(
+ 'You are going to turn off the confidentiality. This means everyone will be able to see and leave a comment on this epic.',
+ );
+ });
+
+ it('calls a mutation to set epic confidentiality with correct parameters', () => {
+ findConfidentialToggle().vm.$emit('click', new MouseEvent('click'));
+
+ expect(wrapper.vm.$apollo.mutate).toHaveBeenCalledWith({
+ mutation: confidentialityQueries[wrapper.vm.issuableType].mutation,
+ variables: {
+ input: {
+ confidential: false,
+ iid: '1',
+ groupPath: 'group/project',
+ },
+ },
+ });
+ });
+ });
+});
diff --git a/spec/frontend/sidebar/components/confidential/sidebar_confidentiality_widget_spec.js b/spec/frontend/sidebar/components/confidential/sidebar_confidentiality_widget_spec.js
new file mode 100644
index 00000000000..20a5be9b518
--- /dev/null
+++ b/spec/frontend/sidebar/components/confidential/sidebar_confidentiality_widget_spec.js
@@ -0,0 +1,159 @@
+import { shallowMount, createLocalVue } from '@vue/test-utils';
+import { nextTick } from 'vue';
+import VueApollo from 'vue-apollo';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import createFlash from '~/flash';
+import SidebarConfidentialityContent from '~/sidebar/components/confidential/sidebar_confidentiality_content.vue';
+import SidebarConfidentialityForm from '~/sidebar/components/confidential/sidebar_confidentiality_form.vue';
+import SidebarConfidentialityWidget, {
+ confidentialWidget,
+} from '~/sidebar/components/confidential/sidebar_confidentiality_widget.vue';
+import SidebarEditableItem from '~/sidebar/components/sidebar_editable_item.vue';
+import issueConfidentialQuery from '~/sidebar/queries/issue_confidential.query.graphql';
+import { issueConfidentialityResponse } from '../../mock_data';
+
+jest.mock('~/flash');
+
+const localVue = createLocalVue();
+localVue.use(VueApollo);
+
+describe('Sidebar Confidentiality Widget', () => {
+ let wrapper;
+ let fakeApollo;
+
+ const findEditableItem = () => wrapper.findComponent(SidebarEditableItem);
+ const findConfidentialityForm = () => wrapper.findComponent(SidebarConfidentialityForm);
+ const findConfidentialityContent = () => wrapper.findComponent(SidebarConfidentialityContent);
+
+ const createComponent = ({
+ confidentialQueryHandler = jest.fn().mockResolvedValue(issueConfidentialityResponse()),
+ } = {}) => {
+ fakeApollo = createMockApollo([[issueConfidentialQuery, confidentialQueryHandler]]);
+
+ wrapper = shallowMount(SidebarConfidentialityWidget, {
+ localVue,
+ apolloProvider: fakeApollo,
+ provide: {
+ fullPath: 'group/project',
+ iid: '1',
+ canUpdate: true,
+ },
+ propsData: {
+ issuableType: 'issue',
+ },
+ stubs: {
+ SidebarEditableItem,
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ fakeApollo = null;
+ });
+
+ it('passes a `loading` prop as true to editable item when query is loading', () => {
+ createComponent();
+
+ expect(findEditableItem().props('loading')).toBe(true);
+ });
+
+ it('exposes a method via external observable', () => {
+ createComponent();
+
+ expect(confidentialWidget.setConfidentiality).toEqual(wrapper.vm.setConfidentiality);
+ });
+
+ describe('when issue is not confidential', () => {
+ beforeEach(async () => {
+ createComponent();
+ await waitForPromises();
+ });
+
+ it('passes a `loading` prop as false to editable item', () => {
+ expect(findEditableItem().props('loading')).toBe(false);
+ });
+
+ it('passes false to `confidential` prop of child components', () => {
+ expect(findConfidentialityForm().props('confidential')).toBe(false);
+ expect(findConfidentialityContent().props('confidential')).toBe(false);
+ });
+
+ it('changes confidentiality to true after setConfidentiality is called', async () => {
+ confidentialWidget.setConfidentiality();
+ await nextTick();
+ expect(findConfidentialityForm().props('confidential')).toBe(true);
+ expect(findConfidentialityContent().props('confidential')).toBe(true);
+ });
+
+ it('emits `confidentialityUpdated` event with a `false` payload', () => {
+ expect(wrapper.emitted('confidentialityUpdated')).toEqual([[false]]);
+ });
+ });
+
+ describe('when issue is confidential', () => {
+ beforeEach(async () => {
+ createComponent({
+ confidentialQueryHandler: jest.fn().mockResolvedValue(issueConfidentialityResponse(true)),
+ });
+ await waitForPromises();
+ });
+
+ it('passes a `loading` prop as false to editable item', () => {
+ expect(findEditableItem().props('loading')).toBe(false);
+ });
+
+ it('passes false to `confidential` prop of child components', () => {
+ expect(findConfidentialityForm().props('confidential')).toBe(true);
+ expect(findConfidentialityContent().props('confidential')).toBe(true);
+ });
+
+ it('changes confidentiality to false after setConfidentiality is called', async () => {
+ confidentialWidget.setConfidentiality();
+ await nextTick();
+ expect(findConfidentialityForm().props('confidential')).toBe(false);
+ expect(findConfidentialityContent().props('confidential')).toBe(false);
+ });
+
+ it('emits `confidentialityUpdated` event with a `true` payload', () => {
+ expect(wrapper.emitted('confidentialityUpdated')).toEqual([[true]]);
+ });
+ });
+
+ it('displays a flash message when query is rejected', async () => {
+ createComponent({
+ confidentialQueryHandler: jest.fn().mockRejectedValue('Houston, we have a problem'),
+ });
+ await waitForPromises();
+
+ expect(createFlash).toHaveBeenCalled();
+ });
+
+ it('closes the form and dispatches an event when `closeForm` is emitted', async () => {
+ createComponent();
+ const el = wrapper.vm.$el;
+ jest.spyOn(el, 'dispatchEvent');
+
+ await waitForPromises();
+ wrapper.vm.$refs.editable.expand();
+ await nextTick();
+
+ expect(findConfidentialityForm().isVisible()).toBe(true);
+
+ findConfidentialityForm().vm.$emit('closeForm');
+ await nextTick();
+ expect(findConfidentialityForm().isVisible()).toBe(false);
+
+ expect(el.dispatchEvent).toHaveBeenCalled();
+ expect(wrapper.emitted('closeForm')).toHaveLength(1);
+ });
+
+ it('emits `expandSidebar` event when it is emitted from child component', async () => {
+ createComponent();
+ await waitForPromises();
+ findConfidentialityContent().vm.$emit('expandSidebar');
+
+ expect(wrapper.emitted('expandSidebar')).toHaveLength(1);
+ });
+});
diff --git a/spec/frontend/sidebar/components/reviewers/uncollapsed_reviewer_list_spec.js b/spec/frontend/sidebar/components/reviewers/uncollapsed_reviewer_list_spec.js
index 7c67149b517..9f6878db785 100644
--- a/spec/frontend/sidebar/components/reviewers/uncollapsed_reviewer_list_spec.js
+++ b/spec/frontend/sidebar/components/reviewers/uncollapsed_reviewer_list_spec.js
@@ -7,6 +7,8 @@ import userDataMock from '../../user_data_mock';
describe('UncollapsedReviewerList component', () => {
let wrapper;
+ const reviewerApprovalIcons = () => wrapper.findAll('[data-testid="re-approved"]');
+
function createComponent(props = {}) {
const propsData = {
users: [],
@@ -58,19 +60,29 @@ describe('UncollapsedReviewerList component', () => {
const user = userDataMock();
createComponent({
- users: [user, { ...user, id: 2, username: 'hello-world' }],
+ users: [user, { ...user, id: 2, username: 'hello-world', approved: true }],
});
});
- it('only has one user', () => {
+ it('has both users', () => {
expect(wrapper.findAll(ReviewerAvatarLink).length).toBe(2);
});
- it('shows one user with avatar, username and author name', () => {
+ it('shows both users with avatar, username and author name', () => {
expect(wrapper.text()).toContain(`@root`);
expect(wrapper.text()).toContain(`@hello-world`);
});
+ it('renders approval icon', () => {
+ expect(reviewerApprovalIcons().length).toBe(1);
+ });
+
+ it('shows that hello-world approved', () => {
+ const icon = reviewerApprovalIcons().at(0);
+
+ expect(icon.attributes('title')).toEqual('Approved by @hello-world');
+ });
+
it('renders re-request loading icon', async () => {
await wrapper.setData({ loadingStates: { 2: 'loading' } });
diff --git a/spec/frontend/sidebar/confidential/__snapshots__/edit_form_spec.js.snap b/spec/frontend/sidebar/confidential/__snapshots__/edit_form_spec.js.snap
deleted file mode 100644
index d33f6c7f389..00000000000
--- a/spec/frontend/sidebar/confidential/__snapshots__/edit_form_spec.js.snap
+++ /dev/null
@@ -1,50 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Edit Form Dropdown when confidential renders on or off text based on confidentiality 1`] = `
-<div
- class="dropdown show"
- toggleform="function () {}"
- updateconfidentialattribute="function () {}"
->
- <div
- class="dropdown-menu sidebar-item-warning-message"
- >
- <div>
- <p>
- <gl-sprintf-stub
- message="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}."
- />
- </p>
-
- <edit-form-buttons-stub
- confidential="true"
- fullpath=""
- />
- </div>
- </div>
-</div>
-`;
-
-exports[`Edit Form Dropdown when not confidential renders "You are going to turn on the confidentiality." in the 1`] = `
-<div
- class="dropdown show"
- toggleform="function () {}"
- updateconfidentialattribute="function () {}"
->
- <div
- class="dropdown-menu sidebar-item-warning-message"
- >
- <div>
- <p>
- <gl-sprintf-stub
- message="You are going to turn on the confidentiality. This means that only team members with %{strongStart}at least Reporter access%{strongEnd} are able to see and leave comments on the %{issuableType}."
- />
- </p>
-
- <edit-form-buttons-stub
- fullpath=""
- />
- </div>
- </div>
-</div>
-`;
diff --git a/spec/frontend/sidebar/confidential/edit_form_buttons_spec.js b/spec/frontend/sidebar/confidential/edit_form_buttons_spec.js
deleted file mode 100644
index 427e3a89c29..00000000000
--- a/spec/frontend/sidebar/confidential/edit_form_buttons_spec.js
+++ /dev/null
@@ -1,146 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import waitForPromises from 'helpers/wait_for_promises';
-import { deprecatedCreateFlash as flash } from '~/flash';
-import createStore from '~/notes/stores';
-import EditFormButtons from '~/sidebar/components/confidential/edit_form_buttons.vue';
-import eventHub from '~/sidebar/event_hub';
-
-jest.mock('~/sidebar/event_hub', () => ({ $emit: jest.fn() }));
-jest.mock('~/flash');
-
-describe('Edit Form Buttons', () => {
- let wrapper;
- let store;
- const findConfidentialToggle = () => wrapper.find('[data-testid="confidential-toggle"]');
-
- const createComponent = ({ props = {}, data = {}, resolved = true }) => {
- store = createStore();
- if (resolved) {
- jest.spyOn(store, 'dispatch').mockResolvedValue();
- } else {
- jest.spyOn(store, 'dispatch').mockRejectedValue();
- }
-
- wrapper = shallowMount(EditFormButtons, {
- propsData: {
- fullPath: '',
- ...props,
- },
- data() {
- return {
- isLoading: true,
- ...data,
- };
- },
- store,
- });
- };
-
- afterEach(() => {
- wrapper.destroy();
- wrapper = null;
- });
-
- describe('when isLoading', () => {
- beforeEach(() => {
- createComponent({
- props: {
- confidential: false,
- },
- });
- });
-
- it('renders "Applying" in the toggle button', () => {
- expect(findConfidentialToggle().text()).toBe('Applying');
- });
-
- it('disables the toggle button', () => {
- expect(findConfidentialToggle().props('disabled')).toBe(true);
- });
-
- it('sets loading on the toggle button', () => {
- expect(findConfidentialToggle().props('loading')).toBe(true);
- });
- });
-
- describe('when not confidential', () => {
- it('renders Turn On in the toggle button', () => {
- createComponent({
- data: {
- isLoading: false,
- },
- props: {
- confidential: false,
- },
- });
-
- expect(findConfidentialToggle().text()).toBe('Turn On');
- });
- });
-
- describe('when confidential', () => {
- beforeEach(() => {
- createComponent({
- data: {
- isLoading: false,
- },
- props: {
- confidential: true,
- },
- });
- });
-
- it('renders on or off text based on confidentiality', () => {
- expect(findConfidentialToggle().text()).toBe('Turn Off');
- });
- });
-
- describe('when succeeds', () => {
- beforeEach(() => {
- createComponent({ data: { isLoading: false }, props: { confidential: true } });
- findConfidentialToggle().vm.$emit('click', new Event('click'));
- });
-
- it('dispatches the correct action', () => {
- expect(store.dispatch).toHaveBeenCalledWith('updateConfidentialityOnIssuable', {
- confidential: false,
- fullPath: '',
- });
- });
-
- it('resets loading on the toggle button', () => {
- return waitForPromises().then(() => {
- expect(findConfidentialToggle().props('loading')).toBe(false);
- });
- });
-
- it('emits close form', () => {
- return waitForPromises().then(() => {
- expect(eventHub.$emit).toHaveBeenCalledWith('closeConfidentialityForm');
- });
- });
-
- it('emits updateOnConfidentiality event', () => {
- return waitForPromises().then(() => {
- expect(eventHub.$emit).toHaveBeenCalledWith('updateIssuableConfidentiality', false);
- });
- });
- });
-
- describe('when fails', () => {
- beforeEach(() => {
- createComponent({
- data: { isLoading: false },
- props: { confidential: true },
- resolved: false,
- });
- findConfidentialToggle().vm.$emit('click', new Event('click'));
- });
-
- it('calls flash with the correct message', () => {
- expect(flash).toHaveBeenCalledWith(
- 'Something went wrong trying to change the confidentiality of this issue',
- );
- });
- });
-});
diff --git a/spec/frontend/sidebar/confidential/edit_form_spec.js b/spec/frontend/sidebar/confidential/edit_form_spec.js
deleted file mode 100644
index 6b571df10ae..00000000000
--- a/spec/frontend/sidebar/confidential/edit_form_spec.js
+++ /dev/null
@@ -1,48 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import EditForm from '~/sidebar/components/confidential/edit_form.vue';
-
-describe('Edit Form Dropdown', () => {
- let wrapper;
- const toggleForm = () => {};
- const updateConfidentialAttribute = () => {};
-
- const createComponent = (props) => {
- wrapper = shallowMount(EditForm, {
- propsData: {
- ...props,
- isLoading: false,
- fullPath: '',
- issuableType: 'issue',
- },
- });
- };
-
- afterEach(() => {
- wrapper.destroy();
- wrapper = null;
- });
-
- describe('when not confidential', () => {
- it('renders "You are going to turn on the confidentiality." in the ', () => {
- createComponent({
- confidential: false,
- toggleForm,
- updateConfidentialAttribute,
- });
-
- expect(wrapper.element).toMatchSnapshot();
- });
- });
-
- describe('when confidential', () => {
- it('renders on or off text based on confidentiality', () => {
- createComponent({
- confidential: true,
- toggleForm,
- updateConfidentialAttribute,
- });
-
- expect(wrapper.element).toMatchSnapshot();
- });
- });
-});
diff --git a/spec/frontend/sidebar/confidential_issue_sidebar_spec.js b/spec/frontend/sidebar/confidential_issue_sidebar_spec.js
deleted file mode 100644
index 93a6401b1fc..00000000000
--- a/spec/frontend/sidebar/confidential_issue_sidebar_spec.js
+++ /dev/null
@@ -1,159 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import { useMockLocationHelper } from 'helpers/mock_window_location_helper';
-import { mockTracking, triggerEvent } from 'helpers/tracking_helper';
-import createStore from '~/notes/stores';
-import * as types from '~/notes/stores/mutation_types';
-import ConfidentialIssueSidebar from '~/sidebar/components/confidential/confidential_issue_sidebar.vue';
-import EditForm from '~/sidebar/components/confidential/edit_form.vue';
-
-jest.mock('~/flash');
-jest.mock('~/sidebar/services/sidebar_service');
-
-describe('Confidential Issue Sidebar Block', () => {
- useMockLocationHelper();
-
- let wrapper;
- const mutate = jest
- .fn()
- .mockResolvedValue({ data: { issueSetConfidential: { issue: { confidential: true } } } });
-
- const createComponent = ({ propsData, data = {} }) => {
- const store = createStore();
- wrapper = shallowMount(ConfidentialIssueSidebar, {
- store,
- data() {
- return data;
- },
- propsData: {
- iid: '',
- fullPath: '',
- ...propsData,
- },
- mocks: {
- $apollo: {
- mutate,
- },
- },
- });
- };
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it.each`
- confidential | isEditable
- ${false} | ${false}
- ${false} | ${true}
- ${true} | ${false}
- ${true} | ${true}
- `(
- 'renders for confidential = $confidential and isEditable = $isEditable',
- ({ confidential, isEditable }) => {
- createComponent({
- propsData: {
- isEditable,
- },
- });
- wrapper.vm.$store.state.noteableData.confidential = confidential;
-
- return wrapper.vm.$nextTick().then(() => {
- expect(wrapper.element).toMatchSnapshot();
- });
- },
- );
-
- describe('if editable', () => {
- beforeEach(() => {
- createComponent({
- propsData: {
- isEditable: true,
- },
- });
- wrapper.vm.$store.state.noteableData.confidential = true;
- });
-
- it('displays the edit form when editable', () => {
- wrapper.setData({ edit: false });
-
- return wrapper.vm
- .$nextTick()
- .then(() => {
- wrapper.find({ ref: 'editLink' }).trigger('click');
- return wrapper.vm.$nextTick();
- })
- .then(() => {
- expect(wrapper.find(EditForm).exists()).toBe(true);
- });
- });
-
- it('displays the edit form when opened from collapsed state', () => {
- wrapper.setData({ edit: false });
-
- return wrapper.vm
- .$nextTick()
- .then(() => {
- wrapper.find({ ref: 'collapseIcon' }).trigger('click');
- return wrapper.vm.$nextTick();
- })
- .then(() => {
- expect(wrapper.find(EditForm).exists()).toBe(true);
- });
- });
-
- it('tracks the event when "Edit" is clicked', () => {
- const spy = mockTracking('_category_', wrapper.element, jest.spyOn);
-
- const editLink = wrapper.find({ ref: 'editLink' });
- triggerEvent(editLink.element);
-
- expect(spy).toHaveBeenCalledWith('_category_', 'click_edit_button', {
- label: 'right_sidebar',
- property: 'confidentiality',
- });
- });
- });
- describe('computed confidential', () => {
- beforeEach(() => {
- createComponent({
- propsData: {
- isEditable: true,
- },
- });
- });
-
- it('returns false when noteableData is not present', () => {
- wrapper.vm.$store.commit(types.SET_NOTEABLE_DATA, null);
-
- expect(wrapper.vm.confidential).toBe(false);
- });
-
- it('returns true when noteableData has confidential attr as true', () => {
- wrapper.vm.$store.commit(types.SET_NOTEABLE_DATA, {});
- wrapper.vm.$store.commit(types.SET_ISSUE_CONFIDENTIAL, true);
-
- expect(wrapper.vm.confidential).toBe(true);
- });
-
- it('returns false when noteableData has confidential attr as false', () => {
- wrapper.vm.$store.commit(types.SET_NOTEABLE_DATA, {});
- wrapper.vm.$store.commit(types.SET_ISSUE_CONFIDENTIAL, false);
-
- expect(wrapper.vm.confidential).toBe(false);
- });
-
- it('returns true when confidential attr is true', () => {
- wrapper.vm.$store.commit(types.SET_NOTEABLE_DATA, {});
- wrapper.vm.$store.commit(types.SET_ISSUE_CONFIDENTIAL, true);
-
- expect(wrapper.vm.confidential).toBe(true);
- });
-
- it('returns false when confidential attr is false', () => {
- wrapper.vm.$store.commit(types.SET_NOTEABLE_DATA, {});
- wrapper.vm.$store.commit(types.SET_ISSUE_CONFIDENTIAL, false);
-
- expect(wrapper.vm.confidential).toBe(false);
- });
- });
-});
diff --git a/spec/frontend/sidebar/mock_data.js b/spec/frontend/sidebar/mock_data.js
index 3dde40260eb..6268499b4e8 100644
--- a/spec/frontend/sidebar/mock_data.js
+++ b/spec/frontend/sidebar/mock_data.js
@@ -220,4 +220,17 @@ const mockData = {
},
};
+export const issueConfidentialityResponse = (confidential = false) => ({
+ data: {
+ workspace: {
+ __typename: 'Project',
+ issuable: {
+ __typename: 'Issue',
+ id: 'gid://gitlab/Issue/4',
+ confidential,
+ },
+ },
+ },
+});
+
export default mockData;
diff --git a/spec/frontend/sidebar/subscriptions_spec.js b/spec/frontend/sidebar/subscriptions_spec.js
index e7ae59e26cf..6ab8e1e0ebc 100644
--- a/spec/frontend/sidebar/subscriptions_spec.js
+++ b/spec/frontend/sidebar/subscriptions_spec.js
@@ -84,6 +84,15 @@ describe('Subscriptions', () => {
spy.mockRestore();
});
+ it('has visually hidden label', () => {
+ wrapper = mountComponent();
+
+ expect(findToggleButton().props()).toMatchObject({
+ label: 'Notifications',
+ labelPosition: 'hidden',
+ });
+ });
+
describe('given project emails are disabled', () => {
const subscribeDisabledDescription = 'Notifications have been disabled';
diff --git a/spec/frontend/sidebar/user_data_mock.js b/spec/frontend/sidebar/user_data_mock.js
index 41d0331f34a..7c11551b0be 100644
--- a/spec/frontend/sidebar/user_data_mock.js
+++ b/spec/frontend/sidebar/user_data_mock.js
@@ -10,4 +10,5 @@ export default () => ({
can_merge: true,
can_update_merge_request: true,
reviewed: true,
+ approved: false,
});
diff --git a/spec/frontend/single_file_diff_spec.js b/spec/frontend/single_file_diff_spec.js
new file mode 100644
index 00000000000..8718152655f
--- /dev/null
+++ b/spec/frontend/single_file_diff_spec.js
@@ -0,0 +1,96 @@
+import MockAdapter from 'axios-mock-adapter';
+import $ from 'jquery';
+import { setHTMLFixture } from 'helpers/fixtures';
+import axios from '~/lib/utils/axios_utils';
+import SingleFileDiff from '~/single_file_diff';
+
+describe('SingleFileDiff', () => {
+ let mock = new MockAdapter(axios);
+ const blobDiffPath = '/mock-path';
+
+ beforeEach(() => {
+ mock = new MockAdapter(axios);
+ mock.onGet(blobDiffPath).replyOnce(200, { html: `<div class="diff-content">MOCKED</div>` });
+ });
+
+ afterEach(() => {
+ mock.restore();
+ });
+
+ it('loads diff via axios exactly once for collapsed diffs', async () => {
+ setHTMLFixture(`
+ <div class="diff-file">
+ <div class="js-file-title">
+ MOCK TITLE
+ </div>
+
+ <div class="diff-content">
+ <div class="diff-viewer" data-type="simple">
+ <div
+ class="nothing-here-block diff-collapsed"
+ data-diff-for-path="${blobDiffPath}"
+ >
+ MOCK CONTENT
+ </div>
+ </div>
+ </div>
+ </div>
+`);
+
+ // Collapsed is the default state
+ const diff = new SingleFileDiff(document.querySelector('.diff-file'));
+ expect(diff.isOpen).toBe(false);
+ expect(diff.content).toBeNull();
+ expect(diff.diffForPath).toEqual(blobDiffPath);
+
+ // Opening for the first time
+ await diff.toggleDiff($(document.querySelector('.js-file-title')));
+ expect(diff.isOpen).toBe(true);
+ expect(diff.content).not.toBeNull();
+
+ // Collapsing again
+ await diff.toggleDiff($(document.querySelector('.js-file-title')));
+ expect(diff.isOpen).toBe(false);
+ expect(diff.content).not.toBeNull();
+
+ mock.onGet(blobDiffPath).replyOnce(400, '');
+
+ // Opening again
+ await diff.toggleDiff($(document.querySelector('.js-file-title')));
+ expect(diff.isOpen).toBe(true);
+ expect(diff.content).not.toBeNull();
+
+ expect(mock.history.get.length).toBe(1);
+ });
+
+ it('does not load diffs via axios for already expanded diffs', async () => {
+ setHTMLFixture(`
+ <div class="diff-file">
+ <div class="js-file-title">
+ MOCK TITLE
+ </div>
+
+ <div class="diff-content">
+ EXPANDED MOCK CONTENT
+ </div>
+ </div>
+`);
+
+ // Opened is the default state
+ const diff = new SingleFileDiff(document.querySelector('.diff-file'));
+ expect(diff.isOpen).toBe(true);
+ expect(diff.content).not.toBeNull();
+ expect(diff.diffForPath).toEqual(undefined);
+
+ // Collapsing for the first time
+ await diff.toggleDiff($(document.querySelector('.js-file-title')));
+ expect(diff.isOpen).toBe(false);
+ expect(diff.content).not.toBeNull();
+
+ // Opening again
+ await diff.toggleDiff($(document.querySelector('.js-file-title')));
+ expect(diff.isOpen).toBe(true);
+
+ expect(mock.history.get.length).toBe(0);
+ });
+});
diff --git a/spec/frontend/snippets/components/__snapshots__/snippet_visibility_edit_spec.js.snap b/spec/frontend/snippets/components/__snapshots__/snippet_visibility_edit_spec.js.snap
index 8446f0f50c4..95da67c2bbf 100644
--- a/spec/frontend/snippets/components/__snapshots__/snippet_visibility_edit_spec.js.snap
+++ b/spec/frontend/snippets/components/__snapshots__/snippet_visibility_edit_spec.js.snap
@@ -46,6 +46,8 @@ exports[`Snippet Visibility Edit component rendering matches the snapshot 1`] =
<span
class="font-weight-bold ml-1 js-visibility-option"
+ data-qa-selector="visibility_content"
+ data-qa-visibility="Private"
>
Private
</span>
@@ -65,6 +67,8 @@ exports[`Snippet Visibility Edit component rendering matches the snapshot 1`] =
<span
class="font-weight-bold ml-1 js-visibility-option"
+ data-qa-selector="visibility_content"
+ data-qa-visibility="Internal"
>
Internal
</span>
@@ -84,6 +88,8 @@ exports[`Snippet Visibility Edit component rendering matches the snapshot 1`] =
<span
class="font-weight-bold ml-1 js-visibility-option"
+ data-qa-selector="visibility_content"
+ data-qa-visibility="Public"
>
Public
</span>
diff --git a/spec/frontend/test_setup.js b/spec/frontend/test_setup.js
index b6b29faef79..9b95ed6b816 100644
--- a/spec/frontend/test_setup.js
+++ b/spec/frontend/test_setup.js
@@ -44,11 +44,6 @@ Object.assign(global, {
getJSONFixture,
loadFixtures: loadHTMLFixture,
setFixtures: setHTMLFixture,
-
- // The following functions fill the fixtures cache in Karma.
- // This is not necessary in Jest because we make no Ajax request.
- loadJSONFixtures() {},
- preloadFixtures() {},
});
// custom-jquery-matchers was written for an old Jest version, we need to make it compatible
diff --git a/spec/frontend/tooltips/components/tooltips_spec.js b/spec/frontend/tooltips/components/tooltips_spec.js
index e21626456e2..c44918ceaf3 100644
--- a/spec/frontend/tooltips/components/tooltips_spec.js
+++ b/spec/frontend/tooltips/components/tooltips_spec.js
@@ -217,4 +217,14 @@ describe('tooltips/components/tooltips.vue', () => {
wrapper.destroy();
expect(observersCount()).toBe(0);
});
+
+ it('exposes hidden event', async () => {
+ buildWrapper();
+ wrapper.vm.addTooltips([createTooltipTarget()]);
+
+ await wrapper.vm.$nextTick();
+
+ wrapper.findComponent(GlTooltip).vm.$emit('hidden');
+ expect(wrapper.emitted('hidden')).toHaveLength(1);
+ });
});
diff --git a/spec/frontend/tracking_spec.js b/spec/frontend/tracking_spec.js
index a516a4a8269..6a22de3be5c 100644
--- a/spec/frontend/tracking_spec.js
+++ b/spec/frontend/tracking_spec.js
@@ -1,5 +1,9 @@
import { setHTMLFixture } from 'helpers/fixtures';
-import Tracking, { initUserTracking, initDefaultTrackers } from '~/tracking';
+import { TRACKING_CONTEXT_SCHEMA } from '~/experimentation/constants';
+import { getExperimentData } from '~/experimentation/utils';
+import Tracking, { initUserTracking, initDefaultTrackers, STANDARD_CONTEXT } from '~/tracking';
+
+jest.mock('~/experimentation/utils', () => ({ getExperimentData: jest.fn() }));
describe('Tracking', () => {
let snowplowSpy;
@@ -7,6 +11,8 @@ describe('Tracking', () => {
let trackLoadEventsSpy;
beforeEach(() => {
+ getExperimentData.mockReturnValue(undefined);
+
window.snowplow = window.snowplow || (() => {});
window.snowplowOptions = {
namespace: '_namespace_',
@@ -45,7 +51,7 @@ describe('Tracking', () => {
it('should activate features based on what has been enabled', () => {
initDefaultTrackers();
expect(snowplowSpy).toHaveBeenCalledWith('enableActivityTracking', 30, 30);
- expect(snowplowSpy).toHaveBeenCalledWith('trackPageView');
+ expect(snowplowSpy).toHaveBeenCalledWith('trackPageView', null, [STANDARD_CONTEXT]);
expect(snowplowSpy).not.toHaveBeenCalledWith('enableFormTracking');
expect(snowplowSpy).not.toHaveBeenCalledWith('enableLinkClickTracking');
@@ -78,6 +84,34 @@ describe('Tracking', () => {
navigator.msDoNotTrack = undefined;
});
+ describe('builds the standard context', () => {
+ let standardContext;
+
+ beforeAll(async () => {
+ window.gl = window.gl || {};
+ window.gl.snowplowStandardContext = {
+ schema: 'iglu:com.gitlab/gitlab_standard',
+ data: {
+ environment: 'testing',
+ source: 'unknown',
+ },
+ };
+
+ jest.resetModules();
+
+ ({ STANDARD_CONTEXT: standardContext } = await import('~/tracking'));
+ });
+
+ it('uses server data', () => {
+ expect(standardContext.schema).toBe('iglu:com.gitlab/gitlab_standard');
+ expect(standardContext.data.environment).toBe('testing');
+ });
+
+ it('overrides schema source', () => {
+ expect(standardContext.data.source).toBe('gitlab-javascript');
+ });
+ });
+
it('tracks to snowplow (our current tracking system)', () => {
Tracking.event('_category_', '_eventName_', { label: '_label_' });
@@ -88,7 +122,7 @@ describe('Tracking', () => {
'_label_',
undefined,
undefined,
- undefined,
+ [STANDARD_CONTEXT],
);
});
@@ -121,6 +155,27 @@ describe('Tracking', () => {
});
});
+ describe('.flushPendingEvents', () => {
+ it('flushes any pending events', () => {
+ Tracking.initialized = false;
+ Tracking.event('_category_', '_eventName_', { label: '_label_' });
+
+ expect(snowplowSpy).not.toHaveBeenCalled();
+
+ Tracking.flushPendingEvents();
+
+ expect(snowplowSpy).toHaveBeenCalledWith(
+ 'trackStructEvent',
+ '_category_',
+ '_eventName_',
+ '_label_',
+ undefined,
+ undefined,
+ [STANDARD_CONTEXT],
+ );
+ });
+ });
+
describe('tracking interface events', () => {
let eventSpy;
@@ -134,6 +189,7 @@ describe('Tracking', () => {
<input class="dropdown" data-track-event="toggle_dropdown"/>
<div data-track-event="nested_event"><span class="nested"></span></div>
<input data-track-eventbogus="click_bogusinput" data-track-label="_label_" value="_value_"/>
+ <input data-track-event="click_input3" data-track-experiment="example" value="_value_"/>
`);
});
@@ -193,6 +249,22 @@ describe('Tracking', () => {
expect(eventSpy).toHaveBeenCalledWith('_category_', 'nested_event', {});
});
+
+ it('brings in experiment data if linked to an experiment', () => {
+ const mockExperimentData = {
+ variant: 'candidate',
+ experiment: 'repo_integrations_link',
+ key: '2bff73f6bb8cc11156c50a8ba66b9b8b',
+ };
+ getExperimentData.mockReturnValue(mockExperimentData);
+
+ document.querySelector('[data-track-event="click_input3"]').click();
+
+ expect(eventSpy).toHaveBeenCalledWith('_category_', 'click_input3', {
+ value: '_value_',
+ context: { schema: TRACKING_CONTEXT_SCHEMA, data: mockExperimentData },
+ });
+ });
});
describe('tracking page loaded events', () => {
@@ -235,21 +307,21 @@ describe('Tracking', () => {
describe('tracking mixin', () => {
describe('trackingOptions', () => {
- it('return the options defined on initialisation', () => {
+ it('returns the options defined on initialisation', () => {
const mixin = Tracking.mixin({ foo: 'bar' });
expect(mixin.computed.trackingOptions()).toEqual({ foo: 'bar' });
});
- it('local tracking value override and extend options', () => {
+ it('lets local tracking value override and extend options', () => {
const mixin = Tracking.mixin({ foo: 'bar' });
- // the value of this in the vue lifecyle is different, but this serve the tests purposes
+ // The value of this in the Vue lifecyle is different, but this serves the test's purposes
mixin.computed.tracking = { foo: 'baz', baz: 'bar' };
expect(mixin.computed.trackingOptions()).toEqual({ foo: 'baz', baz: 'bar' });
});
});
describe('trackingCategory', () => {
- it('return the category set in the component properties first', () => {
+ it('returns the category set in the component properties first', () => {
const mixin = Tracking.mixin({ category: 'foo' });
mixin.computed.tracking = {
category: 'bar',
@@ -257,12 +329,12 @@ describe('Tracking', () => {
expect(mixin.computed.trackingCategory()).toBe('bar');
});
- it('return the category set in the options', () => {
+ it('returns the category set in the options', () => {
const mixin = Tracking.mixin({ category: 'foo' });
expect(mixin.computed.trackingCategory()).toBe('foo');
});
- it('if no category is selected returns undefined', () => {
+ it('returns undefined if no category is selected', () => {
const mixin = Tracking.mixin();
expect(mixin.computed.trackingCategory()).toBe(undefined);
});
@@ -297,7 +369,7 @@ describe('Tracking', () => {
expect(eventSpy).toHaveBeenCalledWith(undefined, 'foo', {});
});
- it('give precedence to data for category and options', () => {
+ it('gives precedence to data for category and options', () => {
mixin.trackingCategory = mixin.trackingCategory();
mixin.trackingOptions = mixin.trackingOptions();
const data = { category: 'foo', label: 'baz' };
diff --git a/spec/frontend/user_popovers_spec.js b/spec/frontend/user_popovers_spec.js
index 7c9c3d69efa..745b66fd700 100644
--- a/spec/frontend/user_popovers_spec.js
+++ b/spec/frontend/user_popovers_spec.js
@@ -3,9 +3,21 @@ import initUserPopovers from '~/user_popovers';
describe('User Popovers', () => {
const fixtureTemplate = 'merge_requests/merge_request_with_mentions.html';
- preloadFixtures(fixtureTemplate);
const selector = '.js-user-link, .gfm-project_member';
+ const findFixtureLinks = () => {
+ return Array.from(document.querySelectorAll(selector)).filter(
+ ({ dataset }) => dataset.user || dataset.userId,
+ );
+ };
+ const createUserLink = () => {
+ const link = document.createElement('a');
+
+ link.classList.add('js-user-link');
+ link.setAttribute('data-user', '1');
+
+ return link;
+ };
const dummyUser = { name: 'root' };
const dummyUserStatus = { message: 'active' };
@@ -37,13 +49,20 @@ describe('User Popovers', () => {
});
it('initializes a popover for each user link with a user id', () => {
- const linksWithUsers = Array.from(document.querySelectorAll(selector)).filter(
- ({ dataset }) => dataset.user || dataset.userId,
- );
+ const linksWithUsers = findFixtureLinks();
expect(linksWithUsers.length).toBe(popovers.length);
});
+ it('adds popovers to user links added to the DOM tree after the initial call', async () => {
+ document.body.appendChild(createUserLink());
+ document.body.appendChild(createUserLink());
+
+ const linksWithUsers = findFixtureLinks();
+
+ expect(linksWithUsers.length).toBe(popovers.length + 2);
+ });
+
it('does not initialize the user popovers twice for the same element', () => {
const newPopovers = initUserPopovers(document.querySelectorAll(selector));
const samePopovers = popovers.every((popover, index) => newPopovers[index] === popover);
diff --git a/spec/frontend/vue_mr_widget/components/artifacts_list_app_spec.js b/spec/frontend/vue_mr_widget/components/artifacts_list_app_spec.js
index b2cc7d9be6b..e2386bc7f2b 100644
--- a/spec/frontend/vue_mr_widget/components/artifacts_list_app_spec.js
+++ b/spec/frontend/vue_mr_widget/components/artifacts_list_app_spec.js
@@ -48,7 +48,7 @@ describe('Merge Requests Artifacts list app', () => {
};
const findButtons = () => wrapper.findAll('button');
- const findTitle = () => wrapper.find('.js-title');
+ const findTitle = () => wrapper.find('[data-testid="mr-collapsible-title"]');
const findErrorMessage = () => wrapper.find('.js-error-state');
const findTableRows = () => wrapper.findAll('tbody tr');
diff --git a/spec/frontend/vue_mr_widget/components/mr_collapsible_extension_spec.js b/spec/frontend/vue_mr_widget/components/mr_collapsible_extension_spec.js
index 94d4cccab5f..1aeb080aa04 100644
--- a/spec/frontend/vue_mr_widget/components/mr_collapsible_extension_spec.js
+++ b/spec/frontend/vue_mr_widget/components/mr_collapsible_extension_spec.js
@@ -1,4 +1,4 @@
-import { GlLoadingIcon } from '@gitlab/ui';
+import { GlLoadingIcon, GlIcon } from '@gitlab/ui';
import { mount } from '@vue/test-utils';
import MrCollapsibleSection from '~/vue_merge_request_widget/components/mr_collapsible_extension.vue';
@@ -15,12 +15,14 @@ describe('Merge Request Collapsible Extension', () => {
},
slots: {
default: '<div class="js-slot">Foo</div>',
+ header: '<span data-testid="collapsed-header">hello there</span>',
},
});
};
- const findTitle = () => wrapper.find('.js-title');
+ const findTitle = () => wrapper.find('[data-testid="mr-collapsible-title"]');
const findErrorMessage = () => wrapper.find('.js-error-state');
+ const findIcon = () => wrapper.find(GlIcon);
afterEach(() => {
wrapper.destroy();
@@ -35,8 +37,12 @@ describe('Merge Request Collapsible Extension', () => {
expect(findTitle().text()).toBe(data.title);
});
+ it('renders the header slot', () => {
+ expect(wrapper.find('[data-testid="collapsed-header"]').text()).toBe('hello there');
+ });
+
it('renders angle-right icon', () => {
- expect(wrapper.vm.arrowIconName).toBe('angle-right');
+ expect(findIcon().props('name')).toBe('angle-right');
});
describe('onClick', () => {
@@ -54,7 +60,7 @@ describe('Merge Request Collapsible Extension', () => {
});
it('renders angle-down icon', () => {
- expect(wrapper.vm.arrowIconName).toBe('angle-down');
+ expect(findIcon().props('name')).toBe('angle-down');
});
});
});
diff --git a/spec/frontend/vue_mr_widget/components/mr_widget_pipeline_container_spec.js b/spec/frontend/vue_mr_widget/components/mr_widget_pipeline_container_spec.js
index 3baade5161e..5ec719b17d6 100644
--- a/spec/frontend/vue_mr_widget/components/mr_widget_pipeline_container_spec.js
+++ b/spec/frontend/vue_mr_widget/components/mr_widget_pipeline_container_spec.js
@@ -2,6 +2,7 @@ import { mount } from '@vue/test-utils';
import MockAdapter from 'axios-mock-adapter';
import axios from '~/lib/utils/axios_utils';
import ArtifactsApp from '~/vue_merge_request_widget/components/artifacts_list_app.vue';
+import DeploymentList from '~/vue_merge_request_widget/components/deployment/deployment_list.vue';
import MrWidgetPipeline from '~/vue_merge_request_widget/components/mr_widget_pipeline.vue';
import MrWidgetPipelineContainer from '~/vue_merge_request_widget/components/mr_widget_pipeline_container.vue';
import { mockStore } from '../mock_data';
@@ -28,6 +29,8 @@ describe('MrWidgetPipelineContainer', () => {
wrapper.destroy();
});
+ const findDeploymentList = () => wrapper.findComponent(DeploymentList);
+
describe('when pre merge', () => {
beforeEach(() => {
factory();
@@ -55,6 +58,9 @@ describe('MrWidgetPipelineContainer', () => {
const deployments = wrapper.findAll('.mr-widget-extension .js-pre-deployment');
+ expect(findDeploymentList().exists()).toBe(true);
+ expect(findDeploymentList().props('deployments')).toBe(mockStore.deployments);
+
expect(deployments.wrappers.map((x) => x.props())).toEqual(expectedProps);
});
});
@@ -100,6 +106,8 @@ describe('MrWidgetPipelineContainer', () => {
const deployments = wrapper.findAll('.mr-widget-extension .js-post-deployment');
+ expect(findDeploymentList().exists()).toBe(true);
+ expect(findDeploymentList().props('deployments')).toBe(mockStore.postMergeDeployments);
expect(deployments.wrappers.map((x) => x.props())).toEqual(expectedProps);
});
});
diff --git a/spec/frontend/vue_mr_widget/components/mr_widget_pipeline_spec.js b/spec/frontend/vue_mr_widget/components/mr_widget_pipeline_spec.js
index b93236d4628..28492018600 100644
--- a/spec/frontend/vue_mr_widget/components/mr_widget_pipeline_spec.js
+++ b/spec/frontend/vue_mr_widget/components/mr_widget_pipeline_spec.js
@@ -1,7 +1,8 @@
import { GlLoadingIcon } from '@gitlab/ui';
import { shallowMount, mount } from '@vue/test-utils';
import { trimText } from 'helpers/text_helper';
-import PipelineStage from '~/pipelines/components/pipelines_list/stage.vue';
+import PipelineMiniGraph from '~/pipelines/components/pipelines_list/pipeline_mini_graph.vue';
+import PipelineStage from '~/pipelines/components/pipelines_list/pipeline_stage.vue';
import PipelineComponent from '~/vue_merge_request_widget/components/mr_widget_pipeline.vue';
import { SUCCESS } from '~/vue_merge_request_widget/constants';
import mockData from '../mock_data';
@@ -25,7 +26,7 @@ describe('MRWidgetPipeline', () => {
const findPipelineID = () => wrapper.find('[data-testid="pipeline-id"]');
const findPipelineInfoContainer = () => wrapper.find('[data-testid="pipeline-info-container"]');
const findCommitLink = () => wrapper.find('[data-testid="commit-link"]');
- const findPipelineGraph = () => wrapper.find('[data-testid="widget-mini-pipeline-graph"]');
+ const findPipelineMiniGraph = () => wrapper.find(PipelineMiniGraph);
const findAllPipelineStages = () => wrapper.findAll(PipelineStage);
const findPipelineCoverage = () => wrapper.find('[data-testid="pipeline-coverage"]');
const findPipelineCoverageDelta = () => wrapper.find('[data-testid="pipeline-coverage-delta"]');
@@ -35,7 +36,7 @@ describe('MRWidgetPipeline', () => {
wrapper.find('[data-testid="monitoring-pipeline-message"]');
const findLoadingIcon = () => wrapper.find(GlLoadingIcon);
- const createWrapper = (props, mountFn = shallowMount) => {
+ const createWrapper = (props = {}, mountFn = shallowMount) => {
wrapper = mountFn(PipelineComponent, {
propsData: {
...defaultProps,
@@ -65,10 +66,13 @@ describe('MRWidgetPipeline', () => {
describe('with a pipeline', () => {
beforeEach(() => {
- createWrapper({
- pipelineCoverageDelta: mockData.pipelineCoverageDelta,
- buildsWithCoverage: mockData.buildsWithCoverage,
- });
+ createWrapper(
+ {
+ pipelineCoverageDelta: mockData.pipelineCoverageDelta,
+ buildsWithCoverage: mockData.buildsWithCoverage,
+ },
+ mount,
+ );
});
it('should render pipeline ID', () => {
@@ -84,8 +88,8 @@ describe('MRWidgetPipeline', () => {
});
it('should render pipeline graph', () => {
- expect(findPipelineGraph().exists()).toBe(true);
- expect(findAllPipelineStages().length).toBe(mockData.pipeline.details.stages.length);
+ expect(findPipelineMiniGraph().exists()).toBe(true);
+ expect(findAllPipelineStages()).toHaveLength(mockData.pipeline.details.stages.length);
});
describe('should render pipeline coverage information', () => {
@@ -136,7 +140,7 @@ describe('MRWidgetPipeline', () => {
const mockCopy = JSON.parse(JSON.stringify(mockData));
delete mockCopy.pipeline.commit;
- createWrapper({});
+ createWrapper({}, mount);
});
it('should render pipeline ID', () => {
@@ -147,9 +151,15 @@ describe('MRWidgetPipeline', () => {
expect(findPipelineInfoContainer().text()).toMatch(mockData.pipeline.details.status.label);
});
- it('should render pipeline graph', () => {
- expect(findPipelineGraph().exists()).toBe(true);
- expect(findAllPipelineStages().length).toBe(mockData.pipeline.details.stages.length);
+ it('should render pipeline graph with correct styles', () => {
+ const stagesCount = mockData.pipeline.details.stages.length;
+
+ expect(findPipelineMiniGraph().exists()).toBe(true);
+ expect(findPipelineMiniGraph().findAll('.mr-widget-pipeline-stages')).toHaveLength(
+ stagesCount,
+ );
+
+ expect(findAllPipelineStages()).toHaveLength(stagesCount);
});
it('should render coverage information', () => {
@@ -181,7 +191,7 @@ describe('MRWidgetPipeline', () => {
});
it('should not render a pipeline graph', () => {
- expect(findPipelineGraph().exists()).toBe(false);
+ expect(findPipelineMiniGraph().exists()).toBe(false);
});
});
diff --git a/spec/frontend/vue_mr_widget/components/states/__snapshots__/mr_widget_auto_merge_enabled_spec.js.snap b/spec/frontend/vue_mr_widget/components/states/__snapshots__/mr_widget_auto_merge_enabled_spec.js.snap
index c425a3a86a9..e5862df5dda 100644
--- a/spec/frontend/vue_mr_widget/components/states/__snapshots__/mr_widget_auto_merge_enabled_spec.js.snap
+++ b/spec/frontend/vue_mr_widget/components/states/__snapshots__/mr_widget_auto_merge_enabled_spec.js.snap
@@ -16,6 +16,7 @@ exports[`MRWidgetAutoMergeEnabled when graphql is disabled template should have
>
<span
class="gl-mr-3"
+ data-qa-selector="merge_request_status_content"
>
<span
class="js-status-text-before-author"
@@ -107,6 +108,7 @@ exports[`MRWidgetAutoMergeEnabled when graphql is enabled template should have c
>
<span
class="gl-mr-3"
+ data-qa-selector="merge_request_status_content"
>
<span
class="js-status-text-before-author"
diff --git a/spec/frontend/vue_mr_widget/components/states/mr_widget_conflicts_spec.js b/spec/frontend/vue_mr_widget/components/states/mr_widget_conflicts_spec.js
index d3fc1e0e05b..dc2f227b29c 100644
--- a/spec/frontend/vue_mr_widget/components/states/mr_widget_conflicts_spec.js
+++ b/spec/frontend/vue_mr_widget/components/states/mr_widget_conflicts_spec.js
@@ -1,36 +1,41 @@
-import { createLocalVue, shallowMount } from '@vue/test-utils';
-import $ from 'jquery';
+import { GlPopover } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
import { TEST_HOST } from 'helpers/test_constants';
import { removeBreakLine } from 'helpers/text_helper';
+import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import ConflictsComponent from '~/vue_merge_request_widget/components/states/mr_widget_conflicts.vue';
describe('MRWidgetConflicts', () => {
- let vm;
+ let wrapper;
let mergeRequestWidgetGraphql = null;
const path = '/conflicts';
- function createComponent(propsData = {}) {
- const localVue = createLocalVue();
+ const findPopover = () => wrapper.find(GlPopover);
+ const findResolveButton = () => wrapper.findByTestId('resolve-conflicts-button');
+ const findMergeLocalButton = () => wrapper.findByTestId('merge-locally-button');
- vm = shallowMount(localVue.extend(ConflictsComponent), {
- propsData,
- provide: {
- glFeatures: {
- mergeRequestWidgetGraphql,
+ function createComponent(propsData = {}) {
+ wrapper = extendedWrapper(
+ shallowMount(ConflictsComponent, {
+ propsData,
+ provide: {
+ glFeatures: {
+ mergeRequestWidgetGraphql,
+ },
},
- },
- mocks: {
- $apollo: {
- queries: {
- userPermissions: { loading: false },
- stateData: { loading: false },
+ mocks: {
+ $apollo: {
+ queries: {
+ userPermissions: { loading: false },
+ stateData: { loading: false },
+ },
},
},
- },
- });
+ }),
+ );
if (mergeRequestWidgetGraphql) {
- vm.setData({
+ wrapper.setData({
userPermissions: {
canMerge: propsData.mr.canMerge,
pushToSourceBranch: propsData.mr.canPushToSourceBranch,
@@ -42,16 +47,12 @@ describe('MRWidgetConflicts', () => {
});
}
- return vm.vm.$nextTick();
+ return wrapper.vm.$nextTick();
}
- beforeEach(() => {
- jest.spyOn($.fn, 'popover');
- });
-
afterEach(() => {
mergeRequestWidgetGraphql = null;
- vm.destroy();
+ wrapper.destroy();
});
[false, true].forEach((featureEnabled) => {
@@ -82,18 +83,16 @@ describe('MRWidgetConflicts', () => {
});
it('should tell you about conflicts without bothering other people', () => {
- expect(vm.text()).toContain('There are merge conflicts');
- expect(vm.text()).not.toContain('ask someone with write access');
+ expect(wrapper.text()).toContain('There are merge conflicts');
+ expect(wrapper.text()).not.toContain('ask someone with write access');
});
it('should not allow you to resolve the conflicts', () => {
- expect(vm.text()).not.toContain('Resolve conflicts');
+ expect(wrapper.text()).not.toContain('Resolve conflicts');
});
it('should have merge buttons', () => {
- const mergeLocallyButton = vm.find('.js-merge-locally-button');
-
- expect(mergeLocallyButton.text()).toContain('Merge locally');
+ expect(findMergeLocalButton().text()).toContain('Merge locally');
});
});
@@ -110,19 +109,17 @@ describe('MRWidgetConflicts', () => {
});
it('should tell you about conflicts', () => {
- expect(vm.text()).toContain('There are merge conflicts');
- expect(vm.text()).toContain('ask someone with write access');
+ expect(wrapper.text()).toContain('There are merge conflicts');
+ expect(wrapper.text()).toContain('ask someone with write access');
});
it('should allow you to resolve the conflicts', () => {
- const resolveButton = vm.find('.js-resolve-conflicts-button');
-
- expect(resolveButton.text()).toContain('Resolve conflicts');
- expect(resolveButton.attributes('href')).toEqual(path);
+ expect(findResolveButton().text()).toContain('Resolve conflicts');
+ expect(findResolveButton().attributes('href')).toEqual(path);
});
it('should not have merge buttons', () => {
- expect(vm.text()).not.toContain('Merge locally');
+ expect(wrapper.text()).not.toContain('Merge locally');
});
});
@@ -139,21 +136,17 @@ describe('MRWidgetConflicts', () => {
});
it('should tell you about conflicts without bothering other people', () => {
- expect(vm.text()).toContain('There are merge conflicts');
- expect(vm.text()).not.toContain('ask someone with write access');
+ expect(wrapper.text()).toContain('There are merge conflicts');
+ expect(wrapper.text()).not.toContain('ask someone with write access');
});
it('should allow you to resolve the conflicts', () => {
- const resolveButton = vm.find('.js-resolve-conflicts-button');
-
- expect(resolveButton.text()).toContain('Resolve conflicts');
- expect(resolveButton.attributes('href')).toEqual(path);
+ expect(findResolveButton().text()).toContain('Resolve conflicts');
+ expect(findResolveButton().attributes('href')).toEqual(path);
});
it('should have merge buttons', () => {
- const mergeLocallyButton = vm.find('.js-merge-locally-button');
-
- expect(mergeLocallyButton.text()).toContain('Merge locally');
+ expect(findMergeLocalButton().text()).toContain('Merge locally');
});
});
@@ -167,7 +160,7 @@ describe('MRWidgetConflicts', () => {
},
});
- expect(vm.text().trim().replace(/\s\s+/g, ' ')).toContain(
+ expect(wrapper.text().trim().replace(/\s\s+/g, ' ')).toContain(
'ask someone with write access',
);
});
@@ -181,8 +174,8 @@ describe('MRWidgetConflicts', () => {
},
});
- expect(vm.find('.js-resolve-conflicts-button').exists()).toBe(false);
- expect(vm.find('.js-merge-locally-button').exists()).toBe(false);
+ expect(findResolveButton().exists()).toBe(false);
+ expect(findMergeLocalButton().exists()).toBe(false);
});
it('should not have resolve button when no conflict resolution path', async () => {
@@ -194,7 +187,7 @@ describe('MRWidgetConflicts', () => {
},
});
- expect(vm.find('.js-resolve-conflicts-button').exists()).toBe(false);
+ expect(findResolveButton().exists()).toBe(false);
});
});
@@ -207,7 +200,7 @@ describe('MRWidgetConflicts', () => {
},
});
- expect(removeBreakLine(vm.text()).trim()).toContain(
+ expect(removeBreakLine(wrapper.text()).trim()).toContain(
'Fast-forward merge is not possible. To merge this request, first rebase locally.',
);
});
@@ -227,11 +220,11 @@ describe('MRWidgetConflicts', () => {
});
it('sets resolve button as disabled', () => {
- expect(vm.find('.js-resolve-conflicts-button').attributes('disabled')).toBe('true');
+ expect(findResolveButton().attributes('disabled')).toBe('true');
});
- it('renders popover', () => {
- expect($.fn.popover).toHaveBeenCalled();
+ it('shows the popover', () => {
+ expect(findPopover().exists()).toBe(true);
});
});
@@ -249,11 +242,11 @@ describe('MRWidgetConflicts', () => {
});
it('sets resolve button as disabled', () => {
- expect(vm.find('.js-resolve-conflicts-button').attributes('disabled')).toBe(undefined);
+ expect(findResolveButton().attributes('disabled')).toBe(undefined);
});
- it('renders popover', () => {
- expect($.fn.popover).not.toHaveBeenCalled();
+ it('does not show the popover', () => {
+ expect(findPopover().exists()).toBe(false);
});
});
});
diff --git a/spec/frontend/vue_mr_widget/components/states/mr_widget_nothing_to_merge_spec.js b/spec/frontend/vue_mr_widget/components/states/mr_widget_nothing_to_merge_spec.js
index bd0bd36ebc2..2c04905d3a9 100644
--- a/spec/frontend/vue_mr_widget/components/states/mr_widget_nothing_to_merge_spec.js
+++ b/spec/frontend/vue_mr_widget/components/states/mr_widget_nothing_to_merge_spec.js
@@ -14,20 +14,14 @@ describe('NothingToMerge', () => {
it('should have correct elements', () => {
expect(vm.$el.classList.contains('mr-widget-body')).toBeTruthy();
- expect(vm.$el.querySelector('a').href).toContain(newBlobPath);
- expect(vm.$el.innerText).toContain(
- "Currently there are no changes in this merge request's source branch",
- );
-
- expect(vm.$el.innerText.replace(/\s\s+/g, ' ')).toContain(
- 'Please push new commits or use a different branch.',
- );
+ expect(vm.$el.querySelector('[data-testid="createFileButton"]').href).toContain(newBlobPath);
+ expect(vm.$el.innerText).toContain('Use merge requests to propose changes to your project');
});
it('should not show new blob link if there is no link available', () => {
vm.mr.newBlobPath = null;
Vue.nextTick(() => {
- expect(vm.$el.querySelector('a')).toEqual(null);
+ expect(vm.$el.querySelector('[data-testid="createFileButton"]')).toEqual(null);
});
});
});
diff --git a/spec/frontend/vue_mr_widget/deployment/deployment_list_spec.js b/spec/frontend/vue_mr_widget/deployment/deployment_list_spec.js
new file mode 100644
index 00000000000..dd0c483b28a
--- /dev/null
+++ b/spec/frontend/vue_mr_widget/deployment/deployment_list_spec.js
@@ -0,0 +1,101 @@
+import { mount } from '@vue/test-utils';
+import { zip } from 'lodash';
+import { trimText } from 'helpers/text_helper';
+import Deployment from '~/vue_merge_request_widget/components/deployment/deployment.vue';
+import DeploymentList from '~/vue_merge_request_widget/components/deployment/deployment_list.vue';
+import MrCollapsibleExtension from '~/vue_merge_request_widget/components/mr_collapsible_extension.vue';
+import { mockStore } from '../mock_data';
+
+const DEFAULT_PROPS = {
+ showVisualReviewAppLink: false,
+ hasDeploymentMetrics: false,
+ deploymentClass: 'js-pre-deployment',
+};
+
+describe('~/vue_merge_request_widget/components/deployment/deployment_list.vue', () => {
+ let wrapper;
+ let propsData;
+
+ const factory = (props = {}) => {
+ propsData = {
+ ...DEFAULT_PROPS,
+ deployments: mockStore.deployments,
+ ...props,
+ };
+ wrapper = mount(DeploymentList, {
+ propsData,
+ });
+ };
+
+ afterEach(() => {
+ wrapper?.destroy?.();
+ wrapper = null;
+ });
+
+ describe('with few deployments', () => {
+ beforeEach(() => {
+ factory();
+ });
+
+ it('shows all deployments', () => {
+ const deploymentWrappers = wrapper.findAllComponents(Deployment);
+ expect(wrapper.findComponent(MrCollapsibleExtension).exists()).toBe(false);
+ expect(deploymentWrappers).toHaveLength(propsData.deployments.length);
+
+ zip(deploymentWrappers.wrappers, propsData.deployments).forEach(
+ ([deploymentWrapper, deployment]) => {
+ expect(deploymentWrapper.props('deployment')).toEqual(deployment);
+ expect(deploymentWrapper.props()).toMatchObject({
+ showVisualReviewApp: DEFAULT_PROPS.showVisualReviewAppLink,
+ showMetrics: DEFAULT_PROPS.hasDeploymentMetrics,
+ });
+ expect(deploymentWrapper.classes(DEFAULT_PROPS.deploymentClass)).toBe(true);
+ expect(deploymentWrapper.text()).toEqual(expect.any(String));
+ expect(deploymentWrapper.text()).not.toBe('');
+ },
+ );
+ });
+ });
+ describe('with many deployments', () => {
+ let deployments;
+ let collapsibleExtension;
+
+ beforeEach(() => {
+ deployments = [
+ ...mockStore.deployments,
+ ...mockStore.deployments.map((deployment) => ({
+ ...deployment,
+ id: deployment.id + mockStore.deployments.length,
+ })),
+ ];
+ factory({ deployments });
+
+ collapsibleExtension = wrapper.findComponent(MrCollapsibleExtension);
+ });
+
+ it('shows collapsed deployments', () => {
+ expect(collapsibleExtension.exists()).toBe(true);
+ expect(trimText(collapsibleExtension.text())).toBe(
+ `${deployments.length} environments impacted. View all environments.`,
+ );
+ });
+ it('shows all deployments on click', async () => {
+ await collapsibleExtension.find('button').trigger('click');
+ const deploymentWrappers = wrapper.findAllComponents(Deployment);
+ expect(deploymentWrappers).toHaveLength(deployments.length);
+
+ zip(deploymentWrappers.wrappers, propsData.deployments).forEach(
+ ([deploymentWrapper, deployment]) => {
+ expect(deploymentWrapper.props('deployment')).toEqual(deployment);
+ expect(deploymentWrapper.props()).toMatchObject({
+ showVisualReviewApp: DEFAULT_PROPS.showVisualReviewAppLink,
+ showMetrics: DEFAULT_PROPS.hasDeploymentMetrics,
+ });
+ expect(deploymentWrapper.classes(DEFAULT_PROPS.deploymentClass)).toBe(true);
+ expect(deploymentWrapper.text()).toEqual(expect.any(String));
+ expect(deploymentWrapper.text()).not.toBe('');
+ },
+ );
+ });
+ });
+});
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 ce410a8b3e7..68bcf1dc491 100644
--- a/spec/frontend/vue_shared/alert_details/alert_details_spec.js
+++ b/spec/frontend/vue_shared/alert_details/alert_details_spec.js
@@ -89,7 +89,7 @@ describe('AlertDetails', () => {
const findIncidentCreationAlert = () => wrapper.findByTestId('incidentCreationError');
const findEnvironmentName = () => wrapper.findByTestId('environmentName');
const findEnvironmentPath = () => wrapper.findByTestId('environmentPath');
- const findDetailsTable = () => wrapper.find(AlertDetailsTable);
+ const findDetailsTable = () => wrapper.findComponent(AlertDetailsTable);
const findMetricsTab = () => wrapper.findByTestId('metrics');
describe('Alert details', () => {
@@ -188,27 +188,39 @@ describe('AlertDetails', () => {
});
expect(findMetricsTab().exists()).toBe(false);
});
+
+ it('should display "View incident" button that links the issues page when incident exists', () => {
+ const iid = '3';
+ mountComponent({
+ data: { alert: { ...mockAlert, issue: { iid } }, sidebarStatus: false },
+ provide: { isThreatMonitoringPage: true },
+ });
+
+ expect(findViewIncidentBtn().exists()).toBe(true);
+ expect(findViewIncidentBtn().attributes('href')).toBe(joinPaths(projectIssuesPath, iid));
+ expect(findCreateIncidentBtn().exists()).toBe(false);
+ });
});
describe('Create incident from alert', () => {
it('should display "View incident" button that links the incident page when incident exists', () => {
- const issueIid = '3';
+ const iid = '3';
mountComponent({
- data: { alert: { ...mockAlert, issueIid }, sidebarStatus: false },
+ data: { alert: { ...mockAlert, issue: { iid } }, sidebarStatus: false },
});
expect(findViewIncidentBtn().exists()).toBe(true);
expect(findViewIncidentBtn().attributes('href')).toBe(
- joinPaths(projectIssuesPath, issueIid),
+ joinPaths(projectIssuesPath, 'incident', iid),
);
expect(findCreateIncidentBtn().exists()).toBe(false);
});
it('should display "Create incident" button when incident doesn\'t exist yet', () => {
- const issueIid = null;
+ const issue = null;
mountComponent({
mountMethod: mount,
- data: { alert: { ...mockAlert, issueIid } },
+ data: { alert: { ...mockAlert, issue } },
});
return wrapper.vm.$nextTick().then(() => {
diff --git a/spec/frontend/vue_shared/alert_details/mocks/alerts.json b/spec/frontend/vue_shared/alert_details/mocks/alerts.json
index 5267a4fe50d..007557e234a 100644
--- a/spec/frontend/vue_shared/alert_details/mocks/alerts.json
+++ b/spec/frontend/vue_shared/alert_details/mocks/alerts.json
@@ -21,7 +21,7 @@
"endedAt": "2020-04-17T23:18:14.996Z",
"status": "ACKNOWLEDGED",
"assignees": { "nodes": [{ "username": "root", "avatarUrl": "/url", "name": "root" }] },
- "issueIid": "1",
+ "issue": { "state" : "closed", "iid": "1", "title": "My test issue" },
"notes": {
"nodes": [
{
diff --git a/spec/frontend/vue_shared/components/markdown/suggestion_diff_header_spec.js b/spec/frontend/vue_shared/components/markdown/suggestion_diff_header_spec.js
index bf65adc866d..5364e2d5f52 100644
--- a/spec/frontend/vue_shared/components/markdown/suggestion_diff_header_spec.js
+++ b/spec/frontend/vue_shared/components/markdown/suggestion_diff_header_spec.js
@@ -1,5 +1,6 @@
import { GlLoadingIcon } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
+import ApplySuggestion from '~/vue_shared/components/markdown/apply_suggestion.vue';
import SuggestionDiffHeader from '~/vue_shared/components/markdown/suggestion_diff_header.vue';
const DEFAULT_PROPS = {
@@ -38,7 +39,7 @@ describe('Suggestion Diff component', () => {
wrapper.destroy();
});
- const findApplyButton = () => wrapper.find('.js-apply-btn');
+ const findApplyButton = () => wrapper.find(ApplySuggestion);
const findApplyBatchButton = () => wrapper.find('.js-apply-batch-btn');
const findAddToBatchButton = () => wrapper.find('.js-add-to-batch-btn');
const findRemoveFromBatchButton = () => wrapper.find('.js-remove-from-batch-btn');
@@ -88,7 +89,7 @@ describe('Suggestion Diff component', () => {
beforeEach(() => {
createComponent();
- findApplyButton().vm.$emit('click');
+ findApplyButton().vm.$emit('apply');
});
it('emits apply', () => {
diff --git a/spec/frontend/vue_shared/components/multiselect_dropdown_spec.js b/spec/frontend/vue_shared/components/multiselect_dropdown_spec.js
index 99671f1ffb7..566ca1817f2 100644
--- a/spec/frontend/vue_shared/components/multiselect_dropdown_spec.js
+++ b/spec/frontend/vue_shared/components/multiselect_dropdown_spec.js
@@ -1,3 +1,4 @@
+import { GlDropdown } from '@gitlab/ui';
import { getByText } from '@testing-library/dom';
import { shallowMount } from '@vue/test-utils';
import MultiSelectDropdown from '~/vue_shared/components/sidebar/multiselect_dropdown.vue';
@@ -25,6 +26,9 @@ describe('MultiSelectDropdown Component', () => {
slots: {
search: '<p>Search</p>',
},
+ stubs: {
+ GlDropdown,
+ },
});
expect(getByText(wrapper.element, 'Search')).toBeDefined();
});
diff --git a/spec/frontend/vue_shared/components/registry/__snapshots__/code_instruction_spec.js.snap b/spec/frontend/vue_shared/components/registry/__snapshots__/code_instruction_spec.js.snap
index da49778f216..30b7f0c2d28 100644
--- a/spec/frontend/vue_shared/components/registry/__snapshots__/code_instruction_spec.js.snap
+++ b/spec/frontend/vue_shared/components/registry/__snapshots__/code_instruction_spec.js.snap
@@ -2,20 +2,26 @@
exports[`Package code instruction multiline to match the snapshot 1`] = `
<div>
- <pre
- class="gl-font-monospace"
- data-testid="multiline-instruction"
+ <label
+ for="instruction-input_3"
>
- this is some
+ foo_label
+ </label>
+
+ <div>
+ <pre
+ class="gl-font-monospace"
+ data-testid="multiline-instruction"
+ >
+ this is some
multiline text
- </pre>
+ </pre>
+ </div>
</div>
`;
exports[`Package code instruction single line to match the default snapshot 1`] = `
-<div
- class="gl-mb-3"
->
+<div>
<label
for="instruction-input_2"
>
@@ -23,42 +29,46 @@ exports[`Package code instruction single line to match the default snapshot 1`]
</label>
<div
- class="input-group gl-mb-3"
+ class="gl-mb-3"
>
- <input
- class="form-control gl-font-monospace"
- data-testid="instruction-input"
- id="instruction-input_2"
- readonly="readonly"
- type="text"
- />
-
- <span
- class="input-group-append"
- data-testid="instruction-button"
+ <div
+ class="input-group gl-mb-3"
>
- <button
- aria-label="Copy this value"
- class="btn input-group-text btn-default btn-md gl-button btn-default-secondary btn-icon"
- data-clipboard-text="npm i @my-package"
- title="Copy npm install command"
- type="button"
+ <input
+ class="form-control gl-font-monospace"
+ data-testid="instruction-input"
+ id="instruction-input_2"
+ readonly="readonly"
+ type="text"
+ />
+
+ <span
+ class="input-group-append"
+ data-testid="instruction-button"
>
- <!---->
-
- <svg
- aria-hidden="true"
- class="gl-button-icon gl-icon s16"
- data-testid="copy-to-clipboard-icon"
+ <button
+ aria-label="Copy this value"
+ class="btn input-group-text btn-default btn-md gl-button btn-default-secondary btn-icon"
+ data-clipboard-text="npm i @my-package"
+ title="Copy npm install command"
+ type="button"
>
- <use
- href="#copy-to-clipboard"
- />
- </svg>
-
- <!---->
- </button>
- </span>
+ <!---->
+
+ <svg
+ aria-hidden="true"
+ class="gl-button-icon gl-icon s16"
+ data-testid="copy-to-clipboard-icon"
+ >
+ <use
+ href="#copy-to-clipboard"
+ />
+ </svg>
+
+ <!---->
+ </button>
+ </span>
+ </div>
</div>
</div>
`;
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
new file mode 100644
index 00000000000..c65ded000d3
--- /dev/null
+++ b/spec/frontend/vue_shared/components/registry/persisted_dropdown_selection_spec.js
@@ -0,0 +1,122 @@
+import { GlDropdown, GlDropdownItem } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import { nextTick } from 'vue';
+import LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue';
+import component from '~/vue_shared/components/registry/persisted_dropdown_selection.vue';
+
+describe('Persisted dropdown selection', () => {
+ let wrapper;
+
+ const defaultProps = {
+ storageKey: 'foo_bar',
+ options: [
+ { value: 'maven', label: 'Maven' },
+ { value: 'gradle', label: 'Gradle' },
+ ],
+ };
+
+ function createComponent({ props = {}, data = {} } = {}) {
+ wrapper = shallowMount(component, {
+ propsData: {
+ ...defaultProps,
+ ...props,
+ },
+ data() {
+ return data;
+ },
+ });
+ }
+
+ const findLocalStorageSync = () => wrapper.findComponent(LocalStorageSync);
+ const findDropdown = () => wrapper.findComponent(GlDropdown);
+ const findDropdownItems = () => wrapper.findAllComponents(GlDropdownItem);
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('local storage sync', () => {
+ it('uses the local storage sync component', () => {
+ createComponent();
+
+ expect(findLocalStorageSync().exists()).toBe(true);
+ });
+
+ it('passes the right props', () => {
+ createComponent({ data: { selected: 'foo' } });
+
+ expect(findLocalStorageSync().props()).toMatchObject({
+ storageKey: defaultProps.storageKey,
+ value: 'foo',
+ });
+ });
+
+ it('on input event updates the model and emits event', async () => {
+ const inputPayload = 'bar';
+ createComponent();
+ findLocalStorageSync().vm.$emit('input', inputPayload);
+
+ await nextTick();
+
+ expect(wrapper.emitted('change')).toStrictEqual([[inputPayload]]);
+ expect(findLocalStorageSync().props('value')).toBe(inputPayload);
+ });
+ });
+
+ describe('dropdown', () => {
+ it('has a dropdown component', () => {
+ createComponent();
+
+ expect(findDropdown().exists()).toBe(true);
+ });
+
+ describe('dropdown text', () => {
+ it('when no selection shows the first', () => {
+ createComponent();
+
+ expect(findDropdown().props('text')).toBe('Maven');
+ });
+
+ it('when an option is selected, shows that option label', () => {
+ createComponent({ data: { selected: defaultProps.options[1].value } });
+
+ expect(findDropdown().props('text')).toBe('Gradle');
+ });
+ });
+
+ describe('dropdown items', () => {
+ it('has one item for each option', () => {
+ createComponent();
+
+ expect(findDropdownItems()).toHaveLength(defaultProps.options.length);
+ });
+
+ it('binds the correct props', () => {
+ createComponent({ data: { selected: defaultProps.options[0].value } });
+
+ expect(findDropdownItems().at(0).props()).toMatchObject({
+ isChecked: true,
+ isCheckItem: true,
+ });
+
+ expect(findDropdownItems().at(1).props()).toMatchObject({
+ isChecked: false,
+ isCheckItem: true,
+ });
+ });
+
+ it('on click updates the data and emits event', async () => {
+ createComponent({ data: { selected: defaultProps.options[0].value } });
+ expect(findDropdownItems().at(0).props('isChecked')).toBe(true);
+
+ findDropdownItems().at(1).vm.$emit('click');
+
+ await nextTick();
+
+ expect(wrapper.emitted('change')).toStrictEqual([['gradle']]);
+ expect(findDropdownItems().at(0).props('isChecked')).toBe(false);
+ expect(findDropdownItems().at(1).props('isChecked')).toBe(true);
+ });
+ });
+ });
+});
diff --git a/spec/frontend/vue_shared/components/settings/__snapshots__/settings_block_spec.js.snap b/spec/frontend/vue_shared/components/settings/__snapshots__/settings_block_spec.js.snap
index 51b8aa162bc..ed085fb66dc 100644
--- a/spec/frontend/vue_shared/components/settings/__snapshots__/settings_block_spec.js.snap
+++ b/spec/frontend/vue_shared/components/settings/__snapshots__/settings_block_spec.js.snap
@@ -2,7 +2,7 @@
exports[`Settings Block renders the correct markup 1`] = `
<section
- class="settings no-animate"
+ class="settings"
>
<div
class="settings-header"
diff --git a/spec/frontend/vue_shared/components/settings/settings_block_spec.js b/spec/frontend/vue_shared/components/settings/settings_block_spec.js
index 2db0b001b5b..be5a15631eb 100644
--- a/spec/frontend/vue_shared/components/settings/settings_block_spec.js
+++ b/spec/frontend/vue_shared/components/settings/settings_block_spec.js
@@ -50,6 +50,27 @@ describe('Settings Block', () => {
expect(findDescriptionSlot().exists()).toBe(true);
});
+ describe('slide animation behaviour', () => {
+ it('is animated by default', () => {
+ mountComponent();
+
+ expect(wrapper.classes('no-animate')).toBe(false);
+ });
+
+ it.each`
+ slideAnimated | noAnimatedClass
+ ${true} | ${false}
+ ${false} | ${true}
+ `(
+ 'sets the correct state when slideAnimated is $slideAnimated',
+ ({ slideAnimated, noAnimatedClass }) => {
+ mountComponent({ slideAnimated });
+
+ expect(wrapper.classes('no-animate')).toBe(noAnimatedClass);
+ },
+ );
+ });
+
describe('expanded behaviour', () => {
it('is collapsed by default', () => {
mountComponent();
diff --git a/spec/frontend/vue_shared/components/sidebar/labels_select_vue/dropdown_value_spec.js b/spec/frontend/vue_shared/components/sidebar/labels_select_vue/dropdown_value_spec.js
index 0d1d6ebcfe5..c90e63313b2 100644
--- a/spec/frontend/vue_shared/components/sidebar/labels_select_vue/dropdown_value_spec.js
+++ b/spec/frontend/vue_shared/components/sidebar/labels_select_vue/dropdown_value_spec.js
@@ -11,32 +11,31 @@ import { mockConfig, mockRegularLabel, mockScopedLabel } from './mock_data';
const localVue = createLocalVue();
localVue.use(Vuex);
-const createComponent = (initialState = mockConfig, slots = {}) => {
- const store = new Vuex.Store(labelsSelectModule());
-
- store.dispatch('setInitialState', initialState);
-
- return shallowMount(DropdownValue, {
- localVue,
- store,
- slots,
- });
-};
-
describe('DropdownValue', () => {
let wrapper;
- beforeEach(() => {
- wrapper = createComponent();
- });
+ const createComponent = (initialState = {}, slots = {}) => {
+ const store = new Vuex.Store(labelsSelectModule());
+
+ store.dispatch('setInitialState', { ...mockConfig, ...initialState });
+
+ wrapper = shallowMount(DropdownValue, {
+ localVue,
+ store,
+ slots,
+ });
+ };
afterEach(() => {
wrapper.destroy();
+ wrapper = null;
});
describe('methods', () => {
describe('labelFilterUrl', () => {
it('returns a label filter URL based on provided label param', () => {
+ createComponent();
+
expect(wrapper.vm.labelFilterUrl(mockRegularLabel)).toBe(
'/gitlab-org/my-project/issues?label_name[]=Foo%20Label',
);
@@ -44,6 +43,10 @@ describe('DropdownValue', () => {
});
describe('scopedLabel', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
it('returns `true` when provided label param is a scoped label', () => {
expect(wrapper.vm.scopedLabel(mockScopedLabel)).toBe(true);
});
@@ -56,28 +59,29 @@ describe('DropdownValue', () => {
describe('template', () => {
it('renders class `has-labels` on component container element when `selectedLabels` is not empty', () => {
+ createComponent();
+
expect(wrapper.attributes('class')).toContain('has-labels');
});
it('renders element containing `None` when `selectedLabels` is empty', () => {
- const wrapperNoLabels = createComponent(
+ createComponent(
{
- ...mockConfig,
selectedLabels: [],
},
{
default: 'None',
},
);
- const noneEl = wrapperNoLabels.find('span.text-secondary');
+ const noneEl = wrapper.find('span.text-secondary');
expect(noneEl.exists()).toBe(true);
expect(noneEl.text()).toBe('None');
-
- wrapperNoLabels.destroy();
});
it('renders labels when `selectedLabels` is not empty', () => {
+ createComponent();
+
expect(wrapper.findAll(GlLabel).length).toBe(2);
});
});
diff --git a/spec/frontend/vue_shared/components/sidebar/labels_select_vue/mock_data.js b/spec/frontend/vue_shared/components/sidebar/labels_select_vue/mock_data.js
index 85a14226585..f293b8422e7 100644
--- a/spec/frontend/vue_shared/components/sidebar/labels_select_vue/mock_data.js
+++ b/spec/frontend/vue_shared/components/sidebar/labels_select_vue/mock_data.js
@@ -47,6 +47,7 @@ export const mockConfig = {
labelsFetchPath: '/gitlab-org/my-project/-/labels.json',
labelsManagePath: '/gitlab-org/my-project/-/labels',
labelsFilterBasePath: '/gitlab-org/my-project/issues',
+ labelsFilterParam: 'label_name',
};
export const mockSuggestedColors = {
diff --git a/spec/frontend/vue_shared/components/tabs/tab_spec.js b/spec/frontend/vue_shared/components/tabs/tab_spec.js
deleted file mode 100644
index ee0c983c764..00000000000
--- a/spec/frontend/vue_shared/components/tabs/tab_spec.js
+++ /dev/null
@@ -1,32 +0,0 @@
-import Vue from 'vue';
-import mountComponent from 'helpers/vue_mount_component_helper';
-import Tab from '~/vue_shared/components/tabs/tab.vue';
-
-describe('Tab component', () => {
- const Component = Vue.extend(Tab);
- let vm;
-
- beforeEach(() => {
- vm = mountComponent(Component);
- });
-
- it('sets localActive to equal active', (done) => {
- vm.active = true;
-
- vm.$nextTick(() => {
- expect(vm.localActive).toBe(true);
-
- done();
- });
- });
-
- it('sets active class', (done) => {
- vm.active = true;
-
- vm.$nextTick(() => {
- expect(vm.$el.classList).toContain('active');
-
- done();
- });
- });
-});
diff --git a/spec/frontend/vue_shared/components/tabs/tabs_spec.js b/spec/frontend/vue_shared/components/tabs/tabs_spec.js
deleted file mode 100644
index fe7be5be899..00000000000
--- a/spec/frontend/vue_shared/components/tabs/tabs_spec.js
+++ /dev/null
@@ -1,61 +0,0 @@
-import Vue from 'vue';
-import Tab from '~/vue_shared/components/tabs/tab.vue';
-import Tabs from '~/vue_shared/components/tabs/tabs';
-
-describe('Tabs component', () => {
- let vm;
-
- beforeEach(() => {
- vm = new Vue({
- components: {
- Tabs,
- Tab,
- },
- render(h) {
- return h('div', [
- h('tabs', [
- h('tab', { attrs: { title: 'Testing', active: true } }, 'First tab'),
- h('tab', [h('template', { slot: 'title' }, 'Test slot'), 'Second tab']),
- ]),
- ]);
- },
- }).$mount();
-
- return vm.$nextTick();
- });
-
- describe('tab links', () => {
- it('renders links for tabs', () => {
- expect(vm.$el.querySelectorAll('a').length).toBe(2);
- });
-
- it('renders link titles from props', () => {
- expect(vm.$el.querySelector('a').textContent).toContain('Testing');
- });
-
- it('renders link titles from slot', () => {
- expect(vm.$el.querySelectorAll('a')[1].textContent).toContain('Test slot');
- });
-
- it('renders active class', () => {
- expect(vm.$el.querySelector('a').classList).toContain('active');
- });
-
- it('updates active class on click', () => {
- vm.$el.querySelectorAll('a')[1].click();
-
- return vm.$nextTick(() => {
- expect(vm.$el.querySelector('a').classList).not.toContain('active');
- expect(vm.$el.querySelectorAll('a')[1].classList).toContain('active');
- });
- });
- });
-
- describe('content', () => {
- it('renders content panes', () => {
- expect(vm.$el.querySelectorAll('.tab-pane').length).toBe(2);
- expect(vm.$el.querySelectorAll('.tab-pane')[0].textContent).toContain('First tab');
- expect(vm.$el.querySelectorAll('.tab-pane')[1].textContent).toContain('Second tab');
- });
- });
-});
diff --git a/spec/frontend/vue_shared/components/tooltip_on_truncate_spec.js b/spec/frontend/vue_shared/components/tooltip_on_truncate_spec.js
index 27c9b099306..380b7231acd 100644
--- a/spec/frontend/vue_shared/components/tooltip_on_truncate_spec.js
+++ b/spec/frontend/vue_shared/components/tooltip_on_truncate_spec.js
@@ -11,6 +11,15 @@ jest.mock('~/lib/utils/dom_utils', () => ({
throw new Error('this needs to be mocked');
}),
}));
+jest.mock('@gitlab/ui', () => ({
+ GlTooltipDirective: {
+ bind(el, binding) {
+ el.classList.add('gl-tooltip');
+ el.setAttribute('data-original-title', el.title);
+ el.dataset.placement = binding.value.placement;
+ },
+ },
+}));
describe('TooltipOnTruncate component', () => {
let wrapper;
@@ -52,7 +61,7 @@ describe('TooltipOnTruncate component', () => {
wrapper = parent.find(TooltipOnTruncate);
};
- const hasTooltip = () => wrapper.classes('js-show-tooltip');
+ const hasTooltip = () => wrapper.classes('gl-tooltip');
afterEach(() => {
wrapper.destroy();
diff --git a/spec/frontend/vue_shared/components/upload_dropzone/__snapshots__/upload_dropzone_spec.js.snap b/spec/frontend/vue_shared/components/upload_dropzone/__snapshots__/upload_dropzone_spec.js.snap
index d2fe3cd76cb..af4fa462cbf 100644
--- a/spec/frontend/vue_shared/components/upload_dropzone/__snapshots__/upload_dropzone_spec.js.snap
+++ b/spec/frontend/vue_shared/components/upload_dropzone/__snapshots__/upload_dropzone_spec.js.snap
@@ -19,6 +19,7 @@ exports[`Upload dropzone component correctly overrides description and drop mess
<p
class="gl-mb-0"
+ data-testid="upload-text"
>
<span>
Test %{linkStart}description%{linkEnd} message.
@@ -98,10 +99,15 @@ exports[`Upload dropzone component when dragging renders correct template when d
<p
class="gl-mb-0"
+ data-testid="upload-text"
>
- <gl-sprintf-stub
- message="Drop or %{linkStart}upload%{linkEnd} files to attach"
- />
+ Drop or
+ <gl-link-stub>
+
+ upload
+
+ </gl-link-stub>
+ files to attach
</p>
</div>
</button>
@@ -178,10 +184,15 @@ exports[`Upload dropzone component when dragging renders correct template when d
<p
class="gl-mb-0"
+ data-testid="upload-text"
>
- <gl-sprintf-stub
- message="Drop or %{linkStart}upload%{linkEnd} files to attach"
- />
+ Drop or
+ <gl-link-stub>
+
+ upload
+
+ </gl-link-stub>
+ files to attach
</p>
</div>
</button>
@@ -258,10 +269,15 @@ exports[`Upload dropzone component when dragging renders correct template when d
<p
class="gl-mb-0"
+ data-testid="upload-text"
>
- <gl-sprintf-stub
- message="Drop or %{linkStart}upload%{linkEnd} files to attach"
- />
+ Drop or
+ <gl-link-stub>
+
+ upload
+
+ </gl-link-stub>
+ files to attach
</p>
</div>
</button>
@@ -337,10 +353,15 @@ exports[`Upload dropzone component when dragging renders correct template when d
<p
class="gl-mb-0"
+ data-testid="upload-text"
>
- <gl-sprintf-stub
- message="Drop or %{linkStart}upload%{linkEnd} files to attach"
- />
+ Drop or
+ <gl-link-stub>
+
+ upload
+
+ </gl-link-stub>
+ files to attach
</p>
</div>
</button>
@@ -416,10 +437,15 @@ exports[`Upload dropzone component when dragging renders correct template when d
<p
class="gl-mb-0"
+ data-testid="upload-text"
>
- <gl-sprintf-stub
- message="Drop or %{linkStart}upload%{linkEnd} files to attach"
- />
+ Drop or
+ <gl-link-stub>
+
+ upload
+
+ </gl-link-stub>
+ files to attach
</p>
</div>
</button>
@@ -495,10 +521,15 @@ exports[`Upload dropzone component when no slot provided renders default dropzon
<p
class="gl-mb-0"
+ data-testid="upload-text"
>
- <gl-sprintf-stub
- message="Drop or %{linkStart}upload%{linkEnd} files to attach"
- />
+ Drop or
+ <gl-link-stub>
+
+ upload
+
+ </gl-link-stub>
+ files to attach
</p>
</div>
</button>
diff --git a/spec/frontend/vue_shared/components/upload_dropzone/upload_dropzone_spec.js b/spec/frontend/vue_shared/components/upload_dropzone/upload_dropzone_spec.js
index ace486b1f32..b3cdbccb271 100644
--- a/spec/frontend/vue_shared/components/upload_dropzone/upload_dropzone_spec.js
+++ b/spec/frontend/vue_shared/components/upload_dropzone/upload_dropzone_spec.js
@@ -1,4 +1,4 @@
-import { GlIcon } from '@gitlab/ui';
+import { GlIcon, GlSprintf } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import UploadDropzone from '~/vue_shared/components/upload_dropzone/upload_dropzone.vue';
@@ -14,6 +14,7 @@ describe('Upload dropzone component', () => {
const findDropzoneCard = () => wrapper.find('.upload-dropzone-card');
const findDropzoneArea = () => wrapper.find('[data-testid="dropzone-area"]');
const findIcon = () => wrapper.find(GlIcon);
+ const findUploadText = () => wrapper.find('[data-testid="upload-text"]').text();
function createComponent({ slots = {}, data = {}, props = {} } = {}) {
wrapper = shallowMount(UploadDropzone, {
@@ -22,6 +23,9 @@ describe('Upload dropzone component', () => {
displayAsCard: true,
...props,
},
+ stubs: {
+ GlSprintf,
+ },
data() {
return data;
},
@@ -30,6 +34,7 @@ describe('Upload dropzone component', () => {
afterEach(() => {
wrapper.destroy();
+ wrapper = null;
});
describe('when slot provided', () => {
@@ -60,6 +65,18 @@ describe('Upload dropzone component', () => {
});
});
+ describe('upload text', () => {
+ it.each`
+ collection | description | props | expected
+ ${'multiple'} | ${'by default'} | ${null} | ${'files to attach'}
+ ${'singular'} | ${'when singleFileSelection'} | ${{ singleFileSelection: true }} | ${'file to attach'}
+ `('displays $collection version $description', ({ props, expected }) => {
+ createComponent({ props });
+
+ expect(findUploadText()).toContain(expected);
+ });
+ });
+
describe('when dragging', () => {
it.each`
description | eventPayload
@@ -141,6 +158,21 @@ describe('Upload dropzone component', () => {
wrapper.vm.ondrop(mockEvent);
expect(wrapper.emitted()).not.toHaveProperty('error');
});
+
+ describe('singleFileSelection = true', () => {
+ it('emits a single file on drop', () => {
+ createComponent({
+ data: mockData,
+ props: { singleFileSelection: true },
+ });
+
+ const mockFile = { type: 'image/jpg' };
+ const mockEvent = mockDragEvent({ files: [mockFile] });
+
+ wrapper.vm.ondrop(mockEvent);
+ expect(wrapper.emitted().change[0]).toEqual([mockFile]);
+ });
+ });
});
});
diff --git a/spec/frontend/vue_shared/components/user_access_role_badge_spec.js b/spec/frontend/vue_shared/components/user_access_role_badge_spec.js
new file mode 100644
index 00000000000..7f25f7c08e7
--- /dev/null
+++ b/spec/frontend/vue_shared/components/user_access_role_badge_spec.js
@@ -0,0 +1,26 @@
+import { GlBadge } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import UserAccessRoleBadge from '~/vue_shared/components/user_access_role_badge.vue';
+
+describe('UserAccessRoleBadge', () => {
+ let wrapper;
+
+ const createComponent = ({ slots } = {}) => {
+ wrapper = shallowMount(UserAccessRoleBadge, {
+ slots,
+ });
+ };
+
+ it('renders slot content inside GlBadge', () => {
+ createComponent({
+ slots: {
+ default: 'test slot content',
+ },
+ });
+
+ const badge = wrapper.find(GlBadge);
+
+ expect(badge.exists()).toBe(true);
+ expect(badge.html()).toContain('test slot content');
+ });
+});
diff --git a/spec/frontend/vue_shared/components/user_popover/user_popover_spec.js b/spec/frontend/vue_shared/components/user_popover/user_popover_spec.js
index a6c5e23ae14..650d204201e 100644
--- a/spec/frontend/vue_shared/components/user_popover/user_popover_spec.js
+++ b/spec/frontend/vue_shared/components/user_popover/user_popover_spec.js
@@ -18,7 +18,6 @@ const DEFAULT_PROPS = {
describe('User Popover Component', () => {
const fixtureTemplate = 'merge_requests/diff_comment.html';
- preloadFixtures(fixtureTemplate);
let wrapper;
diff --git a/spec/frontend/vue_shared/directives/tooltip_spec.js b/spec/frontend/vue_shared/directives/tooltip_spec.js
deleted file mode 100644
index 99e8b5b552b..00000000000
--- a/spec/frontend/vue_shared/directives/tooltip_spec.js
+++ /dev/null
@@ -1,157 +0,0 @@
-import { mount } from '@vue/test-utils';
-import $ from 'jquery';
-import { escape } from 'lodash';
-import tooltip from '~/vue_shared/directives/tooltip';
-
-const DEFAULT_TOOLTIP_TEMPLATE = '<div v-tooltip :title="tooltip"></div>';
-const HTML_TOOLTIP_TEMPLATE = '<div v-tooltip data-html="true" :title="tooltip"></div>';
-
-describe('Tooltip directive', () => {
- let wrapper;
-
- function createTooltipContainer({
- template = DEFAULT_TOOLTIP_TEMPLATE,
- text = 'some text',
- } = {}) {
- wrapper = mount(
- {
- directives: { tooltip },
- data: () => ({ tooltip: text }),
- template,
- },
- { attachTo: document.body },
- );
- }
-
- async function showTooltip() {
- $(wrapper.vm.$el).tooltip('show');
- jest.runOnlyPendingTimers();
- await wrapper.vm.$nextTick();
- }
-
- function findTooltipInnerHtml() {
- return document.querySelector('.tooltip-inner').innerHTML;
- }
-
- function findTooltipHtml() {
- return document.querySelector('.tooltip').innerHTML;
- }
-
- afterEach(() => {
- wrapper.destroy();
- wrapper = null;
- });
-
- describe('with a single tooltip', () => {
- it('should have tooltip plugin applied', () => {
- createTooltipContainer();
-
- expect($(wrapper.vm.$el).data('bs.tooltip')).toBeDefined();
- });
-
- it('displays the title as tooltip', () => {
- createTooltipContainer();
-
- $(wrapper.vm.$el).tooltip('show');
-
- jest.runOnlyPendingTimers();
-
- const tooltipElement = document.querySelector('.tooltip-inner');
-
- expect(tooltipElement.textContent).toContain('some text');
- });
-
- it.each`
- condition | template | sanitize
- ${'does not contain any html'} | ${DEFAULT_TOOLTIP_TEMPLATE} | ${false}
- ${'contains html'} | ${HTML_TOOLTIP_TEMPLATE} | ${true}
- `('passes sanitize=$sanitize if the tooltip $condition', ({ template, sanitize }) => {
- createTooltipContainer({ template });
-
- expect($(wrapper.vm.$el).data('bs.tooltip').config.sanitize).toEqual(sanitize);
- });
-
- it('updates a visible tooltip', async () => {
- createTooltipContainer();
-
- $(wrapper.vm.$el).tooltip('show');
- jest.runOnlyPendingTimers();
-
- const tooltipElement = document.querySelector('.tooltip-inner');
-
- wrapper.vm.tooltip = 'other text';
-
- jest.runOnlyPendingTimers();
- await wrapper.vm.$nextTick();
-
- expect(tooltipElement.textContent).toContain('other text');
- });
-
- describe('tooltip sanitization', () => {
- it('reads tooltip content as text if data-html is not passed', async () => {
- createTooltipContainer({ text: 'sample text<script>alert("XSS!!")</script>' });
-
- await showTooltip();
-
- const result = findTooltipInnerHtml();
- expect(result).toEqual('sample text&lt;script&gt;alert("XSS!!")&lt;/script&gt;');
- });
-
- it('sanitizes tooltip if data-html is passed', async () => {
- createTooltipContainer({
- template: HTML_TOOLTIP_TEMPLATE,
- text: 'sample text<script>alert("XSS!!")</script>',
- });
-
- await showTooltip();
-
- const result = findTooltipInnerHtml();
- expect(result).toEqual('sample text');
- expect(result).not.toContain('XSS!!');
- });
-
- it('sanitizes tooltip if data-template is passed', async () => {
- const tooltipTemplate = escape(
- '<div class="tooltip" role="tooltip"><div onclick="alert(\'XSS!\')" class="arrow"></div><div class="tooltip-inner"></div></div>',
- );
-
- createTooltipContainer({
- template: `<div v-tooltip :title="tooltip" data-html="false" data-template="${tooltipTemplate}"></div>`,
- });
-
- await showTooltip();
-
- const result = findTooltipHtml();
- expect(result).toEqual(
- // objectionable element is removed
- '<div class="arrow"></div><div class="tooltip-inner">some text</div>',
- );
- expect(result).not.toContain('XSS!!');
- });
- });
- });
-
- describe('with multiple tooltips', () => {
- beforeEach(() => {
- createTooltipContainer({
- template: `
- <div>
- <div
- v-tooltip
- class="js-look-for-tooltip"
- title="foo">
- </div>
- <div
- v-tooltip
- title="bar">
- </div>
- </div>
- `,
- });
- });
-
- it('should have tooltip plugin applied to all instances', () => {
- expect($(wrapper.vm.$el).find('.js-look-for-tooltip').data('bs.tooltip')).toBeDefined();
- });
- });
-});
diff --git a/spec/frontend/vue_shared/gl_feature_flags_plugin_spec.js b/spec/frontend/vue_shared/gl_feature_flags_plugin_spec.js
index 6ecc330b5af..3fb60c254c9 100644
--- a/spec/frontend/vue_shared/gl_feature_flags_plugin_spec.js
+++ b/spec/frontend/vue_shared/gl_feature_flags_plugin_spec.js
@@ -11,6 +11,10 @@ describe('GitLab Feature Flags Plugin', () => {
aFeature: true,
bFeature: false,
},
+ licensed_features: {
+ cFeature: true,
+ dFeature: false,
+ },
};
localVue.use(GlFeatureFlags);
@@ -25,6 +29,8 @@ describe('GitLab Feature Flags Plugin', () => {
expect(wrapper.vm.glFeatures).toEqual({
aFeature: true,
bFeature: false,
+ cFeature: true,
+ dFeature: false,
});
});
@@ -37,6 +43,8 @@ describe('GitLab Feature Flags Plugin', () => {
expect(wrapper.vm.glFeatures).toEqual({
aFeature: true,
bFeature: false,
+ cFeature: true,
+ dFeature: false,
});
});
});
diff --git a/spec/frontend/zen_mode_spec.js b/spec/frontend/zen_mode_spec.js
index 5cc1d2200d3..bf4b57d8afb 100644
--- a/spec/frontend/zen_mode_spec.js
+++ b/spec/frontend/zen_mode_spec.js
@@ -13,8 +13,6 @@ describe('ZenMode', () => {
let dropzoneForElementSpy;
const fixtureName = 'snippets/show.html';
- preloadFixtures(fixtureName);
-
function enterZen() {
$('.notes-form .js-zen-enter').click();
}
diff --git a/spec/frontend_integration/ide/helpers/ide_helper.js b/spec/frontend_integration/ide/helpers/ide_helper.js
index 9e6bafc1297..6c09b44d891 100644
--- a/spec/frontend_integration/ide/helpers/ide_helper.js
+++ b/spec/frontend_integration/ide/helpers/ide_helper.js
@@ -25,6 +25,9 @@ export const getStatusBar = () => document.querySelector('.ide-status-bar');
export const waitForMonacoEditor = () =>
new Promise((resolve) => window.monaco.editor.onDidCreateEditor(resolve));
+export const waitForEditorModelChange = (instance) =>
+ new Promise((resolve) => instance.onDidChangeModel(resolve));
+
export const findMonacoEditor = () =>
screen.findAllByLabelText(/Editor content;/).then(([x]) => x.closest('.monaco-editor'));
diff --git a/spec/frontend_integration/ide/helpers/mock_data.js b/spec/frontend_integration/ide/helpers/mock_data.js
index f70739e5ac0..8c9ec74541f 100644
--- a/spec/frontend_integration/ide/helpers/mock_data.js
+++ b/spec/frontend_integration/ide/helpers/mock_data.js
@@ -4,7 +4,6 @@ export const IDE_DATASET = {
committedStateSvgPath: '/test/committed_state.svg',
pipelinesEmptyStateSvgPath: '/test/pipelines_empty_state.svg',
promotionSvgPath: '/test/promotion.svg',
- ciHelpPagePath: '/test/ci_help_page',
webIDEHelpPagePath: '/test/web_ide_help_page',
clientsidePreviewEnabled: 'true',
renderWhitespaceInCode: 'false',
diff --git a/spec/frontend_integration/ide/helpers/start.js b/spec/frontend_integration/ide/helpers/start.js
index 173a9610c84..cc6abd9e01f 100644
--- a/spec/frontend_integration/ide/helpers/start.js
+++ b/spec/frontend_integration/ide/helpers/start.js
@@ -1,6 +1,7 @@
+/* global monaco */
+
import { TEST_HOST } from 'helpers/test_constants';
import { initIde } from '~/ide';
-import Editor from '~/ide/lib/editor';
import extendStore from '~/ide/stores/extend';
import { IDE_DATASET } from './mock_data';
@@ -18,13 +19,7 @@ export default (container, { isRepoEmpty = false, path = '', mrId = '' } = {}) =
const vm = initIde(el, { extendStore });
// We need to dispose of editor Singleton things or tests will bump into eachother
- vm.$on('destroy', () => {
- if (Editor.editorInstance) {
- Editor.editorInstance.modelManager.dispose();
- Editor.editorInstance.dispose();
- Editor.editorInstance = null;
- }
- });
+ vm.$on('destroy', () => monaco.editor.getModels().forEach((model) => model.dispose()));
return vm;
};
diff --git a/spec/frontend_integration/ide/ide_integration_spec.js b/spec/frontend_integration/ide/ide_integration_spec.js
index 3ce88de11fe..5f1a5b0d048 100644
--- a/spec/frontend_integration/ide/ide_integration_spec.js
+++ b/spec/frontend_integration/ide/ide_integration_spec.js
@@ -96,16 +96,6 @@ describe('WebIDE', () => {
let statusBar;
let editor;
- const waitForEditor = async () => {
- editor = await ideHelper.waitForMonacoEditor();
- };
-
- const changeEditorPosition = async (lineNumber, column) => {
- editor.setPosition({ lineNumber, column });
-
- await vm.$nextTick();
- };
-
beforeEach(async () => {
vm = startWebIDE(container);
@@ -134,16 +124,17 @@ describe('WebIDE', () => {
// Need to wait for monaco editor to load so it doesn't through errors on dispose
await ideHelper.openFile('.gitignore');
- await ideHelper.waitForMonacoEditor();
+ await ideHelper.waitForEditorModelChange(editor);
await ideHelper.openFile('README.md');
- await ideHelper.waitForMonacoEditor();
+ await ideHelper.waitForEditorModelChange(editor);
expect(el).toHaveText(markdownPreview);
});
describe('when editor position changes', () => {
beforeEach(async () => {
- await changeEditorPosition(4, 10);
+ editor.setPosition({ lineNumber: 4, column: 10 });
+ await vm.$nextTick();
});
it('shows new line position', () => {
@@ -153,7 +144,8 @@ describe('WebIDE', () => {
it('updates after rename', async () => {
await ideHelper.renameFile('README.md', 'READMEZ.txt');
- await waitForEditor();
+ await ideHelper.waitForEditorModelChange(editor);
+ await vm.$nextTick();
expect(statusBar).toHaveText('1:1');
expect(statusBar).toHaveText('plaintext');
@@ -161,10 +153,10 @@ describe('WebIDE', () => {
it('persists position after opening then rename', async () => {
await ideHelper.openFile('files/js/application.js');
- await waitForEditor();
+ await ideHelper.waitForEditorModelChange(editor);
await ideHelper.renameFile('README.md', 'READING_RAINBOW.md');
await ideHelper.openFile('READING_RAINBOW.md');
- await waitForEditor();
+ await ideHelper.waitForEditorModelChange(editor);
expect(statusBar).toHaveText('4:10');
expect(statusBar).toHaveText('markdown');
@@ -173,7 +165,8 @@ describe('WebIDE', () => {
it('persists position after closing', async () => {
await ideHelper.closeFile('README.md');
await ideHelper.openFile('README.md');
- await waitForEditor();
+ await ideHelper.waitForMonacoEditor();
+ await vm.$nextTick();
expect(statusBar).toHaveText('4:10');
expect(statusBar).toHaveText('markdown');
diff --git a/spec/frontend_integration/ide/user_opens_mr_spec.js b/spec/frontend_integration/ide/user_opens_mr_spec.js
index 9cf0ff5da56..3ffc5169351 100644
--- a/spec/frontend_integration/ide/user_opens_mr_spec.js
+++ b/spec/frontend_integration/ide/user_opens_mr_spec.js
@@ -24,11 +24,11 @@ describe('IDE: User opens Merge Request', () => {
vm = startWebIDE(container, { mrId });
- await ideHelper.waitForTabToOpen(basename(changes[0].new_path));
- await ideHelper.waitForMonacoEditor();
+ const editor = await ideHelper.waitForMonacoEditor();
+ await ideHelper.waitForEditorModelChange(editor);
});
- afterEach(async () => {
+ afterEach(() => {
vm.$destroy();
vm = null;
});
diff --git a/spec/frontend_integration/test_helpers/mock_server/graphql.js b/spec/frontend_integration/test_helpers/mock_server/graphql.js
index 654c373e5a6..e2658852599 100644
--- a/spec/frontend_integration/test_helpers/mock_server/graphql.js
+++ b/spec/frontend_integration/test_helpers/mock_server/graphql.js
@@ -1,5 +1,11 @@
import { buildSchema, graphql } from 'graphql';
-import gitlabSchemaStr from '../../../../doc/api/graphql/reference/gitlab_schema.graphql';
+
+/* eslint-disable import/no-unresolved */
+// This rule is disabled for the following line.
+// The graphql schema is dynamically generated in CI
+// during the `graphql-schema-dump` job.
+import gitlabSchemaStr from '../../../../tmp/tests/graphql/gitlab_schema.graphql';
+/* eslint-enable import/no-unresolved */
const graphqlSchema = buildSchema(gitlabSchemaStr.loc.source.body);
const graphqlResolvers = {
diff --git a/spec/generator_helper.rb b/spec/generator_helper.rb
new file mode 100644
index 00000000000..d35eaac45bd
--- /dev/null
+++ b/spec/generator_helper.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.configure do |config|
+ # Redirect stdout so specs don't have so much noise
+ config.before(:all) do
+ $stdout = StringIO.new
+ end
+
+ # Reset stdout
+ config.after(:all) do
+ $stdout = STDOUT
+ end
+end
diff --git a/spec/graphql/features/authorization_spec.rb b/spec/graphql/features/authorization_spec.rb
index ec67ed16fe9..33b11e1ca09 100644
--- a/spec/graphql/features/authorization_spec.rb
+++ b/spec/graphql/features/authorization_spec.rb
@@ -2,17 +2,22 @@
require 'spec_helper'
-RSpec.describe 'Gitlab::Graphql::Authorization' do
+RSpec.describe 'Gitlab::Graphql::Authorize' do
include GraphqlHelpers
+ include Graphql::ResolverFactories
let_it_be(:user) { create(:user) }
let(:permission_single) { :foo }
let(:permission_collection) { [:foo, :bar] }
let(:test_object) { double(name: 'My name') }
let(:query_string) { '{ item { name } }' }
- let(:result) { execute_query(query_type)['data'] }
+ let(:result) do
+ schema = empty_schema
+ schema.use(Gitlab::Graphql::Authorize)
+ execute_query(query_type, schema: schema)
+ end
- subject { result['item'] }
+ subject { result.dig('data', 'item') }
shared_examples 'authorization with a single permission' do
it 'returns the protected field when user has permission' do
@@ -55,7 +60,7 @@ RSpec.describe 'Gitlab::Graphql::Authorization' do
describe 'with a single permission' do
let(:query_type) do
query_factory do |query|
- query.field :item, type, null: true, resolver: simple_resolver(test_object), authorize: permission_single
+ query.field :item, type, null: true, resolver: new_resolver(test_object), authorize: permission_single
end
end
@@ -66,7 +71,7 @@ RSpec.describe 'Gitlab::Graphql::Authorization' do
let(:query_type) do
permissions = permission_collection
query_factory do |qt|
- qt.field :item, type, null: true, resolver: simple_resolver(test_object) do
+ qt.field :item, type, null: true, resolver: new_resolver(test_object) do
authorize permissions
end
end
@@ -79,7 +84,7 @@ RSpec.describe 'Gitlab::Graphql::Authorization' do
describe 'Field authorizations when field is a built in type' do
let(:query_type) do
query_factory do |query|
- query.field :item, type, null: true, resolver: simple_resolver(test_object)
+ query.field :item, type, null: true, resolver: new_resolver(test_object)
end
end
@@ -132,7 +137,7 @@ RSpec.describe 'Gitlab::Graphql::Authorization' do
describe 'Type authorizations' do
let(:query_type) do
query_factory do |query|
- query.field :item, type, null: true, resolver: simple_resolver(test_object)
+ query.field :item, type, null: true, resolver: new_resolver(test_object)
end
end
@@ -169,7 +174,7 @@ RSpec.describe 'Gitlab::Graphql::Authorization' do
let(:query_type) do
query_factory do |query|
- query.field :item, type, null: true, resolver: simple_resolver(test_object), authorize: permission_2
+ query.field :item, type, null: true, resolver: new_resolver(test_object), authorize: permission_2
end
end
@@ -188,11 +193,11 @@ RSpec.describe 'Gitlab::Graphql::Authorization' do
let(:query_type) do
query_factory do |query|
- query.field :item, type.connection_type, null: true, resolver: simple_resolver([test_object, second_test_object])
+ query.field :item, type.connection_type, null: true, resolver: new_resolver([test_object, second_test_object])
end
end
- subject { result.dig('item', 'edges') }
+ subject { result.dig('data', 'item', 'edges') }
it 'returns only the elements visible to the user' do
permit(permission_single)
@@ -208,7 +213,7 @@ RSpec.describe 'Gitlab::Graphql::Authorization' do
describe 'limiting connections with multiple objects' do
let(:query_type) do
query_factory do |query|
- query.field :item, type.connection_type, null: true, resolver: simple_resolver([test_object, second_test_object])
+ query.field :item, type.connection_type, null: true, resolver: new_resolver([test_object, second_test_object])
end
end
@@ -232,11 +237,11 @@ RSpec.describe 'Gitlab::Graphql::Authorization' do
let(:query_type) do
query_factory do |query|
- query.field :item, [type], null: true, resolver: simple_resolver([test_object])
+ query.field :item, [type], null: true, resolver: new_resolver([test_object])
end
end
- subject { result['item'].first }
+ subject { result.dig('data', 'item', 0) }
include_examples 'authorization with a single permission'
end
@@ -260,13 +265,13 @@ RSpec.describe 'Gitlab::Graphql::Authorization' do
type_factory do |type|
type.graphql_name 'FakeProjectType'
type.field :test_issues, issue_type.connection_type, null: false,
- resolver: simple_resolver(Issue.where(project: [visible_project, other_project]).order(id: :asc))
+ resolver: new_resolver(Issue.where(project: [visible_project, other_project]).order(id: :asc))
end
end
let(:query_type) do
query_factory do |query|
- query.field :test_project, project_type, null: false, resolver: simple_resolver(visible_project)
+ query.field :test_project, project_type, null: false, resolver: new_resolver(visible_project)
end
end
@@ -281,7 +286,7 @@ RSpec.describe 'Gitlab::Graphql::Authorization' do
end
it 'renders the issues the user has access to' do
- issue_edges = result['testProject']['testIssues']['edges']
+ issue_edges = result.dig('data', 'testProject', 'testIssues', 'edges')
issue_ids = issue_edges.map { |issue_edge| issue_edge['node']&.fetch('id') }
expect(issue_edges.size).to eq(visible_issues.size)
diff --git a/spec/graphql/features/feature_flag_spec.rb b/spec/graphql/features/feature_flag_spec.rb
index 77810f78257..30238cf9cb3 100644
--- a/spec/graphql/features/feature_flag_spec.rb
+++ b/spec/graphql/features/feature_flag_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe 'Graphql Field feature flags' do
include GraphqlHelpers
+ include Graphql::ResolverFactories
let_it_be(:user) { create(:user) }
@@ -23,7 +24,7 @@ RSpec.describe 'Graphql Field feature flags' do
let(:query_type) do
query_factory do |query|
- query.field :item, type, null: true, feature_flag: feature_flag, resolver: simple_resolver(test_object)
+ query.field :item, type, null: true, feature_flag: feature_flag, resolver: new_resolver(test_object)
end
end
diff --git a/spec/graphql/gitlab_schema_spec.rb b/spec/graphql/gitlab_schema_spec.rb
index 4db12643069..cb2bb25b098 100644
--- a/spec/graphql/gitlab_schema_spec.rb
+++ b/spec/graphql/gitlab_schema_spec.rb
@@ -18,14 +18,6 @@ RSpec.describe GitlabSchema do
expect(field_instrumenters).to include(instance_of(::Gitlab::Graphql::Authorize::Instrumentation))
end
- it 'enables using presenters' do
- expect(field_instrumenters).to include(instance_of(::Gitlab::Graphql::Present::Instrumentation))
- end
-
- it 'enables using gitaly call checker' do
- expect(field_instrumenters).to include(instance_of(::Gitlab::Graphql::CallsGitaly::Instrumentation))
- end
-
it 'has the base mutation' do
expect(described_class.mutation).to eq(::Types::MutationType)
end
@@ -47,7 +39,7 @@ RSpec.describe GitlabSchema do
end
describe '.execute' do
- context 'for different types of users' do
+ context 'with different types of users' do
context 'when no context' do
it 'returns DEFAULT_MAX_COMPLEXITY' do
expect(GraphQL::Schema)
@@ -78,13 +70,15 @@ RSpec.describe GitlabSchema do
context 'when a logged in user' do
it 'returns AUTHENTICATED_COMPLEXITY' do
- expect(GraphQL::Schema).to receive(:execute).with('query', hash_including(max_complexity: GitlabSchema::AUTHENTICATED_COMPLEXITY))
+ expect(GraphQL::Schema).to receive(:execute)
+ .with('query', hash_including(max_complexity: GitlabSchema::AUTHENTICATED_COMPLEXITY))
described_class.execute('query', context: { current_user: user })
end
it 'returns AUTHENTICATED_MAX_DEPTH' do
- expect(GraphQL::Schema).to receive(:execute).with('query', hash_including(max_depth: GitlabSchema::AUTHENTICATED_MAX_DEPTH))
+ expect(GraphQL::Schema).to receive(:execute)
+ .with('query', hash_including(max_depth: GitlabSchema::AUTHENTICATED_MAX_DEPTH))
described_class.execute('query', context: { current_user: user })
end
@@ -94,7 +88,8 @@ RSpec.describe GitlabSchema do
it 'returns ADMIN_COMPLEXITY' do
user = build :user, :admin
- expect(GraphQL::Schema).to receive(:execute).with('query', hash_including(max_complexity: GitlabSchema::ADMIN_COMPLEXITY))
+ expect(GraphQL::Schema).to receive(:execute)
+ .with('query', hash_including(max_complexity: GitlabSchema::ADMIN_COMPLEXITY))
described_class.execute('query', context: { current_user: user })
end
@@ -130,7 +125,7 @@ RSpec.describe GitlabSchema do
end
describe '.object_from_id' do
- context 'for subclasses of `ApplicationRecord`' do
+ context 'with subclasses of `ApplicationRecord`' do
let_it_be(:user) { create(:user) }
it 'returns the correct record' do
@@ -162,7 +157,7 @@ RSpec.describe GitlabSchema do
end
end
- context 'for classes that are not ActiveRecord subclasses and have implemented .lazy_find' do
+ context 'with classes that are not ActiveRecord subclasses and have implemented .lazy_find' do
it 'returns the correct record' do
note = create(:discussion_note_on_merge_request)
@@ -182,7 +177,7 @@ RSpec.describe GitlabSchema do
end
end
- context 'for other classes' do
+ context 'with other classes' do
# We cannot use an anonymous class here as `GlobalID` expects `.name` not
# to return `nil`
before do
diff --git a/spec/graphql/mutations/boards/update_spec.rb b/spec/graphql/mutations/boards/update_spec.rb
new file mode 100644
index 00000000000..da3dfeecd4d
--- /dev/null
+++ b/spec/graphql/mutations/boards/update_spec.rb
@@ -0,0 +1,57 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Mutations::Boards::Update do
+ let_it_be(:project) { create(:project) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:board) { create(:board, project: project) }
+
+ let(:mutation) { described_class.new(object: nil, context: { current_user: user }, field: nil) }
+ let(:mutated_board) { subject[:board] }
+
+ let(:mutation_params) do
+ {
+ id: board.to_global_id,
+ hide_backlog_list: true,
+ hide_closed_list: false
+ }
+ end
+
+ subject { mutation.resolve(**mutation_params) }
+
+ specify { expect(described_class).to require_graphql_authorizations(:admin_issue_board) }
+
+ describe '#resolve' do
+ context 'when the user cannot admin the board' do
+ it 'raises an error' do
+ expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ end
+ end
+
+ context 'with invalid params' do
+ it 'raises an error' do
+ mutation_params[:id] = project.to_global_id
+
+ expect { subject }.to raise_error(::GraphQL::CoercionError)
+ end
+ end
+
+ context 'when user can update board' do
+ before do
+ board.resource_parent.add_reporter(user)
+ end
+
+ it 'updates board with correct values' do
+ expected_attributes = {
+ hide_backlog_list: true,
+ hide_closed_list: false
+ }
+
+ subject
+
+ expect(board.reload).to have_attributes(expected_attributes)
+ end
+ end
+ end
+end
diff --git a/spec/graphql/mutations/concerns/mutations/can_mutate_spammable_spec.rb b/spec/graphql/mutations/concerns/mutations/can_mutate_spammable_spec.rb
index ee8db7a1f31..8d1fce406fa 100644
--- a/spec/graphql/mutations/concerns/mutations/can_mutate_spammable_spec.rb
+++ b/spec/graphql/mutations/concerns/mutations/can_mutate_spammable_spec.rb
@@ -30,7 +30,7 @@ RSpec.describe Mutations::CanMutateSpammable do
end
it 'merges in spam action fields from spammable' do
- result = subject.send(:with_spam_action_fields, spammable) do
+ result = subject.send(:with_spam_action_response_fields, spammable) do
{ other_field: true }
end
expect(result)
diff --git a/spec/graphql/mutations/custom_emoji/create_spec.rb b/spec/graphql/mutations/custom_emoji/create_spec.rb
new file mode 100644
index 00000000000..118c5d67188
--- /dev/null
+++ b/spec/graphql/mutations/custom_emoji/create_spec.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Mutations::CustomEmoji::Create do
+ let_it_be(:group) { create(:group) }
+ let_it_be(:user) { create(:user) }
+ let(:args) { { group_path: group.full_path, name: 'tanuki', url: 'https://about.gitlab.com/images/press/logo/png/gitlab-icon-rgb.png' } }
+
+ before do
+ group.add_developer(user)
+ end
+
+ describe '#resolve' do
+ subject(:resolve) { described_class.new(object: nil, context: { current_user: user }, field: nil).resolve(**args) }
+
+ it 'creates the custom emoji' do
+ expect { resolve }.to change(CustomEmoji, :count).by(1)
+ end
+
+ it 'sets the creator to be the user who added the emoji' do
+ resolve
+
+ expect(CustomEmoji.last.creator).to eq(user)
+ end
+ end
+end
diff --git a/spec/graphql/mutations/merge_requests/accept_spec.rb b/spec/graphql/mutations/merge_requests/accept_spec.rb
new file mode 100644
index 00000000000..db75c64a447
--- /dev/null
+++ b/spec/graphql/mutations/merge_requests/accept_spec.rb
@@ -0,0 +1,171 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Mutations::MergeRequests::Accept do
+ include AfterNextHelpers
+
+ let_it_be(:user) { create(:user) }
+ let(:project) { create(:project, :public, :repository) }
+
+ subject(:mutation) { described_class.new(context: context, object: nil, field: nil) }
+
+ let_it_be(:context) do
+ GraphQL::Query::Context.new(
+ query: OpenStruct.new(schema: GitlabSchema),
+ values: { current_user: user },
+ object: nil
+ )
+ end
+
+ before do
+ project.repository.expire_all_method_caches
+ end
+
+ describe '#resolve' do
+ before do
+ project.add_maintainer(user)
+ end
+
+ def common_args(merge_request)
+ {
+ project_path: project.full_path,
+ iid: merge_request.iid.to_s,
+ sha: merge_request.diff_head_sha,
+ squash: false # default value
+ }
+ end
+
+ it 'merges the merge request' do
+ merge_request = create(:merge_request, source_project: project)
+
+ result = mutation.resolve(**common_args(merge_request))
+
+ expect(result).to include(errors: be_empty, merge_request: be_merged)
+ end
+
+ it 'rejects the mutation if the SHA is a mismatch' do
+ merge_request = create(:merge_request, source_project: project)
+ args = common_args(merge_request).merge(sha: 'not a good sha')
+
+ result = mutation.resolve(**args)
+
+ expect(result).not_to include(merge_request: be_merged)
+ expect(result).to include(errors: [described_class::SHA_MISMATCH])
+ end
+
+ it 'respects the merge commit message' do
+ merge_request = create(:merge_request, source_project: project)
+ args = common_args(merge_request).merge(commit_message: 'my super custom message')
+
+ result = mutation.resolve(**args)
+
+ expect(result).to include(merge_request: be_merged)
+ expect(project.repository.commit(merge_request.target_branch)).to have_attributes(
+ message: args[:commit_message]
+ )
+ end
+
+ it 'respects the squash flag' do
+ merge_request = create(:merge_request, source_project: project)
+ args = common_args(merge_request).merge(squash: true)
+
+ result = mutation.resolve(**args)
+
+ expect(result).to include(merge_request: be_merged)
+ expect(result[:merge_request].squash_commit_sha).to be_present
+ end
+
+ it 'respects the squash_commit_message argument' do
+ merge_request = create(:merge_request, source_project: project)
+ args = common_args(merge_request).merge(squash: true, squash_commit_message: 'squish')
+
+ result = mutation.resolve(**args)
+ sha = result[:merge_request].squash_commit_sha
+
+ expect(result).to include(merge_request: be_merged)
+ expect(project.repository.commit(sha)).to have_attributes(message: "squish\n")
+ end
+
+ it 'respects the should_remove_source_branch argument when true' do
+ b = project.repository.add_branch(user, generate(:branch), 'master')
+ merge_request = create(:merge_request, source_branch: b.name, source_project: project)
+ args = common_args(merge_request).merge(should_remove_source_branch: true)
+
+ expect(::MergeRequests::DeleteSourceBranchWorker).to receive(:perform_async)
+
+ result = mutation.resolve(**args)
+
+ expect(result).to include(merge_request: be_merged)
+ end
+
+ it 'respects the should_remove_source_branch argument when false' do
+ b = project.repository.add_branch(user, generate(:branch), 'master')
+ merge_request = create(:merge_request, source_branch: b.name, source_project: project)
+ args = common_args(merge_request).merge(should_remove_source_branch: false)
+
+ expect(::MergeRequests::DeleteSourceBranchWorker).not_to receive(:perform_async)
+
+ result = mutation.resolve(**args)
+
+ expect(result).to include(merge_request: be_merged)
+ end
+
+ it 'rejects unmergeable MRs' do
+ merge_request = create(:merge_request, :closed, source_project: project)
+ args = common_args(merge_request)
+
+ result = mutation.resolve(**args)
+
+ expect(result).not_to include(merge_request: be_merged)
+ expect(result).to include(errors: [described_class::NOT_MERGEABLE])
+ end
+
+ it 'rejects merges when we cannot validate the hooks' do
+ merge_request = create(:merge_request, source_project: project)
+ args = common_args(merge_request)
+ expect_next(::MergeRequests::MergeService)
+ .to receive(:hooks_validation_pass?).with(merge_request).and_return(false)
+
+ result = mutation.resolve(**args)
+
+ expect(result).not_to include(merge_request: be_merged)
+ expect(result).to include(errors: [described_class::HOOKS_VALIDATION_ERROR])
+ end
+
+ it 'rejects merges when the merge service returns an error' do
+ merge_request = create(:merge_request, source_project: project)
+ args = common_args(merge_request)
+ expect_next(::MergeRequests::MergeService)
+ .to receive(:execute).with(merge_request).and_return(:failed)
+
+ result = mutation.resolve(**args)
+
+ expect(result).not_to include(merge_request: be_merged)
+ expect(result).to include(errors: [described_class::MERGE_FAILED])
+ end
+
+ it 'rejects merges when the merge service raises merge error' do
+ merge_request = create(:merge_request, source_project: project)
+ args = common_args(merge_request)
+ expect_next(::MergeRequests::MergeService)
+ .to receive(:execute).and_raise(::MergeRequests::MergeBaseService::MergeError, 'boom')
+
+ result = mutation.resolve(**args)
+
+ expect(result).not_to include(merge_request: be_merged)
+ expect(result).to include(errors: ['boom'])
+ end
+
+ it "can use the MERGE_WHEN_PIPELINE_SUCCEEDS strategy" do
+ enum = ::Types::MergeStrategyEnum.values['MERGE_WHEN_PIPELINE_SUCCEEDS']
+ merge_request = create(:merge_request, :with_head_pipeline, source_project: project)
+ args = common_args(merge_request).merge(auto_merge_strategy: enum.value)
+
+ result = mutation.resolve(**args)
+
+ expect(result).not_to include(merge_request: be_merged)
+ expect(result).to include(errors: be_empty, merge_request: be_auto_merge_enabled)
+ end
+ end
+end
diff --git a/spec/graphql/mutations/release_asset_links/create_spec.rb b/spec/graphql/mutations/release_asset_links/create_spec.rb
new file mode 100644
index 00000000000..089bc3d3276
--- /dev/null
+++ b/spec/graphql/mutations/release_asset_links/create_spec.rb
@@ -0,0 +1,105 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Mutations::ReleaseAssetLinks::Create do
+ include GraphqlHelpers
+
+ let_it_be(:project) { create(:project, :private, :repository) }
+ let_it_be(:release) { create(:release, project: project, tag: 'v13.10') }
+ let_it_be(:reporter) { create(:user).tap { |u| project.add_reporter(u) } }
+ let_it_be(:developer) { create(:user).tap { |u| project.add_developer(u) } }
+
+ let(:current_user) { developer }
+ let(:context) { { current_user: current_user } }
+ let(:project_path) { project.full_path }
+ let(:tag) { release.tag }
+ let(:name) { 'awesome-app.dmg' }
+ let(:url) { 'https://example.com/download/awesome-app.dmg' }
+ let(:filepath) { '/binaries/awesome-app.dmg' }
+
+ let(:args) do
+ {
+ project_path: project_path,
+ tag_name: tag,
+ name: name,
+ direct_asset_path: filepath,
+ url: url
+ }
+ end
+
+ let(:last_release_link) { release.links.last }
+
+ describe '#resolve' do
+ subject do
+ resolve(described_class, obj: project, args: args, ctx: context)
+ end
+
+ context 'when the user has access and no validation errors occur' do
+ it 'creates a new release asset link', :aggregate_failures do
+ expect(subject).to eq({
+ link: release.reload.links.first,
+ errors: []
+ })
+
+ expect(release.links.length).to be(1)
+
+ expect(last_release_link.name).to eq(name)
+ expect(last_release_link.url).to eq(url)
+ expect(last_release_link.filepath).to eq(filepath)
+ end
+ end
+
+ context "when the user doesn't have access to the project" do
+ let(:current_user) { reporter }
+
+ it 'raises an error' do
+ expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ end
+ end
+
+ context "when the project doesn't exist" do
+ let(:project_path) { 'project/that/does/not/exist' }
+
+ it 'raises an error' do
+ expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ end
+ end
+
+ context "when a validation errors occur" do
+ shared_examples 'returns errors-as-data' do |expected_messages|
+ it { expect(subject[:errors]).to eq(expected_messages) }
+ end
+
+ context "when the release doesn't exist" do
+ let(:tag) { "nonexistent-tag" }
+
+ it_behaves_like 'returns errors-as-data', ['Release with tag "nonexistent-tag" was not found']
+ end
+
+ context 'when the URL is badly formatted' do
+ let(:url) { 'badly-formatted-url' }
+
+ it_behaves_like 'returns errors-as-data', ["Url is blocked: Only allowed schemes are http, https, ftp"]
+ end
+
+ context 'when the name is not provided' do
+ let(:name) { '' }
+
+ it_behaves_like 'returns errors-as-data', ["Name can't be blank"]
+ end
+
+ context 'when the link already exists' do
+ let!(:existing_release_link) do
+ create(:release_link, release: release, name: name, url: url, filepath: filepath)
+ end
+
+ it_behaves_like 'returns errors-as-data', [
+ "Url has already been taken",
+ "Name has already been taken",
+ "Filepath has already been taken"
+ ]
+ end
+ end
+ end
+end
diff --git a/spec/graphql/mutations/user_callouts/create_spec.rb b/spec/graphql/mutations/user_callouts/create_spec.rb
new file mode 100644
index 00000000000..93f227d8b82
--- /dev/null
+++ b/spec/graphql/mutations/user_callouts/create_spec.rb
@@ -0,0 +1,42 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Mutations::UserCallouts::Create do
+ let(:current_user) { create(:user) }
+ let(:mutation) { described_class.new(object: nil, context: { current_user: current_user }, field: nil) }
+
+ describe '#resolve' do
+ subject(:resolve) { mutation.resolve(feature_name: feature_name) }
+
+ context 'when feature name is not supported' do
+ let(:feature_name) { 'not_supported' }
+
+ it 'does not create a user callout' do
+ expect { resolve }.not_to change(UserCallout, :count).from(0)
+ end
+
+ it 'returns error about feature name not being supported' do
+ expect(resolve[:errors]).to include("Feature name is not included in the list")
+ end
+ end
+
+ context 'when feature name is supported' do
+ let(:feature_name) { UserCallout.feature_names.each_key.first.to_s }
+
+ it 'creates a user callout' do
+ expect { resolve }.to change(UserCallout, :count).from(0).to(1)
+ end
+
+ it 'sets dismissed_at for the user callout' do
+ freeze_time do
+ expect(resolve[:user_callout].dismissed_at).to eq(Time.current)
+ end
+ end
+
+ it 'has no errors' do
+ expect(resolve[:errors]).to be_empty
+ end
+ end
+ end
+end
diff --git a/spec/graphql/resolvers/admin/analytics/instance_statistics/measurements_resolver_spec.rb b/spec/graphql/resolvers/admin/analytics/instance_statistics/measurements_resolver_spec.rb
deleted file mode 100644
index 578d679ade4..00000000000
--- a/spec/graphql/resolvers/admin/analytics/instance_statistics/measurements_resolver_spec.rb
+++ /dev/null
@@ -1,100 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Resolvers::Admin::Analytics::InstanceStatistics::MeasurementsResolver do
- include GraphqlHelpers
-
- let_it_be(:admin_user) { create(:user, :admin) }
- let(:current_user) { admin_user }
-
- describe '#resolve' do
- let_it_be(:user) { create(:user) }
-
- let_it_be(:project_measurement_new) { create(:instance_statistics_measurement, :project_count, recorded_at: 2.days.ago) }
- let_it_be(:project_measurement_old) { create(:instance_statistics_measurement, :project_count, recorded_at: 10.days.ago) }
-
- let(:arguments) { { identifier: 'projects' } }
-
- subject { resolve_measurements(arguments, { current_user: current_user }) }
-
- context 'when requesting project count measurements' do
- context 'as an admin user' do
- let(:current_user) { admin_user }
-
- it 'returns the records, latest first' do
- expect(subject).to eq([project_measurement_new, project_measurement_old])
- end
- end
-
- context 'as a non-admin user' do
- let(:current_user) { user }
-
- it 'raises ResourceNotAvailable error' do
- expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
- end
- end
-
- context 'as an unauthenticated user' do
- let(:current_user) { nil }
-
- it 'raises ResourceNotAvailable error' do
- expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
- end
- end
-
- context 'when filtering by recorded_after and recorded_before' do
- before do
- arguments[:recorded_after] = 4.days.ago
- arguments[:recorded_before] = 1.day.ago
- end
-
- it { is_expected.to match_array([project_measurement_new]) }
-
- context 'when "incorrect" values are passed' do
- before do
- arguments[:recorded_after] = 1.day.ago
- arguments[:recorded_before] = 4.days.ago
- end
-
- it { is_expected.to be_empty }
- end
- end
- end
-
- context 'when requesting pipeline counts by pipeline status' do
- let_it_be(:pipelines_succeeded_measurement) { create(:instance_statistics_measurement, :pipelines_succeeded_count, recorded_at: 2.days.ago) }
- let_it_be(:pipelines_skipped_measurement) { create(:instance_statistics_measurement, :pipelines_skipped_count, recorded_at: 2.days.ago) }
-
- subject { resolve_measurements({ identifier: identifier }, { current_user: current_user }) }
-
- context 'filter for pipelines_succeeded' do
- let(:identifier) { 'pipelines_succeeded' }
-
- it { is_expected.to eq([pipelines_succeeded_measurement]) }
- end
-
- context 'filter for pipelines_skipped' do
- let(:identifier) { 'pipelines_skipped' }
-
- it { is_expected.to eq([pipelines_skipped_measurement]) }
- end
-
- context 'filter for pipelines_failed' do
- let(:identifier) { 'pipelines_failed' }
-
- it { is_expected.to be_empty }
- end
-
- context 'filter for pipelines_canceled' do
- let(:identifier) { 'pipelines_canceled' }
-
- it { is_expected.to be_empty }
- end
- end
- end
-
- def resolve_measurements(args = {}, context = {})
- resolve(described_class, args: args, ctx: context)
- end
-end
diff --git a/spec/graphql/resolvers/admin/analytics/usage_trends/measurements_resolver_spec.rb b/spec/graphql/resolvers/admin/analytics/usage_trends/measurements_resolver_spec.rb
new file mode 100644
index 00000000000..269a1fb1758
--- /dev/null
+++ b/spec/graphql/resolvers/admin/analytics/usage_trends/measurements_resolver_spec.rb
@@ -0,0 +1,100 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Resolvers::Admin::Analytics::UsageTrends::MeasurementsResolver do
+ include GraphqlHelpers
+
+ let_it_be(:admin_user) { create(:user, :admin) }
+ let(:current_user) { admin_user }
+
+ describe '#resolve' do
+ let_it_be(:user) { create(:user) }
+
+ let_it_be(:project_measurement_new) { create(:usage_trends_measurement, :project_count, recorded_at: 2.days.ago) }
+ let_it_be(:project_measurement_old) { create(:usage_trends_measurement, :project_count, recorded_at: 10.days.ago) }
+
+ let(:arguments) { { identifier: 'projects' } }
+
+ subject { resolve_measurements(arguments, { current_user: current_user }) }
+
+ context 'when requesting project count measurements' do
+ context 'as an admin user' do
+ let(:current_user) { admin_user }
+
+ it 'returns the records, latest first' do
+ expect(subject).to eq([project_measurement_new, project_measurement_old])
+ end
+ end
+
+ context 'as a non-admin user' do
+ let(:current_user) { user }
+
+ it 'raises ResourceNotAvailable error' do
+ expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ end
+ end
+
+ context 'as an unauthenticated user' do
+ let(:current_user) { nil }
+
+ it 'raises ResourceNotAvailable error' do
+ expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ end
+ end
+
+ context 'when filtering by recorded_after and recorded_before' do
+ before do
+ arguments[:recorded_after] = 4.days.ago
+ arguments[:recorded_before] = 1.day.ago
+ end
+
+ it { is_expected.to match_array([project_measurement_new]) }
+
+ context 'when "incorrect" values are passed' do
+ before do
+ arguments[:recorded_after] = 1.day.ago
+ arguments[:recorded_before] = 4.days.ago
+ end
+
+ it { is_expected.to be_empty }
+ end
+ end
+ end
+
+ context 'when requesting pipeline counts by pipeline status' do
+ let_it_be(:pipelines_succeeded_measurement) { create(:usage_trends_measurement, :pipelines_succeeded_count, recorded_at: 2.days.ago) }
+ let_it_be(:pipelines_skipped_measurement) { create(:usage_trends_measurement, :pipelines_skipped_count, recorded_at: 2.days.ago) }
+
+ subject { resolve_measurements({ identifier: identifier }, { current_user: current_user }) }
+
+ context 'filter for pipelines_succeeded' do
+ let(:identifier) { 'pipelines_succeeded' }
+
+ it { is_expected.to eq([pipelines_succeeded_measurement]) }
+ end
+
+ context 'filter for pipelines_skipped' do
+ let(:identifier) { 'pipelines_skipped' }
+
+ it { is_expected.to eq([pipelines_skipped_measurement]) }
+ end
+
+ context 'filter for pipelines_failed' do
+ let(:identifier) { 'pipelines_failed' }
+
+ it { is_expected.to be_empty }
+ end
+
+ context 'filter for pipelines_canceled' do
+ let(:identifier) { 'pipelines_canceled' }
+
+ it { is_expected.to be_empty }
+ end
+ end
+ end
+
+ def resolve_measurements(args = {}, context = {})
+ resolve(described_class, args: args, ctx: context)
+ end
+end
diff --git a/spec/graphql/resolvers/alert_management/http_integrations_resolver_spec.rb b/spec/graphql/resolvers/alert_management/http_integrations_resolver_spec.rb
new file mode 100644
index 00000000000..2cd61dd7bcf
--- /dev/null
+++ b/spec/graphql/resolvers/alert_management/http_integrations_resolver_spec.rb
@@ -0,0 +1,51 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Resolvers::AlertManagement::HttpIntegrationsResolver do
+ include GraphqlHelpers
+
+ let_it_be(:guest) { create(:user) }
+ let_it_be(:developer) { create(:user) }
+ let_it_be(:maintainer) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:prometheus_integration) { create(:prometheus_service, project: project) }
+ let_it_be(:active_http_integration) { create(:alert_management_http_integration, project: project) }
+ let_it_be(:inactive_http_integration) { create(:alert_management_http_integration, :inactive, project: project) }
+ let_it_be(:other_proj_integration) { create(:alert_management_http_integration) }
+
+ subject { sync(resolve_http_integrations) }
+
+ before do
+ project.add_developer(developer)
+ project.add_maintainer(maintainer)
+ end
+
+ specify do
+ expect(described_class).to have_nullable_graphql_type(Types::AlertManagement::HttpIntegrationType.connection_type)
+ end
+
+ context 'user does not have permission' do
+ let(:current_user) { guest }
+
+ it { is_expected.to be_empty }
+ end
+
+ context 'user has developer permission' do
+ let(:current_user) { developer }
+
+ it { is_expected.to be_empty }
+ end
+
+ context 'user has maintainer permission' do
+ let(:current_user) { maintainer }
+
+ it { is_expected.to contain_exactly(active_http_integration) }
+ end
+
+ private
+
+ def resolve_http_integrations(args = {}, context = { current_user: current_user })
+ resolve(described_class, obj: project, ctx: context)
+ end
+end
diff --git a/spec/graphql/resolvers/board_resolver_spec.rb b/spec/graphql/resolvers/board_resolver_spec.rb
index c70c696005f..e9c51a536ee 100644
--- a/spec/graphql/resolvers/board_resolver_spec.rb
+++ b/spec/graphql/resolvers/board_resolver_spec.rb
@@ -14,8 +14,8 @@ RSpec.describe Resolvers::BoardResolver do
expect(resolve_board(id: dummy_gid)).to eq nil
end
- it 'calls Boards::ListService' do
- expect_next_instance_of(Boards::ListService) do |service|
+ it 'calls Boards::BoardsFinder' do
+ expect_next_instance_of(Boards::BoardsFinder) do |service|
expect(service).to receive(:execute).and_return([])
end
diff --git a/spec/graphql/resolvers/boards_resolver_spec.rb b/spec/graphql/resolvers/boards_resolver_spec.rb
index f121e8a4083..cb3bcb002ec 100644
--- a/spec/graphql/resolvers/boards_resolver_spec.rb
+++ b/spec/graphql/resolvers/boards_resolver_spec.rb
@@ -12,8 +12,8 @@ RSpec.describe Resolvers::BoardsResolver do
expect(resolve_boards).to eq []
end
- it 'calls Boards::ListService' do
- expect_next_instance_of(Boards::ListService) do |service|
+ it 'calls Boards::BoardsFinder' do
+ expect_next_instance_of(Boards::BoardsFinder) do |service|
expect(service).to receive(:execute)
end
diff --git a/spec/graphql/resolvers/branch_commit_resolver_spec.rb b/spec/graphql/resolvers/branch_commit_resolver_spec.rb
index 78d4959c3f9..9d085fd19a6 100644
--- a/spec/graphql/resolvers/branch_commit_resolver_spec.rb
+++ b/spec/graphql/resolvers/branch_commit_resolver_spec.rb
@@ -15,6 +15,10 @@ RSpec.describe Resolvers::BranchCommitResolver do
is_expected.to eq(repository.commits('master', limit: 1).last)
end
+ it 'sets project container' do
+ expect(commit.container).to eq(repository.project)
+ end
+
context 'when branch does not exist' do
let(:branch) { nil }
diff --git a/spec/graphql/resolvers/concerns/caching_array_resolver_spec.rb b/spec/graphql/resolvers/concerns/caching_array_resolver_spec.rb
index 5370f7a7433..e9e7fff6e6e 100644
--- a/spec/graphql/resolvers/concerns/caching_array_resolver_spec.rb
+++ b/spec/graphql/resolvers/concerns/caching_array_resolver_spec.rb
@@ -9,7 +9,6 @@ RSpec.describe ::CachingArrayResolver do
let_it_be(:admins) { create_list(:user, 4, admin: true) }
let(:query_context) { { current_user: admins.first } }
let(:max_page_size) { 10 }
- let(:field) { double('Field', max_page_size: max_page_size) }
let(:schema) do
Class.new(GitlabSchema) do
default_max_page_size 3
@@ -210,6 +209,6 @@ RSpec.describe ::CachingArrayResolver do
args = { is_admin: admin }
opts = resolver.field_options
allow(resolver).to receive(:field_options).and_return(opts.merge(max_page_size: max_page_size))
- resolve(resolver, args: args, ctx: query_context, schema: schema, field: field)
+ resolve(resolver, args: args, ctx: query_context, schema: schema)
end
end
diff --git a/spec/graphql/resolvers/error_tracking/sentry_errors_resolver_spec.rb b/spec/graphql/resolvers/error_tracking/sentry_errors_resolver_spec.rb
index 170a602fb0d..68badb8e333 100644
--- a/spec/graphql/resolvers/error_tracking/sentry_errors_resolver_spec.rb
+++ b/spec/graphql/resolvers/error_tracking/sentry_errors_resolver_spec.rb
@@ -19,7 +19,7 @@ RSpec.describe Resolvers::ErrorTracking::SentryErrorsResolver do
end
describe '#resolve' do
- context 'insufficient user permission' do
+ context 'with insufficient user permission' do
let(:user) { create(:user) }
it 'returns nil' do
@@ -29,7 +29,7 @@ RSpec.describe Resolvers::ErrorTracking::SentryErrorsResolver do
end
end
- context 'user with permission' do
+ context 'with sufficient permission' do
before do
project.add_developer(current_user)
@@ -93,7 +93,7 @@ RSpec.describe Resolvers::ErrorTracking::SentryErrorsResolver do
end
it 'returns an externally paginated array' do
- expect(resolve_errors).to be_a Gitlab::Graphql::ExternallyPaginatedArray
+ expect(resolve_errors).to be_a Gitlab::Graphql::Pagination::ExternallyPaginatedArrayConnection
end
end
end
diff --git a/spec/graphql/resolvers/group_labels_resolver_spec.rb b/spec/graphql/resolvers/group_labels_resolver_spec.rb
index ed94f12502a..3f4ad8760c0 100644
--- a/spec/graphql/resolvers/group_labels_resolver_spec.rb
+++ b/spec/graphql/resolvers/group_labels_resolver_spec.rb
@@ -42,7 +42,7 @@ RSpec.describe Resolvers::GroupLabelsResolver do
context 'without parent' do
it 'returns no labels' do
- expect(resolve_labels(nil)).to eq(Label.none)
+ expect(resolve_labels(nil)).to be_empty
end
end
diff --git a/spec/graphql/resolvers/group_packages_resolver_spec.rb b/spec/graphql/resolvers/group_packages_resolver_spec.rb
new file mode 100644
index 00000000000..59438b8d5ad
--- /dev/null
+++ b/spec/graphql/resolvers/group_packages_resolver_spec.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Resolvers::GroupPackagesResolver do
+ include GraphqlHelpers
+
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group) { create(:group, :public) }
+ let_it_be(:project) { create(:project, :public, group: group) }
+ let_it_be(:package) { create(:package, project: project) }
+
+ describe '#resolve' do
+ subject(:packages) { resolve(described_class, ctx: { current_user: user }, obj: group) }
+
+ it { is_expected.to contain_exactly(package) }
+ end
+end
diff --git a/spec/graphql/resolvers/issues_resolver_spec.rb b/spec/graphql/resolvers/issues_resolver_spec.rb
index 8980f4aa19d..6e802bf7d25 100644
--- a/spec/graphql/resolvers/issues_resolver_spec.rb
+++ b/spec/graphql/resolvers/issues_resolver_spec.rb
@@ -264,7 +264,7 @@ RSpec.describe Resolvers::IssuesResolver do
end
it 'finds a specific issue with iid', :request_store do
- result = batch_sync(max_queries: 4) { resolve_issues(iid: issue1.iid) }
+ result = batch_sync(max_queries: 4) { resolve_issues(iid: issue1.iid).to_a }
expect(result).to contain_exactly(issue1)
end
@@ -281,7 +281,7 @@ RSpec.describe Resolvers::IssuesResolver do
it 'finds a specific issue with iids', :request_store do
result = batch_sync(max_queries: 4) do
- resolve_issues(iids: [issue1.iid])
+ resolve_issues(iids: [issue1.iid]).to_a
end
expect(result).to contain_exactly(issue1)
@@ -290,7 +290,7 @@ RSpec.describe Resolvers::IssuesResolver do
it 'finds multiple issues with iids' do
create(:issue, project: project, author: current_user)
- expect(batch_sync { resolve_issues(iids: [issue1.iid, issue2.iid]) })
+ expect(batch_sync { resolve_issues(iids: [issue1.iid, issue2.iid]).to_a })
.to contain_exactly(issue1, issue2)
end
@@ -302,7 +302,7 @@ RSpec.describe Resolvers::IssuesResolver do
create(:issue, project: another_project, iid: iid)
end
- expect(batch_sync { resolve_issues(iids: iids) }).to contain_exactly(issue1, issue2)
+ expect(batch_sync { resolve_issues(iids: iids).to_a }).to contain_exactly(issue1, issue2)
end
end
end
diff --git a/spec/graphql/resolvers/labels_resolver_spec.rb b/spec/graphql/resolvers/labels_resolver_spec.rb
index 3d027a6c8d5..be6229553d7 100644
--- a/spec/graphql/resolvers/labels_resolver_spec.rb
+++ b/spec/graphql/resolvers/labels_resolver_spec.rb
@@ -42,50 +42,36 @@ RSpec.describe Resolvers::LabelsResolver do
context 'without parent' do
it 'returns no labels' do
- expect(resolve_labels(nil)).to eq(Label.none)
+ expect(resolve_labels(nil)).to be_empty
end
end
- context 'at project level' do
+ context 'with a parent project' do
before_all do
group.add_developer(current_user)
end
- # because :include_ancestor_groups, :include_descendant_groups, :only_group_labels default to false
- # the `nil` value would be equivalent to passing in `false` so just check for `nil` option
- where(:include_ancestor_groups, :include_descendant_groups, :only_group_labels, :search_term, :test) do
- nil | nil | nil | nil | -> { expect(subject).to contain_exactly(label1, label2, subgroup_label1, subgroup_label2) }
- nil | nil | true | nil | -> { expect(subject).to contain_exactly(label1, label2, subgroup_label1, subgroup_label2) }
- nil | true | nil | nil | -> { expect(subject).to contain_exactly(label1, label2, subgroup_label1, subgroup_label2, sub_subgroup_label1, sub_subgroup_label2) }
- nil | true | true | nil | -> { expect(subject).to contain_exactly(label1, label2, subgroup_label1, subgroup_label2, sub_subgroup_label1, sub_subgroup_label2) }
- true | nil | nil | nil | -> { expect(subject).to contain_exactly(label1, label2, group_label1, group_label2, subgroup_label1, subgroup_label2) }
- true | nil | true | nil | -> { expect(subject).to contain_exactly(label1, label2, group_label1, group_label2, subgroup_label1, subgroup_label2) }
- true | true | nil | nil | -> { expect(subject).to contain_exactly(label1, label2, group_label1, group_label2, subgroup_label1, subgroup_label2, sub_subgroup_label1, sub_subgroup_label2) }
- true | true | true | nil | -> { expect(subject).to contain_exactly(label1, label2, group_label1, group_label2, subgroup_label1, subgroup_label2, sub_subgroup_label1, sub_subgroup_label2) }
-
- nil | nil | nil | 'new' | -> { expect(subject).to contain_exactly(label2, subgroup_label2) }
- nil | nil | true | 'new' | -> { expect(subject).to contain_exactly(label2, subgroup_label2) }
- nil | true | nil | 'new' | -> { expect(subject).to contain_exactly(label2, subgroup_label2, sub_subgroup_label2) }
- nil | true | true | 'new' | -> { expect(subject).to contain_exactly(label2, subgroup_label2, sub_subgroup_label2) }
- true | nil | nil | 'new' | -> { expect(subject).to contain_exactly(label2, group_label2, subgroup_label2) }
- true | nil | true | 'new' | -> { expect(subject).to contain_exactly(label2, group_label2, subgroup_label2) }
- true | true | nil | 'new' | -> { expect(subject).to contain_exactly(label2, group_label2, subgroup_label2, sub_subgroup_label2) }
- true | true | true | 'new' | -> { expect(subject).to contain_exactly(label2, group_label2, subgroup_label2, sub_subgroup_label2) }
+ # the expected result is wrapped in a lambda to get around the phase restrictions of RSpec::Parameterized
+ where(:include_ancestor_groups, :search_term, :expected_labels) do
+ nil | nil | -> { [label1, label2, subgroup_label1, subgroup_label2] }
+ false | nil | -> { [label1, label2, subgroup_label1, subgroup_label2] }
+ true | nil | -> { [label1, label2, group_label1, group_label2, subgroup_label1, subgroup_label2] }
+ nil | 'new' | -> { [label2, subgroup_label2] }
+ false | 'new' | -> { [label2, subgroup_label2] }
+ true | 'new' | -> { [label2, group_label2, subgroup_label2] }
end
with_them do
let(:params) do
{
include_ancestor_groups: include_ancestor_groups,
- include_descendant_groups: include_descendant_groups,
- only_group_labels: only_group_labels,
search_term: search_term
}
end
subject { resolve_labels(project, params) }
- it { self.instance_exec(&test) }
+ specify { expect(subject).to match_array(instance_exec(&expected_labels)) }
end
end
end
diff --git a/spec/graphql/resolvers/merge_requests_resolver_spec.rb b/spec/graphql/resolvers/merge_requests_resolver_spec.rb
index c5c368fc88f..7dd968d90a8 100644
--- a/spec/graphql/resolvers/merge_requests_resolver_spec.rb
+++ b/spec/graphql/resolvers/merge_requests_resolver_spec.rb
@@ -69,7 +69,7 @@ RSpec.describe Resolvers::MergeRequestsResolver do
it 'batch-resolves by target project full path and IIDS', :request_store do
result = batch_sync(max_queries: queries_per_project) do
- resolve_mr(project, iids: [iid_1, iid_2])
+ resolve_mr(project, iids: [iid_1, iid_2]).to_a
end
expect(result).to contain_exactly(merge_request_1, merge_request_2)
diff --git a/spec/graphql/resolvers/namespace_projects_resolver_spec.rb b/spec/graphql/resolvers/namespace_projects_resolver_spec.rb
index 4ad8f99219f..147a02e1d79 100644
--- a/spec/graphql/resolvers/namespace_projects_resolver_spec.rb
+++ b/spec/graphql/resolvers/namespace_projects_resolver_spec.rb
@@ -6,6 +6,18 @@ RSpec.describe Resolvers::NamespaceProjectsResolver do
include GraphqlHelpers
let(:current_user) { create(:user) }
+ let(:include_subgroups) { true }
+ let(:sort) { nil }
+ let(:search) { nil }
+ let(:ids) { nil }
+ let(:args) do
+ {
+ include_subgroups: include_subgroups,
+ sort: sort,
+ search: search,
+ ids: ids
+ }
+ end
context "with a group" do
let(:group) { create(:group) }
@@ -27,7 +39,7 @@ RSpec.describe Resolvers::NamespaceProjectsResolver do
end
it 'finds all projects including the subgroups' do
- expect(resolve_projects(include_subgroups: true, sort: nil, search: nil)).to contain_exactly(project1, project2, nested_project)
+ expect(resolve_projects(args)).to contain_exactly(project1, project2, nested_project)
end
context 'with an user namespace' do
@@ -38,7 +50,7 @@ RSpec.describe Resolvers::NamespaceProjectsResolver do
end
it 'finds all projects including the subgroups' do
- expect(resolve_projects(include_subgroups: true, sort: nil, search: nil)).to contain_exactly(project1, project2)
+ expect(resolve_projects(args)).to contain_exactly(project1, project2)
end
end
end
@@ -48,6 +60,9 @@ RSpec.describe Resolvers::NamespaceProjectsResolver do
let(:project_2) { create(:project, name: 'Test Project', path: 'test-project', namespace: namespace) }
let(:project_3) { create(:project, name: 'Test', path: 'test', namespace: namespace) }
+ let(:sort) { :similarity }
+ let(:search) { 'test' }
+
before do
project_1.add_developer(current_user)
project_2.add_developer(current_user)
@@ -55,7 +70,7 @@ RSpec.describe Resolvers::NamespaceProjectsResolver do
end
it 'returns projects ordered by similarity to the search input' do
- projects = resolve_projects(include_subgroups: true, sort: :similarity, search: 'test')
+ projects = resolve_projects(args)
project_names = projects.map { |proj| proj['name'] }
expect(project_names.first).to eq('Test')
@@ -63,15 +78,17 @@ RSpec.describe Resolvers::NamespaceProjectsResolver do
end
it 'filters out result that do not match the search input' do
- projects = resolve_projects(include_subgroups: true, sort: :similarity, search: 'test')
+ projects = resolve_projects(args)
project_names = projects.map { |proj| proj['name'] }
expect(project_names).not_to include('Project')
end
context 'when `search` parameter is not given' do
+ let(:search) { nil }
+
it 'returns projects not ordered by similarity' do
- projects = resolve_projects(include_subgroups: true, sort: :similarity, search: nil)
+ projects = resolve_projects(args)
project_names = projects.map { |proj| proj['name'] }
expect(project_names.first).not_to eq('Test')
@@ -79,14 +96,40 @@ RSpec.describe Resolvers::NamespaceProjectsResolver do
end
context 'when only search term is given' do
+ let(:sort) { nil }
+ let(:search) { 'test' }
+
it 'filters out result that do not match the search input, but does not sort them' do
- projects = resolve_projects(include_subgroups: true, sort: :nil, search: 'test')
+ projects = resolve_projects(args)
project_names = projects.map { |proj| proj['name'] }
expect(project_names).to contain_exactly('Test', 'Test Project')
end
end
end
+
+ context 'ids filtering' do
+ subject(:projects) { resolve_projects(args) }
+
+ let(:include_subgroups) { false }
+ let(:project_3) { create(:project, name: 'Project', path: 'project', namespace: namespace) }
+
+ context 'when ids is provided' do
+ let(:ids) { [project_3.to_global_id.to_s] }
+
+ it 'returns matching project' do
+ expect(projects).to contain_exactly(project_3)
+ end
+ end
+
+ context 'when ids is nil' do
+ let(:ids) { nil }
+
+ it 'returns all projects' do
+ expect(projects).to contain_exactly(project1, project2, project_3)
+ end
+ end
+ end
end
context "when passing a non existent, batch loaded namespace" do
@@ -108,7 +151,7 @@ RSpec.describe Resolvers::NamespaceProjectsResolver do
expect(field.to_graphql.complexity.call({}, { include_subgroups: true }, 1)).to eq 24
end
- def resolve_projects(args = { include_subgroups: false, sort: nil, search: nil }, context = { current_user: current_user })
+ def resolve_projects(args = { include_subgroups: false, sort: nil, search: nil, ids: nil }, context = { current_user: current_user })
resolve(described_class, obj: namespace, args: args, ctx: context)
end
end
diff --git a/spec/graphql/resolvers/packages_resolver_spec.rb b/spec/graphql/resolvers/packages_resolver_spec.rb
deleted file mode 100644
index bc0588daf7f..00000000000
--- a/spec/graphql/resolvers/packages_resolver_spec.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Resolvers::PackagesResolver do
- include GraphqlHelpers
-
- let_it_be(:user) { create(:user) }
- let_it_be(:project) { create(:project, :public) }
- let_it_be(:package) { create(:package, project: project) }
-
- describe '#resolve' do
- subject(:packages) { resolve(described_class, ctx: { current_user: user }, obj: project) }
-
- it { is_expected.to contain_exactly(package) }
- end
-end
diff --git a/spec/graphql/resolvers/project_packages_resolver_spec.rb b/spec/graphql/resolvers/project_packages_resolver_spec.rb
new file mode 100644
index 00000000000..c8105ed2a38
--- /dev/null
+++ b/spec/graphql/resolvers/project_packages_resolver_spec.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Resolvers::ProjectPackagesResolver do
+ include GraphqlHelpers
+
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project, :public) }
+ let_it_be(:package) { create(:package, project: project) }
+
+ describe '#resolve' do
+ subject(:packages) { resolve(described_class, ctx: { current_user: user }, obj: project) }
+
+ it { is_expected.to contain_exactly(package) }
+ end
+end
diff --git a/spec/graphql/resolvers/project_pipeline_resolver_spec.rb b/spec/graphql/resolvers/project_pipeline_resolver_spec.rb
index b852b349d4f..69127c4b061 100644
--- a/spec/graphql/resolvers/project_pipeline_resolver_spec.rb
+++ b/spec/graphql/resolvers/project_pipeline_resolver_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe Resolvers::ProjectPipelineResolver do
include GraphqlHelpers
let_it_be(:project) { create(:project) }
- let_it_be(:pipeline) { create(:ci_pipeline, project: project, iid: '1234') }
+ let_it_be(:pipeline) { create(:ci_pipeline, project: project, iid: '1234', sha: 'sha') }
let_it_be(:other_pipeline) { create(:ci_pipeline) }
let(:current_user) { create(:user) }
@@ -30,7 +30,15 @@ RSpec.describe Resolvers::ProjectPipelineResolver do
expect(result).to eq(pipeline)
end
- it 'keeps the queries under the threshold' do
+ it 'resolves pipeline for the passed sha' do
+ result = batch_sync do
+ resolve_pipeline(project, { sha: 'sha' })
+ end
+
+ expect(result).to eq(pipeline)
+ end
+
+ it 'keeps the queries under the threshold for iid' do
create(:ci_pipeline, project: project, iid: '1235')
control = ActiveRecord::QueryRecorder.new do
@@ -45,6 +53,21 @@ RSpec.describe Resolvers::ProjectPipelineResolver do
end.not_to exceed_query_limit(control)
end
+ it 'keeps the queries under the threshold for sha' do
+ create(:ci_pipeline, project: project, sha: 'sha2')
+
+ control = ActiveRecord::QueryRecorder.new do
+ batch_sync { resolve_pipeline(project, { sha: 'sha' }) }
+ end
+
+ expect do
+ batch_sync do
+ resolve_pipeline(project, { sha: 'sha' })
+ resolve_pipeline(project, { sha: 'sha2' })
+ end
+ end.not_to exceed_query_limit(control)
+ end
+
it 'does not resolve a pipeline outside the project' do
result = batch_sync do
resolve_pipeline(other_pipeline.project, { iid: '1234' })
@@ -53,8 +76,14 @@ RSpec.describe Resolvers::ProjectPipelineResolver do
expect(result).to be_nil
end
- it 'errors when no iid is passed' do
- expect { resolve_pipeline(project, {}) }.to raise_error(ArgumentError)
+ it 'errors when no iid or sha is passed' do
+ expect { resolve_pipeline(project, {}) }
+ .to raise_error(Gitlab::Graphql::Errors::ArgumentError)
+ end
+
+ it 'errors when both iid and sha are passed' do
+ expect { resolve_pipeline(project, { iid: '1234', sha: 'sha' }) }
+ .to raise_error(Gitlab::Graphql::Errors::ArgumentError)
end
context 'when the pipeline is a dangling pipeline' do
diff --git a/spec/graphql/resolvers/release_milestones_resolver_spec.rb b/spec/graphql/resolvers/release_milestones_resolver_spec.rb
index f05069998d0..a5a523859f9 100644
--- a/spec/graphql/resolvers/release_milestones_resolver_spec.rb
+++ b/spec/graphql/resolvers/release_milestones_resolver_spec.rb
@@ -14,7 +14,7 @@ RSpec.describe Resolvers::ReleaseMilestonesResolver do
describe '#resolve' do
it "uses offset-pagination" do
- expect(resolved).to be_a(::Gitlab::Graphql::Pagination::OffsetPaginatedRelation)
+ expect(resolved).to be_a(::Gitlab::Graphql::Pagination::OffsetActiveRecordRelationConnection)
end
it "includes the release's milestones in the returned OffsetActiveRecordRelationConnection" do
diff --git a/spec/graphql/types/access_level_enum_spec.rb b/spec/graphql/types/access_level_enum_spec.rb
index eeb10a50b7e..1b379c56ff9 100644
--- a/spec/graphql/types/access_level_enum_spec.rb
+++ b/spec/graphql/types/access_level_enum_spec.rb
@@ -6,6 +6,6 @@ RSpec.describe GitlabSchema.types['AccessLevelEnum'] do
specify { expect(described_class.graphql_name).to eq('AccessLevelEnum') }
it 'exposes all the existing access levels' do
- expect(described_class.values.keys).to match_array(%w[NO_ACCESS GUEST REPORTER DEVELOPER MAINTAINER OWNER])
+ expect(described_class.values.keys).to match_array(%w[NO_ACCESS MINIMAL_ACCESS GUEST REPORTER DEVELOPER MAINTAINER OWNER])
end
end
diff --git a/spec/graphql/types/admin/analytics/instance_statistics/measurement_identifier_enum_spec.rb b/spec/graphql/types/admin/analytics/instance_statistics/measurement_identifier_enum_spec.rb
deleted file mode 100644
index 8a7408224a2..00000000000
--- a/spec/graphql/types/admin/analytics/instance_statistics/measurement_identifier_enum_spec.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe GitlabSchema.types['MeasurementIdentifier'] do
- specify { expect(described_class.graphql_name).to eq('MeasurementIdentifier') }
-
- it 'exposes all the existing identifier values' do
- ee_only_identifiers = %w[billable_users]
- identifiers = Analytics::InstanceStatistics::Measurement.identifiers.keys.reject do |x|
- ee_only_identifiers.include?(x)
- end.map(&:upcase)
-
- expect(described_class.values.keys).to match_array(identifiers)
- end
-end
diff --git a/spec/graphql/types/admin/analytics/instance_statistics/measurement_type_spec.rb b/spec/graphql/types/admin/analytics/instance_statistics/measurement_type_spec.rb
deleted file mode 100644
index ffb1a0f30c9..00000000000
--- a/spec/graphql/types/admin/analytics/instance_statistics/measurement_type_spec.rb
+++ /dev/null
@@ -1,55 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe GitlabSchema.types['InstanceStatisticsMeasurement'] do
- subject { described_class }
-
- it { is_expected.to have_graphql_field(:recorded_at) }
- it { is_expected.to have_graphql_field(:identifier) }
- it { is_expected.to have_graphql_field(:count) }
-
- describe 'authorization' do
- let_it_be(:measurement) { create(:instance_statistics_measurement, :project_count) }
- let(:user) { create(:user) }
-
- let(:query) do
- <<~GRAPHQL
- query instanceStatisticsMeasurements($identifier: MeasurementIdentifier!) {
- instanceStatisticsMeasurements(identifier: $identifier) {
- nodes {
- count
- identifier
- }
- }
- }
- GRAPHQL
- end
-
- subject do
- GitlabSchema.execute(
- query,
- variables: { identifier: 'PROJECTS' },
- context: { current_user: user }
- ).to_h
- end
-
- context 'when the user is not admin' do
- it 'returns no data' do
- expect(subject.dig('data', 'instanceStatisticsMeasurements')).to be_nil
- end
- end
-
- context 'when user is an admin' do
- let(:user) { create(:user, :admin) }
-
- before do
- stub_feature_flags(user_mode_in_session: false)
- end
-
- it 'returns data' do
- expect(subject.dig('data', 'instanceStatisticsMeasurements', 'nodes')).not_to be_empty
- end
- end
- end
-end
diff --git a/spec/graphql/types/admin/analytics/usage_trends/measurement_identifier_enum_spec.rb b/spec/graphql/types/admin/analytics/usage_trends/measurement_identifier_enum_spec.rb
new file mode 100644
index 00000000000..91851c11dc8
--- /dev/null
+++ b/spec/graphql/types/admin/analytics/usage_trends/measurement_identifier_enum_spec.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe GitlabSchema.types['MeasurementIdentifier'] do
+ specify { expect(described_class.graphql_name).to eq('MeasurementIdentifier') }
+
+ it 'exposes all the existing identifier values' do
+ ee_only_identifiers = %w[billable_users]
+ identifiers = Analytics::UsageTrends::Measurement.identifiers.keys.reject do |x|
+ ee_only_identifiers.include?(x)
+ end.map(&:upcase)
+
+ expect(described_class.values.keys).to match_array(identifiers)
+ end
+end
diff --git a/spec/graphql/types/admin/analytics/usage_trends/measurement_type_spec.rb b/spec/graphql/types/admin/analytics/usage_trends/measurement_type_spec.rb
new file mode 100644
index 00000000000..c50092d7f0e
--- /dev/null
+++ b/spec/graphql/types/admin/analytics/usage_trends/measurement_type_spec.rb
@@ -0,0 +1,55 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe GitlabSchema.types['UsageTrendsMeasurement'] do
+ subject { described_class }
+
+ it { is_expected.to have_graphql_field(:recorded_at) }
+ it { is_expected.to have_graphql_field(:identifier) }
+ it { is_expected.to have_graphql_field(:count) }
+
+ describe 'authorization' do
+ let_it_be(:measurement) { create(:usage_trends_measurement, :project_count) }
+ let(:user) { create(:user) }
+
+ let(:query) do
+ <<~GRAPHQL
+ query usageTrendsMeasurements($identifier: MeasurementIdentifier!) {
+ usageTrendsMeasurements(identifier: $identifier) {
+ nodes {
+ count
+ identifier
+ }
+ }
+ }
+ GRAPHQL
+ end
+
+ subject do
+ GitlabSchema.execute(
+ query,
+ variables: { identifier: 'PROJECTS' },
+ context: { current_user: user }
+ ).to_h
+ end
+
+ context 'when the user is not admin' do
+ it 'returns no data' do
+ expect(subject.dig('data', 'usageTrendsMeasurements')).to be_nil
+ end
+ end
+
+ context 'when user is an admin' do
+ let(:user) { create(:user, :admin) }
+
+ before do
+ stub_feature_flags(user_mode_in_session: false)
+ end
+
+ it 'returns data' do
+ expect(subject.dig('data', 'usageTrendsMeasurements', 'nodes')).not_to be_empty
+ end
+ end
+ end
+end
diff --git a/spec/graphql/types/alert_management/alert_type_spec.rb b/spec/graphql/types/alert_management/alert_type_spec.rb
index 82b48a20708..9ff01418c9a 100644
--- a/spec/graphql/types/alert_management/alert_type_spec.rb
+++ b/spec/graphql/types/alert_management/alert_type_spec.rb
@@ -10,7 +10,8 @@ RSpec.describe GitlabSchema.types['AlertManagementAlert'] do
it 'exposes the expected fields' do
expected_fields = %i[
iid
- issue_iid
+ issueIid
+ issue
title
description
severity
diff --git a/spec/graphql/types/base_argument_spec.rb b/spec/graphql/types/base_argument_spec.rb
new file mode 100644
index 00000000000..61e0179ff21
--- /dev/null
+++ b/spec/graphql/types/base_argument_spec.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Types::BaseArgument do
+ include_examples 'Gitlab-style deprecations' do
+ let_it_be(:field) do
+ Types::BaseField.new(name: 'field', type: String, null: true)
+ end
+
+ let(:base_args) { { name: 'test', type: String, required: false, owner: field } }
+
+ def subject(args = {})
+ described_class.new(**base_args.merge(args))
+ end
+ end
+end
diff --git a/spec/graphql/types/board_type_spec.rb b/spec/graphql/types/board_type_spec.rb
index 5ea87d5f473..dca3cfd8aaf 100644
--- a/spec/graphql/types/board_type_spec.rb
+++ b/spec/graphql/types/board_type_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe GitlabSchema.types['Board'] do
specify { expect(described_class.graphql_name).to eq('Board') }
- specify { expect(described_class).to require_graphql_authorizations(:read_board) }
+ specify { expect(described_class).to require_graphql_authorizations(:read_issue_board) }
it 'has specific fields' do
expected_fields = %w[id name web_url web_path]
diff --git a/spec/graphql/types/ci/job_type_spec.rb b/spec/graphql/types/ci/job_type_spec.rb
index e277916f5cb..25f626cea0f 100644
--- a/spec/graphql/types/ci/job_type_spec.rb
+++ b/spec/graphql/types/ci/job_type_spec.rb
@@ -14,6 +14,8 @@ RSpec.describe Types::Ci::JobType do
detailedStatus
scheduledAt
artifacts
+ finished_at
+ duration
]
expect(described_class).to have_graphql_fields(*expected_fields)
diff --git a/spec/graphql/types/ci/pipeline_type_spec.rb b/spec/graphql/types/ci/pipeline_type_spec.rb
index 2a1e030480d..e0e84a1b635 100644
--- a/spec/graphql/types/ci/pipeline_type_spec.rb
+++ b/spec/graphql/types/ci/pipeline_type_spec.rb
@@ -12,11 +12,11 @@ RSpec.describe Types::Ci::PipelineType do
id iid sha before_sha status detailed_status config_source duration
coverage created_at updated_at started_at finished_at committed_at
stages user retryable cancelable jobs source_job downstream
- upstream path project active user_permissions warnings
+ upstream path project active user_permissions warnings commit_path
]
if Gitlab.ee?
- expected_fields << 'security_report_summary'
+ expected_fields += %w[security_report_summary security_report_findings]
end
expect(described_class).to have_graphql_fields(*expected_fields)
diff --git a/spec/graphql/types/global_id_type_spec.rb b/spec/graphql/types/global_id_type_spec.rb
index cb129868f7e..8eb023ad2a3 100644
--- a/spec/graphql/types/global_id_type_spec.rb
+++ b/spec/graphql/types/global_id_type_spec.rb
@@ -5,7 +5,6 @@ require 'spec_helper'
RSpec.describe Types::GlobalIDType do
let_it_be(:project) { create(:project) }
let(:gid) { project.to_global_id }
- let(:foreign_gid) { GlobalID.new(::URI::GID.build(app: 'otherapp', model_name: 'Project', model_id: project.id, params: nil)) }
it 'is has the correct name' do
expect(described_class.to_graphql.name).to eq('GlobalID')
@@ -41,16 +40,18 @@ RSpec.describe Types::GlobalIDType do
it 'rejects invalid input' do
expect { described_class.coerce_isolated_input('not valid') }
- .to raise_error(GraphQL::CoercionError)
+ .to raise_error(GraphQL::CoercionError, /not a valid Global ID/)
end
it 'rejects nil' do
expect(described_class.coerce_isolated_input(nil)).to be_nil
end
- it 'rejects gids from different apps' do
- expect { described_class.coerce_isolated_input(foreign_gid) }
- .to raise_error(GraphQL::CoercionError)
+ it 'rejects GIDs from different apps' do
+ invalid_gid = GlobalID.new(::URI::GID.build(app: 'otherapp', model_name: 'Project', model_id: project.id, params: nil))
+
+ expect { described_class.coerce_isolated_input(invalid_gid) }
+ .to raise_error(GraphQL::CoercionError, /is not a Gitlab Global ID/)
end
end
@@ -79,14 +80,22 @@ RSpec.describe Types::GlobalIDType do
let(:gid) { build_stubbed(:user).to_global_id }
it 'raises errors when coercing results' do
- expect { type.coerce_isolated_result(gid) }.to raise_error(GraphQL::CoercionError)
+ expect { type.coerce_isolated_result(gid) }
+ .to raise_error(GraphQL::CoercionError, /Expected a Project ID/)
end
it 'will not coerce invalid input, even if its a valid GID' do
expect { type.coerce_isolated_input(gid.to_s) }
- .to raise_error(GraphQL::CoercionError)
+ .to raise_error(GraphQL::CoercionError, /does not represent an instance of Project/)
end
end
+
+ it 'handles GIDs for invalid resource names gracefully' do
+ invalid_gid = GlobalID.new(::URI::GID.build(app: GlobalID.app, model_name: 'invalid', model_id: 1, params: nil))
+
+ expect { type.coerce_isolated_input(invalid_gid) }
+ .to raise_error(GraphQL::CoercionError, /does not represent an instance of Project/)
+ end
end
describe 'a parameterized type with a namespace' do
diff --git a/spec/graphql/types/group_type_spec.rb b/spec/graphql/types/group_type_spec.rb
index bba702ba3e9..ef11e3d309c 100644
--- a/spec/graphql/types/group_type_spec.rb
+++ b/spec/graphql/types/group_type_spec.rb
@@ -18,6 +18,7 @@ RSpec.describe GitlabSchema.types['Group'] do
two_factor_grace_period auto_devops_enabled emails_disabled
mentions_disabled parent boards milestones group_members
merge_requests container_repositories container_repositories_count
+ packages
]
expect(described_class).to include_graphql_fields(*expected_fields)
diff --git a/spec/graphql/types/label_type_spec.rb b/spec/graphql/types/label_type_spec.rb
index 6a999a2e925..427b5d2dcef 100644
--- a/spec/graphql/types/label_type_spec.rb
+++ b/spec/graphql/types/label_type_spec.rb
@@ -3,7 +3,16 @@ require 'spec_helper'
RSpec.describe GitlabSchema.types['Label'] do
it 'has the correct fields' do
- expected_fields = [:id, :description, :description_html, :title, :color, :text_color]
+ expected_fields = [
+ :id,
+ :description,
+ :description_html,
+ :title,
+ :color,
+ :text_color,
+ :created_at,
+ :updated_at
+ ]
expect(described_class).to have_graphql_fields(*expected_fields)
end
diff --git a/spec/graphql/types/merge_request_type_spec.rb b/spec/graphql/types/merge_request_type_spec.rb
index 63d288934e5..3314ea62324 100644
--- a/spec/graphql/types/merge_request_type_spec.rb
+++ b/spec/graphql/types/merge_request_type_spec.rb
@@ -23,7 +23,7 @@ RSpec.describe GitlabSchema.types['MergeRequest'] do
merge_error allow_collaboration should_be_rebased rebase_commit_sha
rebase_in_progress default_merge_commit_message
merge_ongoing mergeable_discussions_state web_url
- source_branch_exists target_branch_exists
+ source_branch_exists target_branch_exists diverged_from_target_branch
upvotes downvotes head_pipeline pipelines task_completion_status
milestone assignees reviewers participants subscribed labels discussion_locked time_estimate
total_time_spent reference author merged_at commit_count current_user_todos
@@ -77,4 +77,33 @@ RSpec.describe GitlabSchema.types['MergeRequest'] do
end
end
end
+
+ describe '#diverged_from_target_branch' do
+ subject(:execute_query) { GitlabSchema.execute(query, context: { current_user: current_user }).as_json }
+
+ let!(:merge_request) { create(:merge_request, target_project: project, source_project: project) }
+ let(:project) { create(:project, :public) }
+ let(:current_user) { create :admin }
+ let(:query) do
+ %(
+ {
+ project(fullPath: "#{project.full_path}") {
+ mergeRequests {
+ nodes {
+ divergedFromTargetBranch
+ }
+ }
+ }
+ }
+ )
+ end
+
+ it 'delegates the diverged_from_target_branch? call to the merge request entity' do
+ expect_next_found_instance_of(MergeRequest) do |instance|
+ expect(instance).to receive(:diverged_from_target_branch?)
+ end
+
+ execute_query
+ end
+ end
end
diff --git a/spec/graphql/types/query_type_spec.rb b/spec/graphql/types/query_type_spec.rb
index fea0a3bd37e..cb8e875dbf4 100644
--- a/spec/graphql/types/query_type_spec.rb
+++ b/spec/graphql/types/query_type_spec.rb
@@ -21,7 +21,7 @@ RSpec.describe GitlabSchema.types['Query'] do
user
users
issue
- instance_statistics_measurements
+ usage_trends_measurements
runner_platforms
]
@@ -65,11 +65,11 @@ RSpec.describe GitlabSchema.types['Query'] do
end
end
- describe 'instance_statistics_measurements field' do
- subject { described_class.fields['instanceStatisticsMeasurements'] }
+ describe 'usage_trends_measurements field' do
+ subject { described_class.fields['usageTrendsMeasurements'] }
- it 'returns instance statistics measurements' do
- is_expected.to have_graphql_type(Types::Admin::Analytics::InstanceStatistics::MeasurementType.connection_type)
+ it 'returns usage trends measurements' do
+ is_expected.to have_graphql_type(Types::Admin::Analytics::UsageTrends::MeasurementType.connection_type)
end
end
diff --git a/spec/graphql/types/snippet_type_spec.rb b/spec/graphql/types/snippet_type_spec.rb
index e73665a1b1d..4d827186a9b 100644
--- a/spec/graphql/types/snippet_type_spec.rb
+++ b/spec/graphql/types/snippet_type_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe GitlabSchema.types['Snippet'] do
+ include GraphqlHelpers
+
let_it_be(:user) { create(:user) }
it 'has the correct fields' do
@@ -25,6 +27,14 @@ RSpec.describe GitlabSchema.types['Snippet'] do
end
end
+ describe '#user_permissions' do
+ let_it_be(:snippet) { create(:personal_snippet, :repository, :public, author: user) }
+
+ it 'can resolve the snippet permissions' do
+ expect(resolve_field(:user_permissions, snippet)).to eq(snippet)
+ end
+ end
+
context 'when restricted visibility level is set to public' do
let_it_be(:snippet) { create(:personal_snippet, :repository, :public, author: user) }
diff --git a/spec/graphql/types/snippets/blob_type_spec.rb b/spec/graphql/types/snippets/blob_type_spec.rb
index bfac08f40d3..60c0db8e551 100644
--- a/spec/graphql/types/snippets/blob_type_spec.rb
+++ b/spec/graphql/types/snippets/blob_type_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe GitlabSchema.types['SnippetBlob'] do
+ include GraphqlHelpers
+
it 'has the correct fields' do
expected_fields = [:rich_data, :plain_data,
:raw_path, :size, :binary, :name, :path,
@@ -12,16 +14,37 @@ RSpec.describe GitlabSchema.types['SnippetBlob'] do
expect(described_class).to have_graphql_fields(*expected_fields)
end
- specify { expect(described_class.fields['richData'].type).not_to be_non_null }
- specify { expect(described_class.fields['plainData'].type).not_to be_non_null }
- specify { expect(described_class.fields['rawPath'].type).to be_non_null }
- specify { expect(described_class.fields['size'].type).to be_non_null }
- specify { expect(described_class.fields['binary'].type).to be_non_null }
- specify { expect(described_class.fields['name'].type).not_to be_non_null }
- specify { expect(described_class.fields['path'].type).not_to be_non_null }
- specify { expect(described_class.fields['simpleViewer'].type).to be_non_null }
- specify { expect(described_class.fields['richViewer'].type).not_to be_non_null }
- specify { expect(described_class.fields['mode'].type).not_to be_non_null }
- specify { expect(described_class.fields['externalStorage'].type).not_to be_non_null }
- specify { expect(described_class.fields['renderedAsText'].type).to be_non_null }
+ let_it_be(:nullity) do
+ {
+ 'richData' => be_nullable,
+ 'plainData' => be_nullable,
+ 'rawPath' => be_non_null,
+ 'size' => be_non_null,
+ 'binary' => be_non_null,
+ 'name' => be_nullable,
+ 'path' => be_nullable,
+ 'simpleViewer' => be_non_null,
+ 'richViewer' => be_nullable,
+ 'mode' => be_nullable,
+ 'externalStorage' => be_nullable,
+ 'renderedAsText' => be_non_null
+ }
+ end
+
+ let_it_be(:blob) { create(:snippet, :public, :repository).blobs.first }
+
+ shared_examples 'a field from the snippet blob presenter' do |field|
+ it "resolves using the presenter", :request_store do
+ presented = SnippetBlobPresenter.new(blob)
+
+ expect(resolve_field(field, blob)).to eq(presented.try(field.method_sym))
+ end
+ end
+
+ described_class.fields.each_value do |field|
+ describe field.graphql_name do
+ it_behaves_like 'a field from the snippet blob presenter', field
+ specify { expect(field.type).to match(nullity.fetch(field.graphql_name)) }
+ end
+ end
end
diff --git a/spec/graphql/types/user_callout_feature_name_enum_spec.rb b/spec/graphql/types/user_callout_feature_name_enum_spec.rb
new file mode 100644
index 00000000000..28755e1301b
--- /dev/null
+++ b/spec/graphql/types/user_callout_feature_name_enum_spec.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe GitlabSchema.types['UserCalloutFeatureNameEnum'] do
+ specify { expect(described_class.graphql_name).to eq('UserCalloutFeatureNameEnum') }
+
+ it 'exposes all the existing user callout feature names' do
+ expect(described_class.values.keys).to match_array(::UserCallout.feature_names.keys.map(&:upcase))
+ end
+end
diff --git a/spec/graphql/types/user_callout_type_spec.rb b/spec/graphql/types/user_callout_type_spec.rb
new file mode 100644
index 00000000000..b26b85a4e8b
--- /dev/null
+++ b/spec/graphql/types/user_callout_type_spec.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe GitlabSchema.types['UserCallout'] do
+ specify { expect(described_class.graphql_name).to eq('UserCallout') }
+
+ it 'has expected fields' do
+ expect(described_class).to have_graphql_fields(:feature_name, :dismissed_at)
+ end
+end
diff --git a/spec/graphql/types/user_type_spec.rb b/spec/graphql/types/user_type_spec.rb
index 5b3662383d8..d9e67ff348b 100644
--- a/spec/graphql/types/user_type_spec.rb
+++ b/spec/graphql/types/user_type_spec.rb
@@ -31,6 +31,7 @@ RSpec.describe GitlabSchema.types['User'] do
groupCount
projectMemberships
starredProjects
+ callouts
]
expect(described_class).to have_graphql_fields(*expected_fields)
@@ -44,4 +45,12 @@ RSpec.describe GitlabSchema.types['User'] do
is_expected.to have_graphql_resolver(Resolvers::Users::SnippetsResolver)
end
end
+
+ describe 'callouts field' do
+ subject { described_class.fields['callouts'] }
+
+ it 'returns user callouts' do
+ is_expected.to have_graphql_type(Types::UserCalloutType.connection_type)
+ end
+ end
end
diff --git a/spec/helpers/application_settings_helper_spec.rb b/spec/helpers/application_settings_helper_spec.rb
index 2cd01451e0d..c74ee3ce0ec 100644
--- a/spec/helpers/application_settings_helper_spec.rb
+++ b/spec/helpers/application_settings_helper_spec.rb
@@ -130,20 +130,15 @@ RSpec.describe ApplicationSettingsHelper do
before do
helper.instance_variable_set(:@application_setting, application_setting)
stub_storage_settings({ 'default': {}, 'storage_1': {}, 'storage_2': {} })
- allow(ApplicationSetting).to receive(:repository_storages_weighted_attributes).and_return(
- [:repository_storages_weighted_default,
- :repository_storages_weighted_storage_1,
- :repository_storages_weighted_storage_2])
-
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([
- { name: :repository_storages_weighted_default, label: 'default', value: 100 },
- { name: :repository_storages_weighted_storage_1, label: 'storage_1', value: 50 },
- { name: :repository_storages_weighted_storage_2, label: 'storage_2', value: 0 }
- ])
+ expect(helper.storage_weights).to eq(OpenStruct.new(
+ default: 100,
+ storage_1: 50,
+ storage_2: 0
+ ))
end
end
diff --git a/spec/helpers/auth_helper_spec.rb b/spec/helpers/auth_helper_spec.rb
index b5d70af1336..beffa4cf60e 100644
--- a/spec/helpers/auth_helper_spec.rb
+++ b/spec/helpers/auth_helper_spec.rb
@@ -99,19 +99,19 @@ RSpec.describe AuthHelper do
end
end
- describe 'experiment_enabled_button_based_providers' do
+ describe 'trial_enabled_button_based_providers' do
it 'returns the intersection set of github & google_oauth2 with enabled providers' do
allow(helper).to receive(:enabled_button_based_providers) { %w(twitter github google_oauth2) }
- expect(helper.experiment_enabled_button_based_providers).to eq(%w(github google_oauth2))
+ expect(helper.trial_enabled_button_based_providers).to eq(%w(github google_oauth2))
allow(helper).to receive(:enabled_button_based_providers) { %w(google_oauth2 bitbucket) }
- expect(helper.experiment_enabled_button_based_providers).to eq(%w(google_oauth2))
+ expect(helper.trial_enabled_button_based_providers).to eq(%w(google_oauth2))
allow(helper).to receive(:enabled_button_based_providers) { %w(bitbucket) }
- expect(helper.experiment_enabled_button_based_providers).to be_empty
+ expect(helper.trial_enabled_button_based_providers).to be_empty
end
end
diff --git a/spec/helpers/avatars_helper_spec.rb b/spec/helpers/avatars_helper_spec.rb
index 9e18ab34c1f..7fcd5ae880a 100644
--- a/spec/helpers/avatars_helper_spec.rb
+++ b/spec/helpers/avatars_helper_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe AvatarsHelper do
include UploadHelpers
- let(:user) { create(:user) }
+ let_it_be(:user) { create(:user) }
describe '#project_icon & #group_icon' do
shared_examples 'resource with a default avatar' do |source_type|
@@ -89,33 +89,60 @@ RSpec.describe AvatarsHelper do
end
end
- describe '#avatar_icon_for_email' do
+ describe '#avatar_icon_for_email', :clean_gitlab_redis_cache do
let(:user) { create(:user, avatar: File.open(uploaded_image_temp_path)) }
- context 'using an email' do
- context 'when there is a matching user' do
- it 'returns a relative URL for the avatar' do
- expect(helper.avatar_icon_for_email(user.email).to_s)
- .to eq(user.avatar.url)
+ subject { helper.avatar_icon_for_email(user.email).to_s }
+
+ shared_examples "returns avatar for email" do
+ context 'using an email' do
+ context 'when there is a matching user' do
+ it 'returns a relative URL for the avatar' do
+ expect(subject).to eq(user.avatar.url)
+ end
end
- end
- context 'when no user exists for the email' do
- it 'calls gravatar_icon' do
- expect(helper).to receive(:gravatar_icon).with('foo@example.com', 20, 2)
+ context 'when no user exists for the email' do
+ it 'calls gravatar_icon' do
+ expect(helper).to receive(:gravatar_icon).with('foo@example.com', 20, 2)
- helper.avatar_icon_for_email('foo@example.com', 20, 2)
+ helper.avatar_icon_for_email('foo@example.com', 20, 2)
+ end
end
- end
- context 'without an email passed' do
- it 'calls gravatar_icon' do
- expect(helper).to receive(:gravatar_icon).with(nil, 20, 2)
+ context 'without an email passed' do
+ it 'calls gravatar_icon' do
+ expect(helper).to receive(:gravatar_icon).with(nil, 20, 2)
+ expect(User).not_to receive(:find_by_any_email)
- helper.avatar_icon_for_email(nil, 20, 2)
+ helper.avatar_icon_for_email(nil, 20, 2)
+ end
end
end
end
+
+ context "when :avatar_cache_for_email flag is enabled" do
+ before do
+ stub_feature_flags(avatar_cache_for_email: true)
+ end
+
+ it_behaves_like "returns avatar for email"
+
+ it "caches the request" do
+ expect(User).to receive(:find_by_any_email).once.and_call_original
+
+ expect(helper.avatar_icon_for_email(user.email).to_s).to eq(user.avatar.url)
+ expect(helper.avatar_icon_for_email(user.email).to_s).to eq(user.avatar.url)
+ end
+ end
+
+ context "when :avatar_cache_for_email flag is disabled" do
+ before do
+ stub_feature_flags(avatar_cache_for_email: false)
+ end
+
+ it_behaves_like "returns avatar for email"
+ end
end
describe '#avatar_icon_for_user' do
@@ -346,7 +373,7 @@ RSpec.describe AvatarsHelper do
is_expected.to eq tag(
:img,
alt: "#{options[:user_name]}'s avatar",
- src: avatar_icon_for_email(options[:user_email], 16),
+ src: helper.avatar_icon_for_email(options[:user_email], 16),
data: { container: 'body' },
class: "avatar s16 has-tooltip",
title: options[:user_name]
@@ -379,7 +406,7 @@ RSpec.describe AvatarsHelper do
is_expected.to eq tag(
:img,
alt: "#{user_with_avatar.username}'s avatar",
- src: avatar_icon_for_email(user_with_avatar.email, 16, only_path: false),
+ src: helper.avatar_icon_for_email(user_with_avatar.email, 16, only_path: false),
data: { container: 'body' },
class: "avatar s16 has-tooltip",
title: user_with_avatar.username
diff --git a/spec/helpers/boards_helper_spec.rb b/spec/helpers/boards_helper_spec.rb
index b85ebec5545..83aad206547 100644
--- a/spec/helpers/boards_helper_spec.rb
+++ b/spec/helpers/boards_helper_spec.rb
@@ -3,52 +3,71 @@
require 'spec_helper'
RSpec.describe BoardsHelper do
+ let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project) }
+ let_it_be(:base_group) { create(:group, path: 'base') }
+ let_it_be(:project_board) { create(:board, project: project) }
+ let_it_be(:group_board) { create(:board, group: base_group) }
describe '#build_issue_link_base' do
context 'project board' do
it 'returns correct path for project board' do
- @project = project
- @board = create(:board, project: @project)
+ assign(:project, project)
+ assign(:board, project_board)
- expect(build_issue_link_base).to eq("/#{@project.namespace.path}/#{@project.path}/-/issues")
+ expect(helper.build_issue_link_base).to eq("/#{project.namespace.path}/#{project.path}/-/issues")
end
end
context 'group board' do
- let(:base_group) { create(:group, path: 'base') }
-
it 'returns correct path for base group' do
- @board = create(:board, group: base_group)
+ assign(:board, group_board)
- expect(build_issue_link_base).to eq('/base/:project_path/issues')
+ expect(helper.build_issue_link_base).to eq('/base/:project_path/issues')
end
it 'returns correct path for subgroup' do
subgroup = create(:group, parent: base_group, path: 'sub')
- @board = create(:board, group: subgroup)
+ assign(:board, create(:board, group: subgroup))
- expect(build_issue_link_base).to eq('/base/sub/:project_path/issues')
+ expect(helper.build_issue_link_base).to eq('/base/sub/:project_path/issues')
end
end
end
- describe '#board_data' do
- let_it_be(:user) { create(:user) }
- let_it_be(:board) { create(:board, project: project) }
+ describe '#board_base_url' do
+ context 'when project board' do
+ it 'generates the correct url' do
+ assign(:board, group_board)
+ assign(:group, base_group)
+
+ expect(helper.board_base_url).to eq "http://test.host/groups/#{base_group.full_path}/-/boards"
+ end
+ end
+
+ context 'when project board' do
+ it 'generates the correct url' do
+ assign(:board, project_board)
+ assign(:project, project)
+
+ expect(helper.board_base_url).to eq "/#{project.full_path}/-/boards"
+ end
+ end
+ end
+ describe '#board_data' do
context 'project_board' do
before do
assign(:project, project)
- assign(:board, board)
+ assign(:board, project_board)
allow(helper).to receive(:current_user) { user }
- allow(helper).to receive(:can?).with(user, :create_non_backlog_issues, board).and_return(true)
- allow(helper).to receive(:can?).with(user, :admin_issue, board).and_return(true)
+ 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)
end
it 'returns a board_lists_path as lists_endpoint' do
- expect(helper.board_data[:lists_endpoint]).to eq(board_lists_path(board))
+ expect(helper.board_data[:lists_endpoint]).to eq(board_lists_path(project_board))
end
it 'returns board type as parent' do
@@ -66,25 +85,22 @@ RSpec.describe BoardsHelper do
end
context 'group board' do
- let_it_be(:group) { create(:group, path: 'base') }
- let_it_be(:board) { create(:board, group: group) }
-
before do
- assign(:group, group)
- assign(:board, board)
+ assign(:group, base_group)
+ assign(:board, group_board)
allow(helper).to receive(:current_user) { user }
- allow(helper).to receive(:can?).with(user, :create_non_backlog_issues, board).and_return(true)
- allow(helper).to receive(:can?).with(user, :admin_issue, board).and_return(true)
+ 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)
end
it 'returns correct path for base group' do
- expect(helper.build_issue_link_base).to eq('/base/:project_path/issues')
+ expect(helper.build_issue_link_base).to eq("/#{base_group.full_path}/:project_path/issues")
end
it 'returns required label endpoints' do
- expect(helper.board_data[:labels_fetch_path]).to eq("/groups/base/-/labels.json?include_ancestor_groups=true&only_group_labels=true")
- expect(helper.board_data[:labels_manage_path]).to eq("/groups/base/-/labels")
+ expect(helper.board_data[:labels_fetch_path]).to eq("/groups/#{base_group.full_path}/-/labels.json?include_ancestor_groups=true&only_group_labels=true")
+ expect(helper.board_data[:labels_manage_path]).to eq("/groups/#{base_group.full_path}/-/labels")
end
end
end
@@ -93,8 +109,7 @@ RSpec.describe BoardsHelper do
let(:board_json) { helper.current_board_json }
it 'can serialise with a basic set of attributes' do
- board = create(:board, project: project)
- assign(:board, board)
+ assign(:board, project_board)
expect(board_json).to match_schema('current-board')
end
diff --git a/spec/helpers/ci/pipeline_editor_helper_spec.rb b/spec/helpers/ci/pipeline_editor_helper_spec.rb
index 8f38d3b1439..7686983eb0f 100644
--- a/spec/helpers/ci/pipeline_editor_helper_spec.rb
+++ b/spec/helpers/ci/pipeline_editor_helper_spec.rb
@@ -19,12 +19,5 @@ RSpec.describe Ci::PipelineEditorHelper do
expect(subject).to be false
end
-
- it 'user can not view editor if feature is disabled' do
- allow(helper).to receive(:can_collaborate_with_project?).and_return(true)
- stub_feature_flags(ci_pipeline_editor_page: false)
-
- expect(subject).to be false
- end
end
end
diff --git a/spec/helpers/commits_helper_spec.rb b/spec/helpers/commits_helper_spec.rb
index 2f5f4c4596b..4a841fac064 100644
--- a/spec/helpers/commits_helper_spec.rb
+++ b/spec/helpers/commits_helper_spec.rb
@@ -238,15 +238,5 @@ RSpec.describe CommitsHelper do
expect(subject).to be_a(Gitlab::Git::DiffCollection)
end
end
-
- context "feature flag is disabled" do
- let(:paginate) { true }
-
- it "returns a standard DiffCollection" do
- stub_feature_flags(paginate_commit_view: false)
-
- expect(subject).to be_a(Gitlab::Git::DiffCollection)
- end
- end
end
end
diff --git a/spec/helpers/gitlab_routing_helper_spec.rb b/spec/helpers/gitlab_routing_helper_spec.rb
index f23ffcee35d..0df04d2a8a7 100644
--- a/spec/helpers/gitlab_routing_helper_spec.rb
+++ b/spec/helpers/gitlab_routing_helper_spec.rb
@@ -332,4 +332,14 @@ RSpec.describe GitlabRoutingHelper do
end
end
end
+
+ context 'GraphQL ETag paths' do
+ context 'with pipelines' do
+ let(:pipeline) { double(id: 5) }
+
+ it 'returns an ETag path for pipelines' do
+ expect(graphql_etag_pipeline_path(pipeline)).to eq('/api/graphql:pipelines/id/5')
+ end
+ end
+ end
end
diff --git a/spec/helpers/ide_helper_spec.rb b/spec/helpers/ide_helper_spec.rb
new file mode 100644
index 00000000000..db30446fa95
--- /dev/null
+++ b/spec/helpers/ide_helper_spec.rb
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe IdeHelper do
+ describe '#ide_data' do
+ let_it_be(:project) { create(:project) }
+
+ before do
+ allow(helper).to receive(:current_user).and_return(project.creator)
+ end
+
+ context 'when instance vars are not set' do
+ it 'returns instance data in the hash as nil' do
+ expect(helper.ide_data)
+ .to include(
+ 'branch-name' => nil,
+ 'file-path' => nil,
+ 'merge-request' => nil,
+ 'forked-project' => nil,
+ 'project' => nil
+ )
+ end
+ end
+
+ context 'when instance vars are set' do
+ it 'returns instance data in the hash' do
+ self.instance_variable_set(:@branch, 'master')
+ self.instance_variable_set(:@path, 'foo/bar')
+ self.instance_variable_set(:@merge_request, '1')
+ self.instance_variable_set(:@forked_project, project)
+ self.instance_variable_set(:@project, project)
+
+ serialized_project = API::Entities::Project.represent(project).to_json
+
+ expect(helper.ide_data)
+ .to include(
+ 'branch-name' => 'master',
+ 'file-path' => 'foo/bar',
+ 'merge-request' => '1',
+ 'forked-project' => serialized_project,
+ 'project' => serialized_project
+ )
+ end
+ end
+ end
+end
diff --git a/spec/helpers/invite_members_helper_spec.rb b/spec/helpers/invite_members_helper_spec.rb
index 576021b37b3..62bd953cce8 100644
--- a/spec/helpers/invite_members_helper_spec.rb
+++ b/spec/helpers/invite_members_helper_spec.rb
@@ -11,6 +11,21 @@ RSpec.describe InviteMembersHelper do
helper.extend(Gitlab::Experimentation::ControllerConcern)
end
+ describe '#show_invite_members_track_event' do
+ it 'shows values when can directly invite members' do
+ allow(helper).to receive(:directly_invite_members?).and_return(true)
+
+ expect(helper.show_invite_members_track_event).to eq 'show_invite_members'
+ end
+
+ it 'shows values when can indirectly invite members' do
+ allow(helper).to receive(:directly_invite_members?).and_return(false)
+ allow(helper).to receive(:indirectly_invite_members?).and_return(true)
+
+ expect(helper.show_invite_members_track_event).to eq 'show_invite_members_version_b'
+ end
+ end
+
context 'with project' do
before do
assign(:project, project)
@@ -56,15 +71,7 @@ RSpec.describe InviteMembersHelper do
allow(helper).to receive(:current_user) { owner }
end
- it 'returns false' do
- allow(helper).to receive(:experiment_enabled?).with(:invite_members_version_a) { false }
-
- expect(helper.directly_invite_members?).to eq false
- end
-
it 'returns true' do
- allow(helper).to receive(:experiment_enabled?).with(:invite_members_version_a) { true }
-
expect(helper.directly_invite_members?).to eq true
end
end
@@ -75,8 +82,6 @@ RSpec.describe InviteMembersHelper do
end
it 'returns false' do
- allow(helper).to receive(:experiment_enabled?).with(:invite_members_version_a) { true }
-
expect(helper.directly_invite_members?).to eq false
end
end
diff --git a/spec/helpers/issuables_description_templates_helper_spec.rb b/spec/helpers/issuables_description_templates_helper_spec.rb
index 42643b755f8..e8961ccb535 100644
--- a/spec/helpers/issuables_description_templates_helper_spec.rb
+++ b/spec/helpers/issuables_description_templates_helper_spec.rb
@@ -13,22 +13,33 @@ RSpec.describe IssuablesDescriptionTemplatesHelper, :clean_gitlab_redis_cache do
let_it_be(:group_member) { create(:group_member, :developer, group: parent_group, user: user) }
let_it_be(:project_member) { create(:project_member, :developer, user: user, project: project) }
- it 'returns empty hash when template type does not exist' do
- expect(helper.issuable_templates(build(:project), 'non-existent-template-type')).to eq([])
+ context 'when feature flag disabled' do
+ before do
+ stub_feature_flags(inherited_issuable_templates: false)
+ end
+
+ it 'returns empty array when template type does not exist' do
+ expect(helper.issuable_templates(project, 'non-existent-template-type')).to eq([])
+ end
end
- context 'with cached issuable templates' do
+ context 'when feature flag enabled' do
before do
- allow(Gitlab::Template::IssueTemplate).to receive(:template_names).and_return({})
- allow(Gitlab::Template::MergeRequestTemplate).to receive(:template_names).and_return({})
+ stub_feature_flags(inherited_issuable_templates: true)
+ end
- helper.issuable_templates(project, 'issues')
- helper.issuable_templates(project, 'merge_request')
+ it 'returns empty hash when template type does not exist' do
+ expect(helper.issuable_templates(build(:project), 'non-existent-template-type')).to eq({})
end
+ end
+ context 'with cached issuable templates' do
it 'does not call TemplateFinder' do
- expect(Gitlab::Template::IssueTemplate).not_to receive(:template_names)
- expect(Gitlab::Template::MergeRequestTemplate).not_to receive(:template_names)
+ expect(Gitlab::Template::IssueTemplate).to receive(:template_names).once.and_call_original
+ expect(Gitlab::Template::MergeRequestTemplate).to receive(:template_names).once.and_call_original
+
+ helper.issuable_templates(project, 'issues')
+ helper.issuable_templates(project, 'merge_request')
helper.issuable_templates(project, 'issues')
helper.issuable_templates(project, 'merge_request')
end
@@ -63,29 +74,78 @@ RSpec.describe IssuablesDescriptionTemplatesHelper, :clean_gitlab_redis_cache do
end
describe '#issuable_templates_names' do
- let(:project) { double(Project, id: 21) }
-
- let(:templates) do
- [
- { name: "another_issue_template", id: "another_issue_template", project_id: project.id },
- { name: "custom_issue_template", id: "custom_issue_template", project_id: project.id }
- ]
- end
+ let_it_be(:project) { build(:project) }
- it 'returns project templates only' do
+ before do
allow(helper).to receive(:ref_project).and_return(project)
allow(helper).to receive(:issuable_templates).and_return(templates)
+ end
+
+ context 'when feature flag disabled' do
+ let(:templates) do
+ [
+ { name: "another_issue_template", id: "another_issue_template", project_id: project.id },
+ { name: "custom_issue_template", id: "custom_issue_template", project_id: project.id }
+ ]
+ end
- expect(helper.issuable_templates_names(Issue.new)).to eq(%w[another_issue_template custom_issue_template])
+ before do
+ stub_feature_flags(inherited_issuable_templates: false)
+ end
+
+ it 'returns project templates only' do
+ expect(helper.issuable_templates_names(Issue.new)).to eq(%w[another_issue_template custom_issue_template])
+ end
+ end
+
+ context 'when feature flag enabled' do
+ before do
+ stub_feature_flags(inherited_issuable_templates: true)
+ end
+
+ context 'with matching project templates' do
+ let(:templates) do
+ {
+ "" => [
+ { name: "another_issue_template", id: "another_issue_template", project_id: project.id },
+ { name: "custom_issue_template", id: "custom_issue_template", project_id: project.id }
+ ],
+ "Instance" => [
+ { name: "first_issue_issue_template", id: "first_issue_issue_template", project_id: non_existing_record_id },
+ { name: "second_instance_issue_template", id: "second_instance_issue_template", project_id: non_existing_record_id }
+ ]
+ }
+ end
+
+ it 'returns project templates only' do
+ expect(helper.issuable_templates_names(Issue.new)).to eq(%w[another_issue_template custom_issue_template])
+ end
+ end
+
+ context 'without matching project templates' do
+ let(:templates) do
+ {
+ "Project Templates" => [
+ { name: "another_issue_template", id: "another_issue_template", project_id: non_existing_record_id },
+ { name: "custom_issue_template", id: "custom_issue_template", project_id: non_existing_record_id }
+ ],
+ "Instance" => [
+ { name: "first_issue_issue_template", id: "first_issue_issue_template", project_id: non_existing_record_id },
+ { name: "second_instance_issue_template", id: "second_instance_issue_template", project_id: non_existing_record_id }
+ ]
+ }
+ end
+
+ it 'returns empty array' do
+ expect(helper.issuable_templates_names(Issue.new)).to eq([])
+ end
+ end
end
context 'when there are not templates in the project' do
let(:templates) { {} }
it 'returns empty array' do
- allow(helper).to receive(:ref_project).and_return(project)
- allow(helper).to receive(:issuable_templates).and_return(templates)
-
expect(helper.issuable_templates_names(Issue.new)).to eq([])
end
end
diff --git a/spec/helpers/learn_gitlab_helper_spec.rb b/spec/helpers/learn_gitlab_helper_spec.rb
index f789eb9d940..6cee8a9191c 100644
--- a/spec/helpers/learn_gitlab_helper_spec.rb
+++ b/spec/helpers/learn_gitlab_helper_spec.rb
@@ -41,11 +41,13 @@ RSpec.describe LearnGitlabHelper do
it 'sets correct path and completion status' do
expect(onboarding_actions_data[:git_write]).to eq({
url: project_issue_url(project, LearnGitlabHelper::ACTION_ISSUE_IDS[:git_write]),
- completed: true
+ completed: true,
+ svg: helper.image_path("learn_gitlab/git_write.svg")
})
expect(onboarding_actions_data[:pipeline_created]).to eq({
url: project_issue_url(project, LearnGitlabHelper::ACTION_ISSUE_IDS[:pipeline_created]),
- completed: false
+ completed: false,
+ svg: helper.image_path("learn_gitlab/pipeline_created.svg")
})
end
end
diff --git a/spec/helpers/merge_requests_helper_spec.rb b/spec/helpers/merge_requests_helper_spec.rb
index fce4d560b2f..3cf855229bb 100644
--- a/spec/helpers/merge_requests_helper_spec.rb
+++ b/spec/helpers/merge_requests_helper_spec.rb
@@ -90,4 +90,57 @@ RSpec.describe MergeRequestsHelper do
)
end
end
+
+ describe '#reviewers_label' do
+ let(:merge_request) { build_stubbed(:merge_request) }
+ let(:reviewer1) { build_stubbed(:user, name: 'Jane Doe') }
+ let(:reviewer2) { build_stubbed(:user, name: 'John Doe') }
+
+ before do
+ allow(merge_request).to receive(:reviewers).and_return(reviewers)
+ end
+
+ context 'when multiple reviewers exist' do
+ let(:reviewers) { [reviewer1, reviewer2] }
+
+ it 'returns reviewer label with reviewer names' do
+ expect(helper.reviewers_label(merge_request)).to eq("Reviewers: Jane Doe and John Doe")
+ end
+
+ it 'returns reviewer label only with include_value: false' do
+ expect(helper.reviewers_label(merge_request, include_value: false)).to eq("Reviewers")
+ end
+
+ context 'when the name contains a URL' do
+ let(:reviewers) { [build_stubbed(:user, name: 'www.gitlab.com')] }
+
+ it 'returns sanitized name' do
+ expect(helper.reviewers_label(merge_request)).to eq("Reviewer: www_gitlab_com")
+ end
+ end
+ end
+
+ context 'when one reviewer exists' do
+ let(:reviewers) { [reviewer1] }
+
+ it 'returns reviewer label with no names' do
+ expect(helper.reviewers_label(merge_request)).to eq("Reviewer: Jane Doe")
+ end
+
+ it 'returns reviewer label only with include_value: false' do
+ expect(helper.reviewers_label(merge_request, include_value: false)).to eq("Reviewer")
+ end
+ end
+
+ context 'when no reviewers exist' do
+ let(:reviewers) { [] }
+
+ it 'returns reviewer label with no names' do
+ expect(helper.reviewers_label(merge_request)).to eq("Reviewers: ")
+ end
+ it 'returns reviewer label only with include_value: false' do
+ expect(helper.reviewers_label(merge_request, include_value: false)).to eq("Reviewers")
+ end
+ end
+ end
end
diff --git a/spec/helpers/namespaces_helper_spec.rb b/spec/helpers/namespaces_helper_spec.rb
index 1636ba6ef42..b436f4ab0c9 100644
--- a/spec/helpers/namespaces_helper_spec.rb
+++ b/spec/helpers/namespaces_helper_spec.rb
@@ -46,13 +46,26 @@ RSpec.describe NamespacesHelper do
end
describe '#namespaces_options' do
- it 'returns groups without being a member for admin' do
- allow(helper).to receive(:current_user).and_return(admin)
+ context 'when admin mode is enabled', :enable_admin_mode do
+ it 'returns groups without being a member for admin' do
+ allow(helper).to receive(:current_user).and_return(admin)
- options = helper.namespaces_options(user_group.id, display_path: true, extra_group: user_group.id)
+ options = helper.namespaces_options(user_group.id, display_path: true, extra_group: user_group.id)
- expect(options).to include(admin_group.name)
- expect(options).to include(user_group.name)
+ expect(options).to include(admin_group.name)
+ expect(options).to include(user_group.name)
+ end
+ end
+
+ context 'when admin mode is disabled' do
+ it 'returns only allowed namespaces for admin' do
+ allow(helper).to receive(:current_user).and_return(admin)
+
+ options = helper.namespaces_options(user_group.id, display_path: true, extra_group: user_group.id)
+
+ expect(options).to include(admin_group.name)
+ expect(options).not_to include(user_group.name)
+ end
end
it 'returns only allowed namespaces for user' do
@@ -74,13 +87,16 @@ RSpec.describe NamespacesHelper do
expect(options).to include(admin_group.name)
end
- it 'selects existing group' do
- allow(helper).to receive(:current_user).and_return(admin)
+ context 'when admin mode is disabled' do
+ it 'selects existing group' do
+ allow(helper).to receive(:current_user).and_return(admin)
+ user_group.add_owner(admin)
- options = helper.namespaces_options(:extra_group, display_path: true, extra_group: user_group)
+ options = helper.namespaces_options(:extra_group, display_path: true, extra_group: user_group)
- expect(options).to include("selected=\"selected\" value=\"#{user_group.id}\"")
- expect(options).to include(admin_group.name)
+ expect(options).to include("selected=\"selected\" value=\"#{user_group.id}\"")
+ expect(options).to include(admin_group.name)
+ end
end
it 'selects the new group by default' do
diff --git a/spec/helpers/notifications_helper_spec.rb b/spec/helpers/notifications_helper_spec.rb
index 555cffba614..a5338659659 100644
--- a/spec/helpers/notifications_helper_spec.rb
+++ b/spec/helpers/notifications_helper_spec.rb
@@ -19,22 +19,6 @@ RSpec.describe NotificationsHelper do
it { expect(notification_title(:global)).to match('Global') }
end
- describe '#notification_event_name' do
- context 'for success_pipeline' do
- it 'returns the custom name' do
- expect(FastGettext).to receive(:cached_find).with('NotificationEvent|Successful pipeline')
- expect(notification_event_name(:success_pipeline)).to eq('Successful pipeline')
- end
- end
-
- context 'for everything else' do
- it 'returns a humanized name' do
- expect(FastGettext).to receive(:cached_find).with('NotificationEvent|Failed pipeline')
- expect(notification_event_name(:failed_pipeline)).to eq('Failed pipeline')
- end
- end
- end
-
describe '#notification_icon_level' do
let(:user) { create(:user) }
let(:global_setting) { user.global_notification_setting }
diff --git a/spec/helpers/preferences_helper_spec.rb b/spec/helpers/preferences_helper_spec.rb
index be0ad5e1a3f..e5420fb6729 100644
--- a/spec/helpers/preferences_helper_spec.rb
+++ b/spec/helpers/preferences_helper_spec.rb
@@ -29,6 +29,7 @@ RSpec.describe PreferencesHelper do
['Starred Projects', 'stars'],
["Your Projects' Activity", 'project_activity'],
["Starred Projects' Activity", 'starred_project_activity'],
+ ["Followed Users' Activity", 'followed_user_activity'],
["Your Groups", 'groups'],
["Your To-Do List", 'todos'],
["Assigned Issues", 'issues'],
diff --git a/spec/helpers/projects/project_members_helper_spec.rb b/spec/helpers/projects/project_members_helper_spec.rb
index 5e0b4df7f7f..1a55840a58a 100644
--- a/spec/helpers/projects/project_members_helper_spec.rb
+++ b/spec/helpers/projects/project_members_helper_spec.rb
@@ -166,7 +166,7 @@ RSpec.describe Projects::ProjectMembersHelper do
members: helper.project_members_data_json(project, present_members(project_members)),
member_path: '/foo-bar/-/project_members/:id',
source_id: project.id,
- can_manage_members: true
+ can_manage_members: 'true'
})
end
end
@@ -193,7 +193,7 @@ RSpec.describe Projects::ProjectMembersHelper do
members: helper.project_group_links_data_json(project_group_links),
member_path: '/foo-bar/-/group_links/:id',
source_id: project.id,
- can_manage_members: true
+ can_manage_members: 'true'
})
end
end
diff --git a/spec/helpers/projects/security/configuration_helper_spec.rb b/spec/helpers/projects/security/configuration_helper_spec.rb
new file mode 100644
index 00000000000..c5049bd87f0
--- /dev/null
+++ b/spec/helpers/projects/security/configuration_helper_spec.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::Security::ConfigurationHelper do
+ let(:current_user) { create(:user) }
+
+ describe 'security_upgrade_path' do
+ subject { security_upgrade_path }
+
+ it { is_expected.to eq('https://about.gitlab.com/pricing/') }
+ end
+end
diff --git a/spec/helpers/search_helper_spec.rb b/spec/helpers/search_helper_spec.rb
index a977f2c88c6..2b79fd6a5ef 100644
--- a/spec/helpers/search_helper_spec.rb
+++ b/spec/helpers/search_helper_spec.rb
@@ -580,7 +580,7 @@ RSpec.describe SearchHelper do
describe '#issuable_state_to_badge_class' do
context 'with merge request' do
it 'returns correct badge based on status' do
- expect(issuable_state_to_badge_class(build(:merge_request, :merged))).to eq(:primary)
+ expect(issuable_state_to_badge_class(build(:merge_request, :merged))).to eq(:info)
expect(issuable_state_to_badge_class(build(:merge_request, :closed))).to eq(:danger)
expect(issuable_state_to_badge_class(build(:merge_request, :opened))).to eq(:success)
end
diff --git a/spec/helpers/services_helper_spec.rb b/spec/helpers/services_helper_spec.rb
index 534f33d9b5a..1726a8362a7 100644
--- a/spec/helpers/services_helper_spec.rb
+++ b/spec/helpers/services_helper_spec.rb
@@ -4,27 +4,35 @@ require 'spec_helper'
RSpec.describe ServicesHelper do
describe '#integration_form_data' do
+ let(:fields) do
+ [
+ :id,
+ :show_active,
+ :activated,
+ :type,
+ :merge_request_events,
+ :commit_events,
+ :enable_comments,
+ :comment_detail,
+ :learn_more_path,
+ :trigger_events,
+ :fields,
+ :inherit_from_id,
+ :integration_level,
+ :editable,
+ :cancel_path,
+ :can_test,
+ :test_path,
+ :reset_path
+ ]
+ end
+
subject { helper.integration_form_data(integration) }
- context 'Jira service' do
- let(:integration) { build(:jira_service) }
-
- it 'includes Jira specific fields' do
- is_expected.to include(
- :id,
- :show_active,
- :activated,
- :type,
- :merge_request_events,
- :commit_events,
- :enable_comments,
- :comment_detail,
- :trigger_events,
- :fields,
- :inherit_from_id,
- :integration_level
- )
- end
+ context 'Slack service' do
+ let(:integration) { build(:slack_service) }
+
+ it { is_expected.to include(*fields) }
specify do
expect(subject[:reset_path]).to eq(helper.scoped_reset_integration_path(integration))
diff --git a/spec/helpers/stat_anchors_helper_spec.rb b/spec/helpers/stat_anchors_helper_spec.rb
index 0615baac3cb..f3830bf4172 100644
--- a/spec/helpers/stat_anchors_helper_spec.rb
+++ b/spec/helpers/stat_anchors_helper_spec.rb
@@ -18,7 +18,7 @@ RSpec.describe StatAnchorsHelper do
context 'when anchor is not a link' do
context 'when class_modifier is set' do
- let(:anchor) { anchor_klass.new(false, nil, nil, 'default') }
+ let(:anchor) { anchor_klass.new(false, nil, nil, 'btn-default') }
it 'returns the proper attributes' do
expect(subject[:class]).to include('gl-button btn btn-default')
@@ -49,5 +49,21 @@ RSpec.describe StatAnchorsHelper do
expect(subject[:itemprop]).to eq true
end
end
+
+ context 'when data is not set' do
+ let(:anchor) { anchor_klass.new(false, nil, nil, nil, nil, nil, nil) }
+
+ it 'returns the data attributes' do
+ expect(subject[:data]).to be_nil
+ end
+ end
+
+ context 'when itemprop is set' do
+ let(:anchor) { anchor_klass.new(false, nil, nil, nil, nil, nil, { 'toggle' => 'modal' }) }
+
+ it 'returns the data attributes' do
+ expect(subject[:data]).to eq({ 'toggle' => 'modal' })
+ end
+ end
end
end
diff --git a/spec/helpers/timeboxes_helper_spec.rb b/spec/helpers/timeboxes_helper_spec.rb
index 94e997f7a65..9cbed7668ac 100644
--- a/spec/helpers/timeboxes_helper_spec.rb
+++ b/spec/helpers/timeboxes_helper_spec.rb
@@ -58,15 +58,6 @@ RSpec.describe TimeboxesHelper do
it { expect(result_for(start_date: yesterday)).to eq("started on #{yesterday_formatted}") }
it { expect(result_for(start_date: yesterday, due_date: tomorrow)).to eq("#{yesterday_formatted}–#{tomorrow_formatted}") }
end
-
- context 'iteration' do
- # Iterations always have start and due dates, so only A-B format is expected
- it 'formats properly' do
- iteration = build(:iteration, start_date: yesterday, due_date: tomorrow)
-
- expect(timebox_date_range(iteration)).to eq("#{yesterday_formatted}–#{tomorrow_formatted}")
- end
- end
end
describe '#milestone_counts' do
diff --git a/spec/helpers/visibility_level_helper_spec.rb b/spec/helpers/visibility_level_helper_spec.rb
index 10e0815918f..2aac0cae0c6 100644
--- a/spec/helpers/visibility_level_helper_spec.rb
+++ b/spec/helpers/visibility_level_helper_spec.rb
@@ -33,6 +33,22 @@ RSpec.describe VisibilityLevelHelper do
end
end
+ describe 'visibility_level_label' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:level_value, :level_name) do
+ Gitlab::VisibilityLevel::PRIVATE | 'Private'
+ Gitlab::VisibilityLevel::INTERNAL | 'Internal'
+ Gitlab::VisibilityLevel::PUBLIC | 'Public'
+ end
+
+ with_them do
+ it 'returns the name of the visibility level' do
+ expect(visibility_level_label(level_value)).to eq(level_name)
+ end
+ end
+ end
+
describe 'visibility_level_description' do
context 'used with a Project' do
let(:descriptions) do
diff --git a/spec/initializers/rack_multipart_patch_spec.rb b/spec/initializers/rack_multipart_patch_spec.rb
new file mode 100644
index 00000000000..862fdc7901b
--- /dev/null
+++ b/spec/initializers/rack_multipart_patch_spec.rb
@@ -0,0 +1,79 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Rack::Multipart do # rubocop:disable RSpec/FilePath
+ def multipart_fixture(name, length, boundary = "AaB03x")
+ data = <<EOF
+--#{boundary}\r
+content-disposition: form-data; name="reply"\r
+\r
+yes\r
+--#{boundary}\r
+content-disposition: form-data; name="fileupload"; filename="dj.jpg"\r
+Content-Type: image/jpeg\r
+Content-Transfer-Encoding: base64\r
+\r
+/9j/4AAQSkZJRgABAQAAAQABAAD//gA+Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcg\r
+--#{boundary}--\r
+EOF
+
+ type = %(multipart/form-data; boundary=#{boundary})
+
+ length ||= data.bytesize
+
+ {
+ "CONTENT_TYPE" => type,
+ "CONTENT_LENGTH" => length.to_s,
+ input: StringIO.new(data)
+ }
+ end
+
+ context 'with Content-Length under the limit' do
+ it 'extracts multipart message' do
+ env = Rack::MockRequest.env_for("/", multipart_fixture(:text, nil))
+
+ expect(described_class).to receive(:log_large_multipart?).and_call_original
+ expect(described_class).not_to receive(:log_multipart_warning)
+ params = described_class.parse_multipart(env)
+
+ expect(params.keys).to include(*%w(reply fileupload))
+ end
+ end
+
+ context 'with Content-Length over the limit' do
+ shared_examples 'logs multipart message' do
+ it 'extracts multipart message' do
+ env = Rack::MockRequest.env_for("/", multipart_fixture(:text, length))
+
+ expect(described_class).to receive(:log_large_multipart?).and_return(true)
+ expect(described_class).to receive(:log_multipart_warning).and_call_original
+ expect(described_class).to receive(:log_warn).with({
+ message: 'Large multipart body detected',
+ path: '/',
+ content_length: anything,
+ correlation_id: anything
+ })
+ params = described_class.parse_multipart(env)
+
+ expect(params.keys).to include(*%w(reply fileupload))
+ end
+ end
+
+ context 'from environment' do
+ let(:length) { 1001 }
+
+ before do
+ stub_env('RACK_MULTIPART_LOGGING_BYTES', 1000)
+ end
+
+ it_behaves_like 'logs multipart message'
+ end
+
+ context 'default limit' do
+ let(:length) { 100_000_001 }
+
+ it_behaves_like 'logs multipart message'
+ end
+ end
+end
diff --git a/spec/lib/api/entities/plan_limit_spec.rb b/spec/lib/api/entities/plan_limit_spec.rb
new file mode 100644
index 00000000000..ee42c67f9b6
--- /dev/null
+++ b/spec/lib/api/entities/plan_limit_spec.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe API::Entities::PlanLimit do
+ let(:plan_limits) { create(:plan_limits) }
+
+ subject { described_class.new(plan_limits).as_json }
+
+ it 'exposes correct attributes' do
+ expect(subject).to include(
+ :conan_max_file_size,
+ :generic_packages_max_file_size,
+ :maven_max_file_size,
+ :npm_max_file_size,
+ :nuget_max_file_size,
+ :pypi_max_file_size
+ )
+ end
+
+ it 'does not expose id and plan_id' do
+ expect(subject).not_to include(:id, :plan_id)
+ end
+end
diff --git a/spec/lib/api/entities/project_repository_storage_move_spec.rb b/spec/lib/api/entities/project_repository_storage_move_spec.rb
deleted file mode 100644
index b0102dc376a..00000000000
--- a/spec/lib/api/entities/project_repository_storage_move_spec.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe API::Entities::ProjectRepositoryStorageMove do
- describe '#as_json' do
- subject { entity.as_json }
-
- let(:storage_move) { build(:project_repository_storage_move, :scheduled, destination_storage_name: 'test_second_storage') }
- let(:entity) { described_class.new(storage_move) }
-
- it 'includes basic fields' do
- is_expected.to include(
- state: 'scheduled',
- source_storage_name: 'default',
- destination_storage_name: 'test_second_storage',
- project: a_kind_of(Hash)
- )
- end
- end
-end
diff --git a/spec/lib/api/entities/projects/repository_storage_move_spec.rb b/spec/lib/api/entities/projects/repository_storage_move_spec.rb
new file mode 100644
index 00000000000..81f5d98b713
--- /dev/null
+++ b/spec/lib/api/entities/projects/repository_storage_move_spec.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe API::Entities::Projects::RepositoryStorageMove do
+ describe '#as_json' do
+ subject { entity.as_json }
+
+ let(:storage_move) { build(:project_repository_storage_move, :scheduled, destination_storage_name: 'test_second_storage') }
+ let(:entity) { described_class.new(storage_move) }
+
+ it 'includes basic fields' do
+ is_expected.to include(
+ state: 'scheduled',
+ source_storage_name: 'default',
+ destination_storage_name: 'test_second_storage',
+ project: a_kind_of(Hash)
+ )
+ end
+ end
+end
diff --git a/spec/lib/api/entities/public_group_details_spec.rb b/spec/lib/api/entities/public_group_details_spec.rb
new file mode 100644
index 00000000000..34162ed00ca
--- /dev/null
+++ b/spec/lib/api/entities/public_group_details_spec.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe API::Entities::PublicGroupDetails do
+ subject(:entity) { described_class.new(group) }
+
+ let(:group) { create(:group, :with_avatar) }
+
+ describe '#as_json' do
+ subject { entity.as_json }
+
+ it 'includes public group fields' do
+ is_expected.to eq(
+ id: group.id,
+ name: group.name,
+ web_url: group.web_url,
+ avatar_url: group.avatar_url(only_path: false),
+ full_name: group.full_name,
+ full_path: group.full_path
+ )
+ end
+ end
+end
diff --git a/spec/lib/api/entities/snippet_repository_storage_move_spec.rb b/spec/lib/api/entities/snippet_repository_storage_move_spec.rb
deleted file mode 100644
index 8086be3ffa7..00000000000
--- a/spec/lib/api/entities/snippet_repository_storage_move_spec.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe API::Entities::SnippetRepositoryStorageMove do
- describe '#as_json' do
- subject { entity.as_json }
-
- let(:default_storage) { 'default' }
- let(:second_storage) { 'test_second_storage' }
- let(:storage_move) { create(:snippet_repository_storage_move, :scheduled, destination_storage_name: second_storage) }
- let(:entity) { described_class.new(storage_move) }
-
- it 'includes basic fields' do
- allow(Gitlab.config.repositories.storages).to receive(:keys).and_return(%W[#{default_storage} #{second_storage}])
-
- is_expected.to include(
- state: 'scheduled',
- source_storage_name: default_storage,
- destination_storage_name: second_storage,
- snippet: a_kind_of(Hash)
- )
- end
- end
-end
diff --git a/spec/lib/api/entities/snippets/repository_storage_move_spec.rb b/spec/lib/api/entities/snippets/repository_storage_move_spec.rb
new file mode 100644
index 00000000000..a848afbcff9
--- /dev/null
+++ b/spec/lib/api/entities/snippets/repository_storage_move_spec.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe API::Entities::Snippets::RepositoryStorageMove do
+ describe '#as_json' do
+ subject { entity.as_json }
+
+ let(:default_storage) { 'default' }
+ let(:second_storage) { 'test_second_storage' }
+ let(:storage_move) { create(:snippet_repository_storage_move, :scheduled, destination_storage_name: second_storage) }
+ let(:entity) { described_class.new(storage_move) }
+
+ it 'includes basic fields' do
+ allow(Gitlab.config.repositories.storages).to receive(:keys).and_return(%W[#{default_storage} #{second_storage}])
+
+ is_expected.to include(
+ state: 'scheduled',
+ source_storage_name: default_storage,
+ destination_storage_name: second_storage,
+ snippet: a_kind_of(Hash)
+ )
+ end
+ end
+end
diff --git a/spec/lib/backup/repositories_spec.rb b/spec/lib/backup/repositories_spec.rb
index 492058c6a00..7a8cc713e4f 100644
--- a/spec/lib/backup/repositories_spec.rb
+++ b/spec/lib/backup/repositories_spec.rb
@@ -230,6 +230,16 @@ RSpec.describe Backup::Repositories do
expect(pool_repository).not_to be_failed
expect(pool_repository.object_pool.exists?).to be(true)
end
+
+ it 'skips pools with no source project, :sidekiq_might_not_need_inline' do
+ pool_repository = create(:pool_repository, state: :obsolete)
+ pool_repository.update_column(:source_project_id, nil)
+
+ subject.restore
+
+ pool_repository.reload
+ expect(pool_repository).to be_obsolete
+ end
end
it 'cleans existing repositories' do
diff --git a/spec/lib/banzai/filter/custom_emoji_filter_spec.rb b/spec/lib/banzai/filter/custom_emoji_filter_spec.rb
index ca8c9750e7f..5e76e8164dd 100644
--- a/spec/lib/banzai/filter/custom_emoji_filter_spec.rb
+++ b/spec/lib/banzai/filter/custom_emoji_filter_spec.rb
@@ -10,6 +10,10 @@ RSpec.describe Banzai::Filter::CustomEmojiFilter do
let_it_be(:custom_emoji) { create(:custom_emoji, name: 'tanuki', group: group) }
let_it_be(:custom_emoji2) { create(:custom_emoji, name: 'happy_tanuki', group: group, file: 'https://foo.bar/happy.png') }
+ it_behaves_like 'emoji filter' do
+ let(:emoji_name) { ':tanuki:' }
+ end
+
it 'replaces supported name custom emoji' do
doc = filter('<p>:tanuki:</p>', project: project)
@@ -17,25 +21,12 @@ RSpec.describe Banzai::Filter::CustomEmojiFilter do
expect(doc.css('gl-emoji img').size).to eq 1
end
- it 'ignores non existent custom emoji' do
- exp = act = '<p>:foo:</p>'
- doc = filter(act)
-
- expect(doc.to_html).to match Regexp.escape(exp)
- 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)
end
- it 'matches with adjacent text' do
- doc = filter('tanuki (:tanuki:)')
-
- expect(doc.css('img').size).to eq 1
- end
-
it 'matches multiple same custom emoji' do
doc = filter(':tanuki: :tanuki:')
@@ -54,18 +45,6 @@ RSpec.describe Banzai::Filter::CustomEmojiFilter do
expect(doc.css('img').size).to be 0
end
- it 'keeps whitespace intact' do
- doc = filter('This deserves a :tanuki:, big time.')
-
- expect(doc.to_html).to match(/^This deserves a <gl-emoji.+>, big time\.\z/)
- end
-
- it 'does not match emoji in a string' do
- doc = filter("'2a00:tanuki:100::1'")
-
- expect(doc.css('gl-emoji').size).to eq 0
- end
-
it 'does not do N+1 query' do
create(:custom_emoji, name: 'party-parrot', group: group)
diff --git a/spec/lib/banzai/filter/emoji_filter_spec.rb b/spec/lib/banzai/filter/emoji_filter_spec.rb
index 9005b4401b7..cb0b470eaa1 100644
--- a/spec/lib/banzai/filter/emoji_filter_spec.rb
+++ b/spec/lib/banzai/filter/emoji_filter_spec.rb
@@ -5,6 +5,10 @@ require 'spec_helper'
RSpec.describe Banzai::Filter::EmojiFilter do
include FilterSpecHelper
+ it_behaves_like 'emoji filter' do
+ let(:emoji_name) { ':+1:' }
+ end
+
it 'replaces supported name emoji' do
doc = filter('<p>:heart:</p>')
expect(doc.css('gl-emoji').first.text).to eq 'â¤'
@@ -15,12 +19,6 @@ RSpec.describe Banzai::Filter::EmojiFilter do
expect(doc.css('gl-emoji').first.text).to eq 'â¤'
end
- it 'ignores unsupported emoji' do
- exp = act = '<p>:foo:</p>'
- doc = filter(act)
- expect(doc.to_html).to match Regexp.escape(exp)
- end
-
it 'ignores unicode versions of trademark, copyright, and registered trademark' do
exp = act = '<p>™ © ®</p>'
doc = filter(act)
@@ -65,11 +63,6 @@ RSpec.describe Banzai::Filter::EmojiFilter do
expect(doc.css('gl-emoji').size).to eq 1
end
- it 'matches with adjacent text' do
- doc = filter('+1 (:+1:)')
- expect(doc.css('gl-emoji').size).to eq 1
- end
-
it 'unicode matches with adjacent text' do
doc = filter('+1 (ðŸ‘)')
expect(doc.css('gl-emoji').size).to eq 1
@@ -90,12 +83,6 @@ RSpec.describe Banzai::Filter::EmojiFilter do
expect(doc.css('gl-emoji').size).to eq 6
end
- it 'does not match emoji in a string' do
- doc = filter("'2a00:a4c0:100::1'")
-
- expect(doc.css('gl-emoji').size).to eq 0
- end
-
it 'has a data-name attribute' do
doc = filter(':-1:')
expect(doc.css('gl-emoji').first.attr('data-name')).to eq 'thumbsdown'
@@ -106,12 +93,6 @@ RSpec.describe Banzai::Filter::EmojiFilter do
expect(doc.css('gl-emoji').first.attr('data-unicode-version')).to eq '6.0'
end
- it 'keeps whitespace intact' do
- doc = filter('This deserves a :+1:, big time.')
-
- expect(doc.to_html).to match(/^This deserves a <gl-emoji.+>, big time\.\z/)
- end
-
it 'unicode keeps whitespace intact' do
doc = filter('This deserves a 🎱, big time.')
diff --git a/spec/lib/banzai/filter/sanitization_filter_spec.rb b/spec/lib/banzai/filter/sanitization_filter_spec.rb
index bc4b60dfe60..f880fe06ce3 100644
--- a/spec/lib/banzai/filter/sanitization_filter_spec.rb
+++ b/spec/lib/banzai/filter/sanitization_filter_spec.rb
@@ -33,14 +33,14 @@ RSpec.describe Banzai::Filter::SanitizationFilter do
end
it 'sanitizes `class` attribute from all elements' do
- act = %q{<pre class="code highlight white c"><code>&lt;span class="k"&gt;def&lt;/span&gt;</code></pre>}
- exp = %q{<pre><code>&lt;span class="k"&gt;def&lt;/span&gt;</code></pre>}
+ act = %q(<pre class="code highlight white c"><code>&lt;span class="k"&gt;def&lt;/span&gt;</code></pre>)
+ exp = %q(<pre><code>&lt;span class="k"&gt;def&lt;/span&gt;</code></pre>)
expect(filter(act).to_html).to eq exp
end
it 'sanitizes `class` attribute from non-highlight spans' do
- act = %q{<span class="k">def</span>}
- expect(filter(act).to_html).to eq %q{<span>def</span>}
+ act = %q(<span class="k">def</span>)
+ expect(filter(act).to_html).to eq %q(<span>def</span>)
end
it 'allows `text-align` property in `style` attribute on table elements' do
@@ -82,12 +82,12 @@ RSpec.describe Banzai::Filter::SanitizationFilter do
end
it 'allows `span` elements' do
- exp = act = %q{<span>Hello</span>}
+ exp = act = %q(<span>Hello</span>)
expect(filter(act).to_html).to eq exp
end
it 'allows `abbr` elements' do
- exp = act = %q{<abbr title="HyperText Markup Language">HTML</abbr>}
+ exp = act = %q(<abbr title="HyperText Markup Language">HTML</abbr>)
expect(filter(act).to_html).to eq exp
end
@@ -132,7 +132,7 @@ RSpec.describe Banzai::Filter::SanitizationFilter do
end
it 'allows the `data-sourcepos` attribute globally' do
- exp = %q{<p data-sourcepos="1:1-1:10">foo/bar.md</p>}
+ exp = %q(<p data-sourcepos="1:1-1:10">foo/bar.md</p>)
act = filter(exp)
expect(act.to_html).to eq exp
@@ -140,41 +140,41 @@ RSpec.describe Banzai::Filter::SanitizationFilter do
describe 'footnotes' do
it 'allows correct footnote id property on links' do
- exp = %q{<a href="#fn1" id="fnref1">foo/bar.md</a>}
+ exp = %q(<a href="#fn1" id="fnref1">foo/bar.md</a>)
act = filter(exp)
expect(act.to_html).to eq exp
end
it 'allows correct footnote id property on li element' do
- exp = %q{<ol><li id="fn1">footnote</li></ol>}
+ exp = %q(<ol><li id="fn1">footnote</li></ol>)
act = filter(exp)
expect(act.to_html).to eq exp
end
it 'removes invalid id for footnote links' do
- exp = %q{<a href="#fn1">link</a>}
+ exp = %q(<a href="#fn1">link</a>)
%w[fnrefx test xfnref1].each do |id|
- act = filter(%Q{<a href="#fn1" id="#{id}">link</a>})
+ act = filter(%(<a href="#fn1" id="#{id}">link</a>))
expect(act.to_html).to eq exp
end
end
it 'removes invalid id for footnote li' do
- exp = %q{<ol><li>footnote</li></ol>}
+ exp = %q(<ol><li>footnote</li></ol>)
%w[fnx test xfn1].each do |id|
- act = filter(%Q{<ol><li id="#{id}">footnote</li></ol>})
+ act = filter(%(<ol><li id="#{id}">footnote</li></ol>))
expect(act.to_html).to eq exp
end
end
it 'allows footnotes numbered higher than 9' do
- exp = %q{<a href="#fn15" id="fnref15">link</a><ol><li id="fn15">footnote</li></ol>}
+ exp = %q(<a href="#fn15" id="fnref15">link</a><ol><li id="fn15">footnote</li></ol>)
act = filter(exp)
expect(act.to_html).to eq exp
diff --git a/spec/lib/banzai/filter/video_link_filter_spec.rb b/spec/lib/banzai/filter/video_link_filter_spec.rb
index 32fbc6b687f..ec954aa9163 100644
--- a/spec/lib/banzai/filter/video_link_filter_spec.rb
+++ b/spec/lib/banzai/filter/video_link_filter_spec.rb
@@ -33,6 +33,7 @@ RSpec.describe Banzai::Filter::VideoLinkFilter do
expect(video.name).to eq 'video'
expect(video['src']).to eq src
expect(video['width']).to eq "400"
+ expect(video['preload']).to eq 'metadata'
expect(paragraph.name).to eq 'p'
diff --git a/spec/lib/banzai/pipeline/full_pipeline_spec.rb b/spec/lib/banzai/pipeline/full_pipeline_spec.rb
index bcee6f8f65d..989e06a992d 100644
--- a/spec/lib/banzai/pipeline/full_pipeline_spec.rb
+++ b/spec/lib/banzai/pipeline/full_pipeline_spec.rb
@@ -142,5 +142,12 @@ RSpec.describe Banzai::Pipeline::FullPipeline do
expect(output).to include("<span>#</span>#{issue.iid}")
end
+
+ it 'converts user reference with escaped underscore because of italics' do
+ markdown = '_@test\__'
+ output = described_class.to_html(markdown, project: project)
+
+ expect(output).to include('<em>@test_</em>')
+ end
end
end
diff --git a/spec/lib/banzai/pipeline/plain_markdown_pipeline_spec.rb b/spec/lib/banzai/pipeline/plain_markdown_pipeline_spec.rb
index 241d6db4f11..5f31ad0c8f6 100644
--- a/spec/lib/banzai/pipeline/plain_markdown_pipeline_spec.rb
+++ b/spec/lib/banzai/pipeline/plain_markdown_pipeline_spec.rb
@@ -31,11 +31,13 @@ RSpec.describe Banzai::Pipeline::PlainMarkdownPipeline do
end
end
- # Test strings taken from https://spec.commonmark.org/0.29/#backslash-escapes
describe 'CommonMark tests', :aggregate_failures do
- it 'converts all ASCII punctuation to literals' do
- markdown = %q(\!\"\#\$\%\&\'\*\+\,\-\.\/\:\;\<\=\>\?\@\[\]\^\_\`\{\|\}\~) + %q[\(\)\\\\]
- punctuation = %w(! " # $ % &amp; ' * + , - . / : ; &lt; = &gt; ? @ [ \\ ] ^ _ ` { | } ~) + %w[( )]
+ it 'converts all reference punctuation to literals' do
+ reference_chars = Banzai::Filter::MarkdownPreEscapeFilter::REFERENCE_CHARACTERS
+ markdown = reference_chars.split('').map {|char| char.prepend("\\") }.join
+ punctuation = Banzai::Filter::MarkdownPreEscapeFilter::REFERENCE_CHARACTERS.split('')
+ punctuation = punctuation.delete_if {|char| char == '&' }
+ punctuation << '&amp;'
result = described_class.call(markdown, project: project)
output = result[:output].to_html
@@ -44,57 +46,45 @@ RSpec.describe Banzai::Pipeline::PlainMarkdownPipeline do
expect(result[:escaped_literals]).to be_truthy
end
- it 'does not convert other characters to literals' do
- markdown = %q(\→\A\a\ \3\φ\«)
- expected = '\→\A\a\ \3\φ\«'
-
- result = correct_html_included(markdown, expected)
- expect(result[:escaped_literals]).to be_falsey
- end
+ it 'ensure we handle all the GitLab reference characters' do
+ reference_chars = ObjectSpace.each_object(Class).map do |klass|
+ next unless klass.included_modules.include?(Referable)
+ next unless klass.respond_to?(:reference_prefix)
+ next unless klass.reference_prefix.length == 1
- describe 'escaped characters are treated as regular characters and do not have their usual Markdown meanings' do
- where(:markdown, :expected) do
- %q(\*not emphasized*) | %q(<span>*</span>not emphasized*)
- %q(\<br/> not a tag) | %q(<span>&lt;</span>br/&gt; not a tag)
- %q!\[not a link](/foo)! | %q!<span>[</span>not a link](/foo)!
- %q(\`not code`) | %q(<span>`</span>not code`)
- %q(1\. not a list) | %q(1<span>.</span> not a list)
- %q(\# not a heading) | %q(<span>#</span> not a heading)
- %q(\[foo]: /url "not a reference") | %q(<span>[</span>foo]: /url "not a reference")
- %q(\&ouml; not a character entity) | %q(<span>&amp;</span>ouml; not a character entity)
- end
+ klass.reference_prefix
+ end.compact
- with_them do
- it 'keeps them as literals' do
- correct_html_included(markdown, expected)
- end
+ reference_chars.all? do |char|
+ Banzai::Filter::MarkdownPreEscapeFilter::REFERENCE_CHARACTERS.include?(char)
end
end
- it 'backslash is itself escaped, the following character is not' do
- markdown = %q(\\\\*emphasis*)
- expected = %q(<span>\</span><em>emphasis</em>)
+ it 'does not convert non-reference punctuation to spans' do
+ markdown = %q(\"\'\*\+\,\-\.\/\:\;\<\=\>\?\[\]\_\`\{\|\}) + %q[\(\)\\\\]
- correct_html_included(markdown, expected)
+ result = described_class.call(markdown, project: project)
+ output = result[:output].to_html
+
+ expect(output).not_to include('<span>')
+ expect(result[:escaped_literals]).to be_falsey
end
- it 'backslash at the end of the line is a hard line break' do
- markdown = <<~MARKDOWN
- foo\\
- bar
- MARKDOWN
- expected = "foo<br>\nbar"
+ it 'does not convert other characters to literals' do
+ markdown = %q(\→\A\a\ \3\φ\«)
+ expected = '\→\A\a\ \3\φ\«'
- correct_html_included(markdown, expected)
+ result = correct_html_included(markdown, expected)
+ expect(result[:escaped_literals]).to be_falsey
end
describe 'backslash escapes do not work in code blocks, code spans, autolinks, or raw HTML' do
where(:markdown, :expected) do
- %q(`` \[\` ``) | %q(<code>\[\`</code>)
- %q( \[\]) | %Q(<code>\\[\\]\n</code>)
- %Q(~~~\n\\[\\]\n~~~) | %Q(<code>\\[\\]\n</code>)
- %q(<http://example.com?find=\*>) | %q(<a href="http://example.com?find=%5C*">http://example.com?find=\*</a>)
- %q[<a href="/bar\/)">] | %q[<a href="/bar%5C/)">]
+ %q(`` \@\! ``) | %q(<code>\@\!</code>)
+ %q( \@\!) | %Q(<code>\\@\\!\n</code>)
+ %Q(~~~\n\\@\\!\n~~~) | %Q(<code>\\@\\!\n</code>)
+ %q(<http://example.com?find=\@>) | %q(<a href="http://example.com?find=%5C@">http://example.com?find=\@</a>)
+ %q[<a href="/bar\@)">] | %q[<a href="/bar%5C@)">]
end
with_them do
@@ -104,9 +94,9 @@ RSpec.describe Banzai::Pipeline::PlainMarkdownPipeline do
describe 'work in all other contexts, including URLs and link titles, link references, and info strings in fenced code blocks' do
where(:markdown, :expected) do
- %q![foo](/bar\* "ti\*tle")! | %q(<a href="/bar*" title="ti*tle">foo</a>)
- %Q![foo]\n\n[foo]: /bar\\* "ti\\*tle"! | %q(<a href="/bar*" title="ti*tle">foo</a>)
- %Q(``` foo\\+bar\nfoo\n```) | %Q(<code lang="foo+bar">foo\n</code>)
+ %q![foo](/bar\@ "\@title")! | %q(<a href="/bar@" title="@title">foo</a>)
+ %Q![foo]\n\n[foo]: /bar\\@ "\\@title"! | %q(<a href="/bar@" title="@title">foo</a>)
+ %Q(``` foo\\@bar\nfoo\n```) | %Q(<code lang="foo@bar">foo\n</code>)
end
with_them do
diff --git a/spec/lib/bulk_imports/common/loaders/entity_loader_spec.rb b/spec/lib/bulk_imports/common/loaders/entity_loader_spec.rb
deleted file mode 100644
index 57ffdfa9aee..00000000000
--- a/spec/lib/bulk_imports/common/loaders/entity_loader_spec.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe BulkImports::Common::Loaders::EntityLoader do
- describe '#load' do
- it "creates entities for the given data" do
- group = create(:group, path: "imported-group")
- parent_entity = create(:bulk_import_entity, group: group, bulk_import: create(:bulk_import))
- context = BulkImports::Pipeline::Context.new(parent_entity)
-
- data = {
- source_type: :group_entity,
- source_full_path: "parent/subgroup",
- destination_name: "subgroup",
- destination_namespace: parent_entity.group.full_path,
- parent_id: parent_entity.id
- }
-
- expect { subject.load(context, data) }.to change(BulkImports::Entity, :count).by(1)
-
- subgroup_entity = BulkImports::Entity.last
-
- expect(subgroup_entity.source_full_path).to eq 'parent/subgroup'
- expect(subgroup_entity.destination_namespace).to eq 'imported-group'
- expect(subgroup_entity.destination_name).to eq 'subgroup'
- expect(subgroup_entity.parent_id).to eq parent_entity.id
- end
- end
-end
diff --git a/spec/lib/bulk_imports/common/transformers/award_emoji_transformer_spec.rb b/spec/lib/bulk_imports/common/transformers/award_emoji_transformer_spec.rb
deleted file mode 100644
index 5b560a30bf5..00000000000
--- a/spec/lib/bulk_imports/common/transformers/award_emoji_transformer_spec.rb
+++ /dev/null
@@ -1,48 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe BulkImports::Common::Transformers::AwardEmojiTransformer do
- describe '#transform' do
- let_it_be(:user) { create(:user) }
- let_it_be(:group) { create(:group) }
- let_it_be(:bulk_import) { create(:bulk_import) }
- let_it_be(:entity) { create(:bulk_import_entity, bulk_import: bulk_import, group: group) }
- let_it_be(:context) { BulkImports::Pipeline::Context.new(entity) }
-
- let(:hash) do
- {
- 'name' => 'thumbs up',
- 'user' => {
- 'public_email' => email
- }
- }
- end
-
- before do
- group.add_developer(user)
- end
-
- shared_examples 'sets user_id and removes user key' do
- it 'sets found user_id and removes user key' do
- transformed_hash = subject.transform(context, hash)
-
- expect(transformed_hash['user']).to be_nil
- expect(transformed_hash['user_id']).to eq(user.id)
- end
- end
-
- context 'when user can be found by email' do
- let(:email) { user.email }
-
- include_examples 'sets user_id and removes user key'
- end
-
- context 'when user cannot be found by email' do
- let(:user) { bulk_import.user }
- let(:email) { nil }
-
- include_examples 'sets user_id and removes user key'
- end
- end
-end
diff --git a/spec/lib/bulk_imports/common/transformers/prohibited_attributes_transformer_spec.rb b/spec/lib/bulk_imports/common/transformers/prohibited_attributes_transformer_spec.rb
index 03d138b227c..08a82bc84ed 100644
--- a/spec/lib/bulk_imports/common/transformers/prohibited_attributes_transformer_spec.rb
+++ b/spec/lib/bulk_imports/common/transformers/prohibited_attributes_transformer_spec.rb
@@ -68,5 +68,11 @@ RSpec.describe BulkImports::Common::Transformers::ProhibitedAttributesTransforme
expect(transformed_hash).to eq(expected_hash)
end
+
+ context 'when there is no data to transform' do
+ it 'returns' do
+ expect(subject.transform(nil, nil)).to be_nil
+ end
+ end
end
end
diff --git a/spec/lib/bulk_imports/common/transformers/user_reference_transformer_spec.rb b/spec/lib/bulk_imports/common/transformers/user_reference_transformer_spec.rb
new file mode 100644
index 00000000000..ff11a10bfe9
--- /dev/null
+++ b/spec/lib/bulk_imports/common/transformers/user_reference_transformer_spec.rb
@@ -0,0 +1,69 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe BulkImports::Common::Transformers::UserReferenceTransformer do
+ describe '#transform' do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:bulk_import) { create(:bulk_import) }
+ let_it_be(:entity) { create(:bulk_import_entity, bulk_import: bulk_import, group: group) }
+ let_it_be(:context) { BulkImports::Pipeline::Context.new(entity) }
+
+ let(:hash) do
+ {
+ 'user' => {
+ 'public_email' => email
+ }
+ }
+ end
+
+ before do
+ group.add_developer(user)
+ end
+
+ shared_examples 'sets user_id and removes user key' do
+ it 'sets found user_id and removes user key' do
+ transformed_hash = subject.transform(context, hash)
+
+ expect(transformed_hash['user']).to be_nil
+ expect(transformed_hash['user_id']).to eq(user.id)
+ end
+ end
+
+ context 'when user can be found by email' do
+ let(:email) { user.email }
+
+ include_examples 'sets user_id and removes user key'
+ end
+
+ context 'when user cannot be found by email' do
+ let(:user) { bulk_import.user }
+ let(:email) { nil }
+
+ include_examples 'sets user_id and removes user key'
+ end
+
+ context 'when there is no data to transform' do
+ it 'returns' do
+ expect(subject.transform(nil, nil)).to be_nil
+ end
+ end
+
+ context 'when custom reference is provided' do
+ it 'updates provided reference' do
+ hash = {
+ 'author' => {
+ 'public_email' => user.email
+ }
+ }
+
+ transformer = described_class.new(reference: 'author')
+ result = transformer.transform(context, hash)
+
+ expect(result['author']).to be_nil
+ expect(result['author_id']).to eq(user.id)
+ end
+ end
+ end
+end
diff --git a/spec/lib/bulk_imports/groups/graphql/get_labels_query_spec.rb b/spec/lib/bulk_imports/groups/graphql/get_labels_query_spec.rb
index 247da200d68..85f82be7d18 100644
--- a/spec/lib/bulk_imports/groups/graphql/get_labels_query_spec.rb
+++ b/spec/lib/bulk_imports/groups/graphql/get_labels_query_spec.rb
@@ -3,15 +3,18 @@
require 'spec_helper'
RSpec.describe BulkImports::Groups::Graphql::GetLabelsQuery do
- describe '#variables' do
- let(:entity) { double(source_full_path: 'test', next_page_for: 'next_page', bulk_import: nil) }
- let(:context) { BulkImports::Pipeline::Context.new(entity) }
-
- it 'returns query variables based on entity information' do
- expected = { full_path: entity.source_full_path, cursor: entity.next_page_for }
-
- expect(described_class.variables(context)).to eq(expected)
- end
+ it 'has a valid query' do
+ entity = create(:bulk_import_entity)
+ context = BulkImports::Pipeline::Context.new(entity)
+
+ query = GraphQL::Query.new(
+ GitlabSchema,
+ described_class.to_s,
+ variables: described_class.variables(context)
+ )
+ result = GitlabSchema.static_validator.validate(query)
+
+ expect(result[:errors]).to be_empty
end
describe '#data_path' do
diff --git a/spec/lib/bulk_imports/groups/graphql/get_milestones_query_spec.rb b/spec/lib/bulk_imports/groups/graphql/get_milestones_query_spec.rb
new file mode 100644
index 00000000000..a38505fbf85
--- /dev/null
+++ b/spec/lib/bulk_imports/groups/graphql/get_milestones_query_spec.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe BulkImports::Groups::Graphql::GetMilestonesQuery do
+ it 'has a valid query' do
+ entity = create(:bulk_import_entity)
+ context = BulkImports::Pipeline::Context.new(entity)
+
+ query = GraphQL::Query.new(
+ GitlabSchema,
+ described_class.to_s,
+ variables: described_class.variables(context)
+ )
+ result = GitlabSchema.static_validator.validate(query)
+
+ expect(result[:errors]).to be_empty
+ end
+
+ describe '#data_path' do
+ it 'returns data path' do
+ expected = %w[data group milestones nodes]
+
+ expect(described_class.data_path).to eq(expected)
+ end
+ end
+
+ describe '#page_info_path' do
+ it 'returns pagination information path' do
+ expected = %w[data group milestones page_info]
+
+ expect(described_class.page_info_path).to eq(expected)
+ end
+ end
+end
diff --git a/spec/lib/bulk_imports/groups/loaders/labels_loader_spec.rb b/spec/lib/bulk_imports/groups/loaders/labels_loader_spec.rb
deleted file mode 100644
index ac2f9c8cb1d..00000000000
--- a/spec/lib/bulk_imports/groups/loaders/labels_loader_spec.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe BulkImports::Groups::Loaders::LabelsLoader do
- describe '#load' do
- let(:user) { create(:user) }
- let(:group) { create(:group) }
- let(:entity) { create(:bulk_import_entity, group: group) }
- let(:context) { BulkImports::Pipeline::Context.new(entity) }
-
- let(:data) do
- {
- 'title' => 'label',
- 'description' => 'description',
- 'color' => '#FFFFFF'
- }
- end
-
- it 'creates the label' do
- expect { subject.load(context, data) }.to change(Label, :count).by(1)
-
- label = group.labels.first
-
- expect(label.title).to eq(data['title'])
- expect(label.description).to eq(data['description'])
- expect(label.color).to eq(data['color'])
- end
- end
-end
diff --git a/spec/lib/bulk_imports/groups/loaders/members_loader_spec.rb b/spec/lib/bulk_imports/groups/loaders/members_loader_spec.rb
deleted file mode 100644
index d552578e7be..00000000000
--- a/spec/lib/bulk_imports/groups/loaders/members_loader_spec.rb
+++ /dev/null
@@ -1,42 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe BulkImports::Groups::Loaders::MembersLoader do
- describe '#load' do
- let_it_be(:user_importer) { create(:user) }
- let_it_be(:user_member) { create(:user) }
- let_it_be(:group) { create(:group) }
- let_it_be(:bulk_import) { create(:bulk_import, user: user_importer) }
- let_it_be(:entity) { create(:bulk_import_entity, bulk_import: bulk_import, group: group) }
- let_it_be(:context) { BulkImports::Pipeline::Context.new(entity) }
-
- let_it_be(:data) do
- {
- 'user_id' => user_member.id,
- 'created_by_id' => user_importer.id,
- 'access_level' => 30,
- 'created_at' => '2020-01-01T00:00:00Z',
- 'updated_at' => '2020-01-01T00:00:00Z',
- 'expires_at' => nil
- }
- end
-
- it 'does nothing when there is no data' do
- expect { subject.load(context, nil) }.not_to change(GroupMember, :count)
- end
-
- it 'creates the member' do
- expect { subject.load(context, data) }.to change(GroupMember, :count).by(1)
-
- member = group.members.last
-
- expect(member.user).to eq(user_member)
- expect(member.created_by).to eq(user_importer)
- expect(member.access_level).to eq(30)
- expect(member.created_at).to eq('2020-01-01T00:00:00Z')
- expect(member.updated_at).to eq('2020-01-01T00:00:00Z')
- expect(member.expires_at).to eq(nil)
- end
- end
-end
diff --git a/spec/lib/bulk_imports/groups/pipelines/labels_pipeline_spec.rb b/spec/lib/bulk_imports/groups/pipelines/labels_pipeline_spec.rb
index 63f28916d9a..3327a30f1d5 100644
--- a/spec/lib/bulk_imports/groups/pipelines/labels_pipeline_spec.rb
+++ b/spec/lib/bulk_imports/groups/pipelines/labels_pipeline_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe BulkImports::Groups::Pipelines::LabelsPipeline do
let(:user) { create(:user) }
let(:group) { create(:group) }
let(:cursor) { 'cursor' }
+ let(:timestamp) { Time.new(2020, 01, 01).utc }
let(:entity) do
create(
:bulk_import_entity,
@@ -20,21 +21,23 @@ RSpec.describe BulkImports::Groups::Pipelines::LabelsPipeline do
subject { described_class.new(context) }
- def extractor_data(title:, has_next_page:, cursor: nil)
- data = [
- {
- 'title' => title,
- 'description' => 'desc',
- 'color' => '#428BCA'
- }
- ]
+ def label_data(title)
+ {
+ 'title' => title,
+ 'description' => 'desc',
+ 'color' => '#428BCA',
+ 'created_at' => timestamp.to_s,
+ 'updated_at' => timestamp.to_s
+ }
+ end
+ def extractor_data(title:, has_next_page:, cursor: nil)
page_info = {
'end_cursor' => cursor,
'has_next_page' => has_next_page
}
- BulkImports::Pipeline::ExtractedData.new(data: data, page_info: page_info)
+ BulkImports::Pipeline::ExtractedData.new(data: [label_data(title)], page_info: page_info)
end
describe '#run' do
@@ -55,6 +58,8 @@ RSpec.describe BulkImports::Groups::Pipelines::LabelsPipeline do
expect(label.title).to eq('label2')
expect(label.description).to eq('desc')
expect(label.color).to eq('#428BCA')
+ expect(label.created_at).to eq(timestamp)
+ expect(label.updated_at).to eq(timestamp)
end
end
@@ -90,6 +95,20 @@ RSpec.describe BulkImports::Groups::Pipelines::LabelsPipeline do
end
end
+ describe '#load' do
+ it 'creates the label' do
+ data = label_data('label')
+
+ expect { subject.load(context, data) }.to change(Label, :count).by(1)
+
+ label = group.labels.first
+
+ data.each do |key, value|
+ expect(label[key]).to eq(value)
+ end
+ end
+ end
+
describe 'pipeline parts' do
it { expect(described_class).to include_module(BulkImports::Pipeline) }
it { expect(described_class).to include_module(BulkImports::Pipeline::Runner) }
@@ -110,9 +129,5 @@ RSpec.describe BulkImports::Groups::Pipelines::LabelsPipeline do
{ klass: BulkImports::Common::Transformers::ProhibitedAttributesTransformer, options: nil }
)
end
-
- it 'has loaders' do
- expect(described_class.get_loader).to eq(klass: BulkImports::Groups::Loaders::LabelsLoader, options: nil)
- end
end
end
diff --git a/spec/lib/bulk_imports/groups/pipelines/members_pipeline_spec.rb b/spec/lib/bulk_imports/groups/pipelines/members_pipeline_spec.rb
index 9f498f8154f..74d3e09d263 100644
--- a/spec/lib/bulk_imports/groups/pipelines/members_pipeline_spec.rb
+++ b/spec/lib/bulk_imports/groups/pipelines/members_pipeline_spec.rb
@@ -37,6 +37,34 @@ RSpec.describe BulkImports::Groups::Pipelines::MembersPipeline do
end
end
+ describe '#load' do
+ it 'does nothing when there is no data' do
+ expect { subject.load(context, nil) }.not_to change(GroupMember, :count)
+ end
+
+ it 'creates the member' do
+ data = {
+ 'user_id' => member_user1.id,
+ 'created_by_id' => member_user2.id,
+ 'access_level' => 30,
+ 'created_at' => '2020-01-01T00:00:00Z',
+ 'updated_at' => '2020-01-01T00:00:00Z',
+ 'expires_at' => nil
+ }
+
+ expect { subject.load(context, data) }.to change(GroupMember, :count).by(1)
+
+ member = group.members.last
+
+ expect(member.user).to eq(member_user1)
+ expect(member.created_by).to eq(member_user2)
+ expect(member.access_level).to eq(30)
+ expect(member.created_at).to eq('2020-01-01T00:00:00Z')
+ expect(member.updated_at).to eq('2020-01-01T00:00:00Z')
+ expect(member.expires_at).to eq(nil)
+ end
+ end
+
describe 'pipeline parts' do
it { expect(described_class).to include_module(BulkImports::Pipeline) }
it { expect(described_class).to include_module(BulkImports::Pipeline::Runner) }
@@ -58,10 +86,6 @@ RSpec.describe BulkImports::Groups::Pipelines::MembersPipeline do
{ klass: BulkImports::Groups::Transformers::MemberAttributesTransformer, options: nil }
)
end
-
- it 'has loaders' do
- expect(described_class.get_loader).to eq(klass: BulkImports::Groups::Loaders::MembersLoader, options: nil)
- end
end
def member_data(email:, has_next_page:, cursor: nil)
diff --git a/spec/lib/bulk_imports/groups/pipelines/milestones_pipeline_spec.rb b/spec/lib/bulk_imports/groups/pipelines/milestones_pipeline_spec.rb
new file mode 100644
index 00000000000..f0c34c65257
--- /dev/null
+++ b/spec/lib/bulk_imports/groups/pipelines/milestones_pipeline_spec.rb
@@ -0,0 +1,151 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe BulkImports::Groups::Pipelines::MilestonesPipeline do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:cursor) { 'cursor' }
+ let_it_be(:timestamp) { Time.new(2020, 01, 01).utc }
+ let_it_be(:bulk_import) { create(:bulk_import, user: user) }
+
+ let(:entity) do
+ create(
+ :bulk_import_entity,
+ bulk_import: bulk_import,
+ source_full_path: 'source/full/path',
+ destination_name: 'My Destination Group',
+ destination_namespace: group.full_path,
+ group: group
+ )
+ end
+
+ let(:context) { BulkImports::Pipeline::Context.new(entity) }
+
+ subject { described_class.new(context) }
+
+ def milestone_data(title)
+ {
+ 'title' => title,
+ 'description' => 'desc',
+ 'state' => 'closed',
+ 'start_date' => '2020-10-21',
+ 'due_date' => '2020-10-22',
+ 'created_at' => timestamp.to_s,
+ 'updated_at' => timestamp.to_s
+ }
+ end
+
+ def extracted_data(title:, has_next_page:, cursor: nil)
+ page_info = {
+ 'end_cursor' => cursor,
+ 'has_next_page' => has_next_page
+ }
+
+ BulkImports::Pipeline::ExtractedData.new(data: [milestone_data(title)], page_info: page_info)
+ end
+
+ before do
+ group.add_owner(user)
+ end
+
+ describe '#run' do
+ it 'imports group milestones' do
+ first_page = extracted_data(title: 'milestone1', has_next_page: true, cursor: cursor)
+ last_page = extracted_data(title: 'milestone2', has_next_page: false)
+
+ allow_next_instance_of(BulkImports::Common::Extractors::GraphqlExtractor) do |extractor|
+ allow(extractor)
+ .to receive(:extract)
+ .and_return(first_page, last_page)
+ end
+
+ expect { subject.run }.to change(Milestone, :count).by(2)
+
+ expect(group.milestones.pluck(:title)).to contain_exactly('milestone1', 'milestone2')
+
+ milestone = group.milestones.last
+
+ expect(milestone.description).to eq('desc')
+ expect(milestone.state).to eq('closed')
+ expect(milestone.start_date.to_s).to eq('2020-10-21')
+ expect(milestone.due_date.to_s).to eq('2020-10-22')
+ expect(milestone.created_at).to eq(timestamp)
+ expect(milestone.updated_at).to eq(timestamp)
+ end
+ end
+
+ describe '#after_run' do
+ context 'when extracted data has next page' do
+ it 'updates tracker information and runs pipeline again' do
+ data = extracted_data(title: 'milestone', has_next_page: true, cursor: cursor)
+
+ expect(subject).to receive(:run)
+
+ subject.after_run(data)
+
+ tracker = entity.trackers.find_by(relation: :milestones)
+
+ expect(tracker.has_next_page).to eq(true)
+ expect(tracker.next_page).to eq(cursor)
+ end
+ end
+
+ context 'when extracted data has no next page' do
+ it 'updates tracker information and does not run pipeline' do
+ data = extracted_data(title: 'milestone', has_next_page: false)
+
+ expect(subject).not_to receive(:run)
+
+ subject.after_run(data)
+
+ tracker = entity.trackers.find_by(relation: :milestones)
+
+ expect(tracker.has_next_page).to eq(false)
+ expect(tracker.next_page).to be_nil
+ end
+ end
+ end
+
+ describe '#load' do
+ it 'creates the milestone' do
+ data = milestone_data('milestone')
+
+ expect { subject.load(context, data) }.to change(Milestone, :count).by(1)
+ end
+
+ context 'when user is not authorized to create the milestone' do
+ before do
+ allow(user).to receive(:can?).with(:admin_milestone, group).and_return(false)
+ end
+
+ it 'raises NotAllowedError' do
+ data = extracted_data(title: 'milestone', has_next_page: false)
+
+ expect { subject.load(context, data) }.to raise_error(::BulkImports::Pipeline::NotAllowedError)
+ end
+ end
+ end
+
+ describe 'pipeline parts' do
+ it { expect(described_class).to include_module(BulkImports::Pipeline) }
+ it { expect(described_class).to include_module(BulkImports::Pipeline::Runner) }
+
+ it 'has extractors' do
+ expect(described_class.get_extractor)
+ .to eq(
+ klass: BulkImports::Common::Extractors::GraphqlExtractor,
+ options: {
+ query: BulkImports::Groups::Graphql::GetMilestonesQuery
+ }
+ )
+ end
+
+ it 'has transformers' do
+ expect(described_class.transformers)
+ .to contain_exactly(
+ { klass: BulkImports::Common::Transformers::ProhibitedAttributesTransformer, options: nil }
+ )
+ end
+ end
+end
diff --git a/spec/lib/bulk_imports/groups/pipelines/subgroup_entities_pipeline_spec.rb b/spec/lib/bulk_imports/groups/pipelines/subgroup_entities_pipeline_spec.rb
index 0404c52b895..2a99646bb4a 100644
--- a/spec/lib/bulk_imports/groups/pipelines/subgroup_entities_pipeline_spec.rb
+++ b/spec/lib/bulk_imports/groups/pipelines/subgroup_entities_pipeline_spec.rb
@@ -3,9 +3,14 @@
require 'spec_helper'
RSpec.describe BulkImports::Groups::Pipelines::SubgroupEntitiesPipeline do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group) { create(:group, path: 'group') }
+ let_it_be(:parent) { create(:group, name: 'imported-group', path: 'imported-group') }
+ let(:context) { BulkImports::Pipeline::Context.new(parent_entity) }
+
+ subject { described_class.new(context) }
+
describe '#run' do
- let_it_be(:user) { create(:user) }
- let(:parent) { create(:group, name: 'imported-group', path: 'imported-group') }
let!(:parent_entity) do
create(
:bulk_import_entity,
@@ -14,8 +19,6 @@ RSpec.describe BulkImports::Groups::Pipelines::SubgroupEntitiesPipeline do
)
end
- let(:context) { BulkImports::Pipeline::Context.new(parent_entity) }
-
let(:subgroup_data) do
[
{
@@ -25,8 +28,6 @@ RSpec.describe BulkImports::Groups::Pipelines::SubgroupEntitiesPipeline do
]
end
- subject { described_class.new(context) }
-
before do
allow_next_instance_of(BulkImports::Groups::Extractors::SubgroupsExtractor) do |extractor|
allow(extractor).to receive(:extract).and_return(subgroup_data)
@@ -47,6 +48,29 @@ RSpec.describe BulkImports::Groups::Pipelines::SubgroupEntitiesPipeline do
end
end
+ describe '#load' do
+ let(:parent_entity) { create(:bulk_import_entity, group: group, bulk_import: create(:bulk_import)) }
+
+ it 'creates entities for the given data' do
+ data = {
+ source_type: :group_entity,
+ source_full_path: 'parent/subgroup',
+ destination_name: 'subgroup',
+ destination_namespace: parent_entity.group.full_path,
+ parent_id: parent_entity.id
+ }
+
+ expect { subject.load(context, data) }.to change(BulkImports::Entity, :count).by(1)
+
+ subgroup_entity = BulkImports::Entity.last
+
+ expect(subgroup_entity.source_full_path).to eq 'parent/subgroup'
+ expect(subgroup_entity.destination_namespace).to eq 'group'
+ expect(subgroup_entity.destination_name).to eq 'subgroup'
+ expect(subgroup_entity.parent_id).to eq parent_entity.id
+ end
+ end
+
describe 'pipeline parts' do
it { expect(described_class).to include_module(BulkImports::Pipeline) }
it { expect(described_class).to include_module(BulkImports::Pipeline::Runner) }
@@ -61,9 +85,5 @@ RSpec.describe BulkImports::Groups::Pipelines::SubgroupEntitiesPipeline do
{ klass: BulkImports::Groups::Transformers::SubgroupToEntityTransformer, options: nil }
)
end
-
- it 'has loaders' do
- expect(described_class.get_loader).to eq(klass: BulkImports::Common::Loaders::EntityLoader, options: nil)
- end
end
end
diff --git a/spec/lib/bulk_imports/groups/transformers/group_attributes_transformer_spec.rb b/spec/lib/bulk_imports/groups/transformers/group_attributes_transformer_spec.rb
index 5a7a51675d6..b3fe8a2ba25 100644
--- a/spec/lib/bulk_imports/groups/transformers/group_attributes_transformer_spec.rb
+++ b/spec/lib/bulk_imports/groups/transformers/group_attributes_transformer_spec.rb
@@ -80,14 +80,14 @@ RSpec.describe BulkImports::Groups::Transformers::GroupAttributesTransformer do
expect(transformed_data['parent_id']).to eq(parent.id)
end
- context 'when destination namespace is user namespace' do
+ context 'when destination namespace is empty' do
it 'does not set parent id' do
entity = create(
:bulk_import_entity,
bulk_import: bulk_import,
source_full_path: 'source/full/path',
destination_name: group.name,
- destination_namespace: user.namespace.full_path
+ destination_namespace: ''
)
context = BulkImports::Pipeline::Context.new(entity)
diff --git a/spec/lib/bulk_imports/importers/group_importer_spec.rb b/spec/lib/bulk_imports/importers/group_importer_spec.rb
index b4fdb7b5e5b..5d501b49e41 100644
--- a/spec/lib/bulk_imports/importers/group_importer_spec.rb
+++ b/spec/lib/bulk_imports/importers/group_importer_spec.rb
@@ -22,10 +22,13 @@ RSpec.describe BulkImports::Importers::GroupImporter do
expect_to_run_pipeline BulkImports::Groups::Pipelines::SubgroupEntitiesPipeline, context: context
expect_to_run_pipeline BulkImports::Groups::Pipelines::MembersPipeline, context: context
expect_to_run_pipeline BulkImports::Groups::Pipelines::LabelsPipeline, context: context
+ expect_to_run_pipeline BulkImports::Groups::Pipelines::MilestonesPipeline, context: context
if Gitlab.ee?
expect_to_run_pipeline('EE::BulkImports::Groups::Pipelines::EpicsPipeline'.constantize, context: context)
expect_to_run_pipeline('EE::BulkImports::Groups::Pipelines::EpicAwardEmojiPipeline'.constantize, context: context)
+ expect_to_run_pipeline('EE::BulkImports::Groups::Pipelines::EpicEventsPipeline'.constantize, context: context)
+ expect_to_run_pipeline('EE::BulkImports::Groups::Pipelines::IterationsPipeline'.constantize, context: context)
end
subject.execute
diff --git a/spec/lib/bulk_imports/pipeline/runner_spec.rb b/spec/lib/bulk_imports/pipeline/runner_spec.rb
index 76e4e64a7d6..59f01c9caaa 100644
--- a/spec/lib/bulk_imports/pipeline/runner_spec.rb
+++ b/spec/lib/bulk_imports/pipeline/runner_spec.rb
@@ -27,29 +27,31 @@ RSpec.describe BulkImports::Pipeline::Runner do
end
end
- describe 'pipeline runner' do
- before do
- stub_const('BulkImports::Extractor', extractor)
- stub_const('BulkImports::Transformer', transformer)
- stub_const('BulkImports::Loader', loader)
-
- pipeline = Class.new do
- include BulkImports::Pipeline
+ before do
+ stub_const('BulkImports::Extractor', extractor)
+ stub_const('BulkImports::Transformer', transformer)
+ stub_const('BulkImports::Loader', loader)
- extractor BulkImports::Extractor
- transformer BulkImports::Transformer
- loader BulkImports::Loader
+ pipeline = Class.new do
+ include BulkImports::Pipeline
- def after_run(_); end
- end
+ extractor BulkImports::Extractor
+ transformer BulkImports::Transformer
+ loader BulkImports::Loader
- stub_const('BulkImports::MyPipeline', pipeline)
+ def after_run(_); end
end
- context 'when entity is not marked as failed' do
- let(:entity) { create(:bulk_import_entity) }
- let(:context) { BulkImports::Pipeline::Context.new(entity) }
+ stub_const('BulkImports::MyPipeline', pipeline)
+ end
+ let_it_be_with_refind(:entity) { create(:bulk_import_entity) }
+ let(:context) { BulkImports::Pipeline::Context.new(entity, extra: :data) }
+
+ subject { BulkImports::MyPipeline.new(context) }
+
+ describe 'pipeline runner' do
+ context 'when entity is not marked as failed' do
it 'runs pipeline extractor, transformer, loader' do
extracted_data = BulkImports::Pipeline::ExtractedData.new(data: { foo: :bar })
@@ -76,58 +78,61 @@ RSpec.describe BulkImports::Pipeline::Runner do
expect_next_instance_of(Gitlab::Import::Logger) do |logger|
expect(logger).to receive(:info)
.with(
- bulk_import_entity_id: entity.id,
- bulk_import_entity_type: 'group_entity',
- message: 'Pipeline started',
- pipeline_class: 'BulkImports::MyPipeline'
+ log_params(
+ context,
+ message: 'Pipeline started',
+ pipeline_class: 'BulkImports::MyPipeline'
+ )
)
expect(logger).to receive(:info)
.with(
- bulk_import_entity_id: entity.id,
- bulk_import_entity_type: 'group_entity',
- pipeline_class: 'BulkImports::MyPipeline',
- pipeline_step: :extractor,
- step_class: 'BulkImports::Extractor'
+ log_params(
+ context,
+ pipeline_class: 'BulkImports::MyPipeline',
+ pipeline_step: :extractor,
+ step_class: 'BulkImports::Extractor'
+ )
)
expect(logger).to receive(:info)
.with(
- bulk_import_entity_id: entity.id,
- bulk_import_entity_type: 'group_entity',
- pipeline_class: 'BulkImports::MyPipeline',
- pipeline_step: :transformer,
- step_class: 'BulkImports::Transformer'
+ log_params(
+ context,
+ pipeline_class: 'BulkImports::MyPipeline',
+ pipeline_step: :transformer,
+ step_class: 'BulkImports::Transformer'
+ )
)
expect(logger).to receive(:info)
.with(
- bulk_import_entity_id: entity.id,
- bulk_import_entity_type: 'group_entity',
- pipeline_class: 'BulkImports::MyPipeline',
- pipeline_step: :loader,
- step_class: 'BulkImports::Loader'
+ log_params(
+ context,
+ pipeline_class: 'BulkImports::MyPipeline',
+ pipeline_step: :loader,
+ step_class: 'BulkImports::Loader'
+ )
)
expect(logger).to receive(:info)
.with(
- bulk_import_entity_id: entity.id,
- bulk_import_entity_type: 'group_entity',
- pipeline_class: 'BulkImports::MyPipeline',
- pipeline_step: :after_run
+ log_params(
+ context,
+ pipeline_class: 'BulkImports::MyPipeline',
+ pipeline_step: :after_run
+ )
)
expect(logger).to receive(:info)
.with(
- bulk_import_entity_id: entity.id,
- bulk_import_entity_type: 'group_entity',
- message: 'Pipeline finished',
- pipeline_class: 'BulkImports::MyPipeline'
+ log_params(
+ context,
+ message: 'Pipeline finished',
+ pipeline_class: 'BulkImports::MyPipeline'
+ )
)
end
- BulkImports::MyPipeline.new(context).run
+ subject.run
end
context 'when exception is raised' do
- let(:entity) { create(:bulk_import_entity, :created) }
- let(:context) { BulkImports::Pipeline::Context.new(entity) }
-
before do
allow_next_instance_of(BulkImports::Extractor) do |extractor|
allow(extractor).to receive(:extract).with(context).and_raise(StandardError, 'Error!')
@@ -135,7 +140,21 @@ RSpec.describe BulkImports::Pipeline::Runner do
end
it 'logs import failure' do
- BulkImports::MyPipeline.new(context).run
+ expect_next_instance_of(Gitlab::Import::Logger) do |logger|
+ expect(logger).to receive(:error)
+ .with(
+ log_params(
+ context,
+ pipeline_step: :extractor,
+ pipeline_class: 'BulkImports::MyPipeline',
+ exception_class: 'StandardError',
+ exception_message: 'Error!'
+ )
+ )
+ end
+
+ expect { subject.run }
+ .to change(entity.failures, :count).by(1)
failure = entity.failures.first
@@ -152,29 +171,29 @@ RSpec.describe BulkImports::Pipeline::Runner do
end
it 'marks entity as failed' do
- BulkImports::MyPipeline.new(context).run
-
- expect(entity.failed?).to eq(true)
+ expect { subject.run }
+ .to change(entity, :status_name).to(:failed)
end
it 'logs warn message' do
expect_next_instance_of(Gitlab::Import::Logger) do |logger|
expect(logger).to receive(:warn)
.with(
- message: 'Pipeline failed',
- pipeline_class: 'BulkImports::MyPipeline',
- bulk_import_entity_id: entity.id,
- bulk_import_entity_type: entity.source_type
+ log_params(
+ context,
+ message: 'Pipeline failed',
+ pipeline_class: 'BulkImports::MyPipeline'
+ )
)
end
- BulkImports::MyPipeline.new(context).run
+ subject.run
end
end
context 'when pipeline is not marked to abort on failure' do
- it 'marks entity as failed' do
- BulkImports::MyPipeline.new(context).run
+ it 'does not mark entity as failed' do
+ subject.run
expect(entity.failed?).to eq(false)
end
@@ -183,24 +202,31 @@ RSpec.describe BulkImports::Pipeline::Runner do
end
context 'when entity is marked as failed' do
- let(:entity) { create(:bulk_import_entity) }
- let(:context) { BulkImports::Pipeline::Context.new(entity) }
-
it 'logs and returns without execution' do
- allow(entity).to receive(:failed?).and_return(true)
+ entity.fail_op!
expect_next_instance_of(Gitlab::Import::Logger) do |logger|
expect(logger).to receive(:info)
.with(
- message: 'Skipping due to failed pipeline status',
- pipeline_class: 'BulkImports::MyPipeline',
- bulk_import_entity_id: entity.id,
- bulk_import_entity_type: 'group_entity'
+ log_params(
+ context,
+ message: 'Skipping due to failed pipeline status',
+ pipeline_class: 'BulkImports::MyPipeline'
+ )
)
end
- BulkImports::MyPipeline.new(context).run
+ subject.run
end
end
end
+
+ def log_params(context, extra = {})
+ {
+ bulk_import_id: context.bulk_import.id,
+ bulk_import_entity_id: context.entity.id,
+ bulk_import_entity_type: context.entity.source_type,
+ context_extra: context.extra
+ }.merge(extra)
+ end
end
diff --git a/spec/lib/bulk_imports/pipeline_spec.rb b/spec/lib/bulk_imports/pipeline_spec.rb
index 3811a02a7fd..c882e3d26ea 100644
--- a/spec/lib/bulk_imports/pipeline_spec.rb
+++ b/spec/lib/bulk_imports/pipeline_spec.rb
@@ -3,25 +3,25 @@
require 'spec_helper'
RSpec.describe BulkImports::Pipeline do
- describe 'pipeline attributes' do
- before do
- stub_const('BulkImports::Extractor', Class.new)
- stub_const('BulkImports::Transformer', Class.new)
- stub_const('BulkImports::Loader', Class.new)
-
- klass = Class.new do
- include BulkImports::Pipeline
+ before do
+ stub_const('BulkImports::Extractor', Class.new)
+ stub_const('BulkImports::Transformer', Class.new)
+ stub_const('BulkImports::Loader', Class.new)
- abort_on_failure!
+ klass = Class.new do
+ include BulkImports::Pipeline
- extractor BulkImports::Extractor, { foo: :bar }
- transformer BulkImports::Transformer, { foo: :bar }
- loader BulkImports::Loader, { foo: :bar }
- end
+ abort_on_failure!
- stub_const('BulkImports::MyPipeline', klass)
+ extractor BulkImports::Extractor, foo: :bar
+ transformer BulkImports::Transformer, foo: :bar
+ loader BulkImports::Loader, foo: :bar
end
+ stub_const('BulkImports::MyPipeline', klass)
+ end
+
+ describe 'pipeline attributes' do
describe 'getters' do
it 'retrieves class attributes' do
expect(BulkImports::MyPipeline.get_extractor).to eq({ klass: BulkImports::Extractor, options: { foo: :bar } })
@@ -29,6 +29,27 @@ RSpec.describe BulkImports::Pipeline do
expect(BulkImports::MyPipeline.get_loader).to eq({ klass: BulkImports::Loader, options: { foo: :bar } })
expect(BulkImports::MyPipeline.abort_on_failure?).to eq(true)
end
+
+ context 'when extractor and loader are defined within the pipeline' do
+ before do
+ klass = Class.new do
+ include BulkImports::Pipeline
+
+ def extract; end
+
+ def load; end
+ end
+
+ stub_const('BulkImports::AnotherPipeline', klass)
+ end
+
+ it 'returns itself when retrieving extractor & loader' do
+ pipeline = BulkImports::AnotherPipeline.new(nil)
+
+ expect(pipeline.send(:extractor)).to eq(pipeline)
+ expect(pipeline.send(:loader)).to eq(pipeline)
+ end
+ end
end
describe 'setters' do
@@ -54,4 +75,69 @@ RSpec.describe BulkImports::Pipeline do
end
end
end
+
+ describe '#instantiate' do
+ context 'when options are present' do
+ it 'instantiates new object with options' do
+ expect(BulkImports::Extractor).to receive(:new).with(foo: :bar)
+ expect(BulkImports::Transformer).to receive(:new).with(foo: :bar)
+ expect(BulkImports::Loader).to receive(:new).with(foo: :bar)
+
+ pipeline = BulkImports::MyPipeline.new(nil)
+
+ pipeline.send(:extractor)
+ pipeline.send(:transformers)
+ pipeline.send(:loader)
+ end
+ end
+
+ context 'when options are missing' do
+ before do
+ klass = Class.new do
+ include BulkImports::Pipeline
+
+ extractor BulkImports::Extractor
+ transformer BulkImports::Transformer
+ loader BulkImports::Loader
+ end
+
+ stub_const('BulkImports::NoOptionsPipeline', klass)
+ end
+
+ it 'instantiates new object without options' do
+ expect(BulkImports::Extractor).to receive(:new).with(no_args)
+ expect(BulkImports::Transformer).to receive(:new).with(no_args)
+ expect(BulkImports::Loader).to receive(:new).with(no_args)
+
+ pipeline = BulkImports::NoOptionsPipeline.new(nil)
+
+ pipeline.send(:extractor)
+ pipeline.send(:transformers)
+ pipeline.send(:loader)
+ end
+ end
+ end
+
+ describe '#transformers' do
+ before do
+ klass = Class.new do
+ include BulkImports::Pipeline
+
+ transformer BulkImports::Transformer
+
+ def transform; end
+ end
+
+ stub_const('BulkImports::TransformersPipeline', klass)
+ end
+
+ it 'has instance transform method first to run' do
+ transformer = double
+ allow(BulkImports::Transformer).to receive(:new).and_return(transformer)
+
+ pipeline = BulkImports::TransformersPipeline.new(nil)
+
+ expect(pipeline.send(:transformers)).to eq([pipeline, transformer])
+ end
+ end
end
diff --git a/spec/lib/error_tracking/sentry_client/api_urls_spec.rb b/spec/lib/error_tracking/sentry_client/api_urls_spec.rb
new file mode 100644
index 00000000000..bd701748dc2
--- /dev/null
+++ b/spec/lib/error_tracking/sentry_client/api_urls_spec.rb
@@ -0,0 +1,85 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ErrorTracking::SentryClient::ApiUrls do
+ let(:sentry_url) { 'https://sentrytest.gitlab.com/api/0/projects/sentry-org/sentry-project/' }
+ let(:token) { 'test-token' }
+ let(:issue_id) { '123456' }
+ let(:issue_id_with_reserved_chars) { '123$%' }
+ let(:escaped_issue_id) { '123%24%25' }
+ let(:api_urls) { described_class.new(sentry_url) }
+
+ # Sentry API returns 404 if there are extra slashes in the URL!
+ shared_examples 'correct url with extra slashes' do
+ let(:sentry_url) { 'https://sentrytest.gitlab.com/api/0/projects//sentry-org/sentry-project/' }
+
+ it_behaves_like 'correct url'
+ end
+
+ shared_examples 'correctly escapes issue ID' do
+ context 'with param a string with reserved chars' do
+ let(:issue_id) { issue_id_with_reserved_chars }
+
+ it { expect(subject.to_s).to include(escaped_issue_id) }
+ end
+
+ context 'with param a symbol with reserved chars' do
+ let(:issue_id) { issue_id_with_reserved_chars.to_sym }
+
+ it { expect(subject.to_s).to include(escaped_issue_id) }
+ end
+
+ context 'with param an integer' do
+ let(:issue_id) { 12345678 }
+
+ it { expect(subject.to_s).to include(issue_id.to_s) }
+ end
+ end
+
+ describe '#issues_url' do
+ subject { api_urls.issues_url }
+
+ shared_examples 'correct url' do
+ it { is_expected.to eq_uri('https://sentrytest.gitlab.com/api/0/projects/sentry-org/sentry-project/issues/') }
+ end
+
+ it_behaves_like 'correct url'
+ it_behaves_like 'correct url with extra slashes'
+ end
+
+ describe '#issue_url' do
+ subject { api_urls.issue_url(issue_id) }
+
+ shared_examples 'correct url' do
+ it { is_expected.to eq_uri("https://sentrytest.gitlab.com/api/0/issues/#{issue_id}/") }
+ end
+
+ it_behaves_like 'correct url'
+ it_behaves_like 'correct url with extra slashes'
+ it_behaves_like 'correctly escapes issue ID'
+ end
+
+ describe '#projects_url' do
+ subject { api_urls.projects_url }
+
+ shared_examples 'correct url' do
+ it { is_expected.to eq_uri('https://sentrytest.gitlab.com/api/0/projects/') }
+ end
+
+ it_behaves_like 'correct url'
+ it_behaves_like 'correct url with extra slashes'
+ end
+
+ describe '#issue_latest_event_url' do
+ subject { api_urls.issue_latest_event_url(issue_id) }
+
+ shared_examples 'correct url' do
+ it { is_expected.to eq_uri("https://sentrytest.gitlab.com/api/0/issues/#{issue_id}/events/latest/") }
+ end
+
+ it_behaves_like 'correct url'
+ it_behaves_like 'correct url with extra slashes'
+ it_behaves_like 'correctly escapes issue ID'
+ end
+end
diff --git a/spec/lib/error_tracking/sentry_client/event_spec.rb b/spec/lib/error_tracking/sentry_client/event_spec.rb
new file mode 100644
index 00000000000..64e674f1e9b
--- /dev/null
+++ b/spec/lib/error_tracking/sentry_client/event_spec.rb
@@ -0,0 +1,75 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ErrorTracking::SentryClient do
+ include SentryClientHelpers
+
+ let(:sentry_url) { 'https://sentrytest.gitlab.com/api/0/projects/sentry-org/sentry-project' }
+ let(:token) { 'test-token' }
+ let(:default_httparty_options) do
+ {
+ follow_redirects: false,
+ headers: { "Authorization" => "Bearer test-token" }
+ }
+ end
+
+ let(:client) { described_class.new(sentry_url, token) }
+
+ describe '#issue_latest_event' do
+ let(:sample_response) do
+ Gitlab::Utils.deep_indifferent_access(
+ Gitlab::Json.parse(fixture_file('sentry/issue_latest_event_sample_response.json'))
+ )
+ end
+
+ let(:issue_id) { '1234' }
+ let(:sentry_api_response) { sample_response }
+ let(:sentry_url) { 'https://sentrytest.gitlab.com/api/0' }
+ let(:sentry_request_url) { "#{sentry_url}/issues/#{issue_id}/events/latest/" }
+ let!(:sentry_api_request) { stub_sentry_request(sentry_request_url, body: sentry_api_response) }
+
+ subject { client.issue_latest_event(issue_id: issue_id) }
+
+ it_behaves_like 'calls sentry api'
+
+ it 'has correct return type' do
+ expect(subject).to be_a(Gitlab::ErrorTracking::ErrorEvent)
+ end
+
+ shared_examples 'assigns error tracking event correctly' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:event_object, :sentry_response) do
+ :issue_id | :groupID
+ :date_received | :dateReceived
+ end
+
+ with_them do
+ it { expect(subject.public_send(event_object)).to eq(sentry_api_response.dig(*sentry_response)) }
+ end
+ end
+
+ context 'error object created from sentry response' do
+ it_behaves_like 'assigns error tracking event correctly'
+
+ it 'parses the stack trace' do
+ expect(subject.stack_trace_entries).to be_a Array
+ expect(subject.stack_trace_entries).not_to be_empty
+ end
+
+ context 'error without stack trace' do
+ before do
+ sample_response['entries'] = []
+ stub_sentry_request(sentry_request_url, body: sample_response)
+ end
+
+ it_behaves_like 'assigns error tracking event correctly'
+
+ it 'returns an empty array for stack_trace_entries' do
+ expect(subject.stack_trace_entries).to eq []
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/error_tracking/sentry_client/issue_link_spec.rb b/spec/lib/error_tracking/sentry_client/issue_link_spec.rb
new file mode 100644
index 00000000000..f86d328ef89
--- /dev/null
+++ b/spec/lib/error_tracking/sentry_client/issue_link_spec.rb
@@ -0,0 +1,65 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ErrorTracking::SentryClient::IssueLink do
+ include SentryClientHelpers
+
+ let_it_be(:sentry_url) { 'https://sentrytest.gitlab.com/api/0/projects/sentry-org/sentry-project' }
+ let_it_be(:error_tracking_setting) { create(:project_error_tracking_setting, api_url: sentry_url) }
+ let_it_be(:issue) { create(:issue, project: error_tracking_setting.project) }
+
+ let(:client) { error_tracking_setting.sentry_client }
+ let(:sentry_issue_id) { 11111111 }
+
+ describe '#create_issue_link' do
+ let(:sentry_issue_link_url) { "https://sentrytest.gitlab.com/api/0/groups/#{sentry_issue_id}/integrations/#{integration_id}/" }
+ let(:integration_id) { 44444 }
+
+ let(:issue_link_sample_response) { Gitlab::Json.parse(fixture_file('sentry/global_integration_link_sample_response.json')) }
+ let(:sentry_api_response) { issue_link_sample_response }
+ let!(:sentry_api_request) { stub_sentry_request(sentry_issue_link_url, :put, body: sentry_api_response, status: 201) }
+
+ subject { client.create_issue_link(integration_id, sentry_issue_id, issue) }
+
+ it_behaves_like 'calls sentry api'
+
+ it { is_expected.to be_present }
+
+ context 'redirects' do
+ let(:sentry_api_url) { sentry_issue_link_url }
+
+ it_behaves_like 'no Sentry redirects', :put
+ end
+
+ context 'when exception is raised' do
+ let(:sentry_request_url) { sentry_issue_link_url }
+
+ it_behaves_like 'maps Sentry exceptions', :put
+ end
+
+ context 'when integration_id is not provided' do
+ let(:sentry_issue_link_url) { "https://sentrytest.gitlab.com/api/0/issues/#{sentry_issue_id}/plugins/gitlab/link/" }
+ let(:integration_id) { nil }
+
+ let(:issue_link_sample_response) { Gitlab::Json.parse(fixture_file('sentry/plugin_link_sample_response.json')) }
+ let!(:sentry_api_request) { stub_sentry_request(sentry_issue_link_url, :post, body: sentry_api_response) }
+
+ it_behaves_like 'calls sentry api'
+
+ it { is_expected.to be_present }
+
+ context 'redirects' do
+ let(:sentry_api_url) { sentry_issue_link_url }
+
+ it_behaves_like 'no Sentry redirects', :post
+ end
+
+ context 'when exception is raised' do
+ let(:sentry_request_url) { sentry_issue_link_url }
+
+ it_behaves_like 'maps Sentry exceptions', :post
+ end
+ 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
new file mode 100644
index 00000000000..e54296c58e0
--- /dev/null
+++ b/spec/lib/error_tracking/sentry_client/issue_spec.rb
@@ -0,0 +1,330 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ErrorTracking::SentryClient::Issue do
+ include SentryClientHelpers
+
+ let(:token) { 'test-token' }
+ let(:sentry_url) { 'https://sentrytest.gitlab.com/api/0' }
+ let(:client) { ErrorTracking::SentryClient.new(sentry_url, token) }
+ let(:issue_id) { 11 }
+
+ 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) )
+ end
+ end
+
+ shared_examples 'issues have correct length' do |length|
+ it { expect(subject[:issues].length).to eq(length) }
+ end
+
+ let(:issues_sample_response) do
+ Gitlab::Utils.deep_indifferent_access(
+ Gitlab::Json.parse(fixture_file('sentry/issues_sample_response.json'))
+ )
+ end
+
+ let(:default_httparty_options) do
+ {
+ follow_redirects: false,
+ headers: { 'Content-Type' => 'application/json', 'Authorization' => "Bearer test-token" }
+ }
+ end
+
+ let(:sentry_url) { 'https://sentrytest.gitlab.com/api/0/projects/sentry-org/sentry-project' }
+ let(:issue_status) { 'unresolved' }
+ let(:limit) { 20 }
+ let(:search_term) { '' }
+ 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_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) }
+
+ it_behaves_like 'calls sentry api'
+
+ it_behaves_like 'issues have correct return type', Gitlab::ErrorTracking::Error
+ it_behaves_like 'issues have correct length', 3
+
+ shared_examples 'has correct external_url' do
+ context '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
+ end
+ end
+
+ 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"'
+ }
+ end
+
+ let!(:sentry_api_request) { stub_sentry_request(sentry_request_url, body: sentry_api_response, headers: headers) }
+
+ it 'parses the pagination' do
+ expect(subject[:pagination]).to eq(
+ 'previous' => { 'cursor' => '1573556671000:0:1' },
+ 'next' => { 'cursor' => '1572959139000:0:0' }
+ )
+ end
+ end
+
+ context 'error object created from sentry response' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:error_object, :sentry_response) do
+ :id | :id
+ :first_seen | :firstSeen
+ :last_seen | :lastSeen
+ :title | :title
+ :type | :type
+ :user_count | :userCount
+ :count | :count
+ :message | [:metadata, :value]
+ :culprit | :culprit
+ :short_id | :shortId
+ :status | :status
+ :frequency | [:stats, '24h']
+ :project_id | [:project, :id]
+ :project_name | [:project, :name]
+ :project_slug | [:project, :slug]
+ end
+
+ with_them do
+ it { expect(subject[:issues][0].public_send(error_object)).to eq(sentry_api_response[0].dig(*sentry_response)) }
+ end
+
+ it_behaves_like 'has correct external_url'
+ end
+
+ context '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
+ let(:sentry_request_url) do
+ 'https://sentrytest.gitlab.com/api/0/projects/sentry-org/sentry-project/' \
+ 'issues/?limit=20&query=is:unresolved&sort=freq'
+ end
+
+ let!(:sentry_api_request) { stub_sentry_request(sentry_request_url, body: sentry_api_response) }
+
+ subject { client.list_issues(issue_status: issue_status, limit: limit, sort: 'frequency') }
+
+ it 'calls the sentry api with sort params' do
+ expect(Gitlab::HTTP).to receive(:get).with(
+ URI("#{sentry_url}/issues/"),
+ default_httparty_options.merge(query: { limit: 20, query: "is:unresolved", sort: "freq" })
+ ).and_call_original
+
+ subject
+
+ expect(sentry_api_request).to have_been_requested
+ end
+ end
+
+ context 'with invalid sort params' do
+ subject { client.list_issues(issue_status: issue_status, limit: limit, sort: 'fish') }
+
+ it 'throws an error' do
+ expect { subject }.to raise_error(ErrorTracking::SentryClient::BadRequestError, 'Invalid value for sort param')
+ end
+ end
+
+ context '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)
+ issue
+ end
+ end
+
+ it_behaves_like 'calls sentry api'
+
+ it_behaves_like 'issues have correct return type', Gitlab::ErrorTracking::Error
+ it_behaves_like 'issues have correct length', 1
+
+ it_behaves_like 'has correct external_url'
+ end
+
+ context 'essential keys missing in API response' do
+ let(:sentry_api_response) do
+ issues_sample_response[0...1].map do |issue|
+ issue.except(:id)
+ end
+ end
+
+ it 'raises exception' do
+ 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
+ it 'raises exception' do
+ deep_size = 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.')
+ end
+ end
+
+ it_behaves_like 'maps Sentry exceptions'
+
+ context 'when search term is present' do
+ let(:search_term) { 'NoMethodError' }
+ let(:sentry_request_url) { "#{sentry_url}/issues/?limit=20&query=is:unresolved NoMethodError" }
+
+ it_behaves_like 'calls sentry api'
+
+ it_behaves_like 'issues have correct return type', Gitlab::ErrorTracking::Error
+ it_behaves_like 'issues have correct length', 3
+ end
+
+ context 'when cursor is present' do
+ let(:cursor) { '1572959139000:0:0' }
+ let(:sentry_request_url) { "#{sentry_url}/issues/?limit=20&cursor=#{cursor}&query=is:unresolved" }
+
+ it_behaves_like 'calls sentry api'
+
+ it_behaves_like 'issues have correct return type', Gitlab::ErrorTracking::Error
+ it_behaves_like 'issues have correct length', 3
+ end
+ end
+
+ describe '#issue_details' do
+ let(:issue_sample_response) do
+ Gitlab::Utils.deep_indifferent_access(
+ Gitlab::Json.parse(fixture_file('sentry/issue_sample_response.json'))
+ )
+ end
+
+ let(:sentry_request_url) { "#{sentry_url}/issues/#{issue_id}/" }
+ let!(:sentry_api_request) { stub_sentry_request(sentry_request_url, body: issue_sample_response) }
+
+ subject { client.issue_details(issue_id: issue_id) }
+
+ context 'error object created from sentry response' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:error_object, :sentry_response) do
+ :id | :id
+ :first_seen | :firstSeen
+ :last_seen | :lastSeen
+ :title | :title
+ :type | :type
+ :user_count | :userCount
+ :count | :count
+ :message | [:metadata, :value]
+ :culprit | :culprit
+ :short_id | :shortId
+ :status | :status
+ :frequency | [:stats, '24h']
+ :project_id | [:project, :id]
+ :project_name | [:project, :name]
+ :project_slug | [:project, :slug]
+ :first_release_last_commit | [:firstRelease, :lastCommit]
+ :last_release_last_commit | [:lastRelease, :lastCommit]
+ :first_release_short_version | [:firstRelease, :shortVersion]
+ :last_release_short_version | [:lastRelease, :shortVersion]
+ :first_release_version | [:firstRelease, :version]
+ :last_release_version | [:lastRelease, :version]
+ end
+
+ with_them do
+ it do
+ expect(subject.public_send(error_object)).to eq(issue_sample_response.dig(*sentry_response))
+ end
+ end
+
+ it 'has a correct external URL' do
+ expect(subject.external_url).to eq('https://sentrytest.gitlab.com/api/0/issues/11')
+ end
+
+ it 'issue has a correct external base url' do
+ expect(subject.external_base_url).to eq('https://sentrytest.gitlab.com/api/0')
+ end
+
+ it 'has a correct GitLab issue url' do
+ expect(subject.gitlab_issue).to eq('https://gitlab.com/gitlab-org/gitlab/issues/1')
+ end
+
+ context 'when issue annotations exist' do
+ before do
+ issue_sample_response['annotations'] = [
+ nil,
+ '',
+ "<a href=\"http://github.com/issues/6\">github-issue-6</a>",
+ "<div>annotation</a>",
+ "<a href=\"http://localhost/gitlab-org/gitlab/issues/2\">gitlab-org/gitlab#2</a>"
+ ]
+ stub_sentry_request(sentry_request_url, body: issue_sample_response)
+ end
+
+ it 'has a correct GitLab issue url' do
+ expect(subject.gitlab_issue).to eq('http://localhost/gitlab-org/gitlab/issues/2')
+ end
+ end
+
+ context 'when no GitLab issue is linked' do
+ before do
+ issue_sample_response['pluginIssues'] = []
+ stub_sentry_request(sentry_request_url, body: issue_sample_response)
+ end
+
+ it 'does not find a GitLab issue' do
+ expect(subject.gitlab_issue).to be_nil
+ end
+ end
+
+ it 'has the correct tags' do
+ expect(subject.tags).to eq({ level: issue_sample_response['level'], logger: issue_sample_response['logger'] })
+ end
+ end
+ end
+
+ 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
+
+ subject { client.update_issue(issue_id: issue_id, params: params) }
+
+ it_behaves_like 'calls sentry api' do
+ let(:sentry_api_request) { stub_sentry_request(sentry_request_url, :put) }
+ end
+
+ it 'returns a truthy result' do
+ expect(subject).to be_truthy
+ end
+
+ context 'error encountered' do
+ let(:error) { StandardError.new('error') }
+
+ before do
+ allow(client).to receive(:update_issue).and_raise(error)
+ end
+
+ it 'raises the error' do
+ expect { subject }.to raise_error(error)
+ end
+ end
+ end
+end
diff --git a/spec/lib/error_tracking/sentry_client/pagination_parser_spec.rb b/spec/lib/error_tracking/sentry_client/pagination_parser_spec.rb
new file mode 100644
index 00000000000..c4b771d5b93
--- /dev/null
+++ b/spec/lib/error_tracking/sentry_client/pagination_parser_spec.rb
@@ -0,0 +1,60 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+
+RSpec.describe ErrorTracking::SentryClient::PaginationParser do
+ describe '.parse' do
+ subject { described_class.parse(headers) }
+
+ context 'when headers do not have "link" param' do
+ let(:headers) { {} }
+
+ it 'returns empty hash' do
+ is_expected.to eq({})
+ end
+ end
+
+ context 'when headers.link has previous and next pages' 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"'
+ }
+ end
+
+ it 'returns info about both pages' do
+ is_expected.to eq(
+ 'previous' => { 'cursor' => '1573556671000:0:1' },
+ 'next' => { 'cursor' => '1572959139000:0:0' }
+ )
+ end
+ end
+
+ context 'when headers.link has only next page' do
+ let(:headers) do
+ {
+ 'link' => '<https://sentrytest.gitlab.com>; rel="previous"; results="false"; cursor="1573556671000:0:1", <https://sentrytest.gitlab.com>; rel="next"; results="true"; cursor="1572959139000:0:0"'
+ }
+ end
+
+ it 'returns only info about the next page' do
+ is_expected.to eq(
+ 'next' => { 'cursor' => '1572959139000:0:0' }
+ )
+ end
+ end
+
+ context 'when headers.link has only previous page' do
+ let(:headers) do
+ {
+ 'link' => '<https://sentrytest.gitlab.com>; rel="previous"; results="true"; cursor="1573556671000:0:1", <https://sentrytest.gitlab.com>; rel="next"; results="false"; cursor="1572959139000:0:0"'
+ }
+ end
+
+ it 'returns only info about the previous page' do
+ is_expected.to eq(
+ 'previous' => { 'cursor' => '1573556671000:0:1' }
+ )
+ end
+ end
+ end
+end
diff --git a/spec/lib/error_tracking/sentry_client/projects_spec.rb b/spec/lib/error_tracking/sentry_client/projects_spec.rb
new file mode 100644
index 00000000000..247f9c1c085
--- /dev/null
+++ b/spec/lib/error_tracking/sentry_client/projects_spec.rb
@@ -0,0 +1,100 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ErrorTracking::SentryClient::Projects do
+ include SentryClientHelpers
+
+ let(:sentry_url) { 'https://sentrytest.gitlab.com/api/0/projects/sentry-org/sentry-project' }
+ let(:token) { 'test-token' }
+ let(:client) { ErrorTracking::SentryClient.new(sentry_url, token) }
+ let(:projects_sample_response) do
+ Gitlab::Utils.deep_indifferent_access(
+ Gitlab::Json.parse(fixture_file('sentry/list_projects_sample_response.json'))
+ )
+ end
+
+ shared_examples 'has correct return type' do |klass|
+ it "returns objects of type #{klass}" do
+ expect(subject).to all( be_a(klass) )
+ end
+ end
+
+ shared_examples 'has correct length' do |length|
+ it { expect(subject.length).to eq(length) }
+ end
+
+ describe '#projects' do
+ let(:sentry_list_projects_url) { 'https://sentrytest.gitlab.com/api/0/projects/' }
+ let(:sentry_api_response) { projects_sample_response }
+ let!(:sentry_api_request) { stub_sentry_request(sentry_list_projects_url, body: sentry_api_response) }
+
+ subject { client.projects }
+
+ it_behaves_like 'calls sentry api'
+
+ it_behaves_like 'has correct return type', Gitlab::ErrorTracking::Project
+ it_behaves_like 'has correct length', 2
+
+ context 'essential keys missing in API response' do
+ let(:sentry_api_response) do
+ projects_sample_response[0...1].map do |project|
+ project.except(:slug)
+ end
+ end
+
+ it 'raises exception' do
+ expect { subject }.to raise_error(ErrorTracking::SentryClient::MissingKeysError, 'Sentry API response is missing keys. key not found: "slug"')
+ end
+ end
+
+ context 'optional keys missing in sentry response' do
+ let(:sentry_api_response) do
+ projects_sample_response[0...1].map do |project|
+ project[:organization].delete(:id)
+ project.delete(:id)
+ project.except(:status)
+ end
+ end
+
+ it_behaves_like 'calls sentry api'
+
+ it_behaves_like 'has correct return type', Gitlab::ErrorTracking::Project
+ it_behaves_like 'has correct length', 1
+ end
+
+ context 'error object created from sentry response' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:sentry_project_object, :sentry_response) do
+ :id | :id
+ :name | :name
+ :status | :status
+ :slug | :slug
+ :organization_name | [:organization, :name]
+ :organization_id | [:organization, :id]
+ :organization_slug | [:organization, :slug]
+ end
+
+ with_them do
+ it do
+ expect(subject[0].public_send(sentry_project_object)).to(
+ eq(sentry_api_response[0].dig(*sentry_response))
+ )
+ end
+ end
+ end
+
+ context 'redirects' do
+ let(:sentry_api_url) { sentry_list_projects_url }
+
+ it_behaves_like 'no Sentry redirects'
+ end
+
+ context 'when exception is raised' do
+ let(:sentry_request_url) { sentry_list_projects_url }
+
+ it_behaves_like 'maps Sentry exceptions'
+ end
+ end
+end
diff --git a/spec/lib/error_tracking/sentry_client/repo_spec.rb b/spec/lib/error_tracking/sentry_client/repo_spec.rb
new file mode 100644
index 00000000000..9a1c7a69c3d
--- /dev/null
+++ b/spec/lib/error_tracking/sentry_client/repo_spec.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ErrorTracking::SentryClient::Repo do
+ include SentryClientHelpers
+
+ let(:sentry_url) { 'https://sentrytest.gitlab.com/api/0/projects/sentry-org/sentry-project' }
+ let(:token) { 'test-token' }
+ let(:client) { ErrorTracking::SentryClient.new(sentry_url, token) }
+ let(:repos_sample_response) { Gitlab::Json.parse(fixture_file('sentry/repos_sample_response.json')) }
+
+ describe '#repos' do
+ let(:organization_slug) { 'gitlab' }
+ let(:sentry_repos_url) { "https://sentrytest.gitlab.com/api/0/organizations/#{organization_slug}/repos/" }
+ let(:sentry_api_response) { repos_sample_response }
+ let!(:sentry_api_request) { stub_sentry_request(sentry_repos_url, body: sentry_api_response) }
+
+ subject { client.repos(organization_slug) }
+
+ it_behaves_like 'calls sentry api'
+
+ it { is_expected.to all( be_a(Gitlab::ErrorTracking::Repo)) }
+
+ it { expect(subject.length).to eq(1) }
+
+ context 'redirects' do
+ let(:sentry_api_url) { sentry_repos_url }
+
+ it_behaves_like 'no Sentry redirects'
+ end
+
+ context 'when exception is raised' do
+ let(:sentry_request_url) { sentry_repos_url }
+
+ it_behaves_like 'maps Sentry exceptions'
+ end
+ end
+end
diff --git a/spec/lib/error_tracking/sentry_client_spec.rb b/spec/lib/error_tracking/sentry_client_spec.rb
new file mode 100644
index 00000000000..9ffd756f057
--- /dev/null
+++ b/spec/lib/error_tracking/sentry_client_spec.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ErrorTracking::SentryClient do
+ let(:sentry_url) { 'https://sentrytest.gitlab.com/api/0/projects/sentry-org/sentry-project' }
+ let(:token) { 'test-token' }
+
+ subject { described_class.new(sentry_url, token) }
+
+ it { is_expected.to respond_to :projects }
+ it { is_expected.to respond_to :list_issues }
+ it { is_expected.to respond_to :issue_details }
+ it { is_expected.to respond_to :issue_latest_event }
+ it { is_expected.to respond_to :repos }
+ it { is_expected.to respond_to :create_issue_link }
+end
diff --git a/spec/lib/expand_variables_spec.rb b/spec/lib/expand_variables_spec.rb
index b603325cdb8..407187ea05f 100644
--- a/spec/lib/expand_variables_spec.rb
+++ b/spec/lib/expand_variables_spec.rb
@@ -82,6 +82,13 @@ RSpec.describe ExpandVariables do
value: 'key$variable',
result: 'keyvalue',
variables: -> { [{ key: 'variable', value: 'value' }] }
+ },
+ "simple expansion using Collection": {
+ value: 'key$variable',
+ result: 'keyvalue',
+ variables: Gitlab::Ci::Variables::Collection.new([
+ { key: 'variable', value: 'value' }
+ ])
}
}
end
diff --git a/spec/lib/feature_spec.rb b/spec/lib/feature_spec.rb
index 1bcb2223012..3e158391d7f 100644
--- a/spec/lib/feature_spec.rb
+++ b/spec/lib/feature_spec.rb
@@ -269,7 +269,7 @@ RSpec.describe Feature, stub_feature_flags: false do
end
it 'when invalid type is used' do
- expect { described_class.enabled?(:my_feature_flag, type: :licensed) }
+ expect { described_class.enabled?(:my_feature_flag, type: :ops) }
.to raise_error(/The `type:` of/)
end
diff --git a/spec/lib/generators/gitlab/usage_metric_definition_generator_spec.rb b/spec/lib/generators/gitlab/usage_metric_definition_generator_spec.rb
new file mode 100644
index 00000000000..b62eac14e3e
--- /dev/null
+++ b/spec/lib/generators/gitlab/usage_metric_definition_generator_spec.rb
@@ -0,0 +1,75 @@
+# frozen_string_literal: true
+
+require 'generator_helper'
+
+RSpec.describe Gitlab::UsageMetricDefinitionGenerator do
+ describe 'Validation' do
+ let(:key_path) { 'counter.category.event' }
+ let(:dir) { '7d' }
+ let(:options) { [key_path, '--dir', dir, '--pretend'] }
+
+ subject { described_class.start(options) }
+
+ it 'does not raise an error' do
+ expect { subject }.not_to raise_error
+ end
+
+ context 'with a missing directory' do
+ let(:options) { [key_path, '--pretend'] }
+
+ it 'raises an error' do
+ expect { subject }.to raise_error(RuntimeError)
+ end
+ end
+
+ context 'with an invalid directory' do
+ let(:dir) { '8d' }
+
+ it 'raises an error' do
+ expect { subject }.to raise_error(RuntimeError)
+ end
+ end
+
+ context 'with an already existing metric with the same key_path' do
+ before do
+ allow(Gitlab::Usage::MetricDefinition).to receive(:definitions).and_return(Hash[key_path, 'definition'])
+ end
+
+ it 'raises an error' do
+ expect { subject }.to raise_error(RuntimeError)
+ end
+ end
+ end
+
+ describe 'Name suggestions' do
+ let(:temp_dir) { Dir.mktmpdir }
+
+ before do
+ stub_const("#{described_class}::TOP_LEVEL_DIR", temp_dir)
+ end
+
+ context 'with product_intelligence_metrics_names_suggestions feature ON' do
+ it 'adds name key to metric definition' do
+ stub_feature_flags(product_intelligence_metrics_names_suggestions: true)
+
+ expect(::Gitlab::Usage::Metrics::NamesSuggestions::Generator).to receive(:generate).and_return('some name')
+ described_class.new(['counts_weekly.test_metric'], { 'dir' => '7d' }).invoke_all
+ metric_definition_path = Dir.glob(File.join(temp_dir, 'metrics/counts_7d/*_test_metric.yml')).first
+
+ expect(YAML.safe_load(File.read(metric_definition_path))).to include("name" => "some name")
+ end
+ end
+
+ context 'with product_intelligence_metrics_names_suggestions feature OFF' do
+ it 'adds name key to metric definition' do
+ stub_feature_flags(product_intelligence_metrics_names_suggestions: false)
+
+ expect(::Gitlab::Usage::Metrics::NamesSuggestions::Generator).not_to receive(:generate)
+ described_class.new(['counts_weekly.test_metric'], { 'dir' => '7d' }).invoke_all
+ metric_definition_path = Dir.glob(File.join(temp_dir, 'metrics/counts_7d/*_test_metric.yml')).first
+
+ expect(YAML.safe_load(File.read(metric_definition_path)).keys).not_to include(:name)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/alert_management/payload/generic_spec.rb b/spec/lib/gitlab/alert_management/payload/generic_spec.rb
index d022c629458..b0c238c62c8 100644
--- a/spec/lib/gitlab/alert_management/payload/generic_spec.rb
+++ b/spec/lib/gitlab/alert_management/payload/generic_spec.rb
@@ -13,7 +13,7 @@ RSpec.describe Gitlab::AlertManagement::Payload::Generic do
describe '#title' do
subject { parsed_payload.title }
- it_behaves_like 'parsable alert payload field with fallback', 'New: Incident', 'title'
+ it_behaves_like 'parsable alert payload field with fallback', 'New: Alert', 'title'
end
describe '#severity' do
diff --git a/spec/lib/gitlab/analytics/cycle_analytics/average_spec.rb b/spec/lib/gitlab/analytics/cycle_analytics/average_spec.rb
new file mode 100644
index 00000000000..e2fdd4918d5
--- /dev/null
+++ b/spec/lib/gitlab/analytics/cycle_analytics/average_spec.rb
@@ -0,0 +1,66 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Analytics::CycleAnalytics::Average do
+ let_it_be(:project) { create(:project) }
+
+ let_it_be(:issue_1) do
+ # Duration: 10 days
+ create(:issue, project: project, created_at: 20.days.ago).tap do |issue|
+ issue.metrics.update!(first_mentioned_in_commit_at: 10.days.ago)
+ end
+ end
+
+ let_it_be(:issue_2) do
+ # Duration: 5 days
+ create(:issue, project: project, created_at: 20.days.ago).tap do |issue|
+ issue.metrics.update!(first_mentioned_in_commit_at: 15.days.ago)
+ end
+ end
+
+ let(:stage) do
+ build(
+ :cycle_analytics_project_stage,
+ start_event_identifier: Gitlab::Analytics::CycleAnalytics::StageEvents::IssueCreated.identifier,
+ end_event_identifier: Gitlab::Analytics::CycleAnalytics::StageEvents::IssueFirstMentionedInCommit.identifier,
+ project: project
+ )
+ end
+
+ let(:query) { Issue.joins(:metrics).in_projects(project.id) }
+
+ around do |example|
+ freeze_time { example.run }
+ end
+
+ subject(:average) { described_class.new(stage: stage, query: query) }
+
+ describe '#seconds' do
+ subject(:average_duration_in_seconds) { average.seconds }
+
+ context 'when no results' do
+ let(:query) { Issue.none }
+
+ it { is_expected.to eq(nil) }
+ end
+
+ context 'returns the average duration in seconds' do
+ it { is_expected.to be_within(0.5).of(7.5.days.to_f) }
+ end
+ end
+
+ describe '#days' do
+ subject(:average_duration_in_days) { average.days }
+
+ context 'when no results' do
+ let(:query) { Issue.none }
+
+ it { is_expected.to eq(nil) }
+ end
+
+ context 'returns the average duration in days' do
+ it { is_expected.to be_within(0.01).of(7.5) }
+ end
+ end
+end
diff --git a/spec/lib/gitlab/analytics/cycle_analytics/sorting_spec.rb b/spec/lib/gitlab/analytics/cycle_analytics/sorting_spec.rb
new file mode 100644
index 00000000000..8f5be709a11
--- /dev/null
+++ b/spec/lib/gitlab/analytics/cycle_analytics/sorting_spec.rb
@@ -0,0 +1,58 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Analytics::CycleAnalytics::Sorting do
+ let(:stage) { build(:cycle_analytics_project_stage, start_event_identifier: :merge_request_created, end_event_identifier: :merge_request_merged) }
+
+ subject(:order_values) { described_class.apply(MergeRequest.joins(:metrics), stage, sort, direction).order_values }
+
+ context 'when invalid sorting params are given' do
+ let(:sort) { :unknown_sort }
+ let(:direction) { :unknown_direction }
+
+ it 'falls back to end_event DESC sorting' do
+ expect(order_values).to eq([stage.end_event.timestamp_projection.desc])
+ end
+ end
+
+ context 'sorting end_event' do
+ let(:sort) { :end_event }
+
+ context 'direction desc' do
+ let(:direction) { :desc }
+
+ specify do
+ expect(order_values).to eq([stage.end_event.timestamp_projection.desc])
+ end
+ end
+
+ context 'direction asc' do
+ let(:direction) { :asc }
+
+ specify do
+ expect(order_values).to eq([stage.end_event.timestamp_projection.asc])
+ end
+ end
+ end
+
+ context 'sorting duration' do
+ let(:sort) { :duration }
+
+ context 'direction desc' do
+ let(:direction) { :desc }
+
+ specify do
+ expect(order_values).to eq([Arel::Nodes::Subtraction.new(stage.end_event.timestamp_projection, stage.start_event.timestamp_projection).desc])
+ end
+ end
+
+ context 'direction asc' do
+ let(:direction) { :asc }
+
+ specify do
+ expect(order_values).to eq([Arel::Nodes::Subtraction.new(stage.end_event.timestamp_projection, stage.start_event.timestamp_projection).asc])
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/analytics/instance_statistics/workers_argument_builder_spec.rb b/spec/lib/gitlab/analytics/instance_statistics/workers_argument_builder_spec.rb
deleted file mode 100644
index 115c8145f59..00000000000
--- a/spec/lib/gitlab/analytics/instance_statistics/workers_argument_builder_spec.rb
+++ /dev/null
@@ -1,81 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Analytics::InstanceStatistics::WorkersArgumentBuilder do
- context 'when no measurement identifiers are given' do
- it 'returns empty array' do
- expect(described_class.new(measurement_identifiers: []).execute).to be_empty
- end
- end
-
- context 'when measurement identifiers are given' do
- let_it_be(:user_1) { create(:user) }
- let_it_be(:project_1) { create(:project, namespace: user_1.namespace, creator: user_1) }
- let_it_be(:project_2) { create(:project, namespace: user_1.namespace, creator: user_1) }
- let_it_be(:project_3) { create(:project, namespace: user_1.namespace, creator: user_1) }
-
- let(:recorded_at) { 2.days.ago }
- let(:projects_measurement_identifier) { ::Analytics::InstanceStatistics::Measurement.identifiers.fetch(:projects) }
- let(:users_measurement_identifier) { ::Analytics::InstanceStatistics::Measurement.identifiers.fetch(:users) }
- let(:measurement_identifiers) { [projects_measurement_identifier, users_measurement_identifier] }
-
- subject { described_class.new(measurement_identifiers: measurement_identifiers, recorded_at: recorded_at).execute }
-
- it 'returns worker arguments' do
- expect(subject).to eq([
- [projects_measurement_identifier, project_1.id, project_3.id, recorded_at],
- [users_measurement_identifier, user_1.id, user_1.id, recorded_at]
- ])
- end
-
- context 'when bogus measurement identifiers are given' do
- before do
- measurement_identifiers << 'bogus1'
- measurement_identifiers << 'bogus2'
- end
-
- it 'skips bogus measurement identifiers' do
- expect(subject).to eq([
- [projects_measurement_identifier, project_1.id, project_3.id, recorded_at],
- [users_measurement_identifier, user_1.id, user_1.id, recorded_at]
- ])
- end
- end
-
- context 'when custom min and max queries are present' do
- let(:min_id) { User.second.id }
- let(:max_id) { User.maximum(:id) }
- let(:users_measurement_identifier) { ::Analytics::InstanceStatistics::Measurement.identifiers.fetch(:users) }
-
- before do
- create_list(:user, 2)
-
- min_max_queries = {
- ::Analytics::InstanceStatistics::Measurement.identifiers[:users] => {
- minimum_query: -> { min_id },
- maximum_query: -> { max_id }
- }
- }
-
- allow(::Analytics::InstanceStatistics::Measurement).to receive(:identifier_min_max_queries) { min_max_queries }
- end
-
- subject do
- described_class.new(measurement_identifiers: [users_measurement_identifier], recorded_at: recorded_at)
- .execute
- end
-
- it 'uses custom min/max for ids' do
- expect(subject).to eq([
- [
- users_measurement_identifier,
- min_id,
- max_id,
- recorded_at
- ]
- ])
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/analytics/usage_trends/workers_argument_builder_spec.rb b/spec/lib/gitlab/analytics/usage_trends/workers_argument_builder_spec.rb
new file mode 100644
index 00000000000..34c5bd6c6ae
--- /dev/null
+++ b/spec/lib/gitlab/analytics/usage_trends/workers_argument_builder_spec.rb
@@ -0,0 +1,81 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Analytics::UsageTrends::WorkersArgumentBuilder do
+ context 'when no measurement identifiers are given' do
+ it 'returns empty array' do
+ expect(described_class.new(measurement_identifiers: []).execute).to be_empty
+ end
+ end
+
+ context 'when measurement identifiers are given' do
+ let_it_be(:user_1) { create(:user) }
+ let_it_be(:project_1) { create(:project, namespace: user_1.namespace, creator: user_1) }
+ let_it_be(:project_2) { create(:project, namespace: user_1.namespace, creator: user_1) }
+ let_it_be(:project_3) { create(:project, namespace: user_1.namespace, creator: user_1) }
+
+ let(:recorded_at) { 2.days.ago }
+ let(:projects_measurement_identifier) { ::Analytics::UsageTrends::Measurement.identifiers.fetch(:projects) }
+ let(:users_measurement_identifier) { ::Analytics::UsageTrends::Measurement.identifiers.fetch(:users) }
+ let(:measurement_identifiers) { [projects_measurement_identifier, users_measurement_identifier] }
+
+ subject { described_class.new(measurement_identifiers: measurement_identifiers, recorded_at: recorded_at).execute }
+
+ it 'returns worker arguments' do
+ expect(subject).to eq([
+ [projects_measurement_identifier, project_1.id, project_3.id, recorded_at],
+ [users_measurement_identifier, user_1.id, user_1.id, recorded_at]
+ ])
+ end
+
+ context 'when bogus measurement identifiers are given' do
+ before do
+ measurement_identifiers << 'bogus1'
+ measurement_identifiers << 'bogus2'
+ end
+
+ it 'skips bogus measurement identifiers' do
+ expect(subject).to eq([
+ [projects_measurement_identifier, project_1.id, project_3.id, recorded_at],
+ [users_measurement_identifier, user_1.id, user_1.id, recorded_at]
+ ])
+ end
+ end
+
+ context 'when custom min and max queries are present' do
+ let(:min_id) { User.second.id }
+ let(:max_id) { User.maximum(:id) }
+ let(:users_measurement_identifier) { ::Analytics::UsageTrends::Measurement.identifiers.fetch(:users) }
+
+ before do
+ create_list(:user, 2)
+
+ min_max_queries = {
+ ::Analytics::UsageTrends::Measurement.identifiers[:users] => {
+ minimum_query: -> { min_id },
+ maximum_query: -> { max_id }
+ }
+ }
+
+ allow(::Analytics::UsageTrends::Measurement).to receive(:identifier_min_max_queries) { min_max_queries }
+ end
+
+ subject do
+ described_class.new(measurement_identifiers: [users_measurement_identifier], recorded_at: recorded_at)
+ .execute
+ end
+
+ it 'uses custom min/max for ids' do
+ expect(subject).to eq([
+ [
+ users_measurement_identifier,
+ min_id,
+ max_id,
+ recorded_at
+ ]
+ ])
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/application_context_spec.rb b/spec/lib/gitlab/application_context_spec.rb
index 88f865adea7..0fbbc67ef6a 100644
--- a/spec/lib/gitlab/application_context_spec.rb
+++ b/spec/lib/gitlab/application_context_spec.rb
@@ -30,7 +30,7 @@ RSpec.describe Gitlab::ApplicationContext do
describe '.push' do
it 'passes the expected context on to labkit' do
fake_proc = duck_type(:call)
- expected_context = { user: fake_proc }
+ expected_context = { user: fake_proc, client_id: fake_proc }
expect(Labkit::Context).to receive(:push).with(expected_context)
@@ -92,6 +92,34 @@ RSpec.describe Gitlab::ApplicationContext do
expect(result(context))
.to include(project: project.full_path, root_namespace: project.full_path_components.first)
end
+
+ describe 'setting the client' do
+ let_it_be(:remote_ip) { '127.0.0.1' }
+ let_it_be(:runner) { create(:ci_runner) }
+ let_it_be(:options) { { remote_ip: remote_ip, runner: runner, user: user } }
+
+ using RSpec::Parameterized::TableSyntax
+
+ where(:provided_options, :client) do
+ [:remote_ip] | :remote_ip
+ [:remote_ip, :runner] | :runner
+ [:remote_ip, :runner, :user] | :user
+ end
+
+ with_them do
+ it 'sets the client_id to the expected value' do
+ context = described_class.new(**options.slice(*provided_options))
+
+ client_id = case client
+ when :remote_ip then "ip/#{remote_ip}"
+ when :runner then "runner/#{runner.id}"
+ when :user then "user/#{user.id}"
+ end
+
+ expect(result(context)[:client_id]).to eq(client_id)
+ end
+ 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 6c6cee9c273..7a8e6e77d52 100644
--- a/spec/lib/gitlab/auth/o_auth/user_spec.rb
+++ b/spec/lib/gitlab/auth/o_auth/user_spec.rb
@@ -995,6 +995,23 @@ RSpec.describe Gitlab::Auth::OAuth::User do
end
end
+ context 'when gl_user is nil' do
+ # We can't use `allow_next_instance_of` here because the stubbed method is called inside `initialize`.
+ # When the class calls `gl_user` during `initialize`, the `nil` value is overwritten and we do not see expected results from the spec.
+ # So we use `allow_any_instance_of` to preserve the `nil` value to test the behavior when `gl_user` is nil.
+
+ # rubocop:disable RSpec/AnyInstanceOf
+ before do
+ allow_any_instance_of(described_class).to receive(:gl_user) { nil }
+ allow_any_instance_of(described_class).to receive(:sync_profile_from_provider?) { true } # to make the code flow proceed until gl_user.build_user_synced_attributes_metadata is called
+ end
+ # rubocop:enable RSpec/AnyInstanceOf
+
+ it 'does not raise NoMethodError' do
+ expect { oauth_user }.not_to raise_error
+ end
+ end
+
describe '._uid_and_provider' do
let!(:existing_user) { create(:omniauth_user, extern_uid: 'my-uid', provider: 'my-provider') }
diff --git a/spec/lib/gitlab/avatar_cache_spec.rb b/spec/lib/gitlab/avatar_cache_spec.rb
new file mode 100644
index 00000000000..ffe6f81b6e7
--- /dev/null
+++ b/spec/lib/gitlab/avatar_cache_spec.rb
@@ -0,0 +1,101 @@
+# frozen_string_literal: true
+
+require "spec_helper"
+
+RSpec.describe Gitlab::AvatarCache, :clean_gitlab_redis_cache do
+ def with(&blk)
+ Gitlab::Redis::Cache.with(&blk) # rubocop:disable CodeReuse/ActiveRecord
+ end
+
+ def read(key, subkey)
+ with do |redis|
+ redis.hget(key, subkey)
+ end
+ end
+
+ let(:thing) { double("thing", avatar_path: avatar_path) }
+ let(:avatar_path) { "/avatars/my_fancy_avatar.png" }
+ let(:key) { described_class.send(:email_key, "foo@bar.com") }
+
+ let(:perform_fetch) do
+ described_class.by_email("foo@bar.com", 20, 2, true) do
+ thing.avatar_path
+ end
+ end
+
+ describe "#by_email" do
+ it "writes a new value into the cache" do
+ expect(read(key, "20:2:true")).to eq(nil)
+
+ perform_fetch
+
+ expect(read(key, "20:2:true")).to eq(avatar_path)
+ end
+
+ it "finds the cached value and doesn't execute the block" do
+ expect(thing).to receive(:avatar_path).once
+
+ described_class.by_email("foo@bar.com", 20, 2, true) do
+ thing.avatar_path
+ end
+
+ described_class.by_email("foo@bar.com", 20, 2, true) do
+ thing.avatar_path
+ end
+ end
+
+ it "finds the cached value in the request store and doesn't execute the block" do
+ expect(thing).to receive(:avatar_path).once
+
+ Gitlab::WithRequestStore.with_request_store do
+ described_class.by_email("foo@bar.com", 20, 2, true) do
+ thing.avatar_path
+ end
+
+ described_class.by_email("foo@bar.com", 20, 2, true) do
+ thing.avatar_path
+ end
+
+ expect(Gitlab::SafeRequestStore.read([key, "20:2:true"])).to eq(avatar_path)
+ end
+ end
+ end
+
+ describe "#delete_by_email" do
+ subject { described_class.delete_by_email(*emails) }
+
+ before do
+ perform_fetch
+ end
+
+ context "no emails, somehow" do
+ let(:emails) { [] }
+
+ it { is_expected.to eq(0) }
+ end
+
+ context "single email" do
+ let(:emails) { "foo@bar.com" }
+
+ it "removes the email" do
+ expect(read(key, "20:2:true")).to eq(avatar_path)
+
+ expect(subject).to eq(1)
+
+ expect(read(key, "20:2:true")).to eq(nil)
+ end
+ end
+
+ context "multiple emails" do
+ let(:emails) { ["foo@bar.com", "missing@baz.com"] }
+
+ it "removes the emails it finds" do
+ expect(read(key, "20:2:true")).to eq(avatar_path)
+
+ expect(subject).to eq(1)
+
+ expect(read(key, "20:2:true")).to eq(nil)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/batching_strategies/primary_key_batching_strategy_spec.rb b/spec/lib/gitlab/background_migration/batching_strategies/primary_key_batching_strategy_spec.rb
new file mode 100644
index 00000000000..8febe850e04
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/batching_strategies/primary_key_batching_strategy_spec.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::BatchingStrategies::PrimaryKeyBatchingStrategy, '#next_batch' do
+ let(:batching_strategy) { described_class.new }
+ let(:namespaces) { table(:namespaces) }
+
+ let!(:namespace1) { namespaces.create!(name: 'batchtest1', path: 'batch-test1') }
+ let!(:namespace2) { namespaces.create!(name: 'batchtest2', path: 'batch-test2') }
+ let!(:namespace3) { namespaces.create!(name: 'batchtest3', path: 'batch-test3') }
+ let!(:namespace4) { namespaces.create!(name: 'batchtest4', path: 'batch-test4') }
+
+ 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)
+
+ expect(batch_bounds).to eq([namespace1.id, namespace3.id])
+ end
+ end
+
+ 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)
+
+ expect(batch_bounds).to eq([namespace2.id, namespace4.id])
+ end
+ end
+
+ 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)
+
+ expect(batch_bounds).to eq([namespace4.id, namespace4.id])
+ end
+ end
+
+ 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)
+
+ expect(batch_bounds).to be_nil
+ end
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/copy_column_using_background_migration_job_spec.rb b/spec/lib/gitlab/background_migration/copy_column_using_background_migration_job_spec.rb
index 110a1ff8a08..7ad93c3124a 100644
--- a/spec/lib/gitlab/background_migration/copy_column_using_background_migration_job_spec.rb
+++ b/spec/lib/gitlab/background_migration/copy_column_using_background_migration_job_spec.rb
@@ -38,22 +38,9 @@ RSpec.describe Gitlab::BackgroundMigration::CopyColumnUsingBackgroundMigrationJo
describe '#perform' do
let(:migration_class) { described_class.name }
- let!(:job1) do
- table(:background_migration_jobs).create!(
- class_name: migration_class,
- arguments: [1, 10, table_name, 'id', 'id', 'id_convert_to_bigint', sub_batch_size]
- )
- end
-
- let!(:job2) do
- table(:background_migration_jobs).create!(
- class_name: migration_class,
- arguments: [11, 20, table_name, 'id', 'id', 'id_convert_to_bigint', sub_batch_size]
- )
- end
it 'copies all primary keys in range' do
- subject.perform(12, 15, table_name, 'id', 'id', 'id_convert_to_bigint', sub_batch_size)
+ subject.perform(12, 15, table_name, 'id', sub_batch_size, 'id', 'id_convert_to_bigint')
expect(test_table.where('id = id_convert_to_bigint').pluck(:id)).to contain_exactly(12, 15)
expect(test_table.where(id_convert_to_bigint: 0).pluck(:id)).to contain_exactly(11, 19)
@@ -61,7 +48,7 @@ RSpec.describe Gitlab::BackgroundMigration::CopyColumnUsingBackgroundMigrationJo
end
it 'copies all foreign keys in range' do
- subject.perform(10, 14, table_name, 'id', 'fk', 'fk_convert_to_bigint', sub_batch_size)
+ subject.perform(10, 14, table_name, 'id', sub_batch_size, 'fk', 'fk_convert_to_bigint')
expect(test_table.where('fk = fk_convert_to_bigint').pluck(:id)).to contain_exactly(11, 12)
expect(test_table.where(fk_convert_to_bigint: 0).pluck(:id)).to contain_exactly(15, 19)
@@ -71,21 +58,11 @@ RSpec.describe Gitlab::BackgroundMigration::CopyColumnUsingBackgroundMigrationJo
it 'copies columns with NULLs' do
expect(test_table.where("name_convert_to_text = 'no name'").count).to eq(4)
- subject.perform(10, 20, table_name, 'id', 'name', 'name_convert_to_text', sub_batch_size)
+ subject.perform(10, 20, table_name, 'id', sub_batch_size, 'name', 'name_convert_to_text')
expect(test_table.where('name = name_convert_to_text').pluck(:id)).to contain_exactly(11, 12, 19)
expect(test_table.where('name is NULL and name_convert_to_text is NULL').pluck(:id)).to contain_exactly(15)
expect(test_table.where("name_convert_to_text = 'no name'").count).to eq(0)
end
-
- it 'tracks completion with BackgroundMigrationJob' do
- expect do
- subject.perform(11, 20, table_name, 'id', 'id', 'id_convert_to_bigint', sub_batch_size)
- end.to change { Gitlab::Database::BackgroundMigrationJob.succeeded.count }.from(0).to(1)
-
- expect(job1.reload.status).to eq(0)
- expect(job2.reload.status).to eq(1)
- expect(test_table.where('id = id_convert_to_bigint').count).to eq(4)
- end
end
end
diff --git a/spec/lib/gitlab/background_migration/merge_request_assignees_migration_progress_check_spec.rb b/spec/lib/gitlab/background_migration/merge_request_assignees_migration_progress_check_spec.rb
deleted file mode 100644
index 85a9c88ebff..00000000000
--- a/spec/lib/gitlab/background_migration/merge_request_assignees_migration_progress_check_spec.rb
+++ /dev/null
@@ -1,99 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::BackgroundMigration::MergeRequestAssigneesMigrationProgressCheck do
- context 'rescheduling' do
- context 'when there are ongoing and no dead jobs' do
- it 'reschedules check' do
- allow(Gitlab::BackgroundMigration).to receive(:exists?)
- .with('PopulateMergeRequestAssigneesTable')
- .and_return(true)
-
- allow(Gitlab::BackgroundMigration).to receive(:dead_jobs?)
- .with('PopulateMergeRequestAssigneesTable')
- .and_return(false)
-
- expect(BackgroundMigrationWorker).to receive(:perform_in).with(described_class::RESCHEDULE_DELAY, described_class.name)
-
- described_class.new.perform
- end
- end
-
- context 'when there are ongoing and dead jobs' do
- it 'reschedules check' do
- allow(Gitlab::BackgroundMigration).to receive(:exists?)
- .with('PopulateMergeRequestAssigneesTable')
- .and_return(true)
-
- allow(Gitlab::BackgroundMigration).to receive(:dead_jobs?)
- .with('PopulateMergeRequestAssigneesTable')
- .and_return(true)
-
- expect(BackgroundMigrationWorker).to receive(:perform_in).with(described_class::RESCHEDULE_DELAY, described_class.name)
-
- described_class.new.perform
- end
- end
-
- context 'when there retrying jobs and no scheduled' do
- it 'reschedules check' do
- allow(Gitlab::BackgroundMigration).to receive(:exists?)
- .with('PopulateMergeRequestAssigneesTable')
- .and_return(false)
-
- allow(Gitlab::BackgroundMigration).to receive(:retrying_jobs?)
- .with('PopulateMergeRequestAssigneesTable')
- .and_return(true)
-
- expect(BackgroundMigrationWorker).to receive(:perform_in).with(described_class::RESCHEDULE_DELAY, described_class.name)
-
- described_class.new.perform
- end
- end
- end
-
- context 'when there are no scheduled, or retrying or dead' do
- before do
- stub_feature_flags(multiple_merge_request_assignees: false)
- end
-
- it 'enables feature' do
- allow(Gitlab::BackgroundMigration).to receive(:exists?)
- .with('PopulateMergeRequestAssigneesTable')
- .and_return(false)
-
- allow(Gitlab::BackgroundMigration).to receive(:retrying_jobs?)
- .with('PopulateMergeRequestAssigneesTable')
- .and_return(false)
-
- allow(Gitlab::BackgroundMigration).to receive(:dead_jobs?)
- .with('PopulateMergeRequestAssigneesTable')
- .and_return(false)
-
- described_class.new.perform
-
- expect(Feature.enabled?(:multiple_merge_request_assignees, type: :licensed)).to eq(true)
- end
- end
-
- context 'when there are only dead jobs' do
- it 'raises DeadJobsError error' do
- allow(Gitlab::BackgroundMigration).to receive(:exists?)
- .with('PopulateMergeRequestAssigneesTable')
- .and_return(false)
-
- allow(Gitlab::BackgroundMigration).to receive(:retrying_jobs?)
- .with('PopulateMergeRequestAssigneesTable')
- .and_return(false)
-
- allow(Gitlab::BackgroundMigration).to receive(:dead_jobs?)
- .with('PopulateMergeRequestAssigneesTable')
- .and_return(true)
-
- expect { described_class.new.perform }
- .to raise_error(described_class::DeadJobsError,
- "Only dead background jobs in the queue for #{described_class::WORKER}")
- end
- end
-end
diff --git a/spec/lib/gitlab/background_migration/migrate_legacy_artifacts_spec.rb b/spec/lib/gitlab/background_migration/migrate_legacy_artifacts_spec.rb
index 08f2b2a043e..5c93e69b5e5 100644
--- a/spec/lib/gitlab/background_migration/migrate_legacy_artifacts_spec.rb
+++ b/spec/lib/gitlab/background_migration/migrate_legacy_artifacts_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::BackgroundMigration::MigrateLegacyArtifacts do
+RSpec.describe Gitlab::BackgroundMigration::MigrateLegacyArtifacts, schema: 20210210093901 do
let(:namespaces) { table(:namespaces) }
let(:projects) { table(:projects) }
let(:pipelines) { table(:ci_pipelines) }
diff --git a/spec/lib/gitlab/background_migration/populate_finding_uuid_for_vulnerability_feedback_spec.rb b/spec/lib/gitlab/background_migration/populate_finding_uuid_for_vulnerability_feedback_spec.rb
index 8e74935e127..07b1d99d333 100644
--- a/spec/lib/gitlab/background_migration/populate_finding_uuid_for_vulnerability_feedback_spec.rb
+++ b/spec/lib/gitlab/background_migration/populate_finding_uuid_for_vulnerability_feedback_spec.rb
@@ -27,12 +27,33 @@ RSpec.describe Gitlab::BackgroundMigration::PopulateFindingUuidForVulnerabilityF
let(:finding_1) { finding_creator.call(sast_report, location_fingerprint_1) }
let(:finding_2) { finding_creator.call(dast_report, location_fingerprint_2) }
let(:finding_3) { finding_creator.call(secret_detection_report, location_fingerprint_3) }
- let(:uuid_1_components) { ['sast', identifier.fingerprint, location_fingerprint_1, project.id].join('-') }
- let(:uuid_2_components) { ['dast', identifier.fingerprint, location_fingerprint_2, project.id].join('-') }
- let(:uuid_3_components) { ['secret_detection', identifier.fingerprint, location_fingerprint_3, project.id].join('-') }
- let(:expected_uuid_1) { Gitlab::UUID.v5(uuid_1_components) }
- let(:expected_uuid_2) { Gitlab::UUID.v5(uuid_2_components) }
- let(:expected_uuid_3) { Gitlab::UUID.v5(uuid_3_components) }
+ let(:expected_uuid_1) do
+ Security::VulnerabilityUUID.generate(
+ report_type: 'sast',
+ primary_identifier_fingerprint: identifier.fingerprint,
+ location_fingerprint: location_fingerprint_1,
+ project_id: project.id
+ )
+ end
+
+ let(:expected_uuid_2) do
+ Security::VulnerabilityUUID.generate(
+ report_type: 'dast',
+ primary_identifier_fingerprint: identifier.fingerprint,
+ location_fingerprint: location_fingerprint_2,
+ project_id: project.id
+ )
+ end
+
+ let(:expected_uuid_3) do
+ Security::VulnerabilityUUID.generate(
+ report_type: 'secret_detection',
+ primary_identifier_fingerprint: identifier.fingerprint,
+ location_fingerprint: location_fingerprint_3,
+ project_id: project.id
+ )
+ end
+
let(:finding_creator) do
-> (report_type, location_fingerprint) do
findings.create!(
diff --git a/spec/lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid_spec.rb b/spec/lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid_spec.rb
new file mode 100644
index 00000000000..990ef4fbe6a
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid_spec.rb
@@ -0,0 +1,149 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::RecalculateVulnerabilitiesOccurrencesUuid, schema: 20201110110454 do
+ let(:namespace) { table(:namespaces).create!(name: 'user', path: 'user') }
+ let(:users) { table(:users) }
+ let(:user) { create_user! }
+ let(:project) { table(:projects).create!(id: 123, namespace_id: namespace.id) }
+ let(:scanners) { table(:vulnerability_scanners) }
+ let(:scanner) { scanners.create!(project_id: project.id, external_id: 'test 1', name: 'test scanner 1') }
+ let(:different_scanner) { scanners.create!(project_id: project.id, external_id: 'test 2', name: 'test scanner 2') }
+ let(:vulnerabilities) { table(:vulnerabilities) }
+ let(:vulnerabilities_findings) { table(:vulnerability_occurrences) }
+ let(:vulnerability_identifiers) { table(:vulnerability_identifiers) }
+ let(:vulnerability_identifier) do
+ vulnerability_identifiers.create!(
+ project_id: project.id,
+ external_type: 'uuid-v5',
+ external_id: 'uuid-v5',
+ fingerprint: '7e394d1b1eb461a7406d7b1e08f057a1cf11287a',
+ name: 'Identifier for UUIDv5')
+ end
+
+ let(:different_vulnerability_identifier) do
+ vulnerability_identifiers.create!(
+ project_id: project.id,
+ external_type: 'uuid-v4',
+ external_id: 'uuid-v4',
+ fingerprint: '772da93d34a1ba010bcb5efa9fb6f8e01bafcc89',
+ name: 'Identifier for UUIDv4')
+ end
+
+ let!(:vulnerability_for_uuidv4) do
+ create_vulnerability!(
+ project_id: project.id,
+ author_id: user.id
+ )
+ end
+
+ let!(:vulnerability_for_uuidv5) do
+ create_vulnerability!(
+ project_id: project.id,
+ author_id: user.id
+ )
+ end
+
+ let(:known_uuid_v5) { "77211ed6-7dff-5f6b-8c9a-da89ad0a9b60" }
+ let(:known_uuid_v4) { "b3cc2518-5446-4dea-871c-89d5e999c1ac" }
+ let(:desired_uuid_v5) { "3ca8ad45-6344-508b-b5e3-306a3bd6c6ba" }
+
+ subject { described_class.new.perform(finding.id, finding.id) }
+
+ context "when finding has a UUIDv4" do
+ before do
+ @uuid_v4 = create_finding!(
+ vulnerability_id: vulnerability_for_uuidv4.id,
+ project_id: project.id,
+ scanner_id: different_scanner.id,
+ primary_identifier_id: different_vulnerability_identifier.id,
+ report_type: 0, # "sast"
+ location_fingerprint: "fa18f432f1d56675f4098d318739c3cd5b14eb3e",
+ uuid: known_uuid_v4
+ )
+ end
+
+ let(:finding) { @uuid_v4 }
+
+ it "replaces it with UUIDv5" do
+ expect(vulnerabilities_findings.pluck(:uuid)).to eq([known_uuid_v4])
+
+ subject
+
+ expect(vulnerabilities_findings.pluck(:uuid)).to eq([desired_uuid_v5])
+ end
+ end
+
+ context "when finding has a UUIDv5" do
+ before do
+ @uuid_v5 = create_finding!(
+ vulnerability_id: vulnerability_for_uuidv5.id,
+ project_id: project.id,
+ scanner_id: scanner.id,
+ primary_identifier_id: vulnerability_identifier.id,
+ report_type: 0, # "sast"
+ location_fingerprint: "838574be0210968bf6b9f569df9c2576242cbf0a",
+ uuid: known_uuid_v5
+ )
+ end
+
+ let(:finding) { @uuid_v5 }
+
+ it "stays the same" do
+ expect(vulnerabilities_findings.pluck(:uuid)).to eq([known_uuid_v5])
+
+ subject
+
+ expect(vulnerabilities_findings.pluck(:uuid)).to eq([known_uuid_v5])
+ end
+ end
+
+ private
+
+ def create_vulnerability!(project_id:, author_id:, title: 'test', severity: 7, confidence: 7, report_type: 0)
+ vulnerabilities.create!(
+ project_id: project_id,
+ author_id: author_id,
+ title: title,
+ severity: severity,
+ confidence: confidence,
+ report_type: report_type
+ )
+ end
+
+ # rubocop:disable Metrics/ParameterLists
+ def create_finding!(
+ vulnerability_id:, project_id:, scanner_id:, primary_identifier_id:,
+ name: "test", severity: 7, confidence: 7, report_type: 0,
+ project_fingerprint: '123qweasdzxc', location_fingerprint: 'test',
+ metadata_version: 'test', raw_metadata: 'test', uuid: 'test')
+ vulnerabilities_findings.create!(
+ vulnerability_id: vulnerability_id,
+ project_id: project_id,
+ name: name,
+ severity: severity,
+ confidence: confidence,
+ report_type: report_type,
+ project_fingerprint: project_fingerprint,
+ scanner_id: scanner.id,
+ primary_identifier_id: vulnerability_identifier.id,
+ location_fingerprint: location_fingerprint,
+ metadata_version: metadata_version,
+ raw_metadata: raw_metadata,
+ uuid: uuid
+ )
+ end
+ # rubocop:enable Metrics/ParameterLists
+
+ def create_user!(name: "Example User", email: "user@example.com", user_type: nil, created_at: Time.zone.now, confirmed_at: Time.zone.now)
+ users.create!(
+ name: name,
+ email: email,
+ username: name,
+ projects_limit: 0,
+ user_type: user_type,
+ confirmed_at: confirmed_at
+ )
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/set_default_iteration_cadences_spec.rb b/spec/lib/gitlab/background_migration/set_default_iteration_cadences_spec.rb
new file mode 100644
index 00000000000..46c919f0854
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/set_default_iteration_cadences_spec.rb
@@ -0,0 +1,80 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::SetDefaultIterationCadences, schema: 20201231133921 do
+ let(:namespaces) { table(:namespaces) }
+ let(:iterations) { table(:sprints) }
+ let(:iterations_cadences) { table(:iterations_cadences) }
+
+ describe '#perform' do
+ context 'when no iteration cadences exists' do
+ let!(:group_1) { namespaces.create!(name: 'group 1', path: 'group-1') }
+ let!(:group_2) { namespaces.create!(name: 'group 2', path: 'group-2') }
+ let!(:group_3) { namespaces.create!(name: 'group 3', path: 'group-3') }
+
+ let!(:iteration_1) { iterations.create!(group_id: group_1.id, iid: 1, title: 'Iteration 1', start_date: 10.days.ago, due_date: 8.days.ago) }
+ let!(:iteration_2) { iterations.create!(group_id: group_3.id, iid: 1, title: 'Iteration 2', start_date: 10.days.ago, due_date: 8.days.ago) }
+ let!(:iteration_3) { iterations.create!(group_id: group_3.id, iid: 1, title: 'Iteration 3', start_date: 5.days.ago, due_date: 2.days.ago) }
+
+ subject { described_class.new.perform(group_1.id, group_2.id, group_3.id, namespaces.last.id + 1) }
+
+ before do
+ subject
+ end
+
+ it 'creates iterations_cadence records for the requested groups' do
+ expect(iterations_cadences.count).to eq(2)
+ end
+
+ it 'assigns the iteration cadences to the iterations correctly' do
+ iterations_cadence = iterations_cadences.find_by(group_id: group_1.id)
+ iteration_records = iterations.where(iterations_cadence_id: iterations_cadence.id)
+
+ expect(iterations_cadence.start_date).to eq(iteration_1.start_date)
+ expect(iterations_cadence.last_run_date).to eq(iteration_1.start_date)
+ expect(iterations_cadence.title).to eq('group 1 Iterations')
+ expect(iteration_records.size).to eq(1)
+ expect(iteration_records.first.id).to eq(iteration_1.id)
+
+ iterations_cadence = iterations_cadences.find_by(group_id: group_3.id)
+ iteration_records = iterations.where(iterations_cadence_id: iterations_cadence.id)
+
+ expect(iterations_cadence.start_date).to eq(iteration_3.start_date)
+ expect(iterations_cadence.last_run_date).to eq(iteration_3.start_date)
+ expect(iterations_cadence.title).to eq('group 3 Iterations')
+ expect(iteration_records.size).to eq(2)
+ expect(iteration_records.first.id).to eq(iteration_2.id)
+ expect(iteration_records.second.id).to eq(iteration_3.id)
+ end
+
+ it 'does not call Group class' do
+ expect(::Group).not_to receive(:where)
+
+ subject
+ end
+ end
+
+ context 'when an iteration cadence exists for a group' do
+ let!(:group) { namespaces.create!(name: 'group', path: 'group') }
+
+ let!(:iterations_cadence_1) { iterations_cadences.create!(group_id: group.id, start_date: 2.days.ago, title: 'Cadence 1') }
+
+ let!(:iteration_1) { iterations.create!(group_id: group.id, iid: 1, title: 'Iteration 1', start_date: 10.days.ago, due_date: 8.days.ago) }
+ let!(:iteration_2) { iterations.create!(group_id: group.id, iterations_cadence_id: iterations_cadence_1.id, iid: 2, title: 'Iteration 2', start_date: 5.days.ago, due_date: 3.days.ago) }
+
+ subject { described_class.new.perform(group.id) }
+
+ it 'does not create a new iterations_cadence' do
+ expect { subject }.not_to change { iterations_cadences.count }
+ end
+
+ it 'assigns iteration cadences to iterations if needed' do
+ subject
+
+ expect(iteration_1.reload.iterations_cadence_id).to eq(iterations_cadence_1.id)
+ expect(iteration_2.reload.iterations_cadence_id).to eq(iterations_cadence_1.id)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/checks/branch_check_spec.rb b/spec/lib/gitlab/checks/branch_check_spec.rb
index 822bdc8389d..3086cb1bd33 100644
--- a/spec/lib/gitlab/checks/branch_check_spec.rb
+++ b/spec/lib/gitlab/checks/branch_check_spec.rb
@@ -70,6 +70,82 @@ RSpec.describe Gitlab::Checks::BranchCheck do
expect { subject.validate! }.to raise_error(Gitlab::GitAccess::ForbiddenError, 'You are not allowed to push code to protected branches on this project.')
end
+ context 'when user has push access' do
+ before do
+ allow(user_access)
+ .to receive(:can_push_to_branch?)
+ .and_return(true)
+ end
+
+ context 'if protected branches is allowed to force push' do
+ before do
+ allow(ProtectedBranch)
+ .to receive(:allow_force_push?)
+ .with(project, 'master')
+ .and_return(true)
+ end
+
+ it 'allows force push' do
+ expect(Gitlab::Checks::ForcePush).to receive(:force_push?).and_return(true)
+
+ expect { subject.validate! }.not_to raise_error
+ end
+ end
+
+ context 'if protected branches is not allowed to force push' do
+ before do
+ allow(ProtectedBranch)
+ .to receive(:allow_force_push?)
+ .with(project, 'master')
+ .and_return(false)
+ end
+
+ it 'prevents force push' do
+ expect(Gitlab::Checks::ForcePush).to receive(:force_push?).and_return(true)
+
+ expect { subject.validate! }.to raise_error
+ end
+ end
+ end
+
+ context 'when user does not have push access' do
+ before do
+ allow(user_access)
+ .to receive(:can_push_to_branch?)
+ .and_return(false)
+ end
+
+ context 'if protected branches is allowed to force push' do
+ before do
+ allow(ProtectedBranch)
+ .to receive(:allow_force_push?)
+ .with(project, 'master')
+ .and_return(true)
+ end
+
+ it 'prevents force push' do
+ expect(Gitlab::Checks::ForcePush).to receive(:force_push?).and_return(true)
+
+ expect { subject.validate! }.to raise_error
+ end
+ end
+
+ context 'if protected branches is not allowed to force push' do
+ before do
+ allow(ProtectedBranch)
+ .to receive(:allow_force_push?)
+ .with(project, 'master')
+ .and_return(false)
+ end
+
+ it 'prevents force push' do
+ expect(Gitlab::Checks::ForcePush).to receive(:force_push?).and_return(true)
+
+ expect { subject.validate! }.to raise_error
+ end
+ end
+ end
+
context 'when project repository is empty' do
let(:project) { create(:project) }
diff --git a/spec/lib/gitlab/checks/lfs_check_spec.rb b/spec/lib/gitlab/checks/lfs_check_spec.rb
index 713858e0e35..19c1d820dff 100644
--- a/spec/lib/gitlab/checks/lfs_check_spec.rb
+++ b/spec/lib/gitlab/checks/lfs_check_spec.rb
@@ -39,13 +39,26 @@ RSpec.describe Gitlab::Checks::LfsCheck do
end
end
- context 'deletion' do
- let(:changes) { { oldrev: oldrev, ref: ref } }
+ context 'with deletion' do
+ shared_examples 'a skipped integrity check' do
+ it 'skips integrity check' do
+ expect(project.repository).not_to receive(:new_objects)
+ expect_any_instance_of(Gitlab::Git::LfsChanges).not_to receive(:new_pointers)
+
+ subject.validate!
+ end
+ end
- it 'skips integrity check' do
- expect(project.repository).not_to receive(:new_objects)
+ context 'with missing newrev' do
+ it_behaves_like 'a skipped integrity check' do
+ let(:changes) { { oldrev: oldrev, ref: ref } }
+ end
+ end
- subject.validate!
+ context 'with blank newrev' do
+ it_behaves_like 'a skipped integrity check' do
+ let(:changes) { { oldrev: oldrev, newrev: Gitlab::Git::BLANK_SHA, ref: ref } }
+ end
end
end
diff --git a/spec/lib/gitlab/ci/build/context/build_spec.rb b/spec/lib/gitlab/ci/build/context/build_spec.rb
index 61ca8e759b5..46447231424 100644
--- a/spec/lib/gitlab/ci/build/context/build_spec.rb
+++ b/spec/lib/gitlab/ci/build/context/build_spec.rb
@@ -9,7 +9,9 @@ RSpec.describe Gitlab::Ci::Build::Context::Build do
let(:context) { described_class.new(pipeline, seed_attributes) }
describe '#variables' do
- subject { context.variables }
+ subject { context.variables.to_hash }
+
+ it { expect(context.variables).to be_instance_of(Gitlab::Ci::Variables::Collection) }
it { is_expected.to include('CI_COMMIT_REF_NAME' => 'master') }
it { is_expected.to include('CI_PIPELINE_IID' => pipeline.iid.to_s) }
diff --git a/spec/lib/gitlab/ci/build/context/global_spec.rb b/spec/lib/gitlab/ci/build/context/global_spec.rb
index 7394708f9b6..61f2b90426d 100644
--- a/spec/lib/gitlab/ci/build/context/global_spec.rb
+++ b/spec/lib/gitlab/ci/build/context/global_spec.rb
@@ -9,7 +9,9 @@ RSpec.describe Gitlab::Ci::Build::Context::Global do
let(:context) { described_class.new(pipeline, yaml_variables: yaml_variables) }
describe '#variables' do
- subject { context.variables }
+ subject { context.variables.to_hash }
+
+ it { expect(context.variables).to be_instance_of(Gitlab::Ci::Variables::Collection) }
it { is_expected.to include('CI_COMMIT_REF_NAME' => 'master') }
it { is_expected.to include('CI_PIPELINE_IID' => pipeline.iid.to_s) }
diff --git a/spec/lib/gitlab/ci/build/policy/variables_spec.rb b/spec/lib/gitlab/ci/build/policy/variables_spec.rb
index f692aa6146e..6c8c968dc0c 100644
--- a/spec/lib/gitlab/ci/build/policy/variables_spec.rb
+++ b/spec/lib/gitlab/ci/build/policy/variables_spec.rb
@@ -16,7 +16,7 @@ RSpec.describe Gitlab::Ci::Build::Policy::Variables do
let(:seed) do
double('build seed',
to_resource: ci_build,
- variables: ci_build.scoped_variables_hash
+ variables: ci_build.scoped_variables
)
end
@@ -91,7 +91,7 @@ RSpec.describe Gitlab::Ci::Build::Policy::Variables do
let(:seed) do
double('bridge seed',
to_resource: bridge,
- variables: ci_build.scoped_variables_hash
+ variables: ci_build.scoped_variables
)
end
diff --git a/spec/lib/gitlab/ci/build/rules/rule_spec.rb b/spec/lib/gitlab/ci/build/rules/rule_spec.rb
index 5694cd5d0a0..6f3c9278677 100644
--- a/spec/lib/gitlab/ci/build/rules/rule_spec.rb
+++ b/spec/lib/gitlab/ci/build/rules/rule_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe Gitlab::Ci::Build::Rules::Rule do
let(:seed) do
double('build seed',
to_resource: ci_build,
- variables: ci_build.scoped_variables_hash
+ variables: ci_build.scoped_variables
)
end
diff --git a/spec/lib/gitlab/ci/build/rules_spec.rb b/spec/lib/gitlab/ci/build/rules_spec.rb
index 0b50def05d4..1d5bdf30278 100644
--- a/spec/lib/gitlab/ci/build/rules_spec.rb
+++ b/spec/lib/gitlab/ci/build/rules_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe Gitlab::Ci::Build::Rules do
let(:seed) do
double('build seed',
to_resource: ci_build,
- variables: ci_build.scoped_variables_hash
+ variables: ci_build.scoped_variables
)
end
diff --git a/spec/lib/gitlab/ci/charts_spec.rb b/spec/lib/gitlab/ci/charts_spec.rb
index 46d7d4a58f0..3a82d058819 100644
--- a/spec/lib/gitlab/ci/charts_spec.rb
+++ b/spec/lib/gitlab/ci/charts_spec.rb
@@ -98,7 +98,12 @@ RSpec.describe Gitlab::Ci::Charts do
subject { chart.total }
before do
- create(:ci_empty_pipeline, project: project, duration: 120)
+ # The created_at time used by the following execution
+ # can end up being after the creation of the 'today' time
+ # objects created above, and cause the queried counts to
+ # go to zero when the test executes close to midnight on the
+ # CI system, so we explicitly set it to a day earlier
+ create(:ci_empty_pipeline, project: project, duration: 120, created_at: today - 1.day)
end
it 'uses a utc time zone for range times' do
diff --git a/spec/lib/gitlab/ci/config/entry/cache_spec.rb b/spec/lib/gitlab/ci/config/entry/cache_spec.rb
index 247f4b63910..064990667d5 100644
--- a/spec/lib/gitlab/ci/config/entry/cache_spec.rb
+++ b/spec/lib/gitlab/ci/config/entry/cache_spec.rb
@@ -7,225 +7,285 @@ RSpec.describe Gitlab::Ci::Config::Entry::Cache do
subject(:entry) { described_class.new(config) }
- describe 'validations' do
+ context 'with multiple caches' do
before do
entry.compose!
end
- context 'when entry config value is correct' do
- let(:policy) { nil }
- let(:key) { 'some key' }
- let(:when_config) { nil }
-
- let(:config) do
- {
- key: key,
- untracked: true,
- paths: ['some/path/']
- }.tap do |config|
- config[:policy] = policy if policy
- config[:when] = when_config if when_config
+ describe '#valid?' do
+ context 'when configuration is valid with a single cache' do
+ let(:config) { { key: 'key', paths: ["logs/"], untracked: true } }
+
+ it 'is valid' do
+ expect(entry).to be_valid
end
end
- describe '#value' do
- shared_examples 'hash key value' do
- it 'returns hash value' do
- expect(entry.value).to eq(key: key, untracked: true, paths: ['some/path/'], policy: 'pull-push', when: 'on_success')
- end
+ context 'when configuration is valid with multiple caches' do
+ let(:config) do
+ [
+ { key: 'key', paths: ["logs/"], untracked: true },
+ { key: 'key2', paths: ["logs/"], untracked: true },
+ { key: 'key3', paths: ["logs/"], untracked: true }
+ ]
end
- it_behaves_like 'hash key value'
+ it 'is valid' do
+ expect(entry).to be_valid
+ end
+ end
- context 'with files' do
- let(:key) { { files: %w[a-file other-file] } }
+ context 'when configuration is not a Hash or Array' do
+ let(:config) { 'invalid' }
- it_behaves_like 'hash key value'
+ it 'is invalid' do
+ expect(entry).not_to be_valid
end
+ end
- context 'with files and prefix' do
- let(:key) { { files: %w[a-file other-file], prefix: 'prefix-value' } }
+ context 'when entry values contain more than four caches' do
+ let(:config) do
+ [
+ { key: 'key', paths: ["logs/"], untracked: true },
+ { key: 'key2', paths: ["logs/"], untracked: true },
+ { key: 'key3', paths: ["logs/"], untracked: true },
+ { key: 'key4', paths: ["logs/"], untracked: true },
+ { key: 'key5', paths: ["logs/"], untracked: true }
+ ]
+ end
- it_behaves_like 'hash key value'
+ it 'is invalid' do
+ expect(entry.errors).to eq(["caches config no more than 4 caches can be created"])
+ expect(entry).not_to be_valid
end
+ end
+ end
+ end
+
+ context 'with a single cache' do
+ before do
+ stub_feature_flags(multiple_cache_per_job: false)
+ end
+ describe 'validations' do
+ before do
+ entry.compose!
+ end
- context 'with prefix' do
- let(:key) { { prefix: 'prefix-value' } }
+ context 'when entry config value is correct' do
+ let(:policy) { nil }
+ let(:key) { 'some key' }
+ let(:when_config) { nil }
- it 'key is nil' do
- expect(entry.value).to match(a_hash_including(key: nil))
+ let(:config) do
+ {
+ key: key,
+ untracked: true,
+ paths: ['some/path/']
+ }.tap do |config|
+ config[:policy] = policy if policy
+ config[:when] = when_config if when_config
end
end
- context 'with `policy`' do
- where(:policy, :result) do
- 'pull-push' | 'pull-push'
- 'push' | 'push'
- 'pull' | 'pull'
- 'unknown' | 'unknown' # invalid
+ describe '#value' do
+ shared_examples 'hash key value' do
+ it 'returns hash value' do
+ expect(entry.value).to eq(key: key, untracked: true, paths: ['some/path/'], policy: 'pull-push', when: 'on_success')
+ end
end
- with_them do
- it { expect(entry.value).to include(policy: result) }
+ it_behaves_like 'hash key value'
+
+ context 'with files' do
+ let(:key) { { files: %w[a-file other-file] } }
+
+ it_behaves_like 'hash key value'
end
- end
- context 'without `policy`' do
- it 'assigns policy to default' do
- expect(entry.value).to include(policy: 'pull-push')
+ context 'with files and prefix' do
+ let(:key) { { files: %w[a-file other-file], prefix: 'prefix-value' } }
+
+ it_behaves_like 'hash key value'
end
- end
- context 'with `when`' do
- where(:when_config, :result) do
- 'on_success' | 'on_success'
- 'on_failure' | 'on_failure'
- 'always' | 'always'
- 'unknown' | 'unknown' # invalid
+ context 'with prefix' do
+ let(:key) { { prefix: 'prefix-value' } }
+
+ it 'key is nil' do
+ expect(entry.value).to match(a_hash_including(key: nil))
+ end
end
- with_them do
- it { expect(entry.value).to include(when: result) }
+ context 'with `policy`' do
+ where(:policy, :result) do
+ 'pull-push' | 'pull-push'
+ 'push' | 'push'
+ 'pull' | 'pull'
+ 'unknown' | 'unknown' # invalid
+ end
+
+ with_them do
+ it { expect(entry.value).to include(policy: result) }
+ end
end
- end
- context 'without `when`' do
- it 'assigns when to default' do
- expect(entry.value).to include(when: 'on_success')
+ context 'without `policy`' do
+ it 'assigns policy to default' do
+ expect(entry.value).to include(policy: 'pull-push')
+ end
end
- end
- end
- describe '#valid?' do
- it { is_expected.to be_valid }
+ context 'with `when`' do
+ where(:when_config, :result) do
+ 'on_success' | 'on_success'
+ 'on_failure' | 'on_failure'
+ 'always' | 'always'
+ 'unknown' | 'unknown' # invalid
+ end
- context 'with files' do
- let(:key) { { files: %w[a-file other-file] } }
+ with_them do
+ it { expect(entry.value).to include(when: result) }
+ end
+ end
- it { is_expected.to be_valid }
+ context 'without `when`' do
+ it 'assigns when to default' do
+ expect(entry.value).to include(when: 'on_success')
+ end
+ end
end
- end
- context 'with `policy`' do
- where(:policy, :valid) do
- 'pull-push' | true
- 'push' | true
- 'pull' | true
- 'unknown' | false
- end
+ describe '#valid?' do
+ it { is_expected.to be_valid }
+
+ context 'with files' do
+ let(:key) { { files: %w[a-file other-file] } }
- with_them do
- it 'returns expected validity' do
- expect(entry.valid?).to eq(valid)
+ it { is_expected.to be_valid }
end
end
- end
- context 'with `when`' do
- where(:when_config, :valid) do
- 'on_success' | true
- 'on_failure' | true
- 'always' | true
- 'unknown' | false
- end
+ context 'with `policy`' do
+ where(:policy, :valid) do
+ 'pull-push' | true
+ 'push' | true
+ 'pull' | true
+ 'unknown' | false
+ end
- with_them do
- it 'returns expected validity' do
- expect(entry.valid?).to eq(valid)
+ with_them do
+ it 'returns expected validity' do
+ expect(entry.valid?).to eq(valid)
+ end
end
end
- end
- context 'with key missing' do
- let(:config) do
- { untracked: true,
- paths: ['some/path/'] }
+ context 'with `when`' do
+ where(:when_config, :valid) do
+ 'on_success' | true
+ 'on_failure' | true
+ 'always' | true
+ 'unknown' | false
+ end
+
+ with_them do
+ it 'returns expected validity' do
+ expect(entry.valid?).to eq(valid)
+ end
+ end
end
- describe '#value' do
- it 'sets key with the default' do
- expect(entry.value[:key])
- .to eq(Gitlab::Ci::Config::Entry::Key.default)
+ context 'with key missing' do
+ let(:config) do
+ { untracked: true,
+ paths: ['some/path/'] }
+ end
+
+ describe '#value' do
+ it 'sets key with the default' do
+ expect(entry.value[:key])
+ .to eq(Gitlab::Ci::Config::Entry::Key.default)
+ end
end
end
end
- end
- context 'when entry value is not correct' do
- describe '#errors' do
- subject { entry.errors }
+ context 'when entry value is not correct' do
+ describe '#errors' do
+ subject { entry.errors }
- context 'when is not a hash' do
- let(:config) { 'ls' }
+ context 'when is not a hash' do
+ let(:config) { 'ls' }
- it 'reports errors with config value' do
- is_expected.to include 'cache config should be a hash'
+ it 'reports errors with config value' do
+ is_expected.to include 'cache config should be a hash'
+ end
end
- end
- context 'when policy is unknown' do
- let(:config) { { policy: 'unknown' } }
+ context 'when policy is unknown' do
+ let(:config) { { policy: 'unknown' } }
- it 'reports error' do
- is_expected.to include('cache policy should be pull-push, push, or pull')
+ it 'reports error' do
+ is_expected.to include('cache policy should be pull-push, push, or pull')
+ end
end
- end
- context 'when `when` is unknown' do
- let(:config) { { when: 'unknown' } }
+ context 'when `when` is unknown' do
+ let(:config) { { when: 'unknown' } }
- it 'reports error' do
- is_expected.to include('cache when should be on_success, on_failure or always')
+ it 'reports error' do
+ is_expected.to include('cache when should be on_success, on_failure or always')
+ end
end
- end
- context 'when descendants are invalid' do
- context 'with invalid keys' do
- let(:config) { { key: 1 } }
+ context 'when descendants are invalid' do
+ context 'with invalid keys' do
+ let(:config) { { key: 1 } }
- it 'reports error with descendants' do
- is_expected.to include 'key should be a hash, a string or a symbol'
+ it 'reports error with descendants' do
+ is_expected.to include 'key should be a hash, a string or a symbol'
+ end
end
- end
- context 'with empty key' do
- let(:config) { { key: {} } }
+ context 'with empty key' do
+ let(:config) { { key: {} } }
- it 'reports error with descendants' do
- is_expected.to include 'key config missing required keys: files'
+ it 'reports error with descendants' do
+ is_expected.to include 'key config missing required keys: files'
+ end
end
- end
- context 'with invalid files' do
- let(:config) { { key: { files: 'a-file' } } }
+ context 'with invalid files' do
+ let(:config) { { key: { files: 'a-file' } } }
- it 'reports error with descendants' do
- is_expected.to include 'key:files config should be an array of strings'
+ it 'reports error with descendants' do
+ is_expected.to include 'key:files config should be an array of strings'
+ end
end
- end
- context 'with prefix without files' do
- let(:config) { { key: { prefix: 'a-prefix' } } }
+ context 'with prefix without files' do
+ let(:config) { { key: { prefix: 'a-prefix' } } }
- it 'reports error with descendants' do
- is_expected.to include 'key config missing required keys: files'
+ it 'reports error with descendants' do
+ is_expected.to include 'key config missing required keys: files'
+ end
end
- end
- context 'when there is an unknown key present' do
- let(:config) { { key: { unknown: 'a-file' } } }
+ context 'when there is an unknown key present' do
+ let(:config) { { key: { unknown: 'a-file' } } }
- it 'reports error with descendants' do
- is_expected.to include 'key config contains unknown keys: unknown'
+ it 'reports error with descendants' do
+ is_expected.to include 'key config contains unknown keys: unknown'
+ end
end
end
- end
- context 'when there is an unknown key present' do
- let(:config) { { invalid: true } }
+ context 'when there is an unknown key present' do
+ let(:config) { { invalid: true } }
- it 'reports error with descendants' do
- is_expected.to include 'cache config contains unknown keys: invalid'
+ it 'reports error with descendants' do
+ is_expected.to include 'cache config contains unknown keys: invalid'
+ end
end
end
end
diff --git a/spec/lib/gitlab/ci/config/entry/environment_spec.rb b/spec/lib/gitlab/ci/config/entry/environment_spec.rb
index 0c18a7fb71e..dd8a79f0d84 100644
--- a/spec/lib/gitlab/ci/config/entry/environment_spec.rb
+++ b/spec/lib/gitlab/ci/config/entry/environment_spec.rb
@@ -305,4 +305,37 @@ RSpec.describe Gitlab::Ci::Config::Entry::Environment do
it { expect(entry).to be_valid }
end
end
+
+ describe 'deployment_tier' do
+ let(:config) do
+ { name: 'customer-portal', deployment_tier: deployment_tier }
+ end
+
+ context 'is a string' do
+ let(:deployment_tier) { 'production' }
+
+ it { expect(entry).to be_valid }
+ end
+
+ context 'is a hash' do
+ let(:deployment_tier) { Hash(tier: 'production') }
+
+ it { expect(entry).not_to be_valid }
+ end
+
+ context 'is nil' do
+ let(:deployment_tier) { nil }
+
+ it { expect(entry).to be_valid }
+ end
+
+ context 'is unknown value' do
+ let(:deployment_tier) { 'unknown' }
+
+ it 'is invalid and adds an error' do
+ expect(entry).not_to be_valid
+ expect(entry.errors).to include("environment deployment tier must be one of #{::Environment.tiers.keys.join(', ')}")
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/ci/config/entry/job_spec.rb b/spec/lib/gitlab/ci/config/entry/job_spec.rb
index a3b5f32b9f9..a4167003987 100644
--- a/spec/lib/gitlab/ci/config/entry/job_spec.rb
+++ b/spec/lib/gitlab/ci/config/entry/job_spec.rb
@@ -537,7 +537,7 @@ RSpec.describe Gitlab::Ci::Config::Entry::Job do
it 'overrides default config' do
expect(entry[:image].value).to eq(name: 'some_image')
- expect(entry[:cache].value).to eq(key: 'test', policy: 'pull-push', when: 'on_success')
+ expect(entry[:cache].value).to eq([key: 'test', policy: 'pull-push', when: 'on_success'])
end
end
@@ -552,7 +552,43 @@ RSpec.describe Gitlab::Ci::Config::Entry::Job do
it 'uses config from default entry' do
expect(entry[:image].value).to eq 'specified'
- expect(entry[:cache].value).to eq(key: 'test', policy: 'pull-push', when: 'on_success')
+ expect(entry[:cache].value).to eq([key: 'test', policy: 'pull-push', when: 'on_success'])
+ end
+ end
+
+ context 'with multiple_cache_per_job FF disabled' do
+ before do
+ stub_feature_flags(multiple_cache_per_job: false)
+ end
+
+ context 'when job config overrides default config' do
+ before do
+ entry.compose!(deps)
+ end
+
+ let(:config) do
+ { script: 'rspec', image: 'some_image', cache: { key: 'test' } }
+ end
+
+ it 'overrides default config' do
+ expect(entry[:image].value).to eq(name: 'some_image')
+ expect(entry[:cache].value).to eq(key: 'test', policy: 'pull-push', when: 'on_success')
+ end
+ end
+
+ context 'when job config does not override default config' do
+ before do
+ allow(default).to receive('[]').with(:image).and_return(specified)
+
+ entry.compose!(deps)
+ end
+
+ let(:config) { { script: 'ls', cache: { key: 'test' } } }
+
+ it 'uses config from default entry' do
+ expect(entry[:image].value).to eq 'specified'
+ expect(entry[:cache].value).to eq(key: 'test', policy: 'pull-push', when: 'on_success')
+ end
end
end
diff --git a/spec/lib/gitlab/ci/config/entry/root_spec.rb b/spec/lib/gitlab/ci/config/entry/root_spec.rb
index 54c7a5c3602..7b38c21788f 100644
--- a/spec/lib/gitlab/ci/config/entry/root_spec.rb
+++ b/spec/lib/gitlab/ci/config/entry/root_spec.rb
@@ -126,49 +126,105 @@ RSpec.describe Gitlab::Ci::Config::Entry::Root do
expect(root.jobs_value.keys).to eq([:rspec, :spinach, :release])
expect(root.jobs_value[:rspec]).to eq(
{ name: :rspec,
- script: %w[rspec ls],
- before_script: %w(ls pwd),
- image: { name: 'ruby:2.7' },
- services: [{ name: 'postgres:9.1' }, { name: 'mysql:5.5' }],
- stage: 'test',
- cache: { key: 'k', untracked: true, paths: ['public/'], policy: 'pull-push', when: 'on_success' },
- variables: { 'VAR' => 'root', 'VAR2' => 'val 2' },
- ignore: false,
- after_script: ['make clean'],
- only: { refs: %w[branches tags] },
- scheduling_type: :stage }
+ script: %w[rspec ls],
+ before_script: %w(ls pwd),
+ image: { name: 'ruby:2.7' },
+ services: [{ name: 'postgres:9.1' }, { name: 'mysql:5.5' }],
+ stage: 'test',
+ cache: [{ key: 'k', untracked: true, paths: ['public/'], policy: 'pull-push', when: 'on_success' }],
+ variables: { 'VAR' => 'root', 'VAR2' => 'val 2' },
+ ignore: false,
+ after_script: ['make clean'],
+ only: { refs: %w[branches tags] },
+ scheduling_type: :stage }
)
expect(root.jobs_value[:spinach]).to eq(
{ name: :spinach,
- before_script: [],
- script: %w[spinach],
- image: { name: 'ruby:2.7' },
- services: [{ name: 'postgres:9.1' }, { name: 'mysql:5.5' }],
- stage: 'test',
- cache: { key: 'k', untracked: true, paths: ['public/'], policy: 'pull-push', when: 'on_success' },
- variables: { 'VAR' => 'root', 'VAR2' => 'val 2' },
- ignore: false,
- after_script: ['make clean'],
- only: { refs: %w[branches tags] },
- scheduling_type: :stage }
+ before_script: [],
+ script: %w[spinach],
+ image: { name: 'ruby:2.7' },
+ services: [{ name: 'postgres:9.1' }, { name: 'mysql:5.5' }],
+ stage: 'test',
+ cache: [{ key: 'k', untracked: true, paths: ['public/'], policy: 'pull-push', when: 'on_success' }],
+ variables: { 'VAR' => 'root', 'VAR2' => 'val 2' },
+ ignore: false,
+ after_script: ['make clean'],
+ only: { refs: %w[branches tags] },
+ scheduling_type: :stage }
)
expect(root.jobs_value[:release]).to eq(
{ name: :release,
- stage: 'release',
- 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" },
- 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) },
- variables: { 'VAR' => 'job', 'VAR2' => 'val 2' },
- after_script: [],
- ignore: false,
- scheduling_type: :stage }
+ stage: 'release',
+ 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" },
+ 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) },
+ variables: { 'VAR' => 'job', 'VAR2' => 'val 2' },
+ after_script: [],
+ ignore: false,
+ scheduling_type: :stage }
)
end
end
+
+ context 'with multuple_cache_per_job FF disabled' do
+ before do
+ stub_feature_flags(multiple_cache_per_job: false)
+ root.compose!
+ end
+
+ describe '#jobs_value' do
+ it 'returns jobs configuration' do
+ expect(root.jobs_value.keys).to eq([:rspec, :spinach, :release])
+ expect(root.jobs_value[:rspec]).to eq(
+ { name: :rspec,
+ script: %w[rspec ls],
+ before_script: %w(ls pwd),
+ image: { name: 'ruby:2.7' },
+ services: [{ name: 'postgres:9.1' }, { name: 'mysql:5.5' }],
+ stage: 'test',
+ cache: { key: 'k', untracked: true, paths: ['public/'], policy: 'pull-push', when: 'on_success' },
+ variables: { 'VAR' => 'root', 'VAR2' => 'val 2' },
+ ignore: false,
+ after_script: ['make clean'],
+ only: { refs: %w[branches tags] },
+ scheduling_type: :stage }
+ )
+ expect(root.jobs_value[:spinach]).to eq(
+ { name: :spinach,
+ before_script: [],
+ script: %w[spinach],
+ image: { name: 'ruby:2.7' },
+ services: [{ name: 'postgres:9.1' }, { name: 'mysql:5.5' }],
+ stage: 'test',
+ cache: { key: 'k', untracked: true, paths: ['public/'], policy: 'pull-push', when: 'on_success' },
+ variables: { 'VAR' => 'root', 'VAR2' => 'val 2' },
+ ignore: false,
+ after_script: ['make clean'],
+ only: { refs: %w[branches tags] },
+ scheduling_type: :stage }
+ )
+ expect(root.jobs_value[:release]).to eq(
+ { name: :release,
+ stage: 'release',
+ 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" },
+ 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) },
+ variables: { 'VAR' => 'job', 'VAR2' => 'val 2' },
+ after_script: [],
+ ignore: false,
+ scheduling_type: :stage }
+ )
+ end
+ end
+ end
end
end
@@ -187,6 +243,52 @@ RSpec.describe Gitlab::Ci::Config::Entry::Root do
spinach: { before_script: [], variables: { VAR: 'job' }, script: 'spinach' } }
end
+ context 'with multiple_cache_per_job FF disabled' do
+ context 'when composed' do
+ before do
+ stub_feature_flags(multiple_cache_per_job: false)
+ root.compose!
+ end
+
+ describe '#errors' do
+ it 'has no errors' do
+ expect(root.errors).to be_empty
+ end
+ end
+
+ describe '#jobs_value' do
+ it 'returns jobs configuration' do
+ expect(root.jobs_value).to eq(
+ rspec: { name: :rspec,
+ script: %w[rspec ls],
+ before_script: %w(ls pwd),
+ image: { name: 'ruby:2.7' },
+ services: [{ name: 'postgres:9.1' }, { name: 'mysql:5.5' }],
+ stage: 'test',
+ cache: { key: 'k', untracked: true, paths: ['public/'], policy: 'pull-push', when: 'on_success' },
+ variables: { 'VAR' => 'root' },
+ ignore: false,
+ after_script: ['make clean'],
+ only: { refs: %w[branches tags] },
+ scheduling_type: :stage },
+ spinach: { name: :spinach,
+ before_script: [],
+ script: %w[spinach],
+ image: { name: 'ruby:2.7' },
+ services: [{ name: 'postgres:9.1' }, { name: 'mysql:5.5' }],
+ stage: 'test',
+ cache: { key: 'k', untracked: true, paths: ['public/'], policy: 'pull-push', when: 'on_success' },
+ variables: { 'VAR' => 'job' },
+ ignore: false,
+ after_script: ['make clean'],
+ only: { refs: %w[branches tags] },
+ scheduling_type: :stage }
+ )
+ end
+ end
+ end
+ end
+
context 'when composed' do
before do
root.compose!
@@ -202,29 +304,29 @@ RSpec.describe Gitlab::Ci::Config::Entry::Root do
it 'returns jobs configuration' do
expect(root.jobs_value).to eq(
rspec: { name: :rspec,
- script: %w[rspec ls],
- before_script: %w(ls pwd),
- image: { name: 'ruby:2.7' },
- services: [{ name: 'postgres:9.1' }, { name: 'mysql:5.5' }],
- stage: 'test',
- cache: { key: 'k', untracked: true, paths: ['public/'], policy: 'pull-push', when: 'on_success' },
- variables: { 'VAR' => 'root' },
- ignore: false,
- after_script: ['make clean'],
- only: { refs: %w[branches tags] },
- scheduling_type: :stage },
+ script: %w[rspec ls],
+ before_script: %w(ls pwd),
+ image: { name: 'ruby:2.7' },
+ services: [{ name: 'postgres:9.1' }, { name: 'mysql:5.5' }],
+ stage: 'test',
+ cache: [{ key: 'k', untracked: true, paths: ['public/'], policy: 'pull-push', when: 'on_success' }],
+ variables: { 'VAR' => 'root' },
+ ignore: false,
+ after_script: ['make clean'],
+ only: { refs: %w[branches tags] },
+ scheduling_type: :stage },
spinach: { name: :spinach,
- before_script: [],
- script: %w[spinach],
- image: { name: 'ruby:2.7' },
- services: [{ name: 'postgres:9.1' }, { name: 'mysql:5.5' }],
- stage: 'test',
- cache: { key: 'k', untracked: true, paths: ['public/'], policy: 'pull-push', when: 'on_success' },
- variables: { 'VAR' => 'job' },
- ignore: false,
- after_script: ['make clean'],
- only: { refs: %w[branches tags] },
- scheduling_type: :stage }
+ before_script: [],
+ script: %w[spinach],
+ image: { name: 'ruby:2.7' },
+ services: [{ name: 'postgres:9.1' }, { name: 'mysql:5.5' }],
+ stage: 'test',
+ cache: [{ key: 'k', untracked: true, paths: ['public/'], policy: 'pull-push', when: 'on_success' }],
+ variables: { 'VAR' => 'job' },
+ ignore: false,
+ after_script: ['make clean'],
+ only: { refs: %w[branches tags] },
+ scheduling_type: :stage }
)
end
end
@@ -265,7 +367,20 @@ RSpec.describe Gitlab::Ci::Config::Entry::Root do
describe '#cache_value' do
it 'returns correct cache definition' do
- expect(root.cache_value).to eq(key: 'a', policy: 'pull-push', when: 'on_success')
+ expect(root.cache_value).to eq([key: 'a', policy: 'pull-push', when: 'on_success'])
+ end
+ end
+
+ context 'with multiple_cache_per_job FF disabled' do
+ before do
+ stub_feature_flags(multiple_cache_per_job: false)
+ root.compose!
+ end
+
+ describe '#cache_value' do
+ it 'returns correct cache definition' do
+ expect(root.cache_value).to eq(key: 'a', policy: 'pull-push', when: 'on_success')
+ end
end
end
end
diff --git a/spec/lib/gitlab/ci/jwt_spec.rb b/spec/lib/gitlab/ci/jwt_spec.rb
index 342ca6b8b75..480a4a05379 100644
--- a/spec/lib/gitlab/ci/jwt_spec.rb
+++ b/spec/lib/gitlab/ci/jwt_spec.rb
@@ -114,17 +114,6 @@ RSpec.describe Gitlab::Ci::Jwt do
expect(payload[:environment]).to eq('production')
expect(payload[:environment_protected]).to eq('false')
end
-
- context ':ci_jwt_include_environment feature flag is disabled' do
- before do
- stub_feature_flags(ci_jwt_include_environment: false)
- end
-
- it 'does not include environment attributes' do
- expect(payload).not_to have_key(:environment)
- expect(payload).not_to have_key(:environment_protected)
- end
- end
end
end
diff --git a/spec/lib/gitlab/ci/pipeline/expression/statement_spec.rb b/spec/lib/gitlab/ci/pipeline/expression/statement_spec.rb
index cf3644c9ad5..ec7eebdc056 100644
--- a/spec/lib/gitlab/ci/pipeline/expression/statement_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/expression/statement_spec.rb
@@ -3,17 +3,16 @@
require 'spec_helper'
RSpec.describe Gitlab::Ci::Pipeline::Expression::Statement do
- subject do
- described_class.new(text, variables)
+ let(:variables) do
+ Gitlab::Ci::Variables::Collection.new
+ .append(key: 'PRESENT_VARIABLE', value: 'my variable')
+ .append(key: 'PATH_VARIABLE', value: 'a/path/variable/value')
+ .append(key: 'FULL_PATH_VARIABLE', value: '/a/full/path/variable/value')
+ .append(key: 'EMPTY_VARIABLE', value: '')
end
- let(:variables) do
- {
- 'PRESENT_VARIABLE' => 'my variable',
- 'PATH_VARIABLE' => 'a/path/variable/value',
- 'FULL_PATH_VARIABLE' => '/a/full/path/variable/value',
- 'EMPTY_VARIABLE' => ''
- }
+ subject do
+ described_class.new(text, variables)
end
describe '.new' do
diff --git a/spec/lib/gitlab/ci/pipeline/seed/build/cache_spec.rb b/spec/lib/gitlab/ci/pipeline/seed/build/cache_spec.rb
index 570706bfaac..773cb61b946 100644
--- a/spec/lib/gitlab/ci/pipeline/seed/build/cache_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/seed/build/cache_spec.rb
@@ -9,8 +9,255 @@ RSpec.describe Gitlab::Ci::Pipeline::Seed::Build::Cache do
let(:processor) { described_class.new(pipeline, config) }
- describe '#build_attributes' do
- subject { processor.build_attributes }
+ context 'with multiple_cache_per_job ff disabled' do
+ before do
+ stub_feature_flags(multiple_cache_per_job: false)
+ end
+
+ describe '#build_attributes' do
+ subject { processor.build_attributes }
+
+ context 'with cache:key' do
+ let(:config) do
+ {
+ key: 'a-key',
+ paths: ['vendor/ruby']
+ }
+ end
+
+ it { is_expected.to include(options: { cache: config }) }
+ end
+
+ context 'with cache:key as a symbol' do
+ let(:config) do
+ {
+ key: :a_key,
+ paths: ['vendor/ruby']
+ }
+ end
+
+ it { is_expected.to include(options: { cache: config.merge(key: "a_key") }) }
+ end
+
+ context 'with cache:key:files' do
+ shared_examples 'default key' do
+ let(:config) do
+ { key: { files: files } }
+ end
+
+ it 'uses default key' do
+ expected = { options: { cache: { key: 'default' } } }
+
+ is_expected.to include(expected)
+ end
+ end
+
+ shared_examples 'version and gemfile files' do
+ let(:config) do
+ {
+ key: {
+ files: files
+ },
+ paths: ['vendor/ruby']
+ }
+ end
+
+ it 'builds a string key' do
+ expected = {
+ options: {
+ cache: {
+ key: '703ecc8fef1635427a1f86a8a1a308831c122392',
+ paths: ['vendor/ruby']
+ }
+ }
+ }
+
+ is_expected.to include(expected)
+ end
+ end
+
+ context 'with existing files' do
+ let(:files) { ['VERSION', 'Gemfile.zip'] }
+
+ it_behaves_like 'version and gemfile files'
+ end
+
+ context 'with files starting with ./' do
+ let(:files) { ['Gemfile.zip', './VERSION'] }
+
+ it_behaves_like 'version and gemfile files'
+ end
+
+ context 'with files ending with /' do
+ let(:files) { ['Gemfile.zip/'] }
+
+ it_behaves_like 'default key'
+ end
+
+ context 'with new line in filenames' do
+ let(:files) { ["Gemfile.zip\nVERSION"] }
+
+ it_behaves_like 'default key'
+ end
+
+ context 'with missing files' do
+ let(:files) { ['project-gemfile.lock', ''] }
+
+ it_behaves_like 'default key'
+ end
+
+ context 'with directories' do
+ shared_examples 'foo/bar directory key' do
+ let(:config) do
+ {
+ key: {
+ files: files
+ }
+ }
+ end
+
+ it 'builds a string key' do
+ expected = {
+ options: {
+ cache: { key: '74bf43fb1090f161bdd4e265802775dbda2f03d1' }
+ }
+ }
+
+ is_expected.to include(expected)
+ end
+ end
+
+ context 'with directory' do
+ let(:files) { ['foo/bar'] }
+
+ it_behaves_like 'foo/bar directory key'
+ end
+
+ context 'with directory ending in slash' do
+ let(:files) { ['foo/bar/'] }
+
+ it_behaves_like 'foo/bar directory key'
+ end
+
+ context 'with directories ending in slash star' do
+ let(:files) { ['foo/bar/*'] }
+
+ it_behaves_like 'foo/bar directory key'
+ end
+ end
+ end
+
+ context 'with cache:key:prefix' do
+ context 'without files' do
+ let(:config) do
+ {
+ key: {
+ prefix: 'a-prefix'
+ },
+ paths: ['vendor/ruby']
+ }
+ end
+
+ it 'adds prefix to default key' do
+ expected = {
+ options: {
+ cache: {
+ key: 'a-prefix-default',
+ paths: ['vendor/ruby']
+ }
+ }
+ }
+
+ is_expected.to include(expected)
+ end
+ end
+
+ context 'with existing files' do
+ let(:config) do
+ {
+ key: {
+ files: ['VERSION', 'Gemfile.zip'],
+ prefix: 'a-prefix'
+ },
+ paths: ['vendor/ruby']
+ }
+ end
+
+ it 'adds prefix key' do
+ expected = {
+ options: {
+ cache: {
+ key: 'a-prefix-703ecc8fef1635427a1f86a8a1a308831c122392',
+ paths: ['vendor/ruby']
+ }
+ }
+ }
+
+ is_expected.to include(expected)
+ end
+ end
+
+ context 'with missing files' do
+ let(:config) do
+ {
+ key: {
+ files: ['project-gemfile.lock', ''],
+ prefix: 'a-prefix'
+ },
+ paths: ['vendor/ruby']
+ }
+ end
+
+ it 'adds prefix to default key' do
+ expected = {
+ options: {
+ cache: {
+ key: 'a-prefix-default',
+ paths: ['vendor/ruby']
+ }
+ }
+ }
+
+ is_expected.to include(expected)
+ end
+ end
+ end
+
+ context 'with all cache option keys' do
+ let(:config) do
+ {
+ key: 'a-key',
+ paths: ['vendor/ruby'],
+ untracked: true,
+ policy: 'push',
+ when: 'on_success'
+ }
+ end
+
+ it { is_expected.to include(options: { cache: config }) }
+ end
+
+ context 'with unknown cache option keys' do
+ let(:config) do
+ {
+ key: 'a-key',
+ unknown_key: true
+ }
+ end
+
+ it { expect { subject }.to raise_error(ArgumentError, /unknown_key/) }
+ end
+
+ context 'with empty config' do
+ let(:config) { {} }
+
+ it { is_expected.to include(options: {}) }
+ end
+ end
+ end
+
+ describe '#attributes' do
+ subject { processor.attributes }
context 'with cache:key' do
let(:config) do
@@ -20,7 +267,7 @@ RSpec.describe Gitlab::Ci::Pipeline::Seed::Build::Cache do
}
end
- it { is_expected.to include(options: { cache: config }) }
+ it { is_expected.to include(config) }
end
context 'with cache:key as a symbol' do
@@ -31,7 +278,7 @@ RSpec.describe Gitlab::Ci::Pipeline::Seed::Build::Cache do
}
end
- it { is_expected.to include(options: { cache: config.merge(key: "a_key") }) }
+ it { is_expected.to include(config.merge(key: "a_key")) }
end
context 'with cache:key:files' do
@@ -41,7 +288,7 @@ RSpec.describe Gitlab::Ci::Pipeline::Seed::Build::Cache do
end
it 'uses default key' do
- expected = { options: { cache: { key: 'default' } } }
+ expected = { key: 'default' }
is_expected.to include(expected)
end
@@ -59,13 +306,9 @@ RSpec.describe Gitlab::Ci::Pipeline::Seed::Build::Cache do
it 'builds a string key' do
expected = {
- options: {
- cache: {
key: '703ecc8fef1635427a1f86a8a1a308831c122392',
paths: ['vendor/ruby']
- }
}
- }
is_expected.to include(expected)
end
@@ -112,11 +355,7 @@ RSpec.describe Gitlab::Ci::Pipeline::Seed::Build::Cache do
end
it 'builds a string key' do
- expected = {
- options: {
- cache: { key: '74bf43fb1090f161bdd4e265802775dbda2f03d1' }
- }
- }
+ expected = { key: '74bf43fb1090f161bdd4e265802775dbda2f03d1' }
is_expected.to include(expected)
end
@@ -155,13 +394,9 @@ RSpec.describe Gitlab::Ci::Pipeline::Seed::Build::Cache do
it 'adds prefix to default key' do
expected = {
- options: {
- cache: {
key: 'a-prefix-default',
paths: ['vendor/ruby']
}
- }
- }
is_expected.to include(expected)
end
@@ -180,13 +415,9 @@ RSpec.describe Gitlab::Ci::Pipeline::Seed::Build::Cache do
it 'adds prefix key' do
expected = {
- options: {
- cache: {
key: 'a-prefix-703ecc8fef1635427a1f86a8a1a308831c122392',
paths: ['vendor/ruby']
}
- }
- }
is_expected.to include(expected)
end
@@ -205,13 +436,9 @@ RSpec.describe Gitlab::Ci::Pipeline::Seed::Build::Cache do
it 'adds prefix to default key' do
expected = {
- options: {
- cache: {
key: 'a-prefix-default',
paths: ['vendor/ruby']
}
- }
- }
is_expected.to include(expected)
end
@@ -229,7 +456,7 @@ RSpec.describe Gitlab::Ci::Pipeline::Seed::Build::Cache do
}
end
- it { is_expected.to include(options: { cache: config }) }
+ it { is_expected.to include(config) }
end
context 'with unknown cache option keys' do
@@ -242,11 +469,5 @@ RSpec.describe Gitlab::Ci::Pipeline::Seed::Build::Cache do
it { expect { subject }.to raise_error(ArgumentError, /unknown_key/) }
end
-
- context 'with empty config' do
- let(:config) { {} }
-
- it { is_expected.to include(options: {}) }
- end
end
end
diff --git a/spec/lib/gitlab/ci/pipeline/seed/build_spec.rb b/spec/lib/gitlab/ci/pipeline/seed/build_spec.rb
index 0efc7484699..b195a02f051 100644
--- a/spec/lib/gitlab/ci/pipeline/seed/build_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/seed/build_spec.rb
@@ -85,99 +85,169 @@ RSpec.describe Gitlab::Ci::Pipeline::Seed::Build do
{ key: 'VAR2', value: 'var 2', public: true },
{ key: 'VAR3', value: 'var 3', public: true }])
end
+ end
- context 'when FF ci_rules_variables is disabled' do
- before do
- stub_feature_flags(ci_rules_variables: false)
- end
+ context 'with multiple_cache_per_job FF disabled' do
+ before do
+ stub_feature_flags(multiple_cache_per_job: false)
+ end
- it do
- is_expected.to include(yaml_variables: [{ key: 'VAR1', value: 'var 1', public: true },
- { key: 'VAR2', value: 'var 2', public: true }])
+ context 'with cache:key' do
+ let(:attributes) do
+ {
+ name: 'rspec',
+ ref: 'master',
+ cache: {
+ key: 'a-value'
+ }
+ }
end
+
+ it { is_expected.to include(options: { cache: { key: 'a-value' } }) }
end
- end
- context 'with cache:key' do
- let(:attributes) do
- {
- name: 'rspec',
- ref: 'master',
- cache: {
- key: 'a-value'
+ context 'with cache:key:files' do
+ let(:attributes) do
+ {
+ name: 'rspec',
+ ref: 'master',
+ cache: {
+ key: {
+ files: ['VERSION']
+ }
+ }
}
- }
- end
+ end
- it { is_expected.to include(options: { cache: { key: 'a-value' } }) }
- end
+ it 'includes cache options' do
+ cache_options = {
+ options: {
+ cache: { key: 'f155568ad0933d8358f66b846133614f76dd0ca4' }
+ }
+ }
- context 'with cache:key:files' do
- let(:attributes) do
- {
- name: 'rspec',
- ref: 'master',
- cache: {
- key: {
- files: ['VERSION']
+ is_expected.to include(cache_options)
+ end
+ end
+
+ context 'with cache:key:prefix' do
+ let(:attributes) do
+ {
+ name: 'rspec',
+ ref: 'master',
+ cache: {
+ key: {
+ prefix: 'something'
+ }
}
}
- }
+ end
+
+ it { is_expected.to include(options: { cache: { key: 'something-default' } }) }
end
- it 'includes cache options' do
- cache_options = {
- options: {
+ context 'with cache:key:files and prefix' do
+ let(:attributes) do
+ {
+ name: 'rspec',
+ ref: 'master',
cache: {
- key: 'f155568ad0933d8358f66b846133614f76dd0ca4'
+ key: {
+ files: ['VERSION'],
+ prefix: 'something'
+ }
+ }
+ }
+ end
+
+ it 'includes cache options' do
+ cache_options = {
+ options: {
+ cache: { key: 'something-f155568ad0933d8358f66b846133614f76dd0ca4' }
}
}
- }
- is_expected.to include(cache_options)
+ is_expected.to include(cache_options)
+ end
end
end
- context 'with cache:key:prefix' do
+ context 'with cache:key' do
let(:attributes) do
{
name: 'rspec',
ref: 'master',
- cache: {
- key: {
- prefix: 'something'
- }
- }
+ cache: [{
+ key: 'a-value'
+ }]
}
end
- it { is_expected.to include(options: { cache: { key: 'something-default' } }) }
- end
+ it { is_expected.to include(options: { cache: [a_hash_including(key: 'a-value')] }) }
- context 'with cache:key:files and prefix' do
- let(:attributes) do
- {
- name: 'rspec',
- ref: 'master',
- cache: {
- key: {
- files: ['VERSION'],
- prefix: 'something'
+ context 'with cache:key:files' do
+ let(:attributes) do
+ {
+ name: 'rspec',
+ ref: 'master',
+ cache: [{
+ key: {
+ files: ['VERSION']
+ }
+ }]
+ }
+ end
+
+ it 'includes cache options' do
+ cache_options = {
+ options: {
+ cache: [a_hash_including(key: 'f155568ad0933d8358f66b846133614f76dd0ca4')]
}
}
- }
+
+ is_expected.to include(cache_options)
+ end
end
- it 'includes cache options' do
- cache_options = {
- options: {
- cache: {
- key: 'something-f155568ad0933d8358f66b846133614f76dd0ca4'
+ context 'with cache:key:prefix' do
+ let(:attributes) do
+ {
+ name: 'rspec',
+ ref: 'master',
+ cache: [{
+ key: {
+ prefix: 'something'
+ }
+ }]
+ }
+ end
+
+ it { is_expected.to include(options: { cache: [a_hash_including( key: 'something-default' )] }) }
+ end
+
+ context 'with cache:key:files and prefix' do
+ let(:attributes) do
+ {
+ name: 'rspec',
+ ref: 'master',
+ cache: [{
+ key: {
+ files: ['VERSION'],
+ prefix: 'something'
+ }
+ }]
+ }
+ end
+
+ it 'includes cache options' do
+ cache_options = {
+ options: {
+ cache: [a_hash_including(key: 'something-f155568ad0933d8358f66b846133614f76dd0ca4')]
}
}
- }
- is_expected.to include(cache_options)
+ is_expected.to include(cache_options)
+ end
end
end
@@ -190,7 +260,7 @@ RSpec.describe Gitlab::Ci::Pipeline::Seed::Build do
}
end
- it { is_expected.to include(options: {}) }
+ it { is_expected.to include({}) }
end
context 'with allow_failure' do
@@ -307,7 +377,7 @@ RSpec.describe Gitlab::Ci::Pipeline::Seed::Build do
it 'does not have environment' do
expect(subject).not_to be_has_environment
expect(subject.environment).to be_nil
- expect(subject.metadata.expanded_environment_name).to be_nil
+ expect(subject.metadata).to be_nil
expect(Environment.exists?(name: expected_environment_name)).to eq(false)
end
end
@@ -1036,4 +1106,75 @@ RSpec.describe Gitlab::Ci::Pipeline::Seed::Build do
end
end
end
+
+ describe 'applying pipeline variables' do
+ subject { seed_build }
+
+ let(:pipeline_variables) { [] }
+ let(:pipeline) do
+ build(:ci_empty_pipeline, project: project, sha: head_sha, variables: pipeline_variables)
+ end
+
+ context 'containing variable references' do
+ let(:pipeline_variables) do
+ [
+ build(:ci_pipeline_variable, key: 'A', value: '$B'),
+ build(:ci_pipeline_variable, key: 'B', value: '$C')
+ ]
+ end
+
+ context 'when FF :variable_inside_variable is enabled' do
+ before do
+ stub_feature_flags(variable_inside_variable: [project])
+ end
+
+ it "does not have errors" do
+ expect(subject.errors).to be_empty
+ end
+ end
+ end
+
+ context 'containing cyclic reference' do
+ let(:pipeline_variables) do
+ [
+ build(:ci_pipeline_variable, key: 'A', value: '$B'),
+ build(:ci_pipeline_variable, key: 'B', value: '$C'),
+ build(:ci_pipeline_variable, key: 'C', value: '$A')
+ ]
+ end
+
+ context 'when FF :variable_inside_variable is disabled' do
+ before do
+ stub_feature_flags(variable_inside_variable: false)
+ end
+
+ it "does not have errors" do
+ expect(subject.errors).to be_empty
+ end
+ end
+
+ context 'when FF :variable_inside_variable is enabled' do
+ before do
+ stub_feature_flags(variable_inside_variable: [project])
+ end
+
+ it "returns an error" do
+ expect(subject.errors).to contain_exactly(
+ 'rspec: circular variable reference detected: ["A", "B", "C"]')
+ end
+
+ context 'with job:rules:[if:]' do
+ let(:attributes) { { name: 'rspec', ref: 'master', rules: [{ if: '$C != null', when: 'always' }] } }
+
+ it "included? does not raise" do
+ expect { subject.included? }.not_to raise_error
+ end
+
+ it "included? returns true" do
+ expect(subject.included?).to eq(true)
+ end
+ end
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/ci/pipeline/seed/environment_spec.rb b/spec/lib/gitlab/ci/pipeline/seed/environment_spec.rb
index 664aaaedf7b..31391767a6f 100644
--- a/spec/lib/gitlab/ci/pipeline/seed/environment_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/seed/environment_spec.rb
@@ -88,6 +88,65 @@ RSpec.describe Gitlab::Ci::Pipeline::Seed::Environment do
end
end
+ context 'when job has deployment tier attribute' do
+ let(:attributes) do
+ {
+ environment: 'customer-portal',
+ options: {
+ environment: {
+ name: 'customer-portal',
+ deployment_tier: deployment_tier
+ }
+ }
+ }
+ end
+
+ let(:deployment_tier) { 'production' }
+
+ context 'when environment has not been created yet' do
+ it 'sets the specified deployment tier' do
+ is_expected.to be_production
+ end
+
+ context 'when deployment tier is staging' do
+ let(:deployment_tier) { 'staging' }
+
+ it 'sets the specified deployment tier' do
+ is_expected.to be_staging
+ end
+ end
+
+ context 'when deployment tier is unknown' do
+ let(:deployment_tier) { 'unknown' }
+
+ it 'raises an error' do
+ expect { subject }.to raise_error(ArgumentError, "'unknown' is not a valid tier")
+ end
+ end
+
+ context 'when environment_tier feature flag is disabled' do
+ before do
+ stub_feature_flags(environment_tier: false)
+ end
+
+ it 'does not set the specified tier' do
+ expect(subject.tier).to be_nil
+ end
+ end
+ end
+
+ context 'when environment has already been created' do
+ before do
+ create(:environment, :staging, project: project, name: 'customer-portal')
+ end
+
+ it 'does not overwrite the specified deployment tier' do
+ # This is to be updated when a deployment succeeded i.e. Deployments::UpdateEnvironmentService.
+ is_expected.to be_staging
+ end
+ end
+ end
+
context 'when job starts a review app' do
let(:environment_name) { 'review/$CI_COMMIT_REF_NAME' }
let(:expected_environment_name) { "review/#{job.ref}" }
diff --git a/spec/lib/gitlab/ci/reports/codequality_reports_comparer_spec.rb b/spec/lib/gitlab/ci/reports/codequality_reports_comparer_spec.rb
index 90188b56f5a..b322e55cb5a 100644
--- a/spec/lib/gitlab/ci/reports/codequality_reports_comparer_spec.rb
+++ b/spec/lib/gitlab/ci/reports/codequality_reports_comparer_spec.rb
@@ -27,6 +27,22 @@ RSpec.describe Gitlab::Ci::Reports::CodequalityReportsComparer do
expect(report_status).to eq(described_class::STATUS_SUCCESS)
end
end
+
+ context 'when head report does not exist' do
+ let(:head_report) { nil }
+
+ it 'returns status not found' do
+ expect(report_status).to eq(described_class::STATUS_NOT_FOUND)
+ end
+ end
+
+ context 'when base report does not exist' do
+ let(:base_report) { nil }
+
+ it 'returns status success' do
+ expect(report_status).to eq(described_class::STATUS_NOT_FOUND)
+ end
+ end
end
describe '#errors_count' do
@@ -93,6 +109,14 @@ RSpec.describe Gitlab::Ci::Reports::CodequalityReportsComparer do
expect(resolved_count).to be_zero
end
end
+
+ context 'when base report is nil' do
+ let(:base_report) { nil }
+
+ it 'returns zero' do
+ expect(resolved_count).to be_zero
+ end
+ end
end
describe '#total_count' do
@@ -140,6 +164,14 @@ RSpec.describe Gitlab::Ci::Reports::CodequalityReportsComparer do
expect(total_count).to eq(2)
end
end
+
+ context 'when base report is nil' do
+ let(:base_report) { nil }
+
+ it 'returns zero' do
+ expect(total_count).to be_zero
+ end
+ end
end
describe '#existing_errors' do
@@ -177,6 +209,14 @@ RSpec.describe Gitlab::Ci::Reports::CodequalityReportsComparer do
expect(existing_errors).to be_empty
end
end
+
+ context 'when base report is nil' do
+ let(:base_report) { nil }
+
+ it 'returns an empty array' do
+ expect(existing_errors).to be_empty
+ end
+ end
end
describe '#new_errors' do
@@ -213,6 +253,14 @@ RSpec.describe Gitlab::Ci::Reports::CodequalityReportsComparer do
expect(new_errors).to eq([degradation_1])
end
end
+
+ context 'when base report is nil' do
+ let(:base_report) { nil }
+
+ it 'returns an empty array' do
+ expect(new_errors).to be_empty
+ end
+ end
end
describe '#resolved_errors' do
@@ -250,5 +298,13 @@ RSpec.describe Gitlab::Ci::Reports::CodequalityReportsComparer do
expect(resolved_errors).to be_empty
end
end
+
+ context 'when base report is nil' do
+ let(:base_report) { nil }
+
+ it 'returns an empty array' do
+ expect(resolved_errors).to be_empty
+ end
+ end
end
end
diff --git a/spec/lib/gitlab/ci/reports/reports_comparer_spec.rb b/spec/lib/gitlab/ci/reports/reports_comparer_spec.rb
index 1e5e4766583..7ed9270e9a0 100644
--- a/spec/lib/gitlab/ci/reports/reports_comparer_spec.rb
+++ b/spec/lib/gitlab/ci/reports/reports_comparer_spec.rb
@@ -45,6 +45,22 @@ RSpec.describe Gitlab::Ci::Reports::ReportsComparer do
expect(status).to eq('failed')
end
end
+
+ context 'when base_report is nil' do
+ let(:base_report) { nil }
+
+ it 'returns status not_found' do
+ expect(status).to eq('not_found')
+ end
+ end
+
+ context 'when head_report is nil' do
+ let(:head_report) { nil }
+
+ it 'returns status not_found' do
+ expect(status).to eq('not_found')
+ end
+ end
end
describe '#success?' do
@@ -94,4 +110,22 @@ RSpec.describe Gitlab::Ci::Reports::ReportsComparer do
expect { total_count }.to raise_error(NotImplementedError)
end
end
+
+ describe '#not_found?' do
+ subject(:not_found) { comparer.not_found? }
+
+ context 'when base report is nil' do
+ let(:base_report) { nil }
+
+ it { is_expected.to be_truthy }
+ end
+
+ context 'when base report exists' do
+ before do
+ allow(comparer).to receive(:success?).and_return(true)
+ end
+
+ it { is_expected.to be_falsey }
+ end
+ end
end
diff --git a/spec/lib/gitlab/ci/status/composite_spec.rb b/spec/lib/gitlab/ci/status/composite_spec.rb
index bcfb9f19792..543cfe874ca 100644
--- a/spec/lib/gitlab/ci/status/composite_spec.rb
+++ b/spec/lib/gitlab/ci/status/composite_spec.rb
@@ -69,6 +69,8 @@ RSpec.describe Gitlab::Ci::Status::Composite do
%i(manual) | false | 'skipped' | false
%i(skipped failed) | false | 'success' | true
%i(skipped failed) | true | 'skipped' | true
+ %i(success manual) | true | 'skipped' | false
+ %i(success manual) | false | 'success' | false
%i(created failed) | false | 'created' | true
%i(preparing manual) | false | 'preparing' | false
end
@@ -80,6 +82,25 @@ RSpec.describe Gitlab::Ci::Status::Composite do
it_behaves_like 'compares status and warnings'
end
+
+ context 'when FF ci_fix_pipeline_status_for_dag_needs_manual is disabled' do
+ before do
+ stub_feature_flags(ci_fix_pipeline_status_for_dag_needs_manual: false)
+ end
+
+ where(:build_statuses, :dag, :result, :has_warnings) do
+ %i(success manual) | true | 'pending' | false
+ %i(success manual) | false | 'success' | false
+ end
+
+ with_them do
+ let(:all_statuses) do
+ build_statuses.map { |status| @statuses_with_allow_failure[status] }
+ end
+
+ it_behaves_like 'compares status and warnings'
+ end
+ end
end
end
end
diff --git a/spec/lib/gitlab/ci/status/factory_spec.rb b/spec/lib/gitlab/ci/status/factory_spec.rb
index 641cb0183d3..94a6255f1e2 100644
--- a/spec/lib/gitlab/ci/status/factory_spec.rb
+++ b/spec/lib/gitlab/ci/status/factory_spec.rb
@@ -134,4 +134,14 @@ RSpec.describe Gitlab::Ci::Status::Factory do
it_behaves_like 'compound decorator factory'
end
end
+
+ context 'behaviour of FactoryBot traits that create associations' do
+ context 'creating a namespace with an associated aggregation_schedule record' do
+ it 'creates only one Namespace record and one Namespace::AggregationSchedule record' do
+ expect { create(:namespace, :with_aggregation_schedule) }
+ .to change { Namespace.count }.by(1)
+ .and change { Namespace::AggregationSchedule.count }.by(1)
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/ci/templates/auto_devops_gitlab_ci_yaml_spec.rb b/spec/lib/gitlab/ci/templates/auto_devops_gitlab_ci_yaml_spec.rb
index f9d6fe24e70..6dfcecb853a 100644
--- a/spec/lib/gitlab/ci/templates/auto_devops_gitlab_ci_yaml_spec.rb
+++ b/spec/lib/gitlab/ci/templates/auto_devops_gitlab_ci_yaml_spec.rb
@@ -3,252 +3,260 @@
require 'spec_helper'
RSpec.describe 'Auto-DevOps.gitlab-ci.yml' do
+ using RSpec::Parameterized::TableSyntax
+
subject(:template) { Gitlab::Template::GitlabCiYmlTemplate.find('Auto-DevOps') }
- describe 'the created pipeline' do
- let(:default_branch) { 'master' }
- let(:pipeline_branch) { default_branch }
- let(:project) { create(:project, :auto_devops, :custom_repo, files: { 'README.md' => '' }) }
- let(:user) { project.owner }
- let(:service) { Ci::CreatePipelineService.new(project, user, ref: pipeline_branch ) }
- let(:pipeline) { service.execute!(:push) }
- let(:build_names) { pipeline.builds.pluck(:name) }
-
- before do
- stub_ci_pipeline_yaml_file(template.content)
- allow_any_instance_of(Ci::BuildScheduleWorker).to receive(:perform).and_return(true)
- allow(project).to receive(:default_branch).and_return(default_branch)
- end
+ where(:default_branch) do
+ %w[master main]
+ end
- shared_examples 'no Kubernetes deployment job' do
- it 'does not create any Kubernetes deployment-related builds' do
- expect(build_names).not_to include('production')
- expect(build_names).not_to include('production_manual')
- expect(build_names).not_to include('staging')
- expect(build_names).not_to include('canary')
- expect(build_names).not_to include('review')
- expect(build_names).not_to include(a_string_matching(/rollout \d+%/))
- end
- end
+ with_them do
+ describe 'the created pipeline' do
+ let(:pipeline_branch) { default_branch }
+ let(:project) { create(:project, :auto_devops, :custom_repo, files: { 'README.md' => '' }) }
+ let(:user) { project.owner }
+ let(:service) { Ci::CreatePipelineService.new(project, user, ref: pipeline_branch ) }
+ let(:pipeline) { service.execute!(:push) }
+ let(:build_names) { pipeline.builds.pluck(:name) }
- it 'creates a build and a test job' do
- expect(build_names).to include('build', 'test')
- end
+ before do
+ stub_application_setting(default_branch_name: default_branch)
+ stub_ci_pipeline_yaml_file(template.content)
+ allow_any_instance_of(Ci::BuildScheduleWorker).to receive(:perform).and_return(true)
+ end
- context 'when the project is set for deployment to AWS' do
- let(:platform_value) { 'ECS' }
- let(:review_prod_build_names) { build_names.select {|n| n.include?('review') || n.include?('production')} }
+ shared_examples 'no Kubernetes deployment job' do
+ it 'does not create any Kubernetes deployment-related builds' do
+ expect(build_names).not_to include('production')
+ expect(build_names).not_to include('production_manual')
+ expect(build_names).not_to include('staging')
+ expect(build_names).not_to include('canary')
+ expect(build_names).not_to include('review')
+ expect(build_names).not_to include(a_string_matching(/rollout \d+%/))
+ end
+ end
- before do
- create(:ci_variable, project: project, key: 'AUTO_DEVOPS_PLATFORM_TARGET', value: platform_value)
+ it 'creates a build and a test job' do
+ expect(build_names).to include('build', 'test')
end
- shared_examples 'no ECS job when AUTO_DEVOPS_PLATFORM_TARGET is not present' do |job_name|
- context 'when AUTO_DEVOPS_PLATFORM_TARGET is nil' do
- let(:platform_value) { nil }
+ context 'when the project is set for deployment to AWS' do
+ let(:platform_value) { 'ECS' }
+ let(:review_prod_build_names) { build_names.select {|n| n.include?('review') || n.include?('production')} }
- it 'does not trigger the job' do
- expect(build_names).not_to include(job_name)
- end
+ before do
+ create(:ci_variable, project: project, key: 'AUTO_DEVOPS_PLATFORM_TARGET', value: platform_value)
end
- context 'when AUTO_DEVOPS_PLATFORM_TARGET is empty' do
- let(:platform_value) { '' }
+ shared_examples 'no ECS job when AUTO_DEVOPS_PLATFORM_TARGET is not present' do |job_name|
+ context 'when AUTO_DEVOPS_PLATFORM_TARGET is nil' do
+ let(:platform_value) { nil }
- it 'does not trigger the job' do
- expect(build_names).not_to include(job_name)
+ it 'does not trigger the job' do
+ expect(build_names).not_to include(job_name)
+ end
end
- end
- end
- it_behaves_like 'no Kubernetes deployment job'
+ context 'when AUTO_DEVOPS_PLATFORM_TARGET is empty' do
+ let(:platform_value) { '' }
- it_behaves_like 'no ECS job when AUTO_DEVOPS_PLATFORM_TARGET is not present' do
- let(:job_name) { 'production_ecs' }
- end
+ it 'does not trigger the job' do
+ expect(build_names).not_to include(job_name)
+ end
+ end
+ end
- it 'creates an ECS deployment job for production only' do
- expect(review_prod_build_names).to contain_exactly('production_ecs')
- end
+ it_behaves_like 'no Kubernetes deployment job'
- context 'with FARGATE as a launch type' do
- let(:platform_value) { 'FARGATE' }
+ it_behaves_like 'no ECS job when AUTO_DEVOPS_PLATFORM_TARGET is not present' do
+ let(:job_name) { 'production_ecs' }
+ end
- it 'creates a FARGATE deployment job for production only' do
- expect(review_prod_build_names).to contain_exactly('production_fargate')
+ it 'creates an ECS deployment job for production only' do
+ expect(review_prod_build_names).to contain_exactly('production_ecs')
end
- end
- context 'and we are not on the default branch' do
- let(:platform_value) { 'ECS' }
- let(:pipeline_branch) { 'patch-1' }
+ context 'with FARGATE as a launch type' do
+ let(:platform_value) { 'FARGATE' }
- before do
- project.repository.create_branch(pipeline_branch)
+ it 'creates a FARGATE deployment job for production only' do
+ expect(review_prod_build_names).to contain_exactly('production_fargate')
+ end
end
- %w(review_ecs review_fargate).each do |job|
- it_behaves_like 'no ECS job when AUTO_DEVOPS_PLATFORM_TARGET is not present' do
- let(:job_name) { job }
+ context 'and we are not on the default branch' do
+ let(:platform_value) { 'ECS' }
+ let(:pipeline_branch) { 'patch-1' }
+
+ before do
+ project.repository.create_branch(pipeline_branch, default_branch)
end
- end
- it 'creates an ECS deployment job for review only' do
- expect(review_prod_build_names).to contain_exactly('review_ecs', 'stop_review_ecs')
- end
+ %w(review_ecs review_fargate).each do |job|
+ it_behaves_like 'no ECS job when AUTO_DEVOPS_PLATFORM_TARGET is not present' do
+ let(:job_name) { job }
+ end
+ end
- context 'with FARGATE as a launch type' do
- let(:platform_value) { 'FARGATE' }
+ it 'creates an ECS deployment job for review only' do
+ expect(review_prod_build_names).to contain_exactly('review_ecs', 'stop_review_ecs')
+ end
+
+ context 'with FARGATE as a launch type' do
+ let(:platform_value) { 'FARGATE' }
- it 'creates an FARGATE deployment job for review only' do
- expect(review_prod_build_names).to contain_exactly('review_fargate', 'stop_review_fargate')
+ it 'creates an FARGATE deployment job for review only' do
+ expect(review_prod_build_names).to contain_exactly('review_fargate', 'stop_review_fargate')
+ end
end
end
- end
- context 'and when the project has an active cluster' do
- let(:cluster) { create(:cluster, :project, :provided_by_gcp, projects: [project]) }
+ context 'and when the project has an active cluster' do
+ let(:cluster) { create(:cluster, :project, :provided_by_gcp, projects: [project]) }
- before do
- allow(cluster).to receive(:active?).and_return(true)
- end
+ before do
+ allow(cluster).to receive(:active?).and_return(true)
+ end
- context 'on default branch' do
- it 'triggers the deployment to Kubernetes, not to ECS' do
- expect(build_names).not_to include('review')
- expect(build_names).to include('production')
- expect(build_names).not_to include('production_ecs')
- expect(build_names).not_to include('review_ecs')
+ context 'on default branch' do
+ it 'triggers the deployment to Kubernetes, not to ECS' do
+ expect(build_names).not_to include('review')
+ expect(build_names).to include('production')
+ expect(build_names).not_to include('production_ecs')
+ expect(build_names).not_to include('review_ecs')
+ end
end
end
- end
- context 'when the platform target is EC2' do
- let(:platform_value) { 'EC2' }
+ context 'when the platform target is EC2' do
+ let(:platform_value) { 'EC2' }
- it 'contains the build_artifact job, not the build job' do
- expect(build_names).to include('build_artifact')
- expect(build_names).not_to include('build')
+ it 'contains the build_artifact job, not the build job' do
+ expect(build_names).to include('build_artifact')
+ expect(build_names).not_to include('build')
+ end
end
end
- end
-
- context 'when the project has no active cluster' do
- it 'only creates a build and a test stage' do
- expect(pipeline.stages_names).to eq(%w(build test))
- end
- it_behaves_like 'no Kubernetes deployment job'
- end
+ context 'when the project has no active cluster' do
+ it 'only creates a build and a test stage' do
+ expect(pipeline.stages_names).to eq(%w(build test))
+ end
- context 'when the project has an active cluster' do
- let!(:cluster) { create(:cluster, :project, :provided_by_gcp, projects: [project]) }
-
- describe 'deployment-related builds' do
- context 'on default branch' do
- it 'does not include rollout jobs besides production' do
- expect(build_names).to include('production')
- expect(build_names).not_to include('production_manual')
- expect(build_names).not_to include('staging')
- expect(build_names).not_to include('canary')
- expect(build_names).not_to include('review')
- expect(build_names).not_to include(a_string_matching(/rollout \d+%/))
- end
+ it_behaves_like 'no Kubernetes deployment job'
+ end
- context 'when STAGING_ENABLED=1' do
- before do
- create(:ci_variable, project: project, key: 'STAGING_ENABLED', value: '1')
- end
+ context 'when the project has an active cluster' do
+ let!(:cluster) { create(:cluster, :project, :provided_by_gcp, projects: [project]) }
- it 'includes a staging job and a production_manual job' do
- expect(build_names).not_to include('production')
- expect(build_names).to include('production_manual')
- expect(build_names).to include('staging')
+ describe 'deployment-related builds' do
+ context 'on default branch' do
+ it 'does not include rollout jobs besides production' do
+ expect(build_names).to include('production')
+ expect(build_names).not_to include('production_manual')
+ expect(build_names).not_to include('staging')
expect(build_names).not_to include('canary')
expect(build_names).not_to include('review')
expect(build_names).not_to include(a_string_matching(/rollout \d+%/))
end
+
+ context 'when STAGING_ENABLED=1' do
+ before do
+ create(:ci_variable, project: project, key: 'STAGING_ENABLED', value: '1')
+ end
+
+ it 'includes a staging job and a production_manual job' do
+ expect(build_names).not_to include('production')
+ expect(build_names).to include('production_manual')
+ expect(build_names).to include('staging')
+ expect(build_names).not_to include('canary')
+ expect(build_names).not_to include('review')
+ expect(build_names).not_to include(a_string_matching(/rollout \d+%/))
+ end
+ end
+
+ context 'when CANARY_ENABLED=1' do
+ before do
+ create(:ci_variable, project: project, key: 'CANARY_ENABLED', value: '1')
+ end
+
+ it 'includes a canary job and a production_manual job' do
+ expect(build_names).not_to include('production')
+ expect(build_names).to include('production_manual')
+ expect(build_names).not_to include('staging')
+ expect(build_names).to include('canary')
+ expect(build_names).not_to include('review')
+ expect(build_names).not_to include(a_string_matching(/rollout \d+%/))
+ end
+ end
end
- context 'when CANARY_ENABLED=1' do
+ context 'outside of default branch' do
+ let(:pipeline_branch) { 'patch-1' }
+
before do
- create(:ci_variable, project: project, key: 'CANARY_ENABLED', value: '1')
+ project.repository.create_branch(pipeline_branch, default_branch)
end
- it 'includes a canary job and a production_manual job' do
+ it 'does not include rollout jobs besides review' do
expect(build_names).not_to include('production')
- expect(build_names).to include('production_manual')
+ expect(build_names).not_to include('production_manual')
expect(build_names).not_to include('staging')
- expect(build_names).to include('canary')
- expect(build_names).not_to include('review')
+ expect(build_names).not_to include('canary')
+ expect(build_names).to include('review')
expect(build_names).not_to include(a_string_matching(/rollout \d+%/))
end
end
end
-
- context 'outside of default branch' do
- let(:pipeline_branch) { 'patch-1' }
-
- before do
- project.repository.create_branch(pipeline_branch)
- end
-
- it 'does not include rollout jobs besides review' do
- expect(build_names).not_to include('production')
- expect(build_names).not_to include('production_manual')
- expect(build_names).not_to include('staging')
- expect(build_names).not_to include('canary')
- expect(build_names).to include('review')
- expect(build_names).not_to include(a_string_matching(/rollout \d+%/))
- end
- end
end
end
- end
- describe 'build-pack detection' do
- using RSpec::Parameterized::TableSyntax
-
- where(:case_name, :files, :variables, :include_build_names, :not_include_build_names) do
- 'No match' | { 'README.md' => '' } | {} | %w() | %w(build test)
- 'Buildpack' | { 'README.md' => '' } | { 'BUILDPACK_URL' => 'http://example.com' } | %w(build test) | %w()
- 'Explicit set' | { 'README.md' => '' } | { 'AUTO_DEVOPS_EXPLICITLY_ENABLED' => '1' } | %w(build test) | %w()
- 'Explicit unset' | { 'README.md' => '' } | { 'AUTO_DEVOPS_EXPLICITLY_ENABLED' => '0' } | %w() | %w(build test)
- 'DOCKERFILE_PATH' | { 'README.md' => '' } | { 'DOCKERFILE_PATH' => 'Docker.file' } | %w(build test) | %w()
- 'Dockerfile' | { 'Dockerfile' => '' } | {} | %w(build test) | %w()
- 'Clojure' | { 'project.clj' => '' } | {} | %w(build test) | %w()
- 'Go modules' | { 'go.mod' => '' } | {} | %w(build test) | %w()
- 'Go gb' | { 'src/gitlab.com/gopackage.go' => '' } | {} | %w(build test) | %w()
- 'Gradle' | { 'gradlew' => '' } | {} | %w(build test) | %w()
- 'Java' | { 'pom.xml' => '' } | {} | %w(build test) | %w()
- 'Multi-buildpack' | { '.buildpacks' => '' } | {} | %w(build test) | %w()
- 'NodeJS' | { 'package.json' => '' } | {} | %w(build test) | %w()
- 'PHP' | { 'composer.json' => '' } | {} | %w(build test) | %w()
- 'Play' | { 'conf/application.conf' => '' } | {} | %w(build test) | %w()
- 'Python' | { 'Pipfile' => '' } | {} | %w(build test) | %w()
- 'Ruby' | { 'Gemfile' => '' } | {} | %w(build test) | %w()
- 'Scala' | { 'build.sbt' => '' } | {} | %w(build test) | %w()
- 'Static' | { '.static' => '' } | {} | %w(build test) | %w()
- end
+ describe 'build-pack detection' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:case_name, :files, :variables, :include_build_names, :not_include_build_names) do
+ 'No match' | { 'README.md' => '' } | {} | %w() | %w(build test)
+ 'Buildpack' | { 'README.md' => '' } | { 'BUILDPACK_URL' => 'http://example.com' } | %w(build test) | %w()
+ 'Explicit set' | { 'README.md' => '' } | { 'AUTO_DEVOPS_EXPLICITLY_ENABLED' => '1' } | %w(build test) | %w()
+ 'Explicit unset' | { 'README.md' => '' } | { 'AUTO_DEVOPS_EXPLICITLY_ENABLED' => '0' } | %w() | %w(build test)
+ 'DOCKERFILE_PATH' | { 'README.md' => '' } | { 'DOCKERFILE_PATH' => 'Docker.file' } | %w(build test) | %w()
+ 'Dockerfile' | { 'Dockerfile' => '' } | {} | %w(build test) | %w()
+ 'Clojure' | { 'project.clj' => '' } | {} | %w(build test) | %w()
+ 'Go modules' | { 'go.mod' => '' } | {} | %w(build test) | %w()
+ 'Go gb' | { 'src/gitlab.com/gopackage.go' => '' } | {} | %w(build test) | %w()
+ 'Gradle' | { 'gradlew' => '' } | {} | %w(build test) | %w()
+ 'Java' | { 'pom.xml' => '' } | {} | %w(build test) | %w()
+ 'Multi-buildpack' | { '.buildpacks' => '' } | {} | %w(build test) | %w()
+ 'NodeJS' | { 'package.json' => '' } | {} | %w(build test) | %w()
+ 'PHP' | { 'composer.json' => '' } | {} | %w(build test) | %w()
+ 'Play' | { 'conf/application.conf' => '' } | {} | %w(build test) | %w()
+ 'Python' | { 'Pipfile' => '' } | {} | %w(build test) | %w()
+ 'Ruby' | { 'Gemfile' => '' } | {} | %w(build test) | %w()
+ 'Scala' | { 'build.sbt' => '' } | {} | %w(build test) | %w()
+ 'Static' | { '.static' => '' } | {} | %w(build test) | %w()
+ end
- with_them do
- let(:project) { create(:project, :custom_repo, files: files) }
- let(:user) { project.owner }
- let(:service) { Ci::CreatePipelineService.new(project, user, ref: 'master' ) }
- let(:pipeline) { service.execute(:push) }
- let(:build_names) { pipeline.builds.pluck(:name) }
+ with_them do
+ let(:project) { create(:project, :custom_repo, files: files) }
+ let(:user) { project.owner }
+ let(:service) { Ci::CreatePipelineService.new(project, user, ref: default_branch ) }
+ let(:pipeline) { service.execute(:push) }
+ let(:build_names) { pipeline.builds.pluck(:name) }
- before do
- stub_ci_pipeline_yaml_file(template.content)
- allow_any_instance_of(Ci::BuildScheduleWorker).to receive(:perform).and_return(true)
- variables.each do |(key, value)|
- create(:ci_variable, project: project, key: key, value: value)
+ before do
+ stub_application_setting(default_branch_name: default_branch)
+ stub_ci_pipeline_yaml_file(template.content)
+ allow_any_instance_of(Ci::BuildScheduleWorker).to receive(:perform).and_return(true)
+ variables.each do |(key, value)|
+ create(:ci_variable, project: project, key: key, value: value)
+ end
end
- end
- it 'creates a pipeline with the expected jobs' do
- expect(build_names).to include(*include_build_names)
- expect(build_names).not_to include(*not_include_build_names)
+ it 'creates a pipeline with the expected jobs' do
+ expect(build_names).to include(*include_build_names)
+ expect(build_names).not_to include(*not_include_build_names)
+ end
end
end
end
diff --git a/spec/lib/gitlab/ci/trace_spec.rb b/spec/lib/gitlab/ci/trace_spec.rb
index 92bf2519588..597e4ca9b03 100644
--- a/spec/lib/gitlab/ci/trace_spec.rb
+++ b/spec/lib/gitlab/ci/trace_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe Gitlab::Ci::Trace, :clean_gitlab_redis_shared_state, factory_default: :keep do
- let_it_be(:project) { create_default(:project) }
+ let_it_be(:project) { create_default(:project).freeze }
let_it_be_with_reload(:build) { create(:ci_build) }
let(:trace) { described_class.new(build) }
diff --git a/spec/lib/gitlab/ci/variables/collection/item_spec.rb b/spec/lib/gitlab/ci/variables/collection/item_spec.rb
index 2e43f22830a..9f9aea3355e 100644
--- a/spec/lib/gitlab/ci/variables/collection/item_spec.rb
+++ b/spec/lib/gitlab/ci/variables/collection/item_spec.rb
@@ -32,6 +32,7 @@ RSpec.describe Gitlab::Ci::Variables::Collection::Item do
it 'saves given value' do
expect(subject[:key]).to eq variable_key
expect(subject[:value]).to eq expected_value
+ expect(subject.value).to eq expected_value
end
end
@@ -69,6 +70,47 @@ RSpec.describe Gitlab::Ci::Variables::Collection::Item do
end
end
+ describe '#depends_on' do
+ let(:item) { Gitlab::Ci::Variables::Collection::Item.new(**variable) }
+
+ subject { item.depends_on }
+
+ context 'table tests' do
+ using RSpec::Parameterized::TableSyntax
+
+ where do
+ {
+ "no variable references": {
+ variable: { key: 'VAR', value: 'something' },
+ expected_depends_on: nil
+ },
+ "simple variable reference": {
+ variable: { key: 'VAR', value: 'something_$VAR2' },
+ expected_depends_on: %w(VAR2)
+ },
+ "complex expansion": {
+ variable: { key: 'VAR', value: 'something_${VAR2}_$VAR3' },
+ expected_depends_on: %w(VAR2 VAR3)
+ },
+ "complex expansion in raw variable": {
+ variable: { key: 'VAR', value: 'something_${VAR2}_$VAR3', raw: true },
+ expected_depends_on: nil
+ },
+ "complex expansions for Windows": {
+ variable: { key: 'variable3', value: 'key%variable%%variable2%' },
+ expected_depends_on: %w(variable variable2)
+ }
+ }
+ end
+
+ with_them do
+ it 'contains referenced variable names' do
+ is_expected.to eq(expected_depends_on)
+ end
+ end
+ end
+ end
+
describe '.fabricate' do
it 'supports using a hash' do
resource = described_class.fabricate(variable)
@@ -118,6 +160,26 @@ RSpec.describe Gitlab::Ci::Variables::Collection::Item do
end
end
+ describe '#raw' do
+ it 'returns false when :raw is not specified' do
+ item = described_class.new(**variable)
+
+ expect(item.raw).to eq false
+ end
+
+ context 'when :raw is specified as true' do
+ let(:variable) do
+ { key: variable_key, value: variable_value, public: true, masked: false, raw: true }
+ end
+
+ it 'returns true' do
+ item = described_class.new(**variable)
+
+ expect(item.raw).to eq true
+ end
+ end
+ end
+
describe '#to_runner_variable' do
context 'when variable is not a file-related' do
it 'returns a runner-compatible hash representation' do
@@ -139,5 +201,27 @@ RSpec.describe Gitlab::Ci::Variables::Collection::Item do
.to eq(key: 'VAR', value: 'value', public: true, file: true, masked: false)
end
end
+
+ context 'when referencing a variable' do
+ it '#depends_on contains names of dependencies' do
+ runner_variable = described_class.new(key: 'CI_VAR', value: '${CI_VAR_2}-123-$CI_VAR_3')
+
+ expect(runner_variable.depends_on).to eq(%w(CI_VAR_2 CI_VAR_3))
+ end
+ end
+
+ context 'when assigned the raw attribute' do
+ it 'retains a true raw attribute' do
+ runner_variable = described_class.new(key: 'CI_VAR', value: '123', raw: true)
+
+ expect(runner_variable).to eq(key: 'CI_VAR', value: '123', public: true, masked: false, raw: true)
+ end
+
+ it 'does not retain a false raw attribute' do
+ runner_variable = described_class.new(key: 'CI_VAR', value: '123', raw: false)
+
+ expect(runner_variable).to eq(key: 'CI_VAR', value: '123', public: true, masked: false)
+ end
+ end
end
end
diff --git a/spec/lib/gitlab/ci/variables/collection/sort_spec.rb b/spec/lib/gitlab/ci/variables/collection/sort_spec.rb
new file mode 100644
index 00000000000..53d169ececb
--- /dev/null
+++ b/spec/lib/gitlab/ci/variables/collection/sort_spec.rb
@@ -0,0 +1,322 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Ci::Variables::Collection::Sort do
+ describe '#initialize with non-Collection value' do
+ let_it_be(:project_with_flag_disabled) { create(:project) }
+ let_it_be(:project_with_flag_enabled) { create(:project) }
+
+ before do
+ stub_feature_flags(variable_inside_variable: [project_with_flag_enabled])
+ end
+
+ context 'when FF :variable_inside_variable is disabled' do
+ subject { Gitlab::Ci::Variables::Collection::Sort.new([], project_with_flag_disabled) }
+
+ it 'raises ArgumentError' do
+ expect { subject }.to raise_error(ArgumentError, /Collection object was expected/)
+ end
+ end
+
+ context 'when FF :variable_inside_variable is enabled' do
+ subject { Gitlab::Ci::Variables::Collection::Sort.new([], project_with_flag_enabled) }
+
+ it 'raises ArgumentError' do
+ expect { subject }.to raise_error(ArgumentError, /Collection object was expected/)
+ end
+ end
+ end
+
+ describe '#errors' do
+ context 'when FF :variable_inside_variable is disabled' do
+ let_it_be(:project_with_flag_disabled) { create(:project) }
+ let_it_be(:project_with_flag_enabled) { create(:project) }
+
+ before do
+ stub_feature_flags(variable_inside_variable: [project_with_flag_enabled])
+ end
+
+ context 'table tests' do
+ using RSpec::Parameterized::TableSyntax
+
+ where do
+ {
+ "empty array": {
+ variables: []
+ },
+ "simple expansions": {
+ variables: [
+ { key: 'variable', value: 'value' },
+ { key: 'variable2', value: 'result' },
+ { key: 'variable3', value: 'key$variable$variable2' }
+ ]
+ },
+ "complex expansion": {
+ variables: [
+ { key: 'variable', value: 'value' },
+ { key: 'variable2', value: 'key${variable}' }
+ ]
+ },
+ "complex expansions with missing variable for Windows": {
+ variables: [
+ { key: 'variable', value: 'value' },
+ { key: 'variable3', value: 'key%variable%%variable2%' }
+ ]
+ },
+ "out-of-order variable reference": {
+ variables: [
+ { key: 'variable2', value: 'key${variable}' },
+ { key: 'variable', value: 'value' }
+ ]
+ },
+ "array with cyclic dependency": {
+ variables: [
+ { key: 'variable', value: '$variable2' },
+ { key: 'variable2', value: '$variable3' },
+ { key: 'variable3', value: 'key$variable$variable2' }
+ ]
+ },
+ "array with raw variable": {
+ variables: [
+ { key: 'variable', value: '$variable2' },
+ { key: 'variable2', value: '$variable3' },
+ { key: 'variable3', value: 'key$variable$variable2', raw: true }
+ ]
+ }
+ }
+ end
+
+ with_them do
+ let(:collection) { Gitlab::Ci::Variables::Collection.new(variables) }
+
+ subject { Gitlab::Ci::Variables::Collection::Sort.new(collection, project_with_flag_disabled) }
+
+ it 'does not report error' do
+ expect(subject.errors).to eq(nil)
+ end
+
+ it 'valid? reports true' do
+ expect(subject.valid?).to eq(true)
+ end
+ end
+ end
+ end
+
+ context 'when FF :variable_inside_variable is enabled' do
+ let_it_be(:project_with_flag_disabled) { create(:project) }
+ let_it_be(:project_with_flag_enabled) { create(:project) }
+
+ before do
+ stub_feature_flags(variable_inside_variable: [project_with_flag_enabled])
+ end
+
+ context 'table tests' do
+ using RSpec::Parameterized::TableSyntax
+
+ where do
+ {
+ "empty array": {
+ variables: [],
+ validation_result: nil
+ },
+ "simple expansions": {
+ variables: [
+ { key: 'variable', value: 'value' },
+ { key: 'variable2', value: 'result' },
+ { key: 'variable3', value: 'key$variable$variable2' }
+ ],
+ validation_result: nil
+ },
+ "cyclic dependency": {
+ variables: [
+ { key: 'variable', value: '$variable2' },
+ { key: 'variable2', value: '$variable3' },
+ { key: 'variable3', value: 'key$variable$variable2' }
+ ],
+ validation_result: 'circular variable reference detected: ["variable", "variable2", "variable3"]'
+ },
+ "array with raw variable": {
+ variables: [
+ { key: 'variable', value: '$variable2' },
+ { key: 'variable2', value: '$variable3' },
+ { key: 'variable3', value: 'key$variable$variable2', raw: true }
+ ],
+ validation_result: nil
+ }
+ }
+ end
+
+ with_them do
+ let(:collection) { Gitlab::Ci::Variables::Collection.new(variables) }
+
+ subject { Gitlab::Ci::Variables::Collection::Sort.new(collection, project_with_flag_enabled) }
+
+ it 'errors matches expected validation result' do
+ expect(subject.errors).to eq(validation_result)
+ end
+
+ it 'valid? matches expected validation result' do
+ expect(subject.valid?).to eq(validation_result.nil?)
+ end
+ end
+ end
+ end
+ end
+
+ describe '#collection' do
+ context 'when FF :variable_inside_variable is disabled' do
+ before do
+ stub_feature_flags(variable_inside_variable: false)
+ end
+
+ context 'table tests' do
+ using RSpec::Parameterized::TableSyntax
+
+ where do
+ {
+ "empty array": {
+ variables: []
+ },
+ "simple expansions": {
+ variables: [
+ { key: 'variable', value: 'value' },
+ { key: 'variable2', value: 'result' },
+ { key: 'variable3', value: 'key$variable$variable2' }
+ ]
+ },
+ "complex expansion": {
+ variables: [
+ { key: 'variable', value: 'value' },
+ { key: 'variable2', value: 'key${variable}' }
+ ]
+ },
+ "complex expansions with missing variable for Windows": {
+ variables: [
+ { key: 'variable', value: 'value' },
+ { key: 'variable3', value: 'key%variable%%variable2%' }
+ ]
+ },
+ "out-of-order variable reference": {
+ variables: [
+ { key: 'variable2', value: 'key${variable}' },
+ { key: 'variable', value: 'value' }
+ ]
+ },
+ "array with cyclic dependency": {
+ variables: [
+ { key: 'variable', value: '$variable2' },
+ { key: 'variable2', value: '$variable3' },
+ { key: 'variable3', value: 'key$variable$variable2' }
+ ]
+ }
+ }
+ end
+
+ with_them do
+ let_it_be(:project) { create(:project) }
+ let(:collection) { Gitlab::Ci::Variables::Collection.new(variables) }
+
+ subject { Gitlab::Ci::Variables::Collection::Sort.new(collection, project).collection }
+
+ it 'does not expand variables' do
+ is_expected.to be(collection)
+ end
+ end
+ end
+ end
+
+ context 'when FF :variable_inside_variable is enabled' do
+ before do
+ stub_licensed_features(group_saml_group_sync: true)
+ stub_feature_flags(variable_inside_variable: true)
+ end
+
+ context 'table tests' do
+ using RSpec::Parameterized::TableSyntax
+
+ where do
+ {
+ "empty array": {
+ variables: [],
+ result: []
+ },
+ "simple expansions, no reordering needed": {
+ variables: [
+ { key: 'variable', value: 'value' },
+ { key: 'variable2', value: 'result' },
+ { key: 'variable3', value: 'key$variable$variable2' }
+ ],
+ result: %w[variable variable2 variable3]
+ },
+ "complex expansion, reordering needed": {
+ variables: [
+ { key: 'variable2', value: 'key${variable}' },
+ { key: 'variable', value: 'value' }
+ ],
+ result: %w[variable variable2]
+ },
+ "unused variables": {
+ variables: [
+ { key: 'variable', value: 'value' },
+ { key: 'variable4', value: 'key$variable$variable3' },
+ { key: 'variable2', value: 'result2' },
+ { key: 'variable3', value: 'result3' }
+ ],
+ result: %w[variable variable3 variable4 variable2]
+ },
+ "missing variable": {
+ variables: [
+ { key: 'variable2', value: 'key$variable' }
+ ],
+ result: %w[variable2]
+ },
+ "complex expansions with missing variable": {
+ variables: [
+ { key: 'variable4', value: 'key${variable}${variable2}${variable3}' },
+ { key: 'variable', value: 'value' },
+ { key: 'variable3', value: 'value3' }
+ ],
+ result: %w[variable variable3 variable4]
+ },
+ "cyclic dependency causes original array to be returned": {
+ variables: [
+ { key: 'variable2', value: '$variable3' },
+ { key: 'variable3', value: 'key$variable$variable2' },
+ { key: 'variable', value: '$variable2' }
+ ],
+ result: %w[variable2 variable3 variable]
+ },
+ "raw variable does not get resolved": {
+ variables: [
+ { key: 'variable', value: '$variable2' },
+ { key: 'variable2', value: '$variable3' },
+ { key: 'variable3', value: 'key$variable$variable2', raw: true }
+ ],
+ result: %w[variable3 variable2 variable]
+ },
+ "variable containing escaped variable reference": {
+ variables: [
+ { key: 'variable_c', value: '$variable_b' },
+ { key: 'variable_b', value: '$$variable_a' },
+ { key: 'variable_a', value: 'value' }
+ ],
+ result: %w[variable_a variable_b variable_c]
+ }
+ }
+ end
+
+ with_them do
+ let_it_be(:project) { create(:project) }
+ let(:collection) { Gitlab::Ci::Variables::Collection.new(variables) }
+
+ subject { Gitlab::Ci::Variables::Collection::Sort.new(collection, project).collection }
+
+ it 'returns correctly sorted variables' do
+ expect(subject.map { |var| var[:key] }).to eq(result)
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/variables/collection/sorted_spec.rb b/spec/lib/gitlab/ci/variables/collection/sorted_spec.rb
deleted file mode 100644
index 954273fd41e..00000000000
--- a/spec/lib/gitlab/ci/variables/collection/sorted_spec.rb
+++ /dev/null
@@ -1,259 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Ci::Variables::Collection::Sorted do
- describe '#errors' do
- context 'when FF :variable_inside_variable is disabled' do
- let_it_be(:project_with_flag_disabled) { create(:project) }
- let_it_be(:project_with_flag_enabled) { create(:project) }
-
- before do
- stub_feature_flags(variable_inside_variable: [project_with_flag_enabled])
- end
-
- context 'table tests' do
- using RSpec::Parameterized::TableSyntax
-
- where do
- {
- "empty array": {
- variables: []
- },
- "simple expansions": {
- variables: [
- { key: 'variable', value: 'value' },
- { key: 'variable2', value: 'result' },
- { key: 'variable3', value: 'key$variable$variable2' }
- ]
- },
- "complex expansion": {
- variables: [
- { key: 'variable', value: 'value' },
- { key: 'variable2', value: 'key${variable}' }
- ]
- },
- "complex expansions with missing variable for Windows": {
- variables: [
- { key: 'variable', value: 'value' },
- { key: 'variable3', value: 'key%variable%%variable2%' }
- ]
- },
- "out-of-order variable reference": {
- variables: [
- { key: 'variable2', value: 'key${variable}' },
- { key: 'variable', value: 'value' }
- ]
- },
- "array with cyclic dependency": {
- variables: [
- { key: 'variable', value: '$variable2' },
- { key: 'variable2', value: '$variable3' },
- { key: 'variable3', value: 'key$variable$variable2' }
- ]
- }
- }
- end
-
- with_them do
- subject { Gitlab::Ci::Variables::Collection::Sorted.new(variables, project_with_flag_disabled) }
-
- it 'does not report error' do
- expect(subject.errors).to eq(nil)
- end
-
- it 'valid? reports true' do
- expect(subject.valid?).to eq(true)
- end
- end
- end
- end
-
- context 'when FF :variable_inside_variable is enabled' do
- let_it_be(:project_with_flag_disabled) { create(:project) }
- let_it_be(:project_with_flag_enabled) { create(:project) }
-
- before do
- stub_feature_flags(variable_inside_variable: [project_with_flag_enabled])
- end
-
- context 'table tests' do
- using RSpec::Parameterized::TableSyntax
-
- where do
- {
- "empty array": {
- variables: [],
- validation_result: nil
- },
- "simple expansions": {
- variables: [
- { key: 'variable', value: 'value' },
- { key: 'variable2', value: 'result' },
- { key: 'variable3', value: 'key$variable$variable2' }
- ],
- validation_result: nil
- },
- "cyclic dependency": {
- variables: [
- { key: 'variable', value: '$variable2' },
- { key: 'variable2', value: '$variable3' },
- { key: 'variable3', value: 'key$variable$variable2' }
- ],
- validation_result: 'circular variable reference detected: ["variable", "variable2", "variable3"]'
- }
- }
- end
-
- with_them do
- subject { Gitlab::Ci::Variables::Collection::Sorted.new(variables, project_with_flag_enabled) }
-
- it 'errors matches expected validation result' do
- expect(subject.errors).to eq(validation_result)
- end
-
- it 'valid? matches expected validation result' do
- expect(subject.valid?).to eq(validation_result.nil?)
- end
- end
- end
- end
- end
-
- describe '#sort' do
- context 'when FF :variable_inside_variable is disabled' do
- before do
- stub_feature_flags(variable_inside_variable: false)
- end
-
- context 'table tests' do
- using RSpec::Parameterized::TableSyntax
-
- where do
- {
- "empty array": {
- variables: []
- },
- "simple expansions": {
- variables: [
- { key: 'variable', value: 'value' },
- { key: 'variable2', value: 'result' },
- { key: 'variable3', value: 'key$variable$variable2' }
- ]
- },
- "complex expansion": {
- variables: [
- { key: 'variable', value: 'value' },
- { key: 'variable2', value: 'key${variable}' }
- ]
- },
- "complex expansions with missing variable for Windows": {
- variables: [
- { key: 'variable', value: 'value' },
- { key: 'variable3', value: 'key%variable%%variable2%' }
- ]
- },
- "out-of-order variable reference": {
- variables: [
- { key: 'variable2', value: 'key${variable}' },
- { key: 'variable', value: 'value' }
- ]
- },
- "array with cyclic dependency": {
- variables: [
- { key: 'variable', value: '$variable2' },
- { key: 'variable2', value: '$variable3' },
- { key: 'variable3', value: 'key$variable$variable2' }
- ]
- }
- }
- end
-
- with_them do
- let_it_be(:project) { create(:project) }
- subject { Gitlab::Ci::Variables::Collection::Sorted.new(variables, project) }
-
- it 'does not expand variables' do
- expect(subject.sort).to eq(variables)
- end
- end
- end
- end
-
- context 'when FF :variable_inside_variable is enabled' do
- before do
- stub_licensed_features(group_saml_group_sync: true)
- stub_feature_flags(saml_group_links: true)
- stub_feature_flags(variable_inside_variable: true)
- end
-
- context 'table tests' do
- using RSpec::Parameterized::TableSyntax
-
- where do
- {
- "empty array": {
- variables: [],
- result: []
- },
- "simple expansions, no reordering needed": {
- variables: [
- { key: 'variable', value: 'value' },
- { key: 'variable2', value: 'result' },
- { key: 'variable3', value: 'key$variable$variable2' }
- ],
- result: %w[variable variable2 variable3]
- },
- "complex expansion, reordering needed": {
- variables: [
- { key: 'variable2', value: 'key${variable}' },
- { key: 'variable', value: 'value' }
- ],
- result: %w[variable variable2]
- },
- "unused variables": {
- variables: [
- { key: 'variable', value: 'value' },
- { key: 'variable4', value: 'key$variable$variable3' },
- { key: 'variable2', value: 'result2' },
- { key: 'variable3', value: 'result3' }
- ],
- result: %w[variable variable3 variable4 variable2]
- },
- "missing variable": {
- variables: [
- { key: 'variable2', value: 'key$variable' }
- ],
- result: %w[variable2]
- },
- "complex expansions with missing variable": {
- variables: [
- { key: 'variable4', value: 'key${variable}${variable2}${variable3}' },
- { key: 'variable', value: 'value' },
- { key: 'variable3', value: 'value3' }
- ],
- result: %w[variable variable3 variable4]
- },
- "cyclic dependency causes original array to be returned": {
- variables: [
- { key: 'variable2', value: '$variable3' },
- { key: 'variable3', value: 'key$variable$variable2' },
- { key: 'variable', value: '$variable2' }
- ],
- result: %w[variable2 variable3 variable]
- }
- }
- end
-
- with_them do
- let_it_be(:project) { create(:project) }
- subject { Gitlab::Ci::Variables::Collection::Sorted.new(variables, project) }
-
- it 'sort returns correctly sorted variables' do
- expect(subject.sort.map { |var| var[:key] }).to eq(result)
- end
- end
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/ci/variables/collection_spec.rb b/spec/lib/gitlab/ci/variables/collection_spec.rb
index ac84313ad9f..16ba3c32fc4 100644
--- a/spec/lib/gitlab/ci/variables/collection_spec.rb
+++ b/spec/lib/gitlab/ci/variables/collection_spec.rb
@@ -13,7 +13,7 @@ RSpec.describe Gitlab::Ci::Variables::Collection do
end
it 'can be initialized without an argument' do
- expect(subject).to be_none
+ is_expected.to be_none
end
end
@@ -21,13 +21,13 @@ RSpec.describe Gitlab::Ci::Variables::Collection do
it 'appends a hash' do
subject.append(key: 'VARIABLE', value: 'something')
- expect(subject).to be_one
+ is_expected.to be_one
end
it 'appends a Ci::Variable' do
subject.append(build(:ci_variable))
- expect(subject).to be_one
+ is_expected.to be_one
end
it 'appends an internal resource' do
@@ -35,7 +35,7 @@ RSpec.describe Gitlab::Ci::Variables::Collection do
subject.append(collection.first)
- expect(subject).to be_one
+ is_expected.to be_one
end
it 'returns self' do
@@ -98,6 +98,50 @@ RSpec.describe Gitlab::Ci::Variables::Collection do
end
end
+ describe '#[]' do
+ variable = { key: 'VAR', value: 'value', public: true, masked: false }
+
+ collection = described_class.new([variable])
+
+ it 'returns nil for a non-existent variable name' do
+ expect(collection['UNKNOWN_VAR']).to be_nil
+ end
+
+ it 'returns Item for an existent variable name' do
+ expect(collection['VAR']).to be_an_instance_of(Gitlab::Ci::Variables::Collection::Item)
+ expect(collection['VAR'].to_runner_variable).to eq(variable)
+ end
+ end
+
+ describe '#size' do
+ it 'returns zero for empty collection' do
+ collection = described_class.new([])
+
+ expect(collection.size).to eq(0)
+ end
+
+ it 'returns 2 for collection with 2 variables' do
+ collection = described_class.new(
+ [
+ { key: 'VAR1', value: 'value', public: true, masked: false },
+ { key: 'VAR2', value: 'value', public: true, masked: false }
+ ])
+
+ expect(collection.size).to eq(2)
+ end
+
+ it 'returns 3 for collection with 2 duplicate variables' do
+ collection = described_class.new(
+ [
+ { key: 'VAR1', value: 'value', public: true, masked: false },
+ { key: 'VAR2', value: 'value', public: true, masked: false },
+ { key: 'VAR1', value: 'value', public: true, masked: false }
+ ])
+
+ expect(collection.size).to eq(3)
+ end
+ end
+
describe '#to_runner_variables' do
it 'creates an array of hashes in a runner-compatible format' do
collection = described_class.new([{ key: 'TEST', value: '1' }])
@@ -121,4 +165,69 @@ RSpec.describe Gitlab::Ci::Variables::Collection do
expect(collection.to_hash).not_to include(TEST1: 'test-1')
end
end
+
+ describe '#sorted_collection' do
+ let!(:project) { create(:project) }
+
+ subject { collection.sorted_collection(project) }
+
+ context 'when FF :variable_inside_variable is disabled' do
+ before do
+ stub_feature_flags(variable_inside_variable: false)
+ end
+
+ let(:collection) do
+ described_class.new
+ .append(key: 'A', value: 'test-$B')
+ .append(key: 'B', value: 'test-$C')
+ .append(key: 'C', value: 'test')
+ end
+
+ it { is_expected.to be(collection) }
+ end
+
+ context 'when FF :variable_inside_variable is enabled' do
+ before do
+ stub_feature_flags(variable_inside_variable: [project])
+ end
+
+ let(:collection) do
+ described_class.new
+ .append(key: 'A', value: 'test-$B')
+ .append(key: 'B', value: 'test-$C')
+ .append(key: 'C', value: 'test')
+ end
+
+ it { is_expected.to be_a(Gitlab::Ci::Variables::Collection) }
+
+ it 'returns sorted collection' do
+ expect(subject.to_a).to eq(
+ [
+ { key: 'C', value: 'test', masked: false, public: true },
+ { key: 'B', value: 'test-$C', masked: false, public: true },
+ { key: 'A', value: 'test-$B', masked: false, public: true }
+ ])
+ end
+ end
+ end
+
+ describe '#reject' do
+ let(:collection) do
+ described_class.new
+ .append(key: 'CI_JOB_NAME', value: 'test-1')
+ .append(key: 'CI_BUILD_ID', value: '1')
+ .append(key: 'TEST1', value: 'test-3')
+ end
+
+ subject { collection.reject { |var| var[:key] =~ /\ACI_(JOB|BUILD)/ } }
+
+ it 'returns a Collection instance' do
+ is_expected.to be_an_instance_of(described_class)
+ end
+
+ it 'returns correctly filtered Collection' do
+ comp = collection.to_runner_variables.reject { |var| var[:key] =~ /\ACI_(JOB|BUILD)/ }
+ expect(subject.to_runner_variables).to eq(comp)
+ end
+ end
end
diff --git a/spec/lib/gitlab/ci/yaml_processor_spec.rb b/spec/lib/gitlab/ci/yaml_processor_spec.rb
index 9498453852a..8338c87c567 100644
--- a/spec/lib/gitlab/ci/yaml_processor_spec.rb
+++ b/spec/lib/gitlab/ci/yaml_processor_spec.rb
@@ -1368,6 +1368,155 @@ module Gitlab
end
end
+ context 'with multiple_cache_per_job FF disabled' do
+ before do
+ stub_feature_flags(multiple_cache_per_job: false)
+ end
+ describe 'cache' do
+ context 'when cache definition has unknown keys' do
+ let(:config) do
+ YAML.dump(
+ { cache: { untracked: true, invalid: 'key' },
+ rspec: { script: 'rspec' } })
+ end
+
+ it_behaves_like 'returns errors', 'cache config contains unknown keys: invalid'
+ end
+
+ it "returns cache when defined globally" do
+ config = YAML.dump({
+ cache: { paths: ["logs/", "binaries/"], untracked: true, key: 'key' },
+ rspec: {
+ script: "rspec"
+ }
+ })
+
+ config_processor = Gitlab::Ci::YamlProcessor.new(config).execute
+
+ expect(config_processor.stage_builds_attributes("test").size).to eq(1)
+ expect(config_processor.stage_builds_attributes("test").first[:cache]).to eq(
+ paths: ["logs/", "binaries/"],
+ untracked: true,
+ key: 'key',
+ policy: 'pull-push',
+ when: 'on_success'
+ )
+ end
+
+ it "returns cache when defined in default context" do
+ config = YAML.dump(
+ {
+ default: {
+ cache: { paths: ["logs/", "binaries/"], untracked: true, key: { files: ['file'] } }
+ },
+ rspec: {
+ script: "rspec"
+ }
+ })
+
+ config_processor = Gitlab::Ci::YamlProcessor.new(config).execute
+
+ expect(config_processor.stage_builds_attributes("test").size).to eq(1)
+ expect(config_processor.stage_builds_attributes("test").first[:cache]).to eq(
+ paths: ["logs/", "binaries/"],
+ untracked: true,
+ key: { files: ['file'] },
+ policy: 'pull-push',
+ when: 'on_success'
+ )
+ end
+
+ it 'returns cache key when defined in a job' do
+ config = YAML.dump({
+ rspec: {
+ cache: { paths: ['logs/', 'binaries/'], untracked: true, key: 'key' },
+ script: 'rspec'
+ }
+ })
+
+ config_processor = Gitlab::Ci::YamlProcessor.new(config).execute
+
+ expect(config_processor.stage_builds_attributes('test').size).to eq(1)
+ expect(config_processor.stage_builds_attributes('test').first[:cache]).to eq(
+ paths: ['logs/', 'binaries/'],
+ untracked: true,
+ key: 'key',
+ policy: 'pull-push',
+ when: 'on_success'
+ )
+ end
+
+ it 'returns cache files' do
+ config = YAML.dump(
+ rspec: {
+ cache: {
+ paths: ['logs/', 'binaries/'],
+ untracked: true,
+ key: { files: ['file'] }
+ },
+ script: 'rspec'
+ }
+ )
+
+ config_processor = Gitlab::Ci::YamlProcessor.new(config).execute
+
+ expect(config_processor.stage_builds_attributes('test').size).to eq(1)
+ expect(config_processor.stage_builds_attributes('test').first[:cache]).to eq(
+ paths: ['logs/', 'binaries/'],
+ untracked: true,
+ key: { files: ['file'] },
+ policy: 'pull-push',
+ when: 'on_success'
+ )
+ end
+
+ it 'returns cache files with prefix' do
+ config = YAML.dump(
+ rspec: {
+ cache: {
+ paths: ['logs/', 'binaries/'],
+ untracked: true,
+ key: { files: ['file'], prefix: 'prefix' }
+ },
+ script: 'rspec'
+ }
+ )
+
+ config_processor = Gitlab::Ci::YamlProcessor.new(config).execute
+
+ expect(config_processor.stage_builds_attributes('test').size).to eq(1)
+ expect(config_processor.stage_builds_attributes('test').first[:cache]).to eq(
+ paths: ['logs/', 'binaries/'],
+ untracked: true,
+ key: { files: ['file'], prefix: 'prefix' },
+ policy: 'pull-push',
+ when: 'on_success'
+ )
+ end
+
+ it "overwrite cache when defined for a job and globally" do
+ config = YAML.dump({
+ cache: { paths: ["logs/", "binaries/"], untracked: true, key: 'global' },
+ rspec: {
+ script: "rspec",
+ cache: { paths: ["test/"], untracked: false, key: 'local' }
+ }
+ })
+
+ config_processor = Gitlab::Ci::YamlProcessor.new(config).execute
+
+ expect(config_processor.stage_builds_attributes("test").size).to eq(1)
+ expect(config_processor.stage_builds_attributes("test").first[:cache]).to eq(
+ paths: ["test/"],
+ untracked: false,
+ key: 'local',
+ policy: 'pull-push',
+ when: 'on_success'
+ )
+ end
+ end
+ end
+
describe 'cache' do
context 'when cache definition has unknown keys' do
let(:config) do
@@ -1381,22 +1530,22 @@ module Gitlab
it "returns cache when defined globally" do
config = YAML.dump({
- cache: { paths: ["logs/", "binaries/"], untracked: true, key: 'key' },
- rspec: {
- script: "rspec"
- }
- })
+ cache: { paths: ["logs/", "binaries/"], untracked: true, key: 'key' },
+ rspec: {
+ script: "rspec"
+ }
+ })
config_processor = Gitlab::Ci::YamlProcessor.new(config).execute
expect(config_processor.stage_builds_attributes("test").size).to eq(1)
- expect(config_processor.stage_builds_attributes("test").first[:cache]).to eq(
+ expect(config_processor.stage_builds_attributes("test").first[:cache]).to eq([
paths: ["logs/", "binaries/"],
untracked: true,
key: 'key',
policy: 'pull-push',
when: 'on_success'
- )
+ ])
end
it "returns cache when defined in default context" do
@@ -1413,32 +1562,46 @@ module Gitlab
config_processor = Gitlab::Ci::YamlProcessor.new(config).execute
expect(config_processor.stage_builds_attributes("test").size).to eq(1)
- expect(config_processor.stage_builds_attributes("test").first[:cache]).to eq(
+ expect(config_processor.stage_builds_attributes("test").first[:cache]).to eq([
paths: ["logs/", "binaries/"],
untracked: true,
key: { files: ['file'] },
policy: 'pull-push',
when: 'on_success'
- )
+ ])
end
- it 'returns cache key when defined in a job' do
+ it 'returns cache key/s when defined in a job' do
config = YAML.dump({
- rspec: {
- cache: { paths: ['logs/', 'binaries/'], untracked: true, key: 'key' },
- script: 'rspec'
- }
- })
+ rspec: {
+ cache: [
+ { paths: ['binaries/'], untracked: true, key: 'keya' },
+ { paths: ['logs/', 'binaries/'], untracked: true, key: 'key' }
+ ],
+ script: 'rspec'
+ }
+ })
config_processor = Gitlab::Ci::YamlProcessor.new(config).execute
expect(config_processor.stage_builds_attributes('test').size).to eq(1)
expect(config_processor.stage_builds_attributes('test').first[:cache]).to eq(
- paths: ['logs/', 'binaries/'],
- untracked: true,
- key: 'key',
- policy: 'pull-push',
- when: 'on_success'
+ [
+ {
+ paths: ['binaries/'],
+ untracked: true,
+ key: 'keya',
+ policy: 'pull-push',
+ when: 'on_success'
+ },
+ {
+ paths: ['logs/', 'binaries/'],
+ untracked: true,
+ key: 'key',
+ policy: 'pull-push',
+ when: 'on_success'
+ }
+ ]
)
end
@@ -1446,10 +1609,10 @@ module Gitlab
config = YAML.dump(
rspec: {
cache: {
- paths: ['logs/', 'binaries/'],
- untracked: true,
- key: { files: ['file'] }
- },
+ paths: ['binaries/'],
+ untracked: true,
+ key: { files: ['file'] }
+ },
script: 'rspec'
}
)
@@ -1457,13 +1620,13 @@ module Gitlab
config_processor = Gitlab::Ci::YamlProcessor.new(config).execute
expect(config_processor.stage_builds_attributes('test').size).to eq(1)
- expect(config_processor.stage_builds_attributes('test').first[:cache]).to eq(
- paths: ['logs/', 'binaries/'],
+ expect(config_processor.stage_builds_attributes('test').first[:cache]).to eq([
+ paths: ['binaries/'],
untracked: true,
key: { files: ['file'] },
policy: 'pull-push',
when: 'on_success'
- )
+ ])
end
it 'returns cache files with prefix' do
@@ -1481,34 +1644,34 @@ module Gitlab
config_processor = Gitlab::Ci::YamlProcessor.new(config).execute
expect(config_processor.stage_builds_attributes('test').size).to eq(1)
- expect(config_processor.stage_builds_attributes('test').first[:cache]).to eq(
+ expect(config_processor.stage_builds_attributes('test').first[:cache]).to eq([
paths: ['logs/', 'binaries/'],
untracked: true,
key: { files: ['file'], prefix: 'prefix' },
policy: 'pull-push',
when: 'on_success'
- )
+ ])
end
it "overwrite cache when defined for a job and globally" do
config = YAML.dump({
- cache: { paths: ["logs/", "binaries/"], untracked: true, key: 'global' },
- rspec: {
- script: "rspec",
- cache: { paths: ["test/"], untracked: false, key: 'local' }
- }
- })
+ cache: { paths: ["logs/", "binaries/"], untracked: true, key: 'global' },
+ rspec: {
+ script: "rspec",
+ cache: { paths: ["test/"], untracked: false, key: 'local' }
+ }
+ })
config_processor = Gitlab::Ci::YamlProcessor.new(config).execute
expect(config_processor.stage_builds_attributes("test").size).to eq(1)
- expect(config_processor.stage_builds_attributes("test").first[:cache]).to eq(
+ expect(config_processor.stage_builds_attributes("test").first[:cache]).to eq([
paths: ["test/"],
untracked: false,
key: 'local',
policy: 'pull-push',
when: 'on_success'
- )
+ ])
end
end
diff --git a/spec/lib/gitlab/cycle_analytics/stage_summary_spec.rb b/spec/lib/gitlab/cycle_analytics/stage_summary_spec.rb
index 76578340f7b..2cdf95ea101 100644
--- a/spec/lib/gitlab/cycle_analytics/stage_summary_spec.rb
+++ b/spec/lib/gitlab/cycle_analytics/stage_summary_spec.rb
@@ -230,34 +230,13 @@ RSpec.describe Gitlab::CycleAnalytics::StageSummary do
end
context 'when `from` and `to` are within a day' do
- context 'when query_deploymenys_via_finished_at_in_vsa feature flag is off' do
- before do
- stub_feature_flags(query_deploymenys_via_finished_at_in_vsa: false)
- end
-
- it 'returns the number of deployments made on that day' do
- freeze_time do
- create(:deployment, :success, project: project)
- options[:from] = options[:to] = Time.zone.now
-
- expect(subject).to eq('1')
- end
- end
- end
-
- context 'when query_deploymenys_via_finished_at_in_vsa feature flag is off' do
- before do
- stub_feature_flags(query_deploymenys_via_finished_at_in_vsa: true)
- end
-
- it 'returns the number of deployments made on that day' do
- freeze_time do
- create(:deployment, :success, project: project, finished_at: Time.zone.now)
- options[:from] = Time.zone.now.at_beginning_of_day
- options[:to] = Time.zone.now.at_end_of_day
+ it 'returns the number of deployments made on that day' do
+ freeze_time do
+ create(:deployment, :success, project: project, finished_at: Time.zone.now)
+ options[:from] = Time.zone.now.at_beginning_of_day
+ options[:to] = Time.zone.now.at_end_of_day
- expect(subject).to eq('1')
- end
+ expect(subject).to eq('1')
end
end
end
diff --git a/spec/lib/gitlab/data_builder/build_spec.rb b/spec/lib/gitlab/data_builder/build_spec.rb
index 4242469b3db..ab1728414bb 100644
--- a/spec/lib/gitlab/data_builder/build_spec.rb
+++ b/spec/lib/gitlab/data_builder/build_spec.rb
@@ -38,6 +38,7 @@ RSpec.describe Gitlab::DataBuilder::Build do
it { expect(data[:runner][:id]).to eq(build.runner.id) }
it { expect(data[:runner][:tags]).to match_array(tag_names) }
it { expect(data[:runner][:description]).to eq(build.runner.description) }
+ it { expect(data[:environment]).to be_nil }
context 'commit author_url' do
context 'when no commit present' do
@@ -63,6 +64,13 @@ RSpec.describe Gitlab::DataBuilder::Build do
expect(data[:commit][:author_url]).to eq(Gitlab::Routing.url_helpers.user_url(username: build.commit.author.username))
end
end
+
+ context 'with environment' do
+ let(:build) { create(:ci_build, :teardown_environment) }
+
+ it { expect(data[:environment][:name]).to eq(build.expanded_environment_name) }
+ it { expect(data[:environment][:action]).to eq(build.environment_action) }
+ end
end
end
end
diff --git a/spec/lib/gitlab/data_builder/pipeline_spec.rb b/spec/lib/gitlab/data_builder/pipeline_spec.rb
index fd7cadeb89e..cf04f560ceb 100644
--- a/spec/lib/gitlab/data_builder/pipeline_spec.rb
+++ b/spec/lib/gitlab/data_builder/pipeline_spec.rb
@@ -37,6 +37,7 @@ RSpec.describe Gitlab::DataBuilder::Pipeline do
expect(build_data[:id]).to eq(build.id)
expect(build_data[:status]).to eq(build.status)
expect(build_data[:allow_failure]).to eq(build.allow_failure)
+ expect(build_data[:environment]).to be_nil
expect(runner_data).to eq(nil)
expect(project_data).to eq(project.hook_attrs(backward: false))
expect(data[:merge_request]).to be_nil
@@ -115,5 +116,12 @@ RSpec.describe Gitlab::DataBuilder::Pipeline do
expect(build_data[:id]).to eq(build.id)
end
end
+
+ context 'build with environment' do
+ let!(:build) { create(:ci_build, :teardown_environment, pipeline: pipeline) }
+
+ it { expect(build_data[:environment][:name]).to eq(build.expanded_environment_name) }
+ it { expect(build_data[:environment][:action]).to eq(build.environment_action) }
+ 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
new file mode 100644
index 00000000000..1020aafcf08
--- /dev/null
+++ b/spec/lib/gitlab/database/background_migration/batched_job_spec.rb
@@ -0,0 +1,50 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Database::BackgroundMigration::BatchedJob, type: :model do
+ it_behaves_like 'having unique enum values'
+
+ describe 'associations' do
+ it { is_expected.to belong_to(:batched_migration).with_foreign_key(:batched_background_migration_id) }
+ end
+
+ describe 'delegated batched_migration attributes' do
+ let(:batched_job) { build(:batched_background_migration_job) }
+ let(:batched_migration) { batched_job.batched_migration }
+
+ describe '#migration_aborted?' do
+ before do
+ batched_migration.status = :aborted
+ end
+
+ it 'returns the migration aborted?' do
+ expect(batched_job.migration_aborted?).to eq(batched_migration.aborted?)
+ end
+ end
+
+ describe '#migration_job_class' do
+ it 'returns the migration job_class' do
+ expect(batched_job.migration_job_class).to eq(batched_migration.job_class)
+ end
+ end
+
+ describe '#migration_table_name' do
+ it 'returns the migration table_name' do
+ expect(batched_job.migration_table_name).to eq(batched_migration.table_name)
+ end
+ end
+
+ describe '#migration_column_name' do
+ it 'returns the migration column_name' do
+ expect(batched_job.migration_column_name).to eq(batched_migration.column_name)
+ end
+ end
+
+ describe '#migration_job_arguments' do
+ it 'returns the migration job_arguments' do
+ expect(batched_job.migration_job_arguments).to eq(batched_migration.job_arguments)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/database/background_migration/batched_migration_spec.rb b/spec/lib/gitlab/database/background_migration/batched_migration_spec.rb
new file mode 100644
index 00000000000..f4a939e7c1f
--- /dev/null
+++ b/spec/lib/gitlab/database/background_migration/batched_migration_spec.rb
@@ -0,0 +1,160 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigration, type: :model do
+ it_behaves_like 'having unique enum values'
+
+ describe 'associations' do
+ it { is_expected.to have_many(:batched_jobs).with_foreign_key(:batched_background_migration_id) }
+
+ describe '#last_job' do
+ let!(:batched_migration) { create(:batched_background_migration) }
+ let!(:batched_job1) { create(:batched_background_migration_job, batched_migration: batched_migration) }
+ let!(:batched_job2) { create(:batched_background_migration_job, batched_migration: batched_migration) }
+
+ it 'returns the most recent (in order of id) batched job' do
+ expect(batched_migration.last_job).to eq(batched_job2)
+ end
+ end
+ end
+
+ describe '.queue_order' do
+ let!(:migration1) { create(:batched_background_migration) }
+ let!(:migration2) { create(:batched_background_migration) }
+ let!(:migration3) { create(:batched_background_migration) }
+
+ it 'returns batched migrations ordered by their id' do
+ expect(described_class.queue_order.all).to eq([migration1, migration2, migration3])
+ end
+ end
+
+ describe '#interval_elapsed?' do
+ context 'when the migration has no last_job' do
+ let(:batched_migration) { build(:batched_background_migration) }
+
+ it 'returns true' do
+ expect(batched_migration.interval_elapsed?).to eq(true)
+ end
+ end
+
+ context 'when the migration has a last_job' do
+ let(:interval) { 2.minutes }
+ let(:batched_migration) { create(:batched_background_migration, interval: interval) }
+
+ context 'when the last_job is less than an interval old' do
+ it 'returns false' do
+ freeze_time do
+ create(:batched_background_migration_job,
+ batched_migration: batched_migration,
+ created_at: Time.current - 1.minute)
+
+ expect(batched_migration.interval_elapsed?).to eq(false)
+ end
+ end
+ end
+
+ context 'when the last_job is exactly an interval old' do
+ it 'returns true' do
+ freeze_time do
+ create(:batched_background_migration_job,
+ batched_migration: batched_migration,
+ created_at: Time.current - 2.minutes)
+
+ expect(batched_migration.interval_elapsed?).to eq(true)
+ end
+ end
+ end
+
+ context 'when the last_job is more than an interval old' do
+ it 'returns true' do
+ freeze_time do
+ create(:batched_background_migration_job,
+ batched_migration: batched_migration,
+ created_at: Time.current - 3.minutes)
+
+ expect(batched_migration.interval_elapsed?).to eq(true)
+ end
+ end
+ end
+ end
+ end
+
+ describe '#create_batched_job!' do
+ let(:batched_migration) { create(:batched_background_migration) }
+
+ it 'creates a batched_job with the correct batch configuration' do
+ batched_job = batched_migration.create_batched_job!(1, 5)
+
+ expect(batched_job).to have_attributes(
+ min_value: 1,
+ max_value: 5,
+ batch_size: batched_migration.batch_size,
+ sub_batch_size: batched_migration.sub_batch_size)
+ end
+ end
+
+ describe '#next_min_value' do
+ let!(:batched_migration) { create(:batched_background_migration) }
+
+ context 'when a previous job exists' do
+ let!(:batched_job) { create(:batched_background_migration_job, batched_migration: batched_migration) }
+
+ it 'returns the next value after the previous maximum' do
+ expect(batched_migration.next_min_value).to eq(batched_job.max_value + 1)
+ end
+ end
+
+ context 'when a previous job does not exist' do
+ it 'returns the migration minimum value' do
+ expect(batched_migration.next_min_value).to eq(batched_migration.min_value)
+ end
+ end
+ end
+
+ describe '#job_class' do
+ let(:job_class) { Gitlab::BackgroundMigration::CopyColumnUsingBackgroundMigrationJob }
+ let(:batched_migration) { build(:batched_background_migration) }
+
+ it 'returns the class of the job for the migration' do
+ expect(batched_migration.job_class).to eq(job_class)
+ end
+ end
+
+ describe '#batch_class' do
+ let(:batch_class) { Gitlab::BackgroundMigration::BatchingStrategies::PrimaryKeyBatchingStrategy}
+ let(:batched_migration) { build(:batched_background_migration) }
+
+ it 'returns the class of the batch strategy for the migration' do
+ expect(batched_migration.batch_class).to eq(batch_class)
+ end
+ end
+
+ shared_examples_for 'an attr_writer that demodulizes assigned class names' do |attribute_name|
+ let(:batched_migration) { build(:batched_background_migration) }
+
+ context 'when a module name exists' do
+ it 'removes the module name' do
+ batched_migration.public_send(:"#{attribute_name}=", '::Foo::Bar')
+
+ expect(batched_migration[attribute_name]).to eq('Bar')
+ end
+ end
+
+ context 'when a module name does not exist' do
+ it 'does not change the given class name' do
+ batched_migration.public_send(:"#{attribute_name}=", 'Bar')
+
+ expect(batched_migration[attribute_name]).to eq('Bar')
+ end
+ end
+ end
+
+ describe '#job_class_name=' do
+ it_behaves_like 'an attr_writer that demodulizes assigned class names', :job_class_name
+ end
+
+ describe '#batch_class_name=' do
+ it_behaves_like 'an attr_writer that demodulizes assigned class names', :batch_class_name
+ end
+end
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
new file mode 100644
index 00000000000..17cceb35ff7
--- /dev/null
+++ b/spec/lib/gitlab/database/background_migration/batched_migration_wrapper_spec.rb
@@ -0,0 +1,70 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigrationWrapper, '#perform' do
+ let(:migration_wrapper) { described_class.new }
+ let(:job_class) { Gitlab::BackgroundMigration::CopyColumnUsingBackgroundMigrationJob }
+
+ let_it_be(:active_migration) { create(:batched_background_migration, :active, job_arguments: [:id, :other_id]) }
+
+ let!(:job_record) { create(:batched_background_migration_job, batched_migration: active_migration) }
+
+ it 'runs the migration job' do
+ expect_next_instance_of(job_class) do |job_instance|
+ expect(job_instance).to receive(:perform).with(1, 10, 'events', 'id', 1, 'id', 'other_id')
+ end
+
+ migration_wrapper.perform(job_record)
+ end
+
+ it 'updates the the tracking record in the database' do
+ expect(job_record).to receive(:update!).with(hash_including(attempts: 1, status: :running)).and_call_original
+
+ freeze_time do
+ migration_wrapper.perform(job_record)
+
+ reloaded_job_record = job_record.reload
+
+ expect(reloaded_job_record).not_to be_pending
+ expect(reloaded_job_record.attempts).to eq(1)
+ expect(reloaded_job_record.started_at).to eq(Time.current)
+ end
+ end
+
+ context 'when the migration job does not raise an error' do
+ it 'marks the tracking record as succeeded' do
+ expect_next_instance_of(job_class) do |job_instance|
+ expect(job_instance).to receive(:perform).with(1, 10, 'events', 'id', 1, 'id', 'other_id')
+ end
+
+ freeze_time do
+ migration_wrapper.perform(job_record)
+
+ reloaded_job_record = job_record.reload
+
+ expect(reloaded_job_record).to be_succeeded
+ expect(reloaded_job_record.finished_at).to eq(Time.current)
+ end
+ end
+ end
+
+ context 'when the migration job raises an error' do
+ it 'marks the tracking record as failed before raising the error' do
+ expect_next_instance_of(job_class) do |job_instance|
+ expect(job_instance).to receive(:perform)
+ .with(1, 10, 'events', 'id', 1, 'id', 'other_id')
+ .and_raise(RuntimeError, 'Something broke!')
+ end
+
+ freeze_time do
+ expect { migration_wrapper.perform(job_record) }.to raise_error(RuntimeError, 'Something broke!')
+
+ reloaded_job_record = job_record.reload
+
+ expect(reloaded_job_record).to be_failed
+ expect(reloaded_job_record.finished_at).to eq(Time.current)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/database/background_migration/scheduler_spec.rb b/spec/lib/gitlab/database/background_migration/scheduler_spec.rb
new file mode 100644
index 00000000000..ba745acdf8a
--- /dev/null
+++ b/spec/lib/gitlab/database/background_migration/scheduler_spec.rb
@@ -0,0 +1,182 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Database::BackgroundMigration::Scheduler, '#perform' do
+ let(:scheduler) { described_class.new }
+
+ shared_examples_for 'it has no jobs to run' do
+ it 'does not create and run a migration job' do
+ test_wrapper = double('test wrapper')
+
+ expect(test_wrapper).not_to receive(:perform)
+
+ expect do
+ scheduler.perform(migration_wrapper: test_wrapper)
+ end.not_to change { Gitlab::Database::BackgroundMigration::BatchedJob.count }
+ end
+ end
+
+ context 'when there are no active migrations' do
+ let!(:migration) { create(:batched_background_migration, :finished) }
+
+ it_behaves_like 'it has no jobs to run'
+ end
+
+ shared_examples_for 'it has completed the migration' do
+ it 'marks the migration as finished' do
+ relation = Gitlab::Database::BackgroundMigration::BatchedMigration.finished.where(id: first_migration.id)
+
+ expect { scheduler.perform }.to change { relation.count }.by(1)
+ end
+ end
+
+ context 'when there are active migrations' do
+ let!(:first_migration) { create(:batched_background_migration, :active, batch_size: 2) }
+ let!(:last_migration) { create(:batched_background_migration, :active) }
+
+ let(:job_relation) do
+ Gitlab::Database::BackgroundMigration::BatchedJob.where(batched_background_migration_id: first_migration.id)
+ end
+
+ context 'when the migration interval has not elapsed' do
+ before do
+ expect_next_found_instance_of(Gitlab::Database::BackgroundMigration::BatchedMigration) do |migration|
+ expect(migration).to receive(:interval_elapsed?).and_return(false)
+ end
+ end
+
+ it_behaves_like 'it has no jobs to run'
+ end
+
+ context 'when the interval has elapsed' do
+ before do
+ expect_next_found_instance_of(Gitlab::Database::BackgroundMigration::BatchedMigration) do |migration|
+ expect(migration).to receive(:interval_elapsed?).and_return(true)
+ end
+ end
+
+ context 'when the first migration has no previous jobs' do
+ context 'when the migration has batches to process' do
+ let!(:event1) { create(:event) }
+ let!(:event2) { create(:event) }
+ let!(:event3) { create(:event) }
+
+ it 'runs the job for the first batch' do
+ first_migration.update!(min_value: event1.id, max_value: event3.id)
+
+ expect_next_instance_of(Gitlab::Database::BackgroundMigration::BatchedMigrationWrapper) do |wrapper|
+ expect(wrapper).to receive(:perform).and_wrap_original do |_, job_record|
+ expect(job_record).to eq(job_relation.first)
+ end
+ end
+
+ expect { scheduler.perform }.to change { job_relation.count }.by(1)
+
+ expect(job_relation.first).to have_attributes(
+ min_value: event1.id,
+ max_value: event2.id,
+ batch_size: first_migration.batch_size,
+ sub_batch_size: first_migration.sub_batch_size)
+ end
+ end
+
+ context 'when the migration has no batches to process' do
+ it_behaves_like 'it has no jobs to run'
+ it_behaves_like 'it has completed the migration'
+ end
+ end
+
+ context 'when the first migration has previous jobs' do
+ let!(:event1) { create(:event) }
+ let!(:event2) { create(:event) }
+ let!(:event3) { create(:event) }
+
+ let!(:previous_job) do
+ create(:batched_background_migration_job,
+ batched_migration: first_migration,
+ min_value: event1.id,
+ max_value: event2.id,
+ batch_size: 2,
+ sub_batch_size: 1)
+ end
+
+ context 'when the migration is ready to process another job' do
+ it 'runs the migration job for the next batch' do
+ first_migration.update!(min_value: event1.id, max_value: event3.id)
+
+ expect_next_instance_of(Gitlab::Database::BackgroundMigration::BatchedMigrationWrapper) do |wrapper|
+ expect(wrapper).to receive(:perform).and_wrap_original do |_, job_record|
+ expect(job_record).to eq(job_relation.last)
+ end
+ end
+
+ expect { scheduler.perform }.to change { job_relation.count }.by(1)
+
+ expect(job_relation.last).to have_attributes(
+ min_value: event3.id,
+ max_value: event3.id,
+ batch_size: first_migration.batch_size,
+ sub_batch_size: first_migration.sub_batch_size)
+ end
+ end
+
+ context 'when the migration has no batches remaining' do
+ let!(:final_job) do
+ create(:batched_background_migration_job,
+ batched_migration: first_migration,
+ min_value: event3.id,
+ max_value: event3.id,
+ batch_size: 2,
+ sub_batch_size: 1)
+ end
+
+ it_behaves_like 'it has no jobs to run'
+ it_behaves_like 'it has completed the migration'
+ end
+ end
+
+ context 'when the bounds of the next batch exceed the migration maximum value' do
+ let!(:events) { create_list(:event, 3) }
+ let(:event1) { events[0] }
+ let(:event2) { events[1] }
+
+ context 'when the batch maximum exceeds the migration maximum' do
+ it 'clamps the batch maximum to the migration maximum' do
+ first_migration.update!(batch_size: 5, min_value: event1.id, max_value: event2.id)
+
+ expect_next_instance_of(Gitlab::Database::BackgroundMigration::BatchedMigrationWrapper) do |wrapper|
+ expect(wrapper).to receive(:perform)
+ end
+
+ expect { scheduler.perform }.to change { job_relation.count }.by(1)
+
+ expect(job_relation.first).to have_attributes(
+ min_value: event1.id,
+ max_value: event2.id,
+ batch_size: first_migration.batch_size,
+ sub_batch_size: first_migration.sub_batch_size)
+ end
+ end
+
+ context 'when the batch minimum exceeds the migration maximum' do
+ let!(:previous_job) do
+ create(:batched_background_migration_job,
+ batched_migration: first_migration,
+ min_value: event1.id,
+ max_value: event2.id,
+ batch_size: 5,
+ sub_batch_size: 1)
+ end
+
+ before do
+ first_migration.update!(batch_size: 5, min_value: 1, max_value: event2.id)
+ end
+
+ it_behaves_like 'it has no jobs to run'
+ it_behaves_like 'it has completed the migration'
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/database/bulk_update_spec.rb b/spec/lib/gitlab/database/bulk_update_spec.rb
index f2a7d6e69d8..dbafada26ca 100644
--- a/spec/lib/gitlab/database/bulk_update_spec.rb
+++ b/spec/lib/gitlab/database/bulk_update_spec.rb
@@ -13,8 +13,8 @@ RSpec.describe Gitlab::Database::BulkUpdate do
i_a, i_b = create_list(:issue, 2)
{
- i_a => { title: 'Issue a' },
- i_b => { title: 'Issue b' }
+ i_a => { title: 'Issue a' },
+ i_b => { title: 'Issue b' }
}
end
@@ -51,7 +51,7 @@ RSpec.describe Gitlab::Database::BulkUpdate do
it 'is possible to update all objects in a single query' do
users = create_list(:user, 3)
- mapping = users.zip(%w(foo bar baz)).to_h do |u, name|
+ mapping = users.zip(%w[foo bar baz]).to_h do |u, name|
[u, { username: name, admin: true }]
end
@@ -61,13 +61,13 @@ RSpec.describe Gitlab::Database::BulkUpdate do
# We have optimistically updated the values
expect(users).to all(be_admin)
- expect(users.map(&:username)).to eq(%w(foo bar baz))
+ expect(users.map(&:username)).to eq(%w[foo bar baz])
users.each(&:reset)
# The values are correct on reset
expect(users).to all(be_admin)
- expect(users.map(&:username)).to eq(%w(foo bar baz))
+ expect(users.map(&:username)).to eq(%w[foo bar baz])
end
it 'is possible to update heterogeneous sets' do
@@ -79,8 +79,8 @@ RSpec.describe Gitlab::Database::BulkUpdate do
mapping = {
mr_a => { title: 'MR a' },
- i_a => { title: 'Issue a' },
- i_b => { title: 'Issue b' }
+ i_a => { title: 'Issue a' },
+ i_b => { title: 'Issue b' }
}
expect do
@@ -99,8 +99,8 @@ RSpec.describe Gitlab::Database::BulkUpdate do
i_a, i_b = create_list(:issue, 2)
mapping = {
- i_a => { title: 'Issue a' },
- i_b => { title: 'Issue b' }
+ i_a => { title: 'Issue a' },
+ i_b => { title: 'Issue b' }
}
described_class.execute(%i[title], mapping)
@@ -113,23 +113,19 @@ RSpec.describe Gitlab::Database::BulkUpdate do
include_examples 'basic functionality'
context 'when prepared statements are configured differently to the normal test environment' do
- # rubocop: disable RSpec/LeakyConstantDeclaration
- # This cop is disabled because you cannot call establish_connection on
- # an anonymous class.
- class ActiveRecordBasePreparedStatementsInverted < ActiveRecord::Base
- def self.abstract_class?
- true # So it gets its own connection
+ before do
+ klass = Class.new(ActiveRecord::Base) do
+ def self.abstract_class?
+ true # So it gets its own connection
+ end
end
- end
- # rubocop: enable RSpec/LeakyConstantDeclaration
- before_all do
+ stub_const('ActiveRecordBasePreparedStatementsInverted', klass)
+
c = ActiveRecord::Base.connection.instance_variable_get(:@config)
inverted = c.merge(prepared_statements: !ActiveRecord::Base.connection.prepared_statements)
ActiveRecordBasePreparedStatementsInverted.establish_connection(inverted)
- end
- before do
allow(ActiveRecord::Base).to receive(:connection_specification_name)
.and_return(ActiveRecordBasePreparedStatementsInverted.connection_specification_name)
end
diff --git a/spec/lib/gitlab/database/migration_helpers_spec.rb b/spec/lib/gitlab/database/migration_helpers_spec.rb
index 6de7fc3a50e..aceb2299cc0 100644
--- a/spec/lib/gitlab/database/migration_helpers_spec.rb
+++ b/spec/lib/gitlab/database/migration_helpers_spec.rb
@@ -1720,7 +1720,7 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
.with(
2.minutes,
'CopyColumnUsingBackgroundMigrationJob',
- [event.id, event.id, :events, :id, :id, 'id_convert_to_bigint', 100]
+ [event.id, event.id, :events, :id, 100, :id, 'id_convert_to_bigint']
)
expect(Gitlab::BackgroundMigration)
diff --git a/spec/lib/gitlab/database/migrations/background_migration_helpers_spec.rb b/spec/lib/gitlab/database/migrations/background_migration_helpers_spec.rb
index 3e8563376ce..e25e4af2e86 100644
--- a/spec/lib/gitlab/database/migrations/background_migration_helpers_spec.rb
+++ b/spec/lib/gitlab/database/migrations/background_migration_helpers_spec.rb
@@ -21,7 +21,7 @@ RSpec.describe Gitlab::Database::Migrations::BackgroundMigrationHelpers do
context 'with enough rows to bulk queue jobs more than once' do
before do
- stub_const('Gitlab::Database::Migrations::BackgroundMigrationHelpers::BACKGROUND_MIGRATION_JOB_BUFFER_SIZE', 1)
+ stub_const('Gitlab::Database::Migrations::BackgroundMigrationHelpers::JOB_BUFFER_SIZE', 1)
end
it 'queues jobs correctly' do
@@ -262,6 +262,120 @@ RSpec.describe Gitlab::Database::Migrations::BackgroundMigrationHelpers do
end
end
+ describe '#queue_batched_background_migration' do
+ it 'creates the database record for the migration' do
+ expect do
+ model.queue_batched_background_migration(
+ 'MyJobClass',
+ :projects,
+ :id,
+ job_interval: 5.minutes,
+ batch_min_value: 5,
+ batch_max_value: 1000,
+ batch_class_name: 'MyBatchClass',
+ batch_size: 100,
+ sub_batch_size: 10)
+ end.to change { Gitlab::Database::BackgroundMigration::BatchedMigration.count }.by(1)
+
+ expect(Gitlab::Database::BackgroundMigration::BatchedMigration.last).to have_attributes(
+ job_class_name: 'MyJobClass',
+ table_name: 'projects',
+ column_name: 'id',
+ interval: 300,
+ min_value: 5,
+ max_value: 1000,
+ batch_class_name: 'MyBatchClass',
+ batch_size: 100,
+ sub_batch_size: 10,
+ job_arguments: %w[],
+ status: 'active')
+ end
+
+ context 'when the job interval is lower than the minimum' do
+ let(:minimum_delay) { described_class::BATCH_MIN_DELAY }
+
+ it 'sets the job interval to the minimum value' do
+ expect do
+ model.queue_batched_background_migration('MyJobClass', :events, :id, job_interval: minimum_delay - 1.minute)
+ end.to change { Gitlab::Database::BackgroundMigration::BatchedMigration.count }.by(1)
+
+ created_migration = Gitlab::Database::BackgroundMigration::BatchedMigration.last
+
+ expect(created_migration.interval).to eq(minimum_delay)
+ end
+ end
+
+ context 'when additional arguments are passed to the method' do
+ it 'saves the arguments on the database record' do
+ expect do
+ model.queue_batched_background_migration(
+ 'MyJobClass',
+ :projects,
+ :id,
+ 'my',
+ 'arguments',
+ job_interval: 5.minutes,
+ batch_max_value: 1000)
+ end.to change { Gitlab::Database::BackgroundMigration::BatchedMigration.count }.by(1)
+
+ expect(Gitlab::Database::BackgroundMigration::BatchedMigration.last).to have_attributes(
+ job_class_name: 'MyJobClass',
+ table_name: 'projects',
+ column_name: 'id',
+ interval: 300,
+ min_value: 1,
+ max_value: 1000,
+ job_arguments: %w[my arguments])
+ end
+ end
+
+ context 'when the max_value is not given' do
+ context 'when records exist in the database' do
+ let!(:event1) { create(:event) }
+ let!(:event2) { create(:event) }
+ let!(:event3) { create(:event) }
+
+ it 'creates the record with the current max value' do
+ expect do
+ model.queue_batched_background_migration('MyJobClass', :events, :id, job_interval: 5.minutes)
+ end.to change { Gitlab::Database::BackgroundMigration::BatchedMigration.count }.by(1)
+
+ created_migration = Gitlab::Database::BackgroundMigration::BatchedMigration.last
+
+ expect(created_migration.max_value).to eq(event3.id)
+ end
+
+ it 'creates the record with an active status' do
+ expect do
+ model.queue_batched_background_migration('MyJobClass', :events, :id, job_interval: 5.minutes)
+ end.to change { Gitlab::Database::BackgroundMigration::BatchedMigration.count }.by(1)
+
+ expect(Gitlab::Database::BackgroundMigration::BatchedMigration.last).to be_active
+ end
+ end
+
+ context 'when the database is empty' do
+ it 'sets the max value to the min value' do
+ expect do
+ model.queue_batched_background_migration('MyJobClass', :events, :id, job_interval: 5.minutes)
+ end.to change { Gitlab::Database::BackgroundMigration::BatchedMigration.count }.by(1)
+
+ created_migration = Gitlab::Database::BackgroundMigration::BatchedMigration.last
+
+ expect(created_migration.max_value).to eq(created_migration.min_value)
+ end
+
+ it 'creates the record with a finished status' do
+ expect do
+ model.queue_batched_background_migration('MyJobClass', :projects, :id, job_interval: 5.minutes)
+ end.to change { Gitlab::Database::BackgroundMigration::BatchedMigration.count }.by(1)
+
+ expect(Gitlab::Database::BackgroundMigration::BatchedMigration.last).to be_finished
+ end
+ end
+ end
+ end
+
describe '#migrate_async' do
it 'calls BackgroundMigrationWorker.perform_async' do
expect(BackgroundMigrationWorker).to receive(:perform_async).with("Class", "hello", "world")
diff --git a/spec/lib/gitlab/database/migrations/observers/query_statistics_spec.rb b/spec/lib/gitlab/database/migrations/observers/query_statistics_spec.rb
new file mode 100644
index 00000000000..a3b03050b33
--- /dev/null
+++ b/spec/lib/gitlab/database/migrations/observers/query_statistics_spec.rb
@@ -0,0 +1,68 @@
+# frozen_string_literal: true
+require 'spec_helper'
+
+RSpec.describe Gitlab::Database::Migrations::Observers::QueryStatistics do
+ subject { described_class.new }
+
+ let(:connection) { ActiveRecord::Base.connection }
+
+ def mock_pgss(enabled: true)
+ if enabled
+ allow(subject).to receive(:function_exists?).with(:pg_stat_statements_reset).and_return(true)
+ allow(connection).to receive(:view_exists?).with(:pg_stat_statements).and_return(true)
+ else
+ allow(subject).to receive(:function_exists?).with(:pg_stat_statements_reset).and_return(false)
+ allow(connection).to receive(:view_exists?).with(:pg_stat_statements).and_return(false)
+ end
+ end
+
+ describe '#before' do
+ context 'with pgss available' do
+ it 'resets pg_stat_statements' do
+ mock_pgss(enabled: true)
+ expect(connection).to receive(:execute).with('select pg_stat_statements_reset()').once
+
+ subject.before
+ end
+ end
+
+ context 'without pgss available' do
+ it 'executes nothing' do
+ mock_pgss(enabled: false)
+ expect(connection).not_to receive(:execute)
+
+ subject.before
+ end
+ end
+ end
+
+ describe '#record' do
+ let(:observation) { Gitlab::Database::Migrations::Observation.new }
+ let(:result) { double }
+ let(:pgss_query) do
+ <<~SQL
+ SELECT query, calls, total_time, max_time, mean_time, rows
+ FROM pg_stat_statements
+ ORDER BY total_time DESC
+ SQL
+ end
+
+ context 'with pgss available' do
+ it 'fetches data from pg_stat_statements and stores on the observation' do
+ mock_pgss(enabled: true)
+ expect(connection).to receive(:execute).with(pgss_query).once.and_return(result)
+
+ expect { subject.record(observation) }.to change { observation.query_statistics }.from(nil).to(result)
+ end
+ end
+
+ context 'without pgss available' do
+ it 'executes nothing' do
+ mock_pgss(enabled: false)
+ expect(connection).not_to receive(:execute)
+
+ expect { subject.record(observation) }.not_to change { observation.query_statistics }
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/database/rename_reserved_paths_migration/v1/rename_base_spec.rb b/spec/lib/gitlab/database/rename_reserved_paths_migration/v1/rename_base_spec.rb
index 76b1be1e497..757da2d9092 100644
--- a/spec/lib/gitlab/database/rename_reserved_paths_migration/v1/rename_base_spec.rb
+++ b/spec/lib/gitlab/database/rename_reserved_paths_migration/v1/rename_base_spec.rb
@@ -81,7 +81,7 @@ RSpec.describe Gitlab::Database::RenameReservedPathsMigration::V1::RenameBase, :
end
describe '#rename_path_for_routable' do
- context 'for namespaces' do
+ context 'for personal namespaces' do
let(:namespace) { create(:namespace, path: 'the-path') }
it "renames namespaces called the-path" do
@@ -119,13 +119,16 @@ RSpec.describe Gitlab::Database::RenameReservedPathsMigration::V1::RenameBase, :
expect(project.route.reload.path).to eq('the-path-but-not-really/the-project')
end
+ end
- context "the-path namespace -> subgroup -> the-path0 project" do
+ context 'for groups' do
+ context "the-path group -> subgroup -> the-path0 project" do
it "updates the route of the project correctly" do
- subgroup = create(:group, path: "subgroup", parent: namespace)
+ group = create(:group, path: 'the-path')
+ subgroup = create(:group, path: "subgroup", parent: group)
project = create(:project, :repository, path: "the-path0", namespace: subgroup)
- subject.rename_path_for_routable(migration_namespace(namespace))
+ subject.rename_path_for_routable(migration_namespace(group))
expect(project.route.reload.path).to eq("the-path0/subgroup/the-path0")
end
@@ -158,23 +161,27 @@ RSpec.describe Gitlab::Database::RenameReservedPathsMigration::V1::RenameBase, :
end
describe '#perform_rename' do
- describe 'for namespaces' do
- let(:namespace) { create(:namespace, path: 'the-path') }
-
+ context 'for personal namespaces' do
it 'renames the path' do
+ namespace = create(:namespace, path: 'the-path')
+
subject.perform_rename(migration_namespace(namespace), 'the-path', 'renamed')
expect(namespace.reload.path).to eq('renamed')
+ expect(namespace.reload.route.path).to eq('renamed')
end
+ end
- it 'renames all the routes for the namespace' do
- child = create(:group, path: 'child', parent: namespace)
+ context 'for groups' do
+ it 'renames all the routes for the group' do
+ group = create(:group, path: 'the-path')
+ child = create(:group, path: 'child', parent: group)
project = create(:project, :repository, namespace: child, path: 'the-project')
- other_one = create(:namespace, path: 'the-path-is-similar')
+ other_one = create(:group, path: 'the-path-is-similar')
- subject.perform_rename(migration_namespace(namespace), 'the-path', 'renamed')
+ subject.perform_rename(migration_namespace(group), 'the-path', 'renamed')
- expect(namespace.reload.route.path).to eq('renamed')
+ expect(group.reload.route.path).to eq('renamed')
expect(child.reload.route.path).to eq('renamed/child')
expect(project.reload.route.path).to eq('renamed/child/the-project')
expect(other_one.reload.route.path).to eq('the-path-is-similar')
diff --git a/spec/lib/gitlab/database/similarity_score_spec.rb b/spec/lib/gitlab/database/similarity_score_spec.rb
index cf75e5a72d9..b7b66494390 100644
--- a/spec/lib/gitlab/database/similarity_score_spec.rb
+++ b/spec/lib/gitlab/database/similarity_score_spec.rb
@@ -71,7 +71,7 @@ RSpec.describe Gitlab::Database::SimilarityScore do
let(:search) { 'xyz' }
it 'results have 0 similarity score' do
- expect(query_result.map { |row| row['similarity'] }).to all(eq(0))
+ expect(query_result.map { |row| row['similarity'].to_f }).to all(eq(0))
end
end
end
diff --git a/spec/lib/gitlab/database_spec.rb b/spec/lib/gitlab/database_spec.rb
index 3175040167b..1553a989dba 100644
--- a/spec/lib/gitlab/database_spec.rb
+++ b/spec/lib/gitlab/database_spec.rb
@@ -441,4 +441,112 @@ RSpec.describe Gitlab::Database do
end
end
end
+
+ describe 'ActiveRecordBaseTransactionMetrics' do
+ def subscribe_events
+ events = []
+
+ begin
+ subscriber = ActiveSupport::Notifications.subscribe('transaction.active_record') do |e|
+ events << e
+ end
+
+ yield
+ ensure
+ ActiveSupport::Notifications.unsubscribe(subscriber) if subscriber
+ end
+
+ events
+ end
+
+ context 'without a transaction block' do
+ it 'does not publish a transaction event' do
+ events = subscribe_events do
+ User.first
+ end
+
+ expect(events).to be_empty
+ end
+ end
+
+ context 'within a transaction block' do
+ it 'publishes a transaction event' do
+ events = subscribe_events do
+ ActiveRecord::Base.transaction do
+ User.first
+ end
+ end
+
+ expect(events.length).to be(1)
+
+ event = events.first
+ expect(event).not_to be_nil
+ expect(event.duration).to be > 0.0
+ expect(event.payload).to a_hash_including(
+ connection: be_a(ActiveRecord::ConnectionAdapters::AbstractAdapter)
+ )
+ end
+ end
+
+ context 'within an empty transaction block' do
+ it 'publishes a transaction event' do
+ events = subscribe_events do
+ ActiveRecord::Base.transaction {}
+ end
+
+ expect(events.length).to be(1)
+
+ event = events.first
+ expect(event).not_to be_nil
+ expect(event.duration).to be > 0.0
+ expect(event.payload).to a_hash_including(
+ connection: be_a(ActiveRecord::ConnectionAdapters::AbstractAdapter)
+ )
+ end
+ end
+
+ context 'within a nested transaction block' do
+ it 'publishes multiple transaction events' do
+ events = subscribe_events do
+ ActiveRecord::Base.transaction do
+ ActiveRecord::Base.transaction do
+ ActiveRecord::Base.transaction do
+ User.first
+ end
+ end
+ end
+ end
+
+ expect(events.length).to be(3)
+
+ events.each do |event|
+ expect(event).not_to be_nil
+ expect(event.duration).to be > 0.0
+ expect(event.payload).to a_hash_including(
+ connection: be_a(ActiveRecord::ConnectionAdapters::AbstractAdapter)
+ )
+ end
+ end
+ end
+
+ context 'within a cancelled transaction block' do
+ it 'publishes multiple transaction events' do
+ events = subscribe_events do
+ ActiveRecord::Base.transaction do
+ User.first
+ raise ActiveRecord::Rollback
+ end
+ end
+
+ expect(events.length).to be(1)
+
+ event = events.first
+ expect(event).not_to be_nil
+ expect(event.duration).to be > 0.0
+ expect(event.payload).to a_hash_including(
+ connection: be_a(ActiveRecord::ConnectionAdapters::AbstractAdapter)
+ )
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/diff/highlight_cache_spec.rb b/spec/lib/gitlab/diff/highlight_cache_spec.rb
index 94717152488..d26bc5fc9a8 100644
--- a/spec/lib/gitlab/diff/highlight_cache_spec.rb
+++ b/spec/lib/gitlab/diff/highlight_cache_spec.rb
@@ -237,17 +237,17 @@ RSpec.describe Gitlab::Diff::HighlightCache, :clean_gitlab_redis_cache do
describe '#key' do
subject { cache.key }
- it 'returns the next version of the cache' do
- is_expected.to start_with("highlighted-diff-files:#{cache.diffable.cache_key}:2")
+ it 'returns cache key' do
+ is_expected.to eq("highlighted-diff-files:#{cache.diffable.cache_key}:2:#{cache.diff_options}:true")
end
context 'when feature flag is disabled' do
before do
- stub_feature_flags(improved_merge_diff_highlighting: false)
+ stub_feature_flags(introduce_marker_ranges: false)
end
it 'returns the original version of the cache' do
- is_expected.to start_with("highlighted-diff-files:#{cache.diffable.cache_key}:1")
+ is_expected.to eq("highlighted-diff-files:#{cache.diffable.cache_key}:2:#{cache.diff_options}:false")
end
end
end
diff --git a/spec/lib/gitlab/diff/highlight_spec.rb b/spec/lib/gitlab/diff/highlight_spec.rb
index 283437e7fbd..e613674af3a 100644
--- a/spec/lib/gitlab/diff/highlight_spec.rb
+++ b/spec/lib/gitlab/diff/highlight_spec.rb
@@ -50,11 +50,23 @@ RSpec.describe Gitlab::Diff::Highlight do
end
it 'highlights and marks added lines' do
- code = %Q{+<span id="LC9" class="line" lang="ruby"> <span class="k">raise</span> <span class="no"><span class="idiff left">RuntimeError</span></span><span class="p"><span class="idiff">,</span></span><span class="idiff right"> </span><span class="s2">"System commands must be given as an array of strings"</span></span>\n}
+ code = %Q{+<span id="LC9" class="line" lang="ruby"> <span class="k">raise</span> <span class="no"><span class="idiff left addition">RuntimeError</span></span><span class="p"><span class="idiff addition">,</span></span><span class="idiff right addition"> </span><span class="s2">"System commands must be given as an array of strings"</span></span>\n}
expect(subject[5].rich_text).to eq(code)
end
+ context 'when introduce_marker_ranges is false' do
+ before do
+ stub_feature_flags(introduce_marker_ranges: false)
+ end
+
+ it 'keeps the old bevavior (without mode classes)' do
+ code = %Q{+<span id="LC9" class="line" lang="ruby"> <span class="k">raise</span> <span class="no"><span class="idiff left">RuntimeError</span></span><span class="p"><span class="idiff">,</span></span><span class="idiff right"> </span><span class="s2">"System commands must be given as an array of strings"</span></span>\n}
+
+ expect(subject[5].rich_text).to eq(code)
+ end
+ end
+
context 'when no diff_refs' do
before do
allow(diff_file).to receive(:diff_refs).and_return(nil)
@@ -93,7 +105,7 @@ RSpec.describe Gitlab::Diff::Highlight do
end
it 'marks added lines' do
- code = %q{+ raise <span class="idiff left right">RuntimeError, </span>&quot;System commands must be given as an array of strings&quot;}
+ code = %q{+ raise <span class="idiff left right addition">RuntimeError, </span>&quot;System commands must be given as an array of strings&quot;}
expect(subject[5].rich_text).to eq(code)
expect(subject[5].rich_text).to be_html_safe
diff --git a/spec/lib/gitlab/diff/inline_diff_markdown_marker_spec.rb b/spec/lib/gitlab/diff/inline_diff_markdown_marker_spec.rb
index 60f7f3a103f..3670074cc21 100644
--- a/spec/lib/gitlab/diff/inline_diff_markdown_marker_spec.rb
+++ b/spec/lib/gitlab/diff/inline_diff_markdown_marker_spec.rb
@@ -5,8 +5,8 @@ require 'spec_helper'
RSpec.describe Gitlab::Diff::InlineDiffMarkdownMarker do
describe '#mark' do
let(:raw) { "abc 'def'" }
- let(:inline_diffs) { [2..5] }
- let(:subject) { described_class.new(raw).mark(inline_diffs, mode: :deletion) }
+ let(:inline_diffs) { [Gitlab::MarkerRange.new(2, 5, mode: Gitlab::MarkerRange::DELETION)] }
+ let(:subject) { described_class.new(raw).mark(inline_diffs) }
it 'does not escape html etities and marks the range' do
expect(subject).to eq("ab{-c 'd-}ef'")
diff --git a/spec/lib/gitlab/diff/inline_diff_spec.rb b/spec/lib/gitlab/diff/inline_diff_spec.rb
index dce655d5690..714b5d813c4 100644
--- a/spec/lib/gitlab/diff/inline_diff_spec.rb
+++ b/spec/lib/gitlab/diff/inline_diff_spec.rb
@@ -52,17 +52,6 @@ RSpec.describe Gitlab::Diff::InlineDiff do
expect(subject[0]).to eq([3..6])
expect(subject[1]).to eq([3..3, 17..22])
end
-
- context 'when feature flag is disabled' do
- before do
- stub_feature_flags(improved_merge_diff_highlighting: false)
- end
-
- it 'finds all inline diffs' do
- expect(subject[0]).to eq([3..19])
- expect(subject[1]).to eq([3..22])
- end
- end
end
end
diff --git a/spec/lib/gitlab/diff/pair_selector_spec.rb b/spec/lib/gitlab/diff/pair_selector_spec.rb
new file mode 100644
index 00000000000..da5707bc377
--- /dev/null
+++ b/spec/lib/gitlab/diff/pair_selector_spec.rb
@@ -0,0 +1,84 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+
+RSpec.describe Gitlab::Diff::PairSelector do
+ subject(:selector) { described_class.new(lines) }
+
+ describe '#to_a' do
+ subject { selector.to_a }
+
+ let(:lines) { diff.lines }
+
+ let(:diff) do
+ <<-EOF.strip_heredoc
+ class Test # 0
+ - def initialize(test = true) # 1
+ + def initialize(test = false) # 2
+ @test = test # 3
+ - if true # 4
+ - @foo = "bar" # 5
+ + unless false # 6
+ + @foo = "baz" # 7
+ end
+ end
+ end
+ EOF
+ end
+
+ it 'finds all pairs' do
+ is_expected.to match_array([[1, 2], [4, 6], [5, 7]])
+ end
+
+ context 'when there are empty lines' do
+ let(:lines) { ['- bar', '+ baz', ''] }
+
+ it { expect { subject }.not_to raise_error }
+ end
+
+ context 'when there are only removals' do
+ let(:diff) do
+ <<-EOF.strip_heredoc
+ - class Test
+ - def initialize(test = true)
+ - end
+ - end
+ EOF
+ end
+
+ it 'returns empty collection' do
+ is_expected.to eq([])
+ end
+ end
+
+ context 'when there are only additions' do
+ let(:diff) do
+ <<-EOF.strip_heredoc
+ + class Test
+ + def initialize(test = true)
+ + end
+ + end
+ EOF
+ end
+
+ it 'returns empty collection' do
+ is_expected.to eq([])
+ end
+ end
+
+ context 'when there are no changes' do
+ let(:diff) do
+ <<-EOF.strip_heredoc
+ class Test
+ def initialize(test = true)
+ end
+ end
+ EOF
+ end
+
+ it 'returns empty collection' do
+ is_expected.to eq([])
+ end
+ end
+ end
+end
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 eb11c051adc..7436765e8ee 100644
--- a/spec/lib/gitlab/email/handler/service_desk_handler_spec.rb
+++ b/spec/lib/gitlab/email/handler/service_desk_handler_spec.rb
@@ -36,7 +36,7 @@ RSpec.describe Gitlab::Email::Handler::ServiceDeskHandler do
expect(new_issue.author).to eql(User.support_bot)
expect(new_issue.confidential?).to be true
expect(new_issue.all_references.all).to be_empty
- expect(new_issue.title).to eq("Service Desk (from jake@adventuretime.ooo): The message subject! @all")
+ expect(new_issue.title).to eq("The message subject! @all")
expect(new_issue.description).to eq(expected_description.strip)
end
diff --git a/spec/lib/gitlab/error_tracking/context_payload_generator_spec.rb b/spec/lib/gitlab/error_tracking/context_payload_generator_spec.rb
new file mode 100644
index 00000000000..0e72dd7ec5e
--- /dev/null
+++ b/spec/lib/gitlab/error_tracking/context_payload_generator_spec.rb
@@ -0,0 +1,176 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+require 'rspec-parameterized'
+
+RSpec.describe Gitlab::ErrorTracking::ContextPayloadGenerator do
+ subject(:generator) { described_class.new }
+
+ let(:extra) do
+ {
+ some_other_info: 'info',
+ issue_url: 'http://gitlab.com/gitlab-org/gitlab-foss/-/issues/1'
+ }
+ end
+
+ let(:exception) { StandardError.new("Dummy exception") }
+
+ before do
+ allow(Labkit::Correlation::CorrelationId).to receive(:current_id).and_return('cid')
+ allow(I18n).to receive(:locale).and_return('en')
+ end
+
+ context 'user metadata' do
+ let(:user) { create(:user) }
+
+ it 'appends user metadata to the payload' do
+ payload = {}
+
+ Gitlab::ApplicationContext.with_context(user: user) do
+ payload = generator.generate(exception, extra)
+ end
+
+ expect(payload[:user]).to eql(
+ username: user.username
+ )
+ end
+ end
+
+ context 'tags metadata' do
+ context 'when the GITLAB_SENTRY_EXTRA_TAGS env is not set' do
+ before do
+ stub_env('GITLAB_SENTRY_EXTRA_TAGS', nil)
+ end
+
+ it 'does not log into AppLogger' do
+ expect(Gitlab::AppLogger).not_to receive(:debug)
+
+ generator.generate(exception, extra)
+ end
+
+ it 'does not send any extra tags' do
+ payload = {}
+
+ Gitlab::ApplicationContext.with_context(feature_category: 'feature_a') do
+ payload = generator.generate(exception, extra)
+ end
+
+ expect(payload[:tags]).to eql(
+ correlation_id: 'cid',
+ locale: 'en',
+ program: 'test',
+ feature_category: 'feature_a'
+ )
+ end
+ end
+
+ context 'when the GITLAB_SENTRY_EXTRA_TAGS env is a JSON hash' do
+ it 'includes those tags in all events' do
+ stub_env('GITLAB_SENTRY_EXTRA_TAGS', { foo: 'bar', baz: 'quux' }.to_json)
+ payload = {}
+
+ Gitlab::ApplicationContext.with_context(feature_category: 'feature_a') do
+ payload = generator.generate(exception, extra)
+ end
+
+ expect(payload[:tags]).to eql(
+ correlation_id: 'cid',
+ locale: 'en',
+ program: 'test',
+ feature_category: 'feature_a',
+ 'foo' => 'bar',
+ 'baz' => 'quux'
+ )
+ end
+
+ it 'does not log into AppLogger' do
+ expect(Gitlab::AppLogger).not_to receive(:debug)
+
+ generator.generate(exception, extra)
+ end
+ end
+
+ context 'when the GITLAB_SENTRY_EXTRA_TAGS env is not a JSON hash' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:env_var, :error) do
+ { foo: 'bar', baz: 'quux' }.inspect | 'JSON::ParserError'
+ [].to_json | 'NoMethodError'
+ [%w[foo bar]].to_json | 'NoMethodError'
+ %w[foo bar].to_json | 'NoMethodError'
+ '"string"' | 'NoMethodError'
+ end
+
+ with_them do
+ before do
+ stub_env('GITLAB_SENTRY_EXTRA_TAGS', env_var)
+ end
+
+ it 'logs into AppLogger' do
+ expect(Gitlab::AppLogger).to receive(:debug).with(a_string_matching(error))
+
+ generator.generate({})
+ end
+
+ it 'does not include any extra tags' do
+ payload = {}
+
+ Gitlab::ApplicationContext.with_context(feature_category: 'feature_a') do
+ payload = generator.generate(exception, extra)
+ end
+
+ expect(payload[:tags]).to eql(
+ correlation_id: 'cid',
+ locale: 'en',
+ program: 'test',
+ feature_category: 'feature_a'
+ )
+ end
+ end
+ end
+ end
+
+ context 'extra metadata' do
+ it 'appends extra metadata to the payload' do
+ payload = generator.generate(exception, extra)
+
+ expect(payload[:extra]).to eql(
+ some_other_info: 'info',
+ issue_url: 'http://gitlab.com/gitlab-org/gitlab-foss/-/issues/1'
+ )
+ end
+
+ it 'appends exception embedded extra metadata to the payload' do
+ allow(exception).to receive(:sentry_extra_data).and_return(
+ some_other_info: 'another_info',
+ mr_url: 'https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/1'
+ )
+
+ payload = generator.generate(exception, extra)
+
+ expect(payload[:extra]).to eql(
+ some_other_info: 'another_info',
+ issue_url: 'http://gitlab.com/gitlab-org/gitlab-foss/-/issues/1',
+ mr_url: 'https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/1'
+ )
+ end
+
+ it 'filters sensitive extra info' do
+ extra[:my_token] = '456'
+ allow(exception).to receive(:sentry_extra_data).and_return(
+ mr_url: 'https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/1',
+ another_token: '1234'
+ )
+
+ payload = generator.generate(exception, extra)
+
+ expect(payload[:extra]).to eql(
+ some_other_info: 'info',
+ issue_url: 'http://gitlab.com/gitlab-org/gitlab-foss/-/issues/1',
+ mr_url: 'https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/1',
+ my_token: '[FILTERED]',
+ another_token: '[FILTERED]'
+ )
+ end
+ end
+end
diff --git a/spec/lib/gitlab/error_tracking/log_formatter_spec.rb b/spec/lib/gitlab/error_tracking/log_formatter_spec.rb
new file mode 100644
index 00000000000..188ccd000a1
--- /dev/null
+++ b/spec/lib/gitlab/error_tracking/log_formatter_spec.rb
@@ -0,0 +1,71 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+
+RSpec.describe Gitlab::ErrorTracking::LogFormatter do
+ let(:exception) { StandardError.new('boom') }
+ let(:context_payload) do
+ {
+ server: 'local-hostname-of-the-server',
+ user: {
+ ip_address: '127.0.0.1',
+ username: 'root'
+ },
+ tags: {
+ locale: 'en',
+ feature_category: 'category_a'
+ },
+ extra: {
+ some_other_info: 'other_info',
+ sidekiq: {
+ 'class' => 'HelloWorker',
+ 'args' => ['senstive string', 1, 2],
+ 'another_field' => 'field'
+ }
+ }
+ }
+ end
+
+ before do
+ Raven.context.user[:user_flag] = 'flag'
+ Raven.context.tags[:shard] = 'catchall'
+ Raven.context.extra[:some_info] = 'info'
+
+ allow(exception).to receive(:backtrace).and_return(
+ [
+ 'lib/gitlab/file_a.rb:1',
+ 'lib/gitlab/file_b.rb:2'
+ ]
+ )
+ end
+
+ after do
+ ::Raven::Context.clear!
+ end
+
+ it 'appends error-related log fields and filters sensitive Sidekiq arguments' do
+ payload = described_class.new.generate_log(exception, context_payload)
+
+ expect(payload).to eql(
+ 'exception.class' => 'StandardError',
+ 'exception.message' => 'boom',
+ 'exception.backtrace' => [
+ 'lib/gitlab/file_a.rb:1',
+ 'lib/gitlab/file_b.rb:2'
+ ],
+ 'user.ip_address' => '127.0.0.1',
+ 'user.username' => 'root',
+ 'user.user_flag' => 'flag',
+ 'tags.locale' => 'en',
+ 'tags.feature_category' => 'category_a',
+ 'tags.shard' => 'catchall',
+ 'extra.some_other_info' => 'other_info',
+ 'extra.some_info' => 'info',
+ "extra.sidekiq" => {
+ "another_field" => "field",
+ "args" => ["[FILTERED]", "1", "2"],
+ "class" => "HelloWorker"
+ }
+ )
+ end
+end
diff --git a/spec/lib/gitlab/error_tracking/processor/context_payload_processor_spec.rb b/spec/lib/gitlab/error_tracking/processor/context_payload_processor_spec.rb
new file mode 100644
index 00000000000..0db40eca989
--- /dev/null
+++ b/spec/lib/gitlab/error_tracking/processor/context_payload_processor_spec.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+
+RSpec.describe Gitlab::ErrorTracking::Processor::ContextPayloadProcessor do
+ subject(:processor) { described_class.new }
+
+ before do
+ allow_next_instance_of(Gitlab::ErrorTracking::ContextPayloadGenerator) do |generator|
+ allow(generator).to receive(:generate).and_return(
+ user: { username: 'root' },
+ tags: { locale: 'en', program: 'test', feature_category: 'feature_a', correlation_id: 'cid' },
+ extra: { some_info: 'info' }
+ )
+ end
+ end
+
+ it 'merges the context payload into event payload' do
+ payload = {
+ user: { ip_address: '127.0.0.1' },
+ tags: { priority: 'high' },
+ extra: { sidekiq: { class: 'SomeWorker', args: ['[FILTERED]', 1, 2] } }
+ }
+
+ processor.process(payload)
+
+ expect(payload).to eql(
+ user: {
+ ip_address: '127.0.0.1',
+ username: 'root'
+ },
+ tags: {
+ priority: 'high',
+ locale: 'en',
+ program: 'test',
+ feature_category: 'feature_a',
+ correlation_id: 'cid'
+ },
+ extra: {
+ some_info: 'info',
+ sidekiq: { class: 'SomeWorker', args: ['[FILTERED]', 1, 2] }
+ }
+ )
+ end
+end
diff --git a/spec/lib/gitlab/error_tracking_spec.rb b/spec/lib/gitlab/error_tracking_spec.rb
index 764478ad1d7..a905b9f8d40 100644
--- a/spec/lib/gitlab/error_tracking_spec.rb
+++ b/spec/lib/gitlab/error_tracking_spec.rb
@@ -8,116 +8,55 @@ RSpec.describe Gitlab::ErrorTracking do
let(:exception) { RuntimeError.new('boom') }
let(:issue_url) { 'http://gitlab.com/gitlab-org/gitlab-foss/issues/1' }
- let(:expected_payload_includes) do
- [
- { 'exception.class' => 'RuntimeError' },
- { 'exception.message' => 'boom' },
- { 'tags.correlation_id' => 'cid' },
- { 'extra.some_other_info' => 'info' },
- { 'extra.issue_url' => 'http://gitlab.com/gitlab-org/gitlab-foss/issues/1' }
- ]
+ let(:user) { create(:user) }
+
+ let(:sentry_payload) do
+ {
+ tags: {
+ program: 'test',
+ locale: 'en',
+ feature_category: 'feature_a',
+ correlation_id: 'cid'
+ },
+ user: {
+ username: user.username
+ },
+ extra: {
+ some_other_info: 'info',
+ issue_url: 'http://gitlab.com/gitlab-org/gitlab-foss/issues/1'
+ }
+ }
end
- let(:sentry_event) { Gitlab::Json.parse(Raven.client.transport.events.last[1]) }
+ let(:logger_payload) do
+ {
+ 'exception.class' => 'RuntimeError',
+ 'exception.message' => 'boom',
+ 'tags.program' => 'test',
+ 'tags.locale' => 'en',
+ 'tags.feature_category' => 'feature_a',
+ 'tags.correlation_id' => 'cid',
+ 'user.username' => user.username,
+ 'extra.some_other_info' => 'info',
+ 'extra.issue_url' => 'http://gitlab.com/gitlab-org/gitlab-foss/issues/1'
+ }
+ end
before do
stub_sentry_settings
allow(described_class).to receive(:sentry_dsn).and_return(Gitlab.config.sentry.dsn)
allow(Labkit::Correlation::CorrelationId).to receive(:current_id).and_return('cid')
+ allow(I18n).to receive(:locale).and_return('en')
described_class.configure do |config|
config.encoding = 'json'
end
end
- describe '.configure' do
- context 'default tags from GITLAB_SENTRY_EXTRA_TAGS' do
- context 'when the value is a JSON hash' do
- it 'includes those tags in all events' do
- stub_env('GITLAB_SENTRY_EXTRA_TAGS', { foo: 'bar', baz: 'quux' }.to_json)
-
- described_class.configure do |config|
- config.encoding = 'json'
- end
-
- described_class.track_exception(StandardError.new)
-
- expect(sentry_event['tags'].except('correlation_id', 'locale', 'program'))
- .to eq('foo' => 'bar', 'baz' => 'quux')
- end
- end
-
- context 'when the value is not set' do
- before do
- stub_env('GITLAB_SENTRY_EXTRA_TAGS', nil)
- end
-
- it 'does not log an error' do
- expect(Gitlab::AppLogger).not_to receive(:debug)
-
- described_class.configure do |config|
- config.encoding = 'json'
- end
- end
-
- it 'does not send any extra tags' do
- described_class.configure do |config|
- config.encoding = 'json'
- end
-
- described_class.track_exception(StandardError.new)
-
- expect(sentry_event['tags'].keys).to contain_exactly('correlation_id', 'locale', 'program')
- end
- end
-
- context 'when the value is not a JSON hash' do
- using RSpec::Parameterized::TableSyntax
-
- where(:env_var, :error) do
- { foo: 'bar', baz: 'quux' }.inspect | 'JSON::ParserError'
- [].to_json | 'NoMethodError'
- [%w[foo bar]].to_json | 'NoMethodError'
- %w[foo bar].to_json | 'NoMethodError'
- '"string"' | 'NoMethodError'
- end
-
- with_them do
- before do
- stub_env('GITLAB_SENTRY_EXTRA_TAGS', env_var)
- end
-
- it 'does not include any extra tags' do
- described_class.configure do |config|
- config.encoding = 'json'
- end
-
- described_class.track_exception(StandardError.new)
-
- expect(sentry_event['tags'].except('correlation_id', 'locale', 'program'))
- .to be_empty
- end
-
- it 'logs the error class' do
- expect(Gitlab::AppLogger).to receive(:debug).with(a_string_matching(error))
-
- described_class.configure do |config|
- config.encoding = 'json'
- end
- end
- end
- end
- end
- end
-
- describe '.with_context' do
- it 'adds the expected tags' do
- described_class.with_context {}
-
- expect(Raven.tags_context[:locale].to_s).to eq(I18n.locale.to_s)
- expect(Raven.tags_context[Labkit::Correlation::CorrelationId::LOG_KEY.to_sym].to_s)
- .to eq('cid')
+ around do |example|
+ Gitlab::ApplicationContext.with_context(user: user, feature_category: 'feature_a') do
+ example.run
end
end
@@ -128,10 +67,15 @@ RSpec.describe Gitlab::ErrorTracking do
end
it 'raises the exception' do
- expect(Raven).to receive(:capture_exception)
-
- expect { described_class.track_and_raise_for_dev_exception(exception) }
- .to raise_error(RuntimeError)
+ expect(Raven).to receive(:capture_exception).with(exception, sentry_payload)
+
+ expect do
+ described_class.track_and_raise_for_dev_exception(
+ exception,
+ issue_url: issue_url,
+ some_other_info: 'info'
+ )
+ end.to raise_error(RuntimeError, /boom/)
end
end
@@ -141,19 +85,7 @@ RSpec.describe Gitlab::ErrorTracking do
end
it 'logs the exception with all attributes passed' do
- expected_extras = {
- some_other_info: 'info',
- issue_url: 'http://gitlab.com/gitlab-org/gitlab-foss/issues/1'
- }
-
- expected_tags = {
- correlation_id: 'cid'
- }
-
- expect(Raven).to receive(:capture_exception)
- .with(exception,
- tags: a_hash_including(expected_tags),
- extra: a_hash_including(expected_extras))
+ expect(Raven).to receive(:capture_exception).with(exception, sentry_payload)
described_class.track_and_raise_for_dev_exception(
exception,
@@ -163,8 +95,7 @@ RSpec.describe Gitlab::ErrorTracking do
end
it 'calls Gitlab::ErrorTracking::Logger.error with formatted payload' do
- expect(Gitlab::ErrorTracking::Logger).to receive(:error)
- .with(a_hash_including(*expected_payload_includes))
+ expect(Gitlab::ErrorTracking::Logger).to receive(:error).with(logger_payload)
described_class.track_and_raise_for_dev_exception(
exception,
@@ -177,15 +108,19 @@ RSpec.describe Gitlab::ErrorTracking do
describe '.track_and_raise_exception' do
it 'always raises the exception' do
- expect(Raven).to receive(:capture_exception)
+ expect(Raven).to receive(:capture_exception).with(exception, sentry_payload)
- expect { described_class.track_and_raise_exception(exception) }
- .to raise_error(RuntimeError)
+ expect do
+ described_class.track_and_raise_for_dev_exception(
+ exception,
+ issue_url: issue_url,
+ some_other_info: 'info'
+ )
+ end.to raise_error(RuntimeError, /boom/)
end
it 'calls Gitlab::ErrorTracking::Logger.error with formatted payload' do
- expect(Gitlab::ErrorTracking::Logger).to receive(:error)
- .with(a_hash_including(*expected_payload_includes))
+ expect(Gitlab::ErrorTracking::Logger).to receive(:error).with(logger_payload)
expect do
described_class.track_and_raise_exception(
@@ -210,17 +145,16 @@ RSpec.describe Gitlab::ErrorTracking do
it 'calls Raven.capture_exception' do
track_exception
- expect(Raven).to have_received(:capture_exception)
- .with(exception,
- tags: a_hash_including(correlation_id: 'cid'),
- extra: a_hash_including(some_other_info: 'info', issue_url: issue_url))
+ expect(Raven).to have_received(:capture_exception).with(
+ exception,
+ sentry_payload
+ )
end
it 'calls Gitlab::ErrorTracking::Logger.error with formatted payload' do
track_exception
- expect(Gitlab::ErrorTracking::Logger).to have_received(:error)
- .with(a_hash_including(*expected_payload_includes))
+ expect(Gitlab::ErrorTracking::Logger).to have_received(:error).with(logger_payload)
end
context 'with filterable parameters' do
@@ -229,8 +163,9 @@ RSpec.describe Gitlab::ErrorTracking do
it 'filters parameters' do
track_exception
- expect(Gitlab::ErrorTracking::Logger).to have_received(:error)
- .with(hash_including({ 'extra.test' => 1, 'extra.my_token' => '[FILTERED]' }))
+ expect(Gitlab::ErrorTracking::Logger).to have_received(:error).with(
+ hash_including({ 'extra.test' => 1, 'extra.my_token' => '[FILTERED]' })
+ )
end
end
@@ -241,8 +176,9 @@ RSpec.describe Gitlab::ErrorTracking do
it 'includes the extra data from the exception in the tracking information' do
track_exception
- expect(Raven).to have_received(:capture_exception)
- .with(exception, a_hash_including(extra: a_hash_including(extra_info)))
+ expect(Raven).to have_received(:capture_exception).with(
+ exception, a_hash_including(extra: a_hash_including(extra_info))
+ )
end
end
@@ -253,8 +189,9 @@ RSpec.describe Gitlab::ErrorTracking do
it 'just includes the other extra info' do
track_exception
- expect(Raven).to have_received(:capture_exception)
- .with(exception, a_hash_including(extra: a_hash_including(extra)))
+ expect(Raven).to have_received(:capture_exception).with(
+ exception, a_hash_including(extra: a_hash_including(extra))
+ )
end
end
@@ -266,7 +203,13 @@ RSpec.describe Gitlab::ErrorTracking do
track_exception
expect(Gitlab::ErrorTracking::Logger).to have_received(:error).with(
- hash_including({ 'extra.sidekiq' => { 'class' => 'PostReceive', 'args' => ['1', '{"id"=>2, "name"=>"hello"}', 'some-value', 'another-value'] } }))
+ hash_including(
+ 'extra.sidekiq' => {
+ 'class' => 'PostReceive',
+ 'args' => ['1', '{"id"=>2, "name"=>"hello"}', 'some-value', 'another-value']
+ }
+ )
+ )
end
end
@@ -276,9 +219,17 @@ RSpec.describe Gitlab::ErrorTracking do
it 'filters sensitive arguments before sending' do
track_exception
+ sentry_event = Gitlab::Json.parse(Raven.client.transport.events.last[1])
+
expect(sentry_event.dig('extra', 'sidekiq', 'args')).to eq(['[FILTERED]', 1, 2])
expect(Gitlab::ErrorTracking::Logger).to have_received(:error).with(
- hash_including('extra.sidekiq' => { 'class' => 'UnknownWorker', 'args' => ['[FILTERED]', '1', '2'] }))
+ hash_including(
+ 'extra.sidekiq' => {
+ 'class' => 'UnknownWorker',
+ 'args' => ['[FILTERED]', '1', '2']
+ }
+ )
+ )
end
end
end
diff --git a/spec/lib/gitlab/etag_caching/router/graphql_spec.rb b/spec/lib/gitlab/etag_caching/router/graphql_spec.rb
new file mode 100644
index 00000000000..d151dcba413
--- /dev/null
+++ b/spec/lib/gitlab/etag_caching/router/graphql_spec.rb
@@ -0,0 +1,50 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::EtagCaching::Router::Graphql do
+ it 'matches pipelines endpoint' do
+ result = match_route('/api/graphql', 'pipelines/id/1')
+
+ expect(result).to be_present
+ expect(result.name).to eq 'pipelines_graph'
+ end
+
+ it 'has a valid feature category for every route', :aggregate_failures do
+ feature_categories = YAML.load_file(Rails.root.join('config', 'feature_categories.yml')).to_set
+
+ described_class::ROUTES.each do |route|
+ expect(feature_categories).to include(route.feature_category), "#{route.name} has a category of #{route.feature_category}, which is not valid"
+ end
+ end
+
+ def match_route(path, header)
+ described_class.match(
+ double(path_info: path,
+ headers: { 'X-GITLAB-GRAPHQL-RESOURCE-ETAG' => header }))
+ end
+
+ describe '.cache_key' do
+ let(:path) { '/api/graphql' }
+ let(:header_value) { 'pipelines/id/1' }
+ let(:headers) do
+ { 'X-GITLAB-GRAPHQL-RESOURCE-ETAG' => header_value }.compact
+ end
+
+ subject do
+ described_class.cache_key(double(path: path, headers: headers))
+ end
+
+ it 'uses request path and headers as cache key' do
+ is_expected.to eq '/api/graphql:pipelines/id/1'
+ end
+
+ context 'when the header is missing' do
+ let(:header_value) {}
+
+ it 'does not raise errors' do
+ is_expected.to eq '/api/graphql'
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/etag_caching/router/restful_spec.rb b/spec/lib/gitlab/etag_caching/router/restful_spec.rb
new file mode 100644
index 00000000000..877789b320f
--- /dev/null
+++ b/spec/lib/gitlab/etag_caching/router/restful_spec.rb
@@ -0,0 +1,124 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::EtagCaching::Router::Restful do
+ it 'matches issue notes endpoint' do
+ result = match_route('/my-group/and-subgroup/here-comes-the-project/noteable/issue/1/notes')
+
+ expect(result).to be_present
+ expect(result.name).to eq 'issue_notes'
+ end
+
+ it 'matches MR notes endpoint' do
+ result = match_route('/my-group/and-subgroup/here-comes-the-project/noteable/merge_request/1/notes')
+
+ expect(result).to be_present
+ expect(result.name).to eq 'merge_request_notes'
+ end
+
+ it 'matches issue title endpoint' do
+ result = match_route('/my-group/my-project/-/issues/123/realtime_changes')
+
+ expect(result).to be_present
+ expect(result.name).to eq 'issue_title'
+ end
+
+ it 'matches with a project name that includes a suffix of create' do
+ result = match_route('/group/test-create/-/issues/123/realtime_changes')
+
+ expect(result).to be_present
+ expect(result.name).to eq 'issue_title'
+ end
+
+ it 'matches with a project name that includes a prefix of create' do
+ result = match_route('/group/create-test/-/issues/123/realtime_changes')
+
+ expect(result).to be_present
+ expect(result.name).to eq 'issue_title'
+ end
+
+ it 'matches project pipelines endpoint' do
+ result = match_route('/my-group/my-project/-/pipelines.json')
+
+ expect(result).to be_present
+ expect(result.name).to eq 'project_pipelines'
+ end
+
+ it 'matches commit pipelines endpoint' do
+ result = match_route('/my-group/my-project/-/commit/aa8260d253a53f73f6c26c734c72fdd600f6e6d4/pipelines.json')
+
+ expect(result).to be_present
+ expect(result.name).to eq 'commit_pipelines'
+ end
+
+ it 'matches new merge request pipelines endpoint' do
+ result = match_route('/my-group/my-project/-/merge_requests/new.json')
+
+ expect(result).to be_present
+ expect(result.name).to eq 'new_merge_request_pipelines'
+ end
+
+ it 'matches merge request pipelines endpoint' do
+ result = match_route('/my-group/my-project/-/merge_requests/234/pipelines.json')
+
+ expect(result).to be_present
+ expect(result.name).to eq 'merge_request_pipelines'
+ end
+
+ it 'matches build endpoint' do
+ result = match_route('/my-group/my-project/builds/234.json')
+
+ expect(result).to be_present
+ expect(result.name).to eq 'project_build'
+ end
+
+ it 'does not match blob with confusing name' do
+ result = match_route('/my-group/my-project/-/blob/master/pipelines.json')
+
+ expect(result).to be_blank
+ end
+
+ it 'matches the cluster environments path' do
+ result = match_route('/my-group/my-project/-/clusters/47/environments')
+
+ expect(result).to be_present
+ expect(result.name).to eq 'cluster_environments'
+ end
+
+ it 'matches the environments path' do
+ result = match_route('/my-group/my-project/environments.json')
+
+ expect(result).to be_present
+ expect(result.name).to eq 'environments'
+ end
+
+ it 'matches pipeline#show endpoint' do
+ result = match_route('/my-group/my-project/-/pipelines/2.json')
+
+ expect(result).to be_present
+ expect(result.name).to eq 'project_pipeline'
+ end
+
+ it 'has a valid feature category for every route', :aggregate_failures do
+ feature_categories = YAML.load_file(Rails.root.join('config', 'feature_categories.yml')).to_set
+
+ described_class::ROUTES.each do |route|
+ expect(feature_categories).to include(route.feature_category), "#{route.name} has a category of #{route.feature_category}, which is not valid"
+ end
+ end
+
+ def match_route(path)
+ described_class.match(double(path_info: path))
+ end
+
+ describe '.cache_key' do
+ subject do
+ described_class.cache_key(double(path: '/my-group/my-project/builds/234.json'))
+ end
+
+ it 'uses request path as cache key' do
+ is_expected.to eq '/my-group/my-project/builds/234.json'
+ end
+ end
+end
diff --git a/spec/lib/gitlab/etag_caching/router_spec.rb b/spec/lib/gitlab/etag_caching/router_spec.rb
index dbd9cc230f1..c748ee00721 100644
--- a/spec/lib/gitlab/etag_caching/router_spec.rb
+++ b/spec/lib/gitlab/etag_caching/router_spec.rb
@@ -3,136 +3,33 @@
require 'spec_helper'
RSpec.describe Gitlab::EtagCaching::Router do
- it 'matches issue notes endpoint' do
- result = described_class.match(
- '/my-group/and-subgroup/here-comes-the-project/noteable/issue/1/notes'
- )
-
- expect(result).to be_present
- expect(result.name).to eq 'issue_notes'
- end
-
- it 'matches MR notes endpoint' do
- result = described_class.match(
- '/my-group/and-subgroup/here-comes-the-project/noteable/merge_request/1/notes'
- )
-
- expect(result).to be_present
- expect(result.name).to eq 'merge_request_notes'
- end
-
- it 'matches issue title endpoint' do
- result = described_class.match(
- '/my-group/my-project/-/issues/123/realtime_changes'
- )
-
- expect(result).to be_present
- expect(result.name).to eq 'issue_title'
- end
-
- it 'matches with a project name that includes a suffix of create' do
- result = described_class.match(
- '/group/test-create/-/issues/123/realtime_changes'
- )
-
- expect(result).to be_present
- expect(result.name).to eq 'issue_title'
- end
-
- it 'matches with a project name that includes a prefix of create' do
- result = described_class.match(
- '/group/create-test/-/issues/123/realtime_changes'
- )
-
- expect(result).to be_present
- expect(result.name).to eq 'issue_title'
- end
-
- it 'matches project pipelines endpoint' do
- result = described_class.match(
- '/my-group/my-project/-/pipelines.json'
- )
-
- expect(result).to be_present
- expect(result.name).to eq 'project_pipelines'
- end
-
- it 'matches commit pipelines endpoint' do
- result = described_class.match(
- '/my-group/my-project/-/commit/aa8260d253a53f73f6c26c734c72fdd600f6e6d4/pipelines.json'
- )
-
- expect(result).to be_present
- expect(result.name).to eq 'commit_pipelines'
- end
-
- it 'matches new merge request pipelines endpoint' do
- result = described_class.match(
- '/my-group/my-project/-/merge_requests/new.json'
- )
-
- expect(result).to be_present
- expect(result.name).to eq 'new_merge_request_pipelines'
- end
-
- it 'matches merge request pipelines endpoint' do
- result = described_class.match(
- '/my-group/my-project/-/merge_requests/234/pipelines.json'
- )
-
- expect(result).to be_present
- expect(result.name).to eq 'merge_request_pipelines'
- end
-
- it 'matches build endpoint' do
- result = described_class.match(
- '/my-group/my-project/builds/234.json'
- )
-
- expect(result).to be_present
- expect(result.name).to eq 'project_build'
- end
-
- it 'does not match blob with confusing name' do
- result = described_class.match(
- '/my-group/my-project/-/blob/master/pipelines.json'
- )
-
- expect(result).to be_blank
- end
+ describe '.match', :aggregate_failures do
+ context 'with RESTful routes' do
+ it 'matches project pipelines endpoint' do
+ result = match_route('/my-group/my-project/-/pipelines.json')
+
+ expect(result).to be_present
+ expect(result.name).to eq 'project_pipelines'
+ expect(result.router).to eq Gitlab::EtagCaching::Router::Restful
+ end
+ end
- it 'matches the cluster environments path' do
- result = described_class.match(
- '/my-group/my-project/-/clusters/47/environments'
- )
+ context 'with GraphQL routes' do
+ it 'matches pipelines endpoint' do
+ result = match_route('/api/graphql', 'pipelines/id/12')
- expect(result).to be_present
- expect(result.name).to eq 'cluster_environments'
+ expect(result).to be_present
+ expect(result.name).to eq 'pipelines_graph'
+ expect(result.router).to eq Gitlab::EtagCaching::Router::Graphql
+ end
+ end
end
- it 'matches the environments path' do
- result = described_class.match(
- '/my-group/my-project/environments.json'
- )
+ def match_route(path, header = nil)
+ headers = { 'X-GITLAB-GRAPHQL-RESOURCE-ETAG' => header }.compact
- expect(result).to be_present
- expect(result.name).to eq 'environments'
- end
-
- it 'matches pipeline#show endpoint' do
- result = described_class.match(
- '/my-group/my-project/-/pipelines/2.json'
+ described_class.match(
+ double(path_info: path, headers: headers)
)
-
- expect(result).to be_present
- expect(result.name).to eq 'project_pipeline'
- end
-
- it 'has a valid feature category for every route', :aggregate_failures do
- feature_categories = YAML.load_file(Rails.root.join('config', 'feature_categories.yml')).to_set
-
- described_class::ROUTES.each do |route|
- expect(feature_categories).to include(route.feature_category), "#{route.name} has a category of #{route.feature_category}, which is not valid"
- end
end
end
diff --git a/spec/lib/gitlab/etag_caching/store_spec.rb b/spec/lib/gitlab/etag_caching/store_spec.rb
new file mode 100644
index 00000000000..46195e64715
--- /dev/null
+++ b/spec/lib/gitlab/etag_caching/store_spec.rb
@@ -0,0 +1,84 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::EtagCaching::Store, :clean_gitlab_redis_shared_state do
+ let(:store) { described_class.new }
+
+ describe '#get' do
+ subject { store.get(key) }
+
+ context 'with invalid keys' do
+ let(:key) { 'a' }
+
+ it 'raises errors' do
+ expect(Gitlab::ErrorTracking).to receive(:track_and_raise_for_dev_exception).and_call_original
+
+ expect { subject }.to raise_error Gitlab::EtagCaching::Store::InvalidKeyError
+ end
+
+ it 'does not raise errors in production' do
+ expect(store).to receive(:skip_validation?).and_return true
+ expect(Gitlab::ErrorTracking).not_to receive(:track_and_raise_for_dev_exception)
+
+ subject
+ end
+ end
+
+ context 'with GraphQL keys' do
+ let(:key) { '/api/graphql:pipelines/id/5' }
+
+ it 'returns a stored value' do
+ etag = store.touch(key)
+
+ is_expected.to eq(etag)
+ end
+ end
+
+ context 'with RESTful keys' do
+ let(:key) { '/my-group/my-project/builds/234.json' }
+
+ it 'returns a stored value' do
+ etag = store.touch(key)
+
+ is_expected.to eq(etag)
+ end
+ end
+ end
+
+ describe '#touch' do
+ subject { store.touch(key) }
+
+ context 'with invalid keys' do
+ let(:key) { 'a' }
+
+ it 'raises errors' do
+ expect(Gitlab::ErrorTracking).to receive(:track_and_raise_for_dev_exception).and_call_original
+
+ expect { subject }.to raise_error Gitlab::EtagCaching::Store::InvalidKeyError
+ end
+ end
+
+ context 'with GraphQL keys' do
+ let(:key) { '/api/graphql:pipelines/id/5' }
+
+ it 'stores and returns a value' do
+ etag = store.touch(key)
+
+ expect(etag).to be_present
+ expect(store.get(key)).to eq(etag)
+ end
+ end
+
+ context 'with RESTful keys' do
+ let(:key) { '/my-group/my-project/builds/234.json' }
+
+ it 'stores and returns a value' do
+ etag = store.touch(key)
+
+ expect(etag).to be_present
+ expect(store.get(key)).to eq(etag)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/experimentation/controller_concern_spec.rb b/spec/lib/gitlab/experimentation/controller_concern_spec.rb
index 1cebe37bea5..3678aeb18b0 100644
--- a/spec/lib/gitlab/experimentation/controller_concern_spec.rb
+++ b/spec/lib/gitlab/experimentation/controller_concern_spec.rb
@@ -520,6 +520,78 @@ RSpec.describe Gitlab::Experimentation::ControllerConcern, type: :controller do
end
end
+ describe '#record_experiment_group' do
+ let(:group) { 'a group object' }
+ let(:experiment_key) { :some_experiment_key }
+ let(:dnt_enabled) { false }
+ let(:experiment_active) { true }
+ let(:rollout_strategy) { :whatever }
+ let(:variant) { 'variant' }
+
+ before do
+ allow(controller).to receive(:dnt_enabled?).and_return(dnt_enabled)
+ allow(::Gitlab::Experimentation).to receive(:active?).and_return(experiment_active)
+ allow(::Gitlab::Experimentation).to receive(:rollout_strategy).and_return(rollout_strategy)
+ allow(controller).to receive(:tracking_group).and_return(variant)
+ allow(::Experiment).to receive(:add_group)
+ end
+
+ subject(:record_experiment_group) { controller.record_experiment_group(experiment_key, group) }
+
+ shared_examples 'exits early without recording' do
+ it 'returns early without recording the group as an ExperimentSubject' do
+ expect(::Experiment).not_to receive(:add_group)
+ record_experiment_group
+ end
+ end
+
+ shared_examples 'calls tracking_group' do |using_cookie_rollout|
+ it "calls tracking_group with #{using_cookie_rollout ? 'a nil' : 'the group as the'} subject" do
+ expect(controller).to receive(:tracking_group).with(experiment_key, nil, subject: using_cookie_rollout ? nil : group).and_return(variant)
+ record_experiment_group
+ end
+ end
+
+ shared_examples 'records the group' do
+ it 'records the group' do
+ expect(::Experiment).to receive(:add_group).with(experiment_key, group: group, variant: variant)
+ record_experiment_group
+ end
+ end
+
+ context 'when DNT is enabled' do
+ let(:dnt_enabled) { true }
+
+ include_examples 'exits early without recording'
+ end
+
+ context 'when the experiment is not active' do
+ let(:experiment_active) { false }
+
+ include_examples 'exits early without recording'
+ end
+
+ context 'when a nil group is given' do
+ let(:group) { nil }
+
+ include_examples 'exits early without recording'
+ end
+
+ context 'when the experiment uses a cookie-based rollout strategy' do
+ let(:rollout_strategy) { :cookie }
+
+ include_examples 'calls tracking_group', true
+ include_examples 'records the group'
+ end
+
+ context 'when the experiment uses a non-cookie-based rollout strategy' do
+ let(:rollout_strategy) { :group }
+
+ include_examples 'calls tracking_group', false
+ include_examples 'records the group'
+ end
+ end
+
describe '#record_experiment_conversion_event' do
let(:user) { build(:user) }
@@ -534,7 +606,7 @@ RSpec.describe Gitlab::Experimentation::ControllerConcern, type: :controller do
end
it 'records the conversion event for the experiment & user' do
- expect(::Experiment).to receive(:record_conversion_event).with(:test_experiment, user)
+ expect(::Experiment).to receive(:record_conversion_event).with(:test_experiment, user, {})
record_conversion_event
end
diff --git a/spec/lib/gitlab/experimentation_spec.rb b/spec/lib/gitlab/experimentation_spec.rb
index 7eeae3f3f33..83c6b556fc6 100644
--- a/spec/lib/gitlab/experimentation_spec.rb
+++ b/spec/lib/gitlab/experimentation_spec.rb
@@ -7,14 +7,10 @@ require 'spec_helper'
RSpec.describe Gitlab::Experimentation::EXPERIMENTS do
it 'temporarily ensures we know what experiments exist for backwards compatibility' do
expected_experiment_keys = [
- :ci_notification_dot,
:upgrade_link_in_user_menu_a,
- :invite_members_version_a,
:invite_members_version_b,
:invite_members_empty_group_version_a,
- :contact_sales_btn_in_app,
- :customize_homepage,
- :group_only_trials
+ :contact_sales_btn_in_app
]
backwards_compatible_experiment_keys = described_class.filter { |_, v| v[:use_backwards_compatible_subject_index] }.keys
diff --git a/spec/lib/gitlab/git/push_spec.rb b/spec/lib/gitlab/git/push_spec.rb
index 8ba43b2967c..68cef558f6f 100644
--- a/spec/lib/gitlab/git/push_spec.rb
+++ b/spec/lib/gitlab/git/push_spec.rb
@@ -87,7 +87,7 @@ RSpec.describe Gitlab::Git::Push do
it { is_expected.to be_force_push }
end
- context 'when called muiltiple times' do
+ context 'when called mulitiple times' do
it 'does not make make multiple calls to the force push check' do
expect(Gitlab::Checks::ForcePush).to receive(:force_push?).once
diff --git a/spec/lib/gitlab/github_import/importer/pull_request_merged_by_importer_spec.rb b/spec/lib/gitlab/github_import/importer/pull_request_merged_by_importer_spec.rb
index 2999dc5bb41..e42b6d89c30 100644
--- a/spec/lib/gitlab/github_import/importer/pull_request_merged_by_importer_spec.rb
+++ b/spec/lib/gitlab/github_import/importer/pull_request_merged_by_importer_spec.rb
@@ -5,37 +5,46 @@ require 'spec_helper'
RSpec.describe Gitlab::GithubImport::Importer::PullRequestMergedByImporter, :clean_gitlab_redis_cache do
let_it_be(:merge_request) { create(:merged_merge_request) }
let(:project) { merge_request.project }
- let(:created_at) { Time.new(2017, 1, 1, 12, 00).utc }
+ let(:merged_at) { Time.new(2017, 1, 1, 12, 00).utc }
let(:client_double) { double(user: double(id: 999, login: 'merger', email: 'merger@email.com')) }
let(:pull_request) do
instance_double(
Gitlab::GithubImport::Representation::PullRequest,
iid: merge_request.iid,
- created_at: created_at,
+ merged_at: merged_at,
merged_by: double(id: 999, login: 'merger')
)
end
subject { described_class.new(pull_request, project, client_double) }
- it 'assigns the merged by user when mapped' do
- merge_user = create(:user, email: 'merger@email.com')
+ context 'when the merger user can be mapped' do
+ it 'assigns the merged by user when mapped' do
+ merge_user = create(:user, email: 'merger@email.com')
- subject.execute
+ subject.execute
- expect(merge_request.metrics.reload.merged_by).to eq(merge_user)
+ metrics = merge_request.metrics.reload
+ expect(metrics.merged_by).to eq(merge_user)
+ expect(metrics.merged_at).to eq(merged_at)
+ end
end
- it 'adds a note referencing the merger user when the user cannot be mapped' do
- expect { subject.execute }
- .to change(Note, :count).by(1)
- .and not_change(merge_request, :updated_at)
-
- last_note = merge_request.notes.last
-
- expect(last_note.note).to eq("*Merged by: merger*")
- expect(last_note.created_at).to eq(created_at)
- expect(last_note.author).to eq(project.creator)
+ context 'when the merger user cannot be mapped to a gitlab user' do
+ it 'adds a note referencing the merger user' do
+ expect { subject.execute }
+ .to change(Note, :count).by(1)
+ .and not_change(merge_request, :updated_at)
+
+ metrics = merge_request.metrics.reload
+ expect(metrics.merged_by).to be_nil
+ expect(metrics.merged_at).to eq(merged_at)
+
+ last_note = merge_request.notes.last
+ expect(last_note.note).to eq("*Merged by: merger at 2017-01-01 12:00:00 UTC*")
+ expect(last_note.created_at).to eq(merged_at)
+ expect(last_note.author).to eq(project.creator)
+ end
end
end
diff --git a/spec/lib/gitlab/github_import/importer/pull_request_review_importer_spec.rb b/spec/lib/gitlab/github_import/importer/pull_request_review_importer_spec.rb
index b2f993ac47c..290f3f51202 100644
--- a/spec/lib/gitlab/github_import/importer/pull_request_review_importer_spec.rb
+++ b/spec/lib/gitlab/github_import/importer/pull_request_review_importer_spec.rb
@@ -19,8 +19,10 @@ RSpec.describe Gitlab::GithubImport::Importer::PullRequestReviewImporter, :clean
context 'when the review is "APPROVED"' do
let(:review) { create_review(type: 'APPROVED', note: '') }
- it 'creates a note for the review' do
- expect { subject.execute }.to change(Note, :count)
+ it 'creates a note for the review and approves the Merge Request' do
+ expect { subject.execute }
+ .to change(Note, :count).by(1)
+ .and change(Approval, :count).by(1)
last_note = merge_request.notes.last
expect(last_note.note).to eq('approved this merge request')
@@ -31,6 +33,14 @@ RSpec.describe Gitlab::GithubImport::Importer::PullRequestReviewImporter, :clean
expect(merge_request.approved_by_users.reload).to include(author)
expect(merge_request.approvals.last.created_at).to eq(submitted_at)
end
+
+ it 'does nothing if the user already approved the merge request' do
+ create(:approval, merge_request: merge_request, user: author)
+
+ expect { subject.execute }
+ .to change(Note, :count).by(0)
+ .and change(Approval, :count).by(0)
+ end
end
context 'when the review is "COMMENTED"' do
diff --git a/spec/lib/gitlab/graphql/calls_gitaly/field_extension_spec.rb b/spec/lib/gitlab/graphql/calls_gitaly/field_extension_spec.rb
new file mode 100644
index 00000000000..1d8849f7e38
--- /dev/null
+++ b/spec/lib/gitlab/graphql/calls_gitaly/field_extension_spec.rb
@@ -0,0 +1,87 @@
+# frozen_string_literal: true
+require 'spec_helper'
+
+RSpec.describe Gitlab::Graphql::CallsGitaly::FieldExtension, :request_store do
+ include GraphqlHelpers
+
+ let(:field_args) { {} }
+ let(:owner) { fresh_object_type }
+ let(:field) do
+ ::Types::BaseField.new(name: 'value', type: GraphQL::STRING_TYPE, null: true, owner: owner, **field_args)
+ end
+
+ def resolve_value
+ resolve_field(field, { value: 'foo' }, object_type: owner)
+ end
+
+ context 'when the field calls gitaly' do
+ before do
+ owner.define_method :value do
+ Gitlab::SafeRequestStore['gitaly_call_actual'] = 1
+ 'fresh-from-the-gitaly-mines!'
+ end
+ end
+
+ context 'when the field has a constant complexity' do
+ let(:field_args) { { complexity: 100 } }
+
+ it 'allows the call' do
+ expect { resolve_value }.not_to raise_error
+ end
+ end
+
+ context 'when the field declares that it calls gitaly' do
+ let(:field_args) { { calls_gitaly: true } }
+
+ it 'allows the call' do
+ expect { resolve_value }.not_to raise_error
+ end
+ end
+
+ context 'when the field does not have these arguments' do
+ let(:field_args) { {} }
+
+ it 'notices, and raises, mentioning the field' do
+ expect { resolve_value }.to raise_error(include('Object.value'))
+ end
+ end
+ end
+
+ context 'when it does not call gitaly' do
+ let(:field_args) { {} }
+
+ it 'does not raise' do
+ value = resolve_value
+
+ expect(value).to eq 'foo'
+ end
+ end
+
+ context 'when some field calls gitaly while we were waiting' do
+ let(:extension) { described_class.new(field: field, options: {}) }
+
+ it 'is acceptable if all are accounted for' do
+ object = :anything
+ arguments = :any_args
+
+ ::Gitlab::SafeRequestStore['gitaly_call_actual'] = 3
+ ::Gitlab::SafeRequestStore['graphql_gitaly_accounted_for'] = 0
+
+ expect do |b|
+ extension.resolve(object: object, arguments: arguments, &b)
+ end.to yield_with_args(object, arguments, [3, 0])
+
+ ::Gitlab::SafeRequestStore['gitaly_call_actual'] = 13
+ ::Gitlab::SafeRequestStore['graphql_gitaly_accounted_for'] = 10
+
+ expect { extension.after_resolve(value: 'foo', memo: [3, 0]) }.not_to raise_error
+ end
+
+ it 'is unacceptable if some of the calls are unaccounted for' do
+ ::Gitlab::SafeRequestStore['gitaly_call_actual'] = 10
+ ::Gitlab::SafeRequestStore['graphql_gitaly_accounted_for'] = 9
+
+ expect { extension.after_resolve(value: 'foo', memo: [0, 0]) }.to raise_error(include('Object.value'))
+ end
+ end
+end
diff --git a/spec/lib/gitlab/graphql/calls_gitaly/instrumentation_spec.rb b/spec/lib/gitlab/graphql/calls_gitaly/instrumentation_spec.rb
deleted file mode 100644
index f16767f7d14..00000000000
--- a/spec/lib/gitlab/graphql/calls_gitaly/instrumentation_spec.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-require 'spec_helper'
-
-RSpec.describe Gitlab::Graphql::CallsGitaly::Instrumentation do
- subject { described_class.new }
-
- describe '#calls_gitaly_check' do
- let(:gitaly_field) { Types::BaseField.new(name: 'test', type: GraphQL::STRING_TYPE, null: true, calls_gitaly: true) }
- let(:no_gitaly_field) { Types::BaseField.new(name: 'test', type: GraphQL::STRING_TYPE, null: true, calls_gitaly: false) }
-
- context 'if there are no Gitaly calls' do
- it 'does not raise an error if calls_gitaly is false' do
- expect { subject.send(:calls_gitaly_check, no_gitaly_field, 0) }.not_to raise_error
- end
- end
-
- context 'if there is at least 1 Gitaly call' do
- it 'raises an error if calls_gitaly: is false or not defined' do
- expect { subject.send(:calls_gitaly_check, no_gitaly_field, 1) }.to raise_error(/specify a constant complexity or add `calls_gitaly: true`/)
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/graphql/docs/renderer_spec.rb b/spec/lib/gitlab/graphql/docs/renderer_spec.rb
index 064e0c6828b..b956328e344 100644
--- a/spec/lib/gitlab/graphql/docs/renderer_spec.rb
+++ b/spec/lib/gitlab/graphql/docs/renderer_spec.rb
@@ -5,21 +5,25 @@ require 'spec_helper'
RSpec.describe Gitlab::Graphql::Docs::Renderer do
describe '#contents' do
# Returns a Schema that uses the given `type`
- def mock_schema(type)
+ def mock_schema(type, field_description)
query_type = Class.new(Types::BaseObject) do
- graphql_name 'QueryType'
+ graphql_name 'Query'
- field :foo, type, null: true
+ field :foo, type, null: true do
+ description field_description
+ argument :id, GraphQL::ID_TYPE, required: false, description: 'ID of the object.'
+ end
end
GraphQL::Schema.define(query: query_type)
end
let_it_be(:template) { Rails.root.join('lib/gitlab/graphql/docs/templates/', 'default.md.haml') }
+ let(:field_description) { 'List of objects.' }
subject(:contents) do
described_class.new(
- mock_schema(type).graphql_definition,
+ mock_schema(type, field_description).graphql_definition,
output_dir: nil,
template: template
).contents
@@ -36,7 +40,7 @@ RSpec.describe Gitlab::Graphql::Docs::Renderer do
specify do
expectation = <<~DOC
- ### ArrayTest
+ ### `ArrayTest`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -45,6 +49,34 @@ RSpec.describe Gitlab::Graphql::Docs::Renderer do
is_expected.to include(expectation)
end
+
+ context 'query generation' do
+ let(:expectation) do
+ <<~DOC
+ ### `foo`
+
+ List of objects.
+
+ #### Arguments
+
+ | Name | Type | Description |
+ | ---- | ---- | ----------- |
+ | `id` | ID | ID of the object. |
+ DOC
+ end
+
+ it 'generates the query with arguments' do
+ expect(subject).to include(expectation)
+ end
+
+ context 'when description does not end with `.`' do
+ let(:field_description) { 'List of objects' }
+
+ it 'adds the `.` to the end' do
+ expect(subject).to include(expectation)
+ end
+ end
+ end
end
context 'A type with fields defined in reverse alphabetical order' do
@@ -59,7 +91,7 @@ RSpec.describe Gitlab::Graphql::Docs::Renderer do
specify do
expectation = <<~DOC
- ### OrderingTest
+ ### `OrderingTest`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -82,7 +114,7 @@ RSpec.describe Gitlab::Graphql::Docs::Renderer do
specify do
expectation = <<~DOC
- ### DeprecatedTest
+ ### `DeprecatedTest`
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -111,7 +143,7 @@ RSpec.describe Gitlab::Graphql::Docs::Renderer do
specify do
expectation = <<~DOC
- ### MyEnum
+ ### `MyEnum`
| Value | Description |
| ----- | ----------- |
diff --git a/spec/lib/gitlab/graphql/pagination/keyset/last_items_spec.rb b/spec/lib/gitlab/graphql/pagination/keyset/last_items_spec.rb
index b45bb8b79d9..ec2ec4bf50d 100644
--- a/spec/lib/gitlab/graphql/pagination/keyset/last_items_spec.rb
+++ b/spec/lib/gitlab/graphql/pagination/keyset/last_items_spec.rb
@@ -4,7 +4,7 @@ require 'spec_helper'
RSpec.describe Gitlab::Graphql::Pagination::Keyset::LastItems do
let_it_be(:merge_request) { create(:merge_request) }
- let(:scope) { MergeRequest.order_merged_at_asc.with_order_id_desc }
+ let(:scope) { MergeRequest.order_merged_at_asc }
subject { described_class.take_items(*args) }
diff --git a/spec/lib/gitlab/graphql/pagination/keyset/order_info_spec.rb b/spec/lib/gitlab/graphql/pagination/keyset/order_info_spec.rb
index eb28e6c8c0a..40ee47ece49 100644
--- a/spec/lib/gitlab/graphql/pagination/keyset/order_info_spec.rb
+++ b/spec/lib/gitlab/graphql/pagination/keyset/order_info_spec.rb
@@ -52,18 +52,6 @@ RSpec.describe Gitlab::Graphql::Pagination::Keyset::OrderInfo do
end
end
- context 'when ordering by SIMILARITY' do
- let(:relation) { Project.sorted_by_similarity_desc('test', include_in_select: true) }
-
- it 'assigns the right attribute name, named function, and direction' do
- expect(order_list.count).to eq 2
- expect(order_list.first.attribute_name).to eq 'similarity'
- expect(order_list.first.named_function).to be_kind_of(Arel::Nodes::Addition)
- expect(order_list.first.named_function.to_sql).to include 'SIMILARITY('
- expect(order_list.first.sort_direction).to eq :desc
- end
- end
-
context 'when ordering by CASE', :aggregate_failuers do
let(:relation) { Project.order(Arel::Nodes::Case.new(Project.arel_table[:pending_delete]).when(true).then(100).else(1000).asc) }
diff --git a/spec/lib/gitlab/graphql/pagination/keyset/query_builder_spec.rb b/spec/lib/gitlab/graphql/pagination/keyset/query_builder_spec.rb
index fa631aa5666..31c02fd43e8 100644
--- a/spec/lib/gitlab/graphql/pagination/keyset/query_builder_spec.rb
+++ b/spec/lib/gitlab/graphql/pagination/keyset/query_builder_spec.rb
@@ -131,43 +131,5 @@ RSpec.describe Gitlab::Graphql::Pagination::Keyset::QueryBuilder do
end
end
end
-
- context 'when sorting using SIMILARITY' do
- let(:relation) { Project.sorted_by_similarity_desc('test', include_in_select: true) }
- let(:arel_table) { Project.arel_table }
- let(:decoded_cursor) { { 'similarity' => 0.5, 'id' => 100 } }
- let(:similarity_function_call) { Gitlab::Database::SimilarityScore::SIMILARITY_FUNCTION_CALL_WITH_ANNOTATION }
- let(:similarity_sql) do
- [
- "(#{similarity_function_call}(COALESCE(\"projects\".\"path\", ''), 'test') * CAST('1' AS numeric))",
- "(#{similarity_function_call}(COALESCE(\"projects\".\"name\", ''), 'test') * CAST('0.7' AS numeric))",
- "(#{similarity_function_call}(COALESCE(\"projects\".\"description\", ''), 'test') * CAST('0.2' AS numeric))"
- ].join(' + ')
- end
-
- context 'when no values are nil' do
- context 'when :after' do
- it 'generates the correct condition' do
- conditions = builder.conditions.gsub(/\s+/, ' ')
-
- expect(conditions).to include "(#{similarity_sql} < 0.5)"
- expect(conditions).to include '"projects"."id" < 100'
- expect(conditions).to include "OR (#{similarity_sql} IS NULL)"
- end
- end
-
- context 'when :before' do
- let(:before_or_after) { :before }
-
- it 'generates the correct condition' do
- conditions = builder.conditions.gsub(/\s+/, ' ')
-
- expect(conditions).to include "(#{similarity_sql} > 0.5)"
- expect(conditions).to include '"projects"."id" > 100'
- expect(conditions).to include "OR ( #{similarity_sql} = 0.5"
- end
- end
- end
- end
end
end
diff --git a/spec/lib/gitlab/graphql/present/field_extension_spec.rb b/spec/lib/gitlab/graphql/present/field_extension_spec.rb
new file mode 100644
index 00000000000..5e66e16d655
--- /dev/null
+++ b/spec/lib/gitlab/graphql/present/field_extension_spec.rb
@@ -0,0 +1,143 @@
+# frozen_string_literal: true
+require 'spec_helper'
+
+RSpec.describe Gitlab::Graphql::Present::FieldExtension do
+ include GraphqlHelpers
+
+ let_it_be(:user) { create(:user) }
+
+ let(:object) { double(value: 'foo') }
+ let(:owner) { fresh_object_type }
+ let(:field_name) { 'value' }
+ let(:field) do
+ ::Types::BaseField.new(name: field_name, type: GraphQL::STRING_TYPE, null: true, owner: owner)
+ end
+
+ let(:base_presenter) do
+ Class.new(SimpleDelegator) do
+ def initialize(object, **options)
+ super(object)
+ @object = object
+ @options = options
+ end
+ end
+ end
+
+ def resolve_value
+ resolve_field(field, object, current_user: user, object_type: owner)
+ end
+
+ context 'when the object does not declare a presenter' do
+ it 'does not affect normal resolution' do
+ expect(resolve_value).to eq 'foo'
+ end
+ end
+
+ describe 'interactions with inheritance' do
+ def parent
+ type = fresh_object_type('Parent')
+ type.present_using(provide_foo)
+ type.field :foo, ::GraphQL::INT_TYPE, null: true
+ type.field :value, ::GraphQL::STRING_TYPE, null: true
+ type
+ end
+
+ def child
+ type = Class.new(parent)
+ type.graphql_name 'Child'
+ type.present_using(provide_bar)
+ type.field :bar, ::GraphQL::INT_TYPE, null: true
+ type
+ end
+
+ def provide_foo
+ Class.new(base_presenter) do
+ def foo
+ 100
+ end
+ end
+ end
+
+ def provide_bar
+ Class.new(base_presenter) do
+ def bar
+ 101
+ end
+ end
+ end
+
+ it 'can resolve value, foo and bar' do
+ type = child
+ value = resolve_field(:value, object, object_type: type)
+ foo = resolve_field(:foo, object, object_type: type)
+ bar = resolve_field(:bar, object, object_type: type)
+
+ expect([value, foo, bar]).to eq ['foo', 100, 101]
+ end
+ end
+
+ shared_examples 'calling the presenter method' do
+ it 'calls the presenter method' do
+ expect(resolve_value).to eq presenter.new(object, current_user: user).send(field_name)
+ end
+ end
+
+ context 'when the object declares a presenter' do
+ before do
+ owner.present_using(presenter)
+ end
+
+ context 'when the presenter overrides the original method' do
+ def twice
+ Class.new(base_presenter) do
+ def value
+ @object.value * 2
+ end
+ end
+ end
+
+ let(:presenter) { twice }
+
+ it_behaves_like 'calling the presenter method'
+ end
+
+ # This is exercised here using an explicit `resolve:` proc, but
+ # @resolver_proc values are used in field instrumentation as well.
+ context 'when the field uses a resolve proc' do
+ let(:presenter) { base_presenter }
+ let(:field) do
+ ::Types::BaseField.new(
+ name: field_name,
+ type: GraphQL::STRING_TYPE,
+ null: true,
+ owner: owner,
+ resolve: ->(obj, args, ctx) { 'Hello from a proc' }
+ )
+ end
+
+ specify { expect(resolve_value).to eq 'Hello from a proc' }
+ end
+
+ context 'when the presenter provides a new method' do
+ def presenter
+ Class.new(base_presenter) do
+ def current_username
+ "Hello #{@options[:current_user]&.username} from the presenter!"
+ end
+ end
+ end
+
+ context 'when we select the original field' do
+ it 'is unaffected' do
+ expect(resolve_value).to eq 'foo'
+ end
+ end
+
+ context 'when we select the new field' do
+ let(:field_name) { 'current_username' }
+
+ it_behaves_like 'calling the presenter method'
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/graphql/query_analyzers/logger_analyzer_spec.rb b/spec/lib/gitlab/graphql/query_analyzers/logger_analyzer_spec.rb
index 138765afd8a..8450396284a 100644
--- a/spec/lib/gitlab/graphql/query_analyzers/logger_analyzer_spec.rb
+++ b/spec/lib/gitlab/graphql/query_analyzers/logger_analyzer_spec.rb
@@ -5,42 +5,6 @@ require 'spec_helper'
RSpec.describe Gitlab::Graphql::QueryAnalyzers::LoggerAnalyzer do
subject { described_class.new }
- describe '#analyze?' do
- context 'feature flag disabled' do
- before do
- stub_feature_flags(graphql_logging: false)
- end
-
- it 'disables the analyzer' do
- expect(subject.analyze?(anything)).to be_falsey
- end
- end
-
- context 'feature flag enabled by default' do
- let(:monotonic_time_before) { 42 }
- let(:monotonic_time_after) { 500 }
- let(:monotonic_time_duration) { monotonic_time_after - monotonic_time_before }
-
- it 'enables the analyzer' do
- expect(subject.analyze?(anything)).to be_truthy
- end
-
- it 'returns a duration in seconds' do
- allow(GraphQL::Analysis).to receive(:analyze_query).and_return([4, 2, [[], []]])
- allow(Gitlab::Metrics::System).to receive(:monotonic_time).and_return(monotonic_time_before, monotonic_time_after)
- allow(Gitlab::GraphqlLogger).to receive(:info)
-
- expected_duration = monotonic_time_duration
- memo = subject.initial_value(spy('query'))
-
- subject.final_value(memo)
-
- expect(memo).to have_key(:duration_s)
- expect(memo[:duration_s]).to eq(expected_duration)
- end
- end
- end
-
describe '#initial_value' do
it 'filters out sensitive variables' do
doc = GraphQL.parse <<-GRAPHQL
@@ -58,4 +22,24 @@ RSpec.describe Gitlab::Graphql::QueryAnalyzers::LoggerAnalyzer do
expect(subject.initial_value(query)[:variables]).to eq('{:body=>"[FILTERED]"}')
end
end
+
+ describe '#final_value' do
+ let(:monotonic_time_before) { 42 }
+ let(:monotonic_time_after) { 500 }
+ let(:monotonic_time_duration) { monotonic_time_after - monotonic_time_before }
+
+ it 'returns a duration in seconds' do
+ allow(GraphQL::Analysis).to receive(:analyze_query).and_return([4, 2, [[], []]])
+ allow(Gitlab::Metrics::System).to receive(:monotonic_time).and_return(monotonic_time_before, monotonic_time_after)
+ allow(Gitlab::GraphqlLogger).to receive(:info)
+
+ expected_duration = monotonic_time_duration
+ memo = subject.initial_value(spy('query'))
+
+ subject.final_value(memo)
+
+ expect(memo).to have_key(:duration_s)
+ expect(memo[:duration_s]).to eq(expected_duration)
+ end
+ end
end
diff --git a/spec/lib/gitlab/hook_data/project_member_builder_spec.rb b/spec/lib/gitlab/hook_data/project_member_builder_spec.rb
new file mode 100644
index 00000000000..3fb84223581
--- /dev/null
+++ b/spec/lib/gitlab/hook_data/project_member_builder_spec.rb
@@ -0,0 +1,58 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::HookData::ProjectMemberBuilder do
+ let_it_be(:project) { create(:project, :internal, name: 'gitlab') }
+ let_it_be(:user) { create(:user, name: 'John Doe', username: 'johndoe', email: 'john@example.com') }
+ let_it_be(:project_member) { create(:project_member, :developer, user: user, project: project) }
+
+ describe '#build' do
+ let(:data) { described_class.new(project_member).build(event) }
+ let(:event_name) { data[:event_name] }
+ let(:attributes) do
+ [
+ :event_name, :created_at, :updated_at, :project_name, :project_path, :project_path_with_namespace, :project_id, :user_username, :user_name, :user_email, :user_id, :access_level, :project_visibility
+ ]
+ end
+
+ context 'data' do
+ shared_examples_for 'includes the required attributes' do
+ it 'includes the required attributes' do
+ expect(data).to include(*attributes)
+ expect(data[:project_name]).to eq('gitlab')
+ expect(data[:project_path]).to eq(project.path)
+ expect(data[:project_path_with_namespace]).to eq(project.full_path)
+ expect(data[:project_id]).to eq(project.id)
+ expect(data[:user_username]).to eq('johndoe')
+ expect(data[:user_name]).to eq('John Doe')
+ expect(data[:user_id]).to eq(user.id)
+ expect(data[:user_email]).to eq('john@example.com')
+ expect(data[:access_level]).to eq('Developer')
+ expect(data[:project_visibility]).to eq('internal')
+ end
+ end
+
+ context 'on create' do
+ let(:event) { :create }
+
+ it { expect(event_name).to eq('user_add_to_team') }
+ it_behaves_like 'includes the required attributes'
+ end
+
+ context 'on update' do
+ let(:event) { :update }
+
+ it { expect(event_name).to eq('user_update_for_team') }
+ it_behaves_like 'includes the required attributes'
+ end
+
+ context 'on destroy' do
+ let(:event) { :destroy }
+
+ it { expect(event_name).to eq('user_remove_from_team') }
+ it_behaves_like 'includes the required attributes'
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/http_connection_adapter_spec.rb b/spec/lib/gitlab/http_connection_adapter_spec.rb
index 389bc1a85f4..96e6e485841 100644
--- a/spec/lib/gitlab/http_connection_adapter_spec.rb
+++ b/spec/lib/gitlab/http_connection_adapter_spec.rb
@@ -5,17 +5,32 @@ require 'spec_helper'
RSpec.describe Gitlab::HTTPConnectionAdapter do
include StubRequests
+ let(:uri) { URI('https://example.org') }
+ let(:options) { {} }
+
+ subject(:connection) { described_class.new(uri, options).connection }
+
describe '#connection' do
before do
stub_all_dns('https://example.org', ip_address: '93.184.216.34')
end
- context 'when local requests are not allowed' do
+ context 'when local requests are allowed' do
+ let(:options) { { allow_local_requests: true } }
+
it 'sets up the connection' do
- uri = URI('https://example.org')
+ expect(connection).to be_a(Net::HTTP)
+ expect(connection.address).to eq('93.184.216.34')
+ expect(connection.hostname_override).to eq('example.org')
+ expect(connection.addr_port).to eq('example.org')
+ expect(connection.port).to eq(443)
+ end
+ end
- connection = described_class.new(uri).connection
+ context 'when local requests are not allowed' do
+ let(:options) { { allow_local_requests: false } }
+ it 'sets up the connection' do
expect(connection).to be_a(Net::HTTP)
expect(connection.address).to eq('93.184.216.34')
expect(connection.hostname_override).to eq('example.org')
@@ -23,28 +38,57 @@ RSpec.describe Gitlab::HTTPConnectionAdapter do
expect(connection.port).to eq(443)
end
- it 'raises error when it is a request to local address' do
- uri = URI('http://172.16.0.0/12')
+ context 'when it is a request to local network' do
+ let(:uri) { URI('http://172.16.0.0/12') }
+
+ it 'raises error' do
+ expect { subject }.to raise_error(
+ Gitlab::HTTP::BlockedUrlError,
+ "URL 'http://172.16.0.0/12' is blocked: Requests to the local network are not allowed"
+ )
+ end
+
+ context 'when local request allowed' do
+ let(:options) { { allow_local_requests: true } }
- expect { described_class.new(uri).connection }
- .to raise_error(Gitlab::HTTP::BlockedUrlError,
- "URL 'http://172.16.0.0/12' is blocked: Requests to the local network are not allowed")
+ it 'sets up the connection' do
+ expect(connection).to be_a(Net::HTTP)
+ expect(connection.address).to eq('172.16.0.0')
+ expect(connection.hostname_override).to be(nil)
+ expect(connection.addr_port).to eq('172.16.0.0')
+ expect(connection.port).to eq(80)
+ end
+ end
end
- it 'raises error when it is a request to localhost address' do
- uri = URI('http://127.0.0.1')
+ context 'when it is a request to local address' do
+ let(:uri) { URI('http://127.0.0.1') }
+
+ it 'raises error' do
+ expect { subject }.to raise_error(
+ Gitlab::HTTP::BlockedUrlError,
+ "URL 'http://127.0.0.1' is blocked: Requests to localhost are not allowed"
+ )
+ end
- expect { described_class.new(uri).connection }
- .to raise_error(Gitlab::HTTP::BlockedUrlError,
- "URL 'http://127.0.0.1' is blocked: Requests to localhost are not allowed")
+ context 'when local request allowed' do
+ let(:options) { { allow_local_requests: true } }
+
+ it 'sets up the connection' do
+ expect(connection).to be_a(Net::HTTP)
+ expect(connection.address).to eq('127.0.0.1')
+ expect(connection.hostname_override).to be(nil)
+ expect(connection.addr_port).to eq('127.0.0.1')
+ expect(connection.port).to eq(80)
+ end
+ end
end
context 'when port different from URL scheme is used' do
- it 'sets up the addr_port accordingly' do
- uri = URI('https://example.org:8080')
-
- connection = described_class.new(uri).connection
+ let(:uri) { URI('https://example.org:8080') }
+ it 'sets up the addr_port accordingly' do
+ expect(connection).to be_a(Net::HTTP)
expect(connection.address).to eq('93.184.216.34')
expect(connection.hostname_override).to eq('example.org')
expect(connection.addr_port).to eq('example.org:8080')
@@ -54,13 +98,11 @@ RSpec.describe Gitlab::HTTPConnectionAdapter do
end
context 'when DNS rebinding protection is disabled' do
- it 'sets up the connection' do
+ before do
stub_application_setting(dns_rebinding_protection_enabled: false)
+ end
- uri = URI('https://example.org')
-
- connection = described_class.new(uri).connection
-
+ it 'sets up the connection' do
expect(connection).to be_a(Net::HTTP)
expect(connection.address).to eq('example.org')
expect(connection.hostname_override).to eq(nil)
@@ -70,13 +112,11 @@ RSpec.describe Gitlab::HTTPConnectionAdapter do
end
context 'when http(s) environment variable is set' do
- it 'sets up the connection' do
+ before do
stub_env('https_proxy' => 'https://my.proxy')
+ end
- uri = URI('https://example.org')
-
- connection = described_class.new(uri).connection
-
+ it 'sets up the connection' do
expect(connection).to be_a(Net::HTTP)
expect(connection.address).to eq('example.org')
expect(connection.hostname_override).to eq(nil)
@@ -85,41 +125,128 @@ RSpec.describe Gitlab::HTTPConnectionAdapter do
end
end
- context 'when local requests are allowed' do
- it 'sets up the connection' do
- uri = URI('https://example.org')
+ context 'when proxy settings are configured' do
+ let(:options) do
+ {
+ http_proxyaddr: 'https://proxy.org',
+ http_proxyport: 1557,
+ http_proxyuser: 'user',
+ http_proxypass: 'pass'
+ }
+ end
- connection = described_class.new(uri, allow_local_requests: true).connection
+ before do
+ stub_all_dns('https://proxy.org', ip_address: '166.84.12.54')
+ end
- expect(connection).to be_a(Net::HTTP)
- expect(connection.address).to eq('93.184.216.34')
- expect(connection.hostname_override).to eq('example.org')
- expect(connection.addr_port).to eq('example.org')
- expect(connection.port).to eq(443)
+ it 'sets up the proxy settings' do
+ expect(connection.proxy_address).to eq('https://166.84.12.54')
+ expect(connection.proxy_port).to eq(1557)
+ expect(connection.proxy_user).to eq('user')
+ expect(connection.proxy_pass).to eq('pass')
end
- it 'sets up the connection when it is a local network' do
- uri = URI('http://172.16.0.0/12')
+ context 'when the address has path' do
+ before do
+ options[:http_proxyaddr] = 'https://proxy.org/path'
+ end
- connection = described_class.new(uri, allow_local_requests: true).connection
+ it 'sets up the proxy settings' do
+ expect(connection.proxy_address).to eq('https://166.84.12.54/path')
+ expect(connection.proxy_port).to eq(1557)
+ end
+ end
- expect(connection).to be_a(Net::HTTP)
- expect(connection.address).to eq('172.16.0.0')
- expect(connection.hostname_override).to be(nil)
- expect(connection.addr_port).to eq('172.16.0.0')
- expect(connection.port).to eq(80)
+ context 'when the port is in the address and port' do
+ before do
+ options[:http_proxyaddr] = 'https://proxy.org:1422'
+ end
+
+ it 'sets up the proxy settings' do
+ expect(connection.proxy_address).to eq('https://166.84.12.54')
+ expect(connection.proxy_port).to eq(1557)
+ end
+
+ context 'when the port is only in the address' do
+ before do
+ options[:http_proxyport] = nil
+ end
+
+ it 'sets up the proxy settings' do
+ expect(connection.proxy_address).to eq('https://166.84.12.54')
+ expect(connection.proxy_port).to eq(1422)
+ end
+ end
end
- it 'sets up the connection when it is localhost' do
- uri = URI('http://127.0.0.1')
+ context 'when it is a request to local network' do
+ before do
+ options[:http_proxyaddr] = 'http://172.16.0.0/12'
+ end
+
+ it 'raises error' do
+ expect { subject }.to raise_error(
+ Gitlab::HTTP::BlockedUrlError,
+ "URL 'http://172.16.0.0:1557/12' is blocked: Requests to the local network are not allowed"
+ )
+ end
- connection = described_class.new(uri, allow_local_requests: true).connection
+ context 'when local request allowed' do
+ before do
+ options[:allow_local_requests] = true
+ end
- expect(connection).to be_a(Net::HTTP)
- expect(connection.address).to eq('127.0.0.1')
- expect(connection.hostname_override).to be(nil)
- expect(connection.addr_port).to eq('127.0.0.1')
- expect(connection.port).to eq(80)
+ it 'sets up the connection' do
+ expect(connection.proxy_address).to eq('http://172.16.0.0/12')
+ expect(connection.proxy_port).to eq(1557)
+ end
+ end
+ end
+
+ context 'when it is a request to local address' do
+ before do
+ options[:http_proxyaddr] = 'http://127.0.0.1'
+ end
+
+ it 'raises error' do
+ expect { subject }.to raise_error(
+ Gitlab::HTTP::BlockedUrlError,
+ "URL 'http://127.0.0.1:1557' is blocked: Requests to localhost are not allowed"
+ )
+ end
+
+ context 'when local request allowed' do
+ before do
+ options[:allow_local_requests] = true
+ end
+
+ it 'sets up the connection' do
+ expect(connection.proxy_address).to eq('http://127.0.0.1')
+ expect(connection.proxy_port).to eq(1557)
+ end
+ end
+ end
+
+ context 'when http(s) environment variable is set' do
+ before do
+ stub_env('https_proxy' => 'https://my.proxy')
+ end
+
+ it 'sets up the connection' do
+ expect(connection.proxy_address).to eq('https://proxy.org')
+ expect(connection.proxy_port).to eq(1557)
+ end
+ end
+
+ context 'when DNS rebinding protection is disabled' do
+ before do
+ stub_application_setting(dns_rebinding_protection_enabled: false)
+ end
+
+ it 'sets up the connection' do
+ expect(connection.proxy_address).to eq('https://proxy.org')
+ expect(connection.proxy_port).to eq(1557)
+ end
end
end
end
diff --git a/spec/lib/gitlab/import_export/all_models.yml b/spec/lib/gitlab/import_export/all_models.yml
index d0282e14d5f..37b43066a62 100644
--- a/spec/lib/gitlab/import_export/all_models.yml
+++ b/spec/lib/gitlab/import_export/all_models.yml
@@ -335,6 +335,7 @@ container_repositories:
- project
- name
project:
+- external_approval_rules
- taggings
- base_tags
- tag_taggings
diff --git a/spec/lib/gitlab/import_export/import_export_spec.rb b/spec/lib/gitlab/import_export/import_export_spec.rb
index 62b4717fc96..87757b07572 100644
--- a/spec/lib/gitlab/import_export/import_export_spec.rb
+++ b/spec/lib/gitlab/import_export/import_export_spec.rb
@@ -4,8 +4,8 @@ require 'spec_helper'
RSpec.describe Gitlab::ImportExport do
describe 'export filename' do
- let(:group) { create(:group, :nested) }
- let(:project) { create(:project, :public, path: 'project-path', namespace: group) }
+ let(:group) { build(:group, path: 'child', parent: build(:group, path: 'parent')) }
+ let(:project) { build(:project, :public, path: 'project-path', namespace: group) }
it 'contains the project path' do
expect(described_class.export_filename(exportable: project)).to include(project.path)
diff --git a/spec/lib/gitlab/import_export/project/tree_saver_spec.rb b/spec/lib/gitlab/import_export/project/tree_saver_spec.rb
index ece261e0882..50494433c5d 100644
--- a/spec/lib/gitlab/import_export/project/tree_saver_spec.rb
+++ b/spec/lib/gitlab/import_export/project/tree_saver_spec.rb
@@ -349,14 +349,22 @@ RSpec.describe Gitlab::ImportExport::Project::TreeSaver do
project_tree_saver.save
end
- it 'exports group members as admin' do
- expect(member_emails).to include('group@member.com')
- end
+ context 'when admin mode is enabled', :enable_admin_mode do
+ it 'exports group members as admin' do
+ expect(member_emails).to include('group@member.com')
+ end
- it 'exports group members as project members' do
- member_types = subject.map { |pm| pm['source_type'] }
+ it 'exports group members as project members' do
+ member_types = subject.map { |pm| pm['source_type'] }
+
+ expect(member_types).to all(eq('Project'))
+ end
+ end
- expect(member_types).to all(eq('Project'))
+ context 'when admin mode is disabled' do
+ it 'does not export group members' do
+ expect(member_emails).not_to include('group@member.com')
+ end
end
end
end
diff --git a/spec/lib/gitlab/import_export/safe_model_attributes.yml b/spec/lib/gitlab/import_export/safe_model_attributes.yml
index e301be47d68..b159d0cfc76 100644
--- a/spec/lib/gitlab/import_export/safe_model_attributes.yml
+++ b/spec/lib/gitlab/import_export/safe_model_attributes.yml
@@ -84,6 +84,7 @@ Note:
- discussion_id
- original_discussion_id
- confidential
+- last_edited_at
LabelLink:
- id
- target_type
@@ -500,6 +501,7 @@ ProtectedBranch:
- name
- created_at
- updated_at
+- allow_force_push
- code_owner_approval_required
ProtectedTag:
- id
@@ -584,6 +586,7 @@ ProjectFeature:
- analytics_access_level
- operations_access_level
- security_and_compliance_access_level
+- container_registry_access_level
- created_at
- updated_at
ProtectedBranch::MergeAccessLevel:
diff --git a/spec/lib/gitlab/marker_range_spec.rb b/spec/lib/gitlab/marker_range_spec.rb
new file mode 100644
index 00000000000..5f73d2a5048
--- /dev/null
+++ b/spec/lib/gitlab/marker_range_spec.rb
@@ -0,0 +1,71 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+
+RSpec.describe Gitlab::MarkerRange do
+ subject(:marker_range) { described_class.new(first, last, mode: mode) }
+
+ let(:first) { 1 }
+ let(:last) { 10 }
+ let(:mode) { nil }
+
+ it { is_expected.to eq(first..last) }
+
+ it 'behaves like a Range' do
+ is_expected.to be_kind_of(Range)
+ end
+
+ describe '#mode' do
+ subject { marker_range.mode }
+
+ it { is_expected.to be_nil }
+
+ context 'when mode is provided' do
+ let(:mode) { :deletion }
+
+ it { is_expected.to eq(mode) }
+ end
+ end
+
+ describe '#to_range' do
+ subject { marker_range.to_range }
+
+ it { is_expected.to eq(first..last) }
+
+ context 'when mode is provided' do
+ let(:mode) { :deletion }
+
+ it 'is omitted during transformation' do
+ is_expected.not_to respond_to(:mode)
+ end
+ end
+ end
+
+ describe '.from_range' do
+ subject { described_class.from_range(range) }
+
+ let(:range) { 1..3 }
+
+ it 'converts Range to MarkerRange object' do
+ is_expected.to be_a(described_class)
+ end
+
+ it 'keeps correct range' do
+ is_expected.to eq(range)
+ end
+
+ context 'when range excludes end' do
+ let(:range) { 1...3 }
+
+ it 'keeps correct range' do
+ is_expected.to eq(range)
+ end
+ end
+
+ context 'when range is already a MarkerRange' do
+ let(:range) { marker_range }
+
+ it { is_expected.to be(marker_range) }
+ end
+ end
+end
diff --git a/spec/lib/gitlab/metrics/background_transaction_spec.rb b/spec/lib/gitlab/metrics/background_transaction_spec.rb
new file mode 100644
index 00000000000..b31a2f7549a
--- /dev/null
+++ b/spec/lib/gitlab/metrics/background_transaction_spec.rb
@@ -0,0 +1,67 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Metrics::BackgroundTransaction do
+ let(:transaction) { described_class.new }
+ let(:prometheus_metric) { instance_double(Prometheus::Client::Metric, base_labels: {}) }
+
+ before do
+ allow(described_class).to receive(:prometheus_metric).and_return(prometheus_metric)
+ end
+
+ describe '#run' do
+ it 'yields the supplied block' do
+ expect { |b| transaction.run(&b) }.to yield_control
+ end
+
+ it 'stores the transaction in the current thread' do
+ transaction.run do
+ expect(Thread.current[described_class::BACKGROUND_THREAD_KEY]).to eq(transaction)
+ end
+ end
+
+ it 'removes the transaction from the current thread upon completion' do
+ transaction.run { }
+
+ expect(Thread.current[described_class::BACKGROUND_THREAD_KEY]).to be_nil
+ end
+ end
+
+ describe '#labels' do
+ it 'provides labels with endpoint_id and feature_category' do
+ Labkit::Context.with_context(feature_category: 'projects', caller_id: 'TestWorker') do
+ expect(transaction.labels).to eq({ endpoint_id: 'TestWorker', feature_category: 'projects' })
+ end
+ end
+ end
+
+ RSpec.shared_examples 'metric with labels' do |metric_method|
+ it 'measures with correct labels and value' do
+ value = 1
+ expect(prometheus_metric).to receive(metric_method).with({ endpoint_id: 'TestWorker', feature_category: 'projects' }, value)
+
+ Labkit::Context.with_context(feature_category: 'projects', caller_id: 'TestWorker') do
+ transaction.send(metric_method, :test_metric, value)
+ end
+ end
+ end
+
+ describe '#increment' do
+ let(:prometheus_metric) { instance_double(Prometheus::Client::Counter, :increment, base_labels: {}) }
+
+ it_behaves_like 'metric with labels', :increment
+ end
+
+ describe '#set' do
+ let(:prometheus_metric) { instance_double(Prometheus::Client::Gauge, :set, base_labels: {}) }
+
+ it_behaves_like 'metric with labels', :set
+ end
+
+ describe '#observe' do
+ let(:prometheus_metric) { instance_double(Prometheus::Client::Histogram, :observe, base_labels: {}) }
+
+ it_behaves_like 'metric with labels', :observe
+ end
+end
diff --git a/spec/lib/gitlab/metrics/subscribers/active_record_spec.rb b/spec/lib/gitlab/metrics/subscribers/active_record_spec.rb
index edcd5b31941..dffd37eeb9d 100644
--- a/spec/lib/gitlab/metrics/subscribers/active_record_spec.rb
+++ b/spec/lib/gitlab/metrics/subscribers/active_record_spec.rb
@@ -3,10 +3,12 @@
require 'spec_helper'
RSpec.describe Gitlab::Metrics::Subscribers::ActiveRecord do
+ using RSpec::Parameterized::TableSyntax
+
let(:env) { {} }
- let(:transaction) { Gitlab::Metrics::WebTransaction.new(env) }
- let(:subscriber) { described_class.new }
- let(:payload) { { sql: 'SELECT * FROM users WHERE id = 10' } }
+ let(:subscriber) { described_class.new }
+ let(:connection) { double(:connection) }
+ let(:payload) { { sql: 'SELECT * FROM users WHERE id = 10', connection: connection } }
let(:event) do
double(
@@ -17,82 +19,32 @@ RSpec.describe Gitlab::Metrics::Subscribers::ActiveRecord do
)
end
- describe '#sql' do
- shared_examples 'track query in metrics' do
- before do
- allow(subscriber).to receive(:current_transaction)
- .at_least(:once)
- .and_return(transaction)
- end
-
- it 'increments only db count value' do
- described_class::DB_COUNTERS.each do |counter|
- prometheus_counter = "gitlab_transaction_#{counter}_total".to_sym
- if expected_counters[counter] > 0
- expect(transaction).to receive(:increment).with(prometheus_counter, 1)
- else
- expect(transaction).not_to receive(:increment).with(prometheus_counter, 1)
- end
- end
-
- subscriber.sql(event)
- end
+ # Emulate Marginalia pre-pending comments
+ def sql(query, comments: true)
+ if comments && !%w[BEGIN COMMIT].include?(query)
+ "/*application:web,controller:badges,action:pipeline,correlation_id:01EYN39K9VMJC56Z7808N7RSRH*/ #{query}"
+ else
+ query
end
+ end
- shared_examples 'track query in RequestStore' do
- context 'when RequestStore is enabled' do
- it 'caches db count value', :request_store, :aggregate_failures do
- subscriber.sql(event)
-
- described_class::DB_COUNTERS.each do |counter|
- expect(Gitlab::SafeRequestStore[counter].to_i).to eq expected_counters[counter]
- end
- end
-
- it 'prevents db counters from leaking to the next transaction' do
- 2.times do
- Gitlab::WithRequestStore.with_request_store do
- subscriber.sql(event)
-
- described_class::DB_COUNTERS.each do |counter|
- expect(Gitlab::SafeRequestStore[counter].to_i).to eq expected_counters[counter]
- end
- end
- end
- end
- end
- end
-
- describe 'without a current transaction' do
- it 'does not track any metrics' do
- expect_any_instance_of(Gitlab::Metrics::Transaction)
- .not_to receive(:increment)
-
- subscriber.sql(event)
- end
-
- context 'with read query' do
- let(:expected_counters) do
- {
- db_count: 1,
- db_write_count: 0,
- db_cached_count: 0
- }
- end
-
- it_behaves_like 'track query in RequestStore'
- end
+ shared_examples 'track generic sql events' do
+ where(:name, :sql_query, :record_query, :record_write_query, :record_cached_query) do
+ 'SQL' | 'SELECT * FROM users WHERE id = 10' | true | false | false
+ 'SQL' | 'WITH active_milestones AS (SELECT COUNT(*), state FROM milestones GROUP BY state) SELECT * FROM active_milestones' | true | false | false
+ 'SQL' | 'SELECT * FROM users WHERE id = 10 FOR UPDATE' | true | true | false
+ 'SQL' | 'WITH archived_rows AS (SELECT * FROM users WHERE archived = true) INSERT INTO products_log SELECT * FROM archived_rows' | true | true | false
+ 'SQL' | 'DELETE FROM users where id = 10' | true | true | false
+ 'SQL' | 'INSERT INTO project_ci_cd_settings (project_id) SELECT id FROM projects' | true | true | false
+ 'SQL' | 'UPDATE users SET admin = true WHERE id = 10' | true | true | false
+ 'CACHE' | 'SELECT * FROM users WHERE id = 10' | true | false | true
+ 'SCHEMA' | "SELECT attr.attname FROM pg_attribute attr INNER JOIN pg_constraint cons ON attr.attrelid = cons.conrelid AND attr.attnum = any(cons.conkey) WHERE cons.contype = 'p' AND cons.conrelid = '\"projects\"'::regclass" | false | false | false
+ nil | 'BEGIN' | false | false | false
+ nil | 'COMMIT' | false | false | false
end
- describe 'with a current transaction' do
- it 'observes sql_duration metric' do
- expect(subscriber).to receive(:current_transaction)
- .at_least(:once)
- .and_return(transaction)
- expect(transaction).to receive(:observe).with(:gitlab_sql_duration_seconds, 0.002)
-
- subscriber.sql(event)
- end
+ with_them do
+ let(:payload) { { name: name, sql: sql(sql_query, comments: comments), connection: connection } }
it 'marks the current thread as using the database' do
# since it would already have been toggled by other specs
@@ -101,215 +53,20 @@ RSpec.describe Gitlab::Metrics::Subscribers::ActiveRecord do
expect { subscriber.sql(event) }.to change { Thread.current[:uses_db_connection] }.from(nil).to(true)
end
- context 'with read query' do
- let(:expected_counters) do
- {
- db_count: 1,
- db_write_count: 0,
- db_cached_count: 0
- }
- end
-
- it_behaves_like 'track query in metrics'
- it_behaves_like 'track query in RequestStore'
-
- context 'with only select' do
- let(:payload) { { sql: 'WITH active_milestones AS (SELECT COUNT(*), state FROM milestones GROUP BY state) SELECT * FROM active_milestones' } }
-
- it_behaves_like 'track query in metrics'
- it_behaves_like 'track query in RequestStore'
- end
- end
-
- context 'write query' do
- let(:expected_counters) do
- {
- db_count: 1,
- db_write_count: 1,
- db_cached_count: 0
- }
- end
-
- context 'with select for update sql event' do
- let(:payload) { { sql: 'SELECT * FROM users WHERE id = 10 FOR UPDATE' } }
-
- it_behaves_like 'track query in metrics'
- it_behaves_like 'track query in RequestStore'
- end
-
- context 'with common table expression' do
- context 'with insert' do
- let(:payload) { { sql: 'WITH archived_rows AS (SELECT * FROM users WHERE archived = true) INSERT INTO products_log SELECT * FROM archived_rows' } }
-
- it_behaves_like 'track query in metrics'
- it_behaves_like 'track query in RequestStore'
- end
- end
-
- context 'with delete sql event' do
- let(:payload) { { sql: 'DELETE FROM users where id = 10' } }
-
- it_behaves_like 'track query in metrics'
- it_behaves_like 'track query in RequestStore'
- end
-
- context 'with insert sql event' do
- let(:payload) { { sql: 'INSERT INTO project_ci_cd_settings (project_id) SELECT id FROM projects' } }
-
- it_behaves_like 'track query in metrics'
- it_behaves_like 'track query in RequestStore'
- end
-
- context 'with update sql event' do
- let(:payload) { { sql: 'UPDATE users SET admin = true WHERE id = 10' } }
-
- it_behaves_like 'track query in metrics'
- it_behaves_like 'track query in RequestStore'
- end
- end
-
- context 'with cached query' do
- let(:expected_counters) do
- {
- db_count: 1,
- db_write_count: 0,
- db_cached_count: 1
- }
- end
-
- context 'with cached payload ' do
- let(:payload) do
- {
- sql: 'SELECT * FROM users WHERE id = 10',
- cached: true
- }
- end
-
- it_behaves_like 'track query in metrics'
- it_behaves_like 'track query in RequestStore'
- end
-
- context 'with cached payload name' do
- let(:payload) do
- {
- sql: 'SELECT * FROM users WHERE id = 10',
- name: 'CACHE'
- }
- end
-
- it_behaves_like 'track query in metrics'
- it_behaves_like 'track query in RequestStore'
- end
- end
-
- context 'events are internal to Rails or irrelevant' do
- let(:schema_event) do
- double(
- :event,
- name: 'sql.active_record',
- payload: {
- sql: "SELECT attr.attname FROM pg_attribute attr INNER JOIN pg_constraint cons ON attr.attrelid = cons.conrelid AND attr.attnum = any(cons.conkey) WHERE cons.contype = 'p' AND cons.conrelid = '\"projects\"'::regclass",
- name: 'SCHEMA',
- connection_id: 135,
- statement_name: nil,
- binds: []
- },
- duration: 0.7
- )
- end
-
- let(:begin_event) do
- double(
- :event,
- name: 'sql.active_record',
- payload: {
- sql: "BEGIN",
- name: nil,
- connection_id: 231,
- statement_name: nil,
- binds: []
- },
- duration: 1.1
- )
- end
-
- let(:commit_event) do
- double(
- :event,
- name: 'sql.active_record',
- payload: {
- sql: "COMMIT",
- name: nil,
- connection_id: 212,
- statement_name: nil,
- binds: []
- },
- duration: 1.6
- )
- end
-
- it 'skips schema/begin/commit sql commands' do
- allow(subscriber).to receive(:current_transaction)
- .at_least(:once)
- .and_return(transaction)
-
- expect(transaction).not_to receive(:increment)
-
- subscriber.sql(schema_event)
- subscriber.sql(begin_event)
- subscriber.sql(commit_event)
- end
- end
+ it_behaves_like 'record ActiveRecord metrics'
+ it_behaves_like 'store ActiveRecord info in RequestStore'
end
end
- describe 'self.db_counter_payload' do
- before do
- allow(subscriber).to receive(:current_transaction)
- .at_least(:once)
- .and_return(transaction)
- end
-
- context 'when RequestStore is enabled', :request_store do
- context 'when query is executed' do
- let(:expected_payload) do
- {
- db_count: 1,
- db_cached_count: 0,
- db_write_count: 0
- }
- end
-
- it 'returns correct payload' do
- subscriber.sql(event)
-
- expect(described_class.db_counter_payload).to eq(expected_payload)
- end
- end
+ context 'without Marginalia comments' do
+ let(:comments) { false }
- context 'when query is not executed' do
- let(:expected_payload) do
- {
- db_count: 0,
- db_cached_count: 0,
- db_write_count: 0
- }
- end
-
- it 'returns correct payload' do
- expect(described_class.db_counter_payload).to eq(expected_payload)
- end
- end
- end
-
- context 'when RequestStore is disabled' do
- let(:expected_payload) { {} }
+ it_behaves_like 'track generic sql events'
+ end
- it 'returns empty payload' do
- subscriber.sql(event)
+ context 'with Marginalia comments' do
+ let(:comments) { true }
- expect(described_class.db_counter_payload).to eq(expected_payload)
- end
- end
+ it_behaves_like 'track generic sql events'
end
end
diff --git a/spec/lib/gitlab/optimistic_locking_spec.rb b/spec/lib/gitlab/optimistic_locking_spec.rb
index 0862a9c880e..1d669573b74 100644
--- a/spec/lib/gitlab/optimistic_locking_spec.rb
+++ b/spec/lib/gitlab/optimistic_locking_spec.rb
@@ -5,37 +5,108 @@ require 'spec_helper'
RSpec.describe Gitlab::OptimisticLocking do
let!(:pipeline) { create(:ci_pipeline) }
let!(:pipeline2) { Ci::Pipeline.find(pipeline.id) }
+ let(:histogram) { spy('prometheus metric') }
+
+ before do
+ allow(described_class)
+ .to receive(:retry_lock_histogram)
+ .and_return(histogram)
+ end
describe '#retry_lock' do
- it 'does not reload object if state changes' do
- expect(pipeline).not_to receive(:reset)
- expect(pipeline).to receive(:succeed).and_call_original
+ let(:name) { 'optimistic_locking_spec' }
- described_class.retry_lock(pipeline) do |subject|
- subject.succeed
+ context 'when state changed successfully without retries' do
+ subject do
+ described_class.retry_lock(pipeline, name: name) do |lock_subject|
+ lock_subject.succeed
+ end
end
- end
- it 'retries action if exception is raised' do
- pipeline.succeed
+ it 'does not reload object' do
+ expect(pipeline).not_to receive(:reset)
+ expect(pipeline).to receive(:succeed).and_call_original
+
+ subject
+ end
+
+ it 'does not create log record' do
+ expect(described_class.retry_lock_logger).not_to receive(:info)
+
+ subject
+ end
- expect(pipeline2).to receive(:reset).and_call_original
- expect(pipeline2).to receive(:drop).twice.and_call_original
+ it 'adds number of retries to histogram' do
+ subject
- described_class.retry_lock(pipeline2) do |subject|
- subject.drop
+ expect(histogram).to have_received(:observe).with({}, 0)
end
end
- it 'raises exception when too many retries' do
- expect(pipeline).to receive(:drop).twice.and_call_original
+ context 'when at least one retry happened, the change succeeded' do
+ subject do
+ described_class.retry_lock(pipeline2, name: 'optimistic_locking_spec') do |lock_subject|
+ lock_subject.drop
+ end
+ end
+
+ before do
+ pipeline.succeed
+ end
+
+ it 'completes the action' do
+ expect(pipeline2).to receive(:reset).and_call_original
+ expect(pipeline2).to receive(:drop).twice.and_call_original
+
+ subject
+ end
+
+ it 'creates a single log record' do
+ expect(described_class.retry_lock_logger)
+ .to receive(:info)
+ .once
+ .with(hash_including(:time_s, name: name, retries: 1))
- expect do
- described_class.retry_lock(pipeline, 1) do |subject|
- subject.lock_version = 100
- subject.drop
+ subject
+ end
+
+ it 'adds number of retries to histogram' do
+ subject
+
+ expect(histogram).to have_received(:observe).with({}, 1)
+ end
+ end
+
+ context 'when MAX_RETRIES attempts exceeded' do
+ subject do
+ described_class.retry_lock(pipeline, max_retries, name: name) do |lock_subject|
+ lock_subject.lock_version = 100
+ lock_subject.drop
end
- end.to raise_error(ActiveRecord::StaleObjectError)
+ end
+
+ let(:max_retries) { 2 }
+
+ it 'raises an exception' do
+ expect(pipeline).to receive(:drop).exactly(max_retries + 1).times.and_call_original
+
+ expect { subject }.to raise_error(ActiveRecord::StaleObjectError)
+ end
+
+ it 'creates a single log record' do
+ expect(described_class.retry_lock_logger)
+ .to receive(:info)
+ .once
+ .with(hash_including(:time_s, name: name, retries: max_retries))
+
+ expect { subject }.to raise_error(ActiveRecord::StaleObjectError)
+ end
+
+ it 'adds number of retries to histogram' do
+ expect { subject }.to raise_error(ActiveRecord::StaleObjectError)
+
+ expect(histogram).to have_received(:observe).with({}, max_retries)
+ end
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
new file mode 100644
index 00000000000..6e9e987f90c
--- /dev/null
+++ b/spec/lib/gitlab/pagination/keyset/column_order_definition_spec.rb
@@ -0,0 +1,188 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Pagination::Keyset::ColumnOrderDefinition do
+ let_it_be(:project_name_column) do
+ described_class.new(
+ attribute_name: :name,
+ order_expression: Project.arel_table[:name].asc,
+ nullable: :not_nullable,
+ distinct: true
+ )
+ end
+
+ let_it_be(:project_name_lower_column) do
+ described_class.new(
+ attribute_name: :name,
+ order_expression: Project.arel_table[:name].lower.desc,
+ nullable: :not_nullable,
+ distinct: true
+ )
+ end
+
+ let_it_be(:project_calculated_column_expression) do
+ # COALESCE("projects"."description", 'No Description')
+ Arel::Nodes::NamedFunction.new('COALESCE', [
+ Project.arel_table[:description],
+ Arel.sql("'No Description'")
+ ])
+ end
+
+ let_it_be(:project_calculated_column) do
+ described_class.new(
+ attribute_name: :name,
+ column_expression: project_calculated_column_expression,
+ order_expression: project_calculated_column_expression.asc,
+ nullable: :not_nullable,
+ distinct: true
+ )
+ end
+
+ describe '#order_direction' do
+ context 'inferring order_direction from order_expression' do
+ it { expect(project_name_column).to be_ascending_order }
+ it { expect(project_name_column).not_to be_descending_order }
+
+ it { expect(project_name_lower_column).to be_descending_order }
+ it { expect(project_name_lower_column).not_to be_ascending_order }
+
+ it { expect(project_calculated_column).to be_ascending_order }
+ it { expect(project_calculated_column).not_to be_descending_order }
+
+ it 'raises error when order direction cannot be infered' do
+ expect do
+ described_class.new(
+ attribute_name: :name,
+ column_expression: Project.arel_table[:name],
+ order_expression: 'name asc',
+ reversed_order_expression: 'name desc',
+ nullable: :not_nullable,
+ distinct: true
+ )
+ end.to raise_error(RuntimeError, /Invalid or missing `order_direction`/)
+ end
+
+ it 'does not raise error when order direction is explicitly given' do
+ column_order_definition = described_class.new(
+ attribute_name: :name,
+ column_expression: Project.arel_table[:name],
+ order_expression: 'name asc',
+ reversed_order_expression: 'name desc',
+ order_direction: :asc,
+ nullable: :not_nullable,
+ distinct: true
+ )
+
+ expect(column_order_definition).to be_ascending_order
+ end
+ end
+ end
+
+ describe '#column_expression' do
+ context 'inferring column_expression from order_expression' do
+ it 'infers the correct column expression' do
+ column_order_definition = described_class.new(attribute_name: :name, order_expression: Project.arel_table[:name].asc)
+
+ expect(column_order_definition.column_expression).to eq(Project.arel_table[:name])
+ end
+
+ it 'raises error when raw string is given as order expression' do
+ expect do
+ described_class.new(attribute_name: :name, order_expression: 'name DESC')
+ end.to raise_error(RuntimeError, /Couldn't calculate the column expression. Please pass an ARel node/)
+ end
+ end
+ end
+
+ describe '#reversed_order_expression' do
+ it 'raises error when order cannot be reversed automatically' do
+ expect do
+ described_class.new(
+ attribute_name: :name,
+ column_expression: Project.arel_table[:name],
+ order_expression: 'name asc',
+ order_direction: :asc,
+ nullable: :not_nullable,
+ distinct: true
+ )
+ end.to raise_error(RuntimeError, /Couldn't determine reversed order/)
+ end
+ end
+
+ describe '#reverse' do
+ it { expect(project_name_column.reverse.order_expression).to eq(Project.arel_table[:name].desc) }
+ it { expect(project_name_column.reverse).to be_descending_order }
+
+ it { expect(project_calculated_column.reverse.order_expression).to eq(project_calculated_column_expression.desc) }
+ it { expect(project_calculated_column.reverse).to be_descending_order }
+
+ context 'when reversed_order_expression is given' do
+ it 'uses the given expression' do
+ column_order_definition = described_class.new(
+ attribute_name: :name,
+ column_expression: Project.arel_table[:name],
+ order_expression: 'name asc',
+ reversed_order_expression: 'name desc',
+ order_direction: :asc,
+ nullable: :not_nullable,
+ distinct: true
+ )
+
+ expect(column_order_definition.reverse.order_expression).to eq('name desc')
+ end
+ end
+ end
+
+ describe '#nullable' do
+ context 'when the column is nullable' do
+ let(:nulls_last_order) 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_direction: :desc,
+ nullable: :nulls_last, # null values are always last
+ distinct: false
+ )
+ end
+
+ it 'requires the position of the null values in the result' do
+ expect(nulls_last_order).to be_nulls_last
+ end
+
+ it 'reverses nullable correctly' do
+ expect(nulls_last_order.reverse).to be_nulls_first
+ end
+
+ it 'raises error when invalid nullable value is given' do
+ expect 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_direction: :desc,
+ nullable: true,
+ distinct: false
+ )
+ end.to raise_error(RuntimeError, /Invalid `nullable` is given/)
+ end
+
+ it 'raises error when the column is nullable and distinct' do
+ expect 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_direction: :desc,
+ nullable: :nulls_last,
+ distinct: true
+ )
+ end.to raise_error(RuntimeError, /Invalid column definition/)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/pagination/keyset/order_spec.rb b/spec/lib/gitlab/pagination/keyset/order_spec.rb
new file mode 100644
index 00000000000..665f790ee47
--- /dev/null
+++ b/spec/lib/gitlab/pagination/keyset/order_spec.rb
@@ -0,0 +1,420 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Pagination::Keyset::Order do
+ let(:table) { Arel::Table.new(:my_table) }
+ let(:order) { nil }
+
+ def run_query(query)
+ ActiveRecord::Base.connection.execute(query).to_a
+ end
+
+ def build_query(order:, where_conditions: nil, limit: nil)
+ <<-SQL
+ SELECT id, year, month
+ FROM (#{table_data}) my_table (id, year, month)
+ WHERE #{where_conditions || '1=1'}
+ ORDER BY #{order}
+ LIMIT #{limit || 999};
+ SQL
+ end
+
+ def iterate_and_collect(order:, page_size:, where_conditions: nil)
+ all_items = []
+
+ loop do
+ paginated_items = run_query(build_query(order: order, where_conditions: where_conditions, limit: page_size))
+ break if paginated_items.empty?
+
+ all_items.concat(paginated_items)
+ last_item = paginated_items.last
+ cursor_attributes = order.cursor_attributes_for_node(last_item)
+ where_conditions = order.build_where_values(cursor_attributes).to_sql
+ end
+
+ all_items
+ end
+
+ subject do
+ run_query(build_query(order: order))
+ end
+
+ shared_examples 'order examples' do
+ it { expect(subject).to eq(expected) }
+
+ context 'when paginating forwards' do
+ subject { iterate_and_collect(order: order, page_size: 2) }
+
+ it { expect(subject).to eq(expected) }
+
+ context 'with different page size' do
+ subject { iterate_and_collect(order: order, page_size: 5) }
+
+ it { expect(subject).to eq(expected) }
+ end
+ end
+
+ context 'when paginating backwards' do
+ subject do
+ last_item = expected.last
+ cursor_attributes = order.cursor_attributes_for_node(last_item)
+ where_conditions = order.reversed_order.build_where_values(cursor_attributes)
+
+ iterate_and_collect(order: order.reversed_order, page_size: 2, where_conditions: where_conditions.to_sql)
+ end
+
+ it do
+ expect(subject).to eq(expected.reverse[1..-1]) # removing one item because we used it to calculate cursor data for the "last" page in subject
+ end
+ end
+ end
+
+ context 'when ordering by a distinct column' do
+ let(:table_data) do
+ <<-SQL
+ VALUES (1, 0, 0),
+ (2, 0, 0),
+ (3, 0, 0),
+ (4, 0, 0),
+ (5, 0, 0),
+ (6, 0, 0),
+ (7, 0, 0),
+ (8, 0, 0),
+ (9, 0, 0)
+ SQL
+ end
+
+ let(:order) do
+ Gitlab::Pagination::Keyset::Order.build([
+ Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: 'id',
+ column_expression: table['id'],
+ order_expression: table['id'].desc,
+ nullable: :not_nullable,
+ distinct: true
+ )
+ ])
+ end
+
+ let(:expected) do
+ [
+ { "id" => 9, "year" => 0, "month" => 0 },
+ { "id" => 8, "year" => 0, "month" => 0 },
+ { "id" => 7, "year" => 0, "month" => 0 },
+ { "id" => 6, "year" => 0, "month" => 0 },
+ { "id" => 5, "year" => 0, "month" => 0 },
+ { "id" => 4, "year" => 0, "month" => 0 },
+ { "id" => 3, "year" => 0, "month" => 0 },
+ { "id" => 2, "year" => 0, "month" => 0 },
+ { "id" => 1, "year" => 0, "month" => 0 }
+ ]
+ end
+
+ it_behaves_like 'order examples'
+ end
+
+ context 'when ordering by two non-nullable columns and a distinct column' do
+ let(:table_data) do
+ <<-SQL
+ VALUES (1, 2010, 2),
+ (2, 2011, 1),
+ (3, 2009, 2),
+ (4, 2011, 1),
+ (5, 2011, 1),
+ (6, 2009, 2),
+ (7, 2010, 3),
+ (8, 2012, 4),
+ (9, 2013, 5)
+ SQL
+ end
+
+ let(:order) do
+ Gitlab::Pagination::Keyset::Order.build([
+ Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: 'year',
+ column_expression: table['year'],
+ order_expression: table['year'].asc,
+ nullable: :not_nullable,
+ distinct: false
+ ),
+ Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: 'month',
+ column_expression: table['month'],
+ order_expression: table['month'].asc,
+ nullable: :not_nullable,
+ distinct: false
+ ),
+ Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: 'id',
+ column_expression: table['id'],
+ order_expression: table['id'].asc,
+ nullable: :not_nullable,
+ distinct: true
+ )
+ ])
+ end
+
+ let(:expected) do
+ [
+ { 'year' => 2009, 'month' => 2, 'id' => 3 },
+ { 'year' => 2009, 'month' => 2, 'id' => 6 },
+ { 'year' => 2010, 'month' => 2, 'id' => 1 },
+ { 'year' => 2010, 'month' => 3, 'id' => 7 },
+ { 'year' => 2011, 'month' => 1, 'id' => 2 },
+ { 'year' => 2011, 'month' => 1, 'id' => 4 },
+ { 'year' => 2011, 'month' => 1, 'id' => 5 },
+ { 'year' => 2012, 'month' => 4, 'id' => 8 },
+ { 'year' => 2013, 'month' => 5, 'id' => 9 }
+ ]
+ end
+
+ it_behaves_like 'order examples'
+ end
+
+ context 'when ordering by nullable columns and a distinct column' do
+ let(:table_data) do
+ <<-SQL
+ VALUES (1, 2010, null),
+ (2, 2011, 2),
+ (3, null, null),
+ (4, null, 5),
+ (5, 2010, null),
+ (6, 2011, 2),
+ (7, 2010, 2),
+ (8, 2012, 2),
+ (9, null, 2),
+ (10, null, null),
+ (11, 2010, 2)
+ SQL
+ end
+
+ let(:order) do
+ Gitlab::Pagination::Keyset::Order.build([
+ 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_direction: :asc,
+ nullable: :nulls_last,
+ distinct: false
+ ),
+ 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_direction: :asc,
+ nullable: :nulls_last,
+ distinct: false
+ ),
+ Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: 'id',
+ column_expression: table['id'],
+ order_expression: table['id'].asc,
+ nullable: :not_nullable,
+ distinct: true
+ )
+ ])
+ end
+
+ let(:expected) do
+ [
+ { "id" => 7, "year" => 2010, "month" => 2 },
+ { "id" => 11, "year" => 2010, "month" => 2 },
+ { "id" => 1, "year" => 2010, "month" => nil },
+ { "id" => 5, "year" => 2010, "month" => nil },
+ { "id" => 2, "year" => 2011, "month" => 2 },
+ { "id" => 6, "year" => 2011, "month" => 2 },
+ { "id" => 8, "year" => 2012, "month" => 2 },
+ { "id" => 9, "year" => nil, "month" => 2 },
+ { "id" => 4, "year" => nil, "month" => 5 },
+ { "id" => 3, "year" => nil, "month" => nil },
+ { "id" => 10, "year" => nil, "month" => nil }
+ ]
+ end
+
+ it_behaves_like 'order examples'
+ end
+
+ context 'when ordering by nullable columns with nulls first ordering and a distinct column' do
+ let(:table_data) do
+ <<-SQL
+ VALUES (1, 2010, null),
+ (2, 2011, 2),
+ (3, null, null),
+ (4, null, 5),
+ (5, 2010, null),
+ (6, 2011, 2),
+ (7, 2010, 2),
+ (8, 2012, 2),
+ (9, null, 2),
+ (10, null, null),
+ (11, 2010, 2)
+ SQL
+ end
+
+ let(:order) do
+ Gitlab::Pagination::Keyset::Order.build([
+ 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_direction: :asc,
+ nullable: :nulls_first,
+ distinct: false
+ ),
+ Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: 'month',
+ column_expression: table['month'],
+ order_expression: Gitlab::Database.nulls_first_order('month', :asc),
+ order_direction: :asc,
+ reversed_order_expression: Gitlab::Database.nulls_last_order('month', :desc),
+ nullable: :nulls_first,
+ distinct: false
+ ),
+ Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: 'id',
+ column_expression: table['id'],
+ order_expression: table['id'].asc,
+ nullable: :not_nullable,
+ distinct: true
+ )
+ ])
+ end
+
+ let(:expected) do
+ [
+ { "id" => 3, "year" => nil, "month" => nil },
+ { "id" => 10, "year" => nil, "month" => nil },
+ { "id" => 9, "year" => nil, "month" => 2 },
+ { "id" => 4, "year" => nil, "month" => 5 },
+ { "id" => 1, "year" => 2010, "month" => nil },
+ { "id" => 5, "year" => 2010, "month" => nil },
+ { "id" => 7, "year" => 2010, "month" => 2 },
+ { "id" => 11, "year" => 2010, "month" => 2 },
+ { "id" => 2, "year" => 2011, "month" => 2 },
+ { "id" => 6, "year" => 2011, "month" => 2 },
+ { "id" => 8, "year" => 2012, "month" => 2 }
+ ]
+ end
+
+ it_behaves_like 'order examples'
+ end
+
+ context 'when ordering by non-nullable columns with mixed directions and a distinct column' do
+ let(:table_data) do
+ <<-SQL
+ VALUES (1, 2010, 0),
+ (2, 2011, 0),
+ (3, 2010, 0),
+ (4, 2010, 0),
+ (5, 2012, 0),
+ (6, 2012, 0),
+ (7, 2010, 0),
+ (8, 2011, 0),
+ (9, 2013, 0),
+ (10, 2014, 0),
+ (11, 2013, 0)
+ SQL
+ end
+
+ let(:order) do
+ Gitlab::Pagination::Keyset::Order.build([
+ Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: 'year',
+ column_expression: table['year'],
+ order_expression: table['year'].asc,
+ 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(:expected) do
+ [
+ { "id" => 7, "year" => 2010, "month" => 0 },
+ { "id" => 4, "year" => 2010, "month" => 0 },
+ { "id" => 3, "year" => 2010, "month" => 0 },
+ { "id" => 1, "year" => 2010, "month" => 0 },
+ { "id" => 8, "year" => 2011, "month" => 0 },
+ { "id" => 2, "year" => 2011, "month" => 0 },
+ { "id" => 6, "year" => 2012, "month" => 0 },
+ { "id" => 5, "year" => 2012, "month" => 0 },
+ { "id" => 11, "year" => 2013, "month" => 0 },
+ { "id" => 9, "year" => 2013, "month" => 0 },
+ { "id" => 10, "year" => 2014, "month" => 0 }
+ ]
+ end
+
+ it 'takes out a slice between two cursors' do
+ after_cursor = { "id" => 8, "year" => 2011 }
+ before_cursor = { "id" => 5, "year" => 2012 }
+
+ after_conditions = order.build_where_values(after_cursor)
+ reversed = order.reversed_order
+ before_conditions = reversed.build_where_values(before_cursor)
+
+ query = build_query(order: order, where_conditions: "(#{after_conditions.to_sql}) AND (#{before_conditions.to_sql})", limit: 100)
+
+ expect(run_query(query)).to eq([
+ { "id" => 2, "year" => 2011, "month" => 0 },
+ { "id" => 6, "year" => 2012, "month" => 0 }
+ ])
+ end
+ end
+
+ context 'when the passed cursor values do not match with the order definition' do
+ let(:order) do
+ Gitlab::Pagination::Keyset::Order.build([
+ Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: 'year',
+ column_expression: table['year'],
+ order_expression: table['year'].asc,
+ 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
+
+ context 'when values are missing' do
+ it 'raises error' do
+ expect { order.build_where_values(id: 1) }.to raise_error(/Missing items: year/)
+ end
+ end
+
+ context 'when extra values are present' do
+ it 'raises error' do
+ expect { order.build_where_values(id: 1, year: 2, foo: 3) }.to raise_error(/Extra items: foo/)
+ end
+ end
+
+ context 'when values are missing and extra values are present' do
+ it 'raises error' do
+ expect { order.build_where_values(year: 2, foo: 3) }.to raise_error(/Extra items: foo\. Missing items: id/)
+ end
+ end
+
+ context 'when no values are passed' do
+ it 'returns nil' do
+ expect(order.build_where_values({})).to eq(nil)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/query_limiting/active_support_subscriber_spec.rb b/spec/lib/gitlab/query_limiting/active_support_subscriber_spec.rb
index a8dd482c7b8..1ab8e22d6d1 100644
--- a/spec/lib/gitlab/query_limiting/active_support_subscriber_spec.rb
+++ b/spec/lib/gitlab/query_limiting/active_support_subscriber_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe Gitlab::QueryLimiting::ActiveSupportSubscriber do
- let(:transaction) { instance_double(Gitlab::QueryLimiting::Transaction, increment: true) }
+ let(:transaction) { instance_double(Gitlab::QueryLimiting::Transaction, executed_sql: true, increment: true) }
before do
allow(Gitlab::QueryLimiting::Transaction)
@@ -18,6 +18,11 @@ RSpec.describe Gitlab::QueryLimiting::ActiveSupportSubscriber do
expect(transaction)
.to have_received(:increment)
.once
+
+ expect(transaction)
+ .to have_received(:executed_sql)
+ .once
+ .with(String)
end
context 'when the query is actually a rails cache hit' do
@@ -30,6 +35,11 @@ RSpec.describe Gitlab::QueryLimiting::ActiveSupportSubscriber do
expect(transaction)
.to have_received(:increment)
.once
+
+ expect(transaction)
+ .to have_received(:executed_sql)
+ .once
+ .with(String)
end
end
end
diff --git a/spec/lib/gitlab/query_limiting/transaction_spec.rb b/spec/lib/gitlab/query_limiting/transaction_spec.rb
index 331c3c1d8b0..40804736b86 100644
--- a/spec/lib/gitlab/query_limiting/transaction_spec.rb
+++ b/spec/lib/gitlab/query_limiting/transaction_spec.rb
@@ -118,6 +118,30 @@ RSpec.describe Gitlab::QueryLimiting::Transaction do
)
end
+ it 'includes a list of executed queries' do
+ transaction = described_class.new
+ transaction.count = max = described_class::THRESHOLD
+ %w[foo bar baz].each { |sql| transaction.executed_sql(sql) }
+
+ message = transaction.error_message
+
+ expect(message).to start_with(
+ "Too many SQL queries were executed: a maximum of #{max} " \
+ "is allowed but #{max} SQL queries were executed"
+ )
+
+ expect(message).to include("0: foo", "1: bar", "2: baz")
+ end
+
+ it 'indicates if the log is truncated' do
+ transaction = described_class.new
+ transaction.count = described_class::THRESHOLD * 2
+
+ message = transaction.error_message
+
+ expect(message).to end_with('...')
+ end
+
it 'includes the action name in the error message when present' do
transaction = described_class.new
transaction.count = max = described_class::THRESHOLD
diff --git a/spec/lib/gitlab/query_limiting_spec.rb b/spec/lib/gitlab/query_limiting_spec.rb
index 0fcd865567d..4f70c65adca 100644
--- a/spec/lib/gitlab/query_limiting_spec.rb
+++ b/spec/lib/gitlab/query_limiting_spec.rb
@@ -63,6 +63,20 @@ RSpec.describe Gitlab::QueryLimiting do
expect(transaction.count).to eq(before)
end
+
+ it 'whitelists when enabled' do
+ described_class.whitelist('https://example.com')
+
+ expect(transaction.whitelisted).to eq(true)
+ end
+
+ it 'does not whitelist when disabled' do
+ allow(described_class).to receive(:enable?).and_return(false)
+
+ described_class.whitelist('https://example.com')
+
+ expect(transaction.whitelisted).to eq(false)
+ end
end
end
end
diff --git a/spec/lib/gitlab/regex_spec.rb b/spec/lib/gitlab/regex_spec.rb
index 776ca81a338..1aca3dae41b 100644
--- a/spec/lib/gitlab/regex_spec.rb
+++ b/spec/lib/gitlab/regex_spec.rb
@@ -367,6 +367,35 @@ RSpec.describe Gitlab::Regex do
it { is_expected.not_to match('%2e%2e%2f1.2.3') }
end
+ describe '.npm_package_name_regex' do
+ subject { described_class.npm_package_name_regex }
+
+ it { is_expected.to match('@scope/package') }
+ it { is_expected.to match('unscoped-package') }
+ it { is_expected.not_to match('@first-scope@second-scope/package') }
+ it { is_expected.not_to match('scope-without-at-symbol/package') }
+ it { is_expected.not_to match('@not-a-scoped-package') }
+ it { is_expected.not_to match('@scope/sub/package') }
+ it { is_expected.not_to match('@scope/../../package') }
+ it { is_expected.not_to match('@scope%2e%2e%2fpackage') }
+ it { is_expected.not_to match('@%2e%2e%2f/package') }
+
+ context 'capturing group' do
+ [
+ ['@scope/package', 'scope'],
+ ['unscoped-package', nil],
+ ['@not-a-scoped-package', nil],
+ ['@scope/sub/package', nil],
+ ['@inv@lid-scope/package', nil]
+ ].each do |package_name, extracted_scope_name|
+ it "extracts the scope name for #{package_name}" do
+ match = package_name.match(described_class.npm_package_name_regex)
+ expect(match&.captures&.first).to eq(extracted_scope_name)
+ end
+ end
+ end
+ end
+
describe '.nuget_version_regex' do
subject { described_class.nuget_version_regex }
diff --git a/spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb b/spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb
index e58e41d3e4f..71f4f2a3b64 100644
--- a/spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb
+++ b/spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb
@@ -2,6 +2,7 @@
require 'spec_helper'
+# rubocop: disable RSpec/MultipleMemoizedHelpers
RSpec.describe Gitlab::SidekiqMiddleware::ServerMetrics do
context "with worker attribution" do
subject { described_class.new }
@@ -112,6 +113,14 @@ RSpec.describe Gitlab::SidekiqMiddleware::ServerMetrics do
expect { |b| subject.call(worker, job, :test, &b) }.to yield_control.once
end
+ it 'calls BackgroundTransaction' do
+ expect_next_instance_of(Gitlab::Metrics::BackgroundTransaction) do |instance|
+ expect(instance).to receive(:run)
+ end
+
+ subject.call(worker, job, :test) {}
+ end
+
it 'sets queue specific metrics' do
expect(running_jobs_metric).to receive(:increment).with(labels, -1)
expect(running_jobs_metric).to receive(:increment).with(labels, 1)
@@ -287,3 +296,4 @@ RSpec.describe Gitlab::SidekiqMiddleware::ServerMetrics do
end
end
end
+# rubocop: enable RSpec/MultipleMemoizedHelpers
diff --git a/spec/lib/gitlab/sidekiq_middleware/size_limiter/client_spec.rb b/spec/lib/gitlab/sidekiq_middleware/size_limiter/client_spec.rb
new file mode 100644
index 00000000000..df8e47d60f0
--- /dev/null
+++ b/spec/lib/gitlab/sidekiq_middleware/size_limiter/client_spec.rb
@@ -0,0 +1,99 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::SidekiqMiddleware::SizeLimiter::Client, :clean_gitlab_redis_queues do
+ let(:worker_class) do
+ Class.new do
+ def self.name
+ "TestSizeLimiterWorker"
+ end
+
+ include ApplicationWorker
+
+ def perform(*args); end
+ end
+ end
+
+ before do
+ stub_const("TestSizeLimiterWorker", worker_class)
+ end
+
+ describe '#call' do
+ context 'when the validator rejects the job' do
+ before do
+ allow(Gitlab::SidekiqMiddleware::SizeLimiter::Validator).to receive(:validate!).and_raise(
+ Gitlab::SidekiqMiddleware::SizeLimiter::ExceedLimitError.new(
+ TestSizeLimiterWorker, 500, 300
+ )
+ )
+ end
+
+ it 'raises an exception when scheduling job with #perform_at' do
+ expect do
+ TestSizeLimiterWorker.perform_at(30.seconds.from_now, 1, 2, 3)
+ end.to raise_error Gitlab::SidekiqMiddleware::SizeLimiter::ExceedLimitError
+ end
+
+ it 'raises an exception when scheduling job with #perform_async' do
+ expect do
+ TestSizeLimiterWorker.perform_async(1, 2, 3)
+ end.to raise_error Gitlab::SidekiqMiddleware::SizeLimiter::ExceedLimitError
+ end
+
+ it 'raises an exception when scheduling job with #perform_in' do
+ expect do
+ TestSizeLimiterWorker.perform_in(3.seconds, 1, 2, 3)
+ end.to raise_error Gitlab::SidekiqMiddleware::SizeLimiter::ExceedLimitError
+ end
+ end
+
+ context 'when the validator validates the job suscessfully' do
+ before do
+ # Do nothing
+ allow(Gitlab::SidekiqMiddleware::SizeLimiter::Client).to receive(:validate!)
+ end
+
+ it 'raises an exception when scheduling job with #perform_at' do
+ expect do
+ TestSizeLimiterWorker.perform_at(30.seconds.from_now, 1, 2, 3)
+ end.not_to raise_error
+
+ expect(TestSizeLimiterWorker.jobs).to contain_exactly(
+ a_hash_including(
+ "class" => "TestSizeLimiterWorker",
+ "args" => [1, 2, 3],
+ "at" => be_a(Float)
+ )
+ )
+ end
+
+ it 'raises an exception when scheduling job with #perform_async' do
+ expect do
+ TestSizeLimiterWorker.perform_async(1, 2, 3)
+ end.not_to raise_error
+
+ expect(TestSizeLimiterWorker.jobs).to contain_exactly(
+ a_hash_including(
+ "class" => "TestSizeLimiterWorker",
+ "args" => [1, 2, 3]
+ )
+ )
+ end
+
+ it 'raises an exception when scheduling job with #perform_in' do
+ expect do
+ TestSizeLimiterWorker.perform_in(3.seconds, 1, 2, 3)
+ end.not_to raise_error
+
+ expect(TestSizeLimiterWorker.jobs).to contain_exactly(
+ a_hash_including(
+ "class" => "TestSizeLimiterWorker",
+ "args" => [1, 2, 3],
+ "at" => be_a(Float)
+ )
+ )
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/sidekiq_middleware/size_limiter/exceed_limit_error_spec.rb b/spec/lib/gitlab/sidekiq_middleware/size_limiter/exceed_limit_error_spec.rb
new file mode 100644
index 00000000000..75b1d9fd87e
--- /dev/null
+++ b/spec/lib/gitlab/sidekiq_middleware/size_limiter/exceed_limit_error_spec.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::SidekiqMiddleware::SizeLimiter::ExceedLimitError do
+ let(:worker_class) do
+ Class.new do
+ def self.name
+ "TestSizeLimiterWorker"
+ end
+
+ include ApplicationWorker
+
+ def perform(*args); end
+ end
+ end
+
+ before do
+ stub_const("TestSizeLimiterWorker", worker_class)
+ end
+
+ it 'encapsulates worker info' do
+ exception = described_class.new(TestSizeLimiterWorker, 500, 300)
+
+ expect(exception.message).to eql("TestSizeLimiterWorker job exceeds payload size limit (500/300)")
+ expect(exception.worker_class).to eql(TestSizeLimiterWorker)
+ expect(exception.size).to be(500)
+ expect(exception.size_limit).to be(300)
+ expect(exception.sentry_extra_data).to eql(
+ worker_class: 'TestSizeLimiterWorker',
+ size: 500,
+ size_limit: 300
+ )
+ end
+end
diff --git a/spec/lib/gitlab/sidekiq_middleware/size_limiter/validator_spec.rb b/spec/lib/gitlab/sidekiq_middleware/size_limiter/validator_spec.rb
new file mode 100644
index 00000000000..3140686c908
--- /dev/null
+++ b/spec/lib/gitlab/sidekiq_middleware/size_limiter/validator_spec.rb
@@ -0,0 +1,253 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::SidekiqMiddleware::SizeLimiter::Validator do
+ let(:worker_class) do
+ Class.new do
+ def self.name
+ "TestSizeLimiterWorker"
+ end
+
+ include ApplicationWorker
+
+ def perform(*args); end
+ end
+ end
+
+ before do
+ stub_const("TestSizeLimiterWorker", worker_class)
+ end
+
+ describe '#initialize' do
+ context 'when the input mode is valid' do
+ it 'does not log a warning message' do
+ expect(::Sidekiq.logger).not_to receive(:warn)
+
+ described_class.new(TestSizeLimiterWorker, {}, mode: 'track')
+ described_class.new(TestSizeLimiterWorker, {}, mode: 'raise')
+ end
+ end
+
+ context 'when the input mode is invalid' do
+ it 'defaults to track mode and logs a warning message' do
+ expect(::Sidekiq.logger).to receive(:warn).with('Invalid Sidekiq size limiter mode: invalid. Fallback to track mode.')
+
+ validator = described_class.new(TestSizeLimiterWorker, {}, mode: 'invalid')
+
+ expect(validator.mode).to eql('track')
+ end
+ end
+
+ context 'when the input mode is empty' do
+ it 'defaults to track mode' do
+ expect(::Sidekiq.logger).not_to receive(:warn)
+
+ validator = described_class.new(TestSizeLimiterWorker, {})
+
+ expect(validator.mode).to eql('track')
+ end
+ end
+
+ context 'when the size input is valid' do
+ it 'does not log a warning message' do
+ expect(::Sidekiq.logger).not_to receive(:warn)
+
+ described_class.new(TestSizeLimiterWorker, {}, size_limit: 300)
+ described_class.new(TestSizeLimiterWorker, {}, size_limit: 0)
+ end
+ end
+
+ context 'when the size input is invalid' do
+ it 'defaults to 0 and logs a warning message' do
+ expect(::Sidekiq.logger).to receive(:warn).with('Invalid Sidekiq size limiter limit: -1')
+
+ described_class.new(TestSizeLimiterWorker, {}, size_limit: -1)
+ end
+ end
+
+ context 'when the size input is empty' do
+ it 'defaults to 0' do
+ expect(::Sidekiq.logger).not_to receive(:warn)
+
+ validator = described_class.new(TestSizeLimiterWorker, {})
+
+ expect(validator.size_limit).to be(0)
+ end
+ end
+ end
+
+ shared_examples 'validate limit job payload size' do
+ context 'in track mode' do
+ let(:mode) { 'track' }
+
+ context 'when size limit negative' do
+ let(:size_limit) { -1 }
+
+ it 'does not track jobs' do
+ expect(Gitlab::ErrorTracking).not_to receive(:track_exception)
+
+ validate.call(TestSizeLimiterWorker, { a: 'a' * 300 })
+ end
+
+ it 'does not raise exception' do
+ expect { validate.call(TestSizeLimiterWorker, { a: 'a' * 300 }) }.not_to raise_error
+ end
+ end
+
+ context 'when size limit is 0' do
+ let(:size_limit) { 0 }
+
+ it 'does not track jobs' do
+ expect(Gitlab::ErrorTracking).not_to receive(:track_exception)
+
+ validate.call(TestSizeLimiterWorker, { a: 'a' * 300 })
+ end
+
+ it 'does not raise exception' do
+ expect { validate.call(TestSizeLimiterWorker, { a: 'a' * 300 }) }.not_to raise_error
+ end
+ end
+
+ context 'when job size is bigger than size limit' do
+ let(:size_limit) { 50 }
+
+ it 'tracks job' do
+ expect(Gitlab::ErrorTracking).to receive(:track_exception).with(
+ be_a(Gitlab::SidekiqMiddleware::SizeLimiter::ExceedLimitError)
+ )
+
+ validate.call(TestSizeLimiterWorker, { a: 'a' * 100 })
+ end
+
+ it 'does not raise an exception' do
+ expect { validate.call(TestSizeLimiterWorker, { a: 'a' * 300 }) }.not_to raise_error
+ end
+
+ context 'when the worker has big_payload attribute' do
+ before do
+ worker_class.big_payload!
+ end
+
+ it 'does not track jobs' do
+ expect(Gitlab::ErrorTracking).not_to receive(:track_exception)
+
+ validate.call(TestSizeLimiterWorker, { a: 'a' * 300 })
+ validate.call('TestSizeLimiterWorker', { a: 'a' * 300 })
+ end
+
+ it 'does not raise an exception' do
+ expect { validate.call(TestSizeLimiterWorker, { a: 'a' * 300 }) }.not_to raise_error
+ expect { validate.call('TestSizeLimiterWorker', { a: 'a' * 300 }) }.not_to raise_error
+ end
+ end
+ end
+
+ context 'when job size is less than size limit' do
+ let(:size_limit) { 50 }
+
+ it 'does not track job' do
+ expect(Gitlab::ErrorTracking).not_to receive(:track_exception)
+
+ validate.call(TestSizeLimiterWorker, { a: 'a' })
+ end
+
+ it 'does not raise an exception' do
+ expect { validate.call(TestSizeLimiterWorker, { a: 'a' }) }.not_to raise_error
+ end
+ end
+ end
+
+ context 'in raise mode' do
+ let(:mode) { 'raise' }
+
+ context 'when size limit is negative' do
+ let(:size_limit) { -1 }
+
+ it 'does not raise exception' do
+ expect { validate.call(TestSizeLimiterWorker, { a: 'a' * 300 }) }.not_to raise_error
+ end
+ end
+
+ context 'when size limit is 0' do
+ let(:size_limit) { 0 }
+
+ it 'does not raise exception' do
+ expect { validate.call(TestSizeLimiterWorker, { a: 'a' * 300 }) }.not_to raise_error
+ end
+ end
+
+ context 'when job size is bigger than size limit' do
+ let(:size_limit) { 50 }
+
+ it 'raises an exception' do
+ expect do
+ validate.call(TestSizeLimiterWorker, { a: 'a' * 300 })
+ end.to raise_error(
+ Gitlab::SidekiqMiddleware::SizeLimiter::ExceedLimitError,
+ /TestSizeLimiterWorker job exceeds payload size limit/i
+ )
+ end
+
+ context 'when the worker has big_payload attribute' do
+ before do
+ worker_class.big_payload!
+ end
+
+ it 'does not raise an exception' do
+ expect { validate.call(TestSizeLimiterWorker, { a: 'a' * 300 }) }.not_to raise_error
+ expect { validate.call('TestSizeLimiterWorker', { a: 'a' * 300 }) }.not_to raise_error
+ end
+ end
+ end
+
+ context 'when job size is less than size limit' do
+ let(:size_limit) { 50 }
+
+ it 'does not raise an exception' do
+ expect { validate.call(TestSizeLimiterWorker, { a: 'a' }) }.not_to raise_error
+ end
+ end
+ end
+ end
+
+ describe '#validate!' do
+ context 'when calling SizeLimiter.validate!' do
+ let(:validate) { ->(worker_clas, job) { described_class.validate!(worker_class, job) } }
+
+ before do
+ stub_env('GITLAB_SIDEKIQ_SIZE_LIMITER_MODE', mode)
+ stub_env('GITLAB_SIDEKIQ_SIZE_LIMITER_LIMIT_BYTES', size_limit)
+ end
+
+ it_behaves_like 'validate limit job payload size'
+ end
+
+ context 'when creating an instance with the related ENV variables' do
+ let(:validate) do
+ ->(worker_clas, job) do
+ validator = described_class.new(worker_class, job, mode: mode, size_limit: size_limit)
+ validator.validate!
+ end
+ end
+
+ before do
+ stub_env('GITLAB_SIDEKIQ_SIZE_LIMITER_MODE', mode)
+ stub_env('GITLAB_SIDEKIQ_SIZE_LIMITER_LIMIT_BYTES', size_limit)
+ end
+
+ it_behaves_like 'validate limit job payload size'
+ end
+
+ context 'when creating an instance with mode and size limit' do
+ let(:validate) do
+ ->(worker_clas, job) do
+ validator = described_class.new(worker_class, job, mode: mode, size_limit: size_limit)
+ validator.validate!
+ end
+ end
+
+ it_behaves_like 'validate limit job payload size'
+ end
+ end
+end
diff --git a/spec/lib/gitlab/sidekiq_middleware_spec.rb b/spec/lib/gitlab/sidekiq_middleware_spec.rb
index b632fc8bad2..755f6004e52 100644
--- a/spec/lib/gitlab/sidekiq_middleware_spec.rb
+++ b/spec/lib/gitlab/sidekiq_middleware_spec.rb
@@ -177,6 +177,7 @@ RSpec.describe Gitlab::SidekiqMiddleware do
::Gitlab::SidekiqMiddleware::DuplicateJobs::Client,
::Gitlab::SidekiqStatus::ClientMiddleware,
::Gitlab::SidekiqMiddleware::AdminMode::Client,
+ ::Gitlab::SidekiqMiddleware::SizeLimiter::Client,
::Gitlab::SidekiqMiddleware::ClientMetrics
]
end
diff --git a/spec/lib/gitlab/string_range_marker_spec.rb b/spec/lib/gitlab/string_range_marker_spec.rb
index 52fab6e3109..6f63c8e2df4 100644
--- a/spec/lib/gitlab/string_range_marker_spec.rb
+++ b/spec/lib/gitlab/string_range_marker_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe Gitlab::StringRangeMarker do
raw = 'abc <def>'
inline_diffs = [2..5]
- described_class.new(raw, rich).mark(inline_diffs) do |text, left:, right:|
+ described_class.new(raw, rich).mark(inline_diffs) do |text, left:, right:, mode:|
"LEFT#{text}RIGHT".html_safe
end
end
diff --git a/spec/lib/gitlab/string_regex_marker_spec.rb b/spec/lib/gitlab/string_regex_marker_spec.rb
index 2dadd222820..a02be83558c 100644
--- a/spec/lib/gitlab/string_regex_marker_spec.rb
+++ b/spec/lib/gitlab/string_regex_marker_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe Gitlab::StringRegexMarker do
let(:rich) { %{<span class="key">"name"</span><span class="punctuation">: </span><span class="value">"AFNetworking"</span>}.html_safe }
subject do
- described_class.new(raw, rich).mark(/"[^"]+":\s*"(?<name>[^"]+)"/, group: :name) do |text, left:, right:|
+ described_class.new(raw, rich).mark(/"[^"]+":\s*"(?<name>[^"]+)"/, group: :name) do |text, left:, right:, mode:|
%{<a href="#">#{text}</a>}.html_safe
end
end
@@ -25,7 +25,7 @@ RSpec.describe Gitlab::StringRegexMarker do
let(:rich) { %{a &lt;b&gt; &lt;c&gt; d}.html_safe }
subject do
- described_class.new(raw, rich).mark(/<[a-z]>/) do |text, left:, right:|
+ described_class.new(raw, rich).mark(/<[a-z]>/) do |text, left:, right:, mode:|
%{<strong>#{text}</strong>}.html_safe
end
end
diff --git a/spec/lib/gitlab/tracking/standard_context_spec.rb b/spec/lib/gitlab/tracking/standard_context_spec.rb
index 7a0a4f0cc46..561edbd38f8 100644
--- a/spec/lib/gitlab/tracking/standard_context_spec.rb
+++ b/spec/lib/gitlab/tracking/standard_context_spec.rb
@@ -22,7 +22,7 @@ RSpec.describe Gitlab::Tracking::StandardContext do
context 'staging' do
before do
- allow(Gitlab).to receive(:staging?).and_return(true)
+ stub_config_setting(url: 'https://staging.gitlab.com')
end
include_examples 'contains environment', 'staging'
@@ -30,11 +30,27 @@ RSpec.describe Gitlab::Tracking::StandardContext do
context 'production' do
before do
- allow(Gitlab).to receive(:com_and_canary?).and_return(true)
+ stub_config_setting(url: 'https://gitlab.com')
end
include_examples 'contains environment', 'production'
end
+
+ context 'org' do
+ before do
+ stub_config_setting(url: 'https://dev.gitlab.org')
+ end
+
+ include_examples 'contains environment', 'org'
+ end
+
+ context 'other self-managed instance' do
+ before do
+ stub_rails_env('production')
+ end
+
+ include_examples 'contains environment', 'self-managed'
+ end
end
it 'contains source' do
diff --git a/spec/lib/gitlab/tree_summary_spec.rb b/spec/lib/gitlab/tree_summary_spec.rb
index d2c5844b0fa..661ef507a82 100644
--- a/spec/lib/gitlab/tree_summary_spec.rb
+++ b/spec/lib/gitlab/tree_summary_spec.rb
@@ -57,14 +57,12 @@ RSpec.describe Gitlab::TreeSummary do
context 'with caching', :use_clean_rails_memory_store_caching do
subject { Rails.cache.fetch(key) }
- before do
- summarized
- end
-
context 'Repository tree cache' do
let(:key) { ['projects', project.id, 'content', commit.id, path] }
it 'creates a cache for repository content' do
+ summarized
+
is_expected.to eq([{ file_name: 'a.txt', type: :blob }])
end
end
@@ -72,11 +70,34 @@ RSpec.describe Gitlab::TreeSummary do
context 'Commits list cache' do
let(:offset) { 0 }
let(:limit) { 25 }
- let(:key) { ['projects', project.id, 'last_commits_list', commit.id, path, offset, limit] }
+ let(:key) { ['projects', project.id, 'last_commits', commit.id, path, offset, limit] }
it 'creates a cache for commits list' do
+ summarized
+
is_expected.to eq('a.txt' => commit.to_hash)
end
+
+ context 'when commit has a very long message' do
+ before do
+ repo.create_file(
+ project.creator,
+ 'long.txt',
+ '',
+ message: message,
+ branch_name: project.default_branch_or_master
+ )
+ end
+
+ let(:message) { 'a' * 1025 }
+ let(:expected_message) { message[0...1021] + '...' }
+
+ it 'truncates commit message to 1 kilobyte' do
+ summarized
+
+ is_expected.to include('long.txt' => a_hash_including(message: expected_message))
+ end
+ end
end
end
end
diff --git a/spec/lib/gitlab/url_blocker_spec.rb b/spec/lib/gitlab/url_blocker_spec.rb
index fa01d4e48df..e076815c4f6 100644
--- a/spec/lib/gitlab/url_blocker_spec.rb
+++ b/spec/lib/gitlab/url_blocker_spec.rb
@@ -166,7 +166,7 @@ RSpec.describe Gitlab::UrlBlocker, :stub_invalid_dns_only do
let(:ports) { Project::VALID_IMPORT_PORTS }
it 'allows imports from configured web host and port' do
- import_url = "http://#{Gitlab.config.gitlab.host}:#{Gitlab.config.gitlab.port}/t.git"
+ import_url = "http://#{Gitlab.host_with_port}/t.git"
expect(described_class.blocked_url?(import_url)).to be false
end
@@ -190,7 +190,7 @@ RSpec.describe Gitlab::UrlBlocker, :stub_invalid_dns_only do
end
it 'returns true for bad protocol on configured web/SSH host and ports' do
- web_url = "javascript://#{Gitlab.config.gitlab.host}:#{Gitlab.config.gitlab.port}/t.git%0aalert(1)"
+ web_url = "javascript://#{Gitlab.host_with_port}/t.git%0aalert(1)"
expect(described_class.blocked_url?(web_url)).to be true
ssh_url = "javascript://#{Gitlab.config.gitlab_shell.ssh_host}:#{Gitlab.config.gitlab_shell.ssh_port}/t.git%0aalert(1)"
diff --git a/spec/lib/gitlab/usage/docs/renderer_spec.rb b/spec/lib/gitlab/usage/docs/renderer_spec.rb
index 0677aa2d9d7..f3b83a4a4b3 100644
--- a/spec/lib/gitlab/usage/docs/renderer_spec.rb
+++ b/spec/lib/gitlab/usage/docs/renderer_spec.rb
@@ -2,19 +2,21 @@
require 'spec_helper'
+CODE_REGEX = %r{<code>(.*)</code>}.freeze
+
RSpec.describe Gitlab::Usage::Docs::Renderer do
describe 'contents' do
let(:dictionary_path) { Gitlab::Usage::Docs::Renderer::DICTIONARY_PATH }
- let(:items) { Gitlab::Usage::MetricDefinition.definitions }
+ let(:items) { Gitlab::Usage::MetricDefinition.definitions.first(10).to_h }
it 'generates dictionary for given items' do
generated_dictionary = described_class.new(items).contents
+
generated_dictionary_keys = RDoc::Markdown
.parse(generated_dictionary)
.table_of_contents
- .select { |metric_doc| metric_doc.level == 2 && !metric_doc.text.start_with?('info:') }
- .map(&:text)
- .map { |text| text.sub('<code>', '').sub('</code>', '') }
+ .select { |metric_doc| metric_doc.level == 3 }
+ .map { |item| item.text.match(CODE_REGEX)&.captures&.first }
expect(generated_dictionary_keys).to match_array(items.keys)
end
diff --git a/spec/lib/gitlab/usage/docs/value_formatter_spec.rb b/spec/lib/gitlab/usage/docs/value_formatter_spec.rb
index 7002c76a7cf..f21656df894 100644
--- a/spec/lib/gitlab/usage/docs/value_formatter_spec.rb
+++ b/spec/lib/gitlab/usage/docs/value_formatter_spec.rb
@@ -10,11 +10,11 @@ RSpec.describe Gitlab::Usage::Docs::ValueFormatter do
:data_source | 'redis' | 'Redis'
:data_source | 'ruby' | 'Ruby'
:introduced_by_url | 'http://test.com' | '[Introduced by](http://test.com)'
- :tier | %w(gold premium) | 'gold, premium'
- :distribution | %w(ce ee) | 'ce, ee'
+ :tier | %w(gold premium) | ' `gold`, `premium`'
+ :distribution | %w(ce ee) | ' `ce`, `ee`'
:key_path | 'key.path' | '**`key.path`**'
:milestone | '13.4' | '13.4'
- :status | 'data_available' | 'data_available'
+ :status | 'data_available' | '`data_available`'
end
with_them do
diff --git a/spec/lib/gitlab/usage/metrics/aggregates/aggregate_spec.rb b/spec/lib/gitlab/usage/metrics/aggregates/aggregate_spec.rb
index 5469ded18f9..7d8e3056384 100644
--- a/spec/lib/gitlab/usage/metrics/aggregates/aggregate_spec.rb
+++ b/spec/lib/gitlab/usage/metrics/aggregates/aggregate_spec.rb
@@ -9,10 +9,50 @@ RSpec.describe Gitlab::Usage::Metrics::Aggregates::Aggregate, :clean_gitlab_redi
let(:entity4) { '8b9a2671-2abf-4bec-a682-22f6a8f7bf31' }
let(:end_date) { Date.current }
let(:sources) { Gitlab::Usage::Metrics::Aggregates::Sources }
+ let(:namespace) { described_class.to_s.deconstantize.constantize }
let_it_be(:recorded_at) { Time.current.to_i }
+ def aggregated_metric(name:, time_frame:, source: "redis", events: %w[event1 event2 event3], operator: "OR", feature_flag: nil)
+ {
+ name: name,
+ source: source,
+ events: events,
+ operator: operator,
+ time_frame: time_frame,
+ feature_flag: feature_flag
+ }.compact.with_indifferent_access
+ end
+
context 'aggregated_metrics_data' do
+ shared_examples 'db sourced aggregated metrics without database_sourced_aggregated_metrics feature' do
+ before do
+ allow_next_instance_of(described_class) do |instance|
+ allow(instance).to receive(:aggregated_metrics).and_return(aggregated_metrics)
+ end
+ end
+
+ context 'with disabled database_sourced_aggregated_metrics feature flag' do
+ before do
+ stub_feature_flags(database_sourced_aggregated_metrics: false)
+ end
+
+ let(:aggregated_metrics) do
+ [
+ aggregated_metric(name: "gmau_2", source: "database", time_frame: time_frame)
+ ]
+ end
+
+ it 'skips database sourced metrics', :aggregate_failures do
+ results = {}
+ params = { start_date: start_date, end_date: end_date, recorded_at: recorded_at }
+
+ expect(sources::PostgresHll).not_to receive(:calculate_metrics_union).with(params.merge(metric_names: %w[event1 event2 event3]))
+ expect(aggregated_metrics_data).to eq(results)
+ end
+ end
+ end
+
shared_examples 'aggregated_metrics_data' do
context 'no aggregated metric is defined' do
it 'returns empty hash' do
@@ -31,37 +71,13 @@ RSpec.describe Gitlab::Usage::Metrics::Aggregates::Aggregate, :clean_gitlab_redi
end
end
- context 'with disabled database_sourced_aggregated_metrics feature flag' do
- before do
- stub_feature_flags(database_sourced_aggregated_metrics: false)
- end
-
- let(:aggregated_metrics) do
- [
- { name: 'gmau_1', source: 'redis', events: %w[event3 event5], operator: "OR" },
- { name: 'gmau_2', source: 'database', events: %w[event1 event2 event3], operator: "OR" }
- ].map(&:with_indifferent_access)
- end
-
- it 'skips database sourced metrics', :aggregate_failures do
- results = {
- 'gmau_1' => 5
- }
-
- params = { start_date: start_date, end_date: end_date, recorded_at: recorded_at }
-
- expect(sources::RedisHll).to receive(:calculate_metrics_union).with(params.merge(metric_names: %w[event3 event5])).and_return(5)
- expect(sources::PostgresHll).not_to receive(:calculate_metrics_union).with(params.merge(metric_names: %w[event1 event2 event3]))
- expect(aggregated_metrics_data).to eq(results)
- end
- end
-
context 'with AND operator' do
let(:aggregated_metrics) do
+ params = { source: datasource, operator: "AND", time_frame: time_frame }
[
- { name: 'gmau_1', source: 'redis', events: %w[event3 event5], operator: "AND" },
- { name: 'gmau_2', source: 'database', events: %w[event1 event2 event3], operator: "AND" }
- ].map(&:with_indifferent_access)
+ aggregated_metric(**params.merge(name: "gmau_1", events: %w[event3 event5])),
+ aggregated_metric(**params.merge(name: "gmau_2"))
+ ]
end
it 'returns the number of unique events recorded for every metric in aggregate', :aggregate_failures do
@@ -73,30 +89,30 @@ RSpec.describe Gitlab::Usage::Metrics::Aggregates::Aggregate, :clean_gitlab_redi
# gmau_1 data is as follow
# |A| => 4
- expect(sources::RedisHll).to receive(:calculate_metrics_union).with(params.merge(metric_names: 'event3')).and_return(4)
+ expect(namespace::SOURCES[datasource]).to receive(:calculate_metrics_union).with(params.merge(metric_names: 'event3')).and_return(4)
# |B| => 6
- expect(sources::RedisHll).to receive(:calculate_metrics_union).with(params.merge(metric_names: 'event5')).and_return(6)
+ expect(namespace::SOURCES[datasource]).to receive(:calculate_metrics_union).with(params.merge(metric_names: 'event5')).and_return(6)
# |A + B| => 8
- expect(sources::RedisHll).to receive(:calculate_metrics_union).with(params.merge(metric_names: %w[event3 event5])).and_return(8)
+ expect(namespace::SOURCES[datasource]).to receive(:calculate_metrics_union).with(params.merge(metric_names: %w[event3 event5])).and_return(8)
# Exclusion inclusion principle formula to calculate intersection of 2 sets
# |A & B| = (|A| + |B|) - |A + B| => (4 + 6) - 8 => 2
# gmau_2 data is as follow:
# |A| => 2
- expect(sources::PostgresHll).to receive(:calculate_metrics_union).with(params.merge(metric_names: 'event1')).and_return(2)
+ expect(namespace::SOURCES[datasource]).to receive(:calculate_metrics_union).with(params.merge(metric_names: 'event1')).and_return(2)
# |B| => 3
- expect(sources::PostgresHll).to receive(:calculate_metrics_union).with(params.merge(metric_names: 'event2')).and_return(3)
+ expect(namespace::SOURCES[datasource]).to receive(:calculate_metrics_union).with(params.merge(metric_names: 'event2')).and_return(3)
# |C| => 5
- expect(sources::PostgresHll).to receive(:calculate_metrics_union).with(params.merge(metric_names: 'event3')).and_return(5)
+ expect(namespace::SOURCES[datasource]).to receive(:calculate_metrics_union).with(params.merge(metric_names: 'event3')).and_return(5)
# |A + B| => 4 therefore |A & B| = (|A| + |B|) - |A + B| => 2 + 3 - 4 => 1
- expect(sources::PostgresHll).to receive(:calculate_metrics_union).with(params.merge(metric_names: %w[event1 event2])).and_return(4)
+ expect(namespace::SOURCES[datasource]).to receive(:calculate_metrics_union).with(params.merge(metric_names: %w[event1 event2])).and_return(4)
# |A + C| => 6 therefore |A & C| = (|A| + |C|) - |A + C| => 2 + 5 - 6 => 1
- expect(sources::PostgresHll).to receive(:calculate_metrics_union).with(params.merge(metric_names: %w[event1 event3])).and_return(6)
+ expect(namespace::SOURCES[datasource]).to receive(:calculate_metrics_union).with(params.merge(metric_names: %w[event1 event3])).and_return(6)
# |B + C| => 7 therefore |B & C| = (|B| + |C|) - |B + C| => 3 + 5 - 7 => 1
- expect(sources::PostgresHll).to receive(:calculate_metrics_union).with(params.merge(metric_names: %w[event2 event3])).and_return(7)
+ expect(namespace::SOURCES[datasource]).to receive(:calculate_metrics_union).with(params.merge(metric_names: %w[event2 event3])).and_return(7)
# |A + B + C| => 8
- expect(sources::PostgresHll).to receive(:calculate_metrics_union).with(params.merge(metric_names: %w[event1 event2 event3])).and_return(8)
+ expect(namespace::SOURCES[datasource]).to receive(:calculate_metrics_union).with(params.merge(metric_names: %w[event1 event2 event3])).and_return(8)
# Exclusion inclusion principle formula to calculate intersection of 3 sets
# |A & B & C| = (|A & B| + |A & C| + |B & C|) - (|A| + |B| + |C|) + |A + B + C|
# (1 + 1 + 1) - (2 + 3 + 5) + 8 => 1
@@ -108,20 +124,17 @@ RSpec.describe Gitlab::Usage::Metrics::Aggregates::Aggregate, :clean_gitlab_redi
context 'with OR operator' do
let(:aggregated_metrics) do
[
- { name: 'gmau_1', source: 'redis', events: %w[event3 event5], operator: "OR" },
- { name: 'gmau_2', source: 'database', events: %w[event1 event2 event3], operator: "OR" }
- ].map(&:with_indifferent_access)
+ aggregated_metric(name: "gmau_1", source: datasource, time_frame: time_frame, operator: "OR")
+ ]
end
it 'returns the number of unique events occurred for any metric in aggregate', :aggregate_failures do
results = {
- 'gmau_1' => 5,
- 'gmau_2' => 3
+ 'gmau_1' => 5
}
params = { start_date: start_date, end_date: end_date, recorded_at: recorded_at }
- expect(sources::RedisHll).to receive(:calculate_metrics_union).with(params.merge(metric_names: %w[event3 event5])).and_return(5)
- expect(sources::PostgresHll).to receive(:calculate_metrics_union).with(params.merge(metric_names: %w[event1 event2 event3])).and_return(3)
+ expect(namespace::SOURCES[datasource]).to receive(:calculate_metrics_union).with(params.merge(metric_names: %w[event1 event2 event3])).and_return(5)
expect(aggregated_metrics_data).to eq(results)
end
end
@@ -130,21 +143,22 @@ RSpec.describe Gitlab::Usage::Metrics::Aggregates::Aggregate, :clean_gitlab_redi
let(:enabled_feature_flag) { 'test_ff_enabled' }
let(:disabled_feature_flag) { 'test_ff_disabled' }
let(:aggregated_metrics) do
+ params = { source: datasource, time_frame: time_frame }
[
# represents stable aggregated metrics that has been fully released
- { name: 'gmau_without_ff', source: 'redis', events: %w[event3_slot event5_slot], operator: "OR" },
+ aggregated_metric(**params.merge(name: "gmau_without_ff")),
# represents new aggregated metric that is under performance testing on gitlab.com
- { name: 'gmau_enabled', source: 'redis', events: %w[event4], operator: "OR", feature_flag: enabled_feature_flag },
+ aggregated_metric(**params.merge(name: "gmau_enabled", feature_flag: enabled_feature_flag)),
# represents aggregated metric that is under development and shouldn't be yet collected even on gitlab.com
- { name: 'gmau_disabled', source: 'redis', events: %w[event4], operator: "OR", feature_flag: disabled_feature_flag }
- ].map(&:with_indifferent_access)
+ aggregated_metric(**params.merge(name: "gmau_disabled", feature_flag: disabled_feature_flag))
+ ]
end
it 'does not calculate data for aggregates with ff turned off' do
skip_feature_flags_yaml_validation
skip_default_enabled_yaml_check
stub_feature_flags(enabled_feature_flag => true, disabled_feature_flag => false)
- allow(sources::RedisHll).to receive(:calculate_metrics_union).and_return(6)
+ allow(namespace::SOURCES[datasource]).to receive(:calculate_metrics_union).and_return(6)
expect(aggregated_metrics_data).to eq('gmau_without_ff' => 6, 'gmau_enabled' => 6)
end
@@ -156,31 +170,29 @@ RSpec.describe Gitlab::Usage::Metrics::Aggregates::Aggregate, :clean_gitlab_redi
it 'raises error when unknown aggregation operator is used' do
allow_next_instance_of(described_class) do |instance|
allow(instance).to receive(:aggregated_metrics)
- .and_return([{ name: 'gmau_1', source: 'redis', events: %w[event1_slot], operator: "SUM" }])
+ .and_return([aggregated_metric(name: 'gmau_1', source: datasource, operator: "SUM", time_frame: time_frame)])
end
- expect { aggregated_metrics_data }.to raise_error Gitlab::Usage::Metrics::Aggregates::UnknownAggregationOperator
+ expect { aggregated_metrics_data }.to raise_error namespace::UnknownAggregationOperator
end
it 'raises error when unknown aggregation source is used' do
allow_next_instance_of(described_class) do |instance|
allow(instance).to receive(:aggregated_metrics)
- .and_return([{ name: 'gmau_1', source: 'whoami', events: %w[event1_slot], operator: "AND" }])
+ .and_return([aggregated_metric(name: 'gmau_1', source: 'whoami', time_frame: time_frame)])
end
- expect { aggregated_metrics_data }.to raise_error Gitlab::Usage::Metrics::Aggregates::UnknownAggregationSource
+ expect { aggregated_metrics_data }.to raise_error namespace::UnknownAggregationSource
end
- it 're raises Gitlab::UsageDataCounters::HLLRedisCounter::EventError' do
- error = Gitlab::UsageDataCounters::HLLRedisCounter::EventError
- allow(Gitlab::UsageDataCounters::HLLRedisCounter).to receive(:calculate_events_union).and_raise(error)
-
+ it 'raises error when union is missing' do
allow_next_instance_of(described_class) do |instance|
allow(instance).to receive(:aggregated_metrics)
- .and_return([{ name: 'gmau_1', source: 'redis', events: %w[event1_slot], operator: "OR" }])
+ .and_return([aggregated_metric(name: 'gmau_1', source: datasource, time_frame: time_frame)])
end
+ allow(namespace::SOURCES[datasource]).to receive(:calculate_metrics_union).and_raise(sources::UnionNotAvailable)
- expect { aggregated_metrics_data }.to raise_error error
+ expect { aggregated_metrics_data }.to raise_error sources::UnionNotAvailable
end
end
@@ -192,7 +204,7 @@ RSpec.describe Gitlab::Usage::Metrics::Aggregates::Aggregate, :clean_gitlab_redi
it 'rescues unknown aggregation operator error' do
allow_next_instance_of(described_class) do |instance|
allow(instance).to receive(:aggregated_metrics)
- .and_return([{ name: 'gmau_1', source: 'redis', events: %w[event1_slot], operator: "SUM" }])
+ .and_return([aggregated_metric(name: 'gmau_1', source: datasource, operator: "SUM", time_frame: time_frame)])
end
expect(aggregated_metrics_data).to eq('gmau_1' => -1)
@@ -201,20 +213,91 @@ RSpec.describe Gitlab::Usage::Metrics::Aggregates::Aggregate, :clean_gitlab_redi
it 'rescues unknown aggregation source error' do
allow_next_instance_of(described_class) do |instance|
allow(instance).to receive(:aggregated_metrics)
- .and_return([{ name: 'gmau_1', source: 'whoami', events: %w[event1_slot], operator: "AND" }])
+ .and_return([aggregated_metric(name: 'gmau_1', source: 'whoami', time_frame: time_frame)])
end
expect(aggregated_metrics_data).to eq('gmau_1' => -1)
end
- it 'rescues Gitlab::UsageDataCounters::HLLRedisCounter::EventError' do
- error = Gitlab::UsageDataCounters::HLLRedisCounter::EventError
- allow(Gitlab::UsageDataCounters::HLLRedisCounter).to receive(:calculate_events_union).and_raise(error)
-
+ it 'rescues error when union is missing' do
allow_next_instance_of(described_class) do |instance|
allow(instance).to receive(:aggregated_metrics)
- .and_return([{ name: 'gmau_1', source: 'redis', events: %w[event1_slot], operator: "OR" }])
+ .and_return([aggregated_metric(name: 'gmau_1', source: datasource, time_frame: time_frame)])
end
+ allow(namespace::SOURCES[datasource]).to receive(:calculate_metrics_union).and_raise(sources::UnionNotAvailable)
+
+ expect(aggregated_metrics_data).to eq('gmau_1' => -1)
+ end
+ end
+ end
+ end
+
+ shared_examples 'database_sourced_aggregated_metrics' do
+ let(:datasource) { namespace::DATABASE_SOURCE }
+
+ it_behaves_like 'aggregated_metrics_data'
+ end
+
+ shared_examples 'redis_sourced_aggregated_metrics' do
+ let(:datasource) { namespace::REDIS_SOURCE }
+
+ it_behaves_like 'aggregated_metrics_data' do
+ context 'error handling' do
+ let(:aggregated_metrics) { [aggregated_metric(name: 'gmau_1', source: datasource, time_frame: time_frame)] }
+ let(:error) { Gitlab::UsageDataCounters::HLLRedisCounter::EventError }
+
+ before do
+ allow_next_instance_of(described_class) do |instance|
+ allow(instance).to receive(:aggregated_metrics).and_return(aggregated_metrics)
+ end
+ allow(Gitlab::UsageDataCounters::HLLRedisCounter).to receive(:calculate_events_union).and_raise(error)
+ end
+
+ context 'development and test environment' do
+ it 're raises Gitlab::UsageDataCounters::HLLRedisCounter::EventError' do
+ expect { aggregated_metrics_data }.to raise_error error
+ end
+ end
+
+ context 'production' do
+ it 'rescues Gitlab::UsageDataCounters::HLLRedisCounter::EventError' do
+ stub_rails_env('production')
+
+ expect(aggregated_metrics_data).to eq('gmau_1' => -1)
+ end
+ end
+ end
+ end
+ end
+
+ describe '.aggregated_metrics_all_time_data' do
+ subject(:aggregated_metrics_data) { described_class.new(recorded_at).all_time_data }
+
+ let(:start_date) { nil }
+ let(:end_date) { nil }
+ let(:time_frame) { ['all'] }
+
+ it_behaves_like 'database_sourced_aggregated_metrics'
+ it_behaves_like 'db sourced aggregated metrics without database_sourced_aggregated_metrics feature'
+
+ context 'redis sourced aggregated metrics' do
+ let(:aggregated_metrics) { [aggregated_metric(name: 'gmau_1', time_frame: time_frame)] }
+
+ before do
+ allow_next_instance_of(described_class) do |instance|
+ allow(instance).to receive(:aggregated_metrics).and_return(aggregated_metrics)
+ end
+ end
+
+ context 'development and test environment' do
+ it 'raises Gitlab::Usage::Metrics::Aggregates::DisallowedAggregationTimeFrame' do
+ expect { aggregated_metrics_data }.to raise_error namespace::DisallowedAggregationTimeFrame
+ end
+ end
+
+ context 'production env' do
+ it 'returns fallback value for unsupported time frame' do
+ stub_rails_env('production')
expect(aggregated_metrics_data).to eq('gmau_1' => -1)
end
@@ -223,7 +306,7 @@ RSpec.describe Gitlab::Usage::Metrics::Aggregates::Aggregate, :clean_gitlab_redi
end
it 'allows for YAML aliases in aggregated metrics configs' do
- expect(YAML).to receive(:safe_load).with(kind_of(String), aliases: true)
+ expect(YAML).to receive(:safe_load).with(kind_of(String), aliases: true).at_least(:once)
described_class.new(recorded_at)
end
@@ -232,32 +315,34 @@ RSpec.describe Gitlab::Usage::Metrics::Aggregates::Aggregate, :clean_gitlab_redi
subject(:aggregated_metrics_data) { described_class.new(recorded_at).weekly_data }
let(:start_date) { 7.days.ago.to_date }
+ let(:time_frame) { ['7d'] }
- it_behaves_like 'aggregated_metrics_data'
+ it_behaves_like 'database_sourced_aggregated_metrics'
+ it_behaves_like 'redis_sourced_aggregated_metrics'
+ it_behaves_like 'db sourced aggregated metrics without database_sourced_aggregated_metrics feature'
end
describe '.aggregated_metrics_monthly_data' do
subject(:aggregated_metrics_data) { described_class.new(recorded_at).monthly_data }
let(:start_date) { 4.weeks.ago.to_date }
+ let(:time_frame) { ['28d'] }
- it_behaves_like 'aggregated_metrics_data'
+ it_behaves_like 'database_sourced_aggregated_metrics'
+ it_behaves_like 'redis_sourced_aggregated_metrics'
+ it_behaves_like 'db sourced aggregated metrics without database_sourced_aggregated_metrics feature'
context 'metrics union calls' do
- let(:aggregated_metrics) do
- [
- { name: 'gmau_3', source: 'redis', events: %w[event1_slot event2_slot event3_slot event5_slot], operator: "AND" }
- ].map(&:with_indifferent_access)
- end
-
it 'caches intermediate operations', :aggregate_failures do
+ events = %w[event1 event2 event3 event5]
allow_next_instance_of(described_class) do |instance|
- allow(instance).to receive(:aggregated_metrics).and_return(aggregated_metrics)
+ allow(instance).to receive(:aggregated_metrics)
+ .and_return([aggregated_metric(name: 'gmau_1', events: events, operator: "AND", time_frame: time_frame)])
end
params = { start_date: start_date, end_date: end_date, recorded_at: recorded_at }
- aggregated_metrics[0][:events].each do |event|
+ events.each do |event|
expect(sources::RedisHll).to receive(:calculate_metrics_union)
.with(params.merge(metric_names: event))
.once
@@ -265,7 +350,7 @@ RSpec.describe Gitlab::Usage::Metrics::Aggregates::Aggregate, :clean_gitlab_redi
end
2.upto(4) do |subset_size|
- aggregated_metrics[0][:events].combination(subset_size).each do |events|
+ events.combination(subset_size).each do |events|
expect(sources::RedisHll).to receive(:calculate_metrics_union)
.with(params.merge(metric_names: events))
.once
diff --git a/spec/lib/gitlab/usage/metrics/aggregates/sources/postgres_hll_spec.rb b/spec/lib/gitlab/usage/metrics/aggregates/sources/postgres_hll_spec.rb
index 7b8be8e8bc6..a2a40f17269 100644
--- a/spec/lib/gitlab/usage/metrics/aggregates/sources/postgres_hll_spec.rb
+++ b/spec/lib/gitlab/usage/metrics/aggregates/sources/postgres_hll_spec.rb
@@ -69,7 +69,7 @@ RSpec.describe Gitlab::Usage::Metrics::Aggregates::Sources::PostgresHll, :clean_
it 'persists serialized data in Redis' do
Gitlab::Redis::SharedState.with do |redis|
- expect(redis).to receive(:set).with("#{metric_1}_weekly-#{recorded_at.to_i}", '{"141":1,"56":1}', ex: 120.hours)
+ expect(redis).to receive(:set).with("#{metric_1}_7d-#{recorded_at.to_i}", '{"141":1,"56":1}', ex: 120.hours)
end
save_aggregated_metrics
@@ -81,7 +81,7 @@ RSpec.describe Gitlab::Usage::Metrics::Aggregates::Sources::PostgresHll, :clean_
it 'persists serialized data in Redis' do
Gitlab::Redis::SharedState.with do |redis|
- expect(redis).to receive(:set).with("#{metric_1}_monthly-#{recorded_at.to_i}", '{"141":1,"56":1}', ex: 120.hours)
+ expect(redis).to receive(:set).with("#{metric_1}_28d-#{recorded_at.to_i}", '{"141":1,"56":1}', ex: 120.hours)
end
save_aggregated_metrics
@@ -93,7 +93,7 @@ RSpec.describe Gitlab::Usage::Metrics::Aggregates::Sources::PostgresHll, :clean_
it 'persists serialized data in Redis' do
Gitlab::Redis::SharedState.with do |redis|
- expect(redis).to receive(:set).with("#{metric_1}_all_time-#{recorded_at.to_i}", '{"141":1,"56":1}', ex: 120.hours)
+ expect(redis).to receive(:set).with("#{metric_1}_all-#{recorded_at.to_i}", '{"141":1,"56":1}', ex: 120.hours)
end
save_aggregated_metrics
diff --git a/spec/lib/gitlab/usage/metrics/names_suggestions/generator_spec.rb b/spec/lib/gitlab/usage/metrics/names_suggestions/generator_spec.rb
new file mode 100644
index 00000000000..0d126e4a6fb
--- /dev/null
+++ b/spec/lib/gitlab/usage/metrics/names_suggestions/generator_spec.rb
@@ -0,0 +1,49 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Usage::Metrics::NamesSuggestions::Generator do
+ include UsageDataHelpers
+
+ before do
+ stub_usage_data_connections
+ end
+
+ describe '#generate' do
+ context 'for count metrics' do
+ it 'return correct name' do
+ expect(described_class.generate('counts.boards')).to eq 'count_boards'
+ end
+ end
+
+ context 'for count distinct metrics' do
+ it 'return correct name' do
+ expect(described_class.generate('counts.issues_using_zoom_quick_actions')).to eq 'count_distinct_issue_id_from_zoom_meetings'
+ end
+ end
+
+ context 'for sum metrics' do
+ it 'return correct name' do
+ expect(described_class.generate('counts.jira_imports_total_imported_issues_count')).to eq 'sum_imported_issues_count_from_jira_imports'
+ end
+ end
+
+ context 'for add metrics' do
+ it 'return correct name' do
+ expect(described_class.generate('counts.snippets')).to eq 'add_count_snippets_and_count_snippets'
+ end
+ end
+
+ context 'for redis metrics' do
+ it 'return correct name' do
+ expect(described_class.generate('analytics_unique_visits.analytics_unique_visits_for_any_target')).to eq '<please fill metric name>'
+ end
+ end
+
+ context 'for alt_usage_data metrics' do
+ it 'return correct name' do
+ expect(described_class.generate('settings.operating_system')).to eq '<please fill metric name>'
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/usage_data_counters/aggregated_metrics_spec.rb b/spec/lib/gitlab/usage_data_counters/aggregated_metrics_spec.rb
index 58f974fbe12..9aba86cdaf2 100644
--- a/spec/lib/gitlab/usage_data_counters/aggregated_metrics_spec.rb
+++ b/spec/lib/gitlab/usage_data_counters/aggregated_metrics_spec.rb
@@ -23,6 +23,22 @@ RSpec.describe 'aggregated metrics' do
end
end
+ RSpec::Matchers.define :have_known_time_frame do
+ allowed_time_frames = [
+ Gitlab::Utils::UsageData::ALL_TIME_TIME_FRAME_NAME,
+ Gitlab::Utils::UsageData::TWENTY_EIGHT_DAYS_TIME_FRAME_NAME,
+ Gitlab::Utils::UsageData::SEVEN_DAYS_TIME_FRAME_NAME
+ ]
+
+ match do |aggregate|
+ (aggregate[:time_frame] - allowed_time_frames).empty?
+ end
+
+ failure_message do |aggregate|
+ "Aggregate with name: `#{aggregate[:name]}` uses not allowed time_frame`#{aggregate[:time_frame] - allowed_time_frames}`"
+ end
+ end
+
let_it_be(:known_events) do
Gitlab::UsageDataCounters::HLLRedisCounter.known_events
end
@@ -38,10 +54,18 @@ RSpec.describe 'aggregated metrics' do
expect(aggregated_metrics).to all has_known_source
end
+ it 'all aggregated metrics has known source' do
+ expect(aggregated_metrics).to all have_known_time_frame
+ end
+
aggregated_metrics&.select { |agg| agg[:source] == Gitlab::Usage::Metrics::Aggregates::REDIS_SOURCE }&.each do |aggregate|
context "for #{aggregate[:name]} aggregate of #{aggregate[:events].join(' ')}" do
let_it_be(:events_records) { known_events.select { |event| aggregate[:events].include?(event[:name]) } }
+ it "does not include 'all' time frame for Redis sourced aggregate" do
+ expect(aggregate[:time_frame]).not_to include(Gitlab::Utils::UsageData::ALL_TIME_TIME_FRAME_NAME)
+ end
+
it "only refers to known events" do
expect(aggregate[:events]).to all be_known_event
end
diff --git a/spec/lib/gitlab/usage_data_counters/code_review_events_spec.rb b/spec/lib/gitlab/usage_data_counters/code_review_events_spec.rb
new file mode 100644
index 00000000000..664e7938a7e
--- /dev/null
+++ b/spec/lib/gitlab/usage_data_counters/code_review_events_spec.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+# If this spec fails, we need to add the new code review event to the correct aggregated metric
+RSpec.describe 'Code review events' do
+ it 'the aggregated metrics contain all the code review metrics' do
+ path = Rails.root.join('lib/gitlab/usage_data_counters/aggregated_metrics/code_review.yml')
+ aggregated_events = YAML.safe_load(File.read(path), aliases: true)&.map(&:with_indifferent_access)
+
+ code_review_aggregated_events = aggregated_events
+ .map { |event| event['events'] }
+ .flatten
+ .uniq
+
+ code_review_events = Gitlab::UsageDataCounters::HLLRedisCounter.events_for_category("code_review")
+
+ exceptions = %w[i_code_review_mr_diffs i_code_review_mr_single_file_diffs]
+ code_review_aggregated_events += exceptions
+
+ expect(code_review_events - code_review_aggregated_events).to be_empty
+ end
+end
diff --git a/spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb b/spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb
index b4894ec049f..d12dcdae955 100644
--- a/spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb
+++ b/spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb
@@ -42,7 +42,8 @@ RSpec.describe Gitlab::UsageDataCounters::HLLRedisCounter, :clean_gitlab_redis_s
'terraform',
'ci_templates',
'quickactions',
- 'pipeline_authoring'
+ 'pipeline_authoring',
+ 'epics_usage'
)
end
end
@@ -150,10 +151,17 @@ RSpec.describe Gitlab::UsageDataCounters::HLLRedisCounter, :clean_gitlab_redis_s
expect { described_class.track_event(different_aggregation, values: entity1, time: Date.current) }.to raise_error(Gitlab::UsageDataCounters::HLLRedisCounter::UnknownAggregation)
end
- it 'raise error if metrics of unknown aggregation' do
+ it 'raise error if metrics of unknown event' do
expect { described_class.track_event('unknown', values: entity1, time: Date.current) }.to raise_error(Gitlab::UsageDataCounters::HLLRedisCounter::UnknownEvent)
end
+ it 'reports an error if Feature.enabled raise an error' do
+ expect(Feature).to receive(:enabled?).and_raise(StandardError.new)
+ expect(Gitlab::ErrorTracking).to receive(:track_and_raise_for_dev_exception)
+
+ described_class.track_event(:g_analytics_contribution, values: entity1, time: Date.current)
+ end
+
context 'for weekly events' do
it 'sets the keys in Redis to expire automatically after the given expiry time' do
described_class.track_event("g_analytics_contribution", values: entity1)
diff --git a/spec/lib/gitlab/usage_data_counters/issue_activity_unique_counter_spec.rb b/spec/lib/gitlab/usage_data_counters/issue_activity_unique_counter_spec.rb
index bf43f7552e6..f8f6494b92e 100644
--- a/spec/lib/gitlab/usage_data_counters/issue_activity_unique_counter_spec.rb
+++ b/spec/lib/gitlab/usage_data_counters/issue_activity_unique_counter_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe Gitlab::UsageDataCounters::IssueActivityUniqueCounter, :clean_git
let(:time) { Time.zone.now }
context 'for Issue title edit actions' do
- it_behaves_like 'a tracked issue edit event' do
+ it_behaves_like 'a daily tracked issuable event' do
let(:action) { described_class::ISSUE_TITLE_CHANGED }
def track_action(params)
@@ -19,7 +19,7 @@ RSpec.describe Gitlab::UsageDataCounters::IssueActivityUniqueCounter, :clean_git
end
context 'for Issue description edit actions' do
- it_behaves_like 'a tracked issue edit event' do
+ it_behaves_like 'a daily tracked issuable event' do
let(:action) { described_class::ISSUE_DESCRIPTION_CHANGED }
def track_action(params)
@@ -29,7 +29,7 @@ RSpec.describe Gitlab::UsageDataCounters::IssueActivityUniqueCounter, :clean_git
end
context 'for Issue assignee edit actions' do
- it_behaves_like 'a tracked issue edit event' do
+ it_behaves_like 'a daily tracked issuable event' do
let(:action) { described_class::ISSUE_ASSIGNEE_CHANGED }
def track_action(params)
@@ -39,7 +39,7 @@ RSpec.describe Gitlab::UsageDataCounters::IssueActivityUniqueCounter, :clean_git
end
context 'for Issue make confidential actions' do
- it_behaves_like 'a tracked issue edit event' do
+ it_behaves_like 'a daily tracked issuable event' do
let(:action) { described_class::ISSUE_MADE_CONFIDENTIAL }
def track_action(params)
@@ -49,7 +49,7 @@ RSpec.describe Gitlab::UsageDataCounters::IssueActivityUniqueCounter, :clean_git
end
context 'for Issue make visible actions' do
- it_behaves_like 'a tracked issue edit event' do
+ it_behaves_like 'a daily tracked issuable event' do
let(:action) { described_class::ISSUE_MADE_VISIBLE }
def track_action(params)
@@ -59,7 +59,7 @@ RSpec.describe Gitlab::UsageDataCounters::IssueActivityUniqueCounter, :clean_git
end
context 'for Issue created actions' do
- it_behaves_like 'a tracked issue edit event' do
+ it_behaves_like 'a daily tracked issuable event' do
let(:action) { described_class::ISSUE_CREATED }
def track_action(params)
@@ -69,7 +69,7 @@ RSpec.describe Gitlab::UsageDataCounters::IssueActivityUniqueCounter, :clean_git
end
context 'for Issue closed actions' do
- it_behaves_like 'a tracked issue edit event' do
+ it_behaves_like 'a daily tracked issuable event' do
let(:action) { described_class::ISSUE_CLOSED }
def track_action(params)
@@ -79,7 +79,7 @@ RSpec.describe Gitlab::UsageDataCounters::IssueActivityUniqueCounter, :clean_git
end
context 'for Issue reopened actions' do
- it_behaves_like 'a tracked issue edit event' do
+ it_behaves_like 'a daily tracked issuable event' do
let(:action) { described_class::ISSUE_REOPENED }
def track_action(params)
@@ -89,7 +89,7 @@ RSpec.describe Gitlab::UsageDataCounters::IssueActivityUniqueCounter, :clean_git
end
context 'for Issue label changed actions' do
- it_behaves_like 'a tracked issue edit event' do
+ it_behaves_like 'a daily tracked issuable event' do
let(:action) { described_class::ISSUE_LABEL_CHANGED }
def track_action(params)
@@ -99,7 +99,7 @@ RSpec.describe Gitlab::UsageDataCounters::IssueActivityUniqueCounter, :clean_git
end
context 'for Issue cross-referenced actions' do
- it_behaves_like 'a tracked issue edit event' do
+ it_behaves_like 'a daily tracked issuable event' do
let(:action) { described_class::ISSUE_CROSS_REFERENCED }
def track_action(params)
@@ -109,7 +109,7 @@ RSpec.describe Gitlab::UsageDataCounters::IssueActivityUniqueCounter, :clean_git
end
context 'for Issue moved actions' do
- it_behaves_like 'a tracked issue edit event' do
+ it_behaves_like 'a daily tracked issuable event' do
let(:action) { described_class::ISSUE_MOVED }
def track_action(params)
@@ -119,7 +119,7 @@ RSpec.describe Gitlab::UsageDataCounters::IssueActivityUniqueCounter, :clean_git
end
context 'for Issue cloned actions' do
- it_behaves_like 'a tracked issue edit event' do
+ it_behaves_like 'a daily tracked issuable event' do
let(:action) { described_class::ISSUE_CLONED }
def track_action(params)
@@ -129,7 +129,7 @@ RSpec.describe Gitlab::UsageDataCounters::IssueActivityUniqueCounter, :clean_git
end
context 'for Issue relate actions' do
- it_behaves_like 'a tracked issue edit event' do
+ it_behaves_like 'a daily tracked issuable event' do
let(:action) { described_class::ISSUE_RELATED }
def track_action(params)
@@ -139,7 +139,7 @@ RSpec.describe Gitlab::UsageDataCounters::IssueActivityUniqueCounter, :clean_git
end
context 'for Issue unrelate actions' do
- it_behaves_like 'a tracked issue edit event' do
+ it_behaves_like 'a daily tracked issuable event' do
let(:action) { described_class::ISSUE_UNRELATED }
def track_action(params)
@@ -149,7 +149,7 @@ RSpec.describe Gitlab::UsageDataCounters::IssueActivityUniqueCounter, :clean_git
end
context 'for Issue marked as duplicate actions' do
- it_behaves_like 'a tracked issue edit event' do
+ it_behaves_like 'a daily tracked issuable event' do
let(:action) { described_class::ISSUE_MARKED_AS_DUPLICATE }
def track_action(params)
@@ -159,7 +159,7 @@ RSpec.describe Gitlab::UsageDataCounters::IssueActivityUniqueCounter, :clean_git
end
context 'for Issue locked actions' do
- it_behaves_like 'a tracked issue edit event' do
+ it_behaves_like 'a daily tracked issuable event' do
let(:action) { described_class::ISSUE_LOCKED }
def track_action(params)
@@ -169,7 +169,7 @@ RSpec.describe Gitlab::UsageDataCounters::IssueActivityUniqueCounter, :clean_git
end
context 'for Issue unlocked actions' do
- it_behaves_like 'a tracked issue edit event' do
+ it_behaves_like 'a daily tracked issuable event' do
let(:action) { described_class::ISSUE_UNLOCKED }
def track_action(params)
@@ -179,7 +179,7 @@ RSpec.describe Gitlab::UsageDataCounters::IssueActivityUniqueCounter, :clean_git
end
context 'for Issue designs added actions' do
- it_behaves_like 'a tracked issue edit event' do
+ it_behaves_like 'a daily tracked issuable event' do
let(:action) { described_class::ISSUE_DESIGNS_ADDED }
def track_action(params)
@@ -189,7 +189,7 @@ RSpec.describe Gitlab::UsageDataCounters::IssueActivityUniqueCounter, :clean_git
end
context 'for Issue designs modified actions' do
- it_behaves_like 'a tracked issue edit event' do
+ it_behaves_like 'a daily tracked issuable event' do
let(:action) { described_class::ISSUE_DESIGNS_MODIFIED }
def track_action(params)
@@ -199,7 +199,7 @@ RSpec.describe Gitlab::UsageDataCounters::IssueActivityUniqueCounter, :clean_git
end
context 'for Issue designs removed actions' do
- it_behaves_like 'a tracked issue edit event' do
+ it_behaves_like 'a daily tracked issuable event' do
let(:action) { described_class::ISSUE_DESIGNS_REMOVED }
def track_action(params)
@@ -209,7 +209,7 @@ RSpec.describe Gitlab::UsageDataCounters::IssueActivityUniqueCounter, :clean_git
end
context 'for Issue due date changed actions' do
- it_behaves_like 'a tracked issue edit event' do
+ it_behaves_like 'a daily tracked issuable event' do
let(:action) { described_class::ISSUE_DUE_DATE_CHANGED }
def track_action(params)
@@ -219,7 +219,7 @@ RSpec.describe Gitlab::UsageDataCounters::IssueActivityUniqueCounter, :clean_git
end
context 'for Issue time estimate changed actions' do
- it_behaves_like 'a tracked issue edit event' do
+ it_behaves_like 'a daily tracked issuable event' do
let(:action) { described_class::ISSUE_TIME_ESTIMATE_CHANGED }
def track_action(params)
@@ -229,7 +229,7 @@ RSpec.describe Gitlab::UsageDataCounters::IssueActivityUniqueCounter, :clean_git
end
context 'for Issue time spent changed actions' do
- it_behaves_like 'a tracked issue edit event' do
+ it_behaves_like 'a daily tracked issuable event' do
let(:action) { described_class::ISSUE_TIME_SPENT_CHANGED }
def track_action(params)
@@ -239,7 +239,7 @@ RSpec.describe Gitlab::UsageDataCounters::IssueActivityUniqueCounter, :clean_git
end
context 'for Issue comment added actions' do
- it_behaves_like 'a tracked issue edit event' do
+ it_behaves_like 'a daily tracked issuable event' do
let(:action) { described_class::ISSUE_COMMENT_ADDED }
def track_action(params)
@@ -249,7 +249,7 @@ RSpec.describe Gitlab::UsageDataCounters::IssueActivityUniqueCounter, :clean_git
end
context 'for Issue comment edited actions' do
- it_behaves_like 'a tracked issue edit event' do
+ it_behaves_like 'a daily tracked issuable event' do
let(:action) { described_class::ISSUE_COMMENT_EDITED }
def track_action(params)
@@ -259,7 +259,7 @@ RSpec.describe Gitlab::UsageDataCounters::IssueActivityUniqueCounter, :clean_git
end
context 'for Issue comment removed actions' do
- it_behaves_like 'a tracked issue edit event' do
+ it_behaves_like 'a daily tracked issuable event' do
let(:action) { described_class::ISSUE_COMMENT_REMOVED }
def track_action(params)
diff --git a/spec/lib/gitlab/usage_data_counters/merge_request_activity_unique_counter_spec.rb b/spec/lib/gitlab/usage_data_counters/merge_request_activity_unique_counter_spec.rb
index a604de4a61f..6486a5a22ba 100644
--- a/spec/lib/gitlab/usage_data_counters/merge_request_activity_unique_counter_spec.rb
+++ b/spec/lib/gitlab/usage_data_counters/merge_request_activity_unique_counter_spec.rb
@@ -21,6 +21,14 @@ RSpec.describe Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter, :cl
end
end
+ shared_examples_for 'not tracked merge request unique event' do
+ specify do
+ expect(Gitlab::UsageDataCounters::HLLRedisCounter).not_to receive(:track_event)
+
+ subject
+ end
+ end
+
describe '.track_mr_diffs_action' do
subject { described_class.track_mr_diffs_action(merge_request: merge_request) }
@@ -284,4 +292,98 @@ RSpec.describe Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter, :cl
let(:action) { described_class::MR_CREATE_FROM_ISSUE_ACTION }
end
end
+
+ describe '.track_discussion_locked_action' do
+ subject { described_class.track_discussion_locked_action(user: user) }
+
+ it_behaves_like 'a tracked merge request unique event' do
+ let(:action) { described_class::MR_DISCUSSION_LOCKED_ACTION }
+ end
+ end
+
+ describe '.track_discussion_unlocked_action' do
+ subject { described_class.track_discussion_unlocked_action(user: user) }
+
+ it_behaves_like 'a tracked merge request unique event' do
+ let(:action) { described_class::MR_DISCUSSION_UNLOCKED_ACTION }
+ end
+ end
+
+ describe '.track_time_estimate_changed_action' do
+ subject { described_class.track_time_estimate_changed_action(user: user) }
+
+ it_behaves_like 'a tracked merge request unique event' do
+ let(:action) { described_class::MR_TIME_ESTIMATE_CHANGED_ACTION }
+ end
+ end
+
+ describe '.track_time_spent_changed_action' do
+ subject { described_class.track_time_spent_changed_action(user: user) }
+
+ it_behaves_like 'a tracked merge request unique event' do
+ let(:action) { described_class::MR_TIME_SPENT_CHANGED_ACTION }
+ end
+ end
+
+ describe '.track_assignees_changed_action' do
+ subject { described_class.track_assignees_changed_action(user: user) }
+
+ it_behaves_like 'a tracked merge request unique event' do
+ let(:action) { described_class::MR_ASSIGNEES_CHANGED_ACTION }
+ end
+ end
+
+ describe '.track_reviewers_changed_action' do
+ subject { described_class.track_reviewers_changed_action(user: user) }
+
+ it_behaves_like 'a tracked merge request unique event' do
+ let(:action) { described_class::MR_REVIEWERS_CHANGED_ACTION }
+ end
+ end
+
+ describe '.track_mr_including_ci_config' do
+ subject { described_class.track_mr_including_ci_config(user: user, merge_request: merge_request) }
+
+ context 'when merge request includes a ci config change' do
+ before do
+ allow(merge_request).to receive(:diff_stats).and_return([double(path: 'abc.txt'), double(path: '.gitlab-ci.yml')])
+ end
+
+ it_behaves_like 'a tracked merge request unique event' do
+ let(:action) { described_class::MR_INCLUDING_CI_CONFIG_ACTION }
+ end
+
+ context 'when FF usage_data_o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile is disabled' do
+ before do
+ stub_feature_flags(usage_data_o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile: false)
+ end
+
+ it_behaves_like 'not tracked merge request unique event'
+ end
+ end
+
+ context 'when merge request does not include any ci config change' do
+ before do
+ allow(merge_request).to receive(:diff_stats).and_return([double(path: 'abc.txt'), double(path: 'abc.xyz')])
+ end
+
+ it_behaves_like 'not tracked merge request unique event'
+ end
+ end
+
+ describe '.track_milestone_changed_action' do
+ subject { described_class.track_milestone_changed_action(user: user) }
+
+ it_behaves_like 'a tracked merge request unique event' do
+ let(:action) { described_class::MR_MILESTONE_CHANGED_ACTION }
+ end
+ end
+
+ describe '.track_labels_changed_action' do
+ subject { described_class.track_labels_changed_action(user: user) }
+
+ it_behaves_like 'a tracked merge request unique event' do
+ let(:action) { described_class::MR_LABELS_CHANGED_ACTION }
+ end
+ end
end
diff --git a/spec/lib/gitlab/usage_data_counters/package_event_counter_spec.rb b/spec/lib/gitlab/usage_data_counters/package_event_counter_spec.rb
index 7b5efb11034..1be2a83f98f 100644
--- a/spec/lib/gitlab/usage_data_counters/package_event_counter_spec.rb
+++ b/spec/lib/gitlab/usage_data_counters/package_event_counter_spec.rb
@@ -14,7 +14,7 @@ RSpec.describe Gitlab::UsageDataCounters::PackageEventCounter, :clean_gitlab_red
end
it 'includes the right events' do
- expect(described_class::KNOWN_EVENTS.size).to eq 45
+ expect(described_class::KNOWN_EVENTS.size).to eq 48
end
described_class::KNOWN_EVENTS.each do |event|
diff --git a/spec/lib/gitlab/usage_data_counters/quick_action_activity_unique_counter_spec.rb b/spec/lib/gitlab/usage_data_counters/quick_action_activity_unique_counter_spec.rb
index d4c423f57fe..2df0f331f73 100644
--- a/spec/lib/gitlab/usage_data_counters/quick_action_activity_unique_counter_spec.rb
+++ b/spec/lib/gitlab/usage_data_counters/quick_action_activity_unique_counter_spec.rb
@@ -160,4 +160,24 @@ RSpec.describe Gitlab::UsageDataCounters::QuickActionActivityUniqueCounter, :cle
end
end
end
+
+ context 'tracking invite_email' do
+ let(:quickaction_name) { 'invite_email' }
+
+ context 'single email' do
+ let(:args) { 'someone@gitlab.com' }
+
+ it_behaves_like 'a tracked quick action unique event' do
+ let(:action) { 'i_quickactions_invite_email_single' }
+ end
+ end
+
+ context 'multiple emails' do
+ let(:args) { 'someone@gitlab.com another@gitlab.com' }
+
+ it_behaves_like 'a tracked quick action unique event' do
+ let(:action) { 'i_quickactions_invite_email_multiple' }
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/usage_data_queries_spec.rb b/spec/lib/gitlab/usage_data_queries_spec.rb
index 7fc77593265..12eac643383 100644
--- a/spec/lib/gitlab/usage_data_queries_spec.rb
+++ b/spec/lib/gitlab/usage_data_queries_spec.rb
@@ -38,4 +38,12 @@ RSpec.describe Gitlab::UsageDataQueries do
expect(described_class.sum(Issue, :weight)).to eq('SELECT SUM("issues"."weight") FROM "issues"')
end
end
+
+ describe '.add' do
+ it 'returns the combined raw SQL with an inner query' do
+ expect(described_class.add('SELECT COUNT("users"."id") FROM "users"',
+ 'SELECT COUNT("issues"."id") FROM "issues"'))
+ .to eq('SELECT (SELECT COUNT("users"."id") FROM "users") + (SELECT COUNT("issues"."id") FROM "issues")')
+ end
+ end
end
diff --git a/spec/lib/gitlab/usage_data_spec.rb b/spec/lib/gitlab/usage_data_spec.rb
index 602f6640d72..97000856626 100644
--- a/spec/lib/gitlab/usage_data_spec.rb
+++ b/spec/lib/gitlab/usage_data_spec.rb
@@ -1129,12 +1129,40 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
end
end
+ describe ".operating_system" do
+ let(:ohai_data) { { "platform" => "ubuntu", "platform_version" => "20.04" } }
+
+ before do
+ allow_next_instance_of(Ohai::System) do |ohai|
+ allow(ohai).to receive(:data).and_return(ohai_data)
+ end
+ end
+
+ subject { described_class.operating_system }
+
+ it { is_expected.to eq("ubuntu-20.04") }
+
+ context 'when on Debian with armv architecture' do
+ let(:ohai_data) { { "platform" => "debian", "platform_version" => "10", 'kernel' => { 'machine' => 'armv' } } }
+
+ it { is_expected.to eq("raspbian-10") }
+ end
+ end
+
describe ".system_usage_data_settings" do
+ before do
+ allow(described_class).to receive(:operating_system).and_return('ubuntu-20.04')
+ end
+
subject { described_class.system_usage_data_settings }
it 'gathers settings usage data', :aggregate_failures do
expect(subject[:settings][:ldap_encrypted_secrets_enabled]).to eq(Gitlab::Auth::Ldap::Config.encrypted_secrets.active?)
end
+
+ it 'populates operating system information' do
+ expect(subject[:settings][:operating_system]).to eq('ubuntu-20.04')
+ end
end
end
@@ -1325,7 +1353,7 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
let(:categories) { ::Gitlab::UsageDataCounters::HLLRedisCounter.categories }
let(:ineligible_total_categories) do
- %w[source_code ci_secrets_management incident_management_alerts snippets terraform pipeline_authoring]
+ %w[source_code ci_secrets_management incident_management_alerts snippets terraform epics_usage]
end
it 'has all known_events' do
@@ -1347,25 +1375,20 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
end
end
- describe '.aggregated_metrics_weekly' do
- subject(:aggregated_metrics_payload) { described_class.aggregated_metrics_weekly }
+ describe '.aggregated_metrics_data' do
+ it 'uses ::Gitlab::Usage::Metrics::Aggregates::Aggregate methods', :aggregate_failures do
+ expected_payload = {
+ counts_weekly: { aggregated_metrics: { global_search_gmau: 123 } },
+ counts_monthly: { aggregated_metrics: { global_search_gmau: 456 } },
+ counts: { aggregate_global_search_gmau: 789 }
+ }
- it 'uses ::Gitlab::Usage::Metrics::Aggregates::Aggregate#weekly_data', :aggregate_failures do
expect_next_instance_of(::Gitlab::Usage::Metrics::Aggregates::Aggregate) do |instance|
expect(instance).to receive(:weekly_data).and_return(global_search_gmau: 123)
+ expect(instance).to receive(:monthly_data).and_return(global_search_gmau: 456)
+ expect(instance).to receive(:all_time_data).and_return(global_search_gmau: 789)
end
- expect(aggregated_metrics_payload).to eq(aggregated_metrics: { global_search_gmau: 123 })
- end
- end
-
- describe '.aggregated_metrics_monthly' do
- subject(:aggregated_metrics_payload) { described_class.aggregated_metrics_monthly }
-
- it 'uses ::Gitlab::Usage::Metrics::Aggregates::Aggregate#monthly_data', :aggregate_failures do
- expect_next_instance_of(::Gitlab::Usage::Metrics::Aggregates::Aggregate) do |instance|
- expect(instance).to receive(:monthly_data).and_return(global_search_gmau: 123)
- end
- expect(aggregated_metrics_payload).to eq(aggregated_metrics: { global_search_gmau: 123 })
+ expect(described_class.aggregated_metrics_data).to eq(expected_payload)
end
end
diff --git a/spec/lib/gitlab/utils/usage_data_spec.rb b/spec/lib/gitlab/utils/usage_data_spec.rb
index e964e695828..011d1f4ae57 100644
--- a/spec/lib/gitlab/utils/usage_data_spec.rb
+++ b/spec/lib/gitlab/utils/usage_data_spec.rb
@@ -183,6 +183,24 @@ RSpec.describe Gitlab::Utils::UsageData do
end
end
+ describe '#add' do
+ it 'adds given values' do
+ expect(described_class.add(1, 3)).to eq(4)
+ end
+
+ it 'adds given values' do
+ expect(described_class.add).to eq(0)
+ end
+
+ it 'returns the fallback value when adding fails' do
+ expect(described_class.add(nil, 3)).to eq(-1)
+ end
+
+ it 'returns the fallback value one of the arguments is negative' do
+ expect(described_class.add(-1, 1)).to eq(-1)
+ end
+ end
+
describe '#alt_usage_data' do
it 'returns the fallback when it gets an error' do
expect(described_class.alt_usage_data { raise StandardError } ).to eq(-1)
@@ -203,6 +221,12 @@ RSpec.describe Gitlab::Utils::UsageData do
expect(described_class.redis_usage_data { raise ::Redis::CommandError } ).to eq(-1)
end
+ it 'returns the fallback when Redis HLL raises any error' do
+ stub_const("Gitlab::Utils::UsageData::FALLBACK", 15)
+
+ expect(described_class.redis_usage_data { raise Gitlab::UsageDataCounters::HLLRedisCounter::CategoryMismatch } ).to eq(15)
+ end
+
it 'returns the evaluated block when given' do
expect(described_class.redis_usage_data { 1 }).to eq(1)
end
@@ -338,38 +362,15 @@ RSpec.describe Gitlab::Utils::UsageData do
let(:value) { '9f302fea-f828-4ca9-aef4-e10bd723c0b3' }
let(:event_name) { 'incident_management_alert_status_changed' }
let(:unknown_event) { 'unknown' }
- let(:feature) { "usage_data_#{event_name}" }
-
- before do
- skip_feature_flags_yaml_validation
- end
- context 'with feature enabled' do
- before do
- stub_feature_flags(feature => true)
- end
-
- it 'tracks redis hll event' do
- expect(Gitlab::UsageDataCounters::HLLRedisCounter).to receive(:track_event).with(event_name, values: value)
-
- described_class.track_usage_event(event_name, value)
- end
+ it 'tracks redis hll event' do
+ expect(Gitlab::UsageDataCounters::HLLRedisCounter).to receive(:track_event).with(event_name, values: value)
- it 'raise an error for unknown event' do
- expect { described_class.track_usage_event(unknown_event, value) }.to raise_error(Gitlab::UsageDataCounters::HLLRedisCounter::UnknownEvent)
- end
+ described_class.track_usage_event(event_name, value)
end
- context 'with feature disabled' do
- before do
- stub_feature_flags(feature => false)
- end
-
- it 'does not track event' do
- expect(Gitlab::UsageDataCounters::HLLRedisCounter).not_to receive(:track_event)
-
- described_class.track_usage_event(event_name, value)
- end
+ it 'raise an error for unknown event' do
+ expect { described_class.track_usage_event(unknown_event, value) }.to raise_error(Gitlab::UsageDataCounters::HLLRedisCounter::UnknownEvent)
end
end
end
diff --git a/spec/lib/gitlab/visibility_level_spec.rb b/spec/lib/gitlab/visibility_level_spec.rb
index 63c31c82d59..0d34d22cbbe 100644
--- a/spec/lib/gitlab/visibility_level_spec.rb
+++ b/spec/lib/gitlab/visibility_level_spec.rb
@@ -131,4 +131,29 @@ RSpec.describe Gitlab::VisibilityLevel do
end
end
end
+
+ describe '.options' do
+ context 'keys' do
+ it 'returns the allowed visibility levels' do
+ expect(described_class.options.keys).to contain_exactly('Private', 'Internal', 'Public')
+ end
+ end
+ end
+
+ describe '.level_name' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:level_value, :level_name) do
+ described_class::PRIVATE | 'Private'
+ described_class::INTERNAL | 'Internal'
+ described_class::PUBLIC | 'Public'
+ non_existing_record_access_level | 'Unknown'
+ end
+
+ with_them do
+ it 'returns the name of the visibility level' do
+ expect(described_class.level_name(level_value)).to eq(level_name)
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/word_diff/chunk_collection_spec.rb b/spec/lib/gitlab/word_diff/chunk_collection_spec.rb
new file mode 100644
index 00000000000..aa837f760c1
--- /dev/null
+++ b/spec/lib/gitlab/word_diff/chunk_collection_spec.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::WordDiff::ChunkCollection do
+ subject(:collection) { described_class.new }
+
+ describe '#add' do
+ it 'adds elements to the chunk collection' do
+ collection.add('Hello')
+ collection.add(' World')
+
+ expect(collection.content).to eq('Hello World')
+ end
+ end
+
+ describe '#content' do
+ subject { collection.content }
+
+ context 'when no elements in the collection' do
+ it { is_expected.to eq('') }
+ end
+
+ context 'when elements exist' do
+ before do
+ collection.add('Hi')
+ collection.add(' GitLab!')
+ end
+
+ it { is_expected.to eq('Hi GitLab!') }
+ end
+ end
+
+ describe '#reset' do
+ it 'clears the collection' do
+ collection.add('1')
+ collection.add('2')
+
+ collection.reset
+
+ expect(collection.content).to eq('')
+ end
+ end
+end
diff --git a/spec/lib/gitlab/word_diff/line_processor_spec.rb b/spec/lib/gitlab/word_diff/line_processor_spec.rb
new file mode 100644
index 00000000000..f448f5b5eb6
--- /dev/null
+++ b/spec/lib/gitlab/word_diff/line_processor_spec.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::WordDiff::LineProcessor do
+ subject(:line_processor) { described_class.new(line) }
+
+ describe '#extract' do
+ subject(:segment) { line_processor.extract }
+
+ context 'when line is a diff hunk' do
+ let(:line) { "@@ -1,14 +1,13 @@\n" }
+
+ it 'returns DiffHunk segment' do
+ expect(segment).to be_a(Gitlab::WordDiff::Segments::DiffHunk)
+ expect(segment.to_s).to eq('@@ -1,14 +1,13 @@')
+ end
+ end
+
+ context 'when line has a newline delimiter' do
+ let(:line) { "~\n" }
+
+ it 'returns Newline segment' do
+ expect(segment).to be_a(Gitlab::WordDiff::Segments::Newline)
+ expect(segment.to_s).to eq('')
+ end
+ end
+
+ context 'when line has only space' do
+ let(:line) { " \n" }
+
+ it 'returns nil' do
+ is_expected.to be_nil
+ end
+ end
+
+ context 'when line has content' do
+ let(:line) { "+New addition\n" }
+
+ it 'returns Chunk segment' do
+ expect(segment).to be_a(Gitlab::WordDiff::Segments::Chunk)
+ expect(segment.to_s).to eq('New addition')
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/word_diff/parser_spec.rb b/spec/lib/gitlab/word_diff/parser_spec.rb
new file mode 100644
index 00000000000..3aeefb57a02
--- /dev/null
+++ b/spec/lib/gitlab/word_diff/parser_spec.rb
@@ -0,0 +1,67 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::WordDiff::Parser do
+ subject(:parser) { described_class.new }
+
+ describe '#parse' do
+ subject { parser.parse(diff.lines).to_a }
+
+ let(:diff) do
+ <<~EOF
+ @@ -1,14 +1,13 @@
+ ~
+ Unchanged line
+ ~
+ ~
+ -Old change
+ +New addition
+ unchanged content
+ ~
+ @@ -50,14 +50,13 @@
+ +First change
+ same same same_
+ -removed_
+ +added_
+ end of the line
+ ~
+ ~
+ EOF
+ end
+
+ it 'returns a collection of lines' do
+ diff_lines = subject
+
+ aggregate_failures do
+ expect(diff_lines.count).to eq(7)
+
+ expect(diff_lines.map(&:to_hash)).to match_array(
+ [
+ a_hash_including(index: 0, old_pos: 1, new_pos: 1, text: '', type: nil),
+ a_hash_including(index: 1, old_pos: 2, new_pos: 2, text: 'Unchanged line', type: nil),
+ a_hash_including(index: 2, old_pos: 3, new_pos: 3, text: '', type: nil),
+ a_hash_including(index: 3, old_pos: 4, new_pos: 4, text: 'Old changeNew addition unchanged content', type: nil),
+ a_hash_including(index: 4, old_pos: 50, new_pos: 50, text: '@@ -50,14 +50,13 @@', type: 'match'),
+ a_hash_including(index: 5, old_pos: 50, new_pos: 50, text: 'First change same same same_removed_added_end of the line', type: nil),
+ a_hash_including(index: 6, old_pos: 51, new_pos: 51, text: '', type: nil)
+ ]
+ )
+ end
+ end
+
+ it 'restarts object index after several calls to Enumerator' do
+ enumerator = parser.parse(diff.lines)
+
+ 2.times do
+ expect(enumerator.first.index).to eq(0)
+ end
+ end
+
+ context 'when diff is empty' do
+ let(:diff) { '' }
+
+ it { is_expected.to eq([]) }
+ end
+ end
+end
diff --git a/spec/lib/gitlab/word_diff/positions_counter_spec.rb b/spec/lib/gitlab/word_diff/positions_counter_spec.rb
new file mode 100644
index 00000000000..e2c246f6801
--- /dev/null
+++ b/spec/lib/gitlab/word_diff/positions_counter_spec.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::WordDiff::PositionsCounter do
+ subject(:counter) { described_class.new }
+
+ describe 'Initial state' do
+ it 'starts with predefined values' do
+ expect(counter.pos_old).to eq(1)
+ expect(counter.pos_new).to eq(1)
+ expect(counter.line_obj_index).to eq(0)
+ end
+ end
+
+ describe '#increase_pos_num' do
+ it 'increases old and new positions' do
+ expect { counter.increase_pos_num }.to change { counter.pos_old }.from(1).to(2)
+ .and change { counter.pos_new }.from(1).to(2)
+ end
+ end
+
+ describe '#increase_obj_index' do
+ it 'increases object index' do
+ expect { counter.increase_obj_index }.to change { counter.line_obj_index }.from(0).to(1)
+ end
+ end
+
+ describe '#set_pos_num' do
+ it 'sets old and new positions' do
+ expect { counter.set_pos_num(old: 10, new: 12) }.to change { counter.pos_old }.from(1).to(10)
+ .and change { counter.pos_new }.from(1).to(12)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/word_diff/segments/chunk_spec.rb b/spec/lib/gitlab/word_diff/segments/chunk_spec.rb
new file mode 100644
index 00000000000..797cc42a03c
--- /dev/null
+++ b/spec/lib/gitlab/word_diff/segments/chunk_spec.rb
@@ -0,0 +1,53 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::WordDiff::Segments::Chunk do
+ subject(:chunk) { described_class.new(line) }
+
+ let(:line) { ' Hello' }
+
+ describe '#removed?' do
+ subject { chunk.removed? }
+
+ it { is_expected.to be_falsey }
+
+ context 'when line starts with "-"' do
+ let(:line) { '-Removed' }
+
+ it { is_expected.to be_truthy }
+ end
+ end
+
+ describe '#added?' do
+ subject { chunk.added? }
+
+ it { is_expected.to be_falsey }
+
+ context 'when line starts with "+"' do
+ let(:line) { '+Added' }
+
+ it { is_expected.to be_truthy }
+ end
+ end
+
+ describe '#to_s' do
+ subject { chunk.to_s }
+
+ it 'removes lead string modifier' do
+ is_expected.to eq('Hello')
+ end
+
+ context 'when chunk is empty' do
+ let(:line) { '' }
+
+ it { is_expected.to eq('') }
+ end
+ end
+
+ describe '#length' do
+ subject { chunk.length }
+
+ it { is_expected.to eq('Hello'.length) }
+ end
+end
diff --git a/spec/lib/gitlab/word_diff/segments/diff_hunk_spec.rb b/spec/lib/gitlab/word_diff/segments/diff_hunk_spec.rb
new file mode 100644
index 00000000000..5250e6d73c2
--- /dev/null
+++ b/spec/lib/gitlab/word_diff/segments/diff_hunk_spec.rb
@@ -0,0 +1,51 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::WordDiff::Segments::DiffHunk do
+ subject(:diff_hunk) { described_class.new(line) }
+
+ let(:line) { '@@ -3,14 +4,13 @@' }
+
+ describe '#pos_old' do
+ subject { diff_hunk.pos_old }
+
+ it { is_expected.to eq 3 }
+
+ context 'when diff hunk is broken' do
+ let(:line) { '@@ ??? @@' }
+
+ it { is_expected.to eq 0 }
+ end
+ end
+
+ describe '#pos_new' do
+ subject { diff_hunk.pos_new }
+
+ it { is_expected.to eq 4 }
+
+ context 'when diff hunk is broken' do
+ let(:line) { '@@ ??? @@' }
+
+ it { is_expected.to eq 0 }
+ end
+ end
+
+ describe '#first_line?' do
+ subject { diff_hunk.first_line? }
+
+ it { is_expected.to be_falsey }
+
+ context 'when diff hunk located on the first line' do
+ let(:line) { '@@ -1,14 +1,13 @@' }
+
+ it { is_expected.to be_truthy }
+ end
+ end
+
+ describe '#to_s' do
+ subject { diff_hunk.to_s }
+
+ it { is_expected.to eq(line) }
+ end
+end
diff --git a/spec/lib/gitlab/word_diff/segments/newline_spec.rb b/spec/lib/gitlab/word_diff/segments/newline_spec.rb
new file mode 100644
index 00000000000..ed5054844f1
--- /dev/null
+++ b/spec/lib/gitlab/word_diff/segments/newline_spec.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::WordDiff::Segments::Newline do
+ subject(:newline) { described_class.new }
+
+ describe '#to_s' do
+ subject { newline.to_s }
+
+ it { is_expected.to eq '' }
+ end
+end
diff --git a/spec/lib/gitlab/x509/signature_spec.rb b/spec/lib/gitlab/x509/signature_spec.rb
index ac6f7e49fe0..2ac9c1f3a3b 100644
--- a/spec/lib/gitlab/x509/signature_spec.rb
+++ b/spec/lib/gitlab/x509/signature_spec.rb
@@ -11,6 +11,65 @@ RSpec.describe Gitlab::X509::Signature do
}
end
+ shared_examples "a verified signature" do
+ it 'returns a verified signature if email does match' do
+ signature = described_class.new(
+ X509Helpers::User1.signed_commit_signature,
+ X509Helpers::User1.signed_commit_base_data,
+ X509Helpers::User1.certificate_email,
+ X509Helpers::User1.signed_commit_time
+ )
+
+ expect(signature.x509_certificate).to have_attributes(certificate_attributes)
+ expect(signature.x509_certificate.x509_issuer).to have_attributes(issuer_attributes)
+ expect(signature.verified_signature).to be_truthy
+ expect(signature.verification_status).to eq(:verified)
+ end
+
+ it 'returns an unverified signature if email does not match' do
+ signature = described_class.new(
+ X509Helpers::User1.signed_commit_signature,
+ X509Helpers::User1.signed_commit_base_data,
+ "gitlab@example.com",
+ X509Helpers::User1.signed_commit_time
+ )
+
+ expect(signature.x509_certificate).to have_attributes(certificate_attributes)
+ expect(signature.x509_certificate.x509_issuer).to have_attributes(issuer_attributes)
+ expect(signature.verified_signature).to be_truthy
+ expect(signature.verification_status).to eq(:unverified)
+ end
+
+ it 'returns an unverified signature if email does match and time is wrong' do
+ signature = described_class.new(
+ X509Helpers::User1.signed_commit_signature,
+ X509Helpers::User1.signed_commit_base_data,
+ X509Helpers::User1.certificate_email,
+ Time.new(2020, 2, 22)
+ )
+
+ expect(signature.x509_certificate).to have_attributes(certificate_attributes)
+ expect(signature.x509_certificate.x509_issuer).to have_attributes(issuer_attributes)
+ expect(signature.verified_signature).to be_falsey
+ expect(signature.verification_status).to eq(:unverified)
+ end
+
+ it 'returns an unverified signature if certificate is revoked' do
+ signature = described_class.new(
+ X509Helpers::User1.signed_commit_signature,
+ X509Helpers::User1.signed_commit_base_data,
+ X509Helpers::User1.certificate_email,
+ X509Helpers::User1.signed_commit_time
+ )
+
+ expect(signature.verification_status).to eq(:verified)
+
+ signature.x509_certificate.revoked!
+
+ expect(signature.verification_status).to eq(:unverified)
+ end
+ end
+
context 'commit signature' do
let(:certificate_attributes) do
{
@@ -30,62 +89,25 @@ RSpec.describe Gitlab::X509::Signature do
allow(OpenSSL::X509::Store).to receive(:new).and_return(store)
end
- it 'returns a verified signature if email does match' do
- signature = described_class.new(
- X509Helpers::User1.signed_commit_signature,
- X509Helpers::User1.signed_commit_base_data,
- X509Helpers::User1.certificate_email,
- X509Helpers::User1.signed_commit_time
- )
-
- expect(signature.x509_certificate).to have_attributes(certificate_attributes)
- expect(signature.x509_certificate.x509_issuer).to have_attributes(issuer_attributes)
- expect(signature.verified_signature).to be_truthy
- expect(signature.verification_status).to eq(:verified)
- end
+ it_behaves_like "a verified signature"
+ end
- it 'returns an unverified signature if email does not match' do
- signature = described_class.new(
- X509Helpers::User1.signed_commit_signature,
- X509Helpers::User1.signed_commit_base_data,
- "gitlab@example.com",
- X509Helpers::User1.signed_commit_time
- )
+ context 'with the certificate defined by OpenSSL::X509::DEFAULT_CERT_FILE' do
+ before do
+ store = OpenSSL::X509::Store.new
+ certificate = OpenSSL::X509::Certificate.new(X509Helpers::User1.trust_cert)
+ file_path = Rails.root.join("tmp/cert.pem").to_s
- expect(signature.x509_certificate).to have_attributes(certificate_attributes)
- expect(signature.x509_certificate.x509_issuer).to have_attributes(issuer_attributes)
- expect(signature.verified_signature).to be_truthy
- expect(signature.verification_status).to eq(:unverified)
- end
+ File.open(file_path, "wb") do |f|
+ f.print certificate.to_pem
+ end
- it 'returns an unverified signature if email does match and time is wrong' do
- signature = described_class.new(
- X509Helpers::User1.signed_commit_signature,
- X509Helpers::User1.signed_commit_base_data,
- X509Helpers::User1.certificate_email,
- Time.new(2020, 2, 22)
- )
+ stub_const("OpenSSL::X509::DEFAULT_CERT_FILE", file_path)
- expect(signature.x509_certificate).to have_attributes(certificate_attributes)
- expect(signature.x509_certificate.x509_issuer).to have_attributes(issuer_attributes)
- expect(signature.verified_signature).to be_falsey
- expect(signature.verification_status).to eq(:unverified)
+ allow(OpenSSL::X509::Store).to receive(:new).and_return(store)
end
- it 'returns an unverified signature if certificate is revoked' do
- signature = described_class.new(
- X509Helpers::User1.signed_commit_signature,
- X509Helpers::User1.signed_commit_base_data,
- X509Helpers::User1.certificate_email,
- X509Helpers::User1.signed_commit_time
- )
-
- expect(signature.verification_status).to eq(:verified)
-
- signature.x509_certificate.revoked!
-
- expect(signature.verification_status).to eq(:unverified)
- end
+ it_behaves_like "a verified signature"
end
context 'without trusted certificate within store' do
diff --git a/spec/lib/marginalia_spec.rb b/spec/lib/marginalia_spec.rb
index fa0cd214c7e..2ee27fbe20c 100644
--- a/spec/lib/marginalia_spec.rb
+++ b/spec/lib/marginalia_spec.rb
@@ -37,26 +37,9 @@ RSpec.describe 'Marginalia spec' do
}
end
- context 'when the feature is enabled' do
- before do
- stub_feature(true)
- end
-
- it 'generates a query that includes the component and value' do
- component_map.each do |component, value|
- expect(recorded.log.last).to include("#{component}:#{value}")
- end
- end
- end
-
- context 'when the feature is disabled' do
- before do
- stub_feature(false)
- end
-
- it 'excludes annotations in generated queries' do
- expect(recorded.log.last).not_to include("/*")
- expect(recorded.log.last).not_to include("*/")
+ it 'generates a query that includes the component and value' do
+ component_map.each do |component, value|
+ expect(recorded.log.last).to include("#{component}:#{value}")
end
end
end
@@ -90,59 +73,37 @@ RSpec.describe 'Marginalia spec' do
}
end
- context 'when the feature is enabled' do
- before do
- stub_feature(true)
+ it 'generates a query that includes the component and value' do
+ component_map.each do |component, value|
+ expect(recorded.log.last).to include("#{component}:#{value}")
end
+ end
- it 'generates a query that includes the component and value' do
- component_map.each do |component, value|
- expect(recorded.log.last).to include("#{component}:#{value}")
- end
- end
-
- describe 'for ActionMailer delivery jobs' do
- let(:delivery_job) { MarginaliaTestMailer.first_user.deliver_later }
-
- let(:recorded) do
- ActiveRecord::QueryRecorder.new do
- delivery_job.perform_now
- end
- end
-
- let(:component_map) do
- {
- "application" => "sidekiq",
- "jid" => delivery_job.job_id,
- "job_class" => delivery_job.arguments.first
- }
- end
+ describe 'for ActionMailer delivery jobs' do
+ let(:delivery_job) { MarginaliaTestMailer.first_user.deliver_later }
- it 'generates a query that includes the component and value' do
- component_map.each do |component, value|
- expect(recorded.log.last).to include("#{component}:#{value}")
- end
+ let(:recorded) do
+ ActiveRecord::QueryRecorder.new do
+ delivery_job.perform_now
end
end
- end
- context 'when the feature is disabled' do
- before do
- stub_feature(false)
+ let(:component_map) do
+ {
+ "application" => "sidekiq",
+ "jid" => delivery_job.job_id,
+ "job_class" => delivery_job.arguments.first
+ }
end
- it 'excludes annotations in generated queries' do
- expect(recorded.log.last).not_to include("/*")
- expect(recorded.log.last).not_to include("*/")
+ it 'generates a query that includes the component and value' do
+ component_map.each do |component, value|
+ expect(recorded.log.last).to include("#{component}:#{value}")
+ end
end
end
end
- def stub_feature(value)
- stub_feature_flags(marginalia: value)
- Gitlab::Marginalia.set_enabled_from_feature_flag
- end
-
def make_request(correlation_id)
request_env = Rack::MockRequest.env_for('/')
diff --git a/spec/lib/object_storage/direct_upload_spec.rb b/spec/lib/object_storage/direct_upload_spec.rb
index 547bba5117a..12c6cbe03b3 100644
--- a/spec/lib/object_storage/direct_upload_spec.rb
+++ b/spec/lib/object_storage/direct_upload_spec.rb
@@ -224,6 +224,17 @@ RSpec.describe ObjectStorage::DirectUpload do
expect(subject[:CustomPutHeaders]).to be_truthy
expect(subject[:PutHeaders]).to eq({})
end
+
+ context 'with an object with UTF-8 characters' do
+ let(:object_name) { 'tmp/uploads/テスト' }
+
+ it 'returns an escaped path' do
+ expect(subject[:GetURL]).to start_with(storage_url)
+
+ uri = Addressable::URI.parse(subject[:GetURL])
+ expect(uri.path).to include("tmp/uploads/#{CGI.escape("テスト")}")
+ end
+ end
end
shared_examples 'a valid upload with multipart data' do
diff --git a/spec/lib/pager_duty/webhook_payload_parser_spec.rb b/spec/lib/pager_duty/webhook_payload_parser_spec.rb
index 54c61b9121c..647f19e3d3a 100644
--- a/spec/lib/pager_duty/webhook_payload_parser_spec.rb
+++ b/spec/lib/pager_duty/webhook_payload_parser_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
-require 'fast_spec_helper'
-require 'json_schemer'
+require 'spec_helper'
RSpec.describe PagerDuty::WebhookPayloadParser do
describe '.call' do
diff --git a/spec/lib/peek/views/active_record_spec.rb b/spec/lib/peek/views/active_record_spec.rb
new file mode 100644
index 00000000000..dad5a2bf461
--- /dev/null
+++ b/spec/lib/peek/views/active_record_spec.rb
@@ -0,0 +1,71 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Peek::Views::ActiveRecord, :request_store do
+ subject { Peek.views.find { |v| v.instance_of?(Peek::Views::ActiveRecord) } }
+
+ let(:connection) { double(:connection) }
+
+ let(:event_1) do
+ {
+ name: 'SQL',
+ sql: 'SELECT * FROM users WHERE id = 10',
+ cached: false,
+ connection: connection
+ }
+ end
+
+ let(:event_2) do
+ {
+ name: 'SQL',
+ sql: 'SELECT * FROM users WHERE id = 10',
+ cached: true,
+ connection: connection
+ }
+ end
+
+ let(:event_3) do
+ {
+ name: 'SQL',
+ sql: 'UPDATE users SET admin = true WHERE id = 10',
+ cached: false,
+ connection: connection
+ }
+ end
+
+ before do
+ allow(Gitlab::PerformanceBar).to receive(:enabled_for_request?).and_return(true)
+ end
+
+ it 'subscribes and store data into peek views' do
+ Timecop.freeze(2021, 2, 23, 10, 0) do
+ ActiveSupport::Notifications.publish('sql.active_record', Time.current, Time.current + 1.second, '1', event_1)
+ ActiveSupport::Notifications.publish('sql.active_record', Time.current, Time.current + 2.seconds, '2', event_2)
+ ActiveSupport::Notifications.publish('sql.active_record', Time.current, Time.current + 3.seconds, '3', event_3)
+ end
+
+ expect(subject.results).to match(
+ calls: '3 (1 cached)',
+ duration: '6000.00ms',
+ warnings: ["active-record duration: 6000.0 over 3000"],
+ details: contain_exactly(
+ a_hash_including(
+ cached: '',
+ duration: 1000.0,
+ sql: 'SELECT * FROM users WHERE id = 10'
+ ),
+ a_hash_including(
+ cached: 'cached',
+ duration: 2000.0,
+ sql: 'SELECT * FROM users WHERE id = 10'
+ ),
+ a_hash_including(
+ cached: '',
+ duration: 3000.0,
+ sql: 'UPDATE users SET admin = true WHERE id = 10'
+ )
+ )
+ )
+ end
+end
diff --git a/spec/lib/quality/test_level_spec.rb b/spec/lib/quality/test_level_spec.rb
index 2232d47234f..32960cd571b 100644
--- a/spec/lib/quality/test_level_spec.rb
+++ b/spec/lib/quality/test_level_spec.rb
@@ -28,7 +28,7 @@ RSpec.describe Quality::TestLevel do
context 'when level is unit' do
it 'returns a pattern' do
expect(subject.pattern(:unit))
- .to eq("spec/{bin,channels,config,db,dependencies,elastic,elastic_integration,experiments,factories,finders,frontend,graphql,haml_lint,helpers,initializers,javascripts,lib,models,policies,presenters,rack_servers,replicators,routing,rubocop,serializers,services,sidekiq,support_specs,tasks,uploaders,validators,views,workers,tooling}{,/**/}*_spec.rb")
+ .to eq("spec/{bin,channels,config,db,dependencies,elastic,elastic_integration,experiments,factories,finders,frontend,graphql,haml_lint,helpers,initializers,javascripts,lib,models,policies,presenters,rack_servers,replicators,routing,rubocop,serializers,services,sidekiq,spam,support_specs,tasks,uploaders,validators,views,workers,tooling}{,/**/}*_spec.rb")
end
end
@@ -103,7 +103,7 @@ RSpec.describe Quality::TestLevel do
context 'when level is unit' do
it 'returns a regexp' do
expect(subject.regexp(:unit))
- .to eq(%r{spec/(bin|channels|config|db|dependencies|elastic|elastic_integration|experiments|factories|finders|frontend|graphql|haml_lint|helpers|initializers|javascripts|lib|models|policies|presenters|rack_servers|replicators|routing|rubocop|serializers|services|sidekiq|support_specs|tasks|uploaders|validators|views|workers|tooling)})
+ .to eq(%r{spec/(bin|channels|config|db|dependencies|elastic|elastic_integration|experiments|factories|finders|frontend|graphql|haml_lint|helpers|initializers|javascripts|lib|models|policies|presenters|rack_servers|replicators|routing|rubocop|serializers|services|sidekiq|spam|support_specs|tasks|uploaders|validators|views|workers|tooling)})
end
end
diff --git a/spec/lib/release_highlights/validator/entry_spec.rb b/spec/lib/release_highlights/validator/entry_spec.rb
index da44938f165..5f7ccbf4310 100644
--- a/spec/lib/release_highlights/validator/entry_spec.rb
+++ b/spec/lib/release_highlights/validator/entry_spec.rb
@@ -40,8 +40,8 @@ RSpec.describe ReleaseHighlights::Validator::Entry do
end
it 'validates boolean value of "self-managed" and "gitlab-com"' do
- allow(entry).to receive(:value_for).with('self-managed').and_return('nope')
- allow(entry).to receive(:value_for).with('gitlab-com').and_return('yerp')
+ allow(entry).to receive(:value_for).with(:'self-managed').and_return('nope')
+ allow(entry).to receive(:value_for).with(:'gitlab-com').and_return('yerp')
subject.valid?
@@ -50,17 +50,18 @@ RSpec.describe ReleaseHighlights::Validator::Entry do
end
it 'validates URI of "url" and "image_url"' do
- allow(entry).to receive(:value_for).with('image_url').and_return('imgur/gitlab_feature.gif')
- allow(entry).to receive(:value_for).with('url').and_return('gitlab/newest_release.html')
+ stub_env('RSPEC_ALLOW_INVALID_URLS', 'false')
+ allow(entry).to receive(:value_for).with(:image_url).and_return('https://foobar.x/images/ci/gitlab-ci-cd-logo_2x.png')
+ allow(entry).to receive(:value_for).with(:url).and_return('')
subject.valid?
- expect(subject.errors[:url]).to include(/must be a URL/)
- expect(subject.errors[:image_url]).to include(/must be a URL/)
+ expect(subject.errors[:url]).to include(/must be a valid URL/)
+ expect(subject.errors[:image_url]).to include(/is blocked: Host cannot be resolved or invalid/)
end
it 'validates release is numerical' do
- allow(entry).to receive(:value_for).with('release').and_return('one')
+ allow(entry).to receive(:value_for).with(:release).and_return('one')
subject.valid?
@@ -68,7 +69,7 @@ RSpec.describe ReleaseHighlights::Validator::Entry do
end
it 'validates published_at is a date' do
- allow(entry).to receive(:value_for).with('published_at').and_return('christmas day')
+ allow(entry).to receive(:value_for).with(:published_at).and_return('christmas day')
subject.valid?
@@ -76,7 +77,7 @@ RSpec.describe ReleaseHighlights::Validator::Entry do
end
it 'validates packages are included in list' do
- allow(entry).to receive(:value_for).with('packages').and_return(['ALL'])
+ allow(entry).to receive(:value_for).with(:packages).and_return(['ALL'])
subject.valid?
diff --git a/spec/lib/release_highlights/validator_spec.rb b/spec/lib/release_highlights/validator_spec.rb
index a423e8cc5f6..f30754b4167 100644
--- a/spec/lib/release_highlights/validator_spec.rb
+++ b/spec/lib/release_highlights/validator_spec.rb
@@ -78,7 +78,10 @@ RSpec.describe ReleaseHighlights::Validator do
end
describe 'when validating all files' do
- it 'they should have no errors' do
+ # Permit DNS requests to validate all URLs in the YAML files
+ it 'they should have no errors', :permit_dns do
+ stub_env('RSPEC_ALLOW_INVALID_URLS', 'false')
+
expect(described_class.validate_all!).to be_truthy, described_class.error_message
end
end
diff --git a/spec/lib/rspec_flaky/config_spec.rb b/spec/lib/rspec_flaky/config_spec.rb
deleted file mode 100644
index 6b148599b67..00000000000
--- a/spec/lib/rspec_flaky/config_spec.rb
+++ /dev/null
@@ -1,106 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe RspecFlaky::Config, :aggregate_failures do
- before do
- # Stub these env variables otherwise specs don't behave the same on the CI
- stub_env('FLAKY_RSPEC_GENERATE_REPORT', nil)
- stub_env('SUITE_FLAKY_RSPEC_REPORT_PATH', nil)
- stub_env('FLAKY_RSPEC_REPORT_PATH', nil)
- stub_env('NEW_FLAKY_RSPEC_REPORT_PATH', nil)
- end
-
- describe '.generate_report?' do
- context "when ENV['FLAKY_RSPEC_GENERATE_REPORT'] is not set" do
- it 'returns false' do
- expect(described_class).not_to be_generate_report
- end
- end
-
- context "when ENV['FLAKY_RSPEC_GENERATE_REPORT'] is set" do
- using RSpec::Parameterized::TableSyntax
-
- where(:env_value, :result) do
- '1' | true
- 'true' | true
- 'foo' | false
- '0' | false
- 'false' | false
- end
-
- with_them do
- before do
- stub_env('FLAKY_RSPEC_GENERATE_REPORT', env_value)
- end
-
- it 'returns false' do
- expect(described_class.generate_report?).to be(result)
- end
- end
- end
- end
-
- describe '.suite_flaky_examples_report_path' do
- context "when ENV['SUITE_FLAKY_RSPEC_REPORT_PATH'] is not set" do
- it 'returns the default path' do
- expect(Rails.root).to receive(:join).with('rspec_flaky/suite-report.json')
- .and_return('root/rspec_flaky/suite-report.json')
-
- expect(described_class.suite_flaky_examples_report_path).to eq('root/rspec_flaky/suite-report.json')
- end
- end
-
- context "when ENV['SUITE_FLAKY_RSPEC_REPORT_PATH'] is set" do
- before do
- stub_env('SUITE_FLAKY_RSPEC_REPORT_PATH', 'foo/suite-report.json')
- end
-
- it 'returns the value of the env variable' do
- expect(described_class.suite_flaky_examples_report_path).to eq('foo/suite-report.json')
- end
- end
- end
-
- describe '.flaky_examples_report_path' do
- context "when ENV['FLAKY_RSPEC_REPORT_PATH'] is not set" do
- it 'returns the default path' do
- expect(Rails.root).to receive(:join).with('rspec_flaky/report.json')
- .and_return('root/rspec_flaky/report.json')
-
- expect(described_class.flaky_examples_report_path).to eq('root/rspec_flaky/report.json')
- end
- end
-
- context "when ENV['FLAKY_RSPEC_REPORT_PATH'] is set" do
- before do
- stub_env('FLAKY_RSPEC_REPORT_PATH', 'foo/report.json')
- end
-
- it 'returns the value of the env variable' do
- expect(described_class.flaky_examples_report_path).to eq('foo/report.json')
- end
- end
- end
-
- describe '.new_flaky_examples_report_path' do
- context "when ENV['NEW_FLAKY_RSPEC_REPORT_PATH'] is not set" do
- it 'returns the default path' do
- expect(Rails.root).to receive(:join).with('rspec_flaky/new-report.json')
- .and_return('root/rspec_flaky/new-report.json')
-
- expect(described_class.new_flaky_examples_report_path).to eq('root/rspec_flaky/new-report.json')
- end
- end
-
- context "when ENV['NEW_FLAKY_RSPEC_REPORT_PATH'] is set" do
- before do
- stub_env('NEW_FLAKY_RSPEC_REPORT_PATH', 'foo/new-report.json')
- end
-
- it 'returns the value of the env variable' do
- expect(described_class.new_flaky_examples_report_path).to eq('foo/new-report.json')
- end
- end
- end
-end
diff --git a/spec/lib/rspec_flaky/example_spec.rb b/spec/lib/rspec_flaky/example_spec.rb
deleted file mode 100644
index 4b45a15c463..00000000000
--- a/spec/lib/rspec_flaky/example_spec.rb
+++ /dev/null
@@ -1,92 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe RspecFlaky::Example do
- let(:example_attrs) do
- {
- id: 'spec/foo/bar_spec.rb:2',
- metadata: {
- file_path: 'spec/foo/bar_spec.rb',
- line_number: 2,
- full_description: 'hello world'
- },
- execution_result: double(status: 'passed', exception: 'BOOM!'),
- attempts: 1
- }
- end
-
- let(:rspec_example) { double(example_attrs) }
-
- describe '#initialize' do
- shared_examples 'a valid Example instance' do
- it 'returns valid attributes' do
- example = described_class.new(args)
-
- expect(example.example_id).to eq(example_attrs[:id])
- end
- end
-
- context 'when given an Rspec::Core::Example that responds to #example' do
- let(:args) { double(example: rspec_example) }
-
- it_behaves_like 'a valid Example instance'
- end
-
- context 'when given an Rspec::Core::Example that does not respond to #example' do
- let(:args) { rspec_example }
-
- it_behaves_like 'a valid Example instance'
- end
- end
-
- subject { described_class.new(rspec_example) }
-
- describe '#uid' do
- it 'returns a hash of the full description' do
- expect(subject.uid).to eq(Digest::MD5.hexdigest("#{subject.description}-#{subject.file}"))
- end
- end
-
- describe '#example_id' do
- it 'returns the ID of the RSpec::Core::Example' do
- expect(subject.example_id).to eq(rspec_example.id)
- end
- end
-
- describe '#attempts' do
- it 'returns the attempts of the RSpec::Core::Example' do
- expect(subject.attempts).to eq(rspec_example.attempts)
- end
- end
-
- describe '#file' do
- it 'returns the metadata[:file_path] of the RSpec::Core::Example' do
- expect(subject.file).to eq(rspec_example.metadata[:file_path])
- end
- end
-
- describe '#line' do
- it 'returns the metadata[:line_number] of the RSpec::Core::Example' do
- expect(subject.line).to eq(rspec_example.metadata[:line_number])
- end
- end
-
- describe '#description' do
- it 'returns the metadata[:full_description] of the RSpec::Core::Example' do
- expect(subject.description).to eq(rspec_example.metadata[:full_description])
- end
- end
-
- describe '#status' do
- it 'returns the execution_result.status of the RSpec::Core::Example' do
- expect(subject.status).to eq(rspec_example.execution_result.status)
- end
- end
-
- describe '#exception' do
- it 'returns the execution_result.exception of the RSpec::Core::Example' do
- expect(subject.exception).to eq(rspec_example.execution_result.exception)
- end
- end
-end
diff --git a/spec/lib/rspec_flaky/flaky_example_spec.rb b/spec/lib/rspec_flaky/flaky_example_spec.rb
deleted file mode 100644
index b1647d5830a..00000000000
--- a/spec/lib/rspec_flaky/flaky_example_spec.rb
+++ /dev/null
@@ -1,165 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe RspecFlaky::FlakyExample, :aggregate_failures do
- let(:flaky_example_attrs) do
- {
- example_id: 'spec/foo/bar_spec.rb:2',
- file: 'spec/foo/bar_spec.rb',
- line: 2,
- description: 'hello world',
- first_flaky_at: 1234,
- last_flaky_at: 2345,
- last_flaky_job: 'https://gitlab.com/gitlab-org/gitlab-foss/-/jobs/12',
- last_attempts_count: 2,
- flaky_reports: 1
- }
- end
-
- let(:example_attrs) do
- {
- uid: 'abc123',
- example_id: flaky_example_attrs[:example_id],
- file: flaky_example_attrs[:file],
- line: flaky_example_attrs[:line],
- description: flaky_example_attrs[:description],
- status: 'passed',
- exception: 'BOOM!',
- attempts: flaky_example_attrs[:last_attempts_count]
- }
- end
-
- let(:example) { double(example_attrs) }
-
- before do
- # Stub these env variables otherwise specs don't behave the same on the CI
- stub_env('CI_PROJECT_URL', nil)
- stub_env('CI_JOB_ID', nil)
- end
-
- describe '#initialize' do
- shared_examples 'a valid FlakyExample instance' do
- let(:flaky_example) { described_class.new(args) }
-
- it 'returns valid attributes' do
- expect(flaky_example.uid).to eq(flaky_example_attrs[:uid])
- expect(flaky_example.file).to eq(flaky_example_attrs[:file])
- expect(flaky_example.line).to eq(flaky_example_attrs[:line])
- expect(flaky_example.description).to eq(flaky_example_attrs[:description])
- expect(flaky_example.first_flaky_at).to eq(expected_first_flaky_at)
- expect(flaky_example.last_flaky_at).to eq(expected_last_flaky_at)
- expect(flaky_example.last_attempts_count).to eq(flaky_example_attrs[:last_attempts_count])
- expect(flaky_example.flaky_reports).to eq(expected_flaky_reports)
- end
- end
-
- context 'when given an Rspec::Example' do
- it_behaves_like 'a valid FlakyExample instance' do
- let(:args) { example }
- let(:expected_first_flaky_at) { nil }
- let(:expected_last_flaky_at) { nil }
- let(:expected_flaky_reports) { 0 }
- end
- end
-
- context 'when given a hash' do
- it_behaves_like 'a valid FlakyExample instance' do
- let(:args) { flaky_example_attrs }
- let(:expected_flaky_reports) { flaky_example_attrs[:flaky_reports] }
- let(:expected_first_flaky_at) { flaky_example_attrs[:first_flaky_at] }
- let(:expected_last_flaky_at) { flaky_example_attrs[:last_flaky_at] }
- end
- end
- end
-
- describe '#update_flakiness!' do
- shared_examples 'an up-to-date FlakyExample instance' do
- let(:flaky_example) { described_class.new(args) }
-
- it 'updates the first_flaky_at' do
- now = Time.now
- expected_first_flaky_at = flaky_example.first_flaky_at || now
- Timecop.freeze(now) { flaky_example.update_flakiness! }
-
- expect(flaky_example.first_flaky_at).to eq(expected_first_flaky_at)
- end
-
- it 'updates the last_flaky_at' do
- now = Time.now
- Timecop.freeze(now) { flaky_example.update_flakiness! }
-
- expect(flaky_example.last_flaky_at).to eq(now)
- end
-
- it 'updates the flaky_reports' do
- expected_flaky_reports = flaky_example.first_flaky_at ? flaky_example.flaky_reports + 1 : 1
-
- expect { flaky_example.update_flakiness! }.to change { flaky_example.flaky_reports }.by(1)
- expect(flaky_example.flaky_reports).to eq(expected_flaky_reports)
- end
-
- context 'when passed a :last_attempts_count' do
- it 'updates the last_attempts_count' do
- flaky_example.update_flakiness!(last_attempts_count: 42)
-
- expect(flaky_example.last_attempts_count).to eq(42)
- end
- end
-
- context 'when run on the CI' do
- before do
- stub_env('CI_PROJECT_URL', 'https://gitlab.com/gitlab-org/gitlab-foss')
- stub_env('CI_JOB_ID', 42)
- end
-
- it 'updates the last_flaky_job' do
- flaky_example.update_flakiness!
-
- expect(flaky_example.last_flaky_job).to eq('https://gitlab.com/gitlab-org/gitlab-foss/-/jobs/42')
- end
- end
- end
-
- context 'when given an Rspec::Example' do
- it_behaves_like 'an up-to-date FlakyExample instance' do
- let(:args) { example }
- end
- end
-
- context 'when given a hash' do
- it_behaves_like 'an up-to-date FlakyExample instance' do
- let(:args) { flaky_example_attrs }
- end
- end
- end
-
- describe '#to_h' do
- shared_examples 'a valid FlakyExample hash' do
- let(:additional_attrs) { {} }
-
- it 'returns a valid hash' do
- flaky_example = described_class.new(args)
- final_hash = flaky_example_attrs.merge(additional_attrs)
-
- expect(flaky_example.to_h).to eq(final_hash)
- end
- end
-
- context 'when given an Rspec::Example' do
- let(:args) { example }
-
- it_behaves_like 'a valid FlakyExample hash' do
- let(:additional_attrs) do
- { first_flaky_at: nil, last_flaky_at: nil, last_flaky_job: nil, flaky_reports: 0 }
- end
- end
- end
-
- context 'when given a hash' do
- let(:args) { flaky_example_attrs }
-
- it_behaves_like 'a valid FlakyExample hash'
- end
- end
-end
diff --git a/spec/lib/rspec_flaky/flaky_examples_collection_spec.rb b/spec/lib/rspec_flaky/flaky_examples_collection_spec.rb
deleted file mode 100644
index b2fd1d3733a..00000000000
--- a/spec/lib/rspec_flaky/flaky_examples_collection_spec.rb
+++ /dev/null
@@ -1,74 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe RspecFlaky::FlakyExamplesCollection, :aggregate_failures do
- let(:collection_hash) do
- {
- a: { example_id: 'spec/foo/bar_spec.rb:2' },
- b: { example_id: 'spec/foo/baz_spec.rb:3' }
- }
- end
-
- let(:collection_report) do
- {
- a: {
- example_id: 'spec/foo/bar_spec.rb:2',
- first_flaky_at: nil,
- last_flaky_at: nil,
- last_flaky_job: nil
- },
- b: {
- example_id: 'spec/foo/baz_spec.rb:3',
- first_flaky_at: nil,
- last_flaky_at: nil,
- last_flaky_job: nil
- }
- }
- end
-
- describe '#initialize' do
- it 'accepts no argument' do
- expect { described_class.new }.not_to raise_error
- end
-
- it 'accepts a hash' do
- expect { described_class.new(collection_hash) }.not_to raise_error
- end
-
- it 'does not accept anything else' do
- expect { described_class.new([1, 2, 3]) }.to raise_error(ArgumentError, "`collection` must be a Hash, Array given!")
- end
- end
-
- describe '#to_h' do
- it 'calls #to_h on the values' do
- collection = described_class.new(collection_hash)
-
- expect(collection.to_h).to eq(collection_report)
- end
- end
-
- describe '#-' do
- it 'returns only examples that are not present in the given collection' do
- collection1 = described_class.new(collection_hash)
- collection2 = described_class.new(
- a: { example_id: 'spec/foo/bar_spec.rb:2' },
- c: { example_id: 'spec/bar/baz_spec.rb:4' })
-
- expect((collection2 - collection1).to_h).to eq(
- c: {
- example_id: 'spec/bar/baz_spec.rb:4',
- first_flaky_at: nil,
- last_flaky_at: nil,
- last_flaky_job: nil
- })
- end
-
- it 'fails if the given collection does not respond to `#key?`' do
- collection = described_class.new(collection_hash)
-
- expect { collection - [1, 2, 3] }.to raise_error(ArgumentError, "`other` must respond to `#key?`, Array does not!")
- end
- end
-end
diff --git a/spec/lib/rspec_flaky/listener_spec.rb b/spec/lib/rspec_flaky/listener_spec.rb
deleted file mode 100644
index 10ed724d4de..00000000000
--- a/spec/lib/rspec_flaky/listener_spec.rb
+++ /dev/null
@@ -1,219 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe RspecFlaky::Listener, :aggregate_failures do
- let(:already_flaky_example_uid) { '6e869794f4cfd2badd93eb68719371d1' }
- let(:suite_flaky_example_report) do
- {
- "#{already_flaky_example_uid}": {
- example_id: 'spec/foo/bar_spec.rb:2',
- file: 'spec/foo/bar_spec.rb',
- line: 2,
- description: 'hello world',
- first_flaky_at: 1234,
- last_flaky_at: 4321,
- last_attempts_count: 3,
- flaky_reports: 1,
- last_flaky_job: nil
- }
- }
- end
-
- let(:already_flaky_example_attrs) do
- {
- id: 'spec/foo/bar_spec.rb:2',
- metadata: {
- file_path: 'spec/foo/bar_spec.rb',
- line_number: 2,
- full_description: 'hello world'
- },
- execution_result: double(status: 'passed', exception: nil)
- }
- end
-
- let(:already_flaky_example) { RspecFlaky::FlakyExample.new(suite_flaky_example_report[already_flaky_example_uid]) }
- let(:new_example_attrs) do
- {
- id: 'spec/foo/baz_spec.rb:3',
- metadata: {
- file_path: 'spec/foo/baz_spec.rb',
- line_number: 3,
- full_description: 'hello GitLab'
- },
- execution_result: double(status: 'passed', exception: nil)
- }
- end
-
- before do
- # Stub these env variables otherwise specs don't behave the same on the CI
- stub_env('CI_PROJECT_URL', nil)
- stub_env('CI_JOB_ID', nil)
- stub_env('SUITE_FLAKY_RSPEC_REPORT_PATH', nil)
- end
-
- describe '#initialize' do
- shared_examples 'a valid Listener instance' do
- let(:expected_suite_flaky_examples) { {} }
-
- it 'returns a valid Listener instance' do
- listener = described_class.new
-
- expect(listener.suite_flaky_examples.to_h).to eq(expected_suite_flaky_examples)
- expect(listener.flaky_examples).to eq({})
- end
- end
-
- context 'when no report file exists' do
- it_behaves_like 'a valid Listener instance'
- end
-
- context 'when SUITE_FLAKY_RSPEC_REPORT_PATH is set' do
- let(:report_file_path) { 'foo/report.json' }
-
- before do
- stub_env('SUITE_FLAKY_RSPEC_REPORT_PATH', report_file_path)
- end
-
- context 'and report file exists' do
- before do
- expect(File).to receive(:exist?).with(report_file_path).and_return(true)
- end
-
- it 'delegates the load to RspecFlaky::Report' do
- report = RspecFlaky::Report.new(RspecFlaky::FlakyExamplesCollection.new(suite_flaky_example_report))
-
- expect(RspecFlaky::Report).to receive(:load).with(report_file_path).and_return(report)
- expect(described_class.new.suite_flaky_examples.to_h).to eq(report.flaky_examples.to_h)
- end
- end
-
- context 'and report file does not exist' do
- before do
- expect(File).to receive(:exist?).with(report_file_path).and_return(false)
- end
-
- it 'return an empty hash' do
- expect(RspecFlaky::Report).not_to receive(:load)
- expect(described_class.new.suite_flaky_examples.to_h).to eq({})
- end
- end
- end
- end
-
- describe '#example_passed' do
- let(:rspec_example) { double(new_example_attrs) }
- let(:notification) { double(example: rspec_example) }
- let(:listener) { described_class.new(suite_flaky_example_report.to_json) }
-
- shared_examples 'a non-flaky example' do
- it 'does not change the flaky examples hash' do
- expect { listener.example_passed(notification) }
- .not_to change { listener.flaky_examples }
- end
- end
-
- shared_examples 'an existing flaky example' do
- let(:expected_flaky_example) do
- {
- example_id: 'spec/foo/bar_spec.rb:2',
- file: 'spec/foo/bar_spec.rb',
- line: 2,
- description: 'hello world',
- first_flaky_at: 1234,
- last_attempts_count: 2,
- flaky_reports: 2,
- last_flaky_job: nil
- }
- end
-
- it 'changes the flaky examples hash' do
- new_example = RspecFlaky::Example.new(rspec_example)
-
- now = Time.now
- Timecop.freeze(now) do
- expect { listener.example_passed(notification) }
- .to change { listener.flaky_examples[new_example.uid].to_h }
- end
-
- expect(listener.flaky_examples[new_example.uid].to_h)
- .to eq(expected_flaky_example.merge(last_flaky_at: now))
- end
- end
-
- shared_examples 'a new flaky example' do
- let(:expected_flaky_example) do
- {
- example_id: 'spec/foo/baz_spec.rb:3',
- file: 'spec/foo/baz_spec.rb',
- line: 3,
- description: 'hello GitLab',
- last_attempts_count: 2,
- flaky_reports: 1,
- last_flaky_job: nil
- }
- end
-
- it 'changes the all flaky examples hash' do
- new_example = RspecFlaky::Example.new(rspec_example)
-
- now = Time.now
- Timecop.freeze(now) do
- expect { listener.example_passed(notification) }
- .to change { listener.flaky_examples[new_example.uid].to_h }
- end
-
- expect(listener.flaky_examples[new_example.uid].to_h)
- .to eq(expected_flaky_example.merge(first_flaky_at: now, last_flaky_at: now))
- end
- end
-
- describe 'when the RSpec example does not respond to attempts' do
- it_behaves_like 'a non-flaky example'
- end
-
- describe 'when the RSpec example has 1 attempt' do
- let(:rspec_example) { double(new_example_attrs.merge(attempts: 1)) }
-
- it_behaves_like 'a non-flaky example'
- end
-
- describe 'when the RSpec example has 2 attempts' do
- let(:rspec_example) { double(new_example_attrs.merge(attempts: 2)) }
-
- it_behaves_like 'a new flaky example'
-
- context 'with an existing flaky example' do
- let(:rspec_example) { double(already_flaky_example_attrs.merge(attempts: 2)) }
-
- it_behaves_like 'an existing flaky example'
- end
- end
- end
-
- describe '#dump_summary' do
- let(:listener) { described_class.new(suite_flaky_example_report.to_json) }
- let(:new_flaky_rspec_example) { double(new_example_attrs.merge(attempts: 2)) }
- let(:already_flaky_rspec_example) { double(already_flaky_example_attrs.merge(attempts: 2)) }
- let(:notification_new_flaky_rspec_example) { double(example: new_flaky_rspec_example) }
- let(:notification_already_flaky_rspec_example) { double(example: already_flaky_rspec_example) }
-
- context 'when a report file path is set by FLAKY_RSPEC_REPORT_PATH' do
- it 'delegates the writes to RspecFlaky::Report' do
- listener.example_passed(notification_new_flaky_rspec_example)
- listener.example_passed(notification_already_flaky_rspec_example)
-
- report1 = double
- report2 = double
-
- expect(RspecFlaky::Report).to receive(:new).with(listener.flaky_examples).and_return(report1)
- expect(report1).to receive(:write).with(RspecFlaky::Config.flaky_examples_report_path)
-
- expect(RspecFlaky::Report).to receive(:new).with(listener.flaky_examples - listener.suite_flaky_examples).and_return(report2)
- expect(report2).to receive(:write).with(RspecFlaky::Config.new_flaky_examples_report_path)
-
- listener.dump_summary(nil)
- end
- end
- end
-end
diff --git a/spec/lib/rspec_flaky/report_spec.rb b/spec/lib/rspec_flaky/report_spec.rb
deleted file mode 100644
index 5cacfdb82fb..00000000000
--- a/spec/lib/rspec_flaky/report_spec.rb
+++ /dev/null
@@ -1,129 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe RspecFlaky::Report, :aggregate_failures do
- let(:thirty_one_days) { 3600 * 24 * 31 }
- let(:collection_hash) do
- {
- a: { example_id: 'spec/foo/bar_spec.rb:2' },
- b: { example_id: 'spec/foo/baz_spec.rb:3', first_flaky_at: (Time.now - thirty_one_days).to_s, last_flaky_at: (Time.now - thirty_one_days).to_s }
- }
- end
-
- let(:suite_flaky_example_report) do
- {
- '6e869794f4cfd2badd93eb68719371d1': {
- example_id: 'spec/foo/bar_spec.rb:2',
- file: 'spec/foo/bar_spec.rb',
- line: 2,
- description: 'hello world',
- first_flaky_at: 1234,
- last_flaky_at: 4321,
- last_attempts_count: 3,
- flaky_reports: 1,
- last_flaky_job: nil
- }
- }
- end
-
- let(:flaky_examples) { RspecFlaky::FlakyExamplesCollection.new(collection_hash) }
- let(:report) { described_class.new(flaky_examples) }
-
- describe '.load' do
- let!(:report_file) do
- Tempfile.new(%w[rspec_flaky_report .json]).tap do |f|
- f.write(Gitlab::Json.pretty_generate(suite_flaky_example_report))
- f.rewind
- end
- end
-
- after do
- report_file.close
- report_file.unlink
- end
-
- it 'loads the report file' do
- expect(described_class.load(report_file.path).flaky_examples.to_h).to eq(suite_flaky_example_report)
- end
- end
-
- describe '.load_json' do
- let(:report_json) do
- Gitlab::Json.pretty_generate(suite_flaky_example_report)
- end
-
- it 'loads the report file' do
- expect(described_class.load_json(report_json).flaky_examples.to_h).to eq(suite_flaky_example_report)
- end
- end
-
- describe '#initialize' do
- it 'accepts a RspecFlaky::FlakyExamplesCollection' do
- expect { report }.not_to raise_error
- end
-
- it 'does not accept anything else' do
- expect { described_class.new([1, 2, 3]) }.to raise_error(ArgumentError, "`flaky_examples` must be a RspecFlaky::FlakyExamplesCollection, Array given!")
- end
- end
-
- it 'delegates to #flaky_examples using SimpleDelegator' do
- expect(report.__getobj__).to eq(flaky_examples)
- end
-
- describe '#write' do
- let(:report_file_path) { Rails.root.join('tmp', 'rspec_flaky_report.json') }
-
- before do
- FileUtils.rm(report_file_path) if File.exist?(report_file_path)
- end
-
- after do
- FileUtils.rm(report_file_path) if File.exist?(report_file_path)
- end
-
- context 'when RspecFlaky::Config.generate_report? is false' do
- before do
- allow(RspecFlaky::Config).to receive(:generate_report?).and_return(false)
- end
-
- it 'does not write any report file' do
- report.write(report_file_path)
-
- expect(File.exist?(report_file_path)).to be(false)
- end
- end
-
- context 'when RspecFlaky::Config.generate_report? is true' do
- before do
- allow(RspecFlaky::Config).to receive(:generate_report?).and_return(true)
- end
-
- it 'delegates the writes to RspecFlaky::Report' do
- report.write(report_file_path)
-
- expect(File.exist?(report_file_path)).to be(true)
- expect(File.read(report_file_path))
- .to eq(Gitlab::Json.pretty_generate(report.flaky_examples.to_h))
- end
- end
- end
-
- describe '#prune_outdated' do
- it 'returns a new collection without the examples older than 30 days by default' do
- new_report = flaky_examples.to_h.dup.tap { |r| r.delete(:b) }
- new_flaky_examples = report.prune_outdated
-
- expect(new_flaky_examples).to be_a(described_class)
- expect(new_flaky_examples.to_h).to eq(new_report)
- expect(flaky_examples).to have_key(:b)
- end
-
- it 'accepts a given number of days' do
- new_flaky_examples = report.prune_outdated(days: 32)
-
- expect(new_flaky_examples.to_h).to eq(report.to_h)
- end
- end
-end
diff --git a/spec/lib/sentry/api_urls_spec.rb b/spec/lib/sentry/api_urls_spec.rb
deleted file mode 100644
index d56b4397e1c..00000000000
--- a/spec/lib/sentry/api_urls_spec.rb
+++ /dev/null
@@ -1,85 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Sentry::ApiUrls do
- let(:sentry_url) { 'https://sentrytest.gitlab.com/api/0/projects/sentry-org/sentry-project/' }
- let(:token) { 'test-token' }
- let(:issue_id) { '123456' }
- let(:issue_id_with_reserved_chars) { '123$%' }
- let(:escaped_issue_id) { '123%24%25' }
- let(:api_urls) { Sentry::ApiUrls.new(sentry_url) }
-
- # Sentry API returns 404 if there are extra slashes in the URL!
- shared_examples 'correct url with extra slashes' do
- let(:sentry_url) { 'https://sentrytest.gitlab.com/api/0/projects//sentry-org/sentry-project/' }
-
- it_behaves_like 'correct url'
- end
-
- shared_examples 'correctly escapes issue ID' do
- context 'with param a string with reserved chars' do
- let(:issue_id) { issue_id_with_reserved_chars }
-
- it { expect(subject.to_s).to include(escaped_issue_id) }
- end
-
- context 'with param a symbol with reserved chars' do
- let(:issue_id) { issue_id_with_reserved_chars.to_sym }
-
- it { expect(subject.to_s).to include(escaped_issue_id) }
- end
-
- context 'with param an integer' do
- let(:issue_id) { 12345678 }
-
- it { expect(subject.to_s).to include(issue_id.to_s) }
- end
- end
-
- describe '#issues_url' do
- subject { api_urls.issues_url }
-
- shared_examples 'correct url' do
- it { is_expected.to eq_uri('https://sentrytest.gitlab.com/api/0/projects/sentry-org/sentry-project/issues/') }
- end
-
- it_behaves_like 'correct url'
- it_behaves_like 'correct url with extra slashes'
- end
-
- describe '#issue_url' do
- subject { api_urls.issue_url(issue_id) }
-
- shared_examples 'correct url' do
- it { is_expected.to eq_uri("https://sentrytest.gitlab.com/api/0/issues/#{issue_id}/") }
- end
-
- it_behaves_like 'correct url'
- it_behaves_like 'correct url with extra slashes'
- it_behaves_like 'correctly escapes issue ID'
- end
-
- describe '#projects_url' do
- subject { api_urls.projects_url }
-
- shared_examples 'correct url' do
- it { is_expected.to eq_uri('https://sentrytest.gitlab.com/api/0/projects/') }
- end
-
- it_behaves_like 'correct url'
- it_behaves_like 'correct url with extra slashes'
- end
-
- describe '#issue_latest_event_url' do
- subject { api_urls.issue_latest_event_url(issue_id) }
-
- shared_examples 'correct url' do
- it { is_expected.to eq_uri("https://sentrytest.gitlab.com/api/0/issues/#{issue_id}/events/latest/") }
- end
-
- it_behaves_like 'correct url'
- it_behaves_like 'correct url with extra slashes'
- it_behaves_like 'correctly escapes issue ID'
- end
-end
diff --git a/spec/lib/sentry/client/event_spec.rb b/spec/lib/sentry/client/event_spec.rb
deleted file mode 100644
index 07ed331c44c..00000000000
--- a/spec/lib/sentry/client/event_spec.rb
+++ /dev/null
@@ -1,75 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Sentry::Client do
- include SentryClientHelpers
-
- let(:sentry_url) { 'https://sentrytest.gitlab.com/api/0/projects/sentry-org/sentry-project' }
- let(:token) { 'test-token' }
- let(:default_httparty_options) do
- {
- follow_redirects: false,
- headers: { "Authorization" => "Bearer test-token" }
- }
- end
-
- let(:client) { described_class.new(sentry_url, token) }
-
- describe '#issue_latest_event' do
- let(:sample_response) do
- Gitlab::Utils.deep_indifferent_access(
- Gitlab::Json.parse(fixture_file('sentry/issue_latest_event_sample_response.json'))
- )
- end
-
- let(:issue_id) { '1234' }
- let(:sentry_api_response) { sample_response }
- let(:sentry_url) { 'https://sentrytest.gitlab.com/api/0' }
- let(:sentry_request_url) { "#{sentry_url}/issues/#{issue_id}/events/latest/" }
- let!(:sentry_api_request) { stub_sentry_request(sentry_request_url, body: sentry_api_response) }
-
- subject { client.issue_latest_event(issue_id: issue_id) }
-
- it_behaves_like 'calls sentry api'
-
- it 'has correct return type' do
- expect(subject).to be_a(Gitlab::ErrorTracking::ErrorEvent)
- end
-
- shared_examples 'assigns error tracking event correctly' do
- using RSpec::Parameterized::TableSyntax
-
- where(:event_object, :sentry_response) do
- :issue_id | :groupID
- :date_received | :dateReceived
- end
-
- with_them do
- it { expect(subject.public_send(event_object)).to eq(sentry_api_response.dig(*sentry_response)) }
- end
- end
-
- context 'error object created from sentry response' do
- it_behaves_like 'assigns error tracking event correctly'
-
- it 'parses the stack trace' do
- expect(subject.stack_trace_entries).to be_a Array
- expect(subject.stack_trace_entries).not_to be_empty
- end
-
- context 'error without stack trace' do
- before do
- sample_response['entries'] = []
- stub_sentry_request(sentry_request_url, body: sample_response)
- end
-
- it_behaves_like 'assigns error tracking event correctly'
-
- it 'returns an empty array for stack_trace_entries' do
- expect(subject.stack_trace_entries).to eq []
- end
- end
- end
- end
-end
diff --git a/spec/lib/sentry/client/issue_link_spec.rb b/spec/lib/sentry/client/issue_link_spec.rb
deleted file mode 100644
index fe3abe7cb23..00000000000
--- a/spec/lib/sentry/client/issue_link_spec.rb
+++ /dev/null
@@ -1,65 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Sentry::Client::IssueLink do
- include SentryClientHelpers
-
- let_it_be(:sentry_url) { 'https://sentrytest.gitlab.com/api/0/projects/sentry-org/sentry-project' }
- let_it_be(:error_tracking_setting) { create(:project_error_tracking_setting, api_url: sentry_url) }
- let_it_be(:issue) { create(:issue, project: error_tracking_setting.project) }
-
- let(:client) { error_tracking_setting.sentry_client }
- let(:sentry_issue_id) { 11111111 }
-
- describe '#create_issue_link' do
- let(:sentry_issue_link_url) { "https://sentrytest.gitlab.com/api/0/groups/#{sentry_issue_id}/integrations/#{integration_id}/" }
- let(:integration_id) { 44444 }
-
- let(:issue_link_sample_response) { Gitlab::Json.parse(fixture_file('sentry/global_integration_link_sample_response.json')) }
- let(:sentry_api_response) { issue_link_sample_response }
- let!(:sentry_api_request) { stub_sentry_request(sentry_issue_link_url, :put, body: sentry_api_response, status: 201) }
-
- subject { client.create_issue_link(integration_id, sentry_issue_id, issue) }
-
- it_behaves_like 'calls sentry api'
-
- it { is_expected.to be_present }
-
- context 'redirects' do
- let(:sentry_api_url) { sentry_issue_link_url }
-
- it_behaves_like 'no Sentry redirects', :put
- end
-
- context 'when exception is raised' do
- let(:sentry_request_url) { sentry_issue_link_url }
-
- it_behaves_like 'maps Sentry exceptions', :put
- end
-
- context 'when integration_id is not provided' do
- let(:sentry_issue_link_url) { "https://sentrytest.gitlab.com/api/0/issues/#{sentry_issue_id}/plugins/gitlab/link/" }
- let(:integration_id) { nil }
-
- let(:issue_link_sample_response) { Gitlab::Json.parse(fixture_file('sentry/plugin_link_sample_response.json')) }
- let!(:sentry_api_request) { stub_sentry_request(sentry_issue_link_url, :post, body: sentry_api_response) }
-
- it_behaves_like 'calls sentry api'
-
- it { is_expected.to be_present }
-
- context 'redirects' do
- let(:sentry_api_url) { sentry_issue_link_url }
-
- it_behaves_like 'no Sentry redirects', :post
- end
-
- context 'when exception is raised' do
- let(:sentry_request_url) { sentry_issue_link_url }
-
- it_behaves_like 'maps Sentry exceptions', :post
- end
- end
- end
-end
diff --git a/spec/lib/sentry/client/issue_spec.rb b/spec/lib/sentry/client/issue_spec.rb
deleted file mode 100644
index dedef905c95..00000000000
--- a/spec/lib/sentry/client/issue_spec.rb
+++ /dev/null
@@ -1,330 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Sentry::Client::Issue do
- include SentryClientHelpers
-
- let(:token) { 'test-token' }
- let(:sentry_url) { 'https://sentrytest.gitlab.com/api/0' }
- let(:client) { Sentry::Client.new(sentry_url, token) }
- let(:issue_id) { 11 }
-
- 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) )
- end
- end
-
- shared_examples 'issues have correct length' do |length|
- it { expect(subject[:issues].length).to eq(length) }
- end
-
- let(:issues_sample_response) do
- Gitlab::Utils.deep_indifferent_access(
- Gitlab::Json.parse(fixture_file('sentry/issues_sample_response.json'))
- )
- end
-
- let(:default_httparty_options) do
- {
- follow_redirects: false,
- headers: { 'Content-Type' => 'application/json', 'Authorization' => "Bearer test-token" }
- }
- end
-
- let(:sentry_url) { 'https://sentrytest.gitlab.com/api/0/projects/sentry-org/sentry-project' }
- let(:issue_status) { 'unresolved' }
- let(:limit) { 20 }
- let(:search_term) { '' }
- 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_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) }
-
- it_behaves_like 'calls sentry api'
-
- it_behaves_like 'issues have correct return type', Gitlab::ErrorTracking::Error
- it_behaves_like 'issues have correct length', 3
-
- shared_examples 'has correct external_url' do
- context '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
- end
- end
-
- 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"'
- }
- end
-
- let!(:sentry_api_request) { stub_sentry_request(sentry_request_url, body: sentry_api_response, headers: headers) }
-
- it 'parses the pagination' do
- expect(subject[:pagination]).to eq(
- 'previous' => { 'cursor' => '1573556671000:0:1' },
- 'next' => { 'cursor' => '1572959139000:0:0' }
- )
- end
- end
-
- context 'error object created from sentry response' do
- using RSpec::Parameterized::TableSyntax
-
- where(:error_object, :sentry_response) do
- :id | :id
- :first_seen | :firstSeen
- :last_seen | :lastSeen
- :title | :title
- :type | :type
- :user_count | :userCount
- :count | :count
- :message | [:metadata, :value]
- :culprit | :culprit
- :short_id | :shortId
- :status | :status
- :frequency | [:stats, '24h']
- :project_id | [:project, :id]
- :project_name | [:project, :name]
- :project_slug | [:project, :slug]
- end
-
- with_them do
- it { expect(subject[:issues][0].public_send(error_object)).to eq(sentry_api_response[0].dig(*sentry_response)) }
- end
-
- it_behaves_like 'has correct external_url'
- end
-
- context '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
- let(:sentry_request_url) do
- 'https://sentrytest.gitlab.com/api/0/projects/sentry-org/sentry-project/' \
- 'issues/?limit=20&query=is:unresolved&sort=freq'
- end
-
- let!(:sentry_api_request) { stub_sentry_request(sentry_request_url, body: sentry_api_response) }
-
- subject { client.list_issues(issue_status: issue_status, limit: limit, sort: 'frequency') }
-
- it 'calls the sentry api with sort params' do
- expect(Gitlab::HTTP).to receive(:get).with(
- URI("#{sentry_url}/issues/"),
- default_httparty_options.merge(query: { limit: 20, query: "is:unresolved", sort: "freq" })
- ).and_call_original
-
- subject
-
- expect(sentry_api_request).to have_been_requested
- end
- end
-
- context 'with invalid sort params' do
- subject { client.list_issues(issue_status: issue_status, limit: limit, sort: 'fish') }
-
- it 'throws an error' do
- expect { subject }.to raise_error(Sentry::Client::BadRequestError, 'Invalid value for sort param')
- end
- end
-
- context '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)
- issue
- end
- end
-
- it_behaves_like 'calls sentry api'
-
- it_behaves_like 'issues have correct return type', Gitlab::ErrorTracking::Error
- it_behaves_like 'issues have correct length', 1
-
- it_behaves_like 'has correct external_url'
- end
-
- context 'essential keys missing in API response' do
- let(:sentry_api_response) do
- issues_sample_response[0...1].map do |issue|
- issue.except(:id)
- end
- end
-
- it 'raises exception' do
- expect { subject }.to raise_error(Sentry::Client::MissingKeysError, 'Sentry API response is missing keys. key not found: "id"')
- end
- end
-
- context 'sentry api response too large' do
- it 'raises exception' do
- deep_size = 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(Sentry::Client::ResponseInvalidSizeError, 'Sentry API response is too big. Limit is 1 MB.')
- end
- end
-
- it_behaves_like 'maps Sentry exceptions'
-
- context 'when search term is present' do
- let(:search_term) { 'NoMethodError' }
- let(:sentry_request_url) { "#{sentry_url}/issues/?limit=20&query=is:unresolved NoMethodError" }
-
- it_behaves_like 'calls sentry api'
-
- it_behaves_like 'issues have correct return type', Gitlab::ErrorTracking::Error
- it_behaves_like 'issues have correct length', 3
- end
-
- context 'when cursor is present' do
- let(:cursor) { '1572959139000:0:0' }
- let(:sentry_request_url) { "#{sentry_url}/issues/?limit=20&cursor=#{cursor}&query=is:unresolved" }
-
- it_behaves_like 'calls sentry api'
-
- it_behaves_like 'issues have correct return type', Gitlab::ErrorTracking::Error
- it_behaves_like 'issues have correct length', 3
- end
- end
-
- describe '#issue_details' do
- let(:issue_sample_response) do
- Gitlab::Utils.deep_indifferent_access(
- Gitlab::Json.parse(fixture_file('sentry/issue_sample_response.json'))
- )
- end
-
- let(:sentry_request_url) { "#{sentry_url}/issues/#{issue_id}/" }
- let!(:sentry_api_request) { stub_sentry_request(sentry_request_url, body: issue_sample_response) }
-
- subject { client.issue_details(issue_id: issue_id) }
-
- context 'error object created from sentry response' do
- using RSpec::Parameterized::TableSyntax
-
- where(:error_object, :sentry_response) do
- :id | :id
- :first_seen | :firstSeen
- :last_seen | :lastSeen
- :title | :title
- :type | :type
- :user_count | :userCount
- :count | :count
- :message | [:metadata, :value]
- :culprit | :culprit
- :short_id | :shortId
- :status | :status
- :frequency | [:stats, '24h']
- :project_id | [:project, :id]
- :project_name | [:project, :name]
- :project_slug | [:project, :slug]
- :first_release_last_commit | [:firstRelease, :lastCommit]
- :last_release_last_commit | [:lastRelease, :lastCommit]
- :first_release_short_version | [:firstRelease, :shortVersion]
- :last_release_short_version | [:lastRelease, :shortVersion]
- :first_release_version | [:firstRelease, :version]
- :last_release_version | [:lastRelease, :version]
- end
-
- with_them do
- it do
- expect(subject.public_send(error_object)).to eq(issue_sample_response.dig(*sentry_response))
- end
- end
-
- it 'has a correct external URL' do
- expect(subject.external_url).to eq('https://sentrytest.gitlab.com/api/0/issues/11')
- end
-
- it 'issue has a correct external base url' do
- expect(subject.external_base_url).to eq('https://sentrytest.gitlab.com/api/0')
- end
-
- it 'has a correct GitLab issue url' do
- expect(subject.gitlab_issue).to eq('https://gitlab.com/gitlab-org/gitlab/issues/1')
- end
-
- context 'when issue annotations exist' do
- before do
- issue_sample_response['annotations'] = [
- nil,
- '',
- "<a href=\"http://github.com/issues/6\">github-issue-6</a>",
- "<div>annotation</a>",
- "<a href=\"http://localhost/gitlab-org/gitlab/issues/2\">gitlab-org/gitlab#2</a>"
- ]
- stub_sentry_request(sentry_request_url, body: issue_sample_response)
- end
-
- it 'has a correct GitLab issue url' do
- expect(subject.gitlab_issue).to eq('http://localhost/gitlab-org/gitlab/issues/2')
- end
- end
-
- context 'when no GitLab issue is linked' do
- before do
- issue_sample_response['pluginIssues'] = []
- stub_sentry_request(sentry_request_url, body: issue_sample_response)
- end
-
- it 'does not find a GitLab issue' do
- expect(subject.gitlab_issue).to be_nil
- end
- end
-
- it 'has the correct tags' do
- expect(subject.tags).to eq({ level: issue_sample_response['level'], logger: issue_sample_response['logger'] })
- end
- end
- end
-
- 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
-
- subject { client.update_issue(issue_id: issue_id, params: params) }
-
- it_behaves_like 'calls sentry api' do
- let(:sentry_api_request) { stub_sentry_request(sentry_request_url, :put) }
- end
-
- it 'returns a truthy result' do
- expect(subject).to be_truthy
- end
-
- context 'error encountered' do
- let(:error) { StandardError.new('error') }
-
- before do
- allow(client).to receive(:update_issue).and_raise(error)
- end
-
- it 'raises the error' do
- expect { subject }.to raise_error(error)
- end
- end
- end
-end
diff --git a/spec/lib/sentry/client/projects_spec.rb b/spec/lib/sentry/client/projects_spec.rb
deleted file mode 100644
index ea2c5ccb81e..00000000000
--- a/spec/lib/sentry/client/projects_spec.rb
+++ /dev/null
@@ -1,100 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Sentry::Client::Projects do
- include SentryClientHelpers
-
- let(:sentry_url) { 'https://sentrytest.gitlab.com/api/0/projects/sentry-org/sentry-project' }
- let(:token) { 'test-token' }
- let(:client) { Sentry::Client.new(sentry_url, token) }
- let(:projects_sample_response) do
- Gitlab::Utils.deep_indifferent_access(
- Gitlab::Json.parse(fixture_file('sentry/list_projects_sample_response.json'))
- )
- end
-
- shared_examples 'has correct return type' do |klass|
- it "returns objects of type #{klass}" do
- expect(subject).to all( be_a(klass) )
- end
- end
-
- shared_examples 'has correct length' do |length|
- it { expect(subject.length).to eq(length) }
- end
-
- describe '#projects' do
- let(:sentry_list_projects_url) { 'https://sentrytest.gitlab.com/api/0/projects/' }
- let(:sentry_api_response) { projects_sample_response }
- let!(:sentry_api_request) { stub_sentry_request(sentry_list_projects_url, body: sentry_api_response) }
-
- subject { client.projects }
-
- it_behaves_like 'calls sentry api'
-
- it_behaves_like 'has correct return type', Gitlab::ErrorTracking::Project
- it_behaves_like 'has correct length', 2
-
- context 'essential keys missing in API response' do
- let(:sentry_api_response) do
- projects_sample_response[0...1].map do |project|
- project.except(:slug)
- end
- end
-
- it 'raises exception' do
- expect { subject }.to raise_error(Sentry::Client::MissingKeysError, 'Sentry API response is missing keys. key not found: "slug"')
- end
- end
-
- context 'optional keys missing in sentry response' do
- let(:sentry_api_response) do
- projects_sample_response[0...1].map do |project|
- project[:organization].delete(:id)
- project.delete(:id)
- project.except(:status)
- end
- end
-
- it_behaves_like 'calls sentry api'
-
- it_behaves_like 'has correct return type', Gitlab::ErrorTracking::Project
- it_behaves_like 'has correct length', 1
- end
-
- context 'error object created from sentry response' do
- using RSpec::Parameterized::TableSyntax
-
- where(:sentry_project_object, :sentry_response) do
- :id | :id
- :name | :name
- :status | :status
- :slug | :slug
- :organization_name | [:organization, :name]
- :organization_id | [:organization, :id]
- :organization_slug | [:organization, :slug]
- end
-
- with_them do
- it do
- expect(subject[0].public_send(sentry_project_object)).to(
- eq(sentry_api_response[0].dig(*sentry_response))
- )
- end
- end
- end
-
- context 'redirects' do
- let(:sentry_api_url) { sentry_list_projects_url }
-
- it_behaves_like 'no Sentry redirects'
- end
-
- context 'when exception is raised' do
- let(:sentry_request_url) { sentry_list_projects_url }
-
- it_behaves_like 'maps Sentry exceptions'
- end
- end
-end
diff --git a/spec/lib/sentry/client/repo_spec.rb b/spec/lib/sentry/client/repo_spec.rb
deleted file mode 100644
index 956c0b6eee1..00000000000
--- a/spec/lib/sentry/client/repo_spec.rb
+++ /dev/null
@@ -1,39 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Sentry::Client::Repo do
- include SentryClientHelpers
-
- let(:sentry_url) { 'https://sentrytest.gitlab.com/api/0/projects/sentry-org/sentry-project' }
- let(:token) { 'test-token' }
- let(:client) { Sentry::Client.new(sentry_url, token) }
- let(:repos_sample_response) { Gitlab::Json.parse(fixture_file('sentry/repos_sample_response.json')) }
-
- describe '#repos' do
- let(:organization_slug) { 'gitlab' }
- let(:sentry_repos_url) { "https://sentrytest.gitlab.com/api/0/organizations/#{organization_slug}/repos/" }
- let(:sentry_api_response) { repos_sample_response }
- let!(:sentry_api_request) { stub_sentry_request(sentry_repos_url, body: sentry_api_response) }
-
- subject { client.repos(organization_slug) }
-
- it_behaves_like 'calls sentry api'
-
- it { is_expected.to all( be_a(Gitlab::ErrorTracking::Repo)) }
-
- it { expect(subject.length).to eq(1) }
-
- context 'redirects' do
- let(:sentry_api_url) { sentry_repos_url }
-
- it_behaves_like 'no Sentry redirects'
- end
-
- context 'when exception is raised' do
- let(:sentry_request_url) { sentry_repos_url }
-
- it_behaves_like 'maps Sentry exceptions'
- end
- end
-end
diff --git a/spec/lib/sentry/client_spec.rb b/spec/lib/sentry/client_spec.rb
deleted file mode 100644
index cddcb6e98fa..00000000000
--- a/spec/lib/sentry/client_spec.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Sentry::Client do
- let(:sentry_url) { 'https://sentrytest.gitlab.com/api/0/projects/sentry-org/sentry-project' }
- let(:token) { 'test-token' }
-
- subject { Sentry::Client.new(sentry_url, token) }
-
- it { is_expected.to respond_to :projects }
- it { is_expected.to respond_to :list_issues }
- it { is_expected.to respond_to :issue_details }
- it { is_expected.to respond_to :issue_latest_event }
- it { is_expected.to respond_to :repos }
- it { is_expected.to respond_to :create_issue_link }
-end
diff --git a/spec/lib/sentry/pagination_parser_spec.rb b/spec/lib/sentry/pagination_parser_spec.rb
deleted file mode 100644
index c4ed24827bb..00000000000
--- a/spec/lib/sentry/pagination_parser_spec.rb
+++ /dev/null
@@ -1,60 +0,0 @@
-# frozen_string_literal: true
-
-require 'fast_spec_helper'
-
-RSpec.describe Sentry::PaginationParser do
- describe '.parse' do
- subject { described_class.parse(headers) }
-
- context 'when headers do not have "link" param' do
- let(:headers) { {} }
-
- it 'returns empty hash' do
- is_expected.to eq({})
- end
- end
-
- context 'when headers.link has previous and next pages' 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"'
- }
- end
-
- it 'returns info about both pages' do
- is_expected.to eq(
- 'previous' => { 'cursor' => '1573556671000:0:1' },
- 'next' => { 'cursor' => '1572959139000:0:0' }
- )
- end
- end
-
- context 'when headers.link has only next page' do
- let(:headers) do
- {
- 'link' => '<https://sentrytest.gitlab.com>; rel="previous"; results="false"; cursor="1573556671000:0:1", <https://sentrytest.gitlab.com>; rel="next"; results="true"; cursor="1572959139000:0:0"'
- }
- end
-
- it 'returns only info about the next page' do
- is_expected.to eq(
- 'next' => { 'cursor' => '1572959139000:0:0' }
- )
- end
- end
-
- context 'when headers.link has only previous page' do
- let(:headers) do
- {
- 'link' => '<https://sentrytest.gitlab.com>; rel="previous"; results="true"; cursor="1573556671000:0:1", <https://sentrytest.gitlab.com>; rel="next"; results="false"; cursor="1572959139000:0:0"'
- }
- end
-
- it 'returns only info about the previous page' do
- is_expected.to eq(
- 'previous' => { 'cursor' => '1573556671000:0:1' }
- )
- end
- end
- end
-end
diff --git a/spec/lib/system_check/sidekiq_check_spec.rb b/spec/lib/system_check/sidekiq_check_spec.rb
new file mode 100644
index 00000000000..c2f61e0e4b7
--- /dev/null
+++ b/spec/lib/system_check/sidekiq_check_spec.rb
@@ -0,0 +1,81 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe SystemCheck::SidekiqCheck do
+ describe '#multi_check' do
+ def stub_ps_output(output)
+ allow(Gitlab::Popen).to receive(:popen).with(%w(ps uxww)).and_return([output, nil])
+ end
+
+ def expect_check_output(matcher)
+ expect { subject.multi_check }.to output(matcher).to_stdout
+ end
+
+ it 'fails when no worker processes are running' do
+ stub_ps_output <<~PS
+ root 2193947 0.9 0.1 146564 18104 ? Ssl 17:34 0:00 ruby bin/sidekiq-cluster * -P ...
+ PS
+
+ expect_check_output include(
+ 'Running? ... no',
+ 'Please fix the error above and rerun the checks.'
+ )
+ end
+
+ it 'fails when more than one cluster process is running' do
+ stub_ps_output <<~PS
+ root 2193947 0.9 0.1 146564 18104 ? Ssl 17:34 0:00 ruby bin/sidekiq-cluster * -P ...
+ root 2193948 0.9 0.1 146564 18104 ? Ssl 17:34 0:00 ruby bin/sidekiq-cluster * -P ...
+ root 2193955 92.2 3.1 4675972 515516 ? Sl 17:34 0:13 sidekiq 5.2.9 ...
+ PS
+
+ expect_check_output include(
+ 'Running? ... yes',
+ 'Number of Sidekiq processes (cluster/worker) ... 2/1',
+ 'Please fix the error above and rerun the checks.'
+ )
+ end
+
+ it 'succeeds when one cluster process and one or more worker processes are running' do
+ stub_ps_output <<~PS
+ root 2193947 0.9 0.1 146564 18104 ? Ssl 17:34 0:00 ruby bin/sidekiq-cluster * -P ...
+ root 2193955 92.2 3.1 4675972 515516 ? Sl 17:34 0:13 sidekiq 5.2.9 ...
+ root 2193956 92.2 3.1 4675972 515516 ? Sl 17:34 0:13 sidekiq 5.2.9 ...
+ PS
+
+ expect_check_output <<~OUTPUT
+ Running? ... yes
+ Number of Sidekiq processes (cluster/worker) ... 1/2
+ OUTPUT
+ end
+
+ # TODO: Running without a cluster is deprecated and will be removed in GitLab 14.0
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/323225
+ context 'when running without a cluster' do
+ it 'fails when more than one worker process is running' do
+ stub_ps_output <<~PS
+ root 2193955 92.2 3.1 4675972 515516 ? Sl 17:34 0:13 sidekiq 5.2.9 ...
+ root 2193956 92.2 3.1 4675972 515516 ? Sl 17:34 0:13 sidekiq 5.2.9 ...
+ PS
+
+ expect_check_output include(
+ 'Running? ... yes',
+ 'Number of Sidekiq processes (cluster/worker) ... 0/2',
+ 'Please fix the error above and rerun the checks.'
+ )
+ end
+
+ it 'succeeds when one worker process is running' do
+ stub_ps_output <<~PS
+ root 2193955 92.2 3.1 4675972 515516 ? Sl 17:34 0:13 sidekiq 5.2.9 ...
+ PS
+
+ expect_check_output <<~OUTPUT
+ Running? ... yes
+ Number of Sidekiq processes (cluster/worker) ... 0/1
+ OUTPUT
+ end
+ end
+ end
+end
diff --git a/spec/mailers/emails/merge_requests_spec.rb b/spec/mailers/emails/merge_requests_spec.rb
index 34665d943ab..0c0dae6d7e6 100644
--- a/spec/mailers/emails/merge_requests_spec.rb
+++ b/spec/mailers/emails/merge_requests_spec.rb
@@ -6,37 +6,199 @@ require 'email_spec'
RSpec.describe Emails::MergeRequests do
include EmailSpec::Matchers
- describe "#resolved_all_discussions_email" do
- let(:user) { create(:user) }
- let(:merge_request) { create(:merge_request) }
- let(:current_user) { create(:user) }
+ include_context 'gitlab email notification'
+
+ let_it_be(:current_user, reload: true) { create(:user, email: "current@email.com", name: 'www.example.com') }
+ let_it_be(:assignee, reload: true) { create(:user, email: 'assignee@example.com', name: 'John Doe') }
+ let_it_be(:reviewer, reload: true) { create(:user, email: 'reviewer@example.com', name: 'Jane Doe') }
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:merge_request) do
+ create(:merge_request, source_project: project,
+ target_project: project,
+ author: current_user,
+ assignees: [assignee],
+ reviewers: [reviewer],
+ description: 'Awesome description')
+ end
- subject { Notify.resolved_all_discussions_email(user.id, merge_request.id, current_user.id) }
+ let(:recipient) { assignee }
+ let(:current_user_sanitized) { 'www_example_com' }
- it "includes the name of the resolver" do
- expect(subject).to have_body_text current_user.name
+ describe '#new_mention_in_merge_request_email' do
+ subject { Notify.new_mention_in_merge_request_email(recipient.id, merge_request.id, current_user.id) }
+
+ it 'has the correct subject and body' do
+ aggregate_failures do
+ is_expected.to have_referable_subject(merge_request, reply: true)
+ is_expected.to have_body_text(project_merge_request_path(project, merge_request))
+ is_expected.to have_body_text('You have been mentioned in Merge Request')
+ is_expected.to have_link(merge_request.to_reference, href: project_merge_request_url(merge_request.target_project, merge_request))
+ is_expected.to have_text_part_content(assignee.name)
+ is_expected.to have_text_part_content(reviewer.name)
+ is_expected.to have_html_part_content(assignee.name)
+ is_expected.to have_html_part_content(reviewer.name)
+ end
+ end
+ end
+
+ describe '#merge_request_unmergeable_email' do
+ subject { Notify.merge_request_unmergeable_email(recipient.id, merge_request.id) }
+
+ it_behaves_like 'an answer to an existing thread with reply-by-email enabled' do
+ let(:model) { merge_request }
+ end
+
+ it_behaves_like 'a multiple recipients email'
+ it_behaves_like 'it should show Gmail Actions View Merge request link'
+ it_behaves_like 'an unsubscribeable thread'
+ it_behaves_like 'appearance header and footer enabled'
+ it_behaves_like 'appearance header and footer not enabled'
+
+ it 'is sent as the merge request author' do
+ sender = subject.header[:from].addrs[0]
+ expect(sender.display_name).to eq(merge_request.author.name)
+ expect(sender.address).to eq(gitlab_sender)
+ end
+
+ it 'has the correct subject and body' do
+ aggregate_failures do
+ is_expected.to have_referable_subject(merge_request, reply: true)
+ is_expected.to have_body_text(project_merge_request_path(project, merge_request))
+ is_expected.to have_body_text('due to conflict.')
+ is_expected.to have_link(merge_request.to_reference, href: project_merge_request_url(merge_request.target_project, merge_request))
+ is_expected.to have_text_part_content(assignee.name)
+ is_expected.to have_text_part_content(reviewer.name)
+ end
+ end
+ end
+
+ describe '#closed_merge_request_email' do
+ subject { Notify.closed_merge_request_email(recipient.id, merge_request.id, current_user.id) }
+
+ it_behaves_like 'an answer to an existing thread with reply-by-email enabled' do
+ let(:model) { merge_request }
+ end
+
+ it_behaves_like 'it should show Gmail Actions View Merge request link'
+ it_behaves_like 'an unsubscribeable thread'
+ it_behaves_like 'appearance header and footer enabled'
+ it_behaves_like 'appearance header and footer not enabled'
+
+ it 'is sent as the author' do
+ sender = subject.header[:from].addrs[0]
+ expect(sender.display_name).to eq(current_user.name)
+ expect(sender.address).to eq(gitlab_sender)
+ end
+
+ it 'has the correct subject and body' do
+ aggregate_failures do
+ is_expected.to have_referable_subject(merge_request, reply: true)
+ is_expected.to have_body_text('closed')
+ is_expected.to have_body_text(current_user_sanitized)
+ is_expected.to have_body_text(project_merge_request_path(project, merge_request))
+ is_expected.to have_link(merge_request.to_reference, href: project_merge_request_url(merge_request.target_project, merge_request))
+
+ expect(subject.text_part).to have_content(assignee.name)
+ expect(subject.text_part).to have_content(reviewer.name)
+ end
+ end
+ end
+
+ describe '#merged_merge_request_email' do
+ let(:merge_author) { assignee }
+
+ subject { Notify.merged_merge_request_email(recipient.id, merge_request.id, merge_author.id) }
+
+ 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 }
+ end
+
+ it_behaves_like 'it should show Gmail Actions View Merge request link'
+ it_behaves_like 'an unsubscribeable thread'
+ it_behaves_like 'appearance header and footer enabled'
+ it_behaves_like 'appearance header and footer not enabled'
+
+ it 'is sent as the merge author' do
+ sender = subject.header[:from].addrs[0]
+ expect(sender.display_name).to eq(merge_author.name)
+ expect(sender.address).to eq(gitlab_sender)
+ end
+
+ it 'has the correct subject and body' do
+ aggregate_failures do
+ is_expected.to have_referable_subject(merge_request, reply: true)
+ is_expected.to have_body_text('merged')
+ is_expected.to have_body_text(project_merge_request_path(project, merge_request))
+ is_expected.to have_link(merge_request.to_reference, href: project_merge_request_url(merge_request.target_project, merge_request))
+
+ expect(subject.text_part).to have_content(assignee.name)
+ expect(subject.text_part).to have_content(reviewer.name)
+ end
+ end
+ end
+
+ describe '#merge_request_status_email' do
+ let(:status) { 'reopened' }
+
+ subject { Notify.merge_request_status_email(recipient.id, merge_request.id, status, current_user.id) }
+
+ it_behaves_like 'an answer to an existing thread with reply-by-email enabled' do
+ let(:model) { merge_request }
+ end
+
+ it_behaves_like 'it should show Gmail Actions View Merge request link'
+ it_behaves_like 'an unsubscribeable thread'
+ it_behaves_like 'appearance header and footer enabled'
+ it_behaves_like 'appearance header and footer not enabled'
+
+ it 'is sent as the author' do
+ sender = subject.header[:from].addrs[0]
+ expect(sender.display_name).to eq(current_user.name)
+ expect(sender.address).to eq(gitlab_sender)
+ end
+
+ it 'has the correct subject and body' do
+ aggregate_failures do
+ is_expected.to have_referable_subject(merge_request, reply: true)
+ is_expected.to have_body_text(status)
+ is_expected.to have_body_text(current_user_sanitized)
+ is_expected.to have_body_text(project_merge_request_path(project, merge_request))
+ is_expected.to have_link(merge_request.to_reference, href: project_merge_request_url(merge_request.target_project, merge_request))
+
+ expect(subject.text_part).to have_content(assignee.name)
+ expect(subject.text_part).to have_content(reviewer.name)
+ end
end
end
describe "#merge_when_pipeline_succeeds_email" do
- let(:user) { create(:user) }
- let(:merge_request) { create(:merge_request) }
- let(:current_user) { create(:user) }
- let(:project) { create(:project, :repository) }
let(:title) { "Merge request #{merge_request.to_reference} was scheduled to merge after pipeline succeeds by #{current_user.name}" }
- subject { Notify.merge_when_pipeline_succeeds_email(user.id, merge_request.id, current_user.id) }
+ subject { Notify.merge_when_pipeline_succeeds_email(recipient.id, merge_request.id, current_user.id) }
it "has required details" do
- expect(subject).to have_content title
- expect(subject).to have_content merge_request.to_reference
- expect(subject).to have_content current_user.name
+ aggregate_failures do
+ is_expected.to have_content(title)
+ is_expected.to have_content(merge_request.to_reference)
+ is_expected.to have_content(current_user.name)
+ is_expected.to have_text_part_content(assignee.name)
+ is_expected.to have_html_part_content(assignee.name)
+ is_expected.to have_text_part_content(reviewer.name)
+ is_expected.to have_html_part_content(reviewer.name)
+ end
+ end
+ end
+
+ describe "#resolved_all_discussions_email" do
+ subject { Notify.resolved_all_discussions_email(recipient.id, merge_request.id, current_user.id) }
+
+ it "includes the name of the resolver" do
+ expect(subject).to have_body_text current_user_sanitized
end
end
describe '#merge_requests_csv_email' do
- let(:user) { create(:user) }
- let(:project) { create(:project) }
let(:merge_requests) { create_list(:merge_request, 10) }
let(:export_status) do
{
@@ -48,10 +210,10 @@ RSpec.describe Emails::MergeRequests do
let(:csv_data) { MergeRequests::ExportCsvService.new(MergeRequest.all, project).csv_data }
- subject { Notify.merge_requests_csv_email(user, project, csv_data, export_status) }
+ subject { Notify.merge_requests_csv_email(recipient, project, csv_data, export_status) }
it { expect(subject.subject).to eq("#{project.name} | Exported merge requests") }
- it { expect(subject.to).to contain_exactly(user.notification_email_for(project.group)) }
+ it { expect(subject.to).to contain_exactly(recipient.notification_email_for(project.group)) }
it { expect(subject.html_part).to have_content("Your CSV export of 10 merge requests from project") }
it { expect(subject.text_part).to have_content("Your CSV export of 10 merge requests from project") }
diff --git a/spec/mailers/emails/pipelines_spec.rb b/spec/mailers/emails/pipelines_spec.rb
index 3ac68721357..a29835f3439 100644
--- a/spec/mailers/emails/pipelines_spec.rb
+++ b/spec/mailers/emails/pipelines_spec.rb
@@ -89,7 +89,7 @@ RSpec.describe Emails::Pipelines do
let(:sha) { project.commit(ref).sha }
it_behaves_like 'correct pipeline information' do
- let(:status) { 'Succesful' }
+ let(:status) { 'Successful' }
let(:status_text) { "Pipeline ##{pipeline.id} has passed!" }
end
end
diff --git a/spec/mailers/emails/profile_spec.rb b/spec/mailers/emails/profile_spec.rb
index fdff2d837f8..a32e566fc90 100644
--- a/spec/mailers/emails/profile_spec.rb
+++ b/spec/mailers/emails/profile_spec.rb
@@ -125,8 +125,9 @@ RSpec.describe Emails::Profile do
describe 'user personal access token is about to expire' do
let_it_be(:user) { create(:user) }
+ let_it_be(:expiring_token) { create(:personal_access_token, user: user, expires_at: 5.days.from_now) }
- subject { Notify.access_token_about_to_expire_email(user) }
+ subject { Notify.access_token_about_to_expire_email(user, [expiring_token.name]) }
it_behaves_like 'an email sent from GitLab'
it_behaves_like 'it should not have Gmail Actions links'
@@ -137,13 +138,17 @@ RSpec.describe Emails::Profile do
end
it 'has the correct subject' do
- is_expected.to have_subject /^Your Personal Access Tokens will expire in 7 days or less$/i
+ is_expected.to have_subject /^Your personal access tokens will expire in 7 days or less$/i
end
it 'mentions the access tokens will expire' do
is_expected.to have_body_text /One or more of your personal access tokens will expire in 7 days or less/
end
+ it 'provides the names of expiring tokens' do
+ is_expected.to have_body_text /#{expiring_token.name}/
+ end
+
it 'includes a link to personal access tokens page' do
is_expected.to have_body_text /#{profile_personal_access_tokens_path}/
end
diff --git a/spec/mailers/notify_spec.rb b/spec/mailers/notify_spec.rb
index 89cf1aaedd2..399f6ff5576 100644
--- a/spec/mailers/notify_spec.rb
+++ b/spec/mailers/notify_spec.rb
@@ -16,12 +16,14 @@ RSpec.describe Notify do
let_it_be(:user, reload: true) { create(:user) }
let_it_be(:current_user, reload: true) { create(:user, email: "current@email.com", name: 'www.example.com') }
let_it_be(:assignee, reload: true) { create(:user, email: 'assignee@example.com', name: 'John Doe') }
+ let_it_be(:reviewer, reload: true) { create(:user, email: 'reviewer@example.com', name: 'Jane Doe') }
let_it_be(:merge_request) do
create(:merge_request, source_project: project,
target_project: project,
author: current_user,
assignees: [assignee],
+ reviewers: [reviewer],
description: 'Awesome description')
end
@@ -342,6 +344,7 @@ RSpec.describe Notify do
is_expected.to have_body_text(project_merge_request_path(project, merge_request))
is_expected.to have_body_text(merge_request.source_branch)
is_expected.to have_body_text(merge_request.target_branch)
+ is_expected.to have_body_text(reviewer.name)
end
end
@@ -362,7 +365,11 @@ RSpec.describe Notify do
it 'contains a link to merge request author' do
is_expected.to have_body_text merge_request.author_name
- is_expected.to have_body_text 'created a merge request:'
+ is_expected.to have_body_text 'created a'
+ end
+
+ it 'contains a link to the merge request url' do
+ is_expected.to have_link('merge request', href: project_merge_request_url(merge_request.target_project, merge_request))
end
end
@@ -461,106 +468,6 @@ RSpec.describe Notify do
end
end
- describe 'status changed' do
- let(:status) { 'reopened' }
-
- subject { described_class.merge_request_status_email(recipient.id, merge_request.id, status, current_user.id) }
-
- it_behaves_like 'an answer to an existing thread with reply-by-email enabled' do
- let(:model) { merge_request }
- end
-
- it_behaves_like 'it should show Gmail Actions View Merge request link'
- it_behaves_like 'an unsubscribeable thread'
- it_behaves_like 'appearance header and footer enabled'
- it_behaves_like 'appearance header and footer not enabled'
-
- it 'is sent as the author' do
- sender = subject.header[:from].addrs[0]
- expect(sender.display_name).to eq(current_user.name)
- expect(sender.address).to eq(gitlab_sender)
- end
-
- it 'has the correct subject and body' do
- aggregate_failures do
- is_expected.to have_referable_subject(merge_request, reply: true)
- is_expected.to have_body_text(status)
- is_expected.to have_body_text(current_user_sanitized)
- is_expected.to have_body_text(project_merge_request_path(project, merge_request))
- is_expected.to have_link(merge_request.to_reference, href: project_merge_request_url(merge_request.target_project, merge_request))
- end
- end
- end
-
- describe 'that are merged' do
- let(:merge_author) { create(:user) }
-
- subject { described_class.merged_merge_request_email(recipient.id, merge_request.id, merge_author.id) }
-
- 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 }
- end
-
- it_behaves_like 'it should show Gmail Actions View Merge request link'
- it_behaves_like 'an unsubscribeable thread'
- it_behaves_like 'appearance header and footer enabled'
- it_behaves_like 'appearance header and footer not enabled'
-
- it 'is sent as the merge author' do
- sender = subject.header[:from].addrs[0]
- expect(sender.display_name).to eq(merge_author.name)
- expect(sender.address).to eq(gitlab_sender)
- end
-
- it 'has the correct subject and body' do
- aggregate_failures do
- is_expected.to have_referable_subject(merge_request, reply: true)
- is_expected.to have_body_text('merged')
- is_expected.to have_body_text(project_merge_request_path(project, merge_request))
- is_expected.to have_link(merge_request.to_reference, href: project_merge_request_url(merge_request.target_project, merge_request))
- end
- end
- end
-
- describe 'that are unmergeable' do
- let_it_be(:merge_request) do
- create(:merge_request, :conflict,
- source_project: project,
- target_project: project,
- author: current_user,
- assignees: [assignee],
- description: 'Awesome description')
- end
-
- subject { described_class.merge_request_unmergeable_email(recipient.id, merge_request.id) }
-
- 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 }
- end
-
- it_behaves_like 'it should show Gmail Actions View Merge request link'
- it_behaves_like 'an unsubscribeable thread'
- it_behaves_like 'appearance header and footer enabled'
- it_behaves_like 'appearance header and footer not enabled'
-
- it 'is sent as the merge request author' do
- sender = subject.header[:from].addrs[0]
- expect(sender.display_name).to eq(merge_request.author.name)
- expect(sender.address).to eq(gitlab_sender)
- end
-
- it 'has the correct subject and body' do
- aggregate_failures do
- is_expected.to have_referable_subject(merge_request, reply: true)
- is_expected.to have_body_text(project_merge_request_path(project, merge_request))
- is_expected.to have_body_text('due to conflict.')
- is_expected.to have_link(merge_request.to_reference, href: project_merge_request_url(merge_request.target_project, merge_request))
- end
- end
- end
-
shared_examples 'a push to an existing merge request' do
let(:push_user) { create(:user) }
diff --git a/spec/migrations/20201112130715_schedule_recalculate_uuid_on_vulnerabilities_occurrences_spec.rb b/spec/migrations/20201112130715_schedule_recalculate_uuid_on_vulnerabilities_occurrences_spec.rb
new file mode 100644
index 00000000000..fce32be4683
--- /dev/null
+++ b/spec/migrations/20201112130715_schedule_recalculate_uuid_on_vulnerabilities_occurrences_spec.rb
@@ -0,0 +1,138 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require Rails.root.join('db', 'post_migrate', '20201112130715_schedule_recalculate_uuid_on_vulnerabilities_occurrences.rb')
+
+RSpec.describe ScheduleRecalculateUuidOnVulnerabilitiesOccurrences, :migration do
+ let(:namespace) { table(:namespaces).create!(name: 'user', path: 'user') }
+ let(:users) { table(:users) }
+ let(:user) { create_user! }
+ let(:project) { table(:projects).create!(id: 123, namespace_id: namespace.id) }
+ let(:scanners) { table(:vulnerability_scanners) }
+ let(:scanner) { scanners.create!(project_id: project.id, external_id: 'test 1', name: 'test scanner 1') }
+ let(:different_scanner) { scanners.create!(project_id: project.id, external_id: 'test 2', name: 'test scanner 2') }
+ let(:vulnerabilities) { table(:vulnerabilities) }
+ let(:vulnerabilities_findings) { table(:vulnerability_occurrences) }
+ let(:vulnerability_identifiers) { table(:vulnerability_identifiers) }
+ let(:vulnerability_identifier) do
+ vulnerability_identifiers.create!(
+ project_id: project.id,
+ external_type: 'uuid-v5',
+ external_id: 'uuid-v5',
+ fingerprint: '7e394d1b1eb461a7406d7b1e08f057a1cf11287a',
+ name: 'Identifier for UUIDv5')
+ end
+
+ let(:different_vulnerability_identifier) do
+ vulnerability_identifiers.create!(
+ project_id: project.id,
+ external_type: 'uuid-v4',
+ external_id: 'uuid-v4',
+ fingerprint: '772da93d34a1ba010bcb5efa9fb6f8e01bafcc89',
+ name: 'Identifier for UUIDv4')
+ end
+
+ let!(:vulnerability_for_uuidv4) do
+ create_vulnerability!(
+ project_id: project.id,
+ author_id: user.id
+ )
+ end
+
+ let!(:vulnerability_for_uuidv5) do
+ create_vulnerability!(
+ project_id: project.id,
+ author_id: user.id
+ )
+ end
+
+ let(:known_uuid_v4) { "b3cc2518-5446-4dea-871c-89d5e999c1ac" }
+ let!(:finding_with_uuid_v4) do
+ create_finding!(
+ vulnerability_id: vulnerability_for_uuidv4.id,
+ project_id: project.id,
+ scanner_id: different_scanner.id,
+ primary_identifier_id: different_vulnerability_identifier.id,
+ report_type: 0, # "sast"
+ location_fingerprint: "fa18f432f1d56675f4098d318739c3cd5b14eb3e",
+ uuid: known_uuid_v4
+ )
+ end
+
+ let(:known_uuid_v5) { "e7d3d99d-04bb-5771-bb44-d80a9702d0a2" }
+ let!(:finding_with_uuid_v5) do
+ create_finding!(
+ vulnerability_id: vulnerability_for_uuidv5.id,
+ project_id: project.id,
+ scanner_id: scanner.id,
+ primary_identifier_id: vulnerability_identifier.id,
+ report_type: 0, # "sast"
+ location_fingerprint: "838574be0210968bf6b9f569df9c2576242cbf0a",
+ uuid: known_uuid_v5
+ )
+ end
+
+ before do
+ stub_const("#{described_class}::BATCH_SIZE", 1)
+ end
+
+ around do |example|
+ freeze_time { Sidekiq::Testing.fake! { example.run } }
+ end
+
+ it 'schedules background migration' do
+ migrate!
+
+ expect(BackgroundMigrationWorker.jobs.size).to eq(2)
+ expect(described_class::MIGRATION).to be_scheduled_migration(finding_with_uuid_v4.id, finding_with_uuid_v4.id)
+ expect(described_class::MIGRATION).to be_scheduled_migration(finding_with_uuid_v5.id, finding_with_uuid_v5.id)
+ end
+
+ private
+
+ def create_vulnerability!(project_id:, author_id:, title: 'test', severity: 7, confidence: 7, report_type: 0)
+ vulnerabilities.create!(
+ project_id: project_id,
+ author_id: author_id,
+ title: title,
+ severity: severity,
+ confidence: confidence,
+ report_type: report_type
+ )
+ end
+
+ # rubocop:disable Metrics/ParameterLists
+ def create_finding!(
+ vulnerability_id:, project_id:, scanner_id:, primary_identifier_id:,
+ name: "test", severity: 7, confidence: 7, report_type: 0,
+ project_fingerprint: '123qweasdzxc', location_fingerprint: 'test',
+ metadata_version: 'test', raw_metadata: 'test', uuid: 'test')
+ vulnerabilities_findings.create!(
+ vulnerability_id: vulnerability_id,
+ project_id: project_id,
+ name: name,
+ severity: severity,
+ confidence: confidence,
+ report_type: report_type,
+ project_fingerprint: project_fingerprint,
+ scanner_id: scanner.id,
+ primary_identifier_id: vulnerability_identifier.id,
+ location_fingerprint: location_fingerprint,
+ metadata_version: metadata_version,
+ raw_metadata: raw_metadata,
+ uuid: uuid
+ )
+ end
+ # rubocop:enable Metrics/ParameterLists
+
+ def create_user!(name: "Example User", email: "user@example.com", user_type: nil, created_at: Time.now, confirmed_at: Time.now)
+ users.create!(
+ name: name,
+ email: email,
+ username: name,
+ projects_limit: 0,
+ user_type: user_type,
+ confirmed_at: confirmed_at
+ )
+ end
+end
diff --git a/spec/migrations/20210218040814_add_environment_scope_to_group_variables_spec.rb b/spec/migrations/20210218040814_add_environment_scope_to_group_variables_spec.rb
new file mode 100644
index 00000000000..e525101f3a0
--- /dev/null
+++ b/spec/migrations/20210218040814_add_environment_scope_to_group_variables_spec.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!('add_environment_scope_to_group_variables')
+
+RSpec.describe AddEnvironmentScopeToGroupVariables do
+ let(:migration) { described_class.new }
+ let(:ci_group_variables) { table(:ci_group_variables) }
+ let(:group) { table(:namespaces).create!(name: 'group', path: 'group') }
+
+ def create_variable!(group, key:, environment_scope: '*')
+ table(:ci_group_variables).create!(
+ group_id: group.id,
+ key: key,
+ environment_scope: environment_scope
+ )
+ end
+
+ describe '#down' do
+ context 'group has variables with duplicate keys' do
+ it 'deletes all but the first record' do
+ migration.up
+
+ remaining_variable = create_variable!(group, key: 'key')
+ create_variable!(group, key: 'key', environment_scope: 'staging')
+ create_variable!(group, key: 'key', environment_scope: 'production')
+
+ migration.down
+
+ expect(ci_group_variables.pluck(:id)).to eq [remaining_variable.id]
+ end
+ end
+
+ context 'group does not have variables with duplicate keys' do
+ it 'does not delete any records' do
+ migration.up
+
+ create_variable!(group, key: 'key')
+ create_variable!(group, key: 'staging')
+ create_variable!(group, key: 'production')
+
+ expect { migration.down }.not_to change { ci_group_variables.count }
+ end
+ end
+ end
+end
diff --git a/spec/migrations/cleanup_projects_with_bad_has_external_issue_tracker_data_spec.rb b/spec/migrations/cleanup_projects_with_bad_has_external_issue_tracker_data_spec.rb
new file mode 100644
index 00000000000..8aedd1f9607
--- /dev/null
+++ b/spec/migrations/cleanup_projects_with_bad_has_external_issue_tracker_data_spec.rb
@@ -0,0 +1,94 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+require_migration!
+
+RSpec.describe CleanupProjectsWithBadHasExternalIssueTrackerData, :migration do
+ let(:namespace) { table(:namespaces).create!(name: 'foo', path: 'bar') }
+ let(:projects) { table(:projects) }
+ let(:services) { table(:services) }
+
+ def create_projects!(num)
+ Array.new(num) do
+ projects.create!(namespace_id: namespace.id)
+ end
+ end
+
+ def create_active_external_issue_tracker_integrations!(*projects)
+ projects.each do |project|
+ services.create!(category: 'issue_tracker', project_id: project.id, active: true)
+ end
+ end
+
+ def create_disabled_external_issue_tracker_integrations!(*projects)
+ projects.each do |project|
+ services.create!(category: 'issue_tracker', project_id: project.id, active: false)
+ end
+ end
+
+ def create_active_other_integrations!(*projects)
+ projects.each do |project|
+ services.create!(category: 'not_an_issue_tracker', project_id: project.id, active: true)
+ end
+ end
+
+ it 'sets `projects.has_external_issue_tracker` correctly' do
+ allow(ActiveRecord::Base.connection).to receive(:transaction_open?).and_return(false)
+
+ project_with_an_external_issue_tracker_1,
+ project_with_an_external_issue_tracker_2,
+ project_with_only_a_disabled_external_issue_tracker_1,
+ project_with_only_a_disabled_external_issue_tracker_2,
+ project_without_any_external_issue_trackers_1,
+ project_without_any_external_issue_trackers_2 = create_projects!(6)
+
+ create_active_external_issue_tracker_integrations!(
+ project_with_an_external_issue_tracker_1,
+ project_with_an_external_issue_tracker_2
+ )
+
+ create_disabled_external_issue_tracker_integrations!(
+ project_with_an_external_issue_tracker_1,
+ project_with_an_external_issue_tracker_2,
+ project_with_only_a_disabled_external_issue_tracker_1,
+ project_with_only_a_disabled_external_issue_tracker_2
+ )
+
+ create_active_other_integrations!(
+ project_with_an_external_issue_tracker_1,
+ project_with_an_external_issue_tracker_2,
+ project_without_any_external_issue_trackers_1,
+ project_without_any_external_issue_trackers_2
+ )
+
+ # PG triggers on the services table added in
+ # https://gitlab.com/gitlab-org/gitlab/-/merge_requests/51852 will have set
+ # the `has_external_issue_tracker` columns to correct data when the services
+ # records were created above.
+ #
+ # We set the `has_external_issue_tracker` columns for projects to incorrect
+ # data manually below to emulate projects in a state before the PG
+ # triggers were added.
+ project_with_an_external_issue_tracker_2.update!(has_external_issue_tracker: false)
+ project_with_only_a_disabled_external_issue_tracker_2.update!(has_external_issue_tracker: true)
+ project_without_any_external_issue_trackers_2.update!(has_external_issue_tracker: true)
+
+ migrate!
+
+ expected_true = [
+ project_with_an_external_issue_tracker_1,
+ project_with_an_external_issue_tracker_2
+ ].each(&:reload).map(&:has_external_issue_tracker)
+
+ expected_not_true = [
+ project_without_any_external_issue_trackers_1,
+ project_without_any_external_issue_trackers_2,
+ project_with_only_a_disabled_external_issue_tracker_1,
+ project_with_only_a_disabled_external_issue_tracker_2
+ ].each(&:reload).map(&:has_external_issue_tracker)
+
+ expect(expected_true).to all(eq(true))
+ expect(expected_not_true).to all(be_falsey)
+ end
+end
diff --git a/spec/migrations/migrate_delayed_project_removal_from_namespaces_to_namespace_settings_spec.rb b/spec/migrations/migrate_delayed_project_removal_from_namespaces_to_namespace_settings_spec.rb
new file mode 100644
index 00000000000..28a8dcf0d4c
--- /dev/null
+++ b/spec/migrations/migrate_delayed_project_removal_from_namespaces_to_namespace_settings_spec.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+require Rails.root.join('db', 'post_migrate', '20210215095328_migrate_delayed_project_removal_from_namespaces_to_namespace_settings.rb')
+
+RSpec.describe MigrateDelayedProjectRemovalFromNamespacesToNamespaceSettings, :migration do
+ let(:namespaces) { table(:namespaces) }
+ let(:namespace_settings) { table(:namespace_settings) }
+
+ let!(:namespace_wo_settings) { namespaces.create!(name: generate(:name), path: generate(:name), delayed_project_removal: true) }
+ let!(:namespace_wo_settings_delay_false) { namespaces.create!(name: generate(:name), path: generate(:name), delayed_project_removal: false) }
+ let!(:namespace_w_settings_delay_true) { namespaces.create!(name: generate(:name), path: generate(:name), delayed_project_removal: true) }
+ let!(:namespace_w_settings_delay_false) { namespaces.create!(name: generate(:name), path: generate(:name), delayed_project_removal: false) }
+
+ let!(:namespace_settings_delay_true) { namespace_settings.create!(namespace_id: namespace_w_settings_delay_true.id, delayed_project_removal: false, created_at: DateTime.now, updated_at: DateTime.now) }
+ let!(:namespace_settings_delay_false) { namespace_settings.create!(namespace_id: namespace_w_settings_delay_false.id, delayed_project_removal: false, created_at: DateTime.now, updated_at: DateTime.now) }
+
+ it 'migrates delayed_project_removal to namespace_settings' do
+ disable_migrations_output { migrate! }
+
+ expect(namespace_settings.count).to eq(3)
+
+ expect(namespace_settings.find_by(namespace_id: namespace_wo_settings.id).delayed_project_removal).to eq(true)
+ expect(namespace_settings.find_by(namespace_id: namespace_wo_settings_delay_false.id)).to be_nil
+
+ expect(namespace_settings_delay_true.reload.delayed_project_removal).to eq(true)
+ expect(namespace_settings_delay_false.reload.delayed_project_removal).to eq(false)
+ end
+end
diff --git a/spec/migrations/reschedule_artifact_expiry_backfill_spec.rb b/spec/migrations/reschedule_artifact_expiry_backfill_spec.rb
new file mode 100644
index 00000000000..532035849cb
--- /dev/null
+++ b/spec/migrations/reschedule_artifact_expiry_backfill_spec.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+require Rails.root.join('db', 'post_migrate', '20210224150506_reschedule_artifact_expiry_backfill.rb')
+
+RSpec.describe RescheduleArtifactExpiryBackfill, :migration do
+ let(:migration_class) { Gitlab::BackgroundMigration::BackfillArtifactExpiryDate }
+ let(:migration_name) { migration_class.to_s.demodulize }
+
+ before do
+ table(:namespaces).create!(id: 123, name: 'test_namespace', path: 'test_namespace')
+ table(:projects).create!(id: 123, name: 'sample_project', path: 'sample_project', namespace_id: 123)
+ end
+
+ it 'correctly schedules background migrations' do
+ first_artifact = create_artifact(job_id: 0, expire_at: nil, created_at: Date.new(2020, 06, 21))
+ second_artifact = create_artifact(job_id: 1, expire_at: nil, created_at: Date.new(2020, 06, 21))
+ create_artifact(job_id: 2, expire_at: Date.yesterday, created_at: Date.new(2020, 06, 21))
+ create_artifact(job_id: 3, expire_at: nil, created_at: Date.new(2020, 06, 23))
+
+ Sidekiq::Testing.fake! do
+ freeze_time do
+ migrate!
+
+ expect(BackgroundMigrationWorker.jobs.size).to eq(1)
+ expect(migration_name).to be_scheduled_migration_with_multiple_args(first_artifact.id, second_artifact.id)
+ end
+ end
+ end
+
+ private
+
+ def create_artifact(params)
+ table(:ci_builds).create!(id: params[:job_id], project_id: 123)
+ table(:ci_job_artifacts).create!(project_id: 123, file_type: 1, **params)
+ end
+end
diff --git a/spec/migrations/reschedule_set_default_iteration_cadences_spec.rb b/spec/migrations/reschedule_set_default_iteration_cadences_spec.rb
new file mode 100644
index 00000000000..fb629c90d9f
--- /dev/null
+++ b/spec/migrations/reschedule_set_default_iteration_cadences_spec.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe RescheduleSetDefaultIterationCadences do
+ let(:namespaces) { table(:namespaces) }
+ let(:iterations) { table(:sprints) }
+
+ let(:group_1) { namespaces.create!(name: 'test_1', path: 'test_1') }
+ let!(:group_2) { namespaces.create!(name: 'test_2', path: 'test_2') }
+ let(:group_3) { namespaces.create!(name: 'test_3', path: 'test_3') }
+ let(:group_4) { namespaces.create!(name: 'test_4', path: 'test_4') }
+ let(:group_5) { namespaces.create!(name: 'test_5', path: 'test_5') }
+ let(:group_6) { namespaces.create!(name: 'test_6', path: 'test_6') }
+ let(:group_7) { namespaces.create!(name: 'test_7', path: 'test_7') }
+ let(:group_8) { namespaces.create!(name: 'test_8', path: 'test_8') }
+
+ let!(:iteration_1) { iterations.create!(iid: 1, title: 'iteration 1', group_id: group_1.id, start_date: 2.days.from_now, due_date: 3.days.from_now) }
+ let!(:iteration_2) { iterations.create!(iid: 1, title: 'iteration 2', group_id: group_3.id, start_date: 2.days.from_now, due_date: 3.days.from_now) }
+ let!(:iteration_3) { iterations.create!(iid: 1, title: 'iteration 2', group_id: group_4.id, start_date: 2.days.from_now, due_date: 3.days.from_now) }
+ let!(:iteration_4) { iterations.create!(iid: 1, title: 'iteration 2', group_id: group_5.id, start_date: 2.days.from_now, due_date: 3.days.from_now) }
+ let!(:iteration_5) { iterations.create!(iid: 1, title: 'iteration 2', group_id: group_6.id, start_date: 2.days.from_now, due_date: 3.days.from_now) }
+ let!(:iteration_6) { iterations.create!(iid: 1, title: 'iteration 2', group_id: group_7.id, start_date: 2.days.from_now, due_date: 3.days.from_now) }
+ let!(:iteration_7) { iterations.create!(iid: 1, title: 'iteration 2', group_id: group_8.id, start_date: 2.days.from_now, due_date: 3.days.from_now) }
+
+ around do |example|
+ freeze_time { Sidekiq::Testing.fake! { example.run } }
+ end
+
+ it 'schedules the background jobs', :aggregate_failures do
+ stub_const("#{described_class.name}::BATCH_SIZE", 3)
+
+ migrate!
+
+ expect(BackgroundMigrationWorker.jobs.size).to be(3)
+ expect(described_class::MIGRATION_CLASS).to be_scheduled_delayed_migration(2.minutes, group_1.id, group_3.id, group_4.id)
+ expect(described_class::MIGRATION_CLASS).to be_scheduled_delayed_migration(4.minutes, group_5.id, group_6.id, group_7.id)
+ expect(described_class::MIGRATION_CLASS).to be_scheduled_delayed_migration(6.minutes, group_8.id)
+ end
+end
diff --git a/spec/migrations/schedule_merge_request_assignees_migration_progress_check_spec.rb b/spec/migrations/schedule_merge_request_assignees_migration_progress_check_spec.rb
deleted file mode 100644
index 0a69f49f10d..00000000000
--- a/spec/migrations/schedule_merge_request_assignees_migration_progress_check_spec.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require Rails.root.join('db', 'post_migrate', '20190402224749_schedule_merge_request_assignees_migration_progress_check.rb')
-
-RSpec.describe ScheduleMergeRequestAssigneesMigrationProgressCheck do
- describe '#up' do
- it 'schedules MergeRequestAssigneesMigrationProgressCheck background job' do
- expect(BackgroundMigrationWorker).to receive(:perform_async)
- .with(described_class::MIGRATION)
- .and_call_original
-
- subject.up
- end
- end
-end
diff --git a/spec/migrations/schedule_populate_personal_snippet_statistics_spec.rb b/spec/migrations/schedule_populate_personal_snippet_statistics_spec.rb
index 8678361fc64..faa993dfbc7 100644
--- a/spec/migrations/schedule_populate_personal_snippet_statistics_spec.rb
+++ b/spec/migrations/schedule_populate_personal_snippet_statistics_spec.rb
@@ -6,11 +6,15 @@ require Rails.root.join('db', 'post_migrate', '20200714075739_schedule_populate_
RSpec.describe SchedulePopulatePersonalSnippetStatistics do
let(:users) { table(:users) }
+ let(:namespaces) { table(:namespaces) }
let(:snippets) { table(:snippets) }
let(:projects) { table(:projects) }
- let(:user1) { users.create!(id: 1, email: 'user1@example.com', projects_limit: 10, username: 'test1', name: 'Test1', state: 'active') }
- let(:user2) { users.create!(id: 2, email: 'user2@example.com', projects_limit: 10, username: 'test2', name: 'Test2', state: 'active') }
- let(:user3) { users.create!(id: 3, email: 'user3@example.com', projects_limit: 10, username: 'test3', name: 'Test3', state: 'active') }
+ let!(:user1) { users.create!(id: 1, email: 'user1@example.com', projects_limit: 10, username: 'test1', name: 'Test1', state: 'active') }
+ let!(:user2) { users.create!(id: 2, email: 'user2@example.com', projects_limit: 10, username: 'test2', name: 'Test2', state: 'active') }
+ let!(:user3) { users.create!(id: 3, email: 'user3@example.com', projects_limit: 10, username: 'test3', name: 'Test3', state: 'active') }
+ let!(:namespace1) { namespaces.create!(id: 1, owner_id: user1.id, name: 'test1', path: 'test1') }
+ let!(:namespace2) { namespaces.create!(id: 2, owner_id: user2.id, name: 'test2', path: 'test2') }
+ let!(:namespace3) { namespaces.create!(id: 3, owner_id: user3.id, name: 'test3', path: 'test3') }
def create_snippet(id, user_id, type = 'PersonalSnippet')
params = {
diff --git a/spec/models/analytics/instance_statistics/measurement_spec.rb b/spec/models/analytics/instance_statistics/measurement_spec.rb
deleted file mode 100644
index dbb16c5ffbe..00000000000
--- a/spec/models/analytics/instance_statistics/measurement_spec.rb
+++ /dev/null
@@ -1,118 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Analytics::InstanceStatistics::Measurement, type: :model do
- describe 'validation' do
- let!(:measurement) { create(:instance_statistics_measurement) }
-
- it { is_expected.to validate_presence_of(:recorded_at) }
- it { is_expected.to validate_presence_of(:identifier) }
- it { is_expected.to validate_presence_of(:count) }
- it { is_expected.to validate_uniqueness_of(:recorded_at).scoped_to(:identifier) }
- end
-
- describe 'identifiers enum' do
- it 'maps to the correct values' do
- identifiers = {
- projects: 1,
- users: 2,
- issues: 3,
- merge_requests: 4,
- groups: 5,
- pipelines: 6,
- pipelines_succeeded: 7,
- pipelines_failed: 8,
- pipelines_canceled: 9,
- pipelines_skipped: 10,
- billable_users: 11
- }
-
- expect(described_class.identifiers).to eq(identifiers.with_indifferent_access)
- end
- end
-
- describe 'scopes' do
- let_it_be(:measurement_1) { create(:instance_statistics_measurement, :project_count, recorded_at: 10.days.ago) }
- let_it_be(:measurement_2) { create(:instance_statistics_measurement, :project_count, recorded_at: 2.days.ago) }
- let_it_be(:measurement_3) { create(:instance_statistics_measurement, :group_count, recorded_at: 5.days.ago) }
-
- describe '.order_by_latest' do
- subject { described_class.order_by_latest }
-
- it { is_expected.to eq([measurement_2, measurement_3, measurement_1]) }
- end
-
- describe '.with_identifier' do
- subject { described_class.with_identifier(:projects) }
-
- it { is_expected.to match_array([measurement_1, measurement_2]) }
- end
-
- describe '.recorded_after' do
- subject { described_class.recorded_after(8.days.ago) }
-
- it { is_expected.to match_array([measurement_2, measurement_3]) }
-
- context 'when nil is given' do
- subject { described_class.recorded_after(nil) }
-
- it 'does not apply filtering' do
- expect(subject).to match_array([measurement_1, measurement_2, measurement_3])
- end
- end
- end
-
- describe '.recorded_before' do
- subject { described_class.recorded_before(4.days.ago) }
-
- it { is_expected.to match_array([measurement_1, measurement_3]) }
-
- context 'when nil is given' do
- subject { described_class.recorded_after(nil) }
-
- it 'does not apply filtering' do
- expect(subject).to match_array([measurement_1, measurement_2, measurement_3])
- end
- end
- end
- end
-
- describe '.identifier_query_mapping' do
- subject { described_class.identifier_query_mapping }
-
- it { is_expected.to be_a Hash }
- end
-
- describe '.identifier_min_max_queries' do
- subject { described_class.identifier_min_max_queries }
-
- it { is_expected.to be_a Hash }
- end
-
- describe '.measurement_identifier_values' do
- let(:expected_count) { described_class.identifiers.size }
-
- subject { described_class.measurement_identifier_values.count }
-
- it { is_expected.to eq(expected_count) }
- end
-
- describe '.find_latest_or_fallback' do
- subject(:count) { described_class.find_latest_or_fallback(:pipelines_skipped).count }
-
- context 'with instance statistics' do
- let!(:measurement) { create(:instance_statistics_measurement, :pipelines_skipped_count) }
-
- it 'returns the latest stored measurement' do
- expect(count).to eq measurement.count
- end
- end
-
- context 'without instance statistics' do
- it 'returns the realtime query of the measurement' do
- expect(count).to eq 0
- end
- end
- end
-end
diff --git a/spec/models/analytics/usage_trends/measurement_spec.rb b/spec/models/analytics/usage_trends/measurement_spec.rb
new file mode 100644
index 00000000000..d9a6b70c87a
--- /dev/null
+++ b/spec/models/analytics/usage_trends/measurement_spec.rb
@@ -0,0 +1,118 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Analytics::UsageTrends::Measurement, type: :model do
+ describe 'validation' do
+ let!(:measurement) { create(:usage_trends_measurement) }
+
+ it { is_expected.to validate_presence_of(:recorded_at) }
+ it { is_expected.to validate_presence_of(:identifier) }
+ it { is_expected.to validate_presence_of(:count) }
+ it { is_expected.to validate_uniqueness_of(:recorded_at).scoped_to(:identifier) }
+ end
+
+ describe 'identifiers enum' do
+ it 'maps to the correct values' do
+ identifiers = {
+ projects: 1,
+ users: 2,
+ issues: 3,
+ merge_requests: 4,
+ groups: 5,
+ pipelines: 6,
+ pipelines_succeeded: 7,
+ pipelines_failed: 8,
+ pipelines_canceled: 9,
+ pipelines_skipped: 10,
+ billable_users: 11
+ }
+
+ expect(described_class.identifiers).to eq(identifiers.with_indifferent_access)
+ end
+ end
+
+ describe 'scopes' do
+ let_it_be(:measurement_1) { create(:usage_trends_measurement, :project_count, recorded_at: 10.days.ago) }
+ let_it_be(:measurement_2) { create(:usage_trends_measurement, :project_count, recorded_at: 2.days.ago) }
+ let_it_be(:measurement_3) { create(:usage_trends_measurement, :group_count, recorded_at: 5.days.ago) }
+
+ describe '.order_by_latest' do
+ subject { described_class.order_by_latest }
+
+ it { is_expected.to eq([measurement_2, measurement_3, measurement_1]) }
+ end
+
+ describe '.with_identifier' do
+ subject { described_class.with_identifier(:projects) }
+
+ it { is_expected.to match_array([measurement_1, measurement_2]) }
+ end
+
+ describe '.recorded_after' do
+ subject { described_class.recorded_after(8.days.ago) }
+
+ it { is_expected.to match_array([measurement_2, measurement_3]) }
+
+ context 'when nil is given' do
+ subject { described_class.recorded_after(nil) }
+
+ it 'does not apply filtering' do
+ expect(subject).to match_array([measurement_1, measurement_2, measurement_3])
+ end
+ end
+ end
+
+ describe '.recorded_before' do
+ subject { described_class.recorded_before(4.days.ago) }
+
+ it { is_expected.to match_array([measurement_1, measurement_3]) }
+
+ context 'when nil is given' do
+ subject { described_class.recorded_after(nil) }
+
+ it 'does not apply filtering' do
+ expect(subject).to match_array([measurement_1, measurement_2, measurement_3])
+ end
+ end
+ end
+ end
+
+ describe '.identifier_query_mapping' do
+ subject { described_class.identifier_query_mapping }
+
+ it { is_expected.to be_a Hash }
+ end
+
+ describe '.identifier_min_max_queries' do
+ subject { described_class.identifier_min_max_queries }
+
+ it { is_expected.to be_a Hash }
+ end
+
+ describe '.measurement_identifier_values' do
+ let(:expected_count) { described_class.identifiers.size }
+
+ subject { described_class.measurement_identifier_values.count }
+
+ it { is_expected.to eq(expected_count) }
+ end
+
+ describe '.find_latest_or_fallback' do
+ subject(:count) { described_class.find_latest_or_fallback(:pipelines_skipped).count }
+
+ context 'with usage statistics' do
+ let!(:measurement) { create(:usage_trends_measurement, :pipelines_skipped_count) }
+
+ it 'returns the latest stored measurement' do
+ expect(count).to eq measurement.count
+ end
+ end
+
+ context 'without usage statistics' do
+ it 'returns the realtime query of the measurement' do
+ expect(count).to eq 0
+ end
+ end
+ end
+end
diff --git a/spec/models/application_setting_spec.rb b/spec/models/application_setting_spec.rb
index 5658057f588..808932ce7e4 100644
--- a/spec/models/application_setting_spec.rb
+++ b/spec/models/application_setting_spec.rb
@@ -105,14 +105,14 @@ RSpec.describe ApplicationSetting do
it { is_expected.not_to allow_value(false).for(:hashed_storage_enabled) }
- it { is_expected.not_to allow_value(101).for(:repository_storages_weighted_default) }
- it { is_expected.to allow_value('90').for(:repository_storages_weighted_default) }
- it { is_expected.not_to allow_value(-1).for(:repository_storages_weighted_default) }
- it { is_expected.to allow_value(100).for(:repository_storages_weighted_default) }
- it { is_expected.to allow_value(0).for(:repository_storages_weighted_default) }
- it { is_expected.to allow_value(50).for(:repository_storages_weighted_default) }
- it { is_expected.to allow_value(nil).for(:repository_storages_weighted_default) }
- it { is_expected.not_to allow_value({ default: 100, shouldntexist: 50 }).for(:repository_storages_weighted) }
+ it { is_expected.to allow_value('default' => 0).for(:repository_storages_weighted) }
+ it { is_expected.to allow_value('default' => 50).for(:repository_storages_weighted) }
+ it { is_expected.to allow_value('default' => 100).for(:repository_storages_weighted) }
+ it { is_expected.to allow_value('default' => '90').for(:repository_storages_weighted) }
+ it { is_expected.to allow_value('default' => nil).for(:repository_storages_weighted) }
+ it { is_expected.not_to allow_value('default' => -1).for(:repository_storages_weighted).with_message("value for 'default' must be between 0 and 100") }
+ it { is_expected.not_to allow_value('default' => 101).for(:repository_storages_weighted).with_message("value for 'default' must be between 0 and 100") }
+ it { is_expected.not_to allow_value('default' => 100, shouldntexist: 50).for(:repository_storages_weighted).with_message("can't include: shouldntexist") }
it { is_expected.to allow_value(400).for(:notes_create_limit) }
it { is_expected.not_to allow_value('two').for(:notes_create_limit) }
@@ -377,7 +377,7 @@ RSpec.describe ApplicationSetting do
end
end
- it_behaves_like 'an object with email-formated attributes', :abuse_notification_email do
+ it_behaves_like 'an object with email-formatted attributes', :abuse_notification_email do
subject { setting }
end
@@ -984,12 +984,6 @@ RSpec.describe ApplicationSetting do
it_behaves_like 'application settings examples'
- describe 'repository_storages_weighted_attributes' do
- it 'returns the keys for repository_storages_weighted' do
- expect(subject.class.repository_storages_weighted_attributes).to eq([:repository_storages_weighted_default])
- end
- end
-
describe 'kroki_format_supported?' do
it 'returns true when Excalidraw is enabled' do
subject.kroki_formats_excalidraw = true
@@ -1033,11 +1027,4 @@ RSpec.describe ApplicationSetting do
expect(subject.kroki_formats_excalidraw).to eq(true)
end
end
-
- it 'does not allow to set weight for non existing storage' do
- setting.repository_storages_weighted = { invalid_storage: 100 }
-
- expect(setting).not_to be_valid
- expect(setting.errors.messages[:repository_storages_weighted]).to match_array(["can't include: invalid_storage"])
- end
end
diff --git a/spec/models/bulk_imports/entity_spec.rb b/spec/models/bulk_imports/entity_spec.rb
index e5ab96ca514..17ab4d5954c 100644
--- a/spec/models/bulk_imports/entity_spec.rb
+++ b/spec/models/bulk_imports/entity_spec.rb
@@ -14,7 +14,6 @@ RSpec.describe BulkImports::Entity, type: :model do
it { is_expected.to validate_presence_of(:source_type) }
it { is_expected.to validate_presence_of(:source_full_path) }
it { is_expected.to validate_presence_of(:destination_name) }
- it { is_expected.to validate_presence_of(:destination_namespace) }
it { is_expected.to define_enum_for(:source_type).with_values(%i[group_entity project_entity]) }
@@ -38,7 +37,11 @@ RSpec.describe BulkImports::Entity, type: :model do
context 'when associated with a group and no project' do
it 'is valid as a group_entity' do
entity = build(:bulk_import_entity, :group_entity, group: build(:group), project: nil)
+ expect(entity).to be_valid
+ end
+ it 'is valid when destination_namespace is empty' do
+ entity = build(:bulk_import_entity, :group_entity, group: build(:group), project: nil, destination_namespace: '')
expect(entity).to be_valid
end
@@ -57,6 +60,12 @@ RSpec.describe BulkImports::Entity, type: :model do
expect(entity).to be_valid
end
+ it 'is invalid when destination_namespace is nil' do
+ entity = build(:bulk_import_entity, :group_entity, group: build(:group), project: nil, destination_namespace: nil)
+ expect(entity).not_to be_valid
+ expect(entity.errors).to include(:destination_namespace)
+ end
+
it 'is invalid as a project_entity' do
entity = build(:bulk_import_entity, :group_entity, group: nil, project: build(:project))
@@ -94,7 +103,9 @@ RSpec.describe BulkImports::Entity, type: :model do
)
expect(entity).not_to be_valid
- expect(entity.errors).to include(:destination_namespace)
+ expect(entity.errors).to include(:base)
+ expect(entity.errors[:base])
+ .to include('Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again.')
end
it 'is invalid if destination namespace is a descendant of the source' do
@@ -109,7 +120,8 @@ RSpec.describe BulkImports::Entity, type: :model do
)
expect(entity).not_to be_valid
- expect(entity.errors).to include(:destination_namespace)
+ expect(entity.errors[:base])
+ .to include('Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again.')
end
end
end
diff --git a/spec/models/ci/bridge_spec.rb b/spec/models/ci/bridge_spec.rb
index b50e4204e0a..f3029598b02 100644
--- a/spec/models/ci/bridge_spec.rb
+++ b/spec/models/ci/bridge_spec.rb
@@ -41,7 +41,7 @@ RSpec.describe Ci::Bridge do
end
end
- describe '#scoped_variables_hash' do
+ describe '#scoped_variables' do
it 'returns a hash representing variables' do
variables = %w[
CI_JOB_NAME CI_JOB_STAGE CI_COMMIT_SHA CI_COMMIT_SHORT_SHA
@@ -53,7 +53,7 @@ RSpec.describe Ci::Bridge do
CI_COMMIT_TIMESTAMP
]
- expect(bridge.scoped_variables_hash.keys).to include(*variables)
+ expect(bridge.scoped_variables.map { |v| v[:key] }).to include(*variables)
end
context 'when bridge has dependency which has dotenv variable' do
@@ -63,7 +63,7 @@ RSpec.describe Ci::Bridge do
let!(:job_variable) { create(:ci_job_variable, :dotenv_source, job: test) }
it 'includes inherited variable' do
- expect(bridge.scoped_variables_hash).to include(job_variable.key => job_variable.value)
+ expect(bridge.scoped_variables.to_hash).to include(job_variable.key => job_variable.value)
end
end
end
diff --git a/spec/models/ci/build_spec.rb b/spec/models/ci/build_spec.rb
index 4ad7ce70a44..811decf42d7 100644
--- a/spec/models/ci/build_spec.rb
+++ b/spec/models/ci/build_spec.rb
@@ -581,7 +581,7 @@ RSpec.describe Ci::Build do
end
it 'that cannot handle build' do
- expect_any_instance_of(Ci::Runner).to receive(:can_pick?).and_return(false)
+ expect_any_instance_of(Ci::Runner).to receive(:matches_build?).with(build).and_return(false)
is_expected.to be_falsey
end
end
@@ -817,7 +817,48 @@ RSpec.describe Ci::Build do
end
describe '#cache' do
- let(:options) { { cache: { key: "key", paths: ["public"], policy: "pull-push" } } }
+ let(:options) do
+ { cache: [{ key: "key", paths: ["public"], policy: "pull-push" }] }
+ end
+
+ context 'with multiple_cache_per_job FF disabled' do
+ before do
+ stub_feature_flags(multiple_cache_per_job: false)
+ end
+ let(:options) { { cache: { key: "key", paths: ["public"], policy: "pull-push" } } }
+
+ subject { build.cache }
+
+ context 'when build has cache' do
+ before do
+ allow(build).to receive(:options).and_return(options)
+ end
+
+ context 'when project has jobs_cache_index' do
+ before do
+ allow_any_instance_of(Project).to receive(:jobs_cache_index).and_return(1)
+ end
+
+ it { is_expected.to be_an(Array).and all(include(key: "key-1")) }
+ end
+
+ context 'when project does not have jobs_cache_index' do
+ before do
+ allow_any_instance_of(Project).to receive(:jobs_cache_index).and_return(nil)
+ end
+
+ it { is_expected.to eq([options[:cache]]) }
+ end
+ end
+
+ context 'when build does not have cache' do
+ before do
+ allow(build).to receive(:options).and_return({})
+ end
+
+ it { is_expected.to eq([]) }
+ end
+ end
subject { build.cache }
@@ -826,6 +867,21 @@ RSpec.describe Ci::Build do
allow(build).to receive(:options).and_return(options)
end
+ context 'when build has multiple caches' do
+ let(:options) do
+ { cache: [
+ { key: "key", paths: ["public"], policy: "pull-push" },
+ { key: "key2", paths: ["public"], policy: "pull-push" }
+ ] }
+ end
+
+ before do
+ allow_any_instance_of(Project).to receive(:jobs_cache_index).and_return(1)
+ end
+
+ it { is_expected.to match([a_hash_including(key: "key-1"), a_hash_including(key: "key2-1")]) }
+ end
+
context 'when project has jobs_cache_index' do
before do
allow_any_instance_of(Project).to receive(:jobs_cache_index).and_return(1)
@@ -839,7 +895,7 @@ RSpec.describe Ci::Build do
allow_any_instance_of(Project).to receive(:jobs_cache_index).and_return(nil)
end
- it { is_expected.to eq([options[:cache]]) }
+ it { is_expected.to eq(options[:cache]) }
end
end
@@ -848,7 +904,7 @@ RSpec.describe Ci::Build do
allow(build).to receive(:options).and_return({})
end
- it { is_expected.to eq([nil]) }
+ it { is_expected.to be_empty }
end
end
@@ -1205,6 +1261,21 @@ RSpec.describe Ci::Build do
end
end
+ describe '#environment_deployment_tier' do
+ subject { build.environment_deployment_tier }
+
+ let(:build) { described_class.new(options: options) }
+ let(:options) { { environment: { deployment_tier: 'production' } } }
+
+ it { is_expected.to eq('production') }
+
+ context 'when options does not include deployment_tier' do
+ let(:options) { { environment: { name: 'production' } } }
+
+ it { is_expected.to be_nil }
+ end
+ end
+
describe 'deployment' do
describe '#outdated_deployment?' do
subject { build.outdated_deployment? }
@@ -2367,6 +2438,7 @@ RSpec.describe Ci::Build do
{ key: 'CI_JOB_ID', value: build.id.to_s, public: true, masked: false },
{ key: 'CI_JOB_URL', value: project.web_url + "/-/jobs/#{build.id}", public: true, masked: false },
{ key: 'CI_JOB_TOKEN', value: 'my-token', public: false, masked: true },
+ { key: 'CI_JOB_STARTED_AT', value: build.started_at&.iso8601, public: true, masked: false },
{ key: 'CI_BUILD_ID', value: build.id.to_s, public: true, masked: false },
{ key: 'CI_BUILD_TOKEN', value: 'my-token', public: false, masked: true },
{ key: 'CI_REGISTRY_USER', value: 'gitlab-ci-token', public: true, masked: false },
@@ -2405,17 +2477,18 @@ RSpec.describe Ci::Build do
{ key: 'CI_PROJECT_REPOSITORY_LANGUAGES', value: project.repository_languages.map(&:name).join(',').downcase, public: true, masked: false },
{ key: 'CI_DEFAULT_BRANCH', value: project.default_branch, public: true, masked: false },
{ key: 'CI_PROJECT_CONFIG_PATH', value: project.ci_config_path_or_default, public: true, masked: false },
+ { key: 'CI_CONFIG_PATH', value: project.ci_config_path_or_default, public: true, masked: false },
{ key: 'CI_PAGES_DOMAIN', value: Gitlab.config.pages.host, public: true, masked: false },
{ key: 'CI_PAGES_URL', value: project.pages_url, public: true, masked: false },
- { key: 'CI_DEPENDENCY_PROXY_SERVER', value: "#{Gitlab.config.gitlab.host}:#{Gitlab.config.gitlab.port}", public: true, masked: false },
+ { key: 'CI_DEPENDENCY_PROXY_SERVER', value: Gitlab.host_with_port, public: true, masked: false },
{ key: 'CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX',
- value: "#{Gitlab.config.gitlab.host}:#{Gitlab.config.gitlab.port}/#{project.namespace.root_ancestor.path}#{DependencyProxy::URL_SUFFIX}",
+ value: "#{Gitlab.host_with_port}/#{project.namespace.root_ancestor.path}#{DependencyProxy::URL_SUFFIX}",
public: true,
masked: false },
{ key: 'CI_API_V4_URL', value: 'http://localhost/api/v4', public: true, masked: false },
{ key: 'CI_PIPELINE_IID', value: pipeline.iid.to_s, public: true, masked: false },
{ key: 'CI_PIPELINE_SOURCE', value: pipeline.source, public: true, masked: false },
- { key: 'CI_CONFIG_PATH', value: pipeline.config_path, public: true, masked: false },
+ { key: 'CI_PIPELINE_CREATED_AT', value: pipeline.created_at.iso8601, public: true, masked: false },
{ key: 'CI_COMMIT_SHA', value: build.sha, public: true, masked: false },
{ key: 'CI_COMMIT_SHORT_SHA', value: build.short_sha, public: true, masked: false },
{ key: 'CI_COMMIT_BEFORE_SHA', value: build.before_sha, public: true, masked: false },
@@ -2440,7 +2513,8 @@ RSpec.describe Ci::Build do
build.yaml_variables = []
end
- it { is_expected.to eq(predefined_variables) }
+ it { is_expected.to be_instance_of(Gitlab::Ci::Variables::Collection) }
+ it { expect(subject.to_runner_variables).to eq(predefined_variables) }
context 'when ci_job_jwt feature flag is disabled' do
before do
@@ -2495,7 +2569,7 @@ RSpec.describe Ci::Build do
end
it 'returns variables in order depending on resource hierarchy' do
- is_expected.to eq(
+ expect(subject.to_runner_variables).to eq(
[dependency_proxy_var,
job_jwt_var,
build_pre_var,
@@ -2525,7 +2599,7 @@ RSpec.describe Ci::Build do
end
it 'matches explicit variables ordering' do
- received_variables = subject.map { |variable| variable.fetch(:key) }
+ received_variables = subject.map { |variable| variable[:key] }
expect(received_variables).to eq expected_variables
end
@@ -2584,14 +2658,14 @@ RSpec.describe Ci::Build do
end
shared_examples 'containing environment variables' do
- it { environment_variables.each { |v| is_expected.to include(v) } }
+ it { is_expected.to include(*environment_variables) }
end
context 'when no URL was set' do
it_behaves_like 'containing environment variables'
it 'does not have CI_ENVIRONMENT_URL' do
- keys = subject.map { |var| var[:key] }
+ keys = subject.pluck(:key)
expect(keys).not_to include('CI_ENVIRONMENT_URL')
end
@@ -2618,7 +2692,7 @@ RSpec.describe Ci::Build do
it_behaves_like 'containing environment variables'
it 'puts $CI_ENVIRONMENT_URL in the last so all other variables are available to be used when runners are trying to expand it' do
- expect(subject.last).to eq(environment_variables.last)
+ expect(subject.to_runner_variables.last).to eq(environment_variables.last)
end
end
end
@@ -2951,7 +3025,7 @@ RSpec.describe Ci::Build do
end
it 'overrides YAML variable using a pipeline variable' do
- variables = subject.reverse.uniq { |variable| variable[:key] }.reverse
+ variables = subject.to_runner_variables.reverse.uniq { |variable| variable[:key] }.reverse
expect(variables)
.not_to include(key: 'MYVAR', value: 'myvar', public: true, masked: false)
@@ -3248,47 +3322,6 @@ RSpec.describe Ci::Build do
end
end
- describe '#scoped_variables_hash' do
- context 'when overriding CI variables' do
- before do
- project.variables.create!(key: 'MY_VAR', value: 'my value 1')
- pipeline.variables.create!(key: 'MY_VAR', value: 'my value 2')
- end
-
- it 'returns a regular hash created using valid ordering' do
- expect(build.scoped_variables_hash).to include('MY_VAR': 'my value 2')
- expect(build.scoped_variables_hash).not_to include('MY_VAR': 'my value 1')
- end
- end
-
- context 'when overriding user-provided variables' do
- let(:build) do
- create(:ci_build, pipeline: pipeline, yaml_variables: [{ key: 'MY_VAR', value: 'myvar', public: true }])
- end
-
- before do
- pipeline.variables.build(key: 'MY_VAR', value: 'pipeline value')
- end
-
- it 'returns a hash including variable with higher precedence' do
- expect(build.scoped_variables_hash).to include('MY_VAR': 'pipeline value')
- expect(build.scoped_variables_hash).not_to include('MY_VAR': 'myvar')
- end
- end
-
- context 'when overriding CI instance variables' do
- before do
- create(:ci_instance_variable, key: 'MY_VAR', value: 'my value 1')
- group.variables.create!(key: 'MY_VAR', value: 'my value 2')
- end
-
- it 'returns a regular hash created using valid ordering' do
- expect(build.scoped_variables_hash).to include('MY_VAR': 'my value 2')
- expect(build.scoped_variables_hash).not_to include('MY_VAR': 'my value 1')
- end
- end
- end
-
describe '#any_unmet_prerequisites?' do
let(:build) { create(:ci_build, :created) }
diff --git a/spec/models/ci/daily_build_group_report_result_spec.rb b/spec/models/ci/daily_build_group_report_result_spec.rb
index f6e6a6a5e02..4e96ec7cecb 100644
--- a/spec/models/ci/daily_build_group_report_result_spec.rb
+++ b/spec/models/ci/daily_build_group_report_result_spec.rb
@@ -162,39 +162,5 @@ RSpec.describe Ci::DailyBuildGroupReportResult do
end
end
end
-
- describe '.by_date' do
- subject(:coverages) { described_class.by_date(start_date) }
-
- let!(:coverage_1) { create(:ci_daily_build_group_report_result, date: 1.week.ago) }
-
- context 'when project has several coverage' do
- let!(:coverage_2) { create(:ci_daily_build_group_report_result, date: 2.weeks.ago) }
- let(:start_date) { 1.week.ago.to_date.to_s }
-
- it 'returns the coverage from the start_date' do
- expect(coverages).to contain_exactly(coverage_1)
- end
- end
-
- context 'when start_date is over 90 days' do
- let!(:coverage_2) { create(:ci_daily_build_group_report_result, date: 90.days.ago) }
- let!(:coverage_3) { create(:ci_daily_build_group_report_result, date: 91.days.ago) }
- let(:start_date) { 1.year.ago.to_date.to_s }
-
- it 'returns the coverage in the last 90 days' do
- expect(coverages).to contain_exactly(coverage_1, coverage_2)
- end
- end
-
- context 'when start_date is not a string' do
- let!(:coverage_2) { create(:ci_daily_build_group_report_result, date: 90.days.ago) }
- let(:start_date) { 1.week.ago }
-
- it 'returns the coverage in the last 90 days' do
- expect(coverages).to contain_exactly(coverage_1, coverage_2)
- end
- end
- end
end
end
diff --git a/spec/models/ci/group_variable_spec.rb b/spec/models/ci/group_variable_spec.rb
index c8eac4d8765..f0eec549da7 100644
--- a/spec/models/ci/group_variable_spec.rb
+++ b/spec/models/ci/group_variable_spec.rb
@@ -9,7 +9,17 @@ RSpec.describe Ci::GroupVariable do
it { is_expected.to include_module(Presentable) }
it { is_expected.to include_module(Ci::Maskable) }
- it { is_expected.to validate_uniqueness_of(:key).scoped_to(:group_id).with_message(/\(\w+\) has already been taken/) }
+ it { is_expected.to include_module(HasEnvironmentScope) }
+ it { is_expected.to validate_uniqueness_of(:key).scoped_to([:group_id, :environment_scope]).with_message(/\(\w+\) has already been taken/) }
+
+ describe '.by_environment_scope' do
+ let!(:matching_variable) { create(:ci_group_variable, environment_scope: 'production ') }
+ let!(:non_matching_variable) { create(:ci_group_variable, environment_scope: 'staging') }
+
+ subject { Ci::GroupVariable.by_environment_scope('production') }
+
+ it { is_expected.to contain_exactly(matching_variable) }
+ end
describe '.unprotected' do
subject { described_class.unprotected }
diff --git a/spec/models/ci/pipeline_spec.rb b/spec/models/ci/pipeline_spec.rb
index 94943fb3644..d57a39d133f 100644
--- a/spec/models/ci/pipeline_spec.rb
+++ b/spec/models/ci/pipeline_spec.rb
@@ -8,12 +8,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
include Ci::SourcePipelineHelpers
let_it_be(:user) { create(:user) }
- let_it_be(:namespace) { create_default(:namespace) }
- let_it_be(:project) { create_default(:project, :repository) }
-
- let(:pipeline) do
- create(:ci_empty_pipeline, status: :created, project: project)
- end
+ let_it_be(:namespace) { create_default(:namespace).freeze }
+ let_it_be(:project) { create_default(:project, :repository).freeze }
it_behaves_like 'having unique enum values'
@@ -53,6 +49,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe 'associations' do
+ let_it_be(:pipeline) { create(:ci_empty_pipeline, :created) }
+
it 'has a bidirectional relationship with projects' do
expect(described_class.reflect_on_association(:project).has_inverse?).to eq(:all_pipelines)
expect(Project.reflect_on_association(:all_pipelines).has_inverse?).to eq(:project)
@@ -82,6 +80,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe '#set_status' do
+ let(:pipeline) { build(:ci_empty_pipeline, :created) }
+
where(:from_status, :to_status) do
from_status_names = described_class.state_machines[:status].states.map(&:name)
to_status_names = from_status_names - [:created] # we never want to transition into created
@@ -105,6 +105,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe '.processables' do
+ let_it_be(:pipeline) { create(:ci_empty_pipeline, :created) }
+
before do
create(:ci_build, name: 'build', pipeline: pipeline)
create(:ci_bridge, name: 'bridge', pipeline: pipeline)
@@ -142,7 +144,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
subject { described_class.for_sha(sha) }
let(:sha) { 'abc' }
- let!(:pipeline) { create(:ci_pipeline, sha: 'abc') }
+
+ let_it_be(:pipeline) { create(:ci_pipeline, sha: 'abc') }
it 'returns the pipeline' do
is_expected.to contain_exactly(pipeline)
@@ -170,7 +173,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
subject { described_class.for_source_sha(source_sha) }
let(:source_sha) { 'abc' }
- let!(:pipeline) { create(:ci_pipeline, source_sha: 'abc') }
+
+ let_it_be(:pipeline) { create(:ci_pipeline, source_sha: 'abc') }
it 'returns the pipeline' do
is_expected.to contain_exactly(pipeline)
@@ -228,7 +232,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
subject { described_class.for_branch(branch) }
let(:branch) { 'master' }
- let!(:pipeline) { create(:ci_pipeline, ref: 'master') }
+
+ let_it_be(:pipeline) { create(:ci_pipeline, ref: 'master') }
it 'returns the pipeline' do
is_expected.to contain_exactly(pipeline)
@@ -247,13 +252,16 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
describe '.ci_sources' do
subject { described_class.ci_sources }
- let!(:push_pipeline) { create(:ci_pipeline, source: :push) }
- let!(:web_pipeline) { create(:ci_pipeline, source: :web) }
- let!(:api_pipeline) { create(:ci_pipeline, source: :api) }
- let!(:webide_pipeline) { create(:ci_pipeline, source: :webide) }
- let!(:child_pipeline) { create(:ci_pipeline, source: :parent_pipeline) }
+ let(:push_pipeline) { build(:ci_pipeline, source: :push) }
+ let(:web_pipeline) { build(:ci_pipeline, source: :web) }
+ let(:api_pipeline) { build(:ci_pipeline, source: :api) }
+ let(:webide_pipeline) { build(:ci_pipeline, source: :webide) }
+ let(:child_pipeline) { build(:ci_pipeline, source: :parent_pipeline) }
+ let(:pipelines) { [push_pipeline, web_pipeline, api_pipeline, webide_pipeline, child_pipeline] }
it 'contains pipelines having CI only sources' do
+ pipelines.map(&:save!)
+
expect(subject).to contain_exactly(push_pipeline, web_pipeline, api_pipeline)
end
@@ -365,8 +373,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
end
- describe '#merge_request_pipeline?' do
- subject { pipeline.merge_request_pipeline? }
+ describe '#merged_result_pipeline?' do
+ subject { pipeline.merged_result_pipeline? }
let!(:pipeline) do
create(:ci_pipeline, source: :merge_request_event, merge_request: merge_request, target_sha: target_sha)
@@ -387,6 +395,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
describe '#merge_request_ref?' do
subject { pipeline.merge_request_ref? }
+ let(:pipeline) { build(:ci_empty_pipeline, :created) }
+
it 'calls MergeRequest#merge_request_ref?' do
expect(MergeRequest).to receive(:merge_request_ref?).with(pipeline.ref)
@@ -606,7 +616,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
describe '#source' do
context 'when creating new pipeline' do
let(:pipeline) do
- build(:ci_empty_pipeline, status: :created, project: project, source: nil)
+ build(:ci_empty_pipeline, :created, project: project, source: nil)
end
it "prevents from creating an object" do
@@ -615,17 +625,21 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
context 'when updating existing pipeline' do
+ let(:pipeline) { create(:ci_empty_pipeline, :created) }
+
before do
pipeline.update_attribute(:source, nil)
end
- it "object is valid" do
+ it 'object is valid' do
expect(pipeline).to be_valid
end
end
end
describe '#block' do
+ let(:pipeline) { create(:ci_empty_pipeline, :created) }
+
it 'changes pipeline status to manual' do
expect(pipeline.block).to be true
expect(pipeline.reload).to be_manual
@@ -636,7 +650,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
describe '#delay' do
subject { pipeline.delay }
- let(:pipeline) { build(:ci_pipeline, status: :created) }
+ let(:pipeline) { build(:ci_pipeline, :created) }
it 'changes pipeline status to schedule' do
subject
@@ -646,6 +660,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe '#valid_commit_sha' do
+ let(:pipeline) { build_stubbed(:ci_empty_pipeline, :created, project: project) }
+
context 'commit.sha can not start with 00000000' do
before do
pipeline.sha = '0' * 40
@@ -659,6 +675,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
describe '#short_sha' do
subject { pipeline.short_sha }
+ let(:pipeline) { build_stubbed(:ci_empty_pipeline, :created) }
+
it 'has 8 items' do
expect(subject.size).to eq(8)
end
@@ -668,49 +686,58 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
describe '#retried' do
subject { pipeline.retried }
+ let(:pipeline) { create(:ci_empty_pipeline, :created, project: project) }
+ let!(:build1) { create(:ci_build, pipeline: pipeline, name: 'deploy', retried: true) }
+
before do
- @build1 = create(:ci_build, pipeline: pipeline, name: 'deploy', retried: true)
- @build2 = create(:ci_build, pipeline: pipeline, name: 'deploy')
+ create(:ci_build, pipeline: pipeline, name: 'deploy')
end
it 'returns old builds' do
- is_expected.to contain_exactly(@build1)
+ is_expected.to contain_exactly(build1)
end
end
describe '#coverage' do
- let(:project) { create(:project, build_coverage_regex: "/.*/") }
- let(:pipeline) { create(:ci_empty_pipeline, project: project) }
+ let_it_be_with_reload(:pipeline) { create(:ci_empty_pipeline) }
- it "calculates average when there are two builds with coverage" do
- create(:ci_build, name: "rspec", coverage: 30, pipeline: pipeline)
- create(:ci_build, name: "rubocop", coverage: 40, pipeline: pipeline)
- expect(pipeline.coverage).to eq("35.00")
- end
+ context 'with multiple pipelines' do
+ before_all do
+ create(:ci_build, name: "rspec", coverage: 30, pipeline: pipeline)
+ create(:ci_build, name: "rubocop", coverage: 40, pipeline: pipeline)
+ end
- it "calculates average when there are two builds with coverage and one with nil" do
- create(:ci_build, name: "rspec", coverage: 30, pipeline: pipeline)
- create(:ci_build, name: "rubocop", coverage: 40, pipeline: pipeline)
- create(:ci_build, pipeline: pipeline)
- expect(pipeline.coverage).to eq("35.00")
- end
+ it "calculates average when there are two builds with coverage" do
+ expect(pipeline.coverage).to eq("35.00")
+ end
+
+ it "calculates average when there are two builds with coverage and one with nil" do
+ create(:ci_build, pipeline: pipeline)
+
+ expect(pipeline.coverage).to eq("35.00")
+ end
- it "calculates average when there are two builds with coverage and one is retried" do
- create(:ci_build, name: "rspec", coverage: 30, pipeline: pipeline)
- create(:ci_build, name: "rubocop", coverage: 30, pipeline: pipeline, retried: true)
- create(:ci_build, name: "rubocop", coverage: 40, pipeline: pipeline)
- expect(pipeline.coverage).to eq("35.00")
+ it "calculates average when there are two builds with coverage and one is retried" do
+ create(:ci_build, name: "rubocop", coverage: 30, pipeline: pipeline, retried: true)
+
+ expect(pipeline.coverage).to eq("35.00")
+ end
end
- it "calculates average when there is one build without coverage" do
- FactoryBot.create(:ci_build, pipeline: pipeline)
- expect(pipeline.coverage).to be_nil
+ context 'when there is one build without coverage' do
+ it "calculates average to nil" do
+ create(:ci_build, pipeline: pipeline)
+
+ expect(pipeline.coverage).to be_nil
+ end
end
end
describe '#retryable?' do
subject { pipeline.retryable? }
+ let_it_be(:pipeline) { create(:ci_empty_pipeline, :created, project: project) }
+
context 'no failed builds' do
before do
create_build('rspec', 'success')
@@ -772,13 +799,15 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
describe '#predefined_variables' do
subject { pipeline.predefined_variables }
+ let(:pipeline) { build(:ci_empty_pipeline, :created) }
+
it 'includes all predefined variables in a valid order' do
keys = subject.map { |variable| variable[:key] }
expect(keys).to eq %w[
CI_PIPELINE_IID
CI_PIPELINE_SOURCE
- CI_CONFIG_PATH
+ CI_PIPELINE_CREATED_AT
CI_COMMIT_SHA
CI_COMMIT_SHORT_SHA
CI_COMMIT_BEFORE_SHA
@@ -798,21 +827,18 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
context 'when merge request is present' do
+ let_it_be(:assignees) { create_list(:user, 2) }
+ let_it_be(:milestone) { create(:milestone, project: project) }
+ let_it_be(:labels) { create_list(:label, 2) }
let(:merge_request) do
- create(:merge_request,
+ create(:merge_request, :simple,
source_project: project,
- source_branch: 'feature',
target_project: project,
- target_branch: 'master',
assignees: assignees,
milestone: milestone,
labels: labels)
end
- let(:assignees) { create_list(:user, 2) }
- let(:milestone) { create(:milestone, project: project) }
- let(:labels) { create_list(:label, 2) }
-
context 'when pipeline for merge request is created' do
let(:pipeline) do
create(:ci_pipeline, :detached_merge_request_pipeline,
@@ -998,9 +1024,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe '#protected_ref?' do
- before do
- pipeline.project = create(:project, :repository)
- end
+ let(:pipeline) { build(:ci_empty_pipeline, :created) }
it 'delegates method to project' do
expect(pipeline).not_to be_protected_ref
@@ -1008,11 +1032,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe '#legacy_trigger' do
- let(:trigger_request) { create(:ci_trigger_request) }
-
- before do
- pipeline.trigger_requests << trigger_request
- end
+ let(:trigger_request) { build(:ci_trigger_request) }
+ let(:pipeline) { build(:ci_empty_pipeline, :created, trigger_requests: [trigger_request]) }
it 'returns first trigger request' do
expect(pipeline.legacy_trigger).to eq trigger_request
@@ -1022,6 +1043,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
describe '#auto_canceled?' do
subject { pipeline.auto_canceled? }
+ let(:pipeline) { build(:ci_empty_pipeline, :created) }
+
context 'when it is canceled' do
before do
pipeline.cancel
@@ -1029,7 +1052,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
context 'when there is auto_canceled_by' do
before do
- pipeline.update!(auto_canceled_by: create(:ci_empty_pipeline))
+ pipeline.auto_canceled_by = create(:ci_empty_pipeline)
end
it 'is auto canceled' do
@@ -1057,6 +1080,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe 'pipeline stages' do
+ let(:pipeline) { build(:ci_empty_pipeline, :created) }
+
describe 'legacy stages' do
before do
create(:commit_status, pipeline: pipeline,
@@ -1107,22 +1132,28 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
context 'when commit status is retried' do
- before do
+ let!(:old_commit_status) do
create(:commit_status, pipeline: pipeline,
- stage: 'build',
- name: 'mac',
- stage_idx: 0,
- status: 'success')
-
- Ci::ProcessPipelineService
- .new(pipeline)
- .execute
+ stage: 'build',
+ name: 'mac',
+ stage_idx: 0,
+ status: 'success')
end
- it 'ignores the previous state' do
- expect(statuses).to eq([%w(build success),
- %w(test success),
- %w(deploy running)])
+ context 'when FF ci_remove_update_retried_from_process_pipeline is disabled' do
+ before do
+ stub_feature_flags(ci_remove_update_retried_from_process_pipeline: false)
+
+ Ci::ProcessPipelineService
+ .new(pipeline)
+ .execute
+ end
+
+ it 'ignores the previous state' do
+ expect(statuses).to eq([%w(build success),
+ %w(test success),
+ %w(deploy running)])
+ end
end
end
end
@@ -1162,6 +1193,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
describe '#legacy_stage' do
subject { pipeline.legacy_stage('test') }
+ let(:pipeline) { build(:ci_empty_pipeline, :created) }
+
context 'with status in stage' do
before do
create(:commit_status, pipeline: pipeline, stage: 'test')
@@ -1184,6 +1217,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe '#stages' do
+ let(:pipeline) { build(:ci_empty_pipeline, :created) }
+
before do
create(:ci_stage_entity, project: project,
pipeline: pipeline,
@@ -1238,6 +1273,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe 'state machine' do
+ let_it_be_with_reload(:pipeline) { create(:ci_empty_pipeline, :created) }
let(:current) { Time.current.change(usec: 0) }
let(:build) { create_build('build1', queued_at: 0) }
let(:build_b) { create_build('build2', queued_at: 0) }
@@ -1401,28 +1437,10 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe 'pipeline caching' do
- context 'if pipeline is cacheable' do
- before do
- pipeline.source = 'push'
- end
-
- it 'performs ExpirePipelinesCacheWorker' do
- expect(ExpirePipelineCacheWorker).to receive(:perform_async).with(pipeline.id)
+ it 'performs ExpirePipelinesCacheWorker' do
+ expect(ExpirePipelineCacheWorker).to receive(:perform_async).with(pipeline.id)
- pipeline.cancel
- end
- end
-
- context 'if pipeline is not cacheable' do
- before do
- pipeline.source = 'webide'
- end
-
- it 'deos not perform ExpirePipelinesCacheWorker' do
- expect(ExpirePipelineCacheWorker).not_to receive(:perform_async)
-
- pipeline.cancel
- end
+ pipeline.cancel
end
end
@@ -1441,24 +1459,25 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe 'auto merge' do
- let(:merge_request) { create(:merge_request, :merge_when_pipeline_succeeds) }
-
- let(:pipeline) do
- create(:ci_pipeline, :running, project: merge_request.source_project,
- ref: merge_request.source_branch,
- sha: merge_request.diff_head_sha)
- end
+ context 'when auto merge is enabled' do
+ let_it_be_with_reload(:merge_request) { create(:merge_request, :merge_when_pipeline_succeeds) }
+ let_it_be_with_reload(:pipeline) do
+ create(:ci_pipeline, :running, project: merge_request.source_project,
+ ref: merge_request.source_branch,
+ sha: merge_request.diff_head_sha)
+ end
- before do
- merge_request.update_head_pipeline
- end
+ before_all do
+ merge_request.update_head_pipeline
+ end
- %w[succeed! drop! cancel! skip!].each do |action|
- context "when the pipeline recieved #{action} event" do
- it 'performs AutoMergeProcessWorker' do
- expect(AutoMergeProcessWorker).to receive(:perform_async).with(merge_request.id)
+ %w[succeed! drop! cancel! skip!].each do |action|
+ context "when the pipeline recieved #{action} event" do
+ it 'performs AutoMergeProcessWorker' do
+ expect(AutoMergeProcessWorker).to receive(:perform_async).with(merge_request.id)
- pipeline.public_send(action)
+ pipeline.public_send(action)
+ end
end
end
end
@@ -1610,15 +1629,15 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
context 'multi-project pipelines' do
let!(:downstream_project) { create(:project, :repository) }
- let!(:upstream_pipeline) { create(:ci_pipeline, project: project) }
+ let!(:upstream_pipeline) { create(:ci_pipeline) }
let!(:downstream_pipeline) { create(:ci_pipeline, :with_job, project: downstream_project) }
it_behaves_like 'upstream downstream pipeline'
end
context 'parent-child pipelines' do
- let!(:upstream_pipeline) { create(:ci_pipeline, project: project) }
- let!(:downstream_pipeline) { create(:ci_pipeline, :with_job, project: project) }
+ let!(:upstream_pipeline) { create(:ci_pipeline) }
+ let!(:downstream_pipeline) { create(:ci_pipeline, :with_job) }
it_behaves_like 'upstream downstream pipeline'
end
@@ -1637,6 +1656,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
describe '#branch?' do
subject { pipeline.branch? }
+ let(:pipeline) { build(:ci_empty_pipeline, :created) }
+
context 'when ref is not a tag' do
before do
pipeline.tag = false
@@ -1647,16 +1668,12 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
context 'when pipeline is merge request' do
- let(:pipeline) do
- create(:ci_pipeline, merge_request: merge_request)
- end
+ let(:pipeline) { build(:ci_pipeline, merge_request: merge_request) }
let(:merge_request) do
- create(:merge_request,
+ create(:merge_request, :simple,
source_project: project,
- source_branch: 'feature',
- target_project: project,
- target_branch: 'master')
+ target_project: project)
end
it 'returns false' do
@@ -1720,6 +1737,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
context 'when repository exists' do
using RSpec::Parameterized::TableSyntax
+ let_it_be(:pipeline, refind: true) { create(:ci_empty_pipeline) }
+
where(:tag, :ref, :result) do
false | 'master' | true
false | 'non-existent-branch' | false
@@ -1728,8 +1747,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
with_them do
- let(:pipeline) do
- create(:ci_empty_pipeline, project: project, tag: tag, ref: ref)
+ before do
+ pipeline.update!(tag: tag, ref: ref)
end
it "correctly detects ref" do
@@ -1739,10 +1758,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
context 'when repository does not exist' do
- let(:project) { create(:project) }
- let(:pipeline) do
- create(:ci_empty_pipeline, project: project, ref: 'master')
- end
+ let(:pipeline) { build(:ci_empty_pipeline, ref: 'master', project: build(:project)) }
it 'always returns false' do
expect(pipeline.ref_exists?).to eq false
@@ -1753,7 +1769,6 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
context 'with non-empty project' do
let(:pipeline) do
create(:ci_pipeline,
- project: project,
ref: project.default_branch,
sha: project.commit.sha)
end
@@ -1761,14 +1776,12 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
describe '#lazy_ref_commit' do
let(:another) do
create(:ci_pipeline,
- project: project,
ref: 'feature',
sha: project.commit('feature').sha)
end
let(:unicode) do
create(:ci_pipeline,
- project: project,
ref: 'ü/unicode/multi-byte')
end
@@ -1827,6 +1840,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
describe '#manual_actions' do
subject { pipeline.manual_actions }
+ let(:pipeline) { create(:ci_empty_pipeline, :created) }
+
it 'when none defined' do
is_expected.to be_empty
end
@@ -1853,9 +1868,11 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe '#branch_updated?' do
+ let(:pipeline) { create(:ci_empty_pipeline, :created) }
+
context 'when pipeline has before SHA' do
before do
- pipeline.update_column(:before_sha, 'a1b2c3d4')
+ pipeline.update!(before_sha: 'a1b2c3d4')
end
it 'runs on a branch update push' do
@@ -1866,7 +1883,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
context 'when pipeline does not have before SHA' do
before do
- pipeline.update_column(:before_sha, Gitlab::Git::BLANK_SHA)
+ pipeline.update!(before_sha: Gitlab::Git::BLANK_SHA)
end
it 'does not run on a branch updating push' do
@@ -1876,6 +1893,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe '#modified_paths' do
+ let(:pipeline) { create(:ci_empty_pipeline, :created) }
+
context 'when old and new revisions are set' do
before do
pipeline.update!(before_sha: '1234abcd', sha: '2345bcde')
@@ -1892,7 +1911,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
context 'when either old or new revision is missing' do
before do
- pipeline.update_column(:before_sha, Gitlab::Git::BLANK_SHA)
+ pipeline.update!(before_sha: Gitlab::Git::BLANK_SHA)
end
it 'returns nil' do
@@ -1906,11 +1925,9 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
let(:merge_request) do
- create(:merge_request,
+ create(:merge_request, :simple,
source_project: project,
- source_branch: 'feature',
- target_project: project,
- target_branch: 'master')
+ target_project: project)
end
it 'returns merge request modified paths' do
@@ -1944,6 +1961,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe '#has_kubernetes_active?' do
+ let(:pipeline) { create(:ci_empty_pipeline, :created, project: project) }
+
context 'when kubernetes is active' do
context 'when user configured kubernetes from CI/CD > Clusters' do
let!(:cluster) { create(:cluster, :project, :provided_by_gcp) }
@@ -1965,6 +1984,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
describe '#has_warnings?' do
subject { pipeline.has_warnings? }
+ let_it_be(:pipeline) { create(:ci_empty_pipeline, :created) }
+
context 'build which is allowed to fail fails' do
before do
create :ci_build, :success, pipeline: pipeline, name: 'rspec'
@@ -2021,6 +2042,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe '#number_of_warnings' do
+ let_it_be(:pipeline) { create(:ci_empty_pipeline, :created) }
+
it 'returns the number of warnings' do
create(:ci_build, :allowed_to_fail, :failed, pipeline: pipeline, name: 'rubocop')
create(:ci_bridge, :allowed_to_fail, :failed, pipeline: pipeline, name: 'rubocop')
@@ -2029,7 +2052,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
it 'supports eager loading of the number of warnings' do
- pipeline2 = create(:ci_empty_pipeline, status: :created, project: project)
+ pipeline2 = create(:ci_empty_pipeline, :created)
create(:ci_build, :allowed_to_fail, :failed, pipeline: pipeline, name: 'rubocop')
create(:ci_build, :allowed_to_fail, :failed, pipeline: pipeline2, name: 'rubocop')
@@ -2053,6 +2076,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
subject { pipeline.needs_processing? }
+ let_it_be(:pipeline) { create(:ci_empty_pipeline, :created) }
+
where(:processed, :result) do
nil | true
false | true
@@ -2072,122 +2097,107 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
end
- shared_context 'with some outdated pipelines' do
- before do
- create_pipeline(:canceled, 'ref', 'A', project)
- create_pipeline(:success, 'ref', 'A', project)
- create_pipeline(:failed, 'ref', 'B', project)
- create_pipeline(:skipped, 'feature', 'C', project)
+ context 'with outdated pipelines' do
+ before_all do
+ create_pipeline(:canceled, 'ref', 'A')
+ create_pipeline(:success, 'ref', 'A')
+ create_pipeline(:failed, 'ref', 'B')
+ create_pipeline(:skipped, 'feature', 'C')
end
- def create_pipeline(status, ref, sha, project)
+ def create_pipeline(status, ref, sha)
create(
:ci_empty_pipeline,
status: status,
ref: ref,
- sha: sha,
- project: project
+ sha: sha
)
end
- end
- describe '.newest_first' do
- include_context 'with some outdated pipelines'
-
- it 'returns the pipelines from new to old' do
- expect(described_class.newest_first.pluck(:status))
- .to eq(%w[skipped failed success canceled])
- end
+ describe '.newest_first' do
+ it 'returns the pipelines from new to old' do
+ expect(described_class.newest_first.pluck(:status))
+ .to eq(%w[skipped failed success canceled])
+ end
- it 'searches limited backlog' do
- expect(described_class.newest_first(limit: 1).pluck(:status))
- .to eq(%w[skipped])
+ it 'searches limited backlog' do
+ expect(described_class.newest_first(limit: 1).pluck(:status))
+ .to eq(%w[skipped])
+ end
end
- end
- describe '.latest_status' do
- include_context 'with some outdated pipelines'
-
- context 'when no ref is specified' do
- it 'returns the status of the latest pipeline' do
- expect(described_class.latest_status).to eq('skipped')
+ describe '.latest_status' do
+ context 'when no ref is specified' do
+ it 'returns the status of the latest pipeline' do
+ expect(described_class.latest_status).to eq('skipped')
+ end
end
- end
- context 'when ref is specified' do
- it 'returns the status of the latest pipeline for the given ref' do
- expect(described_class.latest_status('ref')).to eq('failed')
+ context 'when ref is specified' do
+ it 'returns the status of the latest pipeline for the given ref' do
+ expect(described_class.latest_status('ref')).to eq('failed')
+ end
end
end
- end
- describe '.latest_successful_for_ref' do
- include_context 'with some outdated pipelines'
-
- let!(:latest_successful_pipeline) do
- create_pipeline(:success, 'ref', 'D', project)
- end
+ describe '.latest_successful_for_ref' do
+ let!(:latest_successful_pipeline) do
+ create_pipeline(:success, 'ref', 'D')
+ end
- it 'returns the latest successful pipeline' do
- expect(described_class.latest_successful_for_ref('ref'))
- .to eq(latest_successful_pipeline)
+ it 'returns the latest successful pipeline' do
+ expect(described_class.latest_successful_for_ref('ref'))
+ .to eq(latest_successful_pipeline)
+ end
end
- end
- describe '.latest_running_for_ref' do
- include_context 'with some outdated pipelines'
-
- let!(:latest_running_pipeline) do
- create_pipeline(:running, 'ref', 'D', project)
- end
+ describe '.latest_running_for_ref' do
+ let!(:latest_running_pipeline) do
+ create_pipeline(:running, 'ref', 'D')
+ end
- it 'returns the latest running pipeline' do
- expect(described_class.latest_running_for_ref('ref'))
- .to eq(latest_running_pipeline)
+ it 'returns the latest running pipeline' do
+ expect(described_class.latest_running_for_ref('ref'))
+ .to eq(latest_running_pipeline)
+ end
end
- end
-
- describe '.latest_failed_for_ref' do
- include_context 'with some outdated pipelines'
- let!(:latest_failed_pipeline) do
- create_pipeline(:failed, 'ref', 'D', project)
- end
+ describe '.latest_failed_for_ref' do
+ let!(:latest_failed_pipeline) do
+ create_pipeline(:failed, 'ref', 'D')
+ end
- it 'returns the latest failed pipeline' do
- expect(described_class.latest_failed_for_ref('ref'))
- .to eq(latest_failed_pipeline)
+ it 'returns the latest failed pipeline' do
+ expect(described_class.latest_failed_for_ref('ref'))
+ .to eq(latest_failed_pipeline)
+ end
end
- end
-
- describe '.latest_successful_for_sha' do
- include_context 'with some outdated pipelines'
- let!(:latest_successful_pipeline) do
- create_pipeline(:success, 'ref', 'awesomesha', project)
- end
+ describe '.latest_successful_for_sha' do
+ let!(:latest_successful_pipeline) do
+ create_pipeline(:success, 'ref', 'awesomesha')
+ end
- it 'returns the latest successful pipeline' do
- expect(described_class.latest_successful_for_sha('awesomesha'))
- .to eq(latest_successful_pipeline)
+ it 'returns the latest successful pipeline' do
+ expect(described_class.latest_successful_for_sha('awesomesha'))
+ .to eq(latest_successful_pipeline)
+ end
end
- end
-
- describe '.latest_successful_for_refs' do
- include_context 'with some outdated pipelines'
- let!(:latest_successful_pipeline1) do
- create_pipeline(:success, 'ref1', 'D', project)
- end
+ describe '.latest_successful_for_refs' do
+ let!(:latest_successful_pipeline1) do
+ create_pipeline(:success, 'ref1', 'D')
+ end
- let!(:latest_successful_pipeline2) do
- create_pipeline(:success, 'ref2', 'D', project)
- end
+ let!(:latest_successful_pipeline2) do
+ create_pipeline(:success, 'ref2', 'D')
+ end
- it 'returns the latest successful pipeline for both refs' do
- refs = %w(ref1 ref2 ref3)
+ it 'returns the latest successful pipeline for both refs' do
+ refs = %w(ref1 ref2 ref3)
- expect(described_class.latest_successful_for_refs(refs)).to eq({ 'ref1' => latest_successful_pipeline1, 'ref2' => latest_successful_pipeline2 })
+ expect(described_class.latest_successful_for_refs(refs)).to eq({ 'ref1' => latest_successful_pipeline1, 'ref2' => latest_successful_pipeline2 })
+ end
end
end
@@ -2197,8 +2207,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
:ci_empty_pipeline,
status: 'success',
ref: 'master',
- sha: '123',
- project: project
+ sha: '123'
)
end
@@ -2207,8 +2216,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
:ci_empty_pipeline,
status: 'success',
ref: 'develop',
- sha: '123',
- project: project
+ sha: '123'
)
end
@@ -2217,8 +2225,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
:ci_empty_pipeline,
status: 'success',
ref: 'test',
- sha: '456',
- project: project
+ sha: '456'
)
end
@@ -2315,12 +2322,11 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe '#status', :sidekiq_inline do
- let(:build) do
- create(:ci_build, :created, pipeline: pipeline, name: 'test')
- end
-
subject { pipeline.reload.status }
+ let_it_be(:pipeline) { create(:ci_empty_pipeline, :created) }
+ let(:build) { create(:ci_build, :created, pipeline: pipeline, name: 'test') }
+
context 'on waiting for resource' do
before do
allow(build).to receive(:with_resource_group?) { true }
@@ -2412,8 +2418,10 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
describe '#detailed_status' do
subject { pipeline.detailed_status(user) }
+ let_it_be(:pipeline) { create(:ci_empty_pipeline, :created) }
+
context 'when pipeline is created' do
- let(:pipeline) { create(:ci_pipeline, status: :created) }
+ let(:pipeline) { create(:ci_pipeline, :created) }
it 'returns detailed status for created pipeline' do
expect(subject.text).to eq s_('CiStatusText|created')
@@ -2490,6 +2498,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe '#cancelable?' do
+ let_it_be(:pipeline) { create(:ci_empty_pipeline, :created) }
+
%i[created running pending].each do |status0|
context "when there is a build #{status0}" do
before do
@@ -2581,7 +2591,9 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe '#cancel_running' do
- let(:latest_status) { pipeline.statuses.pluck(:status) }
+ subject(:latest_status) { pipeline.statuses.pluck(:status) }
+
+ let_it_be(:pipeline) { create(:ci_empty_pipeline, :created) }
context 'when there is a running external job and a regular job' do
before do
@@ -2624,7 +2636,9 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe '#retry_failed' do
- let(:latest_status) { pipeline.latest_statuses.pluck(:status) }
+ subject(:latest_status) { pipeline.latest_statuses.pluck(:status) }
+
+ let_it_be(:pipeline) { create(:ci_empty_pipeline, :created) }
before do
stub_not_protect_default_branch
@@ -2673,11 +2687,12 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe '#execute_hooks' do
+ let_it_be(:pipeline) { create(:ci_empty_pipeline, :created) }
let!(:build_a) { create_build('a', 0) }
let!(:build_b) { create_build('b', 0) }
let!(:hook) do
- create(:project_hook, project: project, pipeline_events: enabled)
+ create(:project_hook, pipeline_events: enabled)
end
before do
@@ -2703,7 +2718,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
it 'builds hook data once' do
- create(:pipelines_email_service, project: project)
+ create(:pipelines_email_service)
expect(Gitlab::DataBuilder::Pipeline).to receive(:build).once.and_call_original
@@ -2789,7 +2804,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe "#merge_requests_as_head_pipeline" do
- let(:pipeline) { create(:ci_empty_pipeline, status: 'created', project: project, ref: 'master', sha: 'a288a022a53a5a944fae87bcec6efc87b7061808') }
+ let_it_be_with_reload(:pipeline) { create(:ci_empty_pipeline, status: 'created', ref: 'master', sha: 'a288a022a53a5a944fae87bcec6efc87b7061808') }
it "returns merge requests whose `diff_head_sha` matches the pipeline's SHA" do
allow_next_instance_of(MergeRequest) do |instance|
@@ -2801,7 +2816,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
it "doesn't return merge requests whose source branch doesn't match the pipeline's ref" do
- create(:merge_request, source_project: project, source_branch: 'feature', target_branch: 'master')
+ create(:merge_request, :simple, source_project: project)
expect(pipeline.merge_requests_as_head_pipeline).to be_empty
end
@@ -2817,7 +2832,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe '#all_merge_requests' do
- let(:project) { create(:project) }
+ let_it_be_with_reload(:project) { create(:project) }
+ let_it_be(:pipeline) { create(:ci_empty_pipeline, :created, project: project) }
shared_examples 'a method that returns all merge requests for a given pipeline' do
let(:pipeline) { create(:ci_empty_pipeline, status: 'created', project: pipeline_project, ref: 'master') }
@@ -2911,10 +2927,9 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe '#related_merge_requests' do
- let(:project) { create(:project, :repository) }
let(:merge_request) { create(:merge_request, source_project: project, source_branch: 'feature', target_branch: 'master') }
let(:other_merge_request) { create(:merge_request, source_project: project, source_branch: 'feature', target_branch: 'stable') }
- let(:branch_pipeline) { create(:ci_pipeline, project: project, ref: 'feature') }
+ let(:branch_pipeline) { create(:ci_pipeline, ref: 'feature') }
let(:merge_pipeline) { create(:ci_pipeline, :detached_merge_request_pipeline, merge_request: merge_request) }
context 'for a branch pipeline' do
@@ -2951,9 +2966,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe '#open_merge_requests_refs' do
- let(:project) { create(:project) }
- let(:user) { create(:user) }
- let!(:pipeline) { create(:ci_pipeline, user: user, project: project, ref: 'feature') }
+ let!(:pipeline) { create(:ci_pipeline, user: user, ref: 'feature') }
let!(:merge_request) { create(:merge_request, source_project: project, source_branch: 'feature', target_branch: 'master') }
subject { pipeline.open_merge_requests_refs }
@@ -3000,6 +3013,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
describe '#same_family_pipeline_ids' do
subject { pipeline.same_family_pipeline_ids.map(&:id) }
+ let_it_be(:pipeline) { create(:ci_empty_pipeline, :created) }
+
context 'when pipeline is not child nor parent' do
it 'returns just the pipeline id' do
expect(subject).to contain_exactly(pipeline.id)
@@ -3007,7 +3022,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
context 'when pipeline is child' do
- let(:parent) { create(:ci_pipeline, project: project) }
+ let(:parent) { create(:ci_pipeline) }
let!(:pipeline) { create(:ci_pipeline, child_of: parent) }
let!(:sibling) { create(:ci_pipeline, child_of: parent) }
@@ -3025,7 +3040,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
context 'when pipeline is a child of a child pipeline' do
- let(:ancestor) { create(:ci_pipeline, project: project) }
+ let(:ancestor) { create(:ci_pipeline) }
let!(:parent) { create(:ci_pipeline, child_of: ancestor) }
let!(:pipeline) { create(:ci_pipeline, child_of: parent) }
let!(:cousin_parent) { create(:ci_pipeline, child_of: ancestor) }
@@ -3050,10 +3065,10 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
describe '#root_ancestor' do
subject { pipeline.root_ancestor }
- let_it_be(:pipeline) { create(:ci_pipeline, project: project) }
+ let_it_be(:pipeline) { create(:ci_pipeline) }
context 'when pipeline is child of child pipeline' do
- let!(:root_ancestor) { create(:ci_pipeline, project: project) }
+ let!(:root_ancestor) { create(:ci_pipeline) }
let!(:parent_pipeline) { create(:ci_pipeline, child_of: root_ancestor) }
let!(:pipeline) { create(:ci_pipeline, child_of: parent_pipeline) }
@@ -3088,6 +3103,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe '#stuck?' do
+ let(:pipeline) { create(:ci_empty_pipeline, :created) }
+
before do
create(:ci_build, :pending, pipeline: pipeline)
end
@@ -3132,6 +3149,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe '#has_yaml_errors?' do
+ let(:pipeline) { build_stubbed(:ci_pipeline) }
+
context 'when yaml_errors is set' do
before do
pipeline.yaml_errors = 'File not found'
@@ -3201,7 +3220,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
context 'when pipeline is not the latest' do
before do
- create(:ci_pipeline, :success, project: project, ci_ref: pipeline.ci_ref)
+ create(:ci_pipeline, :success, ci_ref: pipeline.ci_ref)
end
it 'does not pass ref_status' do
@@ -3302,7 +3321,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
describe '#builds_in_self_and_descendants' do
subject(:builds) { pipeline.builds_in_self_and_descendants }
- let(:pipeline) { create(:ci_pipeline, project: project) }
+ let(:pipeline) { create(:ci_pipeline) }
let!(:build) { create(:ci_build, pipeline: pipeline) }
context 'when pipeline is standalone' do
@@ -3333,6 +3352,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe '#build_with_artifacts_in_self_and_descendants' do
+ let_it_be(:pipeline) { create(:ci_pipeline) }
let!(:build) { create(:ci_build, name: 'test', pipeline: pipeline) }
let(:child_pipeline) { create(:ci_pipeline, child_of: pipeline) }
let!(:child_build) { create(:ci_build, :artifacts, name: 'test', pipeline: child_pipeline) }
@@ -3351,6 +3371,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe '#find_job_with_archive_artifacts' do
+ let(:pipeline) { create(:ci_pipeline) }
let!(:old_job) { create(:ci_build, name: 'rspec', retried: true, pipeline: pipeline) }
let!(:job_without_artifacts) { create(:ci_build, name: 'rspec', pipeline: pipeline) }
let!(:expected_job) { create(:ci_build, :artifacts, name: 'rspec', pipeline: pipeline ) }
@@ -3364,6 +3385,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe '#latest_builds_with_artifacts' do
+ let(:pipeline) { create(:ci_pipeline) }
let!(:fresh_build) { create(:ci_build, :success, :artifacts, pipeline: pipeline) }
let!(:stale_build) { create(:ci_build, :success, :expired, :artifacts, pipeline: pipeline) }
@@ -3390,7 +3412,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
describe '#batch_lookup_report_artifact_for_file_type' do
context 'with code quality report artifact' do
- let(:pipeline) { create(:ci_pipeline, :with_codequality_reports, project: project) }
+ let(:pipeline) { create(:ci_pipeline, :with_codequality_reports) }
it "returns the code quality artifact" do
expect(pipeline.batch_lookup_report_artifact_for_file_type(:codequality)).to eq(pipeline.job_artifacts.sample)
@@ -3399,24 +3421,26 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe '#latest_report_builds' do
+ let_it_be(:pipeline) { create(:ci_pipeline, project: project) }
+
it 'returns build with test artifacts' do
- test_build = create(:ci_build, :test_reports, pipeline: pipeline, project: project)
- coverage_build = create(:ci_build, :coverage_reports, pipeline: pipeline, project: project)
+ test_build = create(:ci_build, :test_reports, pipeline: pipeline)
+ coverage_build = create(:ci_build, :coverage_reports, pipeline: pipeline)
create(:ci_build, :artifacts, pipeline: pipeline, project: project)
expect(pipeline.latest_report_builds).to contain_exactly(test_build, coverage_build)
end
it 'filters builds by scope' do
- test_build = create(:ci_build, :test_reports, pipeline: pipeline, project: project)
- create(:ci_build, :coverage_reports, pipeline: pipeline, project: project)
+ test_build = create(:ci_build, :test_reports, pipeline: pipeline)
+ create(:ci_build, :coverage_reports, pipeline: pipeline)
expect(pipeline.latest_report_builds(Ci::JobArtifact.test_reports)).to contain_exactly(test_build)
end
it 'only returns not retried builds' do
- test_build = create(:ci_build, :test_reports, pipeline: pipeline, project: project)
- create(:ci_build, :test_reports, :retried, pipeline: pipeline, project: project)
+ test_build = create(:ci_build, :test_reports, pipeline: pipeline)
+ create(:ci_build, :test_reports, :retried, pipeline: pipeline)
expect(pipeline.latest_report_builds).to contain_exactly(test_build)
end
@@ -3427,17 +3451,17 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
context 'when pipeline has builds with test reports' do
before do
- create(:ci_build, :test_reports, pipeline: pipeline, project: project)
+ create(:ci_build, :test_reports, pipeline: pipeline)
end
context 'when pipeline status is running' do
- let(:pipeline) { create(:ci_pipeline, :running, project: project) }
+ let(:pipeline) { create(:ci_pipeline, :running) }
it { is_expected.to be_falsey }
end
context 'when pipeline status is success' do
- let(:pipeline) { create(:ci_pipeline, :success, project: project) }
+ let(:pipeline) { create(:ci_pipeline, :success) }
it { is_expected.to be_truthy }
end
@@ -3445,20 +3469,20 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
context 'when pipeline does not have builds with test reports' do
before do
- create(:ci_build, :artifacts, pipeline: pipeline, project: project)
+ create(:ci_build, :artifacts, pipeline: pipeline)
end
- let(:pipeline) { create(:ci_pipeline, :success, project: project) }
+ let(:pipeline) { create(:ci_pipeline, :success) }
it { is_expected.to be_falsey }
end
context 'when retried build has test reports' do
before do
- create(:ci_build, :retried, :test_reports, pipeline: pipeline, project: project)
+ create(:ci_build, :retried, :test_reports, pipeline: pipeline)
end
- let(:pipeline) { create(:ci_pipeline, :success, project: project) }
+ let(:pipeline) { create(:ci_pipeline, :success) }
it { is_expected.to be_falsey }
end
@@ -3468,13 +3492,13 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
subject { pipeline.has_coverage_reports? }
context 'when pipeline has a code coverage artifact' do
- let(:pipeline) { create(:ci_pipeline, :with_coverage_report_artifact, :running, project: project) }
+ let(:pipeline) { create(:ci_pipeline, :with_coverage_report_artifact, :running) }
it { expect(subject).to be_truthy }
end
context 'when pipeline does not have a code coverage artifact' do
- let(:pipeline) { create(:ci_pipeline, :success, project: project) }
+ let(:pipeline) { create(:ci_pipeline, :success) }
it { expect(subject).to be_falsey }
end
@@ -3485,17 +3509,17 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
context 'when pipeline has builds with coverage reports' do
before do
- create(:ci_build, :coverage_reports, pipeline: pipeline, project: project)
+ create(:ci_build, :coverage_reports, pipeline: pipeline)
end
context 'when pipeline status is running' do
- let(:pipeline) { create(:ci_pipeline, :running, project: project) }
+ let(:pipeline) { create(:ci_pipeline, :running) }
it { expect(subject).to be_falsey }
end
context 'when pipeline status is success' do
- let(:pipeline) { create(:ci_pipeline, :success, project: project) }
+ let(:pipeline) { create(:ci_pipeline, :success) }
it { expect(subject).to be_truthy }
end
@@ -3503,10 +3527,10 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
context 'when pipeline does not have builds with coverage reports' do
before do
- create(:ci_build, :artifacts, pipeline: pipeline, project: project)
+ create(:ci_build, :artifacts, pipeline: pipeline)
end
- let(:pipeline) { create(:ci_pipeline, :success, project: project) }
+ let(:pipeline) { create(:ci_pipeline, :success) }
it { expect(subject).to be_falsey }
end
@@ -3516,13 +3540,13 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
subject { pipeline.has_codequality_mr_diff_report? }
context 'when pipeline has a codequality mr diff report' do
- let(:pipeline) { create(:ci_pipeline, :with_codequality_mr_diff_report, :running, project: project) }
+ let(:pipeline) { create(:ci_pipeline, :with_codequality_mr_diff_report, :running) }
it { expect(subject).to be_truthy }
end
context 'when pipeline does not have a codequality mr diff report' do
- let(:pipeline) { create(:ci_pipeline, :success, project: project) }
+ let(:pipeline) { create(:ci_pipeline, :success) }
it { expect(subject).to be_falsey }
end
@@ -3533,17 +3557,17 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
context 'when pipeline has builds with codequality reports' do
before do
- create(:ci_build, :codequality_reports, pipeline: pipeline, project: project)
+ create(:ci_build, :codequality_reports, pipeline: pipeline)
end
context 'when pipeline status is running' do
- let(:pipeline) { create(:ci_pipeline, :running, project: project) }
+ let(:pipeline) { create(:ci_pipeline, :running) }
it { expect(subject).to be_falsey }
end
context 'when pipeline status is success' do
- let(:pipeline) { create(:ci_pipeline, :success, project: project) }
+ let(:pipeline) { create(:ci_pipeline, :success) }
it 'can generate a codequality report' do
expect(subject).to be_truthy
@@ -3563,10 +3587,10 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
context 'when pipeline does not have builds with codequality reports' do
before do
- create(:ci_build, :artifacts, pipeline: pipeline, project: project)
+ create(:ci_build, :artifacts, pipeline: pipeline)
end
- let(:pipeline) { create(:ci_pipeline, :success, project: project) }
+ let(:pipeline) { create(:ci_pipeline, :success) }
it { expect(subject).to be_falsey }
end
@@ -3575,12 +3599,12 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
describe '#test_report_summary' do
subject { pipeline.test_report_summary }
- context 'when pipeline has multiple builds with report results' do
- let(:pipeline) { create(:ci_pipeline, :success, project: project) }
+ let(:pipeline) { create(:ci_pipeline, :success) }
+ context 'when pipeline has multiple builds with report results' do
before do
- create(:ci_build, :success, :report_results, name: 'rspec', pipeline: pipeline, project: project)
- create(:ci_build, :success, :report_results, name: 'java', pipeline: pipeline, project: project)
+ create(:ci_build, :success, :report_results, name: 'rspec', pipeline: pipeline)
+ create(:ci_build, :success, :report_results, name: 'java', pipeline: pipeline)
end
it 'returns test report summary with collected data' do
@@ -3598,13 +3622,15 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
describe '#test_reports' do
subject { pipeline.test_reports }
+ let_it_be(:pipeline) { create(:ci_pipeline) }
+
context 'when pipeline has multiple builds with test reports' do
- let!(:build_rspec) { create(:ci_build, :success, name: 'rspec', pipeline: pipeline, project: project) }
- let!(:build_java) { create(:ci_build, :success, name: 'java', pipeline: pipeline, project: project) }
+ let!(:build_rspec) { create(:ci_build, :success, name: 'rspec', pipeline: pipeline) }
+ let!(:build_java) { create(:ci_build, :success, name: 'java', pipeline: pipeline) }
before do
- create(:ci_job_artifact, :junit, job: build_rspec, project: project)
- create(:ci_job_artifact, :junit_with_ant, job: build_java, project: project)
+ create(:ci_job_artifact, :junit, job: build_rspec)
+ create(:ci_job_artifact, :junit_with_ant, job: build_java)
end
it 'returns test reports with collected data' do
@@ -3614,8 +3640,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
context 'when builds are retried' do
- let!(:build_rspec) { create(:ci_build, :retried, :success, name: 'rspec', pipeline: pipeline, project: project) }
- let!(:build_java) { create(:ci_build, :retried, :success, name: 'java', pipeline: pipeline, project: project) }
+ let!(:build_rspec) { create(:ci_build, :retried, :success, name: 'rspec', pipeline: pipeline) }
+ let!(:build_java) { create(:ci_build, :retried, :success, name: 'java', pipeline: pipeline) }
it 'does not take retried builds into account' do
expect(subject.total_count).to be(0)
@@ -3635,13 +3661,15 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
describe '#accessibility_reports' do
subject { pipeline.accessibility_reports }
+ let_it_be(:pipeline) { create(:ci_pipeline) }
+
context 'when pipeline has multiple builds with accessibility reports' do
- let(:build_rspec) { create(:ci_build, :success, name: 'rspec', pipeline: pipeline, project: project) }
- let(:build_golang) { create(:ci_build, :success, name: 'golang', pipeline: pipeline, project: project) }
+ let(:build_rspec) { create(:ci_build, :success, name: 'rspec', pipeline: pipeline) }
+ let(:build_golang) { create(:ci_build, :success, name: 'golang', pipeline: pipeline) }
before do
- create(:ci_job_artifact, :accessibility, job: build_rspec, project: project)
- create(:ci_job_artifact, :accessibility_without_errors, job: build_golang, project: project)
+ create(:ci_job_artifact, :accessibility, job: build_rspec)
+ create(:ci_job_artifact, :accessibility_without_errors, job: build_golang)
end
it 'returns accessibility report with collected data' do
@@ -3652,8 +3680,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
context 'when builds are retried' do
- let(:build_rspec) { create(:ci_build, :retried, :success, name: 'rspec', pipeline: pipeline, project: project) }
- let(:build_golang) { create(:ci_build, :retried, :success, name: 'golang', pipeline: pipeline, project: project) }
+ let(:build_rspec) { create(:ci_build, :retried, :success, name: 'rspec', pipeline: pipeline) }
+ let(:build_golang) { create(:ci_build, :retried, :success, name: 'golang', pipeline: pipeline) }
it 'returns empty urls for accessibility reports' do
expect(subject.urls).to be_empty
@@ -3671,13 +3699,15 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
describe '#coverage_reports' do
subject { pipeline.coverage_reports }
+ let_it_be(:pipeline) { create(:ci_pipeline) }
+
context 'when pipeline has multiple builds with coverage reports' do
- let!(:build_rspec) { create(:ci_build, :success, name: 'rspec', pipeline: pipeline, project: project) }
- let!(:build_golang) { create(:ci_build, :success, name: 'golang', pipeline: pipeline, project: project) }
+ let!(:build_rspec) { create(:ci_build, :success, name: 'rspec', pipeline: pipeline) }
+ let!(:build_golang) { create(:ci_build, :success, name: 'golang', pipeline: pipeline) }
before do
- create(:ci_job_artifact, :cobertura, job: build_rspec, project: project)
- create(:ci_job_artifact, :coverage_gocov_xml, job: build_golang, project: project)
+ create(:ci_job_artifact, :cobertura, job: build_rspec)
+ create(:ci_job_artifact, :coverage_gocov_xml, job: build_golang)
end
it 'returns coverage reports with collected data' do
@@ -3689,8 +3719,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
it 'does not execute N+1 queries' do
- single_build_pipeline = create(:ci_empty_pipeline, status: :created, project: project)
- single_rspec = create(:ci_build, :success, name: 'rspec', pipeline: single_build_pipeline, project: project)
+ single_build_pipeline = create(:ci_empty_pipeline, :created)
+ single_rspec = create(:ci_build, :success, name: 'rspec', pipeline: single_build_pipeline)
create(:ci_job_artifact, :cobertura, job: single_rspec, project: project)
control = ActiveRecord::QueryRecorder.new { single_build_pipeline.coverage_reports }
@@ -3699,8 +3729,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
context 'when builds are retried' do
- let!(:build_rspec) { create(:ci_build, :retried, :success, name: 'rspec', pipeline: pipeline, project: project) }
- let!(:build_golang) { create(:ci_build, :retried, :success, name: 'golang', pipeline: pipeline, project: project) }
+ let!(:build_rspec) { create(:ci_build, :retried, :success, name: 'rspec', pipeline: pipeline) }
+ let!(:build_golang) { create(:ci_build, :retried, :success, name: 'golang', pipeline: pipeline) }
it 'does not take retried builds into account' do
expect(subject.files).to eql({})
@@ -3718,13 +3748,15 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
describe '#codequality_reports' do
subject(:codequality_reports) { pipeline.codequality_reports }
+ let_it_be(:pipeline) { create(:ci_pipeline) }
+
context 'when pipeline has multiple builds with codequality reports' do
- let(:build_rspec) { create(:ci_build, :success, name: 'rspec', pipeline: pipeline, project: project) }
- let(:build_golang) { create(:ci_build, :success, name: 'golang', pipeline: pipeline, project: project) }
+ let(:build_rspec) { create(:ci_build, :success, name: 'rspec', pipeline: pipeline) }
+ let(:build_golang) { create(:ci_build, :success, name: 'golang', pipeline: pipeline) }
before do
- create(:ci_job_artifact, :codequality, job: build_rspec, project: project)
- create(:ci_job_artifact, :codequality_without_errors, job: build_golang, project: project)
+ create(:ci_job_artifact, :codequality, job: build_rspec)
+ create(:ci_job_artifact, :codequality_without_errors, job: build_golang)
end
it 'returns codequality report with collected data' do
@@ -3732,8 +3764,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
context 'when builds are retried' do
- let(:build_rspec) { create(:ci_build, :retried, :success, name: 'rspec', pipeline: pipeline, project: project) }
- let(:build_golang) { create(:ci_build, :retried, :success, name: 'golang', pipeline: pipeline, project: project) }
+ let(:build_rspec) { create(:ci_build, :retried, :success, name: 'rspec', pipeline: pipeline) }
+ let(:build_golang) { create(:ci_build, :retried, :success, name: 'golang', pipeline: pipeline) }
it 'returns a codequality reports without degradations' do
expect(codequality_reports.degradations).to be_empty
@@ -3749,6 +3781,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe '#total_size' do
+ let(:pipeline) { create(:ci_pipeline) }
let!(:build_job1) { create(:ci_build, pipeline: pipeline, stage_idx: 0) }
let!(:build_job2) { create(:ci_build, pipeline: pipeline, stage_idx: 0) }
let!(:test_job_failed_and_retried) { create(:ci_build, :failed, :retried, pipeline: pipeline, stage_idx: 1) }
@@ -3785,17 +3818,11 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe '#default_branch?' do
- let(:default_branch) { 'master'}
-
subject { pipeline.default_branch? }
- before do
- allow(project).to receive(:default_branch).and_return(default_branch)
- end
-
context 'when pipeline ref is the default branch of the project' do
let(:pipeline) do
- build(:ci_empty_pipeline, status: :created, project: project, ref: default_branch)
+ build(:ci_empty_pipeline, :created, project: project, ref: project.default_branch)
end
it "returns true" do
@@ -3805,7 +3832,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
context 'when pipeline ref is not the default branch of the project' do
let(:pipeline) do
- build(:ci_empty_pipeline, status: :created, project: project, ref: 'another_branch')
+ build(:ci_empty_pipeline, :created, project: project, ref: 'another_branch')
end
it "returns false" do
@@ -3815,7 +3842,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe '#find_stage_by_name' do
- let(:pipeline) { create(:ci_pipeline) }
+ let_it_be(:pipeline) { create(:ci_pipeline) }
let(:stage_name) { 'test' }
let(:stage) do
@@ -3895,10 +3922,10 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe '#parent_pipeline' do
- let_it_be(:project) { create(:project) }
+ let_it_be_with_reload(:pipeline) { create(:ci_pipeline) }
context 'when pipeline is triggered by a pipeline from the same project' do
- let_it_be(:upstream_pipeline) { create(:ci_pipeline, project: project) }
+ let_it_be(:upstream_pipeline) { create(:ci_pipeline) }
let_it_be(:pipeline) { create(:ci_pipeline, child_of: upstream_pipeline) }
it 'returns the parent pipeline' do
@@ -3911,7 +3938,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
context 'when pipeline is triggered by a pipeline from another project' do
- let(:pipeline) { create(:ci_pipeline, project: project) }
+ let(:pipeline) { create(:ci_pipeline) }
let!(:upstream_pipeline) { create(:ci_pipeline, project: create(:project), upstream_of: pipeline) }
it 'returns nil' do
@@ -3938,7 +3965,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
describe '#child_pipelines' do
let_it_be(:project) { create(:project) }
- let(:pipeline) { create(:ci_pipeline, project: project) }
+ let_it_be_with_reload(:pipeline) { create(:ci_pipeline, project: project) }
context 'when pipeline triggered other pipelines on same project' do
let(:downstream_pipeline) { create(:ci_pipeline, project: pipeline.project) }
@@ -3992,6 +4019,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe 'upstream status interactions' do
+ let_it_be_with_reload(:pipeline) { create(:ci_pipeline, :created) }
+
context 'when a pipeline has an upstream status' do
context 'when an upstream status is a bridge' do
let(:bridge) { create(:ci_bridge, status: :pending) }
@@ -4050,6 +4079,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
describe '#source_ref_path' do
subject { pipeline.source_ref_path }
+ let(:pipeline) { create(:ci_pipeline, :created) }
+
context 'when pipeline is for a branch' do
it { is_expected.to eq(Gitlab::Git::BRANCH_REF_PREFIX + pipeline.source_ref.to_s) }
end
@@ -4062,13 +4093,15 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
context 'when pipeline is for a tag' do
- let(:pipeline) { create(:ci_pipeline, project: project, tag: true) }
+ let(:pipeline) { create(:ci_pipeline, tag: true) }
it { is_expected.to eq(Gitlab::Git::TAG_REF_PREFIX + pipeline.source_ref.to_s) }
end
end
- describe "#builds_with_coverage" do
+ describe '#builds_with_coverage' do
+ let_it_be(:pipeline) { create(:ci_pipeline, :created) }
+
it 'returns builds with coverage only' do
rspec = create(:ci_build, name: 'rspec', coverage: 97.1, pipeline: pipeline)
jest = create(:ci_build, name: 'jest', coverage: 94.1, pipeline: pipeline)
@@ -4092,10 +4125,11 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe '#base_and_ancestors' do
- let(:same_project) { false }
-
subject { pipeline.base_and_ancestors(same_project: same_project) }
+ let_it_be(:pipeline) { create(:ci_pipeline, :created) }
+ let(:same_project) { false }
+
context 'when pipeline is not child nor parent' do
it 'returns just the pipeline itself' do
expect(subject).to contain_exactly(pipeline)
@@ -4103,8 +4137,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
context 'when pipeline is child' do
- let(:parent) { create(:ci_pipeline, project: pipeline.project) }
- let(:sibling) { create(:ci_pipeline, project: pipeline.project) }
+ let(:parent) { create(:ci_pipeline) }
+ let(:sibling) { create(:ci_pipeline) }
before do
create_source_pipeline(parent, pipeline)
@@ -4117,7 +4151,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
context 'when pipeline is parent' do
- let(:child) { create(:ci_pipeline, project: pipeline.project) }
+ let(:child) { create(:ci_pipeline) }
before do
create_source_pipeline(pipeline, child)
@@ -4129,8 +4163,9 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
context 'when pipeline is a child of a child pipeline' do
- let(:ancestor) { create(:ci_pipeline, project: pipeline.project) }
- let(:parent) { create(:ci_pipeline, project: pipeline.project) }
+ let_it_be(:pipeline) { create(:ci_pipeline, :created) }
+ let(:ancestor) { create(:ci_pipeline) }
+ let(:parent) { create(:ci_pipeline) }
before do
create_source_pipeline(ancestor, parent)
@@ -4143,6 +4178,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
context 'when pipeline is a triggered pipeline' do
+ let_it_be(:pipeline) { create(:ci_pipeline, :created) }
let(:upstream) { create(:ci_pipeline, project: create(:project)) }
before do
@@ -4166,8 +4202,10 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe 'reset_ancestor_bridges!' do
+ let_it_be(:pipeline) { create(:ci_pipeline, :created) }
+
context 'when the pipeline is a child pipeline and the bridge is depended' do
- let!(:parent_pipeline) { create(:ci_pipeline, project: project) }
+ let!(:parent_pipeline) { create(:ci_pipeline) }
let!(:bridge) { create_bridge(parent_pipeline, pipeline, true) }
it 'marks source bridge as pending' do
@@ -4191,7 +4229,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
context 'when the pipeline is a child pipeline and the bridge is not depended' do
- let!(:parent_pipeline) { create(:ci_pipeline, project: project) }
+ let!(:parent_pipeline) { create(:ci_pipeline) }
let!(:bridge) { create_bridge(parent_pipeline, pipeline, false) }
it 'does not touch source bridge' do
@@ -4227,6 +4265,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe 'test failure history processing' do
+ let(:pipeline) { build(:ci_pipeline, :created) }
+
it 'performs the service asynchronously when the pipeline is completed' do
service = double
@@ -4238,21 +4278,23 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe '#latest_test_report_builds' do
+ let_it_be(:pipeline) { create(:ci_pipeline, :created) }
+
it 'returns pipeline builds with test report artifacts' do
- test_build = create(:ci_build, :test_reports, pipeline: pipeline, project: project)
+ test_build = create(:ci_build, :test_reports, pipeline: pipeline)
create(:ci_build, :artifacts, pipeline: pipeline, project: project)
expect(pipeline.latest_test_report_builds).to contain_exactly(test_build)
end
it 'preloads project on each build to avoid N+1 queries' do
- create(:ci_build, :test_reports, pipeline: pipeline, project: project)
+ create(:ci_build, :test_reports, pipeline: pipeline)
control_count = ActiveRecord::QueryRecorder.new do
pipeline.latest_test_report_builds.map(&:project).map(&:full_path)
end
- multi_build_pipeline = create(:ci_empty_pipeline, status: :created, project: project)
+ multi_build_pipeline = create(:ci_empty_pipeline, :created)
create(:ci_build, :test_reports, pipeline: multi_build_pipeline, project: project)
create(:ci_build, :test_reports, pipeline: multi_build_pipeline, project: project)
@@ -4262,30 +4304,32 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe '#builds_with_failed_tests' do
+ let_it_be(:pipeline) { create(:ci_pipeline, :created) }
+
it 'returns pipeline builds with test report artifacts' do
- failed_build = create(:ci_build, :failed, :test_reports, pipeline: pipeline, project: project)
- create(:ci_build, :success, :test_reports, pipeline: pipeline, project: project)
+ failed_build = create(:ci_build, :failed, :test_reports, pipeline: pipeline)
+ create(:ci_build, :success, :test_reports, pipeline: pipeline)
expect(pipeline.builds_with_failed_tests).to contain_exactly(failed_build)
end
it 'supports limiting the number of builds to fetch' do
- create(:ci_build, :failed, :test_reports, pipeline: pipeline, project: project)
- create(:ci_build, :failed, :test_reports, pipeline: pipeline, project: project)
+ create(:ci_build, :failed, :test_reports, pipeline: pipeline)
+ create(:ci_build, :failed, :test_reports, pipeline: pipeline)
expect(pipeline.builds_with_failed_tests(limit: 1).count).to eq(1)
end
it 'preloads project on each build to avoid N+1 queries' do
- create(:ci_build, :failed, :test_reports, pipeline: pipeline, project: project)
+ create(:ci_build, :failed, :test_reports, pipeline: pipeline)
control_count = ActiveRecord::QueryRecorder.new do
pipeline.builds_with_failed_tests.map(&:project).map(&:full_path)
end
- multi_build_pipeline = create(:ci_empty_pipeline, status: :created, project: project)
- create(:ci_build, :failed, :test_reports, pipeline: multi_build_pipeline, project: project)
- create(:ci_build, :failed, :test_reports, pipeline: multi_build_pipeline, project: project)
+ multi_build_pipeline = create(:ci_empty_pipeline, :created)
+ create(:ci_build, :failed, :test_reports, pipeline: multi_build_pipeline)
+ create(:ci_build, :failed, :test_reports, pipeline: multi_build_pipeline)
expect { multi_build_pipeline.builds_with_failed_tests.map(&:project).map(&:full_path) }
.not_to exceed_query_limit(control_count)
diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb
index 3e5d068d780..ff3551d2a18 100644
--- a/spec/models/ci/runner_spec.rb
+++ b/spec/models/ci/runner_spec.rb
@@ -40,41 +40,39 @@ RSpec.describe Ci::Runner do
context 'runner_type validations' do
let_it_be(:group) { create(:group) }
let_it_be(:project) { create(:project) }
- let(:group_runner) { create(:ci_runner, :group, groups: [group]) }
- let(:project_runner) { create(:ci_runner, :project, projects: [project]) }
- let(:instance_runner) { create(:ci_runner, :instance) }
it 'disallows assigning group to project_type runner' do
- project_runner.groups << build(:group)
+ project_runner = build(:ci_runner, :project, groups: [group])
expect(project_runner).not_to be_valid
expect(project_runner.errors.full_messages).to include('Runner cannot have groups assigned')
end
it 'disallows assigning group to instance_type runner' do
- instance_runner.groups << build(:group)
+ instance_runner = build(:ci_runner, :instance, groups: [group])
expect(instance_runner).not_to be_valid
expect(instance_runner.errors.full_messages).to include('Runner cannot have groups assigned')
end
it 'disallows assigning project to group_type runner' do
- group_runner.projects << build(:project)
+ group_runner = build(:ci_runner, :instance, projects: [project])
expect(group_runner).not_to be_valid
expect(group_runner.errors.full_messages).to include('Runner cannot have projects assigned')
end
it 'disallows assigning project to instance_type runner' do
- instance_runner.projects << build(:project)
+ instance_runner = build(:ci_runner, :instance, projects: [project])
expect(instance_runner).not_to be_valid
expect(instance_runner.errors.full_messages).to include('Runner cannot have projects assigned')
end
it 'fails to save a group assigned to a project runner even if the runner is already saved' do
- group.runners << project_runner
- expect { group.save! }
+ project_runner = create(:ci_runner, :project, projects: [project])
+
+ expect { create(:group, runners: [project_runner]) }
.to raise_error(ActiveRecord::RecordInvalid)
end
end
@@ -352,6 +350,8 @@ RSpec.describe Ci::Runner do
end
describe '#can_pick?' do
+ using RSpec::Parameterized::TableSyntax
+
let_it_be(:pipeline) { create(:ci_pipeline) }
let(:build) { create(:ci_build, pipeline: pipeline) }
let(:runner_project) { build.project }
@@ -365,6 +365,11 @@ RSpec.describe Ci::Runner do
let(:other_project) { create(:project) }
let(:other_runner) { create(:ci_runner, :project, projects: [other_project], tag_list: tag_list, run_untagged: run_untagged) }
+ before do
+ # `can_pick?` is not used outside the runners available for the project
+ stub_feature_flags(ci_runners_short_circuit_assignable_for: false)
+ end
+
it 'cannot handle builds' do
expect(other_runner.can_pick?(build)).to be_falsey
end
@@ -432,9 +437,32 @@ RSpec.describe Ci::Runner do
expect(runner.can_pick?(build)).to be_truthy
end
end
+
+ it 'does not query for owned or instance runners' do
+ expect(described_class).not_to receive(:owned_or_instance_wide)
+
+ runner.can_pick?(build)
+ end
+
+ context 'when feature flag ci_runners_short_circuit_assignable_for is disabled' do
+ before do
+ stub_feature_flags(ci_runners_short_circuit_assignable_for: false)
+ end
+
+ it 'does not query for owned or instance runners' do
+ expect(described_class).to receive(:owned_or_instance_wide).and_call_original
+
+ runner.can_pick?(build)
+ end
+ end
end
context 'when runner is not shared' do
+ before do
+ # `can_pick?` is not used outside the runners available for the project
+ stub_feature_flags(ci_runners_short_circuit_assignable_for: false)
+ end
+
context 'when runner is assigned to a project' do
it 'can handle builds' do
expect(runner.can_pick?(build)).to be_truthy
@@ -502,6 +530,29 @@ RSpec.describe Ci::Runner do
it { is_expected.to be_falsey }
end
end
+
+ context 'matches tags' do
+ where(:run_untagged, :runner_tags, :build_tags, :result) do
+ true | [] | [] | true
+ true | [] | ['a'] | false
+ true | %w[a b] | ['a'] | true
+ true | ['a'] | %w[a b] | false
+ true | ['a'] | ['a'] | true
+ false | ['a'] | ['a'] | true
+ false | ['b'] | ['a'] | false
+ false | %w[a b] | ['a'] | true
+ end
+
+ with_them do
+ let(:tag_list) { runner_tags }
+
+ before do
+ build.tag_list = build_tags
+ end
+
+ it { is_expected.to eq(result) }
+ end
+ end
end
describe '#status' do
@@ -844,27 +895,50 @@ RSpec.describe Ci::Runner do
end
describe '#pick_build!' do
+ let(:build) { create(:ci_build) }
+ let(:runner) { create(:ci_runner) }
+
context 'runner can pick the build' do
it 'calls #tick_runner_queue' do
- ci_build = build(:ci_build)
- runner = build(:ci_runner)
- allow(runner).to receive(:can_pick?).with(ci_build).and_return(true)
-
expect(runner).to receive(:tick_runner_queue)
- runner.pick_build!(ci_build)
+ runner.pick_build!(build)
end
end
context 'runner cannot pick the build' do
- it 'does not call #tick_runner_queue' do
- ci_build = build(:ci_build)
- runner = build(:ci_runner)
- allow(runner).to receive(:can_pick?).with(ci_build).and_return(false)
+ before do
+ build.tag_list = [:docker]
+ end
+ it 'does not call #tick_runner_queue' do
expect(runner).not_to receive(:tick_runner_queue)
- runner.pick_build!(ci_build)
+ runner.pick_build!(build)
+ end
+ end
+
+ context 'build picking improvement enabled' do
+ before do
+ stub_feature_flags(ci_reduce_queries_when_ticking_runner_queue: true)
+ end
+
+ it 'does not check if the build is assignable to a runner' do
+ expect(runner).not_to receive(:can_pick?)
+
+ runner.pick_build!(build)
+ end
+ end
+
+ context 'build picking improvement disabled' do
+ before do
+ stub_feature_flags(ci_reduce_queries_when_ticking_runner_queue: false)
+ end
+
+ it 'checks if the build is assignable to a runner' do
+ expect(runner).to receive(:can_pick?).and_call_original
+
+ runner.pick_build!(build)
end
end
end
diff --git a/spec/models/ci/variable_spec.rb b/spec/models/ci/variable_spec.rb
index 26a7a2596af..93a24ba9157 100644
--- a/spec/models/ci/variable_spec.rb
+++ b/spec/models/ci/variable_spec.rb
@@ -14,6 +14,15 @@ RSpec.describe Ci::Variable do
it { is_expected.to validate_uniqueness_of(:key).scoped_to(:project_id, :environment_scope).with_message(/\(\w+\) has already been taken/) }
end
+ describe '.by_environment_scope' do
+ let!(:matching_variable) { create(:ci_variable, environment_scope: 'production ') }
+ let!(:non_matching_variable) { create(:ci_variable, environment_scope: 'staging') }
+
+ subject { Ci::Variable.by_environment_scope('production') }
+
+ it { is_expected.to contain_exactly(matching_variable) }
+ end
+
describe '.unprotected' do
subject { described_class.unprotected }
diff --git a/spec/models/clusters/agent_token_spec.rb b/spec/models/clusters/agent_token_spec.rb
index 5cb84ee131a..a1b45df1970 100644
--- a/spec/models/clusters/agent_token_spec.rb
+++ b/spec/models/clusters/agent_token_spec.rb
@@ -3,8 +3,11 @@
require 'spec_helper'
RSpec.describe Clusters::AgentToken do
- it { is_expected.to belong_to(:agent).class_name('Clusters::Agent') }
+ it { is_expected.to belong_to(:agent).class_name('Clusters::Agent').required }
it { is_expected.to belong_to(:created_by_user).class_name('User').optional }
+ it { is_expected.to validate_length_of(:description).is_at_most(1024) }
+ it { is_expected.to validate_length_of(:name).is_at_most(255) }
+ it { is_expected.to validate_presence_of(:name) }
describe '#token' do
it 'is generated on save' do
diff --git a/spec/models/concerns/ci/has_variable_spec.rb b/spec/models/concerns/ci/has_variable_spec.rb
index b5390281064..e917ec6b802 100644
--- a/spec/models/concerns/ci/has_variable_spec.rb
+++ b/spec/models/concerns/ci/has_variable_spec.rb
@@ -11,6 +11,17 @@ RSpec.describe Ci::HasVariable do
it { is_expected.not_to allow_value('foo bar').for(:key) }
it { is_expected.not_to allow_value('foo/bar').for(:key) }
+ describe 'scopes' do
+ describe '.by_key' do
+ let!(:matching_variable) { create(:ci_variable, key: 'example') }
+ let!(:non_matching_variable) { create(:ci_variable, key: 'other') }
+
+ subject { Ci::Variable.by_key('example') }
+
+ it { is_expected.to contain_exactly(matching_variable) }
+ end
+ end
+
describe '#key=' do
context 'when the new key is nil' do
it 'strips leading and trailing whitespaces' do
diff --git a/spec/models/concerns/project_features_compatibility_spec.rb b/spec/models/concerns/project_features_compatibility_spec.rb
index 2059e170446..62c9a041a85 100644
--- a/spec/models/concerns/project_features_compatibility_spec.rb
+++ b/spec/models/concerns/project_features_compatibility_spec.rb
@@ -4,8 +4,8 @@ require 'spec_helper'
RSpec.describe ProjectFeaturesCompatibility do
let(:project) { create(:project) }
- let(:features_enabled) { %w(issues wiki builds merge_requests snippets) }
- let(:features) { features_enabled + %w(repository pages operations) }
+ let(:features_enabled) { %w(issues wiki builds merge_requests snippets security_and_compliance) }
+ let(:features) { features_enabled + %w(repository pages operations container_registry) }
# We had issues_enabled, snippets_enabled, builds_enabled, merge_requests_enabled and issues_enabled fields on projects table
# All those fields got moved to a new table called project_feature and are now integers instead of booleans
diff --git a/spec/models/custom_emoji_spec.rb b/spec/models/custom_emoji_spec.rb
index 41ce480b02f..e34934d393a 100644
--- a/spec/models/custom_emoji_spec.rb
+++ b/spec/models/custom_emoji_spec.rb
@@ -4,8 +4,10 @@ require 'spec_helper'
RSpec.describe CustomEmoji do
describe 'Associations' do
- it { is_expected.to belong_to(:namespace) }
+ it { is_expected.to belong_to(:namespace).inverse_of(:custom_emoji) }
+ it { is_expected.to belong_to(:creator).inverse_of(:created_custom_emoji) }
it { is_expected.to have_db_column(:file) }
+ it { is_expected.to validate_presence_of(:creator) }
it { is_expected.to validate_length_of(:name).is_at_most(36) }
it { is_expected.to validate_presence_of(:name) }
it { is_expected.to have_db_column(:external) }
@@ -36,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(name: ["has already been taken"])
+ expect(new_emoji.errors.messages).to include(name: ["has already been taken"])
end
it 'disallows non http and https file value' do
diff --git a/spec/models/dependency_proxy/manifest_spec.rb b/spec/models/dependency_proxy/manifest_spec.rb
index aa2e73356dd..4203644c003 100644
--- a/spec/models/dependency_proxy/manifest_spec.rb
+++ b/spec/models/dependency_proxy/manifest_spec.rb
@@ -29,24 +29,32 @@ RSpec.describe DependencyProxy::Manifest, type: :model do
end
end
- describe '.find_or_initialize_by_file_name' do
- subject { DependencyProxy::Manifest.find_or_initialize_by_file_name(file_name) }
+ describe '.find_or_initialize_by_file_name_or_digest' do
+ let_it_be(:file_name) { 'foo' }
+ let_it_be(:digest) { 'bar' }
- context 'no manifest exists' do
- let_it_be(:file_name) { 'foo' }
+ subject { DependencyProxy::Manifest.find_or_initialize_by_file_name_or_digest(file_name: file_name, digest: digest) }
+ context 'no manifest exists' do
it 'initializes a manifest' do
- expect(DependencyProxy::Manifest).to receive(:new).with(file_name: file_name)
+ expect(DependencyProxy::Manifest).to receive(:new).with(file_name: file_name, digest: digest)
subject
end
end
- context 'manifest exists' do
+ context 'manifest exists and matches file_name' do
let_it_be(:dependency_proxy_manifest) { create(:dependency_proxy_manifest) }
let_it_be(:file_name) { dependency_proxy_manifest.file_name }
it { is_expected.to eq(dependency_proxy_manifest) }
end
+
+ context 'manifest exists and matches digest' do
+ let_it_be(:dependency_proxy_manifest) { create(:dependency_proxy_manifest) }
+ let_it_be(:digest) { dependency_proxy_manifest.digest }
+
+ it { is_expected.to eq(dependency_proxy_manifest) }
+ end
end
end
diff --git a/spec/models/email_spec.rb b/spec/models/email_spec.rb
index ffdc621dd4c..62f2a53ab3c 100644
--- a/spec/models/email_spec.rb
+++ b/spec/models/email_spec.rb
@@ -10,7 +10,7 @@ RSpec.describe Email do
end
describe 'validations' do
- it_behaves_like 'an object with RFC3696 compliant email-formated attributes', :email do
+ it_behaves_like 'an object with RFC3696 compliant email-formatted attributes', :email do
subject { build(:email) }
end
end
diff --git a/spec/models/environment_spec.rb b/spec/models/environment_spec.rb
index 0c7d8e2969d..30eb752d2d5 100644
--- a/spec/models/environment_spec.rb
+++ b/spec/models/environment_spec.rb
@@ -34,6 +34,39 @@ RSpec.describe Environment, :use_clean_rails_memory_store_caching do
it { is_expected.to validate_length_of(:external_url).is_at_most(255) }
+ describe '.before_save' do
+ it 'ensures environment tier when a new object is created' do
+ environment = build(:environment, name: 'gprd', tier: nil)
+
+ expect { environment.save }.to change { environment.tier }.from(nil).to('production')
+ end
+
+ it 'ensures environment tier when an existing object is updated' do
+ environment = create(:environment, name: 'gprd')
+ environment.update_column(:tier, nil)
+
+ expect { environment.stop! }.to change { environment.reload.tier }.from(nil).to('production')
+ end
+
+ it 'does not overwrite the existing environment tier' do
+ environment = create(:environment, name: 'gprd', tier: :production)
+
+ expect { environment.update!(name: 'gstg') }.not_to change { environment.reload.tier }
+ end
+
+ context 'when environment_tier feature flag is disabled' do
+ before do
+ stub_feature_flags(environment_tier: false)
+ end
+
+ it 'does not ensure environment tier' do
+ environment = build(:environment, name: 'gprd', tier: nil)
+
+ expect { environment.save }.not_to change { environment.tier }
+ end
+ end
+ end
+
describe '.order_by_last_deployed_at' do
let!(:environment1) { create(:environment, project: project) }
let!(:environment2) { create(:environment, project: project) }
@@ -195,6 +228,62 @@ RSpec.describe Environment, :use_clean_rails_memory_store_caching do
end
end
+ describe '.for_tier' do
+ let_it_be(:environment) { create(:environment, :production) }
+
+ it 'returns the production environment when searching for production tier' do
+ expect(described_class.for_tier(:production)).to eq([environment])
+ end
+
+ it 'returns nothing when searching for staging tier' do
+ expect(described_class.for_tier(:staging)).to be_empty
+ end
+ end
+
+ describe '#guess_tier' do
+ using RSpec::Parameterized::TableSyntax
+
+ subject { environment.send(:guess_tier) }
+
+ let(:environment) { build(:environment, name: name) }
+
+ where(:name, :tier) do
+ 'review/feature' | described_class.tiers[:development]
+ 'review/product' | described_class.tiers[:development]
+ 'DEV' | described_class.tiers[:development]
+ 'development' | described_class.tiers[:development]
+ 'trunk' | described_class.tiers[:development]
+ 'test' | described_class.tiers[:testing]
+ 'TEST' | described_class.tiers[:testing]
+ 'testing' | described_class.tiers[:testing]
+ 'testing-prd' | described_class.tiers[:testing]
+ 'acceptance-testing' | described_class.tiers[:testing]
+ 'QC' | described_class.tiers[:testing]
+ 'gstg' | described_class.tiers[:staging]
+ 'staging' | described_class.tiers[:staging]
+ 'stage' | described_class.tiers[:staging]
+ 'Model' | described_class.tiers[:staging]
+ 'MODL' | described_class.tiers[:staging]
+ 'Pre-production' | described_class.tiers[:staging]
+ 'pre' | described_class.tiers[:staging]
+ 'Demo' | described_class.tiers[:staging]
+ 'gprd' | described_class.tiers[:production]
+ 'gprd-cny' | described_class.tiers[:production]
+ 'production' | described_class.tiers[:production]
+ 'Production' | described_class.tiers[:production]
+ 'prod' | described_class.tiers[:production]
+ 'PROD' | described_class.tiers[:production]
+ 'Live' | described_class.tiers[:production]
+ 'canary' | described_class.tiers[:other]
+ 'other' | described_class.tiers[:other]
+ 'EXP' | described_class.tiers[:other]
+ end
+
+ with_them do
+ it { is_expected.to eq(tier) }
+ end
+ end
+
describe '#expire_etag_cache' do
let(:store) { Gitlab::EtagCaching::Store.new }
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 72ed11f6c74..3ae0666f7d0 100644
--- a/spec/models/error_tracking/project_error_tracking_setting_spec.rb
+++ b/spec/models/error_tracking/project_error_tracking_setting_spec.rb
@@ -111,7 +111,7 @@ RSpec.describe ErrorTracking::ProjectErrorTrackingSetting do
describe '#sentry_client' do
it 'returns sentry client' do
- expect(subject.sentry_client).to be_a(Sentry::Client)
+ expect(subject.sentry_client).to be_a(ErrorTracking::SentryClient)
end
end
@@ -152,7 +152,7 @@ RSpec.describe ErrorTracking::ProjectErrorTrackingSetting do
end
end
- context 'when sentry client raises Sentry::Client::Error' do
+ context 'when sentry client raises ErrorTracking::SentryClient::Error' do
let(:sentry_client) { spy(:sentry_client) }
before do
@@ -160,7 +160,7 @@ RSpec.describe ErrorTracking::ProjectErrorTrackingSetting do
allow(subject).to receive(:sentry_client).and_return(sentry_client)
allow(sentry_client).to receive(:list_issues).with(opts)
- .and_raise(Sentry::Client::Error, 'error message')
+ .and_raise(ErrorTracking::SentryClient::Error, 'error message')
end
it 'returns error' do
@@ -171,7 +171,7 @@ RSpec.describe ErrorTracking::ProjectErrorTrackingSetting do
end
end
- context 'when sentry client raises Sentry::Client::MissingKeysError' do
+ context 'when sentry client raises ErrorTracking::SentryClient::MissingKeysError' do
let(:sentry_client) { spy(:sentry_client) }
before do
@@ -179,7 +179,7 @@ RSpec.describe ErrorTracking::ProjectErrorTrackingSetting do
allow(subject).to receive(:sentry_client).and_return(sentry_client)
allow(sentry_client).to receive(:list_issues).with(opts)
- .and_raise(Sentry::Client::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
@@ -190,7 +190,7 @@ RSpec.describe ErrorTracking::ProjectErrorTrackingSetting do
end
end
- context 'when sentry client raises Sentry::Client::ResponseInvalidSizeError' do
+ 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}."}
@@ -199,7 +199,7 @@ RSpec.describe ErrorTracking::ProjectErrorTrackingSetting do
allow(subject).to receive(:sentry_client).and_return(sentry_client)
allow(sentry_client).to receive(:list_issues).with(opts)
- .and_raise(Sentry::Client::ResponseInvalidSizeError, error_msg)
+ .and_raise(ErrorTracking::SentryClient::ResponseInvalidSizeError, error_msg)
end
it 'returns error' do
diff --git a/spec/models/experiment_spec.rb b/spec/models/experiment_spec.rb
index 22bbf2df8fd..09dd1766acc 100644
--- a/spec/models/experiment_spec.rb
+++ b/spec/models/experiment_spec.rb
@@ -98,10 +98,11 @@ RSpec.describe Experiment do
describe '.record_conversion_event' do
let_it_be(:user) { build(:user) }
+ let_it_be(:context) { { a: 42 } }
let(:experiment_key) { :test_experiment }
- subject(:record_conversion_event) { described_class.record_conversion_event(experiment_key, user) }
+ subject(:record_conversion_event) { described_class.record_conversion_event(experiment_key, user, context) }
context 'when no matching experiment exists' do
it 'creates the experiment and uses it' do
@@ -127,22 +128,79 @@ RSpec.describe Experiment do
it 'sends record_conversion_event_for_user to the experiment instance' do
expect_next_found_instance_of(described_class) do |experiment|
- expect(experiment).to receive(:record_conversion_event_for_user).with(user)
+ expect(experiment).to receive(:record_conversion_event_for_user).with(user, context)
end
record_conversion_event
end
end
end
+ shared_examples 'experiment user with context' do
+ let_it_be(:context) { { a: 42, 'b' => 34, 'c': { c1: 100, c2: 'c2', e: :e }, d: [1, 3] } }
+ let_it_be(:initial_expected_context) { { 'a' => 42, 'b' => 34, 'c' => { 'c1' => 100, 'c2' => 'c2', 'e' => 'e' }, 'd' => [1, 3] } }
+
+ before do
+ subject
+ experiment.record_user_and_group(user, :experimental, {})
+ end
+
+ it 'has an initial context with stringified keys' do
+ expect(ExperimentUser.last.context).to eq(initial_expected_context)
+ end
+
+ context 'when updated' do
+ before do
+ subject
+ experiment.record_user_and_group(user, :experimental, new_context)
+ end
+
+ context 'with an empty context' do
+ let_it_be(:new_context) { {} }
+
+ it 'keeps the initial context' do
+ expect(ExperimentUser.last.context).to eq(initial_expected_context)
+ end
+ end
+
+ context 'with string keys' do
+ let_it_be(:new_context) { { f: :some_symbol } }
+
+ it 'adds new symbols stringified' do
+ expected_context = initial_expected_context.merge('f' => 'some_symbol')
+ expect(ExperimentUser.last.context).to eq(expected_context)
+ end
+ end
+
+ context 'with atomic values or array values' do
+ let_it_be(:new_context) { { b: 97, d: [99] } }
+
+ it 'overrides the values' do
+ expected_context = { 'a' => 42, 'b' => 97, 'c' => { 'c1' => 100, 'c2' => 'c2', 'e' => 'e' }, 'd' => [99] }
+ expect(ExperimentUser.last.context).to eq(expected_context)
+ end
+ end
+
+ context 'with nested hashes' do
+ let_it_be(:new_context) { { c: { g: 107 } } }
+
+ it 'inserts nested additional values in the same keys' do
+ expected_context = initial_expected_context.deep_merge('c' => { 'g' => 107 })
+ expect(ExperimentUser.last.context).to eq(expected_context)
+ end
+ end
+ end
+ end
+
describe '#record_conversion_event_for_user' do
let_it_be(:user) { create(:user) }
let_it_be(:experiment) { create(:experiment) }
+ let_it_be(:context) { { a: 42 } }
- subject(:record_conversion_event_for_user) { experiment.record_conversion_event_for_user(user) }
+ subject { experiment.record_conversion_event_for_user(user, context) }
context 'when no existing experiment_user record exists for the given user' do
it 'does not update or create an experiment_user record' do
- expect { record_conversion_event_for_user }.not_to change { ExperimentUser.all.to_a }
+ expect { subject }.not_to change { ExperimentUser.all.to_a }
end
end
@@ -151,7 +209,13 @@ RSpec.describe Experiment do
let!(:experiment_user) { create(:experiment_user, experiment: experiment, user: user, converted_at: 2.days.ago) }
it 'does not update the converted_at value' do
- expect { record_conversion_event_for_user }.not_to change { experiment_user.converted_at }
+ expect { subject }.not_to change { experiment_user.converted_at }
+ end
+
+ it_behaves_like 'experiment user with context' do
+ before do
+ experiment.record_user_and_group(user, :experimental, context)
+ end
end
end
@@ -159,7 +223,13 @@ RSpec.describe Experiment do
let(:experiment_user) { create(:experiment_user, experiment: experiment, user: user) }
it 'updates the converted_at value' do
- expect { record_conversion_event_for_user }.to change { experiment_user.reload.converted_at }
+ expect { subject }.to change { experiment_user.reload.converted_at }
+ end
+
+ it_behaves_like 'experiment user with context' do
+ before do
+ experiment.record_user_and_group(user, :experimental, context)
+ end
end
end
end
@@ -196,24 +266,25 @@ RSpec.describe Experiment do
describe '#record_user_and_group' do
let_it_be(:experiment) { create(:experiment) }
let_it_be(:user) { create(:user) }
+ let_it_be(:group) { :control }
+ let_it_be(:context) { { a: 42 } }
- let(:group) { :control }
- let(:context) { { a: 42 } }
-
- subject(:record_user_and_group) { experiment.record_user_and_group(user, group, context) }
+ subject { experiment.record_user_and_group(user, group, context) }
context 'when an experiment_user does not yet exist for the given user' do
it 'creates a new experiment_user record' do
- expect { record_user_and_group }.to change(ExperimentUser, :count).by(1)
+ expect { subject }.to change(ExperimentUser, :count).by(1)
end
it 'assigns the correct group_type to the experiment_user' do
- record_user_and_group
+ subject
+
expect(ExperimentUser.last.group_type).to eq('control')
end
it 'adds the correct context to the experiment_user' do
- record_user_and_group
+ subject
+
expect(ExperimentUser.last.context).to eq({ 'a' => 42 })
end
end
@@ -225,72 +296,18 @@ RSpec.describe Experiment do
end
it 'does not create a new experiment_user record' do
- expect { record_user_and_group }.not_to change(ExperimentUser, :count)
+ expect { subject }.not_to change(ExperimentUser, :count)
end
context 'but the group_type and context has changed' do
let(:group) { :experimental }
it 'updates the existing experiment_user record with group_type' do
- expect { record_user_and_group }.to change { ExperimentUser.last.group_type }
+ expect { subject }.to change { ExperimentUser.last.group_type }
end
end
- end
-
- context 'when a context already exists' do
- let_it_be(:context) { { a: 42, 'b' => 34, 'c': { c1: 100, c2: 'c2', e: :e }, d: [1, 3] } }
- let_it_be(:initial_expected_context) { { 'a' => 42, 'b' => 34, 'c' => { 'c1' => 100, 'c2' => 'c2', 'e' => 'e' }, 'd' => [1, 3] } }
-
- before do
- record_user_and_group
- experiment.record_user_and_group(user, :control, {})
- end
-
- it 'has an initial context with stringified keys' do
- expect(ExperimentUser.last.context).to eq(initial_expected_context)
- end
-
- context 'when updated' do
- before do
- record_user_and_group
- experiment.record_user_and_group(user, :control, new_context)
- end
-
- context 'with an empty context' do
- let_it_be(:new_context) { {} }
- it 'keeps the initial context' do
- expect(ExperimentUser.last.context).to eq(initial_expected_context)
- end
- end
-
- context 'with string keys' do
- let_it_be(:new_context) { { f: :some_symbol } }
-
- it 'adds new symbols stringified' do
- expected_context = initial_expected_context.merge('f' => 'some_symbol')
- expect(ExperimentUser.last.context).to eq(expected_context)
- end
- end
-
- context 'with atomic values or array values' do
- let_it_be(:new_context) { { b: 97, d: [99] } }
-
- it 'overrides the values' do
- expected_context = { 'a' => 42, 'b' => 97, 'c' => { 'c1' => 100, 'c2' => 'c2', 'e' => 'e' }, 'd' => [99] }
- expect(ExperimentUser.last.context).to eq(expected_context)
- end
- end
-
- context 'with nested hashes' do
- let_it_be(:new_context) { { c: { g: 107 } } }
-
- it 'inserts nested additional values in the same keys' do
- expected_context = initial_expected_context.deep_merge('c' => { 'g' => 107 })
- expect(ExperimentUser.last.context).to eq(expected_context)
- end
- end
- end
+ it_behaves_like 'experiment user with context'
end
end
end
diff --git a/spec/models/group_spec.rb b/spec/models/group_spec.rb
index e79b54b4674..20983744919 100644
--- a/spec/models/group_spec.rb
+++ b/spec/models/group_spec.rb
@@ -25,7 +25,6 @@ RSpec.describe Group do
it { is_expected.to have_many(:clusters).class_name('Clusters::Cluster') }
it { is_expected.to have_many(:container_repositories) }
it { is_expected.to have_many(:milestones) }
- it { is_expected.to have_many(:iterations) }
it { is_expected.to have_many(:group_deploy_keys) }
it { is_expected.to have_many(:services) }
it { is_expected.to have_one(:dependency_proxy_setting) }
@@ -65,6 +64,59 @@ RSpec.describe Group do
it { is_expected.to validate_presence_of :two_factor_grace_period }
it { is_expected.to validate_numericality_of(:two_factor_grace_period).is_greater_than_or_equal_to(0) }
+ context 'validating the parent of a group' do
+ context 'when the group has no parent' do
+ it 'allows a group to have no parent associated with it' do
+ group = build(:group)
+
+ expect(group).to be_valid
+ end
+ end
+
+ context 'when the group has a parent' do
+ it 'does not allow a group to have a namespace as its parent' do
+ group = build(:group, parent: build(:namespace))
+
+ expect(group).not_to be_valid
+ expect(group.errors[:parent_id].first).to eq('a group cannot have a user namespace as its parent')
+ end
+
+ it 'allows a group to have another group as its parent' do
+ group = build(:group, parent: build(:group))
+
+ expect(group).to be_valid
+ end
+ end
+
+ context 'when the feature flag `validate_namespace_parent_type` is disabled' do
+ before do
+ stub_feature_flags(validate_namespace_parent_type: false)
+ end
+
+ context 'when the group has no parent' do
+ it 'allows a group to have no parent associated with it' do
+ group = build(:group)
+
+ expect(group).to be_valid
+ end
+ end
+
+ context 'when the group has a parent' do
+ it 'allows a group to have a namespace as its parent' do
+ group = build(:group, parent: build(:namespace))
+
+ expect(group).to be_valid
+ end
+
+ it 'allows a group to have another group as its parent' do
+ group = build(:group, parent: build(:group))
+
+ expect(group).to be_valid
+ end
+ end
+ end
+ end
+
describe 'path validation' do
it 'rejects paths reserved on the root namespace when the group has no parent' do
group = build(:group, path: 'api')
@@ -729,8 +781,16 @@ RSpec.describe Group do
context 'evaluating admin access level' do
let_it_be(:admin) { create(:admin) }
- it 'returns OWNER by default' do
- expect(group.max_member_access_for_user(admin)).to eq(Gitlab::Access::OWNER)
+ context 'when admin mode is enabled', :enable_admin_mode do
+ it 'returns OWNER by default' do
+ expect(group.max_member_access_for_user(admin)).to eq(Gitlab::Access::OWNER)
+ end
+ end
+
+ context 'when admin mode is disabled' do
+ it 'returns NO_ACCESS' do
+ expect(group.max_member_access_for_user(admin)).to eq(Gitlab::Access::NO_ACCESS)
+ end
end
it 'returns NO_ACCESS when only concrete membership should be considered' do
@@ -740,6 +800,33 @@ RSpec.describe Group do
end
end
+ describe '#direct_members' do
+ let_it_be(:group) { create(:group, :nested) }
+ let_it_be(:maintainer) { group.parent.add_user(create(:user), GroupMember::MAINTAINER) }
+ let_it_be(:developer) { group.add_user(create(:user), GroupMember::DEVELOPER) }
+
+ it 'does not return members of the parent' do
+ expect(group.direct_members).not_to include(maintainer)
+ end
+
+ it 'returns the direct member of the group' do
+ expect(group.direct_members).to include(developer)
+ end
+
+ context 'group sharing' do
+ let!(:shared_group) { create(:group) }
+
+ before do
+ create(:group_group_link, shared_group: shared_group, shared_with_group: group)
+ end
+
+ it 'does not return members of the shared_with group' do
+ expect(shared_group.direct_members).not_to(
+ include(developer))
+ end
+ end
+ end
+
describe '#members_with_parents' do
let!(:group) { create(:group, :nested) }
let!(:maintainer) { group.parent.add_user(create(:user), GroupMember::MAINTAINER) }
@@ -932,6 +1019,65 @@ RSpec.describe Group do
end
end
+ describe '#refresh_members_authorized_projects' do
+ let_it_be(:group) { create(:group, :nested) }
+ let_it_be(:parent_group_user) { create(:user) }
+ let_it_be(:group_user) { create(:user) }
+
+ before do
+ group.parent.add_maintainer(parent_group_user)
+ group.add_developer(group_user)
+ end
+
+ context 'users for which authorizations refresh is executed' do
+ it 'processes authorizations refresh for all members of the group' do
+ expect(UserProjectAccessChangedService).to receive(:new).with(contain_exactly(group_user.id, parent_group_user.id)).and_call_original
+
+ group.refresh_members_authorized_projects
+ end
+
+ context 'when explicitly specified to run only for direct members' do
+ it 'processes authorizations refresh only for direct members of the group' do
+ expect(UserProjectAccessChangedService).to receive(:new).with(contain_exactly(group_user.id)).and_call_original
+
+ group.refresh_members_authorized_projects(direct_members_only: true)
+ end
+ end
+ end
+ end
+
+ describe '#users_ids_of_direct_members' do
+ let_it_be(:group) { create(:group, :nested) }
+ let_it_be(:parent_group_user) { create(:user) }
+ let_it_be(:group_user) { create(:user) }
+
+ before do
+ group.parent.add_maintainer(parent_group_user)
+ group.add_developer(group_user)
+ end
+
+ it 'does not return user ids of the members of the parent' do
+ expect(group.users_ids_of_direct_members).not_to include(parent_group_user.id)
+ end
+
+ it 'returns the user ids of the direct member of the group' do
+ expect(group.users_ids_of_direct_members).to include(group_user.id)
+ end
+
+ context 'group sharing' do
+ let!(:shared_group) { create(:group) }
+
+ before do
+ create(:group_group_link, shared_group: shared_group, shared_with_group: group)
+ end
+
+ it 'does not return the user ids of members of the shared_with group' do
+ expect(shared_group.users_ids_of_direct_members).not_to(
+ include(group_user.id))
+ end
+ end
+ end
+
describe '#user_ids_for_project_authorizations' do
it 'returns the user IDs for which to refresh authorizations' do
maintainer = create(:user)
@@ -959,6 +1105,29 @@ RSpec.describe Group do
include(group_user.id))
end
end
+
+ context 'distinct user ids' do
+ let_it_be(:subgroup) { create(:group, :nested) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:shared_with_group) { create(:group) }
+ let_it_be(:other_subgroup_user) { create(:user) }
+
+ before do
+ create(:group_group_link, shared_group: subgroup, shared_with_group: shared_with_group)
+ subgroup.add_maintainer(other_subgroup_user)
+
+ # `user` is added as a direct member of the parent group, the subgroup
+ # and another group shared with the subgroup.
+ subgroup.parent.add_maintainer(user)
+ subgroup.add_developer(user)
+ shared_with_group.add_guest(user)
+ end
+
+ it 'returns only distinct user ids of users for which to refresh authorizations' do
+ expect(subgroup.user_ids_for_project_authorizations).to(
+ contain_exactly(user.id, other_subgroup_user.id))
+ end
+ end
end
describe '#update_two_factor_requirement' do
@@ -1149,9 +1318,10 @@ RSpec.describe Group do
describe '#ci_variables_for' do
let(:project) { create(:project, group: group) }
+ let(:environment_scope) { '*' }
let!(:ci_variable) do
- create(:ci_group_variable, value: 'secret', group: group)
+ create(:ci_group_variable, value: 'secret', group: group, environment_scope: environment_scope)
end
let!(:protected_variable) do
@@ -1160,13 +1330,16 @@ RSpec.describe Group do
subject { group.ci_variables_for('ref', project) }
- it 'memoizes the result by ref', :request_store do
+ it 'memoizes the result by ref and environment', :request_store do
+ scoped_variable = create(:ci_group_variable, value: 'secret', group: group, environment_scope: 'scoped')
+
expect(project).to receive(:protected_for?).with('ref').once.and_return(true)
- expect(project).to receive(:protected_for?).with('other').once.and_return(false)
+ expect(project).to receive(:protected_for?).with('other').twice.and_return(false)
2.times do
- expect(group.ci_variables_for('ref', project)).to contain_exactly(ci_variable, protected_variable)
+ expect(group.ci_variables_for('ref', project, environment: 'production')).to contain_exactly(ci_variable, protected_variable)
expect(group.ci_variables_for('other', project)).to contain_exactly(ci_variable)
+ expect(group.ci_variables_for('other', project, environment: 'scoped')).to contain_exactly(ci_variable, scoped_variable)
end
end
@@ -1203,6 +1376,120 @@ RSpec.describe Group do
it_behaves_like 'ref is protected'
end
+ context 'when environment name is specified' do
+ let(:environment) { 'review/name' }
+
+ subject do
+ group.ci_variables_for('ref', project, environment: environment)
+ end
+
+ context 'when environment scope is exactly matched' do
+ let(:environment_scope) { 'review/name' }
+
+ it { is_expected.to contain_exactly(ci_variable) }
+ end
+
+ context 'when environment scope is matched by wildcard' do
+ let(:environment_scope) { 'review/*' }
+
+ it { is_expected.to contain_exactly(ci_variable) }
+ end
+
+ context 'when environment scope does not match' do
+ let(:environment_scope) { 'review/*/special' }
+
+ it { is_expected.not_to contain_exactly(ci_variable) }
+ end
+
+ context 'when environment scope has _' do
+ let(:environment_scope) { '*_*' }
+
+ it 'does not treat it as wildcard' do
+ is_expected.not_to contain_exactly(ci_variable)
+ end
+
+ context 'when environment name contains underscore' do
+ let(:environment) { 'foo_bar/test' }
+ let(:environment_scope) { 'foo_bar/*' }
+
+ it 'matches literally for _' do
+ is_expected.to contain_exactly(ci_variable)
+ end
+ end
+ end
+
+ # The environment name and scope cannot have % at the moment,
+ # but we're considering relaxing it and we should also make sure
+ # it doesn't break in case some data sneaked in somehow as we're
+ # not checking this integrity in database level.
+ context 'when environment scope has %' do
+ it 'does not treat it as wildcard' do
+ ci_variable.update_attribute(:environment_scope, '*%*')
+
+ is_expected.not_to contain_exactly(ci_variable)
+ end
+
+ context 'when environment name contains a percent' do
+ let(:environment) { 'foo%bar/test' }
+
+ it 'matches literally for %' do
+ ci_variable.update(environment_scope: 'foo%bar/*')
+
+ is_expected.to contain_exactly(ci_variable)
+ end
+ end
+ end
+
+ context 'when variables with the same name have different environment scopes' do
+ let!(:partially_matched_variable) do
+ create(:ci_group_variable,
+ key: ci_variable.key,
+ value: 'partial',
+ environment_scope: 'review/*',
+ group: group)
+ end
+
+ let!(:perfectly_matched_variable) do
+ create(:ci_group_variable,
+ key: ci_variable.key,
+ value: 'prefect',
+ environment_scope: 'review/name',
+ group: group)
+ end
+
+ it 'puts variables matching environment scope more in the end' do
+ is_expected.to eq(
+ [ci_variable,
+ partially_matched_variable,
+ perfectly_matched_variable])
+ end
+ end
+
+ context 'when :scoped_group_variables feature flag is disabled' do
+ before do
+ stub_feature_flags(scoped_group_variables: false)
+ end
+
+ context 'when environment scope is exactly matched' do
+ let(:environment_scope) { 'review/name' }
+
+ it { is_expected.to contain_exactly(ci_variable) }
+ end
+
+ context 'when environment scope is partially matched' do
+ let(:environment_scope) { 'review/*' }
+
+ it { is_expected.to contain_exactly(ci_variable) }
+ end
+
+ context 'when environment scope does not match' do
+ let(:environment_scope) { 'review/*/special' }
+
+ it { is_expected.to contain_exactly(ci_variable) }
+ end
+ end
+ end
+
context 'when group has children' do
let(:group_child) { create(:group, parent: group) }
let(:group_child_2) { create(:group, parent: group_child) }
diff --git a/spec/models/issue_email_participant_spec.rb b/spec/models/issue_email_participant_spec.rb
index f19e65e31f3..09c231bbfda 100644
--- a/spec/models/issue_email_participant_spec.rb
+++ b/spec/models/issue_email_participant_spec.rb
@@ -11,9 +11,14 @@ RSpec.describe IssueEmailParticipant do
subject { build(:issue_email_participant) }
it { is_expected.to validate_presence_of(:issue) }
- it { is_expected.to validate_presence_of(:email) }
- it { is_expected.to validate_uniqueness_of(:email).scoped_to([:issue_id]) }
+ it { is_expected.to validate_uniqueness_of(:email).scoped_to([:issue_id]).ignoring_case_sensitivity }
- it_behaves_like 'an object with RFC3696 compliant email-formated attributes', :email
+ it_behaves_like 'an object with RFC3696 compliant email-formatted attributes', :email
+
+ it 'is invalid if the email is nil' do
+ subject.email = nil
+
+ expect(subject).to be_invalid
+ end
end
end
diff --git a/spec/models/issue_spec.rb b/spec/models/issue_spec.rb
index 969d897e551..965da59a0ed 100644
--- a/spec/models/issue_spec.rb
+++ b/spec/models/issue_spec.rb
@@ -1258,4 +1258,12 @@ RSpec.describe Issue do
expect { issue.issue_type_supports?(:unkown_feature) }.to raise_error(ArgumentError)
end
end
+
+ describe '#email_participants_downcase' do
+ it 'returns a list of emails with all uppercase letters replaced with their lowercase counterparts' do
+ participant = create(:issue_email_participant, email: 'SomEoNe@ExamPLe.com')
+
+ expect(participant.issue.email_participants_downcase).to match([participant.email.downcase])
+ end
+ end
end
diff --git a/spec/models/iteration_spec.rb b/spec/models/iteration_spec.rb
deleted file mode 100644
index e7ec5de0ef1..00000000000
--- a/spec/models/iteration_spec.rb
+++ /dev/null
@@ -1,335 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Iteration do
- let_it_be(:project) { create(:project) }
- let_it_be(:group) { create(:group) }
-
- describe "#iid" do
- it "is properly scoped on project and group" do
- iteration1 = create(:iteration, :skip_project_validation, project: project)
- iteration2 = create(:iteration, :skip_project_validation, project: project)
- iteration3 = create(:iteration, group: group)
- iteration4 = create(:iteration, group: group)
- iteration5 = create(:iteration, :skip_project_validation, project: project)
-
- want = {
- iteration1: 1,
- iteration2: 2,
- iteration3: 1,
- iteration4: 2,
- iteration5: 3
- }
- got = {
- iteration1: iteration1.iid,
- iteration2: iteration2.iid,
- iteration3: iteration3.iid,
- iteration4: iteration4.iid,
- iteration5: iteration5.iid
- }
- expect(got).to eq(want)
- end
- end
-
- describe '.filter_by_state' do
- let_it_be(:closed_iteration) { create(:iteration, :closed, :skip_future_date_validation, group: group, start_date: 8.days.ago, due_date: 2.days.ago) }
- let_it_be(:started_iteration) { create(:iteration, :started, :skip_future_date_validation, group: group, start_date: 1.day.ago, due_date: 6.days.from_now) }
- let_it_be(:upcoming_iteration) { create(:iteration, :upcoming, group: group, start_date: 1.week.from_now, due_date: 2.weeks.from_now) }
-
- shared_examples_for 'filter_by_state' do
- it 'filters by the given state' do
- expect(described_class.filter_by_state(Iteration.all, state)).to match(expected_iterations)
- end
- end
-
- context 'filtering by closed iterations' do
- it_behaves_like 'filter_by_state' do
- let(:state) { 'closed' }
- let(:expected_iterations) { [closed_iteration] }
- end
- end
-
- context 'filtering by started iterations' do
- it_behaves_like 'filter_by_state' do
- let(:state) { 'started' }
- let(:expected_iterations) { [started_iteration] }
- end
- end
-
- context 'filtering by opened iterations' do
- it_behaves_like 'filter_by_state' do
- let(:state) { 'opened' }
- let(:expected_iterations) { [started_iteration, upcoming_iteration] }
- end
- end
-
- context 'filtering by upcoming iterations' do
- it_behaves_like 'filter_by_state' do
- let(:state) { 'upcoming' }
- let(:expected_iterations) { [upcoming_iteration] }
- end
- end
-
- context 'filtering by "all"' do
- it_behaves_like 'filter_by_state' do
- let(:state) { 'all' }
- let(:expected_iterations) { [closed_iteration, started_iteration, upcoming_iteration] }
- end
- end
-
- context 'filtering by nonexistent filter' do
- it 'raises ArgumentError' do
- expect { described_class.filter_by_state(Iteration.none, 'unknown') }.to raise_error(ArgumentError, 'Unknown state filter: unknown')
- end
- end
- end
-
- context 'Validations' do
- subject { build(:iteration, group: group, start_date: start_date, due_date: due_date) }
-
- describe '#not_belonging_to_project' do
- subject { build(:iteration, project: project, start_date: Time.current, due_date: 1.day.from_now) }
-
- it 'is invalid' do
- expect(subject).not_to be_valid
- expect(subject.errors[:project_id]).to include('is not allowed. We do not currently support project-level iterations')
- end
- end
-
- describe '#dates_do_not_overlap' do
- let_it_be(:existing_iteration) { create(:iteration, group: group, start_date: 4.days.from_now, due_date: 1.week.from_now) }
-
- context 'when no Iteration dates overlap' do
- let(:start_date) { 2.weeks.from_now }
- let(:due_date) { 3.weeks.from_now }
-
- it { is_expected.to be_valid }
- end
-
- context 'when updated iteration dates overlap with its own dates' do
- it 'is valid' do
- existing_iteration.start_date = 5.days.from_now
-
- expect(existing_iteration).to be_valid
- end
- end
-
- context 'when dates overlap' do
- let(:start_date) { 5.days.from_now }
- let(:due_date) { 6.days.from_now }
-
- shared_examples_for 'overlapping dates' do |skip_constraint_test: false|
- context 'when start_date is in range' do
- let(:start_date) { 5.days.from_now }
- let(:due_date) { 3.weeks.from_now }
-
- it 'is not valid' do
- expect(subject).not_to be_valid
- expect(subject.errors[:base]).to include('Dates cannot overlap with other existing Iterations')
- end
-
- unless skip_constraint_test
- it 'is not valid even if forced' do
- subject.validate # to generate iid/etc
- expect { subject.save!(validate: false) }.to raise_exception(ActiveRecord::StatementInvalid, /#{constraint_name}/)
- end
- end
- end
-
- context 'when end_date is in range' do
- let(:start_date) { Time.current }
- let(:due_date) { 6.days.from_now }
-
- it 'is not valid' do
- expect(subject).not_to be_valid
- expect(subject.errors[:base]).to include('Dates cannot overlap with other existing Iterations')
- end
-
- unless skip_constraint_test
- it 'is not valid even if forced' do
- subject.validate # to generate iid/etc
- expect { subject.save!(validate: false) }.to raise_exception(ActiveRecord::StatementInvalid, /#{constraint_name}/)
- end
- end
- end
-
- context 'when both overlap' do
- it 'is not valid' do
- expect(subject).not_to be_valid
- expect(subject.errors[:base]).to include('Dates cannot overlap with other existing Iterations')
- end
-
- unless skip_constraint_test
- it 'is not valid even if forced' do
- subject.validate # to generate iid/etc
- expect { subject.save!(validate: false) }.to raise_exception(ActiveRecord::StatementInvalid, /#{constraint_name}/)
- end
- end
- end
- end
-
- context 'group' do
- it_behaves_like 'overlapping dates' do
- let(:constraint_name) { 'iteration_start_and_due_daterange_group_id_constraint' }
- end
-
- context 'different group' do
- let(:group) { create(:group) }
-
- it { is_expected.to be_valid }
-
- it 'does not trigger exclusion constraints' do
- expect { subject.save! }.not_to raise_exception
- end
- end
-
- context 'sub-group' do
- let(:subgroup) { create(:group, parent: group) }
-
- subject { build(:iteration, group: subgroup, start_date: start_date, due_date: due_date) }
-
- it_behaves_like 'overlapping dates', skip_constraint_test: true
- end
- end
-
- context 'project' do
- let_it_be(:existing_iteration) { create(:iteration, :skip_project_validation, project: project, start_date: 4.days.from_now, due_date: 1.week.from_now) }
-
- subject { build(:iteration, :skip_project_validation, project: project, start_date: start_date, due_date: due_date) }
-
- it_behaves_like 'overlapping dates' do
- let(:constraint_name) { 'iteration_start_and_due_daterange_project_id_constraint' }
- end
-
- context 'different project' do
- let(:project) { create(:project) }
-
- it { is_expected.to be_valid }
-
- it 'does not trigger exclusion constraints' do
- expect { subject.save! }.not_to raise_exception
- end
- end
-
- context 'in a group' do
- let(:group) { create(:group) }
-
- subject { build(:iteration, group: group, start_date: start_date, due_date: due_date) }
-
- it { is_expected.to be_valid }
-
- it 'does not trigger exclusion constraints' do
- expect { subject.save! }.not_to raise_exception
- end
- end
- end
-
- context 'project in a group' do
- let_it_be(:project) { create(:project, group: create(:group)) }
- let_it_be(:existing_iteration) { create(:iteration, :skip_project_validation, project: project, start_date: 4.days.from_now, due_date: 1.week.from_now) }
-
- subject { build(:iteration, :skip_project_validation, project: project, start_date: start_date, due_date: due_date) }
-
- it_behaves_like 'overlapping dates' do
- let(:constraint_name) { 'iteration_start_and_due_daterange_project_id_constraint' }
- end
- end
- end
- end
-
- describe '#future_date' do
- context 'when dates are in the future' do
- let(:start_date) { Time.current }
- let(:due_date) { 1.week.from_now }
-
- it { is_expected.to be_valid }
- end
-
- context 'when start_date is in the past' do
- let(:start_date) { 1.week.ago }
- let(:due_date) { 1.week.from_now }
-
- it 'is not valid' do
- expect(subject).not_to be_valid
- expect(subject.errors[:start_date]).to include('cannot be in the past')
- end
- end
-
- context 'when due_date is in the past' do
- let(:start_date) { Time.current }
- let(:due_date) { 1.week.ago }
-
- it 'is not valid' do
- expect(subject).not_to be_valid
- expect(subject.errors[:due_date]).to include('cannot be in the past')
- end
- end
-
- context 'when start_date is over 500 years in the future' do
- let(:start_date) { 501.years.from_now }
- let(:due_date) { Time.current }
-
- it 'is not valid' do
- expect(subject).not_to be_valid
- expect(subject.errors[:start_date]).to include('cannot be more than 500 years in the future')
- end
- end
-
- context 'when due_date is over 500 years in the future' do
- let(:start_date) { Time.current }
- let(:due_date) { 501.years.from_now }
-
- it 'is not valid' do
- expect(subject).not_to be_valid
- expect(subject.errors[:due_date]).to include('cannot be more than 500 years in the future')
- end
- end
- end
- end
-
- context 'time scopes' do
- let_it_be(:project) { create(:project, :empty_repo) }
- let_it_be(:iteration_1) { create(:iteration, :skip_future_date_validation, :skip_project_validation, project: project, start_date: 3.days.ago, due_date: 1.day.from_now) }
- let_it_be(:iteration_2) { create(:iteration, :skip_future_date_validation, :skip_project_validation, project: project, start_date: 10.days.ago, due_date: 4.days.ago) }
- let_it_be(:iteration_3) { create(:iteration, :skip_project_validation, project: project, start_date: 4.days.from_now, due_date: 1.week.from_now) }
-
- describe 'start_date_passed' do
- it 'returns iterations where start_date is in the past but due_date is in the future' do
- expect(described_class.start_date_passed).to contain_exactly(iteration_1)
- end
- end
-
- describe 'due_date_passed' do
- it 'returns iterations where due date is in the past' do
- expect(described_class.due_date_passed).to contain_exactly(iteration_2)
- end
- end
- end
-
- describe '.within_timeframe' do
- let_it_be(:now) { Time.current }
- let_it_be(:project) { create(:project, :empty_repo) }
- let_it_be(:iteration_1) { create(:iteration, :skip_project_validation, project: project, start_date: now, due_date: 1.day.from_now) }
- let_it_be(:iteration_2) { create(:iteration, :skip_project_validation, project: project, start_date: 2.days.from_now, due_date: 3.days.from_now) }
- let_it_be(:iteration_3) { create(:iteration, :skip_project_validation, project: project, start_date: 4.days.from_now, due_date: 1.week.from_now) }
-
- it 'returns iterations with start_date and/or end_date between timeframe' do
- iterations = described_class.within_timeframe(2.days.from_now, 3.days.from_now)
-
- expect(iterations).to match_array([iteration_2])
- end
-
- it 'returns iterations which starts before the timeframe' do
- iterations = described_class.within_timeframe(1.day.from_now, 3.days.from_now)
-
- expect(iterations).to match_array([iteration_1, iteration_2])
- end
-
- it 'returns iterations which ends after the timeframe' do
- iterations = described_class.within_timeframe(3.days.from_now, 5.days.from_now)
-
- expect(iterations).to match_array([iteration_2, iteration_3])
- end
- end
-end
diff --git a/spec/models/list_spec.rb b/spec/models/list_spec.rb
index f0b1bc33e84..ad07ee1115b 100644
--- a/spec/models/list_spec.rb
+++ b/spec/models/list_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe List do
it_behaves_like 'having unique enum values'
it_behaves_like 'boards listable model', :list
+ it_behaves_like 'list_preferences_for user', :list, :list_id
describe 'relationships' do
it { is_expected.to belong_to(:board) }
@@ -17,70 +18,16 @@ RSpec.describe List do
it { is_expected.to validate_presence_of(:list_type) }
end
- describe '#update_preferences_for' do
- let(:user) { create(:user) }
- let(:list) { create(:list) }
+ describe '.without_types' do
+ it 'exclude lists of given types' do
+ board = create(:list, list_type: :label).board
+ # closed list is created by default
+ backlog_list = create(:list, list_type: :backlog, board: board)
- context 'when user is present' do
- context 'when there are no preferences for user' do
- it 'creates new user preferences' do
- expect { list.update_preferences_for(user, collapsed: true) }.to change { ListUserPreference.count }.by(1)
- expect(list.preferences_for(user).collapsed).to eq(true)
- end
- end
+ exclude_type = [described_class.list_types[:label], described_class.list_types[:closed]]
- context 'when there are preferences for user' do
- it 'updates user preferences' do
- list.update_preferences_for(user, collapsed: false)
-
- expect { list.update_preferences_for(user, collapsed: true) }.not_to change { ListUserPreference.count }
- expect(list.preferences_for(user).collapsed).to eq(true)
- end
- end
-
- context 'when user is nil' do
- it 'does not create user preferences' do
- expect { list.update_preferences_for(nil, collapsed: true) }.not_to change { ListUserPreference.count }
- end
- end
- end
- end
-
- describe '#preferences_for' do
- let(:user) { create(:user) }
- let(:list) { create(:list) }
-
- context 'when user is nil' do
- it 'returns not persisted preferences' do
- preferences = list.preferences_for(nil)
-
- expect(preferences.persisted?).to eq(false)
- expect(preferences.list_id).to eq(list.id)
- expect(preferences.user_id).to be_nil
- end
- end
-
- context 'when a user preference already exists' do
- before do
- list.update_preferences_for(user, collapsed: true)
- end
-
- it 'loads preference for user' do
- preferences = list.preferences_for(user)
-
- expect(preferences).to be_persisted
- expect(preferences.collapsed).to eq(true)
- end
- end
-
- context 'when preferences for user does not exist' do
- it 'returns not persisted preferences' do
- preferences = list.preferences_for(user)
-
- expect(preferences.persisted?).to eq(false)
- expect(preferences.user_id).to eq(user.id)
- expect(preferences.list_id).to eq(list.id)
- end
+ lists = described_class.without_types(exclude_type)
+ expect(lists.where(board: board)).to match_array([backlog_list])
end
end
end
diff --git a/spec/models/member_spec.rb b/spec/models/member_spec.rb
index b60af7abade..e918a573e09 100644
--- a/spec/models/member_spec.rb
+++ b/spec/models/member_spec.rb
@@ -24,7 +24,7 @@ RSpec.describe Member do
it { is_expected.to allow_value(nil).for(:expires_at) }
end
- it_behaves_like 'an object with email-formated attributes', :invite_email do
+ it_behaves_like 'an object with email-formatted attributes', :invite_email do
subject { build(:project_member) }
end
@@ -425,12 +425,10 @@ RSpec.describe Member do
end
context 'when admin mode is disabled' do
- # Skipped because `Group#max_member_access_for_user` needs to be migrated to use admin mode
- # https://gitlab.com/gitlab-org/gitlab/-/issues/207950
- xit 'rejects setting members.created_by to the given admin current_user' do
+ it 'rejects setting members.created_by to the given admin current_user' do
member = described_class.add_user(source, user, :maintainer, current_user: admin)
- expect(member.created_by).not_to be_persisted
+ expect(member.created_by).to be_nil
end
end
diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb
index ebe2cd2ac03..8c7289adbcc 100644
--- a/spec/models/merge_request_spec.rb
+++ b/spec/models/merge_request_spec.rb
@@ -9,8 +9,8 @@ RSpec.describe MergeRequest, factory_default: :keep do
using RSpec::Parameterized::TableSyntax
- let_it_be(:namespace) { create_default(:namespace) }
- let_it_be(:project, refind: true) { create_default(:project, :repository) }
+ let_it_be(:namespace) { create_default(:namespace).freeze }
+ let_it_be(:project, refind: true) { create_default(:project, :repository).freeze }
subject { create(:merge_request) }
@@ -1366,6 +1366,10 @@ RSpec.describe MergeRequest, factory_default: :keep do
it "doesn't detect WIP by default" do
expect(subject.work_in_progress?).to eq false
end
+
+ it "is aliased to #draft?" do
+ expect(subject.method(:work_in_progress?)).to eq(subject.method(:draft?))
+ end
end
describe "#wipless_title" do
@@ -2895,6 +2899,14 @@ RSpec.describe MergeRequest, factory_default: :keep do
expect(subject.mergeable?).to be_truthy
end
+ it 'return true if #mergeable_state? is true and the MR #can_be_merged? is false' do
+ allow(subject).to receive(:mergeable_state?) { true }
+ expect(subject).to receive(:check_mergeability)
+ expect(subject).to receive(:can_be_merged?) { false }
+
+ expect(subject.mergeable?).to be_falsey
+ end
+
context 'with skip_ci_check option' do
before do
allow(subject).to receive_messages(check_mergeability: nil,
@@ -3072,6 +3084,7 @@ RSpec.describe MergeRequest, factory_default: :keep do
where(:status, :public_status) do
'cannot_be_merged_rechecking' | 'checking'
+ 'preparing' | 'checking'
'checking' | 'checking'
'cannot_be_merged' | 'cannot_be_merged'
end
@@ -3082,32 +3095,83 @@ RSpec.describe MergeRequest, factory_default: :keep do
end
describe "#head_pipeline_active? " do
- it do
- is_expected
- .to delegate_method(:active?)
- .to(:head_pipeline)
- .with_prefix
- .with_arguments(allow_nil: true)
+ context 'when project lacks a head_pipeline relation' do
+ before do
+ subject.head_pipeline = nil
+ end
+
+ it 'returns false' do
+ expect(subject.head_pipeline_active?).to be false
+ end
+ end
+
+ context 'when project has a head_pipeline relation' do
+ let(:pipeline) { create(:ci_empty_pipeline) }
+
+ before do
+ allow(subject).to receive(:head_pipeline) { pipeline }
+ end
+
+ it 'accesses the value from the head_pipeline' do
+ expect(subject.head_pipeline)
+ .to receive(:active?)
+
+ subject.head_pipeline_active?
+ end
end
end
describe "#actual_head_pipeline_success? " do
- it do
- is_expected
- .to delegate_method(:success?)
- .to(:actual_head_pipeline)
- .with_prefix
- .with_arguments(allow_nil: true)
+ context 'when project lacks an actual_head_pipeline relation' do
+ before do
+ allow(subject).to receive(:actual_head_pipeline) { nil }
+ end
+
+ it 'returns false' do
+ expect(subject.actual_head_pipeline_success?).to be false
+ end
+ end
+
+ context 'when project has a actual_head_pipeline relation' do
+ let(:pipeline) { create(:ci_empty_pipeline) }
+
+ before do
+ allow(subject).to receive(:actual_head_pipeline) { pipeline }
+ end
+
+ it 'accesses the value from the actual_head_pipeline' do
+ expect(subject.actual_head_pipeline)
+ .to receive(:success?)
+
+ subject.actual_head_pipeline_success?
+ end
end
end
describe "#actual_head_pipeline_active? " do
- it do
- is_expected
- .to delegate_method(:active?)
- .to(:actual_head_pipeline)
- .with_prefix
- .with_arguments(allow_nil: true)
+ context 'when project lacks an actual_head_pipeline relation' do
+ before do
+ allow(subject).to receive(:actual_head_pipeline) { nil }
+ end
+
+ it 'returns false' do
+ expect(subject.actual_head_pipeline_active?).to be false
+ end
+ end
+
+ context 'when project has a actual_head_pipeline relation' do
+ let(:pipeline) { create(:ci_empty_pipeline) }
+
+ before do
+ allow(subject).to receive(:actual_head_pipeline) { pipeline }
+ end
+
+ it 'accesses the value from the actual_head_pipeline' do
+ expect(subject.actual_head_pipeline)
+ .to receive(:active?)
+
+ subject.actual_head_pipeline_active?
+ end
end
end
@@ -3784,6 +3848,87 @@ RSpec.describe MergeRequest, factory_default: :keep do
end
end
+ describe '#use_merge_base_pipeline_for_comparison?' do
+ let(:project) { create(:project, :public, :repository) }
+ let(:merge_request) { create(:merge_request, :with_codequality_reports, source_project: project) }
+
+ subject { merge_request.use_merge_base_pipeline_for_comparison?(service_class) }
+
+ context 'when service class is Ci::CompareCodequalityReportsService' do
+ let(:service_class) { 'Ci::CompareCodequalityReportsService' }
+
+ context 'when feature flag is enabled' do
+ it { is_expected.to be_truthy }
+ end
+
+ context 'when feature flag is disabled' do
+ before do
+ stub_feature_flags(codequality_backend_comparison: false)
+ end
+
+ it { is_expected.to be_falsey }
+ end
+ end
+
+ context 'when service class is different' do
+ let(:service_class) { 'Ci::GenerateCoverageReportsService' }
+
+ it { is_expected.to be_falsey }
+ end
+ end
+
+ describe '#comparison_base_pipeline' do
+ subject(:pipeline) { merge_request.comparison_base_pipeline(service_class) }
+
+ let(:project) { create(:project, :public, :repository) }
+ let(:merge_request) { create(:merge_request, :with_codequality_reports, source_project: project) }
+ let!(:base_pipeline) do
+ create(:ci_pipeline,
+ :with_test_reports,
+ project: project,
+ ref: merge_request.target_branch,
+ sha: merge_request.diff_base_sha
+ )
+ end
+
+ context 'when service class is Ci::CompareCodequalityReportsService' do
+ let(:service_class) { 'Ci::CompareCodequalityReportsService' }
+
+ context 'when merge request has a merge request pipeline' do
+ let(:merge_request) do
+ create(:merge_request, :with_merge_request_pipeline)
+ end
+
+ let(:merge_base_pipeline) do
+ create(:ci_pipeline, ref: merge_request.target_branch, sha: merge_request.target_branch_sha)
+ end
+
+ before do
+ merge_base_pipeline
+ merge_request.update_head_pipeline
+ end
+
+ it 'returns the merge_base_pipeline' do
+ expect(pipeline).to eq(merge_base_pipeline)
+ end
+ end
+
+ context 'when merge does not have a merge request pipeline' do
+ it 'returns the base_pipeline' do
+ expect(pipeline).to eq(base_pipeline)
+ end
+ end
+ end
+
+ context 'when service_class is different' do
+ let(:service_class) { 'Ci::GenerateCoverageReportsService' }
+
+ it 'returns the base_pipeline' do
+ expect(pipeline).to eq(base_pipeline)
+ end
+ end
+ end
+
describe '#base_pipeline' do
let(:pipeline_arguments) do
{
@@ -3963,6 +4108,65 @@ RSpec.describe MergeRequest, factory_default: :keep do
end
end
+ describe '#mark_as_unchecked' do
+ subject { create(:merge_request, source_project: project, merge_status: merge_status) }
+
+ shared_examples 'for an invalid state transition' do
+ it 'is not a valid state transition' do
+ expect { subject.mark_as_unchecked! }.to raise_error(StateMachines::InvalidTransition)
+ end
+ end
+
+ shared_examples 'for an valid state transition' do
+ it 'is a valid state transition' do
+ expect { subject.mark_as_unchecked! }
+ .to change { subject.merge_status }
+ .from(merge_status.to_s)
+ .to(expected_merge_status)
+ end
+ end
+
+ context 'when the status is unchecked' do
+ let(:merge_status) { :unchecked }
+
+ include_examples 'for an invalid state transition'
+ end
+
+ context 'when the status is checking' do
+ let(:merge_status) { :checking }
+ let(:expected_merge_status) { 'unchecked' }
+
+ include_examples 'for an valid state transition'
+ end
+
+ context 'when the status is can_be_merged' do
+ let(:merge_status) { :can_be_merged }
+ let(:expected_merge_status) { 'unchecked' }
+
+ include_examples 'for an valid state transition'
+ end
+
+ context 'when the status is cannot_be_merged_recheck' do
+ let(:merge_status) { :cannot_be_merged_recheck }
+
+ include_examples 'for an invalid state transition'
+ end
+
+ context 'when the status is cannot_be_merged' do
+ let(:merge_status) { :cannot_be_merged }
+ let(:expected_merge_status) { 'cannot_be_merged_recheck' }
+
+ include_examples 'for an valid state transition'
+ end
+
+ context 'when the status is cannot_be_merged' do
+ let(:merge_status) { :cannot_be_merged }
+ let(:expected_merge_status) { 'cannot_be_merged_recheck' }
+
+ include_examples 'for an valid state transition'
+ end
+ end
+
describe 'transition to cannot_be_merged' do
let(:notification_service) { double(:notification_service) }
let(:todo_service) { double(:todo_service) }
@@ -4661,4 +4865,33 @@ RSpec.describe MergeRequest, factory_default: :keep do
end
end
end
+
+ describe '#includes_ci_config?' do
+ let(:merge_request) { build(:merge_request) }
+ let(:project) { merge_request.project }
+
+ subject(:result) { merge_request.includes_ci_config? }
+
+ before do
+ allow(merge_request).to receive(:diff_stats).and_return(diff_stats)
+ end
+
+ context 'when diff_stats is nil' do
+ let(:diff_stats) {}
+
+ it { is_expected.to eq(false) }
+ end
+
+ context 'when diff_stats does not include the ci config path of the project' do
+ let(:diff_stats) { [double(path: 'abc.txt')] }
+
+ it { is_expected.to eq(false) }
+ end
+
+ context 'when diff_stats includes the ci config path of the project' do
+ let(:diff_stats) { [double(path: '.gitlab-ci.yml')] }
+
+ it { is_expected.to eq(true) }
+ end
+ end
end
diff --git a/spec/models/namespace/traversal_hierarchy_spec.rb b/spec/models/namespace/traversal_hierarchy_spec.rb
index 71b0e974106..83e6d704640 100644
--- a/spec/models/namespace/traversal_hierarchy_spec.rb
+++ b/spec/models/namespace/traversal_hierarchy_spec.rb
@@ -3,41 +3,41 @@
require 'spec_helper'
RSpec.describe Namespace::TraversalHierarchy, type: :model do
- let_it_be(:root, reload: true) { create(:namespace, :with_hierarchy) }
+ let_it_be(:root, reload: true) { create(:group, :with_hierarchy) }
describe '.for_namespace' do
- let(:hierarchy) { described_class.for_namespace(namespace) }
+ let(:hierarchy) { described_class.for_namespace(group) }
context 'with root group' do
- let(:namespace) { root }
+ let(:group) { root }
it { expect(hierarchy.root).to eq root }
end
context 'with child group' do
- let(:namespace) { root.children.first.children.first }
+ let(:group) { root.children.first.children.first }
it { expect(hierarchy.root).to eq root }
end
context 'with group outside of hierarchy' do
- let(:namespace) { create(:namespace) }
+ let(:group) { create(:namespace) }
it { expect(hierarchy.root).not_to eq root }
end
end
describe '.new' do
- let(:hierarchy) { described_class.new(namespace) }
+ let(:hierarchy) { described_class.new(group) }
context 'with root group' do
- let(:namespace) { root }
+ let(:group) { root }
it { expect(hierarchy.root).to eq root }
end
context 'with child group' do
- let(:namespace) { root.children.first }
+ let(:group) { root.children.first }
it { expect { hierarchy }.to raise_error(StandardError, 'Must specify a root node') }
end
diff --git a/spec/models/namespace_spec.rb b/spec/models/namespace_spec.rb
index 647e279bf83..65d787d334b 100644
--- a/spec/models/namespace_spec.rb
+++ b/spec/models/namespace_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe Namespace do
include ProjectForksHelper
include GitHelpers
- let!(:namespace) { create(:namespace) }
+ let!(:namespace) { create(:namespace, :with_namespace_settings) }
let(:gitlab_shell) { Gitlab::Shell.new }
let(:repository_storage) { 'default' }
@@ -32,14 +32,68 @@ RSpec.describe Namespace do
it { is_expected.to validate_presence_of(:owner) }
it { is_expected.to validate_numericality_of(:max_artifacts_size).only_integer.is_greater_than(0) }
+ context 'validating the parent of a namespace' do
+ context 'when the namespace has no parent' do
+ it 'allows a namespace to have no parent associated with it' do
+ namespace = build(:namespace)
+
+ expect(namespace).to be_valid
+ end
+ end
+
+ context 'when the namespace has a parent' do
+ it 'does not allow a namespace to have a group as its parent' do
+ namespace = build(:namespace, parent: build(:group))
+
+ expect(namespace).not_to be_valid
+ expect(namespace.errors[:parent_id].first).to eq('a user namespace cannot have a parent')
+ end
+
+ it 'does not allow a namespace to have another namespace as its parent' do
+ namespace = build(:namespace, parent: build(:namespace))
+
+ expect(namespace).not_to be_valid
+ expect(namespace.errors[:parent_id].first).to eq('a user namespace cannot have a parent')
+ end
+ end
+
+ context 'when the feature flag `validate_namespace_parent_type` is disabled' do
+ before do
+ stub_feature_flags(validate_namespace_parent_type: false)
+ end
+
+ context 'when the namespace has no parent' do
+ it 'allows a namespace to have no parent associated with it' do
+ namespace = build(:namespace)
+
+ expect(namespace).to be_valid
+ end
+ end
+
+ context 'when the namespace has a parent' do
+ it 'allows a namespace to have a group as its parent' do
+ namespace = build(:namespace, parent: build(:group))
+
+ expect(namespace).to be_valid
+ end
+
+ it 'allows a namespace to have another namespace as its parent' do
+ namespace = build(:namespace, parent: build(:namespace))
+
+ expect(namespace).to be_valid
+ end
+ end
+ end
+ end
+
it 'does not allow too deep nesting' do
ancestors = (1..21).to_a
- nested = build(:namespace, parent: namespace)
+ group = build(:group)
- allow(nested).to receive(:ancestors).and_return(ancestors)
+ allow(group).to receive(:ancestors).and_return(ancestors)
- expect(nested).not_to be_valid
- expect(nested.errors[:parent_id].first).to eq('has too deep level of nesting')
+ expect(group).not_to be_valid
+ expect(group.errors[:parent_id].first).to eq('has too deep level of nesting')
end
describe 'reserved path validation' do
@@ -116,6 +170,28 @@ RSpec.describe Namespace do
it { is_expected.to include_module(Namespaces::Traversal::Recursive) }
end
+ describe 'callbacks' do
+ describe 'before_save :ensure_delayed_project_removal_assigned_to_namespace_settings' do
+ it 'sets the matching value in namespace_settings' do
+ expect { namespace.update!(delayed_project_removal: true) }.to change {
+ namespace.namespace_settings.delayed_project_removal
+ }.from(false).to(true)
+ end
+
+ context 'when the feature flag is disabled' do
+ before do
+ stub_feature_flags(migrate_delayed_project_removal: false)
+ end
+
+ it 'does not set the matching value in namespace_settings' do
+ expect { namespace.update!(delayed_project_removal: true) }.not_to change {
+ namespace.namespace_settings.delayed_project_removal
+ }
+ end
+ end
+ end
+ end
+
describe '#visibility_level_field' do
it { expect(namespace.visibility_level_field).to eq(:visibility_level) }
end
@@ -150,45 +226,45 @@ RSpec.describe Namespace do
end
describe '.search' do
- let_it_be(:first_namespace) { build(:namespace, name: 'my first namespace', path: 'old-path').tap(&:save!) }
- let_it_be(:parent_namespace) { build(:namespace, name: 'my parent namespace', path: 'parent-path').tap(&:save!) }
- let_it_be(:second_namespace) { build(:namespace, name: 'my second namespace', path: 'new-path', parent: parent_namespace).tap(&:save!) }
- let_it_be(:project_with_same_path) { create(:project, id: second_namespace.id, path: first_namespace.path) }
+ let_it_be(:first_group) { build(:group, name: 'my first namespace', path: 'old-path').tap(&:save!) }
+ let_it_be(:parent_group) { build(:group, name: 'my parent namespace', path: 'parent-path').tap(&:save!) }
+ let_it_be(:second_group) { build(:group, name: 'my second namespace', path: 'new-path', parent: parent_group).tap(&:save!) }
+ let_it_be(:project_with_same_path) { create(:project, id: second_group.id, path: first_group.path) }
it 'returns namespaces with a matching name' do
- expect(described_class.search('my first namespace')).to eq([first_namespace])
+ expect(described_class.search('my first namespace')).to eq([first_group])
end
it 'returns namespaces with a partially matching name' do
- expect(described_class.search('first')).to eq([first_namespace])
+ expect(described_class.search('first')).to eq([first_group])
end
it 'returns namespaces with a matching name regardless of the casing' do
- expect(described_class.search('MY FIRST NAMESPACE')).to eq([first_namespace])
+ expect(described_class.search('MY FIRST NAMESPACE')).to eq([first_group])
end
it 'returns namespaces with a matching path' do
- expect(described_class.search('old-path')).to eq([first_namespace])
+ expect(described_class.search('old-path')).to eq([first_group])
end
it 'returns namespaces with a partially matching path' do
- expect(described_class.search('old')).to eq([first_namespace])
+ expect(described_class.search('old')).to eq([first_group])
end
it 'returns namespaces with a matching path regardless of the casing' do
- expect(described_class.search('OLD-PATH')).to eq([first_namespace])
+ expect(described_class.search('OLD-PATH')).to eq([first_group])
end
it 'returns namespaces with a matching route path' do
- expect(described_class.search('parent-path/new-path', include_parents: true)).to eq([second_namespace])
+ expect(described_class.search('parent-path/new-path', include_parents: true)).to eq([second_group])
end
it 'returns namespaces with a partially matching route path' do
- expect(described_class.search('parent-path/new', include_parents: true)).to eq([second_namespace])
+ expect(described_class.search('parent-path/new', include_parents: true)).to eq([second_group])
end
it 'returns namespaces with a matching route path regardless of the casing' do
- expect(described_class.search('PARENT-PATH/NEW-PATH', include_parents: true)).to eq([second_namespace])
+ expect(described_class.search('PARENT-PATH/NEW-PATH', include_parents: true)).to eq([second_group])
end
end
@@ -285,6 +361,18 @@ RSpec.describe Namespace do
end
end
+ describe '.top_most' do
+ let_it_be(:namespace) { create(:namespace) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:subgroup) { create(:group, parent: group) }
+
+ subject { described_class.top_most.ids }
+
+ it 'only contains root namespaces' do
+ is_expected.to contain_exactly(group.id, namespace.id)
+ end
+ end
+
describe '#ancestors_upto' do
let(:parent) { create(:group) }
let(:child) { create(:group, parent: parent) }
@@ -800,7 +888,7 @@ RSpec.describe Namespace do
end
describe '#all_projects' do
- shared_examples 'all projects for a group' do
+ context 'when namespace is a group' do
let(:namespace) { create(:group) }
let(:child) { create(:group, parent: namespace) }
let!(:project1) { create(:project_empty_repo, namespace: namespace) }
@@ -808,49 +896,39 @@ RSpec.describe Namespace do
it { expect(namespace.all_projects.to_a).to match_array([project2, project1]) }
it { expect(child.all_projects.to_a).to match_array([project2]) }
- end
-
- shared_examples 'all projects for personal namespace' do
- let_it_be(:user) { create(:user) }
- let_it_be(:user_namespace) { create(:namespace, owner: user) }
- let_it_be(:project) { create(:project, namespace: user_namespace) }
- it { expect(user_namespace.all_projects.to_a).to match_array([project]) }
- end
-
- context 'with recursive approach' do
- context 'when namespace is a group' do
- include_examples 'all projects for a group'
+ context 'when recursive_namespace_lookup_as_inner_join feature flag is on' do
+ before do
+ stub_feature_flags(recursive_namespace_lookup_as_inner_join: true)
+ end
it 'queries for the namespace and its descendants' do
- expect(Project).to receive(:where).with(namespace: [namespace, child])
-
- namespace.all_projects
+ expect(namespace.all_projects).to match_array([project1, project2])
end
end
- context 'when namespace is a user namespace' do
- include_examples 'all projects for personal namespace'
-
- it 'only queries for the namespace itself' do
- expect(Project).to receive(:where).with(namespace: user_namespace)
+ context 'when recursive_namespace_lookup_as_inner_join feature flag is off' do
+ before do
+ stub_feature_flags(recursive_namespace_lookup_as_inner_join: false)
+ end
- user_namespace.all_projects
+ it 'queries for the namespace and its descendants' do
+ expect(namespace.all_projects).to match_array([project1, project2])
end
end
end
- context 'with route path wildcard approach' do
- before do
- stub_feature_flags(recursive_approach_for_all_projects: false)
- end
+ context 'when namespace is a user namespace' do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:user_namespace) { create(:namespace, owner: user) }
+ let_it_be(:project) { create(:project, namespace: user_namespace) }
- context 'when namespace is a group' do
- include_examples 'all projects for a group'
- end
+ it { expect(user_namespace.all_projects.to_a).to match_array([project]) }
+
+ it 'only queries for the namespace itself' do
+ expect(Project).to receive(:where).with(namespace: user_namespace)
- context 'when namespace is a user namespace' do
- include_examples 'all projects for personal namespace'
+ user_namespace.all_projects
end
end
end
@@ -1250,14 +1328,14 @@ RSpec.describe Namespace do
using RSpec::Parameterized::TableSyntax
shared_examples_for 'fetching closest setting' do
- let!(:root_namespace) { create(:namespace) }
- let!(:namespace) { create(:namespace, parent: root_namespace) }
+ let!(:parent) { create(:group) }
+ let!(:group) { create(:group, parent: parent) }
- let(:setting) { namespace.closest_setting(setting_name) }
+ let(:setting) { group.closest_setting(setting_name) }
before do
- root_namespace.update_attribute(setting_name, root_setting)
- namespace.update_attribute(setting_name, child_setting)
+ parent.update_attribute(setting_name, root_setting)
+ group.update_attribute(setting_name, child_setting)
end
it 'returns closest non-nil value' do
@@ -1348,30 +1426,30 @@ RSpec.describe Namespace do
context 'with a parent' do
context 'when parent has shared runners disabled' do
- let(:parent) { create(:namespace, :shared_runners_disabled) }
- let(:sub_namespace) { build(:namespace, shared_runners_enabled: true, parent_id: parent.id) }
+ let(:parent) { create(:group, :shared_runners_disabled) }
+ let(:group) { build(:group, shared_runners_enabled: true, parent_id: parent.id) }
it 'is invalid' do
- expect(sub_namespace).to be_invalid
- expect(sub_namespace.errors[:shared_runners_enabled]).to include('cannot be enabled because parent group has shared Runners disabled')
+ expect(group).to be_invalid
+ expect(group.errors[:shared_runners_enabled]).to include('cannot be enabled because parent group has shared Runners disabled')
end
end
context 'when parent has shared runners disabled but allows override' do
- let(:parent) { create(:namespace, :shared_runners_disabled, :allow_descendants_override_disabled_shared_runners) }
- let(:sub_namespace) { build(:namespace, shared_runners_enabled: true, parent_id: parent.id) }
+ let(:parent) { create(:group, :shared_runners_disabled, :allow_descendants_override_disabled_shared_runners) }
+ let(:group) { build(:group, shared_runners_enabled: true, parent_id: parent.id) }
it 'is valid' do
- expect(sub_namespace).to be_valid
+ expect(group).to be_valid
end
end
context 'when parent has shared runners enabled' do
- let(:parent) { create(:namespace, shared_runners_enabled: true) }
- let(:sub_namespace) { build(:namespace, shared_runners_enabled: true, parent_id: parent.id) }
+ let(:parent) { create(:group, shared_runners_enabled: true) }
+ let(:group) { build(:group, shared_runners_enabled: true, parent_id: parent.id) }
it 'is valid' do
- expect(sub_namespace).to be_valid
+ expect(group).to be_valid
end
end
end
@@ -1401,30 +1479,30 @@ RSpec.describe Namespace do
context 'with a parent' do
context 'when parent does not allow shared runners' do
- let(:parent) { create(:namespace, :shared_runners_disabled) }
- let(:sub_namespace) { build(:namespace, :shared_runners_disabled, :allow_descendants_override_disabled_shared_runners, parent_id: parent.id) }
+ let(:parent) { create(:group, :shared_runners_disabled) }
+ let(:group) { build(:group, :shared_runners_disabled, :allow_descendants_override_disabled_shared_runners, parent_id: parent.id) }
it 'is invalid' do
- expect(sub_namespace).to be_invalid
- expect(sub_namespace.errors[:allow_descendants_override_disabled_shared_runners]).to include('cannot be enabled because parent group does not allow it')
+ expect(group).to be_invalid
+ expect(group.errors[:allow_descendants_override_disabled_shared_runners]).to include('cannot be enabled because parent group does not allow it')
end
end
context 'when parent allows shared runners and setting to true' do
- let(:parent) { create(:namespace, shared_runners_enabled: true) }
- let(:sub_namespace) { build(:namespace, :shared_runners_disabled, :allow_descendants_override_disabled_shared_runners, parent_id: parent.id) }
+ let(:parent) { create(:group, shared_runners_enabled: true) }
+ let(:group) { build(:group, :shared_runners_disabled, :allow_descendants_override_disabled_shared_runners, parent_id: parent.id) }
it 'is valid' do
- expect(sub_namespace).to be_valid
+ expect(group).to be_valid
end
end
context 'when parent allows shared runners and setting to false' do
- let(:parent) { create(:namespace, shared_runners_enabled: true) }
- let(:sub_namespace) { build(:namespace, :shared_runners_disabled, allow_descendants_override_disabled_shared_runners: false, parent_id: parent.id) }
+ let(:parent) { create(:group, shared_runners_enabled: true) }
+ let(:group) { build(:group, :shared_runners_disabled, allow_descendants_override_disabled_shared_runners: false, parent_id: parent.id) }
it 'is valid' do
- expect(sub_namespace).to be_valid
+ expect(group).to be_valid
end
end
end
@@ -1449,4 +1527,24 @@ RSpec.describe Namespace do
end
end
end
+
+ describe '#recent?' do
+ subject { namespace.recent? }
+
+ context 'when created more than 90 days ago' do
+ before do
+ namespace.update_attribute(:created_at, 91.days.ago)
+ end
+
+ it { is_expected.to be(false) }
+ end
+
+ context 'when created less than 90 days ago' do
+ before do
+ namespace.update_attribute(:created_at, 89.days.ago)
+ end
+
+ it { is_expected.to be(true) }
+ end
+ end
end
diff --git a/spec/models/note_spec.rb b/spec/models/note_spec.rb
index 364b80e8601..590acfc0ac1 100644
--- a/spec/models/note_spec.rb
+++ b/spec/models/note_spec.rb
@@ -336,6 +336,25 @@ RSpec.describe Note do
end
end
+ describe "last_edited_at" do
+ let(:timestamp) { Time.current }
+ let(:note) { build(:note, last_edited_at: nil, created_at: timestamp, updated_at: timestamp + 5.hours) }
+
+ context "with last_edited_at" do
+ it "returns last_edited_at" do
+ note.last_edited_at = timestamp
+
+ expect(note.last_edited_at).to eq(timestamp)
+ end
+ end
+
+ context "without last_edited_at" do
+ it "returns updated_at" do
+ expect(note.last_edited_at).to eq(timestamp + 5.hours)
+ end
+ end
+ end
+
describe "edited?" do
let(:note) { build(:note, updated_by_id: nil, created_at: Time.current, updated_at: Time.current + 5.hours) }
diff --git a/spec/models/notification_recipient_spec.rb b/spec/models/notification_recipient_spec.rb
index 8429f577dc6..4debda0621c 100644
--- a/spec/models/notification_recipient_spec.rb
+++ b/spec/models/notification_recipient_spec.rb
@@ -337,6 +337,39 @@ RSpec.describe NotificationRecipient do
expect(recipient.suitable_notification_level?).to eq true
end
end
+
+ context 'with merge_when_pipeline_succeeds' do
+ let(:notification_setting) { user.notification_settings_for(project) }
+ let(:recipient) do
+ described_class.new(
+ user,
+ :watch,
+ custom_action: :merge_when_pipeline_succeeds,
+ target: target,
+ project: project
+ )
+ end
+
+ context 'custom event enabled' do
+ before do
+ notification_setting.update!(merge_when_pipeline_succeeds: true)
+ end
+
+ it 'returns true' do
+ expect(recipient.suitable_notification_level?).to eq true
+ end
+ end
+
+ context 'custom event disabled' do
+ before do
+ notification_setting.update!(merge_when_pipeline_succeeds: false)
+ end
+
+ it 'returns false' do
+ expect(recipient.suitable_notification_level?).to eq false
+ end
+ end
+ end
end
end
diff --git a/spec/models/notification_setting_spec.rb b/spec/models/notification_setting_spec.rb
index bc50e2af373..4ef5ab7af48 100644
--- a/spec/models/notification_setting_spec.rb
+++ b/spec/models/notification_setting_spec.rb
@@ -180,7 +180,8 @@ RSpec.describe NotificationSetting do
:failed_pipeline,
:success_pipeline,
:fixed_pipeline,
- :moved_project
+ :moved_project,
+ :merge_when_pipeline_succeeds
)
end
diff --git a/spec/models/onboarding_progress_spec.rb b/spec/models/onboarding_progress_spec.rb
index 0aa19345a25..779312c9fa0 100644
--- a/spec/models/onboarding_progress_spec.rb
+++ b/spec/models/onboarding_progress_spec.rb
@@ -106,7 +106,7 @@ RSpec.describe OnboardingProgress do
end
context 'when not given a root namespace' do
- let(:namespace) { create(:namespace, parent: build(:namespace)) }
+ let(:namespace) { create(:group, parent: build(:group)) }
it 'does not add a record for the namespace' do
expect { onboard }.not_to change(described_class, :count).from(0)
@@ -182,6 +182,30 @@ RSpec.describe OnboardingProgress do
end
end
+ describe '.not_completed?' do
+ subject { described_class.not_completed?(namespace.id, action) }
+
+ context 'when the namespace has not yet been onboarded' do
+ it { is_expected.to be(false) }
+ end
+
+ context 'when the namespace has been onboarded but not registered the action yet' do
+ before do
+ described_class.onboard(namespace)
+ end
+
+ it { is_expected.to be(true) }
+
+ context 'when the action has been registered' do
+ before do
+ described_class.register(namespace, action)
+ end
+
+ it { is_expected.to be(false) }
+ end
+ end
+ end
+
describe '.column_name' do
subject { described_class.column_name(action) }
diff --git a/spec/models/packages/package_file_spec.rb b/spec/models/packages/package_file_spec.rb
index ebb10e991ad..9cf998a0639 100644
--- a/spec/models/packages/package_file_spec.rb
+++ b/spec/models/packages/package_file_spec.rb
@@ -62,6 +62,21 @@ RSpec.describe Packages::PackageFile, type: :model do
end
end
+ describe '.for_rubygem_with_file_name' do
+ let_it_be(:project) { create(:project) }
+ let_it_be(:non_ruby_package) { create(:nuget_package, project: project, package_type: :nuget) }
+ let_it_be(:ruby_package) { create(:rubygems_package, project: project, package_type: :rubygems) }
+ let_it_be(:file_name) { 'other.gem' }
+
+ let_it_be(:non_ruby_file) { create(:package_file, :nuget, package: non_ruby_package, file_name: file_name) }
+ let_it_be(:gem_file1) { create(:package_file, :gem, package: ruby_package) }
+ let_it_be(:gem_file2) { create(:package_file, :gem, package: ruby_package, file_name: file_name) }
+
+ it 'returns the matching gem file only for ruby packages' do
+ expect(described_class.for_rubygem_with_file_name(project, file_name)).to contain_exactly(gem_file2)
+ end
+ end
+
describe '#update_file_store callback' do
let_it_be(:package_file) { build(:package_file, :nuget, size: nil) }
diff --git a/spec/models/packages/package_spec.rb b/spec/models/packages/package_spec.rb
index 6c55d37b95f..82997acee3f 100644
--- a/spec/models/packages/package_spec.rb
+++ b/spec/models/packages/package_spec.rb
@@ -22,6 +22,14 @@ RSpec.describe Packages::Package, type: :model do
it { is_expected.to have_one(:rubygems_metadatum).inverse_of(:package) }
end
+ describe '.with_debian_codename' do
+ let_it_be(:publication) { create(:debian_publication) }
+
+ subject { described_class.with_debian_codename(publication.distribution.codename).to_a }
+
+ it { is_expected.to contain_exactly(publication.package) }
+ end
+
describe '.with_composer_target' do
let!(:package1) { create(:composer_package, :with_metadatum, sha: '123') }
let!(:package2) { create(:composer_package, :with_metadatum, sha: '123') }
@@ -162,6 +170,18 @@ RSpec.describe Packages::Package, type: :model do
it { is_expected.not_to allow_value('../../../my_package').for(:name) }
it { is_expected.not_to allow_value('%2e%2e%2fmy_package').for(:name) }
end
+
+ context 'npm package' do
+ subject { build_stubbed(:npm_package) }
+
+ it { is_expected.to allow_value("@group-1/package").for(:name) }
+ it { is_expected.to allow_value("@any-scope/package").for(:name) }
+ it { is_expected.to allow_value("unscoped-package").for(:name) }
+ it { is_expected.not_to allow_value("@inv@lid-scope/package").for(:name) }
+ it { is_expected.not_to allow_value("@scope/../../package").for(:name) }
+ it { is_expected.not_to allow_value("@scope%2e%2e%fpackage").for(:name) }
+ it { is_expected.not_to allow_value("@scope/sub/package").for(:name) }
+ end
end
describe '#version' do
@@ -342,16 +362,6 @@ RSpec.describe Packages::Package, type: :model do
end
describe '#package_already_taken' do
- context 'npm package' do
- let!(:package) { create(:npm_package) }
-
- it 'will not allow a package of the same name' do
- new_package = build(:npm_package, project: create(:project), name: package.name)
-
- expect(new_package).not_to be_valid
- end
- end
-
context 'maven package' do
let!(:package) { create(:maven_package) }
@@ -511,7 +521,7 @@ RSpec.describe Packages::Package, type: :model do
describe '.without_nuget_temporary_name' do
let!(:package1) { create(:nuget_package) }
- let!(:package2) { create(:nuget_package, name: Packages::Nuget::CreatePackageService::TEMPORARY_PACKAGE_NAME) }
+ let!(:package2) { create(:nuget_package, name: Packages::Nuget::TEMPORARY_PACKAGE_NAME) }
subject { described_class.without_nuget_temporary_name }
@@ -530,7 +540,7 @@ RSpec.describe Packages::Package, type: :model do
it { is_expected.to match_array([package1, package2, package3]) }
context 'with temporary packages' do
- let!(:package1) { create(:nuget_package, name: Packages::Nuget::CreatePackageService::TEMPORARY_PACKAGE_NAME) }
+ let!(:package1) { create(:nuget_package, name: Packages::Nuget::TEMPORARY_PACKAGE_NAME) }
it { is_expected.to match_array([package2, package3]) }
end
@@ -803,4 +813,63 @@ RSpec.describe Packages::Package, type: :model do
expect(package.package_settings).to eq(group.package_settings)
end
end
+
+ describe '#sync_maven_metadata' do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:package) { create(:maven_package) }
+
+ subject { package.sync_maven_metadata(user) }
+
+ shared_examples 'not enqueuing a sync worker job' do
+ it 'does not enqueue a sync worker job' do
+ expect(::Packages::Maven::Metadata::SyncWorker)
+ .not_to receive(:perform_async)
+
+ subject
+ end
+ end
+
+ it 'enqueues a sync worker job' do
+ expect(::Packages::Maven::Metadata::SyncWorker)
+ .to receive(:perform_async).with(user.id, package.project.id, package.name)
+
+ subject
+ end
+
+ context 'with no user' do
+ let(:user) { nil }
+
+ it_behaves_like 'not enqueuing a sync worker job'
+ end
+
+ context 'with a versionless maven package' do
+ let_it_be(:package) { create(:maven_package, version: nil) }
+
+ it_behaves_like 'not enqueuing a sync worker job'
+ end
+
+ context 'with a non maven package' do
+ let_it_be(:package) { create(:npm_package) }
+
+ it_behaves_like 'not enqueuing a sync worker job'
+ end
+ end
+
+ context 'destroying a composer package' do
+ let_it_be(:package_name) { 'composer-package-name' }
+ let_it_be(:json) { { 'name' => package_name } }
+ let_it_be(:project) { create(:project, :custom_repo, files: { 'composer.json' => json.to_json } ) }
+ let!(:package) { create(:composer_package, :with_metadatum, project: project, name: package_name, version: '1.0.0', json: json) }
+
+ before do
+ Gitlab::Composer::Cache.new(project: project, name: package_name).execute
+ package.composer_metadatum.reload
+ end
+
+ it 'schedule the update job' do
+ expect(::Packages::Composer::CacheUpdateWorker).to receive(:perform_async).with(project.id, package_name, package.composer_metadatum.version_cache_sha)
+
+ package.destroy!
+ end
+ end
end
diff --git a/spec/models/pages/lookup_path_spec.rb b/spec/models/pages/lookup_path_spec.rb
index 0a2b04f1a7c..9e65635da91 100644
--- a/spec/models/pages/lookup_path_spec.rb
+++ b/spec/models/pages/lookup_path_spec.rb
@@ -117,14 +117,6 @@ RSpec.describe Pages::LookupPath do
end
end
- context 'when pages_serve_from_deployments feature flag is disabled' do
- before do
- stub_feature_flags(pages_serve_from_deployments: false)
- end
-
- include_examples 'uses disk storage'
- end
-
context 'when deployment were created during migration' do
before do
allow(deployment).to receive(:migrated?).and_return(true)
diff --git a/spec/models/project_feature_spec.rb b/spec/models/project_feature_spec.rb
index 37402fa04c4..6d0a5face38 100644
--- a/spec/models/project_feature_spec.rb
+++ b/spec/models/project_feature_spec.rb
@@ -40,7 +40,7 @@ RSpec.describe ProjectFeature do
end
context 'public features' do
- features = %w(issues wiki builds merge_requests snippets repository metrics_dashboard operations)
+ features = ProjectFeature::FEATURES - %i(pages)
features.each do |feature|
it "does not allow public access level for #{feature}" do
diff --git a/spec/models/project_repository_storage_move_spec.rb b/spec/models/project_repository_storage_move_spec.rb
index 88535f6dd6e..eb193a44680 100644
--- a/spec/models/project_repository_storage_move_spec.rb
+++ b/spec/models/project_repository_storage_move_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe ProjectRepositoryStorageMove, type: :model do
let(:container) { project }
let(:repository_storage_factory_key) { :project_repository_storage_move }
let(:error_key) { :project }
- let(:repository_storage_worker) { ProjectUpdateRepositoryStorageWorker }
+ let(:repository_storage_worker) { Projects::UpdateRepositoryStorageWorker }
end
describe 'state transitions' do
diff --git a/spec/models/project_services/discord_service_spec.rb b/spec/models/project_services/discord_service_spec.rb
index d4bd08ddeb6..ffe0a36dcdc 100644
--- a/spec/models/project_services/discord_service_spec.rb
+++ b/spec/models/project_services/discord_service_spec.rb
@@ -6,7 +6,16 @@ RSpec.describe DiscordService do
it_behaves_like "chat service", "Discord notifications" do
let(:client) { Discordrb::Webhooks::Client }
let(:client_arguments) { { url: webhook_url } }
- let(:content_key) { :content }
+ let(:payload) do
+ {
+ embeds: [
+ include(
+ author: include(name: be_present),
+ description: be_present
+ )
+ ]
+ }
+ end
end
describe '#execute' do
@@ -58,5 +67,16 @@ RSpec.describe DiscordService do
expect { subject.execute(sample_data) }.to raise_error(ArgumentError, /is blocked/)
end
end
+
+ context 'when the Discord request fails' do
+ before do
+ WebMock.stub_request(:post, webhook_url).to_return(status: 400)
+ end
+
+ it 'logs an error and returns false' do
+ expect(subject).to receive(:log_error).with('400 Bad Request')
+ expect(subject.execute(sample_data)).to be(false)
+ end
+ end
end
end
diff --git a/spec/models/project_services/hangouts_chat_service_spec.rb b/spec/models/project_services/hangouts_chat_service_spec.rb
index 042e32439d1..9d3bd457fc8 100644
--- a/spec/models/project_services/hangouts_chat_service_spec.rb
+++ b/spec/models/project_services/hangouts_chat_service_spec.rb
@@ -6,6 +6,10 @@ RSpec.describe HangoutsChatService do
it_behaves_like "chat service", "Hangouts Chat" do
let(:client) { HangoutsChat::Sender }
let(:client_arguments) { webhook_url }
- let(:content_key) { :text }
+ let(:payload) do
+ {
+ text: be_present
+ }
+ end
end
end
diff --git a/spec/models/project_services/jira_service_spec.rb b/spec/models/project_services/jira_service_spec.rb
index 78bd0e91208..3fc39fd3266 100644
--- a/spec/models/project_services/jira_service_spec.rb
+++ b/spec/models/project_services/jira_service_spec.rb
@@ -474,21 +474,32 @@ RSpec.describe JiraService do
let(:custom_base_url) { 'http://custom_url' }
shared_examples 'close_issue' do
+ let(:issue_key) { 'JIRA-123' }
+ let(:issue_url) { "#{url}/rest/api/2/issue/#{issue_key}" }
+ let(:transitions_url) { "#{issue_url}/transitions" }
+ let(:comment_url) { "#{issue_url}/comment" }
+ let(:remote_link_url) { "#{issue_url}/remotelink" }
+ let(:transitions) { nil }
+
+ let(:issue_fields) do
+ {
+ id: issue_key,
+ self: issue_url,
+ transitions: transitions
+ }
+ end
+
+ subject(:close_issue) do
+ jira_service.close_issue(resource, ExternalIssue.new(issue_key, project))
+ end
+
before do
- @jira_service = described_class.new
- allow(@jira_service).to receive_messages(
- project_id: project.id,
- project: project,
- url: 'http://jira.example.com',
- username: 'gitlab_jira_username',
- password: 'gitlab_jira_password',
- jira_issue_transition_id: '999'
- )
+ allow(jira_service).to receive_messages(jira_issue_transition_id: '999')
# These stubs are needed to test JiraService#close_issue.
# We close the issue then do another request to API to check if it got closed.
# Here is stubbed the API return with a closed and an opened issues.
- open_issue = JIRA::Resource::Issue.new(@jira_service.client, attrs: { 'id' => 'JIRA-123' })
+ open_issue = JIRA::Resource::Issue.new(jira_service.client, attrs: issue_fields.deep_stringify_keys)
closed_issue = open_issue.dup
allow(open_issue).to receive(:resolution).and_return(false)
allow(closed_issue).to receive(:resolution).and_return(true)
@@ -497,29 +508,22 @@ RSpec.describe JiraService do
allow_any_instance_of(JIRA::Resource::Issue).to receive(:key).and_return('JIRA-123')
allow(JIRA::Resource::Remotelink).to receive(:all).and_return([])
- @jira_service.save!
-
- project_issues_url = 'http://jira.example.com/rest/api/2/issue/JIRA-123'
- @transitions_url = 'http://jira.example.com/rest/api/2/issue/JIRA-123/transitions'
- @comment_url = 'http://jira.example.com/rest/api/2/issue/JIRA-123/comment'
- @remote_link_url = 'http://jira.example.com/rest/api/2/issue/JIRA-123/remotelink'
-
- WebMock.stub_request(:get, project_issues_url).with(basic_auth: %w(gitlab_jira_username gitlab_jira_password))
- WebMock.stub_request(:post, @transitions_url).with(basic_auth: %w(gitlab_jira_username gitlab_jira_password))
- WebMock.stub_request(:post, @comment_url).with(basic_auth: %w(gitlab_jira_username gitlab_jira_password))
- WebMock.stub_request(:post, @remote_link_url).with(basic_auth: %w(gitlab_jira_username gitlab_jira_password))
+ WebMock.stub_request(:get, issue_url).with(basic_auth: %w(jira-username jira-password))
+ WebMock.stub_request(:post, transitions_url).with(basic_auth: %w(jira-username jira-password))
+ WebMock.stub_request(:post, comment_url).with(basic_auth: %w(jira-username jira-password))
+ WebMock.stub_request(:post, remote_link_url).with(basic_auth: %w(jira-username jira-password))
end
let(:external_issue) { ExternalIssue.new('JIRA-123', project) }
def close_issue
- @jira_service.close_issue(resource, external_issue, current_user)
+ jira_service.close_issue(resource, external_issue, current_user)
end
it 'calls Jira API' do
close_issue
- expect(WebMock).to have_requested(:post, @comment_url).with(
+ expect(WebMock).to have_requested(:post, comment_url).with(
body: /Issue solved with/
).once
end
@@ -546,9 +550,9 @@ RSpec.describe JiraService do
favicon_path = "http://localhost/assets/#{find_asset('favicon.png').digest_path}"
# Creates comment
- expect(WebMock).to have_requested(:post, @comment_url)
+ expect(WebMock).to have_requested(:post, comment_url)
# Creates Remote Link in Jira issue fields
- expect(WebMock).to have_requested(:post, @remote_link_url).with(
+ expect(WebMock).to have_requested(:post, remote_link_url).with(
body: hash_including(
GlobalID: 'GitLab',
relationship: 'mentioned on',
@@ -564,11 +568,11 @@ RSpec.describe JiraService do
context 'when "comment_on_event_enabled" is set to false' do
it 'creates Remote Link reference but does not create comment' do
- allow(@jira_service).to receive_messages(comment_on_event_enabled: false)
+ allow(jira_service).to receive_messages(comment_on_event_enabled: false)
close_issue
- expect(WebMock).not_to have_requested(:post, @comment_url)
- expect(WebMock).to have_requested(:post, @remote_link_url)
+ expect(WebMock).not_to have_requested(:post, comment_url)
+ expect(WebMock).to have_requested(:post, remote_link_url)
end
end
@@ -589,7 +593,7 @@ RSpec.describe JiraService do
close_issue
- expect(WebMock).not_to have_requested(:post, @comment_url)
+ expect(WebMock).not_to have_requested(:post, comment_url)
end
end
@@ -598,8 +602,8 @@ RSpec.describe JiraService do
close_issue
- expect(WebMock).not_to have_requested(:post, @comment_url)
- expect(WebMock).not_to have_requested(:post, @remote_link_url)
+ expect(WebMock).not_to have_requested(:post, comment_url)
+ expect(WebMock).not_to have_requested(:post, remote_link_url)
end
it 'does not send comment or remote links to issues with unknown resolution' do
@@ -607,8 +611,8 @@ RSpec.describe JiraService do
close_issue
- expect(WebMock).not_to have_requested(:post, @comment_url)
- expect(WebMock).not_to have_requested(:post, @remote_link_url)
+ expect(WebMock).not_to have_requested(:post, comment_url)
+ expect(WebMock).not_to have_requested(:post, remote_link_url)
end
it 'references the GitLab commit' do
@@ -616,7 +620,7 @@ RSpec.describe JiraService do
close_issue
- expect(WebMock).to have_requested(:post, @comment_url).with(
+ expect(WebMock).to have_requested(:post, comment_url).with(
body: %r{#{custom_base_url}/#{project.full_path}/-/commit/#{commit_id}}
).once
end
@@ -631,18 +635,18 @@ RSpec.describe JiraService do
close_issue
- expect(WebMock).to have_requested(:post, @comment_url).with(
+ expect(WebMock).to have_requested(:post, comment_url).with(
body: %r{#{Gitlab.config.gitlab.url}/#{project.full_path}/-/commit/#{commit_id}}
).once
end
it 'logs exception when transition id is not valid' do
- allow(@jira_service).to receive(:log_error)
- WebMock.stub_request(:post, @transitions_url).with(basic_auth: %w(gitlab_jira_username gitlab_jira_password)).and_raise("Bad Request")
+ allow(jira_service).to receive(:log_error)
+ WebMock.stub_request(:post, transitions_url).with(basic_auth: %w(jira-username jira-password)).and_raise("Bad Request")
close_issue
- expect(@jira_service).to have_received(:log_error).with(
+ expect(jira_service).to have_received(:log_error).with(
"Issue transition failed",
error: hash_including(
exception_class: 'StandardError',
@@ -655,34 +659,64 @@ RSpec.describe JiraService do
it 'calls the api with jira_issue_transition_id' do
close_issue
- expect(WebMock).to have_requested(:post, @transitions_url).with(
- body: /999/
+ expect(WebMock).to have_requested(:post, transitions_url).with(
+ body: /"id":"999"/
).once
end
- context 'when have multiple transition ids' do
- it 'calls the api with transition ids separated by comma' do
- allow(@jira_service).to receive_messages(jira_issue_transition_id: '1,2,3')
+ context 'when using multiple transition ids' do
+ before do
+ allow(jira_service).to receive_messages(jira_issue_transition_id: '1,2,3')
+ end
+ it 'calls the api with transition ids separated by comma' do
close_issue
1.upto(3) do |transition_id|
- expect(WebMock).to have_requested(:post, @transitions_url).with(
- body: /#{transition_id}/
+ expect(WebMock).to have_requested(:post, transitions_url).with(
+ body: /"id":"#{transition_id}"/
).once
end
+
+ expect(WebMock).to have_requested(:post, comment_url)
end
it 'calls the api with transition ids separated by semicolon' do
- allow(@jira_service).to receive_messages(jira_issue_transition_id: '1;2;3')
+ allow(jira_service).to receive_messages(jira_issue_transition_id: '1;2;3')
close_issue
1.upto(3) do |transition_id|
- expect(WebMock).to have_requested(:post, @transitions_url).with(
- body: /#{transition_id}/
+ expect(WebMock).to have_requested(:post, transitions_url).with(
+ body: /"id":"#{transition_id}"/
).once
end
+
+ expect(WebMock).to have_requested(:post, comment_url)
+ end
+
+ context 'when a transition fails' do
+ before do
+ WebMock.stub_request(:post, transitions_url).with(basic_auth: %w(jira-username jira-password)).to_return do |request|
+ { status: request.body.include?('"id":"2"') ? 500 : 200 }
+ end
+ end
+
+ it 'stops the sequence' do
+ close_issue
+
+ 1.upto(2) do |transition_id|
+ expect(WebMock).to have_requested(:post, transitions_url).with(
+ body: /"id":"#{transition_id}"/
+ )
+ end
+
+ expect(WebMock).not_to have_requested(:post, transitions_url).with(
+ body: /"id":"3"/
+ )
+
+ expect(WebMock).not_to have_requested(:post, comment_url)
+ end
end
end
end
diff --git a/spec/models/project_services/prometheus_service_spec.rb b/spec/models/project_services/prometheus_service_spec.rb
index ea63406e615..366c3f68e1d 100644
--- a/spec/models/project_services/prometheus_service_spec.rb
+++ b/spec/models/project_services/prometheus_service_spec.rb
@@ -511,20 +511,23 @@ RSpec.describe PrometheusService, :use_clean_rails_memory_store_caching, :snowpl
type: 'checkbox',
name: 'manual_configuration',
title: s_('PrometheusService|Active'),
+ help: s_('PrometheusService|Select this checkbox to override the auto configuration settings with your own settings.'),
required: true
},
{
type: 'text',
name: 'api_url',
title: 'API URL',
- placeholder: s_('PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/'),
+ placeholder: s_('PrometheusService|https://prometheus.example.com/'),
+ help: s_('PrometheusService|The Prometheus API base URL.'),
required: true
},
{
type: 'text',
name: 'google_iap_audience_client_id',
title: 'Google IAP Audience Client ID',
- placeholder: s_('PrometheusService|Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)'),
+ placeholder: s_('PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com'),
+ help: s_('PrometheusService|PrometheusService|The ID of the IAP-secured resource.'),
autocomplete: 'off',
required: false
},
@@ -532,7 +535,8 @@ RSpec.describe PrometheusService, :use_clean_rails_memory_store_caching, :snowpl
type: 'textarea',
name: 'google_iap_service_account_json',
title: 'Google IAP Service Account JSON',
- placeholder: s_('PrometheusService|Contents of the credentials.json file of your service account, like: { "type": "service_account", "project_id": ... }'),
+ placeholder: s_('PrometheusService|{ "type": "service_account", "project_id": ... }'),
+ help: s_('PrometheusService|The contents of the credentials.json file of your service account.'),
required: false
}
]
diff --git a/spec/models/project_services/slack_service_spec.rb b/spec/models/project_services/slack_service_spec.rb
index 0b35b9e7b30..aa5d92e5c61 100644
--- a/spec/models/project_services/slack_service_spec.rb
+++ b/spec/models/project_services/slack_service_spec.rb
@@ -4,4 +4,116 @@ require 'spec_helper'
RSpec.describe SlackService do
it_behaves_like "slack or mattermost notifications", 'Slack'
+
+ describe '#execute' do
+ before do
+ stub_request(:post, "https://slack.service.url/")
+ end
+
+ let_it_be(:slack_service) { create(:slack_service, 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
+ end
+ end
+
+ context 'hook data includes a user object' do
+ let_it_be(:user) { create_default(:user) }
+ let_it_be(:project) { create_default(:project, :repository, :wiki_repo) }
+
+ shared_examples 'increases the usage data counter' do |event_name|
+ it 'increases the usage data counter' do
+ expect(Gitlab::UsageDataCounters::HLLRedisCounter).to receive(:track_event).with(event_name, values: user.id).and_call_original
+
+ slack_service.execute(data)
+ end
+ end
+
+ context 'event is not supported for usage log' do
+ let_it_be(:pipeline) { create(:ci_pipeline) }
+ let(:data) { Gitlab::DataBuilder::Pipeline.build(pipeline) }
+
+ it 'does not increase the usage data counter' do
+ expect(Gitlab::UsageDataCounters::HLLRedisCounter).not_to receive(:track_event).with('i_ecosystem_slack_service_pipeline_notification', values: user.id)
+
+ slack_service.execute(data)
+ end
+ end
+
+ context 'issue notification' do
+ let_it_be(:issue) { create(:issue) }
+ let(:data) { issue.to_hook_data(user) }
+
+ it_behaves_like 'increases the usage data counter', 'i_ecosystem_slack_service_issue_notification'
+ end
+
+ context 'push notification' do
+ let(:data) { Gitlab::DataBuilder::Push.build_sample(project, user) }
+
+ it_behaves_like 'increases the usage data counter', 'i_ecosystem_slack_service_push_notification'
+ end
+
+ context 'deployment notification' do
+ let_it_be(:deployment) { create(:deployment, user: user) }
+ let(:data) { Gitlab::DataBuilder::Deployment.build(deployment) }
+
+ it_behaves_like 'increases the usage data counter', 'i_ecosystem_slack_service_deployment_notification'
+ end
+
+ context 'wiki_page notification' do
+ let_it_be(:wiki_page) { create(:wiki_page, wiki: project.wiki, message: 'user created page: Awesome wiki_page') }
+ let(:data) { Gitlab::DataBuilder::WikiPage.build(wiki_page, user, 'create') }
+
+ it_behaves_like 'increases the usage data counter', 'i_ecosystem_slack_service_wiki_page_notification'
+ end
+
+ context 'merge_request notification' do
+ let_it_be(:merge_request) { create(:merge_request) }
+ let(:data) { merge_request.to_hook_data(user) }
+
+ it_behaves_like 'increases the usage data counter', 'i_ecosystem_slack_service_merge_request_notification'
+ end
+
+ context 'note notification' do
+ let_it_be(:issue_note) { create(:note_on_issue, note: 'issue note') }
+ let(:data) { Gitlab::DataBuilder::Note.build(issue_note, user) }
+
+ it_behaves_like 'increases the usage data counter', 'i_ecosystem_slack_service_note_notification'
+ end
+
+ context 'tag_push notification' do
+ let(:oldrev) { Gitlab::Git::BLANK_SHA }
+ let(:newrev) { '8a2a6eb295bb170b34c24c76c49ed0e9b2eaf34b' } # gitlab-test: git rev-parse refs/tags/v1.1.0
+ let(:ref) { 'refs/tags/v1.1.0' }
+ let(:data) { Git::TagHooksService.new(project, user, change: { oldrev: oldrev, newrev: newrev, ref: ref }).send(:push_data) }
+
+ it_behaves_like 'increases the usage data counter', 'i_ecosystem_slack_service_tag_push_notification'
+ end
+
+ context 'confidential note notification' do
+ let_it_be(:confidential_issue_note) { create(:note_on_issue, note: 'issue note', confidential: true) }
+ let(:data) { Gitlab::DataBuilder::Note.build(confidential_issue_note, user) }
+
+ it_behaves_like 'increases the usage data counter', 'i_ecosystem_slack_service_confidential_note_notification'
+ end
+
+ context 'confidential issue notification' do
+ let_it_be(:issue) { create(:issue, confidential: true) }
+ let(:data) { issue.to_hook_data(user) }
+
+ it_behaves_like 'increases the usage data counter', 'i_ecosystem_slack_service_confidential_issue_notification'
+ end
+ end
+
+ context 'hook data does not include a user' do
+ let(:data) { Gitlab::DataBuilder::Pipeline.build(create(:ci_pipeline)) }
+
+ it 'does not increase the usage data counter' do
+ expect(Gitlab::UsageDataCounters::HLLRedisCounter).not_to receive(:track_event)
+
+ slack_service.execute(data)
+ end
+ end
+ end
end
diff --git a/spec/models/project_services/unify_circuit_service_spec.rb b/spec/models/project_services/unify_circuit_service_spec.rb
index 73702aa8471..0c749322e07 100644
--- a/spec/models/project_services/unify_circuit_service_spec.rb
+++ b/spec/models/project_services/unify_circuit_service_spec.rb
@@ -5,6 +5,12 @@ require "spec_helper"
RSpec.describe UnifyCircuitService do
it_behaves_like "chat service", "Unify Circuit" do
let(:client_arguments) { webhook_url }
- let(:content_key) { :subject }
+ let(:payload) do
+ {
+ subject: project.full_name,
+ text: be_present,
+ markdown: true
+ }
+ end
end
end
diff --git a/spec/models/project_services/webex_teams_service_spec.rb b/spec/models/project_services/webex_teams_service_spec.rb
index bd73d0c93b8..ed63f5bc48c 100644
--- a/spec/models/project_services/webex_teams_service_spec.rb
+++ b/spec/models/project_services/webex_teams_service_spec.rb
@@ -5,6 +5,10 @@ require "spec_helper"
RSpec.describe WebexTeamsService do
it_behaves_like "chat service", "Webex Teams" do
let(:client_arguments) { webhook_url }
- let(:content_key) { :markdown }
+ let(:payload) do
+ {
+ markdown: be_present
+ }
+ end
end
end
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
index fd7975bf65d..b4010ba6e31 100644
--- a/spec/models/project_spec.rb
+++ b/spec/models/project_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe Project, factory_default: :keep do
include ExternalAuthorizationServiceHelpers
using RSpec::Parameterized::TableSyntax
- let_it_be(:namespace) { create_default(:namespace) }
+ let_it_be(:namespace) { create_default(:namespace).freeze }
it_behaves_like 'having unique enum values'
@@ -145,7 +145,7 @@ RSpec.describe Project, factory_default: :keep do
end
it_behaves_like 'model with wiki' do
- let_it_be(:container) { create(:project, :wiki_repo) }
+ let_it_be(:container) { create(:project, :wiki_repo, namespace: create(:group)) }
let(:container_without_wiki) { create(:project) }
end
@@ -1599,7 +1599,7 @@ RSpec.describe Project, factory_default: :keep do
end
end
- describe '#any_runners?' do
+ describe '#any_active_runners?' do
context 'shared runners' do
let(:project) { create(:project, shared_runners_enabled: shared_runners_enabled) }
let(:specific_runner) { create(:ci_runner, :project, projects: [project]) }
@@ -1609,31 +1609,31 @@ RSpec.describe Project, factory_default: :keep do
let(:shared_runners_enabled) { false }
it 'has no runners available' do
- expect(project.any_runners?).to be_falsey
+ expect(project.any_active_runners?).to be_falsey
end
it 'has a specific runner' do
specific_runner
- expect(project.any_runners?).to be_truthy
+ expect(project.any_active_runners?).to be_truthy
end
it 'has a shared runner, but they are prohibited to use' do
shared_runner
- expect(project.any_runners?).to be_falsey
+ expect(project.any_active_runners?).to be_falsey
end
it 'checks the presence of specific runner' do
specific_runner
- expect(project.any_runners? { |runner| runner == specific_runner }).to be_truthy
+ expect(project.any_active_runners? { |runner| runner == specific_runner }).to be_truthy
end
it 'returns false if match cannot be found' do
specific_runner
- expect(project.any_runners? { false }).to be_falsey
+ expect(project.any_active_runners? { false }).to be_falsey
end
end
@@ -1643,19 +1643,19 @@ RSpec.describe Project, factory_default: :keep do
it 'has a shared runner' do
shared_runner
- expect(project.any_runners?).to be_truthy
+ expect(project.any_active_runners?).to be_truthy
end
it 'checks the presence of shared runner' do
shared_runner
- expect(project.any_runners? { |runner| runner == shared_runner }).to be_truthy
+ expect(project.any_active_runners? { |runner| runner == shared_runner }).to be_truthy
end
it 'returns false if match cannot be found' do
shared_runner
- expect(project.any_runners? { false }).to be_falsey
+ expect(project.any_active_runners? { false }).to be_falsey
end
end
end
@@ -1669,13 +1669,13 @@ RSpec.describe Project, factory_default: :keep do
let(:group_runners_enabled) { false }
it 'has no runners available' do
- expect(project.any_runners?).to be_falsey
+ expect(project.any_active_runners?).to be_falsey
end
it 'has a group runner, but they are prohibited to use' do
group_runner
- expect(project.any_runners?).to be_falsey
+ expect(project.any_active_runners?).to be_falsey
end
end
@@ -1685,19 +1685,19 @@ RSpec.describe Project, factory_default: :keep do
it 'has a group runner' do
group_runner
- expect(project.any_runners?).to be_truthy
+ expect(project.any_active_runners?).to be_truthy
end
it 'checks the presence of group runner' do
group_runner
- expect(project.any_runners? { |runner| runner == group_runner }).to be_truthy
+ expect(project.any_active_runners? { |runner| runner == group_runner }).to be_truthy
end
it 'returns false if match cannot be found' do
group_runner
- expect(project.any_runners? { false }).to be_falsey
+ expect(project.any_active_runners? { false }).to be_falsey
end
end
end
@@ -1799,7 +1799,8 @@ RSpec.describe Project, factory_default: :keep do
describe '#default_branch_protected?' do
using RSpec::Parameterized::TableSyntax
- let_it_be(:project) { create(:project) }
+ let_it_be(:namespace) { create(:namespace) }
+ let_it_be(:project) { create(:project, namespace: namespace) }
subject { project.default_branch_protected? }
@@ -2802,7 +2803,8 @@ RSpec.describe Project, factory_default: :keep do
end
describe '#emails_disabled?' do
- let(:project) { build(:project, emails_disabled: false) }
+ let_it_be(:namespace) { create(:namespace) }
+ let(:project) { build(:project, namespace: namespace, emails_disabled: false) }
context 'emails disabled in group' do
it 'returns true' do
@@ -2830,7 +2832,8 @@ RSpec.describe Project, factory_default: :keep do
end
describe '#lfs_enabled?' do
- let(:project) { build(:project) }
+ let(:namespace) { create(:namespace) }
+ let(:project) { build(:project, namespace: namespace) }
shared_examples 'project overrides group' do
it 'returns true when enabled in project' do
@@ -4463,7 +4466,11 @@ RSpec.describe Project, factory_default: :keep do
subject { project.predefined_project_variables.to_runner_variables }
specify do
- expect(subject).to include({ key: 'CI_PROJECT_CONFIG_PATH', value: Ci::Pipeline::DEFAULT_CONFIG_PATH, public: true, masked: false })
+ expect(subject).to include
+ [
+ { key: 'CI_PROJECT_CONFIG_PATH', value: Ci::Pipeline::DEFAULT_CONFIG_PATH, public: true, masked: false },
+ { key: 'CI_CONFIG_PATH', value: Ci::Pipeline::DEFAULT_CONFIG_PATH, public: true, masked: false }
+ ]
end
context 'when ci config path is overridden' do
@@ -4471,7 +4478,13 @@ RSpec.describe Project, factory_default: :keep do
project.update!(ci_config_path: 'random.yml')
end
- it { expect(subject).to include({ key: 'CI_PROJECT_CONFIG_PATH', value: 'random.yml', public: true, masked: false }) }
+ it do
+ expect(subject).to include
+ [
+ { key: 'CI_PROJECT_CONFIG_PATH', value: 'random.yml', public: true, masked: false },
+ { key: 'CI_CONFIG_PATH', value: 'random.yml', public: true, masked: false }
+ ]
+ end
end
end
@@ -4877,7 +4890,8 @@ RSpec.describe Project, factory_default: :keep do
end
context 'branch protection' do
- let(:project) { create(:project, :repository) }
+ let_it_be(:namespace) { create(:namespace) }
+ let(:project) { create(:project, :repository, namespace: namespace) }
before do
create(:import_state, :started, project: project)
diff --git a/spec/models/projects/repository_storage_move_spec.rb b/spec/models/projects/repository_storage_move_spec.rb
new file mode 100644
index 00000000000..ab0ad81f77a
--- /dev/null
+++ b/spec/models/projects/repository_storage_move_spec.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::RepositoryStorageMove, type: :model do
+ let_it_be_with_refind(:project) { create(:project) }
+
+ it_behaves_like 'handles repository moves' do
+ let(:container) { project }
+ let(:repository_storage_factory_key) { :project_repository_storage_move }
+ let(:error_key) { :project }
+ let(:repository_storage_worker) { Projects::UpdateRepositoryStorageWorker }
+ end
+
+ describe 'state transitions' do
+ let(:storage) { 'test_second_storage' }
+
+ before do
+ stub_storage_settings(storage => { 'path' => 'tmp/tests/extra_storage' })
+ end
+
+ context 'when started' do
+ subject(:storage_move) { create(:project_repository_storage_move, :started, container: project, destination_storage_name: storage) }
+
+ context 'and transits to replicated' do
+ it 'sets the repository storage and marks the container as writable' do
+ storage_move.finish_replication!
+
+ expect(project.repository_storage).to eq(storage)
+ expect(project).not_to be_repository_read_only
+ end
+ end
+ end
+ end
+end
diff --git a/spec/models/prometheus_alert_event_spec.rb b/spec/models/prometheus_alert_event_spec.rb
index 913ca7db0be..6bff549bc4b 100644
--- a/spec/models/prometheus_alert_event_spec.rb
+++ b/spec/models/prometheus_alert_event_spec.rb
@@ -52,7 +52,7 @@ RSpec.describe PrometheusAlertEvent do
let(:started_at) { Time.current }
context 'when status is none' do
- subject { build(:prometheus_alert_event, :none) }
+ subject { build(:prometheus_alert_event, status: nil, started_at: nil) }
it 'fires an event' do
result = subject.fire(started_at)
diff --git a/spec/models/protected_branch_spec.rb b/spec/models/protected_branch_spec.rb
index a89f8778780..a173ab48f17 100644
--- a/spec/models/protected_branch_spec.rb
+++ b/spec/models/protected_branch_spec.rb
@@ -207,6 +207,28 @@ RSpec.describe ProtectedBranch do
end
end
+ describe "#allow_force_push?" do
+ context "when the attr allow_force_push is true" do
+ let(:subject_branch) { create(:protected_branch, allow_force_push: true, name: "foo") }
+
+ it "returns true" do
+ project = subject_branch.project
+
+ expect(described_class.allow_force_push?(project, "foo")).to eq(true)
+ end
+ end
+
+ context "when the attr allow_force_push is false" do
+ let(:subject_branch) { create(:protected_branch, allow_force_push: false, name: "foo") }
+
+ it "returns false" do
+ project = subject_branch.project
+
+ expect(described_class.allow_force_push?(project, "foo")).to eq(false)
+ end
+ end
+ end
+
describe '#any_protected?' do
context 'existing project' do
let(:project) { create(:project, :repository) }
diff --git a/spec/models/snippet_repository_spec.rb b/spec/models/snippet_repository_spec.rb
index cdbc1feefce..11196f06529 100644
--- a/spec/models/snippet_repository_spec.rb
+++ b/spec/models/snippet_repository_spec.rb
@@ -286,6 +286,7 @@ RSpec.describe SnippetRepository do
context 'with git errors' do
it_behaves_like 'snippet repository with git errors', 'invalid://path/here', described_class::InvalidPathError
+ it_behaves_like 'snippet repository with git errors', '.git/hooks/pre-commit', described_class::InvalidPathError
it_behaves_like 'snippet repository with git errors', '../../path/traversal/here', described_class::InvalidPathError
it_behaves_like 'snippet repository with git errors', 'README', described_class::CommitError
diff --git a/spec/models/snippet_repository_storage_move_spec.rb b/spec/models/snippet_repository_storage_move_spec.rb
index 357951f8859..f5ad837fb36 100644
--- a/spec/models/snippet_repository_storage_move_spec.rb
+++ b/spec/models/snippet_repository_storage_move_spec.rb
@@ -8,6 +8,6 @@ RSpec.describe SnippetRepositoryStorageMove, type: :model do
let(:repository_storage_factory_key) { :snippet_repository_storage_move }
let(:error_key) { :snippet }
- let(:repository_storage_worker) { SnippetUpdateRepositoryStorageWorker }
+ let(:repository_storage_worker) { Snippets::UpdateRepositoryStorageWorker }
end
end
diff --git a/spec/models/snippet_spec.rb b/spec/models/snippet_spec.rb
index 623767d19e0..09f9cf8e222 100644
--- a/spec/models/snippet_spec.rb
+++ b/spec/models/snippet_spec.rb
@@ -21,7 +21,7 @@ RSpec.describe Snippet do
it { is_expected.to have_many(:user_mentions).class_name("SnippetUserMention") }
it { is_expected.to have_one(:snippet_repository) }
it { is_expected.to have_one(:statistics).class_name('SnippetStatistics').dependent(:destroy) }
- it { is_expected.to have_many(:repository_storage_moves).class_name('SnippetRepositoryStorageMove').inverse_of(:container) }
+ it { is_expected.to have_many(:repository_storage_moves).class_name('Snippets::RepositoryStorageMove').inverse_of(:container) }
end
describe 'validation' do
@@ -496,6 +496,16 @@ RSpec.describe Snippet do
it 'returns array of blobs' do
expect(snippet.blobs).to all(be_a(Blob))
end
+
+ context 'when file does not exist' do
+ it 'removes nil values from the blobs array' do
+ allow(snippet).to receive(:list_files).and_return(%w(LICENSE non_existent_snippet_file))
+
+ blobs = snippet.blobs
+ expect(blobs.count).to eq 1
+ expect(blobs.first.name).to eq 'LICENSE'
+ end
+ end
end
end
diff --git a/spec/models/snippets/repository_storage_move_spec.rb b/spec/models/snippets/repository_storage_move_spec.rb
new file mode 100644
index 00000000000..ed518faf6ff
--- /dev/null
+++ b/spec/models/snippets/repository_storage_move_spec.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Snippets::RepositoryStorageMove, type: :model do
+ it_behaves_like 'handles repository moves' do
+ let_it_be_with_refind(:container) { create(:snippet) }
+
+ let(:repository_storage_factory_key) { :snippet_repository_storage_move }
+ let(:error_key) { :snippet }
+ let(:repository_storage_worker) { Snippets::UpdateRepositoryStorageWorker }
+ end
+end
diff --git a/spec/models/todo_spec.rb b/spec/models/todo_spec.rb
index a9c4c6680cd..855b1b0f3f7 100644
--- a/spec/models/todo_spec.rb
+++ b/spec/models/todo_spec.rb
@@ -363,23 +363,6 @@ RSpec.describe Todo do
end
end
- describe '.for_ids' do
- it 'returns the expected todos' do
- todo1 = create(:todo)
- todo2 = create(:todo)
- todo3 = create(:todo)
- create(:todo)
-
- expect(described_class.for_ids([todo2.id, todo1.id, todo3.id])).to contain_exactly(todo1, todo2, todo3)
- end
-
- it 'returns an empty collection when no ids are given' do
- create(:todo)
-
- expect(described_class.for_ids([])).to be_empty
- end
- end
-
describe '.for_user' do
it 'returns the expected todos' do
user1 = create(:user)
diff --git a/spec/models/upload_spec.rb b/spec/models/upload_spec.rb
index 18388b4cd83..6bac5e31435 100644
--- a/spec/models/upload_spec.rb
+++ b/spec/models/upload_spec.rb
@@ -221,7 +221,7 @@ RSpec.describe Upload do
it 'does not send a message to Sentry' do
upload = described_class.new(path: "#{__FILE__}-nope", store: ObjectStorage::Store::LOCAL)
- expect(Raven).not_to receive(:capture_message)
+ expect(Gitlab::ErrorTracking).not_to receive(:track_exception)
upload.exist?
end
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index 860c015e166..5f2842c9d16 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -41,6 +41,9 @@ RSpec.describe User do
it { is_expected.to delegate_method(:show_whitespace_in_diffs).to(:user_preference) }
it { is_expected.to delegate_method(:show_whitespace_in_diffs=).to(:user_preference).with_arguments(:args) }
+ it { is_expected.to delegate_method(:view_diffs_file_by_file).to(:user_preference) }
+ it { is_expected.to delegate_method(:view_diffs_file_by_file=).to(:user_preference).with_arguments(:args) }
+
it { is_expected.to delegate_method(:tab_width).to(:user_preference) }
it { is_expected.to delegate_method(:tab_width=).to(:user_preference).with_arguments(:args) }
@@ -59,6 +62,9 @@ RSpec.describe User do
it { is_expected.to delegate_method(:experience_level).to(:user_preference) }
it { is_expected.to delegate_method(:experience_level=).to(:user_preference).with_arguments(:args) }
+ 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(:job_title).to(:user_detail).allow_nil }
it { is_expected.to delegate_method(:job_title=).to(:user_detail).with_arguments(:args).allow_nil }
@@ -101,6 +107,7 @@ RSpec.describe User do
it { is_expected.to have_many(:reviews).inverse_of(:author) }
it { is_expected.to have_many(:merge_request_assignees).inverse_of(:assignee) }
it { is_expected.to have_many(:merge_request_reviewers).inverse_of(:reviewer) }
+ it { is_expected.to have_many(:created_custom_emoji).inverse_of(:creator) }
describe "#user_detail" do
it 'does not persist `user_detail` by default' do
@@ -380,11 +387,11 @@ RSpec.describe User do
it { is_expected.not_to allow_value(-1).for(:projects_limit) }
it { is_expected.not_to allow_value(Gitlab::Database::MAX_INT_VALUE + 1).for(:projects_limit) }
- it_behaves_like 'an object with email-formated attributes', :email do
+ it_behaves_like 'an object with email-formatted attributes', :email do
subject { build(:user) }
end
- it_behaves_like 'an object with RFC3696 compliant email-formated attributes', :public_email, :notification_email do
+ it_behaves_like 'an object with RFC3696 compliant email-formatted attributes', :public_email, :notification_email do
subject { create(:user).tap { |user| user.emails << build(:email, email: email_value, confirmed_at: Time.current) } }
end
@@ -1050,7 +1057,7 @@ RSpec.describe User do
let(:user) { create(:user) }
let(:external_user) { create(:user, external: true) }
- it "sets other properties aswell" do
+ it "sets other properties as well" do
expect(external_user.can_create_team).to be_falsey
expect(external_user.can_create_group).to be_falsey
expect(external_user.projects_limit).to be 0
@@ -1061,7 +1068,7 @@ RSpec.describe User do
let(:user) { create(:user) }
let(:secondary) { create(:email, :confirmed, email: 'secondary@example.com', user: user) }
- it 'allows a verfied secondary email to be used as the primary without needing reconfirmation' do
+ it 'allows a verified secondary email to be used as the primary without needing reconfirmation' do
user.update!(email: secondary.email)
user.reload
expect(user.email).to eq secondary.email
@@ -1827,7 +1834,7 @@ RSpec.describe User do
end
describe '.instance_access_request_approvers_to_be_notified' do
- let_it_be(:admin_list) { create_list(:user, 12, :admin, :with_sign_ins) }
+ let_it_be(:admin_issue_board_list) { create_list(:user, 12, :admin, :with_sign_ins) }
it 'returns up to the ten most recently active instance admins' do
active_admins_in_recent_sign_in_desc_order = User.admins.active.order_recent_sign_in.limit(10)
@@ -2492,6 +2499,38 @@ RSpec.describe User do
end
end
+ describe "#clear_avatar_caches" do
+ let(:user) { create(:user) }
+
+ context "when :avatar_cache_for_email flag is enabled" do
+ before do
+ stub_feature_flags(avatar_cache_for_email: true)
+ end
+
+ it "clears the avatar cache when saving" do
+ allow(user).to receive(:avatar_changed?).and_return(true)
+
+ expect(Gitlab::AvatarCache).to receive(:delete_by_email).with(*user.verified_emails)
+
+ user.update(avatar: fixture_file_upload('spec/fixtures/dk.png'))
+ end
+ end
+
+ context "when :avatar_cache_for_email flag is disabled" do
+ before do
+ stub_feature_flags(avatar_cache_for_email: false)
+ end
+
+ it "doesn't attempt to clear the avatar cache" do
+ allow(user).to receive(:avatar_changed?).and_return(true)
+
+ expect(Gitlab::AvatarCache).not_to receive(:delete_by_email)
+
+ user.update(avatar: fixture_file_upload('spec/fixtures/dk.png'))
+ end
+ end
+ end
+
describe '#accept_pending_invitations!' do
let(:user) { create(:user, email: 'user@email.com') }
let!(:project_member_invite) { create(:project_member, :invited, invite_email: user.email) }
@@ -3227,23 +3266,8 @@ RSpec.describe User do
create(:group_group_link, shared_group: private_group, shared_with_group: other_group)
end
- context 'when shared_group_membership_auth is enabled' do
- before do
- stub_feature_flags(shared_group_membership_auth: user)
- end
-
- it { is_expected.to include shared_group }
- it { is_expected.not_to include other_group }
- end
-
- context 'when shared_group_membership_auth is disabled' do
- before do
- stub_feature_flags(shared_group_membership_auth: false)
- end
-
- it { is_expected.not_to include shared_group }
- it { is_expected.not_to include other_group }
- end
+ it { is_expected.to include shared_group }
+ it { is_expected.not_to include other_group }
end
end
@@ -3937,6 +3961,37 @@ RSpec.describe User do
end
end
+ describe '#can_admin_all_resources?', :request_store do
+ it 'returns false for regular user' do
+ user = build_stubbed(:user)
+
+ expect(user.can_admin_all_resources?).to be_falsy
+ end
+
+ context 'for admin user' do
+ include_context 'custom session'
+
+ let(:user) { build_stubbed(:user, :admin) }
+
+ context 'when admin mode is disabled' do
+ it 'returns false' do
+ expect(user.can_admin_all_resources?).to be_falsy
+ end
+ end
+
+ context 'when admin mode is enabled' do
+ before do
+ Gitlab::Auth::CurrentUserMode.new(user).request_admin_mode!
+ Gitlab::Auth::CurrentUserMode.new(user).enable_admin_mode!(password: user.password)
+ end
+
+ it 'returns true' do
+ expect(user.can_admin_all_resources?).to be_truthy
+ end
+ end
+ end
+ end
+
describe '.ghost' do
it "creates a ghost user if one isn't already present" do
ghost = described_class.ghost
@@ -5370,6 +5425,40 @@ RSpec.describe User do
end
end
+ describe 'can_trigger_notifications?' do
+ context 'when user is not confirmed' do
+ let_it_be(:user) { create(:user, :unconfirmed) }
+
+ it 'returns false' do
+ expect(user.can_trigger_notifications?).to be(false)
+ end
+ end
+
+ context 'when user is blocked' do
+ let_it_be(:user) { create(:user, :blocked) }
+
+ it 'returns false' do
+ expect(user.can_trigger_notifications?).to be(false)
+ end
+ end
+
+ context 'when user is a ghost' do
+ let_it_be(:user) { create(:user, :ghost) }
+
+ it 'returns false' do
+ expect(user.can_trigger_notifications?).to be(false)
+ end
+ end
+
+ context 'when user is confirmed and neither blocked or a ghost' do
+ let_it_be(:user) { create(:user) }
+
+ it 'returns true' do
+ expect(user.can_trigger_notifications?).to be(true)
+ end
+ end
+ end
+
context 'bot users' do
shared_examples 'bot users' do |bot_type|
it 'creates the user if it does not exist' do
@@ -5412,4 +5501,89 @@ RSpec.describe User do
it_behaves_like 'bot user avatars', :support_bot, 'support-bot.png'
it_behaves_like 'bot user avatars', :security_bot, 'security-bot.png'
end
+
+ describe '#confirmation_required_on_sign_in?' do
+ subject { user.confirmation_required_on_sign_in? }
+
+ context 'when user is confirmed' do
+ let(:user) { build_stubbed(:user) }
+
+ it 'is falsey' do
+ expect(user.confirmed?).to be_truthy
+ expect(subject).to be_falsey
+ end
+ end
+
+ context 'when user is not confirmed' do
+ let_it_be(:user) { build_stubbed(:user, :unconfirmed, confirmation_sent_at: Time.current) }
+
+ it 'is truthy when soft_email_confirmation feature is disabled' do
+ stub_feature_flags(soft_email_confirmation: false)
+ expect(subject).to be_truthy
+ end
+
+ context 'when soft_email_confirmation feature is enabled' do
+ before do
+ stub_feature_flags(soft_email_confirmation: true)
+ end
+
+ it 'is falsey when confirmation period is valid' do
+ expect(subject).to be_falsey
+ end
+
+ it 'is truthy when confirmation period is expired' do
+ travel_to(User.allow_unconfirmed_access_for.from_now + 1.day) do
+ expect(subject).to be_truthy
+ end
+ end
+
+ context 'when user has no confirmation email sent' do
+ let(:user) { build(:user, :unconfirmed, confirmation_sent_at: nil) }
+
+ it 'is truthy' do
+ expect(subject).to be_truthy
+ end
+ end
+ end
+ end
+ end
+
+ describe '#find_or_initialize_callout' do
+ subject(:find_or_initialize_callout) { user.find_or_initialize_callout(feature_name) }
+
+ let(:user) { create(:user) }
+ let(:feature_name) { UserCallout.feature_names.each_key.first }
+
+ context 'when callout exists' do
+ let!(:callout) { create(:user_callout, user: user, feature_name: feature_name) }
+
+ it 'returns existing callout' do
+ expect(find_or_initialize_callout).to eq(callout)
+ end
+ end
+
+ context 'when callout does not exist' do
+ context 'when feature name is valid' do
+ it 'initializes a new callout' do
+ expect(find_or_initialize_callout).to be_a_new(UserCallout)
+ end
+
+ it 'is valid' do
+ expect(find_or_initialize_callout).to be_valid
+ end
+ end
+
+ context 'when feature name is not valid' do
+ let(:feature_name) { 'notvalid' }
+
+ it 'initializes a new callout' do
+ expect(find_or_initialize_callout).to be_a_new(UserCallout)
+ end
+
+ it 'is not valid' do
+ expect(find_or_initialize_callout).not_to be_valid
+ end
+ end
+ end
+ end
end
diff --git a/spec/policies/base_policy_spec.rb b/spec/policies/base_policy_spec.rb
index 226660dc955..44ff909872d 100644
--- a/spec/policies/base_policy_spec.rb
+++ b/spec/policies/base_policy_spec.rb
@@ -73,10 +73,14 @@ RSpec.describe BasePolicy do
end
end
- describe 'full private access' do
+ describe 'full private access: read_all_resources' do
it_behaves_like 'admin only access', :read_all_resources
end
+ describe 'full private access: admin_all_resources' do
+ it_behaves_like 'admin only access', :admin_all_resources
+ end
+
describe 'change_repository_storage' do
it_behaves_like 'admin only access', :change_repository_storage
end
diff --git a/spec/policies/group_policy_spec.rb b/spec/policies/group_policy_spec.rb
index 7cded27e449..1794934dd20 100644
--- a/spec/policies/group_policy_spec.rb
+++ b/spec/policies/group_policy_spec.rb
@@ -193,16 +193,24 @@ RSpec.describe GroupPolicy do
let(:current_user) { admin }
specify do
- expect_allowed(*read_group_permissions)
- expect_allowed(*guest_permissions)
- expect_allowed(*reporter_permissions)
- expect_allowed(*developer_permissions)
- expect_allowed(*maintainer_permissions)
- expect_allowed(*owner_permissions)
+ expect_disallowed(*read_group_permissions)
+ expect_disallowed(*guest_permissions)
+ expect_disallowed(*reporter_permissions)
+ expect_disallowed(*developer_permissions)
+ expect_disallowed(*maintainer_permissions)
+ expect_disallowed(*owner_permissions)
end
context 'with admin mode', :enable_admin_mode do
- specify { expect_allowed(*admin_permissions) }
+ specify do
+ expect_allowed(*read_group_permissions)
+ expect_allowed(*guest_permissions)
+ expect_allowed(*reporter_permissions)
+ expect_allowed(*developer_permissions)
+ expect_allowed(*maintainer_permissions)
+ expect_allowed(*owner_permissions)
+ expect_allowed(*admin_permissions)
+ end
end
it_behaves_like 'deploy token does not get confused with user' do
@@ -773,7 +781,13 @@ RSpec.describe GroupPolicy do
context 'admin' do
let(:current_user) { admin }
- it { is_expected.to be_allowed(:create_jira_connect_subscription) }
+ context 'when admin mode is enabled', :enable_admin_mode do
+ it { is_expected.to be_allowed(:create_jira_connect_subscription) }
+ end
+
+ context 'when admin mode is disabled' do
+ it { is_expected.to be_disallowed(:create_jira_connect_subscription) }
+ end
end
context 'with owner' do
@@ -817,7 +831,13 @@ RSpec.describe GroupPolicy do
context 'admin' do
let(:current_user) { admin }
- it { is_expected.to be_allowed(:read_package) }
+ context 'when admin mode is enabled', :enable_admin_mode do
+ it { is_expected.to be_allowed(:read_package) }
+ end
+
+ context 'when admin mode is disabled' do
+ it { is_expected.to be_disallowed(:read_package) }
+ end
end
context 'with owner' do
diff --git a/spec/policies/project_policy_spec.rb b/spec/policies/project_policy_spec.rb
index 6ba3ab6aace..60c54f97312 100644
--- a/spec/policies/project_policy_spec.rb
+++ b/spec/policies/project_policy_spec.rb
@@ -64,8 +64,8 @@ RSpec.describe ProjectPolicy do
end
it 'disables boards and lists permissions' do
- expect_disallowed :read_board, :create_board, :update_board
- expect_disallowed :read_list, :create_list, :update_list, :admin_list
+ expect_disallowed :read_issue_board, :create_board, :update_board
+ expect_disallowed :read_issue_board_list, :create_list, :update_list, :admin_issue_board_list
end
context 'when external tracker configured' do
@@ -105,6 +105,10 @@ RSpec.describe ProjectPolicy do
context 'pipeline feature' do
let(:project) { private_project }
+ before do
+ private_project.add_developer(current_user)
+ end
+
describe 'for unconfirmed user' do
let(:current_user) { create(:user, confirmed_at: nil) }
@@ -1263,4 +1267,90 @@ RSpec.describe ProjectPolicy do
end
end
end
+
+ describe 'access_security_and_compliance' do
+ context 'when the "Security & Compliance" is enabled' do
+ before do
+ project.project_feature.update!(security_and_compliance_access_level: Featurable::PRIVATE)
+ end
+
+ %w[owner maintainer developer].each do |role|
+ context "when the role is #{role}" do
+ let(:current_user) { public_send(role) }
+
+ it { is_expected.to be_allowed(:access_security_and_compliance) }
+ end
+ end
+
+ context 'with admin' do
+ let(:current_user) { admin }
+
+ context 'when admin mode enabled', :enable_admin_mode do
+ it { is_expected.to be_allowed(:access_security_and_compliance) }
+ end
+
+ context 'when admin mode disabled' do
+ it { is_expected.to be_disallowed(:access_security_and_compliance) }
+ end
+ end
+
+ %w[reporter guest].each do |role|
+ context "when the role is #{role}" do
+ let(:current_user) { public_send(role) }
+
+ it { is_expected.to be_disallowed(:access_security_and_compliance) }
+ end
+ end
+
+ context 'with non member' do
+ let(:current_user) { non_member }
+
+ it { is_expected.to be_disallowed(:access_security_and_compliance) }
+ end
+
+ context 'with anonymous' do
+ let(:current_user) { anonymous }
+
+ it { is_expected.to be_disallowed(:access_security_and_compliance) }
+ end
+ end
+
+ context 'when the "Security & Compliance" is not enabled' do
+ before do
+ project.project_feature.update!(security_and_compliance_access_level: Featurable::DISABLED)
+ end
+
+ %w[owner maintainer developer reporter guest].each do |role|
+ context "when the role is #{role}" do
+ let(:current_user) { public_send(role) }
+
+ it { is_expected.to be_disallowed(:access_security_and_compliance) }
+ end
+ end
+
+ context 'with admin' do
+ let(:current_user) { admin }
+
+ context 'when admin mode enabled', :enable_admin_mode do
+ it { is_expected.to be_disallowed(:access_security_and_compliance) }
+ end
+
+ context 'when admin mode disabled' do
+ it { is_expected.to be_disallowed(:access_security_and_compliance) }
+ end
+ end
+
+ context 'with non member' do
+ let(:current_user) { non_member }
+
+ it { is_expected.to be_disallowed(:access_security_and_compliance) }
+ end
+
+ context 'with anonymous' do
+ let(:current_user) { anonymous }
+
+ it { is_expected.to be_disallowed(:access_security_and_compliance) }
+ end
+ end
+ end
end
diff --git a/spec/presenters/ci/build_runner_presenter_spec.rb b/spec/presenters/ci/build_runner_presenter_spec.rb
index 43b677483ce..1eecc9d1ce6 100644
--- a/spec/presenters/ci/build_runner_presenter_spec.rb
+++ b/spec/presenters/ci/build_runner_presenter_spec.rb
@@ -271,4 +271,28 @@ RSpec.describe Ci::BuildRunnerPresenter do
end
end
end
+
+ describe '#variables' do
+ subject { presenter.variables }
+
+ let(:build) { create(:ci_build) }
+
+ it 'returns a Collection' do
+ is_expected.to be_an_instance_of(Gitlab::Ci::Variables::Collection)
+ end
+ end
+
+ describe '#runner_variables' do
+ subject { presenter.runner_variables }
+
+ let(:build) { create(:ci_build) }
+
+ it 'returns an array' do
+ is_expected.to be_an_instance_of(Array)
+ end
+
+ it 'returns the expected variables' do
+ is_expected.to eq(presenter.variables.to_runner_variables)
+ end
+ end
end
diff --git a/spec/presenters/packages/composer/packages_presenter_spec.rb b/spec/presenters/packages/composer/packages_presenter_spec.rb
index 19d99a62468..c4217b6e37c 100644
--- a/spec/presenters/packages/composer/packages_presenter_spec.rb
+++ b/spec/presenters/packages/composer/packages_presenter_spec.rb
@@ -67,10 +67,15 @@ RSpec.describe ::Packages::Composer::PackagesPresenter do
{
'packages' => [],
'provider-includes' => { 'p/%hash%.json' => { 'sha256' => /^\h+$/ } },
- 'providers-url' => "/api/v4/group/#{group.id}/-/packages/composer/%package%$%hash%.json"
+ 'providers-url' => "prefix/api/v4/group/#{group.id}/-/packages/composer/%package%$%hash%.json",
+ 'metadata-url' => "prefix/api/v4/group/#{group.id}/-/packages/composer/p2/%package%.json"
}
end
+ before do
+ stub_config(gitlab: { relative_url_root: 'prefix' })
+ end
+
it 'returns the provider json' do
expect(subject).to match(expected_json)
end
diff --git a/spec/presenters/project_presenter_spec.rb b/spec/presenters/project_presenter_spec.rb
index 98bcbd8384b..ff8bb820cc5 100644
--- a/spec/presenters/project_presenter_spec.rb
+++ b/spec/presenters/project_presenter_spec.rb
@@ -183,6 +183,14 @@ RSpec.describe ProjectPresenter do
context 'not empty repo' do
let(:project) { create(:project, :repository) }
+ context 'if no current user' do
+ let(:user) { nil }
+
+ it 'returns false' do
+ expect(presenter.can_current_user_push_code?).to be(false)
+ end
+ end
+
it 'returns true if user can push to default branch' do
project.add_developer(user)
@@ -350,7 +358,7 @@ RSpec.describe ProjectPresenter do
is_link: false,
label: a_string_including("New file"),
link: presenter.project_new_blob_path(project, 'master'),
- class_modifier: 'dashed'
+ class_modifier: 'btn-dashed'
)
end
@@ -594,13 +602,47 @@ RSpec.describe ProjectPresenter do
end
end
+ describe 'experiment(:repo_integrations_link)' do
+ context 'when enabled' do
+ before do
+ stub_experiments(repo_integrations_link: :candidate)
+ end
+
+ it 'includes a button to configure integrations for maintainers' do
+ project.add_maintainer(user)
+
+ expect(empty_repo_statistics_buttons.map(&:label)).to include(
+ a_string_including('Configure Integration')
+ )
+ end
+
+ it 'does not include a button if not a maintainer' do
+ expect(empty_repo_statistics_buttons.map(&:label)).not_to include(
+ a_string_including('Configure Integration')
+ )
+ end
+ end
+
+ context 'when disabled' do
+ it 'does not include a button' do
+ project.add_maintainer(user)
+
+ expect(empty_repo_statistics_buttons.map(&:label)).not_to include(
+ a_string_including('Configure Integration')
+ )
+ end
+ end
+ end
+
context 'for a developer' do
before do
project.add_developer(user)
+ stub_experiments(empty_repo_upload: :candidate)
end
it 'orders the items correctly' do
expect(empty_repo_statistics_buttons.map(&:label)).to start_with(
+ a_string_including('Upload'),
a_string_including('New'),
a_string_including('README'),
a_string_including('LICENSE'),
@@ -609,6 +651,16 @@ RSpec.describe ProjectPresenter do
a_string_including('CI/CD')
)
end
+
+ context 'when not in the upload experiment' do
+ before do
+ stub_experiments(empty_repo_upload: :control)
+ end
+
+ it 'does not include upload button' do
+ expect(empty_repo_statistics_buttons.map(&:label)).not_to start_with(a_string_including('Upload'))
+ end
+ end
end
end
@@ -694,4 +746,20 @@ RSpec.describe ProjectPresenter do
end
end
end
+
+ describe 'empty_repo_upload_experiment?' do
+ subject { presenter.empty_repo_upload_experiment? }
+
+ it 'returns false when upload_anchor_data is nil' do
+ allow(presenter).to receive(:upload_anchor_data).and_return(nil)
+
+ expect(subject).to be false
+ end
+
+ it 'returns true when upload_anchor_data exists' do
+ allow(presenter).to receive(:upload_anchor_data).and_return(true)
+
+ expect(subject).to be true
+ end
+ end
end
diff --git a/spec/presenters/projects/import_export/project_export_presenter_spec.rb b/spec/presenters/projects/import_export/project_export_presenter_spec.rb
index b2b2ce35f34..d5776ba2323 100644
--- a/spec/presenters/projects/import_export/project_export_presenter_spec.rb
+++ b/spec/presenters/projects/import_export/project_export_presenter_spec.rb
@@ -86,14 +86,22 @@ RSpec.describe Projects::ImportExport::ProjectExportPresenter do
context 'as admin' do
let(:user) { create(:admin) }
- it 'exports group members as admin' do
- expect(member_emails).to include('group@member.com')
- end
+ context 'when admin mode is enabled', :enable_admin_mode do
+ it 'exports group members as admin' do
+ expect(member_emails).to include('group@member.com')
+ end
+
+ it 'exports group members as project members' do
+ member_types = subject.project_members.map { |pm| pm.source_type }
- it 'exports group members as project members' do
- member_types = subject.project_members.map { |pm| pm.source_type }
+ expect(member_types).to all(eq('Project'))
+ end
+ end
- expect(member_types).to all(eq('Project'))
+ context 'when admin mode is disabled' do
+ it 'does not export group members' do
+ expect(member_emails).not_to include('group@member.com')
+ end
end
end
end
diff --git a/spec/presenters/snippet_presenter_spec.rb b/spec/presenters/snippet_presenter_spec.rb
index a1d987ed78f..b0387206bd9 100644
--- a/spec/presenters/snippet_presenter_spec.rb
+++ b/spec/presenters/snippet_presenter_spec.rb
@@ -159,7 +159,7 @@ RSpec.describe SnippetPresenter do
let(:snippet) { create(:snippet, :repository, author: user) }
it 'returns repository first blob' do
- expect(subject).to eq snippet.blobs.first
+ expect(subject.name).to eq snippet.blobs.first.name
end
end
end
diff --git a/spec/requests/api/admin/plan_limits_spec.rb b/spec/requests/api/admin/plan_limits_spec.rb
new file mode 100644
index 00000000000..6bc133f67c0
--- /dev/null
+++ b/spec/requests/api/admin/plan_limits_spec.rb
@@ -0,0 +1,177 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe API::Admin::PlanLimits, 'PlanLimits' do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:admin) { create(:admin) }
+ let_it_be(:plan) { create(:plan, name: 'default') }
+
+ describe 'GET /application/plan_limits' do
+ context 'as a non-admin user' do
+ it 'returns 403' do
+ get api('/application/plan_limits', user)
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
+ end
+
+ context 'as an admin user' do
+ context 'no params' do
+ it 'returns plan limits' do
+ get api('/application/plan_limits', admin)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response).to be_an Hash
+ expect(json_response['conan_max_file_size']).to eq(Plan.default.actual_limits.conan_max_file_size)
+ expect(json_response['generic_packages_max_file_size']).to eq(Plan.default.actual_limits.generic_packages_max_file_size)
+ expect(json_response['maven_max_file_size']).to eq(Plan.default.actual_limits.maven_max_file_size)
+ expect(json_response['npm_max_file_size']).to eq(Plan.default.actual_limits.npm_max_file_size)
+ expect(json_response['nuget_max_file_size']).to eq(Plan.default.actual_limits.nuget_max_file_size)
+ expect(json_response['pypi_max_file_size']).to eq(Plan.default.actual_limits.pypi_max_file_size)
+ end
+ end
+
+ context 'correct plan name in params' do
+ before do
+ @params = { plan_name: 'default' }
+ end
+
+ it 'returns plan limits' do
+ get api('/application/plan_limits', admin), params: @params
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response).to be_an Hash
+ expect(json_response['conan_max_file_size']).to eq(Plan.default.actual_limits.conan_max_file_size)
+ expect(json_response['generic_packages_max_file_size']).to eq(Plan.default.actual_limits.generic_packages_max_file_size)
+ expect(json_response['maven_max_file_size']).to eq(Plan.default.actual_limits.maven_max_file_size)
+ expect(json_response['npm_max_file_size']).to eq(Plan.default.actual_limits.npm_max_file_size)
+ expect(json_response['nuget_max_file_size']).to eq(Plan.default.actual_limits.nuget_max_file_size)
+ expect(json_response['pypi_max_file_size']).to eq(Plan.default.actual_limits.pypi_max_file_size)
+ end
+ end
+
+ context 'invalid plan name in params' do
+ before do
+ @params = { plan_name: 'my-plan' }
+ end
+
+ it 'returns validation error' do
+ get api('/application/plan_limits', admin), params: @params
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['error']).to eq('plan_name does not have a valid value')
+ end
+ end
+ end
+ end
+
+ describe 'PUT /application/plan_limits' do
+ context 'as a non-admin user' do
+ it 'returns 403' do
+ put api('/application/plan_limits', user), params: { plan_name: 'default' }
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
+ end
+
+ context 'as an admin user' do
+ context 'correct params' do
+ it 'updates multiple plan limits' do
+ put api('/application/plan_limits', admin), params: {
+ 'plan_name': 'default',
+ 'conan_max_file_size': 10,
+ 'generic_packages_max_file_size': 20,
+ 'maven_max_file_size': 30,
+ 'npm_max_file_size': 40,
+ 'nuget_max_file_size': 50,
+ 'pypi_max_file_size': 60
+ }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response).to be_an Hash
+ expect(json_response['conan_max_file_size']).to eq(10)
+ expect(json_response['generic_packages_max_file_size']).to eq(20)
+ expect(json_response['maven_max_file_size']).to eq(30)
+ expect(json_response['npm_max_file_size']).to eq(40)
+ expect(json_response['nuget_max_file_size']).to eq(50)
+ expect(json_response['pypi_max_file_size']).to eq(60)
+ end
+
+ it 'updates single plan limits' do
+ put api('/application/plan_limits', admin), params: {
+ 'plan_name': 'default',
+ 'maven_max_file_size': 100
+ }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response).to be_an Hash
+ expect(json_response['maven_max_file_size']).to eq(100)
+ end
+ end
+
+ context 'empty params' do
+ it 'fails to update plan limits' do
+ put api('/application/plan_limits', admin), params: {}
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['error']).to match('plan_name is missing')
+ end
+ end
+
+ context 'params with wrong type' do
+ it 'fails to update plan limits' do
+ put api('/application/plan_limits', admin), params: {
+ 'plan_name': 'default',
+ 'conan_max_file_size': 'a',
+ 'generic_packages_max_file_size': 'b',
+ 'maven_max_file_size': 'c',
+ 'npm_max_file_size': 'd',
+ 'nuget_max_file_size': 'e',
+ 'pypi_max_file_size': 'f'
+ }
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['error']).to include(
+ 'conan_max_file_size is invalid',
+ 'generic_packages_max_file_size is invalid',
+ 'maven_max_file_size is invalid',
+ 'generic_packages_max_file_size is invalid',
+ 'npm_max_file_size is invalid',
+ 'nuget_max_file_size is invalid',
+ 'pypi_max_file_size is invalid'
+ )
+ end
+ end
+
+ context 'missing plan_name in params' do
+ it 'fails to update plan limits' do
+ put api('/application/plan_limits', admin), params: { 'conan_max_file_size': 0 }
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['error']).to match('plan_name is missing')
+ end
+ end
+
+ context 'additional undeclared params' do
+ before do
+ Plan.default.actual_limits.update!({ 'golang_max_file_size': 1000 })
+ end
+
+ it 'updates only declared plan limits' do
+ put api('/application/plan_limits', admin), params: {
+ 'plan_name': 'default',
+ 'pypi_max_file_size': 200,
+ 'golang_max_file_size': 999
+ }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response).to be_an Hash
+ expect(json_response['pypi_max_file_size']).to eq(200)
+ expect(json_response['golang_max_file_size']).to be_nil
+ expect(Plan.default.actual_limits.golang_max_file_size).to eq(1000)
+ end
+ end
+ end
+ end
+end
diff --git a/spec/requests/api/api_spec.rb b/spec/requests/api/api_spec.rb
index 8bd6049e6fa..522030652bd 100644
--- a/spec/requests/api/api_spec.rb
+++ b/spec/requests/api/api_spec.rb
@@ -112,6 +112,7 @@ RSpec.describe API::API do
'meta.project' => project.full_path,
'meta.root_namespace' => project.namespace.full_path,
'meta.user' => user.username,
+ 'meta.client_id' => an_instance_of(String),
'meta.feature_category' => 'issue_tracking')
end
end
@@ -125,6 +126,7 @@ RSpec.describe API::API do
expect(log_context).to match('correlation_id' => an_instance_of(String),
'meta.caller_id' => '/api/:version/users',
'meta.remote_ip' => an_instance_of(String),
+ 'meta.client_id' => an_instance_of(String),
'meta.feature_category' => 'users')
end
end
@@ -133,6 +135,28 @@ RSpec.describe API::API do
end
end
+ describe 'Marginalia comments' do
+ context 'GET /user/:id' do
+ let_it_be(:user) { create(:user) }
+ let(:component_map) do
+ {
+ "application" => "test",
+ "endpoint_id" => "/api/:version/users/:id"
+ }
+ end
+
+ subject { ActiveRecord::QueryRecorder.new { get api("/users/#{user.id}", user) } }
+
+ it 'generates a query that includes the expected annotations' do
+ expect(subject.log.last).to match(/correlation_id:.*/)
+
+ component_map.each do |component, value|
+ expect(subject.log.last).to include("#{component}:#{value}")
+ end
+ end
+ end
+ end
+
describe 'supported content-types' do
context 'GET /user/:id.txt' do
let_it_be(:user) { create(:user) }
diff --git a/spec/requests/api/ci/runner/jobs_artifacts_spec.rb b/spec/requests/api/ci/runner/jobs_artifacts_spec.rb
index 4d8da50f8f0..9369b6aa464 100644
--- a/spec/requests/api/ci/runner/jobs_artifacts_spec.rb
+++ b/spec/requests/api/ci/runner/jobs_artifacts_spec.rb
@@ -17,9 +17,9 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
end
describe '/api/v4/jobs' do
- let(:root_namespace) { create(:namespace) }
- let(:namespace) { create(:namespace, parent: root_namespace) }
- let(:project) { create(:project, namespace: namespace, shared_runners_enabled: false) }
+ let(:parent_group) { create(:group) }
+ let(:group) { create(:group, parent: parent_group) }
+ let(:project) { create(:project, namespace: group, shared_runners_enabled: false) }
let(:pipeline) { create(:ci_pipeline, project: project, ref: 'master') }
let(:runner) { create(:ci_runner, :project, projects: [project]) }
let(:user) { create(:user) }
@@ -78,7 +78,7 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
before do
stub_application_setting(max_artifacts_size: application_max_size)
- root_namespace.update!(max_artifacts_size: sample_max_size)
+ parent_group.update!(max_artifacts_size: sample_max_size)
end
it_behaves_like 'failed request'
@@ -90,8 +90,8 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
before do
stub_application_setting(max_artifacts_size: application_max_size)
- root_namespace.update!(max_artifacts_size: root_namespace_max_size)
- namespace.update!(max_artifacts_size: sample_max_size)
+ parent_group.update!(max_artifacts_size: root_namespace_max_size)
+ group.update!(max_artifacts_size: sample_max_size)
end
it_behaves_like 'failed request'
@@ -104,8 +104,8 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
before do
stub_application_setting(max_artifacts_size: application_max_size)
- root_namespace.update!(max_artifacts_size: root_namespace_max_size)
- namespace.update!(max_artifacts_size: child_namespace_max_size)
+ parent_group.update!(max_artifacts_size: root_namespace_max_size)
+ group.update!(max_artifacts_size: child_namespace_max_size)
project.update!(max_artifacts_size: sample_max_size)
end
diff --git a/spec/requests/api/ci/runner/jobs_put_spec.rb b/spec/requests/api/ci/runner/jobs_put_spec.rb
index f4c99307b1a..b5d2c4608c5 100644
--- a/spec/requests/api/ci/runner/jobs_put_spec.rb
+++ b/spec/requests/api/ci/runner/jobs_put_spec.rb
@@ -17,9 +17,8 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
end
describe '/api/v4/jobs' do
- let(:root_namespace) { create(:namespace) }
- let(:namespace) { create(:namespace, parent: root_namespace) }
- let(:project) { create(:project, namespace: namespace, shared_runners_enabled: false) }
+ let(:group) { create(:group, :nested) }
+ let(:project) { create(:project, namespace: group, shared_runners_enabled: false) }
let(:pipeline) { create(:ci_pipeline, project: project, ref: 'master') }
let(:runner) { create(:ci_runner, :project, projects: [project]) }
let(:user) { create(:user) }
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 74d8e3f7ae8..aced094e219 100644
--- a/spec/requests/api/ci/runner/jobs_request_post_spec.rb
+++ b/spec/requests/api/ci/runner/jobs_request_post_spec.rb
@@ -17,9 +17,8 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
end
describe '/api/v4/jobs' do
- let(:root_namespace) { create(:namespace) }
- let(:namespace) { create(:namespace, parent: root_namespace) }
- let(:project) { create(:project, namespace: namespace, shared_runners_enabled: false) }
+ let(:group) { create(:group, :nested) }
+ let(:project) { create(:project, namespace: group, shared_runners_enabled: false) }
let(:pipeline) { create(:ci_pipeline, project: project, ref: 'master') }
let(:runner) { create(:ci_runner, :project, projects: [project]) }
let(:user) { create(:user) }
@@ -198,7 +197,12 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
'when' => 'on_success' }]
end
- let(:expected_features) { { 'trace_sections' => true } }
+ let(:expected_features) do
+ {
+ 'trace_sections' => true,
+ 'failure_reasons' => include('script_failure')
+ }
+ end
it 'picks a job' do
request_job info: { platform: :darwin }
@@ -220,7 +224,7 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
expect(json_response['artifacts']).to eq(expected_artifacts)
expect(json_response['cache']).to eq(expected_cache)
expect(json_response['variables']).to include(*expected_variables)
- expect(json_response['features']).to eq(expected_features)
+ expect(json_response['features']).to match(expected_features)
end
it 'creates persistent ref' do
@@ -793,6 +797,50 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
end
end
+ describe 'setting the application context' do
+ subject { request_job }
+
+ context 'when triggered by a user' do
+ let(:job) { create(:ci_build, user: user, project: project) }
+
+ subject { request_job(id: job.id) }
+
+ it_behaves_like 'storing arguments in the application context' do
+ let(:expected_params) { { user: user.username, project: project.full_path, client_id: "user/#{user.id}" } }
+ end
+
+ it_behaves_like 'not executing any extra queries for the application context', 3 do
+ # Extra queries: User, Project, Route
+ let(:subject_proc) { proc { request_job(id: job.id) } }
+ end
+ end
+
+ context 'when the runner is of project type' do
+ it_behaves_like 'storing arguments in the application context' do
+ let(:expected_params) { { project: project.full_path, client_id: "runner/#{runner.id}" } }
+ end
+
+ it_behaves_like 'not executing any extra queries for the application context', 2 do
+ # Extra queries: Project, Route
+ let(:subject_proc) { proc { request_job } }
+ end
+ end
+
+ context 'when the runner is of group type' do
+ let(:group) { create(:group) }
+ let(:runner) { create(:ci_runner, :group, groups: [group]) }
+
+ it_behaves_like 'storing arguments in the application context' do
+ let(:expected_params) { { root_namespace: group.full_path_components.first, client_id: "runner/#{runner.id}" } }
+ end
+
+ it_behaves_like 'not executing any extra queries for the application context', 2 do
+ # Extra queries: Group, Route
+ let(:subject_proc) { proc { request_job } }
+ end
+ end
+ end
+
def request_job(token = runner.token, **params)
new_params = params.merge(token: token, last_update: last_update)
post api('/jobs/request'), params: new_params.to_json, headers: { 'User-Agent' => user_agent, 'Content-Type': 'application/json' }
diff --git a/spec/requests/api/ci/runner/jobs_trace_spec.rb b/spec/requests/api/ci/runner/jobs_trace_spec.rb
index 5b7a33d23d8..659cf055023 100644
--- a/spec/requests/api/ci/runner/jobs_trace_spec.rb
+++ b/spec/requests/api/ci/runner/jobs_trace_spec.rb
@@ -17,9 +17,8 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
end
describe '/api/v4/jobs' do
- let(:root_namespace) { create(:namespace) }
- let(:namespace) { create(:namespace, parent: root_namespace) }
- let(:project) { create(:project, namespace: namespace, shared_runners_enabled: false) }
+ let(:group) { create(:group, :nested) }
+ let(:project) { create(:project, namespace: group, shared_runners_enabled: false) }
let(:pipeline) { create(:ci_pipeline, project: project, ref: 'master') }
let(:runner) { create(:ci_runner, :project, projects: [project]) }
let(:user) { create(:user) }
diff --git a/spec/requests/api/ci/runner/runners_delete_spec.rb b/spec/requests/api/ci/runner/runners_delete_spec.rb
index 75960a1a1c0..6c6c465f161 100644
--- a/spec/requests/api/ci/runner/runners_delete_spec.rb
+++ b/spec/requests/api/ci/runner/runners_delete_spec.rb
@@ -37,8 +37,10 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
context 'when valid token is provided' do
let(:runner) { create(:ci_runner) }
+ subject { delete api('/runners'), params: { token: runner.token } }
+
it 'deletes Runner' do
- delete api('/runners'), params: { token: runner.token }
+ subject
expect(response).to have_gitlab_http_status(:no_content)
expect(::Ci::Runner.count).to eq(0)
@@ -48,6 +50,10 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
let(:request) { api('/runners') }
let(:params) { { token: runner.token } }
end
+
+ it_behaves_like 'storing arguments in the application context' do
+ let(:expected_params) { { client_id: "runner/#{runner.id}" } }
+ end
end
end
end
diff --git a/spec/requests/api/ci/runner/runners_post_spec.rb b/spec/requests/api/ci/runner/runners_post_spec.rb
index 7c362fae7d2..7984b1d4ca8 100644
--- a/spec/requests/api/ci/runner/runners_post_spec.rb
+++ b/spec/requests/api/ci/runner/runners_post_spec.rb
@@ -35,25 +35,44 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
end
context 'when valid token is provided' do
- it 'creates runner with default values' do
- post api('/runners'), params: { token: registration_token }
+ def request
+ post api('/runners'), params: { token: token }
+ end
- runner = ::Ci::Runner.first
+ context 'with a registration token' do
+ let(:token) { registration_token }
- expect(response).to have_gitlab_http_status(:created)
- expect(json_response['id']).to eq(runner.id)
- expect(json_response['token']).to eq(runner.token)
- expect(runner.run_untagged).to be true
- expect(runner.active).to be true
- expect(runner.token).not_to eq(registration_token)
- expect(runner).to be_instance_type
+ it 'creates runner with default values' do
+ request
+
+ runner = ::Ci::Runner.first
+
+ expect(response).to have_gitlab_http_status(:created)
+ expect(json_response['id']).to eq(runner.id)
+ expect(json_response['token']).to eq(runner.token)
+ expect(runner.run_untagged).to be true
+ expect(runner.active).to be true
+ expect(runner.token).not_to eq(registration_token)
+ expect(runner).to be_instance_type
+ end
+
+ it_behaves_like 'storing arguments in the application context' do
+ subject { request }
+
+ let(:expected_params) { { client_id: "runner/#{::Ci::Runner.first.id}" } }
+ end
+
+ it_behaves_like 'not executing any extra queries for the application context' do
+ let(:subject_proc) { proc { request } }
+ end
end
context 'when project token is used' do
let(:project) { create(:project) }
+ let(:token) { project.runners_token }
it 'creates project runner' do
- post api('/runners'), params: { token: project.runners_token }
+ request
expect(response).to have_gitlab_http_status(:created)
expect(project.runners.size).to eq(1)
@@ -62,13 +81,24 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
expect(runner.token).not_to eq(project.runners_token)
expect(runner).to be_project_type
end
+
+ it_behaves_like 'storing arguments in the application context' do
+ subject { request }
+
+ let(:expected_params) { { project: project.full_path, client_id: "runner/#{::Ci::Runner.first.id}" } }
+ end
+
+ it_behaves_like 'not executing any extra queries for the application context' do
+ let(:subject_proc) { proc { request } }
+ end
end
context 'when group token is used' do
let(:group) { create(:group) }
+ let(:token) { group.runners_token }
it 'creates a group runner' do
- post api('/runners'), params: { token: group.runners_token }
+ request
expect(response).to have_gitlab_http_status(:created)
expect(group.runners.reload.size).to eq(1)
@@ -77,6 +107,16 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
expect(runner.token).not_to eq(group.runners_token)
expect(runner).to be_group_type
end
+
+ it_behaves_like 'storing arguments in the application context' do
+ subject { request }
+
+ let(:expected_params) { { root_namespace: group.full_path_components.first, client_id: "runner/#{::Ci::Runner.first.id}" } }
+ end
+
+ it_behaves_like 'not executing any extra queries for the application context' do
+ let(:subject_proc) { proc { request } }
+ end
end
end
diff --git a/spec/requests/api/ci/runner/runners_verify_post_spec.rb b/spec/requests/api/ci/runner/runners_verify_post_spec.rb
index e2f5f9b2d68..c2e97446738 100644
--- a/spec/requests/api/ci/runner/runners_verify_post_spec.rb
+++ b/spec/requests/api/ci/runner/runners_verify_post_spec.rb
@@ -37,11 +37,17 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
end
context 'when valid token is provided' do
+ subject { post api('/runners/verify'), params: { token: runner.token } }
+
it 'verifies Runner credentials' do
- post api('/runners/verify'), params: { token: runner.token }
+ subject
expect(response).to have_gitlab_http_status(:ok)
end
+
+ it_behaves_like 'storing arguments in the application context' do
+ let(:expected_params) { { client_id: "runner/#{runner.id}" } }
+ end
end
end
end
diff --git a/spec/requests/api/commit_statuses_spec.rb b/spec/requests/api/commit_statuses_spec.rb
index bec15b788c3..10fa15d468f 100644
--- a/spec/requests/api/commit_statuses_spec.rb
+++ b/spec/requests/api/commit_statuses_spec.rb
@@ -291,7 +291,7 @@ RSpec.describe API::CommitStatuses do
end
context 'when retrying a commit status' do
- before do
+ subject(:post_request) do
post api(post_url, developer),
params: { state: 'failed', name: 'test', ref: 'master' }
@@ -300,15 +300,45 @@ RSpec.describe API::CommitStatuses do
end
it 'correctly posts a new commit status' do
+ post_request
+
expect(response).to have_gitlab_http_status(:created)
expect(json_response['sha']).to eq(commit.id)
expect(json_response['status']).to eq('success')
end
- it 'retries a commit status', :sidekiq_might_not_need_inline do
- expect(CommitStatus.count).to eq 2
- expect(CommitStatus.first).to be_retried
- expect(CommitStatus.last.pipeline).to be_success
+ context 'feature flags' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:ci_fix_commit_status_retried, :ci_remove_update_retried_from_process_pipeline, :previous_statuses_retried) do
+ true | true | true
+ true | false | true
+ false | true | false
+ false | false | true
+ end
+
+ with_them do
+ before do
+ stub_feature_flags(
+ ci_fix_commit_status_retried: ci_fix_commit_status_retried,
+ ci_remove_update_retried_from_process_pipeline: ci_remove_update_retried_from_process_pipeline
+ )
+ end
+
+ it 'retries a commit status', :sidekiq_might_not_need_inline do
+ post_request
+
+ expect(CommitStatus.count).to eq 2
+
+ if previous_statuses_retried
+ expect(CommitStatus.first).to be_retried
+ expect(CommitStatus.last.pipeline).to be_success
+ else
+ expect(CommitStatus.first).not_to be_retried
+ expect(CommitStatus.last.pipeline).to be_failed
+ end
+ end
+ end
end
end
diff --git a/spec/requests/api/composer_packages_spec.rb b/spec/requests/api/composer_packages_spec.rb
index 06d4a2c6017..30a831d24fd 100644
--- a/spec/requests/api/composer_packages_spec.rb
+++ b/spec/requests/api/composer_packages_spec.rb
@@ -222,6 +222,52 @@ RSpec.describe API::ComposerPackages do
it_behaves_like 'rejects Composer access with unknown group id'
end
+ describe 'GET /api/v4/group/:id/-/packages/composer/p2/*package_name.json' do
+ let(:package_name) { 'foobar' }
+ let(:url) { "/group/#{group.id}/-/packages/composer/p2/#{package_name}.json" }
+
+ subject { get api(url), headers: headers }
+
+ context 'with no packages' do
+ include_context 'Composer user type', :developer, true do
+ it_behaves_like 'returning response status', :not_found
+ end
+ end
+
+ context 'with valid project' do
+ let!(:package) { create(:composer_package, :with_metadatum, name: package_name, project: project) }
+
+ where(:project_visibility_level, :user_role, :member, :user_token, :shared_examples_name, :expected_status) do
+ 'PUBLIC' | :developer | true | true | 'Composer package api request' | :success
+ 'PUBLIC' | :developer | true | false | 'process Composer api request' | :unauthorized
+ 'PUBLIC' | :developer | false | true | 'Composer package api request' | :success
+ 'PUBLIC' | :developer | false | false | 'process Composer api request' | :unauthorized
+ 'PUBLIC' | :guest | true | true | 'Composer package api request' | :success
+ 'PUBLIC' | :guest | true | false | 'process Composer api request' | :unauthorized
+ 'PUBLIC' | :guest | false | true | 'Composer package api request' | :success
+ 'PUBLIC' | :guest | false | false | 'process Composer api request' | :unauthorized
+ 'PUBLIC' | :anonymous | false | true | 'Composer package api request' | :success
+ 'PRIVATE' | :developer | true | true | 'Composer package api request' | :success
+ 'PRIVATE' | :developer | true | false | 'process Composer api request' | :unauthorized
+ 'PRIVATE' | :developer | false | true | 'process Composer api request' | :not_found
+ 'PRIVATE' | :developer | false | false | 'process Composer api request' | :unauthorized
+ 'PRIVATE' | :guest | true | true | 'process Composer api request' | :not_found
+ 'PRIVATE' | :guest | true | false | 'process Composer api request' | :unauthorized
+ 'PRIVATE' | :guest | false | true | 'process Composer api request' | :not_found
+ 'PRIVATE' | :guest | false | false | 'process Composer api request' | :unauthorized
+ 'PRIVATE' | :anonymous | false | true | 'process Composer api request' | :not_found
+ end
+
+ with_them do
+ include_context 'Composer api group access', params[:project_visibility_level], params[:user_role], params[:user_token] do
+ it_behaves_like params[:shared_examples_name], params[:user_role], params[:expected_status], params[:member]
+ end
+ end
+ end
+
+ it_behaves_like 'rejects Composer access with unknown group id'
+ end
+
describe 'POST /api/v4/projects/:id/packages/composer' do
let(:url) { "/projects/#{project.id}/packages/composer" }
let(:params) { {} }
diff --git a/spec/requests/api/graphql/container_repository/container_repository_details_spec.rb b/spec/requests/api/graphql/container_repository/container_repository_details_spec.rb
index 44f924d8ae5..356e1e11def 100644
--- a/spec/requests/api/graphql/container_repository/container_repository_details_spec.rb
+++ b/spec/requests/api/graphql/container_repository/container_repository_details_spec.rb
@@ -13,7 +13,7 @@ RSpec.describe 'container repository details' do
graphql_query_for(
'containerRepository',
{ id: container_repository_global_id },
- all_graphql_fields_for('ContainerRepositoryDetails')
+ all_graphql_fields_for('ContainerRepositoryDetails', excluded: ['pipeline'])
)
end
diff --git a/spec/requests/api/graphql/group/container_repositories_spec.rb b/spec/requests/api/graphql/group/container_repositories_spec.rb
index 4aa775eba0f..939d7791d92 100644
--- a/spec/requests/api/graphql/group/container_repositories_spec.rb
+++ b/spec/requests/api/graphql/group/container_repositories_spec.rb
@@ -18,7 +18,7 @@ RSpec.describe 'getting container repositories in a group' do
<<~GQL
edges {
node {
- #{all_graphql_fields_for('container_repositories'.classify)}
+ #{all_graphql_fields_for('container_repositories'.classify, max_depth: 1)}
}
}
GQL
diff --git a/spec/requests/api/graphql/group/packages_spec.rb b/spec/requests/api/graphql/group/packages_spec.rb
new file mode 100644
index 00000000000..85775598b2e
--- /dev/null
+++ b/spec/requests/api/graphql/group/packages_spec.rb
@@ -0,0 +1,78 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'getting a package list for a group' do
+ include GraphqlHelpers
+
+ let_it_be(:resource) { create(:group, :private) }
+ let_it_be(:group_two) { create(:group, :private) }
+ let_it_be(:project) { create(:project, :repository, group: resource) }
+ let_it_be(:another_project) { create(:project, :repository, group: resource) }
+ let_it_be(:group_two_project) { create(:project, :repository, group: group_two) }
+ let_it_be(:current_user) { create(:user) }
+
+ let_it_be(:package) { create(:package, project: project) }
+ let_it_be(:npm_package) { create(:npm_package, project: group_two_project) }
+ let_it_be(:maven_package) { create(:maven_package, project: project) }
+ let_it_be(:debian_package) { create(:debian_package, project: another_project) }
+ let_it_be(:composer_package) { create(:composer_package, project: another_project) }
+ let_it_be(:composer_metadatum) do
+ create(:composer_metadatum, package: composer_package,
+ target_sha: 'afdeh',
+ composer_json: { name: 'x', type: 'y', license: 'z', version: 1 })
+ end
+
+ let(:package_names) { graphql_data_at(:group, :packages, :nodes, :name) }
+ let(:target_shas) { graphql_data_at(:group, :packages, :nodes, :metadata, :target_sha) }
+ let(:packages) { graphql_data_at(:group, :packages, :nodes) }
+
+ let(:fields) do
+ <<~QUERY
+ nodes {
+ #{all_graphql_fields_for('packages'.classify, excluded: ['project'])}
+ metadata { #{query_graphql_fragment('ComposerMetadata')} }
+ }
+ QUERY
+ end
+
+ let(:query) do
+ graphql_query_for(
+ 'group',
+ { 'fullPath' => resource.full_path },
+ query_graphql_field('packages', {}, fields)
+ )
+ end
+
+ it_behaves_like 'group and project packages query'
+
+ context 'with a batched query' do
+ let(:batch_query) do
+ <<~QUERY
+ {
+ a: group(fullPath: "#{resource.full_path}") { packages { nodes { name } } }
+ b: group(fullPath: "#{group_two.full_path}") { packages { nodes { name } } }
+ }
+ QUERY
+ end
+
+ let(:a_packages_names) { graphql_data_at(:a, :packages, :nodes, :name) }
+
+ before do
+ resource.add_reporter(current_user)
+ group_two.add_reporter(current_user)
+ post_graphql(batch_query, current_user: current_user)
+ end
+
+ it 'returns an error for the second group and data for the first' do
+ expect(a_packages_names).to contain_exactly(
+ package.name,
+ maven_package.name,
+ debian_package.name,
+ composer_package.name
+ )
+ expect_graphql_errors_to_include [/Packages can be requested only for one group at a time/]
+ expect(graphql_data_at(:b, :packages)).to be(nil)
+ end
+ end
+end
diff --git a/spec/requests/api/graphql/instance_statistics_measurements_spec.rb b/spec/requests/api/graphql/instance_statistics_measurements_spec.rb
deleted file mode 100644
index eb73dc59253..00000000000
--- a/spec/requests/api/graphql/instance_statistics_measurements_spec.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'InstanceStatisticsMeasurements' do
- include GraphqlHelpers
-
- let(:current_user) { create(:user, :admin) }
- let!(:instance_statistics_measurement_1) { create(:instance_statistics_measurement, :project_count, recorded_at: 20.days.ago, count: 5) }
- let!(:instance_statistics_measurement_2) { create(:instance_statistics_measurement, :project_count, recorded_at: 10.days.ago, count: 10) }
-
- let(:arguments) { 'identifier: PROJECTS' }
- let(:query) { graphql_query_for(:instanceStatisticsMeasurements, arguments, 'nodes { count identifier }') }
-
- before do
- post_graphql(query, current_user: current_user)
- end
-
- it 'returns measurement objects' do
- expect(graphql_data.dig('instanceStatisticsMeasurements', 'nodes')).to eq([
- { "count" => 10, 'identifier' => 'PROJECTS' },
- { "count" => 5, 'identifier' => 'PROJECTS' }
- ])
- end
-
- context 'with recorded_at filters' do
- let(:arguments) { %(identifier: PROJECTS, recordedAfter: "#{15.days.ago.to_date}", recordedBefore: "#{5.days.ago.to_date}") }
-
- it 'returns filtered measurement objects' do
- expect(graphql_data.dig('instanceStatisticsMeasurements', 'nodes')).to eq([
- { "count" => 10, 'identifier' => 'PROJECTS' }
- ])
- end
- end
-end
diff --git a/spec/requests/api/graphql/issue/issue_spec.rb b/spec/requests/api/graphql/issue/issue_spec.rb
index 09e89f65882..e8b8caf6c2d 100644
--- a/spec/requests/api/graphql/issue/issue_spec.rb
+++ b/spec/requests/api/graphql/issue/issue_spec.rb
@@ -8,10 +8,9 @@ RSpec.describe 'Query.issue(id)' do
let_it_be(:project) { create(:project) }
let_it_be(:issue) { create(:issue, project: project) }
let_it_be(:current_user) { create(:user) }
+ let_it_be(:issue_params) { { 'id' => issue.to_global_id.to_s } }
let(:issue_data) { graphql_data['issue'] }
-
- let_it_be(:issue_params) { { 'id' => issue.to_global_id.to_s } }
let(:issue_fields) { all_graphql_fields_for('Issue'.classify) }
let(:query) do
@@ -62,7 +61,7 @@ RSpec.describe 'Query.issue(id)' do
)
end
- context 'selecting any single field' do
+ context 'when selecting any single field' do
where(:field) do
scalar_fields_of('Issue').map { |name| [name] }
end
@@ -84,13 +83,13 @@ RSpec.describe 'Query.issue(id)' do
end
end
- context 'selecting multiple fields' do
+ context 'when selecting multiple fields' do
let(:issue_fields) { ['title', 'description', 'updatedBy { username }'] }
it 'returns the Issue with the specified fields' do
post_graphql(query, current_user: current_user)
- expect(issue_data.keys).to eq( %w(title description updatedBy) )
+ expect(issue_data.keys).to eq %w[title description updatedBy]
expect(issue_data['title']).to eq(issue.title)
expect(issue_data['description']).to eq(issue.description)
expect(issue_data['updatedBy']['username']).to eq(issue.author.username)
@@ -110,14 +109,14 @@ RSpec.describe 'Query.issue(id)' do
it 'returns correct attributes' do
post_graphql(query, current_user: current_user)
- expect(issue_data.keys).to eq( %w(moved movedTo) )
+ expect(issue_data.keys).to eq %w[moved movedTo]
expect(issue_data['moved']).to eq(true)
expect(issue_data['movedTo']['title']).to eq(new_issue.title)
end
end
context 'when passed a non-Issue gid' do
- let(:mr) {create(:merge_request)}
+ let(:mr) { create(:merge_request) }
it 'returns an error' do
gid = mr.to_global_id.to_s
diff --git a/spec/requests/api/graphql/mutations/alert_management/alerts/create_alert_issue_spec.rb b/spec/requests/api/graphql/mutations/alert_management/alerts/create_alert_issue_spec.rb
index 6141a172253..f637ca98353 100644
--- a/spec/requests/api/graphql/mutations/alert_management/alerts/create_alert_issue_spec.rb
+++ b/spec/requests/api/graphql/mutations/alert_management/alerts/create_alert_issue_spec.rb
@@ -20,7 +20,9 @@ RSpec.describe 'Create an alert issue from an alert' do
errors
alert {
iid
- issueIid
+ issue {
+ iid
+ }
}
issue {
iid
@@ -46,7 +48,7 @@ RSpec.describe 'Create an alert issue from an alert' do
expect(mutation_response.slice('alert', 'issue')).to eq(
'alert' => {
'iid' => alert.iid.to_s,
- 'issueIid' => new_issue.iid.to_s
+ 'issue' => { 'iid' => new_issue.iid.to_s }
},
'issue' => {
'iid' => new_issue.iid.to_s,
diff --git a/spec/requests/api/graphql/mutations/merge_requests/accept_spec.rb b/spec/requests/api/graphql/mutations/merge_requests/accept_spec.rb
new file mode 100644
index 00000000000..2725b33d528
--- /dev/null
+++ b/spec/requests/api/graphql/mutations/merge_requests/accept_spec.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'accepting a merge request', :request_store do
+ include GraphqlHelpers
+
+ let_it_be(:current_user) { create(:user) }
+ let_it_be(:project) { create(:project, :public, :repository) }
+ let!(:merge_request) { create(:merge_request, source_project: project) }
+ let(:input) do
+ {
+ project_path: project.full_path,
+ iid: merge_request.iid.to_s,
+ sha: merge_request.diff_head_sha
+ }
+ end
+
+ let(:mutation) { graphql_mutation(:merge_request_accept, input, 'mergeRequest { state }') }
+ let(:mutation_response) { graphql_mutation_response(:merge_request_accept) }
+
+ context 'when the user is not allowed to accept a merge request' do
+ before do
+ project.add_reporter(current_user)
+ end
+
+ it_behaves_like 'a mutation that returns a top-level access error'
+ end
+
+ context 'when user has permissions to create a merge request' do
+ before do
+ project.add_maintainer(current_user)
+ end
+
+ it 'merges the merge request' do
+ post_graphql_mutation(mutation, current_user: current_user)
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(mutation_response['mergeRequest']).to include(
+ 'state' => 'merged'
+ )
+ end
+ end
+end
diff --git a/spec/requests/api/graphql/mutations/notes/create/diff_note_spec.rb b/spec/requests/api/graphql/mutations/notes/create/diff_note_spec.rb
index 7dd897f6466..b5aaf304812 100644
--- a/spec/requests/api/graphql/mutations/notes/create/diff_note_spec.rb
+++ b/spec/requests/api/graphql/mutations/notes/create/diff_note_spec.rb
@@ -9,8 +9,9 @@ RSpec.describe 'Adding a DiffNote' do
let(:noteable) { create(:merge_request, source_project: project, target_project: project) }
let(:project) { create(:project, :repository) }
let(:diff_refs) { noteable.diff_refs }
- let(:mutation) do
- variables = {
+
+ let(:base_variables) do
+ {
noteable_id: GitlabSchema.id_from_object(noteable).to_s,
body: 'Body text',
position: {
@@ -18,16 +19,16 @@ RSpec.describe 'Adding a DiffNote' do
old_path: 'files/ruby/popen.rb',
new_path: 'files/ruby/popen2.rb'
},
- new_line: 14,
base_sha: diff_refs.base_sha,
head_sha: diff_refs.head_sha,
start_sha: diff_refs.start_sha
}
}
-
- graphql_mutation(:create_diff_note, variables)
end
+ let(:variables) { base_variables.deep_merge({ position: { new_line: 14 } }) }
+ let(:mutation) { graphql_mutation(:create_diff_note, variables) }
+
def mutation_response
graphql_mutation_response(:create_diff_note)
end
@@ -41,6 +42,18 @@ RSpec.describe 'Adding a DiffNote' do
it_behaves_like 'a Note mutation that creates a Note'
+ context 'add comment to old line' do
+ let(:variables) { base_variables.deep_merge({ position: { old_line: 14 } }) }
+
+ it_behaves_like 'a Note mutation that creates a Note'
+ end
+
+ context 'add a comment with a position without lines' do
+ let(:variables) { base_variables }
+
+ it_behaves_like 'a Note mutation that does not create a Note'
+ end
+
it_behaves_like 'a Note mutation when there are active record validation errors', model: DiffNote
it_behaves_like 'a Note mutation when there are rate limit validation errors'
diff --git a/spec/requests/api/graphql/mutations/release_asset_links/create_spec.rb b/spec/requests/api/graphql/mutations/release_asset_links/create_spec.rb
new file mode 100644
index 00000000000..c7a4cb1ebce
--- /dev/null
+++ b/spec/requests/api/graphql/mutations/release_asset_links/create_spec.rb
@@ -0,0 +1,59 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Creation of a new release asset link' do
+ include GraphqlHelpers
+
+ let_it_be(:project) { create(:project, :private, :repository) }
+ let_it_be(:release) { create(:release, project: project, tag: 'v13.10') }
+ let_it_be(:developer) { create(:user).tap { |u| project.add_developer(u) } }
+
+ let(:current_user) { developer }
+
+ let(:mutation_name) { :release_asset_link_create }
+
+ let(:mutation_arguments) do
+ {
+ projectPath: project.full_path,
+ tagName: release.tag,
+ name: 'awesome-app.dmg',
+ url: 'https://example.com/download/awesome-app.dmg',
+ directAssetPath: '/binaries/awesome-app.dmg',
+ linkType: 'PACKAGE'
+ }
+ end
+
+ let(:mutation) do
+ graphql_mutation(mutation_name, mutation_arguments, <<~FIELDS)
+ link {
+ id
+ name
+ url
+ linkType
+ directAssetUrl
+ external
+ }
+ errors
+ FIELDS
+ end
+
+ let(:create_link) { post_graphql_mutation(mutation, current_user: current_user) }
+ let(:mutation_response) { graphql_mutation_response(mutation_name)&.with_indifferent_access }
+
+ it 'creates and returns a new asset link associated to the provided release', :aggregate_failures do
+ create_link
+
+ expected_response = {
+ id: start_with("gid://gitlab/Releases::Link/"),
+ name: mutation_arguments[:name],
+ url: mutation_arguments[:url],
+ linkType: mutation_arguments[:linkType],
+ directAssetUrl: end_with(mutation_arguments[:directAssetPath]),
+ external: true
+ }.with_indifferent_access
+
+ expect(mutation_response[:link]).to include(expected_response)
+ expect(mutation_response[:errors]).to eq([])
+ end
+end
diff --git a/spec/requests/api/graphql/mutations/user_callouts/create_spec.rb b/spec/requests/api/graphql/mutations/user_callouts/create_spec.rb
new file mode 100644
index 00000000000..cb67a60ebe4
--- /dev/null
+++ b/spec/requests/api/graphql/mutations/user_callouts/create_spec.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Create a user callout' do
+ include GraphqlHelpers
+
+ let_it_be(:current_user) { create(:user) }
+ let(:feature_name) { ::UserCallout.feature_names.each_key.first }
+
+ let(:input) do
+ {
+ 'featureName' => feature_name
+ }
+ end
+
+ let(:mutation) { graphql_mutation(:userCalloutCreate, input) }
+ let(:mutation_response) { graphql_mutation_response(:userCalloutCreate) }
+
+ it 'creates user callout' do
+ freeze_time do
+ post_graphql_mutation(mutation, current_user: current_user)
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(mutation_response['userCallout']['featureName']).to eq(feature_name.upcase)
+ expect(mutation_response['userCallout']['dismissedAt']).to eq(Time.current.iso8601)
+ end
+ end
+end
diff --git a/spec/requests/api/graphql/namespace/projects_spec.rb b/spec/requests/api/graphql/namespace/projects_spec.rb
index 3e68503b7fb..414847c9c93 100644
--- a/spec/requests/api/graphql/namespace/projects_spec.rb
+++ b/spec/requests/api/graphql/namespace/projects_spec.rb
@@ -23,7 +23,7 @@ RSpec.describe 'getting projects' do
projects(includeSubgroups: #{include_subgroups}) {
edges {
node {
- #{all_graphql_fields_for('Project')}
+ #{all_graphql_fields_for('Project', max_depth: 1)}
}
}
}
diff --git a/spec/requests/api/graphql/packages/package_spec.rb b/spec/requests/api/graphql/packages/package_spec.rb
index bb3ceb81f16..654215041cb 100644
--- a/spec/requests/api/graphql/packages/package_spec.rb
+++ b/spec/requests/api/graphql/packages/package_spec.rb
@@ -15,7 +15,7 @@ RSpec.describe 'package details' do
end
let(:depth) { 3 }
- let(:excluded) { %w[metadata apiFuzzingCiConfiguration] }
+ let(:excluded) { %w[metadata apiFuzzingCiConfiguration pipeline] }
let(:query) do
graphql_query_for(:package, { id: package_global_id }, <<~FIELDS)
diff --git a/spec/requests/api/graphql/project/alert_management/alert/issue_spec.rb b/spec/requests/api/graphql/project/alert_management/alert/issue_spec.rb
new file mode 100644
index 00000000000..9724de4fedb
--- /dev/null
+++ b/spec/requests/api/graphql/project/alert_management/alert/issue_spec.rb
@@ -0,0 +1,71 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'getting Alert Management Alert Issue' do
+ include GraphqlHelpers
+
+ let_it_be(:project) { create(:project) }
+ let_it_be(:current_user) { create(:user) }
+ let(:payload) { {} }
+ let(:query) { 'avg(metric) > 1.0' }
+
+ let(:fields) do
+ <<~QUERY
+ nodes {
+ iid
+ issue {
+ iid
+ state
+ }
+ }
+ QUERY
+ end
+
+ let(:graphql_query) do
+ graphql_query_for(
+ 'project',
+ { 'fullPath' => project.full_path },
+ query_graphql_field('alertManagementAlerts', {}, fields)
+ )
+ end
+
+ let(:alerts) { graphql_data.dig('project', 'alertManagementAlerts', 'nodes') }
+ let(:first_alert) { alerts.first }
+
+ before do
+ project.add_developer(current_user)
+ end
+
+ context 'with gitlab alert' do
+ before do
+ create(:alert_management_alert, :with_issue, project: project, payload: payload)
+ end
+
+ it 'includes the correct alert issue payload data' do
+ post_graphql(graphql_query, current_user: current_user)
+
+ expect(first_alert).to include('issue' => { "iid" => "1", "state" => "opened" })
+ end
+ end
+
+ describe 'performance' do
+ let(:first_n) { var('Int') }
+ let(:params) { { first: first_n } }
+ let(:limited_query) { with_signature([first_n], query) }
+
+ context 'with gitlab alert' do
+ before do
+ create(:alert_management_alert, :with_issue, project: project, payload: payload)
+ end
+
+ it 'avoids N+1 queries' do
+ base_count = ActiveRecord::QueryRecorder.new do
+ post_graphql(limited_query, current_user: current_user, variables: first_n.with(1))
+ end
+
+ expect { post_graphql(limited_query, current_user: current_user) }.not_to exceed_query_limit(base_count)
+ end
+ end
+ end
+end
diff --git a/spec/requests/api/graphql/project/alert_management/alerts_spec.rb b/spec/requests/api/graphql/project/alert_management/alerts_spec.rb
index 8deed75a466..fe77d9dc86d 100644
--- a/spec/requests/api/graphql/project/alert_management/alerts_spec.rb
+++ b/spec/requests/api/graphql/project/alert_management/alerts_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe 'getting Alert Management Alerts' do
let_it_be(:payload) { { 'custom' => { 'alert' => 'payload' }, 'runbook' => 'runbook' } }
let_it_be(:project) { create(:project, :repository) }
let_it_be(:current_user) { create(:user) }
- let_it_be(:resolved_alert) { create(:alert_management_alert, :all_fields, :resolved, project: project, issue: nil, severity: :low).present }
+ let_it_be(:resolved_alert) { create(:alert_management_alert, :all_fields, :resolved, project: project, severity: :low).present }
let_it_be(:triggered_alert) { create(:alert_management_alert, :all_fields, project: project, severity: :critical, payload: payload).present }
let_it_be(:other_project_alert) { create(:alert_management_alert, :all_fields).present }
@@ -60,7 +60,6 @@ RSpec.describe 'getting Alert Management Alerts' do
it 'returns the correct properties of the alerts' do
expect(first_alert).to include(
'iid' => triggered_alert.iid.to_s,
- 'issueIid' => triggered_alert.issue_iid.to_s,
'title' => triggered_alert.title,
'description' => triggered_alert.description,
'severity' => triggered_alert.severity.upcase,
@@ -82,7 +81,6 @@ RSpec.describe 'getting Alert Management Alerts' do
expect(second_alert).to include(
'iid' => resolved_alert.iid.to_s,
- 'issueIid' => resolved_alert.issue_iid.to_s,
'status' => 'RESOLVED',
'endedAt' => resolved_alert.ended_at.strftime('%Y-%m-%dT%H:%M:%SZ')
)
diff --git a/spec/requests/api/graphql/project/container_repositories_spec.rb b/spec/requests/api/graphql/project/container_repositories_spec.rb
index 2087d8c2cc3..5ffd48a7bc4 100644
--- a/spec/requests/api/graphql/project/container_repositories_spec.rb
+++ b/spec/requests/api/graphql/project/container_repositories_spec.rb
@@ -16,7 +16,7 @@ RSpec.describe 'getting container repositories in a project' do
<<~GQL
edges {
node {
- #{all_graphql_fields_for('container_repositories'.classify)}
+ #{all_graphql_fields_for('container_repositories'.classify, excluded: ['pipeline'])}
}
}
GQL
diff --git a/spec/requests/api/graphql/project/merge_request/diff_notes_spec.rb b/spec/requests/api/graphql/project/merge_request/diff_notes_spec.rb
index dd16b052e0e..b1ecb32b365 100644
--- a/spec/requests/api/graphql/project/merge_request/diff_notes_spec.rb
+++ b/spec/requests/api/graphql/project/merge_request/diff_notes_spec.rb
@@ -34,7 +34,7 @@ RSpec.describe 'getting notes for a merge request' do
notes {
edges {
node {
- #{all_graphql_fields_for('Note')}
+ #{all_graphql_fields_for('Note', excluded: ['pipeline'])}
}
}
}
diff --git a/spec/requests/api/graphql/project/merge_request_spec.rb b/spec/requests/api/graphql/project/merge_request_spec.rb
index a4e8d0bc35e..e32899c600e 100644
--- a/spec/requests/api/graphql/project/merge_request_spec.rb
+++ b/spec/requests/api/graphql/project/merge_request_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe 'getting merge request information nested in a project' do
let(:current_user) { create(:user) }
let(:merge_request_graphql_data) { graphql_data['project']['mergeRequest'] }
let!(:merge_request) { create(:merge_request, source_project: project) }
- let(:mr_fields) { all_graphql_fields_for('MergeRequest') }
+ let(:mr_fields) { all_graphql_fields_for('MergeRequest', excluded: ['pipeline']) }
let(:query) do
graphql_query_for(
diff --git a/spec/requests/api/graphql/project/merge_requests_spec.rb b/spec/requests/api/graphql/project/merge_requests_spec.rb
index d684be91dc9..d97a0ed9399 100644
--- a/spec/requests/api/graphql/project/merge_requests_spec.rb
+++ b/spec/requests/api/graphql/project/merge_requests_spec.rb
@@ -7,13 +7,27 @@ RSpec.describe 'getting merge request listings nested in a project' do
let_it_be(:project) { create(:project, :repository, :public) }
let_it_be(:current_user) { create(:user) }
-
let_it_be(:label) { create(:label, project: project) }
- let_it_be(:merge_request_a) { create(:labeled_merge_request, :unique_branches, source_project: project, labels: [label]) }
- let_it_be(:merge_request_b) { create(:merge_request, :closed, :unique_branches, source_project: project) }
- let_it_be(:merge_request_c) { create(:labeled_merge_request, :closed, :unique_branches, source_project: project, labels: [label]) }
- let_it_be(:merge_request_d) { create(:merge_request, :locked, :unique_branches, source_project: project) }
- let_it_be(:merge_request_e) { create(:merge_request, :unique_branches, source_project: project) }
+
+ let_it_be(:merge_request_a) do
+ create(:labeled_merge_request, :unique_branches, source_project: project, labels: [label])
+ end
+
+ let_it_be(:merge_request_b) do
+ create(:merge_request, :closed, :unique_branches, source_project: project)
+ end
+
+ let_it_be(:merge_request_c) do
+ create(:labeled_merge_request, :closed, :unique_branches, source_project: project, labels: [label])
+ end
+
+ let_it_be(:merge_request_d) do
+ create(:merge_request, :locked, :unique_branches, source_project: project)
+ end
+
+ let_it_be(:merge_request_e) do
+ create(:merge_request, :unique_branches, source_project: project)
+ end
let(:results) { graphql_data.dig('project', 'mergeRequests', 'nodes') }
@@ -27,32 +41,38 @@ RSpec.describe 'getting merge request listings nested in a project' do
)
end
- let(:query) do
- query_merge_requests(all_graphql_fields_for('MergeRequest', max_depth: 1))
- end
-
it_behaves_like 'a working graphql query' do
+ let(:query) do
+ query_merge_requests(all_graphql_fields_for('MergeRequest', max_depth: 2))
+ end
+
before do
- post_graphql(query, current_user: current_user)
+ # We cannot call the whitelist here, since the transaction does not
+ # begin until we enter the controller.
+ headers = {
+ 'X-GITLAB-QUERY-WHITELIST-ISSUE' => 'https://gitlab.com/gitlab-org/gitlab/-/issues/322979'
+ }
+
+ post_graphql(query, current_user: current_user, headers: headers)
end
end
# The following tests are needed to guarantee that we have correctly annotated
# all the gitaly calls. Selecting combinations of fields may mask this due to
# memoization.
- context 'requesting a single field' do
+ context 'when requesting a single field' do
let_it_be(:fresh_mr) { create(:merge_request, :unique_branches, source_project: project) }
+
let(:search_params) { { iids: [fresh_mr.iid.to_s] } }
+ let(:graphql_data) do
+ GitlabSchema.execute(query, context: { current_user: current_user }).to_h['data']
+ end
before do
project.repository.expire_branches_cache
end
- let(:graphql_data) do
- GitlabSchema.execute(query, context: { current_user: current_user }).to_h['data']
- end
-
- context 'selecting any single scalar field' do
+ context 'when selecting any single scalar field' do
where(:field) do
scalar_fields_of('MergeRequest').map { |name| [name] }
end
@@ -68,7 +88,7 @@ RSpec.describe 'getting merge request listings nested in a project' do
end
end
- context 'selecting any single nested field' do
+ context 'when selecting any single nested field' do
where(:field, :subfield, :is_connection) do
nested_fields_of('MergeRequest').flat_map do |name, field|
type = field_type(field)
@@ -95,7 +115,11 @@ RSpec.describe 'getting merge request listings nested in a project' do
end
end
- shared_examples 'searching with parameters' do
+ shared_examples 'when searching with parameters' do
+ let(:query) do
+ query_merge_requests('iid title')
+ end
+
let(:expected) do
mrs.map { |mr| a_hash_including('iid' => mr.iid.to_s, 'title' => mr.title) }
end
@@ -107,60 +131,60 @@ RSpec.describe 'getting merge request listings nested in a project' do
end
end
- context 'there are no search params' do
+ context 'when there are no search params' do
let(:search_params) { nil }
let(:mrs) { [merge_request_a, merge_request_b, merge_request_c, merge_request_d, merge_request_e] }
- it_behaves_like 'searching with parameters'
+ it_behaves_like 'when searching with parameters'
end
- context 'the search params do not match anything' do
- let(:search_params) { { iids: %w(foo bar baz) } }
+ context 'when the search params do not match anything' do
+ let(:search_params) { { iids: %w[foo bar baz] } }
let(:mrs) { [] }
- it_behaves_like 'searching with parameters'
+ it_behaves_like 'when searching with parameters'
end
- context 'searching by iids' do
+ context 'when searching by iids' do
let(:search_params) { { iids: mrs.map(&:iid).map(&:to_s) } }
let(:mrs) { [merge_request_a, merge_request_c] }
- it_behaves_like 'searching with parameters'
+ it_behaves_like 'when searching with parameters'
end
- context 'searching by state' do
+ context 'when searching by state' do
let(:search_params) { { state: :closed } }
let(:mrs) { [merge_request_b, merge_request_c] }
- it_behaves_like 'searching with parameters'
+ it_behaves_like 'when searching with parameters'
end
- context 'searching by source_branch' do
+ context 'when searching by source_branch' do
let(:search_params) { { source_branches: mrs.map(&:source_branch) } }
let(:mrs) { [merge_request_b, merge_request_c] }
- it_behaves_like 'searching with parameters'
+ it_behaves_like 'when searching with parameters'
end
- context 'searching by target_branch' do
+ context 'when searching by target_branch' do
let(:search_params) { { target_branches: mrs.map(&:target_branch) } }
let(:mrs) { [merge_request_a, merge_request_d] }
- it_behaves_like 'searching with parameters'
+ it_behaves_like 'when searching with parameters'
end
- context 'searching by label' do
+ context 'when searching by label' do
let(:search_params) { { labels: [label.title] } }
let(:mrs) { [merge_request_a, merge_request_c] }
- it_behaves_like 'searching with parameters'
+ it_behaves_like 'when searching with parameters'
end
- context 'searching by combination' do
+ context 'when searching by combination' do
let(:search_params) { { state: :closed, labels: [label.title] } }
let(:mrs) { [merge_request_c] }
- it_behaves_like 'searching with parameters'
+ it_behaves_like 'when searching with parameters'
end
context 'when requesting `approved_by`' do
@@ -203,10 +227,10 @@ RSpec.describe 'getting merge request listings nested in a project' do
it 'exposes `commit_count`' do
execute_query
- expect(results).to match_array([
+ expect(results).to match_array [
{ "iid" => merge_request_a.iid.to_s, "commitCount" => 0 },
{ "iid" => merge_request_with_commits.iid.to_s, "commitCount" => 29 }
- ])
+ ]
end
end
@@ -216,8 +240,8 @@ RSpec.describe 'getting merge request listings nested in a project' do
before do
# make the MRs "merged"
[merge_request_a, merge_request_b, merge_request_c].each do |mr|
- mr.update_column(:state_id, MergeRequest.available_states[:merged])
- mr.metrics.update_column(:merged_at, Time.now)
+ mr.update!(state_id: MergeRequest.available_states[:merged])
+ mr.metrics.update!(merged_at: Time.now)
end
end
@@ -256,13 +280,12 @@ RSpec.describe 'getting merge request listings nested in a project' do
end
it 'returns the reviewers' do
+ nodes = merge_request_a.reviewers.map { |r| { 'username' => r.username } }
+ reviewers = { 'nodes' => match_array(nodes) }
+
execute_query
- expect(results).to include a_hash_including('reviewers' => {
- 'nodes' => match_array(merge_request_a.reviewers.map do |r|
- a_hash_including('username' => r.username)
- end)
- })
+ expect(results).to include a_hash_including('reviewers' => match(reviewers))
end
include_examples 'N+1 query check'
@@ -309,12 +332,14 @@ RSpec.describe 'getting merge request listings nested in a project' do
allow(Gitlab::Database).to receive(:read_only?).and_return(false)
end
+ def query_context
+ { current_user: current_user }
+ end
+
def run_query(number)
# Ensure that we have a fresh request store and batch-context between runs
- result = run_with_clean_state(query,
- context: { current_user: current_user },
- variables: { first: number }
- )
+ vars = { first: number }
+ result = run_with_clean_state(query, context: query_context, variables: vars)
graphql_dig_at(result.to_h, :data, :project, :merge_requests, :nodes)
end
@@ -348,39 +373,49 @@ RSpec.describe 'getting merge request listings nested in a project' do
let(:data_path) { [:project, :mergeRequests] }
def pagination_query(params)
- graphql_query_for(:project, { full_path: project.full_path },
- <<~QUERY
+ graphql_query_for(:project, { full_path: project.full_path }, <<~QUERY)
mergeRequests(#{params}) {
#{page_info} nodes { id }
}
- QUERY
- )
+ QUERY
end
context 'when sorting by merged_at DESC' do
- it_behaves_like 'sorted paginated query' do
- let(:sort_param) { :MERGED_AT_DESC }
- let(:first_param) { 2 }
+ let(:sort_param) { :MERGED_AT_DESC }
+ let(:expected_results) do
+ [
+ merge_request_b,
+ merge_request_d,
+ merge_request_c,
+ merge_request_e,
+ merge_request_a
+ ].map { |mr| global_id_of(mr) }
+ end
- let(:expected_results) do
- [
- merge_request_b,
- merge_request_d,
- merge_request_c,
- merge_request_e,
- merge_request_a
- ].map { |mr| global_id_of(mr) }
- end
+ before do
+ five_days_ago = 5.days.ago
- before do
- five_days_ago = 5.days.ago
+ merge_request_d.metrics.update!(merged_at: five_days_ago)
+
+ # same merged_at, the second order column will decide (merge_request.id)
+ merge_request_c.metrics.update!(merged_at: five_days_ago)
+
+ merge_request_b.metrics.update!(merged_at: 1.day.ago)
+ end
+
+ it_behaves_like 'sorted paginated query' do
+ let(:first_param) { 2 }
+ end
- merge_request_d.metrics.update!(merged_at: five_days_ago)
+ context 'when last parameter is given' do
+ let(:params) { graphql_args(sort: sort_param, last: 2) }
+ let(:page_info) { nil }
- # same merged_at, the second order column will decide (merge_request.id)
- merge_request_c.metrics.update!(merged_at: five_days_ago)
+ it 'takes the last 2 records' do
+ query = pagination_query(params)
+ post_graphql(query, current_user: current_user)
- merge_request_b.metrics.update!(merged_at: 1.day.ago)
+ expect(results.map { |item| item["id"] }).to eq(expected_results.last(2))
end
end
end
@@ -396,75 +431,45 @@ RSpec.describe 'getting merge request listings nested in a project' do
let(:query) do
# Note: __typename meta field is always requested by the FE
- graphql_query_for(:project, { full_path: project.full_path },
- <<~QUERY
+ graphql_query_for(:project, { full_path: project.full_path }, <<~QUERY)
mergeRequests(mergedAfter: "2020-01-01", mergedBefore: "2020-01-05", first: 0, sourceBranches: null, labels: null) {
count
__typename
}
QUERY
- )
end
- shared_examples 'count examples' do
- it 'returns the correct count' do
- post_graphql(query, current_user: current_user)
+ it 'does not query the merge requests table for the count' do
+ query_recorder = ActiveRecord::QueryRecorder.new { post_graphql(query, current_user: current_user) }
- count = graphql_data.dig('project', 'mergeRequests', 'count')
- expect(count).to eq(1)
- end
+ queries = query_recorder.data.each_value.first[:occurrences]
+ expect(queries).not_to include(match(/SELECT COUNT\(\*\) FROM "merge_requests"/))
+ expect(queries).to include(match(/SELECT COUNT\(\*\) FROM "merge_request_metrics"/))
end
- context 'when "optimized_merge_request_count_with_merged_at_filter" feature flag is enabled' do
- before do
- stub_feature_flags(optimized_merge_request_count_with_merged_at_filter: true)
+ context 'when total_time_to_merge and count is queried' do
+ let(:query) do
+ graphql_query_for(:project, { full_path: project.full_path }, <<~QUERY)
+ mergeRequests(mergedAfter: "2020-01-01", mergedBefore: "2020-01-05", first: 0) {
+ totalTimeToMerge
+ count
+ }
+ QUERY
end
- it 'does not query the merge requests table for the count' do
+ it 'does not query the merge requests table for the total_time_to_merge' do
query_recorder = ActiveRecord::QueryRecorder.new { post_graphql(query, current_user: current_user) }
queries = query_recorder.data.each_value.first[:occurrences]
- expect(queries).not_to include(match(/SELECT COUNT\(\*\) FROM "merge_requests"/))
- expect(queries).to include(match(/SELECT COUNT\(\*\) FROM "merge_request_metrics"/))
+ expect(queries).to include(match(/SELECT.+SUM.+FROM "merge_request_metrics" WHERE/))
end
+ end
- context 'when total_time_to_merge and count is queried' do
- let(:query) do
- graphql_query_for(:project, { full_path: project.full_path },
- <<~QUERY
- mergeRequests(mergedAfter: "2020-01-01", mergedBefore: "2020-01-05", first: 0) {
- totalTimeToMerge
- count
- }
- QUERY
- )
- end
-
- it 'does not query the merge requests table for the total_time_to_merge' do
- query_recorder = ActiveRecord::QueryRecorder.new { post_graphql(query, current_user: current_user) }
-
- queries = query_recorder.data.each_value.first[:occurrences]
- expect(queries).to include(match(/SELECT.+SUM.+FROM "merge_request_metrics" WHERE/))
- end
- end
-
- it_behaves_like 'count examples'
-
- context 'when "optimized_merge_request_count_with_merged_at_filter" feature flag is disabled' do
- before do
- stub_feature_flags(optimized_merge_request_count_with_merged_at_filter: false)
- end
-
- it 'queries the merge requests table for the count' do
- query_recorder = ActiveRecord::QueryRecorder.new { post_graphql(query, current_user: current_user) }
-
- queries = query_recorder.data.each_value.first[:occurrences]
- expect(queries).to include(match(/SELECT COUNT\(\*\) FROM "merge_requests"/))
- expect(queries).not_to include(match(/SELECT COUNT\(\*\) FROM "merge_request_metrics"/))
- end
+ it 'returns the correct count' do
+ post_graphql(query, current_user: current_user)
- it_behaves_like 'count examples'
- end
+ count = graphql_data.dig('project', 'mergeRequests', 'count')
+ expect(count).to eq(1)
end
end
end
diff --git a/spec/requests/api/graphql/project/packages_spec.rb b/spec/requests/api/graphql/project/packages_spec.rb
index b20c96d54c8..3c04e0caf61 100644
--- a/spec/requests/api/graphql/project/packages_spec.rb
+++ b/spec/requests/api/graphql/project/packages_spec.rb
@@ -5,28 +5,28 @@ require 'spec_helper'
RSpec.describe 'getting a package list for a project' do
include GraphqlHelpers
- let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:resource) { create(:project, :repository) }
let_it_be(:current_user) { create(:user) }
- let_it_be(:package) { create(:package, project: project) }
- let_it_be(:maven_package) { create(:maven_package, project: project) }
- let_it_be(:debian_package) { create(:debian_package, project: project) }
- let_it_be(:composer_package) { create(:composer_package, project: project) }
+ let_it_be(:package) { create(:package, project: resource) }
+ let_it_be(:maven_package) { create(:maven_package, project: resource) }
+ let_it_be(:debian_package) { create(:debian_package, project: resource) }
+ let_it_be(:composer_package) { create(:composer_package, project: resource) }
let_it_be(:composer_metadatum) do
create(:composer_metadatum, package: composer_package,
target_sha: 'afdeh',
composer_json: { name: 'x', type: 'y', license: 'z', version: 1 })
end
- let(:package_names) { graphql_data_at(:project, :packages, :edges, :node, :name) }
+ let(:package_names) { graphql_data_at(:project, :packages, :nodes, :name) }
+ let(:target_shas) { graphql_data_at(:project, :packages, :nodes, :metadata, :target_sha) }
+ let(:packages) { graphql_data_at(:project, :packages, :nodes) }
let(:fields) do
<<~QUERY
- edges {
- node {
- #{all_graphql_fields_for('packages'.classify, excluded: ['project'])}
- metadata { #{query_graphql_fragment('ComposerMetadata')} }
- }
+ nodes {
+ #{all_graphql_fields_for('packages'.classify, excluded: ['project'])}
+ metadata { #{query_graphql_fragment('ComposerMetadata')} }
}
QUERY
end
@@ -34,55 +34,10 @@ RSpec.describe 'getting a package list for a project' do
let(:query) do
graphql_query_for(
'project',
- { 'fullPath' => project.full_path },
+ { 'fullPath' => resource.full_path },
query_graphql_field('packages', {}, fields)
)
end
- context 'when user has access to the project' do
- before do
- project.add_reporter(current_user)
- post_graphql(query, current_user: current_user)
- end
-
- it_behaves_like 'a working graphql query'
-
- it 'returns packages successfully' do
- expect(package_names).to contain_exactly(
- package.name,
- maven_package.name,
- debian_package.name,
- composer_package.name
- )
- end
-
- it 'deals with metadata' do
- target_shas = graphql_data_at(:project, :packages, :edges, :node, :metadata, :target_sha)
- expect(target_shas).to contain_exactly(composer_metadatum.target_sha)
- end
- end
-
- context 'when the user does not have access to the project/packages' do
- before do
- post_graphql(query, current_user: current_user)
- end
-
- it_behaves_like 'a working graphql query'
-
- it 'returns nil' do
- expect(graphql_data['project']).to be_nil
- end
- end
-
- context 'when the user is not authenticated' do
- before do
- post_graphql(query)
- end
-
- it_behaves_like 'a working graphql query'
-
- it 'returns nil' do
- expect(graphql_data['project']).to be_nil
- end
- end
+ it_behaves_like 'group and project packages query'
end
diff --git a/spec/requests/api/graphql/project/pipeline_spec.rb b/spec/requests/api/graphql/project/pipeline_spec.rb
index 6179b43629b..cc028ff2ff9 100644
--- a/spec/requests/api/graphql/project/pipeline_spec.rb
+++ b/spec/requests/api/graphql/project/pipeline_spec.rb
@@ -11,10 +11,14 @@ RSpec.describe 'getting pipeline information nested in a project' do
let(:pipeline_graphql_data) { graphql_data['project']['pipeline'] }
let!(:query) do
- graphql_query_for(
- 'project',
- { 'fullPath' => project.full_path },
- query_graphql_field('pipeline', iid: pipeline.iid.to_s)
+ %(
+ query {
+ project(fullPath: "#{project.full_path}") {
+ pipeline(iid: "#{pipeline.iid}") {
+ configSource
+ }
+ }
+ }
)
end
diff --git a/spec/requests/api/graphql/snippets_spec.rb b/spec/requests/api/graphql/snippets_spec.rb
new file mode 100644
index 00000000000..9edd805678a
--- /dev/null
+++ b/spec/requests/api/graphql/snippets_spec.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'snippets' do
+ include GraphqlHelpers
+
+ let_it_be(:current_user) { create(:user) }
+ let_it_be(:snippets) { create_list(:personal_snippet, 3, :repository, author: current_user) }
+
+ describe 'querying for all fields' do
+ let(:query) do
+ graphql_query_for(:snippets, { ids: [global_id_of(snippets.first)] }, <<~SELECT)
+ nodes { #{all_graphql_fields_for('Snippet')} }
+ SELECT
+ end
+
+ it 'can successfully query for snippets and their blobs' do
+ post_graphql(query, current_user: current_user)
+
+ expect(graphql_data_at(:snippets, :nodes)).to be_one
+ expect(graphql_data_at(:snippets, :nodes, :blobs, :nodes)).to be_present
+ end
+ end
+end
diff --git a/spec/requests/api/graphql/usage_trends_measurements_spec.rb b/spec/requests/api/graphql/usage_trends_measurements_spec.rb
new file mode 100644
index 00000000000..69a3ed7e09c
--- /dev/null
+++ b/spec/requests/api/graphql/usage_trends_measurements_spec.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'UsageTrendsMeasurements' do
+ include GraphqlHelpers
+
+ let(:current_user) { create(:user, :admin) }
+ let!(:usage_trends_measurement_1) { create(:usage_trends_measurement, :project_count, recorded_at: 20.days.ago, count: 5) }
+ let!(:usage_trends_measurement_2) { create(:usage_trends_measurement, :project_count, recorded_at: 10.days.ago, count: 10) }
+
+ let(:arguments) { 'identifier: PROJECTS' }
+ let(:query) { graphql_query_for(:UsageTrendsMeasurements, arguments, 'nodes { count identifier }') }
+
+ before do
+ post_graphql(query, current_user: current_user)
+ end
+
+ it 'returns measurement objects' do
+ expect(graphql_data.dig('usageTrendsMeasurements', 'nodes')).to eq([
+ { "count" => 10, 'identifier' => 'PROJECTS' },
+ { "count" => 5, 'identifier' => 'PROJECTS' }
+ ])
+ end
+
+ context 'with recorded_at filters' do
+ let(:arguments) { %(identifier: PROJECTS, recordedAfter: "#{15.days.ago.to_date}", recordedBefore: "#{5.days.ago.to_date}") }
+
+ it 'returns filtered measurement objects' do
+ expect(graphql_data.dig('usageTrendsMeasurements', 'nodes')).to eq([
+ { "count" => 10, 'identifier' => 'PROJECTS' }
+ ])
+ end
+ end
+end
diff --git a/spec/requests/api/helpers_spec.rb b/spec/requests/api/helpers_spec.rb
index 91d10791541..8160a94aef2 100644
--- a/spec/requests/api/helpers_spec.rb
+++ b/spec/requests/api/helpers_spec.rb
@@ -314,14 +314,13 @@ RSpec.describe API::Helpers do
expect(Gitlab::ErrorTracking).to receive(:sentry_dsn).and_return(Gitlab.config.sentry.dsn)
Gitlab::ErrorTracking.configure
- Raven.client.configuration.encoding = 'json'
end
it 'does not report a MethodNotAllowed exception to Sentry' do
exception = Grape::Exceptions::MethodNotAllowed.new({ 'X-GitLab-Test' => '1' })
allow(exception).to receive(:backtrace).and_return(caller)
- expect(Raven).not_to receive(:capture_exception).with(exception)
+ expect(Gitlab::ErrorTracking).not_to receive(:track_exception).with(exception)
handle_api_exception(exception)
end
@@ -330,8 +329,7 @@ RSpec.describe API::Helpers do
exception = RuntimeError.new('test error')
allow(exception).to receive(:backtrace).and_return(caller)
- expect(Raven).to receive(:capture_exception).with(exception, tags:
- a_hash_including(correlation_id: 'new-correlation-id'), extra: {})
+ expect(Gitlab::ErrorTracking).to receive(:track_exception).with(exception)
Labkit::Correlation::CorrelationId.use_id('new-correlation-id') do
handle_api_exception(exception)
@@ -357,20 +355,6 @@ RSpec.describe API::Helpers do
expect(json_response['message']).to start_with("\nRuntimeError (Runtime Error!):")
end
end
-
- context 'extra information' do
- # Sentry events are an array of the form [auth_header, data, options]
- let(:event_data) { Raven.client.transport.events.first[1] }
-
- it 'sends the params, excluding confidential values' do
- expect(ProjectsFinder).to receive(:new).and_raise('Runtime Error!')
-
- get api('/projects', user), params: { password: 'dont_send_this', other_param: 'send_this' }
-
- expect(event_data).to include('other_param=send_this')
- expect(event_data).to include('password=********')
- end
- end
end
describe '.authenticate_non_get!' do
diff --git a/spec/requests/api/invitations_spec.rb b/spec/requests/api/invitations_spec.rb
index 2ea237469b1..98a7aa63b16 100644
--- a/spec/requests/api/invitations_spec.rb
+++ b/spec/requests/api/invitations_spec.rb
@@ -3,14 +3,14 @@
require 'spec_helper'
RSpec.describe API::Invitations do
- let(:maintainer) { create(:user, username: 'maintainer_user') }
- let(:developer) { create(:user) }
- let(:access_requester) { create(:user) }
- let(:stranger) { create(:user) }
+ let_it_be(:maintainer) { create(:user, username: 'maintainer_user') }
+ let_it_be(:developer) { create(:user) }
+ let_it_be(:access_requester) { create(:user) }
+ let_it_be(:stranger) { create(:user) }
let(:email) { 'email1@example.com' }
let(:email2) { 'email2@example.com' }
- let(:project) do
+ let_it_be(:project) do
create(:project, :public, creator_id: maintainer.id, namespace: maintainer.namespace) do |project|
project.add_developer(developer)
project.add_maintainer(maintainer)
@@ -18,7 +18,7 @@ RSpec.describe API::Invitations do
end
end
- let!(:group) do
+ let_it_be(:group, reload: true) do
create(:group, :public) do |group|
group.add_developer(developer)
group.add_owner(maintainer)
@@ -374,4 +374,104 @@ RSpec.describe API::Invitations do
let(:source) { group }
end
end
+
+ shared_examples 'PUT /:source_type/:id/invitations/:email' do |source_type|
+ def update_api(source, user, email)
+ api("/#{source.model_name.plural}/#{source.id}/invitations/#{email}", user)
+ end
+
+ context "with :source_type == #{source_type.pluralize}" do
+ let!(:invite) { invite_member_by_email(source, source_type, developer.email, maintainer) }
+
+ it_behaves_like 'a 404 response when source is private' do
+ let(:route) do
+ put update_api(source, stranger, invite.invite_email), params: { access_level: Member::MAINTAINER }
+ end
+ end
+
+ context 'when authenticated as a non-member or member with insufficient rights' do
+ %i[access_requester stranger].each do |type|
+ context "as a #{type}" do
+ it 'returns 403' do
+ user = public_send(type)
+
+ put update_api(source, user, invite.invite_email), params: { access_level: Member::MAINTAINER }
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
+ end
+ end
+ end
+
+ context 'when authenticated as a maintainer/owner' do
+ context 'updating access level' do
+ it 'updates the invitation' do
+ put update_api(source, maintainer, invite.invite_email), params: { access_level: Member::MAINTAINER }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['access_level']).to eq(Member::MAINTAINER)
+ expect(invite.reload.access_level).to eq(Member::MAINTAINER)
+ end
+ end
+
+ it 'returns 409 if member does not exist' do
+ put update_api(source, maintainer, non_existing_record_id), params: { access_level: Member::MAINTAINER }
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+
+ it 'returns 400 when access_level is not given and there are no other params' do
+ put update_api(source, maintainer, invite.invite_email)
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ end
+
+ it 'returns 400 when access level is not valid' do
+ put update_api(source, maintainer, invite.invite_email), params: { access_level: non_existing_record_access_level }
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ end
+ end
+
+ context 'updating access expiry date' do
+ subject do
+ put update_api(source, maintainer, invite.invite_email), params: { expires_at: expires_at }
+ end
+
+ context 'when set to a date in the past' do
+ let(:expires_at) { 2.days.ago.to_date }
+
+ it 'does not update the member' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['message']).to eq({ 'expires_at' => ['cannot be a date in the past'] })
+ end
+ end
+
+ context 'when set to a date in the future' do
+ let(:expires_at) { 2.days.from_now.to_date }
+
+ it 'updates the member' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['expires_at']).to eq(expires_at.to_s)
+ end
+ end
+ end
+ end
+ end
+
+ describe 'PUT /projects/:id/invitations' do
+ it_behaves_like 'PUT /:source_type/:id/invitations/:email', 'project' do
+ let(:source) { project }
+ end
+ end
+
+ describe 'PUT /groups/:id/invitations' do
+ it_behaves_like 'PUT /:source_type/:id/invitations/:email', 'group' do
+ let(:source) { group }
+ end
+ end
end
diff --git a/spec/requests/api/jobs_spec.rb b/spec/requests/api/jobs_spec.rb
index 1c43ef25f14..a21482c2874 100644
--- a/spec/requests/api/jobs_spec.rb
+++ b/spec/requests/api/jobs_spec.rb
@@ -3,6 +3,9 @@
require 'spec_helper'
RSpec.describe API::Jobs do
+ include HttpBasicAuthHelpers
+ include DependencyProxyHelpers
+
using RSpec::Parameterized::TableSyntax
include HttpIOHelpers
@@ -16,20 +19,150 @@ RSpec.describe API::Jobs do
ref: project.default_branch)
end
- let!(:job) do
- create(:ci_build, :success, :tags, pipeline: pipeline,
- artifacts_expire_at: 1.day.since)
- end
-
let(:user) { create(:user) }
let(:api_user) { user }
let(:reporter) { create(:project_member, :reporter, project: project).user }
let(:guest) { create(:project_member, :guest, project: project).user }
+ let(:running_job) do
+ create(:ci_build, :running, project: project,
+ user: user,
+ pipeline: pipeline,
+ artifacts_expire_at: 1.day.since)
+ end
+
+ let!(:job) do
+ create(:ci_build, :success, :tags, pipeline: pipeline,
+ artifacts_expire_at: 1.day.since)
+ end
+
before do
project.add_developer(user)
end
+ shared_examples 'returns common pipeline data' do
+ it 'returns common pipeline data' do
+ expect(json_response['pipeline']).not_to be_empty
+ expect(json_response['pipeline']['id']).to eq jobx.pipeline.id
+ expect(json_response['pipeline']['ref']).to eq jobx.pipeline.ref
+ expect(json_response['pipeline']['sha']).to eq jobx.pipeline.sha
+ expect(json_response['pipeline']['status']).to eq jobx.pipeline.status
+ end
+ end
+
+ shared_examples 'returns common job data' do
+ it 'returns common job data' do
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['id']).to eq(jobx.id)
+ expect(json_response['status']).to eq(jobx.status)
+ expect(json_response['stage']).to eq(jobx.stage)
+ expect(json_response['name']).to eq(jobx.name)
+ expect(json_response['ref']).to eq(jobx.ref)
+ expect(json_response['tag']).to eq(jobx.tag)
+ expect(json_response['coverage']).to eq(jobx.coverage)
+ expect(json_response['allow_failure']).to eq(jobx.allow_failure)
+ expect(Time.parse(json_response['created_at'])).to be_like_time(jobx.created_at)
+ expect(Time.parse(json_response['started_at'])).to be_like_time(jobx.started_at)
+ expect(Time.parse(json_response['artifacts_expire_at'])).to be_like_time(jobx.artifacts_expire_at)
+ expect(json_response['artifacts_file']).to be_nil
+ expect(json_response['artifacts']).to be_an Array
+ expect(json_response['artifacts']).to be_empty
+ expect(json_response['web_url']).to be_present
+ end
+ end
+
+ shared_examples 'returns unauthorized' do
+ it 'returns unauthorized' do
+ expect(response).to have_gitlab_http_status(:unauthorized)
+ end
+ end
+
+ describe 'GET /job' do
+ shared_context 'with auth headers' do
+ let(:headers_with_token) { header }
+ let(:params_with_token) { {} }
+ end
+
+ shared_context 'with auth params' do
+ let(:headers_with_token) { {} }
+ let(:params_with_token) { param }
+ end
+
+ shared_context 'without auth' do
+ let(:headers_with_token) { {} }
+ let(:params_with_token) { {} }
+ end
+
+ before do |example|
+ unless example.metadata[:skip_before_request]
+ get api('/job'), headers: headers_with_token, params: params_with_token
+ end
+ end
+
+ context 'with job token authentication header' do
+ include_context 'with auth headers' do
+ let(:header) { { API::Helpers::Runner::JOB_TOKEN_HEADER => running_job.token } }
+ end
+
+ it_behaves_like 'returns common job data' do
+ let(:jobx) { running_job }
+ end
+
+ it 'returns specific job data' do
+ expect(json_response['finished_at']).to be_nil
+ end
+
+ it_behaves_like 'returns common pipeline data' do
+ let(:jobx) { running_job }
+ end
+ end
+
+ context 'with job token authentication params' do
+ include_context 'with auth params' do
+ let(:param) { { job_token: running_job.token } }
+ end
+
+ it_behaves_like 'returns common job data' do
+ let(:jobx) { running_job }
+ end
+
+ it 'returns specific job data' do
+ expect(json_response['finished_at']).to be_nil
+ end
+
+ it_behaves_like 'returns common pipeline data' do
+ let(:jobx) { running_job }
+ end
+ end
+
+ context 'with non running job' do
+ include_context 'with auth headers' do
+ let(:header) { { API::Helpers::Runner::JOB_TOKEN_HEADER => job.token } }
+ end
+
+ it_behaves_like 'returns unauthorized'
+ end
+
+ context 'with basic auth header' do
+ let(:personal_access_token) { create(:personal_access_token, user: user) }
+ let(:token) { personal_access_token.token}
+
+ include_context 'with auth headers' do
+ let(:header) { { Gitlab::Auth::AuthFinders::PRIVATE_TOKEN_HEADER => token } }
+ end
+
+ it 'does not return a job' do
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
+ context 'without authentication' do
+ include_context 'without auth'
+
+ it_behaves_like 'returns unauthorized'
+ end
+ end
+
describe 'GET /projects/:id/jobs' do
let(:query) { {} }
@@ -150,39 +283,21 @@ RSpec.describe API::Jobs do
end
context 'authorized user' do
+ it_behaves_like 'returns common job data' do
+ let(:jobx) { job }
+ end
+
it 'returns specific job data' do
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response['id']).to eq(job.id)
- expect(json_response['status']).to eq(job.status)
- expect(json_response['stage']).to eq(job.stage)
- expect(json_response['name']).to eq(job.name)
- expect(json_response['ref']).to eq(job.ref)
- expect(json_response['tag']).to eq(job.tag)
- expect(json_response['coverage']).to eq(job.coverage)
- expect(json_response['allow_failure']).to eq(job.allow_failure)
- expect(Time.parse(json_response['created_at'])).to be_like_time(job.created_at)
- expect(Time.parse(json_response['started_at'])).to be_like_time(job.started_at)
expect(Time.parse(json_response['finished_at'])).to be_like_time(job.finished_at)
- expect(Time.parse(json_response['artifacts_expire_at'])).to be_like_time(job.artifacts_expire_at)
- expect(json_response['artifacts_file']).to be_nil
- expect(json_response['artifacts']).to be_an Array
- expect(json_response['artifacts']).to be_empty
expect(json_response['duration']).to eq(job.duration)
- expect(json_response['web_url']).to be_present
end
it_behaves_like 'a job with artifacts and trace', result_is_array: false do
let(:api_endpoint) { "/projects/#{project.id}/jobs/#{second_job.id}" }
end
- it 'returns pipeline data' do
- json_job = json_response
-
- expect(json_job['pipeline']).not_to be_empty
- expect(json_job['pipeline']['id']).to eq job.pipeline.id
- expect(json_job['pipeline']['ref']).to eq job.pipeline.ref
- expect(json_job['pipeline']['sha']).to eq job.pipeline.sha
- expect(json_job['pipeline']['status']).to eq job.pipeline.status
+ it_behaves_like 'returns common pipeline data' do
+ let(:jobx) { job }
end
end
@@ -329,6 +444,17 @@ RSpec.describe API::Jobs do
.to include('Content-Type' => 'application/json',
'Gitlab-Workhorse-Send-Data' => /artifacts-entry/)
end
+
+ context 'when artifacts are locked' do
+ it 'allows access to expired artifact' do
+ pipeline.artifacts_locked!
+ job.update!(artifacts_expire_at: Time.now - 7.days)
+
+ get_artifact_file(artifact)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
end
end
diff --git a/spec/requests/api/lint_spec.rb b/spec/requests/api/lint_spec.rb
index b5bf697e9e3..cf8cac773f5 100644
--- a/spec/requests/api/lint_spec.rb
+++ b/spec/requests/api/lint_spec.rb
@@ -406,6 +406,24 @@ RSpec.describe API::Lint do
end
end
+ context 'with an empty repository' do
+ let_it_be(:empty_project) { create(:project_empty_repo) }
+ let_it_be(:yaml_content) do
+ File.read(Rails.root.join('spec/support/gitlab_stubs/gitlab_ci.yml'))
+ end
+
+ before do
+ empty_project.add_developer(api_user)
+ end
+
+ it 'passes validation without errors' do
+ post api("/projects/#{empty_project.id}/ci/lint", api_user), params: { content: yaml_content }
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['valid']).to eq(true)
+ expect(json_response['errors']).to eq([])
+ end
+ end
+
context 'when unauthenticated' do
let_it_be(:api_user) { nil }
diff --git a/spec/requests/api/merge_requests_spec.rb b/spec/requests/api/merge_requests_spec.rb
index ad8e21bf4c1..09177dd1710 100644
--- a/spec/requests/api/merge_requests_spec.rb
+++ b/spec/requests/api/merge_requests_spec.rb
@@ -2537,7 +2537,7 @@ RSpec.describe API::MergeRequests do
end
end
- describe "the should_remove_source_branch param" do
+ describe "the should_remove_source_branch param", :sidekiq_inline do
let(:source_repository) { merge_request.source_project.repository }
let(:source_branch) { merge_request.source_branch }
@@ -2552,7 +2552,7 @@ RSpec.describe API::MergeRequests do
end
end
- context "with a merge request that has force_remove_source_branch enabled" do
+ context "with a merge request that has force_remove_source_branch enabled", :sidekiq_inline do
let(:source_repository) { merge_request.source_project.repository }
let(:source_branch) { merge_request.source_branch }
diff --git a/spec/requests/api/npm_instance_packages_spec.rb b/spec/requests/api/npm_instance_packages_spec.rb
index 70c76067a6e..698885ddcf4 100644
--- a/spec/requests/api/npm_instance_packages_spec.rb
+++ b/spec/requests/api/npm_instance_packages_spec.rb
@@ -3,6 +3,11 @@
require 'spec_helper'
RSpec.describe API::NpmInstancePackages do
+ # We need to create a subgroup with the same name as the hosting group.
+ # It has to be created first to exhibit this bug: https://gitlab.com/gitlab-org/gitlab/-/issues/321958
+ let_it_be(:another_namespace) { create(:group, :public) }
+ let_it_be(:similarly_named_group) { create(:group, :public, parent: another_namespace, name: 'test-group') }
+
include_context 'npm api setup'
describe 'GET /api/v4/packages/npm/*package_name' do
diff --git a/spec/requests/api/npm_project_packages_spec.rb b/spec/requests/api/npm_project_packages_spec.rb
index 7ea238c0607..e64b5ddc374 100644
--- a/spec/requests/api/npm_project_packages_spec.rb
+++ b/spec/requests/api/npm_project_packages_spec.rb
@@ -30,7 +30,7 @@ RSpec.describe API::NpmProjectPackages do
end
describe 'GET /api/v4/projects/:id/packages/npm/*package_name/-/*file_name' do
- let_it_be(:package_file) { package.package_files.first }
+ let(:package_file) { package.package_files.first }
let(:headers) { {} }
let(:url) { api("/projects/#{project.id}/packages/npm/#{package.name}/-/#{package_file.file_name}") }
@@ -127,24 +127,6 @@ RSpec.describe API::NpmProjectPackages do
context 'when params are correct' do
context 'invalid package record' do
- context 'unscoped package' do
- let(:package_name) { 'my_unscoped_package' }
- let(:params) { upload_params(package_name: package_name) }
-
- it_behaves_like 'handling invalid record with 400 error'
-
- context 'with empty versions' do
- let(:params) { upload_params(package_name: package_name).merge!(versions: {}) }
-
- it 'throws a 400 error' do
- expect { upload_package_with_token(package_name, params) }
- .not_to change { project.packages.count }
-
- expect(response).to have_gitlab_http_status(:bad_request)
- end
- end
- end
-
context 'invalid package name' do
let(:package_name) { "@#{group.path}/my_inv@@lid_package_name" }
let(:params) { upload_params(package_name: package_name) }
@@ -175,52 +157,71 @@ RSpec.describe API::NpmProjectPackages do
end
end
- context 'scoped package' do
- let(:package_name) { "@#{group.path}/my_package_name" }
+ context 'valid package record' do
let(:params) { upload_params(package_name: package_name) }
- context 'with access token' do
- subject { upload_package_with_token(package_name, params) }
+ shared_examples 'handling upload with different authentications' do
+ context 'with access token' do
+ subject { upload_package_with_token(package_name, params) }
+
+ it_behaves_like 'a package tracking event', 'API::NpmPackages', 'push_package'
+
+ it 'creates npm package with file' do
+ expect { subject }
+ .to change { project.packages.count }.by(1)
+ .and change { Packages::PackageFile.count }.by(1)
+ .and change { Packages::Tag.count }.by(1)
- it_behaves_like 'a package tracking event', 'API::NpmPackages', 'push_package'
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
- it 'creates npm package with file' do
- expect { subject }
+ it 'creates npm package with file with job token' do
+ expect { upload_package_with_job_token(package_name, params) }
.to change { project.packages.count }.by(1)
.and change { Packages::PackageFile.count }.by(1)
- .and change { Packages::Tag.count }.by(1)
expect(response).to have_gitlab_http_status(:ok)
end
- end
- it 'creates npm package with file with job token' do
- expect { upload_package_with_job_token(package_name, params) }
- .to change { project.packages.count }.by(1)
- .and change { Packages::PackageFile.count }.by(1)
+ context 'with an authenticated job token' do
+ let!(:job) { create(:ci_build, user: user) }
- expect(response).to have_gitlab_http_status(:ok)
- end
+ before do
+ Grape::Endpoint.before_each do |endpoint|
+ expect(endpoint).to receive(:current_authenticated_job) { job }
+ end
+ end
- context 'with an authenticated job token' do
- let!(:job) { create(:ci_build, user: user) }
+ after do
+ Grape::Endpoint.before_each nil
+ end
- before do
- Grape::Endpoint.before_each do |endpoint|
- expect(endpoint).to receive(:current_authenticated_job) { job }
+ it 'creates the package metadata' do
+ upload_package_with_token(package_name, params)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(project.reload.packages.find(json_response['id']).original_build_info.pipeline).to eq job.pipeline
end
end
+ end
- after do
- Grape::Endpoint.before_each nil
- end
+ context 'with a scoped name' do
+ let(:package_name) { "@#{group.path}/my_package_name" }
- it 'creates the package metadata' do
- upload_package_with_token(package_name, params)
+ it_behaves_like 'handling upload with different authentications'
+ end
- expect(response).to have_gitlab_http_status(:ok)
- expect(project.reload.packages.find(json_response['id']).original_build_info.pipeline).to eq job.pipeline
- end
+ context 'with any scoped name' do
+ let(:package_name) { "@any_scope/my_package_name" }
+
+ it_behaves_like 'handling upload with different authentications'
+ end
+
+ context 'with an unscoped name' do
+ let(:package_name) { "my_unscoped_package_name" }
+
+ it_behaves_like 'handling upload with different authentications'
end
end
diff --git a/spec/requests/api/oauth_tokens_spec.rb b/spec/requests/api/oauth_tokens_spec.rb
index 52c7408545f..edadfbc3d0c 100644
--- a/spec/requests/api/oauth_tokens_spec.rb
+++ b/spec/requests/api/oauth_tokens_spec.rb
@@ -27,13 +27,13 @@ RSpec.describe 'OAuth tokens' do
context 'when user does not have 2FA enabled' do
context 'when no client credentials provided' do
- it 'does not create an access token' do
+ it 'creates an access token' do
user = create(:user)
request_oauth_token(user)
- expect(response).to have_gitlab_http_status(:unauthorized)
- expect(json_response['access_token']).to be_nil
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['access_token']).to be_present
end
end
@@ -51,6 +51,8 @@ RSpec.describe 'OAuth tokens' do
context 'with invalid credentials' do
it 'does not create an access token' do
+ pending 'Enable this example after https://github.com/doorkeeper-gem/doorkeeper/pull/1488 is merged and released'
+
user = create(:user)
request_oauth_token(user, basic_auth_header(client.uid, 'invalid secret'))
diff --git a/spec/requests/api/project_attributes.yml b/spec/requests/api/project_attributes.yml
index 181fcafd577..6c9a845b217 100644
--- a/spec/requests/api/project_attributes.yml
+++ b/spec/requests/api/project_attributes.yml
@@ -12,7 +12,6 @@ itself: # project
- import_source
- import_type
- import_url
- - issues_template
- jobs_cache_index
- last_repository_check_at
- last_repository_check_failed
@@ -24,7 +23,6 @@ itself: # project
- merge_requests_author_approval
- merge_requests_disable_committers_approval
- merge_requests_rebase_enabled
- - merge_requests_template
- mirror_last_successful_update_at
- mirror_last_update_at
- mirror_overwrites_diverged_branches
@@ -56,6 +54,7 @@ itself: # project
- can_create_merge_request_in
- compliance_frameworks
- container_expiration_policy
+ - container_registry_image_prefix
- default_branch
- empty_repo
- forks_count
@@ -117,6 +116,7 @@ project_feature:
- project_id
- requirements_access_level
- security_and_compliance_access_level
+ - container_registry_access_level
- updated_at
computed_attributes:
- issues_enabled
@@ -139,6 +139,7 @@ project_setting:
- show_default_award_emojis
- squash_option
- updated_at
+ - cve_id_request_enabled
build_service_desk_setting: # service_desk_setting
unexposed_attributes:
diff --git a/spec/requests/api/project_packages_spec.rb b/spec/requests/api/project_packages_spec.rb
index 1f3887cab8a..97414b3b18a 100644
--- a/spec/requests/api/project_packages_spec.rb
+++ b/spec/requests/api/project_packages_spec.rb
@@ -257,6 +257,10 @@ RSpec.describe API::ProjectPackages do
context 'project is private' do
let(:project) { create(:project, :private) }
+ before do
+ expect(::Packages::Maven::Metadata::SyncWorker).not_to receive(:perform_async)
+ end
+
it 'returns 404 for non authenticated user' do
delete api(package_url)
@@ -301,6 +305,19 @@ RSpec.describe API::ProjectPackages do
expect(response).to have_gitlab_http_status(:no_content)
end
end
+
+ context 'with a maven package' do
+ let_it_be(:package1) { create(:maven_package, project: project) }
+
+ it 'enqueues a sync worker job' do
+ project.add_maintainer(user)
+
+ expect(::Packages::Maven::Metadata::SyncWorker)
+ .to receive(:perform_async).with(user.id, project.id, package1.name)
+
+ delete api(package_url, user)
+ end
+ end
end
end
end
diff --git a/spec/requests/api/project_repository_storage_moves_spec.rb b/spec/requests/api/project_repository_storage_moves_spec.rb
index 5e200312d1f..b40645ba2de 100644
--- a/spec/requests/api/project_repository_storage_moves_spec.rb
+++ b/spec/requests/api/project_repository_storage_moves_spec.rb
@@ -7,6 +7,6 @@ RSpec.describe API::ProjectRepositoryStorageMoves do
let_it_be(:container) { create(:project, :repository).tap { |project| project.track_project_repository } }
let_it_be(:storage_move) { create(:project_repository_storage_move, :scheduled, container: container) }
let(:repository_storage_move_factory) { :project_repository_storage_move }
- let(:bulk_worker_klass) { ProjectScheduleBulkRepositoryShardMovesWorker }
+ let(:bulk_worker_klass) { Projects::ScheduleBulkRepositoryShardMovesWorker }
end
end
diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb
index ad36777184a..d2a33e32b30 100644
--- a/spec/requests/api/projects_spec.rb
+++ b/spec/requests/api/projects_spec.rb
@@ -1478,6 +1478,120 @@ RSpec.describe API::Projects do
end
end
+ describe "GET /projects/:id/groups" do
+ let_it_be(:root_group) { create(:group, :public, name: 'root group') }
+ let_it_be(:project_group) { create(:group, :public, parent: root_group, name: 'project group') }
+ let_it_be(:shared_group_with_dev_access) { create(:group, :private, parent: root_group, name: 'shared group') }
+ let_it_be(:shared_group_with_reporter_access) { create(:group, :private) }
+ let_it_be(:private_project) { create(:project, :private, group: project_group) }
+ let_it_be(:public_project) { create(:project, :public, group: project_group) }
+
+ before_all do
+ create(:project_group_link, :developer, group: shared_group_with_dev_access, project: private_project)
+ create(:project_group_link, :reporter, group: shared_group_with_reporter_access, project: private_project)
+ end
+
+ shared_examples_for 'successful groups response' do
+ it 'returns an array of groups' do
+ request
+
+ aggregate_failures do
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to include_pagination_headers
+ expect(json_response).to be_an Array
+ expect(json_response.map { |g| g['name'] }).to match_array(expected_groups.map(&:name))
+ end
+ end
+ end
+
+ context 'when unauthenticated' do
+ it 'does not return groups for private projects' do
+ get api("/projects/#{private_project.id}/groups")
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+
+ context 'for public projects' do
+ let(:request) { get api("/projects/#{public_project.id}/groups") }
+
+ it_behaves_like 'successful groups response' do
+ let(:expected_groups) { [root_group, project_group] }
+ end
+ end
+ end
+
+ context 'when authenticated as user' do
+ context 'when user does not have access to the project' do
+ it 'does not return groups' do
+ get api("/projects/#{private_project.id}/groups", user)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
+ context 'when user has access to the project' do
+ let(:request) { get api("/projects/#{private_project.id}/groups", user), params: params }
+ let(:params) { {} }
+
+ before do
+ private_project.add_developer(user)
+ end
+
+ it_behaves_like 'successful groups response' do
+ let(:expected_groups) { [root_group, project_group] }
+ end
+
+ context 'when search by root group name' do
+ let(:params) { { search: 'root' } }
+
+ it_behaves_like 'successful groups response' do
+ let(:expected_groups) { [root_group] }
+ end
+ end
+
+ context 'with_shared option is on' do
+ let(:params) { { with_shared: true } }
+
+ it_behaves_like 'successful groups response' do
+ let(:expected_groups) { [root_group, project_group, shared_group_with_dev_access, shared_group_with_reporter_access] }
+ end
+
+ context 'when shared_min_access_level is set' do
+ let(:params) { super().merge(shared_min_access_level: Gitlab::Access::DEVELOPER) }
+
+ it_behaves_like 'successful groups response' do
+ let(:expected_groups) { [root_group, project_group, shared_group_with_dev_access] }
+ end
+ end
+
+ context 'when search by shared group name' do
+ let(:params) { super().merge(search: 'shared') }
+
+ it_behaves_like 'successful groups response' do
+ let(:expected_groups) { [shared_group_with_dev_access] }
+ end
+ end
+
+ context 'when skip_groups is set' do
+ let(:params) { super().merge(skip_groups: [shared_group_with_dev_access.id, root_group.id]) }
+
+ it_behaves_like 'successful groups response' do
+ let(:expected_groups) { [shared_group_with_reporter_access, project_group] }
+ end
+ end
+ end
+ end
+ end
+
+ context 'when authenticated as admin' do
+ let(:request) { get api("/projects/#{private_project.id}/groups", admin) }
+
+ it_behaves_like 'successful groups response' do
+ let(:expected_groups) { [root_group, project_group] }
+ end
+ end
+ end
+
describe 'GET /projects/:id' do
context 'when unauthenticated' do
it 'does not return private projects' do
@@ -1540,6 +1654,10 @@ RSpec.describe API::Projects do
end
context 'when authenticated as an admin' do
+ before do
+ stub_container_registry_config(enabled: true, host_port: 'registry.example.org:5000')
+ end
+
let(:project_attributes_file) { 'spec/requests/api/project_attributes.yml' }
let(:project_attributes) { YAML.load_file(project_attributes_file) }
@@ -1563,13 +1681,15 @@ RSpec.describe API::Projects do
mirror
requirements_enabled
security_and_compliance_enabled
+ issues_template
+ merge_requests_template
]
end
keys
end
- it 'returns a project by id' do
+ it 'returns a project by id', :aggregate_failures do
project
project_member
group = create(:group)
@@ -1587,6 +1707,7 @@ RSpec.describe API::Projects do
expect(json_response['ssh_url_to_repo']).to be_present
expect(json_response['http_url_to_repo']).to be_present
expect(json_response['web_url']).to be_present
+ expect(json_response['container_registry_image_prefix']).to eq("registry.example.org:5000/#{project.full_path}")
expect(json_response['owner']).to be_a Hash
expect(json_response['name']).to eq(project.name)
expect(json_response['path']).to be_present
@@ -1644,9 +1765,10 @@ RSpec.describe API::Projects do
before do
project
project_member
+ stub_container_registry_config(enabled: true, host_port: 'registry.example.org:5000')
end
- it 'returns a project by id' do
+ it 'returns a project by id', :aggregate_failures do
group = create(:group)
link = create(:project_group_link, project: project, group: group)
@@ -1662,6 +1784,7 @@ RSpec.describe API::Projects do
expect(json_response['ssh_url_to_repo']).to be_present
expect(json_response['http_url_to_repo']).to be_present
expect(json_response['web_url']).to be_present
+ expect(json_response['container_registry_image_prefix']).to eq("registry.example.org:5000/#{project.full_path}")
expect(json_response['owner']).to be_a Hash
expect(json_response['name']).to eq(project.name)
expect(json_response['path']).to be_present
@@ -2818,7 +2941,7 @@ RSpec.describe API::Projects do
Sidekiq::Testing.fake! do
put(api("/projects/#{new_project.id}", user), params: { repository_storage: unknown_storage, issues_enabled: false })
end
- end.not_to change(ProjectUpdateRepositoryStorageWorker.jobs, :size)
+ end.not_to change(Projects::UpdateRepositoryStorageWorker.jobs, :size)
expect(response).to have_gitlab_http_status(:ok)
expect(json_response['issues_enabled']).to eq(false)
@@ -2845,7 +2968,7 @@ RSpec.describe API::Projects do
Sidekiq::Testing.fake! do
put(api("/projects/#{new_project.id}", admin), params: { repository_storage: 'test_second_storage' })
end
- end.to change(ProjectUpdateRepositoryStorageWorker.jobs, :size).by(1)
+ end.to change(Projects::UpdateRepositoryStorageWorker.jobs, :size).by(1)
expect(response).to have_gitlab_http_status(:ok)
end
diff --git a/spec/requests/api/protected_branches_spec.rb b/spec/requests/api/protected_branches_spec.rb
index 8bcd493eb1f..6b1aa576167 100644
--- a/spec/requests/api/protected_branches_spec.rb
+++ b/spec/requests/api/protected_branches_spec.rb
@@ -68,6 +68,7 @@ RSpec.describe API::ProtectedBranches do
expect(response).to have_gitlab_http_status(:ok)
expect(json_response['name']).to eq(branch_name)
+ expect(json_response['allow_force_push']).to eq(false)
expect(json_response['push_access_levels'][0]['access_level']).to eq(::Gitlab::Access::MAINTAINER)
expect(json_response['merge_access_levels'][0]['access_level']).to eq(::Gitlab::Access::MAINTAINER)
end
@@ -132,6 +133,7 @@ RSpec.describe API::ProtectedBranches do
expect(response).to have_gitlab_http_status(:created)
expect(json_response['name']).to eq(branch_name)
+ expect(json_response['allow_force_push']).to eq(false)
expect(json_response['push_access_levels'][0]['access_level']).to eq(Gitlab::Access::MAINTAINER)
expect(json_response['merge_access_levels'][0]['access_level']).to eq(Gitlab::Access::MAINTAINER)
end
@@ -141,6 +143,7 @@ RSpec.describe API::ProtectedBranches do
expect(response).to have_gitlab_http_status(:created)
expect(json_response['name']).to eq(branch_name)
+ expect(json_response['allow_force_push']).to eq(false)
expect(json_response['push_access_levels'][0]['access_level']).to eq(Gitlab::Access::DEVELOPER)
expect(json_response['merge_access_levels'][0]['access_level']).to eq(Gitlab::Access::MAINTAINER)
end
@@ -150,6 +153,7 @@ RSpec.describe API::ProtectedBranches do
expect(response).to have_gitlab_http_status(:created)
expect(json_response['name']).to eq(branch_name)
+ expect(json_response['allow_force_push']).to eq(false)
expect(json_response['push_access_levels'][0]['access_level']).to eq(Gitlab::Access::MAINTAINER)
expect(json_response['merge_access_levels'][0]['access_level']).to eq(Gitlab::Access::DEVELOPER)
end
@@ -159,6 +163,7 @@ RSpec.describe API::ProtectedBranches do
expect(response).to have_gitlab_http_status(:created)
expect(json_response['name']).to eq(branch_name)
+ expect(json_response['allow_force_push']).to eq(false)
expect(json_response['push_access_levels'][0]['access_level']).to eq(Gitlab::Access::DEVELOPER)
expect(json_response['merge_access_levels'][0]['access_level']).to eq(Gitlab::Access::DEVELOPER)
end
@@ -168,6 +173,7 @@ RSpec.describe API::ProtectedBranches do
expect(response).to have_gitlab_http_status(:created)
expect(json_response['name']).to eq(branch_name)
+ expect(json_response['allow_force_push']).to eq(false)
expect(json_response['push_access_levels'][0]['access_level']).to eq(Gitlab::Access::NO_ACCESS)
expect(json_response['merge_access_levels'][0]['access_level']).to eq(Gitlab::Access::MAINTAINER)
end
@@ -177,6 +183,7 @@ RSpec.describe API::ProtectedBranches do
expect(response).to have_gitlab_http_status(:created)
expect(json_response['name']).to eq(branch_name)
+ expect(json_response['allow_force_push']).to eq(false)
expect(json_response['push_access_levels'][0]['access_level']).to eq(Gitlab::Access::MAINTAINER)
expect(json_response['merge_access_levels'][0]['access_level']).to eq(Gitlab::Access::NO_ACCESS)
end
@@ -186,10 +193,21 @@ RSpec.describe API::ProtectedBranches do
expect(response).to have_gitlab_http_status(:created)
expect(json_response['name']).to eq(branch_name)
+ expect(json_response['allow_force_push']).to eq(false)
expect(json_response['push_access_levels'][0]['access_level']).to eq(Gitlab::Access::NO_ACCESS)
expect(json_response['merge_access_levels'][0]['access_level']).to eq(Gitlab::Access::NO_ACCESS)
end
+ it 'protects a single branch and allows force pushes' do
+ post post_endpoint, params: { name: branch_name, allow_force_push: true }
+
+ expect(response).to have_gitlab_http_status(:created)
+ expect(json_response['name']).to eq(branch_name)
+ expect(json_response['allow_force_push']).to eq(true)
+ expect(json_response['push_access_levels'][0]['access_level']).to eq(Gitlab::Access::MAINTAINER)
+ expect(json_response['merge_access_levels'][0]['access_level']).to eq(Gitlab::Access::MAINTAINER)
+ end
+
it 'returns a 409 error if the same branch is protected twice' do
post post_endpoint, params: { name: protected_name }
diff --git a/spec/requests/api/repositories_spec.rb b/spec/requests/api/repositories_spec.rb
index ace73e49c7c..31f0d7cec2a 100644
--- a/spec/requests/api/repositories_spec.rb
+++ b/spec/requests/api/repositories_spec.rb
@@ -650,6 +650,40 @@ RSpec.describe API::Repositories do
expect(response).to have_gitlab_http_status(:ok)
end
+ it 'supports leaving out the from and to attribute' do
+ spy = instance_spy(Repositories::ChangelogService)
+
+ allow(Repositories::ChangelogService)
+ .to receive(:new)
+ .with(
+ project,
+ user,
+ version: '1.0.0',
+ date: DateTime.new(2020, 1, 1),
+ branch: 'kittens',
+ trailer: 'Foo',
+ file: 'FOO.md',
+ message: 'Commit message'
+ )
+ .and_return(spy)
+
+ expect(spy).to receive(:execute)
+
+ post(
+ api("/projects/#{project.id}/repository/changelog", user),
+ params: {
+ version: '1.0.0',
+ date: '2020-01-01',
+ branch: 'kittens',
+ trailer: 'Foo',
+ file: 'FOO.md',
+ message: 'Commit message'
+ }
+ )
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+
it 'produces an error when generating the changelog fails' do
spy = instance_spy(Repositories::ChangelogService)
diff --git a/spec/requests/api/resource_access_tokens_spec.rb b/spec/requests/api/resource_access_tokens_spec.rb
index 9fd7eb2177d..79549bfc5e0 100644
--- a/spec/requests/api/resource_access_tokens_spec.rb
+++ b/spec/requests/api/resource_access_tokens_spec.rb
@@ -30,6 +30,18 @@ RSpec.describe API::ResourceAccessTokens do
expect(token_ids).to match_array(access_tokens.pluck(:id))
end
+ it "exposes the correct token information", :aggregate_failures do
+ get_tokens
+
+ token = access_tokens.last
+ api_get_token = json_response.last
+
+ expect(api_get_token["name"]).to eq(token.name)
+ expect(api_get_token["scopes"]).to eq(token.scopes)
+ expect(api_get_token["expires_at"]).to eq(token.expires_at.to_date.iso8601)
+ expect(api_get_token).not_to have_key('token')
+ end
+
context "when using a project access token to GET other project access tokens" do
let_it_be(:token) { access_tokens.first }
@@ -182,13 +194,13 @@ RSpec.describe API::ResourceAccessTokens do
end
describe "POST projects/:id/access_tokens" do
- let_it_be(:params) { { name: "test", scopes: ["api"], expires_at: Date.today + 1.month } }
+ let(:params) { { name: "test", scopes: ["api"], expires_at: expires_at } }
+ let(:expires_at) { 1.month.from_now }
subject(:create_token) { post api("/projects/#{project_id}/access_tokens", user), params: params }
context "when the user has maintainer permissions" do
let_it_be(:project_id) { project.id }
- let_it_be(:expires_at) { 1.month.from_now }
before do
project.add_maintainer(user)
@@ -203,11 +215,12 @@ RSpec.describe API::ResourceAccessTokens do
expect(json_response["name"]).to eq("test")
expect(json_response["scopes"]).to eq(["api"])
expect(json_response["expires_at"]).to eq(expires_at.to_date.iso8601)
+ expect(json_response["token"]).to be_present
end
end
context "when 'expires_at' is not set" do
- let_it_be(:params) { { name: "test", scopes: ["api"] } }
+ let(:expires_at) { nil }
it "creates a project access token with the params", :aggregate_failures do
create_token
diff --git a/spec/requests/api/rubygem_packages_spec.rb b/spec/requests/api/rubygem_packages_spec.rb
index 5dd68bf9b10..d6ad8186063 100644
--- a/spec/requests/api/rubygem_packages_spec.rb
+++ b/spec/requests/api/rubygem_packages_spec.rb
@@ -3,9 +3,11 @@
require 'spec_helper'
RSpec.describe API::RubygemPackages do
+ include PackagesManagerApiSpecHelpers
+ include WorkhorseHelpers
using RSpec::Parameterized::TableSyntax
- let_it_be(:project) { create(:project) }
+ let_it_be_with_reload(:project) { create(:project) }
let_it_be(:personal_access_token) { create(:personal_access_token) }
let_it_be(:user) { personal_access_token.user }
let_it_be(:job) { create(:ci_build, :running, user: user) }
@@ -13,6 +15,14 @@ RSpec.describe API::RubygemPackages do
let_it_be(:project_deploy_token) { create(:project_deploy_token, deploy_token: deploy_token, project: project) }
let_it_be(:headers) { {} }
+ let(:tokens) do
+ {
+ personal_access_token: personal_access_token.token,
+ deploy_token: deploy_token.token,
+ job_token: job.token
+ }
+ end
+
shared_examples 'when feature flag is disabled' do
let(:headers) do
{ 'HTTP_AUTHORIZATION' => personal_access_token.token }
@@ -34,7 +44,7 @@ RSpec.describe API::RubygemPackages do
end
shared_examples 'without authentication' do
- it_behaves_like 'returning response status', :unauthorized
+ it_behaves_like 'returning response status', :not_found
end
shared_examples 'with authentication' do
@@ -42,14 +52,6 @@ RSpec.describe API::RubygemPackages do
{ 'HTTP_AUTHORIZATION' => token }
end
- let(:tokens) do
- {
- personal_access_token: personal_access_token.token,
- deploy_token: deploy_token.token,
- job_token: job.token
- }
- end
-
where(:user_role, :token_type, :valid_token, :status) do
:guest | :personal_access_token | true | :not_found
:guest | :personal_access_token | false | :unauthorized
@@ -106,34 +108,290 @@ RSpec.describe API::RubygemPackages do
end
describe 'GET /api/v4/projects/:project_id/packages/rubygems/gems/:file_name' do
- let(:url) { api("/projects/#{project.id}/packages/rubygems/gems/my_gem-1.0.0.gem") }
+ let_it_be(:package_name) { 'package' }
+ let_it_be(:version) { '0.0.1' }
+ let_it_be(:package) { create(:rubygems_package, project: project, name: package_name, version: version) }
+ let_it_be(:file_name) { "#{package_name}-#{version}.gem" }
+
+ let(:url) { api("/projects/#{project.id}/packages/rubygems/gems/#{file_name}") }
subject { get(url, headers: headers) }
- it_behaves_like 'an unimplemented route'
+ context 'with valid project' do
+ where(:visibility, :user_role, :member, :token_type, :valid_token, :shared_examples_name, :expected_status) do
+ :public | :developer | true | :personal_access_token | true | 'Rubygems gem download' | :success
+ :public | :guest | true | :personal_access_token | true | 'Rubygems gem download' | :success
+ :public | :developer | true | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :guest | true | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :developer | false | :personal_access_token | true | 'Rubygems gem download' | :success
+ :public | :guest | false | :personal_access_token | true | 'Rubygems gem download' | :success
+ :public | :developer | false | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :guest | false | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :anonymous | false | :personal_access_token | true | 'Rubygems gem download' | :success
+ :private | :developer | true | :personal_access_token | true | 'Rubygems gem download' | :success
+ :private | :guest | true | :personal_access_token | true | 'rejects rubygems packages access' | :forbidden
+ :private | :developer | true | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :guest | true | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :developer | false | :personal_access_token | true | 'rejects rubygems packages access' | :not_found
+ :private | :guest | false | :personal_access_token | true | 'rejects rubygems packages access' | :not_found
+ :private | :developer | false | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :guest | false | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :anonymous | false | :personal_access_token | true | 'rejects rubygems packages access' | :not_found
+ :public | :developer | true | :job_token | true | 'Rubygems gem download' | :success
+ :public | :guest | true | :job_token | true | 'Rubygems gem download' | :success
+ :public | :developer | true | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :guest | true | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :developer | false | :job_token | true | 'Rubygems gem download' | :success
+ :public | :guest | false | :job_token | true | 'Rubygems gem download' | :success
+ :public | :developer | false | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :guest | false | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :developer | true | :job_token | true | 'Rubygems gem download' | :success
+ :private | :guest | true | :job_token | true | 'rejects rubygems packages access' | :forbidden
+ :private | :developer | true | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :guest | true | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :developer | false | :job_token | true | 'rejects rubygems packages access' | :not_found
+ :private | :guest | false | :job_token | true | 'rejects rubygems packages access' | :not_found
+ :private | :developer | false | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :guest | false | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :developer | true | :deploy_token | true | 'Rubygems gem download' | :success
+ :public | :developer | true | :deploy_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :developer | true | :deploy_token | true | 'Rubygems gem download' | :success
+ :private | :developer | true | :deploy_token | false | 'rejects rubygems packages access' | :unauthorized
+ end
+
+ with_them do
+ let(:token) { valid_token ? tokens[token_type] : 'invalid-token123' }
+ let(:headers) { user_role == :anonymous ? {} : { 'HTTP_AUTHORIZATION' => token } }
+
+ before do
+ project.update_column(:visibility_level, Gitlab::VisibilityLevel.level_value(visibility.to_s))
+ end
+
+ it_behaves_like params[:shared_examples_name], params[:user_role], params[:expected_status], params[:member]
+ end
+ end
end
describe 'POST /api/v4/projects/:project_id/packages/rubygems/api/v1/gems/authorize' do
+ include_context 'workhorse headers'
+
let(:url) { api("/projects/#{project.id}/packages/rubygems/api/v1/gems/authorize") }
+ let(:headers) { {} }
subject { post(url, headers: headers) }
- it_behaves_like 'an unimplemented route'
+ context 'with valid project' do
+ where(:visibility, :user_role, :member, :token_type, :valid_token, :shared_examples_name, :expected_status) do
+ :public | :developer | true | :personal_access_token | true | 'process rubygems workhorse authorization' | :success
+ :public | :guest | true | :personal_access_token | true | 'rejects rubygems packages access' | :forbidden
+ :public | :developer | true | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :guest | true | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :developer | false | :personal_access_token | true | 'rejects rubygems packages access' | :forbidden
+ :public | :guest | false | :personal_access_token | true | 'rejects rubygems packages access' | :forbidden
+ :public | :developer | false | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :guest | false | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :anonymous | false | :personal_access_token | true | 'rejects rubygems packages access' | :unauthorized
+ :private | :developer | true | :personal_access_token | true | 'process rubygems workhorse authorization' | :success
+ :private | :guest | true | :personal_access_token | true | 'rejects rubygems packages access' | :forbidden
+ :private | :developer | true | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :guest | true | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :developer | false | :personal_access_token | true | 'rejects rubygems packages access' | :not_found
+ :private | :guest | false | :personal_access_token | true | 'rejects rubygems packages access' | :not_found
+ :private | :developer | false | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :guest | false | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :anonymous | false | :personal_access_token | true | 'rejects rubygems packages access' | :unauthorized
+ :public | :developer | true | :job_token | true | 'process rubygems workhorse authorization' | :success
+ :public | :guest | true | :job_token | true | 'rejects rubygems packages access' | :forbidden
+ :public | :developer | true | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :guest | true | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :developer | false | :job_token | true | 'rejects rubygems packages access' | :forbidden
+ :public | :guest | false | :job_token | true | 'rejects rubygems packages access' | :forbidden
+ :public | :developer | false | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :guest | false | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :developer | true | :job_token | true | 'process rubygems workhorse authorization' | :success
+ :private | :guest | true | :job_token | true | 'rejects rubygems packages access' | :forbidden
+ :private | :developer | true | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :guest | true | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :developer | false | :job_token | true | 'rejects rubygems packages access' | :not_found
+ :private | :guest | false | :job_token | true | 'rejects rubygems packages access' | :not_found
+ :private | :developer | false | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :guest | false | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :developer | true | :deploy_token | true | 'process rubygems workhorse authorization' | :success
+ :public | :developer | true | :deploy_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :developer | true | :deploy_token | true | 'process rubygems workhorse authorization' | :success
+ :private | :developer | true | :deploy_token | false | 'rejects rubygems packages access' | :unauthorized
+ end
+
+ with_them do
+ let(:token) { valid_token ? tokens[token_type] : 'invalid-token123' }
+ let(:user_headers) { user_role == :anonymous ? {} : { 'HTTP_AUTHORIZATION' => token } }
+ let(:headers) { user_headers.merge(workhorse_headers) }
+
+ before do
+ project.update_column(:visibility_level, Gitlab::VisibilityLevel.level_value(visibility.to_s))
+ end
+
+ it_behaves_like params[:shared_examples_name], params[:user_role], params[:expected_status], params[:member]
+ end
+ end
end
describe 'POST /api/v4/projects/:project_id/packages/rubygems/api/v1/gems' do
- let(:url) { api("/projects/#{project.id}/packages/rubygems/api/v1/gems") }
+ include_context 'workhorse headers'
+
+ let(:url) { "/projects/#{project.id}/packages/rubygems/api/v1/gems" }
+
+ let_it_be(:file_name) { 'package.gem' }
+ let(:headers) { {} }
+ let(:params) { { file: temp_file(file_name) } }
+ let(:file_key) { :file }
+ let(:send_rewritten_field) { true }
+
+ subject do
+ workhorse_finalize(
+ api(url),
+ method: :post,
+ file_key: file_key,
+ params: params,
+ headers: headers,
+ send_rewritten_field: send_rewritten_field
+ )
+ end
- subject { post(url, headers: headers) }
+ context 'with valid project' do
+ where(:visibility, :user_role, :member, :token_type, :valid_token, :shared_examples_name, :expected_status) do
+ :public | :developer | true | :personal_access_token | true | 'process rubygems upload' | :created
+ :public | :guest | true | :personal_access_token | true | 'rejects rubygems packages access' | :forbidden
+ :public | :developer | true | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :guest | true | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :developer | false | :personal_access_token | true | 'rejects rubygems packages access' | :forbidden
+ :public | :guest | false | :personal_access_token | true | 'rejects rubygems packages access' | :forbidden
+ :public | :developer | false | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :guest | false | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :anonymous | false | :personal_access_token | true | 'rejects rubygems packages access' | :unauthorized
+ :private | :developer | true | :personal_access_token | true | 'process rubygems upload' | :created
+ :private | :guest | true | :personal_access_token | true | 'rejects rubygems packages access' | :forbidden
+ :private | :developer | true | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :guest | true | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :developer | false | :personal_access_token | true | 'rejects rubygems packages access' | :not_found
+ :private | :guest | false | :personal_access_token | true | 'rejects rubygems packages access' | :not_found
+ :private | :developer | false | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :guest | false | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :anonymous | false | :personal_access_token | true | 'rejects rubygems packages access' | :unauthorized
+ :public | :developer | true | :job_token | true | 'process rubygems upload' | :created
+ :public | :guest | true | :job_token | true | 'rejects rubygems packages access' | :forbidden
+ :public | :developer | true | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :guest | true | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :developer | false | :job_token | true | 'rejects rubygems packages access' | :forbidden
+ :public | :guest | false | :job_token | true | 'rejects rubygems packages access' | :forbidden
+ :public | :developer | false | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :guest | false | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :developer | true | :job_token | true | 'process rubygems upload' | :created
+ :private | :guest | true | :job_token | true | 'rejects rubygems packages access' | :forbidden
+ :private | :developer | true | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :guest | true | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :developer | false | :job_token | true | 'rejects rubygems packages access' | :not_found
+ :private | :guest | false | :job_token | true | 'rejects rubygems packages access' | :not_found
+ :private | :developer | false | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :guest | false | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :developer | true | :deploy_token | true | 'process rubygems upload' | :created
+ :public | :developer | true | :deploy_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :developer | true | :deploy_token | true | 'process rubygems upload' | :created
+ :private | :developer | true | :deploy_token | false | 'rejects rubygems packages access' | :unauthorized
+ end
- it_behaves_like 'an unimplemented route'
+ with_them do
+ let(:token) { valid_token ? tokens[token_type] : 'invalid-token123' }
+ let(:user_headers) { user_role == :anonymous ? {} : { 'HTTP_AUTHORIZATION' => token } }
+ let(:headers) { user_headers.merge(workhorse_headers) }
+
+ before do
+ project.update_column(:visibility_level, Gitlab::VisibilityLevel.level_value(visibility.to_s))
+ end
+
+ it_behaves_like params[:shared_examples_name], params[:user_role], params[:expected_status], params[:member]
+ end
+
+ context 'failed package file save' do
+ let(:user_headers) { { 'HTTP_AUTHORIZATION' => personal_access_token.token } }
+ let(:headers) { user_headers.merge(workhorse_headers) }
+
+ before do
+ project.add_developer(user)
+ end
+
+ it 'does not create package record', :aggregate_failures do
+ allow(Packages::CreatePackageFileService).to receive(:new).and_raise(StandardError)
+
+ expect { subject }
+ .to change { project.packages.count }.by(0)
+ .and change { Packages::PackageFile.count }.by(0)
+ expect(response).to have_gitlab_http_status(:error)
+ end
+ end
+ end
end
describe 'GET /api/v4/projects/:project_id/packages/rubygems/api/v1/dependencies' do
+ let_it_be(:package) { create(:rubygems_package, project: project) }
+
let(:url) { api("/projects/#{project.id}/packages/rubygems/api/v1/dependencies") }
- subject { get(url, headers: headers) }
+ subject { get(url, headers: headers, params: params) }
+
+ context 'with valid project' do
+ where(:visibility, :user_role, :member, :token_type, :valid_token, :shared_examples_name, :expected_status) do
+ :public | :developer | true | :personal_access_token | true | 'dependency endpoint success' | :success
+ :public | :guest | true | :personal_access_token | true | 'dependency endpoint success' | :success
+ :public | :developer | true | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :guest | true | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :developer | false | :personal_access_token | true | 'dependency endpoint success' | :success
+ :public | :guest | false | :personal_access_token | true | 'dependency endpoint success' | :success
+ :public | :developer | false | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :guest | false | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :anonymous | false | :personal_access_token | true | 'dependency endpoint success' | :success
+ :private | :developer | true | :personal_access_token | true | 'dependency endpoint success' | :success
+ :private | :guest | true | :personal_access_token | true | 'rejects rubygems packages access' | :forbidden
+ :private | :developer | true | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :guest | true | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :developer | false | :personal_access_token | true | 'rejects rubygems packages access' | :not_found
+ :private | :guest | false | :personal_access_token | true | 'rejects rubygems packages access' | :not_found
+ :private | :developer | false | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :guest | false | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :anonymous | false | :personal_access_token | true | 'rejects rubygems packages access' | :not_found
+ :public | :developer | true | :job_token | true | 'dependency endpoint success' | :success
+ :public | :guest | true | :job_token | true | 'dependency endpoint success' | :success
+ :public | :developer | true | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :guest | true | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :developer | false | :job_token | true | 'dependency endpoint success' | :success
+ :public | :guest | false | :job_token | true | 'dependency endpoint success' | :success
+ :public | :developer | false | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :guest | false | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :developer | true | :job_token | true | 'dependency endpoint success' | :success
+ :private | :guest | true | :job_token | true | 'rejects rubygems packages access' | :forbidden
+ :private | :developer | true | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :guest | true | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :developer | false | :job_token | true | 'rejects rubygems packages access' | :not_found
+ :private | :guest | false | :job_token | true | 'rejects rubygems packages access' | :not_found
+ :private | :developer | false | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :guest | false | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :developer | true | :deploy_token | true | 'dependency endpoint success' | :success
+ :public | :developer | true | :deploy_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :developer | true | :deploy_token | true | 'dependency endpoint success' | :success
+ :private | :developer | true | :deploy_token | false | 'rejects rubygems packages access' | :unauthorized
+ end
- it_behaves_like 'an unimplemented route'
+ with_them do
+ let(:token) { valid_token ? tokens[token_type] : 'invalid-token123' }
+ let(:headers) { user_role == :anonymous ? {} : { 'HTTP_AUTHORIZATION' => token } }
+ let(:params) { {} }
+
+ before do
+ project.update!(visibility: visibility.to_s)
+ end
+
+ it_behaves_like params[:shared_examples_name], params[:user_role], params[:expected_status], params[:member]
+ end
+ end
end
end
diff --git a/spec/requests/api/snippet_repository_storage_moves_spec.rb b/spec/requests/api/snippet_repository_storage_moves_spec.rb
index edb92569823..40d01500ac1 100644
--- a/spec/requests/api/snippet_repository_storage_moves_spec.rb
+++ b/spec/requests/api/snippet_repository_storage_moves_spec.rb
@@ -7,6 +7,6 @@ RSpec.describe API::SnippetRepositoryStorageMoves do
let_it_be(:container) { create(:snippet, :repository).tap { |snippet| snippet.create_repository } }
let_it_be(:storage_move) { create(:snippet_repository_storage_move, :scheduled, container: container) }
let(:repository_storage_move_factory) { :snippet_repository_storage_move }
- let(:bulk_worker_klass) { SnippetScheduleBulkRepositoryShardMovesWorker }
+ let(:bulk_worker_klass) { Snippets::ScheduleBulkRepositoryShardMovesWorker }
end
end
diff --git a/spec/requests/api/users_spec.rb b/spec/requests/api/users_spec.rb
index d70a8bd692d..2a7689eaddf 100644
--- a/spec/requests/api/users_spec.rb
+++ b/spec/requests/api/users_spec.rb
@@ -320,6 +320,18 @@ RSpec.describe API::Users do
expect(json_response).to all(include('state' => /(blocked|ldap_blocked)/))
end
+ it "returns an array of external users" do
+ create(:user)
+ external_user = create(:user, external: true)
+
+ get api("/users?external=true", user)
+
+ expect(response).to match_response_schema('public_api/v4/user/basics')
+ expect(response).to include_pagination_headers
+ expect(json_response.size).to eq(1)
+ expect(json_response[0]['id']).to eq(external_user.id)
+ end
+
it "returns one user" do
get api("/users?username=#{omniauth_user.username}", user)
@@ -940,6 +952,18 @@ RSpec.describe API::Users do
expect(new_user.private_profile?).to eq(true)
end
+ it "creates user with view_diffs_file_by_file" do
+ post api('/users', admin), params: attributes_for(:user, view_diffs_file_by_file: true)
+
+ expect(response).to have_gitlab_http_status(:created)
+
+ user_id = json_response['id']
+ new_user = User.find(user_id)
+
+ expect(new_user).not_to eq(nil)
+ expect(new_user.user_preference.view_diffs_file_by_file?).to eq(true)
+ end
+
it "does not create user with invalid email" do
post api('/users', admin),
params: {
@@ -1254,6 +1278,13 @@ RSpec.describe API::Users do
expect(user.reload.private_profile).to eq(true)
end
+ it "updates viewing diffs file by file" do
+ put api("/users/#{user.id}", admin), params: { view_diffs_file_by_file: true }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(user.reload.user_preference.view_diffs_file_by_file?).to eq(true)
+ end
+
it "updates private profile to false when nil is given" do
user.update!(private_profile: true)
@@ -3044,18 +3075,6 @@ RSpec.describe API::Users do
expect(response).to have_gitlab_http_status(:bad_request)
end
-
- context 'when the clear_status_with_quick_options feature flag is disabled' do
- before do
- stub_feature_flags(clear_status_with_quick_options: false)
- end
-
- it 'does not persist clear_status_at' do
- put api('/user/status', user), params: { emoji: 'smirk', message: 'hello world', clear_status_after: '3_hours' }
-
- expect(user.status.reload.clear_status_at).to be_nil
- end
- end
end
end
diff --git a/spec/requests/api/v3/github_spec.rb b/spec/requests/api/v3/github_spec.rb
index e7d9ba99743..197c6cbb0eb 100644
--- a/spec/requests/api/v3/github_spec.rb
+++ b/spec/requests/api/v3/github_spec.rb
@@ -149,6 +149,8 @@ RSpec.describe API::V3::Github do
end
describe 'GET events' do
+ include ProjectForksHelper
+
let(:group) { create(:group) }
let(:project) { create(:project, :empty_repo, path: 'project.with.dot', group: group) }
let(:events_path) { "/repos/#{group.path}/#{project.path}/events" }
@@ -174,6 +176,17 @@ RSpec.describe API::V3::Github do
end
end
+ it 'avoids N+1 queries' do
+ create(:merge_request, source_project: project)
+ source_project = fork_project(project, nil, repository: true)
+
+ control_count = ActiveRecord::QueryRecorder.new(skip_cached: false) { jira_get v3_api(events_path, user) }.count
+
+ create_list(:merge_request, 2, :unique_branches, source_project: source_project, target_project: project)
+
+ expect { jira_get v3_api(events_path, user) }.not_to exceed_all_query_limit(control_count)
+ end
+
context 'if there are more merge requests' do
let!(:merge_request) { create(:merge_request, id: 10000, source_project: project, target_project: project, author: user) }
let!(:merge_request2) { create(:merge_request, id: 10001, source_project: project, source_branch: generate(:branch), target_project: project, author: user) }
diff --git a/spec/requests/api/wikis_spec.rb b/spec/requests/api/wikis_spec.rb
index f271f8aa853..d35aab40ca9 100644
--- a/spec/requests/api/wikis_spec.rb
+++ b/spec/requests/api/wikis_spec.rb
@@ -14,6 +14,7 @@ require 'spec_helper'
RSpec.describe API::Wikis do
include WorkhorseHelpers
+ include AfterNextHelpers
let(:user) { create(:user) }
let(:group) { create(:group).tap { |g| g.add_owner(user) } }
@@ -578,6 +579,20 @@ RSpec.describe API::Wikis do
include_examples 'wiki API 404 Wiki Page Not Found'
end
end
+
+ context 'when there is an error deleting the page' do
+ it 'returns 422' do
+ project.add_maintainer(user)
+
+ allow_next(WikiPages::DestroyService, current_user: user, container: project)
+ .to receive(:execute).and_return(ServiceResponse.error(message: 'foo'))
+
+ delete(api(url, user))
+
+ expect(response).to have_gitlab_http_status(:unprocessable_entity)
+ expect(json_response['message']).to eq 'foo'
+ end
+ end
end
context 'when wiki belongs to a group project' do
diff --git a/spec/requests/ide_controller_spec.rb b/spec/requests/ide_controller_spec.rb
index 805c1f1d82b..4f127e07b6b 100644
--- a/spec/requests/ide_controller_spec.rb
+++ b/spec/requests/ide_controller_spec.rb
@@ -3,7 +3,11 @@
require 'spec_helper'
RSpec.describe IdeController do
- let(:user) { create(:user) }
+ let_it_be(:project) { create(:project, :public) }
+ let_it_be(:creator) { project.creator }
+ let_it_be(:other_user) { create(:user) }
+
+ let(:user) { creator }
before do
sign_in(user)
@@ -14,4 +18,172 @@ RSpec.describe IdeController do
get ide_url
end
+
+ describe '#index', :aggregate_failures do
+ subject { get route }
+
+ shared_examples 'user cannot push code' do
+ include ProjectForksHelper
+
+ let(:user) { other_user }
+
+ context 'when user does not have fork' do
+ it 'does not instantiate forked_project instance var and return 200' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(assigns(:project)).to eq project
+ expect(assigns(:forked_project)).to be_nil
+ end
+ end
+
+ context 'when user has have fork' do
+ let!(:fork) { fork_project(project, user, repository: true) }
+
+ it 'instantiates forked_project instance var and return 200' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(assigns(:project)).to eq project
+ expect(assigns(:forked_project)).to eq fork
+ end
+ end
+ end
+
+ context '/-/ide' do
+ let(:route) { '/-/ide' }
+
+ it 'does not instantiate any instance var and return 200' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(assigns(:project)).to be_nil
+ expect(assigns(:branch)).to be_nil
+ expect(assigns(:path)).to be_nil
+ expect(assigns(:merge_request)).to be_nil
+ expect(assigns(:forked_project)).to be_nil
+ end
+ end
+
+ context '/-/ide/project' do
+ let(:route) { '/-/ide/project' }
+
+ it 'does not instantiate any instance var and return 200' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(assigns(:project)).to be_nil
+ expect(assigns(:branch)).to be_nil
+ expect(assigns(:path)).to be_nil
+ expect(assigns(:merge_request)).to be_nil
+ expect(assigns(:forked_project)).to be_nil
+ end
+ end
+
+ context '/-/ide/project/:project' do
+ let(:route) { "/-/ide/project/#{project.full_path}" }
+
+ it 'instantiates project instance var and return 200' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(assigns(:project)).to eq project
+ expect(assigns(:branch)).to be_nil
+ expect(assigns(:path)).to be_nil
+ expect(assigns(:merge_request)).to be_nil
+ expect(assigns(:forked_project)).to be_nil
+ end
+
+ it_behaves_like 'user cannot push code'
+
+ %w(edit blob tree).each do |action|
+ context "/-/ide/project/:project/#{action}" do
+ let(:route) { "/-/ide/project/#{project.full_path}/#{action}" }
+
+ it 'instantiates project instance var and return 200' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(assigns(:project)).to eq project
+ expect(assigns(:branch)).to be_nil
+ expect(assigns(:path)).to be_nil
+ expect(assigns(:merge_request)).to be_nil
+ expect(assigns(:forked_project)).to be_nil
+ end
+
+ it_behaves_like 'user cannot push code'
+
+ context "/-/ide/project/:project/#{action}/:branch" do
+ let(:route) { "/-/ide/project/#{project.full_path}/#{action}/master" }
+
+ it 'instantiates project and branch instance vars and return 200' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(assigns(:project)).to eq project
+ expect(assigns(:branch)).to eq 'master'
+ expect(assigns(:path)).to be_nil
+ expect(assigns(:merge_request)).to be_nil
+ expect(assigns(:forked_project)).to be_nil
+ end
+
+ it_behaves_like 'user cannot push code'
+
+ context "/-/ide/project/:project/#{action}/:branch/-" do
+ let(:route) { "/-/ide/project/#{project.full_path}/#{action}/branch/slash/-" }
+
+ it 'instantiates project and branch instance vars and return 200' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(assigns(:project)).to eq project
+ expect(assigns(:branch)).to eq 'branch/slash'
+ expect(assigns(:path)).to be_nil
+ expect(assigns(:merge_request)).to be_nil
+ expect(assigns(:forked_project)).to be_nil
+ end
+
+ it_behaves_like 'user cannot push code'
+
+ context "/-/ide/project/:project/#{action}/:branch/-/:path" do
+ let(:route) { "/-/ide/project/#{project.full_path}/#{action}/master/-/foo/.bar" }
+
+ it 'instantiates project, branch, and path instance vars and return 200' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(assigns(:project)).to eq project
+ expect(assigns(:branch)).to eq 'master'
+ expect(assigns(:path)).to eq 'foo/.bar'
+ expect(assigns(:merge_request)).to be_nil
+ expect(assigns(:forked_project)).to be_nil
+ end
+
+ it_behaves_like 'user cannot push code'
+ end
+ end
+ end
+ end
+ end
+
+ context '/-/ide/project/:project/merge_requests/:merge_request_id' do
+ let!(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
+
+ let(:route) { "/-/ide/project/#{project.full_path}/merge_requests/#{merge_request.id}" }
+
+ it 'instantiates project and merge_request instance vars and return 200' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(assigns(:project)).to eq project
+ expect(assigns(:branch)).to be_nil
+ expect(assigns(:path)).to be_nil
+ expect(assigns(:merge_request)).to eq merge_request.id.to_s
+ expect(assigns(:forked_project)).to be_nil
+ end
+
+ it_behaves_like 'user cannot push code'
+ end
+ end
+ end
end
diff --git a/spec/requests/projects/merge_requests/content_spec.rb b/spec/requests/projects/merge_requests/content_spec.rb
new file mode 100644
index 00000000000..7e5ec6f64c4
--- /dev/null
+++ b/spec/requests/projects/merge_requests/content_spec.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'merge request content spec' do
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:merge_request) { create(:merge_request, :with_head_pipeline, target_project: project, source_project: project) }
+ let_it_be(:ci_build) { create(:ci_build, :artifacts, pipeline: merge_request.head_pipeline) }
+
+ before do
+ sign_in(user)
+ project.add_maintainer(user)
+ end
+
+ shared_examples 'cached widget request' do
+ it 'avoids N+1 queries when multiple job artifacts are present' do
+ control = ActiveRecord::QueryRecorder.new(skip_cached: false) do
+ get cached_widget_project_json_merge_request_path(project, merge_request, format: :json)
+ end
+
+ create_list(:ci_build, 10, :artifacts, pipeline: merge_request.head_pipeline)
+
+ expect do
+ get cached_widget_project_json_merge_request_path(project, merge_request, format: :json)
+ end.not_to exceed_query_limit(control)
+ end
+ end
+
+ describe 'GET cached_widget' do
+ it_behaves_like 'cached widget request'
+
+ context 'with non_public_artifacts disabled' do
+ before do
+ stub_feature_flags(non_public_artifacts: false)
+ end
+
+ it_behaves_like 'cached widget request'
+ end
+ end
+end
diff --git a/spec/requests/projects/noteable_notes_spec.rb b/spec/requests/projects/noteable_notes_spec.rb
index 5ae2aadaa84..2bf1ffb2edc 100644
--- a/spec/requests/projects/noteable_notes_spec.rb
+++ b/spec/requests/projects/noteable_notes_spec.rb
@@ -18,7 +18,9 @@ RSpec.describe 'Project noteable notes' do
login_as(user)
end
- it 'does not set a Gitlab::EtagCaching ETag' do
+ it 'does not set a Gitlab::EtagCaching ETag if there is a note' do
+ create(:note_on_merge_request, noteable: merge_request, project: merge_request.project)
+
get notes_path
expect(response).to have_gitlab_http_status(:ok)
@@ -27,5 +29,12 @@ RSpec.describe 'Project noteable notes' do
# interfere with notes pagination
expect(response_etag).not_to eq(stored_etag)
end
+
+ it 'sets a Gitlab::EtagCaching ETag if there is no note' do
+ get notes_path
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response_etag).to eq(stored_etag)
+ end
end
end
diff --git a/spec/rubocop/code_reuse_helpers_spec.rb b/spec/rubocop/code_reuse_helpers_spec.rb
index 4c3dd8f8167..9337df368e3 100644
--- a/spec/rubocop/code_reuse_helpers_spec.rb
+++ b/spec/rubocop/code_reuse_helpers_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require 'parser/current'
require_relative '../../rubocop/code_reuse_helpers'
diff --git a/spec/rubocop/cop/active_record_association_reload_spec.rb b/spec/rubocop/cop/active_record_association_reload_spec.rb
index f28c4e60f3c..1c0518815ee 100644
--- a/spec/rubocop/cop/active_record_association_reload_spec.rb
+++ b/spec/rubocop/cop/active_record_association_reload_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../rubocop/cop/active_record_association_reload'
RSpec.describe RuboCop::Cop::ActiveRecordAssociationReload do
diff --git a/spec/rubocop/cop/api/base_spec.rb b/spec/rubocop/cop/api/base_spec.rb
index ec646b9991b..547d3f53a08 100644
--- a/spec/rubocop/cop/api/base_spec.rb
+++ b/spec/rubocop/cop/api/base_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/api/base'
RSpec.describe RuboCop::Cop::API::Base do
diff --git a/spec/rubocop/cop/api/grape_array_missing_coerce_spec.rb b/spec/rubocop/cop/api/grape_array_missing_coerce_spec.rb
index b50866b54b3..01f1fc71f9a 100644
--- a/spec/rubocop/cop/api/grape_array_missing_coerce_spec.rb
+++ b/spec/rubocop/cop/api/grape_array_missing_coerce_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/api/grape_array_missing_coerce'
RSpec.describe RuboCop::Cop::API::GrapeArrayMissingCoerce do
diff --git a/spec/rubocop/cop/avoid_becomes_spec.rb b/spec/rubocop/cop/avoid_becomes_spec.rb
index 401c694f373..3ab1544b00d 100644
--- a/spec/rubocop/cop/avoid_becomes_spec.rb
+++ b/spec/rubocop/cop/avoid_becomes_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../rubocop/cop/avoid_becomes'
RSpec.describe RuboCop::Cop::AvoidBecomes do
diff --git a/spec/rubocop/cop/avoid_break_from_strong_memoize_spec.rb b/spec/rubocop/cop/avoid_break_from_strong_memoize_spec.rb
index ac59d36db3f..cc851045c3c 100644
--- a/spec/rubocop/cop/avoid_break_from_strong_memoize_spec.rb
+++ b/spec/rubocop/cop/avoid_break_from_strong_memoize_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../rubocop/cop/avoid_break_from_strong_memoize'
RSpec.describe RuboCop::Cop::AvoidBreakFromStrongMemoize do
diff --git a/spec/rubocop/cop/avoid_keyword_arguments_in_sidekiq_workers_spec.rb b/spec/rubocop/cop/avoid_keyword_arguments_in_sidekiq_workers_spec.rb
index 460a0b13458..90ee5772b66 100644
--- a/spec/rubocop/cop/avoid_keyword_arguments_in_sidekiq_workers_spec.rb
+++ b/spec/rubocop/cop/avoid_keyword_arguments_in_sidekiq_workers_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../rubocop/cop/avoid_keyword_arguments_in_sidekiq_workers'
RSpec.describe RuboCop::Cop::AvoidKeywordArgumentsInSidekiqWorkers do
diff --git a/spec/rubocop/cop/avoid_return_from_blocks_spec.rb b/spec/rubocop/cop/avoid_return_from_blocks_spec.rb
index 71311b9df7f..86098f1afcc 100644
--- a/spec/rubocop/cop/avoid_return_from_blocks_spec.rb
+++ b/spec/rubocop/cop/avoid_return_from_blocks_spec.rb
@@ -1,12 +1,9 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../rubocop/cop/avoid_return_from_blocks'
RSpec.describe RuboCop::Cop::AvoidReturnFromBlocks do
- include CopHelper
-
subject(:cop) { described_class.new }
it 'flags violation for return inside a block' do
@@ -19,20 +16,16 @@ RSpec.describe RuboCop::Cop::AvoidReturnFromBlocks do
RUBY
end
- it "doesn't call add_offense twice for nested blocks" do
- source = <<~RUBY
+ it "doesn't create more than one offense for nested blocks" do
+ expect_offense(<<~RUBY)
call do
call do
something
return if something_else
+ ^^^^^^ Do not return from a block, use next or break instead.
end
end
RUBY
- expect_any_instance_of(described_class) do |instance|
- expect(instance).to receive(:add_offense).once
- end
-
- inspect_source(source)
end
it 'flags violation for return inside included > def > block' do
diff --git a/spec/rubocop/cop/avoid_route_redirect_leading_slash_spec.rb b/spec/rubocop/cop/avoid_route_redirect_leading_slash_spec.rb
index 9e13a5278e3..61d6f45b5ba 100644
--- a/spec/rubocop/cop/avoid_route_redirect_leading_slash_spec.rb
+++ b/spec/rubocop/cop/avoid_route_redirect_leading_slash_spec.rb
@@ -1,23 +1,24 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../rubocop/cop/avoid_route_redirect_leading_slash'
RSpec.describe RuboCop::Cop::AvoidRouteRedirectLeadingSlash do
- include CopHelper
-
subject(:cop) { described_class.new }
before do
allow(cop).to receive(:in_routes?).and_return(true)
end
- it 'registers an offense when redirect has a leading slash' do
+ it 'registers an offense when redirect has a leading slash and corrects', :aggregate_failures do
expect_offense(<<~PATTERN)
root to: redirect("/-/route")
^^^^^^^^^^^^^^^^^^^^ Do not use a leading "/" in route redirects
PATTERN
+
+ expect_correction(<<~PATTERN)
+ root to: redirect("-/route")
+ PATTERN
end
it 'does not register an offense when redirect does not have a leading slash' do
@@ -25,8 +26,4 @@ RSpec.describe RuboCop::Cop::AvoidRouteRedirectLeadingSlash do
root to: redirect("-/route")
PATTERN
end
-
- it 'autocorrect `/-/route` to `-/route`' do
- expect(autocorrect_source('redirect("/-/route")')).to eq('redirect("-/route")')
- end
end
diff --git a/spec/rubocop/cop/ban_catch_throw_spec.rb b/spec/rubocop/cop/ban_catch_throw_spec.rb
index b3c4ad8688c..f255d27e7c7 100644
--- a/spec/rubocop/cop/ban_catch_throw_spec.rb
+++ b/spec/rubocop/cop/ban_catch_throw_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../rubocop/cop/ban_catch_throw'
diff --git a/spec/rubocop/cop/code_reuse/finder_spec.rb b/spec/rubocop/cop/code_reuse/finder_spec.rb
index 484a1549a89..36f44ca79da 100644
--- a/spec/rubocop/cop/code_reuse/finder_spec.rb
+++ b/spec/rubocop/cop/code_reuse/finder_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/code_reuse/finder'
RSpec.describe RuboCop::Cop::CodeReuse::Finder do
diff --git a/spec/rubocop/cop/code_reuse/presenter_spec.rb b/spec/rubocop/cop/code_reuse/presenter_spec.rb
index 4639854588e..070a7ed760c 100644
--- a/spec/rubocop/cop/code_reuse/presenter_spec.rb
+++ b/spec/rubocop/cop/code_reuse/presenter_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/code_reuse/presenter'
RSpec.describe RuboCop::Cop::CodeReuse::Presenter do
diff --git a/spec/rubocop/cop/code_reuse/serializer_spec.rb b/spec/rubocop/cop/code_reuse/serializer_spec.rb
index 84db2e62b41..d5577caa2b4 100644
--- a/spec/rubocop/cop/code_reuse/serializer_spec.rb
+++ b/spec/rubocop/cop/code_reuse/serializer_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/code_reuse/serializer'
RSpec.describe RuboCop::Cop::CodeReuse::Serializer do
diff --git a/spec/rubocop/cop/code_reuse/service_class_spec.rb b/spec/rubocop/cop/code_reuse/service_class_spec.rb
index b6d94dd749f..353225b2c42 100644
--- a/spec/rubocop/cop/code_reuse/service_class_spec.rb
+++ b/spec/rubocop/cop/code_reuse/service_class_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/code_reuse/service_class'
RSpec.describe RuboCop::Cop::CodeReuse::ServiceClass do
diff --git a/spec/rubocop/cop/code_reuse/worker_spec.rb b/spec/rubocop/cop/code_reuse/worker_spec.rb
index 42c9303a93b..8155791a3e3 100644
--- a/spec/rubocop/cop/code_reuse/worker_spec.rb
+++ b/spec/rubocop/cop/code_reuse/worker_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/code_reuse/worker'
RSpec.describe RuboCop::Cop::CodeReuse::Worker do
diff --git a/spec/rubocop/cop/default_scope_spec.rb b/spec/rubocop/cop/default_scope_spec.rb
index 506843e030e..4fac0d465e0 100644
--- a/spec/rubocop/cop/default_scope_spec.rb
+++ b/spec/rubocop/cop/default_scope_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../rubocop/cop/default_scope'
RSpec.describe RuboCop::Cop::DefaultScope do
diff --git a/spec/rubocop/cop/destroy_all_spec.rb b/spec/rubocop/cop/destroy_all_spec.rb
index f6850a00238..468b10c3816 100644
--- a/spec/rubocop/cop/destroy_all_spec.rb
+++ b/spec/rubocop/cop/destroy_all_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../rubocop/cop/destroy_all'
RSpec.describe RuboCop::Cop::DestroyAll do
diff --git a/spec/rubocop/cop/filename_length_spec.rb b/spec/rubocop/cop/filename_length_spec.rb
index 2411c8dbc7b..ee128cb2781 100644
--- a/spec/rubocop/cop/filename_length_spec.rb
+++ b/spec/rubocop/cop/filename_length_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require 'rubocop/rspec/support'
require_relative '../../../rubocop/cop/filename_length'
diff --git a/spec/rubocop/cop/gitlab/avoid_uploaded_file_from_params_spec.rb b/spec/rubocop/cop/gitlab/avoid_uploaded_file_from_params_spec.rb
index f96e25c59e7..6d69eb5456f 100644
--- a/spec/rubocop/cop/gitlab/avoid_uploaded_file_from_params_spec.rb
+++ b/spec/rubocop/cop/gitlab/avoid_uploaded_file_from_params_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/gitlab/avoid_uploaded_file_from_params'
RSpec.describe RuboCop::Cop::Gitlab::AvoidUploadedFileFromParams do
diff --git a/spec/rubocop/cop/gitlab/bulk_insert_spec.rb b/spec/rubocop/cop/gitlab/bulk_insert_spec.rb
index c280ab8fa8b..7c60518f890 100644
--- a/spec/rubocop/cop/gitlab/bulk_insert_spec.rb
+++ b/spec/rubocop/cop/gitlab/bulk_insert_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/gitlab/bulk_insert'
RSpec.describe RuboCop::Cop::Gitlab::BulkInsert do
diff --git a/spec/rubocop/cop/gitlab/change_timezone_spec.rb b/spec/rubocop/cop/gitlab/change_timezone_spec.rb
index 9cb822ec4f2..f3c07e44cc7 100644
--- a/spec/rubocop/cop/gitlab/change_timezone_spec.rb
+++ b/spec/rubocop/cop/gitlab/change_timezone_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/gitlab/change_timzone'
RSpec.describe RuboCop::Cop::Gitlab::ChangeTimezone do
diff --git a/spec/rubocop/cop/gitlab/const_get_inherit_false_spec.rb b/spec/rubocop/cop/gitlab/const_get_inherit_false_spec.rb
index 19e5fe946be..1d99ec93e25 100644
--- a/spec/rubocop/cop/gitlab/const_get_inherit_false_spec.rb
+++ b/spec/rubocop/cop/gitlab/const_get_inherit_false_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/gitlab/const_get_inherit_false'
RSpec.describe RuboCop::Cop::Gitlab::ConstGetInheritFalse do
diff --git a/spec/rubocop/cop/gitlab/duplicate_spec_location_spec.rb b/spec/rubocop/cop/gitlab/duplicate_spec_location_spec.rb
index a207155f432..3b3d5b01a30 100644
--- a/spec/rubocop/cop/gitlab/duplicate_spec_location_spec.rb
+++ b/spec/rubocop/cop/gitlab/duplicate_spec_location_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/gitlab/duplicate_spec_location'
diff --git a/spec/rubocop/cop/gitlab/except_spec.rb b/spec/rubocop/cop/gitlab/except_spec.rb
index 7a122e3cf53..04cfe261cf2 100644
--- a/spec/rubocop/cop/gitlab/except_spec.rb
+++ b/spec/rubocop/cop/gitlab/except_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/gitlab/except'
RSpec.describe RuboCop::Cop::Gitlab::Except do
diff --git a/spec/rubocop/cop/gitlab/finder_with_find_by_spec.rb b/spec/rubocop/cop/gitlab/finder_with_find_by_spec.rb
index 03d7fc5e8b1..d2cd06d77c5 100644
--- a/spec/rubocop/cop/gitlab/finder_with_find_by_spec.rb
+++ b/spec/rubocop/cop/gitlab/finder_with_find_by_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/gitlab/finder_with_find_by'
diff --git a/spec/rubocop/cop/gitlab/httparty_spec.rb b/spec/rubocop/cop/gitlab/httparty_spec.rb
index fcd18b0eb9b..98b1aa36586 100644
--- a/spec/rubocop/cop/gitlab/httparty_spec.rb
+++ b/spec/rubocop/cop/gitlab/httparty_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/gitlab/httparty'
RSpec.describe RuboCop::Cop::Gitlab::HTTParty do # rubocop:disable RSpec/FilePath
diff --git a/spec/rubocop/cop/gitlab/intersect_spec.rb b/spec/rubocop/cop/gitlab/intersect_spec.rb
index 6f0367591cd..f3cb1412f35 100644
--- a/spec/rubocop/cop/gitlab/intersect_spec.rb
+++ b/spec/rubocop/cop/gitlab/intersect_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/gitlab/intersect'
RSpec.describe RuboCop::Cop::Gitlab::Intersect do
diff --git a/spec/rubocop/cop/gitlab/json_spec.rb b/spec/rubocop/cop/gitlab/json_spec.rb
index 29c3b96cc1a..66b2c675e80 100644
--- a/spec/rubocop/cop/gitlab/json_spec.rb
+++ b/spec/rubocop/cop/gitlab/json_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/gitlab/json'
RSpec.describe RuboCop::Cop::Gitlab::Json do
diff --git a/spec/rubocop/cop/gitlab/module_with_instance_variables_spec.rb b/spec/rubocop/cop/gitlab/module_with_instance_variables_spec.rb
index 08634d5753a..d46dec3b2e3 100644
--- a/spec/rubocop/cop/gitlab/module_with_instance_variables_spec.rb
+++ b/spec/rubocop/cop/gitlab/module_with_instance_variables_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/gitlab/module_with_instance_variables'
RSpec.describe RuboCop::Cop::Gitlab::ModuleWithInstanceVariables do
diff --git a/spec/rubocop/cop/gitlab/namespaced_class_spec.rb b/spec/rubocop/cop/gitlab/namespaced_class_spec.rb
index d1f61aa5afb..824a1b8cef5 100644
--- a/spec/rubocop/cop/gitlab/namespaced_class_spec.rb
+++ b/spec/rubocop/cop/gitlab/namespaced_class_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require 'rubocop/rspec/support'
require_relative '../../../../rubocop/cop/gitlab/namespaced_class'
diff --git a/spec/rubocop/cop/gitlab/policy_rule_boolean_spec.rb b/spec/rubocop/cop/gitlab/policy_rule_boolean_spec.rb
index 6dbbcdd8324..f73fc71b601 100644
--- a/spec/rubocop/cop/gitlab/policy_rule_boolean_spec.rb
+++ b/spec/rubocop/cop/gitlab/policy_rule_boolean_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/gitlab/policy_rule_boolean'
RSpec.describe RuboCop::Cop::Gitlab::PolicyRuleBoolean do
diff --git a/spec/rubocop/cop/gitlab/predicate_memoization_spec.rb b/spec/rubocop/cop/gitlab/predicate_memoization_spec.rb
index 071ddcf8b7d..903c02ba194 100644
--- a/spec/rubocop/cop/gitlab/predicate_memoization_spec.rb
+++ b/spec/rubocop/cop/gitlab/predicate_memoization_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/gitlab/predicate_memoization'
RSpec.describe RuboCop::Cop::Gitlab::PredicateMemoization do
diff --git a/spec/rubocop/cop/gitlab/rails_logger_spec.rb b/spec/rubocop/cop/gitlab/rails_logger_spec.rb
index 7258b047191..24f49bf3044 100644
--- a/spec/rubocop/cop/gitlab/rails_logger_spec.rb
+++ b/spec/rubocop/cop/gitlab/rails_logger_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/gitlab/rails_logger'
RSpec.describe RuboCop::Cop::Gitlab::RailsLogger do
diff --git a/spec/rubocop/cop/gitlab/union_spec.rb b/spec/rubocop/cop/gitlab/union_spec.rb
index 04a3db8e7dd..ce84c75338d 100644
--- a/spec/rubocop/cop/gitlab/union_spec.rb
+++ b/spec/rubocop/cop/gitlab/union_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/gitlab/union'
RSpec.describe RuboCop::Cop::Gitlab::Union do
diff --git a/spec/rubocop/cop/graphql/authorize_types_spec.rb b/spec/rubocop/cop/graphql/authorize_types_spec.rb
index 9242b865b20..6c521789e34 100644
--- a/spec/rubocop/cop/graphql/authorize_types_spec.rb
+++ b/spec/rubocop/cop/graphql/authorize_types_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/graphql/authorize_types'
@@ -63,4 +62,34 @@ RSpec.describe RuboCop::Cop::Graphql::AuthorizeTypes do
end
TYPE
end
+
+ it 'does not add an offense for subtypes of BaseUnion' do
+ expect_no_offenses(<<~TYPE)
+ module Types
+ class AType < BaseUnion
+ possible_types Types::Foo, Types::Bar
+ end
+ end
+ TYPE
+ end
+
+ it 'does not add an offense for subtypes of BaseInputObject' do
+ expect_no_offenses(<<~TYPE)
+ module Types
+ class AType < BaseInputObject
+ argument :a_thing
+ end
+ end
+ TYPE
+ end
+
+ it 'does not add an offense for InputTypes' do
+ expect_no_offenses(<<~TYPE)
+ module Types
+ class AInputType < SomeObjectType
+ argument :a_thing
+ end
+ end
+ TYPE
+ end
end
diff --git a/spec/rubocop/cop/graphql/descriptions_spec.rb b/spec/rubocop/cop/graphql/descriptions_spec.rb
index 9ad40fad83d..af660aee165 100644
--- a/spec/rubocop/cop/graphql/descriptions_spec.rb
+++ b/spec/rubocop/cop/graphql/descriptions_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/graphql/descriptions'
RSpec.describe RuboCop::Cop::Graphql::Descriptions do
@@ -91,6 +90,50 @@ RSpec.describe RuboCop::Cop::Graphql::Descriptions do
end
end
+ context 'enum values' do
+ it 'adds an offense when there is no description' do
+ expect_offense(<<~TYPE)
+ module Types
+ class FakeEnum < BaseEnum
+ value 'FOO', value: 'foo'
+ ^^^^^^^^^^^^^^^^^^^^^^^^^ Please add a `description` property.
+ end
+ end
+ TYPE
+ end
+
+ it 'adds an offense when description does not end in a period' do
+ expect_offense(<<~TYPE)
+ module Types
+ class FakeEnum < BaseEnum
+ value 'FOO', value: 'foo', description: 'bar'
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `description` strings must end with a `.`.
+ end
+ end
+ TYPE
+ end
+
+ it 'does not add an offense when description is correct (defined using `description:`)' do
+ expect_no_offenses(<<~TYPE.strip)
+ module Types
+ class FakeEnum < BaseEnum
+ value 'FOO', value: 'foo', description: 'bar.'
+ end
+ end
+ TYPE
+ end
+
+ it 'does not add an offense when description is correct (defined as a second argument)' do
+ expect_no_offenses(<<~TYPE.strip)
+ module Types
+ class FakeEnum < BaseEnum
+ value 'FOO', 'bar.', value: 'foo'
+ end
+ end
+ TYPE
+ end
+ end
+
describe 'autocorrecting descriptions without periods' do
it 'can autocorrect' do
expect_offense(<<~TYPE)
diff --git a/spec/rubocop/cop/graphql/gid_expected_type_spec.rb b/spec/rubocop/cop/graphql/gid_expected_type_spec.rb
index d9a129244d6..47a6ce24d53 100644
--- a/spec/rubocop/cop/graphql/gid_expected_type_spec.rb
+++ b/spec/rubocop/cop/graphql/gid_expected_type_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/graphql/gid_expected_type'
diff --git a/spec/rubocop/cop/graphql/id_type_spec.rb b/spec/rubocop/cop/graphql/id_type_spec.rb
index 93c01cd7f06..a566488b118 100644
--- a/spec/rubocop/cop/graphql/id_type_spec.rb
+++ b/spec/rubocop/cop/graphql/id_type_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/graphql/id_type'
diff --git a/spec/rubocop/cop/graphql/json_type_spec.rb b/spec/rubocop/cop/graphql/json_type_spec.rb
index 91838c1708e..50437953c1d 100644
--- a/spec/rubocop/cop/graphql/json_type_spec.rb
+++ b/spec/rubocop/cop/graphql/json_type_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/graphql/json_type'
RSpec.describe RuboCop::Cop::Graphql::JSONType do
diff --git a/spec/rubocop/cop/graphql/resolver_type_spec.rb b/spec/rubocop/cop/graphql/resolver_type_spec.rb
index 11c0ad284a9..06bf90a8a07 100644
--- a/spec/rubocop/cop/graphql/resolver_type_spec.rb
+++ b/spec/rubocop/cop/graphql/resolver_type_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/graphql/resolver_type'
diff --git a/spec/rubocop/cop/group_public_or_visible_to_user_spec.rb b/spec/rubocop/cop/group_public_or_visible_to_user_spec.rb
index b3ec426dc07..2348552f9e4 100644
--- a/spec/rubocop/cop/group_public_or_visible_to_user_spec.rb
+++ b/spec/rubocop/cop/group_public_or_visible_to_user_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../rubocop/cop/group_public_or_visible_to_user'
RSpec.describe RuboCop::Cop::GroupPublicOrVisibleToUser do
diff --git a/spec/rubocop/cop/ignored_columns_spec.rb b/spec/rubocop/cop/ignored_columns_spec.rb
index 38b4ac0bc1a..1c72fedbf31 100644
--- a/spec/rubocop/cop/ignored_columns_spec.rb
+++ b/spec/rubocop/cop/ignored_columns_spec.rb
@@ -1,22 +1,17 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
-require 'rubocop/rspec/support'
require_relative '../../../rubocop/cop/ignored_columns'
RSpec.describe RuboCop::Cop::IgnoredColumns do
- include CopHelper
-
subject(:cop) { described_class.new }
- it 'flags the use of destroy_all with a local variable receiver' do
- inspect_source(<<~RUBY)
+ it 'flags direct use of ignored_columns instead of the IgnoredColumns concern' do
+ expect_offense(<<~RUBY)
class Foo < ApplicationRecord
self.ignored_columns += %i[id]
+ ^^^^^^^^^^^^^^^^^^^^ Use `IgnoredColumns` concern instead of adding to `self.ignored_columns`.
end
RUBY
-
- expect(cop.offenses.size).to eq(1)
end
end
diff --git a/spec/rubocop/cop/include_sidekiq_worker_spec.rb b/spec/rubocop/cop/include_sidekiq_worker_spec.rb
index bdd622d4894..8c706925ab9 100644
--- a/spec/rubocop/cop/include_sidekiq_worker_spec.rb
+++ b/spec/rubocop/cop/include_sidekiq_worker_spec.rb
@@ -2,7 +2,6 @@
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../rubocop/cop/include_sidekiq_worker'
RSpec.describe RuboCop::Cop::IncludeSidekiqWorker do
diff --git a/spec/rubocop/cop/inject_enterprise_edition_module_spec.rb b/spec/rubocop/cop/inject_enterprise_edition_module_spec.rb
index 2d293fd0a05..8bfa57031d7 100644
--- a/spec/rubocop/cop/inject_enterprise_edition_module_spec.rb
+++ b/spec/rubocop/cop/inject_enterprise_edition_module_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../rubocop/cop/inject_enterprise_edition_module'
RSpec.describe RuboCop::Cop::InjectEnterpriseEditionModule do
diff --git a/spec/rubocop/cop/lint/last_keyword_argument_spec.rb b/spec/rubocop/cop/lint/last_keyword_argument_spec.rb
index aac59f0db4c..b1b4c88e0f6 100644
--- a/spec/rubocop/cop/lint/last_keyword_argument_spec.rb
+++ b/spec/rubocop/cop/lint/last_keyword_argument_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/lint/last_keyword_argument'
RSpec.describe RuboCop::Cop::Lint::LastKeywordArgument do
diff --git a/spec/rubocop/cop/migration/add_column_with_default_spec.rb b/spec/rubocop/cop/migration/add_column_with_default_spec.rb
index cf476ae55d6..3f47613280f 100644
--- a/spec/rubocop/cop/migration/add_column_with_default_spec.rb
+++ b/spec/rubocop/cop/migration/add_column_with_default_spec.rb
@@ -1,15 +1,12 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/migration/add_column_with_default'
RSpec.describe RuboCop::Cop::Migration::AddColumnWithDefault do
- include CopHelper
-
let(:cop) { described_class.new }
- context 'outside of a migration' do
+ context 'when outside of a migration' do
it 'does not register any offenses' do
expect_no_offenses(<<~RUBY)
def up
@@ -19,18 +16,16 @@ RSpec.describe RuboCop::Cop::Migration::AddColumnWithDefault do
end
end
- context 'in a migration' do
+ context 'when in a migration' do
before do
allow(cop).to receive(:in_migration?).and_return(true)
end
- let(:offense) { '`add_column_with_default` is deprecated, use `add_column` instead' }
-
it 'registers an offense' do
expect_offense(<<~RUBY)
def up
add_column_with_default(:merge_request_diff_files, :artifacts, :boolean, default: true, allow_null: false)
- ^^^^^^^^^^^^^^^^^^^^^^^ #{offense}
+ ^^^^^^^^^^^^^^^^^^^^^^^ `add_column_with_default` is deprecated, use `add_column` instead
end
RUBY
end
diff --git a/spec/rubocop/cop/migration/add_columns_to_wide_tables_spec.rb b/spec/rubocop/cop/migration/add_columns_to_wide_tables_spec.rb
index 92863c45b1a..b78ec971245 100644
--- a/spec/rubocop/cop/migration/add_columns_to_wide_tables_spec.rb
+++ b/spec/rubocop/cop/migration/add_columns_to_wide_tables_spec.rb
@@ -1,15 +1,12 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/migration/add_columns_to_wide_tables'
RSpec.describe RuboCop::Cop::Migration::AddColumnsToWideTables do
- include CopHelper
-
let(:cop) { described_class.new }
- context 'outside of a migration' do
+ context 'when outside of a migration' do
it 'does not register any offenses' do
expect_no_offenses(<<~RUBY)
def up
@@ -19,14 +16,14 @@ RSpec.describe RuboCop::Cop::Migration::AddColumnsToWideTables do
end
end
- context 'in a migration' do
+ context 'when in a migration' do
before do
allow(cop).to receive(:in_migration?).and_return(true)
end
context 'with wide tables' do
it 'registers an offense when adding a column to a wide table' do
- offense = '`projects` is a wide table with several columns, addig more should be avoided unless absolutely necessary. Consider storing the column in a different table or creating a new one.'
+ offense = '`projects` is a wide table with several columns, [...]'
expect_offense(<<~RUBY)
def up
@@ -37,7 +34,7 @@ RSpec.describe RuboCop::Cop::Migration::AddColumnsToWideTables do
end
it 'registers an offense when adding a column with default to a wide table' do
- offense = '`users` is a wide table with several columns, addig more should be avoided unless absolutely necessary. Consider storing the column in a different table or creating a new one.'
+ offense = '`users` is a wide table with several columns, [...]'
expect_offense(<<~RUBY)
def up
@@ -48,7 +45,7 @@ RSpec.describe RuboCop::Cop::Migration::AddColumnsToWideTables do
end
it 'registers an offense when adding a reference' do
- offense = '`ci_builds` is a wide table with several columns, addig more should be avoided unless absolutely necessary. Consider storing the column in a different table or creating a new one.'
+ offense = '`ci_builds` is a wide table with several columns, [...]'
expect_offense(<<~RUBY)
def up
@@ -59,7 +56,7 @@ RSpec.describe RuboCop::Cop::Migration::AddColumnsToWideTables do
end
it 'registers an offense when adding timestamps' do
- offense = '`projects` is a wide table with several columns, addig more should be avoided unless absolutely necessary. Consider storing the column in a different table or creating a new one.'
+ offense = '`projects` is a wide table with several columns, [...]'
expect_offense(<<~RUBY)
def up
diff --git a/spec/rubocop/cop/migration/add_concurrent_foreign_key_spec.rb b/spec/rubocop/cop/migration/add_concurrent_foreign_key_spec.rb
index 25350ad1ecb..572c0d414b3 100644
--- a/spec/rubocop/cop/migration/add_concurrent_foreign_key_spec.rb
+++ b/spec/rubocop/cop/migration/add_concurrent_foreign_key_spec.rb
@@ -1,50 +1,41 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/migration/add_concurrent_foreign_key'
RSpec.describe RuboCop::Cop::Migration::AddConcurrentForeignKey do
- include CopHelper
-
let(:cop) { described_class.new }
- context 'outside of a migration' do
+ context 'when outside of a migration' do
it 'does not register any offenses' do
- inspect_source('def up; add_foreign_key(:projects, :users, column: :user_id); end')
-
- expect(cop.offenses).to be_empty
+ expect_no_offenses('def up; add_foreign_key(:projects, :users, column: :user_id); end')
end
end
- context 'in a migration' do
+ context 'when in a migration' do
before do
allow(cop).to receive(:in_migration?).and_return(true)
end
it 'registers an offense when using add_foreign_key' do
- inspect_source('def up; add_foreign_key(:projects, :users, column: :user_id); end')
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(1)
- expect(cop.offenses.map(&:line)).to eq([1])
- end
+ expect_offense(<<~RUBY)
+ def up
+ add_foreign_key(:projects, :users, column: :user_id)
+ ^^^^^^^^^^^^^^^ `add_foreign_key` requires downtime, use `add_concurrent_foreign_key` instead
+ end
+ RUBY
end
it 'does not register an offense when a `NOT VALID` foreign key is added' do
- inspect_source('def up; add_foreign_key(:projects, :users, column: :user_id, validate: false); end')
-
- expect(cop.offenses).to be_empty
+ expect_no_offenses('def up; add_foreign_key(:projects, :users, column: :user_id, validate: false); end')
end
it 'does not register an offense when `add_foreign_key` is within `with_lock_retries`' do
- inspect_source <<~RUBY
+ expect_no_offenses(<<~RUBY)
with_lock_retries do
add_foreign_key :key, :projects, column: :project_id, on_delete: :cascade
end
RUBY
-
- expect(cop.offenses).to be_empty
end
end
end
diff --git a/spec/rubocop/cop/migration/add_concurrent_index_spec.rb b/spec/rubocop/cop/migration/add_concurrent_index_spec.rb
index 351283a230a..52b3a5769ff 100644
--- a/spec/rubocop/cop/migration/add_concurrent_index_spec.rb
+++ b/spec/rubocop/cop/migration/add_concurrent_index_spec.rb
@@ -1,40 +1,33 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/migration/add_concurrent_index'
RSpec.describe RuboCop::Cop::Migration::AddConcurrentIndex do
- include CopHelper
-
subject(:cop) { described_class.new }
- context 'in migration' do
+ context 'when in migration' do
before do
allow(cop).to receive(:in_migration?).and_return(true)
end
it 'registers an offense when add_concurrent_index is used inside a change method' do
- inspect_source('def change; add_concurrent_index :table, :column; end')
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(1)
- expect(cop.offenses.map(&:line)).to eq([1])
- end
+ expect_offense(<<~RUBY)
+ def change
+ ^^^^^^ `add_concurrent_index` is not reversible[...]
+ add_concurrent_index :table, :column
+ end
+ RUBY
end
it 'registers no offense when add_concurrent_index is used inside an up method' do
- inspect_source('def up; add_concurrent_index :table, :column; end')
-
- expect(cop.offenses.size).to eq(0)
+ expect_no_offenses('def up; add_concurrent_index :table, :column; end')
end
end
- context 'outside of migration' do
+ context 'when outside of migration' do
it 'registers no offense' do
- inspect_source('def change; add_concurrent_index :table, :column; end')
-
- expect(cop.offenses.size).to eq(0)
+ expect_no_offenses('def change; add_concurrent_index :table, :column; end')
end
end
end
diff --git a/spec/rubocop/cop/migration/add_index_spec.rb b/spec/rubocop/cop/migration/add_index_spec.rb
index 1d083e9f2d2..088bfe434f4 100644
--- a/spec/rubocop/cop/migration/add_index_spec.rb
+++ b/spec/rubocop/cop/migration/add_index_spec.rb
@@ -1,12 +1,9 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/migration/add_index'
RSpec.describe RuboCop::Cop::Migration::AddIndex do
- include CopHelper
-
subject(:cop) { described_class.new }
context 'in migration' do
diff --git a/spec/rubocop/cop/migration/add_limit_to_text_columns_spec.rb b/spec/rubocop/cop/migration/add_limit_to_text_columns_spec.rb
index 149fb0a48eb..f4695ff8d2d 100644
--- a/spec/rubocop/cop/migration/add_limit_to_text_columns_spec.rb
+++ b/spec/rubocop/cop/migration/add_limit_to_text_columns_spec.rb
@@ -1,15 +1,14 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/migration/add_limit_to_text_columns'
RSpec.describe RuboCop::Cop::Migration::AddLimitToTextColumns do
- include CopHelper
-
subject(:cop) { described_class.new }
- context 'in migration' do
+ context 'when in migration' do
+ let(:msg) { 'Text columns should always have a limit set (255 is suggested)[...]' }
+
before do
allow(cop).to receive(:in_migration?).and_return(true)
end
@@ -25,31 +24,29 @@ RSpec.describe RuboCop::Cop::Migration::AddLimitToTextColumns do
create_table :test_text_limits, id: false do |t|
t.integer :test_id, null: false
t.text :name
- ^^^^ #{described_class::MSG}
+ ^^^^ #{msg}
end
create_table_with_constraints :test_text_limits_create do |t|
t.integer :test_id, null: false
t.text :title
t.text :description
- ^^^^ #{described_class::MSG}
+ ^^^^ #{msg}
t.text_limit :title, 100
end
add_column :test_text_limits, :email, :text
- ^^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^^^^ #{msg}
add_column_with_default :test_text_limits, :role, :text, default: 'default'
- ^^^^^^^^^^^^^^^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^^^^^^^^^^^^^^^^^ #{msg}
change_column_type_concurrently :test_text_limits, :test_id, :text
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{msg}
end
end
RUBY
-
- expect(cop.offenses.map(&:cop_name)).to all(eq('Migration/AddLimitToTextColumns'))
end
end
@@ -111,7 +108,7 @@ RSpec.describe RuboCop::Cop::Migration::AddLimitToTextColumns do
end
# Make sure that the cop is properly checking for an `add_text_limit`
- # over the same {table, attribute} as the one that triggered the offence
+ # over the same {table, attribute} as the one that triggered the offense
context 'when the limit is defined for a same name attribute but different table' do
it 'registers an offense' do
expect_offense(<<~RUBY)
@@ -123,17 +120,17 @@ RSpec.describe RuboCop::Cop::Migration::AddLimitToTextColumns do
create_table :test_text_limits, id: false do |t|
t.integer :test_id, null: false
t.text :name
- ^^^^ #{described_class::MSG}
+ ^^^^ #{msg}
end
add_column :test_text_limits, :email, :text
- ^^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^^^^ #{msg}
add_column_with_default :test_text_limits, :role, :text, default: 'default'
- ^^^^^^^^^^^^^^^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^^^^^^^^^^^^^^^^^ #{msg}
change_column_type_concurrently :test_text_limits, :test_id, :text
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{msg}
add_text_limit :wrong_table, :name, 255
add_text_limit :wrong_table, :email, 255
@@ -142,8 +139,6 @@ RSpec.describe RuboCop::Cop::Migration::AddLimitToTextColumns do
end
end
RUBY
-
- expect(cop.offenses.map(&:cop_name)).to all(eq('Migration/AddLimitToTextColumns'))
end
end
@@ -176,18 +171,18 @@ RSpec.describe RuboCop::Cop::Migration::AddLimitToTextColumns do
DOWNTIME = false
def up
- drop_table :no_offence_on_down
+ drop_table :no_offense_on_down
end
def down
- create_table :no_offence_on_down, id: false do |t|
+ create_table :no_offense_on_down, id: false do |t|
t.integer :test_id, null: false
t.text :name
end
- add_column :no_offence_on_down, :email, :text
+ add_column :no_offense_on_down, :email, :text
- add_column_with_default :no_offence_on_down, :role, :text, default: 'default'
+ add_column_with_default :no_offense_on_down, :role, :text, default: 'default'
end
end
RUBY
@@ -195,7 +190,7 @@ RSpec.describe RuboCop::Cop::Migration::AddLimitToTextColumns do
end
end
- context 'outside of migration' do
+ context 'when outside of migration' do
it 'registers no offense' do
expect_no_offenses(<<~RUBY)
class TestTextLimits < ActiveRecord::Migration[6.0]
diff --git a/spec/rubocop/cop/migration/add_reference_spec.rb b/spec/rubocop/cop/migration/add_reference_spec.rb
index 6e229d3eefc..9445780e9ed 100644
--- a/spec/rubocop/cop/migration/add_reference_spec.rb
+++ b/spec/rubocop/cop/migration/add_reference_spec.rb
@@ -1,15 +1,12 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/migration/add_reference'
RSpec.describe RuboCop::Cop::Migration::AddReference do
- include CopHelper
-
let(:cop) { described_class.new }
- context 'outside of a migration' do
+ context 'when outside of a migration' do
it 'does not register any offenses' do
expect_no_offenses(<<~RUBY)
def up
@@ -19,12 +16,12 @@ RSpec.describe RuboCop::Cop::Migration::AddReference do
end
end
- context 'in a migration' do
+ context 'when in a migration' do
before do
allow(cop).to receive(:in_migration?).and_return(true)
end
- let(:offense) { '`add_reference` requires downtime for existing tables, use `add_concurrent_foreign_key` instead. When used for new tables, `index: true` or `index: { options... } is required.`' }
+ let(:offense) { '`add_reference` requires downtime for existing tables, use `add_concurrent_foreign_key`[...]' }
context 'when the table existed before' do
it 'registers an offense when using add_reference' do
diff --git a/spec/rubocop/cop/migration/add_timestamps_spec.rb b/spec/rubocop/cop/migration/add_timestamps_spec.rb
index 83570711ab9..ef5a856722f 100644
--- a/spec/rubocop/cop/migration/add_timestamps_spec.rb
+++ b/spec/rubocop/cop/migration/add_timestamps_spec.rb
@@ -1,12 +1,9 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/migration/add_timestamps'
RSpec.describe RuboCop::Cop::Migration::AddTimestamps do
- include CopHelper
-
subject(:cop) { described_class.new }
let(:migration_with_add_timestamps) do
@@ -47,44 +44,39 @@ RSpec.describe RuboCop::Cop::Migration::AddTimestamps do
)
end
- context 'in migration' do
+ context 'when in migration' do
before do
allow(cop).to receive(:in_migration?).and_return(true)
end
it 'registers an offense when the "add_timestamps" method is used' do
- inspect_source(migration_with_add_timestamps)
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(1)
- expect(cop.offenses.map(&:line)).to eq([7])
- end
+ expect_offense(<<~RUBY)
+ class Users < ActiveRecord::Migration[4.2]
+ DOWNTIME = false
+
+ def change
+ add_column(:users, :username, :text)
+ add_timestamps(:users)
+ ^^^^^^^^^^^^^^ Do not use `add_timestamps`, use `add_timestamps_with_timezone` instead
+ end
+ end
+ RUBY
end
it 'does not register an offense when the "add_timestamps" method is not used' do
- inspect_source(migration_without_add_timestamps)
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(0)
- end
+ expect_no_offenses(migration_without_add_timestamps)
end
it 'does not register an offense when the "add_timestamps_with_timezone" method is used' do
- inspect_source(migration_with_add_timestamps_with_timezone)
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(0)
- end
+ expect_no_offenses(migration_with_add_timestamps_with_timezone)
end
end
- context 'outside of migration' do
- it 'registers no offense' do
- inspect_source(migration_with_add_timestamps)
- inspect_source(migration_without_add_timestamps)
- inspect_source(migration_with_add_timestamps_with_timezone)
-
- expect(cop.offenses.size).to eq(0)
+ context 'when outside of migration' do
+ it 'registers no offense', :aggregate_failures do
+ expect_no_offenses(migration_with_add_timestamps)
+ expect_no_offenses(migration_without_add_timestamps)
+ expect_no_offenses(migration_with_add_timestamps_with_timezone)
end
end
end
diff --git a/spec/rubocop/cop/migration/complex_indexes_require_name_spec.rb b/spec/rubocop/cop/migration/complex_indexes_require_name_spec.rb
index 38ccf546b7c..15e947a1e53 100644
--- a/spec/rubocop/cop/migration/complex_indexes_require_name_spec.rb
+++ b/spec/rubocop/cop/migration/complex_indexes_require_name_spec.rb
@@ -1,15 +1,14 @@
# frozen_string_literal: true
#
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/migration/complex_indexes_require_name'
RSpec.describe RuboCop::Cop::Migration::ComplexIndexesRequireName do
- include CopHelper
-
subject(:cop) { described_class.new }
- context 'in migration' do
+ context 'when in migration' do
+ let(:msg) { 'indexes added with custom options must be explicitly named' }
+
before do
allow(cop).to receive(:in_migration?).and_return(true)
end
@@ -29,9 +28,9 @@ RSpec.describe RuboCop::Cop::Migration::ComplexIndexesRequireName do
t.index :column1, unique: true
t.index :column2, where: 'column1 = 0'
- ^^^^^ #{described_class::MSG}
+ ^^^^^ #{msg}
t.index :column3, using: :gin
- ^^^^^ #{described_class::MSG}
+ ^^^^^ #{msg}
end
end
@@ -40,8 +39,6 @@ RSpec.describe RuboCop::Cop::Migration::ComplexIndexesRequireName do
end
end
RUBY
-
- expect(cop.offenses.map(&:cop_name)).to all(eq("Migration/#{described_class.name.demodulize}"))
end
end
@@ -85,20 +82,18 @@ RSpec.describe RuboCop::Cop::Migration::ComplexIndexesRequireName do
add_index :test_indexes, :column1
add_index :test_indexes, :column2, where: "column2 = 'value'", order: { column4: :desc }
- ^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^^^ #{msg}
end
def down
add_index :test_indexes, :column4, 'unique' => true, where: 'column4 IS NOT NULL'
- ^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^^^ #{msg}
add_concurrent_index :test_indexes, :column6, using: :gin, opclass: :gin_trgm_ops
- ^^^^^^^^^^^^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^^^^^^^^^^^^^^ #{msg}
end
end
RUBY
-
- expect(cop.offenses.map(&:cop_name)).to all(eq("Migration/#{described_class.name.demodulize}"))
end
end
@@ -132,7 +127,7 @@ RSpec.describe RuboCop::Cop::Migration::ComplexIndexesRequireName do
end
end
- context 'outside migration' do
+ context 'when outside migration' do
before do
allow(cop).to receive(:in_migration?).and_return(false)
end
diff --git a/spec/rubocop/cop/migration/create_table_with_foreign_keys_spec.rb b/spec/rubocop/cop/migration/create_table_with_foreign_keys_spec.rb
index 2159bad1490..7bcaf36b014 100644
--- a/spec/rubocop/cop/migration/create_table_with_foreign_keys_spec.rb
+++ b/spec/rubocop/cop/migration/create_table_with_foreign_keys_spec.rb
@@ -1,12 +1,9 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/migration/create_table_with_foreign_keys'
RSpec.describe RuboCop::Cop::Migration::CreateTableWithForeignKeys do
- include CopHelper
-
let(:cop) { described_class.new }
context 'outside of a migration' do
@@ -22,7 +19,7 @@ RSpec.describe RuboCop::Cop::Migration::CreateTableWithForeignKeys do
end
end
- context 'in a migration' do
+ context 'when in a migration' do
before do
allow(cop).to receive(:in_migration?).and_return(true)
end
diff --git a/spec/rubocop/cop/migration/datetime_spec.rb b/spec/rubocop/cop/migration/datetime_spec.rb
index a3cccae21e0..3854ddfe99c 100644
--- a/spec/rubocop/cop/migration/datetime_spec.rb
+++ b/spec/rubocop/cop/migration/datetime_spec.rb
@@ -1,44 +1,11 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/migration/datetime'
RSpec.describe RuboCop::Cop::Migration::Datetime do
- include CopHelper
-
subject(:cop) { described_class.new }
- let(:create_table_migration_with_datetime) do
- %q(
- class Users < ActiveRecord::Migration[6.0]
- DOWNTIME = false
-
- def change
- create_table :users do |t|
- t.string :username, null: false
- t.datetime :last_sign_in
- end
- end
- end
- )
- end
-
- let(:create_table_migration_with_timestamp) do
- %q(
- class Users < ActiveRecord::Migration[6.0]
- DOWNTIME = false
-
- def change
- create_table :users do |t|
- t.string :username, null: false
- t.timestamp :last_sign_in
- end
- end
- end
- )
- end
-
let(:create_table_migration_without_datetime) do
%q(
class Users < ActiveRecord::Migration[6.0]
@@ -120,92 +87,94 @@ RSpec.describe RuboCop::Cop::Migration::Datetime do
)
end
- context 'in migration' do
+ context 'when in migration' do
before do
allow(cop).to receive(:in_migration?).and_return(true)
end
it 'registers an offense when the ":datetime" data type is used on create_table' do
- inspect_source(create_table_migration_with_datetime)
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(1)
- expect(cop.offenses.map(&:line)).to eq([8])
- expect(cop.offenses.first.message).to include('`datetime`')
- end
+ expect_offense(<<~RUBY)
+ class Users < ActiveRecord::Migration[6.0]
+ DOWNTIME = false
+
+ def change
+ create_table :users do |t|
+ t.string :username, null: false
+ t.datetime :last_sign_in
+ ^^^^^^^^ Do not use the `datetime` data type[...]
+ end
+ end
+ end
+ RUBY
end
it 'registers an offense when the ":timestamp" data type is used on create_table' do
- inspect_source(create_table_migration_with_timestamp)
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(1)
- expect(cop.offenses.map(&:line)).to eq([8])
- expect(cop.offenses.first.message).to include('timestamp')
- end
+ expect_offense(<<~RUBY)
+ class Users < ActiveRecord::Migration[6.0]
+ DOWNTIME = false
+
+ def change
+ create_table :users do |t|
+ t.string :username, null: false
+ t.timestamp :last_sign_in
+ ^^^^^^^^^ Do not use the `timestamp` data type[...]
+ end
+ end
+ end
+ RUBY
end
it 'does not register an offense when the ":datetime" data type is not used on create_table' do
- inspect_source(create_table_migration_without_datetime)
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(0)
- end
+ expect_no_offenses(create_table_migration_without_datetime)
end
it 'does not register an offense when the ":datetime_with_timezone" data type is used on create_table' do
- inspect_source(create_table_migration_with_datetime_with_timezone)
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(0)
- end
+ expect_no_offenses(create_table_migration_with_datetime_with_timezone)
end
it 'registers an offense when the ":datetime" data type is used on add_column' do
- inspect_source(add_column_migration_with_datetime)
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(1)
- expect(cop.offenses.map(&:line)).to eq([7])
- expect(cop.offenses.first.message).to include('`datetime`')
- end
+ expect_offense(<<~RUBY)
+ class Users < ActiveRecord::Migration[6.0]
+ DOWNTIME = false
+
+ def change
+ add_column(:users, :username, :text)
+ add_column(:users, :last_sign_in, :datetime)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Do not use the `datetime` data type[...]
+ end
+ end
+ RUBY
end
it 'registers an offense when the ":timestamp" data type is used on add_column' do
- inspect_source(add_column_migration_with_timestamp)
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(1)
- expect(cop.offenses.map(&:line)).to eq([7])
- expect(cop.offenses.first.message).to include('timestamp')
- end
+ expect_offense(<<~RUBY)
+ class Users < ActiveRecord::Migration[6.0]
+ DOWNTIME = false
+
+ def change
+ add_column(:users, :username, :text)
+ add_column(:users, :last_sign_in, :timestamp)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Do not use the `timestamp` data type[...]
+ end
+ end
+ RUBY
end
it 'does not register an offense when the ":datetime" data type is not used on add_column' do
- inspect_source(add_column_migration_without_datetime)
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(0)
- end
+ expect_no_offenses(add_column_migration_without_datetime)
end
it 'does not register an offense when the ":datetime_with_timezone" data type is used on add_column' do
- inspect_source(add_column_migration_with_datetime_with_timezone)
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(0)
- end
+ expect_no_offenses(add_column_migration_with_datetime_with_timezone)
end
end
- context 'outside of migration' do
- it 'registers no offense' do
- inspect_source(add_column_migration_with_datetime)
- inspect_source(add_column_migration_with_timestamp)
- inspect_source(add_column_migration_without_datetime)
- inspect_source(add_column_migration_with_datetime_with_timezone)
-
- expect(cop.offenses.size).to eq(0)
+ context 'when outside of migration' do
+ it 'registers no offense', :aggregate_failures do
+ expect_no_offenses(add_column_migration_with_datetime)
+ expect_no_offenses(add_column_migration_with_timestamp)
+ expect_no_offenses(add_column_migration_without_datetime)
+ expect_no_offenses(add_column_migration_with_datetime_with_timezone)
end
end
end
diff --git a/spec/rubocop/cop/migration/drop_table_spec.rb b/spec/rubocop/cop/migration/drop_table_spec.rb
index d783cb56203..f1bd710f5e6 100644
--- a/spec/rubocop/cop/migration/drop_table_spec.rb
+++ b/spec/rubocop/cop/migration/drop_table_spec.rb
@@ -1,15 +1,16 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/migration/drop_table'
RSpec.describe RuboCop::Cop::Migration::DropTable do
- include CopHelper
-
subject(:cop) { described_class.new }
context 'when in deployment migration' do
+ let(:msg) do
+ '`drop_table` in deployment migrations requires downtime. Drop tables in post-deployment migrations instead.'
+ end
+
before do
allow(cop).to receive(:in_deployment_migration?).and_return(true)
end
@@ -30,7 +31,7 @@ RSpec.describe RuboCop::Cop::Migration::DropTable do
expect_offense(<<~PATTERN)
def up
drop_table :table
- ^^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^^^^ #{msg}
end
PATTERN
end
@@ -41,7 +42,7 @@ RSpec.describe RuboCop::Cop::Migration::DropTable do
expect_offense(<<~PATTERN)
def change
drop_table :table
- ^^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^^^^ #{msg}
end
PATTERN
end
@@ -63,7 +64,7 @@ RSpec.describe RuboCop::Cop::Migration::DropTable do
expect_offense(<<~PATTERN)
def up
execute "DROP TABLE table"
- ^^^^^^^ #{described_class::MSG}
+ ^^^^^^^ #{msg}
end
PATTERN
end
@@ -74,7 +75,7 @@ RSpec.describe RuboCop::Cop::Migration::DropTable do
expect_offense(<<~PATTERN)
def change
execute "DROP TABLE table"
- ^^^^^^^ #{described_class::MSG}
+ ^^^^^^^ #{msg}
end
PATTERN
end
diff --git a/spec/rubocop/cop/migration/hash_index_spec.rb b/spec/rubocop/cop/migration/hash_index_spec.rb
index 15f68eb990f..6da27af39b6 100644
--- a/spec/rubocop/cop/migration/hash_index_spec.rb
+++ b/spec/rubocop/cop/migration/hash_index_spec.rb
@@ -1,52 +1,47 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/migration/hash_index'
RSpec.describe RuboCop::Cop::Migration::HashIndex do
- include CopHelper
-
subject(:cop) { described_class.new }
- context 'in migration' do
+ context 'when in migration' do
before do
allow(cop).to receive(:in_migration?).and_return(true)
end
it 'registers an offense when creating a hash index' do
- inspect_source('def change; add_index :table, :column, using: :hash; end')
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(1)
- expect(cop.offenses.map(&:line)).to eq([1])
- end
+ expect_offense(<<~RUBY)
+ def change
+ add_index :table, :column, using: :hash
+ ^^^^^^^^^^^^ hash indexes should be avoided at all costs[...]
+ end
+ RUBY
end
it 'registers an offense when creating a concurrent hash index' do
- inspect_source('def change; add_concurrent_index :table, :column, using: :hash; end')
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(1)
- expect(cop.offenses.map(&:line)).to eq([1])
- end
+ expect_offense(<<~RUBY)
+ def change
+ add_concurrent_index :table, :column, using: :hash
+ ^^^^^^^^^^^^ hash indexes should be avoided at all costs[...]
+ end
+ RUBY
end
it 'registers an offense when creating a hash index using t.index' do
- inspect_source('def change; t.index :table, :column, using: :hash; end')
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(1)
- expect(cop.offenses.map(&:line)).to eq([1])
- end
+ expect_offense(<<~RUBY)
+ def change
+ t.index :table, :column, using: :hash
+ ^^^^^^^^^^^^ hash indexes should be avoided at all costs[...]
+ end
+ RUBY
end
end
- context 'outside of migration' do
+ context 'when outside of migration' do
it 'registers no offense' do
- inspect_source('def change; index :table, :column, using: :hash; end')
-
- expect(cop.offenses.size).to eq(0)
+ expect_no_offenses('def change; index :table, :column, using: :hash; end')
end
end
end
diff --git a/spec/rubocop/cop/migration/prevent_strings_spec.rb b/spec/rubocop/cop/migration/prevent_strings_spec.rb
index 560a485017a..a9b62f23a77 100644
--- a/spec/rubocop/cop/migration/prevent_strings_spec.rb
+++ b/spec/rubocop/cop/migration/prevent_strings_spec.rb
@@ -1,49 +1,44 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/migration/prevent_strings'
RSpec.describe RuboCop::Cop::Migration::PreventStrings do
- include CopHelper
-
subject(:cop) { described_class.new }
- context 'in migration' do
+ context 'when in migration' do
before do
allow(cop).to receive(:in_migration?).and_return(true)
end
context 'when the string data type is used' do
it 'registers an offense' do
- expect_offense(<<~RUBY)
+ expect_offense(<<~RUBY, msg: "Do not use the `string` data type, use `text` instead.[...]")
class Users < ActiveRecord::Migration[6.0]
DOWNTIME = false
def up
create_table :users do |t|
t.string :username, null: false
- ^^^^^^ #{described_class::MSG}
+ ^^^^^^ %{msg}
t.timestamps_with_timezone null: true
t.string :password
- ^^^^^^ #{described_class::MSG}
+ ^^^^^^ %{msg}
end
add_column(:users, :bio, :string)
- ^^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^^^^ %{msg}
add_column_with_default(:users, :url, :string, default: '/-/user', allow_null: false, limit: 255)
- ^^^^^^^^^^^^^^^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^^^^^^^^^^^^^^^^^ %{msg}
change_column_type_concurrently :users, :commit_id, :string
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ %{msg}
end
end
RUBY
-
- expect(cop.offenses.map(&:cop_name)).to all(eq('Migration/PreventStrings'))
end
end
@@ -109,7 +104,7 @@ RSpec.describe RuboCop::Cop::Migration::PreventStrings do
end
end
- context 'on down' do
+ context 'when using down method' do
it 'registers no offense' do
expect_no_offenses(<<~RUBY)
class Users < ActiveRecord::Migration[6.0]
@@ -138,7 +133,7 @@ RSpec.describe RuboCop::Cop::Migration::PreventStrings do
end
end
- context 'outside of migration' do
+ context 'when outside of migration' do
it 'registers no offense' do
expect_no_offenses(<<~RUBY)
class Users < ActiveRecord::Migration[6.0]
diff --git a/spec/rubocop/cop/migration/refer_to_index_by_name_spec.rb b/spec/rubocop/cop/migration/refer_to_index_by_name_spec.rb
index a25328a56a8..b3e66492d83 100644
--- a/spec/rubocop/cop/migration/refer_to_index_by_name_spec.rb
+++ b/spec/rubocop/cop/migration/refer_to_index_by_name_spec.rb
@@ -1,22 +1,19 @@
# frozen_string_literal: true
#
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/migration/refer_to_index_by_name'
RSpec.describe RuboCop::Cop::Migration::ReferToIndexByName do
- include CopHelper
-
subject(:cop) { described_class.new }
- context 'in migration' do
+ context 'when in migration' do
before do
allow(cop).to receive(:in_migration?).and_return(true)
end
context 'when existing indexes are referred to without an explicit name' do
it 'registers an offense' do
- expect_offense(<<~RUBY)
+ expect_offense(<<~RUBY, msg: 'migration methods that refer to existing indexes must do so by name')
class TestReferToIndexByName < ActiveRecord::Migration[6.0]
DOWNTIME = false
@@ -30,22 +27,22 @@ RSpec.describe RuboCop::Cop::Migration::ReferToIndexByName do
end
if index_exists? :test_indexes, :column2
- ^^^^^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^^^^^^^ %{msg}
remove_index :test_indexes, :column2
- ^^^^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^^^^^^ %{msg}
end
remove_index :test_indexes, column: column3
- ^^^^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^^^^^^ %{msg}
remove_index :test_indexes, name: 'index_name_4'
end
def down
if index_exists? :test_indexes, :column4, using: :gin, opclass: :gin_trgm_ops
- ^^^^^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^^^^^^^ %{msg}
remove_concurrent_index :test_indexes, :column4, using: :gin, opclass: :gin_trgm_ops
- ^^^^^^^^^^^^^^^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^^^^^^^^^^^^^^^^^ %{msg}
end
if index_exists? :test_indexes, :column3, unique: true, name: 'index_name_3', where: 'column3 = 10'
@@ -54,13 +51,11 @@ RSpec.describe RuboCop::Cop::Migration::ReferToIndexByName do
end
end
RUBY
-
- expect(cop.offenses.map(&:cop_name)).to all(eq("Migration/#{described_class.name.demodulize}"))
end
end
end
- context 'outside migration' do
+ context 'when outside migration' do
before do
allow(cop).to receive(:in_migration?).and_return(false)
end
diff --git a/spec/rubocop/cop/migration/remove_column_spec.rb b/spec/rubocop/cop/migration/remove_column_spec.rb
index 4768093b10d..f72a5b048d5 100644
--- a/spec/rubocop/cop/migration/remove_column_spec.rb
+++ b/spec/rubocop/cop/migration/remove_column_spec.rb
@@ -1,67 +1,58 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/migration/remove_column'
RSpec.describe RuboCop::Cop::Migration::RemoveColumn do
- include CopHelper
-
subject(:cop) { described_class.new }
def source(meth = 'change')
"def #{meth}; remove_column :table, :column; end"
end
- context 'in a regular migration' do
+ context 'when in a regular migration' do
before do
allow(cop).to receive(:in_migration?).and_return(true)
allow(cop).to receive(:in_post_deployment_migration?).and_return(false)
end
it 'registers an offense when remove_column is used in the change method' do
- inspect_source(source('change'))
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(1)
- expect(cop.offenses.map(&:line)).to eq([1])
- end
+ expect_offense(<<~RUBY)
+ def change
+ remove_column :table, :column
+ ^^^^^^^^^^^^^ `remove_column` must only be used in post-deployment migrations
+ end
+ RUBY
end
it 'registers an offense when remove_column is used in the up method' do
- inspect_source(source('up'))
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(1)
- expect(cop.offenses.map(&:line)).to eq([1])
- end
+ expect_offense(<<~RUBY)
+ def up
+ remove_column :table, :column
+ ^^^^^^^^^^^^^ `remove_column` must only be used in post-deployment migrations
+ end
+ RUBY
end
it 'registers no offense when remove_column is used in the down method' do
- inspect_source(source('down'))
-
- expect(cop.offenses.size).to eq(0)
+ expect_no_offenses(source('down'))
end
end
- context 'in a post-deployment migration' do
+ context 'when in a post-deployment migration' do
before do
allow(cop).to receive(:in_migration?).and_return(true)
allow(cop).to receive(:in_post_deployment_migration?).and_return(true)
end
it 'registers no offense' do
- inspect_source(source)
-
- expect(cop.offenses.size).to eq(0)
+ expect_no_offenses(source)
end
end
- context 'outside of a migration' do
+ context 'when outside of a migration' do
it 'registers no offense' do
- inspect_source(source)
-
- expect(cop.offenses.size).to eq(0)
+ expect_no_offenses(source)
end
end
end
diff --git a/spec/rubocop/cop/migration/remove_concurrent_index_spec.rb b/spec/rubocop/cop/migration/remove_concurrent_index_spec.rb
index 8da368d588c..10ca0353b0f 100644
--- a/spec/rubocop/cop/migration/remove_concurrent_index_spec.rb
+++ b/spec/rubocop/cop/migration/remove_concurrent_index_spec.rb
@@ -1,12 +1,9 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/migration/remove_concurrent_index'
RSpec.describe RuboCop::Cop::Migration::RemoveConcurrentIndex do
- include CopHelper
-
subject(:cop) { described_class.new }
context 'in migration' do
@@ -15,26 +12,22 @@ RSpec.describe RuboCop::Cop::Migration::RemoveConcurrentIndex do
end
it 'registers an offense when remove_concurrent_index is used inside a change method' do
- inspect_source('def change; remove_concurrent_index :table, :column; end')
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(1)
- expect(cop.offenses.map(&:line)).to eq([1])
- end
+ expect_offense(<<~RUBY)
+ def change
+ ^^^^^^ `remove_concurrent_index` is not reversible [...]
+ remove_concurrent_index :table, :column
+ end
+ RUBY
end
it 'registers no offense when remove_concurrent_index is used inside an up method' do
- inspect_source('def up; remove_concurrent_index :table, :column; end')
-
- expect(cop.offenses.size).to eq(0)
+ expect_no_offenses('def up; remove_concurrent_index :table, :column; end')
end
end
context 'outside of migration' do
it 'registers no offense' do
- inspect_source('def change; remove_concurrent_index :table, :column; end')
-
- expect(cop.offenses.size).to eq(0)
+ expect_no_offenses('def change; remove_concurrent_index :table, :column; end')
end
end
end
diff --git a/spec/rubocop/cop/migration/remove_index_spec.rb b/spec/rubocop/cop/migration/remove_index_spec.rb
index 274c907ac41..5d1ffef2589 100644
--- a/spec/rubocop/cop/migration/remove_index_spec.rb
+++ b/spec/rubocop/cop/migration/remove_index_spec.rb
@@ -1,34 +1,29 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/migration/remove_index'
RSpec.describe RuboCop::Cop::Migration::RemoveIndex do
- include CopHelper
-
subject(:cop) { described_class.new }
- context 'in migration' do
+ context 'when in migration' do
before do
allow(cop).to receive(:in_migration?).and_return(true)
end
it 'registers an offense when remove_index is used' do
- inspect_source('def change; remove_index :table, :column; end')
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(1)
- expect(cop.offenses.map(&:line)).to eq([1])
- end
+ expect_offense(<<~RUBY)
+ def change
+ remove_index :table, :column
+ ^^^^^^^^^^^^ `remove_index` requires downtime, use `remove_concurrent_index` instead
+ end
+ RUBY
end
end
- context 'outside of migration' do
+ context 'when outside of migration' do
it 'registers no offense' do
- inspect_source('def change; remove_index :table, :column; end')
-
- expect(cop.offenses.size).to eq(0)
+ expect_no_offenses('def change; remove_index :table, :column; end')
end
end
end
diff --git a/spec/rubocop/cop/migration/safer_boolean_column_spec.rb b/spec/rubocop/cop/migration/safer_boolean_column_spec.rb
index aa7bb58ab45..cf9bdbeef91 100644
--- a/spec/rubocop/cop/migration/safer_boolean_column_spec.rb
+++ b/spec/rubocop/cop/migration/safer_boolean_column_spec.rb
@@ -1,12 +1,9 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/migration/safer_boolean_column'
RSpec.describe RuboCop::Cop::Migration::SaferBooleanColumn do
- include CopHelper
-
subject(:cop) { described_class.new }
context 'in migration' do
@@ -31,11 +28,10 @@ RSpec.describe RuboCop::Cop::Migration::SaferBooleanColumn do
sources_and_offense.each do |source, offense|
context "given the source \"#{source}\"" do
it "registers the offense matching \"#{offense}\"" do
- inspect_source(source)
-
- aggregate_failures do
- expect(cop.offenses.first.message).to match(offense)
- end
+ expect_offense(<<~RUBY, node: source, msg: offense)
+ %{node}
+ ^{node} Boolean columns on the `#{table}` table %{msg}.[...]
+ RUBY
end
end
end
@@ -48,11 +44,7 @@ RSpec.describe RuboCop::Cop::Migration::SaferBooleanColumn do
inoffensive_sources.each do |source|
context "given the source \"#{source}\"" do
it "registers no offense" do
- inspect_source(source)
-
- aggregate_failures do
- expect(cop.offenses).to be_empty
- end
+ expect_no_offenses(source)
end
end
end
@@ -60,25 +52,19 @@ RSpec.describe RuboCop::Cop::Migration::SaferBooleanColumn do
end
it 'registers no offense for tables not listed in SMALL_TABLES' do
- inspect_source("add_column :large_table, :column, :boolean")
-
- expect(cop.offenses).to be_empty
+ expect_no_offenses("add_column :large_table, :column, :boolean")
end
it 'registers no offense for non-boolean columns' do
table = described_class::SMALL_TABLES.sample
- inspect_source("add_column :#{table}, :column, :string")
-
- expect(cop.offenses).to be_empty
+ expect_no_offenses("add_column :#{table}, :column, :string")
end
end
context 'outside of migration' do
it 'registers no offense' do
table = described_class::SMALL_TABLES.sample
- inspect_source("add_column :#{table}, :column, :boolean")
-
- expect(cop.offenses).to be_empty
+ expect_no_offenses("add_column :#{table}, :column, :boolean")
end
end
end
diff --git a/spec/rubocop/cop/migration/schedule_async_spec.rb b/spec/rubocop/cop/migration/schedule_async_spec.rb
index a7246dfa73a..b89acb6db41 100644
--- a/spec/rubocop/cop/migration/schedule_async_spec.rb
+++ b/spec/rubocop/cop/migration/schedule_async_spec.rb
@@ -2,14 +2,9 @@
require 'fast_spec_helper'
-require 'rubocop'
-require 'rubocop/rspec/support'
-
require_relative '../../../../rubocop/cop/migration/schedule_async'
RSpec.describe RuboCop::Cop::Migration::ScheduleAsync do
- include CopHelper
-
let(:cop) { described_class.new }
let(:source) do
<<~SOURCE
@@ -21,9 +16,7 @@ RSpec.describe RuboCop::Cop::Migration::ScheduleAsync do
shared_examples 'a disabled cop' do
it 'does not register any offenses' do
- inspect_source(source)
-
- expect(cop.offenses).to be_empty
+ expect_no_offenses(source)
end
end
@@ -50,101 +43,73 @@ RSpec.describe RuboCop::Cop::Migration::ScheduleAsync do
end
context 'BackgroundMigrationWorker.perform_async' do
- it 'adds an offence when calling `BackgroundMigrationWorker.peform_async`' do
- inspect_source(source)
-
- expect(cop.offenses.size).to eq(1)
- end
-
- it 'autocorrects to the right version' do
- correct_source = <<~CORRECT
- def up
- migrate_async(ClazzName, "Bar", "Baz")
- end
- CORRECT
+ it 'adds an offense when calling `BackgroundMigrationWorker.peform_async` and corrects', :aggregate_failures do
+ expect_offense(<<~RUBY)
+ def up
+ BackgroundMigrationWorker.perform_async(ClazzName, "Bar", "Baz")
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Don't call [...]
+ end
+ RUBY
- expect(autocorrect_source(source)).to eq(correct_source)
+ expect_correction(<<~RUBY)
+ def up
+ migrate_async(ClazzName, "Bar", "Baz")
+ end
+ RUBY
end
end
context 'BackgroundMigrationWorker.perform_in' do
- let(:source) do
- <<~SOURCE
+ it 'adds an offense and corrects', :aggregate_failures do
+ expect_offense(<<~RUBY)
def up
BackgroundMigrationWorker
+ ^^^^^^^^^^^^^^^^^^^^^^^^^ Don't call [...]
.perform_in(delay, ClazzName, "Bar", "Baz")
end
- SOURCE
- end
-
- it 'adds an offence' do
- inspect_source(source)
+ RUBY
- expect(cop.offenses.size).to eq(1)
- end
-
- it 'autocorrects to the right version' do
- correct_source = <<~CORRECT
+ expect_correction(<<~RUBY)
def up
migrate_in(delay, ClazzName, "Bar", "Baz")
end
- CORRECT
-
- expect(autocorrect_source(source)).to eq(correct_source)
+ RUBY
end
end
context 'BackgroundMigrationWorker.bulk_perform_async' do
- let(:source) do
- <<~SOURCE
+ it 'adds an offense and corrects', :aggregate_failures do
+ expect_offense(<<~RUBY)
def up
BackgroundMigrationWorker
+ ^^^^^^^^^^^^^^^^^^^^^^^^^ Don't call [...]
.bulk_perform_async(jobs)
end
- SOURCE
- end
-
- it 'adds an offence' do
- inspect_source(source)
-
- expect(cop.offenses.size).to eq(1)
- end
+ RUBY
- it 'autocorrects to the right version' do
- correct_source = <<~CORRECT
+ expect_correction(<<~RUBY)
def up
bulk_migrate_async(jobs)
end
- CORRECT
-
- expect(autocorrect_source(source)).to eq(correct_source)
+ RUBY
end
end
context 'BackgroundMigrationWorker.bulk_perform_in' do
- let(:source) do
- <<~SOURCE
+ it 'adds an offense and corrects', :aggregate_failures do
+ expect_offense(<<~RUBY)
def up
BackgroundMigrationWorker
+ ^^^^^^^^^^^^^^^^^^^^^^^^^ Don't call [...]
.bulk_perform_in(5.minutes, jobs)
end
- SOURCE
- end
-
- it 'adds an offence' do
- inspect_source(source)
+ RUBY
- expect(cop.offenses.size).to eq(1)
- end
-
- it 'autocorrects to the right version' do
- correct_source = <<~CORRECT
+ expect_correction(<<~RUBY)
def up
bulk_migrate_in(5.minutes, jobs)
end
- CORRECT
-
- expect(autocorrect_source(source)).to eq(correct_source)
+ RUBY
end
end
end
diff --git a/spec/rubocop/cop/migration/timestamps_spec.rb b/spec/rubocop/cop/migration/timestamps_spec.rb
index 2f4154907d2..91bb5c1b05b 100644
--- a/spec/rubocop/cop/migration/timestamps_spec.rb
+++ b/spec/rubocop/cop/migration/timestamps_spec.rb
@@ -1,12 +1,9 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/migration/timestamps'
RSpec.describe RuboCop::Cop::Migration::Timestamps do
- include CopHelper
-
subject(:cop) { described_class.new }
let(:migration_with_timestamps) do
@@ -62,38 +59,36 @@ RSpec.describe RuboCop::Cop::Migration::Timestamps do
end
it 'registers an offense when the "timestamps" method is used' do
- inspect_source(migration_with_timestamps)
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(1)
- expect(cop.offenses.map(&:line)).to eq([8])
- end
+ expect_offense(<<~RUBY)
+ class Users < ActiveRecord::Migration[4.2]
+ DOWNTIME = false
+
+ def change
+ create_table :users do |t|
+ t.string :username, null: false
+ t.timestamps null: true
+ ^^^^^^^^^^ Do not use `timestamps`, use `timestamps_with_timezone` instead
+ t.string :password
+ end
+ end
+ end
+ RUBY
end
it 'does not register an offense when the "timestamps" method is not used' do
- inspect_source(migration_without_timestamps)
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(0)
- end
+ expect_no_offenses(migration_without_timestamps)
end
it 'does not register an offense when the "timestamps_with_timezone" method is used' do
- inspect_source(migration_with_timestamps_with_timezone)
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(0)
- end
+ expect_no_offenses(migration_with_timestamps_with_timezone)
end
end
context 'outside of migration' do
- it 'registers no offense' do
- inspect_source(migration_with_timestamps)
- inspect_source(migration_without_timestamps)
- inspect_source(migration_with_timestamps_with_timezone)
-
- expect(cop.offenses.size).to eq(0)
+ it 'registers no offense', :aggregate_failures do
+ expect_no_offenses(migration_with_timestamps)
+ expect_no_offenses(migration_without_timestamps)
+ expect_no_offenses(migration_with_timestamps_with_timezone)
end
end
end
diff --git a/spec/rubocop/cop/migration/update_column_in_batches_spec.rb b/spec/rubocop/cop/migration/update_column_in_batches_spec.rb
index 8049cba12d0..a12ae94c22b 100644
--- a/spec/rubocop/cop/migration/update_column_in_batches_spec.rb
+++ b/spec/rubocop/cop/migration/update_column_in_batches_spec.rb
@@ -2,9 +2,6 @@
require 'fast_spec_helper'
-require 'rubocop'
-require 'rubocop/rspec/support'
-
require_relative '../../../../rubocop/cop/migration/update_column_in_batches'
RSpec.describe RuboCop::Cop::Migration::UpdateColumnInBatches do
@@ -31,9 +28,7 @@ RSpec.describe RuboCop::Cop::Migration::UpdateColumnInBatches do
context 'outside of a migration' do
it 'does not register any offenses' do
- inspect_source(migration_code)
-
- expect(cop.offenses).to be_empty
+ expect_no_offenses(migration_code)
end
end
@@ -53,14 +48,14 @@ RSpec.describe RuboCop::Cop::Migration::UpdateColumnInBatches do
let(:relative_spec_filepath) { Pathname.new(spec_filepath).relative_path_from(tmp_rails_root) }
it 'registers an offense when using update_column_in_batches' do
- inspect_source(migration_code, @migration_file)
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(1)
- expect(cop.offenses.map(&:line)).to eq([2])
- expect(cop.offenses.first.message)
- .to include("`#{relative_spec_filepath}`")
- end
+ expect_offense(<<~RUBY, @migration_file)
+ def up
+ update_column_in_batches(:projects, :name, "foo") do |table, query|
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Migration running `update_column_in_batches` [...]
+ query.where(table[:name].eq(nil))
+ end
+ end
+ RUBY
end
end
@@ -76,20 +71,18 @@ RSpec.describe RuboCop::Cop::Migration::UpdateColumnInBatches do
end
it 'does not register any offenses' do
- inspect_source(migration_code, @migration_file)
-
- expect(cop.offenses).to be_empty
+ expect_no_offenses(migration_code)
end
end
- context 'in a migration' do
+ context 'when in migration' do
let(:migration_filepath) { File.join(tmp_rails_root, 'db', 'migrate', '20121220064453_my_super_migration.rb') }
it_behaves_like 'a migration file with no spec file'
it_behaves_like 'a migration file with a spec file'
end
- context 'in a post migration' do
+ context 'when in a post migration' do
let(:migration_filepath) { File.join(tmp_rails_root, 'db', 'post_migrate', '20121220064453_my_super_migration.rb') }
it_behaves_like 'a migration file with no spec file'
@@ -99,14 +92,14 @@ RSpec.describe RuboCop::Cop::Migration::UpdateColumnInBatches do
context 'EE migrations' do
let(:spec_filepath) { File.join(tmp_rails_root, 'ee', 'spec', 'migrations', 'my_super_migration_spec.rb') }
- context 'in a migration' do
+ context 'when in a migration' do
let(:migration_filepath) { File.join(tmp_rails_root, 'ee', 'db', 'migrate', '20121220064453_my_super_migration.rb') }
it_behaves_like 'a migration file with no spec file'
it_behaves_like 'a migration file with a spec file'
end
- context 'in a post migration' do
+ context 'when in a post migration' do
let(:migration_filepath) { File.join(tmp_rails_root, 'ee', 'db', 'post_migrate', '20121220064453_my_super_migration.rb') }
it_behaves_like 'a migration file with no spec file'
diff --git a/spec/rubocop/cop/migration/with_lock_retries_disallowed_method_spec.rb b/spec/rubocop/cop/migration/with_lock_retries_disallowed_method_spec.rb
index 814d87ea24b..298ca273256 100644
--- a/spec/rubocop/cop/migration/with_lock_retries_disallowed_method_spec.rb
+++ b/spec/rubocop/cop/migration/with_lock_retries_disallowed_method_spec.rb
@@ -1,64 +1,58 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/migration/with_lock_retries_disallowed_method'
RSpec.describe RuboCop::Cop::Migration::WithLockRetriesDisallowedMethod do
- include CopHelper
-
subject(:cop) { described_class.new }
- context 'in migration' do
+ context 'when in migration' do
before do
allow(cop).to receive(:in_migration?).and_return(true)
end
it 'registers an offense when `with_lock_retries` block has disallowed method' do
- inspect_source('def change; with_lock_retries { disallowed_method }; end')
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(1)
- expect(cop.offenses.map(&:line)).to eq([1])
- end
+ expect_offense(<<~RUBY)
+ def change
+ with_lock_retries { disallowed_method }
+ ^^^^^^^^^^^^^^^^^ The method is not allowed [...]
+ end
+ RUBY
end
it 'registers an offense when `with_lock_retries` block has disallowed methods' do
- source = <<~HEREDOC
- def change
- with_lock_retries do
- disallowed_method
+ expect_offense(<<~RUBY)
+ def change
+ with_lock_retries do
+ disallowed_method
+ ^^^^^^^^^^^^^^^^^ The method is not allowed [...]
- create_table do |t|
- t.text :text
- end
+ create_table do |t|
+ t.text :text
+ end
- other_disallowed_method
+ other_disallowed_method
+ ^^^^^^^^^^^^^^^^^^^^^^^ The method is not allowed [...]
- add_column :users, :name
+ add_column :users, :name
+ end
end
- end
- HEREDOC
-
- inspect_source(source)
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(2)
- expect(cop.offenses.map(&:line)).to eq([3, 9])
- end
+ RUBY
end
it 'registers no offense when `with_lock_retries` has only allowed method' do
- inspect_source('def up; with_lock_retries { add_foreign_key :foo, :bar }; end')
-
- expect(cop.offenses.size).to eq(0)
+ expect_no_offenses(<<~RUBY)
+ def up
+ with_lock_retries { add_foreign_key :foo, :bar }
+ end
+ RUBY
end
describe 'for `add_foreign_key`' do
it 'registers an offense when more than two FKs are added' do
message = described_class::MSG_ONLY_ONE_FK_ALLOWED
- expect_offense <<~RUBY
+ expect_offense(<<~RUBY)
with_lock_retries do
add_foreign_key :imports, :projects, column: :project_id, on_delete: :cascade
^^^^^^^^^^^^^^^ #{message}
@@ -71,11 +65,13 @@ RSpec.describe RuboCop::Cop::Migration::WithLockRetriesDisallowedMethod do
end
end
- context 'outside of migration' do
+ context 'when outside of migration' do
it 'registers no offense' do
- inspect_source('def change; with_lock_retries { disallowed_method }; end')
-
- expect(cop.offenses.size).to eq(0)
+ expect_no_offenses(<<~RUBY)
+ def change
+ with_lock_retries { disallowed_method }
+ end
+ RUBY
end
end
end
diff --git a/spec/rubocop/cop/migration/with_lock_retries_with_change_spec.rb b/spec/rubocop/cop/migration/with_lock_retries_with_change_spec.rb
index f0be14c8ee9..f2e84a8697c 100644
--- a/spec/rubocop/cop/migration/with_lock_retries_with_change_spec.rb
+++ b/spec/rubocop/cop/migration/with_lock_retries_with_change_spec.rb
@@ -1,40 +1,41 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/migration/with_lock_retries_with_change'
RSpec.describe RuboCop::Cop::Migration::WithLockRetriesWithChange do
- include CopHelper
-
subject(:cop) { described_class.new }
- context 'in migration' do
+ context 'when in migration' do
before do
allow(cop).to receive(:in_migration?).and_return(true)
end
it 'registers an offense when `with_lock_retries` is used inside a `change` method' do
- inspect_source('def change; with_lock_retries {}; end')
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(1)
- expect(cop.offenses.map(&:line)).to eq([1])
- end
+ expect_offense(<<~RUBY)
+ def change
+ ^^^^^^ `with_lock_retries` cannot be used within `change` [...]
+ with_lock_retries {}
+ end
+ RUBY
end
it 'registers no offense when `with_lock_retries` is used inside an `up` method' do
- inspect_source('def up; with_lock_retries {}; end')
-
- expect(cop.offenses.size).to eq(0)
+ expect_no_offenses(<<~RUBY)
+ def up
+ with_lock_retries {}
+ end
+ RUBY
end
end
- context 'outside of migration' do
+ context 'when outside of migration' do
it 'registers no offense' do
- inspect_source('def change; with_lock_retries {}; end')
-
- expect(cop.offenses.size).to eq(0)
+ expect_no_offenses(<<~RUBY)
+ def change
+ with_lock_retries {}
+ end
+ RUBY
end
end
end
diff --git a/spec/rubocop/cop/performance/ar_count_each_spec.rb b/spec/rubocop/cop/performance/ar_count_each_spec.rb
index 402e3e93147..fa7a1aba426 100644
--- a/spec/rubocop/cop/performance/ar_count_each_spec.rb
+++ b/spec/rubocop/cop/performance/ar_count_each_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/performance/ar_count_each.rb'
RSpec.describe RuboCop::Cop::Performance::ARCountEach do
diff --git a/spec/rubocop/cop/performance/ar_exists_and_present_blank_spec.rb b/spec/rubocop/cop/performance/ar_exists_and_present_blank_spec.rb
index 8497ff0e909..127c858a549 100644
--- a/spec/rubocop/cop/performance/ar_exists_and_present_blank_spec.rb
+++ b/spec/rubocop/cop/performance/ar_exists_and_present_blank_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/performance/ar_exists_and_present_blank.rb'
RSpec.describe RuboCop::Cop::Performance::ARExistsAndPresentBlank do
diff --git a/spec/rubocop/cop/performance/readlines_each_spec.rb b/spec/rubocop/cop/performance/readlines_each_spec.rb
index 5a30107722a..0a8b168ce5d 100644
--- a/spec/rubocop/cop/performance/readlines_each_spec.rb
+++ b/spec/rubocop/cop/performance/readlines_each_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/performance/readlines_each'
RSpec.describe RuboCop::Cop::Performance::ReadlinesEach do
diff --git a/spec/rubocop/cop/prefer_class_methods_over_module_spec.rb b/spec/rubocop/cop/prefer_class_methods_over_module_spec.rb
index dc665f9dd25..1261ca7891c 100644
--- a/spec/rubocop/cop/prefer_class_methods_over_module_spec.rb
+++ b/spec/rubocop/cop/prefer_class_methods_over_module_spec.rb
@@ -1,16 +1,12 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
-require 'rubocop/rspec/support'
require_relative '../../../rubocop/cop/prefer_class_methods_over_module'
RSpec.describe RuboCop::Cop::PreferClassMethodsOverModule do
- include CopHelper
-
subject(:cop) { described_class.new }
- it 'flags violation when using module ClassMethods' do
+ it 'flags violation when using module ClassMethods and corrects', :aggregate_failures do
expect_offense(<<~RUBY)
module Foo
extend ActiveSupport::Concern
@@ -22,6 +18,17 @@ RSpec.describe RuboCop::Cop::PreferClassMethodsOverModule do
end
end
RUBY
+
+ expect_correction(<<~RUBY)
+ module Foo
+ extend ActiveSupport::Concern
+
+ class_methods do
+ def a_class_method
+ end
+ end
+ end
+ RUBY
end
it "doesn't flag violation when using class_methods" do
@@ -69,30 +76,4 @@ RSpec.describe RuboCop::Cop::PreferClassMethodsOverModule do
end
RUBY
end
-
- it 'autocorrects ClassMethods into class_methods' do
- source = <<~RUBY
- module Foo
- extend ActiveSupport::Concern
-
- module ClassMethods
- def a_class_method
- end
- end
- end
- RUBY
- autocorrected = autocorrect_source(source)
-
- expected_source = <<~RUBY
- module Foo
- extend ActiveSupport::Concern
-
- class_methods do
- def a_class_method
- end
- end
- end
- RUBY
- expect(autocorrected).to eq(expected_source)
- end
end
diff --git a/spec/rubocop/cop/project_path_helper_spec.rb b/spec/rubocop/cop/project_path_helper_spec.rb
index 16782802a27..b3c920f9d25 100644
--- a/spec/rubocop/cop/project_path_helper_spec.rb
+++ b/spec/rubocop/cop/project_path_helper_spec.rb
@@ -2,7 +2,6 @@
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../rubocop/cop/project_path_helper'
RSpec.describe RuboCop::Cop::ProjectPathHelper do
diff --git a/spec/rubocop/cop/put_group_routes_under_scope_spec.rb b/spec/rubocop/cop/put_group_routes_under_scope_spec.rb
index 46b50d7690b..366fc4b5657 100644
--- a/spec/rubocop/cop/put_group_routes_under_scope_spec.rb
+++ b/spec/rubocop/cop/put_group_routes_under_scope_spec.rb
@@ -1,12 +1,9 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../rubocop/cop/put_group_routes_under_scope'
RSpec.describe RuboCop::Cop::PutGroupRoutesUnderScope do
- include CopHelper
-
subject(:cop) { described_class.new }
%w[resource resources get post put patch delete].each do |route_method|
@@ -15,12 +12,12 @@ RSpec.describe RuboCop::Cop::PutGroupRoutesUnderScope do
marker = '^' * offense.size
expect_offense(<<~PATTERN)
- scope(path: 'groups/*group_id/-', module: :groups) do
- resource :issues
- end
+ scope(path: 'groups/*group_id/-', module: :groups) do
+ resource :issues
+ end
- #{offense}
- #{marker} Put new group routes under /-/ scope
+ #{offense}
+ #{marker} Put new group routes under /-/ scope
PATTERN
end
end
diff --git a/spec/rubocop/cop/put_project_routes_under_scope_spec.rb b/spec/rubocop/cop/put_project_routes_under_scope_spec.rb
index eb783d22129..9d226db09ef 100644
--- a/spec/rubocop/cop/put_project_routes_under_scope_spec.rb
+++ b/spec/rubocop/cop/put_project_routes_under_scope_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../rubocop/cop/put_project_routes_under_scope'
RSpec.describe RuboCop::Cop::PutProjectRoutesUnderScope do
diff --git a/spec/rubocop/cop/qa/ambiguous_page_object_name_spec.rb b/spec/rubocop/cop/qa/ambiguous_page_object_name_spec.rb
index 9332ab4186e..9335b8d01ee 100644
--- a/spec/rubocop/cop/qa/ambiguous_page_object_name_spec.rb
+++ b/spec/rubocop/cop/qa/ambiguous_page_object_name_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/qa/ambiguous_page_object_name'
diff --git a/spec/rubocop/cop/qa/element_with_pattern_spec.rb b/spec/rubocop/cop/qa/element_with_pattern_spec.rb
index 28c351ccf1e..d3e79525c62 100644
--- a/spec/rubocop/cop/qa/element_with_pattern_spec.rb
+++ b/spec/rubocop/cop/qa/element_with_pattern_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/qa/element_with_pattern'
diff --git a/spec/rubocop/cop/rspec/be_success_matcher_spec.rb b/spec/rubocop/cop/rspec/be_success_matcher_spec.rb
index 050f0396fac..678e62048b8 100644
--- a/spec/rubocop/cop/rspec/be_success_matcher_spec.rb
+++ b/spec/rubocop/cop/rspec/be_success_matcher_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/rspec/be_success_matcher'
RSpec.describe RuboCop::Cop::RSpec::BeSuccessMatcher do
diff --git a/spec/rubocop/cop/rspec/env_assignment_spec.rb b/spec/rubocop/cop/rspec/env_assignment_spec.rb
index cc132d1532a..da6bb2fa2fb 100644
--- a/spec/rubocop/cop/rspec/env_assignment_spec.rb
+++ b/spec/rubocop/cop/rspec/env_assignment_spec.rb
@@ -2,7 +2,6 @@
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/rspec/env_assignment'
RSpec.describe RuboCop::Cop::RSpec::EnvAssignment do
diff --git a/spec/rubocop/cop/rspec/expect_gitlab_tracking_spec.rb b/spec/rubocop/cop/rspec/expect_gitlab_tracking_spec.rb
index d1ce8d01e0b..e36feecdd66 100644
--- a/spec/rubocop/cop/rspec/expect_gitlab_tracking_spec.rb
+++ b/spec/rubocop/cop/rspec/expect_gitlab_tracking_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/rspec/expect_gitlab_tracking'
RSpec.describe RuboCop::Cop::RSpec::ExpectGitlabTracking do
diff --git a/spec/rubocop/cop/rspec/factories_in_migration_specs_spec.rb b/spec/rubocop/cop/rspec/factories_in_migration_specs_spec.rb
index 8beec53375e..74c1521fa0e 100644
--- a/spec/rubocop/cop/rspec/factories_in_migration_specs_spec.rb
+++ b/spec/rubocop/cop/rspec/factories_in_migration_specs_spec.rb
@@ -2,7 +2,6 @@
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/rspec/factories_in_migration_specs'
RSpec.describe RuboCop::Cop::RSpec::FactoriesInMigrationSpecs do
diff --git a/spec/rubocop/cop/rspec/factory_bot/inline_association_spec.rb b/spec/rubocop/cop/rspec/factory_bot/inline_association_spec.rb
index 0e6af71ea3e..194e2436ff2 100644
--- a/spec/rubocop/cop/rspec/factory_bot/inline_association_spec.rb
+++ b/spec/rubocop/cop/rspec/factory_bot/inline_association_spec.rb
@@ -2,7 +2,6 @@
require 'fast_spec_helper'
require 'rspec-parameterized'
-require 'rubocop'
require_relative '../../../../../rubocop/cop/rspec/factory_bot/inline_association'
diff --git a/spec/rubocop/cop/rspec/have_gitlab_http_status_spec.rb b/spec/rubocop/cop/rspec/have_gitlab_http_status_spec.rb
index c2d97c8992a..9bdbe145f4c 100644
--- a/spec/rubocop/cop/rspec/have_gitlab_http_status_spec.rb
+++ b/spec/rubocop/cop/rspec/have_gitlab_http_status_spec.rb
@@ -3,7 +3,6 @@
require 'fast_spec_helper'
require 'rspec-parameterized'
-require 'rubocop'
require_relative '../../../../rubocop/cop/rspec/have_gitlab_http_status'
RSpec.describe RuboCop::Cop::RSpec::HaveGitlabHttpStatus do
diff --git a/spec/rubocop/cop/rspec/modify_sidekiq_middleware_spec.rb b/spec/rubocop/cop/rspec/modify_sidekiq_middleware_spec.rb
index ffabbae90dc..7a2b7c92bd1 100644
--- a/spec/rubocop/cop/rspec/modify_sidekiq_middleware_spec.rb
+++ b/spec/rubocop/cop/rspec/modify_sidekiq_middleware_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/rspec/modify_sidekiq_middleware'
RSpec.describe RuboCop::Cop::RSpec::ModifySidekiqMiddleware do
diff --git a/spec/rubocop/cop/rspec/timecop_freeze_spec.rb b/spec/rubocop/cop/rspec/timecop_freeze_spec.rb
index 939623f8299..b8d16d58d9e 100644
--- a/spec/rubocop/cop/rspec/timecop_freeze_spec.rb
+++ b/spec/rubocop/cop/rspec/timecop_freeze_spec.rb
@@ -2,7 +2,6 @@
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/rspec/timecop_freeze'
RSpec.describe RuboCop::Cop::RSpec::TimecopFreeze do
diff --git a/spec/rubocop/cop/rspec/timecop_travel_spec.rb b/spec/rubocop/cop/rspec/timecop_travel_spec.rb
index 476e45e69a6..16e09fb8c45 100644
--- a/spec/rubocop/cop/rspec/timecop_travel_spec.rb
+++ b/spec/rubocop/cop/rspec/timecop_travel_spec.rb
@@ -2,7 +2,6 @@
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/rspec/timecop_travel'
RSpec.describe RuboCop::Cop::RSpec::TimecopTravel do
diff --git a/spec/rubocop/cop/rspec/top_level_describe_path_spec.rb b/spec/rubocop/cop/rspec/top_level_describe_path_spec.rb
index 23531cd0201..78e6bec51d4 100644
--- a/spec/rubocop/cop/rspec/top_level_describe_path_spec.rb
+++ b/spec/rubocop/cop/rspec/top_level_describe_path_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/rspec/top_level_describe_path'
RSpec.describe RuboCop::Cop::RSpec::TopLevelDescribePath do
diff --git a/spec/rubocop/cop/ruby_interpolation_in_translation_spec.rb b/spec/rubocop/cop/ruby_interpolation_in_translation_spec.rb
index cacf0a1b67d..c21999be917 100644
--- a/spec/rubocop/cop/ruby_interpolation_in_translation_spec.rb
+++ b/spec/rubocop/cop/ruby_interpolation_in_translation_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../rubocop/cop/ruby_interpolation_in_translation'
diff --git a/spec/rubocop/cop/safe_params_spec.rb b/spec/rubocop/cop/safe_params_spec.rb
index 62f8e542d86..9a064b93b16 100644
--- a/spec/rubocop/cop/safe_params_spec.rb
+++ b/spec/rubocop/cop/safe_params_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../rubocop/cop/safe_params'
RSpec.describe RuboCop::Cop::SafeParams do
diff --git a/spec/rubocop/cop/scalability/bulk_perform_with_context_spec.rb b/spec/rubocop/cop/scalability/bulk_perform_with_context_spec.rb
index a19ddf9dbe6..01afaf3acb6 100644
--- a/spec/rubocop/cop/scalability/bulk_perform_with_context_spec.rb
+++ b/spec/rubocop/cop/scalability/bulk_perform_with_context_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/scalability/bulk_perform_with_context'
RSpec.describe RuboCop::Cop::Scalability::BulkPerformWithContext do
diff --git a/spec/rubocop/cop/scalability/cron_worker_context_spec.rb b/spec/rubocop/cop/scalability/cron_worker_context_spec.rb
index 11b2b82d2f5..28db12fd075 100644
--- a/spec/rubocop/cop/scalability/cron_worker_context_spec.rb
+++ b/spec/rubocop/cop/scalability/cron_worker_context_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/scalability/cron_worker_context'
RSpec.describe RuboCop::Cop::Scalability::CronWorkerContext do
diff --git a/spec/rubocop/cop/scalability/file_uploads_spec.rb b/spec/rubocop/cop/scalability/file_uploads_spec.rb
index bda5c056b03..ca25b0246f0 100644
--- a/spec/rubocop/cop/scalability/file_uploads_spec.rb
+++ b/spec/rubocop/cop/scalability/file_uploads_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/scalability/file_uploads'
RSpec.describe RuboCop::Cop::Scalability::FileUploads do
diff --git a/spec/rubocop/cop/scalability/idempotent_worker_spec.rb b/spec/rubocop/cop/scalability/idempotent_worker_spec.rb
index 729f2613697..53c0c06f6c9 100644
--- a/spec/rubocop/cop/scalability/idempotent_worker_spec.rb
+++ b/spec/rubocop/cop/scalability/idempotent_worker_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/scalability/idempotent_worker'
RSpec.describe RuboCop::Cop::Scalability::IdempotentWorker do
diff --git a/spec/rubocop/cop/sidekiq_options_queue_spec.rb b/spec/rubocop/cop/sidekiq_options_queue_spec.rb
index 306cbcf62b5..346a8d82475 100644
--- a/spec/rubocop/cop/sidekiq_options_queue_spec.rb
+++ b/spec/rubocop/cop/sidekiq_options_queue_spec.rb
@@ -2,29 +2,19 @@
require 'fast_spec_helper'
-require 'rubocop'
-require 'rubocop/rspec/support'
-
require_relative '../../../rubocop/cop/sidekiq_options_queue'
RSpec.describe RuboCop::Cop::SidekiqOptionsQueue do
- include CopHelper
-
subject(:cop) { described_class.new }
it 'registers an offense when `sidekiq_options` is used with the `queue` option' do
- inspect_source('sidekiq_options queue: "some_queue"')
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(1)
- expect(cop.offenses.map(&:line)).to eq([1])
- expect(cop.highlights).to eq(['queue: "some_queue"'])
- end
+ expect_offense(<<~CODE)
+ sidekiq_options queue: "some_queue"
+ ^^^^^^^^^^^^^^^^^^^ Do not manually set a queue; `ApplicationWorker` sets one automatically.
+ CODE
end
it 'does not register an offense when `sidekiq_options` is used with another option' do
- inspect_source('sidekiq_options retry: false')
-
- expect(cop.offenses).to be_empty
+ expect_no_offenses('sidekiq_options retry: false')
end
end
diff --git a/spec/rubocop/cop/static_translation_definition_spec.rb b/spec/rubocop/cop/static_translation_definition_spec.rb
index 8656b07a6e4..b2b04cbcbde 100644
--- a/spec/rubocop/cop/static_translation_definition_spec.rb
+++ b/spec/rubocop/cop/static_translation_definition_spec.rb
@@ -2,7 +2,6 @@
require 'fast_spec_helper'
-require 'rubocop'
require 'rspec-parameterized'
require_relative '../../../rubocop/cop/static_translation_definition'
diff --git a/spec/rubocop/cop/usage_data/distinct_count_by_large_foreign_key_spec.rb b/spec/rubocop/cop/usage_data/distinct_count_by_large_foreign_key_spec.rb
index b6711effe9e..f377dfe36d8 100644
--- a/spec/rubocop/cop/usage_data/distinct_count_by_large_foreign_key_spec.rb
+++ b/spec/rubocop/cop/usage_data/distinct_count_by_large_foreign_key_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/usage_data/distinct_count_by_large_foreign_key'
diff --git a/spec/rubocop/cop/usage_data/large_table_spec.rb b/spec/rubocop/cop/usage_data/large_table_spec.rb
index 26bd4e61625..a6b22fd7f0d 100644
--- a/spec/rubocop/cop/usage_data/large_table_spec.rb
+++ b/spec/rubocop/cop/usage_data/large_table_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require_relative '../../../../rubocop/cop/usage_data/large_table'
diff --git a/spec/rubocop/migration_helpers_spec.rb b/spec/rubocop/migration_helpers_spec.rb
index f0be21c9d70..997d4071c29 100644
--- a/spec/rubocop/migration_helpers_spec.rb
+++ b/spec/rubocop/migration_helpers_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require 'rspec-parameterized'
require_relative '../../rubocop/migration_helpers'
diff --git a/spec/rubocop/qa_helpers_spec.rb b/spec/rubocop/qa_helpers_spec.rb
index cf6d2f1a845..4b5566609e3 100644
--- a/spec/rubocop/qa_helpers_spec.rb
+++ b/spec/rubocop/qa_helpers_spec.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop'
require 'parser/current'
require_relative '../../rubocop/qa_helpers'
diff --git a/spec/serializers/base_discussion_entity_spec.rb b/spec/serializers/base_discussion_entity_spec.rb
index 5f483da4113..334e71d23f4 100644
--- a/spec/serializers/base_discussion_entity_spec.rb
+++ b/spec/serializers/base_discussion_entity_spec.rb
@@ -66,4 +66,13 @@ RSpec.describe BaseDiscussionEntity do
)
end
end
+
+ context 'when issues are disabled in a project' do
+ let(:project) { create(:project, :issues_disabled) }
+ let(:note) { create(:discussion_note_on_merge_request, project: project) }
+
+ it 'does not show a new issues path' do
+ expect(entity.as_json[:resolve_with_issue_path]).to be_nil
+ end
+ end
end
diff --git a/spec/serializers/merge_request_user_entity_spec.rb b/spec/serializers/merge_request_user_entity_spec.rb
index dcd4ef6acfb..697fa3001e3 100644
--- a/spec/serializers/merge_request_user_entity_spec.rb
+++ b/spec/serializers/merge_request_user_entity_spec.rb
@@ -3,19 +3,22 @@
require 'spec_helper'
RSpec.describe MergeRequestUserEntity do
- let(:user) { create(:user) }
- let(:project) { create(:project, :repository) }
- let(:request) { EntityRequest.new(project: project, current_user: user) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:merge_request) { create(:merge_request) }
+ let(:request) { EntityRequest.new(project: merge_request.target_project, current_user: user) }
let(:entity) do
- described_class.new(user, request: request)
+ described_class.new(user, request: request, merge_request: merge_request)
end
- context 'as json' do
+ describe '#as_json' do
subject { entity.as_json }
it 'exposes needed attributes' do
- expect(subject).to include(:id, :name, :username, :state, :avatar_url, :web_url, :can_merge)
+ is_expected.to include(
+ :id, :name, :username, :state, :avatar_url, :web_url,
+ :can_merge, :can_update_merge_request, :reviewed, :approved
+ )
end
context 'when `status` is not preloaded' do
@@ -24,6 +27,22 @@ RSpec.describe MergeRequestUserEntity do
end
end
+ context 'when the user has not approved the merge-request' do
+ it 'exposes that the user has not approved the MR' do
+ expect(subject).to include(approved: false)
+ end
+ end
+
+ context 'when the user has approved the merge-request' do
+ before do
+ merge_request.approvals.create!(user: user)
+ end
+
+ it 'exposes that the user has approved the MR' do
+ expect(subject).to include(approved: true)
+ end
+ end
+
context 'when `status` is preloaded' do
before do
user.create_status!(availability: :busy)
@@ -35,5 +54,27 @@ RSpec.describe MergeRequestUserEntity do
expect(subject[:availability]).to eq('busy')
end
end
+
+ describe 'performance' do
+ let_it_be(:user_a) { create(:user) }
+ let_it_be(:user_b) { create(:user) }
+ let_it_be(:merge_request_b) { create(:merge_request) }
+
+ it 'is linear in the number of merge requests' do
+ pending "See: https://gitlab.com/gitlab-org/gitlab/-/issues/322549"
+ baseline = ActiveRecord::QueryRecorder.new do
+ ent = described_class.new(user_a, request: request, merge_request: merge_request)
+ ent.as_json
+ end
+
+ expect do
+ a = described_class.new(user_a, request: request, merge_request: merge_request_b)
+ b = described_class.new(user_b, request: request, merge_request: merge_request_b)
+
+ a.as_json
+ b.as_json
+ end.not_to exceed_query_limit(baseline)
+ end
+ end
end
end
diff --git a/spec/serializers/pipeline_serializer_spec.rb b/spec/serializers/pipeline_serializer_spec.rb
index e0f6ab68034..bcaaa61eb04 100644
--- a/spec/serializers/pipeline_serializer_spec.rb
+++ b/spec/serializers/pipeline_serializer_spec.rb
@@ -209,6 +209,22 @@ RSpec.describe PipelineSerializer do
end
end
+ context 'with scheduled and manual builds' do
+ let(:ref) { 'feature' }
+
+ before do
+ create(:ci_build, :scheduled, pipeline: resource.first)
+ create(:ci_build, :scheduled, pipeline: resource.second)
+ create(:ci_build, :manual, pipeline: resource.first)
+ create(:ci_build, :manual, pipeline: resource.second)
+ end
+
+ it 'sends at most one metadata query for each type of build', :request_store do
+ # 1 for the existing failed builds and 2 for the added scheduled and manual builds
+ expect { subject }.not_to exceed_query_limit(1 + 2).for_query /SELECT "ci_builds_metadata".*/
+ end
+ end
+
def create_pipeline(status)
create(:ci_empty_pipeline,
project: project,
diff --git a/spec/serializers/test_suite_comparer_entity_spec.rb b/spec/serializers/test_suite_comparer_entity_spec.rb
index a63f5683779..318d1d3c1e3 100644
--- a/spec/serializers/test_suite_comparer_entity_spec.rb
+++ b/spec/serializers/test_suite_comparer_entity_spec.rb
@@ -35,6 +35,7 @@ RSpec.describe TestSuiteComparerEntity do
end
expect(subject[:resolved_failures]).to be_empty
expect(subject[:existing_failures]).to be_empty
+ expect(subject[:suite_errors]).to be_nil
end
end
@@ -56,6 +57,7 @@ RSpec.describe TestSuiteComparerEntity do
end
expect(subject[:resolved_failures]).to be_empty
expect(subject[:existing_failures]).to be_empty
+ expect(subject[:suite_errors]).to be_nil
end
end
@@ -77,6 +79,7 @@ RSpec.describe TestSuiteComparerEntity do
expect(existing_failure[:execution_time]).to eq(test_case_failed.execution_time)
expect(existing_failure[:system_output]).to eq(test_case_failed.system_output)
end
+ expect(subject[:suite_errors]).to be_nil
end
end
@@ -98,6 +101,47 @@ RSpec.describe TestSuiteComparerEntity do
expect(resolved_failure[:system_output]).to eq(test_case_success.system_output)
end
expect(subject[:existing_failures]).to be_empty
+ expect(subject[:suite_errors]).to be_nil
+ end
+ end
+
+ context 'when head suite has suite error' do
+ before do
+ allow(head_suite).to receive(:suite_error).and_return('some error')
+ end
+
+ it 'contains suite error for head suite' do
+ expect(subject[:suite_errors]).to eq(
+ head: 'some error',
+ base: nil
+ )
+ end
+ end
+
+ context 'when base suite has suite error' do
+ before do
+ allow(base_suite).to receive(:suite_error).and_return('some error')
+ end
+
+ it 'contains suite error for head suite' do
+ expect(subject[:suite_errors]).to eq(
+ head: nil,
+ base: 'some error'
+ )
+ end
+ end
+
+ context 'when base and head suite both have suite errors' do
+ before do
+ allow(head_suite).to receive(:suite_error).and_return('head error')
+ allow(base_suite).to receive(:suite_error).and_return('base error')
+ end
+
+ it 'contains suite error for head suite' do
+ expect(subject[:suite_errors]).to eq(
+ head: 'head error',
+ base: 'base error'
+ )
end
end
end
diff --git a/spec/services/alert_management/create_alert_issue_service_spec.rb b/spec/services/alert_management/create_alert_issue_service_spec.rb
index 2834322be7b..695e90ebd92 100644
--- a/spec/services/alert_management/create_alert_issue_service_spec.rb
+++ b/spec/services/alert_management/create_alert_issue_service_spec.rb
@@ -118,9 +118,36 @@ RSpec.describe AlertManagement::CreateAlertIssueService do
context 'when the alert is generic' do
let(:alert) { generic_alert }
let(:issue) { subject.payload[:issue] }
+ let(:default_alert_title) { described_class::DEFAULT_ALERT_TITLE }
it_behaves_like 'creating an alert issue'
it_behaves_like 'setting an issue attributes'
+
+ context 'when alert title matches the default title exactly' do
+ before do
+ generic_alert.update!(title: default_alert_title)
+ end
+
+ it 'updates issue title with the IID' do
+ execute
+
+ expect(created_issue.title).to eq("New: Incident #{created_issue.iid}")
+ end
+ end
+
+ context 'when the alert title contains the default title' do
+ let(:non_default_alert_title) { "Not #{default_alert_title}" }
+
+ before do
+ generic_alert.update!(title: non_default_alert_title)
+ end
+
+ it 'does not change issue title' do
+ execute
+
+ expect(created_issue.title).to eq(non_default_alert_title)
+ end
+ end
end
context 'when issue cannot be created' do
diff --git a/spec/services/alert_management/process_prometheus_alert_service_spec.rb b/spec/services/alert_management/process_prometheus_alert_service_spec.rb
index 288a33b71cd..9bd71ea6f64 100644
--- a/spec/services/alert_management/process_prometheus_alert_service_spec.rb
+++ b/spec/services/alert_management/process_prometheus_alert_service_spec.rb
@@ -11,6 +11,7 @@ RSpec.describe AlertManagement::ProcessPrometheusAlertService do
describe '#execute' do
let(:service) { described_class.new(project, payload) }
+ let(:source) { 'Prometheus' }
let(:auto_close_incident) { true }
let(:create_issue) { true }
let(:send_email) { true }
@@ -31,7 +32,7 @@ RSpec.describe AlertManagement::ProcessPrometheusAlertService do
subject(:execute) { service.execute }
context 'when alert payload is valid' do
- let(:parsed_payload) { Gitlab::AlertManagement::Payload.parse(project, payload, monitoring_tool: 'Prometheus') }
+ let(:parsed_payload) { Gitlab::AlertManagement::Payload.parse(project, payload, monitoring_tool: source) }
let(:fingerprint) { parsed_payload.gitlab_fingerprint }
let(:payload) do
{
@@ -112,9 +113,7 @@ RSpec.describe AlertManagement::ProcessPrometheusAlertService do
it_behaves_like 'Alert Notification Service sends notification email'
it_behaves_like 'processes incident issues'
- it 'creates a system note corresponding to alert creation' do
- expect { subject }.to change(Note, :count).by(1)
- end
+ it_behaves_like 'creates single system note based on the source of the alert'
context 'when auto-alert creation is disabled' do
let(:create_issue) { false }
@@ -158,17 +157,20 @@ RSpec.describe AlertManagement::ProcessPrometheusAlertService do
context 'when Prometheus alert status is resolved' do
let(:status) { 'resolved' }
- let!(:alert) { create(:alert_management_alert, project: project, fingerprint: fingerprint) }
+ let!(:alert) { create(:alert_management_alert, project: project, fingerprint: fingerprint, monitoring_tool: source) }
context 'when auto_resolve_incident set to true' do
context 'when status can be changed' do
it_behaves_like 'Alert Notification Service sends notification email'
it_behaves_like 'does not process incident issues'
- it 'resolves an existing alert' do
+ it 'resolves an existing alert without error' do
+ expect(Gitlab::AppLogger).not_to receive(:warn)
expect { execute }.to change { alert.reload.resolved? }.to(true)
end
+ it_behaves_like 'creates status-change system note for an auto-resolved alert'
+
context 'existing issue' do
let!(:alert) { create(:alert_management_alert, :with_issue, project: project, fingerprint: fingerprint) }
@@ -215,6 +217,8 @@ RSpec.describe AlertManagement::ProcessPrometheusAlertService do
it 'does not resolve an existing alert' do
expect { execute }.not_to change { alert.reload.resolved? }
end
+
+ it_behaves_like 'creates single system note based on the source of the alert'
end
context 'when emails are disabled' do
diff --git a/spec/services/boards/issues/list_service_spec.rb b/spec/services/boards/issues/list_service_spec.rb
index 29b49db42f9..2fd544ab949 100644
--- a/spec/services/boards/issues/list_service_spec.rb
+++ b/spec/services/boards/issues/list_service_spec.rb
@@ -4,40 +4,41 @@ require 'spec_helper'
RSpec.describe Boards::Issues::ListService do
describe '#execute' do
- context 'when parent is a project' do
- let(:user) { create(:user) }
- let(:project) { create(:project) }
- let(:board) { create(:board, project: project) }
-
- let(:m1) { create(:milestone, project: project) }
- let(:m2) { create(:milestone, project: project) }
-
- let(:bug) { create(:label, project: project, name: 'Bug') }
- let(:development) { create(:label, project: project, name: 'Development') }
- let(:testing) { create(:label, project: project, name: 'Testing') }
- let(:p1) { create(:label, title: 'P1', project: project, priority: 1) }
- let(:p2) { create(:label, title: 'P2', project: project, priority: 2) }
- let(:p3) { create(:label, title: 'P3', project: project, priority: 3) }
-
- let!(:backlog) { create(:backlog_list, board: board) }
- let!(:list1) { create(:list, board: board, label: development, position: 0) }
- let!(:list2) { create(:list, board: board, label: testing, position: 1) }
- let!(:closed) { create(:closed_list, board: board) }
+ let_it_be(:user) { create(:user) }
- let!(:opened_issue1) { create(:labeled_issue, project: project, milestone: m1, title: 'Issue 1', labels: [bug]) }
- let!(:opened_issue2) { create(:labeled_issue, project: project, milestone: m2, title: 'Issue 2', labels: [p2]) }
- let!(:reopened_issue1) { create(:issue, :opened, project: project, title: 'Reopened Issue 1' ) }
-
- let!(:list1_issue1) { create(:labeled_issue, project: project, milestone: m1, labels: [p2, development]) }
- let!(:list1_issue2) { create(:labeled_issue, project: project, milestone: m2, labels: [development]) }
- let!(:list1_issue3) { create(:labeled_issue, project: project, milestone: m1, labels: [development, p1]) }
- let!(:list2_issue1) { create(:labeled_issue, project: project, milestone: m1, labels: [testing]) }
-
- let!(:closed_issue1) { create(:labeled_issue, :closed, project: project, labels: [bug], closed_at: 1.day.ago) }
- let!(:closed_issue2) { create(:labeled_issue, :closed, project: project, labels: [p3], closed_at: 2.days.ago) }
- let!(:closed_issue3) { create(:issue, :closed, project: project, closed_at: 1.week.ago) }
- let!(:closed_issue4) { create(:labeled_issue, :closed, project: project, labels: [p1], closed_at: 1.year.ago) }
- let!(:closed_issue5) { create(:labeled_issue, :closed, project: project, labels: [development], closed_at: 2.years.ago) }
+ context 'when parent is a project' do
+ let_it_be(:project) { create(:project, :empty_repo) }
+ let_it_be(:board) { create(:board, project: project) }
+
+ let_it_be(:m1) { create(:milestone, project: project) }
+ let_it_be(:m2) { create(:milestone, project: project) }
+
+ let_it_be(:bug) { create(:label, project: project, name: 'Bug') }
+ let_it_be(:development) { create(:label, project: project, name: 'Development') }
+ let_it_be(:testing) { create(:label, project: project, name: 'Testing') }
+ let_it_be(:p1) { create(:label, title: 'P1', project: project, priority: 1) }
+ let_it_be(:p2) { create(:label, title: 'P2', project: project, priority: 2) }
+ let_it_be(:p3) { create(:label, title: 'P3', project: project, priority: 3) }
+
+ let_it_be(:backlog) { create(:backlog_list, board: board) }
+ let_it_be(:list1) { create(:list, board: board, label: development, position: 0) }
+ let_it_be(:list2) { create(:list, board: board, label: testing, position: 1) }
+ let_it_be(:closed) { create(:closed_list, board: board) }
+
+ let_it_be(:opened_issue1) { create(:labeled_issue, project: project, milestone: m1, title: 'Issue 1', labels: [bug]) }
+ let_it_be(:opened_issue2) { create(:labeled_issue, project: project, milestone: m2, title: 'Issue 2', labels: [p2]) }
+ let_it_be(:reopened_issue1) { create(:issue, :opened, project: project, title: 'Reopened Issue 1' ) }
+
+ let_it_be(:list1_issue1) { create(:labeled_issue, project: project, milestone: m1, labels: [p2, development]) }
+ let_it_be(:list1_issue2) { create(:labeled_issue, project: project, milestone: m2, labels: [development]) }
+ let_it_be(:list1_issue3) { create(:labeled_issue, project: project, milestone: m1, labels: [development, p1]) }
+ let_it_be(:list2_issue1) { create(:labeled_issue, project: project, milestone: m1, labels: [testing]) }
+
+ let_it_be(:closed_issue1) { create(:labeled_issue, :closed, project: project, labels: [bug], closed_at: 1.day.ago) }
+ let_it_be(:closed_issue2) { create(:labeled_issue, :closed, project: project, labels: [p3], closed_at: 2.days.ago) }
+ let_it_be(:closed_issue3) { create(:issue, :closed, project: project, closed_at: 1.week.ago) }
+ let_it_be(:closed_issue4) { create(:labeled_issue, :closed, project: project, labels: [p1], closed_at: 1.year.ago) }
+ let_it_be(:closed_issue5) { create(:labeled_issue, :closed, project: project, labels: [development], closed_at: 2.years.ago) }
let(:parent) { project }
@@ -48,14 +49,16 @@ RSpec.describe Boards::Issues::ListService do
it_behaves_like 'issues list service'
context 'when project is archived' do
- let(:project) { create(:project, :archived) }
+ before do
+ project.update!(archived: true)
+ end
it_behaves_like 'issues list service'
end
end
+ # rubocop: disable RSpec/MultipleMemoizedHelpers
context 'when parent is a group' do
- let(:user) { create(:user) }
let(:project) { create(:project, :empty_repo, namespace: group) }
let(:project1) { create(:project, :empty_repo, namespace: group) }
let(:project_archived) { create(:project, :empty_repo, :archived, namespace: group) }
@@ -104,7 +107,7 @@ RSpec.describe Boards::Issues::ListService do
group.add_developer(user)
end
- context 'and group has no parent' do
+ context 'when the group has no parent' do
let(:parent) { group }
let(:group) { create(:group) }
let(:board) { create(:board, group: group) }
@@ -112,7 +115,7 @@ RSpec.describe Boards::Issues::ListService do
it_behaves_like 'issues list service'
end
- context 'and group is an ancestor' do
+ context 'when the group is an ancestor' do
let(:parent) { create(:group) }
let(:group) { create(:group, parent: parent) }
let!(:backlog) { create(:backlog_list, board: board) }
@@ -125,5 +128,6 @@ RSpec.describe Boards::Issues::ListService do
it_behaves_like 'issues list service'
end
end
+ # rubocop: enable RSpec/MultipleMemoizedHelpers
end
end
diff --git a/spec/services/boards/list_service_spec.rb b/spec/services/boards/list_service_spec.rb
deleted file mode 100644
index 7c94332a78d..00000000000
--- a/spec/services/boards/list_service_spec.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Boards::ListService do
- describe '#execute' do
- context 'when board parent is a project' do
- let(:parent) { create(:project) }
-
- subject(:service) { described_class.new(parent, double) }
-
- it_behaves_like 'boards list service'
- it_behaves_like 'multiple boards list service'
- end
-
- context 'when board parent is a group' do
- let(:parent) { create(:group) }
-
- subject(:service) { described_class.new(parent, double) }
-
- it_behaves_like 'boards list service'
- end
- end
-end
diff --git a/spec/services/boards/lists/list_service_spec.rb b/spec/services/boards/lists/list_service_spec.rb
index dfe65f3d241..21619abf6aa 100644
--- a/spec/services/boards/lists/list_service_spec.rb
+++ b/spec/services/boards/lists/list_service_spec.rb
@@ -8,6 +8,26 @@ RSpec.describe Boards::Lists::ListService do
describe '#execute' do
let(:service) { described_class.new(parent, user) }
+ shared_examples 'hidden lists' do
+ let!(:list) { create(:list, board: board, label: label) }
+
+ context 'when hide_backlog_list is true' do
+ it 'hides backlog list' do
+ board.update!(hide_backlog_list: true)
+
+ expect(service.execute(board)).to match_array([board.closed_list, list])
+ end
+ end
+
+ context 'when hide_closed_list is true' do
+ it 'hides closed list' do
+ board.update!(hide_closed_list: true)
+
+ expect(service.execute(board)).to match_array([board.backlog_list, list])
+ end
+ end
+ end
+
context 'when board parent is a project' do
let(:project) { create(:project) }
let(:board) { create(:board, project: project) }
@@ -16,6 +36,7 @@ RSpec.describe Boards::Lists::ListService do
let(:parent) { project }
it_behaves_like 'lists list service'
+ it_behaves_like 'hidden lists'
end
context 'when board parent is a group' do
@@ -26,6 +47,7 @@ RSpec.describe Boards::Lists::ListService do
let(:parent) { group }
it_behaves_like 'lists list service'
+ it_behaves_like 'hidden lists'
end
end
end
diff --git a/spec/services/bulk_import_service_spec.rb b/spec/services/bulk_import_service_spec.rb
index e4a50b9d523..1b60a5cb0f8 100644
--- a/spec/services/bulk_import_service_spec.rb
+++ b/spec/services/bulk_import_service_spec.rb
@@ -48,5 +48,22 @@ RSpec.describe BulkImportService do
subject.execute
end
+
+ it 'returns success ServiceResponse' do
+ result = subject.execute
+
+ expect(result).to be_a(ServiceResponse)
+ expect(result).to be_success
+ end
+
+ it 'returns ServiceResponse with error if validation fails' do
+ params[0][:source_full_path] = nil
+
+ result = subject.execute
+
+ expect(result).to be_a(ServiceResponse)
+ expect(result).to be_error
+ expect(result.message).to eq("Validation failed: Source full path can't be blank")
+ end
end
end
diff --git a/spec/services/ci/create_pipeline_service/environment_spec.rb b/spec/services/ci/create_pipeline_service/environment_spec.rb
new file mode 100644
index 00000000000..0ed63012325
--- /dev/null
+++ b/spec/services/ci/create_pipeline_service/environment_spec.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Ci::CreatePipelineService do
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:developer) { create(:user) }
+ let(:service) { described_class.new(project, user, ref: 'master') }
+ let(:user) { developer }
+
+ before_all do
+ project.add_developer(developer)
+ end
+
+ describe '#execute' do
+ subject { service.execute(:push) }
+
+ context 'with deployment tier' do
+ before do
+ config = YAML.dump(
+ deploy: {
+ script: 'ls',
+ environment: { name: "review/$CI_COMMIT_REF_NAME", deployment_tier: tier }
+ })
+
+ stub_ci_pipeline_yaml_file(config)
+ end
+
+ let(:tier) { 'development' }
+
+ it 'creates the environment with the expected tier' do
+ is_expected.to be_created_successfully
+
+ expect(Environment.find_by_name("review/master")).to be_development
+ end
+
+ context 'when tier is testing' do
+ let(:tier) { 'testing' }
+
+ it 'creates the environment with the expected tier' do
+ is_expected.to be_created_successfully
+
+ expect(Environment.find_by_name("review/master")).to be_testing
+ end
+ end
+ end
+ end
+end
diff --git a/spec/services/ci/create_pipeline_service/rules_spec.rb b/spec/services/ci/create_pipeline_service/rules_spec.rb
index 04ecac6a85a..e97e74c1515 100644
--- a/spec/services/ci/create_pipeline_service/rules_spec.rb
+++ b/spec/services/ci/create_pipeline_service/rules_spec.rb
@@ -174,33 +174,19 @@ RSpec.describe Ci::CreatePipelineService do
let(:ref) { 'refs/heads/master' }
it 'overrides VAR1' do
- variables = job.scoped_variables_hash
+ variables = job.scoped_variables.to_hash
expect(variables['VAR1']).to eq('overridden var 1')
expect(variables['VAR2']).to eq('my var 2')
expect(variables['VAR3']).to be_nil
end
-
- context 'when FF ci_rules_variables is disabled' do
- before do
- stub_feature_flags(ci_rules_variables: false)
- end
-
- it 'does not affect variables' do
- variables = job.scoped_variables_hash
-
- expect(variables['VAR1']).to eq('my var 1')
- expect(variables['VAR2']).to eq('my var 2')
- expect(variables['VAR3']).to be_nil
- end
- end
end
context 'when matching to the second rule' do
let(:ref) { 'refs/heads/feature' }
it 'overrides VAR2 and adds VAR3' do
- variables = job.scoped_variables_hash
+ variables = job.scoped_variables.to_hash
expect(variables['VAR1']).to eq('my var 1')
expect(variables['VAR2']).to eq('overridden var 2')
@@ -212,7 +198,7 @@ RSpec.describe Ci::CreatePipelineService do
let(:ref) { 'refs/heads/wip' }
it 'does not affect vars' do
- variables = job.scoped_variables_hash
+ variables = job.scoped_variables.to_hash
expect(variables['VAR1']).to eq('my var 1')
expect(variables['VAR2']).to eq('my var 2')
diff --git a/spec/services/ci/create_pipeline_service_spec.rb b/spec/services/ci/create_pipeline_service_spec.rb
index 1005985b3e4..9fafc57a770 100644
--- a/spec/services/ci/create_pipeline_service_spec.rb
+++ b/spec/services/ci/create_pipeline_service_spec.rb
@@ -101,7 +101,7 @@ RSpec.describe Ci::CreatePipelineService do
describe 'recording a conversion event' do
it 'schedules a record conversion event worker' do
- expect(Experiments::RecordConversionEventWorker).to receive(:perform_async).with(:ci_syntax_templates, user.id)
+ expect(Experiments::RecordConversionEventWorker).to receive(:perform_async).with(:ci_syntax_templates_b, user.id)
pipeline
end
diff --git a/spec/services/ci/expire_pipeline_cache_service_spec.rb b/spec/services/ci/expire_pipeline_cache_service_spec.rb
index 8df5d0bc159..3dbf2dbb8f1 100644
--- a/spec/services/ci/expire_pipeline_cache_service_spec.rb
+++ b/spec/services/ci/expire_pipeline_cache_service_spec.rb
@@ -13,10 +13,14 @@ RSpec.describe Ci::ExpirePipelineCacheService do
pipelines_path = "/#{project.full_path}/-/pipelines.json"
new_mr_pipelines_path = "/#{project.full_path}/-/merge_requests/new.json"
pipeline_path = "/#{project.full_path}/-/pipelines/#{pipeline.id}.json"
+ graphql_pipeline_path = "/api/graphql:pipelines/id/#{pipeline.id}"
- expect_any_instance_of(Gitlab::EtagCaching::Store).to receive(:touch).with(pipelines_path)
- expect_any_instance_of(Gitlab::EtagCaching::Store).to receive(:touch).with(new_mr_pipelines_path)
- expect_any_instance_of(Gitlab::EtagCaching::Store).to receive(:touch).with(pipeline_path)
+ expect_next_instance_of(Gitlab::EtagCaching::Store) do |store|
+ expect(store).to receive(:touch).with(pipelines_path)
+ expect(store).to receive(:touch).with(new_mr_pipelines_path)
+ expect(store).to receive(:touch).with(pipeline_path)
+ expect(store).to receive(:touch).with(graphql_pipeline_path)
+ end
subject.execute(pipeline)
end
@@ -59,5 +63,36 @@ RSpec.describe Ci::ExpirePipelineCacheService do
expect(Project.find(project_with_repo.id).pipeline_status.has_status?).to be_falsey
end
end
+
+ context 'when the pipeline is triggered by another pipeline' do
+ let(:source) { create(:ci_sources_pipeline, pipeline: pipeline) }
+
+ it 'updates the cache of dependent pipeline' do
+ dependent_pipeline_path = "/#{source.source_project.full_path}/-/pipelines/#{source.source_pipeline.id}.json"
+
+ expect_next_instance_of(Gitlab::EtagCaching::Store) do |store|
+ allow(store).to receive(:touch)
+ expect(store).to receive(:touch).with(dependent_pipeline_path)
+ end
+
+ subject.execute(pipeline)
+ end
+ end
+
+ context 'when the pipeline triggered another pipeline' do
+ let(:build) { create(:ci_build, pipeline: pipeline) }
+ let(:source) { create(:ci_sources_pipeline, source_job: build) }
+
+ it 'updates the cache of dependent pipeline' do
+ dependent_pipeline_path = "/#{source.project.full_path}/-/pipelines/#{source.pipeline.id}.json"
+
+ expect_next_instance_of(Gitlab::EtagCaching::Store) do |store|
+ allow(store).to receive(:touch)
+ expect(store).to receive(:touch).with(dependent_pipeline_path)
+ end
+
+ subject.execute(pipeline)
+ end
+ end
end
end
diff --git a/spec/services/ci/pipeline_processing/shared_processing_service.rb b/spec/services/ci/pipeline_processing/shared_processing_service.rb
index bbd7422b435..215f33a42a3 100644
--- a/spec/services/ci/pipeline_processing/shared_processing_service.rb
+++ b/spec/services/ci/pipeline_processing/shared_processing_service.rb
@@ -843,12 +843,26 @@ RSpec.shared_examples 'Pipeline Processing Service' do
create(:ci_build_need, build: deploy, name: 'linux:build')
end
- it 'makes deploy DAG to be waiting for optional manual to finish' do
+ it 'makes deploy DAG to be skipped' do
expect(process_pipeline).to be_truthy
- expect(stages).to eq(%w(skipped created))
+ expect(stages).to eq(%w(skipped skipped))
expect(all_builds.manual).to contain_exactly(linux_build)
- expect(all_builds.created).to contain_exactly(deploy)
+ expect(all_builds.skipped).to contain_exactly(deploy)
+ end
+
+ context 'when FF ci_fix_pipeline_status_for_dag_needs_manual is disabled' do
+ before do
+ stub_feature_flags(ci_fix_pipeline_status_for_dag_needs_manual: false)
+ end
+
+ it 'makes deploy DAG to be waiting for optional manual to finish' do
+ expect(process_pipeline).to be_truthy
+
+ expect(stages).to eq(%w(skipped created))
+ expect(all_builds.manual).to contain_exactly(linux_build)
+ expect(all_builds.created).to contain_exactly(deploy)
+ end
end
end
diff --git a/spec/services/ci/pipeline_processing/test_cases/dag_build_succeds_test_manual_allow_failure_true_deploy_needs_both.yml b/spec/services/ci/pipeline_processing/test_cases/dag_build_succeds_test_manual_allow_failure_true_deploy_needs_both.yml
index 60f803bc3d0..96377b00c85 100644
--- a/spec/services/ci/pipeline_processing/test_cases/dag_build_succeds_test_manual_allow_failure_true_deploy_needs_both.yml
+++ b/spec/services/ci/pipeline_processing/test_cases/dag_build_succeds_test_manual_allow_failure_true_deploy_needs_both.yml
@@ -30,12 +30,12 @@ transitions:
- event: success
jobs: [build]
expect:
- pipeline: running
+ pipeline: success
stages:
build: success
test: skipped
- deploy: created
+ deploy: skipped
jobs:
build: success
test: manual
- deploy: created
+ deploy: skipped
diff --git a/spec/services/ci/pipeline_processing/test_cases/dag_build_succeds_test_manual_allow_failure_true_deploy_needs_test.yml b/spec/services/ci/pipeline_processing/test_cases/dag_build_succeds_test_manual_allow_failure_true_deploy_needs_test.yml
index 4e4b2f22224..69640630ef4 100644
--- a/spec/services/ci/pipeline_processing/test_cases/dag_build_succeds_test_manual_allow_failure_true_deploy_needs_test.yml
+++ b/spec/services/ci/pipeline_processing/test_cases/dag_build_succeds_test_manual_allow_failure_true_deploy_needs_test.yml
@@ -30,12 +30,12 @@ transitions:
- event: success
jobs: [build]
expect:
- pipeline: running
+ pipeline: success
stages:
build: success
test: skipped
- deploy: created
+ deploy: skipped
jobs:
build: success
test: manual
- deploy: created
+ deploy: skipped
diff --git a/spec/services/ci/pipeline_processing/test_cases/dag_build_test_manual_review_deploy.yml b/spec/services/ci/pipeline_processing/test_cases/dag_build_test_manual_review_deploy.yml
index fef28dcfbbe..8de484d6793 100644
--- a/spec/services/ci/pipeline_processing/test_cases/dag_build_test_manual_review_deploy.yml
+++ b/spec/services/ci/pipeline_processing/test_cases/dag_build_test_manual_review_deploy.yml
@@ -54,29 +54,29 @@ transitions:
stages:
build: success
test: pending
- review: created
- deploy: created
+ review: skipped
+ deploy: skipped
jobs:
build: success
test: pending
release_test: manual
- review: created
- staging: created
- production: created
+ review: skipped
+ staging: skipped
+ production: skipped
- event: success
jobs: [test]
expect:
- pipeline: running
+ pipeline: success
stages:
build: success
test: success
- review: created
- deploy: created
+ review: skipped
+ deploy: skipped
jobs:
build: success
test: success
release_test: manual
- review: created
- staging: created
- production: created
+ review: skipped
+ staging: skipped
+ production: skipped
diff --git a/spec/services/ci/pipeline_processing/test_cases/dag_test_manual_allow_failure_true.yml b/spec/services/ci/pipeline_processing/test_cases/dag_test_manual_allow_failure_true.yml
index d8ca563b141..b8fcdd1566a 100644
--- a/spec/services/ci/pipeline_processing/test_cases/dag_test_manual_allow_failure_true.yml
+++ b/spec/services/ci/pipeline_processing/test_cases/dag_test_manual_allow_failure_true.yml
@@ -12,13 +12,13 @@ config:
init:
expect:
- pipeline: created
+ pipeline: skipped
stages:
test: skipped
- deploy: created
+ deploy: skipped
jobs:
test: manual
- deploy: created
+ deploy: skipped
transitions:
- event: enqueue
@@ -27,10 +27,10 @@ transitions:
pipeline: pending
stages:
test: pending
- deploy: created
+ deploy: skipped
jobs:
test: pending
- deploy: created
+ deploy: skipped
- event: run
jobs: [test]
@@ -38,21 +38,18 @@ transitions:
pipeline: running
stages:
test: running
- deploy: created
+ deploy: skipped
jobs:
test: running
- deploy: created
+ deploy: skipped
- event: drop
jobs: [test]
expect:
- pipeline: running
+ pipeline: success
stages:
test: success
- deploy: pending
+ deploy: skipped
jobs:
test: failed
- deploy: pending
-
-# TOOD: should we run deploy?
-# Further discussions: https://gitlab.com/gitlab-org/gitlab/-/issues/213080
+ deploy: skipped
diff --git a/spec/services/ci/pipeline_processing/test_cases/dag_test_manual_allow_failure_true_deploy_always.yml b/spec/services/ci/pipeline_processing/test_cases/dag_test_manual_allow_failure_true_deploy_always.yml
index ba0a20f49a7..a4a98bf4629 100644
--- a/spec/services/ci/pipeline_processing/test_cases/dag_test_manual_allow_failure_true_deploy_always.yml
+++ b/spec/services/ci/pipeline_processing/test_cases/dag_test_manual_allow_failure_true_deploy_always.yml
@@ -13,15 +13,12 @@ config:
init:
expect:
- pipeline: created
+ pipeline: pending
stages:
test: skipped
- deploy: created
+ deploy: pending
jobs:
test: manual
- deploy: created
+ deploy: pending
transitions: []
-
-# TODO: should we run `deploy`?
-# Further discussions: https://gitlab.com/gitlab-org/gitlab/-/issues/213080
diff --git a/spec/services/ci/pipeline_processing/test_cases/dag_test_manual_allow_failure_true_deploy_on_failure.yml b/spec/services/ci/pipeline_processing/test_cases/dag_test_manual_allow_failure_true_deploy_on_failure.yml
index d375c6a49e0..81aad4940b6 100644
--- a/spec/services/ci/pipeline_processing/test_cases/dag_test_manual_allow_failure_true_deploy_on_failure.yml
+++ b/spec/services/ci/pipeline_processing/test_cases/dag_test_manual_allow_failure_true_deploy_on_failure.yml
@@ -13,13 +13,13 @@ config:
init:
expect:
- pipeline: created
+ pipeline: skipped
stages:
test: skipped
- deploy: created
+ deploy: skipped
jobs:
test: manual
- deploy: created
+ deploy: skipped
transitions:
- event: enqueue
@@ -28,10 +28,10 @@ transitions:
pipeline: pending
stages:
test: pending
- deploy: created
+ deploy: skipped
jobs:
test: pending
- deploy: created
+ deploy: skipped
- event: drop
jobs: [test]
@@ -43,6 +43,3 @@ transitions:
jobs:
test: failed
deploy: skipped
-
-# TODO: should we run `deploy`?
-# Further discussions: https://gitlab.com/gitlab-org/gitlab/-/issues/213080
diff --git a/spec/services/ci/pipeline_processing/test_cases/dag_test_manual_allow_failure_true_other_test_succeeds_deploy_needs_both.yml b/spec/services/ci/pipeline_processing/test_cases/dag_test_manual_allow_failure_true_other_test_succeeds_deploy_needs_both.yml
index 34073b92ccc..a5bb103d1a5 100644
--- a/spec/services/ci/pipeline_processing/test_cases/dag_test_manual_allow_failure_true_other_test_succeeds_deploy_needs_both.yml
+++ b/spec/services/ci/pipeline_processing/test_cases/dag_test_manual_allow_failure_true_other_test_succeeds_deploy_needs_both.yml
@@ -19,24 +19,21 @@ init:
pipeline: pending
stages:
test: pending
- deploy: created
+ deploy: skipped
jobs:
test1: pending
test2: manual
- deploy: created
+ deploy: skipped
transitions:
- event: success
jobs: [test1]
expect:
- pipeline: running
+ pipeline: success
stages:
test: success
- deploy: created
+ deploy: skipped
jobs:
test1: success
test2: manual
- deploy: created
-
-# TODO: should deploy run?
-# Further discussions: https://gitlab.com/gitlab-org/gitlab/-/issues/213080
+ deploy: skipped
diff --git a/spec/services/ci/process_pipeline_service_spec.rb b/spec/services/ci/process_pipeline_service_spec.rb
index d316c9a262b..e02536fd07f 100644
--- a/spec/services/ci/process_pipeline_service_spec.rb
+++ b/spec/services/ci/process_pipeline_service_spec.rb
@@ -43,42 +43,59 @@ RSpec.describe Ci::ProcessPipelineService do
let!(:build) { create_build('build') }
let!(:test) { create_build('test') }
- it 'returns unique statuses' do
- subject.execute
+ context 'when FF ci_remove_update_retried_from_process_pipeline is enabled' do
+ it 'does not update older builds as retried' do
+ subject.execute
- expect(all_builds.latest).to contain_exactly(build, test)
- expect(all_builds.retried).to contain_exactly(build_retried)
+ expect(all_builds.latest).to contain_exactly(build, build_retried, test)
+ expect(all_builds.retried).to be_empty
+ end
end
- context 'counter ci_legacy_update_jobs_as_retried_total' do
- let(:counter) { double(increment: true) }
-
+ context 'when FF ci_remove_update_retried_from_process_pipeline is disabled' do
before do
- allow(Gitlab::Metrics).to receive(:counter).and_call_original
- allow(Gitlab::Metrics).to receive(:counter)
- .with(:ci_legacy_update_jobs_as_retried_total, anything)
- .and_return(counter)
+ stub_feature_flags(ci_remove_update_retried_from_process_pipeline: false)
end
- it 'increments the counter' do
- expect(counter).to receive(:increment)
-
+ it 'returns unique statuses' do
subject.execute
+
+ expect(all_builds.latest).to contain_exactly(build, test)
+ expect(all_builds.retried).to contain_exactly(build_retried)
end
- context 'when the previous build has already retried column true' do
+ context 'counter ci_legacy_update_jobs_as_retried_total' do
+ let(:counter) { double(increment: true) }
+
before do
- build_retried.update_columns(retried: true)
+ allow(Gitlab::Metrics).to receive(:counter).and_call_original
+ allow(Gitlab::Metrics).to receive(:counter)
+ .with(:ci_legacy_update_jobs_as_retried_total, anything)
+ .and_return(counter)
end
- it 'does not increment the counter' do
- expect(counter).not_to receive(:increment)
+ it 'increments the counter' do
+ expect(counter).to receive(:increment)
subject.execute
end
+
+ context 'when the previous build has already retried column true' do
+ before do
+ build_retried.update_columns(retried: true)
+ end
+
+ it 'does not increment the counter' do
+ expect(counter).not_to receive(:increment)
+
+ subject.execute
+ end
+ end
end
end
+ private
+
def create_build(name, **opts)
create(:ci_build, :created, pipeline: pipeline, name: name, **opts)
end
diff --git a/spec/services/ci/register_job_service_spec.rb b/spec/services/ci/register_job_service_spec.rb
index 88770c8095b..9187dd4f300 100644
--- a/spec/services/ci/register_job_service_spec.rb
+++ b/spec/services/ci/register_job_service_spec.rb
@@ -13,573 +13,656 @@ module Ci
let!(:pending_job) { create(:ci_build, pipeline: pipeline) }
describe '#execute' do
- context 'runner follow tag list' do
- it "picks build with the same tag" do
- pending_job.update!(tag_list: ["linux"])
- specific_runner.update!(tag_list: ["linux"])
- expect(execute(specific_runner)).to eq(pending_job)
- end
-
- it "does not pick build with different tag" do
- pending_job.update!(tag_list: ["linux"])
- specific_runner.update!(tag_list: ["win32"])
- expect(execute(specific_runner)).to be_falsey
- end
+ shared_examples 'handles runner assignment' do
+ context 'runner follow tag list' do
+ it "picks build with the same tag" do
+ pending_job.update!(tag_list: ["linux"])
+ specific_runner.update!(tag_list: ["linux"])
+ expect(execute(specific_runner)).to eq(pending_job)
+ end
- it "picks build without tag" do
- expect(execute(specific_runner)).to eq(pending_job)
- end
+ it "does not pick build with different tag" do
+ pending_job.update!(tag_list: ["linux"])
+ specific_runner.update!(tag_list: ["win32"])
+ expect(execute(specific_runner)).to be_falsey
+ end
- it "does not pick build with tag" do
- pending_job.update!(tag_list: ["linux"])
- expect(execute(specific_runner)).to be_falsey
- end
+ it "picks build without tag" do
+ expect(execute(specific_runner)).to eq(pending_job)
+ end
- it "pick build without tag" do
- specific_runner.update!(tag_list: ["win32"])
- expect(execute(specific_runner)).to eq(pending_job)
- end
- end
+ it "does not pick build with tag" do
+ pending_job.update!(tag_list: ["linux"])
+ expect(execute(specific_runner)).to be_falsey
+ end
- context 'deleted projects' do
- before do
- project.update!(pending_delete: true)
+ it "pick build without tag" do
+ specific_runner.update!(tag_list: ["win32"])
+ expect(execute(specific_runner)).to eq(pending_job)
+ end
end
- context 'for shared runners' do
+ context 'deleted projects' do
before do
- project.update!(shared_runners_enabled: true)
+ project.update!(pending_delete: true)
end
- it 'does not pick a build' do
- expect(execute(shared_runner)).to be_nil
+ context 'for shared runners' do
+ before do
+ project.update!(shared_runners_enabled: true)
+ end
+
+ it 'does not pick a build' do
+ expect(execute(shared_runner)).to be_nil
+ end
end
- end
- context 'for specific runner' do
- it 'does not pick a build' do
- expect(execute(specific_runner)).to be_nil
+ context 'for specific runner' do
+ it 'does not pick a build' do
+ expect(execute(specific_runner)).to be_nil
+ end
end
end
- end
- context 'allow shared runners' do
- before do
- project.update!(shared_runners_enabled: true)
- end
+ context 'allow shared runners' do
+ before do
+ project.update!(shared_runners_enabled: true)
+ end
+
+ context 'for multiple builds' do
+ let!(:project2) { create :project, shared_runners_enabled: true }
+ let!(:pipeline2) { create :ci_pipeline, project: project2 }
+ let!(:project3) { create :project, shared_runners_enabled: true }
+ let!(:pipeline3) { create :ci_pipeline, project: project3 }
+ let!(:build1_project1) { pending_job }
+ let!(:build2_project1) { FactoryBot.create :ci_build, pipeline: pipeline }
+ let!(:build3_project1) { FactoryBot.create :ci_build, pipeline: pipeline }
+ let!(:build1_project2) { FactoryBot.create :ci_build, pipeline: pipeline2 }
+ let!(:build2_project2) { FactoryBot.create :ci_build, pipeline: pipeline2 }
+ let!(:build1_project3) { FactoryBot.create :ci_build, pipeline: pipeline3 }
+
+ it 'prefers projects without builds first' do
+ # it gets for one build from each of the projects
+ expect(execute(shared_runner)).to eq(build1_project1)
+ expect(execute(shared_runner)).to eq(build1_project2)
+ expect(execute(shared_runner)).to eq(build1_project3)
+
+ # then it gets a second build from each of the projects
+ expect(execute(shared_runner)).to eq(build2_project1)
+ expect(execute(shared_runner)).to eq(build2_project2)
+
+ # in the end the third build
+ expect(execute(shared_runner)).to eq(build3_project1)
+ end
- context 'for multiple builds' do
- let!(:project2) { create :project, shared_runners_enabled: true }
- let!(:pipeline2) { create :ci_pipeline, project: project2 }
- let!(:project3) { create :project, shared_runners_enabled: true }
- let!(:pipeline3) { create :ci_pipeline, project: project3 }
- let!(:build1_project1) { pending_job }
- let!(:build2_project1) { FactoryBot.create :ci_build, pipeline: pipeline }
- let!(:build3_project1) { FactoryBot.create :ci_build, pipeline: pipeline }
- let!(:build1_project2) { FactoryBot.create :ci_build, pipeline: pipeline2 }
- let!(:build2_project2) { FactoryBot.create :ci_build, pipeline: pipeline2 }
- let!(:build1_project3) { FactoryBot.create :ci_build, pipeline: pipeline3 }
-
- it 'prefers projects without builds first' do
- # it gets for one build from each of the projects
- expect(execute(shared_runner)).to eq(build1_project1)
- expect(execute(shared_runner)).to eq(build1_project2)
- expect(execute(shared_runner)).to eq(build1_project3)
-
- # then it gets a second build from each of the projects
- expect(execute(shared_runner)).to eq(build2_project1)
- expect(execute(shared_runner)).to eq(build2_project2)
-
- # in the end the third build
- expect(execute(shared_runner)).to eq(build3_project1)
- end
-
- it 'equalises number of running builds' do
- # after finishing the first build for project 1, get a second build from the same project
- expect(execute(shared_runner)).to eq(build1_project1)
- build1_project1.reload.success
- expect(execute(shared_runner)).to eq(build2_project1)
-
- expect(execute(shared_runner)).to eq(build1_project2)
- build1_project2.reload.success
- expect(execute(shared_runner)).to eq(build2_project2)
- expect(execute(shared_runner)).to eq(build1_project3)
- expect(execute(shared_runner)).to eq(build3_project1)
+ it 'equalises number of running builds' do
+ # after finishing the first build for project 1, get a second build from the same project
+ expect(execute(shared_runner)).to eq(build1_project1)
+ build1_project1.reload.success
+ expect(execute(shared_runner)).to eq(build2_project1)
+
+ expect(execute(shared_runner)).to eq(build1_project2)
+ build1_project2.reload.success
+ expect(execute(shared_runner)).to eq(build2_project2)
+ expect(execute(shared_runner)).to eq(build1_project3)
+ expect(execute(shared_runner)).to eq(build3_project1)
+ end
end
- end
- context 'shared runner' do
- let(:response) { described_class.new(shared_runner).execute }
- let(:build) { response.build }
+ context 'shared runner' do
+ let(:response) { described_class.new(shared_runner).execute }
+ let(:build) { response.build }
- it { expect(build).to be_kind_of(Build) }
- it { expect(build).to be_valid }
- it { expect(build).to be_running }
- it { expect(build.runner).to eq(shared_runner) }
- it { expect(Gitlab::Json.parse(response.build_json)['id']).to eq(build.id) }
- end
+ it { expect(build).to be_kind_of(Build) }
+ it { expect(build).to be_valid }
+ it { expect(build).to be_running }
+ it { expect(build.runner).to eq(shared_runner) }
+ it { expect(Gitlab::Json.parse(response.build_json)['id']).to eq(build.id) }
+ end
- context 'specific runner' do
- let(:build) { execute(specific_runner) }
+ context 'specific runner' do
+ let(:build) { execute(specific_runner) }
- it { expect(build).to be_kind_of(Build) }
- it { expect(build).to be_valid }
- it { expect(build).to be_running }
- it { expect(build.runner).to eq(specific_runner) }
+ it { expect(build).to be_kind_of(Build) }
+ it { expect(build).to be_valid }
+ it { expect(build).to be_running }
+ it { expect(build.runner).to eq(specific_runner) }
+ end
end
- end
- context 'disallow shared runners' do
- before do
- project.update!(shared_runners_enabled: false)
- end
+ context 'disallow shared runners' do
+ before do
+ project.update!(shared_runners_enabled: false)
+ end
- context 'shared runner' do
- let(:build) { execute(shared_runner) }
+ context 'shared runner' do
+ let(:build) { execute(shared_runner) }
- it { expect(build).to be_nil }
- end
+ it { expect(build).to be_nil }
+ end
- context 'specific runner' do
- let(:build) { execute(specific_runner) }
+ context 'specific runner' do
+ let(:build) { execute(specific_runner) }
- it { expect(build).to be_kind_of(Build) }
- it { expect(build).to be_valid }
- it { expect(build).to be_running }
- it { expect(build.runner).to eq(specific_runner) }
+ it { expect(build).to be_kind_of(Build) }
+ it { expect(build).to be_valid }
+ it { expect(build).to be_running }
+ it { expect(build.runner).to eq(specific_runner) }
+ end
end
- end
- context 'disallow when builds are disabled' do
- before do
- project.update!(shared_runners_enabled: true, group_runners_enabled: true)
- project.project_feature.update_attribute(:builds_access_level, ProjectFeature::DISABLED)
- end
+ context 'disallow when builds are disabled' do
+ before do
+ project.update!(shared_runners_enabled: true, group_runners_enabled: true)
+ project.project_feature.update_attribute(:builds_access_level, ProjectFeature::DISABLED)
+ end
- context 'and uses shared runner' do
- let(:build) { execute(shared_runner) }
+ context 'and uses shared runner' do
+ let(:build) { execute(shared_runner) }
- it { expect(build).to be_nil }
- end
+ it { expect(build).to be_nil }
+ end
- context 'and uses group runner' do
- let(:build) { execute(group_runner) }
+ context 'and uses group runner' do
+ let(:build) { execute(group_runner) }
- it { expect(build).to be_nil }
- end
+ it { expect(build).to be_nil }
+ end
- context 'and uses project runner' do
- let(:build) { execute(specific_runner) }
+ context 'and uses project runner' do
+ let(:build) { execute(specific_runner) }
- it { expect(build).to be_nil }
+ it { expect(build).to be_nil }
+ end
end
- end
- context 'allow group runners' do
- before do
- project.update!(group_runners_enabled: true)
- end
+ context 'allow group runners' do
+ before do
+ project.update!(group_runners_enabled: true)
+ end
- context 'for multiple builds' do
- let!(:project2) { create(:project, group_runners_enabled: true, group: group) }
- let!(:pipeline2) { create(:ci_pipeline, project: project2) }
- let!(:project3) { create(:project, group_runners_enabled: true, group: group) }
- let!(:pipeline3) { create(:ci_pipeline, project: project3) }
+ context 'for multiple builds' do
+ let!(:project2) { create(:project, group_runners_enabled: true, group: group) }
+ let!(:pipeline2) { create(:ci_pipeline, project: project2) }
+ let!(:project3) { create(:project, group_runners_enabled: true, group: group) }
+ let!(:pipeline3) { create(:ci_pipeline, project: project3) }
- let!(:build1_project1) { pending_job }
- let!(:build2_project1) { create(:ci_build, pipeline: pipeline) }
- let!(:build3_project1) { create(:ci_build, pipeline: pipeline) }
- let!(:build1_project2) { create(:ci_build, pipeline: pipeline2) }
- let!(:build2_project2) { create(:ci_build, pipeline: pipeline2) }
- let!(:build1_project3) { create(:ci_build, pipeline: pipeline3) }
+ let!(:build1_project1) { pending_job }
+ let!(:build2_project1) { create(:ci_build, pipeline: pipeline) }
+ let!(:build3_project1) { create(:ci_build, pipeline: pipeline) }
+ let!(:build1_project2) { create(:ci_build, pipeline: pipeline2) }
+ let!(:build2_project2) { create(:ci_build, pipeline: pipeline2) }
+ let!(:build1_project3) { create(:ci_build, pipeline: pipeline3) }
- # these shouldn't influence the scheduling
- let!(:unrelated_group) { create(:group) }
- let!(:unrelated_project) { create(:project, group_runners_enabled: true, group: unrelated_group) }
- let!(:unrelated_pipeline) { create(:ci_pipeline, project: unrelated_project) }
- let!(:build1_unrelated_project) { create(:ci_build, pipeline: unrelated_pipeline) }
- let!(:unrelated_group_runner) { create(:ci_runner, :group, groups: [unrelated_group]) }
+ # these shouldn't influence the scheduling
+ let!(:unrelated_group) { create(:group) }
+ let!(:unrelated_project) { create(:project, group_runners_enabled: true, group: unrelated_group) }
+ let!(:unrelated_pipeline) { create(:ci_pipeline, project: unrelated_project) }
+ let!(:build1_unrelated_project) { create(:ci_build, pipeline: unrelated_pipeline) }
+ let!(:unrelated_group_runner) { create(:ci_runner, :group, groups: [unrelated_group]) }
- it 'does not consider builds from other group runners' do
- expect(described_class.new(group_runner).send(:builds_for_group_runner).count).to eq 6
- execute(group_runner)
+ it 'does not consider builds from other group runners' do
+ expect(described_class.new(group_runner).send(:builds_for_group_runner).count).to eq 6
+ execute(group_runner)
- expect(described_class.new(group_runner).send(:builds_for_group_runner).count).to eq 5
- execute(group_runner)
+ expect(described_class.new(group_runner).send(:builds_for_group_runner).count).to eq 5
+ execute(group_runner)
- expect(described_class.new(group_runner).send(:builds_for_group_runner).count).to eq 4
- execute(group_runner)
+ expect(described_class.new(group_runner).send(:builds_for_group_runner).count).to eq 4
+ execute(group_runner)
- expect(described_class.new(group_runner).send(:builds_for_group_runner).count).to eq 3
- execute(group_runner)
+ expect(described_class.new(group_runner).send(:builds_for_group_runner).count).to eq 3
+ execute(group_runner)
- expect(described_class.new(group_runner).send(:builds_for_group_runner).count).to eq 2
- execute(group_runner)
+ expect(described_class.new(group_runner).send(:builds_for_group_runner).count).to eq 2
+ execute(group_runner)
- expect(described_class.new(group_runner).send(:builds_for_group_runner).count).to eq 1
- execute(group_runner)
+ expect(described_class.new(group_runner).send(:builds_for_group_runner).count).to eq 1
+ execute(group_runner)
- expect(described_class.new(group_runner).send(:builds_for_group_runner).count).to eq 0
- expect(execute(group_runner)).to be_nil
+ expect(described_class.new(group_runner).send(:builds_for_group_runner).count).to eq 0
+ expect(execute(group_runner)).to be_nil
+ end
end
- end
- context 'group runner' do
- let(:build) { execute(group_runner) }
+ context 'group runner' do
+ let(:build) { execute(group_runner) }
- it { expect(build).to be_kind_of(Build) }
- it { expect(build).to be_valid }
- it { expect(build).to be_running }
- it { expect(build.runner).to eq(group_runner) }
+ it { expect(build).to be_kind_of(Build) }
+ it { expect(build).to be_valid }
+ it { expect(build).to be_running }
+ it { expect(build.runner).to eq(group_runner) }
+ end
end
- end
- context 'disallow group runners' do
- before do
- project.update!(group_runners_enabled: false)
- end
+ context 'disallow group runners' do
+ before do
+ project.update!(group_runners_enabled: false)
+ end
- context 'group runner' do
- let(:build) { execute(group_runner) }
+ context 'group runner' do
+ let(:build) { execute(group_runner) }
- it { expect(build).to be_nil }
+ it { expect(build).to be_nil }
+ end
end
- end
- context 'when first build is stalled' do
- before do
- allow_any_instance_of(Ci::RegisterJobService).to receive(:assign_runner!).and_call_original
- allow_any_instance_of(Ci::RegisterJobService).to receive(:assign_runner!)
- .with(pending_job, anything).and_raise(ActiveRecord::StaleObjectError)
- end
+ context 'when first build is stalled' do
+ before do
+ allow_any_instance_of(Ci::RegisterJobService).to receive(:assign_runner!).and_call_original
+ allow_any_instance_of(Ci::RegisterJobService).to receive(:assign_runner!)
+ .with(pending_job, anything).and_raise(ActiveRecord::StaleObjectError)
+ end
- subject { described_class.new(specific_runner).execute }
+ subject { described_class.new(specific_runner).execute }
- context 'with multiple builds are in queue' do
- let!(:other_build) { create :ci_build, pipeline: pipeline }
+ context 'with multiple builds are in queue' do
+ let!(:other_build) { create :ci_build, pipeline: pipeline }
- before do
- allow_any_instance_of(Ci::RegisterJobService).to receive(:builds_for_project_runner)
- .and_return(Ci::Build.where(id: [pending_job, other_build]))
- end
+ before do
+ allow_any_instance_of(Ci::RegisterJobService).to receive(:builds_for_project_runner)
+ .and_return(Ci::Build.where(id: [pending_job, other_build]))
+ end
- it "receives second build from the queue" do
- expect(subject).to be_valid
- expect(subject.build).to eq(other_build)
+ it "receives second build from the queue" do
+ expect(subject).to be_valid
+ expect(subject.build).to eq(other_build)
+ end
end
- end
- context 'when single build is in queue' do
- before do
- allow_any_instance_of(Ci::RegisterJobService).to receive(:builds_for_project_runner)
- .and_return(Ci::Build.where(id: pending_job))
- end
+ context 'when single build is in queue' do
+ before do
+ allow_any_instance_of(Ci::RegisterJobService).to receive(:builds_for_project_runner)
+ .and_return(Ci::Build.where(id: pending_job))
+ end
- it "does not receive any valid result" do
- expect(subject).not_to be_valid
+ it "does not receive any valid result" do
+ expect(subject).not_to be_valid
+ end
end
- end
- context 'when there is no build in queue' do
- before do
- allow_any_instance_of(Ci::RegisterJobService).to receive(:builds_for_project_runner)
- .and_return(Ci::Build.none)
- end
+ context 'when there is no build in queue' do
+ before do
+ allow_any_instance_of(Ci::RegisterJobService).to receive(:builds_for_project_runner)
+ .and_return(Ci::Build.none)
+ end
- it "does not receive builds but result is valid" do
- expect(subject).to be_valid
- expect(subject.build).to be_nil
+ it "does not receive builds but result is valid" do
+ expect(subject).to be_valid
+ expect(subject.build).to be_nil
+ end
end
end
- end
- context 'when access_level of runner is not_protected' do
- let!(:specific_runner) { create(:ci_runner, :project, projects: [project]) }
+ context 'when access_level of runner is not_protected' do
+ let!(:specific_runner) { create(:ci_runner, :project, projects: [project]) }
- context 'when a job is protected' do
- let!(:pending_job) { create(:ci_build, :protected, pipeline: pipeline) }
+ context 'when a job is protected' do
+ let!(:pending_job) { create(:ci_build, :protected, pipeline: pipeline) }
- it 'picks the job' do
- expect(execute(specific_runner)).to eq(pending_job)
+ it 'picks the job' do
+ expect(execute(specific_runner)).to eq(pending_job)
+ end
end
- end
- context 'when a job is unprotected' do
- let!(:pending_job) { create(:ci_build, pipeline: pipeline) }
+ context 'when a job is unprotected' do
+ let!(:pending_job) { create(:ci_build, pipeline: pipeline) }
- it 'picks the job' do
- expect(execute(specific_runner)).to eq(pending_job)
+ it 'picks the job' do
+ expect(execute(specific_runner)).to eq(pending_job)
+ end
end
- end
- context 'when protected attribute of a job is nil' do
- let!(:pending_job) { create(:ci_build, pipeline: pipeline) }
+ context 'when protected attribute of a job is nil' do
+ let!(:pending_job) { create(:ci_build, pipeline: pipeline) }
- before do
- pending_job.update_attribute(:protected, nil)
- end
+ before do
+ pending_job.update_attribute(:protected, nil)
+ end
- it 'picks the job' do
- expect(execute(specific_runner)).to eq(pending_job)
+ it 'picks the job' do
+ expect(execute(specific_runner)).to eq(pending_job)
+ end
end
end
- end
- context 'when access_level of runner is ref_protected' do
- let!(:specific_runner) { create(:ci_runner, :project, :ref_protected, projects: [project]) }
+ context 'when access_level of runner is ref_protected' do
+ let!(:specific_runner) { create(:ci_runner, :project, :ref_protected, projects: [project]) }
- context 'when a job is protected' do
- let!(:pending_job) { create(:ci_build, :protected, pipeline: pipeline) }
+ context 'when a job is protected' do
+ let!(:pending_job) { create(:ci_build, :protected, pipeline: pipeline) }
- it 'picks the job' do
- expect(execute(specific_runner)).to eq(pending_job)
+ it 'picks the job' do
+ expect(execute(specific_runner)).to eq(pending_job)
+ end
end
- end
- context 'when a job is unprotected' do
- let!(:pending_job) { create(:ci_build, pipeline: pipeline) }
+ context 'when a job is unprotected' do
+ let!(:pending_job) { create(:ci_build, pipeline: pipeline) }
- it 'does not pick the job' do
- expect(execute(specific_runner)).to be_nil
+ it 'does not pick the job' do
+ expect(execute(specific_runner)).to be_nil
+ end
end
- end
- context 'when protected attribute of a job is nil' do
- let!(:pending_job) { create(:ci_build, pipeline: pipeline) }
+ context 'when protected attribute of a job is nil' do
+ let!(:pending_job) { create(:ci_build, pipeline: pipeline) }
- before do
- pending_job.update_attribute(:protected, nil)
- end
+ before do
+ pending_job.update_attribute(:protected, nil)
+ end
- it 'does not pick the job' do
- expect(execute(specific_runner)).to be_nil
+ it 'does not pick the job' do
+ expect(execute(specific_runner)).to be_nil
+ end
end
end
- end
- context 'runner feature set is verified' do
- let(:options) { { artifacts: { reports: { junit: "junit.xml" } } } }
- let!(:pending_job) { create(:ci_build, :pending, pipeline: pipeline, options: options) }
+ context 'runner feature set is verified' do
+ let(:options) { { artifacts: { reports: { junit: "junit.xml" } } } }
+ let!(:pending_job) { create(:ci_build, :pending, pipeline: pipeline, options: options) }
- subject { execute(specific_runner, params) }
+ subject { execute(specific_runner, params) }
- context 'when feature is missing by runner' do
- let(:params) { {} }
+ context 'when feature is missing by runner' do
+ let(:params) { {} }
- it 'does not pick the build and drops the build' do
- expect(subject).to be_nil
- expect(pending_job.reload).to be_failed
- expect(pending_job).to be_runner_unsupported
+ it 'does not pick the build and drops the build' do
+ expect(subject).to be_nil
+ expect(pending_job.reload).to be_failed
+ expect(pending_job).to be_runner_unsupported
+ end
end
- end
- context 'when feature is supported by runner' do
- let(:params) do
- { info: { features: { upload_multiple_artifacts: true } } }
- end
+ context 'when feature is supported by runner' do
+ let(:params) do
+ { info: { features: { upload_multiple_artifacts: true } } }
+ end
- it 'does pick job' do
- expect(subject).not_to be_nil
+ it 'does pick job' do
+ expect(subject).not_to be_nil
+ end
end
end
- end
- context 'when "dependencies" keyword is specified' do
- shared_examples 'not pick' do
- it 'does not pick the build and drops the build' do
- expect(subject).to be_nil
- expect(pending_job.reload).to be_failed
- expect(pending_job).to be_missing_dependency_failure
+ context 'when "dependencies" keyword is specified' do
+ shared_examples 'not pick' do
+ it 'does not pick the build and drops the build' do
+ expect(subject).to be_nil
+ expect(pending_job.reload).to be_failed
+ expect(pending_job).to be_missing_dependency_failure
+ end
end
- end
- shared_examples 'validation is active' do
- context 'when depended job has not been completed yet' do
- let!(:pre_stage_job) { create(:ci_build, :manual, pipeline: pipeline, name: 'test', stage_idx: 0) }
+ shared_examples 'validation is active' do
+ context 'when depended job has not been completed yet' do
+ let!(:pre_stage_job) { create(:ci_build, :manual, pipeline: pipeline, name: 'test', stage_idx: 0) }
- it { expect(subject).to eq(pending_job) }
- end
+ it { expect(subject).to eq(pending_job) }
+ end
- context 'when artifacts of depended job has been expired' do
- let!(:pre_stage_job) { create(:ci_build, :success, :expired, pipeline: pipeline, name: 'test', stage_idx: 0) }
+ context 'when artifacts of depended job has been expired' do
+ let!(:pre_stage_job) { create(:ci_build, :success, :expired, pipeline: pipeline, name: 'test', stage_idx: 0) }
- it_behaves_like 'not pick'
- end
+ it_behaves_like 'not pick'
+ end
- context 'when artifacts of depended job has been erased' do
- let!(:pre_stage_job) { create(:ci_build, :success, pipeline: pipeline, name: 'test', stage_idx: 0, erased_at: 1.minute.ago) }
+ context 'when artifacts of depended job has been erased' do
+ let!(:pre_stage_job) { create(:ci_build, :success, pipeline: pipeline, name: 'test', stage_idx: 0, erased_at: 1.minute.ago) }
- before do
- pre_stage_job.erase
+ before do
+ pre_stage_job.erase
+ end
+
+ it_behaves_like 'not pick'
end
- it_behaves_like 'not pick'
+ context 'when job object is staled' do
+ let!(:pre_stage_job) { create(:ci_build, :success, :expired, pipeline: pipeline, name: 'test', stage_idx: 0) }
+
+ before do
+ allow_any_instance_of(Ci::Build).to receive(:drop!)
+ .and_raise(ActiveRecord::StaleObjectError.new(pending_job, :drop!))
+ end
+
+ it 'does not drop nor pick' do
+ expect(subject).to be_nil
+ end
+ end
end
- context 'when job object is staled' do
- let!(:pre_stage_job) { create(:ci_build, :success, :expired, pipeline: pipeline, name: 'test', stage_idx: 0) }
+ shared_examples 'validation is not active' do
+ context 'when depended job has not been completed yet' do
+ let!(:pre_stage_job) { create(:ci_build, :manual, pipeline: pipeline, name: 'test', stage_idx: 0) }
- before do
- allow_any_instance_of(Ci::Build).to receive(:drop!)
- .and_raise(ActiveRecord::StaleObjectError.new(pending_job, :drop!))
+ it { expect(subject).to eq(pending_job) }
end
- it 'does not drop nor pick' do
- expect(subject).to be_nil
+ context 'when artifacts of depended job has been expired' do
+ let!(:pre_stage_job) { create(:ci_build, :success, :expired, pipeline: pipeline, name: 'test', stage_idx: 0) }
+
+ it { expect(subject).to eq(pending_job) }
end
- end
- end
- shared_examples 'validation is not active' do
- context 'when depended job has not been completed yet' do
- let!(:pre_stage_job) { create(:ci_build, :manual, pipeline: pipeline, name: 'test', stage_idx: 0) }
+ context 'when artifacts of depended job has been erased' do
+ let!(:pre_stage_job) { create(:ci_build, :success, pipeline: pipeline, name: 'test', stage_idx: 0, erased_at: 1.minute.ago) }
- it { expect(subject).to eq(pending_job) }
+ before do
+ pre_stage_job.erase
+ end
+
+ it { expect(subject).to eq(pending_job) }
+ end
end
- context 'when artifacts of depended job has been expired' do
- let!(:pre_stage_job) { create(:ci_build, :success, :expired, pipeline: pipeline, name: 'test', stage_idx: 0) }
+ before do
+ stub_feature_flags(ci_validate_build_dependencies_override: false)
+ end
+
+ let!(:pre_stage_job) { create(:ci_build, :success, pipeline: pipeline, name: 'test', stage_idx: 0) }
- it { expect(subject).to eq(pending_job) }
+ let!(:pending_job) do
+ create(:ci_build, :pending,
+ pipeline: pipeline, stage_idx: 1,
+ options: { script: ["bash"], dependencies: ['test'] })
end
- context 'when artifacts of depended job has been erased' do
- let!(:pre_stage_job) { create(:ci_build, :success, pipeline: pipeline, name: 'test', stage_idx: 0, erased_at: 1.minute.ago) }
+ subject { execute(specific_runner) }
+ context 'when validates for dependencies is enabled' do
before do
- pre_stage_job.erase
+ stub_feature_flags(ci_validate_build_dependencies_override: false)
end
- it { expect(subject).to eq(pending_job) }
+ it_behaves_like 'validation is active'
+
+ context 'when the main feature flag is enabled for a specific project' do
+ before do
+ stub_feature_flags(ci_validate_build_dependencies: pipeline.project)
+ end
+
+ it_behaves_like 'validation is active'
+ end
+
+ context 'when the main feature flag is enabled for a different project' do
+ before do
+ stub_feature_flags(ci_validate_build_dependencies: create(:project))
+ end
+
+ it_behaves_like 'validation is not active'
+ end
end
- end
- before do
- stub_feature_flags(ci_validate_build_dependencies_override: false)
+ context 'when validates for dependencies is disabled' do
+ before do
+ stub_feature_flags(ci_validate_build_dependencies_override: true)
+ end
+
+ it_behaves_like 'validation is not active'
+ end
end
- let!(:pre_stage_job) { create(:ci_build, :success, pipeline: pipeline, name: 'test', stage_idx: 0) }
+ context 'when build is degenerated' do
+ let!(:pending_job) { create(:ci_build, :pending, :degenerated, pipeline: pipeline) }
+
+ subject { execute(specific_runner, {}) }
+
+ it 'does not pick the build and drops the build' do
+ expect(subject).to be_nil
- let!(:pending_job) do
- create(:ci_build, :pending,
- pipeline: pipeline, stage_idx: 1,
- options: { script: ["bash"], dependencies: ['test'] })
+ pending_job.reload
+ expect(pending_job).to be_failed
+ expect(pending_job).to be_archived_failure
+ end
end
- subject { execute(specific_runner) }
+ context 'when build has data integrity problem' do
+ let!(:pending_job) do
+ create(:ci_build, :pending, pipeline: pipeline)
+ end
- context 'when validates for dependencies is enabled' do
before do
- stub_feature_flags(ci_validate_build_dependencies_override: false)
+ pending_job.update_columns(options: "string")
end
- it_behaves_like 'validation is active'
+ subject { execute(specific_runner, {}) }
- context 'when the main feature flag is enabled for a specific project' do
- before do
- stub_feature_flags(ci_validate_build_dependencies: pipeline.project)
- end
+ it 'does drop the build and logs both failures' do
+ expect(Gitlab::ErrorTracking).to receive(:track_exception)
+ .with(anything, a_hash_including(build_id: pending_job.id))
+ .twice
+ .and_call_original
- it_behaves_like 'validation is active'
- end
-
- context 'when the main feature flag is enabled for a different project' do
- before do
- stub_feature_flags(ci_validate_build_dependencies: create(:project))
- end
+ expect(subject).to be_nil
- it_behaves_like 'validation is not active'
+ pending_job.reload
+ expect(pending_job).to be_failed
+ expect(pending_job).to be_data_integrity_failure
end
end
- context 'when validates for dependencies is disabled' do
+ context 'when build fails to be run!' do
+ let!(:pending_job) do
+ create(:ci_build, :pending, pipeline: pipeline)
+ end
+
before do
- stub_feature_flags(ci_validate_build_dependencies_override: true)
+ expect_any_instance_of(Ci::Build).to receive(:run!)
+ .and_raise(RuntimeError, 'scheduler error')
end
- it_behaves_like 'validation is not active'
+ subject { execute(specific_runner, {}) }
+
+ it 'does drop the build and logs failure' do
+ expect(Gitlab::ErrorTracking).to receive(:track_exception)
+ .with(anything, a_hash_including(build_id: pending_job.id))
+ .once
+ .and_call_original
+
+ expect(subject).to be_nil
+
+ pending_job.reload
+ expect(pending_job).to be_failed
+ expect(pending_job).to be_scheduler_failure
+ end
end
- end
- context 'when build is degenerated' do
- let!(:pending_job) { create(:ci_build, :pending, :degenerated, pipeline: pipeline) }
+ context 'when an exception is raised during a persistent ref creation' do
+ before do
+ allow_any_instance_of(Ci::PersistentRef).to receive(:exist?) { false }
+ allow_any_instance_of(Ci::PersistentRef).to receive(:create_ref) { raise ArgumentError }
+ end
- subject { execute(specific_runner, {}) }
+ subject { execute(specific_runner, {}) }
- it 'does not pick the build and drops the build' do
- expect(subject).to be_nil
+ it 'picks the build' do
+ expect(subject).to eq(pending_job)
- pending_job.reload
- expect(pending_job).to be_failed
- expect(pending_job).to be_archived_failure
+ pending_job.reload
+ expect(pending_job).to be_running
+ end
end
- end
- context 'when build has data integrity problem' do
- let!(:pending_job) do
- create(:ci_build, :pending, pipeline: pipeline)
- end
+ context 'when only some builds can be matched by runner' do
+ let!(:specific_runner) { create(:ci_runner, :project, projects: [project], tag_list: %w[matching]) }
+ let!(:pending_job) { create(:ci_build, pipeline: pipeline, tag_list: %w[matching]) }
- before do
- pending_job.update_columns(options: "string")
+ before do
+ # create additional matching and non-matching jobs
+ create_list(:ci_build, 2, pipeline: pipeline, tag_list: %w[matching])
+ create(:ci_build, pipeline: pipeline, tag_list: %w[non-matching])
+ end
+
+ it "observes queue size of only matching jobs" do
+ # pending_job + 2 x matching ones
+ expect(Gitlab::Ci::Queue::Metrics.queue_size_total).to receive(:observe).with({}, 3)
+
+ expect(execute(specific_runner)).to eq(pending_job)
+ end
end
- subject { execute(specific_runner, {}) }
+ context 'when ci_register_job_temporary_lock is enabled' do
+ before do
+ stub_feature_flags(ci_register_job_temporary_lock: true)
- it 'does drop the build and logs both failures' do
- expect(Gitlab::ErrorTracking).to receive(:track_exception)
- .with(anything, a_hash_including(build_id: pending_job.id))
- .twice
- .and_call_original
+ allow(Gitlab::Ci::Queue::Metrics.queue_operations_total).to receive(:increment)
+ end
- expect(subject).to be_nil
+ context 'when a build is temporarily locked' do
+ let(:service) { described_class.new(specific_runner) }
- pending_job.reload
- expect(pending_job).to be_failed
- expect(pending_job).to be_data_integrity_failure
- end
- end
+ before do
+ service.send(:acquire_temporary_lock, pending_job.id)
+ end
- context 'when build fails to be run!' do
- let!(:pending_job) do
- create(:ci_build, :pending, pipeline: pipeline)
- end
+ it 'skips this build and marks queue as invalid' do
+ expect(Gitlab::Ci::Queue::Metrics.queue_operations_total).to receive(:increment)
+ .with(operation: :queue_iteration)
+ expect(Gitlab::Ci::Queue::Metrics.queue_operations_total).to receive(:increment)
+ .with(operation: :build_temporary_locked)
- before do
- expect_any_instance_of(Ci::Build).to receive(:run!)
- .and_raise(RuntimeError, 'scheduler error')
- end
+ expect(service.execute).not_to be_valid
+ end
- subject { execute(specific_runner, {}) }
+ context 'when there is another build in queue' do
+ let!(:next_pending_job) { create(:ci_build, pipeline: pipeline) }
- it 'does drop the build and logs failure' do
- expect(Gitlab::ErrorTracking).to receive(:track_exception)
- .with(anything, a_hash_including(build_id: pending_job.id))
- .once
- .and_call_original
+ it 'skips this build and picks another build' do
+ expect(Gitlab::Ci::Queue::Metrics.queue_operations_total).to receive(:increment)
+ .with(operation: :queue_iteration).twice
+ expect(Gitlab::Ci::Queue::Metrics.queue_operations_total).to receive(:increment)
+ .with(operation: :build_temporary_locked)
- expect(subject).to be_nil
+ result = service.execute
- pending_job.reload
- expect(pending_job).to be_failed
- expect(pending_job).to be_scheduler_failure
+ expect(result.build).to eq(next_pending_job)
+ expect(result).to be_valid
+ end
+ end
+ end
end
end
- context 'when an exception is raised during a persistent ref creation' do
+ context 'when ci_register_job_service_one_by_one is enabled' do
before do
- allow_any_instance_of(Ci::PersistentRef).to receive(:exist?) { false }
- allow_any_instance_of(Ci::PersistentRef).to receive(:create_ref) { raise ArgumentError }
+ stub_feature_flags(ci_register_job_service_one_by_one: true)
end
- subject { execute(specific_runner, {}) }
+ it 'picks builds one-by-one' do
+ expect(Ci::Build).to receive(:find).with(pending_job.id).and_call_original
- it 'picks the build' do
- expect(subject).to eq(pending_job)
+ expect(execute(specific_runner)).to eq(pending_job)
+ end
+
+ include_examples 'handles runner assignment'
+ end
- pending_job.reload
- expect(pending_job).to be_running
+ context 'when ci_register_job_service_one_by_one is disabled' do
+ before do
+ stub_feature_flags(ci_register_job_service_one_by_one: false)
end
+
+ include_examples 'handles runner assignment'
end
end
@@ -590,22 +673,14 @@ module Ci
before do
allow(Time).to receive(:now).and_return(current_time)
-
- # Stub defaults for any metrics other than the ones we're testing
- allow(Gitlab::Metrics).to receive(:counter)
- .with(any_args)
- .and_return(Gitlab::Metrics::NullMetric.instance)
- allow(Gitlab::Metrics).to receive(:histogram)
- .with(any_args)
- .and_return(Gitlab::Metrics::NullMetric.instance)
-
# Stub tested metrics
- allow(Gitlab::Metrics).to receive(:counter)
- .with(:job_register_attempts_total, anything)
- .and_return(attempt_counter)
- allow(Gitlab::Metrics).to receive(:histogram)
- .with(:job_queue_duration_seconds, anything, anything, anything)
- .and_return(job_queue_duration_seconds)
+ allow(Gitlab::Ci::Queue::Metrics)
+ .to receive(:attempt_counter)
+ .and_return(attempt_counter)
+
+ allow(Gitlab::Ci::Queue::Metrics)
+ .to receive(:job_queue_duration_seconds)
+ .and_return(job_queue_duration_seconds)
project.update!(shared_runners_enabled: true)
pending_job.update!(created_at: current_time - 3600, queued_at: current_time - 1800)
@@ -655,7 +730,7 @@ module Ci
context 'when shared runner is used' do
let(:runner) { create(:ci_runner, :instance, tag_list: %w(tag1 tag2)) }
let(:expected_shared_runner) { true }
- let(:expected_shard) { Ci::RegisterJobService::DEFAULT_METRICS_SHARD }
+ let(:expected_shard) { ::Gitlab::Ci::Queue::Metrics::DEFAULT_METRICS_SHARD }
let(:expected_jobs_running_for_project_first_job) { 0 }
let(:expected_jobs_running_for_project_third_job) { 2 }
@@ -694,7 +769,7 @@ module Ci
context 'when specific runner is used' do
let(:runner) { create(:ci_runner, :project, projects: [project], tag_list: %w(tag1 metrics_shard::shard_tag tag2)) }
let(:expected_shared_runner) { false }
- let(:expected_shard) { Ci::RegisterJobService::DEFAULT_METRICS_SHARD }
+ let(:expected_shard) { ::Gitlab::Ci::Queue::Metrics::DEFAULT_METRICS_SHARD }
let(:expected_jobs_running_for_project_first_job) { '+Inf' }
let(:expected_jobs_running_for_project_third_job) { '+Inf' }
@@ -715,6 +790,46 @@ module Ci
end
end
+ context 'when max queue depth is reached' do
+ let!(:pending_job) { create(:ci_build, :pending, :degenerated, pipeline: pipeline) }
+ let!(:pending_job_2) { create(:ci_build, :pending, :degenerated, pipeline: pipeline) }
+ let!(:pending_job_3) { create(:ci_build, :pending, pipeline: pipeline) }
+
+ before do
+ stub_const("#{described_class}::MAX_QUEUE_DEPTH", 2)
+ end
+
+ context 'when feature is enabled' do
+ before do
+ stub_feature_flags(gitlab_ci_builds_queue_limit: true)
+ end
+
+ it 'returns 409 conflict' do
+ expect(Ci::Build.pending.unstarted.count).to eq 3
+
+ result = described_class.new(specific_runner).execute
+
+ expect(result).not_to be_valid
+ expect(result.build).to be_nil
+ end
+ end
+
+ context 'when feature is disabled' do
+ before do
+ stub_feature_flags(gitlab_ci_builds_queue_limit: false)
+ end
+
+ it 'returns a valid result' do
+ expect(Ci::Build.pending.unstarted.count).to eq 3
+
+ result = described_class.new(specific_runner).execute
+
+ expect(result).to be_valid
+ expect(result.build).to eq pending_job_3
+ end
+ end
+ end
+
def execute(runner, params = {})
described_class.new(runner).execute(params).build
end
diff --git a/spec/services/ci/update_build_queue_service_spec.rb b/spec/services/ci/update_build_queue_service_spec.rb
index ebccfdc5140..2d9f80a249d 100644
--- a/spec/services/ci/update_build_queue_service_spec.rb
+++ b/spec/services/ci/update_build_queue_service_spec.rb
@@ -26,6 +26,25 @@ RSpec.describe Ci::UpdateBuildQueueService do
end
it_behaves_like 'refreshes runner'
+
+ it 'avoids running redundant queries' do
+ expect(Ci::Runner).not_to receive(:owned_or_instance_wide)
+
+ subject.execute(build)
+ end
+
+ context 'when feature flag ci_reduce_queries_when_ticking_runner_queue is disabled' do
+ before do
+ stub_feature_flags(ci_reduce_queries_when_ticking_runner_queue: false)
+ stub_feature_flags(ci_runners_short_circuit_assignable_for: false)
+ end
+
+ it 'runs redundant queries using `owned_or_instance_wide` scope' do
+ expect(Ci::Runner).to receive(:owned_or_instance_wide).and_call_original
+
+ subject.execute(build)
+ end
+ end
end
end
@@ -97,4 +116,43 @@ RSpec.describe Ci::UpdateBuildQueueService do
it_behaves_like 'does not refresh runner'
end
end
+
+ context 'avoids N+1 queries', :request_store do
+ let!(:build) { create(:ci_build, pipeline: pipeline, tag_list: %w[a b]) }
+ let!(:project_runner) { create(:ci_runner, :project, :online, projects: [project], tag_list: %w[a b c]) }
+
+ context 'when ci_preload_runner_tags and ci_reduce_queries_when_ticking_runner_queue are enabled' do
+ before do
+ stub_feature_flags(
+ ci_reduce_queries_when_ticking_runner_queue: true,
+ ci_preload_runner_tags: true
+ )
+ end
+
+ it 'does execute the same amount of queries regardless of number of runners' do
+ control_count = ActiveRecord::QueryRecorder.new { subject.execute(build) }.count
+
+ create_list(:ci_runner, 10, :project, :online, projects: [project], tag_list: %w[b c d])
+
+ expect { subject.execute(build) }.not_to exceed_all_query_limit(control_count)
+ end
+ end
+
+ context 'when ci_preload_runner_tags and ci_reduce_queries_when_ticking_runner_queue are disabled' do
+ before do
+ stub_feature_flags(
+ ci_reduce_queries_when_ticking_runner_queue: false,
+ ci_preload_runner_tags: false
+ )
+ end
+
+ it 'does execute more queries for more runners' do
+ control_count = ActiveRecord::QueryRecorder.new { subject.execute(build) }.count
+
+ create_list(:ci_runner, 10, :project, :online, projects: [project], tag_list: %w[b c d])
+
+ expect { subject.execute(build) }.to exceed_all_query_limit(control_count)
+ end
+ end
+ end
end
diff --git a/spec/services/clusters/kubernetes/create_or_update_namespace_service_spec.rb b/spec/services/clusters/kubernetes/create_or_update_namespace_service_spec.rb
index 90956e7b4ea..98963f57341 100644
--- a/spec/services/clusters/kubernetes/create_or_update_namespace_service_spec.rb
+++ b/spec/services/clusters/kubernetes/create_or_update_namespace_service_spec.rb
@@ -39,6 +39,8 @@ RSpec.describe Clusters::Kubernetes::CreateOrUpdateNamespaceService, '#execute'
stub_kubeclient_put_role_binding(api_url, Clusters::Kubernetes::GITLAB_KNATIVE_SERVING_ROLE_BINDING_NAME, namespace: namespace)
stub_kubeclient_put_role(api_url, Clusters::Kubernetes::GITLAB_CROSSPLANE_DATABASE_ROLE_NAME, namespace: namespace)
stub_kubeclient_put_role_binding(api_url, Clusters::Kubernetes::GITLAB_CROSSPLANE_DATABASE_ROLE_BINDING_NAME, namespace: namespace)
+ stub_kubeclient_put_role(api_url, Clusters::Kubernetes::GITLAB_CILIUM_ROLE_NAME, namespace: namespace)
+ stub_kubeclient_put_role_binding(api_url, Clusters::Kubernetes::GITLAB_CILIUM_ROLE_BINDING_NAME, namespace: namespace)
stub_kubeclient_get_secret(
api_url,
diff --git a/spec/services/clusters/kubernetes/create_or_update_service_account_service_spec.rb b/spec/services/clusters/kubernetes/create_or_update_service_account_service_spec.rb
index a4f018aec0c..11045dfe950 100644
--- a/spec/services/clusters/kubernetes/create_or_update_service_account_service_spec.rb
+++ b/spec/services/clusters/kubernetes/create_or_update_service_account_service_spec.rb
@@ -147,6 +147,8 @@ RSpec.describe Clusters::Kubernetes::CreateOrUpdateServiceAccountService do
stub_kubeclient_put_role_binding(api_url, Clusters::Kubernetes::GITLAB_KNATIVE_SERVING_ROLE_BINDING_NAME, namespace: namespace)
stub_kubeclient_put_role(api_url, Clusters::Kubernetes::GITLAB_CROSSPLANE_DATABASE_ROLE_NAME, namespace: namespace)
stub_kubeclient_put_role_binding(api_url, Clusters::Kubernetes::GITLAB_CROSSPLANE_DATABASE_ROLE_BINDING_NAME, namespace: namespace)
+ stub_kubeclient_put_role(api_url, Clusters::Kubernetes::GITLAB_CILIUM_ROLE_NAME, namespace: namespace)
+ stub_kubeclient_put_role_binding(api_url, Clusters::Kubernetes::GITLAB_CILIUM_ROLE_BINDING_NAME, namespace: namespace)
end
it 'creates a namespace object' do
@@ -243,6 +245,47 @@ RSpec.describe Clusters::Kubernetes::CreateOrUpdateServiceAccountService do
)
)
end
+
+ it 'creates a role granting cilium permissions to the service account' do
+ subject
+
+ expect(WebMock).to have_requested(:put, api_url + "/apis/rbac.authorization.k8s.io/v1/namespaces/#{namespace}/roles/#{Clusters::Kubernetes::GITLAB_CILIUM_ROLE_NAME}").with(
+ body: hash_including(
+ metadata: {
+ name: Clusters::Kubernetes::GITLAB_CILIUM_ROLE_NAME,
+ namespace: namespace
+ },
+ rules: [{
+ apiGroups: %w(cilium.io),
+ resources: %w(ciliumnetworkpolicies),
+ verbs: %w(get list create update patch)
+ }]
+ )
+ )
+ end
+
+ it 'creates a role binding granting cilium permissions to the service account' do
+ subject
+
+ expect(WebMock).to have_requested(:put, api_url + "/apis/rbac.authorization.k8s.io/v1/namespaces/#{namespace}/rolebindings/#{Clusters::Kubernetes::GITLAB_CILIUM_ROLE_BINDING_NAME}").with(
+ body: hash_including(
+ metadata: {
+ name: Clusters::Kubernetes::GITLAB_CILIUM_ROLE_BINDING_NAME,
+ namespace: namespace
+ },
+ roleRef: {
+ apiGroup: 'rbac.authorization.k8s.io',
+ kind: 'Role',
+ name: Clusters::Kubernetes::GITLAB_CILIUM_ROLE_NAME
+ },
+ subjects: [{
+ kind: 'ServiceAccount',
+ name: service_account_name,
+ namespace: namespace
+ }]
+ )
+ )
+ end
end
end
end
diff --git a/spec/services/dependency_proxy/find_or_create_manifest_service_spec.rb b/spec/services/dependency_proxy/find_or_create_manifest_service_spec.rb
index c375e5a2fa3..40a2f954786 100644
--- a/spec/services/dependency_proxy/find_or_create_manifest_service_spec.rb
+++ b/spec/services/dependency_proxy/find_or_create_manifest_service_spec.rb
@@ -10,7 +10,12 @@ RSpec.describe DependencyProxy::FindOrCreateManifestService do
let(:manifest) { dependency_proxy_manifest.file.read }
let(:group) { dependency_proxy_manifest.group }
let(:token) { Digest::SHA256.hexdigest('123') }
- let(:headers) { { 'docker-content-digest' => dependency_proxy_manifest.digest } }
+ let(:headers) do
+ {
+ 'docker-content-digest' => dependency_proxy_manifest.digest,
+ 'content-type' => dependency_proxy_manifest.content_type
+ }
+ end
describe '#execute' do
subject { described_class.new(group, image, tag, token).execute }
@@ -18,22 +23,37 @@ RSpec.describe DependencyProxy::FindOrCreateManifestService do
context 'when no manifest exists' do
let_it_be(:image) { 'new-image' }
- before do
- stub_manifest_head(image, tag, digest: dependency_proxy_manifest.digest)
- stub_manifest_download(image, tag, headers: headers)
+ shared_examples 'downloading the manifest' do
+ it 'downloads manifest from remote registry if there is no cached one', :aggregate_failures do
+ expect { subject }.to change { group.dependency_proxy_manifests.count }.by(1)
+ expect(subject[:status]).to eq(:success)
+ expect(subject[:manifest]).to be_a(DependencyProxy::Manifest)
+ expect(subject[:manifest]).to be_persisted
+ end
end
- it 'downloads manifest from remote registry if there is no cached one', :aggregate_failures do
- expect { subject }.to change { group.dependency_proxy_manifests.count }.by(1)
- expect(subject[:status]).to eq(:success)
- expect(subject[:manifest]).to be_a(DependencyProxy::Manifest)
- expect(subject[:manifest]).to be_persisted
+ context 'successful head request' do
+ before do
+ stub_manifest_head(image, tag, headers: headers)
+ stub_manifest_download(image, tag, headers: headers)
+ end
+
+ it_behaves_like 'downloading the manifest'
+ end
+
+ context 'failed head request' do
+ before do
+ stub_manifest_head(image, tag, status: :error)
+ stub_manifest_download(image, tag, headers: headers)
+ end
+
+ it_behaves_like 'downloading the manifest'
end
end
context 'when manifest exists' do
before do
- stub_manifest_head(image, tag, digest: dependency_proxy_manifest.digest)
+ stub_manifest_head(image, tag, headers: headers)
end
shared_examples 'using the cached manifest' do
@@ -48,15 +68,17 @@ RSpec.describe DependencyProxy::FindOrCreateManifestService do
context 'when digest is stale' do
let(:digest) { 'new-digest' }
+ let(:content_type) { 'new-content-type' }
before do
- stub_manifest_head(image, tag, digest: digest)
- stub_manifest_download(image, tag, headers: { 'docker-content-digest' => digest })
+ stub_manifest_head(image, tag, headers: { 'docker-content-digest' => digest, 'content-type' => content_type })
+ stub_manifest_download(image, tag, headers: { 'docker-content-digest' => digest, 'content-type' => content_type })
end
it 'downloads the new manifest and updates the existing record', :aggregate_failures do
expect(subject[:status]).to eq(:success)
expect(subject[:manifest]).to eq(dependency_proxy_manifest)
+ expect(subject[:manifest].content_type).to eq(content_type)
expect(subject[:manifest].digest).to eq(digest)
end
end
diff --git a/spec/services/dependency_proxy/head_manifest_service_spec.rb b/spec/services/dependency_proxy/head_manifest_service_spec.rb
index 7c7ebe4d181..9c1e4d650f8 100644
--- a/spec/services/dependency_proxy/head_manifest_service_spec.rb
+++ b/spec/services/dependency_proxy/head_manifest_service_spec.rb
@@ -8,12 +8,19 @@ RSpec.describe DependencyProxy::HeadManifestService do
let(:tag) { 'latest' }
let(:token) { Digest::SHA256.hexdigest('123') }
let(:digest) { '12345' }
+ let(:content_type) { 'foo' }
+ let(:headers) do
+ {
+ 'docker-content-digest' => digest,
+ 'content-type' => content_type
+ }
+ end
subject { described_class.new(image, tag, token).execute }
context 'remote request is successful' do
before do
- stub_manifest_head(image, tag, digest: digest)
+ stub_manifest_head(image, tag, headers: headers)
end
it { expect(subject[:status]).to eq(:success) }
diff --git a/spec/services/dependency_proxy/pull_manifest_service_spec.rb b/spec/services/dependency_proxy/pull_manifest_service_spec.rb
index b760839d1fb..b3053174cc0 100644
--- a/spec/services/dependency_proxy/pull_manifest_service_spec.rb
+++ b/spec/services/dependency_proxy/pull_manifest_service_spec.rb
@@ -9,7 +9,10 @@ RSpec.describe DependencyProxy::PullManifestService do
let(:token) { Digest::SHA256.hexdigest('123') }
let(:manifest) { { foo: 'bar' }.to_json }
let(:digest) { '12345' }
- let(:headers) { { 'docker-content-digest' => digest } }
+ let(:content_type) { 'foo' }
+ let(:headers) do
+ { 'docker-content-digest' => digest, 'content-type' => content_type }
+ end
subject { described_class.new(image, tag, token).execute_with_manifest(&method(:check_response)) }
@@ -25,6 +28,7 @@ RSpec.describe DependencyProxy::PullManifestService do
expect(response[:status]).to eq(:success)
expect(response[:file].read).to eq(manifest)
expect(response[:digest]).to eq(digest)
+ expect(response[:content_type]).to eq(content_type)
end
subject
diff --git a/spec/services/deployments/update_environment_service_spec.rb b/spec/services/deployments/update_environment_service_spec.rb
index 92488c62315..ae5e8445554 100644
--- a/spec/services/deployments/update_environment_service_spec.rb
+++ b/spec/services/deployments/update_environment_service_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe Deployments::UpdateEnvironmentService do
let(:user) { create(:user) }
let(:project) { create(:project, :repository) }
- let(:options) { { name: 'production' } }
+ let(:options) { { name: environment_name } }
let(:pipeline) do
create(
:ci_pipeline,
@@ -20,13 +20,14 @@ RSpec.describe Deployments::UpdateEnvironmentService do
pipeline: pipeline,
ref: 'master',
tag: false,
- environment: 'production',
+ environment: environment_name,
options: { environment: options },
project: project)
end
let(:deployment) { job.deployment }
let(:environment) { deployment.environment }
+ let(:environment_name) { 'production' }
subject(:service) { described_class.new(deployment) }
@@ -131,6 +132,66 @@ RSpec.describe Deployments::UpdateEnvironmentService do
end
end
end
+
+ context 'when deployment tier is specified' do
+ let(:environment_name) { 'customer-portal' }
+ let(:options) { { name: environment_name, deployment_tier: 'production' } }
+
+ context 'when tier has already been set' do
+ before do
+ environment.update_column(:tier, Environment.tiers[:other])
+ end
+
+ it 'overwrites the guessed tier by the specified deployment tier' do
+ expect { subject.execute }
+ .to change { environment.reset.tier }.from('other').to('production')
+ end
+ end
+
+ context 'when tier has not been set' do
+ before do
+ environment.update_column(:tier, nil)
+ end
+
+ it 'sets the specified deployment tier' do
+ expect { subject.execute }
+ .to change { environment.reset.tier }.from(nil).to('production')
+ end
+
+ context 'when deployment was created by an external CD system' do
+ before do
+ deployment.update_column(:deployable_id, nil)
+ end
+
+ it 'guesses the deployment tier' do
+ expect { subject.execute }
+ .to change { environment.reset.tier }.from(nil).to('other')
+ end
+ end
+
+ context 'when environment_tier feature flag is disabled' do
+ before do
+ stub_feature_flags(environment_tier: false)
+ end
+
+ it 'does not set the specified deployment tier' do
+ expect { subject.execute }.not_to change { environment.reset.tier }
+ end
+ end
+ end
+ end
+
+ context 'when deployment tier is not specified' do
+ let(:environment_name) { 'customer-portal' }
+ let(:options) { { name: environment_name } }
+
+ it 'guesses the deployment tier' do
+ environment.update_column(:tier, nil)
+
+ expect { subject.execute }
+ .to change { environment.reset.tier }.from(nil).to('other')
+ end
+ end
end
describe '#expanded_environment_url' do
diff --git a/spec/services/groups/destroy_service_spec.rb b/spec/services/groups/destroy_service_spec.rb
index 2f9bb72939a..a5fce315d91 100644
--- a/spec/services/groups/destroy_service_spec.rb
+++ b/spec/services/groups/destroy_service_spec.rb
@@ -229,10 +229,10 @@ RSpec.describe Groups::DestroyService do
# will still be executed for the nested group as they fall under the same hierarchy
# and hence we need to account for this scenario.
expect(UserProjectAccessChangedService)
- .to receive(:new).with(shared_with_group.user_ids_for_project_authorizations).and_call_original
+ .to receive(:new).with(shared_with_group.users_ids_of_direct_members).and_call_original
expect(UserProjectAccessChangedService)
- .not_to receive(:new).with(shared_group.user_ids_for_project_authorizations)
+ .not_to receive(:new).with(shared_group.users_ids_of_direct_members)
destroy_group(shared_group, user, false)
end
@@ -246,7 +246,7 @@ RSpec.describe Groups::DestroyService do
it 'makes use of a specific service to update project authorizations' do
expect(UserProjectAccessChangedService)
- .to receive(:new).with(shared_with_group.user_ids_for_project_authorizations).and_call_original
+ .to receive(:new).with(shared_with_group.users_ids_of_direct_members).and_call_original
destroy_group(shared_with_group, user, false)
end
diff --git a/spec/services/groups/group_links/create_service_spec.rb b/spec/services/groups/group_links/create_service_spec.rb
index fb88433d8f6..df994b9f2a3 100644
--- a/spec/services/groups/group_links/create_service_spec.rb
+++ b/spec/services/groups/group_links/create_service_spec.rb
@@ -74,46 +74,56 @@ RSpec.describe Groups::GroupLinks::CreateService, '#execute' do
end
end
- context 'group hierarchies' do
+ context 'project authorizations based on group hierarchies' do
before do
group_parent.add_owner(parent_group_user)
group.add_owner(group_user)
group_child.add_owner(child_group_user)
end
- context 'group user' do
- let(:user) { group_user }
+ context 'project authorizations refresh' do
+ it 'is executed only for the direct members of the group' do
+ expect(UserProjectAccessChangedService).to receive(:new).with(contain_exactly(group_user.id)).and_call_original
- it 'create proper authorizations' do
subject.execute(shared_group)
-
- expect(Ability.allowed?(user, :read_project, project_parent)).to be_falsey
- expect(Ability.allowed?(user, :read_project, project)).to be_truthy
- expect(Ability.allowed?(user, :read_project, project_child)).to be_truthy
end
end
- context 'parent group user' do
- let(:user) { parent_group_user }
+ context 'project authorizations' do
+ context 'group user' do
+ let(:user) { group_user }
- it 'create proper authorizations' do
- subject.execute(shared_group)
+ it 'create proper authorizations' do
+ subject.execute(shared_group)
- expect(Ability.allowed?(user, :read_project, project_parent)).to be_falsey
- expect(Ability.allowed?(user, :read_project, project)).to be_falsey
- expect(Ability.allowed?(user, :read_project, project_child)).to be_falsey
+ expect(Ability.allowed?(user, :read_project, project_parent)).to be_falsey
+ expect(Ability.allowed?(user, :read_project, project)).to be_truthy
+ expect(Ability.allowed?(user, :read_project, project_child)).to be_truthy
+ end
end
- end
- context 'child group user' do
- let(:user) { child_group_user }
+ context 'parent group user' do
+ let(:user) { parent_group_user }
- it 'create proper authorizations' do
- subject.execute(shared_group)
+ it 'create proper authorizations' do
+ subject.execute(shared_group)
+
+ expect(Ability.allowed?(user, :read_project, project_parent)).to be_falsey
+ expect(Ability.allowed?(user, :read_project, project)).to be_falsey
+ expect(Ability.allowed?(user, :read_project, project_child)).to be_falsey
+ end
+ end
+
+ context 'child group user' do
+ let(:user) { child_group_user }
+
+ it 'create proper authorizations' do
+ subject.execute(shared_group)
- expect(Ability.allowed?(user, :read_project, project_parent)).to be_falsey
- expect(Ability.allowed?(user, :read_project, project)).to be_falsey
- expect(Ability.allowed?(user, :read_project, project_child)).to be_falsey
+ expect(Ability.allowed?(user, :read_project, project_parent)).to be_falsey
+ expect(Ability.allowed?(user, :read_project, project)).to be_falsey
+ expect(Ability.allowed?(user, :read_project, project_child)).to be_falsey
+ end
end
end
end
diff --git a/spec/services/groups/group_links/destroy_service_spec.rb b/spec/services/groups/group_links/destroy_service_spec.rb
index 22fe8a1d58b..97fe23e9147 100644
--- a/spec/services/groups/group_links/destroy_service_spec.rb
+++ b/spec/services/groups/group_links/destroy_service_spec.rb
@@ -47,8 +47,8 @@ RSpec.describe Groups::GroupLinks::DestroyService, '#execute' do
it 'updates project authorization once per group' do
expect(GroupGroupLink).to receive(:delete).and_call_original
- expect(group).to receive(:refresh_members_authorized_projects).once
- expect(another_group).to receive(:refresh_members_authorized_projects).once
+ expect(group).to receive(:refresh_members_authorized_projects).with(direct_members_only: true).once
+ expect(another_group).to receive(:refresh_members_authorized_projects).with(direct_members_only: true).once
subject.execute(links)
end
diff --git a/spec/services/groups/group_links/update_service_spec.rb b/spec/services/groups/group_links/update_service_spec.rb
index e4ff83d7926..436cdf89a0f 100644
--- a/spec/services/groups/group_links/update_service_spec.rb
+++ b/spec/services/groups/group_links/update_service_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe Groups::GroupLinks::UpdateService, '#execute' do
let_it_be(:group) { create(:group, :private) }
let_it_be(:shared_group) { create(:group, :private) }
let_it_be(:project) { create(:project, group: shared_group) }
- let(:group_member) { create(:user) }
+ let(:group_member_user) { create(:user) }
let!(:link) { create(:group_group_link, shared_group: shared_group, shared_with_group: group) }
let(:expiry_date) { 1.month.from_now.to_date }
@@ -20,7 +20,7 @@ RSpec.describe Groups::GroupLinks::UpdateService, '#execute' do
subject { described_class.new(link).execute(group_link_params) }
before do
- group.add_developer(group_member)
+ group.add_developer(group_member_user)
end
it 'updates existing link' do
@@ -36,11 +36,11 @@ RSpec.describe Groups::GroupLinks::UpdateService, '#execute' do
end
it 'updates project permissions' do
- expect { subject }.to change { group_member.can?(:create_release, project) }.from(true).to(false)
+ expect { subject }.to change { group_member_user.can?(:create_release, project) }.from(true).to(false)
end
it 'executes UserProjectAccessChangedService' do
- expect_next_instance_of(UserProjectAccessChangedService) do |service|
+ expect_next_instance_of(UserProjectAccessChangedService, [group_member_user.id]) do |service|
expect(service).to receive(:execute)
end
diff --git a/spec/services/groups/import_export/import_service_spec.rb b/spec/services/groups/import_export/import_service_spec.rb
index 0c7765dcd38..ad5c4364deb 100644
--- a/spec/services/groups/import_export/import_service_spec.rb
+++ b/spec/services/groups/import_export/import_service_spec.rb
@@ -54,7 +54,7 @@ RSpec.describe Groups::ImportExport::ImportService do
end
context 'with group_import_ndjson feature flag disabled' do
- let(:user) { create(:admin) }
+ let(:user) { create(:user) }
let(:group) { create(:group) }
let(:import_logger) { instance_double(Gitlab::Import::Logger) }
@@ -63,6 +63,8 @@ RSpec.describe Groups::ImportExport::ImportService do
before do
stub_feature_flags(group_import_ndjson: false)
+ group.add_owner(user)
+
ImportExportUpload.create!(group: group, import_file: import_file)
allow(Gitlab::Import::Logger).to receive(:build).and_return(import_logger)
@@ -95,7 +97,7 @@ RSpec.describe Groups::ImportExport::ImportService do
end
context 'when importing a ndjson export' do
- let(:user) { create(:admin) }
+ let(:user) { create(:user) }
let(:group) { create(:group) }
let(:service) { described_class.new(group: group, user: user) }
let(:import_file) { fixture_file_upload('spec/fixtures/group_export.tar.gz') }
@@ -115,6 +117,10 @@ RSpec.describe Groups::ImportExport::ImportService do
end
context 'when user has correct permissions' do
+ before do
+ group.add_owner(user)
+ end
+
it 'imports group structure successfully' do
expect(subject).to be_truthy
end
@@ -147,8 +153,6 @@ RSpec.describe Groups::ImportExport::ImportService do
end
context 'when user does not have correct permissions' do
- let(:user) { create(:user) }
-
it 'logs the error and raises an exception' do
expect(import_logger).to receive(:error).with(
group_id: group.id,
@@ -188,6 +192,10 @@ RSpec.describe Groups::ImportExport::ImportService do
context 'when there are errors with the sub-relations' do
let(:import_file) { fixture_file_upload('spec/fixtures/group_export_invalid_subrelations.tar.gz') }
+ before do
+ group.add_owner(user)
+ end
+
it 'successfully imports the group' do
expect(subject).to be_truthy
end
@@ -207,7 +215,7 @@ RSpec.describe Groups::ImportExport::ImportService do
end
context 'when importing a json export' do
- let(:user) { create(:admin) }
+ let(:user) { create(:user) }
let(:group) { create(:group) }
let(:service) { described_class.new(group: group, user: user) }
let(:import_file) { fixture_file_upload('spec/fixtures/legacy_group_export.tar.gz') }
@@ -227,6 +235,10 @@ RSpec.describe Groups::ImportExport::ImportService do
end
context 'when user has correct permissions' do
+ before do
+ group.add_owner(user)
+ end
+
it 'imports group structure successfully' do
expect(subject).to be_truthy
end
@@ -259,8 +271,6 @@ RSpec.describe Groups::ImportExport::ImportService do
end
context 'when user does not have correct permissions' do
- let(:user) { create(:user) }
-
it 'logs the error and raises an exception' do
expect(import_logger).to receive(:error).with(
group_id: group.id,
@@ -300,6 +310,10 @@ RSpec.describe Groups::ImportExport::ImportService do
context 'when there are errors with the sub-relations' do
let(:import_file) { fixture_file_upload('spec/fixtures/legacy_group_export_invalid_subrelations.tar.gz') }
+ before do
+ group.add_owner(user)
+ end
+
it 'successfully imports the group' do
expect(subject).to be_truthy
end
diff --git a/spec/services/import/github_service_spec.rb b/spec/services/import/github_service_spec.rb
index 408d7767254..776df01d399 100644
--- a/spec/services/import/github_service_spec.rb
+++ b/spec/services/import/github_service_spec.rb
@@ -54,6 +54,62 @@ RSpec.describe Import::GithubService do
expect { subject.execute(access_params, :github) }.to raise_error(exception)
end
+
+ context 'repository size validation' do
+ let(:repository_double) { double(name: 'repository', size: 99) }
+
+ before do
+ expect(client).to receive(:repository).and_return(repository_double)
+
+ allow_next_instance_of(Gitlab::LegacyGithubImport::ProjectCreator) do |creator|
+ allow(creator).to receive(:execute).and_return(double(persisted?: true))
+ end
+ end
+
+ context 'when there is no repository size limit defined' do
+ it 'skips the check and succeeds' do
+ expect(subject.execute(access_params, :github)).to include(status: :success)
+ end
+ end
+
+ context 'when the target namespace repository size limit is defined' do
+ let_it_be(:group) { create(:group, repository_size_limit: 100) }
+
+ before do
+ params[:target_namespace] = group.full_path
+ end
+
+ it 'succeeds when the repository is smaller than the limit' do
+ expect(subject.execute(access_params, :github)).to include(status: :success)
+ end
+
+ it 'returns error when the repository is larger than the limit' do
+ allow(repository_double).to receive(:size).and_return(101)
+
+ expect(subject.execute(access_params, :github)).to include(size_limit_error)
+ end
+ end
+
+ context 'when target namespace repository limit is not defined' do
+ let_it_be(:group) { create(:group) }
+
+ before do
+ stub_application_setting(repository_size_limit: 100)
+ end
+
+ context 'when application size limit is defined' do
+ it 'succeeds when the repository is smaller than the limit' do
+ expect(subject.execute(access_params, :github)).to include(status: :success)
+ end
+
+ it 'returns error when the repository is larger than the limit' do
+ allow(repository_double).to receive(:size).and_return(101)
+
+ expect(subject.execute(access_params, :github)).to include(size_limit_error)
+ end
+ end
+ end
+ end
end
context 'when remove_legacy_github_client feature flag is enabled' do
@@ -71,4 +127,12 @@ RSpec.describe Import::GithubService do
include_examples 'handles errors', Gitlab::LegacyGithubImport::Client
end
+
+ def size_limit_error
+ {
+ status: :error,
+ http_status: :unprocessable_entity,
+ message: '"repository" size (101 Bytes) is larger than the limit of 100 Bytes.'
+ }
+ end
end
diff --git a/spec/services/issuable/bulk_update_service_spec.rb b/spec/services/issuable/bulk_update_service_spec.rb
index 79543fe9f5d..c749f282cd3 100644
--- a/spec/services/issuable/bulk_update_service_spec.rb
+++ b/spec/services/issuable/bulk_update_service_spec.rb
@@ -31,23 +31,6 @@ RSpec.describe Issuable::BulkUpdateService do
end
end
- shared_examples 'updates iterations' do
- it 'succeeds' do
- result = bulk_update(issuables, sprint_id: iteration.id)
-
- expect(result.success?).to be_truthy
- expect(result.payload[:count]).to eq(issuables.count)
- end
-
- it 'updates the issuables iteration' do
- bulk_update(issuables, sprint_id: iteration.id)
-
- issuables.each do |issuable|
- expect(issuable.reload.iteration).to eq(iteration)
- end
- end
- end
-
shared_examples 'updating labels' do
def create_issue_with_labels(labels)
create(:labeled_issue, project: project, labels: labels)
@@ -250,21 +233,6 @@ RSpec.describe Issuable::BulkUpdateService do
it_behaves_like 'updates milestones'
end
- describe 'updating iterations' do
- let_it_be(:group) { create(:group) }
- let_it_be(:project) { create(:project, group: group) }
- let_it_be(:issuables) { [create(:issue, project: project)] }
- let_it_be(:iteration) { create(:iteration, group: group) }
-
- let(:parent) { project }
-
- before do
- group.add_reporter(user)
- end
-
- it_behaves_like 'updates iterations'
- end
-
describe 'updating labels' do
let(:bug) { create(:label, project: project) }
let(:regression) { create(:label, project: project) }
@@ -347,19 +315,6 @@ RSpec.describe Issuable::BulkUpdateService do
end
end
- describe 'updating iterations' do
- let_it_be(:iteration) { create(:iteration, group: group) }
- let_it_be(:project) { create(:project, :repository, group: group) }
-
- context 'when issues' do
- let_it_be(:issue1) { create(:issue, project: project) }
- let_it_be(:issue2) { create(:issue, project: project) }
- let_it_be(:issuables) { [issue1, issue2] }
-
- it_behaves_like 'updates iterations'
- end
- end
-
describe 'updating labels' do
let(:project) { create(:project, :repository, group: group) }
let(:bug) { create(:group_label, group: group) }
diff --git a/spec/services/issuable/process_assignees_spec.rb b/spec/services/issuable/process_assignees_spec.rb
new file mode 100644
index 00000000000..876c84957cc
--- /dev/null
+++ b/spec/services/issuable/process_assignees_spec.rb
@@ -0,0 +1,71 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Issuable::ProcessAssignees do
+ describe '#execute' do
+ it 'returns assignee_ids when assignee_ids are specified' do
+ process = Issuable::ProcessAssignees.new(assignee_ids: %w(5 7 9),
+ add_assignee_ids: %w(2 4 6),
+ remove_assignee_ids: %w(4 7 11),
+ existing_assignee_ids: %w(1 3 9),
+ extra_assignee_ids: %w(2 5 12))
+ result = process.execute
+
+ expect(result.sort).to eq(%w(5 7 9).sort)
+ end
+
+ it 'combines other ids when assignee_ids is empty' do
+ process = Issuable::ProcessAssignees.new(assignee_ids: [],
+ add_assignee_ids: %w(2 4 6),
+ remove_assignee_ids: %w(4 7 11),
+ existing_assignee_ids: %w(1 3 11),
+ extra_assignee_ids: %w(2 5 12))
+ result = process.execute
+
+ expect(result.sort).to eq(%w(1 2 3 5 6 12).sort)
+ end
+
+ it 'combines other ids when assignee_ids is nil' do
+ process = Issuable::ProcessAssignees.new(assignee_ids: nil,
+ add_assignee_ids: %w(2 4 6),
+ remove_assignee_ids: %w(4 7 11),
+ existing_assignee_ids: %w(1 3 11),
+ extra_assignee_ids: %w(2 5 12))
+ result = process.execute
+
+ expect(result.sort).to eq(%w(1 2 3 5 6 12).sort)
+ end
+
+ it 'combines other ids when assignee_ids and add_assignee_ids are nil' do
+ process = Issuable::ProcessAssignees.new(assignee_ids: nil,
+ add_assignee_ids: nil,
+ remove_assignee_ids: %w(4 7 11),
+ existing_assignee_ids: %w(1 3 11),
+ extra_assignee_ids: %w(2 5 12))
+ result = process.execute
+
+ expect(result.sort).to eq(%w(1 2 3 5 12).sort)
+ end
+
+ it 'combines other ids when assignee_ids and remove_assignee_ids are nil' do
+ process = Issuable::ProcessAssignees.new(assignee_ids: nil,
+ add_assignee_ids: %w(2 4 6),
+ remove_assignee_ids: nil,
+ existing_assignee_ids: %w(1 3 11),
+ extra_assignee_ids: %w(2 5 12))
+ result = process.execute
+
+ expect(result.sort).to eq(%w(1 2 4 3 5 6 11 12).sort)
+ end
+
+ it 'combines ids when only add_assignee_ids and remove_assignee_ids are passed' do
+ process = Issuable::ProcessAssignees.new(assignee_ids: nil,
+ add_assignee_ids: %w(2 4 6),
+ remove_assignee_ids: %w(4 7 11))
+ result = process.execute
+
+ expect(result.sort).to eq(%w(2 6).sort)
+ end
+ end
+end
diff --git a/spec/services/issues/clone_service_spec.rb b/spec/services/issues/clone_service_spec.rb
index 512a60b1382..9ceb4ffeec5 100644
--- a/spec/services/issues/clone_service_spec.rb
+++ b/spec/services/issues/clone_service_spec.rb
@@ -280,6 +280,12 @@ RSpec.describe Issues::CloneService do
expect(new_issue.designs.first.notes.size).to eq(1)
end
end
+
+ context 'issue relative position' do
+ let(:subject) { clone_service.execute(old_issue, new_project) }
+
+ it_behaves_like 'copy or reset relative position'
+ end
end
describe 'clone permissions' do
diff --git a/spec/services/issues/create_service_spec.rb b/spec/services/issues/create_service_spec.rb
index e42e9722297..d548e5ee74a 100644
--- a/spec/services/issues/create_service_spec.rb
+++ b/spec/services/issues/create_service_spec.rb
@@ -286,6 +286,12 @@ RSpec.describe Issues::CreateService do
issue
end
+
+ it 'schedules a namespace onboarding create action worker' do
+ expect(Namespaces::OnboardingIssueCreatedWorker).to receive(:perform_async).with(project.namespace.id)
+
+ issue
+ end
end
context 'issue create service' do
diff --git a/spec/services/issues/move_service_spec.rb b/spec/services/issues/move_service_spec.rb
index 9b8d21bb8eb..eb124f07900 100644
--- a/spec/services/issues/move_service_spec.rb
+++ b/spec/services/issues/move_service_spec.rb
@@ -244,6 +244,12 @@ RSpec.describe Issues::MoveService do
expect(new_issue.designs.first.notes.size).to eq(1)
end
end
+
+ context 'issue relative position' do
+ let(:subject) { move_service.execute(old_issue, new_project) }
+
+ it_behaves_like 'copy or reset relative position'
+ end
end
describe 'move permissions' do
diff --git a/spec/services/labels/promote_service_spec.rb b/spec/services/labels/promote_service_spec.rb
index 15d53857f33..81c24b26c9f 100644
--- a/spec/services/labels/promote_service_spec.rb
+++ b/spec/services/labels/promote_service_spec.rb
@@ -4,9 +4,9 @@ require 'spec_helper'
RSpec.describe Labels::PromoteService do
describe '#execute' do
- let!(:user) { create(:user) }
+ let_it_be(:user) { create(:user) }
- context 'project without group' do
+ context 'without a group' do
let!(:project_1) { create(:project) }
let!(:project_label_1_1) { create(:label, project: project_1) }
@@ -18,40 +18,40 @@ RSpec.describe Labels::PromoteService do
end
end
- context 'project with group' do
- let!(:promoted_label_name) { "Promoted Label" }
- let!(:untouched_label_name) { "Untouched Label" }
- let!(:promoted_description) { "Promoted Description" }
- let!(:promoted_color) { "#0000FF" }
- let!(:label_2_1_priority) { 1 }
- let!(:label_3_1_priority) { 2 }
+ context 'with a group' do
+ let_it_be(:promoted_label_name) { "Promoted Label" }
+ let_it_be(:untouched_label_name) { "Untouched Label" }
+ let_it_be(:promoted_description) { "Promoted Description" }
+ let_it_be(:promoted_color) { "#0000FF" }
+ let_it_be(:label_2_1_priority) { 1 }
+ let_it_be(:label_3_1_priority) { 2 }
- let!(:group_1) { create(:group) }
- let!(:group_2) { create(:group) }
+ let_it_be(:group_1) { create(:group) }
+ let_it_be(:group_2) { create(:group) }
- let!(:project_1) { create(:project, namespace: group_1) }
- let!(:project_2) { create(:project, namespace: group_1) }
- let!(:project_3) { create(:project, namespace: group_1) }
- let!(:project_4) { create(:project, namespace: group_2) }
+ let_it_be(:project_1) { create(:project, :repository, namespace: group_1) }
+ let_it_be(:project_2) { create(:project, :repository, namespace: group_1) }
+ let_it_be(:project_3) { create(:project, :repository, namespace: group_1) }
+ let_it_be(:project_4) { create(:project, :repository, namespace: group_2) }
# Labels/issues can't be lazily created so we might as well eager initialize
# all other objects too since we use them inside
- let!(:project_label_1_1) { create(:label, project: project_1, name: promoted_label_name, color: promoted_color, description: promoted_description) }
- let!(:project_label_1_2) { create(:label, project: project_1, name: untouched_label_name) }
- let!(:project_label_2_1) { create(:label, project: project_2, priority: label_2_1_priority, name: promoted_label_name, color: "#FF0000") }
- let!(:project_label_3_1) { create(:label, project: project_3, priority: label_3_1_priority, name: promoted_label_name) }
- let!(:project_label_3_2) { create(:label, project: project_3, priority: 1, name: untouched_label_name) }
- let!(:project_label_4_1) { create(:label, project: project_4, name: promoted_label_name) }
+ let_it_be(:project_label_1_1) { create(:label, project: project_1, name: promoted_label_name, color: promoted_color, description: promoted_description) }
+ let_it_be(:project_label_1_2) { create(:label, project: project_1, name: untouched_label_name) }
+ let_it_be(:project_label_2_1) { create(:label, project: project_2, priority: label_2_1_priority, name: promoted_label_name, color: "#FF0000") }
+ let_it_be(:project_label_3_1) { create(:label, project: project_3, priority: label_3_1_priority, name: promoted_label_name) }
+ let_it_be(:project_label_3_2) { create(:label, project: project_3, priority: 1, name: untouched_label_name) }
+ let_it_be(:project_label_4_1) { create(:label, project: project_4, name: promoted_label_name) }
- let!(:issue_1_1) { create(:labeled_issue, project: project_1, labels: [project_label_1_1, project_label_1_2]) }
- let!(:issue_1_2) { create(:labeled_issue, project: project_1, labels: [project_label_1_2]) }
- let!(:issue_2_1) { create(:labeled_issue, project: project_2, labels: [project_label_2_1]) }
- let!(:issue_4_1) { create(:labeled_issue, project: project_4, labels: [project_label_4_1]) }
+ let_it_be(:issue_1_1) { create(:labeled_issue, project: project_1, labels: [project_label_1_1, project_label_1_2]) }
+ let_it_be(:issue_1_2) { create(:labeled_issue, project: project_1, labels: [project_label_1_2]) }
+ let_it_be(:issue_2_1) { create(:labeled_issue, project: project_2, labels: [project_label_2_1]) }
+ let_it_be(:issue_4_1) { create(:labeled_issue, project: project_4, labels: [project_label_4_1]) }
- let!(:merge_3_1) { create(:labeled_merge_request, source_project: project_3, target_project: project_3, labels: [project_label_3_1, project_label_3_2]) }
+ let_it_be(:merge_3_1) { create(:labeled_merge_request, source_project: project_3, target_project: project_3, labels: [project_label_3_1, project_label_3_2]) }
- let!(:issue_board_2_1) { create(:board, project: project_2) }
- let!(:issue_board_list_2_1) { create(:list, board: issue_board_2_1, label: project_label_2_1) }
+ let_it_be(:issue_board_2_1) { create(:board, project: project_2) }
+ let_it_be(:issue_board_list_2_1) { create(:list, board: issue_board_2_1, label: project_label_2_1) }
let(:new_label) { group_1.labels.find_by(title: promoted_label_name) }
@@ -82,8 +82,8 @@ RSpec.describe Labels::PromoteService do
expect { service.execute(project_label_1_1) }.to change { Subscription.count }.from(4).to(3)
- expect(new_label.subscribed?(user)).to be_truthy
- expect(new_label.subscribed?(user2)).to be_truthy
+ expect(new_label).to be_subscribed(user)
+ expect(new_label).to be_subscribed(user2)
end
it 'recreates priorities' do
@@ -165,12 +165,12 @@ RSpec.describe Labels::PromoteService do
service.execute(project_label_1_1)
Label.reflect_on_all_associations.each do |association|
- expect(project_label_1_1.send(association.name).any?).to be_falsey
+ expect(project_label_1_1.send(association.name).reset).not_to be_any
end
end
end
- context 'if there is an existing identical group label' do
+ context 'when there is an existing identical group label' do
let!(:existing_group_label) { create(:group_label, group: group_1, title: project_label_1_1.title ) }
it 'uses the existing group label' do
@@ -187,7 +187,7 @@ RSpec.describe Labels::PromoteService do
it_behaves_like 'promoting a project label to a group label'
end
- context 'if there is no existing identical group label' do
+ context 'when there is no existing identical group label' do
let(:existing_group_label) { nil }
it 'recreates the label as a group label' do
diff --git a/spec/services/members/invite_service_spec.rb b/spec/services/members/invite_service_spec.rb
index 08cdf0d3ae1..cced93896a5 100644
--- a/spec/services/members/invite_service_spec.rb
+++ b/spec/services/members/invite_service_spec.rb
@@ -2,76 +2,155 @@
require 'spec_helper'
-RSpec.describe Members::InviteService do
- let(:project) { create(:project) }
- let(:user) { create(:user) }
- let(:project_user) { create(:user) }
-
- before do
- project.add_maintainer(user)
+RSpec.describe Members::InviteService, :aggregate_failures do
+ let_it_be(:project) { create(:project) }
+ let_it_be(:user) { project.owner }
+ let_it_be(:project_user) { create(:user) }
+ let(:params) { {} }
+ let(:base_params) { { access_level: Gitlab::Access::GUEST } }
+
+ subject(:result) { described_class.new(user, base_params.merge(params)).execute(project) }
+
+ context 'when email is previously unused by current members' do
+ let(:params) { { email: 'email@example.org' } }
+
+ it 'successfully creates a member' do
+ expect { result }.to change(ProjectMember, :count).by(1)
+ expect(result[:status]).to eq(:success)
+ end
end
- it 'adds an existing user to members' do
- params = { email: project_user.email.to_s, access_level: Gitlab::Access::GUEST }
- result = described_class.new(user, params).execute(project)
+ context 'when emails are passed as an array' do
+ let(:params) { { email: %w[email@example.org email2@example.org] } }
- expect(result[:status]).to eq(:success)
- expect(project.users).to include project_user
+ it 'successfully creates members' do
+ expect { result }.to change(ProjectMember, :count).by(2)
+ expect(result[:status]).to eq(:success)
+ end
end
- it 'creates a new user for an unknown email address' do
- params = { email: 'email@example.org', access_level: Gitlab::Access::GUEST }
- result = described_class.new(user, params).execute(project)
+ context 'when emails are passed as an empty string' do
+ let(:params) { { email: '' } }
- expect(result[:status]).to eq(:success)
+ it 'returns an error' do
+ expect(result[:status]).to eq(:error)
+ expect(result[:message]).to eq('Email cannot be blank')
+ end
end
- it 'limits the number of emails to 100' do
- emails = Array.new(101).map { |n| "email#{n}@example.com" }
- params = { email: emails, access_level: Gitlab::Access::GUEST }
+ context 'when email param is not included' do
+ it 'returns an error' do
+ expect(result[:status]).to eq(:error)
+ expect(result[:message]).to eq('Email cannot be blank')
+ end
+ end
- result = described_class.new(user, params).execute(project)
+ context 'when email is not a valid email' do
+ let(:params) { { email: '_bogus_' } }
- expect(result[:status]).to eq(:error)
- expect(result[:message]).to eq('Too many users specified (limit is 100)')
+ it 'returns an error' do
+ expect { result }.not_to change(ProjectMember, :count)
+ expect(result[:status]).to eq(:error)
+ expect(result[:message]['_bogus_']).to eq("Invite email is invalid")
+ end
end
- it 'does not invite an invalid email' do
- params = { email: project_user.id.to_s, access_level: Gitlab::Access::GUEST }
- result = described_class.new(user, params).execute(project)
+ context 'when duplicate email addresses are passed' do
+ let(:params) { { email: 'email@example.org,email@example.org' } }
+
+ it 'only creates one member per unique address' do
+ expect { result }.to change(ProjectMember, :count).by(1)
+ expect(result[:status]).to eq(:success)
+ end
+ end
- expect(result[:status]).to eq(:error)
- expect(result[:message][project_user.id.to_s]).to eq("Invite email is invalid")
- expect(project.users).not_to include project_user
+ context 'when observing email limits' 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 } }
+
+ it 'limits the number of emails to 100' do
+ expect { result }.not_to change(ProjectMember, :count)
+ expect(result[:status]).to eq(:error)
+ 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 { result }.not_to change(ProjectMember, :count)
+ expect(result[:status]).to eq(:error)
+ 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 { result }.to change(ProjectMember, :count).by(101)
+ expect(result[:status]).to eq(:success)
+ end
+ end
end
- it 'does not invite to an invalid access level' do
- params = { email: project_user.email, access_level: -1 }
- result = described_class.new(user, params).execute(project)
+ context 'when email belongs to an existing user' do
+ let(:params) { { email: project_user.email } }
- expect(result[:status]).to eq(:error)
- expect(result[:message][project_user.email]).to eq("Access level is not included in the list")
+ it 'adds an existing user to members' do
+ expect { result }.to change(ProjectMember, :count).by(1)
+ expect(result[:status]).to eq(:success)
+ expect(project.users).to include project_user
+ end
end
- it 'does not add a member with an existing invite' do
- invited_member = create(:project_member, :invited, project: project)
+ context 'when access level is not valid' do
+ let(:params) { { email: project_user.email, access_level: -1 } }
- params = { email: invited_member.invite_email,
- access_level: Gitlab::Access::GUEST }
- result = described_class.new(user, params).execute(project)
+ it 'returns an error' do
+ expect { result }.not_to change(ProjectMember, :count)
+ expect(result[:status]).to eq(:error)
+ expect(result[:message][project_user.email]).to eq("Access level is not included in the list")
+ 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}" } }
- expect(result[:status]).to eq(:error)
- expect(result[:message][invited_member.invite_email]).to eq("Member already invited to #{project.name}")
+ it 'adds new email and returns an error for the already invited email' do
+ expect { result }.to change(ProjectMember, :count).by(1)
+ expect(result[:status]).to eq(:error)
+ expect(result[:message][invited_member.invite_email]).to eq("Member already invited to #{project.name}")
+ expect(project.users).to include project_user
+ end
end
- it 'does not add a member with an access_request' do
- requested_member = create(:project_member, :access_request, project: project)
+ 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}" } }
+
+ it 'adds new email and returns an error for the already invited email' do
+ expect { result }.to change(ProjectMember, :count).by(1)
+ expect(result[:status]).to eq(:error)
+ expect(result[:message][requested_member.user.email])
+ .to eq("Member cannot be invited because they already requested to join #{project.name}")
+ expect(project.users).to include project_user
+ end
+ end
- params = { email: requested_member.user.email,
- access_level: Gitlab::Access::GUEST }
- result = described_class.new(user, params).execute(project)
+ 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}" } }
- expect(result[:status]).to eq(:error)
- expect(result[:message][requested_member.user.email]).to eq("Member cannot be invited because they already requested to join #{project.name}")
+ it 'adds new email and returns an error for the already invited email' do
+ expect { result }.to change(ProjectMember, :count).by(1)
+ expect(result[:status]).to eq(:error)
+ expect(result[:message][existing_member.user.email]).to eq("Already a member of #{project.name}")
+ expect(project.users).to include project_user
+ end
end
end
diff --git a/spec/services/merge_requests/after_create_service_spec.rb b/spec/services/merge_requests/after_create_service_spec.rb
index f21feb70bc5..dce351d8a31 100644
--- a/spec/services/merge_requests/after_create_service_spec.rb
+++ b/spec/services/merge_requests/after_create_service_spec.rb
@@ -32,6 +32,10 @@ RSpec.describe MergeRequests::AfterCreateService do
.to receive(:track_create_mr_action)
.with(user: merge_request.author)
+ expect(Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter)
+ .to receive(:track_mr_including_ci_config)
+ .with(user: merge_request.author, merge_request: merge_request)
+
execute_service
end
@@ -67,5 +71,27 @@ RSpec.describe MergeRequests::AfterCreateService do
it_behaves_like 'records an onboarding progress action', :merge_request_created do
let(:namespace) { merge_request.target_project.namespace }
end
+
+ context 'when merge request is in unchecked state' do
+ before do
+ merge_request.mark_as_unchecked!
+ execute_service
+ end
+
+ it 'does not change its state' do
+ expect(merge_request.reload).to be_unchecked
+ end
+ end
+
+ context 'when merge request is in preparing state' do
+ before do
+ merge_request.mark_as_preparing!
+ execute_service
+ end
+
+ it 'marks the merge request as unchecked' do
+ expect(merge_request.reload).to be_unchecked
+ end
+ end
end
end
diff --git a/spec/services/merge_requests/build_service_spec.rb b/spec/services/merge_requests/build_service_spec.rb
index 22b3456708f..8adf6d69f73 100644
--- a/spec/services/merge_requests/build_service_spec.rb
+++ b/spec/services/merge_requests/build_service_spec.rb
@@ -19,8 +19,21 @@ RSpec.describe MergeRequests::BuildService do
let(:label_ids) { [] }
let(:merge_request) { service.execute }
let(:compare) { double(:compare, commits: commits) }
- let(:commit_1) { double(:commit_1, sha: 'f00ba7', safe_message: "Initial commit\n\nCreate the app") }
- let(:commit_2) { double(:commit_2, sha: 'f00ba7', safe_message: 'This is a bad commit message!') }
+ let(:commit_1) do
+ double(:commit_1, sha: 'f00ba6', safe_message: 'Initial commit',
+ gitaly_commit?: false, id: 'f00ba6', parent_ids: ['f00ba5'])
+ end
+
+ let(:commit_2) do
+ double(:commit_2, sha: 'f00ba7', safe_message: "Closes #1234 Second commit\n\nCreate the app",
+ gitaly_commit?: false, id: 'f00ba7', parent_ids: ['f00ba6'])
+ end
+
+ let(:commit_3) do
+ double(:commit_3, sha: 'f00ba8', safe_message: 'This is a bad commit message!',
+ gitaly_commit?: false, id: 'f00ba8', parent_ids: ['f00ba7'])
+ end
+
let(:commits) { nil }
let(:params) do
@@ -47,6 +60,7 @@ RSpec.describe MergeRequests::BuildService do
allow(CompareService).to receive_message_chain(:new, :execute).and_return(compare)
allow(project).to receive(:commit).and_return(commit_1)
allow(project).to receive(:commit).and_return(commit_2)
+ allow(project).to receive(:commit).and_return(commit_3)
end
shared_examples 'allows the merge request to be created' do
@@ -137,7 +151,7 @@ RSpec.describe MergeRequests::BuildService do
context 'when target branch is missing' do
let(:target_branch) { nil }
- let(:commits) { Commit.decorate([commit_1], project) }
+ let(:commits) { Commit.decorate([commit_2], project) }
before do
stub_compare
@@ -199,8 +213,8 @@ RSpec.describe MergeRequests::BuildService do
end
context 'one commit in the diff' do
- let(:commits) { Commit.decorate([commit_1], project) }
- let(:commit_description) { commit_1.safe_message.split(/\n+/, 2).last }
+ let(:commits) { Commit.decorate([commit_2], project) }
+ let(:commit_description) { commit_2.safe_message.split(/\n+/, 2).last }
before do
stub_compare
@@ -209,7 +223,7 @@ RSpec.describe MergeRequests::BuildService do
it_behaves_like 'allows the merge request to be created'
it 'uses the title of the commit as the title of the merge request' do
- expect(merge_request.title).to eq(commit_1.safe_message.split("\n").first)
+ expect(merge_request.title).to eq(commit_2.safe_message.split("\n").first)
end
it 'uses the description of the commit as the description of the merge request' do
@@ -225,10 +239,10 @@ RSpec.describe MergeRequests::BuildService do
end
context 'commit has no description' do
- let(:commits) { Commit.decorate([commit_2], project) }
+ let(:commits) { Commit.decorate([commit_3], project) }
it 'uses the title of the commit as the title of the merge request' do
- expect(merge_request.title).to eq(commit_2.safe_message)
+ expect(merge_request.title).to eq(commit_3.safe_message)
end
it 'sets the description to nil' do
@@ -257,7 +271,7 @@ RSpec.describe MergeRequests::BuildService do
end
it 'uses the title of the commit as the title of the merge request' do
- expect(merge_request.title).to eq('Initial commit')
+ expect(merge_request.title).to eq('Closes #1234 Second commit')
end
it 'appends the closing description' do
@@ -310,8 +324,8 @@ RSpec.describe MergeRequests::BuildService do
end
end
- context 'more than one commit in the diff' do
- let(:commits) { Commit.decorate([commit_1, commit_2], project) }
+ context 'no multi-line commit messages in the diff' do
+ let(:commits) { Commit.decorate([commit_1, commit_3], project) }
before do
stub_compare
@@ -365,6 +379,55 @@ RSpec.describe MergeRequests::BuildService do
end
end
end
+ end
+
+ context 'a multi-line commit message in the diff' do
+ let(:commits) { Commit.decorate([commit_1, commit_2, commit_3], project) }
+
+ before do
+ stub_compare
+ end
+
+ it_behaves_like 'allows the merge request to be created'
+
+ it 'uses the first line of the first multi-line commit message as the title' do
+ expect(merge_request.title).to eq('Closes #1234 Second commit')
+ end
+
+ it 'adds the remaining lines of the first multi-line commit message as the description' do
+ expect(merge_request.description).to eq('Create the app')
+ end
+
+ context 'when the source branch matches an issue' do
+ where(:issue_tracker, :source_branch, :title, :closing_message) do
+ :jira | 'FOO-123-fix-issue' | 'Resolve FOO-123 "Fix issue"' | 'Closes FOO-123'
+ :jira | 'fix-issue' | 'Fix issue' | nil
+ :custom_issue_tracker | '123-fix-issue' | 'Resolve #123 "Fix issue"' | 'Closes #123'
+ :custom_issue_tracker | 'fix-issue' | 'Fix issue' | nil
+ :internal | '123-fix-issue' | 'Resolve "A bug"' | 'Closes #123'
+ :internal | 'fix-issue' | 'Fix issue' | nil
+ :internal | '124-fix-issue' | '124 fix issue' | nil
+ end
+
+ with_them do
+ before do
+ if issue_tracker == :internal
+ issue.update!(iid: 123)
+ else
+ create(:"#{issue_tracker}_service", project: project)
+ project.reload
+ end
+ end
+
+ it 'sets the correct title' do
+ expect(merge_request.title).to eq('Closes #1234 Second commit')
+ end
+
+ it 'sets the closing description' do
+ expect(merge_request.description).to eq("Create the app#{closing_message ? "\n\n" + closing_message : ''}")
+ end
+ end
+ end
context 'when the issue is not accessible to user' do
let(:source_branch) { "#{issue.iid}-fix-issue" }
@@ -373,12 +436,12 @@ RSpec.describe MergeRequests::BuildService do
project.team.truncate
end
- it 'uses branch title as the merge request title' do
- expect(merge_request.title).to eq("#{issue.iid} fix issue")
+ it 'uses the first line of the first multi-line commit message as the title' do
+ expect(merge_request.title).to eq('Closes #1234 Second commit')
end
- it 'does not set a description' do
- expect(merge_request.description).to be_nil
+ it 'adds the remaining lines of the first multi-line commit message as the description' do
+ expect(merge_request.description).to eq('Create the app')
end
end
@@ -386,12 +449,12 @@ RSpec.describe MergeRequests::BuildService do
let(:source_branch) { "#{issue.iid}-fix-issue" }
let(:issue_confidential) { true }
- it 'uses the title of the branch as the merge request title' do
- expect(merge_request.title).to eq("#{issue.iid} fix issue")
+ it 'uses the first line of the first multi-line commit message as the title' do
+ expect(merge_request.title).to eq('Closes #1234 Second commit')
end
- it 'does not set a description' do
- expect(merge_request.description).to be_nil
+ it 'adds the remaining lines of the first multi-line commit message as the description' do
+ expect(merge_request.description).to eq('Create the app')
end
end
end
@@ -399,7 +462,7 @@ RSpec.describe MergeRequests::BuildService do
context 'source branch does not exist' do
before do
allow(project).to receive(:commit).with(source_branch).and_return(nil)
- allow(project).to receive(:commit).with(target_branch).and_return(commit_1)
+ allow(project).to receive(:commit).with(target_branch).and_return(commit_2)
end
it_behaves_like 'forbids the merge request from being created' do
@@ -409,7 +472,7 @@ RSpec.describe MergeRequests::BuildService do
context 'target branch does not exist' do
before do
- allow(project).to receive(:commit).with(source_branch).and_return(commit_1)
+ allow(project).to receive(:commit).with(source_branch).and_return(commit_2)
allow(project).to receive(:commit).with(target_branch).and_return(nil)
end
@@ -433,7 +496,7 @@ RSpec.describe MergeRequests::BuildService do
context 'upstream project has disabled merge requests' do
let(:upstream_project) { create(:project, :merge_requests_disabled) }
let(:project) { create(:project, forked_from_project: upstream_project) }
- let(:commits) { Commit.decorate([commit_1], project) }
+ let(:commits) { Commit.decorate([commit_2], project) }
it 'sets target project correctly' do
expect(merge_request.target_project).to eq(project)
@@ -441,8 +504,8 @@ RSpec.describe MergeRequests::BuildService do
end
context 'target_project is set and accessible by current_user' do
- let(:target_project) { create(:project, :public, :repository)}
- let(:commits) { Commit.decorate([commit_1], project) }
+ let(:target_project) { create(:project, :public, :repository) }
+ let(:commits) { Commit.decorate([commit_2], project) }
it 'sets target project correctly' do
expect(merge_request.target_project).to eq(target_project)
@@ -450,8 +513,8 @@ RSpec.describe MergeRequests::BuildService do
end
context 'target_project is set but not accessible by current_user' do
- let(:target_project) { create(:project, :private, :repository)}
- let(:commits) { Commit.decorate([commit_1], project) }
+ let(:target_project) { create(:project, :private, :repository) }
+ let(:commits) { Commit.decorate([commit_2], project) }
it 'sets target project correctly' do
expect(merge_request.target_project).to eq(project)
@@ -469,8 +532,8 @@ RSpec.describe MergeRequests::BuildService do
end
context 'source_project is set and accessible by current_user' do
- let(:source_project) { create(:project, :public, :repository)}
- let(:commits) { Commit.decorate([commit_1], project) }
+ let(:source_project) { create(:project, :public, :repository) }
+ let(:commits) { Commit.decorate([commit_2], project) }
before do
# To create merge requests _from_ a project the user needs at least
@@ -484,8 +547,8 @@ RSpec.describe MergeRequests::BuildService do
end
context 'source_project is set but not accessible by current_user' do
- let(:source_project) { create(:project, :private, :repository)}
- let(:commits) { Commit.decorate([commit_1], project) }
+ let(:source_project) { create(:project, :private, :repository) }
+ let(:commits) { Commit.decorate([commit_2], project) }
it 'sets source project correctly' do
expect(merge_request.source_project).to eq(project)
diff --git a/spec/services/merge_requests/merge_service_spec.rb b/spec/services/merge_requests/merge_service_spec.rb
index 611f12c8146..87e5750ce6e 100644
--- a/spec/services/merge_requests/merge_service_spec.rb
+++ b/spec/services/merge_requests/merge_service_spec.rb
@@ -258,9 +258,8 @@ RSpec.describe MergeRequests::MergeService do
end
it 'removes the source branch using the author user' do
- expect(::Branches::DeleteService).to receive(:new)
- .with(merge_request.source_project, merge_request.author)
- .and_call_original
+ expect(::MergeRequests::DeleteSourceBranchWorker).to receive(:perform_async).with(merge_request.id, merge_request.source_branch_sha, merge_request.author.id)
+
service.execute(merge_request)
end
@@ -268,7 +267,8 @@ RSpec.describe MergeRequests::MergeService do
let(:service) { described_class.new(project, user, merge_params.merge('should_remove_source_branch' => false)) }
it 'does not delete the source branch' do
- expect(::Branches::DeleteService).not_to receive(:new)
+ expect(::MergeRequests::DeleteSourceBranchWorker).not_to receive(:perform_async)
+
service.execute(merge_request)
end
end
@@ -280,9 +280,8 @@ RSpec.describe MergeRequests::MergeService do
end
it 'removes the source branch using the current user' do
- expect(::Branches::DeleteService).to receive(:new)
- .with(merge_request.source_project, user)
- .and_call_original
+ expect(::MergeRequests::DeleteSourceBranchWorker).to receive(:perform_async).with(merge_request.id, merge_request.source_branch_sha, user.id)
+
service.execute(merge_request)
end
end
diff --git a/spec/services/merge_requests/post_merge_service_spec.rb b/spec/services/merge_requests/post_merge_service_spec.rb
index 71329905558..247b053e729 100644
--- a/spec/services/merge_requests/post_merge_service_spec.rb
+++ b/spec/services/merge_requests/post_merge_service_spec.rb
@@ -130,139 +130,5 @@ RSpec.describe MergeRequests::PostMergeService do
expect(deploy_job.reload.canceled?).to be false
end
end
-
- context 'for a merge request chain' do
- before do
- ::MergeRequests::UpdateService
- .new(project, user, force_remove_source_branch: '1')
- .execute(merge_request)
- end
-
- context 'when there is another MR' do
- let!(:another_merge_request) do
- create(:merge_request,
- source_project: source_project,
- source_branch: 'my-awesome-feature',
- target_project: merge_request.source_project,
- target_branch: merge_request.source_branch
- )
- end
-
- shared_examples 'does not retarget merge request' do
- it 'another merge request is unchanged' do
- expect { subject }.not_to change { another_merge_request.reload.target_branch }
- .from(merge_request.source_branch)
- end
- end
-
- shared_examples 'retargets merge request' do
- it 'another merge request is retargeted' do
- expect(SystemNoteService)
- .to receive(:change_branch).once
- .with(another_merge_request, another_merge_request.project, user,
- 'target', 'delete',
- merge_request.source_branch, merge_request.target_branch)
-
- expect { subject }.to change { another_merge_request.reload.target_branch }
- .from(merge_request.source_branch)
- .to(merge_request.target_branch)
- end
-
- context 'when FF retarget_merge_requests is disabled' do
- before do
- stub_feature_flags(retarget_merge_requests: false)
- end
-
- include_examples 'does not retarget merge request'
- end
-
- context 'when source branch is to be kept' do
- before do
- ::MergeRequests::UpdateService
- .new(project, user, force_remove_source_branch: false)
- .execute(merge_request)
- end
-
- include_examples 'does not retarget merge request'
- end
- end
-
- context 'in the same project' do
- let(:source_project) { project }
-
- it_behaves_like 'retargets merge request'
-
- context 'and is closed' do
- before do
- another_merge_request.close
- end
-
- it_behaves_like 'does not retarget merge request'
- end
-
- context 'and is merged' do
- before do
- another_merge_request.mark_as_merged
- end
-
- it_behaves_like 'does not retarget merge request'
- end
- end
-
- context 'in forked project' do
- let!(:source_project) { fork_project(project) }
-
- context 'when user has access to source project' do
- before do
- source_project.add_developer(user)
- end
-
- it_behaves_like 'retargets merge request'
- end
-
- context 'when user does not have access to source project' do
- it_behaves_like 'does not retarget merge request'
- end
- end
-
- context 'and current and another MR is from a fork' do
- let(:project) { create(:project) }
- let(:source_project) { fork_project(project) }
-
- let(:merge_request) do
- create(:merge_request,
- source_project: source_project,
- target_project: project
- )
- end
-
- before do
- source_project.add_developer(user)
- end
-
- it_behaves_like 'does not retarget merge request'
- end
- end
-
- context 'when many merge requests are to be retargeted' do
- let!(:many_merge_requests) do
- create_list(:merge_request, 10, :unique_branches,
- source_project: merge_request.source_project,
- target_project: merge_request.source_project,
- target_branch: merge_request.source_branch
- )
- end
-
- it 'retargets only 4 of them' do
- subject
-
- expect(many_merge_requests.each(&:reload).pluck(:target_branch).tally)
- .to eq(
- merge_request.source_branch => 6,
- merge_request.target_branch => 4
- )
- end
- end
- end
end
end
diff --git a/spec/services/merge_requests/refresh_service_spec.rb b/spec/services/merge_requests/refresh_service_spec.rb
index 747ecbf4fa4..2abe7a23bfe 100644
--- a/spec/services/merge_requests/refresh_service_spec.rb
+++ b/spec/services/merge_requests/refresh_service_spec.rb
@@ -72,6 +72,21 @@ RSpec.describe MergeRequests::RefreshService do
allow(NotificationService).to receive(:new) { notification_service }
end
+ context 'query count' do
+ it 'does not execute a lot of queries' do
+ # Hardcoded the query limit since the queries can also be reduced even
+ # if there are the same number of merge requests (e.g. by preloading
+ # associations). This should also fail in case additional queries are
+ # added elsewhere that affected this service.
+ #
+ # The limit is based on the number of queries executed at the current
+ # state of the service. As we reduce the number of queries executed in
+ # this service, the limit should be reduced as well.
+ expect { refresh_service.execute(@oldrev, @newrev, 'refs/heads/master') }
+ .not_to exceed_query_limit(260)
+ end
+ end
+
it 'executes hooks with update action' do
refresh_service.execute(@oldrev, @newrev, 'refs/heads/master')
reload_mrs
@@ -155,6 +170,18 @@ RSpec.describe MergeRequests::RefreshService do
.not_to change { @merge_request.reload.merge_request_diff }
end
end
+
+ it 'calls the merge request activity counter' do
+ expect(Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter)
+ .to receive(:track_mr_including_ci_config)
+ .with(user: @merge_request.author, merge_request: @merge_request)
+
+ expect(Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter)
+ .to receive(:track_mr_including_ci_config)
+ .with(user: @another_merge_request.author, merge_request: @another_merge_request)
+
+ refresh_service.execute(@oldrev, @newrev, 'refs/heads/master')
+ end
end
context 'when pipeline exists for the source branch' do
diff --git a/spec/services/merge_requests/retarget_chain_service_spec.rb b/spec/services/merge_requests/retarget_chain_service_spec.rb
new file mode 100644
index 00000000000..3937fbe58c3
--- /dev/null
+++ b/spec/services/merge_requests/retarget_chain_service_spec.rb
@@ -0,0 +1,154 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe MergeRequests::RetargetChainService do
+ include ProjectForksHelper
+
+ let_it_be(:user) { create(:user) }
+ let_it_be(:merge_request, reload: true) { create(:merge_request, assignees: [user]) }
+ let_it_be(:project) { merge_request.project }
+
+ subject { described_class.new(project, user).execute(merge_request) }
+
+ before do
+ project.add_maintainer(user)
+ end
+
+ describe '#execute' do
+ context 'when there is another MR' do
+ let!(:another_merge_request) do
+ create(:merge_request,
+ source_project: source_project,
+ source_branch: 'my-awesome-feature',
+ target_project: merge_request.source_project,
+ target_branch: merge_request.source_branch
+ )
+ end
+
+ shared_examples 'does not retarget merge request' do
+ it 'another merge request is unchanged' do
+ expect { subject }.not_to change { another_merge_request.reload.target_branch }
+ .from(merge_request.source_branch)
+ end
+ end
+
+ shared_examples 'retargets merge request' do
+ it 'another merge request is retargeted' do
+ expect(SystemNoteService)
+ .to receive(:change_branch).once
+ .with(another_merge_request, another_merge_request.project, user,
+ 'target', 'delete',
+ merge_request.source_branch, merge_request.target_branch)
+
+ expect { subject }.to change { another_merge_request.reload.target_branch }
+ .from(merge_request.source_branch)
+ .to(merge_request.target_branch)
+ end
+
+ context 'when FF retarget_merge_requests is disabled' do
+ before do
+ stub_feature_flags(retarget_merge_requests: false)
+ end
+
+ include_examples 'does not retarget merge request'
+ end
+ end
+
+ context 'in the same project' do
+ let(:source_project) { project }
+
+ context 'and current is merged' do
+ before do
+ merge_request.mark_as_merged
+ end
+
+ it_behaves_like 'retargets merge request'
+ end
+
+ context 'and current is closed' do
+ before do
+ merge_request.close
+ end
+
+ it_behaves_like 'does not retarget merge request'
+ end
+
+ context 'and another is closed' do
+ before do
+ another_merge_request.close
+ end
+
+ it_behaves_like 'does not retarget merge request'
+ end
+
+ context 'and another is merged' do
+ before do
+ another_merge_request.mark_as_merged
+ end
+
+ it_behaves_like 'does not retarget merge request'
+ end
+ end
+
+ context 'in forked project' do
+ let!(:source_project) { fork_project(project) }
+
+ context 'when user has access to source project' do
+ before do
+ source_project.add_developer(user)
+ merge_request.mark_as_merged
+ end
+
+ it_behaves_like 'retargets merge request'
+ end
+
+ context 'when user does not have access to source project' do
+ it_behaves_like 'does not retarget merge request'
+ end
+ end
+
+ context 'and current and another MR is from a fork' do
+ let(:project) { create(:project) }
+ let(:source_project) { fork_project(project) }
+
+ let(:merge_request) do
+ create(:merge_request,
+ source_project: source_project,
+ target_project: project
+ )
+ end
+
+ before do
+ source_project.add_developer(user)
+ end
+
+ it_behaves_like 'does not retarget merge request'
+ end
+ end
+
+ context 'when many merge requests are to be retargeted' do
+ let!(:many_merge_requests) do
+ create_list(:merge_request, 10, :unique_branches,
+ source_project: merge_request.source_project,
+ target_project: merge_request.source_project,
+ target_branch: merge_request.source_branch
+ )
+ end
+
+ before do
+ merge_request.mark_as_merged
+ end
+
+ it 'retargets only 4 of them' do
+ subject
+
+ expect(many_merge_requests.each(&:reload).pluck(:target_branch).tally)
+ .to eq(
+ merge_request.source_branch => 6,
+ merge_request.target_branch => 4
+ )
+ 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 edb95840604..7a7f684c6d0 100644
--- a/spec/services/merge_requests/update_service_spec.rb
+++ b/spec/services/merge_requests/update_service_spec.rb
@@ -48,6 +48,8 @@ RSpec.describe MergeRequests::UpdateService, :mailer do
end
context 'valid params' do
+ let(:locked) { true }
+
let(:opts) do
{
title: 'New title',
@@ -58,7 +60,7 @@ RSpec.describe MergeRequests::UpdateService, :mailer do
label_ids: [label.id],
target_branch: 'target',
force_remove_source_branch: '1',
- discussion_locked: true
+ discussion_locked: locked
}
end
@@ -117,6 +119,139 @@ RSpec.describe MergeRequests::UpdateService, :mailer do
MergeRequests::UpdateService.new(project, user, opts).execute(draft_merge_request)
end
+
+ context 'when MR is locked' do
+ context 'when locked again' do
+ it 'does not track discussion locking' do
+ expect(Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter)
+ .not_to receive(:track_discussion_locked_action)
+
+ opts[:discussion_locked] = true
+
+ MergeRequests::UpdateService.new(project, user, opts).execute(merge_request)
+ end
+ end
+
+ context 'when unlocked' do
+ it 'tracks dicussion unlocking' do
+ expect(Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter)
+ .to receive(:track_discussion_unlocked_action).once.with(user: user)
+
+ opts[:discussion_locked] = false
+
+ MergeRequests::UpdateService.new(project, user, opts).execute(merge_request)
+ end
+ end
+ end
+
+ context 'when MR is unlocked' do
+ let(:locked) { false }
+
+ context 'when unlocked again' do
+ it 'does not track discussion unlocking' do
+ expect(Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter)
+ .not_to receive(:track_discussion_unlocked_action)
+
+ opts[:discussion_locked] = false
+
+ MergeRequests::UpdateService.new(project, user, opts).execute(merge_request)
+ end
+ end
+
+ context 'when locked' do
+ it 'tracks dicussion locking' do
+ expect(Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter)
+ .to receive(:track_discussion_locked_action).once.with(user: user)
+
+ opts[:discussion_locked] = true
+
+ MergeRequests::UpdateService.new(project, user, opts).execute(merge_request)
+ end
+ end
+ end
+
+ it 'tracks time estimate and spend time changes' do
+ expect(Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter)
+ .to receive(:track_time_estimate_changed_action).once.with(user: user)
+
+ expect(Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter)
+ .to receive(:track_time_spent_changed_action).once.with(user: user)
+
+ opts[:time_estimate] = 86400
+ opts[:spend_time] = {
+ duration: 3600,
+ user_id: user.id,
+ spent_at: Date.parse('2021-02-24')
+ }
+
+ MergeRequests::UpdateService.new(project, user, opts).execute(merge_request)
+ end
+
+ it 'tracks milestone change' do
+ expect(Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter)
+ .to receive(:track_milestone_changed_action).once.with(user: user)
+
+ opts[:milestone] = milestone
+
+ MergeRequests::UpdateService.new(project, user, opts).execute(merge_request)
+ end
+
+ it 'track labels change' do
+ expect(Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter)
+ .to receive(:track_labels_changed_action).once.with(user: user)
+
+ opts[:label_ids] = [label2.id]
+
+ MergeRequests::UpdateService.new(project, user, opts).execute(merge_request)
+ end
+
+ context 'assignees' do
+ context 'when assignees changed' do
+ it 'tracks assignees changed event' do
+ expect(Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter)
+ .to receive(:track_assignees_changed_action).once.with(user: user)
+
+ opts[:assignees] = [user2]
+
+ MergeRequests::UpdateService.new(project, user, opts).execute(merge_request)
+ end
+ end
+
+ context 'when assignees did not change' do
+ it 'does not track assignees changed event' do
+ expect(Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter)
+ .not_to receive(:track_assignees_changed_action)
+
+ opts[:assignees] = merge_request.assignees
+
+ MergeRequests::UpdateService.new(project, user, opts).execute(merge_request)
+ end
+ end
+ end
+
+ context 'reviewers' do
+ context 'when reviewers changed' do
+ it 'tracks reviewers changed event' do
+ expect(Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter)
+ .to receive(:track_reviewers_changed_action).once.with(user: user)
+
+ opts[:reviewers] = [user2]
+
+ MergeRequests::UpdateService.new(project, user, opts).execute(merge_request)
+ end
+ end
+
+ context 'when reviewers did not change' do
+ it 'does not track reviewers changed event' do
+ expect(Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter)
+ .not_to receive(:track_reviewers_changed_action)
+
+ opts[:reviewers] = merge_request.reviewers
+
+ MergeRequests::UpdateService.new(project, user, opts).execute(merge_request)
+ end
+ end
+ end
end
context 'updating milestone' do
@@ -656,6 +791,48 @@ RSpec.describe MergeRequests::UpdateService, :mailer do
end
end
+ context 'when the draft status is changed' do
+ let!(:non_subscriber) { create(:user) }
+ let!(:subscriber) do
+ create(:user) { |u| merge_request.toggle_subscription(u, project) }
+ end
+
+ before do
+ project.add_developer(non_subscriber)
+ project.add_developer(subscriber)
+ end
+
+ context 'removing draft status' do
+ before do
+ merge_request.update_attribute(:title, 'Draft: New Title')
+ end
+
+ it 'sends notifications for subscribers', :sidekiq_might_not_need_inline do
+ opts = { title: 'New title' }
+
+ perform_enqueued_jobs do
+ @merge_request = described_class.new(project, user, opts).execute(merge_request)
+ end
+
+ should_email(subscriber)
+ should_not_email(non_subscriber)
+ end
+ end
+
+ context 'adding draft status' do
+ it 'does not send notifications', :sidekiq_might_not_need_inline do
+ opts = { title: 'Draft: New title' }
+
+ perform_enqueued_jobs do
+ @merge_request = described_class.new(project, user, opts).execute(merge_request)
+ end
+
+ should_not_email(subscriber)
+ should_not_email(non_subscriber)
+ end
+ end
+ end
+
context 'when the merge request is relabeled' do
let!(:non_subscriber) { create(:user) }
let!(:subscriber) { create(:user) { |u| label.toggle_subscription(u, project) } }
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 7346a5b95ae..2581cab5d1a 100644
--- a/spec/services/namespaces/in_product_marketing_emails_service_spec.rb
+++ b/spec/services/namespaces/in_product_marketing_emails_service_spec.rb
@@ -3,12 +3,15 @@
require 'spec_helper'
RSpec.describe Namespaces::InProductMarketingEmailsService, '#execute' do
- subject(:execute_service) { described_class.new(track, interval).execute }
+ subject(:execute_service) do
+ travel_to(frozen_time) { described_class.new(track, interval).execute }
+ end
let(:track) { :create }
let(:interval) { 1 }
- let(:previous_action_completed_at) { 2.days.ago.middle_of_day }
+ let(:frozen_time) { Time.current }
+ let(:previous_action_completed_at) { frozen_time - 2.days }
let(:current_action_completed_at) { nil }
let(:experiment_enabled) { true }
let(:user_can_perform_current_track_action) { true }
@@ -39,18 +42,18 @@ RSpec.describe Namespaces::InProductMarketingEmailsService, '#execute' do
using RSpec::Parameterized::TableSyntax
where(:track, :interval, :actions_completed) do
- :create | 1 | { created_at: 2.days.ago.middle_of_day }
- :create | 5 | { created_at: 6.days.ago.middle_of_day }
- :create | 10 | { created_at: 11.days.ago.middle_of_day }
- :verify | 1 | { created_at: 2.days.ago.middle_of_day, git_write_at: 2.days.ago.middle_of_day }
- :verify | 5 | { created_at: 6.days.ago.middle_of_day, git_write_at: 6.days.ago.middle_of_day }
- :verify | 10 | { created_at: 11.days.ago.middle_of_day, git_write_at: 11.days.ago.middle_of_day }
- :trial | 1 | { created_at: 2.days.ago.middle_of_day, git_write_at: 2.days.ago.middle_of_day, pipeline_created_at: 2.days.ago.middle_of_day }
- :trial | 5 | { created_at: 6.days.ago.middle_of_day, git_write_at: 6.days.ago.middle_of_day, pipeline_created_at: 6.days.ago.middle_of_day }
- :trial | 10 | { created_at: 11.days.ago.middle_of_day, git_write_at: 11.days.ago.middle_of_day, pipeline_created_at: 11.days.ago.middle_of_day }
- :team | 1 | { created_at: 2.days.ago.middle_of_day, git_write_at: 2.days.ago.middle_of_day, pipeline_created_at: 2.days.ago.middle_of_day, trial_started_at: 2.days.ago.middle_of_day }
- :team | 5 | { created_at: 6.days.ago.middle_of_day, git_write_at: 6.days.ago.middle_of_day, pipeline_created_at: 6.days.ago.middle_of_day, trial_started_at: 6.days.ago.middle_of_day }
- :team | 10 | { created_at: 11.days.ago.middle_of_day, git_write_at: 11.days.ago.middle_of_day, pipeline_created_at: 11.days.ago.middle_of_day, trial_started_at: 11.days.ago.middle_of_day }
+ :create | 1 | { created_at: frozen_time - 2.days }
+ :create | 5 | { created_at: frozen_time - 6.days }
+ :create | 10 | { created_at: frozen_time - 11.days }
+ :verify | 1 | { created_at: frozen_time - 2.days, git_write_at: frozen_time - 2.days }
+ :verify | 5 | { created_at: frozen_time - 6.days, git_write_at: frozen_time - 6.days }
+ :verify | 10 | { created_at: frozen_time - 11.days, git_write_at: frozen_time - 11.days }
+ :trial | 1 | { created_at: frozen_time - 2.days, git_write_at: frozen_time - 2.days, pipeline_created_at: frozen_time - 2.days }
+ :trial | 5 | { created_at: frozen_time - 6.days, git_write_at: frozen_time - 6.days, pipeline_created_at: frozen_time - 6.days }
+ :trial | 10 | { created_at: frozen_time - 11.days, git_write_at: frozen_time - 11.days, pipeline_created_at: frozen_time - 11.days }
+ :team | 1 | { created_at: frozen_time - 2.days, git_write_at: frozen_time - 2.days, pipeline_created_at: frozen_time - 2.days, trial_started_at: frozen_time - 2.days }
+ :team | 5 | { created_at: frozen_time - 6.days, git_write_at: frozen_time - 6.days, pipeline_created_at: frozen_time - 6.days, trial_started_at: frozen_time - 6.days }
+ :team | 10 | { created_at: frozen_time - 11.days, git_write_at: frozen_time - 11.days, pipeline_created_at: frozen_time - 11.days, trial_started_at: frozen_time - 11.days }
end
with_them do
@@ -64,7 +67,7 @@ RSpec.describe Namespaces::InProductMarketingEmailsService, '#execute' do
it { is_expected.not_to send_in_product_marketing_email }
context 'when the previous track actions have been completed' do
- let(:current_action_completed_at) { 2.days.ago.middle_of_day }
+ let(:current_action_completed_at) { frozen_time - 2.days }
it { is_expected.to send_in_product_marketing_email(user.id, group.id, :verify, 0) }
end
@@ -76,7 +79,7 @@ RSpec.describe Namespaces::InProductMarketingEmailsService, '#execute' do
it { is_expected.not_to send_in_product_marketing_email }
context 'when the previous track action was completed within the intervals range' do
- let(:previous_action_completed_at) { 6.days.ago.middle_of_day }
+ let(:previous_action_completed_at) { frozen_time - 6.days }
it { is_expected.to send_in_product_marketing_email(user.id, group.id, :create, 1) }
end
@@ -113,13 +116,13 @@ RSpec.describe Namespaces::InProductMarketingEmailsService, '#execute' do
end
context 'when the previous track action is completed outside the intervals range' do
- let(:previous_action_completed_at) { 3.days.ago }
+ let(:previous_action_completed_at) { frozen_time - 3.days }
it { is_expected.not_to send_in_product_marketing_email }
end
context 'when the current track action is completed' do
- let(:current_action_completed_at) { Time.current }
+ let(:current_action_completed_at) { frozen_time }
it { is_expected.not_to send_in_product_marketing_email }
end
diff --git a/spec/services/notes/build_service_spec.rb b/spec/services/notes/build_service_spec.rb
index 90548cf9a99..deeab66c4e9 100644
--- a/spec/services/notes/build_service_spec.rb
+++ b/spec/services/notes/build_service_spec.rb
@@ -3,29 +3,38 @@
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: author) }
+ let(:mr_note) { create(:discussion_note_on_merge_request, noteable: merge_request, project: project, author: note.author) }
+ let(:base_params) { { note: 'Test' } }
+ let(:params) { {} }
+
+ subject(:new_note) { described_class.new(project, user, base_params.merge(params)).execute }
describe '#execute' do
context 'when in_reply_to_discussion_id is specified' do
+ let(:params) { { in_reply_to_discussion_id: note.discussion_id } }
+
context 'when a note with that original discussion ID exists' do
it 'sets the note up to be in reply to that note' do
- new_note = described_class.new(project, author, note: 'Test', in_reply_to_discussion_id: note.discussion_id).execute
expect(new_note).to be_valid
expect(new_note.in_reply_to?(note)).to be_truthy
expect(new_note.resolved?).to be_falsey
end
context 'when discussion is resolved' do
+ let(:params) { { in_reply_to_discussion_id: mr_note.discussion_id } }
+
before do
mr_note.resolve!(author)
end
it 'resolves the note' do
- new_note = described_class.new(project, author, note: 'Test', in_reply_to_discussion_id: mr_note.discussion_id).execute
expect(new_note).to be_valid
expect(new_note.resolved?).to be_truthy
end
@@ -34,24 +43,23 @@ RSpec.describe Notes::BuildService do
context 'when a note with that discussion ID exists' do
it 'sets the note up to be in reply to that note' do
- new_note = described_class.new(project, author, note: 'Test', in_reply_to_discussion_id: note.discussion_id).execute
expect(new_note).to be_valid
expect(new_note.in_reply_to?(note)).to be_truthy
end
end
context 'when no note with that discussion ID exists' do
+ let(:params) { { in_reply_to_discussion_id: 'foo' } }
+
it 'sets an error' do
- new_note = described_class.new(project, author, note: 'Test', in_reply_to_discussion_id: 'foo').execute
expect(new_note.errors[:base]).to include('Discussion to reply to cannot be found')
end
end
context 'when user has no access to discussion' do
- it 'sets an error' do
- another_user = create(:user)
- new_note = described_class.new(project, another_user, note: 'Test', in_reply_to_discussion_id: note.discussion_id).execute
+ let(:user) { create(:user) }
+ it 'sets an error' do
expect(new_note.errors[:base]).to include('Discussion to reply to cannot be found')
end
end
@@ -127,34 +135,118 @@ RSpec.describe Notes::BuildService do
context 'when replying to individual note' do
let(:note) { create(:note_on_issue) }
-
- subject { described_class.new(project, author, note: 'Test', in_reply_to_discussion_id: note.discussion_id).execute }
+ let(:params) { { in_reply_to_discussion_id: note.discussion_id } }
it 'sets the note up to be in reply to that note' do
- expect(subject).to be_valid
- expect(subject).to be_a(DiscussionNote)
- expect(subject.discussion_id).to eq(note.discussion_id)
+ expect(new_note).to be_valid
+ expect(new_note).to be_a(DiscussionNote)
+ expect(new_note.discussion_id).to eq(note.discussion_id)
end
context 'when noteable does not support replies' do
let(:note) { create(:note_on_commit) }
it 'builds another individual note' do
- expect(subject).to be_valid
- expect(subject).to be_a(Note)
- expect(subject.discussion_id).not_to eq(note.discussion_id)
+ expect(new_note).to be_valid
+ expect(new_note).to be_a(Note)
+ expect(new_note.discussion_id).not_to eq(note.discussion_id)
+ end
+ end
+ end
+
+ context 'confidential comments' do
+ before do
+ project.add_reporter(author)
+ 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 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
+ end
+
+ context 'when the user cannot read confidential comments' do
+ let(:user) { create(:user) }
+
+ it 'returns `Discussion to reply to cannot be found` error' do
+ expect(new_note.errors.first).to include("Discussion to reply to cannot be found")
+ end
+ 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 } }
+
+ it '`confidential` param is ignored and set to `false`' do
+ expect(new_note.confidential).to be_falsey
+ 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 } }
+
+ it 'note `confidential` flag is set to `true`' do
+ expect(new_note.confidential).to be_truthy
+ end
+ end
+
+ 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 } }
+
+ it 'note `confidential` flag is set to `true`' 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
+
+ let(:admin) { create(:admin) }
+ let(:params) { { confidential: true, noteable: merge_request } }
+
+ it 'note `confidential` flag is set to `true`' do
+ expect(new_note.confidential).to be_truthy
+ end
+ end
+
+ context 'when the user is not allowed' do
+ let(:user) { create(:user) }
+ let(:params) { { confidential: true, noteable: merge_request } }
+
+ it 'note `confidential` flag is set to `false`' do
+ expect(new_note.confidential).to be_falsey
+ end
+ end
+ end
+
+ context 'when the `confidential` note flag is set to `false`' do
+ let(:params) { { confidential: false, noteable: merge_request } }
+
+ it 'note `confidential` flag is set to `false`' do
+ expect(new_note.confidential).to be_falsey
+ end
end
end
end
- it 'builds a note without saving it' do
- new_note = described_class.new(project,
- author,
- noteable_type: note.noteable_type,
- noteable_id: note.noteable_id,
- note: 'Test').execute
- expect(new_note).to be_valid
- expect(new_note).not_to be_persisted
+ context 'when noteable is not set' do
+ let(:params) { { noteable_type: note.noteable_type, noteable_id: note.noteable_id } }
+
+ it 'builds a note without saving it' do
+ expect(new_note).to be_valid
+ expect(new_note).not_to be_persisted
+ end
end
end
end
diff --git a/spec/services/notes/update_service_spec.rb b/spec/services/notes/update_service_spec.rb
index 902fd9958f8..000f3d26efa 100644
--- a/spec/services/notes/update_service_spec.rb
+++ b/spec/services/notes/update_service_spec.rb
@@ -64,6 +64,40 @@ RSpec.describe Notes::UpdateService do
end.to change { counter.unique_events(event_names: event, start_date: 1.day.ago, end_date: 1.day.from_now) }.by(1)
end
+ context 'when note text was changed' do
+ let!(:note) { create(:note, project: project, noteable: issue, author: user2, note: "Old note #{user3.to_reference}") }
+ let(:edit_note_text) { update_note({ note: 'new text' }) }
+
+ it 'update last_edited_at' do
+ travel_to(1.day.from_now) do
+ expect { edit_note_text }.to change { note.reload.last_edited_at }
+ end
+ end
+
+ it 'update updated_by' do
+ travel_to(1.day.from_now) do
+ expect { edit_note_text }.to change { note.reload.updated_by }
+ end
+ end
+ end
+
+ context 'when note text was not changed' do
+ let!(:note) { create(:note, project: project, noteable: issue, author: user2, note: "Old note #{user3.to_reference}") }
+ let(:does_not_edit_note_text) { update_note({}) }
+
+ it 'does not update last_edited_at' do
+ travel_to(1.day.from_now) do
+ expect { does_not_edit_note_text }.not_to change { note.reload.last_edited_at }
+ end
+ end
+
+ it 'does not update updated_by' do
+ travel_to(1.day.from_now) do
+ expect { does_not_edit_note_text }.not_to change { note.reload.updated_by }
+ end
+ end
+ end
+
context 'when the notable is a merge request' do
let(:merge_request) { create(:merge_request, source_project: project) }
let(:note) { create(:note, project: project, noteable: merge_request, author: user, note: "Old note #{user2.to_reference}") }
diff --git a/spec/services/notification_service_spec.rb b/spec/services/notification_service_spec.rb
index b67c37ba02d..03dc3be194c 100644
--- a/spec/services/notification_service_spec.rb
+++ b/spec/services/notification_service_spec.rb
@@ -99,6 +99,23 @@ RSpec.describe NotificationService, :mailer do
end
end
+ shared_examples 'is not able to send notifications' do
+ it 'does not send any notification' do
+ user_1 = create(:user)
+ recipient_1 = NotificationRecipient.new(user_1, :custom, custom_action: :new_release)
+ allow(NotificationRecipients::BuildService).to receive(:build_new_release_recipients).and_return([recipient_1])
+
+ expect(Gitlab::AppLogger).to receive(:warn).with(message: 'Skipping sending notifications', user: current_user.id, klass: object.class, object_id: object.id)
+
+ action
+
+ should_not_email(@u_mentioned)
+ should_not_email(@u_guest_watcher)
+ should_not_email(user_1)
+ should_not_email(current_user)
+ end
+ end
+
# Next shared examples are intended to test notifications of "participants"
#
# they take the following parameters:
@@ -243,11 +260,12 @@ RSpec.describe NotificationService, :mailer do
describe 'AccessToken' do
describe '#access_token_about_to_expire' do
let_it_be(:user) { create(:user) }
+ let_it_be(:pat) { create(:personal_access_token, user: user, expires_at: 5.days.from_now) }
- subject { notification.access_token_about_to_expire(user) }
+ subject { notification.access_token_about_to_expire(user, [pat.name]) }
it 'sends email to the token owner' do
- expect { subject }.to have_enqueued_email(user, mail: "access_token_about_to_expire_email")
+ expect { subject }.to have_enqueued_email(user, [pat.name], mail: "access_token_about_to_expire_email")
end
end
@@ -881,8 +899,24 @@ RSpec.describe NotificationService, :mailer do
end
describe '#send_new_release_notifications', :deliver_mails_inline do
+ let(:release) { create(:release, author: current_user) }
+ let(:object) { release }
+ let(:action) { notification.send_new_release_notifications(release) }
+
+ context 'when release author is blocked' do
+ let(:current_user) { create(:user, :blocked) }
+
+ include_examples 'is not able to send notifications'
+ end
+
+ context 'when release author is a ghost' do
+ let(:current_user) { create(:user, :ghost) }
+
+ include_examples 'is not able to send notifications'
+ end
+
context 'when recipients for a new release exist' do
- let(:release) { create(:release) }
+ let(:current_user) { create(:user) }
it 'calls new_release_email for each relevant recipient' do
user_1 = create(:user)
@@ -1127,11 +1161,31 @@ RSpec.describe NotificationService, :mailer do
should_email(admin)
end
end
+
+ context 'when the author is not allowed to trigger notifications' do
+ let(:current_user) { nil }
+ let(:object) { issue }
+ let(:action) { notification.new_issue(issue, current_user) }
+
+ context 'because they are blocked' do
+ let(:current_user) { create(:user, :blocked) }
+
+ include_examples 'is not able to send notifications'
+ end
+
+ context 'because they are a ghost' do
+ let(:current_user) { create(:user, :ghost) }
+
+ include_examples 'is not able to send notifications'
+ end
+ end
end
describe '#new_mentions_in_issue' do
let(:notification_method) { :new_mentions_in_issue }
let(:mentionable) { issue }
+ let(:object) { mentionable }
+ let(:action) { send_notifications(@u_mentioned, current_user: current_user) }
include_examples 'notifications for new mentions'
@@ -1139,6 +1193,18 @@ RSpec.describe NotificationService, :mailer do
let(:notification_target) { issue }
let(:notification_trigger) { send_notifications(@u_watcher, @u_participant_mentioned, @u_custom_global, @u_mentioned) }
end
+
+ context 'where current_user is blocked' do
+ let(:current_user) { create(:user, :blocked) }
+
+ include_examples 'is not able to send notifications'
+ end
+
+ context 'where current_user is a ghost' do
+ let(:current_user) { create(:user, :ghost) }
+
+ include_examples 'is not able to send notifications'
+ end
end
describe '#reassigned_issue' do
@@ -1751,11 +1817,31 @@ RSpec.describe NotificationService, :mailer do
it { should_not_email(participant) }
end
end
+
+ context 'when the author is not allowed to trigger notifications' do
+ let(:current_user) { nil }
+ let(:object) { merge_request }
+ let(:action) { notification.new_merge_request(merge_request, current_user) }
+
+ context 'because they are blocked' do
+ let(:current_user) { create(:user, :blocked) }
+
+ it_behaves_like 'is not able to send notifications'
+ end
+
+ context 'because they are a ghost' do
+ let(:current_user) { create(:user, :ghost) }
+
+ it_behaves_like 'is not able to send notifications'
+ end
+ end
end
describe '#new_mentions_in_merge_request' do
let(:notification_method) { :new_mentions_in_merge_request }
let(:mentionable) { merge_request }
+ let(:object) { mentionable }
+ let(:action) { send_notifications(@u_mentioned, current_user: current_user) }
include_examples 'notifications for new mentions'
@@ -1763,6 +1849,18 @@ RSpec.describe NotificationService, :mailer do
let(:notification_target) { merge_request }
let(:notification_trigger) { send_notifications(@u_watcher, @u_participant_mentioned, @u_custom_global, @u_mentioned) }
end
+
+ context 'where current_user is blocked' do
+ let(:current_user) { create(:user, :blocked) }
+
+ include_examples 'is not able to send notifications'
+ end
+
+ context 'where current_user is a ghost' do
+ let(:current_user) { create(:user, :ghost) }
+
+ include_examples 'is not able to send notifications'
+ end
end
describe '#reassigned_merge_request' do
@@ -1867,6 +1965,42 @@ RSpec.describe NotificationService, :mailer do
end
end
+ describe '#change_in_merge_request_draft_status' do
+ let(:merge_request) { create(:merge_request, author: author, source_project: project) }
+
+ let_it_be(:current_user) { create(:user) }
+
+ it 'sends emails to relevant users only', :aggregate_failures do
+ notification.change_in_merge_request_draft_status(merge_request, current_user)
+
+ merge_request.reviewers.each { |reviewer| should_email(reviewer) }
+ merge_request.assignees.each { |assignee| should_email(assignee) }
+ should_email(merge_request.author)
+ should_email(@u_watcher)
+ should_email(@subscriber)
+ should_email(@watcher_and_subscriber)
+ should_email(@u_guest_watcher)
+ should_not_email(@u_participant_mentioned)
+ should_not_email(@u_guest_custom)
+ should_not_email(@u_custom_global)
+ should_not_email(@unsubscriber)
+ should_not_email(@u_participating)
+ should_not_email(@u_disabled)
+ should_not_email(@u_lazy_participant)
+ end
+
+ it_behaves_like 'participating notifications' do
+ let(:participant) { create(:user, username: 'user-participant') }
+ let(:issuable) { merge_request }
+ let(:notification_trigger) { notification.change_in_merge_request_draft_status(merge_request, @u_disabled) }
+ end
+
+ it_behaves_like 'project emails are disabled' do
+ let(:notification_target) { merge_request }
+ let(:notification_trigger) { notification.change_in_merge_request_draft_status(merge_request, @u_disabled) }
+ end
+ end
+
describe '#push_to_merge_request' do
before do
update_custom_notification(:push_to_merge_request, @u_guest_custom, resource: project)
@@ -2159,8 +2293,38 @@ RSpec.describe NotificationService, :mailer do
end
describe '#merge_when_pipeline_succeeds' do
+ before do
+ update_custom_notification(:merge_when_pipeline_succeeds, @u_guest_custom, resource: project)
+ update_custom_notification(:merge_when_pipeline_succeeds, @u_custom_global)
+ end
+
it 'send notification that merge will happen when pipeline succeeds' do
notification.merge_when_pipeline_succeeds(merge_request, assignee)
+
+ should_email(merge_request.author)
+ should_email(@u_watcher)
+ should_email(@subscriber)
+ should_email(@u_guest_custom)
+ should_email(@u_custom_global)
+ should_not_email(@unsubscriber)
+ should_not_email(@u_disabled)
+ end
+
+ it 'does not send notification if the custom event is disabled' do
+ update_custom_notification(:merge_when_pipeline_succeeds, @u_guest_custom, resource: project, value: false)
+ update_custom_notification(:merge_when_pipeline_succeeds, @u_custom_global, resource: nil, value: false)
+ notification.merge_when_pipeline_succeeds(merge_request, assignee)
+
+ should_not_email(@u_guest_custom)
+ should_not_email(@u_custom_global)
+ end
+
+ it 'sends notification to participants even if the custom event is disabled' do
+ update_custom_notification(:merge_when_pipeline_succeeds, merge_request.author, resource: project, value: false)
+ update_custom_notification(:merge_when_pipeline_succeeds, @u_watcher, resource: project, value: false)
+ update_custom_notification(:merge_when_pipeline_succeeds, @subscriber, resource: project, value: false)
+ notification.merge_when_pipeline_succeeds(merge_request, assignee)
+
should_email(merge_request.author)
should_email(@u_watcher)
should_email(@subscriber)
@@ -2694,7 +2858,7 @@ RSpec.describe NotificationService, :mailer do
end
it 'filters out guests when new merge request is created' do
- notification.new_merge_request(merge_request1, @u_disabled)
+ notification.new_merge_request(merge_request1, developer)
should_not_email(guest)
should_email(assignee)
diff --git a/spec/services/onboarding_progress_service_spec.rb b/spec/services/onboarding_progress_service_spec.rb
index 340face4ae8..ef4f4f0d822 100644
--- a/spec/services/onboarding_progress_service_spec.rb
+++ b/spec/services/onboarding_progress_service_spec.rb
@@ -3,9 +3,49 @@
require 'spec_helper'
RSpec.describe OnboardingProgressService do
+ describe '.async' do
+ let_it_be(:namespace) { create(:namespace) }
+ let_it_be(:action) { :git_pull }
+
+ subject(:execute_service) { described_class.async(namespace.id).execute(action: action) }
+
+ context 'when not onboarded' do
+ it 'does not schedule a worker' do
+ expect(Namespaces::OnboardingProgressWorker).not_to receive(:perform_async)
+
+ execute_service
+ end
+ end
+
+ context 'when onboarded' do
+ before do
+ OnboardingProgress.onboard(namespace)
+ end
+
+ context 'when action is already completed' do
+ before do
+ OnboardingProgress.register(namespace, action)
+ end
+
+ it 'does not schedule a worker' do
+ expect(Namespaces::OnboardingProgressWorker).not_to receive(:perform_async)
+
+ execute_service
+ end
+ end
+
+ context 'when action is not yet completed' do
+ it 'schedules a worker' do
+ expect(Namespaces::OnboardingProgressWorker).to receive(:perform_async)
+
+ execute_service
+ end
+ end
+ end
+ end
+
describe '#execute' do
- let(:namespace) { create(:namespace, parent: root_namespace) }
- let(:root_namespace) { nil }
+ let(:namespace) { create(:namespace) }
let(:action) { :namespace_action }
subject(:execute_service) { described_class.new(namespace).execute(action: :subscription_created) }
@@ -23,16 +63,16 @@ RSpec.describe OnboardingProgressService do
end
context 'when the namespace is not the root' do
- let(:root_namespace) { build(:namespace) }
+ let(:group) { create(:group, :nested) }
before do
- OnboardingProgress.onboard(root_namespace)
+ OnboardingProgress.onboard(group)
end
- it 'registers a namespace onboarding progress action for the root namespace' do
+ it 'does not register a namespace onboarding progress action' do
execute_service
- expect(OnboardingProgress.completed?(root_namespace, :subscription_created)).to eq(true)
+ expect(OnboardingProgress.completed?(group, :subscription_created)).to be(nil)
end
end
@@ -42,7 +82,7 @@ RSpec.describe OnboardingProgressService do
it 'does not register a namespace onboarding progress action' do
execute_service
- expect(OnboardingProgress.completed?(root_namespace, :subscription_created)).to be(nil)
+ expect(OnboardingProgress.completed?(namespace, :subscription_created)).to be(nil)
end
end
end
diff --git a/spec/services/packages/composer/create_package_service_spec.rb b/spec/services/packages/composer/create_package_service_spec.rb
index 4f1a46e7e45..526c7b4929b 100644
--- a/spec/services/packages/composer/create_package_service_spec.rb
+++ b/spec/services/packages/composer/create_package_service_spec.rb
@@ -28,6 +28,8 @@ RSpec.describe Packages::Composer::CreatePackageService do
let(:branch) { project.repository.find_branch('master') }
it 'creates the package' do
+ expect(::Packages::Composer::CacheUpdateWorker).to receive(:perform_async).with(project.id, package_name, nil)
+
expect { subject }
.to change { Packages::Package.composer.count }.by(1)
.and change { Packages::Composer::Metadatum.count }.by(1)
@@ -54,6 +56,8 @@ RSpec.describe Packages::Composer::CreatePackageService do
end
it 'creates the package' do
+ expect(::Packages::Composer::CacheUpdateWorker).to receive(:perform_async).with(project.id, package_name, nil)
+
expect { subject }
.to change { Packages::Package.composer.count }.by(1)
.and change { Packages::Composer::Metadatum.count }.by(1)
@@ -80,6 +84,8 @@ RSpec.describe Packages::Composer::CreatePackageService do
end
it 'does not create a new package' do
+ expect(::Packages::Composer::CacheUpdateWorker).to receive(:perform_async).with(project.id, package_name, nil)
+
expect { subject }
.to change { Packages::Package.composer.count }.by(0)
.and change { Packages::Composer::Metadatum.count }.by(0)
@@ -101,6 +107,8 @@ RSpec.describe Packages::Composer::CreatePackageService do
let!(:other_package) { create(:package, name: package_name, version: 'dev-master', project: other_project) }
it 'creates the package' do
+ expect(::Packages::Composer::CacheUpdateWorker).to receive(:perform_async).with(project.id, package_name, nil)
+
expect { subject }
.to change { Packages::Package.composer.count }.by(1)
.and change { Packages::Composer::Metadatum.count }.by(1)
diff --git a/spec/services/packages/create_event_service_spec.rb b/spec/services/packages/create_event_service_spec.rb
index f7bab0e5a9f..122f1e88ad0 100644
--- a/spec/services/packages/create_event_service_spec.rb
+++ b/spec/services/packages/create_event_service_spec.rb
@@ -57,18 +57,6 @@ RSpec.describe Packages::CreateEventService do
end
shared_examples 'redis package unique event creation' do |originator_type, expected_scope|
- context 'with feature flag disable' do
- before do
- stub_feature_flags(collect_package_events_redis: false)
- end
-
- it 'does not track the event' do
- expect(::Gitlab::UsageDataCounters::HLLRedisCounter).not_to receive(:track_event)
-
- subject
- end
- end
-
it 'tracks the event' do
expect(::Gitlab::UsageDataCounters::HLLRedisCounter).to receive(:track_event).with(/package/, values: user.id)
@@ -77,18 +65,6 @@ RSpec.describe Packages::CreateEventService do
end
shared_examples 'redis package count event creation' do |originator_type, expected_scope|
- context 'with feature flag disabled' do
- before do
- stub_feature_flags(collect_package_events_redis: false)
- end
-
- it 'does not track the event' do
- expect(::Gitlab::UsageDataCounters::PackageEventCounter).not_to receive(:count)
-
- subject
- end
- end
-
it 'tracks the event' do
expect(::Gitlab::UsageDataCounters::PackageEventCounter).to receive(:count).at_least(:once)
diff --git a/spec/services/packages/create_temporary_package_service_spec.rb b/spec/services/packages/create_temporary_package_service_spec.rb
new file mode 100644
index 00000000000..4b8d37401d8
--- /dev/null
+++ b/spec/services/packages/create_temporary_package_service_spec.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Packages::CreateTemporaryPackageService do
+ let_it_be(:project) { create(:project) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:params) { {} }
+ let_it_be(:package_name) { 'my-package' }
+ let_it_be(:package_type) { 'rubygems' }
+
+ describe '#execute' do
+ subject { described_class.new(project, user, params).execute(package_type, name: package_name) }
+
+ let(:package) { Packages::Package.last }
+
+ it 'creates the package', :aggregate_failures do
+ expect { subject }.to change { Packages::Package.count }.by(1)
+
+ expect(package).to be_valid
+ expect(package).to be_processing
+ expect(package.name).to eq(package_name)
+ expect(package.version).to start_with(described_class::PACKAGE_VERSION)
+ expect(package.package_type).to eq(package_type)
+ end
+
+ it 'can create two packages in a row', :aggregate_failures do
+ expect { subject }.to change { Packages::Package.count }.by(1)
+
+ expect do
+ described_class.new(project, user, params).execute(package_type, name: package_name)
+ end.to change { Packages::Package.count }.by(1)
+
+ expect(package).to be_valid
+ expect(package).to be_processing
+ expect(package.name).to eq(package_name)
+ expect(package.version).to start_with(described_class::PACKAGE_VERSION)
+ expect(package.package_type).to eq(package_type)
+ end
+
+ it_behaves_like 'assigns the package creator'
+ it_behaves_like 'assigns build to package'
+ end
+end
diff --git a/spec/services/packages/debian/find_or_create_incoming_service_spec.rb b/spec/services/packages/debian/find_or_create_incoming_service_spec.rb
new file mode 100644
index 00000000000..e1393c774b1
--- /dev/null
+++ b/spec/services/packages/debian/find_or_create_incoming_service_spec.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Packages::Debian::FindOrCreateIncomingService do
+ let_it_be(:project) { create(:project) }
+ let_it_be(:user) { create(:user) }
+
+ subject(:service) { described_class.new(project, user) }
+
+ describe '#execute' do
+ subject(:package) { service.execute }
+
+ context 'run once' do
+ it 'creates a new package', :aggregate_failures do
+ expect(package).to be_valid
+ expect(package.project_id).to eq(project.id)
+ expect(package.creator_id).to eq(user.id)
+ expect(package.name).to eq('incoming')
+ expect(package.version).to be_nil
+ expect(package.package_type).to eq('debian')
+ expect(package.debian_incoming?).to be_truthy
+ end
+
+ it_behaves_like 'assigns the package creator'
+ end
+
+ context 'run twice' do
+ let!(:package2) { service.execute }
+
+ it 'returns the same object' do
+ expect(package2.id).to eq(package.id)
+ end
+ end
+ end
+end
diff --git a/spec/services/packages/debian/find_or_create_package_service_spec.rb b/spec/services/packages/debian/find_or_create_package_service_spec.rb
new file mode 100644
index 00000000000..3582b1f1dc3
--- /dev/null
+++ b/spec/services/packages/debian/find_or_create_package_service_spec.rb
@@ -0,0 +1,54 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Packages::Debian::FindOrCreatePackageService do
+ let_it_be(:distribution) { create(:debian_project_distribution) }
+ let_it_be(:project) { distribution.project }
+ let_it_be(:user) { create(:user) }
+ let(:params) { { name: 'foo', version: '1.0+debian', distribution_name: distribution.codename } }
+
+ subject(:service) { described_class.new(project, user, params) }
+
+ describe '#execute' do
+ subject { service.execute }
+
+ let(:package) { subject.payload[:package] }
+
+ context 'run once' do
+ it 'creates a new package', :aggregate_failures do
+ expect { subject }.to change { ::Packages::Package.count }.by(1)
+ expect(subject).to be_success
+
+ expect(package).to be_valid
+ expect(package.project_id).to eq(project.id)
+ expect(package.creator_id).to eq(user.id)
+ expect(package.name).to eq('foo')
+ expect(package.version).to eq('1.0+debian')
+ expect(package).to be_debian
+ expect(package.debian_publication.distribution).to eq(distribution)
+ end
+ end
+
+ context 'run twice' do
+ let(:subject2) { service.execute }
+
+ let(:package2) { service.execute.payload[:package] }
+
+ it 'returns the same object' do
+ expect { subject }.to change { ::Packages::Package.count }.by(1)
+ expect { package2 }.not_to change { ::Packages::Package.count }
+
+ expect(package2.id).to eq(package.id)
+ end
+ end
+
+ context 'with non-existing distribution' do
+ let(:params) { { name: 'foo', version: '1.0+debian', distribution_name: 'not-existing' } }
+
+ it 'raises ActiveRecord::RecordNotFound' do
+ expect { package }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+ end
+ end
+end
diff --git a/spec/services/packages/debian/get_or_create_incoming_service_spec.rb b/spec/services/packages/debian/get_or_create_incoming_service_spec.rb
deleted file mode 100644
index ab99b091246..00000000000
--- a/spec/services/packages/debian/get_or_create_incoming_service_spec.rb
+++ /dev/null
@@ -1,36 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Packages::Debian::GetOrCreateIncomingService do
- let_it_be(:project) { create(:project) }
- let_it_be(:user) { create(:user) }
-
- subject(:service) { described_class.new(project, user) }
-
- describe '#execute' do
- subject(:package) { service.execute }
-
- context 'run once' do
- it 'creates a new package', :aggregate_failures do
- expect(package).to be_valid
- expect(package.project_id).to eq(project.id)
- expect(package.creator_id).to eq(user.id)
- expect(package.name).to eq('incoming')
- expect(package.version).to be_nil
- expect(package.package_type).to eq('debian')
- expect(package.debian_incoming?).to be_truthy
- end
-
- it_behaves_like 'assigns the package creator'
- end
-
- context 'run twice' do
- let!(:package2) { service.execute }
-
- it 'returns the same object' do
- expect(package2.id).to eq(package.id)
- end
- end
- end
-end
diff --git a/spec/services/packages/maven/metadata/append_package_file_service_spec.rb b/spec/services/packages/maven/metadata/append_package_file_service_spec.rb
new file mode 100644
index 00000000000..c406ab93630
--- /dev/null
+++ b/spec/services/packages/maven/metadata/append_package_file_service_spec.rb
@@ -0,0 +1,59 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ::Packages::Maven::Metadata::AppendPackageFileService do
+ let_it_be(:package) { create(:maven_package, version: nil) }
+
+ let(:service) { described_class.new(package: package, metadata_content: content) }
+ let(:content) { 'test' }
+
+ describe '#execute' do
+ subject { service.execute }
+
+ context 'with some content' do
+ it 'creates all the related package files', :aggregate_failures do
+ expect { subject }.to change { package.package_files.count }.by(5)
+ expect(subject).to be_success
+
+ expect_file(metadata_file_name, with_content: content, with_content_type: 'application/xml')
+ expect_file("#{metadata_file_name}.md5")
+ expect_file("#{metadata_file_name}.sha1")
+ expect_file("#{metadata_file_name}.sha256")
+ expect_file("#{metadata_file_name}.sha512")
+ end
+ end
+
+ context 'with nil content' do
+ let(:content) { nil }
+
+ it_behaves_like 'returning an error service response', message: 'metadata content is not set'
+ end
+
+ context 'with nil package' do
+ let(:package) { nil }
+
+ it_behaves_like 'returning an error service response', message: 'package is not set'
+ end
+
+ def expect_file(file_name, with_content: nil, with_content_type: '')
+ package_file = package.package_files.recent.with_file_name(file_name).first
+
+ expect(package_file.file).to be_present
+ expect(package_file.file_name).to eq(file_name)
+ expect(package_file.size).to be > 0
+ expect(package_file.file_md5).to be_present
+ expect(package_file.file_sha1).to be_present
+ expect(package_file.file_sha256).to be_present
+ expect(package_file.file.content_type).to eq(with_content_type)
+
+ if with_content
+ expect(package_file.file.read).to eq(with_content)
+ end
+ end
+
+ def metadata_file_name
+ ::Packages::Maven::Metadata.filename
+ end
+ end
+end
diff --git a/spec/services/packages/maven/metadata/create_versions_xml_service_spec.rb b/spec/services/packages/maven/metadata/create_versions_xml_service_spec.rb
new file mode 100644
index 00000000000..109f7adab4e
--- /dev/null
+++ b/spec/services/packages/maven/metadata/create_versions_xml_service_spec.rb
@@ -0,0 +1,277 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ::Packages::Maven::Metadata::CreateVersionsXmlService do
+ let_it_be(:package) { create(:maven_package, version: nil) }
+
+ let(:versions_in_database) { %w[1.3 2.0-SNAPSHOT 1.6 1.4 1.5-SNAPSHOT] }
+ let(:versions_in_xml) { %w[1.3 2.0-SNAPSHOT 1.6 1.4 1.5-SNAPSHOT] }
+ let(:version_latest) { nil }
+ let(:version_release) { '1.4' }
+ let(:service) { described_class.new(metadata_content: metadata_xml, package: package) }
+
+ describe '#execute' do
+ subject { service.execute }
+
+ before do
+ next unless package
+
+ versions_in_database.each do |version|
+ create(:maven_package, name: package.name, version: version, project: package.project)
+ end
+ end
+
+ shared_examples 'returning an xml with versions in the database' do
+ it 'returns an metadata versions xml with versions in the database', :aggregate_failures do
+ result = subject
+
+ expect(result).to be_success
+ expect(versions_from(result.payload[:metadata_content])).to match_array(versions_in_database)
+ end
+ end
+
+ shared_examples 'returning an xml with' do |release:, latest:|
+ it 'returns an xml with the updated release and latest versions', :aggregate_failures do
+ result = subject
+
+ expect(result).to be_success
+ expect(result.payload[:changes_exist]).to be_truthy
+ xml = result.payload[:metadata_content]
+ expect(release_from(xml)).to eq(release)
+ expect(latest_from(xml)).to eq(latest)
+ end
+ end
+
+ context 'with same versions in both sides' do
+ it 'returns no changes', :aggregate_failures do
+ result = subject
+
+ expect(result).to be_success
+ expect(result.payload).to eq(changes_exist: false, empty_versions: false)
+ end
+ end
+
+ context 'with more versions' do
+ let(:additional_versions) { %w[5.5 5.6 5.7-SNAPSHOT] }
+
+ context 'in the xml side' do
+ let(:versions_in_xml) { versions_in_database + additional_versions }
+
+ it_behaves_like 'returning an xml with versions in the database'
+ end
+
+ context 'in the database side' do
+ let(:versions_in_database) { versions_in_xml + additional_versions }
+
+ it_behaves_like 'returning an xml with versions in the database'
+ end
+ end
+
+ context 'with completely different versions' do
+ let(:versions_in_database) { %w[1.0 1.1 1.2] }
+ let(:versions_in_xml) { %w[2.0 2.1 2.2] }
+
+ it_behaves_like 'returning an xml with versions in the database'
+ end
+
+ context 'with no versions in the database' do
+ let(:versions_in_database) { [] }
+
+ it 'returns a success', :aggregate_failures do
+ result = subject
+
+ expect(result).to be_success
+ expect(result.payload).to eq(changes_exist: true, empty_versions: true)
+ end
+
+ context 'with an xml without a release version' do
+ let(:version_release) { nil }
+
+ it 'returns a success', :aggregate_failures do
+ result = subject
+
+ expect(result).to be_success
+ expect(result.payload).to eq(changes_exist: true, empty_versions: true)
+ end
+ end
+ end
+
+ context 'with differences in both sides' do
+ let(:shared_versions) { %w[1.3 2.0-SNAPSHOT 1.6 1.4 1.5-SNAPSHOT] }
+ let(:additional_versions_in_xml) { %w[5.5 5.6 5.7-SNAPSHOT] }
+ let(:versions_in_xml) { shared_versions + additional_versions_in_xml }
+ let(:additional_versions_in_database) { %w[6.5 6.6 6.7-SNAPSHOT] }
+ let(:versions_in_database) { shared_versions + additional_versions_in_database }
+
+ it_behaves_like 'returning an xml with versions in the database'
+ end
+
+ context 'with a new release and latest from the database' do
+ let(:versions_in_database) { versions_in_xml + %w[4.1 4.2-SNAPSHOT] }
+
+ it_behaves_like 'returning an xml with', release: '4.1', latest: nil
+
+ context 'with a latest in the xml' do
+ let(:version_latest) { '1.6' }
+
+ it_behaves_like 'returning an xml with', release: '4.1', latest: '4.2-SNAPSHOT'
+ end
+ end
+
+ context 'with release and latest not existing in the database' do
+ let(:version_release) { '7.0' }
+ let(:version_latest) { '8.0-SNAPSHOT' }
+
+ it_behaves_like 'returning an xml with', release: '1.4', latest: '1.5-SNAPSHOT'
+ end
+
+ context 'with added versions in the database side no more recent than release' do
+ let(:versions_in_database) { versions_in_xml + %w[4.1 4.2-SNAPSHOT] }
+
+ before do
+ ::Packages::Package.find_by(name: package.name, version: '4.1').update!(created_at: 2.weeks.ago)
+ ::Packages::Package.find_by(name: package.name, version: '4.2-SNAPSHOT').update!(created_at: 2.weeks.ago)
+ end
+
+ it_behaves_like 'returning an xml with', release: '1.4', latest: nil
+
+ context 'with a latest in the xml' do
+ let(:version_latest) { '1.6' }
+
+ it_behaves_like 'returning an xml with', release: '1.4', latest: '1.5-SNAPSHOT'
+ end
+ end
+
+ context 'only snapshot versions are in the database' do
+ let(:versions_in_database) { %w[4.2-SNAPSHOT] }
+
+ it_behaves_like 'returning an xml with', release: nil, latest: nil
+
+ it 'returns an xml without any release element' do
+ result = subject
+
+ xml_doc = Nokogiri::XML(result.payload[:metadata_content])
+ expect(xml_doc.xpath('//metadata/versioning/release')).to be_empty
+ end
+ end
+
+ context 'last updated timestamp' do
+ let(:versions_in_database) { versions_in_xml + %w[4.1 4.2-SNAPSHOT] }
+
+ it 'updates the last updated timestamp' do
+ original = last_updated_from(metadata_xml)
+
+ result = subject
+
+ expect(result).to be_success
+ expect(original).not_to eq(last_updated_from(result.payload[:metadata_content]))
+ end
+ end
+
+ context 'with an incomplete metadata content' do
+ let(:metadata_xml) { '<metadata></metadata>' }
+
+ it_behaves_like 'returning an error service response', message: 'metadata_content is invalid'
+ end
+
+ context 'with an invalid metadata content' do
+ let(:metadata_xml) { '<meta></metadata>' }
+
+ it_behaves_like 'returning an error service response', message: 'metadata_content is invalid'
+ end
+
+ context 'with metadata content pointing to a file' do
+ let(:service) { described_class.new(metadata_content: file, package: package) }
+ let(:file) do
+ Tempfile.new('metadata').tap do |file|
+ if file_contents
+ file.write(file_contents)
+ file.flush
+ file.rewind
+ end
+ end
+ end
+
+ after do
+ file.close
+ file.unlink
+ end
+
+ context 'with valid content' do
+ let(:file_contents) { metadata_xml }
+
+ it 'returns no changes' do
+ result = subject
+
+ expect(result).to be_success
+ expect(result.payload).to eq(changes_exist: false, empty_versions: false)
+ end
+ end
+
+ context 'with invalid content' do
+ let(:file_contents) { '<meta></metadata>' }
+
+ it_behaves_like 'returning an error service response', message: 'metadata_content is invalid'
+ end
+
+ context 'with no content' do
+ let(:file_contents) { nil }
+
+ it_behaves_like 'returning an error service response', message: 'metadata_content is invalid'
+ end
+ end
+
+ context 'with no package' do
+ let(:metadata_xml) { '' }
+ let(:package) { nil }
+
+ it_behaves_like 'returning an error service response', message: 'package not set'
+ end
+
+ context 'with no metadata content' do
+ let(:metadata_xml) { nil }
+
+ it_behaves_like 'returning an error service response', message: 'metadata_content not set'
+ end
+ end
+
+ def metadata_xml
+ Nokogiri::XML::Builder.new do |xml|
+ xml.metadata do
+ xml.groupId(package.maven_metadatum.app_group)
+ xml.artifactId(package.maven_metadatum.app_name)
+ xml.versioning do
+ xml.release(version_release) if version_release
+ xml.latest(version_latest) if version_latest
+ xml.lastUpdated('20210113130531')
+ xml.versions do
+ versions_in_xml.each do |version|
+ xml.version(version)
+ end
+ end
+ end
+ end
+ end.to_xml
+ end
+
+ def versions_from(xml_content)
+ doc = Nokogiri::XML(xml_content)
+ doc.xpath('//metadata/versioning/versions/version').map(&:content)
+ end
+
+ def release_from(xml_content)
+ doc = Nokogiri::XML(xml_content)
+ doc.xpath('//metadata/versioning/release').first&.content
+ end
+
+ def latest_from(xml_content)
+ doc = Nokogiri::XML(xml_content)
+ doc.xpath('//metadata/versioning/latest').first&.content
+ end
+
+ def last_updated_from(xml_content)
+ doc = Nokogiri::XML(xml_content)
+ doc.xpath('//metadata/versioning/lastUpdated').first.content
+ end
+end
diff --git a/spec/services/packages/maven/metadata/sync_service_spec.rb b/spec/services/packages/maven/metadata/sync_service_spec.rb
new file mode 100644
index 00000000000..be298e95236
--- /dev/null
+++ b/spec/services/packages/maven/metadata/sync_service_spec.rb
@@ -0,0 +1,154 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ::Packages::Maven::Metadata::SyncService do
+ using RSpec::Parameterized::TableSyntax
+
+ let_it_be(:project) { create(:project) }
+ let_it_be(:user) { create(:user) }
+ let_it_be_with_reload(:versionless_package_for_versions) { create(:maven_package, name: 'test', version: nil, project: project) }
+ let_it_be_with_reload(:metadata_file_for_versions) { create(:package_file, :xml, package: versionless_package_for_versions) }
+
+ let(:service) { described_class.new(container: project, current_user: user, params: { package_name: versionless_package_for_versions.name }) }
+
+ describe '#execute' do
+ let(:create_versions_xml_service_double) { double(::Packages::Maven::Metadata::CreateVersionsXmlService, execute: create_versions_xml_service_response) }
+ let(:append_package_file_service_double) { double(::Packages::Maven::Metadata::AppendPackageFileService, execute: append_package_file_service_response) }
+
+ let(:create_versions_xml_service_response) { ServiceResponse.success(payload: { changes_exist: true, empty_versions: false, metadata_content: 'test' }) }
+ let(:append_package_file_service_response) { ServiceResponse.success(message: 'New metadata package files created') }
+
+ subject { service.execute }
+
+ before do
+ allow(::Packages::Maven::Metadata::CreateVersionsXmlService)
+ .to receive(:new).with(metadata_content: an_instance_of(ObjectStorage::Concern::OpenFile), package: versionless_package_for_versions).and_return(create_versions_xml_service_double)
+ allow(::Packages::Maven::Metadata::AppendPackageFileService)
+ .to receive(:new).with(metadata_content: an_instance_of(String), package: versionless_package_for_versions).and_return(append_package_file_service_double)
+ end
+
+ context 'permissions' do
+ where(:role, :expected_result) do
+ :anonymous | :rejected
+ :developer | :rejected
+ :maintainer | :accepted
+ end
+
+ with_them do
+ if params[:role] == :anonymous
+ let_it_be(:user) { nil }
+ end
+
+ before do
+ project.send("add_#{role}", user) unless role == :anonymous
+ end
+
+ if params[:expected_result] == :rejected
+ it_behaves_like 'returning an error service response', message: 'Not allowed'
+ else
+ it_behaves_like 'returning a success service response', message: 'New metadata package files created'
+ end
+ end
+ end
+
+ context 'with a maintainer' do
+ before do
+ project.add_maintainer(user)
+ end
+
+ context 'with no changes' do
+ let(:create_versions_xml_service_response) { ServiceResponse.success(payload: { changes_exist: false }) }
+
+ before do
+ expect(::Packages::Maven::Metadata::AppendPackageFileService).not_to receive(:new)
+ end
+
+ it_behaves_like 'returning a success service response', message: 'No changes for versions xml'
+ end
+
+ context 'with changes' do
+ let(:create_versions_xml_service_response) { ServiceResponse.success(payload: { changes_exist: true, empty_versions: false, metadata_content: 'new metadata' }) }
+
+ it_behaves_like 'returning a success service response', message: 'New metadata package files created'
+
+ context 'with empty versions' do
+ let(:create_versions_xml_service_response) { ServiceResponse.success(payload: { changes_exist: true, empty_versions: true }) }
+
+ before do
+ expect(service.send(:versionless_package_for_versions)).to receive(:destroy!)
+ expect(::Packages::Maven::Metadata::AppendPackageFileService).not_to receive(:new)
+ end
+
+ it_behaves_like 'returning a success service response', message: 'Versionless package for versions destroyed'
+ end
+ end
+
+ context 'with a too big maven metadata file for versions' do
+ before do
+ metadata_file_for_versions.update!(size: 100.megabytes)
+ end
+
+ it_behaves_like 'returning an error service response', message: 'Metadata file for versions is too big'
+ end
+
+ context 'an error from the create versions xml service' do
+ let(:create_versions_xml_service_response) { ServiceResponse.error(message: 'metadata_content is invalid') }
+
+ before do
+ expect(::Packages::Maven::Metadata::AppendPackageFileService).not_to receive(:new)
+ end
+
+ it_behaves_like 'returning an error service response', message: 'metadata_content is invalid'
+ end
+
+ context 'an error from the append package file service' do
+ let(:append_package_file_service_response) { ServiceResponse.error(message: 'metadata content is not set') }
+
+ it_behaves_like 'returning an error service response', message: 'metadata content is not set'
+ end
+
+ context 'without a package name' do
+ let(:service) { described_class.new(container: project, current_user: user, params: { package_name: nil }) }
+
+ before do
+ expect(::Packages::Maven::Metadata::AppendPackageFileService).not_to receive(:new)
+ expect(::Packages::Maven::Metadata::CreateVersionsXmlService).not_to receive(:new)
+ end
+
+ it_behaves_like 'returning an error service response', message: 'Blank package name'
+ end
+
+ context 'without a versionless package for version' do
+ before do
+ versionless_package_for_versions.update!(version: '2.2.2')
+ expect(::Packages::Maven::Metadata::AppendPackageFileService).not_to receive(:new)
+ expect(::Packages::Maven::Metadata::CreateVersionsXmlService).not_to receive(:new)
+ end
+
+ it_behaves_like 'returning an error service response', message: 'Non existing versionless package'
+ end
+
+ context 'without a metadata package file for versions' do
+ before do
+ versionless_package_for_versions.package_files.update_all(file_name: 'test.txt')
+ expect(::Packages::Maven::Metadata::AppendPackageFileService).not_to receive(:new)
+ expect(::Packages::Maven::Metadata::CreateVersionsXmlService).not_to receive(:new)
+ end
+
+ it_behaves_like 'returning an error service response', message: 'Non existing metadata file for versions'
+ end
+
+ context 'without a project' do
+ let(:service) { described_class.new(container: nil, current_user: user, params: { package_name: versionless_package_for_versions.name }) }
+
+ before do
+ expect(::Packages::Maven::Metadata::AppendPackageFileService).not_to receive(:new)
+ expect(::Packages::Maven::Metadata::CreateVersionsXmlService).not_to receive(:new)
+ end
+
+ it_behaves_like 'returning an error service response', message: 'Not allowed'
+ end
+ end
+ end
+end
diff --git a/spec/services/packages/npm/create_package_service_spec.rb b/spec/services/packages/npm/create_package_service_spec.rb
index 10fce6c1651..ba5729eaf59 100644
--- a/spec/services/packages/npm/create_package_service_spec.rb
+++ b/spec/services/packages/npm/create_package_service_spec.rb
@@ -15,7 +15,7 @@ RSpec.describe Packages::Npm::CreatePackageService do
end
let(:override) { {} }
- let(:package_name) { "@#{namespace.path}/my-app".freeze }
+ let(:package_name) { "@#{namespace.path}/my-app" }
subject { described_class.new(project, user, params).execute }
@@ -42,29 +42,35 @@ RSpec.describe Packages::Npm::CreatePackageService do
it { expect(subject.name).to eq(package_name) }
it { expect(subject.version).to eq(version) }
+
+ context 'with build info' do
+ let(:job) { create(:ci_build, user: user) }
+ let(:params) { super().merge(build: job) }
+
+ it_behaves_like 'assigns build to package'
+ it_behaves_like 'assigns status to package'
+
+ it 'creates a package file build info' do
+ expect { subject }.to change { Packages::PackageFileBuildInfo.count }.by(1)
+ end
+ end
end
describe '#execute' do
context 'scoped package' do
it_behaves_like 'valid package'
+ end
- context 'with build info' do
- let(:job) { create(:ci_build, user: user) }
- let(:params) { super().merge(build: job) }
-
- it_behaves_like 'assigns build to package'
- it_behaves_like 'assigns status to package'
+ context 'scoped package not following the naming convention' do
+ let(:package_name) { '@any-scope/package' }
- it 'creates a package file build info' do
- expect { subject }.to change { Packages::PackageFileBuildInfo.count }.by(1)
- end
- end
+ it_behaves_like 'valid package'
end
- context 'invalid package name' do
- let(:package_name) { "@#{namespace.path}/my-group/my-app".freeze }
+ context 'unscoped package' do
+ let(:package_name) { 'unscoped-package' }
- it { expect { subject }.to raise_error(ActiveRecord::RecordInvalid) }
+ it_behaves_like 'valid package'
end
context 'package already exists' do
@@ -84,11 +90,18 @@ RSpec.describe Packages::Npm::CreatePackageService do
it { expect(subject[:message]).to be 'File is too large.' }
end
- context 'with incorrect namespace' do
- let(:package_name) { '@my_other_namespace/my-app' }
-
- it 'raises a RecordInvalid error' do
- expect { subject }.to raise_error(ActiveRecord::RecordInvalid)
+ [
+ '@inv@lid_scope/package',
+ '@scope/sub/group',
+ '@scope/../../package',
+ '@scope%2e%2e%2fpackage'
+ ].each do |invalid_package_name|
+ context "with invalid name #{invalid_package_name}" do
+ let(:package_name) { invalid_package_name }
+
+ it 'raises a RecordInvalid error' do
+ expect { subject }.to raise_error(ActiveRecord::RecordInvalid)
+ end
end
end
diff --git a/spec/services/packages/nuget/create_package_service_spec.rb b/spec/services/packages/nuget/create_package_service_spec.rb
deleted file mode 100644
index e338ac36fc3..00000000000
--- a/spec/services/packages/nuget/create_package_service_spec.rb
+++ /dev/null
@@ -1,37 +0,0 @@
-# frozen_string_literal: true
-require 'spec_helper'
-
-RSpec.describe Packages::Nuget::CreatePackageService do
- let_it_be(:project) { create(:project) }
- let_it_be(:user) { create(:user) }
- let_it_be(:params) { {} }
-
- describe '#execute' do
- subject { described_class.new(project, user, params).execute }
-
- let(:package) { Packages::Package.last }
-
- it 'creates the package' do
- expect { subject }.to change { Packages::Package.count }.by(1)
-
- expect(package).to be_valid
- expect(package.name).to eq(Packages::Nuget::CreatePackageService::TEMPORARY_PACKAGE_NAME)
- expect(package.version).to start_with(Packages::Nuget::CreatePackageService::PACKAGE_VERSION)
- expect(package.package_type).to eq('nuget')
- end
-
- it 'can create two packages in a row' do
- expect { subject }.to change { Packages::Package.count }.by(1)
- expect { described_class.new(project, user, params).execute }.to change { Packages::Package.count }.by(1)
-
- expect(package).to be_valid
- expect(package.name).to eq(Packages::Nuget::CreatePackageService::TEMPORARY_PACKAGE_NAME)
- expect(package.version).to start_with(Packages::Nuget::CreatePackageService::PACKAGE_VERSION)
- expect(package.package_type).to eq('nuget')
- end
-
- it_behaves_like 'assigns the package creator'
- it_behaves_like 'assigns build to package'
- it_behaves_like 'assigns status to package'
- end
-end
diff --git a/spec/services/packages/nuget/update_package_from_metadata_service_spec.rb b/spec/services/packages/nuget/update_package_from_metadata_service_spec.rb
index 92b493ed376..c1cce46a54c 100644
--- a/spec/services/packages/nuget/update_package_from_metadata_service_spec.rb
+++ b/spec/services/packages/nuget/update_package_from_metadata_service_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe Packages::Nuget::UpdatePackageFromMetadataService, :clean_gitlab_redis_shared_state do
include ExclusiveLeaseHelpers
- let(:package) { create(:nuget_package) }
+ let(:package) { create(:nuget_package, :processing) }
let(:package_file) { package.package_files.first }
let(:service) { described_class.new(package_file) }
let(:package_name) { 'DummyProject.DummyPackage' }
@@ -60,6 +60,7 @@ RSpec.describe Packages::Nuget::UpdatePackageFromMetadataService, :clean_gitlab_
.to change { ::Packages::Package.count }.by(0)
.and change { Packages::DependencyLink.count }.by(0)
expect(package_file.reload.file_name).not_to eq(package_file_name)
+ expect(package_file.package).to be_processing
expect(package_file.package.reload.name).not_to eq(package_name)
expect(package_file.package.version).not_to eq(package_version)
end
@@ -78,6 +79,7 @@ RSpec.describe Packages::Nuget::UpdatePackageFromMetadataService, :clean_gitlab_
expect(package.reload.name).to eq(package_name)
expect(package.version).to eq(package_version)
+ expect(package).to be_default
expect(package_file.reload.file_name).to eq(package_file_name)
# hard reset needed to properly reload package_file.file
expect(Packages::PackageFile.find(package_file.id).file.size).not_to eq 0
@@ -184,6 +186,7 @@ RSpec.describe Packages::Nuget::UpdatePackageFromMetadataService, :clean_gitlab_
expect(package.reload.name).to eq(package_name)
expect(package.version).to eq(package_version)
+ expect(package).to be_default
expect(package_file.reload.file_name).to eq(package_file_name)
# hard reset needed to properly reload package_file.file
expect(Packages::PackageFile.find(package_file.id).file.size).not_to eq 0
diff --git a/spec/services/packages/rubygems/dependency_resolver_service_spec.rb b/spec/services/packages/rubygems/dependency_resolver_service_spec.rb
new file mode 100644
index 00000000000..206bffe53f8
--- /dev/null
+++ b/spec/services/packages/rubygems/dependency_resolver_service_spec.rb
@@ -0,0 +1,100 @@
+# frozen_string_literal: true
+require 'spec_helper'
+
+RSpec.describe Packages::Rubygems::DependencyResolverService do
+ let_it_be(:project) { create(:project, :private) }
+ let_it_be(:package) { create(:package, project: project) }
+ let_it_be(:user) { create(:user) }
+ let(:gem_name) { package.name }
+ let(:service) { described_class.new(project, user, gem_name: gem_name) }
+
+ describe '#execute' do
+ subject { service.execute }
+
+ context 'user without access' do
+ it 'returns a service error' do
+ expect(subject.error?).to be(true)
+ expect(subject.message).to eq('forbidden')
+ end
+ end
+
+ context 'user with access' do
+ before do
+ project.add_developer(user)
+ end
+
+ context 'when no package is found' do
+ let(:gem_name) { nil }
+
+ it 'returns a service error', :aggregate_failures do
+ expect(subject.error?).to be(true)
+ expect(subject.message).to eq("#{gem_name} not found")
+ end
+ end
+
+ context 'package without dependencies' do
+ it 'returns an empty dependencies array' do
+ expected_result = [{
+ name: package.name,
+ number: package.version,
+ platform: described_class::DEFAULT_PLATFORM,
+ dependencies: []
+ }]
+
+ expect(subject.payload).to eq(expected_result)
+ end
+ end
+
+ context 'package with dependencies' do
+ let(:dependency_link) { create(:packages_dependency_link, :rubygems, package: package)}
+ let(:dependency_link2) { create(:packages_dependency_link, :rubygems, package: package)}
+ let(:dependency_link3) { create(:packages_dependency_link, :rubygems, package: package)}
+
+ it 'returns a set of dependencies' do
+ expected_result = [{
+ name: package.name,
+ number: package.version,
+ platform: described_class::DEFAULT_PLATFORM,
+ dependencies: [
+ [dependency_link.dependency.name, dependency_link.dependency.version_pattern],
+ [dependency_link2.dependency.name, dependency_link2.dependency.version_pattern],
+ [dependency_link3.dependency.name, dependency_link3.dependency.version_pattern]
+ ]
+ }]
+
+ expect(subject.payload).to eq(expected_result)
+ end
+ end
+
+ context 'package with multiple versions' do
+ let(:dependency_link) { create(:packages_dependency_link, :rubygems, package: package)}
+ let(:dependency_link2) { create(:packages_dependency_link, :rubygems, package: package)}
+ let(:dependency_link3) { create(:packages_dependency_link, :rubygems, package: package)}
+ let(:package2) { create(:package, project: project, name: package.name, version: '9.9.9') }
+ let(:dependency_link4) { create(:packages_dependency_link, :rubygems, package: package2)}
+
+ it 'returns a set of dependencies' do
+ expected_result = [{
+ name: package.name,
+ number: package.version,
+ platform: described_class::DEFAULT_PLATFORM,
+ dependencies: [
+ [dependency_link.dependency.name, dependency_link.dependency.version_pattern],
+ [dependency_link2.dependency.name, dependency_link2.dependency.version_pattern],
+ [dependency_link3.dependency.name, dependency_link3.dependency.version_pattern]
+ ]
+ }, {
+ name: package2.name,
+ number: package2.version,
+ platform: described_class::DEFAULT_PLATFORM,
+ dependencies: [
+ [dependency_link4.dependency.name, dependency_link4.dependency.version_pattern]
+ ]
+ }]
+
+ expect(subject.payload).to eq(expected_result)
+ end
+ end
+ end
+ end
+end
diff --git a/spec/services/pages/legacy_storage_lease_spec.rb b/spec/services/pages/legacy_storage_lease_spec.rb
index c022da6f47f..092dce093ff 100644
--- a/spec/services/pages/legacy_storage_lease_spec.rb
+++ b/spec/services/pages/legacy_storage_lease_spec.rb
@@ -47,14 +47,6 @@ RSpec.describe ::Pages::LegacyStorageLease do
expect(service.execute).to eq(nil)
end
-
- it 'runs guarded method if feature flag is disabled' do
- stub_feature_flags(pages_use_legacy_storage_lease: false)
-
- expect(service).to receive(:execute_unsafe).and_call_original
-
- expect(service.execute).to eq(true)
- end
end
context 'when another service holds the lease for the different project' do
diff --git a/spec/services/projects/alerting/notify_service_spec.rb b/spec/services/projects/alerting/notify_service_spec.rb
index 4e366fce0d9..c272ce13132 100644
--- a/spec/services/projects/alerting/notify_service_spec.rb
+++ b/spec/services/projects/alerting/notify_service_spec.rb
@@ -119,6 +119,7 @@ RSpec.describe Projects::Alerting::NotifyService do
end
it_behaves_like 'does not an create alert management alert'
+ it_behaves_like 'creates single system note based on the source of the alert'
context 'auto_close_enabled setting enabled' do
let(:auto_close_enabled) { true }
@@ -131,6 +132,8 @@ RSpec.describe Projects::Alerting::NotifyService do
expect(alert.ended_at).to eql(ended_at)
end
+ it_behaves_like 'creates status-change system note for an auto-resolved alert'
+
context 'related issue exists' do
let(:alert) { create(:alert_management_alert, :with_issue, project: project, fingerprint: fingerprint_sha) }
let(:issue) { alert.issue }
@@ -209,10 +212,7 @@ RSpec.describe Projects::Alerting::NotifyService do
)
end
- it 'creates a system note corresponding to alert creation' do
- expect { subject }.to change(Note, :count).by(1)
- expect(Note.last.note).to include(source)
- end
+ it_behaves_like 'creates single system note based on the source of the alert'
end
end
diff --git a/spec/services/projects/branches_by_mode_service_spec.rb b/spec/services/projects/branches_by_mode_service_spec.rb
index 9199c3e0b3a..e8bcda8a9c4 100644
--- a/spec/services/projects/branches_by_mode_service_spec.rb
+++ b/spec/services/projects/branches_by_mode_service_spec.rb
@@ -20,7 +20,7 @@ RSpec.describe Projects::BranchesByModeService do
branches, prev_page, next_page = subject
- expect(branches.size).to eq(10)
+ expect(branches.size).to eq(11)
expect(next_page).to be_nil
expect(prev_page).to eq("/#{project.full_path}/-/branches/all?offset=2&page=3")
end
@@ -99,7 +99,7 @@ RSpec.describe Projects::BranchesByModeService do
it 'returns branches after the specified branch' do
branches, prev_page, next_page = subject
- expect(branches.size).to eq(14)
+ expect(branches.size).to eq(15)
expect(next_page).to be_nil
expect(prev_page).to eq("/#{project.full_path}/-/branches/all?offset=3&page=4&sort=name_asc")
end
diff --git a/spec/services/projects/create_service_spec.rb b/spec/services/projects/create_service_spec.rb
index f7da6f75141..306d87eefb8 100644
--- a/spec/services/projects/create_service_spec.rb
+++ b/spec/services/projects/create_service_spec.rb
@@ -349,27 +349,38 @@ RSpec.describe Projects::CreateService, '#execute' do
context 'default visibility level' do
let(:group) { create(:group, :private) }
- before do
- stub_application_setting(default_project_visibility: Gitlab::VisibilityLevel::INTERNAL)
- group.add_developer(user)
+ using RSpec::Parameterized::TableSyntax
- opts.merge!(
- visibility: 'private',
- name: 'test',
- namespace: group,
- path: 'foo'
- )
+ where(:case_name, :group_level, :project_level) do
+ [
+ ['in public group', Gitlab::VisibilityLevel::PUBLIC, Gitlab::VisibilityLevel::INTERNAL],
+ ['in internal group', Gitlab::VisibilityLevel::INTERNAL, Gitlab::VisibilityLevel::INTERNAL],
+ ['in private group', Gitlab::VisibilityLevel::PRIVATE, Gitlab::VisibilityLevel::PRIVATE]
+ ]
end
- it 'creates a private project' do
- project = create_project(user, opts)
+ with_them do
+ before do
+ stub_application_setting(default_project_visibility: Gitlab::VisibilityLevel::INTERNAL)
+ group.add_developer(user)
+ group.update!(visibility_level: group_level)
- expect(project).to respond_to(:errors)
+ opts.merge!(
+ name: 'test',
+ namespace: group,
+ path: 'foo'
+ )
+ end
- expect(project.errors.any?).to be(false)
- expect(project.visibility_level).to eq(Gitlab::VisibilityLevel::PRIVATE)
- expect(project.saved?).to be(true)
- expect(project.valid?).to be(true)
+ it 'creates project with correct visibility level', :aggregate_failures do
+ project = create_project(user, opts)
+
+ expect(project).to respond_to(:errors)
+ expect(project.errors).to be_blank
+ expect(project.visibility_level).to eq(project_level)
+ expect(project).to be_saved
+ expect(project).to be_valid
+ end
end
end
diff --git a/spec/services/projects/destroy_service_spec.rb b/spec/services/projects/destroy_service_spec.rb
index 75d1c98923a..5410e784cc0 100644
--- a/spec/services/projects/destroy_service_spec.rb
+++ b/spec/services/projects/destroy_service_spec.rb
@@ -31,9 +31,34 @@ RSpec.describe Projects::DestroyService, :aggregate_failures do
end
shared_examples 'deleting the project with pipeline and build' do
- context 'with pipeline and build', :sidekiq_inline do # which has optimistic locking
+ context 'with pipeline and build related records', :sidekiq_inline do # which has optimistic locking
let!(:pipeline) { create(:ci_pipeline, project: project) }
- let!(:build) { create(:ci_build, :artifacts, pipeline: pipeline) }
+ let!(:build) { create(:ci_build, :artifacts, :with_runner_session, pipeline: pipeline) }
+ let!(:trace_chunks) { create(:ci_build_trace_chunk, build: build) }
+ let!(:job_variables) { create(:ci_job_variable, job: build) }
+ let!(:report_result) { create(:ci_build_report_result, build: build) }
+ let!(:pending_state) { create(:ci_build_pending_state, build: build) }
+
+ it 'deletes build related records' do
+ expect { destroy_project(project, user, {}) }.to change { Ci::Build.count }.by(-1)
+ .and change { Ci::BuildTraceChunk.count }.by(-1)
+ .and change { Ci::JobArtifact.count }.by(-2)
+ .and change { Ci::JobVariable.count }.by(-1)
+ .and change { Ci::BuildPendingState.count }.by(-1)
+ .and change { Ci::BuildReportResult.count }.by(-1)
+ .and change { Ci::BuildRunnerSession.count }.by(-1)
+ end
+
+ it 'avoids N+1 queries', skip: 'skipped until fixed in https://gitlab.com/gitlab-org/gitlab/-/issues/24644' do
+ recorder = ActiveRecord::QueryRecorder.new { destroy_project(project, user, {}) }
+
+ project = create(:project, :repository, namespace: user.namespace)
+ pipeline = create(:ci_pipeline, project: project)
+ builds = create_list(:ci_build, 3, :artifacts, pipeline: pipeline)
+ create_list(:ci_build_trace_chunk, 3, build: builds[0])
+
+ expect { destroy_project(project, project.owner, {}) }.not_to exceed_query_limit(recorder)
+ end
it_behaves_like 'deleting the project'
end
@@ -60,357 +85,343 @@ RSpec.describe Projects::DestroyService, :aggregate_failures do
end
end
- shared_examples 'project destroy' do
- it_behaves_like 'deleting the project'
+ it_behaves_like 'deleting the project'
- it 'invalidates personal_project_count cache' do
- expect(user).to receive(:invalidate_personal_projects_count)
+ it 'invalidates personal_project_count cache' do
+ expect(user).to receive(:invalidate_personal_projects_count)
- destroy_project(project, user, {})
+ destroy_project(project, user, {})
+ end
+
+ it 'performs cancel for project ci pipelines' do
+ expect(::Ci::AbortProjectPipelinesService).to receive_message_chain(:new, :execute).with(project)
+
+ destroy_project(project, user, {})
+ end
+
+ context 'when project has remote mirrors' do
+ let!(:project) do
+ create(:project, :repository, namespace: user.namespace).tap do |project|
+ project.remote_mirrors.create!(url: 'http://test.com')
+ end
end
- it 'performs cancel for project ci pipelines' do
- expect(::Ci::AbortProjectPipelinesService).to receive_message_chain(:new, :execute).with(project)
+ it 'destroys them' do
+ expect(RemoteMirror.count).to eq(1)
destroy_project(project, user, {})
+
+ expect(RemoteMirror.count).to eq(0)
end
+ end
- context 'when project has remote mirrors' do
- let!(:project) do
- create(:project, :repository, namespace: user.namespace).tap do |project|
- project.remote_mirrors.create!(url: 'http://test.com')
- end
+ context 'when project has exports' do
+ let!(:project_with_export) do
+ create(:project, :repository, namespace: user.namespace).tap do |project|
+ create(:import_export_upload,
+ project: project,
+ export_file: fixture_file_upload('spec/fixtures/project_export.tar.gz'))
end
+ end
- it 'destroys them' do
- expect(RemoteMirror.count).to eq(1)
-
- destroy_project(project, user, {})
+ it 'destroys project and export' do
+ expect do
+ destroy_project(project_with_export, user, {})
+ end.to change(ImportExportUpload, :count).by(-1)
- expect(RemoteMirror.count).to eq(0)
- end
+ expect(Project.all).not_to include(project_with_export)
end
+ end
- context 'when project has exports' do
- let!(:project_with_export) do
- create(:project, :repository, namespace: user.namespace).tap do |project|
- create(:import_export_upload,
- project: project,
- export_file: fixture_file_upload('spec/fixtures/project_export.tar.gz'))
- end
- end
+ context 'Sidekiq fake' do
+ before do
+ # Dont run sidekiq to check if renamed repository exists
+ Sidekiq::Testing.fake! { destroy_project(project, user, {}) }
+ end
- it 'destroys project and export' do
- expect do
- destroy_project(project_with_export, user, {})
- end.to change(ImportExportUpload, :count).by(-1)
+ it { expect(Project.all).not_to include(project) }
- expect(Project.all).not_to include(project_with_export)
- end
+ it do
+ expect(project.gitlab_shell.repository_exists?(project.repository_storage, path + '.git')).to be_falsey
end
- context 'Sidekiq fake' do
- before do
- # Dont run sidekiq to check if renamed repository exists
- Sidekiq::Testing.fake! { destroy_project(project, user, {}) }
- end
+ it do
+ expect(project.gitlab_shell.repository_exists?(project.repository_storage, remove_path + '.git')).to be_truthy
+ end
+ end
- it { expect(Project.all).not_to include(project) }
+ context 'when flushing caches fail due to Git errors' do
+ before do
+ allow(project.repository).to receive(:before_delete).and_raise(::Gitlab::Git::CommandError)
+ allow(Gitlab::GitLogger).to receive(:warn).with(
+ class: Repositories::DestroyService.name,
+ container_id: project.id,
+ disk_path: project.disk_path,
+ message: 'Gitlab::Git::CommandError').and_call_original
+ end
- it do
- expect(project.gitlab_shell.repository_exists?(project.repository_storage, path + '.git')).to be_falsey
- end
+ it_behaves_like 'deleting the project'
+ end
- it do
- expect(project.gitlab_shell.repository_exists?(project.repository_storage, remove_path + '.git')).to be_truthy
- end
+ context 'when flushing caches fail due to Redis' do
+ before do
+ new_user = create(:user)
+ project.team.add_user(new_user, Gitlab::Access::DEVELOPER)
+ allow_any_instance_of(described_class).to receive(:flush_caches).and_raise(::Redis::CannotConnectError)
end
- context 'when flushing caches fail due to Git errors' do
- before do
- allow(project.repository).to receive(:before_delete).and_raise(::Gitlab::Git::CommandError)
- allow(Gitlab::GitLogger).to receive(:warn).with(
- class: Repositories::DestroyService.name,
- container_id: project.id,
- disk_path: project.disk_path,
- message: 'Gitlab::Git::CommandError').and_call_original
+ it 'keeps project team intact upon an error' do
+ perform_enqueued_jobs do
+ destroy_project(project, user, {})
+ rescue ::Redis::CannotConnectError
end
- it_behaves_like 'deleting the project'
+ expect(project.team.members.count).to eq 2
end
+ end
+
+ context 'with async_execute', :sidekiq_inline do
+ let(:async) { true }
- context 'when flushing caches fail due to Redis' do
+ context 'async delete of project with private issue visibility' do
before do
- new_user = create(:user)
- project.team.add_user(new_user, Gitlab::Access::DEVELOPER)
- allow_any_instance_of(described_class).to receive(:flush_caches).and_raise(::Redis::CannotConnectError)
+ project.project_feature.update_attribute("issues_access_level", ProjectFeature::PRIVATE)
end
- it 'keeps project team intact upon an error' do
- perform_enqueued_jobs do
- destroy_project(project, user, {})
- rescue ::Redis::CannotConnectError
- end
-
- expect(project.team.members.count).to eq 2
- end
+ it_behaves_like 'deleting the project'
end
- context 'with async_execute', :sidekiq_inline do
- let(:async) { true }
+ it_behaves_like 'deleting the project with pipeline and build'
- context 'async delete of project with private issue visibility' do
+ context 'errors' do
+ context 'when `remove_legacy_registry_tags` fails' do
before do
- project.project_feature.update_attribute("issues_access_level", ProjectFeature::PRIVATE)
+ expect_any_instance_of(described_class)
+ .to receive(:remove_legacy_registry_tags).and_return(false)
end
- it_behaves_like 'deleting the project'
+ it_behaves_like 'handles errors thrown during async destroy', "Failed to remove some tags"
end
- it_behaves_like 'deleting the project with pipeline and build'
-
- context 'errors' do
- context 'when `remove_legacy_registry_tags` fails' do
- before do
- expect_any_instance_of(described_class)
- .to receive(:remove_legacy_registry_tags).and_return(false)
- end
-
- it_behaves_like 'handles errors thrown during async destroy', "Failed to remove some tags"
+ context 'when `remove_repository` fails' do
+ before do
+ expect_any_instance_of(described_class)
+ .to receive(:remove_repository).and_return(false)
end
- context 'when `remove_repository` fails' do
- before do
- expect_any_instance_of(described_class)
- .to receive(:remove_repository).and_return(false)
- end
+ it_behaves_like 'handles errors thrown during async destroy', "Failed to remove project repository"
+ end
- it_behaves_like 'handles errors thrown during async destroy', "Failed to remove project repository"
+ context 'when `execute` raises expected error' do
+ before do
+ expect_any_instance_of(Project)
+ .to receive(:destroy!).and_raise(StandardError.new("Other error message"))
end
- context 'when `execute` raises expected error' do
- before do
- expect_any_instance_of(Project)
- .to receive(:destroy!).and_raise(StandardError.new("Other error message"))
- end
+ it_behaves_like 'handles errors thrown during async destroy', "Other error message"
+ end
- it_behaves_like 'handles errors thrown during async destroy', "Other error message"
+ context 'when `execute` raises unexpected error' do
+ before do
+ expect_any_instance_of(Project)
+ .to receive(:destroy!).and_raise(Exception.new('Other error message'))
end
- context 'when `execute` raises unexpected error' do
- before do
- expect_any_instance_of(Project)
- .to receive(:destroy!).and_raise(Exception.new('Other error message'))
- end
+ it 'allows error to bubble up and rolls back project deletion' do
+ expect do
+ destroy_project(project, user, {})
+ end.to raise_error(Exception, 'Other error message')
- it 'allows error to bubble up and rolls back project deletion' do
- expect do
- destroy_project(project, user, {})
- end.to raise_error(Exception, 'Other error message')
-
- expect(project.reload.pending_delete).to be(false)
- expect(project.delete_error).to include("Other error message")
- end
+ expect(project.reload.pending_delete).to be(false)
+ expect(project.delete_error).to include("Other error message")
end
end
end
+ end
- describe 'container registry' do
- context 'when there are regular container repositories' do
- let(:container_repository) { create(:container_repository) }
+ describe 'container registry' do
+ context 'when there are regular container repositories' do
+ let(:container_repository) { create(:container_repository) }
- before do
- stub_container_registry_tags(repository: project.full_path + '/image',
- tags: ['tag'])
- project.container_repositories << container_repository
- end
+ before do
+ stub_container_registry_tags(repository: project.full_path + '/image',
+ tags: ['tag'])
+ project.container_repositories << container_repository
+ end
- context 'when image repository deletion succeeds' do
- it 'removes tags' do
- expect_any_instance_of(ContainerRepository)
- .to receive(:delete_tags!).and_return(true)
+ context 'when image repository deletion succeeds' do
+ it 'removes tags' do
+ expect_any_instance_of(ContainerRepository)
+ .to receive(:delete_tags!).and_return(true)
- destroy_project(project, user)
- end
+ destroy_project(project, user)
end
+ end
- context 'when image repository deletion fails' do
- it 'raises an exception' do
- expect_any_instance_of(ContainerRepository)
- .to receive(:delete_tags!).and_raise(RuntimeError)
+ context 'when image repository deletion fails' do
+ it 'raises an exception' do
+ expect_any_instance_of(ContainerRepository)
+ .to receive(:delete_tags!).and_raise(RuntimeError)
- expect(destroy_project(project, user)).to be false
- end
+ expect(destroy_project(project, user)).to be false
end
+ end
- context 'when registry is disabled' do
- before do
- stub_container_registry_config(enabled: false)
- end
+ context 'when registry is disabled' do
+ before do
+ stub_container_registry_config(enabled: false)
+ end
- it 'does not attempting to remove any tags' do
- expect(Projects::ContainerRepository::DestroyService).not_to receive(:new)
+ it 'does not attempting to remove any tags' do
+ expect(Projects::ContainerRepository::DestroyService).not_to receive(:new)
- destroy_project(project, user)
- end
+ destroy_project(project, user)
end
end
+ end
- context 'when there are tags for legacy root repository' do
- before do
- stub_container_registry_tags(repository: project.full_path,
- tags: ['tag'])
- end
+ context 'when there are tags for legacy root repository' do
+ before do
+ stub_container_registry_tags(repository: project.full_path,
+ tags: ['tag'])
+ end
- context 'when image repository tags deletion succeeds' do
- it 'removes tags' do
- expect_any_instance_of(ContainerRepository)
- .to receive(:delete_tags!).and_return(true)
+ context 'when image repository tags deletion succeeds' do
+ it 'removes tags' do
+ expect_any_instance_of(ContainerRepository)
+ .to receive(:delete_tags!).and_return(true)
- destroy_project(project, user)
- end
+ destroy_project(project, user)
end
+ end
- context 'when image repository tags deletion fails' do
- it 'raises an exception' do
- expect_any_instance_of(ContainerRepository)
- .to receive(:delete_tags!).and_return(false)
+ context 'when image repository tags deletion fails' do
+ it 'raises an exception' do
+ expect_any_instance_of(ContainerRepository)
+ .to receive(:delete_tags!).and_return(false)
- expect(destroy_project(project, user)).to be false
- end
+ expect(destroy_project(project, user)).to be false
end
end
end
+ end
- context 'for a forked project with LFS objects' do
- let(:forked_project) { fork_project(project, user) }
+ context 'for a forked project with LFS objects' do
+ let(:forked_project) { fork_project(project, user) }
- before do
- project.lfs_objects << create(:lfs_object)
- forked_project.reload
- end
+ before do
+ project.lfs_objects << create(:lfs_object)
+ forked_project.reload
+ end
- it 'destroys the fork' do
- expect { destroy_project(forked_project, user) }
- .not_to raise_error
- end
+ it 'destroys the fork' do
+ expect { destroy_project(forked_project, user) }
+ .not_to raise_error
end
+ end
- context 'as the root of a fork network' do
- let!(:fork_1) { fork_project(project, user) }
- let!(:fork_2) { fork_project(project, user) }
+ context 'as the root of a fork network' do
+ let!(:fork_1) { fork_project(project, user) }
+ let!(:fork_2) { fork_project(project, user) }
- it 'updates the fork network with the project name' do
- fork_network = project.fork_network
+ it 'updates the fork network with the project name' do
+ fork_network = project.fork_network
- destroy_project(project, user)
+ destroy_project(project, user)
- fork_network.reload
+ fork_network.reload
- expect(fork_network.deleted_root_project_name).to eq(project.full_name)
- expect(fork_network.root_project).to be_nil
- end
+ expect(fork_network.deleted_root_project_name).to eq(project.full_name)
+ expect(fork_network.root_project).to be_nil
end
+ end
- context 'repository +deleted path removal' do
- context 'regular phase' do
- it 'schedules +deleted removal of existing repos' do
- service = described_class.new(project, user, {})
- allow(service).to receive(:schedule_stale_repos_removal)
+ context 'repository +deleted path removal' do
+ context 'regular phase' do
+ it 'schedules +deleted removal of existing repos' do
+ service = described_class.new(project, user, {})
+ allow(service).to receive(:schedule_stale_repos_removal)
- expect(Repositories::ShellDestroyService).to receive(:new).and_call_original
- expect(GitlabShellWorker).to receive(:perform_in)
- .with(5.minutes, :remove_repository, project.repository_storage, removal_path(project.disk_path))
+ expect(Repositories::ShellDestroyService).to receive(:new).and_call_original
+ expect(GitlabShellWorker).to receive(:perform_in)
+ .with(5.minutes, :remove_repository, project.repository_storage, removal_path(project.disk_path))
- service.execute
- end
+ service.execute
end
+ end
- context 'stale cleanup' do
- let(:async) { true }
+ context 'stale cleanup' do
+ let(:async) { true }
- it 'schedules +deleted wiki and repo removal' do
- allow(ProjectDestroyWorker).to receive(:perform_async)
+ it 'schedules +deleted wiki and repo removal' do
+ allow(ProjectDestroyWorker).to receive(:perform_async)
- expect(Repositories::ShellDestroyService).to receive(:new).with(project.repository).and_call_original
- expect(GitlabShellWorker).to receive(:perform_in)
- .with(10.minutes, :remove_repository, project.repository_storage, removal_path(project.disk_path))
+ expect(Repositories::ShellDestroyService).to receive(:new).with(project.repository).and_call_original
+ expect(GitlabShellWorker).to receive(:perform_in)
+ .with(10.minutes, :remove_repository, project.repository_storage, removal_path(project.disk_path))
- expect(Repositories::ShellDestroyService).to receive(:new).with(project.wiki.repository).and_call_original
- expect(GitlabShellWorker).to receive(:perform_in)
- .with(10.minutes, :remove_repository, project.repository_storage, removal_path(project.wiki.disk_path))
+ expect(Repositories::ShellDestroyService).to receive(:new).with(project.wiki.repository).and_call_original
+ expect(GitlabShellWorker).to receive(:perform_in)
+ .with(10.minutes, :remove_repository, project.repository_storage, removal_path(project.wiki.disk_path))
- destroy_project(project, user, {})
- end
+ destroy_project(project, user, {})
end
end
+ end
- context 'snippets' do
- let!(:snippet1) { create(:project_snippet, project: project, author: user) }
- let!(:snippet2) { create(:project_snippet, project: project, author: user) }
-
- it 'does not include snippets when deleting in batches' do
- expect(project).to receive(:destroy_dependent_associations_in_batches).with({ exclude: [:container_repositories, :snippets] })
+ context 'snippets' do
+ let!(:snippet1) { create(:project_snippet, project: project, author: user) }
+ let!(:snippet2) { create(:project_snippet, project: project, author: user) }
- destroy_project(project, user)
- end
+ it 'does not include snippets when deleting in batches' do
+ expect(project).to receive(:destroy_dependent_associations_in_batches).with({ exclude: [:container_repositories, :snippets] })
- it 'calls the bulk snippet destroy service' do
- expect(project.snippets.count).to eq 2
+ destroy_project(project, user)
+ end
- expect(Snippets::BulkDestroyService).to receive(:new)
- .with(user, project.snippets).and_call_original
+ it 'calls the bulk snippet destroy service' do
+ expect(project.snippets.count).to eq 2
- expect do
- destroy_project(project, user)
- end.to change(Snippet, :count).by(-2)
- end
+ expect(Snippets::BulkDestroyService).to receive(:new)
+ .with(user, project.snippets).and_call_original
- context 'when an error is raised deleting snippets' do
- it 'does not delete project' do
- allow_next_instance_of(Snippets::BulkDestroyService) do |instance|
- allow(instance).to receive(:execute).and_return(ServiceResponse.error(message: 'foo'))
- end
-
- expect(destroy_project(project, user)).to be_falsey
- expect(project.gitlab_shell.repository_exists?(project.repository_storage, path + '.git')).to be_truthy
- end
- end
+ expect do
+ destroy_project(project, user)
+ end.to change(Snippet, :count).by(-2)
end
- context 'error while destroying', :sidekiq_inline do
- let!(:pipeline) { create(:ci_pipeline, project: project) }
- let!(:builds) { create_list(:ci_build, 2, :artifacts, pipeline: pipeline) }
- let!(:build_trace) { create(:ci_build_trace_chunk, build: builds[0]) }
-
- it 'deletes on retry' do
- # We can expect this to timeout for very large projects
- # TODO: remove allow_next_instance_of: https://gitlab.com/gitlab-org/gitlab/-/issues/220440
- allow_any_instance_of(Ci::Build).to receive(:destroy).and_raise('boom')
- destroy_project(project, user, {})
-
- allow_any_instance_of(Ci::Build).to receive(:destroy).and_call_original
- destroy_project(project, user, {})
+ context 'when an error is raised deleting snippets' do
+ it 'does not delete project' do
+ allow_next_instance_of(Snippets::BulkDestroyService) do |instance|
+ allow(instance).to receive(:execute).and_return(ServiceResponse.error(message: 'foo'))
+ end
- expect(Project.unscoped.all).not_to include(project)
- expect(project.gitlab_shell.repository_exists?(project.repository_storage, path + '.git')).to be_falsey
- expect(project.gitlab_shell.repository_exists?(project.repository_storage, remove_path + '.git')).to be_falsey
- expect(project.all_pipelines).to be_empty
- expect(project.builds).to be_empty
+ expect(destroy_project(project, user)).to be_falsey
+ expect(project.gitlab_shell.repository_exists?(project.repository_storage, path + '.git')).to be_truthy
end
end
end
- context 'when project_transactionless_destroy enabled' do
- it_behaves_like 'project destroy'
- end
+ context 'error while destroying', :sidekiq_inline do
+ let!(:pipeline) { create(:ci_pipeline, project: project) }
+ let!(:builds) { create_list(:ci_build, 2, :artifacts, pipeline: pipeline) }
+ let!(:build_trace) { create(:ci_build_trace_chunk, build: builds[0]) }
- context 'when project_transactionless_destroy disabled', :sidekiq_inline do
- before do
- stub_feature_flags(project_transactionless_destroy: false)
- end
+ it 'deletes on retry' do
+ # We can expect this to timeout for very large projects
+ # TODO: remove allow_next_instance_of: https://gitlab.com/gitlab-org/gitlab/-/issues/220440
+ allow_any_instance_of(Ci::Build).to receive(:destroy).and_raise('boom')
+ destroy_project(project, user, {})
+
+ allow_any_instance_of(Ci::Build).to receive(:destroy).and_call_original
+ destroy_project(project, user, {})
- it_behaves_like 'project destroy'
+ expect(Project.unscoped.all).not_to include(project)
+ expect(project.gitlab_shell.repository_exists?(project.repository_storage, path + '.git')).to be_falsey
+ expect(project.gitlab_shell.repository_exists?(project.repository_storage, remove_path + '.git')).to be_falsey
+ expect(project.all_pipelines).to be_empty
+ expect(project.builds).to be_empty
+ end
end
def destroy_project(project, user, params = {})
diff --git a/spec/services/projects/schedule_bulk_repository_shard_moves_service_spec.rb b/spec/services/projects/schedule_bulk_repository_shard_moves_service_spec.rb
index 15c9d1e5925..2dc4a56368b 100644
--- a/spec/services/projects/schedule_bulk_repository_shard_moves_service_spec.rb
+++ b/spec/services/projects/schedule_bulk_repository_shard_moves_service_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe Projects::ScheduleBulkRepositoryShardMovesService do
it_behaves_like 'moves repository shard in bulk' do
let_it_be_with_reload(:container) { create(:project, :repository).tap { |project| project.track_project_repository } }
- let(:move_service_klass) { ProjectRepositoryStorageMove }
- let(:bulk_worker_klass) { ::ProjectScheduleBulkRepositoryShardMovesWorker }
+ let(:move_service_klass) { Projects::RepositoryStorageMove }
+ let(:bulk_worker_klass) { ::Projects::ScheduleBulkRepositoryShardMovesWorker }
end
end
diff --git a/spec/services/projects/update_pages_configuration_service_spec.rb b/spec/services/projects/update_pages_configuration_service_spec.rb
index 294de813e02..9ef66a10f0d 100644
--- a/spec/services/projects/update_pages_configuration_service_spec.rb
+++ b/spec/services/projects/update_pages_configuration_service_spec.rb
@@ -26,11 +26,18 @@ RSpec.describe Projects::UpdatePagesConfigurationService do
context 'when configuration changes' do
it 'updates the config and reloads the daemon' do
- allow(service).to receive(:update_file).and_call_original
-
expect(service).to receive(:update_file).with(file.path, an_instance_of(String))
.and_call_original
- expect(service).to receive(:reload_daemon).and_call_original
+ allow(service).to receive(:update_file).with(File.join(::Settings.pages.path, '.update'),
+ an_instance_of(String)).and_call_original
+
+ expect(subject).to include(status: :success)
+ end
+
+ it "doesn't update configuration files if updates on legacy storage are disabled" do
+ stub_feature_flags(pages_update_legacy_storage: false)
+
+ expect(service).not_to receive(:update_file)
expect(subject).to include(status: :success)
end
@@ -42,8 +49,8 @@ RSpec.describe Projects::UpdatePagesConfigurationService do
service.execute
end
- it 'does not update the .update file' do
- expect(service).not_to receive(:reload_daemon)
+ it 'does not update anything' do
+ expect(service).not_to receive(:update_file)
expect(subject).to include(status: :success)
end
diff --git a/spec/services/projects/update_pages_service_spec.rb b/spec/services/projects/update_pages_service_spec.rb
index 6bf2876f640..b735f4b6bc2 100644
--- a/spec/services/projects/update_pages_service_spec.rb
+++ b/spec/services/projects/update_pages_service_spec.rb
@@ -335,6 +335,41 @@ RSpec.describe Projects::UpdatePagesService do
end
end
+ context 'when retrying the job' do
+ let!(:older_deploy_job) do
+ create(:generic_commit_status, :failed, pipeline: pipeline,
+ ref: build.ref,
+ stage: 'deploy',
+ name: 'pages:deploy')
+ end
+
+ before do
+ create(:ci_job_artifact, :correct_checksum, file: file, job: build)
+ create(:ci_job_artifact, file_type: :metadata, file_format: :gzip, file: metadata, job: build)
+ build.reload
+ end
+
+ it 'marks older pages:deploy jobs retried' do
+ expect(execute).to eq(:success)
+
+ expect(older_deploy_job.reload).to be_retried
+ end
+
+ context 'when FF ci_fix_commit_status_retried is disabled' do
+ before do
+ stub_feature_flags(ci_fix_commit_status_retried: false)
+ end
+
+ it 'does not mark older pages:deploy jobs retried' do
+ expect(execute).to eq(:success)
+
+ expect(older_deploy_job.reload).not_to be_retried
+ end
+ end
+ end
+
+ private
+
def deploy_status
GenericCommitStatus.find_by(name: 'pages:deploy')
end
diff --git a/spec/services/projects/update_service_spec.rb b/spec/services/projects/update_service_spec.rb
index a59b6adf346..b9e909e8615 100644
--- a/spec/services/projects/update_service_spec.rb
+++ b/spec/services/projects/update_service_spec.rb
@@ -551,7 +551,7 @@ RSpec.describe Projects::UpdateService do
expect(project).to be_repository_read_only
expect(project.repository_storage_moves.last).to have_attributes(
- state: ::ProjectRepositoryStorageMove.state_machines[:state].states[:scheduled].value,
+ state: ::Projects::RepositoryStorageMove.state_machines[:state].states[:scheduled].value,
source_storage_name: 'default',
destination_storage_name: 'test_second_storage'
)
diff --git a/spec/services/quick_actions/interpret_service_spec.rb b/spec/services/quick_actions/interpret_service_spec.rb
index 1a102b125f6..bf35e72a037 100644
--- a/spec/services/quick_actions/interpret_service_spec.rb
+++ b/spec/services/quick_actions/interpret_service_spec.rb
@@ -1949,6 +1949,100 @@ RSpec.describe QuickActions::InterpretService do
end
end
end
+
+ context 'invite_email command' do
+ let_it_be(:issuable) { issue }
+
+ it_behaves_like 'empty command', "No email participants were added. Either none were provided, or they already exist." do
+ let(:content) { '/invite_email' }
+ end
+
+ context 'with existing email participant' do
+ let(:content) { '/invite_email a@gitlab.com' }
+
+ before do
+ issuable.issue_email_participants.create!(email: "a@gitlab.com")
+ end
+
+ it_behaves_like 'empty command', "No email participants were added. Either none were provided, or they already exist."
+ end
+
+ context 'with new email participants' do
+ let(:content) { '/invite_email a@gitlab.com b@gitlab.com' }
+
+ subject(:add_emails) { service.execute(content, issuable) }
+
+ it 'returns message' do
+ _, _, message = add_emails
+
+ expect(message).to eq('Added a@gitlab.com and b@gitlab.com.')
+ end
+
+ it 'adds 2 participants' do
+ expect { add_emails }.to change { issue.issue_email_participants.count }.by(2)
+ end
+
+ context 'with mixed case email' do
+ let(:content) { '/invite_email FirstLast@GitLab.com' }
+
+ it 'returns correctly cased message' do
+ _, _, message = add_emails
+
+ expect(message).to eq('Added FirstLast@GitLab.com.')
+ end
+ end
+
+ context 'with invalid email' do
+ let(:content) { '/invite_email a@gitlab.com bad_email' }
+
+ it 'only adds valid emails' do
+ expect { add_emails }.to change { issue.issue_email_participants.count }.by(1)
+ end
+ end
+
+ context 'with existing email' do
+ let(:content) { '/invite_email a@gitlab.com existing@gitlab.com' }
+
+ it 'only adds new emails' do
+ issue.issue_email_participants.create!(email: 'existing@gitlab.com')
+
+ expect { add_emails }.to change { issue.issue_email_participants.count }.by(1)
+ end
+
+ it 'only adds new (case insensitive) emails' do
+ issue.issue_email_participants.create!(email: 'EXISTING@gitlab.com')
+
+ expect { add_emails }.to change { issue.issue_email_participants.count }.by(1)
+ end
+ end
+
+ context 'with duplicate email' do
+ let(:content) { '/invite_email a@gitlab.com a@gitlab.com' }
+
+ it 'only adds unique new emails' do
+ expect { add_emails }.to change { issue.issue_email_participants.count }.by(1)
+ end
+ end
+
+ context 'with more than 6 emails' do
+ let(:content) { '/invite_email a@gitlab.com b@gitlab.com c@gitlab.com d@gitlab.com e@gitlab.com f@gitlab.com g@gitlab.com' }
+
+ it 'only adds 6 new emails' do
+ expect { add_emails }.to change { issue.issue_email_participants.count }.by(6)
+ end
+ end
+
+ context 'with feature flag disabled' do
+ before do
+ stub_feature_flags(issue_email_participants: false)
+ end
+
+ it 'does not add any participants' do
+ expect { add_emails }.not_to change { issue.issue_email_participants.count }
+ end
+ end
+ end
+ end
end
describe '#explain' do
diff --git a/spec/services/repositories/changelog_service_spec.rb b/spec/services/repositories/changelog_service_spec.rb
index a545b0f070a..dab38445ccf 100644
--- a/spec/services/repositories/changelog_service_spec.rb
+++ b/spec/services/repositories/changelog_service_spec.rb
@@ -4,48 +4,64 @@ require 'spec_helper'
RSpec.describe Repositories::ChangelogService do
describe '#execute' do
- it 'generates and commits a changelog section' do
- project = create(:project, :empty_repo)
- creator = project.creator
- author1 = create(:user)
- author2 = create(:user)
-
- project.add_maintainer(author1)
- project.add_maintainer(author2)
-
- mr1 = create(:merge_request, :merged, target_project: project)
- mr2 = create(:merge_request, :merged, target_project: project)
-
- # The range of commits ignores the first commit, but includes the last
- # commit. To ensure both the commits below are included, we must create an
- # extra commit.
- #
- # In the real world, the start commit of the range will be the last commit
- # of the previous release, so ignoring that is expected and desired.
- sha1 = create_commit(
+ let!(:project) { create(:project, :empty_repo) }
+ let!(:creator) { project.creator }
+ let!(:author1) { create(:user) }
+ let!(:author2) { create(:user) }
+ let!(:mr1) { create(:merge_request, :merged, target_project: project) }
+ let!(:mr2) { create(:merge_request, :merged, target_project: project) }
+
+ # The range of commits ignores the first commit, but includes the last
+ # commit. To ensure both the commits below are included, we must create an
+ # extra commit.
+ #
+ # In the real world, the start commit of the range will be the last commit
+ # of the previous release, so ignoring that is expected and desired.
+ let!(:sha1) do
+ create_commit(
project,
creator,
commit_message: 'Initial commit',
actions: [{ action: 'create', content: 'test', file_path: 'README.md' }]
)
+ end
+
+ let!(:sha2) do
+ project.add_maintainer(author1)
- sha2 = create_commit(
+ create_commit(
project,
author1,
commit_message: "Title 1\n\nChangelog: feature",
actions: [{ action: 'create', content: 'foo', file_path: 'a.txt' }]
)
+ end
+
+ let!(:sha3) do
+ project.add_maintainer(author2)
- sha3 = create_commit(
+ create_commit(
project,
author2,
commit_message: "Title 2\n\nChangelog: feature",
actions: [{ action: 'create', content: 'bar', file_path: 'b.txt' }]
)
+ end
- commit1 = project.commit(sha2)
- commit2 = project.commit(sha3)
+ let!(:sha4) do
+ create_commit(
+ project,
+ author2,
+ commit_message: "Title 3\n\nChangelog: feature",
+ actions: [{ action: 'create', content: 'bar', file_path: 'c.txt' }]
+ )
+ end
+ let!(:commit1) { project.commit(sha2) }
+ let!(:commit2) { project.commit(sha3) }
+ let!(:commit3) { project.commit(sha4) }
+
+ it 'generates and commits a changelog section' do
allow(MergeRequestDiffCommit)
.to receive(:oldest_merge_request_id_per_commit)
.with(project.id, [commit2.id, commit1.id])
@@ -54,16 +70,60 @@ RSpec.describe Repositories::ChangelogService do
{ sha: sha3, merge_request_id: mr2.id }
])
- recorder = ActiveRecord::QueryRecorder.new do
- described_class
- .new(project, creator, version: '1.0.0', from: sha1, to: sha3)
- .execute
- end
+ service = described_class
+ .new(project, creator, version: '1.0.0', from: sha1, to: sha3)
+
+ recorder = ActiveRecord::QueryRecorder.new { service.execute }
+ changelog = project.repository.blob_at('master', 'CHANGELOG.md')&.data
+
+ expect(recorder.count).to eq(11)
+ expect(changelog).to include('Title 1', 'Title 2')
+ end
+
+ it "ignores a commit when it's both added and reverted in the same range" do
+ create_commit(
+ project,
+ author2,
+ commit_message: "Title 4\n\nThis reverts commit #{sha4}",
+ actions: [{ action: 'create', content: 'bar', file_path: 'd.txt' }]
+ )
+
+ described_class
+ .new(project, creator, version: '1.0.0', from: sha1)
+ .execute
changelog = project.repository.blob_at('master', 'CHANGELOG.md')&.data
- expect(recorder.count).to eq(10)
expect(changelog).to include('Title 1', 'Title 2')
+ expect(changelog).not_to include('Title 3', 'Title 4')
+ end
+
+ it 'includes a revert commit when it has a trailer' do
+ create_commit(
+ project,
+ author2,
+ commit_message: "Title 4\n\nThis reverts commit #{sha4}\n\nChangelog: added",
+ actions: [{ action: 'create', content: 'bar', file_path: 'd.txt' }]
+ )
+
+ described_class
+ .new(project, creator, version: '1.0.0', from: sha1)
+ .execute
+
+ changelog = project.repository.blob_at('master', 'CHANGELOG.md')&.data
+
+ expect(changelog).to include('Title 1', 'Title 2', 'Title 4')
+ expect(changelog).not_to include('Title 3')
+ end
+
+ it 'uses the target branch when "to" is unspecified' do
+ described_class
+ .new(project, creator, version: '1.0.0', from: sha1)
+ .execute
+
+ changelog = project.repository.blob_at('master', 'CHANGELOG.md')&.data
+
+ expect(changelog).to include('Title 1', 'Title 2', 'Title 3')
end
end
diff --git a/spec/services/snippets/schedule_bulk_repository_shard_moves_service_spec.rb b/spec/services/snippets/schedule_bulk_repository_shard_moves_service_spec.rb
index 764c7f94a46..9286d73ed4a 100644
--- a/spec/services/snippets/schedule_bulk_repository_shard_moves_service_spec.rb
+++ b/spec/services/snippets/schedule_bulk_repository_shard_moves_service_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe Snippets::ScheduleBulkRepositoryShardMovesService do
it_behaves_like 'moves repository shard in bulk' do
let_it_be_with_reload(:container) { create(:snippet, :repository) }
- let(:move_service_klass) { SnippetRepositoryStorageMove }
- let(:bulk_worker_klass) { ::SnippetScheduleBulkRepositoryShardMovesWorker }
+ let(:move_service_klass) { Snippets::RepositoryStorageMove }
+ let(:bulk_worker_klass) { ::Snippets::ScheduleBulkRepositoryShardMovesWorker }
end
end
diff --git a/spec/services/system_hooks_service_spec.rb b/spec/services/system_hooks_service_spec.rb
index 1ec5237370f..446325e5f71 100644
--- a/spec/services/system_hooks_service_spec.rb
+++ b/spec/services/system_hooks_service_spec.rb
@@ -149,9 +149,6 @@ RSpec.describe SystemHooksService do
it { expect(event_name(project, :rename)).to eq "project_rename" }
it { expect(event_name(project, :transfer)).to eq "project_transfer" }
it { expect(event_name(project, :update)).to eq "project_update" }
- it { expect(event_name(project_member, :create)).to eq "user_add_to_team" }
- it { expect(event_name(project_member, :destroy)).to eq "user_remove_from_team" }
- it { expect(event_name(project_member, :update)).to eq "user_update_for_team" }
it { expect(event_name(key, :create)).to eq 'key_create' }
it { expect(event_name(key, :destroy)).to eq 'key_destroy' }
end
diff --git a/spec/services/system_note_service_spec.rb b/spec/services/system_note_service_spec.rb
index df4880dfa13..54cef164f1c 100644
--- a/spec/services/system_note_service_spec.rb
+++ b/spec/services/system_note_service_spec.rb
@@ -779,4 +779,17 @@ RSpec.describe SystemNoteService do
described_class.change_incident_severity(incident, author)
end
end
+
+ describe '.log_resolving_alert' do
+ let(:alert) { build(:alert_management_alert) }
+ let(:monitoring_tool) { 'Prometheus' }
+
+ it 'calls AlertManagementService' do
+ expect_next_instance_of(SystemNotes::AlertManagementService) do |service|
+ expect(service).to receive(:log_resolving_alert).with(monitoring_tool)
+ end
+
+ described_class.log_resolving_alert(alert, monitoring_tool)
+ end
+ end
end
diff --git a/spec/services/system_notes/alert_management_service_spec.rb b/spec/services/system_notes/alert_management_service_spec.rb
index 4ebaa54534c..fc71799d8c5 100644
--- a/spec/services/system_notes/alert_management_service_spec.rb
+++ b/spec/services/system_notes/alert_management_service_spec.rb
@@ -59,4 +59,17 @@ RSpec.describe ::SystemNotes::AlertManagementService do
expect(subject.note).to eq("changed the status to **Resolved** by closing issue #{issue.to_reference(project)}")
end
end
+
+ describe '#log_resolving_alert' do
+ subject { described_class.new(noteable: noteable, project: project).log_resolving_alert('Some Service') }
+
+ it_behaves_like 'a system note' do
+ let(:author) { User.alert_bot }
+ let(:action) { 'new_alert_added' }
+ end
+
+ it 'has the appropriate message' do
+ expect(subject.note).to eq('logged a resolving alert from **Some Service**')
+ end
+ end
end
diff --git a/spec/services/system_notes/merge_requests_service_spec.rb b/spec/services/system_notes/merge_requests_service_spec.rb
index 2131f3d3bdf..58d2489f878 100644
--- a/spec/services/system_notes/merge_requests_service_spec.rb
+++ b/spec/services/system_notes/merge_requests_service_spec.rb
@@ -189,7 +189,7 @@ RSpec.describe ::SystemNotes::MergeRequestsService do
subject { service.change_branch('target', 'delete', old_branch, new_branch) }
it 'sets the note text' do
- expect(subject.note).to eq "changed automatically target branch to `#{new_branch}` because `#{old_branch}` was deleted"
+ expect(subject.note).to eq "deleted the `#{old_branch}` branch. This merge request now targets the `#{new_branch}` branch"
end
end
diff --git a/spec/services/users/dismiss_user_callout_service_spec.rb b/spec/services/users/dismiss_user_callout_service_spec.rb
new file mode 100644
index 00000000000..22f84a939f7
--- /dev/null
+++ b/spec/services/users/dismiss_user_callout_service_spec.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Users::DismissUserCalloutService do
+ let(:user) { create(:user) }
+
+ let(:service) do
+ described_class.new(
+ container: nil, current_user: user, params: { feature_name: UserCallout.feature_names.each_key.first }
+ )
+ end
+
+ describe '#execute' do
+ subject(:execute) { service.execute }
+
+ it 'returns a user callout' do
+ expect(execute).to be_an_instance_of(UserCallout)
+ end
+
+ it 'sets the dismisse_at attribute to current time' do
+ freeze_time do
+ expect(execute).to have_attributes(dismissed_at: Time.current)
+ end
+ end
+ end
+end
diff --git a/spec/services/users/refresh_authorized_projects_service_spec.rb b/spec/services/users/refresh_authorized_projects_service_spec.rb
index cc01b22f9d2..1e74ff3d9eb 100644
--- a/spec/services/users/refresh_authorized_projects_service_spec.rb
+++ b/spec/services/users/refresh_authorized_projects_service_spec.rb
@@ -152,9 +152,13 @@ RSpec.describe Users::RefreshAuthorizedProjectsService do
expect(Gitlab::AppJsonLogger).to(
receive(:info)
.with(event: 'authorized_projects_refresh',
+ user_id: user.id,
'authorized_projects_refresh.source': source,
- 'authorized_projects_refresh.rows_deleted': 0,
- 'authorized_projects_refresh.rows_added': 1))
+ 'authorized_projects_refresh.rows_deleted_count': 0,
+ 'authorized_projects_refresh.rows_added_count': 1,
+ 'authorized_projects_refresh.rows_deleted_slice': [],
+ 'authorized_projects_refresh.rows_added_slice': [[user.id, project.id, Gitlab::Access::MAINTAINER]])
+ )
service.update_authorizations([], [[user.id, project.id, Gitlab::Access::MAINTAINER]])
end
diff --git a/spec/spam/concerns/has_spam_action_response_fields_spec.rb b/spec/spam/concerns/has_spam_action_response_fields_spec.rb
new file mode 100644
index 00000000000..4d5f8d9d431
--- /dev/null
+++ b/spec/spam/concerns/has_spam_action_response_fields_spec.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Spam::Concerns::HasSpamActionResponseFields do
+ subject do
+ klazz = Class.new
+ klazz.include described_class
+ klazz.new
+ end
+
+ describe '#with_spam_action_response_fields' do
+ let(:spam_log) { double(:spam_log, id: 1) }
+ let(:spammable) { double(:spammable, spam?: true, render_recaptcha?: true, spam_log: spam_log) }
+ let(:recaptcha_site_key) { 'abc123' }
+
+ before do
+ allow(Gitlab::CurrentSettings).to receive(:recaptcha_site_key) { recaptcha_site_key }
+ end
+
+ it 'merges in spam action fields from spammable' do
+ result = subject.send(:with_spam_action_response_fields, spammable) do
+ { other_field: true }
+ end
+ expect(result)
+ .to eq({
+ spam: true,
+ needs_captcha_response: true,
+ spam_log_id: 1,
+ captcha_site_key: recaptcha_site_key,
+ other_field: true
+ })
+ end
+ end
+end
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 64c1479a412..87bb3ea842c 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -180,6 +180,8 @@ RSpec.configure do |config|
end
if ENV['FLAKY_RSPEC_GENERATE_REPORT']
+ require_relative '../tooling/rspec_flaky/listener'
+
config.reporter.register_listener(
RspecFlaky::Listener.new,
:example_passed,
@@ -244,14 +246,17 @@ RSpec.configure do |config|
stub_feature_flags(unified_diff_components: false)
+ # Disable this feature flag as we iterate and
+ # refactor filtered search to use gitlab ui
+ # components to meet feature parody. More details found
+ # https://gitlab.com/groups/gitlab-org/-/epics/5501
+ stub_feature_flags(boards_filtered_search: false)
+
allow(Gitlab::GitalyClient).to receive(:can_use_disk?).and_return(enable_rugged)
else
unstub_all_feature_flags
end
- # Enable Marginalia feature for all specs in the test suite.
- Gitlab::Marginalia.enabled = true
-
# Stub these calls due to being expensive operations
# It can be reenabled for specific tests via:
#
diff --git a/spec/support/capybara.rb b/spec/support/capybara.rb
index db198ac9808..be2b41d6997 100644
--- a/spec/support/capybara.rb
+++ b/spec/support/capybara.rb
@@ -79,8 +79,30 @@ Capybara.register_driver :chrome do |app|
)
end
+Capybara.register_driver :firefox do |app|
+ capabilities = Selenium::WebDriver::Remote::Capabilities.firefox(
+ log: {
+ level: :trace
+ }
+ )
+
+ options = Selenium::WebDriver::Firefox::Options.new(log_level: :trace)
+
+ options.add_argument("--window-size=#{CAPYBARA_WINDOW_SIZE.join(',')}")
+
+ # Run headless by default unless WEBDRIVER_HEADLESS specified
+ options.add_argument("--headless") unless ENV['WEBDRIVER_HEADLESS'] =~ /^(false|no|0)$/i
+
+ Capybara::Selenium::Driver.new(
+ app,
+ browser: :firefox,
+ desired_capabilities: capabilities,
+ options: options
+ )
+end
+
Capybara.server = :puma_via_workhorse
-Capybara.javascript_driver = :chrome
+Capybara.javascript_driver = ENV.fetch('WEBDRIVER', :chrome).to_sym
Capybara.default_max_wait_time = timeout
Capybara.ignore_hidden_elements = true
Capybara.default_normalize_ws = true
diff --git a/spec/support/gitlab_experiment.rb b/spec/support/gitlab_experiment.rb
index 45ae9958c52..4015db329fc 100644
--- a/spec/support/gitlab_experiment.rb
+++ b/spec/support/gitlab_experiment.rb
@@ -2,15 +2,30 @@
# Require the provided spec helper and matchers.
require 'gitlab/experiment/rspec'
+require_relative 'stub_snowplow'
# This is a temporary fix until we have a larger discussion around the
# challenges raised in https://gitlab.com/gitlab-org/gitlab/-/issues/300104
-class ApplicationExperiment < Gitlab::Experiment # rubocop:disable Gitlab/NamespacedClass
+class ApplicationExperiment # rubocop:disable Gitlab/NamespacedClass
def initialize(...)
super(...)
Feature.persist_used!(feature_flag_name)
end
+
+ def should_track?
+ true
+ end
end
-# Disable all caching for experiments in tests.
-Gitlab::Experiment::Configuration.cache = nil
+RSpec.configure do |config|
+ config.include StubSnowplow, :experiment
+
+ # Disable all caching for experiments in tests.
+ config.before do
+ allow(Gitlab::Experiment::Configuration).to receive(:cache).and_return(nil)
+ end
+
+ config.before(:each, :experiment) do
+ stub_snowplow
+ end
+end
diff --git a/spec/support/graphql/resolver_factories.rb b/spec/support/graphql/resolver_factories.rb
new file mode 100644
index 00000000000..8188f17cc43
--- /dev/null
+++ b/spec/support/graphql/resolver_factories.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+module Graphql
+ module ResolverFactories
+ def new_resolver(resolved_value = 'Resolved value', method: :resolve)
+ case method
+ when :resolve
+ simple_resolver(resolved_value)
+ when :find_object
+ find_object_resolver(resolved_value)
+ else
+ raise "Cannot build a resolver for #{method}"
+ end
+ end
+
+ private
+
+ def simple_resolver(resolved_value = 'Resolved value')
+ Class.new(Resolvers::BaseResolver) do
+ define_method :resolve do |**_args|
+ resolved_value
+ end
+ end
+ end
+
+ def find_object_resolver(resolved_value = 'Found object')
+ Class.new(Resolvers::BaseResolver) do
+ include ::Gitlab::Graphql::Authorize::AuthorizeResource
+
+ def resolve(**args)
+ authorized_find!(**args)
+ end
+
+ define_method :find_object do |**_args|
+ resolved_value
+ end
+ end
+ end
+ end
+end
diff --git a/spec/support/helpers/cycle_analytics_helpers.rb b/spec/support/helpers/cycle_analytics_helpers.rb
index a90cbbf3bd3..14041ad0ac6 100644
--- a/spec/support/helpers/cycle_analytics_helpers.rb
+++ b/spec/support/helpers/cycle_analytics_helpers.rb
@@ -15,7 +15,7 @@ module CycleAnalyticsHelpers
end
def toggle_dropdown(field)
- page.within("[data-testid='#{field}']") do
+ page.within("[data-testid*='#{field}']") do
find('.dropdown-toggle').click
wait_for_requests
@@ -26,7 +26,7 @@ module CycleAnalyticsHelpers
def select_dropdown_option_by_value(name, value, elem = '.dropdown-item')
toggle_dropdown name
- page.find("[data-testid='#{name}'] .dropdown-menu").find("#{elem}[value='#{value}']").click
+ page.find("[data-testid*='#{name}'] .dropdown-menu").find("#{elem}[value='#{value}']").click
end
def create_commit_referencing_issue(issue, branch_name: generate(:branch))
diff --git a/spec/support/helpers/dependency_proxy_helpers.rb b/spec/support/helpers/dependency_proxy_helpers.rb
index ebb849628bf..0d8f56906e3 100644
--- a/spec/support/helpers/dependency_proxy_helpers.rb
+++ b/spec/support/helpers/dependency_proxy_helpers.rb
@@ -18,11 +18,11 @@ module DependencyProxyHelpers
.to_return(status: status, body: body || manifest, headers: headers)
end
- def stub_manifest_head(image, tag, status: 200, body: nil, digest: '123456')
+ def stub_manifest_head(image, tag, status: 200, body: nil, headers: {})
manifest_url = registry.manifest_url(image, tag)
stub_full_request(manifest_url, method: :head)
- .to_return(status: status, body: body, headers: { 'docker-content-digest' => digest } )
+ .to_return(status: status, body: body, headers: headers )
end
def stub_blob_download(image, blob_sha, status = 200, body = '123456')
diff --git a/spec/support/helpers/design_management_test_helpers.rb b/spec/support/helpers/design_management_test_helpers.rb
index db217250b17..be723a47521 100644
--- a/spec/support/helpers/design_management_test_helpers.rb
+++ b/spec/support/helpers/design_management_test_helpers.rb
@@ -35,7 +35,7 @@ module DesignManagementTestHelpers
def act_on_designs(designs, &block)
issue = designs.first.issue
- version = build(:design_version, :empty, issue: issue).tap { |v| v.save!(validate: false) }
+ version = build(:design_version, designs_count: 0, issue: issue).tap { |v| v.save!(validate: false) }
designs.each do |d|
yield.create!(design: d, version: version)
end
diff --git a/spec/support/helpers/features/releases_helpers.rb b/spec/support/helpers/features/releases_helpers.rb
index 44087f71cfa..9cce9c4882d 100644
--- a/spec/support/helpers/features/releases_helpers.rb
+++ b/spec/support/helpers/features/releases_helpers.rb
@@ -1,9 +1,6 @@
# frozen_string_literal: true
-# These helpers fill fields on the "New Release" and
-# "Edit Release" pages. They use the keyboard to navigate
-# from one field to the next and assume that when
-# they are called, the field to be filled out is already focused.
+# These helpers fill fields on the "New Release" and "Edit Release" pages.
#
# Usage:
# describe "..." do
@@ -18,97 +15,65 @@ module Spec
module Helpers
module Features
module ReleasesHelpers
- # Returns the element that currently has keyboard focus.
- # Reminder that this returns a Selenium::WebDriver::Element
- # _not_ a Capybara::Node::Element
- def focused_element
- page.driver.browser.switch_to.active_element
- end
-
- def fill_tag_name(tag_name, and_tab: true)
- expect(focused_element).to eq(find_field('Tag name').native)
+ def select_new_tag_name(tag_name)
+ page.within '[data-testid="tag-name-field"]' do
+ find('button').click
- focused_element.send_keys(tag_name)
+ wait_for_all_requests
- focused_element.send_keys(:tab) if and_tab
- end
+ find('input[aria-label="Search or create tag"]').set(tag_name)
- def select_create_from(branch_name, and_tab: true)
- expect(focused_element).to eq(find('[data-testid="create-from-field"] button').native)
+ wait_for_all_requests
- focused_element.send_keys(:enter)
+ click_button("Create tag #{tag_name}")
+ end
+ end
- # Wait for the dropdown to be rendered
- page.find('.ref-selector .dropdown-menu')
+ def select_create_from(branch_name)
+ page.within '[data-testid="create-from-field"]' do
+ find('button').click
- # Pressing Enter in the search box shouldn't submit the form
- focused_element.send_keys(branch_name, :enter)
+ wait_for_all_requests
- # Wait for the search to return
- page.find('.ref-selector .dropdown-item', text: branch_name, match: :first)
+ find('input[aria-label="Search branches, tags, and commits"]').set(branch_name)
- focused_element.send_keys(:arrow_down, :enter)
+ wait_for_all_requests
- focused_element.send_keys(:tab) if and_tab
+ click_button("#{branch_name}")
+ end
end
- def fill_release_title(release_title, and_tab: true)
- expect(focused_element).to eq(find_field('Release title').native)
-
- focused_element.send_keys(release_title)
-
- focused_element.send_keys(:tab) if and_tab
+ def fill_release_title(release_title)
+ fill_in('Release title', with: release_title)
end
- def select_milestone(milestone_title, and_tab: true)
- expect(focused_element).to eq(find('[data-testid="milestones-field"] button').native)
-
- focused_element.send_keys(:enter)
+ def select_milestone(milestone_title)
+ page.within '[data-testid="milestones-field"]' do
+ find('button').click
- # Wait for the dropdown to be rendered
- page.find('.milestone-combobox .dropdown-menu')
+ wait_for_all_requests
- # Clear any existing input
- focused_element.attribute('value').length.times { focused_element.send_keys(:backspace) }
+ find('input[aria-label="Search Milestones"]').set(milestone_title)
- # Pressing Enter in the search box shouldn't submit the form
- focused_element.send_keys(milestone_title, :enter)
+ wait_for_all_requests
- # Wait for the search to return
- page.find('.milestone-combobox .dropdown-item', text: milestone_title, match: :first)
-
- focused_element.send_keys(:arrow_down, :arrow_down, :enter)
-
- focused_element.send_keys(:tab) if and_tab
+ find('button', text: milestone_title, match: :first).click
+ end
end
- def fill_release_notes(release_notes, and_tab: true)
- expect(focused_element).to eq(find_field('Release notes').native)
-
- focused_element.send_keys(release_notes)
-
- # Tab past the links at the bottom of the editor
- focused_element.send_keys(:tab, :tab, :tab) if and_tab
+ def fill_release_notes(release_notes)
+ fill_in('Release notes', with: release_notes)
end
- def fill_asset_link(link, and_tab: true)
- expect(focused_element['id']).to start_with('asset-url-')
-
- focused_element.send_keys(link[:url], :tab, link[:title], :tab, link[:type])
-
- # Tab past the "Remove asset link" button
- focused_element.send_keys(:tab, :tab) if and_tab
+ def fill_asset_link(link)
+ all('input[name="asset-url"]').last.set(link[:url])
+ all('input[name="asset-link-name"]').last.set(link[:title])
+ all('select[name="asset-type"]').last.find("option[value=\"#{link[:type]}\"").select_option
end
# Click "Add another link" and tab back to the beginning of the new row
def add_another_asset_link
- expect(focused_element).to eq(find_button('Add another link').native)
-
- focused_element.send_keys(:enter,
- [:shift, :tab],
- [:shift, :tab],
- [:shift, :tab],
- [:shift, :tab])
+ click_button('Add another link')
end
end
end
diff --git a/spec/support/helpers/gpg_helpers.rb b/spec/support/helpers/gpg_helpers.rb
index 389e5818dbe..813c6176317 100644
--- a/spec/support/helpers/gpg_helpers.rb
+++ b/spec/support/helpers/gpg_helpers.rb
@@ -279,6 +279,10 @@ module GpgHelpers
KEY
end
+ def primary_keyid2
+ fingerprint2[-16..-1]
+ end
+
def fingerprint2
'C447A6F6BFD9CEF8FB371785571625A930241179'
end
diff --git a/spec/support/helpers/graphql_helpers.rb b/spec/support/helpers/graphql_helpers.rb
index 46d0c13dc18..75d9508f470 100644
--- a/spec/support/helpers/graphql_helpers.rb
+++ b/spec/support/helpers/graphql_helpers.rb
@@ -16,32 +16,130 @@ module GraphqlHelpers
underscored_field_name.to_s.camelize(:lower)
end
- # Run a loader's named resolver in a way that closely mimics the framework.
+ def self.deep_fieldnamerize(map)
+ map.to_h do |k, v|
+ [fieldnamerize(k), v.is_a?(Hash) ? deep_fieldnamerize(v) : v]
+ end
+ end
+
+ # Run this resolver exactly as it would be called in the framework. This
+ # includes all authorization hooks, all argument processing and all result
+ # wrapping.
+ # see: GraphqlHelpers#resolve_field
+ def resolve(
+ resolver_class, # [Class[<= BaseResolver]] The resolver at test.
+ obj: nil, # [Any] The BaseObject#object for the resolver (available as `#object` in the resolver).
+ args: {}, # [Hash] The arguments to the resolver (using client names).
+ ctx: {}, # [#to_h] The current context values.
+ schema: GitlabSchema, # [GraphQL::Schema] Schema to use during execution.
+ parent: :not_given, # A GraphQL query node to be passed as the `:parent` extra.
+ lookahead: :not_given # A GraphQL lookahead object to be passed as the `:lookahead` extra.
+ )
+ # All resolution goes through fields, so we need to create one here that
+ # uses our resolver. Thankfully, apart from the field name, resolvers
+ # contain all the configuration needed to define one.
+ field_options = resolver_class.field_options.merge(
+ owner: resolver_parent,
+ name: 'field_value'
+ )
+ field = ::Types::BaseField.new(**field_options)
+
+ # All mutations accept a single `:input` argument. Wrap arguments here.
+ # See the unwrapping below in GraphqlHelpers#resolve_field
+ args = { input: args } if resolver_class <= ::Mutations::BaseMutation && !args.key?(:input)
+
+ resolve_field(field, obj,
+ args: args,
+ ctx: ctx,
+ schema: schema,
+ object_type: resolver_parent,
+ extras: { parent: parent, lookahead: lookahead })
+ end
+
+ # Resolve the value of a field on an object.
+ #
+ # Use this method to test individual fields within type specs.
+ #
+ # e.g.
+ #
+ # issue = create(:issue)
+ # user = issue.author
+ # project = issue.project
+ #
+ # resolve_field(:author, issue, current_user: user, object_type: ::Types::IssueType)
+ # resolve_field(:issue, project, args: { iid: issue.iid }, current_user: user, object_type: ::Types::ProjectType)
+ #
+ # The `object_type` defaults to the `described_class`, so when called from type specs,
+ # the above can be written as:
#
- # First the `ready?` method is called. If it turns out that the resolver is not
- # ready, then the early return is returned instead.
+ # # In project_type_spec.rb
+ # resolve_field(:author, issue, current_user: user)
#
- # Then the resolve method is called.
- def resolve(resolver_class, args: {}, lookahead: :not_given, parent: :not_given, **resolver_args)
- args = aliased_args(resolver_class, args)
- args[:parent] = parent unless parent == :not_given
- args[:lookahead] = lookahead unless lookahead == :not_given
- resolver = resolver_instance(resolver_class, **resolver_args)
- ready, early_return = sync_all { resolver.ready?(**args) }
+ # # In issue_type_spec.rb
+ # resolve_field(:issue, project, args: { iid: issue.iid }, current_user: user)
+ #
+ # NB: Arguments are passed from the client's perspective. If there is an argument
+ # `foo` aliased as `bar`, then we would pass `args: { bar: the_value }`, and
+ # types are checked before resolution.
+ def resolve_field(
+ field, # An instance of `BaseField`, or the name of a field on the current described_class
+ object, # The current object of the `BaseObject` this field 'belongs' to
+ args: {}, # Field arguments (keys will be fieldnamerized)
+ ctx: {}, # Context values (important ones are :current_user)
+ extras: {}, # Stub values for field extras (parent and lookahead)
+ current_user: :not_given, # The current user (specified explicitly, overrides ctx[:current_user])
+ schema: GitlabSchema, # A specific schema instance
+ object_type: described_class # The `BaseObject` type this field belongs to
+ )
+ field = to_base_field(field, object_type)
+ ctx[:current_user] = current_user unless current_user == :not_given
+ query = GraphQL::Query.new(schema, context: ctx.to_h)
+ extras[:lookahead] = negative_lookahead if extras[:lookahead] == :not_given && field.extras.include?(:lookahead)
+
+ query_ctx = query.context
+
+ mock_extras(query_ctx, **extras)
+
+ parent = object_type.authorized_new(object, query_ctx)
+ raise UnauthorizedObject unless parent
+
+ # TODO: This will need to change when we move to the interpreter:
+ # At that point, arguments will be a plain ruby hash rather than
+ # an Arguments object
+ # see: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/27536
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/210556
+ arguments = field.to_graphql.arguments_class.new(
+ GraphqlHelpers.deep_fieldnamerize(args),
+ context: query_ctx,
+ defaults_used: []
+ )
+
+ # we enable the request store so we can track gitaly calls.
+ ::Gitlab::WithRequestStore.with_request_store do
+ # TODO: This will need to change when we move to the interpreter - at that
+ # point we will call `field#resolve`
+
+ # Unwrap the arguments to mutations. This pairs with the wrapping in GraphqlHelpers#resolve
+ # If arguments are not wrapped first, then arguments processing will raise.
+ # If arguments are not unwrapped here, then the resolve method of the mutation will raise argument errors.
+ arguments = arguments.to_kwargs[:input] if field.resolver && field.resolver <= ::Mutations::BaseMutation
- return early_return unless ready
+ field.resolve_field(parent, arguments, query_ctx)
+ end
+ end
- resolver.resolve(**args)
+ def mock_extras(context, parent: :not_given, lookahead: :not_given)
+ allow(context).to receive(:parent).and_return(parent) unless parent == :not_given
+ allow(context).to receive(:lookahead).and_return(lookahead) unless lookahead == :not_given
end
- # TODO: Remove this method entirely when GraphqlHelpers uses real resolve_field
- # see: https://gitlab.com/gitlab-org/gitlab/-/issues/287791
- def aliased_args(resolver, args)
- definitions = resolver.arguments
+ # a synthetic BaseObject type to be used in resolver specs. See `GraphqlHelpers#resolve`
+ def resolver_parent
+ @resolver_parent ||= fresh_object_type('ResolverParent')
+ end
- args.transform_keys do |k|
- definitions[GraphqlHelpers.fieldnamerize(k)]&.keyword || k
- end
+ def fresh_object_type(name = 'Object')
+ Class.new(::Types::BaseObject) { graphql_name name }
end
def resolver_instance(resolver_class, obj: nil, ctx: {}, field: nil, schema: GitlabSchema)
@@ -124,9 +222,9 @@ module GraphqlHelpers
lazy_vals.is_a?(Array) ? lazy_vals.map { |val| sync(val) } : sync(lazy_vals)
end
- def graphql_query_for(name, attributes = {}, fields = nil)
+ def graphql_query_for(name, args = {}, selection = nil)
type = GitlabSchema.types['Query'].fields[GraphqlHelpers.fieldnamerize(name)]&.type
- wrap_query(query_graphql_field(name, attributes, fields, type))
+ wrap_query(query_graphql_field(name, args, selection, type))
end
def wrap_query(query)
@@ -171,25 +269,6 @@ module GraphqlHelpers
::Gitlab::Utils::MergeHash.merge(Array.wrap(variables).map(&:to_h)).to_json
end
- def resolve_field(name, object, args = {}, current_user: nil)
- q = GraphQL::Query.new(GitlabSchema)
- context = GraphQL::Query::Context.new(query: q, object: object, values: { current_user: current_user })
- allow(context).to receive(:parent).and_return(nil)
- field = described_class.fields.fetch(GraphqlHelpers.fieldnamerize(name))
- instance = described_class.authorized_new(object, context)
- raise UnauthorizedObject unless instance
-
- field.resolve_field(instance, args, context)
- end
-
- def simple_resolver(resolved_value = 'Resolved value')
- Class.new(Resolvers::BaseResolver) do
- define_method :resolve do |**_args|
- resolved_value
- end
- end
- end
-
# Recursively convert a Hash with Ruby-style keys to GraphQL fieldname-style keys
#
# prepare_input_for_mutation({ 'my_key' => 1 })
@@ -558,24 +637,26 @@ module GraphqlHelpers
end
end
- def execute_query(query_type)
- schema = Class.new(GraphQL::Schema) do
- use GraphQL::Pagination::Connections
- use Gitlab::Graphql::Authorize
- use Gitlab::Graphql::Pagination::Connections
-
- lazy_resolve ::Gitlab::Graphql::Lazy, :force
-
- query(query_type)
- end
+ # assumes query_string to be let-bound in the current context
+ def execute_query(query_type, schema: empty_schema, graphql: query_string)
+ schema.query(query_type)
schema.execute(
- query_string,
+ graphql,
context: { current_user: user },
variables: {}
)
end
+ def empty_schema
+ Class.new(GraphQL::Schema) do
+ use GraphQL::Pagination::Connections
+ use Gitlab::Graphql::Pagination::Connections
+
+ lazy_resolve ::Gitlab::Graphql::Lazy, :force
+ end
+ end
+
# A lookahead that selects everything
def positive_lookahead
double(selects?: true).tap do |selection|
@@ -589,6 +670,23 @@ module GraphqlHelpers
allow(selection).to receive(:selection).and_return(selection)
end
end
+
+ private
+
+ def to_base_field(name_or_field, object_type)
+ case name_or_field
+ when ::Types::BaseField
+ name_or_field
+ else
+ field_by_name(name_or_field, object_type)
+ end
+ end
+
+ def field_by_name(name, object_type)
+ name = ::GraphqlHelpers.fieldnamerize(name)
+
+ object_type.fields[name] || (raise ArgumentError, "Unknown field #{name} for #{described_class.graphql_name}")
+ end
end
# This warms our schema, doing this as part of loading the helpers to avoid
diff --git a/spec/support/helpers/javascript_fixtures_helpers.rb b/spec/support/helpers/javascript_fixtures_helpers.rb
index 2224af88ab9..09425c3742a 100644
--- a/spec/support/helpers/javascript_fixtures_helpers.rb
+++ b/spec/support/helpers/javascript_fixtures_helpers.rb
@@ -12,6 +12,7 @@ module JavaScriptFixturesHelpers
included do |base|
base.around do |example|
# pick an arbitrary date from the past, so tests are not time dependent
+ # Also see spec/frontend/__helpers__/fake_date/jest.js
Timecop.freeze(Time.utc(2015, 7, 3, 10)) { example.run }
raise NoMethodError.new('You need to set `response` for the fixture generator! This will automatically happen with `type: :controller` or `type: :request`.', 'response') unless respond_to?(:response)
diff --git a/spec/support/helpers/notification_helpers.rb b/spec/support/helpers/notification_helpers.rb
index aee57b452fe..6066f4ec3bf 100644
--- a/spec/support/helpers/notification_helpers.rb
+++ b/spec/support/helpers/notification_helpers.rb
@@ -3,10 +3,10 @@
module NotificationHelpers
extend self
- def send_notifications(*new_mentions)
+ def send_notifications(*new_mentions, current_user: @u_disabled)
mentionable.description = new_mentions.map(&:to_reference).join(' ')
- notification.send(notification_method, mentionable, new_mentions, @u_disabled)
+ notification.send(notification_method, mentionable, new_mentions, current_user)
end
def create_global_setting_for(user, level)
diff --git a/spec/support/helpers/stub_object_storage.rb b/spec/support/helpers/stub_object_storage.rb
index 0d0ac171baa..56177d445d6 100644
--- a/spec/support/helpers/stub_object_storage.rb
+++ b/spec/support/helpers/stub_object_storage.rb
@@ -114,7 +114,7 @@ module StubObjectStorage
end
def stub_object_storage_multipart_init(endpoint, upload_id = "upload_id")
- stub_request(:post, %r{\A#{endpoint}tmp/uploads/[a-z0-9-]*\?uploads\z})
+ stub_request(:post, %r{\A#{endpoint}tmp/uploads/[%A-Za-z0-9-]*\?uploads\z})
.to_return status: 200, body: <<-EOS.strip_heredoc
<?xml version="1.0" encoding="UTF-8"?>
<InitiateMultipartUploadResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
diff --git a/spec/support/helpers/test_env.rb b/spec/support/helpers/test_env.rb
index 2d71662b0eb..266c0e18ccd 100644
--- a/spec/support/helpers/test_env.rb
+++ b/spec/support/helpers/test_env.rb
@@ -77,7 +77,8 @@ module TestEnv
'sha-starting-with-large-number' => '8426165',
'invalid-utf8-diff-paths' => '99e4853',
'compare-with-merge-head-source' => 'f20a03d',
- 'compare-with-merge-head-target' => '2f1e176'
+ 'compare-with-merge-head-target' => '2f1e176',
+ 'trailers' => 'f0a5ed6'
}.freeze
# gitlab-test-fork is a fork of gitlab-fork, but we don't necessarily
@@ -172,8 +173,13 @@ module TestEnv
Gitlab::SetupHelper::Gitaly.create_configuration(gitaly_dir, { 'default' => repos_path }, force: true)
Gitlab::SetupHelper::Gitaly.create_configuration(
gitaly_dir,
- { 'default' => repos_path }, force: true,
- options: { gitaly_socket: "gitaly2.socket", config_filename: "gitaly2.config.toml" }
+ { 'default' => repos_path },
+ force: true,
+ options: {
+ internal_socket_dir: File.join(gitaly_dir, "internal_gitaly2"),
+ gitaly_socket: "gitaly2.socket",
+ config_filename: "gitaly2.config.toml"
+ }
)
Gitlab::SetupHelper::Praefect.create_configuration(gitaly_dir, { 'praefect' => repos_path }, force: true)
end
@@ -186,7 +192,17 @@ module TestEnv
end
def gitaly_dir
- File.dirname(gitaly_socket_path)
+ socket_path = gitaly_socket_path
+ socket_path = File.expand_path(gitaly_socket_path) if expand_path?
+
+ File.dirname(socket_path)
+ end
+
+ # Linux fails with "bind: invalid argument" if a UNIX socket path exceeds 108 characters:
+ # https://github.com/golang/go/issues/6895. We use absolute paths in CI to ensure
+ # that changes in the current working directory don't affect GRPC reconnections.
+ def expand_path?
+ !!ENV['CI']
end
def start_gitaly(gitaly_dir)
diff --git a/spec/support/matchers/background_migrations_matchers.rb b/spec/support/matchers/background_migrations_matchers.rb
index 0144a044f6c..08bbbcc7438 100644
--- a/spec/support/matchers/background_migrations_matchers.rb
+++ b/spec/support/matchers/background_migrations_matchers.rb
@@ -1,7 +1,17 @@
# frozen_string_literal: true
+RSpec::Matchers.define :be_background_migration_with_arguments do |arguments|
+ define_method :matches? do |migration|
+ expect do
+ Gitlab::BackgroundMigration.perform(migration, arguments)
+ end.not_to raise_error
+ end
+end
+
RSpec::Matchers.define :be_scheduled_delayed_migration do |delay, *expected|
- match do |migration|
+ define_method :matches? do |migration|
+ expect(migration).to be_background_migration_with_arguments(expected)
+
BackgroundMigrationWorker.jobs.any? do |job|
job['args'] == [migration, expected] &&
job['at'].to_i == (delay.to_i + Time.now.to_i)
@@ -16,7 +26,9 @@ RSpec::Matchers.define :be_scheduled_delayed_migration do |delay, *expected|
end
RSpec::Matchers.define :be_scheduled_migration do |*expected|
- match do |migration|
+ define_method :matches? do |migration|
+ expect(migration).to be_background_migration_with_arguments(expected)
+
BackgroundMigrationWorker.jobs.any? do |job|
args = job['args'].size == 1 ? [BackgroundMigrationWorker.jobs[0]['args'][0], []] : job['args']
args == [migration, expected]
@@ -29,7 +41,9 @@ RSpec::Matchers.define :be_scheduled_migration do |*expected|
end
RSpec::Matchers.define :be_scheduled_migration_with_multiple_args do |*expected|
- match do |migration|
+ define_method :matches? do |migration|
+ expect(migration).to be_background_migration_with_arguments(expected)
+
BackgroundMigrationWorker.jobs.any? do |job|
args = job['args'].size == 1 ? [BackgroundMigrationWorker.jobs[0]['args'][0], []] : job['args']
args[0] == migration && compare_args(args, expected)
diff --git a/spec/support/matchers/email_matcher.rb b/spec/support/matchers/email_matcher.rb
new file mode 100644
index 00000000000..36cf3e0e871
--- /dev/null
+++ b/spec/support/matchers/email_matcher.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+RSpec::Matchers.define :have_text_part_content do |expected|
+ match do |actual|
+ @actual = actual.text_part.body.to_s
+ expect(@actual).to include(expected)
+ end
+
+ diffable
+end
+
+RSpec::Matchers.define :have_html_part_content do |expected|
+ match do |actual|
+ @actual = actual.html_part.body.to_s
+ expect(@actual).to include(expected)
+ end
+
+ diffable
+end
diff --git a/spec/support/matchers/graphql_matchers.rb b/spec/support/matchers/graphql_matchers.rb
index 8c4ba387a74..565c21e0f85 100644
--- a/spec/support/matchers/graphql_matchers.rb
+++ b/spec/support/matchers/graphql_matchers.rb
@@ -1,5 +1,7 @@
# frozen_string_literal: true
+RSpec::Matchers.define_negated_matcher :be_nullable, :be_non_null
+
RSpec::Matchers.define :require_graphql_authorizations do |*expected|
match do |klass|
permissions = if klass.respond_to?(:required_permissions)
@@ -90,7 +92,7 @@ RSpec::Matchers.define :have_graphql_arguments do |*expected|
@names ||= Array.wrap(expected).map { |name| GraphqlHelpers.fieldnamerize(name) }
if field.type.try(:ancestors)&.include?(GraphQL::Types::Relay::BaseConnection)
- @names | %w(after before first last)
+ @names | %w[after before first last]
else
@names
end
@@ -103,9 +105,10 @@ RSpec::Matchers.define :have_graphql_arguments do |*expected|
end
failure_message do |field|
- names = expected_names(field)
+ names = expected_names(field).inspect
+ args = field.arguments.keys.inspect
- "expected that #{field.name} would have the following fields: #{names.inspect}, but it has #{field.arguments.keys.inspect}."
+ "expected that #{field.name} would have the following arguments: #{names}, but it has #{args}."
end
end
diff --git a/spec/support/services/issues/move_and_clone_services_shared_examples.rb b/spec/support/services/issues/move_and_clone_services_shared_examples.rb
new file mode 100644
index 00000000000..2b2e90c0461
--- /dev/null
+++ b/spec/support/services/issues/move_and_clone_services_shared_examples.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'copy or reset relative position' do
+ before do
+ # ensure we have a relative position and it is known
+ old_issue.update!(relative_position: 1000)
+ end
+
+ context 'when moved to a project within same group hierarchy' do
+ it 'does not reset the relative_position' do
+ expect(subject.relative_position).to eq(1000)
+ end
+ end
+
+ context 'when moved to a project in a different group hierarchy' do
+ let_it_be(:new_project) { create(:project, group: create(:group)) }
+
+ it 'does reset the relative_position' do
+ expect(subject.relative_position).to be_nil
+ end
+ end
+end
diff --git a/spec/support/services/service_response_shared_examples.rb b/spec/support/services/service_response_shared_examples.rb
new file mode 100644
index 00000000000..186627347fb
--- /dev/null
+++ b/spec/support/services/service_response_shared_examples.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'returning an error service response' do |message: nil|
+ it 'returns an error service response' do
+ result = subject
+
+ expect(result).to be_error
+
+ if message
+ expect(result.message).to eq(message)
+ end
+ end
+end
+
+RSpec.shared_examples 'returning a success service response' do |message: nil|
+ it 'returns a success service response' do
+ result = subject
+
+ expect(result).to be_success
+
+ if message
+ expect(result.message).to eq(message)
+ end
+ end
+end
diff --git a/spec/support/shared_contexts/features/error_tracking_shared_context.rb b/spec/support/shared_contexts/features/error_tracking_shared_context.rb
index 1f4eb3a6df9..f04111e0ce0 100644
--- a/spec/support/shared_contexts/features/error_tracking_shared_context.rb
+++ b/spec/support/shared_contexts/features/error_tracking_shared_context.rb
@@ -9,7 +9,7 @@ RSpec.shared_context 'sentry error tracking context feature' do
let_it_be(:issue_response) { Gitlab::Json.parse(issue_response_body) }
let_it_be(:event_response_body) { fixture_file('sentry/issue_latest_event_sample_response.json') }
let_it_be(:event_response) { Gitlab::Json.parse(event_response_body) }
- let(:sentry_api_urls) { Sentry::ApiUrls.new(project_error_tracking_settings.api_url) }
+ let(:sentry_api_urls) { ErrorTracking::SentryClient::ApiUrls.new(project_error_tracking_settings.api_url) }
let(:issue_id) { issue_response['id'] }
let(:issue_seen) { 1.year.ago.utc }
let(:formatted_issue_seen) { issue_seen.strftime("%Y-%m-%d %-l:%M:%S%p %Z") }
diff --git a/spec/support/shared_contexts/issuable/merge_request_shared_context.rb b/spec/support/shared_contexts/issuable/merge_request_shared_context.rb
index 0fee170a35d..debcd9a3054 100644
--- a/spec/support/shared_contexts/issuable/merge_request_shared_context.rb
+++ b/spec/support/shared_contexts/issuable/merge_request_shared_context.rb
@@ -1,63 +1,23 @@
# frozen_string_literal: true
-RSpec.shared_context 'open merge request show action' do
+RSpec.shared_context 'merge request show action' do
include Spec::Support::Helpers::Features::MergeRequestHelpers
- let(:user) { create(:user) }
- let(:project) { create(:project, :public, :repository) }
- let(:note) { create(:note_on_merge_request, project: project, noteable: open_merge_request) }
-
- let(:open_merge_request) do
- create(:merge_request, :opened, source_project: project, author: user)
- end
-
- before do
- assign(:project, project)
- assign(:merge_request, open_merge_request)
- assign(:note, note)
- assign(:noteable, open_merge_request)
- assign(:notes, [])
- assign(:pipelines, Ci::Pipeline.none)
- assign(:issuable_sidebar, serialize_issuable_sidebar(user, project, open_merge_request))
-
- preload_view_requirements(open_merge_request, note)
-
- sign_in(user)
- end
-end
-
-RSpec.shared_context 'closed merge request show action' do
- include Devise::Test::ControllerHelpers
- include ProjectForksHelper
- include Spec::Support::Helpers::Features::MergeRequestHelpers
-
- let(:user) { create(:user) }
- let(:project) { create(:project, :public, :repository) }
- let(:forked_project) { fork_project(project, user, repository: true) }
- let(:unlink_project) { Projects::UnlinkForkService.new(forked_project, user) }
- let(:note) { create(:note_on_merge_request, project: project, noteable: closed_merge_request) }
-
- let(:closed_merge_request) do
- create(:closed_merge_request,
- source_project: forked_project,
- target_project: project,
- author: user)
- end
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project, :public, :repository) }
+ let_it_be(:merge_request) { create(:merge_request, :opened, source_project: project, author: user) }
+ let_it_be(:note) { create(:note_on_merge_request, project: project, noteable: merge_request) }
before do
+ allow(view).to receive(:experiment_enabled?).and_return(false)
+ allow(view).to receive(:current_user).and_return(user)
assign(:project, project)
- assign(:merge_request, closed_merge_request)
- assign(:commits_count, 0)
+ assign(:merge_request, merge_request)
assign(:note, note)
- assign(:noteable, closed_merge_request)
- assign(:notes, [])
- assign(:pipelines, Ci::Pipeline.none)
- assign(:issuable_sidebar, serialize_issuable_sidebar(user, project, closed_merge_request))
-
- preload_view_requirements(closed_merge_request, note)
+ assign(:noteable, merge_request)
+ assign(:pipelines, [])
+ assign(:issuable_sidebar, serialize_issuable_sidebar(user, project, merge_request))
- allow(view).to receive_messages(current_user: user,
- can?: true,
- current_application_settings: Gitlab::CurrentSettings.current_application_settings)
+ preload_view_requirements(merge_request, note)
end
end
diff --git a/spec/support/shared_contexts/navbar_structure_context.rb b/spec/support/shared_contexts/navbar_structure_context.rb
index 3fd4f2698e9..671c0cdf79c 100644
--- a/spec/support/shared_contexts/navbar_structure_context.rb
+++ b/spec/support/shared_contexts/navbar_structure_context.rb
@@ -5,7 +5,7 @@ RSpec.shared_context 'project navbar structure' do
{
nav_item: _('Analytics'),
nav_sub_items: [
- _('CI / CD'),
+ _('CI/CD'),
(_('Code Review') if Gitlab.ee?),
(_('Merge Request') if Gitlab.ee?),
_('Repository'),
@@ -63,7 +63,7 @@ RSpec.shared_context 'project navbar structure' do
nav_sub_items: []
},
{
- nav_item: _('CI / CD'),
+ nav_item: _('CI/CD'),
nav_sub_items: [
_('Pipelines'),
s_('Pipelines|Editor'),
@@ -111,7 +111,7 @@ RSpec.shared_context 'project navbar structure' do
_('Webhooks'),
_('Access Tokens'),
_('Repository'),
- _('CI / CD'),
+ _('CI/CD'),
_('Operations')
].compact
}
@@ -124,7 +124,8 @@ RSpec.shared_context 'group navbar structure' do
{
nav_item: _('Analytics'),
nav_sub_items: [
- _('Contribution')
+ _('Contribution'),
+ _('DevOps Adoption')
]
}
end
@@ -137,7 +138,7 @@ RSpec.shared_context 'group navbar structure' do
_('Integrations'),
_('Projects'),
_('Repository'),
- _('CI / CD'),
+ _('CI/CD'),
_('Packages & Registries'),
_('Webhooks')
]
diff --git a/spec/support/shared_contexts/policies/group_policy_shared_context.rb b/spec/support/shared_contexts/policies/group_policy_shared_context.rb
index e7bc1450601..b0d7274269b 100644
--- a/spec/support/shared_contexts/policies/group_policy_shared_context.rb
+++ b/spec/support/shared_contexts/policies/group_policy_shared_context.rb
@@ -18,12 +18,12 @@ RSpec.shared_context 'GroupPolicy context' do
]
end
- let(:read_group_permissions) { %i[read_label read_list read_milestone read_board] }
+ let(:read_group_permissions) { %i[read_label read_issue_board_list read_milestone read_issue_board] }
let(:reporter_permissions) do
%i[
admin_label
- admin_board
+ admin_issue_board
read_container_image
read_metrics_dashboard_annotation
read_prometheus
diff --git a/spec/support/shared_contexts/policies/project_policy_shared_context.rb b/spec/support/shared_contexts/policies/project_policy_shared_context.rb
index 3016494ac8d..266c8d5ee84 100644
--- a/spec/support/shared_contexts/policies/project_policy_shared_context.rb
+++ b/spec/support/shared_contexts/policies/project_policy_shared_context.rb
@@ -16,8 +16,8 @@ RSpec.shared_context 'ProjectPolicy context' do
let(:base_guest_permissions) do
%i[
award_emoji create_issue create_merge_request_in create_note
- create_project read_board read_issue read_issue_iid read_issue_link
- read_label read_list read_milestone read_note read_project
+ create_project read_issue_board read_issue read_issue_iid read_issue_link
+ read_label read_issue_board_list read_milestone read_note read_project
read_project_for_iids read_project_member read_release read_snippet
read_wiki upload_file
]
@@ -25,7 +25,7 @@ RSpec.shared_context 'ProjectPolicy context' do
let(:base_reporter_permissions) do
%i[
- admin_issue admin_issue_link admin_label admin_list create_snippet
+ admin_issue admin_issue_link admin_label admin_issue_board_list create_snippet
download_code download_wiki_code fork_project metrics_dashboard
read_build read_commit_status read_confidential_issues
read_container_image read_deployment read_environment read_merge_request
diff --git a/spec/support/shared_contexts/policies/project_policy_table_shared_context.rb b/spec/support/shared_contexts/policies/project_policy_table_shared_context.rb
index 8c9a60fa703..fbd82fbbe31 100644
--- a/spec/support/shared_contexts/policies/project_policy_table_shared_context.rb
+++ b/spec/support/shared_contexts/policies/project_policy_table_shared_context.rb
@@ -356,7 +356,7 @@ RSpec.shared_context 'ProjectPolicyTable context' do
:private | :anonymous | 0
end
- # :snippet_level, :project_level, :feature_access_level, :membership, :expected_count
+ # :snippet_level, :project_level, :feature_access_level, :membership, :admin_mode, :expected_count
def permission_table_for_project_snippet_access
:public | :public | :enabled | :admin | true | 1
:public | :public | :enabled | :admin | false | 1
diff --git a/spec/support/shared_contexts/requests/api/npm_packages_shared_context.rb b/spec/support/shared_contexts/requests/api/npm_packages_shared_context.rb
index 60a29d78084..815108be447 100644
--- a/spec/support/shared_contexts/requests/api/npm_packages_shared_context.rb
+++ b/spec/support/shared_contexts/requests/api/npm_packages_shared_context.rb
@@ -5,8 +5,9 @@ RSpec.shared_context 'npm api setup' do
include HttpBasicAuthHelpers
let_it_be(:user, reload: true) { create(:user) }
- let_it_be(:group) { create(:group) }
- let_it_be(:project, reload: true) { create(:project, :public, namespace: group) }
+ let_it_be(:group) { create(:group, name: 'test-group') }
+ let_it_be(:namespace) { group }
+ let_it_be(:project, reload: true) { create(:project, :public, namespace: namespace) }
let_it_be(:package, reload: true) { create(:npm_package, project: project, name: "@#{group.path}/scoped_package") }
let_it_be(:token) { create(:oauth_access_token, scopes: 'api', resource_owner: user) }
let_it_be(:personal_access_token) { create(:personal_access_token, user: user) }
@@ -22,6 +23,10 @@ RSpec.shared_context 'set package name from package name type' do
case package_name_type
when :scoped_naming_convention
"@#{group.path}/scoped-package"
+ when :scoped_no_naming_convention
+ '@any-scope/scoped-package'
+ when :unscoped
+ 'unscoped-package'
when :non_existing
'non-existing-package'
end
diff --git a/spec/support/shared_contexts/security_and_compliance_permissions_shared_context.rb b/spec/support/shared_contexts/security_and_compliance_permissions_shared_context.rb
new file mode 100644
index 00000000000..dc5195e4b01
--- /dev/null
+++ b/spec/support/shared_contexts/security_and_compliance_permissions_shared_context.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+RSpec.shared_context '"Security & Compliance" permissions' do
+ let(:project_instance) { an_instance_of(Project) }
+ let(:user_instance) { an_instance_of(User) }
+ let(:before_request_defined) { false }
+ let(:valid_request) {}
+
+ def self.before_request(&block)
+ return unless block
+
+ let(:before_request_call) { instance_exec(&block) }
+ let(:before_request_defined) { true }
+ end
+
+ before do
+ allow(Ability).to receive(:allowed?).and_call_original
+ allow(Ability).to receive(:allowed?).with(user_instance, :access_security_and_compliance, project_instance).and_return(true)
+ end
+
+ context 'when the "Security & Compliance" feature is disabled' do
+ subject { response }
+
+ before do
+ before_request_call if before_request_defined
+
+ allow(Ability).to receive(:allowed?).with(user_instance, :access_security_and_compliance, project_instance).and_return(false)
+ valid_request
+ end
+
+ it { is_expected.to have_gitlab_http_status(:not_found) }
+ end
+end
diff --git a/spec/support/shared_examples/alert_notification_service_shared_examples.rb b/spec/support/shared_examples/alert_notification_service_shared_examples.rb
index 7bd6df8c608..fc935effe0e 100644
--- a/spec/support/shared_examples/alert_notification_service_shared_examples.rb
+++ b/spec/support/shared_examples/alert_notification_service_shared_examples.rb
@@ -27,3 +27,18 @@ RSpec.shared_examples 'Alert Notification Service sends no notifications' do |ht
end
end
end
+
+RSpec.shared_examples 'creates status-change system note for an auto-resolved alert' do
+ it 'has 2 new system notes' do
+ expect { subject }.to change(Note, :count).by(2)
+ expect(Note.last.note).to include('Resolved')
+ end
+end
+
+# Requires `source` to be defined
+RSpec.shared_examples 'creates single system note based on the source of the alert' do
+ it 'has one new system note' do
+ expect { subject }.to change(Note, :count).by(1)
+ expect(Note.last.note).to include(source)
+ end
+end
diff --git a/spec/support/shared_examples/banzai/filters/emoji_shared_examples.rb b/spec/support/shared_examples/banzai/filters/emoji_shared_examples.rb
new file mode 100644
index 00000000000..da305f5ccaa
--- /dev/null
+++ b/spec/support/shared_examples/banzai/filters/emoji_shared_examples.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'emoji filter' do
+ it 'keeps whitespace intact' do
+ doc = filter("This deserves a #{emoji_name}, big time.")
+
+ expect(doc.to_html).to match(/^This deserves a <gl-emoji.+>, big time\.\z/)
+ end
+
+ it 'does not match emoji in a string' do
+ doc = filter("'2a00:a4c0#{emoji_name}:1'")
+
+ expect(doc.css('gl-emoji')).to be_empty
+ end
+
+ it 'ignores non existent/unsupported emoji' do
+ exp = '<p>:foo:</p>'
+ doc = filter(exp)
+
+ expect(doc.to_html).to eq(exp)
+ end
+
+ it 'matches with adjacent text' do
+ doc = filter("#{emoji_name.delete(':')} (#{emoji_name})")
+
+ expect(doc.css('gl-emoji').size).to eq 1
+ end
+
+ it 'does not match emoji in a pre tag' do
+ doc = filter("<p><pre>#{emoji_name}</pre></p>")
+
+ expect(doc.css('img')).to be_empty
+ end
+
+ it 'does not match emoji in code tag' do
+ doc = filter("<p><code>#{emoji_name} wow</code></p>")
+
+ expect(doc.css('img')).to be_empty
+ end
+
+ it 'does not match emoji in tt tag' do
+ doc = filter("<p><tt>#{emoji_name} yes!</tt></p>")
+
+ expect(doc.css('img')).to be_empty
+ end
+end
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 7f49d20c83e..9c8006ce4f1 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
@@ -9,6 +9,8 @@ RSpec.shared_examples 'multiple issue boards' do
login_as(user)
+ stub_feature_flags(board_new_list: false)
+
visit boards_path
wait_for_requests
end
diff --git a/spec/support/shared_examples/controllers/create_notes_rate_limit_shared_examples.rb b/spec/support/shared_examples/controllers/create_notes_rate_limit_shared_examples.rb
new file mode 100644
index 00000000000..74a98c20383
--- /dev/null
+++ b/spec/support/shared_examples/controllers/create_notes_rate_limit_shared_examples.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+#
+# Requires a context containing:
+# - user
+# - params
+# - request_full_path
+
+RSpec.shared_examples 'request exceeding rate limit' do
+ before do
+ stub_application_setting(notes_create_limit: 2)
+ 2.times { post :create, params: params }
+ end
+
+ it 'prevents from creating more notes', :request_store do
+ expect { post :create, params: params }
+ .to change { Note.count }.by(0)
+
+ expect(response).to have_gitlab_http_status(:too_many_requests)
+ expect(response.body).to eq(_('This endpoint has been requested too many times. Try again later.'))
+ end
+
+ it 'logs the event in auth.log' do
+ attributes = {
+ message: 'Application_Rate_Limiter_Request',
+ env: :notes_create_request_limit,
+ remote_ip: '0.0.0.0',
+ request_method: 'POST',
+ path: request_full_path,
+ user_id: user.id,
+ username: user.username
+ }
+
+ expect(Gitlab::AuthLogger).to receive(:error).with(attributes).once
+ post :create, params: params
+ end
+
+ it 'allows user in allow-list to create notes, even if the case is different' do
+ user.update_attribute(:username, user.username.titleize)
+ stub_application_setting(notes_create_limit_allowlist: ["#{user.username.downcase}"])
+
+ post :create, params: params
+ expect(response).to have_gitlab_http_status(:found)
+ end
+end
diff --git a/spec/support/shared_examples/controllers/snippet_blob_shared_examples.rb b/spec/support/shared_examples/controllers/snippet_blob_shared_examples.rb
index c3e8f807afb..62aaec85162 100644
--- a/spec/support/shared_examples/controllers/snippet_blob_shared_examples.rb
+++ b/spec/support/shared_examples/controllers/snippet_blob_shared_examples.rb
@@ -17,6 +17,38 @@ RSpec.shared_examples 'raw snippet blob' do
end
end
+ context 'Content Disposition' do
+ context 'when the disposition is inline' do
+ let(:inline) { true }
+
+ it 'returns inline in the content disposition header' do
+ subject
+
+ expect(response.header['Content-Disposition']).to eq('inline')
+ end
+ end
+
+ context 'when the disposition is attachment' do
+ let(:inline) { false }
+
+ it 'returns attachment plus the filename in the content disposition header' do
+ subject
+
+ expect(response.header['Content-Disposition']).to match "attachment; filename=\"#{filepath}\""
+ end
+
+ context 'when the feature flag attachment_with_filename is disabled' do
+ it 'returns just attachment in the disposition header' do
+ stub_feature_flags(attachment_with_filename: false)
+
+ subject
+
+ expect(response.header['Content-Disposition']).to eq 'attachment'
+ end
+ end
+ end
+ end
+
context 'with invalid file path' do
let(:filepath) { 'doesnotexist' }
diff --git a/spec/support/shared_examples/features/comment_and_close_button_shared_examples.rb b/spec/support/shared_examples/features/comment_and_close_button_shared_examples.rb
deleted file mode 100644
index 4ee2840ed9f..00000000000
--- a/spec/support/shared_examples/features/comment_and_close_button_shared_examples.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-# frozen_string_literal: true
-
-RSpec.shared_examples 'page with comment and close button' do |button_text|
- context 'when remove_comment_close_reopen feature flag is enabled' do
- before do
- stub_feature_flags(remove_comment_close_reopen: true)
- setup
- end
-
- it "does not show #{button_text} button" do
- within '.note-form-actions' do
- expect(page).not_to have_button(button_text)
- end
- end
- end
-
- context 'when remove_comment_close_reopen feature flag is disabled' do
- before do
- stub_feature_flags(remove_comment_close_reopen: false)
- setup
- end
-
- it "shows #{button_text} button" do
- within '.note-form-actions' do
- expect(page).to have_button(button_text)
- end
- end
- end
-end
diff --git a/spec/support/shared_examples/features/discussion_comments_shared_example.rb b/spec/support/shared_examples/features/discussion_comments_shared_example.rb
index 6bebd59ed70..86ba2821c78 100644
--- a/spec/support/shared_examples/features/discussion_comments_shared_example.rb
+++ b/spec/support/shared_examples/features/discussion_comments_shared_example.rb
@@ -1,6 +1,6 @@
# frozen_string_literal: true
-RSpec.shared_examples 'thread comments' do |resource_name|
+RSpec.shared_examples 'thread comments for commit and snippet' do |resource_name|
let(:form_selector) { '.js-main-target-form' }
let(:dropdown_selector) { "#{form_selector} .comment-type-dropdown" }
let(:toggle_selector) { "#{dropdown_selector} .dropdown-toggle" }
@@ -24,23 +24,6 @@ RSpec.shared_examples 'thread comments' do |resource_name|
expect(new_comment).not_to have_selector '.discussion'
end
- if resource_name == 'issue'
- it "clicking 'Comment & close #{resource_name}' will post a comment and close the #{resource_name}" do
- find("#{form_selector} .note-textarea").send_keys(comment)
-
- click_button 'Comment & close issue'
-
- wait_for_all_requests
-
- expect(page).to have_content(comment)
- expect(page).to have_content "@#{user.username} closed"
-
- new_comment = all(comments_selector).last
-
- expect(new_comment).not_to have_selector '.discussion'
- end
- end
-
describe 'when the toggle is clicked' do
before do
find("#{form_selector} .note-textarea").send_keys(comment)
@@ -110,33 +93,172 @@ RSpec.shared_examples 'thread comments' do |resource_name|
end
it 'updates the submit button text and closes the dropdown' do
- button = find(submit_selector)
+ expect(find(submit_selector).value).to eq 'Start thread'
- # on issues page, the submit input is a <button>, on other pages it is <input>
- if button.tag_name == 'button'
- expect(find(submit_selector)).to have_content 'Start thread'
- else
- expect(find(submit_selector).value).to eq 'Start thread'
+ expect(page).not_to have_selector menu_selector
+ end
+
+ describe 'creating a thread' do
+ before do
+ find(submit_selector).click
+ wait_for_requests
+
+ find(comments_selector, match: :first)
end
- expect(page).not_to have_selector menu_selector
+ def submit_reply(text)
+ find("#{comments_selector} .js-vue-discussion-reply").click
+ find("#{comments_selector} .note-textarea").send_keys(text)
+
+ find("#{comments_selector} .js-comment-button").click
+ wait_for_requests
+ end
+
+ it 'clicking "Start thread" will post a thread' do
+ expect(page).to have_content(comment)
+
+ new_comment = all(comments_selector).last
+
+ expect(new_comment).to have_selector('.discussion')
+ end
end
- if resource_name =~ /(issue|merge request)/
- it 'updates the close button text' do
- expect(find(close_selector)).to have_content "Start thread & close #{resource_name}"
+ describe 'when opening the menu' do
+ before do
+ find(toggle_selector).click
+ end
+
+ it 'has "Start thread" selected' do
+ find("#{menu_selector} li", match: :first)
+ items = all("#{menu_selector} li")
+
+ expect(items.first).to have_content 'Comment'
+ expect(items.first).not_to have_selector '[data-testid="check-icon"]'
+ expect(items.first['class']).not_to match 'droplab-item-selected'
+
+ expect(items.last).to have_content 'Start thread'
+ expect(items.last).to have_selector '[data-testid="check-icon"]'
+ expect(items.last['class']).to match 'droplab-item-selected'
end
- it 'typing does not change the close button text' do
- find("#{form_selector} .note-textarea").send_keys('b')
+ describe 'when selecting "Comment"' do
+ before do
+ find("#{menu_selector} li", match: :first).click
+ end
+
+ it 'updates the submit button text and closes the dropdown' do
+ button = find(submit_selector)
+
+ expect(button.value).to eq 'Comment'
+
+ expect(page).not_to have_selector menu_selector
+ end
- expect(find(close_selector)).to have_content "Start thread & close #{resource_name}"
+ it 'has "Comment" selected when opening the menu', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/196825' do
+ find(toggle_selector).click
+
+ find("#{menu_selector} li", match: :first)
+ items = all("#{menu_selector} li")
+
+ aggregate_failures do
+ expect(items.first).to have_content 'Comment'
+ expect(items.first).to have_selector '[data-testid="check-icon"]'
+ expect(items.first['class']).to match 'droplab-item-selected'
+
+ expect(items.last).to have_content 'Start thread'
+ expect(items.last).not_to have_selector '[data-testid="check-icon"]'
+ expect(items.last['class']).not_to match 'droplab-item-selected'
+ end
+ end
end
end
+ end
+ end
+end
+
+RSpec.shared_examples 'thread comments for issue, epic and merge request' do |resource_name|
+ let(:form_selector) { '.js-main-target-form' }
+ let(:dropdown_selector) { "#{form_selector} [data-testid='comment-button']" }
+ let(:submit_button_selector) { "#{dropdown_selector} .split-content-button" }
+ let(:toggle_selector) { "#{dropdown_selector} .dropdown-toggle-split" }
+ let(:menu_selector) { "#{dropdown_selector} .dropdown-menu" }
+ let(:close_selector) { "#{form_selector} .btn-comment-and-close" }
+ let(:comments_selector) { '.timeline > .note.timeline-entry' }
+ let(:comment) { 'My comment' }
+
+ it 'clicking "Comment" will post a comment' do
+ expect(page).to have_selector toggle_selector
+
+ find("#{form_selector} .note-textarea").send_keys(comment)
+
+ find(submit_button_selector).click
+
+ expect(page).to have_content(comment)
+
+ new_comment = all(comments_selector).last
+
+ expect(new_comment).not_to have_selector '.discussion'
+ end
+
+ if resource_name == 'issue'
+ it "clicking 'Comment & close #{resource_name}' will post a comment and close the #{resource_name}" do
+ find("#{form_selector} .note-textarea").send_keys(comment)
+
+ click_button 'Comment & close issue'
+
+ wait_for_all_requests
+
+ expect(page).to have_content(comment)
+ expect(page).to have_content "@#{user.username} closed"
+
+ new_comment = all(comments_selector).last
+
+ expect(new_comment).not_to have_selector '.discussion'
+ end
+ end
+
+ describe 'when the toggle is clicked' do
+ before do
+ find("#{form_selector} .note-textarea").send_keys(comment)
+
+ find(toggle_selector).click
+ end
+
+ it 'has a "Comment" item (selected by default) and "Start thread" item' do
+ expect(page).to have_selector menu_selector
+
+ find("#{menu_selector} li", match: :first)
+ items = all("#{menu_selector} li")
+
+ expect(page).to have_selector("#{dropdown_selector}[data-track-label='comment_button']")
+
+ expect(items.first).to have_content 'Comment'
+ expect(items.first).to have_content "Add a general comment to this #{resource_name}."
+
+ expect(items.last).to have_content 'Start thread'
+ expect(items.last).to have_content "Discuss a specific suggestion or question#{' that needs to be resolved' if resource_name == 'merge request'}."
+ end
+
+ it 'closes the menu when clicking the toggle or body' do
+ find(toggle_selector).click
+
+ expect(page).not_to have_selector menu_selector
+
+ find(toggle_selector).click
+ find("#{form_selector} .note-textarea").click
+
+ expect(page).not_to have_selector menu_selector
+ end
+
+ describe 'when selecting "Start thread"' do
+ before do
+ find("#{menu_selector} li", match: :first)
+ all("#{menu_selector} li").last.click
+ end
describe 'creating a thread' do
before do
- find(submit_selector).click
+ find(submit_button_selector).click
wait_for_requests
find(comments_selector, match: :first)
@@ -146,6 +268,7 @@ RSpec.shared_examples 'thread comments' do |resource_name|
find("#{comments_selector} .js-vue-discussion-reply").click
find("#{comments_selector} .note-textarea").send_keys(text)
+ # .js-comment-button here refers to the reply button in note_form.vue
find("#{comments_selector} .js-comment-button").click
wait_for_requests
end
@@ -228,13 +351,11 @@ RSpec.shared_examples 'thread comments' do |resource_name|
find("#{menu_selector} li", match: :first)
items = all("#{menu_selector} li")
+ expect(page).to have_selector("#{dropdown_selector}[data-track-label='start_thread_button']")
+
expect(items.first).to have_content 'Comment'
- expect(items.first).not_to have_selector '[data-testid="check-icon"]'
- expect(items.first['class']).not_to match 'droplab-item-selected'
expect(items.last).to have_content 'Start thread'
- expect(items.last).to have_selector '[data-testid="check-icon"]'
- expect(items.last['class']).to match 'droplab-item-selected'
end
describe 'when selecting "Comment"' do
@@ -243,14 +364,9 @@ RSpec.shared_examples 'thread comments' do |resource_name|
end
it 'updates the submit button text and closes the dropdown' do
- button = find(submit_selector)
+ button = find(submit_button_selector)
- # on issues page, the submit input is a <button>, on other pages it is <input>
- if button.tag_name == 'button'
- expect(button).to have_content 'Comment'
- else
- expect(button.value).to eq 'Comment'
- end
+ expect(button).to have_content 'Comment'
expect(page).not_to have_selector menu_selector
end
@@ -267,21 +383,17 @@ RSpec.shared_examples 'thread comments' do |resource_name|
end
end
- it 'has "Comment" selected when opening the menu', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/196825' do
+ it 'has "Comment" selected when opening the menu' do
find(toggle_selector).click
find("#{menu_selector} li", match: :first)
items = all("#{menu_selector} li")
- aggregate_failures do
- expect(items.first).to have_content 'Comment'
- expect(items.first).to have_selector '[data-testid="check-icon"]'
- expect(items.first['class']).to match 'droplab-item-selected'
+ expect(page).to have_selector("#{dropdown_selector}[data-track-label='comment_button']")
- expect(items.last).to have_content 'Start thread'
- expect(items.last).not_to have_selector '[data-testid="check-icon"]'
- expect(items.last['class']).not_to match 'droplab-item-selected'
- end
+ expect(items.first).to have_content 'Comment'
+
+ expect(items.last).to have_content 'Start thread'
end
end
end
diff --git a/spec/support/shared_examples/features/issuable_invite_members_shared_examples.rb b/spec/support/shared_examples/features/issuable_invite_members_shared_examples.rb
index 3fec1a56c0c..7a32f61d4fa 100644
--- a/spec/support/shared_examples/features/issuable_invite_members_shared_examples.rb
+++ b/spec/support/shared_examples/features/issuable_invite_members_shared_examples.rb
@@ -1,11 +1,7 @@
# frozen_string_literal: true
RSpec.shared_examples 'issuable invite members experiments' do
- context 'when invite_members_version_a experiment is enabled' do
- before do
- stub_experiment_for_subject(invite_members_version_a: true)
- end
-
+ context 'when a privileged user can invite' do
it 'shows a link for inviting members and follows through to the members page' do
project.add_maintainer(user)
visit issuable_path
@@ -51,9 +47,9 @@ RSpec.shared_examples 'issuable invite members experiments' do
end
end
- context 'when no invite members experiments are enabled' do
+ context 'when invite_members_version_b experiment is disabled' do
it 'shows author in assignee dropdown and no invite link' do
- project.add_maintainer(user)
+ project.add_developer(user)
visit issuable_path
find('.block.assignee .edit-link').click
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 25203fa3182..7daebcbb0fe 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
@@ -3,7 +3,13 @@
RSpec.shared_examples 'it uploads and commit a new text file' do
it 'uploads and commit a new text file', :js do
find('.add-to-tree').click
- click_link('Upload file')
+
+ page.within('.dropdown-menu') do
+ click_link('Upload file')
+
+ wait_for_requests
+ end
+
drop_in_dropzone(File.join(Rails.root, 'spec', 'fixtures', 'doc_sample.txt'))
page.within('#modal-upload-blob') do
@@ -29,7 +35,13 @@ end
RSpec.shared_examples 'it uploads and commit a new image file' do
it 'uploads and commit a new image file', :js do
find('.add-to-tree').click
- click_link('Upload file')
+
+ page.within('.dropdown-menu') do
+ click_link('Upload file')
+
+ wait_for_requests
+ end
+
drop_in_dropzone(File.join(Rails.root, 'spec', 'fixtures', 'logo_sample.svg'))
page.within('#modal-upload-blob') do
@@ -82,3 +94,23 @@ RSpec.shared_examples 'it uploads and commit a new file to a forked project' do
expect(page).to have_content('Sed ut perspiciatis unde omnis')
end
end
+
+RSpec.shared_examples 'uploads and commits a new text file via "upload file" button' do
+ it 'uploads and commits a new text file via "upload file" button', :js do
+ find('.js-upload-file-experiment-trigger', text: 'Upload file').click
+
+ drop_in_dropzone(File.join(Rails.root, 'spec', 'fixtures', 'doc_sample.txt'))
+
+ page.within('#modal-upload-blob') do
+ fill_in(:commit_message, with: 'New commit message')
+ end
+
+ click_button('Upload file')
+
+ wait_for_requests
+
+ expect(page).to have_content('New commit message')
+ expect(page).to have_content('Lorem ipsum dolor sit amet')
+ expect(page).to have_content('Sed ut perspiciatis unde omnis')
+ end
+end
diff --git a/spec/support/shared_examples/features/variable_list_shared_examples.rb b/spec/support/shared_examples/features/variable_list_shared_examples.rb
index e0d169c6868..2fd88b610e9 100644
--- a/spec/support/shared_examples/features/variable_list_shared_examples.rb
+++ b/spec/support/shared_examples/features/variable_list_shared_examples.rb
@@ -2,7 +2,7 @@
RSpec.shared_examples 'variable list' do
it 'shows a list of variables' do
- page.within('.ci-variable-table') do
+ page.within('[data-testid="ci-variable-table"]') do
expect(find('.js-ci-variable-row:nth-child(1) td[data-label="Key"]').text).to eq(variable.key)
end
end
@@ -16,7 +16,7 @@ RSpec.shared_examples 'variable list' do
wait_for_requests
- page.within('.ci-variable-table') do
+ page.within('[data-testid="ci-variable-table"]') do
expect(find('.js-ci-variable-row:nth-child(1) td[data-label="Key"]').text).to eq('key')
end
end
@@ -30,7 +30,7 @@ RSpec.shared_examples 'variable list' do
wait_for_requests
- page.within('.ci-variable-table') do
+ page.within('[data-testid="ci-variable-table"]') do
expect(find('.js-ci-variable-row:nth-child(1) td[data-label="Key"]').text).to eq('key')
expect(find('.js-ci-variable-row:nth-child(1) td[data-label="Protected"] svg[data-testid="mobile-issue-close-icon"]')).to be_present
end
@@ -45,14 +45,14 @@ RSpec.shared_examples 'variable list' do
wait_for_requests
- page.within('.ci-variable-table') do
+ page.within('[data-testid="ci-variable-table"]') do
expect(find('.js-ci-variable-row:nth-child(1) td[data-label="Key"]').text).to eq('key')
expect(find('.js-ci-variable-row:nth-child(1) td[data-label="Masked"] svg[data-testid="close-icon"]')).to be_present
end
end
it 'reveals and hides variables' do
- page.within('.ci-variable-table') do
+ page.within('[data-testid="ci-variable-table"]') do
expect(first('.js-ci-variable-row td[data-label="Key"]').text).to eq(variable.key)
expect(page).to have_content('*' * 17)
@@ -72,7 +72,7 @@ RSpec.shared_examples 'variable list' do
it 'deletes a variable' do
expect(page).to have_selector('.js-ci-variable-row', count: 1)
- page.within('.ci-variable-table') do
+ page.within('[data-testid="ci-variable-table"]') do
click_button('Edit')
end
@@ -86,7 +86,7 @@ RSpec.shared_examples 'variable list' do
end
it 'edits a variable' do
- page.within('.ci-variable-table') do
+ page.within('[data-testid="ci-variable-table"]') do
click_button('Edit')
end
@@ -102,7 +102,7 @@ RSpec.shared_examples 'variable list' do
end
it 'edits a variable to be unmasked' do
- page.within('.ci-variable-table') do
+ page.within('[data-testid="ci-variable-table"]') do
click_button('Edit')
end
@@ -115,13 +115,13 @@ RSpec.shared_examples 'variable list' do
wait_for_requests
- page.within('.ci-variable-table') do
+ page.within('[data-testid="ci-variable-table"]') do
expect(find('.js-ci-variable-row:nth-child(1) td[data-label="Masked"] svg[data-testid="close-icon"]')).to be_present
end
end
it 'edits a variable to be masked' do
- page.within('.ci-variable-table') do
+ page.within('[data-testid="ci-variable-table"]') do
click_button('Edit')
end
@@ -133,7 +133,7 @@ RSpec.shared_examples 'variable list' do
wait_for_requests
- page.within('.ci-variable-table') do
+ page.within('[data-testid="ci-variable-table"]') do
click_button('Edit')
end
@@ -143,7 +143,7 @@ RSpec.shared_examples 'variable list' do
click_button('Update variable')
end
- page.within('.ci-variable-table') do
+ page.within('[data-testid="ci-variable-table"]') do
expect(find('.js-ci-variable-row:nth-child(1) td[data-label="Masked"] svg[data-testid="mobile-issue-close-icon"]')).to be_present
end
end
@@ -211,7 +211,7 @@ RSpec.shared_examples 'variable list' do
expect(page).to have_selector('.js-ci-variable-row', count: 3)
# Remove the `akey` variable
- page.within('.ci-variable-table') do
+ page.within('[data-testid="ci-variable-table"]') do
page.within('.js-ci-variable-row:first-child') do
click_button('Edit')
end
diff --git a/spec/support/shared_examples/graphql/mutation_shared_examples.rb b/spec/support/shared_examples/graphql/mutation_shared_examples.rb
index 84ebd4852b9..51d52cbb901 100644
--- a/spec/support/shared_examples/graphql/mutation_shared_examples.rb
+++ b/spec/support/shared_examples/graphql/mutation_shared_examples.rb
@@ -48,6 +48,6 @@ RSpec.shared_examples 'a mutation that returns errors in the response' do |error
it do
post_graphql_mutation(mutation, current_user: current_user)
- expect(mutation_response['errors']).to eq(errors)
+ expect(mutation_response['errors']).to match_array(errors)
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 2b93d174653..2e3a3ce6b41 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
@@ -66,9 +66,7 @@ RSpec.shared_examples 'boards create mutation' do
context 'when the Boards::CreateService returns an error response' do
before do
- allow_next_instance_of(Boards::CreateService) do |service|
- allow(service).to receive(:execute).and_return(ServiceResponse.error(message: 'There was an error.'))
- end
+ params[:name] = ''
end
it 'does not create a board' do
@@ -80,7 +78,7 @@ RSpec.shared_examples 'boards create mutation' do
expect(mutation_response).to have_key('board')
expect(mutation_response['board']).to be_nil
- expect(mutation_response['errors'].first).to eq('There was an error.')
+ expect(mutation_response['errors'].first).to eq('There was an error when creating a board.')
end
end
end
diff --git a/spec/support/shared_examples/graphql/mutations/can_mutate_spammable_examples.rb b/spec/support/shared_examples/graphql/mutations/can_mutate_spammable_examples.rb
index d294f034d2e..bb4270d7db6 100644
--- a/spec/support/shared_examples/graphql/mutations/can_mutate_spammable_examples.rb
+++ b/spec/support/shared_examples/graphql/mutations/can_mutate_spammable_examples.rb
@@ -21,14 +21,14 @@ RSpec.shared_examples 'a mutation which can mutate a spammable' do
end
end
- describe "#with_spam_action_fields" do
+ describe "#with_spam_action_response_fields" do
it 'resolves with spam action fields' do
subject
# NOTE: We do not need to assert on the specific values of spam action fields here, we only need
- # to verify that #with_spam_action_fields was invoked and that the fields are present in the
- # response. The specific behavior of #with_spam_action_fields is covered in the
- # CanMutateSpammable unit tests.
+ # to verify that #with_spam_action_response_fields was invoked and that the fields are present in the
+ # response. The specific behavior of #with_spam_action_response_fields is covered in the
+ # HasSpamActionResponseFields unit tests.
expect(mutation_response.keys)
.to include('spam', 'spamLogId', 'needsCaptchaResponse', 'captchaSiteKey')
end
diff --git a/spec/support/shared_examples/graphql/notes_on_noteables_shared_examples.rb b/spec/support/shared_examples/graphql/notes_on_noteables_shared_examples.rb
index 41b7da07d2d..0d2e9f6ec8c 100644
--- a/spec/support/shared_examples/graphql/notes_on_noteables_shared_examples.rb
+++ b/spec/support/shared_examples/graphql/notes_on_noteables_shared_examples.rb
@@ -17,7 +17,7 @@ RSpec.shared_context 'exposing regular notes on a noteable in GraphQL' do
notes {
edges {
node {
- #{all_graphql_fields_for('Note')}
+ #{all_graphql_fields_for('Note', max_depth: 1)}
}
}
}
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 269e9170906..bc091a678e2 100644
--- a/spec/support/shared_examples/graphql/types/gitlab_style_deprecations_shared_examples.rb
+++ b/spec/support/shared_examples/graphql/types/gitlab_style_deprecations_shared_examples.rb
@@ -6,7 +6,7 @@ RSpec.shared_examples 'Gitlab-style deprecations' do
expect { subject(deprecation_reason: 'foo') }.to raise_error(
ArgumentError,
'Use `deprecated` property instead of `deprecation_reason`. ' \
- 'See https://docs.gitlab.com/ee/development/api_graphql_styleguide.html#deprecating-fields-and-enum-values'
+ 'See https://docs.gitlab.com/ee/development/api_graphql_styleguide.html#deprecating-fields-arguments-and-enum-values'
)
end
diff --git a/spec/support/shared_examples/helpers/issuable_description_templates_shared_examples.rb b/spec/support/shared_examples/helpers/issuable_description_templates_shared_examples.rb
index 9e8c96d576a..47e34b21036 100644
--- a/spec/support/shared_examples/helpers/issuable_description_templates_shared_examples.rb
+++ b/spec/support/shared_examples/helpers/issuable_description_templates_shared_examples.rb
@@ -23,11 +23,11 @@ RSpec.shared_examples 'project issuable templates' do
end
it 'returns only md files as issue templates' do
- expect(helper.issuable_templates(project, 'issue')).to eq(templates('issue', project))
+ expect(helper.issuable_templates(project, 'issue')).to eq(expected_templates('issue'))
end
it 'returns only md files as merge_request templates' do
- expect(helper.issuable_templates(project, 'merge_request')).to eq(templates('merge_request', project))
+ expect(helper.issuable_templates(project, 'merge_request')).to eq(expected_templates('merge_request'))
end
end
diff --git a/spec/support/shared_examples/lib/gitlab/cycle_analytics/event_shared_examples.rb b/spec/support/shared_examples/lib/gitlab/cycle_analytics/event_shared_examples.rb
index 145a7290ac8..7d341d79bae 100644
--- a/spec/support/shared_examples/lib/gitlab/cycle_analytics/event_shared_examples.rb
+++ b/spec/support/shared_examples/lib/gitlab/cycle_analytics/event_shared_examples.rb
@@ -8,6 +8,7 @@ RSpec.shared_examples_for 'value stream analytics event' do
it { expect(described_class.identifier).to be_a_kind_of(Symbol) }
it { expect(instance.object_type.ancestors).to include(ApplicationRecord) }
it { expect(instance).to respond_to(:timestamp_projection) }
+ it { expect(instance).to respond_to(:markdown_description) }
it { expect(instance.column_list).to be_a_kind_of(Array) }
describe '#apply_query_customization' do
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
new file mode 100644
index 00000000000..aa6e64a3820
--- /dev/null
+++ b/spec/support/shared_examples/lib/gitlab/usage_data_counters/issuable_activity_shared_examples.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'a daily tracked issuable event' do
+ before do
+ stub_application_setting(usage_ping_enabled: true)
+ end
+
+ def count_unique(date_from:, date_to:)
+ Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(event_names: action, start_date: date_from, end_date: date_to)
+ end
+
+ specify do
+ aggregate_failures 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(track_action(author: user3, time: time - 3.days)).to be_truthy
+
+ expect(count_unique(date_from: time, date_to: time)).to eq(2)
+ expect(count_unique(date_from: time - 5.days, date_to: 1.day.since(time))).to eq(3)
+ end
+ end
+
+ it 'does not track edit actions if author is not present' do
+ expect(track_action(author: nil)).to be_nil
+ end
+end
+
+RSpec.shared_examples 'does not track when feature flag is disabled' do |feature_flag|
+ context "when feature flag #{feature_flag} is disabled" do
+ it 'does not track action' do
+ stub_feature_flags(feature_flag => false)
+
+ expect(track_action(author: user1)).to be_nil
+ end
+ end
+end
diff --git a/spec/support/shared_examples/lib/gitlab/usage_data_counters/issue_activity_shared_examples.rb b/spec/support/shared_examples/lib/gitlab/usage_data_counters/issue_activity_shared_examples.rb
deleted file mode 100644
index edd9b6cdf37..00000000000
--- a/spec/support/shared_examples/lib/gitlab/usage_data_counters/issue_activity_shared_examples.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-# frozen_string_literal: true
-
-RSpec.shared_examples 'a tracked issue edit event' do |event|
- before do
- stub_application_setting(usage_ping_enabled: true)
- end
-
- def count_unique(date_from:, date_to:)
- Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(event_names: action, start_date: date_from, end_date: date_to)
- end
-
- specify do
- aggregate_failures 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(track_action(author: user3, time: time - 3.days)).to be_truthy
-
- expect(count_unique(date_from: time, date_to: time)).to eq(2)
- expect(count_unique(date_from: time - 5.days, date_to: 1.day.since(time))).to eq(3)
- end
- end
-
- it 'does not track edit actions if author is not present' do
- expect(track_action(author: nil)).to be_nil
- end
-end
diff --git a/spec/support/shared_examples/lib/sentry/client_shared_examples.rb b/spec/support/shared_examples/lib/sentry/client_shared_examples.rb
index 4221708b55c..d73c7b6848d 100644
--- a/spec/support/shared_examples/lib/sentry/client_shared_examples.rb
+++ b/spec/support/shared_examples/lib/sentry/client_shared_examples.rb
@@ -26,7 +26,7 @@ RSpec.shared_examples 'no Sentry redirects' do |http_method|
end
it 'does not follow redirects' do
- expect { subject }.to raise_exception(Sentry::Client::Error, 'Sentry response status code: 302')
+ expect { subject }.to raise_exception(ErrorTracking::SentryClient::Error, 'Sentry response status code: 302')
expect(redirect_req_stub).to have_been_requested
expect(redirected_req_stub).not_to have_been_requested
end
@@ -53,7 +53,7 @@ RSpec.shared_examples 'maps Sentry exceptions' do |http_method|
it do
expect { subject }
- .to raise_exception(Sentry::Client::Error, message)
+ .to raise_exception(ErrorTracking::SentryClient::Error, message)
end
end
end
diff --git a/spec/support/shared_examples/metrics/active_record_subscriber_shared_examples.rb b/spec/support/shared_examples/metrics/active_record_subscriber_shared_examples.rb
new file mode 100644
index 00000000000..7bf2456c548
--- /dev/null
+++ b/spec/support/shared_examples/metrics/active_record_subscriber_shared_examples.rb
@@ -0,0 +1,137 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'store ActiveRecord info in RequestStore' do |db_role|
+ it 'prevents db counters from leaking to the next transaction' do
+ 2.times do
+ Gitlab::WithRequestStore.with_request_store do
+ subscriber.sql(event)
+
+ if db_role == :primary
+ expect(described_class.db_counter_payload).to eq(
+ db_count: record_query ? 1 : 0,
+ db_write_count: record_write_query ? 1 : 0,
+ db_cached_count: record_cached_query ? 1 : 0,
+ db_primary_cached_count: record_cached_query ? 1 : 0,
+ db_primary_count: record_query ? 1 : 0,
+ db_primary_duration_s: record_query ? 0.002 : 0,
+ db_replica_cached_count: 0,
+ db_replica_count: 0,
+ db_replica_duration_s: 0.0
+ )
+ elsif db_role == :replica
+ expect(described_class.db_counter_payload).to eq(
+ db_count: record_query ? 1 : 0,
+ db_write_count: record_write_query ? 1 : 0,
+ db_cached_count: record_cached_query ? 1 : 0,
+ db_primary_cached_count: 0,
+ db_primary_count: 0,
+ db_primary_duration_s: 0.0,
+ db_replica_cached_count: record_cached_query ? 1 : 0,
+ db_replica_count: record_query ? 1 : 0,
+ db_replica_duration_s: record_query ? 0.002 : 0
+ )
+ else
+ expect(described_class.db_counter_payload).to eq(
+ db_count: record_query ? 1 : 0,
+ db_write_count: record_write_query ? 1 : 0,
+ db_cached_count: record_cached_query ? 1 : 0
+ )
+ end
+ end
+ end
+ end
+end
+
+RSpec.shared_examples 'record ActiveRecord metrics in a metrics transaction' do |db_role|
+ it 'increments only db counters' do
+ if record_query
+ expect(transaction).to receive(:increment).with(:gitlab_transaction_db_count_total, 1)
+ expect(transaction).to receive(:increment).with("gitlab_transaction_db_#{db_role}_count_total".to_sym, 1) if db_role
+ else
+ expect(transaction).not_to receive(:increment).with(:gitlab_transaction_db_count_total, 1)
+ expect(transaction).not_to receive(:increment).with("gitlab_transaction_db_#{db_role}_count_total".to_sym, 1) if db_role
+ end
+
+ if record_write_query
+ expect(transaction).to receive(:increment).with(:gitlab_transaction_db_write_count_total, 1)
+ else
+ expect(transaction).not_to receive(:increment).with(:gitlab_transaction_db_write_count_total, 1)
+ end
+
+ if record_cached_query
+ expect(transaction).to receive(:increment).with(:gitlab_transaction_db_cached_count_total, 1)
+ expect(transaction).to receive(:increment).with("gitlab_transaction_db_#{db_role}_cached_count_total".to_sym, 1) if db_role
+ else
+ expect(transaction).not_to receive(:increment).with(:gitlab_transaction_db_cached_count_total, 1)
+ expect(transaction).not_to receive(:increment).with("gitlab_transaction_db_#{db_role}_cached_count_total".to_sym, 1) if db_role
+ end
+
+ subscriber.sql(event)
+ end
+
+ it 'observes sql_duration metric' do
+ if record_query
+ expect(transaction).to receive(:observe).with(:gitlab_sql_duration_seconds, 0.002)
+ expect(transaction).to receive(:observe).with("gitlab_sql_#{db_role}_duration_seconds".to_sym, 0.002) if db_role
+ else
+ expect(transaction).not_to receive(:observe)
+ end
+
+ subscriber.sql(event)
+ end
+end
+
+RSpec.shared_examples 'record ActiveRecord metrics' do |db_role|
+ context 'when both web and background transaction are available' do
+ let(:transaction) { double('Gitlab::Metrics::WebTransaction') }
+ let(:background_transaction) { double('Gitlab::Metrics::WebTransaction') }
+
+ before do
+ allow(::Gitlab::Metrics::WebTransaction).to receive(:current)
+ .and_return(transaction)
+ allow(::Gitlab::Metrics::BackgroundTransaction).to receive(:current)
+ .and_return(background_transaction)
+ allow(transaction).to receive(:increment)
+ allow(transaction).to receive(:observe)
+ end
+
+ it_behaves_like 'record ActiveRecord metrics in a metrics transaction', db_role
+
+ it 'captures the metrics for web only' do
+ expect(background_transaction).not_to receive(:observe)
+ expect(background_transaction).not_to receive(:increment)
+
+ subscriber.sql(event)
+ end
+ end
+
+ context 'when web transaction is available' do
+ let(:transaction) { double('Gitlab::Metrics::WebTransaction') }
+
+ before do
+ allow(::Gitlab::Metrics::WebTransaction).to receive(:current)
+ .and_return(transaction)
+ allow(::Gitlab::Metrics::BackgroundTransaction).to receive(:current)
+ .and_return(nil)
+ allow(transaction).to receive(:increment)
+ allow(transaction).to receive(:observe)
+ end
+
+ it_behaves_like 'record ActiveRecord metrics in a metrics transaction', db_role
+ end
+
+ context 'when background transaction is available' do
+ let(:transaction) { double('Gitlab::Metrics::BackgroundTransaction') }
+
+ before do
+ allow(::Gitlab::Metrics::WebTransaction).to receive(:current)
+ .and_return(nil)
+ allow(::Gitlab::Metrics::BackgroundTransaction).to receive(:current)
+ .and_return(transaction)
+ allow(transaction).to receive(:increment)
+ allow(transaction).to receive(:observe)
+ end
+
+ it_behaves_like 'record ActiveRecord metrics in a metrics transaction', db_role
+ end
+end
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 92fd4363134..60a02d85a1e 100644
--- a/spec/support/shared_examples/models/application_setting_shared_examples.rb
+++ b/spec/support/shared_examples/models/application_setting_shared_examples.rb
@@ -289,6 +289,7 @@ RSpec.shared_examples 'application settings examples' do
describe '#pick_repository_storage' do
before do
+ allow(Gitlab.config.repositories.storages).to receive(:keys).and_return(%w(default backup))
allow(setting).to receive(:repository_storages_weighted).and_return({ 'default' => 20, 'backup' => 80 })
end
@@ -304,15 +305,19 @@ RSpec.shared_examples 'application settings examples' do
describe '#normalized_repository_storage_weights' do
using RSpec::Parameterized::TableSyntax
- where(:storages, :normalized) do
- { 'default' => 0, 'backup' => 100 } | { 'default' => 0.0, 'backup' => 1.0 }
- { 'default' => 100, 'backup' => 100 } | { 'default' => 0.5, 'backup' => 0.5 }
- { 'default' => 20, 'backup' => 80 } | { 'default' => 0.2, 'backup' => 0.8 }
- { 'default' => 0, 'backup' => 0 } | { 'default' => 0.0, 'backup' => 0.0 }
+ where(:config_storages, :storages, :normalized) do
+ %w(default backup) | { 'default' => 0, 'backup' => 100 } | { 'default' => 0.0, 'backup' => 1.0 }
+ %w(default backup) | { 'default' => 100, 'backup' => 100 } | { 'default' => 0.5, 'backup' => 0.5 }
+ %w(default backup) | { 'default' => 20, 'backup' => 80 } | { 'default' => 0.2, 'backup' => 0.8 }
+ %w(default backup) | { 'default' => 0, 'backup' => 0 } | { 'default' => 0.0, 'backup' => 0.0 }
+ %w(default) | { 'default' => 0, 'backup' => 100 } | { 'default' => 0.0 }
+ %w(default) | { 'default' => 100, 'backup' => 100 } | { 'default' => 1.0 }
+ %w(default) | { 'default' => 20, 'backup' => 80 } | { 'default' => 1.0 }
end
with_them do
before do
+ allow(Gitlab.config.repositories.storages).to receive(:keys).and_return(config_storages)
allow(setting).to receive(:repository_storages_weighted).and_return(storages)
end
diff --git a/spec/support/shared_examples/models/boards/user_preferences_shared_examples.rb b/spec/support/shared_examples/models/boards/user_preferences_shared_examples.rb
new file mode 100644
index 00000000000..766aeac9476
--- /dev/null
+++ b/spec/support/shared_examples/models/boards/user_preferences_shared_examples.rb
@@ -0,0 +1,68 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'list_preferences_for user' do |list_factory, list_id_attribute|
+ subject { create(list_factory) } # rubocop:disable Rails/SaveBang
+
+ let_it_be(:user) { create(:user) }
+
+ describe '#preferences_for' do
+ context 'when user is nil' do
+ it 'returns not persisted preferences' do
+ preferences = subject.preferences_for(nil)
+
+ expect(preferences).not_to be_persisted
+ expect(preferences[list_id_attribute]).to eq(subject.id)
+ expect(preferences.user_id).to be_nil
+ end
+ end
+
+ context 'when a user preference already exists' do
+ before do
+ subject.update_preferences_for(user, collapsed: true)
+ end
+
+ it 'loads preference for user' do
+ preferences = subject.preferences_for(user)
+
+ expect(preferences).to be_persisted
+ expect(preferences.collapsed).to eq(true)
+ end
+ end
+
+ context 'when preferences for user does not exist' do
+ it 'returns not persisted preferences' do
+ preferences = subject.preferences_for(user)
+
+ expect(preferences).not_to be_persisted
+ expect(preferences.user_id).to eq(user.id)
+ expect(preferences.public_send(list_id_attribute)).to eq(subject.id)
+ end
+ end
+ end
+
+ describe '#update_preferences_for' do
+ context 'when user is present' do
+ context 'when there are no preferences for user' do
+ it 'creates new user preferences' do
+ expect { subject.update_preferences_for(user, collapsed: true) }.to change { subject.preferences.count }.by(1)
+ expect(subject.preferences_for(user).collapsed).to eq(true)
+ end
+ end
+
+ context 'when there are preferences for user' do
+ it 'updates user preferences' do
+ subject.update_preferences_for(user, collapsed: false)
+
+ expect { subject.update_preferences_for(user, collapsed: true) }.not_to change { subject.preferences.count }
+ expect(subject.preferences_for(user).collapsed).to eq(true)
+ end
+ end
+
+ context 'when user is nil' do
+ it 'does not create user preferences' do
+ expect { subject.update_preferences_for(nil, collapsed: true) }.not_to change { subject.preferences.count }
+ end
+ end
+ end
+ end
+end
diff --git a/spec/support/shared_examples/models/chat_service_shared_examples.rb b/spec/support/shared_examples/models/chat_service_shared_examples.rb
index ad237ad9f49..59e249bb865 100644
--- a/spec/support/shared_examples/models/chat_service_shared_examples.rb
+++ b/spec/support/shared_examples/models/chat_service_shared_examples.rb
@@ -53,9 +53,13 @@ RSpec.shared_examples "chat service" do |service_name|
end
it "calls #{service_name} API" do
- subject.execute(sample_data)
+ result = subject.execute(sample_data)
- expect(WebMock).to have_requested(:post, webhook_url).with { |req| req.body =~ /\A{"#{content_key}":.+}\Z/ }.once
+ expect(result).to be(true)
+ expect(WebMock).to have_requested(:post, webhook_url).once.with { |req|
+ json_body = Gitlab::Json.parse(req.body).with_indifferent_access
+ expect(json_body).to include(payload)
+ }
end
end
@@ -67,7 +71,8 @@ RSpec.shared_examples "chat service" do |service_name|
it "does not call #{service_name} API" do
result = subject.execute(sample_data)
- expect(result).to be_falsy
+ expect(result).to be(false)
+ expect(WebMock).not_to have_requested(:post, webhook_url)
end
end
diff --git a/spec/support/shared_examples/models/concerns/timebox_shared_examples.rb b/spec/support/shared_examples/models/concerns/timebox_shared_examples.rb
index f91e4bd8cf7..68142e667a4 100644
--- a/spec/support/shared_examples/models/concerns/timebox_shared_examples.rb
+++ b/spec/support/shared_examples/models/concerns/timebox_shared_examples.rb
@@ -18,7 +18,7 @@ RSpec.shared_examples 'a timebox' do |timebox_type|
context 'with a project' do
it_behaves_like 'AtomicInternalId' do
let(:internal_id_attribute) { :iid }
- let(:instance) { build(timebox_type, *timebox_args, project: build(:project), group: nil) }
+ let(:instance) { build(timebox_type, *timebox_args, project: create(:project), group: nil) }
let(:scope) { :project }
let(:scope_attrs) { { project: instance.project } }
let(:usage) { timebox_table_name }
@@ -28,7 +28,7 @@ RSpec.shared_examples 'a timebox' do |timebox_type|
context 'with a group' do
it_behaves_like 'AtomicInternalId' do
let(:internal_id_attribute) { :iid }
- let(:instance) { build(timebox_type, *timebox_args, project: nil, group: build(:group)) }
+ let(:instance) { build(timebox_type, *timebox_args, project: nil, group: create(:group)) }
let(:scope) { :group }
let(:scope_attrs) { { namespace: instance.group } }
let(:usage) { timebox_table_name }
diff --git a/spec/support/shared_examples/models/email_format_shared_examples.rb b/spec/support/shared_examples/models/email_format_shared_examples.rb
index a8115e440a4..77ded168637 100644
--- a/spec/support/shared_examples/models/email_format_shared_examples.rb
+++ b/spec/support/shared_examples/models/email_format_shared_examples.rb
@@ -6,7 +6,7 @@
# Note: You have access to `email_value` which is the email address value
# being currently tested).
-RSpec.shared_examples 'an object with email-formated attributes' do |*attributes|
+RSpec.shared_examples 'an object with email-formatted attributes' do |*attributes|
attributes.each do |attribute|
describe "specifically its :#{attribute} attribute" do
%w[
@@ -45,7 +45,7 @@ RSpec.shared_examples 'an object with email-formated attributes' do |*attributes
end
end
-RSpec.shared_examples 'an object with RFC3696 compliant email-formated attributes' do |*attributes|
+RSpec.shared_examples 'an object with RFC3696 compliant email-formatted attributes' do |*attributes|
attributes.each do |attribute|
describe "specifically its :#{attribute} attribute" do
%w[
diff --git a/spec/support/shared_examples/models/slack_mattermost_notifications_shared_examples.rb b/spec/support/shared_examples/models/slack_mattermost_notifications_shared_examples.rb
index a1867e1ce39..71a76121d38 100644
--- a/spec/support/shared_examples/models/slack_mattermost_notifications_shared_examples.rb
+++ b/spec/support/shared_examples/models/slack_mattermost_notifications_shared_examples.rb
@@ -7,7 +7,7 @@ RSpec.shared_examples 'slack or mattermost notifications' do |service_name|
let(:webhook_url) { 'https://example.gitlab.com' }
def execute_with_options(options)
- receive(:new).with(webhook_url, options.merge(http_client: SlackService::Notifier::HTTPClient))
+ receive(:new).with(webhook_url, options.merge(http_client: SlackMattermost::Notifier::HTTPClient))
.and_return(double(:slack_service).as_null_object)
end
@@ -66,193 +66,180 @@ RSpec.shared_examples 'slack or mattermost notifications' do |service_name|
end
describe "#execute" do
- let(:user) { create(:user) }
- let(:project) { create(:project, :repository, :wiki_repo) }
- let(:username) { 'slack_username' }
- let(:channel) { 'slack_channel' }
- let(:issue_service_options) { { title: 'Awesome issue', description: 'please fix' } }
+ let_it_be(:project) { create(:project, :repository, :wiki_repo) }
+ let_it_be(:user) { create(:user) }
- let(:data) do
- Gitlab::DataBuilder::Push.build_sample(project, user)
- end
+ let(:chat_service) { described_class.new( { project: project, webhook: webhook_url, branches_to_be_notified: 'all' }.merge(chat_service_params)) }
+ let(:chat_service_params) { {} }
+ let(:data) { Gitlab::DataBuilder::Push.build_sample(project, user) }
let!(:stubbed_resolved_hostname) do
stub_full_request(webhook_url, method: :post).request_pattern.uri_pattern.to_s
end
- before do
- allow(chat_service).to receive_messages(
- project: project,
- project_id: project.id,
- service_hook: true,
- webhook: webhook_url
- )
+ subject(:execute_service) { chat_service.execute(data) }
- issue_service = Issues::CreateService.new(project, user, issue_service_options)
- @issue = issue_service.execute
- @issues_sample_data = issue_service.hook_data(@issue, 'open')
-
- project.add_developer(user)
- opts = {
- title: 'Awesome merge_request',
- description: 'please fix',
- source_branch: 'feature',
- target_branch: 'master'
- }
- merge_service = MergeRequests::CreateService.new(project,
- user, opts)
- @merge_request = merge_service.execute
- @merge_sample_data = merge_service.hook_data(@merge_request,
- 'open')
-
- opts = {
- title: "Awesome wiki_page",
- content: "Some text describing some thing or another",
- format: "md",
- message: "user created page: Awesome wiki_page"
- }
-
- @wiki_page = create(:wiki_page, wiki: project.wiki, **opts)
- @wiki_page_sample_data = Gitlab::DataBuilder::WikiPage.build(@wiki_page, user, 'create')
- end
-
- it "calls #{service_name} API for push events" do
- chat_service.execute(data)
-
- expect(WebMock).to have_requested(:post, stubbed_resolved_hostname).once
- end
+ shared_examples 'calls the service API with the event message' do |event_message|
+ specify do
+ expect_next_instance_of(Slack::Messenger) do |messenger|
+ expect(messenger).to receive(:ping).with(event_message, anything).and_call_original
+ end
- it "calls #{service_name} API for issue events" do
- chat_service.execute(@issues_sample_data)
+ execute_service
- expect(WebMock).to have_requested(:post, stubbed_resolved_hostname).once
+ expect(WebMock).to have_requested(:post, stubbed_resolved_hostname).once
+ end
end
- it "calls #{service_name} API for merge requests events" do
- chat_service.execute(@merge_sample_data)
+ context 'with username for slack configured' do
+ let(:chat_service_params) { { username: 'slack_username' } }
+
+ it 'uses the username as an option' do
+ expect(Slack::Messenger).to execute_with_options(username: 'slack_username')
- expect(WebMock).to have_requested(:post, stubbed_resolved_hostname).once
+ execute_service
+ end
end
- it "calls #{service_name} API for wiki page events" do
- chat_service.execute(@wiki_page_sample_data)
+ context 'push events' do
+ let(:data) { Gitlab::DataBuilder::Push.build_sample(project, user) }
- expect(WebMock).to have_requested(:post, stubbed_resolved_hostname).once
- end
+ it_behaves_like 'calls the service API with the event message', /pushed to branch/
- it "calls #{service_name} API for deployment events" do
- deployment_event_data = { object_kind: 'deployment' }
+ context 'with event channel' do
+ let(:chat_service_params) { { push_channel: 'random' } }
- chat_service.execute(deployment_event_data)
+ it 'uses the right channel for push event' do
+ expect(Slack::Messenger).to execute_with_options(channel: ['random'])
- expect(WebMock).to have_requested(:post, stubbed_resolved_hostname).once
+ execute_service
+ end
+ end
end
- it 'uses the username as an option for slack when configured' do
- allow(chat_service).to receive(:username).and_return(username)
-
- expect(Slack::Messenger).to execute_with_options(username: username)
+ context 'tag_push events' do
+ let(:oldrev) { Gitlab::Git::BLANK_SHA }
+ let(:newrev) { '8a2a6eb295bb170b34c24c76c49ed0e9b2eaf34b' } # gitlab-test: git rev-parse refs/tags/v1.1.0
+ let(:ref) { 'refs/tags/v1.1.0' }
+ let(:data) { Git::TagHooksService.new(project, user, change: { oldrev: oldrev, newrev: newrev, ref: ref }).send(:push_data) }
- chat_service.execute(data)
+ it_behaves_like 'calls the service API with the event message', /pushed new tag/
end
- it 'uses the channel as an option when it is configured' do
- allow(chat_service).to receive(:channel).and_return(channel)
- expect(Slack::Messenger).to execute_with_options(channel: [channel])
- chat_service.execute(data)
- end
+ context 'issue events' do
+ let_it_be(:issue) { create(:issue) }
+ let(:data) { issue.to_hook_data(user) }
- context "event channels" do
- it "uses the right channel for push event" do
- chat_service.update!(push_channel: "random")
+ it_behaves_like 'calls the service API with the event message', /Issue (.*?) opened by/
- expect(Slack::Messenger).to execute_with_options(channel: ['random'])
+ context 'whith event channel' do
+ let(:chat_service_params) { { issue_channel: 'random' } }
- chat_service.execute(data)
- end
+ it 'uses the right channel for issue event' do
+ expect(Slack::Messenger).to execute_with_options(channel: ['random'])
- it "uses the right channel for merge request event" do
- chat_service.update!(merge_request_channel: "random")
+ execute_service
+ end
- expect(Slack::Messenger).to execute_with_options(channel: ['random'])
+ context 'for confidential issues' do
+ before_all do
+ issue.update!(confidential: true)
+ end
- chat_service.execute(@merge_sample_data)
- end
+ it 'falls back to issue channel' do
+ expect(Slack::Messenger).to execute_with_options(channel: ['random'])
+
+ execute_service
+ end
- it "uses the right channel for issue event" do
- chat_service.update!(issue_channel: "random")
+ context 'and confidential_issue_channel is defined' do
+ let(:chat_service_params) { { issue_channel: 'random', confidential_issue_channel: 'confidential' } }
- expect(Slack::Messenger).to execute_with_options(channel: ['random'])
+ it 'uses the confidential issue channel when it is defined' do
+ expect(Slack::Messenger).to execute_with_options(channel: ['confidential'])
- chat_service.execute(@issues_sample_data)
+ execute_service
+ end
+ end
+ end
end
+ end
+
+ context 'merge request events' do
+ let_it_be(:merge_request) { create(:merge_request) }
+ let(:data) { merge_request.to_hook_data(user) }
- context 'for confidential issues' do
- let(:issue_service_options) { { title: 'Secret', confidential: true } }
+ it_behaves_like 'calls the service API with the event message', /opened merge request/
- it "uses confidential issue channel" do
- chat_service.update!(confidential_issue_channel: 'confidential')
+ context 'with event channel' do
+ let(:chat_service_params) { { merge_request_channel: 'random' } }
- expect(Slack::Messenger).to execute_with_options(channel: ['confidential'])
+ it 'uses the right channel for merge request event' do
+ expect(Slack::Messenger).to execute_with_options(channel: ['random'])
- chat_service.execute(@issues_sample_data)
+ execute_service
end
+ end
+ end
+
+ context 'wiki page events' do
+ let_it_be(:wiki_page) { create(:wiki_page, wiki: project.wiki, message: 'user created page: Awesome wiki_page') }
+ let(:data) { Gitlab::DataBuilder::WikiPage.build(wiki_page, user, 'create') }
- it 'falls back to issue channel' do
- chat_service.update!(issue_channel: 'fallback_channel')
+ it_behaves_like 'calls the service API with the event message', / created (.*?)wikis\/(.*?)|wiki page> in/
- expect(Slack::Messenger).to execute_with_options(channel: ['fallback_channel'])
+ context 'with event channel' do
+ let(:chat_service_params) { { wiki_page_channel: 'random' } }
- chat_service.execute(@issues_sample_data)
+ it 'uses the right channel for wiki event' do
+ expect(Slack::Messenger).to execute_with_options(channel: ['random'])
+
+ execute_service
end
end
+ end
- it "uses the right channel for wiki event" do
- chat_service.update!(wiki_page_channel: "random")
-
- expect(Slack::Messenger).to execute_with_options(channel: ['random'])
+ context 'deployment events' do
+ let_it_be(:deployment) { create(:deployment) }
+ let(:data) { Gitlab::DataBuilder::Deployment.build(deployment) }
- chat_service.execute(@wiki_page_sample_data)
- end
+ it_behaves_like 'calls the service API with the event message', /Deploy to (.*?) created/
+ end
- context "note event" do
- let(:issue_note) do
- create(:note_on_issue, project: project, note: "issue note")
- end
+ context 'note event' do
+ let_it_be(:issue_note) { create(:note_on_issue, project: project, note: "issue note") }
+ let(:data) { Gitlab::DataBuilder::Note.build(issue_note, user) }
- it "uses the right channel" do
- chat_service.update!(note_channel: "random")
+ it_behaves_like 'calls the service API with the event message', /commented on issue/
- note_data = Gitlab::DataBuilder::Note.build(issue_note, user)
+ context 'with event channel' do
+ let(:chat_service_params) { { note_channel: 'random' } }
+ it 'uses the right channel' do
expect(Slack::Messenger).to execute_with_options(channel: ['random'])
- chat_service.execute(note_data)
+ execute_service
end
context 'for confidential notes' do
- before do
- issue_note.noteable.update!(confidential: true)
+ before_all do
+ issue_note.update!(confidential: true)
end
- it "uses confidential channel" do
- chat_service.update!(confidential_note_channel: "confidential")
-
- note_data = Gitlab::DataBuilder::Note.build(issue_note, user)
-
- expect(Slack::Messenger).to execute_with_options(channel: ['confidential'])
+ it 'falls back to note channel' do
+ expect(Slack::Messenger).to execute_with_options(channel: ['random'])
- chat_service.execute(note_data)
+ execute_service
end
- it 'falls back to note channel' do
- chat_service.update!(note_channel: "fallback_channel")
-
- note_data = Gitlab::DataBuilder::Note.build(issue_note, user)
+ context 'and confidential_note_channel is defined' do
+ let(:chat_service_params) { { note_channel: 'random', confidential_note_channel: 'confidential' } }
- expect(Slack::Messenger).to execute_with_options(channel: ['fallback_channel'])
+ it 'uses confidential channel' do
+ expect(Slack::Messenger).to execute_with_options(channel: ['confidential'])
- chat_service.execute(note_data)
+ execute_service
+ end
end
end
end
diff --git a/spec/support/shared_examples/quick_actions/issuable/time_tracking_quick_action_shared_examples.rb b/spec/support/shared_examples/quick_actions/issuable/time_tracking_quick_action_shared_examples.rb
index 17fd2b836d3..92849ddf1cb 100644
--- a/spec/support/shared_examples/quick_actions/issuable/time_tracking_quick_action_shared_examples.rb
+++ b/spec/support/shared_examples/quick_actions/issuable/time_tracking_quick_action_shared_examples.rb
@@ -93,6 +93,6 @@ end
def submit_time(quick_action)
fill_in 'note[note]', with: quick_action
- find('.js-comment-submit-button').click
+ find('[data-testid="comment-button"]').click
wait_for_requests
end
diff --git a/spec/support/shared_examples/requests/api/conan_packages_shared_examples.rb b/spec/support/shared_examples/requests/api/conan_packages_shared_examples.rb
index 49b6fc13900..54ea876bed2 100644
--- a/spec/support/shared_examples/requests/api/conan_packages_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/conan_packages_shared_examples.rb
@@ -1,63 +1,13 @@
# frozen_string_literal: true
RSpec.shared_examples 'conan ping endpoint' do
- it 'responds with 401 Unauthorized when no token provided' do
+ it 'responds with 200 OK when no token provided' do
get api(url)
- expect(response).to have_gitlab_http_status(:unauthorized)
- end
-
- it 'responds with 200 OK when valid token is provided' do
- jwt = build_jwt(personal_access_token)
- get api(url), headers: build_token_auth_header(jwt.encoded)
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(response.headers['X-Conan-Server-Capabilities']).to eq("")
- end
-
- it 'responds with 200 OK when valid job token is provided' do
- jwt = build_jwt_from_job(job)
- get api(url), headers: build_token_auth_header(jwt.encoded)
-
expect(response).to have_gitlab_http_status(:ok)
expect(response.headers['X-Conan-Server-Capabilities']).to eq("")
end
- it 'responds with 200 OK when valid deploy token is provided' do
- jwt = build_jwt_from_deploy_token(deploy_token)
- get api(url), headers: build_token_auth_header(jwt.encoded)
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(response.headers['X-Conan-Server-Capabilities']).to eq("")
- end
-
- it 'responds with 401 Unauthorized when invalid access token ID is provided' do
- jwt = build_jwt(double(id: 12345), user_id: personal_access_token.user_id)
- get api(url), headers: build_token_auth_header(jwt.encoded)
-
- expect(response).to have_gitlab_http_status(:unauthorized)
- end
-
- it 'responds with 401 Unauthorized when invalid user is provided' do
- jwt = build_jwt(personal_access_token, user_id: 12345)
- get api(url), headers: build_token_auth_header(jwt.encoded)
-
- expect(response).to have_gitlab_http_status(:unauthorized)
- end
-
- it 'responds with 401 Unauthorized when the provided JWT is signed with different secret' do
- jwt = build_jwt(personal_access_token, secret: SecureRandom.base64(32))
- get api(url), headers: build_token_auth_header(jwt.encoded)
-
- expect(response).to have_gitlab_http_status(:unauthorized)
- end
-
- it 'responds with 401 Unauthorized when invalid JWT is provided' do
- get api(url), headers: build_token_auth_header('invalid-jwt')
-
- expect(response).to have_gitlab_http_status(:unauthorized)
- end
-
context 'packages feature disabled' do
it 'responds with 404 Not Found' do
stub_packages_setting(enabled: false)
@@ -72,7 +22,10 @@ RSpec.shared_examples 'conan search endpoint' do
before do
project.update_column(:visibility_level, Gitlab::VisibilityLevel::PUBLIC)
- get api(url), headers: headers, params: params
+ # Do not pass the HTTP_AUTHORIZATION header,
+ # in order to test that this public project's packages
+ # are visible to anonymous search.
+ get api(url), params: params
end
subject { json_response['results'] }
@@ -109,6 +62,33 @@ RSpec.shared_examples 'conan authenticate endpoint' do
end
end
+ it 'responds with 401 Unauthorized when an invalid access token ID is provided' do
+ jwt = build_jwt(double(id: 12345), user_id: personal_access_token.user_id)
+ get api(url), headers: build_token_auth_header(jwt.encoded)
+
+ expect(response).to have_gitlab_http_status(:unauthorized)
+ end
+
+ it 'responds with 401 Unauthorized when invalid user is provided' do
+ jwt = build_jwt(personal_access_token, user_id: 12345)
+ get api(url), headers: build_token_auth_header(jwt.encoded)
+
+ expect(response).to have_gitlab_http_status(:unauthorized)
+ end
+
+ it 'responds with 401 Unauthorized when the provided JWT is signed with different secret' do
+ jwt = build_jwt(personal_access_token, secret: SecureRandom.base64(32))
+ get api(url), headers: build_token_auth_header(jwt.encoded)
+
+ expect(response).to have_gitlab_http_status(:unauthorized)
+ end
+
+ it 'responds with 401 UnauthorizedOK when invalid JWT is provided' do
+ get api(url), headers: build_token_auth_header('invalid-jwt')
+
+ expect(response).to have_gitlab_http_status(:unauthorized)
+ end
+
context 'when valid JWT access token is provided' do
it 'responds with 200' do
subject
@@ -507,19 +487,37 @@ RSpec.shared_examples 'delete package endpoint' do
end
end
+RSpec.shared_examples 'allows download with no token' do
+ context 'with no private token' do
+ let(:headers) { {} }
+
+ it 'returns 200' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+end
+
RSpec.shared_examples 'denies download with no token' do
context 'with no private token' do
let(:headers) { {} }
- it 'returns 400' do
+ it 'returns 404' do
subject
- expect(response).to have_gitlab_http_status(:unauthorized)
+ expect(response).to have_gitlab_http_status(:not_found)
end
end
end
RSpec.shared_examples 'a public project with packages' do
+ before do
+ project.update_column(:visibility_level, Gitlab::VisibilityLevel::PUBLIC)
+ end
+
+ it_behaves_like 'allows download with no token'
+
it 'returns the file' do
subject
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 54f4ba7ff73..274516cd87b 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
@@ -25,7 +25,7 @@ RSpec.shared_examples 'group and project boards query' do
board = create(:board, resource_parent: board_parent, name: 'A')
allow(Ability).to receive(:allowed?).and_call_original
- allow(Ability).to receive(:allowed?).with(user, :read_board, board).and_return(false)
+ allow(Ability).to receive(:allowed?).with(user, :read_issue_board, board).and_return(false)
post_graphql(query, current_user: current_user)
diff --git a/spec/support/shared_examples/requests/api/graphql/packages/group_and_project_packages_list_shared_examples.rb b/spec/support/shared_examples/requests/api/graphql/packages/group_and_project_packages_list_shared_examples.rb
new file mode 100644
index 00000000000..66fbfa798b0
--- /dev/null
+++ b/spec/support/shared_examples/requests/api/graphql/packages/group_and_project_packages_list_shared_examples.rb
@@ -0,0 +1,51 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'group and project packages query' do
+ include GraphqlHelpers
+
+ context 'when user has access to the resource' do
+ before do
+ resource.add_reporter(current_user)
+ post_graphql(query, current_user: current_user)
+ end
+
+ it_behaves_like 'a working graphql query'
+
+ it 'returns packages successfully' do
+ expect(package_names).to contain_exactly(
+ package.name,
+ maven_package.name,
+ debian_package.name,
+ composer_package.name
+ )
+ end
+
+ it 'deals with metadata' do
+ expect(target_shas).to contain_exactly(composer_metadatum.target_sha)
+ end
+ end
+
+ context 'when the user does not have access to the resource' do
+ before do
+ post_graphql(query, current_user: current_user)
+ end
+
+ it_behaves_like 'a working graphql query'
+
+ it 'returns nil' do
+ expect(packages).to be_nil
+ end
+ end
+
+ context 'when the user is not authenticated' do
+ before do
+ post_graphql(query)
+ end
+
+ it_behaves_like 'a working graphql query'
+
+ it 'returns nil' do
+ expect(packages).to be_nil
+ end
+ end
+end
diff --git a/spec/support/shared_examples/requests/api/logging_application_context_shared_examples.rb b/spec/support/shared_examples/requests/api/logging_application_context_shared_examples.rb
index 038ede884c8..4a71b696d57 100644
--- a/spec/support/shared_examples/requests/api/logging_application_context_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/logging_application_context_shared_examples.rb
@@ -22,3 +22,19 @@ RSpec.shared_examples 'storing arguments in the application context' do
hash.transform_keys! { |key| "meta.#{key}" }
end
end
+
+RSpec.shared_examples 'not executing any extra queries for the application context' do |expected_extra_queries = 0|
+ it 'does not execute more queries than without adding anything to the application context' do
+ # Call the subject once to memoize all factories being used for the spec, so they won't
+ # add any queries to the expectation.
+ subject_proc.call
+
+ expect do
+ allow(Gitlab::ApplicationContext).to receive(:push).and_call_original
+ subject_proc.call
+ end.to issue_same_number_of_queries_as {
+ allow(Gitlab::ApplicationContext).to receive(:push)
+ subject_proc.call
+ }.with_threshold(expected_extra_queries).ignoring_cached_queries
+ end
+end
diff --git a/spec/support/shared_examples/requests/api/npm_packages_shared_examples.rb b/spec/support/shared_examples/requests/api/npm_packages_shared_examples.rb
index be051dcbb7b..c15c59e1a1d 100644
--- a/spec/support/shared_examples/requests/api/npm_packages_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/npm_packages_shared_examples.rb
@@ -45,136 +45,234 @@ RSpec.shared_examples 'handling get metadata requests' do |scope: :project|
end
end
- where(:auth, :package_name_type, :request_forward, :visibility, :user_role, :expected_result, :expected_status) do
- nil | :scoped_naming_convention | true | 'PUBLIC' | nil | :accept | :ok
- nil | :scoped_naming_convention | false | 'PUBLIC' | nil | :accept | :ok
- nil | :non_existing | true | 'PUBLIC' | nil | :redirect | :redirected
- nil | :non_existing | false | 'PUBLIC' | nil | :reject | :not_found
- nil | :scoped_naming_convention | true | 'PRIVATE' | nil | :reject | :not_found
- nil | :scoped_naming_convention | false | 'PRIVATE' | nil | :reject | :not_found
- nil | :non_existing | true | 'PRIVATE' | nil | :redirect | :redirected
- nil | :non_existing | false | 'PRIVATE' | nil | :reject | :not_found
- nil | :scoped_naming_convention | true | 'INTERNAL' | nil | :reject | :not_found
- nil | :scoped_naming_convention | false | 'INTERNAL' | nil | :reject | :not_found
- nil | :non_existing | true | 'INTERNAL' | nil | :redirect | :redirected
- nil | :non_existing | false | 'INTERNAL' | nil | :reject | :not_found
-
- :oauth | :scoped_naming_convention | true | 'PUBLIC' | :guest | :accept | :ok
- :oauth | :scoped_naming_convention | true | 'PUBLIC' | :reporter | :accept | :ok
- :oauth | :scoped_naming_convention | false | 'PUBLIC' | :guest | :accept | :ok
- :oauth | :scoped_naming_convention | false | 'PUBLIC' | :reporter | :accept | :ok
- :oauth | :non_existing | true | 'PUBLIC' | :guest | :redirect | :redirected
- :oauth | :non_existing | true | 'PUBLIC' | :reporter | :redirect | :redirected
- :oauth | :non_existing | false | 'PUBLIC' | :guest | :reject | :not_found
- :oauth | :non_existing | false | 'PUBLIC' | :reporter | :reject | :not_found
- :oauth | :scoped_naming_convention | true | 'PRIVATE' | :guest | :reject | :forbidden
- :oauth | :scoped_naming_convention | true | 'PRIVATE' | :reporter | :accept | :ok
- :oauth | :scoped_naming_convention | false | 'PRIVATE' | :guest | :reject | :forbidden
- :oauth | :scoped_naming_convention | false | 'PRIVATE' | :reporter | :accept | :ok
- :oauth | :non_existing | true | 'PRIVATE' | :guest | :redirect | :redirected
- :oauth | :non_existing | true | 'PRIVATE' | :reporter | :redirect | :redirected
- :oauth | :non_existing | false | 'PRIVATE' | :guest | :reject | :forbidden
- :oauth | :non_existing | false | 'PRIVATE' | :reporter | :reject | :not_found
- :oauth | :scoped_naming_convention | true | 'INTERNAL' | :guest | :accept | :ok
- :oauth | :scoped_naming_convention | true | 'INTERNAL' | :reporter | :accept | :ok
- :oauth | :scoped_naming_convention | false | 'INTERNAL' | :guest | :accept | :ok
- :oauth | :scoped_naming_convention | false | 'INTERNAL' | :reporter | :accept | :ok
- :oauth | :non_existing | true | 'INTERNAL' | :guest | :redirect | :redirected
- :oauth | :non_existing | true | 'INTERNAL' | :reporter | :redirect | :redirected
- :oauth | :non_existing | false | 'INTERNAL' | :guest | :reject | :not_found
- :oauth | :non_existing | false | 'INTERNAL' | :reporter | :reject | :not_found
-
- :personal_access_token | :scoped_naming_convention | true | 'PUBLIC' | :guest | :accept | :ok
- :personal_access_token | :scoped_naming_convention | true | 'PUBLIC' | :reporter | :accept | :ok
- :personal_access_token | :scoped_naming_convention | false | 'PUBLIC' | :guest | :accept | :ok
- :personal_access_token | :scoped_naming_convention | false | 'PUBLIC' | :reporter | :accept | :ok
- :personal_access_token | :non_existing | true | 'PUBLIC' | :guest | :redirect | :redirected
- :personal_access_token | :non_existing | true | 'PUBLIC' | :reporter | :redirect | :redirected
- :personal_access_token | :non_existing | false | 'PUBLIC' | :guest | :reject | :not_found
- :personal_access_token | :non_existing | false | 'PUBLIC' | :reporter | :reject | :not_found
- :personal_access_token | :scoped_naming_convention | true | 'PRIVATE' | :guest | :reject | :forbidden
- :personal_access_token | :scoped_naming_convention | true | 'PRIVATE' | :reporter | :accept | :ok
- :personal_access_token | :scoped_naming_convention | false | 'PRIVATE' | :guest | :reject | :forbidden
- :personal_access_token | :scoped_naming_convention | false | 'PRIVATE' | :reporter | :accept | :ok
- :personal_access_token | :non_existing | true | 'PRIVATE' | :guest | :redirect | :redirected
- :personal_access_token | :non_existing | true | 'PRIVATE' | :reporter | :redirect | :redirected
- :personal_access_token | :non_existing | false | 'PRIVATE' | :guest | :reject | :forbidden
- :personal_access_token | :non_existing | false | 'PRIVATE' | :reporter | :reject | :not_found
- :personal_access_token | :scoped_naming_convention | true | 'INTERNAL' | :guest | :accept | :ok
- :personal_access_token | :scoped_naming_convention | true | 'INTERNAL' | :reporter | :accept | :ok
- :personal_access_token | :scoped_naming_convention | false | 'INTERNAL' | :guest | :accept | :ok
- :personal_access_token | :scoped_naming_convention | false | 'INTERNAL' | :reporter | :accept | :ok
- :personal_access_token | :non_existing | true | 'INTERNAL' | :guest | :redirect | :redirected
- :personal_access_token | :non_existing | true | 'INTERNAL' | :reporter | :redirect | :redirected
- :personal_access_token | :non_existing | false | 'INTERNAL' | :guest | :reject | :not_found
- :personal_access_token | :non_existing | false | 'INTERNAL' | :reporter | :reject | :not_found
-
- :job_token | :scoped_naming_convention | true | 'PUBLIC' | :developer | :accept | :ok
- :job_token | :scoped_naming_convention | false | 'PUBLIC' | :developer | :accept | :ok
- :job_token | :non_existing | true | 'PUBLIC' | :developer | :redirect | :redirected
- :job_token | :non_existing | false | 'PUBLIC' | :developer | :reject | :not_found
- :job_token | :scoped_naming_convention | true | 'PRIVATE' | :developer | :accept | :ok
- :job_token | :scoped_naming_convention | false | 'PRIVATE' | :developer | :accept | :ok
- :job_token | :non_existing | true | 'PRIVATE' | :developer | :redirect | :redirected
- :job_token | :non_existing | false | 'PRIVATE' | :developer | :reject | :not_found
- :job_token | :scoped_naming_convention | true | 'INTERNAL' | :developer | :accept | :ok
- :job_token | :scoped_naming_convention | false | 'INTERNAL' | :developer | :accept | :ok
- :job_token | :non_existing | true | 'INTERNAL' | :developer | :redirect | :redirected
- :job_token | :non_existing | false | 'INTERNAL' | :developer | :reject | :not_found
-
- :deploy_token | :scoped_naming_convention | true | 'PUBLIC' | nil | :accept | :ok
- :deploy_token | :scoped_naming_convention | false | 'PUBLIC' | nil | :accept | :ok
- :deploy_token | :non_existing | true | 'PUBLIC' | nil | :redirect | :redirected
- :deploy_token | :non_existing | false | 'PUBLIC' | nil | :reject | :not_found
- :deploy_token | :scoped_naming_convention | true | 'PRIVATE' | nil | :accept | :ok
- :deploy_token | :scoped_naming_convention | false | 'PRIVATE' | nil | :accept | :ok
- :deploy_token | :non_existing | true | 'PRIVATE' | nil | :redirect | :redirected
- :deploy_token | :non_existing | false | 'PRIVATE' | nil | :reject | :not_found
- :deploy_token | :scoped_naming_convention | true | 'INTERNAL' | nil | :accept | :ok
- :deploy_token | :scoped_naming_convention | false | 'INTERNAL' | nil | :accept | :ok
- :deploy_token | :non_existing | true | 'INTERNAL' | nil | :redirect | :redirected
- :deploy_token | :non_existing | false | 'INTERNAL' | nil | :reject | :not_found
- end
+ shared_examples 'handling all conditions' do
+ where(:auth, :package_name_type, :request_forward, :visibility, :user_role, :expected_result, :expected_status) do
+ nil | :scoped_naming_convention | true | :public | nil | :accept | :ok
+ nil | :scoped_naming_convention | false | :public | nil | :accept | :ok
+ nil | :scoped_no_naming_convention | true | :public | nil | :accept | :ok
+ nil | :scoped_no_naming_convention | false | :public | nil | :accept | :ok
+ nil | :unscoped | true | :public | nil | :accept | :ok
+ nil | :unscoped | false | :public | nil | :accept | :ok
+ nil | :non_existing | true | :public | nil | :redirect | :redirected
+ nil | :non_existing | false | :public | nil | :reject | :not_found
+ nil | :scoped_naming_convention | true | :private | nil | :reject | :not_found
+ nil | :scoped_naming_convention | false | :private | nil | :reject | :not_found
+ nil | :scoped_no_naming_convention | true | :private | nil | :reject | :not_found
+ nil | :scoped_no_naming_convention | false | :private | nil | :reject | :not_found
+ nil | :unscoped | true | :private | nil | :reject | :not_found
+ nil | :unscoped | false | :private | nil | :reject | :not_found
+ nil | :non_existing | true | :private | nil | :redirect | :redirected
+ nil | :non_existing | false | :private | nil | :reject | :not_found
+ nil | :scoped_naming_convention | true | :internal | nil | :reject | :not_found
+ nil | :scoped_naming_convention | false | :internal | nil | :reject | :not_found
+ nil | :scoped_no_naming_convention | true | :internal | nil | :reject | :not_found
+ nil | :scoped_no_naming_convention | false | :internal | nil | :reject | :not_found
+ nil | :unscoped | true | :internal | nil | :reject | :not_found
+ nil | :unscoped | false | :internal | nil | :reject | :not_found
+ nil | :non_existing | true | :internal | nil | :redirect | :redirected
+ nil | :non_existing | false | :internal | nil | :reject | :not_found
+
+ :oauth | :scoped_naming_convention | true | :public | :guest | :accept | :ok
+ :oauth | :scoped_naming_convention | true | :public | :reporter | :accept | :ok
+ :oauth | :scoped_naming_convention | false | :public | :guest | :accept | :ok
+ :oauth | :scoped_naming_convention | false | :public | :reporter | :accept | :ok
+ :oauth | :scoped_no_naming_convention | true | :public | :guest | :accept | :ok
+ :oauth | :scoped_no_naming_convention | true | :public | :reporter | :accept | :ok
+ :oauth | :scoped_no_naming_convention | false | :public | :guest | :accept | :ok
+ :oauth | :scoped_no_naming_convention | false | :public | :reporter | :accept | :ok
+ :oauth | :unscoped | true | :public | :guest | :accept | :ok
+ :oauth | :unscoped | true | :public | :reporter | :accept | :ok
+ :oauth | :unscoped | false | :public | :guest | :accept | :ok
+ :oauth | :unscoped | false | :public | :reporter | :accept | :ok
+ :oauth | :non_existing | true | :public | :guest | :redirect | :redirected
+ :oauth | :non_existing | true | :public | :reporter | :redirect | :redirected
+ :oauth | :non_existing | false | :public | :guest | :reject | :not_found
+ :oauth | :non_existing | false | :public | :reporter | :reject | :not_found
+ :oauth | :scoped_naming_convention | true | :private | :guest | :reject | :forbidden
+ :oauth | :scoped_naming_convention | true | :private | :reporter | :accept | :ok
+ :oauth | :scoped_naming_convention | false | :private | :guest | :reject | :forbidden
+ :oauth | :scoped_naming_convention | false | :private | :reporter | :accept | :ok
+ :oauth | :scoped_no_naming_convention | true | :private | :guest | :reject | :forbidden
+ :oauth | :scoped_no_naming_convention | true | :private | :reporter | :accept | :ok
+ :oauth | :scoped_no_naming_convention | false | :private | :guest | :reject | :forbidden
+ :oauth | :scoped_no_naming_convention | false | :private | :reporter | :accept | :ok
+ :oauth | :unscoped | true | :private | :guest | :reject | :forbidden
+ :oauth | :unscoped | true | :private | :reporter | :accept | :ok
+ :oauth | :unscoped | false | :private | :guest | :reject | :forbidden
+ :oauth | :unscoped | false | :private | :reporter | :accept | :ok
+ :oauth | :non_existing | true | :private | :guest | :redirect | :redirected
+ :oauth | :non_existing | true | :private | :reporter | :redirect | :redirected
+ :oauth | :non_existing | false | :private | :guest | :reject | :forbidden
+ :oauth | :non_existing | false | :private | :reporter | :reject | :not_found
+ :oauth | :scoped_naming_convention | true | :internal | :guest | :accept | :ok
+ :oauth | :scoped_naming_convention | true | :internal | :reporter | :accept | :ok
+ :oauth | :scoped_naming_convention | false | :internal | :guest | :accept | :ok
+ :oauth | :scoped_naming_convention | false | :internal | :reporter | :accept | :ok
+ :oauth | :scoped_no_naming_convention | true | :internal | :guest | :accept | :ok
+ :oauth | :scoped_no_naming_convention | true | :internal | :reporter | :accept | :ok
+ :oauth | :scoped_no_naming_convention | false | :internal | :guest | :accept | :ok
+ :oauth | :scoped_no_naming_convention | false | :internal | :reporter | :accept | :ok
+ :oauth | :unscoped | true | :internal | :guest | :accept | :ok
+ :oauth | :unscoped | true | :internal | :reporter | :accept | :ok
+ :oauth | :unscoped | false | :internal | :guest | :accept | :ok
+ :oauth | :unscoped | false | :internal | :reporter | :accept | :ok
+ :oauth | :non_existing | true | :internal | :guest | :redirect | :redirected
+ :oauth | :non_existing | true | :internal | :reporter | :redirect | :redirected
+ :oauth | :non_existing | false | :internal | :guest | :reject | :not_found
+ :oauth | :non_existing | false | :internal | :reporter | :reject | :not_found
+
+ :personal_access_token | :scoped_naming_convention | true | :public | :guest | :accept | :ok
+ :personal_access_token | :scoped_naming_convention | true | :public | :reporter | :accept | :ok
+ :personal_access_token | :scoped_naming_convention | false | :public | :guest | :accept | :ok
+ :personal_access_token | :scoped_naming_convention | false | :public | :reporter | :accept | :ok
+ :personal_access_token | :scoped_no_naming_convention | true | :public | :guest | :accept | :ok
+ :personal_access_token | :scoped_no_naming_convention | true | :public | :reporter | :accept | :ok
+ :personal_access_token | :scoped_no_naming_convention | false | :public | :guest | :accept | :ok
+ :personal_access_token | :scoped_no_naming_convention | false | :public | :reporter | :accept | :ok
+ :personal_access_token | :unscoped | true | :public | :guest | :accept | :ok
+ :personal_access_token | :unscoped | true | :public | :reporter | :accept | :ok
+ :personal_access_token | :unscoped | false | :public | :guest | :accept | :ok
+ :personal_access_token | :unscoped | false | :public | :reporter | :accept | :ok
+ :personal_access_token | :non_existing | true | :public | :guest | :redirect | :redirected
+ :personal_access_token | :non_existing | true | :public | :reporter | :redirect | :redirected
+ :personal_access_token | :non_existing | false | :public | :guest | :reject | :not_found
+ :personal_access_token | :non_existing | false | :public | :reporter | :reject | :not_found
+ :personal_access_token | :scoped_naming_convention | true | :private | :guest | :reject | :forbidden
+ :personal_access_token | :scoped_naming_convention | true | :private | :reporter | :accept | :ok
+ :personal_access_token | :scoped_naming_convention | false | :private | :guest | :reject | :forbidden
+ :personal_access_token | :scoped_naming_convention | false | :private | :reporter | :accept | :ok
+ :personal_access_token | :scoped_no_naming_convention | true | :private | :guest | :reject | :forbidden
+ :personal_access_token | :scoped_no_naming_convention | true | :private | :reporter | :accept | :ok
+ :personal_access_token | :scoped_no_naming_convention | false | :private | :guest | :reject | :forbidden
+ :personal_access_token | :scoped_no_naming_convention | false | :private | :reporter | :accept | :ok
+ :personal_access_token | :unscoped | true | :private | :guest | :reject | :forbidden
+ :personal_access_token | :unscoped | true | :private | :reporter | :accept | :ok
+ :personal_access_token | :unscoped | false | :private | :guest | :reject | :forbidden
+ :personal_access_token | :unscoped | false | :private | :reporter | :accept | :ok
+ :personal_access_token | :non_existing | true | :private | :guest | :redirect | :redirected
+ :personal_access_token | :non_existing | true | :private | :reporter | :redirect | :redirected
+ :personal_access_token | :non_existing | false | :private | :guest | :reject | :forbidden
+ :personal_access_token | :non_existing | false | :private | :reporter | :reject | :not_found
+ :personal_access_token | :scoped_naming_convention | true | :internal | :guest | :accept | :ok
+ :personal_access_token | :scoped_naming_convention | true | :internal | :reporter | :accept | :ok
+ :personal_access_token | :scoped_naming_convention | false | :internal | :guest | :accept | :ok
+ :personal_access_token | :scoped_naming_convention | false | :internal | :reporter | :accept | :ok
+ :personal_access_token | :scoped_no_naming_convention | true | :internal | :guest | :accept | :ok
+ :personal_access_token | :scoped_no_naming_convention | true | :internal | :reporter | :accept | :ok
+ :personal_access_token | :scoped_no_naming_convention | false | :internal | :guest | :accept | :ok
+ :personal_access_token | :scoped_no_naming_convention | false | :internal | :reporter | :accept | :ok
+ :personal_access_token | :unscoped | true | :internal | :guest | :accept | :ok
+ :personal_access_token | :unscoped | true | :internal | :reporter | :accept | :ok
+ :personal_access_token | :unscoped | false | :internal | :guest | :accept | :ok
+ :personal_access_token | :unscoped | false | :internal | :reporter | :accept | :ok
+ :personal_access_token | :non_existing | true | :internal | :guest | :redirect | :redirected
+ :personal_access_token | :non_existing | true | :internal | :reporter | :redirect | :redirected
+ :personal_access_token | :non_existing | false | :internal | :guest | :reject | :not_found
+ :personal_access_token | :non_existing | false | :internal | :reporter | :reject | :not_found
+
+ :job_token | :scoped_naming_convention | true | :public | :developer | :accept | :ok
+ :job_token | :scoped_naming_convention | false | :public | :developer | :accept | :ok
+ :job_token | :scoped_no_naming_convention | true | :public | :developer | :accept | :ok
+ :job_token | :scoped_no_naming_convention | false | :public | :developer | :accept | :ok
+ :job_token | :unscoped | true | :public | :developer | :accept | :ok
+ :job_token | :unscoped | false | :public | :developer | :accept | :ok
+ :job_token | :non_existing | true | :public | :developer | :redirect | :redirected
+ :job_token | :non_existing | false | :public | :developer | :reject | :not_found
+ :job_token | :scoped_naming_convention | true | :private | :developer | :accept | :ok
+ :job_token | :scoped_naming_convention | false | :private | :developer | :accept | :ok
+ :job_token | :scoped_no_naming_convention | true | :private | :developer | :accept | :ok
+ :job_token | :scoped_no_naming_convention | false | :private | :developer | :accept | :ok
+ :job_token | :unscoped | true | :private | :developer | :accept | :ok
+ :job_token | :unscoped | false | :private | :developer | :accept | :ok
+ :job_token | :non_existing | true | :private | :developer | :redirect | :redirected
+ :job_token | :non_existing | false | :private | :developer | :reject | :not_found
+ :job_token | :scoped_naming_convention | true | :internal | :developer | :accept | :ok
+ :job_token | :scoped_naming_convention | false | :internal | :developer | :accept | :ok
+ :job_token | :scoped_no_naming_convention | true | :internal | :developer | :accept | :ok
+ :job_token | :scoped_no_naming_convention | false | :internal | :developer | :accept | :ok
+ :job_token | :unscoped | true | :internal | :developer | :accept | :ok
+ :job_token | :unscoped | false | :internal | :developer | :accept | :ok
+ :job_token | :non_existing | true | :internal | :developer | :redirect | :redirected
+ :job_token | :non_existing | false | :internal | :developer | :reject | :not_found
+
+ :deploy_token | :scoped_naming_convention | true | :public | nil | :accept | :ok
+ :deploy_token | :scoped_naming_convention | false | :public | nil | :accept | :ok
+ :deploy_token | :scoped_no_naming_convention | true | :public | nil | :accept | :ok
+ :deploy_token | :scoped_no_naming_convention | false | :public | nil | :accept | :ok
+ :deploy_token | :unscoped | true | :public | nil | :accept | :ok
+ :deploy_token | :unscoped | false | :public | nil | :accept | :ok
+ :deploy_token | :non_existing | true | :public | nil | :redirect | :redirected
+ :deploy_token | :non_existing | false | :public | nil | :reject | :not_found
+ :deploy_token | :scoped_naming_convention | true | :private | nil | :accept | :ok
+ :deploy_token | :scoped_naming_convention | false | :private | nil | :accept | :ok
+ :deploy_token | :scoped_no_naming_convention | true | :private | nil | :accept | :ok
+ :deploy_token | :scoped_no_naming_convention | false | :private | nil | :accept | :ok
+ :deploy_token | :unscoped | true | :private | nil | :accept | :ok
+ :deploy_token | :unscoped | false | :private | nil | :accept | :ok
+ :deploy_token | :non_existing | true | :private | nil | :redirect | :redirected
+ :deploy_token | :non_existing | false | :private | nil | :reject | :not_found
+ :deploy_token | :scoped_naming_convention | true | :internal | nil | :accept | :ok
+ :deploy_token | :scoped_naming_convention | false | :internal | nil | :accept | :ok
+ :deploy_token | :scoped_no_naming_convention | true | :internal | nil | :accept | :ok
+ :deploy_token | :scoped_no_naming_convention | false | :internal | nil | :accept | :ok
+ :deploy_token | :unscoped | true | :internal | nil | :accept | :ok
+ :deploy_token | :unscoped | false | :internal | nil | :accept | :ok
+ :deploy_token | :non_existing | true | :internal | nil | :redirect | :redirected
+ :deploy_token | :non_existing | false | :internal | nil | :reject | :not_found
+ end
- with_them do
- include_context 'set package name from package name type'
-
- let(:headers) do
- case auth
- when :oauth
- build_token_auth_header(token.token)
- when :personal_access_token
- build_token_auth_header(personal_access_token.token)
- when :job_token
- build_token_auth_header(job.token)
- when :deploy_token
- build_token_auth_header(deploy_token.token)
- else
- {}
+ with_them do
+ include_context 'set package name from package name type'
+
+ let(:headers) do
+ case auth
+ when :oauth
+ build_token_auth_header(token.token)
+ when :personal_access_token
+ build_token_auth_header(personal_access_token.token)
+ when :job_token
+ build_token_auth_header(job.token)
+ when :deploy_token
+ build_token_auth_header(deploy_token.token)
+ else
+ {}
+ end
end
- end
- before do
- project.send("add_#{user_role}", user) if user_role
- project.update!(visibility: Gitlab::VisibilityLevel.const_get(visibility, false))
- package.update!(name: package_name) unless package_name == 'non-existing-package'
- stub_application_setting(npm_package_requests_forwarding: request_forward)
- end
+ before do
+ project.send("add_#{user_role}", user) if user_role
+ project.update!(visibility: visibility.to_s)
+ package.update!(name: package_name) unless package_name == 'non-existing-package'
+ stub_application_setting(npm_package_requests_forwarding: request_forward)
+ end
- example_name = "#{params[:expected_result]} metadata request"
- status = params[:expected_status]
+ example_name = "#{params[:expected_result]} metadata request"
+ status = params[:expected_status]
- if scope == :instance && params[:package_name_type] != :scoped_naming_convention
- if params[:request_forward]
- example_name = 'redirect metadata request'
- status = :redirected
- else
- example_name = 'reject metadata request'
- status = :not_found
+ if scope == :instance && params[:package_name_type] != :scoped_naming_convention
+ if params[:request_forward]
+ example_name = 'redirect metadata request'
+ status = :redirected
+ else
+ example_name = 'reject metadata request'
+ status = :not_found
+ end
end
+
+ it_behaves_like example_name, status: status
end
+ end
- it_behaves_like example_name, status: status
+ context 'with a group namespace' do
+ it_behaves_like 'handling all conditions'
+ end
+
+ if scope != :project
+ context 'with a user namespace' do
+ let_it_be(:namespace) { user.namespace }
+
+ it_behaves_like 'handling all conditions'
+ end
end
context 'with a developer' do
@@ -225,26 +323,44 @@ RSpec.shared_examples 'handling get dist tags requests' do |scope: :project|
shared_examples 'handling different package names, visibilities and user roles' do
where(:package_name_type, :visibility, :user_role, :expected_result, :expected_status) do
- :scoped_naming_convention | 'PUBLIC' | :anonymous | :accept | :ok
- :scoped_naming_convention | 'PUBLIC' | :guest | :accept | :ok
- :scoped_naming_convention | 'PUBLIC' | :reporter | :accept | :ok
- :non_existing | 'PUBLIC' | :anonymous | :reject | :not_found
- :non_existing | 'PUBLIC' | :guest | :reject | :not_found
- :non_existing | 'PUBLIC' | :reporter | :reject | :not_found
-
- :scoped_naming_convention | 'PRIVATE' | :anonymous | :reject | :not_found
- :scoped_naming_convention | 'PRIVATE' | :guest | :reject | :forbidden
- :scoped_naming_convention | 'PRIVATE' | :reporter | :accept | :ok
- :non_existing | 'PRIVATE' | :anonymous | :reject | :not_found
- :non_existing | 'PRIVATE' | :guest | :reject | :forbidden
- :non_existing | 'PRIVATE' | :reporter | :reject | :not_found
-
- :scoped_naming_convention | 'INTERNAL' | :anonymous | :reject | :not_found
- :scoped_naming_convention | 'INTERNAL' | :guest | :accept | :ok
- :scoped_naming_convention | 'INTERNAL' | :reporter | :accept | :ok
- :non_existing | 'INTERNAL' | :anonymous | :reject | :not_found
- :non_existing | 'INTERNAL' | :guest | :reject | :not_found
- :non_existing | 'INTERNAL' | :reporter | :reject | :not_found
+ :scoped_naming_convention | :public | :anonymous | :accept | :ok
+ :scoped_naming_convention | :public | :guest | :accept | :ok
+ :scoped_naming_convention | :public | :reporter | :accept | :ok
+ :scoped_no_naming_convention | :public | :anonymous | :accept | :ok
+ :scoped_no_naming_convention | :public | :guest | :accept | :ok
+ :scoped_no_naming_convention | :public | :reporter | :accept | :ok
+ :unscoped | :public | :anonymous | :accept | :ok
+ :unscoped | :public | :guest | :accept | :ok
+ :unscoped | :public | :reporter | :accept | :ok
+ :non_existing | :public | :anonymous | :reject | :not_found
+ :non_existing | :public | :guest | :reject | :not_found
+ :non_existing | :public | :reporter | :reject | :not_found
+
+ :scoped_naming_convention | :private | :anonymous | :reject | :not_found
+ :scoped_naming_convention | :private | :guest | :reject | :forbidden
+ :scoped_naming_convention | :private | :reporter | :accept | :ok
+ :scoped_no_naming_convention | :private | :anonymous | :reject | :not_found
+ :scoped_no_naming_convention | :private | :guest | :reject | :forbidden
+ :scoped_no_naming_convention | :private | :reporter | :accept | :ok
+ :unscoped | :private | :anonymous | :reject | :not_found
+ :unscoped | :private | :guest | :reject | :forbidden
+ :unscoped | :private | :reporter | :accept | :ok
+ :non_existing | :private | :anonymous | :reject | :not_found
+ :non_existing | :private | :guest | :reject | :forbidden
+ :non_existing | :private | :reporter | :reject | :not_found
+
+ :scoped_naming_convention | :internal | :anonymous | :reject | :not_found
+ :scoped_naming_convention | :internal | :guest | :accept | :ok
+ :scoped_naming_convention | :internal | :reporter | :accept | :ok
+ :scoped_no_naming_convention | :internal | :anonymous | :reject | :not_found
+ :scoped_no_naming_convention | :internal | :guest | :accept | :ok
+ :scoped_no_naming_convention | :internal | :reporter | :accept | :ok
+ :unscoped | :internal | :anonymous | :reject | :not_found
+ :unscoped | :internal | :guest | :accept | :ok
+ :unscoped | :internal | :reporter | :accept | :ok
+ :non_existing | :internal | :anonymous | :reject | :not_found
+ :non_existing | :internal | :guest | :reject | :not_found
+ :non_existing | :internal | :reporter | :reject | :not_found
end
with_them do
@@ -254,7 +370,7 @@ RSpec.shared_examples 'handling get dist tags requests' do |scope: :project|
before do
project.send("add_#{user_role}", user) unless anonymous
- project.update!(visibility: Gitlab::VisibilityLevel.const_get(visibility, false))
+ project.update!(visibility: visibility.to_s)
end
example_name = "#{params[:expected_result]} package tags request"
@@ -269,16 +385,30 @@ RSpec.shared_examples 'handling get dist tags requests' do |scope: :project|
end
end
- context 'with oauth token' do
- let(:headers) { build_token_auth_header(token.token) }
+ shared_examples 'handling all conditions' do
+ context 'with oauth token' do
+ let(:headers) { build_token_auth_header(token.token) }
+
+ it_behaves_like 'handling different package names, visibilities and user roles'
+ end
+
+ context 'with personal access token' do
+ let(:headers) { build_token_auth_header(personal_access_token.token) }
- it_behaves_like 'handling different package names, visibilities and user roles'
+ it_behaves_like 'handling different package names, visibilities and user roles'
+ end
end
- context 'with personal access token' do
- let(:headers) { build_token_auth_header(personal_access_token.token) }
+ context 'with a group namespace' do
+ it_behaves_like 'handling all conditions'
+ end
- it_behaves_like 'handling different package names, visibilities and user roles'
+ if scope != :project
+ context 'with a user namespace' do
+ let_it_be(:namespace) { user.namespace }
+
+ it_behaves_like 'handling all conditions'
+ end
end
end
@@ -303,26 +433,44 @@ RSpec.shared_examples 'handling create dist tag requests' do |scope: :project|
shared_examples 'handling different package names, visibilities and user roles' do
where(:package_name_type, :visibility, :user_role, :expected_result, :expected_status) do
- :scoped_naming_convention | 'PUBLIC' | :anonymous | :reject | :forbidden
- :scoped_naming_convention | 'PUBLIC' | :guest | :reject | :forbidden
- :scoped_naming_convention | 'PUBLIC' | :developer | :accept | :ok
- :non_existing | 'PUBLIC' | :anonymous | :reject | :forbidden
- :non_existing | 'PUBLIC' | :guest | :reject | :forbidden
- :non_existing | 'PUBLIC' | :developer | :reject | :not_found
-
- :scoped_naming_convention | 'PRIVATE' | :anonymous | :reject | :not_found
- :scoped_naming_convention | 'PRIVATE' | :guest | :reject | :forbidden
- :scoped_naming_convention | 'PRIVATE' | :developer | :accept | :ok
- :non_existing | 'PRIVATE' | :anonymous | :reject | :not_found
- :non_existing | 'PRIVATE' | :guest | :reject | :forbidden
- :non_existing | 'PRIVATE' | :developer | :reject | :not_found
-
- :scoped_naming_convention | 'INTERNAL' | :anonymous | :reject | :forbidden
- :scoped_naming_convention | 'INTERNAL' | :guest | :reject | :forbidden
- :scoped_naming_convention | 'INTERNAL' | :developer | :accept | :ok
- :non_existing | 'INTERNAL' | :anonymous | :reject | :forbidden
- :non_existing | 'INTERNAL' | :guest | :reject | :forbidden
- :non_existing | 'INTERNAL' | :developer | :reject | :not_found
+ :scoped_naming_convention | :public | :anonymous | :reject | :forbidden
+ :scoped_naming_convention | :public | :guest | :reject | :forbidden
+ :scoped_naming_convention | :public | :developer | :accept | :ok
+ :scoped_no_naming_convention | :public | :anonymous | :reject | :forbidden
+ :scoped_no_naming_convention | :public | :guest | :reject | :forbidden
+ :scoped_no_naming_convention | :public | :developer | :accept | :ok
+ :unscoped | :public | :anonymous | :reject | :forbidden
+ :unscoped | :public | :guest | :reject | :forbidden
+ :unscoped | :public | :developer | :accept | :ok
+ :non_existing | :public | :anonymous | :reject | :forbidden
+ :non_existing | :public | :guest | :reject | :forbidden
+ :non_existing | :public | :developer | :reject | :not_found
+
+ :scoped_naming_convention | :private | :anonymous | :reject | :not_found
+ :scoped_naming_convention | :private | :guest | :reject | :forbidden
+ :scoped_naming_convention | :private | :developer | :accept | :ok
+ :scoped_no_naming_convention | :private | :anonymous | :reject | :not_found
+ :scoped_no_naming_convention | :private | :guest | :reject | :forbidden
+ :scoped_no_naming_convention | :private | :developer | :accept | :ok
+ :unscoped | :private | :anonymous | :reject | :not_found
+ :unscoped | :private | :guest | :reject | :forbidden
+ :unscoped | :private | :developer | :accept | :ok
+ :non_existing | :private | :anonymous | :reject | :not_found
+ :non_existing | :private | :guest | :reject | :forbidden
+ :non_existing | :private | :developer | :reject | :not_found
+
+ :scoped_naming_convention | :internal | :anonymous | :reject | :forbidden
+ :scoped_naming_convention | :internal | :guest | :reject | :forbidden
+ :scoped_naming_convention | :internal | :developer | :accept | :ok
+ :scoped_no_naming_convention | :internal | :anonymous | :reject | :forbidden
+ :scoped_no_naming_convention | :internal | :guest | :reject | :forbidden
+ :scoped_no_naming_convention | :internal | :developer | :accept | :ok
+ :unscoped | :internal | :anonymous | :reject | :forbidden
+ :unscoped | :internal | :guest | :reject | :forbidden
+ :unscoped | :internal | :developer | :accept | :ok
+ :non_existing | :internal | :anonymous | :reject | :forbidden
+ :non_existing | :internal | :guest | :reject | :forbidden
+ :non_existing | :internal | :developer | :reject | :not_found
end
with_them do
@@ -332,7 +480,7 @@ RSpec.shared_examples 'handling create dist tag requests' do |scope: :project|
before do
project.send("add_#{user_role}", user) unless anonymous
- project.update!(visibility: Gitlab::VisibilityLevel.const_get(visibility, false))
+ project.update!(visibility: visibility.to_s)
end
example_name = "#{params[:expected_result]} create package tag request"
@@ -347,16 +495,30 @@ RSpec.shared_examples 'handling create dist tag requests' do |scope: :project|
end
end
- context 'with oauth token' do
- let(:headers) { build_token_auth_header(token.token) }
+ shared_examples 'handling all conditions' do
+ context 'with oauth token' do
+ let(:headers) { build_token_auth_header(token.token) }
- it_behaves_like 'handling different package names, visibilities and user roles'
+ it_behaves_like 'handling different package names, visibilities and user roles'
+ end
+
+ context 'with personal access token' do
+ let(:headers) { build_token_auth_header(personal_access_token.token) }
+
+ it_behaves_like 'handling different package names, visibilities and user roles'
+ end
end
- context 'with personal access token' do
- let(:headers) { build_token_auth_header(personal_access_token.token) }
+ context 'with a group namespace' do
+ it_behaves_like 'handling all conditions'
+ end
- it_behaves_like 'handling different package names, visibilities and user roles'
+ if scope != :project
+ context 'with a user namespace' do
+ let_it_be(:namespace) { user.namespace }
+
+ it_behaves_like 'handling all conditions'
+ end
end
end
@@ -379,19 +541,44 @@ RSpec.shared_examples 'handling delete dist tag requests' do |scope: :project|
shared_examples 'handling different package names, visibilities and user roles' do
where(:package_name_type, :visibility, :user_role, :expected_result, :expected_status) do
- :scoped_naming_convention | 'PUBLIC' | :anonymous | :reject | :forbidden
- :scoped_naming_convention | 'PUBLIC' | :guest | :reject | :forbidden
- :scoped_naming_convention | 'PUBLIC' | :maintainer | :accept | :ok
- :non_existing | 'PUBLIC' | :anonymous | :reject | :forbidden
- :non_existing | 'PUBLIC' | :guest | :reject | :forbidden
- :non_existing | 'PUBLIC' | :maintainer | :reject | :not_found
-
- :scoped_naming_convention | 'PRIVATE' | :anonymous | :reject | :not_found
- :scoped_naming_convention | 'PRIVATE' | :guest | :reject | :forbidden
- :scoped_naming_convention | 'PRIVATE' | :maintainer | :accept | :ok
- :non_existing | 'INTERNAL' | :anonymous | :reject | :forbidden
- :non_existing | 'INTERNAL' | :guest | :reject | :forbidden
- :non_existing | 'INTERNAL' | :maintainer | :reject | :not_found
+ :scoped_naming_convention | :public | :anonymous | :reject | :forbidden
+ :scoped_naming_convention | :public | :guest | :reject | :forbidden
+ :scoped_naming_convention | :public | :maintainer | :accept | :ok
+ :scoped_no_naming_convention | :public | :anonymous | :reject | :forbidden
+ :scoped_no_naming_convention | :public | :guest | :reject | :forbidden
+ :scoped_no_naming_convention | :public | :maintainer | :accept | :ok
+ :unscoped | :public | :anonymous | :reject | :forbidden
+ :unscoped | :public | :guest | :reject | :forbidden
+ :unscoped | :public | :maintainer | :accept | :ok
+ :non_existing | :public | :anonymous | :reject | :forbidden
+ :non_existing | :public | :guest | :reject | :forbidden
+ :non_existing | :public | :maintainer | :reject | :not_found
+
+ :scoped_naming_convention | :private | :anonymous | :reject | :not_found
+ :scoped_naming_convention | :private | :guest | :reject | :forbidden
+ :scoped_naming_convention | :private | :maintainer | :accept | :ok
+ :scoped_no_naming_convention | :private | :anonymous | :reject | :not_found
+ :scoped_no_naming_convention | :private | :guest | :reject | :forbidden
+ :scoped_no_naming_convention | :private | :maintainer | :accept | :ok
+ :unscoped | :private | :anonymous | :reject | :not_found
+ :unscoped | :private | :guest | :reject | :forbidden
+ :unscoped | :private | :maintainer | :accept | :ok
+ :non_existing | :private | :anonymous | :reject | :not_found
+ :non_existing | :private | :guest | :reject | :forbidden
+ :non_existing | :private | :maintainer | :reject | :not_found
+
+ :scoped_naming_convention | :internal | :anonymous | :reject | :forbidden
+ :scoped_naming_convention | :internal | :guest | :reject | :forbidden
+ :scoped_naming_convention | :internal | :maintainer | :accept | :ok
+ :scoped_no_naming_convention | :internal | :anonymous | :reject | :forbidden
+ :scoped_no_naming_convention | :internal | :guest | :reject | :forbidden
+ :scoped_no_naming_convention | :internal | :maintainer | :accept | :ok
+ :unscoped | :internal | :anonymous | :reject | :forbidden
+ :unscoped | :internal | :guest | :reject | :forbidden
+ :unscoped | :internal | :maintainer | :accept | :ok
+ :non_existing | :internal | :anonymous | :reject | :forbidden
+ :non_existing | :internal | :guest | :reject | :forbidden
+ :non_existing | :internal | :maintainer | :reject | :not_found
end
with_them do
@@ -401,7 +588,7 @@ RSpec.shared_examples 'handling delete dist tag requests' do |scope: :project|
before do
project.send("add_#{user_role}", user) unless anonymous
- project.update!(visibility: Gitlab::VisibilityLevel.const_get(visibility, false))
+ project.update!(visibility: visibility.to_s)
end
example_name = "#{params[:expected_result]} delete package tag request"
@@ -416,15 +603,29 @@ RSpec.shared_examples 'handling delete dist tag requests' do |scope: :project|
end
end
- context 'with oauth token' do
- let(:headers) { build_token_auth_header(token.token) }
+ shared_examples 'handling all conditions' do
+ context 'with oauth token' do
+ let(:headers) { build_token_auth_header(token.token) }
+
+ it_behaves_like 'handling different package names, visibilities and user roles'
+ end
+
+ context 'with personal access token' do
+ let(:headers) { build_token_auth_header(personal_access_token.token) }
- it_behaves_like 'handling different package names, visibilities and user roles'
+ it_behaves_like 'handling different package names, visibilities and user roles'
+ end
end
- context 'with personal access token' do
- let(:headers) { build_token_auth_header(personal_access_token.token) }
+ context 'with a group namespace' do
+ it_behaves_like 'handling all conditions'
+ end
- it_behaves_like 'handling different package names, visibilities and user roles'
+ if scope != :project
+ context 'with a user namespace' do
+ let_it_be(:namespace) { user.namespace }
+
+ it_behaves_like 'handling all conditions'
+ end
end
end
diff --git a/spec/support/shared_examples/requests/api/rubygems_packages_shared_examples.rb b/spec/support/shared_examples/requests/api/rubygems_packages_shared_examples.rb
new file mode 100644
index 00000000000..15fb6611b90
--- /dev/null
+++ b/spec/support/shared_examples/requests/api/rubygems_packages_shared_examples.rb
@@ -0,0 +1,194 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'rejects rubygems packages access' do |user_type, status, add_member = true|
+ context "for user type #{user_type}" do
+ before do
+ project.send("add_#{user_type}", user) if add_member && user_type != :anonymous
+ end
+
+ it_behaves_like 'returning response status', status
+ end
+end
+
+RSpec.shared_examples 'process rubygems workhorse authorization' do |user_type, status, add_member = true|
+ context "for user type #{user_type}" do
+ before do
+ project.send("add_#{user_type}", user) if add_member && user_type != :anonymous
+ end
+
+ it_behaves_like 'returning response status', status
+
+ it 'has the proper content type' do
+ subject
+
+ expect(response.media_type).to eq(Gitlab::Workhorse::INTERNAL_API_CONTENT_TYPE)
+ end
+
+ context 'with a request that bypassed gitlab-workhorse' do
+ let(:headers) do
+ { 'HTTP_AUTHORIZATION' => personal_access_token.token }
+ .merge(workhorse_headers)
+ .tap { |h| h.delete(Gitlab::Workhorse::INTERNAL_API_REQUEST_HEADER) }
+ end
+
+ before do
+ project.add_maintainer(user)
+ end
+
+ it_behaves_like 'returning response status', :forbidden
+ end
+ end
+end
+
+RSpec.shared_examples 'process rubygems upload' do |user_type, status, add_member = true|
+ RSpec.shared_examples 'creates rubygems package files' do
+ it 'creates package files', :aggregate_failures do
+ expect { subject }
+ .to change { project.packages.count }.by(1)
+ .and change { Packages::PackageFile.count }.by(1)
+ expect(response).to have_gitlab_http_status(status)
+
+ package_file = project.packages.last.package_files.reload.last
+ expect(package_file.file_name).to eq('package.gem')
+ end
+ end
+
+ context "for user type #{user_type}" do
+ before do
+ project.send("add_#{user_type}", user) if add_member && user_type != :anonymous
+ end
+
+ context 'with object storage disabled' do
+ before do
+ stub_package_file_object_storage(enabled: false)
+ end
+
+ context 'without a file from workhorse' do
+ let(:send_rewritten_field) { false }
+
+ it_behaves_like 'returning response status', :bad_request
+ end
+
+ context 'with correct params' do
+ it_behaves_like 'package workhorse uploads'
+ it_behaves_like 'creates rubygems package files'
+ it_behaves_like 'a package tracking event', 'API::RubygemPackages', 'push_package'
+ end
+ end
+
+ context 'with object storage enabled' do
+ let(:tmp_object) do
+ fog_connection.directories.new(key: 'packages').files.create( # rubocop:disable Rails/SaveBang
+ key: "tmp/uploads/#{file_name}",
+ body: 'content'
+ )
+ end
+
+ let(:fog_file) { fog_to_uploaded_file(tmp_object) }
+ let(:params) { { file: fog_file, 'file.remote_id' => file_name } }
+
+ context 'and direct upload enabled' do
+ let(:fog_connection) do
+ stub_package_file_object_storage(direct_upload: true)
+ end
+
+ it_behaves_like 'creates rubygems package files'
+
+ ['123123', '../../123123'].each do |remote_id|
+ context "with invalid remote_id: #{remote_id}" do
+ let(:params) do
+ {
+ file: fog_file,
+ 'file.remote_id' => remote_id
+ }
+ end
+
+ it_behaves_like 'returning response status', :forbidden
+ end
+ end
+ end
+
+ context 'and direct upload disabled' do
+ context 'and background upload disabled' do
+ let(:fog_connection) do
+ stub_package_file_object_storage(direct_upload: false, background_upload: false)
+ end
+
+ it_behaves_like 'creates rubygems package files'
+ end
+
+ context 'and background upload enabled' do
+ let(:fog_connection) do
+ stub_package_file_object_storage(direct_upload: false, background_upload: true)
+ end
+
+ it_behaves_like 'creates rubygems package files'
+ end
+ end
+ end
+ end
+end
+
+RSpec.shared_examples 'dependency endpoint success' do |user_type, status, add_member = true|
+ context "for user type #{user_type}" do
+ before do
+ project.send("add_#{user_type}", user) if add_member && user_type != :anonymous
+ end
+
+ raise 'Status is not :success' if status != :success
+
+ context 'with no params', :aggregate_failures do
+ it 'returns empty' do
+ subject
+
+ expect(response.body).to eq('200')
+ expect(response).to have_gitlab_http_status(status)
+ end
+ end
+
+ context 'with gems params' do
+ let(:params) { { gems: 'foo,bar' } }
+ let(:expected_response) { Marshal.dump(%w(result result)) }
+
+ it 'returns successfully', :aggregate_failures do
+ service_result = double('DependencyResolverService', execute: ServiceResponse.success(payload: 'result'))
+
+ expect(Packages::Rubygems::DependencyResolverService).to receive(:new).with(project, anything, gem_name: 'foo').and_return(service_result)
+ expect(Packages::Rubygems::DependencyResolverService).to receive(:new).with(project, anything, gem_name: 'bar').and_return(service_result)
+
+ subject
+
+ expect(response.body).to eq(expected_response) # rubocop:disable Security/MarshalLoad
+ expect(response).to have_gitlab_http_status(status)
+ end
+
+ it 'rejects if the service fails', :aggregate_failures do
+ service_result = double('DependencyResolverService', execute: ServiceResponse.error(message: 'rejected', http_status: :bad_request))
+
+ expect(Packages::Rubygems::DependencyResolverService).to receive(:new).with(project, anything, gem_name: 'foo').and_return(service_result)
+
+ subject
+
+ expect(response.body).to match(/rejected/)
+ expect(response).to have_gitlab_http_status(:bad_request)
+ end
+ end
+ end
+end
+
+RSpec.shared_examples 'Rubygems gem download' do |user_type, status, add_member = true|
+ context "for user type #{user_type}" do
+ before do
+ project.send("add_#{user_type}", user) if add_member && user_type != :anonymous
+ end
+
+ it 'returns the gem', :aggregate_failures do
+ subject
+
+ expect(response.media_type).to eq('application/octet-stream')
+ expect(response).to have_gitlab_http_status(status)
+ end
+
+ it_behaves_like 'a package tracking event', described_class.name, 'pull_package'
+ end
+end
diff --git a/spec/support/shared_examples/service_desk_issue_templates_examples.rb b/spec/support/shared_examples/service_desk_issue_templates_examples.rb
new file mode 100644
index 00000000000..fd9645df7a3
--- /dev/null
+++ b/spec/support/shared_examples/service_desk_issue_templates_examples.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'issue description templates from current project only' do
+ it 'loads issue description templates from the project only' do
+ within('#service-desk-template-select') do
+ expect(page).to have_content('project-issue-bar')
+ expect(page).to have_content('project-issue-foo')
+ expect(page).not_to have_content('group-issue-bar')
+ expect(page).not_to have_content('group-issue-foo')
+ end
+ end
+end
diff --git a/spec/support/shared_examples/services/boards/update_boards_shared_examples.rb b/spec/support/shared_examples/services/boards/update_boards_shared_examples.rb
new file mode 100644
index 00000000000..cd773a2a04a
--- /dev/null
+++ b/spec/support/shared_examples/services/boards/update_boards_shared_examples.rb
@@ -0,0 +1,83 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'board update service' do
+ subject(:service) { described_class.new(board.resource_parent, user, all_params) }
+
+ it 'updates the board with valid params' do
+ result = described_class.new(group, user, name: 'Engineering').execute(board)
+
+ expect(result).to eq(true)
+ expect(board.reload.name).to eq('Engineering')
+ end
+
+ it 'does not update the board with invalid params' do
+ orig_name = board.name
+
+ result = described_class.new(group, user, name: nil).execute(board)
+
+ expect(result).to eq(false)
+ expect(board.reload.name).to eq(orig_name)
+ end
+
+ context 'with scoped_issue_board available' do
+ before do
+ stub_licensed_features(scoped_issue_board: true)
+ end
+
+ context 'user is member of the board parent' do
+ before do
+ board.resource_parent.add_reporter(user)
+ end
+
+ it 'updates the configuration params when scoped issue board is enabled' do
+ service.execute(board)
+
+ labels = updated_scoped_params.delete(:labels)
+ expect(board.reload).to have_attributes(updated_scoped_params)
+ expect(board.labels).to match_array(labels)
+ end
+ end
+
+ context 'when labels param is used' do
+ let(:params) { { labels: [label.name, parent_label.name, 'new label'].join(',') } }
+
+ subject(:service) { described_class.new(board.resource_parent, user, params) }
+
+ context 'when user can create new labels' do
+ before do
+ board.resource_parent.add_reporter(user)
+ end
+
+ it 'adds labels to the board' do
+ service.execute(board)
+
+ expect(board.reload.labels.map(&:name)).to match_array([label.name, parent_label.name, 'new label'])
+ end
+ end
+
+ context 'when user can not create new labels' do
+ before do
+ board.resource_parent.add_guest(user)
+ end
+
+ it 'adds only existing labels to the board' do
+ service.execute(board)
+
+ expect(board.reload.labels.map(&:name)).to match_array([label.name, parent_label.name])
+ end
+ end
+ end
+ end
+
+ context 'without scoped_issue_board available' do
+ before do
+ stub_licensed_features(scoped_issue_board: false)
+ end
+
+ it 'filters unpermitted params when scoped issue board is not enabled' do
+ service.execute(board)
+
+ expect(board.reload).to have_attributes(updated_without_scoped_params)
+ end
+ end
+end
diff --git a/spec/support/snowplow.rb b/spec/support/snowplow.rb
index 0d6102f1705..e58be667b37 100644
--- a/spec/support/snowplow.rb
+++ b/spec/support/snowplow.rb
@@ -1,24 +1,13 @@
# frozen_string_literal: true
+require_relative 'stub_snowplow'
+
RSpec.configure do |config|
config.include SnowplowHelpers, :snowplow
+ config.include StubSnowplow, :snowplow
config.before(:each, :snowplow) do
- # Using a high buffer size to not cause early flushes
- buffer_size = 100
- # WebMock is set up to allow requests to `localhost`
- host = 'localhost'
-
- allow_any_instance_of(Gitlab::Tracking::Destinations::ProductAnalytics).to receive(:event)
-
- allow_any_instance_of(Gitlab::Tracking::Destinations::Snowplow)
- .to receive(:emitter)
- .and_return(SnowplowTracker::Emitter.new(host, buffer_size: buffer_size))
-
- stub_application_setting(snowplow_enabled: true)
-
- allow(SnowplowTracker::SelfDescribingJson).to receive(:new).and_call_original
- allow(Gitlab::Tracking).to receive(:event).and_call_original # rubocop:disable RSpec/ExpectGitlabTracking
+ stub_snowplow
end
config.after(:each, :snowplow) do
diff --git a/spec/support/stub_snowplow.rb b/spec/support/stub_snowplow.rb
new file mode 100644
index 00000000000..a21ce2399d7
--- /dev/null
+++ b/spec/support/stub_snowplow.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+module StubSnowplow
+ def stub_snowplow
+ # Using a high buffer size to not cause early flushes
+ buffer_size = 100
+ # WebMock is set up to allow requests to `localhost`
+ host = 'localhost'
+
+ # rubocop:disable RSpec/AnyInstanceOf
+ allow_any_instance_of(Gitlab::Tracking::Destinations::ProductAnalytics).to receive(:event)
+
+ allow_any_instance_of(Gitlab::Tracking::Destinations::Snowplow)
+ .to receive(:emitter)
+ .and_return(SnowplowTracker::Emitter.new(host, buffer_size: buffer_size))
+ # rubocop:enable RSpec/AnyInstanceOf
+
+ stub_application_setting(snowplow_enabled: true)
+
+ allow(SnowplowTracker::SelfDescribingJson).to receive(:new).and_call_original
+ allow(Gitlab::Tracking).to receive(:event).and_call_original # rubocop:disable RSpec/ExpectGitlabTracking
+ end
+end
diff --git a/spec/tasks/admin_mode_spec.rb b/spec/tasks/admin_mode_spec.rb
new file mode 100644
index 00000000000..9dd35650ab6
--- /dev/null
+++ b/spec/tasks/admin_mode_spec.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+require 'rake_helper'
+
+RSpec.describe 'admin mode on tasks' do
+ before do
+ allow(::Gitlab::Runtime).to receive(:test_suite?).and_return(false)
+ allow(::Gitlab::Runtime).to receive(:rake?).and_return(true)
+ end
+
+ shared_examples 'verify admin mode' do |state|
+ it 'matches the expected admin mode' do
+ Rake::Task.define_task :verify_admin_mode do
+ expect(Gitlab::Auth::CurrentUserMode.new(user).admin_mode?).to be(state)
+ end
+
+ run_rake_task('verify_admin_mode')
+ end
+ end
+
+ describe 'with a regular user' do
+ let(:user) { create(:user) }
+
+ include_examples 'verify admin mode', false
+ end
+
+ describe 'with an admin' do
+ let(:user) { create(:admin) }
+
+ include_examples 'verify admin mode', true
+ end
+end
diff --git a/spec/tasks/gitlab/packages/composer_rake_spec.rb b/spec/tasks/gitlab/packages/composer_rake_spec.rb
new file mode 100644
index 00000000000..d54e1b02599
--- /dev/null
+++ b/spec/tasks/gitlab/packages/composer_rake_spec.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+require 'rake_helper'
+
+RSpec.describe 'gitlab:packages:build_composer_cache namespace rake task' do
+ let_it_be(:package_name) { 'sample-project' }
+ let_it_be(:package_name2) { 'sample-project2' }
+ let_it_be(:json) { { 'name' => package_name } }
+ let_it_be(:json2) { { 'name' => package_name2 } }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project, :custom_repo, files: { 'composer.json' => json.to_json }, group: group) }
+ let_it_be(:project2) { create(:project, :custom_repo, files: { 'composer.json' => json2.to_json }, group: group) }
+ let!(:package) { create(:composer_package, :with_metadatum, project: project, name: package_name, version: '1.0.0', json: json) }
+ let!(:package2) { create(:composer_package, :with_metadatum, project: project, name: package_name, version: '2.0.0', json: json) }
+ let!(:package3) { create(:composer_package, :with_metadatum, project: project2, name: package_name2, version: '3.0.0', json: json2) }
+
+ before :all do
+ Rake.application.rake_require 'tasks/gitlab/packages/composer'
+ end
+
+ subject do
+ run_rake_task("gitlab:packages:build_composer_cache")
+ end
+
+ it 'generates the cache files' do
+ expect { subject }.to change { Packages::Composer::CacheFile.count }.by(2)
+ end
+end
diff --git a/spec/tooling/danger/changelog_spec.rb b/spec/tooling/danger/changelog_spec.rb
index c0eca67ce92..8d056b8a78e 100644
--- a/spec/tooling/danger/changelog_spec.rb
+++ b/spec/tooling/danger/changelog_spec.rb
@@ -2,50 +2,78 @@
require_relative 'danger_spec_helper'
+require_relative '../../../tooling/danger/helper'
require_relative '../../../tooling/danger/changelog'
RSpec.describe Tooling::Danger::Changelog do
include DangerSpecHelper
- let(:added_files) { nil }
- let(:fake_git) { double('fake-git', added_files: added_files) }
+ let(:change_class) { Tooling::Danger::Helper::Change }
+ let(:changes_class) { Tooling::Danger::Helper::Changes }
+ let(:changes) { changes_class.new([]) }
- let(:mr_labels) { nil }
- let(:mr_json) { nil }
- let(:fake_gitlab) { double('fake-gitlab', mr_labels: mr_labels, mr_json: mr_json) }
+ let(:mr_labels) { [] }
+ let(:sanitize_mr_title) { 'Fake Title' }
- let(:changes_by_category) { nil }
- let(:sanitize_mr_title) { nil }
- let(:ee?) { false }
- let(:fake_helper) { double('fake-helper', changes_by_category: changes_by_category, sanitize_mr_title: sanitize_mr_title, ee?: ee?) }
+ let(:fake_helper) { double('fake-helper', changes: changes, mr_iid: 1234, mr_title: sanitize_mr_title, mr_labels: mr_labels) }
let(:fake_danger) { new_fake_danger.include(described_class) }
- subject(:changelog) { fake_danger.new(git: fake_git, gitlab: fake_gitlab, helper: fake_helper) }
+ subject(:changelog) { fake_danger.new(helper: fake_helper) }
+
+ describe '#required_reasons' do
+ subject { changelog.required_reasons }
+
+ context "added files contain a migration" do
+ let(:changes) { changes_class.new([change_class.new('foo', :added, :migration)]) }
+
+ it { is_expected.to include(:db_changes) }
+ end
+
+ context "removed files contains a feature flag" do
+ let(:changes) { changes_class.new([change_class.new('foo', :deleted, :feature_flag)]) }
+
+ it { is_expected.to include(:feature_flag_removed) }
+ end
+
+ context "added files do not contain a migration" do
+ let(:changes) { changes_class.new([change_class.new('foo', :added, :frontend)]) }
+
+ it { is_expected.to be_empty }
+ end
+
+ context "removed files do not contain a feature flag" do
+ let(:changes) { changes_class.new([change_class.new('foo', :deleted, :backend)]) }
+
+ it { is_expected.to be_empty }
+ end
+ end
describe '#required?' do
subject { changelog.required? }
context 'added files contain a migration' do
- [
- 'db/migrate/20200000000000_new_migration.rb',
- 'db/post_migrate/20200000000000_new_migration.rb'
- ].each do |file_path|
- let(:added_files) { [file_path] }
+ let(:changes) { changes_class.new([change_class.new('foo', :added, :migration)]) }
- it { is_expected.to be_truthy }
- end
+ it { is_expected.to be_truthy }
+ end
+
+ context "removed files contains a feature flag" do
+ let(:changes) { changes_class.new([change_class.new('foo', :deleted, :feature_flag)]) }
+
+ it { is_expected.to be_truthy }
end
context 'added files do not contain a migration' do
- [
- 'app/models/model.rb',
- 'app/assets/javascripts/file.js'
- ].each do |file_path|
- let(:added_files) { [file_path] }
+ let(:changes) { changes_class.new([change_class.new('foo', :added, :frontend)]) }
- it { is_expected.to be_falsey }
- end
+ it { is_expected.to be_falsey }
+ end
+
+ context "removed files do not contain a feature flag" do
+ let(:changes) { changes_class.new([change_class.new('foo', :deleted, :backend)]) }
+
+ it { is_expected.to be_falsey }
end
end
@@ -58,8 +86,7 @@ RSpec.describe Tooling::Danger::Changelog do
subject { changelog.optional? }
context 'when MR contains only categories requiring no changelog' do
- let(:changes_by_category) { { category_without_changelog => nil } }
- let(:mr_labels) { [] }
+ let(:changes) { changes_class.new([change_class.new('foo', :modified, category_without_changelog)]) }
it 'is falsey' do
is_expected.to be_falsy
@@ -67,7 +94,7 @@ RSpec.describe Tooling::Danger::Changelog do
end
context 'when MR contains a label that require no changelog' do
- let(:changes_by_category) { { category_with_changelog => nil } }
+ let(:changes) { changes_class.new([change_class.new('foo', :modified, category_with_changelog)]) }
let(:mr_labels) { [label_with_changelog, label_without_changelog] }
it 'is falsey' do
@@ -76,29 +103,28 @@ RSpec.describe Tooling::Danger::Changelog do
end
context 'when MR contains a category that require changelog and a category that require no changelog' do
- let(:changes_by_category) { { category_with_changelog => nil, category_without_changelog => nil } }
- let(:mr_labels) { [] }
+ let(:changes) { changes_class.new([change_class.new('foo', :modified, category_with_changelog), change_class.new('foo', :modified, category_without_changelog)]) }
- it 'is truthy' do
- is_expected.to be_truthy
+ context 'with no labels' do
+ it 'is truthy' do
+ is_expected.to be_truthy
+ end
end
- end
- context 'when MR contains a category that require changelog and a category that require no changelog with changelog label' do
- let(:changes_by_category) { { category_with_changelog => nil, category_without_changelog => nil } }
- let(:mr_labels) { ['feature'] }
+ context 'with changelog label' do
+ let(:mr_labels) { ['feature'] }
- it 'is truthy' do
- is_expected.to be_truthy
+ it 'is truthy' do
+ is_expected.to be_truthy
+ end
end
- end
- context 'when MR contains a category that require changelog and a category that require no changelog with no changelog label' do
- let(:changes_by_category) { { category_with_changelog => nil, category_without_changelog => nil } }
- let(:mr_labels) { ['tooling'] }
+ context 'with no changelog label' do
+ let(:mr_labels) { ['tooling'] }
- it 'is truthy' do
- is_expected.to be_falsey
+ it 'is truthy' do
+ is_expected.to be_falsey
+ end
end
end
end
@@ -107,50 +133,35 @@ RSpec.describe Tooling::Danger::Changelog do
subject { changelog.found }
context 'added files contain a changelog' do
- [
- 'changelogs/unreleased/entry.yml',
- 'ee/changelogs/unreleased/entry.yml'
- ].each do |file_path|
- let(:added_files) { [file_path] }
+ let(:changes) { changes_class.new([change_class.new('foo', :added, :changelog)]) }
- it { is_expected.to be_truthy }
- end
+ it { is_expected.to be_truthy }
end
context 'added files do not contain a changelog' do
- [
- 'app/models/model.rb',
- 'app/assets/javascripts/file.js'
- ].each do |file_path|
- let(:added_files) { [file_path] }
- it { is_expected.to eq(nil) }
- end
+ let(:changes) { changes_class.new([change_class.new('foo', :added, :backend)]) }
+
+ it { is_expected.to eq(nil) }
end
end
describe '#ee_changelog?' do
subject { changelog.ee_changelog? }
- before do
- allow(changelog).to receive(:found).and_return(file_path)
- end
-
context 'is ee changelog' do
- let(:file_path) { 'ee/changelogs/unreleased/entry.yml' }
+ let(:changes) { changes_class.new([change_class.new('ee/changelogs/unreleased/entry.yml', :added, :changelog)]) }
it { is_expected.to be_truthy }
end
context 'is not ee changelog' do
- let(:file_path) { 'changelogs/unreleased/entry.yml' }
+ let(:changes) { changes_class.new([change_class.new('changelogs/unreleased/entry.yml', :added, :changelog)]) }
it { is_expected.to be_falsy }
end
end
describe '#modified_text' do
- let(:mr_json) { { "iid" => 1234, "title" => sanitize_mr_title } }
-
subject { changelog.modified_text }
context "when title is not changed from sanitization", :aggregate_failures do
@@ -174,35 +185,42 @@ RSpec.describe Tooling::Danger::Changelog do
end
end
- describe '#required_text' do
- let(:mr_json) { { "iid" => 1234, "title" => sanitize_mr_title } }
-
- subject { changelog.required_text }
+ describe '#required_texts' do
+ let(:sanitize_mr_title) { 'Fake Title' }
- context "when title is not changed from sanitization", :aggregate_failures do
- let(:sanitize_mr_title) { 'Fake Title' }
+ subject { changelog.required_texts }
+ shared_examples 'changelog required text' do |key|
specify do
- expect(subject).to include('CHANGELOG missing')
- expect(subject).to include('bin/changelog -m 1234 "Fake Title"')
- expect(subject).not_to include('--ee')
+ expect(subject).to have_key(key)
+ expect(subject[key]).to include('CHANGELOG missing')
+ expect(subject[key]).to include('bin/changelog -m 1234 "Fake Title"')
+ expect(subject[key]).not_to include('--ee')
end
end
- context "when title needs sanitization", :aggregate_failures do
- let(:sanitize_mr_title) { 'DRAFT: Fake Title' }
+ context 'with a new migration file' do
+ let(:changes) { changes_class.new([change_class.new('foo', :added, :migration)]) }
- specify do
- expect(subject).to include('CHANGELOG missing')
- expect(subject).to include('bin/changelog -m 1234 "Fake Title"')
- expect(subject).not_to include('--ee')
+ context "when title is not changed from sanitization", :aggregate_failures do
+ it_behaves_like 'changelog required text', :db_changes
+ end
+
+ context "when title needs sanitization", :aggregate_failures do
+ let(:sanitize_mr_title) { 'DRAFT: Fake Title' }
+
+ it_behaves_like 'changelog required text', :db_changes
end
end
+
+ context 'with a removed feature flag file' do
+ let(:changes) { changes_class.new([change_class.new('foo', :deleted, :feature_flag)]) }
+
+ it_behaves_like 'changelog required text', :feature_flag_removed
+ end
end
describe '#optional_text' do
- let(:mr_json) { { "iid" => 1234, "title" => sanitize_mr_title } }
-
subject { changelog.optional_text }
context "when title is not changed from sanitization", :aggregate_failures do
diff --git a/spec/tooling/danger/helper_spec.rb b/spec/tooling/danger/helper_spec.rb
index c338d138352..9783705dca0 100644
--- a/spec/tooling/danger/helper_spec.rb
+++ b/spec/tooling/danger/helper_spec.rb
@@ -10,13 +10,27 @@ RSpec.describe Tooling::Danger::Helper do
using RSpec::Parameterized::TableSyntax
include DangerSpecHelper
- let(:fake_git) { double('fake-git') }
-
let(:mr_author) { nil }
let(:fake_gitlab) { double('fake-gitlab', mr_author: mr_author) }
let(:fake_danger) { new_fake_danger.include(described_class) }
+ let(:added_files) { %w[added1] }
+ let(:modified_files) { %w[modified1] }
+ let(:deleted_files) { %w[deleted1] }
+ let(:renamed_before_file) { 'renamed_before' }
+ let(:renamed_after_file) { 'renamed_after' }
+ let(:renamed_files) { [{ before: renamed_before_file, after: renamed_after_file }] }
+
+ let(:fake_git) { double('fake-git') }
+
+ before do
+ allow(fake_git).to receive(:added_files) { added_files }
+ allow(fake_git).to receive(:modified_files) { modified_files }
+ allow(fake_git).to receive(:deleted_files) { deleted_files }
+ allow(fake_git).to receive(:renamed_files).at_least(:twice) { renamed_files }
+ end
+
subject(:helper) { fake_danger.new(git: fake_git, gitlab: fake_gitlab) }
describe '#gitlab_helper' do
@@ -191,15 +205,16 @@ RSpec.describe Tooling::Danger::Helper do
end
describe '#changes_by_category' do
- it 'categorizes changed files' do
- expect(fake_git).to receive(:added_files) { %w[foo foo.md foo.rb foo.js db/migrate/foo lib/gitlab/database/foo.rb qa/foo ee/changelogs/foo.yml] }
- allow(fake_git).to receive(:modified_files) { [] }
- allow(fake_git).to receive(:renamed_files) { [] }
+ let(:added_files) { %w[foo foo.md foo.rb foo.js] }
+ let(:modified_files) { %w[db/migrate/foo lib/gitlab/database/foo.rb] }
+ let(:renamed_files) { [{ before: '', after: 'qa/foo' }, { before: '', after: 'ee/changelogs/foo.yml' }] }
+ it 'categorizes changed files' do
expect(helper.changes_by_category).to eq(
backend: %w[foo.rb],
database: %w[db/migrate/foo lib/gitlab/database/foo.rb],
frontend: %w[foo.js],
+ migration: %w[db/migrate/foo],
none: %w[ee/changelogs/foo.yml foo.md],
qa: %w[qa/foo],
unknown: %w[foo]
@@ -207,6 +222,62 @@ RSpec.describe Tooling::Danger::Helper do
end
end
+ describe 'Tooling::Danger::Helper::Changes', :aggregate_failures do
+ let(:added_files) { %w[db/migrate/foo ee/changelogs/unreleased/foo.yml] }
+
+ describe '#has_category?' do
+ it 'returns true when changes include given category, false otherwise' do
+ changes = helper.changes
+
+ expect(changes.has_category?(:migration)).to eq(true)
+ expect(changes.has_category?(:changelog)).to eq(true)
+ expect(changes.has_category?(:backend)).to eq(false)
+ end
+ end
+
+ describe '#by_category' do
+ it 'returns an array of Change objects' do
+ expect(helper.changes.by_category(:migration)).to all(be_an(described_class::Change))
+ end
+
+ it 'returns an array of Change objects with the given category' do
+ changes = helper.changes
+
+ expect(changes.by_category(:migration).files).to eq(['db/migrate/foo'])
+ expect(changes.by_category(:changelog).files).to eq(['ee/changelogs/unreleased/foo.yml'])
+ expect(changes.by_category(:backend)).to be_empty
+ end
+ end
+
+ describe '#categories' do
+ it 'returns an array of category symbols' do
+ expect(helper.changes.categories).to contain_exactly(:database, :migration, :changelog, :unknown)
+ end
+ end
+
+ describe '#files' do
+ it 'returns an array of files' do
+ expect(helper.changes.files).to include(*added_files)
+ end
+ end
+ end
+
+ describe '#changes' do
+ it 'returns an array of Change objects' do
+ expect(helper.changes).to all(be_an(described_class::Change))
+ end
+
+ it 'groups changes by change type' do
+ changes = helper.changes
+
+ expect(changes.added.files).to eq(added_files)
+ expect(changes.modified.files).to eq(modified_files)
+ expect(changes.deleted.files).to eq(deleted_files)
+ expect(changes.renamed_before.files).to eq([renamed_before_file])
+ expect(changes.renamed_after.files).to eq([renamed_after_file])
+ end
+ end
+
describe '#categories_for_file' do
before do
allow(fake_git).to receive(:diff_for_file).with('usage_data.rb') { double(:diff, patch: "+ count(User.active)") }
@@ -304,12 +375,10 @@ RSpec.describe Tooling::Danger::Helper do
'db/schema.rb' | [:database]
'db/structure.sql' | [:database]
- 'db/migrate/foo' | [:database]
- 'db/post_migrate/foo' | [:database]
- 'ee/db/migrate/foo' | [:database]
- 'ee/db/post_migrate/foo' | [:database]
- 'ee/db/geo/migrate/foo' | [:database]
- 'ee/db/geo/post_migrate/foo' | [:database]
+ 'db/migrate/foo' | [:database, :migration]
+ 'db/post_migrate/foo' | [:database, :migration]
+ 'ee/db/geo/migrate/foo' | [:database, :migration]
+ 'ee/db/geo/post_migrate/foo' | [:database, :migration]
'app/models/project_authorization.rb' | [:database]
'app/services/users/refresh_authorized_projects_service.rb' | [:database]
'lib/gitlab/background_migration.rb' | [:database]
@@ -325,8 +394,6 @@ RSpec.describe Tooling::Danger::Helper do
'db/fixtures/foo.rb' | [:backend]
'ee/db/fixtures/foo.rb' | [:backend]
- 'doc/api/graphql/reference/gitlab_schema.graphql' | [:backend]
- 'doc/api/graphql/reference/gitlab_schema.json' | [:backend]
'qa/foo' | [:qa]
'ee/qa/foo' | [:qa]
@@ -402,6 +469,22 @@ RSpec.describe Tooling::Danger::Helper do
end
end
+ describe '#mr_iid' do
+ it 'returns "" when `gitlab_helper` is unavailable' do
+ expect(helper).to receive(:gitlab_helper).and_return(nil)
+
+ expect(helper.mr_iid).to eq('')
+ end
+
+ it 'returns the MR IID when `gitlab_helper` is available' do
+ mr_iid = '1234'
+ expect(fake_gitlab).to receive(:mr_json)
+ .and_return('iid' => mr_iid)
+
+ expect(helper.mr_iid).to eq(mr_iid)
+ end
+ end
+
describe '#mr_title' do
it 'returns "" when `gitlab_helper` is unavailable' do
expect(helper).to receive(:gitlab_helper).and_return(nil)
@@ -434,6 +517,22 @@ RSpec.describe Tooling::Danger::Helper do
end
end
+ describe '#mr_labels' do
+ it 'returns "" when `gitlab_helper` is unavailable' do
+ expect(helper).to receive(:gitlab_helper).and_return(nil)
+
+ expect(helper.mr_labels).to eq([])
+ end
+
+ it 'returns the MR labels when `gitlab_helper` is available' do
+ mr_labels = %w[foo bar baz]
+ expect(fake_gitlab).to receive(:mr_labels)
+ .and_return(mr_labels)
+
+ expect(helper.mr_labels).to eq(mr_labels)
+ end
+ end
+
describe '#mr_target_branch' do
it 'returns "" when `gitlab_helper` is unavailable' do
expect(helper).to receive(:gitlab_helper).and_return(nil)
diff --git a/spec/tooling/rspec_flaky/config_spec.rb b/spec/tooling/rspec_flaky/config_spec.rb
new file mode 100644
index 00000000000..12b5ed74cb2
--- /dev/null
+++ b/spec/tooling/rspec_flaky/config_spec.rb
@@ -0,0 +1,106 @@
+# frozen_string_literal: true
+
+require 'rspec-parameterized'
+require_relative '../../support/helpers/stub_env'
+
+require_relative '../../../tooling/rspec_flaky/config'
+
+RSpec.describe RspecFlaky::Config, :aggregate_failures do
+ include StubENV
+
+ before do
+ # Stub these env variables otherwise specs don't behave the same on the CI
+ stub_env('FLAKY_RSPEC_GENERATE_REPORT', nil)
+ stub_env('SUITE_FLAKY_RSPEC_REPORT_PATH', nil)
+ stub_env('FLAKY_RSPEC_REPORT_PATH', nil)
+ stub_env('NEW_FLAKY_RSPEC_REPORT_PATH', nil)
+ # Ensure the behavior is the same locally and on CI (where Rails is defined since we run this test as part of the whole suite), i.e. Rails isn't defined
+ allow(described_class).to receive(:rails_path).and_wrap_original do |method, path|
+ path
+ end
+ end
+
+ describe '.generate_report?' do
+ context "when ENV['FLAKY_RSPEC_GENERATE_REPORT'] is not set" do
+ it 'returns false' do
+ expect(described_class).not_to be_generate_report
+ end
+ end
+
+ context "when ENV['FLAKY_RSPEC_GENERATE_REPORT'] is set" do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:env_value, :result) do
+ '1' | true
+ 'true' | true
+ 'foo' | false
+ '0' | false
+ 'false' | false
+ end
+
+ with_them do
+ before do
+ stub_env('FLAKY_RSPEC_GENERATE_REPORT', env_value)
+ end
+
+ it 'returns false' do
+ expect(described_class.generate_report?).to be(result)
+ end
+ end
+ end
+ end
+
+ describe '.suite_flaky_examples_report_path' do
+ context "when ENV['SUITE_FLAKY_RSPEC_REPORT_PATH'] is not set" do
+ it 'returns the default path' do
+ expect(described_class.suite_flaky_examples_report_path).to eq('rspec_flaky/suite-report.json')
+ end
+ end
+
+ context "when ENV['SUITE_FLAKY_RSPEC_REPORT_PATH'] is set" do
+ before do
+ stub_env('SUITE_FLAKY_RSPEC_REPORT_PATH', 'foo/suite-report.json')
+ end
+
+ it 'returns the value of the env variable' do
+ expect(described_class.suite_flaky_examples_report_path).to eq('foo/suite-report.json')
+ end
+ end
+ end
+
+ describe '.flaky_examples_report_path' do
+ context "when ENV['FLAKY_RSPEC_REPORT_PATH'] is not set" do
+ it 'returns the default path' do
+ expect(described_class.flaky_examples_report_path).to eq('rspec_flaky/report.json')
+ end
+ end
+
+ context "when ENV['FLAKY_RSPEC_REPORT_PATH'] is set" do
+ before do
+ stub_env('FLAKY_RSPEC_REPORT_PATH', 'foo/report.json')
+ end
+
+ it 'returns the value of the env variable' do
+ expect(described_class.flaky_examples_report_path).to eq('foo/report.json')
+ end
+ end
+ end
+
+ describe '.new_flaky_examples_report_path' do
+ context "when ENV['NEW_FLAKY_RSPEC_REPORT_PATH'] is not set" do
+ it 'returns the default path' do
+ expect(described_class.new_flaky_examples_report_path).to eq('rspec_flaky/new-report.json')
+ end
+ end
+
+ context "when ENV['NEW_FLAKY_RSPEC_REPORT_PATH'] is set" do
+ before do
+ stub_env('NEW_FLAKY_RSPEC_REPORT_PATH', 'foo/new-report.json')
+ end
+
+ it 'returns the value of the env variable' do
+ expect(described_class.new_flaky_examples_report_path).to eq('foo/new-report.json')
+ end
+ end
+ end
+end
diff --git a/spec/tooling/rspec_flaky/example_spec.rb b/spec/tooling/rspec_flaky/example_spec.rb
new file mode 100644
index 00000000000..8ff280fd855
--- /dev/null
+++ b/spec/tooling/rspec_flaky/example_spec.rb
@@ -0,0 +1,92 @@
+# frozen_string_literal: true
+
+require_relative '../../../tooling/rspec_flaky/example'
+
+RSpec.describe RspecFlaky::Example do
+ let(:example_attrs) do
+ {
+ id: 'spec/foo/bar_spec.rb:2',
+ metadata: {
+ file_path: 'spec/foo/bar_spec.rb',
+ line_number: 2,
+ full_description: 'hello world'
+ },
+ execution_result: double(status: 'passed', exception: 'BOOM!'),
+ attempts: 1
+ }
+ end
+
+ let(:rspec_example) { double(example_attrs) }
+
+ describe '#initialize' do
+ shared_examples 'a valid Example instance' do
+ it 'returns valid attributes' do
+ example = described_class.new(args)
+
+ expect(example.example_id).to eq(example_attrs[:id])
+ end
+ end
+
+ context 'when given an Rspec::Core::Example that responds to #example' do
+ let(:args) { double(example: rspec_example) }
+
+ it_behaves_like 'a valid Example instance'
+ end
+
+ context 'when given an Rspec::Core::Example that does not respond to #example' do
+ let(:args) { rspec_example }
+
+ it_behaves_like 'a valid Example instance'
+ end
+ end
+
+ subject { described_class.new(rspec_example) }
+
+ describe '#uid' do
+ it 'returns a hash of the full description' do
+ expect(subject.uid).to eq(Digest::MD5.hexdigest("#{subject.description}-#{subject.file}"))
+ end
+ end
+
+ describe '#example_id' do
+ it 'returns the ID of the RSpec::Core::Example' do
+ expect(subject.example_id).to eq(rspec_example.id)
+ end
+ end
+
+ describe '#attempts' do
+ it 'returns the attempts of the RSpec::Core::Example' do
+ expect(subject.attempts).to eq(rspec_example.attempts)
+ end
+ end
+
+ describe '#file' do
+ it 'returns the metadata[:file_path] of the RSpec::Core::Example' do
+ expect(subject.file).to eq(rspec_example.metadata[:file_path])
+ end
+ end
+
+ describe '#line' do
+ it 'returns the metadata[:line_number] of the RSpec::Core::Example' do
+ expect(subject.line).to eq(rspec_example.metadata[:line_number])
+ end
+ end
+
+ describe '#description' do
+ it 'returns the metadata[:full_description] of the RSpec::Core::Example' do
+ expect(subject.description).to eq(rspec_example.metadata[:full_description])
+ end
+ end
+
+ describe '#status' do
+ it 'returns the execution_result.status of the RSpec::Core::Example' do
+ expect(subject.status).to eq(rspec_example.execution_result.status)
+ end
+ end
+
+ describe '#exception' do
+ it 'returns the execution_result.exception of the RSpec::Core::Example' do
+ expect(subject.exception).to eq(rspec_example.execution_result.exception)
+ end
+ end
+end
diff --git a/spec/tooling/rspec_flaky/flaky_example_spec.rb b/spec/tooling/rspec_flaky/flaky_example_spec.rb
new file mode 100644
index 00000000000..ab652662c0b
--- /dev/null
+++ b/spec/tooling/rspec_flaky/flaky_example_spec.rb
@@ -0,0 +1,185 @@
+# frozen_string_literal: true
+
+require 'active_support/testing/time_helpers'
+require_relative '../../support/helpers/stub_env'
+
+require_relative '../../../tooling/rspec_flaky/flaky_example'
+
+RSpec.describe RspecFlaky::FlakyExample, :aggregate_failures do
+ include ActiveSupport::Testing::TimeHelpers
+ include StubENV
+
+ let(:flaky_example_attrs) do
+ {
+ example_id: 'spec/foo/bar_spec.rb:2',
+ file: 'spec/foo/bar_spec.rb',
+ line: 2,
+ description: 'hello world',
+ first_flaky_at: 1234,
+ last_flaky_at: 2345,
+ last_flaky_job: 'https://gitlab.com/gitlab-org/gitlab-foss/-/jobs/12',
+ last_attempts_count: 2,
+ flaky_reports: 1
+ }
+ end
+
+ let(:example_attrs) do
+ {
+ uid: 'abc123',
+ example_id: flaky_example_attrs[:example_id],
+ file: flaky_example_attrs[:file],
+ line: flaky_example_attrs[:line],
+ description: flaky_example_attrs[:description],
+ status: 'passed',
+ exception: 'BOOM!',
+ attempts: flaky_example_attrs[:last_attempts_count]
+ }
+ end
+
+ let(:example) { OpenStruct.new(example_attrs) }
+
+ before do
+ # Stub these env variables otherwise specs don't behave the same on the CI
+ stub_env('CI_PROJECT_URL', nil)
+ stub_env('CI_JOB_ID', nil)
+ end
+
+ describe '#initialize' do
+ shared_examples 'a valid FlakyExample instance' do
+ let(:flaky_example) { described_class.new(args) }
+
+ it 'returns valid attributes' do
+ expect(flaky_example.uid).to eq(flaky_example_attrs[:uid])
+ expect(flaky_example.file).to eq(flaky_example_attrs[:file])
+ expect(flaky_example.line).to eq(flaky_example_attrs[:line])
+ expect(flaky_example.description).to eq(flaky_example_attrs[:description])
+ expect(flaky_example.first_flaky_at).to eq(expected_first_flaky_at)
+ expect(flaky_example.last_flaky_at).to eq(expected_last_flaky_at)
+ expect(flaky_example.last_attempts_count).to eq(flaky_example_attrs[:last_attempts_count])
+ expect(flaky_example.flaky_reports).to eq(expected_flaky_reports)
+ end
+ end
+
+ context 'when given an Rspec::Example' do
+ it_behaves_like 'a valid FlakyExample instance' do
+ let(:args) { example }
+ let(:expected_first_flaky_at) { nil }
+ let(:expected_last_flaky_at) { nil }
+ let(:expected_flaky_reports) { 0 }
+ end
+ end
+
+ context 'when given a hash' do
+ it_behaves_like 'a valid FlakyExample instance' do
+ let(:args) { flaky_example_attrs }
+ let(:expected_flaky_reports) { flaky_example_attrs[:flaky_reports] }
+ let(:expected_first_flaky_at) { flaky_example_attrs[:first_flaky_at] }
+ let(:expected_last_flaky_at) { flaky_example_attrs[:last_flaky_at] }
+ end
+ end
+ end
+
+ describe '#update_flakiness!' do
+ shared_examples 'an up-to-date FlakyExample instance' do
+ let(:flaky_example) { described_class.new(args) }
+
+ it 'sets the first_flaky_at if none exists' do
+ args[:first_flaky_at] = nil
+
+ freeze_time do
+ flaky_example.update_flakiness!
+
+ expect(flaky_example.first_flaky_at).to eq(Time.now)
+ end
+ end
+
+ it 'maintains the first_flaky_at if exists' do
+ flaky_example.update_flakiness!
+ expected_first_flaky_at = flaky_example.first_flaky_at
+
+ travel_to(Time.now + 42) do
+ flaky_example.update_flakiness!
+ expect(flaky_example.first_flaky_at).to eq(expected_first_flaky_at)
+ end
+ end
+
+ it 'updates the last_flaky_at' do
+ travel_to(Time.now + 42) do
+ the_future = Time.now
+ flaky_example.update_flakiness!
+
+ expect(flaky_example.last_flaky_at).to eq(the_future)
+ end
+ end
+
+ it 'updates the flaky_reports' do
+ expected_flaky_reports = flaky_example.first_flaky_at ? flaky_example.flaky_reports + 1 : 1
+
+ expect { flaky_example.update_flakiness! }.to change { flaky_example.flaky_reports }.by(1)
+ expect(flaky_example.flaky_reports).to eq(expected_flaky_reports)
+ end
+
+ context 'when passed a :last_attempts_count' do
+ it 'updates the last_attempts_count' do
+ flaky_example.update_flakiness!(last_attempts_count: 42)
+
+ expect(flaky_example.last_attempts_count).to eq(42)
+ end
+ end
+
+ context 'when run on the CI' do
+ before do
+ stub_env('CI_PROJECT_URL', 'https://gitlab.com/gitlab-org/gitlab-foss')
+ stub_env('CI_JOB_ID', 42)
+ end
+
+ it 'updates the last_flaky_job' do
+ flaky_example.update_flakiness!
+
+ expect(flaky_example.last_flaky_job).to eq('https://gitlab.com/gitlab-org/gitlab-foss/-/jobs/42')
+ end
+ end
+ end
+
+ context 'when given an Rspec::Example' do
+ it_behaves_like 'an up-to-date FlakyExample instance' do
+ let(:args) { example }
+ end
+ end
+
+ context 'when given a hash' do
+ it_behaves_like 'an up-to-date FlakyExample instance' do
+ let(:args) { flaky_example_attrs }
+ end
+ end
+ end
+
+ describe '#to_h' do
+ shared_examples 'a valid FlakyExample hash' do
+ let(:additional_attrs) { {} }
+
+ it 'returns a valid hash' do
+ flaky_example = described_class.new(args)
+ final_hash = flaky_example_attrs.merge(additional_attrs)
+
+ expect(flaky_example.to_h).to eq(final_hash)
+ end
+ end
+
+ context 'when given an Rspec::Example' do
+ let(:args) { example }
+
+ it_behaves_like 'a valid FlakyExample hash' do
+ let(:additional_attrs) do
+ { first_flaky_at: nil, last_flaky_at: nil, last_flaky_job: nil, flaky_reports: 0 }
+ end
+ end
+ end
+
+ context 'when given a hash' do
+ let(:args) { flaky_example_attrs }
+
+ it_behaves_like 'a valid FlakyExample hash'
+ end
+ end
+end
diff --git a/spec/tooling/rspec_flaky/flaky_examples_collection_spec.rb b/spec/tooling/rspec_flaky/flaky_examples_collection_spec.rb
new file mode 100644
index 00000000000..823459e31b4
--- /dev/null
+++ b/spec/tooling/rspec_flaky/flaky_examples_collection_spec.rb
@@ -0,0 +1,74 @@
+# frozen_string_literal: true
+
+require_relative '../../../tooling/rspec_flaky/flaky_examples_collection'
+
+RSpec.describe RspecFlaky::FlakyExamplesCollection, :aggregate_failures do
+ let(:collection_hash) do
+ {
+ a: { example_id: 'spec/foo/bar_spec.rb:2' },
+ b: { example_id: 'spec/foo/baz_spec.rb:3' }
+ }
+ end
+
+ let(:collection_report) do
+ {
+ a: {
+ example_id: 'spec/foo/bar_spec.rb:2',
+ first_flaky_at: nil,
+ last_flaky_at: nil,
+ last_flaky_job: nil
+ },
+ b: {
+ example_id: 'spec/foo/baz_spec.rb:3',
+ first_flaky_at: nil,
+ last_flaky_at: nil,
+ last_flaky_job: nil
+ }
+ }
+ end
+
+ describe '#initialize' do
+ it 'accepts no argument' do
+ expect { described_class.new }.not_to raise_error
+ end
+
+ it 'accepts a hash' do
+ expect { described_class.new(collection_hash) }.not_to raise_error
+ end
+
+ it 'does not accept anything else' do
+ expect { described_class.new([1, 2, 3]) }.to raise_error(ArgumentError, "`collection` must be a Hash, Array given!")
+ end
+ end
+
+ describe '#to_h' do
+ it 'calls #to_h on the values' do
+ collection = described_class.new(collection_hash)
+
+ expect(collection.to_h).to eq(collection_report)
+ end
+ end
+
+ describe '#-' do
+ it 'returns only examples that are not present in the given collection' do
+ collection1 = described_class.new(collection_hash)
+ collection2 = described_class.new(
+ a: { example_id: 'spec/foo/bar_spec.rb:2' },
+ c: { example_id: 'spec/bar/baz_spec.rb:4' })
+
+ expect((collection2 - collection1).to_h).to eq(
+ c: {
+ example_id: 'spec/bar/baz_spec.rb:4',
+ first_flaky_at: nil,
+ last_flaky_at: nil,
+ last_flaky_job: nil
+ })
+ end
+
+ it 'fails if the given collection does not respond to `#key?`' do
+ collection = described_class.new(collection_hash)
+
+ expect { collection - [1, 2, 3] }.to raise_error(ArgumentError, "`other` must respond to `#key?`, Array does not!")
+ end
+ end
+end
diff --git a/spec/tooling/rspec_flaky/listener_spec.rb b/spec/tooling/rspec_flaky/listener_spec.rb
new file mode 100644
index 00000000000..429724a20cf
--- /dev/null
+++ b/spec/tooling/rspec_flaky/listener_spec.rb
@@ -0,0 +1,227 @@
+# frozen_string_literal: true
+
+require 'active_support/testing/time_helpers'
+require_relative '../../support/helpers/stub_env'
+
+require_relative '../../../tooling/rspec_flaky/listener'
+
+RSpec.describe RspecFlaky::Listener, :aggregate_failures do
+ include ActiveSupport::Testing::TimeHelpers
+ include StubENV
+
+ let(:already_flaky_example_uid) { '6e869794f4cfd2badd93eb68719371d1' }
+ let(:suite_flaky_example_report) do
+ {
+ "#{already_flaky_example_uid}": {
+ example_id: 'spec/foo/bar_spec.rb:2',
+ file: 'spec/foo/bar_spec.rb',
+ line: 2,
+ description: 'hello world',
+ first_flaky_at: 1234,
+ last_flaky_at: 4321,
+ last_attempts_count: 3,
+ flaky_reports: 1,
+ last_flaky_job: nil
+ }
+ }
+ end
+
+ let(:already_flaky_example_attrs) do
+ {
+ id: 'spec/foo/bar_spec.rb:2',
+ metadata: {
+ file_path: 'spec/foo/bar_spec.rb',
+ line_number: 2,
+ full_description: 'hello world'
+ },
+ execution_result: double(status: 'passed', exception: nil)
+ }
+ end
+
+ let(:already_flaky_example) { RspecFlaky::FlakyExample.new(suite_flaky_example_report[already_flaky_example_uid]) }
+ let(:new_example_attrs) do
+ {
+ id: 'spec/foo/baz_spec.rb:3',
+ metadata: {
+ file_path: 'spec/foo/baz_spec.rb',
+ line_number: 3,
+ full_description: 'hello GitLab'
+ },
+ execution_result: double(status: 'passed', exception: nil)
+ }
+ end
+
+ before do
+ # Stub these env variables otherwise specs don't behave the same on the CI
+ stub_env('CI_PROJECT_URL', nil)
+ stub_env('CI_JOB_ID', nil)
+ stub_env('SUITE_FLAKY_RSPEC_REPORT_PATH', nil)
+ end
+
+ describe '#initialize' do
+ shared_examples 'a valid Listener instance' do
+ let(:expected_suite_flaky_examples) { {} }
+
+ it 'returns a valid Listener instance' do
+ listener = described_class.new
+
+ expect(listener.suite_flaky_examples.to_h).to eq(expected_suite_flaky_examples)
+ expect(listener.flaky_examples).to eq({})
+ end
+ end
+
+ context 'when no report file exists' do
+ it_behaves_like 'a valid Listener instance'
+ end
+
+ context 'when SUITE_FLAKY_RSPEC_REPORT_PATH is set' do
+ let(:report_file_path) { 'foo/report.json' }
+
+ before do
+ stub_env('SUITE_FLAKY_RSPEC_REPORT_PATH', report_file_path)
+ end
+
+ context 'and report file exists' do
+ before do
+ expect(File).to receive(:exist?).with(report_file_path).and_return(true)
+ end
+
+ it 'delegates the load to RspecFlaky::Report' do
+ report = RspecFlaky::Report.new(RspecFlaky::FlakyExamplesCollection.new(suite_flaky_example_report))
+
+ expect(RspecFlaky::Report).to receive(:load).with(report_file_path).and_return(report)
+ expect(described_class.new.suite_flaky_examples.to_h).to eq(report.flaky_examples.to_h)
+ end
+ end
+
+ context 'and report file does not exist' do
+ before do
+ expect(File).to receive(:exist?).with(report_file_path).and_return(false)
+ end
+
+ it 'return an empty hash' do
+ expect(RspecFlaky::Report).not_to receive(:load)
+ expect(described_class.new.suite_flaky_examples.to_h).to eq({})
+ end
+ end
+ end
+ end
+
+ describe '#example_passed' do
+ let(:rspec_example) { double(new_example_attrs) }
+ let(:notification) { double(example: rspec_example) }
+ let(:listener) { described_class.new(suite_flaky_example_report.to_json) }
+
+ shared_examples 'a non-flaky example' do
+ it 'does not change the flaky examples hash' do
+ expect { listener.example_passed(notification) }
+ .not_to change { listener.flaky_examples }
+ end
+ end
+
+ shared_examples 'an existing flaky example' do
+ let(:expected_flaky_example) do
+ {
+ example_id: 'spec/foo/bar_spec.rb:2',
+ file: 'spec/foo/bar_spec.rb',
+ line: 2,
+ description: 'hello world',
+ first_flaky_at: 1234,
+ last_attempts_count: 2,
+ flaky_reports: 2,
+ last_flaky_job: nil
+ }
+ end
+
+ it 'changes the flaky examples hash' do
+ new_example = RspecFlaky::Example.new(rspec_example)
+
+ travel_to(Time.now + 42) do
+ the_future = Time.now
+ expect { listener.example_passed(notification) }
+ .to change { listener.flaky_examples[new_example.uid].to_h }
+ expect(listener.flaky_examples[new_example.uid].to_h)
+ .to eq(expected_flaky_example.merge(last_flaky_at: the_future))
+ end
+ end
+ end
+
+ shared_examples 'a new flaky example' do
+ let(:expected_flaky_example) do
+ {
+ example_id: 'spec/foo/baz_spec.rb:3',
+ file: 'spec/foo/baz_spec.rb',
+ line: 3,
+ description: 'hello GitLab',
+ last_attempts_count: 2,
+ flaky_reports: 1,
+ last_flaky_job: nil
+ }
+ end
+
+ it 'changes the all flaky examples hash' do
+ new_example = RspecFlaky::Example.new(rspec_example)
+
+ travel_to(Time.now + 42) do
+ the_future = Time.now
+ expect { listener.example_passed(notification) }
+ .to change { listener.flaky_examples[new_example.uid].to_h }
+ expect(listener.flaky_examples[new_example.uid].to_h)
+ .to eq(expected_flaky_example.merge(first_flaky_at: the_future, last_flaky_at: the_future))
+ end
+ end
+ end
+
+ describe 'when the RSpec example does not respond to attempts' do
+ it_behaves_like 'a non-flaky example'
+ end
+
+ describe 'when the RSpec example has 1 attempt' do
+ let(:rspec_example) { double(new_example_attrs.merge(attempts: 1)) }
+
+ it_behaves_like 'a non-flaky example'
+ end
+
+ describe 'when the RSpec example has 2 attempts' do
+ let(:rspec_example) { double(new_example_attrs.merge(attempts: 2)) }
+
+ it_behaves_like 'a new flaky example'
+
+ context 'with an existing flaky example' do
+ let(:rspec_example) { double(already_flaky_example_attrs.merge(attempts: 2)) }
+
+ it_behaves_like 'an existing flaky example'
+ end
+ end
+ end
+
+ describe '#dump_summary' do
+ let(:listener) { described_class.new(suite_flaky_example_report.to_json) }
+ let(:new_flaky_rspec_example) { double(new_example_attrs.merge(attempts: 2)) }
+ let(:already_flaky_rspec_example) { double(already_flaky_example_attrs.merge(attempts: 2)) }
+ let(:notification_new_flaky_rspec_example) { double(example: new_flaky_rspec_example) }
+ let(:notification_already_flaky_rspec_example) { double(example: already_flaky_rspec_example) }
+
+ before do
+ allow(Kernel).to receive(:warn)
+ end
+
+ context 'when a report file path is set by FLAKY_RSPEC_REPORT_PATH' do
+ it 'delegates the writes to RspecFlaky::Report' do
+ listener.example_passed(notification_new_flaky_rspec_example)
+ listener.example_passed(notification_already_flaky_rspec_example)
+
+ report1 = double
+ report2 = double
+
+ expect(RspecFlaky::Report).to receive(:new).with(listener.flaky_examples).and_return(report1)
+ expect(report1).to receive(:write).with(RspecFlaky::Config.flaky_examples_report_path)
+
+ expect(RspecFlaky::Report).to receive(:new).with(listener.flaky_examples - listener.suite_flaky_examples).and_return(report2)
+ expect(report2).to receive(:write).with(RspecFlaky::Config.new_flaky_examples_report_path)
+
+ listener.dump_summary(nil)
+ end
+ end
+ end
+end
diff --git a/spec/tooling/rspec_flaky/report_spec.rb b/spec/tooling/rspec_flaky/report_spec.rb
new file mode 100644
index 00000000000..6c364cd5cd3
--- /dev/null
+++ b/spec/tooling/rspec_flaky/report_spec.rb
@@ -0,0 +1,135 @@
+# frozen_string_literal: true
+
+require 'tempfile'
+
+require_relative '../../../tooling/rspec_flaky/report'
+
+RSpec.describe RspecFlaky::Report, :aggregate_failures do
+ let(:thirty_one_days) { 3600 * 24 * 31 }
+ let(:collection_hash) do
+ {
+ a: { example_id: 'spec/foo/bar_spec.rb:2' },
+ b: { example_id: 'spec/foo/baz_spec.rb:3', first_flaky_at: (Time.now - thirty_one_days).to_s, last_flaky_at: (Time.now - thirty_one_days).to_s }
+ }
+ end
+
+ let(:suite_flaky_example_report) do
+ {
+ '6e869794f4cfd2badd93eb68719371d1': {
+ example_id: 'spec/foo/bar_spec.rb:2',
+ file: 'spec/foo/bar_spec.rb',
+ line: 2,
+ description: 'hello world',
+ first_flaky_at: 1234,
+ last_flaky_at: 4321,
+ last_attempts_count: 3,
+ flaky_reports: 1,
+ last_flaky_job: nil
+ }
+ }
+ end
+
+ let(:flaky_examples) { RspecFlaky::FlakyExamplesCollection.new(collection_hash) }
+ let(:report) { described_class.new(flaky_examples) }
+
+ before do
+ allow(Kernel).to receive(:warn)
+ end
+
+ describe '.load' do
+ let!(:report_file) do
+ Tempfile.new(%w[rspec_flaky_report .json]).tap do |f|
+ f.write(JSON.pretty_generate(suite_flaky_example_report)) # rubocop:disable Gitlab/Json
+ f.rewind
+ end
+ end
+
+ after do
+ report_file.close
+ report_file.unlink
+ end
+
+ it 'loads the report file' do
+ expect(described_class.load(report_file.path).flaky_examples.to_h).to eq(suite_flaky_example_report)
+ end
+ end
+
+ describe '.load_json' do
+ let(:report_json) do
+ JSON.pretty_generate(suite_flaky_example_report) # rubocop:disable Gitlab/Json
+ end
+
+ it 'loads the report file' do
+ expect(described_class.load_json(report_json).flaky_examples.to_h).to eq(suite_flaky_example_report)
+ end
+ end
+
+ describe '#initialize' do
+ it 'accepts a RspecFlaky::FlakyExamplesCollection' do
+ expect { report }.not_to raise_error
+ end
+
+ it 'does not accept anything else' do
+ expect { described_class.new([1, 2, 3]) }.to raise_error(ArgumentError, "`flaky_examples` must be a RspecFlaky::FlakyExamplesCollection, Array given!")
+ end
+ end
+
+ it 'delegates to #flaky_examples using SimpleDelegator' do
+ expect(report.__getobj__).to eq(flaky_examples)
+ end
+
+ describe '#write' do
+ let(:report_file_path) { File.join('tmp', 'rspec_flaky_report.json') }
+
+ before do
+ FileUtils.rm(report_file_path) if File.exist?(report_file_path)
+ end
+
+ after do
+ FileUtils.rm(report_file_path) if File.exist?(report_file_path)
+ end
+
+ context 'when RspecFlaky::Config.generate_report? is false' do
+ before do
+ allow(RspecFlaky::Config).to receive(:generate_report?).and_return(false)
+ end
+
+ it 'does not write any report file' do
+ report.write(report_file_path)
+
+ expect(File.exist?(report_file_path)).to be(false)
+ end
+ end
+
+ context 'when RspecFlaky::Config.generate_report? is true' do
+ before do
+ allow(RspecFlaky::Config).to receive(:generate_report?).and_return(true)
+ end
+
+ it 'delegates the writes to RspecFlaky::Report' do
+ report.write(report_file_path)
+
+ expect(File.exist?(report_file_path)).to be(true)
+ expect(File.read(report_file_path))
+ .to eq(JSON.pretty_generate(report.flaky_examples.to_h)) # rubocop:disable Gitlab/Json
+ end
+ end
+ end
+
+ describe '#prune_outdated' do
+ it 'returns a new collection without the examples older than 30 days by default' do
+ new_report = flaky_examples.to_h.dup.tap { |r| r.delete(:b) }
+ new_flaky_examples = report.prune_outdated
+
+ expect(new_flaky_examples).to be_a(described_class)
+ expect(new_flaky_examples.to_h).to eq(new_report)
+ expect(flaky_examples).to have_key(:b)
+ end
+
+ it 'accepts a given number of days' do
+ new_flaky_examples = report.prune_outdated(days: 32)
+
+ expect(new_flaky_examples.to_h).to eq(report.to_h)
+ end
+ end
+end
diff --git a/spec/uploaders/dependency_proxy/file_uploader_spec.rb b/spec/uploaders/dependency_proxy/file_uploader_spec.rb
index 724a9c42f47..6e94a661d6d 100644
--- a/spec/uploaders/dependency_proxy/file_uploader_spec.rb
+++ b/spec/uploaders/dependency_proxy/file_uploader_spec.rb
@@ -2,25 +2,43 @@
require 'spec_helper'
RSpec.describe DependencyProxy::FileUploader do
- let(:blob) { create(:dependency_proxy_blob) }
- let(:uploader) { described_class.new(blob, :file) }
- let(:path) { Gitlab.config.dependency_proxy.storage_path }
+ describe 'DependencyProxy::Blob uploader' do
+ let_it_be(:blob) { create(:dependency_proxy_blob) }
+ let_it_be(:path) { Gitlab.config.dependency_proxy.storage_path }
+ let(:uploader) { described_class.new(blob, :file) }
- subject { uploader }
+ subject { uploader }
- it_behaves_like "builds correct paths",
- store_dir: %r[\h{2}/\h{2}],
- cache_dir: %r[/dependency_proxy/tmp/cache],
- work_dir: %r[/dependency_proxy/tmp/work]
+ it_behaves_like "builds correct paths",
+ store_dir: %r[\h{2}/\h{2}],
+ cache_dir: %r[/dependency_proxy/tmp/cache],
+ work_dir: %r[/dependency_proxy/tmp/work]
+
+ context 'object store is remote' do
+ before do
+ stub_dependency_proxy_object_storage
+ end
- context 'object store is remote' do
- before do
- stub_dependency_proxy_object_storage
+ include_context 'with storage', described_class::Store::REMOTE
+
+ it_behaves_like "builds correct paths",
+ store_dir: %r[\h{2}/\h{2}]
end
+ end
- include_context 'with storage', described_class::Store::REMOTE
+ describe 'DependencyProxy::Manifest uploader' do
+ let_it_be(:manifest) { create(:dependency_proxy_manifest) }
+ let_it_be(:initial_content_type) { 'application/json' }
+ let_it_be(:fixture_file) { fixture_file_upload('spec/fixtures/dependency_proxy/manifest', initial_content_type) }
+ let(:uploader) { described_class.new(manifest, :file) }
- it_behaves_like "builds correct paths",
- store_dir: %r[\h{2}/\h{2}]
+ subject { uploader }
+
+ it 'will change upload file content type to match the model content type', :aggregate_failures do
+ uploader.cache!(fixture_file)
+
+ expect(uploader.file.content_type).to eq(manifest.content_type)
+ expect(uploader.file.content_type).not_to eq(initial_content_type)
+ end
end
end
diff --git a/spec/validators/gitlab/utils/zoom_url_validator_spec.rb b/spec/validators/gitlab/utils/zoom_url_validator_spec.rb
new file mode 100644
index 00000000000..bc8236a2f5c
--- /dev/null
+++ b/spec/validators/gitlab/utils/zoom_url_validator_spec.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Utils::ZoomUrlValidator do
+ let(:zoom_meeting) { build(:zoom_meeting) }
+
+ describe 'validations' do
+ context 'when zoom link starts with https' do
+ it 'passes validation' do
+ zoom_meeting.url = 'https://zoom.us/j/123456789'
+
+ expect(zoom_meeting.valid?).to eq(true)
+ expect(zoom_meeting.errors).to be_empty
+ end
+ end
+
+ shared_examples 'zoom link does not start with https' do |url|
+ it 'fails validation' do
+ zoom_meeting.url = url
+ expect(zoom_meeting.valid?).to eq(false)
+
+ expect(zoom_meeting.errors).to be_present
+ expect(zoom_meeting.errors.first[1]).to eq 'must contain one valid Zoom URL'
+ end
+ end
+
+ context 'when zoom link does not start with https' do
+ include_examples 'zoom link does not start with https', 'http://zoom.us/j/123456789'
+
+ context 'when zoom link does not start with a scheme' do
+ include_examples 'zoom link does not start with https', 'testinghttp://zoom.us/j/123456789'
+ end
+ end
+ end
+end
diff --git a/spec/validators/zoom_url_validator_spec.rb b/spec/validators/zoom_url_validator_spec.rb
deleted file mode 100644
index 7d5c94bc249..00000000000
--- a/spec/validators/zoom_url_validator_spec.rb
+++ /dev/null
@@ -1,36 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe ZoomUrlValidator do
- let(:zoom_meeting) { build(:zoom_meeting) }
-
- describe 'validations' do
- context 'when zoom link starts with https' do
- it 'passes validation' do
- zoom_meeting.url = 'https://zoom.us/j/123456789'
-
- expect(zoom_meeting.valid?).to eq(true)
- expect(zoom_meeting.errors).to be_empty
- end
- end
-
- shared_examples 'zoom link does not start with https' do |url|
- it 'fails validation' do
- zoom_meeting.url = url
- expect(zoom_meeting.valid?).to eq(false)
-
- expect(zoom_meeting.errors).to be_present
- expect(zoom_meeting.errors.first[1]).to eq 'must contain one valid Zoom URL'
- end
- end
-
- context 'when zoom link does not start with https' do
- include_examples 'zoom link does not start with https', 'http://zoom.us/j/123456789'
-
- context 'when zoom link does not start with a scheme' do
- include_examples 'zoom link does not start with https', 'testinghttp://zoom.us/j/123456789'
- end
- end
- end
-end
diff --git a/spec/views/admin/application_settings/_package_registry.html.haml_spec.rb b/spec/views/admin/application_settings/_package_registry.html.haml_spec.rb
index ef40829c29b..e0aa2fc8d56 100644
--- a/spec/views/admin/application_settings/_package_registry.html.haml_spec.rb
+++ b/spec/views/admin/application_settings/_package_registry.html.haml_spec.rb
@@ -30,8 +30,8 @@ RSpec.describe 'admin/application_settings/_package_registry' do
expect(rendered).to have_field('Maximum Maven package file size in bytes', type: 'number')
expect(page.find_field('Maximum Maven package file size in bytes').value).to eq(default_plan_limits.maven_max_file_size.to_s)
- expect(rendered).to have_field('Maximum NPM package file size in bytes', type: 'number')
- expect(page.find_field('Maximum NPM package file size in bytes').value).to eq(default_plan_limits.npm_max_file_size.to_s)
+ expect(rendered).to have_field('Maximum npm package file size in bytes', type: 'number')
+ expect(page.find_field('Maximum npm package file size in bytes').value).to eq(default_plan_limits.npm_max_file_size.to_s)
expect(rendered).to have_field('Maximum NuGet package file size in bytes', type: 'number')
expect(page.find_field('Maximum NuGet package file size in bytes').value).to eq(default_plan_limits.nuget_max_file_size.to_s)
@@ -48,18 +48,18 @@ RSpec.describe 'admin/application_settings/_package_registry' do
end
context 'with multiple plans' do
- let_it_be(:plan) { create(:plan, name: 'Gold') }
- let_it_be(:gold_plan_limits) { create(:plan_limits, :with_package_file_sizes, plan: plan) }
+ let_it_be(:plan) { create(:plan, name: 'Ultimate') }
+ let_it_be(:ultimate_plan_limits) { create(:plan_limits, :with_package_file_sizes, plan: plan) }
before do
- assign(:plans, [default_plan_limits.plan, gold_plan_limits.plan])
+ 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('Gold')
+ expect(page).to have_content('Ultimate')
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 2915fe1964f..dc8f259eb56 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
@@ -3,34 +3,49 @@
require 'spec_helper'
RSpec.describe 'admin/application_settings/_repository_storage.html.haml' do
- let(:app_settings) { create(:application_setting) }
- let(:repository_storages_weighted_attributes) { [:repository_storages_weighted_default, :repository_storages_weighted_mepmep, :repository_storages_weighted_foobar]}
- let(:repository_storages_weighted) do
- {
- "default" => 100,
- "mepmep" => 50
- }
- end
+ let(:app_settings) { build(:application_setting, repository_storages_weighted: repository_storages_weighted) }
before do
- allow(app_settings).to receive(:repository_storages_weighted).and_return(repository_storages_weighted)
- allow(app_settings).to receive(:repository_storages_weighted_mepmep).and_return(100)
- allow(app_settings).to receive(:repository_storages_weighted_foobar).and_return(50)
+ stub_storage_settings({ 'default': {}, 'mepmep': {}, 'foobar': {} })
assign(:application_setting, app_settings)
- allow(ApplicationSetting).to receive(:repository_storages_weighted_attributes).and_return(repository_storages_weighted_attributes)
end
- context 'when multiple storages are available' do
+ context 'additional storage config' do
+ let(:repository_storages_weighted) do
+ {
+ 'default' => 100,
+ 'mepmep' => 50
+ }
+ end
+
it 'lists them all' do
render
- # lists storages that are saved with weights
- repository_storages_weighted.each do |storage_name, storage_weight|
+ Gitlab.config.repositories.storages.keys.each do |storage_name|
expect(rendered).to have_content(storage_name)
end
- # lists storage not saved with weight
expect(rendered).to have_content('foobar')
end
end
+
+ context 'fewer storage configs' do
+ let(:repository_storages_weighted) do
+ {
+ 'default' => 100,
+ 'mepmep' => 50,
+ 'something_old' => 100
+ }
+ 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')
+ 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 a53aab43c18..00000000000
--- a/spec/views/groups/show.html.haml_spec.rb
+++ /dev/null
@@ -1,52 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'groups/show.html.haml' do
- let_it_be(:user) { build(:user) }
- let_it_be(:group) { create(:group) }
-
- before do
- assign(:group, group)
- end
-
- context 'when rendering with the layout' do
- subject(:render_page) { render template: 'groups/show.html.haml', layout: 'layouts/group' }
-
- describe 'invite team members' do
- before do
- allow(view).to receive(:session).and_return({})
- allow(view).to receive(:current_user_mode).and_return(Gitlab::Auth::CurrentUserMode.new(user))
- allow(view).to receive(:current_user).and_return(user)
- allow(view).to receive(:experiment_enabled?).and_return(false)
- allow(view).to receive(:group_path).and_return('')
- allow(view).to receive(:group_shared_path).and_return('')
- allow(view).to receive(:group_archived_path).and_return('')
- end
-
- context 'when invite team members is not available in sidebar' do
- before do
- allow(view).to receive(:can_invite_members_for_group?).and_return(false)
- end
-
- it 'does not display the js-invite-members-trigger' do
- render_page
-
- expect(rendered).not_to have_selector('.js-invite-members-trigger')
- end
- end
-
- context 'when invite team members is available' do
- before do
- allow(view).to receive(:can_invite_members_for_group?).and_return(true)
- end
-
- it 'includes the div for js-invite-members-trigger' do
- render_page
-
- expect(rendered).to have_selector('.js-invite-members-trigger')
- end
- end
- end
- end
-end
diff --git a/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb b/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb
index e34d8b91b38..99d7dfc8acb 100644
--- a/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb
+++ b/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb
@@ -204,7 +204,7 @@ RSpec.describe 'layouts/nav/sidebar/_project' do
it 'does not show the ci/cd settings tab' do
render
- expect(rendered).not_to have_link('CI / CD', href: project_settings_ci_cd_path(project))
+ expect(rendered).not_to have_link('CI/CD', href: project_settings_ci_cd_path(project))
end
end
@@ -214,7 +214,7 @@ RSpec.describe 'layouts/nav/sidebar/_project' do
it 'shows the ci/cd settings tab' do
render
- expect(rendered).to have_link('CI / CD', href: project_settings_ci_cd_path(project))
+ expect(rendered).to have_link('CI/CD', href: project_settings_ci_cd_path(project))
end
end
end
diff --git a/spec/views/notify/change_in_merge_request_draft_status_email.html.haml_spec.rb b/spec/views/notify/change_in_merge_request_draft_status_email.html.haml_spec.rb
new file mode 100644
index 00000000000..6c25eba03b9
--- /dev/null
+++ b/spec/views/notify/change_in_merge_request_draft_status_email.html.haml_spec.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'notify/change_in_merge_request_draft_status_email.html.haml' do
+ let(:user) { create(:user) }
+ let(:merge_request) { create(:merge_request) }
+
+ before do
+ assign(:updated_by_user, user)
+ assign(:merge_request, merge_request)
+ end
+
+ it 'renders the email correctly' do
+ render
+
+ expect(rendered).to have_content("#{user.name} changed the draft status of merge request #{merge_request.to_reference}")
+ end
+end
diff --git a/spec/views/notify/change_in_merge_request_draft_status_email.text.erb_spec.rb b/spec/views/notify/change_in_merge_request_draft_status_email.text.erb_spec.rb
new file mode 100644
index 00000000000..a05c20fd8c4
--- /dev/null
+++ b/spec/views/notify/change_in_merge_request_draft_status_email.text.erb_spec.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+require 'spec_helper'
+
+RSpec.describe 'notify/change_in_merge_request_draft_status_email.text.erb' do
+ let(:user) { create(:user) }
+ let(:merge_request) { create(:merge_request) }
+
+ before do
+ assign(:updated_by_user, user)
+ assign(:merge_request, merge_request)
+ end
+
+ it_behaves_like 'renders plain text email correctly'
+
+ it 'renders the email correctly' do
+ render
+
+ expect(rendered).to have_content("#{user.name} changed the draft status of merge request #{merge_request.to_reference}")
+ end
+end
diff --git a/spec/views/projects/_home_panel.html.haml_spec.rb b/spec/views/projects/_home_panel.html.haml_spec.rb
index cc0eb9919da..d329c57af00 100644
--- a/spec/views/projects/_home_panel.html.haml_spec.rb
+++ b/spec/views/projects/_home_panel.html.haml_spec.rb
@@ -9,7 +9,6 @@ RSpec.describe 'projects/_home_panel' do
let(:project) { create(:project) }
before do
- stub_feature_flags(vue_notification_dropdown: false)
assign(:project, project)
allow(view).to receive(:current_user).and_return(user)
@@ -25,11 +24,10 @@ RSpec.describe 'projects/_home_panel' do
assign(:notification_setting, notification_settings)
end
- it 'makes it possible to set notification level' do
+ it 'renders Vue app root' do
render
- expect(view).to render_template('shared/notifications/_new_button')
- expect(rendered).to have_selector('.notification-dropdown')
+ expect(rendered).to have_selector('.js-vue-notification-dropdown')
end
end
@@ -40,10 +38,10 @@ RSpec.describe 'projects/_home_panel' do
assign(:notification_setting, nil)
end
- it 'is not possible to set notification level' do
+ it 'does not render Vue app root' do
render
- expect(rendered).not_to have_selector('.notification_dropdown')
+ expect(rendered).not_to have_selector('.js-vue-notification-dropdown')
end
end
end
diff --git a/spec/views/projects/empty.html.haml_spec.rb b/spec/views/projects/empty.html.haml_spec.rb
index 6762dcd22d5..de83722160e 100644
--- a/spec/views/projects/empty.html.haml_spec.rb
+++ b/spec/views/projects/empty.html.haml_spec.rb
@@ -79,41 +79,4 @@ RSpec.describe 'projects/empty' do
it_behaves_like 'no invite member info'
end
end
-
- context 'when rendering with the layout' do
- subject(:render_page) { render template: 'projects/empty.html.haml', layout: 'layouts/project' }
-
- describe 'invite team members' do
- before do
- allow(view).to receive(:session).and_return({})
- allow(view).to receive(:current_user_mode).and_return(Gitlab::Auth::CurrentUserMode.new(user))
- allow(view).to receive(:current_user).and_return(user)
- allow(view).to receive(:experiment_enabled?).and_return(false)
- end
-
- context 'when invite team members is not available in sidebar' do
- before do
- allow(view).to receive(:can_invite_members_for_project?).and_return(false)
- end
-
- it 'does not display the js-invite-members-trigger' do
- render_page
-
- expect(rendered).not_to have_selector('.js-invite-members-trigger')
- end
- end
-
- context 'when invite team members is available' do
- before do
- allow(view).to receive(:can_invite_members_for_project?).and_return(true)
- end
-
- it 'includes the div for js-invite-members-trigger' do
- render_page
-
- expect(rendered).to have_selector('.js-invite-members-trigger')
- end
- end
- end
- end
end
diff --git a/spec/views/projects/merge_requests/show.html.haml_spec.rb b/spec/views/projects/merge_requests/show.html.haml_spec.rb
index db41c9b5374..40d11342ec4 100644
--- a/spec/views/projects/merge_requests/show.html.haml_spec.rb
+++ b/spec/views/projects/merge_requests/show.html.haml_spec.rb
@@ -2,16 +2,14 @@
require 'spec_helper'
-RSpec.describe 'projects/merge_requests/show.html.haml' do
- include Spec::Support::Helpers::Features::MergeRequestHelpers
+RSpec.describe 'projects/merge_requests/show.html.haml', :aggregate_failures do
+ include_context 'merge request show action'
before do
- allow(view).to receive(:experiment_enabled?).and_return(false)
+ merge_request.reload
end
context 'when the merge request is open' do
- include_context 'open merge request show action'
-
it 'shows the "Mark as draft" button' do
render
@@ -22,20 +20,8 @@ RSpec.describe 'projects/merge_requests/show.html.haml' do
end
context 'when the merge request is closed' do
- include_context 'closed merge request show action'
-
- describe 'merge request assignee sidebar' do
- context 'when assignee is allowed to merge' do
- it 'does not show a warning icon' do
- closed_merge_request.update!(assignee_id: user.id)
- project.add_maintainer(user)
- assign(:issuable_sidebar, serialize_issuable_sidebar(user, project, closed_merge_request))
-
- render
-
- expect(rendered).not_to have_css('.merge-icon')
- end
- end
+ before do
+ merge_request.close!
end
it 'shows the "Reopen" button' do
@@ -46,15 +32,15 @@ RSpec.describe 'projects/merge_requests/show.html.haml' do
expect(rendered).to have_css('a', visible: false, text: 'Close')
end
- it 'does not show the "Reopen" button when the source project does not exist' do
- unlink_project.execute
- closed_merge_request.reload
- preload_view_requirements(closed_merge_request, note)
+ context 'when source project does not exist' do
+ it 'does not show the "Reopen" button' do
+ allow(merge_request).to receive(:source_project).and_return(nil)
- render
+ render
- expect(rendered).to have_css('a', visible: false, text: 'Reopen')
- expect(rendered).to have_css('a', visible: false, text: 'Close')
+ expect(rendered).to have_css('a', visible: false, text: 'Reopen')
+ expect(rendered).to have_css('a', visible: false, text: 'Close')
+ end
end
end
end
diff --git a/spec/views/projects/settings/operations/show.html.haml_spec.rb b/spec/views/projects/settings/operations/show.html.haml_spec.rb
index a22853d40d8..b2dd3556098 100644
--- a/spec/views/projects/settings/operations/show.html.haml_spec.rb
+++ b/spec/views/projects/settings/operations/show.html.haml_spec.rb
@@ -59,7 +59,7 @@ RSpec.describe 'projects/settings/operations/show' do
expect(rendered).to have_content _('Prometheus')
expect(rendered).to have_content _('Link Prometheus monitoring to GitLab.')
- expect(rendered).to have_content _('To enable the installation of Prometheus on your clusters, deactivate the manual configuration below')
+ expect(rendered).to have_content _('To enable the installation of Prometheus on your clusters, deactivate the manual configuration.')
end
end
@@ -71,7 +71,7 @@ RSpec.describe 'projects/settings/operations/show' do
it 'renders the Operations Settings page' do
render
- expect(rendered).not_to have_content _('Select the Active checkbox to override the Auto Configuration with custom settings. If unchecked, Auto Configuration settings are used.')
+ expect(rendered).not_to have_content _('Auto configuration settings are used unless you override their values here.')
end
end
end
diff --git a/spec/views/projects/show.html.haml_spec.rb b/spec/views/projects/show.html.haml_spec.rb
deleted file mode 100644
index 995e31e83af..00000000000
--- a/spec/views/projects/show.html.haml_spec.rb
+++ /dev/null
@@ -1,51 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'projects/show.html.haml' do
- let_it_be(:user) { build(:user) }
- let_it_be(:project) { ProjectPresenter.new(create(:project, :repository), current_user: user) }
-
- before do
- assign(:project, project)
- end
-
- context 'when rendering with the layout' do
- subject(:render_page) { render template: 'projects/show.html.haml', layout: 'layouts/project' }
-
- describe 'invite team members' do
- before do
- allow(view).to receive(:event_filter_link)
- allow(view).to receive(:session).and_return({})
- allow(view).to receive(:current_user_mode).and_return(Gitlab::Auth::CurrentUserMode.new(user))
- allow(view).to receive(:current_user).and_return(user)
- allow(view).to receive(:experiment_enabled?).and_return(false)
- allow(view).to receive(:add_page_startup_graphql_call)
- end
-
- context 'when invite team members is not available in sidebar' do
- before do
- allow(view).to receive(:can_invite_members_for_project?).and_return(false)
- end
-
- it 'does not display the js-invite-members-trigger' do
- render_page
-
- expect(rendered).not_to have_selector('.js-invite-members-trigger')
- end
- end
-
- context 'when invite team members is available' do
- before do
- allow(view).to receive(:can_invite_members_for_project?).and_return(true)
- end
-
- it 'includes the div for js-invite-members-trigger' do
- render_page
-
- expect(rendered).to have_selector('.js-invite-members-trigger')
- end
- end
- end
- end
-end
diff --git a/spec/workers/analytics/instance_statistics/count_job_trigger_worker_spec.rb b/spec/workers/analytics/instance_statistics/count_job_trigger_worker_spec.rb
index c7de8553d86..da0cbe37400 100644
--- a/spec/workers/analytics/instance_statistics/count_job_trigger_worker_spec.rb
+++ b/spec/workers/analytics/instance_statistics/count_job_trigger_worker_spec.rb
@@ -6,12 +6,12 @@ RSpec.describe Analytics::InstanceStatistics::CountJobTriggerWorker do
it_behaves_like 'an idempotent worker'
context 'triggers a job for each measurement identifiers' do
- let(:expected_count) { Analytics::InstanceStatistics::Measurement.identifier_query_mapping.keys.size }
+ let(:expected_count) { Analytics::UsageTrends::Measurement.identifier_query_mapping.keys.size }
it 'triggers CounterJobWorker jobs' do
subject.perform
- expect(Analytics::InstanceStatistics::CounterJobWorker.jobs.count).to eq(expected_count)
+ expect(Analytics::UsageTrends::CounterJobWorker.jobs.count).to eq(expected_count)
end
end
end
diff --git a/spec/workers/analytics/instance_statistics/counter_job_worker_spec.rb b/spec/workers/analytics/instance_statistics/counter_job_worker_spec.rb
index 667ec0bcb75..4994fec44ab 100644
--- a/spec/workers/analytics/instance_statistics/counter_job_worker_spec.rb
+++ b/spec/workers/analytics/instance_statistics/counter_job_worker_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe Analytics::InstanceStatistics::CounterJobWorker do
let_it_be(:user_1) { create(:user) }
let_it_be(:user_2) { create(:user) }
- let(:users_measurement_identifier) { ::Analytics::InstanceStatistics::Measurement.identifiers.fetch(:users) }
+ let(:users_measurement_identifier) { ::Analytics::UsageTrends::Measurement.identifiers.fetch(:users) }
let(:recorded_at) { Time.zone.now }
let(:job_args) { [users_measurement_identifier, user_1.id, user_2.id, recorded_at] }
@@ -18,7 +18,7 @@ RSpec.describe Analytics::InstanceStatistics::CounterJobWorker do
it 'counts a scope and stores the result' do
subject
- measurement = Analytics::InstanceStatistics::Measurement.users.first
+ measurement = Analytics::UsageTrends::Measurement.users.first
expect(measurement.recorded_at).to be_like_time(recorded_at)
expect(measurement.identifier).to eq('users')
expect(measurement.count).to eq(2)
@@ -26,14 +26,14 @@ RSpec.describe Analytics::InstanceStatistics::CounterJobWorker do
end
context 'when no records are in the database' do
- let(:users_measurement_identifier) { ::Analytics::InstanceStatistics::Measurement.identifiers.fetch(:groups) }
+ let(:users_measurement_identifier) { ::Analytics::UsageTrends::Measurement.identifiers.fetch(:groups) }
subject { described_class.new.perform(users_measurement_identifier, nil, nil, recorded_at) }
it 'sets 0 as the count' do
subject
- measurement = Analytics::InstanceStatistics::Measurement.groups.first
+ measurement = Analytics::UsageTrends::Measurement.groups.first
expect(measurement.recorded_at).to be_like_time(recorded_at)
expect(measurement.identifier).to eq('groups')
expect(measurement.count).to eq(0)
@@ -49,19 +49,19 @@ RSpec.describe Analytics::InstanceStatistics::CounterJobWorker do
it 'does not insert anything when BatchCount returns error' do
allow(Gitlab::Database::BatchCount).to receive(:batch_count).and_return(Gitlab::Database::BatchCounter::FALLBACK)
- expect { subject }.not_to change { Analytics::InstanceStatistics::Measurement.count }
+ expect { subject }.not_to change { Analytics::UsageTrends::Measurement.count }
end
context 'when pipelines_succeeded identifier is passed' do
let_it_be(:pipeline) { create(:ci_pipeline, :success) }
- let(:successful_pipelines_measurement_identifier) { ::Analytics::InstanceStatistics::Measurement.identifiers.fetch(:pipelines_succeeded) }
+ let(:successful_pipelines_measurement_identifier) { ::Analytics::UsageTrends::Measurement.identifiers.fetch(:pipelines_succeeded) }
let(:job_args) { [successful_pipelines_measurement_identifier, pipeline.id, pipeline.id, recorded_at] }
it 'counts successful pipelines' do
subject
- measurement = Analytics::InstanceStatistics::Measurement.pipelines_succeeded.first
+ measurement = Analytics::UsageTrends::Measurement.pipelines_succeeded.first
expect(measurement.recorded_at).to be_like_time(recorded_at)
expect(measurement.identifier).to eq('pipelines_succeeded')
expect(measurement.count).to eq(1)
diff --git a/spec/workers/analytics/usage_trends/count_job_trigger_worker_spec.rb b/spec/workers/analytics/usage_trends/count_job_trigger_worker_spec.rb
new file mode 100644
index 00000000000..735e4a214a9
--- /dev/null
+++ b/spec/workers/analytics/usage_trends/count_job_trigger_worker_spec.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Analytics::UsageTrends::CountJobTriggerWorker do
+ it_behaves_like 'an idempotent worker'
+
+ context 'triggers a job for each measurement identifiers' do
+ let(:expected_count) { Analytics::UsageTrends::Measurement.identifier_query_mapping.keys.size }
+
+ it 'triggers CounterJobWorker jobs' do
+ subject.perform
+
+ expect(Analytics::UsageTrends::CounterJobWorker.jobs.count).to eq(expected_count)
+ end
+ end
+end
diff --git a/spec/workers/analytics/usage_trends/counter_job_worker_spec.rb b/spec/workers/analytics/usage_trends/counter_job_worker_spec.rb
new file mode 100644
index 00000000000..9e4c82ee981
--- /dev/null
+++ b/spec/workers/analytics/usage_trends/counter_job_worker_spec.rb
@@ -0,0 +1,70 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Analytics::UsageTrends::CounterJobWorker do
+ let_it_be(:user_1) { create(:user) }
+ let_it_be(:user_2) { create(:user) }
+
+ let(:users_measurement_identifier) { ::Analytics::UsageTrends::Measurement.identifiers.fetch(:users) }
+ let(:recorded_at) { Time.zone.now }
+ let(:job_args) { [users_measurement_identifier, user_1.id, user_2.id, recorded_at] }
+
+ before do
+ allow(ActiveRecord::Base.connection).to receive(:transaction_open?).and_return(false)
+ end
+
+ include_examples 'an idempotent worker' do
+ it 'counts a scope and stores the result' do
+ subject
+
+ measurement = Analytics::UsageTrends::Measurement.users.first
+ expect(measurement.recorded_at).to be_like_time(recorded_at)
+ expect(measurement.identifier).to eq('users')
+ expect(measurement.count).to eq(2)
+ end
+ end
+
+ context 'when no records are in the database' do
+ let(:users_measurement_identifier) { ::Analytics::UsageTrends::Measurement.identifiers.fetch(:groups) }
+
+ subject { described_class.new.perform(users_measurement_identifier, nil, nil, recorded_at) }
+
+ it 'sets 0 as the count' do
+ subject
+
+ measurement = Analytics::UsageTrends::Measurement.groups.first
+ expect(measurement.recorded_at).to be_like_time(recorded_at)
+ expect(measurement.identifier).to eq('groups')
+ expect(measurement.count).to eq(0)
+ end
+ end
+
+ it 'does not raise error when inserting duplicated measurement' do
+ subject
+
+ expect { subject }.not_to raise_error
+ end
+
+ it 'does not insert anything when BatchCount returns error' do
+ allow(Gitlab::Database::BatchCount).to receive(:batch_count).and_return(Gitlab::Database::BatchCounter::FALLBACK)
+
+ expect { subject }.not_to change { Analytics::UsageTrends::Measurement.count }
+ end
+
+ context 'when pipelines_succeeded identifier is passed' do
+ let_it_be(:pipeline) { create(:ci_pipeline, :success) }
+
+ let(:successful_pipelines_measurement_identifier) { ::Analytics::UsageTrends::Measurement.identifiers.fetch(:pipelines_succeeded) }
+ let(:job_args) { [successful_pipelines_measurement_identifier, pipeline.id, pipeline.id, recorded_at] }
+
+ it 'counts successful pipelines' do
+ subject
+
+ measurement = Analytics::UsageTrends::Measurement.pipelines_succeeded.first
+ expect(measurement.recorded_at).to be_like_time(recorded_at)
+ expect(measurement.identifier).to eq('pipelines_succeeded')
+ expect(measurement.count).to eq(1)
+ end
+ end
+end
diff --git a/spec/workers/emails_on_push_worker_spec.rb b/spec/workers/emails_on_push_worker_spec.rb
index fac463b4dd4..6c37c422aed 100644
--- a/spec/workers/emails_on_push_worker_spec.rb
+++ b/spec/workers/emails_on_push_worker_spec.rb
@@ -97,7 +97,7 @@ RSpec.describe EmailsOnPushWorker, :mailer do
end
it "gracefully handles an input SMTP error" do
- expect(ActionMailer::Base.deliveries.count).to eq(0)
+ expect(ActionMailer::Base.deliveries).to be_empty
end
end
@@ -112,6 +112,16 @@ RSpec.describe EmailsOnPushWorker, :mailer do
end
end
+ context "with mixed-case recipient" do
+ let(:recipients) { user.email.upcase }
+
+ it "retains the case" do
+ perform
+
+ expect(email_recipients).to contain_exactly(recipients)
+ end
+ end
+
context "when the recipient addresses are a list of email addresses" do
let(:recipients) do
1.upto(5).map { |i| user.email.sub('@', "+#{i}@") }.join("\n")
@@ -120,7 +130,6 @@ RSpec.describe EmailsOnPushWorker, :mailer do
it "sends the mail to each of the recipients" do
perform
- expect(ActionMailer::Base.deliveries.count).to eq(5)
expect(email_recipients).to contain_exactly(*recipients.split)
end
@@ -132,13 +141,22 @@ RSpec.describe EmailsOnPushWorker, :mailer do
end
end
+ context "when recipients are invalid" do
+ let(:recipients) { "invalid\n\nrecipients" }
+
+ it "ignores them" do
+ perform
+
+ expect(ActionMailer::Base.deliveries).to be_empty
+ end
+ end
+
context "when the recipient addresses contains angle brackets and are separated by spaces" do
let(:recipients) { "John Doe <johndoe@example.com> Jane Doe <janedoe@example.com>" }
it "accepts emails separated by whitespace" do
perform
- expect(ActionMailer::Base.deliveries.count).to eq(2)
expect(email_recipients).to contain_exactly("johndoe@example.com", "janedoe@example.com")
end
end
@@ -149,7 +167,6 @@ RSpec.describe EmailsOnPushWorker, :mailer do
it "accepts both kind of emails" do
perform
- expect(ActionMailer::Base.deliveries.count).to eq(2)
expect(email_recipients).to contain_exactly("johndoe@example.com", "janedoe@example.com")
end
end
@@ -160,10 +177,19 @@ RSpec.describe EmailsOnPushWorker, :mailer do
it "accepts emails separated by newlines" do
perform
- expect(ActionMailer::Base.deliveries.count).to eq(2)
expect(email_recipients).to contain_exactly("johndoe@example.com", "janedoe@example.com")
end
end
+
+ context 'when the recipient addresses contains duplicates' do
+ let(:recipients) { 'non@dubplicate.com Duplic@te.com duplic@te.com Duplic@te.com duplic@Te.com' }
+
+ it 'deduplicates recipients while treating the domain part as case-insensitive' do
+ perform
+
+ expect(email_recipients).to contain_exactly('non@dubplicate.com', 'Duplic@te.com')
+ end
+ end
end
end
end
diff --git a/spec/workers/error_tracking_issue_link_worker_spec.rb b/spec/workers/error_tracking_issue_link_worker_spec.rb
index 5be568c2dad..90e747c8788 100644
--- a/spec/workers/error_tracking_issue_link_worker_spec.rb
+++ b/spec/workers/error_tracking_issue_link_worker_spec.rb
@@ -20,7 +20,7 @@ RSpec.describe ErrorTrackingIssueLinkWorker do
describe '#perform' do
it 'creates a link between an issue and a Sentry issue in Sentry' do
- expect_next_instance_of(Sentry::Client) do |client|
+ expect_next_instance_of(ErrorTracking::SentryClient) do |client|
expect(client).to receive(:repos).with('sentry-org').and_return([repo])
expect(client)
.to receive(:create_issue_link)
@@ -33,8 +33,8 @@ RSpec.describe ErrorTrackingIssueLinkWorker do
shared_examples_for 'makes no external API requests' do
it 'takes no action' do
- expect_any_instance_of(Sentry::Client).not_to receive(:repos)
- expect_any_instance_of(Sentry::Client).not_to receive(:create_issue_link)
+ expect_any_instance_of(ErrorTracking::SentryClient).not_to receive(:repos)
+ expect_any_instance_of(ErrorTracking::SentryClient).not_to receive(:create_issue_link)
expect(subject).to be nil
end
@@ -42,7 +42,7 @@ RSpec.describe ErrorTrackingIssueLinkWorker do
shared_examples_for 'attempts to create a link via plugin' do
it 'takes no action' do
- expect_next_instance_of(Sentry::Client) do |client|
+ expect_next_instance_of(ErrorTracking::SentryClient) do |client|
expect(client).to receive(:repos).with('sentry-org').and_return([repo])
expect(client)
.to receive(:create_issue_link)
@@ -98,8 +98,8 @@ RSpec.describe ErrorTrackingIssueLinkWorker do
context 'when Sentry repos request errors' do
it 'falls back to creating a link via plugin' do
- expect_next_instance_of(Sentry::Client) do |client|
- expect(client).to receive(:repos).with('sentry-org').and_raise(Sentry::Client::Error)
+ expect_next_instance_of(ErrorTracking::SentryClient) do |client|
+ expect(client).to receive(:repos).with('sentry-org').and_raise(ErrorTracking::SentryClient::Error)
expect(client)
.to receive(:create_issue_link)
.with(nil, sentry_issue.sentry_issue_identifier, issue)
diff --git a/spec/workers/expire_job_cache_worker_spec.rb b/spec/workers/expire_job_cache_worker_spec.rb
index b4f8f56563b..95c54a762a4 100644
--- a/spec/workers/expire_job_cache_worker_spec.rb
+++ b/spec/workers/expire_job_cache_worker_spec.rb
@@ -13,7 +13,6 @@ RSpec.describe ExpireJobCacheWorker do
include_examples 'an idempotent worker' do
it 'invalidates Etag caching for the job path' do
- pipeline_path = "/#{project.full_path}/-/pipelines/#{pipeline.id}.json"
job_path = "/#{project.full_path}/builds/#{job.id}.json"
spy_store = Gitlab::EtagCaching::Store.new
@@ -22,13 +21,12 @@ RSpec.describe ExpireJobCacheWorker do
expect(spy_store).to receive(:touch)
.exactly(worker_exec_times).times
- .with(pipeline_path)
+ .with(job_path)
.and_call_original
- expect(spy_store).to receive(:touch)
+ expect(ExpirePipelineCacheWorker).to receive(:perform_async)
+ .with(pipeline.id)
.exactly(worker_exec_times).times
- .with(job_path)
- .and_call_original
subject
end
diff --git a/spec/workers/expire_pipeline_cache_worker_spec.rb b/spec/workers/expire_pipeline_cache_worker_spec.rb
index fb6ee67311c..a8c21aa9f83 100644
--- a/spec/workers/expire_pipeline_cache_worker_spec.rb
+++ b/spec/workers/expire_pipeline_cache_worker_spec.rb
@@ -25,15 +25,6 @@ RSpec.describe ExpirePipelineCacheWorker do
subject.perform(617748)
end
- it "doesn't do anything if the pipeline cannot be cached" do
- allow_any_instance_of(Ci::Pipeline).to receive(:cacheable?).and_return(false)
-
- expect_any_instance_of(Ci::ExpirePipelineCacheService).not_to receive(:execute)
- expect_any_instance_of(Gitlab::EtagCaching::Store).not_to receive(:touch)
-
- subject.perform(pipeline.id)
- end
-
it_behaves_like 'an idempotent worker' do
let(:job_args) { [pipeline.id] }
end
diff --git a/spec/workers/jira_connect/sync_project_worker_spec.rb b/spec/workers/jira_connect/sync_project_worker_spec.rb
index f7fa565d534..04cc3bec3af 100644
--- a/spec/workers/jira_connect/sync_project_worker_spec.rb
+++ b/spec/workers/jira_connect/sync_project_worker_spec.rb
@@ -4,7 +4,7 @@ require 'spec_helper'
RSpec.describe JiraConnect::SyncProjectWorker, factory_default: :keep do
describe '#perform' do
- let_it_be(:project) { create_default(:project) }
+ let_it_be(:project) { create_default(:project).freeze }
let!(:mr_with_jira_title) { create(:merge_request, :unique_branches, title: 'TEST-123') }
let!(:mr_with_jira_description) { create(:merge_request, :unique_branches, description: 'TEST-323') }
let!(:mr_with_other_title) { create(:merge_request, :unique_branches) }
diff --git a/spec/workers/merge_requests/delete_source_branch_worker_spec.rb b/spec/workers/merge_requests/delete_source_branch_worker_spec.rb
new file mode 100644
index 00000000000..957adbbbd6e
--- /dev/null
+++ b/spec/workers/merge_requests/delete_source_branch_worker_spec.rb
@@ -0,0 +1,63 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe MergeRequests::DeleteSourceBranchWorker do
+ let_it_be(:merge_request) { create(:merge_request) }
+ let_it_be(:user) { create(:user) }
+
+ let(:sha) { merge_request.source_branch_sha }
+ let(:worker) { described_class.new }
+
+ describe '#perform' do
+ context 'with a non-existing merge request' do
+ it 'does nothing' do
+ expect(::Branches::DeleteService).not_to receive(:new)
+ expect(::MergeRequests::RetargetChainService).not_to receive(:new)
+
+ worker.perform(non_existing_record_id, sha, user.id)
+ end
+ end
+
+ context 'with a non-existing user' do
+ it 'does nothing' do
+ expect(::Branches::DeleteService).not_to receive(:new)
+ expect(::MergeRequests::RetargetChainService).not_to receive(:new)
+
+ worker.perform(merge_request.id, sha, non_existing_record_id)
+ end
+ end
+
+ context 'with existing user and merge request' do
+ it 'calls service to delete source branch' do
+ expect_next_instance_of(::Branches::DeleteService) do |instance|
+ expect(instance).to receive(:execute).with(merge_request.source_branch)
+ end
+
+ worker.perform(merge_request.id, sha, user.id)
+ end
+
+ it 'calls service to try retarget merge requests' do
+ expect_next_instance_of(::MergeRequests::RetargetChainService) do |instance|
+ expect(instance).to receive(:execute).with(merge_request)
+ end
+
+ worker.perform(merge_request.id, sha, user.id)
+ end
+
+ context 'source branch sha does not match' do
+ it 'does nothing' do
+ expect(::Branches::DeleteService).not_to receive(:new)
+ expect(::MergeRequests::RetargetChainService).not_to receive(:new)
+
+ worker.perform(merge_request.id, 'new-source-branch-sha', user.id)
+ end
+ end
+ end
+
+ it_behaves_like 'an idempotent worker' do
+ let(:merge_request) { create(:merge_request) }
+ let(:job_args) { [merge_request.id, sha, user.id] }
+ end
+ end
+end
diff --git a/spec/workers/merge_worker_spec.rb b/spec/workers/merge_worker_spec.rb
index 97e8aeb616e..417e6edce96 100644
--- a/spec/workers/merge_worker_spec.rb
+++ b/spec/workers/merge_worker_spec.rb
@@ -14,7 +14,7 @@ RSpec.describe MergeWorker do
source_project.repository.expire_branches_cache
end
- it 'clears cache of source repo after removing source branch' do
+ it 'clears cache of source repo after removing source branch', :sidekiq_inline do
expect(source_project.repository.branch_names).to include('markdown')
described_class.new.perform(
diff --git a/spec/workers/namespaces/in_product_marketing_emails_worker_spec.rb b/spec/workers/namespaces/in_product_marketing_emails_worker_spec.rb
index 722ecfc1dec..24143e8cf8a 100644
--- a/spec/workers/namespaces/in_product_marketing_emails_worker_spec.rb
+++ b/spec/workers/namespaces/in_product_marketing_emails_worker_spec.rb
@@ -3,25 +3,43 @@
require 'spec_helper'
RSpec.describe Namespaces::InProductMarketingEmailsWorker, '#perform' do
- context 'when the experiment is inactive' do
+ context 'when the application setting is enabled' do
before do
- stub_experiment(in_product_marketing_emails: false)
+ stub_application_setting(in_product_marketing_emails_enabled: true)
end
- it 'does not execute the in product marketing emails service' do
- expect(Namespaces::InProductMarketingEmailsService).not_to receive(:send_for_all_tracks_and_intervals)
+ context 'when the experiment is inactive' do
+ before do
+ stub_experiment(in_product_marketing_emails: false)
+ end
- subject.perform
+ it 'does not execute the in product marketing emails service' do
+ expect(Namespaces::InProductMarketingEmailsService).not_to receive(:send_for_all_tracks_and_intervals)
+
+ subject.perform
+ end
+ end
+
+ context 'when the experiment is active' do
+ before do
+ stub_experiment(in_product_marketing_emails: true)
+ end
+
+ it 'calls the send_for_all_tracks_and_intervals method on the in product marketing emails service' do
+ expect(Namespaces::InProductMarketingEmailsService).to receive(:send_for_all_tracks_and_intervals)
+
+ subject.perform
+ end
end
end
- context 'when the experiment is active' do
+ context 'when the application setting is disabled' do
before do
- stub_experiment(in_product_marketing_emails: true)
+ stub_application_setting(in_product_marketing_emails_enabled: false)
end
- it 'calls the send_for_all_tracks_and_intervals method on the in product marketing emails service' do
- expect(Namespaces::InProductMarketingEmailsService).to receive(:send_for_all_tracks_and_intervals)
+ it 'does not execute the in product marketing emails service' do
+ expect(Namespaces::InProductMarketingEmailsService).not_to receive(:send_for_all_tracks_and_intervals)
subject.perform
end
diff --git a/spec/workers/namespaces/onboarding_issue_created_worker_spec.rb b/spec/workers/namespaces/onboarding_issue_created_worker_spec.rb
new file mode 100644
index 00000000000..459e4f953d0
--- /dev/null
+++ b/spec/workers/namespaces/onboarding_issue_created_worker_spec.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Namespaces::OnboardingIssueCreatedWorker, '#perform' do
+ let_it_be(:issue) { create(:issue) }
+ let(:namespace) { issue.namespace }
+
+ it_behaves_like 'records an onboarding progress action', :issue_created do
+ subject { described_class.new.perform(namespace.id) }
+ end
+
+ it_behaves_like 'does not record an onboarding progress action' do
+ subject { described_class.new.perform(nil) }
+ end
+
+ it_behaves_like 'an idempotent worker' do
+ let(:job_args) { [namespace.id] }
+
+ it 'sets the onboarding progress action' do
+ OnboardingProgress.onboard(namespace)
+
+ subject
+
+ expect(OnboardingProgress.completed?(namespace, :issue_created)).to eq(true)
+ end
+ end
+end
diff --git a/spec/workers/namespaces/onboarding_progress_worker_spec.rb b/spec/workers/namespaces/onboarding_progress_worker_spec.rb
new file mode 100644
index 00000000000..76ac078ddcf
--- /dev/null
+++ b/spec/workers/namespaces/onboarding_progress_worker_spec.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Namespaces::OnboardingProgressWorker, '#perform' do
+ let_it_be(:namespace) { create(:namespace) }
+ let_it_be(:action) { 'git_pull' }
+
+ it_behaves_like 'records an onboarding progress action', :git_pull do
+ include_examples 'an idempotent worker' do
+ subject { described_class.new.perform(namespace.id, action) }
+ end
+ end
+
+ it_behaves_like 'does not record an onboarding progress action' do
+ subject { described_class.new.perform(namespace.id, nil) }
+ end
+
+ it_behaves_like 'does not record an onboarding progress action' do
+ subject { described_class.new.perform(nil, action) }
+ end
+end
diff --git a/spec/workers/new_issue_worker_spec.rb b/spec/workers/new_issue_worker_spec.rb
index 7cba3487603..ec129ad3380 100644
--- a/spec/workers/new_issue_worker_spec.rb
+++ b/spec/workers/new_issue_worker_spec.rb
@@ -38,21 +38,48 @@ RSpec.describe NewIssueWorker do
end
end
- context 'when everything is ok' do
- let_it_be(:user) { create_default(:user) }
+ context 'with a user' do
let_it_be(:project) { create(:project, :public) }
let_it_be(:mentioned) { create(:user) }
+ let_it_be(:user) { nil }
let_it_be(:issue) { create(:issue, project: project, description: "issue for #{mentioned.to_reference}") }
- it 'creates a new event record' do
- expect { worker.perform(issue.id, user.id) }.to change { Event.count }.from(0).to(1)
+ shared_examples 'a new issue where the current_user cannot trigger notifications' do
+ it 'does not create a notification for the mentioned user' do
+ expect(Notify).not_to receive(:new_issue_email)
+ .with(mentioned.id, issue.id, NotificationReason::MENTIONED)
+
+ expect(Gitlab::AppLogger).to receive(:warn).with(message: 'Skipping sending notifications', user: user.id, klass: issue.class, object_id: issue.id)
+
+ worker.perform(issue.id, user.id)
+ end
+ end
+
+ context 'when the new issue author is blocked' do
+ let_it_be(:user) { create_default(:user, :blocked) }
+
+ it_behaves_like 'a new issue where the current_user cannot trigger notifications'
end
- it 'creates a notification for the mentioned user' do
- expect(Notify).to receive(:new_issue_email).with(mentioned.id, issue.id, NotificationReason::MENTIONED)
- .and_return(double(deliver_later: true))
+ context 'when the new issue author is a ghost' do
+ let_it_be(:user) { create_default(:user, :ghost) }
+
+ it_behaves_like 'a new issue where the current_user cannot trigger notifications'
+ end
+
+ context 'when everything is ok' do
+ let_it_be(:user) { create_default(:user) }
+
+ it 'creates a new event record' do
+ expect { worker.perform(issue.id, user.id) }.to change { Event.count }.from(0).to(1)
+ end
+
+ it 'creates a notification for the mentioned user' do
+ expect(Notify).to receive(:new_issue_email).with(mentioned.id, issue.id, NotificationReason::MENTIONED)
+ .and_return(double(deliver_later: true))
- worker.perform(issue.id, user.id)
+ worker.perform(issue.id, user.id)
+ end
end
end
end
diff --git a/spec/workers/new_merge_request_worker_spec.rb b/spec/workers/new_merge_request_worker_spec.rb
index 310fde4c7e1..0d64973b0fa 100644
--- a/spec/workers/new_merge_request_worker_spec.rb
+++ b/spec/workers/new_merge_request_worker_spec.rb
@@ -40,24 +40,51 @@ RSpec.describe NewMergeRequestWorker do
end
end
- context 'when everything is ok' do
+ context 'with a user' do
let(:project) { create(:project, :public) }
let(:mentioned) { create(:user) }
- let(:user) { create(:user) }
+ let(:user) { nil }
let(:merge_request) do
create(:merge_request, source_project: project, description: "mr for #{mentioned.to_reference}")
end
- it 'creates a new event record' do
- expect { worker.perform(merge_request.id, user.id) }.to change { Event.count }.from(0).to(1)
+ shared_examples 'a new merge request where the author cannot trigger notifications' do
+ it 'does not create a notification for the mentioned user' do
+ expect(Notify).not_to receive(:new_merge_request_email)
+ .with(mentioned.id, merge_request.id, NotificationReason::MENTIONED)
+
+ expect(Gitlab::AppLogger).to receive(:warn).with(message: 'Skipping sending notifications', user: user.id, klass: merge_request.class, object_id: merge_request.id)
+
+ worker.perform(merge_request.id, user.id)
+ end
+ end
+
+ context 'when the merge request author is blocked' do
+ let(:user) { create(:user, :blocked) }
+
+ it_behaves_like 'a new merge request where the author cannot trigger notifications'
end
- it 'creates a notification for the mentioned user' do
- expect(Notify).to receive(:new_merge_request_email)
- .with(mentioned.id, merge_request.id, NotificationReason::MENTIONED)
- .and_return(double(deliver_later: true))
+ context 'when the merge request author is a ghost' do
+ let(:user) { create(:user, :ghost) }
+
+ it_behaves_like 'a new merge request where the author cannot trigger notifications'
+ end
+
+ context 'when everything is ok' do
+ let(:user) { create(:user) }
+
+ it 'creates a new event record' do
+ expect { worker.perform(merge_request.id, user.id) }.to change { Event.count }.from(0).to(1)
+ end
+
+ it 'creates a notification for the mentioned user' do
+ expect(Notify).to receive(:new_merge_request_email)
+ .with(mentioned.id, merge_request.id, NotificationReason::MENTIONED)
+ .and_return(double(deliver_later: true))
- worker.perform(merge_request.id, user.id)
+ worker.perform(merge_request.id, user.id)
+ end
end
end
end
diff --git a/spec/workers/packages/composer/cache_update_worker_spec.rb b/spec/workers/packages/composer/cache_update_worker_spec.rb
new file mode 100644
index 00000000000..cc6b48c80eb
--- /dev/null
+++ b/spec/workers/packages/composer/cache_update_worker_spec.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Packages::Composer::CacheUpdateWorker, type: :worker do
+ describe '#perform' do
+ let_it_be(:package_name) { 'sample-project' }
+ let_it_be(:json) { { 'name' => package_name } }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project, :custom_repo, files: { 'composer.json' => json.to_json }, group: group) }
+ let(:last_sha) { nil }
+ let!(:package) { create(:composer_package, :with_metadatum, project: project, name: package_name, version: '1.0.0', json: json) }
+ let(:job_args) { [project.id, package_name, last_sha] }
+
+ subject { described_class.new.perform(*job_args) }
+
+ before do
+ stub_composer_cache_object_storage
+ end
+
+ include_examples 'an idempotent worker' do
+ context 'creating a package' do
+ it 'updates the cache' do
+ expect { subject }.to change { Packages::Composer::CacheFile.count }.by(1)
+ end
+ end
+
+ context 'deleting a package' do
+ let!(:last_sha) do
+ Gitlab::Composer::Cache.new(project: project, name: package_name).execute
+ package.reload.composer_metadatum.version_cache_sha
+ end
+
+ before do
+ package.destroy!
+ end
+
+ it 'marks the file for deletion' do
+ expect { subject }.not_to change { Packages::Composer::CacheFile.count }
+
+ cache_file = Packages::Composer::CacheFile.last
+
+ expect(cache_file.reload.delete_at).not_to be_nil
+ end
+ end
+ end
+ end
+end
diff --git a/spec/workers/packages/maven/metadata/sync_worker_spec.rb b/spec/workers/packages/maven/metadata/sync_worker_spec.rb
new file mode 100644
index 00000000000..e3e0e598264
--- /dev/null
+++ b/spec/workers/packages/maven/metadata/sync_worker_spec.rb
@@ -0,0 +1,133 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Packages::Maven::Metadata::SyncWorker, type: :worker do
+ let_it_be(:versionless_package_for_versions) { create(:maven_package, name: 'MyDummyMavenPkg', version: nil) }
+ let_it_be(:metadata_package_file) { create(:package_file, :xml, package: versionless_package_for_versions) }
+
+ let(:versions) { %w[1.2 1.1 2.1 3.0-SNAPSHOT] }
+ let(:worker) { described_class.new }
+
+ describe '#perform' do
+ let(:user) { create(:user) }
+ let(:project) { versionless_package_for_versions.project }
+ let(:package_name) { versionless_package_for_versions.name }
+ let(:role) { :maintainer }
+ let(:most_recent_metadata_file_for_versions) { versionless_package_for_versions.package_files.recent.with_file_name(Packages::Maven::Metadata.filename).first }
+
+ before do
+ project.send("add_#{role}", user)
+ end
+
+ subject { worker.perform(user.id, project.id, package_name) }
+
+ context 'with a valid package name' do
+ before do
+ file = CarrierWaveStringFile.new_file(file_content: versions_xml_content, filename: 'maven-metadata.xml', content_type: 'application/xml')
+ metadata_package_file.update!(file: file)
+
+ versions.each do |version|
+ create(:maven_package, name: versionless_package_for_versions.name, version: version, project: versionless_package_for_versions.project)
+ end
+ end
+
+ context 'idempotent worker' do
+ include_examples 'an idempotent worker' do
+ let(:job_args) { [user.id, project.id, package_name] }
+
+ it 'creates the updated metadata files', :aggregate_failures do
+ expect { subject }.to change { ::Packages::PackageFile.count }.by(5)
+
+ most_recent_versions = versions_from(most_recent_metadata_file_for_versions.file.read)
+ expect(most_recent_versions.latest).to eq('3.0-SNAPSHOT')
+ expect(most_recent_versions.release).to eq('2.1')
+ expect(most_recent_versions.versions).to match_array(versions)
+ end
+ end
+ end
+
+ it 'logs the message from the service' do
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:message, 'New metadata package file created')
+
+ subject
+ end
+
+ context 'not in the passed project' do
+ let(:project) { create(:project) }
+
+ it 'does not create the updated metadata files' do
+ expect { subject }
+ .to change { ::Packages::PackageFile.count }.by(0)
+ .and raise_error(described_class::SyncError, 'Non existing versionless package')
+ end
+ end
+
+ context 'with a user with not enough permissions' do
+ let(:role) { :guest }
+
+ it 'does not create the updated metadata files' do
+ expect { subject }
+ .to change { ::Packages::PackageFile.count }.by(0)
+ .and raise_error(described_class::SyncError, 'Not allowed')
+ end
+ end
+ end
+
+ context 'with no package name' do
+ subject { worker.perform(user.id, project.id, nil) }
+
+ it 'does not run' do
+ expect(::Packages::Maven::Metadata::SyncService).not_to receive(:new)
+ expect { subject }.not_to change { ::Packages::PackageFile.count }
+ end
+ end
+
+ context 'with no user id' do
+ subject { worker.perform(nil, project.id, package_name) }
+
+ it 'does not run' do
+ expect(::Packages::Maven::Metadata::SyncService).not_to receive(:new)
+ expect { subject }.not_to change { ::Packages::PackageFile.count }
+ end
+ end
+
+ context 'with no project id' do
+ subject { worker.perform(user.id, nil, package_name) }
+
+ it 'does not run' do
+ expect(::Packages::Maven::Metadata::SyncService).not_to receive(:new)
+ expect { subject }.not_to change { ::Packages::PackageFile.count }
+ end
+ end
+ end
+
+ def versions_from(xml_content)
+ xml_doc = Nokogiri::XML(xml_content)
+
+ OpenStruct.new(
+ release: xml_doc.xpath('//metadata/versioning/release').first.content,
+ latest: xml_doc.xpath('//metadata/versioning/latest').first.content,
+ versions: xml_doc.xpath('//metadata/versioning/versions/version').map(&:content)
+ )
+ end
+
+ def versions_xml_content
+ Nokogiri::XML::Builder.new do |xml|
+ xml.metadata do
+ xml.groupId(versionless_package_for_versions.maven_metadatum.app_group)
+ xml.artifactId(versionless_package_for_versions.maven_metadatum.app_name)
+ xml.versioning do
+ xml.release('1.3')
+ xml.latest('1.3')
+ xml.lastUpdated('20210113130531')
+ xml.versions do
+ xml.version('1.1')
+ xml.version('1.2')
+ xml.version('1.3')
+ end
+ end
+ end
+ end.to_xml
+ end
+end
diff --git a/spec/workers/pages_update_configuration_worker_spec.rb b/spec/workers/pages_update_configuration_worker_spec.rb
index 87bbff1a28b..ff3727646c7 100644
--- a/spec/workers/pages_update_configuration_worker_spec.rb
+++ b/spec/workers/pages_update_configuration_worker_spec.rb
@@ -2,9 +2,9 @@
require "spec_helper"
RSpec.describe PagesUpdateConfigurationWorker do
- describe "#perform" do
- let_it_be(:project) { create(:project) }
+ let_it_be(:project) { create(:project) }
+ describe "#perform" do
it "does not break if the project doesn't exist" do
expect { subject.perform(-1) }.not_to raise_error
end
@@ -42,4 +42,22 @@ RSpec.describe PagesUpdateConfigurationWorker do
end
end
end
+
+ describe '#perform_async' do
+ it "calls the correct service", :sidekiq_inline do
+ expect_next_instance_of(Projects::UpdatePagesConfigurationService, project) do |service|
+ expect(service).to receive(:execute).and_return(status: :success)
+ end
+
+ described_class.perform_async(project.id)
+ end
+
+ it "doesn't schedule a worker if updates on legacy storage are disabled", :sidekiq_inline do
+ stub_feature_flags(pages_update_legacy_storage: false)
+
+ expect(Projects::UpdatePagesConfigurationService).not_to receive(:new)
+
+ described_class.perform_async(project.id)
+ end
+ end
end
diff --git a/spec/workers/personal_access_tokens/expiring_worker_spec.rb b/spec/workers/personal_access_tokens/expiring_worker_spec.rb
index c8bdf02f4d3..7fa777b911a 100644
--- a/spec/workers/personal_access_tokens/expiring_worker_spec.rb
+++ b/spec/workers/personal_access_tokens/expiring_worker_spec.rb
@@ -7,18 +7,23 @@ RSpec.describe PersonalAccessTokens::ExpiringWorker, type: :worker do
describe '#perform' do
context 'when a token needs to be notified' do
- let_it_be(:pat) { create(:personal_access_token, expires_at: 5.days.from_now) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:expiring_token) { create(:personal_access_token, user: user, expires_at: 5.days.from_now) }
+ let_it_be(:expiring_token2) { create(:personal_access_token, user: user, expires_at: 3.days.from_now) }
+ let_it_be(:notified_token) { create(:personal_access_token, user: user, expires_at: 5.days.from_now, expire_notification_delivered: true) }
+ let_it_be(:not_expiring_token) { create(:personal_access_token, user: user, expires_at: 1.month.from_now) }
+ let_it_be(:impersonation_token) { create(:personal_access_token, user: user, expires_at: 5.days.from_now, impersonation: true) }
it 'uses notification service to send the email' do
expect_next_instance_of(NotificationService) do |notification_service|
- expect(notification_service).to receive(:access_token_about_to_expire).with(pat.user)
+ expect(notification_service).to receive(:access_token_about_to_expire).with(user, match_array([expiring_token.name, expiring_token2.name]))
end
worker.perform
end
it 'marks the notification as delivered' do
- expect { worker.perform }.to change { pat.reload.expire_notification_delivered }.from(false).to(true)
+ expect { worker.perform }.to change { expiring_token.reload.expire_notification_delivered }.from(false).to(true)
end
end
@@ -27,7 +32,7 @@ RSpec.describe PersonalAccessTokens::ExpiringWorker, type: :worker do
it "doesn't use notification service to send the email" do
expect_next_instance_of(NotificationService) do |notification_service|
- expect(notification_service).not_to receive(:access_token_about_to_expire).with(pat.user)
+ expect(notification_service).not_to receive(:access_token_about_to_expire).with(pat.user, [pat.name])
end
worker.perform
@@ -43,7 +48,7 @@ RSpec.describe PersonalAccessTokens::ExpiringWorker, type: :worker do
it "doesn't use notification service to send the email" do
expect_next_instance_of(NotificationService) do |notification_service|
- expect(notification_service).not_to receive(:access_token_about_to_expire).with(pat.user)
+ expect(notification_service).not_to receive(:access_token_about_to_expire).with(pat.user, [pat.name])
end
worker.perform
diff --git a/spec/workers/post_receive_spec.rb b/spec/workers/post_receive_spec.rb
index aaae0988602..be501318920 100644
--- a/spec/workers/post_receive_spec.rb
+++ b/spec/workers/post_receive_spec.rb
@@ -93,6 +93,29 @@ RSpec.describe PostReceive do
perform
end
+
+ it 'tracks an event for the empty_repo_upload experiment', :snowplow do
+ allow_next_instance_of(ApplicationExperiment) do |e|
+ allow(e).to receive(:should_track?).and_return(true)
+ allow(e).to receive(:track_initial_writes)
+ end
+
+ perform
+
+ expect_snowplow_event(category: 'empty_repo_upload', action: 'initial_write', context: [{ schema: 'iglu:com.gitlab/gitlab_experiment/jsonschema/0-3-0', data: anything }])
+ end
+
+ it 'does not track an event for the empty_repo_upload experiment when project is not empty', :snowplow do
+ allow(empty_project).to receive(:empty_repo?).and_return(false)
+ allow_next_instance_of(ApplicationExperiment) do |e|
+ allow(e).to receive(:should_track?).and_return(true)
+ allow(e).to receive(:track_initial_writes)
+ end
+
+ perform
+
+ expect_no_snowplow_event
+ end
end
shared_examples 'not updating remote mirrors' do
@@ -159,7 +182,7 @@ RSpec.describe PostReceive do
end
it 'expires the status cache' do
- expect(project.repository).to receive(:empty?).and_return(true)
+ expect(project.repository).to receive(:empty?).at_least(:once).and_return(true)
expect(project.repository).to receive(:expire_status_cache)
perform
diff --git a/spec/workers/project_schedule_bulk_repository_shard_moves_worker_spec.rb b/spec/workers/project_schedule_bulk_repository_shard_moves_worker_spec.rb
index fb762593d75..f284e1ab8c6 100644
--- a/spec/workers/project_schedule_bulk_repository_shard_moves_worker_spec.rb
+++ b/spec/workers/project_schedule_bulk_repository_shard_moves_worker_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe ProjectScheduleBulkRepositoryShardMovesWorker do
it_behaves_like 'schedules bulk repository shard moves' do
let_it_be_with_reload(:container) { create(:project, :repository).tap { |project| project.track_project_repository } }
- let(:move_service_klass) { ProjectRepositoryStorageMove }
- let(:worker_klass) { ProjectUpdateRepositoryStorageWorker }
+ let(:move_service_klass) { Projects::RepositoryStorageMove }
+ let(:worker_klass) { Projects::UpdateRepositoryStorageWorker }
end
end
diff --git a/spec/workers/project_update_repository_storage_worker_spec.rb b/spec/workers/project_update_repository_storage_worker_spec.rb
index 490f1f5a2ad..6924e8a93a3 100644
--- a/spec/workers/project_update_repository_storage_worker_spec.rb
+++ b/spec/workers/project_update_repository_storage_worker_spec.rb
@@ -10,6 +10,6 @@ RSpec.describe ProjectUpdateRepositoryStorageWorker do
let_it_be(:repository_storage_move) { create(:project_repository_storage_move) }
let(:service_klass) { Projects::UpdateRepositoryStorageService }
- let(:repository_storage_move_klass) { ProjectRepositoryStorageMove }
+ let(:repository_storage_move_klass) { Projects::RepositoryStorageMove }
end
end
diff --git a/spec/workers/projects/schedule_bulk_repository_shard_moves_worker_spec.rb b/spec/workers/projects/schedule_bulk_repository_shard_moves_worker_spec.rb
new file mode 100644
index 00000000000..24957a35b72
--- /dev/null
+++ b/spec/workers/projects/schedule_bulk_repository_shard_moves_worker_spec.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::ScheduleBulkRepositoryShardMovesWorker do
+ it_behaves_like 'schedules bulk repository shard moves' do
+ let_it_be_with_reload(:container) { create(:project, :repository).tap { |project| project.track_project_repository } }
+
+ let(:move_service_klass) { Projects::RepositoryStorageMove }
+ let(:worker_klass) { Projects::UpdateRepositoryStorageWorker }
+ end
+end
diff --git a/spec/workers/projects/update_repository_storage_worker_spec.rb b/spec/workers/projects/update_repository_storage_worker_spec.rb
new file mode 100644
index 00000000000..7570d706325
--- /dev/null
+++ b/spec/workers/projects/update_repository_storage_worker_spec.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::UpdateRepositoryStorageWorker do
+ subject { described_class.new }
+
+ it_behaves_like 'an update storage move worker' do
+ let_it_be_with_refind(:container) { create(:project, :repository) }
+ let_it_be(:repository_storage_move) { create(:project_repository_storage_move) }
+
+ let(:service_klass) { Projects::UpdateRepositoryStorageService }
+ let(:repository_storage_move_klass) { Projects::RepositoryStorageMove }
+ end
+end
diff --git a/spec/workers/purge_dependency_proxy_cache_worker_spec.rb b/spec/workers/purge_dependency_proxy_cache_worker_spec.rb
index 8379b11af8f..53f8d1bf5ba 100644
--- a/spec/workers/purge_dependency_proxy_cache_worker_spec.rb
+++ b/spec/workers/purge_dependency_proxy_cache_worker_spec.rb
@@ -26,19 +26,25 @@ RSpec.describe PurgeDependencyProxyCacheWorker do
end
context 'an admin user' do
- include_examples 'an idempotent worker' do
- let(:job_args) { [user.id, group_id] }
+ context 'when admin mode is enabled', :enable_admin_mode do
+ include_examples 'an idempotent worker' do
+ let(:job_args) { [user.id, group_id] }
- it 'deletes the blobs and returns ok', :aggregate_failures do
- expect(group.dependency_proxy_blobs.size).to eq(1)
- expect(group.dependency_proxy_manifests.size).to eq(1)
+ it 'deletes the blobs and returns ok', :aggregate_failures do
+ expect(group.dependency_proxy_blobs.size).to eq(1)
+ expect(group.dependency_proxy_manifests.size).to eq(1)
- subject
+ subject
- expect(group.dependency_proxy_blobs.size).to eq(0)
- expect(group.dependency_proxy_manifests.size).to eq(0)
+ expect(group.dependency_proxy_blobs.size).to eq(0)
+ expect(group.dependency_proxy_manifests.size).to eq(0)
+ end
end
end
+
+ context 'when admin mode is disabled' do
+ it_behaves_like 'returns nil'
+ end
end
context 'a non-admin user' do
diff --git a/spec/workers/snippet_schedule_bulk_repository_shard_moves_worker_spec.rb b/spec/workers/snippet_schedule_bulk_repository_shard_moves_worker_spec.rb
index 3a09b6ce449..a5f1c6b7b3d 100644
--- a/spec/workers/snippet_schedule_bulk_repository_shard_moves_worker_spec.rb
+++ b/spec/workers/snippet_schedule_bulk_repository_shard_moves_worker_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe SnippetScheduleBulkRepositoryShardMovesWorker do
it_behaves_like 'schedules bulk repository shard moves' do
let_it_be_with_reload(:container) { create(:snippet, :repository).tap { |snippet| snippet.create_repository } }
- let(:move_service_klass) { SnippetRepositoryStorageMove }
- let(:worker_klass) { SnippetUpdateRepositoryStorageWorker }
+ let(:move_service_klass) { Snippets::RepositoryStorageMove }
+ let(:worker_klass) { Snippets::UpdateRepositoryStorageWorker }
end
end
diff --git a/spec/workers/snippet_update_repository_storage_worker_spec.rb b/spec/workers/snippet_update_repository_storage_worker_spec.rb
index a48abe4abf7..205cb2e432f 100644
--- a/spec/workers/snippet_update_repository_storage_worker_spec.rb
+++ b/spec/workers/snippet_update_repository_storage_worker_spec.rb
@@ -10,6 +10,6 @@ RSpec.describe SnippetUpdateRepositoryStorageWorker do
let_it_be(:repository_storage_move) { create(:snippet_repository_storage_move) }
let(:service_klass) { Snippets::UpdateRepositoryStorageService }
- let(:repository_storage_move_klass) { SnippetRepositoryStorageMove }
+ let(:repository_storage_move_klass) { Snippets::RepositoryStorageMove }
end
end
diff --git a/spec/workers/snippets/schedule_bulk_repository_shard_moves_worker_spec.rb b/spec/workers/snippets/schedule_bulk_repository_shard_moves_worker_spec.rb
new file mode 100644
index 00000000000..be7d8ebe2d3
--- /dev/null
+++ b/spec/workers/snippets/schedule_bulk_repository_shard_moves_worker_spec.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Snippets::ScheduleBulkRepositoryShardMovesWorker do
+ it_behaves_like 'schedules bulk repository shard moves' do
+ let_it_be_with_reload(:container) { create(:snippet, :repository).tap { |snippet| snippet.create_repository } }
+
+ let(:move_service_klass) { Snippets::RepositoryStorageMove }
+ let(:worker_klass) { Snippets::UpdateRepositoryStorageWorker }
+ end
+end
diff --git a/spec/workers/snippets/update_repository_storage_worker_spec.rb b/spec/workers/snippets/update_repository_storage_worker_spec.rb
new file mode 100644
index 00000000000..38e9012e9c5
--- /dev/null
+++ b/spec/workers/snippets/update_repository_storage_worker_spec.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Snippets::UpdateRepositoryStorageWorker do
+ subject { described_class.new }
+
+ it_behaves_like 'an update storage move worker' do
+ let_it_be_with_refind(:container) { create(:snippet, :repository) }
+ let_it_be(:repository_storage_move) { create(:snippet_repository_storage_move) }
+
+ let(:service_klass) { Snippets::UpdateRepositoryStorageService }
+ let(:repository_storage_move_klass) { Snippets::RepositoryStorageMove }
+ end
+end
diff --git a/tests.yml b/tests.yml
index d24cc44a403..15b1814df3a 100644
--- a/tests.yml
+++ b/tests.yml
@@ -52,3 +52,7 @@ mapping:
# EE/FOSS factory should map to factories spec
- source: (ee/)?spec/factories/.+\.rb
test: spec/factories_spec.rb
+
+ # Whats New should map to its respective spec
+ - source: data/whats_new/\w*.yml
+ test: spec/lib/release_highlights/validator_spec.rb
diff --git a/tooling/danger/changelog.rb b/tooling/danger/changelog.rb
index f7f505f51a6..86184b38459 100644
--- a/tooling/danger/changelog.rb
+++ b/tooling/danger/changelog.rb
@@ -30,25 +30,35 @@ module Tooling
If this merge request [doesn't need a CHANGELOG entry](https://docs.gitlab.com/ee/development/changelog.html#what-warrants-a-changelog-entry), feel free to ignore this message.
MSG
+ REQUIRED_CHANGELOG_REASONS = {
+ db_changes: 'introduces a database migration',
+ feature_flag_removed: 'removes a feature flag'
+ }.freeze
REQUIRED_CHANGELOG_MESSAGE = <<~MSG
To create a changelog entry, run the following:
#{CREATE_CHANGELOG_COMMAND}
- This merge request requires a changelog entry because it [introduces a database migration](https://docs.gitlab.com/ee/development/changelog.html#what-warrants-a-changelog-entry).
+ This merge request requires a changelog entry because it [%<reason>s](https://docs.gitlab.com/ee/development/changelog.html#what-warrants-a-changelog-entry).
MSG
+ def required_reasons
+ [].tap do |reasons|
+ reasons << :db_changes if helper.changes.added.has_category?(:migration)
+ reasons << :feature_flag_removed if helper.changes.deleted.has_category?(:feature_flag)
+ end
+ end
+
def required?
- git.added_files.any? { |path| path =~ %r{\Adb/(migrate|post_migrate)/} }
+ required_reasons.any?
end
- alias_method :db_changes?, :required?
def optional?
categories_need_changelog? && without_no_changelog_label?
end
def found
- @found ||= git.added_files.find { |path| path =~ %r{\A(ee/)?(changelogs/unreleased)(-ee)?/} }
+ @found ||= helper.changes.added.by_category(:changelog).files.first
end
def ee_changelog?
@@ -57,35 +67,34 @@ module Tooling
def modified_text
CHANGELOG_MODIFIED_URL_TEXT +
- format(OPTIONAL_CHANGELOG_MESSAGE, mr_iid: mr_iid, mr_title: sanitized_mr_title)
+ format(OPTIONAL_CHANGELOG_MESSAGE, mr_iid: helper.mr_iid, mr_title: sanitized_mr_title)
end
- def required_text
- CHANGELOG_MISSING_URL_TEXT +
- format(REQUIRED_CHANGELOG_MESSAGE, mr_iid: mr_iid, mr_title: sanitized_mr_title)
+ def required_texts
+ required_reasons.each_with_object({}) do |required_reason, memo|
+ memo[required_reason] =
+ CHANGELOG_MISSING_URL_TEXT +
+ format(REQUIRED_CHANGELOG_MESSAGE, reason: REQUIRED_CHANGELOG_REASONS.fetch(required_reason), mr_iid: helper.mr_iid, mr_title: sanitized_mr_title)
+ end
end
def optional_text
CHANGELOG_MISSING_URL_TEXT +
- format(OPTIONAL_CHANGELOG_MESSAGE, mr_iid: mr_iid, mr_title: sanitized_mr_title)
+ format(OPTIONAL_CHANGELOG_MESSAGE, mr_iid: helper.mr_iid, mr_title: sanitized_mr_title)
end
private
- def mr_iid
- gitlab.mr_json["iid"]
- end
-
def sanitized_mr_title
- TitleLinting.sanitize_mr_title(gitlab.mr_json["title"])
+ TitleLinting.sanitize_mr_title(helper.mr_title)
end
def categories_need_changelog?
- (helper.changes_by_category.keys - NO_CHANGELOG_CATEGORIES).any?
+ (helper.changes.categories - NO_CHANGELOG_CATEGORIES).any?
end
def without_no_changelog_label?
- (gitlab.mr_labels & NO_CHANGELOG_LABELS).empty?
+ (helper.mr_labels & NO_CHANGELOG_LABELS).empty?
end
end
end
diff --git a/tooling/danger/helper.rb b/tooling/danger/helper.rb
index 60026ee9c70..ef5b2e16bb0 100644
--- a/tooling/danger/helper.rb
+++ b/tooling/danger/helper.rb
@@ -1,5 +1,7 @@
# frozen_string_literal: true
+require 'delegate'
+
require_relative 'teammate'
require_relative 'title_linting'
@@ -86,13 +88,84 @@ module Tooling
end
end
- # @return [Hash<String,Array<String>>]
+ Change = Struct.new(:file, :change_type, :category)
+
+ class Changes < ::SimpleDelegator
+ def added
+ select_by_change_type(:added)
+ end
+
+ def modified
+ select_by_change_type(:modified)
+ end
+
+ def deleted
+ select_by_change_type(:deleted)
+ end
+
+ def renamed_before
+ select_by_change_type(:renamed_before)
+ end
+
+ def renamed_after
+ select_by_change_type(:renamed_after)
+ end
+
+ def has_category?(category)
+ any? { |change| change.category == category }
+ end
+
+ def by_category(category)
+ Changes.new(select { |change| change.category == category })
+ end
+
+ def categories
+ map(&:category).uniq
+ end
+
+ def files
+ map(&:file)
+ end
+
+ private
+
+ def select_by_change_type(change_type)
+ Changes.new(select { |change| change.change_type == change_type })
+ end
+ end
+
+ # @return [Hash<Symbol,Array<String>>]
def changes_by_category
all_changed_files.each_with_object(Hash.new { |h, k| h[k] = [] }) do |file, hash|
categories_for_file(file).each { |category| hash[category] << file }
end
end
+ # @return [Changes]
+ def changes
+ Changes.new([]).tap do |changes|
+ git.added_files.each do |file|
+ categories_for_file(file).each { |category| changes << Change.new(file, :added, category) }
+ end
+
+ git.modified_files.each do |file|
+ categories_for_file(file).each { |category| changes << Change.new(file, :modified, category) }
+ end
+
+ git.deleted_files.each do |file|
+ categories_for_file(file).each { |category| changes << Change.new(file, :deleted, category) }
+ end
+
+ git.renamed_files.map { |x| x[:before] }.each do |file|
+ categories_for_file(file).each { |category| changes << Change.new(file, :renamed_before, category) }
+ end
+
+ git.renamed_files.map { |x| x[:after] }.each do |file|
+ categories_for_file(file).each { |category| changes << Change.new(file, :renamed_after, category) }
+ end
+ end
+ end
+
# Determines the categories a file is in, e.g., `[:frontend]`, `[:backend]`, or `%i[frontend engineering_productivity]`
# using filename regex and specific change regex if given.
#
@@ -130,8 +203,13 @@ module Tooling
CATEGORIES = {
[%r{usage_data\.rb}, %r{^(\+|-).*\s+(count|distinct_count|estimate_batch_distinct_count)\(.*\)(.*)$}] => [:database, :backend],
+ %r{\A(ee/)?config/feature_flags/} => :feature_flag,
+
+ %r{\A(ee/)?(changelogs/unreleased)(-ee)?/} => :changelog,
+
%r{\Adoc/.*(\.(md|png|gif|jpg))\z} => :docs,
%r{\A(CONTRIBUTING|LICENSE|MAINTENANCE|PHILOSOPHY|PROCESS|README)(\.md)?\z} => :docs,
+ %r{\Adata/whats_new/} => :docs,
%r{\A(ee/)?app/(assets|views)/} => :frontend,
%r{\A(ee/)?public/} => :frontend,
@@ -145,7 +223,6 @@ module Tooling
\.nvmrc |
\.prettierignore |
\.prettierrc |
- \.scss-lint.yml |
\.stylelintrc |
\.haml-lint.yml |
\.haml-lint_todo.yml |
@@ -160,6 +237,7 @@ module Tooling
\.gitlab/ci/frontend\.gitlab-ci\.yml
)\z}x => %i[frontend engineering_productivity],
+ %r{\A(ee/)?db/(geo/)?(migrate|post_migrate)/} => [:database, :migration],
%r{\A(ee/)?db/(?!fixtures)[^/]+} => :database,
%r{\A(ee/)?lib/gitlab/(database|background_migration|sql|github_import)(/|\.rb)} => :database,
%r{\A(app/models/project_authorization|app/services/users/refresh_authorized_projects_service)(/|\.rb)} => :database,
@@ -215,6 +293,12 @@ module Tooling
usernames.map { |u| Tooling::Danger::Teammate.new('username' => u) }
end
+ def mr_iid
+ return '' unless gitlab_helper
+
+ gitlab_helper.mr_json['iid']
+ end
+
def mr_title
return '' unless gitlab_helper
@@ -227,6 +311,12 @@ module Tooling
gitlab_helper.mr_json['web_url']
end
+ def mr_labels
+ return [] unless gitlab_helper
+
+ gitlab_helper.mr_labels
+ end
+
def mr_target_branch
return '' unless gitlab_helper
@@ -258,10 +348,9 @@ module Tooling
end
def mr_has_labels?(*labels)
- return false unless gitlab_helper
-
labels = labels.flatten.uniq
- (labels & gitlab_helper.mr_labels) == labels
+
+ (labels & mr_labels) == labels
end
def labels_list(labels, sep: ', ')
diff --git a/tooling/overcommit/Gemfile b/tooling/overcommit/Gemfile
index 6d2c5bce29a..26dad738bab 100644
--- a/tooling/overcommit/Gemfile
+++ b/tooling/overcommit/Gemfile
@@ -5,5 +5,4 @@ source 'https://rubygems.org'
gem 'overcommit'
gem 'gitlab-styles', '~> 5.4.0', require: false
-gem 'scss_lint', '~> 0.56.0', require: false
gem 'haml_lint', '~> 0.34.0', require: false
diff --git a/tooling/overcommit/Gemfile.lock b/tooling/overcommit/Gemfile.lock
index f1d701b3e4b..13c611439b6 100644
--- a/tooling/overcommit/Gemfile.lock
+++ b/tooling/overcommit/Gemfile.lock
@@ -10,7 +10,6 @@ GEM
ast (2.4.1)
childprocess (3.0.0)
concurrent-ruby (1.1.7)
- ffi (1.12.2)
gitlab-styles (5.4.0)
rubocop (~> 0.89.1)
rubocop-gitlab-security (~> 0.1.0)
@@ -37,10 +36,6 @@ GEM
ast (~> 2.4.1)
rack (2.2.3)
rainbow (3.0.0)
- rake (12.3.3)
- rb-fsevent (0.10.2)
- rb-inotify (0.9.10)
- ffi (>= 0.5.0, < 2)
regexp_parser (1.8.2)
rexml (3.2.4)
rubocop (0.89.1)
@@ -67,14 +62,6 @@ GEM
rubocop (~> 0.87)
rubocop-ast (>= 0.7.1)
ruby-progressbar (1.10.1)
- sass (3.5.5)
- sass-listen (~> 4.0.0)
- sass-listen (4.0.0)
- rb-fsevent (~> 0.9, >= 0.9.4)
- rb-inotify (~> 0.9, >= 0.9.7)
- scss_lint (0.56.0)
- rake (>= 0.9, < 13)
- sass (~> 3.5.3)
sysexits (1.2.0)
temple (0.8.2)
thread_safe (0.3.6)
@@ -91,7 +78,6 @@ DEPENDENCIES
gitlab-styles (~> 5.4.0)
haml_lint (~> 0.34.0)
overcommit
- scss_lint (~> 0.56.0)
BUNDLED WITH
2.1.4
diff --git a/tooling/rspec_flaky/config.rb b/tooling/rspec_flaky/config.rb
new file mode 100644
index 00000000000..ea18a601c11
--- /dev/null
+++ b/tooling/rspec_flaky/config.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+module RspecFlaky
+ class Config
+ def self.generate_report?
+ !!(ENV['FLAKY_RSPEC_GENERATE_REPORT'] =~ /1|true/)
+ end
+
+ def self.suite_flaky_examples_report_path
+ ENV['SUITE_FLAKY_RSPEC_REPORT_PATH'] || rails_path("rspec_flaky/suite-report.json")
+ end
+
+ def self.flaky_examples_report_path
+ ENV['FLAKY_RSPEC_REPORT_PATH'] || rails_path("rspec_flaky/report.json")
+ end
+
+ def self.new_flaky_examples_report_path
+ ENV['NEW_FLAKY_RSPEC_REPORT_PATH'] || rails_path("rspec_flaky/new-report.json")
+ end
+
+ def self.rails_path(path)
+ return path unless defined?(Rails)
+
+ Rails.root.join(path)
+ end
+ end
+end
diff --git a/tooling/rspec_flaky/example.rb b/tooling/rspec_flaky/example.rb
new file mode 100644
index 00000000000..18f8c5acc1c
--- /dev/null
+++ b/tooling/rspec_flaky/example.rb
@@ -0,0 +1,53 @@
+# frozen_string_literal: true
+
+require 'forwardable'
+require 'digest'
+
+module RspecFlaky
+ # This is a wrapper class for RSpec::Core::Example
+ class Example
+ extend Forwardable
+
+ def_delegators :execution_result, :status, :exception
+
+ def initialize(rspec_example)
+ @rspec_example = rspec_example.respond_to?(:example) ? rspec_example.example : rspec_example
+ end
+
+ def uid
+ @uid ||= Digest::MD5.hexdigest("#{description}-#{file}")
+ end
+
+ def example_id
+ rspec_example.id
+ end
+
+ def file
+ metadata[:file_path]
+ end
+
+ def line
+ metadata[:line_number]
+ end
+
+ def description
+ metadata[:full_description]
+ end
+
+ def attempts
+ rspec_example.respond_to?(:attempts) ? rspec_example.attempts : 1
+ end
+
+ private
+
+ attr_reader :rspec_example
+
+ def metadata
+ rspec_example.metadata
+ end
+
+ def execution_result
+ rspec_example.execution_result
+ end
+ end
+end
diff --git a/tooling/rspec_flaky/flaky_example.rb b/tooling/rspec_flaky/flaky_example.rb
new file mode 100644
index 00000000000..4f3688dbeed
--- /dev/null
+++ b/tooling/rspec_flaky/flaky_example.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+require 'ostruct'
+
+module RspecFlaky
+ # This represents a flaky RSpec example and is mainly meant to be saved in a JSON file
+ class FlakyExample < OpenStruct
+ def initialize(example)
+ if example.respond_to?(:example_id)
+ super(
+ example_id: example.example_id,
+ file: example.file,
+ line: example.line,
+ description: example.description,
+ last_attempts_count: example.attempts,
+ flaky_reports: 0)
+ else
+ super
+ end
+ end
+
+ def update_flakiness!(last_attempts_count: nil)
+ self.first_flaky_at ||= Time.now
+ self.last_flaky_at = Time.now
+ self.flaky_reports += 1
+ self.last_attempts_count = last_attempts_count if last_attempts_count
+
+ if ENV['CI_PROJECT_URL'] && ENV['CI_JOB_ID']
+ self.last_flaky_job = "#{ENV['CI_PROJECT_URL']}/-/jobs/#{ENV['CI_JOB_ID']}"
+ end
+ end
+
+ def to_h
+ super.merge(
+ first_flaky_at: first_flaky_at,
+ last_flaky_at: last_flaky_at,
+ last_flaky_job: last_flaky_job)
+ end
+ end
+end
diff --git a/lib/rspec_flaky/flaky_examples_collection.rb b/tooling/rspec_flaky/flaky_examples_collection.rb
index acbfb411873..acbfb411873 100644
--- a/lib/rspec_flaky/flaky_examples_collection.rb
+++ b/tooling/rspec_flaky/flaky_examples_collection.rb
diff --git a/tooling/rspec_flaky/listener.rb b/tooling/rspec_flaky/listener.rb
new file mode 100644
index 00000000000..a5c68d830db
--- /dev/null
+++ b/tooling/rspec_flaky/listener.rb
@@ -0,0 +1,67 @@
+# frozen_string_literal: true
+
+require 'json'
+
+require_relative 'config'
+require_relative 'example'
+require_relative 'flaky_example'
+require_relative 'flaky_examples_collection'
+require_relative 'report'
+
+module RspecFlaky
+ class Listener
+ # - suite_flaky_examples: contains all the currently tracked flacky example
+ # for the whole RSpec suite
+ # - flaky_examples: contains the examples detected as flaky during the
+ # current RSpec run
+ attr_reader :suite_flaky_examples, :flaky_examples
+
+ def initialize(suite_flaky_examples_json = nil)
+ @flaky_examples = RspecFlaky::FlakyExamplesCollection.new
+ @suite_flaky_examples = init_suite_flaky_examples(suite_flaky_examples_json)
+ end
+
+ def example_passed(notification)
+ current_example = RspecFlaky::Example.new(notification.example)
+
+ return unless current_example.attempts > 1
+
+ flaky_example = suite_flaky_examples.fetch(current_example.uid) { RspecFlaky::FlakyExample.new(current_example) }
+ flaky_example.update_flakiness!(last_attempts_count: current_example.attempts)
+
+ flaky_examples[current_example.uid] = flaky_example
+ end
+
+ def dump_summary(_)
+ RspecFlaky::Report.new(flaky_examples).write(RspecFlaky::Config.flaky_examples_report_path)
+ # write_report_file(flaky_examples, RspecFlaky::Config.flaky_examples_report_path)
+
+ new_flaky_examples = flaky_examples - suite_flaky_examples
+ if new_flaky_examples.any?
+ rails_logger_warn("\nNew flaky examples detected:\n")
+ rails_logger_warn(JSON.pretty_generate(new_flaky_examples.to_h)) # rubocop:disable Gitlab/Json
+
+ RspecFlaky::Report.new(new_flaky_examples).write(RspecFlaky::Config.new_flaky_examples_report_path)
+ # write_report_file(new_flaky_examples, RspecFlaky::Config.new_flaky_examples_report_path)
+ end
+ end
+
+ private
+
+ def init_suite_flaky_examples(suite_flaky_examples_json = nil)
+ if suite_flaky_examples_json
+ RspecFlaky::Report.load_json(suite_flaky_examples_json).flaky_examples
+ else
+ return {} unless File.exist?(RspecFlaky::Config.suite_flaky_examples_report_path)
+
+ RspecFlaky::Report.load(RspecFlaky::Config.suite_flaky_examples_report_path).flaky_examples
+ end
+ end
+
+ def rails_logger_warn(text)
+ target = defined?(Rails) ? Rails.logger : Kernel
+
+ target.warn(text)
+ end
+ end
+end
diff --git a/tooling/rspec_flaky/report.rb b/tooling/rspec_flaky/report.rb
new file mode 100644
index 00000000000..3acfe7d2125
--- /dev/null
+++ b/tooling/rspec_flaky/report.rb
@@ -0,0 +1,56 @@
+# frozen_string_literal: true
+
+require 'json'
+require 'time'
+
+require_relative 'config'
+require_relative 'flaky_examples_collection'
+
+module RspecFlaky
+ # This class is responsible for loading/saving JSON reports, and pruning
+ # outdated examples.
+ class Report < SimpleDelegator
+ OUTDATED_DAYS_THRESHOLD = 7
+
+ attr_reader :flaky_examples
+
+ def self.load(file_path)
+ load_json(File.read(file_path))
+ end
+
+ def self.load_json(json)
+ new(RspecFlaky::FlakyExamplesCollection.new(JSON.parse(json)))
+ end
+
+ def initialize(flaky_examples)
+ unless flaky_examples.is_a?(RspecFlaky::FlakyExamplesCollection)
+ raise ArgumentError, "`flaky_examples` must be a RspecFlaky::FlakyExamplesCollection, #{flaky_examples.class} given!"
+ end
+
+ @flaky_examples = flaky_examples
+ super(flaky_examples)
+ end
+
+ def write(file_path)
+ unless RspecFlaky::Config.generate_report?
+ Kernel.warn "! Generating reports is disabled. To enable it, please set the `FLAKY_RSPEC_GENERATE_REPORT=1` !"
+ return
+ end
+
+ report_path_dir = File.dirname(file_path)
+ FileUtils.mkdir_p(report_path_dir) unless Dir.exist?(report_path_dir)
+
+ File.write(file_path, JSON.pretty_generate(flaky_examples.to_h))
+ end
+
+ def prune_outdated(days: OUTDATED_DAYS_THRESHOLD)
+ outdated_date_threshold = Time.now - (3600 * 24 * days)
+ updated_hash = flaky_examples.dup
+ .delete_if do |uid, hash|
+ hash[:last_flaky_at] && Time.parse(hash[:last_flaky_at]).to_i < outdated_date_threshold.to_i
+ end
+
+ self.class.new(RspecFlaky::FlakyExamplesCollection.new(updated_hash))
+ end
+ end
+end
diff --git a/vendor/aws/cloudformation/eks_cluster.yaml b/vendor/aws/cloudformation/eks_cluster.yaml
index c3f9c73cd1f..5ad25dcd533 100644
--- a/vendor/aws/cloudformation/eks_cluster.yaml
+++ b/vendor/aws/cloudformation/eks_cluster.yaml
@@ -7,12 +7,13 @@ Parameters:
KubernetesVersion:
Description: The Kubernetes version to install
Type: String
- Default: 1.16
+ Default: 1.19
AllowedValues:
- - 1.14
- 1.15
- 1.16
- 1.17
+ - 1.18
+ - 1.19
KeyName:
Description: The EC2 Key Pair to allow SSH access to the node instances
@@ -20,7 +21,7 @@ Parameters:
NodeImageIdSSMParam:
Type: "AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>"
- Default: /aws/service/eks/optimized-ami/1.14/amazon-linux-2/recommended/image_id
+ Default: /aws/service/eks/optimized-ami/1.15/amazon-linux-2/recommended/image_id
Description: AWS Systems Manager Parameter Store parameter of the AMI ID for the worker node instances.
NodeInstanceType:
diff --git a/vendor/gitignore/C++.gitignore b/vendor/gitignore/C++.gitignore
index 259148fa18f..259148fa18f 100755..100644
--- a/vendor/gitignore/C++.gitignore
+++ b/vendor/gitignore/C++.gitignore
diff --git a/vendor/gitignore/Java.gitignore b/vendor/gitignore/Java.gitignore
index a1c2a238a96..a1c2a238a96 100755..100644
--- a/vendor/gitignore/Java.gitignore
+++ b/vendor/gitignore/Java.gitignore
diff --git a/vendor/project_templates/dotnetcore.tar.gz b/vendor/project_templates/dotnetcore.tar.gz
index 402153aa88d..7e4406dbb23 100644
--- a/vendor/project_templates/dotnetcore.tar.gz
+++ b/vendor/project_templates/dotnetcore.tar.gz
Binary files differ
diff --git a/vendor/project_templates/express.tar.gz b/vendor/project_templates/express.tar.gz
index f9a52fde41b..bd746dbfb5b 100644
--- a/vendor/project_templates/express.tar.gz
+++ b/vendor/project_templates/express.tar.gz
Binary files differ
diff --git a/vendor/project_templates/learn_gitlab_gold_trial.tar.gz b/vendor/project_templates/learn_gitlab_ultimate_trial.tar.gz
index 2ec47956706..2ec47956706 100644
--- a/vendor/project_templates/learn_gitlab_gold_trial.tar.gz
+++ b/vendor/project_templates/learn_gitlab_ultimate_trial.tar.gz
Binary files differ
diff --git a/workhorse/CHANGELOG b/workhorse/CHANGELOG
index 0d29061ccaf..b742affae07 100644
--- a/workhorse/CHANGELOG
+++ b/workhorse/CHANGELOG
@@ -1,17 +1,21 @@
# Changelog for gitlab-workhorse
-## v8.63.2
+## v8.65.0
-### Security
-- Stop logging when path is excluded
- https://gitlab.com/gitlab-org/gitlab-workhorse/-/merge_requests/
-
-## v8.63.1
+### Fixed
+- Fix long polling to default to 50 s instead of 50 ns
+ https://gitlab.com/gitlab-org/gitlab-workhorse/-/merge_requests/687
### Security
- Use URL.EscapePath() in upstream router
https://gitlab.com/gitlab-org/gitlab-workhorse/-/merge_requests/
+## v8.64.0
+
+### Other
+- Revert "Migrate to labkit error tracking"
+ https://gitlab.com/gitlab-org/gitlab-workhorse/-/merge_requests/685
+
## v8.63.0
### Added
diff --git a/workhorse/PROCESS.md b/workhorse/PROCESS.md
index 797de59d47e..cf29b23b2c0 100644
--- a/workhorse/PROCESS.md
+++ b/workhorse/PROCESS.md
@@ -31,6 +31,10 @@ The final merge must be performed by a maintainer.
## Releases
+> Below we describe the legacy release process, from when Workhorse
+> had its own repository. These instructions are still useful for
+> security backports.
+
New versions of Workhorse can be released by one of the Workhorse
maintainers. The release process is:
diff --git a/workhorse/README.md b/workhorse/README.md
index c1ff104cda8..c7617645b34 100644
--- a/workhorse/README.md
+++ b/workhorse/README.md
@@ -9,17 +9,11 @@ GitLab](doc/architecture/gitlab_features.md) that would not work efficiently wit
## Canonical source
-The canonical source for Workhorse is currently
-[gitlab-org/gitlab-workhorse](https://gitlab.com/gitlab-org/gitlab-workhorse).
-As explained in https://gitlab.com/groups/gitlab-org/-/epics/4826, we
-are in the process of moving the canonical source to
+The canonical source for Workhorse is
[gitlab-org/gitlab/workhorse](https://gitlab.com/gitlab-org/gitlab/tree/master/workhorse).
-
-Until that transition is complete, changes (Merge Requests) for
-Workhorse should be submitted at
-[gitlab-org/gitlab-workhorse](https://gitlab.com/gitlab-org/gitlab-workhorse).
-Once merged, they will propagate to gitlab-org/gitlab/workhorse via
-the usual Workhorse release process.
+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
diff --git a/workhorse/VERSION b/workhorse/VERSION
index 48309c07a55..6ff19de4b80 100644..120000
--- a/workhorse/VERSION
+++ b/workhorse/VERSION
@@ -1 +1 @@
-8.63.2
+../VERSION \ No newline at end of file
diff --git a/workhorse/config_test.go b/workhorse/config_test.go
index f9d12bd5e2b..cf33e5bb7ca 100644
--- a/workhorse/config_test.go
+++ b/workhorse/config_test.go
@@ -85,7 +85,7 @@ func TestConfigDefaults(t *testing.T) {
DocumentRoot: "public",
ProxyHeadersTimeout: 5 * time.Minute,
APIQueueTimeout: queueing.DefaultTimeout,
- APICILongPollingDuration: 50 * time.Nanosecond, // TODO this is meant to be 50*time.Second but it has been wrong for ages
+ APICILongPollingDuration: 50 * time.Second,
ImageResizerConfig: config.DefaultImageResizerConfig,
}
diff --git a/workhorse/go.mod b/workhorse/go.mod
index 20344f0081d..6396e419487 100644
--- a/workhorse/go.mod
+++ b/workhorse/go.mod
@@ -8,8 +8,10 @@ require (
github.com/FZambia/sentinel v1.0.0
github.com/alecthomas/chroma v0.7.3
github.com/aws/aws-sdk-go v1.36.1
+ github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054 // indirect
github.com/dgrijalva/jwt-go v3.2.0+incompatible
github.com/disintegration/imaging v1.6.2
+ github.com/getsentry/raven-go v0.2.0
github.com/golang/gddo v0.0.0-20190419222130-af0f2af80721
github.com/golang/protobuf v1.4.3
github.com/gomodule/redigo v2.0.0+incompatible
diff --git a/workhorse/go.sum b/workhorse/go.sum
index ddb08a1e846..4796d40638b 100644
--- a/workhorse/go.sum
+++ b/workhorse/go.sum
@@ -145,6 +145,8 @@ github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QH
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/certifi/gocertifi v0.0.0-20180905225744-ee1a9a0726d2/go.mod h1:GJKEexRPVJrBSOjoqN5VNOIKJ5Q3RViH6eu3puDRwx4=
+github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054 h1:uH66TXeswKn5PW5zdZ39xEwfS9an067BirqA+P4QaLI=
+github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
diff --git a/workhorse/internal/errortracker/sentry.go b/workhorse/internal/errortracker/sentry.go
deleted file mode 100644
index 72a32c8d349..00000000000
--- a/workhorse/internal/errortracker/sentry.go
+++ /dev/null
@@ -1,60 +0,0 @@
-package errortracker
-
-import (
- "fmt"
- "net/http"
- "os"
- "runtime/debug"
-
- "gitlab.com/gitlab-org/labkit/errortracking"
-
- "gitlab.com/gitlab-org/labkit/log"
-)
-
-// NewHandler allows us to handle panics in upstreams gracefully, by logging them
-// using structured logging and reporting them into Sentry as `error`s with a
-// proper correlation ID attached.
-func NewHandler(next http.Handler) http.Handler {
- return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- defer func() {
- if p := recover(); p != nil {
- fields := log.ContextFields(r.Context())
- log.WithFields(fields).Error(p)
- debug.PrintStack()
- // A panic isn't always an `error`, so we may have to convert it into one.
- e, ok := p.(error)
- if !ok {
- e = fmt.Errorf("%v", p)
- }
- TrackFailedRequest(r, e, fields)
- }
- }()
-
- next.ServeHTTP(w, r)
- })
-}
-
-func TrackFailedRequest(r *http.Request, err error, fields log.Fields) {
- captureOpts := []errortracking.CaptureOption{
- errortracking.WithContext(r.Context()),
- errortracking.WithRequest(r),
- }
- for k, v := range fields {
- captureOpts = append(captureOpts, errortracking.WithField(k, fmt.Sprintf("%v", v)))
- }
-
- errortracking.Capture(err, captureOpts...)
-}
-
-func Initialize(version string) error {
- // Use a custom environment variable (not SENTRY_DSN) to prevent
- // clashes with gitlab-rails.
- sentryDSN := os.Getenv("GITLAB_WORKHORSE_SENTRY_DSN")
- sentryEnvironment := os.Getenv("GITLAB_WORKHORSE_SENTRY_ENVIRONMENT")
-
- return errortracking.Initialize(
- errortracking.WithSentryDSN(sentryDSN),
- errortracking.WithSentryEnvironment(sentryEnvironment),
- errortracking.WithVersion(version),
- )
-}
diff --git a/workhorse/internal/helper/helpers.go b/workhorse/internal/helper/helpers.go
index 2e23f50b913..f9b46181579 100644
--- a/workhorse/internal/helper/helpers.go
+++ b/workhorse/internal/helper/helpers.go
@@ -14,31 +14,50 @@ import (
"syscall"
"github.com/sebest/xff"
-
- "gitlab.com/gitlab-org/gitlab-workhorse/internal/log"
+ "gitlab.com/gitlab-org/labkit/log"
+ "gitlab.com/gitlab-org/labkit/mask"
)
const NginxResponseBufferHeader = "X-Accel-Buffering"
-func CaptureAndFail(w http.ResponseWriter, r *http.Request, err error, msg string, code int, loggerCallbacks ...log.ConfigureLogger) {
- http.Error(w, msg, code)
- logger := log.WithRequest(r).WithError(err)
-
- for _, cb := range loggerCallbacks {
- logger = cb(logger)
+func logErrorWithFields(r *http.Request, err error, fields log.Fields) {
+ if err != nil {
+ CaptureRavenError(r, err, fields)
}
- logger.Error(msg)
+ printError(r, err, fields)
+}
+
+func CaptureAndFail(w http.ResponseWriter, r *http.Request, err error, msg string, code int) {
+ http.Error(w, msg, code)
+ logErrorWithFields(r, err, nil)
+}
+
+func Fail500(w http.ResponseWriter, r *http.Request, err error) {
+ CaptureAndFail(w, r, err, "Internal server error", http.StatusInternalServerError)
}
-func Fail500(w http.ResponseWriter, r *http.Request, err error, loggerCallbacks ...log.ConfigureLogger) {
- CaptureAndFail(w, r, err, "Internal server error", http.StatusInternalServerError, loggerCallbacks...)
+func Fail500WithFields(w http.ResponseWriter, r *http.Request, err error, fields log.Fields) {
+ http.Error(w, "Internal server error", http.StatusInternalServerError)
+ logErrorWithFields(r, err, fields)
}
func RequestEntityTooLarge(w http.ResponseWriter, r *http.Request, err error) {
CaptureAndFail(w, r, err, "Request Entity Too Large", http.StatusRequestEntityTooLarge)
}
+func printError(r *http.Request, err error, fields log.Fields) {
+ if r != nil {
+ entry := log.WithContextFields(r.Context(), log.Fields{
+ "method": r.Method,
+ "uri": mask.URL(r.RequestURI),
+ })
+ entry.WithFields(fields).WithError(err).Error()
+ } else {
+ log.WithFields(fields).WithError(err).Error("unknown error")
+ }
+}
+
func SetNoCacheHeaders(header http.Header) {
header.Set("Cache-Control", "no-cache, no-store, max-age=0, must-revalidate")
header.Set("Pragma", "no-cache")
@@ -78,7 +97,7 @@ func OpenFile(path string) (file *os.File, fi os.FileInfo, err error) {
func URLMustParse(s string) *url.URL {
u, err := url.Parse(s)
if err != nil {
- log.WithError(err).WithFields(log.Fields{"url": s}).Error("urlMustParse")
+ log.WithError(err).WithField("url", s).Fatal("urlMustParse")
}
return u
}
diff --git a/workhorse/internal/helper/raven.go b/workhorse/internal/helper/raven.go
new file mode 100644
index 00000000000..898e8ec85f8
--- /dev/null
+++ b/workhorse/internal/helper/raven.go
@@ -0,0 +1,58 @@
+package helper
+
+import (
+ "net/http"
+ "reflect"
+
+ raven "github.com/getsentry/raven-go"
+
+ //lint:ignore SA1019 this was recently deprecated. Update workhorse to use labkit errortracking package.
+ correlation "gitlab.com/gitlab-org/labkit/correlation/raven"
+
+ "gitlab.com/gitlab-org/labkit/log"
+)
+
+var ravenHeaderBlacklist = []string{
+ "Authorization",
+ "Private-Token",
+}
+
+func CaptureRavenError(r *http.Request, err error, fields log.Fields) {
+ client := raven.DefaultClient
+ extra := raven.Extra{}
+
+ for k, v := range fields {
+ extra[k] = v
+ }
+
+ interfaces := []raven.Interface{}
+ if r != nil {
+ CleanHeadersForRaven(r)
+ interfaces = append(interfaces, raven.NewHttp(r))
+
+ //lint:ignore SA1019 this was recently deprecated. Update workhorse to use labkit errortracking package.
+ extra = correlation.SetExtra(r.Context(), extra)
+ }
+
+ exception := &raven.Exception{
+ Stacktrace: raven.NewStacktrace(2, 3, nil),
+ Value: err.Error(),
+ Type: reflect.TypeOf(err).String(),
+ }
+ interfaces = append(interfaces, exception)
+
+ packet := raven.NewPacketWithExtra(err.Error(), extra, interfaces...)
+ client.Capture(packet, nil)
+}
+
+func CleanHeadersForRaven(r *http.Request) {
+ if r == nil {
+ return
+ }
+
+ for _, key := range ravenHeaderBlacklist {
+ if r.Header.Get(key) != "" {
+ r.Header.Set(key, "[redacted]")
+ }
+ }
+}
diff --git a/workhorse/internal/imageresizer/image_resizer.go b/workhorse/internal/imageresizer/image_resizer.go
index 7d423b80067..69e9496aec2 100644
--- a/workhorse/internal/imageresizer/image_resizer.go
+++ b/workhorse/internal/imageresizer/image_resizer.go
@@ -428,18 +428,16 @@ func logFields(startTime time.Time, params *resizeParams, outcome *resizeOutcome
func handleOutcome(w http.ResponseWriter, req *http.Request, startTime time.Time, params *resizeParams, outcome *resizeOutcome) {
fields := logFields(startTime, params, outcome)
- logger := log.WithRequest(req).WithFields(fields)
+ log := log.WithRequest(req).WithFields(fields)
switch outcome.status {
case statusRequestFailure:
if outcome.bytesWritten <= 0 {
- helper.Fail500(w, req, outcome.err, func(b *log.Builder) *log.Builder {
- return b.WithFields(fields)
- })
+ helper.Fail500WithFields(w, req, outcome.err, fields)
} else {
- logger.WithError(outcome.err).Error(outcome.status)
+ log.WithError(outcome.err).Error(outcome.status)
}
default:
- logger.Info(outcome.status)
+ log.Info(outcome.status)
}
}
diff --git a/workhorse/internal/log/logging.go b/workhorse/internal/log/logging.go
index 9c19cde1395..c65ec07743a 100644
--- a/workhorse/internal/log/logging.go
+++ b/workhorse/internal/log/logging.go
@@ -8,13 +8,11 @@ import (
"gitlab.com/gitlab-org/labkit/mask"
"golang.org/x/net/context"
- "gitlab.com/gitlab-org/gitlab-workhorse/internal/errortracker"
+ "gitlab.com/gitlab-org/gitlab-workhorse/internal/helper"
)
type Fields = log.Fields
-type ConfigureLogger func(*Builder) *Builder
-
type Builder struct {
entry *logrus.Entry
fields log.Fields
@@ -85,6 +83,6 @@ func (b *Builder) Error(args ...interface{}) {
b.entry.Error(args...)
if b.req != nil && b.err != nil {
- errortracker.TrackFailedRequest(b.req, b.err, b.fields)
+ helper.CaptureRavenError(b.req, b.err, b.fields)
}
}
diff --git a/workhorse/internal/upstream/upstream.go b/workhorse/internal/upstream/upstream.go
index b834f155185..80e7d4056b6 100644
--- a/workhorse/internal/upstream/upstream.go
+++ b/workhorse/internal/upstream/upstream.go
@@ -16,7 +16,6 @@ import (
"gitlab.com/gitlab-org/labkit/correlation"
"gitlab.com/gitlab-org/gitlab-workhorse/internal/config"
- "gitlab.com/gitlab-org/gitlab-workhorse/internal/errortracker"
"gitlab.com/gitlab-org/gitlab-workhorse/internal/helper"
"gitlab.com/gitlab-org/gitlab-workhorse/internal/rejectmethods"
"gitlab.com/gitlab-org/gitlab-workhorse/internal/upload"
@@ -68,7 +67,7 @@ func newUpstream(cfg config.Config, accessLogger *logrus.Logger, routesCallback
correlationOpts = append(correlationOpts, correlation.WithPropagation())
}
- handler := correlation.InjectCorrelationID(errortracker.NewHandler(&up), correlationOpts...)
+ handler := correlation.InjectCorrelationID(&up, correlationOpts...)
// TODO: move to LabKit https://gitlab.com/gitlab-org/gitlab-workhorse/-/issues/339
handler = rejectmethods.NewMiddleware(handler)
return handler
diff --git a/workhorse/main.go b/workhorse/main.go
index c43ec45240f..28162a00fae 100644
--- a/workhorse/main.go
+++ b/workhorse/main.go
@@ -16,7 +16,6 @@ import (
"gitlab.com/gitlab-org/labkit/tracing"
"gitlab.com/gitlab-org/gitlab-workhorse/internal/config"
- "gitlab.com/gitlab-org/gitlab-workhorse/internal/errortracker"
"gitlab.com/gitlab-org/gitlab-workhorse/internal/queueing"
"gitlab.com/gitlab-org/gitlab-workhorse/internal/redis"
"gitlab.com/gitlab-org/gitlab-workhorse/internal/secret"
@@ -103,7 +102,7 @@ func buildConfig(arg0 string, args []string) (*bootConfig, *config.Config, error
fset.UintVar(&cfg.APILimit, "apiLimit", 0, "Number of API requests allowed at single time")
fset.UintVar(&cfg.APIQueueLimit, "apiQueueLimit", 0, "Number of API requests allowed to be queued")
fset.DurationVar(&cfg.APIQueueTimeout, "apiQueueDuration", queueing.DefaultTimeout, "Maximum queueing duration of requests")
- fset.DurationVar(&cfg.APICILongPollingDuration, "apiCiLongPollingDuration", 50, "Long polling duration for job requesting for runners (default 50s - enabled)")
+ fset.DurationVar(&cfg.APICILongPollingDuration, "apiCiLongPollingDuration", 50*time.Second, "Long polling duration for job requesting for runners (default 50s - enabled)")
fset.BoolVar(&cfg.PropagateCorrelationID, "propagateCorrelationID", false, "Reuse existing Correlation-ID from the incoming request header `X-Request-ID` if present")
if err := fset.Parse(args); err != nil {
@@ -157,8 +156,6 @@ func run(boot bootConfig, cfg config.Config) error {
}
defer closer.Close()
- errortracker.Initialize(cfg.Version)
-
tracing.Initialize(tracing.WithServiceName("gitlab-workhorse"))
log.WithField("version", Version).WithField("build_time", BuildTime).Print("Starting")
@@ -226,7 +223,7 @@ func run(boot bootConfig, cfg config.Config) error {
}
defer accessCloser.Close()
- up := upstream.NewUpstream(cfg, accessLogger)
+ up := wrapRaven(upstream.NewUpstream(cfg, accessLogger))
go func() { finalErrors <- http.Serve(listener, up) }()
diff --git a/workhorse/raven.go b/workhorse/raven.go
new file mode 100644
index 00000000000..f641203f142
--- /dev/null
+++ b/workhorse/raven.go
@@ -0,0 +1,40 @@
+package main
+
+import (
+ "net/http"
+ "os"
+
+ raven "github.com/getsentry/raven-go"
+
+ "gitlab.com/gitlab-org/gitlab-workhorse/internal/helper"
+)
+
+func wrapRaven(h http.Handler) http.Handler {
+ // Use a custom environment variable (not SENTRY_DSN) to prevent
+ // clashes with gitlab-rails.
+ sentryDSN := os.Getenv("GITLAB_WORKHORSE_SENTRY_DSN")
+ sentryEnvironment := os.Getenv("GITLAB_WORKHORSE_SENTRY_ENVIRONMENT")
+ raven.SetDSN(sentryDSN) // sentryDSN may be empty
+
+ if sentryEnvironment != "" {
+ raven.SetEnvironment(sentryEnvironment)
+ }
+
+ if sentryDSN == "" {
+ return h
+ }
+
+ raven.DefaultClient.SetRelease(Version)
+
+ return http.HandlerFunc(raven.RecoveryHandler(
+ func(w http.ResponseWriter, r *http.Request) {
+ defer func() {
+ if p := recover(); p != nil {
+ helper.CleanHeadersForRaven(r)
+ panic(p)
+ }
+ }()
+
+ h.ServeHTTP(w, r)
+ }))
+}
diff --git a/yarn.lock b/yarn.lock
index d3b92e7e2f3..3b5e8d7dcb5 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,13 +2,20 @@
# yarn lockfile v1
-"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.1", "@babel/code-frame@^7.10.4":
- version "7.10.4"
- resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a"
- integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==
+"@babel/code-frame@7.12.11":
+ version "7.12.11"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f"
+ integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==
dependencies:
"@babel/highlight" "^7.10.4"
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658"
+ integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==
+ dependencies:
+ "@babel/highlight" "^7.12.13"
+
"@babel/compat-data@^7.10.1":
version "7.10.1"
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.10.1.tgz#b1085ffe72cd17bf2c0ee790fc09f9626011b2db"
@@ -18,34 +25,33 @@
invariant "^2.2.4"
semver "^5.5.0"
-"@babel/core@>=7.2.2", "@babel/core@^7.1.0", "@babel/core@^7.10.1", "@babel/core@^7.7.5":
- version "7.10.2"
- resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.10.2.tgz#bd6786046668a925ac2bd2fd95b579b92a23b36a"
- integrity sha512-KQmV9yguEjQsXqyOUGKjS4+3K8/DlOCE2pZcq4augdQmtTy5iv5EHtmMSJ7V4c1BIPjuwtZYqYLCq9Ga+hGBRQ==
- dependencies:
- "@babel/code-frame" "^7.10.1"
- "@babel/generator" "^7.10.2"
- "@babel/helper-module-transforms" "^7.10.1"
- "@babel/helpers" "^7.10.1"
- "@babel/parser" "^7.10.2"
- "@babel/template" "^7.10.1"
- "@babel/traverse" "^7.10.1"
- "@babel/types" "^7.10.2"
+"@babel/core@>=7.9.0", "@babel/core@^7.1.0", "@babel/core@^7.10.1", "@babel/core@^7.7.5":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.13.tgz#b73a87a3a3e7d142a66248bf6ad88b9ceb093425"
+ integrity sha512-BQKE9kXkPlXHPeqissfxo0lySWJcYdEP0hdtJOH/iJfDdhOCcgtNCjftCJg3qqauB4h+lz2N6ixM++b9DN1Tcw==
+ dependencies:
+ "@babel/code-frame" "^7.12.13"
+ "@babel/generator" "^7.12.13"
+ "@babel/helper-module-transforms" "^7.12.13"
+ "@babel/helpers" "^7.12.13"
+ "@babel/parser" "^7.12.13"
+ "@babel/template" "^7.12.13"
+ "@babel/traverse" "^7.12.13"
+ "@babel/types" "^7.12.13"
convert-source-map "^1.7.0"
debug "^4.1.0"
gensync "^1.0.0-beta.1"
json5 "^2.1.2"
- lodash "^4.17.13"
- resolve "^1.3.2"
+ lodash "^4.17.19"
semver "^5.4.1"
source-map "^0.5.0"
-"@babel/generator@^7.10.2", "@babel/generator@^7.11.5", "@babel/generator@^7.4.0":
- version "7.11.6"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.6.tgz#b868900f81b163b4d464ea24545c61cbac4dc620"
- integrity sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==
+"@babel/generator@^7.12.13", "@babel/generator@^7.4.0":
+ version "7.12.15"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.15.tgz#4617b5d0b25cc572474cc1aafee1edeaf9b5368f"
+ integrity sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ==
dependencies:
- "@babel/types" "^7.11.5"
+ "@babel/types" "^7.12.13"
jsesc "^2.5.1"
source-map "^0.5.0"
@@ -113,21 +119,21 @@
"@babel/traverse" "^7.10.1"
"@babel/types" "^7.10.1"
-"@babel/helper-function-name@^7.10.1", "@babel/helper-function-name@^7.10.4":
- version "7.10.4"
- resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a"
- integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==
+"@babel/helper-function-name@^7.10.1", "@babel/helper-function-name@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz#93ad656db3c3c2232559fd7b2c3dbdcbe0eb377a"
+ integrity sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==
dependencies:
- "@babel/helper-get-function-arity" "^7.10.4"
- "@babel/template" "^7.10.4"
- "@babel/types" "^7.10.4"
+ "@babel/helper-get-function-arity" "^7.12.13"
+ "@babel/template" "^7.12.13"
+ "@babel/types" "^7.12.13"
-"@babel/helper-get-function-arity@^7.10.1", "@babel/helper-get-function-arity@^7.10.4":
- version "7.10.4"
- resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2"
- integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==
+"@babel/helper-get-function-arity@^7.10.1", "@babel/helper-get-function-arity@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583"
+ integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==
dependencies:
- "@babel/types" "^7.10.4"
+ "@babel/types" "^7.12.13"
"@babel/helper-hoist-variables@^7.10.1":
version "7.10.1"
@@ -136,39 +142,41 @@
dependencies:
"@babel/types" "^7.10.1"
-"@babel/helper-member-expression-to-functions@^7.10.1", "@babel/helper-member-expression-to-functions@^7.10.4":
- version "7.11.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz#ae69c83d84ee82f4b42f96e2a09410935a8f26df"
- integrity sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==
- dependencies:
- "@babel/types" "^7.11.0"
-
-"@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.10.1", "@babel/helper-module-imports@^7.10.4":
- version "7.10.4"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620"
- integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==
- dependencies:
- "@babel/types" "^7.10.4"
-
-"@babel/helper-module-transforms@^7.10.1", "@babel/helper-module-transforms@^7.10.4":
- version "7.11.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz#b16f250229e47211abdd84b34b64737c2ab2d359"
- integrity sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==
- dependencies:
- "@babel/helper-module-imports" "^7.10.4"
- "@babel/helper-replace-supers" "^7.10.4"
- "@babel/helper-simple-access" "^7.10.4"
- "@babel/helper-split-export-declaration" "^7.11.0"
- "@babel/template" "^7.10.4"
- "@babel/types" "^7.11.0"
+"@babel/helper-member-expression-to-functions@^7.10.1", "@babel/helper-member-expression-to-functions@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.13.tgz#c5715695b4f8bab32660dbdcdc2341dec7e3df40"
+ integrity sha512-B+7nN0gIL8FZ8SvMcF+EPyB21KnCcZHQZFczCxbiNGV/O0rsrSBlWGLzmtBJ3GMjSVMIm4lpFhR+VdVBuIsUcQ==
+ dependencies:
+ "@babel/types" "^7.12.13"
+
+"@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.10.1", "@babel/helper-module-imports@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz#ec67e4404f41750463e455cc3203f6a32e93fcb0"
+ integrity sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g==
+ dependencies:
+ "@babel/types" "^7.12.13"
+
+"@babel/helper-module-transforms@^7.10.1", "@babel/helper-module-transforms@^7.10.4", "@babel/helper-module-transforms@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.13.tgz#01afb052dcad2044289b7b20beb3fa8bd0265bea"
+ integrity sha512-acKF7EjqOR67ASIlDTupwkKM1eUisNAjaSduo5Cz+793ikfnpe7p4Q7B7EWU2PCoSTPWsQkR7hRUWEIZPiVLGA==
+ dependencies:
+ "@babel/helper-module-imports" "^7.12.13"
+ "@babel/helper-replace-supers" "^7.12.13"
+ "@babel/helper-simple-access" "^7.12.13"
+ "@babel/helper-split-export-declaration" "^7.12.13"
+ "@babel/helper-validator-identifier" "^7.12.11"
+ "@babel/template" "^7.12.13"
+ "@babel/traverse" "^7.12.13"
+ "@babel/types" "^7.12.13"
lodash "^4.17.19"
-"@babel/helper-optimise-call-expression@^7.10.1", "@babel/helper-optimise-call-expression@^7.10.4":
- version "7.10.4"
- resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673"
- integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==
+"@babel/helper-optimise-call-expression@^7.10.1", "@babel/helper-optimise-call-expression@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea"
+ integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==
dependencies:
- "@babel/types" "^7.10.4"
+ "@babel/types" "^7.12.13"
"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.1", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0":
version "7.10.4"
@@ -193,35 +201,34 @@
"@babel/traverse" "^7.10.1"
"@babel/types" "^7.10.1"
-"@babel/helper-replace-supers@^7.10.1", "@babel/helper-replace-supers@^7.10.4":
- version "7.10.4"
- resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf"
- integrity sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==
+"@babel/helper-replace-supers@^7.10.1", "@babel/helper-replace-supers@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.13.tgz#00ec4fb6862546bd3d0aff9aac56074277173121"
+ integrity sha512-pctAOIAMVStI2TMLhozPKbf5yTEXc0OJa0eENheb4w09SrgOWEs+P4nTOZYJQCqs8JlErGLDPDJTiGIp3ygbLg==
dependencies:
- "@babel/helper-member-expression-to-functions" "^7.10.4"
- "@babel/helper-optimise-call-expression" "^7.10.4"
- "@babel/traverse" "^7.10.4"
- "@babel/types" "^7.10.4"
+ "@babel/helper-member-expression-to-functions" "^7.12.13"
+ "@babel/helper-optimise-call-expression" "^7.12.13"
+ "@babel/traverse" "^7.12.13"
+ "@babel/types" "^7.12.13"
-"@babel/helper-simple-access@^7.10.4":
- version "7.10.4"
- resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461"
- integrity sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==
+"@babel/helper-simple-access@^7.10.4", "@babel/helper-simple-access@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz#8478bcc5cacf6aa1672b251c1d2dde5ccd61a6c4"
+ integrity sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA==
dependencies:
- "@babel/template" "^7.10.4"
- "@babel/types" "^7.10.4"
+ "@babel/types" "^7.12.13"
-"@babel/helper-split-export-declaration@^7.10.1", "@babel/helper-split-export-declaration@^7.11.0":
- version "7.11.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f"
- integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==
+"@babel/helper-split-export-declaration@^7.10.1", "@babel/helper-split-export-declaration@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05"
+ integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==
dependencies:
- "@babel/types" "^7.11.0"
+ "@babel/types" "^7.12.13"
-"@babel/helper-validator-identifier@^7.10.4":
- version "7.10.4"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2"
- integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==
+"@babel/helper-validator-identifier@^7.12.11":
+ version "7.12.11"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed"
+ integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==
"@babel/helper-wrap-function@^7.10.1":
version "7.10.1"
@@ -233,28 +240,28 @@
"@babel/traverse" "^7.10.1"
"@babel/types" "^7.10.1"
-"@babel/helpers@^7.10.1":
- version "7.10.1"
- resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.1.tgz#a6827b7cb975c9d9cef5fd61d919f60d8844a973"
- integrity sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw==
+"@babel/helpers@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.13.tgz#3c75e993632e4dadc0274eae219c73eb7645ba47"
+ integrity sha512-oohVzLRZ3GQEk4Cjhfs9YkJA4TdIDTObdBEZGrd6F/T0GPSnuV6l22eMcxlvcvzVIPH3VTtxbseudM1zIE+rPQ==
dependencies:
- "@babel/template" "^7.10.1"
- "@babel/traverse" "^7.10.1"
- "@babel/types" "^7.10.1"
+ "@babel/template" "^7.12.13"
+ "@babel/traverse" "^7.12.13"
+ "@babel/types" "^7.12.13"
-"@babel/highlight@^7.10.4":
- version "7.10.4"
- resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143"
- integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==
+"@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.12.13.tgz#8ab538393e00370b26271b01fa08f7f27f2e795c"
+ integrity sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==
dependencies:
- "@babel/helper-validator-identifier" "^7.10.4"
+ "@babel/helper-validator-identifier" "^7.12.11"
chalk "^2.0.0"
js-tokens "^4.0.0"
-"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.10.2", "@babel/parser@^7.10.4", "@babel/parser@^7.11.5", "@babel/parser@^7.4.3":
- version "7.11.5"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.5.tgz#c7ff6303df71080ec7a4f5b8c003c58f1cf51037"
- integrity sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==
+"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.12.13", "@babel/parser@^7.4.3":
+ version "7.12.15"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.15.tgz#2b20de7f0b4b332d9b119dd9c33409c538b8aacf"
+ integrity sha512-AQBOU2Z9kWwSZMd6lNjCX0GUgFonL1wAM1db8L8PMk9UDaGsRCArBkU4Sc+UCM3AE4hjbXx+h58Lb3QT4oRmrA==
"@babel/plugin-proposal-async-generator-functions@^7.10.1":
version "7.10.1"
@@ -789,36 +796,36 @@
resolved "https://registry.yarnpkg.com/@babel/standalone/-/standalone-7.10.2.tgz#49dbbadcbc4b199df064d7d8b3e21c915b84abdb"
integrity sha512-PNQuj9oQH6BL/3l9iiL8hJLQwX14woA2/FHcPtNIZAc7IgFZYJdtMBMXiy4xcefADHTSvoBnmc2AybrHRW1IKQ==
-"@babel/template@^7.10.1", "@babel/template@^7.10.4", "@babel/template@^7.3.3", "@babel/template@^7.4.0":
- version "7.10.4"
- resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278"
- integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==
- dependencies:
- "@babel/code-frame" "^7.10.4"
- "@babel/parser" "^7.10.4"
- "@babel/types" "^7.10.4"
-
-"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.10.1", "@babel/traverse@^7.10.4", "@babel/traverse@^7.4.3":
- version "7.11.5"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.5.tgz#be777b93b518eb6d76ee2e1ea1d143daa11e61c3"
- integrity sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==
- dependencies:
- "@babel/code-frame" "^7.10.4"
- "@babel/generator" "^7.11.5"
- "@babel/helper-function-name" "^7.10.4"
- "@babel/helper-split-export-declaration" "^7.11.0"
- "@babel/parser" "^7.11.5"
- "@babel/types" "^7.11.5"
+"@babel/template@^7.10.1", "@babel/template@^7.12.13", "@babel/template@^7.3.3", "@babel/template@^7.4.0":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327"
+ integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==
+ dependencies:
+ "@babel/code-frame" "^7.12.13"
+ "@babel/parser" "^7.12.13"
+ "@babel/types" "^7.12.13"
+
+"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.10.1", "@babel/traverse@^7.12.13", "@babel/traverse@^7.4.3":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.13.tgz#689f0e4b4c08587ad26622832632735fb8c4e0c0"
+ integrity sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==
+ dependencies:
+ "@babel/code-frame" "^7.12.13"
+ "@babel/generator" "^7.12.13"
+ "@babel/helper-function-name" "^7.12.13"
+ "@babel/helper-split-export-declaration" "^7.12.13"
+ "@babel/parser" "^7.12.13"
+ "@babel/types" "^7.12.13"
debug "^4.1.0"
globals "^11.1.0"
lodash "^4.17.19"
-"@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.10.4", "@babel/types@^7.11.0", "@babel/types@^7.11.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.0", "@babel/types@^7.4.4":
- version "7.11.5"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.5.tgz#d9de577d01252d77c6800cee039ee64faf75662d"
- integrity sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==
+"@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.12.13", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.0", "@babel/types@^7.4.4":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.13.tgz#8be1aa8f2c876da11a9cf650c0ecf656913ad611"
+ integrity sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==
dependencies:
- "@babel/helper-validator-identifier" "^7.10.4"
+ "@babel/helper-validator-identifier" "^7.12.11"
lodash "^4.17.19"
to-fast-properties "^2.0.0"
@@ -840,10 +847,10 @@
exec-sh "^0.3.2"
minimist "^1.2.0"
-"@eslint/eslintrc@^0.3.0":
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.3.0.tgz#d736d6963d7003b6514e6324bec9c602ac340318"
- integrity sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg==
+"@eslint/eslintrc@^0.4.0":
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.0.tgz#99cc0a0584d72f1df38b900fb062ba995f395547"
+ integrity sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==
dependencies:
ajv "^6.12.4"
debug "^4.1.1"
@@ -852,7 +859,6 @@
ignore "^4.0.6"
import-fresh "^3.2.1"
js-yaml "^3.13.1"
- lodash "^4.17.20"
minimatch "^3.0.4"
strip-json-comments "^3.1.1"
@@ -861,10 +867,10 @@
resolved "https://registry.yarnpkg.com/@gitlab/at.js/-/at.js-1.5.7.tgz#1ee6f838cc4410a1d797770934df91d90df8179e"
integrity sha512-c6ySRK/Ma7lxwpIVbSAF3P+xiTLrNTGTLRx4/pHK111AdFxwgUwrYF6aVZFXvmG65jHOJHoa0eQQ21RW6rm0Rg==
-"@gitlab/eslint-plugin@8.0.0":
- version "8.0.0"
- resolved "https://registry.yarnpkg.com/@gitlab/eslint-plugin/-/eslint-plugin-8.0.0.tgz#e8d30fd98e2102f417617d0c60ef1810520a8ac6"
- integrity sha512-hTTdcyxN3Ead2FaNwaiPg9sv2YbCDrlyAgKAPV7dit2uPqR0nkIlng9JPNMIixTXBrJ/Y+VvjIRrKKNYBubocw==
+"@gitlab/eslint-plugin@8.1.0":
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/@gitlab/eslint-plugin/-/eslint-plugin-8.1.0.tgz#a98ac4219da3316d30ee717ef0603c8fa0c4d5d8"
+ integrity sha512-PU2ldrF59dhunMcEMzSqwG9RfTZRPmW8/pXwcXhJNi61g9lkdHQn8CiQGazepDlBwjEHl5habv/cs52gUc06+w==
dependencies:
babel-eslint "^10.0.3"
eslint-config-airbnb-base "^14.2.1"
@@ -882,20 +888,29 @@
resolved "https://registry.yarnpkg.com/@gitlab/favicon-overlay/-/favicon-overlay-2.0.0.tgz#2f32d0b6a4d5b8ac44e2927083d9ab478a78c984"
integrity sha512-GNcORxXJ98LVGzOT9dDYKfbheqH6lNgPDD72lyXRnQIH7CjgGyos8i17aSBPq1f4s3zF3PyedFiAR4YEZbva2Q==
-"@gitlab/svgs@1.182.0":
- version "1.182.0"
- resolved "https://registry.yarnpkg.com/@gitlab/svgs/-/svgs-1.182.0.tgz#600cb577c598ff63325c3f6f049e3254abdbb580"
- integrity sha512-hV6Hkd92bNyzGm2awdwtyXVjT71QZkfAMVV9qHg9fhu5swA4qLrxzXpYBBfeY3/e2KJIByVfROP8tSFws0R6Kw==
+"@gitlab/stylelint-config@2.3.0":
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/@gitlab/stylelint-config/-/stylelint-config-2.3.0.tgz#b27e8544ff52a4c5e23ff7a104c7efff1f7078f0"
+ integrity sha512-8aGdBjNO05xadeGb8GSCyRdr1QcRDaDTUTTjKlD2CfFqvAmaQpCk6NdFMMSHlWQpHHMxS5hQeWiC47sIWON4iQ==
+ dependencies:
+ stylelint "13.9.0"
+ stylelint-declaration-strict-value "1.7.7"
+ stylelint-scss "3.18.0"
+
+"@gitlab/svgs@1.184.0":
+ version "1.184.0"
+ resolved "https://registry.yarnpkg.com/@gitlab/svgs/-/svgs-1.184.0.tgz#7fe90309999b987362eb1649aa91df24748d3df1"
+ integrity sha512-K8r5jhnjWR4347j2ADFek7yLgs+MDGqm9cjvwT04aa1vSfhvheLqyKGUy1yz8v7RzXC0Mev6+RT1AbK7m6Ay+w==
"@gitlab/tributejs@1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@gitlab/tributejs/-/tributejs-1.0.0.tgz#672befa222aeffc83e7d799b0500a7a4418e59b8"
integrity sha512-nmKw1+hB6MHvlmPz63yPwVs1qQkycHwsKgxpEbzmky16Y6mL4EJMk3w1b8QlOAF/AIAzjCERPhe/R4MJiohbZw==
-"@gitlab/ui@27.4.6":
- version "27.4.6"
- resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-27.4.6.tgz#2364c2ba981024cdce32b4657c5f0eb2ae781a4d"
- integrity sha512-0fUNgu0tjk/BBq9NmuZg7THcEsUvfhz/mhUwnLWB5hjrfa7Nnu+TRBgeVfs08vDyK7h6uualgITTH+eTGo6tyw==
+"@gitlab/ui@28.6.0":
+ version "28.6.0"
+ resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-28.6.0.tgz#dae21f072cbf898bfa87dcefbef951c2811ecba0"
+ integrity sha512-6LvPoQbSzbY9kmP3y84eQj48w6XzgLktSBX0NM2IB3/sZzEtFlpLpnqmv6cWhS2V1HAM7xW6nLZ4SGyM3JRhvA==
dependencies:
"@babel/standalone" "^7.0.0"
"@gitlab/vue-toasted" "^1.3.0"
@@ -903,7 +918,7 @@
copy-to-clipboard "^3.0.8"
dompurify "^2.2.6"
echarts "^4.9.0"
- highlight.js "^9.13.1"
+ highlight.js "^10.6.0"
js-beautify "^1.8.8"
lodash "^4.17.20"
portal-vue "^2.1.6"
@@ -1123,18 +1138,26 @@
resolved "https://registry.yarnpkg.com/@miragejs/pretender-node-polyfill/-/pretender-node-polyfill-0.1.2.tgz#d26b6b7483fb70cd62189d05c95d2f67153e43f2"
integrity sha512-M/BexG/p05C5lFfMunxo/QcgIJnMT2vDVCd00wNqK2ImZONIlEETZwWJu1QtLxtmYlSHlCFl3JNzp0tLe7OJ5g==
-"@mrmlnc/readdir-enhanced@^2.2.1":
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde"
- integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==
+"@nodelib/fs.scandir@2.1.4":
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69"
+ integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==
dependencies:
- call-me-maybe "^1.0.1"
- glob-to-regexp "^0.3.0"
+ "@nodelib/fs.stat" "2.0.4"
+ run-parallel "^1.1.9"
-"@nodelib/fs.stat@^1.1.2":
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b"
- integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==
+"@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2":
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz#a3f2dd61bab43b8db8fa108a121cfffe4c676655"
+ integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==
+
+"@nodelib/fs.walk@^1.2.3":
+ version "1.2.6"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz#cce9396b30aa5afe9e3756608f5831adcb53d063"
+ integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==
+ dependencies:
+ "@nodelib/fs.scandir" "2.1.4"
+ fastq "^1.6.0"
"@npmcli/move-file@^1.0.1":
version "1.0.1"
@@ -1162,6 +1185,58 @@
resolved "https://registry.yarnpkg.com/@rails/ujs/-/ujs-6.1.0.tgz#9a48df6511cb2b472c9f596c1f37dc0af022e751"
integrity sha512-kQNKyM4ePAc4u9eR1c4OqrbAHH+3SJXt++8izIjeaZeg+P7yBtgoF/dogMD/JPPowNC74ACFpM/4op0Ggp/fPw==
+"@sentry/browser@^5.22.3":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-5.30.0.tgz#c28f49d551db3172080caef9f18791a7fd39e3b3"
+ integrity sha512-rOb58ZNVJWh1VuMuBG1mL9r54nZqKeaIlwSlvzJfc89vyfd7n6tQ1UXMN383QBz/MS5H5z44Hy5eE+7pCrYAfw==
+ dependencies:
+ "@sentry/core" "5.30.0"
+ "@sentry/types" "5.30.0"
+ "@sentry/utils" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/core@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3"
+ integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==
+ dependencies:
+ "@sentry/hub" "5.30.0"
+ "@sentry/minimal" "5.30.0"
+ "@sentry/types" "5.30.0"
+ "@sentry/utils" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/hub@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100"
+ integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==
+ dependencies:
+ "@sentry/types" "5.30.0"
+ "@sentry/utils" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/minimal@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b"
+ integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==
+ dependencies:
+ "@sentry/hub" "5.30.0"
+ "@sentry/types" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/types@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402"
+ integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==
+
+"@sentry/utils@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980"
+ integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==
+ dependencies:
+ "@sentry/types" "5.30.0"
+ tslib "^1.9.3"
+
"@sindresorhus/is@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
@@ -1186,6 +1261,21 @@
resolved "https://registry.yarnpkg.com/@sourcegraph/code-host-integration/-/code-host-integration-0.0.52.tgz#3668364647b9248a0c43d738f7b046c551311338"
integrity sha512-HYmiGuQ3XOQHJIQaRv63Wcdl6y1rgryBrCLzJd/mG5gkkhydTqBuf3wWFKgfL3PCm026OrjXu4PvOYU1fCTZJQ==
+"@stylelint/postcss-css-in-js@^0.37.2":
+ version "0.37.2"
+ resolved "https://registry.yarnpkg.com/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.2.tgz#7e5a84ad181f4234a2480803422a47b8749af3d2"
+ integrity sha512-nEhsFoJurt8oUmieT8qy4nk81WRHmJynmVwn/Vts08PL9fhgIsMhk1GId5yAN643OzqEEb5S/6At2TZW7pqPDA==
+ dependencies:
+ "@babel/core" ">=7.9.0"
+
+"@stylelint/postcss-markdown@^0.36.2":
+ version "0.36.2"
+ resolved "https://registry.yarnpkg.com/@stylelint/postcss-markdown/-/postcss-markdown-0.36.2.tgz#0a540c4692f8dcdfc13c8e352c17e7bfee2bb391"
+ integrity sha512-2kGbqUVJUGE8dM+bMzXG/PYUWKkjLIkRLWNh39OaADkiabDRdw8ATFCgbMz5xdIcvwspPAluSL7uY+ZiTWdWmQ==
+ dependencies:
+ remark "^13.0.0"
+ unist-util-find-all-after "^3.0.2"
+
"@szmarczak/http-timer@^1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421"
@@ -1342,11 +1432,23 @@
resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4=
+"@types/mdast@^3.0.0":
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.3.tgz#2d7d671b1cd1ea3deb306ea75036c2a0407d2deb"
+ integrity sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==
+ dependencies:
+ "@types/unist" "*"
+
"@types/minimatch@*":
version "3.0.3"
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
+"@types/minimist@^1.2.0":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.1.tgz#283f669ff76d7b8260df8ab7a4262cc83d988256"
+ integrity sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==
+
"@types/node@*", "@types/node@>=6":
version "10.12.9"
resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.9.tgz#a07bfa74331471e1dc22a47eb72026843f7b95c8"
@@ -1357,6 +1459,11 @@
resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e"
integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==
+"@types/parse-json@^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
+ integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
+
"@types/parse5@^5":
version "5.0.0"
resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.0.tgz#9ae2106efc443d7c1e26570aa8247828c9c80f11"
@@ -1379,28 +1486,11 @@
dependencies:
"@types/estree" "*"
-"@types/unist@*", "@types/unist@^2.0.0":
+"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2":
version "2.0.3"
resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e"
integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==
-"@types/vfile-message@*":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@types/vfile-message/-/vfile-message-1.0.1.tgz#e1e9895cc6b36c462d4244e64e6d0b6eaf65355a"
- integrity sha512-mlGER3Aqmq7bqR1tTTIVHq8KSAFFRyGbrxuM8C/H82g6k7r2fS+IMEkIu3D7JHzG10NvPdR8DNx0jr0pwpp4dA==
- dependencies:
- "@types/node" "*"
- "@types/unist" "*"
-
-"@types/vfile@^3.0.0":
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/@types/vfile/-/vfile-3.0.2.tgz#19c18cd232df11ce6fa6ad80259bc86c366b09b9"
- integrity sha512-b3nLFGaGkJ9rzOcuXRfHkZMdjsawuDD0ENL9fzTophtBg8FJHSGbH7daXkEpcwy3v7Xol3pAvsmlYyFhR4pqJw==
- dependencies:
- "@types/node" "*"
- "@types/unist" "*"
- "@types/vfile-message" "*"
-
"@types/yargs-parser@*":
version "15.0.0"
resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d"
@@ -1886,6 +1976,15 @@ apollo-link-http-common@^0.2.14, apollo-link-http-common@^0.2.16:
ts-invariant "^0.4.0"
tslib "^1.9.3"
+apollo-link-http@^1.5.17:
+ version "1.5.17"
+ resolved "https://registry.yarnpkg.com/apollo-link-http/-/apollo-link-http-1.5.17.tgz#499e9f1711bf694497f02c51af12d82de5d8d8ba"
+ integrity sha512-uWcqAotbwDEU/9+Dm9e1/clO7hTB2kQ/94JYcGouBVLjoKmTeJTUPQKcJGpPwUjZcSqgYicbFqQSoJIW0yrFvg==
+ dependencies:
+ apollo-link "^1.2.14"
+ apollo-link-http-common "^0.2.16"
+ tslib "^1.9.3"
+
apollo-link@^1.0.0, apollo-link@^1.2.12, apollo-link@^1.2.14:
version "1.2.14"
resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.14.tgz#3feda4b47f9ebba7f4160bef8b977ba725b684d9"
@@ -1997,13 +2096,18 @@ array-includes@^3.1.1:
get-intrinsic "^1.0.1"
is-string "^1.0.5"
-array-union@^1.0.1, array-union@^1.0.2:
+array-union@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=
dependencies:
array-uniq "^1.0.1"
+array-union@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
+ integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
+
array-uniq@^1.0.1:
version "1.0.3"
resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
@@ -2066,11 +2170,6 @@ assign-symbols@^1.0.0:
resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
-astral-regex@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
- integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==
-
astral-regex@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31"
@@ -2103,18 +2202,18 @@ atob@^2.1.2:
resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
-autoprefixer@^9.5.1:
- version "9.6.1"
- resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.6.1.tgz#51967a02d2d2300bb01866c1611ec8348d355a47"
- integrity sha512-aVo5WxR3VyvyJxcJC3h4FKfwCQvQWb1tSI5VHNibddCVWrcD1NvlxEweg3TSgiPztMnWfjpy2FURKA2kvDE+Tw==
+autoprefixer@^9.8.6:
+ version "9.8.6"
+ resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f"
+ integrity sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==
dependencies:
- browserslist "^4.6.3"
- caniuse-lite "^1.0.30000980"
- chalk "^2.4.2"
+ browserslist "^4.12.0"
+ caniuse-lite "^1.0.30001109"
+ colorette "^1.2.1"
normalize-range "^0.1.2"
num2fraction "^1.2.2"
- postcss "^7.0.17"
- postcss-value-parser "^4.0.0"
+ postcss "^7.0.32"
+ postcss-value-parser "^4.1.0"
autosize@^4.0.2:
version "4.0.2"
@@ -2271,9 +2370,9 @@ backo2@1.0.2:
integrity sha1-MasayLEpNjRj41s+u2n038+6eUc=
bail@^1.0.0:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.3.tgz#63cfb9ddbac829b02a3128cd53224be78e6c21a3"
- integrity sha512-1X8CnjFVQ+a+KW36uBNMTU5s8+v5FzeqrP7hTG5aTb4aPreSbZJlhwPon9VKMuEVgV++JM+SQrALY3kr7eswdg==
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776"
+ integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==
balanced-match@^1.0.0:
version "1.0.0"
@@ -2531,7 +2630,7 @@ browserify-zlib@^0.2.0:
dependencies:
pako "~1.0.5"
-browserslist@^4.12.0, browserslist@^4.6.3, browserslist@^4.8.3:
+browserslist@^4.12.0, browserslist@^4.8.3:
version "4.16.1"
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.1.tgz#bf757a2da376b3447b800a16f0f1c96358138766"
integrity sha512-UXhDrwqsNcpTYJBTZsbGATDxZbiVDsx6UjpmRUmtnP10pr8wAYr5LgFoEFw9ixriQH2mv/NX2SfGzE/o8GndLA==
@@ -2697,30 +2796,11 @@ call-me-maybe@^1.0.1:
resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b"
integrity sha1-JtII6onje1y95gJQoV8DHBak1ms=
-caller-callsite@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134"
- integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=
- dependencies:
- callsites "^2.0.0"
-
-caller-path@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4"
- integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=
- dependencies:
- caller-callsite "^2.0.0"
-
callsite@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20"
integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA=
-callsites@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
- integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=
-
callsites@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.0.0.tgz#fb7eb569b72ad7a45812f93fd9430a3e410b3dd3"
@@ -2742,25 +2822,20 @@ camelcase-keys@^2.0.0:
camelcase "^2.0.0"
map-obj "^1.0.0"
-camelcase-keys@^4.0.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77"
- integrity sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=
+camelcase-keys@^6.2.2:
+ version "6.2.2"
+ resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0"
+ integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==
dependencies:
- camelcase "^4.1.0"
- map-obj "^2.0.0"
- quick-lru "^1.0.0"
+ camelcase "^5.3.1"
+ map-obj "^4.0.0"
+ quick-lru "^4.0.1"
camelcase@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=
-camelcase@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
- integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=
-
camelcase@^5.0.0, camelcase@^5.2.0, camelcase@^5.3.1:
version "5.3.1"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
@@ -2771,10 +2846,10 @@ camelcase@^6.0.0:
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.0.0.tgz#5259f7c30e35e278f1bdc2a4d91230b37cad981e"
integrity sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==
-caniuse-lite@^1.0.30000980, caniuse-lite@^1.0.30001173:
- version "1.0.30001178"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001178.tgz#3ad813b2b2c7d585b0be0a2440e1e233c6eabdbc"
- integrity sha512-VtdZLC0vsXykKni8Uztx45xynytOi71Ufx9T8kHptSw9AL4dpqailUJJHavttuzUe1KYuBYtChiWv+BAb7mPmQ==
+caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001173:
+ version "1.0.30001185"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001185.tgz#3482a407d261da04393e2f0d61eefbc53be43b95"
+ integrity sha512-Fpi4kVNtNvJ15H0F6vwmXtb3tukv3Zg3qhKkOGUq7KJ1J6b9kf4dnNgtEAFXhRsJo0gNj9W60+wBvn0JcTvdTg==
capture-exit@^2.0.0:
version "2.0.0"
@@ -2795,11 +2870,6 @@ catharsis@~0.8.9:
dependencies:
underscore-contrib "~0.3.0"
-ccount@^1.0.0:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.0.3.tgz#f1cec43f332e2ea5a569fd46f9f5bde4e6102aff"
- integrity sha512-Jt9tIBkRc9POUof7QA/VwWd+58fKkEEfI+/t1/eOlxKM7ZhrczNzMFefge7Ai+39y1pR/pP6cI19guHy3FSLmw==
-
chalk@^1.1.1:
version "1.1.3"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
@@ -2841,25 +2911,20 @@ 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-html4@^1.0.0:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-1.1.2.tgz#c44fdde3ce66b52e8d321d6c1bf46101f0150610"
- integrity sha512-sIrXwyna2+5b0eB9W149izTPJk/KkJTg6mEzDGibwBUkyH1SbDa+nf515Ppdi3MaH35lW0JFJDWeq9Luzes1Iw==
-
character-entities-legacy@^1.0.0:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.2.tgz#7c6defb81648498222c9855309953d05f4d63a9c"
- integrity sha512-9NB2VbXtXYWdXzqrvAHykE/f0QJxzaKIpZ5QzNZrrgQ7Iyxr2vnfS8fCBNVW9nUEZE0lo57nxKRqnzY/dKrwlA==
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1"
+ integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==
character-entities@^1.0.0:
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.2.tgz#58c8f371c0774ef0ba9b2aca5f00d8f100e6e363"
- integrity sha512-sMoHX6/nBiy3KKfC78dnEalnpn0Az0oSNvqUWYTtYrhRI5iUIYsROU48G+E+kMFQzqXaJ8kHJZ85n7y6/PHgwQ==
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b"
+ integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==
character-reference-invalid@^1.0.0:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.2.tgz#21e421ad3d84055952dab4a43a04e73cd425d3ed"
- integrity sha512-7I/xceXfKyUJmSAn/jw8ve/9DyOP7XxufNYLI9Px7CmsKgEUaZLUTax6nZxGQtaoiZCjpu6cHPj20xC/vqRReQ==
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560"
+ integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==
charenc@~0.0.1:
version "0.0.2"
@@ -3036,11 +3101,6 @@ codesandbox-import-utils@^1.2.3:
istextorbinary "^2.2.1"
lz-string "^1.4.4"
-collapse-white-space@^1.0.2:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.5.tgz#c2495b699ab1ed380d29a1091e01063e75dbbe3a"
- integrity sha512-703bOOmytCYAX9cXYqoikYIx6twmFCXsnzRQheBcTG3nzKYBR4P/+wkYeH+Mvj7qUz8zZDtdyzbxfnEi/kYzRQ==
-
collect-v8-coverage@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59"
@@ -3355,10 +3415,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.1.3, core-js@^3.8.3:
- version "3.8.3"
- resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.8.3.tgz#c21906e1f14f3689f93abcc6e26883550dd92dd0"
- integrity sha512-KPYXeVZYemC2TkNEkX/01I+7yd+nX3KddKwZ1Ww7SKWdI2wQprSgLmrTddT8nw92AjEklTsPBoSdQBhbI1bQ6Q==
+core-js@^3.1.3, core-js@^3.9.1:
+ version "3.9.1"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.9.1.tgz#cec8de593db8eb2a85ffb0dbdeb312cb6e5460ae"
+ integrity sha512-gSjRvzkxQc1zjM/5paAmL4idJBFzuJoo+jDjF1tStYFMV2ERfD02HhahhCGXUyHxQRG4yFKVSdO6g62eoRMcDg==
core-js@~2.3.0:
version "2.3.0"
@@ -3370,15 +3430,16 @@ core-util-is@1.0.2, core-util-is@~1.0.0:
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
-cosmiconfig@^5.2.0:
- version "5.2.1"
- resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a"
- integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==
+cosmiconfig@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3"
+ integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==
dependencies:
- import-fresh "^2.0.0"
- is-directory "^0.3.1"
- js-yaml "^3.13.1"
- parse-json "^4.0.0"
+ "@types/parse-json" "^4.0.0"
+ import-fresh "^3.2.1"
+ parse-json "^5.0.0"
+ path-type "^4.0.0"
+ yaml "^1.10.0"
create-ecdh@^4.0.0:
version "4.0.0"
@@ -3482,6 +3543,11 @@ css-b64-images@~0.2.5:
resolved "https://registry.yarnpkg.com/css-b64-images/-/css-b64-images-0.2.5.tgz#42005d83204b2b4a5d93b6b1a5644133b5927a02"
integrity sha1-QgBdgyBLK0pdk7axpWRBM7WSegI=
+css-color-names@0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
+ integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=
+
css-loader@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-2.1.1.tgz#d8254f72e412bb2238bb44dd674ffbef497333ea"
@@ -3504,6 +3570,20 @@ css-selector-parser@^1.3:
resolved "https://registry.yarnpkg.com/css-selector-parser/-/css-selector-parser-1.3.0.tgz#5f1ad43e2d8eefbfdc304fcd39a521664943e3eb"
integrity sha1-XxrUPi2O77/cME/NOaUhZklD4+s=
+css-shorthand-properties@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/css-shorthand-properties/-/css-shorthand-properties-1.1.1.tgz#1c808e63553c283f289f2dd56fcee8f3337bd935"
+ integrity sha512-Md+Juc7M3uOdbAFwOYlTrccIZ7oCFuzrhKYQjdeUEW/sE1hv17Jp/Bws+ReOPpGVBTYCBoYo+G17V5Qo8QQ75A==
+
+css-values@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/css-values/-/css-values-0.1.0.tgz#128b7ce103d4dc027a814a5d5995c54781d7b4c6"
+ integrity sha1-Eot84QPU3AJ6gUpdWZXFR4HXtMY=
+ dependencies:
+ css-color-names "0.0.4"
+ ends-with "^0.2.0"
+ postcss-value-parser "^3.3.0"
+
css@^2.1.0:
version "2.2.4"
resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929"
@@ -3894,14 +3974,14 @@ debug@^3.1.0, debug@^3.1.1, debug@^3.2.6:
dependencies:
ms "^2.1.1"
-debug@^4.0.1, debug@^4.1.0, debug@^4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
- integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
+debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
+ integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
dependencies:
- ms "^2.1.1"
+ ms "2.1.2"
-decamelize-keys@^1.0.0:
+decamelize-keys@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9"
integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=
@@ -4105,13 +4185,20 @@ diffie-hellman@^5.0.0:
miller-rabin "^4.0.0"
randombytes "^2.0.0"
-dir-glob@^2.0.0, dir-glob@^2.2.2:
+dir-glob@^2.0.0:
version "2.2.2"
resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4"
integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==
dependencies:
path-type "^3.0.0"
+dir-glob@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
+ integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
+ dependencies:
+ path-type "^4.0.0"
+
dns-equal@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d"
@@ -4197,15 +4284,15 @@ domain-browser@^1.1.1:
resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc"
integrity sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=
-domelementtype@1, domelementtype@^1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2"
- integrity sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=
+domelementtype@1, domelementtype@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f"
+ integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==
domelementtype@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d"
- integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.1.0.tgz#a851c080a6d1c3d94344aed151d99f669edf585e"
+ integrity sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==
domexception@^2.0.1:
version "2.0.1"
@@ -4215,9 +4302,9 @@ domexception@^2.0.1:
webidl-conversions "^5.0.0"
domhandler@^2.3.0:
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.1.tgz#892e47000a99be55bbf3774ffea0561d8879c259"
- integrity sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803"
+ integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==
dependencies:
domelementtype "1"
@@ -4227,20 +4314,13 @@ dompurify@^2.2.6:
integrity sha512-7b7ZArhhH0SP6W2R9cqK6RjaU82FZ2UPM7RO8qN1b1wyvC/NY1FNWcX1Pu00fFOAnzEORtwXe4bPaClg6pUybQ==
domutils@^1.5.1:
- version "1.6.2"
- resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.6.2.tgz#1958cc0b4c9426e9ed367fb1c8e854891b0fa3ff"
- integrity sha1-GVjMC0yUJuntNn+xyOhUiRsPo/8=
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
+ integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==
dependencies:
dom-serializer "0"
domelementtype "1"
-dot-prop@^4.1.1:
- version "4.2.1"
- resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.1.tgz#45884194a71fc2cda71cbb4bceb3a4dd2f433ba4"
- integrity sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==
- dependencies:
- is-obj "^1.0.0"
-
dot-prop@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb"
@@ -4368,6 +4448,11 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0:
dependencies:
once "^1.4.0"
+ends-with@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/ends-with/-/ends-with-0.2.0.tgz#2f9da98d57a50cfda4571ce4339000500f4e6b8a"
+ integrity sha1-L52pjVelDP2kVxzkM5AAUA9Oa4o=
+
engine.io-client@~3.2.0:
version "3.2.1"
resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.2.1.tgz#6f54c0475de487158a1a7c77d10178708b6add36"
@@ -4438,10 +4523,10 @@ ent@~2.2.0:
resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d"
integrity sha1-6WQhkyWiHQX0RGai9obtbOX13R0=
-entities@^1.1.1, entities@~1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0"
- integrity sha1-blwtClYhtdra7O+AuQ7ftc13cvA=
+entities@^1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56"
+ integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==
entities@^2.0.0, entities@~2.0.0:
version "2.0.3"
@@ -4714,13 +4799,13 @@ eslint-visitor-keys@^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@7.19.0:
- version "7.19.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.19.0.tgz#6719621b196b5fad72e43387981314e5d0dc3f41"
- integrity sha512-CGlMgJY56JZ9ZSYhJuhow61lMPPjUzWmChFya71Z/jilVos7mR/jPgaEfVGgMBY5DshbKdG8Ezb8FDCHcoMEMg==
+eslint@7.21.0:
+ version "7.21.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.21.0.tgz#4ecd5b8c5b44f5dedc9b8a110b01bbfeb15d1c83"
+ integrity sha512-W2aJbXpMNofUp0ztQaF40fveSsJBjlSCSWpy//gzfTvwC+USs/nceBrKmlJOiM8r1bLwP2EuYkCqArn/6QTIgg==
dependencies:
- "@babel/code-frame" "^7.0.0"
- "@eslint/eslintrc" "^0.3.0"
+ "@babel/code-frame" "7.12.11"
+ "@eslint/eslintrc" "^0.4.0"
ajv "^6.10.0"
chalk "^4.0.0"
cross-spawn "^7.0.2"
@@ -4731,9 +4816,9 @@ eslint@7.19.0:
eslint-utils "^2.1.0"
eslint-visitor-keys "^2.0.0"
espree "^7.3.1"
- esquery "^1.2.0"
+ esquery "^1.4.0"
esutils "^2.0.2"
- file-entry-cache "^6.0.0"
+ file-entry-cache "^6.0.1"
functional-red-black-tree "^1.0.1"
glob-parent "^5.0.0"
globals "^12.1.0"
@@ -4780,10 +4865,10 @@ esprima@^4.0.0, esprima@^4.0.1:
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
-esquery@^1.0.1, esquery@^1.2.0:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57"
- integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==
+esquery@^1.0.1, esquery@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5"
+ integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==
dependencies:
estraverse "^5.1.0"
@@ -5031,17 +5116,17 @@ fast-deep-equal@^3.1.1:
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
-fast-glob@^2.2.6:
- version "2.2.6"
- resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.6.tgz#a5d5b697ec8deda468d85a74035290a025a95295"
- integrity sha512-0BvMaZc1k9F+MeWWMe8pL6YltFzZYcJsYU7D4JyDA6PAczaXvxqQQ/z+mDF7/4Mw01DeUc+i3CTKajnkANkV4w==
+fast-glob@^3.1.1, fast-glob@^3.2.5:
+ version "3.2.5"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661"
+ integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==
dependencies:
- "@mrmlnc/readdir-enhanced" "^2.2.1"
- "@nodelib/fs.stat" "^1.1.2"
- glob-parent "^3.1.0"
- is-glob "^4.0.0"
- merge2 "^1.2.3"
- micromatch "^3.1.10"
+ "@nodelib/fs.stat" "^2.0.2"
+ "@nodelib/fs.walk" "^1.2.3"
+ glob-parent "^5.1.0"
+ merge2 "^1.3.0"
+ micromatch "^4.0.2"
+ picomatch "^2.2.1"
fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0:
version "2.1.0"
@@ -5058,12 +5143,24 @@ fast-mersenne-twister@1.0.2:
resolved "https://registry.yarnpkg.com/fast-mersenne-twister/-/fast-mersenne-twister-1.0.2.tgz#5ead7caf3ace592a5789d11767732bd81cbaaa56"
integrity sha512-IaClPxsoBu3MxGpcURyjV8otT5Bj4ARoK0KBCJGnEVnD1A/qclL5eIeYiUuwG/WWJPxL1jlK61HTm2T6SBmvBQ==
-fault@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/fault/-/fault-1.0.2.tgz#c3d0fec202f172a3a4d414042ad2bb5e2a3ffbaa"
- integrity sha512-o2eo/X2syzzERAtN5LcGbiVQ0WwZSlN3qLtadwAz3X8Bu+XWD16dja/KMsjZLiQr+BLGPDnHGkc4yUJf1Xpkpw==
+fastest-levenshtein@^1.0.12:
+ version "1.0.12"
+ resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2"
+ integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==
+
+fastq@^1.6.0:
+ version "1.10.1"
+ resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.10.1.tgz#8b8f2ac8bf3632d67afcd65dac248d5fdc45385e"
+ integrity sha512-AWuv6Ery3pM+dY7LYS8YIaCiQvUaos9OB1RyNgaOWnaX+Tik7Onvcsf8x8c+YtDeT0maYLniBip2hox5KtEXXA==
+ dependencies:
+ reusify "^1.0.4"
+
+fault@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/fault/-/fault-1.0.4.tgz#eafcfc0a6d214fc94601e170df29954a4f842f13"
+ integrity sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==
dependencies:
- format "^0.2.2"
+ format "^0.2.0"
faye-websocket@^0.11.3:
version "0.11.3"
@@ -5084,17 +5181,10 @@ figgy-pudding@^3.5.1:
resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790"
integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==
-file-entry-cache@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c"
- integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==
- dependencies:
- flat-cache "^2.0.1"
-
-file-entry-cache@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.0.tgz#7921a89c391c6d93efec2169ac6bf300c527ea0a"
- integrity sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==
+file-entry-cache@^6.0.0, file-entry-cache@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
+ integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==
dependencies:
flat-cache "^3.0.4"
@@ -5225,15 +5315,6 @@ findup-sync@^3.0.0:
micromatch "^3.0.4"
resolve-dir "^1.0.1"
-flat-cache@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0"
- integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==
- dependencies:
- flatted "^2.0.0"
- rimraf "2.6.3"
- write "1.0.3"
-
flat-cache@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11"
@@ -5284,7 +5365,7 @@ form-data@~2.3.2:
combined-stream "^1.0.6"
mime-types "^2.1.12"
-format@^0.2.2:
+format@^0.2.0:
version "0.2.2"
resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b"
integrity sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=
@@ -5430,10 +5511,10 @@ get-stdin@^6.0.0:
resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b"
integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==
-get-stdin@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-7.0.0.tgz#8d5de98f15171a125c5e516643c7a6d0ea8a96f6"
- integrity sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==
+get-stdin@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53"
+ integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==
get-stdin@~5.0.1:
version "5.0.1"
@@ -5494,18 +5575,13 @@ glob-parent@^3.1.0:
is-glob "^3.1.0"
path-dirname "^1.0.0"
-glob-parent@^5.0.0, glob-parent@~5.1.0:
+glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0:
version "5.1.1"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229"
integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==
dependencies:
is-glob "^4.0.1"
-glob-to-regexp@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab"
- integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=
-
glob-to-regexp@^0.4.0:
version "0.4.1"
resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
@@ -5586,6 +5662,18 @@ globals@^12.1.0:
dependencies:
type-fest "^0.8.1"
+globby@^11.0.2:
+ version "11.0.2"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.2.tgz#1af538b766a3b540ebfb58a32b2e2d5897321d83"
+ integrity sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==
+ dependencies:
+ array-union "^2.1.0"
+ dir-glob "^3.0.1"
+ fast-glob "^3.1.1"
+ ignore "^5.1.4"
+ merge2 "^1.3.0"
+ slash "^3.0.0"
+
globby@^6.1.0:
version "6.1.0"
resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c"
@@ -5609,20 +5697,6 @@ globby@^7.1.1:
pify "^3.0.0"
slash "^1.0.0"
-globby@^9.2.0:
- version "9.2.0"
- resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d"
- integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==
- dependencies:
- "@types/glob" "^7.1.1"
- array-union "^1.0.2"
- dir-glob "^2.2.2"
- fast-glob "^2.2.6"
- glob "^7.1.3"
- ignore "^4.0.3"
- pify "^4.0.1"
- slash "^2.0.0"
-
globjoin@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43"
@@ -5637,12 +5711,12 @@ globule@^1.0.0:
lodash "~4.17.10"
minimatch "~3.0.2"
-gonzales-pe@^4.2.3:
- version "4.2.3"
- resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-4.2.3.tgz#41091703625433285e0aee3aa47829fc1fbeb6f2"
- integrity sha512-Kjhohco0esHQnOiqqdJeNz/5fyPkOMD/d6XVjwTAoPGUFh0mCollPUTUTa2OZy4dYNAqlPIQdTiNzJTWdd9Htw==
+gonzales-pe@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-4.3.0.tgz#fe9dec5f3c557eead09ff868c65826be54d067b3"
+ integrity sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==
dependencies:
- minimist "1.1.x"
+ minimist "^1.2.5"
good-listener@^1.2.2:
version "1.2.2"
@@ -5737,6 +5811,11 @@ har-validator@~5.1.3:
ajv "^6.12.3"
har-schema "^2.0.0"
+hard-rejection@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883"
+ integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==
+
has-ansi@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
@@ -5852,10 +5931,10 @@ he@^1.1.0, he@^1.1.1, he@^1.2.0:
resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
-highlight.js@^9.13.1, highlight.js@~9.13.0:
- version "9.13.1"
- resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.13.1.tgz#054586d53a6863311168488a0f58d6c505ce641e"
- integrity sha512-Sc28JNQNDzaH6PORtRLMvif9RSn1mYuOoX3omVjnb0+HbpPygU2ALBI0R/wsiqCb4/fcp07Gdo8g+fhtFrQl6A==
+highlight.js@^10.6.0, highlight.js@~10.6.0:
+ version "10.6.0"
+ resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.6.0.tgz#0073aa71d566906965ba6e1b7be7b2682f5e18b6"
+ integrity sha512-8mlRcn5vk/r4+QcqerapwBYTe+iPL5ih6xrNylxrnBdHQiijDETfXX7VIxC3UiCRiINBJfANBAsPzAvRQj8RpQ==
hmac-drbg@^1.0.1:
version "1.0.1"
@@ -5883,6 +5962,13 @@ hosted-git-info@^2.1.4:
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488"
integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==
+hosted-git-info@^3.0.6:
+ version "3.0.8"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.8.tgz#6e35d4cc87af2c5f816e4cb9ce350ba87a3f370d"
+ integrity sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==
+ dependencies:
+ lru-cache "^6.0.0"
+
hpack.js@^2.1.6:
version "2.1.6"
resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2"
@@ -5923,22 +6009,22 @@ html-minifier@^4.0.0:
relateurl "^0.2.7"
uglify-js "^3.5.1"
-html-tags@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.0.0.tgz#41f57708c9e6b7b46a00a22317d614c4a2bab166"
- integrity sha512-xiXEBjihaNI+VZ2mKEoI5ZPxqUsevTKM+aeeJ/W4KAg2deGE35minmCJMn51BvwJZmiHaeAxrb2LAS0yZJxuuA==
+html-tags@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140"
+ integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==
htmlparser2@^3.10.0:
- version "3.10.0"
- resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.0.tgz#5f5e422dcf6119c0d983ed36260ce9ded0bee464"
- integrity sha512-J1nEUGv+MkXS0weHNWVKJJ+UrLfePxRWpN3C9bEi9fLxL2+ggW94DQvgYVXsaT30PGwYRIZKNZXuyMhp3Di4bQ==
+ version "3.10.1"
+ resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f"
+ integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==
dependencies:
- domelementtype "^1.3.0"
+ domelementtype "^1.3.1"
domhandler "^2.3.0"
domutils "^1.5.1"
entities "^1.1.1"
inherits "^2.0.1"
- readable-stream "^3.0.6"
+ readable-stream "^3.1.1"
http-cache-semantics@^4.0.0:
version "4.1.0"
@@ -6069,12 +6155,12 @@ ignore@^3.3.5:
resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043"
integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==
-ignore@^4.0.3, ignore@^4.0.6:
+ignore@^4.0.6:
version "4.0.6"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
-ignore@^5.0.6, ignore@~5.1.4:
+ignore@^5.1.4, ignore@^5.1.8, ignore@~5.1.4:
version "5.1.8"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57"
integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==
@@ -6089,14 +6175,6 @@ immer@^7.0.7:
resolved "https://registry.yarnpkg.com/immer/-/immer-7.0.7.tgz#9dfe713d49bf871cc59aedfce59b1992fa37a977"
integrity sha512-Q8yYwVADJXrNfp1ZUAh4XDHkcoE3wpdpb4mC5abDSajs2EbW8+cGdPyAnglMyLnm7EF6ojD2xBFX7L5i4TIytw==
-import-fresh@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546"
- integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY=
- dependencies:
- caller-path "^2.0.0"
- resolve-from "^3.0.0"
-
import-fresh@^3.0.0, import-fresh@^3.2.1:
version "3.3.0"
resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
@@ -6148,11 +6226,6 @@ indent-string@^2.1.0:
dependencies:
repeating "^2.0.0"
-indent-string@^3.0.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289"
- integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=
-
indent-string@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
@@ -6266,19 +6339,14 @@ is-accessor-descriptor@^1.0.0:
kind-of "^6.0.0"
is-alphabetical@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.2.tgz#1fa6e49213cb7885b75d15862fb3f3d96c884f41"
- integrity sha512-V0xN4BYezDHcBSKb1QHUFMlR4as/XEuCZBzMJUU4n7+Cbt33SmUnSol+pnXFvLxSHNq2CemUXNdaXV6Flg7+xg==
-
-is-alphanumeric@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz#4a9cef71daf4c001c1d81d63d140cf53fd6889f4"
- integrity sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d"
+ integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==
is-alphanumerical@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.2.tgz#1138e9ae5040158dc6ff76b820acd6b7a181fd40"
- integrity sha512-pyfU/0kHdISIgslFfZN9nfY1Gk3MquQgUm1mJTjdkEPpkAKNWuBTSqFwewOpR7N351VkErCiyV71zX7mlQQqsg==
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf"
+ integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==
dependencies:
is-alphabetical "^1.0.0"
is-decimal "^1.0.0"
@@ -6301,9 +6369,9 @@ is-buffer@^1.1.5, is-buffer@~1.1.1:
integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
is-buffer@^2.0.0:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725"
- integrity sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191"
+ integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==
is-callable@^1.1.4, is-callable@^1.2.2:
version "1.2.3"
@@ -6337,9 +6405,9 @@ is-date-object@^1.0.1:
integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=
is-decimal@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.2.tgz#894662d6a8709d307f3a276ca4339c8fa5dff0ff"
- integrity sha512-TRzl7mOCchnhchN+f3ICUCzYvL9ul7R+TYOsZ8xia++knyZAJfv/uA1FvQXsAnYIl1T3B2X5E/J7Wb1QXiIBXg==
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5"
+ integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==
is-descriptor@^0.1.0:
version "0.1.6"
@@ -6359,11 +6427,6 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2:
is-data-descriptor "^1.0.0"
kind-of "^6.0.2"
-is-directory@^0.3.1:
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
- integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=
-
is-docker@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156"
@@ -6428,9 +6491,9 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1:
is-extglob "^2.1.1"
is-hexadecimal@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.2.tgz#b6e710d7d07bb66b98cb8cece5c9b4921deeb835"
- integrity sha512-but/G3sapV3MNyqiDBLrOi4x8uCIw0RY3o/Vb5GT0sMFHrVV7731wFSVy41T5FO1og7G0gXLJh0MkgPRouko/A==
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7"
+ integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==
is-installed-globally@^0.3.1:
version "0.3.2"
@@ -6462,11 +6525,6 @@ is-number@^7.0.0:
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
-is-obj@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
- integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8=
-
is-obj@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
@@ -6501,6 +6559,11 @@ is-plain-obj@^1.1.0:
resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4=
+is-plain-obj@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287"
+ integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==
+
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"
@@ -6558,11 +6621,6 @@ is-utf8@^0.2.0:
resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=
-is-whitespace-character@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.2.tgz#ede53b4c6f6fb3874533751ec9280d01928d03ed"
- integrity sha512-SzM+T5GKUCtLhlHFKt2SDAX2RFzfS6joT91F2/WSi9LxgFdsnhfPK/UIA+JhRR2xuyLdrCys2PiFDrtn1fU5hQ==
-
is-whitespace@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/is-whitespace/-/is-whitespace-0.3.0.tgz#1639ecb1be036aec69a54cbb401cfbed7114ab7f"
@@ -6573,11 +6631,6 @@ is-windows@^1.0.1, is-windows@^1.0.2:
resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
-is-word-character@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.2.tgz#46a5dac3f2a1840898b91e576cd40d493f3ae553"
- integrity sha512-T3FlsX8rCHAH8e7RE7PfOPZVFQlcV3XRF9eOOBQ1uf70OxO7CjjSOjeImMPCADBdYWcStAbVbYvJ1m2D3tb+EA==
-
is-wsl@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d"
@@ -7325,7 +7378,7 @@ json-buffer@3.0.0:
resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=
-json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2:
+json-parse-better-errors@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
@@ -7554,7 +7607,7 @@ kind-of@^5.0.0:
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
-kind-of@^6.0.0, kind-of@^6.0.2:
+kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3:
version "6.0.3"
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
@@ -7571,10 +7624,10 @@ kleur@^3.0.3:
resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
-known-css-properties@^0.14.0:
- version "0.14.0"
- resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.14.0.tgz#d7032b4334a32dc22e6e46b081ec789daf18756c"
- integrity sha512-P+0a/gBzLgVlCnK8I7VcD0yuYJscmWn66wH9tlKsQnmVdg689tLEmziwB9PuazZYLkcm07fvWOKCJJqI55sD5Q==
+known-css-properties@^0.20.0:
+ version "0.20.0"
+ resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.20.0.tgz#0570831661b47dd835293218381166090ff60e96"
+ integrity sha512-URvsjaA9ypfreqJ2/ylDr5MUERhJZ+DhguoWRr2xgS5C7aGCalXo+ewL+GixgKBfhT2vuL02nbIgNGqVWgTOYw==
latest-version@^5.0.0:
version "5.1.0"
@@ -7663,16 +7716,6 @@ load-json-file@^2.0.0:
pify "^2.0.0"
strip-bom "^3.0.0"
-load-json-file@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b"
- integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs=
- dependencies:
- graceful-fs "^4.1.2"
- parse-json "^4.0.0"
- pify "^3.0.0"
- strip-bom "^3.0.0"
-
loader-runner@^2.4.0:
version "2.4.0"
resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357"
@@ -7864,19 +7907,19 @@ lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.1
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
-log-symbols@^2.1.0, log-symbols@^2.2.0:
+log-symbols@^2.1.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a"
integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==
dependencies:
chalk "^2.0.1"
-log-symbols@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4"
- integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==
+log-symbols@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920"
+ integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==
dependencies:
- chalk "^2.4.2"
+ chalk "^4.0.0"
log4js@^4.0.0:
version "4.5.1"
@@ -7894,10 +7937,10 @@ loglevel@^1.6.8:
resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197"
integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==
-longest-streak@^2.0.1:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.2.tgz#2421b6ba939a443bb9ffebf596585a50b4c38e2e"
- integrity sha512-TmYTeEYxiAmSVdpbnQDXGtvYOIRsCMg89CVZzwzc2o7GFL1CjoiRPjH5ec0NFAVlAx3fVof9dX/t6KKRAo2OWA==
+longest-streak@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4"
+ integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==
loose-envify@^1.0.0:
version "1.4.0"
@@ -7929,13 +7972,13 @@ lowercase-keys@^2.0.0:
resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==
-lowlight@^1.11.0:
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.11.0.tgz#1304d83005126d4e8b1dc0f07981e9b689ec2efc"
- integrity sha512-xrGGN6XLL7MbTMdPD6NfWPwY43SNkjf/d0mecSx/CW36fUZTjRHEq0/Cdug3TWKtRXLWi7iMl1eP0olYxj/a4A==
+lowlight@^1.17.0:
+ version "1.19.0"
+ resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.19.0.tgz#b8544199cafcf10c5731b21c7458c358f79a2a97"
+ integrity sha512-NIskvQ1d1ovKyUytkMpT8+8Bhq3Ub54os1Xp4RAC9uNbXH1YVRf5NERq7JNzapEe5BzUc1Cj4F0I+eLBBFj6hA==
dependencies:
- fault "^1.0.2"
- highlight.js "~9.13.0"
+ fault "^1.0.0"
+ highlight.js "~10.6.0"
lru-cache@4.1.x, lru-cache@^4.0.1, lru-cache@^4.1.2, lru-cache@^4.1.5:
version "4.1.5"
@@ -8001,10 +8044,10 @@ map-obj@^1.0.0, map-obj@^1.0.1:
resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=
-map-obj@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9"
- integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk=
+map-obj@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.1.0.tgz#b91221b542734b9f14256c0132c897c5d7256fd5"
+ integrity sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==
map-visit@^1.0.0:
version "1.0.0"
@@ -8013,11 +8056,6 @@ map-visit@^1.0.0:
dependencies:
object-visit "^1.0.0"
-markdown-escapes@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.2.tgz#e639cbde7b99c841c0bacc8a07982873b46d2122"
- integrity sha512-lbRZ2mE3Q9RtLjxZBZ9+IMl68DKIXaVAhwvwn9pmjnPLS0h/6kyBMgNhqi1xFJ/2yv6cSyv0jbiZavZv93JkkA==
-
markdown-it@11.0.0:
version "11.0.0"
resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-11.0.0.tgz#dbfc30363e43d756ebc52c38586b91b90046b876"
@@ -8029,22 +8067,17 @@ markdown-it@11.0.0:
mdurl "^1.0.1"
uc.micro "^1.0.5"
-markdown-it@^8.4.2:
- version "8.4.2"
- resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.2.tgz#386f98998dc15a37722aa7722084f4020bdd9b54"
- integrity sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==
+markdown-it@^10.0.0:
+ version "10.0.0"
+ resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-10.0.0.tgz#abfc64f141b1722d663402044e43927f1f50a8dc"
+ integrity sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==
dependencies:
argparse "^1.0.7"
- entities "~1.1.1"
+ entities "~2.0.0"
linkify-it "^2.0.0"
mdurl "^1.0.1"
uc.micro "^1.0.5"
-markdown-table@^1.1.0:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.2.tgz#c78db948fa879903a41bce522e3b96f801c63786"
- integrity sha512-NcWuJFHDA8V3wkDgR/j4+gZx+YQwstPgfQDV8ndUeWWzta3dnDTBxpVzqS9lkmJAuV5YX35lmyojl6HO5JXAgw==
-
markdownlint-cli@0.24.0:
version "0.24.0"
resolved "https://registry.yarnpkg.com/markdownlint-cli/-/markdownlint-cli-0.24.0.tgz#d1c1d43cd53b87aaec93035b3234eef7097139a8"
@@ -8087,10 +8120,10 @@ mathjax@3:
resolved "https://registry.yarnpkg.com/mathjax/-/mathjax-3.1.2.tgz#95c0d45ce2330ef7b6a815cebe7d61ecc26bbabd"
integrity sha512-BojKspBv4nNWzO1wC6VEI+g9gHDOhkaGHGgLxXkasdU4pwjdO5AXD5M/wcLPkXYPjZ/N+6sU8rjQTlyvN2cWiQ==
-mathml-tag-names@^2.1.0:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.1.tgz#6dff66c99d55ecf739ca53c492e626f1d12a33cc"
- integrity sha512-pWB896KPGSGkp1XtyzRBftpTzwSOL0Gfk0wLvxt4f2mgzjY19o0LxJ3U25vNWTzsh7da+KTbuXQoQ3lOJZ8WHw==
+mathml-tag-names@^2.1.3:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3"
+ integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==
md5.js@^1.3.4:
version "1.3.4"
@@ -8109,12 +8142,33 @@ md5@^2.2.1:
crypt "~0.0.1"
is-buffer "~1.1.1"
-mdast-util-compact@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/mdast-util-compact/-/mdast-util-compact-1.0.2.tgz#c12ebe16fffc84573d3e19767726de226e95f649"
- integrity sha512-d2WS98JSDVbpSsBfVvD9TaDMlqPRz7ohM/11G0rp5jOBb5q96RJ6YLszQ/09AAixyzh23FeIpCGqfaamEADtWg==
+mdast-util-from-markdown@^0.8.0:
+ version "0.8.5"
+ resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz#d1ef2ca42bc377ecb0463a987910dae89bd9a28c"
+ integrity sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==
dependencies:
- unist-util-visit "^1.1.0"
+ "@types/mdast" "^3.0.0"
+ mdast-util-to-string "^2.0.0"
+ micromark "~2.11.0"
+ parse-entities "^2.0.0"
+ unist-util-stringify-position "^2.0.0"
+
+mdast-util-to-markdown@^0.6.0:
+ version "0.6.5"
+ resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz#b33f67ca820d69e6cc527a93d4039249b504bebe"
+ integrity sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==
+ dependencies:
+ "@types/unist" "^2.0.0"
+ longest-streak "^2.0.0"
+ mdast-util-to-string "^2.0.0"
+ parse-entities "^2.0.0"
+ repeat-string "^1.0.0"
+ zwitch "^1.0.0"
+
+mdast-util-to-string@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b"
+ integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==
mdurl@^1.0.1:
version "1.0.1"
@@ -8163,20 +8217,23 @@ meow@^3.7.0:
redent "^1.0.0"
trim-newlines "^1.0.0"
-meow@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4"
- integrity sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==
+meow@^9.0.0:
+ version "9.0.0"
+ resolved "https://registry.yarnpkg.com/meow/-/meow-9.0.0.tgz#cd9510bc5cac9dee7d03c73ee1f9ad959f4ea364"
+ integrity sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==
dependencies:
- camelcase-keys "^4.0.0"
- decamelize-keys "^1.0.0"
- loud-rejection "^1.0.0"
- minimist-options "^3.0.1"
- normalize-package-data "^2.3.4"
- read-pkg-up "^3.0.0"
- redent "^2.0.0"
- trim-newlines "^2.0.0"
- yargs-parser "^10.0.0"
+ "@types/minimist" "^1.2.0"
+ camelcase-keys "^6.2.2"
+ decamelize "^1.2.0"
+ decamelize-keys "^1.1.0"
+ hard-rejection "^2.1.0"
+ minimist-options "4.1.0"
+ normalize-package-data "^3.0.0"
+ read-pkg-up "^7.0.1"
+ redent "^3.0.0"
+ trim-newlines "^3.0.0"
+ type-fest "^0.18.0"
+ yargs-parser "^20.2.3"
merge-descriptors@1.0.1:
version "1.0.1"
@@ -8195,10 +8252,10 @@ merge-stream@^2.0.0:
resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
-merge2@^1.2.3:
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5"
- integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==
+merge2@^1.3.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
+ integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
mermaid@^8.9.0:
version "8.9.0"
@@ -8222,6 +8279,14 @@ methods@~1.1.2:
resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
+micromark@~2.11.0:
+ version "2.11.4"
+ resolved "https://registry.yarnpkg.com/micromark/-/micromark-2.11.4.tgz#d13436138eea826383e822449c9a5c50ee44665a"
+ integrity sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==
+ dependencies:
+ debug "^4.0.0"
+ parse-entities "^2.0.0"
+
micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4:
version "3.1.10"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
@@ -8241,7 +8306,7 @@ micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4:
snapdragon "^0.8.1"
to-regex "^3.0.2"
-micromatch@^4.0.0, micromatch@^4.0.2:
+micromatch@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259"
integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==
@@ -8296,6 +8361,11 @@ min-document@^2.19.0:
dependencies:
dom-walk "^0.1.0"
+min-indent@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869"
+ integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==
+
minify@^4.1.1:
version "4.1.2"
resolved "https://registry.yarnpkg.com/minify/-/minify-4.1.2.tgz#88755f4faa5f7ab6d0c64fdd659aa34ea658f180"
@@ -8326,18 +8396,14 @@ minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2, minimatc
dependencies:
brace-expansion "^1.1.7"
-minimist-options@^3.0.1:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954"
- integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==
+minimist-options@4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619"
+ integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==
dependencies:
arrify "^1.0.1"
is-plain-obj "^1.1.0"
-
-minimist@1.1.x:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.1.3.tgz#3bedfd91a92d39016fcfaa1c681e8faa1a1efda8"
- integrity sha1-O+39kaktOQFvz6ocaB6Pqhoe/ag=
+ kind-of "^6.0.3"
minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5, minimist@~1.2.5:
version "1.2.5"
@@ -8504,11 +8570,16 @@ ms@2.0.0:
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
-ms@2.1.1, ms@^2.1.1:
+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:
+ 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"
@@ -8731,6 +8802,16 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-
semver "2 || 3 || 4 || 5"
validate-npm-package-license "^3.0.1"
+normalize-package-data@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.0.tgz#1f8a7c423b3d2e85eb36985eaf81de381d01301a"
+ integrity sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw==
+ dependencies:
+ hosted-git-info "^3.0.6"
+ resolve "^1.17.0"
+ semver "^7.3.2"
+ validate-npm-package-license "^3.0.1"
+
normalize-path@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
@@ -8957,10 +9038,10 @@ optionator@^0.9.1:
type-check "^0.4.0"
word-wrap "^1.2.3"
-orderedmap@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/orderedmap/-/orderedmap-1.0.0.tgz#d90fc2ba1ed085190907d601dec6e6a53f8d41ba"
- integrity sha1-2Q/Cuh7QhRkJB9YB3sbmpT+NQbo=
+orderedmap@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/orderedmap/-/orderedmap-1.1.1.tgz#c618e77611b3b21d0fe3edc92586265e0059c789"
+ integrity sha512-3Ux8um0zXbVacKUkcytc0u3HgC0b0bBLT+I60r2J/En72cI0nZffqrA7Xtf2Hqs27j1g82llR5Mhbd0Z1XW4AQ==
original@^1.0.0:
version "1.0.2"
@@ -9127,10 +9208,10 @@ parse-color@^1.0.0:
dependencies:
color-convert "~0.5.0"
-parse-entities@^1.0.2, parse-entities@^1.1.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-1.2.0.tgz#9deac087661b2e36814153cb78d7e54a4c5fd6f4"
- integrity sha512-XXtDdOPLSB0sHecbEapQi6/58U/ODj/KWfIXmmMCJF/eRn8laX6LZbOyioMoETOOJoWRW8/qTSl5VQkUIfKM5g==
+parse-entities@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8"
+ integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==
dependencies:
character-entities "^1.0.0"
character-entities-legacy "^1.0.0"
@@ -9146,14 +9227,6 @@ parse-json@^2.2.0:
dependencies:
error-ex "^1.2.0"
-parse-json@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
- integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=
- dependencies:
- error-ex "^1.3.1"
- json-parse-better-errors "^1.0.1"
-
parse-json@^5.0.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.1.0.tgz#f96088cdf24a8faa9aea9a009f2d9d942c999646"
@@ -9278,6 +9351,11 @@ path-type@^3.0.0:
dependencies:
pify "^3.0.0"
+path-type@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
+ integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+
pbkdf2@^3.0.3:
version "3.0.14"
resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.14.tgz#a35e13c64799b06ce15320f459c230e68e73bade"
@@ -9403,13 +9481,6 @@ postcss-html@^0.36.0:
dependencies:
htmlparser2 "^3.10.0"
-postcss-jsx@^0.36.1:
- version "0.36.2"
- resolved "https://registry.yarnpkg.com/postcss-jsx/-/postcss-jsx-0.36.2.tgz#34bcd6752426a60b8df73f069e7595383060a794"
- integrity sha512-7B8a8a6YDOQFqMQ9UmOo+IPPb2i14Z57Fvc9cOI11B3bWMSY2O6r2XJ3tlcQhUhv93TeN0ntxehTaSWJDQavlg==
- dependencies:
- "@babel/core" ">=7.2.2"
-
postcss-less@^3.1.4:
version "3.1.4"
resolved "https://registry.yarnpkg.com/postcss-less/-/postcss-less-3.1.4.tgz#369f58642b5928ef898ffbc1a6e93c958304c5ad"
@@ -9417,14 +9488,6 @@ postcss-less@^3.1.4:
dependencies:
postcss "^7.0.14"
-postcss-markdown@^0.36.0:
- version "0.36.0"
- resolved "https://registry.yarnpkg.com/postcss-markdown/-/postcss-markdown-0.36.0.tgz#7f22849ae0e3db18820b7b0d5e7833f13a447560"
- integrity sha512-rl7fs1r/LNSB2bWRhyZ+lM/0bwKv9fhl38/06gF6mKMo/NPnp55+K1dSTosSVjFZc0e1ppBlu+WT91ba0PMBfQ==
- dependencies:
- remark "^10.0.1"
- unist-util-find-all-after "^1.0.2"
-
postcss-media-query-parser@^0.2.3:
version "0.2.3"
resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244"
@@ -9462,60 +9525,42 @@ postcss-modules-values@^2.0.0:
icss-replace-symbols "^1.1.0"
postcss "^7.0.6"
-postcss-reporter@^6.0.1:
- version "6.0.1"
- resolved "https://registry.yarnpkg.com/postcss-reporter/-/postcss-reporter-6.0.1.tgz#7c055120060a97c8837b4e48215661aafb74245f"
- integrity sha512-LpmQjfRWyabc+fRygxZjpRxfhRf9u/fdlKf4VHG4TSPbV2XNsuISzYW1KL+1aQzx53CAppa1bKG4APIB/DOXXw==
- dependencies:
- chalk "^2.4.1"
- lodash "^4.17.11"
- log-symbols "^2.2.0"
- postcss "^7.0.7"
-
postcss-resolve-nested-selector@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz#29ccbc7c37dedfac304e9fff0bf1596b3f6a0e4e"
integrity sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=
-postcss-safe-parser@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz#8756d9e4c36fdce2c72b091bbc8ca176ab1fcdea"
- integrity sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ==
- dependencies:
- postcss "^7.0.0"
-
-postcss-sass@^0.3.5:
- version "0.3.5"
- resolved "https://registry.yarnpkg.com/postcss-sass/-/postcss-sass-0.3.5.tgz#6d3e39f101a53d2efa091f953493116d32beb68c"
- integrity sha512-B5z2Kob4xBxFjcufFnhQ2HqJQ2y/Zs/ic5EZbCywCkxKd756Q40cIQ/veRDwSrw1BF6+4wUgmpm0sBASqVi65A==
+postcss-safe-parser@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz#a6d4e48f0f37d9f7c11b2a581bf00f8ba4870b96"
+ integrity sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==
dependencies:
- gonzales-pe "^4.2.3"
- postcss "^7.0.1"
+ postcss "^7.0.26"
-postcss-scss@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-2.0.0.tgz#248b0a28af77ea7b32b1011aba0f738bda27dea1"
- integrity sha512-um9zdGKaDZirMm+kZFKKVsnKPF7zF7qBAtIfTSnZXD1jZ0JNZIxdB6TxQOjCnlSzLRInVl2v3YdBh/M881C4ug==
+postcss-sass@^0.4.4:
+ version "0.4.4"
+ resolved "https://registry.yarnpkg.com/postcss-sass/-/postcss-sass-0.4.4.tgz#91f0f3447b45ce373227a98b61f8d8f0785285a3"
+ integrity sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg==
dependencies:
- postcss "^7.0.0"
+ gonzales-pe "^4.3.0"
+ postcss "^7.0.21"
-postcss-selector-parser@^3.1.0:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz#4f875f4afb0c96573d5cf4d74011aee250a7e865"
- integrity sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=
+postcss-scss@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-2.1.1.tgz#ec3a75fa29a55e016b90bf3269026c53c1d2b383"
+ integrity sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==
dependencies:
- dot-prop "^4.1.1"
- indexes-of "^1.0.1"
- uniq "^1.0.1"
+ postcss "^7.0.6"
-postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2:
- version "6.0.2"
- resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c"
- integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==
+postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4:
+ version "6.0.4"
+ resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz#56075a1380a04604c38b063ea7767a129af5c2b3"
+ integrity sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==
dependencies:
cssesc "^3.0.0"
indexes-of "^1.0.1"
uniq "^1.0.1"
+ util-deprecate "^1.0.2"
postcss-syntax@^0.36.2:
version "0.36.2"
@@ -9527,15 +9572,15 @@ postcss-value-parser@^3.3.0, postcss-value-parser@^3.3.1:
resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281"
integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==
-postcss-value-parser@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.0.tgz#99a983d365f7b2ad8d0f9b8c3094926eab4b936d"
- integrity sha512-ESPktioptiSUchCKgggAkzdmkgzKfmp0EU8jXH+5kbIUB+unr0Y4CY9SRMvibuvYUBjNh1ACLbxqYNpdTQOteQ==
+postcss-value-parser@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb"
+ integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==
-postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.5, postcss@^7.0.6, postcss@^7.0.7:
- version "7.0.30"
- resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.30.tgz#cc9378beffe46a02cbc4506a0477d05fcea9a8e2"
- integrity sha512-nu/0m+NtIzoubO+xdAlwZl/u5S5vi/y6BCsoL8D+8IxsD3XvBS8X4YEADNIVXKVuQvduiucnRv+vPIqj56EGMQ==
+postcss@^7.0.14, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.32, postcss@^7.0.35, postcss@^7.0.5, postcss@^7.0.6:
+ version "7.0.35"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24"
+ integrity sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==
dependencies:
chalk "^2.4.2"
source-map "^0.6.1"
@@ -9653,117 +9698,119 @@ prompts@^2.0.1:
kleur "^3.0.3"
sisteransi "^1.0.4"
-prosemirror-commands@^1.0.7:
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/prosemirror-commands/-/prosemirror-commands-1.0.7.tgz#e5a2ba821e29ea7065c88277fe2c3d7f6b0b9d37"
- integrity sha512-IR8yMSdw7XlKuF68tydAak1J9P/lLD5ohsrL7pzoLsJAJAQU7mVPDXtGbQrrm0mesddFjcc1zNo/cJQN3lRYnA==
+prosemirror-collab@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/prosemirror-collab/-/prosemirror-collab-1.2.2.tgz#8d2c0e82779cfef5d051154bd0836428bd6d9c4a"
+ integrity sha512-tBnHKMLgy5Qmx9MYVcLfs3pAyjtcqYYDd9kp3y+LSiQzkhMQDfZSV3NXWe4Gsly32adSef173BvObwfoSQL5MA==
+ dependencies:
+ prosemirror-state "^1.0.0"
+
+prosemirror-commands@^1.1.4:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/prosemirror-commands/-/prosemirror-commands-1.1.7.tgz#5b31ae0fe82835d36d22c780641c0b651f27dd03"
+ integrity sha512-tuQr8q5euDjE+WAHWmu1JMLYWsPfUDH80QLLpnQrPYOPysO26FZyyHwEvA0+hUzvF8fOt1oMj0+/YM9UsPkZiA==
dependencies:
prosemirror-model "^1.0.0"
prosemirror-state "^1.0.0"
prosemirror-transform "^1.0.0"
-prosemirror-dropcursor@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/prosemirror-dropcursor/-/prosemirror-dropcursor-1.1.1.tgz#c60ed1ed6c58804a06a75db06a0d993b087b7622"
- integrity sha512-GeUyMO/tOEf8MXrP7Xb7UIMrfK86OGh0fnyBrHfhav4VjY9cw65mNoqHy87CklE5711AhCP5Qzfp8RL/hVKusg==
+prosemirror-dropcursor@^1.3.2:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/prosemirror-dropcursor/-/prosemirror-dropcursor-1.3.3.tgz#583d6a82b4960d468132c07c40803cc1d697fda4"
+ integrity sha512-zavE+wh+qkDcP7LaWn+jXVujGyQzBYSmM8E2HSngQ3KaaR+HJYgEBYGs9ynLHqKWLlLCXsxWdVYPV49v4caFyg==
dependencies:
prosemirror-state "^1.0.0"
prosemirror-transform "^1.1.0"
prosemirror-view "^1.1.0"
-prosemirror-gapcursor@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/prosemirror-gapcursor/-/prosemirror-gapcursor-1.0.3.tgz#acc6537fc5a35e9b38966f91a199a382dfc715c4"
- integrity sha512-X+hJhr42PcHWiSWL+lI5f/UeOhXCxlBFb8M6O8aG1hssmaRrW7sS2/Fjg5jFV+pTdS1REFkmm1occh01FMdDIQ==
+prosemirror-gapcursor@^1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/prosemirror-gapcursor/-/prosemirror-gapcursor-1.1.5.tgz#0c37fd6cbb1d7c46358c2e7397f8da9a8b5c6246"
+ integrity sha512-SjbUZq5pgsBDuV3hu8GqgIpZR5eZvGLM+gPQTqjVVYSMUCfKW3EGXTEYaLHEl1bGduwqNC95O3bZflgtAb4L6w==
dependencies:
prosemirror-keymap "^1.0.0"
prosemirror-model "^1.0.0"
prosemirror-state "^1.0.0"
prosemirror-view "^1.0.0"
-prosemirror-history@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/prosemirror-history/-/prosemirror-history-1.0.3.tgz#5fb8591adfc272afaaf0b41bec64ee7d9522a118"
- integrity sha512-IfFGbhafSx+R3aq7nLJGkXeu2iaUiP8mkU3aRu2uQcIIjU8Fq7RJfuvhIOJ2RNUoSyqF/ANkdTjnZ74F5eHs1Q==
+prosemirror-history@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/prosemirror-history/-/prosemirror-history-1.1.3.tgz#4f76a1e71db4ef7cdf0e13dec6d8da2aeaecd489"
+ integrity sha512-zGDotijea+vnfnyyUGyiy1wfOQhf0B/b6zYcCouBV8yo6JmrE9X23M5q7Nf/nATywEZbgRLG70R4DmfSTC+gfg==
dependencies:
prosemirror-state "^1.2.2"
prosemirror-transform "^1.0.0"
- rope-sequence "^1.2.0"
+ rope-sequence "^1.3.0"
-prosemirror-inputrules@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/prosemirror-inputrules/-/prosemirror-inputrules-1.0.1.tgz#f63305fd966379f218e82ca76a2a9b328b66dc7b"
- integrity sha512-UHy22NmwxS5WIMQYkzraDttQAF8mpP82FfbJsmKFfx6jwkR/SZa+ZhbkLY0zKQ5fBdJN7euj36JG/B5iAlrpxA==
+prosemirror-inputrules@^1.1.2, prosemirror-inputrules@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/prosemirror-inputrules/-/prosemirror-inputrules-1.1.3.tgz#93f9199ca02473259c30d7e352e4c14022d54638"
+ integrity sha512-ZaHCLyBtvbyIHv0f5p6boQTIJjlD6o2NPZiEaZWT2DA+j591zS29QQEMT4lBqwcLW3qRSf7ZvoKNbf05YrsStw==
dependencies:
prosemirror-state "^1.0.0"
prosemirror-transform "^1.0.0"
-prosemirror-keymap@^1.0.0, prosemirror-keymap@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/prosemirror-keymap/-/prosemirror-keymap-1.0.1.tgz#03ef32b828e3a859dfb570eb84928bf2e5330bc2"
- integrity sha512-e79ApE7PXXZMFtPz7WbjycjAFd1NPjgY1MkecVz98tqwlBSggXWXYQnWFk6x7UkmnBYRHHbXHkR/RXmu2wyBJg==
+prosemirror-keymap@^1.0.0, prosemirror-keymap@^1.1.2, prosemirror-keymap@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/prosemirror-keymap/-/prosemirror-keymap-1.1.4.tgz#8b481bf8389a5ac40d38dbd67ec3da2c7eac6a6d"
+ integrity sha512-Al8cVUOnDFL4gcI5IDlG6xbZ0aOD/i3B17VT+1JbHWDguCgt/lBHVTHUBcKvvbSg6+q/W4Nj1Fu6bwZSca3xjg==
dependencies:
prosemirror-state "^1.0.0"
- w3c-keyname "^1.1.8"
+ w3c-keyname "^2.2.0"
-prosemirror-markdown@^1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/prosemirror-markdown/-/prosemirror-markdown-1.3.0.tgz#a100d14c27da7d8fb70818230d786898eeadb7fa"
- integrity sha512-76l3yLB/suy6sA7LpzRJvRRWkHtKwOTpgWVNwmlIAIIZJeMypWSPldT/gFyIG604eyXEPZitnx+j80Y2DpbnUQ==
+prosemirror-markdown@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/prosemirror-markdown/-/prosemirror-markdown-1.5.1.tgz#877c7faea2225d3c52e988599bbe4457bcb3190f"
+ integrity sha512-QvucPHx+gKOQW1SETKUysrful9VBjKqpCFmPotgLfVZ3BdQEGy/NEIFhaXXo3TcuW316MMnKfA90K7GE5I7z8A==
dependencies:
- markdown-it "^8.4.2"
+ markdown-it "^10.0.0"
prosemirror-model "^1.0.0"
-prosemirror-model@^1.0.0, prosemirror-model@^1.1.0, prosemirror-model@^1.6.4:
- version "1.6.4"
- resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.6.4.tgz#2ac37a629448a7dbfd1635450e2fdd63c3450d7d"
- integrity sha512-C2ALle8fZsAza+6stUF9Gv28jH9XtpNeczb33bowGlnb2cpNI4FZf1HHUyZjf6ou4cEvOlbt6fAYsT4NCKmlcQ==
+prosemirror-model@^1.0.0, prosemirror-model@^1.1.0, prosemirror-model@^1.13.1, prosemirror-model@^1.13.3, prosemirror-model@^1.8.1:
+ version "1.13.3"
+ resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.13.3.tgz#3ccfde73b9c9e706933c72bdf7462906509ff1c9"
+ integrity sha512-wujIYYQEcxdkbKmIJiekVjqtylKxuoEcc+w2PnN7Itc58m/75J4rCUz2dibygVQJFi3gZrD2DNFLjOS6LP4w1g==
dependencies:
- orderedmap "^1.0.0"
+ orderedmap "^1.1.0"
-prosemirror-schema-list@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/prosemirror-schema-list/-/prosemirror-schema-list-1.0.1.tgz#f216e0cf4809b6074aa27912449ac89897f1ae94"
- integrity sha512-AiLIX6qm6PEeDtMCKZLcSLi55WXo1ls7DnRK+4hSkoi0IIzNdxGsRlecCd3MzEu//DVz3nAEh+zEmslyW+uk8g==
+prosemirror-schema-list@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/prosemirror-schema-list/-/prosemirror-schema-list-1.1.4.tgz#471f9caf2d2bed93641d2e490434c0d2d4330df1"
+ integrity sha512-pNTuZflacFOBlxrTcWSdWhjoB8BaucwfJVp/gJNxztOwaN3wQiC65axclXyplf6TKgXD/EkWfS/QAov3/Znadw==
dependencies:
prosemirror-model "^1.0.0"
prosemirror-transform "^1.0.0"
-prosemirror-state@^1.0.0, prosemirror-state@^1.2.1, prosemirror-state@^1.2.2:
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/prosemirror-state/-/prosemirror-state-1.2.2.tgz#8df26d95fd6fd327c0f9984a760e84d863204154"
- integrity sha512-j8aC/kf9BJSCQau485I/9pj39XQoce+TqH5xzekT7WWFARTsRYFLJtiXBcCKakv1VSeev+sC3bJP0pLfz7Ft8g==
+prosemirror-state@^1.0.0, prosemirror-state@^1.2.2, prosemirror-state@^1.3.1, prosemirror-state@^1.3.3:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/prosemirror-state/-/prosemirror-state-1.3.4.tgz#4c6b52628216e753fc901c6d2bfd84ce109e8952"
+ integrity sha512-Xkkrpd1y/TQ6HKzN3agsQIGRcLckUMA9u3j207L04mt8ToRgpGeyhbVv0HI7omDORIBHjR29b7AwlATFFf2GLA==
dependencies:
prosemirror-model "^1.0.0"
prosemirror-transform "^1.0.0"
-prosemirror-tables@^0.7.10, prosemirror-tables@^0.7.9:
- version "0.7.10"
- resolved "https://registry.yarnpkg.com/prosemirror-tables/-/prosemirror-tables-0.7.10.tgz#4b0f623422b4b8f84cdc9c559f8a87579846b3ba"
- integrity sha512-VIu7UGS9keYEHs0Y6AEOTGbNE9QI2rL1OKng4vV6yoTshW/lYcb+s3hGXI12i+WLMjDVm7ujhfdWrpKpvFZOkQ==
+prosemirror-tables@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/prosemirror-tables/-/prosemirror-tables-1.1.1.tgz#ad66300cc49500455cf1243bb129c9e7d883321e"
+ integrity sha512-LmCz4jrlqQZRsYRDzCRYf/pQ5CUcSOyqZlAj5kv67ZWBH1SVLP2U9WJEvQfimWgeRlIz0y0PQVqO1arRm1+woA==
dependencies:
- prosemirror-keymap "^1.0.0"
- prosemirror-model "^1.0.0"
- prosemirror-state "^1.0.0"
- prosemirror-transform "^1.0.0"
- prosemirror-view "^1.0.0"
+ prosemirror-keymap "^1.1.2"
+ prosemirror-model "^1.8.1"
+ prosemirror-state "^1.3.1"
+ prosemirror-transform "^1.2.1"
+ prosemirror-view "^1.13.3"
-prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/prosemirror-transform/-/prosemirror-transform-1.1.3.tgz#28cfdf1f9ee514edc40466be7b7db39eed545fdf"
- integrity sha512-1O6Di5lOL1mp4nuCnQNkHY7l2roIW5y8RH4ZG3hMYmkmDEWzTaFFnxxAAHsE5ipGLBSRcTlP7SsDhYBIdSuLpQ==
+prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transform@^1.2.1, prosemirror-transform@^1.2.8:
+ version "1.2.12"
+ resolved "https://registry.yarnpkg.com/prosemirror-transform/-/prosemirror-transform-1.2.12.tgz#4398b568faf75a1540fbf5c659ca436a8657ed6f"
+ integrity sha512-S73syqLcGBq6QiPaF7vriB8kpvK/aIFsnErrriKaFLSiE/GxMgBc62TPhNQAeGQr7/9GCDApIReTsJFcMt4o2w==
dependencies:
prosemirror-model "^1.0.0"
-prosemirror-utils@^0.7.5:
- version "0.7.5"
- resolved "https://registry.yarnpkg.com/prosemirror-utils/-/prosemirror-utils-0.7.5.tgz#11b477647b672ec8f10679ab298a5823dad6457a"
- integrity sha512-F+63BUiBkUQb1S07c3rGHXjE4MDaZ5OjsNhmaO7eDdSh1lUNORTJJHrvlFEZKnLM7ChoDDXTIKhWNQwnCssQfA==
-
-prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.6.8:
- version "1.6.8"
- resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.6.8.tgz#33fc1a6e2731633e5d6dc1af1967378f15810b74"
- integrity sha512-YWX3rfji77xsU5EErt4ZoecVytYW9/4oHBYhV1MUHGMYIcppe+QZEBgRlyPMBUuu0lxdZX4m3sq7fCsDvv/MlQ==
+prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.13.3, prosemirror-view@^1.16.5:
+ version "1.18.0"
+ resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.18.0.tgz#92d27b2583877938c529e173e6e3a0f3f6aa0e1c"
+ integrity sha512-UoY29oeWruT6RKhH7wGytUBVrlaszNx43wvOxZPCMjYPvKBT21EIXR8Ezr/3XstvFVBQAWdDh6Ke0qHmF43y/A==
dependencies:
prosemirror-model "^1.1.0"
prosemirror-state "^1.0.0"
@@ -9885,10 +9932,10 @@ querystringify@^2.1.1:
resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6"
integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==
-quick-lru@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8"
- integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=
+quick-lru@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f"
+ integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==
randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0:
version "2.1.0"
@@ -9966,14 +10013,6 @@ read-pkg-up@^2.0.0:
find-up "^2.0.0"
read-pkg "^2.0.0"
-read-pkg-up@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07"
- integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=
- dependencies:
- find-up "^2.0.0"
- read-pkg "^3.0.0"
-
read-pkg-up@^7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507"
@@ -10001,15 +10040,6 @@ read-pkg@^2.0.0:
normalize-package-data "^2.3.2"
path-type "^2.0.0"
-read-pkg@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389"
- integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=
- dependencies:
- load-json-file "^4.0.0"
- normalize-package-data "^2.3.2"
- path-type "^3.0.0"
-
read-pkg@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc"
@@ -10033,10 +10063,10 @@ read-pkg@^5.2.0:
string_decoder "~1.1.1"
util-deprecate "~1.0.1"
-readable-stream@^3.0.6:
- version "3.0.6"
- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.0.6.tgz#351302e4c68b5abd6a2ed55376a7f9a25be3057a"
- integrity sha512-9E1oLoOWfhSXHGv6QlwXJim7uNzd9EVlWK+21tCU9Ju/kR0/p2AZYPz4qSchgO8PlLIH4FpZYfzwS+rEksZjIg==
+readable-stream@^3.0.6, readable-stream@^3.1.1:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
+ integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
dependencies:
inherits "^2.0.3"
string_decoder "^1.1.1"
@@ -10077,13 +10107,13 @@ redent@^1.0.0:
indent-string "^2.1.0"
strip-indent "^1.0.1"
-redent@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa"
- integrity sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=
+redent@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f"
+ integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==
dependencies:
- indent-string "^3.0.0"
- strip-indent "^2.0.0"
+ indent-string "^4.0.0"
+ strip-indent "^3.0.0"
regenerate-unicode-properties@^8.2.0:
version "8.2.0"
@@ -10166,55 +10196,28 @@ relateurl@^0.2.7:
resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=
-remark-parse@^6.0.0:
- version "6.0.3"
- resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-6.0.3.tgz#c99131052809da482108413f87b0ee7f52180a3a"
- integrity sha512-QbDXWN4HfKTUC0hHa4teU463KclLAnwpn/FBn87j9cKYJWWawbiLgMfP2Q4XwhxxuuuOxHlw+pSN0OKuJwyVvg==
+remark-parse@^9.0.0:
+ version "9.0.0"
+ resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-9.0.0.tgz#4d20a299665880e4f4af5d90b7c7b8a935853640"
+ integrity sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==
dependencies:
- collapse-white-space "^1.0.2"
- is-alphabetical "^1.0.0"
- is-decimal "^1.0.0"
- is-whitespace-character "^1.0.0"
- is-word-character "^1.0.0"
- markdown-escapes "^1.0.0"
- parse-entities "^1.1.0"
- repeat-string "^1.5.4"
- state-toggle "^1.0.0"
- trim "0.0.1"
- trim-trailing-lines "^1.0.0"
- unherit "^1.0.4"
- unist-util-remove-position "^1.0.0"
- vfile-location "^2.0.0"
- xtend "^4.0.1"
-
-remark-stringify@^6.0.0:
- version "6.0.4"
- resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-6.0.4.tgz#16ac229d4d1593249018663c7bddf28aafc4e088"
- integrity sha512-eRWGdEPMVudijE/psbIDNcnJLRVx3xhfuEsTDGgH4GsFF91dVhw5nhmnBppafJ7+NWINW6C7ZwWbi30ImJzqWg==
+ mdast-util-from-markdown "^0.8.0"
+
+remark-stringify@^9.0.0:
+ version "9.0.1"
+ resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-9.0.1.tgz#576d06e910548b0a7191a71f27b33f1218862894"
+ integrity sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==
dependencies:
- ccount "^1.0.0"
- is-alphanumeric "^1.0.0"
- is-decimal "^1.0.0"
- is-whitespace-character "^1.0.0"
- longest-streak "^2.0.1"
- markdown-escapes "^1.0.0"
- markdown-table "^1.1.0"
- mdast-util-compact "^1.0.0"
- parse-entities "^1.0.2"
- repeat-string "^1.5.4"
- state-toggle "^1.0.0"
- stringify-entities "^1.0.1"
- unherit "^1.0.4"
- xtend "^4.0.1"
-
-remark@^10.0.1:
- version "10.0.1"
- resolved "https://registry.yarnpkg.com/remark/-/remark-10.0.1.tgz#3058076dc41781bf505d8978c291485fe47667df"
- integrity sha512-E6lMuoLIy2TyiokHprMjcWNJ5UxfGQjaMSMhV+f4idM625UjjK4j798+gPs5mfjzDE6vL0oFKVeZM6gZVSVrzQ==
- dependencies:
- remark-parse "^6.0.0"
- remark-stringify "^6.0.0"
- unified "^7.0.0"
+ mdast-util-to-markdown "^0.6.0"
+
+remark@^13.0.0:
+ version "13.0.0"
+ resolved "https://registry.yarnpkg.com/remark/-/remark-13.0.0.tgz#d15d9bf71a402f40287ebe36067b66d54868e425"
+ integrity sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==
+ dependencies:
+ remark-parse "^9.0.0"
+ remark-stringify "^9.0.0"
+ unified "^9.1.0"
remove-trailing-separator@^1.0.1:
version "1.1.0"
@@ -10226,7 +10229,7 @@ repeat-element@^1.1.2:
resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce"
integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==
-repeat-string@^1.5.4, repeat-string@^1.6.1:
+repeat-string@^1.0.0, repeat-string@^1.6.1:
version "1.6.1"
resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
@@ -10238,11 +10241,6 @@ repeating@^2.0.0:
dependencies:
is-finite "^1.0.0"
-replace-ext@1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb"
- integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=
-
request-light@^0.2.4:
version "0.2.5"
resolved "https://registry.yarnpkg.com/request-light/-/request-light-0.2.5.tgz#38a3da7b2e56f7af8cbba57e8a94930ee2380746"
@@ -10373,7 +10371,7 @@ resolve-url@^0.2.1:
resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
-resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.3.2:
+resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.17.0:
version "1.17.0"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
@@ -10397,12 +10395,17 @@ retry@^0.12.0:
resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b"
integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=
+reusify@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
+ integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+
rfdc@^1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.1.4.tgz#ba72cc1367a0ccd9cf81a870b3b58bd3ad07f8c2"
integrity sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==
-rimraf@2, rimraf@2.6.3, rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.3:
+rimraf@2, rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.3:
version "2.6.3"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
@@ -10424,10 +10427,10 @@ ripemd160@^2.0.0, ripemd160@^2.0.1:
hash-base "^2.0.0"
inherits "^2.0.1"
-rope-sequence@^1.2.0:
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/rope-sequence/-/rope-sequence-1.2.2.tgz#49c4e5c2f54a48e990b050926771e2871bcb31ce"
- integrity sha1-ScTlwvVKSOmQsFCSZ3HihxvLMc4=
+rope-sequence@^1.3.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/rope-sequence/-/rope-sequence-1.3.2.tgz#a19e02d72991ca71feb6b5f8a91154e48e3c098b"
+ integrity sha512-ku6MFrwEVSVmXLvy3dYph3LAMNS0890K7fabn+0YIRQ2T96T9F4gkFf0vf0WW0JUraNWwGRtInEpH7yO4tbQZg==
route-recognizer@^0.3.3:
version "0.3.4"
@@ -10439,6 +10442,11 @@ rsvp@^4.8.4:
resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.4.tgz#b50e6b34583f3dd89329a2f23a8a2be072845911"
integrity sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA==
+run-parallel@^1.1.9:
+ version "1.1.10"
+ resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.10.tgz#60a51b2ae836636c81377df16cb107351bcd13ef"
+ integrity sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==
+
run-queue@^1.0.0, run-queue@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47"
@@ -10732,6 +10740,13 @@ shellwords@^0.1.1:
resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b"
integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==
+shortcss@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/shortcss/-/shortcss-0.1.3.tgz#ee2a7904d80b7f5502c98408f4a2f313faadfb48"
+ integrity sha1-7ip5BNgLf1UCyYQI9KLzE/qt+0g=
+ dependencies:
+ css-shorthand-properties "^1.0.0"
+
sigmund@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590"
@@ -10752,25 +10767,11 @@ slash@^1.0.0:
resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=
-slash@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44"
- integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==
-
slash@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
-slice-ansi@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636"
- integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==
- dependencies:
- ansi-styles "^3.2.0"
- astral-regex "^1.0.0"
- is-fullwidth-code-point "^2.0.0"
-
slice-ansi@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b"
@@ -11054,11 +11055,6 @@ stack-utils@^2.0.2:
dependencies:
escape-string-regexp "^2.0.0"
-state-toggle@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.1.tgz#c3cb0974f40a6a0f8e905b96789eb41afa1cde3a"
- integrity sha512-Qe8QntFrrpWTnHwvwj2FZTgv+PKIsp0B9VxLzLLbSpPXWOgRgc5LVj/aTiSfK1RqIeF9jeC1UeOH8Q8y60A7og==
-
static-extend@^0.1.1:
version "0.1.2"
resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
@@ -11200,16 +11196,6 @@ string_decoder@~0.10.x:
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=
-stringify-entities@^1.0.1:
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-1.3.2.tgz#a98417e5471fd227b3e45d3db1861c11caf668f7"
- integrity sha512-nrBAQClJAPN2p+uGCVJRPIPakKeKWZ9GtBCmormE7pWOSlHat7+x5A8gx85M7HM5Dt0BP3pP5RhVW77WdbJJ3A==
- dependencies:
- character-entities-html4 "^1.0.0"
- character-entities-legacy "^1.0.0"
- is-alphanumerical "^1.0.0"
- is-hexadecimal "^1.0.0"
-
strip-ansi@^3.0.0, strip-ansi@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
@@ -11272,10 +11258,12 @@ strip-indent@^1.0.1:
dependencies:
get-stdin "^4.0.1"
-strip-indent@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68"
- integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=
+strip-indent@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001"
+ integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==
+ dependencies:
+ min-indent "^1.0.0"
strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
version "3.1.1"
@@ -11300,75 +11288,78 @@ 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=
-stylelint-config-recommended@^2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-2.2.0.tgz#46ab139db4a0e7151fd5f94af155512886c96d3f"
- integrity sha512-bZ+d4RiNEfmoR74KZtCKmsABdBJr4iXRiCso+6LtMJPw5rd/KnxUWTxht7TbafrTJK1YRjNgnN0iVZaJfc3xJA==
+stylelint-declaration-strict-value@1.7.7:
+ version "1.7.7"
+ resolved "https://registry.yarnpkg.com/stylelint-declaration-strict-value/-/stylelint-declaration-strict-value-1.7.7.tgz#d2f0aabc7f3e701a8988207f27d9696bd1d1ed0d"
+ integrity sha512-Gr5RZYMIS7af6N6PGRD3vmCJM/NlKY4D/jWdidQqxcXkhBtsmV6C99GjQOB0nfdYtjfJEQZLMlTNBztY4tRGfA==
+ dependencies:
+ css-values "^0.1.0"
+ shortcss "^0.1.3"
-stylelint-scss@^3.9.2:
- version "3.9.2"
- resolved "https://registry.yarnpkg.com/stylelint-scss/-/stylelint-scss-3.9.2.tgz#5435174a57696ee52eae40146778a4e62f7ed3a3"
- integrity sha512-VUh173p3T1qJf016P7yeJ6nxkUpqF5qQ+VSDw3J8P6wEJbA1loaNgBHR3k3skHvUkF+9brLO1ibCHA00pjW3cw==
+stylelint-scss@3.18.0:
+ version "3.18.0"
+ resolved "https://registry.yarnpkg.com/stylelint-scss/-/stylelint-scss-3.18.0.tgz#8f06371c223909bf3f62e839548af1badeed31e9"
+ integrity sha512-LD7+hv/6/ApNGt7+nR/50ft7cezKP2HM5rI8avIdGaUWre3xlHfV4jKO/DRZhscfuN+Ewy9FMhcTq0CcS0C/SA==
dependencies:
- lodash "^4.17.11"
+ lodash "^4.17.15"
postcss-media-query-parser "^0.2.3"
postcss-resolve-nested-selector "^0.1.1"
postcss-selector-parser "^6.0.2"
- postcss-value-parser "^4.0.0"
+ postcss-value-parser "^4.1.0"
-stylelint@^10.1.0:
- version "10.1.0"
- resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-10.1.0.tgz#1bc4c4ce878107e7c396b19226d91ba28268911a"
- integrity sha512-OmlUXrgzEMLQYj1JPTpyZPR9G4bl0StidfHnGJEMpdiQ0JyTq0MPg1xkHk1/xVJ2rTPESyJCDWjG8Kbpoo7Kuw==
+stylelint@13.9.0:
+ version "13.9.0"
+ resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-13.9.0.tgz#93921ee6e11d4556b9f31131f485dc813b68e32a"
+ integrity sha512-VVWH2oixOAxpWL1vH+V42ReCzBjW2AeqskSAbi8+3OjV1Xg3VZkmTcAqBZfRRvJeF4BvYuDLXebW3tIHxgZDEg==
dependencies:
- autoprefixer "^9.5.1"
+ "@stylelint/postcss-css-in-js" "^0.37.2"
+ "@stylelint/postcss-markdown" "^0.36.2"
+ autoprefixer "^9.8.6"
balanced-match "^1.0.0"
- chalk "^2.4.2"
- cosmiconfig "^5.2.0"
- debug "^4.1.1"
+ chalk "^4.1.0"
+ cosmiconfig "^7.0.0"
+ debug "^4.3.1"
execall "^2.0.0"
- file-entry-cache "^5.0.1"
- get-stdin "^7.0.0"
+ fast-glob "^3.2.5"
+ fastest-levenshtein "^1.0.12"
+ file-entry-cache "^6.0.0"
+ get-stdin "^8.0.0"
global-modules "^2.0.0"
- globby "^9.2.0"
+ globby "^11.0.2"
globjoin "^0.1.4"
- html-tags "^3.0.0"
- ignore "^5.0.6"
+ html-tags "^3.1.0"
+ ignore "^5.1.8"
import-lazy "^4.0.0"
imurmurhash "^0.1.4"
- known-css-properties "^0.14.0"
- leven "^3.1.0"
- lodash "^4.17.11"
- log-symbols "^3.0.0"
- mathml-tag-names "^2.1.0"
- meow "^5.0.0"
- micromatch "^4.0.0"
+ known-css-properties "^0.20.0"
+ lodash "^4.17.20"
+ log-symbols "^4.0.0"
+ mathml-tag-names "^2.1.3"
+ meow "^9.0.0"
+ micromatch "^4.0.2"
normalize-selector "^0.2.0"
- pify "^4.0.1"
- postcss "^7.0.14"
+ postcss "^7.0.35"
postcss-html "^0.36.0"
- postcss-jsx "^0.36.1"
postcss-less "^3.1.4"
- postcss-markdown "^0.36.0"
postcss-media-query-parser "^0.2.3"
- postcss-reporter "^6.0.1"
postcss-resolve-nested-selector "^0.1.1"
- postcss-safe-parser "^4.0.1"
- postcss-sass "^0.3.5"
- postcss-scss "^2.0.0"
- postcss-selector-parser "^3.1.0"
+ postcss-safe-parser "^4.0.2"
+ postcss-sass "^0.4.4"
+ postcss-scss "^2.1.1"
+ postcss-selector-parser "^6.0.4"
postcss-syntax "^0.36.2"
- postcss-value-parser "^3.3.1"
+ postcss-value-parser "^4.1.0"
resolve-from "^5.0.0"
- signal-exit "^3.0.2"
slash "^3.0.0"
specificity "^0.4.1"
- string-width "^4.1.0"
- strip-ansi "^5.2.0"
+ string-width "^4.2.0"
+ strip-ansi "^6.0.0"
style-search "^0.1.0"
sugarss "^2.0.0"
svg-tags "^1.0.0"
- table "^5.2.3"
+ table "^6.0.7"
+ v8-compile-cache "^2.2.0"
+ write-file-atomic "^3.0.3"
stylis@^3.5.2:
version "3.5.4"
@@ -11421,10 +11412,10 @@ svg-tags@^1.0.0:
resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764"
integrity sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=
-swagger-ui-dist@^3.43.0:
- version "3.43.0"
- resolved "https://registry.yarnpkg.com/swagger-ui-dist/-/swagger-ui-dist-3.43.0.tgz#b064a2cec1d27776f9a124bc70423cfa0bbc0d3f"
- integrity sha512-PtE+g23bNbYv8qqAVoPBqNQth8hU5Sl5ZsQ7gHXlO5jlCt31dVTiKI9ArHIT1b23ZzUYTnKsFgPYYFoiWyNCAw==
+swagger-ui-dist@^3.44.1:
+ version "3.44.1"
+ resolved "https://registry.yarnpkg.com/swagger-ui-dist/-/swagger-ui-dist-3.44.1.tgz#757385a79698b8ef7045287be585671db4e4a252"
+ integrity sha512-N0u+aN55bp53RRwi/wFbEbkQxcHqZ445ShZR/Ct1Jg+XCMxYtocrsGavh7kdNKw5+6Rs4QDD6GzUMiT28Z1u3Q==
symbol-observable@^1.0.2:
version "1.2.0"
@@ -11436,17 +11427,7 @@ symbol-tree@^3.2.4:
resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
-table@^5.2.3:
- version "5.4.4"
- resolved "https://registry.yarnpkg.com/table/-/table-5.4.4.tgz#6e0f88fdae3692793d1077fd172a4667afe986a6"
- integrity sha512-IIfEAUx5QlODLblLrGTTLJA7Tk0iLSGBvgY8essPRVNGHAzThujww1YqHLs6h3HfTg55h++RzLHH5Xw/rfv+mg==
- dependencies:
- ajv "^6.10.2"
- lodash "^4.17.14"
- slice-ansi "^2.1.0"
- string-width "^3.0.0"
-
-table@^6.0.4:
+table@^6.0.4, table@^6.0.7:
version "6.0.7"
resolved "https://registry.yarnpkg.com/table/-/table-6.0.7.tgz#e45897ffbcc1bcf9e8a87bf420f2c9e5a7a52a34"
integrity sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==
@@ -11608,56 +11589,60 @@ tiny-emitter@^2.0.0:
resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.0.2.tgz#82d27468aca5ade8e5fd1e6d22b57dd43ebdfb7c"
integrity sha512-2NM0auVBGft5tee/OxP4PI3d8WItkDM+fPnaRAVo6xTDI2knbz9eC5ArWGqtGlYqiH3RU5yMpdyTTO7MguC4ow==
-tiptap-commands@^1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/tiptap-commands/-/tiptap-commands-1.4.0.tgz#0cfb3ac138ee3099de56114cb119abd841fbcbe7"
- integrity sha512-ytO8jFXgufK5DziamTaVojzUTolWvL4m2xNXaLkAVJYy9CWXruMK7avqeLoFYPI4GZlhleMn5i4gzYTbD7e2jA==
- dependencies:
- prosemirror-commands "^1.0.7"
- prosemirror-inputrules "^1.0.1"
- prosemirror-schema-list "^1.0.1"
- prosemirror-state "^1.2.2"
- tiptap-utils "^1.1.1"
-
-tiptap-extensions@^1.8.0:
- version "1.8.0"
- resolved "https://registry.yarnpkg.com/tiptap-extensions/-/tiptap-extensions-1.8.0.tgz#3067620a024f1a9e5fae4450790b143d7ebe4394"
- integrity sha512-1JN9uk5QnA7DTID1j07gIBEqeOnRd6lwZ5rx/zqWXJLyreZu8VDPvP939tfP41GskO4oicGlhmsQ0aEnA5QYDw==
- dependencies:
- lowlight "^1.11.0"
- prosemirror-history "^1.0.3"
- prosemirror-state "^1.2.2"
- prosemirror-tables "^0.7.10"
- prosemirror-utils "^0.7.5"
- prosemirror-view "^1.6.8"
- tiptap "^1.8.0"
- tiptap-commands "^1.4.0"
-
-tiptap-utils@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/tiptap-utils/-/tiptap-utils-1.1.1.tgz#e7aad3e84eb35f7abed704d15da0420029789d0d"
- integrity sha512-yPIWwLFaL5a0GC7fcO7aoPlASnH3wOUQex0IlepNWbDCNycSL8shXhVx0HMN/tCnlp943zw1bwcYzpTW3wA4tw==
- dependencies:
- prosemirror-model "^1.6.4"
- prosemirror-state "^1.2.2"
- prosemirror-tables "^0.7.9"
- prosemirror-utils "^0.7.5"
-
-tiptap@^1.8.0:
- version "1.8.0"
- resolved "https://registry.yarnpkg.com/tiptap/-/tiptap-1.8.0.tgz#c671188075ffa5ee4f86470f95818fd9ce6f1040"
- integrity sha512-zIcVY8U1Wgj4bg3R4pX5a2BCpZUw/dTCh259VZ9g5MtClnzdLW2XpKCcwqfa9iUBEs6MCPSnB3t8jGRtGciHJg==
- dependencies:
- prosemirror-commands "^1.0.7"
- prosemirror-dropcursor "^1.1.1"
- prosemirror-gapcursor "^1.0.3"
- prosemirror-inputrules "^1.0.1"
- prosemirror-keymap "^1.0.1"
- prosemirror-model "^1.6.4"
- prosemirror-state "^1.2.1"
- prosemirror-view "^1.6.8"
- tiptap-commands "^1.4.0"
- tiptap-utils "^1.1.1"
+tiptap-commands@^1.17.1:
+ version "1.17.1"
+ resolved "https://registry.yarnpkg.com/tiptap-commands/-/tiptap-commands-1.17.1.tgz#a8974a26d87db57b2fd4fc56a552520c69e43a4a"
+ integrity sha512-CyGvMD/c6fNer5LThWGtrVMXHAqHn93ivGQpqJ58x3HNZFuoIiF9QTWXAiWbY/4QrG0ANYHKCSe9n5afickTqw==
+ dependencies:
+ prosemirror-commands "^1.1.4"
+ prosemirror-inputrules "^1.1.2"
+ prosemirror-model "^1.13.1"
+ prosemirror-schema-list "^1.1.4"
+ prosemirror-state "^1.3.3"
+ prosemirror-tables "^1.1.1"
+ tiptap-utils "^1.13.1"
+
+tiptap-extensions@^1.35.1:
+ version "1.35.1"
+ resolved "https://registry.yarnpkg.com/tiptap-extensions/-/tiptap-extensions-1.35.1.tgz#6227362b08dbad8d0ab0141b508876deca276c55"
+ integrity sha512-aCYvEKPUUtHBALBFQ9n70Iy/nfu/8DHHYkeXMgUJuwLLJ6LrJQBqUnV5EGRwPxNalNdqTdXjV+2z5flZfisovQ==
+ dependencies:
+ lowlight "^1.17.0"
+ prosemirror-collab "^1.2.2"
+ prosemirror-history "^1.1.3"
+ prosemirror-model "^1.13.1"
+ prosemirror-state "^1.3.3"
+ prosemirror-tables "^1.1.1"
+ prosemirror-transform "^1.2.8"
+ prosemirror-view "^1.16.5"
+ tiptap "^1.32.1"
+ tiptap-commands "^1.17.1"
+ tiptap-utils "^1.13.1"
+
+tiptap-utils@^1.13.1:
+ version "1.13.1"
+ resolved "https://registry.yarnpkg.com/tiptap-utils/-/tiptap-utils-1.13.1.tgz#f2150ded432465d66aa03a5ab333803415cddd20"
+ integrity sha512-RoCvMfkdu7fp9u7nsRr1OgsYU8RFjoHKHEKpx075rJ9X0t+j5Vxah9n6QzTTr4yjvcavq22WO2flFacm36zYtA==
+ dependencies:
+ prosemirror-model "^1.13.1"
+ prosemirror-state "^1.3.3"
+ prosemirror-tables "^1.1.1"
+
+tiptap@^1.32.1:
+ version "1.32.1"
+ resolved "https://registry.yarnpkg.com/tiptap/-/tiptap-1.32.1.tgz#92b47008d163e31d25d44dc18809a7e928fe1daf"
+ integrity sha512-jXET6IAuvE67GdpcGdNE/RQ7I1eoeULXSrbriAa5fnyTUJQsDICd31/8LVaCh10OV1qkvQVCg/6oL1lQdakBLA==
+ dependencies:
+ prosemirror-commands "^1.1.4"
+ prosemirror-dropcursor "^1.3.2"
+ prosemirror-gapcursor "^1.1.5"
+ prosemirror-inputrules "^1.1.3"
+ prosemirror-keymap "^1.1.4"
+ prosemirror-model "^1.13.1"
+ prosemirror-state "^1.3.3"
+ prosemirror-view "^1.16.5"
+ tiptap-commands "^1.17.1"
+ tiptap-utils "^1.13.1"
tmp@0.0.33, tmp@0.0.x:
version "0.0.33"
@@ -11769,25 +11754,15 @@ trim-newlines@^1.0.0:
resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
integrity sha1-WIeWa7WCpFA6QetST301ARgVphM=
-trim-newlines@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20"
- integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=
-
-trim-trailing-lines@^1.0.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.1.tgz#e0ec0810fd3c3f1730516b45f49083caaf2774d9"
- integrity sha512-bWLv9BbWbbd7mlqqs2oQYnLD/U/ZqeJeJwbO0FG2zA1aTq+HTvxfHNKFa/HGCVyJpDiioUYaBhfiT6rgk+l4mg==
-
-trim@0.0.1:
- version "0.0.1"
- resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd"
- integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0=
+trim-newlines@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.0.tgz#79726304a6a898aa8373427298d54c2ee8b1cb30"
+ integrity sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==
trough@^1.0.0:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.3.tgz#e29bd1614c6458d44869fc28b255ab7857ef7c24"
- integrity sha512-fwkLWH+DimvA4YCy+/nvJd61nWQQ2liO/nF/RjkTpiOGi+zxZzVkhb1mvbHIIW4b/8nDsYI8uTmAlc0nNkRMOw==
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406"
+ integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==
"true-case-path@^1.0.2":
version "1.0.3"
@@ -11893,6 +11868,11 @@ type-detect@4.0.8:
resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
+type-fest@^0.18.0:
+ version "0.18.1"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f"
+ integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==
+
type-fest@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b"
@@ -11970,14 +11950,6 @@ underscore@~1.8.3:
resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022"
integrity sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=
-unherit@^1.0.4:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.1.tgz#132748da3e88eab767e08fabfbb89c5e9d28628c"
- integrity sha512-+XZuV691Cn4zHsK0vkKYwBEwB74T3IZIcxrgn2E4rKwTfFyI1zCh7X7grwh9Re08fdPlarIdyWgI8aVB3F5A5g==
- dependencies:
- inherits "^2.0.1"
- xtend "^4.0.1"
-
unicode-canonical-property-names-ecmascript@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818"
@@ -12001,19 +11973,17 @@ 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@^7.0.0:
- version "7.1.0"
- resolved "https://registry.yarnpkg.com/unified/-/unified-7.1.0.tgz#5032f1c1ee3364bd09da12e27fdd4a7553c7be13"
- integrity sha512-lbk82UOIGuCEsZhPj8rNAkXSDXd6p0QLzIuSsCdxrqnqU56St4eyOB+AlXsVgVeRmetPTYydIuvFfpDIed8mqw==
+unified@^9.1.0:
+ version "9.2.0"
+ resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.0.tgz#67a62c627c40589edebbf60f53edfd4d822027f8"
+ integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==
dependencies:
- "@types/unist" "^2.0.0"
- "@types/vfile" "^3.0.0"
bail "^1.0.0"
extend "^3.0.0"
- is-plain-obj "^1.1.0"
+ is-buffer "^2.0.0"
+ is-plain-obj "^2.0.0"
trough "^1.0.0"
- vfile "^3.0.0"
- x-is-string "^0.1.0"
+ vfile "^4.0.0"
union-value@^1.0.0:
version "1.0.1"
@@ -12051,43 +12021,24 @@ unique-string@^2.0.0:
dependencies:
crypto-random-string "^2.0.0"
-unist-util-find-all-after@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/unist-util-find-all-after/-/unist-util-find-all-after-1.0.2.tgz#9be49cfbae5ca1566b27536670a92836bf2f8d6d"
- integrity sha512-nDl79mKpffXojLpCimVXnxhlH/jjaTnDuScznU9J4jjsaUtBdDbxmlc109XtcqxY4SDO0SwzngsxxW8DIISt1w==
- dependencies:
- unist-util-is "^2.0.0"
-
-unist-util-is@^2.0.0, unist-util-is@^2.1.2:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-2.1.2.tgz#1193fa8f2bfbbb82150633f3a8d2eb9a1c1d55db"
- integrity sha512-YkXBK/H9raAmG7KXck+UUpnKiNmUdB+aBGrknfQ4EreE1banuzrKABx3jP6Z5Z3fMSPMQQmeXBlKpCbMwBkxVw==
-
-unist-util-remove-position@^1.0.0:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-1.1.2.tgz#86b5dad104d0bbfbeb1db5f5c92f3570575c12cb"
- integrity sha512-XxoNOBvq1WXRKXxgnSYbtCF76TJrRoe5++pD4cCBsssSiWSnPEktyFrFLE8LTk3JW5mt9hB0Sk5zn4x/JeWY7Q==
+unist-util-find-all-after@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/unist-util-find-all-after/-/unist-util-find-all-after-3.0.2.tgz#fdfecd14c5b7aea5e9ef38d5e0d5f774eeb561f6"
+ integrity sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ==
dependencies:
- unist-util-visit "^1.1.0"
-
-unist-util-stringify-position@^1.0.0, unist-util-stringify-position@^1.1.1:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz#3f37fcf351279dcbca7480ab5889bb8a832ee1c6"
- integrity sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==
+ unist-util-is "^4.0.0"
-unist-util-visit-parents@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-2.0.1.tgz#63fffc8929027bee04bfef7d2cce474f71cb6217"
- integrity sha512-6B0UTiMfdWql4cQ03gDTCSns+64Zkfo2OCbK31Ov0uMizEz+CJeAp0cgZVb5Fhmcd7Bct2iRNywejT0orpbqUA==
- dependencies:
- unist-util-is "^2.1.2"
+unist-util-is@^4.0.0:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.0.4.tgz#3e9e8de6af2eb0039a59f50c9b3e99698a924f50"
+ integrity sha512-3dF39j/u423v4BBQrk1AQ2Ve1FxY5W3JKwXxVFzBODQ6WEvccguhgp802qQLKSnxPODE6WuRZtV+ohlUg4meBA==
-unist-util-visit@^1.1.0:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.4.1.tgz#4724aaa8486e6ee6e26d7ff3c8685960d560b1e3"
- integrity sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==
+unist-util-stringify-position@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da"
+ integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==
dependencies:
- unist-util-visit-parents "^2.0.0"
+ "@types/unist" "^2.0.2"
universalify@^0.1.0:
version "0.1.2"
@@ -12201,7 +12152,7 @@ useragent@2.3.0:
lru-cache "4.1.x"
tmp "0.0.x"
-util-deprecate@^1.0.1, util-deprecate@~1.0.1:
+util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
@@ -12245,7 +12196,7 @@ uuid@^8.3.0:
resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.1.tgz#2ba2e6ca000da60fce5a196954ab241131e05a31"
integrity sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==
-v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.1:
+v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.1, v8-compile-cache@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz#9471efa3ef9128d2f7c6a7ca39c4dd6b5055b132"
integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==
@@ -12281,27 +12232,23 @@ verror@1.10.0:
core-util-is "1.0.2"
extsprintf "^1.2.0"
-vfile-location@^2.0.0:
+vfile-message@^2.0.0:
version "2.0.4"
- resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-2.0.4.tgz#2a5e7297dd0d9e2da4381464d04acc6b834d3e55"
- integrity sha512-KRL5uXQPoUKu+NGvQVL4XLORw45W62v4U4gxJ3vRlDfI9QsT4ZN1PNXn/zQpKUulqGDpYuT0XDfp5q9O87/y/w==
-
-vfile-message@^1.0.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-1.1.1.tgz#5833ae078a1dfa2d96e9647886cd32993ab313e1"
- integrity sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==
+ resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a"
+ integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==
dependencies:
- unist-util-stringify-position "^1.1.1"
+ "@types/unist" "^2.0.0"
+ unist-util-stringify-position "^2.0.0"
-vfile@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/vfile/-/vfile-3.0.1.tgz#47331d2abe3282424f4a4bb6acd20a44c4121803"
- integrity sha512-y7Y3gH9BsUSdD4KzHsuMaCzRjglXN0W2EcMf0gpvu6+SbsGhMje7xDc8AEoeXy6mIwCKMI6BkjMsRjzQbhMEjQ==
+vfile@^4.0.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624"
+ integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==
dependencies:
+ "@types/unist" "^2.0.0"
is-buffer "^2.0.0"
- replace-ext "1.0.0"
- unist-util-stringify-position "^1.0.0"
- vfile-message "^1.0.0"
+ unist-util-stringify-position "^2.0.0"
+ vfile-message "^2.0.0"
visibilityjs@^1.2.4:
version "1.2.4"
@@ -12504,10 +12451,10 @@ w3c-hr-time@^1.0.2:
dependencies:
browser-process-hrtime "^1.0.0"
-w3c-keyname@^1.1.8:
- version "1.1.8"
- resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-1.1.8.tgz#4e2219663760fd6535b7a1550f1552d71fc9372c"
- integrity sha512-2HAdug8GTiu3b4NYhssdtY8PXRue3ICnh1IlxvZYl+hiINRq0GfNWei3XOPDg8L0PsxbmYjWVLuLj6BMRR/9vA==
+w3c-keyname@^2.2.0:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.4.tgz#4ade6916f6290224cdbd1db8ac49eab03d0eef6b"
+ integrity sha512-tOhfEwEzFLJzf6d1ZPkYfGj+FWhIpBux9ppoP3rlclw3Z0BZv3N7b7030Z1kYth+6rDuAsXUFr+d0VE6Ed1ikw==
w3c-xmlserializer@^2.0.0:
version "2.0.0"
@@ -12815,7 +12762,7 @@ wrappy@1:
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
-write-file-atomic@^3.0.0:
+write-file-atomic@^3.0.0, write-file-atomic@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8"
integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==
@@ -12825,13 +12772,6 @@ write-file-atomic@^3.0.0:
signal-exit "^3.0.2"
typedarray-to-buffer "^3.1.5"
-write@1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3"
- integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==
- dependencies:
- mkdirp "^0.5.1"
-
ws@^6.0.0, ws@^6.2.1:
version "6.2.1"
resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb"
@@ -12853,11 +12793,6 @@ ws@~3.3.1:
safe-buffer "~5.1.0"
ultron "~1.1.0"
-x-is-string@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/x-is-string/-/x-is-string-0.1.0.tgz#474b50865af3a49a9c4657f05acd145458f77d82"
- integrity sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=
-
xdg-basedir@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13"
@@ -12914,7 +12849,7 @@ xmlhttprequest-ssl@~1.5.4:
resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e"
integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=
-xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1:
+xtend@^4.0.0, xtend@~4.0.1:
version "4.0.2"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
@@ -12966,17 +12901,15 @@ yaml-language-server@^0.11.1:
optionalDependencies:
prettier "2.0.5"
-yargs-parser@20.x:
- version "20.2.1"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.1.tgz#28f3773c546cdd8a69ddae68116b48a5da328e77"
- integrity sha512-yYsjuSkjbLMBp16eaOt7/siKTjNVjMm3SoJnIg3sEh/JsvqVVDyjRKmaJV4cl+lNIgq6QEco2i3gDebJl7/vLA==
+yaml@^1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e"
+ integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==
-yargs-parser@^10.0.0:
- version "10.1.0"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8"
- integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==
- dependencies:
- camelcase "^4.1.0"
+yargs-parser@20.x, yargs-parser@^20.2.3:
+ version "20.2.4"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54"
+ integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==
yargs-parser@^13.1.2:
version "13.1.2"
@@ -13065,3 +12998,8 @@ zrender@4.3.2:
version "4.3.2"
resolved "https://registry.yarnpkg.com/zrender/-/zrender-4.3.2.tgz#ec7432f9415c82c73584b6b7b8c47e1b016209c6"
integrity sha512-bIusJLS8c4DkIcdiK+s13HiQ/zjQQVgpNohtd8d94Y2DnJqgM1yjh/jpDb8DoL6hd7r8Awagw8e3qK/oLaWr3g==
+
+zwitch@^1.0.0:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920"
+ integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==